diff --git a/.gitignore b/.gitignore index 82e0cdf..750baeb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/result \ No newline at end of file +result +result-* diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..fceb631 --- /dev/null +++ b/default.nix @@ -0,0 +1,28 @@ +let requiredVersion = import ./lib/minver.nix; in + +if ! builtins ? nixVersion || builtins.compareVersions requiredVersion builtins.nixVersion == 1 then + + abort '' + + This version of Nixpkgs requires Nix >= ${requiredVersion}, please upgrade: + + - If you are running NixOS, `nixos-rebuild' can be used to upgrade your system. + + - Alternatively, with Nix > 2.0 `nix upgrade-nix' can be used to imperatively + upgrade Nix. You may use `nix-env --version' to check which version you have. + + - If you installed Nix using the install script (https://nixos.org/nix/install), + it is safe to upgrade by running it again: + + curl -L https://nixos.org/nix/install | sh + + For more information, please see the NixOS release notes at + https://nixos.org/nixos/manual or locally at + ${toString ./nixos/doc/manual/release-notes}. + + If you need further help, see https://nixos.org/nixos/support.html + '' + +else + + import ./pkgs/top-level/impure.nix \ No newline at end of file diff --git a/flake.lock b/flake.lock index b6557dc..d146eee 100644 --- a/flake.lock +++ b/flake.lock @@ -2,15 +2,15 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1714253743, - "narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=", - "owner": "auxolotl", + "lastModified": 1715447595, + "narHash": "sha256-VsVAUQOj/cS1LCOmMjAGeRksXIAdPnFIjCQ0XLkCsT0=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994", + "rev": "062ca2a9370a27a35c524dc82d540e6e9824b652", "type": "github" }, "original": { - "owner": "auxolotl", + "owner": "nixos", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" diff --git a/flake.nix b/flake.nix index f945564..0f0d49b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:auxolotl/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; }; outputs = @@ -13,14 +13,39 @@ nixPackages = forAllSystems (system: nixpkgs.legacyPackages.${system}); - # auxPackages = forAllSystems (system: - # (import ./. { inherit system; }) - # ); + auxPackages = forAllSystems (system: + ( + let requiredVersion = import ./lib/minver.nix; in + + if ! builtins ? nixVersion || builtins.compareVersions requiredVersion builtins.nixVersion == 1 then + abort '' + This version of Nixpkgs requires Nix >= ${requiredVersion}, please upgrade: + + - If you are running NixOS, `nixos-rebuild' can be used to upgrade your system. + + - Alternatively, with Nix > 2.0 `nix upgrade-nix' can be used to imperatively + upgrade Nix. You may use `nix-env --version' to check which version you have. + + - If you installed Nix using the install script (https://nixos.org/nix/install), + it is safe to upgrade by running it again: + + curl -L https://nixos.org/nix/install | sh + + For more information, please see the NixOS release notes at + https://nixos.org/nixos/manual or locally at + ${toString ./nixos/doc/manual/release-notes}. + + If you need further help, see https://nixos.org/nixos/support.html + '' + else + import ./pkgs/top-level/default.nix { localSystem = system; } + ) + ); # To test, run nix build .#tests.x86_64-linux.release tests = forAllSystems (system: { systems = import ./lib/tests/systems.nix; - release = import ./lib/tests/release.nix { pkgs = self.nixPackages.${system}; }; + release = import ./lib/tests/release.nix { pkgs = self.auxPackages.${system}; }; }); }; } diff --git a/lib/tests/release.nix b/lib/tests/release.nix index 6a524fe..373b990 100644 --- a/lib/tests/release.nix +++ b/lib/tests/release.nix @@ -2,7 +2,7 @@ # Don't test properties of pkgs.lib, but rather the lib in the parent directory pkgs ? import /etc/nix/inputs/nixpkgs {} // { lib = throw "pkgs.lib accessed, but the lib tests should use nixpkgs' lib path directly!"; }, nix ? pkgs-nixVersions.stable, - nixVersions ? [ pkgs-nixVersions.minimum nix pkgs-nixVersions.unstable ], + nixVersions ? [ pkgs-nixVersions.minimum nix pkgs-nixVersions.latest ], pkgs-nixVersions ? import ./nix-for-tests.nix { inherit pkgs; }, }: diff --git a/lib/tests/test-with-nix.nix b/lib/tests/test-with-nix.nix index 608dc82..c8c3cae 100644 --- a/lib/tests/test-with-nix.nix +++ b/lib/tests/test-with-nix.nix @@ -17,6 +17,7 @@ pkgs.runCommand "nixpkgs-lib-tests-nix-${nix.version}" { buildInputs = [ (import ./check-eval.nix) + # FIXME: reimplement maintainers and teams # (import ./maintainers.nix { # inherit pkgs; # lib = import ../.; diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix new file mode 100644 index 0000000..2aafbc6 --- /dev/null +++ b/maintainers/maintainer-list.nix @@ -0,0 +1,68 @@ +/* List of NixOS maintainers. + ```nix + handle = { + # Required + name = "Your name"; + + # Optional, but at least one of email, matrix or githubId must be given + email = "address@example.org"; + matrix = "@user:example.org"; + github = "GithubUsername"; + githubId = your-github-id; + + keys = [{ + fingerprint = "AAAA BBBB CCCC DDDD EEEE FFFF 0000 1111 2222 3333"; + }]; + }; + ``` + + where + + - `handle` is the handle you are going to use in nixpkgs expressions, + - `name` is a name that people would know and recognize you by, + - `email` is your maintainer email address, + - `matrix` is your Matrix user ID, + - `github` is your GitHub handle (as it appears in the URL of your profile page, `https://github.com/`), + - `githubId` is your GitHub user ID, which can be found at `https://api.github.com/users/`, + - `keys` is a list of your PGP/GPG key fingerprints. + + Specifying a GitHub account ensures that you automatically: + - get invited to the @NixOS/nixpkgs-maintainers team ; + - once you are part of the @NixOS org, OfBorg will request you review + pull requests that modify a package for which you are a maintainer. + + `handle == github` is strongly preferred whenever `github` is an acceptable attribute name and is short and convenient. + + If `github` begins with a numeral, `handle` should be prefixed with an underscore. + ```nix + _1example = { + github = "1example"; + }; + ``` + + Add PGP/GPG keys only if you actually use them to sign commits and/or mail. + + To get the required PGP/GPG values for a key run + ```shell + gpg --fingerprint | head -n 2 + ``` + + !!! Note that PGP/GPG values stored here are for informational purposes only, don't use this file as a source of truth. + + More fields may be added in the future, however, in order to comply with GDPR this file should stay as minimal as possible. + + When editing this file: + * keep the list alphabetically sorted, check with: + nix-instantiate --eval maintainers/scripts/check-maintainers-sorted.nix + * test the validity of the format with: + nix-build lib/tests/maintainers.nix + + See `./scripts/check-maintainer-github-handles.sh` for an example on how to work with this data. + + When adding a new maintainer, be aware of the current commit conventions + documented at [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#commit-conventions) + file located in the root of the Nixpkgs repo. +*/ +{ + +} diff --git a/maintainers/team-list.nix b/maintainers/team-list.nix new file mode 100644 index 0000000..952fdd0 --- /dev/null +++ b/maintainers/team-list.nix @@ -0,0 +1,48 @@ +/* List of maintainer teams. + name = { + # Required + members = [ maintainer1 maintainer2 ]; + scope = "Maintain foo packages."; + shortName = "foo"; + # Optional + enableFeatureFreezePing = true; + githubTeams = [ "my-subsystem" ]; + }; + + where + + - `members` is the list of maintainers belonging to the group, + - `scope` describes the scope of the group. + - `shortName` short human-readable name + - `enableFeatureFreezePing` will ping this team during the Feature Freeze announcements on releases + - There is limited mention capacity in a single post, so this should be reserved for critical components + or larger ecosystems within nixpkgs. + - `githubTeams` will ping specified GitHub teams as well + + More fields may be added in the future. + + When editing this file: + * keep the list alphabetically sorted + * test the validity of the format with: + nix-build lib/tests/teams.nix + */ + +{ lib }: +with lib.maintainers; { + llvm = { + members = []; + scope = "Maintain LLVM package sets and related packages"; + shortName = "LLVM"; + enableFeatureFreezePing = true; + }; + lix = { + members = []; + }; + python = { + members = []; + }; + rust = { + members = []; + }; +} + diff --git a/pkgs/build-support/add-driver-runpath/default.nix b/pkgs/build-support/add-driver-runpath/default.nix new file mode 100644 index 0000000..08547a4 --- /dev/null +++ b/pkgs/build-support/add-driver-runpath/default.nix @@ -0,0 +1,14 @@ +{ lib, stdenv }: + +stdenv.mkDerivation { + name = "add-driver-runpath"; + + # Named "opengl-driver" for legacy reasons, but it is the path to + # hardware drivers installed by NixOS + driverLink = "/run/opengl-driver" + lib.optionalString stdenv.isi686 "-32"; + + buildCommand = '' + mkdir -p $out/nix-support + substituteAll ${./setup-hook.sh} $out/nix-support/setup-hook + ''; +} diff --git a/pkgs/build-support/add-driver-runpath/setup-hook.sh b/pkgs/build-support/add-driver-runpath/setup-hook.sh new file mode 100644 index 0000000..86a41a7 --- /dev/null +++ b/pkgs/build-support/add-driver-runpath/setup-hook.sh @@ -0,0 +1,29 @@ +# Set RUNPATH so that driver libraries in /run/opengl-driver(-32)/lib can be found. +# This is needed to not rely on LD_LIBRARY_PATH which does not work with setuid +# executables. Fixes https://github.com/NixOS/nixpkgs/issues/22760. It must be run +# in postFixup because RUNPATH stripping in fixup would undo it. Note that patchelf +# actually sets RUNPATH not RPATH, which applies only to dependencies of the binary +# it set on (including for dlopen), so the RUNPATH must indeed be set on these +# libraries and would not work if set only on executables. +addDriverRunpath() { + local forceRpath= + + while [ $# -gt 0 ]; do + case "$1" in + --) shift; break;; + --force-rpath) shift; forceRpath=1;; + --*) + echo "addDriverRunpath: ERROR: Invalid command line" \ + "argument: $1" >&2 + return 1;; + *) break;; + esac + done + + for file in "$@"; do + if ! isELF "$file"; then continue; fi + local origRpath="$(patchelf --print-rpath "$file")" + patchelf --set-rpath "@driverLink@/lib:$origRpath" ${forceRpath:+--force-rpath} "$file" + done +} + diff --git a/pkgs/build-support/add-opengl-runpath/default.nix b/pkgs/build-support/add-opengl-runpath/default.nix new file mode 100644 index 0000000..5cab093 --- /dev/null +++ b/pkgs/build-support/add-opengl-runpath/default.nix @@ -0,0 +1,12 @@ +{ lib, stdenv }: + +stdenv.mkDerivation { + name = "add-opengl-runpath"; + + driverLink = "/run/opengl-driver" + lib.optionalString stdenv.isi686 "-32"; + + buildCommand = '' + mkdir -p $out/nix-support + substituteAll ${./setup-hook.sh} $out/nix-support/setup-hook + ''; +} diff --git a/pkgs/build-support/add-opengl-runpath/setup-hook.sh b/pkgs/build-support/add-opengl-runpath/setup-hook.sh new file mode 100644 index 0000000..e556e7e --- /dev/null +++ b/pkgs/build-support/add-opengl-runpath/setup-hook.sh @@ -0,0 +1,29 @@ +# Set RUNPATH so that driver libraries in /run/opengl-driver(-32)/lib can be found. +# This is needed to not rely on LD_LIBRARY_PATH which does not work with setuid +# executables. Fixes https://github.com/NixOS/nixpkgs/issues/22760. It must be run +# in postFixup because RUNPATH stripping in fixup would undo it. Note that patchelf +# actually sets RUNPATH not RPATH, which applies only to dependencies of the binary +# it set on (including for dlopen), so the RUNPATH must indeed be set on these +# libraries and would not work if set only on executables. +addOpenGLRunpath() { + local forceRpath= + + while [ $# -gt 0 ]; do + case "$1" in + --) shift; break;; + --force-rpath) shift; forceRpath=1;; + --*) + echo "addOpenGLRunpath: ERROR: Invalid command line" \ + "argument: $1" >&2 + return 1;; + *) break;; + esac + done + + for file in "$@"; do + if ! isELF "$file"; then continue; fi + local origRpath="$(patchelf --print-rpath "$file")" + patchelf --set-rpath "@driverLink@/lib:$origRpath" ${forceRpath:+--force-rpath} "$file" + done +} + diff --git a/pkgs/build-support/agda/default.nix b/pkgs/build-support/agda/default.nix new file mode 100644 index 0000000..b5d72d9 --- /dev/null +++ b/pkgs/build-support/agda/default.nix @@ -0,0 +1,122 @@ +# Builder for Agda packages. + +{ stdenv, lib, self, Agda, runCommand, makeWrapper, writeText, ghcWithPackages, nixosTests }: + +let + inherit (lib) + attrValues + elem + filter + filterAttrs + isAttrs + isList + platforms + ; + + inherit (lib.strings) + concatMapStrings + concatMapStringsSep + optionalString + ; + + withPackages' = { + pkgs, + ghc ? ghcWithPackages (p: with p; [ ieee754 ]) + }: let + pkgs' = if isList pkgs then pkgs else pkgs self; + library-file = writeText "libraries" '' + ${(concatMapStringsSep "\n" (p: "${p}/${p.libraryFile}") pkgs')} + ''; + pname = "agdaWithPackages"; + version = Agda.version; + in runCommand "${pname}-${version}" { + inherit pname version; + nativeBuildInputs = [ makeWrapper ]; + passthru = { + unwrapped = Agda; + inherit withPackages; + tests = { + inherit (nixosTests) agda; + allPackages = withPackages (filter self.lib.isUnbrokenAgdaPackage (attrValues self)); + }; + }; + # Agda is a split package with multiple outputs; do not inherit them here. + meta = removeAttrs Agda.meta [ "outputsToInstall" ]; + } '' + mkdir -p $out/bin + makeWrapper ${Agda.bin}/bin/agda $out/bin/agda \ + --add-flags "--with-compiler=${ghc}/bin/ghc" \ + --add-flags "--library-file=${library-file}" + ln -s ${Agda.bin}/bin/agda-mode $out/bin/agda-mode + ''; + + withPackages = arg: if isAttrs arg then withPackages' arg else withPackages' { pkgs = arg; }; + + extensions = [ + "agda" + "agda-lib" + "agdai" + "lagda" + "lagda.md" + "lagda.org" + "lagda.rst" + "lagda.tex" + "lagda.typ" + ]; + + defaults = + { pname + , meta + , buildInputs ? [] + , everythingFile ? "./Everything.agda" + , includePaths ? [] + , libraryName ? pname + , libraryFile ? "${libraryName}.agda-lib" + , buildPhase ? null + , installPhase ? null + , extraExtensions ? [] + , ... + }: let + agdaWithArgs = withPackages (filter (p: p ? isAgdaDerivation) buildInputs); + includePathArgs = concatMapStrings (path: "-i" + path + " ") (includePaths ++ [(dirOf everythingFile)]); + in + { + inherit libraryName libraryFile; + + isAgdaDerivation = true; + + buildInputs = buildInputs ++ [ agdaWithArgs ]; + + buildPhase = if buildPhase != null then buildPhase else '' + runHook preBuild + agda ${includePathArgs} ${everythingFile} + rm ${everythingFile} ${lib.interfaceFile Agda.version everythingFile} + runHook postBuild + ''; + + installPhase = if installPhase != null then installPhase else '' + runHook preInstall + mkdir -p $out + find \( ${concatMapStringsSep " -or " (p: "-name '*.${p}'") (extensions ++ extraExtensions)} \) -exec cp -p --parents -t "$out" {} + + runHook postInstall + ''; + + # As documented at https://github.com/NixOS/nixpkgs/issues/172752, + # we need to set LC_ALL to an UTF-8-supporting locale. However, on + # darwin, it seems that there is no standard such locale; luckily, + # the referenced issue doesn't seem to surface on darwin. Hence let's + # set this only on non-darwin. + LC_ALL = optionalString (!stdenv.isDarwin) "C.UTF-8"; + + meta = if meta.broken or false then meta // { hydraPlatforms = platforms.none; } else meta; + + # Retrieve all packages from the finished package set that have the current package as a dependency and build them + passthru.tests = + filterAttrs (name: pkg: self.lib.isUnbrokenAgdaPackage pkg && elem pname (map (pkg: pkg.pname) pkg.buildInputs)) self; + }; +in +{ + mkDerivation = args: stdenv.mkDerivation (args // defaults args); + + inherit withPackages withPackages'; +} diff --git a/pkgs/build-support/agda/lib.nix b/pkgs/build-support/agda/lib.nix new file mode 100644 index 0000000..63fa6cc --- /dev/null +++ b/pkgs/build-support/agda/lib.nix @@ -0,0 +1,17 @@ +{ lib }: +{ + /* Returns the Agda interface file to a given Agda file. + * + * The resulting path may not be normalized. + * + * Examples: + * interfaceFile pkgs.agda.version "./Everything.agda" == "_build/2.6.4.3/agda/./Everything.agdai" + * interfaceFile pkgs.agda.version "src/Everything.lagda.tex" == "_build/2.6.4.3/agda/src/Everything.agdai" + */ + interfaceFile = agdaVersion: agdaFile: "_build/" + agdaVersion + "/agda/" + lib.head (builtins.match ''(.*\.)l?agda(\.(md|org|rst|tex|typ))?'' agdaFile) + "agdai"; + + /* Takes an arbitrary derivation and says whether it is an agda library package + * that is not marked as broken. + */ + isUnbrokenAgdaPackage = pkg: pkg.isAgdaDerivation or false && !pkg.meta.broken; +} diff --git a/pkgs/build-support/alternatives/blas/default.nix b/pkgs/build-support/alternatives/blas/default.nix new file mode 100644 index 0000000..91001bc --- /dev/null +++ b/pkgs/build-support/alternatives/blas/default.nix @@ -0,0 +1,143 @@ +{ lib, stdenv +, lapack-reference, openblas +, isILP64 ? false +, blasProvider ? openblas }: + +let + blasFortranSymbols = [ + "caxpy" "ccopy" "cdotc" "cdotu" "cgbmv" "cgemm" "cgemv" "cgerc" "cgeru" + "chbmv" "chemm" "chemv" "cher" "cher2" "cher2k" "cherk" "chpmv" "chpr" + "chpr2" "crotg" "cscal" "csrot" "csscal" "cswap" "csymm" "csyr2k" "csyrk" + "ctbmv" "ctbsv" "ctpmv" "ctpsv" "ctrmm" "ctrmv" "ctrsm" "ctrsv" "dasum" + "daxpy" "dcabs1" "dcopy" "ddot" "dgbmv" "dgemm" "dgemv" "dger" "dnrm2" + "drot" "drotg" "drotm" "drotmg" "dsbmv" "dscal" "dsdot" "dspmv" "dspr" + "dspr2" "dswap" "dsymm" "dsymv" "dsyr" "dsyr2" "dsyr2k" "dsyrk" "dtbmv" + "dtbsv" "dtpmv" "dtpsv" "dtrmm" "dtrmv" "dtrsm" "dtrsv" "dzasum" "dznrm2" + "icamax" "idamax" "isamax" "izamax" "lsame" "sasum" "saxpy" "scabs1" + "scasum" "scnrm2" "scopy" "sdot" "sdsdot" "sgbmv" "sgemm" "sgemv" + "sger" "snrm2" "srot" "srotg" "srotm" "srotmg" "ssbmv" "sscal" "sspmv" + "sspr" "sspr2" "sswap" "ssymm" "ssymv" "ssyr" "ssyr2" "ssyr2k" "ssyrk" + "stbmv" "stbsv" "stpmv" "stpsv" "strmm" "strmv" "strsm" "strsv" "xerbla" + "xerbla_array" "zaxpy" "zcopy" "zdotc" "zdotu" "zdrot" "zdscal" "zgbmv" + "zgemm" "zgemv" "zgerc" "zgeru" "zhbmv" "zhemm" "zhemv" "zher" "zher2" + "zher2k" "zherk" "zhpmv" "zhpr" "zhpr2" "zrotg" "zscal" "zswap" "zsymm" + "zsyr2k" "zsyrk" "ztbmv" "ztbsv" "ztpmv" "ztpsv" "ztrmm" "ztrmv" "ztrsm" + "ztrsv" + ]; + + version = "3"; + canonicalExtension = if stdenv.hostPlatform.isLinux + then "${stdenv.hostPlatform.extensions.sharedLibrary}.${version}" + else stdenv.hostPlatform.extensions.sharedLibrary; + + + blasImplementation = lib.getName blasProvider; + blasProvider' = if blasImplementation == "mkl" + then blasProvider + else blasProvider.override { blas64 = isILP64; }; + +in + +assert isILP64 -> blasImplementation == "mkl" || blasProvider'.blas64; + +stdenv.mkDerivation { + pname = "blas"; + inherit version; + + outputs = [ "out" "dev" ]; + + meta = (blasProvider'.meta or {}) // { + description = "${lib.getName blasProvider} with just the BLAS C and FORTRAN ABI"; + }; + + passthru = { + inherit isILP64; + provider = blasProvider'; + implementation = blasImplementation; + }; + + dontBuild = true; + dontConfigure = true; + unpackPhase = "src=$PWD"; + + dontPatchELF = true; + + installPhase = ('' + mkdir -p $out/lib $dev/include $dev/lib/pkgconfig + + libblas="${lib.getLib blasProvider'}/lib/libblas${canonicalExtension}" + + if ! [ -e "$libblas" ]; then + echo "$libblas does not exist, ${blasProvider'.name} does not provide libblas." + exit 1 + fi + + $NM -an "$libblas" | cut -f3 -d' ' > symbols + for symbol in ${toString blasFortranSymbols}; do + grep -q "^$symbol_$" symbols || { echo "$symbol" was not found in "$libblas"; exit 1; } + done + + cp -L "$libblas" $out/lib/libblas${canonicalExtension} + chmod +w $out/lib/libblas${canonicalExtension} + +'' + (if stdenv.hostPlatform.isElf then '' + patchelf --set-soname libblas${canonicalExtension} $out/lib/libblas${canonicalExtension} + patchelf --set-rpath "$(patchelf --print-rpath $out/lib/libblas${canonicalExtension}):${lib.getLib blasProvider'}/lib" $out/lib/libblas${canonicalExtension} +'' else lib.optionalString (stdenv.hostPlatform.isDarwin) '' + install_name_tool \ + -id $out/lib/libblas${canonicalExtension} \ + -add_rpath ${lib.getLib blasProvider'}/lib \ + $out/lib/libblas${canonicalExtension} +'') + '' + + if [ "$out/lib/libblas${canonicalExtension}" != "$out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then + ln -s $out/lib/libblas${canonicalExtension} "$out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}" + fi + + cat < $dev/lib/pkgconfig/blas.pc +Name: blas +Version: ${version} +Description: BLAS FORTRAN implementation +Libs: -L$out/lib -lblas +Cflags: -I$dev/include +EOF + + libcblas="${lib.getLib blasProvider'}/lib/libcblas${canonicalExtension}" + + if ! [ -e "$libcblas" ]; then + echo "$libcblas does not exist, ${blasProvider'.name} does not provide libcblas." + exit 1 + fi + + cp -L "$libcblas" $out/lib/libcblas${canonicalExtension} + chmod +w $out/lib/libcblas${canonicalExtension} + +'' + (if stdenv.hostPlatform.isElf then '' + patchelf --set-soname libcblas${canonicalExtension} $out/lib/libcblas${canonicalExtension} + patchelf --set-rpath "$(patchelf --print-rpath $out/lib/libcblas${canonicalExtension}):${lib.getLib blasProvider'}/lib" $out/lib/libcblas${canonicalExtension} +'' else lib.optionalString stdenv.hostPlatform.isDarwin '' + install_name_tool \ + -id $out/lib/libcblas${canonicalExtension} \ + -add_rpath ${lib.getLib blasProvider'}/lib \ + $out/lib/libcblas${canonicalExtension} +'') + '' + if [ "$out/lib/libcblas${canonicalExtension}" != "$out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then + ln -s $out/lib/libcblas${canonicalExtension} "$out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}" + fi + + cp ${lib.getDev lapack-reference}/include/cblas{,_mangling}.h $dev/include + + cat < $dev/lib/pkgconfig/cblas.pc +Name: cblas +Version: ${version} +Description: BLAS C implementation +Cflags: -I$dev/include +Libs: -L$out/lib -lcblas +EOF +'' + lib.optionalString (blasImplementation == "mkl") '' + mkdir -p $out/nix-support + echo 'export MKL_INTERFACE_LAYER=${lib.optionalString isILP64 "I"}LP64,GNU' > $out/nix-support/setup-hook + ln -s $out/lib/libblas${canonicalExtension} $out/lib/libmkl_rt${stdenv.hostPlatform.extensions.sharedLibrary} + ln -sf ${blasProvider'}/include/* $dev/include +''); +} diff --git a/pkgs/build-support/alternatives/lapack/default.nix b/pkgs/build-support/alternatives/lapack/default.nix new file mode 100644 index 0000000..2d62855 --- /dev/null +++ b/pkgs/build-support/alternatives/lapack/default.nix @@ -0,0 +1,113 @@ +{ lib, stdenv +, lapack-reference, openblas +, isILP64 ? false +, lapackProvider ? openblas }: + +let + + version = "3"; + canonicalExtension = if stdenv.hostPlatform.isLinux + then "${stdenv.hostPlatform.extensions.sharedLibrary}.${version}" + else stdenv.hostPlatform.extensions.sharedLibrary; + + lapackImplementation = lib.getName lapackProvider; + lapackProvider' = if lapackImplementation == "mkl" + then lapackProvider + else lapackProvider.override { blas64 = isILP64; }; + +in + +assert isILP64 -> lapackImplementation == "mkl" || lapackProvider'.blas64; + +stdenv.mkDerivation { + pname = "lapack"; + inherit version; + + outputs = [ "out" "dev" ]; + + meta = (lapackProvider'.meta or {}) // { + description = "${lib.getName lapackProvider'} with just the LAPACK C and FORTRAN ABI"; + }; + + passthru = { + inherit isILP64; + provider = lapackProvider'; + implementation = lapackImplementation; + }; + + # TODO: drop this forced rebuild, as it was needed just once. + rebuild_salt = if stdenv.isDarwin && stdenv.isx86_64 then "J4AQ" else null; + + dontBuild = true; + dontConfigure = true; + unpackPhase = "src=$PWD"; + + dontPatchELF = true; + + installPhase = ('' + mkdir -p $out/lib $dev/include $dev/lib/pkgconfig + + liblapack="${lib.getLib lapackProvider'}/lib/liblapack${canonicalExtension}" + + if ! [ -e "$liblapack" ]; then + echo "$liblapack does not exist, ${lapackProvider'.name} does not provide liblapack." + exit 1 + fi + + cp -L "$liblapack" $out/lib/liblapack${canonicalExtension} + chmod +w $out/lib/liblapack${canonicalExtension} + +'' + (lib.optionalString stdenv.hostPlatform.isElf '' + patchelf --set-soname liblapack${canonicalExtension} $out/lib/liblapack${canonicalExtension} + patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapack${canonicalExtension}):${lapackProvider'}/lib" $out/lib/liblapack${canonicalExtension} +'') + '' + + if [ "$out/lib/liblapack${canonicalExtension}" != "$out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}" ]; then + ln -s $out/lib/liblapack${canonicalExtension} "$out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}" + fi + + install -D ${lib.getDev lapack-reference}/include/lapack.h $dev/include/lapack.h + + cat < $dev/lib/pkgconfig/lapack.pc +Name: lapack +Version: ${version} +Description: LAPACK FORTRAN implementation +Cflags: -I$dev/include +Libs: -L$out/lib -llapack +EOF + + liblapacke="${lib.getLib lapackProvider'}/lib/liblapacke${canonicalExtension}" + + if ! [ -e "$liblapacke" ]; then + echo "$liblapacke does not exist, ${lapackProvider'.name} does not provide liblapacke." + exit 1 + fi + + cp -L "$liblapacke" $out/lib/liblapacke${canonicalExtension} + chmod +w $out/lib/liblapacke${canonicalExtension} + +'' + (lib.optionalString stdenv.hostPlatform.isElf '' + patchelf --set-soname liblapacke${canonicalExtension} $out/lib/liblapacke${canonicalExtension} + patchelf --set-rpath "$(patchelf --print-rpath $out/lib/liblapacke${canonicalExtension}):${lib.getLib lapackProvider'}/lib" $out/lib/liblapacke${canonicalExtension} +'') + '' + + if [ -f "$out/lib/liblapacke.so.3" ]; then + ln -s $out/lib/liblapacke.so.3 $out/lib/liblapacke.so + fi + + cp ${lib.getDev lapack-reference}/include/lapacke{,_mangling,_config,_utils}.h $dev/include + + cat < $dev/lib/pkgconfig/lapacke.pc +Name: lapacke +Version: ${version} +Description: LAPACK C implementation +Cflags: -I$dev/include +Libs: -L$out/lib -llapacke +EOF +'' + lib.optionalString (lapackImplementation == "mkl") '' + mkdir -p $out/nix-support + echo 'export MKL_INTERFACE_LAYER=${lib.optionalString isILP64 "I"}LP64,GNU' > $out/nix-support/setup-hook + ln -s $out/lib/liblapack${canonicalExtension} $out/lib/libmkl_rt${stdenv.hostPlatform.extensions.sharedLibrary} + ln -sf ${lapackProvider'}/include/* $dev/include +''); +} diff --git a/pkgs/build-support/appimage/appimage-exec.sh b/pkgs/build-support/appimage/appimage-exec.sh new file mode 100755 index 0000000..b91d13c --- /dev/null +++ b/pkgs/build-support/appimage/appimage-exec.sh @@ -0,0 +1,145 @@ +#!@shell@ +# shellcheck shell=bash + +if [ -n "$DEBUG" ] ; then + set -x +fi + +PATH="@path@:$PATH" +apprun_opt=true +OWD=$(readlink -f .) +# can be read by appimages: https://docs.appimage.org/packaging-guide/environment-variables.html +export OWD + +# src : AppImage +# dest : let's unpack() create the directory +unpack() { + local src="$1" + local out="$2" + + # https://github.com/AppImage/libappimage/blob/ca8d4b53bed5cbc0f3d0398e30806e0d3adeaaab/src/libappimage/utils/MagicBytesChecker.cpp#L45-L63 + local appimageSignature; + appimageSignature="$(LC_ALL=C readelf -h "$src" | awk 'NR==2{print $10$11;}')" + local appimageType; + appimageType="$(LC_ALL=C readelf -h "$src" | awk 'NR==2{print $12;}')" + + # check AppImage signature + if [ "$appimageSignature" != "4149" ]; then + echo "Not an AppImage file" + exit + fi + + case "$appimageType" in + "01") + echo "Uncompress $(basename "$src") of type $appimageType" + mkdir "$out" + pv "$src" | bsdtar -x -C "$out" -f - + ;; + + "02") + # This method avoid issues with non executable appimages, + # non-native packer, packer patching and squashfs-root destination prefix. + + # multiarch offset one-liner using same method as AppImage + # see https://gist.github.com/probonopd/a490ba3401b5ef7b881d5e603fa20c93 + offset=$(LC_ALL=C readelf -h "$src" | awk 'NR==13{e_shoff=$5} NR==18{e_shentsize=$5} NR==19{e_shnum=$5} END{print e_shoff+e_shentsize*e_shnum}') + echo "Uncompress $(basename "$src") of type $appimageType @ offset $offset" + unsquashfs -q -d "$out" -o "$offset" "$src" + chmod go-w "$out" + ;; + + # "03") + # get ready, https://github.com/TheAssassin/type3-runtime + + *) + echo Unsupported AppImage Type: "$appimageType" + exit + ;; + esac + echo "$(basename "$src") is now installed in $out" +} + +apprun() { + + SHA256=$(sha256sum "$APPIMAGE" | awk '{print $1}') + export APPDIR="${XDG_CACHE_HOME:-$HOME/.cache}/appimage-run/$SHA256" + + #compatibility + if [ -x "$APPDIR/squashfs-root" ]; then APPDIR="$APPDIR/squashfs-root"; fi + + if [ ! -x "$APPDIR" ]; then + mkdir -p "$(dirname "$APPDIR")" + unpack "$APPIMAGE" "$APPDIR" + else echo "$(basename "$APPIMAGE")" installed in "$APPDIR" + fi + + export PATH="$PATH:$PWD/usr/bin" +} + +wrap() { + + # quite same in appimageTools + export APPIMAGE_SILENT_INSTALL=1 + + if [ -n "$APPIMAGE_DEBUG_EXEC" ]; then + cd "$APPDIR" || true + exec "$APPIMAGE_DEBUG_EXEC" + fi + + exec "$APPDIR/AppRun" "$@" +} + +usage() { + cat < [AppImage options] + +-h show this message +-d debug mode +-x : extract appimage in the directory then exit. +-w : run uncompressed appimage directory (used in appimageTools) + +[AppImage options]: Options are passed on to the appimage. +If you want to execute a custom command in the appimage's environment, set the APPIMAGE_DEBUG_EXEC environment variable. + +EOF + exit 1 +} + +while getopts "x:w:dh" option; do + case "${option}" in + d) set -x + ;; + x) # eXtract + unpack_opt=true + APPDIR=${OPTARG} + ;; + w) # WrapAppImage + export APPDIR=${OPTARG} + wrap_opt=true + ;; + h) usage + ;; + *) usage + ;; + esac +done +shift "$((OPTIND-1))" + +if [ -n "$wrap_opt" ] && [ -d "$APPDIR" ]; then + wrap "$@" + exit +else + APPIMAGE="$(realpath "$1")" || usage + shift +fi + +if [ -n "$unpack_opt" ] && [ -f "$APPIMAGE" ]; then + unpack "$APPIMAGE" "$APPDIR" + exit +fi + +if [ -n "$apprun_opt" ] && [ -f "$APPIMAGE" ]; then + apprun + wrap "$@" + exit +fi diff --git a/pkgs/build-support/appimage/default.nix b/pkgs/build-support/appimage/default.nix new file mode 100644 index 0000000..95dc7ff --- /dev/null +++ b/pkgs/build-support/appimage/default.nix @@ -0,0 +1,210 @@ +{ lib +, bash +, binutils-unwrapped +, coreutils +, gawk +, libarchive +, pv +, squashfsTools +, buildFHSEnv +, pkgs +}: + +rec { + appimage-exec = pkgs.substituteAll { + src = ./appimage-exec.sh; + isExecutable = true; + dir = "bin"; + path = lib.makeBinPath [ + bash + binutils-unwrapped + coreutils + gawk + libarchive + pv + squashfsTools + ]; + }; + + extract = args@{ name ? "${args.pname}-${args.version}", postExtract ? "", src, ... }: pkgs.runCommand "${name}-extracted" { + buildInputs = [ appimage-exec ]; + } '' + appimage-exec.sh -x $out ${src} + ${postExtract} + ''; + + # for compatibility, deprecated + extractType1 = extract; + extractType2 = extract; + wrapType1 = wrapType2; + + wrapAppImage = args@{ + src, + extraPkgs, + meta ? {}, + ... + }: buildFHSEnv + (defaultFhsEnvArgs // { + targetPkgs = pkgs: [ appimage-exec ] + ++ defaultFhsEnvArgs.targetPkgs pkgs ++ extraPkgs pkgs; + + runScript = "appimage-exec.sh -w ${src} --"; + + meta = { + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; + } // meta; + } // (removeAttrs args (builtins.attrNames (builtins.functionArgs wrapAppImage)))); + + wrapType2 = args@{ src, extraPkgs ? pkgs: [ ], ... }: wrapAppImage + (args // { + inherit extraPkgs; + src = extract (lib.filterAttrs (key: value: builtins.elem key [ "name" "pname" "version" "src" ]) args); + + # passthru src to make nix-update work + # hack to keep the origin position (unsafeGetAttrPos) + passthru = lib.pipe args [ + lib.attrNames + (lib.remove "src") + (removeAttrs args) + ] // args.passthru or { }; + }); + + defaultFhsEnvArgs = { + # Most of the packages were taken from the Steam chroot + targetPkgs = pkgs: with pkgs; [ + gtk3 + bashInteractive + gnome.zenity + xorg.xrandr + which + perl + xdg-utils + iana-etc + krb5 + gsettings-desktop-schemas + hicolor-icon-theme # dont show a gtk warning about hicolor not being installed + ]; + + # list of libraries expected in an appimage environment: + # https://github.com/AppImage/pkg2appimage/blob/master/excludelist + multiPkgs = pkgs: with pkgs; [ + desktop-file-utils + xorg.libXcomposite + xorg.libXtst + xorg.libXrandr + xorg.libXext + xorg.libX11 + xorg.libXfixes + libGL + + gst_all_1.gstreamer + gst_all_1.gst-plugins-ugly + gst_all_1.gst-plugins-base + libdrm + xorg.xkeyboardconfig + xorg.libpciaccess + + glib + gtk2 + bzip2 + zlib + gdk-pixbuf + + xorg.libXinerama + xorg.libXdamage + xorg.libXcursor + xorg.libXrender + xorg.libXScrnSaver + xorg.libXxf86vm + xorg.libXi + xorg.libSM + xorg.libICE + freetype + curlWithGnuTls + nspr + nss + fontconfig + cairo + pango + expat + dbus + cups + libcap + SDL2 + libusb1 + udev + dbus-glib + atk + at-spi2-atk + libudev0-shim + + xorg.libXt + xorg.libXmu + xorg.libxcb + xorg.xcbutil + xorg.xcbutilwm + xorg.xcbutilimage + xorg.xcbutilkeysyms + xorg.xcbutilrenderutil + libGLU + libuuid + libogg + libvorbis + SDL + SDL2_image + glew110 + openssl + libidn + tbb + wayland + mesa + libxkbcommon + vulkan-loader + + flac + freeglut + libjpeg + libpng12 + libpulseaudio + libsamplerate + libmikmod + libthai + libtheora + libtiff + pixman + speex + SDL_image + SDL_ttf + SDL_mixer + SDL2_ttf + SDL2_mixer + libappindicator-gtk2 + libcaca + libcanberra + libgcrypt + libvpx + librsvg + xorg.libXft + libvdpau + alsa-lib + + harfbuzz + e2fsprogs + libgpg-error + keyutils.lib + libjack2 + fribidi + p11-kit + + gmp + + # libraries not on the upstream include list, but nevertheless expected + # by at least one appimage + libtool.lib # for Synfigstudio + xorg.libxshmfence # for apple-music-electron + at-spi2-core + pciutils # for FreeCAD + pipewire # immersed-vr wayland support + ]; + }; +} diff --git a/pkgs/build-support/binary-cache/default.nix b/pkgs/build-support/binary-cache/default.nix new file mode 100644 index 0000000..8c610c5 --- /dev/null +++ b/pkgs/build-support/binary-cache/default.nix @@ -0,0 +1,35 @@ +{ lib, stdenv, coreutils, jq, python3, nix, xz }: + +# This function is for creating a flat-file binary cache, i.e. the kind created by +# nix copy --to file:///some/path and usable as a substituter (with the file:// prefix). + +# For example, in the Nixpkgs repo: +# nix-build -E 'with import ./. {}; mkBinaryCache { rootPaths = [hello]; }' + +{ name ? "binary-cache" +, rootPaths +}: + +stdenv.mkDerivation { + inherit name; + + __structuredAttrs = true; + + exportReferencesGraph.closure = rootPaths; + + preferLocalBuild = true; + + nativeBuildInputs = [ coreutils jq python3 nix xz ]; + + buildCommand = '' + mkdir -p $out/nar + + python ${./make-binary-cache.py} + + # These directories must exist, or Nix might try to create them in LocalBinaryCacheStore::init(), + # which fails if mounted read-only + mkdir $out/realisations + mkdir $out/debuginfo + mkdir $out/log + ''; +} diff --git a/pkgs/build-support/binary-cache/make-binary-cache.py b/pkgs/build-support/binary-cache/make-binary-cache.py new file mode 100644 index 0000000..589d005 --- /dev/null +++ b/pkgs/build-support/binary-cache/make-binary-cache.py @@ -0,0 +1,43 @@ + +import json +import os +import subprocess + +with open(os.environ["NIX_ATTRS_JSON_FILE"], "r") as f: + closures = json.load(f)["closure"] + +os.chdir(os.environ["out"]) + +nixPrefix = os.environ["NIX_STORE"] # Usually /nix/store + +with open("nix-cache-info", "w") as f: + f.write("StoreDir: " + nixPrefix + "\n") + +def dropPrefix(path): + return path[len(nixPrefix + "/"):] + +for item in closures: + narInfoHash = dropPrefix(item["path"]).split("-")[0] + + xzFile = "nar/" + narInfoHash + ".nar.xz" + with open(xzFile, "w") as f: + subprocess.run("nix-store --dump %s | xz -c" % item["path"], stdout=f, shell=True) + + fileHash = subprocess.run(["nix-hash", "--base32", "--type", "sha256", item["path"]], capture_output=True).stdout.decode().strip() + fileSize = os.path.getsize(xzFile) + + # Rename the .nar.xz file to its own hash to match "nix copy" behavior + finalXzFile = "nar/" + fileHash + ".nar.xz" + os.rename(xzFile, finalXzFile) + + with open(narInfoHash + ".narinfo", "w") as f: + f.writelines((x + "\n" for x in [ + "StorePath: " + item["path"], + "URL: " + finalXzFile, + "Compression: xz", + "FileHash: sha256:" + fileHash, + "FileSize: " + str(fileSize), + "NarHash: " + item["narHash"], + "NarSize: " + str(item["narSize"]), + "References: " + " ".join(dropPrefix(ref) for ref in item["references"]), + ])) diff --git a/pkgs/build-support/bintools-wrapper/add-darwin-ldflags-before.sh b/pkgs/build-support/bintools-wrapper/add-darwin-ldflags-before.sh new file mode 100644 index 0000000..75d9484 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/add-darwin-ldflags-before.sh @@ -0,0 +1,81 @@ +# Unconditionally adding in platform version flags will result in warnings that +# will be treated as errors by some packages. Add any missing flags here. + +# There are two things to be configured: the "platform version" (oldest +# supported version of macos, ios, etc), and the "sdk version". +# +# The modern way of configuring these is to use: +# -platform_version $platform $platform_version $sdk_version" +# +# The old way is still supported, and uses flags like: +# -${platform}_version_min $platform_version +# -sdk_version $sdk_version +# +# If both styles are specified ld will combine them. If multiple versions are +# specified for the same platform, ld will emit an error. +# +# The following adds flags for whichever properties have not already been +# provided. + +havePlatformVersionFlag= +haveDarwinSDKVersion= +haveDarwinPlatformVersion= + +# Roles will set by add-flags.sh, but add-flags.sh can be skipped when the +# cc-wrapper has added the linker flags. Both the cc-wrapper and the binutils +# wrapper mangle the same variable (MACOSX_DEPLOYMENT_TARGET), so if roles are +# empty due to being run through the cc-wrapper then the mangle here is a no-op +# and we still do the right thing. +# +# To be robust, make sure we always have the correct set of roles. +accumulateRoles + +mangleVarSingle @darwinMinVersionVariable@ ${role_suffixes[@]+"${role_suffixes[@]}"} + +n=0 +nParams=${#params[@]} +while (( n < nParams )); do + p=${params[n]} + case "$p" in + # the current platform + -@darwinPlatform@_version_min) + haveDarwinPlatformVersion=1 + ;; + + # legacy aliases + -macosx_version_min|-iphoneos_version_min|-iosmac_version_min|-uikitformac_version_min) + haveDarwinPlatformVersion=1 + ;; + + -sdk_version) + haveDarwinSDKVersion=1 + ;; + + -platform_version) + havePlatformVersionFlag=1 + + # If clang can't determine the sdk version it will pass 0.0.0. This + # has runtime effects so we override this to use the known sdk + # version. + if [ "${params[n+3]-}" = 0.0.0 ]; then + params[n+3]=@darwinSdkVersion@ + fi + ;; + esac + n=$((n + 1)) +done + +# If the caller has set -platform_version, trust they're doing the right thing. +# This will be the typical case for clang in nixpkgs. +if [ ! "$havePlatformVersionFlag" ]; then + if [ ! "$haveDarwinSDKVersion" ] && [ ! "$haveDarwinPlatformVersion" ]; then + # Nothing provided. Use the modern "-platform_version" to set both. + extraBefore+=(-platform_version @darwinPlatform@ "${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@}" @darwinSdkVersion@) + elif [ ! "$haveDarwinSDKVersion" ]; then + # Add missing sdk version + extraBefore+=(-sdk_version @darwinSdkVersion@) + elif [ ! "$haveDarwinPlatformVersion" ]; then + # Add missing platform version + extraBefore+=(-@darwinPlatform@_version_min "${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@}") + fi +fi diff --git a/pkgs/build-support/bintools-wrapper/add-flags.sh b/pkgs/build-support/bintools-wrapper/add-flags.sh new file mode 100644 index 0000000..3b94dab --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/add-flags.sh @@ -0,0 +1,37 @@ +# See cc-wrapper for comments. +var_templates_list=( + NIX_IGNORE_LD_THROUGH_GCC + NIX_LDFLAGS + NIX_LDFLAGS_BEFORE + NIX_DYNAMIC_LINKER + NIX_LDFLAGS_AFTER + NIX_LDFLAGS_HARDEN + NIX_HARDENING_ENABLE +) +var_templates_bool=( + NIX_SET_BUILD_ID + NIX_DONT_SET_RPATH +) + +accumulateRoles + +for var in "${var_templates_list[@]}"; do + mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done + +if [ -e @out@/nix-support/libc-ldflags ]; then + NIX_LDFLAGS_@suffixSalt@+=" $(< @out@/nix-support/libc-ldflags)" +fi + +if [ -z "$NIX_DYNAMIC_LINKER_@suffixSalt@" ] && [ -e @out@/nix-support/ld-set-dynamic-linker ]; then + NIX_DYNAMIC_LINKER_@suffixSalt@="$(< @out@/nix-support/dynamic-linker)" +fi + +if [ -e @out@/nix-support/libc-ldflags-before ]; then + NIX_LDFLAGS_BEFORE_@suffixSalt@="$(< @out@/nix-support/libc-ldflags-before) $NIX_LDFLAGS_BEFORE_@suffixSalt@" +fi + +export NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@=1 diff --git a/pkgs/build-support/bintools-wrapper/add-hardening.sh b/pkgs/build-support/bintools-wrapper/add-hardening.sh new file mode 100644 index 0000000..db9553c --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/add-hardening.sh @@ -0,0 +1,62 @@ +declare -a hardeningLDFlags=() + +declare -A hardeningEnableMap=() + +# Intentionally word-split in case 'NIX_HARDENING_ENABLE' is defined in Nix. The +# array expansion also prevents undefined variables from causing trouble with +# `set -u`. +for flag in ${NIX_HARDENING_ENABLE_@suffixSalt@-}; do + hardeningEnableMap["$flag"]=1 +done + +# Remove unsupported flags. +for flag in @hardening_unsupported_flags@; do + unset -v "hardeningEnableMap[$flag]" +done + +if (( "${NIX_DEBUG:-0}" >= 1 )); then + declare -a allHardeningFlags=(pie relro bindnow) + declare -A hardeningDisableMap=() + + # Determine which flags were effectively disabled so we can report below. + for flag in "${allHardeningFlags[@]}"; do + if [[ -z "${hardeningEnableMap[$flag]-}" ]]; then + hardeningDisableMap[$flag]=1 + fi + done + + printf 'HARDENING: disabled flags:' >&2 + (( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2 + echo >&2 + + if (( "${#hardeningEnableMap[@]}" )); then + echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2; + fi +fi + +for flag in "${!hardeningEnableMap[@]}"; do + case $flag in + pie) + if [[ ! (" ${params[*]} " =~ " -shared " \ + || " ${params[*]} " =~ " -static " \ + || " ${params[*]} " =~ " -r " \ + || " ${params[*]} " =~ " -Ur " \ + || " ${params[*]} " =~ " -i ") ]]; then + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi + hardeningLDFlags+=('-pie') + fi + ;; + relro) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi + hardeningLDFlags+=('-z' 'relro') + ;; + bindnow) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi + hardeningLDFlags+=('-z' 'now') + ;; + *) + # Ignore unsupported. Checked in Nix that at least *some* + # tool supports each flag. + ;; + esac +done diff --git a/pkgs/build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh b/pkgs/build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh new file mode 100755 index 0000000..376a7ab --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh @@ -0,0 +1,49 @@ +#! @shell@ +# shellcheck shell=bash + +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +source @signingUtils@ + +extraAfter=() +extraBefore=() +params=("$@") + +input= + +pprev= +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + if [ "$pprev" != "-change" ] && [[ "$prev" != -* ]] && [[ "$p" != -* ]]; then + input="$p" + fi + pprev="$prev" + prev="$p" +done + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +@prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + +sign "$input" diff --git a/pkgs/build-support/bintools-wrapper/darwin-strip-wrapper.sh b/pkgs/build-support/bintools-wrapper/darwin-strip-wrapper.sh new file mode 100755 index 0000000..a676995 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/darwin-strip-wrapper.sh @@ -0,0 +1,78 @@ +#! @shell@ +# shellcheck shell=bash + +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +source @signingUtils@ + +extraAfter=() +extraBefore=() +params=("$@") + +output= +inputs=() + +restAreFiles= +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + if [ "$restAreFiles" ]; then + inputs+=("$p") + else + case "$prev" in + -s|-R|-d|-arch) + # Unrelated arguments with values + ;; + -o) + # Explicit output + output="$p" + ;; + *) + # Any other orgument either takes no value, or is a file. + if [[ "$p" != -* ]]; then + inputs+=("$p") + fi + ;; + esac + + if [ "$p" == - ]; then + restAreFiles=1 + fi + fi + + prev="$p" +done + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +@prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + +if [ "$output" ]; then + # Single explicit output + signIfRequired "$output" +else + # Multiple inputs, rewritten in place + for input in "${inputs[@]}"; do + signIfRequired "$input" + done +fi diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix new file mode 100644 index 0000000..5ca5bc3 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -0,0 +1,439 @@ +# The Nixpkgs CC is not directly usable, since it doesn't know where +# the C library and standard header files are. Therefore the compiler +# produced by that package cannot be installed directly in a user +# environment and used from the command line. So we use a wrapper +# script that sets up the right environment variables so that the +# compiler and the linker just "work". + +{ name ? "" +, lib +, stdenvNoCC +, runtimeShell +, bintools ? null, libc ? null, coreutils ? null, gnugrep ? null +, netbsd ? null, netbsdCross ? null +, sharedLibraryLoader ? + if libc == null then + null + else if stdenvNoCC.targetPlatform.isNetBSD then + if !(targetPackages ? netbsdCross) then + netbsd.ld_elf_so + else if libc != targetPackages.netbsdCross.headers then + targetPackages.netbsdCross.ld_elf_so + else + null + else + lib.getLib libc +, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" +, propagateDoc ? bintools != null && bintools ? man +, extraPackages ? [], extraBuildCommands ? "" +, isGNU ? bintools.isGNU or false +, isLLVM ? bintools.isLLVM or false +, isCCTools ? bintools.isCCTools or false +, expand-response-params +, targetPackages ? {} +, useMacosReexportHack ? false +, wrapGas ? false + +# Note: the hardening flags are part of the bintools-wrapper, rather than +# the cc-wrapper, because a few of them are handled by the linker. +, defaultHardeningFlags ? [ + "bindnow" + "format" + "fortify" + "fortify3" + "pic" + "relro" + "stackprotector" + "strictoverflow" + ] ++ lib.optional (with stdenvNoCC; + # Musl-based platforms will keep "pie", other platforms will not. + # If you change this, make sure to update section `{#sec-hardening-in-nixpkgs}` + # in the nixpkgs manual to inform users about the defaults. + targetPlatform.libc == "musl" + # Except when: + # - static aarch64, where compilation works, but produces segfaulting dynamically linked binaries. + # - static armv7l, where compilation fails. + && !(targetPlatform.isAarch && targetPlatform.isStatic) + ) "pie" + +# Darwin code signing support utilities +, postLinkSignHook ? null, signingUtils ? null +}: + +assert nativeTools -> !propagateDoc && nativePrefix != ""; +assert !nativeTools -> bintools != null && coreutils != null && gnugrep != null; +assert !(nativeLibc && noLibc); +assert (noLibc || nativeLibc) == (libc == null); + +let + inherit (lib) + attrByPath + concatStringsSep + getBin + getDev + getLib + getName + getVersion + hasSuffix + optional + optionalAttrs + optionals + optionalString + platforms + removePrefix + replaceStrings + ; + + inherit (stdenvNoCC) hostPlatform targetPlatform; + + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by + # default. + targetPrefix = optionalString (targetPlatform != hostPlatform) + (targetPlatform.config + "-"); + + bintoolsVersion = getVersion bintools; + bintoolsName = removePrefix targetPrefix (getName bintools); + + libc_bin = optionalString (libc != null) (getBin libc); + libc_dev = optionalString (libc != null) (getDev libc); + libc_lib = optionalString (libc != null) (getLib libc); + bintools_bin = optionalString (!nativeTools) (getBin bintools); + # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. + coreutils_bin = optionalString (!nativeTools) (getBin coreutils); + + # See description in cc-wrapper. + suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config; + + # The dynamic linker has different names on different platforms. This is a + # shell glob that ought to match it. + dynamicLinker = + /**/ if sharedLibraryLoader == null then "" + else if targetPlatform.libc == "musl" then "${sharedLibraryLoader}/lib/ld-musl-*" + else if targetPlatform.libc == "uclibc" then "${sharedLibraryLoader}/lib/ld*-uClibc.so.1" + else if (targetPlatform.libc == "bionic" && targetPlatform.is32bit) then "/system/bin/linker" + else if (targetPlatform.libc == "bionic" && targetPlatform.is64bit) then "/system/bin/linker64" + else if targetPlatform.libc == "nblibc" then "${sharedLibraryLoader}/libexec/ld.elf_so" + else if targetPlatform.system == "i686-linux" then "${sharedLibraryLoader}/lib/ld-linux.so.2" + else if targetPlatform.system == "x86_64-linux" then "${sharedLibraryLoader}/lib/ld-linux-x86-64.so.2" + # ELFv1 (.1) or ELFv2 (.2) ABI + else if targetPlatform.isPower64 then "${sharedLibraryLoader}/lib/ld64.so.*" + # ARM with a wildcard, which can be "" or "-armhf". + else if (with targetPlatform; isAarch32 && isLinux) then "${sharedLibraryLoader}/lib/ld-linux*.so.3" + else if targetPlatform.system == "aarch64-linux" then "${sharedLibraryLoader}/lib/ld-linux-aarch64.so.1" + else if targetPlatform.system == "powerpc-linux" then "${sharedLibraryLoader}/lib/ld.so.1" + else if targetPlatform.isMips then "${sharedLibraryLoader}/lib/ld.so.1" + # `ld-linux-riscv{32,64}-.so.1` + else if targetPlatform.isRiscV then "${sharedLibraryLoader}/lib/ld-linux-riscv*.so.1" + else if targetPlatform.isLoongArch64 then "${sharedLibraryLoader}/lib/ld-linux-loongarch*.so.1" + else if targetPlatform.isDarwin then "/usr/lib/dyld" + else if targetPlatform.isFreeBSD then "/libexec/ld-elf.so.1" + else if hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1" + else ""; + +in + +stdenvNoCC.mkDerivation { + pname = targetPrefix + + (if name != "" then name else "${bintoolsName}-wrapper"); + version = optionalString (bintools != null) bintoolsVersion; + + preferLocalBuild = true; + + outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (bintools ? info) "info"); + + passthru = { + inherit targetPrefix suffixSalt; + inherit bintools libc nativeTools nativeLibc nativePrefix isGNU isLLVM; + + emacsBufferSetup = pkgs: '' + ; We should handle propagation here too + (mapc + (lambda (arg) + (when (file-directory-p (concat arg "/lib")) + (setenv "NIX_LDFLAGS_${suffixSalt}" (concat (getenv "NIX_LDFLAGS_${suffixSalt}") " -L" arg "/lib"))) + (when (file-directory-p (concat arg "/lib64")) + (setenv "NIX_LDFLAGS_${suffixSalt}" (concat (getenv "NIX_LDFLAGS_${suffixSalt}") " -L" arg "/lib64")))) + '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) + ''; + + inherit defaultHardeningFlags; + }; + + dontBuild = true; + dontConfigure = true; + + enableParallelBuilding = true; + + unpackPhase = '' + src=$PWD + ''; + + installPhase = + '' + mkdir -p $out/bin $out/nix-support + + wrap() { + local dst="$1" + local wrapper="$2" + export prog="$3" + export use_response_file_by_default=${if isCCTools then "1" else "0"} + substituteAll "$wrapper" "$out/bin/$dst" + chmod +x "$out/bin/$dst" + } + '' + + + (if nativeTools then '' + echo ${nativePrefix} > $out/nix-support/orig-bintools + + ldPath="${nativePrefix}/bin" + '' else '' + echo $bintools_bin > $out/nix-support/orig-bintools + + ldPath="${bintools_bin}/bin" + '' + + # Solaris needs an additional ld wrapper. + + optionalString (targetPlatform.isSunOS && nativePrefix != "") '' + ldPath="${nativePrefix}/bin" + exec="$ldPath/${targetPrefix}ld" + wrap ld-solaris ${./ld-solaris-wrapper.sh} + '') + + # If we are asked to wrap `gas` and this bintools has it, + # then symlink it (`as` will be symlinked next). + # This is mainly for the wrapped gnat-bootstrap on x86-64 Darwin, + # as it must have both the GNU assembler from cctools (installed as `gas`) + # and the Clang integrated assembler (installed as `as`). + # See pkgs/os-specific/darwin/binutils/default.nix for details. + + optionalString wrapGas '' + if [ -e $ldPath/${targetPrefix}gas ]; then + ln -s $ldPath/${targetPrefix}gas $out/bin/${targetPrefix}gas + fi + '' + + # Create symlinks for rest of the binaries. + + '' + for binary in objdump objcopy size strings as ar nm gprof dwp c++filt addr2line \ + ranlib readelf elfedit dlltool dllwrap windmc windres; do + if [ -e $ldPath/${targetPrefix}''${binary} ]; then + ln -s $ldPath/${targetPrefix}''${binary} $out/bin/${targetPrefix}''${binary} + fi + done + + '' + (if !useMacosReexportHack then '' + if [ -e ''${ld:-$ldPath/${targetPrefix}ld} ]; then + wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld} + fi + '' else '' + ldInner="${targetPrefix}ld-reexport-delegate" + wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld} + wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" + unset ldInner + '') + '' + + for variant in $ldPath/${targetPrefix}ld.*; do + basename=$(basename "$variant") + wrap $basename ${./ld-wrapper.sh} $variant + done + ''; + + strictDeps = true; + depsTargetTargetPropagated = extraPackages; + + setupHooks = [ + ../setup-hooks/role.bash + ./setup-hook.sh + ]; + + postFixup = + ## + ## General libc support + ## + optionalString (libc != null) ('' + touch "$out/nix-support/libc-ldflags" + echo "-L${libc_lib}${libc.libdir or "/lib"}" >> $out/nix-support/libc-ldflags + + echo "${libc_lib}" > $out/nix-support/orig-libc + echo "${libc_dev}" > $out/nix-support/orig-libc-dev + '' + + ## + ## Dynamic linker support + ## + + optionalString (sharedLibraryLoader != null) '' + if [[ -z ''${dynamicLinker+x} ]]; then + echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2 + local dynamicLinker="${sharedLibraryLoader}/lib/ld*.so.?" + fi + '' + + # Expand globs to fill array of options + + '' + dynamicLinker=($dynamicLinker) + + case ''${#dynamicLinker[@]} in + 0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;; + 1) echo "Using dynamic linker: '$dynamicLinker'" >&2;; + *) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;; + esac + + if [ -n "''${dynamicLinker-}" ]; then + echo $dynamicLinker > $out/nix-support/dynamic-linker + + ${if targetPlatform.isDarwin then '' + printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook + '' else optionalString (sharedLibraryLoader != null) '' + if [ -e ${sharedLibraryLoader}/lib/32/ld-linux.so.2 ]; then + echo ${sharedLibraryLoader}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 + fi + touch $out/nix-support/ld-set-dynamic-linker + ''} + fi + '') + + ## + ## User env support + ## + + # Propagate the underling unwrapped bintools so that if you + # install the wrapper, you get tools like objdump (same for any + # binaries of libc). + + optionalString (!nativeTools) '' + printWords ${bintools_bin} ${optionalString (libc != null) libc_bin} > $out/nix-support/propagated-user-env-packages + '' + + ## + ## Man page and info support + ## + + optionalString propagateDoc ('' + ln -s ${bintools.man} $man + '' + optionalString (bintools ? info) '' + ln -s ${bintools.info} $info + '') + + ## + ## Hardening support + ## + + # some linkers on some platforms don't support specific -z flags + + '' + export hardening_unsupported_flags="" + if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" bindnow" + fi + if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" relro" + fi + '' + + + optionalString hostPlatform.isCygwin '' + hardening_unsupported_flags+=" pic" + '' + + + optionalString (targetPlatform.isAvr || targetPlatform.isWindows) '' + hardening_unsupported_flags+=" relro bindnow" + '' + + + optionalString (libc != null && targetPlatform.isAvr) '' + for isa in avr5 avr3 avr4 avr6 avr25 avr31 avr35 avr51 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 tiny-stack; do + echo "-L${getLib libc}/avr/lib/$isa" >> $out/nix-support/libc-cflags + done + '' + + + optionalString targetPlatform.isDarwin '' + echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/libc-ldflags + '' + + ## + ## GNU specific extra strip flags + ## + + # TODO(@sternenseemann): make a generic strip wrapper? + + optionalString (bintools.isGNU or false) '' + wrap ${targetPrefix}strip ${./gnu-binutils-strip-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}strip" + '' + + ### + ### Remove certain timestamps from final binaries + ### + + optionalString (targetPlatform.isDarwin && !(bintools.isGNU or false)) '' + echo "export ZERO_AR_DATE=1" >> $out/nix-support/setup-hook + '' + + + '' + for flags in "$out/nix-support"/*flags*; do + substituteInPlace "$flags" --replace $'\n' ' ' + done + + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh + substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh + substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash + '' + + ### + ### Ensure consistent LC_VERSION_MIN_MACOSX + ### + + optionalString targetPlatform.isDarwin ( + let + inherit (targetPlatform) + darwinPlatform darwinSdkVersion + darwinMinVersion darwinMinVersionVariable; + in '' + export darwinPlatform=${darwinPlatform} + export darwinMinVersion=${darwinMinVersion} + export darwinSdkVersion=${darwinSdkVersion} + export darwinMinVersionVariable=${darwinMinVersionVariable} + substituteAll ${./add-darwin-ldflags-before.sh} $out/nix-support/add-local-ldflags-before.sh + '' + ) + + ## + ## Code signing on Apple Silicon + ## + + optionalString (targetPlatform.isDarwin && targetPlatform.isAarch64) '' + echo 'source ${postLinkSignHook}' >> $out/nix-support/post-link-hook + + export signingUtils=${signingUtils} + + wrap \ + ${targetPrefix}install_name_tool \ + ${./darwin-install_name_tool-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}install_name_tool" + + wrap \ + ${targetPrefix}strip ${./darwin-strip-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}strip" + '' + + ## + ## Extra custom steps + ## + + extraBuildCommands; + + env = { + # for substitution in utils.bash + # TODO(@sternenseemann): invent something cleaner than passing in "" in case of absence + expandResponseParams = "${expand-response-params}/bin/expand-response-params"; + # TODO(@sternenseemann): rename env var via stdenv rebuild + shell = (getBin runtimeShell + runtimeShell.shellPath or ""); + gnugrep_bin = optionalString (!nativeTools) gnugrep; + wrapperName = "BINTOOLS_WRAPPER"; + inherit dynamicLinker targetPrefix suffixSalt coreutils_bin; + inherit bintools_bin libc_bin libc_dev libc_lib; + default_hardening_flags_str = builtins.toString defaultHardeningFlags; + }; + + meta = + let bintools_ = optionalAttrs (bintools != null) bintools; in + (optionalAttrs (bintools_ ? meta) (removeAttrs bintools.meta ["priority"])) // + { description = + attrByPath ["meta" "description"] "System binary utilities" bintools_ + + " (wrapper script)"; + priority = 10; + } // optionalAttrs useMacosReexportHack { + platforms = platforms.darwin; + }; +} diff --git a/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh b/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh new file mode 100644 index 0000000..5b5136e --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh @@ -0,0 +1,4 @@ +#! @shell@ +# shellcheck shell=bash + +exec @prog@ --enable-deterministic-archives "$@" diff --git a/pkgs/build-support/bintools-wrapper/ld-solaris-wrapper.sh b/pkgs/build-support/bintools-wrapper/ld-solaris-wrapper.sh new file mode 100644 index 0000000..5d81e34 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/ld-solaris-wrapper.sh @@ -0,0 +1,29 @@ +#!@shell@ +set -eu -o pipefail +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +declare -a args=("$@") +# I've also tried adding -z direct and -z lazyload, but it gave too many problems with C++ exceptions :'( +# Also made sure libgcc would not be lazy-loaded, as suggested here: https://www.illumos.org/issues/2534#note-3 +# but still no success. +declare -a argsBefore=(-z ignore) argsAfter=() + +# This loop makes sure all -L arguments are before -l arguments, or ld may complain it cannot find a library. +# GNU binutils does not have this problem: +# http://stackoverflow.com/questions/5817269/does-the-order-of-l-and-l-options-in-the-gnu-linker-matter +while (( $# )); do + case "${args[$i]}" in + -L) argsBefore+=("$1" "$2"); shift ;; + -L?*) argsBefore+=("$1") ;; + *) argsAfter+=("$1") ;; + esac + shift +done + +# Trace: +set -x +exec "@ld@" "${argsBefore[@]}" "${argsAfter[@]}" diff --git a/pkgs/build-support/bintools-wrapper/ld-wrapper.sh b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh new file mode 100644 index 0000000..dcbe8a4 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh @@ -0,0 +1,273 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +path_backup="$PATH" + +# phase separation makes this look useless +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + PATH="@coreutils_bin@/bin" +fi + +source @out@/nix-support/utils.bash + +if [ -z "${NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-flags.sh +fi + + +# Optionally filter out paths not refering to the store. +expandResponseParams "$@" + +# NIX_LINK_TYPE is set if ld has been called through our cc wrapper. We take +# advantage of this to avoid both recalculating it, and also repeating other +# processing cc wrapper has already done. +if [[ -n "${NIX_LINK_TYPE_@suffixSalt@:-}" ]]; then + linkType=$NIX_LINK_TYPE_@suffixSalt@ +else + linkType=$(checkLinkType "${params[@]}") +fi + +if [[ "${NIX_ENFORCE_PURITY:-}" = 1 && -n "${NIX_STORE:-}" + && ( -z "$NIX_IGNORE_LD_THROUGH_GCC_@suffixSalt@" || -z "${NIX_LINK_TYPE_@suffixSalt@:-}" ) ]]; then + rest=() + nParams=${#params[@]} + declare -i n=0 + + while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + if [ "${p:0:3}" = -L/ ] && badPath "${p:2}"; then + skip "${p:2}" + elif [ "$p" = -L ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -rpath ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -dynamic-linker ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -syslibroot ] && [ $p2 == // ]; then + # When gcc is built on darwin --with-build-sysroot=/ + # produces '-syslibroot //' linker flag. It's a no-op, + # which does not introduce impurities. + n+=1; skip "$p2" + elif [ "${p:0:10}" = /LIBPATH:/ ] && badPath "${p:9}"; then + reject "${p:9}" + # We need to not match LINK.EXE-style flags like + # /NOLOGO or /LIBPATH:/nix/store/foo + elif [[ $p =~ ^/[^:]*/ ]] && badPath "$p"; then + reject "$p" + elif [ "${p:0:9}" = --sysroot ]; then + # Our ld is not built with sysroot support (Can we fix that?) + : + else + rest+=("$p") + fi + n+=1 + done + # Old bash empty array hack + params=(${rest+"${rest[@]}"}) +fi + + +source @out@/nix-support/add-hardening.sh + +extraAfter=() +extraBefore=(${hardeningLDFlags[@]+"${hardeningLDFlags[@]}"}) + +if [ -z "${NIX_LINK_TYPE_@suffixSalt@:-}" ]; then + extraAfter+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_@suffixSalt@)) + extraBefore+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_BEFORE_@suffixSalt@)) + + # By adding dynamic linker to extraBefore we allow the users set their + # own dynamic linker as NIX_LD_FLAGS will override earlier set flags + if [[ "$linkType" == dynamic && -n "$NIX_DYNAMIC_LINKER_@suffixSalt@" ]]; then + extraBefore+=("-dynamic-linker" "$NIX_DYNAMIC_LINKER_@suffixSalt@") + fi +fi + +extraAfter+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_AFTER_@suffixSalt@)) + +# These flags *must not* be pulled up to -Wl, flags, so they can't go in +# add-flags.sh. They must always be set, so must not be disabled by +# NIX_LDFLAGS_SET. +if [ -e @out@/nix-support/add-local-ldflags-before.sh ]; then + source @out@/nix-support/add-local-ldflags-before.sh +fi + + +# Three tasks: +# +# 1. Find all -L... switches for rpath +# +# 2. Find relocatable flag for build id. +# +# 3. Choose 32-bit dynamic linker if needed +declare -a libDirs +declare -A libs +declare -i relocatable=0 link32=0 + +linkerOutput="a.out" + +if + [ "$NIX_DONT_SET_RPATH_@suffixSalt@" != 1 ] \ + || [ "$NIX_SET_BUILD_ID_@suffixSalt@" = 1 ] \ + || [ -e @out@/nix-support/dynamic-linker-m32 ] +then + prev= + # Old bash thinks empty arrays are undefined, ugh. + for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + do + case "$prev" in + -L) + libDirs+=("$p") + ;; + -l) + libs["lib${p}.so"]=1 + ;; + -m) + # Presumably only the last `-m` flag has any effect. + case "$p" in + elf_i386) link32=1;; + *) link32=0;; + esac + ;; + -dynamic-linker | -plugin) + # Ignore this argument, or it will match *.so and be added to rpath. + ;; + *) + case "$p" in + -L/*) + libDirs+=("${p:2}") + ;; + -l?*) + libs["lib${p:2}.so"]=1 + ;; + "${NIX_STORE:-}"/*.so | "${NIX_STORE:-}"/*.so.*) + # This is a direct reference to a shared library. + libDirs+=("${p%/*}") + libs["${p##*/}"]=1 + ;; + -r | --relocatable | -i) + relocatable=1 + esac + ;; + esac + prev="$p" + done +fi + +# Determine linkerOutput +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + case "$prev" in + -o) + # Informational for post-link-hook + linkerOutput="$p" + ;; + *) + ;; + esac + prev="$p" +done + +if [[ "$link32" == "1" && "$linkType" == dynamic && -e "@out@/nix-support/dynamic-linker-m32" ]]; then + # We have an alternate 32-bit linker and we're producing a 32-bit ELF, let's + # use it. + extraAfter+=( + '-dynamic-linker' + "$(< @out@/nix-support/dynamic-linker-m32)" + ) +fi + +# Add all used dynamic libraries to the rpath. +if [[ "$NIX_DONT_SET_RPATH_@suffixSalt@" != 1 && "$linkType" != static-pie ]]; then + # For each directory in the library search path (-L...), + # see if it contains a dynamic library used by a -l... flag. If + # so, add the directory to the rpath. + # It's important to add the rpath in the order of -L..., so + # the link time chosen objects will be those of runtime linking. + declare -A rpaths + for dir in ${libDirs+"${libDirs[@]}"}; do + if [[ "$dir" =~ [/.][/.] ]] && dir2=$(readlink -f "$dir"); then + dir="$dir2" + fi + if [ -n "${rpaths[$dir]:-}" ] || [[ "$dir" != "${NIX_STORE:-}"/* ]]; then + # If the path is not in the store, don't add it to the rpath. + # This typically happens for libraries in /tmp that are later + # copied to $out/lib. If not, we're screwed. + continue + fi + for path in "$dir"/*; do + file="${path##*/}" + if [ "${libs[$file]:-}" ]; then + # This library may have been provided by a previous directory, + # but if that library file is inside an output of the current + # derivation, it can be deleted after this compilation and + # should be found in a later directory, so we add all + # directories that contain any of the libraries to rpath. + rpaths["$dir"]=1 + extraAfter+=(-rpath "$dir") + break + fi + done + done + +fi + +# This is outside the DONT_SET_RPATH branch because it's more targeted and we +# usually want it (on Darwin) even if DONT_SET_RPATH is set. +if [ -n "${NIX_COREFOUNDATION_RPATH:-}" ]; then + extraAfter+=(-rpath $NIX_COREFOUNDATION_RPATH) +fi + +# Only add --build-id if this is a final link. FIXME: should build gcc +# with --enable-linker-build-id instead? +# +# Note: `lld` interprets `--build-id` to mean `--build-id=fast`; GNU ld defaults +# to SHA1. +if [ "$NIX_SET_BUILD_ID_@suffixSalt@" = 1 ] && ! (( "$relocatable" )); then + extraAfter+=(--build-id="${NIX_BUILD_ID_STYLE:-sha1}") +fi + + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +PATH="$path_backup" +# Old bash workaround, see above. + +if (( "${NIX_LD_USE_RESPONSE_FILE:-@use_response_file_by_default@}" >= 1 )); then + @prog@ @<(printf "%q\n" \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"}) +else + @prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +fi + +if [ -e "@out@/nix-support/post-link-hook" ]; then + source @out@/nix-support/post-link-hook +fi diff --git a/pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash new file mode 100644 index 0000000..255071a --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash @@ -0,0 +1,246 @@ +#! @shell@ + +set -eu -o pipefail + +# For cmd | while read; do ...; done +shopt -s lastpipe + +path_backup="$PATH" +if [ -n "@coreutils_bin@" ]; then + PATH="@coreutils_bin@/bin" +fi + +declare -ri recurThreshold=200 +declare -i overflowCount=0 + +declare -ar origArgs=("$@") + +# Throw away what we won't need +declare -a parentArgs=() + +while (( $# )); do + case "$1" in + -l) + echo "cctools LD does not support '-l foo'" >&2 + exit 1 + ;; + -lazy_library | -reexport_library | -upward_library | -weak_library) + overflowCount+=1 + shift 2 + ;; + -l* | *.so.* | *.dylib | -lazy-l* | -reexport-l* | -upward-l* | -weak-l*) + overflowCount+=1 + shift 1 + ;; + *.a | *.o) + shift 1 + ;; + -L | -F) + # Evidentally ld doesn't like using the child's RPATH, so it still + # needs these. + parentArgs+=("$1" "$2") + shift 2 + ;; + -L?* | -F?*) + parentArgs+=("$1") + shift 1 + ;; + -o) + outputName="$2" + parentArgs+=("$1" "$2") + shift 2 + ;; + -install_name | -dylib_install_name | -dynamic-linker | -plugin) + parentArgs+=("$1" "$2") + shift 2 + ;; + -rpath) + # Only an rpath to the child is needed, which we will add + shift 2 + ;; + *) + if [[ -f "$1" ]]; then + # Propabably a non-standard object file like Haskell's + # `.dyn_o`. Skip it like other inputs + : + else + parentArgs+=("$1") + fi + shift 1 + ;; + esac +done + + + +if (( "$overflowCount" <= "$recurThreshold" )); then + if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: Only ${overflowCount} inputs counted while ${recurThreshold} is the ceiling, linking normally. " >&2 + fi + PATH="$path_backup" + exec @prog@ "${origArgs[@]}" +fi + + + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: ${overflowCount} inputs counted when ${recurThreshold} is the ceiling, inspecting further. " >&2 +fi + +# Collect the normalized linker input +declare -a norm=() + +# Arguments are null-separated +@prog@ --dump-normalized-lib-args "${origArgs[@]}" | + while IFS= read -r -d '' input; do + norm+=("$input") + done + +declare -i leafCount=0 +declare lastLeaf='' +declare -a childrenInputs=() trailingInputs=() +while (( "${#norm[@]}" )); do + case "${norm[0]}" in + -lazy_library | -upward_library) + # TODO(@Ericson2314): Don't do that, but intersperse children + # between such args. + echo "ld-wrapper: Warning: Potentially changing link order" >&2 + trailingInputs+=("${norm[0]}" "${norm[1]}") + norm=("${norm[@]:2}") + ;; + -reexport_library | -weak_library) + childrenInputs+=("${norm[0]}" "${norm[1]}") + if [[ "${norm[1]}" != "$lastLeaf" ]]; then + leafCount+=1 + lastLeaf="${norm[1]}" + fi + norm=("${norm[@]:2}") + ;; + *.so | *.dylib) + childrenInputs+=(-reexport_library "${norm[0]}") + if [[ "${norm[0]}" != "$lastLeaf" ]]; then + leafCount+=1 + lastLeaf="${norm[0]}" + fi + norm=("${norm[@]:1}") + ;; + *.o | *.a) + # Don't delegate object files or static libs + parentArgs+=("${norm[0]}") + norm=("${norm[@]:1}") + ;; + *) + if [[ -f "${norm[0]}" ]]; then + # Propabably a non-standard object file. We'll let it by. + parentArgs+=("${norm[0]}") + norm=("${norm[@]:1}") + else + echo "ld-wrapper: Internal Error: Invalid normalized argument" >&2 + exit 255 + fi + ;; + esac +done + + + +if (( "$leafCount" <= "$recurThreshold" )); then + if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: Only ${leafCount} *dynamic* inputs counted while ${recurThreshold} is the ceiling, linking normally. " >&2 + fi + PATH="$path_backup" + exec @prog@ "${origArgs[@]}" +fi + + + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: ${leafCount} *dynamic* inputs counted when ${recurThreshold} is the ceiling, delegating to children. " >&2 +fi + +declare -r outputNameLibless=$( \ + if [[ -z "${outputName:+isUndefined}" ]]; then + echo unnamed + return 0; + fi + baseName=$(basename ${outputName}) + if [[ "$baseName" = lib* ]]; then + baseName="${baseName:3}" + fi + echo "$baseName") + +declare -ra children=( + "$outputNameLibless-reexport-delegate-0" + "$outputNameLibless-reexport-delegate-1" +) + +mkdir -p "$out/lib" + +symbolBloatObject=$outputNameLibless-symbol-hack.o +if [[ ! -f $symbolBloatObject ]]; then + # `-Q` means use GNU Assembler rather than Clang, avoiding an awkward + # dependency cycle. + printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' | + PATH="$PATH:@out@/bin" @targetPrefix@as -Q -- -o $symbolBloatObject +fi + +# Split inputs between children +declare -a child0Inputs=() child1Inputs=("${childrenInputs[@]}") +let "countFirstChild = $leafCount / 2" || true +lastLeaf='' +while (( "$countFirstChild" )); do + case "${child1Inputs[0]}" in + -reexport_library | -weak_library) + child0Inputs+=("${child1Inputs[0]}" "${child1Inputs[1]}") + if [[ "${child1Inputs[1]}" != "$lastLeaf" ]]; then + let countFirstChild-=1 || true + lastLeaf="${child1Inputs[1]}" + fi + child1Inputs=("${child1Inputs[@]:2}") + ;; + *.so | *.dylib) + child0Inputs+=(-reexport_library "${child1Inputs[0]}") + if [[ "${child1Inputs[0]}" != "$lastLeaf" ]]; then + let countFirstChild-=1 || true + lastLeaf="${child1Inputs[1]}" + fi + child1Inputs=("${child1Inputs[@]:2}") + ;; + *) + echo "ld-wrapper: Internal Error: Invalid delegated input" >&2 + exit -1 + ;; + esac +done + + +# First half of libs +@out@/bin/@targetPrefix@ld \ + -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ + -o "$out/lib/lib${children[0]}.dylib" \ + -install_name "$out/lib/lib${children[0]}.dylib" \ + "$symbolBloatObject" "${child0Inputs[@]}" "${trailingInputs[@]}" + +# Second half of libs +@out@/bin/@targetPrefix@ld \ + -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ + -o "$out/lib/lib${children[1]}.dylib" \ + -install_name "$out/lib/lib${children[1]}.dylib" \ + "$symbolBloatObject" "${child1Inputs[@]}" "${trailingInputs[@]}" + +parentArgs+=("-L$out/lib" -rpath "$out/lib") +if [[ $outputName != *reexport-delegate* ]]; then + parentArgs+=("-l${children[0]}" "-l${children[1]}") +else + parentArgs+=("-reexport-l${children[0]}" "-reexport-l${children[1]}") +fi + +parentArgs+=("${trailingInputs[@]}") + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "flags using delegated children to @prog@:" >&2 + printf " %q\n" "${parentArgs[@]}" >&2 +fi + +PATH="$path_backup" +exec @prog@ "${parentArgs[@]}" diff --git a/pkgs/build-support/bintools-wrapper/setup-hook.sh b/pkgs/build-support/bintools-wrapper/setup-hook.sh new file mode 100644 index 0000000..c146cbe --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/setup-hook.sh @@ -0,0 +1,72 @@ +# Binutils Wrapper hygiene +# +# See comments in cc-wrapper's setup hook. This works exactly the same way. + +# Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a +# native compile. +# +# TODO(@Ericson2314): No native exception +[[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0 + +bintoolsWrapper_addLDVars () { + # See ../setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then + export NIX_LDFLAGS${role_post}+=" -L$1/lib64" + fi + + if [[ -d "$1/lib" ]]; then + # Don't add the /lib directory if it actually doesn't contain any libraries. For instance, + # Python and Haskell packages often only have directories like $out/lib/ghc-8.4.3/ or + # $out/lib/python3.6/, so having them in LDFLAGS just makes the linker search unnecessary + # directories and bloats the size of the environment variable space. + local -a glob=( $1/lib/lib* ) + if [ "${#glob[*]}" -gt 0 ]; then + export NIX_LDFLAGS${role_post}+=" -L$1/lib" + fi + fi +} + +# See ../setup-hooks/role.bash +getTargetRole +getTargetRoleWrapper + +addEnvHooks "$targetOffset" bintoolsWrapper_addLDVars + +# shellcheck disable=SC2157 +if [ -n "@bintools_bin@" ]; then + addToSearchPath _PATH @bintools_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@libc_bin@" ]; then + addToSearchPath _PATH @libc_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + addToSearchPath _PATH @coreutils_bin@/bin +fi + +# Export tool environment variables so various build systems use the right ones. + +export NIX_BINTOOLS${role_post}=@out@ + +for cmd in \ + ar as ld nm objcopy objdump readelf ranlib strip strings size windres +do + if + PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null + then + export "${cmd^^}${role_post}=@targetPrefix@${cmd}"; + fi +done + +# If unset, assume the default hardening flags. +: ${NIX_HARDENING_ENABLE="@default_hardening_flags_str@"} +export NIX_HARDENING_ENABLE + +# No local scope in sourced file +unset -v role_post cmd upper_case diff --git a/pkgs/build-support/build-bazel-package/default.nix b/pkgs/build-support/build-bazel-package/default.nix new file mode 100644 index 0000000..3ffff74 --- /dev/null +++ b/pkgs/build-support/build-bazel-package/default.nix @@ -0,0 +1,294 @@ +{ stdenv +, cacert +, lib +, writeCBin +}: + +args@{ + name ? "${args.pname}-${args.version}" +, bazel +, bazelFlags ? [] +, bazelBuildFlags ? [] +, bazelTestFlags ? [] +, bazelRunFlags ? [] +, runTargetFlags ? [] +, bazelFetchFlags ? [] +, bazelTargets ? [] +, bazelTestTargets ? [] +, bazelRunTarget ? null +, buildAttrs +, fetchAttrs + + # Newer versions of Bazel are moving away from built-in rules_cc and instead + # allow fetching it as an external dependency in a WORKSPACE file[1]. If + # removed in the fixed-output fetch phase, building will fail to download it. + # This can be seen e.g. in #73097 + # + # This option allows configuring the removal of rules_cc in cases where a + # project depends on it via an external dependency. + # + # [1]: https://github.com/bazelbuild/rules_cc +, removeRulesCC ? true +, removeLocalConfigCc ? true +, removeLocal ? true + + # Use build --nobuild instead of fetch. This allows fetching the dependencies + # required for the build as configured, rather than fetching all the dependencies + # which may not work in some situations (e.g. Java code which ends up relying on + # Debian-specific /usr/share/java paths, but doesn't in the configured build). +, fetchConfigured ? true + + # Don’t add Bazel --copt and --linkopt from NIX_CFLAGS_COMPILE / + # NIX_LDFLAGS. This is necessary when using a custom toolchain which + # Bazel wants all headers / libraries to come from, like when using + # CROSSTOOL. Weirdly, we can still get the flags through the wrapped + # compiler. +, dontAddBazelOpts ? false +, ... +}: + +let + fArgs = removeAttrs args [ "buildAttrs" "fetchAttrs" "removeRulesCC" ] // { + inherit + name + bazelFlags + bazelBuildFlags + bazelTestFlags + bazelRunFlags + runTargetFlags + bazelFetchFlags + bazelTargets + bazelTestTargets + bazelRunTarget + dontAddBazelOpts + ; + }; + fBuildAttrs = fArgs // buildAttrs; + fFetchAttrs = fArgs // removeAttrs fetchAttrs [ "sha256" ]; + bazelCmd = { cmd, additionalFlags, targets, targetRunFlags ? [ ] }: + lib.optionalString (targets != [ ]) '' + # See footnote called [USER and BAZEL_USE_CPP_ONLY_TOOLCHAIN variables] + BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 \ + USER=homeless-shelter \ + bazel \ + --batch \ + --output_base="$bazelOut" \ + --output_user_root="$bazelUserRoot" \ + ${cmd} \ + --curses=no \ + "''${copts[@]}" \ + "''${host_copts[@]}" \ + "''${linkopts[@]}" \ + "''${host_linkopts[@]}" \ + $bazelFlags \ + ${lib.strings.concatStringsSep " " additionalFlags} \ + ${lib.strings.concatStringsSep " " targets} \ + ${lib.optionalString (targetRunFlags != []) " -- " + lib.strings.concatStringsSep " " targetRunFlags} + ''; + # we need this to chmod dangling symlinks on darwin, gnu coreutils refuses to do so: + # chmod: cannot operate on dangling symlink '$symlink' + chmodder = writeCBin "chmodder" '' + #include + #include + #include + #include + #include + #include + + int main(int argc, char** argv) { + mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; + if (argc != 2) { + fprintf(stderr, "usage: chmodder file"); + exit(EXIT_FAILURE); + } + if (lchmod(argv[1], mode) != 0) { + fprintf(stderr, "failed to lchmod '%s': %s", argv[0], strerror(errno)); + exit(EXIT_FAILURE); + } + } + ''; +in +stdenv.mkDerivation (fBuildAttrs // { + + deps = stdenv.mkDerivation (fFetchAttrs // { + name = "${name}-deps.tar.gz"; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ fFetchAttrs.impureEnvVars or []; + + nativeBuildInputs = fFetchAttrs.nativeBuildInputs or [] ++ [ bazel ]; + + preHook = fFetchAttrs.preHook or "" + '' + export bazelOut="$(echo ''${NIX_BUILD_TOP}/output | sed -e 's,//,/,g')" + export bazelUserRoot="$(echo ''${NIX_BUILD_TOP}/tmp | sed -e 's,//,/,g')" + export HOME="$NIX_BUILD_TOP" + export USER="nix" + # This is needed for git_repository with https remotes + export GIT_SSL_CAINFO="${cacert}/etc/ssl/certs/ca-bundle.crt" + # This is needed for Bazel fetchers that are themselves programs (e.g. + # rules_go using the go toolchain) + export SSL_CERT_FILE="${cacert}/etc/ssl/certs/ca-bundle.crt" + ''; + + buildPhase = fFetchAttrs.buildPhase or '' + runHook preBuild + + ${ + bazelCmd { + cmd = if fetchConfigured then "build --nobuild" else "fetch"; + additionalFlags = [ + # We disable multithreading for the fetching phase since it can lead to timeouts with many dependencies/threads: + # https://github.com/bazelbuild/bazel/issues/6502 + "--loading_phase_threads=1" + "$bazelFetchFlags" + ] ++ (if fetchConfigured then ["--jobs" "$NIX_BUILD_CORES"] else []); + targets = fFetchAttrs.bazelTargets ++ fFetchAttrs.bazelTestTargets; + } + } + + runHook postBuild + ''; + + installPhase = fFetchAttrs.installPhase or ('' + runHook preInstall + + # Remove all built in external workspaces, Bazel will recreate them when building + rm -rf $bazelOut/external/{bazel_tools,\@bazel_tools.marker} + ${lib.optionalString removeRulesCC "rm -rf $bazelOut/external/{rules_cc,\\@rules_cc.marker}"} + rm -rf $bazelOut/external/{embedded_jdk,\@embedded_jdk.marker} + ${lib.optionalString removeLocalConfigCc "rm -rf $bazelOut/external/{local_config_cc,\\@local_config_cc.marker}"} + ${lib.optionalString removeLocal "rm -rf $bazelOut/external/{local_*,\\@local_*.marker}"} + + # Clear markers + find $bazelOut/external -name '@*\.marker' -exec sh -c 'echo > {}' \; + + # Remove all vcs files + rm -rf $(find $bazelOut/external -type d -name .git) + rm -rf $(find $bazelOut/external -type d -name .svn) + rm -rf $(find $bazelOut/external -type d -name .hg) + + # Removing top-level symlinks along with their markers. + # This is needed because they sometimes point to temporary paths (?). + # For example, in Tensorflow-gpu build: + # platforms -> NIX_BUILD_TOP/tmp/install/35282f5123611afa742331368e9ae529/_embedded_binaries/platforms + find $bazelOut/external -maxdepth 1 -type l | while read symlink; do + name="$(basename "$symlink")" + rm "$symlink" + test -f "$bazelOut/external/@$name.marker" && rm "$bazelOut/external/@$name.marker" || true + done + + # Patching symlinks to remove build directory reference + find $bazelOut/external -type l | while read symlink; do + new_target="$(readlink "$symlink" | sed "s,$NIX_BUILD_TOP,NIX_BUILD_TOP,")" + rm "$symlink" + ln -sf "$new_target" "$symlink" + '' + lib.optionalString stdenv.isDarwin '' + # on linux symlink permissions cannot be modified, so we modify those on darwin to match the linux ones + ${chmodder}/bin/chmodder "$symlink" + '' + '' + done + + echo '${bazel.name}' > $bazelOut/external/.nix-bazel-version + + (cd $bazelOut/ && tar czf $out --sort=name --mtime='@1' --owner=0 --group=0 --numeric-owner external/) + + runHook postInstall + ''); + + dontFixup = true; + allowedRequisites = []; + + outputHashAlgo = "sha256"; + outputHash = fetchAttrs.sha256; + }); + + nativeBuildInputs = fBuildAttrs.nativeBuildInputs or [] ++ [ (bazel.override { enableNixHacks = true; }) ]; + + preHook = fBuildAttrs.preHook or "" + '' + export bazelOut="$NIX_BUILD_TOP/output" + export bazelUserRoot="$NIX_BUILD_TOP/tmp" + export HOME="$NIX_BUILD_TOP" + ''; + + preConfigure = '' + mkdir -p "$bazelOut" + + (cd $bazelOut && tar xfz $deps) + + test "${bazel.name}" = "$(<$bazelOut/external/.nix-bazel-version)" || { + echo "fixed output derivation was built for a different bazel version" >&2 + echo " got: $(<$bazelOut/external/.nix-bazel-version)" >&2 + echo "expected: ${bazel.name}" >&2 + exit 1 + } + + chmod -R +w $bazelOut + find $bazelOut -type l | while read symlink; do + if [[ $(readlink "$symlink") == *NIX_BUILD_TOP* ]]; then + ln -sf $(readlink "$symlink" | sed "s,NIX_BUILD_TOP,$NIX_BUILD_TOP,") "$symlink" + fi + done + '' + fBuildAttrs.preConfigure or ""; + + buildPhase = fBuildAttrs.buildPhase or '' + runHook preBuild + + # Bazel sandboxes the execution of the tools it invokes, so even though we are + # calling the correct nix wrappers, the values of the environment variables + # the wrappers are expecting will not be set. So instead of relying on the + # wrappers picking them up, pass them in explicitly via `--copt`, `--linkopt` + # and related flags. + + copts=() + host_copts=() + linkopts=() + host_linkopts=() + if [ -z "''${dontAddBazelOpts:-}" ]; then + for flag in $NIX_CFLAGS_COMPILE; do + copts+=( "--copt=$flag" ) + host_copts+=( "--host_copt=$flag" ) + done + for flag in $NIX_CXXSTDLIB_COMPILE; do + copts+=( "--copt=$flag" ) + host_copts+=( "--host_copt=$flag" ) + done + for flag in $NIX_LDFLAGS; do + linkopts+=( "--linkopt=-Wl,$flag" ) + host_linkopts+=( "--host_linkopt=-Wl,$flag" ) + done + fi + + ${ + bazelCmd { + cmd = "test"; + additionalFlags = + ["--test_output=errors"] ++ fBuildAttrs.bazelTestFlags ++ ["--jobs" "$NIX_BUILD_CORES"]; + targets = fBuildAttrs.bazelTestTargets; + } + } + ${ + bazelCmd { + cmd = "build"; + additionalFlags = fBuildAttrs.bazelBuildFlags ++ ["--jobs" "$NIX_BUILD_CORES"]; + targets = fBuildAttrs.bazelTargets; + } + } + ${ + bazelCmd { + cmd = "run"; + additionalFlags = fBuildAttrs.bazelRunFlags ++ [ "--jobs" "$NIX_BUILD_CORES" ]; + # Bazel run only accepts a single target, but `bazelCmd` expects `targets` to be a list. + targets = lib.optionals (fBuildAttrs.bazelRunTarget != null) [ fBuildAttrs.bazelRunTarget ]; + targetRunFlags = fBuildAttrs.runTargetFlags; + } + } + runHook postBuild + ''; +}) + +# [USER and BAZEL_USE_CPP_ONLY_TOOLCHAIN variables]: +# Bazel computes the default value of output_user_root before parsing the +# flag. The computation of the default value involves getting the $USER +# from the environment. Code here : +# https://github.com/bazelbuild/bazel/blob/9323c57607d37f9c949b60e293b573584906da46/src/main/cpp/startup_options.cc#L123-L124 +# +# On macOS Bazel will use the system installed Xcode or CLT toolchain instead of the one in the PATH unless we pass BAZEL_USE_CPP_ONLY_TOOLCHAIN. diff --git a/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix b/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix new file mode 100644 index 0000000..1e34ad1 --- /dev/null +++ b/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix @@ -0,0 +1,266 @@ +{ lib +, stdenv +, runCommandLocal +, buildEnv +, writeText +, writeShellScriptBin +, pkgs +, pkgsi686Linux +}: + +{ profile ? "" +, targetPkgs ? pkgs: [] +, multiPkgs ? pkgs: [] +, multiArch ? false # Whether to include 32bit packages +, extraBuildCommands ? "" +, extraBuildCommandsMulti ? "" +, extraOutputsToInstall ? [] +, ... # for name, or pname+version +} @ args: + +# HOWTO: +# All packages (most likely programs) returned from targetPkgs will only be +# installed once--matching the host's architecture (64bit on x86_64 and 32bit on +# x86). +# +# Packages (most likely libraries) returned from multiPkgs are installed +# once on x86 systems and twice on x86_64 systems. +# On x86 they are merged with packages from targetPkgs. +# On x86_64 they are added to targetPkgs and in addition their 32bit +# versions are also installed. The final directory structure looks as +# follows: +# /lib32 will include 32bit libraries from multiPkgs +# /lib64 will include 64bit libraries from multiPkgs and targetPkgs +# /lib will link to /lib32 + +let + inherit (stdenv) is64bit; + + name = if (args ? pname && args ? version) + then "${args.pname}-${args.version}" + else args.name; + + # "use of glibc_multi is only supported on x86_64-linux" + isMultiBuild = multiArch && stdenv.system == "x86_64-linux"; + isTargetBuild = !isMultiBuild; + + # list of packages (usually programs) which match the host's architecture + # (which includes stuff from multiPkgs) + targetPaths = targetPkgs pkgs ++ (if multiPkgs == null then [] else multiPkgs pkgs); + + # list of packages which are for x86 (only multiPkgs, only for x86_64 hosts) + multiPaths = multiPkgs pkgsi686Linux; + + # base packages of the chroot + # these match the host's architecture, glibc_multi is used for multilib + # builds. glibcLocales must be before glibc or glibc_multi as otherwiese + # the wrong LOCALE_ARCHIVE will be used where only C.UTF-8 is available. + baseTargetPaths = with pkgs; [ + glibcLocales + (if isMultiBuild then glibc_multi else glibc) + (toString gcc.cc.lib) + bashInteractiveFHS + coreutils + less + shadow + su + gawk + diffutils + findutils + gnused + gnugrep + gnutar + gzip + bzip2 + xz + ]; + baseMultiPaths = with pkgsi686Linux; [ + (toString gcc.cc.lib) + ]; + + ldconfig = writeShellScriptBin "ldconfig" '' + # due to a glibc bug, 64-bit ldconfig complains about patchelf'd 32-bit libraries, so we use 32-bit ldconfig when we have them + exec ${if isMultiBuild then pkgsi686Linux.glibc.bin else pkgs.glibc.bin}/bin/ldconfig -f /etc/ld.so.conf -C /etc/ld.so.cache "$@" + ''; + + etcProfile = writeText "profile" '' + export PS1='${name}-chrootenv:\u@\h:\w\$ ' + export LOCALE_ARCHIVE='/usr/lib/locale/locale-archive' + export LD_LIBRARY_PATH="/run/opengl-driver/lib:/run/opengl-driver-32/lib''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" + export PATH="/run/wrappers/bin:/usr/bin:/usr/sbin:$PATH" + export TZDIR='/etc/zoneinfo' + + # XDG_DATA_DIRS is used by pressure-vessel (steam proton) and vulkan loaders to find the corresponding icd + export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/run/opengl-driver/share:/run/opengl-driver-32/share + + # Following XDG spec [1], XDG_DATA_DIRS should default to "/usr/local/share:/usr/share". + # In nix, it is commonly set without containing these values, so we add them as fallback. + # + # [1] + case ":$XDG_DATA_DIRS:" in + *:/usr/local/share:*) ;; + *) export XDG_DATA_DIRS="$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/usr/local/share" ;; + esac + case ":$XDG_DATA_DIRS:" in + *:/usr/share:*) ;; + *) export XDG_DATA_DIRS="$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/usr/share" ;; + esac + + # Force compilers and other tools to look in default search paths + unset NIX_ENFORCE_PURITY + export NIX_BINTOOLS_WRAPPER_TARGET_HOST_${stdenv.cc.suffixSalt}=1 + export NIX_CC_WRAPPER_TARGET_HOST_${stdenv.cc.suffixSalt}=1 + export NIX_CFLAGS_COMPILE='-idirafter /usr/include' + export NIX_CFLAGS_LINK='-L/usr/lib -L/usr/lib32' + export NIX_LDFLAGS='-L/usr/lib -L/usr/lib32' + export PKG_CONFIG_PATH=/usr/lib/pkgconfig + export ACLOCAL_PATH=/usr/share/aclocal + + ${profile} + ''; + + # Compose /etc for the chroot environment + etcPkg = runCommandLocal "${name}-chrootenv-etc" { } '' + mkdir -p $out/etc + pushd $out/etc + + # environment variables + ln -s ${etcProfile} profile + + # symlink /etc/mtab -> /proc/mounts (compat for old userspace progs) + ln -s /proc/mounts mtab + ''; + + # Composes a /usr-like directory structure + staticUsrProfileTarget = buildEnv { + name = "${name}-usr-target"; + # ldconfig wrapper must come first so it overrides the original ldconfig + paths = [ etcPkg ldconfig ] ++ baseTargetPaths ++ targetPaths; + extraOutputsToInstall = [ "out" "lib" "bin" ] ++ extraOutputsToInstall; + ignoreCollisions = true; + postBuild = '' + if [[ -d $out/share/gsettings-schemas/ ]]; then + # Recreate the standard schemas directory if its a symlink to make it writable + if [[ -L $out/share/glib-2.0 ]]; then + target=$(readlink $out/share/glib-2.0) + rm $out/share/glib-2.0 + mkdir $out/share/glib-2.0 + ln -fs $target/* $out/share/glib-2.0 + fi + + if [[ -L $out/share/glib-2.0/schemas ]]; then + target=$(readlink $out/share/glib-2.0/schemas) + rm $out/share/glib-2.0/schemas + mkdir $out/share/glib-2.0/schemas + ln -fs $target/* $out/share/glib-2.0/schemas + fi + + mkdir -p $out/share/glib-2.0/schemas + + for d in $out/share/gsettings-schemas/*; do + # Force symlink, in case there are duplicates + ln -fs $d/glib-2.0/schemas/*.xml $out/share/glib-2.0/schemas + ln -fs $d/glib-2.0/schemas/*.gschema.override $out/share/glib-2.0/schemas + done + + # and compile them + ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas + fi + ''; + }; + + staticUsrProfileMulti = buildEnv { + name = "${name}-usr-multi"; + paths = baseMultiPaths ++ multiPaths; + extraOutputsToInstall = [ "out" "lib" ] ++ extraOutputsToInstall; + ignoreCollisions = true; + }; + + # setup library paths only for the targeted architecture + setupLibDirsTarget = '' + # link content of targetPaths + cp -rsHf ${staticUsrProfileTarget}/lib lib + ln -s lib lib${if is64bit then "64" else "32"} + ''; + + # setup /lib, /lib32 and /lib64 + setupLibDirsMulti = '' + mkdir -m0755 lib32 + mkdir -m0755 lib64 + ln -s lib64 lib + + # copy glibc stuff + cp -rsHf ${staticUsrProfileTarget}/lib/32/* lib32/ + chmod u+w -R lib32/ + + # copy content of multiPaths (32bit libs) + if [ -d ${staticUsrProfileMulti}/lib ]; then + cp -rsHf ${staticUsrProfileMulti}/lib/* lib32/ + chmod u+w -R lib32/ + fi + + # copy content of targetPaths (64bit libs) + cp -rsHf ${staticUsrProfileTarget}/lib/* lib64/ + chmod u+w -R lib64/ + + # symlink 32-bit ld-linux.so + ln -Ls ${staticUsrProfileTarget}/lib/32/ld-linux.so.2 lib/ + ''; + + setupLibDirs = if isTargetBuild + then setupLibDirsTarget + else setupLibDirsMulti; + + # the target profile is the actual profile that will be used for the chroot + setupTargetProfile = '' + mkdir -m0755 usr + pushd usr + + ${setupLibDirs} + + '' + lib.optionalString isMultiBuild '' + if [ -d "${staticUsrProfileMulti}/share" ]; then + cp -rLf ${staticUsrProfileMulti}/share share + fi + '' + '' + if [ -d "${staticUsrProfileTarget}/share" ]; then + if [ -d share ]; then + chmod -R 755 share + cp -rLTf ${staticUsrProfileTarget}/share share + else + cp -rsHf ${staticUsrProfileTarget}/share share + fi + fi + for i in bin sbin include; do + if [ -d "${staticUsrProfileTarget}/$i" ]; then + cp -rsHf "${staticUsrProfileTarget}/$i" "$i" + fi + done + cd .. + + for i in var etc opt; do + if [ -d "${staticUsrProfileTarget}/$i" ]; then + cp -rsHf "${staticUsrProfileTarget}/$i" "$i" + fi + done + for i in usr/{bin,sbin,lib,lib32,lib64}; do + if [ -d "$i" ]; then + ln -s "$i" + fi + done + + popd + ''; + +in runCommandLocal "${name}-fhs" { + passthru = { + inherit args baseTargetPaths targetPaths baseMultiPaths ldconfig isMultiBuild; + }; +} '' + mkdir -p $out + pushd $out + + ${setupTargetProfile} + ${extraBuildCommands} + ${lib.optionalString isMultiBuild extraBuildCommandsMulti} +'' diff --git a/pkgs/build-support/build-fhsenv-bubblewrap/default.nix b/pkgs/build-support/build-fhsenv-bubblewrap/default.nix new file mode 100644 index 0000000..12f3e7d --- /dev/null +++ b/pkgs/build-support/build-fhsenv-bubblewrap/default.nix @@ -0,0 +1,289 @@ +{ lib +, stdenv +, callPackage +, runCommandLocal +, writeShellScript +, glibc +, pkgsi686Linux +, coreutils +, bubblewrap +}: + +{ runScript ? "bash" +, extraInstallCommands ? "" +, meta ? {} +, passthru ? {} +, extraPreBwrapCmds ? "" +, extraBwrapArgs ? [] +, unshareUser ? false +, unshareIpc ? false +, unsharePid ? false +, unshareNet ? false +, unshareUts ? false +, unshareCgroup ? false +, privateTmp ? false +, dieWithParent ? true +, ... +} @ args: + +assert (!args ? pname || !args ? version) -> (args ? name); # You must provide name if pname or version (preferred) is missing. + +let + inherit (lib) + concatLines + concatStringsSep + escapeShellArgs + filter + optionalString + splitString + ; + + inherit (lib.attrsets) removeAttrs; + + name = args.name or "${args.pname}-${args.version}"; + executableName = args.pname or args.name; + # we don't know which have been supplied, and want to avoid defaulting missing attrs to null. Passed into runCommandLocal + nameAttrs = lib.filterAttrs (key: value: builtins.elem key [ "name" "pname" "version" ]) args; + + buildFHSEnv = callPackage ./buildFHSEnv.nix { }; + + fhsenv = buildFHSEnv (removeAttrs args [ + "runScript" "extraInstallCommands" "meta" "passthru" "extraPreBwrapCmds" "extraBwrapArgs" "dieWithParent" + "unshareUser" "unshareCgroup" "unshareUts" "unshareNet" "unsharePid" "unshareIpc" "privateTmp" + ]); + + etcBindEntries = let + files = [ + # NixOS Compatibility + "static" + "nix" # mainly for nixUnstable users, but also for access to nix/netrc + # Shells + "shells" + "bashrc" + "zshenv" + "zshrc" + "zinputrc" + "zprofile" + # Users, Groups, NSS + "passwd" + "group" + "shadow" + "hosts" + "resolv.conf" + "nsswitch.conf" + # User profiles + "profiles" + # Sudo & Su + "login.defs" + "sudoers" + "sudoers.d" + # Time + "localtime" + "zoneinfo" + # Other Core Stuff + "machine-id" + "os-release" + # PAM + "pam.d" + # Fonts + "fonts" + # ALSA + "alsa" + "asound.conf" + # SSL + "ssl/certs" + "ca-certificates" + "pki" + ]; + in map (path: "/etc/${path}") files; + + # Create this on the fly instead of linking from /nix + # The container might have to modify it and re-run ldconfig if there are + # issues running some binary with LD_LIBRARY_PATH + createLdConfCache = '' + cat > /etc/ld.so.conf < /dev/null + ''; + init = run: writeShellScript "${name}-init" '' + source /etc/profile + ${createLdConfCache} + exec ${run} "$@" + ''; + + indentLines = str: concatLines (map (s: " " + s) (filter (s: s != "") (splitString "\n" str))); + bwrapCmd = { initArgs ? "" }: '' + ${extraPreBwrapCmds} + ignored=(/nix /dev /proc /etc ${optionalString privateTmp "/tmp"}) + ro_mounts=() + symlinks=() + etc_ignored=() + + # loop through all entries of root in the fhs environment, except its /etc. + for i in ${fhsenv}/*; do + path="/''${i##*/}" + if [[ $path == '/etc' ]]; then + : + elif [[ -L $i ]]; then + symlinks+=(--symlink "$(${coreutils}/bin/readlink "$i")" "$path") + ignored+=("$path") + else + ro_mounts+=(--ro-bind "$i" "$path") + ignored+=("$path") + fi + done + + # loop through the entries of /etc in the fhs environment. + if [[ -d ${fhsenv}/etc ]]; then + for i in ${fhsenv}/etc/*; do + path="/''${i##*/}" + # NOTE: we're binding /etc/fonts and /etc/ssl/certs from the host so we + # don't want to override it with a path from the FHS environment. + if [[ $path == '/fonts' || $path == '/ssl' ]]; then + continue + fi + if [[ -L $i ]]; then + symlinks+=(--symlink "$i" "/etc$path") + else + ro_mounts+=(--ro-bind "$i" "/etc$path") + fi + etc_ignored+=("/etc$path") + done + fi + + # propagate /etc from the actual host if nested + if [[ -e /.host-etc ]]; then + ro_mounts+=(--ro-bind /.host-etc /.host-etc) + else + ro_mounts+=(--ro-bind /etc /.host-etc) + fi + + # link selected etc entries from the actual root + for i in ${escapeShellArgs etcBindEntries}; do + if [[ "''${etc_ignored[@]}" =~ "$i" ]]; then + continue + fi + if [[ -e $i ]]; then + symlinks+=(--symlink "/.host-etc/''${i#/etc/}" "$i") + fi + done + + declare -a auto_mounts + # loop through all directories in the root + for dir in /*; do + # if it is a directory and it is not ignored + if [[ -d "$dir" ]] && [[ ! "''${ignored[@]}" =~ "$dir" ]]; then + # add it to the mount list + auto_mounts+=(--bind "$dir" "$dir") + fi + done + + declare -a x11_args + # Always mount a tmpfs on /tmp/.X11-unix + # Rationale: https://github.com/flatpak/flatpak/blob/be2de97e862e5ca223da40a895e54e7bf24dbfb9/common/flatpak-run.c#L277 + x11_args+=(--tmpfs /tmp/.X11-unix) + + # Try to guess X socket path. This doesn't cover _everything_, but it covers some things. + if [[ "$DISPLAY" == :* ]]; then + display_nr=''${DISPLAY#?} + local_socket=/tmp/.X11-unix/X$display_nr + x11_args+=(--ro-bind-try "$local_socket" "$local_socket") + fi + + ${optionalString privateTmp '' + # sddm places XAUTHORITY in /tmp + if [[ "$XAUTHORITY" == /tmp/* ]]; then + x11_args+=(--ro-bind-try "$XAUTHORITY" "$XAUTHORITY") + fi + + # dbus-run-session puts the socket in /tmp + IFS=";" read -ra addrs <<<"$DBUS_SESSION_BUS_ADDRESS" + for addr in "''${addrs[@]}"; do + [[ "$addr" == unix:* ]] || continue + IFS="," read -ra parts <<<"''${addr#unix:}" + for part in "''${parts[@]}"; do + printf -v part '%s' "''${part//\\/\\\\}" + printf -v part '%b' "''${part//%/\\x}" + [[ "$part" == path=/tmp/* ]] || continue + x11_args+=(--ro-bind-try "''${part#path=}" "''${part#path=}") + done + done + ''} + + cmd=( + ${bubblewrap}/bin/bwrap + --dev-bind /dev /dev + --proc /proc + --chdir "$(pwd)" + ${optionalString unshareUser "--unshare-user"} + ${optionalString unshareIpc "--unshare-ipc"} + ${optionalString unsharePid "--unshare-pid"} + ${optionalString unshareNet "--unshare-net"} + ${optionalString unshareUts "--unshare-uts"} + ${optionalString unshareCgroup "--unshare-cgroup"} + ${optionalString dieWithParent "--die-with-parent"} + --ro-bind /nix /nix + ${optionalString privateTmp "--tmpfs /tmp"} + # Our glibc will look for the cache in its own path in `/nix/store`. + # As such, we need a cache to exist there, because pressure-vessel + # depends on the existence of an ld cache. However, adding one + # globally proved to be a bad idea (see #100655), the solution we + # settled on being mounting one via bwrap. + # Also, the cache needs to go to both 32 and 64 bit glibcs, for games + # of both architectures to work. + --tmpfs ${glibc}/etc \ + --tmpfs /etc \ + --symlink /etc/ld.so.conf ${glibc}/etc/ld.so.conf \ + --symlink /etc/ld.so.cache ${glibc}/etc/ld.so.cache \ + --ro-bind ${glibc}/etc/rpc ${glibc}/etc/rpc \ + --remount-ro ${glibc}/etc \ + '' + optionalString fhsenv.isMultiBuild (indentLines '' + --tmpfs ${pkgsi686Linux.glibc}/etc \ + --symlink /etc/ld.so.conf ${pkgsi686Linux.glibc}/etc/ld.so.conf \ + --symlink /etc/ld.so.cache ${pkgsi686Linux.glibc}/etc/ld.so.cache \ + --ro-bind ${pkgsi686Linux.glibc}/etc/rpc ${pkgsi686Linux.glibc}/etc/rpc \ + --remount-ro ${pkgsi686Linux.glibc}/etc \ + '') + '' + "''${ro_mounts[@]}" + "''${symlinks[@]}" + "''${auto_mounts[@]}" + "''${x11_args[@]}" + ${concatStringsSep "\n " extraBwrapArgs} + ${init runScript} ${initArgs} + ) + exec "''${cmd[@]}" + ''; + + bin = writeShellScript "${name}-bwrap" (bwrapCmd { initArgs = ''"$@"''; }); +in runCommandLocal name (nameAttrs // { + inherit meta; + + passthru = passthru // { + env = runCommandLocal "${name}-shell-env" { + shellHook = bwrapCmd {}; + } '' + echo >&2 "" + echo >&2 "*** User chroot 'env' attributes are intended for interactive nix-shell sessions, not for building! ***" + echo >&2 "" + exit 1 + ''; + inherit args fhsenv; + }; +}) '' + mkdir -p $out/bin + ln -s ${bin} $out/bin/${executableName} + + ${extraInstallCommands} +'' diff --git a/pkgs/build-support/build-fhsenv-chroot/chrootenv/default.nix b/pkgs/build-support/build-fhsenv-chroot/chrootenv/default.nix new file mode 100644 index 0000000..32ac43d --- /dev/null +++ b/pkgs/build-support/build-fhsenv-chroot/chrootenv/default.nix @@ -0,0 +1,16 @@ +{ lib, stdenv, meson, ninja, pkg-config, glib }: + +stdenv.mkDerivation { + name = "chrootenv"; + src = ./src; + + nativeBuildInputs = [ meson ninja pkg-config ]; + buildInputs = [ glib ]; + + meta = with lib; { + description = "Setup mount/user namespace for FHS emulation"; + license = licenses.mit; + maintainers = with maintainers; [ yana ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/chrootenv.c b/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/chrootenv.c new file mode 100644 index 0000000..c109d72 --- /dev/null +++ b/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/chrootenv.c @@ -0,0 +1,169 @@ +#define _GNU_SOURCE + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define fail(s, err) g_error("%s: %s: %s", __func__, s, g_strerror(err)) +#define fail_if(expr) \ + if (expr) \ + fail(#expr, errno); + +const gchar *bind_blacklist[] = {"bin", "etc", "host", "real-host", "usr", "lib", "lib64", "lib32", "sbin", "opt", NULL}; + +int pivot_root(const char *new_root, const char *put_old) { + return syscall(SYS_pivot_root, new_root, put_old); +} + +void mount_tmpfs(const gchar *target) { + fail_if(mount("none", target, "tmpfs", 0, NULL)); +} + +void bind_mount(const gchar *source, const gchar *target) { + fail_if(g_mkdir(target, 0755)); + fail_if(mount(source, target, NULL, MS_BIND | MS_REC, NULL)); +} + +const gchar *create_tmpdir() { + gchar *prefix = + g_build_filename(g_get_tmp_dir(), "chrootenvXXXXXX", NULL); + fail_if(!g_mkdtemp_full(prefix, 0755)); + return prefix; +} + +void pivot_host(const gchar *guest) { + g_autofree gchar *point = g_build_filename(guest, "host", NULL); + fail_if(g_mkdir(point, 0755)); + fail_if(pivot_root(guest, point)); +} + +void bind_mount_item(const gchar *host, const gchar *guest, const gchar *name) { + g_autofree gchar *source = g_build_filename(host, name, NULL); + g_autofree gchar *target = g_build_filename(guest, name, NULL); + + if (G_LIKELY(g_file_test(source, G_FILE_TEST_IS_DIR))) + bind_mount(source, target); +} + +void bind(const gchar *host, const gchar *guest) { + mount_tmpfs(guest); + + pivot_host(guest); + + g_autofree gchar *host_dir = g_build_filename("/host", host, NULL); + + g_autoptr(GError) err = NULL; + g_autoptr(GDir) dir = g_dir_open(host_dir, 0, &err); + + if (err != NULL) + fail("g_dir_open", errno); + + const gchar *item; + + while ((item = g_dir_read_name(dir))) + if (!g_strv_contains(bind_blacklist, item)) + bind_mount_item(host_dir, "/", item); +} + +void spit(const char *path, char *fmt, ...) { + va_list args; + va_start(args, fmt); + + FILE *f = g_fopen(path, "w"); + + if (f == NULL) + fail("g_fopen", errno); + + g_vfprintf(f, fmt, args); + fclose(f); +} + +int main(gint argc, gchar **argv) { + const gchar *self = *argv++; + + if (argc < 2) { + g_message("%s command [arguments...]", self); + return 1; + } + + g_autofree const gchar *prefix = create_tmpdir(); + + pid_t cpid = fork(); + + if (cpid < 0) + fail("fork", errno); + + else if (cpid == 0) { + uid_t uid = getuid(); + gid_t gid = getgid(); + + int namespaces = CLONE_NEWNS; + if (uid != 0) { + namespaces |= CLONE_NEWUSER; + } + if (unshare(namespaces) < 0) { + int unshare_errno = errno; + + g_message("Requires Linux version >= 3.19 built with CONFIG_USER_NS"); + if (g_file_test("/proc/sys/kernel/unprivileged_userns_clone", + G_FILE_TEST_EXISTS)) + g_message("Run: sudo sysctl -w kernel.unprivileged_userns_clone=1"); + + fail("unshare", unshare_errno); + } + + // hide all mounts we do from the parent + fail_if(mount(0, "/", 0, MS_SLAVE | MS_REC, 0)); + + if (uid != 0) { + spit("/proc/self/setgroups", "deny"); + spit("/proc/self/uid_map", "%d %d 1", uid, uid); + spit("/proc/self/gid_map", "%d %d 1", gid, gid); + } + + // If there is a /host directory, assume this is nested chrootenv and use it as host instead. + gboolean nested_host = g_file_test("/host", G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR); + g_autofree const gchar *host = nested_host ? "/host" : "/"; + + bind(host, prefix); + + // Replace /host by an actual (inner) /host. + if (nested_host) { + fail_if(g_mkdir("/real-host", 0755)); + fail_if(mount("/host/host", "/real-host", NULL, MS_BIND | MS_REC, NULL)); + // For some reason umount("/host") returns EBUSY even immediately after + // pivot_root. We detach it at least to keep `/proc/mounts` from blowing + // up in nested cases. + fail_if(umount2("/host", MNT_DETACH)); + fail_if(mount("/real-host", "/host", NULL, MS_MOVE, NULL)); + fail_if(rmdir("/real-host")); + } + + fail_if(chdir("/")); + fail_if(execvp(*argv, argv)); + } + + else { + int status; + + fail_if(waitpid(cpid, &status, 0) != cpid); + fail_if(rmdir(prefix)); + + if (WIFEXITED(status)) + return WEXITSTATUS(status); + + else if (WIFSIGNALED(status)) + kill(getpid(), WTERMSIG(status)); + + return 1; + } +} diff --git a/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/meson.build b/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/meson.build new file mode 100644 index 0000000..6d0770a --- /dev/null +++ b/pkgs/build-support/build-fhsenv-chroot/chrootenv/src/meson.build @@ -0,0 +1,5 @@ +project('chrootenv', 'c') + +glib = dependency('glib-2.0') + +executable('chrootenv', 'chrootenv.c', dependencies: [glib], install: true) diff --git a/pkgs/build-support/build-fhsenv-chroot/default.nix b/pkgs/build-support/build-fhsenv-chroot/default.nix new file mode 100644 index 0000000..6f0adfb --- /dev/null +++ b/pkgs/build-support/build-fhsenv-chroot/default.nix @@ -0,0 +1,53 @@ +{ lib, callPackage, runCommandLocal, writeScript, stdenv, coreutils }: + +let buildFHSEnv = callPackage ./env.nix { }; in + +args@{ name, version ? null, runScript ? "bash", extraInstallCommands ? "", meta ? {}, passthru ? {}, ... }: + +let + env = buildFHSEnv (removeAttrs args [ "version" "runScript" "extraInstallCommands" "meta" "passthru" ]); + + chrootenv = callPackage ./chrootenv {}; + + init = run: writeScript "${name}-init" '' + #! ${stdenv.shell} + for i in ${env}/* /host/*; do + path="/''${i##*/}" + [ -e "$path" ] || ${coreutils}/bin/ln -s "$i" "$path" + done + + [ -d "$1" ] && [ -r "$1" ] && cd "$1" + shift + + source /etc/profile + exec ${run} "$@" + ''; + + versionStr = lib.optionalString (version != null) ("-" + version); + + nameAndVersion = name + versionStr; + +in runCommandLocal nameAndVersion { + inherit meta; + + passthru = passthru // { + env = runCommandLocal "${name}-shell-env" { + shellHook = '' + exec ${chrootenv}/bin/chrootenv ${init runScript} "$(pwd)" + ''; + } '' + echo >&2 "" + echo >&2 "*** User chroot 'env' attributes are intended for interactive nix-shell sessions, not for building! ***" + echo >&2 "" + exit 1 + ''; + }; +} '' + mkdir -p $out/bin + cat <$out/bin/${name} + #! ${stdenv.shell} + exec ${chrootenv}/bin/chrootenv ${init runScript} "\$(pwd)" "\$@" + EOF + chmod +x $out/bin/${name} + ${extraInstallCommands} +'' diff --git a/pkgs/build-support/build-fhsenv-chroot/env.nix b/pkgs/build-support/build-fhsenv-chroot/env.nix new file mode 100644 index 0000000..6a82435 --- /dev/null +++ b/pkgs/build-support/build-fhsenv-chroot/env.nix @@ -0,0 +1,259 @@ +{ stdenv, lib, buildEnv, writeText, pkgs, pkgsi686Linux }: + +{ name +, profile ? "" +, targetPkgs ? pkgs: [] +, multiPkgs ? pkgs: [] +, extraBuildCommands ? "" +, extraBuildCommandsMulti ? "" +, extraOutputsToInstall ? [] +}: + +# HOWTO: +# All packages (most likely programs) returned from targetPkgs will only be +# installed once--matching the host's architecture (64bit on x86_64 and 32bit on +# x86). +# +# Packages (most likely libraries) returned from multiPkgs are installed +# once on x86 systems and twice on x86_64 systems. +# On x86 they are merged with packages from targetPkgs. +# On x86_64 they are added to targetPkgs and in addition their 32bit +# versions are also installed. The final directory structure looks as +# follows: +# /lib32 will include 32bit libraries from multiPkgs +# /lib64 will include 64bit libraries from multiPkgs and targetPkgs +# /lib will link to /lib32 + +let + is64Bit = stdenv.hostPlatform.parsed.cpu.bits == 64; + # multi-lib glibc is only supported on x86_64 + isMultiBuild = multiPkgs != null && stdenv.hostPlatform.system == "x86_64-linux"; + isTargetBuild = !isMultiBuild; + + # list of packages (usually programs) which are only be installed for the + # host's architecture + targetPaths = targetPkgs pkgs ++ (if multiPkgs == null then [] else multiPkgs pkgs); + + # list of packages which are installed for both x86 and x86_64 on x86_64 + # systems + multiPaths = multiPkgs pkgsi686Linux; + + # base packages of the chroot + # these match the host's architecture, glibc_multi is used for multilib + # builds. glibcLocales must be before glibc or glibc_multi as otherwiese + # the wrong LOCALE_ARCHIVE will be used where only C.UTF-8 is available. + basePkgs = with pkgs; + [ glibcLocales + (if isMultiBuild then glibc_multi else glibc) + (toString gcc.cc.lib) bashInteractiveFHS coreutils less shadow su + gawk diffutils findutils gnused gnugrep + gnutar gzip bzip2 xz + ]; + baseMultiPkgs = with pkgsi686Linux; + [ (toString gcc.cc.lib) + ]; + + etcProfile = writeText "profile" '' + export PS1='${name}-chrootenv:\u@\h:\w\$ ' + export LOCALE_ARCHIVE='/usr/lib/locale/locale-archive' + export LD_LIBRARY_PATH="/run/opengl-driver/lib:/run/opengl-driver-32/lib:/usr/lib:/usr/lib32''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" + export PATH="/run/wrappers/bin:/usr/bin:/usr/sbin:$PATH" + export TZDIR='/etc/zoneinfo' + + # XDG_DATA_DIRS is used by pressure-vessel (steam proton) and vulkan loaders to find the corresponding icd + export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/run/opengl-driver/share:/run/opengl-driver-32/share + + # Following XDG spec [1], XDG_DATA_DIRS should default to "/usr/local/share:/usr/share". + # In nix, it is commonly set without containing these values, so we add them as fallback. + # + # [1] + case ":$XDG_DATA_DIRS:" in + *:/usr/local/share:*) ;; + *) export XDG_DATA_DIRS="$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/usr/local/share" ;; + esac + case ":$XDG_DATA_DIRS:" in + *:/usr/share:*) ;; + *) export XDG_DATA_DIRS="$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}/usr/share" ;; + esac + + # Force compilers and other tools to look in default search paths + unset NIX_ENFORCE_PURITY + export NIX_BINTOOLS_WRAPPER_TARGET_HOST_${stdenv.cc.suffixSalt}=1 + export NIX_CC_WRAPPER_TARGET_HOST_${stdenv.cc.suffixSalt}=1 + export NIX_CFLAGS_COMPILE='-idirafter /usr/include' + export NIX_CFLAGS_LINK='-L/usr/lib -L/usr/lib32' + export NIX_LDFLAGS='-L/usr/lib -L/usr/lib32' + export PKG_CONFIG_PATH=/usr/lib/pkgconfig + export ACLOCAL_PATH=/usr/share/aclocal + + ${profile} + ''; + + # Compose /etc for the chroot environment + etcPkg = stdenv.mkDerivation { + name = "${name}-chrootenv-etc"; + buildCommand = '' + mkdir -p $out/etc + cd $out/etc + + # environment variables + ln -s ${etcProfile} profile + + # compatibility with NixOS + ln -s /host/etc/static static + + # symlink nix config + ln -s /host/etc/nix nix + + # symlink some NSS stuff + ln -s /host/etc/passwd passwd + ln -s /host/etc/group group + ln -s /host/etc/shadow shadow + ln -s /host/etc/hosts hosts + ln -s /host/etc/resolv.conf resolv.conf + ln -s /host/etc/nsswitch.conf nsswitch.conf + + # symlink user profiles + ln -s /host/etc/profiles profiles + + # symlink sudo and su stuff + ln -s /host/etc/login.defs login.defs + ln -s /host/etc/sudoers sudoers + ln -s /host/etc/sudoers.d sudoers.d + + # symlink other core stuff + ln -s /host/etc/localtime localtime + ln -s /host/etc/zoneinfo zoneinfo + ln -s /host/etc/machine-id machine-id + ln -s /host/etc/os-release os-release + + # symlink PAM stuff + ln -s /host/etc/pam.d pam.d + + # symlink fonts stuff + ln -s /host/etc/fonts fonts + + # symlink ALSA stuff + ln -s /host/etc/asound.conf asound.conf + ln -s /host/etc/alsa alsa + + # symlink SSL certs + mkdir -p ssl + ln -s /host/etc/ssl/certs ssl/certs + + # symlink /etc/mtab -> /proc/mounts (compat for old userspace progs) + ln -s /proc/mounts mtab + ''; + }; + + # Composes a /usr-like directory structure + staticUsrProfileTarget = buildEnv { + name = "${name}-usr-target"; + paths = [ etcPkg ] ++ basePkgs ++ targetPaths; + extraOutputsToInstall = [ "out" "lib" "bin" ] ++ extraOutputsToInstall; + ignoreCollisions = true; + postBuild = '' + if [[ -d $out/share/gsettings-schemas/ ]]; then + # Recreate the standard schemas directory if its a symlink to make it writable + if [[ -L $out/share/glib-2.0 ]]; then + target=$(readlink $out/share/glib-2.0) + rm $out/share/glib-2.0 + mkdir $out/share/glib-2.0 + ln -fs $target/* $out/share/glib-2.0 + fi + + if [[ -L $out/share/glib-2.0/schemas ]]; then + target=$(readlink $out/share/glib-2.0/schemas) + rm $out/share/glib-2.0/schemas + mkdir $out/share/glib-2.0/schemas + ln -fs $target/* $out/share/glib-2.0/schemas + fi + + mkdir -p $out/share/glib-2.0/schemas + + for d in $out/share/gsettings-schemas/*; do + # Force symlink, in case there are duplicates + ln -fs $d/glib-2.0/schemas/*.xml $out/share/glib-2.0/schemas + ln -fs $d/glib-2.0/schemas/*.gschema.override $out/share/glib-2.0/schemas + done + + # and compile them + ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas + fi + ''; + }; + + staticUsrProfileMulti = buildEnv { + name = "${name}-usr-multi"; + paths = baseMultiPkgs ++ multiPaths; + extraOutputsToInstall = [ "out" "lib" ] ++ extraOutputsToInstall; + ignoreCollisions = true; + }; + + # setup library paths only for the targeted architecture + setupLibDirs_target = '' + # link content of targetPaths + cp -rsHf ${staticUsrProfileTarget}/lib lib + ln -s lib lib${if is64Bit then "64" else "32"} + ''; + + # setup /lib, /lib32 and /lib64 + setupLibDirs_multi = '' + mkdir -m0755 lib32 + mkdir -m0755 lib64 + ln -s lib64 lib + + # copy glibc stuff + cp -rsHf ${staticUsrProfileTarget}/lib/32/* lib32/ && chmod u+w -R lib32/ + + # copy content of multiPaths (32bit libs) + [ -d ${staticUsrProfileMulti}/lib ] && cp -rsHf ${staticUsrProfileMulti}/lib/* lib32/ && chmod u+w -R lib32/ + + # copy content of targetPaths (64bit libs) + cp -rsHf ${staticUsrProfileTarget}/lib/* lib64/ && chmod u+w -R lib64/ + + # symlink 32-bit ld-linux.so + ln -Ls ${staticUsrProfileTarget}/lib/32/ld-linux.so.2 lib/ + ''; + + setupLibDirs = if isTargetBuild then setupLibDirs_target + else setupLibDirs_multi; + + # the target profile is the actual profile that will be used for the chroot + setupTargetProfile = '' + mkdir -m0755 usr + cd usr + ${setupLibDirs} + for i in bin sbin share include; do + if [ -d "${staticUsrProfileTarget}/$i" ]; then + cp -rsHf "${staticUsrProfileTarget}/$i" "$i" + fi + done + cd .. + + for i in var etc opt; do + if [ -d "${staticUsrProfileTarget}/$i" ]; then + cp -rsHf "${staticUsrProfileTarget}/$i" "$i" + fi + done + for i in usr/{bin,sbin,lib,lib32,lib64}; do + if [ -d "$i" ]; then + ln -s "$i" + fi + done + ''; + +in stdenv.mkDerivation { + name = "${name}-fhs"; + buildCommand = '' + mkdir -p $out + cd $out + ${setupTargetProfile} + cd $out + ${extraBuildCommands} + cd $out + ${lib.optionalString isMultiBuild extraBuildCommandsMulti} + ''; + preferLocalBuild = true; + allowSubstitutes = false; +} diff --git a/pkgs/build-support/build-graalvm-native-image/default.nix b/pkgs/build-support/build-graalvm-native-image/default.nix new file mode 100644 index 0000000..f0e7390 --- /dev/null +++ b/pkgs/build-support/build-graalvm-native-image/default.nix @@ -0,0 +1,84 @@ +{ lib +, stdenv +, glibcLocales + # The GraalVM derivation to use +, graalvmDrv +, removeReferencesTo +, executable ? args.pname + # JAR used as input for GraalVM derivation, defaults to src +, jar ? args.src +, dontUnpack ? (jar == args.src) + # Default native-image arguments. You probably don't want to set this, + # except in special cases. In most cases, use extraNativeBuildArgs instead +, nativeImageBuildArgs ? [ + (lib.optionalString stdenv.isDarwin "-H:-CheckToolchain") + (lib.optionalString (stdenv.isLinux && stdenv.isAarch64) "-H:PageSize=64K") + "-H:Name=${executable}" + "-march=compatibility" + "--verbose" + ] + # Extra arguments to be passed to the native-image +, extraNativeImageBuildArgs ? [ ] + # XMX size of GraalVM during build +, graalvmXmx ? "-J-Xmx6g" +, meta ? { } +, LC_ALL ? "en_US.UTF-8" +, ... +} @ args: + +let + extraArgs = builtins.removeAttrs args [ + "lib" + "stdenv" + "glibcLocales" + "jar" + "dontUnpack" + "LC_ALL" + "meta" + "buildPhase" + "nativeBuildInputs" + "installPhase" + "postInstall" + ]; +in +stdenv.mkDerivation ({ + inherit dontUnpack jar; + + env = { inherit LC_ALL; }; + + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ graalvmDrv glibcLocales removeReferencesTo ]; + + nativeImageBuildArgs = nativeImageBuildArgs ++ extraNativeImageBuildArgs ++ [ graalvmXmx ]; + + buildPhase = args.buildPhase or '' + runHook preBuild + + native-image -jar "$jar" $(export -p | sed -n 's/^declare -x \([^=]\+\)=.*$/ -E\1/p' | tr -d \\n) ''${nativeImageBuildArgs[@]} + + runHook postBuild + ''; + + installPhase = args.installPhase or '' + runHook preInstall + + install -Dm755 ${executable} -t $out/bin + + runHook postInstall + ''; + + postInstall = '' + remove-references-to -t ${graalvmDrv} $out/bin/${executable} + ${args.postInstall or ""} + ''; + + disallowedReferences = [ graalvmDrv ]; + + passthru = { inherit graalvmDrv; }; + + meta = { + # default to graalvm's platforms + platforms = graalvmDrv.meta.platforms; + # default to executable name + mainProgram = executable; + } // meta; +} // extraArgs) diff --git a/pkgs/build-support/build-maven.nix b/pkgs/build-support/build-maven.nix new file mode 100644 index 0000000..7ac8afd --- /dev/null +++ b/pkgs/build-support/build-maven.nix @@ -0,0 +1,88 @@ +{ stdenv, maven, runCommand, writeText, fetchurl, lib, requireFile, linkFarm }: +# Takes an info file generated by mvn2nix +# (https://github.com/NixOS/mvn2nix-maven-plugin) and builds the maven +# project with it. +# +# repo: A local maven repository with the project's dependencies. +# +# settings: A settings.xml to pass to maven to use the repo. +# +# build: A simple build derivation that uses mvn compile and package to build +# the project. +# +# @example +# project = pkgs.buildMaven ./project-info.json +infoFile: +let + info = lib.importJSON infoFile; + + dependencies = lib.flatten (map (dep: + let + inherit (dep) sha1 groupId artifactId version metadata repository-id; + versionDir = dep.unresolved-version or version; + authenticated = dep.authenticated or false; + url = dep.url or ""; + + fetch = if (url != "") then + ((if authenticated then requireFile else fetchurl) { + inherit url sha1; + }) + else + ""; + + fetchMetadata = (if authenticated then requireFile else fetchurl) { + inherit (metadata) url sha1; + }; + + layout = "${ + builtins.replaceStrings [ "." ] [ "/" ] groupId + }/${artifactId}/${versionDir}"; + in lib.optional (url != "") { + layout = "${layout}/${fetch.name}"; + drv = fetch; + } ++ lib.optionals (dep ? metadata) ([{ + layout = "${layout}/maven-metadata-${repository-id}.xml"; + drv = fetchMetadata; + }] ++ lib.optional (fetch != "") { + layout = "${layout}/${ + builtins.replaceStrings [ version ] [ dep.unresolved-version ] + fetch.name + }"; + drv = fetch; + })) info.dependencies); + + repo = linkFarm "maven-repository" (lib.forEach dependencies (dependency: { + name = dependency.layout; + path = dependency.drv; + })); + + settings = writeText "settings.xml" '' + + ${repo} + + ''; + + src = dirOf infoFile; +in { + inherit repo settings info; + + build = stdenv.mkDerivation { + name = "${info.project.artifactId}-${info.project.version}.jar"; + + src = builtins.filterSource (path: type: + (toString path) != (toString (src + "/target")) && (toString path) + != (toString (src + "/.git"))) src; + + buildInputs = [ maven ]; + + buildPhase = "mvn --offline --settings ${settings} compile"; + + installPhase = '' + mvn --offline --settings ${settings} package + mv target/*.jar $out + ''; + }; +} diff --git a/pkgs/build-support/buildenv/builder.pl b/pkgs/build-support/buildenv/builder.pl new file mode 100755 index 0000000..975e76d --- /dev/null +++ b/pkgs/build-support/buildenv/builder.pl @@ -0,0 +1,283 @@ +#! @perl@ -w + +use strict; +use Cwd 'abs_path'; +use IO::Handle; +use File::Path; +use File::Basename; +use File::Compare; +use JSON::PP; + +STDOUT->autoflush(1); + +$SIG{__WARN__} = sub { warn "warning: ", @_ }; +$SIG{__DIE__} = sub { die "error: ", @_ }; + +my $out = $ENV{"out"}; +my $extraPrefix = $ENV{"extraPrefix"}; + +my @pathsToLink = split ' ', $ENV{"pathsToLink"}; + +sub isInPathsToLink { + my $path = shift; + $path = "/" if $path eq ""; + foreach my $elem (@pathsToLink) { + return 1 if + $elem eq "/" || + (substr($path, 0, length($elem)) eq $elem + && (($path eq $elem) || (substr($path, length($elem), 1) eq "/"))); + } + return 0; +} + +# Returns whether a path in one of the linked packages may contain +# files in one of the elements of pathsToLink. +sub hasPathsToLink { + my $path = shift; + foreach my $elem (@pathsToLink) { + return 1 if + $path eq "" || + (substr($elem, 0, length($path)) eq $path + && (($path eq $elem) || (substr($elem, length($path), 1) eq "/"))); + } + return 0; +} + +# Similar to `lib.isStorePath` +sub isStorePath { + my $path = shift; + my $storePath = "@storeDir@"; + + return substr($path, 0, 1) eq "/" && dirname($path) eq $storePath; +} + +# For each activated package, determine what symlinks to create. + +my %symlinks; + +# Add all pathsToLink and all parent directories. +# +# For "/a/b/c" that will include +# [ "", "/a", "/a/b", "/a/b/c" ] +# +# That ensures the whole directory tree needed by pathsToLink is +# created as directories and not symlinks. +$symlinks{""} = ["", 0]; +for my $p (@pathsToLink) { + my @parts = split '/', $p; + + my $cur = ""; + for my $x (@parts) { + $cur = $cur . "/$x"; + $cur = "" if $cur eq "/"; + $symlinks{$cur} = ["", 0]; + } +} + +sub findFiles; + +sub findFilesInDir { + my ($relName, $target, $ignoreCollisions, $checkCollisionContents, $priority) = @_; + + opendir DIR, "$target" or die "cannot open `$target': $!"; + my @names = readdir DIR or die; + closedir DIR; + + foreach my $name (@names) { + next if $name eq "." || $name eq ".."; + findFiles("$relName/$name", "$target/$name", $name, $ignoreCollisions, $checkCollisionContents, $priority); + } +} + +sub checkCollision { + my ($path1, $path2) = @_; + + if (! -e $path1 || ! -e $path2) { + return 0; + } + + my $stat1 = (stat($path1))[2]; + my $stat2 = (stat($path2))[2]; + + if ($stat1 != $stat2) { + warn "different permissions in `$path1' and `$path2': " + . sprintf("%04o", $stat1 & 07777) . " <-> " + . sprintf("%04o", $stat2 & 07777); + return 0; + } + + return compare($path1, $path2) == 0; +} + +sub prependDangling { + my $path = shift; + return (-l $path && ! -e $path ? "dangling symlink " : "") . "`$path'"; +} + +sub findFiles { + my ($relName, $target, $baseName, $ignoreCollisions, $checkCollisionContents, $priority) = @_; + + # The store path must not be a file + if (-f $target && isStorePath $target) { + die "The store path $target is a file and can't be merged into an environment using pkgs.buildEnv!"; + } + + # Urgh, hacky... + return if + $relName eq "/propagated-build-inputs" || + $relName eq "/nix-support" || + $relName =~ /info\/dir$/ || + ( $relName =~ /^\/share\/mime\// && !( $relName =~ /^\/share\/mime\/packages/ ) ) || + $baseName eq "perllocal.pod" || + $baseName eq "log" || + ! (hasPathsToLink($relName) || isInPathsToLink($relName)); + + my ($oldTarget, $oldPriority) = @{$symlinks{$relName} // [undef, undef]}; + + # If target doesn't exist, create it. If it already exists as a + # symlink to a file (not a directory) in a lower-priority package, + # overwrite it. + if (!defined $oldTarget || ($priority < $oldPriority && ($oldTarget ne "" && ! -d $oldTarget))) { + # If target is a dangling symlink, emit a warning. + if (-l $target && ! -e $target) { + my $link = readlink $target; + warn "creating dangling symlink `$out$extraPrefix/$relName' -> `$target' -> `$link'\n"; + } + $symlinks{$relName} = [$target, $priority]; + return; + } + + # If target already exists and both targets resolves to the same path, skip + if ( + defined $oldTarget && $oldTarget ne "" && + defined abs_path($target) && defined abs_path($oldTarget) && + abs_path($target) eq abs_path($oldTarget) + ) { + # Prefer the target that is not a symlink, if any + if (-l $oldTarget && ! -l $target) { + $symlinks{$relName} = [$target, $priority]; + } + return; + } + + # If target already exists as a symlink to a file (not a + # directory) in a higher-priority package, skip. + if (defined $oldTarget && $priority > $oldPriority && $oldTarget ne "" && ! -d $oldTarget) { + return; + } + + # If target is supposed to be a directory but it isn't, die with an error message + # instead of attempting to recurse into it, only to fail then. + # This happens e.g. when pathsToLink contains a non-directory path. + if ($oldTarget eq "" && ! -d $target) { + die "not a directory: `$target'\n"; + } + + unless (-d $target && ($oldTarget eq "" || -d $oldTarget)) { + # Prepend "dangling symlink" to paths if applicable. + my $targetRef = prependDangling($target); + my $oldTargetRef = prependDangling($oldTarget); + + if ($ignoreCollisions) { + warn "collision between $targetRef and $oldTargetRef\n" if $ignoreCollisions == 1; + return; + } elsif ($checkCollisionContents && checkCollision($oldTarget, $target)) { + return; + } else { + die "collision between $targetRef and $oldTargetRef\n"; + } + } + + findFilesInDir($relName, $oldTarget, $ignoreCollisions, $checkCollisionContents, $oldPriority) unless $oldTarget eq ""; + findFilesInDir($relName, $target, $ignoreCollisions, $checkCollisionContents, $priority); + + $symlinks{$relName} = ["", $priority]; # denotes directory +} + + +my %done; +my %postponed; + +sub addPkg { + my ($pkgDir, $ignoreCollisions, $checkCollisionContents, $priority) = @_; + + return if (defined $done{$pkgDir}); + $done{$pkgDir} = 1; + + findFiles("", $pkgDir, "", $ignoreCollisions, $checkCollisionContents, $priority); + + my $propagatedFN = "$pkgDir/nix-support/propagated-user-env-packages"; + if (-e $propagatedFN) { + open PROP, "<$propagatedFN" or die; + my $propagated = ; + close PROP; + my @propagated = split ' ', $propagated; + foreach my $p (@propagated) { + $postponed{$p} = 1 unless defined $done{$p}; + } + } +} + +# Read packages list. +my $pkgs; + +if (exists $ENV{"pkgsPath"}) { + open FILE, $ENV{"pkgsPath"}; + $pkgs = ; + close FILE; +} else { + $pkgs = $ENV{"pkgs"} +} + +# Symlink to the packages that have been installed explicitly by the +# user. +for my $pkg (@{decode_json $pkgs}) { + for my $path (@{$pkg->{paths}}) { + addPkg($path, + $ENV{"ignoreCollisions"} eq "1", + $ENV{"checkCollisionContents"} eq "1", + $pkg->{priority}) + if -e $path; + } +} + + +# Symlink to the packages that have been "propagated" by packages +# installed by the user (i.e., package X declares that it wants Y +# installed as well). We do these later because they have a lower +# priority in case of collisions. +my $priorityCounter = 1000; # don't care about collisions +while (scalar(keys %postponed) > 0) { + my @pkgDirs = keys %postponed; + %postponed = (); + foreach my $pkgDir (sort @pkgDirs) { + addPkg($pkgDir, 2, $ENV{"checkCollisionContents"} eq "1", $priorityCounter++); + } +} + + +# Create the symlinks. +my $nrLinks = 0; +foreach my $relName (sort keys %symlinks) { + my ($target, $priority) = @{$symlinks{$relName}}; + my $abs = "$out" . "$extraPrefix" . "/$relName"; + next unless isInPathsToLink $relName; + if ($target eq "") { + #print "creating directory $relName\n"; + mkpath $abs or die "cannot create directory `$abs': $!"; + } else { + #print "creating symlink $relName to $target\n"; + symlink $target, $abs || + die "error creating link `$abs': $!"; + $nrLinks++; + } +} + + +print STDERR "created $nrLinks symlinks in user environment\n"; + + +my $manifest = $ENV{"manifest"}; +if ($manifest) { + symlink($manifest, "$out/manifest") or die "cannot create manifest"; +} diff --git a/pkgs/build-support/buildenv/default.nix b/pkgs/build-support/buildenv/default.nix new file mode 100644 index 0000000..560f59b --- /dev/null +++ b/pkgs/build-support/buildenv/default.nix @@ -0,0 +1,81 @@ +# buildEnv creates a tree of symlinks to the specified paths. This is +# a fork of the hardcoded buildEnv in the Nix distribution. + +{ buildPackages, runCommand, lib, substituteAll }: + +let + builder = substituteAll { + src = ./builder.pl; + inherit (builtins) storeDir; + }; +in + +lib.makeOverridable +({ name + +, # The manifest file (if any). A symlink $out/manifest will be + # created to it. + manifest ? "" + +, # The paths to symlink. + paths + +, # Whether to ignore collisions or abort. + ignoreCollisions ? false + +, # If there is a collision, check whether the contents and permissions match + # and only if not, throw a collision error. + checkCollisionContents ? true + +, # The paths (relative to each element of `paths') that we want to + # symlink (e.g., ["/bin"]). Any file not inside any of the + # directories in the list is not symlinked. + pathsToLink ? ["/"] + +, # The package outputs to include. By default, only the default + # output is included. + extraOutputsToInstall ? [] + +, # Root the result in directory "$out${extraPrefix}", e.g. "/share". + extraPrefix ? "" + +, # Shell commands to run after building the symlink tree. + postBuild ? "" + +# Additional inputs +, nativeBuildInputs ? [] # Handy e.g. if using makeWrapper in `postBuild`. +, buildInputs ? [] + +, passthru ? {} +, meta ? {} +}: + +runCommand name + rec { + inherit manifest ignoreCollisions checkCollisionContents passthru + meta pathsToLink extraPrefix postBuild + nativeBuildInputs buildInputs; + pkgs = builtins.toJSON (map (drv: { + paths = + # First add the usual output(s): respect if user has chosen explicitly, + # and otherwise use `meta.outputsToInstall`. The attribute is guaranteed + # to exist in mkDerivation-created cases. The other cases (e.g. runCommand) + # aren't expected to have multiple outputs. + (if (! drv ? outputSpecified || ! drv.outputSpecified) + && drv.meta.outputsToInstall or null != null + then map (outName: drv.${outName}) drv.meta.outputsToInstall + else [ drv ]) + # Add any extra outputs specified by the caller of `buildEnv`. + ++ lib.filter (p: p!=null) + (builtins.map (outName: drv.${outName} or null) extraOutputsToInstall); + priority = drv.meta.priority or 5; + }) paths); + preferLocalBuild = true; + allowSubstitutes = false; + # XXX: The size is somewhat arbitrary + passAsFile = if builtins.stringLength pkgs >= 128*1024 then [ "pkgs" ] else [ ]; + } + '' + ${buildPackages.perl}/bin/perl -w ${builder} + eval "$postBuild" + '') diff --git a/pkgs/build-support/cc-wrapper/add-clang-cc-cflags-before.sh b/pkgs/build-support/cc-wrapper/add-clang-cc-cflags-before.sh new file mode 100644 index 0000000..a1d06b9 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/add-clang-cc-cflags-before.sh @@ -0,0 +1,11 @@ +needsTarget=true + +for p in "${params[@]}"; do + case "$p" in + -target | --target=*) needsTarget=false ;; + esac +done + +if $needsTarget; then + extraBefore+=(-target @defaultTarget@ @march@) +fi diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh new file mode 100644 index 0000000..c59118d --- /dev/null +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -0,0 +1,87 @@ +# N.B. It may be a surprise that the derivation-specific variables are exported, +# since this is just sourced by the wrapped binaries---the end consumers. This +# is because one wrapper binary may invoke another (e.g. cc invoking ld). In +# that case, it is cheaper/better to not repeat this step and let the forked +# wrapped binary just inherit the work of the forker's wrapper script. + +var_templates_list=( + NIX_CFLAGS_COMPILE + NIX_CFLAGS_COMPILE_BEFORE + NIX_CFLAGS_LINK + NIX_CXXSTDLIB_COMPILE + NIX_CXXSTDLIB_LINK + NIX_GNATFLAGS_COMPILE +) +var_templates_bool=( + NIX_ENFORCE_NO_NATIVE +) + +accumulateRoles + +# We need to mangle names for hygiene, but also take parameters/overrides +# from the environment. +for var in "${var_templates_list[@]}"; do + mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done + +# `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld. +NIX_CFLAGS_COMPILE_@suffixSalt@="-B@out@/bin/ $NIX_CFLAGS_COMPILE_@suffixSalt@" + +# Export and assign separately in order that a failing $(..) will fail +# the script. + +# Currently bootstrap-tools does not split glibc, and gcc files into +# separate directories. As a workaround we want resulting cflags to be +# ordered as: crt1-cflags libc-cflags cc-cflags. Otherwise we mix crt/libc.so +# from different libc as seen in +# https://github.com/NixOS/nixpkgs/issues/158042 +# +# Note that below has reverse ordering as we prepend flags one-by-one. +# Once bootstrap-tools is split into different directories we can stop +# relying on flag ordering below. + +if [ -e @out@/nix-support/cc-cflags ]; then + NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/cc-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@" +fi + +if [[ "$cInclude" = 1 ]] && [ -e @out@/nix-support/libc-cflags ]; then + NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/libc-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@" +fi + +if [ -e @out@/nix-support/libc-crt1-cflags ]; then + NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/libc-crt1-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@" +fi + +if [ -e @out@/nix-support/libcxx-cxxflags ]; then + NIX_CXXSTDLIB_COMPILE_@suffixSalt@+=" $(< @out@/nix-support/libcxx-cxxflags)" +fi + +if [ -e @out@/nix-support/libcxx-ldflags ]; then + NIX_CXXSTDLIB_LINK_@suffixSalt@+=" $(< @out@/nix-support/libcxx-ldflags)" +fi + +if [ -e @out@/nix-support/gnat-cflags ]; then + NIX_GNATFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/gnat-cflags) $NIX_GNATFLAGS_COMPILE_@suffixSalt@" +fi + +if [ -e @out@/nix-support/cc-ldflags ]; then + NIX_LDFLAGS_@suffixSalt@+=" $(< @out@/nix-support/cc-ldflags)" +fi + +if [ -e @out@/nix-support/cc-cflags-before ]; then + NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@="$(< @out@/nix-support/cc-cflags-before) $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@" +fi + +# Only add darwin min version flag if a default darwin min version is set, +# which is a signal that we're targetting darwin. +if [ "@darwinMinVersion@" ]; then + mangleVarSingle @darwinMinVersionVariable@ ${role_suffixes[@]+"${role_suffixes[@]}"} + + NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@="-m@darwinPlatformForCC@-version-min=${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@} $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@" +fi + +# That way forked processes will not extend these environment variables again. +export NIX_CC_WRAPPER_FLAGS_SET_@suffixSalt@=1 diff --git a/pkgs/build-support/cc-wrapper/add-gnat-extra-flags.sh b/pkgs/build-support/cc-wrapper/add-gnat-extra-flags.sh new file mode 100644 index 0000000..ceff1e4 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/add-gnat-extra-flags.sh @@ -0,0 +1,23 @@ +# See add-flags.sh in cc-wrapper for comments. +var_templates_list=( + NIX_GNATMAKE_CARGS +) + +accumulateRoles + +for var in "${var_templates_list[@]}"; do + mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done + +# `-B@out@/bin' forces cc to use wrapped as instead of the system one. +NIX_GNATMAKE_CARGS_@suffixSalt@="$NIX_GNATMAKE_CARGS_@suffixSalt@ -B@out@/bin/" + +# Only add darwin min version flag if a default darwin min version is set, +# which is a signal that we're targetting darwin. +if [ "@darwinMinVersion@" ]; then + mangleVarSingle @darwinMinVersionVariable@ ${role_suffixes[@]+"${role_suffixes[@]}"} + + NIX_GNATMAKE_CARGS_@suffixSalt@="-m@darwinPlatformForCC@-version-min=${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@} $NIX_GNATMAKE_CARGS_@suffixSalt@" +fi + +export NIX_GNAT_WRAPPER_EXTRA_FLAGS_SET_@suffixSalt@=1 diff --git a/pkgs/build-support/cc-wrapper/add-hardening.sh b/pkgs/build-support/cc-wrapper/add-hardening.sh new file mode 100644 index 0000000..ef166e2 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/add-hardening.sh @@ -0,0 +1,126 @@ +declare -a hardeningCFlagsAfter=() +declare -a hardeningCFlagsBefore=() + +declare -A hardeningEnableMap=() + +# Intentionally word-split in case 'NIX_HARDENING_ENABLE' is defined in Nix. The +# array expansion also prevents undefined variables from causing trouble with +# `set -u`. +for flag in ${NIX_HARDENING_ENABLE_@suffixSalt@-}; do + hardeningEnableMap["$flag"]=1 +done + +# fortify3 implies fortify enablement - make explicit before +# we filter unsupported flags because unsupporting fortify3 +# doesn't mean we should unsupport fortify too +if [[ -n "${hardeningEnableMap[fortify3]-}" ]]; then + hardeningEnableMap["fortify"]=1 +fi + +# Remove unsupported flags. +for flag in @hardening_unsupported_flags@; do + unset -v "hardeningEnableMap[$flag]" + # fortify being unsupported implies fortify3 is unsupported + if [[ "$flag" = 'fortify' ]] ; then + unset -v "hardeningEnableMap['fortify3']" + fi +done + +# now make fortify and fortify3 mutually exclusive +if [[ -n "${hardeningEnableMap[fortify3]-}" ]]; then + unset -v "hardeningEnableMap['fortify']" +fi + +if (( "${NIX_DEBUG:-0}" >= 1 )); then + declare -a allHardeningFlags=(fortify fortify3 stackprotector pie pic strictoverflow format trivialautovarinit zerocallusedregs) + declare -A hardeningDisableMap=() + + # Determine which flags were effectively disabled so we can report below. + for flag in "${allHardeningFlags[@]}"; do + if [[ -z "${hardeningEnableMap[$flag]-}" ]]; then + hardeningDisableMap["$flag"]=1 + fi + done + + printf 'HARDENING: disabled flags:' >&2 + (( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2 + echo >&2 + + if (( "${#hardeningEnableMap[@]}" )); then + echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2; + fi +fi + +for flag in "${!hardeningEnableMap[@]}"; do + case $flag in + fortify | fortify3) + # Use -U_FORTIFY_SOURCE to avoid warnings on toolchains that explicitly + # set -D_FORTIFY_SOURCE=0 (like 'clang -fsanitize=address'). + hardeningCFlagsBefore+=('-O2' '-U_FORTIFY_SOURCE') + # Unset any _FORTIFY_SOURCE values the command-line may have set before + # enforcing our own value, avoiding (potentially fatal) redefinition + # warnings + hardeningCFlagsAfter+=('-U_FORTIFY_SOURCE') + case $flag in + fortify) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling fortify >&2; fi + hardeningCFlagsAfter+=('-D_FORTIFY_SOURCE=2') + ;; + fortify3) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling fortify3 >&2; fi + hardeningCFlagsAfter+=('-D_FORTIFY_SOURCE=3') + ;; + *) + # Ignore unsupported. + ;; + esac + ;; + stackprotector) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling stackprotector >&2; fi + hardeningCFlagsBefore+=('-fstack-protector-strong' '--param' 'ssp-buffer-size=4') + ;; + pie) + # NB: we do not use `+=` here, because PIE flags must occur before any PIC flags + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling CFlags -fPIE >&2; fi + hardeningCFlagsBefore=('-fPIE' "${hardeningCFlagsBefore[@]}") + if [[ ! (" ${params[*]} " =~ " -shared " || " ${params[*]} " =~ " -static ") ]]; then + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi + hardeningCFlagsBefore=('-pie' "${hardeningCFlagsBefore[@]}") + fi + ;; + pic) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling pic >&2; fi + hardeningCFlagsBefore+=('-fPIC') + ;; + strictoverflow) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling strictoverflow >&2; fi + if (( @isClang@ )); then + # In Clang, -fno-strict-overflow only serves to set -fwrapv and is + # reported as an unused CLI argument if -fwrapv or -fno-wrapv is set + # explicitly, so we side step that by doing the conversion here. + # + # See: https://github.com/llvm/llvm-project/blob/llvmorg-16.0.6/clang/lib/Driver/ToolChains/Clang.cpp#L6315 + # + hardeningCFlagsBefore+=('-fwrapv') + else + hardeningCFlagsBefore+=('-fno-strict-overflow') + fi + ;; + trivialautovarinit) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling trivialautovarinit >&2; fi + hardeningCFlagsBefore+=('-ftrivial-auto-var-init=pattern') + ;; + format) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi + hardeningCFlagsBefore+=('-Wformat' '-Wformat-security' '-Werror=format-security') + ;; + zerocallusedregs) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling zerocallusedregs >&2; fi + hardeningCFlagsBefore+=('-fzero-call-used-regs=used-gpr') + ;; + *) + # Ignore unsupported. Checked in Nix that at least *some* + # tool supports each flag. + ;; + esac +done diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh new file mode 100644 index 0000000..b8d170d --- /dev/null +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -0,0 +1,261 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +path_backup="$PATH" + +# That @-vars are substituted separately from bash evaluation makes +# shellcheck think this, and others like it, are useless conditionals. +# shellcheck disable=SC2157 +if [[ -n "@coreutils_bin@" && -n "@gnugrep_bin@" ]]; then + PATH="@coreutils_bin@/bin:@gnugrep_bin@/bin" +fi + +source @out@/nix-support/utils.bash + + +# Parse command line options and set several variables. +# For instance, figure out if linker flags should be passed. +# GCC prints annoying warnings when they are not needed. +dontLink=0 +nonFlagArgs=0 +cc1=0 +# shellcheck disable=SC2193 +[[ "@prog@" = *++ ]] && isCxx=1 || isCxx=0 +cxxInclude=1 +cxxLibrary=1 +cInclude=1 + +expandResponseParams "$@" + +declare -ag positionalArgs=() +declare -i n=0 +nParams=${#params[@]} +while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + n+=1 + + case "$p" in + -[cSEM] | -MM) dontLink=1 ;; + -cc1) cc1=1 ;; + -nostdinc) cInclude=0 cxxInclude=0 ;; + -nostdinc++) cxxInclude=0 ;; + -nostdlib) cxxLibrary=0 ;; + -x*-header) dontLink=1 ;; # both `-x c-header` and `-xc-header` are accepted by clang + -xc++*) isCxx=1 ;; # both `-xc++` and `-x c++` are accepted by clang + -x) + case "$p2" in + *-header) dontLink=1 ;; + c++*) isCxx=1 ;; + esac + ;; + --) # Everything else is positional args! + # See: https://github.com/llvm/llvm-project/commit/ed1d07282cc9d8e4c25d585e03e5c8a1b6f63a74 + + # Any positional arg (i.e. any argument after `--`) will be + # interpreted as a "non flag" arg: + if [[ -v "params[$n]" ]]; then nonFlagArgs=1; fi + + positionalArgs=("${params[@]:$n}") + params=("${params[@]:0:$((n - 1))}") + break; + ;; + -?*) ;; + *) nonFlagArgs=1 ;; # Includes a solitary dash (`-`) which signifies standard input; it is not a flag + esac +done + +# If we pass a flag like -Wl, then gcc will call the linker unless it +# can figure out that it has to do something else (e.g., because of a +# "-c" flag). So if no non-flag arguments are given, don't pass any +# linker flags. This catches cases like "gcc" (should just print +# "gcc: no input files") and "gcc -v" (should print the version). +if [ "$nonFlagArgs" = 0 ]; then + dontLink=1 +fi + +# Optionally filter out paths not refering to the store. +if [[ "${NIX_ENFORCE_PURITY:-}" = 1 && -n "$NIX_STORE" ]]; then + kept=() + nParams=${#params[@]} + declare -i n=0 + while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + n+=1 + + skipNext=false + path="" + case "$p" in + -[IL]/*) path=${p:2} ;; + -[IL] | -isystem) path=$p2 skipNext=true ;; + esac + + if [[ -n $path ]] && badPath "$path"; then + skip "$path" + $skipNext && n+=1 + continue + fi + + kept+=("$p") + done + # Old bash empty array hack + params=(${kept+"${kept[@]}"}) +fi + +# Flirting with a layer violation here. +if [ -z "${NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @bintools@/nix-support/add-flags.sh +fi + +# Put this one second so libc ldflags take priority. +if [ -z "${NIX_CC_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-flags.sh +fi + +# Clear march/mtune=native -- they bring impurity. +if [ "$NIX_ENFORCE_NO_NATIVE_@suffixSalt@" = 1 ]; then + kept=() + # Old bash empty array hack + for p in ${params+"${params[@]}"}; do + if [[ "$p" = -m*=native ]]; then + skip "$p" + else + kept+=("$p") + fi + done + # Old bash empty array hack + params=(${kept+"${kept[@]}"}) +fi + +if [[ "$isCxx" = 1 ]]; then + if [[ "$cxxInclude" = 1 ]]; then + # + # The motivation for this comment is to explain the reason for appending + # the C++ stdlib to NIX_CFLAGS_COMPILE, which I initially thought should + # change and later realized it shouldn't in: + # + # https://github.com/NixOS/nixpkgs/pull/185569#issuecomment-1234959249 + # + # NIX_CFLAGS_COMPILE contains dependencies added using "-isystem", and + # NIX_CXXSTDLIB_COMPILE adds the C++ stdlib using "-isystem". Appending + # NIX_CXXSTDLIB_COMPILE to NIX_CLAGS_COMPILE emulates this part of the + # include lookup order from GCC/Clang: + # + # > 4. Directories specified with -isystem options are scanned in + # > left-to-right order. + # > 5. Standard system directories are scanned. + # > 6. Directories specified with -idirafter options are scanned + # > in left-to-right order. + # + # NIX_CXX_STDLIB_COMPILE acts as the "standard system directories" that + # are otherwise missing from CC in nixpkgs, so should be added last. + # + # This means that the C standard library should never be present inside + # NIX_CFLAGS_COMPILE, because it MUST come after the C++ stdlib. It is + # added automatically by cc-wrapper later using "-idirafter". + # + NIX_CFLAGS_COMPILE_@suffixSalt@+=" $NIX_CXXSTDLIB_COMPILE_@suffixSalt@" + fi + if [[ "$cxxLibrary" = 1 ]]; then + NIX_CFLAGS_LINK_@suffixSalt@+=" $NIX_CXXSTDLIB_LINK_@suffixSalt@" + fi +fi + +source @out@/nix-support/add-hardening.sh + +# Add the flags for the C compiler proper. +extraAfter=(${hardeningCFlagsAfter[@]+"${hardeningCFlagsAfter[@]}"} $NIX_CFLAGS_COMPILE_@suffixSalt@) +extraBefore=(${hardeningCFlagsBefore[@]+"${hardeningCFlagsBefore[@]}"} $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@) + +if [ "$dontLink" != 1 ]; then + linkType=$(checkLinkType $NIX_LDFLAGS_BEFORE_@suffixSalt@ "${params[@]}" ${NIX_CFLAGS_LINK_@suffixSalt@:-} $NIX_LDFLAGS_@suffixSalt@) + + # Add the flags that should only be passed to the compiler when + # linking. + extraAfter+=($(filterRpathFlags "$linkType" $NIX_CFLAGS_LINK_@suffixSalt@)) + + # Add the flags that should be passed to the linker (and prevent + # `ld-wrapper' from adding NIX_LDFLAGS_@suffixSalt@ again). + for i in $(filterRpathFlags "$linkType" $NIX_LDFLAGS_BEFORE_@suffixSalt@); do + extraBefore+=("-Wl,$i") + done + if [[ "$linkType" == dynamic && -n "$NIX_DYNAMIC_LINKER_@suffixSalt@" ]]; then + extraBefore+=("-Wl,-dynamic-linker=$NIX_DYNAMIC_LINKER_@suffixSalt@") + fi + for i in $(filterRpathFlags "$linkType" $NIX_LDFLAGS_@suffixSalt@); do + if [ "${i:0:3}" = -L/ ]; then + extraAfter+=("$i") + else + extraAfter+=("-Wl,$i") + fi + done + export NIX_LINK_TYPE_@suffixSalt@=$linkType +fi + +if [[ -e @out@/nix-support/add-local-cc-cflags-before.sh ]]; then + source @out@/nix-support/add-local-cc-cflags-before.sh +fi + +# As a very special hack, if the arguments are just `-v', then don't +# add anything. This is to prevent `gcc -v' (which normally prints +# out the version number and returns exit code 0) from printing out +# `No input files specified' and returning exit code 1. +if [ "$*" = -v ]; then + extraAfter=() + extraBefore=() +fi + +# clang's -cc1 mode is not compatible with most options +# that we would pass. Rather than trying to pass only +# options that would work, let's just remove all of them. +if [ "$cc1" = 1 ]; then + extraAfter=() + extraBefore=() +fi + +# Finally, if we got any positional args, append them to `extraAfter` +# now: +if [[ "${#positionalArgs[@]}" -gt 0 ]]; then + extraAfter+=(-- "${positionalArgs[@]}") +fi + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see ld-wrapper for explanation. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +PATH="$path_backup" +# Old bash workaround, see above. + +# if a cc-wrapper-hook exists, run it. +if [[ -e @out@/nix-support/cc-wrapper-hook ]]; then + compiler=@prog@ + source @out@/nix-support/cc-wrapper-hook +fi + +if (( "${NIX_CC_USE_RESPONSE_FILE:-@use_response_file_by_default@}" >= 1 )); then + responseFile=$(mktemp "${TMPDIR:-/tmp}/cc-params.XXXXXX") + trap 'rm -f -- "$responseFile"' EXIT + printf "%q\n" \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} > "$responseFile" + @prog@ "@$responseFile" +else + exec @prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +fi diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix new file mode 100644 index 0000000..4adc1dc --- /dev/null +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -0,0 +1,764 @@ +# The Nixpkgs CC is not directly usable, since it doesn't know where +# the C library and standard header files are. Therefore the compiler +# produced by that package cannot be installed directly in a user +# environment and used from the command line. So we use a wrapper +# script that sets up the right environment variables so that the +# compiler and the linker just "work". + +{ name ? "" +, lib +, stdenvNoCC +, runtimeShell +, cc ? null, libc ? null, bintools, coreutils ? null +, zlib ? null +, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" +, propagateDoc ? cc != null && cc ? man +, extraTools ? [], extraPackages ? [], extraBuildCommands ? "" +, nixSupport ? {} +, isGNU ? false, isClang ? cc.isClang or false, isCcache ? cc.isCcache or false, gnugrep ? null +, expand-response-params +, libcxx ? null + +# Whether or not to add `-B` and `-L` to `nix-support/cc-{c,ld}flags` +, useCcForLibs ? + + # Always add these flags for Clang, because in order to compile (most + # software) it needs libraries that are shipped and compiled with gcc. + if isClang then true + + # Never add these flags for a build!=host cross-compiler or a host!=target + # ("cross-built-native") compiler; currently nixpkgs has a special build + # path for these (`crossStageStatic`). Hopefully at some point that build + # path will be merged with this one and this conditional will be removed. + else if (with stdenvNoCC; buildPlatform != hostPlatform || hostPlatform != targetPlatform) then false + + # Never add these flags when wrapping the bootstrapFiles' compiler; it has a + # /usr/-like layout with everything smashed into a single outpath, so it has + # no trouble finding its own libraries. + else if (cc.passthru.isFromBootstrapFiles or false) then false + + # Add these flags when wrapping `xgcc` (the first compiler that nixpkgs builds) + else if (cc.passthru.isXgcc or false) then true + + # Add these flags when wrapping `stdenv.cc` + else if (cc.stdenv.cc.cc.passthru.isXgcc or false) then true + + # Do not add these flags in any other situation. This is `false` mainly to + # prevent these flags from being added when wrapping *old* versions of gcc + # (e.g. `gcc6Stdenv`), since they will cause the old gcc to get `-B` and + # `-L` flags pointing at the new gcc's libstdc++ headers. Example failure: + # https://hydra.nixos.org/build/213125495 + else false + +# the derivation at which the `-B` and `-L` flags added by `useCcForLibs` will point +, gccForLibs ? if useCcForLibs then cc else null +, fortify-headers ? null +, includeFortifyHeaders ? null +}: + +assert nativeTools -> !propagateDoc && nativePrefix != ""; +assert !nativeTools -> cc != null && coreutils != null && gnugrep != null; +assert !(nativeLibc && noLibc); +assert (noLibc || nativeLibc) == (libc == null); + +let + inherit (lib) + attrByPath + concatMapStrings + concatStringsSep + escapeShellArg + getBin + getDev + getLib + getName + getVersion + mapAttrsToList + optional + optionalAttrs + optionals + optionalString + removePrefix + replaceStrings + toList + versionAtLeast + ; + + inherit (stdenvNoCC) hostPlatform targetPlatform; + + includeFortifyHeaders' = if includeFortifyHeaders != null + then includeFortifyHeaders + else (targetPlatform.libc == "musl" && isGNU); + + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by default. + targetPrefix = optionalString (targetPlatform != hostPlatform) (targetPlatform.config + "-"); + + ccVersion = getVersion cc; + ccName = removePrefix targetPrefix (getName cc); + + libc_bin = optionalString (libc != null) (getBin libc); + libc_dev = optionalString (libc != null) (getDev libc); + libc_lib = optionalString (libc != null) (getLib libc); + cc_solib = getLib cc + + optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}"; + + # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. + coreutils_bin = optionalString (!nativeTools) (getBin coreutils); + + # The "suffix salt" is a arbitrary string added in the end of env vars + # defined by cc-wrapper's hooks so that multiple cc-wrappers can be used + # without interfering. For the moment, it is defined as the target triple, + # adjusted to be a valid bash identifier. This should be considered an + # unstable implementation detail, however. + suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config; + + useGccForLibs = useCcForLibs + && libcxx == null + && !targetPlatform.isDarwin + && !(targetPlatform.useLLVM or false) + && !(targetPlatform.useAndroidPrebuilt or false) + && !(targetPlatform.isiOS or false) + && gccForLibs != null; + gccForLibs_solib = getLib gccForLibs + + optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}"; + + # Analogously to cc_solib and gccForLibs_solib + libcxx_solib = "${getLib libcxx}/lib"; + + # The following two functions, `isGccArchSupported` and + # `isGccTuneSupported`, only handle those situations where a flag + # (`-march` or `-mtune`) is accepted by one compiler but rejected + # by another, and both compilers are relevant to nixpkgs. We are + # not trying to maintain a complete list of all flags accepted by + # all versions of all compilers ever in nixpkgs. + # + # The two main cases of interest are: + # + # - One compiler is gcc and the other is clang + # - One compiler is pkgs.gcc and the other is bootstrap-files.gcc + # -- older compilers (for example bootstrap's GCC 5) fail with + # -march=too-modern-cpu + + isGccArchSupported = arch: + if targetPlatform.isPower then false else # powerpc does not allow -march= + if isGNU then + { # Generic + x86-64-v2 = versionAtLeast ccVersion "11.0"; + x86-64-v3 = versionAtLeast ccVersion "11.0"; + x86-64-v4 = versionAtLeast ccVersion "11.0"; + + # Intel + skylake = versionAtLeast ccVersion "6.0"; + skylake-avx512 = versionAtLeast ccVersion "6.0"; + cannonlake = versionAtLeast ccVersion "8.0"; + icelake-client = versionAtLeast ccVersion "8.0"; + icelake-server = versionAtLeast ccVersion "8.0"; + cascadelake = versionAtLeast ccVersion "9.0"; + cooperlake = versionAtLeast ccVersion "10.0"; + tigerlake = versionAtLeast ccVersion "10.0"; + knm = versionAtLeast ccVersion "8.0"; + alderlake = versionAtLeast ccVersion "12.0"; + + # AMD + znver1 = versionAtLeast ccVersion "6.0"; + znver2 = versionAtLeast ccVersion "9.0"; + znver3 = versionAtLeast ccVersion "11.0"; + znver4 = versionAtLeast ccVersion "13.0"; + }.${arch} or true + else if isClang then + { #Generic + x86-64-v2 = versionAtLeast ccVersion "12.0"; + x86-64-v3 = versionAtLeast ccVersion "12.0"; + x86-64-v4 = versionAtLeast ccVersion "12.0"; + + # Intel + cannonlake = versionAtLeast ccVersion "5.0"; + icelake-client = versionAtLeast ccVersion "7.0"; + icelake-server = versionAtLeast ccVersion "7.0"; + knm = versionAtLeast ccVersion "7.0"; + alderlake = versionAtLeast ccVersion "16.0"; + + # AMD + znver1 = versionAtLeast ccVersion "4.0"; + znver2 = versionAtLeast ccVersion "9.0"; + znver3 = versionAtLeast ccVersion "12.0"; + znver4 = versionAtLeast ccVersion "16.0"; + }.${arch} or true + else + false; + + isGccTuneSupported = tune: + # for x86 -mtune= takes the same values as -march, plus two more: + if targetPlatform.isx86 then + { + generic = true; + intel = true; + }.${tune} or (isGccArchSupported tune) + # on arm64, the -mtune= values are specific processors + else if targetPlatform.isAarch64 then + (if isGNU then + { + cortex-a53 = versionAtLeast ccVersion "4.8"; # gcc 8c075f + cortex-a72 = versionAtLeast ccVersion "5.1"; # gcc d8f70d + "cortex-a72.cortex-a53" = versionAtLeast ccVersion "5.1"; # gcc d8f70d + }.${tune} or false + else if isClang then + { + cortex-a53 = versionAtLeast ccVersion "3.9"; # llvm dfc5d1 + }.${tune} or false + else false) + else if targetPlatform.isPower then + # powerpc does not support -march + true + else if targetPlatform.isMips then + # for mips -mtune= takes the same values as -march + isGccArchSupported tune + else + false; + + # Clang does not support as many `-mtune=` values as gcc does; + # this function will return the best possible approximation of the + # provided `-mtune=` value, or `null` if none exists. + # + # Note: this function can make use of ccVersion; for example, `if + # versionOlder ccVersion "12" then ...` + findBestTuneApproximation = tune: + let guess = if isClang + then { + # clang does not tune for big.LITTLE chips + "cortex-a72.cortex-a53" = "cortex-a72"; + }.${tune} or tune + else tune; + in if isGccTuneSupported guess + then guess + else null; + + defaultHardeningFlags = bintools.defaultHardeningFlags or []; + + # if cc.hardeningUnsupportedFlagsByTargetPlatform exists, this is + # called with the targetPlatform as an argument and + # cc.hardeningUnsupportedFlags is completely ignored - the function + # is responsible for including the constant hardeningUnsupportedFlags + # list however it sees fit. + ccHardeningUnsupportedFlags = if cc ? hardeningUnsupportedFlagsByTargetPlatform + then cc.hardeningUnsupportedFlagsByTargetPlatform targetPlatform + else (cc.hardeningUnsupportedFlags or []); + + darwinPlatformForCC = optionalString targetPlatform.isDarwin ( + if (targetPlatform.darwinPlatform == "macos" && isGNU) then "macosx" + else targetPlatform.darwinPlatform + ); + + darwinMinVersion = optionalString targetPlatform.isDarwin ( + targetPlatform.darwinMinVersion + ); + + darwinMinVersionVariable = optionalString targetPlatform.isDarwin + targetPlatform.darwinMinVersionVariable; +in + +assert includeFortifyHeaders' -> fortify-headers != null; + +# Ensure bintools matches +assert libc_bin == bintools.libc_bin; +assert libc_dev == bintools.libc_dev; +assert libc_lib == bintools.libc_lib; +assert nativeTools == bintools.nativeTools; +assert nativeLibc == bintools.nativeLibc; +assert nativePrefix == bintools.nativePrefix; + +stdenvNoCC.mkDerivation { + pname = targetPrefix + + (if name != "" then name else "${ccName}-wrapper"); + version = optionalString (cc != null) ccVersion; + + preferLocalBuild = true; + + outputs = [ "out" ] ++ optionals propagateDoc [ "man" "info" ]; + + passthru = { + inherit targetPrefix suffixSalt; + # "cc" is the generic name for a C compiler, but there is no one for package + # providing the linker and related tools. The two we use now are GNU + # Binutils, and Apple's "cctools"; "bintools" as an attempt to find an + # unused middle-ground name that evokes both. + inherit bintools; + inherit cc libc libcxx nativeTools nativeLibc nativePrefix isGNU isClang; + + emacsBufferSetup = pkgs: '' + ; We should handle propagation here too + (mapc + (lambda (arg) + (when (file-directory-p (concat arg "/include")) + (setenv "NIX_CFLAGS_COMPILE_${suffixSalt}" (concat (getenv "NIX_CFLAGS_COMPILE_${suffixSalt}") " -isystem " arg "/include")))) + '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) + ''; + + # Expose expand-response-params we are /actually/ using. In stdenv + # bootstrapping, expand-response-params usually comes from an earlier stage, + # so it is important to expose this for reference checking. + inherit expand-response-params; + + inherit nixSupport; + + inherit defaultHardeningFlags; + }; + + dontBuild = true; + dontConfigure = true; + enableParallelBuilding = true; + + unpackPhase = '' + src=$PWD + ''; + + wrapper = ./cc-wrapper.sh; + + installPhase = + '' + mkdir -p $out/bin $out/nix-support + + wrap() { + local dst="$1" + local wrapper="$2" + export prog="$3" + export use_response_file_by_default=${if isClang && !isCcache then "1" else "0"} + substituteAll "$wrapper" "$out/bin/$dst" + chmod +x "$out/bin/$dst" + } + '' + + + (if nativeTools then '' + echo ${if targetPlatform.isDarwin then cc else nativePrefix} > $out/nix-support/orig-cc + + ccPath="${if targetPlatform.isDarwin then cc else nativePrefix}/bin" + '' else '' + echo $cc > $out/nix-support/orig-cc + + ccPath="${cc}/bin" + '') + + # Create symlinks to everything in the bintools wrapper. + + '' + for bbin in $bintools/bin/*; do + mkdir -p "$out/bin" + ln -s "$bbin" "$out/bin/$(basename $bbin)" + done + '' + + # We export environment variables pointing to the wrapped nonstandard + # cmds, lest some lousy configure script use those to guess compiler + # version. + + '' + export named_cc=${targetPrefix}cc + export named_cxx=${targetPrefix}c++ + + if [ -e $ccPath/${targetPrefix}gcc ]; then + wrap ${targetPrefix}gcc $wrapper $ccPath/${targetPrefix}gcc + ln -s ${targetPrefix}gcc $out/bin/${targetPrefix}cc + export named_cc=${targetPrefix}gcc + export named_cxx=${targetPrefix}g++ + elif [ -e $ccPath/clang ]; then + wrap ${targetPrefix}clang $wrapper $ccPath/clang + ln -s ${targetPrefix}clang $out/bin/${targetPrefix}cc + export named_cc=${targetPrefix}clang + export named_cxx=${targetPrefix}clang++ + fi + + if [ -e $ccPath/${targetPrefix}g++ ]; then + wrap ${targetPrefix}g++ $wrapper $ccPath/${targetPrefix}g++ + ln -s ${targetPrefix}g++ $out/bin/${targetPrefix}c++ + elif [ -e $ccPath/clang++ ]; then + wrap ${targetPrefix}clang++ $wrapper $ccPath/clang++ + ln -s ${targetPrefix}clang++ $out/bin/${targetPrefix}c++ + fi + + if [ -e $ccPath/${targetPrefix}cpp ]; then + wrap ${targetPrefix}cpp $wrapper $ccPath/${targetPrefix}cpp + elif [ -e $ccPath/cpp ]; then + wrap ${targetPrefix}cpp $wrapper $ccPath/cpp + fi + '' + + # No need to wrap gnat, gnatkr, gnatname or gnatprep; we can just symlink them in + + optionalString cc.langAda or false '' + for cmd in gnatbind gnatchop gnatclean gnatlink gnatls gnatmake; do + wrap ${targetPrefix}$cmd ${./gnat-wrapper.sh} $ccPath/${targetPrefix}$cmd + done + + for cmd in gnat gnatkr gnatname gnatprep; do + ln -s $ccPath/${targetPrefix}$cmd $out/bin/${targetPrefix}$cmd + done + + # this symlink points to the unwrapped gnat's output "out". It is used by + # our custom gprconfig compiler description to find GNAT's ada runtime. See + # ../../development/ada-modules/gprbuild/{boot.nix, nixpkgs-gnat.xml} + ln -sf ${cc} $out/nix-support/gprconfig-gnat-unwrapped + '' + + + optionalString cc.langD or false '' + wrap ${targetPrefix}gdc $wrapper $ccPath/${targetPrefix}gdc + '' + + + optionalString cc.langFortran or false '' + wrap ${targetPrefix}gfortran $wrapper $ccPath/${targetPrefix}gfortran + ln -sv ${targetPrefix}gfortran $out/bin/${targetPrefix}g77 + ln -sv ${targetPrefix}gfortran $out/bin/${targetPrefix}f77 + export named_fc=${targetPrefix}gfortran + '' + + + optionalString cc.langJava or false '' + wrap ${targetPrefix}gcj $wrapper $ccPath/${targetPrefix}gcj + '' + + + optionalString cc.langGo or false '' + wrap ${targetPrefix}gccgo $wrapper $ccPath/${targetPrefix}gccgo + wrap ${targetPrefix}go ${./go-wrapper.sh} $ccPath/${targetPrefix}go + ''; + + strictDeps = true; + propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or cc.langJava or false [ zlib ]; + depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages; + + setupHooks = [ + ../setup-hooks/role.bash + ] ++ optional (cc.langC or true) ./setup-hook.sh + ++ optional (cc.langFortran or false) ./fortran-hook.sh + ++ optional (targetPlatform.isWindows) (stdenvNoCC.mkDerivation { + name = "win-dll-hook.sh"; + dontUnpack = true; + installPhase = '' + echo addToSearchPath "LINK_DLL_FOLDERS" "${cc_solib}/lib" > $out + echo addToSearchPath "LINK_DLL_FOLDERS" "${cc_solib}/lib64" >> $out + echo addToSearchPath "LINK_DLL_FOLDERS" "${cc_solib}/lib32" >> $out + ''; + }); + + postFixup = + # Ensure flags files exists, as some other programs cat them. (That these + # are considered an exposed interface is a bit dubious, but fine for now.) + '' + touch "$out/nix-support/cc-cflags" + touch "$out/nix-support/cc-ldflags" + '' + + # Backwards compatibility for packages expecting this file, e.g. with + # `$NIX_CC/nix-support/dynamic-linker`. + # + # TODO(@Ericson2314): Remove this after stable release and force + # everyone to refer to bintools-wrapper directly. + + '' + if [[ -f "$bintools/nix-support/dynamic-linker" ]]; then + ln -s "$bintools/nix-support/dynamic-linker" "$out/nix-support" + fi + if [[ -f "$bintools/nix-support/dynamic-linker-m32" ]]; then + ln -s "$bintools/nix-support/dynamic-linker-m32" "$out/nix-support" + fi + '' + + ## + ## GCC libs for non-GCC support + ## + + optionalString (useGccForLibs && isClang) '' + + echo "-B${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-cflags + '' + + optionalString useGccForLibs '' + echo "-L${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-ldflags + echo "-L${gccForLibs_solib}/lib" >> $out/nix-support/cc-ldflags + '' + + # TODO We would like to connect this to `useGccForLibs`, but we cannot yet + # because `libcxxStdenv` on linux still needs this. Maybe someday we'll + # always set `useLLVM` on Darwin, and maybe also break down `useLLVM` into + # fine-grained use flags (libgcc vs compiler-rt, ld.lld vs legacy, libc++ + # vs libstdc++, etc.) since Darwin isn't `useLLVM` on all counts. (See + # https://clang.llvm.org/docs/Toolchain.html for all the axes one might + # break `useLLVM` into.) + + optionalString (isClang + && targetPlatform.isLinux + && !(targetPlatform.useAndroidPrebuilt or false) + && !(targetPlatform.useLLVM or false) + && gccForLibs != null) ('' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags + + # Pull in 'cc.out' target to get 'libstdc++fs.a'. It should be in + # 'cc.lib'. But it's a gcc package bug. + # TODO(trofi): remove once gcc is fixed to move libraries to .lib output. + echo "-L${gccForLibs}/${optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}"}/lib" >> $out/nix-support/cc-ldflags + '' + # this ensures that when clang passes -lgcc_s to lld (as it does + # when building e.g. firefox), lld is able to find libgcc_s.so + + concatMapStrings (libgcc: '' + echo "-L${libgcc}/lib" >> $out/nix-support/cc-ldflags + '') (toList (gccForLibs.libgcc or []))) + + ## + ## General libc support + ## + + # The "-B${libc_lib}/lib/" flag is a quick hack to force gcc to link + # against the crt1.o from our own glibc, rather than the one in + # /usr/lib. (This is only an issue when using an `impure' + # compiler/linker, i.e., one that searches /usr/lib and so on.) + # + # Unfortunately, setting -B appears to override the default search + # path. Thus, the gcc-specific "../includes-fixed" directory is + # now longer searched and glibc's header fails to + # compile, because it uses "#include_next " to find the + # limits.h file in ../includes-fixed. To remedy the problem, + # another -idirafter is necessary to add that directory again. + + optionalString (libc != null) ('' + touch "$out/nix-support/libc-cflags" + touch "$out/nix-support/libc-ldflags" + echo "-B${libc_lib}${libc.libdir or "/lib/"}" >> $out/nix-support/libc-crt1-cflags + '' + optionalString (!(cc.langD or false)) '' + echo "-idirafter ${libc_dev}${libc.incdir or "/include"}" >> $out/nix-support/libc-cflags + '' + optionalString (isGNU && (!(cc.langD or false))) '' + for dir in "${cc}"/lib/gcc/*/*/include-fixed; do + echo '-idirafter' ''${dir} >> $out/nix-support/libc-cflags + done + '' + '' + + echo "${libc_lib}" > $out/nix-support/orig-libc + echo "${libc_dev}" > $out/nix-support/orig-libc-dev + '' + # fortify-headers is a set of wrapper headers that augment libc + # and use #include_next to pass through to libc's true + # implementations, so must appear before them in search order. + # in theory a correctly placed -idirafter could be used, but in + # practice the compiler may have been built with a --with-headers + # like option that forces the libc headers before all -idirafter, + # hence -isystem here. + + optionalString includeFortifyHeaders' '' + echo "-isystem ${fortify-headers}/include" >> $out/nix-support/libc-cflags + '') + + ## + ## General libc++ support + ## + + # We have a libc++ directly, we have one via "smuggled" GCC, or we have one + # bundled with the C compiler because it is GCC + + optionalString (libcxx != null || (useGccForLibs && gccForLibs.langCC or false) || (isGNU && cc.langCC or false)) '' + touch "$out/nix-support/libcxx-cxxflags" + touch "$out/nix-support/libcxx-ldflags" + '' + # Adding -isystem flags should be done only for clang; gcc + # already knows how to find its own libstdc++, and adding + # additional -isystem flags will confuse gfortran (see + # https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903) + + optionalString (libcxx == null && isClang && (useGccForLibs && gccForLibs.langCC or false)) '' + for dir in ${gccForLibs}/include/c++/*; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + done + for dir in ${gccForLibs}/include/c++/*/${targetPlatform.config}; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + done + '' + + optionalString (libcxx.isLLVM or false) '' + echo "-isystem ${getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags + echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags + '' + + ## + ## Initial CFLAGS + ## + + # GCC shows ${cc_solib}/lib in `gcc -print-search-dirs', but not + # ${cc_solib}/lib64 (even though it does actually search there...).. + # This confuses libtool. So add it to the compiler tool search + # path explicitly. + + optionalString (!nativeTools) '' + if [ -e "${cc_solib}/lib64" -a ! -L "${cc_solib}/lib64" ]; then + ccLDFlags+=" -L${cc_solib}/lib64" + ccCFlags+=" -B${cc_solib}/lib64" + fi + ccLDFlags+=" -L${cc_solib}/lib" + ccCFlags+=" -B${cc_solib}/lib" + + '' + optionalString cc.langAda or false '' + touch "$out/nix-support/gnat-cflags" + touch "$out/nix-support/gnat-ldflags" + basePath=$(echo $cc/lib/*/*/*) + ccCFlags+=" -B$basePath -I$basePath/adainclude" + gnatCFlags="-I$basePath/adainclude -I$basePath/adalib" + + echo "$gnatCFlags" >> $out/nix-support/gnat-cflags + '' + '' + echo "$ccLDFlags" >> $out/nix-support/cc-ldflags + echo "$ccCFlags" >> $out/nix-support/cc-cflags + '' + optionalString (targetPlatform.isDarwin && (libcxx != null) && (cc.isClang or false)) '' + echo " -L${libcxx_solib}" >> $out/nix-support/cc-ldflags + '' + + ## + ## Man page and info support + ## + + optionalString propagateDoc '' + ln -s ${cc.man} $man + ln -s ${cc.info} $info + '' + optionalString (cc.langD or cc.langJava or false) '' + echo "-B${zlib}${zlib.libdir or "/lib/"}" >> $out/nix-support/libc-cflags + '' + + ## + ## Hardening support + ## + + '' + export hardening_unsupported_flags="${concatStringsSep " " ccHardeningUnsupportedFlags}" + '' + + # Machine flags. These are necessary to support + + # TODO: We should make a way to support miscellaneous machine + # flags and other gcc flags as well. + + # Always add -march based on cpu in triple. Sometimes there is a + # discrepency (x86_64 vs. x86-64), so we provide an "arch" arg in + # that case. + # + # For clang, this is handled in add-clang-cc-cflags-before.sh + + # TODO: aarch64-darwin has mcpu incompatible with gcc + + optionalString ((targetPlatform ? gcc.arch) && !isClang && !(targetPlatform.isDarwin && targetPlatform.isAarch64) && + isGccArchSupported targetPlatform.gcc.arch) '' + echo "-march=${targetPlatform.gcc.arch}" >> $out/nix-support/cc-cflags-before + '' + + # -mcpu is not very useful, except on PowerPC where it is used + # instead of march. On all other platforms you should use mtune + # and march instead. + # TODO: aarch64-darwin has mcpu incompatible with gcc + + optionalString ((targetPlatform ? gcc.cpu) && (isClang || !(targetPlatform.isDarwin && targetPlatform.isAarch64))) '' + echo "-mcpu=${targetPlatform.gcc.cpu}" >> $out/nix-support/cc-cflags-before + '' + + # -mfloat-abi only matters on arm32 but we set it here + # unconditionally just in case. If the abi specifically sets hard + # vs. soft floats we use it here. + + optionalString (targetPlatform ? gcc.float-abi) '' + echo "-mfloat-abi=${targetPlatform.gcc.float-abi}" >> $out/nix-support/cc-cflags-before + '' + + optionalString (targetPlatform ? gcc.fpu) '' + echo "-mfpu=${targetPlatform.gcc.fpu}" >> $out/nix-support/cc-cflags-before + '' + + optionalString (targetPlatform ? gcc.mode) '' + echo "-mmode=${targetPlatform.gcc.mode}" >> $out/nix-support/cc-cflags-before + '' + + optionalString (targetPlatform ? gcc.thumb) '' + echo "-m${if targetPlatform.gcc.thumb then "thumb" else "arm"}" >> $out/nix-support/cc-cflags-before + '' + + (let tune = if targetPlatform ? gcc.tune + then findBestTuneApproximation targetPlatform.gcc.tune + else null; + in optionalString (tune != null) '' + echo "-mtune=${tune}" >> $out/nix-support/cc-cflags-before + '') + + # TODO: categorize these and figure out a better place for them + + optionalString targetPlatform.isWindows '' + hardening_unsupported_flags+=" pic" + '' + optionalString targetPlatform.isMinGW '' + hardening_unsupported_flags+=" stackprotector fortify" + '' + optionalString targetPlatform.isAvr '' + hardening_unsupported_flags+=" stackprotector pic" + '' + optionalString (targetPlatform.libc == "newlib" || targetPlatform.libc == "newlib-nano") '' + hardening_unsupported_flags+=" stackprotector fortify pie pic" + '' + optionalString (targetPlatform.libc == "musl" && targetPlatform.isx86_32) '' + hardening_unsupported_flags+=" stackprotector" + '' + optionalString targetPlatform.isNetBSD '' + hardening_unsupported_flags+=" stackprotector fortify" + '' + optionalString cc.langAda or false '' + hardening_unsupported_flags+=" format stackprotector strictoverflow" + '' + optionalString cc.langD or false '' + hardening_unsupported_flags+=" format" + '' + optionalString cc.langFortran or false '' + hardening_unsupported_flags+=" format" + '' + optionalString targetPlatform.isWasm '' + hardening_unsupported_flags+=" stackprotector fortify pie pic" + '' + optionalString targetPlatform.isMicroBlaze '' + hardening_unsupported_flags+=" stackprotector" + '' + + + optionalString (libc != null && targetPlatform.isAvr) '' + for isa in avr5 avr3 avr4 avr6 avr25 avr31 avr35 avr51 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 tiny-stack; do + echo "-B${getLib libc}/avr/lib/$isa" >> $out/nix-support/libc-crt1-cflags + done + '' + + + optionalString targetPlatform.isDarwin '' + echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/cc-cflags + '' + + + optionalString targetPlatform.isAndroid '' + echo "-D__ANDROID_API__=${targetPlatform.sdkVer}" >> $out/nix-support/cc-cflags + '' + + # There are a few tools (to name one libstdcxx5) which do not work + # well with multi line flags, so make the flags single line again + + '' + for flags in "$out/nix-support"/*flags*; do + substituteInPlace "$flags" --replace $'\n' ' ' + done + + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh + substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh + substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash + '' + + + optionalString cc.langAda or false '' + substituteAll ${./add-gnat-extra-flags.sh} $out/nix-support/add-gnat-extra-flags.sh + '' + + ## + ## General Clang support + ## Needs to go after ^ because the for loop eats \n and makes this file an invalid script + ## + + optionalString isClang '' + # Escape twice: once for this script, once for the one it gets substituted into. + export march=${escapeShellArg + (optionalString (targetPlatform ? gcc.arch) + (escapeShellArg "-march=${targetPlatform.gcc.arch}"))} + export defaultTarget=${targetPlatform.config} + substituteAll ${./add-clang-cc-cflags-before.sh} $out/nix-support/add-local-cc-cflags-before.sh + '' + + ## + ## Extra custom steps + ## + + extraBuildCommands + + concatStringsSep "; " + (mapAttrsToList + (name: value: "echo ${toString value} >> $out/nix-support/${name}") + nixSupport); + + + env = { + inherit isClang; + + # for substitution in utils.bash + # TODO(@sternenseemann): invent something cleaner than passing in "" in case of absence + expandResponseParams = "${expand-response-params}/bin/expand-response-params"; + # TODO(@sternenseemann): rename env var via stdenv rebuild + shell = getBin runtimeShell + runtimeShell.shellPath or ""; + gnugrep_bin = optionalString (!nativeTools) gnugrep; + # stdenv.cc.cc should not be null and we have nothing better for now. + # if the native impure bootstrap is gotten rid of this can become `inherit cc;` again. + cc = optionalString (!nativeTools) cc; + wrapperName = "CC_WRAPPER"; + inherit suffixSalt coreutils_bin bintools; + inherit libc_bin libc_dev libc_lib; + inherit darwinPlatformForCC darwinMinVersion darwinMinVersionVariable; + default_hardening_flags_str = builtins.toString defaultHardeningFlags; + }; + + meta = + let cc_ = optionalAttrs (cc != null) cc; in + (optionalAttrs (cc_ ? meta) (removeAttrs cc.meta ["priority"])) // + { description = attrByPath ["meta" "description"] "System C compiler" cc_ + " (wrapper script)"; + priority = 10; + mainProgram = if name != "" then name else ccName; + }; +} diff --git a/pkgs/build-support/cc-wrapper/fortran-hook.sh b/pkgs/build-support/cc-wrapper/fortran-hook.sh new file mode 100644 index 0000000..02da7fd --- /dev/null +++ b/pkgs/build-support/cc-wrapper/fortran-hook.sh @@ -0,0 +1,10 @@ +getTargetRole +getTargetRoleWrapper + +export FC${role_post}=@named_fc@ + +# If unset, assume the default hardening flags. +: ${NIX_HARDENING_ENABLE="@default_hardening_flags_str@"} +export NIX_HARDENING_ENABLE + +unset -v role_post diff --git a/pkgs/build-support/cc-wrapper/gnat-wrapper.sh b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh new file mode 100644 index 0000000..e75eb3e --- /dev/null +++ b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh @@ -0,0 +1,182 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +path_backup="$PATH" + +# That @-vars are substituted separately from bash evaluation makes +# shellcheck think this, and others like it, are useless conditionals. +# shellcheck disable=SC2157 +if [[ -n "@coreutils_bin@" && -n "@gnugrep_bin@" ]]; then + PATH="@coreutils_bin@/bin:@gnugrep_bin@/bin" +fi + +cInclude=0 + +source @out@/nix-support/utils.bash + +# Flirting with a layer violation here. +if [ -z "${NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @bintools@/nix-support/add-flags.sh +fi + +# Put this one second so libc ldflags take priority. +if [ -z "${NIX_CC_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-flags.sh +fi + +if [ -z "${NIX_GNAT_WRAPPER_EXTRA_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-gnat-extra-flags.sh +fi + +# Parse command line options and set several variables. +# For instance, figure out if linker flags should be passed. +# GCC prints annoying warnings when they are not needed. +dontLink=0 +nonFlagArgs=0 +# shellcheck disable=SC2193 + +expandResponseParams "$@" +declare -i n=0 +nParams=${#params[@]} +while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + if [ "$p" = -c ]; then + dontLink=1 + elif [ "$p" = -S ]; then + dontLink=1 + elif [ "$p" = -E ]; then + dontLink=1 + elif [ "$p" = -E ]; then + dontLink=1 + elif [ "$p" = -M ]; then + dontLink=1 + elif [ "$p" = -MM ]; then + dontLink=1 + elif [[ "$p" = -x && "$p2" = *-header ]]; then + dontLink=1 + elif [[ "$p" != -?* ]]; then + # A dash alone signifies standard input; it is not a flag + nonFlagArgs=1 + fi + n+=1 +done + +# If we pass a flag like -Wl, then gcc will call the linker unless it +# can figure out that it has to do something else (e.g., because of a +# "-c" flag). So if no non-flag arguments are given, don't pass any +# linker flags. This catches cases like "gcc" (should just print +# "gcc: no input files") and "gcc -v" (should print the version). +if [ "$nonFlagArgs" = 0 ]; then + dontLink=1 +fi + +# Optionally filter out paths not refering to the store. +if [[ "${NIX_ENFORCE_PURITY:-}" = 1 && -n "$NIX_STORE" ]]; then + rest=() + nParams=${#params[@]} + declare -i n=0 + while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + if [ "${p:0:3}" = -L/ ] && badPath "${p:2}"; then + skip "${p:2}" + elif [ "$p" = -L ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "${p:0:3}" = -I/ ] && badPath "${p:2}"; then + skip "${p:2}" + elif [ "$p" = -I ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "${p:0:4}" = -aI/ ] && badPath "${p:3}"; then + skip "${p:3}" + elif [ "$p" = -aI ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "${p:0:4}" = -aO/ ] && badPath "${p:3}"; then + skip "${p:3}" + elif [ "$p" = -aO ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -isystem ] && badPath "$p2"; then + n+=1; skip "$p2" + else + rest+=("$p") + fi + n+=1 + done + # Old bash empty array hack + params=(${rest+"${rest[@]}"}) +fi + + +# Clear march/mtune=native -- they bring impurity. +if [ "$NIX_ENFORCE_NO_NATIVE_@suffixSalt@" = 1 ]; then + rest=() + # Old bash empty array hack + for p in ${params+"${params[@]}"}; do + if [[ "$p" = -m*=native ]]; then + skip "$p" + else + rest+=("$p") + fi + done + # Old bash empty array hack + params=(${rest+"${rest[@]}"}) +fi + +case "$(basename $0)x" in + "gnatbindx") + extraBefore=() + extraAfter=($NIX_GNATFLAGS_COMPILE_@suffixSalt@) + ;; + "gnatchopx") + extraBefore=("--GCC=@out@/bin/gcc") + extraAfter=() + ;; + "gnatcleanx") + extraBefore=($NIX_GNATFLAGS_COMPILE_@suffixSalt@) + extraAfter=() + ;; + "gnatlinkx") + extraBefore=() + extraAfter=("--GCC=@out@/bin/gcc") + ;; + "gnatlsx") + extraBefore=() + extraAfter=($NIX_GNATFLAGS_COMPILE_@suffixSalt@) + ;; + "gnatmakex") + extraBefore=("--GNATBIND=@out@/bin/gnatbind" "--GNATLINK=@out@/bin/gnatlink") + extraAfter=($NIX_GNATFLAGS_COMPILE_@suffixSalt@ -cargs $NIX_GNATMAKE_CARGS_@suffixSalt@) + ;; +esac + +# As a very special hack, if the arguments are just `-v', then don't +# add anything. This is to prevent `gcc -v' (which normally prints +# out the version number and returns exit code 0) from printing out +# `No input files specified' and returning exit code 1. +if [ "$*" = -v ]; then + extraAfter=() + extraBefore=() +fi + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see ld-wrapper for explanation. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +PATH="$path_backup" +# Old bash workaround, see above. +exec @prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} diff --git a/pkgs/build-support/cc-wrapper/go-wrapper.sh b/pkgs/build-support/cc-wrapper/go-wrapper.sh new file mode 100644 index 0000000..5dfc5d2 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/go-wrapper.sh @@ -0,0 +1,11 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +export GCCGO="@out@/bin/gccgo" + +exec @prog@ "$@" diff --git a/pkgs/build-support/cc-wrapper/setup-hook.sh b/pkgs/build-support/cc-wrapper/setup-hook.sh new file mode 100644 index 0000000..33a2b62 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/setup-hook.sh @@ -0,0 +1,118 @@ +# CC Wrapper hygiene +# +# For at least cross compilation, we need to depend on multiple cc-wrappers at +# once---specifically up to one per sort of dependency. This follows from having +# different tools targeting different platforms, and different flags for those +# tools. For example: +# +# # Flags for compiling (whether or not linking) C code for the... +# NIX_CFLAGS_COMPILE_FOR_BUILD # ...build platform +# NIX_CFLAGS_COMPILE # ...host platform +# NIX_CFLAGS_COMPILE_FOR_TARGET # ...target platform +# +# Notice that these platforms are the 3 *relative* to the package using +# cc-wrapper, not absolute like `x86_64-pc-linux-gnu`. +# +# The simplest solution would be to have separate cc-wrappers per (3 intended +# use-cases * n absolute concrete platforms). For the use-case axis, we would +# @-splice in 'BUILD_' '' 'TARGET_' to use the write environment variables when +# building the cc-wrapper, and likewise prefix the binaries' names so they didn't +# clobber each other on the PATH. But the need for 3x cc-wrappers, along with +# non-standard name prefixes, is annoying and liable to break packages' build +# systems. +# +# Instead, we opt to have just one cc-wrapper per absolute platform. Matching +# convention, the binaries' names can just be prefixed with their target +# platform. On the other hand, that means packages will depend on not just +# multiple cc-wrappers, but the exact same cc-wrapper derivation multiple ways. +# That means the exact same cc-wrapper derivation must be able to avoid +# conflicting with itself, despite the fact that `setup-hook.sh`, the `addCvars` +# function, and `add-flags.sh` are all communicating with each other with +# environment variables. Yuck. +# +# The basic strategy is: +# +# - Everyone exclusively *adds information* to relative-platform-specific +# environment variables, like `NIX_CFLAGS_COMPILE_FOR_TARGET`, to communicate +# with the wrapped binaries. +# +# - The wrapped binaries will exclusively *read* cc-wrapper-derivation-specific +# environment variables distinguished with with `suffixSalt`, like +# `NIX_CFLAGS_COMPILE_@suffixSalt@`. +# +# - `add-flags`, beyond its old task of reading extra flags stuck inside the +# cc-wrapper derivation, will convert the relative-platform-specific +# variables to cc-wrapper-derivation-specific variables. This conversion is +# the only time all but one of the cc-wrapper-derivation-specific variables +# are set. +# +# This ensures the flow of information is exclusive from +# relative-platform-specific variables to cc-wrapper-derivation-specific +# variables. This allows us to support the general case of a many--many relation +# between relative platforms and cc-wrapper derivations. +# +# For more details, read the individual files where the mechanisms used to +# accomplish this will be individually documented. + +# Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a +# native compile. +# +# TODO(@Ericson2314): No native exception +[[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0 + +# It's fine that any other cc-wrapper will redefine this. Bash functions close +# over no state, and there's no @-substitutions within, so any redefined +# function is guaranteed to be exactly the same. +ccWrapper_addCVars () { + # See ../setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + if [ -d "$1/include" ]; then + export NIX_CFLAGS_COMPILE${role_post}+=" -isystem $1/include" + fi + + if [ -d "$1/Library/Frameworks" ]; then + export NIX_CFLAGS_COMPILE${role_post}+=" -iframework $1/Library/Frameworks" + fi +} + +# See ../setup-hooks/role.bash +getTargetRole +getTargetRoleWrapper + +# We use the `targetOffset` to choose the right env hook to accumulate the right +# sort of deps (those with that offset). +addEnvHooks "$targetOffset" ccWrapper_addCVars + +# Note 1: these come *after* $out in the PATH (see setup.sh). +# Note 2: phase separation makes this look useless to shellcheck. + +# shellcheck disable=SC2157 +if [ -n "@cc@" ]; then + addToSearchPath _PATH @cc@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@libc_bin@" ]; then + addToSearchPath _PATH @libc_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + addToSearchPath _PATH @coreutils_bin@/bin +fi + +# Export tool environment variables so various build systems use the right ones. + +export NIX_CC${role_post}=@out@ + +export CC${role_post}=@named_cc@ +export CXX${role_post}=@named_cxx@ + +# If unset, assume the default hardening flags. +: ${NIX_HARDENING_ENABLE="@default_hardening_flags_str@"} +export NIX_HARDENING_ENABLE + +# No local scope in sourced file +unset -v role_post diff --git a/pkgs/build-support/checkpoint-build.nix b/pkgs/build-support/checkpoint-build.nix new file mode 100644 index 0000000..f1202ca --- /dev/null +++ b/pkgs/build-support/checkpoint-build.nix @@ -0,0 +1,95 @@ +{ lib +, buildPackages +}: + +let + # rudimentary support for cross-compiling + # see: https://github.com/NixOS/nixpkgs/pull/279487#discussion_r1444449726 + inherit (buildPackages) + mktemp + rsync + ; +in + +rec { + /* Prepare a derivation for local builds. + * + * This function prepares checkpoint builds by storing + * the build output and the sources for cross checking. + * The build output can be used later to allow checkpoint builds + * by passing the derivation output to the `mkCheckpointBuild` function. + * + * To build a project with checkpoints, follow these steps: + * - run `prepareCheckpointBuild` on the desired derivation, e.g. + * checkpointArtifacts = prepareCheckpointBuild virtualbox; + * - change something you want in the sources of the package, + * e.g. using source override: + * changedVBox = pkgs.virtuabox.overrideAttrs (old: { + * src = path/to/vbox/sources; + * }; + * - use `mkCheckpointBuild changedVBox checkpointArtifacts` + * - enjoy shorter build times + */ + prepareCheckpointBuild = drv: drv.overrideAttrs (old: { + outputs = [ "out" ]; + name = drv.name + "-checkpointArtifacts"; + # To determine differences between the state of the build directory + # from an earlier build and a later one we store the state of the build + # directory before build, but after patch phases. + # This way, the same derivation can be used multiple times and only changes are detected. + # Additionally, removed files are handled correctly in later builds. + preBuild = (old.preBuild or "") + '' + mkdir -p $out/sources + cp -r ./* $out/sources/ + ''; + + # After the build, the build directory is copied again + # to get the output files. + # We copy the complete build folder, to take care of + # build tools that build in the source directory, instead of + # having a separate build directory such as the Linux kernel. + installPhase = '' + runHook preCheckpointInstall + mkdir -p $out/outputs + cp -r ./* $out/outputs/ + runHook postCheckpointInstall + unset postPhases + ''; + + dontFixup = true; + doInstallCheck = false; + doDist = false; + }); + + /* Build a derivation based on the checkpoint output generated by + * the `prepareCheckpointBuild` function. + * + * Usage: + * let + * checkpointArtifacts = prepareCheckpointBuild drv; + * in mkCheckpointBuild drv checkpointArtifacts + */ + mkCheckpointBuild = drv: checkpointArtifacts: drv.overrideAttrs (old: { + # The actual checkpoint build phase. + # We compare the changed sources from a previous build with the current and create a patch. + # Afterwards we clean the build directory and copy the previous output files (including the sources). + # The source difference patch is then applied to get the latest changes again to allow short build times. + preBuild = (old.preBuild or "") + '' + set +e + sourceDifferencePatchFile=$(${mktemp}/bin/mktemp) + diff -ur ${checkpointArtifacts}/sources ./ > "$sourceDifferencePatchFile" + set -e + shopt -s dotglob + rm -r * + ${rsync}/bin/rsync \ + --checksum --times --atimes --chown=$USER:$USER --chmod=+w \ + -r ${checkpointArtifacts}/outputs/ . + patch -p 1 -i "$sourceDifferencePatchFile" + rm "$sourceDifferencePatchFile" + ''; + }); + + mkCheckpointedBuild = lib.warn + "`mkCheckpointedBuild` is deprecated, use `mkCheckpointBuild` instead!" + mkCheckpointBuild; +} diff --git a/pkgs/build-support/closure-info.nix b/pkgs/build-support/closure-info.nix new file mode 100644 index 0000000..f2aa496 --- /dev/null +++ b/pkgs/build-support/closure-info.nix @@ -0,0 +1,42 @@ +# This derivation builds two files containing information about the +# closure of 'rootPaths': $out/store-paths contains the paths in the +# closure, and $out/registration contains a file suitable for use with +# "nix-store --load-db" and "nix-store --register-validity +# --hash-given". + +{ stdenv, coreutils, jq }: + +{ rootPaths }: + +assert builtins.langVersion >= 5; + +stdenv.mkDerivation { + name = "closure-info"; + + __structuredAttrs = true; + + exportReferencesGraph.closure = rootPaths; + + preferLocalBuild = true; + + nativeBuildInputs = [ coreutils jq ]; + + empty = rootPaths == []; + + buildCommand = + '' + out=''${outputs[out]} + + mkdir $out + + if [[ -n "$empty" ]]; then + echo 0 > $out/total-nar-size + touch $out/registration $out/store-paths + else + jq -r ".closure | map(.narSize) | add" < "$NIX_ATTRS_JSON_FILE" > $out/total-nar-size + jq -r '.closure | map([.path, .narHash, .narSize, "", (.references | length)] + .references) | add | map("\(.)\n") | add' < "$NIX_ATTRS_JSON_FILE" | head -n -1 > $out/registration + jq -r '.closure[].path' < "$NIX_ATTRS_JSON_FILE" > $out/store-paths + fi + + ''; +} diff --git a/pkgs/build-support/coq/default.nix b/pkgs/build-support/coq/default.nix new file mode 100644 index 0000000..6036d0f --- /dev/null +++ b/pkgs/build-support/coq/default.nix @@ -0,0 +1,155 @@ +{ lib, stdenv, coqPackages, coq, which, fetchzip }@args: + +let + lib = import ./extra-lib.nix { + inherit (args) lib; + }; + + inherit (lib) + concatStringsSep + flip + foldl + isFunction + isString + optional + optionalAttrs + optionals + optionalString + pred + remove + switch + versions + ; + + inherit (lib.attrsets) removeAttrs; + inherit (lib.strings) match; + + isGitHubDomain = d: match "^github.*" d != null; + isGitLabDomain = d: match "^gitlab.*" d != null; +in + +{ pname, + version ? null, + fetcher ? null, + owner ? "coq-community", + domain ? "github.com", + repo ? pname, + defaultVersion ? null, + releaseRev ? (v: v), + displayVersion ? {}, + release ? {}, + buildInputs ? [], + nativeBuildInputs ? [], + extraBuildInputs ? [], + extraNativeBuildInputs ? [], + overrideBuildInputs ? [], + overrideNativeBuildInputs ? [], + namePrefix ? [ "coq" ], + enableParallelBuilding ? true, + extraInstallFlags ? [], + setCOQBIN ? true, + mlPlugin ? false, + useMelquiondRemake ? null, + dropAttrs ? [], + keepAttrs ? [], + dropDerivationAttrs ? [], + useDuneifVersion ? (x: false), + useDune ? false, + opam-name ? (concatStringsSep "-" (namePrefix ++ [ pname ])), + ... +}@args: +let + args-to-remove = foldl (flip remove) ([ + "version" "fetcher" "repo" "owner" "domain" "releaseRev" + "displayVersion" "defaultVersion" "useMelquiondRemake" + "release" + "buildInputs" "nativeBuildInputs" + "extraBuildInputs" "extraNativeBuildInputs" + "overrideBuildInputs" "overrideNativeBuildInputs" + "namePrefix" + "meta" "useDuneifVersion" "useDune" "opam-name" + "extraInstallFlags" "setCOQBIN" "mlPlugin" + "dropAttrs" "dropDerivationAttrs" "keepAttrs" ] ++ dropAttrs) keepAttrs; + fetch = import ../coq/meta-fetch/default.nix + { inherit lib stdenv fetchzip; } ({ + inherit release releaseRev; + location = { inherit domain owner repo; }; + } // optionalAttrs (args?fetcher) {inherit fetcher;}); + fetched = fetch (if version != null then version else defaultVersion); + display-pkg = n: sep: v: + let d = displayVersion.${n} or (if sep == "" then ".." else true); in + n + optionalString (v != "" && v != null) (switch d [ + { case = true; out = sep + v; } + { case = "."; out = sep + versions.major v; } + { case = ".."; out = sep + versions.majorMinor v; } + { case = "..."; out = sep + versions.majorMinorPatch v; } + { case = isFunction; out = optionalString (d v != "") (sep + d v); } + { case = isString; out = optionalString (d != "") (sep + d); } + ] "") + optionalString (v == null) "-broken"; + append-version = p: n: p + display-pkg n "" coqPackages.${n}.version + "-"; + prefix-name = foldl append-version "" namePrefix; + useDune = args.useDune or (useDuneifVersion fetched.version); + coqlib-flags = switch coq.coq-version [ + { case = v: versions.isLe "8.6" v && v != "dev" ; + out = [ "COQLIB=$(out)/lib/coq/${coq.coq-version}/" ]; } + ] [ "COQLIBINSTALL=$(out)/lib/coq/${coq.coq-version}/user-contrib" + "COQPLUGININSTALL=$(OCAMLFIND_DESTDIR)" ]; + docdir-flags = switch coq.coq-version [ + { case = v: versions.isLe "8.6" v && v != "dev"; + out = [ "DOCDIR=$(out)/share/coq/${coq.coq-version}/" ]; } + ] [ "COQDOCINSTALL=$(out)/share/coq/${coq.coq-version}/user-contrib" ]; +in + +stdenv.mkDerivation (removeAttrs ({ + + name = prefix-name + (display-pkg pname "-" fetched.version); + + inherit (fetched) version src; + + nativeBuildInputs = args.overrideNativeBuildInputs + or ([ which ] + ++ optional useDune coq.ocamlPackages.dune_3 + ++ optionals (useDune || mlPlugin) [ coq.ocamlPackages.ocaml coq.ocamlPackages.findlib ] + ++ (args.nativeBuildInputs or []) ++ extraNativeBuildInputs); + buildInputs = args.overrideBuildInputs + or ([ coq ] ++ (args.buildInputs or []) ++ extraBuildInputs); + inherit enableParallelBuilding; + + meta = ({ platforms = coq.meta.platforms; } // + (switch domain [{ + case = pred.union isGitHubDomain isGitLabDomain; + out = { homepage = "https://${domain}/${owner}/${repo}"; }; + }] {}) // + optionalAttrs (fetched.broken or false) { coqFilter = true; broken = true; }) // + (args.meta or {}) ; + +} +// (optionalAttrs setCOQBIN { COQBIN = "${coq}/bin/"; }) +// (optionalAttrs (!args?installPhase && !args?useMelquiondRemake) { + installFlags = + coqlib-flags ++ docdir-flags ++ + extraInstallFlags; +}) +// (optionalAttrs useDune { + buildPhase = '' + runHook preBuild + dune build -p ${opam-name} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES} + runHook postBuild + ''; + installPhase = '' + runHook preInstall + dune install ${opam-name} --prefix=$out + mv $out/lib/coq $out/lib/TEMPORARY + mkdir $out/lib/coq/ + mv $out/lib/TEMPORARY $out/lib/coq/${coq.coq-version} + runHook postInstall + ''; +}) +// (optionalAttrs (args?useMelquiondRemake) rec { + COQUSERCONTRIB = "$out/lib/coq/${coq.coq-version}/user-contrib"; + preConfigurePhases = "autoconf"; + configureFlags = [ "--libdir=${COQUSERCONTRIB}/${useMelquiondRemake.logpath or ""}" ]; + buildPhase = "./remake -j$NIX_BUILD_CORES"; + installPhase = "./remake install"; +}) +// (removeAttrs args args-to-remove)) dropDerivationAttrs) diff --git a/pkgs/build-support/coq/extra-lib.nix b/pkgs/build-support/coq/extra-lib.nix new file mode 100644 index 0000000..94de7c0 --- /dev/null +++ b/pkgs/build-support/coq/extra-lib.nix @@ -0,0 +1,213 @@ +{ lib }: + +let + inherit (lib) + all + concatStringsSep + findFirst + flip + getAttr + head + isFunction + length + recursiveUpdate + splitVersion + tail + take + versionAtLeast + versionOlder + zipListsWith + ; +in +recursiveUpdate lib (rec { + + versions = + let + truncate = n: v: concatStringsSep "." (take n (splitVersion v)); + opTruncate = op: v0: v: let n = length (splitVersion v0); in + op (truncate n v) (truncate n v0); + in rec { + + /* Get string of the first n parts of a version string. + + Example: + - truncate 2 "1.2.3-stuff" + => "1.2" + + - truncate 4 "1.2.3-stuff" + => "1.2.3.stuff" + */ + + inherit truncate; + + /* Get string of the first three parts (major, minor and patch) + of a version string. + + Example: + majorMinorPatch "1.2.3-stuff" + => "1.2.3" + */ + majorMinorPatch = truncate 3; + + /* Version comparison predicates, + - isGe v0 v <-> v is greater or equal than v0 [*] + - isLe v0 v <-> v is lesser or equal than v0 [*] + - isGt v0 v <-> v is strictly greater than v0 [*] + - isLt v0 v <-> v is strictly lesser than v0 [*] + - isEq v0 v <-> v is equal to v0 [*] + - range low high v <-> v is between low and high [**] + + [*] truncating v to the same number of digits as v0 + [**] truncating v to low for the lower bound and high for the upper bound + + Examples: + - isGe "8.10" "8.10.1" + => true + - isLe "8.10" "8.10.1" + => true + - isGt "8.10" "8.10.1" + => false + - isGt "8.10.0" "8.10.1" + => true + - isEq "8.10" "8.10.1" + => true + - range "8.10" "8.11" "8.11.1" + => true + - range "8.10" "8.11+" "8.11.0" + => false + - range "8.10" "8.11+" "8.11+beta1" + => false + + */ + isGe = opTruncate versionAtLeast; + isGt = opTruncate (flip versionOlder); + isLe = opTruncate (flip versionAtLeast); + isLt = opTruncate versionOlder; + isEq = opTruncate pred.equal; + range = low: high: pred.inter (versions.isGe low) (versions.isLe high); + }; + + /* Returns a list of list, splitting it using a predicate. + This is analoguous to builtins.split sep list, + with a predicate as a separator and a list instead of a string. + + Type: splitList :: (a -> bool) -> [a] -> [[a]] + + Example: + splitList (x: x == "x") [ "y" "x" "z" "t" ] + => [ [ "y" ] "x" [ "z" "t" ] ] + */ + splitList = pred: l: # put in file lists + let loop = (vv: v: l: if l == [] then vv ++ [v] + else let hd = head l; tl = tail l; in + if pred hd then loop (vv ++ [ v hd ]) [] tl else loop vv (v ++ [hd]) tl); + in loop [] [] l; + + pred = { + /* Predicate intersection, union, and complement */ + inter = p: q: x: p x && q x; + union = p: q: x: p x || q x; + compl = p: x: ! p x; + true = p: true; + false = p: false; + + /* predicate "being equal to y" */ + equal = y: x: x == y; + }; + + /* Emulate a "switch - case" construct, + instead of relying on `if then else if ...` */ + /* Usage: + ```nix + switch-if [ + if-clause-1 + .. + if-clause-k + ] default-out + ``` + where a if-clause has the form `{ cond = b; out = r; }` + the first branch such as `b` is true */ + + switch-if = c: d: (findFirst (getAttr "cond") {} c).out or d; + + /* Usage: + ```nix + switch x [ + simple-clause-1 + .. + simple-clause-k + ] default-out + ``` + where a simple-clause has the form `{ case = p; out = r; }` + the first branch such as `p x` is true + or + ```nix + switch [ x1 .. xn ] [ + complex-clause-1 + .. + complex-clause-k + ] default-out + ``` + where a complex-clause is either a simple-clause + or has the form { cases = [ p1 .. pn ]; out = r; } + in which case the first branch such as all `pi x` are true + + if the variables p are not functions, + they are converted to a equal p + if out is missing the default-out is taken */ + + switch = var: clauses: default: with pred; let + compare = f: if isFunction f then f else equal f; + combine = cl: var: + if cl?case then compare cl.case var + else all (equal true) (zipListsWith compare cl.cases var); in + switch-if (map (cl: { cond = combine cl var; inherit (cl) out; }) clauses) default; + + /* Override arguments to mkCoqDerivation for a Coq library. + + This function allows you to easily override arguments to mkCoqDerivation, + even when they are not exposed by the Coq library directly. + + Type: overrideCoqDerivation :: AttrSet -> CoqLibraryDerivation -> CoqLibraryDerivation + + Example: + + ```nix + coqPackages.lib.overrideCoqDerivation + { + defaultVersion = "9999"; + release."9999".sha256 = "1lq8x86vd3vqqh2yq6hvyagpnhfq5wmk5pg2z0xq7b7dbbbhyfkw"; + } + coqPackages.QuickChick; + ``` + + This example overrides the `defaultVersion` and `release` arguments that + are passed to `mkCoqDerivation` in the QuickChick derivation. + + Note that there is a difference between using `.override` on a Coq + library vs this `overrideCoqDerivation` function. `.override` allows you + to modify arguments to the derivation itself, for instance by passing + different versions of dependencies: + + ```nix + coqPackages.QuickChick.override { ssreflect = my-cool-ssreflect; } + ``` + + whereas `overrideCoqDerivation` allows you to override arguments to the + call to `mkCoqDerivation` in the Coq library. + + Note that all Coq libraries in Nixpkgs have a `version` argument for + easily using a different version. So if all you want to do is use a + different version, and the derivation for the Coq library already has + support for the version you want, you likely only need to update the + `version` argument on the library derivation. This is done with + `.override`: + + ```nix + coqPackages.QuickChick.override { version = "1.4.0"; } + ``` + */ + overrideCoqDerivation = f: drv: (drv.override (args: { + mkCoqDerivation = drv_: (args.mkCoqDerivation drv_).override f; + })); +}) diff --git a/pkgs/build-support/coq/meta-fetch/default.nix b/pkgs/build-support/coq/meta-fetch/default.nix new file mode 100644 index 0000000..daed9fa --- /dev/null +++ b/pkgs/build-support/coq/meta-fetch/default.nix @@ -0,0 +1,95 @@ +{ lib, stdenv, fetchzip }@args: + +let + lib = import ../extra-lib.nix { + inherit (args) lib; + }; + + inherit (lib) + attrNames + fakeSha256 + filter + findFirst + head + isAttrs + isPath + isString + last + length + optionalAttrs + pathExists + pred + sort + switch + switch-if + versionAtLeast + versions + ; + + inherit (lib.strings) match split; + + default-fetcher = {domain ? "github.com", owner ? "", repo, rev, name ? "source", sha256 ? null, ...}@args: + let ext = if args?sha256 then "zip" else "tar.gz"; + fmt = if args?sha256 then "zip" else "tarball"; + pr = match "^#(.*)$" rev; + url = switch-if [ + { cond = pr == null && (match "^github.*" domain) != null; + out = "https://${domain}/${owner}/${repo}/archive/${rev}.${ext}"; } + { cond = pr != null && (match "^github.*" domain) != null; + out = "https://api.${domain}/repos/${owner}/${repo}/${fmt}/pull/${head pr}/head"; } + { cond = pr == null && (match "^gitlab.*" domain) != null; + out = "https://${domain}/${owner}/${repo}/-/archive/${rev}/${repo}-${rev}.${ext}"; } + { cond = (match "(www.)?mpi-sws.org" domain) != null; + out = "https://www.mpi-sws.org/~${owner}/${repo}/download/${repo}-${rev}.${ext}";} + ] (throw "meta-fetch: no fetcher found for domain ${domain} on ${rev}"); + fetch = x: if args?sha256 then fetchzip (x // { inherit sha256; }) else builtins.fetchTarball x; + in fetch { inherit url ; }; +in +{ + fetcher ? default-fetcher, + location, + release ? {}, + releaseRev ? (v: v), +}: +let isVersion = x: isString x && match "^/.*" x == null && release?${x}; + shortVersion = x: if (isString x && match "^/.*" x == null) + then findFirst (v: versions.majorMinor v == x) null + (sort versionAtLeast (attrNames release)) + else null; + isShortVersion = x: shortVersion x != null; + isPathString = x: isString x && match "^/.*" x != null && pathExists x; in +arg: +switch arg [ + { case = isNull; out = { version = "broken"; src = ""; broken = true; }; } + { case = isPathString; out = { version = "dev"; src = arg; }; } + { case = pred.union isVersion isShortVersion; + out = let + v = if isVersion arg then arg else shortVersion arg; + given-sha256 = release.${v}.sha256 or ""; + sha256 = if given-sha256 == "" then fakeSha256 else given-sha256; + rv = release.${v} // { inherit sha256; }; + in + { + version = rv.version or v; + src = rv.src or fetcher (location // { rev = releaseRev v; } // rv); + }; + } + { case = isString; + out = let + splitted = filter isString (split ":" arg); + rev = last splitted; + has-owner = length splitted > 1; + version = "dev"; in { + inherit version; + src = fetcher (location // { inherit rev; } // + (optionalAttrs has-owner { owner = head splitted; })); + }; } + { case = isAttrs; + out = { + version = arg.version or "dev"; + src = (arg.fetcher or fetcher) (location // (arg.location or {})); }; } + { case = isPath; + out = { + version = "dev" ; + src = builtins.path {path = arg; name = location.name or "source";}; }; } +] (throw "not a valid source description") diff --git a/pkgs/build-support/dart/build-dart-application/default.nix b/pkgs/build-support/dart/build-dart-application/default.nix new file mode 100644 index 0000000..c99b8bb --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/default.nix @@ -0,0 +1,132 @@ +{ lib +, stdenv +, callPackage +, runCommand +, writeText +, pub2nix +, dartHooks +, makeWrapper +, dart +, nodejs +, darwin +, jq +, yq +}: + +{ src +, sourceRoot ? "source" +, packageRoot ? (lib.removePrefix "/" (lib.removePrefix "source" sourceRoot)) +, gitHashes ? { } +, sdkSourceBuilders ? { } +, customSourceBuilders ? { } + +, sdkSetupScript ? "" +, extraPackageConfigSetup ? "" + + # Output type to produce. Can be any kind supported by dart + # https://dart.dev/tools/dart-compile#types-of-output + # If using jit, you might want to pass some arguments to `dartJitFlags` +, dartOutputType ? "exe" +, dartCompileCommand ? "dart compile" +, dartCompileFlags ? [ ] + # These come at the end of the command, useful to pass flags to the jit run +, dartJitFlags ? [ ] + + # Attrset of entry point files to build and install. + # Where key is the final binary path and value is the source file path + # e.g. { "bin/foo" = "bin/main.dart"; } + # Set to null to read executables from pubspec.yaml +, dartEntryPoints ? null + # Used when wrapping aot, jit, kernel, and js builds. + # Set to null to disable wrapping. +, dartRuntimeCommand ? if dartOutputType == "aot-snapshot" then "${dart}/bin/dartaotruntime" + else if (dartOutputType == "jit-snapshot" || dartOutputType == "kernel") then "${dart}/bin/dart" + else if dartOutputType == "js" then "${nodejs}/bin/node" + else null + +, runtimeDependencies ? [ ] +, extraWrapProgramArgs ? "" + +, autoPubspecLock ? null +, pubspecLock ? if autoPubspecLock == null then + throw "The pubspecLock argument is required. If import-from-derivation is allowed (it isn't in Nixpkgs), you can set autoPubspecLock to the path to a pubspec.lock instead." + else + assert lib.assertMsg (builtins.pathExists autoPubspecLock) "The pubspec.lock file could not be found!"; + lib.importJSON (runCommand "${lib.getName args}-pubspec-lock-json" { nativeBuildInputs = [ yq ]; } ''yq . '${autoPubspecLock}' > "$out"'') +, ... +}@args: + +let + generators = callPackage ./generators.nix { inherit dart; } { buildDrvArgs = args; }; + + pubspecLockFile = builtins.toJSON pubspecLock; + pubspecLockData = pub2nix.readPubspecLock { inherit src packageRoot pubspecLock gitHashes sdkSourceBuilders customSourceBuilders; }; + packageConfig = generators.linkPackageConfig { + packageConfig = pub2nix.generatePackageConfig { + pname = if args.pname != null then "${args.pname}-${args.version}" else null; + + dependencies = + # Ideally, we'd only include the main dependencies and their transitive + # dependencies. + # + # The pubspec.lock file does not contain information about where + # transitive dependencies come from, though, and it would be weird to + # include the transitive dependencies of dev and override dependencies + # without including the dev and override dependencies themselves. + builtins.concatLists (builtins.attrValues pubspecLockData.dependencies); + + inherit (pubspecLockData) dependencySources; + }; + extraSetupCommands = extraPackageConfigSetup; + }; + + inherit (dartHooks.override { inherit dart; }) dartConfigHook dartBuildHook dartInstallHook dartFixupHook; + + baseDerivation = stdenv.mkDerivation (finalAttrs: (builtins.removeAttrs args [ "gitHashes" "sdkSourceBuilders" "pubspecLock" "customSourceBuilders" ]) // { + inherit pubspecLockFile packageConfig sdkSetupScript + dartCompileCommand dartOutputType dartRuntimeCommand dartCompileFlags + dartJitFlags; + + outputs = [ "out" "pubcache" ] ++ args.outputs or [ ]; + + dartEntryPoints = + if (dartEntryPoints != null) + then writeText "entrypoints.json" (builtins.toJSON dartEntryPoints) + else null; + + runtimeDependencies = map lib.getLib runtimeDependencies; + + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ + dart + dartConfigHook + dartBuildHook + dartInstallHook + dartFixupHook + makeWrapper + jq + ] ++ lib.optionals stdenv.isDarwin [ + darwin.sigtool + ] ++ + # Ensure that we inherit the propagated build inputs from the dependencies. + builtins.attrValues pubspecLockData.dependencySources; + + preConfigure = args.preConfigure or "" + '' + ln -sf "$pubspecLockFilePath" pubspec.lock + ''; + + # When stripping, it seems some ELF information is lost and the dart VM cli + # runs instead of the expected program. Don't strip if it's an exe output. + dontStrip = args.dontStrip or (dartOutputType == "exe"); + + passAsFile = [ "pubspecLockFile" ]; + + passthru = { + pubspecLock = pubspecLockData; + } // (args.passthru or { }); + + meta = (args.meta or { }) // { platforms = args.meta.platforms or dart.meta.platforms; }; + }); +in +assert !(builtins.isString dartOutputType && dartOutputType != "") -> +throw "dartOutputType must be a non-empty string"; +baseDerivation diff --git a/pkgs/build-support/dart/build-dart-application/generators.nix b/pkgs/build-support/dart/build-dart-application/generators.nix new file mode 100644 index 0000000..f01a093 --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/generators.nix @@ -0,0 +1,74 @@ +{ lib +, stdenvNoCC +, dart +, dartHooks +, jq +, yq +, cacert +}: + +{ + # Arguments used in the derivation that builds the Dart package. + # Passing these is recommended to ensure that the same steps are made to + # prepare the sources in both this derivation and the one that builds the Dart + # package. + buildDrvArgs ? { } +, ... +}@args: + +# This is a derivation and setup hook that can be used to fetch dependencies for Dart projects. +# It is designed to be placed in the nativeBuildInputs of a derivation that builds a Dart package. +# Providing the buildDrvArgs argument is highly recommended. +let + buildDrvInheritArgNames = [ + "name" + "pname" + "version" + "src" + "sourceRoot" + "setSourceRoot" + "preUnpack" + "unpackPhase" + "unpackCmd" + "postUnpack" + "prePatch" + "patchPhase" + "patches" + "patchFlags" + "postPatch" + ]; + + buildDrvInheritArgs = builtins.foldl' + (attrs: arg: + if buildDrvArgs ? ${arg} + then attrs // { ${arg} = buildDrvArgs.${arg}; } + else attrs) + { } + buildDrvInheritArgNames; + + drvArgs = buildDrvInheritArgs // (removeAttrs args [ "buildDrvArgs" ]); + name = (if drvArgs ? name then drvArgs.name else "${drvArgs.pname}-${drvArgs.version}"); + + # Adds the root package to a dependency package_config.json file from pub2nix. + linkPackageConfig = { packageConfig, extraSetupCommands ? "" }: stdenvNoCC.mkDerivation (drvArgs // { + name = "${name}-package-config-with-root.json"; + + nativeBuildInputs = drvArgs.nativeBuildInputs or [ ] ++ args.nativeBuildInputs or [ ] ++ [ jq yq ]; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + packageName="$(yq --raw-output .name pubspec.yaml)" + jq --arg name "$packageName" '.packages |= . + [{ name: $name, rootUri: "../", packageUri: "lib/" }]' '${packageConfig}' > "$out" + ${extraSetupCommands} + + runHook postInstall + ''; + }); +in +{ + inherit + linkPackageConfig; +} diff --git a/pkgs/build-support/dart/build-dart-application/hooks/dart-build-hook.sh b/pkgs/build-support/dart/build-dart-application/hooks/dart-build-hook.sh new file mode 100644 index 0000000..23ebfbd --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/hooks/dart-build-hook.sh @@ -0,0 +1,34 @@ +# shellcheck shell=bash + +# Outputs line-separated "${dest}\t${source}" +_getDartEntryPoints() { + if [ -n "$dartEntryPoints" ]; then + @jq@ -r '(to_entries | map(.key + "\t" + .value) | join("\n"))' "$dartEntryPoints" + else + # The pubspec executables section follows the pattern: + # : [source-file-name] + # Where source-file-name defaults to output-bin-name if omited + @yq@ -r '(.executables | to_entries | map("bin/" + .key + "\t" + "bin/" + (.value // .key) + ".dart") | join("\n"))' pubspec.yaml + fi +} + +dartBuildHook() { + echo "Executing dartBuildHook" + + runHook preBuild + + while IFS=$'\t' read -ra target; do + dest="${target[0]}" + src="${target[1]}" + eval "$dartCompileCommand" "$dartOutputType" \ + -o "$dest" "${dartCompileFlags[@]}" "$src" "${dartJitFlags[@]}" + done < <(_getDartEntryPoints) + + runHook postBuild + + echo "Finished dartBuildHook" +} + +if [ -z "${dontDartBuild-}" ] && [ -z "${buildPhase-}" ]; then + buildPhase=dartBuildHook +fi diff --git a/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh b/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh new file mode 100644 index 0000000..50754a7 --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh @@ -0,0 +1,70 @@ +# shellcheck shell=bash + +dartConfigHook() { + echo "Executing dartConfigHook" + + echo "Setting up SDK" + eval "$sdkSetupScript" + + echo "Installing dependencies" + mkdir -p .dart_tool + cp "$packageConfig" .dart_tool/package_config.json + + packagePath() { + jq --raw-output --arg name "$1" '.packages.[] | select(.name == $name) .rootUri | sub("file://"; "")' .dart_tool/package_config.json + } + + # Runs a Dart executable from a package with a custom path. + # + # Usage: + # packageRunCustom [executable] [bin_dir] + # + # By default, [bin_dir] is "bin", and [executable] is . + # i.e. `packageRunCustom build_runner` is equivalent to `packageRunCustom build_runner build_runner bin`, which runs `bin/build_runner.dart` from the build_runner package. + packageRunCustom() { + local args=() + local passthrough=() + + while [ $# -gt 0 ]; do + if [ "$1" != "--" ]; then + args+=("$1") + shift + else + shift + passthrough=("$@") + break + fi + done + + local name="${args[0]}" + local path="${args[1]:-$name}" + local prefix="${args[2]:-bin}" + + dart --packages=.dart_tool/package_config.json "$(packagePath "$name")/$prefix/$path.dart" "${passthrough[@]}" + } + + # Runs a Dart executable from a package. + # + # Usage: + # packageRun [-e executable] [...] + # + # To run an executable from an unconventional location, use packageRunCustom. + packageRun() { + local name="$1" + shift + + local executableName="$name" + if [ "$1" = "-e" ]; then + shift + executableName="$1" + shift + fi + + fileName="$(@yq@ --raw-output --arg name "$executableName" '.executables.[$name] // $name' "$(packagePath "$name")/pubspec.yaml")" + packageRunCustom "$name" "$fileName" -- "$@" + } + + echo "Finished dartConfigHook" +} + +postConfigureHooks+=(dartConfigHook) diff --git a/pkgs/build-support/dart/build-dart-application/hooks/dart-fixup-hook.sh b/pkgs/build-support/dart/build-dart-application/hooks/dart-fixup-hook.sh new file mode 100644 index 0000000..60bd748 --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/hooks/dart-fixup-hook.sh @@ -0,0 +1,35 @@ +# shellcheck shell=bash + +dartFixupHook() { + echo "Executing dartFixupHook" + + declare -a wrapProgramArgs + + # Add runtime library dependencies to the LD_LIBRARY_PATH. + # For some reason, the RUNPATH of the executable is not used to load dynamic libraries in dart:ffi with DynamicLibrary.open(). + # + # This could alternatively be fixed with patchelf --add-needed, but this would cause all the libraries to be opened immediately, + # which is not what application authors expect. + APPLICATION_LD_LIBRARY_PATH="" + for runtimeDependency in "${runtimeDependencies[@]}"; do + addToSearchPath APPLICATION_LD_LIBRARY_PATH "${runtimeDependency}/lib" + done + if [[ ! -z "$APPLICATION_LD_LIBRARY_PATH" ]]; then + wrapProgramArgs+=(--suffix LD_LIBRARY_PATH : \"$APPLICATION_LD_LIBRARY_PATH\") + fi + + if [[ ! -z "$extraWrapProgramArgs" ]]; then + wrapProgramArgs+=("$extraWrapProgramArgs") + fi + + if [ ${#wrapProgramArgs[@]} -ne 0 ]; then + for f in "$out"/bin/*; do + echo "Wrapping $f..." + eval "wrapProgram \"$f\" ${wrapProgramArgs[@]}" + done + fi + + echo "Finished dartFixupHook" +} + +postFixupHooks+=(dartFixupHook) diff --git a/pkgs/build-support/dart/build-dart-application/hooks/dart-install-hook.sh b/pkgs/build-support/dart/build-dart-application/hooks/dart-install-hook.sh new file mode 100644 index 0000000..349a0df --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/hooks/dart-install-hook.sh @@ -0,0 +1,43 @@ +# shellcheck shell=bash + +dartInstallHook() { + echo "Executing dartInstallHook" + + runHook preInstall + + # Install snapshots and executables. + mkdir -p "$out" + while IFS=$'\t' read -ra target; do + dest="${target[0]}" + # Wrap with runtime command, if it's defined + if [ -n "$dartRuntimeCommand" ]; then + install -D "$dest" "$out/share/$dest" + makeWrapper "$dartRuntimeCommand" "$out/$dest" \ + --add-flags "$out/share/$dest" + else + install -Dm755 "$dest" "$out/$dest" + fi + done < <(_getDartEntryPoints) + + runHook postInstall + + echo "Finished dartInstallHook" +} + +dartInstallCacheHook() { + echo "Executing dartInstallCacheHook" + + # Install the package_config.json file. + mkdir -p "$pubcache" + cp .dart_tool/package_config.json "$pubcache/package_config.json" + + echo "Finished dartInstallCacheHook" +} + +if [ -z "${dontDartInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=dartInstallHook +fi + +if [ -z "${dontDartInstallCache-}" ]; then + postInstallHooks+=(dartInstallCacheHook) +fi diff --git a/pkgs/build-support/dart/build-dart-application/hooks/default.nix b/pkgs/build-support/dart/build-dart-application/hooks/default.nix new file mode 100644 index 0000000..253d313 --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/hooks/default.nix @@ -0,0 +1,20 @@ +{ lib, makeSetupHook, dart, yq, jq }: + +{ + dartConfigHook = makeSetupHook { + name = "dart-config-hook"; + substitutions.yq = "${yq}/bin/yq"; + substitutions.jq = "${jq}/bin/jq"; + } ./dart-config-hook.sh; + dartBuildHook = makeSetupHook { + name = "dart-build-hook"; + substitutions.yq = "${yq}/bin/yq"; + substitutions.jq = "${jq}/bin/jq"; + } ./dart-build-hook.sh; + dartInstallHook = makeSetupHook { + name = "dart-install-hook"; + } ./dart-install-hook.sh; + dartFixupHook = makeSetupHook { + name = "dart-fixup-hook"; + } ./dart-fixup-hook.sh; +} diff --git a/pkgs/build-support/dart/pub2nix/default.nix b/pkgs/build-support/dart/pub2nix/default.nix new file mode 100644 index 0000000..ace2cc5 --- /dev/null +++ b/pkgs/build-support/dart/pub2nix/default.nix @@ -0,0 +1,6 @@ +{ callPackage }: + +{ + readPubspecLock = callPackage ./pubspec-lock.nix { }; + generatePackageConfig = callPackage ./package-config.nix { }; +} diff --git a/pkgs/build-support/dart/pub2nix/package-config.nix b/pkgs/build-support/dart/pub2nix/package-config.nix new file mode 100644 index 0000000..70abb0a --- /dev/null +++ b/pkgs/build-support/dart/pub2nix/package-config.nix @@ -0,0 +1,68 @@ +{ lib +, runCommand +, jq +, yq +}: + +{ pname ? null + + # A list of dependency package names. +, dependencies + + # An attribute set of package names to sources. +, dependencySources +}: + +let + packages = lib.genAttrs dependencies (dependency: rec { + src = dependencySources.${dependency}; + inherit (src) packageRoot; + }); +in +(runCommand "${lib.optionalString (pname != null) "${pname}-"}package-config.json" { + inherit packages; + + nativeBuildInputs = [ jq yq ]; + + __structuredAttrs = true; +}) '' + declare -A packageSources + declare -A packageRoots + while IFS=',' read -r name src packageRoot; do + packageSources["$name"]="$src" + packageRoots["$name"]="$packageRoot" + done < <(jq -r '.packages | to_entries | map("\(.key),\(.value.src),\(.value.packageRoot)") | .[]' "$NIX_ATTRS_JSON_FILE") + + for package in "''${!packageSources[@]}"; do + if [ ! -e "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml" ]; then + echo >&2 "The package sources for $package are missing. Is the following path inside the source derivation?" + echo >&2 "Source path: ''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml" + exit 1 + fi + + languageConstraint="$(yq -r .environment.sdk "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml")" + if [[ "$languageConstraint" =~ ^[[:space:]]*(\^|>=|>)?[[:space:]]*([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+.*$ ]]; then + languageVersionJson="\"''${BASH_REMATCH[2]}\"" + elif [ "$languageConstraint" = 'any' ]; then + languageVersionJson='null' + else + # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/language_version.dart#L106C35-L106C35 + languageVersionJson='"2.7"' + fi + + jq --null-input \ + --arg name "$package" \ + --arg path "''${packageSources["$package"]}/''${packageRoots["$package"]}" \ + --argjson languageVersion "$languageVersionJson" \ + '{ + name: $name, + rootUri: "file://\($path)", + packageUri: "lib/", + languageVersion: $languageVersion, + }' + done | jq > "$out" --slurp '{ + configVersion: 2, + generator: "nixpkgs", + packages: ., + }' +'' diff --git a/pkgs/build-support/dart/pub2nix/pubspec-lock.nix b/pkgs/build-support/dart/pub2nix/pubspec-lock.nix new file mode 100644 index 0000000..e1ab4d7 --- /dev/null +++ b/pkgs/build-support/dart/pub2nix/pubspec-lock.nix @@ -0,0 +1,119 @@ +{ lib +, callPackage +, fetchurl +, fetchgit +, runCommand +}: + +{ + # The source directory of the package. + src + + # The package subdirectory within src. + # Useful if the package references sibling packages with relative paths. +, packageRoot ? "." + + # The pubspec.lock file, in attribute set form. +, pubspecLock + + # Hashes for Git dependencies. + # Pub does not record these itself, so they must be manually provided. +, gitHashes ? { } + + # Functions to generate SDK package sources. + # The function names should match the SDK names, and the package name is given as an argument. +, sdkSourceBuilders ? { } + + # Functions that create custom package source derivations. + # + # The function names should match the package names, and the package version, + # source, and source files are given in an attribute set argument. + # + # The passthru of the source derivation should be propagated. +, customSourceBuilders ? { } +}: + +let + dependencyVersions = builtins.mapAttrs (name: details: details.version) pubspecLock.packages; + + dependencyTypes = { + "direct main" = "main"; + "direct dev" = "dev"; + "direct overridden" = "overridden"; + "transitive" = "transitive"; + }; + + dependencies = lib.foldlAttrs + (dependencies: name: details: dependencies // { ${dependencyTypes.${details.dependency}} = dependencies.${dependencyTypes.${details.dependency}} ++ [ name ]; }) + (lib.genAttrs (builtins.attrValues dependencyTypes) (dependencyType: [ ])) + pubspecLock.packages; + + # fetchTarball fails with "tarball contains an unexpected number of top-level files". This is a workaround. + # https://discourse.nixos.org/t/fetchtarball-with-multiple-top-level-directories-fails/20556 + mkHostedDependencySource = name: details: + let + archive = fetchurl { + name = "pub-${name}-${details.version}.tar.gz"; + url = "${details.description.url}/packages/${details.description.name}/versions/${details.version}.tar.gz"; + sha256 = details.description.sha256; + }; + in + runCommand "pub-${name}-${details.version}" { passthru.packageRoot = "."; } '' + mkdir -p "$out" + tar xf '${archive}' -C "$out" + ''; + + mkGitDependencySource = name: details: (fetchgit { + name = "pub-${name}-${details.version}"; + url = details.description.url; + rev = details.description.resolved-ref; + hash = gitHashes.${name} or (throw "A Git hash is required for ${name}! Set to an empty string to obtain it."); + }).overrideAttrs ({ passthru ? { }, ... }: { + passthru = passthru // { + packageRoot = details.description.path; + }; + }); + + mkPathDependencySource = name: details: + assert lib.assertMsg details.description.relative "Only relative paths are supported - ${name} has an absolue path!"; + (if lib.isDerivation src then src else (runCommand "pub-${name}-${details.version}" { } ''cp -r '${src}' "$out"'')).overrideAttrs ({ passthru ? { }, ... }: { + passthru = passthru // { + packageRoot = "${packageRoot}/${details.description.path}"; + }; + }); + + mkSdkDependencySource = name: details: + (sdkSourceBuilders.${details.description} or (throw "No SDK source builder has been given for ${details.description}!")) name; + + addDependencySourceUtils = dependencySource: details: dependencySource.overrideAttrs ({ passthru, ... }: { + passthru = passthru // { + inherit (details) version; + }; + }); + + sourceBuilders = callPackage ../../../development/compilers/dart/package-source-builders { } // customSourceBuilders; + + dependencySources = lib.filterAttrs (name: src: src != null) (builtins.mapAttrs + (name: details: + (sourceBuilders.${name} or ({ src, ... }: src)) { + inherit (details) version source; + src = ((addDependencySourceUtils (({ + "hosted" = mkHostedDependencySource; + "git" = mkGitDependencySource; + "path" = mkPathDependencySource; + "sdk" = mkSdkDependencySource; + }.${details.source} name) details)) details); + }) + pubspecLock.packages); +in +{ + inherit + # An attribute set of dependency categories to package name lists. + dependencies + + # An attribute set of package names to their versions. + dependencyVersions + + # An attribute set of package names to their sources. + dependencySources; +} diff --git a/pkgs/build-support/deterministic-uname/default.nix b/pkgs/build-support/deterministic-uname/default.nix new file mode 100644 index 0000000..6d15055 --- /dev/null +++ b/pkgs/build-support/deterministic-uname/default.nix @@ -0,0 +1,55 @@ +# expr and script based on our lsb_release +{ stdenv +, lib +, substituteAll +, coreutils +, getopt +, modDirVersion ? "" +}: + +substituteAll { + name = "uname"; + + src = ./deterministic-uname.sh; + + dir = "bin"; + isExecutable = true; + + inherit coreutils getopt; + + uSystem = if stdenv.buildPlatform.uname.system != null then stdenv.buildPlatform.uname.system else "unknown"; + inherit (stdenv.buildPlatform.uname) processor; + + # uname -o + # maybe add to lib/systems/default.nix uname attrset + # https://github.com/coreutils/coreutils/blob/7fc84d1c0f6b35231b0b4577b70aaa26bf548a7c/src/uname.c#L373-L374 + # https://stackoverflow.com/questions/61711186/where-does-host-operating-system-in-uname-c-comes-from + # https://github.com/coreutils/gnulib/blob/master/m4/host-os.m4 + operatingSystem = + if stdenv.buildPlatform.isLinux + then "GNU/Linux" + else if stdenv.buildPlatform.isDarwin + then "Darwin" # darwin isn't in host-os.m4 so where does this come from? + else "unknown"; + + # in os-specific/linux module packages + # --replace '$(shell uname -r)' "${kernel.modDirVersion}" \ + # is a common thing to do. + modDirVersion = if modDirVersion != "" then modDirVersion else "unknown"; + + meta = with lib; { + description = "Print certain system information (hardcoded with lib/system values)"; + mainProgram = "uname"; + longDescription = '' + This package provides a replacement for `uname` whose output depends only + on `stdenv.buildPlatform`. It is meant to be used from within derivations. + Many packages' build processes run `uname` at compile time and embed its + output into the result of the build. Since `uname` calls into the kernel, + and the Nix sandbox currently does not intercept these calls, builds made + on different kernels will produce different results. + ''; + license = [ licenses.mit ]; + maintainers = with maintainers; [ artturin ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/build-support/deterministic-uname/deterministic-uname.sh b/pkgs/build-support/deterministic-uname/deterministic-uname.sh new file mode 100644 index 0000000..31772ae --- /dev/null +++ b/pkgs/build-support/deterministic-uname/deterministic-uname.sh @@ -0,0 +1,174 @@ +#! @shell@ + +set -o errexit +set -o nounset + +show_help() { + @coreutils@/bin/cat << EOF +Usage: uname [OPTION]... +Print certain system information. With no OPTION, same as -s. + + -a, --all print all information, in the following order, + except omit -p and -i if unknown: + -s, --kernel-name print the kernel name + -n, --nodename print the network node hostname + -r, --kernel-release print the kernel release + -v, --kernel-version print the kernel version + -m, --machine print the machine hardware name + -p, --processor print the processor type (non-portable) + -i, --hardware-platform print the hardware platform (non-portable) + -o, --operating-system print the operating system + --help display this help and exit + --version output version information and exit +EOF + exit 0 +} + +# Potential command-line options. +version=0 +all=0 + + +kernel_name=0 +nodename=0 +kernel_release=0 +kernel_version=0 +machine=0 +processor=0 +hardware_platform=0 +operating_system=0 + +# With no OPTION, same as -s. +if [[ $# -eq 0 ]]; then + kernel_name=1 +fi + +@getopt@/bin/getopt --test > /dev/null && rc=$? || rc=$? +if [[ $rc -ne 4 ]]; then + # This shouldn't happen. + echo "Warning: Enhanced getopt not supported, please open an issue in nixpkgs." >&2 +else + # Define all short and long options. + SHORT=hvsnrvmpioa + LONG=help,version,kernel-name,nodename,kernel-release,kernel-version,machine,processor,hardware-platform,operating-system,all + + # Parse all options. + PARSED=`@getopt@/bin/getopt --options $SHORT --longoptions $LONG --name "$0" -- "$@"` + + eval set -- "$PARSED" +fi + +# Process each argument, and set the appropriate flag if we recognize it. +while [[ $# -ge 1 ]]; do + case "$1" in + --version) + version=1 + ;; + -s|--kernel-name) + kernel_name=1 + ;; + -n|--nodename) + nodename=1 + ;; + -r|--kernel-release) + kernel_release=1 + ;; + -v|--kernel-version) + kernel_version=1 + ;; + -m|--machine) + machine=1 + ;; + -p|--processor) + processor=1 + ;; + -i|--hardware-platform) + hardware_platform=1 + ;; + -o|--operating-system) + operating_system=1 + ;; + -a|--all) + all=1 + ;; + --help) + show_help + ;; + --) + shift + break + ;; + *) + echo "uname: unrecognized option '$1'" + echo "Type 'uname --help' for a list of available options." + exit 1 + ;; + esac + shift +done + + +KERNEL_NAME_VAL=@uSystem@ +NODENAME_VAL=nixpkgs +KERNEL_RELEASE_VAL=@modDirVersion@ +# #1-NixOS SMP PREEMPT_DYNAMIC Wed Dec 14 10:41:06 UTC 2022 +KERNEL_VERSION_VAL="#1-NixOS Tue Jan 1 00:00:00 UTC 1980" +MACHINE_VAL=@processor@ +PROCESSOR_VAL=unknown +HARDWARE_PLATFORM_VAL=unknown +OPERATING_SYSTEM_VAL=@operatingSystem@ + + +if [[ "$version" = "1" ]]; then + # in case some script greps for GNU coreutils. + echo "uname (GNU coreutils) 9.1" + echo "Nixpkgs deterministic-uname" + exit +fi + +# output of the real uname from GNU coreutils +# Darwin: +# Darwin *nodename* 22.1.0 Darwin Kernel Version 22.1.0: Sun Oct 9 20:14:30 PDT 2022; root:xnu-8792.41.9~2/RELEASE_ARM64_T8103 arm64 arm Darwin +# NixOS: +# Linux *nodename* 6.0.13 #1-NixOS SMP PREEMPT_DYNAMIC Wed Dec 14 10:41:06 UTC 2022 x86_64 GNU/Linux +output=() +if [[ "$all" = "1" ]]; then + output+=("$KERNEL_NAME_VAL" "$NODENAME_VAL" "$KERNEL_RELEASE_VAL" "$KERNEL_VERSION_VAL" "$MACHINE_VAL") + # in help: except omit -p and -i if unknown. + # output+=($PROCESSOR_VAL $HARDWARE_PLATFORM_VAL) + output+=("$OPERATING_SYSTEM_VAL") +fi + +if [[ "$kernel_name" = "1" ]]; then + output+=("$KERNEL_NAME_VAL") +fi + +if [[ "$nodename" = "1" ]]; then + output+=("$NODENAME_VAL") +fi + +if [[ "$kernel_release" = "1" ]]; then + output+=("$KERNEL_RELEASE_VAL") +fi + +if [[ "$kernel_version" = "1" ]]; then + output+=("$KERNEL_VERSION_VAL") +fi + +if [[ "$machine" = "1" ]]; then + output+=("$MACHINE_VAL") +fi + +if [[ "$processor" = "1" ]]; then + output+=("$PROCESSOR_VAL") +fi + +if [[ "$hardware_platform" = "1" ]]; then + output+=("$HARDWARE_PLATFORM_VAL") +fi + +if [[ "$operating_system" = "1" ]]; then + output+=("$OPERATING_SYSTEM_VAL") +fi + +echo "${output[@]}" diff --git a/pkgs/build-support/dhall/directory-to-nix.nix b/pkgs/build-support/dhall/directory-to-nix.nix new file mode 100644 index 0000000..d751e19 --- /dev/null +++ b/pkgs/build-support/dhall/directory-to-nix.nix @@ -0,0 +1,25 @@ +{ dhallPackages, dhallPackageToNix}: + +# `dhallDirectoryToNix is a utility function to take a directory of Dhall files +# and read them in as a Nix expression. +# +# This function is similar to `dhallToNix`, but takes a Nixpkgs Dhall package +# as input instead of raw Dhall code. +# +# Note that this uses "import from derivation" (IFD), meaning that Nix will +# perform a build during the evaluation phase if you use this +# `dhallDirectoryToNix` utility. It is not possible to use +# `dhallDirectoryToNix` in Nixpkgs, since the Nixpkgs Hydra doesn't allow IFD. + +{ src +, # The file to import, relative to the src root directory + file ? "package.dhall" +}@args: + +let + generatedPkg = dhallPackages.generateDhallDirectoryPackage args; + + builtPkg = dhallPackages.callPackage generatedPkg { }; + +in + dhallPackageToNix builtPkg diff --git a/pkgs/build-support/dhall/package-to-nix.nix b/pkgs/build-support/dhall/package-to-nix.nix new file mode 100644 index 0000000..301501a --- /dev/null +++ b/pkgs/build-support/dhall/package-to-nix.nix @@ -0,0 +1,36 @@ + +# `dhallPackageToNix` is a utility function to take a Nixpkgs Dhall package +# (created with a function like `dhallPackages.buildDhallDirectoryPackage`) +# and read it in as a Nix expression. +# +# This function is similar to `dhallToNix`, but takes a Nixpkgs Dhall package +# as input instead of raw Dhall code. +# +# Note that this uses "import from derivation" (IFD), meaning that Nix will +# perform a build during the evaluation phase if you use this +# `dhallPackageToNix` utility. It is not possible to use `dhallPackageToNix` +# in Nixpkgs, since the Nixpkgs Hydra doesn't allow IFD. + +{ stdenv, dhall-nix }: + +dhallPackage: + let + drv = stdenv.mkDerivation { + name = "dhall-compiled-package.nix"; + + buildCommand = '' + # Dhall requires that the cache is writable, even if it is never written to. + # We copy the cache from the input package to the current directory and + # set the cache as writable. + cp -r "${dhallPackage}/.cache" ./ + export XDG_CACHE_HOME=$PWD/.cache + chmod -R +w ./.cache + + dhall-to-nix <<< "${dhallPackage}/binary.dhall" > $out + ''; + + nativeBuildInputs = [ dhall-nix ]; + }; + + in + import drv diff --git a/pkgs/build-support/dhall/to-nix.nix b/pkgs/build-support/dhall/to-nix.nix new file mode 100644 index 0000000..96cc16e --- /dev/null +++ b/pkgs/build-support/dhall/to-nix.nix @@ -0,0 +1,38 @@ +/* `dhallToNix` is a utility function to convert expressions in the Dhall + configuration language to their corresponding Nix expressions. + + Example: + dhallToNix "{ foo = 1, bar = True }" + => { foo = 1; bar = true; } + dhallToNix "λ(x : Bool) → x == False" + => x : x == false + dhallToNix "λ(x : Bool) → x == False" false + => true + + See https://hackage.haskell.org/package/dhall-nix/docs/Dhall-Nix.html for + a longer tutorial + + Note that this uses "import from derivation", meaning that Nix will perform + a build during the evaluation phase if you use this `dhallToNix` utility +*/ +{ stdenv, dhall-nix, writeText }: + +let + dhallToNix = code : + let + file = writeText "dhall-expression" code; + + drv = stdenv.mkDerivation { + name = "dhall-compiled.nix"; + + buildCommand = '' + dhall-to-nix <<< "${file}" > $out + ''; + + buildInputs = [ dhall-nix ]; + }; + + in + import drv; +in + dhallToNix diff --git a/pkgs/build-support/dlang/README.md b/pkgs/build-support/dlang/README.md new file mode 100644 index 0000000..bdd5fd2 --- /dev/null +++ b/pkgs/build-support/dlang/README.md @@ -0,0 +1,7 @@ +# Build support for D + +Build utilities for the D language can be found in this directory. + +### Current maintainers +- @TomaSajt +- @jtbx diff --git a/pkgs/build-support/dlang/builddubpackage/default.nix b/pkgs/build-support/dlang/builddubpackage/default.nix new file mode 100644 index 0000000..9295445 --- /dev/null +++ b/pkgs/build-support/dlang/builddubpackage/default.nix @@ -0,0 +1,124 @@ +{ + lib, + stdenv, + fetchurl, + linkFarm, + dub, + ldc, + removeReferencesTo, +}: + +# See https://nixos.org/manual/nixpkgs/unstable#dlang for more detailed usage information + +{ + # A lockfile generated by `dub-to-nix` from the source of the package. + # Can be either a path to the file, or an attrset already parsed with `lib.importJSON`. + dubLock, + # The build type to pass to `dub build` as a value for the `--build=` flag. + dubBuildType ? "release", + # The flags to pass to `dub build` and `dub test`. + dubFlags ? [ ], + # The flags to pass to `dub build`. + dubBuildFlags ? [ ], + # The flags to pass to `dub test`. + dubTestFlags ? [ ], + # The D compiler to be used by `dub`. + compiler ? ldc, + ... +}@args: + +let + makeDubDep = + { + pname, + version, + sha256, + }: + { + inherit pname version; + src = fetchurl { + name = "dub-${pname}-${version}.zip"; + url = "mirror://dub/${pname}/${version}.zip"; + inherit sha256; + }; + }; + + lockJson = if lib.isPath dubLock then lib.importJSON dubLock else dubLock; + + lockedDeps = lib.mapAttrsToList ( + pname: { version, sha256 }: makeDubDep { inherit pname version sha256; } + ) lockJson.dependencies; + + # a directory with multiple single element registries + # one big directory with all .zip files leads to version parsing errors + # when the name of a package is a prefix of the name of another package + dubRegistryBase = linkFarm "dub-registry-base" ( + map (dep: { + name = "${dep.pname}/${dep.pname}-${dep.version}.zip"; + path = dep.src; + }) lockedDeps + ); + + combinedFlags = "--skip-registry=all --compiler=${lib.getExe compiler} ${toString dubFlags}"; + combinedBuildFlags = "${combinedFlags} --build=${dubBuildType} ${toString dubBuildFlags}"; + combinedTestFlags = "${combinedFlags} ${toString dubTestFlags}"; +in +stdenv.mkDerivation ( + builtins.removeAttrs args [ "dubLock" ] + // { + strictDeps = args.strictDeps or true; + + nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [ + dub + compiler + removeReferencesTo + ]; + + configurePhase = + args.configurePhase or '' + runHook preConfigure + + export DUB_HOME="$NIX_BUILD_TOP/.dub" + mkdir -p $DUB_HOME + + # register dependencies + ${lib.concatMapStringsSep "\n" (dep: '' + dub fetch ${dep.pname}@${dep.version} --cache=user --skip-registry=standard --registry=file://${dubRegistryBase}/${dep.pname} + '') lockedDeps} + + runHook postConfigure + ''; + + buildPhase = + args.buildPhase or '' + runHook preBuild + + dub build ${combinedBuildFlags} + + runHook postBuild + ''; + + doCheck = args.doCheck or false; + + checkPhase = + args.checkPhase or '' + runHook preCheck + + dub test ${combinedTestFlags} + + runHook postCheck + ''; + + preFixup = '' + ${args.preFixup or ""} + + find "$out" -type f -exec remove-references-to -t ${compiler} '{}' + + ''; + + disallowedReferences = [ compiler ]; + + meta = { + platforms = dub.meta.platforms; + } // args.meta or { }; + } +) diff --git a/pkgs/build-support/dlang/dub-support.nix b/pkgs/build-support/dlang/dub-support.nix new file mode 100644 index 0000000..879d593 --- /dev/null +++ b/pkgs/build-support/dlang/dub-support.nix @@ -0,0 +1,5 @@ +{ callPackage }: +{ + buildDubPackage = callPackage ./builddubpackage { }; + dub-to-nix = callPackage ./dub-to-nix { }; +} diff --git a/pkgs/build-support/dlang/dub-to-nix/default.nix b/pkgs/build-support/dlang/dub-to-nix/default.nix new file mode 100644 index 0000000..53a2e99 --- /dev/null +++ b/pkgs/build-support/dlang/dub-to-nix/default.nix @@ -0,0 +1,19 @@ +{ + lib, + runCommand, + makeWrapper, + python3, + nix, +}: + +runCommand "dub-to-nix" + { + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ python3 ]; + } + '' + install -Dm755 ${./dub-to-nix.py} "$out/bin/dub-to-nix" + patchShebangs "$out/bin/dub-to-nix" + wrapProgram "$out/bin/dub-to-nix" \ + --prefix PATH : ${lib.makeBinPath [ nix ]} + '' diff --git a/pkgs/build-support/dlang/dub-to-nix/dub-to-nix.py b/pkgs/build-support/dlang/dub-to-nix/dub-to-nix.py new file mode 100644 index 0000000..48a9f24 --- /dev/null +++ b/pkgs/build-support/dlang/dub-to-nix/dub-to-nix.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import sys +import json +import os +import subprocess + +def eprint(text: str): + print(text, file=sys.stderr) + +if not os.path.exists("dub.selections.json"): + eprint("The file `dub.selections.json` does not exist in the current working directory") + eprint("run `dub upgrade --annotate` to generate it") + sys.exit(1) + +with open("dub.selections.json") as f: + selectionsJson = json.load(f) + +versionDict: dict[str, str] = selectionsJson["versions"] + +for pname in versionDict: + version = versionDict[pname] + if version.startswith("~"): + eprint(f'Package "{pname}" has a branch-type version "{version}", which doesn\'t point to a fixed version') + eprint("You can resolve it by manually changing the required version to a fixed one inside `dub.selections.json`") + eprint("When packaging, you might need to create a patch for `dub.sdl` or `dub.json` to accept the changed version") + sys.exit(1) + +lockedDependenciesDict: dict[str, dict[str, str]] = {} + +for pname in versionDict: + version = versionDict[pname] + eprint(f"Fetching {pname}@{version}") + url = f"https://code.dlang.org/packages/{pname}/{version}.zip" + command = ["nix-prefetch-url", "--type", "sha256", url] + sha256 = subprocess.run(command, check=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout.rstrip() + lockedDependenciesDict[pname] = {"version": version, "sha256": sha256} + +print(json.dumps({"dependencies": lockedDependenciesDict}, indent=2)) diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix new file mode 100644 index 0000000..1d1989d --- /dev/null +++ b/pkgs/build-support/docker/default.nix @@ -0,0 +1,1299 @@ +{ bashInteractive +, buildPackages +, cacert +, callPackage +, closureInfo +, coreutils +, e2fsprogs +, proot +, fakeNss +, fakeroot +, file +, go +, jq +, jshon +, lib +, makeWrapper +, moreutils +, nix +, nixosTests +, pigz +, rsync +, runCommand +, runtimeShell +, shadow +, skopeo +, storeDir ? builtins.storeDir +, substituteAll +, symlinkJoin +, tarsum +, util-linux +, vmTools +, writeClosure +, writeScript +, writeShellScriptBin +, writeText +, writeTextDir +, writePython3 +, zstd +}: + +let + inherit (lib) + optionals + optionalString + ; + + inherit (lib) + escapeShellArgs + toList + ; + + mkDbExtraCommand = contents: + let + contentsList = if builtins.isList contents then contents else [ contents ]; + in + '' + echo "Generating the nix database..." + echo "Warning: only the database of the deepest Nix layer is loaded." + echo " If you want to use nix commands in the container, it would" + echo " be better to only have one layer that contains a nix store." + + export NIX_REMOTE=local?root=$PWD + # A user is required by nix + # https://github.com/NixOS/nix/blob/9348f9291e5d9e4ba3c4347ea1b235640f54fd79/src/libutil/util.cc#L478 + export USER=nobody + ${buildPackages.nix}/bin/nix-store --load-db < ${closureInfo {rootPaths = contentsList;}}/registration + # Reset registration times to make the image reproducible + ${buildPackages.sqlite}/bin/sqlite3 nix/var/nix/db/db.sqlite "UPDATE ValidPaths SET registrationTime = ''${SOURCE_DATE_EPOCH}" + + mkdir -p nix/var/nix/gcroots/docker/ + for i in ${lib.concatStringsSep " " contentsList}; do + ln -s $i nix/var/nix/gcroots/docker/$(basename $i) + done; + ''; + + # The OCI Image specification recommends that configurations use values listed + # in the Go Language document for GOARCH. + # Reference: https://github.com/opencontainers/image-spec/blob/master/config.md#properties + # For the mapping from Nixpkgs system parameters to GOARCH, we can reuse the + # mapping from the go package. + defaultArchitecture = go.GOARCH; + + compressors = { + none = { + ext = ""; + nativeInputs = [ ]; + compress = "cat"; + decompress = "cat"; + }; + gz = { + ext = ".gz"; + nativeInputs = [ pigz ]; + compress = "pigz -p$NIX_BUILD_CORES -nTR"; + decompress = "pigz -d -p$NIX_BUILD_CORES"; + }; + zstd = { + ext = ".zst"; + nativeInputs = [ zstd ]; + compress = "zstd -T$NIX_BUILD_CORES"; + decompress = "zstd -d -T$NIX_BUILD_CORES"; + }; + }; + + compressorForImage = compressor: imageName: compressors.${compressor} or + (throw "in docker image ${imageName}: compressor must be one of: [${toString builtins.attrNames compressors}]"); + +in +rec { + examples = callPackage ./examples.nix { + inherit buildImage buildLayeredImage fakeNss pullImage shadowSetup buildImageWithNixDb streamNixShellImage; + }; + + tests = { + inherit (nixosTests) + docker-tools + docker-tools-overlay + # requires remote builder + # docker-tools-cross + ; + }; + + pullImage = + let + fixName = name: builtins.replaceStrings [ "/" ":" ] [ "-" "-" ] name; + in + { imageName + # To find the digest of an image, you can use skopeo: + # see doc/functions.xml + , imageDigest + , sha256 + , os ? "linux" + , # Image architecture, defaults to the architecture of the `hostPlatform` when unset + arch ? defaultArchitecture + # This is used to set name to the pulled image + , finalImageName ? imageName + # This used to set a tag to the pulled image + , finalImageTag ? "latest" + # This is used to disable TLS certificate verification, allowing access to http registries on (hopefully) trusted networks + , tlsVerify ? true + + , name ? fixName "docker-image-${finalImageName}-${finalImageTag}.tar" + }: + + runCommand name + { + inherit imageDigest; + imageName = finalImageName; + imageTag = finalImageTag; + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + outputHashMode = "flat"; + outputHashAlgo = "sha256"; + outputHash = sha256; + + nativeBuildInputs = [ skopeo ]; + SSL_CERT_FILE = "${cacert.out}/etc/ssl/certs/ca-bundle.crt"; + + sourceURL = "docker://${imageName}@${imageDigest}"; + destNameTag = "${finalImageName}:${finalImageTag}"; + } '' + skopeo \ + --insecure-policy \ + --tmpdir=$TMPDIR \ + --override-os ${os} \ + --override-arch ${arch} \ + copy \ + --src-tls-verify=${lib.boolToString tlsVerify} \ + "$sourceURL" "docker-archive://$out:$destNameTag" \ + | cat # pipe through cat to force-disable progress bar + ''; + + # We need to sum layer.tar, not a directory, hence tarsum instead of nix-hash. + # And we cannot untar it, because then we cannot preserve permissions etc. + inherit tarsum; # pkgs.dockerTools.tarsum + + # buildEnv creates symlinks to dirs, which is hard to edit inside the overlay VM + mergeDrvs = + { derivations + , onlyDeps ? false + }: + runCommand "merge-drvs" + { + inherit derivations onlyDeps; + } '' + if [[ -n "$onlyDeps" ]]; then + echo $derivations > $out + exit 0 + fi + + mkdir $out + for derivation in $derivations; do + echo "Merging $derivation..." + if [[ -d "$derivation" ]]; then + # If it's a directory, copy all of its contents into $out. + cp -drf --preserve=mode -f $derivation/* $out/ + else + # Otherwise treat the derivation as a tarball and extract it + # into $out. + tar -C $out -xpf $drv || true + fi + done + ''; + + # Helper for setting up the base files for managing users and + # groups, only if such files don't exist already. It is suitable for + # being used in a runAsRoot script. + shadowSetup = '' + export PATH=${shadow}/bin:$PATH + mkdir -p /etc/pam.d + if [[ ! -f /etc/passwd ]]; then + echo "root:x:0:0::/root:${runtimeShell}" > /etc/passwd + echo "root:!x:::::::" > /etc/shadow + fi + if [[ ! -f /etc/group ]]; then + echo "root:x:0:" > /etc/group + echo "root:x::" > /etc/gshadow + fi + if [[ ! -f /etc/pam.d/other ]]; then + cat > /etc/pam.d/other < layer-list + else + touch layer-list + fi + + # Unpack all of the parent layers into the image. + lowerdir="" + extractionID=0 + for layerTar in $(cat layer-list); do + echo "Unpacking layer $layerTar" + extractionID=$((extractionID + 1)) + + mkdir -p image/$extractionID/layer + tar -C image/$extractionID/layer -xpf image/$layerTar + rm image/$layerTar + + find image/$extractionID/layer -name ".wh.*" -exec bash -c 'name="$(basename {}|sed "s/^.wh.//")"; mknod "$(dirname {})/$name" c 0 0; rm {}' \; + + # Get the next lower directory and continue the loop. + lowerdir=image/$extractionID/layer''${lowerdir:+:}$lowerdir + done + + mkdir work + mkdir layer + mkdir mnt + + ${lib.optionalString (preMount != "") '' + # Execute pre-mount steps + echo "Executing pre-mount steps..." + ${preMount} + ''} + + if [ -n "$lowerdir" ]; then + mount -t overlay overlay -olowerdir=$lowerdir,workdir=work,upperdir=layer mnt + else + mount --bind layer mnt + fi + + ${lib.optionalString (postMount != "") '' + # Execute post-mount steps + echo "Executing post-mount steps..." + ${postMount} + ''} + + umount mnt + + ( + cd layer + cmd='name="$(basename {})"; touch "$(dirname {})/.wh.$name"; rm "{}"' + find . -type c -exec bash -c "$cmd" \; + ) + + ${postUmount} + ''); + + exportImage = { name ? fromImage.name, fromImage, fromImageName ? null, fromImageTag ? null, diskSize ? 1024 }: + runWithOverlay { + inherit name fromImage fromImageName fromImageTag diskSize; + + postMount = '' + echo "Packing raw image..." + tar -C mnt --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . + ''; + + postUmount = '' + mv $out/layer.tar . + rm -rf $out + mv layer.tar $out + ''; + }; + + # Create an executable shell script which has the coreutils in its + # PATH. Since root scripts are executed in a blank environment, even + # things like `ls` or `echo` will be missing. + shellScript = name: text: + writeScript name '' + #!${runtimeShell} + set -e + export PATH=${coreutils}/bin:/bin + ${text} + ''; + + # Create a "layer" (set of files). + mkPureLayer = + { + # Name of the layer + name + , # JSON containing configuration and metadata for this layer. + baseJson + , # Files to add to the layer. + copyToRoot ? null + , # When copying the contents into the image, preserve symlinks to + # directories (see `rsync -K`). Otherwise, transform those symlinks + # into directories. + keepContentsDirlinks ? false + , # Additional commands to run on the layer before it is tar'd up. + extraCommands ? "" + , uid ? 0 + , gid ? 0 + }: + runCommand "docker-layer-${name}" + { + inherit baseJson extraCommands; + contents = copyToRoot; + nativeBuildInputs = [ jshon rsync tarsum ]; + } + '' + mkdir layer + if [[ -n "$contents" ]]; then + echo "Adding contents..." + for item in $contents; do + echo "Adding $item" + rsync -a${if keepContentsDirlinks then "K" else "k"} --chown=0:0 $item/ layer/ + done + else + echo "No contents to add to layer." + fi + + chmod ug+w layer + + if [[ -n "$extraCommands" ]]; then + (cd layer; eval "$extraCommands") + fi + + # Tar up the layer and throw it into 'layer.tar'. + echo "Packing layer..." + mkdir $out + tarhash=$(tar -C layer --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf - . | tee -p $out/layer.tar | tarsum) + + # Add a 'checksum' field to the JSON, with the value set to the + # checksum of the tarball. + cat ${baseJson} | jshon -s "$tarhash" -i checksum > $out/json + + # Indicate to docker that we're using schema version 1.0. + echo -n "1.0" > $out/VERSION + + echo "Finished building layer '${name}'" + ''; + + # Make a "root" layer; required if we need to execute commands as a + # privileged user on the image. The commands themselves will be + # performed in a virtual machine sandbox. + mkRootLayer = + { + # Name of the image. + name + , # Script to run as root. Bash. + runAsRoot + , # Files to add to the layer. If null, an empty layer will be created. + # To add packages to /bin, use `buildEnv` or similar. + copyToRoot ? null + , # When copying the contents into the image, preserve symlinks to + # directories (see `rsync -K`). Otherwise, transform those symlinks + # into directories. + keepContentsDirlinks ? false + , # JSON containing configuration and metadata for this layer. + baseJson + , # Existing image onto which to append the new layer. + fromImage ? null + , # Name of the image we're appending onto. + fromImageName ? null + , # Tag of the image we're appending onto. + fromImageTag ? null + , # How much disk to allocate for the temporary virtual machine. + diskSize ? 1024 + , # How much memory to allocate for the temporary virtual machine. + buildVMMemorySize ? 512 + , # Commands (bash) to run on the layer; these do not require sudo. + extraCommands ? "" + }: + # Generate an executable script from the `runAsRoot` text. + let + runAsRootScript = shellScript "run-as-root.sh" runAsRoot; + extraCommandsScript = shellScript "extra-commands.sh" extraCommands; + in + runWithOverlay { + name = "docker-layer-${name}"; + + inherit fromImage fromImageName fromImageTag diskSize buildVMMemorySize; + + preMount = lib.optionalString (copyToRoot != null && copyToRoot != [ ]) '' + echo "Adding contents..." + for item in ${escapeShellArgs (map (c: "${c}") (toList copyToRoot))}; do + echo "Adding $item..." + rsync -a${if keepContentsDirlinks then "K" else "k"} --chown=0:0 $item/ layer/ + done + + chmod ug+w layer + ''; + + postMount = '' + mkdir -p mnt/{dev,proc,sys,tmp} mnt${storeDir} + + # Mount /dev, /sys and the nix store as shared folders. + mount --rbind /dev mnt/dev + mount --rbind /sys mnt/sys + mount --rbind ${storeDir} mnt${storeDir} + + # Execute the run as root script. See 'man unshare' for + # details on what's going on here; basically this command + # means that the runAsRootScript will be executed in a nearly + # completely isolated environment. + # + # Ideally we would use --mount-proc=mnt/proc or similar, but this + # doesn't work. The workaround is to setup proc after unshare. + # See: https://github.com/karelzak/util-linux/issues/648 + unshare -imnpuf --mount-proc sh -c 'mount --rbind /proc mnt/proc && chroot mnt ${runAsRootScript}' + + # Unmount directories and remove them. + umount -R mnt/dev mnt/sys mnt${storeDir} + rmdir --ignore-fail-on-non-empty \ + mnt/dev mnt/proc mnt/sys mnt${storeDir} \ + mnt$(dirname ${storeDir}) + ''; + + postUmount = '' + (cd layer; ${extraCommandsScript}) + + echo "Packing layer..." + mkdir -p $out + tarhash=$(tar -C layer --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" -cf - . | + tee -p $out/layer.tar | + ${tarsum}/bin/tarsum) + + cat ${baseJson} | jshon -s "$tarhash" -i checksum > $out/json + # Indicate to docker that we're using schema version 1.0. + echo -n "1.0" > $out/VERSION + + echo "Finished building layer '${name}'" + ''; + }; + + buildLayeredImage = lib.makeOverridable ({ name, compressor ? "gz", ... }@args: + let + stream = streamLayeredImage (builtins.removeAttrs args ["compressor"]); + compress = compressorForImage compressor name; + in + runCommand "${baseNameOf name}.tar${compress.ext}" + { + inherit (stream) imageName; + passthru = { inherit (stream) imageTag; inherit stream; }; + nativeBuildInputs = compress.nativeInputs; + } "${stream} | ${compress.compress} > $out" + ); + + # 1. extract the base image + # 2. create the layer + # 3. add layer deps to the layer itself, diffing with the base image + # 4. compute the layer id + # 5. put the layer in the image + # 6. repack the image + buildImage = lib.makeOverridable ( + args@{ + # Image name. + name + , # Image tag, when null then the nix output hash will be used. + tag ? null + , # Parent image, to append to. + fromImage ? null + , # Name of the parent image; will be read from the image otherwise. + fromImageName ? null + , # Tag of the parent image; will be read from the image otherwise. + fromImageTag ? null + , # Files to put on the image (a nix store path or list of paths). + copyToRoot ? null + , # When copying the contents into the image, preserve symlinks to + # directories (see `rsync -K`). Otherwise, transform those symlinks + # into directories. + keepContentsDirlinks ? false + , # Docker config; e.g. what command to run on the container. + config ? null + , # Image architecture, defaults to the architecture of the `hostPlatform` when unset + architecture ? defaultArchitecture + , # Optional bash script to run on the files prior to fixturizing the layer. + extraCommands ? "" + , uid ? 0 + , gid ? 0 + , # Optional bash script to run as root on the image when provisioning. + runAsRoot ? null + , # Size of the virtual machine disk to provision when building the image. + diskSize ? 1024 + , # Size of the virtual machine memory to provision when building the image. + buildVMMemorySize ? 512 + , # Time of creation of the image. + created ? "1970-01-01T00:00:01Z" + , # Compressor to use. One of: none, gz, zstd. + compressor ? "gz" + , # Deprecated. + contents ? null + , + }: + + let + checked = + lib.warnIf (contents != null) + "in docker image ${name}: The contents parameter is deprecated. Change to copyToRoot if the contents are designed to be copied to the root filesystem, such as when you use `buildEnv` or similar between contents and your packages. Use copyToRoot = buildEnv { ... }; or similar if you intend to add packages to /bin." + lib.throwIf (contents != null && copyToRoot != null) "in docker image ${name}: You can not specify both contents and copyToRoot." + ; + + rootContents = if copyToRoot == null then contents else copyToRoot; + + baseName = baseNameOf name; + + # Create a JSON blob of the configuration. Set the date to unix zero. + baseJson = + let + pure = writeText "${baseName}-config.json" (builtins.toJSON { + inherit created config architecture; + preferLocalBuild = true; + os = "linux"; + }); + impure = runCommand "${baseName}-config.json" + { + nativeBuildInputs = [ jq ]; + preferLocalBuild = true; + } + '' + jq ".created = \"$(TZ=utc date --iso-8601="seconds")\"" ${pure} > $out + ''; + in + if created == "now" then impure else pure; + + compress = compressorForImage compressor name; + + layer = + if runAsRoot == null + then + mkPureLayer + { + name = baseName; + inherit baseJson keepContentsDirlinks extraCommands uid gid; + copyToRoot = rootContents; + } else + mkRootLayer { + name = baseName; + inherit baseJson fromImage fromImageName fromImageTag + keepContentsDirlinks runAsRoot diskSize buildVMMemorySize + extraCommands; + copyToRoot = rootContents; + }; + result = runCommand "docker-image-${baseName}.tar${compress.ext}" + { + nativeBuildInputs = [ jshon jq moreutils ] ++ compress.nativeInputs; + # Image name must be lowercase + imageName = lib.toLower name; + imageTag = lib.optionalString (tag != null) tag; + inherit fromImage baseJson; + layerClosure = writeClosure [ layer ]; + passthru.buildArgs = args; + passthru.layer = layer; + passthru.imageTag = + if tag != null + then tag + else + lib.head (lib.strings.splitString "-" (baseNameOf (builtins.unsafeDiscardStringContext result.outPath))); + } '' + ${lib.optionalString (tag == null) '' + outName="$(basename "$out")" + outHash=$(echo "$outName" | cut -d - -f 1) + + imageTag=$outHash + ''} + + # Print tar contents: + # 1: Interpreted as relative to the root directory + # 2: With no trailing slashes on directories + # This is useful for ensuring that the output matches the + # values generated by the "find" command + ls_tar() { + for f in $(tar -tf $1 | xargs realpath -ms --relative-to=.); do + if [[ "$f" != "." ]]; then + echo "/$f" + fi + done + } + + mkdir image + touch baseFiles + baseEnvs='[]' + if [[ -n "$fromImage" ]]; then + echo "Unpacking base image..." + tar -C image -xpf "$fromImage" + + # Store the layers and the environment variables from the base image + cat ./image/manifest.json | jq -r '.[0].Layers | .[]' > layer-list + configName="$(cat ./image/manifest.json | jq -r '.[0].Config')" + baseEnvs="$(cat "./image/$configName" | jq '.config.Env // []')" + + # Extract the parentID from the manifest + if [[ -n "$fromImageName" ]] && [[ -n "$fromImageTag" ]]; then + parentID="$( + cat "image/manifest.json" | + jq -r '.[] | select(.RepoTags | contains([$desiredTag])) | rtrimstr(".json")' \ + --arg desiredTag "$fromImageName:$fromImageTag" + )" + else + echo "From-image name or tag wasn't set. Reading the first ID." + parentID="$(cat "image/manifest.json" | jq -r '.[0].Config | rtrimstr(".json")')" + fi + + # Otherwise do not import the base image configuration and manifest + chmod a+w image image/*.json + rm -f image/*.json + + for l in image/*/layer.tar; do + ls_tar $l >> baseFiles + done + else + touch layer-list + fi + + chmod -R ug+rw image + + mkdir temp + cp ${layer}/* temp/ + chmod ug+w temp/* + + for dep in $(cat $layerClosure); do + find $dep >> layerFiles + done + + echo "Adding layer..." + # Record the contents of the tarball with ls_tar. + ls_tar temp/layer.tar >> baseFiles + + # Append nix/store directory to the layer so that when the layer is loaded in the + # image /nix/store has read permissions for non-root users. + # nix/store is added only if the layer has /nix/store paths in it. + if [ $(wc -l < $layerClosure) -gt 1 ] && [ $(grep -c -e "^/nix/store$" baseFiles) -eq 0 ]; then + mkdir -p nix/store + chmod -R 555 nix + echo "./nix" >> layerFiles + echo "./nix/store" >> layerFiles + fi + + # Get the files in the new layer which were *not* present in + # the old layer, and record them as newFiles. + comm <(sort -n baseFiles|uniq) \ + <(sort -n layerFiles|uniq|grep -v ${layer}) -1 -3 > newFiles + # Append the new files to the layer. + tar -rpf temp/layer.tar --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" \ + --owner=0 --group=0 --no-recursion --verbatim-files-from --files-from newFiles + + echo "Adding meta..." + + # If we have a parentID, add it to the json metadata. + if [[ -n "$parentID" ]]; then + cat temp/json | jshon -s "$parentID" -i parent > tmpjson + mv tmpjson temp/json + fi + + # Take the sha256 sum of the generated json and use it as the layer ID. + # Compute the size and add it to the json under the 'Size' field. + layerID=$(sha256sum temp/json|cut -d ' ' -f 1) + size=$(stat --printf="%s" temp/layer.tar) + cat temp/json | jshon -s "$layerID" -i id -n $size -i Size > tmpjson + mv tmpjson temp/json + + # Use the temp folder we've been working on to create a new image. + mv temp image/$layerID + + # Add the new layer ID to the end of the layer list + ( + cat layer-list + # originally this used `sed -i "1i$layerID" layer-list`, but + # would fail if layer-list was completely empty. + echo "$layerID/layer.tar" + ) | sponge layer-list + + # Create image json and image manifest + imageJson=$(cat ${baseJson} | jq '.config.Env = $baseenv + .config.Env' --argjson baseenv "$baseEnvs") + imageJson=$(echo "$imageJson" | jq ". + {\"rootfs\": {\"diff_ids\": [], \"type\": \"layers\"}}") + manifestJson=$(jq -n "[{\"RepoTags\":[\"$imageName:$imageTag\"]}]") + + for layerTar in $(cat ./layer-list); do + layerChecksum=$(sha256sum image/$layerTar | cut -d ' ' -f1) + imageJson=$(echo "$imageJson" | jq ".history |= . + [{\"created\": \"$(jq -r .created ${baseJson})\"}]") + # diff_ids order is from the bottom-most to top-most layer + imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= . + [\"sha256:$layerChecksum\"]") + manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= . + [\"$layerTar\"]") + done + + imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1) + echo "$imageJson" > "image/$imageJsonChecksum.json" + manifestJson=$(echo "$manifestJson" | jq ".[0].Config = \"$imageJsonChecksum.json\"") + echo "$manifestJson" > image/manifest.json + + # Store the json under the name image/repositories. + jshon -n object \ + -n object -s "$layerID" -i "$imageTag" \ + -i "$imageName" > image/repositories + + # Make the image read-only. + chmod -R a-w image + + echo "Cooking the image..." + tar -C image --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'^./':: -c . | ${compress.compress} > $out + + echo "Finished." + ''; + + in + checked result + ); + + # Merge the tarballs of images built with buildImage into a single + # tarball that contains all images. Running `docker load` on the resulting + # tarball will load the images into the docker daemon. + mergeImages = images: runCommand "merge-docker-images" + { + inherit images; + nativeBuildInputs = [ file jq ] + ++ compressors.none.nativeInputs + ++ compressors.gz.nativeInputs + ++ compressors.zstd.nativeInputs; + } '' + mkdir image inputs + # Extract images + repos=() + manifests=() + last_image_mime="application/gzip" + for item in $images; do + name=$(basename $item) + mkdir inputs/$name + + last_image_mime=$(file --mime-type -b $item) + case $last_image_mime in + "application/x-tar") ${compressors.none.decompress};; + "application/zstd") ${compressors.zstd.decompress};; + "application/gzip") ${compressors.gz.decompress};; + *) echo "error: unexpected layer type $last_image_mime" >&2; exit 1;; + esac < $item | tar -xC inputs/$name + + if [ -f inputs/$name/repositories ]; then + repos+=(inputs/$name/repositories) + fi + if [ -f inputs/$name/manifest.json ]; then + manifests+=(inputs/$name/manifest.json) + fi + done + # Copy all layers from input images to output image directory + cp -R --update=none inputs/*/* image/ + # Merge repositories objects and manifests + jq -s add "''${repos[@]}" > repositories + jq -s add "''${manifests[@]}" > manifest.json + # Replace output image repositories and manifest with merged versions + mv repositories image/repositories + mv manifest.json image/manifest.json + # Create tarball and gzip + tar -C image --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'^./':: -c . | ( + case $last_image_mime in + "application/x-tar") ${compressors.none.compress};; + "application/zstd") ${compressors.zstd.compress};; + "application/gzip") ${compressors.gz.compress};; + # `*)` not needed; already checked. + esac + ) > $out + ''; + + + # Provide a /etc/passwd and /etc/group that contain root and nobody. + # Useful when packaging binaries that insist on using nss to look up + # username/groups (like nginx). + # /bin/sh is fine to not exist, and provided by another shim. + inherit fakeNss; # alias + + # This provides a /usr/bin/env, for shell scripts using the + # "#!/usr/bin/env executable" shebang. + usrBinEnv = runCommand "usr-bin-env" { } '' + mkdir -p $out/usr/bin + ln -s ${coreutils}/bin/env $out/usr/bin + ''; + + # This provides /bin/sh, pointing to bashInteractive. + # The use of bashInteractive here is intentional to support cases like `docker run -it `, so keep these use cases in mind if making any changes to how this works. + binSh = runCommand "bin-sh" { } '' + mkdir -p $out/bin + ln -s ${bashInteractive}/bin/bash $out/bin/sh + ''; + + # This provides the ca bundle in common locations + caCertificates = runCommand "ca-certificates" { } '' + mkdir -p $out/etc/ssl/certs $out/etc/pki/tls/certs + # Old NixOS compatibility. + ln -s ${cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs/ca-bundle.crt + # NixOS canonical location + Debian/Ubuntu/Arch/Gentoo compatibility. + ln -s ${cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs/ca-certificates.crt + # CentOS/Fedora compatibility. + ln -s ${cacert}/etc/ssl/certs/ca-bundle.crt $out/etc/pki/tls/certs/ca-bundle.crt + ''; + + # Build an image and populate its nix database with the provided + # contents. The main purpose is to be able to use nix commands in + # the container. + # Be careful since this doesn't work well with multilayer. + # TODO: add the dependencies of the config json. + buildImageWithNixDb = args@{ copyToRoot ? contents, contents ? null, extraCommands ? "", ... }: ( + buildImage (args // { + extraCommands = (mkDbExtraCommand copyToRoot) + extraCommands; + }) + ); + + # TODO: add the dependencies of the config json. + buildLayeredImageWithNixDb = args@{ contents ? null, extraCommands ? "", ... }: ( + buildLayeredImage (args // { + extraCommands = (mkDbExtraCommand contents) + extraCommands; + }) + ); + + # Arguments are documented in ../../../doc/build-helpers/images/dockertools.section.md + streamLayeredImage = lib.makeOverridable ( + { + name + , tag ? null + , fromImage ? null + , contents ? [ ] + , config ? { } + , architecture ? defaultArchitecture + , created ? "1970-01-01T00:00:01Z" + , uid ? 0 + , gid ? 0 + , uname ? "root" + , gname ? "root" + , maxLayers ? 100 + , extraCommands ? "" + , fakeRootCommands ? "" + , enableFakechroot ? false + , includeStorePaths ? true + , passthru ? {} + , + }: + assert + (lib.assertMsg (maxLayers > 1) + "the maxLayers argument of dockerTools.buildLayeredImage function must be greather than 1 (current value: ${toString maxLayers})"); + let + baseName = baseNameOf name; + + streamScript = writePython3 "stream" { } ./stream_layered_image.py; + baseJson = writeText "${baseName}-base.json" (builtins.toJSON { + inherit config architecture; + os = "linux"; + }); + + contentsList = if builtins.isList contents then contents else [ contents ]; + bind-paths = builtins.toString (builtins.map (path: "--bind=${path}:${path}!") [ + "/dev/" + "/proc/" + "/sys/" + "${builtins.storeDir}/" + "$out/layer.tar" + ]); + + # We store the customisation layer as a tarball, to make sure that + # things like permissions set on 'extraCommands' are not overridden + # by Nix. Then we precompute the sha256 for performance. + customisationLayer = symlinkJoin { + name = "${baseName}-customisation-layer"; + paths = contentsList; + inherit extraCommands fakeRootCommands; + nativeBuildInputs = [ + fakeroot + ] ++ optionals enableFakechroot [ + proot + ]; + postBuild = '' + mv $out old_out + (cd old_out; eval "$extraCommands" ) + + mkdir $out + ${if enableFakechroot then '' + proot -r $PWD/old_out ${bind-paths} --pwd=/ fakeroot bash -c ' + source $stdenv/setup + eval "$fakeRootCommands" + tar \ + --sort name \ + --exclude=./proc \ + --exclude=./sys \ + --exclude=.${builtins.storeDir} \ + --numeric-owner --mtime "@$SOURCE_DATE_EPOCH" \ + --hard-dereference \ + -cf $out/layer.tar . + ' + '' else '' + fakeroot bash -c ' + source $stdenv/setup + cd old_out + eval "$fakeRootCommands" + tar \ + --sort name \ + --numeric-owner --mtime "@$SOURCE_DATE_EPOCH" \ + --hard-dereference \ + -cf $out/layer.tar . + ' + ''} + sha256sum $out/layer.tar \ + | cut -f 1 -d ' ' \ + > $out/checksum + ''; + }; + + closureRoots = lib.optionals includeStorePaths /* normally true */ ( + [ baseJson customisationLayer ] + ); + overallClosure = writeText "closure" (lib.concatStringsSep " " closureRoots); + + # These derivations are only created as implementation details of docker-tools, + # so they'll be excluded from the created images. + unnecessaryDrvs = [ baseJson overallClosure customisationLayer ]; + + conf = runCommand "${baseName}-conf.json" + { + inherit fromImage maxLayers created uid gid uname gname; + imageName = lib.toLower name; + preferLocalBuild = true; + passthru.imageTag = + if tag != null + then tag + else + lib.head (lib.strings.splitString "-" (baseNameOf (builtins.unsafeDiscardStringContext conf.outPath))); + paths = buildPackages.referencesByPopularity overallClosure; + nativeBuildInputs = [ jq ]; + } '' + ${if (tag == null) then '' + outName="$(basename "$out")" + outHash=$(echo "$outName" | cut -d - -f 1) + + imageTag=$outHash + '' else '' + imageTag="${tag}" + ''} + + # convert "created" to iso format + if [[ "$created" != "now" ]]; then + created="$(date -Iseconds -d "$created")" + fi + + paths() { + cat $paths ${lib.concatMapStringsSep " " + (path: "| (grep -v ${path} || true)") + unnecessaryDrvs} + } + + # Compute the number of layers that are already used by a potential + # 'fromImage' as well as the customization layer. Ensure that there is + # still at least one layer available to store the image contents. + usedLayers=0 + + # subtract number of base image layers + if [[ -n "$fromImage" ]]; then + (( usedLayers += $(tar -xOf "$fromImage" manifest.json | jq '.[0].Layers | length') )) + fi + + # one layer will be taken up by the customisation layer + (( usedLayers += 1 )) + + if ! (( $usedLayers < $maxLayers )); then + echo >&2 "Error: usedLayers $usedLayers layers to store 'fromImage' and" \ + "'extraCommands', but only maxLayers=$maxLayers were" \ + "allowed. At least 1 layer is required to store contents." + exit 1 + fi + availableLayers=$(( maxLayers - usedLayers )) + + # Create $maxLayers worth of Docker Layers, one layer per store path + # unless there are more paths than $maxLayers. In that case, create + # $maxLayers-1 for the most popular layers, and smush the remainaing + # store paths in to one final layer. + # + # The following code is fiddly w.r.t. ensuring every layer is + # created, and that no paths are missed. If you change the + # following lines, double-check that your code behaves properly + # when the number of layers equals: + # maxLayers-1, maxLayers, and maxLayers+1, 0 + paths | + jq -sR ' + rtrimstr("\n") | split("\n") + | (.[:$maxLayers-1] | map([.])) + [ .[$maxLayers-1:] ] + | map(select(length > 0)) + ' \ + --argjson maxLayers "$availableLayers" > store_layers.json + + # The index on $store_layers is necessary because the --slurpfile + # automatically reads the file as an array. + cat ${baseJson} | jq ' + . + { + "store_dir": $store_dir, + "from_image": $from_image, + "store_layers": $store_layers[0], + "customisation_layer", $customisation_layer, + "repo_tag": $repo_tag, + "created": $created, + "uid": $uid, + "gid": $gid, + "uname": $uname, + "gname": $gname + } + ' --arg store_dir "${storeDir}" \ + --argjson from_image ${if fromImage == null then "null" else "'\"${fromImage}\"'"} \ + --slurpfile store_layers store_layers.json \ + --arg customisation_layer ${customisationLayer} \ + --arg repo_tag "$imageName:$imageTag" \ + --arg created "$created" \ + --arg uid "$uid" \ + --arg gid "$gid" \ + --arg uname "$uname" \ + --arg gname "$gname" | + tee $out + ''; + + result = runCommand "stream-${baseName}" + { + inherit (conf) imageName; + preferLocalBuild = true; + passthru = passthru // { + inherit (conf) imageTag; + + # Distinguish tarballs and exes at the Nix level so functions that + # take images can know in advance how the image is supposed to be used. + isExe = true; + }; + nativeBuildInputs = [ makeWrapper ]; + } '' + makeWrapper ${streamScript} $out --add-flags ${conf} + ''; + in + result + ); + + # This function streams a docker image that behaves like a nix-shell for a derivation + streamNixShellImage = + { # The derivation whose environment this docker image should be based on + drv + , # Image Name + name ? drv.name + "-env" + , # Image tag, the Nix's output hash will be used if null + tag ? null + , # User id to run the container as. Defaults to 1000, because many + # binaries don't like to be run as root + uid ? 1000 + , # Group id to run the container as, see also uid + gid ? 1000 + , # The home directory of the user + homeDirectory ? "/build" + , # The path to the bash binary to use as the shell. See `NIX_BUILD_SHELL` in `man nix-shell` + shell ? bashInteractive + "/bin/bash" + , # Run this command in the environment of the derivation, in an interactive shell. See `--command` in `man nix-shell` + command ? null + , # Same as `command`, but runs the command in a non-interactive shell instead. See `--run` in `man nix-shell` + run ? null + }: + assert lib.assertMsg (! (drv.drvAttrs.__structuredAttrs or false)) + "streamNixShellImage: Does not work with the derivation ${drv.name} because it uses __structuredAttrs"; + assert lib.assertMsg (command == null || run == null) + "streamNixShellImage: Can't specify both command and run"; + let + + # A binary that calls the command to build the derivation + builder = writeShellScriptBin "buildDerivation" '' + exec ${lib.escapeShellArg (stringValue drv.drvAttrs.builder)} ${lib.escapeShellArgs (map stringValue drv.drvAttrs.args)} + ''; + + staticPath = "${dirOf shell}:${lib.makeBinPath [ builder ]}"; + + # https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L493-L526 + rcfile = writeText "nix-shell-rc" '' + unset PATH + dontAddDisableDepTrack=1 + # TODO: https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L506 + [ -e $stdenv/setup ] && source $stdenv/setup + PATH=${staticPath}:"$PATH" + SHELL=${lib.escapeShellArg shell} + BASH=${lib.escapeShellArg shell} + set +e + [ -n "$PS1" -a -z "$NIX_SHELL_PRESERVE_PROMPT" ] && PS1='\n\[\033[1;32m\][nix-shell:\w]\$\[\033[0m\] ' + if [ "$(type -t runHook)" = function ]; then + runHook shellHook + fi + unset NIX_ENFORCE_PURITY + shopt -u nullglob + shopt -s execfail + ${optionalString (command != null || run != null) '' + ${optionalString (command != null) command} + ${optionalString (run != null) run} + exit + ''} + ''; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/globals.hh#L464-L465 + sandboxBuildDir = "/build"; + + # This function closely mirrors what this Nix code does: + # https://github.com/NixOS/nix/blob/2.8.0/src/libexpr/primops.cc#L1102 + # https://github.com/NixOS/nix/blob/2.8.0/src/libexpr/eval.cc#L1981-L2036 + stringValue = value: + # We can't just use `toString` on all derivation attributes because that + # would not put path literals in the closure. So we explicitly copy + # those into the store here + if builtins.typeOf value == "path" then "${value}" + else if builtins.typeOf value == "list" then toString (map stringValue value) + else toString value; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L992-L1004 + drvEnv = lib.mapAttrs' (name: value: + let str = stringValue value; + in if lib.elem name (drv.drvAttrs.passAsFile or []) + then lib.nameValuePair "${name}Path" (writeText "pass-as-text-${name}" str) + else lib.nameValuePair name str + ) drv.drvAttrs // + # A mapping from output name to the nix store path where they should end up + # https://github.com/NixOS/nix/blob/2.8.0/src/libexpr/primops.cc#L1253 + lib.genAttrs drv.outputs (output: builtins.unsafeDiscardStringContext drv.${output}.outPath); + + # Environment variables set in the image + envVars = { + + # Root certificates for internet access + SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1027-L1030 + # PATH = "/path-not-set"; + # Allows calling bash and `buildDerivation` as the Cmd + PATH = staticPath; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1032-L1038 + HOME = homeDirectory; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1040-L1044 + NIX_STORE = storeDir; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1046-L1047 + # TODO: Make configurable? + NIX_BUILD_CORES = "1"; + + } // drvEnv // { + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1008-L1010 + NIX_BUILD_TOP = sandboxBuildDir; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1012-L1013 + TMPDIR = sandboxBuildDir; + TEMPDIR = sandboxBuildDir; + TMP = sandboxBuildDir; + TEMP = sandboxBuildDir; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1015-L1019 + PWD = sandboxBuildDir; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1071-L1074 + # We don't set it here because the output here isn't handled in any special way + # NIX_LOG_FD = "2"; + + # https://github.com/NixOS/nix/blob/2.8.0/src/libstore/build/local-derivation-goal.cc#L1076-L1077 + TERM = "xterm-256color"; + }; + + + in streamLayeredImage { + inherit name tag; + contents = [ + binSh + usrBinEnv + (fakeNss.override { + # Allows programs to look up the build user's home directory + # https://github.com/NixOS/nix/blob/ffe155abd36366a870482625543f9bf924a58281/src/libstore/build/local-derivation-goal.cc#L906-L910 + # Slightly differs however: We use the passed-in homeDirectory instead of sandboxBuildDir. + # We're doing this because it's arguably a bug in Nix that sandboxBuildDir is used here: https://github.com/NixOS/nix/issues/6379 + extraPasswdLines = [ + "nixbld:x:${toString uid}:${toString gid}:Build user:${homeDirectory}:/noshell" + ]; + extraGroupLines = [ + "nixbld:!:${toString gid}:" + ]; + }) + ]; + + fakeRootCommands = '' + # Effectively a single-user installation of Nix, giving the user full + # control over the Nix store. Needed for building the derivation this + # shell is for, but also in case one wants to use Nix inside the + # image + mkdir -p ./nix/{store,var/nix} ./etc/nix + chown -R ${toString uid}:${toString gid} ./nix ./etc/nix + + # Gives the user control over the build directory + mkdir -p .${sandboxBuildDir} + chown -R ${toString uid}:${toString gid} .${sandboxBuildDir} + ''; + + # Run this image as the given uid/gid + config.User = "${toString uid}:${toString gid}"; + config.Cmd = + # https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L185-L186 + # https://github.com/NixOS/nix/blob/2.8.0/src/nix-build/nix-build.cc#L534-L536 + if run == null + then [ shell "--rcfile" rcfile ] + else [ shell rcfile ]; + config.WorkingDir = sandboxBuildDir; + config.Env = lib.mapAttrsToList (name: value: "${name}=${value}") envVars; + }; + + # Wrapper around streamNixShellImage to build an image from the result + buildNixShellImage = { drv, compressor ? "gz", ... }@args: + let + stream = streamNixShellImage (builtins.removeAttrs args ["compressor"]); + compress = compressorForImage compressor drv.name; + in + runCommand "${drv.name}-env.tar${compress.ext}" + { + inherit (stream) imageName; + passthru = { inherit (stream) imageTag; }; + nativeBuildInputs = compress.nativeInputs; + } "${stream} | ${compress.compress} > $out"; +} diff --git a/pkgs/build-support/docker/detjson.py b/pkgs/build-support/docker/detjson.py new file mode 100644 index 0000000..fe82cbe --- /dev/null +++ b/pkgs/build-support/docker/detjson.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Deterministic layer json: https://github.com/docker/hub-feedback/issues/488 + +import sys +reload(sys) +sys.setdefaultencoding('UTF8') +import json + +# If any of the keys below are equal to a certain value +# then we can delete it because it's the default value +SAFEDELS = { + "Size": 0, + "config": { + "ExposedPorts": None, + "MacAddress": "", + "NetworkDisabled": False, + "PortSpecs": None, + "VolumeDriver": "" + } +} +SAFEDELS["container_config"] = SAFEDELS["config"] + +def makedet(j, safedels): + for k,v in safedels.items(): + if k not in j: + continue + if type(v) == dict: + makedet(j[k], v) + elif j[k] == v: + del j[k] + +def main(): + j = json.load(sys.stdin) + makedet(j, SAFEDELS) + json.dump(j, sys.stdout, sort_keys=True) + +if __name__ == '__main__': + main() diff --git a/pkgs/build-support/docker/examples.nix b/pkgs/build-support/docker/examples.nix new file mode 100644 index 0000000..52706ef --- /dev/null +++ b/pkgs/build-support/docker/examples.nix @@ -0,0 +1,900 @@ +# Examples of using the docker tools to build packages. +# +# This file defines several docker images. In order to use an image, +# build its derivation with `nix-build`, and then load the result with +# `docker load`. For example: +# +# $ nix-build '' -A dockerTools.examples.redis +# $ docker load < result + +{ pkgs, buildImage, buildLayeredImage, fakeNss, pullImage, shadowSetup, buildImageWithNixDb, pkgsCross, streamNixShellImage }: + +let + nixosLib = import ../../../nixos/lib { + # Experimental features need testing too, but there's no point in warning + # about it, so we enable the feature flag. + featureFlags.minimalModules = {}; + }; + evalMinimalConfig = module: nixosLib.evalModules { modules = [ module ]; }; + +in + +rec { + # 1. basic example + bash = buildImage { + name = "bash"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + paths = [ pkgs.bashInteractive ]; + pathsToLink = [ "/bin" ]; + }; + }; + + # 2. service example, layered on another image + redis = buildImage { + name = "redis"; + tag = "latest"; + + # for example's sake, we can layer redis on top of bash or debian + fromImage = bash; + # fromImage = debian; + + copyToRoot = pkgs.buildEnv { + name = "image-root"; + paths = [ pkgs.redis ]; + pathsToLink = [ "/bin" ]; + }; + + runAsRoot = '' + mkdir -p /data + ''; + + config = { + Cmd = [ "/bin/redis-server" ]; + WorkingDir = "/data"; + Volumes = { + "/data" = {}; + }; + }; + }; + + # 3. another service example + nginx = let + nginxPort = "80"; + nginxConf = pkgs.writeText "nginx.conf" '' + user nobody nobody; + daemon off; + error_log /dev/stdout info; + pid /dev/null; + events {} + http { + access_log /dev/stdout; + server { + listen ${nginxPort}; + index index.html; + location / { + root ${nginxWebRoot}; + } + } + } + ''; + nginxWebRoot = pkgs.writeTextDir "index.html" '' +

Hello from NGINX

+ ''; + in + buildLayeredImage { + name = "nginx-container"; + tag = "latest"; + contents = [ + fakeNss + pkgs.nginx + ]; + + extraCommands = '' + mkdir -p tmp/nginx_client_body + + # nginx still tries to read this directory even if error_log + # directive is specifying another file :/ + mkdir -p var/log/nginx + ''; + + config = { + Cmd = [ "nginx" "-c" nginxConf ]; + ExposedPorts = { + "${nginxPort}/tcp" = {}; + }; + }; + }; + + # 4. example of pulling an image. could be used as a base for other images + nixFromDockerHub = pullImage { + imageName = "nixos/nix"; + imageDigest = "sha256:85299d86263a3059cf19f419f9d286cc9f06d3c13146a8ebbb21b3437f598357"; + sha256 = "19fw0n3wmddahzr20mhdqv6jkjn1kanh6n2mrr08ai53dr8ph5n7"; + finalImageTag = "2.2.1"; + finalImageName = "nix"; + }; + # Same example, but re-fetches every time the fetcher implementation changes. + # NOTE: Only use this for testing, or you'd be wasting a lot of time, network and space. + testNixFromDockerHub = pkgs.testers.invalidateFetcherByDrvHash pullImage { + imageName = "nixos/nix"; + imageDigest = "sha256:85299d86263a3059cf19f419f9d286cc9f06d3c13146a8ebbb21b3437f598357"; + sha256 = "19fw0n3wmddahzr20mhdqv6jkjn1kanh6n2mrr08ai53dr8ph5n7"; + finalImageTag = "2.2.1"; + finalImageName = "nix"; + }; + + # 5. example of multiple contents, emacs and vi happily coexisting + editors = buildImage { + name = "editors"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ + pkgs.coreutils + pkgs.bash + pkgs.emacs + pkgs.vim + pkgs.nano + ]; + }; + }; + + # 6. nix example to play with the container nix store + # docker run -it --rm nix nix-store -qR $(nix-build '' -A nix) + nix = buildImageWithNixDb { + name = "nix"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ + # nix-store uses cat program to display results as specified by + # the image env variable NIX_PAGER. + pkgs.coreutils + pkgs.nix + pkgs.bash + ]; + }; + config = { + Env = [ + "NIX_PAGER=cat" + # A user is required by nix + # https://github.com/NixOS/nix/blob/9348f9291e5d9e4ba3c4347ea1b235640f54fd79/src/libutil/util.cc#L478 + "USER=nobody" + ]; + }; + }; + + # 7. example of adding something on top of an image pull by our + # dockerTools chain. + onTopOfPulledImage = buildImage { + name = "onTopOfPulledImage"; + tag = "latest"; + fromImage = nixFromDockerHub; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.hello ]; + }; + }; + + # 8. regression test for erroneous use of eval and string expansion. + # See issue #34779 and PR #40947 for details. + runAsRootExtraCommands = pkgs.dockerTools.buildImage { + name = "runAsRootExtraCommands"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.coreutils ]; + }; + # The parens here are to create problematic bash to embed and eval. In case + # this is *embedded* into the script (with nix expansion) the initial quotes + # will close the string and the following parens are unexpected + runAsRoot = ''echo "(runAsRoot)" > runAsRoot''; + extraCommands = ''echo "(extraCommand)" > extraCommands''; + }; + + # 9. Ensure that setting created to now results in a date which + # isn't the epoch + 1 + unstableDate = pkgs.dockerTools.buildImage { + name = "unstable-date"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.coreutils ]; + }; + created = "now"; + }; + + # 10. Create a layered image + layered-image = pkgs.dockerTools.buildLayeredImage { + name = "layered-image"; + tag = "latest"; + extraCommands = ''echo "(extraCommand)" > extraCommands''; + config.Cmd = [ "${pkgs.hello}/bin/hello" ]; + contents = [ pkgs.hello pkgs.bash pkgs.coreutils ]; + }; + + # 11. Create an image on top of a layered image + layered-on-top = pkgs.dockerTools.buildImage { + name = "layered-on-top"; + tag = "latest"; + fromImage = layered-image; + extraCommands = '' + mkdir ./example-output + chmod 777 ./example-output + ''; + config = { + Env = [ "PATH=${pkgs.coreutils}/bin/" ]; + WorkingDir = "/example-output"; + Cmd = [ + "${pkgs.bash}/bin/bash" "-c" "echo hello > foo; cat foo" + ]; + }; + }; + + # 12 Create a layered image on top of a layered image + layered-on-top-layered = pkgs.dockerTools.buildLayeredImage { + name = "layered-on-top-layered"; + tag = "latest"; + fromImage = layered-image; + extraCommands = '' + mkdir ./example-output + chmod 777 ./example-output + ''; + config = { + Env = [ "PATH=${pkgs.coreutils}/bin/" ]; + WorkingDir = "/example-output"; + Cmd = [ + "${pkgs.bash}/bin/bash" "-c" "echo hello > foo; cat foo" + ]; + }; + }; + + # 13. example of running something as root on top of a parent image + # Regression test related to PR #52109 + runAsRootParentImage = buildImage { + name = "runAsRootParentImage"; + tag = "latest"; + runAsRoot = "touch /example-file"; + fromImage = bash; + }; + + # 14. example of 3 layers images This image is used to verify the + # order of layers is correct. + # It allows to validate + # - the layer of parent are below + # - the order of parent layer is preserved at image build time + # (this is why there are 3 images) + layersOrder = let + l1 = pkgs.dockerTools.buildImage { + name = "l1"; + tag = "latest"; + extraCommands = '' + mkdir -p tmp + echo layer1 > tmp/layer1 + echo layer1 > tmp/layer2 + echo layer1 > tmp/layer3 + ''; + }; + l2 = pkgs.dockerTools.buildImage { + name = "l2"; + fromImage = l1; + tag = "latest"; + extraCommands = '' + mkdir -p tmp + echo layer2 > tmp/layer2 + echo layer2 > tmp/layer3 + ''; + }; + in pkgs.dockerTools.buildImage { + name = "l3"; + fromImage = l2; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.coreutils ]; + }; + extraCommands = '' + mkdir -p tmp + echo layer3 > tmp/layer3 + ''; + }; + + # 15. Environment variable inheritance. + # Child image should inherit parents environment variables, + # optionally overriding them. + environmentVariablesParent = pkgs.dockerTools.buildImage { + name = "parent"; + tag = "latest"; + config = { + Env = [ + "FROM_PARENT=true" + "LAST_LAYER=parent" + ]; + }; + }; + + environmentVariables = pkgs.dockerTools.buildImage { + name = "child"; + fromImage = environmentVariablesParent; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.coreutils ]; + }; + config = { + Env = [ + "FROM_CHILD=true" + "LAST_LAYER=child" + ]; + }; + }; + + environmentVariablesLayered = pkgs.dockerTools.buildLayeredImage { + name = "child"; + fromImage = environmentVariablesParent; + tag = "latest"; + contents = [ pkgs.coreutils ]; + config = { + Env = [ + "FROM_CHILD=true" + "LAST_LAYER=child" + ]; + }; + }; + + # 16. Create another layered image, for comparing layers with image 10. + another-layered-image = pkgs.dockerTools.buildLayeredImage { + name = "another-layered-image"; + tag = "latest"; + config.Cmd = [ "${pkgs.hello}/bin/hello" ]; + }; + + # 17. Create a layered image with only 2 layers + two-layered-image = pkgs.dockerTools.buildLayeredImage { + name = "two-layered-image"; + tag = "latest"; + config.Cmd = [ "${pkgs.hello}/bin/hello" ]; + contents = [ pkgs.bash pkgs.hello ]; + maxLayers = 2; + }; + + # 18. Create a layered image with more packages than max layers. + # coreutils and hello are part of the same layer + bulk-layer = pkgs.dockerTools.buildLayeredImage { + name = "bulk-layer"; + tag = "latest"; + contents = with pkgs; [ + coreutils hello + ]; + maxLayers = 2; + }; + + # 19. Create a layered image with a base image and more packages than max + # layers. coreutils and hello are part of the same layer + layered-bulk-layer = pkgs.dockerTools.buildLayeredImage { + name = "layered-bulk-layer"; + tag = "latest"; + fromImage = two-layered-image; + contents = with pkgs; [ + coreutils hello + ]; + maxLayers = 4; + }; + + # 20. Create a "layered" image without nix store layers. This is not + # recommended, but can be useful for base images in rare cases. + no-store-paths = pkgs.dockerTools.buildLayeredImage { + name = "no-store-paths"; + tag = "latest"; + extraCommands = '' + # This removes sharing of busybox and is not recommended. We do this + # to make the example suitable as a test case with working binaries. + cp -r ${pkgs.pkgsStatic.busybox}/* . + + # This is a "build" dependency that will not appear in the image + ${pkgs.hello}/bin/hello + ''; + }; + + nixLayered = pkgs.dockerTools.buildLayeredImageWithNixDb { + name = "nix-layered"; + tag = "latest"; + contents = [ + # nix-store uses cat program to display results as specified by + # the image env variable NIX_PAGER. + pkgs.coreutils + pkgs.nix + pkgs.bash + ]; + config = { + Env = [ + "NIX_PAGER=cat" + # A user is required by nix + # https://github.com/NixOS/nix/blob/9348f9291e5d9e4ba3c4347ea1b235640f54fd79/src/libutil/util.cc#L478 + "USER=nobody" + ]; + }; + }; + + # 21. Support files in the store on buildLayeredImage + # See: https://github.com/NixOS/nixpkgs/pull/91084#issuecomment-653496223 + filesInStore = pkgs.dockerTools.buildLayeredImageWithNixDb { + name = "file-in-store"; + tag = "latest"; + contents = [ + pkgs.coreutils + pkgs.nix + (pkgs.writeScriptBin "myscript" '' + #!${pkgs.runtimeShell} + cat ${pkgs.writeText "somefile" "some data"} + '') + ]; + config = { + Cmd = [ "myscript" ]; + # For some reason 'nix-store --verify' requires this environment variable + Env = [ "USER=root" ]; + }; + }; + + # 22. Ensure that setting created to now results in a date which + # isn't the epoch + 1 for layered images. + unstableDateLayered = pkgs.dockerTools.buildLayeredImage { + name = "unstable-date-layered"; + tag = "latest"; + contents = [ pkgs.coreutils ]; + created = "now"; + }; + + # 23. Ensure that layers are unpacked in the correct order before the + # runAsRoot script is executed. + layersUnpackOrder = + let + layerOnTopOf = parent: layerName: + pkgs.dockerTools.buildImage { + name = "layers-unpack-order-${layerName}"; + tag = "latest"; + fromImage = parent; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ pkgs.coreutils ]; + }; + runAsRoot = '' + #!${pkgs.runtimeShell} + echo -n "${layerName}" >> /layer-order + ''; + }; + # When executing the runAsRoot script when building layer C, if layer B is + # not unpacked on top of layer A, the contents of /layer-order will not be + # "ABC". + layerA = layerOnTopOf null "a"; + layerB = layerOnTopOf layerA "b"; + layerC = layerOnTopOf layerB "c"; + in layerC; + + bashUncompressed = pkgs.dockerTools.buildImage { + name = "bash-uncompressed"; + tag = "latest"; + compressor = "none"; + # Not recommended. Use `buildEnv` between copy and packages to avoid file duplication. + copyToRoot = pkgs.bashInteractive; + }; + + bashZstdCompressed = pkgs.dockerTools.buildImage { + name = "bash-zstd"; + tag = "latest"; + compressor = "zstd"; + # Not recommended. Use `buildEnv` between copy and packages to avoid file duplication. + copyToRoot = pkgs.bashInteractive; + }; + + # buildImage without explicit tag + bashNoTag = pkgs.dockerTools.buildImage { + name = "bash-no-tag"; + # Not recommended. Use `buildEnv` between copy and packages to avoid file duplication. + copyToRoot = pkgs.bashInteractive; + }; + + # buildLayeredImage without explicit tag + bashNoTagLayered = pkgs.dockerTools.buildLayeredImage { + name = "bash-no-tag-layered"; + contents = pkgs.bashInteractive; + }; + + # buildLayeredImage without compression + bashLayeredUncompressed = pkgs.dockerTools.buildLayeredImage { + name = "bash-layered-uncompressed"; + tag = "latest"; + compressor = "none"; + contents = pkgs.bashInteractive; + }; + + # buildLayeredImage with zstd compression + bashLayeredZstdCompressed = pkgs.dockerTools.buildLayeredImage { + name = "bash-layered-zstd"; + tag = "latest"; + compressor = "zstd"; + contents = pkgs.bashInteractive; + }; + + # streamLayeredImage without explicit tag + bashNoTagStreamLayered = pkgs.dockerTools.streamLayeredImage { + name = "bash-no-tag-stream-layered"; + contents = pkgs.bashInteractive; + }; + + # buildLayeredImage with non-root user + bashLayeredWithUser = + let + nonRootShadowSetup = { user, uid, gid ? uid }: with pkgs; [ + ( + writeTextDir "etc/shadow" '' + root:!x::::::: + ${user}:!::::::: + '' + ) + ( + writeTextDir "etc/passwd" '' + root:x:0:0::/root:${runtimeShell} + ${user}:x:${toString uid}:${toString gid}::/home/${user}: + '' + ) + ( + writeTextDir "etc/group" '' + root:x:0: + ${user}:x:${toString gid}: + '' + ) + ( + writeTextDir "etc/gshadow" '' + root:x:: + ${user}:x:: + '' + ) + ]; + in + pkgs.dockerTools.buildLayeredImage { + name = "bash-layered-with-user"; + tag = "latest"; + contents = [ pkgs.bash pkgs.coreutils ] ++ nonRootShadowSetup { uid = 999; user = "somebody"; }; + }; + + # basic example, with cross compilation + cross = let + # Cross compile for x86_64 if on aarch64 + crossPkgs = + if pkgs.stdenv.hostPlatform.system == "aarch64-linux" then pkgsCross.gnu64 + else pkgsCross.aarch64-multiplatform; + in crossPkgs.dockerTools.buildImage { + name = "hello-cross"; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "image-root"; + pathsToLink = [ "/bin" ]; + paths = [ crossPkgs.hello ]; + }; + }; + + # layered image where a store path is itself a symlink + layeredStoreSymlink = + let + target = pkgs.writeTextDir "dir/target" "Content doesn't matter."; + symlink = pkgs.runCommand "symlink" {} "ln -s ${target} $out"; + in + pkgs.dockerTools.buildLayeredImage { + name = "layeredstoresymlink"; + tag = "latest"; + contents = [ pkgs.bash symlink ]; + } // { passthru = { inherit symlink; }; }; + + # image with registry/ prefix + prefixedImage = pkgs.dockerTools.buildImage { + name = "registry-1.docker.io/image"; + tag = "latest"; + config.Cmd = [ "${pkgs.hello}/bin/hello" ]; + }; + + # layered image with registry/ prefix + prefixedLayeredImage = pkgs.dockerTools.buildLayeredImage { + name = "registry-1.docker.io/layered-image"; + tag = "latest"; + config.Cmd = [ "${pkgs.hello}/bin/hello" ]; + }; + + # layered image with files owned by a user other than root + layeredImageWithFakeRootCommands = pkgs.dockerTools.buildLayeredImage { + name = "layered-image-with-fake-root-commands"; + tag = "latest"; + contents = [ + pkgs.pkgsStatic.busybox + ]; + fakeRootCommands = '' + mkdir -p ./home/alice + chown 1000 ./home/alice + ln -s ${pkgs.hello.overrideAttrs (o: { + # A unique `hello` to make sure that it isn't included via another mechanism by accident. + configureFlags = o.configureFlags or [] ++ [ " --program-prefix=layeredImageWithFakeRootCommands-" ]; + doCheck = false; + })} ./hello + ''; + }; + + # tarball consisting of both bash and redis images + mergedBashAndRedis = pkgs.dockerTools.mergeImages [ + bash + redis + ]; + + # tarball consisting of bash (without tag) and redis images + mergedBashNoTagAndRedis = pkgs.dockerTools.mergeImages [ + bashNoTag + redis + ]; + + # tarball consisting of bash and layered image with different owner of the + # /home/alice directory + mergedBashFakeRoot = pkgs.dockerTools.mergeImages [ + bash + layeredImageWithFakeRootCommands + ]; + + mergeVaryingCompressor = pkgs.dockerTools.mergeImages [ + redis + bashUncompressed + bashZstdCompressed + ]; + + helloOnRoot = pkgs.dockerTools.streamLayeredImage { + name = "hello"; + tag = "latest"; + contents = [ + (pkgs.buildEnv { + name = "hello-root"; + paths = [ pkgs.hello ]; + }) + ]; + config.Cmd = [ "hello" ]; + }; + + helloOnRootNoStore = pkgs.dockerTools.streamLayeredImage { + name = "hello"; + tag = "latest"; + contents = [ + (pkgs.buildEnv { + name = "hello-root"; + paths = [ pkgs.hello ]; + }) + ]; + config.Cmd = [ "hello" ]; + includeStorePaths = false; + }; + + helloOnRootNoStoreFakechroot = pkgs.dockerTools.streamLayeredImage { + name = "hello"; + tag = "latest"; + contents = [ + (pkgs.buildEnv { + name = "hello-root"; + paths = [ pkgs.hello ]; + }) + ]; + config.Cmd = [ "hello" ]; + includeStorePaths = false; + enableFakechroot = true; + }; + + etc = + let + inherit (pkgs) lib; + nixosCore = (evalMinimalConfig ({ config, ... }: { + imports = [ + pkgs.pkgsModule + ../../../nixos/modules/system/etc/etc.nix + ]; + environment.etc."some-config-file" = { + text = '' + 127.0.0.1 localhost + ::1 localhost + ''; + # For executables: + # mode = "0755"; + }; + })); + in pkgs.dockerTools.streamLayeredImage { + name = "etc"; + tag = "latest"; + enableFakechroot = true; + fakeRootCommands = '' + mkdir -p /etc + ${nixosCore.config.system.build.etcActivationCommands} + ''; + config.Cmd = pkgs.writeScript "etc-cmd" '' + #!${pkgs.busybox}/bin/sh + ${pkgs.busybox}/bin/cat /etc/some-config-file + ''; + }; + + # Example export of the bash image + exportBash = pkgs.dockerTools.exportImage { fromImage = bash; }; + + imageViaFakeChroot = pkgs.dockerTools.streamLayeredImage { + name = "image-via-fake-chroot"; + tag = "latest"; + config.Cmd = [ "hello" ]; + enableFakechroot = true; + # Crucially, instead of a relative path, this creates /bin, which is + # intercepted by fakechroot. + # This functionality is not available on darwin as of 2021. + fakeRootCommands = '' + mkdir /bin + ln -s ${pkgs.hello}/bin/hello /bin/hello + ''; + }; + + build-image-with-path = buildImage { + name = "build-image-with-path"; + tag = "latest"; + # Not recommended. Use `buildEnv` between copy and packages to avoid file duplication. + copyToRoot = [ pkgs.bashInteractive ./test-dummy ]; + }; + + layered-image-with-path = pkgs.dockerTools.streamLayeredImage { + name = "layered-image-with-path"; + tag = "latest"; + contents = [ pkgs.bashInteractive ./test-dummy ]; + }; + + build-image-with-architecture = buildImage { + name = "build-image-with-architecture"; + tag = "latest"; + architecture = "arm64"; + # Not recommended. Use `buildEnv` between copy and packages to avoid file duplication. + copyToRoot = [ pkgs.bashInteractive ./test-dummy ]; + }; + + layered-image-with-architecture = pkgs.dockerTools.streamLayeredImage { + name = "layered-image-with-architecture"; + tag = "latest"; + architecture = "arm64"; + contents = [ pkgs.bashInteractive ./test-dummy ]; + }; + + # ensure that caCertificates builds + image-with-certs = buildImage { + name = "image-with-certs"; + tag = "latest"; + + copyToRoot = pkgs.buildEnv { + name = "image-with-certs-root"; + paths = [ + pkgs.coreutils + pkgs.dockerTools.caCertificates + ]; + }; + + config = { + }; + }; + + nix-shell-basic = streamNixShellImage { + name = "nix-shell-basic"; + tag = "latest"; + drv = pkgs.hello; + }; + + nix-shell-hook = streamNixShellImage { + name = "nix-shell-hook"; + tag = "latest"; + drv = pkgs.mkShell { + shellHook = '' + echo "This is the shell hook!" + exit + ''; + }; + }; + + nix-shell-inputs = streamNixShellImage { + name = "nix-shell-inputs"; + tag = "latest"; + drv = pkgs.mkShell { + nativeBuildInputs = [ + pkgs.hello + ]; + }; + command = '' + hello + ''; + }; + + nix-shell-pass-as-file = streamNixShellImage { + name = "nix-shell-pass-as-file"; + tag = "latest"; + drv = pkgs.mkShell { + str = "this is a string"; + passAsFile = [ "str" ]; + }; + command = '' + cat "$strPath" + ''; + }; + + nix-shell-run = streamNixShellImage { + name = "nix-shell-run"; + tag = "latest"; + drv = pkgs.mkShell {}; + run = '' + case "$-" in + *i*) echo This shell is interactive ;; + *) echo This shell is not interactive ;; + esac + ''; + }; + + nix-shell-command = streamNixShellImage { + name = "nix-shell-command"; + tag = "latest"; + drv = pkgs.mkShell {}; + command = '' + case "$-" in + *i*) echo This shell is interactive ;; + *) echo This shell is not interactive ;; + esac + ''; + }; + + nix-shell-writable-home = streamNixShellImage { + name = "nix-shell-writable-home"; + tag = "latest"; + drv = pkgs.mkShell {}; + run = '' + if [[ "$HOME" != "$(eval "echo ~$(whoami)")" ]]; then + echo "\$HOME ($HOME) is not the same as ~\$(whoami) ($(eval "echo ~$(whoami)"))" + exit 1 + fi + + if ! touch $HOME/test-file; then + echo "home directory is not writable" + exit 1 + fi + echo "home directory is writable" + ''; + }; + + nix-shell-nonexistent-home = streamNixShellImage { + name = "nix-shell-nonexistent-home"; + tag = "latest"; + drv = pkgs.mkShell {}; + homeDirectory = "/homeless-shelter"; + run = '' + if [[ "$HOME" != "$(eval "echo ~$(whoami)")" ]]; then + echo "\$HOME ($HOME) is not the same as ~\$(whoami) ($(eval "echo ~$(whoami)"))" + exit 1 + fi + + if -e $HOME; then + echo "home directory exists" + exit 1 + fi + echo "home directory doesn't exist" + ''; + }; + + nix-shell-build-derivation = streamNixShellImage { + name = "nix-shell-build-derivation"; + tag = "latest"; + drv = pkgs.hello; + run = '' + buildDerivation + $out/bin/hello + ''; + }; + +} diff --git a/pkgs/build-support/docker/nix-prefetch-docker b/pkgs/build-support/docker/nix-prefetch-docker new file mode 100755 index 0000000..f551d37 --- /dev/null +++ b/pkgs/build-support/docker/nix-prefetch-docker @@ -0,0 +1,173 @@ +#! /usr/bin/env bash + +set -e -o pipefail + +os= +arch= +imageName= +imageTag= +imageDigest= +finalImageName= +finalImageTag= +hashType=$NIX_HASH_ALGO +hashFormat=$hashFormat +format=nix + +usage(){ + echo >&2 "syntax: nix-prefetch-docker [options] [IMAGE_NAME [IMAGE_TAG|IMAGE_DIGEST]] + +Options: + --os os OS to fetch image for + --arch linux Arch to fetch image for + --image-name name Name of the image to fetch + --image-tag tag Image tag + --image-digest digest Image digest + --final-image-name name Desired name of the image + --final-image-tag tag Desired image tag + --json Output result in json format instead of nix + --quiet Only print the final result +" + exit 1 +} + +get_image_digest(){ + local imageName=$1 + local imageTag=$2 + + if test -z "$imageTag"; then + imageTag="latest" + fi + + skopeo --override-os "${os}" --override-arch "${arch}" --insecure-policy --tmpdir=$TMPDIR inspect "docker://$imageName:$imageTag" | jq '.Digest' -r +} + +get_name() { + local imageName=$1 + local imageTag=$2 + + echo "docker-image-$(echo "$imageName:$imageTag" | tr '/:' '-').tar" +} + +argi=0 +argfun="" +for arg; do + if test -z "$argfun"; then + case $arg in + --os) argfun=set_os;; + --arch) argfun=set_arch;; + --image-name) argfun=set_imageName;; + --image-tag) argfun=set_imageTag;; + --image-digest) argfun=set_imageDigest;; + --final-image-name) argfun=set_finalImageName;; + --final-image-tag) argfun=set_finalImageTag;; + --quiet) QUIET=true;; + --json) format=json;; + --help) usage; exit;; + *) + : $((++argi)) + case $argi in + 1) imageName=$arg;; + 2) [[ $arg == *"sha256"* ]] && imageDigest=$arg || imageTag=$arg;; + *) exit 1;; + esac + ;; + esac + else + case $argfun in + set_*) + var=${argfun#set_} + eval $var=$arg + ;; + esac + argfun="" + fi +done + +if test -z "$imageName"; then + usage +fi + +if test -z "$os"; then + os=linux +fi + +if test -z "$arch"; then + arch=amd64 +fi + +if test -z "$hashType"; then + hashType=sha256 +fi + +if test -z "$hashFormat"; then + hashFormat=base32 +fi + +if test -z "$finalImageName"; then + finalImageName="$imageName" +fi + +if test -z "$finalImageTag"; then + if test -z "$imageTag"; then + finalImageTag="latest" + else + finalImageTag="$imageTag" + fi +fi + +if test -z "$imageDigest"; then + imageDigest=$(get_image_digest $imageName $imageTag) +fi + +sourceUrl="docker://$imageName@$imageDigest" + +tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/skopeo-copy-tmp-XXXXXXXX")" +trap "rm -rf \"$tmpPath\"" EXIT + +tmpFile="$tmpPath/$(get_name $finalImageName $finalImageTag)" + +if test -z "$QUIET"; then + skopeo --insecure-policy --tmpdir=$TMPDIR --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag" >&2 +else + skopeo --insecure-policy --tmpdir=$TMPDIR --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag" > /dev/null +fi + +# Compute the hash. +imageHash=$(nix-hash --flat --type $hashType --base32 "$tmpFile") + +# Add the downloaded file to Nix store. +finalPath=$(nix-store --add-fixed "$hashType" "$tmpFile") + +if test -z "$QUIET"; then + echo "-> ImageName: $imageName" >&2 + echo "-> ImageDigest: $imageDigest" >&2 + echo "-> FinalImageName: $finalImageName" >&2 + echo "-> FinalImageTag: $finalImageTag" >&2 + echo "-> ImagePath: $finalPath" >&2 + echo "-> ImageHash: $imageHash" >&2 +fi + +if [ "$format" == "nix" ]; then +cat < + # To enable discovery through `projectReferences` you would need to add a line: + # + # +, projectReferences ? [ ] + # Libraries that need to be available at runtime should be passed through this. + # These get wrapped into `LD_LIBRARY_PATH`. +, runtimeDeps ? [ ] + # The dotnet runtime ID. If null, fetch-deps will gather dependencies for all + # platforms in meta.platforms which are supported by the sdk. +, runtimeId ? null + + # Tests to disable. This gets passed to `dotnet test --filter "FullyQualifiedName!={}"`, to ensure compatibility with all frameworks. + # See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details for more details. +, disabledTests ? [ ] + # The project file to run unit tests against. This is usually referenced in the regular project file, but sometimes it needs to be manually set. + # It gets restored and build, but not installed. You may need to regenerate your nuget lockfile after setting this. +, testProjectFile ? "" + + # The type of build to perform. This is passed to `dotnet` with the `--configuration` flag. Possible values are `Release`, `Debug`, etc. +, buildType ? "Release" + # If set to true, builds the application as a self-contained - removing the runtime dependency on dotnet +, selfContainedBuild ? false + # Whether to use an alternative wrapper, that executes the application DLL using the dotnet runtime from the user environment. `dotnet-runtime` is provided as a default in case no .NET is installed + # This is useful for .NET tools and applications that may need to run under different .NET runtimes +, useDotnetFromEnv ? false + # Whether to explicitly enable UseAppHost when building. This is redundant if useDotnetFromEnv is enabledz +, useAppHost ? true + # The dotnet SDK to use. +, dotnet-sdk ? dotnetCorePackages.sdk_6_0 + # The dotnet runtime to use. +, dotnet-runtime ? dotnetCorePackages.runtime_6_0 + # The dotnet SDK to run tests against. This can differentiate from the SDK compiled against. +, dotnet-test-sdk ? dotnet-sdk +, ... +} @ args: + +let + platforms = + if args ? meta.platforms + then lib.intersectLists args.meta.platforms dotnet-sdk.meta.platforms + else dotnet-sdk.meta.platforms; + + inherit (callPackage ./hooks { + inherit dotnet-sdk dotnet-test-sdk disabledTests nuget-source dotnet-runtime runtimeDeps buildType; + runtimeId = + if runtimeId != null + then runtimeId + else dotnetCorePackages.systemToDotnetRid stdenvNoCC.targetPlatform.system; + }) dotnetConfigureHook dotnetBuildHook dotnetCheckHook dotnetInstallHook dotnetFixupHook; + + localDeps = + if (projectReferences != [ ]) + then linkFarmFromDrvs "${name}-project-references" projectReferences + else null; + + _nugetDeps = + if (nugetDeps != null) then + if lib.isDerivation nugetDeps + then nugetDeps + else mkNugetDeps { + inherit name; + sourceFile = nugetDeps; + } + else throw "Defining the `nugetDeps` attribute is required, as to lock the NuGet dependencies. This file can be generated by running the `passthru.fetch-deps` script."; + + # contains the actual package dependencies + dependenciesSource = mkNugetSource { + name = "${name}-dependencies-source"; + description = "A Nuget source with the dependencies for ${name}"; + deps = [ _nugetDeps ] ++ lib.optional (localDeps != null) localDeps; + }; + + # this contains all the nuget packages that are implicitly referenced by the dotnet + # build system. having them as separate deps allows us to avoid having to regenerate + # a packages dependencies when the dotnet-sdk version changes + sdkDeps = lib.lists.flatten [ dotnet-sdk.packages ]; + + sdkSource = let + version = dotnet-sdk.version or (lib.concatStringsSep "-" dotnet-sdk.versions); + in mkNugetSource { + name = "dotnet-sdk-${version}-source"; + deps = sdkDeps; + }; + + nuget-source = symlinkJoin { + name = "${name}-nuget-source"; + paths = [ dependenciesSource sdkSource ]; + }; + + nugetDepsFile = _nugetDeps.sourceFile; +in +stdenvNoCC.mkDerivation (args // { + nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [ + dotnetConfigureHook + dotnetBuildHook + dotnetCheckHook + dotnetInstallHook + dotnetFixupHook + + cacert + makeWrapper + dotnet-sdk + ]; + + # Parse the version attr into a format acceptable for the Version msbuild property + # The actual version attr is saved in InformationalVersion, which accepts an arbitrary string + versionForDotnet = if !(lib.hasAttr "version" args) || args.version == null + then null else let + components = lib.pipe args.version [ + lib.splitVersion + (lib.filter (x: (lib.strings.match "[0-9]+" x) != null)) + (lib.filter (x: (lib.toIntBase10 x) < 65535)) # one version component in dotnet has to fit in 16 bits + ]; + in if (lib.length components) == 0 + then null + else lib.concatStringsSep "." ((lib.take 4 components) + ++ (if (lib.length components) < 4 + then lib.replicate (4 - (lib.length components)) "0" + else [ ])); + + makeWrapperArgs = args.makeWrapperArgs or [ ] ++ [ + "--prefix LD_LIBRARY_PATH : ${dotnet-sdk.icu}/lib" + ]; + + # Stripping breaks the executable + dontStrip = args.dontStrip or true; + + # gappsWrapperArgs gets included when wrapping for dotnet, as to avoid double wrapping + dontWrapGApps = args.dontWrapGApps or true; + + inherit selfContainedBuild useAppHost useDotnetFromEnv; + + passthru = { + inherit nuget-source; + } // lib.optionalAttrs (!lib.isDerivation nugetDeps) { + fetch-deps = + let + flags = dotnetFlags ++ dotnetRestoreFlags; + runtimeIds = + if runtimeId != null + then [ runtimeId ] + else map (system: dotnetCorePackages.systemToDotnetRid system) platforms; + defaultDepsFile = + # Wire in the nugetDeps file such that running the script with no args + # runs it agains the correct deps file by default. + # Note that toString is necessary here as it results in the path at + # eval time (i.e. to the file in your local Nixpkgs checkout) rather + # than the Nix store path of the path after it's been imported. + if lib.isPath nugetDepsFile && !lib.hasPrefix "${builtins.storeDir}/" (toString nugetDepsFile) + then toString nugetDepsFile + else ''$(mktemp -t "${pname}-deps-XXXXXX.nix")''; + in + writeShellScript "fetch-${pname}-deps" '' + set -euo pipefail + + export PATH="${lib.makeBinPath [ coreutils runtimeShellPackage dotnet-sdk (nuget-to-nix.override { inherit dotnet-sdk; }) ]}" + + for arg in "$@"; do + case "$arg" in + --keep-sources|-k) + keepSources=1 + shift + ;; + --help|-h) + echo "usage: $0 [--keep-sources] [--help] " + echo " The path to write the lockfile to. A temporary file is used if this is not set" + echo " --keep-sources Dont remove temporary directories upon exit, useful for debugging" + echo " --help Show this help message" + exit + ;; + esac + done + + if [[ ''${TMPDIR:-} == /run/user/* ]]; then + # /run/user is usually a tmpfs in RAM, which may be too small + # to store all downloaded dotnet packages + unset TMPDIR + fi + + export tmp=$(mktemp -td "deps-${pname}-XXXXXX") + HOME=$tmp/home + + exitTrap() { + test -n "''${ranTrap-}" && return + ranTrap=1 + + if test -n "''${keepSources-}"; then + echo -e "Path to the source: $tmp/src\nPath to the fake home: $tmp/home" + else + rm -rf "$tmp" + fi + + # Since mktemp is used this will be empty if the script didnt succesfully complete + if ! test -s "$depsFile"; then + rm -rf "$depsFile" + fi + } + + trap exitTrap EXIT INT TERM + + dotnetRestore() { + local -r project="''${1-}" + local -r rid="$2" + + dotnet restore ''${project-} \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --packages "$tmp/nuget_pkgs" \ + --runtime "$rid" \ + --no-cache \ + --force \ + ${lib.optionalString (!enableParallelBuilding) "--disable-parallel"} \ + ${lib.optionalString (flags != []) (toString flags)} + } + + declare -a projectFiles=( ${toString (lib.toList projectFile)} ) + declare -a testProjectFiles=( ${toString (lib.toList testProjectFile)} ) + + export DOTNET_NOLOGO=1 + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + + depsFile=$(realpath "''${1:-${defaultDepsFile}}") + echo Will write lockfile to "$depsFile" + mkdir -p "$tmp/nuget_pkgs" + + storeSrc="${srcOnly args}" + src=$tmp/src + cp -rT "$storeSrc" "$src" + chmod -R +w "$src" + + cd "$src" + echo "Restoring project..." + + ${dotnet-sdk}/bin/dotnet tool restore + cp -r $HOME/.nuget/packages/* $tmp/nuget_pkgs || true + + for rid in "${lib.concatStringsSep "\" \"" runtimeIds}"; do + (( ''${#projectFiles[@]} == 0 )) && dotnetRestore "" "$rid" + + for project in ''${projectFiles[@]-} ''${testProjectFiles[@]-}; do + dotnetRestore "$project" "$rid" + done + done + # Second copy, makes sure packages restored by ie. paket are included + cp -r $HOME/.nuget/packages/* $tmp/nuget_pkgs || true + + echo "Succesfully restored project" + + echo "Writing lockfile..." + + excluded_sources="${lib.concatStringsSep " " sdkDeps}" + for excluded_source in ''${excluded_sources[@]}; do + ls "$excluded_source" >> "$tmp/excluded_list" + done + tmpFile="$tmp"/deps.nix + echo -e "# This file was automatically generated by passthru.fetch-deps.\n# Please dont edit it manually, your changes might get overwritten!\n" > "$tmpFile" + nuget-to-nix "$tmp/nuget_pkgs" "$tmp/excluded_list" >> "$tmpFile" + mv "$tmpFile" "$depsFile" + echo "Succesfully wrote lockfile to $depsFile" + ''; + } // args.passthru or { }; + + meta = (args.meta or { }) // { inherit platforms; }; +} + # ICU tries to unconditionally load files from /usr/share/icu on Darwin, which makes builds fail + # in the sandbox, so disable ICU on Darwin. This, as far as I know, shouldn't cause any built packages + # to behave differently, just the dotnet build tool. + // lib.optionalAttrs stdenvNoCC.isDarwin { DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = 1; }) diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/default.nix b/pkgs/build-support/dotnet/build-dotnet-module/hooks/default.nix new file mode 100644 index 0000000..7012ff3 --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/default.nix @@ -0,0 +1,89 @@ +{ lib +, stdenv +, which +, coreutils +, zlib +, openssl +, callPackage +, makeSetupHook +, makeWrapper +, dotnet-sdk +, dotnet-test-sdk +, disabledTests +, nuget-source +, dotnet-runtime +, runtimeDeps +, buildType +, runtimeId +}: +assert (builtins.isString runtimeId); + +let + libraryPath = lib.makeLibraryPath runtimeDeps; +in +{ + dotnetConfigureHook = callPackage ({ }: + makeSetupHook { + name = "dotnet-configure-hook"; + propagatedBuildInputs = [ dotnet-sdk nuget-source ]; + substitutions = { + nugetSource = nuget-source; + dynamicLinker = "${stdenv.cc}/nix-support/dynamic-linker"; + libPath = lib.makeLibraryPath [ + stdenv.cc.cc.lib + stdenv.cc.libc + dotnet-sdk.passthru.icu + zlib + openssl + ]; + inherit runtimeId; + }; + } ./dotnet-configure-hook.sh) { }; + + dotnetBuildHook = callPackage ({ }: + makeSetupHook { + name = "dotnet-build-hook"; + propagatedBuildInputs = [ dotnet-sdk ]; + substitutions = { + inherit buildType runtimeId; + }; + } ./dotnet-build-hook.sh) { }; + + dotnetCheckHook = callPackage ({ }: + makeSetupHook { + name = "dotnet-check-hook"; + propagatedBuildInputs = [ dotnet-test-sdk ]; + substitutions = { + inherit buildType runtimeId libraryPath; + disabledTests = lib.optionalString (disabledTests != []) + (let + escapedNames = lib.lists.map (n: lib.replaceStrings [","] ["%2C"] n) disabledTests; + filters = lib.lists.map (n: "FullyQualifiedName!=${n}") escapedNames; + in + "${lib.concatStringsSep "&" filters}"); + }; + } ./dotnet-check-hook.sh) { }; + + dotnetInstallHook = callPackage ({ }: + makeSetupHook { + name = "dotnet-install-hook"; + propagatedBuildInputs = [ dotnet-sdk ]; + substitutions = { + inherit buildType runtimeId; + }; + } ./dotnet-install-hook.sh) { }; + + dotnetFixupHook = callPackage ({ }: + makeSetupHook { + name = "dotnet-fixup-hook"; + propagatedBuildInputs = [ dotnet-runtime ]; + substitutions = { + dotnetRuntime = dotnet-runtime; + runtimeDeps = libraryPath; + shell = stdenv.shell; + which = "${which}/bin/which"; + dirname = "${coreutils}/bin/dirname"; + realpath = "${coreutils}/bin/realpath"; + }; + } ./dotnet-fixup-hook.sh) { }; +} diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh new file mode 100644 index 0000000..0acfece --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-build-hook.sh @@ -0,0 +1,70 @@ +# inherit arguments from derivation +dotnetBuildFlags=( ${dotnetBuildFlags[@]-} ) + +dotnetBuildHook() { + echo "Executing dotnetBuildHook" + + runHook preBuild + + if [ "${enableParallelBuilding-}" ]; then + local -r maxCpuFlag="$NIX_BUILD_CORES" + local -r parallelBuildFlag="true" + else + local -r maxCpuFlag="1" + local -r parallelBuildFlag="false" + fi + + if [ "${selfContainedBuild-}" ]; then + dotnetBuildFlags+=("-p:SelfContained=true") + else + dotnetBuildFlags+=("-p:SelfContained=false") + fi + + if [ "${useAppHost-}" ]; then + dotnetBuildFlags+=("-p:UseAppHost=true") + fi + + local versionFlags=() + if [ "${version-}" ]; then + versionFlags+=("-p:InformationalVersion=${version-}") + fi + + if [ "${versionForDotnet-}" ]; then + versionFlags+=("-p:Version=${versionForDotnet-}") + fi + + dotnetBuild() { + local -r project="${1-}" + + runtimeIdFlags=() + if [[ "$project" == *.csproj ]] || [ "${selfContainedBuild-}" ]; then + runtimeIdFlags+=("--runtime @runtimeId@") + fi + + env dotnet build ${project-} \ + -maxcpucount:$maxCpuFlag \ + -p:BuildInParallel=$parallelBuildFlag \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --configuration "@buildType@" \ + --no-restore \ + ${versionFlags[@]} \ + ${runtimeIdFlags[@]} \ + ${dotnetBuildFlags[@]} \ + ${dotnetFlags[@]} + } + + (( "${#projectFile[@]}" == 0 )) && dotnetBuild + + for project in ${projectFile[@]} ${testProjectFile[@]-}; do + dotnetBuild "$project" + done + + runHook postBuild + + echo "Finished dotnetBuildHook" +} + +if [[ -z "${dontDotnetBuild-}" && -z "${buildPhase-}" ]]; then + buildPhase=dotnetBuildHook +fi diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-check-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-check-hook.sh new file mode 100644 index 0000000..507721e --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-check-hook.sh @@ -0,0 +1,46 @@ +# inherit arguments from derivation +dotnetTestFlags=( ${dotnetTestFlags[@]-} ) + +dotnetCheckHook() { + echo "Executing dotnetCheckHook" + + runHook preCheck + + if [ "${disabledTests-}" ]; then + local -r disabledTestsFlag="--filter @disabledTests@" + fi + + if [ "${enableParallelBuilding-}" ]; then + local -r maxCpuFlag="$NIX_BUILD_CORES" + else + local -r maxCpuFlag="1" + fi + + for project in ${testProjectFile[@]-${projectFile[@]}}; do + runtimeIdFlags=() + if [[ "$project" == *.csproj ]]; then + runtimeIdFlags=("--runtime @runtimeId@") + fi + + env "LD_LIBRARY_PATH=@libraryPath@" \ + dotnet test "$project" \ + -maxcpucount:$maxCpuFlag \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --configuration "@buildType@" \ + --no-build \ + --logger "console;verbosity=normal" \ + ${disabledTestsFlag-} \ + ${runtimeIdFlags[@]} \ + "${dotnetTestFlags[@]}" \ + "${dotnetFlags[@]}" + done + + runHook postCheck + + echo "Finished dotnetCheckHook" +} + +if [[ -z "${dontDotnetCheck-}" && -z "${checkPhase-}" ]]; then + checkPhase=dotnetCheckHook +fi diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-configure-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-configure-hook.sh new file mode 100644 index 0000000..c046fc3 --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-configure-hook.sh @@ -0,0 +1,82 @@ +declare -a projectFile testProjectFile + +# Inherit arguments from derivation +dotnetFlags=( ${dotnetFlags[@]-} ) +dotnetRestoreFlags=( ${dotnetRestoreFlags[@]-} ) + +dotnetConfigureHook() { + echo "Executing dotnetConfigureHook" + + runHook preConfigure + + if [ -z "${enableParallelBuilding-}" ]; then + local -r parallelFlag="--disable-parallel" + fi + + dotnetRestore() { + local -r project="${1-}" + env dotnet restore ${project-} \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --runtime "@runtimeId@" \ + --source "@nugetSource@/lib" \ + ${parallelFlag-} \ + ${dotnetRestoreFlags[@]} \ + ${dotnetFlags[@]} + } + + # Generate a NuGet.config file to make sure everything, + # including things like dependencies, is restored from the proper source +cat < "./NuGet.config" + + + + + + + +EOF + + # Patch paket.dependencies and paket.lock (if found) to use the proper source. This ensures + # paket restore works correctly + # We use + instead of / in sed to avoid problems with slashes + find -name paket.dependencies -exec sed -i 's+source .*+source @nugetSource@/lib+g' {} \; + find -name paket.lock -exec sed -i 's+remote:.*+remote: @nugetSource@/lib+g' {} \; + + env dotnet tool restore --add-source "@nugetSource@/lib" + + (( "${#projectFile[@]}" == 0 )) && dotnetRestore + + for project in ${projectFile[@]} ${testProjectFile[@]-}; do + dotnetRestore "$project" + done + + echo "Fixing up native binaries..." + # Find all native binaries and nuget libraries, and fix them up, + # by setting the proper interpreter and rpath to some commonly used libraries + for binary in $(find "$HOME/.nuget/packages/" -type f -executable); do + if patchelf --print-interpreter "$binary" >/dev/null 2>/dev/null; then + echo "Found binary: $binary, fixing it up..." + patchelf --set-interpreter "$(cat "@dynamicLinker@")" "$binary" + + # This makes sure that if the binary requires some specific runtime dependencies, it can find it. + # This fixes dotnet-built binaries like crossgen2 + patchelf \ + --add-needed libicui18n.so \ + --add-needed libicuuc.so \ + --add-needed libz.so \ + --add-needed libssl.so \ + "$binary" + + patchelf --set-rpath "@libPath@" "$binary" + fi + done + + runHook postConfigure + + echo "Finished dotnetConfigureHook" +} + +if [[ -z "${dontDotnetConfigure-}" && -z "${configurePhase-}" ]]; then + configurePhase=dotnetConfigureHook +fi diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh new file mode 100644 index 0000000..e367172 --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-fixup-hook.sh @@ -0,0 +1,57 @@ +# Inherit arguments from the derivation +declare -a derivationMakeWrapperArgs="( ${makeWrapperArgs-} )" +makeWrapperArgs=( "${derivationMakeWrapperArgs[@]}" ) + +# First argument is the executable you want to wrap, +# the second is the destination for the wrapper. +wrapDotnetProgram() { + local dotnetRootFlags=() + + if [ ! "${selfContainedBuild-}" ]; then + if [ "${useDotnetFromEnv-}" ]; then + # if dotnet CLI is available, set DOTNET_ROOT based on it. Otherwise set to default .NET runtime + dotnetRootFlags+=("--run" 'command -v dotnet &>/dev/null && export DOTNET_ROOT="$(@dirname@ "$(@realpath@ "$(@which@ dotnet)")")" || export DOTNET_ROOT="@dotnetRuntime@"') + dotnetRootFlags+=("--suffix" "PATH" ":" "@dotnetRuntime@/bin") + else + dotnetRootFlags+=("--set" "DOTNET_ROOT" "@dotnetRuntime@") + dotnetRootFlags+=("--prefix" "PATH" ":" "@dotnetRuntime@/bin") + fi + fi + + makeWrapper "$1" "$2" \ + --suffix "LD_LIBRARY_PATH" : "@runtimeDeps@" \ + "${dotnetRootFlags[@]}" \ + "${gappsWrapperArgs[@]}" \ + "${makeWrapperArgs[@]}" + + echo "installed wrapper to "$2"" +} + +dotnetFixupHook() { + echo "Executing dotnetFixupPhase" + + # check if executables is declared (including empty values, in which case we generate no executables) + if declare -p executables &>/dev/null; then + for executable in ${executables[@]}; do + path="${installPath-$out/lib/$pname}/$executable" + + if test -x "$path"; then + wrapDotnetProgram "$path" "$out/bin/$(basename "$executable")" + else + echo "Specified binary \"$executable\" is either not an executable or does not exist!" + echo "Looked in $path" + exit 1 + fi + done + else + while IFS= read -d '' executable; do + wrapDotnetProgram "$executable" "$out/bin/$(basename "$executable")" \; + done < <(find "${installPath-$out/lib/$pname}" ! -name "*.dll" -executable -type f -print0) + fi + + echo "Finished dotnetFixupPhase" +} + +if [[ -z "${dontDotnetFixup-}" ]]; then + preFixupPhases+=" dotnetFixupHook" +fi diff --git a/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh new file mode 100644 index 0000000..d832eac --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-module/hooks/dotnet-install-hook.sh @@ -0,0 +1,79 @@ +# inherit arguments from derivation +dotnetInstallFlags=( ${dotnetInstallFlags[@]-} ) + +dotnetInstallHook() { + echo "Executing dotnetInstallHook" + + runHook preInstall + + if [ "${selfContainedBuild-}" ]; then + dotnetInstallFlags+=("--self-contained") + else + dotnetInstallFlags+=("--no-self-contained") + # https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trim-self-contained + # Trimming is only available for self-contained build, so force disable it here + dotnetInstallFlags+=("-p:PublishTrimmed=false") + fi + + if [ "${useAppHost-}" ]; then + dotnetInstallFlags+=("-p:UseAppHost=true") + fi + + dotnetPublish() { + local -r project="${1-}" + + runtimeIdFlags=() + if [[ "$project" == *.csproj ]] || [ "${selfContainedBuild-}" ]; then + runtimeIdFlags+=("--runtime @runtimeId@") + fi + + env dotnet publish ${project-} \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --output "${installPath-$out/lib/$pname}" \ + --configuration "@buildType@" \ + --no-build \ + ${runtimeIdFlags[@]} \ + ${dotnetInstallFlags[@]} \ + ${dotnetFlags[@]} + } + + dotnetPack() { + local -r project="${1-}" + env dotnet pack ${project-} \ + -p:ContinuousIntegrationBuild=true \ + -p:Deterministic=true \ + --output "$out/share" \ + --configuration "@buildType@" \ + --no-build \ + --runtime "@runtimeId@" \ + ${dotnetPackFlags[@]} \ + ${dotnetFlags[@]} + } + + if (( "${#projectFile[@]}" == 0 )); then + dotnetPublish + else + for project in ${projectFile[@]}; do + dotnetPublish "$project" + done + fi + + if [[ "${packNupkg-}" ]]; then + if (( "${#projectFile[@]}" == 0 )); then + dotnetPack + else + for project in ${projectFile[@]}; do + dotnetPack "$project" + done + fi + fi + + runHook postInstall + + echo "Finished dotnetInstallHook" +} + +if [[ -z "${dontDotnetInstall-}" && -z "${installPhase-}" ]]; then + installPhase=dotnetInstallHook +fi diff --git a/pkgs/build-support/dotnet/build-dotnet-package/default.nix b/pkgs/build-support/dotnet/build-dotnet-package/default.nix new file mode 100644 index 0000000..14446ef --- /dev/null +++ b/pkgs/build-support/dotnet/build-dotnet-package/default.nix @@ -0,0 +1,116 @@ +{ stdenv, lib, makeWrapper, pkg-config, mono, dotnetbuildhelpers }: + +attrsOrig @ +{ pname +, version +, nativeBuildInputs ? [] +, xBuildFiles ? [ ] +, xBuildFlags ? [ "/p:Configuration=Release" ] +, outputFiles ? [ "bin/Release/*" ] +, dllFiles ? [ "*.dll" ] +, exeFiles ? [ "*.exe" ] +# Additional arguments to pass to the makeWrapper function, which wraps +# generated binaries. +, makeWrapperArgs ? [ ] +, ... }: + let + arrayToShell = (a: toString (map (lib.escape (lib.stringToCharacters "\\ ';$`()|<>\t") ) a)); + + attrs = { + inherit pname version; + + nativeBuildInputs = [ + pkg-config + makeWrapper + dotnetbuildhelpers + mono + ] ++ nativeBuildInputs; + + configurePhase = '' + runHook preConfigure + + [ -z "''${dontPlacateNuget-}" ] && placate-nuget.sh + [ -z "''${dontPlacatePaket-}" ] && placate-paket.sh + [ -z "''${dontPatchFSharpTargets-}" ] && patch-fsharp-targets.sh + + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + + echo Building dotNET packages... + + # Probably needs to be moved to fsharp + if pkg-config FSharp.Core + then + export FSharpTargetsPath="$(dirname $(pkg-config FSharp.Core --variable=Libraries))/Microsoft.FSharp.Targets" + fi + + ran="" + for xBuildFile in ${arrayToShell xBuildFiles} ''${xBuildFilesExtra} + do + ran="yes" + xbuild ${arrayToShell xBuildFlags} ''${xBuildFlagsArray} $xBuildFile + done + + [ -z "$ran" ] && xbuild ${arrayToShell xBuildFlags} ''${xBuildFlagsArray} + + runHook postBuild + ''; + + dontStrip = true; + + installPhase = '' + runHook preInstall + + target="$out/lib/dotnet/${pname}" + mkdir -p "$target" + + cp -rv ${arrayToShell outputFiles} "''${outputFilesArray[@]}" "$target" + + if [ -z "''${dontRemoveDuplicatedDlls-}" ] + then + pushd "$out" + remove-duplicated-dlls.sh + popd + fi + + set -f + for dllPattern in ${arrayToShell dllFiles} ''${dllFilesArray[@]} + do + set +f + for dll in "$target"/$dllPattern + do + [ -f "$dll" ] || continue + if pkg-config $(basename -s .dll "$dll") + then + echo "$dll already exported by a buildInputs, not re-exporting" + else + create-pkg-config-for-dll.sh "$out/lib/pkgconfig" "$dll" + fi + done + done + + set -f + for exePattern in ${arrayToShell exeFiles} ''${exeFilesArray[@]} + do + set +f + for exe in "$target"/$exePattern + do + [ -f "$exe" ] || continue + mkdir -p "$out"/bin + commandName="$(basename -s .exe "$(echo "$exe" | tr "[A-Z]" "[a-z]")")" + makeWrapper \ + "${mono}/bin/mono" \ + "$out"/bin/"$commandName" \ + --add-flags "\"$exe\"" \ + ''${makeWrapperArgs} + done + done + + runHook postInstall + ''; + }; + in + stdenv.mkDerivation (attrs // (builtins.removeAttrs attrsOrig [ "nativeBuildInputs" ] )) diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/create-pkg-config-for-dll.sh b/pkgs/build-support/dotnet/dotnetbuildhelpers/create-pkg-config-for-dll.sh new file mode 100644 index 0000000..3791417 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/create-pkg-config-for-dll.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +targetDir="$1" +dllFullPath="$2" + +dllVersion="$(monodis --assembly "$dllFullPath" | grep ^Version: | cut -f 2 -d : | xargs)" +[ -z "$dllVersion" ] && echo "Defaulting dllVersion to 0.0.0" && dllVersion="0.0.0" +dllFileName="$(basename $dllFullPath)" +dllRootName="$(basename -s .dll $dllFileName)" +targetPcFile="$targetDir"/"$dllRootName".pc + +mkdir -p "$targetDir" + +cat > $targetPcFile << EOF +Libraries=$dllFullPath + +Name: $dllRootName +Description: $dllRootName +Version: $dllVersion +Libs: -r:$dllFileName +EOF + +echo "Created $targetPcFile" diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/default.nix b/pkgs/build-support/dotnet/dotnetbuildhelpers/default.nix new file mode 100644 index 0000000..4348832 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/default.nix @@ -0,0 +1,18 @@ +{ runCommand, mono, pkg-config }: + runCommand + "dotnetbuildhelpers" + { preferLocalBuild = true; } + '' + target="$out/bin" + mkdir -p "$target" + + for script in ${./create-pkg-config-for-dll.sh} ${./patch-fsharp-targets.sh} ${./remove-duplicated-dlls.sh} ${./placate-nuget.sh} ${./placate-paket.sh} + do + scriptName="$(basename "$script" | cut -f 2- -d -)" + cp -v "$script" "$target"/"$scriptName" + chmod 755 "$target"/"$scriptName" + patchShebangs "$target"/"$scriptName" + substituteInPlace "$target"/"$scriptName" --replace pkg-config ${pkg-config}/bin/${pkg-config.targetPrefix}pkg-config + substituteInPlace "$target"/"$scriptName" --replace monodis ${mono}/bin/monodis + done + '' diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/patch-fsharp-targets.sh b/pkgs/build-support/dotnet/dotnetbuildhelpers/patch-fsharp-targets.sh new file mode 100755 index 0000000..3f81cc7 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/patch-fsharp-targets.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Some project files look for F# targets in $(FSharpTargetsPath) +# so it's a good idea to add something like this to your ~/.bash_profile: + +# export FSharpTargetsPath=$(dirname $(which fsharpc))/../lib/mono/4.0/Microsoft.FSharp.Targets + +# In build scripts, you would add somehting like this: + +# export FSharpTargetsPath="${fsharp}/lib/mono/4.0/Microsoft.FSharp.Targets" + +# However, some project files look for F# targets in the main Mono directory. When that happens +# patch the project files using this script so they will look in $(FSharpTargetsPath) instead. + +echo "Patching F# targets in fsproj files..." + +find -iname \*.fsproj -print -exec \ + sed --in-place=.bak \ + -e 's,\([^<]*\),\1,'g \ + {} \; diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-nuget.sh b/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-nuget.sh new file mode 100644 index 0000000..8a7f365 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-nuget.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +echo Placating Nuget in nuget.targets +find -iname nuget.targets -print -exec sed --in-place=bak -e 's,mono --runtime[^<]*,true NUGET PLACATED BY buildDotnetPackage,g' {} \; + +echo Just to be sure, replacing Nuget executables by empty files. +find . -iname nuget.exe \! -size 0 -exec mv -v {} {}.bak \; -exec touch {} \; diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-paket.sh b/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-paket.sh new file mode 100644 index 0000000..0dbf1ee --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/placate-paket.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +echo Placating Paket in paket.targets +find -iname paket.targets -print -exec sed --in-place=bak -e 's,mono --runtime[^<]*,true PAKET PLACATED BY buildDotnetPackage,g' {} \; + +echo Just to be sure, replacing Paket executables by empty files. +find . -iname paket\*.exe \! -size 0 -exec mv -v {} {}.bak \; -exec touch {} \; diff --git a/pkgs/build-support/dotnet/dotnetbuildhelpers/remove-duplicated-dlls.sh b/pkgs/build-support/dotnet/dotnetbuildhelpers/remove-duplicated-dlls.sh new file mode 100644 index 0000000..d8d2991 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetbuildhelpers/remove-duplicated-dlls.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +IFS=" +" + +for dll in $(find -iname \*.dll) +do + baseName="$(basename "$dll" | sed "s/.dll$//i")" + if pkg-config "$baseName" + then + candidateDll="$(pkg-config "$baseName" --variable=Libraries)" + + if diff "$dll" "$candidateDll" >/dev/null + then + echo "$dll is identical to $candidateDll. Substituting..." + rm -vf "$dll" + ln -sv "$candidateDll" "$dll" + else + echo "$dll and $candidateDll share the same name but have different contents, leaving alone." + fi + fi +done diff --git a/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper.sln b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper.sln new file mode 100644 index 0000000..7e4c934 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wrapper", "Wrapper\Wrapper.csproj", "{D01B3597-E85E-42F4-940A-EF5AE712942F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D01B3597-E85E-42F4-940A-EF5AE712942F}.Debug|x86.ActiveCfg = Debug|x86 + {D01B3597-E85E-42F4-940A-EF5AE712942F}.Debug|x86.Build.0 = Debug|x86 + {D01B3597-E85E-42F4-940A-EF5AE712942F}.Release|x86.ActiveCfg = Release|x86 + {D01B3597-E85E-42F4-940A-EF5AE712942F}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Properties/AssemblyInfo.cs b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..633d23c --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wrapper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Philips Healthcare")] +[assembly: AssemblyProduct("Wrapper")] +[assembly: AssemblyCopyright("Copyright © Philips Healthcare 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2045ce22-78c7-4cd6-ad0a-9367f8a49738")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.cs.in b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.cs.in new file mode 100644 index 0000000..abad090 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.cs.in @@ -0,0 +1,66 @@ +using System; +using System.Reflection; +using System.IO; + +namespace @NAMESPACE@Wrapper +{ + class @MAINCLASSNAME@Wrapper + { + private String[] AssemblySearchPaths = { @ASSEMBLYSEARCHPATH@ }; + + private String ExePath = @"@EXEPATH@"; + + private String MainClassName = "@NAMESPACE@.@MAINCLASSNAME@"; + + private Assembly exeAssembly; + + public @MAINCLASSNAME@Wrapper(string[] args) + { + // Attach the resolve event handler to the AppDomain so that missing library assemblies will be searched + AppDomain currentDomain = AppDomain.CurrentDomain; + currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); + + // Dynamically load the executable assembly + exeAssembly = Assembly.LoadFrom(ExePath); + + // Lookup the main class + Type mainClass = exeAssembly.GetType(MainClassName); + + // Lookup the main method + MethodInfo mainMethod = mainClass.GetMethod("Main"); + + // Invoke the main method + mainMethod.Invoke(this, new Object[] {args}); + } + + static void Main(string[] args) + { + new @MAINCLASSNAME@Wrapper(args); + } + + private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) + { + // This handler is called only when the common language runtime tries to bind to the assembly and fails. + + Assembly MyAssembly; + String assemblyPath = ""; + String requestedAssemblyName = args.Name.Substring(0, args.Name.IndexOf(",")); + + // Search for the right path of the library assembly + foreach (String currentAssemblyPath in AssemblySearchPaths) + { + assemblyPath = currentAssemblyPath + "/" + requestedAssemblyName + ".dll"; + + if (File.Exists(assemblyPath)) + break; + } + + // Load the assembly from the specified path. + MyAssembly = Assembly.LoadFrom(assemblyPath); + + // Return the loaded assembly. + return MyAssembly; + } + + } +} diff --git a/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.csproj.in b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.csproj.in new file mode 100644 index 0000000..a991bcb --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/Wrapper/Wrapper/Wrapper.csproj.in @@ -0,0 +1,57 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {D01B3597-E85E-42F4-940A-EF5AE712942F} + Exe + Properties + @ROOTNAMESPACE@ + @ASSEMBLYNAME@ + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pkgs/build-support/dotnet/dotnetenv/build-solution.nix b/pkgs/build-support/dotnet/dotnetenv/build-solution.nix new file mode 100644 index 0000000..b3372b9 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/build-solution.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, dotnetfx }: +{ name +, src +, baseDir ? "." +, slnFile +, targets ? "ReBuild" +, verbosity ? "detailed" +, options ? "/p:Configuration=Debug;Platform=Win32" +, assemblyInputs ? [] +, preBuild ? "" +, modifyPublicMain ? false +, mainClassFile ? null +}: + +assert modifyPublicMain -> mainClassFile != null; + +stdenv.mkDerivation { + inherit name src; + + buildInputs = [ dotnetfx ]; + + preConfigure = '' + cd ${baseDir} + ''; + + preBuild = '' + ${lib.optionalString modifyPublicMain '' + sed -i -e "s|static void Main|public static void Main|" ${mainClassFile} + ''} + ${preBuild} + ''; + + installPhase = '' + addDeps() + { + if [ -f $1/nix-support/dotnet-assemblies ] + then + for i in $(cat $1/nix-support/dotnet-assemblies) + do + windowsPath=$(cygpath --windows $i) + assemblySearchPaths="$assemblySearchPaths;$windowsPath" + + addDeps $i + done + fi + } + + for i in ${toString assemblyInputs} + do + windowsPath=$(cygpath --windows $i) + echo "Using assembly path: $windowsPath" + + if [ "$assemblySearchPaths" = "" ] + then + assemblySearchPaths="$windowsPath" + else + assemblySearchPaths="$assemblySearchPaths;$windowsPath" + fi + + addDeps $i + done + + echo "Assembly search paths are: $assemblySearchPaths" + + if [ "$assemblySearchPaths" != "" ] + then + echo "Using assembly search paths args: $assemblySearchPathsArg" + export AssemblySearchPaths=$assemblySearchPaths + fi + + mkdir -p $out + MSBuild.exe ${toString slnFile} /nologo /t:${targets} /p:IntermediateOutputPath=$(cygpath --windows $out)\\ /p:OutputPath=$(cygpath --windows $out)\\ /verbosity:${verbosity} ${options} + + # Because .NET assemblies store strings as UTF-16 internally, we cannot detect + # hashes. Therefore a text files containing the proper paths is created + # We can also use this file the propagate transitive dependencies. + + mkdir -p $out/nix-support + + for i in ${toString assemblyInputs} + do + echo $i >> $out/nix-support/dotnet-assemblies + done + ''; +} diff --git a/pkgs/build-support/dotnet/dotnetenv/default.nix b/pkgs/build-support/dotnet/dotnetenv/default.nix new file mode 100644 index 0000000..3015db4 --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/default.nix @@ -0,0 +1,17 @@ +{ lib, stdenv, dotnetfx }: + +let dotnetenv = +{ + buildSolution = import ./build-solution.nix { + inherit lib stdenv; + dotnetfx = dotnetfx.pkg; + }; + + buildWrapper = import ./wrapper.nix { + inherit dotnetenv; + }; + + inherit (dotnetfx) assembly20Path wcfPath referenceAssembly30Path referenceAssembly35Path; +}; +in +dotnetenv diff --git a/pkgs/build-support/dotnet/dotnetenv/wrapper.nix b/pkgs/build-support/dotnet/dotnetenv/wrapper.nix new file mode 100644 index 0000000..423303c --- /dev/null +++ b/pkgs/build-support/dotnet/dotnetenv/wrapper.nix @@ -0,0 +1,64 @@ +{dotnetenv}: + +{ name +, src +, baseDir ? "." +, slnFile +, targets ? "ReBuild" +, verbosity ? "detailed" +, options ? "/p:Configuration=Debug;Platform=Win32" +, assemblyInputs ? [] +, preBuild ? "" +, namespace +, mainClassName +, mainClassFile +, modifyPublicMain ? true +}: + +let + application = dotnetenv.buildSolution { + inherit name src baseDir slnFile targets verbosity; + inherit options assemblyInputs preBuild; + inherit modifyPublicMain mainClassFile; + }; +in +dotnetenv.buildSolution { + name = "${name}-wrapper"; + src = ./Wrapper; + slnFile = "Wrapper.sln"; + assemblyInputs = [ application ]; + preBuild = '' + addRuntimeDeps() + { + if [ -f $1/nix-support/dotnet-assemblies ] + then + for i in $(cat $1/nix-support/dotnet-assemblies) + do + windowsPath=$(cygpath --windows $i | sed 's|\\|\\\\|g') + assemblySearchArray="$assemblySearchArray @\"$windowsPath\"" + + addRuntimeDeps $i + done + fi + } + + export exePath=$(cygpath --windows $(find ${application} -name \*.exe) | sed 's|\\|\\\\|g') + + # Generate assemblySearchPaths string array contents + for path in ${toString assemblyInputs} + do + assemblySearchArray="$assemblySearchArray @\"$(cygpath --windows $path | sed 's|\\|\\\\|g')\", " + addRuntimeDeps $path + done + + sed -e "s|@ROOTNAMESPACE@|${namespace}Wrapper|" \ + -e "s|@ASSEMBLYNAME@|${namespace}|" \ + Wrapper/Wrapper.csproj.in > Wrapper/Wrapper.csproj + + sed -e "s|@NAMESPACE@|${namespace}|g" \ + -e "s|@MAINCLASSNAME@|${mainClassName}|g" \ + -e "s|@EXEPATH@|$exePath|g" \ + -e "s|@ASSEMBLYSEARCHPATH@|$assemblySearchArray|" \ + Wrapper/Wrapper.cs.in > Wrapper/Wrapper.cs + ''; +} diff --git a/pkgs/build-support/dotnet/fetchnuget/default.nix b/pkgs/build-support/dotnet/fetchnuget/default.nix new file mode 100644 index 0000000..061da74 --- /dev/null +++ b/pkgs/build-support/dotnet/fetchnuget/default.nix @@ -0,0 +1,43 @@ +{ fetchurl, buildDotnetPackage, unzip }: + +attrs @ +{ pname +, version +, url ? "https://www.nuget.org/api/v2/package/${pname}/${version}" +, sha256 ? "" +, md5 ? "" +, ... +}: +if md5 != "" then + throw "fetchnuget does not support md5 anymore, please use sha256" +else + buildDotnetPackage ({ + src = fetchurl { + inherit url sha256; + name = "${pname}.${version}.zip"; + }; + + sourceRoot = "."; + + nativeBuildInputs = [ unzip ]; + + dontBuild = true; + + preInstall = '' + function traverseRename () { + for e in * + do + t="$(echo "$e" | sed -e "s/%20/\ /g" -e "s/%2B/+/g")" + [ "$t" != "$e" ] && mv -vn "$e" "$t" + if [ -d "$t" ] + then + cd "$t" + traverseRename + cd .. + fi + done + } + + traverseRename + ''; + } // attrs) diff --git a/pkgs/build-support/dotnet/make-nuget-deps/default.nix b/pkgs/build-support/dotnet/make-nuget-deps/default.nix new file mode 100644 index 0000000..fcd3f9f --- /dev/null +++ b/pkgs/build-support/dotnet/make-nuget-deps/default.nix @@ -0,0 +1,12 @@ +{ linkFarmFromDrvs, fetchurl }: +{ name, nugetDeps ? import sourceFile, sourceFile ? null }: +linkFarmFromDrvs "${name}-nuget-deps" (nugetDeps { + fetchNuGet = { pname, version, sha256 + , url ? "https://www.nuget.org/api/v2/package/${pname}/${version}" }: + fetchurl { + name = "${pname}.${version}.nupkg"; + inherit url sha256; + }; +}) // { + inherit sourceFile; +} diff --git a/pkgs/build-support/dotnet/make-nuget-source/default.nix b/pkgs/build-support/dotnet/make-nuget-source/default.nix new file mode 100644 index 0000000..4cf9c1a --- /dev/null +++ b/pkgs/build-support/dotnet/make-nuget-source/default.nix @@ -0,0 +1,28 @@ +{ lib, python3, stdenvNoCC }: + +{ name +, description ? "" +, deps ? [] +, ... +}@args: + +stdenvNoCC.mkDerivation (lib.recursiveUpdate { + inherit name; + + nativeBuildInputs = [ python3 ]; + + buildCommand = '' + mkdir -p $out/{lib,share} + + # use -L to follow symbolic links. When `projectReferences` is used in + # buildDotnetModule, one of the deps will be a symlink farm. + find -L ${lib.concatStringsSep " " deps} -type f -name '*.nupkg' -exec \ + ln -s '{}' -t $out/lib ';' + + # Generates a list of all licenses' spdx ids, if available. + # Note that this currently ignores any license provided in plain text (e.g. "LICENSE.txt") + python ${./extract-licenses-from-nupkgs.py} $out/lib > $out/share/licenses + ''; + + meta.description = description; +} (removeAttrs args [ "name" "description" "deps" ])) diff --git a/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py b/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py new file mode 100644 index 0000000..22564b0 --- /dev/null +++ b/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +""" +Opens each .nupkg file in a directory, and extracts the SPDX license identifiers +from them if they exist. The SPDX license identifier is stored in the +'...' tag in the .nuspec file. +All found license identifiers will be printed to stdout. +""" + +from glob import glob +from pathlib import Path +import sys +import xml.etree.ElementTree as ET +import zipfile + +all_licenses = set() + +if len(sys.argv) < 2: + print(f"Usage: {sys.argv[0]} DIRECTORY") + sys.exit(1) + +nupkg_dir = Path(sys.argv[1]) +for nupkg_name in glob("*.nupkg", root_dir=nupkg_dir): + with zipfile.ZipFile(nupkg_dir / nupkg_name) as nupkg: + for nuspec_name in [name for name in nupkg.namelist() if name.endswith(".nuspec")]: + with nupkg.open(nuspec_name) as nuspec_stream: + nuspec = ET.parse(nuspec_stream) + licenses = nuspec.findall(".//{*}license[@type='expression']") + all_licenses.update([license.text for license in licenses]) + +print("\n".join(sorted(all_licenses))) diff --git a/pkgs/build-support/dotnet/nuget-to-nix/default.nix b/pkgs/build-support/dotnet/nuget-to-nix/default.nix new file mode 100644 index 0000000..3fdda4a --- /dev/null +++ b/pkgs/build-support/dotnet/nuget-to-nix/default.nix @@ -0,0 +1,35 @@ +{ lib +, runCommandLocal +, runtimeShell +, substituteAll +, nix +, coreutils +, jq +, yq +, curl +, gnugrep +, gawk +, dotnet-sdk +}: + +runCommandLocal "nuget-to-nix" { + script = substituteAll { + src = ./nuget-to-nix.sh; + inherit runtimeShell; + + binPath = lib.makeBinPath [ + nix + coreutils + jq + yq + curl + gnugrep + gawk + dotnet-sdk + ]; + }; + + meta.description = "Convert a nuget packages directory to a lockfile for buildDotnetModule"; +} '' + install -Dm755 $script $out/bin/nuget-to-nix +'' diff --git a/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh b/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh new file mode 100755 index 0000000..2754bfc --- /dev/null +++ b/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh @@ -0,0 +1,104 @@ +#!@runtimeShell@ + +set -euo pipefail +shopt -s nullglob + +export PATH="@binPath@" +# used for glob ordering of package names +export LC_ALL=C + +if [ $# -eq 0 ]; then + >&2 echo "Usage: $0 [path to a file with a list of excluded packages] > deps.nix" + exit 1 +fi + +pkgs=$1 +tmp=$(realpath "$(mktemp -td nuget-to-nix.XXXXXX)") +trap 'rm -r "$tmp"' EXIT + +excluded_list=$(realpath "${2:-/dev/null}") + +export DOTNET_NOLOGO=1 +export DOTNET_CLI_TELEMETRY_OPTOUT=1 + +mapfile -t sources < <(dotnet nuget list source --format short | awk '/^E / { print $2 }') + +declare -a remote_sources +declare -A base_addresses + +for index in "${sources[@]}"; do + if [[ -d "$index" ]]; then + continue + fi + + remote_sources+=($index) + + base_address=$( + curl --compressed --netrc -fsL "$index" | \ + jq -r '.resources[] | select(."@type" == "PackageBaseAddress/3.0.0")."@id"') + if [[ ! "$base_address" == */ ]]; then + base_address="$base_address/" + fi + base_addresses[$index]="$base_address" +done + +echo "{ fetchNuGet }: [" + +cd "$pkgs" +for package in *; do + [[ -d "$package" ]] || continue + cd "$package" + for version in *; do + id=$(xq -r .package.metadata.id "$version"/*.nuspec) + + if grep -qxF "$id.$version.nupkg" "$excluded_list"; then + continue + fi + + used_source="$(jq -r '.source' "$version"/.nupkg.metadata)" + found=false + + if [[ -d "$used_source" ]]; then + continue + fi + + for source in "${remote_sources[@]}"; do + url="${base_addresses[$source]}$package/$version/$package.$version.nupkg" + if [[ "$source" == "$used_source" ]]; then + sha256="$(nix-hash --type sha256 --flat --base32 "$version/$package.$version".nupkg)" + found=true + break + else + if sha256=$(nix-prefetch-url "$url" 2>"$tmp"/error); then + # If multiple remote sources are enabled, nuget will try them all + # concurrently and use the one that responds first. We always use the + # first source that has the package. + echo "$package $version is available at $url, but was restored from $used_source" 1>&2 + found=true + break + else + if ! grep -q 'HTTP error 404' "$tmp/error"; then + cat "$tmp/error" 1>&2 + exit 1 + fi + fi + fi + done + + if [[ $found = false ]]; then + echo "couldn't find $package $version" >&2 + exit 1 + fi + + if [[ "$source" != https://api.nuget.org/v3/index.json ]]; then + echo " (fetchNuGet { pname = \"$id\"; version = \"$version\"; sha256 = \"$sha256\"; url = \"$url\"; })" + else + echo " (fetchNuGet { pname = \"$id\"; version = \"$version\"; sha256 = \"$sha256\"; })" + fi + done + cd .. +done + +cat << EOL +] +EOL diff --git a/pkgs/build-support/emacs/buffer.nix b/pkgs/build-support/emacs/buffer.nix new file mode 100644 index 0000000..48a7996 --- /dev/null +++ b/pkgs/build-support/emacs/buffer.nix @@ -0,0 +1,77 @@ +# Functions to build elisp files to locally configure emcas buffers. +# See https://github.com/shlevy/nix-buffer + +{ lib, writeText, inherit-local }: + +rec { + withPackages = pkgs': let + pkgs = builtins.filter (x: x != null) pkgs'; + extras = map (x: x.emacsBufferSetup pkgs) (builtins.filter (builtins.hasAttr "emacsBufferSetup") pkgs); + in writeText "dir-locals.el" '' + (require 'inherit-local "${inherit-local}/share/emacs/site-lisp/elpa/inherit-local-${inherit-local.version}/inherit-local.elc") + + ; Only set up nixpkgs buffer handling when we have some buffers active + (defvar nixpkgs--buffer-count 0) + (when (eq nixpkgs--buffer-count 0) + (make-variable-buffer-local 'nixpkgs--is-nixpkgs-buffer) + ; When generating a new temporary buffer (one whose name starts with a space), do inherit-local inheritance and make it a nixpkgs buffer + (defun nixpkgs--around-generate (orig name &optional ibh) + (if (and nixpkgs--is-nixpkgs-buffer (eq (aref name 0) ?\s)) + (let ((buf (funcall orig name ibh))) + (progn + (inherit-local-inherit-child buf) + (with-current-buffer buf + (setq nixpkgs--buffer-count (1+ nixpkgs--buffer-count)) + (add-hook 'kill-buffer-hook 'nixpkgs--decrement-buffer-count nil t))) + buf) + (funcall orig name ibh))) + (advice-add 'generate-new-buffer :around #'nixpkgs--around-generate) + ; When we have no more nixpkgs buffers, tear down the buffer handling + (defun nixpkgs--decrement-buffer-count () + (setq nixpkgs--buffer-count (1- nixpkgs--buffer-count)) + (when (eq nixpkgs--buffer-count 0) + (advice-remove 'generate-new-buffer #'nixpkgs--around-generate) + (fmakunbound 'nixpkgs--around-generate) + (fmakunbound 'nixpkgs--decrement-buffer-count)))) + (setq nixpkgs--buffer-count (1+ nixpkgs--buffer-count)) + (add-hook 'kill-buffer-hook 'nixpkgs--decrement-buffer-count nil t) + + ; Add packages to PATH and exec-path + (make-local-variable 'process-environment) + (put 'process-environment 'permanent-local t) + (inherit-local 'process-environment) + ; setenv modifies in place, so copy the environment first + (setq process-environment (copy-tree process-environment)) + (setenv "PATH" (concat "${lib.makeSearchPath "bin" pkgs}:" (getenv "PATH"))) + (inherit-local-permanent exec-path (append '(${builtins.concatStringsSep " " (map (p: "\"${p}/bin\"") pkgs)}) exec-path)) + + (inherit-local-permanent eshell-path-env (concat "${lib.makeSearchPath "bin" pkgs}:" (if (boundp 'eshell-path-env) eshell-path-env (getenv "PATH")))) + + (setq nixpkgs--is-nixpkgs-buffer t) + (inherit-local 'nixpkgs--is-nixpkgs-buffer) + + ${lib.concatStringsSep "\n" extras} + ''; + # nix-buffer function for a project with a bunch of haskell packages + # in one directory + haskellMonoRepo = { project-root # The monorepo root + , haskellPackages # The composed haskell packages set that contains all of the packages + }: { root }: + let # The haskell paths. + haskell-paths = lib.filesystem.haskellPathsInDir project-root; + # Find the haskell package that the 'root' is in, if any. + haskell-path-parent = + let filtered = builtins.filter (name: + lib.hasPrefix (toString (project-root + "/${name}")) (toString root) + ) (builtins.attrNames haskell-paths); + in + if filtered == [] then null else builtins.head filtered; + # We're in the directory of a haskell package + is-haskell-package = haskell-path-parent != null; + haskell-package = haskellPackages.${haskell-path-parent}; + # GHC environment with all needed deps for the haskell package + haskell-package-env = + builtins.head haskell-package.env.nativeBuildInputs; + in + lib.optionalAttrs is-haskell-package (withPackages [ haskell-package-env ]); +} diff --git a/pkgs/build-support/emacs/elpa.nix b/pkgs/build-support/emacs/elpa.nix new file mode 100644 index 0000000..a43578f --- /dev/null +++ b/pkgs/build-support/emacs/elpa.nix @@ -0,0 +1,37 @@ +# builder for Emacs packages built for packages.el + +{ lib, stdenv, emacs, texinfo, writeText, gcc }: + +let + handledArgs = [ "files" "fileSpecs" "meta" ]; + genericBuild = import ./generic.nix { inherit lib stdenv emacs texinfo writeText gcc; }; + +in + +{ pname +, version +, src +, meta ? {} +, ... +}@args: + +genericBuild ({ + + dontUnpack = true; + + installPhase = '' + runHook preInstall + + emacs --batch -Q -l ${./elpa2nix.el} \ + -f elpa2nix-install-package \ + "$src" "$out/share/emacs/site-lisp/elpa" + + runHook postInstall + ''; + + meta = { + homepage = args.src.meta.homepage or "https://elpa.gnu.org/packages/${pname}.html"; + } // meta; +} + +// removeAttrs args handledArgs) diff --git a/pkgs/build-support/emacs/elpa2nix.el b/pkgs/build-support/emacs/elpa2nix.el new file mode 100644 index 0000000..64587c0 --- /dev/null +++ b/pkgs/build-support/emacs/elpa2nix.el @@ -0,0 +1,33 @@ +(require 'package) +(package-initialize) + +(defun elpa2nix-install-package () + (if (not noninteractive) + (error "`elpa2nix-install-package' is to be used only with -batch")) + (pcase command-line-args-left + (`(,archive ,elpa) + (progn (setq package-user-dir elpa) + (elpa2nix-install-file archive))))) + +(defun elpa2nix-install-from-buffer () + "Install a package from the current buffer." + (let ((pkg-desc (if (derived-mode-p 'tar-mode) + (package-tar-file-info) + (package-buffer-info)))) + ;; Install the package itself. + (package-unpack pkg-desc) + pkg-desc)) + +(defun elpa2nix-install-file (file) + "Install a package from a file. +The file can either be a tar file or an Emacs Lisp file." + (let ((is-tar (string-match "\\.tar\\'" file))) + (with-temp-buffer + (if is-tar + (insert-file-contents-literally file) + (insert-file-contents file)) + (when is-tar (tar-mode)) + (elpa2nix-install-from-buffer)))) + +;; Allow installing package tarfiles larger than 10MB +(setq large-file-warning-threshold nil) diff --git a/pkgs/build-support/emacs/emacs-funcs.sh b/pkgs/build-support/emacs/emacs-funcs.sh new file mode 100644 index 0000000..e1e6a3b --- /dev/null +++ b/pkgs/build-support/emacs/emacs-funcs.sh @@ -0,0 +1,34 @@ +addToEmacsLoadPath() { + local lispDir="$1" + if [[ -d $lispDir && ${EMACSLOADPATH-} != *"$lispDir":* ]] ; then + # It turns out, that the trailing : is actually required + # see https://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Search.html + export EMACSLOADPATH="$lispDir:${EMACSLOADPATH-}" + fi +} + +addToEmacsNativeLoadPath() { + local nativeDir="$1" + if [[ -d $nativeDir && ${EMACSNATIVELOADPATH-} != *"$nativeDir":* ]]; then + export EMACSNATIVELOADPATH="$nativeDir:${EMACSNATIVELOADPATH-}" + fi +} + +addEmacsVars () { + addToEmacsLoadPath "$1/share/emacs/site-lisp" + + if [ -n "${addEmacsNativeLoadPath:-}" ]; then + addToEmacsNativeLoadPath "$1/share/emacs/native-lisp" + fi + + # Add sub paths to the Emacs load path if it is a directory + # containing .el files. This is necessary to build some packages, + # e.g., using trivialBuild. + for lispDir in \ + "$1/share/emacs/site-lisp/"* \ + "$1/share/emacs/site-lisp/elpa/"*; do + if [[ -d $lispDir && "$(echo "$lispDir"/*.el)" ]] ; then + addToEmacsLoadPath "$lispDir" + fi + done +} diff --git a/pkgs/build-support/emacs/generic.nix b/pkgs/build-support/emacs/generic.nix new file mode 100644 index 0000000..bdf1cd4 --- /dev/null +++ b/pkgs/build-support/emacs/generic.nix @@ -0,0 +1,90 @@ +# generic builder for Emacs packages + +{ lib, stdenv, emacs, texinfo, writeText, gcc, ... }: + +let + inherit (lib) optionalAttrs getLib; + handledArgs = [ "buildInputs" "packageRequires" "meta" ]; + + setupHook = writeText "setup-hook.sh" '' + source ${./emacs-funcs.sh} + + if [[ ! -v emacsHookDone ]]; then + emacsHookDone=1 + + # If this is for a wrapper derivation, emacs and the dependencies are all + # run-time dependencies. If this is for precompiling packages into bytecode, + # emacs is a compile-time dependency of the package. + addEnvHooks "$hostOffset" addEmacsVars + addEnvHooks "$targetOffset" addEmacsVars + fi + ''; + +in + +{ pname +, version +, buildInputs ? [] +, packageRequires ? [] +, meta ? {} +, ... +}@args: + +stdenv.mkDerivation (finalAttrs: ({ + name = "emacs-${pname}-${finalAttrs.version}"; + + unpackCmd = '' + case "$curSrc" in + *.el) + # keep original source filename without the hash + local filename=$(basename "$curSrc") + filename="''${filename:33}" + cp $curSrc $filename + chmod +w $filename + sourceRoot="." + ;; + *) + _defaultUnpack "$curSrc" + ;; + esac + ''; + + buildInputs = [emacs texinfo] ++ packageRequires ++ buildInputs; + propagatedBuildInputs = packageRequires; + propagatedUserEnvPkgs = packageRequires; + + inherit setupHook; + + doCheck = false; + + meta = { + broken = false; + platforms = emacs.meta.platforms; + } // optionalAttrs ((args.src.meta.homepage or "") != "") { + homepage = args.src.meta.homepage; + } // meta; +} + +// optionalAttrs (emacs.withNativeCompilation or false) { + + LIBRARY_PATH = "${getLib stdenv.cc.libc}/lib"; + + nativeBuildInputs = [ gcc ]; + + addEmacsNativeLoadPath = true; + + postInstall = '' + # Besides adding the output directory to the native load path, make sure + # the current package's elisp files are in the load path, otherwise + # (require 'file-b) from file-a.el in the same package will fail. + mkdir -p $out/share/emacs/native-lisp + source ${./emacs-funcs.sh} + addEmacsVars "$out" + + find $out/share/emacs -type f -name '*.el' -print0 \ + | xargs -0 -I {} -n 1 -P $NIX_BUILD_CORES sh -c \ + "emacs --batch --eval '(setq large-file-warning-threshold nil)' -f batch-native-compile {} || true" + ''; +} + +// removeAttrs args handledArgs)) diff --git a/pkgs/build-support/emacs/melpa.nix b/pkgs/build-support/emacs/melpa.nix new file mode 100644 index 0000000..323c6e6 --- /dev/null +++ b/pkgs/build-support/emacs/melpa.nix @@ -0,0 +1,109 @@ +# builder for Emacs packages built for packages.el +# using MELPA package-build.el + +{ lib, stdenv, fetchFromGitHub, emacs, texinfo, writeText, gcc }: + +let + genericBuild = import ./generic.nix { inherit lib stdenv emacs texinfo writeText gcc; }; + + packageBuild = stdenv.mkDerivation { + name = "package-build"; + src = fetchFromGitHub { + owner = "melpa"; + repo = "package-build"; + rev = "c48aa078c01b4f07b804270c4583a0a58ffea1c0"; + sha256 = "sha256-MzPj375upIiYXdQR+wWXv3A1zMqbSrZlH0taLuxx/1M="; + }; + + patches = [ ./package-build-dont-use-mtime.patch ]; + + dontConfigure = true; + dontBuild = true; + + installPhase = " + mkdir -p $out + cp -r * $out + "; + }; + +in + +{ /* + pname: Nix package name without special symbols and without version or + "emacs-" prefix. + */ + pname + /* + ename: Original Emacs package name, possibly containing special symbols. + */ +, ename ? null +, version +, recipe +, meta ? {} +, ... +}@args: + +genericBuild ({ + + ename = + if ename == null + then pname + else ename; + + elpa2nix = ./elpa2nix.el; + melpa2nix = ./melpa2nix.el; + + inherit packageBuild; + + preUnpack = '' + mkdir -p "$NIX_BUILD_TOP/recipes" + if [ -n "$recipe" ]; then + cp "$recipe" "$NIX_BUILD_TOP/recipes/$ename" + fi + + ln -s "$packageBuild" "$NIX_BUILD_TOP/package-build" + + mkdir -p "$NIX_BUILD_TOP/packages" + ''; + + postUnpack = '' + mkdir -p "$NIX_BUILD_TOP/working" + ln -s "$NIX_BUILD_TOP/$sourceRoot" "$NIX_BUILD_TOP/working/$ename" + ''; + + buildPhase = '' + runHook preBuild + + cd "$NIX_BUILD_TOP" + + emacs --batch -Q \ + -L "$NIX_BUILD_TOP/package-build" \ + -l "$melpa2nix" \ + -f melpa2nix-build-package \ + $ename $version $commit + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + archive="$NIX_BUILD_TOP/packages/$ename-$version.el" + if [ ! -f "$archive" ]; then + archive="$NIX_BUILD_TOP/packages/$ename-$version.tar" + fi + + emacs --batch -Q \ + -l "$elpa2nix" \ + -f elpa2nix-install-package \ + "$archive" "$out/share/emacs/site-lisp/elpa" + + runHook postInstall + ''; + + meta = { + homepage = args.src.meta.homepage or "https://melpa.org/#/${pname}"; + } // meta; +} + +// removeAttrs args [ "meta" ]) diff --git a/pkgs/build-support/emacs/melpa2nix.el b/pkgs/build-support/emacs/melpa2nix.el new file mode 100644 index 0000000..3de77db --- /dev/null +++ b/pkgs/build-support/emacs/melpa2nix.el @@ -0,0 +1,32 @@ +(require 'package) +(package-initialize) + +(require 'package-recipe) +(require 'package-build) + +(setq package-build-working-dir (expand-file-name "working/")) +(setq package-build-archive-dir (expand-file-name "packages/")) +(setq package-build-recipes-dir (expand-file-name "recipes/")) + +;; Allow installing package tarfiles larger than 10MB +(setq large-file-warning-threshold nil) + +(defun melpa2nix-build-package-1 (rcp) + (let* ((default-directory (package-recipe--working-tree rcp))) + (unwind-protect + (let ((files (package-build-expand-files-spec rcp t))) + (unless files + (error "Unable to find files matching recipe patterns")) + (if (> (length files) 1) + (package-build--build-multi-file-package rcp files) + (package-build--build-single-file-package rcp files)))))) + +(defun melpa2nix-build-package () + (unless noninteractive + (error "`melpa2nix-build-package' is to be used only with -batch")) + (pcase command-line-args-left + (`(,package ,version ,commit) + (let ((recipe (package-recipe-lookup package))) + (setf (oref recipe commit) commit) + (setf (oref recipe version) version) + (melpa2nix-build-package-1 recipe))))) diff --git a/pkgs/build-support/emacs/mk-wrapper-subdirs.el b/pkgs/build-support/emacs/mk-wrapper-subdirs.el new file mode 100644 index 0000000..7d30400 --- /dev/null +++ b/pkgs/build-support/emacs/mk-wrapper-subdirs.el @@ -0,0 +1,6 @@ +(defmacro mk-subdirs-expr (path) + `(setq load-path + (delete-dups (append '(,path) + ',(let ((default-directory path)) + (normal-top-level-add-subdirs-to-load-path)) + load-path)))) diff --git a/pkgs/build-support/emacs/package-build-dont-use-mtime.patch b/pkgs/build-support/emacs/package-build-dont-use-mtime.patch new file mode 100644 index 0000000..1ace777 --- /dev/null +++ b/pkgs/build-support/emacs/package-build-dont-use-mtime.patch @@ -0,0 +1,21 @@ +diff --git a/package-build.el b/package-build.el +index 29cdb61..c19be1b 100644 +--- a/package-build.el ++++ b/package-build.el +@@ -923,7 +923,6 @@ DIRECTORY is a temporary directory that contains the directory + that is put in the tarball." + (let* ((name (oref rcp name)) + (version (oref rcp version)) +- (time (oref rcp time)) + (tar (expand-file-name (concat name "-" version ".tar") + package-build-archive-dir)) + (dir (concat name "-" version))) +@@ -939,7 +938,7 @@ that is put in the tarball." + ;; prevent a reproducible tarball as described at + ;; https://reproducible-builds.org/docs/archives. + "--sort=name" +- (format "--mtime=@%d" time) ++ "--mtime=@0" + "--owner=0" "--group=0" "--numeric-owner" + "--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime")) + (when (and package-build-verbose noninteractive) diff --git a/pkgs/build-support/emacs/trivial.nix b/pkgs/build-support/emacs/trivial.nix new file mode 100644 index 0000000..11c28c0 --- /dev/null +++ b/pkgs/build-support/emacs/trivial.nix @@ -0,0 +1,28 @@ +# trivial builder for Emacs packages + +{ callPackage, lib, ... }@envargs: + +args: + +callPackage ./generic.nix envargs ({ + buildPhase = '' + runHook preBuild + + emacs -L . --batch -f batch-byte-compile *.el + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + LISPDIR=$out/share/emacs/site-lisp + install -d $LISPDIR + install *.el *.elc $LISPDIR + emacs --batch -l package --eval "(package-generate-autoloads \"${args.pname}\" \"$LISPDIR\")" + + runHook postInstall + ''; +} + +// args) diff --git a/pkgs/build-support/emacs/wrapper.nix b/pkgs/build-support/emacs/wrapper.nix new file mode 100644 index 0000000..59a6942 --- /dev/null +++ b/pkgs/build-support/emacs/wrapper.nix @@ -0,0 +1,236 @@ +/* + +# Usage + +`emacs.pkgs.withPackages` takes a single argument: a function from a package +set to a list of packages (the packages that will be available in +Emacs). For example, +``` +emacs.pkgs.withPackages (epkgs: [ epkgs.evil epkgs.magit ]) +``` +All the packages in the list should come from the provided package +set. It is possible to add any package to the list, but the provided +set is guaranteed to have consistent dependencies and be built with +the correct version of Emacs. + +# Overriding + +`emacs.pkgs.withPackages` inherits the package set which contains it, so the +correct way to override the provided package set is to override the +set which contains `emacs.pkgs.withPackages`. For example, to override +`emacs.pkgs.emacs.pkgs.withPackages`, +``` +let customEmacsPackages = + emacs.pkgs.overrideScope (self: super: { + # use a custom version of emacs + emacs = ...; + # use the unstable MELPA version of magit + magit = self.melpaPackages.magit; + }); +in customEmacsPackages.withPackages (epkgs: [ epkgs.evil epkgs.magit ]) +``` + +*/ + +{ lib, lndir, makeBinaryWrapper, runCommand, gcc }: +self: +let + inherit (self) emacs; + withNativeCompilation = emacs.withNativeCompilation or false; + withTreeSitter = emacs.withTreeSitter or false; +in +packagesFun: # packages explicitly requested by the user +let + explicitRequires = + if lib.isFunction packagesFun + then packagesFun self + else packagesFun; +in +runCommand + (lib.appendToName "with-packages" emacs).name + { + inherit emacs explicitRequires; + nativeBuildInputs = [ emacs lndir makeBinaryWrapper ]; + + preferLocalBuild = true; + allowSubstitutes = false; + + # Store all paths we want to add to emacs here, so that we only need to add + # one path to the load lists + deps = runCommand "emacs-packages-deps" + ({ + inherit explicitRequires lndir emacs; + nativeBuildInputs = lib.optional withNativeCompilation gcc; + } // lib.optionalAttrs withNativeCompilation { + inherit (emacs) LIBRARY_PATH; + }) + '' + findInputsOld() { + local pkg="$1"; shift + local var="$1"; shift + local propagatedBuildInputsFiles=("$@") + + # TODO(@Ericson2314): Restore using associative array once Darwin + # nix-shell doesn't use impure bash. This should replace the O(n) + # case with an O(1) hash map lookup, assuming bash is implemented + # well :D. + local varSlice="$var[*]" + # ''${..-} to hack around old bash empty array problem + case "''${!varSlice-}" in + *" $pkg "*) return 0 ;; + esac + unset -v varSlice + + eval "$var"'+=("$pkg")' + + if ! [ -e "$pkg" ]; then + echo "build input $pkg does not exist" >&2 + exit 1 + fi + + local file + for file in "''${propagatedBuildInputsFiles[@]}"; do + file="$pkg/nix-support/$file" + [[ -f "$file" ]] || continue + + local pkgNext + for pkgNext in $(< "$file"); do + findInputsOld "$pkgNext" "$var" "''${propagatedBuildInputsFiles[@]}" + done + done + } + mkdir -p $out/bin + mkdir -p $out/share/emacs/site-lisp + ${lib.optionalString withNativeCompilation '' + mkdir -p $out/share/emacs/native-lisp + ''} + ${lib.optionalString withTreeSitter '' + mkdir -p $out/lib + ''} + + local requires + for pkg in $explicitRequires; do + findInputsOld $pkg requires propagated-user-env-packages + done + # requires now holds all requested packages and their transitive dependencies + + linkPath() { + local pkg=$1 + local origin_path=$2 + local dest_path=$3 + + # Add the path to the search path list, but only if it exists + if [[ -d "$pkg/$origin_path" ]]; then + $lndir/bin/lndir -silent "$pkg/$origin_path" "$out/$dest_path" + fi + } + + linkEmacsPackage() { + linkPath "$1" "bin" "bin" + linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp" + ${lib.optionalString withNativeCompilation '' + linkPath "$1" "share/emacs/native-lisp" "share/emacs/native-lisp" + ''} + ${lib.optionalString withTreeSitter '' + linkPath "$1" "lib" "lib" + ''} + } + + # Iterate over the array of inputs (avoiding nix's own interpolation) + for pkg in "''${requires[@]}"; do + linkEmacsPackage $pkg + done + + siteStart="$out/share/emacs/site-lisp/site-start.el" + siteStartByteCompiled="$siteStart"c + subdirs="$out/share/emacs/site-lisp/subdirs.el" + subdirsByteCompiled="$subdirs"c + + # A dependency may have brought the original siteStart or subdirs, delete + # it and create our own + # Begin the new site-start.el by loading the original, which sets some + # NixOS-specific paths. Paths are searched in the reverse of the order + # they are specified in, so user and system profile paths are searched last. + # + # NOTE: Avoid displaying messages early at startup by binding + # inhibit-message to t. This would prevent the Emacs GUI from showing up + # prematurely. The messages would still be logged to the *Messages* + # buffer. + rm -f $siteStart $siteStartByteCompiled $subdirs $subdirsByteCompiled + cat >"$siteStart" < "$subdirs" + + # Byte-compiling improves start-up time only slightly, but costs nothing. + $emacs/bin/emacs --batch -f batch-byte-compile "$siteStart" "$subdirs" + + ${lib.optionalString withNativeCompilation '' + $emacs/bin/emacs --batch \ + --eval "(add-to-list 'native-comp-eln-load-path \"$out/share/emacs/native-lisp/\")" \ + -f batch-native-compile "$siteStart" "$subdirs" + ''} + ''; + + inherit (emacs) meta; + } + '' + mkdir -p "$out/bin" + + # Wrap emacs and friends so they find our site-start.el before the original. + for prog in $emacs/bin/*; do # */ + local progname=$(basename "$prog") + rm -f "$out/bin/$progname" + + substitute ${./wrapper.sh} $out/bin/$progname \ + --subst-var-by bash ${emacs.stdenv.shell} \ + --subst-var-by wrapperSiteLisp "$deps/share/emacs/site-lisp" \ + --subst-var-by wrapperSiteLispNative "$deps/share/emacs/native-lisp" \ + --subst-var prog + chmod +x $out/bin/$progname + # Create a “NOP” binary wrapper for the pure sake of it becoming a + # non-shebang, actual binary. See the makeBinaryWrapper docs for rationale + # (summary: it allows you to use emacs as a shebang itself on Darwin, + # e.g. #!$ {emacs}/bin/emacs --script) + wrapProgramBinary $out/bin/$progname + done + + # Wrap MacOS app + # this has to pick up resources and metadata + # to recognize it as an "app" + if [ -d "$emacs/Applications/Emacs.app" ]; then + mkdir -p $out/Applications/Emacs.app/Contents/MacOS + cp -r $emacs/Applications/Emacs.app/Contents/Info.plist \ + $emacs/Applications/Emacs.app/Contents/PkgInfo \ + $emacs/Applications/Emacs.app/Contents/Resources \ + $out/Applications/Emacs.app/Contents + + + substitute ${./wrapper.sh} $out/Applications/Emacs.app/Contents/MacOS/Emacs \ + --subst-var-by bash ${emacs.stdenv.shell} \ + --subst-var-by wrapperSiteLisp "$deps/share/emacs/site-lisp" \ + --subst-var-by wrapperSiteLispNative "$deps/share/emacs/native-lisp" \ + --subst-var-by prog "$emacs/Applications/Emacs.app/Contents/MacOS/Emacs" + chmod +x $out/Applications/Emacs.app/Contents/MacOS/Emacs + wrapProgramBinary $out/Applications/Emacs.app/Contents/MacOS/Emacs + fi + + mkdir -p $out/share + # Link icons and desktop files into place + for dir in applications icons info man; do + ln -s $emacs/share/$dir $out/share/$dir + done + '' diff --git a/pkgs/build-support/emacs/wrapper.sh b/pkgs/build-support/emacs/wrapper.sh new file mode 100644 index 0000000..44762bd --- /dev/null +++ b/pkgs/build-support/emacs/wrapper.sh @@ -0,0 +1,53 @@ +#!@bash@ + +IFS=: + +newLoadPath=() +newNativeLoadPath=() +addedNewLoadPath= +addedNewNativeLoadPath= + +if [[ -n $EMACSLOADPATH ]] +then + while read -rd: entry + do + if [[ -z $entry && -z $addedNewLoadPath ]] + then + newLoadPath+=(@wrapperSiteLisp@) + addedNewLoadPath=1 + fi + newLoadPath+=("$entry") + done <<< "$EMACSLOADPATH:" +else + newLoadPath+=(@wrapperSiteLisp@) + newLoadPath+=("") +fi + +# NOTE: Even though we treat EMACSNATIVELOADPATH like EMACSLOADPATH in +# this wrapper, empty elements in EMACSNATIVELOADPATH have no special +# meaning for Emacs. Only non-empty elements in EMACSNATIVELOADPATH +# will be prepended to native-comp-eln-load-path. +# https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/startup.el?id=3685387e609753293c4518be75e77c659c3b2d8d#n599 +if [[ -n $EMACSNATIVELOADPATH ]] +then + while read -rd: entry + do + if [[ -z $entry && -z $addedNewNativeLoadPath ]] + then + newNativeLoadPath+=(@wrapperSiteLispNative@) + addedNewNativeLoadPath=1 + fi + newNativeLoadPath+=("$entry") + done <<< "$EMACSNATIVELOADPATH:" +else + newNativeLoadPath+=(@wrapperSiteLispNative@) + newNativeLoadPath+=("") +fi + +export EMACSLOADPATH="${newLoadPath[*]}" +export emacsWithPackages_siteLisp=@wrapperSiteLisp@ + +export EMACSNATIVELOADPATH="${newNativeLoadPath[*]}" +export emacsWithPackages_siteLispNative=@wrapperSiteLispNative@ + +exec @prog@ "$@" diff --git a/pkgs/build-support/expand-response-params/default.nix b/pkgs/build-support/expand-response-params/default.nix new file mode 100644 index 0000000..6868ab9 --- /dev/null +++ b/pkgs/build-support/expand-response-params/default.nix @@ -0,0 +1,42 @@ +{ stdenv, lib }: + +# A "response file" is a sequence of arguments that is passed via a +# file, rather than via argv[]. + +# For more information see: +# https://gcc.gnu.org/wiki/Response_Files +# https://www.intel.com/content/www/us/en/docs/dpcpp-cpp-compiler/developer-guide-reference/2023-0/use-response-files.html + +stdenv.mkDerivation { + name = "expand-response-params"; + src = ./expand-response-params.c; + strictDeps = true; + enableParallelBuilding = true; + # Work around "stdenv-darwin-boot-2 is not allowed to refer to path + # /nix/store/...-expand-response-params.c" + unpackPhase = '' + cp "$src" expand-response-params.c + src=$PWD + ''; + buildPhase = '' + NIX_CC_USE_RESPONSE_FILE=0 "$CC" -std=c99 -O3 -o "expand-response-params" expand-response-params.c + ''; + installPhase = '' + mkdir -p $prefix/bin + mv expand-response-params $prefix/bin/ + ''; + + meta = { + description = "Internal tool used by the nixpkgs wrapper scripts for processing response files"; + longDescription = '' + expand-response-params is a tool that allows for obtaining a full list of all + arguments passed in a given compiler command line including those passed via + so-called response files. The nixpkgs wrapper scripts for bintools and C + compilers use it for processing compiler flags. As it is developed in + conjunction with the nixpkgs wrapper scripts, it should be considered as + unstable and subject to change. + ''; + license = lib.licenses.mit; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/build-support/expand-response-params/expand-response-params.c b/pkgs/build-support/expand-response-params/expand-response-params.c new file mode 100644 index 0000000..05b9c62 --- /dev/null +++ b/pkgs/build-support/expand-response-params/expand-response-params.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +typedef struct { char *data; size_t len, cap; } String; + +void resize(String *s, size_t len) { + s->len = len; + if (s->cap < s->len) { + s->cap = s->len * 2; + s->data = (char *)realloc(s->data, s->cap); + assert(s->data); + } +} + +void append(String *s, const char *data, size_t len) { + resize(s, s->len + len); + memcpy(s->data + s->len - len, data, len); +} + +typedef enum { space = 0, other = 1, backslash = 2, apostrophe = 3, quotation_mark = 4 } CharClass; +typedef enum { outside, unq, unq_esc, sq, sq_esc, dq, dq_esc } State; + +// current State -> CharClass -> next State +const State transitions[][5] = { + [outside] = {outside, unq, unq_esc, sq, dq}, + [unq] = {outside, unq, unq_esc, sq, dq}, + [unq_esc] = {unq, unq, unq, unq, unq}, + [sq] = {sq, sq, sq_esc, unq, sq}, + [sq_esc] = {sq, sq, sq, sq, sq}, + [dq] = {dq, dq, dq_esc, dq, unq}, + [dq_esc] = {dq, dq, dq, dq, dq}, +}; + +CharClass charClass(int c) { + return c == '\\' ? backslash : c == '\'' ? apostrophe : c == '"' ? quotation_mark : + isspace(c) ? space : other; +} + +// expandArg writes NULL-terminated expansions of `arg', a NULL-terminated +// string, to stdout. If arg does not begin with `@' or does not refer to a +// file, it is written as is. Otherwise the contents of the file are +// recursively expanded. On unexpected EOF in malformed response files an +// incomplete final argument is written, even if it is empty, to parse like GCC. +void expandArg(String *arg) { + FILE *f; + if (arg->data[0] != '@' || !(f = fopen(&arg->data[1], "r"))) { + fwrite(arg->data, 1, arg->len, stdout); + return; + } + + resize(arg, 0); + State cur = outside; + int c; + do { + c = fgetc(f); + State next = transitions[cur][charClass(c)]; + if ((cur == unq && next == outside) || (cur != outside && c == EOF)) { + append(arg, "", 1); + expandArg(arg); + resize(arg, 0); + } else if (cur == unq_esc || cur == sq_esc || cur == dq_esc || + (cur == outside ? next == unq : cur == next)) { + char s = c; + append(arg, &s, 1); + } + cur = next; + } while (c != EOF); + + fclose(f); +} + +int main(int argc, char **argv) { + String arg = { 0 }; + while (*++argv) { + resize(&arg, 0); + append(&arg, *argv, strlen(*argv) + 1); + expandArg(&arg); + } + free(arg.data); + return EXIT_SUCCESS; +} diff --git a/pkgs/build-support/fake-nss/default.nix b/pkgs/build-support/fake-nss/default.nix new file mode 100644 index 0000000..7d85ec5 --- /dev/null +++ b/pkgs/build-support/fake-nss/default.nix @@ -0,0 +1,24 @@ +# Provide a /etc/passwd and /etc/group that contain root and nobody. +# Useful when packaging binaries that insist on using nss to look up +# username/groups (like nginx). +# /bin/sh is fine to not exist, and provided by another shim. +{ lib, symlinkJoin, writeTextDir, runCommand, extraPasswdLines ? [], extraGroupLines ? [] }: +symlinkJoin { + name = "fake-nss"; + paths = [ + (writeTextDir "etc/passwd" '' + root:x:0:0:root user:/var/empty:/bin/sh + ${lib.concatStrings (map (line: line + "\n") extraPasswdLines)}nobody:x:65534:65534:nobody:/var/empty:/bin/sh + '') + (writeTextDir "etc/group" '' + root:x:0: + ${lib.concatStrings (map (line: line + "\n") extraGroupLines)}nobody:x:65534: + '') + (writeTextDir "etc/nsswitch.conf" '' + hosts: files dns + '') + (runCommand "var-empty" { } '' + mkdir -p $out/var/empty + '') + ]; +} diff --git a/pkgs/build-support/fetch9front/default.nix b/pkgs/build-support/fetch9front/default.nix new file mode 100644 index 0000000..677fee1 --- /dev/null +++ b/pkgs/build-support/fetch9front/default.nix @@ -0,0 +1,36 @@ +{ fetchgit, fetchzip, lib }: + +lib.makeOverridable ( + { owner + , repo + , rev + , domain ? "git.9front.org" + , name ? "source" + , leaveDotGit ? false + , deepClone ? false + , ... # For hash agility + } @ args: + + let + passthruAttrs = removeAttrs args [ "domain" "owner" "repo" "rev" "leaveDotGit" "deepClone" ]; + + useFetchGit = leaveDotGit || deepClone; + fetcher = if useFetchGit then fetchgit else fetchzip; + + gitRepoUrl = "git://${domain}/${owner}/${repo}"; + + fetcherArgs = (if useFetchGit then { + # git9 does not support shallow fetches + inherit rev leaveDotGit; + url = gitRepoUrl; + } else { + url = "https://${domain}/${owner}/${repo}/${rev}/snap.tar.gz"; + + passthru = { + inherit gitRepoUrl; + }; + }) // passthruAttrs // { inherit name; }; + in + + fetcher fetcherArgs // { inherit rev; } +) diff --git a/pkgs/build-support/fetchbitbucket/default.nix b/pkgs/build-support/fetchbitbucket/default.nix new file mode 100644 index 0000000..2f9103f --- /dev/null +++ b/pkgs/build-support/fetchbitbucket/default.nix @@ -0,0 +1,11 @@ +{ fetchzip, lib }: + +lib.makeOverridable ( +{ owner, repo, rev, name ? "source" +, ... # For hash agility +}@args: fetchzip ({ + inherit name; + url = "https://bitbucket.org/${owner}/${repo}/get/${rev}.tar.gz"; + meta.homepage = "https://bitbucket.org/${owner}/${repo}/"; +} // removeAttrs args [ "owner" "repo" "rev" ]) // { inherit rev; } +) diff --git a/pkgs/build-support/fetchbower/default.nix b/pkgs/build-support/fetchbower/default.nix new file mode 100644 index 0000000..fd971d4 --- /dev/null +++ b/pkgs/build-support/fetchbower/default.nix @@ -0,0 +1,28 @@ +{ stdenvNoCC, lib, bower2nix, cacert }: +let + bowerVersion = version: + let + components = lib.splitString "#" version; + hash = lib.last components; + ver = if builtins.length components == 1 then (cleanName version) else hash; + in ver; + + cleanName = name: lib.replaceStrings ["/" ":"] ["-" "-"] name; + + fetchbower = name: version: target: outputHash: stdenvNoCC.mkDerivation { + name = "${cleanName name}-${bowerVersion version}"; + buildCommand = '' + fetch-bower --quiet --out=$PWD/out "${name}" "${target}" "${version}" + # In some cases, the result of fetchBower is different depending + # on the output directory (e.g. if the bower package contains + # symlinks). So use a local output directory before copying to + # $out. + cp -R out $out + ''; + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + inherit outputHash; + nativeBuildInputs = [ bower2nix cacert ]; + }; + +in fetchbower diff --git a/pkgs/build-support/fetchbzr/builder.sh b/pkgs/build-support/fetchbzr/builder.sh new file mode 100644 index 0000000..4515e0e --- /dev/null +++ b/pkgs/build-support/fetchbzr/builder.sh @@ -0,0 +1,8 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source "$stdenv/setup" + +echo "exporting \`$url' (revision $rev) into \`$out'" + +# Perform a lightweight checkout so that we don't end up importing +# all the repository's history. +XDG_CACHE_HOME="$TMPDIR" BRZ_LOG=/dev/null bzr -Ossl.cert_reqs=none export -r "$rev" --format=dir "$out" "$url" diff --git a/pkgs/build-support/fetchbzr/default.nix b/pkgs/build-support/fetchbzr/default.nix new file mode 100644 index 0000000..b7db9e9 --- /dev/null +++ b/pkgs/build-support/fetchbzr/default.nix @@ -0,0 +1,15 @@ +{ stdenvNoCC, breezy }: +{ url, rev, sha256 }: + +stdenvNoCC.mkDerivation { + name = "bzr-export"; + + builder = ./builder.sh; + nativeBuildInputs = [ breezy ]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + inherit url rev; +} diff --git a/pkgs/build-support/fetchbzr/nix-prefetch-bzr b/pkgs/build-support/fetchbzr/nix-prefetch-bzr new file mode 100755 index 0000000..dbe8a7e --- /dev/null +++ b/pkgs/build-support/fetchbzr/nix-prefetch-bzr @@ -0,0 +1,74 @@ +#! /bin/sh -e + +url=$1 +rev=$2 +expHash=$3 + +hashType=$NIX_HASH_ALGO +if test -z "$hashType"; then + hashType=sha256 +fi +if test -z "$hashFormat"; then + hashFormat=--base32 +fi + +if test -z "$url"; then + echo "syntax: nix-prefetch-bzr URL [REVISION [EXPECTED-HASH]]" >&2 + exit 1 +fi + +revarg="-r $rev" +test -n "$rev" || revarg="" + +repoName=$(echo $url | sed ' + s,.*/\([^/]\+\)/trunk/*$,\1,;t + s,.*/\([^/]\+\)/branches/\([^/]\+\)/*$,\1-\2,;t + s,.*/\([^/]\+\)/tags/\([^/]\+\)/*$,\1-\2,;t + s,.*/\([^/]\+\)/*$,\1,;t +') +dstFile="bzr-export" + +# If the hash was given, a file with that hash may already be in the +# store. +if test -n "$expHash"; then + finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" $dstFile) + if ! nix-store --check-validity "$finalPath" 2> /dev/null; then + finalPath= + fi + hash=$expHash +fi + + +# If we don't know the hash or a path with that hash doesn't exist, +# download the file and add it to the store. +if test -z "$finalPath"; then + tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/bzr-checkout-tmp-XXXXXXXX")" + trap "rm -rf \"$tmpPath\"" EXIT + + tmpFile="$tmpPath/$dstFile" + + # Perform the checkout. + bzr -Ossl.cert_reqs=none export $revarg --format=dir "$tmpFile" "$url" + + echo "bzr revision is $(bzr revno $revarg "$url")" + + # Compute the hash. + hash=$(nix-hash --type $hashType $hashFormat $tmpFile) + if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi + + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile) + + if test -n "$expHash" -a "$expHash" != "$hash"; then + echo "hash mismatch for URL \`$url'" + exit 1 + fi +fi + +if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi + +echo $hash + +if test -n "$PRINT_PATH"; then + echo $finalPath +fi diff --git a/pkgs/build-support/fetchcvs/builder.sh b/pkgs/build-support/fetchcvs/builder.sh new file mode 100644 index 0000000..7e4dde4 --- /dev/null +++ b/pkgs/build-support/fetchcvs/builder.sh @@ -0,0 +1,26 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +(echo "#!$SHELL"; \ + echo 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$@"') > ssh +chmod +x ssh +export CVS_RSH=$PWD/ssh + +# creating the export drictory and checking out there only to be able to +# move the content without the root directory into $out ... +# cvs -f -d "$url" export $tag -d "$out" "$module" +# should work (but didn't - got no response on #cvs) +# See als man Page for those options + +mkdir -p export +if [ -n "$tag" ]; then + tag="-r $tag" +else + if [ -n "$date" ]; then + tag="-D $date" + else + tag="-D NOW" + fi +fi +(cd export && cvs -f -z0 -d "$cvsRoot" export $tag "$module") +mv export/* $out diff --git a/pkgs/build-support/fetchcvs/default.nix b/pkgs/build-support/fetchcvs/default.nix new file mode 100644 index 0000000..43a10c3 --- /dev/null +++ b/pkgs/build-support/fetchcvs/default.nix @@ -0,0 +1,22 @@ +# example tags: +# date="2007-20-10"; (get the last version before given date) +# tag="" (get version by tag name) +# If you don't specify neither one date="NOW" will be used (get latest) + +{stdenvNoCC, cvs, openssh, lib}: + +lib.makeOverridable ( +{cvsRoot, module, tag ? null, date ? null, sha256}: + +stdenvNoCC.mkDerivation { + name = "cvs-export"; + builder = ./builder.sh; + nativeBuildInputs = [cvs openssh]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + inherit cvsRoot module sha256 tag date; +} +) diff --git a/pkgs/build-support/fetchcvs/nix-prefetch-cvs b/pkgs/build-support/fetchcvs/nix-prefetch-cvs new file mode 100755 index 0000000..b6a169f --- /dev/null +++ b/pkgs/build-support/fetchcvs/nix-prefetch-cvs @@ -0,0 +1,80 @@ +#! /bin/sh -e + +cvsRoot=$1 +module=$2 +tag=$3 +expHash=$4 + +hashType=$NIX_HASH_ALGO +if test -z "$hashType"; then + hashType=sha256 +fi + +if test -z "$cvsRoot"; then + echo "syntax: nix-prefetch-cvs CVSROOT MODULE [TAG [HASH]]" >&2 + exit 1 +elif test -z "$module"; then + echo "syntax: nix-prefetch-cvs CVSROOT MODULE [TAG [HASH]]" >&2 + exit 1 +fi + + +mkTempDir() { + tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/nix-prefetch-cvs-XXXXXXXX")" + trap removeTempDir EXIT +} + +removeTempDir() { + rm -rf "$tmpPath" +} + + +# If the hash was given, a file with that hash may already be in the +# store. +if test -n "$expHash"; then + finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" cvs-export) + if ! nix-store --check-validity "$finalPath" 2> /dev/null; then + finalPath= + fi + hash=$expHash +fi + + +# If we don't know the hash or a path with that hash doesn't exist, +# download the file and add it to the store. +if test -z "$finalPath"; then + + mkTempDir + tmpFile=$tmpPath/cvs-export + #mkdir $tmpPath + + # Perform the checkout. + if test -z "$tag"; then + args=(-D "now") + elif test "$USE_DATE" = "1"; then + args=(-D "$tag") + else + args=(-r "$tag") + fi + (cd "$tmpPath" && cvs -f -z0 -d $cvsRoot export "${args[*]}" -d cvs-export $module >&2) + + # Compute the hash. + hash=$(nix-hash --type $hashType $hashFormat $tmpFile) + if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi + + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile) + + if test -n "$expHash" -a "$expHash" != "$hash"; then + echo "hash mismatch for CVS root \`$cvsRoot'" + exit 1 + fi +fi + +if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi + +echo $hash + +if test -n "$PRINT_PATH"; then + echo $finalPath +fi diff --git a/pkgs/build-support/fetchdarcs/builder.sh b/pkgs/build-support/fetchdarcs/builder.sh new file mode 100644 index 0000000..39838db --- /dev/null +++ b/pkgs/build-support/fetchdarcs/builder.sh @@ -0,0 +1,22 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +tagtext="" +tagflags="" +# Darcs hashes are sha1 (120 bits, 40-character hex) +if [[ "$rev" =~ [a-fA-F0-9]{40} ]]; then + tagtext="(hash $rev)" + tagflags="--to-hash=$rev" +elif test -n "$rev"; then + tagtext="(tag $rev)" + tagflags="--tag=$rev" +elif test -n "$context"; then + tagtext="(context)" + tagflags="--context=$context" +fi + +echo "getting $url $partial ${tagtext} into $out" + +darcs get --lazy $tagflags "$url" "$out" +# remove metadata, because it can change +rm -rf "$out/_darcs" diff --git a/pkgs/build-support/fetchdarcs/default.nix b/pkgs/build-support/fetchdarcs/default.nix new file mode 100644 index 0000000..6073efe --- /dev/null +++ b/pkgs/build-support/fetchdarcs/default.nix @@ -0,0 +1,21 @@ +{stdenvNoCC, darcs, cacert, lib}: + +lib.makeOverridable ( +{ url +, rev ? null +, context ? null +, sha256 ? "" +, name ? "fetchdarcs" +}: + +stdenvNoCC.mkDerivation { + builder = ./builder.sh; + nativeBuildInputs = [cacert darcs]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + inherit url rev context name; +} +) diff --git a/pkgs/build-support/fetchdebianpatch/default.nix b/pkgs/build-support/fetchdebianpatch/default.nix new file mode 100644 index 0000000..8d8076b --- /dev/null +++ b/pkgs/build-support/fetchdebianpatch/default.nix @@ -0,0 +1,19 @@ +{ lib, fetchpatch }: + +lib.makeOverridable ( + { pname, version, debianRevision ? null, area ? "main", + patch, name ? patch, hash }: + let + inherit (lib.strings) hasPrefix substring; + prefix = + substring 0 (if hasPrefix "lib" pname then 4 else 1) pname; + versionString = + if debianRevision == null then version + else "${version}-${debianRevision}"; + in fetchpatch { + inherit name hash; + url = + "https://sources.debian.org/data/${area}/${prefix}/" + + "${pname}/${versionString}/debian/patches/${patch}"; + } +) diff --git a/pkgs/build-support/fetchdebianpatch/tests.nix b/pkgs/build-support/fetchdebianpatch/tests.nix new file mode 100644 index 0000000..58f3b39 --- /dev/null +++ b/pkgs/build-support/fetchdebianpatch/tests.nix @@ -0,0 +1,19 @@ +{ testers, fetchDebianPatch, ... }: + +{ + simple = testers.invalidateFetcherByDrvHash fetchDebianPatch { + pname = "pysimplesoap"; + version = "1.16.2"; + debianRevision = "5"; + patch = "Add-quotes-to-SOAPAction-header-in-SoapClient"; + hash = "sha256-xA8Wnrpr31H8wy3zHSNfezFNjUJt1HbSXn3qUMzeKc0="; + }; + + libPackage = testers.invalidateFetcherByDrvHash fetchDebianPatch { + pname = "libfile-pid-perl"; + version = "1.01"; + debianRevision = "2"; + patch = "missing-pidfile"; + hash = "sha256-VBsIYyCnjcZLYQ2Uq2MKPK3kF2wiMKvnq0m727DoavM="; + }; +} diff --git a/pkgs/build-support/fetchdocker/credentials.nix b/pkgs/build-support/fetchdocker/credentials.nix new file mode 100644 index 0000000..f8a229c --- /dev/null +++ b/pkgs/build-support/fetchdocker/credentials.nix @@ -0,0 +1,39 @@ +{ lib }: +# We provide three paths to get the credentials into the builder's +# environment: +# +# 1. Via impureEnvVars. This method is difficult for multi-user Nix +# installations (but works very well for single-user Nix +# installations!) because it requires setting the environment +# variables on the nix-daemon which is either complicated or unsafe +# (i.e: configuring via Nix means the secrets will be persisted +# into the store) +# +# 2. If the DOCKER_CREDENTIALS key with a path to a credentials file +# is added to the NIX_PATH (usually via the '-I ' argument to most +# Nix tools) then an attempt will be made to read credentials from +# it. The semantics are simple, the file should contain two lines +# for the username and password based authentication: +# +# $ cat ./credentials-file.txt +# DOCKER_USER=myusername +# DOCKER_PASS=mypassword +# +# ... and a single line for the token based authentication: +# +# $ cat ./credentials-file.txt +# DOCKER_TOKEN=mytoken +# +# 3. A credential file at /etc/nix-docker-credentials.txt with the +# same format as the file described in #2 can also be used to +# communicate credentials to the builder. This is necessary for +# situations (like Hydra) where you cannot customize the NIX_PATH +# given to the nix-build invocation to provide it with the +# DOCKER_CREDENTIALS path +let + pathParts = + (builtins.filter + ({prefix, path}: "DOCKER_CREDENTIALS" == prefix) + builtins.nixPath); +in + lib.optionalString (pathParts != []) ((builtins.head pathParts).path) diff --git a/pkgs/build-support/fetchdocker/default.nix b/pkgs/build-support/fetchdocker/default.nix new file mode 100644 index 0000000..ef6132b --- /dev/null +++ b/pkgs/build-support/fetchdocker/default.nix @@ -0,0 +1,61 @@ +{ stdenv, lib, coreutils, bash, gnutar, writeText }: +let + stripScheme = + builtins.replaceStrings [ "https://" "http://" ] [ "" "" ]; + stripNixStore = + s: lib.removePrefix "${builtins.storeDir}/" s; +in +{ name +, registry ? "https://registry-1.docker.io/v2/" +, repository ? "library" +, imageName +, tag +, imageLayers +, imageConfig +, image ? "${stripScheme registry}/${repository}/${imageName}:${tag}" +}: + +# Make sure there are *no* slashes in the repository or container +# names since we use these to make the output derivation name for the +# nix-store path. +assert null == lib.findFirst (c: "/"==c) null (lib.stringToCharacters repository); +assert null == lib.findFirst (c: "/"==c) null (lib.stringToCharacters imageName); + +let + # Abuse paths to collapse possible double slashes + repoTag0 = builtins.toString (/. + "/${stripScheme registry}/${repository}/${imageName}"); + repoTag1 = lib.removePrefix "/" repoTag0; + + layers = builtins.map stripNixStore imageLayers; + + manifest = + writeText "manifest.json" (builtins.toJSON [ + { Config = stripNixStore imageConfig; + Layers = layers; + RepoTags = [ "${repoTag1}:${tag}" ]; + }]); + + repositories = + writeText "repositories" (builtins.toJSON { + ${repoTag1} = { + ${tag} = lib.last layers; + }; + }); + + imageFileStorePaths = + writeText "imageFileStorePaths.txt" + (lib.concatStringsSep "\n" ((lib.unique imageLayers) ++ [imageConfig])); +in +stdenv.mkDerivation { + builder = ./fetchdocker-builder.sh; + buildInputs = [ coreutils ]; + preferLocalBuild = true; + + inherit name imageName repository tag; + inherit bash gnutar manifest repositories; + inherit imageFileStorePaths; + + passthru = { + inherit image; + }; +} diff --git a/pkgs/build-support/fetchdocker/fetchDockerConfig.nix b/pkgs/build-support/fetchdocker/fetchDockerConfig.nix new file mode 100644 index 0000000..9fd813b --- /dev/null +++ b/pkgs/build-support/fetchdocker/fetchDockerConfig.nix @@ -0,0 +1,13 @@ +pkgargs@{ stdenv, lib, haskellPackages, writeText, gawk }: +let + generic-fetcher = + import ./generic-fetcher.nix pkgargs; +in + +args@{ repository ? "library", imageName, tag, ... }: + +generic-fetcher ({ + fetcher = "hocker-config"; + name = "${repository}_${imageName}_${tag}-config.json"; + tag = "unused"; +} // args) diff --git a/pkgs/build-support/fetchdocker/fetchDockerLayer.nix b/pkgs/build-support/fetchdocker/fetchDockerLayer.nix new file mode 100644 index 0000000..869ba63 --- /dev/null +++ b/pkgs/build-support/fetchdocker/fetchDockerLayer.nix @@ -0,0 +1,13 @@ +pkgargs@{ stdenv, lib, haskellPackages, writeText, gawk }: +let + generic-fetcher = + import ./generic-fetcher.nix pkgargs; +in + +args@{ layerDigest, ... }: + +generic-fetcher ({ + fetcher = "hocker-layer"; + name = "docker-layer-${layerDigest}.tar.gz"; + tag = "unused"; +} // args) diff --git a/pkgs/build-support/fetchdocker/fetchdocker-builder.sh b/pkgs/build-support/fetchdocker/fetchdocker-builder.sh new file mode 100644 index 0000000..489914a --- /dev/null +++ b/pkgs/build-support/fetchdocker/fetchdocker-builder.sh @@ -0,0 +1,28 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source "${stdenv}/setup" +echo "exporting ${repository}/${imageName} (tag: ${tag}) into ${out}" +mkdir -p "${out}" + +cat < "${out}/compositeImage.sh" +#! ${bash}/bin/bash +# +# Create a tar archive of a docker image's layers, docker image config +# json, manifest.json, and repositories json; this streams directly to +# stdout and is intended to be used in concert with docker load, i.e: +# +# ${out}/compositeImage.sh | docker load + +# The first character follow the 's' command for sed becomes the +# delimiter sed will use; this makes the transformation regex easy to +# read. We feed tar a file listing the files we want in the archive, +# because the paths are absolute and docker load wants them flattened in +# the archive, we need to transform all of the paths going in by +# stripping everything *including* the last solidus so that we end up +# with the basename of the path. +${gnutar}/bin/tar \ + --transform='s=.*/==' \ + --transform="s=.*-manifest.json=manifest.json=" \ + --transform="s=.*-repositories=repositories=" \ + -c "${manifest}" "${repositories}" -T "${imageFileStorePaths}" +EOF +chmod +x "${out}/compositeImage.sh" diff --git a/pkgs/build-support/fetchdocker/generic-fetcher.nix b/pkgs/build-support/fetchdocker/generic-fetcher.nix new file mode 100644 index 0000000..95b1934 --- /dev/null +++ b/pkgs/build-support/fetchdocker/generic-fetcher.nix @@ -0,0 +1,93 @@ +{ stdenv, lib, haskellPackages, writeText, gawk }: +let + awk = "${gawk}/bin/awk"; + dockerCredentialsFile = import ./credentials.nix { inherit lib; }; +in +{ fetcher +, name + , registry ? "https://registry-1.docker.io/v2/" + , repository ? "library" + , imageName + , sha256 + , tag ? "" + , layerDigest ? "" +}: + +# There must be no slashes in the repository or container names since +# we use these to make the output derivation name for the nix store +# path +assert null == lib.findFirst (c: "/"==c) null (lib.stringToCharacters repository); +assert null == lib.findFirst (c: "/"==c) null (lib.stringToCharacters imageName); + +# Only allow hocker-config and hocker-layer as fetchers for now +assert (builtins.elem fetcher ["hocker-config" "hocker-layer"]); + +# If layerDigest is non-empty then it must not have a 'sha256:' prefix! +assert + (if layerDigest != "" + then !lib.hasPrefix "sha256:" layerDigest + else true); + +let + layerDigestFlag = + lib.optionalString (layerDigest != "") "--layer ${layerDigest}"; +in +stdenv.mkDerivation { + inherit name; + builder = writeText "${fetcher}-builder.sh" '' + source "$stdenv/setup" + echo "${fetcher} exporting to $out" + + declare -A creds + + # This is a hack for Hydra since we have no way of adding values + # to the NIX_PATH for Hydra jobsets!! + staticCredentialsFile="/etc/nix-docker-credentials.txt" + if [ ! -f "$dockerCredentialsFile" -a -f "$staticCredentialsFile" ]; then + echo "credentials file not set, falling back on static credentials file at: $staticCredentialsFile" + dockerCredentialsFile=$staticCredentialsFile + fi + + if [ -f "$dockerCredentialsFile" ]; then + echo "using credentials from $dockerCredentialsFile" + + CREDSFILE=$(cat "$dockerCredentialsFile") + creds[token]=$(${awk} -F'=' '/DOCKER_TOKEN/ {print $2}' <<< "$CREDSFILE" | head -n1) + + # Prefer DOCKER_TOKEN over the username and password + # authentication method + if [ -z "''${creds[token]}" ]; then + creds[user]=$(${awk} -F'=' '/DOCKER_USER/ {print $2}' <<< "$CREDSFILE" | head -n1) + creds[pass]=$(${awk} -F'=' '/DOCKER_PASS/ {print $2}' <<< "$CREDSFILE" | head -n1) + fi + fi + + # These variables will be filled in first by the impureEnvVars, if + # those variables are empty then they will default to the + # credentials that may have been read in from the 'DOCKER_CREDENTIALS' + DOCKER_USER="''${DOCKER_USER:-''${creds[user]}}" + DOCKER_PASS="''${DOCKER_PASS:-''${creds[pass]}}" + DOCKER_TOKEN="''${DOCKER_TOKEN:-''${creds[token]}}" + + ${fetcher} --out="$out" \ + ''${registry:+--registry "$registry"} \ + ''${DOCKER_USER:+--username "$DOCKER_USER"} \ + ''${DOCKER_PASS:+--password "$DOCKER_PASS"} \ + ''${DOCKER_TOKEN:+--token "$DOCKER_TOKEN"} \ + ${layerDigestFlag} \ + "${repository}/${imageName}" \ + "${tag}" + ''; + + buildInputs = [ haskellPackages.hocker ]; + + outputHashAlgo = "sha256"; + outputHashMode = "flat"; + outputHash = sha256; + + preferLocalBuild = true; + + impureEnvVars = [ "DOCKER_USER" "DOCKER_PASS" "DOCKER_TOKEN" ]; + + inherit registry dockerCredentialsFile; +} diff --git a/pkgs/build-support/fetchfirefoxaddon/default.nix b/pkgs/build-support/fetchfirefoxaddon/default.nix new file mode 100644 index 0000000..e07a6a1 --- /dev/null +++ b/pkgs/build-support/fetchfirefoxaddon/default.nix @@ -0,0 +1,57 @@ +{ stdenv +, fetchurl +, jq +, strip-nondeterminism +, unzip +, writeScript +, zip +}: + +{ name +, url ? null +, sha1 ? "" +, sha256 ? "" +, sha512 ? "" +, fixedExtid ? null +, hash ? "" +, src ? "" +}: + +let + extid = if fixedExtid == null then "nixos@${name}" else fixedExtid; + source = if url == null then src else + fetchurl { + url = url; + inherit sha1 sha256 sha512 hash; + }; +in +stdenv.mkDerivation { + inherit name; + + passthru = { + inherit extid; + }; + + builder = writeScript "xpibuilder" '' + source $stdenv/setup + + echo "firefox addon $name into $out" + + UUID="${extid}" + mkdir -p "$out/$UUID" + unzip -q ${source} -d "$out/$UUID" + NEW_MANIFEST=$(jq '. + {"applications": { "gecko": { "id": "${extid}" }}, "browser_specific_settings":{"gecko":{"id": "${extid}"}}}' "$out/$UUID/manifest.json") + echo "$NEW_MANIFEST" > "$out/$UUID/manifest.json" + cd "$out/$UUID" + zip -r -q -FS "$out/$UUID.xpi" * + strip-nondeterminism "$out/$UUID.xpi" + rm -r "$out/$UUID" + ''; + + nativeBuildInputs = [ + jq + strip-nondeterminism + unzip + zip + ]; +} diff --git a/pkgs/build-support/fetchfirefoxaddon/tests.nix b/pkgs/build-support/fetchfirefoxaddon/tests.nix new file mode 100644 index 0000000..a29f65c --- /dev/null +++ b/pkgs/build-support/fetchfirefoxaddon/tests.nix @@ -0,0 +1,21 @@ +{ testers, fetchFirefoxAddon, fetchurl, ... }: + +{ + simple = testers.invalidateFetcherByDrvHash fetchFirefoxAddon { + name = "image-search-options"; + # Chosen because its only 147KB + url = "https://addons.mozilla.org/firefox/downloads/file/3059971/image_search_options-3.0.12-fx.xpi"; + sha256 = "sha256-H73YWX/DKxvhEwKpWOo7orAQ7c/rQywpljeyxYxv0Gg="; + }; + overridden-source = + let + image-search-options = fetchurl { + url = "https://addons.mozilla.org/firefox/downloads/file/3059971/image_search_options-3.0.12-fx.xpi"; + sha256 = "sha256-H73YWX/DKxvhEwKpWOo7orAQ7c/rQywpljeyxYxv0Gg="; + }; + in + testers.invalidateFetcherByDrvHash fetchFirefoxAddon { + name = "image-search-options"; + src = image-search-options; + }; +} diff --git a/pkgs/build-support/fetchfossil/builder.sh b/pkgs/build-support/fetchfossil/builder.sh new file mode 100644 index 0000000..fe828d0 --- /dev/null +++ b/pkgs/build-support/fetchfossil/builder.sh @@ -0,0 +1,21 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup +echo "Cloning Fossil $url [$rev] into $out" + +# Fossil, bless its adorable little heart, wants to write global configuration +# to $HOME/.fossil. AFAICT, there is no way to disable this functionality. +# Instead, we'll let it write to the build directory. +export HOME=$(pwd) + +# We must explicitly set the admin user for the clone to something reasonable. +fossil clone -A nobody "$url" fossil-clone.fossil + +mkdir fossil-clone +WORKDIR=$(pwd) +mkdir $out +pushd $out +fossil open "$WORKDIR/fossil-clone.fossil" "$rev" +popd + +# Just nuke the checkout file. +rm $out/.fslckout diff --git a/pkgs/build-support/fetchfossil/default.nix b/pkgs/build-support/fetchfossil/default.nix new file mode 100644 index 0000000..3f3bf69 --- /dev/null +++ b/pkgs/build-support/fetchfossil/default.nix @@ -0,0 +1,33 @@ +{stdenv, lib, fossil, cacert}: + +{ name ? null +, url +, rev +, sha256 ? "" +, hash ? "" +}: + +if hash != "" && sha256 != "" then + throw "Only one of sha256 or hash can be set" +else +stdenv.mkDerivation { + name = "fossil-archive" + (lib.optionalString (name != null) "-${name}"); + builder = ./builder.sh; + nativeBuildInputs = [fossil cacert]; + + # Envvar docs are hard to find. A link for the future: + # https://www.fossil-scm.org/index.html/doc/trunk/www/env-opts.md + impureEnvVars = [ "http_proxy" ]; + + outputHashAlgo = if hash != "" then null else "sha256"; + outputHashMode = "recursive"; + outputHash = if hash != "" then + hash + else if sha256 != "" then + sha256 + else + lib.fakeSha256; + + inherit url rev; + preferLocalBuild = true; +} diff --git a/pkgs/build-support/fetchgit/builder.sh b/pkgs/build-support/fetchgit/builder.sh new file mode 100644 index 0000000..95176be --- /dev/null +++ b/pkgs/build-support/fetchgit/builder.sh @@ -0,0 +1,20 @@ +# tested so far with: +# - no revision specified and remote has a HEAD which is used +# - revision specified and remote has a HEAD +# - revision specified and remote without HEAD +# +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +echo "exporting $url (rev $rev) into $out" + +$SHELL $fetcher --builder --url "$url" --out "$out" --rev "$rev" \ + ${leaveDotGit:+--leave-dotGit} \ + ${fetchLFS:+--fetch-lfs} \ + ${deepClone:+--deepClone} \ + ${fetchSubmodules:+--fetch-submodules} \ + ${sparseCheckout:+--sparse-checkout "$sparseCheckout"} \ + ${nonConeMode:+--non-cone-mode} \ + ${branchName:+--branch-name "$branchName"} + +runHook postFetch diff --git a/pkgs/build-support/fetchgit/default.nix b/pkgs/build-support/fetchgit/default.nix new file mode 100644 index 0000000..66bb3b7 --- /dev/null +++ b/pkgs/build-support/fetchgit/default.nix @@ -0,0 +1,110 @@ +{lib, stdenvNoCC, git, git-lfs, cacert}: let + urlToName = url: rev: let + inherit (lib) removeSuffix splitString last; + base = last (splitString ":" (baseNameOf (removeSuffix "/" url))); + + matched = builtins.match "(.*)\\.git" base; + + short = builtins.substring 0 7 rev; + + appendShort = lib.optionalString ((builtins.match "[a-f0-9]*" rev) != null) "-${short}"; + in "${if matched == null then base else builtins.head matched}${appendShort}"; +in +lib.makeOverridable ( +{ url, rev ? "HEAD", sha256 ? "", hash ? "", leaveDotGit ? deepClone +, fetchSubmodules ? true, deepClone ? false +, branchName ? null +, sparseCheckout ? [] +, nonConeMode ? false +, name ? urlToName url rev +, # Shell code executed after the file has been fetched + # successfully. This can do things like check or transform the file. + postFetch ? "" +, preferLocalBuild ? true +, fetchLFS ? false +, # Shell code to build a netrc file for BASIC auth + netrcPhase ? null +, # Impure env vars (https://nixos.org/nix/manual/#sec-advanced-attributes) + # needed for netrcPhase + netrcImpureEnvVars ? [] +, meta ? {} +, allowedRequisites ? null +}: + +/* NOTE: + fetchgit has one problem: git fetch only works for refs. + This is because fetching arbitrary (maybe dangling) commits creates garbage collection risks + and checking whether a commit belongs to a ref is expensive. This may + change in the future when some caching is added to git (?) + Usually refs are either tags (refs/tags/*) or branches (refs/heads/*) + Cloning branches will make the hash check fail when there is an update. + But not all patches we want can be accessed by tags. + + The workaround is getting the last n commits so that it's likely that they + still contain the hash we want. + + for now : increase depth iteratively (TODO) + + real fix: ask git folks to add a + git fetch $HASH contained in $BRANCH + facility because checking that $HASH is contained in $BRANCH is less + expensive than fetching --depth $N. + Even if git folks implemented this feature soon it may take years until + server admins start using the new version? +*/ + +assert deepClone -> leaveDotGit; +assert nonConeMode -> (sparseCheckout != []); + +if hash != "" && sha256 != "" then + throw "Only one of sha256 or hash can be set" +else if builtins.isString sparseCheckout then + # Changed to throw on 2023-06-04 + throw "Please provide directories/patterns for sparse checkout as a list of strings. Passing a (multi-line) string is not supported any more." +else +stdenvNoCC.mkDerivation { + inherit name; + builder = ./builder.sh; + fetcher = ./nix-prefetch-git; + + nativeBuildInputs = [ git ] + ++ lib.optionals fetchLFS [ git-lfs ]; + + outputHashAlgo = if hash != "" then null else "sha256"; + outputHashMode = "recursive"; + outputHash = if hash != "" then + hash + else if sha256 != "" then + sha256 + else + lib.fakeSha256; + + # git-sparse-checkout(1) says: + # > When the --stdin option is provided, the directories or patterns are read + # > from standard in as a newline-delimited list instead of from the arguments. + sparseCheckout = builtins.concatStringsSep "\n" sparseCheckout; + + inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName nonConeMode postFetch; + + postHook = if netrcPhase == null then null else '' + ${netrcPhase} + # required that git uses the netrc file + mv {,.}netrc + export NETRC=$PWD/.netrc + export HOME=$PWD + ''; + + GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ netrcImpureEnvVars ++ [ + "GIT_PROXY_COMMAND" "NIX_GIT_SSL_CAINFO" "SOCKS_SERVER" + ]; + + + inherit preferLocalBuild meta allowedRequisites; + + passthru = { + gitRepoUrl = url; + }; +} +) diff --git a/pkgs/build-support/fetchgit/deterministic-git b/pkgs/build-support/fetchgit/deterministic-git new file mode 100755 index 0000000..67f5855 --- /dev/null +++ b/pkgs/build-support/fetchgit/deterministic-git @@ -0,0 +1,45 @@ +#!/bin/sh + +# some git commands print to stdout, which would contaminate our JSON output +clean_git(){ + git "$@" >&2 +} + +# Remove all remote branches, remove tags not reachable from HEAD, do a full +# repack and then garbage collect unreferenced objects. +make_deterministic_repo(){ + local repo="$1" + + # run in sub-shell to not touch current working directory + ( + cd "$repo" + # Remove files that contain timestamps or otherwise have non-deterministic + # properties. + rm -rf .git/logs/ .git/hooks/ .git/index .git/FETCH_HEAD .git/ORIG_HEAD \ + .git/refs/remotes/origin/HEAD .git/config + + # Remove all remote branches. + git branch -r | while read -r branch; do + clean_git branch -rD "$branch" + done + + # Remove tags not reachable from HEAD. If we're exactly on a tag, don't + # delete it. + maybe_tag=$(git tag --points-at HEAD) + git tag --contains HEAD | while read -r tag; do + if [ "$tag" != "$maybe_tag" ]; then + clean_git tag -d "$tag" + fi + done + + # Do a full repack. Must run single-threaded, or else we lose determinism. + clean_git config pack.threads 1 + clean_git repack -A -d -f + rm -f .git/config + + # Garbage collect unreferenced objects. + # Note: --keep-largest-pack prevents non-deterministic ordering of packs + # listed in .git/objects/info/packs by only using a single pack + clean_git gc --prune=all --keep-largest-pack + ) +} diff --git a/pkgs/build-support/fetchgit/nix-prefetch-git b/pkgs/build-support/fetchgit/nix-prefetch-git new file mode 100755 index 0000000..7ac3dec --- /dev/null +++ b/pkgs/build-support/fetchgit/nix-prefetch-git @@ -0,0 +1,482 @@ +#! /usr/bin/env bash + +set -e -o pipefail + +url= +rev= +expHash= +hashType=$NIX_HASH_ALGO +deepClone=$NIX_PREFETCH_GIT_DEEP_CLONE +leaveDotGit=$NIX_PREFETCH_GIT_LEAVE_DOT_GIT +fetchSubmodules= +fetchLFS= +builder= +branchName=$NIX_PREFETCH_GIT_BRANCH_NAME + +# ENV params +out=${out:-} +http_proxy=${http_proxy:-} + +# allow overwriting cacert's ca-bundle.crt with a custom one +# this can be done by setting NIX_GIT_SSL_CAINFO and NIX_SSL_CERT_FILE environment variables for the nix-daemon +GIT_SSL_CAINFO=${NIX_GIT_SSL_CAINFO:-$GIT_SSL_CAINFO} + +# populated by clone_user_rev() +fullRev= +humanReadableRev= +commitDate= +commitDateStrict8601= + +if test -n "$deepClone"; then + deepClone=true +else + deepClone= +fi + +if test "$leaveDotGit" != 1; then + leaveDotGit= +else + leaveDotGit=true +fi + +usage(){ + echo >&2 "syntax: nix-prefetch-git [options] [URL [REVISION [EXPECTED-HASH]]] + +Options: + --out path Path where the output would be stored. + --url url Any url understood by 'git clone'. + --rev ref Any sha1 or references (such as refs/heads/master) + --hash h Expected hash. + --branch-name Branch name to check out into + --sparse-checkout Only fetch and checkout part of the repository. + --non-cone-mode Use non-cone mode for sparse checkouts. + --deepClone Clone the entire repository. + --no-deepClone Make a shallow clone of just the required ref. + --leave-dotGit Keep the .git directories. + --fetch-lfs Fetch git Large File Storage (LFS) files. + --fetch-submodules Fetch submodules. + --builder Clone as fetchgit does, but url, rev, and out option are mandatory. + --quiet Only print the final json summary. +" + exit 1 +} + +# some git commands print to stdout, which would contaminate our JSON output +clean_git(){ + git "$@" >&2 +} + +argi=0 +argfun="" +for arg; do + if test -z "$argfun"; then + case $arg in + --out) argfun=set_out;; + --url) argfun=set_url;; + --rev) argfun=set_rev;; + --hash) argfun=set_hashType;; + --branch-name) argfun=set_branchName;; + --deepClone) deepClone=true;; + --sparse-checkout) argfun=set_sparseCheckout;; + --non-cone-mode) nonConeMode=true;; + --quiet) QUIET=true;; + --no-deepClone) deepClone=;; + --leave-dotGit) leaveDotGit=true;; + --fetch-lfs) fetchLFS=true;; + --fetch-submodules) fetchSubmodules=true;; + --builder) builder=true;; + -h|--help) usage; exit;; + *) + : $((++argi)) + case $argi in + 1) url=$arg;; + 2) rev=$arg;; + 3) expHash=$arg;; + *) exit 1;; + esac + ;; + esac + else + case $argfun in + set_*) + var=${argfun#set_} + eval "$var=$(printf %q "$arg")" + ;; + esac + argfun="" + fi +done + +if test -z "$url"; then + usage +fi + + +init_remote(){ + local url=$1 + clean_git init --initial-branch=master + clean_git remote add origin "$url" + if [ -n "$sparseCheckout" ]; then + git config remote.origin.partialclonefilter "blob:none" + echo "$sparseCheckout" | git sparse-checkout set --stdin ${nonConeMode:+--no-cone} + fi + ( [ -n "$http_proxy" ] && clean_git config --global http.proxy "$http_proxy" ) || true +} + +# Return the reference of an hash if it exists on the remote repository. +ref_from_hash(){ + local hash=$1 + git ls-remote origin | sed -n "\,$hash\t, { s,\(.*\)\t\(.*\),\2,; p; q}" +} + +# Return the hash of a reference if it exists on the remote repository. +hash_from_ref(){ + local ref=$1 + git ls-remote origin | sed -n "\,\t$ref, { s,\(.*\)\t\(.*\),\1,; p; q}" +} + +# Returns a name based on the url and reference +# +# This function needs to be in sync with nix's fetchgit implementation +# of urlToName() to re-use the same nix store paths. +url_to_name(){ + local url=$1 + local ref=$2 + local base + base=$(basename "$url" .git | cut -d: -f2) + + if [[ $ref =~ ^[a-z0-9]+$ ]]; then + echo "$base-${ref:0:7}" + else + echo "$base" + fi +} + +# Fetch and checkout the right sha1 +checkout_hash(){ + local hash="$1" + local ref="$2" + + if test -z "$hash"; then + hash=$(hash_from_ref "$ref") + fi + + [[ -z "$deepClone" ]] && \ + clean_git fetch ${builder:+--progress} --depth=1 origin "$hash" || \ + clean_git fetch -t ${builder:+--progress} origin || return 1 + + local object_type=$(git cat-file -t "$hash") + if [[ "$object_type" == "commit" ]]; then + clean_git checkout -b "$branchName" "$hash" || return 1 + elif [[ "$object_type" == "tree" ]]; then + clean_git config user.email "nix-prefetch-git@localhost" + clean_git config user.name "nix-prefetch-git" + local commit_id=$(git commit-tree "$hash" -m "Commit created from tree hash $hash") + clean_git checkout -b "$branchName" "$commit_id" || return 1 + else + echo "Unrecognized git object type: $object_type" + return 1 + fi +} + +# Fetch only a branch/tag and checkout it. +checkout_ref(){ + local hash="$1" + local ref="$2" + + if [[ -n "$deepClone" ]]; then + # The caller explicitly asked for a deep clone. Deep clones + # allow "git describe" and similar tools to work. See + # https://marc.info/?l=nix-dev&m=139641582514772 + # for a discussion. + return 1 + fi + + if test -z "$ref"; then + ref=$(ref_from_hash "$hash") + fi + + if test -n "$ref"; then + # --depth option is ignored on http repository. + clean_git fetch ${builder:+--progress} --depth 1 origin +"$ref" || return 1 + clean_git checkout -b "$branchName" FETCH_HEAD || return 1 + else + return 1 + fi +} + +# Update submodules +init_submodules(){ + # shallow with leaveDotGit will change hashes + [[ -z "$deepClone" ]] && [[ -z "$leaveDotGit" ]] && \ + clean_git submodule update --init --recursive -j ${NIX_BUILD_CORES:-1} --progress --depth 1 || \ + clean_git submodule update --init --recursive -j ${NIX_BUILD_CORES:-1} --progress +} + +clone(){ + local top=$PWD + local dir="$1" + local url="$2" + local hash="$3" + local ref="$4" + + cd "$dir" + + # Initialize the repository. + init_remote "$url" + + # Download data from the repository. + checkout_ref "$hash" "$ref" || + checkout_hash "$hash" "$ref" || ( + echo 1>&2 "Unable to checkout $hash$ref from $url." + exit 1 + ) + + # Checkout linked sources. + if test -n "$fetchSubmodules"; then + init_submodules + fi + + if [ -z "$builder" ] && [ -f .topdeps ]; then + if tg help &>/dev/null; then + echo "populating TopGit branches..." + tg remote --populate origin + else + echo "WARNING: would populate TopGit branches but TopGit is not available" >&2 + echo "WARNING: install TopGit to fix the problem" >&2 + fi + fi + + cd "$top" +} + +# Remove all remote branches, remove tags not reachable from HEAD, do a full +# repack and then garbage collect unreferenced objects. +make_deterministic_repo(){ + local repo="$1" + + # run in sub-shell to not touch current working directory + ( + cd "$repo" + # Remove files that contain timestamps or otherwise have non-deterministic + # properties. + if [ -f .git ]; then + local dotgit_content=$(<.git) + local dotgit_dir="${dotgit_content#gitdir: }" + else + local dotgit_dir=".git" + fi + pushd "$dotgit_dir" >/dev/null + rm -rf logs/ hooks/ index FETCH_HEAD ORIG_HEAD refs/remotes/origin/HEAD config + popd >/dev/null + # Remove all remote branches. + git branch -r | while read -r branch; do + clean_git branch -rD "$branch" + done + + # Remove tags not reachable from HEAD. If we're exactly on a tag, don't + # delete it. + maybe_tag=$(git tag --points-at HEAD) + git tag --contains HEAD | while read -r tag; do + if [ "$tag" != "$maybe_tag" ]; then + clean_git tag -d "$tag" + fi + done + + # Do a full repack. Must run single-threaded, or else we lose determinism. + clean_git config pack.threads 1 + clean_git repack -A -d -f + rm -f "$dotgit_dir/config" + + # Garbage collect unreferenced objects. + # Note: --keep-largest-pack prevents non-deterministic ordering of packs + # listed in .git/objects/info/packs by only using a single pack + clean_git gc --prune=all --keep-largest-pack + ) +} + + +clone_user_rev() { + local dir="$1" + local url="$2" + local rev="${3:-HEAD}" + + if [ -n "$fetchLFS" ]; then + clean_git lfs install + fi + + # Perform the checkout. + case "$rev" in + HEAD|refs/*) + clone "$dir" "$url" "" "$rev" 1>&2;; + *) + if test -z "$(echo "$rev" | tr -d 0123456789abcdef)"; then + clone "$dir" "$url" "$rev" "" 1>&2 + else + # if revision is not hexadecimal it might be a tag + clone "$dir" "$url" "" "refs/tags/$rev" 1>&2 + fi;; + esac + + pushd "$dir" >/dev/null + fullRev=$( (git rev-parse "$rev" 2>/dev/null || git rev-parse "refs/heads/$branchName") | tail -n1) + humanReadableRev=$(git describe "$fullRev" 2> /dev/null || git describe --tags "$fullRev" 2> /dev/null || echo -- none --) + commitDate=$(git show -1 --no-patch --pretty=%ci "$fullRev") + commitDateStrict8601=$(git show -1 --no-patch --pretty=%cI "$fullRev") + popd >/dev/null + + # Allow doing additional processing before .git removal + eval "$NIX_PREFETCH_GIT_CHECKOUT_HOOK" + if test -z "$leaveDotGit"; then + echo "removing \`.git'..." >&2 + find "$dir" -name .git -print0 | xargs -0 rm -rf + else + find "$dir" -name .git | while read -r gitdir; do + make_deterministic_repo "$(readlink -f "$(dirname "$gitdir")")" + done + fi +} + +exit_handlers=() + +run_exit_handlers() { + exit_status=$? + for handler in "${exit_handlers[@]}"; do + eval "$handler $exit_status" + done +} + +trap run_exit_handlers EXIT + +quiet_exit_handler() { + exec 2>&3 3>&- + if [ $1 -ne 0 ]; then + cat "$errfile" >&2 + fi + rm -f "$errfile" +} + +quiet_mode() { + errfile="$(mktemp "${TMPDIR:-/tmp}/git-checkout-err-XXXXXXXX")" + exit_handlers+=(quiet_exit_handler) + exec 3>&2 2>"$errfile" +} + +json_escape() { + local s="$1" + s="${s//\\/\\\\}" # \ + s="${s//\"/\\\"}" # " + s="${s//^H/\\\b}" # \b (backspace) + s="${s//^L/\\\f}" # \f (form feed) + s="${s// +/\\\n}" # \n (newline) + s="${s//^M/\\\r}" # \r (carriage return) + s="${s// /\\t}" # \t (tab) + echo "$s" +} + +print_results() { + hash="$1" + if ! test -n "$QUIET"; then + echo "" >&2 + echo "git revision is $fullRev" >&2 + if test -n "$finalPath"; then + echo "path is $finalPath" >&2 + fi + echo "git human-readable version is $humanReadableRev" >&2 + echo "Commit date is $commitDate" >&2 + if test -n "$hash"; then + echo "hash is $hash" >&2 + fi + fi + if test -n "$hash"; then + cat < /dev/null; then + finalPath= + fi + hash=$expHash + fi + + # If we don't know the hash or a path with that hash doesn't exist, + # download the file and add it to the store. + if test -z "$finalPath"; then + + tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/git-checkout-tmp-XXXXXXXX")" + exit_handlers+=(remove_tmpPath) + + tmpFile="$tmpPath/$(url_to_name "$url" "$rev")" + mkdir -p "$tmpFile" + + # Perform the checkout. + clone_user_rev "$tmpFile" "$url" "$rev" + + # Compute the hash. + hash=$(nix-hash --type $hashType --base32 "$tmpFile") + + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" "$tmpFile") + + if test -n "$expHash" -a "$expHash" != "$hash"; then + echo "hash mismatch for URL \`$url'. Got \`$hash'; expected \`$expHash'." >&2 + exit 1 + fi + fi + + print_results "$hash" + + if test -n "$PRINT_PATH"; then + echo "$finalPath" + fi +fi diff --git a/pkgs/build-support/fetchgit/tests.nix b/pkgs/build-support/fetchgit/tests.nix new file mode 100644 index 0000000..23e5fa2 --- /dev/null +++ b/pkgs/build-support/fetchgit/tests.nix @@ -0,0 +1,75 @@ +{ testers, fetchgit, ... }: { + simple = testers.invalidateFetcherByDrvHash fetchgit { + name = "simple-nix-source"; + url = "https://github.com/NixOS/nix"; + rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a"; + sha256 = "sha256-7DszvbCNTjpzGRmpIVAWXk20P0/XTrWZ79KSOGLrUWY="; + }; + + sparseCheckout = testers.invalidateFetcherByDrvHash fetchgit { + name = "sparse-checkout-nix-source"; + url = "https://github.com/NixOS/nix"; + rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a"; + sparseCheckout = [ + "src" + "tests" + ]; + sha256 = "sha256-g1PHGTWgAcd/+sXHo1o6AjVWCvC6HiocOfMbMh873LQ="; + }; + + sparseCheckoutNonConeMode = testers.invalidateFetcherByDrvHash fetchgit { + name = "sparse-checkout-non-cone-nix-source"; + url = "https://github.com/NixOS/nix"; + rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a"; + sparseCheckout = [ + "src" + "tests" + ]; + nonConeMode = true; + sha256 = "sha256-FknO6C/PSnMPfhUqObD4vsW4PhkwdmPa9blNzcNvJQ4="; + }; + + leave-git = testers.invalidateFetcherByDrvHash fetchgit { + name = "leave-git-nix-source"; + url = "https://github.com/NixOS/nix"; + rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a"; + sha256 = "sha256-zZxDxqaeWvuWuzwPizBLR7d59zP24+zqnWllNICenko="; + leaveDotGit = true; + }; + + submodule-simple = testers.invalidateFetcherByDrvHash fetchgit { + name = "submodule-simple-source"; + url = "https://github.com/pineapplehunter/nix-test-repo-with-submodule"; + rev = "26473335b84ead88ee0a3b649b1c7fa4a91cfd4a"; + sha256 = "sha256-rmP8PQT0wJBopdtr/hsB7Y/L1G+ZPdHC2r9LB05Qrj4="; + fetchSubmodules = true; + }; + + submodule-leave-git = testers.invalidateFetcherByDrvHash fetchgit { + name = "submodule-leave-git-source"; + url = "https://github.com/pineapplehunter/nix-test-repo-with-submodule"; + rev = "26473335b84ead88ee0a3b649b1c7fa4a91cfd4a"; + sha256 = "sha256-+uXIClcRJ4S1rdgx2Oyww+Jv4h1VXp8tfeh9lb07Fhk="; + leaveDotGit = true; + fetchSubmodules = true; + }; + + submodule-deep = testers.invalidateFetcherByDrvHash fetchgit { + name = "submodule-deep-source"; + url = "https://github.com/pineapplehunter/nix-test-repo-with-submodule"; + rev = "26473335b84ead88ee0a3b649b1c7fa4a91cfd4a"; + sha256 = "sha256-LL7uhXQk3N3DcvBBxwjmfVx55tTXCGQ19T91tknopzw="; + deepClone = true; + fetchSubmodules = true; + }; + + submodule-leave-git-deep = testers.invalidateFetcherByDrvHash fetchgit { + name = "submodule-leave-git-deep-source"; + url = "https://github.com/pineapplehunter/nix-test-repo-with-submodule"; + rev = "26473335b84ead88ee0a3b649b1c7fa4a91cfd4a"; + sha256 = "sha256-LL7uhXQk3N3DcvBBxwjmfVx55tTXCGQ19T91tknopzw="; + deepClone = true; + leaveDotGit = true; + fetchSubmodules = true; + }; +} diff --git a/pkgs/build-support/fetchgitea/default.nix b/pkgs/build-support/fetchgitea/default.nix new file mode 100644 index 0000000..513ceba --- /dev/null +++ b/pkgs/build-support/fetchgitea/default.nix @@ -0,0 +1,9 @@ +# Gitea's URLs are compatible with GitHub + +{ lib, fetchFromGitHub }: + +lib.makeOverridable ( +{ domain, ... }@args: + +fetchFromGitHub ((removeAttrs args [ "domain" ]) // { githubBase = domain; }) +) diff --git a/pkgs/build-support/fetchgithub/default.nix b/pkgs/build-support/fetchgithub/default.nix new file mode 100644 index 0000000..4ce3c6e --- /dev/null +++ b/pkgs/build-support/fetchgithub/default.nix @@ -0,0 +1,68 @@ +{ lib, fetchgit, fetchzip }: + +lib.makeOverridable ( +{ owner, repo, rev, name ? "source" +, fetchSubmodules ? false, leaveDotGit ? null +, deepClone ? false, private ? false, forceFetchGit ? false +, sparseCheckout ? [] +, githubBase ? "github.com", varPrefix ? null +, meta ? { } +, ... # For hash agility +}@args: + +let + + position = (if args.meta.description or null != null + then builtins.unsafeGetAttrPos "description" args.meta + else builtins.unsafeGetAttrPos "rev" args + ); + baseUrl = "https://${githubBase}/${owner}/${repo}"; + newMeta = meta // { + homepage = meta.homepage or baseUrl; + } // lib.optionalAttrs (position != null) { + # to indicate where derivation originates, similar to make-derivation.nix's mkDerivation + position = "${position.file}:${toString position.line}"; + }; + passthruAttrs = removeAttrs args [ "owner" "repo" "rev" "fetchSubmodules" "forceFetchGit" "private" "githubBase" "varPrefix" ]; + varBase = "NIX${lib.optionalString (varPrefix != null) "_${varPrefix}"}_GITHUB_PRIVATE_"; + useFetchGit = fetchSubmodules || (leaveDotGit == true) || deepClone || forceFetchGit || (sparseCheckout != []); + # We prefer fetchzip in cases we don't need submodules as the hash + # is more stable in that case. + fetcher = + if useFetchGit then fetchgit + # fetchzip may not be overridable when using external tools, for example nix-prefetch + else if fetchzip ? override then fetchzip.override { withUnzip = false; } + else fetchzip; + privateAttrs = lib.optionalAttrs private { + netrcPhase = '' + if [ -z "''$${varBase}USERNAME" -o -z "''$${varBase}PASSWORD" ]; then + echo "Error: Private fetchFromGitHub requires the nix building process (nix-daemon in multi user mode) to have the ${varBase}USERNAME and ${varBase}PASSWORD env vars set." >&2 + exit 1 + fi + cat > netrc < $out + + mv $DOT_GIT/index-user $DOT_GIT/index # restore index + ''; + + gitHash = builtins.readFile gitHashFile; # cache against git hash + + nixPath = runCommand "put-in-nix" { + nativeBuildInputs = [ git ]; + preferLocalBuild = true; + } '' + mkdir $out + + # dump tar of *current directory* at given revision + git -C ${srcStr} archive --format=tar ${gitHash} \ + | tar xf - -C $out + ''; + +in nixPath +) diff --git a/pkgs/build-support/fetchgx/default.nix b/pkgs/build-support/fetchgx/default.nix new file mode 100644 index 0000000..93f60c0 --- /dev/null +++ b/pkgs/build-support/fetchgx/default.nix @@ -0,0 +1,30 @@ +{ stdenvNoCC, gx, gx-go, go, cacert }: + +{ name, src, sha256 }: + +stdenvNoCC.mkDerivation { + name = "${name}-gxdeps"; + inherit src; + + nativeBuildInputs = [ cacert go gx gx-go ]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + dontConfigure = true; + doCheck = false; + doInstallCheck = false; + + buildPhase = '' + export GOPATH=$(pwd)/vendor + mkdir -p vendor + gx install + ''; + + installPhase = '' + mv vendor $out + ''; + + preferLocalBuild = true; +} diff --git a/pkgs/build-support/fetchhg/builder.sh b/pkgs/build-support/fetchhg/builder.sh new file mode 100644 index 0000000..20dfde4 --- /dev/null +++ b/pkgs/build-support/fetchhg/builder.sh @@ -0,0 +1,8 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup +echo "getting $url${rev:+ ($rev)} into $out" + +hg clone --insecure "$url" hg-clone + +hg archive -q$subrepoClause -y ${rev:+-r "$rev"} --cwd hg-clone $out +rm -f $out/.hg_archival.txt diff --git a/pkgs/build-support/fetchhg/default.nix b/pkgs/build-support/fetchhg/default.nix new file mode 100644 index 0000000..6af886b --- /dev/null +++ b/pkgs/build-support/fetchhg/default.nix @@ -0,0 +1,34 @@ +{ lib, stdenvNoCC, mercurial }: +{ name ? null +, url +, rev ? null +, sha256 ? null +, hash ? null +, fetchSubrepos ? false +, preferLocalBuild ? true }: + +if hash != null && sha256 != null then + throw "Only one of sha256 or hash can be set" +else +# TODO: statically check if mercurial as the https support if the url starts woth https. +stdenvNoCC.mkDerivation { + name = "hg-archive" + (lib.optionalString (name != null) "-${name}"); + builder = ./builder.sh; + nativeBuildInputs = [mercurial]; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + + subrepoClause = lib.optionalString fetchSubrepos "S"; + + outputHashAlgo = if hash != null then null else "sha256"; + outputHashMode = "recursive"; + outputHash = if hash != null then + hash + else if sha256 != null then + sha256 + else + lib.fakeSha256; + + inherit url rev; + inherit preferLocalBuild; +} diff --git a/pkgs/build-support/fetchhg/nix-prefetch-hg b/pkgs/build-support/fetchhg/nix-prefetch-hg new file mode 100755 index 0000000..94c6b1e --- /dev/null +++ b/pkgs/build-support/fetchhg/nix-prefetch-hg @@ -0,0 +1,83 @@ +#! /usr/bin/env bash +set -e + +url=$1 +rev=$2 +expHash=$3 + +hashType="${NIX_HASH_ALGO:-sha256}" +hashFormat=${hashFormat:-"--base32"} +rev="${rev:-tip}" + +LOG() { + echo "$@" >&2 +} + +die() { + LOG "$@" + exit 1 +} + +if [[ -z "$url" || "$url" == "--help" ]]; then + die "Usage: nix-prefetch-hg URL [rev [EXPECTED-HASH]]" +fi + +if [[ "${fetchSubrepos:-0}" == 1 ]]; then + subrepoClause=S +else + subrepoClause= +fi + +# If the hash was given, a file with that hash may already be in the +# store. +if [[ -n "$expHash" ]]; then + finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" hg-archive) + if ! nix-store --check-validity "$finalPath" 2> /dev/null; then + finalPath= + fi + hash="$expHash" +fi + + +# If we don't know the hash or a path with that hash doesn't exist, +# download the file and add it to the store. +if [[ -z "$finalPath" ]]; then + + tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/hg-checkout-tmp-XXXXXXXX")" + cleanup() { x=$?; rm -rf "$tmpPath"; exit $x; }; trap cleanup EXIT + + tmpArchive="$tmpPath/hg-archive" + + # Perform the checkout. + if [[ "$url" != /* ]]; then + tmpClone="$tmpPath/hg-clone" + hg clone -q -y -U "$url" "$tmpClone" >&2 + else + tmpClone=$url + fi + hg archive -q$subrepoClause -y -r "$rev" --cwd "$tmpClone" "$tmpArchive" + rm -f "$tmpArchive/.hg_archival.txt" + + LOG "hg revision is $(cd "$tmpClone"; hg id -r "$rev" -i)" + + # Compute the hash. + hash=$(nix-hash --type "$hashType" "$hashFormat" "$tmpArchive") + if [[ -z "$QUIET" ]]; then LOG "hash is $hash"; fi + + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" "$tmpArchive") + + if [[ -n "$expHash" && "$expHash" != "$hash" ]]; then + die "ERROR: hash mismatch for URL \`$url'" + fi + + +fi + +if [[ -z "$QUIET" ]]; then LOG "path is $finalPath"; fi + +echo "$hash" + +if [[ -n "$PRINT_PATH" ]]; then + echo "$finalPath" +fi diff --git a/pkgs/build-support/fetchipfs/builder.sh b/pkgs/build-support/fetchipfs/builder.sh new file mode 100644 index 0000000..1ddd111 --- /dev/null +++ b/pkgs/build-support/fetchipfs/builder.sh @@ -0,0 +1,88 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +# Curl flags to handle redirects, not use EPSV, handle cookies for +# servers to need them during redirects, and work on SSL without a +# certificate (this isn't a security problem because we check the +# cryptographic hash of the output anyway). + +set -o noglob + +curl="curl \ + --location \ + --max-redirs 20 \ + --retry 2 \ + --disable-epsv \ + --cookie-jar cookies \ + --insecure \ + --speed-time 5 \ + -# \ + --fail \ + $curlOpts \ + $NIX_CURL_FLAGS" + +finish() { + runHook postFetch + set +o noglob + exit 0 +} + +ipfs_add() { + if curl --retry 0 --head --silent "localhost:5001" > /dev/null; then + echo "=IPFS= add $ipfs" + tar --owner=root --group=root -cWf "source.tar" $(echo *) + res=$(curl -# -F "file=@source.tar" "localhost:5001/api/v0/tar/add" | sed 's/.*"Hash":"\(.*\)".*/\1/') + if [ $ipfs != $res ]; then + echo "\`ipfs tar add' results in $res when $ipfs is expected" + exit 1 + fi + rm "source.tar" + fi +} + +echo + +mkdir download +cd download + +if curl --retry 0 --head --silent "localhost:5001" > /dev/null; then + curlexit=18; + echo "=IPFS= get $ipfs" + # if we get error code 18, resume partial download + while [ $curlexit -eq 18 ]; do + # keep this inside an if statement, since on failure it doesn't abort the script + if $curl -C - "http://localhost:5001/api/v0/tar/cat?arg=$ipfs" --output "$ipfs.tar"; then + unpackFile "$ipfs.tar" + rm "$ipfs.tar" + set +o noglob + mv $(echo *) "$out" + finish + else + curlexit=$?; + fi + done +fi + +if test -n "$url"; then + curlexit=18; + echo "Downloading $url" + while [ $curlexit -eq 18 ]; do + # keep this inside an if statement, since on failure it doesn't abort the script + if $curl "$url" -O; then + set +o noglob + tmpfile=$(echo *) + unpackFile $tmpfile + rm $tmpfile + ipfs_add + mv $(echo *) "$out" + finish + else + curlexit=$?; + fi + done +fi + +echo "error: cannot download $ipfs from ipfs or the given url" +echo +set +o noglob +exit 1 diff --git a/pkgs/build-support/fetchipfs/default.nix b/pkgs/build-support/fetchipfs/default.nix new file mode 100644 index 0000000..0cbb094 --- /dev/null +++ b/pkgs/build-support/fetchipfs/default.nix @@ -0,0 +1,50 @@ +{ stdenv +, curl +}: + +{ ipfs +, url ? "" +, curlOpts ? "" +, outputHash ? "" +, outputHashAlgo ? "" +, md5 ? "" +, sha1 ? "" +, sha256 ? "" +, sha512 ? "" +, meta ? {} +, port ? "8080" +, postFetch ? "" +, preferLocalBuild ? true +}: + +let + + hasHash = (outputHash != "" && outputHashAlgo != "") + || md5 != "" || sha1 != "" || sha256 != "" || sha512 != ""; + +in + +if (!hasHash) then throw "Specify sha for fetchipfs fixed-output derivation" else stdenv.mkDerivation { + name = ipfs; + builder = ./builder.sh; + nativeBuildInputs = [ curl ]; + + # New-style output content requirements. + outputHashAlgo = if outputHashAlgo != "" then outputHashAlgo else + if sha512 != "" then "sha512" else if sha256 != "" then "sha256" else if sha1 != "" then "sha1" else "md5"; + outputHash = if outputHash != "" then outputHash else + if sha512 != "" then sha512 else if sha256 != "" then sha256 else if sha1 != "" then sha1 else md5; + + outputHashMode = "recursive"; + + inherit curlOpts + postFetch + ipfs + url + port + meta; + + # Doing the download on a remote machine just duplicates network + # traffic, so don't do that. + inherit preferLocalBuild; +} diff --git a/pkgs/build-support/fetchmavenartifact/default.nix b/pkgs/build-support/fetchmavenartifact/default.nix new file mode 100644 index 0000000..0f3cd4e --- /dev/null +++ b/pkgs/build-support/fetchmavenartifact/default.nix @@ -0,0 +1,73 @@ +# Adaptation of the MIT-licensed work on `sbt2nix` done by Charles O'Farrell + +{ lib, fetchurl, stdenv }: +let + defaultRepos = [ + "https://repo1.maven.org/maven2" + "https://oss.sonatype.org/content/repositories/releases" + "https://oss.sonatype.org/content/repositories/public" + "https://repo.typesafe.com/typesafe/releases" + ]; +in + +args@ +{ # Example: "org.apache.httpcomponents" + groupId +, # Example: "httpclient" + artifactId +, # Example: "4.3.6" + version +, # Example: "jdk11" + classifier ? null +, # List of maven repositories from where to fetch the artifact. + # Example: [ http://oss.sonatype.org/content/repositories/public ]. + repos ? defaultRepos + # The `url` and `urls` parameters, if specified should point to the JAR + # file and will take precedence over the `repos` parameter. Only one of `url` + # and `urls` can be specified, not both. +, url ? "" +, urls ? [] +, # The rest of the arguments are just forwarded to `fetchurl`. + ... +}: + +# only one of url and urls can be specified at a time. +assert (url == "") || (urls == []); +# if repos is empty, then url or urls must be specified. +assert (repos != []) || (url != "") || (urls != []); + +let + pname = (lib.replaceStrings [ "." ] [ "_" ] groupId) + "_" + (lib.replaceStrings [ "." ] [ "_" ] artifactId); + suffix = lib.optionalString (classifier != null) "-${classifier}"; + filename = "${artifactId}-${version}${suffix}.jar"; + mkJarUrl = repoUrl: + lib.concatStringsSep "/" [ + (lib.removeSuffix "/" repoUrl) + (lib.replaceStrings ["."] ["/"] groupId) + artifactId + version + filename + ]; + urls_ = + if url != "" then [url] + else if urls != [] then urls + else map mkJarUrl repos; + jar = + fetchurl ( + builtins.removeAttrs args [ "groupId" "artifactId" "version" "classifier" "repos" "url" ] + // { urls = urls_; name = "${pname}-${version}.jar"; } + ); +in + stdenv.mkDerivation { + inherit pname version; + dontUnpack = true; + # By moving the jar to $out/share/java we make it discoverable by java + # packages packages that mention this derivation in their buildInputs. + installPhase = '' + mkdir -p $out/share/java + ln -s ${jar} $out/share/java/${filename} + ''; + # We also add a `jar` attribute that can be used to easily obtain the path + # to the downloaded jar file. + passthru.jar = jar; + } diff --git a/pkgs/build-support/fetchmtn/builder.sh b/pkgs/build-support/fetchmtn/builder.sh new file mode 100644 index 0000000..de929fa --- /dev/null +++ b/pkgs/build-support/fetchmtn/builder.sh @@ -0,0 +1,46 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +set -x + +if ! [ -f "$cacheDB" ]; then + echo "Creating cache DB $cacheDB" + mtn --db "$cacheDB" db init +fi + +echo "getting revision $selector"; + +done=; +for source in $dbs; do + if mtn pull --db "$cacheDB" "$source" "${branch}"; then + revision="$(mtn --db "$cacheDB" au toposort $(mtn --db "$cacheDB" au select "$selector") | tail -1)"; + if [ -n "$revision" ]; then + if mtn --db "$cacheDB" au get_revision "$revision"; then + echo "found revision $revision" + done=1; + else + echo "revision $revision does not exist"; + fi + else + echo "selector $selector does not match any revision"; + fi + else + echo "pulling branch $branch wasn't successful"; + fi; + if test -n "$done"; then + break; + fi; +done; + +echo "checking out the revision $revision"; + +if test -n "$done"; then + mtn checkout --db "$cacheDB" -r "$revision" "$out" -b "${branch}" +else + echo "Needed revision still not found. Exiting"; + exit 1; +fi; + +echo "clearing _MTN in the output" + +rm -rf "$out/_MTN" diff --git a/pkgs/build-support/fetchmtn/default.nix b/pkgs/build-support/fetchmtn/default.nix new file mode 100644 index 0000000..4aa1342 --- /dev/null +++ b/pkgs/build-support/fetchmtn/default.nix @@ -0,0 +1,25 @@ +# You can specify some extra mirrors and a cache DB via options +{lib, stdenvNoCC, monotone, defaultDBMirrors ? [], cacheDB ? "./mtn-checkout.db"}: +# dbs is a list of strings +# each is an url for sync + +# selector is mtn selector, like h:org.example.branch +# +{name ? "mtn-checkout", dbs ? [], sha256 +, selector ? "h:" + branch, branch}: + +stdenvNoCC.mkDerivation { + builder = ./builder.sh; + nativeBuildInputs = [monotone]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + dbs = defaultDBMirrors ++ dbs; + inherit branch cacheDB name selector; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + +} + diff --git a/pkgs/build-support/fetchnextcloudapp/default.nix b/pkgs/build-support/fetchnextcloudapp/default.nix new file mode 100644 index 0000000..059003d --- /dev/null +++ b/pkgs/build-support/fetchnextcloudapp/default.nix @@ -0,0 +1,36 @@ +{ stdenv, fetchzip, applyPatches, lib, ... }: +{ url +, hash ? "" +, sha256 ? "" +, appName ? null +, appVersion ? null +, license +, patches ? [ ] +, description ? null +, homepage ? null +}: +applyPatches ({ + inherit patches; + src = fetchzip { + inherit url hash sha256; + postFetch = '' + pushd $out &>/dev/null + if [ ! -f ./appinfo/info.xml ]; then + echo "appinfo/info.xml doesn't exist in $out, aborting!" + exit 1 + fi + popd &>/dev/null + ''; + meta = { + license = lib.licenses.${license}; + longDescription = description; + inherit homepage; + } // lib.optionalAttrs (description != null) { + longDescription = description; + } // lib.optionalAttrs (homepage != null) { + inherit homepage; + }; + }; +} // lib.optionalAttrs (appName != null && appVersion != null) { + name = "nextcloud-app-${appName}-${appVersion}"; +}) diff --git a/pkgs/build-support/fetchpatch/default.nix b/pkgs/build-support/fetchpatch/default.nix new file mode 100644 index 0000000..a3ca668 --- /dev/null +++ b/pkgs/build-support/fetchpatch/default.nix @@ -0,0 +1,93 @@ +# This function downloads and normalizes a patch/diff file. +# This is primarily useful for dynamically generated patches, +# such as GitHub's or cgit's, where the non-significant content parts +# often change with updating of git or cgit. +# stripLen acts as the -p parameter when applying a patch. + +{ lib, fetchurl, patchutils }: + +{ relative ? null +, stripLen ? 0 +, decode ? "cat" # custom command to decode patch e.g. base64 -d +, extraPrefix ? null +, excludes ? [] +, includes ? [] +, revert ? false +, postFetch ? "" +, ... +}@args: +let + args' = if relative != null then { + stripLen = 1 + lib.length (lib.splitString "/" relative) + stripLen; + extraPrefix = lib.optionalString (extraPrefix != null) extraPrefix; + } else { + inherit stripLen extraPrefix; + }; +in let + inherit (args') stripLen extraPrefix; +in +lib.throwIfNot (excludes == [] || includes == []) + "fetchpatch: cannot use excludes and includes simultaneously" +fetchurl ({ + postFetch = '' + tmpfile="$TMPDIR/patch" + + if [ ! -s "$out" ]; then + echo "error: Fetched patch file '$out' is empty!" 1>&2 + exit 1 + fi + + set +e + ${decode} < "$out" > "$tmpfile" + if [ $? -ne 0 ] || [ ! -s "$tmpfile" ]; then + echo 'Failed to decode patch with command "'${lib.escapeShellArg decode}'"' >&2 + echo 'Fetched file was (limited to 128 bytes):' >&2 + od -A x -t x1z -v -N 128 "$out" >&2 + exit 1 + fi + set -e + mv "$tmpfile" "$out" + + "${patchutils}/bin/lsdiff" \ + ${lib.optionalString (relative != null) "-p1 -i ${lib.escapeShellArg relative}/'*'"} \ + "$out" \ + | sort -u | sed -e 's/[*?]/\\&/g' \ + | xargs -I{} \ + "${patchutils}/bin/filterdiff" \ + --include={} \ + --strip=${toString stripLen} \ + ${lib.optionalString (extraPrefix != null) '' + --addoldprefix=a/${lib.escapeShellArg extraPrefix} \ + --addnewprefix=b/${lib.escapeShellArg extraPrefix} \ + ''} \ + --clean "$out" > "$tmpfile" + + if [ ! -s "$tmpfile" ]; then + echo "error: Normalized patch '$tmpfile' is empty (while the fetched file was not)!" 1>&2 + echo "Did you maybe fetch a HTML representation of a patch instead of a raw patch?" 1>&2 + echo "Fetched file was:" 1>&2 + cat "$out" 1>&2 + exit 1 + fi + + ${patchutils}/bin/filterdiff \ + -p1 \ + ${builtins.toString (builtins.map (x: "-x ${lib.escapeShellArg x}") excludes)} \ + ${builtins.toString (builtins.map (x: "-i ${lib.escapeShellArg x}") includes)} \ + "$tmpfile" > "$out" + + if [ ! -s "$out" ]; then + echo "error: Filtered patch '$out' is empty (while the original patch file was not)!" 1>&2 + echo "Check your includes and excludes." 1>&2 + echo "Normalized patch file was:" 1>&2 + cat "$tmpfile" 1>&2 + exit 1 + fi + '' + lib.optionalString revert '' + ${patchutils}/bin/interdiff "$out" /dev/null > "$tmpfile" + mv "$tmpfile" "$out" + '' + postFetch; +} // builtins.removeAttrs args [ + "relative" "stripLen" "decode" "extraPrefix" "excludes" "includes" "revert" + "postFetch" +]) diff --git a/pkgs/build-support/fetchpatch/tests.nix b/pkgs/build-support/fetchpatch/tests.nix new file mode 100644 index 0000000..0a27f1b --- /dev/null +++ b/pkgs/build-support/fetchpatch/tests.nix @@ -0,0 +1,35 @@ +{ testers, fetchpatch, ... }: + +let + isFetchpatch2 = fetchpatch.version == 2; +in + +{ + simple = testers.invalidateFetcherByDrvHash fetchpatch { + url = "https://github.com/facebook/zstd/pull/2724/commits/e1f85dbca3a0ed5ef06c8396912a0914db8dea6a.patch"; + sha256 = if isFetchpatch2 then "sha256-01BrkHLye4KOdqCw3tv7AJzIF6578pl2fl270TJFTmw=" else "sha256-PuYAqnJWAE+L9bsroOnnBGJhERW8LHrGSLtIEkKU9vg="; + }; + + relative = testers.invalidateFetcherByDrvHash fetchpatch { + url = "https://github.com/boostorg/math/commit/7d482f6ebc356e6ec455ccb5f51a23971bf6ce5b.patch"; + relative = "include"; + sha256 = if isFetchpatch2 then "sha256-1TtmuKeNIl/Yp+sfzBMR8Ue78tPIgjqGgjasa5IN52o=" else "sha256-KlmIbixcds6GyKYt1fx5BxDIrU7msrgDdYo9Va/KJR4="; + }; + + full = testers.invalidateFetcherByDrvHash fetchpatch { + url = "https://github.com/boostorg/math/commit/7d482f6ebc356e6ec455ccb5f51a23971bf6ce5b.patch"; + relative = "test"; + stripLen = 1; + extraPrefix = "foo/bar/"; + excludes = [ "foo/bar/bernoulli_no_atomic_mp.cpp" ]; + revert = true; + sha256 = if isFetchpatch2 then "sha256-+UKmEbr2rIAweCav/hR/7d4ZrYV84ht/domTrHtm8sM=" else "sha256-+UKmEbr2rIAweCav/hR/7d4ZrYV84ht/domTrHtm8sM="; + }; + + decode = testers.invalidateFetcherByDrvHash fetchpatch { + name = "gcc.patch"; + url = "https://chromium.googlesource.com/aosp/platform/external/libchrome/+/f37ae3b1a873d74182a2ac31d96742ead9c1f523^!?format=TEXT"; + decode = "base64 -d"; + sha256 = if isFetchpatch2 then "sha256-oMvPlmzE51ArI+EvFxONXkqmNee39106/O1ikG0Bdso=" else "sha256-SJHk8XrutqAyoIdORlhCpBCN626P+uzed7mjKz5eQYY="; + }; +} diff --git a/pkgs/build-support/fetchpijul/default.nix b/pkgs/build-support/fetchpijul/default.nix new file mode 100644 index 0000000..fd41cfa --- /dev/null +++ b/pkgs/build-support/fetchpijul/default.nix @@ -0,0 +1,59 @@ +{ lib, stdenvNoCC, pijul, cacert }: + +lib.makeOverridable ( +{ url +, hash ? "" +, change ? null +, state ? null +, channel ? "main" +, name ? "fetchpijul" +, # TODO: Changes in pijul are unordered so there's many ways to end up with the same repository state. + # This makes leaveDotPijul unfeasible to implement until pijul CLI implements + # a way of reordering changes to sort them in a consistent and deterministic manner. + # leaveDotPijul ? false +}: +if change != null && state != null then + throw "Only one of 'change' or 'state' can be set" +else + stdenvNoCC.mkDerivation { + inherit name; + nativeBuildInputs = [ pijul cacert ]; + strictDeps = true; + + dontUnpack = true; + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + pijul clone \ + ''${change:+--change "$change"} \ + ''${state:+--state "$state"} \ + --channel "$channel" \ + "$url" \ + "$out" + + runHook postInstall + ''; + + fixupPhase = '' + runHook preFixup + + rm -rf "$out/.pijul" + + runHook postFixup + ''; + + outputHashAlgo = if hash != "" then null else "sha256"; + outputHashMode = "recursive"; + outputHash = if hash != "" then + hash + else + lib.fakeSha256; + + inherit url change state channel; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + } +) diff --git a/pkgs/build-support/fetchpypi/default.nix b/pkgs/build-support/fetchpypi/default.nix new file mode 100644 index 0000000..ebd277c --- /dev/null +++ b/pkgs/build-support/fetchpypi/default.nix @@ -0,0 +1,28 @@ +# `fetchPypi` function for fetching artifacts from PyPI. +{ fetchurl +, makeOverridable +}: + +let + computeUrl = {format ? "setuptools", ... } @attrs: let + computeWheelUrl = {pname, version, dist ? "py2.py3", python ? "py2.py3", abi ? "none", platform ? "any"}: + # Fetch a wheel. By default we fetch an universal wheel. + # See https://www.python.org/dev/peps/pep-0427/#file-name-convention for details regarding the optional arguments. + "https://files.pythonhosted.org/packages/${dist}/${builtins.substring 0 1 pname}/${pname}/${pname}-${version}-${python}-${abi}-${platform}.whl"; + + computeSourceUrl = {pname, version, extension ? "tar.gz"}: + # Fetch a source tarball. + "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${pname}-${version}.${extension}"; + + compute = (if format == "wheel" then computeWheelUrl + else if format == "setuptools" then computeSourceUrl + else throw "Unsupported format ${format}"); + + in compute (builtins.removeAttrs attrs ["format"]); + +in makeOverridable( {format ? "setuptools", sha256 ? "", hash ? "", ... } @attrs: + let + url = computeUrl (builtins.removeAttrs attrs ["sha256" "hash"]) ; + in fetchurl { + inherit url sha256 hash; + }) diff --git a/pkgs/build-support/fetchpypilegacy/default.nix b/pkgs/build-support/fetchpypilegacy/default.nix new file mode 100644 index 0000000..bcd5604 --- /dev/null +++ b/pkgs/build-support/fetchpypilegacy/default.nix @@ -0,0 +1,45 @@ +# Fetch from PyPi legacy API as documented in https://warehouse.pypa.io/api-reference/legacy.html +{ runCommand +, lib +, python3 +}: +{ + # package name + pname, + # Package index + url ? null, + # Multiple package indices to consider + urls ? [ ], + # filename including extension + file, + # SRI hash + hash, + # allow overriding the derivation name + name ? null, +}: +let + urls' = urls ++ lib.optional (url != null) url; + + pathParts = lib.filter ({ prefix, path }: "NETRC" == prefix) builtins.nixPath; + netrc_file = + if (pathParts != [ ]) + then (lib.head pathParts).path + else ""; + +in +# Assert that we have at least one URL +assert urls' != [ ]; runCommand file + ({ + nativeBuildInputs = [ python3 ]; + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + outputHashMode = "flat"; + # if hash is empty select a default algo to let nix propose the actual hash. + outputHashAlgo = if hash == "" then "sha256" else null; + outputHash = hash; + NETRC = netrc_file; + } + // (lib.optionalAttrs (name != null) {inherit name;})) + '' + python ${./fetch-legacy.py} ${lib.concatStringsSep " " (map (url: "--url ${lib.escapeShellArg url}") urls')} --pname ${pname} --filename ${file} + mv ${file} $out + '' diff --git a/pkgs/build-support/fetchpypilegacy/fetch-legacy.py b/pkgs/build-support/fetchpypilegacy/fetch-legacy.py new file mode 100644 index 0000000..e031f24 --- /dev/null +++ b/pkgs/build-support/fetchpypilegacy/fetch-legacy.py @@ -0,0 +1,162 @@ +# Some repositories (such as Devpi) expose the Pypi legacy API +# (https://warehouse.pypa.io/api-reference/legacy.html). +# +# Note it is not possible to use pip +# https://discuss.python.org/t/pip-download-just-the-source-packages-no-building-no-metadata-etc/4651/12 + +import base64 +import argparse +import netrc +import os +import shutil +import ssl +import sys +import urllib.request +from html.parser import HTMLParser +from os.path import normpath +from typing import Optional +from urllib.parse import urlparse, urlunparse + + +# Parse the legacy index page to extract the href and package names +class Pep503(HTMLParser): + def __init__(self) -> None: + super().__init__() + self.sources: dict[str, str] = {} + self.url: Optional[str] = None + self.name: Optional[str] = None + + def handle_data(self, data: str) -> None: + if self.url is not None: + self.name = data + + def handle_starttag(self, tag: str, attrs: list[tuple[str, Optional[str]]]) -> None: + if tag == "a": + for name, value in attrs: + if name == "href": + self.url = value + + def handle_endtag(self, tag: str) -> None: + if self.url is not None: + if not self.name: + raise ValueError("Name not set") + + self.sources[self.name] = self.url + self.url = None + + +def try_fetch(url: str, package_name: str, package_filename: str) -> None: + index_url = url + "/" + package_name + "/" + + # Parse username and password for this host from the netrc file if given. + username: Optional[str] = None + password: Optional[str] = None + if os.environ.get("NETRC", "") != "": + netrc_obj = netrc.netrc(os.environ["NETRC"]) + host = urlparse(index_url).netloc + # Strip port number if present + if ":" in host: + host = host.split(":")[0] + authenticators = netrc_obj.authenticators(host) + if authenticators: + username, _, password = authenticators + + print("Reading index %s" % index_url) + + context = ssl.create_default_context() + + # Extract out username/password from index_url, if present. + parsed_url = urlparse(index_url) + username = parsed_url.username or username + password = parsed_url.password or password + index_url = parsed_url._replace(netloc=parsed_url.netloc.rpartition("@")[-1]).geturl() + + req = urllib.request.Request(index_url) + + if username and password: # Add authentication + password_b64 = base64.b64encode(":".join((username, password)).encode()).decode("utf-8") + req.add_header("Authorization", "Basic {}".format(password_b64)) + else: # If we are not using authentication disable TLS verification for long term reproducibility + context.check_hostname = False + context.verify_mode = ssl.CERT_NONE + + response = urllib.request.urlopen(req, context=context) + index = response.read() + + parser = Pep503() + parser.feed(str(index, "utf-8")) + if package_filename not in parser.sources: + print("The file %s has not be found in the index %s" % (package_filename, index_url)) + exit(1) + + package_file = open(package_filename, "wb") + # Sometimes the href is a relative or absolute path within the index's domain. + indicated_url = urlparse(parser.sources[package_filename]) + if indicated_url.netloc == "": + parsed_url = urlparse(index_url) + + if indicated_url.path.startswith("/"): + # An absolute path within the index's domain. + path = parser.sources[package_filename] + else: + # A relative path. + path = parsed_url.path + "/" + parser.sources[package_filename] + + package_url = urlunparse( + ( + parsed_url.scheme, + parsed_url.netloc, + path, + None, + None, + None, + ) + ) + else: + package_url = parser.sources[package_filename] + + # Handle urls containing "../" + parsed_url = urlparse(package_url) + real_package_url = urlunparse( + ( + parsed_url.scheme, + parsed_url.netloc, + normpath(parsed_url.path), + parsed_url.params, + parsed_url.query, + parsed_url.fragment, + ) + ) + print("Downloading %s" % real_package_url) + + req = urllib.request.Request(real_package_url) + if username and password: + req.add_unredirected_header("Authorization", "Basic {}".format(password_b64)) + response = urllib.request.urlopen(req, context=context) + + with response as r: + shutil.copyfileobj(r, package_file) + + +argparser = argparse.ArgumentParser(description="Fetch file from legacy pypi API") +argparser.add_argument("--url", action="append", required=True) +argparser.add_argument("--pname", action="store", required=True) +argparser.add_argument("--filename", action="store", required=True) + + +if __name__ == "__main__": + args = argparser.parse_args() + for url in args.url: + try: + try_fetch(url, args.pname, args.filename) + except urllib.error.HTTPError as e: + print("Got exception'", e, "', trying next package index", file=sys.stderr) + continue + else: + break + else: + print( + f"Could not fetch package '{args.pname}' file '{args.filename}' from any mirrors: {args.url}", + file=sys.stderr, + ) + exit(1) diff --git a/pkgs/build-support/fetchpypilegacy/tests.nix b/pkgs/build-support/fetchpypilegacy/tests.nix new file mode 100644 index 0000000..b16325b --- /dev/null +++ b/pkgs/build-support/fetchpypilegacy/tests.nix @@ -0,0 +1,9 @@ +{ testers, fetchPypiLegacy, ... }: { + # Tests that we can send custom headers with spaces in them + fetchSimple = testers.invalidateFetcherByDrvHash fetchPypiLegacy { + pname = "requests"; + file = "requests-2.31.0.tar.gz"; + url = "https://pypi.org/simple"; + hash = "sha256-lCxadY+Y15Dq7Ropy27vx/+w0c968Fw9J5Flbb1q0eE="; + }; +} diff --git a/pkgs/build-support/fetchrepoorcz/default.nix b/pkgs/build-support/fetchrepoorcz/default.nix new file mode 100644 index 0000000..3ac7cac --- /dev/null +++ b/pkgs/build-support/fetchrepoorcz/default.nix @@ -0,0 +1,10 @@ +{ fetchzip }: + +# gitweb example, snapshot support is optional in gitweb +{ repo, rev, name ? "source" +, ... # For hash agility +}@args: fetchzip ({ + inherit name; + url = "https://repo.or.cz/${repo}.git/snapshot/${rev}.tar.gz"; + meta.homepage = "https://repo.or.cz/${repo}.git/"; +} // removeAttrs args [ "repo" "rev" ]) // { inherit rev; } diff --git a/pkgs/build-support/fetchrepoproject/default.nix b/pkgs/build-support/fetchrepoproject/default.nix new file mode 100644 index 0000000..a5e79c8 --- /dev/null +++ b/pkgs/build-support/fetchrepoproject/default.nix @@ -0,0 +1,83 @@ +{ lib, stdenvNoCC, gitRepo, cacert, copyPathsToStore }: + +{ name, manifest, rev ? "HEAD", sha256 +# Optional parameters: +, repoRepoURL ? "", repoRepoRev ? "", referenceDir ? "", manifestName ? "" +, localManifests ? [], createMirror ? false, useArchive ? false +}: + +assert repoRepoRev != "" -> repoRepoURL != ""; +assert createMirror -> !useArchive; + +let + inherit (lib) + concatMapStringsSep + concatStringsSep + fetchers + optionalString + ; + + extraRepoInitFlags = [ + (optionalString (repoRepoURL != "") "--repo-url=${repoRepoURL}") + (optionalString (repoRepoRev != "") "--repo-branch=${repoRepoRev}") + (optionalString (referenceDir != "") "--reference=${referenceDir}") + (optionalString (manifestName != "") "--manifest-name=${manifestName}") + ]; + + repoInitFlags = [ + "--manifest-url=${manifest}" + "--manifest-branch=${rev}" + "--depth=1" + (optionalString createMirror "--mirror") + (optionalString useArchive "--archive") + ] ++ extraRepoInitFlags; + + local_manifests = copyPathsToStore localManifests; + +in stdenvNoCC.mkDerivation { + inherit name; + + inherit cacert manifest rev repoRepoURL repoRepoRev referenceDir; # TODO + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + preferLocalBuild = true; + enableParallelBuilding = true; + + impureEnvVars = fetchers.proxyImpureEnvVars ++ [ + "GIT_PROXY_COMMAND" "SOCKS_SERVER" + ]; + + nativeBuildInputs = [ gitRepo cacert ]; + + GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + buildCommand = '' + # Path must be absolute (e.g. for GnuPG: ~/.repoconfig/gnupg/pubring.kbx) + export HOME="$(pwd)" + + mkdir $out + cd $out + + mkdir .repo + ${optionalString (local_manifests != []) '' + mkdir .repo/local_manifests + for local_manifest in ${concatMapStringsSep " " toString local_manifests}; do + cp $local_manifest .repo/local_manifests/$(stripHash $local_manifest) + done + ''} + + repo init ${concatStringsSep " " repoInitFlags} + repo sync --jobs=$NIX_BUILD_CORES --current-branch + + # TODO: The git-index files (and probably the files in .repo as well) have + # different contents each time and will therefore change the final hash + # (i.e. creating a mirror probably won't work). + ${optionalString (!createMirror) '' + rm -rf .repo + find -type d -name '.git' -prune -exec rm -rf {} + + ''} + ''; +} diff --git a/pkgs/build-support/fetchs3/default.nix b/pkgs/build-support/fetchs3/default.nix new file mode 100644 index 0000000..acad074 --- /dev/null +++ b/pkgs/build-support/fetchs3/default.nix @@ -0,0 +1,36 @@ +{ lib, runCommand, awscli }: + +{ s3url +, name ? builtins.baseNameOf s3url +, sha256 +, region ? "us-east-1" +, credentials ? null # Default to looking at local EC2 metadata service +, recursiveHash ? false +, postFetch ? null +}: + +let + mkCredentials = { access_key_id, secret_access_key, session_token ? null }: { + AWS_ACCESS_KEY_ID = access_key_id; + AWS_SECRET_ACCESS_KEY = secret_access_key; + AWS_SESSION_TOKEN = session_token; + }; + + credentialAttrs = lib.optionalAttrs (credentials != null) (mkCredentials credentials); +in runCommand name ({ + nativeBuildInputs = [ awscli ]; + + outputHashAlgo = "sha256"; + outputHash = sha256; + outputHashMode = if recursiveHash then "recursive" else "flat"; + + preferLocalBuild = true; + + AWS_DEFAULT_REGION = region; +} // credentialAttrs) (if postFetch != null then '' + downloadedFile="$(mktemp)" + aws s3 cp ${s3url} $downloadedFile + ${postFetch} +'' else '' + aws s3 cp ${s3url} $out +'') diff --git a/pkgs/build-support/fetchsavannah/default.nix b/pkgs/build-support/fetchsavannah/default.nix new file mode 100644 index 0000000..e75e25f --- /dev/null +++ b/pkgs/build-support/fetchsavannah/default.nix @@ -0,0 +1,12 @@ +{ fetchzip, lib }: + +lib.makeOverridable ( +# cgit example, snapshot support is optional in cgit +{ repo, rev, name ? "source" +, ... # For hash agility +}@args: fetchzip ({ + inherit name; + url = "https://git.savannah.gnu.org/cgit/${repo}.git/snapshot/${repo}-${rev}.tar.gz"; + meta.homepage = "https://git.savannah.gnu.org/cgit/${repo}.git/"; +} // removeAttrs args [ "repo" "rev" ]) // { inherit rev; } +) diff --git a/pkgs/build-support/fetchsourcehut/default.nix b/pkgs/build-support/fetchsourcehut/default.nix new file mode 100644 index 0000000..42d437b --- /dev/null +++ b/pkgs/build-support/fetchsourcehut/default.nix @@ -0,0 +1,62 @@ +{ fetchgit, fetchhg, fetchzip, lib }: + +let + inherit (lib) + assertOneOf + makeOverridable + optionalString + ; +in + +makeOverridable ( +{ owner +, repo, rev +, domain ? "sr.ht" +, vc ? "git" +, name ? "source" +, fetchSubmodules ? false +, ... # For hash agility +} @ args: + +assert (assertOneOf "vc" vc [ "hg" "git" ]); + +let + urlFor = resource: "https://${resource}.${domain}/${owner}/${repo}"; + baseUrl = urlFor vc; + baseArgs = { + inherit name; + } // removeAttrs args [ + "owner" "repo" "rev" "domain" "vc" "name" "fetchSubmodules" + ]; + vcArgs = baseArgs // { + inherit rev; + url = baseUrl; + }; + fetcher = if fetchSubmodules then vc else "zip"; + cases = { + git = { + fetch = fetchgit; + arguments = vcArgs // { fetchSubmodules = true; }; + }; + hg = { + fetch = fetchhg; + arguments = vcArgs // { fetchSubrepos = true; }; + }; + zip = { + fetch = fetchzip; + arguments = baseArgs // { + url = "${baseUrl}/archive/${rev}.tar.gz"; + postFetch = optionalString (vc == "hg") '' + rm -f "$out/.hg_archival.txt" + ''; # impure file; see #12002 + passthru = { + gitRepoUrl = urlFor "git"; + }; + }; + }; + }; +in cases.${fetcher}.fetch cases.${fetcher}.arguments // { + inherit rev; + meta.homepage = "${baseUrl}"; +} +) diff --git a/pkgs/build-support/fetchsvn/builder.sh b/pkgs/build-support/fetchsvn/builder.sh new file mode 100644 index 0000000..e187747 --- /dev/null +++ b/pkgs/build-support/fetchsvn/builder.sh @@ -0,0 +1,24 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +echo "exporting $url (r$rev) into $out" + +if test -n "$http_proxy"; then + # Configure proxy + mkdir .subversion + proxy="${http_proxy#*://}" + + echo '[global]' > .subversion/servers + echo "http-proxy-host = ${proxy%:*}" >> .subversion/servers + echo "http-proxy-port = ${proxy##*:}" >> .subversion/servers + + export HOME="$PWD" +fi; + +if test -z "$LC_ALL"; then + export LC_ALL="en_US.UTF-8" +fi; + +svn export --trust-server-cert --non-interactive \ + ${ignoreExternals:+--ignore-externals} ${ignoreKeywords:+--ignore-keywords} \ + -r "$rev" "$url" "$out" diff --git a/pkgs/build-support/fetchsvn/default.nix b/pkgs/build-support/fetchsvn/default.nix new file mode 100644 index 0000000..41752eb --- /dev/null +++ b/pkgs/build-support/fetchsvn/default.nix @@ -0,0 +1,59 @@ +{ lib, stdenvNoCC, buildPackages +, subversion, glibcLocales, sshSupport ? true, openssh ? null +}: + +{ url, rev ? "HEAD", sha256 ? "", hash ? "" +, ignoreExternals ? false, ignoreKeywords ? false, name ? null +, preferLocalBuild ? true +}: + +assert sshSupport -> openssh != null; + +let + repoName = with lib; + let + fst = head; + snd = l: head (tail l); + trd = l: head (tail (tail l)); + path_ = + (p: if head p == "" then tail p else p) # ~ drop final slash if any + (reverseList (splitString "/" url)); + path = [ (removeSuffix "/" (head path_)) ] ++ (tail path_); + in + # ../repo/trunk -> repo + if fst path == "trunk" then snd path + # ../repo/branches/branch -> repo-branch + else if snd path == "branches" then "${trd path}-${fst path}" + # ../repo/tags/tag -> repo-tag + else if snd path == "tags" then "${trd path}-${fst path}" + # ../repo (no trunk) -> repo + else fst path; + + name_ = if name == null then "${repoName}-r${toString rev}" else name; +in + +if hash != "" && sha256 != "" then + throw "Only one of sha256 or hash can be set" +else +stdenvNoCC.mkDerivation { + name = name_; + builder = ./builder.sh; + nativeBuildInputs = [ subversion glibcLocales ] + ++ lib.optional sshSupport openssh; + + SVN_SSH = if sshSupport then "${buildPackages.openssh}/bin/ssh" else null; + + outputHashAlgo = if hash != "" then null else "sha256"; + outputHashMode = "recursive"; + outputHash = if hash != "" then + hash + else if sha256 != "" then + sha256 + else + lib.fakeSha256; + + inherit url rev ignoreExternals ignoreKeywords; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + inherit preferLocalBuild; +} diff --git a/pkgs/build-support/fetchsvn/nix-prefetch-svn b/pkgs/build-support/fetchsvn/nix-prefetch-svn new file mode 100755 index 0000000..03b9eb9 --- /dev/null +++ b/pkgs/build-support/fetchsvn/nix-prefetch-svn @@ -0,0 +1,79 @@ +#! /bin/sh -e + +url=$1 +rev=$2 +expHash=$3 + +hashType=$NIX_HASH_ALGO +if test -z "$hashType"; then + hashType=sha256 +fi +if test -z "$hashFormat"; then + hashFormat=--base32 +fi + +if test -z "$url"; then + echo "syntax: nix-prefetch-svn URL [REVISION [EXPECTED-HASH]]" >&2 + exit 1 +fi + +test -n "$rev" || rev="HEAD" + +repoName=$(echo $url | sed ' + s,.*/\([^/]\+\)/trunk/*$,\1,;t + s,.*/\([^/]\+\)/branches/\([^/]\+\)/*$,\1-\2,;t + s,.*/\([^/]\+\)/tags/\([^/]\+\)/*$,\1-\2,;t + s,.*/\([^/]\+\)/*$,\1,;t +') +dstFile=$repoName-r$rev + +# If the hash was given, a file with that hash may already be in the +# store. +if test -n "$expHash"; then + finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" $dstFile) + if ! nix-store --check-validity "$finalPath" 2> /dev/null; then + finalPath= + fi + hash=$expHash +fi + + +# If we don't know the hash or a path with that hash doesn't exist, +# download the file and add it to the store. +if test -z "$finalPath"; then + tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/svn-checkout-tmp-XXXXXXXX")" + trap "rm -rf \"$tmpPath\"" EXIT + + tmpFile="$tmpPath/$dstFile" + + # Perform the checkout. + if test "$NIX_PREFETCH_SVN_LEAVE_DOT_SVN" != 1 + then + command="export" + else + command="checkout" + fi + + echo p | svn "$command" --quiet -r "$rev" "$url" "$tmpFile" >&2 + echo "svn revision is $(svn info -r "$rev" "$url" | grep "Revision: " | cut -d' ' -f2)" + + # Compute the hash. + hash=$(nix-hash --type $hashType $hashFormat $tmpFile) + if ! test -n "$QUIET"; then echo "hash is $hash" >&2; fi + + # Add the downloaded file to the Nix store. + finalPath=$(nix-store --add-fixed --recursive "$hashType" $tmpFile) + + if test -n "$expHash" -a "$expHash" != "$hash"; then + echo "hash mismatch for URL \`$url'" + exit 1 + fi +fi + +if ! test -n "$QUIET"; then echo "path is $finalPath" >&2; fi + +echo $hash + +if test -n "$PRINT_PATH"; then + echo $finalPath +fi diff --git a/pkgs/build-support/fetchsvnrevision/default.nix b/pkgs/build-support/fetchsvnrevision/default.nix new file mode 100644 index 0000000..f2e2a11 --- /dev/null +++ b/pkgs/build-support/fetchsvnrevision/default.nix @@ -0,0 +1,10 @@ +runCommand: subversion: repository: + import (runCommand "head-revision" + { buildInputs = [ subversion ]; + dummy = builtins.currentTime; + } + '' + rev=$(echo p | svn ls -v --depth empty ${repository} |awk '{ print $1 }') + echo "[ \"$rev\" ]" > $out + echo Latest revision is $rev + '') diff --git a/pkgs/build-support/fetchsvnssh/builder.sh b/pkgs/build-support/fetchsvnssh/builder.sh new file mode 100644 index 0000000..e553446 --- /dev/null +++ b/pkgs/build-support/fetchsvnssh/builder.sh @@ -0,0 +1,14 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +echo "exporting $url (r$rev) into $out" + +if test "$sshSupport"; then + export SVN_SSH="$openssh/bin/ssh" +fi + +# Pipe the "p" character into Subversion to force it to accept the +# server's certificate. This is perfectly safe: we don't care +# whether the server is being spoofed --- only the cryptographic +# hash of the output matters. +expect -f $sshSubversion "$username" "$password" "$rev" "$url" $out diff --git a/pkgs/build-support/fetchsvnssh/default.nix b/pkgs/build-support/fetchsvnssh/default.nix new file mode 100644 index 0000000..ef72de6 --- /dev/null +++ b/pkgs/build-support/fetchsvnssh/default.nix @@ -0,0 +1,17 @@ +{stdenvNoCC, subversion, sshSupport ? true, openssh ? null, expect}: +{username, password, url, rev ? "HEAD", sha256 ? ""}: + + +stdenvNoCC.mkDerivation { + name = "svn-export-ssh"; + builder = ./builder.sh; + nativeBuildInputs = [subversion expect]; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; + + sshSubversion = ./sshsubversion.exp; + + inherit username password url rev sshSupport openssh; +} diff --git a/pkgs/build-support/fetchsvnssh/sshsubversion.exp b/pkgs/build-support/fetchsvnssh/sshsubversion.exp new file mode 100755 index 0000000..c00f397 --- /dev/null +++ b/pkgs/build-support/fetchsvnssh/sshsubversion.exp @@ -0,0 +1,22 @@ +#!/nix/var/nix/profiles/default/bin/expect -f + +# Set variables +set username [lindex $argv 0] +set password [lindex $argv 1] +set rev [lindex $argv 2] +set url [lindex $argv 3] +set out [lindex $argv 4] +set timeout -1 + +spawn svn export -r$rev svn+ssh://$username@$url $out +match_max 100000 + +expect "*continue connecting*" { send -- "yes\r"; expect "*?assword:*"; send -- "$password\r" } \ + "*?assword:*" { send -- "$password\r" } + +expect "*?assword:*" +send -- "$password\r" + +# Send blank line +send -- "\r" +expect eof diff --git a/pkgs/build-support/fetchtorrent/default.nix b/pkgs/build-support/fetchtorrent/default.nix new file mode 100644 index 0000000..1267486 --- /dev/null +++ b/pkgs/build-support/fetchtorrent/default.nix @@ -0,0 +1,62 @@ +{ lib, runCommand, transmission_noSystemd, rqbit, writeShellScript, formats, cacert, rsync }: +let + urlRegexp = ''.*xt=urn:bt[im]h:([^&]{64}|[^&]{40}).*''; +in +{ url +, name ? + if (builtins.match urlRegexp url) == null then + "bittorrent" + else + "bittorrent-" + builtins.head (builtins.match urlRegexp url) +, config ? if (backend == "transmission") then { } else throw "json config for configuring fetchFromBitorrent only works with the transmission backend" +, hash +, backend ? "transmission" +, recursiveHash ? true +, postFetch ? "" +, postUnpack ? "" +, meta ? {} +}: +let + afterSuccess = writeShellScript "fetch-bittorrent-done.sh" '' + ${postUnpack} + # Flatten the directory, so that only the torrent contents are in $out, not + # the folder name + shopt -s dotglob + mv -v $downloadedDirectory/*/* $out + rm -v -rf $downloadedDirectory + unset downloadedDirectory + ${postFetch} + kill $PPID + ''; + jsonConfig = (formats.json {}).generate "jsonConfig" config; +in +runCommand name { + inherit meta; + nativeBuildInputs = [ cacert ] ++ (if (backend == "transmission" ) then [ transmission_noSystemd ] else if (backend == "rqbit") then [ rqbit ] else throw "rqbit or transmission are the only available backends for fetchtorrent"); + outputHashAlgo = if hash != "" then null else "sha256"; + outputHash = hash; + outputHashMode = if recursiveHash then "recursive" else "flat"; + + # url will be written to the derivation, meaning it can be parsed and utilized + # by external tools, such as tools that may want to seed fetchtorrent calls + # in nixpkgs + inherit url; +} +(if (backend == "transmission") then '' + export HOME=$TMP + export downloadedDirectory=$out/downloadedDirectory + mkdir -p $downloadedDirectory + mkdir -p $HOME/.config/transmission + cp ${jsonConfig} $HOME/.config/transmission/settings.json + function handleChild { + # This detects failures and logs the contents of the transmission fetch + find $out + exit 0 + } + trap handleChild CHLD + transmission-cli --port $(shuf -n 1 -i 49152-65535) --portmap --finish ${afterSuccess} --download-dir $downloadedDirectory --config-dir "$HOME"/.config/transmission "$url" +'' else +'' + export HOME=$TMP + rqbit --disable-dht-persistence --http-api-listen-addr "127.0.0.1:$(shuf -n 1 -i 49152-65535)" download -o $out --exit-on-finish "$url" +'') diff --git a/pkgs/build-support/fetchtorrent/tests.nix b/pkgs/build-support/fetchtorrent/tests.nix new file mode 100644 index 0000000..e8cc3f3 --- /dev/null +++ b/pkgs/build-support/fetchtorrent/tests.nix @@ -0,0 +1,47 @@ +{ testers, fetchtorrent, lib, ... }: + +let + wired-cd.meta.license = [ + # track 1, 4 and 11 + { + spdxID = "CC NC-SAMPLING+ 1.0 Deed"; + fullName = "NonCommercial Sampling Plus 1.0 Generic"; + url = "https://creativecommons.org/licenses/nc-sampling+/1.0/"; + free = false; # for noncommercial purposes only + } + # the rest + { + spdxID = "CC SAMPLING+ 1.0 Deed"; + fullName = "Sampling Plus 1.0 Generic"; + url = "https://creativecommons.org/licenses/sampling+/1.0/"; + free = true; # no use in advertisement + } + ]; +in + +{ + http-link = testers.invalidateFetcherByDrvHash fetchtorrent { + url = "https://webtorrent.io/torrents/wired-cd.torrent"; + hash = "sha256-OCsC22WuanqoN6lPv5wDT5ZxPcEHDpZ1EgXGvz1SDYo="; + backend = "transmission"; + inherit (wired-cd) meta; + }; + magnet-link = testers.invalidateFetcherByDrvHash fetchtorrent { + url = "magnet:?xt=urn:btih:a88fda5954e89178c372716a6a78b8180ed4dad3&dn=The+WIRED+CD+-+Rip.+Sample.+Mash.+Share&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fwired-cd.torrent"; + hash = "sha256-OCsC22WuanqoN6lPv5wDT5ZxPcEHDpZ1EgXGvz1SDYo="; + backend = "transmission"; + inherit (wired-cd) meta; + }; + http-link-rqbit = testers.invalidateFetcherByDrvHash fetchtorrent { + url = "https://webtorrent.io/torrents/wired-cd.torrent"; + hash = "sha256-OCsC22WuanqoN6lPv5wDT5ZxPcEHDpZ1EgXGvz1SDYo="; + backend = "rqbit"; + inherit (wired-cd) meta; + }; + magnet-link-rqbit = testers.invalidateFetcherByDrvHash fetchtorrent { + url = "magnet:?xt=urn:btih:a88fda5954e89178c372716a6a78b8180ed4dad3&dn=The+WIRED+CD+-+Rip.+Sample.+Mash.+Share&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fwired-cd.torrent"; + hash = "sha256-OCsC22WuanqoN6lPv5wDT5ZxPcEHDpZ1EgXGvz1SDYo="; + backend = "rqbit"; + inherit (wired-cd) meta; + }; +} diff --git a/pkgs/build-support/fetchurl/boot.nix b/pkgs/build-support/fetchurl/boot.nix new file mode 100644 index 0000000..8f8c78b --- /dev/null +++ b/pkgs/build-support/fetchurl/boot.nix @@ -0,0 +1,25 @@ +let mirrors = import ./mirrors.nix; in + +{ system }: + +{ url ? builtins.head urls +, urls ? [] +, sha256 ? "" +, hash ? "" +, name ? baseNameOf (toString url) +}: + +# assert exactly one hash is set +assert hash != "" || sha256 != ""; +assert hash != "" -> sha256 == ""; + +import { + inherit system hash sha256 name; + + url = + # Handle mirror:// URIs. Since currently + # supports only one URI, use the first listed mirror. + let m = builtins.match "mirror://([a-z]+)/(.*)" url; in + if m == null then url + else builtins.head (mirrors.${builtins.elemAt m 0}) + (builtins.elemAt m 1); +} diff --git a/pkgs/build-support/fetchurl/builder.sh b/pkgs/build-support/fetchurl/builder.sh new file mode 100644 index 0000000..a82728e --- /dev/null +++ b/pkgs/build-support/fetchurl/builder.sh @@ -0,0 +1,173 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +source $mirrorsFile + +curlVersion=$(curl -V | head -1 | cut -d' ' -f2) + +# Curl flags to handle redirects, not use EPSV, handle cookies for +# servers to need them during redirects, and work on SSL without a +# certificate (this isn't a security problem because we check the +# cryptographic hash of the output anyway). +curl=( + curl + --location + --max-redirs 20 + --retry 3 + --disable-epsv + --cookie-jar cookies + --user-agent "curl/$curlVersion Nixpkgs/$nixpkgsVersion" +) + +if ! [ -f "$SSL_CERT_FILE" ]; then + curl+=(--insecure) +fi + +eval "curl+=($curlOptsList)" + +curl+=( + $curlOpts + $NIX_CURL_FLAGS +) + +downloadedFile="$out" +if [ -n "$downloadToTemp" ]; then downloadedFile="$TMPDIR/file"; fi + + +tryDownload() { + local url="$1" + echo + echo "trying $url" + local curlexit=18; + + success= + + # if we get error code 18, resume partial download + while [ $curlexit -eq 18 ]; do + # keep this inside an if statement, since on failure it doesn't abort the script + if "${curl[@]}" -C - --fail "$url" --output "$downloadedFile"; then + success=1 + break + else + curlexit=$?; + fi + done +} + + +finish() { + local skipPostFetch="$1" + + set +o noglob + + if [[ $executable == "1" ]]; then + chmod +x $downloadedFile + fi + + if [ -z "$skipPostFetch" ]; then + runHook postFetch + fi + + exit 0 +} + + +tryHashedMirrors() { + if test -n "$NIX_HASHED_MIRRORS"; then + hashedMirrors="$NIX_HASHED_MIRRORS" + fi + + for mirror in $hashedMirrors; do + url="$mirror/$outputHashAlgo/$outputHash" + if "${curl[@]}" --retry 0 --connect-timeout "${NIX_CONNECT_TIMEOUT:-15}" \ + --fail --silent --show-error --head "$url" \ + --write-out "%{http_code}" --output /dev/null > code 2> log; then + tryDownload "$url" + + # We skip postFetch here, because hashed-mirrors are + # already content addressed. So if $outputHash is in the + # hashed-mirror, changes from ‘postFetch’ would already be + # made. So, running postFetch will end up applying the + # change /again/, which we don’t want. + if test -n "$success"; then finish skipPostFetch; fi + else + # Be quiet about 404 errors, which we interpret as the file + # not being present on this particular mirror. + if test "$(cat code)" != 404; then + echo "error checking the existence of $url:" + cat log + fi + fi + done +} + + +# URL list may contain ?. No glob expansion for that, please +set -o noglob + +urls2= +for url in $urls; do + if test "${url:0:9}" != "mirror://"; then + urls2="$urls2 $url" + else + url2="${url:9}"; echo "${url2/\// }" > split; read site fileName < split + #varName="mirror_$site" + varName="$site" # !!! danger of name clash, fix this + if test -z "${!varName}"; then + echo "warning: unknown mirror:// site \`$site'" + else + mirrors=${!varName} + + # Allow command-line override by setting NIX_MIRRORS_$site. + varName="NIX_MIRRORS_$site" + if test -n "${!varName}"; then mirrors="${!varName}"; fi + + for url3 in $mirrors; do + urls2="$urls2 $url3$fileName"; + done + fi + fi +done +urls="$urls2" + +# Restore globbing settings +set +o noglob + +if test -n "$showURLs"; then + echo "$urls" > $out + exit 0 +fi + +if test -n "$preferHashedMirrors"; then + tryHashedMirrors +fi + +# URL list may contain ?. No glob expansion for that, please +set -o noglob + +success= +for url in $urls; do + if [ -z "$postFetch" ]; then + case "$url" in + https://github.com/*/archive/*) + echo "warning: archives from GitHub revisions should use fetchFromGitHub" + ;; + https://gitlab.com/*/-/archive/*) + echo "warning: archives from GitLab revisions should use fetchFromGitLab" + ;; + esac + fi + tryDownload "$url" + if test -n "$success"; then finish; fi +done + +# Restore globbing settings +set +o noglob + +if test -z "$preferHashedMirrors"; then + tryHashedMirrors +fi + + +echo "error: cannot download $name from any mirror" +exit 1 diff --git a/pkgs/build-support/fetchurl/default.nix b/pkgs/build-support/fetchurl/default.nix new file mode 100644 index 0000000..a9c2c7c --- /dev/null +++ b/pkgs/build-support/fetchurl/default.nix @@ -0,0 +1,190 @@ +{ lib, buildPackages ? { inherit stdenvNoCC; }, stdenvNoCC +, curl # Note that `curl' may be `null', in case of the native stdenvNoCC. +, cacert ? null }: + +let + + mirrors = import ./mirrors.nix; + + # Write the list of mirrors to a file that we can reuse between + # fetchurl instantiations, instead of passing the mirrors to + # fetchurl instantiations via environment variables. This makes the + # resulting store derivations (.drv files) much smaller, which in + # turn makes nix-env/nix-instantiate faster. + mirrorsFile = + buildPackages.stdenvNoCC.mkDerivation ({ + name = "mirrors-list"; + strictDeps = true; + builder = ./write-mirror-list.sh; + preferLocalBuild = true; + } // mirrors); + + # Names of the master sites that are mirrored (i.e., "sourceforge", + # "gnu", etc.). + sites = builtins.attrNames mirrors; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ + # This variable allows the user to pass additional options to curl + "NIX_CURL_FLAGS" + + # This variable allows the user to override hashedMirrors from the + # command-line. + "NIX_HASHED_MIRRORS" + + # This variable allows overriding the timeout for connecting to + # the hashed mirrors. + "NIX_CONNECT_TIMEOUT" + ] ++ (map (site: "NIX_MIRRORS_${site}") sites); + +in + +{ # URL to fetch. + url ? "" + +, # Alternatively, a list of URLs specifying alternative download + # locations. They are tried in order. + urls ? [] + +, # Additional curl options needed for the download to succeed. + # Warning: Each space (no matter the escaping) will start a new argument. + # If you wish to pass arguments with spaces, use `curlOptsList` + curlOpts ? "" + +, # Additional curl options needed for the download to succeed. + curlOptsList ? [] + +, # Name of the file. If empty, use the basename of `url' (or of the + # first element of `urls'). + name ? "" + + # for versioned downloads optionally take pname + version. +, pname ? "" +, version ? "" + +, # SRI hash. + hash ? "" + +, # Legacy ways of specifying the hash. + outputHash ? "" +, outputHashAlgo ? "" +, sha1 ? "" +, sha256 ? "" +, sha512 ? "" + +, recursiveHash ? false + +, # Shell code to build a netrc file for BASIC auth + netrcPhase ? null + +, # Impure env vars (https://nixos.org/nix/manual/#sec-advanced-attributes) + # needed for netrcPhase + netrcImpureEnvVars ? [] + +, # Shell code executed after the file has been fetched + # successfully. This can do things like check or transform the file. + postFetch ? "" + +, # Whether to download to a temporary path rather than $out. Useful + # in conjunction with postFetch. The location of the temporary file + # is communicated to postFetch via $downloadedFile. + downloadToTemp ? false + +, # If true, set executable bit on downloaded file + executable ? false + +, # If set, don't download the file, but write a list of all possible + # URLs (resulting from resolving mirror:// URLs) to $out. + showURLs ? false + +, # Meta information, if any. + meta ? {} + + # Passthru information, if any. +, passthru ? {} + # Doing the download on a remote machine just duplicates network + # traffic, so don't do that by default +, preferLocalBuild ? true + + # Additional packages needed as part of a fetch +, nativeBuildInputs ? [ ] +}: + +let + urls_ = + if urls != [] && url == "" then + (if lib.isList urls then urls + else throw "`urls` is not a list") + else if urls == [] && url != "" then + (if lib.isString url then [url] + else throw "`url` is not a string") + else throw "fetchurl requires either `url` or `urls` to be set"; + + hash_ = + if with lib.lists; length (filter (s: s != "") [ hash outputHash sha1 sha256 sha512 ]) > 1 + then throw "multiple hashes passed to fetchurl" else + + if hash != "" then { outputHashAlgo = null; outputHash = hash; } + else if outputHash != "" then + if outputHashAlgo != "" then { inherit outputHashAlgo outputHash; } + else throw "fetchurl was passed outputHash without outputHashAlgo" + else if sha512 != "" then { outputHashAlgo = "sha512"; outputHash = sha512; } + else if sha256 != "" then { outputHashAlgo = "sha256"; outputHash = sha256; } + else if sha1 != "" then { outputHashAlgo = "sha1"; outputHash = sha1; } + else if cacert != null then { outputHashAlgo = "sha256"; outputHash = ""; } + else throw "fetchurl requires a hash for fixed-output derivation: ${lib.concatStringsSep ", " urls_}"; +in + +assert (lib.isList curlOpts) -> lib.warn '' + fetchurl for ${toString (builtins.head urls_)}: curlOpts is a list (${lib.generators.toPretty { multiline = false; } curlOpts}), which is not supported anymore. + - If you wish to get the same effect as before, for elements with spaces (even if escaped) to expand to multiple curl arguments, use a string argument instead: + curlOpts = ${lib.strings.escapeNixString (toString curlOpts)}; + - If you wish for each list element to be passed as a separate curl argument, allowing arguments to contain spaces, use curlOptsList instead: + curlOptsList = [ ${lib.concatMapStringsSep " " lib.strings.escapeNixString curlOpts} ];'' true; + +stdenvNoCC.mkDerivation (( + if (pname != "" && version != "") then + { inherit pname version; } + else + { name = + if showURLs then "urls" + else if name != "" then name + else baseNameOf (toString (builtins.head urls_)); + } +) // { + builder = ./builder.sh; + + nativeBuildInputs = [ curl ] ++ nativeBuildInputs; + + urls = urls_; + + # If set, prefer the content-addressable mirrors + # (http://tarballs.nixos.org) over the original URLs. + preferHashedMirrors = true; + + # New-style output content requirements. + inherit (hash_) outputHashAlgo outputHash; + + SSL_CERT_FILE = if (hash_.outputHash == "" || hash_.outputHash == lib.fakeSha256 || hash_.outputHash == lib.fakeSha512 || hash_.outputHash == lib.fakeHash) + then "${cacert}/etc/ssl/certs/ca-bundle.crt" + else "/no-cert-file.crt"; + + outputHashMode = if (recursiveHash || executable) then "recursive" else "flat"; + + inherit curlOpts; + curlOptsList = lib.escapeShellArgs curlOptsList; + inherit showURLs mirrorsFile postFetch downloadToTemp executable; + + impureEnvVars = impureEnvVars ++ netrcImpureEnvVars; + + nixpkgsVersion = lib.trivial.release; + + inherit preferLocalBuild; + + postHook = if netrcPhase == null then null else '' + ${netrcPhase} + curlOpts="$curlOpts --netrc-file $PWD/netrc" + ''; + + inherit meta; + passthru = { inherit url; } // passthru; +}) diff --git a/pkgs/build-support/fetchurl/mirrors.nix b/pkgs/build-support/fetchurl/mirrors.nix new file mode 100644 index 0000000..e192c65 --- /dev/null +++ b/pkgs/build-support/fetchurl/mirrors.nix @@ -0,0 +1,422 @@ +{ + + # Content-addressable Nix mirrors + hashedMirrors = [ + "https://tarballs.nixos.org" + ]; + + # Mirrors for mirror://site/filename URIs, where "site" is + # "sourceforge", "gnu", etc. + + # Alsa Project + alsa = [ + "https://www.alsa-project.org/files/pub/" + "ftp://ftp.alsa-project.org/pub/" + "http://alsa.cybermirror.org/" + "http://www.mirrorservice.org/sites/ftp.alsa-project.org/pub/" + ]; + + # Apache + apache = [ + "https://dlcdn.apache.org/" + "https://www-eu.apache.org/dist/" + "https://ftp.wayne.edu/apache/" + "https://www.apache.org/dist/" + "https://archive.apache.org/dist/" # fallback for old releases + "https://apache.cs.uu.nl/" + "https://apache.cs.utah.edu/" + "http://ftp.tudelft.nl/apache/" + "ftp://ftp.funet.fi/pub/mirrors/apache.org/" + ]; + + # Bioconductor mirrors (from https://bioconductor.org/about/mirrors/) + # The commented-out ones don't seem to allow direct package downloads; + # they serve error messages that result in hash mismatches instead + bioc = [ + # http://bioc.ism.ac.jp/ + # http://bioc.openanalytics.eu/ + # http://bioconductor.fmrp.usp.br/ + # http://mirror.aarnet.edu.au/pub/bioconductor/ + # http://watson.nci.nih.gov/bioc_mirror/ + "https://bioconductor.statistik.tu-dortmund.de/packages/" + "https://mirrors.ustc.edu.cn/bioc/" + "http://bioconductor.jp/packages/" + ]; + + # CRAN mirrors + cran = [ + "https://cran.r-project.org/src/contrib/" + ]; + + # BitlBee mirrors, see https://www.bitlbee.org/main.php/mirrors.html + bitlbee = [ + "https://get.bitlbee.org/" + "https://ftp.snt.utwente.nl/pub/software/bitlbee/" + "http://bitlbee.intergenia.de/" + ]; + + # GCC + gcc = [ + "https://mirror.koddos.net/gcc/" + "https://bigsearcher.com/mirrors/gcc/" + "ftp://ftp.nluug.nl/mirror/languages/gcc/" + "ftp://ftp.fu-berlin.de/unix/languages/gcc/" + "ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/" + "ftp://gcc.gnu.org/pub/gcc/" + ]; + + # GNOME + gnome = [ + # This one redirects to some mirror closeby, so it should be all you need + "https://download.gnome.org/" + + "https://fr2.rpmfind.net/linux/gnome.org/" + "https://ftp.acc.umu.se/pub/GNOME/" + "https://ftp.belnet.be/mirror/ftp.gnome.org/" + "ftp://ftp.cse.buffalo.edu/pub/Gnome/" + "ftp://ftp.nara.wide.ad.jp/pub/X11/GNOME/" + ]; + + # GNU (https://www.gnu.org/prep/ftp.html) + gnu = [ + # This one redirects to a (supposedly) nearby and (supposedly) up-to-date + # mirror + "https://ftpmirror.gnu.org/" + + "https://ftp.nluug.nl/pub/gnu/" + "https://mirrors.kernel.org/gnu/" + "https://mirror.ibcp.fr/pub/gnu/" + "https://mirror.dogado.de/gnu/" + "https://mirror.tochlab.net/pub/gnu/" + + # This one is the master repository, and thus it's always up-to-date + "https://ftp.gnu.org/pub/gnu/" + + "ftp://ftp.funet.fi/pub/mirrors/ftp.gnu.org/gnu/" + ]; + + # GnuPG + gnupg = [ + "https://gnupg.org/ftp/gcrypt/" + "https://mirrors.dotsrc.org/gcrypt/" + "https://ftp.heanet.ie/mirrors/ftp.gnupg.org/gcrypt/" + "https://www.mirrorservice.org/sites/ftp.gnupg.org/gcrypt/" + "http://www.ring.gr.jp/pub/net/" + ]; + + # IBiblio (former metalab/sunsite) + # Most of the time the expressions refer to the /pub/Linux/ subdirectory; + # however there are other useful files outside it + ibiblioPubLinux = [ + "https://www.ibiblio.org/pub/Linux/" + "ftp://ftp.ibiblio.org/pub/linux/" + "ftp://ftp.gwdg.de/pub/linux/metalab/" + "ftp://ftp.metalab.unc.edu/pub/linux/" + ]; + + # ImageMagick mirrors, see https://www.imagemagick.org/script/mirror.php + imagemagick = [ + "https://www.imagemagick.org/download/" + "https://mirror.checkdomain.de/imagemagick/" + "https://ftp.nluug.nl/ImageMagick/" + "https://ftp.sunet.se/mirror/imagemagick.org/ftp/" + "ftp://ftp.sunet.se/mirror/imagemagick.org/ftp/" # also contains older versions removed from most mirrors + ]; + + # Mirrors from https://download.kde.org/ls-lR.mirrorlist + kde = [ + "https://cdn.download.kde.org/" + "https://download.kde.org/download.php?url=" + "https://ftp.gwdg.de/pub/linux/kde/" + "https://mirrors.ocf.berkeley.edu/kde/" + "https://mirrors.mit.edu/kde/" + "https://mirrors.ustc.edu.cn/kde/" + "https://ftp.funet.fi/pub/mirrors/ftp.kde.org/pub/kde/" + ]; + + # kernel.org's /pub (/pub/{linux,software}) tree + kernel = [ + "https://cdn.kernel.org/pub/" + "http://linux-kernel.uio.no/pub/" + "ftp://ftp.funet.fi/pub/mirrors/ftp.kernel.org/pub/" + ]; + + # MySQL + mysql = [ + "https://cdn.mysql.com/Downloads/" + ]; + + # Maven Central + maven = [ + "https://repo1.maven.org/maven2/" + ]; + + # Mozilla projects + mozilla = [ + "https://download.cdn.mozilla.net/pub/mozilla.org/" + "https://archive.mozilla.org/pub/" + ]; + + # OSDN (formerly SourceForge.jp) + osdn = [ + "https://osdn.dl.osdn.jp/" + "https://osdn.mirror.constant.com/" + "https://mirrors.gigenet.com/OSDN/" + "https://osdn.dl.sourceforge.jp/" + "https://jaist.dl.sourceforge.jp/" + ]; + + # PostgreSQL + postgresql = [ + "https://ftp.postgresql.org/pub/" + ]; + + # Qt + qt = [ + "https://download.qt.io/" + ]; + + # Sage mirrors (https://www.sagemath.org/mirrors.html) + sageupstream = [ + # Africa (HTTPS) + "https://sagemath.mirror.ac.za/spkg/upstream/" + "https://mirror.ufs.ac.za/sagemath/spkg/upstream/" + + # America, North (HTTPS) + "https://mirrors.mit.edu/sage/spkg/upstream/" + "https://mirrors.xmission.com/sage/spkg/upstream/" + + # Asia (HTTPS) + "https://mirrors.tuna.tsinghua.edu.cn/sagemath/spkg/upstream/" + "https://mirrors.ustc.edu.cn/sagemath/spkg/upstream/" + "http://ftp.tsukuba.wide.ad.jp/software/sage/spkg/upstream/" + "https://ftp.yz.yamagata-u.ac.jp/pub/math/sage/spkg/upstream/" + "https://mirror.yandex.ru/mirrors/sage.math.washington.edu/spkg/upstream/" + + # Australia (HTTPS) + "https://mirror.aarnet.edu.au/pub/sage/spkg/upstream/" + + # Europe (HTTPS) + "https://sage.mirror.garr.it/mirrors/sage/spkg/upstream/" + "https://www-ftp.lip6.fr/pub/math/sagemath/spkg/upstream/" + + # Africa (non-HTTPS) + "ftp://ftp.sun.ac.za/pub/mirrors/www.sagemath.org/spkg/upstream/" + + # America, North (non-HTTPS) + "http://www.cecm.sfu.ca/sage/spkg/upstream/" + + # America, South (non-HTTPS) + "http://sagemath.c3sl.ufpr.br/spkg/upstream/" + "http://linorg.usp.br/sage/spkg/upstream" + + # Asia (non-HTTPS) + "http://ftp.kaist.ac.kr/sage/spkg/upstream/" + "http://ftp.riken.jp/sagemath/spkg/upstream/" + + # Europe (non-HTTPS) + "http://mirrors.fe.up.pt/pub/sage/spkg/upstream/" + "http://ftp.ntua.gr/pub/sagemath/spkg/upstream/" + ]; + + # SAMBA + samba = [ + "https://www.samba.org/ftp/" + "http://www.samba.org/ftp/" + ]; + + # GNU Savannah + savannah = [ + # Mirrors from https://download-mirror.savannah.gnu.org/releases/00_MIRRORS.html + "https://mirror.easyname.at/nongnu/" + "https://savannah.c3sl.ufpr.br/" + "https://mirror.csclub.uwaterloo.ca/nongnu/" + "https://mirror.cedia.org.ec/nongnu/" + "https://ftp.igh.cnrs.fr/pub/nongnu/" + "https://mirror6.layerjet.com/nongnu" + "https://mirror.netcologne.de/savannah/" + "https://ftp.cc.uoc.gr/mirrors/nongnu.org/" + "https://nongnu.uib.no/" + "https://ftp.acc.umu.se/mirror/gnu.org/savannah/" + "http://mirror2.klaus-uwe.me/nongnu/" + "http://mirrors.fe.up.pt/pub/nongnu/" + "http://ftp.twaren.net/Unix/NonGNU/" + "http://savannah-nongnu-org.ip-connect.vn.ua/" + "http://www.mirrorservice.org/sites/download.savannah.gnu.org/releases/" + "http://gnu.mirrors.pair.com/savannah/savannah/" + "ftp://mirror.easyname.at/nongnu/" + "ftp://mirror2.klaus-uwe.me/nongnu/" + "ftp://mirror.csclub.uwaterloo.ca/nongnu/" + "ftp://ftp.igh.cnrs.fr/pub/nongnu/" + "ftp://mirror.netcologne.de/savannah/" + "ftp://nongnu.uib.no/pub/nongnu/" + "ftp://mirrors.fe.up.pt/pub/nongnu/" + "ftp://ftp.twaren.net/Unix/NonGNU/" + "ftp://savannah-nongnu-org.ip-connect.vn.ua/mirror/savannah.nongnu.org/" + "ftp://ftp.mirrorservice.org/sites/download.savannah.gnu.org/releases/" + ]; + + # SourceForge + sourceforge = [ + "https://downloads.sourceforge.net/" + "https://prdownloads.sourceforge.net/" + "https://netcologne.dl.sourceforge.net/sourceforge/" + "https://versaweb.dl.sourceforge.net/sourceforge/" + "https://freefr.dl.sourceforge.net/sourceforge/" + "https://osdn.dl.sourceforge.net/sourceforge/" + ]; + + # Steam Runtime + steamrt = [ + "https://repo.steampowered.com/steamrt/" + "https://public.abbradar.moe/steamrt/" + ]; + + # TCSH shell + tcsh = [ + "https://astron.com/pub/tcsh/" + "https://astron.com/pub/tcsh/old/" + "http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/" + "http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/old/" + "ftp://ftp.astron.com/pub/tcsh/" + "ftp://ftp.astron.com/pub/tcsh/old/" + "ftp://ftp.funet.fi/pub/unix/shells/tcsh/" + "ftp://ftp.funet.fi/pub/unix/shells/tcsh/old/" + ]; + + # XFCE + xfce = [ + "https://archive.xfce.org/" + "https://mirror.netcologne.de/xfce/" + "https://archive.be.xfce.org/xfce/" + "https://archive.al-us.xfce.org/" + "http://archive.se.xfce.org/xfce/" + "http://mirror.perldude.de/archive.xfce.org/" + "http://archive.be2.xfce.org/" + "http://ftp.udc.es/xfce/" + ]; + + # X.org + xorg = [ + "https://xorg.freedesktop.org/releases/" + "https://ftp.x.org/archive/" + ]; + + ### Programming languages' package repos + + # Perl CPAN + cpan = [ + "https://cpan.metacpan.org/" + "https://cpan.perl.org/" + "https://mirrors.kernel.org/CPAN/" + "https://backpan.perl.org/" # for old releases + ]; + + # D DUB + dub = [ + "https://code.dlang.org/packages/" + "https://codemirror.dlang.org/packages/" + ]; + + # Haskell Hackage + hackage = [ + "https://hackage.haskell.org/package/" + ]; + + # Lua Rocks + luarocks = [ + "https://luarocks.org/" + "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/" + "https://luafr.org/moonrocks/" + ]; + + # Python PyPI + pypi = [ + "https://files.pythonhosted.org/packages/source/" + # pypi.io is a more semantic link, but atm it’s referencing + # files.pythonhosted.org over two redirects + "https://pypi.io/packages/source/" + ]; + + # Python Test-PyPI + testpypi = [ + "https://test.pypi.io/packages/source/" + ]; + + ### Linux distros + + # CentOS + centos = [ + # For old releases + "https://vault.centos.org/" + "https://archive.kernel.org/centos-vault/" + "https://ftp.jaist.ac.jp/pub/Linux/CentOS-vault/" + "https://mirrors.aliyun.com/centos-vault/" + "https://mirror.chpc.utah.edu/pub/vault.centos.org/" + "https://mirror.math.princeton.edu/pub/centos-vault/" + "https://mirrors.tripadvisor.com/centos-vault/" + "http://mirror.centos.org/centos/" + ]; + + # Debian + debian = [ + "https://httpredir.debian.org/debian/" + "https://ftp.debian.org/debian/" + "https://mirrors.edge.kernel.org/debian/" + "ftp://ftp.de.debian.org/debian/" + "ftp://ftp.fr.debian.org/debian/" + "ftp://ftp.nl.debian.org/debian/" + "ftp://ftp.ru.debian.org/debian/" + "http://archive.debian.org/debian-archive/debian/" + "ftp://ftp.funet.fi/pub/mirrors/ftp.debian.org/debian/" + ]; + + # Fedora + # Please add only full mirrors that carry old Fedora distributions as well + # See: https://mirrors.fedoraproject.org/publiclist (but not all carry old content) + fedora = [ + "https://archives.fedoraproject.org/pub/fedora/" + "https://fedora.osuosl.org/" + "https://ftp.funet.fi/pub/mirrors/ftp.redhat.com/pub/fedora/" + "https://ftp.linux.cz/pub/linux/fedora/" + "https://archives.fedoraproject.org/pub/archive/fedora/" + "http://ftp.nluug.nl/pub/os/Linux/distr/fedora/" + "http://mirror.csclub.uwaterloo.ca/fedora/" + "http://mirror.1000mbps.com/fedora/" + ]; + + # Gentoo + gentoo = [ + "https://ftp.snt.utwente.nl/pub/os/linux/gentoo/" + "https://distfiles.gentoo.org/" + "https://mirrors.kernel.org/gentoo/" + ]; + + # openSUSE + opensuse = [ + "https://opensuse.hro.nl/opensuse/distribution/" + "https://ftp.funet.fi/pub/linux/mirrors/opensuse/distribution/" + "https://ftp.opensuse.org/pub/opensuse/distribution/" + "https://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/" + "https://mirrors.edge.kernel.org/opensuse/distribution/" + "http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/" + ]; + + # Ubuntu + ubuntu = [ + "https://nl.archive.ubuntu.com/ubuntu/" + "https://old-releases.ubuntu.com/ubuntu/" + "https://mirrors.edge.kernel.org/ubuntu/" + "http://de.archive.ubuntu.com/ubuntu/" + "http://archive.ubuntu.com/ubuntu/" + ]; + + # ... and other OSes in general + + # OpenBSD + openbsd = [ + "https://ftp.openbsd.org/pub/OpenBSD/" + "ftp://ftp.nluug.nl/pub/OpenBSD/" + "ftp://ftp-stud.fht-esslingen.de/pub/OpenBSD/" + ]; +} diff --git a/pkgs/build-support/fetchurl/tests.nix b/pkgs/build-support/fetchurl/tests.nix new file mode 100644 index 0000000..e348d77 --- /dev/null +++ b/pkgs/build-support/fetchurl/tests.nix @@ -0,0 +1,13 @@ +{ testers, fetchurl, jq, moreutils, ... }: { + # Tests that we can send custom headers with spaces in them + header = + let headerValue = "Test '\" <- These are some quotes"; + in testers.invalidateFetcherByDrvHash fetchurl { + url = "https://httpbin.org/headers"; + sha256 = builtins.hashString "sha256" (headerValue + "\n"); + curlOptsList = [ "-H" "Hello: ${headerValue}" ]; + postFetch = '' + ${jq}/bin/jq -r '.headers.Hello' $out | ${moreutils}/bin/sponge $out + ''; + }; +} diff --git a/pkgs/build-support/fetchurl/write-mirror-list.sh b/pkgs/build-support/fetchurl/write-mirror-list.sh new file mode 100644 index 0000000..2dabd2e --- /dev/null +++ b/pkgs/build-support/fetchurl/write-mirror-list.sh @@ -0,0 +1,4 @@ +source $stdenv/setup + +# !!! this is kinda hacky. +set | grep -E '^[a-zA-Z]+=.*://' > $out diff --git a/pkgs/build-support/fetchzip/default.nix b/pkgs/build-support/fetchzip/default.nix new file mode 100644 index 0000000..dd04ccb --- /dev/null +++ b/pkgs/build-support/fetchzip/default.nix @@ -0,0 +1,77 @@ +# This function downloads and unpacks an archive file, such as a zip +# or tar file. This is primarily useful for dynamically generated +# archives, such as GitHub's /archive URLs, where the unpacked content +# of the zip file doesn't change, but the zip file itself may +# (e.g. due to minor changes in the compression algorithm, or changes +# in timestamps). + +{ lib, fetchurl, withUnzip ? true, unzip, glibcLocalesUtf8 }: + +{ name ? "source" +, url ? "" +, urls ? [] +, nativeBuildInputs ? [] +, postFetch ? "" +, extraPostFetch ? "" + +# Optionally move the contents of the unpacked tree up one level. +, stripRoot ? true +# Allows to set the extension for the intermediate downloaded +# file. This can be used as a hint for the unpackCmdHooks to select +# an appropriate unpacking tool. +, extension ? null + +# the rest are given to fetchurl as is +, ... } @ args: + +assert (extraPostFetch != "") -> lib.warn "use 'postFetch' instead of 'extraPostFetch' with 'fetchzip' and 'fetchFromGitHub' or 'fetchFromGitLab'." true; + +let + tmpFilename = + if extension != null + then "download.${extension}" + else baseNameOf (if url != "" then url else builtins.head urls); +in + +fetchurl ({ + inherit name; + recursiveHash = true; + + downloadToTemp = true; + + # Have to pull in glibcLocalesUtf8 for unzip in setup-hook.sh to handle + # UTF-8 aware locale: + # https://github.com/NixOS/nixpkgs/issues/176225#issuecomment-1146617263 + nativeBuildInputs = lib.optionals withUnzip [ unzip glibcLocalesUtf8 ] ++ nativeBuildInputs; + + postFetch = + '' + unpackDir="$TMPDIR/unpack" + mkdir "$unpackDir" + cd "$unpackDir" + + renamed="$TMPDIR/${tmpFilename}" + mv "$downloadedFile" "$renamed" + unpackFile "$renamed" + chmod -R +w "$unpackDir" + '' + (if stripRoot then '' + if [ $(ls -A "$unpackDir" | wc -l) != 1 ]; then + echo "error: zip file must contain a single file or directory." + echo "hint: Pass stripRoot=false; to fetchzip to assume flat list of files." + exit 1 + fi + fn=$(cd "$unpackDir" && ls -A) + if [ -f "$unpackDir/$fn" ]; then + mkdir $out + fi + mv "$unpackDir/$fn" "$out" + '' else '' + mv "$unpackDir" "$out" + '') + '' + ${postFetch} + ${extraPostFetch} + chmod 755 "$out" + ''; + # ^ Remove non-owner write permissions + # Fixes https://github.com/NixOS/nixpkgs/issues/38649 +} // removeAttrs args [ "stripRoot" "extraPostFetch" "postFetch" "extension" "nativeBuildInputs" ]) diff --git a/pkgs/build-support/fetchzip/tests.nix b/pkgs/build-support/fetchzip/tests.nix new file mode 100644 index 0000000..13175d5 --- /dev/null +++ b/pkgs/build-support/fetchzip/tests.nix @@ -0,0 +1,25 @@ +{ testers, fetchzip, runCommand, ... }: + +let + url = "https://gist.github.com/glandium/01d54cefdb70561b5f6675e08f2990f2/archive/2f430f0c136a69b0886281d0c76708997d8878af.zip"; +in +{ + simple = testers.invalidateFetcherByDrvHash fetchzip { + inherit url; + sha256 = "sha256-0ecwgL8qUavSj1+WkaxpmRBmu7cvj53V5eXQV71fddU="; + }; + + postFetch = testers.invalidateFetcherByDrvHash fetchzip { + inherit url; + sha256 = "sha256-7sAOzKa+9vYx5XyndHxeY2ffWAjOsgCkXC9anK6cuV0="; + postFetch = "touch $out/filee"; + }; + + hiddenDir = testers.invalidateFetcherByDrvHash fetchzip { + url = "file://${runCommand "hiddendir.tar" {} '' + mkdir .foo + tar -cf $out .foo + ''}"; + sha256 = "sha256-pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; + }; +} diff --git a/pkgs/build-support/flutter/default.nix b/pkgs/build-support/flutter/default.nix new file mode 100644 index 0000000..5d7cd7d --- /dev/null +++ b/pkgs/build-support/flutter/default.nix @@ -0,0 +1,179 @@ +{ lib +, callPackage +, runCommand +, makeWrapper +, wrapGAppsHook +, buildDartApplication +, cacert +, glib +, flutter +, pkg-config +, jq +, yq +, moreutils +}: + +# absolutely no mac support for now + +{ pubGetScript ? "flutter pub get" +, flutterBuildFlags ? [ ] +, targetFlutterPlatform ? "linux" +, extraWrapProgramArgs ? "" +, ... +}@args: + +let + builderArgs = rec { + universal = args // { + sdkSetupScript = '' + # Pub needs SSL certificates. Dart normally looks in a hardcoded path. + # https://github.com/dart-lang/sdk/blob/3.1.0/runtime/bin/security_context_linux.cc#L48 + # + # Dart does not respect SSL_CERT_FILE... + # https://github.com/dart-lang/sdk/issues/48506 + # ...and Flutter does not support --root-certs-file, so the path cannot be manually set. + # https://github.com/flutter/flutter/issues/56607 + # https://github.com/flutter/flutter/issues/113594 + # + # libredirect is of no use either, as Flutter does not pass any + # environment variables (including LD_PRELOAD) to the Pub process. + # + # Instead, Flutter is patched to allow the path to the Dart binary used for + # Pub commands to be overriden. + export NIX_FLUTTER_PUB_DART="${runCommand "dart-with-certs" { nativeBuildInputs = [ makeWrapper ]; } '' + mkdir -p "$out/bin" + makeWrapper ${flutter.dart}/bin/dart "$out/bin/dart" \ + --add-flags "--root-certs-file=${cacert}/etc/ssl/certs/ca-bundle.crt" + ''}/bin/dart" + + export HOME="$NIX_BUILD_TOP" + flutter config --no-analytics &>/dev/null # mute first-run + flutter config --enable-linux-desktop >/dev/null + ''; + + inherit pubGetScript; + + sdkSourceBuilders = { + # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/sdk/flutter.dart#L81 + "flutter" = name: runCommand "flutter-sdk-${name}" { passthru.packageRoot = "."; } '' + for path in '${flutter}/packages/${name}' '${flutter}/bin/cache/pkg/${name}'; do + if [ -d "$path" ]; then + ln -s "$path" "$out" + break + fi + done + + if [ ! -e "$out" ]; then + echo 1>&2 'The Flutter SDK does not contain the requested package: ${name}!' + exit 1 + fi + ''; + }; + + extraPackageConfigSetup = '' + # https://github.com/flutter/flutter/blob/3.13.8/packages/flutter_tools/lib/src/dart/pub.dart#L755 + if [ "$('${yq}/bin/yq' '.flutter.generate // false' pubspec.yaml)" = "true" ]; then + '${jq}/bin/jq' '.packages |= . + [{ + name: "flutter_gen", + rootUri: "flutter_gen", + languageVersion: "2.12", + }]' "$out" | '${moreutils}/bin/sponge' "$out" + fi + ''; + }; + + linux = universal // { + outputs = universal.outputs or [ ] ++ [ "debug" ]; + + nativeBuildInputs = (universal.nativeBuildInputs or [ ]) ++ [ + wrapGAppsHook + + # Flutter requires pkg-config for Linux desktop support, and many plugins + # attempt to use it. + # + # It is available to the `flutter` tool through its wrapper, but it must be + # added here as well so the setup hook adds plugin dependencies to the + # pkg-config search paths. + pkg-config + ]; + + buildInputs = (universal.buildInputs or [ ]) ++ [ glib ]; + + dontDartBuild = true; + buildPhase = universal.buildPhase or '' + runHook preBuild + + mkdir -p build/flutter_assets/fonts + + flutter build linux -v --release --split-debug-info="$debug" ${builtins.concatStringsSep " " (map (flag: "\"${flag}\"") flutterBuildFlags)} + + runHook postBuild + ''; + + dontDartInstall = true; + installPhase = universal.installPhase or '' + runHook preInstall + + built=build/linux/*/release/bundle + + mkdir -p $out/bin + mv $built $out/app + + for f in $(find $out/app -iname "*.desktop" -type f); do + install -D $f $out/share/applications/$(basename $f) + done + + for f in $(find $out/app -maxdepth 1 -type f); do + ln -s $f $out/bin/$(basename $f) + done + + # make *.so executable + find $out/app -iname "*.so" -type f -exec chmod +x {} + + + # remove stuff like /build/source/packages/ubuntu_desktop_installer/linux/flutter/ephemeral + for f in $(find $out/app -executable -type f); do + if patchelf --print-rpath "$f" | grep /build; then # this ignores static libs (e,g. libapp.so) also + echo "strip RPath of $f" + newrp=$(patchelf --print-rpath $f | sed -r "s|/build.*ephemeral:||g" | sed -r "s|/build.*profile:||g") + patchelf --set-rpath "$newrp" "$f" + fi + done + + runHook postInstall + ''; + + dontWrapGApps = true; + extraWrapProgramArgs = '' + ''${gappsWrapperArgs[@]} \ + ${extraWrapProgramArgs} + ''; + }; + + web = universal // { + dontDartBuild = true; + buildPhase = universal.buildPhase or '' + runHook preBuild + + mkdir -p build/flutter_assets/fonts + + flutter build web -v --release ${builtins.concatStringsSep " " (map (flag: "\"${flag}\"") flutterBuildFlags)} + + runHook postBuild + ''; + + dontDartInstall = true; + installPhase = universal.installPhase or '' + runHook preInstall + + cp -r build/web "$out" + + runHook postInstall + ''; + }; + }.${targetFlutterPlatform} or (throw "Unsupported Flutter host platform: ${targetFlutterPlatform}"); + + minimalFlutter = flutter.override { supportedTargetFlutterPlatforms = [ "universal" targetFlutterPlatform ]; }; + + buildAppWith = flutter: buildDartApplication.override { dart = flutter; }; +in +buildAppWith minimalFlutter (builderArgs // { passthru = builderArgs.passthru or { } // { multiShell = buildAppWith flutter builderArgs; }; }) diff --git a/pkgs/build-support/go/module.nix b/pkgs/build-support/go/module.nix new file mode 100644 index 0000000..6f568c0 --- /dev/null +++ b/pkgs/build-support/go/module.nix @@ -0,0 +1,321 @@ +{ go, cacert, git, lib, stdenv }: + +{ name ? "${args'.pname}-${args'.version}" +, src +, nativeBuildInputs ? [ ] +, passthru ? { } +, patches ? [ ] + + # A function to override the goModules derivation +, overrideModAttrs ? (_oldAttrs: { }) + + # path to go.mod and go.sum directory +, modRoot ? "./" + + # vendorHash is the SRI hash of the vendored dependencies + # + # if vendorHash is null, then we won't fetch any dependencies and + # rely on the vendor folder within the source. +, vendorHash ? throw ( + if args'?vendorSha256 then + "buildGoModule: Expect vendorHash instead of vendorSha256" + else + "buildGoModule: vendorHash is missing" + ) + # Whether to delete the vendor folder supplied with the source. +, deleteVendor ? false + # Whether to fetch (go mod download) and proxy the vendor directory. + # This is useful if your code depends on c code and go mod tidy does not + # include the needed sources to build or if any dependency has case-insensitive + # conflicts which will produce platform dependant `vendorHash` checksums. +, proxyVendor ? false + + # We want parallel builds by default +, enableParallelBuilding ? true + + # Do not enable this without good reason + # IE: programs coupled with the compiler +, allowGoReference ? false + +, CGO_ENABLED ? go.CGO_ENABLED + +, meta ? { } + + # Not needed with buildGoModule +, goPackagePath ? "" + +, ldflags ? [ ] + +, GOFLAGS ? [ ] + + # needed for buildFlags{,Array} warning +, buildFlags ? "" +, buildFlagsArray ? "" + +, ... +}@args': + +assert goPackagePath != "" -> throw "`goPackagePath` is not needed with `buildGoModule`"; + +let + args = removeAttrs args' [ "overrideModAttrs" "vendorSha256" "vendorHash" ]; + + GO111MODULE = "on"; + GOTOOLCHAIN = "local"; + + goModules = if (vendorHash == null) then "" else + (stdenv.mkDerivation { + name = "${name}-go-modules"; + + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ go git cacert ]; + + inherit (args) src; + inherit (go) GOOS GOARCH; + inherit GO111MODULE GOTOOLCHAIN; + + # The following inheritence behavior is not trivial to expect, and some may + # argue it's not ideal. Changing it may break vendor hashes in Nixpkgs and + # out in the wild. In anycase, it's documented in: + # doc/languages-frameworks/go.section.md + prePatch = args.prePatch or ""; + patches = args.patches or [ ]; + patchFlags = args.patchFlags or [ ]; + postPatch = args.postPatch or ""; + preBuild = args.preBuild or ""; + postBuild = args.modPostBuild or ""; + sourceRoot = args.sourceRoot or ""; + env = args.env or { }; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ + "GIT_PROXY_COMMAND" + "SOCKS_SERVER" + "GOPROXY" + ]; + + configurePhase = args.modConfigurePhase or '' + runHook preConfigure + export GOCACHE=$TMPDIR/go-cache + export GOPATH="$TMPDIR/go" + cd "${modRoot}" + runHook postConfigure + ''; + + buildPhase = args.modBuildPhase or ('' + runHook preBuild + '' + lib.optionalString deleteVendor '' + if [ ! -d vendor ]; then + echo "vendor folder does not exist, 'deleteVendor' is not needed" + exit 10 + else + rm -rf vendor + fi + '' + '' + if [ -d vendor ]; then + echo "vendor folder exists, please set 'vendorHash = null;' in your expression" + exit 10 + fi + + ${if proxyVendor then '' + mkdir -p "''${GOPATH}/pkg/mod/cache/download" + go mod download + '' else '' + if (( "''${NIX_DEBUG:-0}" >= 1 )); then + goModVendorFlags+=(-v) + fi + go mod vendor "''${goModVendorFlags[@]}" + ''} + + mkdir -p vendor + + runHook postBuild + ''); + + installPhase = args.modInstallPhase or '' + runHook preInstall + + ${if proxyVendor then '' + rm -rf "''${GOPATH}/pkg/mod/cache/download/sumdb" + cp -r --reflink=auto "''${GOPATH}/pkg/mod/cache/download" $out + '' else '' + cp -r --reflink=auto vendor $out + ''} + + if ! [ "$(ls -A $out)" ]; then + echo "vendor folder is empty, please set 'vendorHash = null;' in your expression" + exit 10 + fi + + runHook postInstall + ''; + + dontFixup = true; + + outputHashMode = "recursive"; + outputHash = vendorHash; + # Handle empty vendorHash; avoid + # error: empty hash requires explicit hash algorithm + outputHashAlgo = if vendorHash == "" then "sha256" else null; + }).overrideAttrs overrideModAttrs; + + package = stdenv.mkDerivation (args // { + nativeBuildInputs = [ go ] ++ nativeBuildInputs; + + inherit (go) GOOS GOARCH; + + GOFLAGS = GOFLAGS + ++ lib.optional (!proxyVendor) "-mod=vendor" + ++ lib.optional (!allowGoReference) "-trimpath"; + inherit CGO_ENABLED enableParallelBuilding GO111MODULE GOTOOLCHAIN; + + # If not set to an explicit value, set the buildid empty for reproducibility. + ldflags = ldflags ++ lib.optional (!lib.any (lib.hasPrefix "-buildid=") ldflags) "-buildid="; + + configurePhase = args.configurePhase or ('' + runHook preConfigure + + export GOCACHE=$TMPDIR/go-cache + export GOPATH="$TMPDIR/go" + export GOPROXY=off + export GOSUMDB=off + cd "$modRoot" + '' + lib.optionalString (vendorHash != null) '' + ${if proxyVendor then '' + export GOPROXY=file://${goModules} + '' else '' + rm -rf vendor + cp -r --reflink=auto ${goModules} vendor + ''} + '' + '' + + # currently pie is only enabled by default in pkgsMusl + # this will respect the `hardening{Disable,Enable}` flags if set + if [[ $NIX_HARDENING_ENABLE =~ "pie" ]]; then + export GOFLAGS="-buildmode=pie $GOFLAGS" + fi + + runHook postConfigure + ''); + + buildPhase = args.buildPhase or ('' + runHook preBuild + + exclude='\(/_\|examples\|Godeps\|testdata' + if [[ -n "$excludedPackages" ]]; then + IFS=' ' read -r -a excludedArr <<<$excludedPackages + printf -v excludedAlternates '%s\\|' "''${excludedArr[@]}" + excludedAlternates=''${excludedAlternates%\\|} # drop final \| added by printf + exclude+='\|'"$excludedAlternates" + fi + exclude+='\)' + + buildGoDir() { + local cmd="$1" dir="$2" + + . $TMPDIR/buildFlagsArray + + declare -a flags + flags+=($buildFlags "''${buildFlagsArray[@]}") + flags+=(''${tags:+-tags=''${tags// /,}}) + flags+=(''${ldflags:+-ldflags="$ldflags"}) + flags+=("-p" "$NIX_BUILD_CORES") + + if [ "$cmd" = "test" ]; then + flags+=(-vet=off) + flags+=($checkFlags) + fi + + local OUT + if ! OUT="$(go $cmd "''${flags[@]}" $dir 2>&1)"; then + if ! echo "$OUT" | grep -qE '(no( buildable| non-test)?|build constraints exclude all) Go (source )?files'; then + echo "$OUT" >&2 + return 1 + fi + fi + if [ -n "$OUT" ]; then + echo "$OUT" >&2 + fi + return 0 + } + + getGoDirs() { + local type; + type="$1" + if [ -n "$subPackages" ]; then + echo "$subPackages" | sed "s,\(^\| \),\1./,g" + else + find . -type f -name \*$type.go -exec dirname {} \; | grep -v "/vendor/" | sort --unique | grep -v "$exclude" + fi + } + + if (( "''${NIX_DEBUG:-0}" >= 1 )); then + buildFlagsArray+=(-x) + fi + + if [ ''${#buildFlagsArray[@]} -ne 0 ]; then + declare -p buildFlagsArray > $TMPDIR/buildFlagsArray + else + touch $TMPDIR/buildFlagsArray + fi + if [ -z "$enableParallelBuilding" ]; then + export NIX_BUILD_CORES=1 + fi + for pkg in $(getGoDirs ""); do + echo "Building subPackage $pkg" + buildGoDir install "$pkg" + done + '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + # normalize cross-compiled builds w.r.t. native builds + ( + dir=$GOPATH/bin/${go.GOOS}_${go.GOARCH} + if [[ -n "$(shopt -s nullglob; echo $dir/*)" ]]; then + mv $dir/* $dir/.. + fi + if [[ -d $dir ]]; then + rmdir $dir + fi + ) + '' + '' + runHook postBuild + ''); + + doCheck = args.doCheck or true; + checkPhase = args.checkPhase or '' + runHook preCheck + # We do not set trimpath for tests, in case they reference test assets + export GOFLAGS=''${GOFLAGS//-trimpath/} + + for pkg in $(getGoDirs test); do + buildGoDir test "$pkg" + done + + runHook postCheck + ''; + + installPhase = args.installPhase or '' + runHook preInstall + + mkdir -p $out + dir="$GOPATH/bin" + [ -e "$dir" ] && cp -r $dir $out + + runHook postInstall + ''; + + strictDeps = true; + + disallowedReferences = lib.optional (!allowGoReference) go; + + passthru = passthru // { inherit go goModules vendorHash; }; + + meta = { + # Add default meta information + platforms = go.meta.platforms or lib.platforms.all; + } // meta; + }); +in +lib.warnIf (buildFlags != "" || buildFlagsArray != "") + "Use the `ldflags` and/or `tags` attributes instead of `buildFlags`/`buildFlagsArray`" +lib.warnIf (builtins.elem "-buildid=" ldflags) "`-buildid=` is set by default as ldflag by buildGoModule" +lib.warnIf (builtins.elem "-trimpath" GOFLAGS) "`-trimpath` is added by default to GOFLAGS by buildGoModule when allowGoReference isn't set to true" +lib.warnIf (lib.any (lib.hasPrefix "-mod=") GOFLAGS) "use `proxyVendor` to control Go module/vendor behavior instead of setting `-mod=` in GOFLAGS" + package diff --git a/pkgs/build-support/go/package.nix b/pkgs/build-support/go/package.nix new file mode 100644 index 0000000..94a459c --- /dev/null +++ b/pkgs/build-support/go/package.nix @@ -0,0 +1,292 @@ +{ go, govers, lib, fetchgit, fetchhg, fetchbzr, rsync +, fetchFromGitHub, stdenv }: + +{ buildInputs ? [] +, nativeBuildInputs ? [] +, passthru ? {} +, preFixup ? "" +, shellHook ? "" + +# We want parallel builds by default +, enableParallelBuilding ? true + +# Go import path of the package +, goPackagePath + +# Go package aliases +, goPackageAliases ? [ ] + +# Extra sources to include in the gopath +, extraSrcs ? [ ] + +# Extra gopaths containing src subfolder +# with sources to include in the gopath +, extraSrcPaths ? [ ] + +# go2nix dependency file +, goDeps ? null + +# Whether to delete the vendor folder supplied with the source. +, deleteVendor ? false + +, dontRenameImports ? false + +# Do not enable this without good reason +# IE: programs coupled with the compiler +, allowGoReference ? false + +, CGO_ENABLED ? go.CGO_ENABLED + +, ldflags ? [ ] + +, GOFLAGS ? [ ] + +# needed for buildFlags{,Array} warning +, buildFlags ? "" +, buildFlagsArray ? "" + +, meta ? {}, ... } @ args: + +let + dep2src = goDep: + { + inherit (goDep) goPackagePath; + src = if goDep.fetch.type == "git" then + fetchgit { + inherit (goDep.fetch) url rev sha256; + } + else if goDep.fetch.type == "hg" then + fetchhg { + inherit (goDep.fetch) url rev sha256; + } + else if goDep.fetch.type == "bzr" then + fetchbzr { + inherit (goDep.fetch) url rev sha256; + } + else if goDep.fetch.type == "FromGitHub" then + fetchFromGitHub { + inherit (goDep.fetch) owner repo rev sha256; + } + else abort "Unrecognized package fetch type: ${goDep.fetch.type}"; + }; + + importGodeps = { depsFile }: + map dep2src (import depsFile); + + goPath = if goDeps != null then importGodeps { depsFile = goDeps; } ++ extraSrcs + else extraSrcs; + package = stdenv.mkDerivation ( + (builtins.removeAttrs args [ "goPackageAliases" "disabled" "extraSrcs"]) // { + + nativeBuildInputs = [ go ] + ++ (lib.optional (!dontRenameImports) govers) ++ nativeBuildInputs; + buildInputs = buildInputs; + + inherit (go) GOOS GOARCH GO386; + + GOHOSTARCH = go.GOHOSTARCH or null; + GOHOSTOS = go.GOHOSTOS or null; + + inherit CGO_ENABLED enableParallelBuilding; + + GO111MODULE = "off"; + GOTOOLCHAIN = "local"; + GOFLAGS = GOFLAGS ++ lib.optional (!allowGoReference) "-trimpath" ; + + GOARM = toString (lib.intersectLists [(stdenv.hostPlatform.parsed.cpu.version or "")] ["5" "6" "7"]); + + # If not set to an explicit value, set the buildid empty for reproducibility. + ldflags = ldflags ++ lib.optional (!lib.any (lib.hasPrefix "-buildid=") ldflags) "-buildid="; + + configurePhase = args.configurePhase or ('' + runHook preConfigure + + # Extract the source + cd "$NIX_BUILD_TOP" + mkdir -p "go/src/$(dirname "$goPackagePath")" + mv "$sourceRoot" "go/src/$goPackagePath" + + '' + lib.optionalString deleteVendor '' + if [ ! -d "go/src/$goPackagePath/vendor" ]; then + echo "vendor folder does not exist, 'deleteVendor' is not needed" + exit 10 + else + rm -rf "go/src/$goPackagePath/vendor" + fi + '' + lib.optionalString (goDeps != null) '' + if [ -d "go/src/$goPackagePath/vendor" ]; then + echo "vendor folder exists, 'goDeps' is not needed" + exit 10 + fi + '' + lib.flip lib.concatMapStrings goPath ({ src, goPackagePath }: '' + mkdir goPath + (cd goPath; unpackFile "${src}") + mkdir -p "go/src/$(dirname "${goPackagePath}")" + chmod -R u+w goPath/* + mv goPath/* "go/src/${goPackagePath}" + rmdir goPath + + '') + (lib.optionalString (extraSrcPaths != []) '' + ${rsync}/bin/rsync -a ${lib.concatMapStringsSep " " (p: "${p}/src") extraSrcPaths} go + + '') + '' + export GOPATH=$NIX_BUILD_TOP/go:$GOPATH + export GOCACHE=$TMPDIR/go-cache + + # currently pie is only enabled by default in pkgsMusl + # this will respect the `hardening{Disable,Enable}` flags if set + if [[ $NIX_HARDENING_ENABLE =~ "pie" ]]; then + export GOFLAGS="-buildmode=pie $GOFLAGS" + fi + + runHook postConfigure + ''); + + renameImports = args.renameImports or ( + let + inputsWithAliases = lib.filter (x: x ? goPackageAliases) + (buildInputs ++ (args.propagatedBuildInputs or [ ])); + rename = to: from: "echo Renaming '${from}' to '${to}'; govers -d -m ${from} ${to}"; + renames = p: lib.concatMapStringsSep "\n" (rename p.goPackagePath) p.goPackageAliases; + in lib.concatMapStringsSep "\n" renames inputsWithAliases); + + buildPhase = args.buildPhase or ('' + runHook preBuild + + runHook renameImports + + exclude='\(/_\|examples\|Godeps\|testdata' + if [[ -n "$excludedPackages" ]]; then + IFS=' ' read -r -a excludedArr <<<$excludedPackages + printf -v excludedAlternates '%s\\|' "''${excludedArr[@]}" + excludedAlternates=''${excludedAlternates%\\|} # drop final \| added by printf + exclude+='\|'"$excludedAlternates" + fi + exclude+='\)' + + buildGoDir() { + local cmd="$1" dir="$2" + + . $TMPDIR/buildFlagsArray + + declare -a flags + flags+=($buildFlags "''${buildFlagsArray[@]}") + flags+=(''${tags:+-tags=''${tags// /,}}) + flags+=(''${ldflags:+-ldflags="$ldflags"}) + flags+=("-p" "$NIX_BUILD_CORES") + + if [ "$cmd" = "test" ]; then + flags+=(-vet=off) + flags+=($checkFlags) + fi + + local OUT + if ! OUT="$(go $cmd "''${flags[@]}" $dir 2>&1)"; then + if ! echo "$OUT" | grep -qE '(no( buildable| non-test)?|build constraints exclude all) Go (source )?files'; then + echo "$OUT" >&2 + return 1 + fi + fi + if [ -n "$OUT" ]; then + echo "$OUT" >&2 + fi + return 0 + } + + getGoDirs() { + local type; + type="$1" + if [ -n "$subPackages" ]; then + echo "$subPackages" | sed "s,\(^\| \),\1$goPackagePath/,g" + else + pushd "$NIX_BUILD_TOP/go/src" >/dev/null + find "$goPackagePath" -type f -name \*$type.go -exec dirname {} \; | grep -v "/vendor/" | sort | uniq | grep -v "$exclude" + popd >/dev/null + fi + } + + if (( "''${NIX_DEBUG:-0}" >= 1 )); then + buildFlagsArray+=(-x) + fi + + if [ ''${#buildFlagsArray[@]} -ne 0 ]; then + declare -p buildFlagsArray > $TMPDIR/buildFlagsArray + else + touch $TMPDIR/buildFlagsArray + fi + if [ -z "$enableParallelBuilding" ]; then + export NIX_BUILD_CORES=1 + fi + for pkg in $(getGoDirs ""); do + echo "Building subPackage $pkg" + buildGoDir install "$pkg" + done + '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + # normalize cross-compiled builds w.r.t. native builds + ( + dir=$NIX_BUILD_TOP/go/bin/${go.GOOS}_${go.GOARCH} + if [[ -n "$(shopt -s nullglob; echo $dir/*)" ]]; then + mv $dir/* $dir/.. + fi + if [[ -d $dir ]]; then + rmdir $dir + fi + ) + '' + '' + runHook postBuild + ''); + + doCheck = args.doCheck or false; + checkPhase = args.checkPhase or '' + runHook preCheck + # We do not set trimpath for tests, in case they reference test assets + export GOFLAGS=''${GOFLAGS//-trimpath/} + + for pkg in $(getGoDirs test); do + buildGoDir test "$pkg" + done + + runHook postCheck + ''; + + installPhase = args.installPhase or '' + runHook preInstall + + mkdir -p $out + dir="$NIX_BUILD_TOP/go/bin" + [ -e "$dir" ] && cp -r $dir $out + + runHook postInstall + ''; + + strictDeps = true; + + shellHook = '' + d=$(mktemp -d "--suffix=-$name") + '' + toString (map (dep: '' + mkdir -p "$d/src/$(dirname "${dep.goPackagePath}")" + ln -s "${dep.src}" "$d/src/${dep.goPackagePath}" + '' + ) goPath) + '' + export GOPATH=${lib.concatStringsSep ":" ( ["$d"] ++ ["$GOPATH"] ++ ["$PWD"] ++ extraSrcPaths)} + '' + shellHook; + + disallowedReferences = lib.optional (!allowGoReference) go + ++ lib.optional (!dontRenameImports) govers; + + passthru = passthru // + { inherit go; } // + lib.optionalAttrs (goPackageAliases != []) { inherit goPackageAliases; }; + + meta = { + # Add default meta information + homepage = "https://${goPackagePath}"; + platforms = go.meta.platforms or lib.platforms.all; + } // meta; + }); +in +lib.warnIf (buildFlags != "" || buildFlagsArray != "") + "Use the `ldflags` and/or `tags` attributes instead of `buildFlags`/`buildFlagsArray`" +lib.warnIf (builtins.elem "-buildid=" ldflags) "`-buildid=` is set by default as ldflag by buildGoModule" +lib.warnIf (builtins.elem "-trimpath" GOFLAGS) "`-trimpath` is added by default to GOFLAGS by buildGoModule when allowGoReference isn't set to true" + package diff --git a/pkgs/build-support/icon-conv-tools/bin/extractWinRscIconsToStdFreeDesktopDir.sh b/pkgs/build-support/icon-conv-tools/bin/extractWinRscIconsToStdFreeDesktopDir.sh new file mode 100755 index 0000000..994adbd --- /dev/null +++ b/pkgs/build-support/icon-conv-tools/bin/extractWinRscIconsToStdFreeDesktopDir.sh @@ -0,0 +1,74 @@ +#!/bin/sh + +# The file from which to extract *.ico files or a particular *.ico file. +# (e.g.: './KeePass.exe', './myLibrary.dll', './my/path/to/app.ico'). +# As you notived, the utility can extract icons from a windows executable or +# dll. +rscFile=$1 + +# A regexp that can extract the image size from the file name. Because we +# use 'icotool', this value should usually be set to something like +# '[^\.]+\.exe_[0-9]+_[0-9]+_[0-9]+_[0-9]+_([0-9]+x[0-9]+)x[0-9]+\.png'. +# A reg expression may be written at some point that relegate this to +# an implementation detail. +sizeRegex=$2 + +# A regexp replace expression that will be used with 'sizeRegex' to create +# a proper size directory (e.g.: '48x48'). Usually this is left to '\1'. +sizeReplaceExp=$3 + +# A regexp that can extract the name of the target image from the file name +# of the image (usually png) extracted from the *.ico file(s). A good +# default is '([^\.]+).+' which gets the basename without extension. +nameRegex=$4 + +# A regexp replace expression that will be used alongside 'nameRegex' to create +# a icon file name. Note that you usually put directly you icon name here +# without any extension (e.g.: 'my-app'). But in case you've got something +# fancy, it will usually be '\1'. +nameReplaceExp=$5 + +# The +# out=./myOut +out=$6 + +# An optional temp dir. +if [ "" != "$7" ]; then + tmp=$7 + isOwnerOfTmpDir=false +else + tmp=`mktemp -d` + isOwnerOfTmpDir=true +fi + +rm -rf $tmp/png $tmp/ico +mkdir -p $tmp/png $tmp/ico + +# Extract the ressource file's extension. +rscFileExt=`echo "$rscFile" | sed -re 's/.+\.(.+)$/\1/'` + +if [ "ico" = "$rscFileExt" ]; then + cp -p $rscFile $tmp/ico +else + wrestool -x --output=$tmp/ico -t14 $rscFile +fi + +icotool --icon -x --palette-size=0 -o $tmp/png $tmp/ico/*.ico + +mkdir -p $out + +for i in $tmp/png/*.png; do + fn=`basename "$i"` + size=$(echo $fn | sed -re 's/'${sizeRegex}'/'${sizeReplaceExp}'/') + name=$(echo $fn | sed -re 's/'${nameRegex}'/'${nameReplaceExp}'/') + targetDir=$out/share/icons/hicolor/$size/apps + targetFile=$targetDir/$name.png + mkdir -p $targetDir + mv $i $targetFile +done + +rm -rf "$tmp/png" "$tmp/ico" + +if $isOwnerOfTmpDir; then + rm -rf "$tmp" +fi diff --git a/pkgs/build-support/icon-conv-tools/bin/icoFileToHiColorTheme b/pkgs/build-support/icon-conv-tools/bin/icoFileToHiColorTheme new file mode 100755 index 0000000..192f3bb --- /dev/null +++ b/pkgs/build-support/icon-conv-tools/bin/icoFileToHiColorTheme @@ -0,0 +1,28 @@ +#!/bin/sh + +SCRIPT_DIR=`cd "$(dirname $0)" && pwd` + +# The '*.ico' file that needs to be converted (e.g.: "./my/path/to/file.ico"). +icoFile="$1" + +# The desired name of created icon files without extension. (e.g.: "my-app"). +targetIconName="$2" + +# The output directory where the free desktop hierarchy will be created. +# (e.g.: "./path/to/my/out" or usually in nix "$out"). Note that the +# whole directory hierarchy to the icon will be created in the specified +# output directory (e.g.: "$out/share/icons/hicolor/48x48/apps/my-app.png"). +out="$3" + +# An optional temp directory location (e.g.: ./tmp). If not specified +# a random '/tmp' directory will be created. +tmp="$4" + +$SCRIPT_DIR/extractWinRscIconsToStdFreeDesktopDir.sh \ + "$icoFile" \ + '[^\.]+_[0-9]+_([0-9]+x[0-9]+)x[0-9]+\.png' \ + '\1' \ + '([^\.]+).+' \ + "$targetIconName" \ + "$out" \ + "$tmp" diff --git a/pkgs/build-support/icon-conv-tools/default.nix b/pkgs/build-support/icon-conv-tools/default.nix new file mode 100644 index 0000000..442f1f2 --- /dev/null +++ b/pkgs/build-support/icon-conv-tools/default.nix @@ -0,0 +1,32 @@ +{ lib, stdenv, icoutils }: + +stdenv.mkDerivation { + pname = "icon-conv-tools"; + version = "0.0.0"; + + src = ./bin; + + buildInputs = [ icoutils ]; + + patchPhase = '' + substituteInPlace extractWinRscIconsToStdFreeDesktopDir.sh \ + --replace "icotool" "${icoutils}/bin/icotool" \ + --replace "wrestool" "${icoutils}/bin/wrestool" + ''; + + buildPhase = '' + mkdir -p "$out/bin" + cp -p * "$out/bin" + ''; + + installPhase = "true"; + + dontPatchELF = true; + dontStrip = true; + + meta = with lib; { + description = "Tools for icon conversion specific to nix package manager"; + maintainers = with maintainers; [ jraygauthier ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/build-support/install-shell-files/default.nix b/pkgs/build-support/install-shell-files/default.nix new file mode 100644 index 0000000..d50661d --- /dev/null +++ b/pkgs/build-support/install-shell-files/default.nix @@ -0,0 +1,12 @@ +{ makeSetupHook, tests }: + +# See the header comment in ../setup-hooks/install-shell-files.sh for example usage. +let + setupHook = makeSetupHook { name = "install-shell-files"; } ../setup-hooks/install-shell-files.sh; +in + +setupHook.overrideAttrs (oldAttrs: { + passthru = (oldAttrs.passthru or {}) // { + tests = tests.install-shell-files; + }; +}) diff --git a/pkgs/build-support/kernel/compress-firmware-xz.nix b/pkgs/build-support/kernel/compress-firmware-xz.nix new file mode 100644 index 0000000..cb9ce7a --- /dev/null +++ b/pkgs/build-support/kernel/compress-firmware-xz.nix @@ -0,0 +1,29 @@ +{ runCommand, lib }: + +firmware: + +let + args = { + allowedRequisites = []; + } // lib.optionalAttrs (firmware ? meta) { inherit (firmware) meta; }; +in + +runCommand "${firmware.name}-xz" args '' + mkdir -p $out/lib + (cd ${firmware} && find lib/firmware -type d -print0) | + (cd $out && xargs -0 mkdir -v --) + (cd ${firmware} && find lib/firmware -type f -print0) | + (cd $out && xargs -0rtP "$NIX_BUILD_CORES" -n1 \ + sh -c 'xz -9c -T1 -C crc32 --lzma2=dict=2MiB "${firmware}/$1" > "$1.xz"' --) + (cd ${firmware} && find lib/firmware -type l) | while read link; do + target="$(readlink "${firmware}/$link")" + if [ -f "${firmware}/$link" ]; then + ln -vs -- "''${target/^${firmware}/$out}.xz" "$out/$link.xz" + else + ln -vs -- "''${target/^${firmware}/$out}" "$out/$link" + fi + done + + echo "Checking for broken symlinks:" + find -L $out -type l -print -execdir false -- '{}' '+' +'' diff --git a/pkgs/build-support/kernel/initrd-compressor-meta.nix b/pkgs/build-support/kernel/initrd-compressor-meta.nix new file mode 100644 index 0000000..443e599 --- /dev/null +++ b/pkgs/build-support/kernel/initrd-compressor-meta.nix @@ -0,0 +1,53 @@ +rec { + cat = { + executable = pkgs: "cat"; + ubootName = "none"; + extension = ".cpio"; + }; + gzip = { + executable = pkgs: "${pkgs.gzip}/bin/gzip"; + defaultArgs = ["-9n"]; + ubootName = "gzip"; + extension = ".gz"; + }; + bzip2 = { + executable = pkgs: "${pkgs.bzip2}/bin/bzip2"; + ubootName = "bzip2"; + extension = ".bz2"; + }; + xz = { + executable = pkgs: "${pkgs.xz}/bin/xz"; + defaultArgs = ["--check=crc32" "--lzma2=dict=512KiB"]; + extension = ".xz"; + }; + lzma = { + executable = pkgs: "${pkgs.xz}/bin/lzma"; + defaultArgs = ["--check=crc32" "--lzma1=dict=512KiB"]; + ubootName = "lzma"; + extension = ".lzma"; + }; + lz4 = { + executable = pkgs: "${pkgs.lz4}/bin/lz4"; + defaultArgs = ["-l"]; + ubootName = "lz4"; + extension = ".lz4"; + }; + lzop = { + executable = pkgs: "${pkgs.lzop}/bin/lzop"; + ubootName = "lzo"; + extension = ".lzo"; + }; + zstd = { + executable = pkgs: "${pkgs.zstd}/bin/zstd"; + defaultArgs = ["-10"]; + ubootName = "zstd"; + extension = ".zst"; + }; + pigz = gzip // { + executable = pkgs: "${pkgs.pigz}/bin/pigz"; + }; + pixz = xz // { + executable = pkgs: "${pkgs.pixz}/bin/pixz"; + defaultArgs = []; + }; +} diff --git a/pkgs/build-support/kernel/make-initrd-ng-tool.nix b/pkgs/build-support/kernel/make-initrd-ng-tool.nix new file mode 100644 index 0000000..5e08c09 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng-tool.nix @@ -0,0 +1,18 @@ +{ rustPlatform, lib, makeWrapper, patchelf, glibc, binutils }: + +rustPlatform.buildRustPackage { + pname = "make-initrd-ng"; + version = "0.1.0"; + + src = ./make-initrd-ng; + cargoLock.lockFile = ./make-initrd-ng/Cargo.lock; + + passthru.updateScript = ./make-initrd-ng/update.sh; + + meta = { + description = "Tool for copying binaries and their dependencies"; + mainProgram = "make-initrd-ng"; + maintainers = with lib.maintainers; [ das_j elvishjerricco k900 lheckemann ]; + license = lib.licenses.mit; + }; +} diff --git a/pkgs/build-support/kernel/make-initrd-ng.nix b/pkgs/build-support/kernel/make-initrd-ng.nix new file mode 100644 index 0000000..65e143c --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng.nix @@ -0,0 +1,97 @@ +let + # Some metadata on various compression programs, relevant to naming + # the initramfs file and, if applicable, generating a u-boot image + # from it. + compressors = import ./initrd-compressor-meta.nix; + # Get the basename of the actual compression program from the whole + # compression command, for the purpose of guessing the u-boot + # compression type and filename extension. + compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1; +in +{ stdenvNoCC, libarchive, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, binutils, runCommand +# Name of the derivation (not of the resulting file!) +, name ? "initrd" + +, strip ? true + +# Program used to compress the cpio archive; use "cat" for no compression. +# This can also be a function which takes a package set and returns the path to the compressor, +# such as `pkgs: "${pkgs.lzop}/bin/lzop"`. +, compressor ? "gzip" +, _compressorFunction ? + if lib.isFunction compressor then compressor + else if ! builtins.hasContext compressor && builtins.hasAttr compressor compressors then compressors.${compressor}.executable + else _: compressor +, _compressorExecutable ? _compressorFunction pkgsBuildHost +, _compressorName ? compressorName _compressorExecutable +, _compressorMeta ? compressors.${_compressorName} or {} + +# List of arguments to pass to the compressor program, or null to use its defaults +, compressorArgs ? null +, _compressorArgsReal ? if compressorArgs == null then _compressorMeta.defaultArgs or [] else compressorArgs + +# Filename extension to use for the compressed initramfs. This is +# included for clarity, but $out/initrd will always be a symlink to +# the final image. +# If this isn't guessed, you may want to complete the metadata above and send a PR :) +, extension ? _compressorMeta.extension or + (throw "Unrecognised compressor ${_compressorName}, please specify filename extension") + +# List of { object = path_or_derivation; symlink = "/path"; } +# The paths are copied into the initramfs in their nix store path +# form, then linked at the root according to `symlink`. +, contents + +# List of uncompressed cpio files to prepend to the initramfs. This +# can be used to add files in specified paths without them becoming +# symlinks to store paths. +, prepend ? [] + +# Whether to wrap the initramfs in a u-boot image. +, makeUInitrd ? stdenvNoCC.hostPlatform.linux-kernel.target == "uImage" + +# If generating a u-boot image, the architecture to use. The default +# guess may not align with u-boot's nomenclature correctly, so it can +# be overridden. +# See https://gitlab.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L81-106 for a list. +, uInitrdArch ? stdenvNoCC.hostPlatform.ubootArch + +# The name of the compression, as recognised by u-boot. +# See https://gitlab.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L195-204 for a list. +# If this isn't guessed, you may want to complete the metadata above and send a PR :) +, uInitrdCompression ? _compressorMeta.ubootName or + (throw "Unrecognised compressor ${_compressorName}, please specify uInitrdCompression") +}: runCommand name ({ + compress = "${_compressorExecutable} ${lib.escapeShellArgs _compressorArgsReal}"; + passthru = { + compressorExecutableFunction = _compressorFunction; + compressorArgs = _compressorArgsReal; + }; + + inherit extension makeUInitrd uInitrdArch prepend; + ${if makeUInitrd then "uInitrdCompression" else null} = uInitrdCompression; + + passAsFile = ["contents"]; + contents = lib.concatMapStringsSep "\n" ({ object, symlink, ... }: "${object}\n${lib.optionalString (symlink != null) symlink}") contents + "\n"; + + nativeBuildInputs = [makeInitrdNGTool libarchive] ++ lib.optional makeUInitrd ubootTools ++ lib.optional strip binutils; + + STRIP = if strip then "${pkgsBuildHost.binutils.targetPrefix}strip" else null; +}) '' + mkdir -p ./root/var/empty + make-initrd-ng "$contentsPath" ./root + mkdir "$out" + (cd root && find . -exec touch -h -d '@1' '{}' +) + for PREP in $prepend; do + cat $PREP >> $out/initrd + done + (cd root && find . -print0 | sort -z | bsdtar --uid 0 --gid 0 -cnf - -T - | bsdtar --null -cf - --format=newc @- | eval -- $compress >> "$out/initrd") + + if [ -n "$makeUInitrd" ]; then + mkimage -A "$uInitrdArch" -O linux -T ramdisk -C "$uInitrdCompression" -d "$out/initrd" $out/initrd.img + # Compatibility symlink + ln -sf "initrd.img" "$out/initrd" + else + ln -s "initrd" "$out/initrd$extension" + fi +'' diff --git a/pkgs/build-support/kernel/make-initrd-ng/Cargo.lock b/pkgs/build-support/kernel/make-initrd-ng/Cargo.lock new file mode 100644 index 0000000..61f71f6 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng/Cargo.lock @@ -0,0 +1,111 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "make-initrd-ng" +version = "0.1.0" +dependencies = [ + "eyre", + "goblin", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/pkgs/build-support/kernel/make-initrd-ng/Cargo.toml b/pkgs/build-support/kernel/make-initrd-ng/Cargo.toml new file mode 100644 index 0000000..028833c --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "make-initrd-ng" +version = "0.1.0" +authors = ["Will Fancher "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +eyre = "0.6.8" +goblin = "0.5.0" diff --git a/pkgs/build-support/kernel/make-initrd-ng/README.md b/pkgs/build-support/kernel/make-initrd-ng/README.md new file mode 100644 index 0000000..d92b7ea --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng/README.md @@ -0,0 +1,82 @@ +# What is this for? + +NixOS's traditional initrd is generated by listing the paths that +should be included in initrd and copying the full runtime closure of +those paths into the archive. For most things, like almost any +executable, this involves copying the entirety of huge packages like +glibc, when only things like the shared library files are needed. To +solve this, NixOS does a variety of patchwork to edit the files being +copied in so they only refer to small, patched up paths. For instance, +executables and their shared library dependencies are copied into an +`extraUtils` derivation, and every ELF file is patched to refer to +files in that output. + +The problem with this is that it is often difficult to correctly patch +some things. For instance, systemd bakes the path to the `mount` +command into the binary, so patchelf is no help. Instead, it's very +often easier to simply copy the desired files to their original store +locations in initrd and not copy their entire runtime closure. This +does mean that it is the burden of the developer to ensure that all +necessary dependencies are copied in, as closures won't be +consulted. However, it is rare that full closures are actually +desirable, so in the traditional initrd, the developer was likely to +do manual work on patching the dependencies explicitly anyway. + +# How it works + +This program is similar to its inspiration (`find-libs` from the +traditional initrd), except that it also handles symlinks and +directories according to certain rules. As input, it receives a +sequence of pairs of paths. The first path is an object to copy into +initrd. The second path (if not empty) is the path to a symlink that +should be placed in the initrd, pointing to that object. How that +object is copied depends on its type. + +1. A regular file is copied directly to the same absolute path in the + initrd. + + - If it is *also* an ELF file, then all of its direct shared + library dependencies are also listed as objects to be copied. + + - If an unwrapped file exists as `.[filename]-wrapped`, then it is + also listed as an object to be copied. + +2. A directory's direct children are listed as objects to be copied, + and a directory at the same absolute path in the initrd is created. + +3. A symlink's target is listed as an object to be copied. + +There are a couple of quirks to mention here. First, the term "object" +refers to the final file path that the developer intends to have +copied into initrd. This means any parent directory is not considered +an object just because its child was listed as an object in the +program input; instead those intermediate directories are simply +created in support of the target object. Second, shared libraries, +directory children, and symlink targets aren't immediately recursed, +because they simply get listed as objects themselves, and are +therefore traversed when they themselves are processed. Finally, +symlinks in the intermediate directories leading to an object are +preserved, meaning an input object `/a/symlink/b` will just result in +initrd containing `/a/symlink -> /target/b` and `/target/b`, even if +`/target` has other children. Preserving symlinks in this manner is +important for things like systemd. + +These rules automate the most important and obviously necessary +copying that needs to be done in most cases, allowing programs and +configuration files to go unpatched, while keeping the content of the +initrd to a minimum. + +# Why Rust? + +- A prototype of this logic was written in Bash, in an attempt to keep + with its `find-libs` ancestor, but that program was difficult to + write, and ended up taking several minutes to run. This program runs + in less than a second, and the code is substantially easier to work + with. + +- This will not require end users to install a rust toolchain to use + NixOS, as long as this tool is cached by Hydra. And if you're + bootstrapping NixOS from source, rustc is already required anyway. + +- Rust was favored over Python for its type system, and because if you + want to go fast, why not go *really fast*? diff --git a/pkgs/build-support/kernel/make-initrd-ng/src/main.rs b/pkgs/build-support/kernel/make-initrd-ng/src/main.rs new file mode 100644 index 0000000..daa6889 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng/src/main.rs @@ -0,0 +1,268 @@ +use std::collections::{HashSet, VecDeque}; +use std::env; +use std::ffi::{OsStr, OsString}; +use std::fs; +use std::hash::Hash; +use std::io::{BufRead, BufReader}; +use std::iter::FromIterator; +use std::os::unix; +use std::path::{Component, Path, PathBuf}; +use std::process::Command; + +use eyre::Context; +use goblin::{elf::Elf, Object}; + +struct NonRepeatingQueue { + queue: VecDeque, + seen: HashSet, +} + +impl NonRepeatingQueue { + fn new() -> NonRepeatingQueue { + NonRepeatingQueue { + queue: VecDeque::new(), + seen: HashSet::new(), + } + } +} + +impl NonRepeatingQueue { + fn push_back(&mut self, value: T) -> bool { + if self.seen.contains(&value) { + false + } else { + self.seen.insert(value.clone()); + self.queue.push_back(value); + true + } + } + + fn pop_front(&mut self) -> Option { + self.queue.pop_front() + } +} + +fn add_dependencies + AsRef>( + source: P, + elf: Elf, + queue: &mut NonRepeatingQueue>, +) { + if let Some(interp) = elf.interpreter { + queue.push_back(Box::from(Path::new(interp))); + } + + let rpaths = if elf.runpaths.len() > 0 { + elf.runpaths + } else if elf.rpaths.len() > 0 { + elf.rpaths + } else { + vec![] + }; + + let rpaths_as_path = rpaths + .into_iter() + .flat_map(|p| p.split(":")) + .map(|p| Box::::from(Path::new(p))) + .collect::>(); + + for line in elf.libraries { + let mut found = false; + for path in &rpaths_as_path { + let lib = path.join(line); + if lib.exists() { + // No need to recurse. The queue will bring it back round. + queue.push_back(Box::from(lib.as_path())); + found = true; + break; + } + } + if !found { + // glibc makes it tricky to make this an error because + // none of the files have a useful rpath. + println!( + "Warning: Couldn't satisfy dependency {} for {:?}", + line, + OsStr::new(&source) + ); + } + } +} + +fn copy_file< + P: AsRef + AsRef + std::fmt::Debug, + S: AsRef + AsRef + std::fmt::Debug, +>( + source: P, + target: S, + queue: &mut NonRepeatingQueue>, +) -> eyre::Result<()> { + fs::copy(&source, &target) + .wrap_err_with(|| format!("failed to copy {:?} to {:?}", source, target))?; + + let contents = + fs::read(&source).wrap_err_with(|| format!("failed to read from {:?}", source))?; + + if let Ok(Object::Elf(e)) = Object::parse(&contents) { + add_dependencies(source, e, queue); + + // Make file writable to strip it + let mut permissions = fs::metadata(&target) + .wrap_err_with(|| format!("failed to get metadata for {:?}", target))? + .permissions(); + permissions.set_readonly(false); + fs::set_permissions(&target, permissions) + .wrap_err_with(|| format!("failed to set readonly flag to false for {:?}", target))?; + + // Strip further than normal + if let Ok(strip) = env::var("STRIP") { + if !Command::new(strip) + .arg("--strip-all") + .arg(OsStr::new(&target)) + .output()? + .status + .success() + { + println!("{:?} was not successfully stripped.", OsStr::new(&target)); + } + } + }; + + Ok(()) +} + +fn queue_dir + std::fmt::Debug>( + source: P, + queue: &mut NonRepeatingQueue>, +) -> eyre::Result<()> { + for entry in + fs::read_dir(&source).wrap_err_with(|| format!("failed to read dir {:?}", source))? + { + let entry = entry?; + // No need to recurse. The queue will bring us back round here on its own. + queue.push_back(Box::from(entry.path().as_path())); + } + + Ok(()) +} + +fn handle_path( + root: &Path, + p: &Path, + queue: &mut NonRepeatingQueue>, +) -> eyre::Result<()> { + let mut source = PathBuf::new(); + let mut target = Path::new(root).to_path_buf(); + let mut iter = p.components().peekable(); + while let Some(comp) = iter.next() { + match comp { + Component::Prefix(_) => panic!("This tool is not meant for Windows"), + Component::RootDir => { + target.clear(); + target.push(root); + source.clear(); + source.push("/"); + } + Component::CurDir => {} + Component::ParentDir => { + // Don't over-pop the target if the path has too many ParentDirs + if source.pop() { + target.pop(); + } + } + Component::Normal(name) => { + target.push(name); + source.push(name); + let typ = fs::symlink_metadata(&source) + .wrap_err_with(|| format!("failed to get symlink metadata for {:?}", source))? + .file_type(); + if typ.is_file() && !target.exists() { + copy_file(&source, &target, queue)?; + + if let Some(filename) = source.file_name() { + source.set_file_name(OsString::from_iter([ + OsStr::new("."), + filename, + OsStr::new("-wrapped"), + ])); + + let wrapped_path = source.as_path(); + if wrapped_path.exists() { + queue.push_back(Box::from(wrapped_path)); + } + } + } else if typ.is_symlink() { + let link_target = fs::read_link(&source) + .wrap_err_with(|| format!("failed to resolve symlink of {:?}", source))?; + + // Create the link, then push its target to the queue + if !target.exists() && !target.is_symlink() { + unix::fs::symlink(&link_target, &target).wrap_err_with(|| { + format!("failed to symlink {:?} to {:?}", link_target, target) + })?; + } + source.pop(); + source.push(link_target); + while let Some(c) = iter.next() { + source.push(c); + } + let link_target_path = source.as_path(); + if link_target_path.exists() { + queue.push_back(Box::from(link_target_path)); + } + break; + } else if typ.is_dir() { + if !target.exists() { + fs::create_dir(&target) + .wrap_err_with(|| format!("failed to create dir {:?}", target))?; + } + + // Only recursively copy if the directory is the target object + if iter.peek().is_none() { + queue_dir(&source, queue) + .wrap_err_with(|| format!("failed to queue dir {:?}", source))?; + } + } + } + } + } + + Ok(()) +} + +fn main() -> eyre::Result<()> { + let args: Vec = env::args().collect(); + let input = + fs::File::open(&args[1]).wrap_err_with(|| format!("failed to open file {:?}", &args[1]))?; + let output = &args[2]; + let out_path = Path::new(output); + + let mut queue = NonRepeatingQueue::>::new(); + + let mut lines = BufReader::new(input).lines(); + while let Some(obj) = lines.next() { + // Lines should always come in pairs + let obj = obj?; + let sym = lines.next().unwrap()?; + + let obj_path = Path::new(&obj); + queue.push_back(Box::from(obj_path)); + if !sym.is_empty() { + println!("{} -> {}", &sym, &obj); + // We don't care about preserving symlink structure here + // nearly as much as for the actual objects. + let link_string = format!("{}/{}", output, sym); + let link_path = Path::new(&link_string); + let mut link_parent = link_path.to_path_buf(); + link_parent.pop(); + fs::create_dir_all(&link_parent) + .wrap_err_with(|| format!("failed to create directories to {:?}", link_parent))?; + unix::fs::symlink(obj_path, link_path) + .wrap_err_with(|| format!("failed to symlink {:?} to {:?}", obj_path, link_path))?; + } + } + while let Some(obj) = queue.pop_front() { + handle_path(out_path, &*obj, &mut queue)?; + } + + Ok(()) +} diff --git a/pkgs/build-support/kernel/make-initrd-ng/update.sh b/pkgs/build-support/kernel/make-initrd-ng/update.sh new file mode 100755 index 0000000..ffc5ad3 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd-ng/update.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p cargo -i bash +cd "$(dirname "$0")" +cargo update diff --git a/pkgs/build-support/kernel/make-initrd.nix b/pkgs/build-support/kernel/make-initrd.nix new file mode 100644 index 0000000..9c27a14 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd.nix @@ -0,0 +1,113 @@ +# Create an initramfs containing the closure of the specified +# file system objects. An initramfs is used during the initial +# stages of booting a Linux system. It is loaded by the boot loader +# along with the kernel image. It's supposed to contain everything +# (such as kernel modules) necessary to allow us to mount the root +# file system. Once the root file system is mounted, the `real' boot +# script can be called. +# +# An initramfs is a cpio archive, and may be compressed with a number +# of algorithms. +let + # Some metadata on various compression programs, relevant to naming + # the initramfs file and, if applicable, generating a u-boot image + # from it. + compressors = import ./initrd-compressor-meta.nix; + # Get the basename of the actual compression program from the whole + # compression command, for the purpose of guessing the u-boot + # compression type and filename extension. + compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1; +in +{ stdenvNoCC, perl, libarchive, ubootTools, lib, pkgsBuildHost +# Name of the derivation (not of the resulting file!) +, name ? "initrd" + +# Program used to compress the cpio archive; use "cat" for no compression. +# This can also be a function which takes a package set and returns the path to the compressor, +# such as `pkgs: "${pkgs.lzop}/bin/lzop"`. +, compressor ? "gzip" +, _compressorFunction ? + if lib.isFunction compressor then compressor + else if ! builtins.hasContext compressor && builtins.hasAttr compressor compressors then compressors.${compressor}.executable + else _: compressor +, _compressorExecutable ? _compressorFunction pkgsBuildHost +, _compressorName ? compressorName _compressorExecutable +, _compressorMeta ? compressors.${_compressorName} or {} + +# List of arguments to pass to the compressor program, or null to use its defaults +, compressorArgs ? null +, _compressorArgsReal ? if compressorArgs == null then _compressorMeta.defaultArgs or [] else compressorArgs + +# Filename extension to use for the compressed initramfs. This is +# included for clarity, but $out/initrd will always be a symlink to +# the final image. +# If this isn't guessed, you may want to complete the metadata above and send a PR :) +, extension ? _compressorMeta.extension or + (throw "Unrecognised compressor ${_compressorName}, please specify filename extension") + +# List of { object = path_or_derivation; symlink = "/path"; } +# The paths are copied into the initramfs in their nix store path +# form, then linked at the root according to `symlink`. +, contents + +# List of uncompressed cpio files to prepend to the initramfs. This +# can be used to add files in specified paths without them becoming +# symlinks to store paths. +, prepend ? [] + +# Whether to wrap the initramfs in a u-boot image. +, makeUInitrd ? stdenvNoCC.hostPlatform.linux-kernel.target == "uImage" + +# If generating a u-boot image, the architecture to use. The default +# guess may not align with u-boot's nomenclature correctly, so it can +# be overridden. +# See https://gitlab.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L81-106 for a list. +, uInitrdArch ? stdenvNoCC.hostPlatform.linuxArch + +# The name of the compression, as recognised by u-boot. +# See https://gitlab.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L195-204 for a list. +# If this isn't guessed, you may want to complete the metadata above and send a PR :) +, uInitrdCompression ? _compressorMeta.ubootName or + (throw "Unrecognised compressor ${_compressorName}, please specify uInitrdCompression") +}: +let + # !!! Move this into a public lib function, it is probably useful for others + toValidStoreName = x: with builtins; + lib.concatStringsSep "-" (filter (x: !(isList x)) (split "[^a-zA-Z0-9_=.?-]+" x)); + +in stdenvNoCC.mkDerivation rec { + inherit name makeUInitrd extension uInitrdArch prepend; + + ${if makeUInitrd then "uInitrdCompression" else null} = uInitrdCompression; + + builder = ./make-initrd.sh; + + nativeBuildInputs = [ perl libarchive ] + ++ lib.optional makeUInitrd ubootTools; + + compress = "${_compressorExecutable} ${lib.escapeShellArgs _compressorArgsReal}"; + + # Pass the function through, for reuse in append-initrd-secrets. The + # function is used instead of the string, in order to support + # cross-compilation (append-initrd-secrets running on a different + # architecture than what the main initramfs is built on). + passthru = { + compressorExecutableFunction = _compressorFunction; + compressorArgs = _compressorArgsReal; + }; + + # !!! should use XML. + objects = map (x: x.object) contents; + symlinks = map (x: x.symlink) contents; + suffices = map (x: if x ? suffix then x.suffix else "none") contents; + + # For obtaining the closure of `contents'. + # Note: we don't use closureInfo yet, as that won't build with nix-1.x. + # See #36268. + exportReferencesGraph = + lib.zipListsWith + (x: i: [("closure-${toValidStoreName (baseNameOf x.symlink)}-${toString i}") x.object]) + contents + (lib.range 0 (lib.length contents - 1)); + pathsFromGraph = ./paths-from-graph.pl; +} diff --git a/pkgs/build-support/kernel/make-initrd.sh b/pkgs/build-support/kernel/make-initrd.sh new file mode 100644 index 0000000..8f64114 --- /dev/null +++ b/pkgs/build-support/kernel/make-initrd.sh @@ -0,0 +1,51 @@ +source $stdenv/setup + +set -o pipefail + +objects=($objects) +symlinks=($symlinks) +suffices=($suffices) + +mkdir root + +# Needed for splash_helper, which gets run before init. +mkdir root/dev +mkdir root/sys +mkdir root/proc + + +for ((n = 0; n < ${#objects[*]}; n++)); do + object=${objects[$n]} + symlink=${symlinks[$n]} + suffix=${suffices[$n]} + if test "$suffix" = none; then suffix=; fi + + mkdir -p $(dirname root/$symlink) + ln -s $object$suffix root/$symlink +done + + +# Get the paths in the closure of `object'. +storePaths=$(perl $pathsFromGraph closure-*) + + +# Paths in cpio archives *must* be relative, otherwise the kernel +# won't unpack 'em. +(cd root && cp -prP --parents $storePaths .) + + +# Put the closure in a gzipped cpio archive. +mkdir -p $out +for PREP in $prepend; do + cat $PREP >> $out/initrd +done +(cd root && find * .[^.*] -exec touch -h -d '@1' '{}' +) +(cd root && find * .[^.*] -print0 | sort -z | bsdtar --uid 0 --gid 0 -cnf - -T - | bsdtar --null -cf - --format=newc @- | eval -- $compress >> "$out/initrd") + +if [ -n "$makeUInitrd" ]; then + mkimage -A "$uInitrdArch" -O linux -T ramdisk -C "$uInitrdCompression" -d "$out/initrd" $out/initrd.img + # Compatibility symlink + ln -sf "initrd.img" "$out/initrd" +else + ln -s "initrd" "$out/initrd$extension" +fi diff --git a/pkgs/build-support/kernel/modules-closure.nix b/pkgs/build-support/kernel/modules-closure.nix new file mode 100644 index 0000000..d82e279 --- /dev/null +++ b/pkgs/build-support/kernel/modules-closure.nix @@ -0,0 +1,15 @@ +# Given a kernel build (with modules in $kernel/lib/modules/VERSION), +# produce a module tree in $out/lib/modules/VERSION that contains only +# the modules identified by `rootModules', plus their dependencies. +# Also generate an appropriate modules.dep. + +{ stdenvNoCC, kernel, firmware, nukeReferences, rootModules +, kmod, allowMissing ? false }: + +stdenvNoCC.mkDerivation { + name = kernel.name + "-shrunk"; + builder = ./modules-closure.sh; + nativeBuildInputs = [ nukeReferences kmod ]; + inherit kernel firmware rootModules allowMissing; + allowedReferences = ["out"]; +} diff --git a/pkgs/build-support/kernel/modules-closure.sh b/pkgs/build-support/kernel/modules-closure.sh new file mode 100644 index 0000000..5f61bac --- /dev/null +++ b/pkgs/build-support/kernel/modules-closure.sh @@ -0,0 +1,100 @@ +source $stdenv/setup + +# When no modules are built, the $out/lib/modules directory will not +# exist. Because the rest of the script assumes it does exist, we +# handle this special case first. +if ! test -d "$kernel/lib/modules"; then + if test -z "$rootModules" || test -n "$allowMissing"; then + mkdir -p "$out" + exit 0 + else + echo "Required modules: $rootModules" + echo "Can not derive a closure of kernel modules because no modules were provided." + exit 1 + fi +fi + +version=$(cd $kernel/lib/modules && ls -d *) + +echo "kernel version is $version" + +# Determine the dependencies of each root module. +mkdir -p $out/lib/modules/"$version" +touch closure +for module in $rootModules; do + echo "root module: $module" + modprobe --config no-config -d $kernel --set-version "$version" --show-depends "$module" \ + | while read cmd module args; do + case "$cmd" in + builtin) + touch found + echo "$module" >>closure + echo " builtin dependency: $module";; + insmod) + touch found + if ! test -e "$module"; then + echo " dependency not found: $module" + exit 1 + fi + target=$(echo "$module" | sed "s^$NIX_STORE.*/lib/modules/^$out/lib/modules/^") + if test -e "$target"; then + echo " dependency already copied: $module" + continue + fi + echo "$module" >>closure + echo " copying dependency: $module" + mkdir -p $(dirname $target) + cp "$module" "$target" + # If the kernel is compiled with coverage instrumentation, it + # contains the paths of the *.gcda coverage data output files + # (which it doesn't actually use...). Get rid of them to prevent + # the whole kernel from being included in the initrd. + nuke-refs "$target" + echo "$target" >> $out/insmod-list;; + *) + echo " unexpected modprobe output: $cmd $module" + exit 1;; + esac + done || test -n "$allowMissing" + if ! test -e found; then + echo " not found" + if test -z "$allowMissing"; then + exit 1 + fi + else + rm found + fi +done + +cd "$firmware" +for module in $(< ~-/closure); do + # for builtin modules, modinfo will reply with a wrong output looking like: + # $ modinfo -F firmware unix + # name: unix + # + # There is a pending attempt to fix this: + # https://github.com/NixOS/nixpkgs/pull/96153 + # https://lore.kernel.org/linux-modules/20200823215433.j5gc5rnsmahpf43v@blumerang/T/#u + # + # For now, the workaround is just to filter out the extraneous lines out + # of its output. + modinfo -b $kernel --set-version "$version" -F firmware $module | grep -v '^name:' | while read -r i; do + echo "firmware for $module: $i" + for name in "$i" "$i.xz" ""; do + [ -z "$name" ] && echo "WARNING: missing firmware $i for module $module" + if cp -v --parents --no-preserve=mode lib/firmware/$name "$out" 2>/dev/null; then + break + fi + done + done || : +done + +# copy module ordering hints for depmod +cp $kernel/lib/modules/"$version"/modules.order $out/lib/modules/"$version"/. +cp $kernel/lib/modules/"$version"/modules.builtin $out/lib/modules/"$version"/. + +depmod -b $out -a $version + +# remove original hints from final derivation +rm $out/lib/modules/"$version"/modules.order +rm $out/lib/modules/"$version"/modules.builtin diff --git a/pkgs/build-support/kernel/paths-from-graph.pl b/pkgs/build-support/kernel/paths-from-graph.pl new file mode 100644 index 0000000..1465b73 --- /dev/null +++ b/pkgs/build-support/kernel/paths-from-graph.pl @@ -0,0 +1,68 @@ +# NOTE: this script is deprecated. Use closureInfo instead. + +# Parses a /nix/store/*-closure file and prints +# various information. +# By default, the nodes in the graph are printed to stdout. +# If printRegistration is set, then the graph is written +# as a registration file for a manifest is written +# in the `nix-store --load-db' format. + +use strict; +use File::Basename; + +my %storePaths; +my %refs; + +# Each argument on the command line is a graph file. +# The graph file contains line-triples and a variable +# number of references: +# +# +# +# +# ... +# +foreach my $graph (@ARGV) { + open GRAPH, "<$graph" or die; + + while () { + chomp; + my $storePath = "$_"; + $storePaths{$storePath} = 1; + + my $deriver = ; chomp $deriver; + my $count = ; chomp $count; + + my @refs = (); + for (my $i = 0; $i < $count; ++$i) { + my $ref = ; chomp $ref; + push @refs, $ref; + } + $refs{$storePath} = \@refs; + + } + + close GRAPH; +} + + +if ($ENV{"printRegistration"} eq "1") { + # This is the format used by `nix-store --register-validity + # --hash-given' / `nix-store --load-db'. + foreach my $storePath (sort (keys %storePaths)) { + print "$storePath\n"; + print "0000000000000000000000000000000000000000000000000000000000000000\n"; # !!! fix + print "0\n"; # !!! fix + print "\n"; # don't care about preserving the deriver + print scalar(@{$refs{$storePath}}), "\n"; + foreach my $ref (@{$refs{$storePath}}) { + print "$ref\n"; + } + } +} + +else { + foreach my $storePath (sort (keys %storePaths)) { + print "$storePath\n"; + } +} diff --git a/pkgs/build-support/lib/cmake.nix b/pkgs/build-support/lib/cmake.nix new file mode 100644 index 0000000..57fa586 --- /dev/null +++ b/pkgs/build-support/lib/cmake.nix @@ -0,0 +1,32 @@ +{ stdenv, lib }: + +let + inherit (lib) findFirst isString optional optionals; + + cmakeFlags' = + optionals (stdenv.hostPlatform != stdenv.buildPlatform) ([ + "-DCMAKE_SYSTEM_NAME=${findFirst isString "Generic" (optional (!stdenv.hostPlatform.isRedox) stdenv.hostPlatform.uname.system)}" + ] ++ optionals (stdenv.hostPlatform.uname.processor != null) [ + "-DCMAKE_SYSTEM_PROCESSOR=${stdenv.hostPlatform.uname.processor}" + ] ++ optionals (stdenv.hostPlatform.uname.release != null) [ + "-DCMAKE_SYSTEM_VERSION=${stdenv.hostPlatform.uname.release}" + ] ++ optionals (stdenv.hostPlatform.isDarwin) [ + "-DCMAKE_OSX_ARCHITECTURES=${stdenv.hostPlatform.darwinArch}" + ] ++ optionals (stdenv.buildPlatform.uname.system != null) [ + "-DCMAKE_HOST_SYSTEM_NAME=${stdenv.buildPlatform.uname.system}" + ] ++ optionals (stdenv.buildPlatform.uname.processor != null) [ + "-DCMAKE_HOST_SYSTEM_PROCESSOR=${stdenv.buildPlatform.uname.processor}" + ] ++ optionals (stdenv.buildPlatform.uname.release != null) [ + "-DCMAKE_HOST_SYSTEM_VERSION=${stdenv.buildPlatform.uname.release}" + ] ++ optionals (stdenv.buildPlatform.canExecute stdenv.hostPlatform) [ + "-DCMAKE_CROSSCOMPILING_EMULATOR=env" + ] ++ optionals stdenv.hostPlatform.isStatic [ + "-DCMAKE_LINK_SEARCH_START_STATIC=ON" + ]); + + makeCMakeFlags = { cmakeFlags ? [], ... }: cmakeFlags ++ cmakeFlags'; + +in +{ + inherit makeCMakeFlags; +} diff --git a/pkgs/build-support/lib/meson.nix b/pkgs/build-support/lib/meson.nix new file mode 100644 index 0000000..456c10f --- /dev/null +++ b/pkgs/build-support/lib/meson.nix @@ -0,0 +1,35 @@ +{ stdenv, lib }: + +let + inherit (lib) boolToString optionals; + + # See https://mesonbuild.com/Reference-tables.html#cpu-families + cpuFamily = platform: with platform; + /**/ if isAarch32 then "arm" + else if isx86_32 then "x86" + else platform.uname.processor; + + crossFile = builtins.toFile "cross-file.conf" '' + [properties] + bindgen_clang_arguments = ['-target', '${stdenv.targetPlatform.config}'] + needs_exe_wrapper = ${boolToString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform)} + + [host_machine] + system = '${stdenv.targetPlatform.parsed.kernel.name}' + cpu_family = '${cpuFamily stdenv.targetPlatform}' + cpu = '${stdenv.targetPlatform.parsed.cpu.name}' + endian = ${if stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"} + + [binaries] + llvm-config = 'llvm-config-native' + rust = ['rustc', '--target', '${stdenv.targetPlatform.rust.rustcTargetSpec}'] + ''; + + crossFlags = optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ "--cross-file=${crossFile}" ]; + + makeMesonFlags = { mesonFlags ? [], ... }: crossFlags ++ mesonFlags; + +in +{ + inherit makeMesonFlags; +} diff --git a/pkgs/build-support/libredirect/default.nix b/pkgs/build-support/libredirect/default.nix new file mode 100644 index 0000000..1ab4a0d --- /dev/null +++ b/pkgs/build-support/libredirect/default.nix @@ -0,0 +1,122 @@ +{ lib, stdenv, bintools-unwrapped, llvmPackages, llvmPackages_13, coreutils }: + +let + # aarch64-darwin needs a clang that can build arm64e binaries, so make sure a version of LLVM + # is used that can do that, but prefer the stdenv one if it is new enough. + llvmPkgs = if (lib.versionAtLeast (lib.getVersion llvmPackages.clang) "13") + then llvmPackages + else llvmPackages_13; + in +if stdenv.hostPlatform.isStatic +then throw '' + libredirect is not available on static builds. + + Please fix your derivation to not depend on libredirect on static + builds, using something like following: + + nativeBuildInputs = + lib.optional (!stdenv.buildPlatform.isStatic) libredirect; + + and disable tests as necessary, although fixing tests to work without + libredirect is even better. + + libredirect uses LD_PRELOAD feature of dynamic loader and does not + work on static builds where dynamic loader is not used. + '' +else stdenv.mkDerivation rec { + pname = "libredirect"; + version = "0"; + + unpackPhase = '' + cp ${./libredirect.c} libredirect.c + cp ${./test.c} test.c + ''; + + outputs = ["out" "hook"]; + + libName = "libredirect" + stdenv.hostPlatform.extensions.sharedLibrary; + + buildPhase = '' + runHook preBuild + + ${if stdenv.isDarwin && stdenv.isAarch64 then '' + # We need the unwrapped binutils and clang: + # We also want to build a fat library with x86_64, arm64, arm64e in there. + # Because we use the unwrapped tools, we need to provide -isystem for headers + # and the library search directory for libdl. + # We can't build this on x86_64, because the libSystem we point to doesn't + # like arm64(e). + PATH=${bintools-unwrapped}/bin:${llvmPkgs.clang-unwrapped}/bin:$PATH \ + clang -arch x86_64 -arch arm64 -arch arm64e \ + -isystem ${llvmPkgs.clang.libc}/include \ + -isystem ${llvmPkgs.libclang.lib}/lib/clang/*/include \ + -L${llvmPkgs.clang.libc}/lib \ + -Wl,-install_name,$libName \ + -Wall -std=c99 -O3 -fPIC libredirect.c \ + -shared -o "$libName" + '' else if stdenv.isDarwin then '' + $CC -Wall -std=c99 -O3 -fPIC libredirect.c \ + -Wl,-install_name,$out/lib/$libName \ + -shared -o "$libName" + '' else '' + $CC -Wall -std=c99 -O3 -fPIC libredirect.c \ + -shared -o "$libName" + ''} + + if [ -n "$doInstallCheck" ]; then + $CC -Wall -std=c99 \ + ${lib.optionalString (!stdenv.isDarwin) "-D_GNU_SOURCE"} \ + -O3 test.c -o test + fi + + runHook postBuild + ''; + + # We want to retain debugging info to be able to use GDB on libredirect.so + # to more easily investigate which function overrides are missing or why + # existing ones do not have the intended effect. + dontStrip = true; + + installPhase = '' + runHook preInstall + + install -vD "$libName" "$out/lib/$libName" + + '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' + # dylib will be rejected unless dylib rpath gets explictly set + install_name_tool \ + -change $libName $out/lib/$libName \ + $out/lib/$libName + '' + '' + # Provide a setup hook that injects our library into every process. + mkdir -p "$hook/nix-support" + cat < "$hook/nix-support/setup-hook" + ${if stdenv.isDarwin then '' + export DYLD_INSERT_LIBRARIES="$out/lib/$libName" + '' else '' + export LD_PRELOAD="$out/lib/$libName" + ''} + SETUP_HOOK + + runHook postInstall + ''; + + doInstallCheck = true; + + installCheckPhase = '' + ( + source "$hook/nix-support/setup-hook" + NIX_REDIRECTS="/foo/bar/test=${coreutils}/bin/true:/bar/baz=$(mktemp -d)" ./test + ) + ''; + + meta = with lib; { + platforms = platforms.unix; + description = "An LD_PRELOAD library to intercept and rewrite the paths in glibc calls"; + longDescription = '' + libredirect is an LD_PRELOAD library to intercept and rewrite the paths in + glibc calls based on the value of $NIX_REDIRECTS, a colon-separated list + of path prefixes to be rewritten, e.g. "/src=/dst:/usr/=/nix/store/". + ''; + }; +} diff --git a/pkgs/build-support/libredirect/libredirect.c b/pkgs/build-support/libredirect/libredirect.c new file mode 100644 index 0000000..fdbdcb6 --- /dev/null +++ b/pkgs/build-support/libredirect/libredirect.c @@ -0,0 +1,530 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_REDIRECTS 128 + +#ifdef __APPLE__ + struct dyld_interpose { + const void * replacement; + const void * replacee; + }; + #define WRAPPER(ret, name) static ret _libredirect_wrapper_##name + #define LOOKUP_REAL(name) &name + #define WRAPPER_DEF(name) \ + __attribute__((used)) static struct dyld_interpose _libredirect_interpose_##name \ + __attribute__((section("__DATA,__interpose"))) = { &_libredirect_wrapper_##name, &name }; +#else + #define WRAPPER(ret, name) ret name + #define LOOKUP_REAL(name) dlsym(RTLD_NEXT, #name) + #define WRAPPER_DEF(name) +#endif + +static int nrRedirects = 0; +static char * from[MAX_REDIRECTS]; +static char * to[MAX_REDIRECTS]; + +static int isInitialized = 0; + +// FIXME: might run too late. +static void init() __attribute__((constructor)); + +static void init() +{ + if (isInitialized) return; + + char * spec = getenv("NIX_REDIRECTS"); + if (!spec) return; + + // Ensure we only run this code once. + // We do not do `unsetenv("NIX_REDIRECTS")` to ensure that redirects + // also get initialized for subprocesses. + isInitialized = 1; + + char * spec2 = malloc(strlen(spec) + 1); + strcpy(spec2, spec); + + char * pos = spec2, * eq; + while ((eq = strchr(pos, '='))) { + *eq = 0; + from[nrRedirects] = pos; + pos = eq + 1; + to[nrRedirects] = pos; + nrRedirects++; + if (nrRedirects == MAX_REDIRECTS) break; + char * end = strchr(pos, ':'); + if (!end) break; + *end = 0; + pos = end + 1; + } + +} + +static const char * rewrite(const char * volatile path, char * buf) +{ + // Marking the path volatile is needed so the the following check isn't + // optimized away by the compiler. + if (path == NULL) return path; + + for (int n = 0; n < nrRedirects; ++n) { + int len = strlen(from[n]); + if (strncmp(path, from[n], len) != 0) continue; + if (snprintf(buf, PATH_MAX, "%s%s", to[n], path + len) >= PATH_MAX) + abort(); + return buf; + } + + return path; +} + +static char * rewrite_non_const(char * path, char * buf) +{ + // as long as the argument `path` is non-const, we can consider discarding + // the const qualifier of the return value to be safe. + return (char *)rewrite(path, buf); +} + +static int open_needs_mode(int flags) +{ +#ifdef O_TMPFILE + return (flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE; +#else + return flags & O_CREAT; +#endif +} + +/* The following set of Glibc library functions is very incomplete - + it contains only what we needed for programs in Nixpkgs. Just add + more functions as needed. */ + +WRAPPER(int, open)(const char * path, int flags, ...) +{ + int (*open_real) (const char *, int, ...) = LOOKUP_REAL(open); + mode_t mode = 0; + if (open_needs_mode(flags)) { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + } + char buf[PATH_MAX]; + return open_real(rewrite(path, buf), flags, mode); +} +WRAPPER_DEF(open) + +// In musl libc, open64 is simply a macro for open +#if !defined(__APPLE__) && !defined(open64) +WRAPPER(int, open64)(const char * path, int flags, ...) +{ + int (*open64_real) (const char *, int, mode_t) = LOOKUP_REAL(open64); + mode_t mode = 0; + if (open_needs_mode(flags)) { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + } + char buf[PATH_MAX]; + return open64_real(rewrite(path, buf), flags, mode); +} +WRAPPER_DEF(open64) +#endif + +WRAPPER(int, openat)(int dirfd, const char * path, int flags, ...) +{ + int (*openat_real) (int, const char *, int, ...) = LOOKUP_REAL(openat); + mode_t mode = 0; + if (open_needs_mode(flags)) { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + } + char buf[PATH_MAX]; + return openat_real(dirfd, rewrite(path, buf), flags, mode); +} +WRAPPER_DEF(openat) + +WRAPPER(FILE *, fopen)(const char * path, const char * mode) +{ + FILE * (*fopen_real) (const char *, const char *) = LOOKUP_REAL(fopen); + char buf[PATH_MAX]; + return fopen_real(rewrite(path, buf), mode); +} +WRAPPER_DEF(fopen) + +#ifdef __GLIBC__ +WRAPPER(FILE *, __nss_files_fopen)(const char * path) +{ + FILE * (*__nss_files_fopen_real) (const char *) = LOOKUP_REAL(__nss_files_fopen); + char buf[PATH_MAX]; + return __nss_files_fopen_real(rewrite(path, buf)); +} +WRAPPER_DEF(__nss_files_fopen) +#endif + +// In musl libc, fopen64 is simply a macro for fopen +#if !defined(__APPLE__) && !defined(fopen64) +WRAPPER(FILE *, fopen64)(const char * path, const char * mode) +{ + FILE * (*fopen64_real) (const char *, const char *) = LOOKUP_REAL(fopen64); + char buf[PATH_MAX]; + return fopen64_real(rewrite(path, buf), mode); +} +WRAPPER_DEF(fopen64) +#endif + +#ifdef __linux__ +WRAPPER(int, __xstat)(int ver, const char * path, struct stat * st) +{ + int (*__xstat_real) (int ver, const char *, struct stat *) = LOOKUP_REAL(__xstat); + char buf[PATH_MAX]; + return __xstat_real(ver, rewrite(path, buf), st); +} +WRAPPER_DEF(__xstat) +#endif + +#ifdef __linux__ +WRAPPER(int, __xstat64)(int ver, const char * path, struct stat64 * st) +{ + int (*__xstat64_real) (int ver, const char *, struct stat64 *) = LOOKUP_REAL(__xstat64); + char buf[PATH_MAX]; + return __xstat64_real(ver, rewrite(path, buf), st); +} +WRAPPER_DEF(__xstat64) +#endif + +#if defined(__linux__) && defined(STATX_TYPE) +WRAPPER(int, statx)(int dirfd, const char * restrict pathname, int flags, + unsigned int mask, struct statx * restrict statxbuf) +{ + int (*statx_real) (int, const char * restrict, int, + unsigned int, struct statx * restrict) = LOOKUP_REAL(statx); + char buf[PATH_MAX]; + return statx_real(dirfd, rewrite(pathname, buf), flags, mask, statxbuf); +} +WRAPPER_DEF(statx) +#endif + +WRAPPER(int, fstatat)(int dirfd, const char * pathname, struct stat * statbuf, int flags) +{ + int (*fstatat_real) (int, const char *, struct stat *, int) = LOOKUP_REAL(fstatat); + char buf[PATH_MAX]; + return fstatat_real(dirfd, rewrite(pathname, buf), statbuf, flags); +} +WRAPPER_DEF(fstatat); + +// In musl libc, fstatat64 is simply a macro for fstatat +#if !defined(__APPLE__) && !defined(fstatat64) +WRAPPER(int, fstatat64)(int dirfd, const char * pathname, struct stat64 * statbuf, int flags) +{ + int (*fstatat64_real) (int, const char *, struct stat64 *, int) = LOOKUP_REAL(fstatat64); + char buf[PATH_MAX]; + return fstatat64_real(dirfd, rewrite(pathname, buf), statbuf, flags); +} +WRAPPER_DEF(fstatat64); +#endif + +WRAPPER(int, stat)(const char * path, struct stat * st) +{ + int (*__stat_real) (const char *, struct stat *) = LOOKUP_REAL(stat); + char buf[PATH_MAX]; + return __stat_real(rewrite(path, buf), st); +} +WRAPPER_DEF(stat) + +// In musl libc, stat64 is simply a macro for stat +#if !defined(__APPLE__) && !defined(stat64) +WRAPPER(int, stat64)(const char * path, struct stat64 * st) +{ + int (*stat64_real) (const char *, struct stat64 *) = LOOKUP_REAL(stat64); + char buf[PATH_MAX]; + return stat64_real(rewrite(path, buf), st); +} +WRAPPER_DEF(stat64) +#endif + +WRAPPER(int, access)(const char * path, int mode) +{ + int (*access_real) (const char *, int mode) = LOOKUP_REAL(access); + char buf[PATH_MAX]; + return access_real(rewrite(path, buf), mode); +} +WRAPPER_DEF(access) + +WRAPPER(int, posix_spawn)(pid_t * pid, const char * path, + const posix_spawn_file_actions_t * file_actions, + const posix_spawnattr_t * attrp, + char * const argv[], char * const envp[]) +{ + int (*posix_spawn_real) (pid_t *, const char *, + const posix_spawn_file_actions_t *, + const posix_spawnattr_t *, + char * const argv[], char * const envp[]) = LOOKUP_REAL(posix_spawn); + char buf[PATH_MAX]; + return posix_spawn_real(pid, rewrite(path, buf), file_actions, attrp, argv, envp); +} +WRAPPER_DEF(posix_spawn) + +WRAPPER(int, posix_spawnp)(pid_t * pid, const char * file, + const posix_spawn_file_actions_t * file_actions, + const posix_spawnattr_t * attrp, + char * const argv[], char * const envp[]) +{ + int (*posix_spawnp_real) (pid_t *, const char *, + const posix_spawn_file_actions_t *, + const posix_spawnattr_t *, + char * const argv[], char * const envp[]) = LOOKUP_REAL(posix_spawnp); + char buf[PATH_MAX]; + return posix_spawnp_real(pid, rewrite(file, buf), file_actions, attrp, argv, envp); +} +WRAPPER_DEF(posix_spawnp) + +WRAPPER(int, execv)(const char * path, char * const argv[]) +{ + int (*execv_real) (const char * path, char * const argv[]) = LOOKUP_REAL(execv); + char buf[PATH_MAX]; + return execv_real(rewrite(path, buf), argv); +} +WRAPPER_DEF(execv) + +WRAPPER(int, execvp)(const char * path, char * const argv[]) +{ + int (*_execvp) (const char *, char * const argv[]) = LOOKUP_REAL(execvp); + char buf[PATH_MAX]; + return _execvp(rewrite(path, buf), argv); +} +WRAPPER_DEF(execvp) + +WRAPPER(int, execve)(const char * path, char * const argv[], char * const envp[]) +{ + int (*_execve) (const char *, char * const argv[], char * const envp[]) = LOOKUP_REAL(execve); + char buf[PATH_MAX]; + return _execve(rewrite(path, buf), argv, envp); +} +WRAPPER_DEF(execve) + +WRAPPER(DIR *, opendir)(const char * path) +{ + char buf[PATH_MAX]; + DIR * (*_opendir) (const char*) = LOOKUP_REAL(opendir); + + return _opendir(rewrite(path, buf)); +} +WRAPPER_DEF(opendir) + +#define SYSTEM_CMD_MAX 512 + +static char * replace_substring(char * source, char * buf, char * replace_string, char * start_ptr, char * suffix_ptr) { + char head[SYSTEM_CMD_MAX] = {0}; + strncpy(head, source, start_ptr - source); + + char tail[SYSTEM_CMD_MAX] = {0}; + if(suffix_ptr < source + strlen(source)) { + strcpy(tail, suffix_ptr); + } + + sprintf(buf, "%s%s%s", head, replace_string, tail); + return buf; +} + +static char * replace_string(char * buf, char * from, char * to) { + int num_matches = 0; + char * matches[SYSTEM_CMD_MAX]; + int from_len = strlen(from); + for(int i=0; i= 0 && rewritten != template) { + copy_temp_wildcard(template, rewritten, 0); + } + return retval; +} +WRAPPER_DEF(mkstemp) + +WRAPPER(int, mkostemp)(char *template, int flags) +{ + int (*mkostemp_real) (char *template, int flags) = LOOKUP_REAL(mkostemp); + char buf[PATH_MAX]; + char * rewritten = rewrite_non_const(template, buf); + int retval = mkostemp_real(rewritten, flags); + if (retval >= 0 && rewritten != template) { + copy_temp_wildcard(template, rewritten, 0); + } + return retval; +} +WRAPPER_DEF(mkostemp) + +WRAPPER(int, mkstemps)(char *template, int suffixlen) +{ + int (*mkstemps_real) (char *template, int suffixlen) = LOOKUP_REAL(mkstemps); + char buf[PATH_MAX]; + char * rewritten = rewrite_non_const(template, buf); + int retval = mkstemps_real(rewritten, suffixlen); + if (retval >= 0 && rewritten != template) { + copy_temp_wildcard(template, rewritten, suffixlen); + } + return retval; +} +WRAPPER_DEF(mkstemps) + +WRAPPER(int, mkostemps)(char *template, int suffixlen, int flags) +{ + int (*mkostemps_real) (char *template, int suffixlen, int flags) = LOOKUP_REAL(mkostemps); + char buf[PATH_MAX]; + char * rewritten = rewrite_non_const(template, buf); + int retval = mkostemps_real(rewritten, suffixlen, flags); + if (retval >= 0 && rewritten != template) { + copy_temp_wildcard(template, rewritten, suffixlen); + } + return retval; +} +WRAPPER_DEF(mkostemps) + +WRAPPER(char *, mkdtemp)(char *template) +{ + char * (*mkdtemp_real) (char *template) = LOOKUP_REAL(mkdtemp); + char buf[PATH_MAX]; + char * rewritten = rewrite_non_const(template, buf); + char * retval = mkdtemp_real(rewritten); + if (retval == NULL) { + return retval; + }; + if (rewritten != template) { + copy_temp_wildcard(template, rewritten, 0); + } + return template; +} +WRAPPER_DEF(mkdtemp) + +WRAPPER(char *, mktemp)(char *template) +{ + char * (*mktemp_real) (char *template) = LOOKUP_REAL(mktemp); + char buf[PATH_MAX]; + char * rewritten = rewrite_non_const(template, buf); + char * retval = mktemp_real(rewritten); + if (retval == NULL) { + return retval; + }; + if (rewritten != template) { + copy_temp_wildcard(template, rewritten, 0); + } + return template; +} +WRAPPER_DEF(mktemp) diff --git a/pkgs/build-support/libredirect/test.c b/pkgs/build-support/libredirect/test.c new file mode 100644 index 0000000..e5685fc --- /dev/null +++ b/pkgs/build-support/libredirect/test.c @@ -0,0 +1,176 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define TESTDIR "/bar/baz" +#define TESTPATH "/foo/bar/test" +#define SUBTEST "./test sub" + +extern char **environ; + +void test_spawn(void) { + pid_t pid; + int ret; + posix_spawn_file_actions_t file_actions; + char *argv[] = {"true", NULL}; + + assert(posix_spawn_file_actions_init(&file_actions) == 0); + + ret = posix_spawn(&pid, TESTPATH, &file_actions, NULL, argv, environ); + + assert(ret == 0); + assert(waitpid(pid, NULL, 0) != -1); +} + +void test_execv(void) { + char *argv[] = {"true", NULL}; + assert(execv(TESTPATH, argv) == 0); +} + +void test_system(void) { + assert(system(TESTPATH) == 0); +} + +void test_subprocess(void) { + assert(system(SUBTEST) == 0); +} + +void test_stat_with_null_path(void) { + // This checks whether the compiler optimizes away the null pointer check + // on the path passed to stat(). If that's the case, the following code + // should segfault. + struct stat buf; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnonnull" + stat(NULL, &buf); +#pragma GCC diagnostic pop +} + +void assert_mktemp_path( + const char * orig_prefix, + const char * orig_suffix, + const char * updated +) { + // prefix unchanged + assert(strncmp(updated, orig_prefix, strlen(orig_prefix)) == 0); + // wildcards replaced + assert(strcmp(updated + strlen(orig_prefix), "XXXXXX") != 0); + // suffix unchanged + assert(strcmp(updated + strlen(orig_prefix) + 6, orig_suffix) == 0); +} + +int main(int argc, char *argv[]) +{ + FILE *testfp; + int testfd; + struct stat testsb; +#ifdef __GLIBC__ + struct stat64 testsb64; +#endif +#if defined(__linux__) && defined(STATX_TYPE) + struct statx testsbx; +#endif + char buf[PATH_MAX]; + + testfp = fopen(TESTPATH, "r"); + assert(testfp != NULL); + fclose(testfp); + + testfd = open(TESTPATH, O_RDONLY); + assert(testfd != -1); + close(testfd); + + assert(access(TESTPATH, X_OK) == 0); + + assert(stat(TESTPATH, &testsb) != -1); +#ifdef __GLIBC__ + assert(stat64(TESTPATH, &testsb64) != -1); +#endif + assert(fstatat(123, TESTPATH, &testsb, 0) != -1); +#ifdef __GLIBC__ + assert(fstatat64(123, TESTPATH, &testsb64, 0) != -1); +#endif +#if defined(__linux__) && defined(STATX_TYPE) + assert(statx(123, TESTPATH, 0, STATX_ALL, &testsbx) != -1); +#endif + + assert(getcwd(buf, PATH_MAX) != NULL); + assert(chdir(TESTDIR) == 0); + assert(chdir(buf) == 0); + + assert(mkdir(TESTDIR "/dir-mkdir", 0777) == 0); + assert(unlink(TESTDIR "/dir-mkdir") == -1); // it's a directory! +#ifndef __APPLE__ + assert(errno == EISDIR); +#endif + assert(rmdir(TESTDIR "/dir-mkdir") == 0); + assert(unlink(TESTDIR "/dir-mkdir") == -1); + assert(errno == ENOENT); + + assert(mkdirat(123, TESTDIR "/dir-mkdirat", 0777) == 0); + assert(unlinkat(123, TESTDIR "/dir-mkdirat", 0) == -1); // it's a directory! +#ifndef __APPLE__ + assert(errno == EISDIR); +#endif + assert(unlinkat(123, TESTDIR "/dir-mkdirat", AT_REMOVEDIR) == 0); + + strncpy(buf, TESTDIR "/tempXXXXXX", PATH_MAX); + testfd = mkstemp(buf); + assert(testfd > 0); + assert_mktemp_path(TESTDIR "/temp", "", buf); + close(testfd); + + strncpy(buf, TESTDIR "/tempXXXXXX", PATH_MAX); + testfd = mkostemp(buf, 0); + assert(testfd > 0); + assert_mktemp_path(TESTDIR "/temp", "", buf); + close(testfd); + + strncpy(buf, TESTDIR "/tempXXXXXX.test", PATH_MAX); + testfd = mkstemps(buf, strlen(".test")); + assert(testfd > 0); + assert_mktemp_path(TESTDIR "/temp", ".test", buf); + close(testfd); + + strncpy(buf, TESTDIR "/tempXXXXXX.test", PATH_MAX); + testfd = mkostemps(buf, strlen(".test"), 0); + assert(testfd > 0); + assert_mktemp_path(TESTDIR "/temp", ".test", buf); + close(testfd); + + strncpy(buf, TESTDIR "/tempXXXXXX", PATH_MAX); + assert(mkdtemp(buf) == buf); + assert_mktemp_path(TESTDIR "/temp", "", buf); + + strncpy(buf, TESTDIR "/tempXXXXXX", PATH_MAX); + assert(mktemp(buf) == buf); + assert_mktemp_path(TESTDIR "/temp", "", buf); + + test_spawn(); + test_system(); + test_stat_with_null_path(); + + // Only run subprocess if no arguments are given + // as the subprocess will be called without argument + // otherwise we will have infinite recursion + if (argc == 1) { + test_subprocess(); + } + + test_execv(); + + /* If all goes well, this is never reached because test_execv() replaces + * the current process. + */ + return 0; +} diff --git a/pkgs/build-support/make-darwin-bundle/default.nix b/pkgs/build-support/make-darwin-bundle/default.nix new file mode 100644 index 0000000..52dd54b --- /dev/null +++ b/pkgs/build-support/make-darwin-bundle/default.nix @@ -0,0 +1,26 @@ +# given a package with an executable and an icon, make a darwin bundle for +# it. This package should be used when generating launchers for native Darwin +# applications. If the package conatins a .desktop file use +# `desktopToDarwinLauncher` instead. + +{ lib, writeShellScript, writeDarwinBundle }: + +{ name # The name of the Application file. +, exec # Executable file. +, icon ? "" # Optional icon file. +}: + +writeShellScript "make-darwin-bundle-${name}" ('' + function makeDarwinBundlePhase() { + mkdir -p "''${!outputBin}/Applications/${name}.app/Contents/MacOS" + mkdir -p "''${!outputBin}/Applications/${name}.app/Contents/Resources" + + if [ -n "${icon}" ]; then + ln -s "${icon}" "''${!outputBin}/Applications/${name}.app/Contents/Resources" + fi + + ${writeDarwinBundle}/bin/write-darwin-bundle "''${!outputBin}" "${name}" "${exec}" + } + + preDistPhases+=" makeDarwinBundlePhase" +'') diff --git a/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix b/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix new file mode 100644 index 0000000..752cbbd --- /dev/null +++ b/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix @@ -0,0 +1,47 @@ +{ writeScriptBin, lib, makeBinaryWrapper }: + +let + pListText = lib.generators.toPlist { } { + CFBundleDevelopmentRegion = "English"; + CFBundleExecutable = "$name"; + CFBundleIconFile = "$icon"; + CFBundleIconFiles = [ "$icon" ]; + CFBundleIdentifier = "org.nixos.$name"; + CFBundleInfoDictionaryVersion = "6.0"; + CFBundleName = "$name"; + CFBundlePackageType = "APPL"; + CFBundleSignature = "???"; + }; +in writeScriptBin "write-darwin-bundle" '' + shopt -s nullglob + + readonly prefix=$1 + readonly name=$2 + # TODO: support executables with spaces in their names + readonly execName=''${3%% *} # Before the first space + [[ $3 =~ " " ]] && readonly execArgs=''${3#* } # Everything after the first space + readonly icon=$4.icns + readonly squircle=''${5:-1} + readonly plist=$prefix/Applications/$name.app/Contents/Info.plist + readonly binary=$prefix/bin/$execName + readonly bundleExecutable=$prefix/Applications/$name.app/Contents/MacOS/$name + + cat > "$plist" <|d' -i "$plist" + fi + + if [[ -n "$execArgs" ]]; then + ( + source ${makeBinaryWrapper}/nix-support/setup-hook + # WORKAROUND: makeBinaryWrapper fails when -u is set + set +u + makeBinaryWrapper "$binary" "$bundleExecutable" --add-flags "$execArgs" + ) + else + ln -s "$binary" "$bundleExecutable" + fi +'' diff --git a/pkgs/build-support/make-desktopitem/default.nix b/pkgs/build-support/make-desktopitem/default.nix new file mode 100644 index 0000000..ccceb23 --- /dev/null +++ b/pkgs/build-support/make-desktopitem/default.nix @@ -0,0 +1,118 @@ +{ lib, writeTextFile, buildPackages }: + +# All possible values as defined by the spec, version 1.4. +# Please keep in spec order for easier maintenance. +# When adding a new value, don't forget to update the Version field below! +# See https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html +lib.makeOverridable ({ name # The name of the desktop file +, type ? "Application" +# version is hardcoded +, desktopName # The name of the application +, genericName ? null +, noDisplay ? null +, comment ? null +, icon ? null +# we don't support the Hidden key - if you don't need something, just don't install it +, onlyShowIn ? [] +, notShowIn ? [] +, dbusActivatable ? null +, tryExec ? null +, exec ? null +, path ? null +, terminal ? null +, actions ? {} # An attrset of [internal name] -> { name, exec?, icon? } +, mimeTypes ? [] # The spec uses "MimeType" as singular, use plural here to signify list-ness +, categories ? [] +, implements ? [] +, keywords ? [] +, startupNotify ? null +, startupWMClass ? null +, url ? null +, prefersNonDefaultGPU ? null +# not supported until version 1.5, which is not supported by our desktop-file-utils as of 2022-02-23 +# , singleMainWindow ? null +, extraConfig ? {} # Additional values to be added literally to the final item, e.g. vendor extensions +}: +let + # There are multiple places in the FDO spec that make "boolean" values actually tristate, + # e.g. StartupNotify, where "unset" is literally defined as "do something reasonable". + # So, handle null values separately. + boolOrNullToString = value: + if value == null then null + else if builtins.isBool value then lib.boolToString value + else throw "makeDesktopItem: value must be a boolean or null!"; + + # Multiple values are represented as one string, joined by semicolons. + # Technically, it's possible to escape semicolons in values with \;, but this is currently not implemented. + renderList = key: value: + if !builtins.isList value then throw "makeDesktopItem: value for ${key} must be a list!" + else if builtins.any (item: lib.hasInfix ";" item) value then throw "makeDesktopItem: values in ${key} list must not contain semicolons!" + else if value == [] then null + else builtins.concatStringsSep ";" value; + + # The [Desktop Entry] section of the desktop file, as an attribute set. + # Please keep in spec order. + mainSection = { + "Type" = type; + "Version" = "1.4"; + "Name" = desktopName; + "GenericName" = genericName; + "NoDisplay" = boolOrNullToString noDisplay; + "Comment" = comment; + "Icon" = icon; + "OnlyShowIn" = renderList "onlyShowIn" onlyShowIn; + "NotShowIn" = renderList "notShowIn" notShowIn; + "DBusActivatable" = boolOrNullToString dbusActivatable; + "TryExec" = tryExec; + "Exec" = exec; + "Path" = path; + "Terminal" = boolOrNullToString terminal; + "Actions" = renderList "actions" (builtins.attrNames actions); + "MimeType" = renderList "mimeTypes" mimeTypes; + "Categories" = renderList "categories" categories; + "Implements" = renderList "implements" implements; + "Keywords" = renderList "keywords" keywords; + "StartupNotify" = boolOrNullToString startupNotify; + "StartupWMClass" = startupWMClass; + "URL" = url; + "PrefersNonDefaultGPU" = boolOrNullToString prefersNonDefaultGPU; + # "SingleMainWindow" = boolOrNullToString singleMainWindow; + } // extraConfig; + + # Render a single attribute pair to a Key=Value line. + # FIXME: this isn't entirely correct for arbitrary strings, as some characters + # need to be escaped. There are currently none in nixpkgs though, so this is OK. + renderLine = name: value: if value != null then "${name}=${value}" else null; + + # Render a full section of the file from an attrset. + # Null values are intentionally left out. + renderSection = sectionName: attrs: + lib.pipe attrs [ + (lib.mapAttrsToList renderLine) + (builtins.filter (v: v != null)) + (builtins.concatStringsSep "\n") + (section: '' + [${sectionName}] + ${section} + '') + ]; + + mainSectionRendered = renderSection "Desktop Entry" mainSection; + + # Convert from javaCase names as used in Nix to PascalCase as used in the spec. + preprocessAction = { name, icon ? null, exec ? null }: { + "Name" = name; + "Icon" = icon; + "Exec" = exec; + }; + renderAction = name: attrs: renderSection "Desktop Action ${name}" (preprocessAction attrs); + actionsRendered = lib.mapAttrsToList renderAction actions; + + content = [ mainSectionRendered ] ++ actionsRendered; +in +writeTextFile { + name = "${name}.desktop"; + destination = "/share/applications/${name}.desktop"; + text = builtins.concatStringsSep "\n" content; + checkPhase = ''${buildPackages.desktop-file-utils}/bin/desktop-file-validate "$target"''; +}) diff --git a/pkgs/build-support/make-hardcode-gsettings-patch/default.nix b/pkgs/build-support/make-hardcode-gsettings-patch/default.nix new file mode 100644 index 0000000..820b003 --- /dev/null +++ b/pkgs/build-support/make-hardcode-gsettings-patch/default.nix @@ -0,0 +1,80 @@ +{ + runCommand, + git, + coccinelle, + python3, +}: + +/* + Creates a patch that replaces every instantiation of GSettings in a C project + with a code that loads a GSettings schema from a hardcoded path. + + This is useful so that libraries can find schemas even though Nix lacks + a standard location like /usr/share, where GSettings system could look for schemas. + The derivation is is somewhat dependency-heavy so it is best used as part of an update script. + + For each schema id referenced in the source code (e.g. org.gnome.evolution), + a variable name such as `EVOLUTION` must be provided. + It will end up in the generated patch as `@EVOLUTION@` placeholder, which should be replaced at build time + with a path to the directory containing a `gschemas.compiled` file that includes the schema. + + + Arguments: + - `src`: source to generate the patch for. + + - `schemaIdToVariableMapping`: attrset assigning schema ids to variable names. + All used schemas must be listed. + + For example, `{ "org.gnome.evolution" = "EVOLUTION_SCHEMA_PATH"; }` + hardcodes looking for `org.gnome.evolution` into `@EVOLUTION_SCHEMA_PATH@`. + + - `patches`: A list of patches to apply before generating the patch. + + Example: + passthru = { + hardcodeGsettingsPatch = makeHardcodeGsettingsPatch { + inherit (finalAttrs) src; + schemaIdToVariableMapping = { + ... + }; + }; + + updateScript = + let + updateSource = ...; + updatePatch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-ews.hardcodeGsettingsPatch" ./hardcode-gsettings.patch; + in + _experimental-update-script-combinators.sequence [ + updateSource + updatePatch + ]; + }; + } +*/ +{ + src, + patches ? [ ], + schemaIdToVariableMapping, +}: + +runCommand + "hardcode-gsettings.patch" + { + inherit src patches; + nativeBuildInputs = [ + git + coccinelle + python3 # For patch script + ]; + } + '' + unpackPhase + cd "''${sourceRoot:-.}" + patchPhase + set -x + cp ${builtins.toFile "glib-schema-to-var.json" (builtins.toJSON schemaIdToVariableMapping)} ./glib-schema-to-var.json + git init + git add -A + spatch --sp-file "${./hardcode-gsettings.cocci}" --dir . --in-place + git diff > "$out" + '' diff --git a/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci b/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci new file mode 100644 index 0000000..e916d74 --- /dev/null +++ b/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci @@ -0,0 +1,145 @@ +/** + * Since Nix does not have a standard location like /usr/share where GSettings system + * could look for schemas, we need to point the software to a correct location somehow. + * For executables, we handle this using wrappers but this is not an option for libraries like e-d-s. + * Instead, we patch the source code to look for the schema in a schema source + * through a hardcoded path to the schema. + * + * For each schema id referenced in the source code (e.g. org.gnome.evolution), + * a variable name such as `EVOLUTION` must be provided in the ./glib-schema-to-var.json JSON file. + * It will end up in the resulting patch as `@EVOLUTION@` placeholder, which should be replaced at build time + * with a path to the directory containing a `gschemas.compiled` file that includes the schema. + */ + +@initialize:python@ +@@ +import json + +cpp_constants = {} + +def register_cpp_constant(const_name, val): + cpp_constants[const_name] = val.strip() + +def resolve_cpp_constant(const_name): + return cpp_constants.get(const_name, const_name) + +with open("./glib-schema-to-var.json") as mapping_file: + schema_to_var = json.load(mapping_file); + +def get_schema_directory(schema_id): + # Sometimes the schema id is referenced using C preprocessor #define constant in the same file + # let’s try to resolve it first. + schema_id = resolve_cpp_constant(schema_id.strip()).strip('"') + if schema_id in schema_to_var: + return f'"@{schema_to_var[schema_id]}@"' + raise Exception(f"Unknown schema path {schema_id!r}, please add it to ./glib-schema-to-var.json") + +@find_cpp_constants@ +identifier const_name; +expression val; +@@ + +#define const_name val + +@script:python record_cpp_constants depends on find_cpp_constants@ +const_name << find_cpp_constants.const_name; +val << find_cpp_constants.val; +@@ + +register_cpp_constant(const_name, val) + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new(SCHEMA_ID); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, NULL, NULL); ++} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression BACKEND; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_backend(SCHEMA_ID, BACKEND); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, BACKEND, NULL); ++} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression BACKEND; +expression PATH; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_backend_and_path(SCHEMA_ID, BACKEND, PATH); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, BACKEND, PATH); ++} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression PATH; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_path(SCHEMA_ID, PATH); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, NULL, PATH); ++} diff --git a/pkgs/build-support/make-impure-test.nix b/pkgs/build-support/make-impure-test.nix new file mode 100644 index 0000000..84d0b30 --- /dev/null +++ b/pkgs/build-support/make-impure-test.nix @@ -0,0 +1,96 @@ +/* Create tests that run in the nix sandbox with additional access to selected host paths + + This is for example useful for testing hardware where a tests needs access to + /sys and optionally more. + + The following example shows a test that accesses the GPU: + + Example: + makeImpureTest { + name = "opencl"; + testedPackage = "mypackage"; # Or testPath = "mypackage.impureTests.opencl.testDerivation" + + sandboxPaths = [ "/sys" "/dev/dri" ]; # Defaults to ["/sys"] + prepareRunCommands = ""; # (Optional) Setup for the runScript + nixFlags = []; # (Optional) nix-build options for the runScript + + testScript = "..."; + } + + Save as `test.nix` next to a package and reference it from the package: + passthru.impureTests = { opencl = callPackage ./test.nix {}; }; + + `makeImpureTest` will return here a script that contains the actual nix-build command including all necessary sandbox flags. + + It can be executed like this: + $(nix-build -A mypackage.impureTests) + + Rerun an already cached test: + $(nix-build -A mypackage.impureTests) --check +*/ +{ lib +, stdenv +, writeShellScript + +, name +, testedPackage ? null +, testPath ? "${testedPackage}.impureTests.${name}.testDerivation" +, sandboxPaths ? [ "/sys" ] +, prepareRunCommands ? "" +, nixFlags ? [ ] +, testScript +, ... +} @ args: + +let + sandboxPathsTests = builtins.map (path: "[[ ! -e '${path}' ]]") sandboxPaths; + sandboxPathsTest = lib.concatStringsSep " || " sandboxPathsTests; + sandboxPathsList = lib.concatStringsSep " " sandboxPaths; + + testDerivation = stdenv.mkDerivation (lib.recursiveUpdate + { + name = "test-run-${name}"; + + requiredSystemFeatures = [ "nixos-test" ]; + + buildCommand = '' + mkdir -p $out + + if ${sandboxPathsTest}; then + echo 'Run this test as *root* with `--option extra-sandbox-paths '"'${sandboxPathsList}'"'`' + exit 1 + fi + + # Run test + ${testScript} + ''; + + passthru.runScript = runScript; + } + (builtins.removeAttrs args [ + "lib" + "stdenv" + "writeShellScript" + + "name" + "testedPackage" + "testPath" + "sandboxPaths" + "prepareRunCommands" + "nixFlags" + "testScript" + ]) + ); + + runScript = writeShellScript "run-script-${name}" '' + set -euo pipefail + + ${prepareRunCommands} + + sudo nix-build --option extra-sandbox-paths '${sandboxPathsList}' ${lib.escapeShellArgs nixFlags} -A ${testPath} "$@" + ''; +in +# The main output is the run script, inject the derivation for the actual test +runScript.overrideAttrs (old: { + passthru = { inherit testDerivation; }; +}) diff --git a/pkgs/build-support/make-pkgconfigitem/default.nix b/pkgs/build-support/make-pkgconfigitem/default.nix new file mode 100644 index 0000000..d3bcabb --- /dev/null +++ b/pkgs/build-support/make-pkgconfigitem/default.nix @@ -0,0 +1,69 @@ +{ lib, writeTextFile, buildPackages }: + +# See https://people.freedesktop.org/~dbn/pkg-config-guide.html#concepts +{ name # The name of the pc file + # keywords + # provide a default description for convenience. it's not important but still required by pkg-config. +, description ? "A pkg-config file for ${name}" +, url ? "" +, version ? "" +, requires ? [ ] +, requiresPrivate ? [ ] +, conflicts ? [ ] +, cflags ? [ ] +, libs ? [ ] +, libsPrivate ? [ ] +, variables ? { } +}: + +let + # only 'out' has to be changed, otherwise it would be replaced by the out of the writeTextFile + placeholderToSubstVar = builtins.replaceStrings [ "${placeholder "out"}" ] [ "@out@" ]; + + replacePlaceholderAndListToString = x: + if builtins.isList x + then placeholderToSubstVar (builtins.concatStringsSep " " x) + else placeholderToSubstVar x; + + keywordsSection = + let + mustBeAList = attr: attrName: lib.throwIfNot (lib.isList attr) "'${attrName}' must be a list" attr; + in + { + "Name" = name; + "Description" = description; + "URL" = url; + "Version" = version; + "Requires" = mustBeAList requires "requires"; + "Requires.private" = mustBeAList requiresPrivate "requiresPrivate"; + "Conflicts" = mustBeAList conflicts "conflicts"; + "Cflags" = mustBeAList cflags "cflags"; + "Libs" = mustBeAList libs "libs"; + "Libs.private" = mustBeAList libsPrivate "libsPrivate"; + }; + + renderVariable = name: value: + lib.optionalString (value != "" && value != [ ]) "${name}=${replacePlaceholderAndListToString value}"; + renderKeyword = name: value: + lib.optionalString (value != "" && value != [ ]) "${name}: ${replacePlaceholderAndListToString value}"; + + renderSomething = renderFunc: attrs: + lib.pipe attrs [ + (lib.mapAttrsToList renderFunc) + (builtins.filter (v: v != "")) + (builtins.concatStringsSep "\n") + (section: ''${section} + '') + ]; + + variablesSectionRendered = renderSomething renderVariable variables; + keywordsSectionRendered = renderSomething renderKeyword keywordsSection; + + content = [ variablesSectionRendered keywordsSectionRendered ]; +in +writeTextFile { + name = "${name}.pc"; + destination = "/lib/pkgconfig/${name}.pc"; + text = builtins.concatStringsSep "\n" content; + checkPhase = ''${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config --validate "$target"''; +} diff --git a/pkgs/build-support/make-startupitem/default.nix b/pkgs/build-support/make-startupitem/default.nix new file mode 100644 index 0000000..94bf07c --- /dev/null +++ b/pkgs/build-support/make-startupitem/default.nix @@ -0,0 +1,35 @@ +# given a package with a $name.desktop file, makes a copy +# as autostart item. + +{stdenv, lib}: +{ name # name of the desktop file (without .desktop) +, package # package where the desktop file resides in +, srcPrefix ? "" # additional prefix that the desktop file may have in the 'package' +, after ? null +, condition ? null +, phase ? "2" +}: + +# the builder requires that +# $package/share/applications/$name.desktop +# exists as file. + +stdenv.mkDerivation { + name = "autostart-${name}"; + priority = 5; + + buildCommand = '' + mkdir -p $out/etc/xdg/autostart + target=${name}.desktop + cp ${package}/share/applications/${srcPrefix}${name}.desktop $target + chmod +rw $target + echo "X-KDE-autostart-phase=${phase}" >> $target + ${lib.optionalString (after != null) ''echo "${after}" >> $target''} + ${lib.optionalString (condition != null) ''echo "${condition}" >> $target''} + cp $target $out/etc/xdg/autostart + ''; + + # this will automatically put 'package' in the environment when you + # put its startup item in there. + propagatedBuildInputs = [ package ]; +} diff --git a/pkgs/build-support/mkshell/default.nix b/pkgs/build-support/mkshell/default.nix new file mode 100644 index 0000000..5369301 --- /dev/null +++ b/pkgs/build-support/mkshell/default.nix @@ -0,0 +1,62 @@ +{ lib, stdenv, buildEnv }: + +# A special kind of derivation that is only meant to be consumed by the +# nix-shell. +{ name ? "nix-shell" +, # a list of packages to add to the shell environment + packages ? [ ] +, # propagate all the inputs from the given derivations + inputsFrom ? [ ] +, buildInputs ? [ ] +, nativeBuildInputs ? [ ] +, propagatedBuildInputs ? [ ] +, propagatedNativeBuildInputs ? [ ] +, ... +}@attrs: +let + mergeInputs = name: + (attrs.${name} or [ ]) ++ + # 1. get all `{build,nativeBuild,...}Inputs` from the elements of `inputsFrom` + # 2. since that is a list of lists, `flatten` that into a regular list + # 3. filter out of the result everything that's in `inputsFrom` itself + # this leaves actual dependencies of the derivations in `inputsFrom`, but never the derivations themselves + (lib.subtractLists inputsFrom (lib.flatten (lib.catAttrs name inputsFrom))); + + rest = builtins.removeAttrs attrs [ + "name" + "packages" + "inputsFrom" + "buildInputs" + "nativeBuildInputs" + "propagatedBuildInputs" + "propagatedNativeBuildInputs" + "shellHook" + ]; +in + +stdenv.mkDerivation ({ + inherit name; + + buildInputs = mergeInputs "buildInputs"; + nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs"); + propagatedBuildInputs = mergeInputs "propagatedBuildInputs"; + propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs"; + + shellHook = lib.concatStringsSep "\n" (lib.catAttrs "shellHook" + (lib.reverseList inputsFrom ++ [ attrs ])); + + phases = [ "buildPhase" ]; + + buildPhase = '' + { echo "------------------------------------------------------------"; + echo " WARNING: the existence of this path is not guaranteed."; + echo " It is an internal implementation detail for pkgs.mkShell."; + echo "------------------------------------------------------------"; + echo; + # Record all build inputs as runtime dependencies + export; + } >> "$out" + ''; + + preferLocalBuild = true; +} // rest) diff --git a/pkgs/build-support/mono-dll-fixer/default.nix b/pkgs/build-support/mono-dll-fixer/default.nix new file mode 100644 index 0000000..09a9860 --- /dev/null +++ b/pkgs/build-support/mono-dll-fixer/default.nix @@ -0,0 +1,11 @@ +{stdenv, perl}: +stdenv.mkDerivation { + name = "mono-dll-fixer"; + dllFixer = ./dll-fixer.pl; + dontUnpack = true; + installPhase = '' + substitute $dllFixer $out --subst-var-by perl $perl/bin/perl + chmod +x $out + ''; + inherit perl; +} diff --git a/pkgs/build-support/mono-dll-fixer/dll-fixer.pl b/pkgs/build-support/mono-dll-fixer/dll-fixer.pl new file mode 100644 index 0000000..4a8b468 --- /dev/null +++ b/pkgs/build-support/mono-dll-fixer/dll-fixer.pl @@ -0,0 +1,32 @@ +#! @perl@ -w + +use strict; + +my @paths = split ' ', $ENV{"ALL_INPUTS"}; + +open IN, "<$ARGV[0]" or die; +open OUT, ">$ARGV[0].tmp" or die; + +while () { + # !!! should use a real XML library here. + if (!//) { + print OUT; + next; + } + my $dll = $1; + my $target = $2; + + foreach my $path (@paths) { + my $fullPath = "$path/lib/$target"; + if (-e "$fullPath") { + $target = $fullPath; + last; + } + } + + print OUT " \n"; +} + +close IN; + +rename "$ARGV[0].tmp", "$ARGV[0]" or die "cannot rename $ARGV[0]"; diff --git a/pkgs/build-support/nix-gitignore/default.nix b/pkgs/build-support/nix-gitignore/default.nix new file mode 100644 index 0000000..8497206 --- /dev/null +++ b/pkgs/build-support/nix-gitignore/default.nix @@ -0,0 +1,198 @@ +# https://github.com/siers/nix-gitignore/ + +{ lib, runCommand }: + +# An interesting bit from the gitignore(5): +# - A slash followed by two consecutive asterisks then a slash matches +# - zero or more directories. For example, "a/**/b" matches "a/b", +# - "a/x/b", "a/x/y/b" and so on. + +let + inherit (builtins) filterSource; + + inherit (lib) + concatStringsSep + elemAt + filter + head + isList + length + optionals + optionalString + pathExists + readFile + removePrefix + replaceStrings + stringLength + sub + substring + toList + trace + ; + + + inherit (lib.strings) match split typeOf; + + debug = a: trace a a; + last = l: elemAt l ((length l) - 1); +in rec { + # [["good/relative/source/file" true] ["bad.tmpfile" false]] -> root -> path + filterPattern = patterns: root: + (name: _type: + let + relPath = removePrefix ((toString root) + "/") name; + matches = pair: (match (head pair) relPath) != null; + matched = map (pair: [(matches pair) (last pair)]) patterns; + in + last (last ([[true true]] ++ (filter head matched))) + ); + + # string -> [[regex bool]] + gitignoreToPatterns = gitignore: + let + # ignore -> bool + isComment = i: (match "^(#.*|$)" i) != null; + + # ignore -> [ignore bool] + computeNegation = l: + let split = match "^(!?)(.*)" l; + in [(elemAt split 1) (head split == "!")]; + + # regex -> regex + handleHashesBangs = replaceStrings ["\\#" "\\!"] ["#" "!"]; + + # ignore -> regex + substWildcards = + let + special = "^$.+{}()"; + escs = "\\*?"; + splitString = + let recurse = str : [(substring 0 1 str)] ++ + (optionals (str != "") (recurse (substring 1 (stringLength(str)) str) )); + in str : recurse str; + chars = s: filter (c: c != "" && !isList c) (splitString s); + escape = s: map (c: "\\" + c) (chars s); + in + replaceStrings + ((chars special) ++ (escape escs) ++ ["**/" "**" "*" "?"]) + ((escape special) ++ (escape escs) ++ ["(.*/)?" ".*" "[^/]*" "[^/]"]); + + # (regex -> regex) -> regex -> regex + mapAroundCharclass = f: r: # rl = regex or list + let slightFix = replaceStrings ["\\]"] ["]"]; + in + concatStringsSep "" + (map (rl: if isList rl then slightFix (elemAt rl 0) else f rl) + (split "(\\[([^\\\\]|\\\\.)+])" r)); + + # regex -> regex + handleSlashPrefix = l: + let + split = (match "^(/?)(.*)" l); + findSlash = l: optionalString ((match ".+/.+" l) == null) l; + hasSlash = mapAroundCharclass findSlash l != l; + in + (if (elemAt split 0) == "/" || hasSlash + then "^" + else "(^|.*/)" + ) + (elemAt split 1); + + # regex -> regex + handleSlashSuffix = l: + let split = (match "^(.*)/$" l); + in if split != null then (elemAt split 0) + "($|/.*)" else l; + + # (regex -> regex) -> [regex, bool] -> [regex, bool] + mapPat = f: l: [(f (head l)) (last l)]; + in + map (l: # `l' for "line" + mapPat (l: handleSlashSuffix (handleSlashPrefix (handleHashesBangs (mapAroundCharclass substWildcards l)))) + (computeNegation l)) + (filter (l: !isList l && !isComment l) + (split "\n" gitignore)); + + gitignoreFilter = ign: root: filterPattern (gitignoreToPatterns ign) root; + + # string|[string|file] (→ [string|file] → [string]) -> string + gitignoreCompileIgnore = file_str_patterns: root: + let + onPath = f: a: if typeOf a == "path" then f a else a; + str_patterns = map (onPath readFile) (toList file_str_patterns); + in concatStringsSep "\n" str_patterns; + + gitignoreFilterPure = predicate: patterns: root: name: type: + gitignoreFilter (gitignoreCompileIgnore patterns root) root name type + && predicate name type; + + # This is a very hacky way of programming this! + # A better way would be to reuse existing filtering by making multiple gitignore functions per each root. + # Then for each file find the set of roots with gitignores (and functions). + # This would make gitignoreFilterSource very different from gitignoreFilterPure. + # rootPath → gitignoresConcatenated + compileRecursiveGitignore = root: + let + dirOrIgnore = file: type: baseNameOf file == ".gitignore" || type == "directory"; + ignores = builtins.filterSource dirOrIgnore root; + in readFile ( + runCommand "${baseNameOf root}-recursive-gitignore" {} '' + cd ${ignores} + + find -type f -exec sh -c ' + rel="$(realpath --relative-to=. "$(dirname "$1")")/" + if [ "$rel" = "./" ]; then rel=""; fi + + awk -v prefix="$rel" -v root="$1" -v top="$(test -z "$rel" && echo 1)" " + BEGIN { print \"# \"root } + + /^!?[^\\/]+\/?$/ { + match(\$0, /^!?/, negation) + sub(/^!?/, \"\") + + if (top) { middle = \"\" } else { middle = \"**/\" } + + print negation[0] prefix middle \$0 + } + + /^!?(\\/|.*\\/.+$)/ { + match(\$0, /^!?/, negation) + sub(/^!?/, \"\") + + if (!top) sub(/^\//, \"\") + + print negation[0] prefix \$0 + } + + END { print \"\" } + " "$1" + ' sh {} \; > $out + ''); + + withGitignoreFile = patterns: root: + toList patterns ++ [ ".git" ] ++ [(root + "/.gitignore")]; + + withRecursiveGitignoreFile = patterns: root: + toList patterns ++ [ ".git" ] ++ [(compileRecursiveGitignore root)]; + + # filterSource derivatives + + gitignoreFilterSourcePure = predicate: patterns: root: + filterSource (gitignoreFilterPure predicate patterns root) root; + + gitignoreFilterSource = predicate: patterns: root: + gitignoreFilterSourcePure predicate (withGitignoreFile patterns root) root; + + gitignoreFilterRecursiveSource = predicate: patterns: root: + gitignoreFilterSourcePure predicate (withRecursiveGitignoreFile patterns root) root; + + # "Predicate"-less alternatives + + gitignoreSourcePure = gitignoreFilterSourcePure (_: _: true); + gitignoreSource = patterns: let type = typeOf patterns; in + if (type == "string" && pathExists patterns) || type == "path" + then throw + "type error in gitignoreSource(patterns -> source -> path), " + "use [] or \"\" if there are no additional patterns" + else gitignoreFilterSource (_: _: true) patterns; + + gitignoreRecursiveSource = gitignoreFilterSourcePure (_: _: true); +} diff --git a/pkgs/build-support/node/build-npm-package/default.nix b/pkgs/build-support/node/build-npm-package/default.nix new file mode 100644 index 0000000..1c7bf63 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/default.nix @@ -0,0 +1,88 @@ +{ lib +, stdenv +, fetchNpmDeps +, buildPackages +, nodejs +, darwin +} @ topLevelArgs: + +{ name ? "${args.pname}-${args.version}" +, src ? null +, srcs ? null +, sourceRoot ? null +, prePatch ? "" +, patches ? [ ] +, postPatch ? "" +, nativeBuildInputs ? [ ] +, buildInputs ? [ ] + # The output hash of the dependencies for this project. + # Can be calculated in advance with prefetch-npm-deps. +, npmDepsHash ? "" + # Whether to force the usage of Git dependencies that have install scripts, but not a lockfile. + # Use with care. +, forceGitDeps ? false + # Whether to force allow an empty dependency cache. + # This can be enabled if there are truly no remote dependencies, but generally an empty cache indicates something is wrong. +, forceEmptyCache ? false + # Whether to make the cache writable prior to installing dependencies. + # Don't set this unless npm tries to write to the cache directory, as it can slow down the build. +, makeCacheWritable ? false + # The script to run to build the project. +, npmBuildScript ? "build" + # Flags to pass to all npm commands. +, npmFlags ? [ ] + # Flags to pass to `npm ci`. +, npmInstallFlags ? [ ] + # Flags to pass to `npm rebuild`. +, npmRebuildFlags ? [ ] + # Flags to pass to `npm run ${npmBuildScript}`. +, npmBuildFlags ? [ ] + # Flags to pass to `npm pack`. +, npmPackFlags ? [ ] + # Flags to pass to `npm prune`. +, npmPruneFlags ? npmInstallFlags + # Value for npm `--workspace` flag and directory in which the files to be installed are found. +, npmWorkspace ? null +, nodejs ? topLevelArgs.nodejs +, npmDeps ? fetchNpmDeps { + inherit forceGitDeps forceEmptyCache src srcs sourceRoot prePatch patches postPatch; + name = "${name}-npm-deps"; + hash = npmDepsHash; +} + # Custom npmConfigHook +, npmConfigHook ? null + # Custom npmBuildHook +, npmBuildHook ? null + # Custom npmInstallHook +, npmInstallHook ? null +, ... +} @ args: + +let + # .override {} negates splicing, so we need to use buildPackages explicitly + npmHooks = buildPackages.npmHooks.override { + inherit nodejs; + }; +in +stdenv.mkDerivation (args // { + inherit npmDeps npmBuildScript; + + nativeBuildInputs = nativeBuildInputs + ++ [ + nodejs + # Prefer passed hooks + (if npmConfigHook != null then npmConfigHook else npmHooks.npmConfigHook) + (if npmBuildHook != null then npmBuildHook else npmHooks.npmBuildHook) + (if npmInstallHook != null then npmInstallHook else npmHooks.npmInstallHook) + nodejs.python + ] + ++ lib.optionals stdenv.isDarwin [ darwin.cctools ]; + buildInputs = buildInputs ++ [ nodejs ]; + + strictDeps = true; + + # Stripping takes way too long with the amount of files required by a typical Node.js project. + dontStrip = args.dontStrip or true; + + meta = (args.meta or { }) // { platforms = args.meta.platforms or nodejs.meta.platforms; }; +}) diff --git a/pkgs/build-support/node/build-npm-package/hooks/default.nix b/pkgs/build-support/node/build-npm-package/hooks/default.nix new file mode 100644 index 0000000..36f0319 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/hooks/default.nix @@ -0,0 +1,48 @@ +{ lib +, srcOnly +, makeSetupHook +, makeWrapper +, nodejs +, jq +, prefetch-npm-deps +, diffutils +, installShellFiles +}: + +{ + npmConfigHook = makeSetupHook + { + name = "npm-config-hook"; + substitutions = { + nodeSrc = srcOnly nodejs; + nodeGyp = "${nodejs}/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js"; + + # Specify `diff`, `jq`, and `prefetch-npm-deps` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong binaries. + diff = "${diffutils}/bin/diff"; + jq = "${jq}/bin/jq"; + prefetchNpmDeps = "${prefetch-npm-deps}/bin/prefetch-npm-deps"; + + nodeVersion = nodejs.version; + nodeVersionMajor = lib.versions.major nodejs.version; + }; + } ./npm-config-hook.sh; + + npmBuildHook = makeSetupHook + { + name = "npm-build-hook"; + } ./npm-build-hook.sh; + + npmInstallHook = makeSetupHook + { + name = "npm-install-hook"; + propagatedBuildInputs = [ + installShellFiles + makeWrapper + ]; + substitutions = { + hostNode = "${nodejs}/bin/node"; + jq = "${jq}/bin/jq"; + }; + } ./npm-install-hook.sh; +} diff --git a/pkgs/build-support/node/build-npm-package/hooks/npm-build-hook.sh b/pkgs/build-support/node/build-npm-package/hooks/npm-build-hook.sh new file mode 100644 index 0000000..c341f67 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/hooks/npm-build-hook.sh @@ -0,0 +1,38 @@ +# shellcheck shell=bash + +npmBuildHook() { + echo "Executing npmBuildHook" + + runHook preBuild + + if [ -z "${npmBuildScript-}" ]; then + echo + echo "ERROR: no build script was specified" + echo 'Hint: set `npmBuildScript`, override `buildPhase`, or set `dontNpmBuild = true`.' + echo + + exit 1 + fi + + if ! npm run ${npmWorkspace+--workspace=$npmWorkspace} "$npmBuildScript" $npmBuildFlags "${npmBuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then + echo + echo 'ERROR: `npm build` failed' + echo + echo "Here are a few things you can try, depending on the error:" + echo "1. Make sure your build script ($npmBuildScript) exists" + echo ' If there is none, set `dontNpmBuild = true`.' + echo '2. If the error being thrown is something similar to "error:0308010C:digital envelope routines::unsupported", add `NODE_OPTIONS = "--openssl-legacy-provider"` to your derivation' + echo " See https://github.com/webpack/webpack/issues/14532 for more information." + echo + + exit 1 + fi + + runHook postBuild + + echo "Finished npmBuildHook" +} + +if [ -z "${dontNpmBuild-}" ] && [ -z "${buildPhase-}" ]; then + buildPhase=npmBuildHook +fi diff --git a/pkgs/build-support/node/build-npm-package/hooks/npm-config-hook.sh b/pkgs/build-support/node/build-npm-package/hooks/npm-config-hook.sh new file mode 100644 index 0000000..486b0c2 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/hooks/npm-config-hook.sh @@ -0,0 +1,119 @@ +# shellcheck shell=bash + +npmConfigHook() { + echo "Executing npmConfigHook" + + # Use npm patches in the nodejs package + export NIX_NODEJS_BUILDNPMPACKAGE=1 + export prefetchNpmDeps="@prefetchNpmDeps@" + + if [ -n "${npmRoot-}" ]; then + pushd "$npmRoot" + fi + + echo "Configuring npm" + + export HOME="$TMPDIR" + export npm_config_nodedir="@nodeSrc@" + export npm_config_node_gyp="@nodeGyp@" + + if [ -z "${npmDeps-}" ]; then + echo + echo "ERROR: no dependencies were specified" + echo 'Hint: set `npmDeps` if using these hooks individually. If this is happening with `buildNpmPackage`, please open an issue.' + echo + + exit 1 + fi + + local -r cacheLockfile="$npmDeps/package-lock.json" + local -r srcLockfile="$PWD/package-lock.json" + + echo "Validating consistency between $srcLockfile and $cacheLockfile" + + if ! @diff@ "$srcLockfile" "$cacheLockfile"; then + # If the diff failed, first double-check that the file exists, so we can + # give a friendlier error msg. + if ! [ -e "$srcLockfile" ]; then + echo + echo "ERROR: Missing package-lock.json from src. Expected to find it at: $srcLockfile" + echo "Hint: You can copy a vendored package-lock.json file via postPatch." + echo + + exit 1 + fi + + if ! [ -e "$cacheLockfile" ]; then + echo + echo "ERROR: Missing lockfile from cache. Expected to find it at: $cacheLockfile" + echo + + exit 1 + fi + + echo + echo "ERROR: npmDepsHash is out of date" + echo + echo "The package-lock.json in src is not the same as the in $npmDeps." + echo + echo "To fix the issue:" + echo '1. Use `lib.fakeHash` as the npmDepsHash value' + echo "2. Build the derivation and wait for it to fail with a hash mismatch" + echo "3. Copy the 'got: sha256-' value back into the npmDepsHash field" + echo + + exit 1 + fi + + export CACHE_MAP_PATH="$TMP/MEOW" + @prefetchNpmDeps@ --map-cache + + @prefetchNpmDeps@ --fixup-lockfile "$srcLockfile" + + local cachePath + + if [ -z "${makeCacheWritable-}" ]; then + cachePath="$npmDeps" + else + echo "Making cache writable" + cp -r "$npmDeps" "$TMPDIR/cache" + chmod -R 700 "$TMPDIR/cache" + cachePath="$TMPDIR/cache" + fi + + npm config set cache "$cachePath" + npm config set offline true + npm config set progress false + + echo "Installing dependencies" + + if ! npm ci --ignore-scripts $npmInstallFlags "${npmInstallFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then + echo + echo "ERROR: npm failed to install dependencies" + echo + echo "Here are a few things you can try, depending on the error:" + echo '1. Set `makeCacheWritable = true`' + echo " Note that this won't help if npm is complaining about not being able to write to the logs directory -- look above that for the actual error." + echo '2. Set `npmFlags = [ "--legacy-peer-deps" ]`' + echo + + exit 1 + fi + + patchShebangs node_modules + + npm rebuild $npmRebuildFlags "${npmRebuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}" + + patchShebangs node_modules + + rm "$CACHE_MAP_PATH" + unset CACHE_MAP_PATH + + if [ -n "${npmRoot-}" ]; then + popd + fi + + echo "Finished npmConfigHook" +} + +postPatchHooks+=(npmConfigHook) diff --git a/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh b/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh new file mode 100644 index 0000000..750ed42 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh @@ -0,0 +1,71 @@ +# shellcheck shell=bash + +npmInstallHook() { + echo "Executing npmInstallHook" + + runHook preInstall + + local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)" + + # `npm pack` writes to cache so temporarily override it + while IFS= read -r file; do + local dest="$packageOut/$(dirname "$file")" + mkdir -p "$dest" + cp "${npmWorkspace-.}/$file" "$dest" + done < <(@jq@ --raw-output '.[0].files | map(.path | select(. | startswith("node_modules/") | not)) | join("\n")' <<< "$(npm_config_cache="$HOME/.npm" npm pack --json --dry-run --loglevel=warn --no-foreground-scripts ${npmWorkspace+--workspace=$npmWorkspace} $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")") + + # Based on code from Python's buildPythonPackage wrap.sh script, for + # supporting both the case when makeWrapperArgs is an array and a + # IFS-separated string. + # + # TODO: remove the string branch when __structuredAttrs are used. + if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then + local -a user_args=("${makeWrapperArgs[@]}") + else + local -a user_args="(${makeWrapperArgs:-})" + fi + while IFS=" " read -ra bin; do + mkdir -p "$out/bin" + makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" "${user_args[@]}" + done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then + .name + " " + .bin + elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n") + elif $typ == "null" then empty + else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json") + + while IFS= read -r man; do + installManPage "$packageOut/$man" + done < <(@jq@ --raw-output '(.man | type) as $typ | if $typ == "string" then .man + elif $typ == "list" then .man | join("\n") + elif $typ == "null" then empty + else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json") + + local -r nodeModulesPath="$packageOut/node_modules" + + if [ ! -d "$nodeModulesPath" ]; then + if [ -z "${dontNpmPrune-}" ]; then + if ! npm prune --omit=dev --no-save ${npmWorkspace+--workspace=$npmWorkspace} $npmPruneFlags "${npmPruneFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then + echo + echo + echo "ERROR: npm prune step failed" + echo + echo 'If npm tried to download additional dependencies above, try setting `dontNpmPrune = true`.' + echo + + exit 1 + fi + fi + + find node_modules -maxdepth 1 -type d -empty -delete + + cp -r node_modules "$nodeModulesPath" + fi + + runHook postInstall + + echo "Finished npmInstallHook" +} + +if [ -z "${dontNpmInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=npmInstallHook +fi diff --git a/pkgs/build-support/node/fetch-npm-deps/.gitignore b/pkgs/build-support/node/fetch-npm-deps/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/.gitignore @@ -0,0 +1 @@ +/target diff --git a/pkgs/build-support/node/fetch-npm-deps/Cargo.lock b/pkgs/build-support/node/fetch-npm-deps/Cargo.lock new file mode 100644 index 0000000..dcabca0 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/Cargo.lock @@ -0,0 +1,1181 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" + +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + +[[package]] +name = "cc" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curl" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "curl-sys" +version = "0.4.72+curl-8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "windows-sys 0.52.0", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "is_executable" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" +dependencies = [ + "winapi", +] + +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "event-listener", + "futures-lite", + "http", + "log", + "once_cell", + "polling", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libz-sys" +version = "1.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "nix-nar" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5549158a8b179c4fcd06a19f4bcc557db60c9cbd6771add9563f46c8d0325b5" +dependencies = [ + "camino", + "is_executable", + "symlink", + "thiserror", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prefetch-npm-deps" +version = "0.1.0" +dependencies = [ + "anyhow", + "backoff", + "data-encoding", + "digest", + "env_logger", + "isahc", + "log", + "nix-nar", + "rayon", + "serde", + "serde_json", + "sha1", + "sha2", + "tempfile", + "url", + "walkdir", +] + +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel", + "futures-core", + "futures-io", +] + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[package]] +name = "syn" +version = "2.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.0.2", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/pkgs/build-support/node/fetch-npm-deps/Cargo.toml b/pkgs/build-support/node/fetch-npm-deps/Cargo.toml new file mode 100644 index 0000000..dcb7e28 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "prefetch-npm-deps" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.82" +backoff = "0.4.0" +data-encoding = "2.5.0" +digest = "0.10.7" +env_logger = "0.11.3" +isahc = { version = "1.7.2", default_features = false } +log = "0.4.21" +nix-nar = "0.3.0" +rayon = "1.10.0" +serde = { version = "1.0.198", features = ["derive"] } +serde_json = "1.0.116" +sha1 = "0.10.6" +sha2 = "0.10.8" +tempfile = "3.10.1" +url = { version = "2.5.0", features = ["serde"] } +walkdir = "2.5.0" diff --git a/pkgs/build-support/node/fetch-npm-deps/default.nix b/pkgs/build-support/node/fetch-npm-deps/default.nix new file mode 100644 index 0000000..d86fc90 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/default.nix @@ -0,0 +1,207 @@ +{ lib, stdenvNoCC, rustPlatform, makeWrapper, pkg-config, curl, gnutar, gzip, testers, fetchurl, cacert, prefetch-npm-deps, fetchNpmDeps }: + +{ + prefetch-npm-deps = rustPlatform.buildRustPackage { + pname = "prefetch-npm-deps"; + version = (lib.importTOML ./Cargo.toml).package.version; + + src = lib.cleanSourceWith { + src = ./.; + filter = name: type: + let + name' = builtins.baseNameOf name; + in + name' != "default.nix" && name' != "target"; + }; + + cargoLock.lockFile = ./Cargo.lock; + + nativeBuildInputs = [ makeWrapper pkg-config ]; + buildInputs = [ curl ]; + + postInstall = '' + wrapProgram "$out/bin/prefetch-npm-deps" --prefix PATH : ${lib.makeBinPath [ gnutar gzip ]} + ''; + + passthru.tests = + let + makeTestSrc = { name, src }: stdenvNoCC.mkDerivation { + name = "${name}-src"; + + inherit src; + + buildCommand = '' + mkdir -p $out + cp $src $out/package-lock.json + ''; + }; + + makeTest = { name, src, hash, forceGitDeps ? false, forceEmptyCache ? false }: testers.invalidateFetcherByDrvHash fetchNpmDeps { + inherit name hash forceGitDeps forceEmptyCache; + + src = makeTestSrc { inherit name src; }; + }; + in + { + lockfileV1 = makeTest { + name = "lockfile-v1"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/jellyfin/jellyfin-web/v10.8.4/package-lock.json"; + hash = "sha256-uQmc+S+V1co1Rfc4d82PpeXjmd1UqdsG492ADQFcZGA="; + }; + + hash = "sha256-wca1QvxUw3OrLStfYN9Co6oVBR1LbfcNUKlDqvObps4="; + }; + + lockfileV2 = makeTest { + name = "lockfile-v2"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/jesec/flood/v4.7.0/package-lock.json"; + hash = "sha256-qS29tq5QPnGxV+PU40VgMAtdwVLtLyyhG2z9GMeYtC4="; + }; + + hash = "sha256-tuEfyePwlOy2/mOPdXbqJskO6IowvAP4DWg8xSZwbJw="; + }; + + hashPrecedence = makeTest { + name = "hash-precedence"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/matrix-org/matrix-appservice-irc/0.34.0/package-lock.json"; + hash = "sha256-1+0AQw9EmbHiMPA/H8OP8XenhrkhLRYBRhmd1cNPFjk="; + }; + + hash = "sha256-oItUls7AXcCECuyA+crQO6B0kv4toIr8pBubNwB7kAM="; + }; + + hostedGitDeps = makeTest { + name = "hosted-git-deps"; + + src = fetchurl { + url = "https://cyberchaos.dev/yuka/trainsearch/-/raw/e3cba6427e8ecfd843d0f697251ddaf5e53c2327/package-lock.json"; + hash = "sha256-X9mCwPqV5yP0S2GonNvpYnLSLJMd/SUIked+hMRxDpA="; + }; + + hash = "sha256-tEdElWJ+KBTxBobzXBpPopQSwK2usGW/it1+yfbVzBw="; + }; + + linkDependencies = makeTest { + name = "link-dependencies"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/evcc-io/evcc/0.106.3/package-lock.json"; + hash = "sha256-6ZTBMyuyPP/63gpQugggHhKVup6OB4hZ2rmSvPJ0yEs="; + }; + + hash = "sha256-VzQhArHoznYSXUT7l9HkJV4yoSOmoP8eYTLel1QwmB4="; + }; + + # This package has no resolved deps whatsoever, which will not actually work but does test the forceEmptyCache option. + emptyCache = makeTest { + name = "empty-cache"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/bufbuild/protobuf-es/v1.2.1/package-lock.json"; + hash = "sha256-UdBUEb4YRHsbvyjymIyjemJEiaI9KQRirqt+SFSK0wA="; + }; + + hash = "sha256-Cdv40lQjRszzJtJydZt25uYfcJVeJGwH54A+agdH9wI="; + + forceEmptyCache = true; + }; + + # This package contains both hosted Git shorthand, and a bundled dependency that happens to override an existing one. + etherpadLite1818 = makeTest { + name = "etherpad-lite-1.8.18"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/ether/etherpad-lite/1.8.18/src/package-lock.json"; + hash = "sha256-1fGNxYJi1I4cXK/jinNG+Y6tPEOhP3QAqWOBEQttS9E="; + }; + + hash = "sha256-+KA8/orSBJ4EhuSyQO8IKSxsN/FAsYU3lOzq+awuxNQ="; + + forceGitDeps = true; + }; + + # This package has a lockfile v1 git dependency with no `dependencies` attribute, since it sementically has no dependencies. + jitsiMeet9111 = makeTest { + name = "jitsi-meet-9111"; + + src = fetchurl { + url = "https://raw.githubusercontent.com/jitsi/jitsi-meet/stable/jitsi-meet_9111/package-lock.json"; + hash = "sha256-NU+eQD4WZ4BMur8uX79uk8wUPsZvIT02KhPWHTmaihk="; + }; + + hash = "sha256-FhxlJ0HdJMPiWe7+n1HaGLWOr/2HJEPwiS65uqXZM8Y="; + }; + }; + + meta = with lib; { + description = "Prefetch dependencies from npm (for use with `fetchNpmDeps`)"; + mainProgram = "prefetch-npm-deps"; + maintainers = with maintainers; [ lilyinstarlight winter ]; + license = licenses.mit; + }; + }; + + fetchNpmDeps = + { name ? "npm-deps" + , hash ? "" + , forceGitDeps ? false + , forceEmptyCache ? false + , ... + } @ args: + let + hash_ = + if hash != "" then { + outputHash = hash; + } else { + outputHash = ""; + outputHashAlgo = "sha256"; + }; + + forceGitDeps_ = lib.optionalAttrs forceGitDeps { FORCE_GIT_DEPS = true; }; + forceEmptyCache_ = lib.optionalAttrs forceEmptyCache { FORCE_EMPTY_CACHE = true; }; + in + stdenvNoCC.mkDerivation (args // { + inherit name; + + nativeBuildInputs = [ prefetch-npm-deps ]; + + buildPhase = '' + runHook preBuild + + if [[ ! -e package-lock.json ]]; then + echo + echo "ERROR: The package-lock.json file does not exist!" + echo + echo "package-lock.json is required to make sure that npmDepsHash doesn't change" + echo "when packages are updated on npm." + echo + echo "Hint: You can copy a vendored package-lock.json file via postPatch." + echo + + exit 1 + fi + + prefetch-npm-deps package-lock.json $out + + runHook postBuild + ''; + + dontInstall = true; + + # NIX_NPM_TOKENS environment variable should be a JSON mapping in the shape of: + # `{ "registry.example.com": "example-registry-bearer-token", ... }` + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_NPM_TOKENS" ]; + + SSL_CERT_FILE = if (hash_.outputHash == "" || hash_.outputHash == lib.fakeSha256 || hash_.outputHash == lib.fakeSha512 || hash_.outputHash == lib.fakeHash) + then "${cacert}/etc/ssl/certs/ca-bundle.crt" + else "/no-cert-file.crt"; + + outputHashMode = "recursive"; + } // hash_ // forceGitDeps_ // forceEmptyCache_); +} diff --git a/pkgs/build-support/node/fetch-npm-deps/src/cacache.rs b/pkgs/build-support/node/fetch-npm-deps/src/cacache.rs new file mode 100644 index 0000000..403c909 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/src/cacache.rs @@ -0,0 +1,128 @@ +use data_encoding::BASE64; +use digest::{Digest, Update}; +use serde::{Deserialize, Serialize}; +use sha1::Sha1; +use sha2::{Sha256, Sha512}; +use std::{ + fmt::Write as FmtWrite, + fs::{self, File}, + io::Write, + path::PathBuf, +}; +use url::Url; + +#[allow(clippy::struct_field_names)] +#[derive(Serialize, Deserialize)] +pub(super) struct Key { + pub(super) key: String, + pub(super) integrity: String, + pub(super) time: u8, + pub(super) size: usize, + pub(super) metadata: Metadata, +} + +#[derive(Serialize, Deserialize)] +pub(super) struct Metadata { + pub(super) url: Url, + pub(super) options: Options, +} + +#[derive(Serialize, Deserialize)] +pub(super) struct Options { + pub(super) compress: bool, +} + +pub struct Cache(PathBuf); + +fn push_hash_segments(path: &mut PathBuf, hash: &str) { + path.push(&hash[0..2]); + path.push(&hash[2..4]); + path.push(&hash[4..]); +} + +impl Cache { + pub fn new(path: PathBuf) -> Cache { + Cache(path) + } + + pub fn init(&self) -> anyhow::Result<()> { + fs::create_dir_all(self.0.join("content-v2"))?; + fs::create_dir_all(self.0.join("index-v5"))?; + + Ok(()) + } + + pub fn put( + &self, + key: String, + url: Url, + data: &[u8], + integrity: Option, + ) -> anyhow::Result<()> { + let (algo, hash, integrity) = if let Some(integrity) = integrity { + let (algo, hash) = integrity + .split_once('-') + .expect("hash should be SRI format"); + + (algo.to_string(), BASE64.decode(hash.as_bytes())?, integrity) + } else { + let hash = Sha512::new().chain(data).finalize(); + + ( + String::from("sha512"), + hash.to_vec(), + format!("sha512-{}", BASE64.encode(&hash)), + ) + }; + + let content_path = { + let mut p = self.0.join("content-v2"); + + p.push(algo); + + push_hash_segments( + &mut p, + &hash.into_iter().fold(String::new(), |mut out, n| { + let _ = write!(out, "{n:02x}"); + out + }), + ); + + p + }; + + fs::create_dir_all(content_path.parent().unwrap())?; + + fs::write(content_path, data)?; + + let index_path = { + let mut p = self.0.join("index-v5"); + + push_hash_segments( + &mut p, + &format!("{:x}", Sha256::new().chain(&key).finalize()), + ); + + p + }; + + fs::create_dir_all(index_path.parent().unwrap())?; + + let data = serde_json::to_string(&Key { + key, + integrity, + time: 0, + size: data.len(), + metadata: Metadata { + url, + options: Options { compress: true }, + }, + })?; + + let mut file = File::options().append(true).create(true).open(index_path)?; + + write!(file, "{:x}\t{data}", Sha1::new().chain(&data).finalize())?; + + Ok(()) + } +} diff --git a/pkgs/build-support/node/fetch-npm-deps/src/main.rs b/pkgs/build-support/node/fetch-npm-deps/src/main.rs new file mode 100644 index 0000000..cb06d32 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/src/main.rs @@ -0,0 +1,429 @@ +#![warn(clippy::pedantic)] + +use crate::cacache::{Cache, Key}; +use anyhow::{anyhow, bail}; +use rayon::prelude::*; +use serde_json::{Map, Value}; +use std::{ + collections::HashMap, + env, fs, + path::{Path, PathBuf}, + process, +}; +use tempfile::tempdir; +use url::Url; +use walkdir::WalkDir; + +mod cacache; +mod parse; +mod util; + +fn cache_map_path() -> Option { + env::var_os("CACHE_MAP_PATH").map(PathBuf::from) +} + +/// `fixup_lockfile` rewrites `integrity` hashes to match cache and removes the `integrity` field from Git dependencies. +/// +/// Sometimes npm has multiple instances of a given `resolved` URL that have different types of `integrity` hashes (e.g. SHA-1 +/// and SHA-512) in the lockfile. Given we only cache one version of these, the `integrity` field must be normalized to the hash +/// we cache as (which is the strongest available one). +/// +/// Git dependencies from specific providers can be retrieved from those providers' automatic tarball features. +/// When these dependencies are specified with a commit identifier, npm generates a tarball, and inserts the integrity hash of that +/// tarball into the lockfile. +/// +/// Thus, we remove this hash, to replace it with our own determinstic copies of dependencies from hosted Git providers. +/// +/// If no fixups were performed, `None` is returned and the lockfile structure should be left as-is. If fixups were performed, the +/// `dependencies` key in v2 lockfiles designed for backwards compatibility with v1 parsers is removed because of inconsistent data. +fn fixup_lockfile( + mut lock: Map, + cache: &Option>, +) -> anyhow::Result>> { + let mut fixed = false; + + match lock + .get("lockfileVersion") + .ok_or_else(|| anyhow!("couldn't get lockfile version"))? + .as_i64() + .ok_or_else(|| anyhow!("lockfile version isn't an int"))? + { + 1 => fixup_v1_deps( + lock.get_mut("dependencies") + .unwrap() + .as_object_mut() + .unwrap(), + cache, + &mut fixed, + ), + 2 | 3 => { + for package in lock + .get_mut("packages") + .ok_or_else(|| anyhow!("couldn't get packages"))? + .as_object_mut() + .ok_or_else(|| anyhow!("packages isn't a map"))? + .values_mut() + { + if let Some(Value::String(resolved)) = package.get("resolved") { + if let Some(Value::String(integrity)) = package.get("integrity") { + if resolved.starts_with("git+ssh://") { + fixed = true; + + package + .as_object_mut() + .ok_or_else(|| anyhow!("package isn't a map"))? + .remove("integrity"); + } else if let Some(cache_hashes) = cache { + let cache_hash = cache_hashes + .get(resolved) + .expect("dependency should have a hash"); + + if integrity != cache_hash { + fixed = true; + + *package + .as_object_mut() + .ok_or_else(|| anyhow!("package isn't a map"))? + .get_mut("integrity") + .unwrap() = Value::String(cache_hash.clone()); + } + } + } + } + } + + if fixed { + lock.remove("dependencies"); + } + } + v => bail!("unsupported lockfile version {v}"), + } + + if fixed { + Ok(Some(lock)) + } else { + Ok(None) + } +} + +// Recursive helper to fixup v1 lockfile deps +fn fixup_v1_deps( + dependencies: &mut Map, + cache: &Option>, + fixed: &mut bool, +) { + for dep in dependencies.values_mut() { + if let Some(Value::String(resolved)) = dep + .as_object() + .expect("v1 dep must be object") + .get("resolved") + { + if let Some(Value::String(integrity)) = dep + .as_object() + .expect("v1 dep must be object") + .get("integrity") + { + if resolved.starts_with("git+ssh://") { + *fixed = true; + + dep.as_object_mut() + .expect("v1 dep must be object") + .remove("integrity"); + } else if let Some(cache_hashes) = cache { + let cache_hash = cache_hashes + .get(resolved) + .expect("dependency should have a hash"); + + if integrity != cache_hash { + *fixed = true; + + *dep.as_object_mut() + .expect("v1 dep must be object") + .get_mut("integrity") + .unwrap() = Value::String(cache_hash.clone()); + } + } + } + } + + if let Some(Value::Object(more_deps)) = dep.as_object_mut().unwrap().get_mut("dependencies") + { + fixup_v1_deps(more_deps, cache, fixed); + } + } +} + +fn map_cache() -> anyhow::Result> { + let mut hashes = HashMap::new(); + + let content_path = Path::new(&env::var_os("npmDeps").unwrap()).join("_cacache/index-v5"); + + for entry in WalkDir::new(content_path) { + let entry = entry?; + + if entry.file_type().is_file() { + let content = fs::read_to_string(entry.path())?; + let key: Key = serde_json::from_str(content.split_ascii_whitespace().nth(1).unwrap())?; + + hashes.insert(key.metadata.url, key.integrity); + } + } + + Ok(hashes) +} + +fn main() -> anyhow::Result<()> { + env_logger::init(); + + let args = env::args().collect::>(); + + if args.len() < 2 { + println!("usage: {} ", args[0]); + println!(); + println!("Prefetches npm dependencies for usage by fetchNpmDeps."); + + process::exit(1); + } + + if let Ok(jobs) = env::var("NIX_BUILD_CORES") { + if !jobs.is_empty() { + rayon::ThreadPoolBuilder::new() + .num_threads( + jobs.parse() + .expect("NIX_BUILD_CORES must be a whole number"), + ) + .build_global() + .unwrap(); + } + } + + if args[1] == "--fixup-lockfile" { + let lock = serde_json::from_str(&fs::read_to_string(&args[2])?)?; + + let cache = cache_map_path() + .map(|map_path| Ok::<_, anyhow::Error>(serde_json::from_slice(&fs::read(map_path)?)?)) + .transpose()?; + + if let Some(fixed) = fixup_lockfile(lock, &cache)? { + println!("Fixing lockfile"); + + fs::write(&args[2], serde_json::to_string(&fixed)?)?; + } + + return Ok(()); + } else if args[1] == "--map-cache" { + let map = map_cache()?; + + fs::write( + cache_map_path().expect("CACHE_MAP_PATH environment variable must be set"), + serde_json::to_string(&map)?, + )?; + + return Ok(()); + } + + let lock_content = fs::read_to_string(&args[1])?; + + let out_tempdir; + + let (out, print_hash) = if let Some(path) = args.get(2) { + (Path::new(path), false) + } else { + out_tempdir = tempdir()?; + + (out_tempdir.path(), true) + }; + + let packages = parse::lockfile( + &lock_content, + env::var("FORCE_GIT_DEPS").is_ok(), + env::var("FORCE_EMPTY_CACHE").is_ok(), + )?; + + let cache = Cache::new(out.join("_cacache")); + cache.init()?; + + packages.into_par_iter().try_for_each(|package| { + eprintln!("{}", package.name); + + let tarball = package + .tarball() + .map_err(|e| anyhow!("couldn't fetch {} at {}: {e:?}", package.name, package.url))?; + let integrity = package.integrity().map(ToString::to_string); + + cache + .put( + format!("make-fetch-happen:request-cache:{}", package.url), + package.url, + &tarball, + integrity, + ) + .map_err(|e| anyhow!("couldn't insert cache entry for {}: {e:?}", package.name))?; + + Ok::<_, anyhow::Error>(()) + })?; + + fs::write(out.join("package-lock.json"), lock_content)?; + + if print_hash { + println!("{}", util::make_sri_hash(out)?); + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use super::fixup_lockfile; + use serde_json::json; + + #[test] + fn lockfile_fixup() -> anyhow::Result<()> { + let input = json!({ + "lockfileVersion": 2, + "name": "foo", + "packages": { + "": { + + }, + "foo": { + "resolved": "https://github.com/NixOS/nixpkgs", + "integrity": "sha1-aaa" + }, + "bar": { + "resolved": "git+ssh://git@github.com/NixOS/nixpkgs.git", + "integrity": "sha512-aaa" + }, + "foo-bad": { + "resolved": "foo", + "integrity": "sha1-foo" + }, + "foo-good": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + } + }); + + let expected = json!({ + "lockfileVersion": 2, + "name": "foo", + "packages": { + "": { + + }, + "foo": { + "resolved": "https://github.com/NixOS/nixpkgs", + "integrity": "" + }, + "bar": { + "resolved": "git+ssh://git@github.com/NixOS/nixpkgs.git", + }, + "foo-bad": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + "foo-good": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + } + }); + + let mut hashes = HashMap::new(); + + hashes.insert( + String::from("https://github.com/NixOS/nixpkgs"), + String::new(), + ); + + hashes.insert( + String::from("git+ssh://git@github.com/NixOS/nixpkgs.git"), + String::new(), + ); + + hashes.insert(String::from("foo"), String::from("sha512-foo")); + + assert_eq!( + fixup_lockfile(input.as_object().unwrap().clone(), &Some(hashes))?, + Some(expected.as_object().unwrap().clone()) + ); + + Ok(()) + } + + #[test] + fn lockfile_v1_fixup() -> anyhow::Result<()> { + let input = json!({ + "lockfileVersion": 1, + "name": "foo", + "dependencies": { + "foo": { + "resolved": "https://github.com/NixOS/nixpkgs", + "integrity": "sha512-aaa" + }, + "foo-good": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + "bar": { + "resolved": "git+ssh://git@github.com/NixOS/nixpkgs.git", + "integrity": "sha512-bbb", + "dependencies": { + "foo-bad": { + "resolved": "foo", + "integrity": "sha1-foo" + }, + }, + }, + } + }); + + let expected = json!({ + "lockfileVersion": 1, + "name": "foo", + "dependencies": { + "foo": { + "resolved": "https://github.com/NixOS/nixpkgs", + "integrity": "" + }, + "foo-good": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + "bar": { + "resolved": "git+ssh://git@github.com/NixOS/nixpkgs.git", + "dependencies": { + "foo-bad": { + "resolved": "foo", + "integrity": "sha512-foo" + }, + }, + }, + } + }); + + let mut hashes = HashMap::new(); + + hashes.insert( + String::from("https://github.com/NixOS/nixpkgs"), + String::new(), + ); + + hashes.insert( + String::from("git+ssh://git@github.com/NixOS/nixpkgs.git"), + String::new(), + ); + + hashes.insert(String::from("foo"), String::from("sha512-foo")); + + assert_eq!( + fixup_lockfile(input.as_object().unwrap().clone(), &Some(hashes))?, + Some(expected.as_object().unwrap().clone()) + ); + + Ok(()) + } +} diff --git a/pkgs/build-support/node/fetch-npm-deps/src/parse/lock.rs b/pkgs/build-support/node/fetch-npm-deps/src/parse/lock.rs new file mode 100644 index 0000000..49bba87 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/src/parse/lock.rs @@ -0,0 +1,370 @@ +use anyhow::{anyhow, bail, Context}; +use rayon::slice::ParallelSliceMut; +use serde::{ + de::{self, Visitor}, + Deserialize, Deserializer, +}; +use std::{ + cmp::Ordering, + collections::{HashMap, HashSet}, + fmt, +}; +use url::Url; + +pub(super) fn packages(content: &str) -> anyhow::Result> { + let lockfile: Lockfile = serde_json::from_str(content)?; + + let mut packages = match lockfile.version { + 1 => { + let initial_url = get_initial_url()?; + + to_new_packages(lockfile.dependencies.unwrap_or_default(), &initial_url)? + } + 2 | 3 => lockfile + .packages + .unwrap_or_default() + .into_iter() + .filter(|(n, p)| !n.is_empty() && matches!(p.resolved, Some(UrlOrString::Url(_)))) + .map(|(n, p)| Package { name: Some(n), ..p }) + .collect(), + _ => bail!( + "We don't support lockfile version {}, please file an issue.", + lockfile.version + ), + }; + + packages.par_sort_by(|x, y| { + x.resolved + .partial_cmp(&y.resolved) + .expect("resolved should be comparable") + .then( + // v1 lockfiles can contain multiple references to the same version of a package, with + // different integrity values (e.g. a SHA-1 and a SHA-512 in one, but just a SHA-512 in another) + y.integrity + .partial_cmp(&x.integrity) + .expect("integrity should be comparable"), + ) + }); + + packages.dedup_by(|x, y| x.resolved == y.resolved); + + Ok(packages) +} + +#[derive(Deserialize)] +struct Lockfile { + #[serde(rename = "lockfileVersion")] + version: u8, + dependencies: Option>, + packages: Option>, +} + +#[derive(Deserialize)] +struct OldPackage { + version: UrlOrString, + #[serde(default)] + bundled: bool, + resolved: Option, + integrity: Option, + dependencies: Option>, +} + +#[derive(Debug, Deserialize, PartialEq, Eq)] +pub(super) struct Package { + #[serde(default)] + pub(super) name: Option, + pub(super) resolved: Option, + pub(super) integrity: Option, +} + +#[derive(Debug, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(untagged)] +pub(super) enum UrlOrString { + Url(Url), + String(String), +} + +impl fmt::Display for UrlOrString { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + UrlOrString::Url(url) => url.fmt(f), + UrlOrString::String(string) => string.fmt(f), + } + } +} + +#[derive(Debug, PartialEq, Eq)] +pub struct HashCollection(HashSet); + +impl HashCollection { + pub fn from_str(s: impl AsRef) -> anyhow::Result { + let hashes = s + .as_ref() + .split_ascii_whitespace() + .map(Hash::new) + .collect::>()?; + + Ok(HashCollection(hashes)) + } + + pub fn into_best(self) -> Option { + self.0.into_iter().max() + } +} + +impl PartialOrd for HashCollection { + fn partial_cmp(&self, other: &Self) -> Option { + let lhs = self.0.iter().max()?; + let rhs = other.0.iter().max()?; + + lhs.partial_cmp(rhs) + } +} + +impl<'de> Deserialize<'de> for HashCollection { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_string(HashCollectionVisitor) + } +} + +struct HashCollectionVisitor; + +impl<'de> Visitor<'de> for HashCollectionVisitor { + type Value = HashCollection; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a single SRI hash or a collection of them (separated by spaces)") + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + HashCollection::from_str(value).map_err(E::custom) + } +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Hash)] +pub struct Hash(String); + +// Hash algorithms, in ascending preference. +const ALGOS: &[&str] = &["sha1", "sha512"]; + +impl Hash { + fn new(s: impl AsRef) -> anyhow::Result { + let algo = s + .as_ref() + .split_once('-') + .ok_or_else(|| anyhow!("expected SRI hash, got {:?}", s.as_ref()))? + .0; + + if ALGOS.iter().any(|&a| algo == a) { + Ok(Hash(s.as_ref().to_string())) + } else { + Err(anyhow!("unknown hash algorithm {algo:?}")) + } + } + + pub fn as_str(&self) -> &str { + &self.0 + } +} + +impl fmt::Display for Hash { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.as_str().fmt(f) + } +} + +#[allow(clippy::non_canonical_partial_ord_impl)] +impl PartialOrd for Hash { + fn partial_cmp(&self, other: &Hash) -> Option { + let lhs = self.0.split_once('-')?.0; + let rhs = other.0.split_once('-')?.0; + + ALGOS + .iter() + .position(|&s| lhs == s)? + .partial_cmp(&ALGOS.iter().position(|&s| rhs == s)?) + } +} + +impl Ord for Hash { + fn cmp(&self, other: &Hash) -> Ordering { + self.partial_cmp(other).unwrap() + } +} + +#[allow(clippy::case_sensitive_file_extension_comparisons)] +fn to_new_packages( + old_packages: HashMap, + initial_url: &Url, +) -> anyhow::Result> { + let mut new = Vec::new(); + + for (name, mut package) in old_packages { + // In some cases, a bundled dependency happens to have the same version as a non-bundled one, causing + // the bundled one without a URL to override the entry for the non-bundled instance, which prevents the + // dependency from being downloaded. + if package.bundled { + continue; + } + + if let UrlOrString::Url(v) = &package.version { + if v.scheme() == "npm" { + if let Some(UrlOrString::Url(ref url)) = &package.resolved { + package.version = UrlOrString::Url(url.clone()); + } + } else { + for (scheme, host) in [ + ("github", "github.com"), + ("bitbucket", "bitbucket.org"), + ("gitlab", "gitlab.com"), + ] { + if v.scheme() == scheme { + package.version = { + let mut new_url = initial_url.clone(); + + new_url.set_host(Some(host))?; + + if v.path().ends_with(".git") { + new_url.set_path(v.path()); + } else { + new_url.set_path(&format!("{}.git", v.path())); + } + + new_url.set_fragment(v.fragment()); + + UrlOrString::Url(new_url) + }; + + break; + } + } + } + } + + new.push(Package { + name: Some(name), + resolved: if matches!(package.version, UrlOrString::Url(_)) { + Some(package.version) + } else { + package.resolved + }, + integrity: package.integrity, + }); + + if let Some(dependencies) = package.dependencies { + new.append(&mut to_new_packages(dependencies, initial_url)?); + } + } + + Ok(new) +} + +fn get_initial_url() -> anyhow::Result { + Url::parse("git+ssh://git@a.b").context("initial url should be valid") +} + +#[cfg(test)] +mod tests { + use super::{ + get_initial_url, packages, to_new_packages, Hash, HashCollection, OldPackage, Package, + UrlOrString, + }; + use std::{ + cmp::Ordering, + collections::{HashMap, HashSet}, + }; + use url::Url; + + #[test] + fn git_shorthand_v1() -> anyhow::Result<()> { + let old = { + let mut o = HashMap::new(); + o.insert( + String::from("sqlite3"), + OldPackage { + version: UrlOrString::Url( + Url::parse( + "github:mapbox/node-sqlite3#593c9d498be2510d286349134537e3bf89401c4a", + ) + .unwrap(), + ), + bundled: false, + resolved: None, + integrity: None, + dependencies: None, + }, + ); + o + }; + + let initial_url = get_initial_url()?; + + let new = to_new_packages(old, &initial_url)?; + + assert_eq!(new.len(), 1, "new packages map should contain 1 value"); + assert_eq!(new[0], Package { + name: Some(String::from("sqlite3")), + resolved: Some(UrlOrString::Url(Url::parse("git+ssh://git@github.com/mapbox/node-sqlite3.git#593c9d498be2510d286349134537e3bf89401c4a").unwrap())), + integrity: None + }); + + Ok(()) + } + + #[test] + fn hash_preference() { + assert_eq!( + Hash(String::from("sha1-foo")).partial_cmp(&Hash(String::from("sha512-foo"))), + Some(Ordering::Less) + ); + + assert_eq!( + HashCollection({ + let mut set = HashSet::new(); + set.insert(Hash(String::from("sha512-foo"))); + set.insert(Hash(String::from("sha1-bar"))); + set + }) + .into_best(), + Some(Hash(String::from("sha512-foo"))) + ); + } + + #[test] + fn parse_lockfile_correctly() { + let packages = packages( + r#"{ + "name": "node-ddr", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }"#).unwrap(); + + assert_eq!(packages.len(), 1); + assert_eq!( + packages[0].resolved, + Some(UrlOrString::Url( + Url::parse("https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz") + .unwrap() + )) + ); + } +} diff --git a/pkgs/build-support/node/fetch-npm-deps/src/parse/mod.rs b/pkgs/build-support/node/fetch-npm-deps/src/parse/mod.rs new file mode 100644 index 0000000..0bca33f --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/src/parse/mod.rs @@ -0,0 +1,353 @@ +use anyhow::{anyhow, bail, Context}; +use lock::UrlOrString; +use log::{debug, info}; +use rayon::prelude::*; +use serde_json::{Map, Value}; +use std::{ + fs, + io::Write, + process::{Command, Stdio}, +}; +use tempfile::{tempdir, TempDir}; +use url::Url; + +use crate::util; + +pub mod lock; + +pub fn lockfile( + content: &str, + force_git_deps: bool, + force_empty_cache: bool, +) -> anyhow::Result> { + debug!("parsing lockfile with contents:\n{content}"); + + let mut packages = lock::packages(content) + .context("failed to extract packages from lockfile")? + .into_par_iter() + .map(|p| { + let n = p.name.clone().unwrap(); + + Package::from_lock(p).with_context(|| format!("failed to parse data for {n}")) + }) + .collect::>>()?; + + if packages.is_empty() && !force_empty_cache { + bail!("No cacheable dependencies were found. Please inspect the upstream `package-lock.json` file and ensure that remote dependencies have `resolved` URLs and `integrity` hashes. If the lockfile is missing this data, attempt to get upstream to fix it via a tool like . If generating an empty cache is intentional and you would like to do it anyways, set `forceEmptyCache = true`."); + } + + let mut new = Vec::new(); + + for pkg in packages + .iter() + .filter(|p| matches!(p.specifics, Specifics::Git { .. })) + { + let dir = match &pkg.specifics { + Specifics::Git { workdir } => workdir, + Specifics::Registry { .. } => unimplemented!(), + }; + + let path = dir.path().join("package"); + + info!("recursively parsing lockfile for {} at {path:?}", pkg.name); + + let lockfile_contents = fs::read_to_string(path.join("package-lock.json")); + + let package_json_path = path.join("package.json"); + let mut package_json: Map = + serde_json::from_str(&fs::read_to_string(package_json_path)?)?; + + if let Some(scripts) = package_json + .get_mut("scripts") + .and_then(Value::as_object_mut) + { + // https://github.com/npm/pacote/blob/272edc1bac06991fc5f95d06342334bbacfbaa4b/lib/git.js#L166-L172 + for typ in [ + "postinstall", + "build", + "preinstall", + "install", + "prepack", + "prepare", + ] { + if scripts.contains_key(typ) && lockfile_contents.is_err() && !force_git_deps { + bail!("Git dependency {} contains install scripts, but has no lockfile, which is something that will probably break. Open an issue if you can't feasibly patch this dependency out, and we'll come up with a workaround.\nIf you'd like to attempt to try to use this dependency anyways, set `forceGitDeps = true`.", pkg.name); + } + } + } + + if let Ok(lockfile_contents) = lockfile_contents { + new.append(&mut lockfile( + &lockfile_contents, + force_git_deps, + // force_empty_cache is turned on here since recursively parsed lockfiles should be + // allowed to have an empty cache without erroring by default + true, + )?); + } + } + + packages.append(&mut new); + + packages.par_sort_by(|x, y| { + x.url + .partial_cmp(&y.url) + .expect("resolved should be comparable") + }); + + packages.dedup_by(|x, y| x.url == y.url); + + Ok(packages) +} + +#[derive(Debug)] +pub struct Package { + pub name: String, + pub url: Url, + specifics: Specifics, +} + +#[derive(Debug)] +enum Specifics { + Registry { integrity: lock::Hash }, + Git { workdir: TempDir }, +} + +impl Package { + fn from_lock(pkg: lock::Package) -> anyhow::Result { + let mut resolved = match pkg + .resolved + .expect("at this point, packages should have URLs") + { + UrlOrString::Url(u) => u, + UrlOrString::String(_) => panic!("at this point, all packages should have URLs"), + }; + + let specifics = match get_hosted_git_url(&resolved)? { + Some(hosted) => { + let body = util::get_url_body_with_retry(&hosted)?; + + let workdir = tempdir()?; + + let tar_path = workdir.path().join("package"); + + fs::create_dir(&tar_path)?; + + let mut cmd = Command::new("tar") + .args(["--extract", "--gzip", "--strip-components=1", "-C"]) + .arg(&tar_path) + .stdin(Stdio::piped()) + .spawn()?; + + cmd.stdin.take().unwrap().write_all(&body)?; + + let exit = cmd.wait()?; + + if !exit.success() { + bail!( + "failed to extract tarball for {}: tar exited with status code {}", + pkg.name.unwrap(), + exit.code().unwrap() + ); + } + + resolved = hosted; + + Specifics::Git { workdir } + } + None => Specifics::Registry { + integrity: pkg + .integrity + .expect("non-git dependencies should have associated integrity") + .into_best() + .expect("non-git dependencies should have non-empty associated integrity"), + }, + }; + + Ok(Package { + name: pkg.name.unwrap(), + url: resolved, + specifics, + }) + } + + pub fn tarball(&self) -> anyhow::Result> { + match &self.specifics { + Specifics::Registry { .. } => Ok(util::get_url_body_with_retry(&self.url)?), + Specifics::Git { workdir } => Ok(Command::new("tar") + .args([ + "--sort=name", + "--mtime=@0", + "--owner=0", + "--group=0", + "--numeric-owner", + "--format=gnu", + "-I", + "gzip -n -9", + "--create", + "-C", + ]) + .arg(workdir.path()) + .arg("package") + .output()? + .stdout), + } + } + + pub fn integrity(&self) -> Option<&lock::Hash> { + match &self.specifics { + Specifics::Registry { integrity } => Some(integrity), + Specifics::Git { .. } => None, + } + } +} + +#[allow(clippy::case_sensitive_file_extension_comparisons)] +fn get_hosted_git_url(url: &Url) -> anyhow::Result> { + if ["git", "git+ssh", "git+https", "ssh"].contains(&url.scheme()) { + let mut s = url + .path_segments() + .ok_or_else(|| anyhow!("bad URL: {url}"))?; + + let mut get_url = || match url.host_str()? { + "github.com" => { + let user = s.next()?; + let mut project = s.next()?; + let typ = s.next(); + let mut commit = s.next(); + + if typ.is_none() { + commit = url.fragment(); + } else if typ.is_some() && typ != Some("tree") { + return None; + } + + if project.ends_with(".git") { + project = project.strip_suffix(".git")?; + } + + let commit = commit.unwrap(); + + Some( + Url::parse(&format!( + "https://codeload.github.com/{user}/{project}/tar.gz/{commit}" + )) + .ok()?, + ) + } + "bitbucket.org" => { + let user = s.next()?; + let mut project = s.next()?; + let aux = s.next(); + + if aux == Some("get") { + return None; + } + + if project.ends_with(".git") { + project = project.strip_suffix(".git")?; + } + + let commit = url.fragment()?; + + Some( + Url::parse(&format!( + "https://bitbucket.org/{user}/{project}/get/{commit}.tar.gz" + )) + .ok()?, + ) + } + "gitlab.com" => { + /* let path = &url.path()[1..]; + + if path.contains("/~/") || path.contains("/archive.tar.gz") { + return None; + } + + let user = s.next()?; + let mut project = s.next()?; + + if project.ends_with(".git") { + project = project.strip_suffix(".git")?; + } + + let commit = url.fragment()?; + + Some( + Url::parse(&format!( + "https://gitlab.com/{user}/{project}/repository/archive.tar.gz?ref={commit}" + )) + .ok()?, + ) */ + + // lmao: https://github.com/npm/hosted-git-info/pull/109 + None + } + "git.sr.ht" => { + let user = s.next()?; + let mut project = s.next()?; + let aux = s.next(); + + if aux == Some("archive") { + return None; + } + + if project.ends_with(".git") { + project = project.strip_suffix(".git")?; + } + + let commit = url.fragment()?; + + Some( + Url::parse(&format!( + "https://git.sr.ht/{user}/{project}/archive/{commit}.tar.gz" + )) + .ok()?, + ) + } + _ => None, + }; + + match get_url() { + Some(u) => Ok(Some(u)), + None => Err(anyhow!("This lockfile either contains a Git dependency with an unsupported host, or a malformed URL in the lockfile: {url}")) + } + } else { + Ok(None) + } +} + +#[cfg(test)] +mod tests { + use super::get_hosted_git_url; + use url::Url; + + #[test] + fn hosted_git_urls() { + for (input, expected) in [ + ( + "git+ssh://git@github.com/castlabs/electron-releases.git#fc5f78d046e8d7cdeb66345a2633c383ab41f525", + Some("https://codeload.github.com/castlabs/electron-releases/tar.gz/fc5f78d046e8d7cdeb66345a2633c383ab41f525"), + ), + ( + "git+ssh://bitbucket.org/foo/bar#branch", + Some("https://bitbucket.org/foo/bar/get/branch.tar.gz") + ), + ( + "git+ssh://git.sr.ht/~foo/bar#branch", + Some("https://git.sr.ht/~foo/bar/archive/branch.tar.gz") + ), + ] { + assert_eq!( + get_hosted_git_url(&Url::parse(input).unwrap()).unwrap(), + expected.map(|u| Url::parse(u).unwrap()) + ); + } + + assert!( + get_hosted_git_url(&Url::parse("ssh://git@gitlab.com/foo/bar.git#fix/bug").unwrap()) + .is_err(), + "GitLab URLs should be marked as invalid (lol)" + ); + } +} diff --git a/pkgs/build-support/node/fetch-npm-deps/src/util.rs b/pkgs/build-support/node/fetch-npm-deps/src/util.rs new file mode 100644 index 0000000..023ba56 --- /dev/null +++ b/pkgs/build-support/node/fetch-npm-deps/src/util.rs @@ -0,0 +1,83 @@ +use backoff::{retry, ExponentialBackoff}; +use data_encoding::BASE64; +use digest::Digest; +use isahc::{ + config::{CaCertificate, Configurable, RedirectPolicy, SslOption}, + Body, Request, RequestExt, +}; +use nix_nar::{Encoder, NarError}; +use serde_json::{Map, Value}; +use sha2::Sha256; +use std::{ + env, + io::{self, Read}, + path::Path, +}; +use url::Url; + +pub fn get_url(url: &Url) -> Result { + let mut request = Request::get(url.as_str()).redirect_policy(RedirectPolicy::Limit(10)); + + // Respect SSL_CERT_FILE if environment variable exists + if let Ok(ssl_cert_file) = env::var("SSL_CERT_FILE") { + if Path::new(&ssl_cert_file).exists() { + // When file exists, use it. NIX_SSL_CERT_FILE will still override. + request = request.ssl_ca_certificate(CaCertificate::file(ssl_cert_file)); + } else if env::var("outputHash").is_ok() { + // When file does not exist, assume we are downloading in a FOD and + // therefore do not need to check certificates, since the output is + // already hashed. + request = request.ssl_options(SslOption::DANGER_ACCEPT_INVALID_CERTS); + } + } + + // Respect NIX_NPM_TOKENS environment variable, which should be a JSON mapping in the shape of: + // `{ "registry.example.com": "example-registry-bearer-token", ... }` + if let Some(host) = url.host_str() { + if let Ok(npm_tokens) = env::var("NIX_NPM_TOKENS") { + if let Ok(tokens) = serde_json::from_str::>(&npm_tokens) { + if let Some(token) = tokens.get(host).and_then(serde_json::Value::as_str) { + request = request.header("Authorization", format!("Bearer {token}")); + } + } + } + } + + Ok(request.body(())?.send()?.into_body()) +} + +pub fn get_url_body_with_retry(url: &Url) -> Result, isahc::Error> { + retry(ExponentialBackoff::default(), || { + get_url(url) + .and_then(|mut body| { + let mut buf = Vec::new(); + + body.read_to_end(&mut buf)?; + + Ok(buf) + }) + .map_err(|err| { + if err.is_network() || err.is_timeout() { + backoff::Error::transient(err) + } else { + backoff::Error::permanent(err) + } + }) + }) + .map_err(|backoff_err| match backoff_err { + backoff::Error::Permanent(err) + | backoff::Error::Transient { + err, + retry_after: _, + } => err, + }) +} + +pub fn make_sri_hash(path: &Path) -> Result { + let mut encoder = Encoder::new(path)?; + let mut hasher = Sha256::new(); + + io::copy(&mut encoder, &mut hasher)?; + + Ok(format!("sha256-{}", BASE64.encode(&hasher.finalize()))) +} diff --git a/pkgs/build-support/node/fetch-yarn-deps/common.js b/pkgs/build-support/node/fetch-yarn-deps/common.js new file mode 100644 index 0000000..8e0d1b0 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/common.js @@ -0,0 +1,17 @@ +const path = require('path') + +// This has to match the logic in pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/urlToName.js +// so that fixup_yarn_lock produces the same paths +const urlToName = url => { + const isCodeloadGitTarballUrl = url.startsWith('https://codeload.github.com/') && url.includes('/tar.gz/') + + if (url.startsWith('git+') || isCodeloadGitTarballUrl) { + return path.basename(url) + } else { + return url + .replace(/https:\/\/(.)*(.com)\//g, '') // prevents having long directory names + .replace(/[@/%:-]/g, '_') // replace @ and : and - and % characters with underscore + } +} + +module.exports = { urlToName }; diff --git a/pkgs/build-support/node/fetch-yarn-deps/default.nix b/pkgs/build-support/node/fetch-yarn-deps/default.nix new file mode 100644 index 0000000..7f0e069 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/default.nix @@ -0,0 +1,105 @@ +{ stdenv, lib, makeWrapper, coreutils, nix-prefetch-git, fetchurl, nodejs-slim, prefetch-yarn-deps, cacert, callPackage, nix }: + +let + yarnpkg-lockfile-tar = fetchurl { + url = "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz"; + hash = "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="; + }; + + tests = callPackage ./tests {}; + +in { + prefetch-yarn-deps = stdenv.mkDerivation { + name = "prefetch-yarn-deps"; + + dontUnpack = true; + dontBuild = true; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ nodejs-slim ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/libexec + + tar --strip-components=1 -xf ${yarnpkg-lockfile-tar} package/index.js + mv index.js $out/libexec/yarnpkg-lockfile.js + cp ${./.}/common.js ${./.}/index.js $out/libexec/ + + patchShebangs $out/libexec + makeWrapper $out/libexec/index.js $out/bin/prefetch-yarn-deps \ + --prefix PATH : ${lib.makeBinPath [ coreutils nix-prefetch-git nix ]} + + runHook postInstall + ''; + + passthru = { inherit tests; }; + }; + + fixup-yarn-lock = stdenv.mkDerivation { + name = "fixup-yarn-lock"; + + dontUnpack = true; + dontBuild = true; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ nodejs-slim ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/libexec + + tar --strip-components=1 -xf ${yarnpkg-lockfile-tar} package/index.js + mv index.js $out/libexec/yarnpkg-lockfile.js + cp ${./.}/common.js ${./.}/fixup.js $out/libexec/ + + patchShebangs $out/libexec + makeWrapper $out/libexec/fixup.js $out/bin/fixup-yarn-lock + + runHook postInstall + ''; + + passthru = { inherit tests; }; + }; + + fetchYarnDeps = let + f = { + name ? "offline", + src ? null, + hash ? "", + sha256 ? "", + ... + }@args: let + hash_ = + if hash != "" then { outputHashAlgo = null; outputHash = hash; } + else if sha256 != "" then { outputHashAlgo = "sha256"; outputHash = sha256; } + else { outputHashAlgo = "sha256"; outputHash = lib.fakeSha256; }; + in stdenv.mkDerivation ({ + inherit name; + + dontUnpack = src == null; + dontInstall = true; + + nativeBuildInputs = [ prefetch-yarn-deps cacert ]; + GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + NODE_EXTRA_CA_CERTS = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + buildPhase = '' + runHook preBuild + + yarnLock=''${yarnLock:=$PWD/yarn.lock} + mkdir -p $out + (cd $out; prefetch-yarn-deps --verbose --builder $yarnLock) + + runHook postBuild + ''; + + outputHashMode = "recursive"; + } // hash_ // (removeAttrs args ["src" "name" "hash" "sha256"])); + + in lib.setFunctionArgs f (lib.functionArgs f) // { + inherit tests; + }; +} diff --git a/pkgs/build-support/node/fetch-yarn-deps/fixup.js b/pkgs/build-support/node/fetch-yarn-deps/fixup.js new file mode 100755 index 0000000..732e569 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/fixup.js @@ -0,0 +1,76 @@ +#!/usr/bin/env node +'use strict' + +const fs = require('fs') +const process = require('process') +const lockfile = require('./yarnpkg-lockfile.js') +const { urlToName } = require('./common.js') + +const fixupYarnLock = async (lockContents, verbose) => { + const lockData = lockfile.parse(lockContents) + + const fixedData = Object.fromEntries( + Object.entries(lockData.object) + .map(([dep, pkg]) => { + const [ url, hash ] = pkg.resolved.split("#", 2) + + if (hash || url.startsWith("https://codeload.github.com")) { + if (verbose) console.log(`Removing integrity for git dependency ${dep}`) + delete pkg.integrity + } + + if (verbose) console.log(`Rewriting URL ${url} for dependency ${dep}`) + pkg.resolved = urlToName(url) + if (hash) + pkg.resolved += `#${hash}` + + return [dep, pkg] + }) + ) + + if (verbose) console.log('Done') + + return fixedData +} + +const showUsage = async () => { + process.stderr.write(` +syntax: fixup-yarn-lock [path to yarn.lock] [options] + +Options: + -h --help Show this help + -v --verbose Verbose output +`) + process.exit(1) +} + +const main = async () => { + const args = process.argv.slice(2) + let next, lockFile, verbose + while (next = args.shift()) { + if (next == '--verbose' || next == '-v') { + verbose = true + } else if (next == '--help' || next == '-h') { + showUsage() + } else if (!lockFile) { + lockFile = next + } else { + showUsage() + } + } + let lockContents + try { + lockContents = await fs.promises.readFile(lockFile || 'yarn.lock', 'utf-8') + } catch { + showUsage() + } + + const fixedData = await fixupYarnLock(lockContents, verbose) + await fs.promises.writeFile(lockFile || 'yarn.lock', lockfile.stringify(fixedData)) +} + +main() + .catch(e => { + console.error(e) + process.exit(1) + }) diff --git a/pkgs/build-support/node/fetch-yarn-deps/index.js b/pkgs/build-support/node/fetch-yarn-deps/index.js new file mode 100755 index 0000000..e60fdeb --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/index.js @@ -0,0 +1,206 @@ +#!/usr/bin/env node +'use strict' + +const fs = require('fs') +const crypto = require('crypto') +const process = require('process') +const https = require('https') +const child_process = require('child_process') +const path = require('path') +const lockfile = require('./yarnpkg-lockfile.js') +const { promisify } = require('util') +const url = require('url') +const { urlToName } = require('./common.js') + +const execFile = promisify(child_process.execFile) + +const exec = async (...args) => { + const res = await execFile(...args) + if (res.error) throw new Error(res.stderr) + return res +} + +const downloadFileHttps = (fileName, url, expectedHash, hashType = 'sha1') => { + return new Promise((resolve, reject) => { + const get = (url, redirects = 0) => https.get(url, (res) => { + if(redirects > 10) { + reject('Too many redirects!'); + return; + } + if(res.statusCode === 301 || res.statusCode === 302) { + return get(res.headers.location, redirects + 1) + } + const file = fs.createWriteStream(fileName) + const hash = crypto.createHash(hashType) + res.pipe(file) + res.pipe(hash).setEncoding('hex') + res.on('end', () => { + file.close() + const h = hash.read() + if (expectedHash === undefined){ + console.log(`Warning: lockfile url ${url} doesn't end in "#" to validate against. Downloaded file had hash ${h}.`); + } else if (h != expectedHash) return reject(new Error(`hash mismatch, expected ${expectedHash}, got ${h}`)) + resolve() + }) + res.on('error', e => reject(e)) + }) + get(url) + }) +} + +const downloadGit = async (fileName, url, rev) => { + await exec('nix-prefetch-git', [ + '--out', fileName + '.tmp', + '--url', url, + '--rev', rev, + '--builder' + ]) + + await exec('tar', [ + // hopefully make it reproducible across runs and systems + '--owner=0', '--group=0', '--numeric-owner', '--format=gnu', '--sort=name', '--mtime=@1', + + // Set u+w because tar-fs can't unpack archives with read-only dirs: https://github.com/mafintosh/tar-fs/issues/79 + '--mode', 'u+w', + + '-C', fileName + '.tmp', + '-cf', fileName, '.' + ]) + + await exec('rm', [ '-rf', fileName + '.tmp', ]) +} + +const isGitUrl = pattern => { + // https://github.com/yarnpkg/yarn/blob/3119382885ea373d3c13d6a846de743eca8c914b/src/resolvers/exotics/git-resolver.js#L15-L47 + const GIT_HOSTS = ['github.com', 'gitlab.com', 'bitbucket.com', 'bitbucket.org'] + const GIT_PATTERN_MATCHERS = [/^git:/, /^git\+.+:/, /^ssh:/, /^https?:.+\.git$/, /^https?:.+\.git#.+/] + + for (const matcher of GIT_PATTERN_MATCHERS) if (matcher.test(pattern)) return true + + const {hostname, path} = url.parse(pattern) + if (hostname && path && GIT_HOSTS.indexOf(hostname) >= 0 + // only if dependency is pointing to a git repo, + // e.g. facebook/flow and not file in a git repo facebook/flow/archive/v1.0.0.tar.gz + && path.split('/').filter(p => !!p).length === 2 + ) return true + + return false +} + +const downloadPkg = (pkg, verbose) => { + const fileMarker = '@file:' + const split = pkg.key.split(fileMarker) + if (split.length == 2) { + console.info(`ignoring lockfile entry "${split[0]}" which points at path "${split[1]}"`) + return + } else if (split.length > 2) { + throw new Error(`The lockfile entry key "${pkg.key}" contains "${fileMarker}" more than once. Processing is not implemented.`) + } + + if (pkg.resolved === undefined) { + throw new Error(`The lockfile entry with key "${pkg.key}" cannot be downloaded because it is missing the "resolved" attribute, which should contain the URL to download from. The lockfile might be invalid.`) + } + + const [ url, hash ] = pkg.resolved.split('#') + if (verbose) console.log('downloading ' + url) + const fileName = urlToName(url) + if (url.startsWith('https://codeload.github.com/') && url.includes('/tar.gz/')) { + const s = url.split('/') + return downloadGit(fileName, `https://github.com/${s[3]}/${s[4]}.git`, s[s.length-1]) + } else if (url.startsWith('https://github.com/') && url.endsWith('.tar.gz')) { + const s = url.split('/') + return downloadGit(fileName, `https://github.com/${s[3]}/${s[4]}.git`, s[s.length-1].replace(/.tar.gz$/, '')) + } else if (isGitUrl(url)) { + return downloadGit(fileName, url.replace(/^git\+/, ''), hash) + } else if (url.startsWith('https://')) { + if (typeof pkg.integrity === 'string' || pkg.integrity instanceof String) { + const [ type, checksum ] = pkg.integrity.split('-') + return downloadFileHttps(fileName, url, Buffer.from(checksum, 'base64').toString('hex'), type) + } + return downloadFileHttps(fileName, url, hash) + } else if (url.startsWith('file:')) { + console.warn(`ignoring unsupported file:path url "${url}"`) + } else { + throw new Error('don\'t know how to download "' + url + '"') + } +} + +const performParallel = tasks => { + const worker = async () => { + while (tasks.length > 0) await tasks.shift()() + } + + const workers = [] + for (let i = 0; i < 4; i++) { + workers.push(worker()) + } + + return Promise.all(workers) +} + +const prefetchYarnDeps = async (lockContents, verbose) => { + const lockData = lockfile.parse(lockContents) + await performParallel( + Object.entries(lockData.object) + .map(([key, value]) => () => downloadPkg({ key, ...value }, verbose)) + ) + await fs.promises.writeFile('yarn.lock', lockContents) + if (verbose) console.log('Done') +} + +const showUsage = async () => { + process.stderr.write(` +syntax: prefetch-yarn-deps [path to yarn.lock] [options] + +Options: + -h --help Show this help + -v --verbose Verbose output + --builder Only perform the download to current directory, then exit +`) + process.exit(1) +} + +const main = async () => { + const args = process.argv.slice(2) + let next, lockFile, verbose, isBuilder + while (next = args.shift()) { + if (next == '--builder') { + isBuilder = true + } else if (next == '--verbose' || next == '-v') { + verbose = true + } else if (next == '--help' || next == '-h') { + showUsage() + } else if (!lockFile) { + lockFile = next + } else { + showUsage() + } + } + let lockContents + try { + lockContents = await fs.promises.readFile(lockFile || 'yarn.lock', 'utf-8') + } catch { + showUsage() + } + + if (isBuilder) { + await prefetchYarnDeps(lockContents, verbose) + } else { + const { stdout: tmpDir } = await exec('mktemp', [ '-d' ]) + + try { + process.chdir(tmpDir.trim()) + await prefetchYarnDeps(lockContents, verbose) + const { stdout: hash } = await exec('nix-hash', [ '--type', 'sha256', '--base32', tmpDir.trim() ]) + console.log(hash) + } finally { + await exec('rm', [ '-rf', tmpDir.trim() ]) + } + } +} + +main() + .catch(e => { + console.error(e) + process.exit(1) + }) diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/default.nix b/pkgs/build-support/node/fetch-yarn-deps/tests/default.nix new file mode 100644 index 0000000..8057d05 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/default.nix @@ -0,0 +1,24 @@ +{ testers, fetchYarnDeps, ... }: + +{ + file = testers.invalidateFetcherByDrvHash fetchYarnDeps { + yarnLock = ./file.lock; + sha256 = "sha256-BPuyQVCbdpFL/iRhmarwWAmWO2NodlVCOY9JU+4pfa4="; + }; + simple = testers.invalidateFetcherByDrvHash fetchYarnDeps { + yarnLock = ./simple.lock; + sha256 = "sha256-FRrt8BixleILmFB2ZV8RgPNLqgS+dlH5nWoPgeaaNQ8="; + }; + gitDep = testers.invalidateFetcherByDrvHash fetchYarnDeps { + yarnLock = ./git.lock; + sha256 = "sha256-f90IiEzHDiBdswWewRBHcJfqqpPipaMg8N0DVLq2e8Q="; + }; + githubDep = testers.invalidateFetcherByDrvHash fetchYarnDeps { + yarnLock = ./github.lock; + sha256 = "sha256-DIKrhDKoqm7tHZmcuh9eK9VTqp6BxeW0zqDUpY4F57A="; + }; + gitUrlDep = testers.invalidateFetcherByDrvHash fetchYarnDeps { + yarnLock = ./giturl.lock; + sha256 = "sha256-VPnyqN6lePQZGXwR7VhbFnP7/0/LB621RZwT1F+KzVQ="; + }; +} diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/file.lock b/pkgs/build-support/node/fetch-yarn-deps/tests/file.lock new file mode 100644 index 0000000..4881d83 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/file.lock @@ -0,0 +1,9 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@org/somepack@file:vendor/orgpacks/somepack/assets": + version "1.0.0" + +"otherpack@file:vendor/otherpack": + version "1.0.0" diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/git.lock b/pkgs/build-support/node/fetch-yarn-deps/tests/git.lock new file mode 100644 index 0000000..9eda5b2 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/git.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"async@git+https://github.com/caolan/async": + version "3.2.1" + resolved "git+https://github.com/caolan/async#fc9ba651341af5ab974aade6b1640e345912be83" diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/github.lock b/pkgs/build-support/node/fetch-yarn-deps/tests/github.lock new file mode 100644 index 0000000..057e043 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/github.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"async@github:caolan/async": + version "3.2.1" + resolved "https://codeload.github.com/caolan/async/tar.gz/fc9ba651341af5ab974aade6b1640e345912be83" diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/giturl.lock b/pkgs/build-support/node/fetch-yarn-deps/tests/giturl.lock new file mode 100644 index 0000000..154030a --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/giturl.lock @@ -0,0 +1,11 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"autocomplete-atom-api@https://codeload.github.com/atom/autocomplete-atom-api/legacy.tar.gz/refs/tags/v0.10.7": + version "0.10.7" + resolved "https://codeload.github.com/atom/autocomplete-atom-api/legacy.tar.gz/refs/tags/v0.10.7#c9d51fa721d543ccfc1b2189101155e81db6b97d" + +"find-and-replace@https://github.com/atom-community/find-and-replace/archive/refs/tags/v0.220.1.tar.gz": + version "0.220.1" + resolved "https://github.com/atom-community/find-and-replace/archive/refs/tags/v0.220.1.tar.gz#d7a0f56511e38ee72a89895a795bbbcab4a1a405" diff --git a/pkgs/build-support/node/fetch-yarn-deps/tests/simple.lock b/pkgs/build-support/node/fetch-yarn-deps/tests/simple.lock new file mode 100644 index 0000000..db2f4b2 --- /dev/null +++ b/pkgs/build-support/node/fetch-yarn-deps/tests/simple.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +lit-html@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.4.1.tgz#0c6f3ee4ad4eb610a49831787f0478ad8e9ae5e0" + integrity sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA== diff --git a/pkgs/build-support/node/import-npm-lock/default.nix b/pkgs/build-support/node/import-npm-lock/default.nix new file mode 100644 index 0000000..d530b8e --- /dev/null +++ b/pkgs/build-support/node/import-npm-lock/default.nix @@ -0,0 +1,134 @@ +{ lib +, fetchurl +, stdenv +, callPackages +, runCommand +}: + +let + inherit (builtins) match elemAt toJSON removeAttrs; + inherit (lib) importJSON mapAttrs; + + matchGitHubReference = match "github(.com)?:.+"; + getName = package: package.name or "unknown"; + getVersion = package: package.version or "0.0.0"; + + # Fetch a module from package-lock.json -> packages + fetchModule = + { module + , npmRoot ? null + }: ( + if module ? "resolved" then + ( + let + # Parse scheme from URL + mUrl = match "(.+)://(.+)" module.resolved; + scheme = elemAt mUrl 0; + in + ( + if mUrl == null then + ( + assert npmRoot != null; { + outPath = npmRoot + "/${module.resolved}"; + } + ) + else if (scheme == "http" || scheme == "https") then + ( + fetchurl { + url = module.resolved; + hash = module.integrity; + } + ) + else if lib.hasPrefix "git" module.resolved then + ( + builtins.fetchGit { + url = module.resolved; + } + ) + else throw "Unsupported URL scheme: ${scheme}" + ) + ) + else null + ); + + # Manage node_modules outside of the store with hooks + hooks = callPackages ./hooks { }; + +in +{ + importNpmLock = + { npmRoot ? null + , package ? importJSON (npmRoot + "/package.json") + , packageLock ? importJSON (npmRoot + "/package-lock.json") + , pname ? getName package + , version ? getVersion package + }: + let + mapLockDependencies = + mapAttrs + (name: version: ( + # Substitute the constraint with the version of the dependency from the top-level of package-lock. + if ( + # if the version is `latest` + version == "latest" + || + # Or if it's a github reference + matchGitHubReference version != null + ) then packageLock'.packages.${"node_modules/${name}"}.version + # But not a regular version constraint + else version + )); + + packageLock' = packageLock // { + packages = + mapAttrs + (_: module: + let + src = fetchModule { + inherit module npmRoot; + }; + in + (removeAttrs module [ + "link" + "funding" + ]) // lib.optionalAttrs (src != null) { + resolved = "file:${src}"; + } // lib.optionalAttrs (module ? dependencies) { + dependencies = mapLockDependencies module.dependencies; + } // lib.optionalAttrs (module ? optionalDependencies) { + optionalDependencies = mapLockDependencies module.optionalDependencies; + }) + packageLock.packages; + }; + + mapPackageDependencies = mapAttrs (name: _: packageLock'.packages.${"node_modules/${name}"}.resolved); + + # Substitute dependency references in package.json with Nix store paths + packageJSON' = package // lib.optionalAttrs (package ? dependencies) { + dependencies = mapPackageDependencies package.dependencies; + } // lib.optionalAttrs (package ? devDependencies) { + devDependencies = mapPackageDependencies package.devDependencies; + }; + + pname = package.name or "unknown"; + + in + runCommand "${pname}-${version}-sources" + { + inherit pname version; + + passAsFile = [ "package" "packageLock" ]; + + package = toJSON packageJSON'; + packageLock = toJSON packageLock'; + } '' + mkdir $out + cp "$packagePath" $out/package.json + cp "$packageLockPath" $out/package-lock.json + ''; + + inherit hooks; + inherit (hooks) npmConfigHook; + + __functor = self: self.importNpmLock; +} diff --git a/pkgs/build-support/node/import-npm-lock/hooks/canonicalize-symlinks.js b/pkgs/build-support/node/import-npm-lock/hooks/canonicalize-symlinks.js new file mode 100644 index 0000000..81cd259 --- /dev/null +++ b/pkgs/build-support/node/import-npm-lock/hooks/canonicalize-symlinks.js @@ -0,0 +1,52 @@ +#!/usr/bin/env node +const fs = require("fs"); +const path = require("path"); + +// When installing files rewritten to the Nix store with npm +// npm writes the symlinks relative to the build directory. +// +// This makes relocating node_modules tricky when refering to the store. +// This script walks node_modules and canonicalizes symlinks. + +async function canonicalize(storePrefix, root) { + console.log(storePrefix, root) + const entries = await fs.promises.readdir(root); + const paths = entries.map((entry) => path.join(root, entry)); + + const stats = await Promise.all( + paths.map(async (path) => { + return { + path: path, + stat: await fs.promises.lstat(path), + }; + }) + ); + + const symlinks = stats.filter((stat) => stat.stat.isSymbolicLink()); + const dirs = stats.filter((stat) => stat.stat.isDirectory()); + + // Canonicalize symlinks to their real path + await Promise.all( + symlinks.map(async (stat) => { + const target = await fs.promises.realpath(stat.path); + if (target.startsWith(storePrefix)) { + await fs.promises.unlink(stat.path); + await fs.promises.symlink(target, stat.path); + } + }) + ); + + // Recurse into directories + await Promise.all(dirs.map((dir) => canonicalize(storePrefix, dir.path))); +} + +async function main() { + const args = process.argv.slice(2); + const storePrefix = args[0]; + + if (fs.existsSync("node_modules")) { + await canonicalize(storePrefix, "node_modules"); + } +} + +main(); diff --git a/pkgs/build-support/node/import-npm-lock/hooks/default.nix b/pkgs/build-support/node/import-npm-lock/hooks/default.nix new file mode 100644 index 0000000..5990371 --- /dev/null +++ b/pkgs/build-support/node/import-npm-lock/hooks/default.nix @@ -0,0 +1,13 @@ +{ callPackage, lib, makeSetupHook, srcOnly, nodejs }: +{ + npmConfigHook = makeSetupHook + { + name = "npm-config-hook"; + substitutions = { + nodeSrc = srcOnly nodejs; + nodeGyp = "${nodejs}/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js"; + canonicalizeSymlinksScript = ./canonicalize-symlinks.js; + storePrefix = builtins.storeDir; + }; + } ./npm-config-hook.sh; +} diff --git a/pkgs/build-support/node/import-npm-lock/hooks/npm-config-hook.sh b/pkgs/build-support/node/import-npm-lock/hooks/npm-config-hook.sh new file mode 100644 index 0000000..35c3a20 --- /dev/null +++ b/pkgs/build-support/node/import-npm-lock/hooks/npm-config-hook.sh @@ -0,0 +1,70 @@ +# shellcheck shell=bash + +npmConfigHook() { + echo "Executing npmConfigHook" + + if [ -n "${npmRoot-}" ]; then + pushd "$npmRoot" + fi + + if [ -z "${npmDeps-}" ]; then + echo "Error: 'npmDeps' should be set when using npmConfigHook." + exit 1 + fi + + echo "Configuring npm" + + export HOME="$TMPDIR" + export npm_config_nodedir="@nodeSrc@" + export npm_config_node_gyp="@nodeGyp@" + npm config set offline true + npm config set progress false + npm config set fund false + + echo "Installing patched package.json/package-lock.json" + + # Save original package.json/package-lock.json for closure size reductions. + # The patched one contains store paths we don't want at runtime. + mv package.json .package.json.orig + if test -f package-lock.json; then # Not all packages have package-lock.json. + mv package-lock.json .package-lock.json.orig + fi + cp --no-preserve=mode "${npmDeps}/package.json" package.json + cp --no-preserve=mode "${npmDeps}/package-lock.json" package-lock.json + + echo "Installing dependencies" + + if ! npm install --ignore-scripts $npmInstallFlags "${npmInstallFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then + echo + echo "ERROR: npm failed to install dependencies" + echo + echo "Here are a few things you can try, depending on the error:" + echo '1. Set `npmFlags = [ "--legacy-peer-deps" ]`' + echo + + exit 1 + fi + + patchShebangs node_modules + + npm rebuild $npmRebuildFlags "${npmRebuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}" + + patchShebangs node_modules + + # Canonicalize symlinks from relative paths to the Nix store. + node @canonicalizeSymlinksScript@ @storePrefix@ + + # Revert to pre-patched package.json/package-lock.json for closure size reductions + mv .package.json.orig package.json + if test -f ".package-lock.json.orig"; then + mv .package-lock.json.orig package-lock.json + fi + + if [ -n "${npmRoot-}" ]; then + popd + fi + + echo "Finished npmConfigHook" +} + +postConfigureHooks+=(npmConfigHook) diff --git a/pkgs/build-support/nuke-references/darwin-sign-fixup.sh b/pkgs/build-support/nuke-references/darwin-sign-fixup.sh new file mode 100644 index 0000000..940c18e --- /dev/null +++ b/pkgs/build-support/nuke-references/darwin-sign-fixup.sh @@ -0,0 +1,5 @@ +# Fixup hook for nukeReferences, not stdenv + +source @signingUtils@ + +fixupHooks+=(signIfRequired) diff --git a/pkgs/build-support/nuke-references/default.nix b/pkgs/build-support/nuke-references/default.nix new file mode 100644 index 0000000..4472d6e --- /dev/null +++ b/pkgs/build-support/nuke-references/default.nix @@ -0,0 +1,43 @@ +# The program `nuke-refs' created by this derivation replaces all +# references to the Nix store in the specified files by a non-existant +# path (/nix/store/eeee...). This is useful for getting rid of +# dependencies that you know are not actually needed at runtime. + +{ lib, stdenvNoCC, perl, signingUtils, shell ? stdenvNoCC.shell }: + +let + stdenv = stdenvNoCC; + + darwinCodeSign = stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64; +in + +stdenvNoCC.mkDerivation { + name = "nuke-references"; + + strictDeps = true; + enableParallelBuilding = true; + dontUnpack = true; + dontConfigure = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/bin + substituteAll ${./nuke-refs.sh} $out/bin/nuke-refs + chmod a+x $out/bin/nuke-refs + ''; + + postFixup = lib.optionalString darwinCodeSign '' + mkdir -p $out/nix-support + substituteAll ${./darwin-sign-fixup.sh} $out/nix-support/setup-hooks.sh + ''; + + # FIXME: get rid of perl dependency. + env = { + inherit perl; + inherit (builtins) storeDir; + shell = lib.getBin shell + (shell.shellPath or ""); + signingUtils = lib.optionalString darwinCodeSign signingUtils; + }; + + meta.mainProgram = "nuke-refs"; +} diff --git a/pkgs/build-support/nuke-references/nuke-refs.sh b/pkgs/build-support/nuke-references/nuke-refs.sh new file mode 100644 index 0000000..21eb855 --- /dev/null +++ b/pkgs/build-support/nuke-references/nuke-refs.sh @@ -0,0 +1,33 @@ +#! @shell@ + +fixupHooks=() + +if [ -e @out@/nix-support/setup-hooks.sh ]; then + source @out@/nix-support/setup-hooks.sh +fi + +excludes="" +while getopts e: o; do + case "$o" in + e) storeId=$(echo "$OPTARG" | @perl@/bin/perl -ne "print \"\$1\" if m|^\Q@storeDir@\E/([a-z0-9]{32})-.*|") + if [ -z "$storeId" ]; then + echo "-e argument must be a Nix store path" + exit 1 + fi + excludes="$excludes(?!$storeId)" + ;; + esac +done +shift $(($OPTIND-1)) + +for i in "$@"; do + if test ! -L "$i" -a -f "$i"; then + cat "$i" | @perl@/bin/perl -pe "s|\Q@storeDir@\E/$excludes[a-z0-9]{32}-|@storeDir@/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" > "$i.tmp" + if test -x "$i"; then chmod +x "$i.tmp"; fi + mv "$i.tmp" "$i" + + for hook in "${fixupHooks[@]}"; do + eval "$hook" "$i" + done + fi +done diff --git a/pkgs/build-support/ocaml/dune.nix b/pkgs/build-support/ocaml/dune.nix new file mode 100644 index 0000000..972244f --- /dev/null +++ b/pkgs/build-support/ocaml/dune.nix @@ -0,0 +1,50 @@ +{ lib, stdenv, ocaml, findlib, dune_1, dune_2, dune_3 }: + +{ pname, version, nativeBuildInputs ? [], enableParallelBuilding ? true, ... }@args: + +let Dune = + let dune-version = args.duneVersion or "3"; in + { "1" = dune_1; "2" = dune_2; "3" = dune_3; }."${dune-version}" +; in + +if (args ? minimumOCamlVersion && lib.versionOlder ocaml.version args.minimumOCamlVersion) || + (args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion) +then throw "${pname}-${version} is not available for OCaml ${ocaml.version}" +else + +stdenv.mkDerivation ({ + + inherit enableParallelBuilding; + dontAddStaticConfigureFlags = true; + configurePlatforms = []; + + buildPhase = '' + runHook preBuild + dune build -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES} + runHook postBuild + ''; + checkPhase = '' + runHook preCheck + dune runtest -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES} + runHook postCheck + ''; + installPhase = '' + runHook preInstall + dune install --prefix $out --libdir $OCAMLFIND_DESTDIR ${pname} \ + ${if lib.versionAtLeast Dune.version "2.9" + then "--docdir $out/share/doc --mandir $out/share/man" + else ""} + runHook postInstall + ''; + + strictDeps = true; + +} // (builtins.removeAttrs args [ "minimalOCamlVersion" "duneVersion" ]) // { + + name = "ocaml${ocaml.version}-${pname}-${version}"; + + nativeBuildInputs = [ ocaml Dune findlib ] ++ nativeBuildInputs; + + meta = (args.meta or {}) // { platforms = args.meta.platforms or ocaml.meta.platforms; }; + +}) diff --git a/pkgs/build-support/ocaml/oasis.nix b/pkgs/build-support/ocaml/oasis.nix new file mode 100644 index 0000000..91daad5 --- /dev/null +++ b/pkgs/build-support/ocaml/oasis.nix @@ -0,0 +1,46 @@ +{ lib, stdenv, ocaml_oasis, ocaml, findlib, ocamlbuild }: + +{ pname, version, nativeBuildInputs ? [], meta ? { platforms = ocaml.meta.platforms or []; }, + minimumOCamlVersion ? null, + createFindlibDestdir ? true, + dontStrip ? true, + ... +}@args: + +if args ? minimumOCamlVersion && + lib.versionOlder ocaml.version args.minimumOCamlVersion +then throw "${pname}-${version} is not available for OCaml ${ocaml.version}" +else + +stdenv.mkDerivation (args // { + name = "ocaml${ocaml.version}-${pname}-${version}"; + + nativeBuildInputs = [ ocaml findlib ocamlbuild ocaml_oasis ] ++ nativeBuildInputs; + + inherit createFindlibDestdir; + inherit dontStrip; + + strictDeps = true; + + buildPhase = '' + runHook preBuild + oasis setup + ocaml setup.ml -configure --prefix $OCAMLFIND_DESTDIR --exec-prefix $out + ocaml setup.ml -build + runHook postBuild + ''; + + checkPhase = '' + runHook preCheck + ocaml setup.ml -test + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out + ocaml setup.ml -install + runHook postInstall + ''; + +}) diff --git a/pkgs/build-support/ocaml/topkg.nix b/pkgs/build-support/ocaml/topkg.nix new file mode 100644 index 0000000..73be581 --- /dev/null +++ b/pkgs/build-support/ocaml/topkg.nix @@ -0,0 +1,28 @@ +{ lib, stdenv, fetchurl, ocaml, findlib, topkg, ocamlbuild, cmdliner, odoc, b0 +}: + +{ pname, version, nativeBuildInputs ? [ ], buildInputs ? [ ], ... }@args: + +lib.throwIf (args ? minimalOCamlVersion + && lib.versionOlder ocaml.version args.minimalOCamlVersion) +"${pname}-${version} is not available for OCaml ${ocaml.version}" + +stdenv.mkDerivation ({ + + dontAddStaticConfigureFlags = true; + configurePlatforms = [ ]; + strictDeps = true; + inherit (topkg) buildPhase installPhase; + +} // (builtins.removeAttrs args [ "minimalOCamlVersion" ]) // { + + name = "ocaml${ocaml.version}-${pname}-${version}"; + + nativeBuildInputs = [ ocaml findlib ocamlbuild topkg ] ++ nativeBuildInputs; + buildInputs = [ topkg ] ++ buildInputs; + + meta = (args.meta or { }) // { + platforms = args.meta.platforms or ocaml.meta.platforms; + }; + +}) diff --git a/pkgs/build-support/oci-tools/default.nix b/pkgs/build-support/oci-tools/default.nix new file mode 100644 index 0000000..1f5507f --- /dev/null +++ b/pkgs/build-support/oci-tools/default.nix @@ -0,0 +1,78 @@ +{ lib, writeText, runCommand, writeClosure }: + +{ + buildContainer = + { args + , mounts ? {} + , os ? "linux" + , arch ? "x86_64" + , readonly ? false + }: + let + sysMounts = { + "/proc" = { + type = "proc"; + source = "proc"; + }; + "/dev" = { + type = "tmpfs"; + source = "tmpfs"; + options = [ "nosuid" "strictatime" "mode=755" "size=65536k" ]; + }; + "/dev/pts" = { + type = "devpts"; + source = "devpts"; + options = [ "nosuid" "noexec" "newinstance" "ptmxmode=0666" "mode=755" "gid=5" ]; + }; + "/dev/shm" = { + type = "tmpfs"; + source = "shm"; + options = [ "nosuid" "noexec" "nodev" "mode=1777" "size=65536k" ]; + }; + "/dev/mqueue" = { + type = "mqueue"; + source = "mqueue"; + options = [ "nosuid" "noexec" "nodev" ]; + }; + "/sys" = { + type = "sysfs"; + source = "sysfs"; + options = [ "nosuid" "noexec" "nodev" "ro" ]; + }; + "/sys/fs/cgroup" = { + type = "cgroup"; + source = "cgroup"; + options = [ "nosuid" "noexec" "nodev" "relatime" "ro" ]; + }; + }; + config = writeText "config.json" (builtins.toJSON { + ociVersion = "1.0.0"; + platform = { + inherit os arch; + }; + + linux = { + namespaces = map (type: { inherit type; }) [ "pid" "network" "mount" "ipc" "uts" ]; + }; + + root = { path = "rootfs"; inherit readonly; }; + + process = { + inherit args; + user = { uid = 0; gid = 0; }; + cwd = "/"; + }; + + mounts = lib.mapAttrsToList (destination: { type, source, options ? null }: { + inherit destination type source options; + }) sysMounts; + }); + in + runCommand "join" {} '' + set -o pipefail + mkdir -p $out/rootfs/{dev,proc,sys} + cp ${config} $out/config.json + xargs tar c < ${writeClosure args} | tar -xC $out/rootfs/ + ''; +} + diff --git a/pkgs/build-support/packages.nix b/pkgs/build-support/packages.nix new file mode 100644 index 0000000..10c1b25 --- /dev/null +++ b/pkgs/build-support/packages.nix @@ -0,0 +1,608 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + autoreconfHook = callPackage + ( + { makeSetupHook, autoconf, automake, gettext, libtool }: + makeSetupHook + { + name = "autoreconf-hook"; + propagatedBuildInputs = [ autoconf automake gettext libtool ]; + } ./setup-hooks/autoreconf.sh + ) + { }; + + autoreconfHook264 = autoreconfHook.override { + autoconf = autoconf264; + automake = automake111x; + }; + + autoreconfHook269 = autoreconfHook.override { + autoconf = autoconf269; + }; + autoreconfHook271 = autoreconfHook.override { + autoconf = autoconf271; + }; + + autoPatchelfHook = makeSetupHook + { + name = "auto-patchelf-hook"; + propagatedBuildInputs = [ bintools ]; + substitutions = { + pythonInterpreter = "${python3.withPackages (ps: [ ps.pyelftools ])}/bin/python"; + autoPatchelfScript = ./setup-hooks/auto-patchelf.py; + }; + meta.platforms = lib.platforms.linux; + } ./setup-hooks/auto-patchelf.sh; + + # tomato-c = callPackage ../applications/misc/tomato-c { }; + + # appflowy = callPackage ../applications/office/appflowy { }; + + # appimageTools = callPackage ./appimage { }; + + # appindicator-sharp = callPackage ../development/libraries/appindicator-sharp { }; + + # bindle = callPackage ../servers/bindle { + # inherit (darwin.apple_sdk.frameworks) Security; + # }; + + stripJavaArchivesHook = makeSetupHook + { + name = "strip-java-archives-hook"; + propagatedBuildInputs = [ strip-nondeterminism ]; + } ./setup-hooks/strip-java-archives.sh; + + ensureNewerSourcesHook = { year }: makeSetupHook + { + name = "ensure-newer-sources-hook"; + } + (writeScript "ensure-newer-sources-hook.sh" '' + postUnpackHooks+=(_ensureNewerSources) + _ensureNewerSources() { + '${findutils}/bin/find' "$sourceRoot" \ + '!' -newermt '${year}-01-01' -exec touch -h -d '${year}-01-02' '{}' '+' + } + ''); + + # Zip file format only allows times after year 1980, which makes e.g. Python + # wheel building fail with: + # ValueError: ZIP does not support timestamps before 1980 + ensureNewerSourcesForZipFilesHook = ensureNewerSourcesHook { year = "1980"; }; + + # addDriverRunpath is the preferred package name, as this enables + # many more scenarios than just opengl now. + addDriverRunpath = callPackage ./add-driver-runpath { }; + + # addOpenGLRunpath should be added to aliases.nix after the 24.05 branch-off. + # Post 24.11 branch-off, this should throw an error in aliases.nix. + addOpenGLRunpath = callPackage ./add-opengl-runpath { }; + + updateAutotoolsGnuConfigScriptsHook = makeSetupHook + { + name = "update-autotools-gnu-config-scripts-hook"; + substitutions = { gnu_config = gnu-config; }; + } ./setup-hooks/update-autotools-gnu-config-scripts.sh; + + # gogUnpackHook = makeSetupHook + # { + # name = "gog-unpack-hook"; + # propagatedBuildInputs = [ innoextract file-rename ]; + # } + # ./setup-hooks/gog-unpack.sh; + + buildEnv = callPackage ./buildenv { }; # not actually a package + + buildFHSEnv = buildFHSEnvBubblewrap; + buildFHSEnvChroot = callPackage ./build-fhsenv-chroot { }; # Deprecated; use buildFHSEnv/buildFHSEnvBubblewrap + buildFHSEnvBubblewrap = callPackage ./build-fhsenv-bubblewrap { }; + + # buildMaven = callPackage ./build-maven.nix { }; + + checkpointBuildTools = callPackage ./checkpoint-build.nix { }; + + dhallDirectoryToNix = callPackage ./dhall/directory-to-nix.nix { }; + + dhallPackageToNix = callPackage ./dhall/package-to-nix.nix { }; + + dhallToNix = callPackage ./dhall/to-nix.nix { }; + + expand-response-params = callPackage ./expand-response-params { }; + + diffPlugins = (callPackage ./plugins.nix { }).diffPlugins; + + dieHook = makeSetupHook + { + name = "die-hook"; + } ./setup-hooks/die.sh; + + + # dockerTools = callPackage ./docker + # { + # writePython3 = buildPackages.writers.writePython3; + # } // { __attrsFailEvaluation = true; }; + + fakeNss = callPackage ./fake-nss { }; + + tarsum = callPackage ./docker/tarsum.nix { }; + + # nix-prefetch-docker = callPackage ./docker/nix-prefetch-docker.nix { }; + + # buildDotnetModule = callPackage ./dotnet/build-dotnet-module { }; + # nuget-to-nix = callPackage ./dotnet/nuget-to-nix { }; + # mkNugetSource = callPackage ./dotnet/make-nuget-source { }; + # mkNugetDeps = callPackage ./dotnet/make-nuget-deps { }; + + # buildDotnetGlobalTool = callPackage ./dotnet/build-dotnet-global-tool { }; + + # dotnetenv = callPackage ./dotnet/dotnetenv { + # dotnetfx = dotnetfx40; + # }; + + # buildDotnetPackage = callPackage ./dotnet/build-dotnet-package { }; + # fetchNuGet = callPackage ./dotnet/fetchnuget { }; + # dotnetbuildhelpers = callPackage ./dotnet/dotnetbuildhelpers { }; + + # fetchbower = callPackage ./fetchbower { + # inherit (nodePackages) bower2nix; + # }; + + # fetchbzr = callPackage ./fetchbzr { }; + + fetchcvs = + if stdenv.buildPlatform != stdenv.hostPlatform + # hack around splicing being crummy with things that (correctly) don't eval. + then buildPackages.fetchcvs + else callPackage ./fetchcvs { }; + + fetchdarcs = callPackage ./fetchdarcs { }; + + fetchdocker = callPackage ./fetchdocker { }; + + fetchDockerConfig = callPackage ./fetchdocker/fetchDockerConfig.nix { }; + + fetchDockerLayer = callPackage ./fetchdocker/fetchDockerLayer.nix { }; + + fetchfossil = callPackage ./fetchfossil { }; + + fetchgit = (callPackage ./fetchgit { + git = buildPackages.gitMinimal; + cacert = buildPackages.cacert; + git-lfs = buildPackages.git-lfs; + }) // { + # fetchgit is a function, so we use // instead of passthru. + tests = pkgs.tests.fetchgit; + }; + + fetchgitLocal = callPackage ./fetchgitlocal { }; + + fetchmtn = callPackage ./fetchmtn (config.fetchmtn or { }); + + fetchMavenArtifact = callPackage ./fetchmavenartifact { }; + + fetchpijul = callPackage ./fetchpijul { }; + + inherit (callPackages ./node/fetch-yarn-deps { }) + fixup-yarn-lock + prefetch-yarn-deps + fetchYarnDeps; + + prefer-remote-fetch = import ./prefer-remote-fetch; + + fetchpatch = callPackage ./fetchpatch + { + # 0.3.4 would change hashes: https://github.com/NixOS/nixpkgs/issues/25154 + patchutils = buildPackages.patchutils_0_3_3; + } // { + tests = pkgs.tests.fetchpatch; + version = 1; + }; + + fetchpatch2 = callPackage ./fetchpatch + { + patchutils = buildPackages.patchutils_0_4_2; + } // { + tests = pkgs.tests.fetchpatch2; + version = 2; + }; + + fetchs3 = callPackage ./fetchs3 { }; + + fetchtorrent = callPackage ./fetchtorrent { }; + + fetchsvn = + if stdenv.buildPlatform != stdenv.hostPlatform + # hack around splicing being crummy with things that (correctly) don't eval. + then buildPackages.fetchsvn + else callPackage ./fetchsvn { }; + + fetchsvnrevision = import ./fetchsvnrevision runCommand subversion; + + fetchsvnssh = callPackage ./fetchsvnssh { }; + + fetchhg = callPackage ./fetchhg { }; + + fetchFirefoxAddon = callPackage ./fetchfirefoxaddon { } + // { + tests = pkgs.tests.fetchFirefoxAddon; + }; + + fetchNextcloudApp = callPackage ./fetchnextcloudapp { }; + + # `fetchurl' downloads a file from the network. + fetchurl = + if stdenv.buildPlatform != stdenv.hostPlatform + then buildPackages.fetchurl # No need to do special overrides twice, + else + makeOverridable (import ./fetchurl) { + inherit lib stdenvNoCC buildPackages; + inherit cacert; + curl = buildPackages.curlMinimal.override (old: rec { + # break dependency cycles + fetchurl = stdenv.fetchurlBoot; + zlib = buildPackages.zlib.override { fetchurl = stdenv.fetchurlBoot; }; + pkg-config = buildPackages.pkg-config.override (old: { + pkg-config = old.pkg-config.override { + fetchurl = stdenv.fetchurlBoot; + }; + }); + perl = buildPackages.perl.override { fetchurl = stdenv.fetchurlBoot; }; + openssl = buildPackages.openssl.override { + fetchurl = stdenv.fetchurlBoot; + buildPackages = { + coreutils = buildPackages.coreutils.override { + fetchurl = stdenv.fetchurlBoot; + inherit perl; + xz = buildPackages.xz.override { fetchurl = stdenv.fetchurlBoot; }; + gmp = null; + aclSupport = false; + attrSupport = false; + }; + inherit perl; + }; + inherit perl; + }; + libssh2 = buildPackages.libssh2.override { + fetchurl = stdenv.fetchurlBoot; + inherit zlib openssl; + }; + # On darwin, libkrb5 needs bootstrap_cmds which would require + # converting many packages to fetchurl_boot to avoid evaluation cycles. + # So turn gssSupport off there, and on Windows. + # On other platforms, keep the previous value. + gssSupport = + if stdenv.isDarwin || stdenv.hostPlatform.isWindows + then false + else old.gssSupport or true; # `? true` is the default + libkrb5 = buildPackages.libkrb5.override { + fetchurl = stdenv.fetchurlBoot; + inherit pkg-config perl openssl; + keyutils = buildPackages.keyutils.override { fetchurl = stdenv.fetchurlBoot; }; + }; + nghttp2 = buildPackages.nghttp2.override { + fetchurl = stdenv.fetchurlBoot; + inherit pkg-config; + enableApp = false; # curl just needs libnghttp2 + enableTests = false; # avoids bringing `cunit` and `tzdata` into scope + }; + }); + }; + + # fetchRepoProject = callPackage ./fetchrepoproject { }; + + # fetchipfs = import ./fetchipfs { + # inherit curl stdenv; + # }; + + fetchzip = callPackage ./fetchzip { } + // { + tests = pkgs.tests.fetchzip; + }; + + # fetchDebianPatch = callPackage ./fetchdebianpatch { } + # // { + # tests = pkgs.tests.fetchDebianPatch; + # }; + + fetchCrate = callPackage ./rust/fetchcrate.nix { }; + + # fetchFromGitea = callPackage ./fetchgitea { }; + + fetchFromGitHub = callPackage ./fetchgithub { }; + + # fetchFromBitbucket = callPackage ./fetchbitbucket { }; + + fetchFromSavannah = callPackage ./fetchsavannah { }; + + # fetchFromSourcehut = callPackage ./fetchsourcehut { }; + + fetchFromGitLab = callPackage ./fetchgitlab { }; + + # fetchFromGitiles = callPackage ./fetchgitiles { }; + + # fetchFrom9Front = callPackage ./fetch9front { }; + + # fetchFromRepoOrCz = callPackage ./fetchrepoorcz { }; + + # fetchgx = callPackage ./fetchgx { }; + + fetchPypi = callPackage ./fetchpypi { }; + + # fetchPypiLegacy = callPackage ./fetchpypilegacy { }; + + # resolveMirrorURLs = {url}: fetchurl { + # showURLs = true; + # inherit url; + # }; + + installShellFiles = callPackage ./install-shell-files { }; + + # ld-is-cc-hook = makeSetupHook { name = "ld-is-cc-hook"; } + # ./setup-hooks/ld-is-cc-hook.sh; + + libredirect = callPackage ./libredirect { }; + + # copyDesktopItems = makeSetupHook { + # name = "copy-desktop-items-hook"; + # } ./setup-hooks/copy-desktop-items.sh; + + # makeDesktopItem = callPackage ./make-desktopitem { }; + + # copyPkgconfigItems = makeSetupHook { + # name = "copy-pkg-config-items-hook"; + # } ./setup-hooks/copy-pkgconfig-items.sh; + + # makePkgconfigItem = callPackage ./make-pkgconfigitem { }; + + # makeDarwinBundle = callPackage ./make-darwin-bundle { }; + + # makeAutostartItem = callPackage ./make-startupitem { }; + + # makeImpureTest = callPackage ./make-impure-test.nix; + + # makeInitrd = callPackage ./kernel/make-initrd.nix; # Args intentionally left out + + # makeInitrdNG = callPackage ./kernel/make-initrd-ng.nix; + # makeInitrdNGTool = callPackage ./kernel/make-initrd-ng-tool.nix { }; + + makeWrapper = makeShellWrapper; + + makeShellWrapper = makeSetupHook + { + name = "make-shell-wrapper-hook"; + propagatedBuildInputs = [ dieHook ]; + substitutions = { + # targetPackages.runtimeShell only exists when pkgs == targetPackages (when targetPackages is not __raw) + shell = if targetPackages ? runtimeShell then targetPackages.runtimeShell else throw "makeWrapper/makeShellWrapper must be in nativeBuildInputs"; + }; + passthru = { + tests = tests.makeWrapper; + }; + } ./setup-hooks/make-wrapper.sh; + + makeBinaryWrapper = callPackage ./setup-hooks/make-binary-wrapper { }; + + # compressFirmwareXz = callPackage ./kernel/compress-firmware-xz.nix { }; + + # makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false }: + # callPackage ./kernel/modules-closure.nix { + # inherit kernel firmware rootModules allowMissing; + # }; + + # mkBinaryCache = callPackage ./binary-cache { }; + + # mkShell = callPackage ./mkshell { }; + # mkShellNoCC = mkShell.override { stdenv = stdenvNoCC; }; + + # nixBufferBuilders = import ./emacs/buffer.nix { inherit lib writeText; inherit (emacs.pkgs) inherit-local; }; + + # nix-gitignore = callPackage ./nix-gitignore { }; + + # ociTools = callPackage ./oci-tools { }; + + # inherit ( + # callPackages ./setup-hooks/patch-rc-path-hooks { } + # ) patchRcPathBash patchRcPathCsh patchRcPathFish patchRcPathPosix; + + # pathsFromGraph = ./kernel/paths-from-graph.pl; + + pruneLibtoolFiles = makeSetupHook { name = "prune-libtool-files"; } + ./setup-hooks/prune-libtool-files.sh; + + # closureInfo = callPackage ./closure-info.nix { }; + + # setupSystemdUnits = callPackage ./setup-systemd-units.nix { }; + + shortenPerlShebang = makeSetupHook + { + name = "shorten-perl-shebang-hook"; + propagatedBuildInputs = [ dieHook ]; + } ./setup-hooks/shorten-perl-shebang.sh; + + # singularity-tools = callPackage ./singularity-tools { }; + + # srcOnly = callPackage ./src-only { }; + + substitute = callPackage ./substitute/substitute.nix { }; + + substituteAll = callPackage ./substitute/substitute-all.nix { }; + + # substituteAllFiles = callPackage ./substitute-files/substitute-all-files.nix { }; + + # replaceDependency = callPackage ./replace-dependency.nix { }; + + nukeReferences = callPackage ./nuke-references { + inherit (darwin) signingUtils; + }; + + # referencesByPopularity = callPackage ./references-by-popularity { }; + + removeReferencesTo = callPackage ./remove-references-to { + inherit (darwin) signingUtils; + }; + + # # No callPackage. In particular, we don't want `img` *package* in parameters. + # vmTools = makeOverridable (import ./vm) { inherit pkgs lib; }; + + # releaseTools = callPackage ./release { }; + + # inherit (lib.systems) platforms; + + # setJavaClassPath = makeSetupHook { + # name = "set-java-classpath-hook"; + # } ./setup-hooks/set-java-classpath.sh; + + fixDarwinDylibNames = makeSetupHook + { + name = "fix-darwin-dylib-names-hook"; + substitutions = { inherit (binutils) targetPrefix; }; + meta.platforms = lib.platforms.darwin; + } ./setup-hooks/fix-darwin-dylib-names.sh; + + # writeDarwinBundle = callPackage ./make-darwin-bundle/write-darwin-bundle.nix { }; + + # desktopToDarwinBundle = makeSetupHook { + # name = "desktop-to-darwin-bundle-hook"; + # propagatedBuildInputs = [ writeDarwinBundle librsvg imagemagick python3Packages.icnsutil ]; + # } ./setup-hooks/desktop-to-darwin-bundle.sh; + + # keepBuildTree = makeSetupHook { + # name = "keep-build-tree-hook"; + # } ./setup-hooks/keep-build-tree.sh; + + # moveBuildTree = makeSetupHook { + # name = "move-build-tree-hook"; + # } ./setup-hooks/move-build-tree.sh; + + # enableGCOVInstrumentation = makeSetupHook { + # name = "enable-gcov-instrumentation-hook"; + # } ./setup-hooks/enable-coverage-instrumentation.sh; + + # makeGCOVReport = makeSetupHook { + # name = "make-gcov-report-hook"; + # propagatedBuildInputs = [ lcov enableGCOVInstrumentation ]; + # } ./setup-hooks/make-coverage-analysis-report.sh; + + # makeHardcodeGsettingsPatch = callPackage ./make-hardcode-gsettings-patch { }; + + # # intended to be used like nix-build -E 'with import { }; enableDebugging fooPackage' + # enableDebugging = pkg: pkg.override { stdenv = stdenvAdapters.keepDebugInfo pkg.stdenv; }; + + findXMLCatalogs = makeSetupHook + { + name = "find-xml-catalogs-hook"; + } ./setup-hooks/find-xml-catalogs.sh; + + # wrapGAppsHook = callPackage ./setup-hooks/wrap-gapps-hook { + # makeWrapper = makeBinaryWrapper; + # }; + + # wrapGAppsHook4 = wrapGAppsHook.override { gtk3 = __splicedPackages.gtk4; }; + + # wrapGAppsNoGuiHook = wrapGAppsHook.override { isGraphical = false; }; + + # separateDebugInfo = makeSetupHook { + # name = "separate-debug-info-hook"; + # } ./setup-hooks/separate-debug-info.sh; + + setupDebugInfoDirs = makeSetupHook + { + name = "setup-debug-info-dirs-hook"; + } ./setup-hooks/setup-debug-info-dirs.sh; + + # useOldCXXAbi = makeSetupHook { + # name = "use-old-cxx-abi-hook"; + # } ./setup-hooks/use-old-cxx-abi.sh; + + # iconConvTools = callPackage ./icon-conv-tools { }; + + # validatePkgConfig = makeSetupHook + # { name = "validate-pkg-config"; propagatedBuildInputs = [ findutils pkg-config ]; } + # ./setup-hooks/validate-pkg-config.sh; + + # patchPpdFilesHook = callPackage ./setup-hooks/patch-ppd-files { }; + + #package writers + writers = callPackage ./writers { }; + + # # lib functions depending on pkgs + # inherit (import ../pkgs-lib { + # # The `lib` variable in this scope doesn't include any applied lib overlays, + # # `pkgs.lib` does. + # inherit (pkgs) lib; + # inherit pkgs; + # }) formats; + + testers = callPackage ./testers { }; + + # deterministic-uname = callPackage ./deterministic-uname { }; + + wrapCCWith = + { cc + , # This should be the only bintools runtime dep with this sort of logic. The + # Others should instead delegate to the next stage's choice with + # `targetPackages.stdenv.cc.bintools`. This one is different just to + # provide the default choice, avoiding infinite recursion. + # See the bintools attribute for the logic and reasoning. We need to provide + # a default here, since eval will hit this function when bootstrapping + # stdenv where the bintools attribute doesn't exist, but will never actually + # be evaluated -- callPackage ends up being too eager. + bintools ? pkgs.bintools + , libc ? bintools.libc + , # libc++ from the default LLVM version is bound at the top level, but we + # want the C++ library to be explicitly chosen by the caller, and null by + # default. + libcxx ? null + , extraPackages ? lib.optional (cc.isGNU or false && stdenv.targetPlatform.isMinGW) ((threadsCrossFor cc.version).package) + , nixSupport ? { } + , ... + } @ extraArgs: + callPackage ./cc-wrapper ( + let + self = { + nativeTools = stdenv.targetPlatform == stdenv.hostPlatform && stdenv.cc.nativeTools or false; + nativeLibc = stdenv.targetPlatform == stdenv.hostPlatform && stdenv.cc.nativeLibc or false; + nativePrefix = stdenv.cc.nativePrefix or ""; + noLibc = !self.nativeLibc && (self.libc == null); + + isGNU = cc.isGNU or false; + isClang = cc.isClang or false; + + inherit cc bintools libc libcxx extraPackages nixSupport zlib; + } // extraArgs; + in + self + ); + + wrapCC = cc: wrapCCWith { + inherit cc; + }; + + wrapBintoolsWith = + { bintools + , libc ? if stdenv.targetPlatform != stdenv.hostPlatform then libcCross else stdenv.cc.libc + , ... + } @ extraArgs: + callPackage ./bintools-wrapper ( + let + self = { + nativeTools = stdenv.targetPlatform == stdenv.hostPlatform && stdenv.cc.nativeTools or false; + nativeLibc = stdenv.targetPlatform == stdenv.hostPlatform && stdenv.cc.nativeLibc or false; + nativePrefix = stdenv.cc.nativePrefix or ""; + + noLibc = (self.libc == null); + + inherit bintools libc; + inherit (darwin) postLinkSignHook signingUtils; + } // extraArgs; + in + self + ); + + # sourceFromHead = callPackage ./source-from-head-fun.nix { }; + + wrapRustcWith = { rustc-unwrapped, ... } @ args: callPackage ./rust/rustc-wrapper args; + wrapRustc = rustc-unwrapped: wrapRustcWith { inherit rustc-unwrapped; }; +} diff --git a/pkgs/build-support/php/build-composer-project.nix b/pkgs/build-support/php/build-composer-project.nix new file mode 100644 index 0000000..80c63bc --- /dev/null +++ b/pkgs/build-support/php/build-composer-project.nix @@ -0,0 +1,85 @@ +{ callPackage, stdenvNoCC, lib, writeTextDir, php, makeBinaryWrapper, fetchFromGitHub, fetchurl }: + +let + buildComposerProjectOverride = finalAttrs: previousAttrs: + + let + phpDrv = finalAttrs.php or php; + composer = finalAttrs.composer or phpDrv.packages.composer; + composer-local-repo-plugin = callPackage ./pkgs/composer-local-repo-plugin.nix { }; + in + { + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ + composer + composer-local-repo-plugin + phpDrv + phpDrv.composerHooks.composerInstallHook + ]; + + buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ + phpDrv + ]; + + patches = previousAttrs.patches or [ ]; + strictDeps = previousAttrs.strictDeps or true; + + # Should we keep these empty phases? + configurePhase = previousAttrs.configurePhase or '' + runHook preConfigure + + runHook postConfigure + ''; + + buildPhase = previousAttrs.buildPhase or '' + runHook preBuild + + runHook postBuild + ''; + + doCheck = previousAttrs.doCheck or true; + checkPhase = previousAttrs.checkPhase or '' + runHook preCheck + + runHook postCheck + ''; + + installPhase = previousAttrs.installPhase or '' + runHook preInstall + + runHook postInstall + ''; + + doInstallCheck = previousAttrs.doInstallCheck or false; + installCheckPhase = previousAttrs.installCheckPhase or '' + runHook preInstallCheck + + runHook postInstallCheck + ''; + + composerRepository = phpDrv.mkComposerRepository { + inherit composer composer-local-repo-plugin; + inherit (finalAttrs) patches pname src vendorHash version; + + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + }; + + COMPOSER_CACHE_DIR="/dev/null"; + COMPOSER_DISABLE_NETWORK="1"; + COMPOSER_MIRROR_PATH_REPOS="1"; + + meta = previousAttrs.meta or { } // { + platforms = lib.platforms.all; + }; + }; +in +args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerProjectOverride diff --git a/pkgs/build-support/php/build-composer-repository.nix b/pkgs/build-support/php/build-composer-repository.nix new file mode 100644 index 0000000..e359c08 --- /dev/null +++ b/pkgs/build-support/php/build-composer-repository.nix @@ -0,0 +1,96 @@ +{ callPackage, stdenvNoCC, lib, writeTextDir, fetchFromGitHub, php }: + +let + mkComposerRepositoryOverride = + /* + We cannot destruct finalAttrs since the attrset below is used to construct it + and Nix currently does not support lazy attribute names. + { + php ? null, + composer ? null, + composerLock ? "composer.lock", + src, + vendorHash, + ... + }@finalAttrs: + */ + finalAttrs: previousAttrs: + + let + phpDrv = finalAttrs.php or php; + composer = finalAttrs.composer or phpDrv.packages.composer; + composer-local-repo-plugin = callPackage ./pkgs/composer-local-repo-plugin.nix { }; + in + assert (lib.assertMsg (previousAttrs ? src) "mkComposerRepository expects src argument."); + assert (lib.assertMsg (previousAttrs ? vendorHash) "mkComposerRepository expects vendorHash argument."); + assert (lib.assertMsg (previousAttrs ? version) "mkComposerRepository expects version argument."); + assert (lib.assertMsg (previousAttrs ? pname) "mkComposerRepository expects pname argument."); + assert (lib.assertMsg (previousAttrs ? composerNoDev) "mkComposerRepository expects composerNoDev argument."); + assert (lib.assertMsg (previousAttrs ? composerNoPlugins) "mkComposerRepository expects composerNoPlugins argument."); + assert (lib.assertMsg (previousAttrs ? composerNoScripts) "mkComposerRepository expects composerNoScripts argument."); + { + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + + name = "${previousAttrs.pname}-${previousAttrs.version}-composer-repository"; + + # See https://github.com/NixOS/nix/issues/6660 + dontPatchShebangs = previousAttrs.dontPatchShebangs or true; + + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ + composer + composer-local-repo-plugin + phpDrv + phpDrv.composerHooks.composerRepositoryHook + ]; + + buildInputs = previousAttrs.buildInputs or [ ]; + + strictDeps = previousAttrs.strictDeps or true; + + # Should we keep these empty phases? + configurePhase = previousAttrs.configurePhase or '' + runHook preConfigure + + runHook postConfigure + ''; + + buildPhase = previousAttrs.buildPhase or '' + runHook preBuild + + runHook postBuild + ''; + + doCheck = previousAttrs.doCheck or true; + checkPhase = previousAttrs.checkPhase or '' + runHook preCheck + + runHook postCheck + ''; + + installPhase = previousAttrs.installPhase or '' + runHook preInstall + + runHook postInstall + ''; + + doInstallCheck = previousAttrs.doInstallCheck or false; + installCheckPhase = previousAttrs.installCheckPhase or '' + runHook preInstallCheck + + runHook postInstallCheck + ''; + + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + COMPOSER_HTACCESS_PROTECT = "0"; + COMPOSER_DISABLE_NETWORK = "0"; + + outputHashMode = "recursive"; + outputHashAlgo = if (finalAttrs ? vendorHash && finalAttrs.vendorHash != "") then null else "sha256"; + outputHash = finalAttrs.vendorHash or ""; + }; +in +args: (stdenvNoCC.mkDerivation args).overrideAttrs mkComposerRepositoryOverride diff --git a/pkgs/build-support/php/build-pecl.nix b/pkgs/build-support/php/build-pecl.nix new file mode 100644 index 0000000..6f38a66 --- /dev/null +++ b/pkgs/build-support/php/build-pecl.nix @@ -0,0 +1,45 @@ +{ stdenv, lib, php, autoreconfHook, fetchurl, re2c, nix-update-script }: + +{ pname +, version +, internalDeps ? [ ] +, peclDeps ? [ ] +, buildInputs ? [ ] +, nativeBuildInputs ? [ ] +, postPhpize ? "" +, makeFlags ? [ ] +, src ? fetchurl ({ + url = "https://pecl.php.net/get/${pname}-${version}.tgz"; + } // lib.filterAttrs (attrName: _: lib.elem attrName [ "sha256" "hash" ]) args) +, passthru ? { } +, ... +}@args: + +stdenv.mkDerivation (args // { + name = "php-${pname}-${version}"; + extensionName = pname; + + inherit src; + + nativeBuildInputs = [ autoreconfHook re2c ] ++ nativeBuildInputs; + buildInputs = [ php ] ++ peclDeps ++ buildInputs; + + makeFlags = [ "EXTENSION_DIR=$(out)/lib/php/extensions" ] ++ makeFlags; + + autoreconfPhase = '' + phpize + ${postPhpize} + ${lib.concatMapStringsSep "\n" + (dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}") + internalDeps} + ''; + checkPhase = "NO_INTERACTON=yes make test"; + + passthru = passthru // { + # Thes flags were introduced for `nix-update` so that it can update + # PHP extensions correctly. + # See the corresponding PR: https://github.com/Mic92/nix-update/pull/123 + isPhpExtension = true; + updateScript = nix-update-script {}; + }; +}) diff --git a/pkgs/build-support/php/hooks/composer-install-hook.sh b/pkgs/build-support/php/hooks/composer-install-hook.sh new file mode 100644 index 0000000..edba0e5 --- /dev/null +++ b/pkgs/build-support/php/hooks/composer-install-hook.sh @@ -0,0 +1,125 @@ +declare composerRepository +declare version +declare composerNoDev +declare composerNoPlugins +declare composerNoScripts + +preConfigureHooks+=(composerInstallConfigureHook) +preBuildHooks+=(composerInstallBuildHook) +preCheckHooks+=(composerInstallCheckHook) +preInstallHooks+=(composerInstallInstallHook) + +source @phpScriptUtils@ + +composerInstallConfigureHook() { + echo "Executing composerInstallConfigureHook" + + if [[ ! -e "${composerRepository}" ]]; then + echo "No local composer repository found." + exit 1 + fi + + if [[ -e "$composerLock" ]]; then + cp "$composerLock" composer.lock + fi + + if [[ ! -f "composer.lock" ]]; then + setComposeRootVersion + + composer \ + --no-ansi \ + --no-install \ + --no-interaction \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + update + + mkdir -p $out + cp composer.lock $out/ + + echo + echo -e "\e[31mERROR: No composer.lock found\e[0m" + echo + echo -e '\e[31mNo composer.lock file found, consider adding one to your repository to ensure reproducible builds.\e[0m' + echo -e "\e[31mIn the meantime, a composer.lock file has been generated for you in $out/composer.lock\e[0m" + echo + echo -e '\e[31mTo fix the issue:\e[0m' + echo -e "\e[31m1. Copy the composer.lock file from $out/composer.lock to the project's source:\e[0m" + echo -e "\e[31m cp $out/composer.lock \e[0m" + echo -e '\e[31m2. Add the composerLock attribute, pointing to the copied composer.lock file:\e[0m' + echo -e '\e[31m composerLock = ./composer.lock;\e[0m' + echo + + exit 1 + fi + + echo "Validating consistency between composer.lock and ${composerRepository}/composer.lock" + if ! @cmp@ -s "composer.lock" "${composerRepository}/composer.lock"; then + echo + echo -e "\e[31mERROR: vendorHash is out of date\e[0m" + echo + echo -e "\e[31mcomposer.lock is not the same in $composerRepository\e[0m" + echo + echo -e "\e[31mTo fix the issue:\e[0m" + echo -e '\e[31m1. Set vendorHash to an empty string: `vendorHash = "";`\e[0m' + echo -e '\e[31m2. Build the derivation and wait for it to fail with a hash mismatch\e[0m' + echo -e '\e[31m3. Copy the "got: sha256-..." value back into the vendorHash field\e[0m' + echo -e '\e[31m You should have: vendorHash = "sha256-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=";\e[0m' + echo + + exit 1 + fi + + chmod +w composer.json composer.lock + + echo "Finished composerInstallConfigureHook" +} + +composerInstallBuildHook() { + echo "Executing composerInstallBuildHook" + + setComposeRootVersion + + # Since this file cannot be generated in the composer-repository-hook.sh + # because the file contains hardcoded nix store paths, we generate it here. + composer-local-repo-plugin --no-ansi build-local-repo-lock -m "${composerRepository}" . + + echo "Finished composerInstallBuildHook" +} + +composerInstallCheckHook() { + echo "Executing composerInstallCheckHook" + + checkComposerValidate + + echo "Finished composerInstallCheckHook" +} + +composerInstallInstallHook() { + echo "Executing composerInstallInstallHook" + + setComposeRootVersion + + # Finally, run `composer install` to install the dependencies and generate + # the autoloader. + composer \ + --no-ansi \ + --no-interaction \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + install + + # Copy the relevant files only in the store. + mkdir -p "$out"/share/php/"${pname}" + cp -r . "$out"/share/php/"${pname}"/ + + # Create symlinks for the binaries. + jq -r -c 'try (.bin[] | select(test(".bat$")? | not) )' composer.json | while read -r bin; do + mkdir -p "$out"/share/php/"${pname}" "$out"/bin + makeWrapper "$out"/share/php/"${pname}"/"$bin" "$out"/bin/"$(basename "$bin")" + done + + echo "Finished composerInstallInstallHook" +} diff --git a/pkgs/build-support/php/hooks/composer-repository-hook.sh b/pkgs/build-support/php/hooks/composer-repository-hook.sh new file mode 100644 index 0000000..762e762 --- /dev/null +++ b/pkgs/build-support/php/hooks/composer-repository-hook.sh @@ -0,0 +1,91 @@ +declare composerLock +declare version +declare composerNoDev +declare composerNoPlugins +declare composerNoScripts +declare composerStrictValidation + +preConfigureHooks+=(composerRepositoryConfigureHook) +preBuildHooks+=(composerRepositoryBuildHook) +preCheckHooks+=(composerRepositoryCheckHook) +preInstallHooks+=(composerRepositoryInstallHook) + +source @phpScriptUtils@ + +composerRepositoryConfigureHook() { + echo "Executing composerRepositoryConfigureHook" + + if [[ -e "$composerLock" ]]; then + cp $composerLock composer.lock + fi + + if [[ ! -f "composer.lock" ]]; then + setComposeRootVersion + + composer \ + --no-ansi \ + --no-install \ + --no-interaction \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + update + + mkdir -p $out + cp composer.lock $out/ + + echo + echo -e "\e[31mERROR: No composer.lock found\e[0m" + echo + echo -e '\e[31mNo composer.lock file found, consider adding one to your repository to ensure reproducible builds.\e[0m' + echo -e "\e[31mIn the meantime, a composer.lock file has been generated for you in $out/composer.lock\e[0m" + echo + echo -e '\e[31mTo fix the issue:\e[0m' + echo -e "\e[31m1. Copy the composer.lock file from $out/composer.lock to the project's source:\e[0m" + echo -e "\e[31m cp $out/composer.lock \e[0m" + echo -e '\e[31m2. Add the composerLock attribute, pointing to the copied composer.lock file:\e[0m' + echo -e '\e[31m composerLock = ./composer.lock;\e[0m' + echo + + exit 1 + fi + + echo "Finished composerRepositoryConfigureHook" +} + +composerRepositoryBuildHook() { + echo "Executing composerRepositoryBuildHook" + + mkdir -p repository + + setComposeRootVersion + + # Build the local composer repository + # The command 'build-local-repo' is provided by the Composer plugin + # nix-community/composer-local-repo-plugin. + composer-local-repo-plugin --no-ansi build-local-repo-lock ${composerNoDev:+--no-dev} -r repository + + echo "Finished composerRepositoryBuildHook" +} + +composerRepositoryCheckHook() { + echo "Executing composerRepositoryCheckHook" + + checkComposerValidate + + echo "Finished composerRepositoryCheckHook" +} + +composerRepositoryInstallHook() { + echo "Executing composerRepositoryInstallHook" + + mkdir -p $out + + cp -ar repository/. $out/ + + # Copy the composer.lock files to the output directory, to be able to validate consistency with + # the src composer.lock file where this fixed-output derivation is used + cp composer.lock $out/ + + echo "Finished composerRepositoryInstallHook" +} diff --git a/pkgs/build-support/php/hooks/default.nix b/pkgs/build-support/php/hooks/default.nix new file mode 100644 index 0000000..98e81c8 --- /dev/null +++ b/pkgs/build-support/php/hooks/default.nix @@ -0,0 +1,40 @@ +{ lib +, makeSetupHook +, diffutils +, jq +, writeShellApplication +, moreutils +, makeBinaryWrapper +, cacert +, buildPackages +}: + +let + php-script-utils = writeShellApplication { + name = "php-script-utils"; + runtimeInputs = [ jq ]; + text = builtins.readFile ./php-script-utils.bash; + }; +in +{ + composerRepositoryHook = makeSetupHook + { + name = "composer-repository-hook.sh"; + propagatedBuildInputs = [ jq moreutils cacert ]; + substitutions = { + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-repository-hook.sh; + + composerInstallHook = makeSetupHook + { + name = "composer-install-hook.sh"; + propagatedBuildInputs = [ jq makeBinaryWrapper moreutils cacert ]; + substitutions = { + # Specify the stdenv's `diff` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong `diff`. + cmp = "${lib.getBin buildPackages.diffutils}/bin/cmp"; + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-install-hook.sh; +} diff --git a/pkgs/build-support/php/hooks/php-script-utils.bash b/pkgs/build-support/php/hooks/php-script-utils.bash new file mode 100644 index 0000000..bba0242 --- /dev/null +++ b/pkgs/build-support/php/hooks/php-script-utils.bash @@ -0,0 +1,77 @@ +declare version +declare composerStrictValidation + +setComposeRootVersion() { + set +e # Disable exit on error + + if [[ -v version ]]; then + echo -e "\e[32mSetting COMPOSER_ROOT_VERSION to $version\e[0m" + export COMPOSER_ROOT_VERSION=$version + fi + + set -e +} + +checkComposerValidate() { + if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --no-check-lock; then + if [ "1" == "${composerStrictValidation-}" ]; then + echo + echo -e "\e[31mERROR: composer files validation failed\e[0m" + echo + echo -e '\e[31mThe validation of the composer.json failed.\e[0m' + echo -e '\e[31mMake sure that the file composer.json is valid.\e[0m' + echo + echo -e '\e[31mTo address the issue efficiently, follow one of these steps:\e[0m' + echo -e '\e[31m 1. File an issue in the project'\''s issue tracker with detailed information, and apply any available remote patches as a temporary solution '\('with fetchpatch'\)'.\e[0m' + echo -e '\e[31m 2. If an immediate fix is needed or if reporting upstream isn'\''t suitable, develop a temporary local patch.\e[0m' + echo + exit 1 + else + echo + echo -e "\e[33mWARNING: composer files validation failed\e[0m" + echo + echo -e '\e[33mThe validation of the composer.json failed.\e[0m' + echo -e '\e[33mMake sure that the file composer.json is valid.\e[0m' + echo + echo -e '\e[33mTo address the issue efficiently, follow one of these steps:\e[0m' + echo -e '\e[33m 1. File an issue in the project'\''s issue tracker with detailed information, and apply any available remote patches as a temporary solution with '\('with fetchpatch'\)'.\e[0m' + echo -e '\e[33m 2. If an immediate fix is needed or if reporting upstream isn'\''t suitable, develop a temporary local patch.\e[0m' + echo + echo -e '\e[33mThis check is not blocking, but it is recommended to fix the issue.\e[0m' + echo + fi + fi + + if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --check-lock; then + if [ "1" == "${composerStrictValidation-}" ]; then + echo + echo -e "\e[31mERROR: composer files validation failed\e[0m" + echo + echo -e '\e[31mThe validation of the composer.json and composer.lock failed.\e[0m' + echo -e '\e[31mMake sure that the file composer.lock is consistent with composer.json.\e[0m' + echo + echo -e '\e[31mThis often indicates an issue with the upstream project, which can typically be resolved by reporting the issue to the relevant project maintainers.\e[0m' + echo + echo -e '\e[31mTo address the issue efficiently, follow one of these steps:\e[0m' + echo -e '\e[31m 1. File an issue in the project'\''s issue tracker with detailed information '\('run '\''composer update --lock --no-install'\'' to fix the issue'\)', and apply any available remote patches as a temporary solution with '\('with fetchpatch'\)'.\e[0m' + echo -e '\e[31m 2. If an immediate fix is needed or if reporting upstream isn'\''t suitable, develop a temporary local patch.\e[0m' + echo + exit 1 + else + echo + echo -e "\e[33mWARNING: composer files validation failed\e[0m" + echo + echo -e '\e[33mThe validation of the composer.json and composer.lock failed.\e[0m' + echo -e '\e[33mMake sure that the file composer.lock is consistent with composer.json.\e[0m' + echo + echo -e '\e[33mThis often indicates an issue with the upstream project, which can typically be resolved by reporting the issue to the relevant project maintainers.\e[0m' + echo + echo -e '\e[33mTo address the issue efficiently, follow one of these steps:\e[0m' + echo -e '\e[33m 1. File an issue in the project'\''s issue tracker with detailed information '\('run '\''composer update --lock --no-install'\'' to fix the issue'\)', and apply any available remote patches as a temporary solution with '\('with fetchpatch'\)'.\e[0m' + echo -e '\e[33m 2. If an immediate fix is needed or if reporting upstream isn'\''t suitable, develop a temporary local patch.\e[0m' + echo + echo -e '\e[33mThis check is not blocking, but it is recommended to fix the issue.\e[0m' + echo + fi + fi +} diff --git a/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix b/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix new file mode 100644 index 0000000..bfdc3d4 --- /dev/null +++ b/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix @@ -0,0 +1,113 @@ +{ php, callPackage, stdenvNoCC, lib, fetchFromGitHub, makeBinaryWrapper }: + +let + composer = callPackage ./composer-phar.nix { + inherit (php.packages.composer) version pharHash; + }; + + composerKeys = stdenvNoCC.mkDerivation (finalComposerKeysAttrs: { + pname = "composer-keys"; + version = "fa5a62092f33e094073fbda23bbfc7188df3cbc5"; + + src = fetchFromGitHub { + owner = "composer"; + repo = "composer.github.io"; + rev = "${finalComposerKeysAttrs.version}"; + hash = "sha256-3Sfn71LDG1jHwuEIU8iEnV3k6D6QTX7KVIKVaNSuCVE="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p $out + install releases.pub $out/keys.tags.pub + install snapshots.pub $out/keys.dev.pub + + runHook postInstall + ''; + }); +in +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "composer-local-repo-plugin"; + version = "1.1.0"; + + src = fetchFromGitHub { + owner = "nix-community"; + repo = "composer-local-repo-plugin"; + rev = finalAttrs.version; + hash = "sha256-edbn07r/Uc1g0qOuVBZBs6N1bMN5kIfA1b4FCufdw5M="; + }; + + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + COMPOSER_HTACCESS_PROTECT = "0"; + COMPOSER_DISABLE_NETWORK = "1"; + + nativeBuildInputs = [ + makeBinaryWrapper + ]; + + buildInputs = [ + composer + ]; + + configurePhase = '' + runHook preConfigure + + export COMPOSER_HOME=${placeholder "out"} + + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + + # Configure composer globally + composer global init --quiet --no-interaction --no-ansi \ + --name="nixos/composer" \ + --homepage "https://nixos.org/" \ + --description "Composer with nix-community/composer-local-repo-plugin" \ + --license "MIT" + + composer global config --quiet minimum-stability dev + composer global config --quiet prefer-stable true + composer global config --quiet apcu-autoloader false + composer global config --quiet allow-plugins.nix-community/composer-local-repo-plugin true + composer global config --quiet repo.packagist false + composer global config --quiet repo.plugin path $src + + # Install the local repository plugin + composer global require --quiet --no-ansi --no-interaction nix-community/composer-local-repo-plugin + + runHook postBuild + ''; + + checkPhase = '' + runHook preCheck + + composer global validate --no-ansi + composer global show --no-ansi nix-community/composer-local-repo-plugin + + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -ar ${composerKeys}/* $out/ + + makeWrapper ${composer}/bin/composer $out/bin/composer-local-repo-plugin \ + --prefix COMPOSER_HOME : $out + + runHook postInstall + ''; + + meta = { + description = "Composer local repo plugin for Composer"; + homepage = "https://github.com/nix-community/composer-local-repo-plugin"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ drupol ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/build-support/php/pkgs/composer-phar.nix b/pkgs/build-support/php/pkgs/composer-phar.nix new file mode 100644 index 0000000..f281334 --- /dev/null +++ b/pkgs/build-support/php/pkgs/composer-phar.nix @@ -0,0 +1,50 @@ +{ + _7zz + , cacert + , curl + , fetchurl + , git + , lib + , makeBinaryWrapper + , php + , stdenvNoCC + , unzip + , xz + , version + , pharHash +}: + +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "composer-phar"; + inherit version; + + src = fetchurl { + url = "https://github.com/composer/composer/releases/download/${finalAttrs.version}/composer.phar"; + hash = pharHash; + }; + + dontUnpack = true; + + nativeBuildInputs = [ makeBinaryWrapper ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + install -D $src $out/libexec/composer/composer.phar + makeWrapper ${php}/bin/php $out/bin/composer \ + --add-flags "$out/libexec/composer/composer.phar" \ + --prefix PATH : ${lib.makeBinPath [ _7zz cacert curl git unzip xz ]} + + runHook postInstall + ''; + + meta = { + changelog = "https://github.com/composer/composer/releases/tag/${finalAttrs.version}"; + description = "Dependency Manager for PHP, shipped from the PHAR file"; + homepage = "https://getcomposer.org/"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ drupol ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/build-support/pkg-config-wrapper/add-flags.sh b/pkgs/build-support/pkg-config-wrapper/add-flags.sh new file mode 100644 index 0000000..90aee71 --- /dev/null +++ b/pkgs/build-support/pkg-config-wrapper/add-flags.sh @@ -0,0 +1,12 @@ +# See cc-wrapper for comments. +var_templates_list=( + PKG_CONFIG_PATH +) + +accumulateRoles + +for var in "${var_templates_list[@]}"; do + mangleVarListGeneric ":" "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done + +export NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@=1 diff --git a/pkgs/build-support/pkg-config-wrapper/default.nix b/pkgs/build-support/pkg-config-wrapper/default.nix new file mode 100644 index 0000000..4a6c189 --- /dev/null +++ b/pkgs/build-support/pkg-config-wrapper/default.nix @@ -0,0 +1,139 @@ +# The wrapper script ensures variables like PKG_CONFIG_PATH and +# PKG_CONFIG_PATH_FOR_BUILD work properly. + +{ stdenvNoCC +, lib +, buildPackages +, pkg-config +, baseBinName ? "pkg-config" +, propagateDoc ? pkg-config != null && pkg-config ? man +, extraPackages ? [], extraBuildCommands ? "" +}: + +let + inherit (lib) + attrByPath + getBin + optional + optionalAttrs + optionals + optionalString + replaceStrings + ; + + stdenv = stdenvNoCC; + inherit (stdenv) hostPlatform targetPlatform; + + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by + # default. + targetPrefix = optionalString (targetPlatform != hostPlatform) + (targetPlatform.config + "-"); + + # See description in cc-wrapper. + suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config; + + wrapperBinName = "${targetPrefix}${baseBinName}"; +in + +stdenv.mkDerivation { + pname = targetPrefix + pkg-config.pname + "-wrapper"; + inherit (pkg-config) version; + + enableParallelBuilding = true; + + preferLocalBuild = true; + + outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (pkg-config ? doc) "doc"); + + passthru = { + inherit targetPrefix suffixSalt; + inherit pkg-config; + }; + + strictDeps = true; + dontBuild = true; + dontConfigure = true; + dontUnpack = true; + + # Additional flags passed to pkg-config. + addFlags = optional stdenv.targetPlatform.isStatic "--static"; + + installPhase = + '' + mkdir -p $out/bin $out/nix-support + + wrap() { + local dst="$1" + local wrapper="$2" + export prog="$3" + substituteAll "$wrapper" "$out/bin/$dst" + chmod +x "$out/bin/$dst" + } + + echo $pkg-config > $out/nix-support/orig-pkg-config + + wrap ${wrapperBinName} ${./pkg-config-wrapper.sh} "${getBin pkg-config}/bin/${baseBinName}" + '' + # symlink in share for autoconf to find macros + + # TODO(@Ericson2314): in the future just make the unwrapped pkg-config a + # propagated dep once we can rely on downstream deps comming first in + # search paths. (https://github.com/NixOS/nixpkgs/pull/31414 took a crack + # at this.) + + '' + ln -s ${pkg-config}/share $out/share + ''; + + setupHooks = [ + ../setup-hooks/role.bash + ./setup-hook.sh + ]; + + postFixup = + ## + ## User env support + ## + + # Propagate the underling unwrapped pkg-config so that if you + # install the wrapper, you get anything else it might provide. + '' + printWords ${pkg-config} > $out/nix-support/propagated-user-env-packages + '' + + ## + ## Man page and doc support + ## + + optionalString propagateDoc ('' + ln -s ${pkg-config.man} $man + '' + optionalString (pkg-config ? doc) '' + ln -s ${pkg-config.doc} $doc + '') + + + '' + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh + substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash + '' + + ## + ## Extra custom steps + ## + + extraBuildCommands; + + env = { + shell = getBin stdenvNoCC.shell + stdenvNoCC.shell.shellPath or ""; + wrapperName = "PKG_CONFIG_WRAPPER"; + inherit targetPrefix suffixSalt baseBinName; + }; + + meta = + let pkg-config_ = optionalAttrs (pkg-config != null) pkg-config; in + (optionalAttrs (pkg-config_ ? meta) (removeAttrs pkg-config.meta ["priority" "mainProgram"])) // + { description = + attrByPath ["meta" "description"] "pkg-config" pkg-config_ + + " (wrapper script)"; + priority = 10; + mainProgram = wrapperBinName; + }; +} diff --git a/pkgs/build-support/pkg-config-wrapper/pkg-config-wrapper.sh b/pkgs/build-support/pkg-config-wrapper/pkg-config-wrapper.sh new file mode 100644 index 0000000..1d43c8e --- /dev/null +++ b/pkgs/build-support/pkg-config-wrapper/pkg-config-wrapper.sh @@ -0,0 +1,23 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +source @out@/nix-support/utils.bash + +if [ -z "${NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-flags.sh +fi + +set -- @addFlags@ "$@" + +if (( ${#role_suffixes[@]} > 0 )); then + # replace env var with nix-modified one + PKG_CONFIG_PATH=$PKG_CONFIG_PATH_@suffixSalt@ exec @prog@ "$@" +else + # pkg-config isn't a real dependency so ignore setup hook entirely + exec @prog@ "$@" +fi diff --git a/pkgs/build-support/pkg-config-wrapper/setup-hook.sh b/pkgs/build-support/pkg-config-wrapper/setup-hook.sh new file mode 100644 index 0000000..34f1a99 --- /dev/null +++ b/pkgs/build-support/pkg-config-wrapper/setup-hook.sh @@ -0,0 +1,29 @@ +# pkg-config Wrapper hygiene +# +# See comments in cc-wrapper's setup hook. This works exactly the same way. + +# Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a +# native compile. +# +# TODO(@Ericson2314): No native exception +[[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0 + +pkgConfigWrapper_addPkgConfigPath () { + # See ../setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/lib/pkgconfig" + addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/share/pkgconfig" +} + +# See ../setup-hooks/role.bash +getTargetRole +getTargetRoleWrapper + +addEnvHooks "$targetOffset" pkgConfigWrapper_addPkgConfigPath + +export PKG_CONFIG${role_post}=@targetPrefix@@baseBinName@ + +# No local scope in sourced file +unset -v role_post diff --git a/pkgs/build-support/plugins.nix b/pkgs/build-support/plugins.nix new file mode 100644 index 0000000..31b478c --- /dev/null +++ b/pkgs/build-support/plugins.nix @@ -0,0 +1,29 @@ +{ lib }: +# helper functions for packaging programs with plugin systems +{ + + /* Takes a list of expected plugin names + * and compares it to the found plugins given in the file, + * one plugin per line. + * If the lists differ, the build fails with a nice message. + * + * This is helpful to ensure maintainers don’t miss + * the addition or removal of a plugin. + */ + diffPlugins = expectedPlugins: foundPluginsFilePath: '' + # sort both lists first + plugins_expected=$(mktemp) + (${lib.concatMapStrings (s: "echo \"${s}\";") expectedPlugins}) \ + | sort -u > "$plugins_expected" + plugins_found=$(mktemp) + sort -u "${foundPluginsFilePath}" > "$plugins_found" + + if ! mismatches="$(diff -y "$plugins_expected" "$plugins_found")"; then + echo "The the list of expected plugins (left side) doesn't match" \ + "the list of plugins we found (right side):" >&2 + echo "$mismatches" >&2 + exit 1 + fi + ''; + +} diff --git a/pkgs/build-support/portable-service/default.nix b/pkgs/build-support/portable-service/default.nix new file mode 100644 index 0000000..6389e8d --- /dev/null +++ b/pkgs/build-support/portable-service/default.nix @@ -0,0 +1,111 @@ +{ pkgs, lib, stdenv }: +/* + Create a systemd portable service image + https://systemd.io/PORTABLE_SERVICES/ + + Example: + pkgs.portableService { + pname = "demo"; + version = "1.0"; + units = [ demo-service demo-socket ]; + } +*/ +{ + # The name and version of the portable service. The resulting image will be + # created in result/$pname_$version.raw + pname +, version + + # Units is a list of derivations for systemd unit files. Those files will be + # copied to /etc/systemd/system in the resulting image. Note that the unit + # names must be prefixed with the name of the portable service. +, units + + # Basic info about the portable service image, used for the generated + # /etc/os-release +, description ? null +, homepage ? null + + # A list of attribute sets {object, symlink}. Symlinks will be created + # in the root filesystem of the image to objects in the nix store. +, symlinks ? [ ] + + # A list of additional derivations to be included in the image as-is. +, contents ? [ ] + + # mksquashfs options +, squashfsTools ? pkgs.squashfsTools +, squash-compression ? "xz -Xdict-size 100%" +, squash-block-size ? "1M" +}: + +let + filterNull = lib.filterAttrs (_: v: v != null); + envFileGenerator = lib.generators.toKeyValue { }; + + rootFsScaffold = + let + os-release-params = { + PORTABLE_ID = pname; + PORTABLE_PRETTY_NAME = description; + HOME_URL = homepage; + ID = "nixos"; + PRETTY_NAME = "NixOS"; + BUILD_ID = "rolling"; + }; + os-release = pkgs.writeText "os-release" + (envFileGenerator (filterNull os-release-params)); + + in + stdenv.mkDerivation { + pname = "root-fs-scaffold"; + inherit version; + + buildCommand = '' + # scaffold a file system layout + mkdir -p $out/etc/systemd/system $out/proc $out/sys $out/dev $out/run \ + $out/tmp $out/var/tmp $out/var/lib $out/var/cache $out/var/log + + # empty files to mount over with host's version + touch $out/etc/resolv.conf $out/etc/machine-id + + # required for portable services + cp ${os-release} $out/etc/os-release + '' + # units **must** be copied to /etc/systemd/system/ + + (lib.concatMapStringsSep "\n" (u: "cp ${u} $out/etc/systemd/system/${u.name};") units) + + (lib.concatMapStringsSep "\n" + ({ object, symlink }: '' + mkdir -p $(dirname $out/${symlink}); + ln -s ${object} $out/${symlink}; + '') + symlinks) + ; + }; +in + +assert lib.assertMsg (lib.all (u: lib.hasPrefix pname u.name) units) "Unit names must be prefixed with the service name"; + +stdenv.mkDerivation { + pname = "${pname}-img"; + inherit version; + + nativeBuildInputs = [ squashfsTools ]; + closureInfo = pkgs.closureInfo { rootPaths = [ rootFsScaffold ] ++ contents; }; + + buildCommand = '' + mkdir -p nix/store + for i in $(< $closureInfo/store-paths); do + cp -a "$i" "''${i:1}" + done + + mkdir -p $out + # the '.raw' suffix is mandatory by the portable service spec + mksquashfs nix ${rootFsScaffold}/* $out/"${pname}_${version}.raw" \ + -quiet -noappend \ + -exit-on-error \ + -keep-as-directory \ + -all-root -root-mode 755 \ + -b ${squash-block-size} -comp ${squash-compression} + ''; +} diff --git a/pkgs/build-support/prefer-remote-fetch/default.nix b/pkgs/build-support/prefer-remote-fetch/default.nix new file mode 100644 index 0000000..3257e70 --- /dev/null +++ b/pkgs/build-support/prefer-remote-fetch/default.nix @@ -0,0 +1,26 @@ +# An overlay that download sources on remote builder. +# This is useful when the evaluating machine has a slow +# upload while the builder can fetch faster directly from the source. +# Usage: Put the following snippet in your usual overlay definition: +# +# self: super: +# (super.prefer-remote-fetch self super) +# Full configuration example for your own account: +# +# $ mkdir ~/.config/nixpkgs/overlays/ +# $ echo 'self: super: super.prefer-remote-fetch self super' > ~/.config/nixpkgs/overlays/prefer-remote-fetch.nix +# +self: super: { + binary-cache = args: super.binary-cache ({ preferLocalBuild = false; } // args); + buildenv = args: super.buildenv ({ preferLocalBuild = false; } // args); + fetchfossil = args: super.fetchfossil ({ preferLocalBuild = false; } // args); + fetchdocker = args: super.fetchdocker ({ preferLocalBuild = false; } // args); + fetchgit = args: super.fetchgit ({ preferLocalBuild = false; } // args); + fetchgx = args: super.fetchgx ({ preferLocalBuild = false; } // args); + fetchhg = args: super.fetchhg ({ preferLocalBuild = false; } // args); + fetchipfs = args: super.fetchipfs ({ preferLocalBuild = false; } // args); + fetchrepoproject = args: super.fetchrepoproject ({ preferLocalBuild = false; } // args); + fetchs3 = args: super.fetchs3 ({ preferLocalBuild = false; } // args); + fetchsvn = args: super.fetchsvn ({ preferLocalBuild = false; } // args); + fetchurl = args: super.fetchurl ({ preferLocalBuild = false; } // args); +} diff --git a/pkgs/build-support/references-by-popularity/closure-graph.py b/pkgs/build-support/references-by-popularity/closure-graph.py new file mode 100644 index 0000000..4f8efd4 --- /dev/null +++ b/pkgs/build-support/references-by-popularity/closure-graph.py @@ -0,0 +1,567 @@ +# IMPORTANT: Making changes? +# +# Validate your changes with python3 ./closure-graph.py --test + + +# Using a simple algorithm, convert the references to a path in to a +# sorted list of dependent paths based on how often they're referenced +# and how deep in the tree they live. Equally-"popular" paths are then +# sorted by name. +# +# The existing writeClosure prints the paths in a simple ascii-based +# sorting of the paths. +# +# Sorting the paths by graph improves the chances that the difference +# between two builds appear near the end of the list, instead of near +# the beginning. This makes a difference for Nix builds which export a +# closure for another program to consume, if that program implements its +# own level of binary diffing. +# +# For an example, Docker Images. If each store path is a separate layer +# then Docker Images can be very efficiently transfered between systems, +# and we get very good cache reuse between images built with the same +# version of Nixpkgs. However, since Docker only reliably supports a +# small number of layers (42) it is important to pick the individual +# layers carefully. By storing very popular store paths in the first 40 +# layers, we improve the chances that the next Docker image will share +# many of those layers.* +# +# Given the dependency tree: +# +# A - B - C - D -\ +# \ \ \ \ +# \ \ \ \ +# \ \ - E ---- F +# \- G +# +# Nodes which have multiple references are duplicated: +# +# A - B - C - D - F +# \ \ \ +# \ \ \- E - F +# \ \ +# \ \- E - F +# \ +# \- G +# +# Each leaf node is now replaced by a counter defaulted to 1: +# +# A - B - C - D - (F:1) +# \ \ \ +# \ \ \- E - (F:1) +# \ \ +# \ \- E - (F:1) +# \ +# \- (G:1) +# +# Then each leaf counter is merged with its parent node, replacing the +# parent node with a counter of 1, and each existing counter being +# incremented by 1. That is to say `- D - (F:1)` becomes `- (D:1, F:2)`: +# +# A - B - C - (D:1, F:2) +# \ \ \ +# \ \ \- (E:1, F:2) +# \ \ +# \ \- (E:1, F:2) +# \ +# \- (G:1) +# +# Then each leaf counter is merged with its parent node again, merging +# any counters, then incrementing each: +# +# A - B - (C:1, D:2, E:2, F:5) +# \ \ +# \ \- (E:1, F:2) +# \ +# \- (G:1) +# +# And again: +# +# A - (B:1, C:2, D:3, E:4, F:8) +# \ +# \- (G:1) +# +# And again: +# +# (A:1, B:2, C:3, D:4, E:5, F:9, G:2) +# +# and then paths have the following "popularity": +# +# A 1 +# B 2 +# C 3 +# D 4 +# E 5 +# F 9 +# G 2 +# +# and the popularity contest would result in the paths being printed as: +# +# F +# E +# D +# C +# B +# G +# A +# +# * Note: People who have used a Dockerfile before assume Docker's +# Layers are inherently ordered. However, this is not true -- Docker +# layers are content-addressable and are not explicitly layered until +# they are composed in to an Image. + +import sys +import json +import unittest + +from pprint import pprint +from collections import defaultdict + + +def debug(msg, *args, **kwargs): + if False: + print( + "DEBUG: {}".format( + msg.format(*args, **kwargs) + ), + file=sys.stderr + ) + + +# Find paths in the original dataset which are never referenced by +# any other paths +def find_roots(closures): + roots = []; + + for closure in closures: + path = closure['path'] + if not any_refer_to(path, closures): + roots.append(path) + + return roots + +class TestFindRoots(unittest.TestCase): + def test_find_roots(self): + self.assertCountEqual( + find_roots([ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/foo", + "/nix/store/bar" + ] + }, + { + "path": "/nix/store/bar", + "references": [ + "/nix/store/bar", + "/nix/store/tux" + ] + }, + { + "path": "/nix/store/hello", + "references": [ + ] + } + ]), + ["/nix/store/foo", "/nix/store/hello"] + ) + + +def any_refer_to(path, closures): + for closure in closures: + if path != closure['path']: + if path in closure['references']: + return True + return False + +class TestAnyReferTo(unittest.TestCase): + def test_has_references(self): + self.assertTrue( + any_refer_to( + "/nix/store/bar", + [ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/bar" + ] + }, + ] + ), + ) + def test_no_references(self): + self.assertFalse( + any_refer_to( + "/nix/store/foo", + [ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/foo", + "/nix/store/bar" + ] + }, + ] + ), + ) + +def all_paths(closures): + paths = [] + for closure in closures: + paths.append(closure['path']) + paths.extend(closure['references']) + paths.sort() + return list(set(paths)) + + +class TestAllPaths(unittest.TestCase): + def test_returns_all_paths(self): + self.assertCountEqual( + all_paths([ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/foo", + "/nix/store/bar" + ] + }, + { + "path": "/nix/store/bar", + "references": [ + "/nix/store/bar", + "/nix/store/tux" + ] + }, + { + "path": "/nix/store/hello", + "references": [ + ] + } + ]), + ["/nix/store/foo", "/nix/store/bar", "/nix/store/hello", "/nix/store/tux",] + ) + def test_no_references(self): + self.assertFalse( + any_refer_to( + "/nix/store/foo", + [ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/foo", + "/nix/store/bar" + ] + }, + ] + ), + ) + +# Convert: +# +# [ +# { path: /nix/store/foo, references: [ /nix/store/foo, /nix/store/bar, /nix/store/baz ] }, +# { path: /nix/store/bar, references: [ /nix/store/bar, /nix/store/baz ] }, +# { path: /nix/store/baz, references: [ /nix/store/baz, /nix/store/tux ] }, +# { path: /nix/store/tux, references: [ /nix/store/tux ] } +# ] +# +# To: +# { +# /nix/store/foo: [ /nix/store/bar, /nix/store/baz ], +# /nix/store/bar: [ /nix/store/baz ], +# /nix/store/baz: [ /nix/store/tux ] }, +# /nix/store/tux: [ ] +# } +# +# Note that it drops self-references to avoid loops. +def make_lookup(closures): + lookup = {} + + for closure in closures: + # paths often self-refer + nonreferential_paths = [ref for ref in closure['references'] if ref != closure['path']] + lookup[closure['path']] = nonreferential_paths + + return lookup + +class TestMakeLookup(unittest.TestCase): + def test_returns_lookp(self): + self.assertDictEqual( + make_lookup([ + { + "path": "/nix/store/foo", + "references": [ + "/nix/store/foo", + "/nix/store/bar" + ] + }, + { + "path": "/nix/store/bar", + "references": [ + "/nix/store/bar", + "/nix/store/tux" + ] + }, + { + "path": "/nix/store/hello", + "references": [ + ] + } + ]), + { + "/nix/store/foo": [ "/nix/store/bar" ], + "/nix/store/bar": [ "/nix/store/tux" ], + "/nix/store/hello": [ ], + } + ) + +# Convert: +# +# /nix/store/foo with +# { +# /nix/store/foo: [ /nix/store/bar, /nix/store/baz ], +# /nix/store/bar: [ /nix/store/baz ], +# /nix/store/baz: [ /nix/store/tux ] }, +# /nix/store/tux: [ ] +# } +# +# To: +# +# { +# /nix/store/bar: { +# /nix/store/baz: { +# /nix/store/tux: {} +# } +# }, +# /nix/store/baz: { +# /nix/store/tux: {} +# } +# } +subgraphs_cache = {} +def make_graph_segment_from_root(root, lookup): + global subgraphs_cache + children = {} + for ref in lookup[root]: + # make_graph_segment_from_root is a pure function, and will + # always return the same result based on a given input. Thus, + # cache computation. + # + # Python's assignment will use a pointer, preventing memory + # bloat for large graphs. + if ref not in subgraphs_cache: + debug("Subgraph Cache miss on {}".format(ref)) + subgraphs_cache[ref] = make_graph_segment_from_root(ref, lookup) + else: + debug("Subgraph Cache hit on {}".format(ref)) + children[ref] = subgraphs_cache[ref] + return children + +class TestMakeGraphSegmentFromRoot(unittest.TestCase): + def test_returns_graph(self): + self.assertDictEqual( + make_graph_segment_from_root("/nix/store/foo", { + "/nix/store/foo": [ "/nix/store/bar" ], + "/nix/store/bar": [ "/nix/store/tux" ], + "/nix/store/tux": [ ], + "/nix/store/hello": [ ], + }), + { + "/nix/store/bar": { + "/nix/store/tux": {} + } + } + ) + def test_returns_graph_tiny(self): + self.assertDictEqual( + make_graph_segment_from_root("/nix/store/tux", { + "/nix/store/foo": [ "/nix/store/bar" ], + "/nix/store/bar": [ "/nix/store/tux" ], + "/nix/store/tux": [ ], + }), + {} + ) + +# Convert a graph segment in to a popularity-counted dictionary: +# +# From: +# { +# /nix/store/foo: { +# /nix/store/bar: { +# /nix/store/baz: { +# /nix/store/tux: {} +# } +# } +# /nix/store/baz: { +# /nix/store/tux: {} +# } +# } +# } +# +# to: +# [ +# /nix/store/foo: 1 +# /nix/store/bar: 2 +# /nix/store/baz: 4 +# /nix/store/tux: 6 +# ] +popularity_cache = {} +def graph_popularity_contest(full_graph): + global popularity_cache + popularity = defaultdict(int) + for path, subgraph in full_graph.items(): + popularity[path] += 1 + # graph_popularity_contest is a pure function, and will + # always return the same result based on a given input. Thus, + # cache computation. + # + # Python's assignment will use a pointer, preventing memory + # bloat for large graphs. + if path not in popularity_cache: + debug("Popularity Cache miss on {}", path) + popularity_cache[path] = graph_popularity_contest(subgraph) + else: + debug("Popularity Cache hit on {}", path) + + subcontest = popularity_cache[path] + for subpath, subpopularity in subcontest.items(): + debug("Calculating popularity for {}", subpath) + popularity[subpath] += subpopularity + 1 + + return popularity + +class TestGraphPopularityContest(unittest.TestCase): + def test_counts_popularity(self): + self.assertDictEqual( + graph_popularity_contest({ + "/nix/store/foo": { + "/nix/store/bar": { + "/nix/store/baz": { + "/nix/store/tux": {} + } + }, + "/nix/store/baz": { + "/nix/store/tux": {} + } + } + }), + { + "/nix/store/foo": 1, + "/nix/store/bar": 2, + "/nix/store/baz": 4, + "/nix/store/tux": 6, + } + ) + +# Emit a list of packages by popularity, most first: +# +# From: +# [ +# /nix/store/foo: 1 +# /nix/store/bar: 1 +# /nix/store/baz: 2 +# /nix/store/tux: 2 +# ] +# +# To: +# [ /nix/store/baz /nix/store/tux /nix/store/bar /nix/store/foo ] +def order_by_popularity(paths): + paths_by_popularity = defaultdict(list) + popularities = [] + for path, popularity in paths.items(): + popularities.append(popularity) + paths_by_popularity[popularity].append(path) + + popularities = list(set(popularities)) + popularities.sort() + + flat_ordered = [] + for popularity in popularities: + paths = paths_by_popularity[popularity] + paths.sort(key=package_name) + + flat_ordered.extend(reversed(paths)) + return list(reversed(flat_ordered)) + + +class TestOrderByPopularity(unittest.TestCase): + def test_returns_in_order(self): + self.assertEqual( + order_by_popularity({ + "/nix/store/foo": 1, + "/nix/store/bar": 1, + "/nix/store/baz": 2, + "/nix/store/tux": 2, + }), + [ + "/nix/store/baz", + "/nix/store/tux", + "/nix/store/bar", + "/nix/store/foo" + ] + ) + +def package_name(path): + parts = path.split('-') + start = parts.pop(0) + # don't throw away any data, so the order is always the same. + # even in cases where only the hash at the start has changed. + parts.append(start) + return '-'.join(parts) + +def main(): + filename = sys.argv[1] + key = sys.argv[2] + + debug("Loading from {}", filename) + with open(filename) as f: + data = json.load(f) + + # Data comes in as: + # [ + # { path: /nix/store/foo, references: [ /nix/store/foo, /nix/store/bar, /nix/store/baz ] }, + # { path: /nix/store/bar, references: [ /nix/store/bar, /nix/store/baz ] }, + # { path: /nix/store/baz, references: [ /nix/store/baz, /nix/store/tux ] }, + # { path: /nix/store/tux, references: [ /nix/store/tux ] } + # ] + # + # and we want to get out a list of paths ordered by how universally, + # important they are, ie: tux is referenced by every path, transitively + # so it should be #1 + # + # [ + # /nix/store/tux, + # /nix/store/baz, + # /nix/store/bar, + # /nix/store/foo, + # ] + graph = data[key] + + debug("Finding roots from {}", key) + roots = find_roots(graph); + debug("Making lookup for {}", key) + lookup = make_lookup(graph) + + full_graph = {} + for root in roots: + debug("Making full graph for {}", root) + full_graph[root] = make_graph_segment_from_root(root, lookup) + + debug("Running contest") + contest = graph_popularity_contest(full_graph) + debug("Ordering by popularity") + ordered = order_by_popularity(contest) + debug("Checking for missing paths") + missing = [] + for path in all_paths(graph): + if path not in ordered: + missing.append(path) + + ordered.extend(missing) + print("\n".join(ordered)) + +if "--test" in sys.argv: + # Don't pass --test otherwise unittest gets mad + unittest.main(argv = [f for f in sys.argv if f != "--test" ]) +else: + main() diff --git a/pkgs/build-support/references-by-popularity/default.nix b/pkgs/build-support/references-by-popularity/default.nix new file mode 100644 index 0000000..2171c62 --- /dev/null +++ b/pkgs/build-support/references-by-popularity/default.nix @@ -0,0 +1,13 @@ +{ runCommand, python3, coreutils }: +# Write the references of `path' to a file, in order of how "popular" each +# reference is. Nix 2 only. +path: runCommand "closure-paths" +{ + exportReferencesGraph.graph = path; + __structuredAttrs = true; + preferLocalBuild = true; + nativeBuildInputs = [ coreutils python3 ]; +} +'' + python3 ${./closure-graph.py} "$NIX_ATTRS_JSON_FILE" graph > ''${outputs[out]} +'' diff --git a/pkgs/build-support/release/binary-tarball.nix b/pkgs/build-support/release/binary-tarball.nix new file mode 100644 index 0000000..37c5f8c --- /dev/null +++ b/pkgs/build-support/release/binary-tarball.nix @@ -0,0 +1,78 @@ +/* This function builds a binary tarball. The resulting binaries are + usually only useful if they are don't have any runtime dependencies + on any paths in the Nix store, since those aren't distributed in + the tarball. For instance, the binaries should be statically + linked: they can't depend on dynamic libraries in the store + (including Glibc). + + The binaries are built and installed with a prefix of /usr/local by + default. They are installed by setting DESTDIR to a temporary + directory, so the Makefile of the package should support DESTDIR. +*/ + +{ src, lib, stdenv +, name ? "binary-tarball" +, ... } @ args: + +stdenv.mkDerivation ( + + { + # Also run a `make check'. + doCheck = true; + + showBuildStats = true; + + prefix = "/usr/local"; + + postPhases = "finalPhase"; + } + + // args // + + { + name = name + (lib.optionalString (src ? version) "-${src.version}"); + + postHook = '' + mkdir -p $out/nix-support + echo "$system" > $out/nix-support/system + . ${./functions.sh} + + origSrc=$src + src=$(findTarball $src) + + if test -e $origSrc/nix-support/hydra-release-name; then + releaseName=$(cat $origSrc/nix-support/hydra-release-name) + fi + + installFlagsArray=(DESTDIR=$TMPDIR/inst) + + # Prefix hackery because of a bug in stdenv (it tries to `mkdir + # $prefix', which doesn't work due to the DESTDIR). + configureFlags="--prefix=$prefix $configureFlags" + dontAddPrefix=1 + prefix=$TMPDIR/inst$prefix + ''; + + doDist = true; + + distPhase = '' + mkdir -p $out/tarballs + tar cvfj $out/tarballs/''${releaseName:-binary-dist}.tar.bz2 -C $TMPDIR/inst . + ''; + + finalPhase = '' + for i in $out/tarballs/*; do + echo "file binary-dist $i" >> $out/nix-support/hydra-build-products + done + + # Propagate the release name of the source tarball. This is + # to get nice package names in channels. + test -n "$releaseName" && (echo "$releaseName" >> $out/nix-support/hydra-release-name) + ''; + + meta = (lib.optionalAttrs (args ? meta) args.meta) // { + description = "Build of a generic binary distribution"; + }; + + } +) diff --git a/pkgs/build-support/release/debian-build.nix b/pkgs/build-support/release/debian-build.nix new file mode 100644 index 0000000..ab84a50 --- /dev/null +++ b/pkgs/build-support/release/debian-build.nix @@ -0,0 +1,94 @@ +# This function compiles a source tarball in a virtual machine image +# that contains a Debian-like (i.e. dpkg-based) OS. + +{ name ? "debian-build" +, diskImage +, src, lib, stdenv, vmTools, checkinstall +, fsTranslation ? false +, # Features provided by this package. + debProvides ? [] +, # Features required by this package. + debRequires ? [] +, ... } @ args: + +vmTools.runInLinuxImage (stdenv.mkDerivation ( + + { + doCheck = true; + + prefix = "/usr"; + + prePhases = "installExtraDebsPhase sysInfoPhase"; + } + + // removeAttrs args ["vmTools" "lib"] // + + { + name = name + "-" + diskImage.name + (lib.optionalString (src ? version) "-${src.version}"); + + # !!! cut&paste from rpm-build.nix + postHook = '' + . ${./functions.sh} + propagateImageName + src=$(findTarball $src) + ''; + + installExtraDebsPhase = '' + for i in $extraDebs; do + dpkg --install $(ls $i/debs/*.deb | sort | head -1) + done + ''; + + sysInfoPhase = '' + [ ! -f /etc/lsb-release ] || (source /etc/lsb-release; echo "OS release: $DISTRIB_DESCRIPTION") + echo "System/kernel: $(uname -a)" + if test -e /etc/debian_version; then echo "Debian release: $(cat /etc/debian_version)"; fi + echo "installed Debian packages" + dpkg-query --list + ''; + + installPhase = '' + eval "$preInstall" + export LOGNAME=root + + # otherwise build hangs when it wants to display + # the log file + export PAGER=cat + ${checkinstall}/sbin/checkinstall --nodoc -y -D \ + --fstrans=${if fsTranslation then "yes" else "no"} \ + --requires="${lib.concatStringsSep "," debRequires}" \ + --provides="${lib.concatStringsSep "," debProvides}" \ + ${if (src ? version) then "--pkgversion=$(echo ${src.version} | tr _ -)" + else "--pkgversion=0.0.0"} \ + ''${debMaintainer:+--maintainer="'$debMaintainer'"} \ + ''${debName:+--pkgname="'$debName'"} \ + $checkInstallFlags \ + -- \ + $SHELL -c "''${installCommand:-make install}" + + mkdir -p $out/debs + find . -name "*.deb" -exec cp {} $out/debs \; + + [ "$(echo $out/debs/*.deb)" != "" ] + + for i in $out/debs/*.deb; do + echo "Generated DEB package: $i" + dpkg-deb --info "$i" + pkgName=$(dpkg-deb -W "$i" | awk '{print $1}') + echo "file deb $i" >> $out/nix-support/hydra-build-products + done + dpkg -i $out/debs/*.deb + + for i in $extraDebs; do + echo "file deb-extra $(ls $i/debs/*.deb | sort | head -1)" >> $out/nix-support/hydra-build-products + done + + eval "$postInstall" + ''; + + meta = (lib.optionalAttrs (args ? meta) args.meta) // { + description = "Deb package for ${diskImage.fullName}"; + }; + } + +)) diff --git a/pkgs/build-support/release/default.nix b/pkgs/build-support/release/default.nix new file mode 100644 index 0000000..f5ab2db --- /dev/null +++ b/pkgs/build-support/release/default.nix @@ -0,0 +1,139 @@ +{ lib, pkgs }: + +let + inherit (lib) optionalString; + + inherit (pkgs) + autoconf + automake + checkinstall + clang-analyzer + cov-build + enableGCOVInstrumentation + lcov + libtool + makeGCOVReport + runCommand + stdenv + vmTools + xz + ; +in + +rec { + + sourceTarball = args: import ./source-tarball.nix ( + { inherit lib stdenv autoconf automake libtool; + } // args); + + makeSourceTarball = sourceTarball; # compatibility + + binaryTarball = args: import ./binary-tarball.nix ( + { inherit lib stdenv; + } // args); + + mvnBuild = args: import ./maven-build.nix ( + { inherit lib stdenv; + } // args); + + nixBuild = args: import ./nix-build.nix ( + { inherit lib stdenv; + } // args); + + coverageAnalysis = args: nixBuild ( + { inherit lcov enableGCOVInstrumentation makeGCOVReport; + doCoverageAnalysis = true; + } // args); + + clangAnalysis = args: nixBuild ( + { inherit clang-analyzer; + doClangAnalysis = true; + } // args); + + coverityAnalysis = args: nixBuild ( + { inherit cov-build xz; + doCoverityAnalysis = true; + } // args); + + rpmBuild = args: import ./rpm-build.nix ( + { inherit lib vmTools; + } // args); + + debBuild = args: import ./debian-build.nix ( + { inherit lib stdenv vmTools checkinstall; + } // args); + + aggregate = + { name, constituents, meta ? { } }: + pkgs.runCommand name + { inherit constituents meta; + preferLocalBuild = true; + _hydraAggregate = true; + } + '' + mkdir -p $out/nix-support + touch $out/nix-support/hydra-build-products + echo $constituents > $out/nix-support/hydra-aggregate-constituents + + # Propagate build failures. + for i in $constituents; do + if [ -e $i/nix-support/failed ]; then + touch $out/nix-support/failed + fi + done + ''; + + /* Create a channel job which success depends on the success of all of + its contituents. Channel jobs are a special type of jobs that are + listed in the channel tab of Hydra and that can be suscribed. + A tarball of the src attribute is distributed via the channel. + + - constituents: a list of derivations on which the channel success depends. + - name: the channel name that will be used in the hydra interface. + - src: should point to the root folder of the nix-expressions used by the + channel, typically a folder containing a `default.nix`. + + channel { + constituents = [ foo bar baz ]; + name = "my-channel"; + src = ./.; + }; + + */ + channel = + { name, src, constituents ? [], meta ? {}, isNixOS ? true, ... }@args: + stdenv.mkDerivation ({ + preferLocalBuild = true; + _hydraAggregate = true; + + dontConfigure = true; + dontBuild = true; + + patchPhase = optionalString isNixOS '' + touch .update-on-nixos-rebuild + ''; + + installPhase = '' + mkdir -p $out/{tarballs,nix-support} + + tar cJf "$out/tarballs/nixexprs.tar.xz" \ + --owner=0 --group=0 --mtime="1970-01-01 00:00:00 UTC" \ + --transform='s!^\.!${name}!' . + + echo "channel - $out/tarballs/nixexprs.tar.xz" > "$out/nix-support/hydra-build-products" + echo $constituents > "$out/nix-support/hydra-aggregate-constituents" + + # Propagate build failures. + for i in $constituents; do + if [ -e "$i/nix-support/failed" ]; then + touch "$out/nix-support/failed" + fi + done + ''; + + meta = meta // { + isHydraChannel = true; + }; + } // removeAttrs args [ "meta" ]); + +} diff --git a/pkgs/build-support/release/functions.sh b/pkgs/build-support/release/functions.sh new file mode 100644 index 0000000..0c4b81e --- /dev/null +++ b/pkgs/build-support/release/functions.sh @@ -0,0 +1,17 @@ +findTarball() { + local suffix i + if [ -d "$1/tarballs/" ]; then + for suffix in tar.gz tgz tar.bz2 tbz2 tbz tar.xz txz tar.lzma; do + for i in $1/tarballs/*.$suffix; do echo $i; break; done + done | sort | head -1 + return + else + echo "$1" + return + fi +} + +propagateImageName() { + mkdir -p $out/nix-support + cat "$diskImage"/nix-support/full-name > $out/nix-support/full-name +} diff --git a/pkgs/build-support/release/maven-build.nix b/pkgs/build-support/release/maven-build.nix new file mode 100644 index 0000000..f618032 --- /dev/null +++ b/pkgs/build-support/release/maven-build.nix @@ -0,0 +1,103 @@ +{ stdenv +, lib +, name +, src +, doTest ? true +, doTestCompile ? true +, doJavadoc ? false +, doCheckstyle ? false +, doRelease ? false +, includeTestClasses ? true +, extraMvnFlags ? "" +, ... +} @ args : + +let + mvnFlags = lib.escapeShellArgs [ + "-Dmaven.repo.local=$M2_REPO" + (lib.optionalString (!doTest) "-Dmaven.test.skip.exec=true") + "${extraMvnFlags}" + ]; +in + +stdenv.mkDerivation ( { + inherit name src; + phases = "setupPhase unpackPhase patchPhase mvnCompile ${lib.optionalString doTestCompile "mvnTestCompile mvnTestJar"} ${lib.optionalString doTest "mvnTest"} ${lib.optionalString doJavadoc "mvnJavadoc"} ${lib.optionalString doCheckstyle "mvnCheckstyle"} mvnJar mvnAssembly mvnRelease finalPhase"; + + setupPhase = '' + runHook preSetupPhase + + mkdir -p $out/nix-support + export LANG="en_US.UTF-8" + export LOCALE_ARCHIVE=$glibcLocales/lib/locale/locale-archive + export M2_REPO=$TMPDIR/repository + + runHook postSetupPhase + ''; + + mvnCompile = '' + mvn compile ${mvnFlags} + ''; + + mvnTestCompile = '' + mvn test-compile ${mvnFlags} + ''; + + mvnTestJar = '' + mvn jar:test-jar ${mvnFlags} + ''; + + mvnTest = '' + mvn test ${mvnFlags} + + if [ -d target/site/cobertura ] ; then + echo "report coverage $out/site/cobertura" >> $out/nix-support/hydra-build-products + fi + + if [ -d target/surefire-reports ] ; then + mvn surefire-report:report-only + echo "report coverage $out/site/surefire-report.html" >> $out/nix-support/hydra-build-products + fi + ''; + + mvnJavadoc = '' + mvn javadoc:javadoc ${mvnFlags} + echo "report javadoc $out/site/apidocs" >> $out/nix-support/hydra-build-products + ''; + + mvnCheckstyle = '' + mvn checkstyle:checkstyle ${mvnFlags} + echo "report checkstyle $out/site/checkstyle.html" >> $out/nix-support/hydra-build-products + ''; + + mvnJar = '' + mvn jar:jar ${mvnFlags} + ''; + + mvnAssembly = '' + mvn assembly:assembly -Dmaven.test.skip=true ${mvnFlags} + ''; + + mvnRelease = '' + mkdir -p $out/release + + zip=$(ls target/*.zip| head -1) + releaseName=$(basename $zip .zip) + releaseName="$releaseName-r${toString src.rev or "0"}" + cp $zip $out/release/$releaseName.zip + + echo "$releaseName" > $out/nix-support/hydra-release-name + + ${lib.optionalString doRelease '' + echo "file zip $out/release/$releaseName.zip" >> $out/nix-support/hydra-build-products + ''} + ''; + + finalPhase = '' + if [ -d target/site ] ; then + cp -R target/site $out/ + echo "report site $out/site" >> $out/nix-support/hydra-build-products + fi + ''; +} // args +) diff --git a/pkgs/build-support/release/nix-build.nix b/pkgs/build-support/release/nix-build.nix new file mode 100644 index 0000000..348cd5b --- /dev/null +++ b/pkgs/build-support/release/nix-build.nix @@ -0,0 +1,174 @@ +# This function builds and tests an Autoconf-style source tarball. +# The result can be installed normally in an environment (e.g., after +# making it available through a channel). If `doCoverageAnalysis' is +# true, it does an ordinary build from a source tarball, except that +# it turns on GCC's coverage analysis feature. It then runs `make +# check' and produces a coverage analysis report using `lcov'. + +{ buildOutOfSourceTree ? false +, preConfigure ? null +, doCoverageAnalysis ? false +, doClangAnalysis ? false +, doCoverityAnalysis ? false +, lcovFilter ? [] +, lcovExtraTraceFiles ? [] +, src, lib, stdenv +, name ? if doCoverageAnalysis then "nix-coverage" else "nix-build" +, failureHook ? null +, prePhases ? [] +, postPhases ? [] +, buildInputs ? [] +, preHook ? "" +, postHook ? "" +, ... } @ args: + +let + doingAnalysis = doCoverageAnalysis || doClangAnalysis || doCoverityAnalysis; +in +stdenv.mkDerivation ( + + { + # Also run a `make check'. + doCheck = true; + + # When doing coverage analysis, we don't care about the result. + dontInstall = doingAnalysis; + useTempPrefix = doingAnalysis; + + showBuildStats = true; + + finalPhase = + '' + # Propagate the release name of the source tarball. This is + # to get nice package names in channels. + if test -e $origSrc/nix-support/hydra-release-name; then + cp $origSrc/nix-support/hydra-release-name $out/nix-support/hydra-release-name + fi + + # Package up Coverity analysis results + if [ ! -z "${toString doCoverityAnalysis}" ]; then + if [ -d "_coverity_$name/cov-int" ]; then + mkdir -p $out/tarballs + NAME=`cat $out/nix-support/hydra-release-name` + cd _coverity_$name + tar caf $out/tarballs/$NAME-coverity-int.xz cov-int + echo "file cov-build $out/tarballs/$NAME-coverity-int.xz" >> $out/nix-support/hydra-build-products + fi + fi + + # Package up Clang analysis results + if [ ! -z "${toString doClangAnalysis}" ]; then + if [ ! -z "`ls _clang_analyze_$name`" ]; then + cd _clang_analyze_$name && mv * $out/analysis + else + mkdir -p $out/analysis + echo "No bugs found." >> $out/analysis/index.html + fi + + echo "report analysis $out/analysis" >> $out/nix-support/hydra-build-products + fi + ''; + + failureHook = (lib.optionalString (failureHook != null) failureHook) + + '' + if test -n "$succeedOnFailure"; then + if test -n "$keepBuildDirectory"; then + KEEPBUILDDIR="$out/`basename $TMPDIR`" + echo "Copying build directory to $KEEPBUILDDIR" + mkdir -p $KEEPBUILDDIR + cp -R "$TMPDIR/"* $KEEPBUILDDIR + fi + fi + ''; + } + + // removeAttrs args [ "lib" ] # Propagating lib causes the evaluation to fail, because lib is a function that can't be converted to a string + + // { + name = name + (lib.optionalString (src ? version) "-${src.version}"); + + postHook = '' + . ${./functions.sh} + origSrc=$src + src=$(findTarball $src) + ${postHook} + ''; + + preHook = '' + # Perform Coverity Analysis + if [ ! -z "${toString doCoverityAnalysis}" ]; then + shopt -s expand_aliases + mkdir _coverity_$name + alias make="cov-build --dir _coverity_$name/cov-int make" + fi + + # Perform Clang Analysis + if [ ! -z "${toString doClangAnalysis}" ]; then + shopt -s expand_aliases + alias make="scan-build -o _clang_analyze_$name --html-title='Scan results for $name' make" + fi + + ${preHook} + ''; + + # Clean up after analysis + postBuild = '' + if [ ! -z "${toString (doCoverityAnalysis || doClangAnalysis)}" ]; then + unalias make + fi + ''; + + initPhase = '' + mkdir -p $out/nix-support + echo "$system" > $out/nix-support/system + + if [ -z "${toString doingAnalysis}" ]; then + for i in $(getAllOutputNames); do + if [ "$i" = out ]; then j=none; else j="$i"; fi + mkdir -p ''${!i}/nix-support + echo "nix-build $j ''${!i}" >> ''${!i}/nix-support/hydra-build-products + done + fi + ''; + + prePhases = ["initPhase"] ++ prePhases; + + buildInputs = + buildInputs ++ + (lib.optional doCoverageAnalysis args.makeGCOVReport) ++ + (lib.optional doClangAnalysis args.clang-analyzer) ++ + (lib.optional doCoverityAnalysis args.cov-build) ++ + (lib.optional doCoverityAnalysis args.xz); + + lcovFilter = ["${builtins.storeDir}/*"] ++ lcovFilter; + + inherit lcovExtraTraceFiles; + + postPhases = postPhases ++ ["finalPhase"]; + + meta = (lib.optionalAttrs (args ? meta) args.meta) // { + description = if doCoverageAnalysis then "Coverage analysis" else "Nix package for ${stdenv.hostPlatform.system}"; + }; + + } + + // + + (lib.optionalAttrs buildOutOfSourceTree + { + preConfigure = + # Build out of source tree and make the source tree read-only. This + # helps catch violations of the GNU Coding Standards (info + # "(standards) Configuration"), like `make distcheck' does. + '' mkdir "../build" + cd "../build" + configureScript="../$sourceRoot/configure" + chmod -R a-w "../$sourceRoot" + + echo "building out of source tree, from \`$PWD'..." + + ${lib.optionalString (preConfigure != null) preConfigure} + ''; + } + ) +) diff --git a/pkgs/build-support/release/rpm-build.nix b/pkgs/build-support/release/rpm-build.nix new file mode 100644 index 0000000..ccbbd57 --- /dev/null +++ b/pkgs/build-support/release/rpm-build.nix @@ -0,0 +1,54 @@ +# This function builds an RPM from a source tarball that contains a +# RPM spec file (i.e., one that can be built using `rpmbuild -ta'). + +{ name ? "rpm-build" +, diskImage +, src, lib, vmTools +, ... } @ args: + +vmTools.buildRPM ( + + removeAttrs args ["vmTools"] // + + { + name = name + "-" + diskImage.name + (lib.optionalString (src ? version) "-${src.version}"); + + preBuild = '' + . ${./functions.sh} + propagateImageName + src=$(findTarball $src) + ''; + + postInstall = '' + declare -a rpms rpmNames + for i in $out/rpms/*/*.rpm; do + if echo $i | grep -vq "\.src\.rpm$"; then + echo "file rpm $i" >> $out/nix-support/hydra-build-products + rpms+=($i) + rpmNames+=("$(rpm -qp "$i")") + fi + done + + echo "installing ''${rpms[*]}..." + rpm -Up ''${rpms[*]} --excludepath /nix/store + + eval "$postRPMInstall" + + echo "uninstalling ''${rpmNames[*]}..." + rpm -e ''${rpmNames[*]} --nodeps + + for i in $out/rpms/*/*.src.rpm; do + echo "file srpm $i" >> $out/nix-support/hydra-build-products + done + + for rpmdir in $extraRPMs ; do + echo "file rpm-extra $(ls $rpmdir/rpms/*/*.rpm | grep -v 'src\.rpm' | sort | head -1)" >> $out/nix-support/hydra-build-products + done + ''; + + meta = (lib.optionalAttrs (args ? meta) args.meta) // { + description = "RPM package for ${diskImage.fullName}"; + }; + } + +) diff --git a/pkgs/build-support/release/source-tarball.nix b/pkgs/build-support/release/source-tarball.nix new file mode 100644 index 0000000..fbc8bc6 --- /dev/null +++ b/pkgs/build-support/release/source-tarball.nix @@ -0,0 +1,129 @@ +# This function converts an un-Autoconfed source tarball (typically a +# checkout from a Subversion or CVS repository) into a source tarball +# by running `autoreconf', `configure' and `make dist'. + +{ officialRelease ? false +, buildInputs ? [] +, name ? "source-tarball" +, version ? "0" +, versionSuffix ? + if officialRelease + then "" + else "pre${toString (src.rev or src.revCount or "")}" +, src, lib, stdenv, autoconf, automake, libtool +, # By default, provide all the GNU Build System as input. + bootstrapBuildInputs ? [ autoconf automake libtool ] +, ... } @ args: + +stdenv.mkDerivation ( + + # First, attributes that can be overridden by the caller (via args): + { + # By default, only configure and build a source distribution. + # Some packages can only build a distribution after a general + # `make' (or even `make install'). + dontBuild = true; + dontInstall = true; + doDist = true; + + # If we do install, install to a dummy location. + useTempPrefix = true; + + showBuildStats = true; + + preConfigurePhases = "autoconfPhase"; + postPhases = "finalPhase"; + + # Autoconfiscate the sources. + autoconfPhase = '' + export VERSION=${version} + export VERSION_SUFFIX=${versionSuffix} + + # `svn-revision' is set for backwards compatibility with the old + # Nix buildfarm. (Stratego/XT's autoxt uses it. We should + # update it eventually.) + echo ${versionSuffix} | sed -e s/pre// > svn-revision + + eval "$preAutoconf" + + if test -x ./bootstrap && test -f ./bootstrap; then ./bootstrap + elif test -x ./bootstrap.sh; then ./bootstrap.sh + elif test -x ./autogen.sh; then ./autogen.sh + elif test -x ./autogen ; then ./autogen + elif test -x ./reconf; then ./reconf + elif test -f ./configure.in || test -f ./configure.ac; then + autoreconf --install --force --verbose + else + echo "No bootstrap, bootstrap.sh, configure.in or configure.ac. Assuming this is not an GNU Autotools package." + fi + + eval "$postAutoconf" + ''; + + failureHook = '' + if test -n "$succeedOnFailure"; then + if test -n "$keepBuildDirectory"; then + KEEPBUILDDIR="$out/`basename $TMPDIR`" + echo "Copying build directory to $KEEPBUILDDIR" + mkdir -p $KEEPBUILDDIR + cp -R "$TMPDIR/"* $KEEPBUILDDIR + fi + fi + ''; + } + + # Then, the caller-supplied attributes. + // (builtins.removeAttrs args [ "lib" ]) // + + # And finally, our own stuff. + { + name = name + "-" + version + versionSuffix; + + buildInputs = buildInputs ++ bootstrapBuildInputs; + + preUnpack = '' + mkdir -p $out/nix-support + ''; + + postUnpack = '' + # Set all source files to the current date. This is because Nix + # resets the timestamp on all files to 0 (1/1/1970), which some + # people don't like (in particular GNU tar prints harmless but + # frightening warnings about it). + touch now + touch -d "1970-01-01 00:00:00 UTC" then + find $sourceRoot ! -newer then -print0 | xargs -0r touch --reference now + rm now then + eval "$nextPostUnpack" + ''; + + nextPostUnpack = if args ? postUnpack then args.postUnpack else ""; + + # Cause distPhase to copy tar.bz2 in addition to tar.gz. + tarballs = "*.tar.gz *.tar.bz2 *.tar.xz"; + + finalPhase = '' + for i in "$out/tarballs/"*; do + echo "file source-dist $i" >> $out/nix-support/hydra-build-products + done + + # Try to figure out the release name. + releaseName=$( (cd $out/tarballs && ls) | head -n 1 | sed -e 's^\.[a-z].*^^') + test -n "$releaseName" && (echo "$releaseName" >> $out/nix-support/hydra-release-name) + ''; + + passthru = { + inherit src; + version = version + versionSuffix; + }; + + meta = (lib.optionalAttrs (args ? meta) args.meta) // { + description = "Source distribution"; + + # Tarball builds are generally important, so give them a high + # default priority. + schedulingPriority = 200; + }; + } + +) diff --git a/pkgs/build-support/remove-references-to/darwin-sign-fixup.sh b/pkgs/build-support/remove-references-to/darwin-sign-fixup.sh new file mode 100644 index 0000000..940c18e --- /dev/null +++ b/pkgs/build-support/remove-references-to/darwin-sign-fixup.sh @@ -0,0 +1,5 @@ +# Fixup hook for nukeReferences, not stdenv + +source @signingUtils@ + +fixupHooks+=(signIfRequired) diff --git a/pkgs/build-support/remove-references-to/default.nix b/pkgs/build-support/remove-references-to/default.nix new file mode 100644 index 0000000..1277cdb --- /dev/null +++ b/pkgs/build-support/remove-references-to/default.nix @@ -0,0 +1,36 @@ +# The program `remove-references-to' created by this derivation replaces all +# references to the given Nix store paths in the specified files by a +# non-existent path (/nix/store/eeee...). This is useful for getting rid of +# dependencies that you know are not actually needed at runtime. + +{ lib, stdenvNoCC, signingUtils, shell ? stdenvNoCC.shell }: + +let + stdenv = stdenvNoCC; + + darwinCodeSign = stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64; +in + +stdenv.mkDerivation { + name = "remove-references-to"; + + dontUnpack = true; + dontConfigure = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/bin + substituteAll ${./remove-references-to.sh} $out/bin/remove-references-to + chmod a+x $out/bin/remove-references-to + ''; + + postFixup = lib.optionalString darwinCodeSign '' + mkdir -p $out/nix-support + substituteAll ${./darwin-sign-fixup.sh} $out/nix-support/setup-hooks.sh + ''; + + inherit (builtins) storeDir; + shell = lib.getBin shell + (shell.shellPath or ""); + signingUtils = if darwinCodeSign then signingUtils else null; + meta.mainProgram = "remove-references-to"; +} diff --git a/pkgs/build-support/remove-references-to/remove-references-to.sh b/pkgs/build-support/remove-references-to/remove-references-to.sh new file mode 100755 index 0000000..a4d068e --- /dev/null +++ b/pkgs/build-support/remove-references-to/remove-references-to.sh @@ -0,0 +1,37 @@ +#! @shell@ -e + +fixupHooks=() + +if [ -e @out@/nix-support/setup-hooks.sh ]; then + source @out@/nix-support/setup-hooks.sh +fi + +# References to remove +targets=() +while getopts t: o; do + case "$o" in + t) storeId=$(echo "$OPTARG" | sed -n "s|^@storeDir@/\\([a-z0-9]\{32\}\\)-.*|\1|p") + if [ -z "$storeId" ]; then + echo "-t argument must be a Nix store path" + exit 1 + fi + targets+=("$storeId") + esac +done +shift $(($OPTIND-1)) + +# Files to remove the references from +regions=() +for i in "$@"; do + test ! -L "$i" -a -f "$i" && regions+=("$i") +done + +for target in "${targets[@]}" ; do + sed -i -e "s|$target|eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee|g" "${regions[@]}" +done + +for region in "${regions[@]}"; do + for hook in "${fixupHooks[@]}"; do + eval "$hook" "$region" + done +done diff --git a/pkgs/build-support/replace-dependency.nix b/pkgs/build-support/replace-dependency.nix new file mode 100644 index 0000000..7912d21 --- /dev/null +++ b/pkgs/build-support/replace-dependency.nix @@ -0,0 +1,94 @@ +{ runCommandLocal, nix, lib }: + +# Replace a single dependency in the requisites tree of drv, propagating +# the change all the way up the tree, without a full rebuild. This can be +# useful, for example, to patch a security hole in libc and still use your +# system safely without rebuilding the world. This should be a short term +# solution, as soon as a rebuild can be done the properly rebuild derivation +# should be used. The old dependency and new dependency MUST have the same-length +# name, and ideally should have close-to-identical directory layout. +# +# Example: safeFirefox = replaceDependency { +# drv = firefox; +# oldDependency = glibc; +# newDependency = overrideDerivation glibc (attrs: { +# patches = attrs.patches ++ [ ./fix-glibc-hole.patch ]; +# }); +# }; +# This will rebuild glibc with your security patch, then copy over firefox +# (and all of its dependencies) without rebuilding further. +{ drv, oldDependency, newDependency, verbose ? true }: + +let + inherit (lib) + any + attrNames + concatStringsSep + elem + filter + filterAttrs + listToAttrs + mapAttrsToList + stringLength + substring + ; + + warn = if verbose then builtins.trace else (x: y: y); + references = import (runCommandLocal "references.nix" { exportReferencesGraph = [ "graph" drv ]; } '' + (echo { + while read path + do + echo " \"$path\" = [" + read count + read count + while [ "0" != "$count" ] + do + read ref_path + if [ "$ref_path" != "$path" ] + then + echo " (builtins.storePath (/. + \"$ref_path\"))" + fi + count=$(($count - 1)) + done + echo " ];" + done < graph + echo }) > $out + '').outPath; + + discard = builtins.unsafeDiscardStringContext; + + oldStorepath = builtins.storePath (discard (toString oldDependency)); + + referencesOf = drv: references.${discard (toString drv)}; + + dependsOnOldMemo = listToAttrs (map + (drv: { name = discard (toString drv); + value = elem oldStorepath (referencesOf drv) || + any dependsOnOld (referencesOf drv); + }) (attrNames references)); + + dependsOnOld = drv: dependsOnOldMemo.${discard (toString drv)}; + + drvName = drv: + discard (substring 33 (stringLength (builtins.baseNameOf drv)) (builtins.baseNameOf drv)); + + rewriteHashes = drv: hashes: runCommandLocal (drvName drv) { nixStore = "${nix.out}/bin/nix-store"; } '' + $nixStore --dump ${drv} | sed 's|${baseNameOf drv}|'$(basename $out)'|g' | sed -e ${ + concatStringsSep " -e " (mapAttrsToList (name: value: + "'s|${baseNameOf name}|${baseNameOf value}|g'" + ) hashes) + } | $nixStore --restore $out + ''; + + rewrittenDeps = listToAttrs [ {name = discard (toString oldDependency); value = newDependency;} ]; + + rewriteMemo = listToAttrs (map + (drv: { name = discard (toString drv); + value = rewriteHashes (builtins.storePath drv) + (filterAttrs (n: v: elem (builtins.storePath (discard (toString n))) (referencesOf drv)) rewriteMemo); + }) + (filter dependsOnOld (attrNames references))) // rewrittenDeps; + + drvHash = discard (toString drv); +in assert (stringLength (drvName (toString oldDependency)) == stringLength (drvName (toString newDependency))); +rewriteMemo.${drvHash} or (warn "replace-dependency.nix: Derivation ${drvHash} does not depend on ${discard (toString oldDependency)}" drv) diff --git a/pkgs/build-support/replace-secret/replace-secret.nix b/pkgs/build-support/replace-secret/replace-secret.nix new file mode 100644 index 0000000..41f5cb0 --- /dev/null +++ b/pkgs/build-support/replace-secret/replace-secret.nix @@ -0,0 +1,37 @@ +{ stdenv, lib, python3 }: + +stdenv.mkDerivation { + name = "replace-secret"; + buildInputs = [ python3 ]; + dontUnpack = true; + installPhase = '' + runHook preInstall + install -D ${./replace-secret.py} $out/bin/replace-secret + patchShebangs $out + runHook postInstall + ''; + installCheckPhase = '' + install -m 0600 ${./test/input_file} long_test + $out/bin/replace-secret "replace this" ${./test/passwd} long_test + $out/bin/replace-secret "and this" ${./test/rsa} long_test + diff ${./test/expected_long_output} long_test + + install -m 0600 ${./test/input_file} short_test + $out/bin/replace-secret "replace this" <(echo "a") short_test + $out/bin/replace-secret "and this" <(echo "b") short_test + diff ${./test/expected_short_output} short_test + ''; + meta = with lib; { + platforms = platforms.all; + maintainers = with maintainers; [ talyz ]; + license = licenses.mit; + description = "Replace a string in one file with a secret from a second file"; + longDescription = '' + Replace a string in one file with a secret from a second file. + + Since the secret is read from a file, it won't be leaked through + '/proc//cmdline', unlike when 'sed' or 'replace' is used. + ''; + mainProgram = "replace-secret"; + }; +} diff --git a/pkgs/build-support/replace-secret/replace-secret.py b/pkgs/build-support/replace-secret/replace-secret.py new file mode 100755 index 0000000..30ff41d --- /dev/null +++ b/pkgs/build-support/replace-secret/replace-secret.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import argparse +from argparse import RawDescriptionHelpFormatter + +description = """ +Replace a string in one file with a secret from a second file. + +Since the secret is read from a file, it won't be leaked through +'/proc//cmdline', unlike when 'sed' or 'replace' is used. +""" + +parser = argparse.ArgumentParser( + description=description, + formatter_class=RawDescriptionHelpFormatter +) +parser.add_argument("string_to_replace", help="the string to replace") +parser.add_argument("secret_file", help="the file containing the secret") +parser.add_argument("file", help="the file to perform the replacement on") +args = parser.parse_args() + +with open(args.secret_file) as sf, open(args.file, 'r+') as f: + old = f.read() + secret = sf.read().strip("\n") + new_content = old.replace(args.string_to_replace, secret) + f.seek(0) + f.write(new_content) + f.truncate() diff --git a/pkgs/build-support/replace-secret/test/expected_long_output b/pkgs/build-support/replace-secret/test/expected_long_output new file mode 100644 index 0000000..37bd66b --- /dev/null +++ b/pkgs/build-support/replace-secret/test/expected_long_output @@ -0,0 +1,30 @@ +beginning +middle $6$UcbJUl5g$HRMfKNKsLTfVbcQb.P5o0bmZUfHDYkWseMSuZ8F5jSIGZZcI3Jnit23f8ZeZOGi4KL86HVM9RYqrpYySOu/fl0 not this +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAzrru6v5tfwQl6L+rOUjtLo8kbhMUlCLXP7TYngSGrkzPMWe+ +0gB04UAmiPZXfBmvj5fPqYiFjIaEDHE/SD41vJB/RJKKtId2gCAIHhBLkbr+4+60 +yEbLkJci5i4kJC1dt8OKFEzXkaVnwOSgjH+0NwO3bstZ+E70zMXS9+NS71qGsIEb +5J1TnacwW/u6CdFyakLljWOXOR14rLIpiPBBFLf+oZiepjIhlWXWHqsxZOb7zMI0 +T4W5WJ2dwGFsJ8rkYaGZ+A5qzYbi/KmHqaSPaNDsyoi7yJhAhKPByALJU916+8QO +xOnqZxWGki3PDzCslRwW4i3mGbZlBQMnlfbN3QIDAQABAoIBAHDn1W7QkFrLmCy6 +6bf6pVdFZF8d2qJhOPAZRClhTXFKj+pqv+QPzcXr9F/fMr6bhK/G+Oqdnlq2aM4m +16oMF+spe+impEyeo1CsreJFghBQcb9o8qFjUPBiKvROBP0hLcscZ4BYy29HSBgo +harWYEWfqQJA251q+fYQoP0z0WrZKddOZbRRnJ0ICRxAE7IEtDT6EYt8R9oGi2j4 +/rpdW+rYGjW3TcmzdR7lpVMJRLlbMbSdR8n6cI6rnfySygcoE5tFX5t/YZSNbBPg +GebKCbEHYNTTG8bC1qjUyzlbEQ6XYWvFO7HTKU7105XpjYTQFByeo0IVkin0o5KW +t7eQWb0CgYEA6zZUWsYoQ13nXEU6Ky89Q9uhesMfaJ/F2X5ikQSRqRvrR3QR+ULe +eNnCl10O9SiFpR4b5gSbLSHMffxGN60P1nEO4CiIKE+gOii8Kdk5htIJFy/dcZUc +PuPM+zD9/6Is5sAWUZo45bnT6685h6EjM2+6zNZtx/XMjSfWbHaY+HMCgYEA4QAy +6ZEgd6FHnNfM/q2o8XU3d6OCdhcu26u6ydnCalbSpPSKWOi6gnHK4ZnGdryXgIYw +hRkvYINfiONkShYytotIh4YxUbgpwdvJRyKa2ZdWhcMmtFzZOcEVzQTKBasFT74C +Wo0iybZ++XZh3M0+n7oyyx39aR7diZ+/zq6PnG8CgYB8B1QH4cHNdDDRqPd5WhmW +NLQ7xbREOSvc+hYDnkMoxz4TmZL4u1gQpdNEeZ+visSeQvg3HGqvK8lnDaYBKdLW +IxvS+8yAZSx6PoyqDI+XFh4RCf5dLGGOkBTAyB7Hs761lsiuEwK5sHmdJ/LQIBot +v1bjOJb/AA/yxvT8kLUtHQKBgGIA9iwqXJv/EfRNQytDdS0HQ4vHGtJZMr3YRVoa +kcZD3yieo4wqguLCsf4mPv4FE3CWAphW6f39+yTi9xIWLSy56nOtjdnsf7PDCh8E +AbL5amSFJly1fKDda6OLjHt/jKa5Osk6ZIa8CP6cA/BrLfXg4rL6cyDQouqJPMDH +5CHdAoGBAIChjbTyoYvANkoANCK4SuqLUYeiYREfiM3sqHe1xirK1PPHw03ZLITl +ltjo9qE6kPXWcTBVckTKGFlntyCT283FC0/vMmHo8dTdtxF4/wSbkqs3ORuJ3p5J +cNtLYGD3vgwLmg6tTur4U60XN+tYDzWGteez8J9GwTMfKJmuS9af +-----END RSA PRIVATE KEY----- +end diff --git a/pkgs/build-support/replace-secret/test/expected_short_output b/pkgs/build-support/replace-secret/test/expected_short_output new file mode 100644 index 0000000..3c81b2e --- /dev/null +++ b/pkgs/build-support/replace-secret/test/expected_short_output @@ -0,0 +1,4 @@ +beginning +middle a not this +b +end diff --git a/pkgs/build-support/replace-secret/test/input_file b/pkgs/build-support/replace-secret/test/input_file new file mode 100644 index 0000000..1e7eadf --- /dev/null +++ b/pkgs/build-support/replace-secret/test/input_file @@ -0,0 +1,4 @@ +beginning +middle replace this not this +and this +end diff --git a/pkgs/build-support/replace-secret/test/passwd b/pkgs/build-support/replace-secret/test/passwd new file mode 100644 index 0000000..68f2662 --- /dev/null +++ b/pkgs/build-support/replace-secret/test/passwd @@ -0,0 +1 @@ +$6$UcbJUl5g$HRMfKNKsLTfVbcQb.P5o0bmZUfHDYkWseMSuZ8F5jSIGZZcI3Jnit23f8ZeZOGi4KL86HVM9RYqrpYySOu/fl0 diff --git a/pkgs/build-support/replace-secret/test/rsa b/pkgs/build-support/replace-secret/test/rsa new file mode 100644 index 0000000..138cc99 --- /dev/null +++ b/pkgs/build-support/replace-secret/test/rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAzrru6v5tfwQl6L+rOUjtLo8kbhMUlCLXP7TYngSGrkzPMWe+ +0gB04UAmiPZXfBmvj5fPqYiFjIaEDHE/SD41vJB/RJKKtId2gCAIHhBLkbr+4+60 +yEbLkJci5i4kJC1dt8OKFEzXkaVnwOSgjH+0NwO3bstZ+E70zMXS9+NS71qGsIEb +5J1TnacwW/u6CdFyakLljWOXOR14rLIpiPBBFLf+oZiepjIhlWXWHqsxZOb7zMI0 +T4W5WJ2dwGFsJ8rkYaGZ+A5qzYbi/KmHqaSPaNDsyoi7yJhAhKPByALJU916+8QO +xOnqZxWGki3PDzCslRwW4i3mGbZlBQMnlfbN3QIDAQABAoIBAHDn1W7QkFrLmCy6 +6bf6pVdFZF8d2qJhOPAZRClhTXFKj+pqv+QPzcXr9F/fMr6bhK/G+Oqdnlq2aM4m +16oMF+spe+impEyeo1CsreJFghBQcb9o8qFjUPBiKvROBP0hLcscZ4BYy29HSBgo +harWYEWfqQJA251q+fYQoP0z0WrZKddOZbRRnJ0ICRxAE7IEtDT6EYt8R9oGi2j4 +/rpdW+rYGjW3TcmzdR7lpVMJRLlbMbSdR8n6cI6rnfySygcoE5tFX5t/YZSNbBPg +GebKCbEHYNTTG8bC1qjUyzlbEQ6XYWvFO7HTKU7105XpjYTQFByeo0IVkin0o5KW +t7eQWb0CgYEA6zZUWsYoQ13nXEU6Ky89Q9uhesMfaJ/F2X5ikQSRqRvrR3QR+ULe +eNnCl10O9SiFpR4b5gSbLSHMffxGN60P1nEO4CiIKE+gOii8Kdk5htIJFy/dcZUc +PuPM+zD9/6Is5sAWUZo45bnT6685h6EjM2+6zNZtx/XMjSfWbHaY+HMCgYEA4QAy +6ZEgd6FHnNfM/q2o8XU3d6OCdhcu26u6ydnCalbSpPSKWOi6gnHK4ZnGdryXgIYw +hRkvYINfiONkShYytotIh4YxUbgpwdvJRyKa2ZdWhcMmtFzZOcEVzQTKBasFT74C +Wo0iybZ++XZh3M0+n7oyyx39aR7diZ+/zq6PnG8CgYB8B1QH4cHNdDDRqPd5WhmW +NLQ7xbREOSvc+hYDnkMoxz4TmZL4u1gQpdNEeZ+visSeQvg3HGqvK8lnDaYBKdLW +IxvS+8yAZSx6PoyqDI+XFh4RCf5dLGGOkBTAyB7Hs761lsiuEwK5sHmdJ/LQIBot +v1bjOJb/AA/yxvT8kLUtHQKBgGIA9iwqXJv/EfRNQytDdS0HQ4vHGtJZMr3YRVoa +kcZD3yieo4wqguLCsf4mPv4FE3CWAphW6f39+yTi9xIWLSy56nOtjdnsf7PDCh8E +AbL5amSFJly1fKDda6OLjHt/jKa5Osk6ZIa8CP6cA/BrLfXg4rL6cyDQouqJPMDH +5CHdAoGBAIChjbTyoYvANkoANCK4SuqLUYeiYREfiM3sqHe1xirK1PPHw03ZLITl +ltjo9qE6kPXWcTBVckTKGFlntyCT283FC0/vMmHo8dTdtxF4/wSbkqs3ORuJ3p5J +cNtLYGD3vgwLmg6tTur4U60XN+tYDzWGteez8J9GwTMfKJmuS9af +-----END RSA PRIVATE KEY----- diff --git a/pkgs/build-support/rust/build-rust-crate/build-crate.nix b/pkgs/build-support/rust/build-rust-crate/build-crate.nix new file mode 100644 index 0000000..bbb2660 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/build-crate.nix @@ -0,0 +1,129 @@ +{ lib, stdenv +, mkRustcDepArgs, mkRustcFeatureArgs, needUnstableCLI +}: + +{ crateName, + dependencies, + crateFeatures, crateRenames, libName, release, libPath, + crateType, metadata, crateBin, hasCrateBin, + extraRustcOpts, verbose, colors, + buildTests, + codegenUnits +}: + + let + baseRustcOpts = + [ + (if release then "-C opt-level=3" else "-C debuginfo=2") + "-C codegen-units=${toString codegenUnits}" + "--remap-path-prefix=$NIX_BUILD_TOP=/" + (mkRustcDepArgs dependencies crateRenames) + (mkRustcFeatureArgs crateFeatures) + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--target" stdenv.hostPlatform.rust.rustcTargetSpec + ] ++ lib.optionals (needUnstableCLI dependencies) [ + "-Z" "unstable-options" + ] ++ extraRustcOpts + # since rustc 1.42 the "proc_macro" crate is part of the default crate prelude + # https://github.com/rust-lang/cargo/commit/4d64eb99a4#diff-7f98585dbf9d30aa100c8318e2c77e79R1021-R1022 + ++ lib.optional (lib.elem "proc-macro" crateType) "--extern proc_macro" + ; + rustcMeta = "-C metadata=${metadata} -C extra-filename=-${metadata}"; + + + # build the final rustc arguments that can be different between different + # crates + libRustcOpts = lib.concatStringsSep " " ( + baseRustcOpts + ++ [rustcMeta] + ++ (map (x: "--crate-type ${x}") crateType) + ); + + binRustcOpts = lib.concatStringsSep " " ( + [ "-C linker=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc" ] ++ + baseRustcOpts + ); + + build_bin = if buildTests then "build_bin_test" else "build_bin"; + in '' + runHook preBuild + + # configure & source common build functions + LIB_RUSTC_OPTS="${libRustcOpts}" + BIN_RUSTC_OPTS="${binRustcOpts}" + LIB_EXT="${stdenv.hostPlatform.extensions.sharedLibrary or ""}" + LIB_PATH="${libPath}" + LIB_NAME="${libName}" + + CRATE_NAME='${lib.replaceStrings ["-"] ["_"] libName}' + + setup_link_paths + + if [[ -e "$LIB_PATH" ]]; then + build_lib "$LIB_PATH" + ${lib.optionalString buildTests ''build_lib_test "$LIB_PATH"''} + elif [[ -e src/lib.rs ]]; then + build_lib src/lib.rs + ${lib.optionalString buildTests "build_lib_test src/lib.rs"} + fi + + + + ${lib.optionalString (lib.length crateBin > 0) (lib.concatMapStringsSep "\n" (bin: + let + haveRequiredFeature = if bin ? requiredFeatures then + # Check that all element in requiredFeatures are also present in crateFeatures + lib.intersectLists bin.requiredFeatures crateFeatures == bin.requiredFeatures + else + true; + in + if haveRequiredFeature then '' + mkdir -p target/bin + BIN_NAME='${bin.name or crateName}' + ${if !bin ? path then '' + BIN_PATH="" + search_for_bin_path "$BIN_NAME" + '' else '' + BIN_PATH='${bin.path}' + ''} + ${build_bin} "$BIN_NAME" "$BIN_PATH" + '' else '' + echo Binary ${bin.name or crateName} not compiled due to not having all of the required features -- ${lib.escapeShellArg (builtins.toJSON bin.requiredFeatures)} -- enabled. + '') crateBin)} + + ${lib.optionalString buildTests '' + # When tests are enabled build all the files in the `tests` directory as + # test binaries. + if [ -d tests ]; then + # find all the .rs files (or symlinks to those) in the tests directory, no subdirectories + find tests -maxdepth 1 \( -type f -o -type l \) -a -name '*.rs' -print0 | while IFS= read -r -d ''' file; do + mkdir -p target/bin + build_bin_test_file "$file" + done + + # find all the subdirectories of tests/ that contain a main.rs file as + # that is also a test according to cargo + find tests/ -mindepth 1 -maxdepth 2 \( -type f -o -type l \) -a -name 'main.rs' -print0 | while IFS= read -r -d ''' file; do + mkdir -p target/bin + build_bin_test_file "$file" + done + + fi + ''} + + # If crateBin is empty and hasCrateBin is not set then we must try to + # detect some kind of bin target based on some files that might exist. + ${lib.optionalString (lib.length crateBin == 0 && !hasCrateBin) '' + if [[ -e src/main.rs ]]; then + mkdir -p target/bin + ${build_bin} ${crateName} src/main.rs + fi + for i in src/bin/*.rs; do #*/ + mkdir -p target/bin + ${build_bin} "$(basename $i .rs)" "$i" + done + ''} + # Remove object files to avoid "wrong ELF type" + find target -type f -name "*.o" -print0 | xargs -0 rm -f + runHook postBuild + '' diff --git a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix new file mode 100644 index 0000000..6b88271 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix @@ -0,0 +1,231 @@ +{ lib, stdenv, echo_colored, noisily, mkRustcDepArgs, mkRustcFeatureArgs }: +{ + build +, buildDependencies +, codegenUnits +, colors +, completeBuildDeps +, completeDeps +, crateAuthors +, crateDescription +, crateFeatures +, crateHomepage +, crateLicense +, crateLicenseFile +, crateLinks +, crateName +, crateReadme +, crateRenames +, crateRepository +, crateRustVersion +, crateVersion +, extraLinkFlags +, extraRustcOptsForBuildRs +, libName +, libPath +, release +, verbose +, workspace_member }: +let version_ = lib.splitString "-" crateVersion; + versionPre = lib.optionalString (lib.tail version_ != []) (lib.elemAt version_ 1); + version = lib.splitVersion (lib.head version_); + rustcOpts = lib.foldl' (opts: opt: opts + " " + opt) + (if release then "-C opt-level=3" else "-C debuginfo=2") + (["-C codegen-units=${toString codegenUnits}"] ++ extraRustcOptsForBuildRs); + buildDeps = mkRustcDepArgs buildDependencies crateRenames; + authors = lib.concatStringsSep ":" crateAuthors; + optLevel = if release then 3 else 0; + completeDepsDir = lib.concatStringsSep " " completeDeps; + completeBuildDepsDir = lib.concatStringsSep " " completeBuildDeps; + envFeatures = lib.concatStringsSep " " ( + map (f: lib.replaceStrings ["-"] ["_"] (lib.toUpper f)) crateFeatures + ); +in '' + ${echo_colored colors} + ${noisily colors verbose} + source ${./lib.sh} + + ${lib.optionalString (workspace_member != null) '' + noisily cd "${workspace_member}" +''} + ${lib.optionalString (workspace_member == null) '' + echo_colored "Searching for matching Cargo.toml (${crateName})" + local cargo_toml_dir=$(matching_cargo_toml_dir "${crateName}") + if [ -z "$cargo_toml_dir" ]; then + echo_error "ERROR configuring ${crateName}: No matching Cargo.toml in $(pwd) found." >&2 + exit 23 + fi + noisily cd "$cargo_toml_dir" +''} + + runHook preConfigure + + symlink_dependency() { + # $1 is the nix-store path of a dependency + # $2 is the target path + i=$1 + ln -s -f $i/lib/*.rlib $2 #*/ + ln -s -f $i/lib/*.so $i/lib/*.dylib $2 #*/ + if [ -e $i/env ]; then + source $i/env + fi + } + + # The following steps set up the dependencies of the crate. Two + # kinds of dependencies are distinguished: build dependencies + # (used by the build script) and crate dependencies. For each + # dependency we have to: + # + # - Make its Rust library available to rustc. This is done by + # symlinking all library dependencies into a directory that + # can be provided to rustc. + # - Accumulate linking flags. These flags are largely used for + # linking native libraries. + # + # The crate link flags are added to the `link` and `link.final` + # files. The `link` file is used for linkage in the current + # crate. The `link.final` file will be copied to the output and can + # be used by downstream crates to get the linker flags of this + # crate. + + mkdir -p target/{deps,lib,build,buildDeps} + chmod uga+w target -R + echo ${extraLinkFlags} > target/link + echo ${extraLinkFlags} > target/link.final + + # Prepare crate dependencies + for i in ${completeDepsDir}; do + symlink_dependency $i target/deps + if [ -e "$i/lib/link" ]; then + cat $i/lib/link >> target/link + cat $i/lib/link >> target/link.final + fi + done + + # Prepare crate build dependencies that are used for the build script. + for i in ${completeBuildDepsDir}; do + symlink_dependency $i target/buildDeps + if [ -e "$i/lib/link" ]; then + cat $i/lib/link >> target/link.build + fi + done + + # Remove duplicate linker flags from the build dependencies. + if [[ -e target/link.build ]]; then + sort -uo target/link.build target/link.build + fi + + # Remove duplicate linker flags from the dependencies. + sort -uo target/link target/link + tr '\n' ' ' < target/link > target/link_ + + # Remove duplicate linker flags from the that are written + # to the derivation's output. + sort -uo target/link.final target/link.final + + EXTRA_BUILD="" + BUILD_OUT_DIR="" + + # Set up Cargo Environment variables: https://doc.rust-lang.org/cargo/reference/environment-variables.html + export CARGO_PKG_NAME=${crateName} + export CARGO_PKG_VERSION=${crateVersion} + export CARGO_PKG_AUTHORS="${authors}" + export CARGO_PKG_DESCRIPTION="${crateDescription}" + + export CARGO_CFG_TARGET_ARCH=${stdenv.hostPlatform.rust.platform.arch} + export CARGO_CFG_TARGET_OS=${stdenv.hostPlatform.rust.platform.os} + export CARGO_CFG_TARGET_FAMILY="unix" + export CARGO_CFG_UNIX=1 + export CARGO_CFG_TARGET_ENV="gnu" + export CARGO_CFG_TARGET_ENDIAN=${if stdenv.hostPlatform.parsed.cpu.significantByte.name == "littleEndian" then "little" else "big"} + export CARGO_CFG_TARGET_POINTER_WIDTH=${with stdenv.hostPlatform; toString (if isILP32 then 32 else parsed.cpu.bits)} + export CARGO_CFG_TARGET_VENDOR=${stdenv.hostPlatform.parsed.vendor.name} + + export CARGO_MANIFEST_DIR=$(pwd) + export CARGO_MANIFEST_LINKS=${crateLinks} + export DEBUG="${toString (!release)}" + export OPT_LEVEL="${toString optLevel}" + export TARGET="${stdenv.hostPlatform.rust.rustcTargetSpec}" + export HOST="${stdenv.buildPlatform.rust.rustcTargetSpec}" + export PROFILE=${if release then "release" else "debug"} + export OUT_DIR=$(pwd)/target/build/${crateName}.out + export CARGO_PKG_VERSION_MAJOR=${lib.elemAt version 0} + export CARGO_PKG_VERSION_MINOR=${lib.elemAt version 1} + export CARGO_PKG_VERSION_PATCH=${lib.elemAt version 2} + export CARGO_PKG_VERSION_PRE="${versionPre}" + export CARGO_PKG_HOMEPAGE="${crateHomepage}" + export CARGO_PKG_LICENSE="${crateLicense}" + export CARGO_PKG_LICENSE_FILE="${crateLicenseFile}" + export CARGO_PKG_README="${crateReadme}" + export CARGO_PKG_REPOSITORY="${crateRepository}" + export CARGO_PKG_RUST_VERSION="${crateRustVersion}" + export NUM_JOBS=$NIX_BUILD_CORES + export RUSTC="rustc" + export RUSTDOC="rustdoc" + + BUILD="" + if [[ ! -z "${build}" ]] ; then + BUILD=${build} + elif [[ -e "build.rs" ]]; then + BUILD="build.rs" + fi + + # Compile and run the build script, when available. + if [[ ! -z "$BUILD" ]] ; then + echo_build_heading "$BUILD" ${libName} + mkdir -p target/build/${crateName} + EXTRA_BUILD_FLAGS="" + if [ -e target/link.build ]; then + EXTRA_BUILD_FLAGS="$EXTRA_BUILD_FLAGS $(tr '\n' ' ' < target/link.build)" + fi + noisily rustc --crate-name build_script_build $BUILD --crate-type bin ${rustcOpts} \ + ${mkRustcFeatureArgs crateFeatures} --out-dir target/build/${crateName} --emit=dep-info,link \ + -L dependency=target/buildDeps ${buildDeps} --cap-lints allow $EXTRA_BUILD_FLAGS --color ${colors} + + mkdir -p target/build/${crateName}.out + export RUST_BACKTRACE=1 + BUILD_OUT_DIR="-L $OUT_DIR" + mkdir -p $OUT_DIR + + ( + # Features should be set as environment variable for build scripts: + # https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts + for feature in ${envFeatures}; do + export CARGO_FEATURE_$feature=1 + done + + target/build/${crateName}/build_script_build > target/build/${crateName}.opt + ) + + set +e + EXTRA_BUILD=$(sed -n "s/^cargo:rustc-flags=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u) + EXTRA_FEATURES=$(sed -n "s/^cargo:rustc-cfg=\(.*\)/--cfg \1/p" target/build/${crateName}.opt | tr '\n' ' ') + EXTRA_LINK_ARGS=$(sed -n "s/^cargo:rustc-link-arg=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ') + EXTRA_LINK_ARGS_BINS=$(sed -n "s/^cargo:rustc-link-arg-bins=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ') + EXTRA_LINK_ARGS_LIB=$(sed -n "s/^cargo:rustc-link-arg-lib=\(.*\)/-C link-arg=\1/p" target/build/${crateName}.opt | tr '\n' ' ') + EXTRA_LINK_LIBS=$(sed -n "s/^cargo:rustc-link-lib=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ') + EXTRA_LINK_SEARCH=$(sed -n "s/^cargo:rustc-link-search=\(.*\)/\1/p" target/build/${crateName}.opt | tr '\n' ' ' | sort -u) + + # We want to read part of every line that has cargo:rustc-env= prefix and + # export it as environment variables. This turns out tricky if the lines + # have spaces: we can't wrap the command in double quotes as that captures + # all the lines in single output. We can't use while read loop because + # exporting from inside of it doesn't make it to the outside scope. We + # can't use xargs as export is a built-in and does not work from it. As a + # last resort then, we change the IFS so that the for loop does not split + # on spaces and reset it after we are done. See ticket #199298. + # + _OLDIFS="$IFS" + IFS=$'\n' + for env in $(sed -n "s/^cargo:rustc-env=\(.*\)/\1/p" target/build/${crateName}.opt); do + export "$env" + done + IFS="$_OLDIFS" + + CRATENAME=$(echo ${crateName} | sed -e "s/\(.*\)-sys$/\U\1/" -e "s/-/_/g") + grep -P "^cargo:(?!(rustc-|warning=|rerun-if-changed=|rerun-if-env-changed))" target/build/${crateName}.opt \ + | awk -F= "/^cargo:/ { sub(/^cargo:/, \"\", \$1); gsub(/-/, \"_\", \$1); print \"export \" toupper(\"DEP_$(echo $CRATENAME)_\" \$1) \"=\" \$2 }" > target/env + set -e + fi + runHook postConfigure +'' diff --git a/pkgs/build-support/rust/build-rust-crate/default.nix b/pkgs/build-support/rust/build-rust-crate/default.nix new file mode 100644 index 0000000..4a7fd11 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/default.nix @@ -0,0 +1,405 @@ +# Code for buildRustCrate, a Nix function that builds Rust code, just +# like Cargo, but using Nix instead. +# +# This can be useful for deploying packages with NixOps, and to share +# binary dependencies between projects. + +{ lib +, stdenv +, defaultCrateOverrides +, fetchCrate +, pkgsBuildBuild +, rustc +, cargo +, jq +, libiconv +}: + +let + # Create rustc arguments to link against the given list of dependencies + # and renames. + # + # See docs for crateRenames below. + mkRustcDepArgs = dependencies: crateRenames: + lib.concatMapStringsSep " " + (dep: + let + normalizeName = lib.replaceStrings [ "-" ] [ "_" ]; + extern = normalizeName dep.libName; + # Find a choice that matches in name and optionally version. + findMatchOrUseExtern = choices: + lib.findFirst + (choice: + (!(choice ? version) + || choice.version == dep.version or "")) + { rename = extern; } + choices; + name = + if lib.hasAttr dep.crateName crateRenames then + let choices = crateRenames.${dep.crateName}; + in + normalizeName ( + if builtins.isList choices + then (findMatchOrUseExtern choices).rename + else choices + ) + else + extern; + opts = lib.optionalString (dep.stdlib or false) "noprelude:"; + filename = + if lib.any (x: x == "lib" || x == "rlib") dep.crateType + then "${dep.metadata}.rlib" + else "${dep.metadata}${stdenv.hostPlatform.extensions.sharedLibrary}"; + in + " --extern ${opts}${name}=${dep.lib}/lib/lib${extern}-${filename}" + ) + dependencies; + + # Create feature arguments for rustc. + mkRustcFeatureArgs = lib.concatMapStringsSep " " (f: ''--cfg feature=\"${f}\"''); + + # Whether we need to use unstable command line flags + # + # Currently just needed for standard library dependencies, which have a + # special "noprelude:" modifier. If in later versions of Rust this is + # stabilized we can account for that here, too, so we don't opt into + # instability unnecessarily. + needUnstableCLI = dependencies: + lib.any (dep: dep.stdlib or false) dependencies; + + inherit (import ./log.nix { inherit lib; }) noisily echo_colored; + + configureCrate = import ./configure-crate.nix { + inherit lib stdenv echo_colored noisily mkRustcDepArgs mkRustcFeatureArgs; + }; + + buildCrate = import ./build-crate.nix { + inherit lib stdenv mkRustcDepArgs mkRustcFeatureArgs needUnstableCLI; + }; + + installCrate = import ./install-crate.nix { inherit stdenv; }; +in + + /* The overridable pkgs.buildRustCrate function. + * + * Any unrecognized parameters will be passed as to + * the underlying stdenv.mkDerivation. + */ +crate_: lib.makeOverridable + ( + # The rust compiler to use. + # + # Default: pkgs.rustc + { rust + # Whether to build a release version (`true`) or a debug + # version (`false`). Debug versions are faster to build + # but might be much slower at runtime. + , release + # Whether to print rustc invocations etc. + # + # Example: false + # Default: true + , verbose + # A list of rust/cargo features to enable while building the crate. + # Example: [ "std" "async" ] + , features + # Additional native build inputs for building this crate. + , nativeBuildInputs + # Additional build inputs for building this crate. + # + # Example: [ pkgs.openssl ] + , buildInputs + # Allows to override the parameters to buildRustCrate + # for any rust dependency in the transitive build tree. + # + # Default: pkgs.defaultCrateOverrides + # + # Example: + # + # pkgs.defaultCrateOverrides // { + # hello = attrs: { buildInputs = [ openssl ]; }; + # } + , crateOverrides + # Rust library dependencies, i.e. other libraries that were built + # with buildRustCrate. + , dependencies + # Rust build dependencies, i.e. other libraries that were built + # with buildRustCrate and are used by a build script. + , buildDependencies + # Specify the "extern" name of a library if it differs from the library target. + # See above for an extended explanation. + # + # Default: no renames. + # + # Example: + # + # `crateRenames` supports two formats. + # + # The simple version is an attrset that maps the + # `crateName`s of the dependencies to their alternative + # names. + # + # ```nix + # { + # my_crate_name = "my_alternative_name"; + # # ... + # } + # ``` + # + # The extended version is also keyed by the `crateName`s but allows + # different names for different crate versions: + # + # ```nix + # { + # my_crate_name = [ + # { version = "1.2.3"; rename = "my_alternative_name01"; } + # { version = "3.2.3"; rename = "my_alternative_name03"; } + # ] + # # ... + # } + # ``` + # + # This roughly corresponds to the following snippet in Cargo.toml: + # + # ```toml + # [dependencies] + # my_alternative_name01 = { package = "my_crate_name", version = "0.1" } + # my_alternative_name03 = { package = "my_crate_name", version = "0.3" } + # ``` + # + # Dependencies which use the lib target name as extern name, do not need + # to be specified in the crateRenames, even if their crate name differs. + # + # Including multiple versions of a crate is very popular during + # ecosystem transitions, e.g. from futures 0.1 to futures 0.3. + , crateRenames + # A list of extra options to pass to rustc. + # + # Example: [ "-Z debuginfo=2" ] + # Default: [] + , extraRustcOpts + # A list of extra options to pass to rustc when building a build.rs. + # + # Example: [ "-Z debuginfo=2" ] + # Default: [] + , extraRustcOptsForBuildRs + # Whether to enable building tests. + # Use true to enable. + # Default: false + , buildTests + # Passed to stdenv.mkDerivation. + , preUnpack + # Passed to stdenv.mkDerivation. + , postUnpack + # Passed to stdenv.mkDerivation. + , prePatch + # Passed to stdenv.mkDerivation. + , patches + # Passed to stdenv.mkDerivation. + , postPatch + # Passed to stdenv.mkDerivation. + , preConfigure + # Passed to stdenv.mkDerivation. + , postConfigure + # Passed to stdenv.mkDerivation. + , preBuild + # Passed to stdenv.mkDerivation. + , postBuild + # Passed to stdenv.mkDerivation. + , preInstall + # Passed to stdenv.mkDerivation. + , postInstall + }: + + let + crate = crate_ // (lib.attrByPath [ crate_.crateName ] (attr: { }) crateOverrides crate_); + dependencies_ = dependencies; + buildDependencies_ = buildDependencies; + processedAttrs = [ + "src" + "nativeBuildInputs" + "buildInputs" + "crateBin" + "crateLib" + "libName" + "libPath" + "buildDependencies" + "dependencies" + "features" + "crateRenames" + "crateName" + "version" + "build" + "authors" + "colors" + "edition" + "buildTests" + "codegenUnits" + "links" + ]; + extraDerivationAttrs = builtins.removeAttrs crate processedAttrs; + nativeBuildInputs_ = nativeBuildInputs; + buildInputs_ = buildInputs; + extraRustcOpts_ = extraRustcOpts; + extraRustcOptsForBuildRs_ = extraRustcOptsForBuildRs; + buildTests_ = buildTests; + + # crate2nix has a hack for the old bash based build script that did split + # entries at `,`. No we have to work around that hack. + # https://github.com/kolloch/crate2nix/blame/5b19c1b14e1b0e5522c3e44e300d0b332dc939e7/crate2nix/templates/build.nix.tera#L89 + crateBin = lib.filter (bin: !(bin ? name && bin.name == ",")) (crate.crateBin or [ ]); + hasCrateBin = crate ? crateBin; + in + stdenv.mkDerivation (rec { + + inherit (crate) crateName; + inherit + preUnpack + postUnpack + prePatch + patches + postPatch + preConfigure + postConfigure + preBuild + postBuild + preInstall + postInstall + buildTests + ; + + src = crate.src or (fetchCrate { inherit (crate) crateName version sha256; }); + name = "rust_${crate.crateName}-${crate.version}${lib.optionalString buildTests_ "-test"}"; + version = crate.version; + depsBuildBuild = [ pkgsBuildBuild.stdenv.cc ]; + nativeBuildInputs = [ rust stdenv.cc cargo jq ] + ++ lib.optionals stdenv.buildPlatform.isDarwin [ libiconv ] + ++ (crate.nativeBuildInputs or [ ]) ++ nativeBuildInputs_; + buildInputs = lib.optionals stdenv.isDarwin [ libiconv ] ++ (crate.buildInputs or [ ]) ++ buildInputs_; + dependencies = map lib.getLib dependencies_; + buildDependencies = map lib.getLib buildDependencies_; + + completeDeps = lib.unique (dependencies ++ lib.concatMap (dep: dep.completeDeps) dependencies); + completeBuildDeps = lib.unique ( + buildDependencies + ++ lib.concatMap (dep: dep.completeBuildDeps ++ dep.completeDeps) buildDependencies + ); + + # Create a list of features that are enabled by the crate itself and + # through the features argument of buildRustCrate. Exclude features + # with a forward slash, since they are passed through to dependencies, + # and dep: features, since they're internal-only and do nothing except + # enable optional dependencies. + crateFeatures = lib.optionals (crate ? features) + (builtins.filter + (f: !(lib.hasInfix "/" f || lib.hasPrefix "dep:" f)) + (crate.features ++ features) + ); + + libName = if crate ? libName then crate.libName else crate.crateName; + libPath = lib.optionalString (crate ? libPath) crate.libPath; + + # Seed the symbol hashes with something unique every time. + # https://doc.rust-lang.org/1.0.0/rustc/metadata/loader/index.html#frobbing-symbols + metadata = + let + depsMetadata = lib.foldl' (str: dep: str + dep.metadata) "" (dependencies ++ buildDependencies); + hashedMetadata = builtins.hashString "sha256" + (crateName + "-" + crateVersion + "___" + toString (mkRustcFeatureArgs crateFeatures) + + "___" + depsMetadata + "___" + stdenv.hostPlatform.rust.rustcTarget); + in + lib.substring 0 10 hashedMetadata; + + build = crate.build or ""; + # Either set to a concrete sub path to the crate root + # or use `null` for auto-detect. + workspace_member = crate.workspace_member or "."; + crateAuthors = if crate ? authors && lib.isList crate.authors then crate.authors else [ ]; + crateDescription = crate.description or ""; + crateHomepage = crate.homepage or ""; + crateLicense = crate.license or ""; + crateLicenseFile = crate.license-file or ""; + crateLinks = crate.links or ""; + crateReadme = crate.readme or ""; + crateRepository = crate.repository or ""; + crateRustVersion = crate.rust-version or ""; + crateVersion = crate.version; + crateType = + if lib.attrByPath [ "procMacro" ] false crate then [ "proc-macro" ] else + if lib.attrByPath [ "plugin" ] false crate then [ "dylib" ] else + (crate.type or [ "lib" ]); + colors = lib.attrByPath [ "colors" ] "always" crate; + extraLinkFlags = lib.concatStringsSep " " (crate.extraLinkFlags or [ ]); + edition = crate.edition or null; + codegenUnits = if crate ? codegenUnits then crate.codegenUnits else 1; + extraRustcOpts = + lib.optionals (crate ? extraRustcOpts) crate.extraRustcOpts + ++ extraRustcOpts_ + ++ (lib.optional (edition != null) "--edition ${edition}"); + extraRustcOptsForBuildRs = + lib.optionals (crate ? extraRustcOptsForBuildRs) crate.extraRustcOptsForBuildRs + ++ extraRustcOptsForBuildRs_ + ++ (lib.optional (edition != null) "--edition ${edition}"); + + + configurePhase = configureCrate { + inherit crateName buildDependencies completeDeps completeBuildDeps crateDescription + crateFeatures crateRenames libName build workspace_member release libPath crateVersion crateLinks + extraLinkFlags extraRustcOptsForBuildRs + crateLicense crateLicenseFile crateReadme crateRepository crateRustVersion + crateAuthors crateHomepage verbose colors codegenUnits; + }; + buildPhase = buildCrate { + inherit crateName dependencies + crateFeatures crateRenames libName release libPath crateType + metadata hasCrateBin crateBin verbose colors + extraRustcOpts buildTests codegenUnits; + }; + dontStrip = !release; + + # We need to preserve metadata in .rlib, which might get stripped on macOS. See https://github.com/NixOS/nixpkgs/issues/218712 + stripExclude = [ "*.rlib" ]; + + installPhase = installCrate crateName metadata buildTests; + + # depending on the test setting we are either producing something with bins + # and libs or just test binaries + outputs = if buildTests then [ "out" ] else [ "out" "lib" ]; + outputDev = if buildTests then [ "out" ] else [ "lib" ]; + + meta = { + mainProgram = crateName; + badPlatforms = [ + # Rust is currently unable to target the n32 ABI + lib.systems.inspect.patterns.isMips64n32 + ]; + }; + } // extraDerivationAttrs + ) + ) +{ + rust = rustc; + release = crate_.release or true; + verbose = crate_.verbose or true; + extraRustcOpts = [ ]; + extraRustcOptsForBuildRs = [ ]; + features = [ ]; + nativeBuildInputs = [ ]; + buildInputs = [ ]; + crateOverrides = defaultCrateOverrides; + preUnpack = crate_.preUnpack or ""; + postUnpack = crate_.postUnpack or ""; + prePatch = crate_.prePatch or ""; + patches = crate_.patches or [ ]; + postPatch = crate_.postPatch or ""; + preConfigure = crate_.preConfigure or ""; + postConfigure = crate_.postConfigure or ""; + preBuild = crate_.preBuild or ""; + postBuild = crate_.postBuild or ""; + preInstall = crate_.preInstall or ""; + postInstall = crate_.postInstall or ""; + dependencies = crate_.dependencies or [ ]; + buildDependencies = crate_.buildDependencies or [ ]; + crateRenames = crate_.crateRenames or { }; + buildTests = crate_.buildTests or false; +} diff --git a/pkgs/build-support/rust/build-rust-crate/helpers.nix b/pkgs/build-support/rust/build-rust-crate/helpers.nix new file mode 100644 index 0000000..386d0ce --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/helpers.nix @@ -0,0 +1,26 @@ +{stdenv, lib}: +{ + kernel = stdenv.hostPlatform.parsed.kernel.name; + abi = stdenv.hostPlatform.parsed.abi.name; + cpu = stdenv.hostPlatform.parsed.cpu.name; + updateFeatures = f: up: functions: lib.deepSeq f (lib.foldl' (features: fun: fun features) (lib.attrsets.recursiveUpdate f up) functions); + mapFeatures = features: map (fun: fun { features = features; }); + mkFeatures = feat: lib.foldl (features: featureName: + if feat.${featureName} or false then + [ featureName ] ++ features + else + features + ) [] (lib.attrNames feat); + include = includedFiles: src: builtins.filterSource (path: type: + lib.any (f: + let p = toString (src + ("/" + f)); + in + p == path || (lib.strings.hasPrefix (p + "/") path) + ) includedFiles + ) src; + exclude = excludedFiles: src: builtins.filterSource (path: type: + lib.all (f: + !lib.strings.hasPrefix (toString (src + ("/" + f))) path + ) excludedFiles + ) src; +} diff --git a/pkgs/build-support/rust/build-rust-crate/install-crate.nix b/pkgs/build-support/rust/build-rust-crate/install-crate.nix new file mode 100644 index 0000000..f4a4dcd --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/install-crate.nix @@ -0,0 +1,51 @@ +{ stdenv }: +crateName: metadata: buildTests: +if !buildTests then '' + runHook preInstall + # always create $out even if we do not have binaries. We are detecting binary targets during compilation, if those are missing there is no way to only have $lib + mkdir $out + if [[ -s target/env ]]; then + mkdir -p $lib + cp target/env $lib/env + fi + if [[ -s target/link.final ]]; then + mkdir -p $lib/lib + cp target/link.final $lib/lib/link + fi + if [[ "$(ls -A target/lib)" ]]; then + mkdir -p $lib/lib + cp -r target/lib/* $lib/lib #*/ + for library in $lib/lib/*.so $lib/lib/*.dylib; do #*/ + ln -s $library $(echo $library | sed -e "s/-${metadata}//") + done + fi + if [[ "$(ls -A target/build)" ]]; then # */ + mkdir -p $lib/lib + cp -r target/build/* $lib/lib # */ + fi + if [[ -d target/bin ]]; then + if [[ "$(ls -A target/bin)" ]]; then + mkdir -p $out/bin + cp -rP target/bin/* $out/bin # */ + fi + fi + runHook postInstall +'' else +# for tests we just put them all in the output. No execution. +'' + runHook preInstall + + mkdir -p $out/tests + if [ -e target/bin ]; then + find target/bin/ -type f -executable -exec cp {} $out/tests \; + fi + if [ -e target/lib ]; then + find target/lib/ -type f \! -name '*.rlib' \ + -a \! -name '*${stdenv.hostPlatform.extensions.sharedLibrary}' \ + -a \! -name '*.d' \ + -executable \ + -print0 | xargs --no-run-if-empty --null install --target $out/tests; + fi + + runHook postInstall +'' diff --git a/pkgs/build-support/rust/build-rust-crate/lib.sh b/pkgs/build-support/rust/build-rust-crate/lib.sh new file mode 100644 index 0000000..0181ae4 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/lib.sh @@ -0,0 +1,182 @@ +echo_build_heading() { + if (( $# == 1 )); then + echo_colored "Building $1" + else + echo_colored "Building $1 ($2)" + fi +} + +build_lib() { + lib_src=$1 + echo_build_heading $lib_src ${libName} + + noisily rustc \ + --crate-name $CRATE_NAME \ + $lib_src \ + --out-dir target/lib \ + -L dependency=target/deps \ + --cap-lints allow \ + $LINK \ + $EXTRA_LINK_ARGS \ + $EXTRA_LINK_ARGS_LIB \ + $LIB_RUSTC_OPTS \ + $BUILD_OUT_DIR \ + $EXTRA_BUILD \ + $EXTRA_FEATURES \ + $EXTRA_RUSTC_FLAGS \ + --color $colors + + EXTRA_LIB=" --extern $CRATE_NAME=target/lib/lib$CRATE_NAME-$metadata.rlib" + if [ -e target/deps/lib$CRATE_NAME-$metadata$LIB_EXT ]; then + EXTRA_LIB="$EXTRA_LIB --extern $CRATE_NAME=target/lib/lib$CRATE_NAME-$metadata$LIB_EXT" + fi +} + +build_bin() { + local crate_name=$1 + local crate_name_=$(echo $crate_name | tr '-' '_') + local main_file="" + + if [[ ! -z $2 ]]; then + main_file=$2 + fi + echo_build_heading $@ + noisily rustc \ + --crate-name $crate_name_ \ + $main_file \ + --crate-type bin \ + $BIN_RUSTC_OPTS \ + --out-dir target/bin \ + -L dependency=target/deps \ + $LINK \ + $EXTRA_LINK_ARGS \ + $EXTRA_LINK_ARGS_BINS \ + $EXTRA_LIB \ + --cap-lints allow \ + $BUILD_OUT_DIR \ + $EXTRA_BUILD \ + $EXTRA_FEATURES \ + $EXTRA_RUSTC_FLAGS \ + --color ${colors} \ + + if [ "$crate_name_" != "$crate_name" ]; then + mv target/bin/$crate_name_ target/bin/$crate_name + fi +} + +build_lib_test() { + local file="$1" + EXTRA_RUSTC_FLAGS="--test $EXTRA_RUSTC_FLAGS" build_lib "$1" "$2" +} + +build_bin_test() { + local crate="$1" + local file="$2" + EXTRA_RUSTC_FLAGS="--test $EXTRA_RUSTC_FLAGS" build_bin "$1" "$2" +} + +build_bin_test_file() { + local file="$1" + local derived_crate_name="${file//\//_}" + # Make sure to strip the top level `tests` directory: see #204051. Note that + # a forward slash has now become an underscore due to the substitution + # above. + derived_crate_name=${derived_crate_name#"tests_"} + derived_crate_name="${derived_crate_name%.rs}" + build_bin_test "$derived_crate_name" "$file" +} + +# Add additional link options that were provided by the build script. +setup_link_paths() { + EXTRA_LIB="" + if [[ -e target/link_ ]]; then + EXTRA_BUILD="$(cat target/link_) $EXTRA_BUILD" + fi + + echo "$EXTRA_LINK_SEARCH" | while read i; do + if [[ ! -z "$i" ]]; then + for library in $i; do + echo "-L $library" >> target/link + L=$(echo $library | sed -e "s#$(pwd)/target/build#$lib/lib#") + echo "-L $L" >> target/link.final + done + fi + done + echo "$EXTRA_LINK_LIBS" | while read i; do + if [[ ! -z "$i" ]]; then + for library in $i; do + echo "-l $library" >> target/link + done + fi + done + + if [[ -e target/link ]]; then + tr '\n' ' ' < target/link > target/link_ + LINK=$(cat target/link_) + fi +} + +search_for_bin_path() { + # heuristic to "guess" the correct source file as found in cargo: + # https://github.com/rust-lang/cargo/blob/90fc9f620190d5fa3c80b0c8c65a1e1361e6b8ae/src/cargo/util/toml/targets.rs#L308-L325 + + BIN_NAME=$1 + BIN_NAME_=$(echo $BIN_NAME | tr '-' '_') + + # the first two cases are the "new" default IIRC + FILES=( "src/bin/$BIN_NAME.rs" "src/bin/$BIN_NAME/main.rs" "src/bin/$BIN_NAME_.rs" "src/bin/$BIN_NAME_/main.rs" "src/bin/main.rs" "src/main.rs" ) + + if ! [ -e "$LIB_PATH" -o -e src/lib.rs -o -e "src/$LIB_NAME.rs" ]; then + # if this is not a library the following path is also valid + FILES=( "src/$BIN_NAME.rs" "src/$BIN_NAME_.rs" "${FILES[@]}" ) + fi + + for file in "${FILES[@]}"; + do + echo "checking file $file" + # first file that exists wins + if [[ -e "$file" ]]; then + BIN_PATH="$file" + break + fi + done + + if [[ -z "$BIN_PATH" ]]; then + echo_error "ERROR: failed to find file for binary target: $BIN_NAME" >&2 + exit 1 + fi +} + +# Extracts cargo_toml_path of the matching crate. +matching_cargo_toml_path() { + local manifest_path="$1" + local expected_crate_name="$2" + + # If the Cargo.toml is not a workspace root, + # it will only contain one package in ".packages" + # because "--no-deps" suppressed dependency resolution. + # + # But to make it more general, we search for a matching + # crate in all packages and use the manifest path that + # is referenced there. + cargo metadata --no-deps --format-version 1 \ + --manifest-path "$manifest_path" \ + | jq -r '.packages[] + | select( .name == "'$expected_crate_name'") + | .manifest_path' +} + +# Find a Cargo.toml in the current or any sub directory +# with a matching crate name. +matching_cargo_toml_dir() { + local expected_crate_name="$1" + + find -L -name Cargo.toml | sort | while read manifest_path; do + echo "...checking manifest_path $manifest_path" >&2 + local matching_path="$(matching_cargo_toml_path "$manifest_path" "$expected_crate_name")" + if [ -n "${matching_path}" ]; then + echo "$(dirname $matching_path)" + break + fi + done +} diff --git a/pkgs/build-support/rust/build-rust-crate/log.nix b/pkgs/build-support/rust/build-rust-crate/log.nix new file mode 100644 index 0000000..9054815 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/log.nix @@ -0,0 +1,59 @@ +{ lib }: + +let echo_colored_body = start_escape: + # Body of a function that behaves like "echo" but + # has the output colored by the given start_escape + # sequence. E.g. + # + # * echo_x "Building ..." + # * echo_x -n "Running " + # + # This is more complicated than apparent at first sight + # because: + # * The color markers and the text must be print + # in the same echo statement. Otherise, other + # intermingled text from concurrent builds will + # be colored as well. + # * We need to preserve the trailing newline of the + # echo if and only if it is present. Bash likes + # to strip those if we capture the output of echo + # in a variable. + # * Leading "-" will be interpreted by test as an + # option for itself. Therefore, we prefix it with + # an x in `[[ "x$1" =~ ^x- ]]`. + '' + local echo_args=""; + while [[ "x$1" =~ ^x- ]]; do + echo_args+=" $1" + shift + done + + local start_escape="$(printf '${start_escape}')" + local reset="$(printf '\033[0m')" + echo $echo_args $start_escape"$@"$reset + ''; + echo_conditional_colored_body = colors: start_escape: + if colors == "always" + then (echo_colored_body start_escape) + else ''echo "$@"''; +in { + echo_colored = colors: '' + echo_colored() { + ${echo_conditional_colored_body colors ''\033[0;1;32m''} + } + + echo_error() { + ${echo_conditional_colored_body colors ''\033[0;1;31m''} + } + ''; + + noisily = colors: verbose: '' + noisily() { + ${lib.optionalString verbose '' + echo_colored -n "Running " + echo $@ + ''} + $@ + } + ''; +} diff --git a/pkgs/build-support/rust/build-rust-crate/test/brotli-crates.nix b/pkgs/build-support/rust/build-rust-crate/test/brotli-crates.nix new file mode 100644 index 0000000..4831c10 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/test/brotli-crates.nix @@ -0,0 +1,95 @@ +{ lib, stdenv, buildRustCrate, fetchgit }: +let kernel = stdenv.buildPlatform.parsed.kernel.name; + abi = stdenv.buildPlatform.parsed.abi.name; + include = includedFiles: src: builtins.filterSource (path: type: + lib.lists.any (f: + let p = toString (src + ("/" + f)); in + (path == p) || (type == "directory" && lib.strings.hasPrefix path p) + ) includedFiles + ) src; + updateFeatures = f: up: functions: builtins.deepSeq f (lib.lists.foldl' (features: fun: fun features) (lib.attrsets.recursiveUpdate f up) functions); + mapFeatures = features: map (fun: fun { features = features; }); + mkFeatures = feat: lib.lists.foldl (features: featureName: + if feat.${featureName} or false then + [ featureName ] ++ features + else + features + ) [] (builtins.attrNames feat); +in +rec { + alloc_no_stdlib_1_3_0_ = { dependencies?[], buildDependencies?[], features?[] }: buildRustCrate { + crateName = "alloc-no-stdlib"; + version = "1.3.0"; + authors = [ "Daniel Reiter Horn " ]; + sha256 = "1jcp27pzmqdszgp80y484g4kwbjbg7x8a589drcwbxg0i8xwkir9"; + crateBin = [ { name = "example"; } ]; + inherit dependencies buildDependencies features; + }; + brotli_2_5_0_ = { dependencies?[], buildDependencies?[], features?[] }: buildRustCrate { + crateName = "brotli"; + version = "2.5.0"; + authors = [ "Daniel Reiter Horn " "The Brotli Authors" ]; + sha256 = "1ynw4hkdwnp0kj30p86ls44ahv4s99258s019bqrq4mya8hlsb5b"; + crateBin = [ { name = "brotli"; } ]; + inherit dependencies buildDependencies features; + }; + brotli_decompressor_1_3_1_ = { dependencies?[], buildDependencies?[], features?[] }: buildRustCrate { + crateName = "brotli-decompressor"; + version = "1.3.1"; + authors = [ "Daniel Reiter Horn " "The Brotli Authors" ]; + sha256 = "022g69q1xzwdj0130qm3fa4qwpn4q1jx3lc8yz0v0v201p7bm8fb"; + crateBin = [ { name = "brotli-decompressor"; } ]; + inherit dependencies buildDependencies features; + }; + alloc_no_stdlib_1_3_0 = { features?(alloc_no_stdlib_1_3_0_features {}) }: alloc_no_stdlib_1_3_0_ { + features = mkFeatures (features.alloc_no_stdlib_1_3_0 or {}); + }; + alloc_no_stdlib_1_3_0_features = f: updateFeatures f ({ + alloc_no_stdlib_1_3_0.default = (f.alloc_no_stdlib_1_3_0.default or true); + }) []; + brotli_2_5_0 = { features?(brotli_2_5_0_features {}) }: brotli_2_5_0_ { + dependencies = mapFeatures features ([ alloc_no_stdlib_1_3_0 brotli_decompressor_1_3_1 ]); + features = mkFeatures (features.brotli_2_5_0 or {}); + }; + brotli_2_5_0_features = f: updateFeatures f (rec { + alloc_no_stdlib_1_3_0.no-stdlib = + (f.alloc_no_stdlib_1_3_0.no-stdlib or false) || + (brotli_2_5_0.no-stdlib or false) || + (f.brotli_2_5_0.no-stdlib or false); + alloc_no_stdlib_1_3_0.default = true; + brotli_2_5_0.default = (f.brotli_2_5_0.default or true); + brotli_decompressor_1_3_1.disable-timer = + (f.brotli_decompressor_1_3_1.disable-timer or false) || + (brotli_2_5_0.disable-timer or false) || + (f.brotli_2_5_0.disable-timer or false); + brotli_decompressor_1_3_1.no-stdlib = + (f.brotli_decompressor_1_3_1.no-stdlib or false) || + (brotli_2_5_0.no-stdlib or false) || + (f.brotli_2_5_0.no-stdlib or false); + brotli_decompressor_1_3_1.benchmark = + (f.brotli_decompressor_1_3_1.benchmark or false) || + (brotli_2_5_0.benchmark or false) || + (f.brotli_2_5_0.benchmark or false); + brotli_decompressor_1_3_1.default = true; + brotli_decompressor_1_3_1.seccomp = + (f.brotli_decompressor_1_3_1.seccomp or false) || + (brotli_2_5_0.seccomp or false) || + (f.brotli_2_5_0.seccomp or false); + }) [ alloc_no_stdlib_1_3_0_features brotli_decompressor_1_3_1_features ]; + brotli_decompressor_1_3_1 = { features?(brotli_decompressor_1_3_1_features {}) }: brotli_decompressor_1_3_1_ { + dependencies = mapFeatures features ([ alloc_no_stdlib_1_3_0 ]); + features = mkFeatures (features.brotli_decompressor_1_3_1 or {}); + }; + brotli_decompressor_1_3_1_features = f: updateFeatures f (rec { + alloc_no_stdlib_1_3_0.no-stdlib = + (f.alloc_no_stdlib_1_3_0.no-stdlib or false) || + (brotli_decompressor_1_3_1.no-stdlib or false) || + (f.brotli_decompressor_1_3_1.no-stdlib or false); + alloc_no_stdlib_1_3_0.default = true; + alloc_no_stdlib_1_3_0.unsafe = + (f.alloc_no_stdlib_1_3_0.unsafe or false) || + (brotli_decompressor_1_3_1.unsafe or false) || + (f.brotli_decompressor_1_3_1.unsafe or false); + brotli_decompressor_1_3_1.default = (f.brotli_decompressor_1_3_1.default or true); + }) [ alloc_no_stdlib_1_3_0_features ]; +} diff --git a/pkgs/build-support/rust/build-rust-crate/test/default.nix b/pkgs/build-support/rust/build-rust-crate/test/default.nix new file mode 100644 index 0000000..1ecef4c --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/test/default.nix @@ -0,0 +1,671 @@ +{ lib +, buildPackages +, buildRustCrate +, callPackage +, releaseTools +, runCommand +, runCommandCC +, stdenv +, symlinkJoin +, writeTextFile +}: + +let + mkCrate = buildRustCrate: args: let + p = { + crateName = "nixtestcrate"; + version = "0.1.0"; + authors = [ "Test " ]; + } // args; + in buildRustCrate p; + mkHostCrate = mkCrate buildRustCrate; + + mkCargoToml = + { name, crateVersion ? "0.1.0", path ? "Cargo.toml" }: + mkFile path '' + [package] + name = ${builtins.toJSON name} + version = ${builtins.toJSON crateVersion} + ''; + + mkFile = destination: text: writeTextFile { + name = "src"; + destination = "/${destination}"; + inherit text; + }; + + mkBin = name: mkFile name '' + use std::env; + fn main() { + let name: String = env::args().nth(0).unwrap(); + println!("executed {}", name); + } + ''; + + mkBinExtern = name: extern: mkFile name '' + extern crate ${extern}; + fn main() { + assert_eq!(${extern}::test(), 23); + } + ''; + + mkTestFile = name: functionName: mkFile name '' + #[cfg(test)] + #[test] + fn ${functionName}() { + assert!(true); + } + ''; + mkTestFileWithMain = name: functionName: mkFile name '' + #[cfg(test)] + #[test] + fn ${functionName}() { + assert!(true); + } + + fn main() {} + ''; + + + mkLib = name: mkFile name "pub fn test() -> i32 { return 23; }"; + + mkTest = crateArgs: let + crate = mkHostCrate (builtins.removeAttrs crateArgs ["expectedTestOutput"]); + hasTests = crateArgs.buildTests or false; + expectedTestOutputs = crateArgs.expectedTestOutputs or null; + binaries = map (v: lib.escapeShellArg v.name) (crateArgs.crateBin or []); + isLib = crateArgs ? libName || crateArgs ? libPath; + crateName = crateArgs.crateName or "nixtestcrate"; + libName = crateArgs.libName or crateName; + + libTestBinary = if !isLib then null else mkHostCrate { + crateName = "run-test-${crateName}"; + dependencies = [ crate ]; + src = mkBinExtern "src/main.rs" libName; + }; + + in + assert expectedTestOutputs != null -> hasTests; + assert hasTests -> expectedTestOutputs != null; + + runCommand "run-buildRustCrate-${crateName}-test" { + nativeBuildInputs = [ crate ]; + } (if !hasTests then '' + ${lib.concatMapStringsSep "\n" (binary: + # Can't actually run the binary when cross-compiling + (lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) "type ") + binary + ) binaries} + ${lib.optionalString isLib '' + test -e ${crate}/lib/*.rlib || exit 1 + ${lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) "test -x "} \ + ${libTestBinary}/bin/run-test-${crateName} + ''} + touch $out + '' else if stdenv.hostPlatform == stdenv.buildPlatform then '' + for file in ${crate}/tests/*; do + $file 2>&1 >> $out + done + set -e + ${lib.concatMapStringsSep "\n" (o: "grep '${o}' $out || { echo 'output \"${o}\" not found in:'; cat $out; exit 23; }") expectedTestOutputs} + '' else '' + for file in ${crate}/tests/*; do + test -x "$file" + done + touch "$out" + '' + ); + + /* Returns a derivation that asserts that the crate specified by `crateArgs` + has the specified files as output. + + `name` is used as part of the derivation name that performs the checking. + + `crateArgs` is passed to `mkHostCrate` to build the crate with `buildRustCrate`. + + `expectedFiles` contains a list of expected file paths in the output. E.g. + `[ "./bin/my_binary" ]`. + + `output` specifies the name of the output to use. By default, the default + output is used but e.g. `output = "lib";` will cause the lib output + to be checked instead. You do not need to specify any directories. + */ + assertOutputs = { name, crateArgs, expectedFiles, output? null }: + assert (builtins.isString name); + assert (builtins.isAttrs crateArgs); + assert (builtins.isList expectedFiles); + + let + crate = mkHostCrate (builtins.removeAttrs crateArgs ["expectedTestOutput"]); + crateOutput = if output == null then crate else crate."${output}"; + expectedFilesFile = writeTextFile { + name = "expected-files-${name}"; + text = + let sorted = builtins.sort (a: b: a "$actualFiles" + diff -q ${expectedFilesFile} "$actualFiles" > /dev/null || { + echo -e "\033[0;1;31mERROR: Difference in expected output files in ${crateOutput} \033[0m" >&2 + echo === Got: + sed -e 's/^/ /' $actualFiles + echo === Expected: + sed -e 's/^/ /' ${expectedFilesFile} + echo === Diff: + diff -u ${expectedFilesFile} $actualFiles |\ + tail -n +3 |\ + sed -e 's/^/ /' + exit 1 + } + touch $out + '') + ; + + in rec { + + tests = let + cases = rec { + libPath = { libPath = "src/my_lib.rs"; src = mkLib "src/my_lib.rs"; }; + srcLib = { src = mkLib "src/lib.rs"; }; + + # This used to be supported by cargo but as of 1.40.0 I can't make it work like that with just cargo anymore. + # This might be a regression or deprecated thing they finally removed… + # customLibName = { libName = "test_lib"; src = mkLib "src/test_lib.rs"; }; + # rustLibTestsCustomLibName = { + # libName = "test_lib"; + # src = mkTestFile "src/test_lib.rs" "foo"; + # buildTests = true; + # expectedTestOutputs = [ "test foo ... ok" ]; + # }; + + customLibNameAndLibPath = { libName = "test_lib"; libPath = "src/best-lib.rs"; src = mkLib "src/best-lib.rs"; }; + crateBinWithPath = { crateBin = [{ name = "test_binary1"; path = "src/foobar.rs"; }]; src = mkBin "src/foobar.rs"; }; + crateBinNoPath1 = { crateBin = [{ name = "my-binary2"; }]; src = mkBin "src/my_binary2.rs"; }; + crateBinNoPath2 = { + crateBin = [{ name = "my-binary3"; } { name = "my-binary4"; }]; + src = symlinkJoin { + name = "buildRustCrateMultipleBinariesCase"; + paths = [ (mkBin "src/bin/my_binary3.rs") (mkBin "src/bin/my_binary4.rs") ]; + }; + }; + crateBinNoPath3 = { crateBin = [{ name = "my-binary5"; }]; src = mkBin "src/bin/main.rs"; }; + crateBinNoPath4 = { crateBin = [{ name = "my-binary6"; }]; src = mkBin "src/main.rs";}; + crateBinRename1 = { + crateBin = [{ name = "my-binary-rename1"; }]; + src = mkBinExtern "src/main.rs" "foo_renamed"; + dependencies = [ (mkHostCrate { crateName = "foo"; src = mkLib "src/lib.rs"; }) ]; + crateRenames = { "foo" = "foo_renamed"; }; + }; + crateBinRename2 = { + crateBin = [{ name = "my-binary-rename2"; }]; + src = mkBinExtern "src/main.rs" "foo_renamed"; + dependencies = [ (mkHostCrate { crateName = "foo"; libName = "foolib"; src = mkLib "src/lib.rs"; }) ]; + crateRenames = { "foo" = "foo_renamed"; }; + }; + crateBinRenameMultiVersion = let + crateWithVersion = version: mkHostCrate { + crateName = "my_lib"; + inherit version; + src = mkFile "src/lib.rs" '' + pub const version: &str = "${version}"; + ''; + }; + depCrate01 = crateWithVersion "0.1.2"; + depCrate02 = crateWithVersion "0.2.1"; + in { + crateName = "my_bin"; + src = symlinkJoin { + name = "my_bin_src"; + paths = [ + (mkFile "src/main.rs" '' + #[test] + fn my_lib_01() { assert_eq!(lib01::version, "0.1.2"); } + + #[test] + fn my_lib_02() { assert_eq!(lib02::version, "0.2.1"); } + + fn main() { } + '') + ]; + }; + dependencies = [ depCrate01 depCrate02 ]; + crateRenames = { + "my_lib" = [ + { + version = "0.1.2"; + rename = "lib01"; + } + { + version = "0.2.1"; + rename = "lib02"; + } + ]; + }; + buildTests = true; + expectedTestOutputs = [ + "test my_lib_01 ... ok" + "test my_lib_02 ... ok" + ]; + }; + rustLibTestsDefault = { + src = mkTestFile "src/lib.rs" "baz"; + buildTests = true; + expectedTestOutputs = [ "test baz ... ok" ]; + }; + rustLibTestsCustomLibPath = { + libPath = "src/test_path.rs"; + src = mkTestFile "src/test_path.rs" "bar"; + buildTests = true; + expectedTestOutputs = [ "test bar ... ok" ]; + }; + rustLibTestsCustomLibPathWithTests = { + libPath = "src/test_path.rs"; + src = symlinkJoin { + name = "rust-lib-tests-custom-lib-path-with-tests-dir"; + paths = [ + (mkTestFile "src/test_path.rs" "bar") + (mkTestFile "tests/something.rs" "something") + ]; + }; + buildTests = true; + expectedTestOutputs = [ + "test bar ... ok" + "test something ... ok" + ]; + }; + rustBinTestsCombined = { + src = symlinkJoin { + name = "rust-bin-tests-combined"; + paths = [ + (mkTestFileWithMain "src/main.rs" "src_main") + (mkTestFile "tests/foo.rs" "tests_foo") + (mkTestFile "tests/bar.rs" "tests_bar") + ]; + }; + buildTests = true; + expectedTestOutputs = [ + "test src_main ... ok" + "test tests_foo ... ok" + "test tests_bar ... ok" + ]; + }; + rustBinTestsSubdirCombined = { + src = symlinkJoin { + name = "rust-bin-tests-subdir-combined"; + paths = [ + (mkTestFileWithMain "src/main.rs" "src_main") + (mkTestFile "tests/foo/main.rs" "tests_foo") + (mkTestFile "tests/bar/main.rs" "tests_bar") + ]; + }; + buildTests = true; + expectedTestOutputs = [ + "test src_main ... ok" + "test tests_foo ... ok" + "test tests_bar ... ok" + ]; + }; + linkAgainstRlibCrate = { + crateName = "foo"; + src = mkFile "src/main.rs" '' + extern crate somerlib; + fn main() {} + ''; + dependencies = [ + (mkHostCrate { + crateName = "somerlib"; + type = [ "rlib" ]; + src = mkLib "src/lib.rs"; + }) + ]; + }; + buildScriptDeps = let + depCrate = buildRustCrate: boolVal: mkCrate buildRustCrate { + crateName = "bar"; + src = mkFile "src/lib.rs" '' + pub const baz: bool = ${boolVal}; + ''; + }; + in { + crateName = "foo"; + src = symlinkJoin { + name = "build-script-and-main"; + paths = [ + (mkFile "src/main.rs" '' + extern crate bar; + #[cfg(test)] + #[test] + fn baz_false() { assert!(!bar::baz); } + fn main() { } + '') + (mkFile "build.rs" '' + extern crate bar; + fn main() { assert!(bar::baz); } + '') + ]; + }; + buildDependencies = [ (depCrate buildPackages.buildRustCrate "true") ]; + dependencies = [ (depCrate buildRustCrate "false") ]; + buildTests = true; + expectedTestOutputs = [ "test baz_false ... ok" ]; + }; + buildScriptFeatureEnv = { + crateName = "build-script-feature-env"; + features = [ "some-feature" "crate/another_feature" ]; + src = symlinkJoin { + name = "build-script-feature-env"; + paths = [ + (mkFile "src/main.rs" '' + #[cfg(test)] + #[test] + fn feature_not_visible() { + assert!(std::env::var("CARGO_FEATURE_SOME_FEATURE").is_err()); + assert!(option_env!("CARGO_FEATURE_SOME_FEATURE").is_none()); + } + fn main() {} + '') + (mkFile "build.rs" '' + fn main() { + assert!(std::env::var("CARGO_FEATURE_SOME_FEATURE").is_ok()); + assert!(option_env!("CARGO_FEATURE_SOME_FEATURE").is_none()); + } + '') + ]; + }; + buildTests = true; + expectedTestOutputs = [ "test feature_not_visible ... ok" ]; + }; + # Regression test for https://github.com/NixOS/nixpkgs/pull/88054 + # Build script output should be rewritten as valid env vars. + buildScriptIncludeDirDeps = let + depCrate = mkHostCrate { + crateName = "bar"; + src = symlinkJoin { + name = "build-script-and-include-dir-bar"; + paths = [ + (mkFile "src/lib.rs" '' + fn main() { } + '') + (mkFile "build.rs" '' + use std::path::PathBuf; + fn main() { println!("cargo:include-dir={}/src", std::env::current_dir().unwrap_or(PathBuf::from(".")).to_str().unwrap()); } + '') + ]; + }; + }; + in { + crateName = "foo"; + src = symlinkJoin { + name = "build-script-and-include-dir-foo"; + paths = [ + (mkFile "src/main.rs" '' + fn main() { } + '') + (mkFile "build.rs" '' + fn main() { assert!(std::env::var_os("DEP_BAR_INCLUDE_DIR").is_some()); } + '') + ]; + }; + buildDependencies = [ depCrate ]; + dependencies = [ depCrate ]; + }; + # Regression test for https://github.com/NixOS/nixpkgs/issues/74071 + # Whenevever a build.rs file is generating files those should not be overlayed onto the actual source dir + buildRsOutDirOverlay = { + src = symlinkJoin { + name = "buildrs-out-dir-overlay"; + paths = [ + (mkLib "src/lib.rs") + (mkFile "build.rs" '' + use std::env; + use std::ffi::OsString; + use std::fs; + use std::path::Path; + fn main() { + let out_dir = env::var_os("OUT_DIR").expect("OUT_DIR not set"); + let out_file = Path::new(&out_dir).join("lib.rs"); + fs::write(out_file, "invalid rust code!").expect("failed to write lib.rs"); + } + '') + ]; + }; + }; + # Regression test for https://github.com/NixOS/nixpkgs/pull/83379 + # link flag order should be preserved + linkOrder = { + src = symlinkJoin { + name = "buildrs-out-dir-overlay"; + paths = [ + (mkFile "build.rs" '' + fn main() { + // in the other order, linkage will fail + println!("cargo:rustc-link-lib=b"); + println!("cargo:rustc-link-lib=a"); + } + '') + (mkFile "src/main.rs" '' + extern "C" { + fn hello_world(); + } + fn main() { + unsafe { + hello_world(); + } + } + '') + ]; + }; + buildInputs = let + compile = name: text: let + src = writeTextFile { + name = "${name}-src.c"; + inherit text; + }; + in runCommandCC name {} '' + mkdir -p $out/lib + # Note: On darwin (which defaults to clang) we have to add + # `-undefined dynamic_lookup` as otherwise the compilation fails. + $CC -shared \ + ${lib.optionalString stdenv.isDarwin "-undefined dynamic_lookup"} \ + -o $out/lib/${name}${stdenv.hostPlatform.extensions.sharedLibrary} ${src} + ''; + b = compile "libb" '' + #include + + void hello(); + + void hello_world() { + hello(); + printf(" world!\n"); + } + ''; + a = compile "liba" '' + #include + + void hello() { + printf("hello"); + } + ''; + in [ a b ]; + }; + rustCargoTomlInSubDir = { + # The "workspace_member" can be set to the sub directory with the crate to build. + # By default ".", meaning the top level directory is assumed. + # Using null will trigger a search. + workspace_member = null; + src = symlinkJoin rec { + name = "find-cargo-toml"; + paths = [ + (mkCargoToml { name = "ignoreMe"; }) + (mkTestFileWithMain "src/main.rs" "ignore_main") + + (mkCargoToml { name = "rustCargoTomlInSubDir"; path = "subdir/Cargo.toml"; }) + (mkTestFileWithMain "subdir/src/main.rs" "src_main") + (mkTestFile "subdir/tests/foo/main.rs" "tests_foo") + (mkTestFile "subdir/tests/bar/main.rs" "tests_bar") + ]; + }; + buildTests = true; + expectedTestOutputs = [ + "test src_main ... ok" + "test tests_foo ... ok" + "test tests_bar ... ok" + ]; + }; + + rustCargoTomlInTopDir = + let + withoutCargoTomlSearch = builtins.removeAttrs rustCargoTomlInSubDir [ "workspace_member" ]; + in + withoutCargoTomlSearch // { + expectedTestOutputs = [ + "test ignore_main ... ok" + ]; + }; + procMacroInPrelude = { + procMacro = true; + edition = "2018"; + src = symlinkJoin { + name = "proc-macro-in-prelude"; + paths = [ + (mkFile "src/lib.rs" '' + use proc_macro::TokenTree; + '') + ]; + }; + }; + }; + brotliCrates = (callPackage ./brotli-crates.nix {}); + rcgenCrates = callPackage ./rcgen-crates.nix { + # Suppress deprecation warning + buildRustCrate = null; + }; + tests = lib.mapAttrs (key: value: mkTest (value // lib.optionalAttrs (!value?crateName) { crateName = key; })) cases; + in tests // rec { + + crateBinWithPathOutputs = assertOutputs { + name="crateBinWithPath"; + crateArgs = { + crateBin = [{ name = "test_binary1"; path = "src/foobar.rs"; }]; + src = mkBin "src/foobar.rs"; + }; + expectedFiles = [ + "./bin/test_binary1" + ]; + }; + + crateBinWithPathOutputsDebug = assertOutputs { + name="crateBinWithPath"; + crateArgs = { + release = false; + crateBin = [{ name = "test_binary1"; path = "src/foobar.rs"; }]; + src = mkBin "src/foobar.rs"; + }; + expectedFiles = [ + "./bin/test_binary1" + ] ++ lib.optionals stdenv.isDarwin [ + # On Darwin, the debug symbols are in a separate directory. + "./bin/test_binary1.dSYM/Contents/Info.plist" + "./bin/test_binary1.dSYM/Contents/Resources/DWARF/test_binary1" + ]; + }; + + crateBinNoPath1Outputs = assertOutputs { + name="crateBinNoPath1"; + crateArgs = { + crateBin = [{ name = "my-binary2"; }]; + src = mkBin "src/my_binary2.rs"; + }; + expectedFiles = [ + "./bin/my-binary2" + ]; + }; + + crateLibOutputs = assertOutputs { + name="crateLib"; + output="lib"; + crateArgs = { + libName = "test_lib"; + type = [ "rlib" ]; + libPath = "src/lib.rs"; + src = mkLib "src/lib.rs"; + }; + expectedFiles = [ + "./nix-support/propagated-build-inputs" + "./lib/libtest_lib-HASH.rlib" + "./lib/link" + ]; + }; + + crateLibOutputsDebug = assertOutputs { + name="crateLib"; + output="lib"; + crateArgs = { + release = false; + libName = "test_lib"; + type = [ "rlib" ]; + libPath = "src/lib.rs"; + src = mkLib "src/lib.rs"; + }; + expectedFiles = [ + "./nix-support/propagated-build-inputs" + "./lib/libtest_lib-HASH.rlib" + "./lib/link" + ]; + }; + + brotliTest = let + pkg = brotliCrates.brotli_2_5_0 {}; + in runCommand "run-brotli-test-cmd" { + nativeBuildInputs = [ pkg ]; + } (if stdenv.hostPlatform == stdenv.buildPlatform then '' + ${pkg}/bin/brotli -c ${pkg}/bin/brotli > /dev/null && touch $out + '' else '' + test -x '${pkg}/bin/brotli' && touch $out + ''); + allocNoStdLibTest = let + pkg = brotliCrates.alloc_no_stdlib_1_3_0 {}; + in runCommand "run-alloc-no-stdlib-test-cmd" { + nativeBuildInputs = [ pkg ]; + } '' + test -e ${pkg}/bin/example && touch $out + ''; + brotliDecompressorTest = let + pkg = brotliCrates.brotli_decompressor_1_3_1 {}; + in runCommand "run-brotli-decompressor-test-cmd" { + nativeBuildInputs = [ pkg ]; + } '' + test -e ${pkg}/bin/brotli-decompressor && touch $out + ''; + + rcgenTest = let + pkg = rcgenCrates.rootCrate.build; + in runCommand "run-rcgen-test-cmd" { + nativeBuildInputs = [ pkg ]; + } (if stdenv.hostPlatform == stdenv.buildPlatform then '' + ${pkg}/bin/rcgen && touch $out + '' else '' + test -x '${pkg}/bin/rcgen' && touch $out + ''); + }; + test = releaseTools.aggregate { + name = "buildRustCrate-tests"; + meta = { + description = "Test cases for buildRustCrate"; + maintainers = [ ]; + }; + constituents = builtins.attrValues tests; + }; +} diff --git a/pkgs/build-support/rust/build-rust-crate/test/rcgen-crates.nix b/pkgs/build-support/rust/build-rust-crate/test/rcgen-crates.nix new file mode 100644 index 0000000..ed273c0 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-crate/test/rcgen-crates.nix @@ -0,0 +1,3494 @@ + +# This file was @generated by crate2nix 0.10.0 with the command: +# "generate" +# See https://github.com/kolloch/crate2nix for more info. + +{ nixpkgs ? +, pkgs ? import nixpkgs { config = {}; } +, lib ? pkgs.lib +, stdenv ? pkgs.stdenv +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "crate2nix: Passing `buildRustCrate` as argument to Cargo.nix is deprecated. If you don't customize `buildRustCrate`, replace `callPackage ./Cargo.nix {}` by `import ./Cargo.nix { inherit pkgs; }`, and if you need to customize `buildRustCrate`, use `buildRustCrateForPkgs` instead." (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null + # This is used as the `crateOverrides` argument for `buildRustCrate`. +, defaultCrateOverrides ? pkgs.defaultCrateOverrides + # The features to enable for the root_crate or the workspace_members. +, rootFeatures ? [ "default" ] + # If true, throw errors instead of issueing deprecation warnings. +, strictDeprecation ? false + # Used for conditional compilation based on CPU feature detection. +, targetFeatures ? [] + # Whether to perform release builds: longer compile times, faster binaries. +, release ? true + # Additional crate2nix configuration if it exists. +, crateConfig + ? lib.optionalAttrs (builtins.pathExists ./crate-config.nix) (pkgs.callPackage ./crate-config.nix {}) +}: + +rec { + # + # "public" attributes that we attempt to keep stable with new versions of crate2nix. + # + + rootCrate = rec { + packageId = "rcgen"; + + # Use this attribute to refer to the derivation building your root crate package. + # You can override the features with rootCrate.build.override { features = [ "default" "feature1" ... ]; }. + build = internal.buildRustCrateWithFeatures { + inherit packageId; + }; + + # Debug support which might change between releases. + # File a bug if you depend on any for non-debug work! + debug = internal.debugCrate { inherit packageId; }; + }; + # Refer your crate build derivation by name here. + # You can override the features with + # workspaceMembers."${crateName}".build.override { features = [ "default" "feature1" ... ]; }. + workspaceMembers = { + "rcgen" = rec { + packageId = "rcgen"; + build = internal.buildRustCrateWithFeatures { + packageId = "rcgen"; + }; + + # Debug support which might change between releases. + # File a bug if you depend on any for non-debug work! + debug = internal.debugCrate { inherit packageId; }; + }; + }; + + # A derivation that joins the outputs of all workspace members together. + allWorkspaceMembers = pkgs.symlinkJoin { + name = "all-workspace-members"; + paths = + let members = builtins.attrValues workspaceMembers; + in builtins.map (m: m.build) members; + }; + + # + # "internal" ("private") attributes that may change in every new version of crate2nix. + # + + internal = rec { + # Build and dependency information for crates. + # Many of the fields are passed one-to-one to buildRustCrate. + # + # Noteworthy: + # * `dependencies`/`buildDependencies`: similar to the corresponding fields for buildRustCrate. + # but with additional information which is used during dependency/feature resolution. + # * `resolvedDependencies`: the selected default features reported by cargo - only included for debugging. + # * `devDependencies` as of now not used by `buildRustCrate` but used to + # inject test dependencies into the build + + crates = { + "asn1-rs" = rec { + crateName = "asn1-rs"; + version = "0.3.1"; + edition = "2018"; + sha256 = "0czsk1nd4dx2k83f7jzkn8klx05wbmblkx1jh51i4c170akhbzrh"; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "asn1-rs-derive"; + packageId = "asn1-rs-derive"; + } + { + name = "asn1-rs-impl"; + packageId = "asn1-rs-impl"; + } + { + name = "displaydoc"; + packageId = "displaydoc"; + } + { + name = "nom"; + packageId = "nom"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "num-traits"; + packageId = "num-traits"; + } + { + name = "rusticata-macros"; + packageId = "rusticata-macros"; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + { + name = "time"; + packageId = "time"; + optional = true; + features = [ "macros" "parsing" "formatting" ]; + } + ]; + features = { + "bigint" = [ "num-bigint" ]; + "bits" = [ "bitvec" ]; + "bitvec" = [ "dep:bitvec" ]; + "cookie-factory" = [ "dep:cookie-factory" ]; + "datetime" = [ "time" ]; + "default" = [ "std" ]; + "num-bigint" = [ "dep:num-bigint" ]; + "serialize" = [ "cookie-factory" ]; + "time" = [ "dep:time" ]; + }; + resolvedDefaultFeatures = [ "datetime" "default" "std" "time" ]; + }; + "asn1-rs-derive" = rec { + crateName = "asn1-rs-derive"; + version = "0.1.0"; + edition = "2018"; + sha256 = "1gzf9vab06lk0zjvbr07axx64fndkng2s28bnj27fnwd548pb2yv"; + procMacro = true; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + } + { + name = "synstructure"; + packageId = "synstructure"; + } + ]; + + }; + "asn1-rs-impl" = rec { + crateName = "asn1-rs-impl"; + version = "0.1.0"; + edition = "2018"; + sha256 = "1va27bn7qxqp4wanzjlkagnynv6jnrhnwmcky2ahzb1r405p6xr7"; + procMacro = true; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + } + ]; + + }; + "autocfg 0.1.7" = rec { + crateName = "autocfg"; + version = "0.1.7"; + edition = "2015"; + sha256 = "1chwgimpx5z7xbag7krr9d8asxfqbh683qhgl9kn3hxk2l0djj8x"; + authors = [ + "Josh Stone " + ]; + + }; + "autocfg 1.0.1" = rec { + crateName = "autocfg"; + version = "1.0.1"; + edition = "2015"; + sha256 = "0jj6i9zn4gjl03kjvziqdji6rwx8ykz8zk2ngpc331z2g3fk3c6d"; + authors = [ + "Josh Stone " + ]; + + }; + "base64" = rec { + crateName = "base64"; + version = "0.13.0"; + edition = "2018"; + sha256 = "1z82g23mbzjgijkpcrilc7nljpxpvpf7zxf6iyiapkgka2ngwkch"; + authors = [ + "Alice Maz " + "Marshall Pierce " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "base64ct" = rec { + crateName = "base64ct"; + version = "1.1.1"; + edition = "2018"; + sha256 = "0p4was874qc90q2chm2i14m9mn8zmxjis8vaxihd6a2x4aqxkd76"; + authors = [ + "RustCrypto Developers" + ]; + features = { + "std" = [ "alloc" ]; + }; + }; + "bitflags" = rec { + crateName = "bitflags"; + version = "1.3.2"; + edition = "2018"; + sha256 = "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"; + authors = [ + "The Rust Project Developers" + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "botan" = rec { + crateName = "botan"; + version = "0.8.1"; + edition = "2018"; + sha256 = "08bmiyn7c3b0dgx20w6hr28d9jcq7cj78cchr84pc686sb2s41ik"; + authors = [ + "Jack Lloyd " + ]; + dependencies = [ + { + name = "botan-sys"; + packageId = "botan-sys"; + } + { + name = "cty"; + packageId = "cty"; + } + ]; + features = { + "cstr_core" = [ "dep:cstr_core" ]; + "no-std" = [ "cstr_core/alloc" ]; + "vendored" = [ "botan-sys/vendored" ]; + }; + resolvedDefaultFeatures = [ "default" "vendored" ]; + }; + "botan-src" = rec { + crateName = "botan-src"; + version = "0.21703.0"; + edition = "2018"; + sha256 = "0s2ad9q84qsrllfsbj7hjhn7gr3hab9ng6lwzwqmimia6yvja8y8"; + authors = [ + "Rodolphe Breard " + "Jack Lloyd " + ]; + + }; + "botan-sys" = rec { + crateName = "botan-sys"; + version = "0.8.1"; + edition = "2015"; + sha256 = "1m11zblxfanrhl97j7z3ap7n17rr8j0rg91sr7f9j6y2bsniaz1x"; + authors = [ + "Jack Lloyd " + ]; + dependencies = [ + { + name = "cty"; + packageId = "cty"; + } + ]; + buildDependencies = [ + { + name = "botan-src"; + packageId = "botan-src"; + optional = true; + } + ]; + features = { + "botan-src" = [ "dep:botan-src" ]; + "vendored" = [ "botan-src" ]; + }; + resolvedDefaultFeatures = [ "botan-src" "default" "vendored" ]; + }; + "bumpalo" = rec { + crateName = "bumpalo"; + version = "3.9.1"; + edition = "2018"; + sha256 = "1688dv6s0cbj72p9lmll8a02a85dzxvdw2is7pji490zmd35m954"; + authors = [ + "Nick Fitzgerald " + ]; + features = { + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "byteorder" = rec { + crateName = "byteorder"; + version = "1.4.3"; + edition = "2018"; + sha256 = "0456lv9xi1a5bcm32arknf33ikv76p3fr9yzki4lb2897p2qkh8l"; + authors = [ + "Andrew Gallant " + ]; + features = { + "default" = [ "std" ]; + }; + }; + "cc" = rec { + crateName = "cc"; + version = "1.0.72"; + edition = "2018"; + crateBin = []; + sha256 = "1vl50h2qh0nh0iddzj6gd1pnxnxpvwmbfxc30578c1pajmxi7a92"; + authors = [ + "Alex Crichton " + ]; + features = { + "jobserver" = [ "dep:jobserver" ]; + "parallel" = [ "jobserver" ]; + }; + }; + "cfg-if" = rec { + crateName = "cfg-if"; + version = "1.0.0"; + edition = "2018"; + sha256 = "1za0vb97n4brpzpv8lsbnzmq5r8f2b0cpqqr0sy8h5bn751xxwds"; + authors = [ + "Alex Crichton " + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; + }; + }; + "const-oid" = rec { + crateName = "const-oid"; + version = "0.6.2"; + edition = "2018"; + sha256 = "12vv7csqqjj0x1l5mf51lgqiw76k5c3mb1yzfhfcqysks2j2lvwx"; + authors = [ + "RustCrypto Developers" + ]; + features = { + }; + }; + "crypto-bigint" = rec { + crateName = "crypto-bigint"; + version = "0.2.11"; + edition = "2018"; + sha256 = "00qckh65nzb7s7vd60wylw6alxf9g37xh31lirb1qw0l8fxx6fzq"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "generic-array"; + packageId = "generic-array"; + optional = true; + } + { + name = "rand_core"; + packageId = "rand_core"; + optional = true; + } + { + name = "subtle"; + packageId = "subtle"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "rand" ]; + "generic-array" = [ "dep:generic-array" ]; + "rand" = [ "rand_core" ]; + "rand_core" = [ "dep:rand_core" ]; + "rlp" = [ "dep:rlp" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "default" "generic-array" "rand" "rand_core" ]; + }; + "cty" = rec { + crateName = "cty"; + version = "0.2.2"; + edition = "2015"; + sha256 = "0d8z0pbr87wgzqqb2jk5pvj0afzc6d3rb772ach6fijhg6yglrdk"; + authors = [ + "Jorge Aparicio " + ]; + + }; + "data-encoding" = rec { + crateName = "data-encoding"; + version = "2.3.2"; + edition = "2018"; + sha256 = "0mvd8bjq5mq50fcf931cff57vwmbsvs1kpxynkzrshli98y3kqiy"; + authors = [ + "Julien Cretin " + ]; + features = { + "default" = [ "std" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; + }; + "der" = rec { + crateName = "der"; + version = "0.4.5"; + edition = "2018"; + sha256 = "1x4k0jln8va1657cghl40l6p7hyvr1ixz71v9cd6imwmgp51rdvr"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "const-oid"; + packageId = "const-oid"; + optional = true; + } + { + name = "crypto-bigint"; + packageId = "crypto-bigint"; + optional = true; + features = [ "generic-array" ]; + } + ]; + features = { + "bigint" = [ "crypto-bigint" ]; + "const-oid" = [ "dep:const-oid" ]; + "crypto-bigint" = [ "dep:crypto-bigint" ]; + "der_derive" = [ "dep:der_derive" ]; + "derive" = [ "der_derive" ]; + "oid" = [ "const-oid" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "bigint" "const-oid" "crypto-bigint" "oid" "std" ]; + }; + "der-parser" = rec { + crateName = "der-parser"; + version = "7.0.0"; + edition = "2018"; + sha256 = "10kfa2gzl3x20mwgrd43cyi79xgkqxyzcyrh0xylv4apa33qlfgy"; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "asn1-rs"; + packageId = "asn1-rs"; + } + { + name = "displaydoc"; + packageId = "displaydoc"; + usesDefaultFeatures = false; + } + { + name = "nom"; + packageId = "nom"; + } + { + name = "num-bigint"; + packageId = "num-bigint"; + optional = true; + } + { + name = "num-traits"; + packageId = "num-traits"; + } + { + name = "rusticata-macros"; + packageId = "rusticata-macros"; + } + ]; + features = { + "bigint" = [ "num-bigint" ]; + "cookie-factory" = [ "dep:cookie-factory" ]; + "default" = [ "std" ]; + "num-bigint" = [ "dep:num-bigint" ]; + "serialize" = [ "std" "cookie-factory" ]; + }; + resolvedDefaultFeatures = [ "bigint" "default" "num-bigint" "std" ]; + }; + "digest" = rec { + crateName = "digest"; + version = "0.9.0"; + edition = "2018"; + sha256 = "0rmhvk33rgvd6ll71z8sng91a52rw14p0drjn1da0mqa138n1pfk"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "generic-array"; + packageId = "generic-array"; + } + ]; + features = { + "blobby" = [ "dep:blobby" ]; + "dev" = [ "blobby" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "std" ]; + }; + "displaydoc" = rec { + crateName = "displaydoc"; + version = "0.2.3"; + edition = "2018"; + sha256 = "11i8p5snlc1hs4g5q3wiyr75dn276l6kr0si5m7xmfa6y31mvy9v"; + procMacro = true; + authors = [ + "Jane Lusby " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + } + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "foreign-types" = rec { + crateName = "foreign-types"; + version = "0.3.2"; + edition = "2015"; + sha256 = "1cgk0vyd7r45cj769jym4a6s7vwshvd0z4bqrb92q1fwibmkkwzn"; + authors = [ + "Steven Fackler " + ]; + dependencies = [ + { + name = "foreign-types-shared"; + packageId = "foreign-types-shared"; + } + ]; + + }; + "foreign-types-shared" = rec { + crateName = "foreign-types-shared"; + version = "0.1.1"; + edition = "2015"; + sha256 = "0jxgzd04ra4imjv8jgkmdq59kj8fsz6w4zxsbmlai34h26225c00"; + authors = [ + "Steven Fackler " + ]; + + }; + "generic-array" = rec { + crateName = "generic-array"; + version = "0.14.5"; + edition = "2015"; + sha256 = "00qqhls43bzvyb7s26iw6knvsz3mckbxl3rhaahvypzhqwzd6j7x"; + libName = "generic_array"; + authors = [ + "Bartłomiej Kamiński " + "Aaron Trent " + ]; + dependencies = [ + { + name = "typenum"; + packageId = "typenum"; + } + ]; + buildDependencies = [ + { + name = "version_check"; + packageId = "version_check"; + } + ]; + features = { + "serde" = [ "dep:serde" ]; + }; + }; + "getrandom" = rec { + crateName = "getrandom"; + version = "0.2.4"; + edition = "2018"; + sha256 = "0k0bdr1dyf4n9fvnkx4fmwxhv4hgnyf55gj86v4m69fln743g3a1"; + authors = [ + "The Rand Project Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "libc"; + packageId = "libc"; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + } + { + name = "wasi"; + packageId = "wasi"; + target = { target, features }: (target."os" == "wasi"); + } + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "js" = [ "wasm-bindgen" "js-sys" ]; + "js-sys" = [ "dep:js-sys" ]; + "rustc-dep-of-std" = [ "compiler_builtins" "core" "libc/rustc-dep-of-std" "wasi/rustc-dep-of-std" ]; + "wasm-bindgen" = [ "dep:wasm-bindgen" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "itoa" = rec { + crateName = "itoa"; + version = "1.0.1"; + edition = "2018"; + sha256 = "0d8wr2qf5b25a04xf10rz9r0pdbjdgb0zaw3xvf8k2sqcz1qzaqs"; + authors = [ + "David Tolnay " + ]; + + }; + "js-sys" = rec { + crateName = "js-sys"; + version = "0.3.56"; + edition = "2018"; + sha256 = "010g8jkj5avy3xd77i3cprjzzpfa6z9z2ay0fkllqmpx617c53x3"; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + } + ]; + + }; + "lazy_static" = rec { + crateName = "lazy_static"; + version = "1.4.0"; + edition = "2015"; + sha256 = "0in6ikhw8mgl33wjv6q6xfrb5b9jr16q8ygjy803fay4zcisvaz2"; + authors = [ + "Marvin Löbel " + ]; + dependencies = [ + { + name = "spin"; + packageId = "spin"; + optional = true; + } + ]; + features = { + "spin" = [ "dep:spin" ]; + "spin_no_std" = [ "spin" ]; + }; + resolvedDefaultFeatures = [ "spin" "spin_no_std" ]; + }; + "libc" = rec { + crateName = "libc"; + version = "0.2.116"; + edition = "2015"; + sha256 = "0x6sk17kv2fdsqxlm23bz9x1y79w90k7ylkflk44rgidhy4bspan"; + authors = [ + "The Rust Project Developers" + ]; + features = { + "default" = [ "std" ]; + "rustc-dep-of-std" = [ "align" "rustc-std-workspace-core" ]; + "rustc-std-workspace-core" = [ "dep:rustc-std-workspace-core" ]; + "use_std" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "libm" = rec { + crateName = "libm"; + version = "0.2.1"; + edition = "2018"; + sha256 = "0akh56sh51adhagmk9l84dyrlz60gv8ri05xhr13i1b18czkpmy7"; + authors = [ + "Jorge Aparicio " + ]; + features = { + "musl-reference-tests" = [ "rand" ]; + "rand" = [ "dep:rand" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "log" = rec { + crateName = "log"; + version = "0.4.14"; + edition = "2015"; + sha256 = "04175hv0v62shd82qydq58a48k3bjijmk54v38zgqlbxqkkbpfai"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + ]; + features = { + "kv_unstable" = [ "value-bag" ]; + "kv_unstable_serde" = [ "kv_unstable_std" "value-bag/serde" "serde" ]; + "kv_unstable_std" = [ "std" "kv_unstable" "value-bag/error" ]; + "kv_unstable_sval" = [ "kv_unstable" "value-bag/sval" "sval" ]; + "serde" = [ "dep:serde" ]; + "sval" = [ "dep:sval" ]; + "value-bag" = [ "dep:value-bag" ]; + }; + }; + "memchr" = rec { + crateName = "memchr"; + version = "2.4.1"; + edition = "2018"; + sha256 = "0smq8xzd40njqpfzv5mghigj91fzlfrfg842iz8x0wqvw2dw731h"; + authors = [ + "Andrew Gallant " + "bluss" + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "default" = [ "std" ]; + "libc" = [ "dep:libc" ]; + "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; + "use_std" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "minimal-lexical" = rec { + crateName = "minimal-lexical"; + version = "0.2.1"; + edition = "2018"; + sha256 = "16ppc5g84aijpri4jzv14rvcnslvlpphbszc7zzp6vfkddf4qdb8"; + authors = [ + "Alex Huszagh " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "nom" = rec { + crateName = "nom"; + version = "7.1.0"; + edition = "2018"; + sha256 = "0281jdx0xcyhjgs1jkj9pii8py1clcpazg41bgz7d71qxzhi278v"; + authors = [ + "contact@geoffroycouprie.com" + ]; + dependencies = [ + { + name = "memchr"; + packageId = "memchr"; + usesDefaultFeatures = false; + } + { + name = "minimal-lexical"; + packageId = "minimal-lexical"; + usesDefaultFeatures = false; + } + ]; + buildDependencies = [ + { + name = "version_check"; + packageId = "version_check"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "alloc" "memchr/std" "minimal-lexical/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; + }; + "num-bigint" = rec { + crateName = "num-bigint"; + version = "0.4.3"; + edition = "2018"; + sha256 = "0py73wsa5j4izhd39nkqzqv260r0ma08vy30ky54ld3vkhlbcfpr"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 1.0.1"; + } + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "default" = [ "std" ]; + "quickcheck" = [ "dep:quickcheck" ]; + "rand" = [ "dep:rand" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "num-integer/std" "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "num-bigint-dig" = rec { + crateName = "num-bigint-dig"; + version = "0.7.0"; + edition = "2015"; + sha256 = "1004mmipvc7pvaf3kf13i1nqh3vxf789bj72d8wl51y185aywis5"; + authors = [ + "dignifiedquire " + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "byteorder"; + packageId = "byteorder"; + usesDefaultFeatures = false; + } + { + name = "lazy_static"; + packageId = "lazy_static"; + usesDefaultFeatures = false; + features = [ "spin_no_std" ]; + } + { + name = "libm"; + packageId = "libm"; + } + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + } + { + name = "num-iter"; + packageId = "num-iter"; + usesDefaultFeatures = false; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + } + { + name = "rand"; + packageId = "rand"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "smallvec"; + packageId = "smallvec"; + usesDefaultFeatures = false; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + usesDefaultFeatures = false; + features = [ "zeroize_derive" ]; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 0.1.7"; + } + ]; + devDependencies = [ + { + name = "rand"; + packageId = "rand"; + features = [ "small_rng" ]; + } + ]; + features = { + "default" = [ "std" "i128" "u64_digit" ]; + "i128" = [ "num-integer/i128" "num-traits/i128" ]; + "prime" = [ "rand/std_rng" ]; + "rand" = [ "dep:rand" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "num-integer/std" "num-traits/std" "smallvec/write" "rand/std" "serde/std" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "i128" "prime" "rand" "u64_digit" "zeroize" ]; + }; + "num-integer" = rec { + crateName = "num-integer"; + version = "0.1.44"; + edition = "2015"; + sha256 = "1nq152y3304as1iai95hqz8prqnc94lks1s7q05sfjdmcf56kk6j"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 1.0.1"; + } + ]; + features = { + "default" = [ "std" ]; + "i128" = [ "num-traits/i128" ]; + "std" = [ "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "i128" "std" ]; + }; + "num-iter" = rec { + crateName = "num-iter"; + version = "0.1.42"; + edition = "2015"; + sha256 = "0ndd9wb9qar50fdr16xm3i1zk6h2g9br56nml2n22kd56y1iq0mj"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 1.0.1"; + } + ]; + features = { + "default" = [ "std" ]; + "i128" = [ "num-integer/i128" "num-traits/i128" ]; + "std" = [ "num-integer/std" "num-traits/std" ]; + }; + }; + "num-traits" = rec { + crateName = "num-traits"; + version = "0.2.14"; + edition = "2015"; + sha256 = "144j176s2p76azy2ngk2vkdzgwdc0bc8c93jhki8c9fsbknb2r4s"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "libm"; + packageId = "libm"; + optional = true; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 1.0.1"; + } + ]; + features = { + "default" = [ "std" ]; + "libm" = [ "dep:libm" ]; + }; + resolvedDefaultFeatures = [ "default" "i128" "libm" "std" ]; + }; + "num_threads" = rec { + crateName = "num_threads"; + version = "0.1.3"; + edition = "2015"; + sha256 = "05gvsnv4k6d69iksz47i7fq1r61dj1k1nh4i8xrw7qlkcfx9kflp"; + authors = [ + "Jacob Pratt " + ]; + dependencies = [ + { + name = "libc"; + packageId = "libc"; + target = { target, features }: ((target."os" == "macos") || (target."os" == "freebsd")); + } + ]; + + }; + "oid-registry" = rec { + crateName = "oid-registry"; + version = "0.4.0"; + edition = "2018"; + sha256 = "0akbah3j8231ayrp2l1y5d9zmvbvqcsj0sa6s6dz6h85z8bhgqiq"; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "asn1-rs"; + packageId = "asn1-rs"; + } + ]; + features = { + "crypto" = [ "kdf" "pkcs1" "pkcs7" "pkcs9" "pkcs12" "nist_algs" "x962" ]; + "default" = [ "registry" ]; + }; + resolvedDefaultFeatures = [ "crypto" "default" "kdf" "nist_algs" "pkcs1" "pkcs12" "pkcs7" "pkcs9" "registry" "x509" "x962" ]; + }; + "once_cell" = rec { + crateName = "once_cell"; + version = "1.9.0"; + edition = "2018"; + sha256 = "1mfqhrsgi368x92bwnq3vi3p5nv0n1qlrn69gfflhvkfkxfm2cns"; + authors = [ + "Aleksey Kladov " + ]; + features = { + "alloc" = [ "race" ]; + "atomic-polyfill" = [ "dep:atomic-polyfill" ]; + "default" = [ "std" ]; + "parking_lot" = [ "dep:parking_lot" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "race" "std" ]; + }; + "openssl" = rec { + crateName = "openssl"; + version = "0.10.38"; + edition = "2018"; + sha256 = "15baqlphisr1f7ddq11jnrrzz4shdh35kwal24adyc2c4cif4yhc"; + authors = [ + "Steven Fackler " + ]; + dependencies = [ + { + name = "bitflags"; + packageId = "bitflags"; + } + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "foreign-types"; + packageId = "foreign-types"; + } + { + name = "libc"; + packageId = "libc"; + } + { + name = "once_cell"; + packageId = "once_cell"; + } + { + name = "openssl-sys"; + packageId = "openssl-sys"; + rename = "ffi"; + } + ]; + features = { + "vendored" = [ "ffi/vendored" ]; + }; + }; + "openssl-sys" = rec { + crateName = "openssl-sys"; + version = "0.9.72"; + edition = "2015"; + sha256 = "1jq3qbcvf16qn71yasdzw54b14n8nz98vr52l1gp60in72f10iky"; + build = "build/main.rs"; + authors = [ + "Alex Crichton " + "Steven Fackler " + ]; + dependencies = [ + { + name = "libc"; + packageId = "libc"; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg 1.0.1"; + } + { + name = "cc"; + packageId = "cc"; + } + { + name = "pkg-config"; + packageId = "pkg-config"; + } + { + name = "vcpkg"; + packageId = "vcpkg"; + target = {target, features}: (target."env" == "msvc"); + } + ]; + features = { + "openssl-src" = [ "dep:openssl-src" ]; + "vendored" = [ "openssl-src" ]; + }; + }; + "pem" = rec { + crateName = "pem"; + version = "1.0.2"; + edition = "2018"; + sha256 = "0iqrvfnm71x9pvff39d5ajwn3gc9glxlv4d4h22max7342db18z9"; + authors = [ + "Jonathan Creekmore " + ]; + dependencies = [ + { + name = "base64"; + packageId = "base64"; + } + ]; + + }; + "pem-rfc7468" = rec { + crateName = "pem-rfc7468"; + version = "0.2.4"; + edition = "2018"; + sha256 = "1m1c9jypydzabg4yscplmvff7pdcc8gg4cqg081hnlf03hxkmsc4"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "base64ct"; + packageId = "base64ct"; + } + ]; + features = { + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" ]; + }; + "pkcs1" = rec { + crateName = "pkcs1"; + version = "0.2.4"; + edition = "2018"; + sha256 = "0b2f1a0lf5h53zrjvcqbxzjhh89gcfa1myhf6z7w10ypg61fwsqi"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "der"; + packageId = "der"; + features = [ "bigint" "oid" ]; + } + { + name = "pem-rfc7468"; + packageId = "pem-rfc7468"; + optional = true; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + ]; + features = { + "alloc" = [ "der/alloc" "zeroize" ]; + "pem" = [ "alloc" "pem-rfc7468/alloc" ]; + "pem-rfc7468" = [ "dep:pem-rfc7468" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "alloc" "pem" "pem-rfc7468" "std" "zeroize" ]; + }; + "pkcs8" = rec { + crateName = "pkcs8"; + version = "0.7.6"; + edition = "2018"; + sha256 = "0iq46p6fa2b8xy6pj52zpmdy8ya3fg31dj4rc19x1fi69nvgjgpf"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "der"; + packageId = "der"; + features = [ "oid" ]; + } + { + name = "pem-rfc7468"; + packageId = "pem-rfc7468"; + optional = true; + } + { + name = "pkcs1"; + packageId = "pkcs1"; + optional = true; + features = [ "alloc" ]; + } + { + name = "spki"; + packageId = "spki"; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + ]; + features = { + "3des" = [ "encryption" "pkcs5/3des" ]; + "alloc" = [ "der/alloc" "zeroize" ]; + "des-insecure" = [ "encryption" "pkcs5/des-insecure" ]; + "encryption" = [ "alloc" "pkcs5/alloc" "pkcs5/pbes2" "rand_core" ]; + "pem" = [ "alloc" "pem-rfc7468/alloc" ]; + "pem-rfc7468" = [ "dep:pem-rfc7468" ]; + "pkcs1" = [ "dep:pkcs1" ]; + "pkcs5" = [ "dep:pkcs5" ]; + "rand_core" = [ "dep:rand_core" ]; + "sha1" = [ "encryption" "pkcs5/sha1" ]; + "std" = [ "alloc" "der/std" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "alloc" "pem" "pem-rfc7468" "pkcs1" "std" "zeroize" ]; + }; + "pkg-config" = rec { + crateName = "pkg-config"; + version = "0.3.24"; + edition = "2015"; + sha256 = "1ghcyjp5537r7qigmgl3dj62j01arlpddaq93a3i414v3iskz2aq"; + authors = [ + "Alex Crichton " + ]; + + }; + "ppv-lite86" = rec { + crateName = "ppv-lite86"; + version = "0.2.16"; + edition = "2018"; + sha256 = "0wkqwnvnfcgqlrahphl45vdlgi2f1bs7nqcsalsllp1y4dp9x7zb"; + authors = [ + "The CryptoCorrosion Contributors" + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "simd" "std" ]; + }; + "proc-macro2" = rec { + crateName = "proc-macro2"; + version = "1.0.36"; + edition = "2018"; + sha256 = "0adh6gvs31x6pfwmygypmzrv1jc7kjq568vsqcfaxk7vhdc2sd67"; + authors = [ + "David Tolnay " + "Alex Crichton " + ]; + dependencies = [ + { + name = "unicode-xid"; + packageId = "unicode-xid"; + } + ]; + features = { + "default" = [ "proc-macro" ]; + }; + resolvedDefaultFeatures = [ "default" "proc-macro" ]; + }; + "quote" = rec { + crateName = "quote"; + version = "1.0.15"; + edition = "2018"; + sha256 = "0id1q0875pvhkg0mlb5z8gzdm2g2rbbz76bfzhv331lrm2b3wkc6"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "proc-macro" ]; + "proc-macro" = [ "proc-macro2/proc-macro" ]; + }; + resolvedDefaultFeatures = [ "default" "proc-macro" ]; + }; + "rand" = rec { + crateName = "rand"; + version = "0.8.4"; + edition = "2018"; + sha256 = "1n5wska2fbfj4dsfz8mc0pd0dgjlrb6c9anpk5mwym345rip6x9f"; + authors = [ + "The Rand Project Developers" + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "libc"; + packageId = "libc"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + } + { + name = "rand_chacha"; + packageId = "rand_chacha"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (!(target."os" == "emscripten")); + } + { + name = "rand_core"; + packageId = "rand_core"; + } + { + name = "rand_hc"; + packageId = "rand_hc"; + optional = true; + target = { target, features }: (target."os" == "emscripten"); + } + ]; + devDependencies = [ + { + name = "rand_hc"; + packageId = "rand_hc"; + } + ]; + features = { + "alloc" = [ "rand_core/alloc" ]; + "default" = [ "std" "std_rng" ]; + "getrandom" = [ "rand_core/getrandom" ]; + "libc" = [ "dep:libc" ]; + "log" = [ "dep:log" ]; + "packed_simd" = [ "dep:packed_simd" ]; + "rand_chacha" = [ "dep:rand_chacha" ]; + "rand_hc" = [ "dep:rand_hc" ]; + "serde" = [ "dep:serde" ]; + "serde1" = [ "serde" "rand_core/serde1" ]; + "simd_support" = [ "packed_simd" ]; + "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; + "std_rng" = [ "rand_chacha" "rand_hc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "getrandom" "libc" "rand_chacha" "rand_hc" "std" "std_rng" ]; + }; + "rand_chacha" = rec { + crateName = "rand_chacha"; + version = "0.3.1"; + edition = "2018"; + sha256 = "123x2adin558xbhvqb8w4f6syjsdkmqff8cxwhmjacpsl1ihmhg6"; + authors = [ + "The Rand Project Developers" + "The Rust Project Developers" + "The CryptoCorrosion Contributors" + ]; + dependencies = [ + { + name = "ppv-lite86"; + packageId = "ppv-lite86"; + usesDefaultFeatures = false; + features = [ "simd" ]; + } + { + name = "rand_core"; + packageId = "rand_core"; + } + ]; + features = { + "default" = [ "std" ]; + "serde" = [ "dep:serde" ]; + "serde1" = [ "serde" ]; + "std" = [ "ppv-lite86/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "rand_core" = rec { + crateName = "rand_core"; + version = "0.6.3"; + edition = "2018"; + sha256 = "1rxlxc3bpzgwphcg9c9yasvv9idipcg2z2y4j0vlb52jyl418kyk"; + authors = [ + "The Rand Project Developers" + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "getrandom"; + packageId = "getrandom"; + optional = true; + } + ]; + features = { + "getrandom" = [ "dep:getrandom" ]; + "serde" = [ "dep:serde" ]; + "serde1" = [ "serde" ]; + "std" = [ "alloc" "getrandom" "getrandom/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" "getrandom" "std" ]; + }; + "rand_hc" = rec { + crateName = "rand_hc"; + version = "0.3.1"; + edition = "2018"; + sha256 = "1rwpykyvhkxs4jvqdja3mzp9dqaqamzn113cxaigs9z2dmcry7nm"; + authors = [ + "The Rand Project Developers" + ]; + dependencies = [ + { + name = "rand_core"; + packageId = "rand_core"; + } + ]; + + }; + "rcgen" = rec { + crateName = "rcgen"; + version = "0.9.2"; + edition = "2018"; + crateBin = [ + { name = "rcgen"; path = "src/main.rs"; } + ]; + sha256 = "0ppwfl9g504x2qwk7m7mag8c3l70w9mcfha93013nlzqdlw2vynp"; + authors = [ + "est31 " + ]; + dependencies = [ + { + name = "pem"; + packageId = "pem"; + optional = true; + } + { + name = "ring"; + packageId = "ring"; + } + { + name = "time"; + packageId = "time"; + usesDefaultFeatures = false; + } + { + name = "x509-parser"; + packageId = "x509-parser"; + optional = true; + features = [ "verify" ]; + } + { + name = "yasna"; + packageId = "yasna"; + features = [ "time" "std" ]; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + } + ]; + devDependencies = [ + { + name = "botan"; + packageId = "botan"; + features = [ "vendored" ]; + } + { + name = "openssl"; + packageId = "openssl"; + } + { + name = "rand"; + packageId = "rand"; + } + { + name = "rsa"; + packageId = "rsa"; + } + { + name = "webpki"; + packageId = "webpki"; + features = [ "std" ]; + } + { + name = "x509-parser"; + packageId = "x509-parser"; + features = [ "verify" ]; + } + ]; + features = { + "default" = [ "pem" ]; + "pem" = [ "dep:pem" ]; + "x509-parser" = [ "dep:x509-parser" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "default" "pem" "x509-parser" "zeroize" ]; + }; + "ring" = rec { + crateName = "ring"; + version = "0.16.20"; + edition = "2018"; + sha256 = "1z682xp7v38ayq9g9nkbhhfpj6ygralmlx7wdmsfv8rnw99cylrh"; + authors = [ + "Brian Smith " + ]; + dependencies = [ + { + name = "libc"; + packageId = "libc"; + usesDefaultFeatures = false; + target = { target, features }: ((target."os" == "android") || (target."os" == "linux")); + } + { + name = "once_cell"; + packageId = "once_cell"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: ((target."os" == "android") || (target."os" == "linux")); + features = [ "std" ]; + } + { + name = "once_cell"; + packageId = "once_cell"; + usesDefaultFeatures = false; + target = { target, features }: ((target."os" == "dragonfly") || (target."os" == "freebsd") || (target."os" == "illumos") || (target."os" == "netbsd") || (target."os" == "openbsd") || (target."os" == "solaris")); + features = [ "std" ]; + } + { + name = "spin"; + packageId = "spin"; + usesDefaultFeatures = false; + target = { target, features }: ((target."arch" == "x86") || (target."arch" == "x86_64") || (((target."arch" == "aarch64") || (target."arch" == "arm")) && ((target."os" == "android") || (target."os" == "fuchsia") || (target."os" == "linux")))); + } + { + name = "untrusted"; + packageId = "untrusted"; + } + { + name = "web-sys"; + packageId = "web-sys"; + usesDefaultFeatures = false; + target = { target, features }: ((target."arch" == "wasm32") && (target."vendor" == "unknown") && (target."os" == "unknown") && (target."env" == "")); + features = [ "Crypto" "Window" ]; + } + { + name = "winapi"; + packageId = "winapi"; + usesDefaultFeatures = false; + target = { target, features }: (target."os" == "windows"); + features = [ "ntsecapi" "wtypesbase" ]; + } + ]; + buildDependencies = [ + { + name = "cc"; + packageId = "cc"; + usesDefaultFeatures = false; + } + ]; + devDependencies = [ + { + name = "libc"; + packageId = "libc"; + usesDefaultFeatures = false; + target = {target, features}: ((target."unix" or false) || (target."windows" or false)); + } + ]; + features = { + "default" = [ "alloc" "dev_urandom_fallback" ]; + "dev_urandom_fallback" = [ "once_cell" ]; + "once_cell" = [ "dep:once_cell" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "dev_urandom_fallback" "once_cell" ]; + }; + "rsa" = rec { + crateName = "rsa"; + version = "0.5.0"; + edition = "2018"; + sha256 = "039676a4mj0875phdi7vc0bd37hv84dh0dql6fmk8dl2w81jcp70"; + authors = [ + "RustCrypto Developers" + "dignifiedquire " + ]; + dependencies = [ + { + name = "byteorder"; + packageId = "byteorder"; + usesDefaultFeatures = false; + } + { + name = "digest"; + packageId = "digest"; + usesDefaultFeatures = false; + } + { + name = "lazy_static"; + packageId = "lazy_static"; + features = [ "spin_no_std" ]; + } + { + name = "num-bigint-dig"; + packageId = "num-bigint-dig"; + rename = "num-bigint"; + usesDefaultFeatures = false; + features = [ "i128" "u64_digit" "prime" "zeroize" ]; + } + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + } + { + name = "num-iter"; + packageId = "num-iter"; + usesDefaultFeatures = false; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "libm" ]; + } + { + name = "pkcs1"; + packageId = "pkcs1"; + usesDefaultFeatures = false; + } + { + name = "pkcs8"; + packageId = "pkcs8"; + usesDefaultFeatures = false; + } + { + name = "rand"; + packageId = "rand"; + usesDefaultFeatures = false; + features = [ "std_rng" ]; + } + { + name = "subtle"; + packageId = "subtle"; + usesDefaultFeatures = false; + } + { + name = "zeroize"; + packageId = "zeroize"; + features = [ "alloc" "zeroize_derive" ]; + } + ]; + features = { + "alloc" = [ "digest/alloc" "pkcs1/alloc" "pkcs8/alloc" "pkcs8/pkcs1" ]; + "default" = [ "std" "pem" ]; + "nightly" = [ "subtle/nightly" "num-bigint/nightly" ]; + "pem" = [ "alloc" "pkcs1/pem" "pkcs8/pem" ]; + "pkcs5" = [ "pkcs8/encryption" ]; + "serde" = [ "num-bigint/serde" "serde_crate" ]; + "serde_crate" = [ "dep:serde_crate" ]; + "std" = [ "alloc" "digest/std" "pkcs1/std" "pkcs8/std" "rand/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "pem" "std" ]; + }; + "rusticata-macros" = rec { + crateName = "rusticata-macros"; + version = "4.0.0"; + edition = "2018"; + sha256 = "03dmfxhgwzpm1360iwcpcg3y18ddgya0i0hc599am212pdvj7ib5"; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "nom"; + packageId = "nom"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + ]; + + }; + "smallvec" = rec { + crateName = "smallvec"; + version = "1.8.0"; + edition = "2018"; + sha256 = "10zf4fn63p2d6sx8qap3jvyarcfw563308x3431hd4c34r35gpgj"; + authors = [ + "The Servo Project Developers" + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "const_new" = [ "const_generics" ]; + "serde" = [ "dep:serde" ]; + }; + }; + "spin" = rec { + crateName = "spin"; + version = "0.5.2"; + edition = "2015"; + sha256 = "0b84m6dbzrwf2kxylnw82d3dr8w06av7rfkr8s85fb5f43rwyqvf"; + authors = [ + "Mathijs van de Nes " + "John Ericson " + ]; + + }; + "spki" = rec { + crateName = "spki"; + version = "0.4.1"; + edition = "2018"; + sha256 = "0ckgkcg6db5y94dqhmyikgn8yrsah6pyf4j197hv1c51bp0s00aw"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "der"; + packageId = "der"; + features = [ "oid" ]; + } + ]; + features = { + "std" = [ "der/std" ]; + }; + }; + "subtle" = rec { + crateName = "subtle"; + version = "2.4.1"; + edition = "2015"; + sha256 = "00b6jzh9gzb0h9n25g06nqr90z3xzqppfhhb260s1hjhh4pg7pkb"; + authors = [ + "Isis Lovecruft " + "Henry de Valence " + ]; + features = { + "default" = [ "std" "i128" ]; + }; + }; + "syn" = rec { + crateName = "syn"; + version = "1.0.86"; + edition = "2018"; + sha256 = "0sqwa4nqxzm89nj8xd8sk4iz0hbrw3mb17b6hyc2w2d0zzsb6rca"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + usesDefaultFeatures = false; + } + { + name = "quote"; + packageId = "quote"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "unicode-xid"; + packageId = "unicode-xid"; + } + ]; + features = { + "default" = [ "derive" "parsing" "printing" "clone-impls" "proc-macro" ]; + "printing" = [ "quote" ]; + "proc-macro" = [ "proc-macro2/proc-macro" "quote/proc-macro" ]; + "quote" = [ "dep:quote" ]; + "test" = [ "syn-test-suite/all-features" ]; + }; + resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "full" "parsing" "printing" "proc-macro" "quote" "visit" ]; + }; + "synstructure" = rec { + crateName = "synstructure"; + version = "0.12.6"; + edition = "2018"; + sha256 = "03r1lydbf3japnlpc4wka7y90pmz1i0danaj3f9a7b431akdlszk"; + authors = [ + "Nika Layzell " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + usesDefaultFeatures = false; + } + { + name = "quote"; + packageId = "quote"; + usesDefaultFeatures = false; + } + { + name = "syn"; + packageId = "syn"; + usesDefaultFeatures = false; + features = [ "derive" "parsing" "printing" "clone-impls" "visit" "extra-traits" ]; + } + { + name = "unicode-xid"; + packageId = "unicode-xid"; + } + ]; + features = { + "default" = [ "proc-macro" ]; + "proc-macro" = [ "proc-macro2/proc-macro" "syn/proc-macro" "quote/proc-macro" ]; + }; + resolvedDefaultFeatures = [ "default" "proc-macro" ]; + }; + "thiserror" = rec { + crateName = "thiserror"; + version = "1.0.30"; + edition = "2018"; + sha256 = "05y4wm29ck8flwq5k1q6nhwh00a3b30cz3xr0qvnbwad5vjsnjw5"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "thiserror-impl"; + packageId = "thiserror-impl"; + } + ]; + + }; + "thiserror-impl" = rec { + crateName = "thiserror-impl"; + version = "1.0.30"; + edition = "2018"; + sha256 = "0jviwmvx6wzawsj6c9msic7h419wmsbjagl9dzhpydkzc8zzscma"; + procMacro = true; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + } + ]; + + }; + "time" = rec { + crateName = "time"; + version = "0.3.7"; + edition = "2018"; + sha256 = "0gbmwlkj15dfhbqvxlzji1ffc1lidblpgg1q3b3378hgyfcbqk00"; + authors = [ + "Jacob Pratt " + "Time contributors" + ]; + dependencies = [ + { + name = "itoa"; + packageId = "itoa"; + optional = true; + } + { + name = "libc"; + packageId = "libc"; + target = { target, features }: (target."family" == "unix"); + } + { + name = "num_threads"; + packageId = "num_threads"; + target = { target, features }: (target."family" == "unix"); + } + { + name = "time-macros"; + packageId = "time-macros"; + optional = true; + } + ]; + features = { + "default" = [ "std" ]; + "formatting" = [ "itoa" "std" ]; + "itoa" = [ "dep:itoa" ]; + "large-dates" = [ "time-macros/large-dates" ]; + "local-offset" = [ "std" ]; + "macros" = [ "time-macros" ]; + "quickcheck" = [ "quickcheck-dep" "alloc" ]; + "quickcheck-dep" = [ "dep:quickcheck-dep" ]; + "rand" = [ "dep:rand" ]; + "serde" = [ "dep:serde" ]; + "serde-human-readable" = [ "serde" "formatting" "parsing" ]; + "serde-well-known" = [ "serde/alloc" "formatting" "parsing" ]; + "std" = [ "alloc" ]; + "time-macros" = [ "dep:time-macros" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "formatting" "itoa" "macros" "parsing" "std" "time-macros" ]; + }; + "time-macros" = rec { + crateName = "time-macros"; + version = "0.2.3"; + edition = "2018"; + sha256 = "1mj7pv8y9j2csrh1l8aabras36pgysbnfy18330srh4g8sihrsr5"; + procMacro = true; + authors = [ + "Jacob Pratt " + "Time contributors" + ]; + features = { + }; + }; + "typenum" = rec { + crateName = "typenum"; + version = "1.15.0"; + edition = "2018"; + sha256 = "11yrvz1vd43gqv738yw1v75rzngjbs7iwcgzjy3cq5ywkv2imy6w"; + build = "build/main.rs"; + authors = [ + "Paho Lurie-Gregg " + "Andre Bogus " + ]; + features = { + "scale-info" = [ "dep:scale-info" ]; + "scale_info" = [ "scale-info/derive" ]; + }; + }; + "unicode-xid" = rec { + crateName = "unicode-xid"; + version = "0.2.2"; + edition = "2015"; + sha256 = "1wrkgcw557v311dkdb6n2hrix9dm2qdsb1zpw7pn79l03zb85jwc"; + authors = [ + "erick.tryzelaar " + "kwantam " + "Manish Goregaokar " + ]; + features = { + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "untrusted" = rec { + crateName = "untrusted"; + version = "0.7.1"; + edition = "2018"; + sha256 = "0jkbqaj9d3v5a91pp3wp9mffvng1nhycx6sh4qkdd9qyr62ccmm1"; + libPath = "src/untrusted.rs"; + authors = [ + "Brian Smith " + ]; + + }; + "vcpkg" = rec { + crateName = "vcpkg"; + version = "0.2.15"; + edition = "2015"; + sha256 = "09i4nf5y8lig6xgj3f7fyrvzd3nlaw4znrihw8psidvv5yk4xkdc"; + authors = [ + "Jim McGrath " + ]; + + }; + "version_check" = rec { + crateName = "version_check"; + version = "0.9.4"; + edition = "2015"; + sha256 = "0gs8grwdlgh0xq660d7wr80x14vxbizmd8dbp29p2pdncx8lp1s9"; + authors = [ + "Sergio Benitez " + ]; + + }; + "wasi" = rec { + crateName = "wasi"; + version = "0.10.2+wasi-snapshot-preview1"; + edition = "2018"; + sha256 = "1ii7nff4y1mpcrxzzvbpgxm7a1nn3szjf1n21jnx37c2g6dbsvzx"; + authors = [ + "The Cranelift Project Developers" + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "default" = [ "std" ]; + "rustc-dep-of-std" = [ "compiler_builtins" "core" "rustc-std-workspace-alloc" ]; + "rustc-std-workspace-alloc" = [ "dep:rustc-std-workspace-alloc" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "wasm-bindgen" = rec { + crateName = "wasm-bindgen"; + version = "0.2.79"; + edition = "2018"; + sha256 = "01kc4lj2vlf0ra2w63izrgdlv8p6f8p15086hhyqln6q4dsazw95"; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "wasm-bindgen-macro"; + packageId = "wasm-bindgen-macro"; + } + ]; + features = { + "default" = [ "spans" "std" ]; + "enable-interning" = [ "std" ]; + "serde" = [ "dep:serde" ]; + "serde-serialize" = [ "serde" "serde_json" "std" ]; + "serde_json" = [ "dep:serde_json" ]; + "spans" = [ "wasm-bindgen-macro/spans" ]; + "strict-macro" = [ "wasm-bindgen-macro/strict-macro" ]; + "xxx_debug_only_print_generated_code" = [ "wasm-bindgen-macro/xxx_debug_only_print_generated_code" ]; + }; + resolvedDefaultFeatures = [ "default" "spans" "std" ]; + }; + "wasm-bindgen-backend" = rec { + crateName = "wasm-bindgen-backend"; + version = "0.2.79"; + edition = "2018"; + sha256 = "1jpdrl5jj01961jxhmvj7v25ws928fyfj8ms7izifnhg0ggw08cb"; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "bumpalo"; + packageId = "bumpalo"; + } + { + name = "lazy_static"; + packageId = "lazy_static"; + } + { + name = "log"; + packageId = "log"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + features = [ "full" ]; + } + { + name = "wasm-bindgen-shared"; + packageId = "wasm-bindgen-shared"; + } + ]; + features = { + "extra-traits" = [ "syn/extra-traits" ]; + }; + resolvedDefaultFeatures = [ "spans" ]; + }; + "wasm-bindgen-macro" = rec { + crateName = "wasm-bindgen-macro"; + version = "0.2.79"; + edition = "2018"; + sha256 = "00gdh0dlf2r77mxwh08q0z01vz2z7mvrllmj4gjjx9a0kvb06hig"; + procMacro = true; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "quote"; + packageId = "quote"; + } + { + name = "wasm-bindgen-macro-support"; + packageId = "wasm-bindgen-macro-support"; + } + ]; + features = { + "spans" = [ "wasm-bindgen-macro-support/spans" ]; + "strict-macro" = [ "wasm-bindgen-macro-support/strict-macro" ]; + }; + resolvedDefaultFeatures = [ "spans" ]; + }; + "wasm-bindgen-macro-support" = rec { + crateName = "wasm-bindgen-macro-support"; + version = "0.2.79"; + edition = "2018"; + sha256 = "1g1fjqvrkrf3j20z8nxsf60cypxg9dfvpbachl2b53908q6s7a5z"; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + features = [ "visit" "full" ]; + } + { + name = "wasm-bindgen-backend"; + packageId = "wasm-bindgen-backend"; + } + { + name = "wasm-bindgen-shared"; + packageId = "wasm-bindgen-shared"; + } + ]; + features = { + "extra-traits" = [ "syn/extra-traits" ]; + "spans" = [ "wasm-bindgen-backend/spans" ]; + }; + resolvedDefaultFeatures = [ "spans" ]; + }; + "wasm-bindgen-shared" = rec { + crateName = "wasm-bindgen-shared"; + version = "0.2.79"; + edition = "2018"; + sha256 = "18h67l9b9jn06iw9r2p7bh9i0brh24lilcp4f26f4f24bh1qv59x"; + authors = [ + "The wasm-bindgen Developers" + ]; + + }; + "web-sys" = rec { + crateName = "web-sys"; + version = "0.3.56"; + edition = "2018"; + sha256 = "1sxqmwq773ss5m6vz7z95fdm6bqlix0s2awsy0j5gllxy8cv6q60"; + authors = [ + "The wasm-bindgen Developers" + ]; + dependencies = [ + { + name = "js-sys"; + packageId = "js-sys"; + } + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + } + ]; + features = { + "AbortSignal" = [ "EventTarget" ]; + "AnalyserNode" = [ "AudioNode" "EventTarget" ]; + "Animation" = [ "EventTarget" ]; + "AnimationEvent" = [ "Event" ]; + "AnimationPlaybackEvent" = [ "Event" ]; + "Attr" = [ "EventTarget" "Node" ]; + "AudioBufferSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; + "AudioContext" = [ "BaseAudioContext" "EventTarget" ]; + "AudioDestinationNode" = [ "AudioNode" "EventTarget" ]; + "AudioNode" = [ "EventTarget" ]; + "AudioProcessingEvent" = [ "Event" ]; + "AudioScheduledSourceNode" = [ "AudioNode" "EventTarget" ]; + "AudioStreamTrack" = [ "EventTarget" "MediaStreamTrack" ]; + "AudioTrackList" = [ "EventTarget" ]; + "AudioWorklet" = [ "Worklet" ]; + "AudioWorkletGlobalScope" = [ "WorkletGlobalScope" ]; + "AudioWorkletNode" = [ "AudioNode" "EventTarget" ]; + "AuthenticatorAssertionResponse" = [ "AuthenticatorResponse" ]; + "AuthenticatorAttestationResponse" = [ "AuthenticatorResponse" ]; + "BaseAudioContext" = [ "EventTarget" ]; + "BatteryManager" = [ "EventTarget" ]; + "BeforeUnloadEvent" = [ "Event" ]; + "BiquadFilterNode" = [ "AudioNode" "EventTarget" ]; + "BlobEvent" = [ "Event" ]; + "Bluetooth" = [ "EventTarget" ]; + "BluetoothAdvertisingEvent" = [ "Event" ]; + "BluetoothDevice" = [ "EventTarget" ]; + "BluetoothPermissionResult" = [ "EventTarget" "PermissionStatus" ]; + "BluetoothRemoteGattCharacteristic" = [ "EventTarget" ]; + "BluetoothRemoteGattService" = [ "EventTarget" ]; + "BroadcastChannel" = [ "EventTarget" ]; + "CanvasCaptureMediaStream" = [ "EventTarget" "MediaStream" ]; + "CdataSection" = [ "CharacterData" "EventTarget" "Node" "Text" ]; + "ChannelMergerNode" = [ "AudioNode" "EventTarget" ]; + "ChannelSplitterNode" = [ "AudioNode" "EventTarget" ]; + "CharacterData" = [ "EventTarget" "Node" ]; + "ChromeWorker" = [ "EventTarget" "Worker" ]; + "Clipboard" = [ "EventTarget" ]; + "ClipboardEvent" = [ "Event" ]; + "CloseEvent" = [ "Event" ]; + "Comment" = [ "CharacterData" "EventTarget" "Node" ]; + "CompositionEvent" = [ "Event" "UiEvent" ]; + "ConstantSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; + "ConvolverNode" = [ "AudioNode" "EventTarget" ]; + "CssAnimation" = [ "Animation" "EventTarget" ]; + "CssConditionRule" = [ "CssGroupingRule" "CssRule" ]; + "CssCounterStyleRule" = [ "CssRule" ]; + "CssFontFaceRule" = [ "CssRule" ]; + "CssFontFeatureValuesRule" = [ "CssRule" ]; + "CssGroupingRule" = [ "CssRule" ]; + "CssImportRule" = [ "CssRule" ]; + "CssKeyframeRule" = [ "CssRule" ]; + "CssKeyframesRule" = [ "CssRule" ]; + "CssMediaRule" = [ "CssConditionRule" "CssGroupingRule" "CssRule" ]; + "CssNamespaceRule" = [ "CssRule" ]; + "CssPageRule" = [ "CssRule" ]; + "CssStyleRule" = [ "CssRule" ]; + "CssStyleSheet" = [ "StyleSheet" ]; + "CssSupportsRule" = [ "CssConditionRule" "CssGroupingRule" "CssRule" ]; + "CssTransition" = [ "Animation" "EventTarget" ]; + "CustomEvent" = [ "Event" ]; + "DedicatedWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; + "DelayNode" = [ "AudioNode" "EventTarget" ]; + "DeviceLightEvent" = [ "Event" ]; + "DeviceMotionEvent" = [ "Event" ]; + "DeviceOrientationEvent" = [ "Event" ]; + "DeviceProximityEvent" = [ "Event" ]; + "Document" = [ "EventTarget" "Node" ]; + "DocumentFragment" = [ "EventTarget" "Node" ]; + "DocumentTimeline" = [ "AnimationTimeline" ]; + "DocumentType" = [ "EventTarget" "Node" ]; + "DomMatrix" = [ "DomMatrixReadOnly" ]; + "DomPoint" = [ "DomPointReadOnly" ]; + "DomRect" = [ "DomRectReadOnly" ]; + "DomRequest" = [ "EventTarget" ]; + "DragEvent" = [ "Event" "MouseEvent" "UiEvent" ]; + "DynamicsCompressorNode" = [ "AudioNode" "EventTarget" ]; + "Element" = [ "EventTarget" "Node" ]; + "ErrorEvent" = [ "Event" ]; + "EventSource" = [ "EventTarget" ]; + "ExtendableEvent" = [ "Event" ]; + "ExtendableMessageEvent" = [ "Event" "ExtendableEvent" ]; + "FetchEvent" = [ "Event" "ExtendableEvent" ]; + "FetchObserver" = [ "EventTarget" ]; + "File" = [ "Blob" ]; + "FileReader" = [ "EventTarget" ]; + "FileSystemDirectoryEntry" = [ "FileSystemEntry" ]; + "FileSystemFileEntry" = [ "FileSystemEntry" ]; + "FocusEvent" = [ "Event" "UiEvent" ]; + "FontFaceSet" = [ "EventTarget" ]; + "FontFaceSetLoadEvent" = [ "Event" ]; + "GainNode" = [ "AudioNode" "EventTarget" ]; + "GamepadAxisMoveEvent" = [ "Event" "GamepadEvent" ]; + "GamepadButtonEvent" = [ "Event" "GamepadEvent" ]; + "GamepadEvent" = [ "Event" ]; + "GpuDevice" = [ "EventTarget" ]; + "GpuUncapturedErrorEvent" = [ "Event" ]; + "HashChangeEvent" = [ "Event" ]; + "Hid" = [ "EventTarget" ]; + "HidConnectionEvent" = [ "Event" ]; + "HidDevice" = [ "EventTarget" ]; + "HidInputReportEvent" = [ "Event" ]; + "HtmlAnchorElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlAreaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlAudioElement" = [ "Element" "EventTarget" "HtmlElement" "HtmlMediaElement" "Node" ]; + "HtmlBaseElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlBodyElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlBrElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlButtonElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlCanvasElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDataElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDataListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDetailsElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDialogElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDirectoryElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDivElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlDocument" = [ "Document" "EventTarget" "Node" ]; + "HtmlElement" = [ "Element" "EventTarget" "Node" ]; + "HtmlEmbedElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlFieldSetElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlFontElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlFormControlsCollection" = [ "HtmlCollection" ]; + "HtmlFormElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlFrameElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlFrameSetElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlHeadElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlHeadingElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlHrElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlHtmlElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlIFrameElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlImageElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlInputElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlLabelElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlLegendElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlLiElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlLinkElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMapElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMediaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMenuElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMenuItemElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMetaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlMeterElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlModElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlOListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlObjectElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlOptGroupElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlOptionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlOptionsCollection" = [ "HtmlCollection" ]; + "HtmlOutputElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlParagraphElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlParamElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlPictureElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlPreElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlProgressElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlQuoteElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlScriptElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlSelectElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlSlotElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlSourceElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlSpanElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlStyleElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableCaptionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableCellElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableColElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableRowElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTableSectionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTemplateElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTextAreaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTimeElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTitleElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlTrackElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlUListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlUnknownElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; + "HtmlVideoElement" = [ "Element" "EventTarget" "HtmlElement" "HtmlMediaElement" "Node" ]; + "IdbCursorWithValue" = [ "IdbCursor" ]; + "IdbDatabase" = [ "EventTarget" ]; + "IdbFileHandle" = [ "EventTarget" ]; + "IdbFileRequest" = [ "DomRequest" "EventTarget" ]; + "IdbLocaleAwareKeyRange" = [ "IdbKeyRange" ]; + "IdbMutableFile" = [ "EventTarget" ]; + "IdbOpenDbRequest" = [ "EventTarget" "IdbRequest" ]; + "IdbRequest" = [ "EventTarget" ]; + "IdbTransaction" = [ "EventTarget" ]; + "IdbVersionChangeEvent" = [ "Event" ]; + "IirFilterNode" = [ "AudioNode" "EventTarget" ]; + "ImageCaptureErrorEvent" = [ "Event" ]; + "InputEvent" = [ "Event" "UiEvent" ]; + "KeyboardEvent" = [ "Event" "UiEvent" ]; + "KeyframeEffect" = [ "AnimationEffect" ]; + "LocalMediaStream" = [ "EventTarget" "MediaStream" ]; + "MediaDevices" = [ "EventTarget" ]; + "MediaElementAudioSourceNode" = [ "AudioNode" "EventTarget" ]; + "MediaEncryptedEvent" = [ "Event" ]; + "MediaKeyError" = [ "Event" ]; + "MediaKeyMessageEvent" = [ "Event" ]; + "MediaKeySession" = [ "EventTarget" ]; + "MediaQueryList" = [ "EventTarget" ]; + "MediaQueryListEvent" = [ "Event" ]; + "MediaRecorder" = [ "EventTarget" ]; + "MediaRecorderErrorEvent" = [ "Event" ]; + "MediaSource" = [ "EventTarget" ]; + "MediaStream" = [ "EventTarget" ]; + "MediaStreamAudioDestinationNode" = [ "AudioNode" "EventTarget" ]; + "MediaStreamAudioSourceNode" = [ "AudioNode" "EventTarget" ]; + "MediaStreamEvent" = [ "Event" ]; + "MediaStreamTrack" = [ "EventTarget" ]; + "MediaStreamTrackEvent" = [ "Event" ]; + "MessageEvent" = [ "Event" ]; + "MessagePort" = [ "EventTarget" ]; + "MidiAccess" = [ "EventTarget" ]; + "MidiConnectionEvent" = [ "Event" ]; + "MidiInput" = [ "EventTarget" "MidiPort" ]; + "MidiMessageEvent" = [ "Event" ]; + "MidiOutput" = [ "EventTarget" "MidiPort" ]; + "MidiPort" = [ "EventTarget" ]; + "MouseEvent" = [ "Event" "UiEvent" ]; + "MouseScrollEvent" = [ "Event" "MouseEvent" "UiEvent" ]; + "MutationEvent" = [ "Event" ]; + "NetworkInformation" = [ "EventTarget" ]; + "Node" = [ "EventTarget" ]; + "Notification" = [ "EventTarget" ]; + "NotificationEvent" = [ "Event" "ExtendableEvent" ]; + "OfflineAudioCompletionEvent" = [ "Event" ]; + "OfflineAudioContext" = [ "BaseAudioContext" "EventTarget" ]; + "OfflineResourceList" = [ "EventTarget" ]; + "OffscreenCanvas" = [ "EventTarget" ]; + "OscillatorNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; + "PageTransitionEvent" = [ "Event" ]; + "PaintWorkletGlobalScope" = [ "WorkletGlobalScope" ]; + "PannerNode" = [ "AudioNode" "EventTarget" ]; + "PaymentMethodChangeEvent" = [ "Event" "PaymentRequestUpdateEvent" ]; + "PaymentRequestUpdateEvent" = [ "Event" ]; + "Performance" = [ "EventTarget" ]; + "PerformanceMark" = [ "PerformanceEntry" ]; + "PerformanceMeasure" = [ "PerformanceEntry" ]; + "PerformanceNavigationTiming" = [ "PerformanceEntry" "PerformanceResourceTiming" ]; + "PerformanceResourceTiming" = [ "PerformanceEntry" ]; + "PermissionStatus" = [ "EventTarget" ]; + "PointerEvent" = [ "Event" "MouseEvent" "UiEvent" ]; + "PopStateEvent" = [ "Event" ]; + "PopupBlockedEvent" = [ "Event" ]; + "PresentationAvailability" = [ "EventTarget" ]; + "PresentationConnection" = [ "EventTarget" ]; + "PresentationConnectionAvailableEvent" = [ "Event" ]; + "PresentationConnectionCloseEvent" = [ "Event" ]; + "PresentationConnectionList" = [ "EventTarget" ]; + "PresentationRequest" = [ "EventTarget" ]; + "ProcessingInstruction" = [ "CharacterData" "EventTarget" "Node" ]; + "ProgressEvent" = [ "Event" ]; + "PromiseRejectionEvent" = [ "Event" ]; + "PublicKeyCredential" = [ "Credential" ]; + "PushEvent" = [ "Event" "ExtendableEvent" ]; + "RadioNodeList" = [ "NodeList" ]; + "RtcDataChannel" = [ "EventTarget" ]; + "RtcDataChannelEvent" = [ "Event" ]; + "RtcPeerConnection" = [ "EventTarget" ]; + "RtcPeerConnectionIceEvent" = [ "Event" ]; + "RtcTrackEvent" = [ "Event" ]; + "RtcdtmfSender" = [ "EventTarget" ]; + "RtcdtmfToneChangeEvent" = [ "Event" ]; + "Screen" = [ "EventTarget" ]; + "ScreenOrientation" = [ "EventTarget" ]; + "ScriptProcessorNode" = [ "AudioNode" "EventTarget" ]; + "ScrollAreaEvent" = [ "Event" "UiEvent" ]; + "SecurityPolicyViolationEvent" = [ "Event" ]; + "ServiceWorker" = [ "EventTarget" ]; + "ServiceWorkerContainer" = [ "EventTarget" ]; + "ServiceWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; + "ServiceWorkerRegistration" = [ "EventTarget" ]; + "ShadowRoot" = [ "DocumentFragment" "EventTarget" "Node" ]; + "SharedWorker" = [ "EventTarget" ]; + "SharedWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; + "SourceBuffer" = [ "EventTarget" ]; + "SourceBufferList" = [ "EventTarget" ]; + "SpeechRecognition" = [ "EventTarget" ]; + "SpeechRecognitionError" = [ "Event" ]; + "SpeechRecognitionEvent" = [ "Event" ]; + "SpeechSynthesis" = [ "EventTarget" ]; + "SpeechSynthesisErrorEvent" = [ "Event" "SpeechSynthesisEvent" ]; + "SpeechSynthesisEvent" = [ "Event" ]; + "SpeechSynthesisUtterance" = [ "EventTarget" ]; + "StereoPannerNode" = [ "AudioNode" "EventTarget" ]; + "StorageEvent" = [ "Event" ]; + "SvgAnimateElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; + "SvgAnimateMotionElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; + "SvgAnimateTransformElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; + "SvgAnimationElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgCircleElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgClipPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgComponentTransferFunctionElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgDefsElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgDescElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgElement" = [ "Element" "EventTarget" "Node" ]; + "SvgEllipseElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgFilterElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgForeignObjectElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgGeometryElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgGraphicsElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgImageElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgLineElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgLinearGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGradientElement" ]; + "SvgMarkerElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgMaskElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgMetadataElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgPathSegArcAbs" = [ "SvgPathSeg" ]; + "SvgPathSegArcRel" = [ "SvgPathSeg" ]; + "SvgPathSegClosePath" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoCubicAbs" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoCubicRel" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoCubicSmoothAbs" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoCubicSmoothRel" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoQuadraticAbs" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoQuadraticRel" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoQuadraticSmoothAbs" = [ "SvgPathSeg" ]; + "SvgPathSegCurvetoQuadraticSmoothRel" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoAbs" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoHorizontalAbs" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoHorizontalRel" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoRel" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoVerticalAbs" = [ "SvgPathSeg" ]; + "SvgPathSegLinetoVerticalRel" = [ "SvgPathSeg" ]; + "SvgPathSegMovetoAbs" = [ "SvgPathSeg" ]; + "SvgPathSegMovetoRel" = [ "SvgPathSeg" ]; + "SvgPatternElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgPolygonElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgPolylineElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgRadialGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGradientElement" ]; + "SvgRectElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; + "SvgScriptElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgSetElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; + "SvgStopElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgStyleElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgSwitchElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgSymbolElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgTextContentElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgTextElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" "SvgTextPositioningElement" ]; + "SvgTextPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" ]; + "SvgTextPositioningElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" ]; + "SvgTitleElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgUseElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgViewElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgaElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgfeBlendElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeColorMatrixElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeComponentTransferElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeCompositeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeConvolveMatrixElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeDiffuseLightingElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeDisplacementMapElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeDistantLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeDropShadowElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeFloodElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeFuncAElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; + "SvgfeFuncBElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; + "SvgfeFuncGElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; + "SvgfeFuncRElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; + "SvgfeGaussianBlurElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeImageElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeMergeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeMergeNodeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeMorphologyElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeOffsetElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfePointLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeSpecularLightingElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeSpotLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeTileElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgfeTurbulenceElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvggElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgmPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; + "SvgsvgElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; + "SvgtSpanElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" "SvgTextPositioningElement" ]; + "TcpServerSocket" = [ "EventTarget" ]; + "TcpServerSocketEvent" = [ "Event" ]; + "TcpSocket" = [ "EventTarget" ]; + "TcpSocketErrorEvent" = [ "Event" ]; + "TcpSocketEvent" = [ "Event" ]; + "Text" = [ "CharacterData" "EventTarget" "Node" ]; + "TextTrack" = [ "EventTarget" ]; + "TextTrackCue" = [ "EventTarget" ]; + "TextTrackList" = [ "EventTarget" ]; + "TimeEvent" = [ "Event" ]; + "TouchEvent" = [ "Event" "UiEvent" ]; + "TrackEvent" = [ "Event" ]; + "TransitionEvent" = [ "Event" ]; + "UiEvent" = [ "Event" ]; + "Usb" = [ "EventTarget" ]; + "UsbConnectionEvent" = [ "Event" ]; + "UsbPermissionResult" = [ "EventTarget" "PermissionStatus" ]; + "UserProximityEvent" = [ "Event" ]; + "ValueEvent" = [ "Event" ]; + "VideoStreamTrack" = [ "EventTarget" "MediaStreamTrack" ]; + "VideoTrackList" = [ "EventTarget" ]; + "VrDisplay" = [ "EventTarget" ]; + "VttCue" = [ "EventTarget" "TextTrackCue" ]; + "WakeLockSentinel" = [ "EventTarget" ]; + "WaveShaperNode" = [ "AudioNode" "EventTarget" ]; + "WebGlContextEvent" = [ "Event" ]; + "WebKitCssMatrix" = [ "DomMatrix" "DomMatrixReadOnly" ]; + "WebSocket" = [ "EventTarget" ]; + "WheelEvent" = [ "Event" "MouseEvent" "UiEvent" ]; + "Window" = [ "EventTarget" ]; + "WindowClient" = [ "Client" ]; + "Worker" = [ "EventTarget" ]; + "WorkerDebuggerGlobalScope" = [ "EventTarget" ]; + "WorkerGlobalScope" = [ "EventTarget" ]; + "XmlDocument" = [ "Document" "EventTarget" "Node" ]; + "XmlHttpRequest" = [ "EventTarget" "XmlHttpRequestEventTarget" ]; + "XmlHttpRequestEventTarget" = [ "EventTarget" ]; + "XmlHttpRequestUpload" = [ "EventTarget" "XmlHttpRequestEventTarget" ]; + "Xr" = [ "EventTarget" ]; + "XrBoundedReferenceSpace" = [ "EventTarget" "XrReferenceSpace" "XrSpace" ]; + "XrInputSourceEvent" = [ "Event" ]; + "XrInputSourcesChangeEvent" = [ "Event" ]; + "XrReferenceSpace" = [ "EventTarget" "XrSpace" ]; + "XrReferenceSpaceEvent" = [ "Event" ]; + "XrSession" = [ "EventTarget" ]; + "XrSessionEvent" = [ "Event" ]; + "XrSpace" = [ "EventTarget" ]; + "XrViewerPose" = [ "XrPose" ]; + }; + resolvedDefaultFeatures = [ "Crypto" "EventTarget" "Window" ]; + }; + "webpki" = rec { + crateName = "webpki"; + version = "0.22.0"; + edition = "2018"; + sha256 = "1gd1gxip5kgdwmrvhj5gjxij2mgg2mavq1ych4q1h272ja0xg5gh"; + authors = [ + "Brian Smith " + ]; + dependencies = [ + { + name = "ring"; + packageId = "ring"; + usesDefaultFeatures = false; + } + { + name = "untrusted"; + packageId = "untrusted"; + } + ]; + features = { + "alloc" = [ "ring/alloc" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "std" ]; + }; + "winapi" = rec { + crateName = "winapi"; + version = "0.3.9"; + edition = "2015"; + sha256 = "06gl025x418lchw1wxj64ycr7gha83m44cjr5sarhynd9xkrm0sw"; + authors = [ + "Peter Atashian " + ]; + dependencies = [ + { + name = "winapi-i686-pc-windows-gnu"; + packageId = "winapi-i686-pc-windows-gnu"; + target = { target, features }: (stdenv.hostPlatform.config == "i686-pc-windows-gnu"); + } + { + name = "winapi-x86_64-pc-windows-gnu"; + packageId = "winapi-x86_64-pc-windows-gnu"; + target = { target, features }: (stdenv.hostPlatform.config == "x86_64-pc-windows-gnu"); + } + ]; + features = { + "debug" = [ "impl-debug" ]; + }; + resolvedDefaultFeatures = [ "ntsecapi" "wtypesbase" ]; + }; + "winapi-i686-pc-windows-gnu" = rec { + crateName = "winapi-i686-pc-windows-gnu"; + version = "0.4.0"; + edition = "2015"; + sha256 = "1dmpa6mvcvzz16zg6d5vrfy4bxgg541wxrcip7cnshi06v38ffxc"; + authors = [ + "Peter Atashian " + ]; + + }; + "winapi-x86_64-pc-windows-gnu" = rec { + crateName = "winapi-x86_64-pc-windows-gnu"; + version = "0.4.0"; + edition = "2015"; + sha256 = "0gqq64czqb64kskjryj8isp62m2sgvx25yyj3kpc2myh85w24bki"; + authors = [ + "Peter Atashian " + ]; + + }; + "x509-parser" = rec { + crateName = "x509-parser"; + version = "0.13.0"; + edition = "2018"; + sha256 = "0f3fqbv92q3a3s51md94sw3vgzs934agl4ii5a6ym364mkdlpwg5"; + authors = [ + "Pierre Chifflier " + ]; + dependencies = [ + { + name = "asn1-rs"; + packageId = "asn1-rs"; + features = [ "datetime" ]; + } + { + name = "base64"; + packageId = "base64"; + } + { + name = "data-encoding"; + packageId = "data-encoding"; + } + { + name = "der-parser"; + packageId = "der-parser"; + features = [ "bigint" ]; + } + { + name = "lazy_static"; + packageId = "lazy_static"; + } + { + name = "nom"; + packageId = "nom"; + } + { + name = "oid-registry"; + packageId = "oid-registry"; + features = [ "crypto" "x509" ]; + } + { + name = "ring"; + packageId = "ring"; + optional = true; + } + { + name = "rusticata-macros"; + packageId = "rusticata-macros"; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + { + name = "time"; + packageId = "time"; + features = [ "formatting" ]; + } + ]; + features = { + "ring" = [ "dep:ring" ]; + "verify" = [ "ring" ]; + }; + resolvedDefaultFeatures = [ "default" "ring" "verify" ]; + }; + "yasna" = rec { + crateName = "yasna"; + version = "0.5.0"; + edition = "2018"; + sha256 = "0k1gk11hq4rwlppv9f50bz8bnmgr73r66idpp7rybly96si38v9l"; + authors = [ + "Masaki Hara " + ]; + dependencies = [ + { + name = "time"; + packageId = "time"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } + ]; + features = { + "bit-vec" = [ "dep:bit-vec" ]; + "num-bigint" = [ "dep:num-bigint" ]; + "time" = [ "dep:time" ]; + }; + resolvedDefaultFeatures = [ "default" "std" "time" ]; + }; + "zeroize" = rec { + crateName = "zeroize"; + version = "1.4.3"; + edition = "2018"; + sha256 = "068nvl3n5hk6lfn5y24grf2c7anzzqfzjjccscq3md7rqp79v3fn"; + authors = [ + "The RustCrypto Project Developers" + ]; + dependencies = [ + { + name = "zeroize_derive"; + packageId = "zeroize_derive"; + optional = true; + } + ]; + features = { + "default" = [ "alloc" ]; + "zeroize_derive" = [ "dep:zeroize_derive" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "zeroize_derive" ]; + }; + "zeroize_derive" = rec { + crateName = "zeroize_derive"; + version = "1.3.1"; + edition = "2018"; + sha256 = "1nzdqyryjnqcrqz0vhddpkd8sybhn0bd8rbd6l33rdhhxwzz3s41"; + procMacro = true; + authors = [ + "The RustCrypto Project Developers" + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + } + { + name = "synstructure"; + packageId = "synstructure"; + } + ]; + + }; + }; + + # +# crate2nix/default.nix (excerpt start) +# + + /* Target (platform) data for conditional dependencies. + This corresponds roughly to what buildRustCrate is setting. + */ + defaultTarget = { + unix = true; + windows = false; + fuchsia = true; + test = false; + + # This doesn't appear to be officially documented anywhere yet. + # See https://github.com/rust-lang-nursery/rust-forge/issues/101. + os = + if stdenv.hostPlatform.isDarwin + then "macos" + else stdenv.hostPlatform.parsed.kernel.name; + arch = stdenv.hostPlatform.parsed.cpu.name; + family = "unix"; + env = "gnu"; + endian = + if stdenv.hostPlatform.parsed.cpu.significantByte.name == "littleEndian" + then "little" else "big"; + pointer_width = toString stdenv.hostPlatform.parsed.cpu.bits; + vendor = stdenv.hostPlatform.parsed.vendor.name; + debug_assertions = false; + }; + + /* Filters common temp files and build files. */ + # TODO(pkolloch): Substitute with gitignore filter + sourceFilter = name: type: + let + baseName = builtins.baseNameOf (builtins.toString name); + in + ! ( + # Filter out git + baseName == ".gitignore" + || (type == "directory" && baseName == ".git") + + # Filter out build results + || ( + type == "directory" && ( + baseName == "target" + || baseName == "_site" + || baseName == ".sass-cache" + || baseName == ".jekyll-metadata" + || baseName == "build-artifacts" + ) + ) + + # Filter out nix-build result symlinks + || ( + type == "symlink" && lib.hasPrefix "result" baseName + ) + + # Filter out IDE config + || ( + type == "directory" && ( + baseName == ".idea" || baseName == ".vscode" + ) + ) || lib.hasSuffix ".iml" baseName + + # Filter out nix build files + || baseName == "Cargo.nix" + + # Filter out editor backup / swap files. + || lib.hasSuffix "~" baseName + || builtins.match "^\\.sw[a-z]$$" baseName != null + || builtins.match "^\\..*\\.sw[a-z]$$" baseName != null + || lib.hasSuffix ".tmp" baseName + || lib.hasSuffix ".bak" baseName + || baseName == "tests.nix" + ); + + /* Returns a crate which depends on successful test execution + of crate given as the second argument. + + testCrateFlags: list of flags to pass to the test executable + testInputs: list of packages that should be available during test execution + */ + crateWithTest = { crate, testCrate, testCrateFlags, testInputs, testPreRun, testPostRun }: + assert builtins.typeOf testCrateFlags == "list"; + assert builtins.typeOf testInputs == "list"; + assert builtins.typeOf testPreRun == "string"; + assert builtins.typeOf testPostRun == "string"; + let + # override the `crate` so that it will build and execute tests instead of + # building the actual lib and bin targets We just have to pass `--test` + # to rustc and it will do the right thing. We execute the tests and copy + # their log and the test executables to $out for later inspection. + test = + let + drv = testCrate.override + ( + _: { + buildTests = true; + } + ); + # If the user hasn't set any pre/post commands, we don't want to + # insert empty lines. This means that any existing users of crate2nix + # don't get a spurious rebuild unless they set these explicitly. + testCommand = pkgs.lib.concatStringsSep "\n" + (pkgs.lib.filter (s: s != "") [ + testPreRun + "$f $testCrateFlags 2>&1 | tee -a $out" + testPostRun + ]); + in + pkgs.runCommand "run-tests-${testCrate.name}" + { + inherit testCrateFlags; + buildInputs = testInputs; + } '' + set -ex + + export RUST_BACKTRACE=1 + + # recreate a file hierarchy as when running tests with cargo + + # the source for test data + ${pkgs.xorg.lndir}/bin/lndir ${crate.src} + + # build outputs + testRoot=target/debug + mkdir -p $testRoot + + # executables of the crate + # we copy to prevent std::env::current_exe() to resolve to a store location + for i in ${crate}/bin/*; do + cp "$i" "$testRoot" + done + chmod +w -R . + + # test harness executables are suffixed with a hash, like cargo does + # this allows to prevent name collision with the main + # executables of the crate + hash=$(basename $out) + for file in ${drv}/tests/*; do + f=$testRoot/$(basename $file)-$hash + cp $file $f + ${testCommand} + done + ''; + in + pkgs.runCommand "${crate.name}-linked" + { + inherit (crate) outputs crateName; + passthru = (crate.passthru or { }) // { + inherit test; + }; + } '' + echo tested by ${test} + ${lib.concatMapStringsSep "\n" (output: "ln -s ${crate.${output}} ${"$"}${output}") crate.outputs} + ''; + + /* A restricted overridable version of builtRustCratesWithFeatures. */ + buildRustCrateWithFeatures = + { packageId + , features ? rootFeatures + , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null + , runTests ? false + , testCrateFlags ? [ ] + , testInputs ? [ ] + # Any command to run immediatelly before a test is executed. + , testPreRun ? "" + # Any command run immediatelly after a test is executed. + , testPostRun ? "" + }: + lib.makeOverridable + ( + { features + , crateOverrides + , runTests + , testCrateFlags + , testInputs + , testPreRun + , testPostRun + }: + let + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); + builtRustCrates = builtRustCratesWithFeatures { + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; + runTests = false; + }; + builtTestRustCrates = builtRustCratesWithFeatures { + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; + runTests = true; + }; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; + derivation = + if runTests then + crateWithTest + { + crate = drv; + testCrate = testDrv; + inherit testCrateFlags testInputs testPreRun testPostRun; + } + else drv; + in + derivation + ) + { inherit features crateOverrides runTests testCrateFlags testInputs testPreRun testPostRun; }; + + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc + for the corresponding crate. + */ + builtRustCratesWithFeatures = + { packageId + , features + , crateConfigs ? crates + , buildRustCrateForPkgsFunc + , runTests + , target ? defaultTarget + } @ args: + assert (builtins.isAttrs crateConfigs); + assert (builtins.isString packageId); + assert (builtins.isList features); + assert (builtins.isAttrs target); + assert (builtins.isBool runTests); + let + rootPackageId = packageId; + mergedFeatures = mergePackageFeatures + ( + args // { + inherit rootPackageId; + target = target // { test = runTests; }; + } + ); + # Memoize built packages so that reappearing packages are only built once. + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: + let + features = mergedFeatures."${packageId}" or [ ]; + crateConfig' = crateConfigs."${packageId}"; + crateConfig = + builtins.removeAttrs crateConfig' [ "resolvedDefaultFeatures" "devDependencies" ]; + devDependencies = + lib.optionals + (runTests && packageId == rootPackageId) + (crateConfig'.devDependencies or [ ]); + dependencies = + dependencyDerivations { + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; + dependencies = + (crateConfig.dependencies or [ ]) + ++ devDependencies; + }; + buildDependencies = + dependencyDerivations { + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; + dependencies = crateConfig.buildDependencies or [ ]; + }; + filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { + inherit dependencies features target; + }; + dependenciesWithRenames = + lib.filter (d: d ? "rename") + ( + filterEnabledDependenciesForThis + ( + (crateConfig.buildDependencies or [ ]) + ++ (crateConfig.dependencies or [ ]) + ++ devDependencies + ) + ); + # Crate renames have the form: + # + # { + # crate_name = [ + # { version = "1.2.3"; rename = "crate_name01"; } + # ]; + # # ... + # } + crateRenames = + let + grouped = + lib.groupBy + (dependency: dependency.name) + dependenciesWithRenames; + versionAndRename = dep: + let + package = crateConfigs."${dep.packageId}"; + in + { inherit (dep) rename; version = package.version; }; + in + lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; + in + buildRustCrateForPkgsFunc pkgs + ( + crateConfig // { + src = crateConfig.src or ( + pkgs.fetchurl rec { + name = "${crateConfig.crateName}-${crateConfig.version}.tar.gz"; + # https://www.pietroalbini.org/blog/downloading-crates-io/ + # Not rate-limited, CDN URL. + url = "https://static.crates.io/crates/${crateConfig.crateName}/${crateConfig.crateName}-${crateConfig.version}.crate"; + sha256 = + assert (lib.assertMsg (crateConfig ? sha256) "Missing sha256 for ${name}"); + crateConfig.sha256; + } + ); + extraRustcOpts = lib.lists.optional (targetFeatures != [ ]) "-C target-feature=${lib.concatMapStringsSep "," (x: "+${x}") targetFeatures}"; + inherit features dependencies buildDependencies crateRenames release; + } + ); + in + builtByPackageIdByPkgs; + + /* Returns the actual derivations for the given dependencies. */ + dependencyDerivations = + { buildByPackageId + , features + , dependencies + , target + }: + assert (builtins.isList features); + assert (builtins.isList dependencies); + assert (builtins.isAttrs target); + let + enabledDependencies = filterEnabledDependencies { + inherit dependencies features target; + }; + depDerivation = dependency: buildByPackageId dependency.packageId; + in + map depDerivation enabledDependencies; + + /* Returns a sanitized version of val with all values substituted that cannot + be serialized as JSON. + */ + sanitizeForJson = val: + if builtins.isAttrs val + then lib.mapAttrs (n: v: sanitizeForJson v) val + else if builtins.isList val + then builtins.map sanitizeForJson val + else if builtins.isFunction val + then "function" + else val; + + /* Returns various tools to debug a crate. */ + debugCrate = { packageId, target ? defaultTarget }: + assert (builtins.isString packageId); + let + debug = rec { + # The built tree as passed to buildRustCrate. + buildTree = buildRustCrateWithFeatures { + buildRustCrateForPkgsFunc = _: lib.id; + inherit packageId; + }; + sanitizedBuildTree = sanitizeForJson buildTree; + dependencyTree = sanitizeForJson + ( + buildRustCrateWithFeatures { + buildRustCrateForPkgsFunc = _: crate: { + "01_crateName" = crate.crateName or false; + "02_features" = crate.features or [ ]; + "03_dependencies" = crate.dependencies or [ ]; + }; + inherit packageId; + } + ); + mergedPackageFeatures = mergePackageFeatures { + features = rootFeatures; + inherit packageId target; + }; + diffedDefaultPackageFeatures = diffDefaultPackageFeatures { + inherit packageId target; + }; + }; + in + { internal = debug; }; + + /* Returns differences between cargo default features and crate2nix default + features. + + This is useful for verifying the feature resolution in crate2nix. + */ + diffDefaultPackageFeatures = + { crateConfigs ? crates + , packageId + , target + }: + assert (builtins.isAttrs crateConfigs); + let + prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); + mergedFeatures = + prefixValues + "crate2nix" + (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + configs = prefixValues "cargo" crateConfigs; + combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; + onlyInCargo = + builtins.attrNames + (lib.filterAttrs (n: v: !(v ? "crate2nix") && (v ? "cargo")) combined); + onlyInCrate2Nix = + builtins.attrNames + (lib.filterAttrs (n: v: (v ? "crate2nix") && !(v ? "cargo")) combined); + differentFeatures = lib.filterAttrs + ( + n: v: + (v ? "crate2nix") + && (v ? "cargo") + && (v.crate2nix.features or [ ]) != (v."cargo".resolved_default_features or [ ]) + ) + combined; + in + builtins.toJSON { + inherit onlyInCargo onlyInCrate2Nix differentFeatures; + }; + + /* Returns an attrset mapping packageId to the list of enabled features. + + If multiple paths to a dependency enable different features, the + corresponding feature sets are merged. Features in rust are additive. + */ + mergePackageFeatures = + { crateConfigs ? crates + , packageId + , rootPackageId ? packageId + , features ? rootFeatures + , dependencyPath ? [ crates.${packageId}.crateName ] + , featuresByPackageId ? { } + , target + # Adds devDependencies to the crate with rootPackageId. + , runTests ? false + , ... + } @ args: + assert (builtins.isAttrs crateConfigs); + assert (builtins.isString packageId); + assert (builtins.isString rootPackageId); + assert (builtins.isList features); + assert (builtins.isList dependencyPath); + assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isAttrs target); + assert (builtins.isBool runTests); + let + crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); + expandedFeatures = expandFeatures (crateConfig.features or { }) features; + enabledFeatures = enableFeatures (crateConfig.dependencies or [ ]) expandedFeatures; + depWithResolvedFeatures = dependency: + let + packageId = dependency.packageId; + features = dependencyFeatures enabledFeatures dependency; + in + { inherit packageId features; }; + resolveDependencies = cache: path: dependencies: + assert (builtins.isAttrs cache); + assert (builtins.isList dependencies); + let + enabledDependencies = filterEnabledDependencies { + inherit dependencies target; + features = enabledFeatures; + }; + directDependencies = map depWithResolvedFeatures enabledDependencies; + foldOverCache = op: lib.foldl op cache directDependencies; + in + foldOverCache + ( + cache: { packageId, features }: + let + cacheFeatures = cache.${packageId} or [ ]; + combinedFeatures = sortedUnique (cacheFeatures ++ features); + in + if cache ? ${packageId} && cache.${packageId} == combinedFeatures + then cache + else + mergePackageFeatures { + features = combinedFeatures; + featuresByPackageId = cache; + inherit crateConfigs packageId target runTests rootPackageId; + } + ); + cacheWithSelf = + let + cacheFeatures = featuresByPackageId.${packageId} or [ ]; + combinedFeatures = sortedUnique (cacheFeatures ++ enabledFeatures); + in + featuresByPackageId // { + "${packageId}" = combinedFeatures; + }; + cacheWithDependencies = + resolveDependencies cacheWithSelf "dep" + ( + crateConfig.dependencies or [ ] + ++ lib.optionals + (runTests && packageId == rootPackageId) + (crateConfig.devDependencies or [ ]) + ); + cacheWithAll = + resolveDependencies + cacheWithDependencies "build" + (crateConfig.buildDependencies or [ ]); + in + cacheWithAll; + + /* Returns the enabled dependencies given the enabled features. */ + filterEnabledDependencies = { dependencies, features, target }: + assert (builtins.isList dependencies); + assert (builtins.isList features); + assert (builtins.isAttrs target); + + lib.filter + ( + dep: + let + targetFunc = dep.target or (features: true); + in + targetFunc { inherit features target; } + && ( + !(dep.optional or false) + || builtins.any (doesFeatureEnableDependency dep) features + ) + ) + dependencies; + + /* Returns whether the given feature should enable the given dependency. */ + doesFeatureEnableDependency = dependency: feature: + let + name = dependency.rename or dependency.name; + prefix = "${name}/"; + len = builtins.stringLength prefix; + startsWithPrefix = builtins.substring 0 len feature == prefix; + in + feature == name || startsWithPrefix; + + /* Returns the expanded features for the given inputFeatures by applying the + rules in featureMap. + + featureMap is an attribute set which maps feature names to lists of further + feature names to enable in case this feature is selected. + */ + expandFeatures = featureMap: inputFeatures: + assert (builtins.isAttrs featureMap); + assert (builtins.isList inputFeatures); + let + expandFeature = feature: + assert (builtins.isString feature); + [ feature ] ++ (expandFeatures featureMap (featureMap."${feature}" or [ ])); + outFeatures = lib.concatMap expandFeature inputFeatures; + in + sortedUnique outFeatures; + + /* This function adds optional dependencies as features if they are enabled + indirectly by dependency features. This function mimics Cargo's behavior + described in a note at: + https://doc.rust-lang.org/nightly/cargo/reference/features.html#dependency-features + */ + enableFeatures = dependencies: features: + assert (builtins.isList features); + assert (builtins.isList dependencies); + let + additionalFeatures = lib.concatMap + ( + dependency: + assert (builtins.isAttrs dependency); + let + enabled = builtins.any (doesFeatureEnableDependency dependency) features; + in + if (dependency.optional or false) && enabled + then [ (dependency.rename or dependency.name) ] + else [ ] + ) + dependencies; + in + sortedUnique (features ++ additionalFeatures); + + /* + Returns the actual features for the given dependency. + + features: The features of the crate that refers this dependency. + */ + dependencyFeatures = features: dependency: + assert (builtins.isList features); + assert (builtins.isAttrs dependency); + let + defaultOrNil = + if dependency.usesDefaultFeatures or true + then [ "default" ] + else [ ]; + explicitFeatures = dependency.features or [ ]; + additionalDependencyFeatures = + let + dependencyPrefix = (dependency.rename or dependency.name) + "/"; + dependencyFeatures = + builtins.filter (f: lib.hasPrefix dependencyPrefix f) features; + in + builtins.map (lib.removePrefix dependencyPrefix) dependencyFeatures; + in + defaultOrNil ++ explicitFeatures ++ additionalDependencyFeatures; + + /* Sorts and removes duplicates from a list of strings. */ + sortedUnique = features: + assert (builtins.isList features); + assert (builtins.all builtins.isString features); + let + outFeaturesSet = lib.foldl (set: feature: set // { "${feature}" = 1; }) { } features; + outFeaturesUnique = builtins.attrNames outFeaturesSet; + in + builtins.sort (a: b: a < b) outFeaturesUnique; + + deprecationWarning = message: value: + if strictDeprecation + then builtins.throw "strictDeprecation enabled, aborting: ${message}" + else builtins.trace message value; + + # + # crate2nix/default.nix (excerpt end) + # + }; +} + diff --git a/pkgs/build-support/rust/build-rust-package/default.nix b/pkgs/build-support/rust/build-rust-package/default.nix new file mode 100644 index 0000000..cd90c68 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-package/default.nix @@ -0,0 +1,170 @@ +{ lib +, importCargoLock +, fetchCargoTarball +, stdenv +, callPackage +, cargoBuildHook +, cargoCheckHook +, cargoInstallHook +, cargoNextestHook +, cargoSetupHook +, cargo +, cargo-auditable +, buildPackages +, rustc +, libiconv +, windows +}: + +{ name ? "${args.pname}-${args.version}" + + # Name for the vendored dependencies tarball +, cargoDepsName ? name + +, src ? null +, srcs ? null +, preUnpack ? null +, unpackPhase ? null +, postUnpack ? null +, cargoPatches ? [] +, patches ? [] +, sourceRoot ? null +, logLevel ? "" +, buildInputs ? [] +, nativeBuildInputs ? [] +, cargoUpdateHook ? "" +, cargoDepsHook ? "" +, buildType ? "release" +, meta ? {} +, cargoLock ? null +, cargoVendorDir ? null +, checkType ? buildType +, buildNoDefaultFeatures ? false +, checkNoDefaultFeatures ? buildNoDefaultFeatures +, buildFeatures ? [ ] +, checkFeatures ? buildFeatures +, useNextest ? false +# Enable except on aarch64 pkgsStatic, where we use lld for reasons +, auditable ? !cargo-auditable.meta.broken && !(stdenv.hostPlatform.isStatic && stdenv.hostPlatform.isAarch64 && !stdenv.hostPlatform.isDarwin) + +, depsExtraArgs ? {} + +# Toggles whether a custom sysroot is created when the target is a .json file. +, __internal_dontAddSysroot ? false + +# Needed to `pushd`/`popd` into a subdir of a tarball if this subdir +# contains a Cargo.toml, but isn't part of a workspace (which is e.g. the +# case for `rustfmt`/etc from the `rust-sources). +# Otherwise, everything from the tarball would've been built/tested. +, buildAndTestSubdir ? null +, ... } @ args: + +assert cargoVendorDir == null && cargoLock == null + -> !(args ? cargoSha256 && args.cargoSha256 != null) && !(args ? cargoHash && args.cargoHash != null) + -> throw "cargoSha256, cargoHash, cargoVendorDir, or cargoLock must be set"; + +let + + cargoDeps = + if cargoVendorDir != null then null + else if cargoLock != null then importCargoLock cargoLock + else fetchCargoTarball ({ + inherit src srcs sourceRoot preUnpack unpackPhase postUnpack cargoUpdateHook; + name = cargoDepsName; + patches = cargoPatches; + } // lib.optionalAttrs (args ? cargoHash) { + hash = args.cargoHash; + } // lib.optionalAttrs (args ? cargoSha256) { + sha256 = args.cargoSha256; + } // depsExtraArgs); + + target = stdenv.hostPlatform.rust.rustcTargetSpec; + targetIsJSON = lib.hasSuffix ".json" target; + useSysroot = targetIsJSON && !__internal_dontAddSysroot; + + sysroot = callPackage ./sysroot { } { + inherit target; + shortTarget = stdenv.hostPlatform.rust.cargoShortTarget; + RUSTFLAGS = args.RUSTFLAGS or ""; + originalCargoToml = src + /Cargo.toml; # profile info is later extracted + }; + +in + +# Tests don't currently work for `no_std`, and all custom sysroots are currently built without `std`. +# See https://os.phil-opp.com/testing/ for more information. +assert useSysroot -> !(args.doCheck or true); + +stdenv.mkDerivation ((removeAttrs args [ "depsExtraArgs" "cargoUpdateHook" "cargoLock" ]) // lib.optionalAttrs useSysroot { + RUSTFLAGS = "--sysroot ${sysroot} " + (args.RUSTFLAGS or ""); +} // { + inherit buildAndTestSubdir cargoDeps; + + cargoBuildType = buildType; + + cargoCheckType = checkType; + + cargoBuildNoDefaultFeatures = buildNoDefaultFeatures; + + cargoCheckNoDefaultFeatures = checkNoDefaultFeatures; + + cargoBuildFeatures = buildFeatures; + + cargoCheckFeatures = checkFeatures; + + patchRegistryDeps = ./patch-registry-deps; + + nativeBuildInputs = nativeBuildInputs ++ lib.optionals auditable [ + (buildPackages.cargo-auditable-cargo-wrapper.override { + inherit cargo cargo-auditable; + }) + ] ++ [ + cargoBuildHook + (if useNextest then cargoNextestHook else cargoCheckHook) + cargoInstallHook + cargoSetupHook + rustc + ]; + + buildInputs = buildInputs + ++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv ] + ++ lib.optionals stdenv.hostPlatform.isMinGW [ windows.pthreads ]; + + patches = cargoPatches ++ patches; + + PKG_CONFIG_ALLOW_CROSS = + if stdenv.buildPlatform != stdenv.hostPlatform then 1 else 0; + + postUnpack = '' + eval "$cargoDepsHook" + + export RUST_LOG=${logLevel} + '' + (args.postUnpack or ""); + + configurePhase = args.configurePhase or '' + runHook preConfigure + runHook postConfigure + ''; + + doCheck = args.doCheck or true; + + strictDeps = true; + + meta = { + # default to Rust's platforms + platforms = rustc.meta.platforms ++ [ + # Platforms without host tools from + # https://doc.rust-lang.org/nightly/rustc/platform-support.html + "armv7a-darwin" + "armv5tel-linux" "armv7a-linux" "m68k-linux" "mipsel-linux" + "mips64el-linux" "riscv32-linux" + "armv6l-netbsd" + "x86_64-redox" + "wasm32-wasi" + ]; + badPlatforms = [ + # Rust is currently unable to target the n32 ABI + lib.systems.inspect.patterns.isMips64n32 + ]; + } // meta; +}) diff --git a/pkgs/build-support/rust/build-rust-package/patch-registry-deps/pkg-config b/pkgs/build-support/rust/build-rust-package/patch-registry-deps/pkg-config new file mode 100644 index 0000000..fbb0943 --- /dev/null +++ b/pkgs/build-support/rust/build-rust-package/patch-registry-deps/pkg-config @@ -0,0 +1,8 @@ +for dir in pkg-config-*; do + [ -d "$dir" ] || continue + + echo "Patching pkg-config registry dep" + + substituteInPlace "$dir/src/lib.rs" \ + --replace '"/usr"' '"'"$NIX_STORE"'/"' +done diff --git a/pkgs/build-support/rust/build-rust-package/sysroot/default.nix b/pkgs/build-support/rust/build-rust-package/sysroot/default.nix new file mode 100644 index 0000000..bb95b7b --- /dev/null +++ b/pkgs/build-support/rust/build-rust-package/sysroot/default.nix @@ -0,0 +1,35 @@ +{ lib, stdenv, rustPlatform, buildPackages }: + +{ shortTarget, originalCargoToml, target, RUSTFLAGS }: + +let + cargoSrc = import ../../sysroot/src.nix { + inherit lib stdenv rustPlatform buildPackages originalCargoToml; + }; +in rustPlatform.buildRustPackage { + inherit target RUSTFLAGS; + + name = "custom-sysroot"; + src = cargoSrc; + + RUSTC_BOOTSTRAP = 1; + __internal_dontAddSysroot = true; + cargoSha256 = "sha256-zgkwevitxsu1C4OgGTsqNSc0gDxaNXYK1WPbfER48d0="; + + doCheck = false; + + installPhase = '' + export LIBS_DIR=$out/lib/rustlib/${shortTarget}/lib + mkdir -p $LIBS_DIR + for f in target/${shortTarget}/release/deps/*.{rlib,rmeta}; do + cp $f $LIBS_DIR + done + + export RUST_SYSROOT=$(rustc --print=sysroot) + host=${stdenv.buildPlatform.rust.rustcTarget} + cp -r $RUST_SYSROOT/lib/rustlib/$host $out + ''; + + # allows support for cross-compilation + meta.platforms = lib.platforms.all; +} diff --git a/pkgs/build-support/rust/default-crate-overrides.nix b/pkgs/build-support/rust/default-crate-overrides.nix new file mode 100644 index 0000000..92c71df --- /dev/null +++ b/pkgs/build-support/rust/default-crate-overrides.nix @@ -0,0 +1,311 @@ +{ lib +, stdenv +, atk +, pkg-config +, curl +, darwin +, libgit2 +, gtk3 +, libssh2 +, openssl +, sqlite +, zlib +, dbus +, dbus-glib +, gdk-pixbuf +, cairo +, python3 +, libsodium +, postgresql +, gmp +, gobject-introspection +, foundationdb +, capnproto +, nettle +, gtk4 +, clang +, llvmPackages +, linux-pam +, pango +, cmake +, glib +, freetype +, fontconfig +, rdkafka +, udev +, libevdev +, alsa-lib +, graphene +, protobuf +, autoconf +, automake +, libtool +, seatd # =libseat +, ... +}: + +let + inherit (darwin.apple_sdk.frameworks) CoreFoundation Security; +in +{ + alsa-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ alsa-lib ]; + }; + + cairo-rs = attrs: { + buildInputs = [ cairo ]; + }; + + cairo-sys-rs = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ cairo ]; + }; + + capnp-rpc = attrs: { + nativeBuildInputs = [ capnproto ]; + }; + + cargo = attrs: { + buildInputs = [ openssl zlib curl ] + ++ lib.optionals stdenv.isDarwin [ CoreFoundation Security ]; + }; + + libz-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ zlib ]; + extraLinkFlags = [ "-L${zlib.out}/lib" ]; + }; + + curl-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ zlib curl ]; + propagatedBuildInputs = [ curl zlib ]; + extraLinkFlags = [ "-L${zlib.out}/lib" ]; + }; + + dbus = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ dbus ]; + }; + + evdev-sys = attrs: { + nativeBuildInputs = [ + pkg-config + ] ++ lib.optionals (stdenv.buildPlatform.config != stdenv.hostPlatform.config) [ + python3 autoconf automake libtool + ]; + buildInputs = [ libevdev ]; + + # This prevents libevdev's build.rs from trying to `git fetch` when HOST!=TARGET + prePatch = '' + touch libevdev/.git + ''; + }; + + expat-sys = attrs: { + nativeBuildInputs = [ cmake ]; + }; + + foundationdb-sys = attrs: { + buildInputs = [ foundationdb ]; + # needed for 0.4+ release, when the FFI bindings are auto-generated + # + # patchPhase = '' + # substituteInPlace ./foundationdb-sys/build.rs \ + # --replace /usr/local/include ${foundationdb.dev}/include + # ''; + }; + + foundationdb = attrs: { + buildInputs = [ foundationdb ]; + }; + + freetype-sys = attrs: { + nativeBuildInputs = [ cmake ]; + buildInputs = [ freetype ]; + }; + + glib-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ glib ]; + }; + + gobject-sys = attrs: { + buildInputs = [ dbus-glib ]; + }; + + gio-sys = attrs: { + buildInputs = [ dbus-glib ]; + }; + + gdk-pixbuf-sys = attrs: { + buildInputs = [ dbus-glib ]; + }; + + gdk-pixbuf = attrs: { + buildInputs = [ gdk-pixbuf ]; + }; + + gtk-sys = attrs: { + buildInputs = [ gtk3 ]; + nativeBuildInputs = [ pkg-config ]; + }; + + gtk4-sys = attrs: { + buildInputs = [ gtk4 ]; + nativeBuildInputs = [ pkg-config ]; + }; + + gdk4-sys = attrs: { + buildInputs = [ gtk4 ]; + nativeBuildInputs = [ pkg-config ]; + }; + + gsk4-sys = attrs: { + buildInputs = [ gtk4 ]; + nativeBuildInputs = [ pkg-config ]; + }; + + libgit2-sys = attrs: { + LIBGIT2_SYS_USE_PKG_CONFIG = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ openssl zlib libgit2 ]; + }; + + libseat-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ seatd ]; + }; + + libsqlite3-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ sqlite ]; + }; + + libssh2-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ openssl zlib libssh2 ]; + }; + + libdbus-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ dbus ]; + }; + + libudev-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ udev ]; + }; + + graphene-sys = attrs: { + nativeBuildInputs = [ pkg-config gobject-introspection ]; + buildInputs = [ graphene ]; + }; + + nettle-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ nettle clang ]; + LIBCLANG_PATH = "${llvmPackages.libclang.lib}/lib"; + }; + + openssl = attrs: { + buildInputs = [ openssl ]; + }; + + openssl-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ openssl ]; + }; + + pam-sys = attr: { + buildInputs = [ linux-pam ]; + }; + + pango-sys = attr: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ pango ]; + }; + + pq-sys = attr: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ postgresql ]; + }; + + prost-build = attr: { + nativeBuildInputs = [ protobuf ]; + }; + + rdkafka-sys = attr: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ rdkafka ]; + }; + + rink = attrs: { + buildInputs = [ gmp ]; + crateBin = [{ name = "rink"; path = "src/bin/rink.rs"; }]; + }; + + security-framework-sys = attr: { + propagatedBuildInputs = lib.optional stdenv.isDarwin Security; + }; + + sequoia-openpgp = attrs: { + buildInputs = [ gmp ]; + }; + + sequoia-openpgp-ffi = attrs: { + buildInputs = [ gmp ]; + }; + + sequoia-ipc = attrs: { + buildInputs = [ gmp ]; + }; + + sequoia-guide = attrs: { + buildInputs = [ gmp ]; + }; + + pangocairo-sys = attr: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ pango ]; + }; + + sequoia-store = attrs: { + nativeBuildInputs = [ capnproto ]; + buildInputs = [ sqlite gmp ]; + }; + + sequoia-sq = attrs: { + buildInputs = [ sqlite gmp ]; + }; + + sequoia-tool = attrs: { + nativeBuildInputs = [ capnproto ]; + buildInputs = [ sqlite gmp ]; + }; + + serde_derive = attrs: { + buildInputs = lib.optional stdenv.isDarwin Security; + }; + + servo-fontconfig-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ freetype fontconfig ]; + }; + + thrussh-libsodium = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libsodium ]; + }; + + xcb = attrs: { + buildInputs = [ python3 ]; + }; + + atk-sys = attrs: { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ atk ]; + }; + +} diff --git a/pkgs/build-support/rust/fetch-cargo-tarball/cargo-vendor-normalise.py b/pkgs/build-support/rust/fetch-cargo-tarball/cargo-vendor-normalise.py new file mode 100755 index 0000000..90933b0 --- /dev/null +++ b/pkgs/build-support/rust/fetch-cargo-tarball/cargo-vendor-normalise.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import sys + +import toml + + +def quote(s: str) -> str: + escaped = s.replace('"', r"\"").replace("\n", r"\n").replace("\\", "\\\\") + return '"{}"'.format(escaped) + + +def main() -> None: + data = toml.load(sys.stdin) + + # There is no dependency to vendor in this project. + if not list(data.keys()) == ["source"]: + return + + # this value is non deterministic + data["source"]["vendored-sources"]["directory"] = "@vendor@" + + lines = [] + inner = data["source"] + for source, attrs in sorted(inner.items()): + lines.append("[source.{}]".format(quote(source))) + if source == "vendored-sources": + lines.append('"directory" = "@vendor@"\n') + else: + for key, value in sorted(attrs.items()): + attr = "{} = {}".format(quote(key), quote(value)) + lines.append(attr) + lines.append("") + + result = "\n".join(lines) + real = toml.loads(result) + assert real == data, "output = {} while input = {}".format(real, data) + + print(result) + + +if __name__ == "__main__": + main() diff --git a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix new file mode 100644 index 0000000..adbfe98 --- /dev/null +++ b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix @@ -0,0 +1,116 @@ +{ lib, stdenv, cacert, git, cargo, python3 }: +let cargo-vendor-normalise = stdenv.mkDerivation { + name = "cargo-vendor-normalise"; + src = ./cargo-vendor-normalise.py; + nativeBuildInputs = [ python3.pkgs.wrapPython ]; + dontUnpack = true; + installPhase = "install -D $src $out/bin/cargo-vendor-normalise"; + pythonPath = [ python3.pkgs.toml ]; + postFixup = "wrapPythonPrograms"; + doInstallCheck = true; + installCheckPhase = '' + # check that ../fetchcargo-default-config.toml is a fix point + reference=${../fetchcargo-default-config.toml} + < $reference $out/bin/cargo-vendor-normalise > test; + cmp test $reference + ''; + preferLocalBuild = true; +}; +in +{ name ? "cargo-deps" +, src ? null +, srcs ? [] +, patches ? [] +, sourceRoot ? "" +, cargoUpdateHook ? "" +, nativeBuildInputs ? [] +, ... +} @ args: + +let hash_ = + if args ? hash then + { + outputHashAlgo = if args.hash == "" then "sha256" else null; + outputHash = args.hash; + } + else if args ? sha256 then { outputHashAlgo = "sha256"; outputHash = args.sha256; } + else throw "fetchCargoTarball requires a hash for ${name}"; +in stdenv.mkDerivation ({ + name = "${name}-vendor.tar.gz"; + nativeBuildInputs = [ cacert git cargo-vendor-normalise cargo ] ++ nativeBuildInputs; + + buildPhase = '' + runHook preBuild + + # Ensure deterministic Cargo vendor builds + export SOURCE_DATE_EPOCH=1 + + if [[ ! -f Cargo.lock ]]; then + echo + echo "ERROR: The Cargo.lock file doesn't exist" + echo + echo "Cargo.lock is needed to make sure that cargoHash/cargoSha256 doesn't change" + echo "when the registry is updated." + echo + + exit 1 + fi + + # Keep the original around for copyLockfile + cp Cargo.lock Cargo.lock.orig + + export CARGO_HOME=$(mktemp -d cargo-home.XXX) + CARGO_CONFIG=$(mktemp cargo-config.XXXX) + + if [[ -n "$NIX_CRATES_INDEX" ]]; then + cat >$CARGO_HOME/config.toml < $CARGO_CONFIG + + # Create an empty vendor directory when there is no dependency to vendor + mkdir -p $name + # Add the Cargo.lock to allow hash invalidation + cp Cargo.lock.orig $name/Cargo.lock + + # Packages with git dependencies generate non-default cargo configs, so + # always install it rather than trying to write a standard default template. + install -D $CARGO_CONFIG $name/.cargo/config; + + runHook postBuild + ''; + + # Build a reproducible tar, per instructions at https://reproducible-builds.org/docs/archives/ + installPhase = '' + tar --owner=0 --group=0 --numeric-owner --format=gnu \ + --sort=name --mtime="@$SOURCE_DATE_EPOCH" \ + -czf $out $name + ''; + + inherit (hash_) outputHashAlgo outputHash; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; +} // (builtins.removeAttrs args [ + "name" "sha256" "cargoUpdateHook" "nativeBuildInputs" +])) diff --git a/pkgs/build-support/rust/fetchcargo-default-config.toml b/pkgs/build-support/rust/fetchcargo-default-config.toml new file mode 100755 index 0000000..dd8ebbc --- /dev/null +++ b/pkgs/build-support/rust/fetchcargo-default-config.toml @@ -0,0 +1,7 @@ +[source."crates-io"] +"replace-with" = "vendored-sources" + +[source."vendored-sources"] +"directory" = "@vendor@" + + diff --git a/pkgs/build-support/rust/fetchcrate.nix b/pkgs/build-support/rust/fetchcrate.nix new file mode 100644 index 0000000..423f4d7 --- /dev/null +++ b/pkgs/build-support/rust/fetchcrate.nix @@ -0,0 +1,20 @@ +{ lib, fetchzip, fetchurl }: + +{ crateName ? args.pname +, pname ? null + # The `dl` field of the registry's index configuration + # https://doc.rust-lang.org/cargo/reference/registry-index.html#index-configuration +, registryDl ? "https://crates.io/api/v1/crates" +, version +, unpack ? true +, ... +} @ args: + +assert pname == null || pname == crateName; + +(if unpack then fetchzip else fetchurl) ({ + name = "${crateName}-${version}.tar.gz"; + url = "${registryDl}/${crateName}/${version}/download"; +} // lib.optionalAttrs unpack { + extension = "tar.gz"; +} // removeAttrs args [ "crateName" "pname" "registryDl" "version" "unpack" ]) diff --git a/pkgs/build-support/rust/hooks/cargo-build-hook.sh b/pkgs/build-support/rust/hooks/cargo-build-hook.sh new file mode 100644 index 0000000..ed982c7 --- /dev/null +++ b/pkgs/build-support/rust/hooks/cargo-build-hook.sh @@ -0,0 +1,53 @@ +declare -a cargoBuildFlags + +cargoBuildHook() { + echo "Executing cargoBuildHook" + + runHook preBuild + + # Let stdenv handle stripping, for consistency and to not break + # separateDebugInfo. + export "CARGO_PROFILE_${cargoBuildType@U}_STRIP"=false + + if [ ! -z "${buildAndTestSubdir-}" ]; then + # ensure the output doesn't end up in the subdirectory + export CARGO_TARGET_DIR="$(pwd)/target" + + pushd "${buildAndTestSubdir}" + fi + + if [ "${cargoBuildType}" != "debug" ]; then + cargoBuildProfileFlag="--profile ${cargoBuildType}" + fi + + if [ -n "${cargoBuildNoDefaultFeatures-}" ]; then + cargoBuildNoDefaultFeaturesFlag=--no-default-features + fi + + if [ -n "${cargoBuildFeatures-}" ]; then + cargoBuildFeaturesFlag="--features=${cargoBuildFeatures// /,}" + fi + + ( + set -x + @setEnv@ cargo build -j $NIX_BUILD_CORES \ + --target @rustHostPlatformSpec@ \ + --frozen \ + ${cargoBuildProfileFlag} \ + ${cargoBuildNoDefaultFeaturesFlag} \ + ${cargoBuildFeaturesFlag} \ + ${cargoBuildFlags} + ) + + if [ ! -z "${buildAndTestSubdir-}" ]; then + popd + fi + + runHook postBuild + + echo "Finished cargoBuildHook" +} + +if [ -z "${dontCargoBuild-}" ] && [ -z "${buildPhase-}" ]; then + buildPhase=cargoBuildHook +fi diff --git a/pkgs/build-support/rust/hooks/cargo-check-hook.sh b/pkgs/build-support/rust/hooks/cargo-check-hook.sh new file mode 100644 index 0000000..971a140 --- /dev/null +++ b/pkgs/build-support/rust/hooks/cargo-check-hook.sh @@ -0,0 +1,55 @@ +declare -a checkFlags +declare -a cargoTestFlags + +cargoCheckHook() { + echo "Executing cargoCheckHook" + + runHook preCheck + + if [[ -n "${buildAndTestSubdir-}" ]]; then + pushd "${buildAndTestSubdir}" + fi + + if [[ -z ${dontUseCargoParallelTests-} ]]; then + threads=$NIX_BUILD_CORES + else + threads=1 + fi + + if [ "${cargoCheckType}" != "debug" ]; then + cargoCheckProfileFlag="--profile ${cargoCheckType}" + fi + + if [ -n "${cargoCheckNoDefaultFeatures-}" ]; then + cargoCheckNoDefaultFeaturesFlag=--no-default-features + fi + + if [ -n "${cargoCheckFeatures-}" ]; then + cargoCheckFeaturesFlag="--features=${cargoCheckFeatures// /,}" + fi + + argstr="${cargoCheckProfileFlag} ${cargoCheckNoDefaultFeaturesFlag} ${cargoCheckFeaturesFlag} + --target @rustHostPlatformSpec@ --frozen ${cargoTestFlags}" + + ( + set -x + cargo test \ + -j $NIX_BUILD_CORES \ + ${argstr} -- \ + --test-threads=${threads} \ + ${checkFlags} \ + ${checkFlagsArray+"${checkFlagsArray[@]}"} + ) + + if [[ -n "${buildAndTestSubdir-}" ]]; then + popd + fi + + echo "Finished cargoCheckHook" + + runHook postCheck +} + +if [ -z "${dontCargoCheck-}" ] && [ -z "${checkPhase-}" ]; then + checkPhase=cargoCheckHook +fi diff --git a/pkgs/build-support/rust/hooks/cargo-install-hook.sh b/pkgs/build-support/rust/hooks/cargo-install-hook.sh new file mode 100644 index 0000000..24a6e6f --- /dev/null +++ b/pkgs/build-support/rust/hooks/cargo-install-hook.sh @@ -0,0 +1,49 @@ +cargoInstallPostBuildHook() { + echo "Executing cargoInstallPostBuildHook" + + releaseDir=target/@targetSubdirectory@/$cargoBuildType + tmpDir="${releaseDir}-tmp"; + + mkdir -p $tmpDir + cp -r ${releaseDir}/* $tmpDir/ + bins=$(find $tmpDir \ + -maxdepth 1 \ + -type f \ + -executable ! \( -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \)) + + echo "Finished cargoInstallPostBuildHook" +} + +cargoInstallHook() { + echo "Executing cargoInstallHook" + + runHook preInstall + + # rename the output dir to a architecture independent one + + releaseDir=target/@targetSubdirectory@/$cargoBuildType + tmpDir="${releaseDir}-tmp"; + + mapfile -t targets < <(find "$NIX_BUILD_TOP" -type d | grep "${tmpDir}$") + for target in "${targets[@]}"; do + rm -rf "$target/../../${cargoBuildType}" + ln -srf "$target" "$target/../../" + done + mkdir -p $out/bin $out/lib + + xargs -r cp -t $out/bin <<< $bins + find $tmpDir \ + -maxdepth 1 \ + -regex ".*\.\(so.[0-9.]+\|so\|a\|dylib\)" \ + -print0 | xargs -r -0 cp -t $out/lib + rmdir --ignore-fail-on-non-empty $out/lib $out/bin + runHook postInstall + + echo "Finished cargoInstallHook" +} + + +if [ -z "${dontCargoInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=cargoInstallHook + postBuildHooks+=(cargoInstallPostBuildHook) +fi diff --git a/pkgs/build-support/rust/hooks/cargo-nextest-hook.sh b/pkgs/build-support/rust/hooks/cargo-nextest-hook.sh new file mode 100644 index 0000000..29ba18a --- /dev/null +++ b/pkgs/build-support/rust/hooks/cargo-nextest-hook.sh @@ -0,0 +1,54 @@ +declare -a checkFlags +declare -a cargoTestFlags + +cargoNextestHook() { + echo "Executing cargoNextestHook" + + runHook preCheck + + if [[ -n "${buildAndTestSubdir-}" ]]; then + pushd "${buildAndTestSubdir}" + fi + + if [[ -z ${dontUseCargoParallelTests-} ]]; then + threads=$NIX_BUILD_CORES + else + threads=1 + fi + + if [ "${cargoCheckType}" != "debug" ]; then + cargoCheckProfileFlag="--cargo-profile ${cargoCheckType}" + fi + + if [ -n "${cargoCheckNoDefaultFeatures-}" ]; then + cargoCheckNoDefaultFeaturesFlag=--no-default-features + fi + + if [ -n "${cargoCheckFeatures-}" ]; then + cargoCheckFeaturesFlag="--features=${cargoCheckFeatures// /,}" + fi + + argstr="${cargoCheckProfileFlag} ${cargoCheckNoDefaultFeaturesFlag} ${cargoCheckFeaturesFlag} + --target @rustHostPlatformSpec@ --frozen ${cargoTestFlags}" + + ( + set -x + cargo nextest run \ + -j ${threads} \ + ${argstr} -- \ + ${checkFlags} \ + ${checkFlagsArray+"${checkFlagsArray[@]}"} + ) + + if [[ -n "${buildAndTestSubdir-}" ]]; then + popd + fi + + echo "Finished cargoNextestHook" + + runHook postCheck +} + +if [ -z "${dontCargoCheck-}" ] && [ -z "${checkPhase-}" ]; then + checkPhase=cargoNextestHook +fi diff --git a/pkgs/build-support/rust/hooks/cargo-setup-hook.sh b/pkgs/build-support/rust/hooks/cargo-setup-hook.sh new file mode 100644 index 0000000..693c0b0 --- /dev/null +++ b/pkgs/build-support/rust/hooks/cargo-setup-hook.sh @@ -0,0 +1,93 @@ +cargoSetupPostUnpackHook() { + echo "Executing cargoSetupPostUnpackHook" + + # Some cargo builds include build hooks that modify their own vendor + # dependencies. This copies the vendor directory into the build tree and makes + # it writable. If we're using a tarball, the unpackFile hook already handles + # this for us automatically. + if [ -z $cargoVendorDir ]; then + if [ -d "$cargoDeps" ]; then + local dest=$(stripHash "$cargoDeps") + cp -Lr --reflink=auto -- "$cargoDeps" "$dest" + chmod -R +644 -- "$dest" + else + unpackFile "$cargoDeps" + fi + export cargoDepsCopy="$(realpath "$(stripHash $cargoDeps)")" + else + cargoDepsCopy="$(realpath "$(pwd)/$sourceRoot/${cargoRoot:+$cargoRoot/}${cargoVendorDir}")" + fi + + if [ ! -d .cargo ]; then + mkdir .cargo + fi + + config="$cargoDepsCopy/.cargo/config"; + if [[ ! -e $config ]]; then + config=@defaultConfig@ + fi; + + tmp_config=$(mktemp) + substitute $config $tmp_config \ + --subst-var-by vendor "$cargoDepsCopy" + cat ${tmp_config} >> .cargo/config + + cat >> .cargo/config <<'EOF' + @cargoConfig@ +EOF + + echo "Finished cargoSetupPostUnpackHook" +} + +# After unpacking and applying patches, check that the Cargo.lock matches our +# src package. Note that we do this after the patchPhase, because the +# patchPhase may create the Cargo.lock if upstream has not shipped one. +cargoSetupPostPatchHook() { + echo "Executing cargoSetupPostPatchHook" + + cargoDepsLockfile="$cargoDepsCopy/Cargo.lock" + srcLockfile="$(pwd)/${cargoRoot:+$cargoRoot/}Cargo.lock" + + echo "Validating consistency between $srcLockfile and $cargoDepsLockfile" + if ! @diff@ $srcLockfile $cargoDepsLockfile; then + + # If the diff failed, first double-check that the file exists, so we can + # give a friendlier error msg. + if ! [ -e $srcLockfile ]; then + echo "ERROR: Missing Cargo.lock from src. Expected to find it at: $srcLockfile" + echo "Hint: You can use the cargoPatches attribute to add a Cargo.lock manually to the build." + exit 1 + fi + + if ! [ -e $cargoDepsLockfile ]; then + echo "ERROR: Missing lockfile from cargo vendor. Expected to find it at: $cargoDepsLockfile" + exit 1 + fi + + echo + echo "ERROR: cargoHash or cargoSha256 is out of date" + echo + echo "Cargo.lock is not the same in $cargoDepsCopy" + echo + echo "To fix the issue:" + echo '1. Set cargoHash/cargoSha256 to an empty string: `cargoHash = "";`' + echo '2. Build the derivation and wait for it to fail with a hash mismatch' + echo '3. Copy the "got: sha256-..." value back into the cargoHash field' + echo ' You should have: cargoHash = "sha256-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=";' + echo + + exit 1 + fi + + unset cargoDepsCopy + + echo "Finished cargoSetupPostPatchHook" +} + +if [ -z "${dontCargoSetupPostUnpack-}" ]; then + postUnpackHooks+=(cargoSetupPostUnpackHook) +fi + +if [ -z ${cargoVendorDir-} ]; then + postPatchHooks+=(cargoSetupPostPatchHook) +fi diff --git a/pkgs/build-support/rust/hooks/default.nix b/pkgs/build-support/rust/hooks/default.nix new file mode 100644 index 0000000..874f23f --- /dev/null +++ b/pkgs/build-support/rust/hooks/default.nix @@ -0,0 +1,100 @@ +{ buildPackages +, callPackage +, cargo +, cargo-nextest +, clang +, lib +, makeSetupHook +, maturin +, rust +, rustc +, stdenv + +# This confusingly-named parameter indicates the *subdirectory of +# `target/` from which to copy the build artifacts. It is derived +# from a stdenv platform (or a JSON file). +, target ? stdenv.hostPlatform.rust.cargoShortTarget +}: + +{ + cargoBuildHook = callPackage ({ }: + makeSetupHook { + name = "cargo-build-hook.sh"; + propagatedBuildInputs = [ cargo ]; + substitutions = { + inherit (rust.envVars) rustHostPlatformSpec setEnv; + }; + } ./cargo-build-hook.sh) {}; + + cargoCheckHook = callPackage ({ }: + makeSetupHook { + name = "cargo-check-hook.sh"; + propagatedBuildInputs = [ cargo ]; + substitutions = { + inherit (rust.envVars) rustHostPlatformSpec; + }; + } ./cargo-check-hook.sh) {}; + + cargoInstallHook = callPackage ({ }: + makeSetupHook { + name = "cargo-install-hook.sh"; + propagatedBuildInputs = [ ]; + substitutions = { + targetSubdirectory = target; + }; + } ./cargo-install-hook.sh) {}; + + cargoNextestHook = callPackage ({ }: + makeSetupHook { + name = "cargo-nextest-hook.sh"; + propagatedBuildInputs = [ cargo cargo-nextest ]; + substitutions = { + inherit (rust.envVars) rustHostPlatformSpec; + }; + } ./cargo-nextest-hook.sh) {}; + + cargoSetupHook = callPackage ({ }: + makeSetupHook { + name = "cargo-setup-hook.sh"; + propagatedBuildInputs = [ ]; + substitutions = { + defaultConfig = ../fetchcargo-default-config.toml; + + # Specify the stdenv's `diff` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong `diff`. + diff = "${lib.getBin buildPackages.diffutils}/bin/diff"; + + cargoConfig = '' + [target."${stdenv.buildPlatform.rust.rustcTarget}"] + "linker" = "${rust.envVars.linkerForBuild}" + ${lib.optionalString (stdenv.buildPlatform.config != stdenv.hostPlatform.config) '' + [target."${stdenv.hostPlatform.rust.rustcTarget}"] + "linker" = "${rust.envVars.linkerForHost}" + ''} + "rustflags" = [ "-C", "target-feature=${if stdenv.hostPlatform.isStatic then "+" else "-"}crt-static" ] + ''; + }; + } ./cargo-setup-hook.sh) {}; + + maturinBuildHook = callPackage ({ pkgsHostTarget }: + makeSetupHook { + name = "maturin-build-hook.sh"; + propagatedBuildInputs = [ + pkgsHostTarget.maturin + pkgsHostTarget.cargo + pkgsHostTarget.rustc + ]; + substitutions = { + inherit (rust.envVars) rustTargetPlatformSpec setEnv; + }; + } ./maturin-build-hook.sh) {}; + + bindgenHook = callPackage ({}: makeSetupHook { + name = "rust-bindgen-hook"; + substitutions = { + libclang = clang.cc.lib; + inherit clang; + }; + } + ./rust-bindgen-hook.sh) {}; +} diff --git a/pkgs/build-support/rust/hooks/maturin-build-hook.sh b/pkgs/build-support/rust/hooks/maturin-build-hook.sh new file mode 100644 index 0000000..028441d --- /dev/null +++ b/pkgs/build-support/rust/hooks/maturin-build-hook.sh @@ -0,0 +1,36 @@ +maturinBuildHook() { + echo "Executing maturinBuildHook" + + runHook preBuild + + if [ ! -z "${buildAndTestSubdir-}" ]; then + pushd "${buildAndTestSubdir}" + fi + + ( + set -x + @setEnv@ maturin build \ + --jobs=$NIX_BUILD_CORES \ + --frozen \ + --target @rustTargetPlatformSpec@ \ + --manylinux off \ + --strip \ + --release \ + ${maturinBuildFlags-} + ) + + if [ ! -z "${buildAndTestSubdir-}" ]; then + popd + fi + + # Move the wheel to dist/ so that regular Python tooling can find it. + mkdir -p dist + mv ${cargoRoot:+$cargoRoot/}target/wheels/*.whl dist/ + + # These are python build hooks and may depend on ./dist + runHook postBuild + + echo "Finished maturinBuildHook" +} + +buildPhase=maturinBuildHook diff --git a/pkgs/build-support/rust/hooks/rust-bindgen-hook.sh b/pkgs/build-support/rust/hooks/rust-bindgen-hook.sh new file mode 100644 index 0000000..53624b1 --- /dev/null +++ b/pkgs/build-support/rust/hooks/rust-bindgen-hook.sh @@ -0,0 +1,13 @@ +# populates LIBCLANG_PATH and BINDGEN_EXTRA_CLANG_ARGS for rust projects that +# depend on the bindgen crate + +# if you modify this, you probably also need to modify the wrapper for the cli +# of bindgen in pkgs/development/tools/rust/bindgen/wrapper.sh + +populateBindgenEnv () { + export LIBCLANG_PATH=@libclang@/lib + BINDGEN_EXTRA_CLANG_ARGS="$(< @clang@/nix-support/cc-cflags) $(< @clang@/nix-support/libc-cflags) $(< @clang@/nix-support/libcxx-cxxflags) $NIX_CFLAGS_COMPILE" + export BINDGEN_EXTRA_CLANG_ARGS +} + +postHook="${postHook:-}"$'\n'"populateBindgenEnv"$'\n' diff --git a/pkgs/build-support/rust/import-cargo-lock.nix b/pkgs/build-support/rust/import-cargo-lock.nix new file mode 100644 index 0000000..e3fe57e --- /dev/null +++ b/pkgs/build-support/rust/import-cargo-lock.nix @@ -0,0 +1,262 @@ +{ fetchgit, fetchurl, lib, writers, python3Packages, runCommand, cargo, jq }: + +{ + # Cargo lock file + lockFile ? null + + # Cargo lock file contents as string +, lockFileContents ? null + + # Allow `builtins.fetchGit` to be used to not require hashes for git dependencies +, allowBuiltinFetchGit ? false + + # Additional registries to pull sources from + # { "https://" = "https://"; } + # where: + # - "index URL" is the "index" value of the configuration entry for that registry + # https://doc.rust-lang.org/cargo/reference/registries.html#using-an-alternate-registry + # - "download URL" is the "dl" value of its associated index configuration + # https://doc.rust-lang.org/cargo/reference/registry-index.html#index-configuration +, extraRegistries ? {} + + # Hashes for git dependencies. +, outputHashes ? {} +} @ args: + +assert (lockFile == null) != (lockFileContents == null); + +let + # Parse a git source into different components. + parseGit = src: + let + parts = builtins.match ''git\+([^?]+)(\?(rev|tag|branch)=(.*))?#(.*)'' src; + type = builtins.elemAt parts 2; # rev, tag or branch + value = builtins.elemAt parts 3; + in + if parts == null then null + else { + url = builtins.elemAt parts 0; + sha = builtins.elemAt parts 4; + } // lib.optionalAttrs (type != null) { inherit type value; }; + + # shadows args.lockFileContents + lockFileContents = + if lockFile != null + then builtins.readFile lockFile + else args.lockFileContents; + + parsedLockFile = builtins.fromTOML lockFileContents; + + packages = parsedLockFile.package; + + # There is no source attribute for the source package itself. But + # since we do not want to vendor the source package anyway, we can + # safely skip it. + depPackages = builtins.filter (p: p ? "source") packages; + + # Create dependent crates from packages. + # + # Force evaluation of the git SHA -> hash mapping, so that an error is + # thrown if there are stale hashes. We cannot rely on gitShaOutputHash + # being evaluated otherwise, since there could be no git dependencies. + depCrates = builtins.deepSeq gitShaOutputHash (builtins.map mkCrate depPackages); + + # Map package name + version to git commit SHA for packages with a git source. + namesGitShas = builtins.listToAttrs ( + builtins.map nameGitSha (builtins.filter (pkg: lib.hasPrefix "git+" pkg.source) depPackages) + ); + + nameGitSha = pkg: let gitParts = parseGit pkg.source; in { + name = "${pkg.name}-${pkg.version}"; + value = gitParts.sha; + }; + + # Convert the attrset provided through the `outputHashes` argument to a + # a mapping from git commit SHA -> output hash. + # + # There may be multiple different packages with different names + # originating from the same git repository (typically a Cargo + # workspace). By using the git commit SHA as a universal identifier, + # the user does not have to specify the output hash for every package + # individually. + gitShaOutputHash = lib.mapAttrs' (nameVer: hash: + let + unusedHash = throw "A hash was specified for ${nameVer}, but there is no corresponding git dependency."; + rev = namesGitShas.${nameVer} or unusedHash; in { + name = rev; + value = hash; + }) outputHashes; + + # We can't use the existing fetchCrate function, since it uses a + # recursive hash of the unpacked crate. + fetchCrate = pkg: downloadUrl: + let + checksum = pkg.checksum or parsedLockFile.metadata."checksum ${pkg.name} ${pkg.version} (${pkg.source})"; + in + assert lib.assertMsg (checksum != null) '' + Package ${pkg.name} does not have a checksum. + ''; + fetchurl { + name = "crate-${pkg.name}-${pkg.version}.tar.gz"; + url = "${downloadUrl}/${pkg.name}/${pkg.version}/download"; + sha256 = checksum; + }; + + registries = { + "https://github.com/rust-lang/crates.io-index" = "https://crates.io/api/v1/crates"; + } // extraRegistries; + + # Replaces values inherited by workspace members. + replaceWorkspaceValues = writers.writePython3 "replace-workspace-values" + { libraries = with python3Packages; [ tomli tomli-w ]; flakeIgnore = [ "E501" "W503" ]; } + (builtins.readFile ./replace-workspace-values.py); + + # Fetch and unpack a crate. + mkCrate = pkg: + let + gitParts = parseGit pkg.source; + registryIndexUrl = lib.removePrefix "registry+" pkg.source; + in + if lib.hasPrefix "registry+" pkg.source && builtins.hasAttr registryIndexUrl registries then + let + crateTarball = fetchCrate pkg registries.${registryIndexUrl}; + in runCommand "${pkg.name}-${pkg.version}" {} '' + mkdir $out + tar xf "${crateTarball}" -C $out --strip-components=1 + + # Cargo is happy with largely empty metadata. + printf '{"files":{},"package":"${crateTarball.outputHash}"}' > "$out/.cargo-checksum.json" + '' + else if gitParts != null then + let + missingHash = throw '' + No hash was found while vendoring the git dependency ${pkg.name}-${pkg.version}. You can add + a hash through the `outputHashes` argument of `importCargoLock`: + + outputHashes = { + "${pkg.name}-${pkg.version}" = ""; + }; + + If you use `buildRustPackage`, you can add this attribute to the `cargoLock` + attribute set. + ''; + tree = + if gitShaOutputHash ? ${gitParts.sha} then + fetchgit { + inherit (gitParts) url; + rev = gitParts.sha; # The commit SHA is always available. + sha256 = gitShaOutputHash.${gitParts.sha}; + } + else if allowBuiltinFetchGit then + builtins.fetchGit { + inherit (gitParts) url; + rev = gitParts.sha; + allRefs = true; + submodules = true; + } + else + missingHash; + in runCommand "${pkg.name}-${pkg.version}" {} '' + tree=${tree} + + # If the target package is in a workspace, or if it's the top-level + # crate, we should find the crate path using `cargo metadata`. + # Some packages do not have a Cargo.toml at the top-level, + # but only in nested directories. + # Only check the top-level Cargo.toml, if it actually exists + if [[ -f $tree/Cargo.toml ]]; then + crateCargoTOML=$(${cargo}/bin/cargo metadata --format-version 1 --no-deps --manifest-path $tree/Cargo.toml | \ + ${jq}/bin/jq -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path') + fi + + # If the repository is not a workspace the package might be in a subdirectory. + if [[ -z $crateCargoTOML ]]; then + for manifest in $(find $tree -name "Cargo.toml"); do + echo Looking at $manifest + crateCargoTOML=$(${cargo}/bin/cargo metadata --format-version 1 --no-deps --manifest-path "$manifest" | ${jq}/bin/jq -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path' || :) + if [[ ! -z $crateCargoTOML ]]; then + break + fi + done + + if [[ -z $crateCargoTOML ]]; then + >&2 echo "Cannot find path for crate '${pkg.name}-${pkg.version}' in the tree in: $tree" + exit 1 + fi + fi + + echo Found crate ${pkg.name} at $crateCargoTOML + tree=$(dirname $crateCargoTOML) + + cp -prvL "$tree/" $out + chmod u+w $out + + if grep -q workspace "$out/Cargo.toml"; then + chmod u+w "$out/Cargo.toml" + ${replaceWorkspaceValues} "$out/Cargo.toml" "$(${cargo}/bin/cargo metadata --format-version 1 --no-deps --manifest-path $crateCargoTOML | ${jq}/bin/jq -r .workspace_root)/Cargo.toml" + fi + + # Cargo is happy with empty metadata. + printf '{"files":{},"package":null}' > "$out/.cargo-checksum.json" + + # Set up configuration for the vendor directory. + cat > $out/.cargo-config < $out/.cargo/config <> $out/.cargo/config <> $out/.cargo/config + fi + fi + done + ''; +in + vendorDir diff --git a/pkgs/build-support/rust/lib/default.nix b/pkgs/build-support/rust/lib/default.nix new file mode 100644 index 0000000..e09f913 --- /dev/null +++ b/pkgs/build-support/rust/lib/default.nix @@ -0,0 +1,96 @@ +{ lib +, stdenv +, pkgsBuildHost +, pkgsBuildTarget +, pkgsTargetTarget +}: + +rec { + # These environment variables must be set when using `cargo-c` and + # several other tools which do not deal well with cross + # compilation. The symptom of the problem they fix is errors due + # to buildPlatform CFLAGS being passed to the + # hostPlatform-targeted compiler -- for example, `-m64` being + # passed on a build=x86_64/host=aarch64 compilation. + envVars = let + + # As a workaround for https://github.com/rust-lang/rust/issues/89626 use lld on pkgsStatic aarch64 + shouldUseLLD = platform: platform.isAarch64 && platform.isStatic && !stdenv.isDarwin; + + ccForBuild = "${pkgsBuildHost.stdenv.cc}/bin/${pkgsBuildHost.stdenv.cc.targetPrefix}cc"; + cxxForBuild = "${pkgsBuildHost.stdenv.cc}/bin/${pkgsBuildHost.stdenv.cc.targetPrefix}c++"; + linkerForBuild = ccForBuild; + + ccForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"; + cxxForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"; + linkerForHost = if shouldUseLLD stdenv.targetPlatform + && !stdenv.cc.bintools.isLLVM + then "${pkgsBuildHost.llvmPackages.bintools}/bin/${stdenv.cc.targetPrefix}ld.lld" + else ccForHost; + + # Unfortunately we must use the dangerous `pkgsTargetTarget` here + # because hooks are artificially phase-shifted one slot earlier + # (they go in nativeBuildInputs, so the hostPlatform looks like + # a targetPlatform to them). + ccForTarget = "${pkgsTargetTarget.stdenv.cc}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}cc"; + cxxForTarget = "${pkgsTargetTarget.stdenv.cc}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}c++"; + linkerForTarget = if shouldUseLLD pkgsTargetTarget.stdenv.targetPlatform + && !pkgsTargetTarget.stdenv.cc.bintools.isLLVM # whether stdenv's linker is lld already + then "${pkgsBuildTarget.llvmPackages.bintools}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}ld.lld" + else ccForTarget; + + rustBuildPlatform = stdenv.buildPlatform.rust.rustcTarget; + rustBuildPlatformSpec = stdenv.buildPlatform.rust.rustcTargetSpec; + rustHostPlatform = stdenv.hostPlatform.rust.rustcTarget; + rustHostPlatformSpec = stdenv.hostPlatform.rust.rustcTargetSpec; + rustTargetPlatform = stdenv.targetPlatform.rust.rustcTarget; + rustTargetPlatformSpec = stdenv.targetPlatform.rust.rustcTargetSpec; + in { + inherit + ccForBuild cxxForBuild linkerForBuild rustBuildPlatform rustBuildPlatformSpec + ccForHost cxxForHost linkerForHost rustHostPlatform rustHostPlatformSpec + ccForTarget cxxForTarget linkerForTarget rustTargetPlatform rustTargetPlatformSpec; + + # Prefix this onto a command invocation in order to set the + # variables needed by cargo. + # + setEnv = '' + env \ + '' + # Due to a bug in how splicing and pkgsTargetTarget works, in + # situations where pkgsTargetTarget is irrelevant + # pkgsTargetTarget.stdenv.cc is often simply wrong. We must omit + # the following lines when rustTargetPlatform collides with + # rustHostPlatform. + + lib.optionalString (rustTargetPlatform != rustHostPlatform) '' + "CC_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${ccForTarget}" \ + "CXX_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${cxxForTarget}" \ + "CARGO_TARGET_${stdenv.targetPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForTarget}" \ + '' + '' + "CC_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${ccForHost}" \ + "CXX_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${cxxForHost}" \ + "CARGO_TARGET_${stdenv.hostPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForHost}" \ + '' + '' + "CC_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${ccForBuild}" \ + "CXX_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${cxxForBuild}" \ + "CARGO_TARGET_${stdenv.buildPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForBuild}" \ + "CARGO_BUILD_TARGET=${rustBuildPlatform}" \ + "HOST_CC=${pkgsBuildHost.stdenv.cc}/bin/cc" \ + "HOST_CXX=${pkgsBuildHost.stdenv.cc}/bin/c++" \ + ''; + }; +} // lib.mapAttrs (old: new: platform: + # TODO: enable warning after 23.05 is EOL. + # lib.warn "`rust.${old} platform` is deprecated. Use `platform.rust.${new}` instead." + lib.getAttrFromPath new platform.rust) +{ + toTargetArch = [ "platform" "arch" ]; + toTargetOs = [ "platform" "os" ]; + toTargetFamily = [ "platform" "target-family" ]; + toTargetVendor = [ "platform" "vendor" ]; + toRustTarget = [ "rustcTarget" ]; + toRustTargetSpec = [ "rustcTargetSpec" ]; + toRustTargetSpecShort = [ "cargoShortTarget" ]; + toRustTargetForUseInEnvVars = [ "cargoEnvVarTarget" ]; + IsNoStdTarget = [ "isNoStdTarget" ]; +} diff --git a/pkgs/build-support/rust/replace-workspace-values.py b/pkgs/build-support/rust/replace-workspace-values.py new file mode 100644 index 0000000..2b88f1f --- /dev/null +++ b/pkgs/build-support/rust/replace-workspace-values.py @@ -0,0 +1,114 @@ +# This script implements the workspace inheritance mechanism described +# here: https://doc.rust-lang.org/cargo/reference/workspaces.html#the-package-table +# +# Please run `mypy --strict`, `black`, and `isort --profile black` on this after editing, thanks! + +import sys +from typing import Any + +import tomli +import tomli_w + + +def load_file(path: str) -> dict[str, Any]: + with open(path, "rb") as f: + return tomli.load(f) + + +def replace_key( + workspace_manifest: dict[str, Any], table: dict[str, Any], section: str, key: str +) -> bool: + if ( + isinstance(table[key], dict) + and "workspace" in table[key] + and table[key]["workspace"] is True + ): + print("replacing " + key) + + replaced = table[key] + del replaced["workspace"] + + workspace_copy = workspace_manifest[section][key] + + if section == "dependencies": + crate_features = replaced.get("features") + + if type(workspace_copy) is str: + replaced["version"] = workspace_copy + else: + replaced.update(workspace_copy) + + merged_features = (crate_features or []) + ( + workspace_copy.get("features") or [] + ) + + if len(merged_features) > 0: + # Dictionaries are guaranteed to be ordered (https://stackoverflow.com/a/7961425) + replaced["features"] = list(dict.fromkeys(merged_features)) + elif section == "package": + table[key] = replaced = workspace_copy + + return True + + return False + + +def replace_dependencies( + workspace_manifest: dict[str, Any], root: dict[str, Any] +) -> bool: + changed = False + + for key in ["dependencies", "dev-dependencies", "build-dependencies"]: + if key in root: + for k in root[key].keys(): + changed |= replace_key(workspace_manifest, root[key], "dependencies", k) + + return changed + + +def main() -> None: + top_cargo_toml = load_file(sys.argv[2]) + + if "workspace" not in top_cargo_toml: + # If top_cargo_toml is not a workspace manifest, then this script was probably + # ran on something that does not actually use workspace dependencies + print(f"{sys.argv[2]} is not a workspace manifest, doing nothing.") + return + + crate_manifest = load_file(sys.argv[1]) + workspace_manifest = top_cargo_toml["workspace"] + + if "workspace" in crate_manifest: + return + + changed = False + + for key in crate_manifest["package"].keys(): + changed |= replace_key( + workspace_manifest, crate_manifest["package"], "package", key + ) + + changed |= replace_dependencies(workspace_manifest, crate_manifest) + + if "target" in crate_manifest: + for key in crate_manifest["target"].keys(): + changed |= replace_dependencies( + workspace_manifest, crate_manifest["target"][key] + ) + + if ( + "lints" in crate_manifest + and "workspace" in crate_manifest["lints"] + and crate_manifest["lints"]["workspace"] is True + ): + crate_manifest["lints"] = workspace_manifest["lints"] + + if not changed: + return + + with open(sys.argv[1], "wb") as f: + tomli_w.dump(crate_manifest, f) + + +if __name__ == "__main__": + main() diff --git a/pkgs/build-support/rust/rustc-wrapper/default.nix b/pkgs/build-support/rust/rustc-wrapper/default.nix new file mode 100644 index 0000000..0defa63 --- /dev/null +++ b/pkgs/build-support/rust/rustc-wrapper/default.nix @@ -0,0 +1,52 @@ +{ lib, runCommand, rustc-unwrapped, sysroot ? null }: + +runCommand "${rustc-unwrapped.pname}-wrapper-${rustc-unwrapped.version}" { + preferLocalBuild = true; + strictDeps = true; + inherit (rustc-unwrapped) outputs; + + env = { + sysroot = lib.optionalString (sysroot != null) "--sysroot ${sysroot}"; + + # Upstream rustc still assumes that musl = static[1]. The fix for + # this is to disable crt-static by default for non-static musl + # targets. + # + # Even though Cargo will build build.rs files for the build platform, + # cross-compiling _from_ musl appears to work fine, so we only need + # to do this when rustc's target platform is dynamically linked musl. + # + # [1]: https://github.com/rust-lang/compiler-team/issues/422 + # + # WARNING: using defaultArgs is dangerous, as it will apply to all + # targets used by this compiler (host and target). This means + # that it can't be used to set arguments that should only be + # applied to the target. It's fine to do this for -crt-static, + # because rustc does not support +crt-static host platforms + # anyway. + defaultArgs = lib.optionalString + (with rustc-unwrapped.stdenv.targetPlatform; isMusl && !isStatic) + "-C target-feature=-crt-static"; + }; + + passthru = { + inherit (rustc-unwrapped) pname version src llvm llvmPackages; + unwrapped = rustc-unwrapped; + }; + + meta = rustc-unwrapped.meta // { + description = "${rustc-unwrapped.meta.description} (wrapper script)"; + priority = 10; + }; +} '' + mkdir -p $out/bin + ln -s ${rustc-unwrapped}/bin/* $out/bin + rm $out/bin/{rustc,rustdoc} + prog=${rustc-unwrapped}/bin/rustc extraFlagsVar=NIX_RUSTFLAGS \ + substituteAll ${./rustc-wrapper.sh} $out/bin/rustc + prog=${rustc-unwrapped}/bin/rustdoc extraFlagsVar=NIX_RUSTDOCFLAGS \ + substituteAll ${./rustc-wrapper.sh} $out/bin/rustdoc + chmod +x $out/bin/{rustc,rustdoc} + ${lib.concatMapStrings (output: "ln -s ${rustc-unwrapped.${output}} \$${output}\n") + (lib.remove "out" rustc-unwrapped.outputs)} +'' diff --git a/pkgs/build-support/rust/rustc-wrapper/rustc-wrapper.sh b/pkgs/build-support/rust/rustc-wrapper/rustc-wrapper.sh new file mode 100644 index 0000000..e33cc3e --- /dev/null +++ b/pkgs/build-support/rust/rustc-wrapper/rustc-wrapper.sh @@ -0,0 +1,29 @@ +#!@shell@ + +defaultSysroot=(@sysroot@) + +for arg; do + case "$arg" in + --sysroot|--sysroot=*) + defaultSysroot=() + ;; + --) + break + ;; + esac +done + +extraBefore=(@defaultArgs@ "${defaultSysroot[@]}") +extraAfter=($@extraFlagsVar@) + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "extra flags before to @prog@:" >&2 + printf " %q\n" "${extraBefore[@]}" >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" "$@" >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" "${extraAfter[@]}" >&2 +fi + +exec @prog@ "${extraBefore[@]}" "$@" "${extraAfter[@]}" diff --git a/pkgs/build-support/rust/sysroot/Cargo.lock b/pkgs/build-support/rust/sysroot/Cargo.lock new file mode 100644 index 0000000..d9b0c25 --- /dev/null +++ b/pkgs/build-support/rust/sysroot/Cargo.lock @@ -0,0 +1,44 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "alloc" +version = "0.0.0" +dependencies = [ + "compiler_builtins", + "core", +] + +[[package]] +name = "compiler_builtins" +version = "0.1.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f867ce54c09855ccd135ad4a50c777182a0c7af5ff20a8f537617bd648b10d50" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "core" +version = "0.0.0" + +[[package]] +name = "nixpkgs-sysroot-stub-crate" +version = "0.0.0" +dependencies = [ + "alloc", + "compiler_builtins", + "core", +] + +[[package]] +name = "rustc-std-workspace-core" +version = "1.99.0" +dependencies = [ + "core", +] + +[[patch.unused]] +name = "rustc-std-workspace-alloc" +version = "1.99.0" diff --git a/pkgs/build-support/rust/sysroot/cargo.py b/pkgs/build-support/rust/sysroot/cargo.py new file mode 100644 index 0000000..9d970ef --- /dev/null +++ b/pkgs/build-support/rust/sysroot/cargo.py @@ -0,0 +1,47 @@ +import os +import toml + +rust_src = os.environ['RUSTC_SRC'] +orig_cargo = os.environ['ORIG_CARGO'] if 'ORIG_CARGO' in os.environ else None + +base = { + 'package': { + 'name': 'nixpkgs-sysroot-stub-crate', + 'version': '0.0.0', + 'authors': ['The Rust Project Developers'], + 'edition': '2018', + }, + 'dependencies': { + 'compiler_builtins': { + 'version': '0.1.0', + 'features': ['rustc-dep-of-std', 'mem'], + }, + 'core': { + 'path': os.path.join(rust_src, 'core'), + }, + 'alloc': { + 'path': os.path.join(rust_src, 'alloc'), + }, + }, + 'patch': { + 'crates-io': { + 'rustc-std-workspace-core': { + 'path': os.path.join(rust_src, 'rustc-std-workspace-core'), + }, + 'rustc-std-workspace-alloc': { + 'path': os.path.join(rust_src, 'rustc-std-workspace-alloc'), + }, + }, + }, +} + +if orig_cargo is not None: + with open(orig_cargo, 'r') as f: + src = toml.loads(f.read()) + if 'profile' in src: + base['profile'] = src['profile'] + +out = toml.dumps(base) + +with open('Cargo.toml', 'x') as f: + f.write(out) diff --git a/pkgs/build-support/rust/sysroot/src.nix b/pkgs/build-support/rust/sysroot/src.nix new file mode 100644 index 0000000..664702e --- /dev/null +++ b/pkgs/build-support/rust/sysroot/src.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, rustPlatform, buildPackages +, originalCargoToml ? null +}: + +stdenv.mkDerivation { + name = "cargo-src"; + preferLocalBuild = true; + + unpackPhase = "true"; + dontConfigure = true; + dontBuild = true; + + installPhase = '' + export RUSTC_SRC=${rustPlatform.rustLibSrc.override { }} + '' + + lib.optionalString (originalCargoToml != null) '' + export ORIG_CARGO=${originalCargoToml} + '' + + '' + ${buildPackages.python3.withPackages (ps: with ps; [ toml ])}/bin/python3 ${./cargo.py} + mkdir -p $out/src + echo '#![no_std]' > $out/src/lib.rs + cp Cargo.toml $out/Cargo.toml + cp ${./Cargo.lock} $out/Cargo.lock + ''; +} diff --git a/pkgs/build-support/rust/sysroot/update-lockfile.sh b/pkgs/build-support/rust/sysroot/update-lockfile.sh new file mode 100755 index 0000000..d0596d1 --- /dev/null +++ b/pkgs/build-support/rust/sysroot/update-lockfile.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p python3 python3.pkgs.toml cargo + +set -eu pipefile + +HERE=$(readlink -e $(dirname "${BASH_SOURCE[0]}")) +NIXPKGS_ROOT="$HERE/../../../.." + +# https://unix.stackexchange.com/a/84980/390173 +tempdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'update-lockfile') +cd "$tempdir" +mkdir -p src +touch src/lib.rs + +RUSTC_SRC=$(nix-build "${NIXPKGS_ROOT}" -A pkgs.rustPlatform.rustLibSrc --no-out-link) + +ln -s $RUSTC_SRC/{core,alloc} ./ + +export RUSTC_SRC +python3 "$HERE/cargo.py" + +export RUSTC_BOOTSTRAP=1 +cargo generate-lockfile + +cp Cargo.lock "$HERE" + +rm -rf "$tempdir" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.lock new file mode 100644 index 0000000..522f9c2 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.lock @@ -0,0 +1,83 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "basic-dynamic" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.toml new file mode 100644 index 0000000..851024c --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "basic-dynamic" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = "0.8" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/default.nix new file mode 100644 index 0000000..1053032 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/default.nix @@ -0,0 +1,25 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "basic-dynamic"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock.lockFileContents = builtins.readFile ./Cargo.lock; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/basic-dynamic + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic-dynamic/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.lock new file mode 100644 index 0000000..fd1b5e4 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.lock @@ -0,0 +1,83 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "basic" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.toml new file mode 100644 index 0000000..f555bb0 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "basic" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = "0.8" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/basic/default.nix new file mode 100644 index 0000000..3253809 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic/default.nix @@ -0,0 +1,27 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "basic"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/basic + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/basic/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/basic/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/basic/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/default.nix new file mode 100644 index 0000000..26e6487 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/default.nix @@ -0,0 +1,20 @@ +{ callPackage, maturin, writers, python3Packages }: + +# Build like this from nixpkgs root: +# $ nix-build -A tests.importCargoLock +{ + basic = callPackage ./basic { }; + basicDynamic = callPackage ./basic-dynamic { }; + gitDependency = callPackage ./git-dependency { }; + gitDependencyRev = callPackage ./git-dependency-rev { }; + gitDependencyRevNonWorkspaceNestedCrate = callPackage ./git-dependency-rev-non-workspace-nested-crate { }; + gitDependencyTag = callPackage ./git-dependency-tag { }; + gitDependencyBranch = callPackage ./git-dependency-branch { }; + maturin = maturin.tests.pyo3; + v1 = callPackage ./v1 { }; + gitDependencyWorkspaceInheritance = callPackage ./git-dependency-workspace-inheritance { + replaceWorkspaceValues = writers.writePython3 "replace-workspace-values" + { libraries = with python3Packages; [ tomli tomli-w ]; flakeIgnore = [ "E501" "W503" ]; } + (builtins.readFile ../../replace-workspace-values.py); + }; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.lock new file mode 100644 index 0000000..e832b2e --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.lock @@ -0,0 +1,72 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-dependency-branch" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.4" +source = "git+https://github.com/rust-random/rand.git?branch=master#fcc5baf31565a94f63dce41c2e739e6f182475f4" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "git+https://github.com/rust-random/rand.git?branch=master#fcc5baf31565a94f63dce41c2e739e6f182475f4" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "git+https://github.com/rust-random/rand.git?branch=master#fcc5baf31565a94f63dce41c2e739e6f182475f4" +dependencies = [ + "getrandom", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.toml new file mode 100644 index 0000000..0702c5a --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "git-dependency-branch" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = { git = "https://github.com/rust-random/rand.git", branch = "master" } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/default.nix new file mode 100644 index 0000000..3111c74 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/default.nix @@ -0,0 +1,30 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "git-dependency-branch"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "rand-0.8.4" = "1ilk9wvfw3mdm57g199ys8f5nrgdrh0n3a4c8b7nz6lgnqvfrv6z"; + }; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/git-dependency-branch + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-branch/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.lock new file mode 100644 index 0000000..63ff1b3 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.lock @@ -0,0 +1,638 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "anyhow" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cargo-test-macro" +version = "0.1.0" +source = "git+https://github.com/rust-lang/cargo?branch=rust-1.53.0#4369396ce7d270972955d876eaa4954bea56bcd9" + +[[package]] +name = "cargo-test-support" +version = "0.1.0" +source = "git+https://github.com/rust-lang/cargo?branch=rust-1.53.0#4369396ce7d270972955d876eaa4954bea56bcd9" +dependencies = [ + "anyhow", + "cargo-test-macro", + "cargo-util", + "filetime", + "flate2", + "git2", + "glob", + "lazy_static", + "remove_dir_all", + "serde_json", + "tar", + "toml", + "url", +] + +[[package]] +name = "cargo-util" +version = "0.1.0" +source = "git+https://github.com/rust-lang/cargo?branch=rust-1.53.0#4369396ce7d270972955d876eaa4954bea56bcd9" +dependencies = [ + "anyhow", + "core-foundation", + "crypto-hash", + "filetime", + "hex 0.4.3", + "jobserver", + "libc", + "log", + "miow", + "same-file", + "shell-escape", + "tempfile", + "walkdir", + "winapi", +] + +[[package]] +name = "cc" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "commoncrypto" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007" +dependencies = [ + "commoncrypto-sys", +] + +[[package]] +name = "commoncrypto-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2" +dependencies = [ + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-hash" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a77162240fd97248d19a564a565eb563a3f592b386e4136fb300909e67dddca" +dependencies = [ + "commoncrypto", + "hex 0.3.2", + "openssl", + "winapi", +] + +[[package]] +name = "filetime" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "libz-sys", + "miniz_oxide", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-dependency-rev-non-workspace-nested-crate" +version = "0.1.0" +dependencies = [ + "cargo-test-support", +] + +[[package]] +name = "git2" +version = "0.13.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a8057932925d3a9d9e4434ea016570d37420ddb1ceed45a174d577f24ed6700" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" + +[[package]] +name = "libgit2-sys" +version = "0.12.24+1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddbd6021eef06fb289a8f54b3c2acfdd85ff2a585dfbb24b8576325373d2152c" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + +[[package]] +name = "libssh2-sys" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "openssl" +version = "0.10.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" + +[[package]] +name = "openssl-sys" +version = "0.9.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pkg-config" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10e2fcbb64ecbe64c8e040a386c3104d384583af58b956d870aaaf229df6e66d" + +[[package]] +name = "ppv-lite86" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ca011bd0129ff4ae15cd04c4eef202cadf6c51c21e47aba319b4e0501db741" + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" + +[[package]] +name = "serde_json" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + +[[package]] +name = "tar" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" +dependencies = [ + "filetime", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "tinyvec" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.toml new file mode 100644 index 0000000..61f1a08 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "git-dependency-rev-non-workspace-nested-crate" +version = "0.1.0" +authors = ["Stefan Junker "] +edition = "2018" + +[dependencies] +cargo-test-support = { git = "https://github.com/rust-lang/cargo", branch = "rust-1.53.0" } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/default.nix new file mode 100644 index 0000000..63e3bea --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/default.nix @@ -0,0 +1,40 @@ +{ rustPlatform, pkg-config, openssl, lib, darwin, stdenv }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "git-dependency-rev-non-workspace-nested-crate"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + nativeBuildInputs = [ + pkg-config + ]; + + buildInputs = [ + openssl + ] ++ lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.Security + ]; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "cargo-test-macro-0.1.0" = "1yy1y1d523xdzwg1gc77pigbcwsbawmy4b7vw8v21m7q957sk0c4"; + }; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/git-dependency-rev-non-workspace-nested-crate + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/src/main.rs new file mode 100644 index 0000000..cb4bfb5 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev-non-workspace-nested-crate/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("{}", cargo_test_support::t!(Result::<&str, &str>::Ok("msg"))); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.lock new file mode 100644 index 0000000..684d941 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.lock @@ -0,0 +1,81 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-dependency-rev" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.3" +source = "git+https://github.com/rust-random/rand.git?rev=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git?rev=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.1" +source = "git+https://github.com/rust-random/rand.git?rev=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git?rev=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.toml new file mode 100644 index 0000000..3500325 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "git-dependency-rev" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = { git = "https://github.com/rust-random/rand.git", rev = "0.8.3" } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/default.nix new file mode 100644 index 0000000..d3cb0fa --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/default.nix @@ -0,0 +1,30 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "git-dependency-rev"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "rand-0.8.3" = "0l3p174bpwia61vcvxz5mw65a13ri3wy94z04xrnyy5lzciykz4f"; + }; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/git-dependency-rev + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-rev/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.lock new file mode 100644 index 0000000..9f8ec19 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.lock @@ -0,0 +1,81 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-dependency-tag" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.3" +source = "git+https://github.com/rust-random/rand.git?tag=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git?tag=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.1" +source = "git+https://github.com/rust-random/rand.git?tag=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git?tag=0.8.3#6ecbe2626b2cc6110a25c97b1702b347574febc7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.toml new file mode 100644 index 0000000..1bda733 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "git-dependency-tag" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = { git = "https://github.com/rust-random/rand.git", tag = "0.8.3" } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/default.nix new file mode 100644 index 0000000..dfaa1e3 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/default.nix @@ -0,0 +1,30 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "git-dependency-tag"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "rand-0.8.3" = "0l3p174bpwia61vcvxz5mw65a13ri3wy94z04xrnyy5lzciykz4f"; + }; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/git-dependency-tag + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-tag/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/crate.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/crate.toml new file mode 100644 index 0000000..f7b62ae --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/crate.toml @@ -0,0 +1,13 @@ +[package] +name = "im_using_workspaces" +version = { workspace = true } +publish = false +keywords = [ + "workspace", + "other_thing", + "third_thing", +] + +[dependencies] +foo = { workspace = true, features = ["cat"] } +bar = "1.0.0" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/default.nix new file mode 100644 index 0000000..138b717 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/default.nix @@ -0,0 +1,7 @@ +{ replaceWorkspaceValues, runCommand }: + +runCommand "git-dependency-workspace-inheritance-test" { } '' + cp --no-preserve=mode ${./crate.toml} "$out" + ${replaceWorkspaceValues} "$out" ${./workspace.toml} + diff -u "$out" ${./want.toml} +'' diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/want.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/want.toml new file mode 100644 index 0000000..ec13314 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/want.toml @@ -0,0 +1,19 @@ +[package] +name = "im_using_workspaces" +version = "1.0.0" +publish = false +keywords = [ + "workspace", + "other_thing", + "third_thing", +] + +[dependencies] +bar = "1.0.0" + +[dependencies.foo] +features = [ + "cat", + "meow", +] +version = "1.0.0" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/workspace.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/workspace.toml new file mode 100644 index 0000000..c58112a --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency-workspace-inheritance/workspace.toml @@ -0,0 +1,5 @@ +[workspace.package] +version = "1.0.0" + +[workspace.dependencies] +foo = { version = "1.0.0", features = ["meow"] } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.lock new file mode 100644 index 0000000..fa71865 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.lock @@ -0,0 +1,81 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git-dependency" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "rand" +version = "0.8.3" +source = "git+https://github.com/rust-random/rand.git#f0e01ee0a7257753cc51b291f62666f4765923ef" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git#f0e01ee0a7257753cc51b291f62666f4765923ef" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "git+https://github.com/rust-random/rand.git#f0e01ee0a7257753cc51b291f62666f4765923ef" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "git+https://github.com/rust-random/rand.git#f0e01ee0a7257753cc51b291f62666f4765923ef" +dependencies = [ + "rand_core", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.toml new file mode 100644 index 0000000..a902dea --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "git-dependency" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = { git = "https://github.com/rust-random/rand.git" } diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/default.nix new file mode 100644 index 0000000..98aa35b --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/default.nix @@ -0,0 +1,30 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "git-dependency"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "rand-0.8.3" = "0ya2hia3cn31qa8894s3av2s8j5bjwb6yq92k0jsnlx7jid0jwqa"; + }; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/git-dependency + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/git-dependency/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.lock b/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.lock new file mode 100644 index 0000000..fe976f0 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.lock @@ -0,0 +1,85 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.94 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.10.2+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.94" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.94 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ppv-lite86 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "getrandom 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "v1" +version = "0.1.0" +dependencies = [ + "rand 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +"checksum getrandom 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +"checksum libc 0.2.94 (registry+https://github.com/rust-lang/crates.io-index)" = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" +"checksum ppv-lite86 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +"checksum rand 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +"checksum rand_chacha 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +"checksum rand_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +"checksum rand_hc 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +"checksum wasi 0.10.2+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.toml b/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.toml new file mode 100644 index 0000000..4b825c4 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/v1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "v1" +version = "0.1.0" +authors = ["Daniël de Kok "] +edition = "2018" + +[dependencies] +rand = "0.8" diff --git a/pkgs/build-support/rust/test/import-cargo-lock/v1/default.nix b/pkgs/build-support/rust/test/import-cargo-lock/v1/default.nix new file mode 100644 index 0000000..b53b711 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/v1/default.nix @@ -0,0 +1,27 @@ +{ lib, rustPlatform }: +let + fs = lib.fileset; +in +rustPlatform.buildRustPackage { + pname = "v1"; + version = "0.1.0"; + + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./Cargo.toml + ./Cargo.lock + ./src + ]; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + }; + + doInstallCheck = true; + + installCheckPhase = '' + $out/bin/v1 + ''; +} diff --git a/pkgs/build-support/rust/test/import-cargo-lock/v1/src/main.rs b/pkgs/build-support/rust/test/import-cargo-lock/v1/src/main.rs new file mode 100644 index 0000000..50b4ed7 --- /dev/null +++ b/pkgs/build-support/rust/test/import-cargo-lock/v1/src/main.rs @@ -0,0 +1,9 @@ +use rand::Rng; + +fn main() { + let mut rng = rand::thread_rng(); + + // Always draw zero :). + let roll: u8 = rng.gen_range(0..1); + assert_eq!(roll, 0); +} diff --git a/pkgs/build-support/setup-hooks/audit-tmpdir.sh b/pkgs/build-support/setup-hooks/audit-tmpdir.sh new file mode 100644 index 0000000..3671417 --- /dev/null +++ b/pkgs/build-support/setup-hooks/audit-tmpdir.sh @@ -0,0 +1,39 @@ +# Check whether RPATHs or wrapper scripts contain references to +# $TMPDIR. This is a serious security bug because it allows any user +# to inject files into search paths of other users' processes. +# +# It might be better to have Nix scan build output for any occurrence +# of $TMPDIR (which would also be good for reproducibility), but at +# the moment that would produce too many spurious errors (e.g. debug +# info or assertion messages that refer to $TMPDIR). + +fixupOutputHooks+=('if [[ -z "${noAuditTmpdir-}" && -e "$prefix" ]]; then auditTmpdir "$prefix"; fi') + +auditTmpdir() { + local dir="$1" + [ -e "$dir" ] || return 0 + + echo "checking for references to $TMPDIR/ in $dir..." + + local i + find "$dir" -type f -print0 | while IFS= read -r -d $'\0' i; do + if [[ "$i" =~ .build-id ]]; then continue; fi + + if isELF "$i"; then + if { printf :; patchelf --print-rpath "$i"; } | grep -q -F ":$TMPDIR/"; then + echo "RPATH of binary $i contains a forbidden reference to $TMPDIR/" + exit 1 + fi + fi + + if isScript "$i"; then + if [ -e "$(dirname "$i")/.$(basename "$i")-wrapped" ]; then + if grep -q -F "$TMPDIR/" "$i"; then + echo "wrapper script $i contains a forbidden reference to $TMPDIR/" + exit 1 + fi + fi + fi + + done +} diff --git a/pkgs/build-support/setup-hooks/auto-patchelf.py b/pkgs/build-support/setup-hooks/auto-patchelf.py new file mode 100644 index 0000000..4769179 --- /dev/null +++ b/pkgs/build-support/setup-hooks/auto-patchelf.py @@ -0,0 +1,378 @@ +#!/usr/bin/env python3 + +import argparse +import os +import pprint +import subprocess +import sys +from fnmatch import fnmatch +from collections import defaultdict +from contextlib import contextmanager +from dataclasses import dataclass +from itertools import chain +from pathlib import Path, PurePath +from typing import DefaultDict, Iterator, List, Optional, Set, Tuple + +from elftools.common.exceptions import ELFError # type: ignore +from elftools.elf.dynamic import DynamicSection # type: ignore +from elftools.elf.elffile import ELFFile # type: ignore +from elftools.elf.enums import ENUM_E_TYPE, ENUM_EI_OSABI # type: ignore + + +@contextmanager +def open_elf(path: Path) -> Iterator[ELFFile]: + with path.open('rb') as stream: + yield ELFFile(stream) + + +def is_static_executable(elf: ELFFile) -> bool: + # Statically linked executables have an ELF type of EXEC but no INTERP. + return (elf.header["e_type"] == 'ET_EXEC' + and not elf.get_section_by_name(".interp")) + + +def is_dynamic_executable(elf: ELFFile) -> bool: + # We do not require an ELF type of EXEC. This also catches + # position-independent executables, as they typically have an INTERP + # section but their ELF type is DYN. + return bool(elf.get_section_by_name(".interp")) + + +def get_dependencies(elf: ELFFile) -> List[str]: + dependencies = [] + # This convoluted code is here on purpose. For some reason, using + # elf.get_section_by_name(".dynamic") does not always return an + # instance of DynamicSection, but that is required to call iter_tags + for section in elf.iter_sections(): + if isinstance(section, DynamicSection): + for tag in section.iter_tags('DT_NEEDED'): + dependencies.append(tag.needed) + break # There is only one dynamic section + + return dependencies + + +def get_rpath(elf: ELFFile) -> List[str]: + # This convoluted code is here on purpose. For some reason, using + # elf.get_section_by_name(".dynamic") does not always return an + # instance of DynamicSection, but that is required to call iter_tags + for section in elf.iter_sections(): + if isinstance(section, DynamicSection): + for tag in section.iter_tags('DT_RUNPATH'): + return tag.runpath.split(':') + + for tag in section.iter_tags('DT_RPATH'): + return tag.rpath.split(':') + + break # There is only one dynamic section + + return [] + + +def get_arch(elf: ELFFile) -> str: + return elf.get_machine_arch() + + +def get_osabi(elf: ELFFile) -> str: + return elf.header["e_ident"]["EI_OSABI"] + + +def osabi_are_compatible(wanted: str, got: str) -> bool: + """ + Tests whether two OS ABIs are compatible, taking into account the + generally accepted compatibility of SVR4 ABI with other ABIs. + """ + if not wanted or not got: + # One of the types couldn't be detected, so as a fallback we'll + # assume they're compatible. + return True + + # Generally speaking, the base ABI (0x00), which is represented by + # readelf(1) as "UNIX - System V", indicates broad compatibility + # with other ABIs. + # + # TODO: This isn't always true. For example, some OSes embed ABI + # compatibility into SHT_NOTE sections like .note.tag and + # .note.ABI-tag. It would be prudent to add these to the detection + # logic to produce better ABI information. + if wanted == 'ELFOSABI_SYSV': + return True + + # Similarly here, we should be able to link against a superset of + # features, so even if the target has another ABI, this should be + # fine. + if got == 'ELFOSABI_SYSV': + return True + + # Otherwise, we simply return whether the ABIs are identical. + return wanted == got + + +def glob(path: Path, pattern: str, recursive: bool) -> Iterator[Path]: + if path.is_dir(): + return path.rglob(pattern) if recursive else path.glob(pattern) + else: + # path.glob won't return anything if the path is not a directory. + # We extend that behavior by matching the file name against the pattern. + # This allows to pass single files instead of dirs to auto_patchelf, + # for greater control on the files to consider. + return [path] if path.match(pattern) else [] + + +cached_paths: Set[Path] = set() +soname_cache: DefaultDict[Tuple[str, str], List[Tuple[Path, str]]] = defaultdict(list) + + +def populate_cache(initial: List[Path], recursive: bool =False) -> None: + lib_dirs = list(initial) + + while lib_dirs: + lib_dir = lib_dirs.pop(0) + + if lib_dir in cached_paths: + continue + + cached_paths.add(lib_dir) + + for path in glob(lib_dir, "*.so*", recursive): + if not path.is_file(): + continue + + # As an optimisation, resolve the symlinks here, as the target is unique + # XXX: (layus, 2022-07-25) is this really an optimisation in all cases ? + # It could make the rpath bigger or break the fragile precedence of $out. + resolved = path.resolve() + # Do not use resolved paths when names do not match + if resolved.name != path.name: + resolved = path + + try: + with open_elf(path) as elf: + osabi = get_osabi(elf) + arch = get_arch(elf) + rpath = [Path(p) for p in get_rpath(elf) + if p and '$ORIGIN' not in p] + lib_dirs += rpath + soname_cache[(path.name, arch)].append((resolved.parent, osabi)) + + except ELFError: + # Not an ELF file in the right format + pass + + +def find_dependency(soname: str, soarch: str, soabi: str) -> Optional[Path]: + for lib, libabi in soname_cache[(soname, soarch)]: + if osabi_are_compatible(soabi, libabi): + return lib + return None + + +@dataclass +class Dependency: + file: Path # The file that contains the dependency + name: Path # The name of the dependency + found: bool = False # Whether it was found somewhere + + +def auto_patchelf_file(path: Path, runtime_deps: list[Path], append_rpaths: List[Path] = [], extra_args: List[str] = []) -> list[Dependency]: + try: + with open_elf(path) as elf: + + if is_static_executable(elf): + # No point patching these + print(f"skipping {path} because it is statically linked") + return [] + + if elf.num_segments() == 0: + # no segment (e.g. object file) + print(f"skipping {path} because it contains no segment") + return [] + + file_arch = get_arch(elf) + if interpreter_arch != file_arch: + # Our target architecture is different than this file's + # architecture, so skip it. + print(f"skipping {path} because its architecture ({file_arch})" + f" differs from target ({interpreter_arch})") + return [] + + file_osabi = get_osabi(elf) + if not osabi_are_compatible(interpreter_osabi, file_osabi): + print(f"skipping {path} because its OS ABI ({file_osabi}) is" + f" not compatible with target ({interpreter_osabi})") + return [] + + file_is_dynamic_executable = is_dynamic_executable(elf) + + file_dependencies = map(Path, get_dependencies(elf)) + + except ELFError: + return [] + + rpath = [] + if file_is_dynamic_executable: + print("setting interpreter of", path) + subprocess.run( + ["patchelf", "--set-interpreter", interpreter_path.as_posix(), path.as_posix()] + extra_args, + check=True) + rpath += runtime_deps + + print("searching for dependencies of", path) + dependencies = [] + # Be sure to get the output of all missing dependencies instead of + # failing at the first one, because it's more useful when working + # on a new package where you don't yet know the dependencies. + for dep in file_dependencies: + if dep.is_absolute() and dep.is_file(): + # This is an absolute path. If it exists, just use it. + # Otherwise, we probably want this to produce an error when + # checked (because just updating the rpath won't satisfy + # it). + continue + elif (libc_lib / dep).is_file(): + # This library exists in libc, and will be correctly + # resolved by the linker. + continue + + if found_dependency := find_dependency(dep.name, file_arch, file_osabi): + rpath.append(found_dependency) + dependencies.append(Dependency(path, dep, True)) + print(f" {dep} -> found: {found_dependency}") + else: + dependencies.append(Dependency(path, dep, False)) + print(f" {dep} -> not found!") + + rpath.extend(append_rpaths) + + # Dedup the rpath + rpath_str = ":".join(dict.fromkeys(map(Path.as_posix, rpath))) + + if rpath: + print("setting RPATH to:", rpath_str) + subprocess.run( + ["patchelf", "--set-rpath", rpath_str, path.as_posix()] + extra_args, + check=True) + + return dependencies + + +def auto_patchelf( + paths_to_patch: List[Path], + lib_dirs: List[Path], + runtime_deps: List[Path], + recursive: bool = True, + ignore_missing: List[str] = [], + append_rpaths: List[Path] = [], + extra_args: List[str] = []) -> None: + + if not paths_to_patch: + sys.exit("No paths to patch, stopping.") + + # Add all shared objects of the current output path to the cache, + # before lib_dirs, so that they are chosen first in find_dependency. + populate_cache(paths_to_patch, recursive) + populate_cache(lib_dirs) + + dependencies = [] + for path in chain.from_iterable(glob(p, '*', recursive) for p in paths_to_patch): + if not path.is_symlink() and path.is_file(): + dependencies += auto_patchelf_file(path, runtime_deps, append_rpaths, extra_args) + + missing = [dep for dep in dependencies if not dep.found] + + # Print a summary of the missing dependencies at the end + print(f"auto-patchelf: {len(missing)} dependencies could not be satisfied") + failure = False + for dep in missing: + for pattern in ignore_missing: + if fnmatch(dep.name.name, pattern): + print(f"warn: auto-patchelf ignoring missing {dep.name} wanted by {dep.file}") + break + else: + print(f"error: auto-patchelf could not satisfy dependency {dep.name} wanted by {dep.file}") + failure = True + + if failure: + sys.exit('auto-patchelf failed to find all the required dependencies.\n' + 'Add the missing dependencies to --libs or use ' + '`--ignore-missing="foo.so.1 bar.so etc.so"`.') + + +def main() -> None: + parser = argparse.ArgumentParser( + prog="auto-patchelf", + description='auto-patchelf tries as hard as possible to patch the' + ' provided binary files by looking for compatible' + 'libraries in the provided paths.') + parser.add_argument( + "--ignore-missing", + nargs="*", + type=str, + help="Do not fail when some dependencies are not found.") + parser.add_argument( + "--no-recurse", + dest="recursive", + action="store_false", + help="Disable the recursive traversal of paths to patch.") + parser.add_argument( + "--paths", nargs="*", type=Path, + help="Paths whose content needs to be patched." + " Single files and directories are accepted." + " Directories are traversed recursively by default.") + parser.add_argument( + "--libs", nargs="*", type=Path, + help="Paths where libraries are searched for." + " Single files and directories are accepted." + " Directories are not searched recursively.") + parser.add_argument( + "--runtime-dependencies", nargs="*", type=Path, + help="Paths to prepend to the runtime path of executable binaries." + " Subject to deduplication, which may imply some reordering.") + parser.add_argument( + "--append-rpaths", + nargs="*", + type=Path, + help="Paths to append to all runtime paths unconditionally", + ) + parser.add_argument( + "--extra-args", + # Undocumented Python argparse feature: consume all remaining arguments + # as values for this one. This means this argument should always be passed + # last. + nargs="...", + type=str, + help="Extra arguments to pass to patchelf. This argument should always come last." + ) + + print("automatically fixing dependencies for ELF files") + args = parser.parse_args() + pprint.pprint(vars(args)) + + auto_patchelf( + args.paths, + args.libs, + args.runtime_dependencies, + args.recursive, + args.ignore_missing, + append_rpaths=args.append_rpaths, + extra_args=args.extra_args) + + +interpreter_path: Path = None # type: ignore +interpreter_osabi: str = None # type: ignore +interpreter_arch: str = None # type: ignore +libc_lib: Path = None # type: ignore + +if __name__ == "__main__": + nix_support = Path(os.environ['NIX_BINTOOLS']) / 'nix-support' + interpreter_path = Path((nix_support / 'dynamic-linker').read_text().strip()) + libc_lib = Path((nix_support / 'orig-libc').read_text().strip()) / 'lib' + + with open_elf(interpreter_path) as interpreter: + interpreter_osabi = get_osabi(interpreter) + interpreter_arch = get_arch(interpreter) + + if interpreter_arch and interpreter_osabi and interpreter_path and libc_lib: + main() + else: + sys.exit("Failed to parse dynamic linker (ld) properties.") diff --git a/pkgs/build-support/setup-hooks/auto-patchelf.sh b/pkgs/build-support/setup-hooks/auto-patchelf.sh new file mode 100644 index 0000000..783ea45 --- /dev/null +++ b/pkgs/build-support/setup-hooks/auto-patchelf.sh @@ -0,0 +1,108 @@ +# shellcheck shell=bash + +declare -a autoPatchelfLibs +declare -a extraAutoPatchelfLibs + +gatherLibraries() { + autoPatchelfLibs+=("$1/lib") +} + +# shellcheck disable=SC2154 +# (targetOffset is referenced but not assigned.) +addEnvHooks "$targetOffset" gatherLibraries + +# Can be used to manually add additional directories with shared object files +# to be included for the next autoPatchelf invocation. +addAutoPatchelfSearchPath() { + local -a findOpts=() + + while [ $# -gt 0 ]; do + case "$1" in + --) shift; break;; + --no-recurse) shift; findOpts+=("-maxdepth" 1);; + --*) + echo "addAutoPatchelfSearchPath: ERROR: Invalid command line" \ + "argument: $1" >&2 + return 1;; + *) break;; + esac + done + + local dir= + while IFS= read -r -d '' dir; do + extraAutoPatchelfLibs+=("$dir") + done < <(find "$@" "${findOpts[@]}" \! -type d \ + \( -name '*.so' -o -name '*.so.*' \) -print0 \ + | sed -z 's#/[^/]*$##' \ + | uniq -z + ) +} + + +autoPatchelf() { + local norecurse= + while [ $# -gt 0 ]; do + case "$1" in + --) shift; break;; + --no-recurse) shift; norecurse=1;; + --*) + echo "autoPatchelf: ERROR: Invalid command line" \ + "argument: $1" >&2 + return 1;; + *) break;; + esac + done + + if [ -n "$__structuredAttrs" ]; then + local ignoreMissingDepsArray=( "${autoPatchelfIgnoreMissingDeps[@]}" ) + local appendRunpathsArray=( "${appendRunpaths[@]}" ) + local runtimeDependenciesArray=( "${runtimeDependencies[@]}" ) + local patchelfFlagsArray=( "${patchelfFlags[@]}" ) + else + readarray -td' ' ignoreMissingDepsArray < <(echo -n "$autoPatchelfIgnoreMissingDeps") + local appendRunpathsArray=($appendRunpaths) + local runtimeDependenciesArray=($runtimeDependencies) + local patchelfFlagsArray=($patchelfFlags) + fi + + # Check if ignoreMissingDepsArray contains "1" and if so, replace it with + # "*", printing a deprecation warning. + for dep in "${ignoreMissingDepsArray[@]}"; do + if [ "$dep" == "1" ]; then + echo "autoPatchelf: WARNING: setting 'autoPatchelfIgnoreMissingDeps" \ + "= true;' is deprecated and will be removed in a future release." \ + "Use 'autoPatchelfIgnoreMissingDeps = [ \"*\" ];' instead." >&2 + ignoreMissingDepsArray=( "*" ) + break + fi + done + + @pythonInterpreter@ @autoPatchelfScript@ \ + ${norecurse:+--no-recurse} \ + --ignore-missing "${ignoreMissingDepsArray[@]}" \ + --paths "$@" \ + --libs "${autoPatchelfLibs[@]}" \ + "${extraAutoPatchelfLibs[@]}" \ + --runtime-dependencies "${runtimeDependenciesArray[@]/%//lib}" \ + --append-rpaths "${appendRunpathsArray[@]}" \ + --extra-args "${patchelfFlagsArray[@]}" +} + +autoPatchelfPostFixup() { + # XXX: This should ultimately use fixupOutputHooks but we currently don't have + # a way to enforce the order. If we have $runtimeDependencies set, the setup + # hook of patchelf is going to ruin everything and strip out those additional + # RPATHs. + # + # So what we do here is basically run in postFixup and emulate the same + # behaviour as fixupOutputHooks because the setup hook for patchelf is run in + # fixupOutput and the postFixup hook runs later. + if [[ -z "${dontAutoPatchelf-}" ]]; then + autoPatchelf -- $(for output in $(getAllOutputNames); do + [ -e "${!output}" ] || continue + echo "${!output}" + done) + fi +} + +postFixupHooks+=(autoPatchelfPostFixup) diff --git a/pkgs/build-support/setup-hooks/autoreconf.sh b/pkgs/build-support/setup-hooks/autoreconf.sh new file mode 100644 index 0000000..6ce879a --- /dev/null +++ b/pkgs/build-support/setup-hooks/autoreconf.sh @@ -0,0 +1,7 @@ +preConfigurePhases="${preConfigurePhases:-} autoreconfPhase" + +autoreconfPhase() { + runHook preAutoreconf + autoreconf ${autoreconfFlags:---install --force --verbose} + runHook postAutoreconf +} diff --git a/pkgs/build-support/setup-hooks/breakpoint-hook.sh b/pkgs/build-support/setup-hooks/breakpoint-hook.sh new file mode 100644 index 0000000..6bef786 --- /dev/null +++ b/pkgs/build-support/setup-hooks/breakpoint-hook.sh @@ -0,0 +1,9 @@ +breakpointHook() { + local red='\033[0;31m' + local no_color='\033[0m' + + echo -e "${red}build failed in ${curPhase} with exit code ${exitCode}${no_color}" + printf "To attach install cntr and run the following command as root:\n\n" + sh -c "echo ' cntr attach -t command cntr-${out}'; while true; do sleep 99999999; done" +} +failureHooks+=(breakpointHook) diff --git a/pkgs/build-support/setup-hooks/compress-man-pages.sh b/pkgs/build-support/setup-hooks/compress-man-pages.sh new file mode 100644 index 0000000..0d8a765 --- /dev/null +++ b/pkgs/build-support/setup-hooks/compress-man-pages.sh @@ -0,0 +1,33 @@ +fixupOutputHooks+=('if [ -z "${dontGzipMan-}" ]; then compressManPages "$prefix"; fi') + +compressManPages() { + local dir="$1" + + if [ -L "$dir"/share ] || [ -L "$dir"/share/man ] || [ ! -d "$dir/share/man" ] + then return + fi + echo "gzipping man pages under $dir/share/man/" + + # Compress all uncompressed manpages. Don't follow symlinks, etc. + find "$dir"/share/man/ -type f -a '!' -regex '.*\.\(bz2\|gz\|xz\)$' -print0 \ + | while IFS= read -r -d $'\0' f + do + if gzip -c -n "$f" > "$f".gz; then + rm "$f" + else + rm "$f".gz + fi + done + + # Point symlinks to compressed manpages. + find "$dir"/share/man/ -type l -a '!' -regex '.*\.\(bz2\|gz\|xz\)$' -print0 \ + | sort -z \ + | while IFS= read -r -d $'\0' f + do + local target + target="$(readlink -f "$f")" + if [ -f "$target".gz ]; then + ln -sf "$target".gz "$f".gz && rm "$f" + fi + done +} diff --git a/pkgs/build-support/setup-hooks/copy-desktop-items.sh b/pkgs/build-support/setup-hooks/copy-desktop-items.sh new file mode 100644 index 0000000..313ebc9 --- /dev/null +++ b/pkgs/build-support/setup-hooks/copy-desktop-items.sh @@ -0,0 +1,43 @@ +# shellcheck shell=bash + +# Setup hook that installs specified desktop items. +# +# Example usage in a derivation: +# +# { …, makeDesktopItem, copyDesktopItems, … }: +# +# let desktopItem = makeDesktopItem { … }; in +# stdenv.mkDerivation { +# … +# nativeBuildInputs = [ copyDesktopItems ]; +# +# desktopItems = [ desktopItem ]; +# … +# } +# +# This hook will copy files which are either given by full path +# or all '*.desktop' files placed inside the 'share/applications' +# folder of each `desktopItems` argument. + +postInstallHooks+=(copyDesktopItems) + +copyDesktopItems() { + if [ "${dontCopyDesktopItems-}" = 1 ]; then return; fi + + if [ -z "$desktopItems" ]; then + return + fi + + applications="${!outputBin}/share/applications" + for desktopItem in $desktopItems; do + if [[ -f "$desktopItem" ]]; then + echo "Copying '$desktopItem' into '${applications}'" + install -D -m 444 -t "${applications}" "$desktopItem" + else + for f in "$desktopItem"/share/applications/*.desktop; do + echo "Copying '$f' into '${applications}'" + install -D -m 444 -t "${applications}" "$f" + done + fi + done +} diff --git a/pkgs/build-support/setup-hooks/copy-pkgconfig-items.sh b/pkgs/build-support/setup-hooks/copy-pkgconfig-items.sh new file mode 100644 index 0000000..8c04ec9 --- /dev/null +++ b/pkgs/build-support/setup-hooks/copy-pkgconfig-items.sh @@ -0,0 +1,46 @@ +# shellcheck shell=bash + +# Setup hook that installs specified pkgconfig items. +# +# Example usage in a derivation: +# +# { …, makePkgconfigItem, copyPkgconfigItems, … }: +# +# let pkgconfigItem = makePkgconfigItem { … }; in +# stdenv.mkDerivation { +# … +# nativeBuildInputs = [ copyPkgconfigItems ]; +# +# pkgconfigItems = [ pkgconfigItem ]; +# … +# } +# +# This hook will copy files which are either given by full path +# or all '*.pc' files placed inside the 'lib/pkgconfig' +# folder of each `pkgconfigItems` argument. + +postInstallHooks+=(copyPkgconfigItems) + +copyPkgconfigItems() { + if [ "${dontCopyPkgconfigItems-}" = 1 ]; then return; fi + + if [ -z "$pkgconfigItems" ]; then + return + fi + + pkgconfigdir="${!outputDev}/lib/pkgconfig" + for pkgconfigItem in $pkgconfigItems; do + if [[ -f "$pkgconfigItem" ]]; then + substituteAllInPlace "$pkgconfigItem" + echo "Copying '$pkgconfigItem' into '${pkgconfigdir}'" + install -D -m 444 -t "${pkgconfigdir}" "$pkgconfigItem" + substituteAllInPlace "${pkgconfigdir}"/* + else + for f in "$pkgconfigItem"/lib/pkgconfig/*.pc; do + echo "Copying '$f' into '${pkgconfigdir}'" + install -D -m 444 -t "${pkgconfigdir}" "$f" + substituteAllInPlace "${pkgconfigdir}"/* + done + fi + done +} diff --git a/pkgs/build-support/setup-hooks/desktop-to-darwin-bundle.sh b/pkgs/build-support/setup-hooks/desktop-to-darwin-bundle.sh new file mode 100644 index 0000000..5b38f43 --- /dev/null +++ b/pkgs/build-support/setup-hooks/desktop-to-darwin-bundle.sh @@ -0,0 +1,245 @@ +# shellcheck shell=bash +fixupOutputHooks+=('convertDesktopFiles $prefix') + +# Get a param out of a desktop file. First parameter is the file and the second +# is the key who's value we should fetch. +getDesktopParam() { + local file="$1" + local key="$2" + local line k v + + while read -r line; do + if [[ "$line" = *=* ]]; then + k="${line%%=*}" + v="${line#*=}" + + if [[ "$k" = "$key" ]]; then + echo "$v" + return + fi + fi + done < "$file" + + return 1 +} + +# Convert a freedesktop.org icon theme for a given app to a .icns file. When possible, missing +# icons are synthesized from SVG or rescaled from existing ones (when within the size threshold). +convertIconTheme() { + local -r out=$1 + local -r sharePath=$2 + local -r iconName=$3 + local -r theme=${4:-hicolor} + + # Sizes based on archived Apple documentation: + # https://developer.apple.com/design/human-interface-guidelines/macos/icons-and-images/app-icon#app-icon-sizes + local -ra iconSizes=(16 32 128 256 512) + local -ra scales=([1]="" [2]="@2") + + # Based loosely on the algorithm at: + # https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#icon_lookup + # Assumes threshold = 2 for ease of implementation. + function findIcon() { + local -r iconSize=$1 + local -r scale=$2 + + local scaleSuffix=${scales[$scale]} + local exactSize=${iconSize}x${iconSize}${scaleSuffix} + + local -a validSizes=( + ${exactSize} + $((iconSize + 1))x$((iconSize + 1))${scaleSuffix} + $((iconSize + 2))x$((iconSize + 2))${scaleSuffix} + $((iconSize - 1))x$((iconSize - 1))${scaleSuffix} + $((iconSize - 2))x$((iconSize - 2))${scaleSuffix} + ) + + local fallbackIcon= + + for iconIndex in "${!candidateIcons[@]}"; do + for maybeSize in "${validSizes[@]}"; do + icon=${candidateIcons[$iconIndex]} + if [[ $icon = */$maybeSize/* ]]; then + if [[ $maybeSize = $exactSize ]]; then + echo "fixed $icon" + return 0 + else + echo "threshold $icon" + return 0 + fi + elif [[ -a $icon && -z "$fallbackIcon" ]]; then + fallbackIcon="$icon" + fi + done + done + + if [[ -n "$fallbackIcon" ]]; then + echo "fallback $fallbackIcon" + return 0 + fi + + echo "scalable" + } + + function resizeIcon() { + local -r in=$1 + local -r out=$2 + local -r iconSize=$3 + local -r scale=$4 + + local density=$((72 * scale))x$((72 * scale)) + local dim=$((iconSize * scale)) + + echo "desktopToDarwinBundle: resizing icon $in to $out, size $dim" >&2 + magick convert -scale "${dim}x${dim}" -density "$density" -units PixelsPerInch "$in" "$out" + } + + function synthesizeIcon() { + local -r in=$1 + local -r out=$2 + local -r iconSize=$3 + local -r scale=$4 + + if [[ $in != '-' ]]; then + local density=$((72 * scale))x$((72 * scale)) + local dim=$((iconSize * scale)) + + echo "desktopToDarwinBundle: rasterizing svg $in to $out, size $dim" >&2 + rsvg-convert --keep-aspect-ratio --width "$dim" --height "$dim" "$in" --output "$out" + magick convert -density "$density" -units PixelsPerInch "$out" "$out" + else + return 1 + fi + } + + function getIcons() { + local -r sharePath=$1 + local -r iconname=$2 + local -r theme=$3 + local -r resultdir=$(mktemp -d) + + local -ar candidateIcons=( + "${sharePath}/icons/${theme}/"*"/${iconname}.png" + "${sharePath}/icons/${theme}/"*"/${iconname}.xpm" + ) + + local -a scalableIcon=("${sharePath}/icons/${theme}/scalable/${iconname}.svg"*) + if [[ ${#scalableIcon[@]} = 0 ]]; then + scalableIcon=('-') + fi + + # Tri-state variable, NONE means no icons have been found, an empty + # icns file will be generated, not sure that's necessary because macOS + # will default to a generic icon if no icon can be found. + # + # OTHER means an appropriate icon was found. + # + # Any other value is a path to an icon file that isn't scalable or + # within the threshold. This is used as a fallback in case no better + # icon can be found and will be scaled as much as + # necessary to result in appropriate icon sizes. + local foundIcon=NONE + for iconSize in "${iconSizes[@]}"; do + for scale in "${!scales[@]}"; do + local iconResult=$(findIcon $iconSize $scale) + local type=${iconResult%% *} + local icon=${iconResult#* } + local scaleSuffix=${scales[$scale]} + local result=${resultdir}/${iconSize}x${iconSize}${scales[$scale]}${scaleSuffix:+x}.png + echo "desktopToDarwinBundle: using $type icon $icon for size $iconSize$scaleSuffix" >&2 + case $type in + fixed) + local density=$((72 * scale))x$((72 * scale)) + magick convert -density "$density" -units PixelsPerInch "$icon" "$result" + foundIcon=OTHER + ;; + threshold) + # Synthesize an icon of the exact size if a scalable icon is available + # instead of scaling one and ending up with a fuzzy icon. + if ! synthesizeIcon "${scalableIcon[0]}" "$result" "$iconSize" "$scale"; then + resizeIcon "$icon" "$result" "$iconSize" "$scale" + fi + foundIcon=OTHER + ;; + scalable) + synthesizeIcon "${scalableIcon[0]}" "$result" "$iconSize" "$scale" || true + foundIcon=OTHER + ;; + fallback) + # Use the largest size available to scale to + # appropriate sizes. + if [[ $foundIcon != OTHER ]]; then + foundIcon=$icon + fi + ;; + *) + ;; + esac + done + done + if [[ $foundIcon != NONE && $foundIcon != OTHER ]]; then + # Ideally we'd only resize to whatever the closest sizes are, + # starting from whatever icon sizes are available. + for iconSize in 16 32 128 256 512; do + local result=${resultdir}/${iconSize}x${iconSize}.png + resizeIcon "$foundIcon" "$result" "$iconSize" 1 + done + fi + echo "$resultdir" + } + + iconsdir=$(getIcons "$sharePath" "apps/${iconName}" "$theme") + if [[ -n "$(ls -A1 "$iconsdir")" ]]; then + icnsutil compose --toc "$out/${iconName}.icns" "$iconsdir/"* + else + echo "Warning: no icons were found. Creating an empty icon for ${iconName}.icns." + touch "$out/${iconName}.icns" + fi +} + +processExecFieldCodes() { + local -r file=$1 + local -r execRaw=$(getDesktopParam "${file}" "Exec") + local -r execNoK="${execRaw/\%k/${file}}" + local -r execNoKC="${execNoK/\%c/$(getDesktopParam "${file}" "Name")}" + local -r icon=$(getDesktopParam "${file}" "Icon") + local -r execNoKCI="${execNoKC/\%i/${icon:+--icon }${icon}}" + local -r execNoKCIfu="${execNoKCI/ \%[fu]/}" + local -r exec="${execNoKCIfu/ \%[FU]/}" + if [[ "$exec" != "$execRaw" ]]; then + echo 1>&2 "desktopToDarwinBundle: Application bundles do not understand desktop entry field codes. Changed '$execRaw' to '$exec'." + fi + echo "$exec" +} + +# For a given .desktop file, generate a darwin '.app' bundle for it. +convertDesktopFile() { + local -r file=$1 + local -r sharePath=$(dirname "$(dirname "$file")") + local -r name=$(getDesktopParam "${file}" "Name") + local -r macOSExec=$(getDesktopParam "${file}" "X-macOS-Exec") + if [[ "$macOSExec" ]]; then + local -r exec="$macOSExec" + else + local -r exec=$(processExecFieldCodes "${file}") + fi + local -r iconName=$(getDesktopParam "${file}" "Icon") + local -r squircle=$(getDesktopParam "${file}" "X-macOS-SquircleIcon") + + mkdir -p "${!outputBin}/Applications/${name}.app/Contents/MacOS" + mkdir -p "${!outputBin}/Applications/${name}.app/Contents/Resources" + + convertIconTheme "${!outputBin}/Applications/${name}.app/Contents/Resources" "$sharePath" "$iconName" + + write-darwin-bundle "${!outputBin}" "$name" "$exec" "$iconName" "$squircle" +} + +convertDesktopFiles() { + local dir="$1/share/applications/" + + if [ -d "${dir}" ]; then + for desktopFile in $(find "$dir" -iname "*.desktop"); do + convertDesktopFile "$desktopFile"; + done + fi +} diff --git a/pkgs/build-support/setup-hooks/die.sh b/pkgs/build-support/setup-hooks/die.sh new file mode 100644 index 0000000..0db41e0 --- /dev/null +++ b/pkgs/build-support/setup-hooks/die.sh @@ -0,0 +1,21 @@ +# Exit with backtrace and error message +# +# Usage: die "Error message" +die() { + # Let us be a little sloppy with errors, because otherwise the final + # invocation of `caller` below will cause the script to exit. + set +e + + # Print our error message + printf "\nBuilder called die: %b\n" "$*" + printf "Backtrace:\n" + + # Print a backtrace. + local frame=0 + while caller $frame; do + ((frame++)); + done + printf "\n" + + exit 1 +} diff --git a/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh new file mode 100644 index 0000000..2b48fea --- /dev/null +++ b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh @@ -0,0 +1,20 @@ +postPhases+=" cleanupBuildDir" + +# Force GCC to build with coverage instrumentation. Also disable +# optimisation, since it may confuse things. +export NIX_CFLAGS_COMPILE="${NIX_CFLAGS_COMPILE:-} -O0 --coverage" + +# Get rid of everything that isn't a gcno file or a C source file. +# Also strip the `.tmp_' prefix from gcno files. (The Linux kernel +# creates these.) +cleanupBuildDir() { + if ! [ -e $out/.build ]; then return; fi + + find $out/.build/ -type f -a ! \ + \( -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.h" -o -name "*.hh" -o -name "*.y" -o -name "*.l" -o -name "*.gcno" \) \ + | xargs rm -f -- + + for i in $(find $out/.build/ -name ".tmp_*.gcno"); do + mv "$i" "$(echo $i | sed s/.tmp_//)" + done +} diff --git a/pkgs/build-support/setup-hooks/find-xml-catalogs.sh b/pkgs/build-support/setup-hooks/find-xml-catalogs.sh new file mode 100644 index 0000000..f446a6f --- /dev/null +++ b/pkgs/build-support/setup-hooks/find-xml-catalogs.sh @@ -0,0 +1,22 @@ +addXMLCatalogs () { + local d i + # ‘xml/dtd’ and ‘xml/xsl’ are deprecated. Catalogs should be + # installed underneath ‘share/xml’. + for d in $1/share/xml $1/xml/dtd $1/xml/xsl; do + if [ -d $d ]; then + for i in $(find $d -name catalog.xml); do + XML_CATALOG_FILES+=" $i" + done + fi + done +} + +if [ -z "${libxmlHookDone-}" ]; then + libxmlHookDone=1 + + # Set up XML_CATALOG_FILES. An empty initial value prevents + # xmllint and xsltproc from looking in /etc/xml/catalog. + export XML_CATALOG_FILES='' + if [ -z "$XML_CATALOG_FILES" ]; then XML_CATALOG_FILES=" "; fi + addEnvHooks "$hostOffset" addXMLCatalogs +fi diff --git a/pkgs/build-support/setup-hooks/fix-darwin-dylib-names.sh b/pkgs/build-support/setup-hooks/fix-darwin-dylib-names.sh new file mode 100644 index 0000000..e103fe7 --- /dev/null +++ b/pkgs/build-support/setup-hooks/fix-darwin-dylib-names.sh @@ -0,0 +1,40 @@ +# On macOS, binaries refer to dynamic library dependencies using +# either relative paths (e.g. "libicudata.dylib", searched relative to +# $DYLD_LIBRARY_PATH) or absolute paths +# (e.g. "/nix/store/.../lib/libicudata.dylib"). In Nix, the latter is +# preferred since it allows programs to just work. When linking +# against a library (e.g. "-licudata"), the linker uses the install +# name embedded in the dylib (which can be shown using "otool -D"). +# Most packages create dylibs with absolute install names, but some do +# not. This setup hook fixes dylibs by setting their install names to +# their absolute path (using "install_name_tool -id"). It also +# rewrites references in other dylibs to absolute paths. + +fixupOutputHooks+=('fixDarwinDylibNamesIn $prefix') + +fixDarwinDylibNames() { + local flags=() + local old_id + + for fn in "$@"; do + flags+=(-change "$(basename "$fn")" "$fn") + done + + for fn in "$@"; do + if [ -L "$fn" ]; then continue; fi + echo "$fn: fixing dylib" + int_out=$(@targetPrefix@install_name_tool -id "$fn" "${flags[@]}" "$fn" 2>&1) + result=$? + if [ "$result" -ne 0 ] && + ! grep "shared library stub file and can't be changed" <<< "$out" + then + echo "$int_out" >&2 + exit "$result" + fi + done +} + +fixDarwinDylibNamesIn() { + local dir="$1" + fixDarwinDylibNames $(find "$dir" -name "*.dylib" -o -name "*.so" -o -name "*.so.*") +} diff --git a/pkgs/build-support/setup-hooks/gog-unpack.sh b/pkgs/build-support/setup-hooks/gog-unpack.sh new file mode 100644 index 0000000..559b543 --- /dev/null +++ b/pkgs/build-support/setup-hooks/gog-unpack.sh @@ -0,0 +1,11 @@ +unpackPhase="unpackGog" + +unpackGog() { + runHook preUnpackGog + + innoextract --silent --extract --exclude-temp "${src}" + + find . -depth -print -execdir rename -f 'y/A-Z/a-z/' '{}' \; + + runHook postUnpackGog +} diff --git a/pkgs/build-support/setup-hooks/install-shell-files.sh b/pkgs/build-support/setup-hooks/install-shell-files.sh new file mode 100644 index 0000000..194b408 --- /dev/null +++ b/pkgs/build-support/setup-hooks/install-shell-files.sh @@ -0,0 +1,230 @@ +# shellcheck shell=bash +# Setup hook for the `installShellFiles` package. +# +# Example usage in a derivation: +# +# { …, installShellFiles, … }: +# stdenv.mkDerivation { +# … +# nativeBuildInputs = [ installShellFiles ]; +# postInstall = '' +# installManPage share/doc/foobar.1 +# installShellCompletion share/completions/foobar.{bash,fish,zsh} +# ''; +# … +# } +# +# See comments on each function for more details. + +# installManPage [...] +# +# Each argument is checked for its man section suffix and installed into the appropriate +# share/man/man/ directory. The function returns an error if any paths don't have the man +# section suffix (with optional .gz compression). +installManPage() { + local path + for path in "$@"; do + if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "installManPage: installing $path" + fi + if test -z "$path"; then + echo "installManPage: error: path cannot be empty" >&2 + return 1 + fi + local basename + basename=$(stripHash "$path") # use stripHash in case it's a nix store path + local trimmed=${basename%.gz} # don't get fooled by compressed manpages + local suffix=${trimmed##*.} + if test -z "$suffix" -o "$suffix" = "$trimmed"; then + echo "installManPage: error: path missing manpage section suffix: $path" >&2 + return 1 + fi + local outRoot + if test "$suffix" = 3; then + outRoot=${!outputDevman:?} + else + outRoot=${!outputMan:?} + fi + install -Dm644 -T "$path" "${outRoot}/share/man/man$suffix/$basename" || return + done +} + +# installShellCompletion [--cmd ] ([--bash|--fish|--zsh] [--name ] )... +# +# Each path is installed into the appropriate directory for shell completions for the given shell. +# If one of `--bash`, `--fish`, or `--zsh` is given the path is assumed to belong to that shell. +# Otherwise the file extension will be examined to pick a shell. If the shell is unknown a warning +# will be logged and the command will return a non-zero status code after processing any remaining +# paths. Any of the shell flags will affect all subsequent paths (unless another shell flag is +# given). +# +# If the shell completion needs to be renamed before installing the optional `--name ` flag +# may be given. Any name provided with this flag only applies to the next path. +# +# If all shell completions need to be renamed before installing the optional `--cmd ` flag +# may be given. This will synthesize a name for each file, unless overridden with an explicit +# `--name` flag. For example, `--cmd foobar` will synthesize the name `_foobar` for zsh and +# `foobar.bash` for bash. +# +# For zsh completions, if the `--name` flag is not given, the path will be automatically renamed +# such that `foobar.zsh` becomes `_foobar`. +# +# A path may be a named fd, such as produced by the bash construct `<(cmd)`. When using a named fd, +# the shell type flag must be provided, and either the `--name` or `--cmd` flag must be provided. +# This might look something like: +# +# installShellCompletion --zsh --name _foobar <($out/bin/foobar --zsh-completion) +# +# This command accepts multiple shell flags in conjunction with multiple paths if you wish to +# install them all in one command: +# +# installShellCompletion share/completions/foobar.{bash,fish} --zsh share/completions/_foobar +# +# However it may be easier to read if each shell is split into its own invocation, especially when +# renaming is involved: +# +# installShellCompletion --bash --name foobar.bash share/completions.bash +# installShellCompletion --fish --name foobar.fish share/completions.fish +# installShellCompletion --zsh --name _foobar share/completions.zsh +# +# Or to use shell newline escaping to split a single invocation across multiple lines: +# +# installShellCompletion --cmd foobar \ +# --bash <($out/bin/foobar --bash-completion) \ +# --fish <($out/bin/foobar --fish-completion) \ +# --zsh <($out/bin/foobar --zsh-completion) +# +# If any argument is `--` the remaining arguments will be treated as paths. +installShellCompletion() { + local shell='' name='' cmdname='' retval=0 parseArgs=1 arg + while { arg=$1; shift; }; do + # Parse arguments + if (( parseArgs )); then + case "$arg" in + --bash|--fish|--zsh) + shell=${arg#--} + continue;; + --name) + name=$1 + shift || { + echo 'installShellCompletion: error: --name flag expected an argument' >&2 + return 1 + } + continue;; + --name=*) + # treat `--name=foo` the same as `--name foo` + name=${arg#--name=} + continue;; + --cmd) + cmdname=$1 + shift || { + echo 'installShellCompletion: error: --cmd flag expected an argument' >&2 + return 1 + } + continue;; + --cmd=*) + # treat `--cmd=foo` the same as `--cmd foo` + cmdname=${arg#--cmd=} + continue;; + --?*) + echo "installShellCompletion: warning: unknown flag ${arg%%=*}" >&2 + retval=2 + continue;; + --) + # treat remaining args as paths + parseArgs=0 + continue;; + esac + fi + if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "installShellCompletion: installing $arg${name:+ as $name}" + fi + # if we get here, this is a path or named pipe + # Identify shell and output name + local curShell=$shell + local outName='' + if [[ -z "$arg" ]]; then + echo "installShellCompletion: error: empty path is not allowed" >&2 + return 1 + elif [[ -p "$arg" ]]; then + # this is a named fd or fifo + if [[ -z "$curShell" ]]; then + echo "installShellCompletion: error: named pipe requires one of --bash, --fish, or --zsh" >&2 + return 1 + elif [[ -z "$name" && -z "$cmdname" ]]; then + echo "installShellCompletion: error: named pipe requires one of --cmd or --name" >&2 + return 1 + fi + else + # this is a path + local argbase + argbase=$(stripHash "$arg") + if [[ -z "$curShell" ]]; then + # auto-detect the shell + case "$argbase" in + ?*.bash) curShell=bash;; + ?*.fish) curShell=fish;; + ?*.zsh) curShell=zsh;; + *) + if [[ "$argbase" = _* && "$argbase" != *.* ]]; then + # probably zsh + echo "installShellCompletion: warning: assuming path \`$arg' is zsh; please specify with --zsh" >&2 + curShell=zsh + else + echo "installShellCompletion: warning: unknown shell for path: $arg" >&2 + retval=2 + continue + fi;; + esac + fi + outName=$argbase + fi + # Identify output path + if [[ -n "$name" ]]; then + outName=$name + elif [[ -n "$cmdname" ]]; then + case "$curShell" in + bash|fish) outName=$cmdname.$curShell;; + zsh) outName=_$cmdname;; + *) + # Our list of shells is out of sync with the flags we accept or extensions we detect. + echo 'installShellCompletion: internal error' >&2 + return 1;; + esac + fi + local sharePath + case "$curShell" in + bash) sharePath=bash-completion/completions;; + fish) sharePath=fish/vendor_completions.d;; + zsh) + sharePath=zsh/site-functions + # only apply automatic renaming if we didn't have a manual rename + if [[ -z "$name" && -z "$cmdname" ]]; then + # convert a name like `foo.zsh` into `_foo` + outName=${outName%.zsh} + outName=_${outName#_} + fi;; + *) + # Our list of shells is out of sync with the flags we accept or extensions we detect. + echo 'installShellCompletion: internal error' >&2 + return 1;; + esac + # Install file + local outDir="${!outputBin:?}/share/$sharePath" + local outPath="$outDir/$outName" + if [[ -p "$arg" ]]; then + # install handles named pipes on NixOS but not on macOS + mkdir -p "$outDir" \ + && cat "$arg" > "$outPath" + else + install -Dm644 -T "$arg" "$outPath" + fi || return + # Clear the per-path flags + name= + done + if [[ -n "$name" ]]; then + echo 'installShellCompletion: error: --name flag given with no path' >&2 + return 1 + fi + return $retval +} diff --git a/pkgs/build-support/setup-hooks/keep-build-tree.sh b/pkgs/build-support/setup-hooks/keep-build-tree.sh new file mode 100644 index 0000000..754900b --- /dev/null +++ b/pkgs/build-support/setup-hooks/keep-build-tree.sh @@ -0,0 +1,6 @@ +prePhases+=" moveBuildDir" + +moveBuildDir() { + mkdir -p $out/.build + cd $out/.build +} diff --git a/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh b/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh new file mode 100644 index 0000000..b53e184 --- /dev/null +++ b/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh @@ -0,0 +1,5 @@ +ld-is-cc-hook() { + LD=$CC +} + +preConfigureHooks+=(ld-is-cc-hook) diff --git a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix new file mode 100644 index 0000000..f364dd5 --- /dev/null +++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix @@ -0,0 +1,27 @@ +{ targetPackages +, lib +, makeSetupHook +, dieHook +, writeShellScript +, tests +, cc ? targetPackages.stdenv.cc +, sanitizers ? [] +}: + +makeSetupHook { + name = "make-binary-wrapper-hook"; + propagatedBuildInputs = [ dieHook ]; + + substitutions = { + cc = "${cc}/bin/${cc.targetPrefix}cc ${lib.escapeShellArgs (map (s: "-fsanitize=${s}") sanitizers)}"; + }; + + passthru = { + # Extract the function call used to create a binary wrapper from its embedded docstring + extractCmd = writeShellScript "extract-binary-wrapper-cmd" '' + ${cc.bintools.targetPrefix}strings -dw "$1" | sed -n '/^makeCWrapper/,/^$/ p' + ''; + + tests = tests.makeBinaryWrapper; + }; +} ./make-binary-wrapper.sh diff --git a/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh b/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh new file mode 100644 index 0000000..3948342 --- /dev/null +++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh @@ -0,0 +1,471 @@ + +set -euo pipefail + +# Assert that FILE exists and is executable +# +# assertExecutable FILE +assertExecutable() { + local file="$1" + [[ -f "$file" && -x "$file" ]] || \ + die "Cannot wrap '$file' because it is not an executable file" +} + +# Generate a binary executable wrapper for wrapping an executable. +# The binary is compiled from generated C-code using gcc. +# makeWrapper EXECUTABLE OUT_PATH ARGS + +# ARGS: +# --argv0 NAME : set the name of the executed process to NAME +# (if unset or empty, defaults to EXECUTABLE) +# --inherit-argv0 : the executable inherits argv0 from the wrapper. +# (use instead of --argv0 '$0') +# --resolve-argv0 : if argv0 doesn't include a / character, resolve it against PATH +# --set VAR VAL : add VAR with value VAL to the executable's environment +# --set-default VAR VAL : like --set, but only adds VAR if not already set in +# the environment +# --unset VAR : remove VAR from the environment +# --chdir DIR : change working directory (use instead of --run "cd DIR") +# --add-flags ARGS : prepend ARGS to the invocation of the executable +# (that is, *before* any arguments passed on the command line) +# --append-flags ARGS : append ARGS to the invocation of the executable +# (that is, *after* any arguments passed on the command line) + +# --prefix ENV SEP VAL : suffix/prefix ENV with VAL, separated by SEP +# --suffix + +# To troubleshoot a binary wrapper after you compiled it, +# use the `strings` command or open the binary file in a text editor. +makeWrapper() { makeBinaryWrapper "$@"; } +makeBinaryWrapper() { + local NIX_CFLAGS_COMPILE= NIX_CFLAGS_LINK= + local original="$1" + local wrapper="$2" + shift 2 + + assertExecutable "$original" + + mkdir -p "$(dirname "$wrapper")" + + makeDocumentedCWrapper "$original" "$@" | \ + @cc@ \ + -Wall -Werror -Wpedantic \ + -Wno-overlength-strings \ + -Os \ + -x c \ + -o "$wrapper" - +} + +# Syntax: wrapProgram +wrapProgram() { wrapProgramBinary "$@"; } +wrapProgramBinary() { + local prog="$1" + local hidden + + assertExecutable "$prog" + + hidden="$(dirname "$prog")/.$(basename "$prog")"-wrapped + while [ -e "$hidden" ]; do + hidden="${hidden}_" + done + mv "$prog" "$hidden" + makeBinaryWrapper "$hidden" "$prog" --inherit-argv0 "${@:2}" +} + +# Generate source code for the wrapper in such a way that the wrapper inputs +# will still be readable even after compilation +# makeDocumentedCWrapper EXECUTABLE ARGS +# ARGS: same as makeWrapper +makeDocumentedCWrapper() { + local src docs + src=$(makeCWrapper "$@") + docs=$(docstring "$@") + printf '%s\n\n' "$src" + printf '%s\n' "$docs" +} + +# makeCWrapper EXECUTABLE ARGS +# ARGS: same as makeWrapper +makeCWrapper() { + local argv0 inherit_argv0 n params cmd main flagsBefore flagsAfter flags executable length + local uses_prefix uses_suffix uses_assert uses_assert_success uses_stdio uses_asprintf + local resolve_path + executable=$(escapeStringLiteral "$1") + params=("$@") + length=${#params[*]} + for ((n = 1; n < length; n += 1)); do + p="${params[n]}" + case $p in + --set) + cmd=$(setEnv "${params[n + 1]}" "${params[n + 2]}") + main="$main$cmd"$'\n' + n=$((n + 2)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 2 arguments"$'\n' + ;; + --set-default) + cmd=$(setDefaultEnv "${params[n + 1]}" "${params[n + 2]}") + main="$main$cmd"$'\n' + uses_stdio=1 + uses_assert_success=1 + n=$((n + 2)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 2 arguments"$'\n' + ;; + --unset) + cmd=$(unsetEnv "${params[n + 1]}") + main="$main$cmd"$'\n' + uses_stdio=1 + uses_assert_success=1 + n=$((n + 1)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 1 argument"$'\n' + ;; + --prefix) + cmd=$(setEnvPrefix "${params[n + 1]}" "${params[n + 2]}" "${params[n + 3]}") + main="$main$cmd"$'\n' + uses_prefix=1 + uses_asprintf=1 + uses_stdio=1 + uses_assert_success=1 + uses_assert=1 + n=$((n + 3)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 3 arguments"$'\n' + ;; + --suffix) + cmd=$(setEnvSuffix "${params[n + 1]}" "${params[n + 2]}" "${params[n + 3]}") + main="$main$cmd"$'\n' + uses_suffix=1 + uses_asprintf=1 + uses_stdio=1 + uses_assert_success=1 + uses_assert=1 + n=$((n + 3)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 3 arguments"$'\n' + ;; + --chdir) + cmd=$(changeDir "${params[n + 1]}") + main="$main$cmd"$'\n' + uses_stdio=1 + uses_assert_success=1 + n=$((n + 1)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 1 argument"$'\n' + ;; + --add-flags) + flags="${params[n + 1]}" + flagsBefore="$flagsBefore $flags" + uses_assert=1 + n=$((n + 1)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 1 argument"$'\n' + ;; + --append-flags) + flags="${params[n + 1]}" + flagsAfter="$flagsAfter $flags" + uses_assert=1 + n=$((n + 1)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 1 argument"$'\n' + ;; + --argv0) + argv0=$(escapeStringLiteral "${params[n + 1]}") + inherit_argv0= + n=$((n + 1)) + [ $n -ge "$length" ] && main="$main#error makeCWrapper: $p takes 1 argument"$'\n' + ;; + --inherit-argv0) + # Whichever comes last of --argv0 and --inherit-argv0 wins + inherit_argv0=1 + ;; + --resolve-argv0) + # this gets processed after other argv0 flags + uses_stdio=1 + uses_string=1 + resolve_argv0=1 + ;; + *) # Using an error macro, we will make sure the compiler gives an understandable error message + main="$main#error makeCWrapper: Unknown argument ${p}"$'\n' + ;; + esac + done + [[ -z "$flagsBefore" && -z "$flagsAfter" ]] || main="$main"${main:+$'\n'}$(addFlags "$flagsBefore" "$flagsAfter")$'\n'$'\n' + [ -z "$inherit_argv0" ] && main="${main}argv[0] = \"${argv0:-${executable}}\";"$'\n' + [ -z "$resolve_argv0" ] || main="${main}argv[0] = resolve_argv0(argv[0]);"$'\n' + main="${main}return execv(\"${executable}\", argv);"$'\n' + + [ -z "$uses_asprintf" ] || printf '%s\n' "#define _GNU_SOURCE /* See feature_test_macros(7) */" + printf '%s\n' "#include " + printf '%s\n' "#include " + [ -z "$uses_assert" ] || printf '%s\n' "#include " + [ -z "$uses_stdio" ] || printf '%s\n' "#include " + [ -z "$uses_string" ] || printf '%s\n' "#include " + [ -z "$uses_assert_success" ] || printf '\n%s\n' "#define assert_success(e) do { if ((e) < 0) { perror(#e); abort(); } } while (0)" + [ -z "$uses_prefix" ] || printf '\n%s\n' "$(setEnvPrefixFn)" + [ -z "$uses_suffix" ] || printf '\n%s\n' "$(setEnvSuffixFn)" + [ -z "$resolve_argv0" ] || printf '\n%s\n' "$(resolveArgv0Fn)" + printf '\n%s' "int main(int argc, char **argv) {" + printf '\n%s' "$(indent4 "$main")" + printf '\n%s\n' "}" +} + +addFlags() { + local n flag before after var + + # Disable file globbing, since bash will otherwise try to find + # filenames matching the the value to be prefixed/suffixed if + # it contains characters considered wildcards, such as `?` and + # `*`. We want the value as is, except we also want to split + # it on on the separator; hence we can't quote it. + local reenableGlob=0 + if [[ ! -o noglob ]]; then + reenableGlob=1 + fi + set -o noglob + # shellcheck disable=SC2086 + before=($1) after=($2) + if (( reenableGlob )); then + set +o noglob + fi + + var="argv_tmp" + printf '%s\n' "char **$var = calloc(${#before[@]} + argc + ${#after[@]} + 1, sizeof(*$var));" + printf '%s\n' "assert($var != NULL);" + printf '%s\n' "${var}[0] = argv[0];" + for ((n = 0; n < ${#before[@]}; n += 1)); do + flag=$(escapeStringLiteral "${before[n]}") + printf '%s\n' "${var}[$((n + 1))] = \"$flag\";" + done + printf '%s\n' "for (int i = 1; i < argc; ++i) {" + printf '%s\n' " ${var}[${#before[@]} + i] = argv[i];" + printf '%s\n' "}" + for ((n = 0; n < ${#after[@]}; n += 1)); do + flag=$(escapeStringLiteral "${after[n]}") + printf '%s\n' "${var}[${#before[@]} + argc + $n] = \"$flag\";" + done + printf '%s\n' "${var}[${#before[@]} + argc + ${#after[@]}] = NULL;" + printf '%s\n' "argv = $var;" +} + +# chdir DIR +changeDir() { + local dir + dir=$(escapeStringLiteral "$1") + printf '%s' "assert_success(chdir(\"$dir\"));" +} + +# prefix ENV SEP VAL +setEnvPrefix() { + local env sep val + env=$(escapeStringLiteral "$1") + sep=$(escapeStringLiteral "$2") + val=$(escapeStringLiteral "$3") + printf '%s' "set_env_prefix(\"$env\", \"$sep\", \"$val\");" + assertValidEnvName "$1" +} + +# suffix ENV SEP VAL +setEnvSuffix() { + local env sep val + env=$(escapeStringLiteral "$1") + sep=$(escapeStringLiteral "$2") + val=$(escapeStringLiteral "$3") + printf '%s' "set_env_suffix(\"$env\", \"$sep\", \"$val\");" + assertValidEnvName "$1" +} + +# setEnv KEY VALUE +setEnv() { + local key value + key=$(escapeStringLiteral "$1") + value=$(escapeStringLiteral "$2") + printf '%s' "putenv(\"$key=$value\");" + assertValidEnvName "$1" +} + +# setDefaultEnv KEY VALUE +setDefaultEnv() { + local key value + key=$(escapeStringLiteral "$1") + value=$(escapeStringLiteral "$2") + printf '%s' "assert_success(setenv(\"$key\", \"$value\", 0));" + assertValidEnvName "$1" +} + +# unsetEnv KEY +unsetEnv() { + local key + key=$(escapeStringLiteral "$1") + printf '%s' "assert_success(unsetenv(\"$key\"));" + assertValidEnvName "$1" +} + +# Makes it safe to insert STRING within quotes in a C String Literal. +# escapeStringLiteral STRING +escapeStringLiteral() { + local result + result=${1//$'\\'/$'\\\\'} + result=${result//\"/'\"'} + result=${result//$'\n'/"\n"} + result=${result//$'\r'/"\r"} + printf '%s' "$result" +} + +# Indents every non-empty line by 4 spaces. To avoid trailing whitespace, we don't indent empty lines +# indent4 TEXT_BLOCK +indent4() { + printf '%s' "$1" | awk '{ if ($0 != "") { print " "$0 } else { print $0 }}' +} + +assertValidEnvName() { + case "$1" in + *=*) printf '\n%s\n' "#error Illegal environment variable name \`$1\` (cannot contain \`=\`)";; + "") printf '\n%s\n' "#error Environment variable name can't be empty.";; + esac +} + +setEnvPrefixFn() { + printf '%s' "\ +void set_env_prefix(char *env, char *sep, char *prefix) { + char *existing = getenv(env); + if (existing) { + char *val; + assert_success(asprintf(&val, \"%s%s%s\", prefix, sep, existing)); + assert_success(setenv(env, val, 1)); + free(val); + } else { + assert_success(setenv(env, prefix, 1)); + } +} +" +} + +setEnvSuffixFn() { + printf '%s' "\ +void set_env_suffix(char *env, char *sep, char *suffix) { + char *existing = getenv(env); + if (existing) { + char *val; + assert_success(asprintf(&val, \"%s%s%s\", existing, sep, suffix)); + assert_success(setenv(env, val, 1)); + free(val); + } else { + assert_success(setenv(env, suffix, 1)); + } +} +" +} + +resolveArgv0Fn() { + printf '%s' "\ +char *resolve_argv0(char *argv0) { + if (strchr(argv0, '/') != NULL) { + return argv0; + } + char *path = getenv(\"PATH\"); + if (path == NULL) { + return argv0; + } + char *path_copy = strdup(path); + if (path_copy == NULL) { + return argv0; + } + char *dir = strtok(path_copy, \":\"); + while (dir != NULL) { + char *candidate = malloc(strlen(dir) + strlen(argv0) + 2); + if (candidate == NULL) { + free(path_copy); + return argv0; + } + sprintf(candidate, \"%s/%s\", dir, argv0); + if (access(candidate, X_OK) == 0) { + free(path_copy); + return candidate; + } + free(candidate); + dir = strtok(NULL, \":\"); + } + free(path_copy); + return argv0; +} +" +} + +# Embed a C string which shows up as readable text in the compiled binary wrapper, +# giving instructions for recreating the wrapper. +# Keep in sync with makeBinaryWrapper.extractCmd +docstring() { + printf '%s' "const char * DOCSTRING = \"$(escapeStringLiteral " + + +# ------------------------------------------------------------------------------------ +# The C-code for this binary wrapper has been generated using the following command: + + +makeCWrapper $(formatArgs "$@") + + +# (Use \`nix-shell -p makeBinaryWrapper\` to get access to makeCWrapper in your shell) +# ------------------------------------------------------------------------------------ + + +")\";" +} + +# formatArgs EXECUTABLE ARGS +formatArgs() { + printf '%s' "${1@Q}" + shift + while [ $# -gt 0 ]; do + case "$1" in + --set) + formatArgsLine 2 "$@" + shift 2 + ;; + --set-default) + formatArgsLine 2 "$@" + shift 2 + ;; + --unset) + formatArgsLine 1 "$@" + shift 1 + ;; + --prefix) + formatArgsLine 3 "$@" + shift 3 + ;; + --suffix) + formatArgsLine 3 "$@" + shift 3 + ;; + --chdir) + formatArgsLine 1 "$@" + shift 1 + ;; + --add-flags) + formatArgsLine 1 "$@" + shift 1 + ;; + --append-flags) + formatArgsLine 1 "$@" + shift 1 + ;; + --argv0) + formatArgsLine 1 "$@" + shift 1 + ;; + --inherit-argv0) + formatArgsLine 0 "$@" + ;; + esac + shift + done + printf '%s\n' "" +} + +# formatArgsLine ARG_COUNT ARGS +formatArgsLine() { + local ARG_COUNT LENGTH + ARG_COUNT=$1 + LENGTH=$# + shift + printf '%s' $' \\\n '"$1" + shift + while [ "$ARG_COUNT" -gt $((LENGTH - $# - 2)) ]; do + printf ' %s' "${1@Q}" + shift + done +} diff --git a/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh new file mode 100644 index 0000000..9108b4c --- /dev/null +++ b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh @@ -0,0 +1,25 @@ +postPhases+=" coverageReportPhase" + +coverageReportPhase() { + lcov --directory . --capture --output-file app.info + set -o noglob + lcov --remove app.info ${lcovFilter:-"/nix/store/*"} > app2.info + set +o noglob + mv app2.info app.info + + mkdir -p $out/coverage + genhtml app.info $lcovExtraTraceFiles -o $out/coverage > log + + # Grab the overall coverage percentage so that Hydra can plot it over time. + mkdir -p $out/nix-support + lineCoverage="$(sed 's/.*lines\.*: \([0-9\.]\+\)%.*/\1/; t ; d' log)" + functionCoverage="$(sed 's/.*functions\.*: \([0-9\.]\+\)%.*/\1/; t ; d' log)" + if [ -z "$lineCoverage" -o -z "$functionCoverage" ]; then + echo "failed to get coverage statistics" + exit 1 + fi + echo "lineCoverage $lineCoverage %" >> $out/nix-support/hydra-metrics + echo "functionCoverage $functionCoverage %" >> $out/nix-support/hydra-metrics + + echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products +} diff --git a/pkgs/build-support/setup-hooks/make-symlinks-relative.sh b/pkgs/build-support/setup-hooks/make-symlinks-relative.sh new file mode 100644 index 0000000..b07b0c5 --- /dev/null +++ b/pkgs/build-support/setup-hooks/make-symlinks-relative.sh @@ -0,0 +1,37 @@ +# symlinks are often created in postFixup +# don't use fixupOutputHooks, it is before postFixup +postFixupHooks+=(_makeSymlinksRelativeInAllOutputs) + +# For every symlink in $output that refers to another file in $output +# ensure that the symlink is relative. This removes references to the output +# has from the resulting store paths and thus the NAR files. +_makeSymlinksRelative() { + local symlinkTarget + + if [ "${dontRewriteSymlinks-}" ] || [ ! -e "$prefix" ]; then + return + fi + + while IFS= read -r -d $'\0' f; do + symlinkTarget=$(readlink "$f") + if [[ "$symlinkTarget"/ != "$prefix"/* ]]; then + # skip this symlink as it doesn't point to $prefix + continue + fi + + if [ ! -e "$symlinkTarget" ]; then + echo "the symlink $f is broken, it points to $symlinkTarget (which is missing)" + fi + + echo "rewriting symlink $f to be relative to $prefix" + ln -snrf "$symlinkTarget" "$f" + + done < <(find $prefix -type l -print0) +} + +_makeSymlinksRelativeInAllOutputs() { + local output + for output in $(getAllOutputNames); do + prefix="${!output}" _makeSymlinksRelative + done +} diff --git a/pkgs/build-support/setup-hooks/make-wrapper.sh b/pkgs/build-support/setup-hooks/make-wrapper.sh new file mode 100644 index 0000000..cba158b --- /dev/null +++ b/pkgs/build-support/setup-hooks/make-wrapper.sh @@ -0,0 +1,225 @@ +# Assert that FILE exists and is executable +# +# assertExecutable FILE +assertExecutable() { + local file="$1" + [[ -f "$file" && -x "$file" ]] || \ + die "Cannot wrap '$file' because it is not an executable file" +} + +# construct an executable file that wraps the actual executable +# makeWrapper EXECUTABLE OUT_PATH ARGS + +# ARGS: +# --argv0 NAME : set the name of the executed process to NAME +# (if unset or empty, defaults to EXECUTABLE) +# --inherit-argv0 : the executable inherits argv0 from the wrapper. +# (use instead of --argv0 '$0') +# --resolve-argv0 : if argv0 doesn't include a / character, resolve it against PATH +# --set VAR VAL : add VAR with value VAL to the executable's environment +# --set-default VAR VAL : like --set, but only adds VAR if not already set in +# the environment +# --unset VAR : remove VAR from the environment +# --chdir DIR : change working directory (use instead of --run "cd DIR") +# --run COMMAND : run command before the executable +# --add-flags ARGS : prepend ARGS to the invocation of the executable +# (that is, *before* any arguments passed on the command line) +# --append-flags ARGS : append ARGS to the invocation of the executable +# (that is, *after* any arguments passed on the command line) + +# --prefix ENV SEP VAL : suffix/prefix ENV with VAL, separated by SEP +# --suffix +# --prefix-each ENV SEP VALS : like --prefix, but VALS is a list +# --suffix-each ENV SEP VALS : like --suffix, but VALS is a list +# --prefix-contents ENV SEP FILES : like --suffix-each, but contents of FILES +# are read first and used as VALS +# --suffix-contents +makeWrapper() { makeShellWrapper "$@"; } +makeShellWrapper() { + local original="$1" + local wrapper="$2" + local params varName value command separator n fileNames + local argv0 flagsBefore flagsAfter flags + + assertExecutable "$original" + + # Write wrapper code which adds `value` to the beginning or end of + # the list variable named by `varName`, depending on the `mode` + # specified. + # + # A value which is already part of the list will not be added + # again. If this is the case and the `suffix` mode is used, the + # list won't be touched at all. The `prefix` mode will however + # move the last matching instance of the value to the beginning + # of the list. Any remaining duplicates of the value will be left + # as-is. + addValue() { + local mode="$1" # `prefix` or `suffix` to add to the beginning or end respectively + local varName="$2" # name of list variable to add to + local separator="$3" # character used to separate elements of list + local value="$4" # one value, or multiple values separated by `separator`, to add to list + + # Disable file globbing, since bash will otherwise try to find + # filenames matching the the value to be prefixed/suffixed if + # it contains characters considered wildcards, such as `?` and + # `*`. We want the value as is, except we also want to split + # it on on the separator; hence we can't quote it. + local reenableGlob=0 + if [[ ! -o noglob ]]; then + reenableGlob=1 + fi + set -o noglob + + if [[ -n "$value" ]]; then + local old_ifs=$IFS + IFS=$separator + + if [[ "$mode" == '--prefix'* ]]; then + # Keep the order of the components as written when + # prefixing; normally, they would be added in the + # reverse order. + local tmp= + for v in $value; do + tmp=$v${tmp:+$separator}$tmp + done + value="$tmp" + fi + for v in $value; do + { + echo "$varName=\${$varName:+${separator@Q}\$$varName${separator@Q}}" # add separators on both ends unless empty + if [[ "$mode" == '--prefix'* ]]; then # -- in prefix mode -- + echo "$varName=\${$varName/${separator@Q}${v@Q}${separator@Q}/${separator@Q}}" # remove the first instance of the value (if any) + echo "$varName=${v@Q}\$$varName" # prepend the value + elif [[ "$mode" == '--suffix'* ]]; then # -- in suffix mode -- + echo "if [[ \$$varName != *${separator@Q}${v@Q}${separator@Q}* ]]; then" # if the value isn't already in the list + echo " $varName=\$$varName${v@Q}" # append the value + echo "fi" + else + echo "unknown mode $mode!" 1>&2 + exit 1 + fi + echo "$varName=\${$varName#${separator@Q}}" # remove leading separator + echo "$varName=\${$varName%${separator@Q}}" # remove trailing separator + echo "export $varName" + } >> "$wrapper" + done + IFS=$old_ifs + fi + + if (( reenableGlob )); then + set +o noglob + fi + } + + mkdir -p "$(dirname "$wrapper")" + + echo "#! @shell@ -e" > "$wrapper" + + params=("$@") + for ((n = 2; n < ${#params[*]}; n += 1)); do + p="${params[$n]}" + + if [[ "$p" == "--set" ]]; then + varName="${params[$((n + 1))]}" + value="${params[$((n + 2))]}" + n=$((n + 2)) + echo "export $varName=${value@Q}" >> "$wrapper" + elif [[ "$p" == "--set-default" ]]; then + varName="${params[$((n + 1))]}" + value="${params[$((n + 2))]}" + n=$((n + 2)) + echo "export $varName=\${$varName-${value@Q}}" >> "$wrapper" + elif [[ "$p" == "--unset" ]]; then + varName="${params[$((n + 1))]}" + n=$((n + 1)) + echo "unset $varName" >> "$wrapper" + elif [[ "$p" == "--chdir" ]]; then + dir="${params[$((n + 1))]}" + n=$((n + 1)) + echo "cd ${dir@Q}" >> "$wrapper" + elif [[ "$p" == "--run" ]]; then + command="${params[$((n + 1))]}" + n=$((n + 1)) + echo "$command" >> "$wrapper" + elif [[ ("$p" == "--suffix") || ("$p" == "--prefix") ]]; then + varName="${params[$((n + 1))]}" + separator="${params[$((n + 2))]}" + value="${params[$((n + 3))]}" + n=$((n + 3)) + addValue "$p" "$varName" "$separator" "$value" + elif [[ ("$p" == "--suffix-each") || ("$p" == "--prefix-each") ]]; then + varName="${params[$((n + 1))]}" + separator="${params[$((n + 2))]}" + values="${params[$((n + 3))]}" + n=$((n + 3)) + for value in $values; do + addValue "$p" "$varName" "$separator" "$value" + done + elif [[ ("$p" == "--suffix-contents") || ("$p" == "--prefix-contents") ]]; then + varName="${params[$((n + 1))]}" + separator="${params[$((n + 2))]}" + fileNames="${params[$((n + 3))]}" + n=$((n + 3)) + for fileName in $fileNames; do + contents="$(cat "$fileName")" + addValue "$p" "$varName" "$separator" "$contents" + done + elif [[ "$p" == "--add-flags" ]]; then + flags="${params[$((n + 1))]}" + n=$((n + 1)) + flagsBefore="${flagsBefore-} $flags" + elif [[ "$p" == "--append-flags" ]]; then + flags="${params[$((n + 1))]}" + n=$((n + 1)) + flagsAfter="${flagsAfter-} $flags" + elif [[ "$p" == "--argv0" ]]; then + argv0="${params[$((n + 1))]}" + n=$((n + 1)) + elif [[ "$p" == "--inherit-argv0" ]]; then + # Whichever comes last of --argv0 and --inherit-argv0 wins + argv0='$0' + elif [[ "$p" == "--resolve-argv0" ]]; then + # this is noop in shell wrappers, since bash will always resolve $0 + resolve_argv0=1 + else + die "makeWrapper doesn't understand the arg $p" + fi + done + + echo exec ${argv0:+-a \"$argv0\"} \""$original"\" \ + "${flagsBefore-}" '"$@"' "${flagsAfter-}" >> "$wrapper" + + chmod +x "$wrapper" +} + +addSuffix() { + suffix="$1" + shift + for name in "$@"; do + echo "$name$suffix" + done +} + +filterExisting() { + for fn in "$@"; do + if test -e "$fn"; then + echo "$fn" + fi + done +} + +# Syntax: wrapProgram +wrapProgram() { wrapProgramShell "$@"; } +wrapProgramShell() { + local prog="$1" + local hidden + + assertExecutable "$prog" + + hidden="$(dirname "$prog")/.$(basename "$prog")"-wrapped + while [ -e "$hidden" ]; do + hidden="${hidden}_" + done + mv "$prog" "$hidden" + makeShellWrapper "$hidden" "$prog" --inherit-argv0 "${@:2}" +} diff --git a/pkgs/build-support/setup-hooks/move-build-tree.sh b/pkgs/build-support/setup-hooks/move-build-tree.sh new file mode 100644 index 0000000..2718070 --- /dev/null +++ b/pkgs/build-support/setup-hooks/move-build-tree.sh @@ -0,0 +1,12 @@ +prePhases+=" moveBuildDir" + +moveBuildDir() { + mkdir -p $out/.build + cd $out/.build +} + +postPhases+=" removeBuildDir" + +removeBuildDir() { + rm -rf $out/.build +} diff --git a/pkgs/build-support/setup-hooks/move-docs.sh b/pkgs/build-support/setup-hooks/move-docs.sh new file mode 100644 index 0000000..3f96115 --- /dev/null +++ b/pkgs/build-support/setup-hooks/move-docs.sh @@ -0,0 +1,27 @@ +# This setup hook moves $out/{man,doc,info} to $out/share. + +preFixupHooks+=(_moveToShare) + +_moveToShare() { + if [ -n "$__structuredAttrs" ]; then + if [ -z "${forceShare-}" ]; then + forceShare=( man doc info ) + fi + else + forceShare=( ${forceShare:-man doc info} ) + fi + + if [[ -z "$out" ]]; then return; fi + + for d in "${forceShare[@]}"; do + if [ -d "$out/$d" ]; then + if [ -d "$out/share/$d" ]; then + echo "both $d/ and share/$d/ exist!" + else + echo "moving $out/$d to $out/share/$d" + mkdir -p $out/share + mv $out/$d $out/share/ + fi + fi + done +} diff --git a/pkgs/build-support/setup-hooks/move-lib64.sh b/pkgs/build-support/setup-hooks/move-lib64.sh new file mode 100644 index 0000000..9517af7 --- /dev/null +++ b/pkgs/build-support/setup-hooks/move-lib64.sh @@ -0,0 +1,22 @@ +# This setup hook, for each output, moves everything in $output/lib64 +# to $output/lib, and replaces $output/lib64 with a symlink to +# $output/lib. The rationale is that lib64 directories are unnecessary +# in Nix (since 32-bit and 64-bit builds of a package are in different +# store paths anyway). +# If the move would overwrite anything, it should fail on rmdir. + +fixupOutputHooks+=(_moveLib64) + +_moveLib64() { + if [ "${dontMoveLib64-}" = 1 ]; then return; fi + if [ ! -e "$prefix/lib64" -o -L "$prefix/lib64" ]; then return; fi + echo "moving $prefix/lib64/* to $prefix/lib" + mkdir -p $prefix/lib + shopt -s dotglob + for i in $prefix/lib64/*; do + mv --no-clobber "$i" $prefix/lib + done + shopt -u dotglob + rmdir $prefix/lib64 + ln -s lib $prefix/lib64 +} diff --git a/pkgs/build-support/setup-hooks/move-sbin.sh b/pkgs/build-support/setup-hooks/move-sbin.sh new file mode 100644 index 0000000..1c0c4dc --- /dev/null +++ b/pkgs/build-support/setup-hooks/move-sbin.sh @@ -0,0 +1,19 @@ +# This setup hook, for each output, moves everything in $output/sbin +# to $output/bin, and replaces $output/sbin with a symlink to +# $output/bin. + +fixupOutputHooks+=(_moveSbin) + +_moveSbin() { + if [ "${dontMoveSbin-}" = 1 ]; then return; fi + if [ ! -e "$prefix/sbin" -o -L "$prefix/sbin" ]; then return; fi + echo "moving $prefix/sbin/* to $prefix/bin" + mkdir -p $prefix/bin + shopt -s dotglob + for i in $prefix/sbin/*; do + mv "$i" $prefix/bin + done + shopt -u dotglob + rmdir $prefix/sbin + ln -s bin $prefix/sbin +} diff --git a/pkgs/build-support/setup-hooks/move-systemd-user-units.sh b/pkgs/build-support/setup-hooks/move-systemd-user-units.sh new file mode 100755 index 0000000..33e8989 --- /dev/null +++ b/pkgs/build-support/setup-hooks/move-systemd-user-units.sh @@ -0,0 +1,25 @@ +# shellcheck shell=bash + +# This setup hook, for each output, moves everything in +# $output/lib/systemd/user to $output/share/systemd/user, and replaces +# $output/lib/systemd/user with a symlink to +# $output/share/systemd/user. + +fixupOutputHooks+=(_moveSystemdUserUnits) + +_moveSystemdUserUnits() { + if [ "${dontMoveSystemdUserUnits:-0}" = 1 ]; then return; fi + if [ ! -e "${prefix:?}/lib/systemd/user" ]; then return; fi + local source="$prefix/lib/systemd/user" + local target="$prefix/share/systemd/user" + echo "moving $source/* to $target" + mkdir -p "$target" + ( + shopt -s dotglob + for i in "$source"/*; do + mv "$i" "$target" + done + ) + rmdir "$source" + ln -s "$target" "$source" +} diff --git a/pkgs/build-support/setup-hooks/mpi-check-hook/default.nix b/pkgs/build-support/setup-hooks/mpi-check-hook/default.nix new file mode 100644 index 0000000..2834cfc --- /dev/null +++ b/pkgs/build-support/setup-hooks/mpi-check-hook/default.nix @@ -0,0 +1,5 @@ +{ callPackage, makeSetupHook }: + +makeSetupHook { + name = "mpi-checkPhase-hook"; +} ./mpi-check-hook.sh diff --git a/pkgs/build-support/setup-hooks/mpi-check-hook/mpi-check-hook.sh b/pkgs/build-support/setup-hooks/mpi-check-hook/mpi-check-hook.sh new file mode 100644 index 0000000..fca1f7b --- /dev/null +++ b/pkgs/build-support/setup-hooks/mpi-check-hook/mpi-check-hook.sh @@ -0,0 +1,54 @@ +preCheckHooks+=('setupMpiCheck') +preInstallCheckHooks+=('setupMpiCheck') + + +setupMpiCheck() { + # Find out which MPI implementation we are using + # and set safe defaults that are guaranteed to run + # on any build machine + + mpiType="NONE" + + # OpenMPI signature + if command ompi_info &> /dev/null; then + mpiType="openmpi" + fi + + # MPICH based implementations + if command mpichversion &> /dev/null; then + if [ "$mpiType" != "NONE" ]; then + echo "WARNING: found OpenMPI and MPICH/MVAPICH executables" + fi + + version=$(mpichversion) + if [[ "$version" == *"MPICH"* ]]; then + mpiType="MPICH" + fi + if [[ "$version" == *"MVAPICH"* ]]; then + mpiType="MVAPICH" + fi + fi + + echo "Found MPI implementation: $mpiType" + + case $mpiType in + openmpi) + # make sure the test starts even if we have less than the requested amount of cores + export OMPI_MCA_rmaps_base_oversubscribe=1 + # Disable CPU pinning + export OMPI_MCA_hwloc_base_binding_policy=none + ;; + MPICH) + # Fix to make mpich run in a sandbox + export HYDRA_IFACE=lo + ;; + MVAPICH) + # Disable CPU pinning + export MV2_ENABLE_AFFINITY=0 + ;; + esac + + # Limit number of OpenMP threads. Default is "all cores". + export OMP_NUM_THREADS=1 +} + diff --git a/pkgs/build-support/setup-hooks/multiple-outputs.sh b/pkgs/build-support/setup-hooks/multiple-outputs.sh new file mode 100644 index 0000000..45096d8 --- /dev/null +++ b/pkgs/build-support/setup-hooks/multiple-outputs.sh @@ -0,0 +1,214 @@ +# The base package for automatic multiple-output splitting. Used in stdenv as well. +preConfigureHooks+=(_multioutConfig) +preFixupHooks+=(_multioutDocs) +preFixupHooks+=(_multioutDevs) +postFixupHooks+=(_multioutPropagateDev) + +# _assignFirst varName otherVarNames* +# +# Set the value of the variable named $varName to the first of otherVarNames +# that refers to a non-empty variable name. +# +# If none of otherVarNames refers to a non-empty variable, the error message is +# specific to this function's use case, which is setting up the output variables. +_assignFirst() { + local varName="$1" + local _var + local REMOVE=REMOVE # slightly hacky - we allow REMOVE (i.e. not a variable name) + shift + for _var in "$@"; do + if [ -n "${!_var-}" ]; then eval "${varName}"="${_var}"; return; fi + done + echo + echo "error: _assignFirst: could not find a non-empty variable whose name to assign to ${varName}." + echo " The following variables were all unset or empty:" + echo " $*" + if [ -z "${out:-}" ]; then + echo ' If you do not want an "out" output in your derivation, make sure to define' + echo ' the other specific required outputs. This can be achieved by picking one' + echo " of the above as an output." + echo ' You do not have to remove "out" if you want to have a different default' + echo ' output, because the first output is taken as a default.' + echo + fi + return 1 # none found +} + +# Same as _assignFirst, but only if "$1" = "" +_overrideFirst() { + if [ -z "${!1-}" ]; then + _assignFirst "$@" + fi +} + + +# Setup chains of sane default values with easy overridability. +# The variables are global to be usable anywhere during the build. +# Typical usage in package is defining outputBin = "dev"; + +_overrideFirst outputDev "dev" "out" +_overrideFirst outputBin "bin" "out" + +_overrideFirst outputInclude "$outputDev" + +# so-libs are often among the main things to keep, and so go to $out +_overrideFirst outputLib "lib" "out" + +_overrideFirst outputDoc "doc" "out" +_overrideFirst outputDevdoc "devdoc" REMOVE # documentation for developers +# man and info pages are small and often useful to distribute with binaries +_overrideFirst outputMan "man" "$outputBin" +_overrideFirst outputDevman "devman" "devdoc" "$outputMan" +_overrideFirst outputInfo "info" "$outputBin" + + +# Add standard flags to put files into the desired outputs. +_multioutConfig() { + if [ "$(getAllOutputNames)" = "out" ] || [ -z "${setOutputFlags-1}" ]; then return; fi; + + # try to detect share/doc/${shareDocName} + # Note: sadly, $configureScript detection comes later in configurePhase, + # and reordering would cause more trouble than worth. + if [ -z "${shareDocName:-}" ]; then + local confScript="${configureScript:-}" + if [ -z "$confScript" ] && [ -x ./configure ]; then + confScript=./configure + fi + if [ -f "$confScript" ]; then + local shareDocName="$(sed -n "s/^PACKAGE_TARNAME='\(.*\)'$/\1/p" < "$confScript")" + fi + # PACKAGE_TARNAME sometimes contains garbage. + if [ -z "$shareDocName" ] || echo "$shareDocName" | grep -q '[^a-zA-Z0-9_-]'; then + shareDocName="$(echo "$name" | sed 's/-[^a-zA-Z].*//')" + fi + fi + + prependToVar configureFlags \ + --bindir="${!outputBin}"/bin --sbindir="${!outputBin}"/sbin \ + --includedir="${!outputInclude}"/include --oldincludedir="${!outputInclude}"/include \ + --mandir="${!outputMan}"/share/man --infodir="${!outputInfo}"/share/info \ + --docdir="${!outputDoc}"/share/doc/"${shareDocName}" \ + --libdir="${!outputLib}"/lib --libexecdir="${!outputLib}"/libexec \ + --localedir="${!outputLib}"/share/locale + + prependToVar installFlags \ + pkgconfigdir="${!outputDev}"/lib/pkgconfig \ + m4datadir="${!outputDev}"/share/aclocal aclocaldir="${!outputDev}"/share/aclocal +} + + +# Add rpath prefixes to library paths, and avoid stdenv doing it for $out. +_addRpathPrefix "${!outputLib}" +NIX_NO_SELF_RPATH=1 + + +# Move subpaths that match pattern $1 from under any output/ to the $2 output/ +# Beware: only globbing patterns are accepted, e.g.: * ? [abc] +# A special target "REMOVE" is allowed: moveToOutput foo REMOVE +moveToOutput() { + local patt="$1" + local dstOut="$2" + local output + for output in $(getAllOutputNames); do + if [ "${!output}" = "$dstOut" ]; then continue; fi + local srcPath + for srcPath in "${!output}"/$patt; do + # apply to existing files/dirs, *including* broken symlinks + if [ ! -e "$srcPath" ] && [ ! -L "$srcPath" ]; then continue; fi + + if [ "$dstOut" = REMOVE ]; then + echo "Removing $srcPath" + rm -r "$srcPath" + else + local dstPath="$dstOut${srcPath#${!output}}" + echo "Moving $srcPath to $dstPath" + + if [ -d "$dstPath" ] && [ -d "$srcPath" ] + then # attempt directory merge + # check the case of trying to move an empty directory + rmdir "$srcPath" --ignore-fail-on-non-empty + if [ -d "$srcPath" ]; then + mv -t "$dstPath" "$srcPath"/* + rmdir "$srcPath" + fi + else # usual move + mkdir -p "$(readlink -m "$dstPath/..")" + mv "$srcPath" "$dstPath" + fi + fi + + # remove empty directories, printing iff at least one gets removed + local srcParent="$(readlink -m "$srcPath/..")" + if [ -n "$(find "$srcParent" -maxdepth 0 -type d -empty 2>/dev/null)" ]; then + echo "Removing empty $srcParent/ and (possibly) its parents" + rmdir -p --ignore-fail-on-non-empty "$srcParent" \ + 2> /dev/null || true # doesn't ignore failure for some reason + fi + done + done +} + +# Move documentation to the desired outputs. +_multioutDocs() { + local REMOVE=REMOVE # slightly hacky - we expand ${!outputFoo} + + moveToOutput share/info "${!outputInfo}" + moveToOutput share/doc "${!outputDoc}" + moveToOutput share/gtk-doc "${!outputDevdoc}" + moveToOutput share/devhelp/books "${!outputDevdoc}" + + # the default outputMan is in $bin + moveToOutput share/man "${!outputMan}" + moveToOutput share/man/man3 "${!outputDevman}" +} + +# Move development-only stuff to the desired outputs. +_multioutDevs() { + if [ "$(getAllOutputNames)" = "out" ] || [ -z "${moveToDev-1}" ]; then return; fi; + moveToOutput include "${!outputInclude}" + # these files are sometimes provided even without using the corresponding tool + moveToOutput lib/pkgconfig "${!outputDev}" + moveToOutput share/pkgconfig "${!outputDev}" + moveToOutput lib/cmake "${!outputDev}" + moveToOutput share/aclocal "${!outputDev}" + # don't move *.la, as libtool needs them in the directory of the library + + for f in "${!outputDev}"/{lib,share}/pkgconfig/*.pc; do + echo "Patching '$f' includedir to output ${!outputInclude}" + sed -i "/^includedir=/s,=\${prefix},=${!outputInclude}," "$f" + done +} + +# Make the "dev" propagate other outputs needed for development. +_multioutPropagateDev() { + if [ "$(getAllOutputNames)" = "out" ]; then return; fi; + + local outputFirst + for outputFirst in $(getAllOutputNames); do + break + done + local propagaterOutput="$outputDev" + if [ -z "$propagaterOutput" ]; then + propagaterOutput="$outputFirst" + fi + + # Default value: propagate binaries, includes and libraries + if [ -z "${propagatedBuildOutputs+1}" ]; then + local po_dirty="$outputBin $outputInclude $outputLib" + set +o pipefail + propagatedBuildOutputs=`echo "$po_dirty" \ + | tr -s ' ' '\n' | grep -v -F "$propagaterOutput" \ + | sort -u | tr '\n' ' ' ` + set -o pipefail + fi + + # The variable was explicitly set to empty or we resolved it so + if [ -z "$propagatedBuildOutputs" ]; then + return + fi + + mkdir -p "${!propagaterOutput}"/nix-support + for output in $propagatedBuildOutputs; do + echo -n " ${!output}" >> "${!propagaterOutput}"/nix-support/propagated-build-inputs + done +} diff --git a/pkgs/build-support/setup-hooks/patch-ppd-files/default.nix b/pkgs/build-support/setup-hooks/patch-ppd-files/default.nix new file mode 100644 index 0000000..854f857 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-ppd-files/default.nix @@ -0,0 +1,18 @@ +{ lib +, makeSetupHook +, which +, callPackage +}: + +makeSetupHook { + name = "patch-ppd-files"; + substitutions = { + which = lib.getBin which; + awkscript = ./patch-ppd-lines.awk; + }; + passthru.tests.test = callPackage ./test.nix {}; + meta = { + description = "setup hook to patch executable paths in ppd files"; + maintainers = [ lib.maintainers.yarny ]; + }; +} ./patch-ppd-hook.sh diff --git a/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-hook.sh b/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-hook.sh new file mode 100644 index 0000000..77322b2 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-hook.sh @@ -0,0 +1,183 @@ +fixupOutputHooks+=(_patchPpdFileCommands4fixupOutputHooks) + + + +# Install a hook for the `fixupPhase`: +# If the variable `ppdFileCommands` contains a list of +# executable names, the hook calls `patchPpdFileCommands` +# on each output's `/share/cups/model` and `/share/ppds` +# directories in order to replace calls to those executables. + +_patchPpdFileCommands4fixupOutputHooks () { + [[ -n $ppdFileCommands ]] || return 0 + if [[ -d $prefix/share/cups/model ]]; then + patchPpdFileCommands "$prefix/share/cups/model" $ppdFileCommands + fi + if [[ -d $prefix/share/ppds ]]; then + patchPpdFileCommands "$prefix/share/ppds" $ppdFileCommands + fi +} + + + +# patchPpdFileCommands PPD-ROOT PROGNAME... +# +# Look for ppd files in the directory PPD-ROOT. +# Descend into subdirectories, even if they are symlinks. +# However, ignore ppd files that don't belong to the same +# prefix ($NIX_STORE/$package_name) as PPD-ROOT-DIR does, +# to avoid stepping into other package's directories. +# ppd files may be gzipped; if the are, +# uncompress them, later recompress them. +# Skip symlinks to ppd files. +# PPD-ROOT may also be a single ppd file. +# +# Look for the PROGNAME executable in outputs and `buildInputs`, +# then look for PROGNAME invocations in the ppd files, +# without path or with common paths like `/usr/bin/$PROGNAME`. +# Replace those invocations with an absolute path to the +# corresponding executable from the outputs or `buildInputs`. +# Executables are searched where CUPS would search them, +# i.e., in `/bin` and `/lib/cups/filter`. +# +# As soon as an executable's path is replaced as +# described above, the package containing the binary +# is added to the list of propagated build inputs. +# This ensures the executable's package is still +# recognized as runtime dependency of the ppd file +# even if the ppd file is compressed lateron. +# +# PROGNAME may not contain spaces or tabs. +# The function will also likely fail or produce +# broken results if PROGNAME contains characters that +# require shell or regex escaping (e.g. a backslash). + +patchPpdFileCommands () { + + local bin binnew binold binoldgrep cupspath path ppdroot ppdrootprefix + + # we will store some temporary data here + pushd "$(mktemp -d --tmpdir patch-ppd-file-commands.XXXX)" + + # remember the ppd root path + [[ "$1" == $NIX_STORE/* ]] # ensure it's a store directory + ppdroot=$1 + shift # now "$@" is the list of binaries + ppdrootprefix=${ppdroot%"/${ppdroot#"$NIX_STORE"/*/}"} + + # create `cupspath` (where we should look for binaries), + # with these priorities + # * outputs of current build before buildInputs + # * `/lib/cups/filter' before `/bin` + # * add HOST_PATH at end, so we don't miss anything + for path in $(getAllOutputNames); do + addToSearchPath cupspath "${!path}/lib/cups/filter" + addToSearchPath cupspath "${!path}/bin" + done + for path in ${pkgsHostTarget+"${pkgsHostTarget[@]}"}; do + addToSearchPath cupspath "$path/lib/cups/filter" + addToSearchPath cupspath "$path/bin" + done + while read -r -d : path; do + addToSearchPath cupspath "$path" + done <<< "${HOST_PATH:+"${HOST_PATH}:"}" + + # create list of compressed ppd files + # so we can recompress them later + find -L "$ppdroot" -type f -iname '*.ppd.gz' '!' -xtype l -print0 > gzipped + + # decompress gzipped ppd files + echo "patchPpdFileCommands: decompressing $(grep -cz '^' < gzipped) gzipped ppd file(s) in $ppdroot" + xargs -0r -n 64 -P "$NIX_BUILD_CORES" gunzip < gzipped + + # create list of all ppd files to be checked + find -L "$ppdroot" -type f -iname '*.ppd' '!' -xtype l -print0 > ppds + + for bin in "$@"; do + + # discover new path + binnew=$(PATH=$cupspath '@which@/bin/which' "$bin") + echo "patchPpdFileCommands: located binary $binnew" + + # for each binary, we look for the name itself, but + # also for a couple of common paths that might be used + for binold in {/usr,}/{lib/cups/filter,sbin,bin}/"$bin" "$bin"; do + + # escape regex characters in the old command string + binoldgrep=$(sed 's,[]$.*[\^],\\&,g' <<< "$binold") + # ...and surround old command with some regex + # that singles out shell command invocations + # to avoid replacing other strings that might contain the + # command name by accident (like "perl" in "perl-script") + binoldgrep='\(^\|[;&| '$'\t''"`(]\)'"$binoldgrep"'\($\|[);&| '$'\t''"`<>]\)' + # this string is used to *quickly* filter out + # unaffected files before the (slower) awk script runs; + # note that a similar regex is build in the awk script; + # if `binoldgrep` is changed, the awk script should also be checked + + # create list of likely affected files + # (might yield exit status != 0 if there are no matches) + xargs -0r grep -lZ "$binoldgrep" < ppds > ppds-to-patch || true + + echo "patchPpdFileCommands: $(grep -cz '^' < ppds-to-patch) ppd file(s) contain $binold" + + # actually patch affected ppd files with awk; + # this takes some time but can be parallelized; + # speed up with LC_ALL=C, https://stackoverflow.com/a/33850386 + LC_ALL=C xargs -0r -n 64 -P "$NIX_BUILD_CORES" \ + awk -i inplace -v old="${binold//\\/\\\\}" -v new="${binnew//\\/\\\\}" -f "@awkscript@" \ + < ppds-to-patch + + done + + # create list of affected files + xargs -0r grep -lZF "$binnew" < ppds > patched-ppds || true + + echo "patchPpdFileCommands: $(grep -cz '^' < patched-ppds) ppd file(s) patched with $binnew" + + # if the new command is contained in a file, + # remember the new path so we can add it to + # the list of propagated dependencies later + if [[ -s patched-ppds ]]; then + printf '%s\0' "${binnew%"/${binnew#"${NIX_STORE}"/*/}"}" >> dependencies + fi + + done + + # recompress ppd files that have been decompressed before + echo "patchPpdFileCommands: recompressing $(grep -cz '^' < gzipped) gzipped ppd file(s)" + # we can't just hand over the paths of the uncompressed files + # to gzip as it would add the lower-cased extension ".gz" + # even for files where the original was named ".GZ" + xargs -0r -n 1 -P "$NIX_BUILD_CORES" \ + "$SHELL" -c 'gzip -9nS ".${0##*.}" "${0%.*}"' \ + < gzipped + + # enlist dependencies for propagation; + # this is needed in case ppd files are compressed later + # (Nix won't find dependency paths in compressed files) + if [[ -s dependencies ]]; then + + # weed out duplicates from the dependency list first + sort -zu dependencies > sorted-dependencies + + mkdir -p "$ppdrootprefix/nix-support" + while IFS= read -r -d '' path; do + printWords "$path" >> "$ppdrootprefix/nix-support/propagated-build-inputs" + # stdenv writes it's own `propagated-build-inputs`, + # based on the variable `propagatedBuildInputs`, + # but only to one output (`outputDev`). + # So we also add our dependencies to that variable. + # If our file survives as written above, great! + # If stdenv overwrits it, + # our dependencies will still be added to the file. + # The end result might contain too many + # propagated dependencies for multi-output packages, + # but never a broken package. + propagatedBuildInputs+=("$path") + done < sorted-dependencies + fi + + popd + +} diff --git a/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-lines.awk b/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-lines.awk new file mode 100644 index 0000000..ddb9171 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-ppd-files/patch-ppd-lines.awk @@ -0,0 +1,50 @@ +BEGIN { + + # ppd file keys are separated from their values by a colon, + # but "options" may reside between the key name and the colon; + # options are separated from the key by spaces + # (we also permit tabs to be on the safe side) + FS = "[: \t]"; + + # escape regex characters in the old and new command strings + gsub(/[]\\.^$(){}|*+?[]/, "\\\\&", old); + gsub(/\\/, "\\\\&", new); + # ...and surround old command with some regex + # that singles out shell command invocations + # to avoid replacing other strings that might contain the + # command name by accident (like "perl" in "perl-script") + new = "\\1" new "\\2"; + old = "(^|[;&| \\t\"`(])" old "($|[);&| \\t\"`<>])"; + # note that a similar regex is build in the shell script to + # filter out unaffected files before this awk script is called; + # if the regex here is changed, the shell script should also be checked + + # list of PPD keys that contain executable names or scripts, see + # https://refspecs.linuxfoundation.org/LSB_4.0.0/LSB-Printing/LSB-Printing/ppdext.html + # https://www.cups.org/doc/spec-ppd.html + cmds["*APAutoSetupTool"] = ""; + cmds["*APPrinterLowInkTool"] = ""; + cmds["*FoomaticRIPCommandLine"] = ""; + cmds["*FoomaticRIPPostPipe"] = ""; + cmds["*cupsFilter"] = ""; + cmds["*cupsFilter2"] = ""; + cmds["*cupsPreFilter"] = ""; + +} + +# since comments always start with "*%", +# this mechanism also properly recognizes (and ignores) them + +{ + + # if the current line starts a new key, + # check if it is a command-containing key; + # also reset the `isCmd` flag if a new file begins + if ($0 ~ /^\*/ || FNR == 1) { isCmd = ($1 in cmds) } + + # replace commands if the current keys might contain commands + if (isCmd) { $0 = gensub(old, new, "g") } + + print + +} diff --git a/pkgs/build-support/setup-hooks/patch-ppd-files/test.nix b/pkgs/build-support/setup-hooks/patch-ppd-files/test.nix new file mode 100644 index 0000000..4f2996b --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-ppd-files/test.nix @@ -0,0 +1,40 @@ +{ substituteAll +, diffutils +, stdenv +, patchPpdFilesHook +}: + +let + input = substituteAll { + src = ./test.ppd; + keep = "cmp"; + patch = "cmp"; + pathkeep = "/bin/cmp"; + pathpatch = "/bin/cmp"; + }; + + output = substituteAll { + src = ./test.ppd; + keep = "cmp"; + patch = "${diffutils}/bin/cmp"; + pathkeep = "/bin/cmp"; + pathpatch = "${diffutils}/bin/cmp"; + }; +in + +stdenv.mkDerivation { + name = "${patchPpdFilesHook.name}-test"; + buildInputs = [ diffutils ]; + nativeBuildInputs = [ diffutils patchPpdFilesHook ]; + dontUnpack = true; + dontInstall = true; + ppdFileCommands = [ "cmp" ]; + preFixup = '' + install -D "${input}" "${placeholder "out"}/share/cups/model/test.ppd" + install -D "${input}" "${placeholder "out"}/share/ppds/test.ppd" + ''; + postFixup = '' + diff --color --report-identical-files "${output}" "${placeholder "out"}/share/cups/model/test.ppd" + diff --color --report-identical-files "${output}" "${placeholder "out"}/share/ppds/test.ppd" + ''; +} diff --git a/pkgs/build-support/setup-hooks/patch-ppd-files/test.ppd b/pkgs/build-support/setup-hooks/patch-ppd-files/test.ppd new file mode 100644 index 0000000..d0ca11c --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-ppd-files/test.ppd @@ -0,0 +1,22 @@ +*% This comment: might look like a command @keep@ +*% but it should be left untouched +*SomeKey: do not replace this @keep@ +*APAutoSetupTool: do replace this @patch@ +*FoomaticRIPCommandLine: "patch also @patch@ +in a multi-line command @patch@ +and another line @patch@ +*SomeKey: "stop patching on new non-command key @keep@ +and remember the key in the next line @keep@" +*cupsFilter option: recognize keys with options @patch@ +*cupsFilter : handle strange spacing;@patch@ +*cupsFilter : handle tabulator @patch@ +*cupsFilter: patch common paths @pathpatch@ +*cupsFilter: patch quoted commands "@patch@" +*cupsFilter: patch commands in subshell (@patch@) +*cupsFilter: patch commands in subshell `@pathpatch@` +*cupsFilter: keep uncommon paths /fancy/@pathkeep@ +*cupsFilter: keep entangled commands-@keep@ +*cupsFilter: keep entangled commands\@keep@ +*cupsFilter: keep entangled commands @keep@() +*cupsFilter: keep entangled commands @pathkeep@-cmd +*%cupsFilter: This comment should also be left as is @pathkeep@ diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/default.nix b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/default.nix new file mode 100644 index 0000000..f166445 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/default.nix @@ -0,0 +1,60 @@ +{ lib +, callPackage +, makeSetupHook +, gnused +}: +let + tests = import ./test { inherit callPackage; }; +in +{ + patchRcPathBash = makeSetupHook + { + name = "patch-rc-path-bash"; + meta = with lib; { + description = "Setup-hook to inject source-time PATH prefix to a Bash/Ksh/Zsh script"; + maintainers = with maintainers; [ ShamrockLee ]; + }; + passthru.tests = { + inherit (tests) test-bash; + }; + } ./patch-rc-path-bash.sh; + patchRcPathCsh = makeSetupHook + { + name = "patch-rc-path-csh"; + substitutions = { + sed = "${gnused}/bin/sed"; + }; + meta = with lib; { + description = "Setup-hook to inject source-time PATH prefix to a Csh script"; + maintainers = with maintainers; [ ShamrockLee ]; + }; + passthru.tests = { + inherit (tests) test-csh; + }; + } ./patch-rc-path-csh.sh; + patchRcPathFish = makeSetupHook + { + name = "patch-rc-path-fish"; + meta = with lib; { + description = "Setup-hook to inject source-time PATH prefix to a Fish script"; + maintainers = with maintainers; [ ShamrockLee ]; + }; + passthru.tests = { + inherit (tests) test-fish; + }; + } ./patch-rc-path-fish.sh; + patchRcPathPosix = makeSetupHook + { + name = "patch-rc-path-posix"; + substitutions = { + sed = "${gnused}/bin/sed"; + }; + meta = with lib; { + description = "Setup-hook to inject source-time PATH prefix to a POSIX shell script"; + maintainers = with maintainers; [ ShamrockLee ]; + }; + passthru.tests = { + inherit (tests) test-posix; + }; + } ./patch-rc-path-posix.sh; +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-bash.sh b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-bash.sh new file mode 100644 index 0000000..b98b983 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-bash.sh @@ -0,0 +1,50 @@ +patchRcPathBash(){ + local FILE_TO_PATCH="$1" + local SOURCETIME_PATH="$2" + local FILE_TO_WORK_ON="$(mktemp "$(basename "$FILE_TO_PATCH").XXXXXX.tmp")" + cat <> "$FILE_TO_WORK_ON" +# Lines to add to PATH the source-time utilities for Nixpkgs packaging +if [[ -n "\${NIXPKGS_SOURCETIME_PATH-}" ]]; then + NIXPKGS_SOURCETIME_PATH_OLD="\$NIXPKGS_SOURCETIME_PATH;\${NIXPKGS_SOURCETIME_PATH_OLD-}" +fi +NIXPKGS_SOURCETIME_PATH="$SOURCETIME_PATH" +if [[ -n "\$PATH" ]]; then + PATH="\$NIXPKGS_SOURCETIME_PATH:\$PATH" +else + PATH="\$NIXPKGS_SOURCETIME_PATH" +fi +export PATH +# End of lines to add to PATH source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_PATCH" >> "$FILE_TO_WORK_ON" + cat <> "$FILE_TO_WORK_ON" +# Lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +if [[ -n "\${PATH-}" ]]; then + # Remove the inserted section + PATH="\${PATH/\$NIXPKGS_SOURCETIME_PATH}" + # Remove the duplicated colons + PATH="\${PATH//::/:}" + # Remove the prefixing colon + if [[ -n "\$PATH" && "\${PATH:0:1}" == ":" ]]; then + PATH="\${PATH:1}" + fi + # Remove the trailing colon + if [[ -n "\$PATH" && "\${PATH:\${#PATH}-1}" == ":" ]]; then + PATH="\${PATH::}" + fi + export PATH +fi +if [[ -n "\${NIXPKGS_SOURCETIME_PATH_OLD-}" ]]; then + IFS="" read -r -d ";" NIXPKGS_SOURCETIME_PATH <<< "\$NIXPKGS_SOURCETIME_PATH_OLD" + NIXPKGS_SOURCETIME_PATH_OLD="\${NIXPKGS_SOURCETIME_PATH_OLD:\${#NIXPKGS_SOURCETIME_PATH}+1}" +else + unset NIXPKGS_SOURCETIME_PATH +fi +if [[ -z "\${NIXPKGS_SOURCETIME_PATH_OLD-}" ]]; then + unset NIXPKGS_SOURCETIME_PATH_OLD +fi +# End of lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_WORK_ON" > "$FILE_TO_PATCH" + rm "$FILE_TO_WORK_ON" +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-csh.sh b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-csh.sh new file mode 100644 index 0000000..5e23670 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-csh.sh @@ -0,0 +1,57 @@ +patchRcPathCsh(){ + local FILE_TO_PATCH="$1" + local SOURCETIME_PATH="$2" + local FILE_TO_WORK_ON="$(mktemp "$(basename "$FILE_TO_PATCH").XXXXXX.tmp")" + cat <> "$FILE_TO_WORK_ON" +# Lines to add to PATH the source-time utilities for Nixpkgs packaging +if (\$?NIXPKGS_SOURCETIME_PATH) then + if ("\$NIXPKGS_SOURCETIME_PATH" != "") then + if (\$?NIXPKGS_SOURCETIME_PATH_OLD) then + if ("\$NIXPKGS_SOURCETIME_PATH_OLD" != "") + set NIXPKGS_SOURCETIME_PATH_OLD = (\$NIXPKGS_SOURCETIME_PATH \$NIXPKGS_SOURCETIME_PATH_OLD) + else + set NIXPKGS_SOURCETIME_PATH_OLD = \$NIXPKGS_SOURCETIME_PATH + endif + else + set NIXPKGS_SOURCETIME_PATH_OLD = \$NIXPKGS_SOURCETIME_PATH + endif + endif +endif +set NIXPKGS_SOURCETIME_PATH = "$SOURCETIME_PATH" +if (! \$?PATH) then + setenv PATH "" +endif +if ("\$PATH" != "") then + setenv PATH "\${NIXPKGS_SOURCETIME_PATH}:\$PATH" +else + setenv PATH "\$NIXPKGS_SOURCETIME_PATH" +endif +# End of lines to add to PATH source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_PATCH" >> "$FILE_TO_WORK_ON" + cat <> "$FILE_TO_WORK_ON" +# Lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +if (\$?PATH) then + if ("\$PATH" != "") then + # Remove the inserted section, the duplicated colons, and the leading and trailing colon + setenv PATH \`echo "\$PATH" | @sed@ "s#\${NIXPKGS_SOURCETIME_PATH}##" | @sed@ "s#::#:#g" | @sed@ "s#^:##" | @sed@ 's#:\$##'\` + endif +endif +if (\$?NIXPKGS_SOURCETIME_PATH_OLD) then + if ("\$NIXPKGS_SOURCETIME_PATH_OLD" != "") then + set NIXPKGS_SOURCETIME_PATH = \$NIXPKGS_SOURCETIME_PATH_OLD[1] + set NIXPKGS_SOURCETIME_PATH_OLD = \$NIXPKGS_SOURCETIME_PATH_OLD[2-] + else + unset NIXPKGS_SOURCETIME_PATH + endif + if (NIXPKGS_SOURCETIME_PATH_OLD == "") then + unset NIXPKGS_SOURCETIME_PATH_OLD + endif +else + unset NIXPKGS_SOURCETIME_PATH +endif +# End of lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_WORK_ON" > "$FILE_TO_PATCH" + rm "$FILE_TO_WORK_ON" +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-fish.sh b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-fish.sh new file mode 100644 index 0000000..3d3e08c --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-fish.sh @@ -0,0 +1,50 @@ +patchRcPathFish(){ + local FILE_TO_PATCH="$1" + local SOURCETIME_PATH="$2" + local FILE_TO_WORK_ON="$(mktemp "$(basename "$FILE_TO_PATCH").XXXXXX.tmp")" + cat <> "$FILE_TO_WORK_ON" +# Lines to add to PATH the source-time utilities for Nixpkgs packaging +if set -q NIXPKGS_SOURCETIME_PATH && test (count \$NIXPKGS_SOURCETIME_PATH) -gt 0 + set --unpath NIXPKGS_SOURCETIME_PATH_OLD "\$NIXPKGS_SOURCETIME_PATH" \$NIXPKGS_SOURCETIME_PATH_OLD +end +set --path NIXPKGS_SOURCETIME_PATH $SOURCETIME_PATH +set -g --path PATH \$NIXPKGS_SOURCETIME_PATH \$PATH +# End of lines to add to PATH source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_PATCH" >> "$FILE_TO_WORK_ON" + cat <> "$FILE_TO_WORK_ON" +# Lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +if set -q PATH && test "\$PATH" != "" && test (count \$PATH) -ge (count \$NIXPKGS_SOURCETIME_PATH) + # Remove the inserted section + for i in (seq 0 (math (count \$PATH) - (count \$NIXPKGS_SOURCETIME_PATH))) + for j in (seq 1 (count \$NIXPKGS_SOURCETIME_PATH)) + if test \$PATH[(math \$i + \$j)] != \$NIXPKGS_SOURCETIME_PATH[\$j] + set i -1 + break + end + end + if test \$i -eq -1 + continue + end + if test \$i -eq 0 + set -g --path PATH \$PATH[(math (count \$NIXPKGS_SOURCETIME_PATH) + 1)..] + else + set -g --path PATH \$PATH[..\$i] \$PATH[(math (count \$NIXPKGS_SOURCETIME_PATH) + 1 + \$i)..] + end + break + end +end +if set -q NIXPKGS_SOURCETIME_PATH_OLD && test (count \$NIXPKGS_SOURCETIME_PATH_OLD) -gt 0 + set --path NIXPKGS_SOURCETIME_PATH \$NIXPKGS_SOURCETIME_PATH_OLD[1] + set --unpath NIXPKGS_SOURCETIME_PATH_OLD \$NIXPKGS_SOURCETIME_PATH_OLD[2..] +else + set -e NIXPKGS_SOURCETIME_PATH +end +if set -q NIXPKGS_SOURCETIME_PATH_OLD && test (count \$NIXPKGS_SOURCETIME_PATH_OLD) -eq 0 + set -e NIXPKGS_SOURCETIME_PATH_OLD +end +# End of lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_WORK_ON" > "$FILE_TO_PATCH" + rm "$FILE_TO_WORK_ON" +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-posix.sh b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-posix.sh new file mode 100644 index 0000000..a3740d4 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/patch-rc-path-posix.sh @@ -0,0 +1,39 @@ +patchRcPathPosix(){ + local FILE_TO_PATCH="$1" + local SOURCETIME_PATH="$2" + local FILE_TO_WORK_ON="$(mktemp "$(basename "$FILE_TO_PATCH").XXXXXX.tmp")" + cat <> "$FILE_TO_WORK_ON" +# Lines to add to PATH the source-time utilities for Nixpkgs packaging +if [ -n "\${NIXPKGS_SOURCETIME_PATH-}" ]; then + NIXPKGS_SOURCETIME_PATH_OLD="\$NIXPKGS_SOURCETIME_PATH;\${NIXPKGS_SOURCETIME_PATH_OLD-}" +fi +NIXPKGS_SOURCETIME_PATH="$SOURCETIME_PATH" +if [ -n "\$PATH" ]; then + PATH="\$NIXPKGS_SOURCETIME_PATH:\$PATH"; +else + PATH="\$NIXPKGS_SOURCETIME_PATH" +fi +export PATH +# End of lines to add to PATH source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_PATCH" >> "$FILE_TO_WORK_ON" + cat <> "$FILE_TO_WORK_ON" +# Lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +if [ -n "\${PATH-}" ]; then + PATH="\$(echo "\$PATH" | @sed@ "s#\$NIXPKGS_SOURCETIME_PATH##" | @sed@ "s#::#:#g" | @sed@ "s#^:##" | @sed@ "s#:\\\$##")" + export PATH +fi +if [ -n "\${NIXPKGS_SOURCETIME_PATH_OLD-}" ]; then + NIXPKGS_SOURCETIME_PATH="\$(echo "\$NIXPKGS_SOURCETIME_PATH_OLD" | @sed@ "s#\\([^;]\\);.*#\\1#")" + NIXPKGS_SOURCETIME_PATH_OLD="\$(echo "\$NIXPKGS_SOURCETIME_PATH_OLD" | @sed@ "s#[^;];\\(.*\\)#\\1#")" +else + unset NIXPKGS_SOURCETIME_PATH +fi +if [ -z "\${NIXPKGS_SOURCETIME_PATH_OLD-}" ]; then + unset NIXPKGS_SOURCETIME_PATH_OLD +fi +# End of lines to clean up inside PATH the source-time utilities for Nixpkgs packaging +EOF + cat "$FILE_TO_WORK_ON" > "$FILE_TO_PATCH" + rm "$FILE_TO_WORK_ON" +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/default.nix b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/default.nix new file mode 100644 index 0000000..82bc160 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/default.nix @@ -0,0 +1,442 @@ +{ callPackage }: + +{ + test-bash = callPackage + ( + { lib + , runCommandLocal + , bash + , hello + , ksh + , patchRcPathBash + , shellcheck + , zsh + }: + runCommandLocal "patch-rc-path-bash-test" + { + nativeBuildInputs = [ + bash + ksh + patchRcPathBash + shellcheck + zsh + ]; + meta = { + description = "Package test of patchActivateBash"; + inherit (patchRcPathBash.meta) maintainers; + }; + } + '' + set -eu -o pipefail + + + # Check the setup hook script + + echo "Running shellcheck against ${./test-sourcing-bash}" + shellcheck -s bash --exclude SC1090 ${./test-sourcing-bash} + shellcheck -s ksh --exclude SC1090 ${./test-sourcing-bash} + + + # Test patching a blank file + + echo > blank.bash + + echo "Generating blank_patched.bash from blank.bash" + cp blank.bash blank_patched.bash + patchRcPathBash blank_patched.bash "$PWD/delta:$PWD/foxtrot" + + echo "Running shellcheck against blank_patched.bash" + shellcheck -s bash blank_patched.bash + shellcheck -s ksh blank_patched.bash + + echo "Testing in Bash if blank.bash and blank_patched.bash modifies PATH the same way" + bash ${./test-sourcing-bash} ./blank.bash ./blank_patched.bash + + echo "Testing in Ksh if blank.bash and blank_patched.bash modifies PATH the same way" + ksh ${./test-sourcing-bash} "$PWD/blank.bash" "$PWD/blank_patched.bash" + + echo "Testing in Zsh if blank.bash and blank_patched.bash modifies PATH the same way" + zsh ${./test-sourcing-bash} ./blank.bash ./blank_patched.bash + + + # Test patching silent_hello + + echo "hello > /dev/null" > silent_hello.bash + + echo "Generating silent_hello_patched.bash from silent_hello.bash" + cp silent_hello.bash silent_hello_patched.bash + patchRcPathBash silent_hello_patched.bash "${hello}/bin" + + echo "Running shellcheck against silent_hello_patched.bash" + shellcheck -s bash silent_hello_patched.bash + + echo "Testing in Bash if silent_hello_patched.bash get sourced without error" + bash -eu -o pipefail -c ". ./silent_hello_patched.bash" + + echo "Testing in Ksh if silent_hello_patched.bash get sourced without error" + ksh -eu -o pipefail -c ". ./silent_hello_patched.bash" + + echo "Testing in Zsh if silent_hello_patched.bash get sourced without error" + zsh -eu -o pipefail -c ". ./silent_hello_patched.bash" + + + # Check the sample source + + echo "Running shellcheck against sample_source.bash" + shellcheck -s bash ${./sample_source.bash} + shellcheck -s ksh ${./sample_source.bash} + + + # Test patching the sample source + + cp ${./sample_source.bash} sample_source_patched.bash + chmod u+w sample_source_patched.bash + + echo "Generating sample_source_patched.bash from ./sample_source.bash" + patchRcPathBash sample_source_patched.bash "$PWD/delta:$PWD/foxtrot" + + echo "Running shellcheck against sample_source_patched.bash" + shellcheck -s bash sample_source_patched.bash + + echo "Testing in Bash if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + bash ${./test-sourcing-bash} ${./sample_source.bash} ./sample_source_patched.bash + + echo "Testing in Ksh if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + ksh ${./test-sourcing-bash} ${./sample_source.bash} "$PWD/sample_source_patched.bash" + + echo "Testing in Zsh if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + zsh ${./test-sourcing-bash} ${./sample_source.bash} ./sample_source_patched.bash + + + # Test double-patching the sample source + + echo "Patching again sample_source_patched.bash" + patchRcPathBash sample_source_patched.bash "$PWD/foxtrot:$PWD/golf" + + echo "Running shellcheck against sample_source_patched.bash" + shellcheck -s bash sample_source_patched.bash + shellcheck -s ksh sample_source_patched.bash + + echo "Testing in Bash if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + bash ${./test-sourcing-bash} ${./sample_source.bash} ./sample_source_patched.bash + + echo "Testing in Ksh if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + ksh ${./test-sourcing-bash} ${./sample_source.bash} "$PWD/sample_source_patched.bash" + + echo "Testing in Zsh if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + zsh ${./test-sourcing-bash} ${./sample_source.bash} ./sample_source_patched.bash + + + # Create a dummy output + touch "$out" + '' + ) + { }; + + + + test-csh = callPackage + ( + { lib + , runCommandLocal + , gnused + , hello + , patchRcPathCsh + , tcsh + }: + runCommandLocal "patch-rc-path-csh-test" + { + nativeBuildInputs = [ + patchRcPathCsh + tcsh + ]; + meta = { + description = "Package test of patchActivateCsh"; + inherit (patchRcPathCsh.meta) maintainers; + }; + } + '' + set -eu -o pipefail + + + # Test patching a blank file + + echo > blank.csh + + echo "Generating blank_patched.csh from blank.csh" + cp blank.csh blank_patched.csh + patchRcPathCsh blank_patched.csh "$PWD/delta:$PWD/foxtrot" + + echo "Testing in Csh if blank.csh and blank_patched.csh modifies PATH the same way" + tcsh -e ${./test-sourcing-csh} blank.csh blank_patched.csh + + + # Test patching silent_hello file + + echo "hello > /dev/null" > silent_hello.csh + + echo "Generating silent_hello_patched.csh from silent_hello.csh" + cp silent_hello.csh silent_hello_patched.csh + patchRcPathCsh silent_hello_patched.csh "${hello}/bin" + + echo "Testing in Csh if silent_hello_patched.csh get sourced without errer" + tcsh -e -c "source silent_hello_patched.csh" + + + # Generate the sample source + + substitute ${./sample_source.csh.in} sample_source.csh --replace @sed@ ${gnused}/bin/sed + chmod u+rw sample_source.csh + + + # Test patching the sample source + + echo "Generating sample_source_patched.csh from sample_source.csh" + cp sample_source.csh sample_source_patched.csh + chmod u+w sample_source_patched.csh + patchRcPathCsh sample_source_patched.csh "$PWD/delta:$PWD/foxtrot" + + echo "Testing in Csh if sample_source.csh and sample_source_patched.csh modifies PATH the same way" + tcsh -e ${./test-sourcing-csh} sample_source.csh sample_source_patched.csh + + + # Test double-patching the sample source + + echo "Patching again sample_source_patched.csh from sample_source.csh" + patchRcPathCsh sample_source_patched.csh "$PWD/foxtrot:$PWD/golf" + + echo "Testing in Csh if sample_source.csh and sample_source_patched.csh modifies PATH the same way" + tcsh -e ${./test-sourcing-csh} sample_source.csh sample_source_patched.csh + + + # Create a dummy output + touch "$out" + '' + ) + { }; + + + + test-fish = callPackage + ( + { lib + , runCommandLocal + , fish + , hello + , patchRcPathFish + }: + runCommandLocal "patch-rc-path-fish-test" + { + nativeBuildInputs = [ + fish + patchRcPathFish + ]; + meta = { + description = "Package test of patchActivateFish"; + inherit (patchRcPathFish.meta) maintainers; + }; + } + '' + set -eu -o pipefail + + + # Test patching a blank file + + echo > blank.fish + + echo "Generating blank_patched.fish from blank.fish" + cp blank.fish blank_patched.fish + patchRcPathFish blank_patched.fish "$PWD/delta:$PWD/foxtrot" + + echo "Testing in Fish if blank.fish and blank_patched.fish modifies PATH the same way" + HOME_TEMP="$(mktemp -d temporary_home_XXXXXX)" + HOME="$HOME_TEMP" fish ${./test-sourcing-fish} blank.fish blank_patched.fish + rm -r "$HOME_TEMP" + + + # Test patching silent_hello file + + echo "hello > /dev/null" > silent_hello.fish + + echo "Generating silent_hello_patched.fish from silent_hello.fish" + cp silent_hello.fish silent_hello_patched.fish + patchRcPathFish silent_hello_patched.fish "${hello}/bin" + + echo "Testing in Fish if silent_hello_patched.fish get sourced without error" + HOME_TEMP="$(mktemp -d temporary_home_XXXXXX)" + HOME="$HOME_TEMP" fish -c "source silent_hello_patched.fish" + rm -r "$HOME_TEMP" + + + # Test patching the sample source + + cp ${./sample_source.fish} sample_source_patched.fish + chmod u+w sample_source_patched.fish + + echo "Generating sample_source_patched.fish from ${./sample_source.fish}" + patchRcPathFish sample_source_patched.fish "$PWD/delta:$PWD/foxtrot" + echo "Testing in Fish if sample_source.fish and sample_source_patched.fish modifies PATH the same way" + HOME_TEMP="$(mktemp -d temporary_home_XXXXXX)" + HOME="$HOME_TEMP" fish ${./test-sourcing-fish} ${./sample_source.fish} sample_source_patched.fish + rm -r "$HOME_TEMP" + + + # Test double-patching the sample source + + echo "Patching again sample_source_patched.fish from ${./sample_source.fish}" + patchRcPathFish sample_source_patched.fish "$PWD/foxtrot:$PWD/golf" + + echo "Testing in Fish if sample_source.fish and sample_source_patched.fish modifies PATH the same way" + HOME_TEMP="$(mktemp -d temporary_home_XXXXXX)" + HOME="$HOME_TEMP" fish ${./test-sourcing-fish} ${./sample_source.fish} sample_source_patched.fish + rm -r "$HOME_TEMP" + + + # Create a dummy output + touch "$out" + '' + ) + { }; + + + + test-posix = callPackage + ( + { lib + , runCommandLocal + , bash + , dash + , gnused + , hello + , ksh + , patchRcPathPosix + , shellcheck + }: + runCommandLocal "patch-rc-path-posix-test" + { + nativeBuildInputs = [ + bash + dash + ksh + patchRcPathPosix + shellcheck + ]; + meta = { + description = "Package test of patchActivatePosix"; + inherit (patchRcPathPosix.meta) maintainers; + }; + } + '' + set -eu -o pipefail + + + # Check the setup hook script + + echo "Running shellcheck against ${./test-sourcing-posix}" + shellcheck -s sh --exclude SC1090 ${./test-sourcing-posix} + shellcheck -s dash --exclude SC1090 ${./test-sourcing-posix} + + + # Test patching a blank file + + echo > blank.sh + + echo "Generating blank_patched.sh from blank.sh" + cp blank.sh blank_patched.sh + patchRcPathPosix blank_patched.sh "$PWD/delta:$PWD/foxtrot" + + echo "Running shellcheck against blank_patched.sh" + shellcheck -s sh blank_patched.sh + shellcheck -s dash blank_patched.sh + + echo "Testing in Bash if blank.sh and blank_patched.sh modifies PATH the same way" + bash --posix ${./test-sourcing-posix} ./blank.sh ./blank_patched.sh + + echo "Testing in Dash if blank.sh and blank_patched.sh modifies PATH the same way" + dash ${./test-sourcing-posix} ./blank.sh ./blank_patched.sh + + echo "Testing in Ksh if ./blank.sh and ./blank_patched.sh modifies PATH the same way" + ksh ${./test-sourcing-posix} "$PWD/blank.sh" "$PWD/blank_patched.sh" + + + # Test patching silent_hello file + + echo "hello > /dev/null" > silent_hello.sh + + echo "Generating silent_hello_patched.sh from silent_hello.sh" + cp silent_hello.sh silent_hello_patched.sh + patchRcPathPosix silent_hello_patched.sh "${hello}/bin" + + echo "Running shellcheck against silent_hello_patched.sh" + shellcheck -s sh silent_hello_patched.sh + shellcheck -s dash silent_hello_patched.sh + + echo "Testing in Bash if silent_hello_patched.sh get sourced without error" + bash --posix -eu -c ". ./silent_hello_patched.sh" + + echo "Testing in Dash if silent_hello_patched.sh get sourced without error" + dash -eu -c ". ./silent_hello_patched.sh" + + echo "Testing in Ksh if silent_hello_patched.sh get sourced without error" + ksh -eu -c ". $PWD/silent_hello_patched.sh" + + + # Generate the sample source "$PWD/delta:$PWD/foxtrot" "$PWD/delta:$PWD/foxtrot" + + substitute ${./sample_source.sh.in} sample_source.sh --replace @sed@ ${gnused}/bin/sed + chmod u+rw sample_source.sh + + + # Check the sample source + + echo "Running shellcheck against sample_source.sh" + shellcheck -s sh sample_source.sh + shellcheck -s dash sample_source.sh + + + # Test patching the sample source + + echo "Generating sample_source_patched.sh from sample_source.sh" + cp sample_source.sh sample_source_patched.sh + chmod u+w sample_source_patched.sh + patchRcPathPosix sample_source_patched.sh "$PWD/delta:$PWD/foxtrot" + + echo "Running shellcheck against sample_source_patched.sh" + shellcheck -s sh sample_source_patched.sh + shellcheck -s dash sample_source_patched.sh + + echo "Testing in Bash if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + bash --posix ${./test-sourcing-posix} "./sample_source.sh" "./sample_source_patched.sh" + + echo "Testing in Dash if sample_source.sh and sample_source_patched.sh modifies PATH the same way" + dash ${./test-sourcing-posix} "./sample_source.sh" "./sample_source_patched.sh" + + echo "Testing in Ksh if sample_source.sh and sample_source_patched.sh modifies PATH the same way" + ksh ${./test-sourcing-posix} "$PWD/sample_source.sh" "$PWD/sample_source_patched.sh" + + + # Test double-patching the sample source + + echo "Patching again sample_source_patched.sh" + patchRcPathPosix sample_source_patched.sh "$PWD/foxtrot:$PWD/golf" + + echo "Running shellcheck against sample_source_patched.sh" + shellcheck -s sh sample_source_patched.sh + shellcheck -s dash sample_source_patched.sh + + echo "Testing in Bash if sample_source.bash and sample_source_patched.bash modifies PATH the same way" + bash --posix ${./test-sourcing-posix} "./sample_source.sh" "./sample_source_patched.sh" + + echo "Testing in Dash if sample_source.sh and sample_source_patched.sh modifies PATH the same way" + dash ${./test-sourcing-posix} "./sample_source.sh" "./sample_source_patched.sh" + + echo "Testing in Ksh if sample_source.sh and sample_source_patched.sh modifies PATH the same way" + ksh ${./test-sourcing-posix} "$PWD/sample_source.sh" "$PWD/sample_source_patched.sh" + + + # Create a dummy output + touch "$out" + '' + ) + { }; +} diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.bash b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.bash new file mode 100644 index 0000000..6cb043e --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.bash @@ -0,0 +1,2 @@ +PATH="$PWD/charlie:${PATH/:$PWD\/bravo}" +export PATH diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.csh.in b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.csh.in new file mode 100644 index 0000000..9606458 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.csh.in @@ -0,0 +1 @@ +setenv PATH $PWD/charlie:`echo "$PATH" | @sed@ "s#:$PWD/bravo##"` diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.fish b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.fish new file mode 100644 index 0000000..f638fe5 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.fish @@ -0,0 +1,9 @@ +begin + for p in $PATH + if test $p != "$PWD/bravo" + set TEMPORARY_PATH $TEMPORARY_PATH $p + end + end + set -g PATH $TEMPORARY_PATH +end +set PATH "$PWD/charlie" $PATH diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.sh.in b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.sh.in new file mode 100644 index 0000000..42e64a1 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/sample_source.sh.in @@ -0,0 +1,2 @@ +PATH="$PWD/charlie:$(echo "$PATH" | @sed@ "s#:$PWD/bravo##")" +export PATH diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-bash b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-bash new file mode 100644 index 0000000..1b6cc54 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-bash @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -eu -o pipefail + +UNPATCHED_SOURCE_FILE="$1" +PATCHED_SOURCE_FILE="$2" +ORIG_PATH="$PWD/alfa:$PWD/bravo" +RESULT_PATH_FROM_UNPATCHED="$( + PATH="$ORIG_PATH"; export PATH + . "$UNPATCHED_SOURCE_FILE" + echo "$PATH" +)" +RESULT_PATH_FROM_PATCHED="$( + PATH="$ORIG_PATH"; export PATH + . "$PATCHED_SOURCE_FILE" + echo "$PATH" +)" +if [[ "$RESULT_PATH_FROM_UNPATCHED" != "$RESULT_PATH_FROM_PATCHED" ]]; then + echo "Result path mismatched: $UNPATCHED_SOURCE_FILE ($RESULT_PATH_FROM_UNPATCHED) and $PATCHED_SOURCE_FILE ($RESULT_PATH_FROM_PATCHED)" >&2 + exit 1 +fi diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-csh b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-csh new file mode 100644 index 0000000..7ddb2dd --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-csh @@ -0,0 +1,13 @@ +#/usr/bin/env tcsh + +set UNPATCHED_SOURCE_FILE = "$1" +set PATCHED_SOURCE_FILE = "$2" +set ORIG_PATH = "${PWD}/alfa:${PWD}/bravo" + +set RESULT_PATH_FROM_UNPATCHED = `setenv PATH "$ORIG_PATH"; source $UNPATCHED_SOURCE_FILE; echo $PATH` +set RESULT_PATH_FROM_PATCHED = `setenv PATH "$ORIG_PATH"; source $PATCHED_SOURCE_FILE; echo $PATH` + +if ($RESULT_PATH_FROM_UNPATCHED != $RESULT_PATH_FROM_PATCHED) then + echo "Result path mismatched: $UNPATCHED_SOURCE_FILE ($RESULT_PATH_FROM_UNPATCHED) and $PATCHED_SOURCE_FILE ($RESULT_PATH_FROM_PATCHED)" > /dev/stderr + exit 1 +endif diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-fish b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-fish new file mode 100644 index 0000000..fcce014 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-fish @@ -0,0 +1,13 @@ +#/usr/bin/env fish + +set UNPATCHED_SOURCE_FILE $argv[1] +set PATCHED_SOURCE_FILE $argv[2] +set ORIG_PATH "$PWD/alfa:$PWD/bravo" + +set RESULT_PATH_FROM_UNPATCHED (fish -c "set -g PATH \"$ORIG_PATH\"; source $UNPATCHED_SOURCE_FILE; echo \"\$PATH\"") +set RESULT_PATH_FROM_PATCHED (fish -c "set -g PATH \"$ORIG_PATH\"; source $PATCHED_SOURCE_FILE; echo \"\$PATH\"") + +if test "$RESULT_PATH_FROM_UNPATCHED" != "$RESULT_PATH_FROM_PATCHED" + echo "Result path mismatched: $UNPATCHED_SOURCE_FILE ($RESULT_PATH_FROM_UNPATCHED) and $PATCHED_SOURCE_FILE ($RESULT_PATH_FROM_PATCHED)" >&2 + exit 1 +end diff --git a/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-posix b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-posix new file mode 100644 index 0000000..6039b4d --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-rc-path-hooks/test/test-sourcing-posix @@ -0,0 +1,21 @@ +#!/bin/sh + +set -eu + +UNPATCHED_SOURCE_FILE="$1" +PATCHED_SOURCE_FILE="$2" +ORIG_PATH="$PWD/alfa:$PWD/bravo" +RESULT_PATH_FROM_UNPATCHED="$( + PATH="$ORIG_PATH"; export PATH + . "$UNPATCHED_SOURCE_FILE" + echo "$PATH" +)" +RESULT_PATH_FROM_PATCHED="$( + PATH="$ORIG_PATH"; export PATH + . "$PATCHED_SOURCE_FILE" + echo "$PATH" +)" +if [ "$RESULT_PATH_FROM_UNPATCHED" != "$RESULT_PATH_FROM_PATCHED" ]; then + echo "Result path mismatched: $UNPATCHED_SOURCE_FILE ($RESULT_PATH_FROM_UNPATCHED) and $PATCHED_SOURCE_FILE ($RESULT_PATH_FROM_PATCHED)" > /dev/stderr + exit 1 +fi diff --git a/pkgs/build-support/setup-hooks/patch-shebangs.sh b/pkgs/build-support/setup-hooks/patch-shebangs.sh new file mode 100644 index 0000000..80a29d7 --- /dev/null +++ b/pkgs/build-support/setup-hooks/patch-shebangs.sh @@ -0,0 +1,148 @@ +# This setup hook causes the fixup phase to rewrite all script +# interpreter file names (`#! /path') to paths found in $PATH. E.g., +# /bin/sh will be rewritten to /nix/store/-some-bash/bin/sh. +# /usr/bin/env gets special treatment so that ".../bin/env python" is +# rewritten to /nix/store//bin/python. Interpreters that are +# already in the store are left untouched. +# A script file must be marked as executable, otherwise it will not be +# considered. + +fixupOutputHooks+=(patchShebangsAuto) + +# Run patch shebangs on a directory or file. +# Can take multiple paths as arguments. +# patchShebangs [--build | --host | --update] [--] PATH... + +# Flags: +# --build : Lookup commands available at build-time +# --host : Lookup commands available at runtime +# --update : Update shebang paths that are in Nix store + +# Example use cases, +# $ patchShebangs --host /nix/store/...-hello-1.0/bin +# $ patchShebangs --build configure + +patchShebangs() { + local pathName + local update + + while [[ $# -gt 0 ]]; do + case "$1" in + --host) + pathName=HOST_PATH + shift + ;; + --build) + pathName=PATH + shift + ;; + --update) + update=true + shift + ;; + --) + shift + break + ;; + -*|--*) + echo "Unknown option $1 supplied to patchShebangs" >&2 + return 1 + ;; + *) + break + ;; + esac + done + + echo "patching script interpreter paths in $@" + local f + local oldPath + local newPath + local arg0 + local args + local oldInterpreterLine + local newInterpreterLine + + if [[ $# -eq 0 ]]; then + echo "No arguments supplied to patchShebangs" >&2 + return 0 + fi + + local f + while IFS= read -r -d $'\0' f; do + isScript "$f" || continue + + # read exits unclean if the shebang does not end with a newline, but still assigns the variable. + # So if read returns errno != 0, we check if the assigned variable is non-empty and continue. + read -r oldInterpreterLine < "$f" || [ "$oldInterpreterLine" ] + + read -r oldPath arg0 args <<< "${oldInterpreterLine:2}" + + if [[ -z "${pathName:-}" ]]; then + if [[ -n $strictDeps && $f == "$NIX_STORE"* ]]; then + pathName=HOST_PATH + else + pathName=PATH + fi + fi + + if [[ "$oldPath" == *"/bin/env" ]]; then + if [[ $arg0 == "-S" ]]; then + arg0=${args%% *} + args=${args#* } + newPath="$(PATH="${!pathName}" command -v "env" || true)" + args="-S $(PATH="${!pathName}" command -v "$arg0" || true) $args" + + # Check for unsupported 'env' functionality: + # - options: something starting with a '-' besides '-S' + # - environment variables: foo=bar + elif [[ $arg0 == "-"* || $arg0 == *"="* ]]; then + echo "$f: unsupported interpreter directive \"$oldInterpreterLine\" (set dontPatchShebangs=1 and handle shebang patching yourself)" >&2 + exit 1 + else + newPath="$(PATH="${!pathName}" command -v "$arg0" || true)" + fi + else + if [[ -z $oldPath ]]; then + # If no interpreter is specified linux will use /bin/sh. Set + # oldpath="/bin/sh" so that we get /nix/store/.../sh. + oldPath="/bin/sh" + fi + + newPath="$(PATH="${!pathName}" command -v "$(basename "$oldPath")" || true)" + + args="$arg0 $args" + fi + + # Strip trailing whitespace introduced when no arguments are present + newInterpreterLine="$newPath $args" + newInterpreterLine=${newInterpreterLine%${newInterpreterLine##*[![:space:]]}} + + if [[ -n "$oldPath" && ( "$update" == true || "${oldPath:0:${#NIX_STORE}}" != "$NIX_STORE" ) ]]; then + if [[ -n "$newPath" && "$newPath" != "$oldPath" ]]; then + echo "$f: interpreter directive changed from \"$oldInterpreterLine\" to \"$newInterpreterLine\"" + # escape the escape chars so that sed doesn't interpret them + escapedInterpreterLine=${newInterpreterLine//\\/\\\\} + + # Preserve times, see: https://github.com/NixOS/nixpkgs/pull/33281 + timestamp=$(stat --printf "%y" "$f") + sed -i -e "1 s|.*|#\!$escapedInterpreterLine|" "$f" + touch --date "$timestamp" "$f" + fi + fi + done < <(find "$@" -type f -perm -0100 -print0) +} + +patchShebangsAuto () { + if [[ -z "${dontPatchShebangs-}" && -e "$prefix" ]]; then + + # Dev output will end up being run on the build platform. An + # example case of this is sdl2-config. Otherwise, we can just + # use the runtime path (--host). + if [[ "$output" != out && "$output" = "$outputDev" ]]; then + patchShebangs --build "$prefix" + else + patchShebangs --host "$prefix" + fi + fi +} diff --git a/pkgs/build-support/setup-hooks/postgresql-test-hook/default.nix b/pkgs/build-support/setup-hooks/postgresql-test-hook/default.nix new file mode 100644 index 0000000..e9e77b0 --- /dev/null +++ b/pkgs/build-support/setup-hooks/postgresql-test-hook/default.nix @@ -0,0 +1,8 @@ +{ callPackage, makeSetupHook }: + +makeSetupHook { + name = "postgresql-test-hook"; + passthru.tests = { + simple = callPackage ./test.nix { }; + }; +} ./postgresql-test-hook.sh diff --git a/pkgs/build-support/setup-hooks/postgresql-test-hook/postgresql-test-hook.sh b/pkgs/build-support/setup-hooks/postgresql-test-hook/postgresql-test-hook.sh new file mode 100644 index 0000000..d09153b --- /dev/null +++ b/pkgs/build-support/setup-hooks/postgresql-test-hook/postgresql-test-hook.sh @@ -0,0 +1,83 @@ +preCheckHooks+=('postgresqlStart') +postCheckHooks+=('postgresqlStop') + + +postgresqlStart() { + + # Add default environment variable values + # + # Client variables: + # - https://www.postgresql.org/docs/current/libpq-envars.html + # + # Server variables: + # - only PGDATA: https://www.postgresql.org/docs/current/creating-cluster.html + + if [[ "${PGDATA:-}" == "" ]]; then + PGDATA="$NIX_BUILD_TOP/postgresql" + fi + export PGDATA + + if [[ "${PGHOST:-}" == "" ]]; then + mkdir -p "$NIX_BUILD_TOP/run/postgresql" + PGHOST="$NIX_BUILD_TOP/run/postgresql" + fi + export PGHOST + + if [[ "${PGUSER:-}" == "" ]]; then + PGUSER="test_user" + fi + export PGUSER + + if [[ "${PGDATABASE:-}" == "" ]]; then + PGDATABASE="test_db" + fi + export PGDATABASE + + if [[ "${postgresqlTestUserOptions:-}" == "" ]]; then + postgresqlTestUserOptions="LOGIN" + fi + + if [[ "${postgresqlTestSetupSQL:-}" == "" ]]; then + postgresqlTestSetupSQL="$(cat </dev/null; then + echo >&2 'initdb not found. Did you add postgresql to the nativeCheckInputs?' + false + fi + echo 'initializing postgresql' + initdb -U postgres + + echo "$postgresqlExtraSettings" >>"$PGDATA/postgresql.conf" + + # Move the socket + echo "unix_socket_directories = '$NIX_BUILD_TOP/run/postgresql'" >>"$PGDATA/postgresql.conf" + + # TCP ports can be a problem in some sandboxes, + # so we disable tcp listening by default + if ! [[ "${postgresqlEnableTCP:-}" = 1 ]]; then + echo "listen_addresses = ''" >>"$PGDATA/postgresql.conf" + fi + + echo 'starting postgresql' + eval "${postgresqlStartCommands:-pg_ctl start}" + + echo 'setting up postgresql' + eval "$postgresqlTestSetupCommands" + + runHook postgresqlTestSetupPost + +} + +postgresqlStop() { + echo 'stopping postgresql' + pg_ctl stop +} diff --git a/pkgs/build-support/setup-hooks/postgresql-test-hook/test.nix b/pkgs/build-support/setup-hooks/postgresql-test-hook/test.nix new file mode 100644 index 0000000..9881ed1 --- /dev/null +++ b/pkgs/build-support/setup-hooks/postgresql-test-hook/test.nix @@ -0,0 +1,30 @@ +{ postgresql, postgresqlTestHook, stdenv }: + +stdenv.mkDerivation { + name = "postgresql-test-hook-test"; + buildInputs = [ postgresqlTestHook ]; + nativeCheckInputs = [ postgresql ]; + dontUnpack = true; + doCheck = true; + passAsFile = ["sql"]; + sql = '' + CREATE TABLE hello ( + message text + ); + INSERT INTO hello VALUES ('it '||'worked'); + SELECT * FROM hello; + ''; + postgresqlTestSetupPost = '' + TEST_POST_HOOK_RAN=1 + ''; + checkPhase = '' + runHook preCheck + psql <$sqlPath | grep 'it worked' + TEST_RAN=1 + runHook postCheck + ''; + installPhase = '' + [[ $TEST_RAN == 1 && $TEST_POST_HOOK_RAN == 1 ]] + touch $out + ''; +} diff --git a/pkgs/build-support/setup-hooks/prune-libtool-files.sh b/pkgs/build-support/setup-hooks/prune-libtool-files.sh new file mode 100644 index 0000000..0ec5654 --- /dev/null +++ b/pkgs/build-support/setup-hooks/prune-libtool-files.sh @@ -0,0 +1,22 @@ +# Clear dependency_libs in libtool files for shared libraries. + +# Shared libraries already encode their dependencies with locations. .la +# files do not always encode those locations, and sometimes encode the +# locations in the wrong Nix output. .la files are not needed for shared +# libraries, but without dependency_libs they do not hurt either. + +fixupOutputHooks+=(_pruneLibtoolFiles) + +_pruneLibtoolFiles() { + if [ "${dontPruneLibtoolFiles-}" ] || [ ! -e "$prefix" ]; then + return + fi + + # Libtool uses "dlname" and "library_names" fields for shared libraries and + # the "old_library" field for static libraries. We are processing only + # those .la files that do not describe static libraries. + find "$prefix" -type f -name '*.la' \ + -exec grep -q '^# Generated by .*libtool' {} \; \ + -exec grep -q "^old_library=''" {} \; \ + -exec sed -i {} -e "/^dependency_libs='[^']/ c dependency_libs='' #pruned" \; +} diff --git a/pkgs/build-support/setup-hooks/reproducible-builds.sh b/pkgs/build-support/setup-hooks/reproducible-builds.sh new file mode 100644 index 0000000..5e27ce8 --- /dev/null +++ b/pkgs/build-support/setup-hooks/reproducible-builds.sh @@ -0,0 +1,11 @@ +# Use the last part of the out path as hash input for the build. +# This should ensure that it is deterministic across rebuilds of the same +# derivation and not easily collide with other builds. +# We also truncate the hash so that it cannot cause reference cycles. +NIX_CFLAGS_COMPILE="${NIX_CFLAGS_COMPILE:-} -frandom-seed=$( + randSeed=${NIX_OUTPATH_USED_AS_RANDOM_SEED:-$out} + outbase="${randSeed##*/}" + randomseed="${outbase:0:10}" + echo $randomseed +)" +export NIX_CFLAGS_COMPILE diff --git a/pkgs/build-support/setup-hooks/role.bash b/pkgs/build-support/setup-hooks/role.bash new file mode 100644 index 0000000..bfd6b61 --- /dev/null +++ b/pkgs/build-support/setup-hooks/role.bash @@ -0,0 +1,71 @@ +# Since the same derivation can be depended on in multiple ways, we need to +# accumulate *each* role (i.e. host and target platforms relative the depending +# derivation) in which the derivation is used. +# +# The role is intended to be used as part of other variables names like +# - $NIX_SOMETHING${role_post} + +function getRole() { + case $1 in + -1) + role_post='_FOR_BUILD' + ;; + 0) + role_post='' + ;; + 1) + role_post='_FOR_TARGET' + ;; + *) + echo "@name@: used as improper sort of dependency" >&2 + return 1 + ;; + esac +} + +# `hostOffset` describes how the host platform of the package is slid relative +# to the depending package. `targetOffset` likewise describes the target +# platform of the package. Both are brought into scope of the setup hook defined +# for dependency whose setup hook is being processed relative to the package +# being built. + +function getHostRole() { + getRole "$hostOffset" +} +function getTargetRole() { + getRole "$targetOffset" +} + +# `depHostOffset` describes how the host platform of the dependencies are slid +# relative to the depending package. `depTargetOffset` likewise describes the +# target platform of dependenices. Both are brought into scope of the +# environment hook defined for the dependency being applied relative to the +# package being built. + +function getHostRoleEnvHook() { + getRole "$depHostOffset" +} +function getTargetRoleEnvHook() { + getRole "$depTargetOffset" +} + +# This variant is intended specifically for code-producing tool wrapper scripts +# `NIX_@wrapperName@_TARGET_*_@suffixSalt@` tracks this (needs to be an exported +# env var so can't use fancier data structures). +function getTargetRoleWrapper() { + case $targetOffset in + -1) + export NIX_@wrapperName@_TARGET_BUILD_@suffixSalt@=1 + ;; + 0) + export NIX_@wrapperName@_TARGET_HOST_@suffixSalt@=1 + ;; + 1) + export NIX_@wrapperName@_TARGET_TARGET_@suffixSalt@=1 + ;; + *) + echo "@name@: used as improper sort of dependency" >&2 + return 1 + ;; + esac +} diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh new file mode 100644 index 0000000..197e8a9 --- /dev/null +++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh @@ -0,0 +1,52 @@ +export NIX_SET_BUILD_ID=1 +export NIX_LDFLAGS+=" --compress-debug-sections=zlib" +export NIX_CFLAGS_COMPILE+=" -ggdb -Wa,--compress-debug-sections" +export NIX_RUSTFLAGS+=" -g" + +fixupOutputHooks+=(_separateDebugInfo) + +_separateDebugInfo() { + [ -e "$prefix" ] || return 0 + + local dst="${debug:-$out}" + if [ "$prefix" = "$dst" ]; then return 0; fi + + # in case there is nothing to strip, don't fail the build + mkdir -p "$dst" + + dst="$dst/lib/debug/.build-id" + + # Find executables and dynamic libraries. + local i + while IFS= read -r -d $'\0' i; do + if ! isELF "$i"; then continue; fi + + [ -z "${READELF:-}" ] && echo "_separateDebugInfo: '\$READELF' variable is empty, skipping." 1>&2 && break + [ -z "${OBJCOPY:-}" ] && echo "_separateDebugInfo: '\$OBJCOPY' variable is empty, skipping." 1>&2 && break + + # Extract the Build ID. FIXME: there's probably a cleaner way. + local id="$($READELF -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')" + if [ "${#id}" != 40 ]; then + echo "could not find build ID of $i, skipping" >&2 + continue + fi + + # Extract the debug info. + echo "separating debug info from $i (build ID $id)" + mkdir -p "$dst/${id:0:2}" + + # This may fail, e.g. if the binary is for a different + # architecture than we're building for. (This happens with + # firmware blobs in QEMU.) + ( + if [ -f "$dst/${id:0:2}/${id:2}.debug" ] + then + echo "separate-debug-info: warning: multiple files with build id $id found, overwriting" + fi + $OBJCOPY --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug" + + # Also a create a symlink .debug. + ln -sfn ".build-id/${id:0:2}/${id:2}.debug" "$dst/../$(basename "$i")" + ) || rmdir -p "$dst/${id:0:2}" + done < <(find "$prefix" -type f -print0 | sort -z) +} diff --git a/pkgs/build-support/setup-hooks/set-java-classpath.sh b/pkgs/build-support/setup-hooks/set-java-classpath.sh new file mode 100644 index 0000000..445fa56 --- /dev/null +++ b/pkgs/build-support/setup-hooks/set-java-classpath.sh @@ -0,0 +1,13 @@ +# This setup hook adds every JAR in the share/java subdirectories of +# the build inputs to $CLASSPATH. + +export CLASSPATH + +addPkgToClassPath () { + local jar + for jar in $1/share/java/*.jar; do + export CLASSPATH=''${CLASSPATH-}''${CLASSPATH:+:}''${jar} + done +} + +addEnvHooks "$targetOffset" addPkgToClassPath diff --git a/pkgs/build-support/setup-hooks/set-source-date-epoch-to-latest.sh b/pkgs/build-support/setup-hooks/set-source-date-epoch-to-latest.sh new file mode 100644 index 0000000..ae34ffe --- /dev/null +++ b/pkgs/build-support/setup-hooks/set-source-date-epoch-to-latest.sh @@ -0,0 +1,34 @@ +updateSourceDateEpoch() { + local path="$1" + + # Get the last modification time of all regular files, sort them, + # and get the most recent. Maybe we should use + # https://github.com/0-wiz-0/findnewest here. + local -a res=($(find "$path" -type f -not -newer "$NIX_BUILD_TOP/.." -printf '%T@ %p\0' \ + | sort -n --zero-terminated | tail -n1 --zero-terminated | head -c -1)) + local time="${res[0]//\.[0-9]*/}" # remove the fraction part + local newestFile="${res[1]}" + + # Update $SOURCE_DATE_EPOCH if the most recent file we found is newer. + if [ "${time:-0}" -gt "$SOURCE_DATE_EPOCH" ]; then + echo "setting SOURCE_DATE_EPOCH to timestamp $time of file $newestFile" + export SOURCE_DATE_EPOCH="$time" + + # Warn if the new timestamp is too close to the present. This + # may indicate that we were being applied to a file generated + # during the build, or that an unpacker didn't restore + # timestamps properly. + local now="$(date +%s)" + if [ "$time" -gt $((now - 60)) ]; then + echo "warning: file $newestFile may be generated; SOURCE_DATE_EPOCH may be non-deterministic" + fi + fi +} + +postUnpackHooks+=(_updateSourceDateEpochFromSourceRoot) + +_updateSourceDateEpochFromSourceRoot() { + if [ -n "$sourceRoot" ]; then + updateSourceDateEpoch "$sourceRoot" + fi +} diff --git a/pkgs/build-support/setup-hooks/setup-debug-info-dirs.sh b/pkgs/build-support/setup-hooks/setup-debug-info-dirs.sh new file mode 100644 index 0000000..96bf48c --- /dev/null +++ b/pkgs/build-support/setup-hooks/setup-debug-info-dirs.sh @@ -0,0 +1,5 @@ +setupDebugInfoDirs () { + addToSearchPath NIX_DEBUG_INFO_DIRS $1/lib/debug +} + +addEnvHooks "$targetOffset" setupDebugInfoDirs diff --git a/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh b/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh new file mode 100644 index 0000000..825da1b --- /dev/null +++ b/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh @@ -0,0 +1,88 @@ +# This setup hook modifies a Perl script so that any "-I" flags in its shebang +# line are rewritten into a "use lib ..." statement on the next line. This gets +# around a limitation in Darwin, which will not properly handle a script whose +# shebang line exceeds 511 characters. +# +# Each occurrence of "-I /path/to/lib1" or "-I/path/to/lib2" is removed from +# the shebang line, along with the single space that preceded it. These library +# paths are placed into a new line of the form +# +# use lib "/path/to/lib1", "/path/to/lib2"; +# +# immediately following the shebang line. If a library appeared in the original +# list more than once, only its first occurrence will appear in the output +# list. In other words, the libraries are deduplicated, but the ordering of the +# first appearance of each one is preserved. +# +# Any flags other than "-I" in the shebang line are left as-is, and the +# interpreter is also left alone (although the script will abort if the +# interpreter does not seem to be either "perl" or else "env" with "perl" as +# its argument). Each line after the shebang line is left unchanged. Each file +# is modified in place. +# +# Usage: +# shortenPerlShebang SCRIPT... + +shortenPerlShebang() { + while [ $# -gt 0 ]; do + _shortenPerlShebang "$1" + shift + done +} + +_shortenPerlShebang() { + local program="$1" + + echo "shortenPerlShebang: rewriting shebang line in $program" + + if ! isScript "$program"; then + die "shortenPerlShebang: refusing to modify $program because it is not a script" + fi + + local temp="$(mktemp)" + + gawk ' + (NR == 1) { + if (!($0 ~ /\/(perl|env +perl)\>/)) { + print "shortenPerlShebang: script does not seem to be a Perl script" > "/dev/stderr" + exit 1 + } + idx = 0 + while (match($0, / -I ?([^ ]+)/, pieces)) { + matches[idx] = pieces[1] + idx++ + $0 = gensub(/ -I ?[^ ]+/, "", 1, $0) + } + print $0 + if (idx > 0) { + prefix = "use lib " + for (idx in matches) { + path = matches[idx] + if (!(path in seen)) { + printf "%s\"%s\"", prefix, path + seen[path] = 1 + prefix = ", " + } + } + print ";" + } + } + (NR > 1 ) { + print + } + ' "$program" > "$temp" || die + # Preserve the mode of the original file + cp --preserve=mode --attributes-only "$program" "$temp" + mv "$temp" "$program" + + # Measure the new shebang line length and make sure it's okay. We subtract + # one to account for the trailing newline that "head" included in its + # output. + local new_length=$(( $(head -n 1 "$program" | wc -c) - 1 )) + + # Darwin is okay when the shebang line contains 511 characters, but not + # when it contains 512 characters. + if [ $new_length -ge 512 ]; then + die "shortenPerlShebang: shebang line is $new_length characters--still too long for Darwin!" + fi +} diff --git a/pkgs/build-support/setup-hooks/strip-java-archives.sh b/pkgs/build-support/setup-hooks/strip-java-archives.sh new file mode 100644 index 0000000..2232246 --- /dev/null +++ b/pkgs/build-support/setup-hooks/strip-java-archives.sh @@ -0,0 +1,16 @@ +# This setup hook makes the fixup phase to repack all java archives in a +# deterministic fashion. The most important change being done is the resetting +# of the modification times of the archive entries + +fixupOutputHooks+=('stripJavaArchivesIn $prefix') + +stripJavaArchivesIn() { + local dir="$1" + echo "stripping java archives in $dir" + find $dir -type f -regextype posix-egrep -regex ".*\.(jar|war|hpi|apk)$" -print0 | + while IFS= read -rd '' f; do + echo "stripping java archive $f" + strip-nondeterminism --type jar "$f" + done +} + diff --git a/pkgs/build-support/setup-hooks/strip.sh b/pkgs/build-support/setup-hooks/strip.sh new file mode 100644 index 0000000..ce41e6e --- /dev/null +++ b/pkgs/build-support/setup-hooks/strip.sh @@ -0,0 +1,98 @@ +# This setup hook strips libraries and executables in the fixup phase. + +fixupOutputHooks+=(_doStrip) + +_doStrip() { + # We don't bother to strip build platform code because it shouldn't make it + # to $out anyways---if it does, that's a bigger problem that a lack of + # stripping will help catch. + local -ra flags=(dontStripHost dontStripTarget) + local -ra debugDirs=(stripDebugList stripDebugListTarget) + local -ra allDirs=(stripAllList stripAllListTarget) + local -ra stripCmds=(STRIP STRIP_FOR_TARGET) + local -ra ranlibCmds=(RANLIB RANLIB_FOR_TARGET) + + # TODO(structured-attrs): This doesn't work correctly if one of + # the items in strip*List or strip*Flags contains a space, + # even with structured attrs enabled. This is OK for now + # because very few packages set any of these, and it doesn't + # affect any of them. + # + # After __structuredAttrs = true is universal, come back and + # push arrays all the way through this logic. + + # Strip only host paths by default. Leave targets as is. + stripDebugList=${stripDebugList[*]:-lib lib32 lib64 libexec bin sbin} + stripDebugListTarget=${stripDebugListTarget[*]:-} + stripAllList=${stripAllList[*]:-} + stripAllListTarget=${stripAllListTarget[*]:-} + + local i + for i in ${!stripCmds[@]}; do + local -n flag="${flags[$i]}" + local -n debugDirList="${debugDirs[$i]}" + local -n allDirList="${allDirs[$i]}" + local -n stripCmd="${stripCmds[$i]}" + local -n ranlibCmd="${ranlibCmds[$i]}" + + # `dontStrip` disables them all + if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null 1>&2 + then continue; fi + + stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags[*]:--S -p}" + stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags[*]:--s -p}" + done +} + +stripDirs() { + local cmd="$1" + local ranlibCmd="$2" + local paths="$3" + local stripFlags="$4" + local excludeFlags=() + local pathsNew= + + [ -z "$cmd" ] && echo "stripDirs: Strip command is empty" 1>&2 && exit 1 + [ -z "$ranlibCmd" ] && echo "stripDirs: Ranlib command is empty" 1>&2 && exit 1 + + local pattern + if [ -n "${stripExclude:-}" ]; then + for pattern in "${stripExclude[@]}"; do + excludeFlags+=(-a '!' '(' -name "$pattern" -o -wholename "$prefix/$pattern" ')' ) + done + fi + + local p + for p in ${paths}; do + if [ -e "$prefix/$p" ]; then + pathsNew="${pathsNew} $prefix/$p" + fi + done + paths=${pathsNew} + + if [ -n "${paths}" ]; then + echo "stripping (with command $cmd and flags $stripFlags) in $paths" + local striperr + striperr="$(mktemp --tmpdir="$TMPDIR" 'striperr.XXXXXX')" + # Do not strip lib/debug. This is a directory used by setup-hooks/separate-debug-info.sh. + find $paths -type f "${excludeFlags[@]}" -a '!' -path "$prefix/lib/debug/*" -print0 | + # Make sure we process files under symlinks only once. Otherwise + # 'strip` can corrupt files when writes to them in parallel: + # https://github.com/NixOS/nixpkgs/issues/246147#issuecomment-1657072039 + xargs -r -0 -n1 -- realpath -z | sort -u -z | + + xargs -r -0 -n1 -P "$NIX_BUILD_CORES" -- $cmd $stripFlags 2>"$striperr" || exit_code=$? + # xargs exits with status code 123 if some but not all of the + # processes fail. We don't care if some of the files couldn't + # be stripped, so ignore specifically this code. + [[ "$exit_code" = 123 || -z "$exit_code" ]] || (cat "$striperr" 1>&2 && exit 1) + + rm "$striperr" + # 'strip' does not normally preserve archive index in .a files. + # This usually causes linking failures against static libs like: + # ld: ...-i686-w64-mingw32-stage-final-gcc-13.0.0-lib/i686-w64-mingw32/lib/libstdc++.dll.a: + # error adding symbols: archive has no index; run ranlib to add one + # Restore the index by running 'ranlib'. + find $paths -name '*.a' -type f -exec $ranlibCmd '{}' \; 2>/dev/null + fi +} diff --git a/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh b/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh new file mode 100644 index 0000000..ebd3afa --- /dev/null +++ b/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh @@ -0,0 +1,12 @@ +preConfigurePhases+=" updateAutotoolsGnuConfigScriptsPhase" + +updateAutotoolsGnuConfigScriptsPhase() { + if [ -n "${dontUpdateAutotoolsGnuConfigScripts-}" ]; then return; fi + + for script in config.sub config.guess; do + for f in $(find . -type f -name "$script"); do + echo "Updating Autotools / GNU config script to a newer upstream version: $f" + cp -f "@gnu_config@/$script" "$f" + done + done +} diff --git a/pkgs/build-support/setup-hooks/use-old-cxx-abi.sh b/pkgs/build-support/setup-hooks/use-old-cxx-abi.sh new file mode 100644 index 0000000..53335d7 --- /dev/null +++ b/pkgs/build-support/setup-hooks/use-old-cxx-abi.sh @@ -0,0 +1 @@ +export NIX_CFLAGS_COMPILE+=" -D_GLIBCXX_USE_CXX11_ABI=0" diff --git a/pkgs/build-support/setup-hooks/validate-pkg-config.sh b/pkgs/build-support/setup-hooks/validate-pkg-config.sh new file mode 100644 index 0000000..c212a1f --- /dev/null +++ b/pkgs/build-support/setup-hooks/validate-pkg-config.sh @@ -0,0 +1,18 @@ +# This setup hook validates each pkgconfig file in each output. + +fixupOutputHooks+=(_validatePkgConfig) + +_validatePkgConfig() { + local bail=0 + for pc in $(find "$prefix" -name '*.pc'); do + # Do not fail immediately. It's nice to see all errors when + # there are multiple pkgconfig files. + if ! $PKG_CONFIG --validate "$pc"; then + bail=1 + fi + done + + if [ $bail -eq 1 ]; then + exit 1 + fi +} diff --git a/pkgs/build-support/setup-hooks/win-dll-link.sh b/pkgs/build-support/setup-hooks/win-dll-link.sh new file mode 100644 index 0000000..14594bc --- /dev/null +++ b/pkgs/build-support/setup-hooks/win-dll-link.sh @@ -0,0 +1,89 @@ +fixupOutputHooks+=(_linkDLLs) + +addEnvHooks "$targetOffset" linkDLLGetFolders + +linkDLLGetFolders() { + addToSearchPath "LINK_DLL_FOLDERS" "$1/lib" + addToSearchPath "LINK_DLL_FOLDERS" "$1/bin" +} + +_linkDLLs() { + linkDLLsInfolder "$prefix/bin" +} + +# Try to links every known dependency of exe/dll in the folder of the 1str input +# into said folder, so they are found on invocation. +# (DLLs are first searched in the directory of the running exe file.) +# The links are relative, so relocating whole /nix/store won't break them. +linkDLLsInfolder() { + ( + local folder + folder="$1" + if [ ! -d "$folder" ]; then + echo "Not linking DLLs in the non-existent folder $folder" + return + fi + cd "$folder" || exit + + # Use associative arrays as set + local filesToChecks + local filesDone + declare -A filesToChecks # files that still needs to have their dependancies checked + declare -A filesDone # files that had their dependancies checked and who is copied to the bin folder if found + + markFileAsDone() { + if [ ! "${filesDone[$1]+a}" ]; then filesDone[$1]=a; fi + if [ "${filesToChecks[$1]+a}" ]; then unset 'filesToChecks[$1]'; fi + } + + addFileToLink() { + if [ "${filesDone[$1]+a}" ]; then return; fi + if [ ! "${filesToChecks[$1]+a}" ]; then filesToChecks[$1]=a; fi + } + + # Compose path list where DLLs should be located: + # prefix $PATH by currently-built outputs + local DLLPATH="" + local outName + for outName in $(getAllOutputNames); do + addToSearchPath DLLPATH "${!outName}/bin" + done + DLLPATH="$DLLPATH:$LINK_DLL_FOLDERS" + + echo DLLPATH="'$DLLPATH'" + + for peFile in *.{exe,dll}; do + if [ -e "./$peFile" ]; then + addFileToLink "$peFile" + fi + done + + local searchPaths + readarray -td: searchPaths < <(printf -- "%s" "$DLLPATH") + + local linkCount=0 + while [ ${#filesToChecks[*]} -gt 0 ]; do + local listOfDlls=("${!filesToChecks[@]}") + local file=${listOfDlls[0]} + markFileAsDone "$file" + if [ ! -e "./$file" ]; then + local pathsFound + readarray -d '' pathsFound < <(find "${searchPaths[@]}" -name "$file" -type f -print0) + if [ ${#pathsFound[@]} -eq 0 ]; then continue; fi + local dllPath + dllPath="${pathsFound[0]}" + CYGWIN+=" winsymlinks:nativestrict" ln -sr "$dllPath" . + echo "linking $dllPath" + file="$dllPath" + linkCount=$((linkCount + 1)) + fi + # local dep_file + # Look at the file’s dependancies + for dep_file in $($OBJDUMP -p "$file" | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do + addFileToLink "$dep_file" + done + done + + echo "Created $linkCount DLL link(s) in $folder" + ) +} diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix b/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix new file mode 100644 index 0000000..3c5199b --- /dev/null +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix @@ -0,0 +1,203 @@ +{ stdenv +, lib +, makeSetupHook +, makeWrapper +, gobject-introspection +, isGraphical ? true +, gtk3 +, librsvg +, dconf +, callPackage +, wrapGAppsHook +, targetPackages +}: + +makeSetupHook { + name = "wrap-gapps-hook"; + propagatedBuildInputs = [ + # We use the wrapProgram function. + makeWrapper + ] ++ lib.optionals isGraphical [ + # TODO: remove this, packages should depend on GTK explicitly. + gtk3 + + librsvg + ]; + + # depsTargetTargetPropagated will essentially be buildInputs when wrapGAppsHook is placed into nativeBuildInputs + # the librsvg and gtk3 above should be removed but kept to not break anything that implicitly depended on its binaries + depsTargetTargetPropagated = assert (lib.assertMsg (!targetPackages ? raw) "wrapGAppsHook must be in nativeBuildInputs"); lib.optionals isGraphical [ + # librsvg provides a module for gdk-pixbuf to allow rendering + # SVG icons. Most icon themes are SVG-based and so are some + # graphics in GTK (e.g. cross for closing window in window title bar) + # so it is pretty much required for applications using GTK. + librsvg + + # TODO: remove this, packages should depend on GTK explicitly. + gtk3 + ] ++ lib.optionals (!stdenv.isDarwin) [ + # It is highly probable that a program will use GSettings, + # at minimum through GTK file chooser dialogue. + # Let’s add a GIO module for “dconf” GSettings backend + # to avoid falling back to “memory” backend. This is + # required for GSettings-based settings to be persisted. + # Unfortunately, it also requires the user to have dconf + # D-Bus service enabled globally (e.g. through a NixOS module). + dconf.lib + ]; + passthru = { + tests = let + sample-project = ./tests/sample-project; + + testLib = callPackage ./tests/lib.nix { }; + inherit (testLib) expectSomeLineContainingYInFileXToMentionZ; + in rec { + # Simple derivation containing a program and a daemon. + basic = stdenv.mkDerivation { + name = "basic"; + + src = sample-project; + + strictDeps = true; + nativeBuildInputs = [ wrapGAppsHook ]; + + installFlags = [ "bin-foo" "libexec-bar" ]; + }; + + # The wrapper for executable files should add path to dconf GIO module. + basic-contains-dconf = let + tested = basic; + in testLib.runTest "basic-contains-dconf" ( + testLib.skip stdenv.isDarwin '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GIO_EXTRA_MODULES" "${dconf.lib}/lib/gio/modules"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GIO_EXTRA_MODULES" "${dconf.lib}/lib/gio/modules"} + '' + ); + + basic-contains-gdk-pixbuf = let + tested = basic; + in testLib.runTest "basic-contains-gdk-pixbuf" ( + testLib.skip stdenv.isDarwin '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GDK_PIXBUF_MODULE_FILE" "${lib.getLib librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GDK_PIXBUF_MODULE_FILE" "${lib.getLib librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"} + '' + ); + + # Simple derivation containing a gobject-introspection typelib. + typelib-Mahjong = stdenv.mkDerivation { + name = "typelib-Mahjong"; + + src = sample-project; + + strictDeps = true; + + installFlags = [ "typelib-Mahjong" ]; + }; + + # Simple derivation using a typelib. + typelib-user = stdenv.mkDerivation { + name = "typelib-user"; + + src = sample-project; + + strictDeps = true; + nativeBuildInputs = [ + gobject-introspection + wrapGAppsHook + ]; + + buildInputs = [ + typelib-Mahjong + ]; + + installFlags = [ "bin-foo" "libexec-bar" ]; + }; + + # Testing cooperation with gobject-introspection setup hook, + # which should populate GI_TYPELIB_PATH variable with paths + # to typelibs among the derivation’s dependencies. + # The resulting GI_TYPELIB_PATH should be picked up by the wrapper. + typelib-user-has-gi-typelib-path = let + tested = typelib-user; + in testLib.runTest "typelib-user-has-gi-typelib-path" '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH" "${typelib-Mahjong}/lib/girepository-1.0"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH" "${typelib-Mahjong}/lib/girepository-1.0"} + ''; + + # Simple derivation containing a gobject-introspection typelib in lib output. + typelib-Bechamel = stdenv.mkDerivation { + name = "typelib-Bechamel"; + + outputs = [ "out" "lib" ]; + + src = sample-project; + + strictDeps = true; + + makeFlags = [ + "LIBDIR=${placeholder "lib"}/lib" + ]; + + installFlags = [ "typelib-Bechamel" ]; + }; + + # Simple derivation using a typelib from non-default output. + typelib-multiout-user = stdenv.mkDerivation { + name = "typelib-multiout-user"; + + src = sample-project; + + strictDeps = true; + nativeBuildInputs = [ + gobject-introspection + wrapGAppsHook + ]; + + buildInputs = [ + typelib-Bechamel + ]; + + installFlags = [ "bin-foo" "libexec-bar" ]; + }; + + # Testing cooperation with gobject-introspection setup hook, + # which should populate GI_TYPELIB_PATH variable with paths + # to typelibs among the derivation’s dependencies, + # even when they are not in default output. + # The resulting GI_TYPELIB_PATH should be picked up by the wrapper. + typelib-multiout-user-has-gi-typelib-path = let + tested = typelib-multiout-user; + in testLib.runTest "typelib-multiout-user-has-gi-typelib-path" '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH" "${typelib-Bechamel.lib}/lib/girepository-1.0"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH" "${typelib-Bechamel.lib}/lib/girepository-1.0"} + ''; + + # Simple derivation that contains a typelib as well as a program using it. + typelib-self-user = stdenv.mkDerivation { + name = "typelib-self-user"; + + src = sample-project; + + strictDeps = true; + nativeBuildInputs = [ + gobject-introspection + wrapGAppsHook + ]; + + installFlags = [ "typelib-Cow" "bin-foo" "libexec-bar" ]; + }; + + # Testing cooperation with gobject-introspection setup hook, + # which should add the path to derivation’s own typelibs + # to GI_TYPELIB_PATH variable. + # The resulting GI_TYPELIB_PATH should be picked up by the wrapper. + # https://github.com/NixOS/nixpkgs/issues/85515 + typelib-self-user-has-gi-typelib-path = let + tested = typelib-self-user; + in testLib.runTest "typelib-self-user-has-gi-typelib-path" '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH" "${typelib-self-user}/lib/girepository-1.0"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH" "${typelib-self-user}/lib/girepository-1.0"} + ''; + }; + }; +} ./wrap-gapps-hook.sh diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix new file mode 100644 index 0000000..59fa9de --- /dev/null +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix @@ -0,0 +1,31 @@ +{ lib, runCommand }: + +rec { + runTest = name: body: runCommand name { strictDeps = true; } '' + set -o errexit + ${body} + touch $out + ''; + + skip = cond: text: + if cond then '' + echo "Skipping test $name" > /dev/stderr + '' else text; + + fail = text: '' + echo "FAIL: $name: ${text}" > /dev/stderr + exit 1 + ''; + + expectSomeLineContainingYInFileXToMentionZ = file: filter: expected: '' + file=${lib.escapeShellArg file} filter=${lib.escapeShellArg filter} expected=${lib.escapeShellArg expected} + + if ! grep --text --quiet "$filter" "$file"; then + ${fail "The file “$file” should include a line containing “$filter”."} + fi + + if ! grep --text "$filter" "$file" | grep --text --quiet "$expected"; then + ${fail "The file “$file” should include a line containing “$filter” that also contains “$expected”."} + fi + ''; +} diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/sample-project/Makefile b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/sample-project/Makefile new file mode 100644 index 0000000..5d234db --- /dev/null +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/sample-project/Makefile @@ -0,0 +1,30 @@ +PREFIX = $(out) +BINDIR = $(PREFIX)/bin +LIBEXECDIR = $(PREFIX)/libexec +LIBDIR = $(PREFIX)/lib +TYPELIBDIR = $(LIBDIR)/girepository-1.0 + +all: + echo "Compiling…" +install: + echo "Installing…" + +bin: + mkdir -p $(BINDIR) +# Adds `bin-${foo}` targets, that install `${foo}` executable to `$(BINDIR)`. +bin-%: bin + touch $(BINDIR)/$(@:bin-%=%) + chmod +x $(BINDIR)/$(@:bin-%=%) + +libexec: + mkdir -p $(LIBEXECDIR) +# Adds `libexec-${foo}` targets, that install `${foo}` executable to `$(LIBEXECDIR)`. +libexec-%: libexec + touch $(LIBEXECDIR)/$(@:libexec-%=%) + chmod +x $(LIBEXECDIR)/$(@:libexec-%=%) + +typelib: + mkdir -p $(TYPELIBDIR) +# Adds `typelib-${foo}` targets, that install `${foo}-1.0.typelib` file to `$(TYPELIBDIR)`. +typelib-%: typelib + touch $(TYPELIBDIR)/$(@:typelib-%=%)-1.0.typelib diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh b/pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh new file mode 100644 index 0000000..0acf4a8 --- /dev/null +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/wrap-gapps-hook.sh @@ -0,0 +1,89 @@ +# shellcheck shell=bash +gappsWrapperArgs=() + +find_gio_modules() { + if [ -d "$1/lib/gio/modules" ] && [ -n "$(ls -A "$1/lib/gio/modules")" ] ; then + gappsWrapperArgs+=(--prefix GIO_EXTRA_MODULES : "$1/lib/gio/modules") + fi +} + +addEnvHooks "${targetOffset:?}" find_gio_modules + +gappsWrapperArgsHook() { + if [ -n "$GDK_PIXBUF_MODULE_FILE" ]; then + gappsWrapperArgs+=(--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE") + fi + + if [ -n "$GSETTINGS_SCHEMAS_PATH" ]; then + gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH") + fi + + # Check for prefix as well + if [ -d "${prefix:?}/share" ]; then + gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "$prefix/share") + fi + + if [ -d "$prefix/lib/gio/modules" ] && [ -n "$(ls -A "$prefix/lib/gio/modules")" ]; then + gappsWrapperArgs+=(--prefix GIO_EXTRA_MODULES : "$prefix/lib/gio/modules") + fi + + for v in ${wrapPrefixVariables:-} GST_PLUGIN_SYSTEM_PATH_1_0 GI_TYPELIB_PATH GRL_PLUGIN_PATH; do + if [ -n "${!v}" ]; then + gappsWrapperArgs+=(--prefix "$v" : "${!v}") + fi + done +} + +preFixupPhases+=" gappsWrapperArgsHook" + +wrapGApp() { + local program="$1" + shift 1 + wrapProgram "$program" "${gappsWrapperArgs[@]}" "$@" +} + +# Note: $gappsWrapperArgs still gets defined even if ${dontWrapGApps-} is set. +wrapGAppsHook() { + # guard against running multiple times (e.g. due to propagation) + [ -z "$wrapGAppsHookHasRun" ] || return 0 + wrapGAppsHookHasRun=1 + + if [[ -z "${dontWrapGApps:-}" ]]; then + targetDirsThatExist=() + targetDirsRealPath=() + + # wrap binaries + targetDirs=("${prefix}/bin" "${prefix}/libexec") + for targetDir in "${targetDirs[@]}"; do + if [[ -d "${targetDir}" ]]; then + targetDirsThatExist+=("${targetDir}") + targetDirsRealPath+=("$(realpath "${targetDir}")/") + find "${targetDir}" -type f -executable -print0 | + while IFS= read -r -d '' file; do + echo "Wrapping program '${file}'" + wrapGApp "${file}" + done + fi + done + + # wrap links to binaries that point outside targetDirs + # Note: links to binaries within targetDirs do not need + # to be wrapped as the binaries have already been wrapped + if [[ ${#targetDirsThatExist[@]} -ne 0 ]]; then + find "${targetDirsThatExist[@]}" -type l -xtype f -executable -print0 | + while IFS= read -r -d '' linkPath; do + linkPathReal=$(realpath "${linkPath}") + for targetPath in "${targetDirsRealPath[@]}"; do + if [[ "$linkPathReal" == "$targetPath"* ]]; then + echo "Not wrapping link: '$linkPath' (already wrapped)" + continue 2 + fi + done + echo "Wrapping link: '$linkPath'" + wrapGApp "${linkPath}" + done + fi + fi +} + +fixupOutputHooks+=(wrapGAppsHook) diff --git a/pkgs/build-support/setup-systemd-units.nix b/pkgs/build-support/setup-systemd-units.nix new file mode 100644 index 0000000..4c7ee86 --- /dev/null +++ b/pkgs/build-support/setup-systemd-units.nix @@ -0,0 +1,83 @@ +# | Build a script to install and start a set of systemd units on any +# systemd-based system. +# +# Creates a symlink at /etc/systemd-static/${namespace} for slightly +# improved atomicity. +{ writeScriptBin +, bash +, coreutils +, systemd +, runCommand +, lib +}: + { units # : AttrSet String (Either Path { path : Path, wanted-by : [ String ] }) + # ^ A set whose names are unit names and values are + # either paths to the corresponding unit files or a set + # containing the path and the list of units this unit + # should be wanted-by (none by default). + # + # The names should include the unit suffix + # (e.g. ".service") + , namespace # : String + # The namespace for the unit files, to allow for + # multiple independent unit sets managed by + # `setupSystemdUnits`. + }: + let static = runCommand "systemd-static" {} + '' + mkdir -p $out + ${lib.concatStringsSep "\n" (lib.mapAttrsToList (nm: file: + "ln -sv ${file.path or file} $out/${nm}" + ) units)} + ''; + add-unit-snippet = name: file: + '' + oldUnit=$(readlink -f "$unitDir/${name}" || echo "$unitDir/${name}") + if [ -f "$oldUnit" -a "$oldUnit" != "${file.path or file}" ]; then + unitsToStop+=("${name}") + fi + ln -sf "/etc/systemd-static/${namespace}/${name}" \ + "$unitDir/.${name}.tmp" + mv -T "$unitDir/.${name}.tmp" "$unitDir/${name}" + ${lib.concatStringsSep "\n" (map (unit: + '' + mkdir -p "$unitDir/${unit}.wants" + ln -sf "../${name}" \ + "$unitDir/${unit}.wants/.${name}.tmp" + mv -T "$unitDir/${unit}.wants/.${name}.tmp" \ + "$unitDir/${unit}.wants/${name}" + '' + ) file.wanted-by or [])} + unitsToStart+=("${name}") + ''; + in + writeScriptBin "setup-systemd-units" + '' + #!${bash}/bin/bash -e + export PATH=${coreutils}/bin:${systemd}/bin + + unitDir=/etc/systemd/system + if [ ! -w "$unitDir" ]; then + unitDir=/nix/var/nix/profiles/default/lib/systemd/system + mkdir -p "$unitDir" + fi + declare -a unitsToStop unitsToStart + + oldStatic=$(readlink -f /etc/systemd-static/${namespace} || true) + if [ "$oldStatic" != "${static}" ]; then + ${lib.concatStringsSep "\n" + (lib.mapAttrsToList add-unit-snippet units)} + if [ ''${#unitsToStop[@]} -ne 0 ]; then + echo "Stopping unit(s) ''${unitsToStop[@]}" >&2 + systemctl stop "''${unitsToStop[@]}" + fi + mkdir -p /etc/systemd-static + ln -sfT ${static} /etc/systemd-static/.${namespace}.tmp + mv -T /etc/systemd-static/.${namespace}.tmp /etc/systemd-static/${namespace} + systemctl daemon-reload + echo "Starting unit(s) ''${unitsToStart[@]}" >&2 + systemctl start "''${unitsToStart[@]}" + else + echo "Units unchanged, doing nothing" >&2 + fi + '' diff --git a/pkgs/build-support/singularity-tools/default.nix b/pkgs/build-support/singularity-tools/default.nix new file mode 100644 index 0000000..c9e53a4 --- /dev/null +++ b/pkgs/build-support/singularity-tools/default.nix @@ -0,0 +1,117 @@ +{ runCommand +, lib +, stdenv +, storeDir ? builtins.storeDir +, writeScript +, singularity +, writeClosure +, bash +, vmTools +, gawk +, util-linux +, runtimeShell +, e2fsprogs +}: +rec { + shellScript = name: text: + writeScript name '' + #!${runtimeShell} + set -e + ${text} + ''; + + mkLayer = + { name + , contents ? [ ] + # May be "apptainer" instead of "singularity" + , projectName ? (singularity.projectName or "singularity") + }: + runCommand "${projectName}-layer-${name}" + { + inherit contents; + } '' + mkdir $out + for f in $contents ; do + cp -ra $f $out/ + done + ''; + + buildImage = + let + defaultSingularity = singularity; + in + { name + , contents ? [ ] + , diskSize ? 1024 + , runScript ? "#!${stdenv.shell}\nexec /bin/sh" + , runAsRoot ? null + , memSize ? 512 + , singularity ? defaultSingularity + }: + let + projectName = singularity.projectName or "singularity"; + runAsRootFile = shellScript "run-as-root.sh" runAsRoot; + runScriptFile = shellScript "run-script.sh" runScript; + result = vmTools.runInLinuxVM ( + runCommand "${projectName}-image-${name}.img" + { + buildInputs = [ singularity e2fsprogs util-linux gawk ]; + layerClosure = writeClosure contents; + preVM = vmTools.createEmptyImage { + size = diskSize; + fullName = "${projectName}-run-disk"; + }; + inherit memSize; + } + '' + rm -rf $out + mkdir disk + mkfs -t ext3 -b 4096 /dev/${vmTools.hd} + mount /dev/${vmTools.hd} disk + mkdir -p disk/img + cd disk/img + mkdir proc sys dev + + # Run root script + ${lib.optionalString (runAsRoot != null) '' + mkdir -p ./${storeDir} + mount --rbind ${storeDir} ./${storeDir} + unshare -imnpuf --mount-proc chroot ./ ${runAsRootFile} + umount -R ./${storeDir} + ''} + + # Build /bin and copy across closure + mkdir -p bin ./${builtins.storeDir} + for f in $(cat $layerClosure) ; do + cp -ar $f ./$f + done + + for c in ${toString contents} ; do + for f in $c/bin/* ; do + if [ ! -e bin/$(basename $f) ] ; then + ln -s $f bin/ + fi + done + done + + # Create runScript and link shell + if [ ! -e bin/sh ]; then + ln -s ${runtimeShell} bin/sh + fi + mkdir -p .${projectName}.d + ln -s ${runScriptFile} .${projectName}.d/runscript + + # Fill out .${projectName}.d + mkdir -p .${projectName}.d/env + touch .${projectName}.d/env/94-appsbase.sh + + cd .. + mkdir -p /var/lib/${projectName}/mnt/session + echo "root:x:0:0:System administrator:/root:/bin/sh" > /etc/passwd + echo > /etc/resolv.conf + TMPDIR=$(pwd -P) ${projectName} build $out ./img + ''); + + in + result; +} diff --git a/pkgs/build-support/source-from-head-fun.nix b/pkgs/build-support/source-from-head-fun.nix new file mode 100644 index 0000000..938df1e --- /dev/null +++ b/pkgs/build-support/source-from-head-fun.nix @@ -0,0 +1,16 @@ +/* + purpose: mantain bleeding edge head sources. + + you run + app --update + app --publish + to create source snapshots + + The documentation is availible at https://github.com/MarcWeber/nix-repository-manager/raw/master/README + +*/ +{ config }: + localTarName: publishedSrcSnapshot: + if config.sourceFromHead.useLocalRepos or false then + "${config.sourceFromHead.managedRepoDir or "/set/sourceFromHead.managedRepoDir/please"}/dist/${localTarName}" + else publishedSrcSnapshot diff --git a/pkgs/build-support/src-only/default.nix b/pkgs/build-support/src-only/default.nix new file mode 100644 index 0000000..2b0db0e --- /dev/null +++ b/pkgs/build-support/src-only/default.nix @@ -0,0 +1,22 @@ +{ stdenv }: +# srcOnly is a utility builder that only fetches and unpacks the given `src`, +# and optionally patching with `patches` or adding build inputs. +# +# It can be invoked directly, or be used to wrap an existing derivation. Eg: +# +# > srcOnly pkgs.hello +# +attrs: +let + args = if builtins.hasAttr "drvAttrs" attrs then attrs.drvAttrs else attrs; + name = if builtins.hasAttr "name" args then args.name else "${args.pname}-${args.version}"; +in +stdenv.mkDerivation (args // { + name = "${name}-source"; + installPhase = "cp -r . $out"; + outputs = [ "out" ]; + separateDebugInfo = false; + dontUnpack = false; + dontInstall = false; + phases = ["unpackPhase" "patchPhase" "installPhase"]; +}) diff --git a/pkgs/build-support/substitute-files/substitute-all-files.nix b/pkgs/build-support/substitute-files/substitute-all-files.nix new file mode 100644 index 0000000..682e976 --- /dev/null +++ b/pkgs/build-support/substitute-files/substitute-all-files.nix @@ -0,0 +1,26 @@ +{ lib, stdenv }: + +args: + +stdenv.mkDerivation ({ + name = if args ? name then args.name else baseNameOf (toString args.src); + builder = builtins.toFile "builder.sh" '' + source $stdenv/setup + set -o pipefail + + eval "$preInstall" + + args= + + pushd "$src" + echo -ne "${lib.concatStringsSep "\\0" args.files}" | xargs -0 -n1 -I {} -- find {} -type f -print0 | while read -d "" line; do + mkdir -p "$out/$(dirname "$line")" + substituteAll "$line" "$out/$line" + done + popd + + eval "$postInstall" + ''; + preferLocalBuild = true; + allowSubstitutes = false; +} // args) diff --git a/pkgs/build-support/substitute/substitute-all.nix b/pkgs/build-support/substitute/substitute-all.nix new file mode 100644 index 0000000..f49d560 --- /dev/null +++ b/pkgs/build-support/substitute/substitute-all.nix @@ -0,0 +1,12 @@ +{ stdenvNoCC }: + +args: + +# see the substituteAll in the nixpkgs documentation for usage and constraints +stdenvNoCC.mkDerivation ({ + name = if args ? name then args.name else baseNameOf (toString args.src); + builder = ./substitute-all.sh; + inherit (args) src; + preferLocalBuild = true; + allowSubstitutes = false; +} // args) diff --git a/pkgs/build-support/substitute/substitute-all.sh b/pkgs/build-support/substitute/substitute-all.sh new file mode 100644 index 0000000..ec22048 --- /dev/null +++ b/pkgs/build-support/substitute/substitute-all.sh @@ -0,0 +1,19 @@ +source $stdenv/setup + +eval "$preInstall" + +args= + +target=$out +if test -n "$dir"; then + target=$out/$dir/$name + mkdir -p $out/$dir +fi + +substituteAll $src $target + +if test -n "$isExecutable"; then + chmod +x $target +fi + +eval "$postInstall" diff --git a/pkgs/build-support/substitute/substitute.nix b/pkgs/build-support/substitute/substitute.nix new file mode 100644 index 0000000..37233a3 --- /dev/null +++ b/pkgs/build-support/substitute/substitute.nix @@ -0,0 +1,58 @@ +{ lib, stdenvNoCC }: +/* +This is a wrapper around `substitute` in the stdenv. + +Attribute arguments: +- `name` (optional): The name of the resulting derivation +- `src`: The path to the file to substitute +- `substitutions`: The list of substitution arguments to pass + See https://nixos.org/manual/nixpkgs/stable/#fun-substitute +- `replacements`: Deprecated version of `substitutions` + that doesn't support spaces in arguments. + +Example: + +```nix +{ substitute }: +substitute { + src = ./greeting.txt; + substitutions = [ + "--replace" + "world" + "paul" + ]; +} +``` + +See ../../test/substitute for tests +*/ +args: + +let + name = if args ? name then args.name else baseNameOf (toString args.src); + deprecationReplacement = lib.pipe args.replacements [ + lib.toList + (map (lib.splitString " ")) + lib.concatLists + (lib.concatMapStringsSep " " lib.strings.escapeNixString) + ]; + optionalDeprecationWarning = + # substitutions is only available starting 24.05. + # TODO: Remove support for replacements sometime after the next release + lib.warnIf (args ? replacements && lib.isInOldestRelease 2405) '' + pkgs.substitute: For "${name}", `replacements` is used, which is deprecated since it doesn't support arguments with spaces. Use `substitutions` instead: + substitutions = [ ${deprecationReplacement} ];''; +in +optionalDeprecationWarning +stdenvNoCC.mkDerivation ({ + inherit name; + builder = ./substitute.sh; + inherit (args) src; + preferLocalBuild = true; + allowSubstitutes = false; +} // args // lib.optionalAttrs (args ? substitutions) { + substitutions = + assert lib.assertMsg (lib.isList args.substitutions) '' + pkgs.substitute: For "${name}", `substitutions` is passed, which is expected to be a list, but it's a ${builtins.typeOf args.substitutions} instead.''; + lib.escapeShellArgs args.substitutions; +}) diff --git a/pkgs/build-support/substitute/substitute.sh b/pkgs/build-support/substitute/substitute.sh new file mode 100644 index 0000000..d50a824 --- /dev/null +++ b/pkgs/build-support/substitute/substitute.sh @@ -0,0 +1,24 @@ +source $stdenv/setup + +args= + +target=$out +if test -n "$dir"; then + target=$out/$dir/$name + mkdir -p $out/$dir +fi + +substitutionsList=($replacements) + +if [[ -v substitutions ]]; then + eval "substitutionsList+=($substitutions)" +fi + +substitute $src $target "${substitutionsList[@]}" + +if test -n "$isExecutable"; then + chmod +x $target +fi + +eval "$postInstall" + diff --git a/pkgs/build-support/testers/default.nix b/pkgs/build-support/testers/default.nix new file mode 100644 index 0000000..362622d --- /dev/null +++ b/pkgs/build-support/testers/default.nix @@ -0,0 +1,150 @@ +{ pkgs, pkgsLinux, buildPackages, lib, callPackage, runCommand, stdenv, substituteAll, testers }: +# Documentation is in doc/builders/testers.chapter.md +{ + # See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailure + # or doc/builders/testers.chapter.md + testBuildFailure = drv: drv.overrideAttrs (orig: { + builder = buildPackages.bash; + args = [ + (substituteAll { coreutils = buildPackages.coreutils; src = ./expect-failure.sh; }) + orig.realBuilder or stdenv.shell + ] ++ orig.args or ["-e" (orig.builder or ../../stdenv/generic/default-builder.sh)]; + }); + + # See https://nixos.org/manual/nixpkgs/unstable/#tester-testEqualDerivation + # or doc/builders/testers.chapter.md + testEqualDerivation = callPackage ./test-equal-derivation.nix { }; + + # See https://nixos.org/manual/nixpkgs/unstable/#tester-testEqualContents + # or doc/builders/testers.chapter.md + testEqualContents = { + assertion, + actual, + expected, + }: runCommand "equal-contents-${lib.strings.toLower assertion}" { + inherit assertion actual expected; + } '' + echo "Checking:" + echo "$assertion" + if ! diff -U5 -r "$actual" "$expected" --color=always + then + echo + echo 'Contents must be equal, but were not!' + echo + echo "+: expected, at $expected" + echo "-: unexpected, at $actual" + exit 1 + else + find "$expected" -type f -executable > expected-executables | sort + find "$actual" -type f -executable > actual-executables | sort + if ! diff -U0 actual-executables expected-executables --color=always + then + echo + echo "Contents must be equal, but some files' executable bits don't match" + echo + echo "+: make this file executable in the actual contents" + echo "-: make this file non-executable in the actual contents" + exit 1 + else + echo "expected $expected and actual $actual match." + echo 'OK' + touch $out + fi + fi + ''; + + # See https://nixos.org/manual/nixpkgs/unstable/#tester-testVersion + # or doc/builders/testers.chapter.md + testVersion = + { package, + command ? "${package.meta.mainProgram or package.pname or package.name} --version", + version ? package.version, + }: runCommand "${package.name}-test-version" { nativeBuildInputs = [ package ]; meta.timeout = 60; } '' + if output=$(${command} 2>&1); then + if grep -Fw -- "${version}" - <<< "$output"; then + touch $out + else + echo "Version string '${version}' not found!" >&2 + echo "The output was:" >&2 + echo "$output" >&2 + exit 1 + fi + else + echo -n ${lib.escapeShellArg command} >&2 + echo " returned a non-zero exit code." >&2 + echo "$output" >&2 + exit 1 + fi + ''; + + # See doc/builders/testers.chapter.md or + # https://nixos.org/manual/nixpkgs/unstable/#tester-invalidateFetcherByDrvHash + invalidateFetcherByDrvHash = f: args: + let + drvPath = (f args).drvPath; + # It's safe to discard the context, because we don't access the path. + salt = builtins.unsafeDiscardStringContext (lib.substring 0 12 (baseNameOf drvPath)); + # New derivation incorporating the original drv hash in the name + salted = f (args // { name = "${args.name or "source"}-salted-${salt}"; }); + # Make sure we did change the derivation. If the fetcher ignores `name`, + # `invalidateFetcherByDrvHash` doesn't work. + checked = + if salted.drvPath == drvPath + then throw "invalidateFetcherByDrvHash: Adding the derivation hash to the fixed-output derivation name had no effect. Make sure the fetcher's name argument ends up in the derivation name. Otherwise, the fetcher will not be re-run when its implementation changes. This is important for testing." + else salted; + in checked; + + # See doc/builders/testers.chapter.md or + # https://nixos.org/manual/nixpkgs/unstable/#tester-runNixOSTest + runNixOSTest = + let nixos = import ../../../nixos/lib { + inherit lib; + }; + in testModule: + nixos.runTest { + _file = "pkgs.runNixOSTest implementation"; + imports = [ + (lib.setDefaultModuleLocation "the argument that was passed to pkgs.runNixOSTest" testModule) + ]; + hostPkgs = pkgs; + node.pkgs = pkgsLinux; + }; + + # See doc/builders/testers.chapter.md or + # https://nixos.org/manual/nixpkgs/unstable/#tester-invalidateFetcherByDrvHash + nixosTest = + let + /* The nixos/lib/testing-python.nix module, preapplied with arguments that + * make sense for this evaluation of Nixpkgs. + */ + nixosTesting = + (import ../../../nixos/lib/testing-python.nix { + inherit (stdenv.hostPlatform) system; + inherit pkgs; + extraConfigurations = [( + { lib, ... }: { + config.nixpkgs.pkgs = lib.mkDefault pkgsLinux; + } + )]; + }); + in + test: + let + loadedTest = if builtins.typeOf test == "path" + then import test + else test; + calledTest = lib.toFunction loadedTest pkgs; + in + nixosTesting.simpleTest calledTest; + + hasPkgConfigModule = + { moduleName, ... }@args: + lib.warn "testers.hasPkgConfigModule has been deprecated in favor of testers.hasPkgConfigModules. It accepts a list of strings via the moduleNames argument instead of a single moduleName." ( + testers.hasPkgConfigModules (builtins.removeAttrs args [ "moduleName" ] // { + moduleNames = [ moduleName ]; + }) + ); + hasPkgConfigModules = callPackage ./hasPkgConfigModules/tester.nix { }; + + testMetaPkgConfig = callPackage ./testMetaPkgConfig/tester.nix { }; +} diff --git a/pkgs/build-support/testers/expect-failure.sh b/pkgs/build-support/testers/expect-failure.sh new file mode 100644 index 0000000..9c725d4 --- /dev/null +++ b/pkgs/build-support/testers/expect-failure.sh @@ -0,0 +1,71 @@ +# Run a builder, flip exit code, save log and fix outputs +# +# Sub-goals: +# - Delegate to another original builder passed via args +# - Save the build log to output for further checks +# - Make the derivation succeed if the original builder fails +# - Make the derivation fail if the original builder returns exit code 0 +# +# Requirements: +# This runs before, without and after stdenv. Do not modify the environment; +# especially not before invoking the original builder. For example, use +# "@" substitutions instead of PATH. +# Do not export any variables. + +# Stricter bash +set -eu + +# ------------------------ +# Run the original builder + +echo "testBuildFailure: Expecting non-zero exit from builder and args: ${*@Q}" + +("$@" 2>&1) | @coreutils@/bin/tee $TMPDIR/testBuildFailure.log \ + | while IFS= read -r ln; do + echo "original builder: $ln" + done + +r=${PIPESTATUS[0]} +if [[ $r = 0 ]]; then + echo "testBuildFailure: The builder did not fail, but a failure was expected!" + exit 1 +fi +echo "testBuildFailure: Original builder produced exit code: $r" + +# ----------------------------------------- +# Write the build log to the default output +# +# # from stdenv setup.sh +getAllOutputNames() { + if [ -n "$__structuredAttrs" ]; then + echo "${!outputs[*]}" + else + echo "$outputs" + fi +} + +outs=( $(getAllOutputNames) ) +defOut=${outs[0]} +defOutPath=${!defOut} + +if [[ ! -d $defOutPath ]]; then + if [[ -e $defOutPath ]]; then + @coreutils@/bin/mv $defOutPath $TMPDIR/out-node + @coreutils@/bin/mkdir $defOutPath + @coreutils@/bin/mv $TMPDIR/out-node $defOutPath/result + fi +fi + +@coreutils@/bin/mkdir -p $defOutPath +@coreutils@/bin/mv $TMPDIR/testBuildFailure.log $defOutPath/testBuildFailure.log +echo $r >$defOutPath/testBuildFailure.exit + +# ------------------------------------------------------ +# Put empty directories in place for any missing outputs + +for outputName in ${outputs:-out}; do + outputPath="${!outputName}" + if [[ ! -e "${outputPath}" ]]; then + @coreutils@/bin/mkdir "${outputPath}"; + fi +done diff --git a/pkgs/build-support/testers/hasPkgConfigModules/tester.nix b/pkgs/build-support/testers/hasPkgConfigModules/tester.nix new file mode 100644 index 0000000..bbcc4f0 --- /dev/null +++ b/pkgs/build-support/testers/hasPkgConfigModules/tester.nix @@ -0,0 +1,50 @@ +# Static arguments +{ lib, runCommand, pkg-config }: + +# Tester arguments +{ package, + moduleNames ? package.meta.pkgConfigModules, + testName ? "check-pkg-config-${lib.concatStringsSep "-" moduleNames}", +}: + +runCommand testName { + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ package ]; + inherit moduleNames; + meta = { + description = "Test whether ${package.name} exposes pkg-config modules ${lib.concatStringsSep ", " moduleNames}."; + } + # Make sure licensing info etc is preserved, as this is a concern for e.g. cache.nixos.org, + # as hydra can't check this meta info in dependencies. + # The test itself is just Nixpkgs, with MIT license. + // builtins.intersectAttrs + { + available = throw "unused"; + broken = throw "unused"; + insecure = throw "unused"; + license = throw "unused"; + maintainers = throw "unused"; + platforms = throw "unused"; + unfree = throw "unused"; + unsupported = throw "unused"; + } + package.meta; + } '' + touch "$out" + for moduleName in $moduleNames; do + echo "checking pkg-config module $moduleName in $buildInputs" + set +e + version="$($PKG_CONFIG --modversion $moduleName)" + r=$? + set -e + if [[ $r = 0 ]]; then + echo "✅ pkg-config module $moduleName exists and has version $version" + printf '%s\t%s\n' "$moduleName" "$version" >> "$out" + else + echo "These modules were available in the input propagation closure:" + $PKG_CONFIG --list-all + echo "❌ pkg-config module $moduleName was not found" + false + fi + done + '' diff --git a/pkgs/build-support/testers/hasPkgConfigModules/tests.nix b/pkgs/build-support/testers/hasPkgConfigModules/tests.nix new file mode 100644 index 0000000..9656949 --- /dev/null +++ b/pkgs/build-support/testers/hasPkgConfigModules/tests.nix @@ -0,0 +1,49 @@ +# cd nixpkgs +# nix-build -A tests.testers.hasPkgConfigModule +{ lib, testers, zlib, openssl, runCommand }: + +lib.recurseIntoAttrs { + + zlib-has-zlib = testers.hasPkgConfigModules { + package = zlib; + moduleNames = [ "zlib" ]; + }; + + zlib-has-meta-pkgConfigModules = testers.hasPkgConfigModules { + package = zlib; + }; + + openssl-has-openssl = testers.hasPkgConfigModules { + package = openssl; + moduleNames = [ "openssl" ]; + }; + + openssl-has-all-meta-pkgConfigModules = testers.hasPkgConfigModules { + package = openssl; + }; + + zlib-does-not-have-ylib = runCommand "zlib-does-not-have-ylib" { + failed = testers.testBuildFailure ( + testers.hasPkgConfigModules { + package = zlib; + moduleNames = [ "ylib" ]; + } + ); + } '' + echo 'it logs a relevant error message' + { + grep -F "pkg-config module ylib was not found" $failed/testBuildFailure.log + } + + echo 'it logs which pkg-config modules are available, to be helpful' + { + # grep -v: the string zlib does also occur in a store path in an earlier message, which isn't particularly helpful + grep -v "checking pkg-config module" < $failed/testBuildFailure.log \ + | grep -F "zlib" + } + + # done + touch $out + ''; + +} diff --git a/pkgs/build-support/testers/test-equal-derivation.nix b/pkgs/build-support/testers/test-equal-derivation.nix new file mode 100644 index 0000000..610d5f5 --- /dev/null +++ b/pkgs/build-support/testers/test-equal-derivation.nix @@ -0,0 +1,26 @@ +{ lib, runCommand, emptyFile, nix-diff }: + +assertion: a: b: +let + drvA = builtins.unsafeDiscardOutputDependency a.drvPath or (throw "testEqualDerivation second argument must be a package"); + drvB = builtins.unsafeDiscardOutputDependency b.drvPath or (throw "testEqualDerivation third argument must be a package"); + name = + if a?name + then "testEqualDerivation-${a.name}" + else "testEqualDerivation"; +in +if drvA == drvB then + emptyFile +else + runCommand name + { + inherit assertion drvA drvB; + nativeBuildInputs = [ nix-diff ]; + } '' + echo "$assertion" + echo "However, the derivations differ:" + echo + echo nix-diff $drvA $drvB + nix-diff $drvA $drvB + exit 1 + '' diff --git a/pkgs/build-support/testers/test/README.md b/pkgs/build-support/testers/test/README.md new file mode 100644 index 0000000..2d6b4bd --- /dev/null +++ b/pkgs/build-support/testers/test/README.md @@ -0,0 +1,8 @@ +# Tests _for the testers_ + + cd nixpkgs + nix-build -A tests.testers + +Tests generally derive their own correctness from simplicity, which in the +case of testers (themselves functions) does not always work out. +Hence the need for tests that test the testers. diff --git a/pkgs/build-support/testers/test/default.nix b/pkgs/build-support/testers/test/default.nix new file mode 100644 index 0000000..da67711 --- /dev/null +++ b/pkgs/build-support/testers/test/default.nix @@ -0,0 +1,213 @@ +{ testers, lib, pkgs, hello, runCommand, ... }: +let + pkgs-with-overlay = pkgs.extend(final: prev: { + proof-of-overlay-hello = prev.hello; + }); + + dummyVersioning = { + revision = "test"; + versionSuffix = "test"; + label = "test"; + }; + +in +lib.recurseIntoAttrs { + hasPkgConfigModules = pkgs.callPackage ../hasPkgConfigModules/tests.nix { }; + + runNixOSTest-example = pkgs-with-overlay.testers.runNixOSTest ({ lib, ... }: { + name = "runNixOSTest-test"; + nodes.machine = { pkgs, ... }: { + system.nixos = dummyVersioning; + environment.systemPackages = [ pkgs.proof-of-overlay-hello pkgs.figlet ]; + }; + testScript = '' + machine.succeed("hello | figlet >/dev/console") + ''; + }); + + # Check that the wiring of nixosTest is correct. + # Correct operation of the NixOS test driver should be asserted elsewhere. + nixosTest-example = pkgs-with-overlay.testers.nixosTest ({ lib, ... }: { + name = "nixosTest-test"; + nodes.machine = { pkgs, ... }: { + system.nixos = dummyVersioning; + environment.systemPackages = [ pkgs.proof-of-overlay-hello pkgs.figlet ]; + }; + testScript = '' + machine.succeed("hello | figlet >/dev/console") + ''; + }); + + testBuildFailure = lib.recurseIntoAttrs { + happy = runCommand "testBuildFailure-happy" { + failed = testers.testBuildFailure (runCommand "fail" {} '' + echo ok-ish >$out + + echo failing though + echo also stderr 1>&2 + echo 'line\nwith-\bbackslashes' + printf "incomplete line - no newline" + + exit 3 + ''); + } '' + grep -F 'ok-ish' $failed/result + + grep -F 'failing though' $failed/testBuildFailure.log + grep -F 'also stderr' $failed/testBuildFailure.log + grep -F 'line\nwith-\bbackslashes' $failed/testBuildFailure.log + grep -F 'incomplete line - no newline' $failed/testBuildFailure.log + + [[ 3 = $(cat $failed/testBuildFailure.exit) ]] + + touch $out + ''; + + helloDoesNotFail = runCommand "testBuildFailure-helloDoesNotFail" { + failed = testers.testBuildFailure (testers.testBuildFailure hello); + + # Add hello itself as a prerequisite, so we don't try to run this test if + # there's an actual failure in hello. + inherit hello; + } '' + echo "Checking $failed/testBuildFailure.log" + grep -F 'testBuildFailure: The builder did not fail, but a failure was expected' $failed/testBuildFailure.log >/dev/null + [[ 1 = $(cat $failed/testBuildFailure.exit) ]] + touch $out + echo 'All good.' + ''; + + multiOutput = runCommand "testBuildFailure-multiOutput" { + failed = testers.testBuildFailure (runCommand "fail" { + # dev will be the default output + outputs = ["dev" "doc" "out"]; + } '' + echo i am failing + exit 1 + ''); + } '' + grep -F 'i am failing' $failed/testBuildFailure.log >/dev/null + [[ 1 = $(cat $failed/testBuildFailure.exit) ]] + + # Checking our note that dev is the default output + echo $failed/_ | grep -- '-dev/_' >/dev/null + echo 'All good.' + touch $out + ''; + }; + + testEqualContents = lib.recurseIntoAttrs { + happy = testers.testEqualContents { + assertion = "The same directory contents at different paths are recognized as equal"; + expected = runCommand "expected" {} '' + mkdir -p $out/c + echo a >$out/a + echo b >$out/b + echo d >$out/c/d + ''; + actual = runCommand "actual" {} '' + mkdir -p $out/c + echo a >$out/a + echo b >$out/b + echo d >$out/c/d + ''; + }; + + unequalExe = + runCommand "testEqualContents-unequalExe" { + log = testers.testBuildFailure (testers.testEqualContents { + assertion = "The same directory contents at different paths are recognized as equal"; + expected = runCommand "expected" {} '' + mkdir -p $out/c + echo a >$out/a + chmod a+x $out/a + echo b >$out/b + echo d >$out/c/d + ''; + actual = runCommand "actual" {} '' + mkdir -p $out/c + echo a >$out/a + echo b >$out/b + chmod a+x $out/b + echo d >$out/c/d + ''; + }); + } '' + ( + set -x + grep -F -- "executable bits don't match" $log/testBuildFailure.log + grep -E -- '+.*-actual/a' $log/testBuildFailure.log + grep -E -- '-.*-actual/b' $log/testBuildFailure.log + grep -F -- "--- actual-executables" $log/testBuildFailure.log + grep -F -- "+++ expected-executables" $log/testBuildFailure.log + ) || { + echo "Test failed: could not find pattern in build log $log" + exit 1 + } + echo 'All good.' + touch $out + ''; + + fileDiff = + runCommand "testEqualContents-fileDiff" { + log = testers.testBuildFailure (testers.testEqualContents { + assertion = "The same directory contents at different paths are recognized as equal"; + expected = runCommand "expected" {} '' + mkdir -p $out/c + echo a >$out/a + echo b >$out/b + echo d >$out/c/d + ''; + actual = runCommand "actual" {} '' + mkdir -p $out/c + echo a >$out/a + echo B >$out/b + echo d >$out/c/d + ''; + }); + } '' + ( + set -x + grep -F -- "Contents must be equal but were not" $log/testBuildFailure.log + grep -E -- '+++ .*-actual/b' $log/testBuildFailure.log + grep -E -- '--- .*-actual/b' $log/testBuildFailure.log + grep -F -- "-B" $log/testBuildFailure.log + grep -F -- "+b" $log/testBuildFailure.log + ) || { + echo "Test failed: could not find pattern in build log $log" + exit 1 + } + echo 'All good.' + touch $out + ''; + + fileMissing = + runCommand "testEqualContents-fileMissing" { + log = testers.testBuildFailure (testers.testEqualContents { + assertion = "The same directory contents at different paths are recognized as equal"; + expected = runCommand "expected" {} '' + mkdir -p $out/c + echo a >$out/a + echo b >$out/b + echo d >$out/c/d + ''; + actual = runCommand "actual" {} '' + mkdir -p $out/c + echo a >$out/a + echo d >$out/c/d + ''; + }); + } '' + ( + set -x + grep -F -- "Contents must be equal but were not" $log/testBuildFailure.log + grep -E -- 'Only in .*-expected: b' $log/testBuildFailure.log + ) || { + echo "Test failed: could not find pattern in build log $log" + exit 1 + } + echo 'All good.' + touch $out + ''; + }; +} diff --git a/pkgs/build-support/testers/testMetaPkgConfig/tester.nix b/pkgs/build-support/testers/testMetaPkgConfig/tester.nix new file mode 100644 index 0000000..7892a29 --- /dev/null +++ b/pkgs/build-support/testers/testMetaPkgConfig/tester.nix @@ -0,0 +1,12 @@ +{ lib, runCommand, testers }: + +package: + +runCommand "check-meta-pkg-config-modules-for-${package.name}" { + meta = { + description = "Test whether ${package.name} exposes all pkg-config modules ${toString package.meta.pkgConfigModules}"; + }; + dependsOn = testers.hasPkgConfigModules { inherit package; }; +} '' + echo "found all of ${toString package.meta.pkgConfigModules}" > "$out" +'' diff --git a/pkgs/build-support/trivial-builders/default.nix b/pkgs/build-support/trivial-builders/default.nix new file mode 100644 index 0000000..1625b0c --- /dev/null +++ b/pkgs/build-support/trivial-builders/default.nix @@ -0,0 +1,899 @@ +{ lib, config, stdenv, stdenvNoCC, jq, lndir, runtimeShell, shellcheck-minimal }: + +let + inherit (lib) + optionalAttrs + warn + ; +in + +rec { + + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-runCommand + runCommand = name: env: runCommandWith { + stdenv = stdenvNoCC; + runLocal = false; + inherit name; + derivationArgs = env; + }; + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-runCommandLocal + runCommandLocal = name: env: runCommandWith { + stdenv = stdenvNoCC; + runLocal = true; + inherit name; + derivationArgs = env; + }; + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-runCommandCC + runCommandCC = name: env: runCommandWith { + stdenv = stdenv; + runLocal = false; + inherit name; + derivationArgs = env; + }; + # `runCommandCCLocal` left out on purpose. + # We shouldn’t force the user to have a cc in scope. + + # TODO: Move documentation for runCommandWith to the Nixpkgs manual + /* + Generalized version of the `runCommand`-variants + which does customized behavior via a single + attribute set passed as the first argument + instead of having a lot of variants like + `runCommand*`. Additionally it allows changing + the used `stdenv` freely and has a more explicit + approach to changing the arguments passed to + `stdenv.mkDerivation`. + */ + runCommandWith = + let + # prevent infinite recursion for the default stdenv value + defaultStdenv = stdenv; + in + { + # which stdenv to use, defaults to a stdenv with a C compiler, pkgs.stdenv + stdenv ? defaultStdenv + # whether to build this derivation locally instead of substituting + , runLocal ? false + # extra arguments to pass to stdenv.mkDerivation + , derivationArgs ? { } + # name of the resulting derivation + , name + # TODO(@Artturin): enable strictDeps always + }: buildCommand: + stdenv.mkDerivation ({ + enableParallelBuilding = true; + inherit buildCommand name; + passAsFile = [ "buildCommand" ] + ++ (derivationArgs.passAsFile or [ ]); + } + // lib.optionalAttrs (! derivationArgs?meta) { + pos = let args = builtins.attrNames derivationArgs; in + if builtins.length args > 0 + then builtins.unsafeGetAttrPos (builtins.head args) derivationArgs + else null; + } + // (lib.optionalAttrs runLocal { + preferLocalBuild = true; + allowSubstitutes = false; + }) + // builtins.removeAttrs derivationArgs [ "passAsFile" ]); + + + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-writeTextFile + writeTextFile = + { name + , text + , executable ? false + , destination ? "" + , checkPhase ? "" + , meta ? { } + , allowSubstitutes ? false + , preferLocalBuild ? true + , derivationArgs ? { } + }: + let + matches = builtins.match "/bin/([^/]+)" destination; + in + runCommand name + ({ + inherit text executable checkPhase allowSubstitutes preferLocalBuild; + passAsFile = [ "text" ] + ++ derivationArgs.passAsFile or [ ]; + meta = lib.optionalAttrs (executable && matches != null) + { + mainProgram = lib.head matches; + } // meta // derivationArgs.meta or {}; + } // removeAttrs derivationArgs [ "passAsFile" "meta" ]) + '' + target=$out${lib.escapeShellArg destination} + mkdir -p "$(dirname "$target")" + + if [ -e "$textPath" ]; then + mv "$textPath" "$target" + else + echo -n "$text" > "$target" + fi + + if [ -n "$executable" ]; then + chmod +x "$target" + fi + + eval "$checkPhase" + ''; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeText = name: text: writeTextFile { inherit name text; }; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeTextDir = path: text: writeTextFile { + inherit text; + name = builtins.baseNameOf path; + destination = "/${path}"; + }; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeScript = name: text: writeTextFile { inherit name text; executable = true; }; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeScriptBin = name: text: writeTextFile { + inherit name text; + executable = true; + destination = "/bin/${name}"; + }; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeShellScript = name: text: + writeTextFile { + inherit name; + executable = true; + text = '' + #!${runtimeShell} + ${text} + ''; + checkPhase = '' + ${stdenv.shellDryRun} "$target" + ''; + }; + + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-text-writing + writeShellScriptBin = name: text: + writeTextFile { + inherit name; + executable = true; + destination = "/bin/${name}"; + text = '' + #!${runtimeShell} + ${text} + ''; + checkPhase = '' + ${stdenv.shellDryRun} "$target" + ''; + meta.mainProgram = name; + }; + + # TODO: move parameter documentation to the Nixpkgs manual + # See doc/build-helpers/trivial-build-helpers.chapter.md + # or https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-writeShellApplication + writeShellApplication = + { + /* + The name of the script to write. + + Type: String + */ + name, + /* + The shell script's text, not including a shebang. + + Type: String + */ + text, + /* + Inputs to add to the shell script's `$PATH` at runtime. + + Type: [String|Derivation] + */ + runtimeInputs ? [ ], + /* + Extra environment variables to set at runtime. + + Type: AttrSet + */ + runtimeEnv ? null, + /* + `stdenv.mkDerivation`'s `meta` argument. + + Type: AttrSet + */ + meta ? { }, + /* + The `checkPhase` to run. Defaults to `shellcheck` on supported + platforms and `bash -n`. + + The script path will be given as `$target` in the `checkPhase`. + + Type: String + */ + checkPhase ? null, + /* + Checks to exclude when running `shellcheck`, e.g. `[ "SC2016" ]`. + + See for a list of checks. + + Type: [String] + */ + excludeShellChecks ? [ ], + /* + Extra command-line flags to pass to ShellCheck. + + Type: [String] + */ + extraShellCheckFlags ? [ ], + /* + Bash options to activate with `set -o` at the start of the script. + + Defaults to `[ "errexit" "nounset" "pipefail" ]`. + + Type: [String] + */ + bashOptions ? [ "errexit" "nounset" "pipefail" ], + /* Extra arguments to pass to `stdenv.mkDerivation`. + + :::{.caution} + Certain derivation attributes are used internally, + overriding those could cause problems. + ::: + + Type: AttrSet + */ + derivationArgs ? { }, + }: + writeTextFile { + inherit name meta derivationArgs; + executable = true; + destination = "/bin/${name}"; + allowSubstitutes = true; + preferLocalBuild = false; + text = '' + #!${runtimeShell} + ${lib.concatMapStringsSep "\n" (option: "set -o ${option}") bashOptions} + '' + lib.optionalString (runtimeEnv != null) + (lib.concatStrings + (lib.mapAttrsToList + (name: value: '' + ${lib.toShellVar name value} + export ${name} + '') + runtimeEnv)) + + lib.optionalString (runtimeInputs != [ ]) '' + + export PATH="${lib.makeBinPath runtimeInputs}:$PATH" + '' + '' + + ${text} + ''; + + checkPhase = + # GHC (=> shellcheck) isn't supported on some platforms (such as risc-v) + # but we still want to use writeShellApplication on those platforms + let + shellcheckSupported = lib.meta.availableOn stdenv.buildPlatform shellcheck-minimal.compiler; + excludeFlags = lib.optionals (excludeShellChecks != [ ]) [ "--exclude" (lib.concatStringsSep "," excludeShellChecks) ]; + shellcheckCommand = lib.optionalString shellcheckSupported '' + # use shellcheck which does not include docs + # pandoc takes long to build and documentation isn't needed for just running the cli + ${lib.getExe shellcheck-minimal} ${lib.escapeShellArgs (excludeFlags ++ extraShellCheckFlags)} "$target" + ''; + in + if checkPhase == null then '' + runHook preCheck + ${stdenv.shellDryRun} "$target" + ${shellcheckCommand} + runHook postCheck + '' + else checkPhase; + }; + + # Create a C binary + # TODO: add to writers? pkgs/build-support/writers + writeCBin = pname: code: + runCommandCC pname + { + inherit pname code; + executable = true; + passAsFile = [ "code" ]; + # Pointless to do this on a remote machine. + preferLocalBuild = true; + allowSubstitutes = false; + meta = { + mainProgram = pname; + }; + } + '' + n=$out/bin/${pname} + mkdir -p "$(dirname "$n")" + mv "$codePath" code.c + $CC -x c code.c -o "$n" + ''; + + # TODO: deduplicate with documentation in doc/build-helpers/trivial-build-helpers.chapter.md + # see also https://github.com/NixOS/nixpkgs/pull/249721 + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-concatText + /* concat a list of files to the nix store. + The contents of files are added to the file in the store. + + Example: + + + # Writes my-file to /nix/store/ + concatTextFile { + name = "my-file"; + files = [ drv1 "${drv2}/path/to/file" ]; + } + + + See also the `concatText` helper function below. + + + # Writes executable my-file to /nix/store//bin/my-file + concatTextFile { + name = "my-file"; + files = [ drv1 "${drv2}/path/to/file" ]; + executable = true; + destination = "/bin/my-file"; + } + + + */ + concatTextFile = + { name # the name of the derivation + , files + , executable ? false # run chmod +x ? + , destination ? "" # relative path appended to $out eg "/bin/foo" + , checkPhase ? "" # syntax checks, e.g. for scripts + , meta ? { } + }: + runCommandLocal name + { inherit files executable checkPhase meta destination; } + '' + file=$out$destination + mkdir -p "$(dirname "$file")" + cat $files > "$file" + + if [ -n "$executable" ]; then + chmod +x "$file" + fi + + eval "$checkPhase" + ''; + + # TODO: deduplicate with documentation in doc/build-helpers/trivial-build-helpers.chapter.md + # see also https://github.com/NixOS/nixpkgs/pull/249721 + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-concatText + /* + Writes a text file to nix store with no optional parameters available. + + Example: + + + # Writes contents of files to /nix/store/ + concatText "my-file" [ file1 file2 ] + + + */ + concatText = name: files: concatTextFile { inherit name files; }; + + # TODO: deduplicate with documentation in doc/build-helpers/trivial-build-helpers.chapter.md + # see also https://github.com/NixOS/nixpkgs/pull/249721 + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-concatText + /* + Writes a text file to nix store with and mark it as executable. + + Example: + # Writes contents of files to /nix/store/ + concatScript "my-file" [ file1 file2 ] + + */ + concatScript = name: files: concatTextFile { inherit name files; executable = true; }; + + + /* + TODO: Deduplicate this documentation. + More docs in doc/build-helpers/trivial-build-helpers.chapter.md + See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-symlinkJoin + + Create a forest of symlinks to the files in `paths`. + + This creates a single derivation that replicates the directory structure + of all the input paths. + + BEWARE: it may not "work right" when the passed paths contain symlinks to directories. + + Example: + + + # adds symlinks of hello to current build. + symlinkJoin { name = "myhello"; paths = [ pkgs.hello ]; } + + + + + # adds symlinks of hello and stack to current build and prints "links added" + symlinkJoin { name = "myexample"; paths = [ pkgs.hello pkgs.stack ]; postBuild = "echo links added"; } + + + This creates a derivation with a directory structure like the following: + + + /nix/store/sglsr5g079a5235hy29da3mq3hv8sjmm-myexample + |-- bin + | |-- hello -> /nix/store/qy93dp4a3rqyn2mz63fbxjg228hffwyw-hello-2.10/bin/hello + | `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/bin/stack + `-- share + |-- bash-completion + | `-- completions + | `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/bash-completion/completions/stack + |-- fish + | `-- vendor_completions.d + | `-- stack.fish -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/fish/vendor_completions.d/stack.fish + ... + + + symlinkJoin and linkFarm are similar functions, but they output + derivations with different structure. + + symlinkJoin is used to create a derivation with a familiar directory + structure (top-level bin/, share/, etc), but with all actual files being symlinks to + the files in the input derivations. + + symlinkJoin is used many places in nixpkgs to create a single derivation + that appears to contain binaries, libraries, documentation, etc from + multiple input derivations. + + linkFarm is instead used to create a simple derivation with symlinks to + other derivations. A derivation created with linkFarm is often used in CI + as a easy way to build multiple derivations at once. + */ + symlinkJoin = + args_@{ name + , paths + , preferLocalBuild ? true + , allowSubstitutes ? false + , postBuild ? "" + , ... + }: + let + args = removeAttrs args_ [ "name" "postBuild" ] + // { + inherit preferLocalBuild allowSubstitutes; + passAsFile = [ "paths" ]; + }; # pass the defaults + in + runCommand name args + '' + mkdir -p $out + for i in $(cat $pathsPath); do + ${lndir}/bin/lndir -silent $i $out + done + ${postBuild} + ''; + + # TODO: move linkFarm docs to the Nixpkgs manual + /* + Quickly create a set of symlinks to derivations. + + This creates a simple derivation with symlinks to all inputs. + + entries can be a list of attribute sets like + + [ { name = "name" ; path = "/nix/store/..."; } ] + + + or an attribute set name -> path like: + + { name = "/nix/store/..."; other = "/nix/store/..."; } + + + Example: + + # Symlinks hello and stack paths in store to current $out/hello-test and + # $out/foobar. + linkFarm "myexample" [ { name = "hello-test"; path = pkgs.hello; } { name = "foobar"; path = pkgs.stack; } ] + + This creates a derivation with a directory structure like the following: + + /nix/store/qc5728m4sa344mbks99r3q05mymwm4rw-myexample + |-- foobar -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1 + `-- hello-test -> /nix/store/qy93dp4a3rqyn2mz63fbxjg228hffwyw-hello-2.10 + + + See the note on symlinkJoin for the difference between linkFarm and symlinkJoin. + */ + linkFarm = name: entries: + let + entries' = + if (lib.isAttrs entries) then entries + # We do this foldl to have last-wins semantics in case of repeated entries + else if (lib.isList entries) then lib.foldl (a: b: a // { "${b.name}" = b.path; }) { } entries + else throw "linkFarm entries must be either attrs or a list!"; + + linkCommands = lib.mapAttrsToList + (name: path: '' + mkdir -p "$(dirname ${lib.escapeShellArg "${name}"})" + ln -s ${lib.escapeShellArg "${path}"} ${lib.escapeShellArg "${name}"} + '') + entries'; + in + runCommand name + { + preferLocalBuild = true; + allowSubstitutes = false; + passthru.entries = entries'; + } '' + mkdir -p $out + cd $out + ${lib.concatStrings linkCommands} + ''; + + # TODO: move linkFarmFromDrvs docs to the Nixpkgs manual + /* + Easily create a linkFarm from a set of derivations. + + This calls linkFarm with a list of entries created from the list of input + derivations. It turns each input derivation into an attribute set + like { name = drv.name ; path = drv }, and passes this to linkFarm. + + Example: + + # Symlinks the hello, gcc, and ghc derivations in $out + linkFarmFromDrvs "myexample" [ pkgs.hello pkgs.gcc pkgs.ghc ] + + This creates a derivation with a directory structure like the following: + + + /nix/store/m3s6wkjy9c3wy830201bqsb91nk2yj8c-myexample + |-- gcc-wrapper-9.2.0 -> /nix/store/fqhjxf9ii4w4gqcsx59fyw2vvj91486a-gcc-wrapper-9.2.0 + |-- ghc-8.6.5 -> /nix/store/gnf3s07bglhbbk4y6m76sbh42siym0s6-ghc-8.6.5 + `-- hello-2.10 -> /nix/store/k0ll91c4npk4lg8lqhx00glg2m735g74-hello-2.10 + + */ + linkFarmFromDrvs = name: drvs: + let mkEntryFromDrv = drv: { name = drv.name; path = drv; }; + in linkFarm name (map mkEntryFromDrv drvs); + + # TODO: move onlyBin docs to the Nixpkgs manual + /* + Produce a derivation that links to the target derivation's `/bin`, + and *only* `/bin`. + + This is useful when your favourite package doesn't have a separate + bin output and other contents of the package's output (e.g. setup + hooks) cause trouble when used in your environment. + */ + onlyBin = drv: runCommand "${drv.name}-only-bin" { } '' + mkdir -p $out + ln -s ${lib.getBin drv}/bin $out/bin + ''; + + + # Docs in doc/builders/special/makesetuphook.section.md + # See https://nixos.org/manual/nixpkgs/unstable/#sec-pkgs.makeSetupHook + makeSetupHook = + { name ? lib.warn "calling makeSetupHook without passing a name is deprecated." "hook" + , deps ? [ ] + # hooks go in nativeBuildInput so these will be nativeBuildInput + , propagatedBuildInputs ? [ ] + # these will be buildInputs + , depsTargetTargetPropagated ? [ ] + , meta ? { } + , passthru ? { } + , substitutions ? { } + }: + script: + runCommand name + (substitutions // { + # TODO(@Artturin:) substitutions should be inside the env attrset + # but users are likely passing non-substitution arguments through substitutions + # turn off __structuredAttrs to unbreak substituteAll + __structuredAttrs = false; + inherit meta; + inherit depsTargetTargetPropagated; + propagatedBuildInputs = + # remove list conditionals before 23.11 + lib.warnIf (!lib.isList deps) "'deps' argument to makeSetupHook must be a list. content of deps: ${toString deps}" + (lib.warnIf (deps != [ ]) "'deps' argument to makeSetupHook is deprecated and will be removed in release 23.11., Please use propagatedBuildInputs instead. content of deps: ${toString deps}" + propagatedBuildInputs ++ (if lib.isList deps then deps else [ deps ])); + strictDeps = true; + # TODO 2023-01, no backport: simplify to inherit passthru; + passthru = passthru + // optionalAttrs (substitutions?passthru) + (warn "makeSetupHook (name = ${lib.strings.escapeNixString name}): `substitutions.passthru` is deprecated. Please set `passthru` directly." + substitutions.passthru); + }) + ('' + mkdir -p $out/nix-support + cp ${script} $out/nix-support/setup-hook + recordPropagatedDependencies + '' + lib.optionalString (substitutions != { }) '' + substituteAll ${script} $out/nix-support/setup-hook + ''); + + + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-writeReferencesToFile + # TODO: Convert to throw after Nixpkgs 24.05 branch-off. + writeReferencesToFile = (if config.allowAliases then lib.warn else throw) + "writeReferencesToFile is deprecated in favour of writeClosure" + (path: writeClosure [ path ]); + + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-writeClosure + writeClosure = paths: runCommand "runtime-deps" + { + # Get the cleaner exportReferencesGraph interface + __structuredAttrs = true; + exportReferencesGraph.graph = paths; + nativeBuildInputs = [ jq ]; + } + '' + jq -r ".graph | map(.path) | sort | .[]" "$NIX_ATTRS_JSON_FILE" > "$out" + ''; + + # Docs in doc/build-helpers/trivial-build-helpers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-writeDirectReferencesToFile + writeDirectReferencesToFile = path: runCommand "runtime-references" + { + exportReferencesGraph = [ "graph" path ]; + inherit path; + } + '' + touch ./references + while read p; do + read dummy + read nrRefs + if [[ $p == $path ]]; then + for ((i = 0; i < nrRefs; i++)); do + read ref; + echo $ref >>./references + done + else + for ((i = 0; i < nrRefs; i++)); do + read ref; + done + fi + done < graph + sort ./references >$out + ''; + + # TODO: move writeStringReferencesToFile docs to the Nixpkgs manual + /* + Extract a string's references to derivations and paths (its + context) and write them to a text file, removing the input string + itself from the dependency graph. This is useful when you want to + make a derivation depend on the string's references, but not its + contents (to avoid unnecessary rebuilds, for example). + + Note that this only works as intended on Nix >= 2.3. + */ + writeStringReferencesToFile = string: + /* + The basic operation this performs is to copy the string context + from `string` to a second string and wrap that string in a + derivation. However, that alone is not enough, since nothing in the + string refers to the output paths of the derivations/paths in its + context, meaning they'll be considered build-time dependencies and + removed from the wrapper derivation's closure. Putting the + necessary output paths in the new string is however not very + straightforward - the attrset returned by `getContext` contains + only references to derivations' .drv-paths, not their output + paths. In order to "convert" them, we try to extract the + corresponding paths from the original string using regex. + */ + let + # Taken from https://github.com/NixOS/nix/blob/130284b8508dad3c70e8160b15f3d62042fc730a/src/libutil/hash.cc#L84 + nixHashChars = "0123456789abcdfghijklmnpqrsvwxyz"; + context = builtins.getContext string; + derivations = lib.filterAttrs (n: v: v ? outputs) context; + # Objects copied from outside of the store, such as paths and + # `builtins.fetch*`ed ones + sources = lib.attrNames (lib.filterAttrs (n: v: v ? path) context); + packages = + lib.mapAttrs' + (name: value: + { + inherit value; + name = lib.head (builtins.match "${builtins.storeDir}/[${nixHashChars}]+-(.*)\.drv" name); + }) + derivations; + # The syntax of output paths differs between outputs named `out` + # and other, explicitly named ones. For explicitly named ones, + # the output name is suffixed as `-name`, but `out` outputs + # aren't suffixed at all, and thus aren't easily distinguished + # from named output paths. Therefore, we find all the named ones + # first so we can use them to remove false matches when looking + # for `out` outputs (see the definition of `outputPaths`). + namedOutputPaths = + lib.flatten + (lib.mapAttrsToList + (name: value: + (map + (output: + lib.filter + lib.isList + (builtins.split "(${builtins.storeDir}/[${nixHashChars}]+-${name}-${output})" string)) + (lib.remove "out" value.outputs))) + packages); + # Only `out` outputs + outputPaths = + lib.flatten + (lib.mapAttrsToList + (name: value: + if lib.elem "out" value.outputs then + lib.filter + (x: lib.isList x && + # If the matched path is in `namedOutputPaths`, + # it's a partial match of an output path where + # the output name isn't `out` + lib.all (o: !lib.hasPrefix (lib.head x) o) namedOutputPaths) + (builtins.split "(${builtins.storeDir}/[${nixHashChars}]+-${name})" string) + else + [ ]) + packages); + allPaths = lib.concatStringsSep "\n" (lib.unique (sources ++ namedOutputPaths ++ outputPaths)); + allPathsWithContext = builtins.appendContext allPaths context; + in + if builtins ? getContext then + writeText "string-references" allPathsWithContext + else + writeDirectReferencesToFile (writeText "string-file" string); + + + # Docs in doc/build-helpers/fetchers.chapter.md + # See https://nixos.org/manual/nixpkgs/unstable/#requirefile + requireFile = + { name ? null + , sha256 ? null + , sha1 ? null + , hash ? null + , url ? null + , message ? null + , hashMode ? "flat" + }: + assert (message != null) || (url != null); + assert (sha256 != null) || (sha1 != null) || (hash != null); + assert (name != null) || (url != null); + let + msg = + if message != null then message + else '' + Unfortunately, we cannot download file ${name_} automatically. + Please go to ${url} to download it yourself, and add it to the Nix store + using either + nix-store --add-fixed ${hashAlgo} ${name_} + or + nix-prefetch-url --type ${hashAlgo} file:///path/to/${name_} + ''; + hashAlgo = + if hash != null then (builtins.head (lib.strings.splitString "-" hash)) + else if sha256 != null then "sha256" + else "sha1"; + hashAlgo_ = if hash != null then "" else hashAlgo; + hash_ = + if hash != null then hash + else if sha256 != null then sha256 + else sha1; + name_ = if name == null then baseNameOf (toString url) else name; + in + stdenvNoCC.mkDerivation { + name = name_; + outputHashMode = hashMode; + outputHashAlgo = hashAlgo_; + outputHash = hash_; + preferLocalBuild = true; + allowSubstitutes = false; + builder = writeScript "restrict-message" '' + source ${stdenvNoCC}/setup + cat <<_EOF_ + + *** + ${msg} + *** + + _EOF_ + exit 1 + ''; + }; + + + # TODO: move copyPathToStore docs to the Nixpkgs manual + /* + Copy a path to the Nix store. + Nix automatically copies files to the store before stringifying paths. + If you need the store path of a file, ${copyPathToStore } can be + shortened to ${}. + */ + copyPathToStore = builtins.filterSource (p: t: true); + + + # TODO: move copyPathsToStore docs to the Nixpkgs manual + /* + Copy a list of paths to the Nix store. + */ + copyPathsToStore = builtins.map copyPathToStore; + + # TODO: move applyPatches docs to the Nixpkgs manual + /* Applies a list of patches to a source directory. + + Example: + + # Patching nixpkgs: + + applyPatches { + src = pkgs.path; + patches = [ + (pkgs.fetchpatch { + url = "https://github.com/NixOS/nixpkgs/commit/1f770d20550a413e508e081ddc08464e9d08ba3d.patch"; + sha256 = "1nlzx171y3r3jbk0qhvnl711kmdk57jlq4na8f8bs8wz2pbffymr"; + }) + ]; + } + + */ + applyPatches = + { src + , name ? (if builtins.typeOf src == "path" + then builtins.baseNameOf src + else + if builtins.isAttrs src && builtins.hasAttr "name" src + then src.name + else throw "applyPatches: please supply a `name` argument because a default name can only be computed when the `src` is a path or is an attribute set with a `name` attribute." + ) + "-patched" + , patches ? [ ] + , prePatch ? "" + , postPatch ? "" + , ... + }@args: + if patches == [ ] && prePatch == "" && postPatch == "" + then src # nothing to do, so use original src to avoid additional drv + else stdenvNoCC.mkDerivation + ({ + inherit name src patches prePatch postPatch; + preferLocalBuild = true; + allowSubstitutes = false; + phases = "unpackPhase patchPhase installPhase"; + installPhase = "cp -R ./ $out"; + } + # Carry `meta` information from the underlying `src` if present. + // (optionalAttrs (src?meta) { inherit (src) meta; }) + // (removeAttrs args [ "src" "name" "patches" "prePatch" "postPatch" ])); + + # TODO: move docs to Nixpkgs manual + /* An immutable file in the store with a length of 0 bytes. */ + emptyFile = runCommand "empty-file" + { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "0ip26j2h11n1kgkz36rl4akv694yz65hr72q4kv4b3lxcbi65b3p"; + preferLocalBuild = true; + } "touch $out"; + + # TODO: move docs to Nixpkgs manual + /* An immutable empty directory in the store. */ + emptyDirectory = runCommand "empty-directory" + { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "0sjjj9z1dhilhpc8pq4154czrb79z9cm044jvn75kxcjv6v5l2m5"; + preferLocalBuild = true; + } "mkdir $out"; +} diff --git a/pkgs/build-support/trivial-builders/test-overriding.nix b/pkgs/build-support/trivial-builders/test-overriding.nix new file mode 100644 index 0000000..a16bbbe --- /dev/null +++ b/pkgs/build-support/trivial-builders/test-overriding.nix @@ -0,0 +1,110 @@ +# Check that overriding works for trivial-builders like +# `writeShellScript` via `overrideAttrs`. This is useful +# to override the `checkPhase`, e. g. if you want +# to disable extglob in `writeShellScript`. +# +# Run using `nix-build -A tests.trivial-builders.overriding`. +{ lib +, stdenv +, runtimeShell +, runCommand +, callPackage +, writeShellScript +, writeTextFile +, writeShellScriptBin +}: + +let + extglobScript = '' + shopt -s extglob + touch success + echo @(success|failure) + rm success + ''; + + simpleCase = case: + writeShellScript "test-trivial-overriding-${case}" extglobScript; + + callPackageCase = case: callPackage ( + { writeShellScript }: + writeShellScript "test-trivial-callpackage-overriding-${case}" extglobScript + ) { }; + + binCase = case: + writeShellScriptBin "test-trivial-overriding-bin-${case}" extglobScript; + + # building this derivation would fail without overriding + textFileCase = writeTextFile { + name = "test-trivial-overriding-text-file"; + checkPhase = "false"; + text = '' + #!${runtimeShell} + echo success + ''; + executable = true; + }; + + disallowExtglob = x: x.overrideAttrs (_: { + checkPhase = '' + ${stdenv.shell} -n "$target" + ''; + }); + + # Run old checkPhase, but only succeed if it fails. + # This HACK is required because we can't introspect build failures + # in nix: With `assertFail` we want to make sure that the default + # `checkPhase` would fail if extglob was used in the script. + assertFail = x: x.overrideAttrs (old: { + checkPhase = '' + if + ${old.checkPhase} + then exit 1; fi + ''; + }); + + mkCase = case: outcome: isBin: + let + drv = lib.pipe outcome ([ case ] ++ lib.optionals (outcome == "fail") [ disallowExtglob assertFail ]); + in if isBin then "${drv}/bin/${drv.name}" else drv; + + writeTextOverrides = { + # Make sure extglob works by default + simpleSucc = mkCase simpleCase "succ" false; + # Ensure it's possible to fail; in this case extglob is not enabled + simpleFail = mkCase simpleCase "fail" false; + # Do the same checks after wrapping with callPackage + # to make sure callPackage doesn't mess with the override + callpSucc = mkCase callPackageCase "succ" false; + callpFail = mkCase callPackageCase "fail" false; + # Do the same check using `writeShellScriptBin` + binSucc = mkCase binCase "succ" true; + binFail = mkCase binCase "fail" true; + # Check that we can also override plain writeTextFile + textFileSuccess = textFileCase.overrideAttrs (_: { + checkPhase = "true"; + }); + }; + + # `runTest` forces nix to build the script of our test case and + # run its `checkPhase` which is our main interest. Additionally + # it executes the script and thus makes sure that extglob also + # works at run time. + runTest = script: + let + name = script.name or (builtins.baseNameOf script); + in writeShellScript "run-${name}" '' + if [ "$(${script})" != "success" ]; then + echo "Failed in ${name}" + exit 1 + fi + ''; +in + +runCommand "test-writeShellScript-overriding" { + passthru = { inherit writeTextOverrides; }; +} '' + ${lib.concatMapStrings (test: '' + ${runTest test} + '') (lib.attrValues writeTextOverrides)} + touch "$out" +'' diff --git a/pkgs/build-support/trivial-builders/test/concat-test.nix b/pkgs/build-support/trivial-builders/test/concat-test.nix new file mode 100644 index 0000000..5ce4356 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/concat-test.nix @@ -0,0 +1,12 @@ +{ callPackage, lib, pkgs, runCommand, concatText, writeText, hello, emptyFile }: +let + stri = writeText "pathToTest"; + txt1 = stri "abc"; + txt2 = stri hello; + res = concatText "textToTest" [ txt1 txt2 ]; +in +runCommand "test-concatPaths" { } '' + diff -U3 <(cat ${txt1} ${txt2}) ${res} + diff -U3 ${concatText "void" []} ${emptyFile} + touch $out +'' diff --git a/pkgs/build-support/trivial-builders/test/default.nix b/pkgs/build-support/trivial-builders/test/default.nix new file mode 100644 index 0000000..e1ed0be --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/default.nix @@ -0,0 +1,36 @@ +/* + Run all tests with: + + cd nixpkgs + nix-build -A tests.trivial-builders + + or run a specific test with: + + cd nixpkgs + nix-build -A tests.trivial-builders.foo + +*/ + +{ callPackage, lib, stdenv }: +let + inherit (lib) recurseIntoAttrs; + references = callPackage ./references {}; +in +recurseIntoAttrs { + concat = callPackage ./concat-test.nix {}; + linkFarm = callPackage ./link-farm.nix {}; + overriding = callPackage ../test-overriding.nix {}; + inherit references; + writeCBin = callPackage ./writeCBin.nix {}; + writeClosure-union = callPackage ./writeClosure-union.nix { + inherit (references) samples; + }; + writeShellApplication = callPackage ./writeShellApplication.nix {}; + writeScriptBin = callPackage ./writeScriptBin.nix {}; + writeShellScript = callPackage ./write-shell-script.nix {}; + writeShellScriptBin = callPackage ./writeShellScriptBin.nix {}; + writeStringReferencesToFile = callPackage ./writeStringReferencesToFile.nix { + inherit (references) samples; + }; + writeTextFile = callPackage ./write-text-file.nix {}; +} diff --git a/pkgs/build-support/trivial-builders/test/link-farm.nix b/pkgs/build-support/trivial-builders/test/link-farm.nix new file mode 100644 index 0000000..1ebfc70 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/link-farm.nix @@ -0,0 +1,45 @@ +{ linkFarm, hello, writeTextFile, runCommand }: +let + foo = writeTextFile { + name = "foo"; + text = "foo"; + }; + + linkFarmFromList = linkFarm "linkFarmFromList" [ + { name = "foo"; path = foo; } + { name = "hello"; path = hello; } + ]; + + linkFarmWithRepeats = linkFarm "linkFarmWithRepeats" [ + { name = "foo"; path = foo; } + { name = "hello"; path = hello; } + { name = "foo"; path = hello; } + ]; + + linkFarmFromAttrs = linkFarm "linkFarmFromAttrs" { + inherit foo hello; + }; +in +runCommand "test-linkFarm" { } '' + function assertPathEquals() { + local a b; + a="$(realpath "$1")" + b="$(realpath "$2")" + if [ "$a" != "$b" ]; then + echo "path mismatch!" + echo "a: $1 -> $a" + echo "b: $2 -> $b" + exit 1 + fi + } + + assertPathEquals "${linkFarmFromList}/foo" "${foo}" + assertPathEquals "${linkFarmFromList}/hello" "${hello}" + + assertPathEquals "${linkFarmWithRepeats}/foo" "${hello}" + assertPathEquals "${linkFarmWithRepeats}/hello" "${hello}" + + assertPathEquals "${linkFarmFromAttrs}/foo" "${foo}" + assertPathEquals "${linkFarmFromAttrs}/hello" "${hello}" + touch $out +'' diff --git a/pkgs/build-support/trivial-builders/test/references/default.nix b/pkgs/build-support/trivial-builders/test/references/default.nix new file mode 100644 index 0000000..928cc1d --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/default.nix @@ -0,0 +1,128 @@ +{ lib +, stdenvNoCC +, testers +, callPackage +, writeText + # nativeBuildInputs +, shellcheck-minimal + # Samples +, samples ? cleanSamples (callPackage ./samples.nix { }) + # Filter out the non-string-like attributes such as .override added by + # callPackage. +, cleanSamples ? lib.filterAttrs (n: lib.isStringLike) + # Test targets +, writeDirectReferencesToFile +, writeClosure +}: + +# -------------------------------------------------------------------------- # +# +# trivial-builders test +# +# -------------------------------------------------------------------------- # +# +# Execute this build script directly (quick): +# +# * Classic +# $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test +# +# * Flake-based +# $ nix run .#tests.trivial-builders.references.testScriptBin +# +# or in the build sandbox with a ~20s VM overhead: +# +# * Classic +# $ nix-build --no-out-link -A tests.trivial-builders.references +# +# * Flake-based +# $ nix build -L --no-link .#tests.trivial-builders.references +# +# -------------------------------------------------------------------------- # + +let + # Map each attribute to an element specification of Bash associative arrary + # and concatenate them with white spaces, to be used to define a + # one-line Bash associative array. + samplesToString = attrs: + lib.concatMapStringsSep " " (name: "[${name}]=${lib.escapeShellArg "${attrs.${name}}"}") (builtins.attrNames attrs); + + closures = lib.mapAttrs (n: v: writeClosure [ v ]) samples; + directReferences = lib.mapAttrs (n: v: writeDirectReferencesToFile v) samples; + collectiveClosure = writeClosure (lib.attrValues samples); + + testScriptBin = stdenvNoCC.mkDerivation (finalAttrs: { + name = "references-test"; + + src = ./references-test.sh; + dontUnpack = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + mkdir -p "$out/bin" + substitute "$src" "$out/bin/${finalAttrs.meta.mainProgram}" \ + --replace "@SAMPLES@" ${lib.escapeShellArg (samplesToString samples)} \ + --replace "@CLOSURES@" ${lib.escapeShellArg (samplesToString closures)} \ + --replace "@DIRECT_REFS@" ${lib.escapeShellArg (samplesToString directReferences)} \ + --replace "@COLLECTIVE_CLOSURE@" ${lib.escapeShellArg collectiveClosure} + runHook postInstall + chmod +x "$out/bin/${finalAttrs.meta.mainProgram}" + ''; + + doInstallCheck = true; + nativeInstallCheckInputs = [ + shellcheck-minimal + ]; + installCheckPhase = '' + runHook preInstallCheck + shellcheck "$out/bin/${finalAttrs.meta.mainProgram}" + runHook postInstallCheck + ''; + + passthru = { + inherit + collectiveClosure + directReferences + closures + samples + ; + }; + + meta = with lib; { + mainProgram = "references-test"; + }; + }); +in +testers.nixosTest { + name = "nixpkgs-trivial-builders"; + nodes.machine = { ... }: { + virtualisation.writableStore = true; + + # Test runs without network, so we don't substitute and prepare our deps + nix.settings.substituters = lib.mkForce [ ]; + environment.etc."pre-built-paths".source = writeText "pre-built-paths" ( + builtins.toJSON [ testScriptBin ] + ); + }; + testScript = + '' + machine.succeed(""" + ${lib.getExe testScriptBin} 2>/dev/console + """) + ''; + passthru = { + inherit + collectiveClosure + directReferences + closures + samples + testScriptBin + ; + }; + meta = { + maintainers = with lib.maintainers; [ + roberth + ShamrockLee + ]; + }; +} diff --git a/pkgs/build-support/trivial-builders/test/references/references-test.sh b/pkgs/build-support/trivial-builders/test/references/references-test.sh new file mode 100755 index 0000000..92e4467 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/references-test.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# -------------------------------------------------------------------------- # +# +# trivial-builders test +# +# -------------------------------------------------------------------------- # +# +# Execute this build script directly (quick): +# +# * Classic +# $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test +# +# * Flake-based +# $ nix run .#tests.trivial-builders.references.testScriptBin +# +# or in the build sandbox with a ~20s VM overhead: +# +# * Classic +# $ nix-build --no-out-link -A tests.trivial-builders.references +# +# * Flake-based +# $ nix build -L --no-link .#tests.trivial-builders.references +# +# -------------------------------------------------------------------------- # + +# strict bash +set -euo pipefail + +# debug +# set -x +# PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + +cd "$(dirname "${BASH_SOURCE[0]}")" # nixpkgs root + + # Inject the path to compare from the Nix expression + + # Associative Arrays + declare -A samples=( @SAMPLES@ ) + declare -A directRefs=( @DIRECT_REFS@ ) + declare -A closures=( @CLOSURES@ ) + + # Path string + collectiveClosure=@COLLECTIVE_CLOSURE@ + +echo >&2 Testing direct closures... +for i in "${!samples[@]}"; do + echo >&2 Checking "$i" "${samples[$i]}" "${directRefs[$i]}" + diff -U3 \ + <(sort <"${directRefs[$i]}") \ + <(nix-store -q --references "${samples[$i]}" | sort) +done + +echo >&2 Testing closure... +for i in "${!samples[@]}"; do + echo >&2 Checking "$i" "${samples[$i]}" "${closures[$i]}" + diff -U3 \ + <(sort <"${closures[$i]}") \ + <(nix-store -q --requisites "${samples[$i]}" | sort) +done + +echo >&2 Testing mixed closures... +echo >&2 Checking all samples "(${samples[*]})" "$collectiveClosure" +diff -U3 \ + <(sort <"$collectiveClosure") \ + <(nix-store -q --requisites "${samples[@]}" | sort) + +echo 'OK!' diff --git a/pkgs/build-support/trivial-builders/test/references/samples.nix b/pkgs/build-support/trivial-builders/test/references/samples.nix new file mode 100644 index 0000000..3afb970 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/samples.nix @@ -0,0 +1,30 @@ +{ lib +, runCommand +, writeText +, emptyFile +, emptyDirectory +, figlet +, hello +, zlib +}: +{ + inherit + figlet + hello + zlib + ; + zlib-dev = zlib.dev; + norefs = writeText "hi" "hello"; + norefsDup = writeText "hi" "hello"; + helloRef = writeText "hi" "hello ${hello}"; + helloRefDup = writeText "hi" "hello ${hello}"; + path = ./samples.nix; + pathLike.outPath = ./samples.nix; + helloFigletRef = writeText "hi" "hello ${hello} ${figlet}"; + selfRef = runCommand "self-ref-1" { } "echo $out >$out"; + selfRef2 = runCommand "self-ref-2" { } ''echo "${figlet}, $out" >$out''; + inherit + emptyFile + emptyDirectory + ; +} diff --git a/pkgs/build-support/trivial-builders/test/write-shell-script.nix b/pkgs/build-support/trivial-builders/test/write-shell-script.nix new file mode 100644 index 0000000..a5c9f1f --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/write-shell-script.nix @@ -0,0 +1,14 @@ +{ lib, writeShellScript }: let + output = "hello"; +in (writeShellScript "test-script" '' + echo ${lib.escapeShellArg output} +'').overrideAttrs (old: { + checkPhase = old.checkPhase or "" + '' + expected=${lib.escapeShellArg output} + got=$("$target") + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + ''; +}) diff --git a/pkgs/build-support/trivial-builders/test/write-text-file.nix b/pkgs/build-support/trivial-builders/test/write-text-file.nix new file mode 100644 index 0000000..2e6685c --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/write-text-file.nix @@ -0,0 +1,71 @@ +/* + To run: + + cd nixpkgs + nix-build -A tests.trivial-builders.writeTextFile + + or to run an individual test case + + cd nixpkgs + nix-build -A tests.trivial-builders.writeTextFile.foo +*/ +{ lib, runCommand, runtimeShell, writeTextFile }: +let + veryWeirdName = ''here's a name with some "bad" characters, like spaces and quotes''; +in +lib.recurseIntoAttrs { + + different-exe-name = + let + pkg = writeTextFile { + name = "bar"; + destination = "/bin/foo"; + executable = true; + text = '' + #!${runtimeShell} + echo hi + ''; + }; + in + assert pkg.meta.mainProgram == "foo"; + assert baseNameOf (lib.getExe pkg) == "foo"; + assert pkg.name == "bar"; + runCommand "test-writeTextFile-different-exe-name" {} '' + PATH="${lib.makeBinPath [ pkg ]}:$PATH" + x=$(foo) + [[ "$x" == hi ]] + touch $out + ''; + + weird-name = writeTextFile { + name = "weird-names"; + destination = "/etc/${veryWeirdName}"; + text = ''passed!''; + checkPhase = '' + # intentionally hardcode everything here, to make sure + # Nix does not mess with file paths + + name="here's a name with some \"bad\" characters, like spaces and quotes" + fullPath="$out/etc/$name" + + if [ -f "$fullPath" ]; then + echo "[PASS] File exists!" + else + echo "[FAIL] File was not created at expected path!" + exit 1 + fi + + content=$(<"$fullPath") + expected="passed!" + + if [ "$content" = "$expected" ]; then + echo "[PASS] Contents match!" + else + echo "[FAIL] File contents don't match!" + echo " Expected: $expected" + echo " Got: $content" + exit 2 + fi + ''; + }; +} diff --git a/pkgs/build-support/trivial-builders/test/writeCBin.nix b/pkgs/build-support/trivial-builders/test/writeCBin.nix new file mode 100644 index 0000000..56cab45 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeCBin.nix @@ -0,0 +1,43 @@ +/* + Run with: + + cd nixpkgs + nix-build -A tests.trivial-builders.writeCBin +*/ + +{ lib, writeCBin, runCommand }: +let + output = "hello"; + pkg = writeCBin "test-script" '' + #include + int main () { + printf("hello\n"); + return 0; + } + ''; +in + assert pkg.meta.mainProgram == "test-script"; + runCommand "test-writeCBin" { } '' + + echo Testing with getExe... + + target=${lib.getExe pkg} + expected=${lib.escapeShellArg output} + got=$("$target") + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + echo Testing with makeBinPath... + + PATH="${lib.makeBinPath [ pkg ]}:$PATH" + got=$(test-script) + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + touch $out + '' + diff --git a/pkgs/build-support/trivial-builders/test/writeClosure-union.nix b/pkgs/build-support/trivial-builders/test/writeClosure-union.nix new file mode 100644 index 0000000..92a2bf9 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeClosure-union.nix @@ -0,0 +1,23 @@ +{ lib +, runCommandLocal + # Test targets +, writeClosure +, samples +}: +runCommandLocal "test-trivial-builders-writeClosure-union" { + __structuredAttrs = true; + closures = lib.mapAttrs (n: v: writeClosure [ v ]) samples; + collectiveClosure = writeClosure (lib.attrValues samples); + inherit samples; + meta.maintainers = with lib.maintainers; [ + ShamrockLee + ]; +} '' + set -eu -o pipefail + echo >&2 Testing mixed closures... + echo >&2 Checking all samples "(''${samples[*]})" "$collectiveClosure" + diff -U3 \ + <(sort <"$collectiveClosure") \ + <(cat "''${closures[@]}" | sort | uniq) + touch "$out" +'' diff --git a/pkgs/build-support/trivial-builders/test/writeScriptBin.nix b/pkgs/build-support/trivial-builders/test/writeScriptBin.nix new file mode 100644 index 0000000..1487443 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeScriptBin.nix @@ -0,0 +1,39 @@ +/* + Run with: + + cd nixpkgs + nix-build -A tests.trivial-builders.writeShellScriptBin +*/ + +{ lib, writeScriptBin, runCommand }: +let + output = "hello"; + pkg = writeScriptBin "test-script" '' + echo ${lib.escapeShellArg output} + ''; +in + assert pkg.meta.mainProgram == "test-script"; + runCommand "test-writeScriptBin" { } '' + + echo Testing with getExe... + + target=${lib.getExe pkg} + expected=${lib.escapeShellArg output} + got=$("$target") + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + echo Testing with makeBinPath... + + PATH="${lib.makeBinPath [ pkg ]}:$PATH" + got=$(test-script) + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + touch $out + '' + diff --git a/pkgs/build-support/trivial-builders/test/writeShellApplication.nix b/pkgs/build-support/trivial-builders/test/writeShellApplication.nix new file mode 100644 index 0000000..c50f5a4 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeShellApplication.nix @@ -0,0 +1,141 @@ +# Run with: +# nix-build -A tests.trivial-builders.writeShellApplication +{ writeShellApplication +, writeTextFile +, runCommand +, lib +, linkFarm +, diffutils +, hello +}: +let + checkShellApplication = args@{name, expected, ...}: + let + writeShellApplicationArgs = builtins.removeAttrs args ["expected"]; + script = writeShellApplication writeShellApplicationArgs; + executable = lib.getExe script; + expected' = writeTextFile { + name = "${name}-expected"; + text = expected; + }; + actual = "${name}-actual"; + in + runCommand name { } '' + echo "Running test executable ${name}" + ${executable} > ${actual} + echo "Got output from test executable:" + cat ${actual} + echo "Checking test output against expected output:" + ${diffutils}/bin/diff --color --unified ${expected'} ${actual} + touch $out + ''; +in +linkFarm "writeShellApplication-tests" { + test-meta = + let + script = writeShellApplication { + name = "test-meta"; + text = ""; + meta.description = "A test for the `writeShellApplication` `meta` argument."; + }; + in + assert script.meta.mainProgram == "test-meta"; + assert script.meta.description == "A test for the `writeShellApplication` `meta` argument."; + script; + + test-runtime-inputs = + checkShellApplication { + name = "test-runtime-inputs"; + text = '' + hello + ''; + runtimeInputs = [ hello ]; + expected = "Hello, world!\n"; + }; + + test-runtime-env = + checkShellApplication { + name = "test-runtime-env"; + runtimeEnv = { + MY_COOL_ENV_VAR = "my-cool-env-value"; + MY_OTHER_COOL_ENV_VAR = "my-other-cool-env-value"; + # Check that we can serialize a bunch of different types: + BOOL = true; + INT = 1; + LIST = [1 2 3]; + MAP = { + a = "a"; + b = "b"; + }; + }; + text = '' + echo "$MY_COOL_ENV_VAR" + echo "$MY_OTHER_COOL_ENV_VAR" + ''; + expected = '' + my-cool-env-value + my-other-cool-env-value + ''; + }; + + test-check-phase = + checkShellApplication { + name = "test-check-phase"; + text = ""; + checkPhase = '' + echo "echo -n hello" > $target + ''; + expected = "hello"; + }; + + test-argument-forwarding = + checkShellApplication { + name = "test-argument-forwarding"; + text = ""; + derivationArgs.MY_BUILD_TIME_VARIABLE = "puppy"; + derivationArgs.postCheck = '' + if [[ "$MY_BUILD_TIME_VARIABLE" != puppy ]]; then + echo "\$MY_BUILD_TIME_VARIABLE is not set to 'puppy'!" + exit 1 + fi + ''; + meta.description = "A test checking that `writeShellApplication` forwards extra arguments to `stdenv.mkDerivation`."; + expected = ""; + }; + + test-exclude-shell-checks = writeShellApplication { + name = "test-exclude-shell-checks"; + excludeShellChecks = [ "SC2016" ]; + text = '' + # Triggers SC2016: Expressions don't expand in single quotes, use double + # quotes for that. + echo '$SHELL' + ''; + }; + + test-bash-options-pipefail = checkShellApplication { + name = "test-bash-options-pipefail"; + text = '' + touch my-test-file + echo puppy | grep doggy | sed 's/doggy/puppy/g' + # ^^^^^^^^^^ This will fail. + true + ''; + # Don't use `pipefail`: + bashOptions = ["errexit" "nounset"]; + expected = ""; + }; + + test-bash-options-nounset = checkShellApplication { + name = "test-bash-options-nounset"; + text = '' + echo -n "$someUndefinedVariable" + ''; + # Don't use `nounset`: + bashOptions = []; + # Don't warn about the undefined variable at build time: + excludeShellChecks = [ "SC2154" ]; + expected = ""; + }; + +} diff --git a/pkgs/build-support/trivial-builders/test/writeShellScriptBin.nix b/pkgs/build-support/trivial-builders/test/writeShellScriptBin.nix new file mode 100644 index 0000000..e93410e --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeShellScriptBin.nix @@ -0,0 +1,39 @@ +/* + Run with: + + cd nixpkgs + nix-build -A tests.trivial-builders.writeShellScriptBin +*/ + +{ lib, writeShellScriptBin, runCommand }: +let + output = "hello"; + pkg = writeShellScriptBin "test-script" '' + echo ${lib.escapeShellArg output} + ''; +in + assert pkg.meta.mainProgram == "test-script"; + runCommand "test-writeShellScriptBin" { } '' + + echo Testing with getExe... + + target=${lib.getExe pkg} + expected=${lib.escapeShellArg output} + got=$("$target") + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + echo Testing with makeBinPath... + + PATH="${lib.makeBinPath [ pkg ]}:$PATH" + got=$(test-script) + if [[ "$got" != "$expected" ]]; then + echo "wrong output: expected $expected, got $got" + exit 1 + fi + + touch $out + '' + diff --git a/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix b/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix new file mode 100644 index 0000000..dedd7e1 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix @@ -0,0 +1,17 @@ +{ callPackage, lib, pkgs, runCommand, samples, writeText, writeStringReferencesToFile }: +let + samplePaths = lib.unique (lib.attrValues samples); + stri = x: "${x}"; + sampleText = writeText "sample-text" (lib.concatStringsSep "\n" (lib.unique (map stri samplePaths))); + stringReferencesText = + writeStringReferencesToFile + ((lib.concatMapStringsSep "fillertext" + stri + (lib.attrValues samples)) + '' + STORE=${builtins.storeDir};\nsystemctl start bar-foo.service + ''); +in +runCommand "test-writeStringReferencesToFile" { } '' + diff -U3 <(sort ${stringReferencesText}) <(sort ${sampleText}) + touch $out +'' diff --git a/pkgs/build-support/vm/deb/deb-closure.pl b/pkgs/build-support/vm/deb/deb-closure.pl new file mode 100644 index 0000000..2d331e1 --- /dev/null +++ b/pkgs/build-support/vm/deb/deb-closure.pl @@ -0,0 +1,180 @@ +use strict; +use Dpkg::Control; +use Dpkg::Deps; +use File::Basename; + +my $packagesFile = shift @ARGV; +my $urlPrefix = shift @ARGV; +my @toplevelPkgs = @ARGV; + + +my %packages; + + +# Parse the Packages file. +open PACKAGES, "<$packagesFile" or die; + +while (1) { + my $cdata = Dpkg::Control->new(type => CTRL_INFO_PKG); + last if not $cdata->parse(\*PACKAGES, $packagesFile); + die unless defined $cdata->{Package}; + #print STDERR $cdata->{Package}, "\n"; + $packages{$cdata->{Package}} = $cdata; +} + +close PACKAGES; + + +# Flatten a Dpkg::Deps dependency value into a list of package names. +sub getDeps { + my $deps = shift; + #print "$deps\n"; + if ($deps->isa('Dpkg::Deps::AND')) { + my @res = (); + foreach my $dep ($deps->get_deps()) { + push @res, getDeps($dep); + } + return @res; + } elsif ($deps->isa('Dpkg::Deps::OR')) { + # Arbitrarily pick the first alternative. + return getDeps(($deps->get_deps())[0]); + } elsif ($deps->isa('Dpkg::Deps::Simple')) { + return ($deps->{package}); + } else { + die "unknown dep type"; + } +} + + +# Process the "Provides" and "Replaces" fields to be able to resolve +# virtual dependencies. +my %provides; + +foreach my $cdata (sort {$a->{Package} cmp $b->{Package}} (values %packages)) { + if (defined $cdata->{Provides}) { + my @provides = getDeps(Dpkg::Deps::deps_parse($cdata->{Provides})); + foreach my $name (@provides) { + #die "conflicting provide: $name\n" if defined $provides{$name}; + #warn "provide by $cdata->{Package} conflicts with package with the same name: $name\n"; + next if defined $packages{$name}; + $provides{$name} = $cdata->{Package}; + } + } + # Treat "Replaces" like "Provides". + if (defined $cdata->{Replaces}) { + my @replaces = getDeps(Dpkg::Deps::deps_parse($cdata->{Replaces})); + foreach my $name (@replaces) { + next if defined $packages{$name}; + $provides{$name} = $cdata->{Package}; + } + } +} + + +# Determine the closure of a package. +my %donePkgs; +my %depsUsed; +my @order = (); + +sub closePackage { + my $pkgName = shift; + print STDERR ">>> $pkgName\n"; + my $cdata = $packages{$pkgName}; + + if (!defined $cdata) { + die "unknown (virtual) package $pkgName" + unless defined $provides{$pkgName}; + print STDERR "virtual $pkgName: using $provides{$pkgName}\n"; + $pkgName = $provides{$pkgName}; + $cdata = $packages{$pkgName}; + } + + die "unknown package $pkgName" unless defined $cdata; + return if defined $donePkgs{$pkgName}; + $donePkgs{$pkgName} = 1; + + if (defined $cdata->{Provides}) { + foreach my $name (getDeps(Dpkg::Deps::deps_parse($cdata->{Provides}))) { + $provides{$name} = $cdata->{Package}; + } + } + + my @depNames = (); + + if (defined $cdata->{Depends}) { + print STDERR " $pkgName: $cdata->{Depends}\n"; + my $deps = Dpkg::Deps::deps_parse($cdata->{Depends}); + die unless defined $deps; + push @depNames, getDeps($deps); + } + + if (defined $cdata->{'Pre-Depends'}) { + print STDERR " $pkgName: $cdata->{'Pre-Depends'}\n"; + my $deps = Dpkg::Deps::deps_parse($cdata->{'Pre-Depends'}); + die unless defined $deps; + push @depNames, getDeps($deps); + } + + foreach my $depName (@depNames) { + closePackage($depName); + } + + push @order, $pkgName; + $depsUsed{$pkgName} = \@depNames; +} + +foreach my $pkgName (@toplevelPkgs) { + closePackage $pkgName; +} + + +# Generate the output Nix expression. +print "# This is a generated file. Do not modify!\n"; +print "# Following are the Debian packages constituting the closure of: @toplevelPkgs\n\n"; +print "{fetchurl}:\n\n"; +print "[\n\n"; + +# Output the packages in strongly connected components. +my %done; +my %forward; +my $newComponent = 1; +foreach my $pkgName (@order) { + $done{$pkgName} = 1; + my $cdata = $packages{$pkgName}; + my @deps = @{$depsUsed{$pkgName}}; + foreach my $dep (@deps) { + $dep = $provides{$dep} if defined $provides{$dep}; + $forward{$dep} = 1 unless defined $done{$dep}; + } + delete $forward{$pkgName}; + + print " [\n\n" if $newComponent; + $newComponent = 0; + + my $origName = basename $cdata->{Filename}; + my $cleanedName = $origName; + $cleanedName =~ s/~//g; + + print " (fetchurl {\n"; + print " url = \"$urlPrefix/$cdata->{Filename}\";\n"; + print " sha256 = \"$cdata->{SHA256}\";\n"; + print " name = \"$cleanedName\";\n" if $cleanedName ne $origName; + print " })\n"; + print "\n"; + + if (keys %forward == 0) { + print " ]\n\n"; + $newComponent = 1; + } +} + +foreach my $pkgName (@order) { + my $cdata = $packages{$pkgName}; +} + +print "]\n"; + +if ($newComponent != 1) { + print STDERR "argh: ", keys %forward, "\n"; + exit 1; +} diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix new file mode 100644 index 0000000..5637585 --- /dev/null +++ b/pkgs/build-support/vm/default.nix @@ -0,0 +1,1232 @@ +{ lib +, pkgs +, kernel ? pkgs.linux +, img ? pkgs.stdenv.hostPlatform.linux-kernel.target +, storeDir ? builtins.storeDir +, rootModules ? + [ "virtio_pci" "virtio_mmio" "virtio_blk" "virtio_balloon" "virtio_rng" "ext4" "unix" "9p" "9pnet_virtio" "crc32c_generic" ] + ++ pkgs.lib.optional pkgs.stdenv.hostPlatform.isx86 "rtc_cmos" +}: + +let + inherit (pkgs) bash bashInteractive busybox cpio coreutils e2fsprogs fetchurl kmod rpm + stdenv util-linux + buildPackages writeScript writeText runCommand; +in +rec { + qemu-common = import ../../../nixos/lib/qemu-common.nix { inherit lib pkgs; }; + + qemu = buildPackages.qemu_kvm; + + modulesClosure = pkgs.makeModulesClosure { + inherit kernel rootModules; + firmware = kernel; + }; + + + hd = "vda"; # either "sda" or "vda" + + initrdUtils = runCommand "initrd-utils" + { nativeBuildInputs = [ buildPackages.nukeReferences ]; + allowedReferences = [ "out" modulesClosure ]; # prevent accidents like glibc being included in the initrd + } + '' + mkdir -p $out/bin + mkdir -p $out/lib + + # Copy what we need from Glibc. + cp -p \ + ${pkgs.stdenv.cc.libc}/lib/ld-*.so.? \ + ${pkgs.stdenv.cc.libc}/lib/libc.so.* \ + ${pkgs.stdenv.cc.libc}/lib/libm.so.* \ + ${pkgs.stdenv.cc.libc}/lib/libresolv.so.* \ + $out/lib + + # Copy BusyBox. + cp -pd ${pkgs.busybox}/bin/* $out/bin + + # Run patchelf to make the programs refer to the copied libraries. + for i in $out/bin/* $out/lib/*; do if ! test -L $i; then nuke-refs $i; fi; done + + for i in $out/bin/*; do + if [ -f "$i" -a ! -L "$i" ]; then + echo "patching $i..." + patchelf --set-interpreter $out/lib/ld-*.so.? --set-rpath $out/lib $i || true + fi + done + ''; # */ + + + stage1Init = writeScript "vm-run-stage1" '' + #! ${initrdUtils}/bin/ash -e + + export PATH=${initrdUtils}/bin + + mkdir /etc + echo -n > /etc/fstab + + mount -t proc none /proc + mount -t sysfs none /sys + + echo 2 > /proc/sys/vm/panic_on_oom + + for o in $(cat /proc/cmdline); do + case $o in + mountDisk=*) + mountDisk=''${mountDisk#mountDisk=} + ;; + command=*) + set -- $(IFS==; echo $o) + command=$2 + ;; + out=*) + set -- $(IFS==; echo $o) + export out=$2 + ;; + esac + done + + echo "loading kernel modules..." + for i in $(cat ${modulesClosure}/insmod-list); do + insmod $i || echo "warning: unable to load $i" + done + + mount -t devtmpfs devtmpfs /dev + ln -s /proc/self/fd /dev/fd + ln -s /proc/self/fd/0 /dev/stdin + ln -s /proc/self/fd/1 /dev/stdout + ln -s /proc/self/fd/2 /dev/stderr + + ifconfig lo up + + mkdir /fs + + if test -z "$mountDisk"; then + mount -t tmpfs none /fs + elif [[ -e "$mountDisk" ]]; then + mount "$mountDisk" /fs + else + mount /dev/${hd} /fs + fi + + mkdir -p /fs/dev + mount -o bind /dev /fs/dev + + mkdir -p /fs/dev/shm /fs/dev/pts + mount -t tmpfs -o "mode=1777" none /fs/dev/shm + mount -t devpts none /fs/dev/pts + + echo "mounting Nix store..." + mkdir -p /fs${storeDir} + mount -t 9p store /fs${storeDir} -o trans=virtio,version=9p2000.L,cache=loose,msize=131072 + + mkdir -p /fs/tmp /fs/run /fs/var + mount -t tmpfs -o "mode=1777" none /fs/tmp + mount -t tmpfs -o "mode=755" none /fs/run + ln -sfn /run /fs/var/run + + echo "mounting host's temporary directory..." + mkdir -p /fs/tmp/xchg + mount -t 9p xchg /fs/tmp/xchg -o trans=virtio,version=9p2000.L,msize=131072 + + mkdir -p /fs/proc + mount -t proc none /fs/proc + + mkdir -p /fs/sys + mount -t sysfs none /fs/sys + + mkdir -p /fs/etc + ln -sf /proc/mounts /fs/etc/mtab + echo "127.0.0.1 localhost" > /fs/etc/hosts + # Ensures tools requiring /etc/passwd will work (e.g. nix) + if [ ! -e /fs/etc/passwd ]; then + echo "root:x:0:0:System administrator:/root:/bin/sh" > /fs/etc/passwd + fi + + echo "starting stage 2 ($command)" + exec switch_root /fs $command $out + ''; + + + initrd = pkgs.makeInitrd { + contents = [ + { object = stage1Init; + symlink = "/init"; + } + ]; + }; + + + stage2Init = writeScript "vm-run-stage2" '' + #! ${bash}/bin/sh + source /tmp/xchg/saved-env + + # Set the system time from the hardware clock. Works around an + # apparent KVM > 1.5.2 bug. + ${util-linux}/bin/hwclock -s + + export NIX_STORE=${storeDir} + export NIX_BUILD_TOP=/tmp + export TMPDIR=/tmp + export PATH=/empty + out="$1" + cd "$NIX_BUILD_TOP" + + if ! test -e /bin/sh; then + ${coreutils}/bin/mkdir -p /bin + ${coreutils}/bin/ln -s ${bash}/bin/sh /bin/sh + fi + + # Set up automatic kernel module loading. + export MODULE_DIR=${kernel}/lib/modules/ + ${coreutils}/bin/cat < /run/modprobe + #! ${bash}/bin/sh + export MODULE_DIR=$MODULE_DIR + exec ${kmod}/bin/modprobe "\$@" + EOF + ${coreutils}/bin/chmod 755 /run/modprobe + echo /run/modprobe > /proc/sys/kernel/modprobe + + # For debugging: if this is the second time this image is run, + # then don't start the build again, but instead drop the user into + # an interactive shell. + if test -n "$origBuilder" -a ! -e /.debug; then + exec < /dev/null + ${coreutils}/bin/touch /.debug + $origBuilder $origArgs + echo $? > /tmp/xchg/in-vm-exit + + ${busybox}/bin/mount -o remount,ro dummy / + + ${busybox}/bin/poweroff -f + else + export PATH=/bin:/usr/bin:${coreutils}/bin + echo "Starting interactive shell..." + echo "(To run the original builder: \$origBuilder \$origArgs)" + exec ${busybox}/bin/setsid ${bashInteractive}/bin/bash < /dev/${qemu-common.qemuSerialDevice} &> /dev/${qemu-common.qemuSerialDevice} + fi + ''; + + + qemuCommandLinux = '' + ${qemu-common.qemuBinary qemu} \ + -nographic -no-reboot \ + -device virtio-rng-pci \ + -virtfs local,path=${storeDir},security_model=none,mount_tag=store \ + -virtfs local,path=$TMPDIR/xchg,security_model=none,mount_tag=xchg \ + ''${diskImage:+-drive file=$diskImage,if=virtio,cache=unsafe,werror=report} \ + -kernel ${kernel}/${img} \ + -initrd ${initrd}/initrd \ + -append "console=${qemu-common.qemuSerialDevice} panic=1 command=${stage2Init} out=$out mountDisk=$mountDisk loglevel=4" \ + $QEMU_OPTS + ''; + + + vmRunCommand = qemuCommand: writeText "vm-run" '' + export > saved-env + + PATH=${coreutils}/bin + mkdir xchg + mv saved-env xchg/ + + eval "$preVM" + + if [ "$enableParallelBuilding" = 1 ]; then + if [ ''${NIX_BUILD_CORES:-0} = 0 ]; then + QEMU_OPTS+=" -smp cpus=$(nproc)" + else + QEMU_OPTS+=" -smp cpus=$NIX_BUILD_CORES" + fi + fi + + # Write the command to start the VM to a file so that the user can + # debug inside the VM if the build fails (when Nix is called with + # the -K option to preserve the temporary build directory). + cat > ./run-vm < ${destination}/nix-support/full-name + ''; + + + defaultCreateRootFS = '' + mkdir /mnt + ${e2fsprogs}/bin/mkfs.ext4 /dev/${hd} + ${util-linux}/bin/mount -t ext4 /dev/${hd} /mnt + + if test -e /mnt/.debug; then + exec ${bash}/bin/sh + fi + touch /mnt/.debug + + mkdir /mnt/proc /mnt/dev /mnt/sys + ''; + + + /* Run a derivation in a Linux virtual machine (using Qemu/KVM). By + default, there is no disk image; the root filesystem is a tmpfs, + and the nix store is shared with the host (via the 9P protocol). + Thus, any pure Nix derivation should run unmodified, e.g. the + call + + runInLinuxVM patchelf + + will build the derivation `patchelf' inside a VM. The attribute + `preVM' can optionally contain a shell command to be evaluated + *before* the VM is started (i.e., on the host). The attribute + `memSize' specifies the memory size of the VM in megabytes, + defaulting to 512. The attribute `diskImage' can optionally + specify a file system image to be attached to /dev/sda. (Note + that currently we expect the image to contain a filesystem, not a + full disk image with a partition table etc.) + + If the build fails and Nix is run with the `-K' option, a script + `run-vm' will be left behind in the temporary build directory + that allows you to boot into the VM and debug it interactively. */ + + runInLinuxVM = drv: lib.overrideDerivation drv ({ memSize ? 512, QEMU_OPTS ? "", args, builder, ... }: { + requiredSystemFeatures = [ "kvm" ]; + builder = "${bash}/bin/sh"; + args = ["-e" (vmRunCommand qemuCommandLinux)]; + origArgs = args; + origBuilder = builder; + QEMU_OPTS = "${QEMU_OPTS} -m ${toString memSize}"; + passAsFile = []; # HACK fix - see https://github.com/NixOS/nixpkgs/issues/16742 + }); + + + extractFs = {file, fs ? null} : + runInLinuxVM ( + stdenv.mkDerivation { + name = "extract-file"; + buildInputs = [ util-linux ]; + buildCommand = '' + ln -s ${kernel}/lib /lib + ${kmod}/bin/modprobe loop + ${kmod}/bin/modprobe ext4 + ${kmod}/bin/modprobe hfs + ${kmod}/bin/modprobe hfsplus + ${kmod}/bin/modprobe squashfs + ${kmod}/bin/modprobe iso9660 + ${kmod}/bin/modprobe ufs + ${kmod}/bin/modprobe cramfs + + mkdir -p $out + mkdir -p tmp + mount -o loop,ro,ufstype=44bsd ${lib.optionalString (fs != null) "-t ${fs} "}${file} tmp || + mount -o loop,ro ${lib.optionalString (fs != null) "-t ${fs} "}${file} tmp + cp -Rv tmp/* $out/ || exit 0 + ''; + }); + + + extractMTDfs = {file, fs ? null} : + runInLinuxVM ( + stdenv.mkDerivation { + name = "extract-file-mtd"; + buildInputs = [ pkgs.util-linux pkgs.mtdutils ]; + buildCommand = '' + ln -s ${kernel}/lib /lib + ${kmod}/bin/modprobe mtd + ${kmod}/bin/modprobe mtdram total_size=131072 + ${kmod}/bin/modprobe mtdchar + ${kmod}/bin/modprobe mtdblock + ${kmod}/bin/modprobe jffs2 + ${kmod}/bin/modprobe zlib + + mkdir -p $out + mkdir -p tmp + + dd if=${file} of=/dev/mtd0 + mount ${lib.optionalString (fs != null) "-t ${fs} "}/dev/mtdblock0 tmp + + cp -R tmp/* $out/ + ''; + }); + + + /* Like runInLinuxVM, but run the build not using the stdenv from + the Nix store, but using the tools provided by /bin, /usr/bin + etc. from the specified filesystem image, which typically is a + filesystem containing a non-NixOS Linux distribution. */ + + runInLinuxImage = drv: runInLinuxVM (lib.overrideDerivation drv (attrs: { + mountDisk = attrs.mountDisk or true; + + /* Mount `image' as the root FS, but use a temporary copy-on-write + image since we don't want to (and can't) write to `image'. */ + preVM = '' + diskImage=$(pwd)/disk-image.qcow2 + origImage=${attrs.diskImage} + if test -d "$origImage"; then origImage="$origImage/disk-image.qcow2"; fi + ${qemu}/bin/qemu-img create -F ${attrs.diskImageFormat} -b "$origImage" -f qcow2 $diskImage + ''; + + /* Inside the VM, run the stdenv setup script normally, but at the + very end set $PATH and $SHELL to the `native' paths for the + distribution inside the VM. */ + postHook = '' + PATH=/usr/bin:/bin:/usr/sbin:/sbin + SHELL=/bin/sh + eval "$origPostHook" + ''; + + origPostHook = lib.optionalString (attrs ? postHook) attrs.postHook; + + /* Don't run Nix-specific build steps like patchelf. */ + fixupPhase = "true"; + })); + + + /* Create a filesystem image of the specified size and fill it with + a set of RPM packages. */ + + fillDiskWithRPMs = + { size ? 4096, rpms, name, fullName, preInstall ? "", postInstall ? "" + , runScripts ? true, createRootFS ? defaultCreateRootFS + , QEMU_OPTS ? "", memSize ? 512 + , unifiedSystemDir ? false + }: + + runInLinuxVM (stdenv.mkDerivation { + inherit name preInstall postInstall rpms QEMU_OPTS memSize; + preVM = createEmptyImage {inherit size fullName;}; + + buildCommand = '' + ${createRootFS} + + chroot=$(type -tP chroot) + + # Make the Nix store available in /mnt, because that's where the RPMs live. + mkdir -p /mnt${storeDir} + ${util-linux}/bin/mount -o bind ${storeDir} /mnt${storeDir} + + # Newer distributions like Fedora 18 require /lib etc. to be + # symlinked to /usr. + ${lib.optionalString unifiedSystemDir '' + mkdir -p /mnt/usr/bin /mnt/usr/sbin /mnt/usr/lib /mnt/usr/lib64 + ln -s /usr/bin /mnt/bin + ln -s /usr/sbin /mnt/sbin + ln -s /usr/lib /mnt/lib + ln -s /usr/lib64 /mnt/lib64 + ${util-linux}/bin/mount -t proc none /mnt/proc + ''} + + echo "unpacking RPMs..." + set +o pipefail + for i in $rpms; do + echo "$i..." + ${rpm}/bin/rpm2cpio "$i" | chroot /mnt ${cpio}/bin/cpio -i --make-directories --unconditional + done + + eval "$preInstall" + + echo "initialising RPM DB..." + PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \ + ldconfig -v || true + PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \ + rpm --initdb + + ${util-linux}/bin/mount -o bind /tmp /mnt/tmp + + echo "installing RPMs..." + PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \ + rpm -iv --nosignature ${lib.optionalString (!runScripts) "--noscripts"} $rpms + + echo "running post-install script..." + eval "$postInstall" + + rm /mnt/.debug + + ${util-linux}/bin/umount /mnt${storeDir} /mnt/tmp ${lib.optionalString unifiedSystemDir "/mnt/proc"} + ${util-linux}/bin/umount /mnt + ''; + + passthru = { inherit fullName; }; + }); + + + /* Generate a script that can be used to run an interactive session + in the given image. */ + + makeImageTestScript = image: writeScript "image-test" '' + #! ${bash}/bin/sh + if test -z "$1"; then + echo "Syntax: $0 " + exit 1 + fi + diskImage="$1" + if ! test -e "$diskImage"; then + ${qemu}/bin/qemu-img create -b ${image}/disk-image.qcow2 -f qcow2 -F qcow2 "$diskImage" + fi + export TMPDIR=$(mktemp -d) + export out=/dummy + export origBuilder= + export origArgs= + mkdir $TMPDIR/xchg + export > $TMPDIR/xchg/saved-env + mountDisk=1 + ${qemuCommandLinux} + ''; + + + /* Build RPM packages from the tarball `src' in the Linux + distribution installed in the filesystem `diskImage'. The + tarball must contain an RPM specfile. */ + + buildRPM = attrs: runInLinuxImage (stdenv.mkDerivation ({ + prePhases = [ "prepareImagePhase" "sysInfoPhase" ]; + dontConfigure = true; + + outDir = "rpms/${attrs.diskImage.name}"; + + prepareImagePhase = '' + if test -n "$extraRPMs"; then + for rpmdir in $extraRPMs ; do + rpm -iv $(ls $rpmdir/rpms/*/*.rpm | grep -v 'src\.rpm' | sort | head -1) + done + fi + ''; + + sysInfoPhase = '' + echo "System/kernel: $(uname -a)" + if test -e /etc/fedora-release; then echo "Fedora release: $(cat /etc/fedora-release)"; fi + if test -e /etc/SuSE-release; then echo "SUSE release: $(cat /etc/SuSE-release)"; fi + echo "installed RPM packages" + rpm -qa --qf "%{Name}-%{Version}-%{Release} (%{Arch}; %{Distribution}; %{Vendor})\n" + ''; + + buildPhase = '' + eval "$preBuild" + + srcName="$(rpmspec --srpm -q --qf '%{source}' *.spec)" + cp "$src" "$srcName" # `ln' doesn't work always work: RPM requires that the file is owned by root + + export HOME=/tmp/home + mkdir $HOME + + rpmout=/tmp/rpmout + mkdir $rpmout $rpmout/SPECS $rpmout/BUILD $rpmout/RPMS $rpmout/SRPMS + + echo "%_topdir $rpmout" >> $HOME/.rpmmacros + + if [ `uname -m` = i686 ]; then extra="--target i686-linux"; fi + rpmbuild -vv $extra -ta "$srcName" + + eval "$postBuild" + ''; + + installPhase = '' + eval "$preInstall" + + mkdir -p $out/$outDir + find $rpmout -name "*.rpm" -exec cp {} $out/$outDir \; + + for i in $out/$outDir/*.rpm; do + echo "Generated RPM/SRPM: $i" + rpm -qip $i + done + + eval "$postInstall" + ''; # */ + } // attrs)); + + + /* Create a filesystem image of the specified size and fill it with + a set of Debian packages. `debs' must be a list of list of + .deb files, namely, the Debian packages grouped together into + strongly connected components. See deb/deb-closure.nix. */ + + fillDiskWithDebs = + { size ? 4096, debs, name, fullName, postInstall ? null, createRootFS ? defaultCreateRootFS + , QEMU_OPTS ? "", memSize ? 512, ... }@args: + + runInLinuxVM (stdenv.mkDerivation ({ + inherit name postInstall QEMU_OPTS memSize; + + debs = (lib.intersperse "|" debs); + + preVM = createEmptyImage {inherit size fullName;}; + + buildCommand = '' + ${createRootFS} + + PATH=$PATH:${lib.makeBinPath [ pkgs.dpkg pkgs.glibc pkgs.xz ]} + + # Unpack the .debs. We do this to prevent pre-install scripts + # (which have lots of circular dependencies) from barfing. + echo "unpacking Debs..." + + for deb in $debs; do + if test "$deb" != "|"; then + echo "$deb..." + dpkg-deb --extract "$deb" /mnt + fi + done + + # Make the Nix store available in /mnt, because that's where the .debs live. + mkdir -p /mnt/inst${storeDir} + ${util-linux}/bin/mount -o bind ${storeDir} /mnt/inst${storeDir} + ${util-linux}/bin/mount -o bind /proc /mnt/proc + ${util-linux}/bin/mount -o bind /dev /mnt/dev + + # Misc. files/directories assumed by various packages. + echo "initialising Dpkg DB..." + touch /mnt/etc/shells + touch /mnt/var/lib/dpkg/status + touch /mnt/var/lib/dpkg/available + touch /mnt/var/lib/dpkg/diversions + + # Now install the .debs. This is basically just to register + # them with dpkg and to make their pre/post-install scripts + # run. + echo "installing Debs..." + + export DEBIAN_FRONTEND=noninteractive + + oldIFS="$IFS" + IFS="|" + for component in $debs; do + IFS="$oldIFS" + echo + echo ">>> INSTALLING COMPONENT: $component" + debs= + for i in $component; do + debs="$debs /inst/$i"; + done + chroot=$(type -tP chroot) + + # Create a fake start-stop-daemon script, as done in debootstrap. + mv "/mnt/sbin/start-stop-daemon" "/mnt/sbin/start-stop-daemon.REAL" + echo "#!/bin/true" > "/mnt/sbin/start-stop-daemon" + chmod 755 "/mnt/sbin/start-stop-daemon" + + PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \ + /usr/bin/dpkg --install --force-all $debs < /dev/null || true + + # Move the real start-stop-daemon back into its place. + mv "/mnt/sbin/start-stop-daemon.REAL" "/mnt/sbin/start-stop-daemon" + done + + echo "running post-install script..." + eval "$postInstall" + + rm /mnt/.debug + + ${util-linux}/bin/umount /mnt/inst${storeDir} + ${util-linux}/bin/umount /mnt/proc + ${util-linux}/bin/umount /mnt/dev + ${util-linux}/bin/umount /mnt + ''; + + passthru = { inherit fullName; }; + } // args)); + + + /* Generate a Nix expression containing fetchurl calls for the + closure of a set of top-level RPM packages from the + `primary.xml.gz' file of a Fedora or openSUSE distribution. */ + + rpmClosureGenerator = + {name, packagesLists, urlPrefixes, packages, archs ? []}: + assert (builtins.length packagesLists) == (builtins.length urlPrefixes); + runCommand "${name}.nix" { + nativeBuildInputs = [ buildPackages.perl buildPackages.perlPackages.XMLSimple ]; + inherit archs; + } '' + ${lib.concatImapStrings (i: pl: '' + gunzip < ${pl} > ./packages_${toString i}.xml + '') packagesLists} + perl -w ${rpm/rpm-closure.pl} \ + ${lib.concatImapStrings (i: pl: "./packages_${toString i}.xml ${pl.snd} " ) (lib.zipLists packagesLists urlPrefixes)} \ + ${toString packages} > $out + ''; + + + /* Helper function that combines rpmClosureGenerator and + fillDiskWithRPMs to generate a disk image from a set of package + names. */ + + makeImageFromRPMDist = + { name, fullName, size ? 4096 + , urlPrefix ? "", urlPrefixes ? [urlPrefix] + , packagesList ? "", packagesLists ? [packagesList] + , packages, extraPackages ? [] + , preInstall ? "", postInstall ? "", archs ? ["noarch" "i386"] + , runScripts ? true, createRootFS ? defaultCreateRootFS + , QEMU_OPTS ? "", memSize ? 512 + , unifiedSystemDir ? false }: + + fillDiskWithRPMs { + inherit name fullName size preInstall postInstall runScripts createRootFS unifiedSystemDir QEMU_OPTS memSize; + rpms = import (rpmClosureGenerator { + inherit name packagesLists urlPrefixes archs; + packages = packages ++ extraPackages; + }) { inherit fetchurl; }; + }; + + + /* Like `rpmClosureGenerator', but now for Debian/Ubuntu releases + (i.e. generate a closure from a Packages.bz2 file). */ + + debClosureGenerator = + {name, packagesLists, urlPrefix, packages}: + + runCommand "${name}.nix" + { nativeBuildInputs = [ buildPackages.perl buildPackages.dpkg ]; } '' + for i in ${toString packagesLists}; do + echo "adding $i..." + case $i in + *.xz | *.lzma) + xz -d < $i >> ./Packages + ;; + *.bz2) + bunzip2 < $i >> ./Packages + ;; + *.gz) + gzip -dc < $i >> ./Packages + ;; + esac + done + + perl -w ${deb/deb-closure.pl} \ + ./Packages ${urlPrefix} ${toString packages} > $out + ''; + + + /* Helper function that combines debClosureGenerator and + fillDiskWithDebs to generate a disk image from a set of package + names. */ + + makeImageFromDebDist = + { name, fullName, size ? 4096, urlPrefix + , packagesList ? "", packagesLists ? [packagesList] + , packages, extraPackages ? [], postInstall ? "" + , extraDebs ? [], createRootFS ? defaultCreateRootFS + , QEMU_OPTS ? "", memSize ? 512, ... }@args: + + let + expr = debClosureGenerator { + inherit name packagesLists urlPrefix; + packages = packages ++ extraPackages; + }; + in + (fillDiskWithDebs ({ + inherit name fullName size postInstall createRootFS QEMU_OPTS memSize; + debs = import expr {inherit fetchurl;} ++ extraDebs; + } // args)) // {inherit expr;}; + + + /* The set of supported RPM-based distributions. */ + + rpmDistros = { + + # Note: no i386 release for Fedora >= 26 + fedora26x86_64 = + let version = "26"; + in { + name = "fedora-${version}-x86_64"; + fullName = "Fedora ${version} (x86_64)"; + packagesList = fetchurl rec { + url = "mirror://fedora/linux/releases/${version}/Everything/x86_64/os/repodata/${sha256}-primary.xml.gz"; + sha256 = "880055a50c05b20641530d09b23f64501a000b2f92fe252417c530178730a95e"; + }; + urlPrefix = "mirror://fedora/linux/releases/${version}/Everything/x86_64/os"; + archs = ["noarch" "x86_64"]; + packages = commonFedoraPackages ++ [ "cronie" "util-linux" ]; + unifiedSystemDir = true; + }; + + fedora27x86_64 = + let version = "27"; + in { + name = "fedora-${version}-x86_64"; + fullName = "Fedora ${version} (x86_64)"; + packagesList = fetchurl rec { + url = "mirror://fedora/linux/releases/${version}/Everything/x86_64/os/repodata/${sha256}-primary.xml.gz"; + sha256 = "48986ce4583cd09825c6d437150314446f0f49fa1a1bd62dcfa1085295030fe9"; + }; + urlPrefix = "mirror://fedora/linux/releases/${version}/Everything/x86_64/os"; + archs = ["noarch" "x86_64"]; + packages = commonFedoraPackages ++ [ "cronie" "util-linux" ]; + unifiedSystemDir = true; + }; + + centos6i386 = + let version = "6.9"; + in rec { + name = "centos-${version}-i386"; + fullName = "CentOS ${version} (i386)"; + urlPrefix = "mirror://centos/${version}/os/i386"; + packagesList = fetchurl rec { + url = "${urlPrefix}/repodata/${sha256}-primary.xml.gz"; + sha256 = "b826a45082ef68340325c0855f3d2e5d5a4d0f77d28ba3b871791d6f14a97aeb"; + }; + archs = ["noarch" "i386"]; + packages = commonCentOSPackages ++ [ "procps" ]; + }; + + centos6x86_64 = + let version = "6.9"; + in rec { + name = "centos-${version}-x86_64"; + fullName = "CentOS ${version} (x86_64)"; + urlPrefix = "mirror://centos/${version}/os/x86_64"; + packagesList = fetchurl rec { + url = "${urlPrefix}/repodata/${sha256}-primary.xml.gz"; + sha256 = "ed2b2d4ac98d774d4cd3e91467e1532f7e8b0275cfc91a0d214b532dcaf1e979"; + }; + archs = ["noarch" "x86_64"]; + packages = commonCentOSPackages ++ [ "procps" ]; + }; + + # Note: no i386 release for 7.x + centos7x86_64 = + let version = "7.4.1708"; + in rec { + name = "centos-${version}-x86_64"; + fullName = "CentOS ${version} (x86_64)"; + urlPrefix = "mirror://centos/${version}/os/x86_64"; + packagesList = fetchurl rec { + url = "${urlPrefix}/repodata/${sha256}-primary.xml.gz"; + sha256 = "b686d3a0f337323e656d9387b9a76ce6808b26255fc3a138b1a87d3b1cb95ed5"; + }; + archs = ["noarch" "x86_64"]; + packages = commonCentOSPackages ++ [ "procps-ng" ]; + }; + }; + + + /* The set of supported Dpkg-based distributions. */ + + debDistros = { + ubuntu1404i386 = { + name = "ubuntu-14.04-trusty-i386"; + fullName = "Ubuntu 14.04 Trusty (i386)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/trusty/main/binary-i386/Packages.bz2"; + sha256 = "1d5y3v3v079gdq45hc07ja0bjlmzqfwdwwlq0brwxi8m75k3iz7x"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/trusty/universe/binary-i386/Packages.bz2"; + sha256 = "03x9w92by320rfklrqhcl3qpwmnxds9c8ijl5zhcb21d6dcz5z1a"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu1404x86_64 = { + name = "ubuntu-14.04-trusty-amd64"; + fullName = "Ubuntu 14.04 Trusty (amd64)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/trusty/main/binary-amd64/Packages.bz2"; + sha256 = "1hhzbyqfr5i0swahwnl5gfp5l9p9hspywb1vpihr3b74p1z935bh"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/trusty/universe/binary-amd64/Packages.bz2"; + sha256 = "04560ba8s4z4v5iawknagrkn9q1nzvpn081ycmqvhh73p3p3g1jm"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu1604i386 = { + name = "ubuntu-16.04-xenial-i386"; + fullName = "Ubuntu 16.04 Xenial (i386)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/xenial/main/binary-i386/Packages.xz"; + sha256 = "13r75sp4slqy8w32y5dnr7pp7p3cfvavyr1g7gwnlkyrq4zx4ahy"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/xenial/universe/binary-i386/Packages.xz"; + sha256 = "14fid1rqm3sc0wlygcvn0yx5aljf51c2jpd4x0zxij4019316hsh"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu1604x86_64 = { + name = "ubuntu-16.04-xenial-amd64"; + fullName = "Ubuntu 16.04 Xenial (amd64)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/xenial/main/binary-amd64/Packages.xz"; + sha256 = "110qnkhjkkwm316fbig3aivm2595ydz6zskc4ld5cr8ngcrqm1bn"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/xenial/universe/binary-amd64/Packages.xz"; + sha256 = "0mm7gj491yi6q4v0n4qkbsm94s59bvqir6fk60j73w7y4la8rg68"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu1804i386 = { + name = "ubuntu-18.04-bionic-i386"; + fullName = "Ubuntu 18.04 Bionic (i386)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/bionic/main/binary-i386/Packages.xz"; + sha256 = "0f0v4131kwf7m7f8j3288rlqdxk1k3vqy74b7fcfd6jz9j8d840i"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/bionic/universe/binary-i386/Packages.xz"; + sha256 = "1v75c0dqr0wp0dqd4hnci92qqs4hll8frqdbpswadgxm5chn91bw"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu1804x86_64 = { + name = "ubuntu-18.04-bionic-amd64"; + fullName = "Ubuntu 18.04 Bionic (amd64)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/bionic/main/binary-amd64/Packages.xz"; + sha256 = "1ls81bjyvmfz6i919kszl7xks1ibrh1xqhsk6698ackndkm0wp39"; + }) + (fetchurl { + url = "mirror://ubuntu/dists/bionic/universe/binary-amd64/Packages.xz"; + sha256 = "1832nqpn4ap95b3sj870xqayrza9in4kih9jkmjax27pq6x15v1r"; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu2004i386 = { + name = "ubuntu-20.04-focal-i386"; + fullName = "Ubuntu 20.04 Focal (i386)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/focal/main/binary-i386/Packages.xz"; + sha256 = "sha256-7RAYURoN3RKYQAHpwBS9TIV6vCmpURpphyMJQmV4wLc="; + }) + (fetchurl { + url = "mirror://ubuntu/dists/focal/universe/binary-i386/Packages.xz"; + sha256 = "sha256-oA551xVE80volUPgkMyvzpQ1d+GhuZd4DAe7dXZnULM="; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu2004x86_64 = { + name = "ubuntu-20.04-focal-amd64"; + fullName = "Ubuntu 20.04 Focal (amd64)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/focal/main/binary-amd64/Packages.xz"; + sha256 = "sha256-d1eSH/j+7Zw5NKDJk21EG6SiOL7j6myMHfXLzUP8mGE="; + }) + (fetchurl { + url = "mirror://ubuntu/dists/focal/universe/binary-amd64/Packages.xz"; + sha256 = "sha256-RqdG2seJvZU3rKVNsWgLnf9RwkgVMRE1A4IZnX2WudE="; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu2204i386 = { + name = "ubuntu-22.04-jammy-i386"; + fullName = "Ubuntu 22.04 Jammy (i386)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/jammy/main/binary-i386/Packages.xz"; + sha256 = "sha256-iZBmwT0ep4v+V3sayybbOgZBOFFZwPGpOKtmuLMMVPQ="; + }) + (fetchurl { + url = "mirror://ubuntu/dists/jammy/universe/binary-i386/Packages.xz"; + sha256 = "sha256-DO2LdpZ9rDDBhWj2gvDWd0TJJVZHxKsYTKTi6GXjm1E="; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + ubuntu2204x86_64 = { + name = "ubuntu-22.04-jammy-amd64"; + fullName = "Ubuntu 22.04 Jammy (amd64)"; + packagesLists = + [ (fetchurl { + url = "mirror://ubuntu/dists/jammy/main/binary-amd64/Packages.xz"; + sha256 = "sha256-N8tX8VVMv6ccWinun/7hipqMF4K7BWjgh0t/9M6PnBE="; + }) + (fetchurl { + url = "mirror://ubuntu/dists/jammy/universe/binary-amd64/Packages.xz"; + sha256 = "sha256-0pyyTJP+xfQyVXBrzn60bUd5lSA52MaKwbsUpvNlXOI="; + }) + ]; + urlPrefix = "mirror://ubuntu"; + packages = commonDebPackages ++ [ "diffutils" "libc-bin" ]; + }; + + debian10i386 = { + name = "debian-10.13-buster-i386"; + fullName = "Debian 10.13 Buster (i386)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20221126T084953Z/dists/buster/main/binary-i386/Packages.xz"; + hash = "sha256-n9JquhtZgxw3qr9BX0MQoY3ZTIHN0dit+iru3DC31UY="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20221126T084953Z"; + packages = commonDebianPackages; + }; + + debian10x86_64 = { + name = "debian-10.13-buster-amd64"; + fullName = "Debian 10.13 Buster (amd64)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20221126T084953Z/dists/buster/main/binary-amd64/Packages.xz"; + hash = "sha256-YukIIB3u87jgp9oudwklsxyKVKjSL618wFgDSXiFmjU="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20221126T084953Z"; + packages = commonDebianPackages; + }; + + debian11i386 = { + name = "debian-11.8-bullseye-i386"; + fullName = "Debian 11.8 Bullseye (i386)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20231124T031419Z/dists/bullseye/main/binary-i386/Packages.xz"; + hash = "sha256-0bKSLLPhEC7FB5D1NA2jaQP0wTe/Qp1ddiA/NDVjRaI="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20231124T031419Z"; + packages = commonDebianPackages; + }; + + debian11x86_64 = { + name = "debian-11.8-bullseye-amd64"; + fullName = "Debian 11.8 Bullseye (amd64)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20231124T031419Z/dists/bullseye/main/binary-amd64/Packages.xz"; + hash = "sha256-CYPsGgQgJZkh3JmbcAQkYDWP193qrkOADOgrMETZIeo="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20231124T031419Z"; + packages = commonDebianPackages; + }; + + debian12i386 = { + name = "debian-12.2-bookworm-i386"; + fullName = "Debian 12.2 Bookworm (i386)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20231124T031419Z/dists/bookworm/main/binary-i386/Packages.xz"; + hash = "sha256-OeN9Q2HFM3GsPNhOa4VhM7qpwT66yUNwC+6Z8SbGEeQ="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20231124T031419Z"; + packages = commonDebianPackages; + }; + + debian12x86_64 = { + name = "debian-12.2-bookworm-amd64"; + fullName = "Debian 12.2 Bookworm (amd64)"; + packagesList = fetchurl { + url = "https://snapshot.debian.org/archive/debian/20231124T031419Z/dists/bookworm/main/binary-amd64/Packages.xz"; + hash = "sha256-SZDElRfe9BlBwDlajQB79Qdn08rv8whYoQDeVCveKVs="; + }; + urlPrefix = "https://snapshot.debian.org/archive/debian/20231124T031419Z"; + packages = commonDebianPackages; + }; + }; + + + /* Common packages for Fedora images. */ + commonFedoraPackages = [ + "autoconf" + "automake" + "basesystem" + "bzip2" + "curl" + "diffutils" + "fedora-release" + "findutils" + "gawk" + "gcc-c++" + "gzip" + "make" + "patch" + "perl" + "pkgconf-pkg-config" + "rpm" + "rpm-build" + "tar" + "unzip" + ]; + + commonCentOSPackages = [ + "autoconf" + "automake" + "basesystem" + "bzip2" + "curl" + "diffutils" + "centos-release" + "findutils" + "gawk" + "gcc-c++" + "gzip" + "make" + "patch" + "perl" + "pkgconfig" + "rpm" + "rpm-build" + "tar" + "unzip" + ]; + + commonRHELPackages = [ + "autoconf" + "automake" + "basesystem" + "bzip2" + "curl" + "diffutils" + "findutils" + "gawk" + "gcc-c++" + "gzip" + "make" + "patch" + "perl" + "pkgconfig" + "procps-ng" + "rpm" + "rpm-build" + "tar" + "unzip" + ]; + + /* Common packages for openSUSE images. */ + commonOpenSUSEPackages = [ + "aaa_base" + "autoconf" + "automake" + "bzip2" + "curl" + "diffutils" + "findutils" + "gawk" + "gcc-c++" + "gzip" + "make" + "patch" + "perl" + "pkg-config" + "rpm" + "tar" + "unzip" + "util-linux" + "gnu-getopt" + ]; + + + /* Common packages for Debian/Ubuntu images. */ + commonDebPackages = [ + "base-passwd" + "dpkg" + "libc6-dev" + "perl" + "bash" + "dash" + "gzip" + "bzip2" + "tar" + "grep" + "mawk" + "sed" + "findutils" + "g++" + "make" + "curl" + "patch" + "locales" + "coreutils" + # Needed by checkinstall: + "util-linux" + "file" + "dpkg-dev" + "pkg-config" + # Needed because it provides /etc/login.defs, whose absence causes + # the "passwd" post-installs script to fail. + "login" + "passwd" + ]; + + commonDebianPackages = commonDebPackages ++ [ "sysvinit" "diff" ]; + + + /* A set of functions that build the Linux distributions specified + in `rpmDistros' and `debDistros'. For instance, + `diskImageFuns.ubuntu1004x86_64 { }' builds an Ubuntu 10.04 disk + image containing the default packages specified above. Overrides + of the default image parameters can be given. In particular, + `extraPackages' specifies the names of additional packages from + the distribution that should be included in the image; `packages' + allows the entire set of packages to be overridden; and `size' + sets the size of the disk in megabytes. E.g., + `diskImageFuns.ubuntu1004x86_64 { extraPackages = ["firefox"]; + size = 8192; }' builds an 8 GiB image containing Firefox in + addition to the default packages. */ + diskImageFuns = + (lib.mapAttrs (name: as: as2: makeImageFromRPMDist (as // as2)) rpmDistros) // + (lib.mapAttrs (name: as: as2: makeImageFromDebDist (as // as2)) debDistros); + + + /* Shorthand for `diskImageFuns. { extraPackages = ... }'. */ + diskImageExtraFuns = + lib.mapAttrs (name: f: extraPackages: f { inherit extraPackages; }) diskImageFuns; + + + /* Default disk images generated from the `rpmDistros' and + `debDistros' sets. */ + diskImages = lib.mapAttrs (name: f: f {}) diskImageFuns; + +} diff --git a/pkgs/build-support/vm/rpm/rpm-closure.pl b/pkgs/build-support/vm/rpm/rpm-closure.pl new file mode 100644 index 0000000..6442cd9 --- /dev/null +++ b/pkgs/build-support/vm/rpm/rpm-closure.pl @@ -0,0 +1,184 @@ +use strict; +use XML::Simple; +use List::Util qw(min); + +my @packagesFiles = (); +my @urlPrefixes = (); + +# rpm-closure.pl ( )+ + + +while(-f $ARGV[0]) { + my $packagesFile = shift @ARGV; + my $urlPrefix = shift @ARGV; + push(@packagesFiles, $packagesFile); + push(@urlPrefixes, $urlPrefix); +} + + +sub rpmvercmp { + my ($version1, $version2) = @_; + my @vercmps1 = split /\./, $version1; + my @vercmps2 = split /\./, $version2; + my $l1 = scalar(@vercmps1); + my $l2 = scalar(@vercmps2); + my $l = min($l1, $l2); + + for(my $i=0; $i<$l; $i++) { + my $v1 = $vercmps1[$i]; + my $v2 = $vercmps2[$i]; + + if($v1 =~ /^[0-9]*$/ && $v2 =~ /^[0-9]*$/) { + if ( int($v1) > int($v2) ) { + return 1; + } + elsif ( int($v1) < int($v2) ) { + return -1; + } + } else { + if ( $v1 gt $v2 ) { + return 1; + } + elsif ( $v1 lt $v2 ) { + return -1; + } + } + } + if($l1 == $l2) { + return 0; + } elsif ($l1 > $l2) { + return 1; + } elsif ($l1 < $l2) { + return -1; + } +} + +my @toplevelPkgs = @ARGV; + +my @archs = split ' ', ($ENV{'archs'} or ""); + +my %pkgs; +for (my $i = 0; $i < scalar(@packagesFiles); $i++) { + my $packagesFile = $packagesFiles[$i]; + print STDERR "parsing packages in $packagesFile...\n"; + + my $xml = XMLin($packagesFile, ForceArray => ['package', 'rpm:entry', 'file'], KeyAttr => []) or die; + + print STDERR "$packagesFile contains $xml->{packages} packages\n"; + + foreach my $pkg (@{$xml->{'package'}}) { + if (scalar @archs > 0) { + my $arch = $pkg->{arch}; + my $found = 0; + foreach my $a (@archs) { $found = 1 if $arch eq $a; } + next if !$found; + } + if (defined $pkgs{$pkg->{name}}) { + my $earlierPkg = $pkgs{$pkg->{name}}; + print STDERR "WARNING: duplicate occurrence of package $pkg->{name}\n"; + # + my $cmp = rpmvercmp($pkg->{'version'}->{ver}, $earlierPkg->{'version'}->{ver}); + if ($cmp > 0 || ($cmp == 0 && rpmvercmp($pkg->{'version'}->{rel}, $earlierPkg->{'version'}->{rel})>0)) { + print STDERR "WARNING: replaced package $pkg->{name} (".$earlierPkg->{'version'}->{ver}." ".$earlierPkg->{'version'}->{rel}.") with newer one (".$pkg->{'version'}->{ver}." ".$pkg->{'version'}->{rel}.")\n"; + $pkg->{urlPrefix} = $urlPrefixes[$i]; + $pkgs{$pkg->{name}} = $pkg; + } + next; + } + $pkg->{urlPrefix} = $urlPrefixes[$i]; + $pkgs{$pkg->{name}} = $pkg; + } +} + +my %provides; +PKG: foreach my $pkgName (sort(keys %pkgs)) { + #print STDERR "looking at $pkgName\n"; + my $pkg = $pkgs{$pkgName}; + + # Skip packages that conflict with a required package. + my $conflicts = $pkg->{format}->{'rpm:conflicts'}->{'rpm:entry'} // []; + foreach my $conflict (@{$conflicts}) { + next if $conflict->{flags} // "" eq "LT" || $conflict->{flags} // "" eq "LE"; + #print STDERR " $pkgName conflicts with $conflict->{name}\n"; + if (grep { $_ eq $conflict->{name} } @toplevelPkgs) { + print STDERR "skipping package $pkgName because it conflicts with a required package\n"; + next PKG; + } + } + + my $provides = $pkg->{format}->{'rpm:provides'}->{'rpm:entry'} or die; + foreach my $req (@{$provides}) { + #print STDERR " $pkgName provides $req->{name}\n"; + #die "multiple provides for $req->{name}" if defined $provides{$req->{name}}; + $provides{$req->{name}} = $pkgName; + } + + if (defined $pkg->{format}->{file}) { + foreach my $file (@{$pkg->{format}->{file}}) { + #print STDERR " provides file $file\n"; + $provides{$file} = $pkgName; + } + } +} + + +my %donePkgs; +my @needed = (); + +sub closePackage { + my $pkgName = shift; + + return if defined $donePkgs{$pkgName}; + $donePkgs{$pkgName} = 1; + + print STDERR ">>> $pkgName\n"; + + my $pkg = $pkgs{$pkgName} or die "package $pkgName doesn't exist"; + + my $requires = $pkg->{format}->{'rpm:requires'}->{'rpm:entry'} || []; + + my @deps = (); + foreach my $req (@{$requires}) { + next if $req->{name} =~ /^rpmlib\(/; + #print STDERR " needs $req->{name}\n"; + my $provider = $provides{$req->{name}}; + if (!defined $provider) { + print STDERR " WARNING: no provider for $req->{name}\n"; + next; + } + #print STDERR " satisfied by $provider\n"; + push @deps, $provider; + } + + closePackage($_) foreach @deps; + + push @needed, $pkgName; +} + + +foreach my $pkgName (@toplevelPkgs) { + closePackage $pkgName; +} + + +# Generate the output Nix expression. +print "# This is a generated file. Do not modify!\n"; +print "# Following are the RPM packages constituting the closure of: @toplevelPkgs\n\n"; +print "{fetchurl}:\n\n"; +print "[\n\n"; + +foreach my $pkgName (@needed) { + my $pkg = $pkgs{$pkgName}; + print " (fetchurl {\n"; + print " url = $pkg->{urlPrefix}/$pkg->{location}->{href};\n"; + if ($pkg->{checksum}->{type} eq "sha") { + print " sha1 = \"$pkg->{checksum}->{content}\";\n"; + } elsif ($pkg->{checksum}->{type} eq "sha256") { + print " sha256 = \"$pkg->{checksum}->{content}\";\n"; + } else { + die "unsupported hash type"; + } + print " })\n"; + print "\n"; +} + +print "]\n"; diff --git a/pkgs/build-support/vm/test.nix b/pkgs/build-support/vm/test.nix new file mode 100644 index 0000000..50dbfeb --- /dev/null +++ b/pkgs/build-support/vm/test.nix @@ -0,0 +1,58 @@ +let + pkgs = import ../../.. { }; + + inherit (pkgs) + hello + patchelf + pcmanfm + stdenv + ; + + inherit (pkgs.vmTools) + buildRPM + diskImages + makeImageTestScript + runInLinuxImage + runInLinuxVM + ; +in + +{ + + + # Run the PatchELF derivation in a VM. + buildPatchelfInVM = runInLinuxVM patchelf; + + buildHelloInVM = runInLinuxVM hello; + + buildPcmanrmInVM = runInLinuxVM (pcmanfm.overrideAttrs (old: { + # goes out-of-memory with many cores + enableParallelBuilding = false; + })); + + testRPMImage = makeImageTestScript diskImages.fedora27x86_64; + + + buildPatchelfRPM = buildRPM { + name = "patchelf-rpm"; + src = patchelf.src; + diskImage = diskImages.fedora27x86_64; + diskImageFormat = "qcow2"; + }; + + + testUbuntuImage = makeImageTestScript diskImages.ubuntu1804i386; + + + buildInDebian = runInLinuxImage (stdenv.mkDerivation { + name = "deb-compile"; + src = patchelf.src; + diskImage = diskImages.ubuntu1804i386; + diskImageFormat = "qcow2"; + memSize = 512; + postHook = '' + dpkg-query --list + ''; + }); + +} diff --git a/pkgs/build-support/wrapper-common/utils.bash b/pkgs/build-support/wrapper-common/utils.bash new file mode 100644 index 0000000..2faf96d --- /dev/null +++ b/pkgs/build-support/wrapper-common/utils.bash @@ -0,0 +1,171 @@ +# Accumulate suffixes for taking in the right input parameters with the `mangle*` +# functions below. See setup-hook for details. +accumulateRoles() { + declare -ga role_suffixes=() + if [ "${NIX_@wrapperName@_TARGET_BUILD_@suffixSalt@:-}" ]; then + role_suffixes+=('_FOR_BUILD') + fi + if [ "${NIX_@wrapperName@_TARGET_HOST_@suffixSalt@:-}" ]; then + role_suffixes+=('') + fi + if [ "${NIX_@wrapperName@_TARGET_TARGET_@suffixSalt@:-}" ]; then + role_suffixes+=('_FOR_TARGET') + fi +} + +mangleVarListGeneric() { + local sep="$1" + shift + local var="$1" + shift + local -a role_suffixes=("$@") + + local outputVar="${var}_@suffixSalt@" + declare -gx "$outputVar"+='' + # For each role we serve, we accumulate the input parameters into our own + # cc-wrapper-derivation-specific environment variables. + for suffix in "${role_suffixes[@]}"; do + local inputVar="${var}${suffix}" + if [ -v "$inputVar" ]; then + export "${outputVar}+=${!outputVar:+$sep}${!inputVar}" + fi + done +} + +mangleVarList() { + mangleVarListGeneric " " "$@" +} + +mangleVarBool() { + local var="$1" + shift + local -a role_suffixes=("$@") + + local outputVar="${var}_@suffixSalt@" + declare -gxi "${outputVar}+=0" + for suffix in "${role_suffixes[@]}"; do + local inputVar="${var}${suffix}" + if [ -v "$inputVar" ]; then + # "1" in the end makes `let` return success error code when + # expression itself evaluates to zero. + # We don't use `|| true` because that would silence actual + # syntax errors from bad variable values. + let "${outputVar} |= ${!inputVar:-0}" "1" + fi + done +} + +# Combine a singular value from all roles. If multiple roles are being served, +# and the value differs in these roles then the request is impossible to +# satisfy and we abort immediately. +mangleVarSingle() { + local var="$1" + shift + local -a role_suffixes=("$@") + + local outputVar="${var}_@suffixSalt@" + for suffix in "${role_suffixes[@]}"; do + local inputVar="${var}${suffix}" + if [ -v "$inputVar" ]; then + if [ -v "$outputVar" ]; then + if [ "${!outputVar}" != "${!inputVar}" ]; then + { + echo "Multiple conflicting values defined for $outputVar" + echo "Existing value is ${!outputVar}" + echo "Attempting to set to ${!inputVar} via $inputVar" + } >&2 + + exit 1 + fi + else + declare -gx ${outputVar}="${!inputVar}" + fi + fi + done +} + +skip() { + if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "skipping impure path $1" >&2 + fi +} + +reject() { + echo "impure path \`$1' used in link" >&2 + exit 1 +} + + +# Checks whether a path is impure. E.g., `/lib/foo.so' is impure, but +# `/nix/store/.../lib/foo.so' isn't. +badPath() { + local p=$1 + + # Relative paths are okay (since they're presumably relative to + # the temporary build directory). + if [ "${p:0:1}" != / ]; then return 1; fi + + # Otherwise, the path should refer to the store or some temporary + # directory (including the build directory). + test \ + "$p" != "/dev/null" -a \ + "${p#"${NIX_STORE}"}" = "$p" -a \ + "${p#"${NIX_BUILD_TOP}"}" = "$p" -a \ + "${p#/tmp}" = "$p" -a \ + "${p#"${TMP:-/tmp}"}" = "$p" -a \ + "${p#"${TMPDIR:-/tmp}"}" = "$p" -a \ + "${p#"${TEMP:-/tmp}"}" = "$p" -a \ + "${p#"${TEMPDIR:-/tmp}"}" = "$p" +} + +expandResponseParams() { + declare -ga params=("$@") + local arg + for arg in "$@"; do + if [[ "$arg" == @* ]]; then + # phase separation makes this look useless + # shellcheck disable=SC2157 + if [ -x "@expandResponseParams@" ]; then + # params is used by caller + #shellcheck disable=SC2034 + readarray -d '' params < <("@expandResponseParams@" "$@") + return 0 + fi + fi + done +} + +checkLinkType() { + local arg + type="dynamic" + for arg in "$@"; do + if [[ "$arg" = -static ]]; then + type="static" + elif [[ "$arg" = -static-pie ]]; then + type="static-pie" + fi + done + echo "$type" +} + +# When building static-pie executables we cannot have rpath +# set. At least glibc requires rpath to be empty +filterRpathFlags() { + local linkType=$1 ret i + shift + + if [[ "$linkType" == "static-pie" ]]; then + while [[ "$#" -gt 0 ]]; do + i="$1"; shift 1 + if [[ "$i" == -rpath ]]; then + # also skip its argument + shift + else + ret+=("$i") + fi + done + else + ret=("$@") + fi + echo "${ret[@]}" +} diff --git a/pkgs/build-support/writers/aliases.nix b/pkgs/build-support/writers/aliases.nix new file mode 100644 index 0000000..fb108a6 --- /dev/null +++ b/pkgs/build-support/writers/aliases.nix @@ -0,0 +1,35 @@ +lib: prev: + +let + # Removing recurseForDerivation prevents derivations of aliased attribute + # set to appear while listing all the packages available. + removeRecurseForDerivations = alias: with lib; + if alias.recurseForDerivations or false then + removeAttrs alias ["recurseForDerivations"] + else alias; + + # Disabling distribution prevents top-level aliases for non-recursed package + # sets from building on Hydra. + removeDistribute = alias: with lib; + if isDerivation alias then + dontDistribute alias + else alias; + + # Make sure that we are not shadowing something from + # writers. + checkInPkgs = n: alias: if builtins.hasAttr n prev + then throw "Alias ${n} is still in writers" + else alias; + + mapAliases = aliases: + lib.mapAttrs (n: alias: removeDistribute + (removeRecurseForDerivations + (checkInPkgs n alias))) + aliases; + +in +mapAliases ({ + /* Cleanup before 22.05, Added 2021-12-11 */ + writePython2 = "Python 2 is EOL and the use of writers.writePython2 is deprecated."; + writePython2Bin = "Python 2 is EOL and the use of writers.writePython2Bin is deprecated."; +}) diff --git a/pkgs/build-support/writers/data.nix b/pkgs/build-support/writers/data.nix new file mode 100644 index 0000000..3151503 --- /dev/null +++ b/pkgs/build-support/writers/data.nix @@ -0,0 +1,85 @@ +{ lib, pkgs, formats, runCommand }: +let + inherit (lib) + last + optionalString + types + ; +in +{ + /** + Creates a transformer function that writes input data to disk, transformed + by both the `input` and `output` arguments. + + # Example + + ```nix + writeJSON = makeDataWriter { input = builtins.toJSON; output = "cp $inputPath $out"; }; + myConfig = writeJSON "config.json" { hello = "world"; } + ``` + + # Type + + ``` + makeDataWriter :: input -> output -> nameOrPath -> data -> (any -> string) -> string -> string -> any -> derivation + + input :: T -> string: function that takes the nix data and returns a string + output :: string: script that takes the $inputFile and write the result into $out + nameOrPath :: string: if the name contains a / the files gets written to a sub-folder of $out. The derivation name is the basename of this argument. + data :: T: the data that will be converted. + ``` + */ + makeDataWriter = lib.warn "pkgs.writers.makeDataWriter is deprecated. Use pkgs.writeTextFile." ({ input ? lib.id, output ? "cp $inputPath $out" }: nameOrPath: data: + assert (types.path.check nameOrPath) || (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null); + let + name = last (builtins.split "/" nameOrPath); + in + runCommand name + { + input = input data; + passAsFile = [ "input" ]; + } '' + ${output} + + ${optionalString (types.path.check nameOrPath) '' + mv $out tmp + mkdir -p $out/$(dirname "${nameOrPath}") + mv tmp $out/${nameOrPath} + ''} + ''); + + inherit (pkgs) writeText; + + /** + Writes the content to a JSON file. + + # Example + + ```nix + writeJSON "data.json" { hello = "world"; } + ``` + */ + writeJSON = (pkgs.formats.json {}).generate; + + /** + Writes the content to a TOML file. + + # Example + + ```nix + writeTOML "data.toml" { hello = "world"; } + ``` + */ + writeTOML = (pkgs.formats.toml {}).generate; + + /** + Writes the content to a YAML file. + + # Example + + ```nix + writeYAML "data.yaml" { hello = "world"; } + ``` + */ + writeYAML = (pkgs.formats.yaml {}).generate; +} diff --git a/pkgs/build-support/writers/default.nix b/pkgs/build-support/writers/default.nix new file mode 100644 index 0000000..cadb697 --- /dev/null +++ b/pkgs/build-support/writers/default.nix @@ -0,0 +1,15 @@ +{ config, lib, callPackages }: + +# If you are reading this, you can test these writers by running: nix-build . -A tests.writers +let + aliases = if config.allowAliases then (import ./aliases.nix lib) else prev: {}; + + # Writers for JSON-like data structures + dataWriters = callPackages ./data.nix { }; + + # Writers for scripts + scriptWriters = callPackages ./scripts.nix { }; + + writers = scriptWriters // dataWriters; +in +writers // (aliases writers) diff --git a/pkgs/build-support/writers/scripts.nix b/pkgs/build-support/writers/scripts.nix new file mode 100644 index 0000000..06d763c --- /dev/null +++ b/pkgs/build-support/writers/scripts.nix @@ -0,0 +1,668 @@ +{ + buildPackages, + gixy, + lib, + libiconv, + makeBinaryWrapper, + mkNugetDeps, + mkNugetSource, + pkgs, + stdenv, +}: +let + inherit (lib) + concatMapStringsSep + elem + escapeShellArg + last + optionalString + strings + types + ; +in +rec { + # Base implementation for non-compiled executables. + # Takes an interpreter, for example `${lib.getExe pkgs.bash}` + # + # Examples: + # writeBash = makeScriptWriter { interpreter = "${pkgs.bash}/bin/bash"; } + # makeScriptWriter { interpreter = "${pkgs.dash}/bin/dash"; } "hello" "echo hello world" + makeScriptWriter = { interpreter, check ? "", makeWrapperArgs ? [], }: nameOrPath: content: + assert (types.path.check nameOrPath) || (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null); + assert (types.path.check content) || (types.str.check content); + let + nameIsPath = types.path.check nameOrPath; + name = last (builtins.split "/" nameOrPath); + path = if nameIsPath then nameOrPath else "/bin/${name}"; + # The inner derivation which creates the executable under $out/bin (never at $out directly) + # This is required in order to support wrapping, as wrapped programs consist of at least two files: the executable and the wrapper. + inner = + pkgs.runCommandLocal name ( + { + inherit makeWrapperArgs; + nativeBuildInputs = [ + makeBinaryWrapper + ]; + meta.mainProgram = name; + } + // ( + if (types.str.check content) then { + inherit content interpreter; + passAsFile = [ "content" ]; + } else { + inherit interpreter; + contentPath = content; + } + ) + ) + '' + # On darwin a script cannot be used as an interpreter in a shebang but + # there doesn't seem to be a limit to the size of shebang and multiple + # arguments to the interpreter are allowed. + if [[ -n "${toString pkgs.stdenvNoCC.isDarwin}" ]] && isScript $interpreter + then + wrapperInterpreterLine=$(head -1 "$interpreter" | tail -c+3) + # Get first word from the line (note: xargs echo remove leading spaces) + wrapperInterpreter=$(echo "$wrapperInterpreterLine" | xargs echo | cut -d " " -f1) + + if isScript $wrapperInterpreter + then + echo "error: passed interpreter ($interpreter) is a script which has another script ($wrapperInterpreter) as an interpreter, which is not supported." + exit 1 + fi + + # This should work as long as wrapperInterpreter is a shell, which is + # the case for programs wrapped with makeWrapper, like + # python3.withPackages etc. + interpreterLine="$wrapperInterpreterLine $interpreter" + else + interpreterLine=$interpreter + fi + + echo "#! $interpreterLine" > $out + cat "$contentPath" >> $out + ${optionalString (check != "") '' + ${check} $out + ''} + chmod +x $out + + # Relocate executable + # Wrap it if makeWrapperArgs are specified + mv $out tmp + mkdir -p $out/$(dirname "${path}") + mv tmp $out/${path} + if [ -n "''${makeWrapperArgs+''${makeWrapperArgs[@]}}" ]; then + wrapProgram $out/${path} ''${makeWrapperArgs[@]} + fi + ''; + in + if nameIsPath + then inner + # In case nameOrPath is a name, the user intends the executable to be located at $out. + # This is achieved by creating a separate derivation containing a symlink at $out linking to ${inner}/bin/${name}. + # This breaks the override pattern. + # In case this turns out to be a problem, we can still add more magic + else pkgs.runCommandLocal name {} '' + ln -s ${inner}/bin/${name} $out + ''; + + + # Base implementation for compiled executables. + # Takes a compile script, which in turn takes the name as an argument. + # + # Examples: + # writeSimpleC = makeBinWriter { compileScript = name: "gcc -o $out $contentPath"; } + makeBinWriter = { compileScript, strip ? true, makeWrapperArgs ? [] }: nameOrPath: content: + assert (types.path.check nameOrPath) || (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null); + assert (types.path.check content) || (types.str.check content); + let + nameIsPath = types.path.check nameOrPath; + name = last (builtins.split "/" nameOrPath); + path = if nameIsPath then nameOrPath else "/bin/${name}"; + # The inner derivation which creates the executable under $out/bin (never at $out directly) + # This is required in order to support wrapping, as wrapped programs consist of at least two files: the executable and the wrapper. + inner = + pkgs.runCommandLocal name ( + { + inherit makeWrapperArgs; + nativeBuildInputs = [ + makeBinaryWrapper + ]; + meta.mainProgram = name; + } + // ( + if (types.str.check content) then { + inherit content; + passAsFile = [ "content" ]; + } else { + contentPath = content; + } + ) + ) + '' + ${compileScript} + ${lib.optionalString strip + "${lib.getBin buildPackages.bintools-unwrapped}/bin/${buildPackages.bintools-unwrapped.targetPrefix}strip -S $out"} + # Sometimes binaries produced for darwin (e. g. by GHC) won't be valid + # mach-o executables from the get-go, but need to be corrected somehow + # which is done by fixupPhase. + ${lib.optionalString pkgs.stdenvNoCC.hostPlatform.isDarwin "fixupPhase"} + mv $out tmp + mkdir -p $out/$(dirname "${path}") + mv tmp $out/${path} + if [ -n "''${makeWrapperArgs+''${makeWrapperArgs[@]}}" ]; then + wrapProgram $out/${path} ''${makeWrapperArgs[@]} + fi + ''; + in + if nameIsPath + then inner + # In case nameOrPath is a name, the user intends the executable to be located at $out. + # This is achieved by creating a separate derivation containing a symlink at $out linking to ${inner}/bin/${name}. + # This breaks the override pattern. + # In case this turns out to be a problem, we can still add more magic + else pkgs.runCommandLocal name {} '' + ln -s ${inner}/bin/${name} $out + ''; + + # Like writeScript but the first line is a shebang to bash + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeBash "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeBash "example" + # { + # makeWrapperArgs = [ + # "--prefix" "PATH" ":" "${pkgs.hello}/bin" + # ]; + # } + # '' + # hello + # '' + writeBash = name: argsOrScript: + if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript + then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.bash}"; }) name + else makeScriptWriter { interpreter = "${lib.getExe pkgs.bash}"; } name argsOrScript; + + # Like writeScriptBin but the first line is a shebang to bash + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeBashBin "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeBashBin "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeBashBin = name: + writeBash "/bin/${name}"; + + # Like writeScript but the first line is a shebang to dash + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeDash "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeDash "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeDash = name: argsOrScript: + if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript + then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.dash}"; }) name + else makeScriptWriter { interpreter = "${lib.getExe pkgs.dash}"; } name argsOrScript; + + # Like writeScriptBin but the first line is a shebang to dash + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeDashBin "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeDashBin "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeDashBin = name: + writeDash "/bin/${name}"; + + # Like writeScript but the first line is a shebang to fish + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeFish "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeFish "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeFish = name: argsOrScript: + if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript + then makeScriptWriter (argsOrScript // { + interpreter = "${lib.getExe pkgs.fish} --no-config"; + check = "${lib.getExe pkgs.fish} --no-config --no-execute"; # syntax check only + }) name + else makeScriptWriter { + interpreter = "${lib.getExe pkgs.fish} --no-config"; + check = "${lib.getExe pkgs.fish} --no-config --no-execute"; # syntax check only + } name argsOrScript; + + # Like writeScriptBin but the first line is a shebang to fish + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeFishBin "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeFishBin "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeFishBin = name: + writeFish "/bin/${name}"; + + # writeHaskell takes a name, an attrset with libraries and haskell version (both optional) + # and some haskell source code and returns an executable. + # + # Example: + # writeHaskell "missiles" { libraries = [ pkgs.haskellPackages.acme-missiles ]; } '' + # import Acme.Missiles + # + # main = launchMissiles + # ''; + writeHaskell = name: { + ghc ? pkgs.ghc, + ghcArgs ? [], + libraries ? [], + makeWrapperArgs ? [], + strip ? true, + threadedRuntime ? true, + }: + let + appendIfNotSet = el: list: if elem el list then list else list ++ [ el ]; + ghcArgs' = if threadedRuntime then appendIfNotSet "-threaded" ghcArgs else ghcArgs; + + in makeBinWriter { + compileScript = '' + cp $contentPath tmp.hs + ${(ghc.withPackages (_: libraries ))}/bin/ghc ${lib.escapeShellArgs ghcArgs'} tmp.hs + mv tmp $out + ''; + inherit makeWrapperArgs strip; + } name; + + # writeHaskellBin takes the same arguments as writeHaskell but outputs a directory (like writeScriptBin) + writeHaskellBin = name: + writeHaskell "/bin/${name}"; + + # Like writeScript but the first line is a shebang to nu + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeNu "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeNu "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeNu = name: argsOrScript: + if lib.isAttrs argsOrScript && ! lib.isDerivation argsOrScript + then makeScriptWriter (argsOrScript // { interpreter = "${lib.getExe pkgs.nushell} --no-config-file"; }) name + else makeScriptWriter { interpreter = "${lib.getExe pkgs.nushell} --no-config-file"; } name argsOrScript; + + + # Like writeScriptBin but the first line is a shebang to nu + # + # Can be called with or without extra arguments. + # + # Example without arguments: + # writeNuBin "example" '' + # echo hello world + # '' + # + # Example with arguments: + # writeNuBin "example" + # { + # makeWrapperArgs = [ + # "--prefix", "PATH", ":", "${pkgs.hello}/bin", + # ]; + # } + # '' + # hello + # '' + writeNuBin = name: + writeNu "/bin/${name}"; + + # makeRubyWriter takes ruby and compatible rubyPackages and produces ruby script writer, + # If any libraries are specified, ruby.withPackages is used as interpreter, otherwise the "bare" ruby is used. + makeRubyWriter = ruby: rubyPackages: buildRubyPackages: name: { libraries ? [], ... } @ args: + makeScriptWriter ( + (builtins.removeAttrs args ["libraries"]) + // { + interpreter = + if libraries == [] + then "${ruby}/bin/ruby" + else "${(ruby.withPackages (ps: libraries))}/bin/ruby"; + # Rubocop doesn't seem to like running in this fashion. + #check = (writeDash "rubocop.sh" '' + # exec ${lib.getExe buildRubyPackages.rubocop} "$1" + #''); + } + ) name; + + # Like writeScript but the first line is a shebang to ruby + # + # Example: + # writeRuby "example" { libraries = [ pkgs.rubyPackages.git ]; } '' + # puts "hello world" + # '' + writeRuby = makeRubyWriter pkgs.ruby pkgs.rubyPackages buildPackages.rubyPackages; + + writeRubyBin = name: + writeRuby "/bin/${name}"; + + # makeLuaWriter takes lua and compatible luaPackages and produces lua script writer, + # which validates the script with luacheck at build time. If any libraries are specified, + # lua.withPackages is used as interpreter, otherwise the "bare" lua is used. + makeLuaWriter = lua: luaPackages: buildLuaPackages: name: { libraries ? [], ... } @ args: + makeScriptWriter ( + (builtins.removeAttrs args ["libraries"]) + // { + interpreter = lua.interpreter; + # if libraries == [] + # then lua.interpreter + # else (lua.withPackages (ps: libraries)).interpreter + # This should support packages! I just cant figure out why some dependency collision happens whenever I try to run this. + check = (writeDash "luacheck.sh" '' + exec ${buildLuaPackages.luacheck}/bin/luacheck "$1" + ''); + } + ) name; + + # writeLua takes a name an attributeset with libraries and some lua source code and + # returns an executable (should also work with luajit) + # + # Example: + # writeLua "test_lua" { libraries = [ pkgs.luaPackages.say ]; } '' + # s = require("say") + # s:set_namespace("en") + # + # s:set('money', 'I have %s dollars') + # s:set('wow', 'So much money!') + # + # print(s('money', {1000})) -- I have 1000 dollars + # + # s:set_namespace("fr") -- switch to french! + # s:set('wow', "Tant d'argent!") + # + # print(s('wow')) -- Tant d'argent! + # s:set_namespace("en") -- switch back to english! + # print(s('wow')) -- So much money! + # '' + writeLua = makeLuaWriter pkgs.lua pkgs.luaPackages buildPackages.luaPackages; + + writeLuaBin = name: + writeLua "/bin/${name}"; + + writeRust = name: { + makeWrapperArgs ? [], + rustc ? pkgs.rustc, + rustcArgs ? [], + strip ? true, + }: + let + darwinArgs = lib.optionals stdenv.isDarwin [ "-L${lib.getLib libiconv}/lib" ]; + in + makeBinWriter { + compileScript = '' + cp "$contentPath" tmp.rs + PATH=${lib.makeBinPath [pkgs.gcc]} ${rustc}/bin/rustc ${lib.escapeShellArgs rustcArgs} ${lib.escapeShellArgs darwinArgs} -o "$out" tmp.rs + ''; + inherit makeWrapperArgs strip; + } name; + + writeRustBin = name: + writeRust "/bin/${name}"; + + # writeJS takes a name an attributeset with libraries and some JavaScript sourcecode and + # returns an executable + # + # Example: + # writeJS "example" { libraries = [ pkgs.nodePackages.uglify-js ]; } '' + # var UglifyJS = require("uglify-js"); + # var code = "function add(first, second) { return first + second; }"; + # var result = UglifyJS.minify(code); + # console.log(result.code); + # '' + writeJS = name: { libraries ? [] }: content: + let + node-env = pkgs.buildEnv { + name = "node"; + paths = libraries; + pathsToLink = [ + "/lib/node_modules" + ]; + }; + in writeDash name '' + export NODE_PATH=${node-env}/lib/node_modules + exec ${lib.getExe pkgs.nodejs} ${pkgs.writeText "js" content} "$@" + ''; + + # writeJSBin takes the same arguments as writeJS but outputs a directory (like writeScriptBin) + writeJSBin = name: + writeJS "/bin/${name}"; + + awkFormatNginx = builtins.toFile "awkFormat-nginx.awk" '' + awk -f + {sub(/^[ \t]+/,"");idx=0} + /\{/{ctx++;idx=1} + /\}/{ctx--} + {id="";for(i=idx;i $out + gixy $out + ''; + + # writePerl takes a name an attributeset with libraries and some perl sourcecode and + # returns an executable + # + # Example: + # writePerl "example" { libraries = [ pkgs.perlPackages.boolean ]; } '' + # use boolean; + # print "Howdy!\n" if true; + # '' + writePerl = name: { libraries ? [], ... } @ args: + makeScriptWriter ( + (builtins.removeAttrs args ["libraries"]) + // { + interpreter = "${lib.getExe (pkgs.perl.withPackages (p: libraries))}"; + } + ) name; + + # writePerlBin takes the same arguments as writePerl but outputs a directory (like writeScriptBin) + writePerlBin = name: + writePerl "/bin/${name}"; + + # makePythonWriter takes python and compatible pythonPackages and produces python script writer, + # which validates the script with flake8 at build time. If any libraries are specified, + # python.withPackages is used as interpreter, otherwise the "bare" python is used. + makePythonWriter = python: pythonPackages: buildPythonPackages: name: { libraries ? [], flakeIgnore ? [], ... } @ args: + let + ignoreAttribute = optionalString (flakeIgnore != []) "--ignore ${concatMapStringsSep "," escapeShellArg flakeIgnore}"; + in + makeScriptWriter + ( + (builtins.removeAttrs args ["libraries" "flakeIgnore"]) + // { + interpreter = + if pythonPackages != pkgs.pypy2Packages || pythonPackages != pkgs.pypy3Packages then + if libraries == [] + then python.interpreter + else (python.withPackages (ps: libraries)).interpreter + else python.interpreter + ; + check = optionalString python.isPy3k (writeDash "pythoncheck.sh" '' + exec ${buildPythonPackages.flake8}/bin/flake8 --show-source ${ignoreAttribute} "$1" + ''); + } + ) + name; + + # writePyPy2 takes a name an attributeset with libraries and some pypy2 sourcecode and + # returns an executable + # + # Example: + # writePyPy2 "test_pypy2" { libraries = [ pkgs.pypy2Packages.enum ]; } '' + # from enum import Enum + # + # class Test(Enum): + # a = "success" + # + # print Test.a + # '' + writePyPy2 = makePythonWriter pkgs.pypy2 pkgs.pypy2Packages buildPackages.pypy2Packages; + + # writePyPy2Bin takes the same arguments as writePyPy2 but outputs a directory (like writeScriptBin) + writePyPy2Bin = name: + writePyPy2 "/bin/${name}"; + + # writePython3 takes a name an attributeset with libraries and some python3 sourcecode and + # returns an executable + # + # Example: + # writePython3 "test_python3" { libraries = [ pkgs.python3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.load(""" + # - test: success + # """) + # print(y[0]['test']) + # '' + writePython3 = makePythonWriter pkgs.python3 pkgs.python3Packages buildPackages.python3Packages; + + # writePython3Bin takes the same arguments as writePython3 but outputs a directory (like writeScriptBin) + writePython3Bin = name: + writePython3 "/bin/${name}"; + + # writePyPy3 takes a name an attributeset with libraries and some pypy3 sourcecode and + # returns an executable + # + # Example: + # writePyPy3 "test_pypy3" { libraries = [ pkgs.pypy3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.load(""" + # - test: success + # """) + # print(y[0]['test']) + # '' + writePyPy3 = makePythonWriter pkgs.pypy3 pkgs.pypy3Packages buildPackages.pypy3Packages; + + # writePyPy3Bin takes the same arguments as writePyPy3 but outputs a directory (like writeScriptBin) + writePyPy3Bin = name: + writePyPy3 "/bin/${name}"; + + + makeFSharpWriter = { dotnet-sdk ? pkgs.dotnet-sdk, fsi-flags ? "", libraries ? _: [], ... } @ args: nameOrPath: + let + fname = last (builtins.split "/" nameOrPath); + path = if strings.hasSuffix ".fsx" nameOrPath then nameOrPath else "${nameOrPath}.fsx"; + _nugetDeps = mkNugetDeps { name = "${fname}-nuget-deps"; nugetDeps = libraries; }; + + nuget-source = mkNugetSource { + name = "${fname}-nuget-source"; + description = "A Nuget source with the dependencies for ${fname}"; + deps = [ _nugetDeps ]; + }; + + fsi = writeBash "fsi" '' + export HOME=$NIX_BUILD_TOP/.home + export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + export DOTNET_NOLOGO=1 + script="$1"; shift + ${lib.getExe dotnet-sdk} fsi --quiet --nologo --readline- ${fsi-flags} "$@" < "$script" + ''; + + in content: makeScriptWriter ( + (builtins.removeAttrs args ["dotnet-sdk" "fsi-flags" "libraries"]) + // { + interpreter = fsi; + } + ) path + '' + #i "nuget: ${nuget-source}/lib" + ${ content } + exit 0 + ''; + + writeFSharp = + makeFSharpWriter {}; + + writeFSharpBin = name: + writeFSharp "/bin/${name}"; +} diff --git a/pkgs/build-support/writers/test.nix b/pkgs/build-support/writers/test.nix new file mode 100644 index 0000000..656d127 --- /dev/null +++ b/pkgs/build-support/writers/test.nix @@ -0,0 +1,419 @@ +{ haskellPackages +, lib +, nodePackages +, perlPackages +, python3Packages +, runCommand +, testers +, writers +, writeText +}: + +# If you are reading this, you can test these writers by running: nix-build . -A tests.writers + +let + inherit (lib) getExe recurseIntoAttrs; + + inherit (writers) + makeFSharpWriter + writeBash + writeBashBin + writeDash + writeDashBin + writeFish + writeFishBin + writeFSharp + writeHaskell + writeHaskellBin + writeJS + writeJSBin + writeJSON + writeLua + writeNu + writePerl + writePerlBin + writePyPy3 + writePython3 + writePython3Bin + writeRuby + writeRust + writeRustBin + writeText + writeTOML + writeYAML + ; + + expectSuccess = test: + runCommand "run-${test.name}" {} '' + if [[ "$(${test})" != success ]]; then + echo 'test ${test.name} failed' + exit 1 + fi + + touch $out + ''; + + expectSuccessBin = test: + runCommand "run-${test.name}" {} '' + if [[ "$(${getExe test})" != success ]]; then + echo 'test ${test.name} failed' + exit 1 + fi + + touch $out + ''; + + expectDataEqual = { file, expected }: + let + expectedFile = writeText "${file.name}-expected" expected; + in + testers.testEqualContents { expected = expectedFile; actual = file; assertion = "${file.name} matches"; }; +in +recurseIntoAttrs { + bin = recurseIntoAttrs { + bash = expectSuccessBin (writeBashBin "test-writers-bash-bin" '' + if [[ "test" == "test" ]]; then echo "success"; fi + ''); + + dash = expectSuccessBin (writeDashBin "test-writers-dash-bin" '' + test '~' = '~' && echo 'success' + ''); + + fish = expectSuccessBin (writeFishBin "test-writers-fish-bin" '' + if test "test" = "test" + echo "success" + end + ''); + + rust = expectSuccessBin (writeRustBin "test-writers-rust-bin" {} '' + fn main(){ + println!("success") + } + ''); + + haskell = expectSuccessBin (writeHaskellBin "test-writers-haskell-bin" { libraries = [ haskellPackages.acme-default ]; } '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + ''); + + js = expectSuccessBin (writeJSBin "test-writers-js-bin" { libraries = [ nodePackages.semver ]; } '' + var semver = require('semver'); + + if (semver.valid('1.2.3')) { + console.log('success') + } else { + console.log('fail') + } + ''); + + perl = expectSuccessBin (writePerlBin "test-writers-perl-bin" { libraries = [ perlPackages.boolean ]; } '' + use boolean; + print "success\n" if true; + ''); + + python3 = expectSuccessBin (writePython3Bin "test-writers-python3-bin" { libraries = [ python3Packages.pyyaml ]; } '' + import yaml + + y = yaml.safe_load(""" + - test: success + """) + print(y[0]['test']) + ''); + + # Commented out because of this issue: https://github.com/NixOS/nixpkgs/issues/39356 + + #pypy2 = expectSuccessBin (writePyPy2Bin "test-writers-pypy2-bin" { libraries = [ pypy2Packages.enum ]; } '' + # from enum import Enum + # + # class Test(Enum): + # a = "success" + # + # print Test.a + #''); + + #pypy3 = expectSuccessBin (writePyPy3Bin "test-writers-pypy3-bin" { libraries = [ pypy3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.safe_load(""" + # - test: success + # """) + # print(y[0]['test']) + #''); + + # Could not test this because of external package issues :( + #lua = writeLuaBin "test-writers-lua-bin" { libraries = [ pkgs.luaPackages.say ]; } '' + # s = require("say") + # s:set_namespace("en") + + # s:set('money', 'I have %s dollars') + # s:set('wow', 'So much money!') + + # print(s('money', {1000})) -- I have 1000 dollars + + # s:set_namespace("fr") -- switch to french! + # s:set('wow', "Tant d'argent!") + + # print(s('wow')) -- Tant d'argent! + # s:set_namespace("en") -- switch back to english! + # print(s('wow')) -- So much money! + #''; + + #ruby = expectSuccessBin (writeRubyBin "test-writers-ruby-bin" { libraries = [ rubyPackages.rubocop ]; } '' + #puts "This should work!" + #''); + }; + + simple = recurseIntoAttrs { + bash = expectSuccess (writeBash "test-writers-bash" '' + if [[ "test" == "test" ]]; then echo "success"; fi + ''); + + dash = expectSuccess (writeDash "test-writers-dash" '' + test '~' = '~' && echo 'success' + ''); + + fish = expectSuccess (writeFish "test-writers-fish" '' + if test "test" = "test" + echo "success" + end + ''); + + nu = expectSuccess (writeNu "test-writers-nushell" '' + echo "success" + ''); + + haskell = expectSuccess (writeHaskell "test-writers-haskell" { libraries = [ haskellPackages.acme-default ]; } '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + ''); + + js = expectSuccess (writeJS "test-writers-js" { libraries = [ nodePackages.semver ]; } '' + var semver = require('semver'); + + if (semver.valid('1.2.3')) { + console.log('success') + } else { + console.log('fail') + } + ''); + + perl = expectSuccess (writePerl "test-writers-perl" { libraries = [ perlPackages.boolean ]; } '' + use boolean; + print "success\n" if true; + ''); + + python3 = expectSuccess (writePython3 "test-writers-python3" { libraries = [ python3Packages.pyyaml ]; } '' + import yaml + + y = yaml.safe_load(""" + - test: success + """) + print(y[0]['test']) + ''); + + # Commented out because of this issue: https://github.com/NixOS/nixpkgs/issues/39356 + + #pypy2 = expectSuccessBin (writePyPy2Bin "test-writers-pypy2-bin" { libraries = [ pypy2Packages.enum ]; } '' + # from enum import Enum + # + # class Test(Enum): + # a = "success" + # + # print Test.a + #''); + + #pypy3 = expectSuccessBin (writePyPy3Bin "test-writers-pypy3-bin" { libraries = [ pypy3Packages.pyyaml ]; } '' + # import yaml + # + # y = yaml.safe_load(""" + # - test: success + # """) + # print(y[0]['test']) + #''); + + fsharp = expectSuccess (makeFSharpWriter { + libraries = { fetchNuGet }: [ + (fetchNuGet { pname = "FSharp.SystemTextJson"; version = "0.17.4"; sha256 = "1bplzc9ybdqspii4q28l8gmfvzpkmgq5l1hlsiyg2h46w881lwg2"; }) + (fetchNuGet { pname = "System.Text.Json"; version = "4.6.0"; sha256 = "0ism236hwi0k6axssfq58s1d8lihplwiz058pdvl8al71hagri39"; }) + ]; + } "test-writers-fsharp" '' + + #r "nuget: FSharp.SystemTextJson, 0.17.4" + + module Json = + open System.Text.Json + open System.Text.Json.Serialization + let options = JsonSerializerOptions() + options.Converters.Add(JsonFSharpConverter()) + let serialize<'a> (o: 'a) = JsonSerializer.Serialize<'a>(o, options) + let deserialize<'a> (str: string) = JsonSerializer.Deserialize<'a>(str, options) + + type Letter = A | B + let a = {| Hello = Some "World"; Letter = A |} + if a |> Json.serialize |> Json.deserialize |> (=) a + then "success" + else "failed" + |> printfn "%s" + ''); + + #pypy2NoLibs = expectSuccess (writePyPy2 "test-writers-pypy2-no-libs" {} '' + # print("success") + #''); + + python3NoLibs = expectSuccess (writePython3 "test-writers-python3-no-libs" {} '' + print("success") + ''); + + pypy3NoLibs = expectSuccess (writePyPy3 "test-writers-pypy3-no-libs" {} '' + print("success") + ''); + + fsharpNoNugetDeps = expectSuccess (writeFSharp "test-writers-fsharp-no-nuget-deps" '' + printfn "success" + ''); + + luaNoLibs = expectSuccess (writeLua "test-writers-lua-no-libs" {} '' + print("success") + ''); + + rubyNoLibs = expectSuccess (writeRuby "test-writers-ruby-no-libs" {} '' + puts "success" + ''); + }; + + path = recurseIntoAttrs { + bash = expectSuccess (writeBash "test-writers-bash-path" (writeText "test" '' + if [[ "test" == "test" ]]; then echo "success"; fi + '')); + + haskell = expectSuccess (writeHaskell "test-writers-haskell-path" { libraries = [ haskellPackages.acme-default ]; } (writeText "test" '' + import Data.Default + + int :: Int + int = def + + main :: IO () + main = case int of + 18871 -> putStrLn $ id "success" + _ -> print "fail" + '')); + }; + + data = { + json = expectDataEqual { + file = writeJSON "data.json" { hello = "world"; }; + expected = '' + { + "hello": "world" + } + ''; + }; + + toml = expectDataEqual { + file = writeTOML "data.toml" { hello = "world"; }; + expected = '' + hello = "world" + ''; + }; + + yaml = expectDataEqual { + file = writeYAML "data.yaml" { hello = "world"; }; + expected = "hello: world\n"; + }; + }; + + wrapping = recurseIntoAttrs { + bash-bin = expectSuccessBin ( + writeBashBin "test-writers-wrapping-bash-bin" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + if [[ "$ThaigerSprint" == "Thailand" ]]; then + echo "success" + fi + '' + ); + + bash = expectSuccess ( + writeBash "test-writers-wrapping-bash" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + if [[ "$ThaigerSprint" == "Thailand" ]]; then + echo "success" + fi + '' + ); + + python = expectSuccess ( + writePython3 "test-writers-wrapping-python" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + import os + + if os.environ.get("ThaigerSprint") == "Thailand": + print("success") + '' + ); + + rust = expectSuccess ( + writeRust "test-writers-wrapping-rust" + { + makeWrapperArgs = [ + "--set" + "ThaigerSprint" + "Thailand" + ]; + } + '' + fn main(){ + if std::env::var("ThaigerSprint").unwrap() == "Thailand" { + println!("success") + } + } + '' + ); + + no-empty-wrapper = let + bin = writeBashBin "bin" { makeWrapperArgs = []; } ''true''; + in runCommand "run-test-writers-wrapping-no-empty-wrapper" {} '' + ls -A ${bin}/bin + if [ $(ls -A ${bin}/bin | wc -l) -eq 1 ]; then + touch $out + else + echo "Error: Empty wrapper was created" >&2 + exit 1 + fi + ''; + }; +} diff --git a/pkgs/by-name/aa/aalib/clang.patch b/pkgs/by-name/aa/aalib/clang.patch new file mode 100644 index 0000000..5f8fa80 --- /dev/null +++ b/pkgs/by-name/aa/aalib/clang.patch @@ -0,0 +1,74 @@ +diff -ur a/configure b/configure +--- a/configure 2001-04-26 10:44:54.000000000 -0400 ++++ b/configure 2023-10-21 23:19:52.941161475 -0400 +@@ -1005,7 +1005,7 @@ + #line 1006 "configure" + #include "confdefs.h" + +-main(){return(0);} ++int main(){return(0);} + EOF + if { (eval echo configure:1011: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes +diff -ur a/src/aafire.c b/src/aafire.c +--- a/src/aafire.c 2001-04-26 11:30:03.000000000 -0400 ++++ b/src/aafire.c 2023-10-21 23:46:54.478750904 -0400 +@@ -1,3 +1,4 @@ ++#include + #include + #include "aalib.h" + +diff -ur a/src/aainfo.c b/src/aainfo.c +--- a/src/aainfo.c 2001-04-26 10:37:31.000000000 -0400 ++++ b/src/aainfo.c 2023-10-21 23:31:54.141133353 -0400 +@@ -1,4 +1,4 @@ +- ++#include + #include "aalib.h" + #include "aaint.h" + int main(int argc, char **argv) +diff -ur a/src/aakbdreg.c b/src/aakbdreg.c +--- a/src/aakbdreg.c 2023-10-21 23:19:00.787207960 -0400 ++++ b/src/aakbdreg.c 2023-10-21 23:23:49.667253541 -0400 +@@ -1,4 +1,5 @@ + #include ++#include + #include "config.h" + #include "aalib.h" + #include "aaint.h" +diff -ur a/src/aamoureg.c b/src/aamoureg.c +--- a/src/aamoureg.c 2023-10-21 23:19:00.787725591 -0400 ++++ b/src/aamoureg.c 2023-10-21 23:26:51.821477807 -0400 +@@ -1,4 +1,5 @@ + #include ++#include + #include "config.h" + #include "aalib.h" + #include "aaint.h" +diff -ur a/src/aaregist.c b/src/aaregist.c +--- a/src/aaregist.c 2023-10-21 23:19:00.788130179 -0400 ++++ b/src/aaregist.c 2023-10-21 23:19:38.929729034 -0400 +@@ -1,4 +1,5 @@ + #include ++#include + #include "config.h" + #include "aalib.h" + #include "aaint.h" +diff -ur a/src/aasavefont.c b/src/aasavefont.c +--- a/src/aasavefont.c 2001-04-26 10:37:31.000000000 -0400 ++++ b/src/aasavefont.c 2023-10-21 23:51:09.216521714 -0400 +@@ -1,3 +1,5 @@ ++#include ++#include + #include "aalib.h" + int main(int argc, char **argv) + { +diff -ur a/src/aatest.c b/src/aatest.c +--- a/src/aatest.c 2001-04-26 10:37:31.000000000 -0400 ++++ b/src/aatest.c 2023-10-21 23:43:16.758422704 -0400 +@@ -1,3 +1,5 @@ ++#include ++#include + #include "aalib.h" + int main(int argc, char **argv) + { diff --git a/pkgs/by-name/aa/aalib/darwin.patch b/pkgs/by-name/aa/aalib/darwin.patch new file mode 100644 index 0000000..94b548b --- /dev/null +++ b/pkgs/by-name/aa/aalib/darwin.patch @@ -0,0 +1,106 @@ +diff --git a/src/aaedit.c b/src/aaedit.c +index 09534d2..2ea52f9 100644 +--- a/src/aaedit.c ++++ b/src/aaedit.c +@@ -1,6 +1,6 @@ + #include + #include +-#include ++#include + #include "aalib.h" + #include "aaint.h" + static void aa_editdisplay(struct aa_edit *e) + +diff --git a/src/aakbdreg.c b/src/aakbdreg.c +index def65fe..f4f8efb 100644 +--- a/src/aakbdreg.c ++++ b/src/aakbdreg.c +@@ -1,4 +1,4 @@ +-#include ++#include + #include + #include "config.h" + #include "aalib.h" +diff --git a/src/aalib.c b/src/aalib.c +index 11fecc8..e3063b4 100644 +--- a/src/aalib.c ++++ b/src/aalib.c +@@ -1,6 +1,6 @@ + #include + #include +-#include ++#include + #include "aalib.h" + #include "aaint.h" + +diff --git a/src/aamoureg.c b/src/aamoureg.c +index 0380828..bb55fe3 100644 +--- a/src/aamoureg.c ++++ b/src/aamoureg.c +@@ -1,4 +1,4 @@ +-#include ++#include + #include + #include "config.h" + #include "aalib.h" +diff --git a/src/aarec.c b/src/aarec.c +index 70f4ebc..ee43e8a 100644 +--- a/src/aarec.c ++++ b/src/aarec.c +@@ -1,5 +1,5 @@ + #include +-#include ++#include + #include "aalib.h" + #include "aaint.h" + aa_linkedlist *aa_kbdrecommended = NULL, *aa_mouserecommended = NULL, +diff --git a/src/aaregist.c b/src/aaregist.c +index 54abec0..765155e 100644 +--- a/src/aaregist.c ++++ b/src/aaregist.c +@@ -1,4 +1,4 @@ +-#include ++#include + #include + #include "config.h" + #include "aalib.h" +diff --git a/src/aax.c b/src/aax.c +index adcbd82..36e3294 100644 +--- a/src/aax.c ++++ b/src/aax.c +@@ -1,4 +1,3 @@ +-#include + #include + #include + #include +diff --git a/src/aaxkbd.c b/src/aaxkbd.c +index 30d5903..da2248d 100644 +--- a/src/aaxkbd.c ++++ b/src/aaxkbd.c +@@ -1,4 +1,3 @@ +-#include + #include + #include + #include +diff --git a/src/aaxmouse.c b/src/aaxmouse.c +index 9935b03..7e725ad 100644 +--- a/src/aaxmouse.c ++++ b/src/aaxmouse.c +@@ -1,4 +1,3 @@ +-#include + #include + #include + #include +diff --git a/aalib.m4 b/aalib.m4 +index c40b8db..991fbda 100644 +--- a/aalib.m4 ++++ b/aalib.m4 +@@ -9,7 +9,7 @@ + dnl AM_PATH_AALIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) + dnl Test for AALIB, and define AALIB_CFLAGS and AALIB_LIBS + dnl +-AC_DEFUN(AM_PATH_AALIB, ++AC_DEFUN([AM_PATH_AALIB], + [dnl + dnl Get the cflags and libraries from the aalib-config script + dnl diff --git a/pkgs/by-name/aa/aalib/default.nix b/pkgs/by-name/aa/aalib/default.nix new file mode 100644 index 0000000..903364e --- /dev/null +++ b/pkgs/by-name/aa/aalib/default.nix @@ -0,0 +1,43 @@ +{lib, stdenv, fetchurl, ncurses, automake}: + +stdenv.mkDerivation rec { + pname = "aalib"; + version = "1.4rc5"; + + src = fetchurl { + url = "mirror://sourceforge/aa-project/aalib-${version}.tar.gz"; + sha256 = "1vkh19gb76agvh4h87ysbrgy82hrw88lnsvhynjf4vng629dmpgv"; + }; + + outputs = [ "bin" "dev" "out" "man" "info" ]; + setOutputFlags = false; # Doesn't support all the flags + + patches = [ ./clang.patch ] # Fix implicit `int` on `main` error with newer versions of clang + ++ lib.optionals stdenv.isDarwin [ ./darwin.patch ]; + + # The fuloong2f is not supported by aalib still + preConfigure = '' + cp ${automake}/share/automake*/config.{sub,guess} . + configureFlagsArray+=( + "--bindir=$bin/bin" + "--includedir=$dev/include" + "--libdir=$out/lib" + ) + ''; + + buildInputs = [ ncurses ]; + + configureFlags = [ "--without-x" "--with-ncurses=${ncurses.dev}" ]; + + postInstall = '' + mkdir -p $dev/bin + mv $bin/bin/aalib-config $dev/bin/aalib-config + substituteInPlace $out/lib/libaa.la --replace "${ncurses.dev}/lib" "${ncurses.out}/lib" + ''; + + meta = { + description = "ASCII art graphics library"; + platforms = lib.platforms.unix; + license = lib.licenses.lgpl2; + }; +} diff --git a/pkgs/by-name/ab/abseil-cpp/202103.nix b/pkgs/by-name/ab/abseil-cpp/202103.nix new file mode 100644 index 0000000..5929449 --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202103.nix @@ -0,0 +1,63 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, cmake +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation rec { + pname = "abseil-cpp"; + version = "20210324.2"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = version; + sha256 = "sha256-fcxPhuI2eL/fnd6nT11p8DpUNwGNaXZmd03yOiZcOT0="; + }; + + patches = [ + # Use CMAKE_INSTALL_FULL_{LIBDIR,INCLUDEDIR} + # https://github.com/abseil/abseil-cpp/pull/963 + (fetchpatch { + url = "https://github.com/abseil/abseil-cpp/commit/5bfa70c75e621c5d5ec095c8c4c0c050dcb2957e.patch"; + sha256 = "0nhjxqfxpi2pkfinnqvd5m4npf9l1kg39mjx9l3087ajhadaywl5"; + }) + + # Bacport gcc-13 fix: + # https://github.com/abseil/abseil-cpp/pull/1187 + (fetchpatch { + name = "gcc-13.patch"; + url = "https://github.com/abseil/abseil-cpp/commit/36a4b073f1e7e02ed7d1ac140767e36f82f09b7c.patch"; + hash = "sha256-aA7mwGEtv/cQINcawjkukmCvfNuqwUeDFssSiNKPdgg="; + }) + ] ++ lib.optionals stdenv.hostPlatform.isLoongArch64 [ + # https://github.com/abseil/abseil-cpp/pull/1110 + (fetchpatch { + url = "https://github.com/abseil/abseil-cpp/commit/808bc202fc13e85a7948db0d7fb58f0f051200b1.patch"; + sha256 = "sha256-ayY/aV/xWOdEyFSDqV7B5WDGvZ0ASr/aeBeYwP5RZVc="; + }) + ] ++ lib.optionals stdenv.isDarwin [ + # Don’t propagate the path to CoreFoundation. Otherwise, it’s impossible to build packages + # that require a different SDK other than the default one. + ./cmake-core-foundation.patch + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.andersk ]; + }; +} diff --git a/pkgs/by-name/ab/abseil-cpp/202111.nix b/pkgs/by-name/ab/abseil-cpp/202111.nix new file mode 100644 index 0000000..0c1a173 --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202111.nix @@ -0,0 +1,42 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, cmake +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation rec { + pname = "abseil-cpp"; + version = "20211102.0"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = version; + sha256 = "sha256-sSXT6D4JSrk3dA7kVaxfKkzOMBpqXQb0WbMYWG+nGwk="; + }; + + patches = lib.optionals stdenv.isDarwin [ + # Don’t propagate the path to CoreFoundation. Otherwise, it’s impossible to build packages + # that require a different SDK other than the default one. + ./cmake-core-foundation.patch + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.andersk ]; + }; +} diff --git a/pkgs/by-name/ab/abseil-cpp/202206.nix b/pkgs/by-name/ab/abseil-cpp/202206.nix new file mode 100644 index 0000000..5dda078 --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202206.nix @@ -0,0 +1,41 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation rec { + pname = "abseil-cpp"; + version = "20220623.2"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = "refs/tags/${version}"; + hash = "sha256-ma8QJfSySsk2XVLA0rhwYJMQx+6HxMFgub6gi5mDrLI="; + }; + + patches = lib.optionals stdenv.isDarwin [ + # Don’t propagate the path to CoreFoundation. Otherwise, it’s impossible to build packages + # that require a different SDK other than the default one. + ./cmake-core-foundation.patch + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.andersk ]; + }; +} diff --git a/pkgs/by-name/ab/abseil-cpp/202301.nix b/pkgs/by-name/ab/abseil-cpp/202301.nix new file mode 100644 index 0000000..b2d4f43 --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202301.nix @@ -0,0 +1,48 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, gtest +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "abseil-cpp"; + version = "20230125.4"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = "refs/tags/${finalAttrs.version}"; + hash = "sha256-7C/QIXYRyUyNVVE0tqmv8b5g/uWc58iBI5jzdtddQ+U="; + }; + + patches = lib.optionals stdenv.isDarwin [ + # Don’t propagate the path to CoreFoundation. Otherwise, it’s impossible to build packages + # that require a different SDK other than the default one. + ./cmake-core-foundation.patch + ]; + + cmakeFlags = [ + "-DABSL_BUILD_TEST_HELPERS=ON" + "-DABSL_USE_EXTERNAL_GOOGLETEST=ON" + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + strictDeps = true; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ gtest ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.andersk ]; + }; +}) diff --git a/pkgs/by-name/ab/abseil-cpp/202308.nix b/pkgs/by-name/ab/abseil-cpp/202308.nix new file mode 100644 index 0000000..f3aac7d --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202308.nix @@ -0,0 +1,42 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, gtest +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "abseil-cpp"; + version = "20230802.2"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = "refs/tags/${finalAttrs.version}"; + hash = "sha256-wW7dCqiiHyBHiizyV0+M6p17itwTpzHv/T0/mcXyYWE="; + }; + + cmakeFlags = [ + "-DABSL_BUILD_TEST_HELPERS=ON" + "-DABSL_USE_EXTERNAL_GOOGLETEST=ON" + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + strictDeps = true; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ gtest ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.andersk ]; + }; +}) diff --git a/pkgs/by-name/ab/abseil-cpp/202401.nix b/pkgs/by-name/ab/abseil-cpp/202401.nix new file mode 100644 index 0000000..73e663b --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/202401.nix @@ -0,0 +1,42 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, gtest +, static ? stdenv.hostPlatform.isStatic +, cxxStandard ? null +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "abseil-cpp"; + version = "20240116.2"; + + src = fetchFromGitHub { + owner = "abseil"; + repo = "abseil-cpp"; + rev = "refs/tags/${finalAttrs.version}"; + hash = "sha256-eA2/dZpNOlex1O5PNa3XSZhpMB3AmaIoHzVDI9TD/cg="; + }; + + cmakeFlags = [ + "-DABSL_BUILD_TEST_HELPERS=ON" + "-DABSL_USE_EXTERNAL_GOOGLETEST=ON" + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals (cxxStandard != null) [ + "-DCMAKE_CXX_STANDARD=${cxxStandard}" + ]; + + strictDeps = true; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ gtest ]; + + meta = with lib; { + description = "An open-source collection of C++ code designed to augment the C++ standard library"; + homepage = "https://abseil.io/"; + license = licenses.asl20; + platforms = platforms.all; + maintainers = [ maintainers.GaetanLepage ]; + }; +}) diff --git a/pkgs/by-name/ab/abseil-cpp/cmake-core-foundation.patch b/pkgs/by-name/ab/abseil-cpp/cmake-core-foundation.patch new file mode 100644 index 0000000..61b5745 --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/cmake-core-foundation.patch @@ -0,0 +1,12 @@ +diff -ur a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt +--- a/absl/time/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ b/absl/time/CMakeLists.txt 2023-10-30 21:50:32.639061785 -0400 +@@ -55,7 +55,7 @@ + ) + + if(APPLE) +- find_library(CoreFoundation CoreFoundation) ++ set(CoreFoundation "-framework CoreFoundation") + endif() + + absl_cc_library( diff --git a/pkgs/by-name/ab/abseil-cpp/packages.nix b/pkgs/by-name/ab/abseil-cpp/packages.nix new file mode 100644 index 0000000..beca4cb --- /dev/null +++ b/pkgs/by-name/ab/abseil-cpp/packages.nix @@ -0,0 +1,37 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + abseil-cpp_202103 = callPackage ./202103.nix { + # If abseil-cpp doesn’t have a deployment target of 10.13+, arrow-cpp crashes in libgrpc.dylib. + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; + abseil-cpp_202206 = callPackage ./202206.nix { + # If abseil-cpp doesn’t have a deployment target of 10.13+, arrow-cpp crashes in libgrpc.dylib. + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; + abseil-cpp_202301 = callPackage ./202301.nix { + # If abseil-cpp doesn’t have a deployment target of 10.13+, arrow-cpp crashes in libgrpc.dylib. + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; + abseil-cpp_202308 = callPackage ./202308.nix { + # If abseil-cpp doesn’t have a deployment target of 10.13+, arrow-cpp crashes in libgrpc.dylib. + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; + abseil-cpp_202401 = callPackage ./202401.nix { + # If abseil-cpp doesn’t have a deployment target of 10.13+, arrow-cpp crashes in libgrpc.dylib. + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; + abseil-cpp = abseil-cpp_202401; +} diff --git a/pkgs/by-name/ac/acl/default.nix b/pkgs/by-name/ac/acl/default.nix new file mode 100644 index 0000000..7d8a04a --- /dev/null +++ b/pkgs/by-name/ac/acl/default.nix @@ -0,0 +1,32 @@ +{ lib, stdenv, fetchurl, gettext, attr }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "acl"; + version = "2.3.2"; + + src = fetchurl { + url = "mirror://savannah/acl/acl-${version}.tar.gz"; + hash = "sha256-XyvbrWKXB6p9hcYj+ZSqih0t7FWnPeUgW6wL9gWKL3w="; + }; + + outputs = [ "bin" "dev" "out" "man" "doc" ]; + + nativeBuildInputs = [ gettext ]; + buildInputs = [ attr ]; + + postPatch = '' + patchShebangs . + ''; + + meta = with lib; { + homepage = "https://savannah.nongnu.org/projects/acl"; + description = "Library and tools for manipulating access control lists"; + platforms = platforms.linux; + license = licenses.gpl2Plus; + }; +} diff --git a/pkgs/by-name/al/alsa-lib/alsa-plugin-conf-multilib.patch b/pkgs/by-name/al/alsa-lib/alsa-plugin-conf-multilib.patch new file mode 100644 index 0000000..b17df9a --- /dev/null +++ b/pkgs/by-name/al/alsa-lib/alsa-plugin-conf-multilib.patch @@ -0,0 +1,232 @@ +diff --git a/src/control/control.c b/src/control/control.c +index d66ed75..42cecad 100644 +--- a/src/control/control.c ++++ b/src/control/control.c +@@ -838,6 +838,10 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, + #ifndef PIC + extern void *snd_control_open_symbols(void); + #endif ++ ++ snd_config_t *libs = NULL; ++ const char *libs_lib = NULL; ++ + if (snd_config_get_type(ctl_conf) != SND_CONFIG_TYPE_COMPOUND) { + if (name) + SNDERR("Invalid type for CTL %s definition", name); +@@ -879,6 +883,19 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, + SNDERR("Invalid type for %s", id); + goto _err; + } ++ ++ continue; ++ } ++ // Handle an array of extra libs. ++ if (strcmp(id, "libs") == 0) { ++ if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { ++ SNDERR("Invalid type for libs definition in CTL %s definition", ++ str); ++ goto _err; ++ } ++ ++ libs = n; ++ + continue; + } + if (strcmp(id, "open") == 0) { +@@ -903,7 +920,62 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, + open_name = buf; + sprintf(buf, "_snd_ctl_%s_open", str); + } +- if (!lib) { ++ ++#ifndef PIC ++ snd_control_open_symbols(); ++#endif ++ ++ // Normal alsa behaviour when there is no libs array. ++ if (!libs) { ++ if (lib) { ++ open_func = snd_dlobj_cache_get(lib, open_name, ++ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 1); ++ } ++ } ++ // Handle libs array. ++ // Suppresses error messages if any function is loaded successfully. ++ else { ++ if (lib) { ++ open_func = snd_dlobj_cache_get(lib, open_name, ++ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 0); ++ } ++ ++ if (!open_func) { ++ snd_config_for_each(i, next, libs) { ++ snd_config_t *n = snd_config_iterator_entry(i); ++ ++ err = snd_config_get_string(n, &libs_lib); ++ if (err < 0) { ++ SNDERR("Invalid entry in CTL %s libs definition", str); ++ goto _err; ++ } ++ ++ if (!open_func) { ++ open_func = snd_dlobj_cache_get(libs_lib, open_name, ++ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 0); ++ } ++ } ++ } ++ ++ // Print error messages. ++ if (!open_func) { ++ if (lib) { ++ SNDERR("Either %s cannot be opened or %s was not defined inside", ++ lib, open_name); ++ } ++ ++ snd_config_for_each(i, next, libs) { ++ snd_config_t *n = snd_config_iterator_entry(i); ++ ++ snd_config_get_string(n, &libs_lib); ++ SNDERR("Either %s cannot be opened or %s was not defined inside", ++ libs_lib, open_name); ++ } ++ } ++ } ++ ++ // Look in ALSA_PLUGIN_DIR iff we found nowhere else to look. ++ if (!lib && (!libs || !libs_lib)) { + const char *const *build_in = build_in_ctls; + while (*build_in) { + if (!strcmp(*build_in, str)) +@@ -919,12 +991,11 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, + lib = buf1; + sprintf(buf1, "%s/libasound_module_ctl_%s.so", ALSA_PLUGIN_DIR, str); + } +- } +-#ifndef PIC +- snd_control_open_symbols(); +-#endif +- open_func = snd_dlobj_cache_get(lib, open_name, ++ ++ open_func = snd_dlobj_cache_get(lib, open_name, + SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 1); ++ } ++ + if (open_func) { + err = open_func(ctlp, name, ctl_root, ctl_conf, mode); + if (err >= 0) { +diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c +index 2e24338..7f489f4 100644 +--- a/src/pcm/pcm.c ++++ b/src/pcm/pcm.c +@@ -2116,6 +2116,10 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, + #ifndef PIC + extern void *snd_pcm_open_symbols(void); + #endif ++ ++ snd_config_t *libs = NULL; ++ const char *libs_lib = NULL; ++ + if (snd_config_get_type(pcm_conf) != SND_CONFIG_TYPE_COMPOUND) { + char *val; + id = NULL; +@@ -2160,6 +2164,19 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, + SNDERR("Invalid type for %s", id); + goto _err; + } ++ ++ continue; ++ } ++ // Handle an array of extra libs. ++ if (strcmp(id, "libs") == 0) { ++ if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { ++ SNDERR("Invalid type for libs definition in PCM %s definition", ++ str); ++ goto _err; ++ } ++ ++ libs = n; ++ + continue; + } + if (strcmp(id, "open") == 0) { +@@ -2184,7 +2201,62 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, + open_name = buf; + sprintf(buf, "_snd_pcm_%s_open", str); + } +- if (!lib) { ++ ++#ifndef PIC ++ snd_pcm_open_symbols(); /* this call is for static linking only */ ++#endif ++ ++ // Normal alsa behaviour when there is no libs array. ++ if (!libs) { ++ if (lib) { ++ open_func = snd_dlobj_cache_get(lib, open_name, ++ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 1); ++ } ++ } ++ // Handle libs array. ++ // Suppresses error messages if any function is loaded successfully. ++ else { ++ if (lib) { ++ open_func = snd_dlobj_cache_get(lib, open_name, ++ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 0); ++ } ++ ++ if (!open_func) { ++ snd_config_for_each(i, next, libs) { ++ snd_config_t *n = snd_config_iterator_entry(i); ++ ++ err = snd_config_get_string(n, &libs_lib); ++ if (err < 0) { ++ SNDERR("Invalid entry in PCM %s libs definition", str); ++ goto _err; ++ } ++ ++ if (!open_func) { ++ open_func = snd_dlobj_cache_get(libs_lib, open_name, ++ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 0); ++ } ++ } ++ } ++ ++ // Print error messages. ++ if (!open_func) { ++ if (lib) { ++ SNDERR("Either %s cannot be opened or %s was not defined inside", ++ lib, open_name); ++ } ++ ++ snd_config_for_each(i, next, libs) { ++ snd_config_t *n = snd_config_iterator_entry(i); ++ ++ snd_config_get_string(n, &libs_lib); ++ SNDERR("Either %s cannot be opened or %s was not defined inside", ++ libs_lib, open_name); ++ } ++ } ++ } ++ ++ // Look in ALSA_PLUGIN_DIR iff we found nowhere else to look. ++ if (!lib && (!libs || !libs_lib)) { + const char *const *build_in = build_in_pcms; + while (*build_in) { + if (!strcmp(*build_in, str)) +@@ -2200,12 +2272,11 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, + lib = buf1; + sprintf(buf1, "%s/libasound_module_pcm_%s.so", ALSA_PLUGIN_DIR, str); + } +- } +-#ifndef PIC +- snd_pcm_open_symbols(); /* this call is for static linking only */ +-#endif +- open_func = snd_dlobj_cache_get(lib, open_name, ++ ++ open_func = snd_dlobj_cache_get(lib, open_name, + SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 1); ++ } ++ + if (open_func) { + err = open_func(pcmp, name, pcm_root, pcm_conf, stream, mode); + if (err >= 0) { diff --git a/pkgs/by-name/al/alsa-lib/default.nix b/pkgs/by-name/al/alsa-lib/default.nix new file mode 100644 index 0000000..50f40cd --- /dev/null +++ b/pkgs/by-name/al/alsa-lib/default.nix @@ -0,0 +1,52 @@ +{ lib +, stdenv +, fetchurl +, alsa-topology-conf +, alsa-ucm-conf +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "alsa-lib"; + version = "1.2.11"; + + src = fetchurl { + url = "mirror://alsa/lib/${finalAttrs.pname}-${finalAttrs.version}.tar.bz2"; + hash = "sha256-nz8vabmV+a03NZBy+8aaOoi/uggfyD6b4w4UZieVu00="; + }; + + patches = [ + # Add a "libs" field to the syntax recognized in the /etc/asound.conf file. + # The nixos modules for pulseaudio, jack, and pipewire are leveraging this + # "libs" field to declare locations for both native and 32bit plugins, in + # order to support apps with 32bit sound running on x86_64 architecture. + ./alsa-plugin-conf-multilib.patch + ]; + + enableParallelBuilding = true; + + postInstall = '' + ln -s ${alsa-ucm-conf}/share/alsa/{ucm,ucm2} $out/share/alsa + ln -s ${alsa-topology-conf}/share/alsa/topology $out/share/alsa + ''; + + outputs = [ "out" "dev" ]; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "http://www.alsa-project.org/"; + description = "ALSA, the Advanced Linux Sound Architecture libraries"; + mainProgram = "aserver"; + + longDescription = '' + The Advanced Linux Sound Architecture (ALSA) provides audio and + MIDI functionality to the Linux-based operating system. + ''; + + license = licenses.lgpl21Plus; + pkgConfigModules = [ "alsa" "alsa-topology" ]; + platforms = platforms.linux; + maintainers = with maintainers; [ l-as ]; + }; +}) diff --git a/pkgs/by-name/ap/apache-httpd/2.4.nix b/pkgs/by-name/ap/apache-httpd/2.4.nix new file mode 100644 index 0000000..f2bf67f --- /dev/null +++ b/pkgs/by-name/ap/apache-httpd/2.4.nix @@ -0,0 +1,114 @@ +{ lib +, stdenv +, fetchurl +, perl +, zlib +, apr +, aprutil +, pcre2 +, libiconv +, lynx +, which +, libxcrypt +# for passthru.tests +# , nixosTests +, proxySupport ? true +, sslSupport ? true, openssl +, modTlsSupport ? false, rustls-ffi, Foundation +, http2Support ? true, nghttp2 +, ldapSupport ? true, openldap +, libxml2Support ? true, libxml2 +, brotliSupport ? true, brotli +, luaSupport ? false, lua5 +}: + +stdenv.mkDerivation rec { + pname = "apache-httpd"; + version = "2.4.59"; + + src = fetchurl { + url = "mirror://apache/httpd/httpd-${version}.tar.bz2"; + hash = "sha256-7FFQHsSAKE/1L2NyWBNdMzIwp9Ipw6+m9sL5BA4yEyM="; + }; + + # FIXME: -dev depends on -doc + outputs = [ "out" "dev" "man" "doc" ]; + setOutputFlags = false; # it would move $out/modules, etc. + + nativeBuildInputs = [ which ]; + + buildInputs = [ perl libxcrypt ] ++ + lib.optional brotliSupport brotli ++ + lib.optional sslSupport openssl ++ + lib.optional modTlsSupport rustls-ffi ++ + lib.optional (modTlsSupport && stdenv.isDarwin) Foundation ++ + lib.optional ldapSupport openldap ++ # there is no --with-ldap flag + lib.optional libxml2Support libxml2 ++ + lib.optional http2Support nghttp2 ++ + lib.optional stdenv.isDarwin libiconv; + + postPatch = '' + sed -i config.layout -e "s|installbuilddir:.*|installbuilddir: $dev/share/build|" + sed -i support/apachectl.in -e 's|@LYNX_PATH@|${lynx}/bin/lynx|' + ''; + + # Required for ‘pthread_cancel’. + NIX_LDFLAGS = lib.optionalString (!stdenv.isDarwin) "-lgcc_s"; + + configureFlags = [ + "--with-apr=${apr.dev}" + "--with-apr-util=${aprutil.dev}" + "--with-z=${zlib.dev}" + "--with-pcre=${pcre2.dev}/bin/pcre2-config" + "--disable-maintainer-mode" + "--disable-debugger-mode" + "--enable-mods-shared=all" + "--enable-mpms-shared=all" + "--enable-cern-meta" + "--enable-imagemap" + "--enable-cgi" + "--includedir=${placeholder "dev"}/include" + (lib.enableFeature proxySupport "proxy") + (lib.enableFeature sslSupport "ssl") + (lib.enableFeature modTlsSupport "tls") + (lib.withFeatureAs libxml2Support "libxml2" "${libxml2.dev}/include/libxml2") + "--docdir=$(doc)/share/doc" + + (lib.enableFeature brotliSupport "brotli") + (lib.withFeatureAs brotliSupport "brotli" brotli) + + (lib.enableFeature http2Support "http2") + (lib.withFeature http2Support "nghttp2") + + (lib.enableFeature luaSupport "lua") + (lib.withFeatureAs luaSupport "lua" lua5) + ]; + + enableParallelBuilding = true; + + stripDebugList = [ "lib" "modules" "bin" ]; + + postInstall = '' + mkdir -p $doc/share/doc/httpd + mv $out/manual $doc/share/doc/httpd + mkdir -p $dev/bin + mv $out/bin/apxs $dev/bin/apxs + ''; + + # passthru = { + # inherit apr aprutil sslSupport proxySupport ldapSupport luaSupport lua5; + # tests = { + # acme-integration = nixosTests.acme; + # proxy = nixosTests.proxy; + # php = nixosTests.php.httpd; + # }; + # }; + + meta = with lib; { + description = "Apache HTTPD, the world's most popular web server"; + homepage = "https://httpd.apache.org/"; + license = licenses.asl20; + platforms = platforms.linux ++ platforms.darwin; + maintainers = with maintainers; [ lovek323 ]; + }; +} diff --git a/pkgs/by-name/ap/apache-httpd/packages.nix b/pkgs/by-name/ap/apache-httpd/packages.nix new file mode 100644 index 0000000..7cc64bf --- /dev/null +++ b/pkgs/by-name/ap/apache-httpd/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + apacheHttpd_2_4 = callPackage ./2.4.nix { + inherit (darwin.apple_sdk.frameworks) Foundation; + }; + apacheHttpd = apacheHttpd_2_4; +} diff --git a/pkgs/by-name/ap/apr/cross-assume-dev-zero-mmappable.patch b/pkgs/by-name/ap/apr/cross-assume-dev-zero-mmappable.patch new file mode 100644 index 0000000..4bacb89 --- /dev/null +++ b/pkgs/by-name/ap/apr/cross-assume-dev-zero-mmappable.patch @@ -0,0 +1,14 @@ +based onhttps://830833.bugs.gentoo.org/attachment.cgi?id=761676, +adjusted for 1.7.2 + +--- a/configure.in 2022-01-09 00:31:05.552582255 -0800 ++++ b/configure.in 2022-01-09 00:31:19.824582533 -0800 +@@ -1329,7 +1329,7 @@ + return 3; + } + return 0; +- }], [], [ac_cv_file__dev_zero=no], [ac_cv_file__dev_zero=no])]) ++ }], [], [ac_cv_file__dev_zero=no], [:])]) + fi + + # Now we determine which one is our anonymous shmem preference. diff --git a/pkgs/by-name/ap/apr/default.nix b/pkgs/by-name/ap/apr/default.nix new file mode 100644 index 0000000..6428489 --- /dev/null +++ b/pkgs/by-name/ap/apr/default.nix @@ -0,0 +1,74 @@ +{ lib, stdenv, fetchurl, fetchpatch, buildPackages, autoreconfHook }: + +stdenv.mkDerivation rec { + pname = "apr"; + version = "1.7.4"; + + src = fetchurl { + url = "mirror://apache/apr/${pname}-${version}.tar.bz2"; + sha256 = "sha256-/GSN6YPzoqbJ543qHxgGOb0vrWwG1VbUNnpwH+XDVXc="; + }; + + patches = [ + ./cross-assume-dev-zero-mmappable.patch + ]; + + # This test needs the net + postPatch = '' + rm test/testsock.* + ''; + + outputs = [ "out" "dev" ]; + outputBin = "dev"; + + preConfigure = + '' + configureFlagsArray+=("--with-installbuilddir=$dev/share/build") + ''; + + configureFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # For cross builds, provide answers to the configure time tests. + # These answers are valid on x86_64-linux and aarch64-linux. + "ac_cv_file__dev_zero=yes" + "ac_cv_func_setpgrp_void=yes" + "apr_cv_tcp_nodelay_with_cork=yes" + "ac_cv_define_PTHREAD_PROCESS_SHARED=yes" + "apr_cv_process_shared_works=yes" + "apr_cv_mutex_robust_shared=yes" + "ap_cv_atomic_builtins=yes" + "apr_cv_mutex_recursive=yes" + "apr_cv_epoll=yes" + "apr_cv_epoll_create1=yes" + "apr_cv_dup3=yes" + "apr_cv_accept4=yes" + "apr_cv_sock_cloexec=yes" + "ac_cv_struct_rlimit=yes" + "ac_cv_func_sem_open=yes" + "ac_cv_negative_eai=yes" + "apr_cv_gai_addrconfig=yes" + "ac_cv_o_nonblock_inherited=no" + "apr_cv_pthreads_lib=-lpthread" + "CC_FOR_BUILD=${buildPackages.stdenv.cc}/bin/cc" + ] ++ lib.optionals (stdenv.hostPlatform.system == "i686-cygwin") [ + # Including the Windows headers breaks unistd.h. + # Based on ftp://sourceware.org/pub/cygwin/release/libapr1/libapr1-1.3.8-2-src.tar.bz2 + "ac_cv_header_windows_h=no" + ]; + + # - Update libtool for macOS 11 support + # - Regenerate for cross fix patch + nativeBuildInputs = [ autoreconfHook ]; + + doCheck = true; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://apr.apache.org/"; + description = "The Apache Portable Runtime library"; + mainProgram = "apr-1-config"; + platforms = platforms.all; + license = licenses.asl20; + maintainers = [ maintainers.eelco ]; + }; +} diff --git a/pkgs/by-name/ap/aprutil/clang-bdb.patch b/pkgs/by-name/ap/aprutil/clang-bdb.patch new file mode 100644 index 0000000..02e9c83 --- /dev/null +++ b/pkgs/by-name/ap/aprutil/clang-bdb.patch @@ -0,0 +1,12 @@ +diff -ur a/build/dbm.m4 b/build/dbm.m4 +--- a/build/dbm.m4 2013-11-23 13:00:53.000000000 -0500 ++++ b/build/dbm.m4 2023-10-22 20:16:37.764571446 -0400 +@@ -235,7 +235,7 @@ + #include + #include + #include <$apu_try_berkeley_db_header> +-main () ++int main () + { + int major, minor, patch; + diff --git a/pkgs/by-name/ap/aprutil/default.nix b/pkgs/by-name/ap/aprutil/default.nix new file mode 100644 index 0000000..bd32ad4 --- /dev/null +++ b/pkgs/by-name/ap/aprutil/default.nix @@ -0,0 +1,90 @@ +{ lib, stdenv, fetchurl, makeWrapper, apr, expat, gnused +, sslSupport ? true, openssl +, bdbSupport ? true, db +, ldapSupport ? !stdenv.isCygwin, openldap +, libiconv, libxcrypt +, cyrus_sasl, autoreconfHook +}: + +assert sslSupport -> openssl != null; +assert bdbSupport -> db != null; +assert ldapSupport -> openldap != null; + +stdenv.mkDerivation rec { + pname = "apr-util"; + version = "1.6.3"; + + src = fetchurl { + url = "mirror://apache/apr/${pname}-${version}.tar.bz2"; + sha256 = "sha256-pBB243EHRjJsOUUEKZStmk/KwM4Cd92P6gdv7DyXcrU="; + }; + + patches = [ + ./fix-libxcrypt-build.patch + # Fix incorrect Berkeley DB detection with newer versions of clang due to implicit `int` on main errors. + ./clang-bdb.patch + ] ++ lib.optional stdenv.isFreeBSD ./include-static-dependencies.patch; + + NIX_CFLAGS_LINK = [ "-lcrypt" ]; + + outputs = [ "out" "dev" ]; + outputBin = "dev"; + + nativeBuildInputs = [ makeWrapper autoreconfHook ]; + + configureFlags = [ "--with-apr=${apr.dev}" "--with-expat=${expat.dev}" ] + ++ lib.optional (!stdenv.isCygwin) "--with-crypto" + ++ lib.optional sslSupport "--with-openssl=${openssl.dev}" + ++ lib.optional bdbSupport "--with-berkeley-db=${db.dev}" + ++ lib.optional ldapSupport "--with-ldap=ldap" + ++ lib.optionals stdenv.isCygwin + [ "--without-pgsql" "--without-sqlite2" "--without-sqlite3" + "--without-freetds" "--without-berkeley-db" "--without-crypto" ] + ; + + postConfigure = '' + echo '#define APR_HAVE_CRYPT_H 1' >> confdefs.h + '' + + # For some reason, db version 6.9 is selected when cross-compiling. + # It's unclear as to why, it requires someone with more autotools / configure knowledge to go deeper into that. + # Always replacing the link flag with a generic link flag seems to help though, so let's do that for now. + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + substituteInPlace Makefile \ + --replace "-ldb-6.9" "-ldb" + substituteInPlace apu-1-config \ + --replace "-ldb-6.9" "-ldb" + ''; + + propagatedBuildInputs = [ apr expat libiconv libxcrypt ] + ++ lib.optional sslSupport openssl + ++ lib.optional bdbSupport db + ++ lib.optional ldapSupport openldap + ++ lib.optional stdenv.isFreeBSD cyrus_sasl; + + postInstall = '' + for f in $out/lib/*.la $out/lib/apr-util-1/*.la $dev/bin/apu-1-config; do + substituteInPlace $f \ + --replace "${expat.dev}/lib" "${expat.out}/lib" \ + --replace "${db.dev}/lib" "${db.out}/lib" \ + --replace "${openssl.dev}/lib" "${lib.getLib openssl}/lib" + done + + # Give apr1 access to sed for runtime invocations. + wrapProgram $dev/bin/apu-1-config --prefix PATH : "${gnused}/bin" + ''; + + enableParallelBuilding = true; + + passthru = { + inherit sslSupport bdbSupport ldapSupport; + }; + + meta = with lib; { + homepage = "https://apr.apache.org/"; + description = "A companion library to APR, the Apache Portable Runtime"; + mainProgram = "apu-1-config"; + maintainers = [ maintainers.eelco ]; + platforms = platforms.unix; + license = licenses.asl20; + }; +} diff --git a/pkgs/by-name/ap/aprutil/fix-libxcrypt-build.patch b/pkgs/by-name/ap/aprutil/fix-libxcrypt-build.patch new file mode 100644 index 0000000..2994e5d --- /dev/null +++ b/pkgs/by-name/ap/aprutil/fix-libxcrypt-build.patch @@ -0,0 +1,14 @@ +diff --git a/crypto/apr_passwd.c b/crypto/apr_passwd.c +index c961de2..a397f27 100644 +--- a/crypto/apr_passwd.c ++++ b/crypto/apr_passwd.c +@@ -24,9 +24,7 @@ + #if APR_HAVE_STRING_H + #include + #endif +-#if APR_HAVE_CRYPT_H + #include +-#endif + #if APR_HAVE_UNISTD_H + #include + #endif diff --git a/pkgs/by-name/ap/aprutil/include-static-dependencies.patch b/pkgs/by-name/ap/aprutil/include-static-dependencies.patch new file mode 100644 index 0000000..1813c72 --- /dev/null +++ b/pkgs/by-name/ap/aprutil/include-static-dependencies.patch @@ -0,0 +1,12 @@ +diff --git a/build/apu-conf.m4 b/build/apu-conf.m4 +index 8943f10..aa44305 100644 +--- a/build/apu-conf.m4 ++++ b/build/apu-conf.m4 +@@ -279,6 +279,7 @@ AC_ARG_WITH(ldap,[ --with-ldap=library ldap library to use], + APU_FIND_LDAPLIB("ldap", "-llber -lresolv -lsocket -lnsl") + APU_FIND_LDAPLIB("ldap", "-ldl -lpthread") + else ++ APU_FIND_LDAPLIB($LIBLDAP, "-llber -lcrypto -lssl -lsasl2") + APU_FIND_LDAPLIB($LIBLDAP) + APU_FIND_LDAPLIB($LIBLDAP, "-lresolv") + APU_FIND_LDAPLIB($LIBLDAP, "-lresolv -lsocket -lnsl") diff --git a/pkgs/by-name/as/asciidoc/default.nix b/pkgs/by-name/as/asciidoc/default.nix new file mode 100644 index 0000000..69b0ccf --- /dev/null +++ b/pkgs/by-name/as/asciidoc/default.nix @@ -0,0 +1,295 @@ +{ fetchurl, lib, stdenv, python3 +, fetchFromGitHub, autoreconfHook +, installShellFiles +, enableStandardFeatures ? false +, sourceHighlight +, highlight +, pygments +, graphviz +, texliveMinimal +, dblatexFull +, libxslt +, w3m +, lynx +, imagemagick +, lilypond +, libxml2 +, docbook_xml_dtd_45 +, docbook_xsl_ns +, docbook_xsl +, fop +, epubcheck +, gnused +, coreutils + +# if true, enable all the below filters and backends +, enableExtraPlugins ? false + +# unzip is needed to extract filter and backend plugins +, unzip +# filters +, enableDitaaFilter ? false, jre +, enableMscgenFilter ? false, mscgen +, enableDiagFilter ? false, blockdiag, seqdiag, actdiag, nwdiag +, enableQrcodeFilter ? false, qrencode +, enableMatplotlibFilter ? false, matplotlib, numpy +, enableAafigureFilter ? false, aafigure, recursive-pth-loader +# backends +, enableDeckjsBackend ? false +, enableOdfBackend ? false + +# java is problematic on some platforms, where it is unfree +, enableJava ? true + +, buildPackages +}: + +let + + _enableDitaaFilter = (enableExtraPlugins && enableJava) || enableDitaaFilter; + _enableMscgenFilter = enableExtraPlugins || enableMscgenFilter; + _enableDiagFilter = enableExtraPlugins || enableDiagFilter; + _enableQrcodeFilter = enableExtraPlugins || enableQrcodeFilter; + _enableMatplotlibFilter = enableExtraPlugins || enableMatplotlibFilter; + _enableAafigureFilter = enableExtraPlugins || enableAafigureFilter; + _enableDeckjsBackend = enableExtraPlugins || enableDeckjsBackend; + _enableOdfBackend = enableExtraPlugins || enableOdfBackend; + + # + # texlive environment + # + texlive = texliveMinimal.withPackages (ps: [ ps.dvipng ]); + + # + # filters + # + + ditaaFilterSrc = fetchurl { + url = "https://asciidoc-ditaa-filter.googlecode.com/files/ditaa-filter-1.1.zip"; + sha256 = "0p7hm2a1xywx982ia3vg4c0lam5sz0xknsc10i2a5vswy026naf6"; + }; + + mscgenFilterSrc = fetchurl { + url = "https://asciidoc-mscgen-filter.googlecode.com/files/mscgen-filter-1.2.zip"; + sha256 = "1nfwmj375gpv5dn9i770pjv59aihzy2kja0fflsk96xwnlqsqq61"; + }; + + diagFilterSrc = fetchurl { + # unfortunately no version number + url = "https://asciidoc-diag-filter.googlecode.com/files/diag_filter.zip"; + sha256 = "1qlqrdbqkdqqgfdhjsgdws1al0sacsyq6jmwxdfy7r8k7bv7n7mm"; + }; + + qrcodeFilterSrc = fetchurl { + url = "https://asciidoc-qrencode-filter.googlecode.com/files/qrcode-filter-1.0.zip"; + sha256 = "0h4bql1nb4y4fmg2yvlpfjhvy22ln8jsaxdr10f8bfcg5lr0zkxs"; + }; + + # there are no archives or tags, using latest commit in master branch as per 2013-09-22 + matplotlibFilterSrc = let commit = "75f0d009629f93f33fab04b83faca20cc35dd358"; in fetchurl { + name = "mplw-${commit}.tar.gz"; + url = "https://api.github.com/repos/lvv/mplw/tarball/${commit}"; + sha256 = "0yfhkm2dr8gnp0fcg25x89hwiymkri2m5cyqzmzragzwj0hbmcf1"; + }; + + aafigureFilterSrc = fetchurl { + url = "https://asciidoc-aafigure-filter.googlecode.com/files/aafigure-filter-1.1.zip"; + sha256 = "1hq2s30dvmv5dqvj0xm1qwdwafhgm9w1iyr0lr0c40cyk8h00j8j"; + }; + + # + # backends + # + + deckjsBackendSrc = fetchurl { + url = "https://github.com/downloads/houqp/asciidoc-deckjs/deckjs-1.6.2.zip"; + sha256 = "1siy1j8naj5irrrrv5bfgl4d8nal6j9pyahy4f50wmrr9wv59s46"; + }; + + # the odf backend is actually two plugins: odt + odp + odtBackendSrc = fetchurl { + url = "https://github.com/downloads/dagwieers/asciidoc-odf/odt-backend-0.1.zip"; + sha256 = "1zaa97h9sx6ncxcdkl1x3ggydi7f8kjgvrnpjnkjiizi45k350kw"; + }; + + odpBackendSrc = fetchurl { + url = "https://github.com/downloads/dagwieers/asciidoc-odf/odp-backend-0.1.zip"; + sha256 = "08ya4bskygzqkfqwjllpg31qc5k08xp2k78z9b2480g8y57bfy10"; + }; + +in python3.pkgs.buildPythonApplication rec { + pname = "asciidoc" + + lib.optionalString enableStandardFeatures "-full" + + lib.optionalString enableExtraPlugins "-with-plugins"; + version = "10.2.0"; + + src = fetchFromGitHub { + owner = "asciidoc-py"; + repo = "asciidoc-py"; + rev = version; + hash = "sha256-TqC0x9xB6e2d6Wc9bgnlqgZVOmYHmUUKfE/CKAiEtag="; + }; + + nativeBuildInputs = [ + autoreconfHook + installShellFiles + unzip + ]; + + # install filters early, so their shebangs are patched too + postPatch = with lib; '' + mkdir -p "$out/etc/asciidoc/filters" + mkdir -p "$out/etc/asciidoc/backends" + '' + optionalString _enableDitaaFilter '' + echo "Extracting ditaa filter" + unzip -d "$out/etc/asciidoc/filters/ditaa" "${ditaaFilterSrc}" + sed -i -e "s|java -jar|${jre}/bin/java -jar|" \ + "$out/etc/asciidoc/filters/ditaa/ditaa2img.py" + '' + optionalString _enableMscgenFilter '' + echo "Extracting mscgen filter" + unzip -d "$out/etc/asciidoc/filters/mscgen" "${mscgenFilterSrc}" + sed -i -e "s|filter-wrapper.py mscgen|filter-wrapper.py ${mscgen}/bin/mscgen|" \ + "$out/etc/asciidoc/filters/mscgen/mscgen-filter.conf" + '' + optionalString _enableDiagFilter '' + echo "Extracting diag filter" + unzip -d "$out/etc/asciidoc/filters/diag" "${diagFilterSrc}" + sed -i \ + -e "s|filter='blockdiag|filter=\'${blockdiag}/bin/blockdiag|" \ + -e "s|filter='seqdiag|filter=\'${seqdiag}/bin/seqdiag|" \ + -e "s|filter='actdiag|filter=\'${actdiag}/bin/actdiag|" \ + -e "s|filter='nwdiag|filter=\'${nwdiag}/bin/nwdiag|" \ + -e "s|filter='packetdiag|filter=\'${nwdiag}/bin/packetdiag|" \ + "$out/etc/asciidoc/filters/diag/diag-filter.conf" + '' + optionalString _enableQrcodeFilter '' + echo "Extracting qrcode filter" + unzip -d "$out/etc/asciidoc/filters/qrcode" "${qrcodeFilterSrc}" + sed -i -e "s|systemcmd('qrencode|systemcmd('${qrencode}/bin/qrencode|" \ + "$out/etc/asciidoc/filters/qrcode/qrcode2img.py" + '' + optionalString _enableMatplotlibFilter '' + echo "Extracting mpl (matplotlib) filter" + mkdir -p "$out/etc/asciidoc/filters/mpl" + tar xvf "${matplotlibFilterSrc}" -C "$out/etc/asciidoc/filters/mpl" --strip-components=1 + # Stop asciidoc from loading mpl/.old/chart-filter.conf + rm -rf "$out/etc/asciidoc/filters/mpl/.old" + # Add matplotlib and numpy to sys.path + matplotlib_path="$(toPythonPath ${matplotlib})" + numpy_path="$(toPythonPath ${numpy})" + sed -i "/^import.*sys/asys.path.append(\"$matplotlib_path\"); sys.path.append(\"$numpy_path\");" \ + "$out/etc/asciidoc/filters/mpl/mplw.py" + '' + optionalString _enableAafigureFilter '' + echo "Extracting aafigure filter" + unzip -d "$out/etc/asciidoc/filters/aafigure" "${aafigureFilterSrc}" + # Add aafigure to sys.path (and it needs recursive-pth-loader) + pth_loader_path="$(toPythonPath ${recursive-pth-loader})" + aafigure_path="$(toPythonPath ${aafigure})" + sed -i "/^import.*sys/asys.path.append(\"$pth_loader_path\"); sys.path.append(\"$aafigure_path\"); import sitecustomize" \ + "$out/etc/asciidoc/filters/aafigure/aafig2img.py" + '' + optionalString _enableDeckjsBackend '' + echo "Extracting deckjs backend" + unzip -d "$out/etc/asciidoc/backends/deckjs" "${deckjsBackendSrc}" + '' + optionalString _enableOdfBackend '' + echo "Extracting odf backend (odt + odp)" + unzip -d "$out/etc/asciidoc/backends/odt" "${odtBackendSrc}" + unzip -d "$out/etc/asciidoc/backends/odp" "${odpBackendSrc}" + # The odt backend has a TODO note about removing this hardcoded path, but + # the odp backend already has that fix. Copy it here until fixed upstream. + sed -i "s|'/etc/asciidoc/backends/odt/asciidoc.ott'|os.path.dirname(__file__),'asciidoc.ott'|" \ + "$out/etc/asciidoc/backends/odt/a2x-backend.py" + '' + (if enableStandardFeatures then '' + sed -e "s|dot|${graphviz}/bin/dot|g" \ + -e "s|neato|${graphviz}/bin/neato|g" \ + -e "s|twopi|${graphviz}/bin/twopi|g" \ + -e "s|circo|${graphviz}/bin/circo|g" \ + -e "s|fdp|${graphviz}/bin/fdp|g" \ + -i "asciidoc/resources/filters/graphviz/graphviz2png.py" + + sed -e "s|run('latex|run('${texlive}/bin/latex|g" \ + -e "s|cmd = 'dvipng'|cmd = '${texlive}/bin/dvipng'|g" \ + -e "s|cmd = 'dvisvgm'|cmd = '${texlive}/bin/dvisvgm'|g" \ + -i "asciidoc/resources/filters/latex/latex2img.py" + + sed -e "s|run('abc2ly|run('${lilypond}/bin/abc2ly|g" \ + -e "s|run('lilypond|run('${lilypond}/bin/lilypond|g" \ + -e "s|run('convert|run('${imagemagick.out}/bin/convert|g" \ + -i "asciidoc/resources/filters/music/music2png.py" + + sed -e 's|filter="source-highlight|filter="${sourceHighlight}/bin/source-highlight|' \ + -e 's|filter="highlight|filter="${highlight}/bin/highlight|' \ + -e 's|filter="pygmentize|filter="${pygments}/bin/pygmentize|' \ + -i "asciidoc/resources/filters/source/source-highlight-filter.conf" + + # ENV is custom environment passed to programs that a2x invokes. Here we + # use it to work around an impurity in the tetex package; tetex tools + # cannot find their neighbours (e.g. pdflatex doesn't find mktextfm). + # We can remove PATH= when those impurities are fixed. + # TODO: Is this still necessary when using texlive? + sed -e "s|^ENV =.*|ENV = dict(XML_CATALOG_FILES='${docbook_xml_dtd_45}/xml/dtd/docbook/catalog.xml ${docbook_xsl_ns}/xml/xsl/docbook/catalog.xml ${docbook_xsl}/xml/xsl/docbook/catalog.xml', PATH='${lib.makeBinPath [ texlive coreutils gnused ]}', **(dict(filter(lambda v: v[0] == 'SOURCE_DATE_EPOCH', os.environ.items()))))|" \ + -e "s|^ASCIIDOC =.*|ASCIIDOC = '$out/bin/asciidoc'|" \ + -e "s|^XSLTPROC =.*|XSLTPROC = '${libxslt.bin}/bin/xsltproc'|" \ + -e "s|^DBLATEX =.*|DBLATEX = '${dblatexFull}/bin/dblatex'|" \ + ${optionalString enableJava ''-e "s|^FOP =.*|FOP = '${fop}/bin/fop'|"''} \ + -e "s|^W3M =.*|W3M = '${w3m}/bin/w3m'|" \ + -e "s|^LYNX =.*|LYNX = '${lynx}/bin/lynx'|" \ + -e "s|^XMLLINT =.*|XMLLINT = '${libxml2.bin}/bin/xmllint'|" \ + -e "s|^EPUBCHECK =.*|EPUBCHECK = '${epubcheck}/bin/epubcheck'|" \ + -i asciidoc/a2x.py + '' else '' + sed -e "s|^ENV =.*|ENV = dict(XML_CATALOG_FILES='${docbook_xml_dtd_45}/xml/dtd/docbook/catalog.xml ${docbook_xsl_ns}/xml/xsl/docbook/catalog.xml ${docbook_xsl}/xml/xsl/docbook/catalog.xml', **(dict(filter(lambda v: v[0] == 'SOURCE_DATE_EPOCH', os.environ.items()))))|" \ + -e "s|^XSLTPROC =.*|XSLTPROC = '${libxslt.bin}/bin/xsltproc'|" \ + -e "s|^XMLLINT =.*|XMLLINT = '${libxml2.bin}/bin/xmllint'|" \ + -i asciidoc/a2x.py + '') + '' + # Fix tests + for f in $(grep -R --files-with-matches "2002-11-25") ; do + substituteInPlace $f --replace "2002-11-25" "1980-01-02" + substituteInPlace $f --replace "00:37:42" "00:00:00" + done + '' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + # We want to use asciidoc from the build platform to build the documentation. + substituteInPlace Makefile.in \ + --replace "python3 -m asciidoc.a2x" "${buildPackages.asciidoc}/bin/a2x" + ''; + + postBuild = '' + make manpages + ''; + + postInstall = '' + installManPage doc/asciidoc.1 doc/a2x.1 doc/testasciidoc.1 + ''; + + nativeCheckInputs = with python3.pkgs; [ + pytest + pytest-mock + ]; + + checkPhase = '' + runHook preCheck + + make test + + runHook postCheck + ''; + + meta = with lib; { + description = "Text-based document generation system"; + longDescription = '' + AsciiDoc is a text document format for writing notes, documentation, + articles, books, ebooks, slideshows, web pages, man pages and blogs. + AsciiDoc files can be translated to many formats including HTML, PDF, + EPUB, man page. + + AsciiDoc is highly configurable: both the AsciiDoc source file syntax and + the backend output markups (which can be almost any type of SGML/XML + markup) can be customized and extended by the user. + ''; + sourceProvenance = with sourceTypes; [ + fromSource + ] ++ lib.optional _enableDitaaFilter binaryBytecode; + homepage = "https://asciidoc-py.github.io/"; + changelog = "https://github.com/asciidoc-py/asciidoc-py/blob/${version}/CHANGELOG.adoc"; + license = licenses.gpl2Plus; + platforms = platforms.unix; + maintainers = with maintainers; [ bjornfor dotlambda ]; + }; +} diff --git a/pkgs/by-name/as/asciidoc/packages.nix b/pkgs/by-name/as/asciidoc/packages.nix new file mode 100644 index 0000000..9d71b27 --- /dev/null +++ b/pkgs/by-name/as/asciidoc/packages.nix @@ -0,0 +1,20 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + asciidoc = callPackage ./. { + inherit (python3.pkgs) pygments matplotlib numpy aafigure recursive-pth-loader; + w3m = w3m-batch; + enableStandardFeatures = false; + }; + + asciidoc-full = asciidoc.override { + enableStandardFeatures = true; + }; + + asciidoc-full-with-plugins = asciidoc.override { + enableStandardFeatures = true; + enableExtraPlugins = true; + }; +} diff --git a/pkgs/by-name/at/attr/default.nix b/pkgs/by-name/at/attr/default.nix new file mode 100644 index 0000000..4815497 --- /dev/null +++ b/pkgs/by-name/at/attr/default.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, fetchurl, gettext }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "attr"; + version = "2.5.2"; + + src = fetchurl { + url = "mirror://savannah/attr/${pname}-${version}.tar.gz"; + sha256 = "sha256-Ob9nRS+kHQlIwhl2AQU/SLPXigKTiXNDMqYwmmgMbIc="; + }; + + outputs = [ "bin" "dev" "out" "man" "doc" ]; + + nativeBuildInputs = [ gettext ]; + + postPatch = '' + for script in install-sh include/install-sh; do + patchShebangs $script + done + ''; + + meta = with lib; { + homepage = "https://savannah.nongnu.org/projects/attr/"; + description = "Library and tools for manipulating extended attributes"; + platforms = platforms.linux; + license = licenses.gpl2Plus; + }; +} diff --git a/pkgs/by-name/au/audit/default.nix b/pkgs/by-name/au/audit/default.nix new file mode 100644 index 0000000..1e941a1 --- /dev/null +++ b/pkgs/by-name/au/audit/default.nix @@ -0,0 +1,73 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, autoreconfHook +, bash +, buildPackages +, libtool +, linuxHeaders +, python3 +, swig + +# Enabling python support while cross compiling would be possible, but the +# configure script tries executing python to gather info instead of relying on +# python3-config exclusively +, enablePython ? stdenv.hostPlatform == stdenv.buildPlatform, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "audit"; + version = "3.1.2"; + + src = fetchurl { + url = "https://people.redhat.com/sgrubb/audit/audit-${finalAttrs.version}.tar.gz"; + hash = "sha256-wLF5LR8KiMbxgocQUJy7mHBZ/GhxLJdmnKkOrhA9KH0="; + }; + + postPatch = '' + substituteInPlace bindings/swig/src/auditswig.i \ + --replace "/usr/include/linux/audit.h" \ + "${linuxHeaders}/include/linux/audit.h" + ''; + + outputs = [ "bin" "dev" "out" "man" ]; + + strictDeps = true; + + depsBuildBuild = [ + buildPackages.stdenv.cc + ]; + + nativeBuildInputs = [ + autoreconfHook + ] + ++ lib.optionals enablePython [ + python3 + swig + ]; + + buildInputs = [ + bash + ]; + + configureFlags = [ + # z/OS plugin is not useful on Linux, and pulls in an extra openldap + # dependency otherwise + "--disable-zos-remote" + "--with-arm" + "--with-aarch64" + (if enablePython then "--with-python" else "--without-python") + ]; + + enableParallelBuilding = true; + + meta = { + homepage = "https://people.redhat.com/sgrubb/audit/"; + description = "Audit Library"; + changelog = "https://github.com/linux-audit/audit-userspace/releases/tag/v${finalAttrs.version}"; + license = lib.licenses.gpl2Plus; + maintainers = with lib.maintainers; [ AndersonTorres ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/au/autoconf-archive/default.nix b/pkgs/by-name/au/autoconf-archive/default.nix new file mode 100644 index 0000000..3fbfabc --- /dev/null +++ b/pkgs/by-name/au/autoconf-archive/default.nix @@ -0,0 +1,23 @@ +{ lib, stdenv, fetchurl, xz }: + +stdenv.mkDerivation rec { + pname = "autoconf-archive"; + version = "2023.02.20"; + + src = fetchurl { + url = "mirror://gnu/autoconf-archive/autoconf-archive-${version}.tar.xz"; + hash = "sha256-cdQEhHmuKPH1eUYZw9ct+cAd9JscYo74X943WW3DGjM="; + }; + + strictDeps = true; + enableParallelBuilding = true; + + buildInputs = [ xz ]; + + meta = with lib; { + description = "Archive of autoconf m4 macros"; + homepage = "https://www.gnu.org/software/autoconf-archive/"; + license = licenses.gpl3; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/au/autoconf/2.13.nix b/pkgs/by-name/au/autoconf/2.13.nix new file mode 100644 index 0000000..8fba52a --- /dev/null +++ b/pkgs/by-name/au/autoconf/2.13.nix @@ -0,0 +1,41 @@ +{ lib, stdenv, fetchurl, m4, perl }: + +stdenv.mkDerivation rec { + pname = "autoconf"; + version = "2.13"; + + src = fetchurl { + url = "mirror://gnu/autoconf/autoconf-${version}.tar.gz"; + sha256 = "07krzl4czczdsgzrrw9fiqx35xcf32naf751khg821g5pqv12qgh"; + }; + + nativeBuildInputs = [ m4 perl ]; + strictDeps = true; + + doCheck = true; + + # Don't fixup "#! /bin/sh" in Autoconf, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + postInstall = ''ln -s autoconf "$out"/bin/autoconf-2.13''; + + meta = { + homepage = "https://www.gnu.org/software/autoconf/"; + description = "Part of the GNU Build System"; + branch = "2.13"; + + longDescription = '' + GNU Autoconf is an extensible package of M4 macros that produce + shell scripts to automatically configure software source code + packages. These scripts can adapt the packages to many kinds of + UNIX-like systems without manual user intervention. Autoconf + creates a configuration script for a package from a template + file that lists the operating system features that the package + can use, in the form of M4 macro calls. + ''; + + license = lib.licenses.gpl2Plus; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/au/autoconf/2.64.nix b/pkgs/by-name/au/autoconf/2.64.nix new file mode 100644 index 0000000..daf026d --- /dev/null +++ b/pkgs/by-name/au/autoconf/2.64.nix @@ -0,0 +1,54 @@ +{ lib, stdenv, fetchurl, m4, perl }: + +stdenv.mkDerivation rec { + pname = "autoconf"; + version = "2.64"; + + src = fetchurl { + url = "mirror://gnu/autoconf/autoconf-${version}.tar.xz"; + sha256 = "0j3jdjpf5ly39dlp0bg70h72nzqr059k0x8iqxvaxf106chpgn9j"; + }; + + strictDeps = true; + nativeBuildInputs = [ m4 perl ]; + buildInputs = [ m4 ]; + + # Work around a known issue in Cygwin. See + # http://thread.gmane.org/gmane.comp.sysutils.autoconf.bugs/6822 for + # details. + # There are many test failures on `i386-pc-solaris2.11'. + #doCheck = ((!stdenv.isCygwin) && (!stdenv.isSunOS)); + doCheck = false; + + # Don't fixup "#! /bin/sh" in Autoconf, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + enableParallelBuilding = true; + + # Make the Autotest test suite run in parallel. + preCheck = '' + export TESTSUITEFLAGS="-j$NIX_BUILD_CORES" + ''; + + doInstallCheck = false; # fails + + meta = { + homepage = "https://www.gnu.org/software/autoconf/"; + description = "Part of the GNU Build System"; + + longDescription = '' + GNU Autoconf is an extensible package of M4 macros that produce + shell scripts to automatically configure software source code + packages. These scripts can adapt the packages to many kinds of + UNIX-like systems without manual user intervention. Autoconf + creates a configuration script for a package from a template + file that lists the operating system features that the package + can use, in the form of M4 macro calls. + ''; + + license = lib.licenses.gpl2Plus; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/autoconf/2.69.nix b/pkgs/by-name/au/autoconf/2.69.nix new file mode 100644 index 0000000..870b0ae --- /dev/null +++ b/pkgs/by-name/au/autoconf/2.69.nix @@ -0,0 +1,53 @@ +{ lib, stdenv, fetchurl, m4, perl }: + +stdenv.mkDerivation rec { + pname = "autoconf"; + version = "2.69"; + + src = fetchurl { + url = "mirror://gnu/autoconf/autoconf-${version}.tar.xz"; + sha256 = "113nlmidxy9kjr45kg9x3ngar4951mvag1js2a3j8nxcz34wxsv4"; + }; + + nativeBuildInputs = [ m4 perl ]; + buildInputs = [ m4 ]; + + # Work around a known issue in Cygwin. See + # http://thread.gmane.org/gmane.comp.sysutils.autoconf.bugs/6822 for + # details. + # There are many test failures on `i386-pc-solaris2.11'. + #doCheck = ((!stdenv.isCygwin) && (!stdenv.isSunOS)); + doCheck = false; + + # Don't fixup "#! /bin/sh" in Autoconf, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + enableParallelBuilding = true; + + # Make the Autotest test suite run in parallel. + preCheck = '' + export TESTSUITEFLAGS="-j$NIX_BUILD_CORES" + ''; + + doInstallCheck = false; # fails + + meta = { + homepage = "https://www.gnu.org/software/autoconf/"; + description = "Part of the GNU Build System"; + + longDescription = '' + GNU Autoconf is an extensible package of M4 macros that produce + shell scripts to automatically configure software source code + packages. These scripts can adapt the packages to many kinds of + UNIX-like systems without manual user intervention. Autoconf + creates a configuration script for a package from a template + file that lists the operating system features that the package + can use, in the form of M4 macro calls. + ''; + + license = lib.licenses.gpl2Plus; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/autoconf/2.71-fix-race.patch b/pkgs/by-name/au/autoconf/2.71-fix-race.patch new file mode 100644 index 0000000..e3b2855 --- /dev/null +++ b/pkgs/by-name/au/autoconf/2.71-fix-race.patch @@ -0,0 +1,36 @@ +https://savannah.gnu.org/support/index.php?110521 +https://git.savannah.gnu.org/cgit/autoconf.git/patch/?id=3a9802d60156809c139e9b4620bf04917e143ee2 +--- a/lib/Autom4te/FileUtils.pm ++++ b/lib/Autom4te/FileUtils.pm +@@ -34,12 +34,12 @@ This perl module provides various general purpose file handling functions. + + =cut + +-use 5.006; ++use 5.008; + use strict; + use warnings FATAL => 'all'; + + use Exporter; +-use File::stat; ++use Time::HiRes qw(stat); + use IO::File; + + use Autom4te::Channels; +@@ -115,10 +115,11 @@ sub mtime ($) + return 0 + if $file eq '-' || ! -f $file; + +- my $stat = stat ($file) ++ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, ++ $atime,$mtime,$ctime,$blksize,$blocks) = stat ($file) + or fatal "cannot stat $file: $!"; + +- return $stat->mtime; ++ return $mtime; + } + + +-- +cgit v1.2.1 + diff --git a/pkgs/by-name/au/autoconf/2.71.nix b/pkgs/by-name/au/autoconf/2.71.nix new file mode 100644 index 0000000..1fcb819 --- /dev/null +++ b/pkgs/by-name/au/autoconf/2.71.nix @@ -0,0 +1,69 @@ +{ lib, stdenv, fetchurl, m4, perl, texinfo }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "autoconf"; + version = "2.71"; + outputs = [ "out" "doc" ]; + + src = fetchurl { + url = "mirror://gnu/autoconf/autoconf-${version}.tar.xz"; + sha256 = "197sl23irn6s9pd54rxj5vcp5y8dv65jb9yfqgr2g56cxg7q6k7i"; + }; + patches = [ + # fix stale autom4te cache race condition: + # https://savannah.gnu.org/support/index.php?110521 + ./2.71-fix-race.patch + ]; + + strictDeps = true; + nativeBuildInputs = [ m4 perl texinfo ]; + buildInputs = [ m4 ]; + postBuild = " + make html + "; + + postInstall = " + make install-html + "; + + # Work around a known issue in Cygwin. See + # http://thread.gmane.org/gmane.comp.sysutils.autoconf.bugs/6822 for + # details. + # There are many test failures on `i386-pc-solaris2.11'. + doCheck = ((!stdenv.isCygwin) && (!stdenv.isSunOS)); + + # Don't fixup "#! /bin/sh" in Autoconf, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + enableParallelBuilding = true; + + # Make the Autotest test suite run in parallel. + preCheck ='' + export TESTSUITEFLAGS="-j$NIX_BUILD_CORES" + ''; + + meta = { + homepage = "https://www.gnu.org/software/autoconf/"; + description = "Part of the GNU Build System"; + + longDescription = '' + GNU Autoconf is an extensible package of M4 macros that produce + shell scripts to automatically configure software source code + packages. These scripts can adapt the packages to many kinds of + UNIX-like systems without manual user intervention. Autoconf + creates a configuration script for a package from a template + file that lists the operating system features that the package + can use, in the form of M4 macro calls. + ''; + + license = lib.licenses.gpl3Plus; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/autoconf/default.nix b/pkgs/by-name/au/autoconf/default.nix new file mode 100644 index 0000000..8039e36 --- /dev/null +++ b/pkgs/by-name/au/autoconf/default.nix @@ -0,0 +1,64 @@ +{ lib, stdenv, fetchurl, m4, perl, texinfo }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "autoconf"; + version = "2.72"; + outputs = [ "out" "doc" ]; + + src = fetchurl { + url = "mirror://gnu/autoconf/autoconf-${version}.tar.xz"; + hash = "sha256-uohcExlXjWyU1G6bDc60AUyq/iSQ5Deg28o/JwoiP1o="; + }; + + strictDeps = true; + nativeBuildInputs = [ m4 perl texinfo ]; + buildInputs = [ m4 ]; + postBuild = " + make html + "; + + postInstall = " + make install-html + "; + + # Work around a known issue in Cygwin. See + # http://thread.gmane.org/gmane.comp.sysutils.autoconf.bugs/6822 for + # details. + # There are many test failures on `i386-pc-solaris2.11'. + doCheck = ((!stdenv.isCygwin) && (!stdenv.isSunOS)); + + # Don't fixup "#! /bin/sh" in Autoconf, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + enableParallelBuilding = true; + + # Make the Autotest test suite run in parallel. + preCheck ='' + export TESTSUITEFLAGS="-j$NIX_BUILD_CORES" + ''; + + meta = { + homepage = "https://www.gnu.org/software/autoconf/"; + description = "Part of the GNU Build System"; + + longDescription = '' + GNU Autoconf is an extensible package of M4 macros that produce + shell scripts to automatically configure software source code + packages. These scripts can adapt the packages to many kinds of + UNIX-like systems without manual user intervention. Autoconf + creates a configuration script for a package from a template + file that lists the operating system features that the package + can use, in the form of M4 macro calls. + ''; + + license = lib.licenses.gpl3Plus; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/autoconf/packages.nix b/pkgs/by-name/au/autoconf/packages.nix new file mode 100644 index 0000000..934064c --- /dev/null +++ b/pkgs/by-name/au/autoconf/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + autoconf = callPackage ./. { }; + autoconf213 = callPackage ./2.13.nix { }; + autoconf264 = callPackage ./2.64.nix { }; + autoconf269 = callPackage ./2.69.nix { }; + autoconf271 = callPackage ./2.71.nix { }; +} diff --git a/pkgs/by-name/au/automake/automake-1.11.x.nix b/pkgs/by-name/au/automake/automake-1.11.x.nix new file mode 100644 index 0000000..161dca6 --- /dev/null +++ b/pkgs/by-name/au/automake/automake-1.11.x.nix @@ -0,0 +1,49 @@ +{ lib, stdenv, fetchurl, perl, autoconf }: + +stdenv.mkDerivation rec { + pname = "automake"; + version = "1.11.6"; + + # TODO: Remove the `aclocal' wrapper when $ACLOCAL_PATH support is + # available upstream; see + # . + builder = ./builder.sh; + + setupHook = ./setup-hook.sh; + + src = fetchurl { + url = "mirror://gnu/automake/automake-${version}.tar.xz"; + sha256 = "1ffbc6cc41f0ea6c864fbe9485b981679dc5e350f6c4bc6c3512f5a4226936b5"; + }; + + patches = [ ./fix-test-autoconf-2.69.patch ./fix-perl-5.26.patch ]; + + strictDeps = true; + nativeBuildInputs = [ perl autoconf ]; + buildInputs = [ autoconf ]; + + doCheck = false; # takes _a lot_ of time, fails 11 of 782 tests + + # Don't fixup "#! /bin/sh" in Libtool, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + # Run the test suite in parallel. + enableParallelBuilding = true; + + meta = { + branch = "1.11"; + homepage = "https://www.gnu.org/software/automake/"; + description = "GNU standard-compliant makefile generator"; + + longDescription = '' + GNU Automake is a tool for automatically generating + `Makefile.in' files compliant with the GNU Coding + Standards. Automake requires the use of Autoconf. + ''; + + license = lib.licenses.gpl2Plus; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/automake/automake-1.15.x.nix b/pkgs/by-name/au/automake/automake-1.15.x.nix new file mode 100644 index 0000000..f0df759 --- /dev/null +++ b/pkgs/by-name/au/automake/automake-1.15.x.nix @@ -0,0 +1,43 @@ +{ lib, stdenv, fetchurl, perl, autoconf }: + +stdenv.mkDerivation rec { + pname = "automake"; + version = "1.15.1"; + + src = fetchurl { + url = "mirror://gnu/automake/automake-${version}.tar.xz"; + sha256 = "1bzd9g32dfm4rsbw93ld9x7b5nc1y6i4m6zp032qf1i28a8s6sxg"; + }; + + nativeBuildInputs = [ autoconf perl ]; + buildInputs = [ autoconf ]; + + setupHook = ./setup-hook.sh; + + patches = [ ./help2man-SOURCE_DATE_EPOCH-support.patch ]; + + doCheck = false; # takes _a lot_ of time, fails 3 out of 2698 tests, all seem to be related to paths + doInstallCheck = false; # runs the same thing, fails the same tests + + # The test suite can run in parallel. + enableParallelBuilding = true; + + # Don't fixup "#! /bin/sh" in Libtool, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + meta = { + branch = "1.15"; + homepage = "https://www.gnu.org/software/automake/"; + description = "GNU standard-compliant makefile generator"; + license = lib.licenses.gpl2Plus; + + longDescription = '' + GNU Automake is a tool for automatically generating + `Makefile.in' files compliant with the GNU Coding + Standards. Automake requires the use of Autoconf. + ''; + + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/au/automake/automake-1.16.x.nix b/pkgs/by-name/au/automake/automake-1.16.x.nix new file mode 100644 index 0000000..0d9572c --- /dev/null +++ b/pkgs/by-name/au/automake/automake-1.16.x.nix @@ -0,0 +1,40 @@ +{ lib, stdenv, fetchurl, perl, autoconf }: + +stdenv.mkDerivation rec { + pname = "automake"; + version = "1.16.5"; + + src = fetchurl { + url = "mirror://gnu/automake/automake-${version}.tar.xz"; + sha256 = "0sdl32qxdy7m06iggmkkvf7j520rmmgbsjzbm7fgnxwxdp6mh7gh"; + }; + + strictDeps = true; + nativeBuildInputs = [ autoconf perl ]; + buildInputs = [ autoconf ]; + + setupHook = ./setup-hook.sh; + + doCheck = false; # takes _a lot_ of time, fails 3 out of 2698 tests, all seem to be related to paths + doInstallCheck = false; # runs the same thing, fails the same tests + + # The test suite can run in parallel. + enableParallelBuilding = true; + + # Don't fixup "#! /bin/sh" in Libtool, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + + meta = with lib; { + branch = "1.16"; + homepage = "https://www.gnu.org/software/automake/"; + description = "GNU standard-compliant makefile generator"; + license = licenses.gpl2Plus; + longDescription = '' + GNU Automake is a tool for automatically generating + `Makefile.in' files compliant with the GNU Coding + Standards. Automake requires the use of Autoconf. + ''; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/au/automake/builder.sh b/pkgs/by-name/au/automake/builder.sh new file mode 100644 index 0000000..b08e725 --- /dev/null +++ b/pkgs/by-name/au/automake/builder.sh @@ -0,0 +1,48 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +source $stdenv/setup + +# Wrap the given `aclocal' program, appending extra `-I' flags +# corresponding to the directories listed in $ACLOCAL_PATH. (Note +# that `wrapProgram' can't be used for that purpose since it can only +# prepend flags, not append them.) +wrapAclocal() { + local program="$1" + local wrapped="$(dirname $program)/.$(basename $program)-wrapped" + + mv "$program" "$wrapped" + cat > "$program"< baz.cc + + $ACLOCAL +-$AUTOMAKE ++$AUTOMAKE --add-missing + + # Look for the macros at the beginning of rules. Be careful, as there + # are literal tabs at the beginning of the search strings. diff --git a/pkgs/by-name/au/automake/help2man-SOURCE_DATE_EPOCH-support.patch b/pkgs/by-name/au/automake/help2man-SOURCE_DATE_EPOCH-support.patch new file mode 100644 index 0000000..048f75e --- /dev/null +++ b/pkgs/by-name/au/automake/help2man-SOURCE_DATE_EPOCH-support.patch @@ -0,0 +1,41 @@ +From 2e3357d7f0d63f1caeb40d9644c2436a5cd0da5f Mon Sep 17 00:00:00 2001 +From: David Terry +Date: Fri, 18 Oct 2019 10:23:11 +0200 +Subject: [PATCH] help2man: add support for SOURCE_DATE_EPOCH + +--- + doc/help2man | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/doc/help2man b/doc/help2man +index af4306f..4a64167 100755 +--- a/doc/help2man ++++ b/doc/help2man +@@ -213,11 +213,23 @@ sub get_option_value; + my $help_text = get_option_value $ARGV[0], $help_option; + $version_text ||= get_option_value $ARGV[0], $version_option; + ++# By default the generated manual pages will include the current date. This may ++# however be overriden by setting the environment variable $SOURCE_DATE_EPOCH ++# to an integer value of the seconds since the UNIX epoch. This is primarily ++# intended to support reproducible builds (wiki.debian.org/ReproducibleBuilds) ++# and will additionally ensure that the output date string is UTC. ++my $epoch_secs = time; ++if (exists $ENV{SOURCE_DATE_EPOCH} and $ENV{SOURCE_DATE_EPOCH} =~ /^(\d+)$/) ++{ ++ $epoch_secs = $1; ++ $ENV{TZ} = 'UTC'; ++} ++ + # Translators: the following message is a strftime(3) format string, which in + # the English version expands to the month as a word and the full year. It + # is used on the footer of the generated manual pages. If in doubt, you may + # just use %x as the value (which should be the full locale-specific date). +-my $date = enc strftime _("%B %Y"), localtime; ++my $date = enc strftime _("%B %Y"), localtime $epoch_secs; + (my $program = $ARGV[0]) =~ s!.*/!!; + my $package = $program; + my $version; +-- +2.23.0 + diff --git a/pkgs/by-name/au/automake/packages.nix b/pkgs/by-name/au/automake/packages.nix new file mode 100644 index 0000000..236842e --- /dev/null +++ b/pkgs/by-name/au/automake/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + automake = automake116x; + automake111x = callPackage ./automake-1.11.x.nix { }; + automake115x = callPackage ./automake-1.15.x.nix { }; + automake116x = callPackage ./automake-1.16.x.nix { }; +} diff --git a/pkgs/by-name/au/automake/setup-hook.sh b/pkgs/by-name/au/automake/setup-hook.sh new file mode 100644 index 0000000..292632b --- /dev/null +++ b/pkgs/by-name/au/automake/setup-hook.sh @@ -0,0 +1,5 @@ +addAclocals () { + addToSearchPathWithCustomDelimiter : ACLOCAL_PATH $1/share/aclocal +} + +addEnvHooks "$hostOffset" addAclocals diff --git a/pkgs/by-name/aw/aws-c-auth/default.nix b/pkgs/by-name/aw/aws-c-auth/default.nix new file mode 100644 index 0000000..7a7d808 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-auth/default.nix @@ -0,0 +1,58 @@ +{ lib +, stdenv +, fetchFromGitHub +, aws-c-cal +, aws-c-common +, aws-c-compression +, aws-c-http +, aws-c-io +, aws-c-sdkutils +, cmake +, nix +, s2n-tls +}: + +stdenv.mkDerivation rec { + pname = "aws-c-auth"; + version = "0.7.16"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-auth"; + rev = "v${version}"; + hash = "sha256-76sBv4oChDrkv80HPktkULFNC37kfTNxjlwNg/FJiyA="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-cal + aws-c-common + aws-c-compression + aws-c-http + aws-c-io + s2n-tls + ]; + + propagatedBuildInputs = [ + aws-c-sdkutils + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 library implementation of AWS client-side authentication"; + homepage = "https://github.com/awslabs/aws-c-auth"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-cal/aws-c-cal-musl-compat.patch b/pkgs/by-name/aw/aws-c-cal/aws-c-cal-musl-compat.patch new file mode 100644 index 0000000..2cf1d4e --- /dev/null +++ b/pkgs/by-name/aw/aws-c-cal/aws-c-cal-musl-compat.patch @@ -0,0 +1,33 @@ +From: Emil Lerch +Date: Wed, 28 Apr 2021 17:46:24 -0700 +Subject: [PATCH] Allow dlopen to fail on musl systems + +Now that references are forced when linking statically, the assertion is +no longer necessary. See https://github.com/awslabs/aws-c-cal/pull/54 +--- + source/unix/openssl_platform_init.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/source/unix/openssl_platform_init.c b/source/unix/openssl_platform_init.c +index 5266ecc1..99f210bd 100644 +--- a/source/unix/openssl_platform_init.c ++++ b/source/unix/openssl_platform_init.c +@@ -496,7 +502,6 @@ static enum aws_libcrypto_version s_resolve_libcrypto(void) { + /* Try to auto-resolve against what's linked in/process space */ + FLOGF("searching process and loaded modules"); + void *process = dlopen(NULL, RTLD_NOW); +- AWS_FATAL_ASSERT(process && "Unable to load symbols from process space"); + enum aws_libcrypto_version result = s_resolve_libcrypto_symbols(AWS_LIBCRYPTO_LC, process); + if (result == AWS_LIBCRYPTO_NONE) { + result = s_resolve_libcrypto_symbols(AWS_LIBCRYPTO_1_0_2, process); +@@ -504,7 +509,9 @@ static enum aws_libcrypto_version s_resolve_libcrypto(void) { + if (result == AWS_LIBCRYPTO_NONE) { + result = s_resolve_libcrypto_symbols(AWS_LIBCRYPTO_1_1_1, process); + } +- dlclose(process); ++ if (process) { ++ dlclose(process); ++ } + + if (result == AWS_LIBCRYPTO_NONE) { + FLOGF("libcrypto symbols were not statically linked, searching for shared libraries"); diff --git a/pkgs/by-name/aw/aws-c-cal/default.nix b/pkgs/by-name/aw/aws-c-cal/default.nix new file mode 100644 index 0000000..0188c89 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-cal/default.nix @@ -0,0 +1,40 @@ +{ lib, stdenv, fetchFromGitHub, cmake, aws-c-common, nix, openssl, Security }: + +stdenv.mkDerivation (finalAttrs: { + pname = "aws-c-cal"; + version = "0.6.10"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = finalAttrs.pname; + rev = "v${finalAttrs.version}"; + hash = "sha256-rzJypIf0DrKI/2Wt5vFop34dL+KYTeCfWC0RflZpiMo="; + }; + + patches = [ + # Fix openssl adaptor code for musl based static binaries. + ./aws-c-cal-musl-compat.patch + ]; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ aws-c-common openssl ]; + + propagatedBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ Security ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "AWS Crypto Abstraction Layer "; + homepage = "https://github.com/awslabs/aws-c-cal"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej ]; + }; +}) diff --git a/pkgs/by-name/aw/aws-c-cal/packages.nix b/pkgs/by-name/aw/aws-c-cal/packages.nix new file mode 100644 index 0000000..989742a --- /dev/null +++ b/pkgs/by-name/aw/aws-c-cal/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + aws-c-cal = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/aw/aws-c-common/default.nix b/pkgs/by-name/aw/aws-c-common/default.nix new file mode 100644 index 0000000..360b82b --- /dev/null +++ b/pkgs/by-name/aw/aws-c-common/default.nix @@ -0,0 +1,57 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, nix +}: + +stdenv.mkDerivation rec { + pname = "aws-c-common"; + version = "0.9.14"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = pname; + rev = "v${version}"; + hash = "sha256-aeuIXqnO8divpguDpiPlYJHABYIqegpaDNGwqJ5TKZw="; + }; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ] ++ lib.optionals stdenv.hostPlatform.isRiscV [ + "-DCMAKE_C_FLAGS=-fasynchronous-unwind-tables" + ]; + + # aws-c-common misuses cmake modules, so we need + # to manually add a MODULE_PATH to its consumers + setupHook = ./setup-hook.sh; + + # Prevent the execution of tests known to be flaky. + preCheck = let + ignoreTests = [ + "promise_test_multiple_waiters" + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + "sba_metrics" # https://github.com/awslabs/aws-c-common/issues/839 + ]; + in '' + cat <CTestCustom.cmake + SET(CTEST_CUSTOM_TESTS_IGNORE ${toString ignoreTests}) + EOW + ''; + + doCheck = true; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "AWS SDK for C common core"; + homepage = "https://github.com/awslabs/aws-c-common"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej eelco r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-common/setup-hook.sh b/pkgs/by-name/aw/aws-c-common/setup-hook.sh new file mode 100644 index 0000000..e670f7c --- /dev/null +++ b/pkgs/by-name/aw/aws-c-common/setup-hook.sh @@ -0,0 +1,5 @@ +addAwsCCommonModuleDir() { + cmakeFlags="-DCMAKE_MODULE_PATH=@out@/lib/cmake ${cmakeFlags:-}" +} + +postHooks+=(addAwsCCommonModuleDir) diff --git a/pkgs/by-name/aw/aws-c-compression/default.nix b/pkgs/by-name/aw/aws-c-compression/default.nix new file mode 100644 index 0000000..e38279f --- /dev/null +++ b/pkgs/by-name/aw/aws-c-compression/default.nix @@ -0,0 +1,42 @@ +{ lib, stdenv +, fetchFromGitHub +, aws-c-common +, cmake +, nix +}: + +stdenv.mkDerivation rec { + pname = "aws-c-compression"; + version = "0.2.18"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-compression"; + rev = "v${version}"; + sha256 = "sha256-Cf3MvoRWGAy+vlE59JSpTGOBl07dI4mbIaL1HIiLN/I="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-common + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 implementation of huffman encoding/decoding"; + homepage = "https://github.com/awslabs/aws-c-compression"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-event-stream/default.nix b/pkgs/by-name/aw/aws-c-event-stream/default.nix new file mode 100644 index 0000000..14d24ae --- /dev/null +++ b/pkgs/by-name/aw/aws-c-event-stream/default.nix @@ -0,0 +1,46 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, aws-c-cal +, aws-c-common +, aws-c-io +, aws-checksums +, s2n-tls +, libexecinfo +# for passthru.tests +, nix +}: + +stdenv.mkDerivation rec { + pname = "aws-c-event-stream"; + version = "0.4.2"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = pname; + rev = "v${version}"; + hash = "sha256-wj3PZshUay3HJy+v7cidDL4mDAqSDiX+MmQtJDK4rTI="; + }; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ aws-c-cal aws-c-common aws-c-io aws-checksums s2n-tls ] + ++ lib.optional stdenv.hostPlatform.isMusl libexecinfo; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS:BOOL=ON" + ]; + + # passthru.tests = { + # inherit nix; + # }; + + meta = with lib; { + description = "C99 implementation of the vnd.amazon.eventstream content-type"; + homepage = "https://github.com/awslabs/aws-c-event-stream"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej eelco ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-http/default.nix b/pkgs/by-name/aw/aws-c-http/default.nix new file mode 100644 index 0000000..4b22e53 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-http/default.nix @@ -0,0 +1,50 @@ +{ lib, stdenv +, fetchFromGitHub +, aws-c-cal +, aws-c-common +, aws-c-compression +, aws-c-io +, cmake +, nix +, s2n-tls +}: + +stdenv.mkDerivation rec { + pname = "aws-c-http"; + version = "0.8.1"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-http"; + rev = "v${version}"; + hash = "sha256-S5ETVkdGTndt2GJBNL4DU5SycHAufsmN06xBDRMFVKo="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-cal + aws-c-common + aws-c-compression + aws-c-io + s2n-tls + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 implementation of the HTTP/1.1 and HTTP/2 specifications"; + homepage = "https://github.com/awslabs/aws-c-http"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-io/default.nix b/pkgs/by-name/aw/aws-c-io/default.nix new file mode 100644 index 0000000..65b5843 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-io/default.nix @@ -0,0 +1,34 @@ +{ lib, stdenv, fetchFromGitHub, cmake, aws-c-cal, aws-c-common, nix, s2n-tls, Security }: + +stdenv.mkDerivation rec { + pname = "aws-c-io"; + version = "0.14.6"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = pname; + rev = "v${version}"; + hash = "sha256-fekeGghqMKbUqKWIfpZg3a6dCpgxywhmXPoGz9y4Aos="; + }; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ aws-c-cal aws-c-common s2n-tls ]; + propagatedBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ Security ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "AWS SDK for C module for IO and TLS"; + homepage = "https://github.com/awslabs/aws-c-io"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-io/packages.nix b/pkgs/by-name/aw/aws-c-io/packages.nix new file mode 100644 index 0000000..d17278d --- /dev/null +++ b/pkgs/by-name/aw/aws-c-io/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + aws-c-io = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/aw/aws-c-mqtt/default.nix b/pkgs/by-name/aw/aws-c-mqtt/default.nix new file mode 100644 index 0000000..2e6c6a5 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-mqtt/default.nix @@ -0,0 +1,53 @@ +{ lib +, stdenv +, fetchFromGitHub +, aws-c-cal +, aws-c-common +, aws-c-compression +, aws-c-http +, aws-c-io +, cmake +, nix +, s2n-tls +}: + +stdenv.mkDerivation rec { + pname = "aws-c-mqtt"; + version = "0.10.3"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-mqtt"; + rev = "v${version}"; + hash = "sha256-MWcXTMwKtFnrNp+OnHxkiYCUXc3IUhM6iTQa+F9JwsQ="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-cal + aws-c-common + aws-c-compression + aws-c-http + aws-c-io + s2n-tls + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 implementation of the MQTT 3.1.1 specification"; + homepage = "https://github.com/awslabs/aws-c-mqtt"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-c-s3/default.nix b/pkgs/by-name/aw/aws-c-s3/default.nix new file mode 100644 index 0000000..8db5b83 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-s3/default.nix @@ -0,0 +1,57 @@ +{ lib, stdenv +, fetchFromGitHub +, aws-c-auth +, aws-c-cal +, aws-c-common +, aws-c-compression +, aws-c-http +, aws-c-io +, aws-checksums +, cmake +, nix +, s2n-tls +}: + +stdenv.mkDerivation rec { + pname = "aws-c-s3"; + version = "0.5.4"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-s3"; + rev = "v${version}"; + hash = "sha256-8eKQsP7AftNDccsZHPC9PcwpbpgZSvsioUuSsiggQDs="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-auth + aws-c-cal + aws-c-common + aws-c-compression + aws-c-http + aws-c-io + aws-checksums + s2n-tls + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 library implementation for communicating with the S3 service"; + homepage = "https://github.com/awslabs/aws-c-s3"; + license = licenses.asl20; + maintainers = with maintainers; [ r-burns ]; + mainProgram = "s3"; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/aw/aws-c-sdkutils/default.nix b/pkgs/by-name/aw/aws-c-sdkutils/default.nix new file mode 100644 index 0000000..7ced8b5 --- /dev/null +++ b/pkgs/by-name/aw/aws-c-sdkutils/default.nix @@ -0,0 +1,44 @@ +{ lib, stdenv +, fetchFromGitHub +, aws-c-common +, cmake +, nix +}: + +stdenv.mkDerivation rec { + pname = "aws-c-sdkutils"; + version = "0.1.15"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-c-sdkutils"; + rev = "v${version}"; + hash = "sha256-RTRDbdv+QmRG0Sk/R9qhl45WYEVyl+M0EceLFsoONTI="; + }; + + nativeBuildInputs = [ + cmake + ]; + + buildInputs = [ + aws-c-common + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + doCheck = true; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "AWS SDK utility library"; + homepage = "https://github.com/awslabs/aws-c-sdkutils"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-checksums/default.nix b/pkgs/by-name/aw/aws-checksums/default.nix new file mode 100644 index 0000000..41da5e2 --- /dev/null +++ b/pkgs/by-name/aw/aws-checksums/default.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, fetchFromGitHub, cmake, aws-c-common, nix }: + +stdenv.mkDerivation rec { + pname = "aws-checksums"; + version = "0.1.18"; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-EhIVa8/IK4evGt4vYECunLpxrCMSOsr1RZ/8hFbRi9M="; + }; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ aws-c-common ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + ]; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "HW accelerated CRC32c and CRC32"; + homepage = "https://github.com/awslabs/aws-checksums"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej eelco ]; + }; +} diff --git a/pkgs/by-name/aw/aws-crt-cpp/0001-build-Make-includedir-properly-overrideable.patch b/pkgs/by-name/aw/aws-crt-cpp/0001-build-Make-includedir-properly-overrideable.patch new file mode 100644 index 0000000..2b06ce0 --- /dev/null +++ b/pkgs/by-name/aw/aws-crt-cpp/0001-build-Make-includedir-properly-overrideable.patch @@ -0,0 +1,59 @@ +From fd3f3a28e7fce7fe4e10ed2d7edc4bfda8ab27df Mon Sep 17 00:00:00 2001 +From: Jan Tojnar +Date: Sun, 9 Jan 2022 01:57:18 +0100 +Subject: [PATCH] build: Make includedir properly overrideable + +This is required by some package managers like Nix. +--- + CMakeLists.txt | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ec6d172..6514c23 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -49,6 +49,10 @@ if(${CMAKE_INSTALL_LIBDIR} STREQUAL "lib64") + set(FIND_LIBRARY_USE_LIB64_PATHS true) + endif() + ++if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) ++ set(CMAKE_INSTALL_INCLUDEDIR "include") ++endif() ++ + if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) + endif() +@@ -307,7 +311,7 @@ endif() + target_include_directories(${PROJECT_NAME} PUBLIC + $ + $ +- $) ++ $) + + aws_use_package(aws-c-http) + aws_use_package(aws-c-mqtt) +@@ -324,14 +328,14 @@ aws_add_sanitizers(${PROJECT_NAME}) + + target_link_libraries(${PROJECT_NAME} PUBLIC ${DEP_AWS_LIBS}) + +-install(FILES ${AWS_CRT_HEADERS} DESTINATION "include/aws/crt" COMPONENT Development) +-install(FILES ${AWS_CRT_AUTH_HEADERS} DESTINATION "include/aws/crt/auth" COMPONENT Development) +-install(FILES ${AWS_CRT_CRYPTO_HEADERS} DESTINATION "include/aws/crt/crypto" COMPONENT Development) +-install(FILES ${AWS_CRT_IO_HEADERS} DESTINATION "include/aws/crt/io" COMPONENT Development) +-install(FILES ${AWS_CRT_IOT_HEADERS} DESTINATION "include/aws/iot" COMPONENT Development) +-install(FILES ${AWS_CRT_MQTT_HEADERS} DESTINATION "include/aws/crt/mqtt" COMPONENT Development) +-install(FILES ${AWS_CRT_HTTP_HEADERS} DESTINATION "include/aws/crt/http" COMPONENT Development) +-install(FILES ${AWS_CRT_ENDPOINT_HEADERS} DESTINATION "include/aws/crt/endpoints" COMPONENT Development) ++install(FILES ${AWS_CRT_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt" COMPONENT Development) ++install(FILES ${AWS_CRT_AUTH_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/auth" COMPONENT Development) ++install(FILES ${AWS_CRT_CRYPTO_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/crypto" COMPONENT Development) ++install(FILES ${AWS_CRT_IO_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/io" COMPONENT Development) ++install(FILES ${AWS_CRT_IOT_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/iot" COMPONENT Development) ++install(FILES ${AWS_CRT_MQTT_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/mqtt" COMPONENT Development) ++install(FILES ${AWS_CRT_HTTP_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/http" COMPONENT Development) ++install(FILES ${AWS_CRT_ENDPOINT_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/aws/crt/endpoints" COMPONENT Development) + + install( + TARGETS ${PROJECT_NAME} +-- +2.42.0 diff --git a/pkgs/by-name/aw/aws-crt-cpp/default.nix b/pkgs/by-name/aw/aws-crt-cpp/default.nix new file mode 100644 index 0000000..9837813 --- /dev/null +++ b/pkgs/by-name/aw/aws-crt-cpp/default.nix @@ -0,0 +1,81 @@ +{ lib, stdenv +, fetchFromGitHub +, aws-c-auth +, aws-c-cal +, aws-c-common +, aws-c-compression +, aws-c-event-stream +, aws-c-http +, aws-c-io +, aws-c-mqtt +, aws-c-s3 +, aws-checksums +, cmake +, s2n-tls +# for passthru.tests +# , nix +}: + +stdenv.mkDerivation rec { + pname = "aws-crt-cpp"; + version = "0.26.4"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "awslabs"; + repo = "aws-crt-cpp"; + rev = "v${version}"; + sha256 = "sha256-H5ms6fhhlkARn9g8S5Ma8bnisZv8mfNizP0QpzsF1tA="; + }; + + patches = [ + # Correct include path for split outputs. + # https://github.com/awslabs/aws-crt-cpp/pull/325 + ./0001-build-Make-includedir-properly-overrideable.patch + ]; + + postPatch = '' + substituteInPlace CMakeLists.txt --replace '-Werror' "" + ''; + + nativeBuildInputs = [ + cmake + ]; + + propagatedBuildInputs = [ + aws-c-auth + aws-c-cal + aws-c-common + aws-c-compression + aws-c-event-stream + aws-c-http + aws-c-io + aws-c-mqtt + aws-c-s3 + aws-checksums + s2n-tls + ]; + + cmakeFlags = [ + "-DBUILD_DEPS=OFF" + "-DBUILD_SHARED_LIBS=ON" + ]; + + postInstall = '' + # Prevent dependency cycle. + moveToOutput lib/aws-crt-cpp/cmake "$dev" + ''; + + # passthru.tests = { + # inherit nix; + # }; + + meta = with lib; { + description = "C++ wrapper around the aws-c-* libraries"; + homepage = "https://github.com/awslabs/aws-crt-cpp"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ r-burns ]; + }; +} diff --git a/pkgs/by-name/aw/aws-sdk-cpp/default.nix b/pkgs/by-name/aw/aws-sdk-cpp/default.nix new file mode 100644 index 0000000..b64978d --- /dev/null +++ b/pkgs/by-name/aw/aws-sdk-cpp/default.nix @@ -0,0 +1,155 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, curl +, openssl +, zlib +, aws-crt-cpp +, CoreAudio +, AudioToolbox +, # Allow building a limited set of APIs, e.g. ["s3" "ec2"]. + apis ? ["*"] +, # Whether to enable AWS' custom memory management. + customMemoryManagement ? true +# for passthru.tests +# , nix +# , arrow-cpp +# , aws-sdk-cpp +}: + +let + host_os = if stdenv.hostPlatform.isDarwin then "APPLE" + else if stdenv.hostPlatform.isAndroid then "ANDROID" + else if stdenv.hostPlatform.isWindows then "WINDOWS" + else if stdenv.hostPlatform.isLinux then "LINUX" + else throw "Unknown host OS"; +in + +stdenv.mkDerivation rec { + pname = "aws-sdk-cpp"; + version = "1.11.296"; + + src = fetchFromGitHub { + owner = "aws"; + repo = "aws-sdk-cpp"; + rev = version; + hash = "sha256-yg+OkeUaqwUQGQ5ThIVQUpF2rHm4FuFbcl5gE5WHHOQ="; + }; + + postPatch = '' + # Append the dev output to path hints in finding Aws.h to avoid + # having to pass `AWS_CORE_HEADER_FILE` explicitly to cmake configure + # when using find_package(AWSSDK CONFIG) + substituteInPlace cmake/AWSSDKConfig.cmake \ + --replace 'C:/AWSSDK/''${AWSSDK_INSTALL_INCLUDEDIR}/aws/core' \ + 'C:/AWSSDK/''${AWSSDK_INSTALL_INCLUDEDIR}/aws/core" + "${placeholder "dev"}/include/aws/core' + + # Avoid blanket -Werror to evade build failures on less + # tested compilers. + substituteInPlace cmake/compiler_settings.cmake \ + --replace '"-Werror"' ' ' + + # Flaky on Hydra + rm tests/aws-cpp-sdk-core-tests/aws/auth/AWSCredentialsProviderTest.cpp + rm tests/aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp + rm tests/aws-cpp-sdk-core-tests/aws/client/AwsConfigTest.cpp + # Includes aws-c-auth private headers, so only works with submodule build + rm tests/aws-cpp-sdk-core-tests/aws/auth/AWSAuthSignerTest.cpp + # TestRandomURLMultiThreaded fails + rm tests/aws-cpp-sdk-core-tests/http/HttpClientTest.cpp + '' + lib.optionalString stdenv.isi686 '' + # EPSILON is exceeded + rm tests/aws-cpp-sdk-core-tests/aws/client/AdaptiveRetryStrategyTest.cpp + ''; + + # FIXME: might be nice to put different APIs in different outputs + # (e.g. libaws-cpp-sdk-s3.so in output "s3"). + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ cmake curl ]; + + buildInputs = [ + curl openssl zlib + ] ++ lib.optionals (stdenv.isDarwin && + ((builtins.elem "text-to-speech" apis) || + (builtins.elem "*" apis))) + [ CoreAudio AudioToolbox ]; + + # propagation is needed for Security.framework to be available when linking + propagatedBuildInputs = [ aws-crt-cpp ]; + + cmakeFlags = [ + "-DBUILD_DEPS=OFF" + ] ++ lib.optional (!customMemoryManagement) "-DCUSTOM_MEMORY_MANAGEMENT=0" + ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "-DENABLE_TESTING=OFF" + "-DCURL_HAS_H2=1" + "-DCURL_HAS_TLS_PROXY=1" + "-DTARGET_ARCH=${host_os}" + ] ++ lib.optional (apis != ["*"]) + "-DBUILD_ONLY=${lib.concatStringsSep ";" apis}"; + + env.NIX_CFLAGS_COMPILE = toString [ + # openssl 3 generates several deprecation warnings + "-Wno-error=deprecated-declarations" + ]; + + postFixupHooks = [ + # This bodge is necessary so that the file that the generated -config.cmake file + # points to an existing directory. + "mkdir -p $out/include" + ]; + + __darwinAllowLocalNetworking = true; + + # Builds in 2+h with 2 cores, and ~10m with a big-parallel builder. + requiredSystemFeatures = [ "big-parallel" ]; + + # passthru = { + # tests = { + # inherit nix arrow-cpp; + # cmake-find-package = stdenv.mkDerivation { + # pname = "aws-sdk-cpp-cmake-find-package-test"; + # version = "0"; + # dontUnpack = true; + # nativeBuildInputs = [ cmake ]; + # buildInputs = [ aws-sdk-cpp ]; + # buildCommand = '' + # cat > CMakeLists.txt <<'EOF' + # find_package(AWSSDK) + # EOF + + # # Intentionally not using 'cmakeConfigurePhase' to test that find_package works without it. + # mkdir build && cd build + # if output=$(cmake -Wno-dev .. 2>&1); then + # if grep -Fw -- "Found AWS" - <<< "$output"; then + # touch "$out" + # else + # echo "'Found AWS' not found in the cmake output!" >&2 + # echo "The output was:" >&2 + # echo "$output" >&2 + # exit 1 + # fi + # else + # echo -n "'cmake -Wno-dev ..'" >&2 + # echo " returned a non-zero exit code." >&2 + # echo "$output" >&2 + # exit 1 + # fi + # ''; + # }; + # }; + # }; + + meta = with lib; { + description = "A C++ interface for Amazon Web Services"; + homepage = "https://github.com/aws/aws-sdk-cpp"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ eelco orivej ]; + # building ec2 runs out of memory: cc1plus: out of memory allocating 33554372 bytes after a total of 74424320 bytes + broken = stdenv.buildPlatform.is32bit && ((builtins.elem "ec2" apis) || (builtins.elem "*" apis)); + }; +} diff --git a/pkgs/by-name/aw/aws-sdk-cpp/packages.nix b/pkgs/by-name/aw/aws-sdk-cpp/packages.nix new file mode 100644 index 0000000..46675cb --- /dev/null +++ b/pkgs/by-name/aw/aws-sdk-cpp/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + aws-sdk-cpp = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) CoreAudio AudioToolbox; + }; +} diff --git a/pkgs/by-name/ba/bash/5.nix b/pkgs/by-name/ba/bash/5.nix new file mode 100644 index 0000000..de0426f --- /dev/null +++ b/pkgs/by-name/ba/bash/5.nix @@ -0,0 +1,151 @@ +{ lib +, stdenv +, buildPackages +, fetchurl +, bison +, util-linux + + # patch for cygwin requires readline support +, interactive ? stdenv.isCygwin +, readline +, withDocs ? false +, texinfo +, forFHSEnv ? false + +, pkgsStatic +}: + +let + upstreamPatches = import ./bash-5.2-patches.nix (nr: sha256: fetchurl { + url = "mirror://gnu/bash/bash-5.2-patches/bash52-${nr}"; + inherit sha256; + }); +in +stdenv.mkDerivation rec { + pname = "bash${lib.optionalString interactive "-interactive"}"; + version = "5.2${patch_suffix}"; + patch_suffix = "p${toString (builtins.length upstreamPatches)}"; + + src = fetchurl { + url = "mirror://gnu/bash/bash-${lib.removeSuffix patch_suffix version}.tar.gz"; + sha256 = "sha256-oTnBZt9/9EccXgczBRZC7lVWwcyKSnjxRVg8XIGrMvs="; + }; + + hardeningDisable = [ "format" ] + # bionic libc is super weird and has issues with fortify outside of its own libc, check this comment: + # https://github.com/NixOS/nixpkgs/pull/192630#discussion_r978985593 + # or you can check libc/include/sys/cdefs.h in bionic source code + ++ lib.optional (stdenv.hostPlatform.libc == "bionic") "fortify"; + + outputs = [ "out" "dev" "man" "doc" "info" ]; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = '' + -DSYS_BASHRC="/etc/bashrc" + -DSYS_BASH_LOGOUT="/etc/bash_logout" + '' + lib.optionalString (!forFHSEnv) '' + -DDEFAULT_PATH_VALUE="/no-such-path" + -DSTANDARD_UTILS_PATH="/no-such-path" + '' + '' + -DNON_INTERACTIVE_LOGIN_SHELLS + -DSSH_SOURCE_BASHRC + ''; + + patchFlags = [ "-p0" ]; + + patches = upstreamPatches ++ [ + ./pgrp-pipe-5.patch + (fetchurl { + name = "fix-static.patch"; + url = "https://cgit.freebsd.org/ports/plain/shells/bash/files/patch-configure?id=3e147a1f594751a68fea00a28090d0792bee0b51"; + sha256 = "XHFMQ6eXTReNoywdETyrfQEv1rKF8+XFbQZP4YoVKFk="; + }) + # Apply parallel build fix pending upstream inclusion: + # https://savannah.gnu.org/patch/index.php?10373 + # Had to fetch manually to workaround -p0 default. + ./parallel.patch + ]; + + configureFlags = [ + # At least on Linux bash memory allocator has pathological performance + # in scenarios involving use of larger memory: + # https://lists.gnu.org/archive/html/bug-bash/2023-08/msg00052.html + # Various distributions default to system allocator. Let's nixpkgs + # do the same. + "--without-bash-malloc" + (if interactive then "--with-installed-readline" else "--disable-readline") + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "bash_cv_job_control_missing=nomissing" + "bash_cv_sys_named_pipes=nomissing" + "bash_cv_getcwd_malloc=yes" + ] ++ lib.optionals stdenv.hostPlatform.isCygwin [ + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--with-installed-readline" + "bash_cv_dev_stdin=present" + "bash_cv_dev_fd=standard" + "bash_cv_termcap_lib=libncurses" + ] ++ lib.optionals (stdenv.hostPlatform.libc == "musl") [ + "--disable-nls" + ]; + + strictDeps = true; + # Note: Bison is needed because the patches above modify parse.y. + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ bison ] + ++ lib.optional withDocs texinfo + ++ lib.optional stdenv.hostPlatform.isDarwin stdenv.cc.bintools; + + buildInputs = lib.optional interactive readline; + + enableParallelBuilding = true; + + makeFlags = lib.optionals stdenv.hostPlatform.isCygwin [ + "LOCAL_LDFLAGS=-Wl,--export-all,--out-implib,libbash.dll.a" + "SHOBJ_LIBS=-lbash" + ]; + + nativeCheckInputs = [ util-linux ]; + doCheck = false; # dependency cycle, needs to be interactive + + postInstall = '' + ln -s bash "$out/bin/sh" + rm -f $out/lib/bash/Makefile.inc + ''; + + postFixup = + if interactive + then '' + substituteInPlace "$out/bin/bashbug" \ + --replace '#!/bin/sh' "#!$out/bin/bash" + '' + # most space is taken by locale data + else '' + rm -rf "$out/share" "$out/bin/bashbug" + ''; + + passthru = { + shellPath = "/bin/bash"; + tests.static = pkgsStatic.bash; + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/bash/"; + description = "GNU Bourne-Again Shell, the de facto standard shell on Linux" + lib.optionalString interactive " (for interactive use)"; + longDescription = '' + Bash is the shell, or command language interpreter, that will + appear in the GNU operating system. Bash is an sh-compatible + shell that incorporates useful features from the Korn shell + (ksh) and C shell (csh). It is intended to conform to the IEEE + POSIX P1003.2/ISO 9945.2 Shell and Tools standard. It offers + functional improvements over sh for both programming and + interactive use. In addition, most sh scripts can be run by + Bash without modification. + ''; + license = licenses.gpl3Plus; + platforms = platforms.all; + maintainers = with maintainers; [ dtzWill ]; + mainProgram = "bash"; + }; +} diff --git a/pkgs/by-name/ba/bash/bash-5.2-patches.nix b/pkgs/by-name/ba/bash/bash-5.2-patches.nix new file mode 100644 index 0000000..5d5ef94 --- /dev/null +++ b/pkgs/by-name/ba/bash/bash-5.2-patches.nix @@ -0,0 +1,30 @@ +# Automatically generated by `update-patch-set.sh'; do not edit. + +patch: [ +(patch "001" "02iibpd3jq8p1bhdzgik8ps6gi1145vr463a82gj1hivjbp2ybzl") +(patch "002" "1f6p1z85qh1lavdp3xikgp0bfv0vqhvgpgwmdzlywl35hwdmxk25") +(patch "003" "1zxsi869jd90hksx3nyypgyqwrxhw2ws3r6hmk76yc1lsgdhq2ba") +(patch "004" "04i5liw5cg6dqkdxfgazqc2jrw40bmclx3dx45bwy259pcj7g0iq") +(patch "005" "0mykflv9qnbx3jz71l4f7isadiw9knm4qimqkwsv9cv88dafpq7c") +(patch "006" "13265akl8w6zyrg0l7f0x6arjgqjhllcwl6lk46rl53x4mm5dq6i") +(patch "007" "146lrwkn5wgxzs6vx34wl47g69zsxdy032k40qzi626b47ya6015") +(patch "008" "1s5i8hcayrv25lc8fxcr431v634yx5sii53b8fmip789s0pxjjvb") +(patch "009" "1kfk25151ka9wkmk1myf12irgcmvhsd8b0nfifvhrszah9w82npr") +(patch "010" "1kf1jrwm30js0v3d1r2rk4x09s1pyjp70wnd1qqhf9bmkw15ww67") +(patch "011" "1x5nkvbj6hci7gx42q7qa72hg2a9wwxh85dk79gn521ypwjmy6w3") +(patch "012" "0b6lcwzm7v5bzjiwaz2c8n5aj77w8ckhp2vwk4v3zsdq3z70gc9g") +(patch "013" "1rkwpibd6j2ghppfhqsva2jm4kdni6b7jpdsxdps52643gc4yjq9") +(patch "014" "09766vqqw4ffnmysm725v35qkhp1g9j4qgqag941xvq655pj9y9y") +(patch "015" "12im449abnq5gaqjmdxr5i38kmp02fa8l8wffad3jryvd58r0wzg") +(patch "016" "05arb0hzmng03cr357lf6p8af0x2a1pznsd3psll03nibfy56n0m") +(patch "017" "129cvx4gfz8n23iw1lhbknbw86fyw6vh60jqj1wj3d5pr75wwj0w") +(patch "018" "105am94qxjc27gga4a8asvsi01090xwjfim3s16lafwjvm4xsha6") +(patch "019" "10njgv5mrc5rhsp5lvxcbm0pnzn59a8spi2nhdasifyl1a32cp1j") +(patch "020" "07f0wlmqjdfarp44w3gj9gdqbqm5x20rvlhpn34ngklmxcm2bz5n") +(patch "021" "1kahfqqalcwi4m73pg3ssz6lh0kcqsqax09myac7a15d2y0vhd43") +(patch "022" "0w74aym0g1fh48864a3qxh89f26iaq7wsbg7244c6kjr94527dbq") +(patch "023" "1lywjqbc36j5pdzfcvnz1zy30j76aqmsm190p888av0hw815b45g") +(patch "024" "1hq23djqbr7s9y2324jq9mxr5bwdkmgizn3zgpchbsqp054k85cp") +(patch "025" "0x9hc4silzl4d3zw4p43i5dm7w86k50j47f87lracwfgwy3z8f2i") +(patch "026" "1b1fhm1dsi67r8ip17s0xvx2qq31fsxc1g9n3r931dd0k9a1zvln") +] diff --git a/pkgs/by-name/ba/bash/bash-completion/default.nix b/pkgs/by-name/ba/bash/bash-completion/default.nix new file mode 100644 index 0000000..80f5ffe --- /dev/null +++ b/pkgs/by-name/ba/bash/bash-completion/default.nix @@ -0,0 +1,74 @@ +{ lib, stdenv, fetchurl +, fetchpatch +, autoreconfHook +, perl +, ps +, python3Packages +, bashInteractive +}: + +stdenv.mkDerivation rec { + pname = "bash-completion"; + version = "2.13.0"; + + # Using fetchurl because fetchGithub or fetchzip will have trouble on + # e.g. APFS filesystems (macOS) because of non UTF-8 characters in some of the + # test fixtures that are part of the repository. + # See discussion in https://github.com/NixOS/nixpkgs/issues/107768 + src = fetchurl { + url = "https://github.com/scop/${pname}/releases/download/${version}/${pname}-${version}.tar.xz"; + sha256 = "sha256-xfmaOeQPDRVMA/8VQ46H7OH1rGZjNqRFmJni/0vt89E="; + }; + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook ]; + + # tests are super flaky unfortunately, and regularly break. + # let's disable them for now. + doCheck = false; + nativeCheckInputs = [ + # perl is assumed by perldoc completion + perl + # ps assumed to exist by gdb, killall, pgrep, pidof, + # pkill, pwdx, renice, and reptyr completions + ps + python3Packages.pexpect + python3Packages.pytest + bashInteractive + ]; + + # - ignore test_gcc on ARM because it assumes -march=native + # - ignore test_chsh because it assumes /etc/shells exists + # - ignore test_ether_wake, test_ifdown, test_ifstat, test_ifup, + # test_iperf, test_iperf3, test_nethogs and ip_addresses + # because they try to touch network + # - ignore test_ls because impure logic + # - ignore test_screen because it assumes vt terminals exist + checkPhase = '' + pytest . \ + ${lib.optionalString stdenv.hostPlatform.isAarch "--ignore=test/t/test_gcc.py"} \ + --ignore=test/t/test_chsh.py \ + --ignore=test/t/test_ether_wake.py \ + --ignore=test/t/test_ifdown.py \ + --ignore=test/t/test_ifstat.py \ + --ignore=test/t/test_ifup.py \ + --ignore=test/t/test_iperf.py \ + --ignore=test/t/test_iperf3.py \ + --ignore=test/t/test_nethogs.py \ + --ignore=test/t/unit/test_unit_ip_addresses.py \ + --ignore=test/t/test_ls.py \ + --ignore=test/t/test_screen.py + ''; + + prePatch = lib.optionalString stdenv.isDarwin '' + sed -i -e 's/readlink -f/readlink/g' bash_completion completions/* + ''; + + meta = with lib; { + homepage = "https://github.com/scop/bash-completion"; + description = "Programmable completion for the bash shell"; + license = licenses.gpl2Plus; + platforms = platforms.unix; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/ba/bash/blesh/default.nix b/pkgs/by-name/ba/bash/blesh/default.nix new file mode 100644 index 0000000..8863376 --- /dev/null +++ b/pkgs/by-name/ba/bash/blesh/default.nix @@ -0,0 +1,62 @@ +{ lib +, stdenvNoCC +, fetchzip +, runtimeShell +, bashInteractive +, glibcLocales +}: + +stdenvNoCC.mkDerivation rec { + pname = "blesh"; + version = "0.4.0-devel3"; + + src = fetchzip { + url = "https://github.com/akinomyoga/ble.sh/releases/download/v${version}/ble-${version}.tar.xz"; + sha256 = "sha256-kGLp8RaInYSrJEi3h5kWEOMAbZV/gEPFUjOLgBuMhCI="; + }; + + dontBuild = true; + + doCheck = true; + nativeCheckInputs = [ bashInteractive glibcLocales ]; + preCheck = "export LC_ALL=en_US.UTF-8"; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/share/blesh/lib" + + cat <"$out/share/blesh/lib/_package.sh" + _ble_base_package_type=nix + + function ble/base/package:nix/update { + echo "Ble.sh is installed by Nix. You can update it there." >&2 + return 1 + } + EOF + + cp -rv $src/* $out/share/blesh + + runHook postInstall + ''; + + postInstall = '' + mkdir -p "$out/bin" + cat <"$out/bin/blesh-share" + #!${runtimeShell} + # Run this script to find the ble.sh shared folder + # where all the shell scripts are living. + echo "$out/share/blesh" + EOF + chmod +x "$out/bin/blesh-share" + ''; + + meta = with lib; { + homepage = "https://github.com/akinomyoga/ble.sh"; + description = "Bash Line Editor -- a full-featured line editor written in pure Bash"; + mainProgram = "blesh-share"; + license = licenses.bsd3; + maintainers = with maintainers; [ aiotter ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ba/bash/fzf-obc/default.nix b/pkgs/by-name/ba/bash/fzf-obc/default.nix new file mode 100644 index 0000000..7621ae8 --- /dev/null +++ b/pkgs/by-name/ba/bash/fzf-obc/default.nix @@ -0,0 +1,30 @@ +{ lib, stdenv, fetchFromGitHub }: + +stdenv.mkDerivation rec { + pname = "fzf-obc"; + version = "1.3.0"; + + src = fetchFromGitHub { + owner = "rockandska"; + repo = pname; + rev = version; + sha256 = "sha256-KIAlDpt1Udl+RLp3728utgQ9FCjZz/OyoG92MOJmgPI="; + }; + + dontBuild = true; + + installPhase = '' + mkdir -p $out/share/fzf-obc/{bin,lib/fzf-obc,plugins/{kill,gradle}} + install -m644 bin/* $out/share/fzf-obc/bin + install -m644 lib/fzf-obc/* $out/share/fzf-obc/lib/fzf-obc + install -m644 plugins/kill/* $out/share/fzf-obc/plugins/kill + install -m644 plugins/gradle/* $out/share/fzf-obc/plugins/gradle + ''; + + meta = with lib; { + homepage = "https://fzf-obc.readthedocs.io"; + description = "Completion script adding fzf over all know bash completion functions"; + license = licenses.unfree; + maintainers = with maintainers; [ loicreynier ]; + }; +} diff --git a/pkgs/by-name/ba/bash/nix-bash-completions/default.nix b/pkgs/by-name/ba/bash/nix-bash-completions/default.nix new file mode 100644 index 0000000..10fb097 --- /dev/null +++ b/pkgs/by-name/ba/bash/nix-bash-completions/default.nix @@ -0,0 +1,59 @@ +{ lib, stdenv, fetchFromGitHub, fetchpatch }: + +stdenv.mkDerivation rec { + version = "0.6.8"; + pname = "nix-bash-completions"; + + src = fetchFromGitHub { + owner = "hedning"; + repo = "nix-bash-completions"; + rev = "v${version}"; + sha256 = "1n5zs6xcnv4bv1hdaypmz7fv4j7dsr4a0ifah99iyj4p5j85i1bc"; + }; + + patches = [ + # Fix improper escaping: https://github.com/NixOS/nixpkgs/issues/284162 + (fetchpatch { + url = "https://github.com/hedning/nix-bash-completions/pull/28/commits/ef2055aa28754fa9e009bbfebc1491972e4f4e67.patch"; + hash = "sha256-TRkHrk7bX7DX0COzzYR+1pgTqLy7J55BcejNjRwthII="; + }) + ]; + + postPatch = '' + # Nix 2.4+ provides its own completion for the nix command, see https://github.com/hedning/nix-bash-completions/issues/20 + # NixOS provides its own completions for nixos-rebuild now. + substituteInPlace _nix \ + --replace 'nix nixos-option' 'nixos-option' \ + --replace 'nixos-rebuild nixos-install' 'nixos-install' + ''; + + strictDeps = true; + # To enable lazy loading via bash-completion we need a symlink to the script + # from every command name. + installPhase = '' + runHook preInstall + + commands=$( + function complete() { shift 2; echo "$@"; } + shopt -s extglob + source _nix + ) + install -Dm444 -t $out/share/bash-completion/completions _nix + cd $out/share/bash-completion/completions + for c in $commands; do + ln -s _nix $c + done + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/hedning/nix-bash-completions"; + description = "Bash completions for Nix, NixOS, and NixOps"; + license = licenses.bsd3; + platforms = platforms.all; + maintainers = with maintainers; [ hedning ncfavier ]; + # Set a lower priority such that Nix wins in case of conflicts. + priority = 10; + }; +} diff --git a/pkgs/by-name/ba/bash/packages.nix b/pkgs/by-name/ba/bash/packages.nix new file mode 100644 index 0000000..758d7d5 --- /dev/null +++ b/pkgs/by-name/ba/bash/packages.nix @@ -0,0 +1,19 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + bash = lowPrio (callPackage ./5.nix { }); + # WARNING: this attribute is used by nix-shell so it shouldn't be removed/renamed + bashInteractive = callPackage ./5.nix { + interactive = true; + withDocs = true; + }; + bashInteractiveFHS = callPackage ./5.nix { + interactive = true; + withDocs = true; + forFHSEnv = true; + }; + + bash-completion = callPackage ./bash-completion { }; +} diff --git a/pkgs/by-name/ba/bash/parallel.patch b/pkgs/by-name/ba/bash/parallel.patch new file mode 100644 index 0000000..d9a0cc2 --- /dev/null +++ b/pkgs/by-name/ba/bash/parallel.patch @@ -0,0 +1,12 @@ +From https://savannah.gnu.org/patch/index.php?10373 + https://savannah.gnu.org/patch/download.php?file_id=54964 +--- Makefile.in ++++ Makefile.in +@@ -1432,6 +1432,7 @@ siglist.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + subst.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + test.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + trap.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h ++unwind_prot.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + variables.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + version.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h + xmalloc.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h diff --git a/pkgs/by-name/ba/bash/pgrp-pipe-5.patch b/pkgs/by-name/ba/bash/pgrp-pipe-5.patch new file mode 100644 index 0000000..71b3979 --- /dev/null +++ b/pkgs/by-name/ba/bash/pgrp-pipe-5.patch @@ -0,0 +1,15 @@ +--- ./configure 2022-12-20 17:13:17.804045620 +0100 ++++ ./configure-fixed 2022-12-20 17:16:00.444114824 +0100 +@@ -21723,11 +21723,7 @@ + solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading +- case "`uname -r`" in +- 1.*|2.[0123]*) : ;; +- *) printf "%s\n" "#define PGRP_PIPE 1" >>confdefs.h +- ;; +- esac ;; ++ printf "%s\n" "#define PGRP_PIPE 1" >>confdefs.h ;; + netbsd*|openbsd*) LOCAL_CFLAGS="-DDEV_FD_STAT_BROKEN" ;; + freebsd*|midnightbsd*) LOCAL_CFLAGS='-DHEREDOC_PIPESIZE=4096' ;; + *qnx[67]*) LOCAL_LIBS="-lncurses" ;; diff --git a/pkgs/by-name/ba/bash/undistract-me/default.nix b/pkgs/by-name/ba/bash/undistract-me/default.nix new file mode 100644 index 0000000..b15903e --- /dev/null +++ b/pkgs/by-name/ba/bash/undistract-me/default.nix @@ -0,0 +1,81 @@ +{ lib +, stdenvNoCC +, fetchFromGitHub +, fetchpatch +, coreutils +, gnused +, libnotify +, pulseaudio +, sound-theme-freedesktop +, xprop +}: + +stdenvNoCC.mkDerivation rec { + pname = "undistract-me"; + version = "unstable-2020-08-09"; + + src = fetchFromGitHub { + owner = "jml"; + repo = pname; + rev = "2f8ac25c6ad8efcf160d2b480825b1cbb6772aab"; + hash = "sha256-Qw7Cu9q0ZgK/RTvyDdHM5N3eBaKjtYqYH0J+hKMUZX8="; + }; + + patches = [ + # Don't block the terminal when notification sound is played + # + # See https://github.com/jml/undistract-me/pull/69 + (fetchpatch { + url = "https://github.com/jml/undistract-me/commit/2356ebbe8bf2bcb4b95af1ae2bcdc786ce7cc6e8.patch"; + sha256 = "sha256-Ij3OXTOnIQsYhKVmqjChhN1q4ASZ7waOkfQTTp5XfPo="; + }) + + # Fix showing notifications when using Wayland apps with XWayland + # running, or connection to X server fails. + # + # NOTE: Without a real X server, notifications will not be + # suppressed when the window running the command is focused. + # + # See https://github.com/jml/undistract-me/pull/71 + (fetchpatch { + url = "https://github.com/jml/undistract-me/commit/3f4ceaf5a4eba8e3cb02236c48247f87e3d1124f.patch"; + sha256 = "sha256-9AK9Jp3TXJ75Y+jwZXlwQ6j54FW1rOBddoktrm0VX68="; + }) + ]; + + strictDeps = true; + + # Patch in dependencies. Can't use makeWrapper because the bash + # functions will be sourced and invoked in a different environment + # for each command invocation. + postPatch = '' + for script in *.bash *.sh; do + substituteInPlace "$script" \ + --replace /usr/share/undistract-me "$out/share/undistract-me" \ + --replace basename ${coreutils}/bin/basename \ + --replace 'cut ' '${coreutils}/bin/cut ' \ + --replace date ${coreutils}/bin/date \ + --replace dirname ${coreutils}/bin/dirname \ + --replace sed ${gnused}/bin/sed \ + --replace notify-send ${libnotify}/bin/notify-send \ + --replace paplay ${pulseaudio}/bin/paplay \ + --replace /usr/share/sounds/freedesktop ${sound-theme-freedesktop}/share/sounds/freedesktop \ + --replace xprop ${xprop}/bin/xprop + done + ''; + + installPhase = '' + mkdir -p "$out/share/undistract-me" "$out/etc/profile.d" "$out/share/licenses/undistract-me" + cp long-running.bash "$out/share/undistract-me" + cp preexec.bash "$out/share/undistract-me" + cp undistract-me.sh "$out/etc/profile.d" + cp LICENSE "$out/share/licenses/undistract-me" + ''; + + meta = with lib; { + description = "Notifies you when long-running terminal commands complete"; + homepage = "https://github.com/jml/undistract-me"; + license = licenses.mit; + maintainers = with maintainers; [ kira-bruneau ]; + }; +} diff --git a/pkgs/by-name/ba/bash/update-patch-set.sh b/pkgs/by-name/ba/bash/update-patch-set.sh new file mode 100755 index 0000000..ee785cc --- /dev/null +++ b/pkgs/by-name/ba/bash/update-patch-set.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -i bash -p wget -p gnupg -p cacert -p nix + +# Update patch set for GNU Bash or Readline. + +if [ $# -ne 2 ] +then + echo "Usage: $(basename "$0") PROJECT VERSION" + echo "" + echo "Update the patch set for PROJECT (one of \`bash' or \`readline') for" + echo "the given version (e.g., \`4.0'). Produce \`PROJECT-patches.nix'." + exit 1 +fi + +PROJECT="$1" +VERSION="$2" +DIR=$(dirname "$0") +VERSION_CONDENSED="$(echo "$VERSION" | sed -es/\\.//g)" +PATCH_LIST="$DIR/$PROJECT-$VERSION-patches.nix" + +set -e + +rm -vf "$PATCH_LIST" + +wget "https://tiswww.case.edu/php/chet/gpgkey.asc" +echo "4ef5051ce7200241e65d29c11eb57df8 gpgkey.asc" > gpgkey.asc.md5 +md5sum -c gpgkey.asc.md5 +gpg --import ./gpgkey.asc +rm gpgkey.asc{,.md5} + +( echo "# Automatically generated by \`$(basename "$0")'; do not edit." ; \ + echo "" ; \ + echo "patch: [" ) \ +>> "$PATCH_LIST" + +for i in {001..100} +do + wget -P "$DIR" "ftp.gnu.org/gnu/$PROJECT/$PROJECT-$VERSION-patches/$PROJECT$VERSION_CONDENSED-$i" || break + wget -P "$DIR" "ftp.gnu.org/gnu/$PROJECT/$PROJECT-$VERSION-patches/$PROJECT$VERSION_CONDENSED-$i.sig" + gpg --verify "$DIR/$PROJECT$VERSION_CONDENSED-$i.sig" + hash=$(nix-hash --flat --type sha256 --base32 "$DIR/$PROJECT$VERSION_CONDENSED-$i") + echo "(patch \"$i\" \"$hash\")" \ + >> "$PATCH_LIST" + + rm -f "$DIR/$PROJECT$VERSION_CONDENSED-$i"{,.sig} +done + +echo "]" >> "$PATCH_LIST" + +# bash interprets numbers starting with 0 as octals +echo "Got $((10#$i - 1)) patches." +echo "Patch list has been written to \`$PATCH_LIST'." diff --git a/pkgs/by-name/ba/bash/yarn-completion/default.nix b/pkgs/by-name/ba/bash/yarn-completion/default.nix new file mode 100644 index 0000000..48d1f42 --- /dev/null +++ b/pkgs/by-name/ba/bash/yarn-completion/default.nix @@ -0,0 +1,35 @@ +{ lib +, stdenv +, fetchFromGitHub +, installShellFiles +}: + +stdenv.mkDerivation rec { + pname = "yarn-bash-completion"; + version = "0.17.0"; + + src = fetchFromGitHub { + owner = "dsifford"; + repo = "yarn-completion"; + rev = "v${version}"; + sha256 = "0xflbrbwskjqv3knvc8jqygpvfxh5ak66q7w22d1ng8gwrfqzcng"; + }; + + strictDeps = true; + nativeBuildInputs = [ installShellFiles ]; + + installPhase = '' + runHook preInstall + + installShellCompletion --cmd yarn ./yarn-completion.bash + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/dsifford/yarn-completion/"; + description = "Bash completion for Yarn"; + license = licenses.mit; + maintainers = with maintainers; [ DamienCassou ]; + }; +} diff --git a/pkgs/by-name/bc/bc/cross-bc.patch b/pkgs/by-name/bc/bc/cross-bc.patch new file mode 100644 index 0000000..ba8857a --- /dev/null +++ b/pkgs/by-name/bc/bc/cross-bc.patch @@ -0,0 +1,169 @@ +commit fdda59736ddc048cf38a2c7103f4f5d9eeaf995e +Author: Ben Gamari +Date: Tue Oct 17 10:51:34 2017 -0400 + + Try implementing cross-compilation + +diff --git a/bc/Makefile.am b/bc/Makefile.am +index d9d412e..fdef633 100644 +--- a/bc/Makefile.am ++++ b/bc/Makefile.am +@@ -17,6 +17,7 @@ MAINTAINERCLEANFILES = Makefile.in bc.c bc.h scan.c \ + + AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../h + LIBBC = ../lib/libbc.a ++LIBBC_HOST = ../lib/libbc_host.a + LIBL = @LEXLIB@ + LDADD = $(LIBBC) $(LIBL) @READLINELIB@ + +@@ -29,12 +30,20 @@ $(PROGRAMS): libmath.h $(LIBBC) + scan.o: bc.h + global.o: libmath.h ++ ++main_host.c : main.c ++ cp $< $@ + +-fbcOBJ = main.o bc.o scan.o execute.o load.o storage.o util.o warranty.o ++fbcOBJ = $(addsuffix _host,main.o bc.o scan.o execute.o load.o storage.o util.o warranty.o) ++ ++%.o_host : CC:=$(CC_FOR_BUILD) ++ ++%.o_host : %.c ++ $(COMPILE) -c $(CFLAGS) $(INCLUDES) -o $@ $< + +-libmath.h: libmath.b $(fbcOBJ) $(LIBBC) ++libmath.h: libmath.b $(fbcOBJ) $(LIBBC_HOST) + echo '{0}' > libmath.h +- $(MAKE) global.o +- $(LINK) -o fbc $(fbcOBJ) global.o $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) ++ $(MAKE) global.o_host ++ $(CC_FOR_BUILD) -o fbc $(fbcOBJ) global.o_host $(LIBBC_HOST) $(LIBL) ${READLINELIB} $(LIBS) + ./fbc -c $(srcdir)/libmath.b libmath.h + $(srcdir)/fix-libmath_h + rm -f ./fbc ./global.o +diff --git a/configure.ac b/configure.ac +index fc74573..5cabb73 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -20,6 +20,7 @@ m4_define([dc_version], 1.4.1) + + AC_INIT([bc],[bc_version]) + AC_CONFIG_SRCDIR(doc/bc.1) ++AC_CONFIG_MACRO_DIR([m4]) + AM_INIT_AUTOMAKE([dist-bzip2]) + AC_CONFIG_HEADERS(config.h) + +@@ -35,6 +36,7 @@ AC_DEFINE([DC_COPYRIGHT], + [Define the dc copyright line.]) + + AC_PROG_CC ++AX_CC_FOR_BUILD + AC_USE_SYSTEM_EXTENSIONS + + AM_PROG_LEX +diff --git a/lib/Makefile.am b/lib/Makefile.am +index ec4bf59..c670f5b 100644 +--- a/lib/Makefile.am ++++ b/lib/Makefile.am +@@ -1,5 +1,5 @@ + ## Process this file with automake to produce Makefile.in +-noinst_LIBRARIES = libbc.a ++noinst_LIBRARIES = libbc.a libbc_host.a + + AM_CPPFLAGS = -I. -I.. -I$(srcdir)/../h + +@@ -24,3 +24,11 @@ testmul: testmul.o number.o + + specialnumber: newnumber.o + cp newnumber.o number.o ++ ++%.o_host : CC:=$(CC_FOR_BUILD) ++%.o_host : %.c ++ $(COMPILE) -c $(CFLAGS) $(INCLUDES) -o $@ $< ++ ++libbc_host.a : $(addsuffix _host,$(libbc_a_OBJECTS)) ++ ar cru $@ $+ ++ ranlib $@ +diff --git a/m4/cc_for_build.m4 b/m4/cc_for_build.m4 +new file mode 100644 +index 0000000..c62ffad +--- /dev/null ++++ b/m4/cc_for_build.m4 +@@ -0,0 +1,77 @@ ++# =========================================================================== ++# https://www.gnu.org/software/autoconf-archive/ax_cc_for_build.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_CC_FOR_BUILD ++# ++# DESCRIPTION ++# ++# Find a build-time compiler. Sets CC_FOR_BUILD and EXEEXT_FOR_BUILD. ++# ++# LICENSE ++# ++# Copyright (c) 2010 Reuben Thomas ++# Copyright (c) 1999 Richard Henderson ++# ++# This program is free software: you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation, either version 3 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++# Public License for more details. ++# ++# You should have received a copy of the GNU General Public License along ++# with this program. If not, see . ++# ++# As a special exception, the respective Autoconf Macro's copyright owner ++# gives unlimited permission to copy, distribute and modify the configure ++# scripts that are the output of Autoconf when processing the Macro. You ++# need not follow the terms of the GNU General Public License when using ++# or distributing such scripts, even though portions of the text of the ++# Macro appear in them. The GNU General Public License (GPL) does govern ++# all other use of the material that constitutes the Autoconf Macro. ++# ++# This special exception to the GPL applies to versions of the Autoconf ++# Macro released by the Autoconf Archive. When you make and distribute a ++# modified version of the Autoconf Macro, you may extend this special ++# exception to the GPL to apply to your modified version as well. ++ ++#serial 3 ++ ++dnl Get a default for CC_FOR_BUILD to put into Makefile. ++AC_DEFUN([AX_CC_FOR_BUILD], ++[# Put a plausible default for CC_FOR_BUILD in Makefile. ++if test -z "$CC_FOR_BUILD"; then ++ if test "x$cross_compiling" = "xno"; then ++ CC_FOR_BUILD='$(CC)' ++ else ++ CC_FOR_BUILD=gcc ++ fi ++fi ++AC_SUBST(CC_FOR_BUILD) ++# Also set EXEEXT_FOR_BUILD. ++if test "x$cross_compiling" = "xno"; then ++ EXEEXT_FOR_BUILD='$(EXEEXT)' ++else ++ AC_CACHE_CHECK([for build system executable suffix], bfd_cv_build_exeext, ++ [rm -f conftest* ++ echo 'int main () { return 0; }' > conftest.c ++ bfd_cv_build_exeext= ++ ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 ++ for file in conftest.*; do ++ case $file in ++ *.c | *.o | *.obj | *.ilk | *.pdb) ;; ++ *) bfd_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; ++ esac ++ done ++ rm -f conftest* ++ test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no]) ++ EXEEXT_FOR_BUILD="" ++ test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext} ++fi ++AC_SUBST(EXEEXT_FOR_BUILD)])dnl diff --git a/pkgs/by-name/bc/bc/default.nix b/pkgs/by-name/bc/bc/default.nix new file mode 100644 index 0000000..e788fc5 --- /dev/null +++ b/pkgs/by-name/bc/bc/default.nix @@ -0,0 +1,40 @@ +{ lib, stdenv, autoreconfHook, buildPackages +, fetchurl, flex, readline, ed, texinfo +}: + +stdenv.mkDerivation rec { + pname = "bc"; + version = "1.07.1"; + src = fetchurl { + url = "mirror://gnu/bc/${pname}-${version}.tar.gz"; + sha256 = "62adfca89b0a1c0164c2cdca59ca210c1d44c3ffc46daf9931cf4942664cb02a"; + }; + + configureFlags = [ "--with-readline" ]; + + # As of 1.07 cross-compilation is quite complicated as the build system wants + # to build a code generator, bc/fbc, on the build machine. + patches = [ ./cross-bc.patch ]; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ + # Tools + autoreconfHook ed flex texinfo + # Libraries for build + buildPackages.readline buildPackages.ncurses + ]; + buildInputs = [ readline flex ]; + + doCheck = true; # not cross + + # Hack to make sure we never to the relaxation `$PATH` and hooks support for + # compatibility. This will be replaced with something clearer in a future + # masss-rebuild. + strictDeps = true; + + meta = with lib; { + description = "GNU software calculator"; + homepage = "https://www.gnu.org/software/bc/"; + license = licenses.gpl3Plus; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/bi/bind/default.nix b/pkgs/by-name/bi/bind/default.nix new file mode 100644 index 0000000..7829e48 --- /dev/null +++ b/pkgs/by-name/bi/bind/default.nix @@ -0,0 +1,131 @@ +{ stdenv +, lib +, fetchurl +, perl +, pkg-config +, libcap +, libidn2 +, libtool +, libxml2 +, openssl +, libuv +, nghttp2 +, jemalloc +, enablePython ? false +, python3 +, enableGSSAPI ? true +, libkrb5 +, buildPackages +, cmocka +, tzdata +# for passthru.tests +# , nixosTests +# , gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "bind"; + version = "9.18.26"; + + src = fetchurl { + url = "https://downloads.isc.org/isc/bind9/${version}/${pname}-${version}.tar.xz"; + hash = "sha256-df/uUnMelgTISbZY3ynpJ/HE8B1aceo+vL62NwLLZlE="; + }; + + outputs = [ "out" "lib" "dev" "man" "dnsutils" "host" ]; + + patches = [ + ./dont-keep-configure-flags.patch + ]; + + nativeBuildInputs = [ perl pkg-config ]; + buildInputs = [ libidn2 libtool libxml2 openssl libuv nghttp2 jemalloc ] + ++ lib.optional stdenv.isLinux libcap + ++ lib.optional enableGSSAPI libkrb5 + ++ lib.optional enablePython (python3.withPackages (ps: with ps; [ ply ])); + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + configureFlags = [ + "--localstatedir=/var" + "--without-lmdb" + "--with-libidn2" + ] ++ lib.optional enableGSSAPI "--with-gssapi=${libkrb5.dev}/bin/krb5-config" + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "BUILD_CC=$(CC_FOR_BUILD)"; + + postInstall = '' + moveToOutput bin/bind9-config $dev + + moveToOutput bin/host $host + + moveToOutput bin/dig $dnsutils + moveToOutput bin/delv $dnsutils + moveToOutput bin/nslookup $dnsutils + moveToOutput bin/nsupdate $dnsutils + + for f in "$lib/lib/"*.la "$dev/bin/"bind*-config; do + sed -i "$f" -e 's|-L${openssl.dev}|-L${lib.getLib openssl}|g' + done + + cat <$out/etc/rndc.conf + include "/etc/bind/rndc.key"; + options { + default-key "rndc-key"; + default-server 127.0.0.1; + default-port 953; + }; + EOF + ''; + + enableParallelBuilding = true; + + doCheck = false; + # TODO: investigate failures; see this and linked discussions: + # https://github.com/NixOS/nixpkgs/pull/192962 + /* + doCheck = with stdenv.hostPlatform; !isStatic && !(isAarch64 && isLinux) + # https://gitlab.isc.org/isc-projects/bind9/-/issues/4269 + && !is32bit; + */ + checkTarget = "unit"; + checkInputs = [ + cmocka + ] ++ lib.optionals (!stdenv.hostPlatform.isMusl) [ + tzdata + ]; + preCheck = lib.optionalString stdenv.hostPlatform.isMusl '' + # musl doesn't respect TZDIR, skip timezone-related tests + sed -i '/^ISC_TEST_ENTRY(isc_time_formatISO8601L/d' tests/isc/time_test.c + '' + lib.optionalString stdenv.hostPlatform.isDarwin '' + # Test timeouts on Darwin + sed -i '/^ISC_TEST_ENTRY(tcpdns_recv_one/d' tests/isc/netmgr_test.c + ''; + + # passthru = { + # tests = { + # inherit (nixosTests) bind; + # prometheus-exporter = nixosTests.prometheus-exporters.bind; + # kubernetes-dns-single-node = nixosTests.kubernetes.dns-single-node; + # kubernetes-dns-multi-node = nixosTests.kubernetes.dns-multi-node; + # }; + + # updateScript = gitUpdater { + # # No nicer place to find latest stable release. + # url = "https://gitlab.isc.org/isc-projects/bind9.git"; + # rev-prefix = "v"; + # # Avoid unstable 9.19 releases. + # odd-unstable = true; + # }; + # }; + + meta = with lib; { + homepage = "https://www.isc.org/bind/"; + description = "Domain name server"; + license = licenses.mpl20; + changelog = "https://downloads.isc.org/isc/bind9/cur/${lib.versions.majorMinor version}/CHANGES"; + maintainers = with maintainers; [ globin ]; + platforms = platforms.unix; + + outputsToInstall = [ "out" "dnsutils" "host" ]; + }; +} diff --git a/pkgs/by-name/bi/bind/dont-keep-configure-flags.patch b/pkgs/by-name/bi/bind/dont-keep-configure-flags.patch new file mode 100644 index 0000000..b1677da --- /dev/null +++ b/pkgs/by-name/bi/bind/dont-keep-configure-flags.patch @@ -0,0 +1,40 @@ +diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h +index 82b632ef04..dedfd4d33b 100644 +--- a/bin/named/include/named/globals.h ++++ b/bin/named/include/named/globals.h +@@ -69,7 +69,9 @@ EXTERN const char *named_g_version INIT(PACKAGE_VERSION); + EXTERN const char *named_g_product INIT(PACKAGE_NAME); + EXTERN const char *named_g_description INIT(PACKAGE_DESCRIPTION); + EXTERN const char *named_g_srcid INIT(PACKAGE_SRCID); ++#if 0 + EXTERN const char *named_g_configargs INIT(PACKAGE_CONFIGARGS); ++#endif + EXTERN const char *named_g_builder INIT(PACKAGE_BUILDER); + EXTERN in_port_t named_g_port INIT(0); + EXTERN in_port_t named_g_tlsport INIT(0); +diff --git a/bin/named/main.c b/bin/named/main.c +index 9ad2d0e277..9729a2b3fc 100644 +--- a/bin/named/main.c ++++ b/bin/named/main.c +@@ -481,7 +481,9 @@ printversion(bool verbose) { + } + + printf("running on %s\n", named_os_uname()); ++#if 0 + printf("built by %s with %s\n", PACKAGE_BUILDER, PACKAGE_CONFIGARGS); ++#endif + #ifdef __clang__ + printf("compiled by CLANG %s\n", __VERSION__); + #else /* ifdef __clang__ */ +@@ -1027,9 +1029,11 @@ setup(void) { + NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, "running on %s", + named_os_uname()); + ++#if 0 + isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, + NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, "built with %s", + PACKAGE_CONFIGARGS); ++#endif + + isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, + NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, diff --git a/pkgs/by-name/bi/bind/packages.nix b/pkgs/by-name/bi/bind/packages.nix new file mode 100644 index 0000000..e43d4e8 --- /dev/null +++ b/pkgs/by-name/bi/bind/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + bind = callPackage ./. { }; + dnsutils = bind.dnsutils; + dig = lib.addMetaAttrs { mainProgram = "dig"; } bind.dnsutils; +} diff --git a/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch b/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch new file mode 100644 index 0000000..f9c6e88 --- /dev/null +++ b/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch @@ -0,0 +1,137 @@ +From beca4a2c25ee86e4020f8b8bddc4d8e0ed3430b3 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Tue, 22 Feb 2022 11:28:04 +0900 +Subject: [PATCH] Revert "libtool.m4: fix nm BSD flag detection" + +This reverts commit bef9ef8ca0f941d743c77cc55b5fe7985990b2a7. +--- + ChangeLog | 9 ------ + libtool.m4 | 88 ++++++++++++++++++++++++++---------------------------- + 2 files changed, 43 insertions(+), 54 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 18e8b6835da..c12f07403c3 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -375,15 +375,6 @@ + + * src-release.sh (GDB_SUPPPORT_DIRS): Add libbacktrace. + +-2021-09-27 Nick Alcock +- +- PR libctf/27967 +- * libtool.m4 (LT_PATH_NM): Try BSDization flags with a user-provided +- NM, if there is one. Run nm on itself, not on /dev/null, to avoid +- errors from nms that refuse to work on non-regular files. Remove +- other workarounds for this problem. Strip out blank lines from the +- nm output. +- + 2021-09-27 Nick Alcock + + PR libctf/27967 +diff --git a/libtool.m4 b/libtool.m4 +index a216bb14e99..7a711249304 100644 +--- a/libtool.m4 ++++ b/libtool.m4 +@@ -3200,55 +3200,53 @@ _LT_DECL([], [file_magic_cmd], [1], + + # LT_PATH_NM + # ---------- +-# find the pathname to a BSD- or MS-compatible name lister, and any flags +-# needed to make it compatible ++# find the pathname to a BSD- or MS-compatible name lister + AC_DEFUN([LT_PATH_NM], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, + [if test -n "$NM"; then +- # Let the user override the nm to test. +- lt_nm_to_check="$NM" +- else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- case "$lt_tmp_nm" in +- */*|*\\*) tmp_nm="$lt_tmp_nm";; +- *) tmp_nm="$ac_dir/$lt_tmp_nm";; +- esac +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- case `"$tmp_nm" -B "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in +- *$tmp_nm*) lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in +- *$tmp_nm*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no}]) ++ # Let the user override the test. ++ lt_cv_path_NM="$NM" ++else ++ lt_nm_to_check="${ac_tool_prefix}nm" ++ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then ++ lt_nm_to_check="$lt_nm_to_check nm" ++ fi ++ for lt_tmp_nm in $lt_nm_to_check; do ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ tmp_nm="$ac_dir/$lt_tmp_nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then ++ # Check to see if the nm accepts a BSD-compat flag. ++ # Adding the `sed 1q' prevents false positives on HP-UX, which says: ++ # nm: unknown option "B" ignored ++ # Tru64's nm complains that /dev/null is an invalid object file ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) ++ lt_cv_path_NM="$tmp_nm -B" ++ break ++ ;; ++ *) ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ done ++ IFS="$lt_save_ifs" ++ done ++ : ${lt_cv_path_NM=no} ++fi]) + if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" + else +-- +2.34.1 + diff --git a/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-the-NM-nm-over-here-B-option-w.patch b/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-the-NM-nm-over-here-B-option-w.patch new file mode 100644 index 0000000..b5083d8 --- /dev/null +++ b/pkgs/by-name/bi/binutils/0001-Revert-libtool.m4-fix-the-NM-nm-over-here-B-option-w.patch @@ -0,0 +1,42 @@ +This reverts upstream commit caf606c90d55305967b9253447dda93d2f1835ab +until https://sourceware.org/PR29547 is fixed. + +--- a/libtool.m4 ++++ b/libtool.m4 +@@ -3214,31 +3214,25 @@ AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, + lt_nm_to_check="$lt_nm_to_check nm" + fi + fi +- for lt_tmp_nm in "$lt_nm_to_check"; do ++ for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. +- # Strip out any user-provided options from the nm to test twice, +- # the first time to test to see if nm (rather than its options) has +- # an explicit path, the second time to yield a file which can be +- # nm'ed itself. +- tmp_nm_path="`$ECHO "$lt_tmp_nm" | sed 's, -.*$,,'`" +- case "$tmp_nm_path" in ++ case "$lt_tmp_nm" in + */*|*\\*) tmp_nm="$lt_tmp_nm";; + *) tmp_nm="$ac_dir/$lt_tmp_nm";; + esac +- tmp_nm_to_nm="`$ECHO "$tmp_nm" | sed 's, -.*$,,'`" +- if test -f "$tmp_nm_to_nm" || test -f "$tmp_nm_to_nm$ac_exeext" ; then ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored +- case `"$tmp_nm" -B "$tmp_nm_to_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in ++ case `"$tmp_nm" -B "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in + *$tmp_nm*) lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) +- case `"$tmp_nm" -p "$tmp_nm_to_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in ++ case `"$tmp_nm" -p "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in + *$tmp_nm*) + lt_cv_path_NM="$tmp_nm -p" + break diff --git a/pkgs/by-name/bi/binutils/0001-libtool.m4-update-macos-version-detection-block.patch b/pkgs/by-name/bi/binutils/0001-libtool.m4-update-macos-version-detection-block.patch new file mode 100644 index 0000000..e601be3 --- /dev/null +++ b/pkgs/by-name/bi/binutils/0001-libtool.m4-update-macos-version-detection-block.patch @@ -0,0 +1,47 @@ +From 33a8dc728eb5da3e1d3439c96810d1f6b2660b89 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Tue, 22 Feb 2022 12:24:46 +0900 +Subject: [PATCH] libtool.m4: update macos version detection block + +Includes upstream change +9e8c882517082fe5755f2524d23efb02f1522490 +--- + libtool.m4 | 21 ++++++++------------- + 1 file changed, 8 insertions(+), 13 deletions(-) + +diff --git a/libtool.m4 b/libtool.m4 +index 7a711249304..f452efb4300 100644 +--- a/libtool.m4 ++++ b/libtool.m4 +@@ -996,20 +996,15 @@ _LT_EOF + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; ++ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- darwin*) # darwin 5.x on +- # if running on 10.5 or later, the deployment target defaults +- # to the OS version, if on x86, and 10.4, the deployment +- # target defaults to 10.4. Don't you love it? +- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in +- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- 10.[[012]][[,.]]*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- 10.*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; ++ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; ++ darwin*) ++ case $MACOSX_DEPLOYMENT_TARGET,$host in ++ 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) ++ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; ++ *) ++ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac +-- +2.34.1 + diff --git a/pkgs/by-name/bi/binutils/2.38/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch b/pkgs/by-name/bi/binutils/2.38/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch new file mode 100644 index 0000000..f9c6e88 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch @@ -0,0 +1,137 @@ +From beca4a2c25ee86e4020f8b8bddc4d8e0ed3430b3 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Tue, 22 Feb 2022 11:28:04 +0900 +Subject: [PATCH] Revert "libtool.m4: fix nm BSD flag detection" + +This reverts commit bef9ef8ca0f941d743c77cc55b5fe7985990b2a7. +--- + ChangeLog | 9 ------ + libtool.m4 | 88 ++++++++++++++++++++++++++---------------------------- + 2 files changed, 43 insertions(+), 54 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 18e8b6835da..c12f07403c3 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -375,15 +375,6 @@ + + * src-release.sh (GDB_SUPPPORT_DIRS): Add libbacktrace. + +-2021-09-27 Nick Alcock +- +- PR libctf/27967 +- * libtool.m4 (LT_PATH_NM): Try BSDization flags with a user-provided +- NM, if there is one. Run nm on itself, not on /dev/null, to avoid +- errors from nms that refuse to work on non-regular files. Remove +- other workarounds for this problem. Strip out blank lines from the +- nm output. +- + 2021-09-27 Nick Alcock + + PR libctf/27967 +diff --git a/libtool.m4 b/libtool.m4 +index a216bb14e99..7a711249304 100644 +--- a/libtool.m4 ++++ b/libtool.m4 +@@ -3200,55 +3200,53 @@ _LT_DECL([], [file_magic_cmd], [1], + + # LT_PATH_NM + # ---------- +-# find the pathname to a BSD- or MS-compatible name lister, and any flags +-# needed to make it compatible ++# find the pathname to a BSD- or MS-compatible name lister + AC_DEFUN([LT_PATH_NM], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, + [if test -n "$NM"; then +- # Let the user override the nm to test. +- lt_nm_to_check="$NM" +- else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- case "$lt_tmp_nm" in +- */*|*\\*) tmp_nm="$lt_tmp_nm";; +- *) tmp_nm="$ac_dir/$lt_tmp_nm";; +- esac +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- case `"$tmp_nm" -B "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in +- *$tmp_nm*) lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in +- *$tmp_nm*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no}]) ++ # Let the user override the test. ++ lt_cv_path_NM="$NM" ++else ++ lt_nm_to_check="${ac_tool_prefix}nm" ++ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then ++ lt_nm_to_check="$lt_nm_to_check nm" ++ fi ++ for lt_tmp_nm in $lt_nm_to_check; do ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ tmp_nm="$ac_dir/$lt_tmp_nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then ++ # Check to see if the nm accepts a BSD-compat flag. ++ # Adding the `sed 1q' prevents false positives on HP-UX, which says: ++ # nm: unknown option "B" ignored ++ # Tru64's nm complains that /dev/null is an invalid object file ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) ++ lt_cv_path_NM="$tmp_nm -B" ++ break ++ ;; ++ *) ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ done ++ IFS="$lt_save_ifs" ++ done ++ : ${lt_cv_path_NM=no} ++fi]) + if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" + else +-- +2.34.1 + diff --git a/pkgs/by-name/bi/binutils/2.38/0001-libtool.m4-update-macos-version-detection-block.patch b/pkgs/by-name/bi/binutils/2.38/0001-libtool.m4-update-macos-version-detection-block.patch new file mode 100644 index 0000000..e601be3 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/0001-libtool.m4-update-macos-version-detection-block.patch @@ -0,0 +1,47 @@ +From 33a8dc728eb5da3e1d3439c96810d1f6b2660b89 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Tue, 22 Feb 2022 12:24:46 +0900 +Subject: [PATCH] libtool.m4: update macos version detection block + +Includes upstream change +9e8c882517082fe5755f2524d23efb02f1522490 +--- + libtool.m4 | 21 ++++++++------------- + 1 file changed, 8 insertions(+), 13 deletions(-) + +diff --git a/libtool.m4 b/libtool.m4 +index 7a711249304..f452efb4300 100644 +--- a/libtool.m4 ++++ b/libtool.m4 +@@ -996,20 +996,15 @@ _LT_EOF + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; ++ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- darwin*) # darwin 5.x on +- # if running on 10.5 or later, the deployment target defaults +- # to the OS version, if on x86, and 10.4, the deployment +- # target defaults to 10.4. Don't you love it? +- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in +- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- 10.[[012]][[,.]]*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- 10.*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; ++ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; ++ darwin*) ++ case $MACOSX_DEPLOYMENT_TARGET,$host in ++ 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) ++ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; ++ *) ++ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac +-- +2.34.1 + diff --git a/pkgs/by-name/bi/binutils/2.38/always-search-rpath.patch b/pkgs/by-name/bi/binutils/2.38/always-search-rpath.patch new file mode 100644 index 0000000..2e9956e --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/always-search-rpath.patch @@ -0,0 +1,14 @@ +diff --git a/ld/genscripts.sh b/ld/genscripts.sh +index b6940d376d..0feb1adfd0 100755 +--- a/ld/genscripts.sh ++++ b/ld/genscripts.sh +@@ -125,6 +125,9 @@ if test "x$NATIVE" = "xyes" ; then + USE_LIBPATH=yes + fi + ++# TODO: why is this needed? ++USE_LIBPATH=yes ++ + # Set the library search path, for libraries named by -lfoo. + # If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used. + # Otherwise, the default is set here. diff --git a/pkgs/by-name/bi/binutils/2.38/build-components-separately.patch b/pkgs/by-name/bi/binutils/2.38/build-components-separately.patch new file mode 100644 index 0000000..0b4162d --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/build-components-separately.patch @@ -0,0 +1,155 @@ +diff --git a/bfd/configure.ac b/bfd/configure.ac +index fec067b2135..377e1f5443f 100644 +--- a/bfd/configure.ac ++++ b/bfd/configure.ac +@@ -292,30 +292,16 @@ AC_CACHE_CHECK(linker --as-needed support, bfd_cv_ld_as_needed, + + LT_LIB_M + +-# When building a shared libbfd, link against the pic version of libiberty +-# so that apps that use libbfd won't need libiberty just to satisfy any +-# libbfd references. +-# We can't do that if a pic libiberty is unavailable since including non-pic +-# code would insert text relocations into libbfd. + SHARED_LIBADD= +-SHARED_LDFLAGS= ++SHARED_LDFLAGS=-liberty + if test "$enable_shared" = "yes"; then +-changequote(,)dnl +- x=`sed -n -e 's/^[ ]*PICFLAG[ ]*=[ ]*//p' < ../libiberty/Makefile | sed -n '$p'` +-changequote([,])dnl +- if test -n "$x"; then +- SHARED_LIBADD="-L`pwd`/../libiberty/pic -liberty" +- fi +-fi +- + SHARED_LIBADD="$SHARED_LIBADD $LIBINTL" + +-if test "$enable_shared" = "yes"; then + case "${host}" in + # More hacks to build DLLs on Windows. + *-*-cygwin*) + SHARED_LDFLAGS="-no-undefined" +- SHARED_LIBADD="-L`pwd`/../libiberty -liberty $SHARED_LIBADD -lcygwin -lkernel32" ++ SHARED_LIBADD="-liberty $SHARED_LIBADD -lcygwin -lkernel32" + ;; + esac + +diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am +index 0e04b4c05c4..848a02662e7 100644 +--- a/opcodes/Makefile.am ++++ b/opcodes/Makefile.am +@@ -51,7 +51,7 @@ libopcodes_la_LDFLAGS += -rpath $(rpath_bfdlibdir) + endif + + # This is where bfd.h lives. +-BFD_H = ../bfd/bfd.h ++BFD_H = $(BFDDIR)/bfd.h + + BUILD_LIBS = @BUILD_LIBS@ + BUILD_LIB_DEPS = @BUILD_LIB_DEPS@ +@@ -303,7 +303,7 @@ OFILES = @BFD_MACHINES@ + # development.sh is used to determine -Werror default. + CONFIG_STATUS_DEPENDENCIES = $(BFDDIR)/development.sh + +-AM_CPPFLAGS = -I. -I$(srcdir) -I../bfd -I$(INCDIR) -I$(BFDDIR) @HDEFINES@ @INCINTL@ ++AM_CPPFLAGS = -I. -I$(srcdir) -I$(INCDIR) -I$(BFDDIR) @HDEFINES@ @INCINTL@ + + disassemble.lo: disassemble.c + if am__fastdepCC +@@ -327,9 +327,18 @@ libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c +-libopcodes_la_DEPENDENCIES = $(OFILES) @SHARED_DEPENDENCIES@ ++libopcodes_la_DEPENDENCIES = $(OFILES) @SHARED_DEPENDENCIES@ libtool-soversion + libopcodes_la_LIBADD = $(OFILES) @SHARED_LIBADD@ +-libopcodes_la_LDFLAGS += -release `cat ../bfd/libtool-soversion` @SHARED_LDFLAGS@ ++libopcodes_la_LDFLAGS += -release `cat libtool-soversion` @SHARED_LDFLAGS@ + # Allow dependency tracking to work on all the source files. + EXTRA_libopcodes_la_SOURCES = $(LIBOPCODES_CFILES) + ++libtool-soversion: ++ @echo "creating $@" ++ bfd_soversion="$(VERSION)" ;\ ++ . $(BFDDIR)/development.sh ;\ ++ if test "$$development" = true ; then \ ++ bfd_soversion="$(VERSION).$${bfd_version_date}" ;\ ++ fi ;\ ++ echo "$${bfd_soversion}" > $@ ++ + # libtool will build .libs/libopcodes.a. We create libopcodes.a in + # the build directory so that we don't have to convert all the + # programs that use libopcodes.a simultaneously. This is a hack which +diff --git a/opcodes/configure.ac b/opcodes/configure.ac +index e564f067334..5da62a3d58b 100644 +--- a/opcodes/configure.ac ++++ b/opcodes/configure.ac +@@ -98,6 +98,8 @@ BFD_64_BIT + AC_SUBST(HDEFINES) + AC_PROG_INSTALL + ++GCC_HEADER_STDINT(bfd_stdint.h) ++ + AC_CHECK_DECLS([basename, stpcpy]) + + # Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't do +@@ -148,44 +150,21 @@ AC_CACHE_CHECK(linker --as-needed support, bfd_cv_ld_as_needed, + + LT_LIB_M + +-#Libs for generator progs +-if test "x$cross_compiling" = "xno"; then +- BUILD_LIBS=../libiberty/libiberty.a +- BUILD_LIB_DEPS=$BUILD_LIBS +-else +- # if cross-compiling, assume that the system provides -liberty +- # and that the version is compatible with new headers. +- BUILD_LIBS=-liberty +- BUILD_LIB_DEPS= +-fi +-BUILD_LIBS="$BUILD_LIBS $LIBINTL" +-BUILD_LIB_DEPS="$BUILD_LIB_DEPS $LIBINTL_DEP" ++BUILD_LIBS="-liberty $LIBINTL" ++BUILD_LIB_DEPS="$LIBINTL_DEP" + + AC_SUBST(BUILD_LIBS) + AC_SUBST(BUILD_LIB_DEPS) + + # Horrible hacks to build DLLs on Windows and a shared library elsewhere. + SHARED_LDFLAGS= +-SHARED_LIBADD= ++SHARED_LIBADD=-liberty + SHARED_DEPENDENCIES= +-if test "$enable_shared" = "yes"; then +-# When building a shared libopcodes, link against the pic version of libiberty +-# so that apps that use libopcodes won't need libiberty just to satisfy any +-# libopcodes references. +-# We can't do that if a pic libiberty is unavailable since including non-pic +-# code would insert text relocations into libopcodes. + # Note that linking against libbfd as we do here, which is itself linked + # against libiberty, may not satisfy all the libopcodes libiberty references + # since libbfd may not pull in the entirety of libiberty. + # Also, jam libintl into the right place in all of this: after libiberty, + # which uses it, but before -lcygwin, which it uses. +-changequote(,)dnl +- x=`sed -n -e 's/^[ ]*PICFLAG[ ]*=[ ]*//p' < ../libiberty/Makefile | sed -n '$p'` +-changequote([,])dnl +- if test -n "$x"; then +- SHARED_LIBADD="-L`pwd`/../libiberty/pic -liberty" +- fi +-fi + + SHARED_LIBADD="$SHARED_LIBADD $LIBINTL" + +@@ -193,11 +172,10 @@ if test "$enable_shared" = "yes"; then + case "${host}" in + *-*-cygwin*) + SHARED_LDFLAGS="-no-undefined" +- SHARED_LIBADD="-L`pwd`/../bfd -lbfd -L`pwd`/../libiberty -liberty $SHARED_LIBADD" ++ SHARED_LIBADD="-lbfd -liberty $SHARED_LIBADD" + ;; + *) +- SHARED_LIBADD="../bfd/libbfd.la ${SHARED_LIBADD}" +- SHARED_DEPENDENCIES="../bfd/libbfd.la" ++ SHARED_LIBADD="-lbfd ${SHARED_LIBADD}" + ;; + esac + diff --git a/pkgs/by-name/bi/binutils/2.38/default.nix b/pkgs/by-name/bi/binutils/2.38/default.nix new file mode 100644 index 0000000..b916c2d --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/default.nix @@ -0,0 +1,228 @@ +{ stdenv +, autoreconfHook +, autoconf269, automake, libtool +, bison +, buildPackages +, fetchFromGitHub +, fetchurl +, flex +, gettext +, lib +, noSysDirs +, perl +, substitute +, texinfo +, zlib + +, enableGold ? stdenv.targetPlatform.isElf +, enableShared ? !stdenv.hostPlatform.isStatic + # WARN: Enabling all targets increases output size to a multiple. +, withAllTargets ? false +}: + +# WARN: configure silently disables ld.gold if it's unsupported, so we need to +# make sure that intent matches result ourselves. +assert enableGold -> stdenv.targetPlatform.isElf; + + +let + inherit (stdenv) buildPlatform hostPlatform targetPlatform; + + version = "2.38"; + + srcs = { + normal = fetchurl { + url = "mirror://gnu/binutils/binutils-${version}.tar.bz2"; + sha256 = "sha256-Bw7HHPB3pqWOC5WfBaCaNQFTeMLYpR6Q866r/jBZDvg="; + }; + vc4-none = fetchFromGitHub { + owner = "itszor"; + repo = "binutils-vc4"; + rev = "708acc851880dbeda1dd18aca4fd0a95b2573b36"; + sha256 = "1kdrz6fki55lm15rwwamn74fnqpy0zlafsida2zymk76n3656c63"; + }; + }; + + #INFO: The targetPrefix prepended to binary names to allow multiple binuntils + # on the PATH to both be usable. + targetPrefix = lib.optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-"; +in + +stdenv.mkDerivation { + pname = targetPrefix + "binutils"; + inherit version; + + # HACK: Ensure that we preserve source from bootstrap binutils to not rebuild LLVM + src = stdenv.__bootPackages.binutils-unwrapped_2_38.src + or srcs.${targetPlatform.system} + or srcs.normal; + + # WARN: this package is used for bootstrapping fetchurl, and thus cannot use + # fetchpatch! All mutable patches (generated by GitHub or cgit) that are + # needed here should be included directly in Nixpkgs as files. + patches = [ + # Make binutils output deterministic by default. + ./deterministic.patch + + + # Breaks nm BSD flag detection + ./0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch + + # Required for newer macos versions + ./0001-libtool.m4-update-macos-version-detection-block.patch + + # For some reason bfd ld doesn't search DT_RPATH when cross-compiling. It's + # not clear why this behavior was decided upon but it has the unfortunate + # consequence that the linker will fail to find transitive dependencies of + # shared objects when cross-compiling. Consequently, we are forced to + # override this behavior, forcing ld to search DT_RPATH even when + # cross-compiling. + ./always-search-rpath.patch + + # Fixed in 2.39 + # https://sourceware.org/bugzilla/show_bug.cgi?id=28885 + # https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=99852365513266afdd793289813e8e565186c9e6 + # https://github.com/NixOS/nixpkgs/issues/170946 + ./deterministic-temp-prefixes.patch + ] + ++ lib.optional targetPlatform.isiOS ./support-ios.patch + ++ lib.optional stdenv.targetPlatform.isWindows ./windres-locate-gcc.patch + ++ lib.optional stdenv.targetPlatform.isMips64n64 + # this patch is from debian: + # https://sources.debian.org/data/main/b/binutils/2.38-3/debian/patches/mips64-default-n64.diff + (if stdenv.targetPlatform.isMusl + then substitute { src = ./mips64-default-n64.patch; substitutions = [ "--replace" "gnuabi64" "muslabi64" ]; } + else ./mips64-default-n64.patch) + # On PowerPC, when generating assembly code, GCC generates a `.machine` + # custom instruction which instructs the assembler to generate code for this + # machine. However, some GCC versions generate the wrong one, or make it + # too strict, which leads to some confusing "unrecognized opcode: wrtee" + # or "unrecognized opcode: eieio" errors. + # + # To remove when binutils 2.39 is released. + # + # Upstream commit: + # https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=cebc89b9328eab994f6b0314c263f94e7949a553 + ++ lib.optional stdenv.targetPlatform.isPower ./ppc-make-machine-less-strict.patch + ; + + outputs = [ "out" "info" "man" ]; + + strictDeps = true; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ + bison + perl + texinfo + ] + ++ lib.optionals targetPlatform.isiOS [ autoreconfHook ] + ++ lib.optionals buildPlatform.isDarwin [ autoconf269 automake gettext libtool ] + ++ lib.optionals targetPlatform.isVc4 [ flex ] + ; + + buildInputs = [ zlib gettext ]; + + inherit noSysDirs; + + preConfigure = (lib.optionalString buildPlatform.isDarwin '' + for i in */configure.ac; do + pushd "$(dirname "$i")" + echo "Running autoreconf in $PWD" + # autoreconf doesn't work, don't know why + # autoreconf ''${autoreconfFlags:---install --force --verbose} + autoconf + popd + done + '') + '' + # Clear the default library search path. + if test "$noSysDirs" = "1"; then + echo 'NATIVE_LIB_DIRS=' >> ld/configure.tgt + fi + + # Use symlinks instead of hard links to save space ("strip" in the + # fixup phase strips each hard link separately). + for i in binutils/Makefile.in gas/Makefile.in ld/Makefile.in gold/Makefile.in; do + sed -i "$i" -e 's|ln |ln -s |' + done + ''; + + # As binutils takes part in the stdenv building, we don't want references + # to the bootstrap-tools libgcc (as uses to happen on arm/mips) + env.NIX_CFLAGS_COMPILE = + if hostPlatform.isDarwin + then "-Wno-string-plus-int -Wno-deprecated-declarations" + else "-static-libgcc"; + + hardeningDisable = [ "format" "pie" ]; + + configurePlatforms = [ "build" "host" "target" ]; + + configureFlags = [ + "--enable-64-bit-bfd" + "--with-system-zlib" + + "--enable-deterministic-archives" + "--disable-werror" + "--enable-fix-loongson2f-nop" + + # Turn on --enable-new-dtags by default to make the linker set + # RUNPATH instead of RPATH on binaries. This is important because + # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime. + "--enable-new-dtags" + + # force target prefix. Some versions of binutils will make it empty if + # `--host` and `--target` are too close, even if Nixpkgs thinks the + # platforms are different (e.g. because not all the info makes the + # `config`). Other versions of binutils will always prefix if `--target` is + # passed, even if `--host` and `--target` are the same. The easiest thing + # for us to do is not leave it to chance, and force the program prefix to be + # what we want it to be. + "--program-prefix=${targetPrefix}" + ] + ++ lib.optionals withAllTargets [ "--enable-targets=all" ] + ++ lib.optionals enableGold [ "--enable-gold" "--enable-plugins" ] + ++ (if enableShared + then [ "--enable-shared" "--disable-static" ] + else [ "--disable-shared" "--enable-static" ]) + ; + + # Fails + doCheck = false; + + # Remove on next bump. It's a vestige of past conditional. Stays here to avoid + # mass rebuild. + postFixup = ""; + + # Break dependency on pkgsBuildBuild.gcc when building a cross-binutils + stripDebugList = if stdenv.hostPlatform != stdenv.targetPlatform then "bin lib ${stdenv.hostPlatform.config}" else null; + + # INFO: Otherwise it fails with: + # `./sanity.sh: line 36: $out/bin/size: not found` + doInstallCheck = (buildPlatform == hostPlatform) && (hostPlatform == targetPlatform); + + enableParallelBuilding = true; + + # passthru = { + # inherit targetPrefix; + # hasGold = enableGold; + # isGNU = true; + # }; + + meta = with lib; { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + longDescription = '' + The GNU Binutils are a collection of binary tools. The main + ones are `ld' (the GNU linker) and `as' (the GNU assembler). + They also include the BFD (Binary File Descriptor) library, + `gprof', `nm', `strip', etc. + ''; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 lovesegfault ]; + platforms = platforms.unix; + + # INFO: Give binutils a lower priority than gcc-wrapper to prevent a + # collision due to the ld/as wrappers/symlinks in the latter. + priority = 10; + }; +} diff --git a/pkgs/by-name/bi/binutils/2.38/deterministic-temp-prefixes.patch b/pkgs/by-name/bi/binutils/2.38/deterministic-temp-prefixes.patch new file mode 100644 index 0000000..3c27340 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/deterministic-temp-prefixes.patch @@ -0,0 +1,36 @@ +From 99852365513266afdd793289813e8e565186c9e6 Mon Sep 17 00:00:00 2001 +From: Nick Clifton +Date: Wed, 23 Mar 2022 11:39:49 +0000 +Subject: [PATCH] dlltool: Use the output name as basis for deterministic temp + prefixes + + PR 28885 + * dlltool.c (main): use imp_name rather than dll_name when + generating a temporary file name. +--- + binutils/ChangeLog | 9 +++++++++ + binutils/dlltool.c | 7 ++++--- + 2 files changed, 13 insertions(+), 3 deletions(-) + +diff --git a/binutils/dlltool.c b/binutils/dlltool.c +index d95bf3f5470..89871510b45 100644 +--- a/binutils/dlltool.c ++++ b/binutils/dlltool.c +@@ -3992,10 +3992,11 @@ main (int ac, char **av) + if (tmp_prefix == NULL) + { + /* If possible use a deterministic prefix. */ +- if (dll_name) ++ if (imp_name || delayimp_name) + { +- tmp_prefix = xmalloc (strlen (dll_name) + 2); +- sprintf (tmp_prefix, "%s_", dll_name); ++ const char *input = imp_name ? imp_name : delayimp_name; ++ tmp_prefix = xmalloc (strlen (input) + 2); ++ sprintf (tmp_prefix, "%s_", input); + for (i = 0; tmp_prefix[i]; i++) + if (!ISALNUM (tmp_prefix[i])) + tmp_prefix[i] = '_'; +-- +2.31.1 + diff --git a/pkgs/by-name/bi/binutils/2.38/deterministic.patch b/pkgs/by-name/bi/binutils/2.38/deterministic.patch new file mode 100644 index 0000000..736e0ac --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/deterministic.patch @@ -0,0 +1,12 @@ +diff -ur orig/binutils-2.23.1/ld/ldlang.c binutils-2.23.1/ld/ldlang.c +--- orig/ld/ldlang.c ++++ new/ld/ldlang.c +@@ -3095,6 +3095,8 @@ + ldfile_output_machine)) + einfo (_("%P%F:%s: can not set architecture: %E\n"), name); + ++ link_info.output_bfd->flags |= BFD_DETERMINISTIC_OUTPUT; ++ + link_info.hash = bfd_link_hash_table_create (link_info.output_bfd); + if (link_info.hash == NULL) + einfo (_("%P%F: can not create hash table: %E\n")); diff --git a/pkgs/by-name/bi/binutils/2.38/libbfd.nix b/pkgs/by-name/bi/binutils/2.38/libbfd.nix new file mode 100644 index 0000000..feac15b --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/libbfd.nix @@ -0,0 +1,59 @@ +{ lib, stdenv +, fetchpatch, gnu-config, autoreconfHook, bison, binutils-unwrapped_2_38 +, libiberty, libintl, zlib +}: + +stdenv.mkDerivation { + pname = "libbfd"; + inherit (binutils-unwrapped_2_38) version src; + + outputs = [ "out" "dev" ]; + + patches = binutils-unwrapped_2_38.patches ++ [ + ./build-components-separately.patch + (fetchpatch { + url = "https://raw.githubusercontent.com/mxe/mxe/e1d4c144ee1994f70f86cf7fd8168fe69bd629c6/src/bfd-1-disable-subdir-doc.patch"; + sha256 = "0pzb3i74d1r7lhjan376h59a7kirw15j7swwm8pz3zy9lkdqkj6q"; + }) + ]; + + # We just want to build libbfd + postPatch = '' + cd bfd + ''; + + postAutoreconf = '' + echo "Updating config.guess and config.sub from ${gnu-config}" + cp -f ${gnu-config}/config.{guess,sub} ../ + ''; + + # We update these ourselves + dontUpdateAutotoolsGnuConfigScripts = true; + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook bison ]; + buildInputs = [ libiberty zlib ] ++ lib.optionals stdenv.isDarwin [ libintl ]; + + configurePlatforms = [ "build" "host" ]; + configureFlags = [ + "--enable-targets=all" "--enable-64-bit-bfd" + "--enable-install-libbfd" + "--with-system-zlib" + ] ++ lib.optional (!stdenv.hostPlatform.isStatic) "--enable-shared"; + + enableParallelBuilding = true; + + meta = with lib; { + description = "A library for manipulating containers of machine code"; + longDescription = '' + BFD is a library which provides a single interface to read and write + object files, executables, archive files, and core files in any format. + It is associated with GNU Binutils, and elsewhere often distributed with + it. + ''; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/bi/binutils/2.38/libopcodes.nix b/pkgs/by-name/bi/binutils/2.38/libopcodes.nix new file mode 100644 index 0000000..16b3695 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/libopcodes.nix @@ -0,0 +1,44 @@ +{ lib, stdenv, buildPackages +, autoreconfHook, bison, binutils-unwrapped_2_38 +, libiberty, libbfd_2_38 +}: + +stdenv.mkDerivation { + pname = "libopcodes"; + inherit (binutils-unwrapped_2_38) version src; + + outputs = [ "out" "dev" ]; + + patches = binutils-unwrapped_2_38.patches ++ [ + ./build-components-separately.patch + ]; + + # We just want to build libopcodes + postPatch = '' + cd opcodes + find . ../include/opcode -type f -exec sed {} -i -e 's/"bfd.h"//' \; + ''; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ autoreconfHook bison ]; + buildInputs = [ libiberty ]; + # dis-asm.h includes bfd.h + propagatedBuildInputs = [ libbfd_2_38 ]; + + configurePlatforms = [ "build" "host" ]; + configureFlags = [ + "--enable-targets=all" "--enable-64-bit-bfd" + "--enable-install-libbfd" + "--enable-shared" + ]; + + enableParallelBuilding = true; + + meta = with lib; { + description = "A library from binutils for manipulating machine code"; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/bi/binutils/2.38/mips64-default-n64.patch b/pkgs/by-name/bi/binutils/2.38/mips64-default-n64.patch new file mode 100644 index 0000000..0058127 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/mips64-default-n64.patch @@ -0,0 +1,82 @@ +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -927,11 +927,21 @@ case "${targ}" in + targ_defvec=mips_elf32_be_vec + targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec" + ;; +- mips64*el-*-linux*) ++ mips*64*el-*-linux*-gnuabi64) ++ targ_defvec=mips_elf64_trad_le_vec ++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec" ++ want64=true ++ ;; ++ mips*64*-*-linux*-gnuabi64) ++ targ_defvec=mips_elf64_trad_be_vec ++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec" ++ want64=true ++ ;; ++ mips*64*el-*-linux*) + targ_defvec=mips_elf32_ntrad_le_vec + targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec" + ;; +- mips64*-*-linux*) ++ mips*64*-*-linux*) + targ_defvec=mips_elf32_ntrad_be_vec + targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec" + ;; +--- a/binutils/testsuite/binutils-all/mips/mips-note-2-n32.d ++++ b/binutils/testsuite/binutils-all/mips/mips-note-2-n32.d +@@ -1,4 +1,5 @@ + #PROG: objcopy ++#as: -n32 + #readelf: --notes --wide + #objcopy: --merge-notes + #name: MIPS merge notes section (n32) +--- a/gas/configure ++++ b/gas/configure +@@ -12167,6 +12167,9 @@ _ACEOF + esac + # Decide which ABI to target by default. + case ${target} in ++ mips*64*-linux-gnuabi64) ++ mips_default_abi=N64_ABI ++ ;; + mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \ + | mips64*-kfreebsd*-gnu | mips64*-ps2-elf*) + mips_default_abi=N32_ABI +--- a/gas/configure.ac ++++ b/gas/configure.ac +@@ -384,6 +384,9 @@ changequote([,])dnl + esac + # Decide which ABI to target by default. + case ${target} in ++ mips*64*-linux-gnuabi64) ++ mips_default_abi=N64_ABI ++ ;; + mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \ + | mips64*-kfreebsd*-gnu | mips64*-ps2-elf*) + mips_default_abi=N32_ABI +--- a/ld/configure.tgt ++++ b/ld/configure.tgt +@@ -543,11 +543,19 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvx + ;; + mips*-*-windiss) targ_emul=elf32mipswindiss + ;; +-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32 ++mips*64*el-*-linux-gnuabi64) targ_emul=elf64ltsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip" ++ targ_extra_libpath=$targ_extra_emuls ++ ;; ++mips*64*el-*-linux-*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + targ_extra_libpath=$targ_extra_emuls + ;; +-mips64*-*-linux-*) targ_emul=elf32btsmipn32 ++mips*64*-*-linux-gnuabi64) targ_emul=elf64btsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip" ++ targ_extra_libpath=$targ_extra_emuls ++ ;; ++mips*64*-*-linux-*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + targ_extra_libpath=$targ_extra_emuls + ;; diff --git a/pkgs/by-name/bi/binutils/2.38/ppc-make-machine-less-strict.patch b/pkgs/by-name/bi/binutils/2.38/ppc-make-machine-less-strict.patch new file mode 100644 index 0000000..c245241 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/ppc-make-machine-less-strict.patch @@ -0,0 +1,51 @@ +From cebc89b9328eab994f6b0314c263f94e7949a553 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Mon, 21 Feb 2022 10:58:57 +1030 +Subject: [PATCH] binutils 2.38 vs. ppc32 linux kernel + +Commit b25f942e18d6 made .machine more strict. Weaken it again. + + * config/tc-ppc.c (ppc_machine): Treat an early .machine specially, + keeping sticky options to work around gcc bugs. +--- + gas/config/tc-ppc.c | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c +index 054f9c72161..89bc7d3f9b9 100644 +--- a/gas/config/tc-ppc.c ++++ b/gas/config/tc-ppc.c +@@ -5965,7 +5965,30 @@ ppc_machine (int ignore ATTRIBUTE_UNUSED) + options do not count as a new machine, instead they add + to currently selected opcodes. */ + ppc_cpu_t machine_sticky = 0; +- new_cpu = ppc_parse_cpu (ppc_cpu, &machine_sticky, cpu_string); ++ /* Unfortunately, some versions of gcc emit a .machine ++ directive very near the start of the compiler's assembly ++ output file. This is bad because it overrides user -Wa ++ cpu selection. Worse, there are versions of gcc that ++ emit the *wrong* cpu, not even respecting the -mcpu given ++ to gcc. See gcc pr101393. And to compound the problem, ++ as of 20220222 gcc doesn't pass the correct cpu option to ++ gas on the command line. See gcc pr59828. Hack around ++ this by keeping sticky options for an early .machine. */ ++ asection *sec; ++ for (sec = stdoutput->sections; sec != NULL; sec = sec->next) ++ { ++ segment_info_type *info = seg_info (sec); ++ /* Are the frags for this section perturbed from their ++ initial state? Even .align will count here. */ ++ if (info != NULL ++ && (info->frchainP->frch_root != info->frchainP->frch_last ++ || info->frchainP->frch_root->fr_type != rs_fill ++ || info->frchainP->frch_root->fr_fix != 0)) ++ break; ++ } ++ new_cpu = ppc_parse_cpu (ppc_cpu, ++ sec == NULL ? &sticky : &machine_sticky, ++ cpu_string); + if (new_cpu != 0) + ppc_cpu = new_cpu; + else +-- +2.31.1 diff --git a/pkgs/by-name/bi/binutils/2.38/support-ios.patch b/pkgs/by-name/bi/binutils/2.38/support-ios.patch new file mode 100644 index 0000000..74e56d1 --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/support-ios.patch @@ -0,0 +1,168 @@ +diff --git a/bfd/config.bfd b/bfd/config.bfd +index f04a993f06..1e24a9d030 100644 +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -238,7 +238,7 @@ case "${targ}" in + + # START OF targmatch.h + #ifdef BFD64 +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + targ_defvec=aarch64_mach_o_vec + targ_selvecs="arm_mach_o_vec mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +@@ -358,7 +358,7 @@ case "${targ}" in + targ_selvecs=arc_elf32_be_vec + ;; + +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + targ_defvec=arm_mach_o_vec + targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +@@ -678,7 +678,7 @@ case "${targ}" in + i[3-7]86-*-aix*) + targ_defvec=i386_coff_vec + ;; +- i[3-7]86-*-darwin* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*) ++ i[3-7]86-*-darwin* | i[3-7]86-*-ios* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*) + targ_defvec=i386_mach_o_vec + targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ64_selvecs=x86_64_mach_o_vec +@@ -762,7 +762,7 @@ case "${targ}" in + targ_defvec=x86_64_elf64_cloudabi_vec + want64=true + ;; +- x86_64-*-darwin*) ++ x86_64-*-darwin* | x86_64-*-ios*) + targ_defvec=x86_64_mach_o_vec + targ_selvecs="i386_mach_o_vec mach_o_le_vec mach_o_be_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ_archs="$targ_archs bfd_powerpc_arch bfd_rs6000_arch" +@@ -1402,7 +1402,7 @@ case "${targ}" in + targ_selvecs="powerpc_elf32_le_vec powerpc_boot_vec" + targ64_selvecs="powerpc_elf64_vec powerpc_elf64_le_vec" + ;; +- powerpc-*-darwin* | powerpc-*-macos10* | powerpc-*-rhapsody*) ++ powerpc-*-darwin* | powerpc-*-ios* | powerpc-*-macos10* | powerpc-*-rhapsody*) + targ_defvec=mach_o_be_vec + targ_selvecs="mach_o_be_vec mach_o_le_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ_archs="$targ_archs bfd_i386_arch" +diff --git a/configure.ac b/configure.ac +index aae94501e4..2cceb4dad4 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -510,7 +510,7 @@ if test x$enable_libgomp = x ; then + ;; + *-*-solaris2* | *-*-hpux11*) + ;; +- *-*-darwin* | *-*-aix*) ++ *-*-darwin* | *-*-ios* | *-*-aix*) + ;; + nvptx*-*-*) + ;; +@@ -700,13 +700,13 @@ esac + + # Disable libffi for some systems. + case "${target}" in +- powerpc-*-darwin*) ++ powerpc-*-darwin* | powerpc-*-ios*) + ;; +- i[[3456789]]86-*-darwin*) ++ i[[3456789]]86-*-darwin* | i[[3456789]]86-*-ios*) + ;; +- x86_64-*-darwin[[912]]*) ++ x86_64-*-darwin[[912]]* | x86_64-*-ios[[912]]*) + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs target-libffi" + ;; + *-*-netware*) +@@ -788,7 +788,7 @@ esac + # Disable the go frontend on systems where it is known to not work. Please keep + # this in sync with contrib/config-list.mk. + case "${target}" in +-*-*-darwin* | *-*-cygwin* | *-*-mingw*) ++*-*-darwin* | *-*-ios* | *-*-cygwin* | *-*-mingw*) + unsupported_languages="$unsupported_languages go" + ;; + esac +@@ -797,7 +797,7 @@ esac + # For testing, you can easily override this with --enable-libgo. + if test x$enable_libgo = x; then + case "${target}" in +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + # PR 46986 + noconfigdirs="$noconfigdirs target-libgo" + ;; +@@ -916,27 +916,27 @@ esac + case "${target}" in + *-*-chorusos) + ;; +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- powerpc-*-darwin*) ++ powerpc-*-darwin* | powerpc-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- i[[3456789]]86-*-darwin*) ++ i[[3456789]]86-*-darwin* | i[[3456789]]86-*-ios*) + noconfigdirs="$noconfigdirs ld gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- x86_64-*-darwin[[912]]*) ++ x86_64-*-darwin[[912]]* | x86_64-*-ios[[912]]*) + noconfigdirs="$noconfigdirs ld gas gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +@@ -1226,7 +1226,7 @@ case "${host}" in + hppa*-*) + host_makefile_frag="config/mh-pa" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + host_makefile_frag="config/mh-darwin" + ;; + powerpc-*-aix*) +@@ -1697,7 +1697,7 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always. + build_lto_plugin=yes + ],[if test x"$default_enable_lto" = x"yes" ; then + case $target in +- *-apple-darwin[[912]]* | *-cygwin* | *-mingw* | *djgpp*) ;; ++ *-apple-darwin[[912]]* | *-apple-ios[[912]]* | *-cygwin* | *-mingw* | *djgpp*) ;; + # On other non-ELF platforms, LTO has yet to be validated. + *) enable_lto=no ;; + esac +@@ -1708,7 +1708,7 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always. + # warn during gcc/ subconfigure; unless you're bootstrapping with + # -flto it won't be needed until after installation anyway. + case $target in +- *-cygwin* | *-mingw* | *-apple-darwin* | *djgpp*) ;; ++ *-cygwin* | *-mingw* | *-apple-darwin* | *-apple-ios* | *djgpp*) ;; + *) if test x"$enable_lto" = x"yes"; then + AC_MSG_ERROR([LTO support is not enabled for this target.]) + fi +@@ -2590,7 +2590,7 @@ rm -f conftest* + # Decide which environment variable is used to find dynamic libraries. + case "${host}" in + *-*-hpux*) RPATH_ENVVAR=SHLIB_PATH ;; +- *-*-darwin*) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; ++ *-*-darwin* | *-*-ios* ) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; + *-*-mingw* | *-*-cygwin ) RPATH_ENVVAR=PATH ;; + *) RPATH_ENVVAR=LD_LIBRARY_PATH ;; + esac diff --git a/pkgs/by-name/bi/binutils/2.38/windres-locate-gcc.patch b/pkgs/by-name/bi/binutils/2.38/windres-locate-gcc.patch new file mode 100644 index 0000000..721667c --- /dev/null +++ b/pkgs/by-name/bi/binutils/2.38/windres-locate-gcc.patch @@ -0,0 +1,19 @@ +diff --git a/binutils/resrc.c b/binutils/resrc.c +index a875c3a4..0411d047 100644 +--- a/binutils/resrc.c ++++ b/binutils/resrc.c +@@ -521,7 +521,13 @@ read_rc_file (const char *filename, const char *preprocessor, + + cpp_pipe = 0; + +- if (dash) ++ /* Nixpkgs specific : look first at the prefixed path ++ ( there should be no gcc in the binutils folder ) */ ++ if (slash && dash) { ++ cpp_pipe = look_for_default(cmd, slash + 1, dash - slash, preprocargs, filename); ++ } ++ ++ if (dash && ! cpp_pipe) + { + /* First, try looking for a prefixed gcc in the windres + directory, with the same prefix as windres */ diff --git a/pkgs/by-name/bi/binutils/always-search-rpath.patch b/pkgs/by-name/bi/binutils/always-search-rpath.patch new file mode 100644 index 0000000..2e9956e --- /dev/null +++ b/pkgs/by-name/bi/binutils/always-search-rpath.patch @@ -0,0 +1,14 @@ +diff --git a/ld/genscripts.sh b/ld/genscripts.sh +index b6940d376d..0feb1adfd0 100755 +--- a/ld/genscripts.sh ++++ b/ld/genscripts.sh +@@ -125,6 +125,9 @@ if test "x$NATIVE" = "xyes" ; then + USE_LIBPATH=yes + fi + ++# TODO: why is this needed? ++USE_LIBPATH=yes ++ + # Set the library search path, for libraries named by -lfoo. + # If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used. + # Otherwise, the default is set here. diff --git a/pkgs/by-name/bi/binutils/avr-size.patch b/pkgs/by-name/bi/binutils/avr-size.patch new file mode 100644 index 0000000..ae78228 --- /dev/null +++ b/pkgs/by-name/bi/binutils/avr-size.patch @@ -0,0 +1,435 @@ +diff --git a/binutils/size.c b/binutils/size.c +index 3697087714..f99d45a6bf 100644 +--- a/binutils/size.c ++++ b/binutils/size.c +@@ -51,7 +51,8 @@ enum output_format + { + FORMAT_BERKLEY, + FORMAT_SYSV, +- FORMAT_GNU ++ FORMAT_GNU, ++ FORMAT_AVR + }; + static enum output_format selected_output_format = + #if BSD_DEFAULT +@@ -74,6 +75,246 @@ static bfd_size_type total_textsize; + /* Program exit status. */ + static int return_code = 0; + ++ ++/* AVR Size specific stuff */ ++ ++#define AVR64 64UL ++#define AVR128 128UL ++#define AVR256 256UL ++#define AVR512 512UL ++#define AVR1K 1024UL ++#define AVR2K 2048UL ++#define AVR4K 4096UL ++#define AVR8K 8192UL ++#define AVR16K 16384UL ++#define AVR20K 20480UL ++#define AVR24K 24576UL ++#define AVR32K 32768UL ++#define AVR36K 36864UL ++#define AVR40K 40960UL ++#define AVR64K 65536UL ++#define AVR68K 69632UL ++#define AVR128K 131072UL ++#define AVR136K 139264UL ++#define AVR200K 204800UL ++#define AVR256K 262144UL ++#define AVR264K 270336UL ++ ++typedef struct ++{ ++ char *name; ++ long flash; ++ long ram; ++ long eeprom; ++} avr_device_t; ++ ++avr_device_t avr[] = ++{ ++ {"atxmega256a3", AVR264K, AVR16K, AVR4K}, ++ {"atxmega256a3b", AVR264K, AVR16K, AVR4K}, ++ {"atxmega256d3", AVR264K, AVR16K, AVR4K}, ++ ++ {"atmega2560", AVR256K, AVR8K, AVR4K}, ++ {"atmega2561", AVR256K, AVR8K, AVR4K}, ++ ++ {"atxmega192a3", AVR200K, AVR16K, AVR2K}, ++ {"atxmega192d3", AVR200K, AVR16K, AVR2K}, ++ ++ {"atxmega128a1", AVR136K, AVR8K, AVR2K}, ++ {"atxmega128a1u", AVR136K, AVR8K, AVR2K}, ++ {"atxmega128a3", AVR136K, AVR8K, AVR2K}, ++ {"atxmega128d3", AVR136K, AVR8K, AVR2K}, ++ ++ {"at43usb320", AVR128K, 608UL, 0UL}, ++ {"at90can128", AVR128K, AVR4K, AVR4K}, ++ {"at90usb1286", AVR128K, AVR8K, AVR4K}, ++ {"at90usb1287", AVR128K, AVR8K, AVR4K}, ++ {"atmega128", AVR128K, AVR4K, AVR4K}, ++ {"atmega1280", AVR128K, AVR8K, AVR4K}, ++ {"atmega1281", AVR128K, AVR8K, AVR4K}, ++ {"atmega1284p", AVR128K, AVR16K, AVR4K}, ++ {"atmega128rfa1", AVR128K, AVR16K, AVR4K}, ++ {"atmega103", AVR128K, 4000UL, AVR4K}, ++ ++ {"atxmega64a1", AVR68K, AVR4K, AVR2K}, ++ {"atxmega64a1u", AVR68K, AVR4K, AVR2K}, ++ {"atxmega64a3", AVR68K, AVR4K, AVR2K}, ++ {"atxmega64d3", AVR68K, AVR4K, AVR2K}, ++ ++ {"at90can64", AVR64K, AVR4K, AVR2K}, ++ {"at90scr100", AVR64K, AVR4K, AVR2K}, ++ {"at90usb646", AVR64K, AVR4K, AVR2K}, ++ {"at90usb647", AVR64K, AVR4K, AVR2K}, ++ {"atmega64", AVR64K, AVR4K, AVR2K}, ++ {"atmega640", AVR64K, AVR8K, AVR4K}, ++ {"atmega644", AVR64K, AVR4K, AVR2K}, ++ {"atmega644a", AVR64K, AVR4K, AVR2K}, ++ {"atmega644p", AVR64K, AVR4K, AVR2K}, ++ {"atmega644pa", AVR64K, AVR4K, AVR2K}, ++ {"atmega645", AVR64K, AVR4K, AVR2K}, ++ {"atmega645a", AVR64K, AVR4K, AVR2K}, ++ {"atmega645p", AVR64K, AVR4K, AVR2K}, ++ {"atmega6450", AVR64K, AVR4K, AVR2K}, ++ {"atmega6450a", AVR64K, AVR4K, AVR2K}, ++ {"atmega6450p", AVR64K, AVR4K, AVR2K}, ++ {"atmega649", AVR64K, AVR4K, AVR2K}, ++ {"atmega649a", AVR64K, AVR4K, AVR2K}, ++ {"atmega649p", AVR64K, AVR4K, AVR2K}, ++ {"atmega6490", AVR64K, AVR4K, AVR2K}, ++ {"atmega6490a", AVR64K, AVR4K, AVR2K}, ++ {"atmega6490p", AVR64K, AVR4K, AVR2K}, ++ {"atmega64c1", AVR64K, AVR4K, AVR2K}, ++ {"atmega64hve", AVR64K, AVR4K, AVR1K}, ++ {"atmega64m1", AVR64K, AVR4K, AVR2K}, ++ {"m3000", AVR64K, AVR4K, 0UL}, ++ ++ {"atmega406", AVR40K, AVR2K, AVR512}, ++ ++ {"atxmega32a4", AVR36K, AVR4K, AVR1K}, ++ {"atxmega32d4", AVR36K, AVR4K, AVR1K}, ++ ++ {"at90can32", AVR32K, AVR2K, AVR1K}, ++ {"at94k", AVR32K, AVR4K, 0UL}, ++ {"atmega32", AVR32K, AVR2K, AVR1K}, ++ {"atmega323", AVR32K, AVR2K, AVR1K}, ++ {"atmega324a", AVR32K, AVR2K, AVR1K}, ++ {"atmega324p", AVR32K, AVR2K, AVR1K}, ++ {"atmega324pa", AVR32K, AVR2K, AVR1K}, ++ {"atmega325", AVR32K, AVR2K, AVR1K}, ++ {"atmega325a", AVR32K, AVR2K, AVR1K}, ++ {"atmega325p", AVR32K, AVR2K, AVR1K}, ++ {"atmega3250", AVR32K, AVR2K, AVR1K}, ++ {"atmega3250a", AVR32K, AVR2K, AVR1K}, ++ {"atmega3250p", AVR32K, AVR2K, AVR1K}, ++ {"atmega328", AVR32K, AVR2K, AVR1K}, ++ {"atmega328p", AVR32K, AVR2K, AVR1K}, ++ {"atmega329", AVR32K, AVR2K, AVR1K}, ++ {"atmega329a", AVR32K, AVR2K, AVR1K}, ++ {"atmega329p", AVR32K, AVR2K, AVR1K}, ++ {"atmega329pa", AVR32K, AVR2K, AVR1K}, ++ {"atmega3290", AVR32K, AVR2K, AVR1K}, ++ {"atmega3290a", AVR32K, AVR2K, AVR1K}, ++ {"atmega3290p", AVR32K, AVR2K, AVR1K}, ++ {"atmega32hvb", AVR32K, AVR2K, AVR1K}, ++ {"atmega32c1", AVR32K, AVR2K, AVR1K}, ++ {"atmega32hvb", AVR32K, AVR2K, AVR1K}, ++ {"atmega32m1", AVR32K, AVR2K, AVR1K}, ++ {"atmega32u2", AVR32K, AVR1K, AVR1K}, ++ {"atmega32u4", AVR32K, 2560UL, AVR1K}, ++ {"atmega32u6", AVR32K, 2560UL, AVR1K}, ++ ++ {"at43usb355", AVR24K, 1120UL, 0UL}, ++ ++ {"atxmega16a4", AVR20K, AVR2K, AVR1K}, ++ {"atxmega16d4", AVR20K, AVR2K, AVR1K}, ++ ++ {"at76c711", AVR16K, AVR2K, 0UL}, ++ {"at90pwm216", AVR16K, AVR1K, AVR512}, ++ {"at90pwm316", AVR16K, AVR1K, AVR512}, ++ {"at90usb162", AVR16K, AVR512, AVR512}, ++ {"atmega16", AVR16K, AVR1K, AVR512}, ++ {"atmega16a", AVR16K, AVR1K, AVR512}, ++ {"atmega161", AVR16K, AVR1K, AVR512}, ++ {"atmega162", AVR16K, AVR1K, AVR512}, ++ {"atmega163", AVR16K, AVR1K, AVR512}, ++ {"atmega164", AVR16K, AVR1K, AVR512}, ++ {"atmega164a", AVR16K, AVR1K, AVR512}, ++ {"atmega164p", AVR16K, AVR1K, AVR512}, ++ {"atmega165a", AVR16K, AVR1K, AVR512}, ++ {"atmega165", AVR16K, AVR1K, AVR512}, ++ {"atmega165p", AVR16K, AVR1K, AVR512}, ++ {"atmega168", AVR16K, AVR1K, AVR512}, ++ {"atmega168a", AVR16K, AVR1K, AVR512}, ++ {"atmega168p", AVR16K, AVR1K, AVR512}, ++ {"atmega169", AVR16K, AVR1K, AVR512}, ++ {"atmega169a", AVR16K, AVR1K, AVR512}, ++ {"atmega169p", AVR16K, AVR1K, AVR512}, ++ {"atmega169pa", AVR16K, AVR1K, AVR512}, ++ {"atmega16hva", AVR16K, 768UL, AVR256}, ++ {"atmega16hva2", AVR16K, AVR1K, AVR256}, ++ {"atmega16hvb", AVR16K, AVR1K, AVR512}, ++ {"atmega16m1", AVR16K, AVR1K, AVR512}, ++ {"atmega16u2", AVR16K, AVR512, AVR512}, ++ {"atmega16u4", AVR16K, 1280UL, AVR512}, ++ {"attiny167", AVR16K, AVR512, AVR512}, ++ ++ {"at90c8534", AVR8K, 352UL, AVR512}, ++ {"at90pwm1", AVR8K, AVR512, AVR512}, ++ {"at90pwm2", AVR8K, AVR512, AVR512}, ++ {"at90pwm2b", AVR8K, AVR512, AVR512}, ++ {"at90pwm3", AVR8K, AVR512, AVR512}, ++ {"at90pwm3b", AVR8K, AVR512, AVR512}, ++ {"at90pwm81", AVR8K, AVR256, AVR512}, ++ {"at90s8515", AVR8K, AVR512, AVR512}, ++ {"at90s8535", AVR8K, AVR512, AVR512}, ++ {"at90usb82", AVR8K, AVR512, AVR512}, ++ {"ata6289", AVR8K, AVR512, 320UL}, ++ {"atmega8", AVR8K, AVR1K, AVR512}, ++ {"atmega8515", AVR8K, AVR512, AVR512}, ++ {"atmega8535", AVR8K, AVR512, AVR512}, ++ {"atmega88", AVR8K, AVR1K, AVR512}, ++ {"atmega88a", AVR8K, AVR1K, AVR512}, ++ {"atmega88p", AVR8K, AVR1K, AVR512}, ++ {"atmega88pa", AVR8K, AVR1K, AVR512}, ++ {"atmega8hva", AVR8K, 768UL, AVR256}, ++ {"atmega8u2", AVR8K, AVR512, AVR512}, ++ {"attiny84", AVR8K, AVR512, AVR512}, ++ {"attiny84a", AVR8K, AVR512, AVR512}, ++ {"attiny85", AVR8K, AVR512, AVR512}, ++ {"attiny861", AVR8K, AVR512, AVR512}, ++ {"attiny861a", AVR8K, AVR512, AVR512}, ++ {"attiny87", AVR8K, AVR512, AVR512}, ++ {"attiny88", AVR8K, AVR512, AVR64}, ++ ++ {"at90s4414", AVR4K, 352UL, AVR256}, ++ {"at90s4433", AVR4K, AVR128, AVR256}, ++ {"at90s4434", AVR4K, 352UL, AVR256}, ++ {"atmega48", AVR4K, AVR512, AVR256}, ++ {"atmega48a", AVR4K, AVR512, AVR256}, ++ {"atmega48p", AVR4K, AVR512, AVR256}, ++ {"attiny4313", AVR4K, AVR256, AVR256}, ++ {"attiny43u", AVR4K, AVR256, AVR64}, ++ {"attiny44", AVR4K, AVR256, AVR256}, ++ {"attiny44a", AVR4K, AVR256, AVR256}, ++ {"attiny45", AVR4K, AVR256, AVR256}, ++ {"attiny461", AVR4K, AVR256, AVR256}, ++ {"attiny461a", AVR4K, AVR256, AVR256}, ++ {"attiny48", AVR4K, AVR256, AVR64}, ++ ++ {"at86rf401", AVR2K, 224UL, AVR128}, ++ {"at90s2313", AVR2K, AVR128, AVR128}, ++ {"at90s2323", AVR2K, AVR128, AVR128}, ++ {"at90s2333", AVR2K, 224UL, AVR128}, ++ {"at90s2343", AVR2K, AVR128, AVR128}, ++ {"attiny20", AVR2K, AVR128, 0UL}, ++ {"attiny22", AVR2K, 224UL, AVR128}, ++ {"attiny2313", AVR2K, AVR128, AVR128}, ++ {"attiny2313a", AVR2K, AVR128, AVR128}, ++ {"attiny24", AVR2K, AVR128, AVR128}, ++ {"attiny24a", AVR2K, AVR128, AVR128}, ++ {"attiny25", AVR2K, AVR128, AVR128}, ++ {"attiny26", AVR2K, AVR128, AVR128}, ++ {"attiny261", AVR2K, AVR128, AVR128}, ++ {"attiny261a", AVR2K, AVR128, AVR128}, ++ {"attiny28", AVR2K, 0UL, 0UL}, ++ {"attiny40", AVR2K, AVR256, 0UL}, ++ ++ {"at90s1200", AVR1K, 0UL, AVR64}, ++ {"attiny9", AVR1K, 32UL, 0UL}, ++ {"attiny10", AVR1K, 32UL, 0UL}, ++ {"attiny11", AVR1K, 0UL, AVR64}, ++ {"attiny12", AVR1K, 0UL, AVR64}, ++ {"attiny13", AVR1K, AVR64, AVR64}, ++ {"attiny13a", AVR1K, AVR64, AVR64}, ++ {"attiny15", AVR1K, 0UL, AVR64}, ++ ++ {"attiny4", AVR512, 32UL, 0UL}, ++ {"attiny5", AVR512, 32UL, 0UL}, ++}; ++ ++static char *avrmcu = NULL; ++ ++ + static char *target = NULL; + + /* Forward declarations. */ +@@ -89,7 +330,8 @@ usage (FILE *stream, int status) + fprintf (stream, _(" Displays the sizes of sections inside binary files\n")); + fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n")); + fprintf (stream, _(" The options are:\n\ +- -A|-B|-G --format={sysv|berkeley|gnu} Select output style (default is %s)\n\ ++ -A|-B|-G|-C --format={sysv|berkeley|gnu|avr} Select output style (default is %s)\n\ ++ --mcu= MCU name for AVR format only\n\ + -o|-d|-x --radix={8|10|16} Display numbers in octal, decimal or hex\n\ + -t --totals Display the total sizes (Berkeley only)\n\ + --common Display total size for *COM* syms\n\ +@@ -113,6 +355,7 @@ usage (FILE *stream, int status) + #define OPTION_FORMAT (200) + #define OPTION_RADIX (OPTION_FORMAT + 1) + #define OPTION_TARGET (OPTION_RADIX + 1) ++#define OPTION_MCU (OPTION_TARGET + 1) + + static struct option long_options[] = + { +@@ -120,6 +363,7 @@ static struct option long_options[] = + {"format", required_argument, 0, OPTION_FORMAT}, + {"radix", required_argument, 0, OPTION_RADIX}, + {"target", required_argument, 0, OPTION_TARGET}, ++ {"mcu", required_argument, 0, 203}, + {"totals", no_argument, &show_totals, 1}, + {"version", no_argument, &show_version, 1}, + {"help", no_argument, &show_help, 1}, +@@ -153,7 +397,7 @@ main (int argc, char **argv) + fatal (_("fatal error: libbfd ABI mismatch")); + set_default_bfd_target (); + +- while ((c = getopt_long (argc, argv, "ABGHhVvdfotx", long_options, ++ while ((c = getopt_long (argc, argv, "ABCGHhVvdfotx", long_options, + (int *) 0)) != EOF) + switch (c) + { +@@ -172,12 +416,20 @@ main (int argc, char **argv) + case 'g': + selected_output_format = FORMAT_GNU; + break; ++ case 'A': ++ case 'a': ++ selected_output_format = FORMAT_AVR; ++ break; + default: + non_fatal (_("invalid argument to --format: %s"), optarg); + usage (stderr, 1); + } + break; + ++ case OPTION_MCU: ++ avrmcu = optarg; ++ break; ++ + case OPTION_TARGET: + target = optarg; + break; +@@ -214,6 +466,9 @@ main (int argc, char **argv) + case 'G': + selected_output_format = FORMAT_GNU; + break; ++ case 'C': ++ selected_output_format = FORMAT_AVR; ++ break; + case 'v': + case 'V': + show_version = 1; +@@ -656,6 +911,98 @@ print_sysv_format (bfd *file) + printf ("\n\n"); + } + ++static avr_device_t * ++avr_find_device (void) ++{ ++ unsigned int i; ++ if (avrmcu != NULL) ++ { ++ for (i = 0; i < sizeof(avr) / sizeof(avr[0]); i++) ++ { ++ if (strcmp(avr[i].name, avrmcu) == 0) ++ { ++ /* Match found */ ++ return (&avr[i]); ++ } ++ } ++ } ++ return (NULL); ++} ++ ++static void ++print_avr_format (bfd *file) ++{ ++ char *avr_name = "Unknown"; ++ int flashmax = 0; ++ int rammax = 0; ++ int eeprommax = 0; ++ asection *section; ++ bfd_size_type my_datasize = 0; ++ bfd_size_type my_textsize = 0; ++ bfd_size_type my_bsssize = 0; ++ bfd_size_type bootloadersize = 0; ++ bfd_size_type noinitsize = 0; ++ bfd_size_type eepromsize = 0; ++ ++ avr_device_t *avrdevice = avr_find_device(); ++ if (avrdevice != NULL) ++ { ++ avr_name = avrdevice->name; ++ flashmax = avrdevice->flash; ++ rammax = avrdevice->ram; ++ eeprommax = avrdevice->eeprom; ++ } ++ ++ if ((section = bfd_get_section_by_name (file, ".data")) != NULL) ++ my_datasize = bfd_section_size (section); ++ if ((section = bfd_get_section_by_name (file, ".text")) != NULL) ++ my_textsize = bfd_section_size (section); ++ if ((section = bfd_get_section_by_name (file, ".bss")) != NULL) ++ my_bsssize = bfd_section_size (section); ++ if ((section = bfd_get_section_by_name (file, ".bootloader")) != NULL) ++ bootloadersize = bfd_section_size (section); ++ if ((section = bfd_get_section_by_name (file, ".noinit")) != NULL) ++ noinitsize = bfd_section_size (section); ++ if ((section = bfd_get_section_by_name (file, ".eeprom")) != NULL) ++ eepromsize = bfd_section_size (section); ++ ++ bfd_size_type text = my_textsize + my_datasize + bootloadersize; ++ bfd_size_type data = my_datasize + my_bsssize + noinitsize; ++ bfd_size_type eeprom = eepromsize; ++ ++ printf ("AVR Memory Usage\n" ++ "----------------\n" ++ "Device: %s\n\n", avr_name); ++ ++ /* Text size */ ++ printf ("Program:%8ld bytes", text); ++ if (flashmax > 0) ++ { ++ printf (" (%2.1f%% Full)", ((float)text / flashmax) * 100); ++ } ++ printf ("\n(.text + .data + .bootloader)\n\n"); ++ ++ /* Data size */ ++ printf ("Data: %8ld bytes", data); ++ if (rammax > 0) ++ { ++ printf (" (%2.1f%% Full)", ((float)data / rammax) * 100); ++ } ++ printf ("\n(.data + .bss + .noinit)\n\n"); ++ ++ /* EEPROM size */ ++ if (eeprom > 0) ++ { ++ printf ("EEPROM: %8ld bytes", eeprom); ++ if (eeprommax > 0) ++ { ++ printf (" (%2.1f%% Full)", ((float)eeprom / eeprommax) * 100); ++ } ++ printf ("\n(.eeprom)\n\n"); ++ } ++} ++ ++ + static void + print_sizes (bfd *file) + { +@@ -663,6 +1010,8 @@ print_sizes (bfd *file) + calculate_common_size (file); + if (selected_output_format == FORMAT_SYSV) + print_sysv_format (file); ++ else if (selected_output_format == FORMAT_AVR) ++ print_avr_format (file); + else + print_berkeley_or_gnu_format (file); + } diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/add-darwin-ldflags-before.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/add-darwin-ldflags-before.sh new file mode 100644 index 0000000..75d9484 --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/add-darwin-ldflags-before.sh @@ -0,0 +1,81 @@ +# Unconditionally adding in platform version flags will result in warnings that +# will be treated as errors by some packages. Add any missing flags here. + +# There are two things to be configured: the "platform version" (oldest +# supported version of macos, ios, etc), and the "sdk version". +# +# The modern way of configuring these is to use: +# -platform_version $platform $platform_version $sdk_version" +# +# The old way is still supported, and uses flags like: +# -${platform}_version_min $platform_version +# -sdk_version $sdk_version +# +# If both styles are specified ld will combine them. If multiple versions are +# specified for the same platform, ld will emit an error. +# +# The following adds flags for whichever properties have not already been +# provided. + +havePlatformVersionFlag= +haveDarwinSDKVersion= +haveDarwinPlatformVersion= + +# Roles will set by add-flags.sh, but add-flags.sh can be skipped when the +# cc-wrapper has added the linker flags. Both the cc-wrapper and the binutils +# wrapper mangle the same variable (MACOSX_DEPLOYMENT_TARGET), so if roles are +# empty due to being run through the cc-wrapper then the mangle here is a no-op +# and we still do the right thing. +# +# To be robust, make sure we always have the correct set of roles. +accumulateRoles + +mangleVarSingle @darwinMinVersionVariable@ ${role_suffixes[@]+"${role_suffixes[@]}"} + +n=0 +nParams=${#params[@]} +while (( n < nParams )); do + p=${params[n]} + case "$p" in + # the current platform + -@darwinPlatform@_version_min) + haveDarwinPlatformVersion=1 + ;; + + # legacy aliases + -macosx_version_min|-iphoneos_version_min|-iosmac_version_min|-uikitformac_version_min) + haveDarwinPlatformVersion=1 + ;; + + -sdk_version) + haveDarwinSDKVersion=1 + ;; + + -platform_version) + havePlatformVersionFlag=1 + + # If clang can't determine the sdk version it will pass 0.0.0. This + # has runtime effects so we override this to use the known sdk + # version. + if [ "${params[n+3]-}" = 0.0.0 ]; then + params[n+3]=@darwinSdkVersion@ + fi + ;; + esac + n=$((n + 1)) +done + +# If the caller has set -platform_version, trust they're doing the right thing. +# This will be the typical case for clang in nixpkgs. +if [ ! "$havePlatformVersionFlag" ]; then + if [ ! "$haveDarwinSDKVersion" ] && [ ! "$haveDarwinPlatformVersion" ]; then + # Nothing provided. Use the modern "-platform_version" to set both. + extraBefore+=(-platform_version @darwinPlatform@ "${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@}" @darwinSdkVersion@) + elif [ ! "$haveDarwinSDKVersion" ]; then + # Add missing sdk version + extraBefore+=(-sdk_version @darwinSdkVersion@) + elif [ ! "$haveDarwinPlatformVersion" ]; then + # Add missing platform version + extraBefore+=(-@darwinPlatform@_version_min "${@darwinMinVersionVariable@_@suffixSalt@:-@darwinMinVersion@}") + fi +fi diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/add-flags.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/add-flags.sh new file mode 100644 index 0000000..3b94dab --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/add-flags.sh @@ -0,0 +1,37 @@ +# See cc-wrapper for comments. +var_templates_list=( + NIX_IGNORE_LD_THROUGH_GCC + NIX_LDFLAGS + NIX_LDFLAGS_BEFORE + NIX_DYNAMIC_LINKER + NIX_LDFLAGS_AFTER + NIX_LDFLAGS_HARDEN + NIX_HARDENING_ENABLE +) +var_templates_bool=( + NIX_SET_BUILD_ID + NIX_DONT_SET_RPATH +) + +accumulateRoles + +for var in "${var_templates_list[@]}"; do + mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} +done + +if [ -e @out@/nix-support/libc-ldflags ]; then + NIX_LDFLAGS_@suffixSalt@+=" $(< @out@/nix-support/libc-ldflags)" +fi + +if [ -z "$NIX_DYNAMIC_LINKER_@suffixSalt@" ] && [ -e @out@/nix-support/ld-set-dynamic-linker ]; then + NIX_DYNAMIC_LINKER_@suffixSalt@="$(< @out@/nix-support/dynamic-linker)" +fi + +if [ -e @out@/nix-support/libc-ldflags-before ]; then + NIX_LDFLAGS_BEFORE_@suffixSalt@="$(< @out@/nix-support/libc-ldflags-before) $NIX_LDFLAGS_BEFORE_@suffixSalt@" +fi + +export NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@=1 diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/add-hardening.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/add-hardening.sh new file mode 100644 index 0000000..db9553c --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/add-hardening.sh @@ -0,0 +1,62 @@ +declare -a hardeningLDFlags=() + +declare -A hardeningEnableMap=() + +# Intentionally word-split in case 'NIX_HARDENING_ENABLE' is defined in Nix. The +# array expansion also prevents undefined variables from causing trouble with +# `set -u`. +for flag in ${NIX_HARDENING_ENABLE_@suffixSalt@-}; do + hardeningEnableMap["$flag"]=1 +done + +# Remove unsupported flags. +for flag in @hardening_unsupported_flags@; do + unset -v "hardeningEnableMap[$flag]" +done + +if (( "${NIX_DEBUG:-0}" >= 1 )); then + declare -a allHardeningFlags=(pie relro bindnow) + declare -A hardeningDisableMap=() + + # Determine which flags were effectively disabled so we can report below. + for flag in "${allHardeningFlags[@]}"; do + if [[ -z "${hardeningEnableMap[$flag]-}" ]]; then + hardeningDisableMap[$flag]=1 + fi + done + + printf 'HARDENING: disabled flags:' >&2 + (( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2 + echo >&2 + + if (( "${#hardeningEnableMap[@]}" )); then + echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2; + fi +fi + +for flag in "${!hardeningEnableMap[@]}"; do + case $flag in + pie) + if [[ ! (" ${params[*]} " =~ " -shared " \ + || " ${params[*]} " =~ " -static " \ + || " ${params[*]} " =~ " -r " \ + || " ${params[*]} " =~ " -Ur " \ + || " ${params[*]} " =~ " -i ") ]]; then + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi + hardeningLDFlags+=('-pie') + fi + ;; + relro) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi + hardeningLDFlags+=('-z' 'relro') + ;; + bindnow) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi + hardeningLDFlags+=('-z' 'now') + ;; + *) + # Ignore unsupported. Checked in Nix that at least *some* + # tool supports each flag. + ;; + esac +done diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-install_name_tool-wrapper.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-install_name_tool-wrapper.sh new file mode 100755 index 0000000..376a7ab --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-install_name_tool-wrapper.sh @@ -0,0 +1,49 @@ +#! @shell@ +# shellcheck shell=bash + +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +source @signingUtils@ + +extraAfter=() +extraBefore=() +params=("$@") + +input= + +pprev= +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + if [ "$pprev" != "-change" ] && [[ "$prev" != -* ]] && [[ "$p" != -* ]]; then + input="$p" + fi + pprev="$prev" + prev="$p" +done + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +@prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + +sign "$input" diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-strip-wrapper.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-strip-wrapper.sh new file mode 100755 index 0000000..a676995 --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/darwin-strip-wrapper.sh @@ -0,0 +1,78 @@ +#! @shell@ +# shellcheck shell=bash + +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +source @signingUtils@ + +extraAfter=() +extraBefore=() +params=("$@") + +output= +inputs=() + +restAreFiles= +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + if [ "$restAreFiles" ]; then + inputs+=("$p") + else + case "$prev" in + -s|-R|-d|-arch) + # Unrelated arguments with values + ;; + -o) + # Explicit output + output="$p" + ;; + *) + # Any other orgument either takes no value, or is a file. + if [[ "$p" != -* ]]; then + inputs+=("$p") + fi + ;; + esac + + if [ "$p" == - ]; then + restAreFiles=1 + fi + fi + + prev="$p" +done + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +@prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + +if [ "$output" ]; then + # Single explicit output + signIfRequired "$output" +else + # Multiple inputs, rewritten in place + for input in "${inputs[@]}"; do + signIfRequired "$input" + done +fi diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/default.nix b/pkgs/by-name/bi/binutils/bintools-wrapper/default.nix new file mode 100644 index 0000000..86eae18 --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/default.nix @@ -0,0 +1,439 @@ +# The Nixpkgs CC is not directly usable, since it doesn't know where +# the C library and standard header files are. Therefore the compiler +# produced by that package cannot be installed directly in a user +# environment and used from the command line. So we use a wrapper +# script that sets up the right environment variables so that the +# compiler and the linker just "work". + +{ name ? "" +, lib +, stdenvNoCC +, runtimeShell +, bintools ? null, libc ? null, coreutils ? null, gnugrep ? null +, netbsd ? null, netbsdCross ? null +, sharedLibraryLoader ? + if libc == null then + null + else if stdenvNoCC.targetPlatform.isNetBSD then + if !(targetPackages ? netbsdCross) then + netbsd.ld_elf_so + else if libc != targetPackages.netbsdCross.headers then + targetPackages.netbsdCross.ld_elf_so + else + null + else + lib.getLib libc +, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" +, propagateDoc ? bintools != null && bintools ? man +, extraPackages ? [], extraBuildCommands ? "" +, isGNU ? bintools.isGNU or false +, isLLVM ? bintools.isLLVM or false +, isCCTools ? bintools.isCCTools or false +, expand-response-params +, targetPackages ? {} +, useMacosReexportHack ? false +, wrapGas ? false + +# Note: the hardening flags are part of the bintools-wrapper, rather than +# the cc-wrapper, because a few of them are handled by the linker. +, defaultHardeningFlags ? [ + "bindnow" + "format" + "fortify" + "fortify3" + "pic" + "relro" + "stackprotector" + "strictoverflow" + ] ++ lib.optional (with stdenvNoCC; + # Musl-based platforms will keep "pie", other platforms will not. + # If you change this, make sure to update section `{#sec-hardening-in-nixpkgs}` + # in the nixpkgs manual to inform users about the defaults. + targetPlatform.libc == "musl" + # Except when: + # - static aarch64, where compilation works, but produces segfaulting dynamically linked binaries. + # - static armv7l, where compilation fails. + && !(targetPlatform.isAarch && targetPlatform.isStatic) + ) "pie" + +# Darwin code signing support utilities +, postLinkSignHook ? null, signingUtils ? null +}: + +assert nativeTools -> !propagateDoc && nativePrefix != ""; +assert !nativeTools -> bintools != null && coreutils != null && gnugrep != null; +assert !(nativeLibc && noLibc); +assert (noLibc || nativeLibc) == (libc == null); + +let + inherit (lib) + attrByPath + concatStringsSep + getBin + getDev + getLib + getName + getVersion + hasSuffix + optional + optionalAttrs + optionals + optionalString + platforms + removePrefix + replaceStrings + ; + + inherit (stdenvNoCC) hostPlatform targetPlatform; + + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by + # default. + targetPrefix = optionalString (targetPlatform != hostPlatform) + (targetPlatform.config + "-"); + + bintoolsVersion = getVersion bintools; + bintoolsName = removePrefix targetPrefix (getName bintools); + + libc_bin = optionalString (libc != null) (getBin libc); + libc_dev = optionalString (libc != null) (getDev libc); + libc_lib = optionalString (libc != null) (getLib libc); + bintools_bin = optionalString (!nativeTools) (getBin bintools); + # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. + coreutils_bin = optionalString (!nativeTools) (getBin coreutils); + + # See description in cc-wrapper. + suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config; + + # The dynamic linker has different names on different platforms. This is a + # shell glob that ought to match it. + dynamicLinker = + /**/ if sharedLibraryLoader == null then "" + else if targetPlatform.libc == "musl" then "${sharedLibraryLoader}/lib/ld-musl-*" + else if targetPlatform.libc == "uclibc" then "${sharedLibraryLoader}/lib/ld*-uClibc.so.1" + else if (targetPlatform.libc == "bionic" && targetPlatform.is32bit) then "/system/bin/linker" + else if (targetPlatform.libc == "bionic" && targetPlatform.is64bit) then "/system/bin/linker64" + else if targetPlatform.libc == "nblibc" then "${sharedLibraryLoader}/libexec/ld.elf_so" + else if targetPlatform.system == "i686-linux" then "${sharedLibraryLoader}/lib/ld-linux.so.2" + else if targetPlatform.system == "x86_64-linux" then "${sharedLibraryLoader}/lib/ld-linux-x86-64.so.2" + # ELFv1 (.1) or ELFv2 (.2) ABI + else if targetPlatform.isPower64 then "${sharedLibraryLoader}/lib/ld64.so.*" + # ARM with a wildcard, which can be "" or "-armhf". + else if (with targetPlatform; isAarch32 && isLinux) then "${sharedLibraryLoader}/lib/ld-linux*.so.3" + else if targetPlatform.system == "aarch64-linux" then "${sharedLibraryLoader}/lib/ld-linux-aarch64.so.1" + else if targetPlatform.system == "powerpc-linux" then "${sharedLibraryLoader}/lib/ld.so.1" + else if targetPlatform.isMips then "${sharedLibraryLoader}/lib/ld.so.1" + # `ld-linux-riscv{32,64}-.so.1` + else if targetPlatform.isRiscV then "${sharedLibraryLoader}/lib/ld-linux-riscv*.so.1" + else if targetPlatform.isLoongArch64 then "${sharedLibraryLoader}/lib/ld-linux-loongarch*.so.1" + else if targetPlatform.isDarwin then "/usr/lib/dyld" + else if targetPlatform.isFreeBSD then "/libexec/ld-elf.so.1" + else if hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1" + else ""; + +in + +stdenvNoCC.mkDerivation { + pname = targetPrefix + + (if name != "" then name else "${bintoolsName}-wrapper"); + version = optionalString (bintools != null) bintoolsVersion; + + preferLocalBuild = true; + + outputs = [ "out" ] ++ optionals propagateDoc ([ "man" ] ++ optional (bintools ? info) "info"); + + # passthru = { + # inherit targetPrefix suffixSalt; + # inherit bintools libc nativeTools nativeLibc nativePrefix isGNU isLLVM; + + # emacsBufferSetup = pkgs: '' + # ; We should handle propagation here too + # (mapc + # (lambda (arg) + # (when (file-directory-p (concat arg "/lib")) + # (setenv "NIX_LDFLAGS_${suffixSalt}" (concat (getenv "NIX_LDFLAGS_${suffixSalt}") " -L" arg "/lib"))) + # (when (file-directory-p (concat arg "/lib64")) + # (setenv "NIX_LDFLAGS_${suffixSalt}" (concat (getenv "NIX_LDFLAGS_${suffixSalt}") " -L" arg "/lib64")))) + # '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) + # ''; + + # inherit defaultHardeningFlags; + # }; + + dontBuild = true; + dontConfigure = true; + + enableParallelBuilding = true; + + unpackPhase = '' + src=$PWD + ''; + + installPhase = + '' + mkdir -p $out/bin $out/nix-support + + wrap() { + local dst="$1" + local wrapper="$2" + export prog="$3" + export use_response_file_by_default=${if isCCTools then "1" else "0"} + substituteAll "$wrapper" "$out/bin/$dst" + chmod +x "$out/bin/$dst" + } + '' + + + (if nativeTools then '' + echo ${nativePrefix} > $out/nix-support/orig-bintools + + ldPath="${nativePrefix}/bin" + '' else '' + echo $bintools_bin > $out/nix-support/orig-bintools + + ldPath="${bintools_bin}/bin" + '' + + # Solaris needs an additional ld wrapper. + + optionalString (targetPlatform.isSunOS && nativePrefix != "") '' + ldPath="${nativePrefix}/bin" + exec="$ldPath/${targetPrefix}ld" + wrap ld-solaris ${./ld-solaris-wrapper.sh} + '') + + # If we are asked to wrap `gas` and this bintools has it, + # then symlink it (`as` will be symlinked next). + # This is mainly for the wrapped gnat-bootstrap on x86-64 Darwin, + # as it must have both the GNU assembler from cctools (installed as `gas`) + # and the Clang integrated assembler (installed as `as`). + # See pkgs/os-specific/darwin/binutils/default.nix for details. + + optionalString wrapGas '' + if [ -e $ldPath/${targetPrefix}gas ]; then + ln -s $ldPath/${targetPrefix}gas $out/bin/${targetPrefix}gas + fi + '' + + # Create symlinks for rest of the binaries. + + '' + for binary in objdump objcopy size strings as ar nm gprof dwp c++filt addr2line \ + ranlib readelf elfedit dlltool dllwrap windmc windres; do + if [ -e $ldPath/${targetPrefix}''${binary} ]; then + ln -s $ldPath/${targetPrefix}''${binary} $out/bin/${targetPrefix}''${binary} + fi + done + + '' + (if !useMacosReexportHack then '' + if [ -e ''${ld:-$ldPath/${targetPrefix}ld} ]; then + wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld} + fi + '' else '' + ldInner="${targetPrefix}ld-reexport-delegate" + wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld} + wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" + unset ldInner + '') + '' + + for variant in $ldPath/${targetPrefix}ld.*; do + basename=$(basename "$variant") + wrap $basename ${./ld-wrapper.sh} $variant + done + ''; + + strictDeps = true; + depsTargetTargetPropagated = extraPackages; + + setupHooks = [ + ../setup-hooks/role.bash + ./setup-hook.sh + ]; + + postFixup = + ## + ## General libc support + ## + optionalString (libc != null) ('' + touch "$out/nix-support/libc-ldflags" + echo "-L${libc_lib}${libc.libdir or "/lib"}" >> $out/nix-support/libc-ldflags + + echo "${libc_lib}" > $out/nix-support/orig-libc + echo "${libc_dev}" > $out/nix-support/orig-libc-dev + '' + + ## + ## Dynamic linker support + ## + + optionalString (sharedLibraryLoader != null) '' + if [[ -z ''${dynamicLinker+x} ]]; then + echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2 + local dynamicLinker="${sharedLibraryLoader}/lib/ld*.so.?" + fi + '' + + # Expand globs to fill array of options + + '' + dynamicLinker=($dynamicLinker) + + case ''${#dynamicLinker[@]} in + 0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;; + 1) echo "Using dynamic linker: '$dynamicLinker'" >&2;; + *) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;; + esac + + if [ -n "''${dynamicLinker-}" ]; then + echo $dynamicLinker > $out/nix-support/dynamic-linker + + ${if targetPlatform.isDarwin then '' + printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook + '' else optionalString (sharedLibraryLoader != null) '' + if [ -e ${sharedLibraryLoader}/lib/32/ld-linux.so.2 ]; then + echo ${sharedLibraryLoader}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 + fi + touch $out/nix-support/ld-set-dynamic-linker + ''} + fi + '') + + ## + ## User env support + ## + + # Propagate the underling unwrapped bintools so that if you + # install the wrapper, you get tools like objdump (same for any + # binaries of libc). + + optionalString (!nativeTools) '' + printWords ${bintools_bin} ${optionalString (libc != null) libc_bin} > $out/nix-support/propagated-user-env-packages + '' + + ## + ## Man page and info support + ## + + optionalString propagateDoc ('' + ln -s ${bintools.man} $man + '' + optionalString (bintools ? info) '' + ln -s ${bintools.info} $info + '') + + ## + ## Hardening support + ## + + # some linkers on some platforms don't support specific -z flags + + '' + export hardening_unsupported_flags="" + if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" bindnow" + fi + if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" relro" + fi + '' + + + optionalString hostPlatform.isCygwin '' + hardening_unsupported_flags+=" pic" + '' + + + optionalString (targetPlatform.isAvr || targetPlatform.isWindows) '' + hardening_unsupported_flags+=" relro bindnow" + '' + + + optionalString (libc != null && targetPlatform.isAvr) '' + for isa in avr5 avr3 avr4 avr6 avr25 avr31 avr35 avr51 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 tiny-stack; do + echo "-L${getLib libc}/avr/lib/$isa" >> $out/nix-support/libc-cflags + done + '' + + + optionalString targetPlatform.isDarwin '' + echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/libc-ldflags + '' + + ## + ## GNU specific extra strip flags + ## + + # TODO(@sternenseemann): make a generic strip wrapper? + + optionalString (bintools.isGNU or false) '' + wrap ${targetPrefix}strip ${./gnu-binutils-strip-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}strip" + '' + + ### + ### Remove certain timestamps from final binaries + ### + + optionalString (targetPlatform.isDarwin && !(bintools.isGNU or false)) '' + echo "export ZERO_AR_DATE=1" >> $out/nix-support/setup-hook + '' + + + '' + for flags in "$out/nix-support"/*flags*; do + substituteInPlace "$flags" --replace $'\n' ' ' + done + + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh + substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh + substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash + '' + + ### + ### Ensure consistent LC_VERSION_MIN_MACOSX + ### + + optionalString targetPlatform.isDarwin ( + let + inherit (targetPlatform) + darwinPlatform darwinSdkVersion + darwinMinVersion darwinMinVersionVariable; + in '' + export darwinPlatform=${darwinPlatform} + export darwinMinVersion=${darwinMinVersion} + export darwinSdkVersion=${darwinSdkVersion} + export darwinMinVersionVariable=${darwinMinVersionVariable} + substituteAll ${./add-darwin-ldflags-before.sh} $out/nix-support/add-local-ldflags-before.sh + '' + ) + + ## + ## Code signing on Apple Silicon + ## + + optionalString (targetPlatform.isDarwin && targetPlatform.isAarch64) '' + echo 'source ${postLinkSignHook}' >> $out/nix-support/post-link-hook + + export signingUtils=${signingUtils} + + wrap \ + ${targetPrefix}install_name_tool \ + ${./darwin-install_name_tool-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}install_name_tool" + + wrap \ + ${targetPrefix}strip ${./darwin-strip-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}strip" + '' + + ## + ## Extra custom steps + ## + + extraBuildCommands; + + env = { + # for substitution in utils.bash + # TODO(@sternenseemann): invent something cleaner than passing in "" in case of absence + expandResponseParams = "${expand-response-params}/bin/expand-response-params"; + # TODO(@sternenseemann): rename env var via stdenv rebuild + shell = (getBin runtimeShell + runtimeShell.shellPath or ""); + gnugrep_bin = optionalString (!nativeTools) gnugrep; + wrapperName = "BINTOOLS_WRAPPER"; + inherit dynamicLinker targetPrefix suffixSalt coreutils_bin; + inherit bintools_bin libc_bin libc_dev libc_lib; + default_hardening_flags_str = builtins.toString defaultHardeningFlags; + }; + + meta = + let bintools_ = optionalAttrs (bintools != null) bintools; in + (optionalAttrs (bintools_ ? meta) (removeAttrs bintools.meta ["priority"])) // + { description = + attrByPath ["meta" "description"] "System binary utilities" bintools_ + + " (wrapper script)"; + priority = 10; + } // optionalAttrs useMacosReexportHack { + platforms = platforms.darwin; + }; +} diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/gnu-binutils-strip-wrapper.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/gnu-binutils-strip-wrapper.sh new file mode 100644 index 0000000..5b5136e --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/gnu-binutils-strip-wrapper.sh @@ -0,0 +1,4 @@ +#! @shell@ +# shellcheck shell=bash + +exec @prog@ --enable-deterministic-archives "$@" diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/ld-solaris-wrapper.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/ld-solaris-wrapper.sh new file mode 100644 index 0000000..5d81e34 --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/ld-solaris-wrapper.sh @@ -0,0 +1,29 @@ +#!@shell@ +set -eu -o pipefail +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +declare -a args=("$@") +# I've also tried adding -z direct and -z lazyload, but it gave too many problems with C++ exceptions :'( +# Also made sure libgcc would not be lazy-loaded, as suggested here: https://www.illumos.org/issues/2534#note-3 +# but still no success. +declare -a argsBefore=(-z ignore) argsAfter=() + +# This loop makes sure all -L arguments are before -l arguments, or ld may complain it cannot find a library. +# GNU binutils does not have this problem: +# http://stackoverflow.com/questions/5817269/does-the-order-of-l-and-l-options-in-the-gnu-linker-matter +while (( $# )); do + case "${args[$i]}" in + -L) argsBefore+=("$1" "$2"); shift ;; + -L?*) argsBefore+=("$1") ;; + *) argsAfter+=("$1") ;; + esac + shift +done + +# Trace: +set -x +exec "@ld@" "${argsBefore[@]}" "${argsAfter[@]}" diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/ld-wrapper.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/ld-wrapper.sh new file mode 100644 index 0000000..dcbe8a4 --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/ld-wrapper.sh @@ -0,0 +1,273 @@ +#! @shell@ +set -eu -o pipefail +o posix +shopt -s nullglob + +if (( "${NIX_DEBUG:-0}" >= 7 )); then + set -x +fi + +path_backup="$PATH" + +# phase separation makes this look useless +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + PATH="@coreutils_bin@/bin" +fi + +source @out@/nix-support/utils.bash + +if [ -z "${NIX_BINTOOLS_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then + source @out@/nix-support/add-flags.sh +fi + + +# Optionally filter out paths not refering to the store. +expandResponseParams "$@" + +# NIX_LINK_TYPE is set if ld has been called through our cc wrapper. We take +# advantage of this to avoid both recalculating it, and also repeating other +# processing cc wrapper has already done. +if [[ -n "${NIX_LINK_TYPE_@suffixSalt@:-}" ]]; then + linkType=$NIX_LINK_TYPE_@suffixSalt@ +else + linkType=$(checkLinkType "${params[@]}") +fi + +if [[ "${NIX_ENFORCE_PURITY:-}" = 1 && -n "${NIX_STORE:-}" + && ( -z "$NIX_IGNORE_LD_THROUGH_GCC_@suffixSalt@" || -z "${NIX_LINK_TYPE_@suffixSalt@:-}" ) ]]; then + rest=() + nParams=${#params[@]} + declare -i n=0 + + while (( "$n" < "$nParams" )); do + p=${params[n]} + p2=${params[n+1]:-} # handle `p` being last one + if [ "${p:0:3}" = -L/ ] && badPath "${p:2}"; then + skip "${p:2}" + elif [ "$p" = -L ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -rpath ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -dynamic-linker ] && badPath "$p2"; then + n+=1; skip "$p2" + elif [ "$p" = -syslibroot ] && [ $p2 == // ]; then + # When gcc is built on darwin --with-build-sysroot=/ + # produces '-syslibroot //' linker flag. It's a no-op, + # which does not introduce impurities. + n+=1; skip "$p2" + elif [ "${p:0:10}" = /LIBPATH:/ ] && badPath "${p:9}"; then + reject "${p:9}" + # We need to not match LINK.EXE-style flags like + # /NOLOGO or /LIBPATH:/nix/store/foo + elif [[ $p =~ ^/[^:]*/ ]] && badPath "$p"; then + reject "$p" + elif [ "${p:0:9}" = --sysroot ]; then + # Our ld is not built with sysroot support (Can we fix that?) + : + else + rest+=("$p") + fi + n+=1 + done + # Old bash empty array hack + params=(${rest+"${rest[@]}"}) +fi + + +source @out@/nix-support/add-hardening.sh + +extraAfter=() +extraBefore=(${hardeningLDFlags[@]+"${hardeningLDFlags[@]}"}) + +if [ -z "${NIX_LINK_TYPE_@suffixSalt@:-}" ]; then + extraAfter+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_@suffixSalt@)) + extraBefore+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_BEFORE_@suffixSalt@)) + + # By adding dynamic linker to extraBefore we allow the users set their + # own dynamic linker as NIX_LD_FLAGS will override earlier set flags + if [[ "$linkType" == dynamic && -n "$NIX_DYNAMIC_LINKER_@suffixSalt@" ]]; then + extraBefore+=("-dynamic-linker" "$NIX_DYNAMIC_LINKER_@suffixSalt@") + fi +fi + +extraAfter+=($(filterRpathFlags "$linkType" $NIX_LDFLAGS_AFTER_@suffixSalt@)) + +# These flags *must not* be pulled up to -Wl, flags, so they can't go in +# add-flags.sh. They must always be set, so must not be disabled by +# NIX_LDFLAGS_SET. +if [ -e @out@/nix-support/add-local-ldflags-before.sh ]; then + source @out@/nix-support/add-local-ldflags-before.sh +fi + + +# Three tasks: +# +# 1. Find all -L... switches for rpath +# +# 2. Find relocatable flag for build id. +# +# 3. Choose 32-bit dynamic linker if needed +declare -a libDirs +declare -A libs +declare -i relocatable=0 link32=0 + +linkerOutput="a.out" + +if + [ "$NIX_DONT_SET_RPATH_@suffixSalt@" != 1 ] \ + || [ "$NIX_SET_BUILD_ID_@suffixSalt@" = 1 ] \ + || [ -e @out@/nix-support/dynamic-linker-m32 ] +then + prev= + # Old bash thinks empty arrays are undefined, ugh. + for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} + do + case "$prev" in + -L) + libDirs+=("$p") + ;; + -l) + libs["lib${p}.so"]=1 + ;; + -m) + # Presumably only the last `-m` flag has any effect. + case "$p" in + elf_i386) link32=1;; + *) link32=0;; + esac + ;; + -dynamic-linker | -plugin) + # Ignore this argument, or it will match *.so and be added to rpath. + ;; + *) + case "$p" in + -L/*) + libDirs+=("${p:2}") + ;; + -l?*) + libs["lib${p:2}.so"]=1 + ;; + "${NIX_STORE:-}"/*.so | "${NIX_STORE:-}"/*.so.*) + # This is a direct reference to a shared library. + libDirs+=("${p%/*}") + libs["${p##*/}"]=1 + ;; + -r | --relocatable | -i) + relocatable=1 + esac + ;; + esac + prev="$p" + done +fi + +# Determine linkerOutput +prev= +for p in \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +do + case "$prev" in + -o) + # Informational for post-link-hook + linkerOutput="$p" + ;; + *) + ;; + esac + prev="$p" +done + +if [[ "$link32" == "1" && "$linkType" == dynamic && -e "@out@/nix-support/dynamic-linker-m32" ]]; then + # We have an alternate 32-bit linker and we're producing a 32-bit ELF, let's + # use it. + extraAfter+=( + '-dynamic-linker' + "$(< @out@/nix-support/dynamic-linker-m32)" + ) +fi + +# Add all used dynamic libraries to the rpath. +if [[ "$NIX_DONT_SET_RPATH_@suffixSalt@" != 1 && "$linkType" != static-pie ]]; then + # For each directory in the library search path (-L...), + # see if it contains a dynamic library used by a -l... flag. If + # so, add the directory to the rpath. + # It's important to add the rpath in the order of -L..., so + # the link time chosen objects will be those of runtime linking. + declare -A rpaths + for dir in ${libDirs+"${libDirs[@]}"}; do + if [[ "$dir" =~ [/.][/.] ]] && dir2=$(readlink -f "$dir"); then + dir="$dir2" + fi + if [ -n "${rpaths[$dir]:-}" ] || [[ "$dir" != "${NIX_STORE:-}"/* ]]; then + # If the path is not in the store, don't add it to the rpath. + # This typically happens for libraries in /tmp that are later + # copied to $out/lib. If not, we're screwed. + continue + fi + for path in "$dir"/*; do + file="${path##*/}" + if [ "${libs[$file]:-}" ]; then + # This library may have been provided by a previous directory, + # but if that library file is inside an output of the current + # derivation, it can be deleted after this compilation and + # should be found in a later directory, so we add all + # directories that contain any of the libraries to rpath. + rpaths["$dir"]=1 + extraAfter+=(-rpath "$dir") + break + fi + done + done + +fi + +# This is outside the DONT_SET_RPATH branch because it's more targeted and we +# usually want it (on Darwin) even if DONT_SET_RPATH is set. +if [ -n "${NIX_COREFOUNDATION_RPATH:-}" ]; then + extraAfter+=(-rpath $NIX_COREFOUNDATION_RPATH) +fi + +# Only add --build-id if this is a final link. FIXME: should build gcc +# with --enable-linker-build-id instead? +# +# Note: `lld` interprets `--build-id` to mean `--build-id=fast`; GNU ld defaults +# to SHA1. +if [ "$NIX_SET_BUILD_ID_@suffixSalt@" = 1 ] && ! (( "$relocatable" )); then + extraAfter+=(--build-id="${NIX_BUILD_ID_STYLE:-sha1}") +fi + + +# Optionally print debug info. +if (( "${NIX_DEBUG:-0}" >= 1 )); then + # Old bash workaround, see above. + echo "extra flags before to @prog@:" >&2 + printf " %q\n" ${extraBefore+"${extraBefore[@]}"} >&2 + echo "original flags to @prog@:" >&2 + printf " %q\n" ${params+"${params[@]}"} >&2 + echo "extra flags after to @prog@:" >&2 + printf " %q\n" ${extraAfter+"${extraAfter[@]}"} >&2 +fi + +PATH="$path_backup" +# Old bash workaround, see above. + +if (( "${NIX_LD_USE_RESPONSE_FILE:-@use_response_file_by_default@}" >= 1 )); then + @prog@ @<(printf "%q\n" \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"}) +else + @prog@ \ + ${extraBefore+"${extraBefore[@]}"} \ + ${params+"${params[@]}"} \ + ${extraAfter+"${extraAfter[@]}"} +fi + +if [ -e "@out@/nix-support/post-link-hook" ]; then + source @out@/nix-support/post-link-hook +fi diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/macos-sierra-reexport-hack.bash b/pkgs/by-name/bi/binutils/bintools-wrapper/macos-sierra-reexport-hack.bash new file mode 100644 index 0000000..255071a --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/macos-sierra-reexport-hack.bash @@ -0,0 +1,246 @@ +#! @shell@ + +set -eu -o pipefail + +# For cmd | while read; do ...; done +shopt -s lastpipe + +path_backup="$PATH" +if [ -n "@coreutils_bin@" ]; then + PATH="@coreutils_bin@/bin" +fi + +declare -ri recurThreshold=200 +declare -i overflowCount=0 + +declare -ar origArgs=("$@") + +# Throw away what we won't need +declare -a parentArgs=() + +while (( $# )); do + case "$1" in + -l) + echo "cctools LD does not support '-l foo'" >&2 + exit 1 + ;; + -lazy_library | -reexport_library | -upward_library | -weak_library) + overflowCount+=1 + shift 2 + ;; + -l* | *.so.* | *.dylib | -lazy-l* | -reexport-l* | -upward-l* | -weak-l*) + overflowCount+=1 + shift 1 + ;; + *.a | *.o) + shift 1 + ;; + -L | -F) + # Evidentally ld doesn't like using the child's RPATH, so it still + # needs these. + parentArgs+=("$1" "$2") + shift 2 + ;; + -L?* | -F?*) + parentArgs+=("$1") + shift 1 + ;; + -o) + outputName="$2" + parentArgs+=("$1" "$2") + shift 2 + ;; + -install_name | -dylib_install_name | -dynamic-linker | -plugin) + parentArgs+=("$1" "$2") + shift 2 + ;; + -rpath) + # Only an rpath to the child is needed, which we will add + shift 2 + ;; + *) + if [[ -f "$1" ]]; then + # Propabably a non-standard object file like Haskell's + # `.dyn_o`. Skip it like other inputs + : + else + parentArgs+=("$1") + fi + shift 1 + ;; + esac +done + + + +if (( "$overflowCount" <= "$recurThreshold" )); then + if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: Only ${overflowCount} inputs counted while ${recurThreshold} is the ceiling, linking normally. " >&2 + fi + PATH="$path_backup" + exec @prog@ "${origArgs[@]}" +fi + + + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: ${overflowCount} inputs counted when ${recurThreshold} is the ceiling, inspecting further. " >&2 +fi + +# Collect the normalized linker input +declare -a norm=() + +# Arguments are null-separated +@prog@ --dump-normalized-lib-args "${origArgs[@]}" | + while IFS= read -r -d '' input; do + norm+=("$input") + done + +declare -i leafCount=0 +declare lastLeaf='' +declare -a childrenInputs=() trailingInputs=() +while (( "${#norm[@]}" )); do + case "${norm[0]}" in + -lazy_library | -upward_library) + # TODO(@Ericson2314): Don't do that, but intersperse children + # between such args. + echo "ld-wrapper: Warning: Potentially changing link order" >&2 + trailingInputs+=("${norm[0]}" "${norm[1]}") + norm=("${norm[@]:2}") + ;; + -reexport_library | -weak_library) + childrenInputs+=("${norm[0]}" "${norm[1]}") + if [[ "${norm[1]}" != "$lastLeaf" ]]; then + leafCount+=1 + lastLeaf="${norm[1]}" + fi + norm=("${norm[@]:2}") + ;; + *.so | *.dylib) + childrenInputs+=(-reexport_library "${norm[0]}") + if [[ "${norm[0]}" != "$lastLeaf" ]]; then + leafCount+=1 + lastLeaf="${norm[0]}" + fi + norm=("${norm[@]:1}") + ;; + *.o | *.a) + # Don't delegate object files or static libs + parentArgs+=("${norm[0]}") + norm=("${norm[@]:1}") + ;; + *) + if [[ -f "${norm[0]}" ]]; then + # Propabably a non-standard object file. We'll let it by. + parentArgs+=("${norm[0]}") + norm=("${norm[@]:1}") + else + echo "ld-wrapper: Internal Error: Invalid normalized argument" >&2 + exit 255 + fi + ;; + esac +done + + + +if (( "$leafCount" <= "$recurThreshold" )); then + if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: Only ${leafCount} *dynamic* inputs counted while ${recurThreshold} is the ceiling, linking normally. " >&2 + fi + PATH="$path_backup" + exec @prog@ "${origArgs[@]}" +fi + + + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "ld-wrapper: ${leafCount} *dynamic* inputs counted when ${recurThreshold} is the ceiling, delegating to children. " >&2 +fi + +declare -r outputNameLibless=$( \ + if [[ -z "${outputName:+isUndefined}" ]]; then + echo unnamed + return 0; + fi + baseName=$(basename ${outputName}) + if [[ "$baseName" = lib* ]]; then + baseName="${baseName:3}" + fi + echo "$baseName") + +declare -ra children=( + "$outputNameLibless-reexport-delegate-0" + "$outputNameLibless-reexport-delegate-1" +) + +mkdir -p "$out/lib" + +symbolBloatObject=$outputNameLibless-symbol-hack.o +if [[ ! -f $symbolBloatObject ]]; then + # `-Q` means use GNU Assembler rather than Clang, avoiding an awkward + # dependency cycle. + printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' | + PATH="$PATH:@out@/bin" @targetPrefix@as -Q -- -o $symbolBloatObject +fi + +# Split inputs between children +declare -a child0Inputs=() child1Inputs=("${childrenInputs[@]}") +let "countFirstChild = $leafCount / 2" || true +lastLeaf='' +while (( "$countFirstChild" )); do + case "${child1Inputs[0]}" in + -reexport_library | -weak_library) + child0Inputs+=("${child1Inputs[0]}" "${child1Inputs[1]}") + if [[ "${child1Inputs[1]}" != "$lastLeaf" ]]; then + let countFirstChild-=1 || true + lastLeaf="${child1Inputs[1]}" + fi + child1Inputs=("${child1Inputs[@]:2}") + ;; + *.so | *.dylib) + child0Inputs+=(-reexport_library "${child1Inputs[0]}") + if [[ "${child1Inputs[0]}" != "$lastLeaf" ]]; then + let countFirstChild-=1 || true + lastLeaf="${child1Inputs[1]}" + fi + child1Inputs=("${child1Inputs[@]:2}") + ;; + *) + echo "ld-wrapper: Internal Error: Invalid delegated input" >&2 + exit -1 + ;; + esac +done + + +# First half of libs +@out@/bin/@targetPrefix@ld \ + -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ + -o "$out/lib/lib${children[0]}.dylib" \ + -install_name "$out/lib/lib${children[0]}.dylib" \ + "$symbolBloatObject" "${child0Inputs[@]}" "${trailingInputs[@]}" + +# Second half of libs +@out@/bin/@targetPrefix@ld \ + -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ + -o "$out/lib/lib${children[1]}.dylib" \ + -install_name "$out/lib/lib${children[1]}.dylib" \ + "$symbolBloatObject" "${child1Inputs[@]}" "${trailingInputs[@]}" + +parentArgs+=("-L$out/lib" -rpath "$out/lib") +if [[ $outputName != *reexport-delegate* ]]; then + parentArgs+=("-l${children[0]}" "-l${children[1]}") +else + parentArgs+=("-reexport-l${children[0]}" "-reexport-l${children[1]}") +fi + +parentArgs+=("${trailingInputs[@]}") + +if [ -n "${NIX_DEBUG:-}" ]; then + echo "flags using delegated children to @prog@:" >&2 + printf " %q\n" "${parentArgs[@]}" >&2 +fi + +PATH="$path_backup" +exec @prog@ "${parentArgs[@]}" diff --git a/pkgs/by-name/bi/binutils/bintools-wrapper/setup-hook.sh b/pkgs/by-name/bi/binutils/bintools-wrapper/setup-hook.sh new file mode 100644 index 0000000..c146cbe --- /dev/null +++ b/pkgs/by-name/bi/binutils/bintools-wrapper/setup-hook.sh @@ -0,0 +1,72 @@ +# Binutils Wrapper hygiene +# +# See comments in cc-wrapper's setup hook. This works exactly the same way. + +# Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a +# native compile. +# +# TODO(@Ericson2314): No native exception +[[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0 + +bintoolsWrapper_addLDVars () { + # See ../setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then + export NIX_LDFLAGS${role_post}+=" -L$1/lib64" + fi + + if [[ -d "$1/lib" ]]; then + # Don't add the /lib directory if it actually doesn't contain any libraries. For instance, + # Python and Haskell packages often only have directories like $out/lib/ghc-8.4.3/ or + # $out/lib/python3.6/, so having them in LDFLAGS just makes the linker search unnecessary + # directories and bloats the size of the environment variable space. + local -a glob=( $1/lib/lib* ) + if [ "${#glob[*]}" -gt 0 ]; then + export NIX_LDFLAGS${role_post}+=" -L$1/lib" + fi + fi +} + +# See ../setup-hooks/role.bash +getTargetRole +getTargetRoleWrapper + +addEnvHooks "$targetOffset" bintoolsWrapper_addLDVars + +# shellcheck disable=SC2157 +if [ -n "@bintools_bin@" ]; then + addToSearchPath _PATH @bintools_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@libc_bin@" ]; then + addToSearchPath _PATH @libc_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + addToSearchPath _PATH @coreutils_bin@/bin +fi + +# Export tool environment variables so various build systems use the right ones. + +export NIX_BINTOOLS${role_post}=@out@ + +for cmd in \ + ar as ld nm objcopy objdump readelf ranlib strip strings size windres +do + if + PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null + then + export "${cmd^^}${role_post}=@targetPrefix@${cmd}"; + fi +done + +# If unset, assume the default hardening flags. +: ${NIX_HARDENING_ENABLE="@default_hardening_flags_str@"} +export NIX_HARDENING_ENABLE + +# No local scope in sourced file +unset -v role_post cmd upper_case diff --git a/pkgs/by-name/bi/binutils/default.nix b/pkgs/by-name/bi/binutils/default.nix new file mode 100644 index 0000000..c707d0d --- /dev/null +++ b/pkgs/by-name/bi/binutils/default.nix @@ -0,0 +1,273 @@ +let + withGold = platform: platform.isElf && !platform.isRiscV && !platform.isLoongArch64; +in + +{ stdenv +, autoreconfHook +, autoconf269, automake, libtool +, bison +, buildPackages +, fetchFromGitHub +, fetchurl +, flex +, gettext +, lib +, noSysDirs +, perl +, substitute +, zlib + +, enableGold ? withGold stdenv.targetPlatform +, enableGoldDefault ? false +, enableShared ? !stdenv.hostPlatform.isStatic + # WARN: Enabling all targets increases output size to a multiple. +, withAllTargets ? false +}: + +# WARN: configure silently disables ld.gold if it's unsupported, so we need to +# make sure that intent matches result ourselves. +assert enableGold -> withGold stdenv.targetPlatform; +assert enableGoldDefault -> enableGold; + + +let + inherit (stdenv) buildPlatform hostPlatform targetPlatform; + + version = "2.41"; + + srcs = { + normal = fetchurl { + url = "mirror://gnu/binutils/binutils-${version}.tar.bz2"; + hash = "sha256-pMS+wFL3uDcAJOYDieGUN38/SLVmGEGOpRBn9nqqsws="; + }; + vc4-none = fetchFromGitHub { + owner = "itszor"; + repo = "binutils-vc4"; + rev = "708acc851880dbeda1dd18aca4fd0a95b2573b36"; + sha256 = "1kdrz6fki55lm15rwwamn74fnqpy0zlafsida2zymk76n3656c63"; + }; + }; + + #INFO: The targetPrefix prepended to binary names to allow multiple binuntils + # on the PATH to both be usable. + targetPrefix = lib.optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-"; +in + +stdenv.mkDerivation (finalAttrs: { + pname = targetPrefix + "binutils"; + inherit version; + + # HACK: Ensure that we preserve source from bootstrap binutils to not rebuild LLVM + src = stdenv.__bootPackages.binutils-unwrapped.src + or srcs.${targetPlatform.system} + or srcs.normal; + + # WARN: this package is used for bootstrapping fetchurl, and thus cannot use + # fetchpatch! All mutable patches (generated by GitHub or cgit) that are + # needed here should be included directly in Nixpkgs as files. + patches = [ + # Upstream patch to fix llvm testsuite failure when loading powerpc + # objects: + # https://sourceware.org/PR30794 + ./gold-powerpc-for-llvm.patch + + # Make binutils output deterministic by default. + ./deterministic.patch + + + # Breaks nm BSD flag detection, heeds an upstream fix: + # https://sourceware.org/PR29547 + ./0001-Revert-libtool.m4-fix-the-NM-nm-over-here-B-option-w.patch + ./0001-Revert-libtool.m4-fix-nm-BSD-flag-detection.patch + + # Required for newer macos versions + ./0001-libtool.m4-update-macos-version-detection-block.patch + + # For some reason bfd ld doesn't search DT_RPATH when cross-compiling. It's + # not clear why this behavior was decided upon but it has the unfortunate + # consequence that the linker will fail to find transitive dependencies of + # shared objects when cross-compiling. Consequently, we are forced to + # override this behavior, forcing ld to search DT_RPATH even when + # cross-compiling. + ./always-search-rpath.patch + + # Avoid `lib -> out -> lib` reference. Normally `bfd-plugins` does + # not need to know binutils' BINDIR at all. It's an absolute path + # where libraries are stored. + ./plugins-no-BINDIR.patch + ] + ++ lib.optional targetPlatform.isiOS ./support-ios.patch + # Adds AVR-specific options to "size" for compatibility with Atmel's downstream distribution + # Patch from arch-community + # https://github.com/archlinux/svntogit-community/blob/c8d53dd1734df7ab15931f7fad0c9acb8386904c/trunk/avr-size.patch + ++ lib.optional targetPlatform.isAvr ./avr-size.patch + ++ lib.optional stdenv.targetPlatform.isWindows ./windres-locate-gcc.patch + ; + + outputs = [ "out" "info" "man" "dev" ] + # Ideally we would like to always install 'lib' into a separate + # target. Unfortunately cross-compiled binutils installs libraries + # across both `$lib/lib/` and `$out/$target/lib` with a reference + # from $out to $lib. Probably a binutils bug: all libraries should go + # to $lib as binutils does not build target libraries. Let's make our + # life slightly simpler by installing everything into $out for + # cross-binutils. + ++ lib.optionals (targetPlatform == hostPlatform) [ "lib" ]; + + strictDeps = true; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + # texinfo was removed here in https://github.com/NixOS/nixpkgs/pull/210132 + # to reduce rebuilds during stdenv bootstrap. Please don't add it back without + # checking the impact there first. + nativeBuildInputs = [ + bison + perl + ] + ++ lib.optionals targetPlatform.isiOS [ autoreconfHook ] + ++ lib.optionals buildPlatform.isDarwin [ autoconf269 automake gettext libtool ] + ++ lib.optionals targetPlatform.isVc4 [ flex ] + ; + + buildInputs = [ zlib gettext ]; + + inherit noSysDirs; + + preConfigure = (lib.optionalString buildPlatform.isDarwin '' + for i in */configure.ac; do + pushd "$(dirname "$i")" + echo "Running autoreconf in $PWD" + # autoreconf doesn't work, don't know why + # autoreconf ''${autoreconfFlags:---install --force --verbose} + autoconf + popd + done + '') + '' + # Clear the default library search path. + if test "$noSysDirs" = "1"; then + echo 'NATIVE_LIB_DIRS=' >> ld/configure.tgt + fi + + # Use symlinks instead of hard links to save space ("strip" in the + # fixup phase strips each hard link separately). + for i in binutils/Makefile.in gas/Makefile.in ld/Makefile.in gold/Makefile.in; do + sed -i "$i" -e 's|ln |ln -s |' + done + + # autoreconfHook is not included for all targets. + # Call it here explicitly as well. + ${finalAttrs.postAutoreconf} + ''; + + postAutoreconf = '' + # As we regenerated configure build system tries hard to use + # texinfo to regenerate manuals. Let's avoid the dependency + # on texinfo in bootstrap path and keep manuals unmodified. + touch gas/doc/.dirstamp + touch gas/doc/asconfig.texi + touch gas/doc/as.1 + touch gas/doc/as.info + ''; + + # As binutils takes part in the stdenv building, we don't want references + # to the bootstrap-tools libgcc (as uses to happen on arm/mips) + env.NIX_CFLAGS_COMPILE = + if hostPlatform.isDarwin + then "-Wno-string-plus-int -Wno-deprecated-declarations" + else "-static-libgcc"; + + hardeningDisable = [ "format" "pie" ]; + + configurePlatforms = [ "build" "host" "target" ]; + + configureFlags = [ + "--enable-64-bit-bfd" + "--with-system-zlib" + + "--enable-deterministic-archives" + "--disable-werror" + "--enable-fix-loongson2f-nop" + + # Turn on --enable-new-dtags by default to make the linker set + # RUNPATH instead of RPATH on binaries. This is important because + # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime. + "--enable-new-dtags" + + # force target prefix. Some versions of binutils will make it empty if + # `--host` and `--target` are too close, even if Nixpkgs thinks the + # platforms are different (e.g. because not all the info makes the + # `config`). Other versions of binutils will always prefix if `--target` is + # passed, even if `--host` and `--target` are the same. The easiest thing + # for us to do is not leave it to chance, and force the program prefix to be + # what we want it to be. + "--program-prefix=${targetPrefix}" + + # Unconditionally disable: + # - musl target needs porting: https://sourceware.org/PR29477 + "--disable-gprofng" + + # By default binutils searches $libdir for libraries. This brings in + # libbfd and libopcodes into a default visibility. Drop default lib + # path to force users to declare their use of these libraries. + "--with-lib-path=:" + ] + ++ lib.optionals withAllTargets [ "--enable-targets=all" ] + ++ lib.optionals enableGold [ + "--enable-gold${lib.optionalString enableGoldDefault "=default"}" + "--enable-plugins" + ] ++ (if enableShared + then [ "--enable-shared" "--disable-static" ] + else [ "--disable-shared" "--enable-static" ]) + ; + + # Fails + doCheck = false; + + # Break dependency on pkgsBuildBuild.gcc when building a cross-binutils + stripDebugList = if stdenv.hostPlatform != stdenv.targetPlatform then "bin lib ${stdenv.hostPlatform.config}" else null; + + # INFO: Otherwise it fails with: + # `./sanity.sh: line 36: $out/bin/size: not found` + doInstallCheck = (buildPlatform == hostPlatform) && (hostPlatform == targetPlatform); + + enableParallelBuilding = true; + + # For the same reason we don't split "lib" output we undo the $target/ + # prefix for installed headers and libraries we link: + # $out/$host/$target/lib/* to $out/lib/ + # $out/$host/$target/include/* to $dev/include/* + # TODO(trofi): fix installation paths upstream so we could remove this + # code and have "lib" output unconditionally. + postInstall = lib.optionalString (hostPlatform.config != targetPlatform.config) '' + ln -s $out/${hostPlatform.config}/${targetPlatform.config}/lib/* $out/lib/ + ln -s $out/${hostPlatform.config}/${targetPlatform.config}/include/* $dev/include/ + ''; + + passthru = { + inherit targetPrefix; + hasGold = enableGold; + isGNU = true; + # Having --enable-plugins is not enough, system has to support + # dlopen() or equivalent. See config/plugins.m4 and configure.ac + # (around PLUGINS) for cases that support or not support plugins. + # No platform specific filters yet here. + hasPluginAPI = enableGold; + }; + + meta = with lib; { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + longDescription = '' + The GNU Binutils are a collection of binary tools. The main + ones are `ld' (the GNU linker) and `as' (the GNU assembler). + They also include the BFD (Binary File Descriptor) library, + `gprof', `nm', `strip', etc. + ''; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 lovesegfault ]; + platforms = platforms.unix; + + # INFO: Give binutils a lower priority than gcc-wrapper to prevent a + # collision due to the ld/as wrappers/symlinks in the latter. + priority = 10; + }; +}) diff --git a/pkgs/by-name/bi/binutils/deterministic.patch b/pkgs/by-name/bi/binutils/deterministic.patch new file mode 100644 index 0000000..736e0ac --- /dev/null +++ b/pkgs/by-name/bi/binutils/deterministic.patch @@ -0,0 +1,12 @@ +diff -ur orig/binutils-2.23.1/ld/ldlang.c binutils-2.23.1/ld/ldlang.c +--- orig/ld/ldlang.c ++++ new/ld/ldlang.c +@@ -3095,6 +3095,8 @@ + ldfile_output_machine)) + einfo (_("%P%F:%s: can not set architecture: %E\n"), name); + ++ link_info.output_bfd->flags |= BFD_DETERMINISTIC_OUTPUT; ++ + link_info.hash = bfd_link_hash_table_create (link_info.output_bfd); + if (link_info.hash == NULL) + einfo (_("%P%F: can not create hash table: %E\n")); diff --git a/pkgs/by-name/bi/binutils/gold-powerpc-for-llvm.patch b/pkgs/by-name/bi/binutils/gold-powerpc-for-llvm.patch new file mode 100644 index 0000000..2933013 --- /dev/null +++ b/pkgs/by-name/bi/binutils/gold-powerpc-for-llvm.patch @@ -0,0 +1,107 @@ +https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=d537f77ef3b18a5fbfd598643aaad957652e9608 + +Fix llvm testsuite failure on a single test: + FAIL: LLVM :: tools/gold/PowerPC/mtriple.ll (43659 of 49708) + ld.gold: internal error in add_output_section_to_load, at output.cc:4097 + +From: Alan Modra +Date: Thu, 24 Aug 2023 23:42:18 +0000 (+0930) +Subject: PR30794, PowerPC gold: internal error in add_output_section_to_load +X-Git-Tag: gdb-14-branchpoint~482 +X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=d537f77ef3b18a5fbfd598643aaad957652e9608 + +PR30794, PowerPC gold: internal error in add_output_section_to_load + +Caused by commit 5a97377e5513, specifically this code added to +Target_powerpc::do_relax ++ if (parameters->options().output_is_position_independent()) ++ this->rela_dyn_size_ ++ = this->rela_dyn_section(layout)->current_data_size(); + +The problem here is that if .rela.dyn isn't already created then the +call to rela_dyn_section creates it, and as this comment in +Target_powerpc::do_finalize_sections says: + // Annoyingly, we need to make these sections now whether or + // not we need them. If we delay until do_relax then we + // need to mess with the relaxation machinery checkpointing. +We can't be creating sections in do_relax. + + PR 30794 + * powerpc.cc (Target_powerpc::do_relax): Only set rela_dyn_size_ + for size == 64, and assert that rela_dyn_ already exists. + Tidy code setting plt_thread_safe, which also only needs to be + set when size == 64 for ELFv1. +--- + +diff --git a/gold/powerpc.cc b/gold/powerpc.cc +index e66d9cbb900..a4fecaae55a 100644 +--- a/gold/powerpc.cc ++++ b/gold/powerpc.cc +@@ -3714,12 +3714,7 @@ Target_powerpc::do_relax(int pass, + unsigned int prev_brlt_size = 0; + if (pass == 1) + { +- bool thread_safe +- = this->abiversion() < 2 && parameters->options().plt_thread_safe(); +- if (size == 64 +- && this->abiversion() < 2 +- && !thread_safe +- && !parameters->options().user_set_plt_thread_safe()) ++ if (size == 64 && this->abiversion() < 2) + { + static const char* const thread_starter[] = + { +@@ -3747,29 +3742,37 @@ Target_powerpc::do_relax(int pass, + /* libgo */ + "__go_go", + }; ++ bool thread_safe = parameters->options().plt_thread_safe(); + +- if (parameters->options().shared()) +- thread_safe = true; +- else ++ if (!thread_safe ++ && !parameters->options().user_set_plt_thread_safe()) + { +- for (unsigned int i = 0; +- i < sizeof(thread_starter) / sizeof(thread_starter[0]); +- i++) ++ if (parameters->options().shared()) ++ thread_safe = true; ++ else + { +- Symbol* sym = symtab->lookup(thread_starter[i], NULL); +- thread_safe = (sym != NULL +- && sym->in_reg() +- && sym->in_real_elf()); +- if (thread_safe) +- break; ++ for (unsigned int i = 0; ++ i < sizeof(thread_starter) / sizeof(thread_starter[0]); ++ i++) ++ { ++ Symbol* sym = symtab->lookup(thread_starter[i], NULL); ++ thread_safe = (sym != NULL ++ && sym->in_reg() ++ && sym->in_real_elf()); ++ if (thread_safe) ++ break; ++ } + } + } ++ this->plt_thread_safe_ = thread_safe; + } +- this->plt_thread_safe_ = thread_safe; + +- if (parameters->options().output_is_position_independent()) +- this->rela_dyn_size_ +- = this->rela_dyn_section(layout)->current_data_size(); ++ if (size == 64 ++ && parameters->options().output_is_position_independent()) ++ { ++ gold_assert (this->rela_dyn_); ++ this->rela_dyn_size_ = this->rela_dyn_->current_data_size(); ++ } + + this->stub_group_size_ = parameters->options().stub_group_size(); + bool no_size_errors = true; diff --git a/pkgs/by-name/bi/binutils/libbfd.nix b/pkgs/by-name/bi/binutils/libbfd.nix new file mode 100644 index 0000000..dca62b8 --- /dev/null +++ b/pkgs/by-name/bi/binutils/libbfd.nix @@ -0,0 +1,34 @@ +{ lib, stdenv +, binutils-unwrapped-all-targets +}: + +stdenv.mkDerivation { + pname = "libbfd"; + inherit (binutils-unwrapped-all-targets) version; + + dontUnpack = true; + dontBuild = true; + dontInstall = true; + propagatedBuildInputs = [ + binutils-unwrapped-all-targets.dev + binutils-unwrapped-all-targets.lib + ]; + + passthru = { + inherit (binutils-unwrapped-all-targets) dev hasPluginAPI; + }; + + meta = with lib; { + description = "A library for manipulating containers of machine code"; + longDescription = '' + BFD is a library which provides a single interface to read and write + object files, executables, archive files, and core files in any format. + It is associated with GNU Binutils, and elsewhere often distributed with + it. + ''; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/bi/binutils/libopcodes.nix b/pkgs/by-name/bi/binutils/libopcodes.nix new file mode 100644 index 0000000..06ef999 --- /dev/null +++ b/pkgs/by-name/bi/binutils/libopcodes.nix @@ -0,0 +1,28 @@ +{ lib, stdenv +, binutils-unwrapped-all-targets +}: + +stdenv.mkDerivation { + pname = "libopcodes"; + inherit (binutils-unwrapped-all-targets) version; + + dontUnpack = true; + dontBuild = true; + dontInstall = true; + propagatedBuildInputs = [ + binutils-unwrapped-all-targets.dev + binutils-unwrapped-all-targets.lib + ]; + + # passthru = { + # inherit (binutils-unwrapped-all-targets) dev hasPluginAPI; + # }; + + meta = with lib; { + description = "A library from binutils for manipulating machine code"; + homepage = "https://www.gnu.org/software/binutils/"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ ericson2314 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/bi/binutils/packages.nix b/pkgs/by-name/bi/binutils/packages.nix new file mode 100644 index 0000000..e4ffdcf --- /dev/null +++ b/pkgs/by-name/bi/binutils/packages.nix @@ -0,0 +1,69 @@ +{ lib, noSysDirs, ... }: +res: pkgs: super: + +with pkgs; +{ + # Here we select the default bintools implementations to be used. Note when + # cross compiling these are used not for this stage but the *next* stage. + # That is why we choose using this stage's target platform / next stage's + # host platform. + # + # Because this is the *next* stages choice, it's a bit non-modular to put + # here. In theory, bootstraping is supposed to not be a chain but at tree, + # where each stage supports many "successor" stages, like multiple possible + # futures. We don't have a better alternative, but with this downside in + # mind, please be judicious when using this attribute. E.g. for building + # things in *this* stage you should use probably `stdenv.cc.bintools` (from a + # default or alternate `stdenv`), at build time, and try not to "force" a + # specific bintools at runtime at all. + # + # In other words, try to only use this in wrappers, and only use those + # wrappers from the next stage. + bintools-unwrapped = + let + inherit (stdenv.targetPlatform) linker; + in + if linker == "lld" then llvmPackages.bintools-unwrapped + # else if linker == "cctools" then darwin.binutils-unwrapped + else if linker == "bfd" then binutils-unwrapped + else if linker == "gold" then binutils-unwrapped.override { enableGoldDefault = true; } + else null; + bintoolsNoLibc = wrapBintoolsWith { + bintools = bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + bintools = wrapBintoolsWith { + bintools = bintools-unwrapped; + }; + + bintoolsDualAs = wrapBintoolsWith { + bintools = darwin.binutilsDualAs-unwrapped; + wrapGas = true; + }; + + binutils-unwrapped = callPackage ./. { + autoreconfHook = autoreconfHook269; + # FHS sys dirs presumably only have stuff for the build platform + noSysDirs = (stdenv.targetPlatform != stdenv.hostPlatform) || noSysDirs; + }; + binutils-unwrapped-all-targets = callPackage ./. { + autoreconfHook = if targetPlatform.isiOS then autoreconfHook269 else autoreconfHook; + # FHS sys dirs presumably only have stuff for the build platform + noSysDirs = (stdenv.targetPlatform != stdenv.hostPlatform) || noSysDirs; + withAllTargets = true; + }; + binutils = wrapBintoolsWith { + bintools = binutils-unwrapped; + }; + binutils_nogold = lowPrio (wrapBintoolsWith { + bintools = binutils-unwrapped.override { + enableGold = false; + }; + }); + binutilsNoLibc = wrapBintoolsWith { + bintools = binutils-unwrapped; + libc = preLibcCrossHeaders; + }; + + libbfd = callPackage ./libbfd.nix { }; +} diff --git a/pkgs/by-name/bi/binutils/plugins-no-BINDIR.patch b/pkgs/by-name/bi/binutils/plugins-no-BINDIR.patch new file mode 100644 index 0000000..562aad3 --- /dev/null +++ b/pkgs/by-name/bi/binutils/plugins-no-BINDIR.patch @@ -0,0 +1,25 @@ +Avoid `lib -> out -> lib` reference. Normally `bfd-plugins` does not +need to know binutils' BINDIR at all. It's an absolute path where +libraries are stored. +--- a/bfd/plugin.c ++++ b/bfd/plugin.c +@@ -493,7 +493,7 @@ build_plugin_list (bfd *abfd) + when configuring binutils using --libdir. Search in the proper + path first, then the old one for backwards compatibility. */ + static const char *path[] +- = { LIBDIR "/bfd-plugins", BINDIR "/../lib/bfd-plugins" }; ++ = { LIBDIR "/bfd-plugins", }; + struct stat last_st; + unsigned int i; + +@@ -508,9 +508,7 @@ build_plugin_list (bfd *abfd) + last_st.st_ino = 0; + for (i = 0; i < sizeof (path) / sizeof (path[0]); i++) + { +- char *plugin_dir = make_relative_prefix (plugin_program_name, +- BINDIR, +- path[i]); ++ char *plugin_dir = xstrdup (path[i]); + if (plugin_dir) + { + struct stat st; diff --git a/pkgs/by-name/bi/binutils/ppc-make-machine-less-strict.patch b/pkgs/by-name/bi/binutils/ppc-make-machine-less-strict.patch new file mode 100644 index 0000000..c245241 --- /dev/null +++ b/pkgs/by-name/bi/binutils/ppc-make-machine-less-strict.patch @@ -0,0 +1,51 @@ +From cebc89b9328eab994f6b0314c263f94e7949a553 Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Mon, 21 Feb 2022 10:58:57 +1030 +Subject: [PATCH] binutils 2.38 vs. ppc32 linux kernel + +Commit b25f942e18d6 made .machine more strict. Weaken it again. + + * config/tc-ppc.c (ppc_machine): Treat an early .machine specially, + keeping sticky options to work around gcc bugs. +--- + gas/config/tc-ppc.c | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c +index 054f9c72161..89bc7d3f9b9 100644 +--- a/gas/config/tc-ppc.c ++++ b/gas/config/tc-ppc.c +@@ -5965,7 +5965,30 @@ ppc_machine (int ignore ATTRIBUTE_UNUSED) + options do not count as a new machine, instead they add + to currently selected opcodes. */ + ppc_cpu_t machine_sticky = 0; +- new_cpu = ppc_parse_cpu (ppc_cpu, &machine_sticky, cpu_string); ++ /* Unfortunately, some versions of gcc emit a .machine ++ directive very near the start of the compiler's assembly ++ output file. This is bad because it overrides user -Wa ++ cpu selection. Worse, there are versions of gcc that ++ emit the *wrong* cpu, not even respecting the -mcpu given ++ to gcc. See gcc pr101393. And to compound the problem, ++ as of 20220222 gcc doesn't pass the correct cpu option to ++ gas on the command line. See gcc pr59828. Hack around ++ this by keeping sticky options for an early .machine. */ ++ asection *sec; ++ for (sec = stdoutput->sections; sec != NULL; sec = sec->next) ++ { ++ segment_info_type *info = seg_info (sec); ++ /* Are the frags for this section perturbed from their ++ initial state? Even .align will count here. */ ++ if (info != NULL ++ && (info->frchainP->frch_root != info->frchainP->frch_last ++ || info->frchainP->frch_root->fr_type != rs_fill ++ || info->frchainP->frch_root->fr_fix != 0)) ++ break; ++ } ++ new_cpu = ppc_parse_cpu (ppc_cpu, ++ sec == NULL ? &sticky : &machine_sticky, ++ cpu_string); + if (new_cpu != 0) + ppc_cpu = new_cpu; + else +-- +2.31.1 diff --git a/pkgs/by-name/bi/binutils/support-ios.patch b/pkgs/by-name/bi/binutils/support-ios.patch new file mode 100644 index 0000000..74e56d1 --- /dev/null +++ b/pkgs/by-name/bi/binutils/support-ios.patch @@ -0,0 +1,168 @@ +diff --git a/bfd/config.bfd b/bfd/config.bfd +index f04a993f06..1e24a9d030 100644 +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -238,7 +238,7 @@ case "${targ}" in + + # START OF targmatch.h + #ifdef BFD64 +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + targ_defvec=aarch64_mach_o_vec + targ_selvecs="arm_mach_o_vec mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +@@ -358,7 +358,7 @@ case "${targ}" in + targ_selvecs=arc_elf32_be_vec + ;; + +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + targ_defvec=arm_mach_o_vec + targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +@@ -678,7 +678,7 @@ case "${targ}" in + i[3-7]86-*-aix*) + targ_defvec=i386_coff_vec + ;; +- i[3-7]86-*-darwin* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*) ++ i[3-7]86-*-darwin* | i[3-7]86-*-ios* | i[3-7]86-*-macos10* | i[3-7]86-*-rhapsody*) + targ_defvec=i386_mach_o_vec + targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ64_selvecs=x86_64_mach_o_vec +@@ -762,7 +762,7 @@ case "${targ}" in + targ_defvec=x86_64_elf64_cloudabi_vec + want64=true + ;; +- x86_64-*-darwin*) ++ x86_64-*-darwin* | x86_64-*-ios*) + targ_defvec=x86_64_mach_o_vec + targ_selvecs="i386_mach_o_vec mach_o_le_vec mach_o_be_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ_archs="$targ_archs bfd_powerpc_arch bfd_rs6000_arch" +@@ -1402,7 +1402,7 @@ case "${targ}" in + targ_selvecs="powerpc_elf32_le_vec powerpc_boot_vec" + targ64_selvecs="powerpc_elf64_vec powerpc_elf64_le_vec" + ;; +- powerpc-*-darwin* | powerpc-*-macos10* | powerpc-*-rhapsody*) ++ powerpc-*-darwin* | powerpc-*-ios* | powerpc-*-macos10* | powerpc-*-rhapsody*) + targ_defvec=mach_o_be_vec + targ_selvecs="mach_o_be_vec mach_o_le_vec mach_o_fat_vec pef_vec pef_xlib_vec sym_vec" + targ_archs="$targ_archs bfd_i386_arch" +diff --git a/configure.ac b/configure.ac +index aae94501e4..2cceb4dad4 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -510,7 +510,7 @@ if test x$enable_libgomp = x ; then + ;; + *-*-solaris2* | *-*-hpux11*) + ;; +- *-*-darwin* | *-*-aix*) ++ *-*-darwin* | *-*-ios* | *-*-aix*) + ;; + nvptx*-*-*) + ;; +@@ -700,13 +700,13 @@ esac + + # Disable libffi for some systems. + case "${target}" in +- powerpc-*-darwin*) ++ powerpc-*-darwin* | powerpc-*-ios*) + ;; +- i[[3456789]]86-*-darwin*) ++ i[[3456789]]86-*-darwin* | i[[3456789]]86-*-ios*) + ;; +- x86_64-*-darwin[[912]]*) ++ x86_64-*-darwin[[912]]* | x86_64-*-ios[[912]]*) + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs target-libffi" + ;; + *-*-netware*) +@@ -788,7 +788,7 @@ esac + # Disable the go frontend on systems where it is known to not work. Please keep + # this in sync with contrib/config-list.mk. + case "${target}" in +-*-*-darwin* | *-*-cygwin* | *-*-mingw*) ++*-*-darwin* | *-*-ios* | *-*-cygwin* | *-*-mingw*) + unsupported_languages="$unsupported_languages go" + ;; + esac +@@ -797,7 +797,7 @@ esac + # For testing, you can easily override this with --enable-libgo. + if test x$enable_libgo = x; then + case "${target}" in +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + # PR 46986 + noconfigdirs="$noconfigdirs target-libgo" + ;; +@@ -916,27 +916,27 @@ esac + case "${target}" in + *-*-chorusos) + ;; +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- powerpc-*-darwin*) ++ powerpc-*-darwin* | powerpc-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- i[[3456789]]86-*-darwin*) ++ i[[3456789]]86-*-darwin* | i[[3456789]]86-*-ios*) + noconfigdirs="$noconfigdirs ld gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- x86_64-*-darwin[[912]]*) ++ x86_64-*-darwin[[912]]* | x86_64-*-ios[[912]]*) + noconfigdirs="$noconfigdirs ld gas gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +@@ -1226,7 +1226,7 @@ case "${host}" in + hppa*-*) + host_makefile_frag="config/mh-pa" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + host_makefile_frag="config/mh-darwin" + ;; + powerpc-*-aix*) +@@ -1697,7 +1697,7 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always. + build_lto_plugin=yes + ],[if test x"$default_enable_lto" = x"yes" ; then + case $target in +- *-apple-darwin[[912]]* | *-cygwin* | *-mingw* | *djgpp*) ;; ++ *-apple-darwin[[912]]* | *-apple-ios[[912]]* | *-cygwin* | *-mingw* | *djgpp*) ;; + # On other non-ELF platforms, LTO has yet to be validated. + *) enable_lto=no ;; + esac +@@ -1708,7 +1708,7 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always. + # warn during gcc/ subconfigure; unless you're bootstrapping with + # -flto it won't be needed until after installation anyway. + case $target in +- *-cygwin* | *-mingw* | *-apple-darwin* | *djgpp*) ;; ++ *-cygwin* | *-mingw* | *-apple-darwin* | *-apple-ios* | *djgpp*) ;; + *) if test x"$enable_lto" = x"yes"; then + AC_MSG_ERROR([LTO support is not enabled for this target.]) + fi +@@ -2590,7 +2590,7 @@ rm -f conftest* + # Decide which environment variable is used to find dynamic libraries. + case "${host}" in + *-*-hpux*) RPATH_ENVVAR=SHLIB_PATH ;; +- *-*-darwin*) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; ++ *-*-darwin* | *-*-ios* ) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; + *-*-mingw* | *-*-cygwin ) RPATH_ENVVAR=PATH ;; + *) RPATH_ENVVAR=LD_LIBRARY_PATH ;; + esac diff --git a/pkgs/by-name/bi/binutils/windres-locate-gcc.patch b/pkgs/by-name/bi/binutils/windres-locate-gcc.patch new file mode 100644 index 0000000..721667c --- /dev/null +++ b/pkgs/by-name/bi/binutils/windres-locate-gcc.patch @@ -0,0 +1,19 @@ +diff --git a/binutils/resrc.c b/binutils/resrc.c +index a875c3a4..0411d047 100644 +--- a/binutils/resrc.c ++++ b/binutils/resrc.c +@@ -521,7 +521,13 @@ read_rc_file (const char *filename, const char *preprocessor, + + cpp_pipe = 0; + +- if (dash) ++ /* Nixpkgs specific : look first at the prefixed path ++ ( there should be no gcc in the binutils folder ) */ ++ if (slash && dash) { ++ cpp_pipe = look_for_default(cmd, slash + 1, dash - slash, preprocargs, filename); ++ } ++ ++ if (dash && ! cpp_pipe) + { + /* First, try looking for a prefixed gcc in the windres + directory, with the same prefix as windres */ diff --git a/pkgs/by-name/bi/bison/default.nix b/pkgs/by-name/bi/bison/default.nix new file mode 100644 index 0000000..8f8dd82 --- /dev/null +++ b/pkgs/by-name/bi/bison/default.nix @@ -0,0 +1,58 @@ +{ lib, stdenv, fetchurl, m4, perl, help2man }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "bison"; + version = "3.8.2"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz"; + sha256 = "sha256-BsnhO99+sk1M62tZIFpPZ8LH5yExGWREMP6C+9FKCrs="; + }; + + # gnulib relies on --host= to detect iconv() features on musl(). + # Otherwise tests fail due to incorrect unicode symbol oconversion. + configurePlatforms = [ "build" "host" ]; + + # there's a /bin/sh shebang in bin/yacc which when no strictDeps is patched with the build stdenv shell + # however when cross-compiling it would still be patched with the build stdenv shell which would be wrong + # cannot add bash to buildInputs due to infinite recursion + strictDeps = stdenv.hostPlatform != stdenv.buildPlatform; + + nativeBuildInputs = [ m4 perl ] ++ lib.optional stdenv.isSunOS help2man; + propagatedBuildInputs = [ m4 ]; + + enableParallelBuilding = true; + + # Normal check and install check largely execute the same test suite + doCheck = false; + doInstallCheck = true; + + meta = { + homepage = "https://www.gnu.org/software/bison/"; + description = "Yacc-compatible parser generator"; + license = lib.licenses.gpl3Plus; + + longDescription = '' + Bison is a general-purpose parser generator that converts an + annotated context-free grammar into an LALR(1) or GLR parser for + that grammar. Once you are proficient with Bison, you can use + it to develop a wide range of language parsers, from those used + in simple desk calculators to complex programming languages. + + Bison is upward compatible with Yacc: all properly-written Yacc + grammars ought to work with Bison with no change. Anyone + familiar with Yacc should be able to use Bison with little + trouble. You need to be fluent in C or C++ programming in order + to use Bison. + ''; + + platforms = lib.platforms.unix; + }; + + # passthru = { glrSupport = true; }; +} diff --git a/pkgs/by-name/bl/bluez-alsa/default.nix b/pkgs/by-name/bl/bluez-alsa/default.nix new file mode 100644 index 0000000..911efe4 --- /dev/null +++ b/pkgs/by-name/bl/bluez-alsa/default.nix @@ -0,0 +1,86 @@ +{ lib +, stdenv +, aacSupport ? true +, alsa-lib +, autoreconfHook +, bluez +, dbus +, fdk_aac +, fetchFromGitHub +, gitUpdater +, glib +, libbsd +, ncurses +, pkg-config +, readline +, sbc +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "bluez-alsa"; + version = "4.1.1"; + + src = fetchFromGitHub { + owner = "Arkq"; + repo = "bluez-alsa"; + rev = "v${finalAttrs.version}"; + hash = "sha256-oGaYiSkOhqfjUl+mHTs3gqFcxli3cgkRtT6tbjy3ht0="; + }; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + ]; + + buildInputs = [ + alsa-lib + bluez + glib + sbc + dbus + readline + libbsd + ncurses + ] ++ lib.optionals aacSupport [ + fdk_aac + ]; + + configureFlags = [ + (lib.enableFeature aacSupport "aac") + (lib.enableFeature true "hcitop") + (lib.enableFeature true "rfcomm") + (lib.withFeatureAs true "alsaplugindir" "${placeholder "out"}/lib/alsa-lib") + (lib.withFeatureAs true "dbusconfdir" "${placeholder "out"}/share/dbus-1/system.d") + ]; + + passthru.updateScript = gitUpdater { }; + + meta = { + homepage = "https://github.com/Arkq/bluez-alsa"; + description = "Bluez 5 Bluetooth Audio ALSA Backend"; + longDescription = '' + Bluez-ALSA (BlueALSA) is an ALSA backend for Bluez 5 audio interface. + Bluez-ALSA registers all Bluetooth devices with audio profiles in Bluez + under a virtual ALSA PCM device called `bluealsa` that supports both + playback and capture. + + Some backstory: Bluez 5 removed built-in support for ALSA in favor of a + generic interface for 3rd party appliations. Thereafter, PulseAudio + implemented a backend for that interface and became the only way to get + Bluetooth audio with Bluez 5. Users prefering ALSA stayed on Bluez 4. + However, Bluez 4 eventually became deprecated. + + This package is a rebirth of a direct interface between ALSA and Bluez 5, + that, unlike PulseAudio, provides KISS near-metal-like experience. It is + not possible to run BluezALSA and PulseAudio Bluetooth at the same time + due to limitations in Bluez, but it is possible to run PulseAudio over + BluezALSA if you disable `bluetooth-discover` and `bluez5-discover` + modules in PA and configure it to play/capture sound over `bluealsa` PCM. + ''; + license = with lib.licenses; [ mit ]; + mainProgram = "bluealsa"; + maintainers = with lib.maintainers; [ AndersonTorres oxij ]; + platforms = lib.platforms.linux; + }; +}) +# TODO: aptxSupport diff --git a/pkgs/by-name/bl/bluez-tools/default.nix b/pkgs/by-name/bl/bluez-tools/default.nix new file mode 100644 index 0000000..47d381a --- /dev/null +++ b/pkgs/by-name/bl/bluez-tools/default.nix @@ -0,0 +1,44 @@ +{ lib +, stdenv +, autoreconfHook +, fetchFromGitHub +, glib +, pkg-config +, readline +, unstableGitUpdater +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "bluez-tools"; + version = "unstable-2020-10-25"; + + src = fetchFromGitHub { + owner = "khvzak"; + repo = "bluez-tools"; + rev = "f65321736475429316f07ee94ec0deac8e46ec4a"; + hash = "sha256-GNtuMqMv/87bp3GX9Lh+CK/VKPluNVeWZRRVOD5NY3Y="; + }; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + ]; + + buildInputs = [ + glib + readline + ]; + + strictDeps = true; + + passthru.updateScript = unstableGitUpdater { }; + + meta = { + homepage = "https://github.com/khvzak/bluez-tools"; + description = "A set of tools to manage bluetooth devices for linux"; + license = with lib.licenses; [ gpl2Plus ]; + mainProgram = "bt-agent"; + maintainers = with lib.maintainers; [ AndersonTorres ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/bl/bluez/default.nix b/pkgs/by-name/bl/bluez/default.nix new file mode 100644 index 0000000..f23f333 --- /dev/null +++ b/pkgs/by-name/bl/bluez/default.nix @@ -0,0 +1,167 @@ +{ lib +, stdenv +, alsa-lib +, dbus +, docutils +, ell +, enableExperimental ? false +, fetchurl +, glib +, json_c +, libical +, pkg-config +, python3 +, readline +, systemdMinimal +, udev +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "bluez"; + version = "5.72"; + + src = fetchurl { + url = "mirror://kernel/linux/bluetooth/bluez-${finalAttrs.version}.tar.xz"; + hash = "sha256-SZ1/o0WplsG7ZQ9cZ0nh2SkRH6bs4L4OmGh/7mEkU24="; + }; + + patches = + # Disable one failing test with musl libc, also seen by alpine + # https://github.com/bluez/bluez/issues/726 + lib.optional (stdenv.hostPlatform.isMusl && stdenv.hostPlatform.isx86_64) + (fetchurl { + url = "https://git.alpinelinux.org/aports/plain/main/bluez/disable_aics_unit_testcases.patch?id=8e96f7faf01a45f0ad8449c1cd825db63a8dfd48"; + hash = "sha256-1PJkipqBO3qxxOqRFQKfpWlne1kzTCgtnTFYI1cFQt4="; + }) + ; + + buildInputs = [ + alsa-lib + dbus + ell + glib + json_c + libical + python3 + readline + udev + ]; + + nativeBuildInputs = [ + docutils + pkg-config + python3.pkgs.pygments + python3.pkgs.wrapPython + ]; + + outputs = [ "out" "dev" "test" ]; + + postPatch = '' + substituteInPlace tools/hid2hci.rules \ + --replace /sbin/udevadm ${systemdMinimal}/bin/udevadm \ + --replace "hid2hci " "$out/lib/udev/hid2hci " + '' + + # Disable some tests: + # - test-mesh-crypto depends on the following kernel settings: + # CONFIG_CRYPTO_[USER|USER_API|USER_API_AEAD|USER_API_HASH|AES|CCM|AEAD|CMAC] + '' + if [[ ! -f unit/test-mesh-crypto.c ]]; then + echo "unit/test-mesh-crypto.c no longer exists" + false + fi + echo 'int main() { return 77; }' > unit/test-mesh-crypto.c + ''; + + configureFlags = [ + "--localstatedir=/var" + (lib.enableFeature enableExperimental "experimental") + (lib.enableFeature true "btpclient") + (lib.enableFeature true "cups") + (lib.enableFeature true "external-ell") + (lib.enableFeature true "health") + (lib.enableFeature true "hid2hci") + (lib.enableFeature true "library") + (lib.enableFeature true "logger") + (lib.enableFeature true "mesh") + (lib.enableFeature true "midi") + (lib.enableFeature true "nfc") + (lib.enableFeature true "pie") + (lib.enableFeature true "sixaxis") + # Set "deprecated" to provide ciptool, sdptool, and rfcomm (unmaintained); + # superseded by new D-Bus APIs + (lib.enableFeature true "deprecated") + (lib.withFeatureAs true "dbusconfdir" "${placeholder "out"}/share") + (lib.withFeatureAs true "dbussessionbusdir" "${placeholder "out"}/share/dbus-1/services") + (lib.withFeatureAs true "dbussystembusdir" "${placeholder "out"}/share/dbus-1/system-services") + (lib.withFeatureAs true "systemdsystemunitdir" "${placeholder "out"}/etc/systemd/system") + (lib.withFeatureAs true "systemduserunitdir" "${placeholder "out"}/etc/systemd/user") + (lib.withFeatureAs true "udevdir" "${placeholder "out"}/lib/udev") + ]; + + makeFlags = [ + "rulesdir=${placeholder "out"}/lib/udev/rules.d" + ]; + + # Work around `make install' trying to create /var/lib/bluetooth. + installFlags = [ + "statedir=$(TMPDIR)/var/lib/bluetooth" + ]; + + doCheck = stdenv.hostPlatform.isx86_64; + + postInstall = let + pythonPath = with python3.pkgs; [ + dbus-python + pygobject3 + ]; + in + '' + mkdir -p $test/{bin,test} + cp -a test $test + pushd $test/test + for t in \ + list-devices \ + monitor-bluetooth \ + simple-agent \ + test-adapter \ + test-device \ + test-thermometer \ + ; do + ln -s ../test/$t $test/bin/bluez-$t + done + popd + wrapPythonProgramsIn $test/test "$test/test ${toString pythonPath}" + + # for bluez4 compatibility for NixOS + mkdir $out/sbin + ln -s ../libexec/bluetooth/bluetoothd $out/sbin/bluetoothd + ln -s ../libexec/bluetooth/obexd $out/sbin/obexd + + # Add extra configuration + mkdir $out/etc/bluetooth + ln -s /etc/bluetooth/main.conf $out/etc/bluetooth/main.conf + + # https://github.com/NixOS/nixpkgs/issues/204418 + ln -s /etc/bluetooth/input.conf $out/etc/bluetooth/input.conf + ln -s /etc/bluetooth/network.conf $out/etc/bluetooth/network.conf + + # Add missing tools, ref https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/bluez + for files in $(find tools/ -type f -perm -755); do + filename=$(basename $files) + install -Dm755 tools/$filename $out/bin/$filename + done + install -Dm755 attrib/gatttool $out/bin/gatttool + ''; + + enableParallelBuilding = true; + + meta = { + homepage = "https://www.bluez.org/"; + description = "Official Linux Bluetooth protocol stack"; + changelog = "https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/ChangeLog?h=${finalAttrs.version}"; + license = with lib.licenses; [ bsd2 gpl2Plus lgpl21Plus mit ]; + mainProgram = "btinfo"; + maintainers = with lib.maintainers; [ AndersonTorres ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/bl/bluez/packages.nix b/pkgs/by-name/bl/bluez/packages.nix new file mode 100644 index 0000000..3fa5885 --- /dev/null +++ b/pkgs/by-name/bl/bluez/packages.nix @@ -0,0 +1,12 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + bluez = callPackage ./. { }; + bluez5 = bluez; + bluez5-experimental = bluez-experimental; + bluez-experimental = bluez.override { + enableExperimental = true; + }; +} diff --git a/pkgs/by-name/bo/boehmgc/default.nix b/pkgs/by-name/bo/boehmgc/default.nix new file mode 100644 index 0000000..9711457 --- /dev/null +++ b/pkgs/by-name/bo/boehmgc/default.nix @@ -0,0 +1,85 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook + # doc: https://github.com/ivmai/bdwgc/blob/v8.2.6/doc/README.macros (LARGE_CONFIG) +, enableLargeConfig ? false +, enableMmap ? true +, enableStatic ? false +, nixVersions +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "boehm-gc"; + version = "8.2.6"; + + src = fetchFromGitHub { + owner = "ivmai"; + repo = "bdwgc"; + rev = "v${finalAttrs.version}"; + hash = "sha256-y6hU5qU4qO9VvQvKNH9dvReCrf3+Ih2HHbF6IS1V3WQ="; + }; + + outputs = [ "out" "dev" "doc" ]; + separateDebugInfo = stdenv.isLinux && stdenv.hostPlatform.libc != "musl"; + + nativeBuildInputs = [ + autoreconfHook + ]; + + configureFlags = [ + "--enable-cplusplus" + "--with-libatomic-ops=none" + ] + ++ lib.optional enableStatic "--enable-static" + ++ lib.optional enableMmap "--enable-mmap" + ++ lib.optional enableLargeConfig "--enable-large-config"; + + # This stanza can be dropped when a release fixes this issue: + # https://github.com/ivmai/bdwgc/issues/376 + # The version is checked with == instead of versionAtLeast so we + # don't forget to disable the fix (and if the next release does + # not fix the problem the test failure will be a reminder to + # extend the set of versions requiring the workaround). + makeFlags = lib.optionals + (stdenv.hostPlatform.isPower64 && + finalAttrs.version == "8.2.6") + [ + # do not use /proc primitives to track dirty bits; see: + # https://github.com/ivmai/bdwgc/issues/479#issuecomment-1279687537 + # https://github.com/ivmai/bdwgc/blob/54522af853de28f45195044dadfd795c4e5942aa/include/private/gcconfig.h#L741 + "CFLAGS_EXTRA=-DNO_SOFT_VDB" + ]; + + # `gctest` fails under emulation on aarch64-darwin + doCheck = !(stdenv.isDarwin && stdenv.isx86_64); + + enableParallelBuilding = true; + + passthru.tests = nixVersions; + + meta = { + homepage = "https://hboehm.info/gc/"; + description = "The Boehm-Demers-Weiser conservative garbage collector for C and C++"; + longDescription = '' + The Boehm-Demers-Weiser conservative garbage collector can be used as a + garbage collecting replacement for C malloc or C++ new. It allows you + to allocate memory basically as you normally would, without explicitly + deallocating memory that is no longer useful. The collector + automatically recycles memory when it determines that it can no longer + be otherwise accessed. + + The collector is also used by a number of programming language + implementations that either use C as intermediate code, want to + facilitate easier interoperation with C libraries, or just prefer the + simple collector interface. + + Alternatively, the garbage collector may be used as a leak detector for + C or C++ programs, though that is not its primary goal. + ''; + changelog = "https://github.com/ivmai/bdwgc/blob/v${finalAttrs.version}/ChangeLog"; + license = "https://hboehm.info/gc/license.txt"; # non-copyleft, X11-style license + maintainers = with lib.maintainers; [ ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/by-name/bo/boost-build/default.nix b/pkgs/by-name/bo/boost-build/default.nix new file mode 100644 index 0000000..6b485b8 --- /dev/null +++ b/pkgs/by-name/bo/boost-build/default.nix @@ -0,0 +1,74 @@ +{ lib +, stdenv +, fetchFromGitHub +, bison +# boost derivation to use for the src and version. +# This is used by the boost derivation to build +# a b2 matching their version (by overriding this +# argument). Infinite recursion is not an issue +# since we only look at src and version of boost. +, useBoost ? {} +}: + +let + defaultVersion = "4.4.1"; +in + +stdenv.mkDerivation { + pname = "boost-build"; + version = + if useBoost ? version + then "boost-${useBoost.version}" + else defaultVersion; + + src = useBoost.src or (fetchFromGitHub { + owner = "boostorg"; + repo = "build"; + rev = defaultVersion; + sha256 = "1r4rwlq87ydmsdqrik4ly5iai796qalvw7603mridg2nwcbbnf54"; + }); + + # b2 is in a subdirectory of boost source tarballs + postUnpack = lib.optionalString (useBoost ? src) '' + sourceRoot="$sourceRoot/tools/build" + ''; + + patches = useBoost.boostBuildPatches or []; + + # Upstream defaults to gcc on darwin, but we use clang. + postPatch = '' + substituteInPlace src/build-system.jam \ + --replace "default-toolset = darwin" "default-toolset = clang-darwin" + '' + lib.optionalString (useBoost ? version && lib.versionAtLeast useBoost.version "1.82") '' + patchShebangs --build src/engine/build.sh + ''; + + nativeBuildInputs = [ + bison + ]; + + buildPhase = '' + runHook preBuild + ./bootstrap.sh + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + ./b2 install --prefix="$out" + + # older versions of b2 created this symlink, + # which we want to support building via useBoost. + test -e "$out/bin/bjam" || ln -s b2 "$out/bin/bjam" + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://www.boost.org/build/"; + license = lib.licenses.boost; + platforms = platforms.unix; + maintainers = with maintainers; [ ivan-tkatchev ]; + }; +} diff --git a/pkgs/by-name/bo/boost/1.75.nix b/pkgs/by-name/bo/boost/1.75.nix new file mode 100644 index 0000000..ec77070 --- /dev/null +++ b/pkgs/by-name/bo/boost/1.75.nix @@ -0,0 +1,15 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.75.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_75_0.html + sha256 = "953db31e016db7bb207f11432bef7df100516eeb746843fa0486a222e3fd49cb"; + }; +}) + diff --git a/pkgs/by-name/bo/boost/1.77.nix b/pkgs/by-name/bo/boost/1.77.nix new file mode 100644 index 0000000..3da1a45 --- /dev/null +++ b/pkgs/by-name/bo/boost/1.77.nix @@ -0,0 +1,15 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.77.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_77_0.html + sha256 = "sha256-/J+F/AMOIzFCkIJBr3qEbmBjCqc4jeml+vsfOiaECFQ="; + }; +}) + diff --git a/pkgs/by-name/bo/boost/1.78.nix b/pkgs/by-name/bo/boost/1.78.nix new file mode 100644 index 0000000..2cc818e --- /dev/null +++ b/pkgs/by-name/bo/boost/1.78.nix @@ -0,0 +1,15 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.78.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_78_0.html + sha256 = "8681f175d4bdb26c52222665793eef08490d7758529330f98d3b29dd0735bccc"; + }; +}) + diff --git a/pkgs/by-name/bo/boost/1.79.nix b/pkgs/by-name/bo/boost/1.79.nix new file mode 100644 index 0000000..87975e2 --- /dev/null +++ b/pkgs/by-name/bo/boost/1.79.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.79.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_79_0.html + sha256 = "475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.80.nix b/pkgs/by-name/bo/boost/1.80.nix new file mode 100644 index 0000000..1aab51a --- /dev/null +++ b/pkgs/by-name/bo/boost/1.80.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.80.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_80_0.html + sha256 = "1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.81.nix b/pkgs/by-name/bo/boost/1.81.nix new file mode 100644 index 0000000..2376255 --- /dev/null +++ b/pkgs/by-name/bo/boost/1.81.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.81.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_81_0.html + sha256 = "71feeed900fbccca04a3b4f2f84a7c217186f28a940ed8b7ed4725986baf99fa"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.82.nix b/pkgs/by-name/bo/boost/1.82.nix new file mode 100644 index 0000000..193d07e --- /dev/null +++ b/pkgs/by-name/bo/boost/1.82.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.82.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_82_0.html + sha256 = "a6e1ab9b0860e6a2881dd7b21fe9f737a095e5f33a3a874afc6a345228597ee6"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.83.nix b/pkgs/by-name/bo/boost/1.83.nix new file mode 100644 index 0000000..df5c5a5 --- /dev/null +++ b/pkgs/by-name/bo/boost/1.83.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.83.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_83_0.html + sha256 = "6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.84.nix b/pkgs/by-name/bo/boost/1.84.nix new file mode 100644 index 0000000..a55f55a --- /dev/null +++ b/pkgs/by-name/bo/boost/1.84.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.84.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_84_0.html + sha256 = "cc4b893acf645c9d4b698e9a0f08ca8846aa5d6c68275c14c3e7949c24109454"; + }; +}) diff --git a/pkgs/by-name/bo/boost/1.85.nix b/pkgs/by-name/bo/boost/1.85.nix new file mode 100644 index 0000000..2a3252d --- /dev/null +++ b/pkgs/by-name/bo/boost/1.85.nix @@ -0,0 +1,14 @@ +{ callPackage, fetchurl, fetchpatch, ... } @ args: + +callPackage ./generic.nix (args // rec { + version = "1.85.0"; + + src = fetchurl { + urls = [ + "mirror://sourceforge/boost/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + "https://boostorg.jfrog.io/artifactory/main/release/${version}/source/boost_${builtins.replaceStrings ["."] ["_"] version}.tar.bz2" + ]; + # SHA256 from http://www.boost.org/users/history/version_1_85_0.html + sha256 = "7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617"; + }; +}) diff --git a/pkgs/by-name/bo/boost/cmake-paths-173.patch b/pkgs/by-name/bo/boost/cmake-paths-173.patch new file mode 100644 index 0000000..7b88da0 --- /dev/null +++ b/pkgs/by-name/bo/boost/cmake-paths-173.patch @@ -0,0 +1,22 @@ +diff --git a/tools/boost_install/boost-install.jam b/tools/boost_install/boost-install.jam +index 4238f921e..8fc1ea269 100644 +--- a/tools/boost_install/boost-install.jam ++++ b/tools/boost_install/boost-install.jam +@@ -649,7 +649,7 @@ rule generate-cmake-config- ( target : sources * : properties * ) + "" + "# Compute the include and library directories relative to this file." + "" +- "get_filename_component(_BOOST_CMAKEDIR \"${CMAKE_CURRENT_LIST_DIR}/../\" REALPATH)" ++ "get_filename_component(_BOOST_REAL_CMAKEDIR \"${CMAKE_CURRENT_LIST_DIR}/../\" REALPATH)" + : true ; + + if [ path.is-rooted $(cmakedir) ] +@@ -668,6 +668,8 @@ rule generate-cmake-config- ( target : sources * : properties * ) + " unset(_BOOST_CMAKEDIR_ORIGINAL)" + "endif()" + "" ++ "# Assume that the installer actually did know where the libs were to be installed" ++ "get_filename_component(_BOOST_CMAKEDIR \"$(cmakedir-native)\" REALPATH)" + : true ; + } + diff --git a/pkgs/by-name/bo/boost/darwin-no-system-python.patch b/pkgs/by-name/bo/boost/darwin-no-system-python.patch new file mode 100644 index 0000000..73e0910 --- /dev/null +++ b/pkgs/by-name/bo/boost/darwin-no-system-python.patch @@ -0,0 +1,45 @@ +diff --git a/tools/build/src/tools/python.jam b/tools/build/src/tools/python.jam +index 273b28a..2d2031e 100644 +--- a/tools/build/src/tools/python.jam ++++ b/tools/build/src/tools/python.jam +@@ -428,13 +428,7 @@ local rule windows-installed-pythons ( version ? ) + + local rule darwin-installed-pythons ( version ? ) + { +- version ?= $(.version-countdown) ; +- +- local prefix +- = [ GLOB /System/Library/Frameworks /Library/Frameworks +- : Python.framework ] ; +- +- return $(prefix)/Versions/$(version)/bin/python ; ++ return ; + } + + +@@ -890,25 +884,6 @@ local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? : + + # See if we can find a framework directory on darwin. + local framework-directory ; +- if $(target-os) = darwin +- { +- # Search upward for the framework directory. +- local framework-directory = $(libraries[-1]) ; +- while $(framework-directory:D=) && $(framework-directory:D=) != Python.framework +- { +- framework-directory = $(framework-directory:D) ; +- } +- +- if $(framework-directory:D=) = Python.framework +- { +- debug-message framework directory is \"$(framework-directory)\" ; +- } +- else +- { +- debug-message "no framework directory found; using library path" ; +- framework-directory = ; +- } +- } + + local dll-path = $(libraries) ; + diff --git a/pkgs/by-name/bo/boost/default.nix b/pkgs/by-name/bo/boost/default.nix new file mode 100644 index 0000000..1a2ae9d --- /dev/null +++ b/pkgs/by-name/bo/boost/default.nix @@ -0,0 +1,29 @@ +{ lib +, callPackage +, boost-build +, fetchurl +}: + +let + makeBoost = file: + lib.fix (self: + callPackage file { + boost-build = boost-build.override { + # useBoost allows us passing in src and version from + # the derivation we are building to get a matching b2 version. + useBoost = self; + }; + } + ); +in { + boost175 = makeBoost ./1.75.nix; + boost177 = makeBoost ./1.77.nix; + boost178 = makeBoost ./1.78.nix; + boost179 = makeBoost ./1.79.nix; + boost180 = makeBoost ./1.80.nix; + boost181 = makeBoost ./1.81.nix; + boost182 = makeBoost ./1.82.nix; + boost183 = makeBoost ./1.83.nix; + boost184 = makeBoost ./1.84.nix; + boost185 = makeBoost ./1.85.nix; +} diff --git a/pkgs/by-name/bo/boost/generic.nix b/pkgs/by-name/bo/boost/generic.nix new file mode 100644 index 0000000..cdcdb20 --- /dev/null +++ b/pkgs/by-name/bo/boost/generic.nix @@ -0,0 +1,267 @@ +{ lib, stdenv, icu, expat, zlib, bzip2, zstd, xz, python ? null, fixDarwinDylibNames, libiconv, libxcrypt +, boost-build +, fetchpatch +, which +, toolset ? /**/ if stdenv.cc.isClang then "clang" + else if stdenv.cc.isGNU then "gcc" + else null +, enableRelease ? true +, enableDebug ? false +, enableSingleThreaded ? false +, enableMultiThreaded ? true +, enableShared ? !(with stdenv.hostPlatform; isStatic || isMinGW) # problems for now +, enableStatic ? !enableShared +, enablePython ? false +, enableNumpy ? false +, enableIcu ? stdenv.hostPlatform == stdenv.buildPlatform +, taggedLayout ? ((enableRelease && enableDebug) || (enableSingleThreaded && enableMultiThreaded) || (enableShared && enableStatic)) +, patches ? [] +, boostBuildPatches ? [] +, useMpi ? false +, mpi +, extraB2Args ? [] + +# Attributes inherit from specific versions +, version, src +, ... +}: + +# We must build at least one type of libraries +assert enableShared || enableStatic; + +assert enableNumpy -> enablePython; + +let + + variant = lib.concatStringsSep "," + (lib.optional enableRelease "release" ++ + lib.optional enableDebug "debug"); + + threading = lib.concatStringsSep "," + (lib.optional enableSingleThreaded "single" ++ + lib.optional enableMultiThreaded "multi"); + + link = lib.concatStringsSep "," + (lib.optional enableShared "shared" ++ + lib.optional enableStatic "static"); + + runtime-link = if enableShared then "shared" else "static"; + + # To avoid library name collisions + layout = if taggedLayout then "tagged" else "system"; + + needUserConfig = stdenv.hostPlatform != stdenv.buildPlatform || useMpi || (stdenv.isDarwin && enableShared); + + b2Args = lib.concatStringsSep " " ([ + "--includedir=$dev/include" + "--libdir=$out/lib" + "-j$NIX_BUILD_CORES" + "--layout=${layout}" + "variant=${variant}" + "threading=${threading}" + "link=${link}" + "-sEXPAT_INCLUDE=${expat.dev}/include" + "-sEXPAT_LIBPATH=${expat.out}/lib" + + # TODO: make this unconditional + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform || + # required on mips; see 61d9f201baeef4c4bb91ad8a8f5f89b747e0dfe4 + (stdenv.hostPlatform.isMips && lib.versionAtLeast version "1.79")) [ + "address-model=${toString stdenv.hostPlatform.parsed.cpu.bits}" + "architecture=${if stdenv.hostPlatform.isMips64 + then if lib.versionOlder version "1.78" then "mips1" else "mips" + else if stdenv.hostPlatform.parsed.cpu.name == "s390x" then "s390x" + else toString stdenv.hostPlatform.parsed.cpu.family}" + # env in host triplet for Mach-O is "macho", but boost binary format for Mach-O is "mach-o" + "binary-format=${if stdenv.hostPlatform.isMacho then "mach-o" + else toString stdenv.hostPlatform.parsed.kernel.execFormat.name}" + "target-os=${toString stdenv.hostPlatform.parsed.kernel.name}" + + # adapted from table in boost manual + # https://www.boost.org/doc/libs/1_66_0/libs/context/doc/html/context/architectures.html + "abi=${if stdenv.hostPlatform.parsed.cpu.family == "arm" then "aapcs" + else if stdenv.hostPlatform.isWindows then "ms" + else if stdenv.hostPlatform.isMips32 then "o32" + else if stdenv.hostPlatform.isMips64n64 then "n64" + else "sysv"}" + ] ++ lib.optional (link != "static") "runtime-link=${runtime-link}" + ++ lib.optional (variant == "release") "debug-symbols=off" + ++ lib.optional (toolset != null) "toolset=${toolset}" + ++ lib.optional (!enablePython) "--without-python" + ++ lib.optional needUserConfig "--user-config=user-config.jam" + ++ lib.optional (stdenv.buildPlatform.isDarwin && stdenv.hostPlatform.isLinux) "pch=off" + ++ lib.optionals stdenv.hostPlatform.isMinGW [ + "threadapi=win32" + ] ++ extraB2Args + ); + +in + +stdenv.mkDerivation { + pname = "boost"; + + inherit src version; + + patchFlags = []; + + patches = patches + ++ lib.optional stdenv.isDarwin ./darwin-no-system-python.patch + ++ [ ./cmake-paths-173.patch ] + ++ lib.optional (version == "1.77.0") (fetchpatch { + url = "https://github.com/boostorg/math/commit/7d482f6ebc356e6ec455ccb5f51a23971bf6ce5b.patch"; + relative = "include"; + sha256 = "sha256-KlmIbixcds6GyKYt1fx5BxDIrU7msrgDdYo9Va/KJR4="; + }) + # Fixes ABI detection + ++ lib.optional (version == "1.83.0") (fetchpatch { + url = "https://github.com/boostorg/context/commit/6fa6d5c50d120e69b2d8a1c0d2256ee933e94b3b.patch"; + stripLen = 1; + extraPrefix = "libs/context/"; + sha256 = "sha256-bCfLL7bD1Rn4Ie/P3X+nIcgTkbXdCX6FW7B9lHsmVW8="; + }) + # This fixes another issue regarding ill-formed constant expressions, which is a default error + # in clang 16 and will be a hard error in clang 17. + ++ lib.optional (lib.versionOlder version "1.80") (fetchpatch { + url = "https://github.com/boostorg/log/commit/77f1e20bd69c2e7a9e25e6a9818ae6105f7d070c.patch"; + relative = "include"; + hash = "sha256-6qOiGJASm33XzwoxVZfKJd7sTlQ5yd+MMFQzegXm5RI="; + }) + ++ lib.optionals (lib.versionOlder version "1.81") [ + # libc++ 15 dropped support for `std::unary_function` and `std::binary_function` in C++17+. + # C++17 is the default for clang 16, but clang 15 is also affected in that language mode. + # This patch is for Boost 1.80, but it also applies to earlier versions. + (fetchpatch { + url = "https://www.boost.org/patches/1_80_0/0005-config-libcpp15.patch"; + hash = "sha256-ULFMzKphv70unvPZ3o4vSP/01/xbSM9a2TlIV67eXDQ="; + }) + # This fixes another ill-formed contant expressions issue flagged by clang 16. + (fetchpatch { + url = "https://github.com/boostorg/numeric_conversion/commit/50a1eae942effb0a9b90724323ef8f2a67e7984a.patch"; + relative = "include"; + hash = "sha256-dq4SVgxkPJSC7Fvr59VGnXkM4Lb09kYDaBksCHo9C0s="; + }) + # This fixes an issue in Python 3.11 about Py_TPFLAGS_HAVE_GC + (fetchpatch { + name = "python311-compatibility.patch"; + url = "https://github.com/boostorg/python/commit/a218babc8daee904a83f550fb66e5cb3f1cb3013.patch"; + hash = "sha256-IHxLtJBx0xSy7QEr8FbCPofsjcPuSYzgtPwDlx1JM+4="; + stripLen = 1; + extraPrefix = "libs/python/"; + }) + ]; + + meta = with lib; { + homepage = "http://boost.org/"; + description = "Collection of C++ libraries"; + license = licenses.boost; + platforms = platforms.unix ++ platforms.windows; + # boost-context lacks support for the N32 ABI on mips64. The build + # will succeed, but packages depending on boost-context will fail with + # a very cryptic error message. + badPlatforms = [ lib.systems.inspect.patterns.isMips64n32 ]; + maintainers = with maintainers; [ hjones2199 ]; + }; + + # passthru = { + # inherit boostBuildPatches; + # }; + + preConfigure = lib.optionalString useMpi '' + cat << EOF >> user-config.jam + using mpi : ${lib.getDev mpi}/bin/mpiCC ; + EOF + '' + # On darwin we need to add the `$out/lib` to the libraries' rpath explicitly, + # otherwise the dynamic linker is unable to resolve the reference to @rpath + # when the boost libraries want to load each other at runtime. + + lib.optionalString (stdenv.isDarwin && enableShared) '' + cat << EOF >> user-config.jam + using clang-darwin : : ${stdenv.cc.targetPrefix}c++ + : "-rpath $out/lib/" + ; + EOF + '' + # b2 has trouble finding the correct compiler and tools for cross compilation + # since it apparently ignores $CC, $AR etc. Thus we need to set everything + # in user-config.jam. To keep things simple we just set everything in an + # uniform way for clang and gcc (which works thanks to our cc-wrapper). + # We pass toolset later which will make b2 invoke everything in the right + # way -- the other toolset in user-config.jam will be ignored. + + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + cat << EOF >> user-config.jam + using gcc : cross : ${stdenv.cc.targetPrefix}c++ + : $AR + $RANLIB + ; + + using clang : cross : ${stdenv.cc.targetPrefix}c++ + : $AR + $RANLIB + ; + EOF + '' + # b2 needs to be explicitly told how to find Python when cross-compiling + + lib.optionalString enablePython '' + cat << EOF >> user-config.jam + using python : : ${python.interpreter} + : ${python}/include/python${python.pythonVersion} + : ${python}/lib + ; + EOF + ''; + + NIX_CFLAGS_LINK = lib.optionalString stdenv.isDarwin + "-headerpad_max_install_names"; + + enableParallelBuilding = true; + + nativeBuildInputs = [ which boost-build ] + ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; + buildInputs = [ expat zlib bzip2 libiconv ] + ++ lib.optional (lib.versionAtLeast version "1.69") zstd + ++ [ xz ] + ++ lib.optional enableIcu icu + ++ lib.optionals enablePython [ libxcrypt python ] + ++ lib.optional enableNumpy python.pkgs.numpy; + + configureScript = "./bootstrap.sh"; + configurePlatforms = []; + dontDisableStatic = true; + dontAddStaticConfigureFlags = true; + configureFlags = [ + "--includedir=$(dev)/include" + "--libdir=$(out)/lib" + "--with-bjam=b2" # prevent bootstrapping b2 in configurePhase + ] ++ lib.optional (toolset != null) "--with-toolset=${toolset}" + ++ [ (if enableIcu then "--with-icu=${icu.dev}" else "--without-icu") ]; + + buildPhase = '' + runHook preBuild + b2 ${b2Args} + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + # boostbook is needed by some applications + mkdir -p $dev/share/boostbook + cp -a tools/boostbook/{xsl,dtd} $dev/share/boostbook/ + + # Let boost install everything else + b2 ${b2Args} install + + runHook postInstall + ''; + + postFixup = '' + # Make boost header paths relative so that they are not runtime dependencies + cd "$dev" && find include \( -name '*.hpp' -or -name '*.h' -or -name '*.ipp' \) \ + -exec sed '1s/^\xef\xbb\xbf//;1i#line 1 "{}"' -i '{}' \; + '' + lib.optionalString stdenv.hostPlatform.isMinGW '' + $RANLIB "$out/lib/"*.a + ''; + + outputs = [ "out" "dev" ]; + setOutputFlags = false; +} diff --git a/pkgs/by-name/bo/boost/packages.nix b/pkgs/by-name/bo/boost/packages.nix new file mode 100644 index 0000000..4a1b526 --- /dev/null +++ b/pkgs/by-name/bo/boost/packages.nix @@ -0,0 +1,20 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit (callPackage ./. { inherit (buildPackages) boost-build; }) + boost175 + boost177 + boost178 + boost179 + boost180 + boost181 + boost182 + boost183 + boost184 + boost185 + ; + + boost = boost181; +} diff --git a/pkgs/by-name/bp/bpftools/default.nix b/pkgs/by-name/bp/bpftools/default.nix new file mode 100644 index 0000000..9ec4778 --- /dev/null +++ b/pkgs/by-name/bp/bpftools/default.nix @@ -0,0 +1,52 @@ +{ lib, stdenv, linuxHeaders +, libopcodes, libopcodes_2_38 +, libbfd, libbfd_2_38 +, elfutils, readline +, zlib +, python3, bison, flex +}: + +stdenv.mkDerivation rec { + pname = "bpftools"; + + inherit (linuxHeaders) version src; + + separateDebugInfo = true; + + patches = [ + # fix unknown type name '__vector128' on ppc64le + ./include-asm-types-for-ppc64le.patch + ]; + + nativeBuildInputs = [ python3 bison flex ]; + buildInputs = (if (lib.versionAtLeast version "5.20") + then [ libopcodes libbfd ] + else [ libopcodes_2_38 libbfd_2_38 ]) + ++ [ elfutils zlib readline ]; + + preConfigure = '' + patchShebangs scripts/bpf_doc.py + + cd tools/bpf + substituteInPlace ./bpftool/Makefile \ + --replace '/usr/local' "$out" \ + --replace '/usr' "$out" \ + --replace '/sbin' '/bin' + ''; + + buildFlags = [ "bpftool" "bpf_asm" "bpf_dbg" ]; + + installPhase = '' + make -C bpftool install + install -Dm755 -t $out/bin bpf_asm + install -Dm755 -t $out/bin bpf_dbg + ''; + + meta = with lib; { + homepage = "https://github.com/libbpf/bpftool"; + description = "Debugging/program analysis tools for the eBPF subsystem"; + license = [ licenses.gpl2 licenses.bsd2 ]; + platforms = platforms.linux; + maintainers = with maintainers; [ thoughtpolice ]; + }; +} diff --git a/pkgs/by-name/bp/bpftools/include-asm-types-for-ppc64le.patch b/pkgs/by-name/bp/bpftools/include-asm-types-for-ppc64le.patch new file mode 100644 index 0000000..47c8f80 --- /dev/null +++ b/pkgs/by-name/bp/bpftools/include-asm-types-for-ppc64le.patch @@ -0,0 +1,13 @@ +diff --git a/tools/include/uapi/linux/types.h b/tools/include/uapi/linux/types.h +index 91fa51a9c31d..bfbd9b47277f 100644 +--- a/tools/include/uapi/linux/types.h ++++ b/tools/include/uapi/linux/types.h +@@ -2,7 +2,7 @@ + #ifndef _UAPI_LINUX_TYPES_H + #define _UAPI_LINUX_TYPES_H + +-#include ++#include + + /* copied from linux:include/uapi/linux/types.h */ + #define __bitwise diff --git a/pkgs/by-name/br/brotli/default.nix b/pkgs/by-name/br/brotli/default.nix new file mode 100644 index 0000000..60429f4 --- /dev/null +++ b/pkgs/by-name/br/brotli/default.nix @@ -0,0 +1,78 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, cmake +, staticOnly ? stdenv.hostPlatform.isStatic +, testers +}: + +# ?TODO: there's also python lib in there + +stdenv.mkDerivation (finalAttrs: { + pname = "brotli"; + version = "1.1.0"; + + src = fetchFromGitHub { + owner = "google"; + repo = "brotli"; + rev = "v${finalAttrs.version}"; + hash = "sha256-MvceRcle2dSkkucC2PlsCizsIf8iv95d8Xjqew266wc="; + }; + + patches = [ + # revert runpath change, breaks curl on darwin: + # https://github.com/NixOS/nixpkgs/pull/254532#issuecomment-1722337476 + (fetchpatch { + name = "revert-runpath.patch"; + url = "https://github.com/google/brotli/commit/f842c1bcf9264431cd3b15429a72b7dafbe80509.patch"; + hash = "sha256-W3LY3EjoHP74YsKOOcYQrzo+f0HbooOvEbnOibtN6TM="; + revert = true; + }) + ]; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = lib.optional staticOnly "-DBUILD_SHARED_LIBS=OFF"; + + outputs = [ "out" "dev" "lib" ]; + + doCheck = true; + + checkTarget = "test"; + + # Don't bother with "man" output for now, + # it currently only makes the manpages hard to use. + postInstall = '' + mkdir -p $out/share/man/man{1,3} + cp ../docs/*.1 $out/share/man/man1/ + cp ../docs/*.3 $out/share/man/man3/ + ''; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "https://github.com/google/brotli"; + description = "A generic-purpose lossless compression algorithm and tool"; + longDescription = + '' Brotli is a generic-purpose lossless compression algorithm that + compresses data using a combination of a modern variant of the LZ77 + algorithm, Huffman coding and 2nd order context modeling, with a + compression ratio comparable to the best currently available + general-purpose compression methods. It is similar in speed with + deflate but offers more dense compression. + + The specification of the Brotli Compressed Data Format is defined + in the following internet draft: + http://www.ietf.org/id/draft-alakuijala-brotli + ''; + license = licenses.mit; + maintainers = with maintainers; [ freezeboy ]; + pkgConfigModules = [ + "libbrotlidec" + "libbrotlienc" + ]; + platforms = platforms.all; + mainProgram = "brotli"; + }; +}) diff --git a/pkgs/by-name/bu/busybox/busybox-in-store.patch b/pkgs/by-name/bu/busybox/busybox-in-store.patch new file mode 100644 index 0000000..2d356b6 --- /dev/null +++ b/pkgs/by-name/bu/busybox/busybox-in-store.patch @@ -0,0 +1,23 @@ +Allow BusyBox to be invoked as "-busybox". This is +necessary when it's run from the Nix store as -busybox during +stdenv bootstrap. +--- a/libbb/appletlib.c ++++ b/libbb/appletlib.c +@@ -947,7 +947,7 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar + static NORETURN void run_applet_and_exit(const char *name, char **argv) + { + # if ENABLE_BUSYBOX +- if (is_prefixed_with(name, "busybox")) ++ if (strstr(name, "busybox") != 0) + exit(busybox_main(/*unused:*/ 0, argv)); + # endif + # if NUM_APPLETS > 0 +@@ -1045,7 +1045,7 @@ int main(int argc UNUSED_PARAM, char **argv) + + lbb_prepare("busybox" IF_FEATURE_INDIVIDUAL(, argv)); + # if !ENABLE_BUSYBOX +- if (argv[1] && is_prefixed_with(bb_basename(argv[0]), "busybox")) ++ if (argv[1] && strstr(bb_basename(argv[0]), "busybox") != 0) + argv++; + # endif + applet_name = argv[0]; diff --git a/pkgs/by-name/bu/busybox/clang-cross.patch b/pkgs/by-name/bu/busybox/clang-cross.patch new file mode 100644 index 0000000..b2d696b --- /dev/null +++ b/pkgs/by-name/bu/busybox/clang-cross.patch @@ -0,0 +1,37 @@ +diff --git a/Makefile b/Makefile +index 6fedcffba..3385836c4 100644 +--- a/Makefile ++++ b/Makefile +@@ -271,8 +271,8 @@ export quiet Q KBUILD_VERBOSE + # Look for make include files relative to root of kernel src + MAKEFLAGS += --include-dir=$(srctree) + +-HOSTCC = gcc +-HOSTCXX = g++ ++HOSTCC = cc ++HOSTCXX = c++ + HOSTCFLAGS := + HOSTCXXFLAGS := + # We need some generic definitions +@@ -289,7 +289,7 @@ MAKEFLAGS += -rR + # Make variables (CC, etc...) + + AS = $(CROSS_COMPILE)as +-CC = $(CROSS_COMPILE)gcc ++CC = $(CROSS_COMPILE)cc + LD = $(CC) -nostdlib + CPP = $(CC) -E + AR = $(CROSS_COMPILE)ar +diff --git a/scripts/Makefile.IMA b/scripts/Makefile.IMA +index f155108d7..185257064 100644 +--- a/scripts/Makefile.IMA ++++ b/scripts/Makefile.IMA +@@ -39,7 +39,7 @@ ifndef HOSTCC + HOSTCC = cc + endif + AS = $(CROSS_COMPILE)as +-CC = $(CROSS_COMPILE)gcc ++CC = $(CROSS_COMPILE)cc + LD = $(CC) -nostdlib + CPP = $(CC) -E + AR = $(CROSS_COMPILE)ar diff --git a/pkgs/by-name/bu/busybox/default.nix b/pkgs/by-name/bu/busybox/default.nix new file mode 100644 index 0000000..33fa766 --- /dev/null +++ b/pkgs/by-name/bu/busybox/default.nix @@ -0,0 +1,172 @@ +{ stdenv, lib, buildPackages, fetchurl, fetchFromGitLab +, enableStatic ? stdenv.hostPlatform.isStatic +, enableMinimal ? false +, enableAppletSymlinks ? true +# Allow forcing musl without switching stdenv itself, e.g. for our bootstrapping: +# nix build -f pkgs/top-level/release.nix stdenvBootstrapTools.x86_64-linux.dist +, useMusl ? stdenv.hostPlatform.libc == "musl", musl +, extraConfig ? "" +}: + +assert stdenv.hostPlatform.libc == "musl" -> useMusl; + +let + configParser = '' + function parseconfig { + while read LINE; do + NAME=`echo "$LINE" | cut -d \ -f 1` + OPTION=`echo "$LINE" | cut -d \ -f 2` + + if ! [[ "$NAME" =~ ^CONFIG_ ]]; then continue; fi + + echo "parseconfig: removing $NAME" + sed -i /$NAME'\(=\| \)'/d .config + + echo "parseconfig: setting $NAME=$OPTION" + echo "$NAME=$OPTION" >> .config + done + } + ''; + + libcConfig = lib.optionalString useMusl '' + CONFIG_FEATURE_UTMP n + CONFIG_FEATURE_WTMP n + ''; + + # The debian version lags behind the upstream version and also contains + # a debian-specific suffix. We only fetch the debian repository to get the + # default.script + debianVersion = "1.30.1-6"; + debianSource = fetchFromGitLab { + domain = "salsa.debian.org"; + owner = "installer-team"; + repo = "busybox"; + rev = "debian/1%${debianVersion}"; + sha256 = "sha256-6r0RXtmqGXtJbvLSD1Ma1xpqR8oXL2bBKaUE/cSENL8="; + }; + debianDispatcherScript = "${debianSource}/debian/tree/udhcpc/etc/udhcpc/default.script"; + outDispatchPath = "$out/default.script"; +in + +stdenv.mkDerivation rec { + pname = "busybox"; + version = "1.36.1"; + + # Note to whoever is updating busybox: please verify that: + # nix-build pkgs/stdenv/linux/make-bootstrap-tools.nix -A test + # still builds after the update. + src = fetchurl { + url = "https://busybox.net/downloads/${pname}-${version}.tar.bz2"; + sha256 = "sha256-uMwkyVdNgJ5yecO+NJeVxdXOtv3xnKcJ+AzeUOR94xQ="; + }; + + hardeningDisable = [ "format" "pie" ] + ++ lib.optionals enableStatic [ "fortify" ]; + + patches = [ + ./busybox-in-store.patch + (fetchurl { + name = "CVE-2022-28391.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/busybox/0001-libbb-sockaddr2str-ensure-only-printable-characters-.patch?id=ed92963eb55bbc8d938097b9ccb3e221a94653f4"; + sha256 = "sha256-yviw1GV+t9tbHbY7YNxEqPi7xEreiXVqbeRyf8c6Awo="; + }) + (fetchurl { + name = "CVE-2022-28391.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/busybox/0002-nslookup-sanitize-all-printed-strings-with-printable.patch?id=ed92963eb55bbc8d938097b9ccb3e221a94653f4"; + sha256 = "sha256-vl1wPbsHtXY9naajjnTicQ7Uj3N+EQ8pRNnrdsiow+w="; + }) + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) ./clang-cross.patch; + + separateDebugInfo = true; + + postPatch = "patchShebangs ."; + + configurePhase = '' + export KCONFIG_NOTIMESTAMP=1 + make ${if enableMinimal then "allnoconfig" else "defconfig"} + + ${configParser} + + cat << EOF | parseconfig + + CONFIG_PREFIX "$out" + CONFIG_INSTALL_NO_USR y + + CONFIG_LFS y + + # More features for modprobe. + ${lib.optionalString (!enableMinimal) '' + CONFIG_FEATURE_MODPROBE_BLACKLIST y + CONFIG_FEATURE_MODUTILS_ALIAS y + CONFIG_FEATURE_MODUTILS_SYMBOLS y + CONFIG_MODPROBE_SMALL n + ''} + + ${lib.optionalString enableStatic '' + CONFIG_STATIC y + ''} + + ${lib.optionalString (!enableAppletSymlinks) '' + CONFIG_INSTALL_APPLET_DONT y + CONFIG_INSTALL_APPLET_SYMLINKS n + ''} + + # Use the external mount.cifs program. + CONFIG_FEATURE_MOUNT_CIFS n + CONFIG_FEATURE_MOUNT_HELPERS y + + # Set paths for console fonts. + CONFIG_DEFAULT_SETFONT_DIR "/etc/kbd" + + # Bump from 4KB, much faster I/O + CONFIG_FEATURE_COPYBUF_KB 64 + + # Set the path for the udhcpc script + CONFIG_UDHCPC_DEFAULT_SCRIPT "${outDispatchPath}" + + ${extraConfig} + CONFIG_CROSS_COMPILER_PREFIX "${stdenv.cc.targetPrefix}" + ${libcConfig} + EOF + + make oldconfig + + runHook postConfigure + ''; + + postConfigure = lib.optionalString (useMusl && stdenv.hostPlatform.libc != "musl") '' + makeFlagsArray+=("CC=${stdenv.cc.targetPrefix}cc -isystem ${musl.dev}/include -B${musl}/lib -L${musl}/lib") + ''; + + makeFlags = [ "SKIP_STRIP=y" ]; + + postInstall = '' + sed -e ' + 1 a busybox() { '$out'/bin/busybox "$@"; }\ + logger() { '$out'/bin/logger "$@"; }\ + ' ${debianDispatcherScript} > ${outDispatchPath} + chmod 555 ${outDispatchPath} + HOST_PATH=$out/bin patchShebangs --host ${outDispatchPath} + ''; + + strictDeps = true; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + buildInputs = lib.optionals (enableStatic && !useMusl && stdenv.cc.libc ? static) [ stdenv.cc.libc stdenv.cc.libc.static ]; + + enableParallelBuilding = true; + + doCheck = false; # tries to access the net + + passthru.shellPath = "/bin/ash"; + + meta = with lib; { + description = "Tiny versions of common UNIX utilities in a single small executable"; + homepage = "https://busybox.net/"; + license = licenses.gpl2Only; + maintainers = with maintainers; [ TethysSvensson qyliss ]; + platforms = platforms.linux; + priority = 15; # below systemd (halt, init, poweroff, reboot) and coreutils + }; +} diff --git a/pkgs/by-name/bu/busybox/packages.nix b/pkgs/by-name/bu/busybox/packages.nix new file mode 100644 index 0000000..03b8dd5 --- /dev/null +++ b/pkgs/by-name/bu/busybox/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + busybox = callPackage ./. { }; + busybox-sandbox-shell = callPackage ./sandbox-shell.nix { + # musl roadmap has RISC-V support projected for 1.1.20 + busybox = + if !stdenv.hostPlatform.isRiscV && !stdenv.hostPlatform.isLoongArch64 && stdenv.hostPlatform.libc != "bionic" + then pkgsStatic.busybox + else busybox; + }; +} diff --git a/pkgs/by-name/bu/busybox/sandbox-shell.nix b/pkgs/by-name/bu/busybox/sandbox-shell.nix new file mode 100644 index 0000000..fa70e5f --- /dev/null +++ b/pkgs/by-name/bu/busybox/sandbox-shell.nix @@ -0,0 +1,26 @@ +{ busybox}: + +# Minimal shell for use as basic /bin/sh in sandbox builds +busybox.override { + enableStatic = true; + enableMinimal = true; + extraConfig = '' + CONFIG_FEATURE_FANCY_ECHO y + CONFIG_FEATURE_SH_MATH y + CONFIG_FEATURE_SH_MATH_64 y + CONFIG_FEATURE_TEST_64 y + + CONFIG_ASH y + CONFIG_ASH_OPTIMIZE_FOR_SIZE y + + CONFIG_ASH_ALIAS y + CONFIG_ASH_BASH_COMPAT y + CONFIG_ASH_CMDCMD y + CONFIG_ASH_ECHO y + CONFIG_ASH_GETOPTS y + CONFIG_ASH_INTERNAL_GLOB y + CONFIG_ASH_JOB_CONTROL y + CONFIG_ASH_PRINTF y + CONFIG_ASH_TEST y + ''; +} diff --git a/pkgs/by-name/bz/bzip2/1_1.nix b/pkgs/by-name/bz/bzip2/1_1.nix new file mode 100644 index 0000000..e9d6f7c --- /dev/null +++ b/pkgs/by-name/bz/bzip2/1_1.nix @@ -0,0 +1,47 @@ +{ lib, stdenv +, fetchFromGitLab +, meson +, python3 +, ninja +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "bzip2-unstable"; + version = "2020-08-11"; + + src = fetchFromGitLab { + owner = "federicomenaquintero"; + repo = "bzip2"; + rev = "15255b553e7c095fb7a26d4dc5819a11352ebba1"; + sha256 = "sha256-BAyz35D62LWi47B/gNcCSKpdaECHBGSpt21vtnk3fKs="; + }; + + postPatch = '' + patchShebangs install_links.py + ''; + + nativeBuildInputs = [ + meson + python3 + ninja + ]; + + outputs = [ "bin" "dev" "out" "man" ]; + + mesonFlags = [ + "-Ddocs=disabled" + ]; + + strictDeps = true; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + description = "High-quality data compression program"; + license = licenses.bsdOriginal; + pkgConfigModules = [ "bz2" ]; + platforms = platforms.all; + maintainers = []; + }; +}) diff --git a/pkgs/by-name/bz/bzip2/default.nix b/pkgs/by-name/bz/bzip2/default.nix new file mode 100644 index 0000000..bfab2db --- /dev/null +++ b/pkgs/by-name/bz/bzip2/default.nix @@ -0,0 +1,75 @@ +{ lib, stdenv, fetchurl +, enableStatic ? with stdenv.hostPlatform; isStatic || isCygwin +, enableShared ? true +, autoreconfHook +, testers +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation (finalAttrs: let + inherit (finalAttrs) version; +in { + pname = "bzip2"; + version = "1.0.8"; + + src = fetchurl { + url = "https://sourceware.org/pub/bzip2/bzip2-${version}.tar.gz"; + sha256 = "sha256-q1oDF27hBtPw+pDjgdpHjdrkBZGBU8yiSOaCzQxKImk="; + }; + + patchFlags = ["-p0"]; + + patches = [ + (fetchurl { + url = "https://ftp.suse.com/pub/people/sbrabec/bzip2/for_downstream/bzip2-1.0.6.2-autoconfiscated.patch"; + sha256 = "sha256-QMufl6ffJVVVVZespvkCbFpB6++R1lnq1687jEsUjr0="; + }) + ]; + # Fix up hardcoded version from the above patch, e.g. seen in bzip2.pc or libbz2.so.1.0.N + postPatch = '' + patch <<-EOF + --- configure.ac + +++ configure.ac + @@ -3,3 +3,3 @@ + -AC_INIT([bzip2], [1.0.6], [Julian Seward ]) + +AC_INIT([bzip2], [${version}], [Julian Seward ]) + BZIP2_LT_CURRENT=1 + -BZIP2_LT_REVISION=6 + +BZIP2_LT_REVISION=${lib.versions.patch version} + EOF + ''; + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook ]; + + outputs = [ "bin" "dev" "out" "man" ]; + + configureFlags = lib.concatLists [ + (lib.optional enableStatic "--enable-static") + (lib.optional (!enableShared) "--disable-shared") + ]; + + dontDisableStatic = enableStatic; + + enableParallelBuilding = true; + + postInstall = '' + ln -s $out/lib/libbz2.so.1.0.* $out/lib/libbz2.so.1.0 + ''; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + description = "High-quality data compression program"; + homepage = "https://www.sourceware.org/bzip2"; + changelog = "https://sourceware.org/git/?p=bzip2.git;a=blob;f=CHANGES;hb=HEAD"; + license = licenses.bsdOriginal; + pkgConfigModules = [ "bzip2" ]; + platforms = platforms.all; + maintainers = with maintainers; [ mic92 ]; + }; +}) diff --git a/pkgs/by-name/bz/bzip2/packages.nix b/pkgs/by-name/bz/bzip2/packages.nix new file mode 100644 index 0000000..6fde252 --- /dev/null +++ b/pkgs/by-name/bz/bzip2/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + bzip2 = callPackage ./. { }; + bzip2_1_1 = callPackage ./1_1.nix { }; +} diff --git a/pkgs/by-name/c-/c-ares/default.nix b/pkgs/by-name/c-/c-ares/default.nix new file mode 100644 index 0000000..8fdfc05 --- /dev/null +++ b/pkgs/by-name/c-/c-ares/default.nix @@ -0,0 +1,47 @@ +{ lib, stdenv, fetchurl, writeTextDir +, withCMake ? true, cmake + +# sensitive downstream packages +# for passthru.tests +# , curl +# , grpc # consumes cmake config +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "c-ares"; + version = "1.27.0"; + + src = fetchurl { + url = "https://c-ares.org/download/${pname}-${version}.tar.gz"; + hash = "sha256-CnK+ZpWZVcQ+KvL70DQY6Cor1UZGBOyaYhR+N6zrQgs="; + }; + + outputs = [ "out" "dev" "man" ]; + + nativeBuildInputs = lib.optionals withCMake [ cmake ]; + + cmakeFlags = [] ++ lib.optionals stdenv.hostPlatform.isStatic [ + "-DCARES_SHARED=OFF" + "-DCARES_STATIC=ON" + ]; + + enableParallelBuilding = true; + + # passthru.tests = { + # inherit grpc; + # curl = (curl.override { c-aresSupport = true; }).tests.withCheck; + # }; + + meta = with lib; { + description = "A C library for asynchronous DNS requests"; + homepage = "https://c-ares.haxx.se"; + changelog = "https://c-ares.org/changelog.html#${lib.replaceStrings [ "." ] [ "_" ] version}"; + license = licenses.mit; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/c-/c-ares/packages.nix b/pkgs/by-name/c-/c-ares/packages.nix new file mode 100644 index 0000000..0846e63 --- /dev/null +++ b/pkgs/by-name/c-/c-ares/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + c-ares = callPackage ./. { }; + c-aresMinimal = callPackage ./. { + withCMake = false; + }; +} diff --git a/pkgs/by-name/ca/cacert/default.nix b/pkgs/by-name/ca/cacert/default.nix new file mode 100644 index 0000000..7dc047b --- /dev/null +++ b/pkgs/by-name/ca/cacert/default.nix @@ -0,0 +1,213 @@ +{ lib +, stdenv +, writeText +, fetchFromGitHub +, buildcatrust +, blacklist ? [] +, extraCertificateFiles ? [] +, extraCertificateStrings ? [] + +# Used by update.sh +, nssOverride ? null + +# Used for tests only +, runCommand +, cacert +, openssl +}: + +let + blocklist = writeText "cacert-blocklist.txt" (lib.concatStringsSep "\n" blacklist); + extraCertificatesBundle = writeText "cacert-extra-certificates-bundle.crt" (lib.concatStringsSep "\n\n" extraCertificateStrings); + + srcVersion = "3.98"; + version = if nssOverride != null then nssOverride.version else srcVersion; + meta = with lib; { + homepage = "https://curl.haxx.se/docs/caextract.html"; + description = "A bundle of X.509 certificates of public Certificate Authorities (CA)"; + platforms = platforms.all; + maintainers = with maintainers; [ fpletz lukegb ]; + license = licenses.mpl20; + }; + certdata = stdenv.mkDerivation { + pname = "nss-cacert-certdata"; + inherit version; + + src = if nssOverride != null then nssOverride.src else fetchFromGitHub { + owner = "nss-dev"; + repo = "nss"; + rev = "NSS_${lib.replaceStrings ["."] ["_"] version}_RTM"; + hash = "sha256-0p1HzspxyzhzX46O7ax8tmYiaFEBeqEqEvman4NIiQc="; + }; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + mkdir $out + cp lib/ckfw/builtins/certdata.txt $out + + runHook postInstall + ''; + + inherit meta; + }; +in +stdenv.mkDerivation rec { + pname = "nss-cacert"; + inherit version; + + src = certdata; + + outputs = [ "out" "unbundled" "p11kit" ]; + + nativeBuildInputs = [ buildcatrust ]; + + buildPhase = '' + mkdir unbundled + buildcatrust \ + --certdata_input certdata.txt \ + --ca_bundle_input "${extraCertificatesBundle}" ${lib.escapeShellArgs (map (arg: "${arg}") extraCertificateFiles)} \ + --blocklist "${blocklist}" \ + --ca_bundle_output ca-bundle.crt \ + --ca_standard_bundle_output ca-no-trust-rules-bundle.crt \ + --ca_unpacked_output unbundled \ + --p11kit_output ca-bundle.trust.p11-kit + ''; + + installPhase = '' + install -D -t "$out/etc/ssl/certs" ca-bundle.crt + + # install standard PEM compatible bundle + install -D -t "$out/etc/ssl/certs" ca-no-trust-rules-bundle.crt + + # install p11-kit specific output to p11kit output + install -D -t "$p11kit/etc/ssl/trust-source" ca-bundle.trust.p11-kit + + # install individual certs in unbundled output + install -D -t "$unbundled/etc/ssl/certs" unbundled/*.crt + ''; + + setupHook = ./setup-hook.sh; + + passthru = { + updateScript = ./update.sh; + tests = let + isTrusted = '' + isTrusted() { + # isTrusted + for f in $1/etc/ssl/certs/*.crt; do + if ! [[ -s "$f" ]]; then continue; fi + fingerprint="$(openssl x509 -in "$f" -noout -fingerprint -sha256 | cut -f2 -d=)" + if [[ "x$fingerprint" == "x$3" ]]; then + # If the certificate is treated as rejected for TLS Web Server, then we consider it untrusted. + if openssl x509 -in "$f" -noout -text | grep -q '^Rejected Uses:'; then + if openssl x509 -in "$f" -noout -text | grep -A1 '^Rejected Uses:' | grep -q 'TLS Web Server'; then + return 1 + fi + fi + return 0 + fi + done + return 1 + } + ''; + in { + # Test that building this derivation with a blacklist works, and that UTF-8 is supported. + blacklist-utf8 = let + blacklistCAToFingerprint = { + # "blacklist" uses the CA name from the NSS bundle, but we check for presence using the SHA256 fingerprint. + "CFCA EV ROOT" = "5C:C3:D7:8E:4E:1D:5E:45:54:7A:04:E6:87:3E:64:F9:0C:F9:53:6D:1C:CC:2E:F8:00:F3:55:C4:C5:FD:70:FD"; + "NetLock Arany (Class Gold) Főtanúsítvány" = "6C:61:DA:C3:A2:DE:F0:31:50:6B:E0:36:D2:A6:FE:40:19:94:FB:D1:3D:F9:C8:D4:66:59:92:74:C4:46:EC:98"; + }; + mapBlacklist = f: lib.concatStringsSep "\n" (lib.mapAttrsToList f blacklistCAToFingerprint); + in runCommand "verify-the-cacert-filter-output" { + cacert = cacert.unbundled; + cacertWithExcludes = (cacert.override { + blacklist = builtins.attrNames blacklistCAToFingerprint; + }).unbundled; + + nativeBuildInputs = [ openssl ]; + } '' + ${isTrusted} + + # Ensure that each certificate is in the main "cacert". + ${mapBlacklist (caName: caFingerprint: '' + isTrusted "$cacert" "${caName}" "${caFingerprint}" || ({ + echo "CA fingerprint ${caFingerprint} (${caName}) is missing from the CA bundle. Consider picking a different CA for the blacklist test." >&2 + exit 1 + }) + '')} + + # Ensure that each certificate is NOT in the "cacertWithExcludes". + ${mapBlacklist (caName: caFingerprint: '' + isTrusted "$cacertWithExcludes" "${caName}" "${caFingerprint}" && ({ + echo "CA fingerprint ${caFingerprint} (${caName}) is present in the cacertWithExcludes bundle." >&2 + exit 1 + }) + '')} + + touch "$out" + ''; + + # Test that we can add additional certificates to the store, and have them be trusted. + extra-certificates = let + extraCertificateStr = '' + -----BEGIN CERTIFICATE----- + MIIB5DCCAWqgAwIBAgIUItvsAYEIdYDkOIo5sdDYMcUaNuIwCgYIKoZIzj0EAwIw + KTEnMCUGA1UEAwweTml4T1MgY2FjZXJ0IGV4dHJhIGNlcnRpZmljYXRlMB4XDTIx + MDYxMjE5MDQzMFoXDTIyMDYxMjE5MDQzMFowKTEnMCUGA1UEAwweTml4T1MgY2Fj + ZXJ0IGV4dHJhIGNlcnRpZmljYXRlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuP8y + lAm6ZyQt9v/P6gTlV/a9R+D61WjucW04kaegOhg8csiluimYodiSv0Pbgymu+Zxm + A3Bz9QGmytaYTiJ16083rJkwwIhqoYl7kWsLzreSTaLz87KH+rdeol59+H0Oo1Mw + UTAdBgNVHQ4EFgQUCxuHfvqI4YVU5M+A0+aKvd1LrdswHwYDVR0jBBgwFoAUCxuH + fvqI4YVU5M+A0+aKvd1LrdswDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNo + ADBlAjEArgxgjdNmRlSEuai0dzlktmBEDZKy2Iiul+ttSoce9ohfEVYESwO602HW + keVvI56vAjBCro3dc3m2TuktiKO6lQV56PUEyxko4H/sR5pnHlduCGRDlFzQKXf/ + pMMmtj7cVb8= + -----END CERTIFICATE----- + ''; + extraCertificateFile = ./test-cert-file.crt; + extraCertificatesToFingerprint = { + # String above + "NixOS cacert extra certificate string" = "A3:20:D0:84:96:97:25:FF:98:B8:A9:6D:A3:7C:89:95:6E:7A:77:21:92:F3:33:E9:31:AF:5E:03:CE:A9:E5:EE"; + + # File + "NixOS cacert extra certificate file" = "88:B8:BE:A7:57:AC:F1:FE:D6:98:8B:50:E0:BD:0A:AE:88:C7:DF:70:26:E1:67:5E:F5:F6:91:27:FF:02:D4:A5"; + }; + mapExtra = f: lib.concatStringsSep "\n" (lib.mapAttrsToList f extraCertificatesToFingerprint); + in runCommand "verify-the-cacert-extra-output" { + cacert = cacert.unbundled; + cacertWithExtras = (cacert.override { + extraCertificateStrings = [ extraCertificateStr ]; + extraCertificateFiles = [ extraCertificateFile ]; + }).unbundled; + + nativeBuildInputs = [ openssl ]; + } '' + ${isTrusted} + + # Ensure that the extra certificate is not in the main "cacert". + ${mapExtra (extraName: extraFingerprint: '' + isTrusted "$cacert" "${extraName}" "${extraFingerprint}" && ({ + echo "'extra' CA fingerprint ${extraFingerprint} (${extraName}) is present in the main CA bundle." >&2 + exit 1 + }) + '')} + + # Ensure that the extra certificates ARE in the "cacertWithExtras". + ${mapExtra (extraName: extraFingerprint: '' + isTrusted "$cacertWithExtras" "${extraName}" "${extraFingerprint}" || ({ + echo "CA fingerprint ${extraFingerprint} (${extraName}) is not present in the cacertWithExtras bundle." >&2 + exit 1 + }) + '')} + + touch "$out" + ''; + }; + }; + + inherit meta; +} diff --git a/pkgs/by-name/ca/cacert/setup-hook.sh b/pkgs/by-name/ca/cacert/setup-hook.sh new file mode 100644 index 0000000..93b682f --- /dev/null +++ b/pkgs/by-name/ca/cacert/setup-hook.sh @@ -0,0 +1,7 @@ +export NIX_SSL_CERT_FILE=@out@/etc/ssl/certs/ca-bundle.crt + +# compatibility +# - openssl +export SSL_CERT_FILE=@out@/etc/ssl/certs/ca-bundle.crt +# - Haskell x509-system +export SYSTEM_CERTIFICATE_PATH=@out@/etc/ssl/certs/ca-bundle.crt diff --git a/pkgs/by-name/ca/cacert/test-cert-file.crt b/pkgs/by-name/ca/cacert/test-cert-file.crt new file mode 100644 index 0000000..095f388 --- /dev/null +++ b/pkgs/by-name/ca/cacert/test-cert-file.crt @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIIB7TCCAXSgAwIBAgIUFJB0STXn22fIEDjpncEt++IdFeMwCgYIKoZIzj0EAwIw +LjEsMCoGA1UEAwwjTml4T1MgY2FjZXJ0IGV4dHJhIGNlcnRpZmljYXRlIGZpbGUw +HhcNMjEwNjEyMTkxODA4WhcNMjIwNjEyMTkxODA4WjAuMSwwKgYDVQQDDCNOaXhP +UyBjYWNlcnQgZXh0cmEgY2VydGlmaWNhdGUgZmlsZTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMifTLM5K5xd+guGdKE1+NR7wnEJbxw5INzuMrkg/7jgEIQil4+L2YOF +kU1gxcM80Ot8tQAG5OcSvX1DF6CxunpoCT+hnHqyfqoWFvl89i1BUKjyWCQ5WXEe +nSkuJUmYC6NTMFEwHQYDVR0OBBYEFBE2kNis1ri4fweyNVRmvje83gFQMB8GA1Ud +IwQYMBaAFBE2kNis1ri4fweyNVRmvje83gFQMA8GA1UdEwEB/wQFMAMBAf8wCgYI +KoZIzj0EAwIDZwAwZAIwUZf1qaSb4cezulV+4B4FoJHY2B/nRVIi/rFD8634YEDT +vcg6dmCi/AqLEzJn7uFMAjBVTu4EVC/mtQCGESFChMeb04fsuhXgttWSwWliVPEG +jkG7u0UNNGaU8dvrjpqRRmA= +-----END CERTIFICATE----- diff --git a/pkgs/by-name/ca/cacert/update.sh b/pkgs/by-name/ca/cacert/update.sh new file mode 100755 index 0000000..d578102 --- /dev/null +++ b/pkgs/by-name/ca/cacert/update.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p nix common-updater-scripts jq + +# Build both the cacert package and an overridden version where we use the source attribute of NSS. +# Cacert and NSS are both from the same upstream sources. They are decoupled as +# the cacert output only cares about a few infrequently changing files in the +# sources while the NSS source code changes frequently. +# +# By having cacert on a older source revision that produces the same +# certificate output as a newer version we can avoid large amounts of +# unnecessary rebuilds. +# +# As of this writing there are a few magnitudes more packages depending on +# cacert than on nss. +# +# We use `nss_latest` instead of `nss_esr`, because that is the newer version +# and we want up-to-date certificates. +# `nss_esr` is used for the ecosystem at large through the `nss` attribute, +# because it is updated less frequently and maintained for longer, whereas `nss_latest` +# is used for software that actually needs a new nss, e.g. Firefox. + +set -ex + +BASEDIR="$(dirname "$0")/../../../.." + + +CURRENT_PATH=$(nix-build --no-out-link -A cacert.out) +PATCHED_PATH=$(nix-build --no-out-link -E "with import $BASEDIR {}; (cacert.override { nssOverride = nss_latest; }).out") + +# Check the hash of the etc subfolder +# We can't check the entire output as that contains the nix-support folder +# which contains the output path itself. +CURRENT_HASH=$(nix-hash "$CURRENT_PATH/etc") +PATCHED_HASH=$(nix-hash "$PATCHED_PATH/etc") + +if [[ "$CURRENT_HASH" != "$PATCHED_HASH" ]]; then + NSS_VERSION=$(nix-instantiate --json --eval -E "with import $BASEDIR {}; nss_latest.version" | jq -r .) + update-source-version --version-key=srcVersion cacert.src "$NSS_VERSION" +fi diff --git a/pkgs/by-name/ca/cairo/default.nix b/pkgs/by-name/ca/cairo/default.nix new file mode 100644 index 0000000..7408a43 --- /dev/null +++ b/pkgs/by-name/ca/cairo/default.nix @@ -0,0 +1,116 @@ +{ lib, stdenv, fetchurl, fetchpatch, gtk-doc, meson, ninja, pkg-config, python3 +, docbook_xsl, fontconfig, freetype, libpng, pixman, zlib +, x11Support? !stdenv.isDarwin || true, libXext, libXrender +, gobjectSupport ? true, glib +, xcbSupport ? x11Support, libxcb +, darwin +, testers +}: + +let + inherit (lib) optional optionals; +in stdenv.mkDerivation (finalAttrs: let + inherit (finalAttrs) pname version; +in { + pname = "cairo"; + version = "1.18.0"; + + src = fetchurl { + url = "https://cairographics.org/${if lib.mod (builtins.fromJSON (lib.versions.minor version)) 2 == 0 then "releases" else "snapshots"}/${pname}-${version}.tar.xz"; + hash = "sha256-JDoHNrl4oz3uKfnMp1IXM7eKZbVBggb+970cPUzxC2Q="; + }; + + outputs = [ "out" "dev" "devdoc" ]; + outputBin = "dev"; # very small + separateDebugInfo = true; + + nativeBuildInputs = [ + gtk-doc + meson + ninja + pkg-config + python3 + ]; + + buildInputs = [ + docbook_xsl + ] ++ optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ + CoreGraphics + CoreText + ApplicationServices + Carbon + ]); + + propagatedBuildInputs = [ fontconfig freetype pixman libpng zlib ] + ++ optionals x11Support [ libXext libXrender ] + ++ optionals xcbSupport [ libxcb ] + ++ optional gobjectSupport glib + ; # TODO: maybe liblzo but what would it be for here? + + mesonFlags = [ + "-Dgtk_doc=true" + + # error: #error config.h must be included before this header + "-Dsymbol-lookup=disabled" + + # Only used in tests, causes a dependency cycle + "-Dspectre=disabled" + + (lib.mesonEnable "glib" gobjectSupport) + (lib.mesonEnable "tests" finalAttrs.finalPackage.doCheck) + (lib.mesonEnable "xlib" x11Support) + (lib.mesonEnable "xcb" xcbSupport) + ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [ + "--cross-file=${builtins.toFile "cross-file.conf" '' + [properties] + ipc_rmid_deferred_release = ${ + { + linux = "true"; + freebsd = "true"; + netbsd = "false"; + }.${stdenv.hostPlatform.parsed.kernel.name} or + (throw "Unknown value for ipc_rmid_deferred_release") + } + ''}" + ]; + + preConfigure = '' + patchShebangs version.py + ''; + + enableParallelBuilding = true; + + doCheck = false; # fails + + postInstall = '' + # Work around broken `Requires.private' that prevents Freetype + # `-I' flags to be propagated. + sed -i "$out/lib/pkgconfig/cairo.pc" \ + -es'|^Cflags:\(.*\)$|Cflags: \1 -I${freetype.dev}/include/freetype2 -I${freetype.dev}/include|g' + '' + lib.optionalString stdenv.isDarwin glib.flattenInclude; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + description = "A 2D graphics library with support for multiple output devices"; + mainProgram = "cairo-trace"; + longDescription = '' + Cairo is a 2D graphics library with support for multiple output + devices. Currently supported output targets include the X + Window System, XCB, Quartz, Win32, image buffers, PostScript, + PDF, and SVG file output. + + Cairo is designed to produce consistent output on all output + media while taking advantage of display hardware acceleration + when available (e.g., through the X Render Extension). + ''; + homepage = "http://cairographics.org/"; + license = with licenses; [ lgpl2Plus mpl10 ]; + pkgConfigModules = [ + "cairo-pdf" + "cairo-ps" + "cairo-svg" + ] ++ lib.optional gobjectSupport "cairo-gobject"; + platforms = platforms.all; + }; +}) diff --git a/pkgs/by-name/ca/cargo-nextest/default.nix b/pkgs/by-name/ca/cargo-nextest/default.nix new file mode 100644 index 0000000..de0af79 --- /dev/null +++ b/pkgs/by-name/ca/cargo-nextest/default.nix @@ -0,0 +1,38 @@ +{ lib, rustPlatform, fetchFromGitHub, stdenv, darwin }: + +rustPlatform.buildRustPackage rec { + pname = "cargo-nextest"; + version = "0.9.70"; + + src = fetchFromGitHub { + owner = "nextest-rs"; + repo = "nextest"; + rev = "cargo-nextest-${version}"; + hash = "sha256-YTeKcdUszI/0RCAq6Gcakl3hfUSUo3CfVCMod/IPYhw="; + }; + + cargoHash = "sha256-FH9ODkK84bPPYyHP4kKcHKWpJ3FV1NC8S/NQFvV63Gw="; + + buildInputs = lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.SystemConfiguration + ]; + + cargoBuildFlags = [ "-p" "cargo-nextest" ]; + cargoTestFlags = [ "-p" "cargo-nextest" ]; + + # TODO: investigate some more why these tests fail in nix + checkFlags = [ + "--skip=tests_integration::test_list" + "--skip=tests_integration::test_relocated_run" + "--skip=tests_integration::test_run" + ]; + + meta = with lib; { + description = "Next-generation test runner for Rust projects"; + mainProgram = "cargo-nextest"; + homepage = "https://github.com/nextest-rs/nextest"; + changelog = "https://nexte.st/CHANGELOG.html"; + license = with licenses; [ mit asl20 ]; + maintainers = with maintainers; [ ekleog figsoda matthiasbeyer ]; + }; +} diff --git a/pkgs/by-name/ca/catch2/3.nix b/pkgs/by-name/ca/catch2/3.nix new file mode 100644 index 0000000..403c4f7 --- /dev/null +++ b/pkgs/by-name/ca/catch2/3.nix @@ -0,0 +1,53 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, python3 +}: + +stdenv.mkDerivation rec { + pname = "catch2"; + version = "3.5.2"; + + src = fetchFromGitHub { + owner = "catchorg"; + repo = "Catch2"; + rev = "v${version}"; + hash = "sha256-xGPfXjk+oOnR7JqTrZd2pKJxalrlS8CMs7HWDClXaS8="; + }; + + nativeBuildInputs = [ + cmake + ]; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeFlags = [ + "-DCATCH_DEVELOPMENT_BUILD=ON" + "-DCATCH_BUILD_TESTING=${if doCheck then "ON" else "OFF"}" + ] ++ lib.optionals (stdenv.isDarwin && doCheck) [ + # test has a faulty path normalization technique that won't work in + # our darwin build environment https://github.com/catchorg/Catch2/issues/1691 + "-DCMAKE_CTEST_ARGUMENTS=-E;ApprovalTests" + ]; + + # Tests fail on x86_32 if compiled with x87 floats: https://github.com/catchorg/Catch2/issues/2796 + env = lib.optionalAttrs stdenv.isx86_32 { + NIX_CFLAGS_COMPILE = "-msse2 -mfpmath=sse"; + }; + + doCheck = true; + + nativeCheckInputs = [ + python3 + ]; + + meta = { + description = "Modern, C++-native, test framework for unit-tests"; + homepage = "https://github.com/catchorg/Catch2"; + changelog = "https://github.com/catchorg/Catch2/blob/${src.rev}/docs/release-notes.md"; + license = lib.licenses.boost; + maintainers = with lib.maintainers; [ dotlambda ]; + platforms = with lib.platforms; unix ++ windows; + }; +} diff --git a/pkgs/by-name/ca/catch2/default.nix b/pkgs/by-name/ca/catch2/default.nix new file mode 100644 index 0000000..56b2016 --- /dev/null +++ b/pkgs/by-name/ca/catch2/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchFromGitHub, cmake }: + +stdenv.mkDerivation rec { + pname = "catch2"; + version = "2.13.10"; + + src = fetchFromGitHub { + owner = "catchorg"; + repo = "Catch2"; + rev = "v${version}"; + sha256="sha256-XnT2ziES94Y4uzWmaxSw7nWegJFQjAqFUG8PkwK5nLU="; + }; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ "-H.." ]; + + meta = with lib; { + description = "A multi-paradigm automated test framework for C++ and Objective-C (and, maybe, C)"; + homepage = "http://catch-lib.net"; + license = licenses.boost; + maintainers = with maintainers; [ edwtjo knedlsepp ]; + platforms = with platforms; unix ++ windows; + }; +} diff --git a/pkgs/by-name/ca/catch2/packages.nix b/pkgs/by-name/ca/catch2/packages.nix new file mode 100644 index 0000000..1f6ed31 --- /dev/null +++ b/pkgs/by-name/ca/catch2/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + catch2 = callPackage ./. { }; + catch2_3 = callPackage ./3.nix { }; +} diff --git a/pkgs/by-name/cl/cloog/0.18.0.nix b/pkgs/by-name/cl/cloog/0.18.0.nix new file mode 100644 index 0000000..a1ba3aa --- /dev/null +++ b/pkgs/by-name/cl/cloog/0.18.0.nix @@ -0,0 +1,65 @@ +{ fetchurl, lib, stdenv, gmp, isl }: + +stdenv.mkDerivation rec { + pname = "cloog"; + version = "0.18.0"; + + src = fetchurl { + url = "http://www.bastoul.net/cloog/pages/download/count.php3?url=./cloog-${version}.tar.gz"; + sha256 = "1c4aa8dde7886be9cbe0f9069c334843b21028f61d344a2d685f88cb1dcf2228"; + }; + + buildInputs = [ gmp ]; + + propagatedBuildInputs = [ isl ]; + + configureFlags = [ "--with-isl=system" ]; + + enableParallelBuilding = true; + + doCheck = true; + + meta = { + description = "Library that generates loops for scanning polyhedra"; + mainProgram = "cloog"; + + longDescription = '' + CLooG is a free software library to generate code for scanning + Z-polyhedra. That is, it finds a code (e.g., in C, FORTRAN...) that + reaches each integral point of one or more parameterized polyhedra. + CLooG has been originally written to solve the code generation problem + for optimizing compilers based on the polytope model. Nevertheless it + is used now in various area e.g., to build control automata for + high-level synthesis or to find the best polynomial approximation of a + function. CLooG may help in any situation where scanning polyhedra + matters. While the user has full control on generated code quality, + CLooG is designed to avoid control overhead and to produce a very + effective code. + ''; + + homepage = "http://www.cloog.org/"; + + license = lib.licenses.gpl2Plus; + + /* Leads to an ICE on Cygwin: + + make[3]: Entering directory `/tmp/nix-build-9q5gw5m37q5l4f0kjfv9ar8fsc9plk27-ppl-0.10.2.drv-1/ppl-0.10.2/src' + /bin/sh ../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -I.. -I../src -g -O2 -frounding-math -W -Wall -c -o Box.lo Box.cc + libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -I.. -I../src -g -O2 -frounding-math -W -Wall -c Box.cc -DDLL_EXPORT -DPIC -o .libs/Box.o + In file included from checked.defs.hh:595, + from Checked_Number.defs.hh:27, + from Coefficient.types.hh:15, + from Coefficient.defs.hh:26, + from Box.defs.hh:28, + from Box.cc:24: + checked.inlines.hh: In function `Parma_Polyhedra_Library::Result Parma_Polyhedra_Library::Checked::input_generic(Type&, std::istream&, Parma_Polyhedra_Library::Rounding_Dir)': + checked.inlines.hh:607: internal compiler error: in invert_truthvalue, at fold-const.c:2719 + Please submit a full bug report, + with preprocessed source if appropriate. + See for instructions. + make[3]: *** [Box.lo] Error 1 + + */ + platforms = lib.platforms.unix; # Once had cygwin problems + }; +} diff --git a/pkgs/by-name/cl/cloog/default.nix b/pkgs/by-name/cl/cloog/default.nix new file mode 100644 index 0000000..3ae266c --- /dev/null +++ b/pkgs/by-name/cl/cloog/default.nix @@ -0,0 +1,67 @@ +{ fetchurl, lib, stdenv, gmp, isl }: + +stdenv.mkDerivation rec { + pname = "cloog"; + version = "0.18.4"; + + src = fetchurl { + url = "http://www.bastoul.net/cloog/pages/download/count.php3?url=./${pname}-${version}.tar.gz"; + sha256 = "03km1aqaiy3sbqc2f046ms9x0mlmacxlvs5rxsvjj8nf20vxynij"; + }; + + buildInputs = [ gmp ]; + + propagatedBuildInputs = [ isl ]; + + configureFlags = [ "--with-isl=system" ]; + + enableParallelBuilding = true; + # Breaks the test cases as it reuses 'cloog_temp' file name for different tests. + enableParallelChecking = false; + + doCheck = true; + + meta = { + description = "Library that generates loops for scanning polyhedra"; + mainProgram = "cloog"; + + longDescription = '' + CLooG is a free software library to generate code for scanning + Z-polyhedra. That is, it finds a code (e.g., in C, FORTRAN...) that + reaches each integral point of one or more parameterized polyhedra. + CLooG has been originally written to solve the code generation problem + for optimizing compilers based on the polytope model. Nevertheless it + is used now in various area e.g., to build control automata for + high-level synthesis or to find the best polynomial approximation of a + function. CLooG may help in any situation where scanning polyhedra + matters. While the user has full control on generated code quality, + CLooG is designed to avoid control overhead and to produce a very + effective code. + ''; + + homepage = "http://www.cloog.org/"; + + license = lib.licenses.gpl2Plus; + + /* Leads to an ICE on Cygwin: + + make[3]: Entering directory `/tmp/nix-build-9q5gw5m37q5l4f0kjfv9ar8fsc9plk27-ppl-0.10.2.drv-1/ppl-0.10.2/src' + /bin/sh ../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -I.. -I../src -g -O2 -frounding-math -W -Wall -c -o Box.lo Box.cc + libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -I.. -I../src -g -O2 -frounding-math -W -Wall -c Box.cc -DDLL_EXPORT -DPIC -o .libs/Box.o + In file included from checked.defs.hh:595, + from Checked_Number.defs.hh:27, + from Coefficient.types.hh:15, + from Coefficient.defs.hh:26, + from Box.defs.hh:28, + from Box.cc:24: + checked.inlines.hh: In function `Parma_Polyhedra_Library::Result Parma_Polyhedra_Library::Checked::input_generic(Type&, std::istream&, Parma_Polyhedra_Library::Rounding_Dir)': + checked.inlines.hh:607: internal compiler error: in invert_truthvalue, at fold-const.c:2719 + Please submit a full bug report, + with preprocessed source if appropriate. + See for instructions. + make[3]: *** [Box.lo] Error 1 + + */ + platforms = lib.platforms.unix; # Once had cygwin problems + }; +} diff --git a/pkgs/by-name/cl/cloog/packages.nix b/pkgs/by-name/cl/cloog/packages.nix new file mode 100644 index 0000000..0800b3c --- /dev/null +++ b/pkgs/by-name/cl/cloog/packages.nix @@ -0,0 +1,13 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + cloog = callPackage ./. { + isl = isl_0_14; + }; + + cloog_0_18_0 = callPackage ./0.18.0.nix { + isl = isl_0_11; + }; +} diff --git a/pkgs/by-name/cm/cmake/001-search-path.diff b/pkgs/by-name/cm/cmake/001-search-path.diff new file mode 100644 index 0000000..04ab084 --- /dev/null +++ b/pkgs/by-name/cm/cmake/001-search-path.diff @@ -0,0 +1,95 @@ +diff --git a/Modules/Platform/UnixPaths.cmake b/Modules/Platform/UnixPaths.cmake +index b9381c3d7d..5e944640b5 100644 +--- a/Modules/Platform/UnixPaths.cmake ++++ b/Modules/Platform/UnixPaths.cmake +@@ -26,9 +26,6 @@ get_filename_component(_CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" PATH) + # please make sure to keep Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst + # synchronized + list(APPEND CMAKE_SYSTEM_PREFIX_PATH +- # Standard +- /usr/local /usr / +- + # CMake install location + "${_CMAKE_INSTALL_DIR}" + ) +@@ -47,48 +44,49 @@ endif() + + # Non "standard" but common install prefixes + list(APPEND CMAKE_SYSTEM_PREFIX_PATH +- /usr/X11R6 +- /usr/pkg +- /opt + ) + + # List common include file locations not under the common prefixes. ++if(DEFINED ENV{NIX_CC} ++ AND IS_DIRECTORY "$ENV{NIX_CC}" ++ AND EXISTS "$ENV{NIX_CC}/nix-support/orig-libc" ++ AND EXISTS "$ENV{NIX_CC}/nix-support/orig-libc-dev") ++ file(STRINGS "$ENV{NIX_CC}/nix-support/orig-libc" _nix_cmake_libc) ++ file(STRINGS "$ENV{NIX_CC}/nix-support/orig-libc-dev" _nix_cmake_libc_dev) ++else() ++ set(_nix_cmake_libc @libc_lib@) ++ set(_nix_cmake_libc_dev @libc_dev@) ++endif() ++ + list(APPEND CMAKE_SYSTEM_INCLUDE_PATH +- # X11 +- /usr/include/X11 ++ "${_nix_cmake_libc_dev}/include" + ) + + list(APPEND CMAKE_SYSTEM_LIBRARY_PATH +- # X11 +- /usr/lib/X11 ++ "${_nix_cmake_libc}/lib" + ) + + list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES +- /lib /lib32 /lib64 /usr/lib /usr/lib32 /usr/lib64 ++ "${_nix_cmake_libc}/lib" + ) + +-if(CMAKE_SYSROOT_COMPILE) +- set(_cmake_sysroot_compile "${CMAKE_SYSROOT_COMPILE}") +-else() +- set(_cmake_sysroot_compile "${CMAKE_SYSROOT}") +-endif() +- + # Default per-language values. These may be later replaced after + # parsing the implicit directory information from compiler output. + set(_CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES_INIT + ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES} +- "${_cmake_sysroot_compile}/usr/include" ++ "${_nix_cmake_libc_dev}/include" + ) + set(_CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES_INIT + ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES} +- "${_cmake_sysroot_compile}/usr/include" ++ "${_nix_cmake_libc_dev}/include" + ) + set(_CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES_INIT + ${CMAKE_CUDA_IMPLICIT_INCLUDE_DIRECTORIES} +- "${_cmake_sysroot_compile}/usr/include" ++ "${_nix_cmake_libc_dev}/include" + ) + +-unset(_cmake_sysroot_compile) ++unset(_nix_cmake_libc) ++unset(_nix_cmake_libc_dev) + + # Reminder when adding new locations computed from environment variables + # please make sure to keep Help/variable/CMAKE_SYSTEM_PREFIX_PATH.rst +diff --git a/Modules/Platform/WindowsPaths.cmake b/Modules/Platform/WindowsPaths.cmake +index b9e2f17979..ab517cd4a7 100644 +--- a/Modules/Platform/WindowsPaths.cmake ++++ b/Modules/Platform/WindowsPaths.cmake +@@ -70,7 +70,7 @@ endif() + + if(CMAKE_CROSSCOMPILING AND NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") + # MinGW (useful when cross compiling from linux with CMAKE_FIND_ROOT_PATH set) +- list(APPEND CMAKE_SYSTEM_PREFIX_PATH /) ++ # list(APPEND CMAKE_SYSTEM_PREFIX_PATH /) + endif() + + list(APPEND CMAKE_SYSTEM_INCLUDE_PATH diff --git a/pkgs/by-name/cm/cmake/002-application-services.diff b/pkgs/by-name/cm/cmake/002-application-services.diff new file mode 100644 index 0000000..56f7cd2 --- /dev/null +++ b/pkgs/by-name/cm/cmake/002-application-services.diff @@ -0,0 +1,39 @@ +diff -Naur cmake-3.25.1-old/Source/CMakeLists.txt cmake-3.25.1-new/Source/CMakeLists.txt +--- cmake-3.25.1-old/Source/CMakeLists.txt 2022-11-30 10:57:03.000000000 -0300 ++++ cmake-3.25.1-new/Source/CMakeLists.txt 2022-12-19 01:00:08.412064304 -0300 +@@ -916,7 +916,6 @@ + # On Apple we need CoreFoundation and CoreServices + if(APPLE) + target_link_libraries(CMakeLib PUBLIC "-framework CoreFoundation") +- target_link_libraries(CMakeLib PUBLIC "-framework CoreServices") + endif() + + if(WIN32 AND NOT UNIX) +diff -Naur cmake-3.25.1-old/Source/cmGlobalXCodeGenerator.cxx cmake-3.25.1-new/Source/cmGlobalXCodeGenerator.cxx +--- cmake-3.25.1-old/Source/cmGlobalXCodeGenerator.cxx 2022-11-30 10:57:03.000000000 -0300 ++++ cmake-3.25.1-new/Source/cmGlobalXCodeGenerator.cxx 2022-12-19 01:00:56.065135169 -0300 +@@ -56,10 +56,6 @@ + + #if !defined(CMAKE_BOOTSTRAP) && defined(__APPLE__) + # include +-# if !TARGET_OS_IPHONE +-# define HAVE_APPLICATION_SERVICES +-# include +-# endif + #endif + + #if !defined(CMAKE_BOOTSTRAP) +diff -Naur cmake-3.25.1-old/Utilities/cmlibarchive/CMakeLists.txt cmake-3.25.1-new/Utilities/cmlibarchive/CMakeLists.txt +--- cmake-3.25.1-old/Utilities/cmlibarchive/CMakeLists.txt 2022-11-30 10:57:03.000000000 -0300 ++++ cmake-3.25.1-new/Utilities/cmlibarchive/CMakeLists.txt 2022-12-19 01:01:43.392205981 -0300 +@@ -2041,10 +2041,6 @@ + ADD_CUSTOM_TARGET(run_all_tests) + ENDIF(ENABLE_TEST) + +-# We need CoreServices on Mac OS. +-IF(APPLE) +- LIST(APPEND ADDITIONAL_LIBS "-framework CoreServices") +-ENDIF(APPLE) + + add_subdirectory(libarchive) + IF(0) # CMake does not build libarchive's command-line tools. diff --git a/pkgs/by-name/cm/cmake/003-libuv-application-services.diff b/pkgs/by-name/cm/cmake/003-libuv-application-services.diff new file mode 100644 index 0000000..6607a9c --- /dev/null +++ b/pkgs/by-name/cm/cmake/003-libuv-application-services.diff @@ -0,0 +1,55 @@ +diff --git a/Utilities/cmlibuv/CMakeLists.txt b/Utilities/cmlibuv/CMakeLists.txt +index 7625cf65d9..167903e309 100644 +--- a/Utilities/cmlibuv/CMakeLists.txt ++++ b/Utilities/cmlibuv/CMakeLists.txt +@@ -193,6 +193,22 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + src/unix/kqueue.c + src/unix/proctitle.c + ) ++ ++ include(CheckIncludeFile) ++ ++ check_include_file("ApplicationServices/ApplicationServices.h" HAVE_ApplicationServices) ++ if (HAVE_ApplicationServices) ++ list(APPEND uv_defines ++ HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H=1 ++ ) ++ endif() ++ ++ check_include_file("CoreServices/CoreServices.h" HAVE_CoreServices) ++ if (HAVE_CoreServices) ++ list(APPEND uv_defines ++ HAVE_CORESERVICES_CORESERVICES_H=1 ++ ) ++ endif() + endif() + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +diff --git a/Utilities/cmlibuv/src/unix/fsevents.c b/Utilities/cmlibuv/src/unix/fsevents.c +index a51f29b3f6..3f6bf01968 100644 +--- a/Utilities/cmlibuv/src/unix/fsevents.c ++++ b/Utilities/cmlibuv/src/unix/fsevents.c +@@ -21,7 +21,7 @@ + #include "uv.h" + #include "internal.h" + +-#if TARGET_OS_IPHONE || MAC_OS_X_VERSION_MAX_ALLOWED < 1070 ++#if !HAVE_CORESERVICES_CORESERVICES_H || MAC_OS_X_VERSION_MAX_ALLOWED < 1070 + + /* iOS (currently) doesn't provide the FSEvents-API (nor CoreServices) */ + /* macOS prior to 10.7 doesn't provide the full FSEvents API so use kqueue */ +@@ -39,7 +39,7 @@ int uv__fsevents_close(uv_fs_event_t* handle) { + void uv__fsevents_loop_delete(uv_loop_t* loop) { + } + +-#else /* TARGET_OS_IPHONE */ ++#else /* !HAVE_CORESERVICES_CORESERVICES_H */ + + #include "darwin-stub.h" + +@@ -920,4 +920,4 @@ int uv__fsevents_close(uv_fs_event_t* handle) { + return 0; + } + +-#endif /* TARGET_OS_IPHONE */ ++#endif /* !HAVE_CORESERVICES_CORESERVICES_H */ diff --git a/pkgs/by-name/cm/cmake/004-cygwin.diff b/pkgs/by-name/cm/cmake/004-cygwin.diff new file mode 100644 index 0000000..982aba1 --- /dev/null +++ b/pkgs/by-name/cm/cmake/004-cygwin.diff @@ -0,0 +1,274 @@ +--- cmake-3.2.2/Source/cmFileCommand.cxx 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/ccmFileCommand.cxx 2015-06-10 11:02:27.345598700 +0200 +@@ -1179,7 +1179,7 @@ + MatchProperties CollectMatchProperties(const char* file) + { + // Match rules are case-insensitive on some platforms. +-#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__) ++#if defined(_WIN32) || defined(__APPLE__) + std::string lower = cmSystemTools::LowerCase(file); + const char* file_to_match = lower.c_str(); + #else +--- cmake-3.2.2/Source/cmInstallCommand.cxx 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/cmInstallCommand.cxx 2015-06-10 11:04:19.257935200 +0200 +@@ -1138,7 +1138,7 @@ + { + literal_args += " REGEX \""; + // Match rules are case-insensitive on some platforms. +-#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__) ++#if defined(_WIN32) || defined(__APPLE__) + std::string regex = cmSystemTools::LowerCase(args[i]); + #else + std::string regex = args[i]; +--- cmake-3.2.2/Source/kwsys/Glob.cxx 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/kwsys/Glob.cxx 2015-06-10 11:05:51.602674000 +0200 +@@ -37,7 +37,7 @@ + #include + namespace KWSYS_NAMESPACE + { +-#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__) ++#if defined(_WIN32) || defined(__APPLE__) + // On Windows and apple, no difference between lower and upper case + # define KWSYS_GLOB_CASE_INDEPENDENT + #endif +--- cmake-3.2.2/Source/kwsys/SystemInformation.cxx 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/kwsys/SystemInformation.cxx 2015-06-10 11:13:00.308303500 +0200 +@@ -911,7 +911,7 @@ + // Hide implementation details in an anonymous namespace. + namespace { + // ***************************************************************************** +-#if defined(__linux) || defined(__APPLE__) ++#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) + int LoadLines( + FILE *file, + kwsys_stl::vector &lines) +@@ -947,7 +947,7 @@ + return nRead; + } + +-# if defined(__linux) ++# if defined(__linux) || defined(__CYGWIN__) + // ***************************************************************************** + int LoadLines( + const char *fileName, +@@ -986,7 +986,7 @@ + } + #endif + +-#if defined(__linux) ++#if defined(__linux) || defined(__CYGWIN__) + // **************************************************************************** + template + int GetFieldsFromFile( +@@ -3132,7 +3132,6 @@ + pos = buffer.find("processor\t",pos+1); + } + +-#ifdef __linux + // Find the largest physical id. + int maxId = -1; + kwsys_stl::string idc = +@@ -3165,14 +3164,6 @@ + atoi(this->ExtractValueFromCpuInfoFile(buffer,"ncpus active").c_str()); + } + +-#else // __CYGWIN__ +- // does not have "physical id" entries, neither "cpu cores" +- // this has to be fixed for hyper-threading. +- kwsys_stl::string cpucount = +- this->ExtractValueFromCpuInfoFile(buffer,"cpu count"); +- this->NumberOfPhysicalCPU= +- this->NumberOfLogicalCPU = atoi(cpucount.c_str()); +-#endif + // gotta have one, and if this is 0 then we get a / by 0n + // better to have a bad answer than a crash + if(this->NumberOfPhysicalCPU <= 0) +@@ -3370,7 +3361,7 @@ + GlobalMemoryStatusEx(&statex); + return statex.ullTotalPhys/1024; + # endif +-#elif defined(__linux) ++#elif defined(__linux) || defined(__CYGWIN__) + SystemInformation::LongLong memTotal=0; + int ierr=GetFieldFromFile("/proc/meminfo","MemTotal:",memTotal); + if (ierr) +@@ -3501,7 +3492,7 @@ + GlobalMemoryStatusEx(&statex); + return (statex.ullTotalPhys - statex.ullAvailPhys)/1024; + # endif +-#elif defined(__linux) ++#elif defined(__linux) || defined(__CYGWIN__) + const char *names[3]={"MemTotal:","MemFree:",NULL}; + SystemInformation::LongLong values[2]={SystemInformation::LongLong(0)}; + int ierr=GetFieldsFromFile("/proc/meminfo",names,values); +@@ -3560,7 +3551,7 @@ + return -2; + } + return pmc.WorkingSetSize/1024; +-#elif defined(__linux) ++#elif defined(__linux) || defined(__CYGWIN__) + SystemInformation::LongLong memUsed=0; + int ierr=GetFieldFromFile("/proc/self/status","VmRSS:",memUsed); + if (ierr) +@@ -3612,7 +3603,7 @@ + { + #if defined(_WIN32) + return GetCurrentProcessId(); +-#elif defined(__linux) || defined(__APPLE__) ++#elif defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) + return getpid(); + #else + return -1; +--- cmake-3.2.2/Source/kwsys/SystemTools.cxx 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/kwsys/SystemTools.cxx 2015-06-10 11:21:58.980443200 +0200 +@@ -93,19 +93,12 @@ + # if defined(_MSC_VER) && _MSC_VER >= 1800 + # define KWSYS_WINDOWS_DEPRECATED_GetVersionEx + # endif +-#elif defined (__CYGWIN__) +-# include +-# undef _WIN32 + #endif + + #if !KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H + extern char **environ; + #endif + +-#ifdef __CYGWIN__ +-# include +-#endif +- + // getpwnam doesn't exist on Windows and Cray Xt3/Catamount + // same for TIOCGWINSZ + #if defined(_WIN32) || defined (__LIBCATAMOUNT__) +@@ -1148,15 +1141,7 @@ + { + return false; + } +-#if defined(__CYGWIN__) +- // Convert filename to native windows path if possible. +- char winpath[MAX_PATH]; +- if(SystemTools::PathCygwinToWin32(filename.c_str(), winpath)) +- { +- return (GetFileAttributesA(winpath) != INVALID_FILE_ATTRIBUTES); +- } +- return access(filename.c_str(), R_OK) == 0; +-#elif defined(_WIN32) ++#if defined(_WIN32) + return (GetFileAttributesW( + SystemTools::ConvertToWindowsExtendedPath(filename).c_str()) + != INVALID_FILE_ATTRIBUTES); +@@ -1190,28 +1175,6 @@ + } + + //---------------------------------------------------------------------------- +-#ifdef __CYGWIN__ +-bool SystemTools::PathCygwinToWin32(const char *path, char *win32_path) +-{ +- SystemToolsTranslationMap::iterator i = +- SystemTools::Cyg2Win32Map->find(path); +- +- if (i != SystemTools::Cyg2Win32Map->end()) +- { +- strncpy(win32_path, i->second.c_str(), MAX_PATH); +- } +- else +- { +- if(cygwin_conv_path(CCP_POSIX_TO_WIN_A, path, win32_path, MAX_PATH) != 0) +- { +- win32_path[0] = 0; +- } +- SystemToolsTranslationMap::value_type entry(path, win32_path); +- SystemTools::Cyg2Win32Map->insert(entry); +- } +- return win32_path[0] != 0; +-} +-#endif + + bool SystemTools::Touch(const kwsys_stl::string& filename, bool create) + { +@@ -4307,7 +4270,7 @@ + + bool SystemTools::FileIsFullPath(const char* in_name, size_t len) + { +-#if defined(_WIN32) || defined(__CYGWIN__) ++#if defined(_WIN32) + // On Windows, the name must be at least two characters long. + if(len < 2) + { +@@ -5078,9 +5041,6 @@ + static unsigned int SystemToolsManagerCount; + SystemToolsTranslationMap *SystemTools::TranslationMap; + SystemToolsTranslationMap *SystemTools::LongPathMap; +-#ifdef __CYGWIN__ +-SystemToolsTranslationMap *SystemTools::Cyg2Win32Map; +-#endif + + // SystemToolsManager manages the SystemTools singleton. + // SystemToolsManager should be included in any translation unit +@@ -5126,9 +5086,6 @@ + // Allocate the translation map first. + SystemTools::TranslationMap = new SystemToolsTranslationMap; + SystemTools::LongPathMap = new SystemToolsTranslationMap; +-#ifdef __CYGWIN__ +- SystemTools::Cyg2Win32Map = new SystemToolsTranslationMap; +-#endif + + // Add some special translation paths for unix. These are not added + // for windows because drive letters need to be maintained. Also, +@@ -5183,9 +5140,6 @@ + { + delete SystemTools::TranslationMap; + delete SystemTools::LongPathMap; +-#ifdef __CYGWIN__ +- delete SystemTools::Cyg2Win32Map; +-#endif + } + + +--- cmake-3.2.2/Source/kwsys/SystemTools.hxx.in 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Source/kwsys/SystemTools.hxx.in 2015-06-10 11:24:24.271286600 +0200 +@@ -298,15 +298,6 @@ + static bool FileExists(const kwsys_stl::string& filename); + + /** +- * Converts Cygwin path to Win32 path. Uses dictionary container for +- * caching and calls to cygwin_conv_to_win32_path from Cygwin dll +- * for actual translation. Returns true on success, else false. +- */ +-#ifdef __CYGWIN__ +- static bool PathCygwinToWin32(const char *path, char *win32_path); +-#endif +- +- /** + * Return file length + */ + static unsigned long FileLength(const kwsys_stl::string& filename); +@@ -942,9 +933,6 @@ + */ + static SystemToolsTranslationMap *TranslationMap; + static SystemToolsTranslationMap *LongPathMap; +-#ifdef __CYGWIN__ +- static SystemToolsTranslationMap *Cyg2Win32Map; +-#endif + friend class SystemToolsManager; + }; + +--- cmake-3.2.2/Modules/FindCurses.cmake 2015-04-13 19:09:00.000000000 +0200 ++++ cmake-3.2.2/Modules/FindCurses.cmake 2015-06-10 12:10:19.682030300 +0200 +@@ -60,15 +60,6 @@ + if(CURSES_NCURSES_LIBRARY AND ((NOT CURSES_CURSES_LIBRARY) OR CURSES_NEED_NCURSES)) + set(CURSES_USE_NCURSES TRUE) + endif() +-# http://cygwin.com/ml/cygwin-announce/2010-01/msg00002.html +-# cygwin ncurses stopped providing curses.h symlinks see above +-# message. Cygwin is an ncurses package, so force ncurses on +-# cygwin if the curses.h is missing +-if(CYGWIN) +- if(NOT EXISTS /usr/include/curses.h) +- set(CURSES_USE_NCURSES TRUE) +- endif() +-endif() + + + # Not sure the logic is correct here. diff --git a/pkgs/by-name/cm/cmake/005-remove-systemconfiguration-dep.diff b/pkgs/by-name/cm/cmake/005-remove-systemconfiguration-dep.diff new file mode 100644 index 0000000..16bcbbd --- /dev/null +++ b/pkgs/by-name/cm/cmake/005-remove-systemconfiguration-dep.diff @@ -0,0 +1,33 @@ +diff -Naur cmake-3.28.2/Utilities/cmcurl/CMakeLists.txt cmake-3.28.2-new/Utilities/cmcurl/CMakeLists.txt +--- cmake-3.28.2/Utilities/cmcurl/CMakeLists.txt 2024-01-29 23:01:32.000000000 +0300 ++++ cmake-3.28.2-new/Utilities/cmcurl/CMakeLists.txt 2024-02-16 13:09:40.805479195 +0300 +@@ -470,13 +470,6 @@ + + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT ENABLE_ARES) + set(use_core_foundation_and_core_services ON) +- +- find_library(SYSTEMCONFIGURATION_FRAMEWORK "SystemConfiguration") +- if(NOT SYSTEMCONFIGURATION_FRAMEWORK) +- message(FATAL_ERROR "SystemConfiguration framework not found") +- endif() +- +- list(APPEND CURL_LIBS "-framework SystemConfiguration") + endif() + endif() + +diff -Naur cmake-3.28.2/Utilities/cmcurl/lib/curl_setup.h cmake-3.28.2-new/Utilities/cmcurl/lib/curl_setup.h +--- cmake-3.28.2/Utilities/cmcurl/lib/curl_setup.h 2024-01-29 23:01:32.000000000 +0300 ++++ cmake-3.28.2-new/Utilities/cmcurl/lib/curl_setup.h 2024-02-16 13:10:38.822445566 +0300 +@@ -255,12 +255,6 @@ + * performing this task will result in a synthesized IPv6 address. + */ + #if defined(__APPLE__) && !defined(USE_ARES) +-#include +-#define USE_RESOLVE_ON_IPS 1 +-# if TARGET_OS_MAC && !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && \ +- defined(ENABLE_IPV6) +-# define CURL_MACOS_CALL_COPYPROXIES 1 +-# endif + #endif + + #ifdef USE_LWIPSOCK diff --git a/pkgs/by-name/cm/cmake/006-darwin-always-set-runtime-c-flag.diff b/pkgs/by-name/cm/cmake/006-darwin-always-set-runtime-c-flag.diff new file mode 100644 index 0000000..dc10e6b --- /dev/null +++ b/pkgs/by-name/cm/cmake/006-darwin-always-set-runtime-c-flag.diff @@ -0,0 +1,14 @@ +Revert of commit 1af23c4de2c7d58c06171d70b37794b5c860d5f4. +--- b/Modules/Platform/Darwin.cmake ++++ a/Modules/Platform/Darwin.cmake +@@ -47,9 +47,7 @@ + set(CMAKE_SHARED_MODULE_SUFFIX ".so") + set(CMAKE_MODULE_EXISTS 1) + set(CMAKE_DL_LIBS "") ++set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,") +-if(NOT "${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5") +- set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,") +-endif() + + foreach(lang C CXX OBJC OBJCXX) + set(CMAKE_${lang}_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") diff --git a/pkgs/by-name/cm/cmake/check-pc-files-hook.sh b/pkgs/by-name/cm/cmake/check-pc-files-hook.sh new file mode 100644 index 0000000..94d1b7b --- /dev/null +++ b/pkgs/by-name/cm/cmake/check-pc-files-hook.sh @@ -0,0 +1,18 @@ +cmakePcfileCheckPhase() { + while IFS= read -rd $'\0' file; do + grepout=$(grep --line-number '}//nix/store' "$file" || true) + if [ -n "$grepout" ]; then + { + echo "Broken paths found in a .pc file! $file" + echo "The following lines have issues (specifically '//' in paths)." + echo "$grepout" + echo "It is very likely that paths are being joined improperly." + echo 'ex: "${prefix}/@CMAKE_INSTALL_LIBDIR@" should be "@CMAKE_INSTALL_FULL_LIBDIR@"' + echo "Please see https://github.com/NixOS/nixpkgs/issues/144170 for more details." + exit 1 + } 1>&2 + fi + done < <(find "${!outputDev}" -iname "*.pc" -print0) +} + +postFixupHooks+=(cmakePcfileCheckPhase) diff --git a/pkgs/by-name/cm/cmake/default.nix b/pkgs/by-name/cm/cmake/default.nix new file mode 100644 index 0000000..d13cc0b --- /dev/null +++ b/pkgs/by-name/cm/cmake/default.nix @@ -0,0 +1,204 @@ +{ lib +, stdenv +, fetchurl +, buildPackages +, bzip2 +, curlMinimal +, expat +, libarchive +, libuv +, ncurses +, openssl +, pkg-config +, ps +, rhash +, sphinx +, texinfo +, xz +, zlib +, isBootstrap ? null +, isMinimalBuild ? ( + if isBootstrap != null + then lib.warn + "isBootstrap argument is deprecated and will be removed; use isMinimalBuild instead" + isBootstrap + else false) +, useOpenSSL ? !isMinimalBuild +, useSharedLibraries ? (!isMinimalBuild && !stdenv.isCygwin) +, uiToolkits ? [] # can contain "ncurses" and/or "qt5" +, buildDocs ? !(isMinimalBuild || (uiToolkits == [])) +, darwin +# , libsForQt5 +, gitUpdater +}: + +let + inherit (darwin.apple_sdk.frameworks) CoreServices SystemConfiguration; + # inherit (libsForQt5) qtbase wrapQtAppsHook; + cursesUI = lib.elem "ncurses" uiToolkits; + # qt5UI = lib.elem "qt5" uiToolkits; +in +# Accepts only "ncurses" and "qt5" as possible uiToolkits +assert lib.subtractLists [ "ncurses" "qt5" ] uiToolkits == []; +# Minimal, bootstrap cmake does not have toolkits +assert isMinimalBuild -> (uiToolkits == []); +stdenv.mkDerivation (finalAttrs: { + pname = "cmake" + + lib.optionalString isMinimalBuild "-minimal" + + lib.optionalString cursesUI "-cursesUI"; + # + lib.optionalString qt5UI "-qt5UI"; + version = "3.29.1"; + + src = fetchurl { + url = "https://cmake.org/files/v${lib.versions.majorMinor finalAttrs.version}/cmake-${finalAttrs.version}.tar.gz"; + hash = "sha256-f7Auj1e2Kzmqa0z3HoIBSLoaI3JIiElHNQIeMqsO78w="; + }; + + patches = [ + # Don't search in non-Nix locations such as /usr, but do search in our libc. + ./001-search-path.diff + # Don't depend on frameworks. + ./002-application-services.diff + # Derived from https://github.com/libuv/libuv/commit/1a5d4f08238dd532c3718e210078de1186a5920d + ./003-libuv-application-services.diff + ] + ++ lib.optional stdenv.isCygwin ./004-cygwin.diff + # Derived from https://github.com/curl/curl/commit/31f631a142d855f069242f3e0c643beec25d1b51 + ++ lib.optional (stdenv.isDarwin && isMinimalBuild) ./005-remove-systemconfiguration-dep.diff + # On Darwin, always set CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG. + ++ lib.optional stdenv.isDarwin ./006-darwin-always-set-runtime-c-flag.diff; + + outputs = [ "out" ] ++ lib.optionals buildDocs [ "man" "info" ]; + separateDebugInfo = true; + setOutputFlags = false; + + setupHooks = [ + ./setup-hook.sh + ./check-pc-files-hook.sh + ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + nativeBuildInputs = finalAttrs.setupHooks ++ [ + pkg-config + ] + ++ lib.optionals buildDocs [ texinfo ]; + # ++ lib.optionals qt5UI [ wrapQtAppsHook ]; + + buildInputs = lib.optionals useSharedLibraries [ + bzip2 + curlMinimal + expat + libarchive + xz + zlib + libuv + rhash + ] + ++ lib.optional useOpenSSL openssl + ++ lib.optional cursesUI ncurses + # ++ lib.optional qt5UI qtbase + ++ lib.optional stdenv.isDarwin CoreServices + ++ lib.optional (stdenv.isDarwin && !isMinimalBuild) SystemConfiguration; + + propagatedBuildInputs = lib.optional stdenv.isDarwin ps; + + preConfigure = '' + fixCmakeFiles . + substituteInPlace Modules/Platform/UnixPaths.cmake \ + --subst-var-by libc_bin ${lib.getBin stdenv.cc.libc} \ + --subst-var-by libc_dev ${lib.getDev stdenv.cc.libc} \ + --subst-var-by libc_lib ${lib.getLib stdenv.cc.libc} + # CC_FOR_BUILD and CXX_FOR_BUILD are used to bootstrap cmake + configureFlags="--parallel=''${NIX_BUILD_CORES:-1} CC=$CC_FOR_BUILD CXX=$CXX_FOR_BUILD $configureFlags" + ''; + + # The configuration script is not autoconf-based, although being similar; + # triples and other interesting info are passed via CMAKE_* environment + # variables and commandline switches + configurePlatforms = [ ]; + + configureFlags = [ + "CXXFLAGS=-Wno-elaborated-enum-base" + "--docdir=share/doc/${finalAttrs.pname}-${finalAttrs.version}" + ] ++ (if useSharedLibraries + then [ + "--no-system-cppdap" + "--no-system-jsoncpp" + "--system-libs" + ] + else [ + "--no-system-libs" + ]) # FIXME: cleanup + # ++ lib.optional qt5UI "--qt-gui" + ++ lib.optionals buildDocs [ + "--sphinx-build=${sphinx}/bin/sphinx-build" + "--sphinx-info" + "--sphinx-man" + ] + # Workaround https://gitlab.kitware.com/cmake/cmake/-/issues/20568 + ++ lib.optionals stdenv.hostPlatform.is32bit [ + "CFLAGS=-D_FILE_OFFSET_BITS=64" + "CXXFLAGS=-D_FILE_OFFSET_BITS=64" + ] + ++ [ + "--" + # We should set the proper `CMAKE_SYSTEM_NAME`. + # http://www.cmake.org/Wiki/CMake_Cross_Compiling + # + # Unfortunately cmake seems to expect absolute paths for ar, ranlib, and + # strip. Otherwise they are taken to be relative to the source root of the + # package being built. + (lib.cmakeFeature "CMAKE_CXX_COMPILER" "${stdenv.cc.targetPrefix}c++") + (lib.cmakeFeature "CMAKE_C_COMPILER" "${stdenv.cc.targetPrefix}cc") + (lib.cmakeFeature "CMAKE_AR" + "${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ar") + (lib.cmakeFeature "CMAKE_RANLIB" + "${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ranlib") + (lib.cmakeFeature "CMAKE_STRIP" + "${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}strip") + + (lib.cmakeBool "CMAKE_USE_OPENSSL" useOpenSSL) + (lib.cmakeBool "BUILD_CursesDialog" cursesUI) + ]; + + # `pkgsCross.musl64.cmake.override { stdenv = pkgsCross.musl64.llvmPackages_16.libcxxStdenv; }` + # fails with `The C++ compiler does not support C++11 (e.g. std::unique_ptr).` + # The cause is a compiler warning `warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]` + # interfering with the feature check. + env.NIX_CFLAGS_COMPILE = "-Wno-unused-command-line-argument"; + + # make install attempts to use the just-built cmake + preInstall = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + sed -i 's|bin/cmake|${buildPackages.cmakeMinimal}/bin/cmake|g' Makefile + ''; + + dontUseCmakeConfigure = true; + enableParallelBuilding = true; + + doCheck = false; # fails + + passthru.updateScript = gitUpdater { + url = "https://gitlab.kitware.com/cmake/cmake.git"; + rev-prefix = "v"; + ignoredVersions = "-"; # -rc1 and friends + }; + + meta = { + homepage = "https://cmake.org/"; + description = "Cross-platform, open-source build system generator"; + longDescription = '' + CMake is an open-source, cross-platform family of tools designed to build, + test and package software. CMake is used to control the software + compilation process using simple platform and compiler independent + configuration files, and generate native makefiles and workspaces that can + be used in the compiler environment of your choice. + ''; + changelog = "https://cmake.org/cmake/help/v${lib.versions.majorMinor finalAttrs.version}/release/${lib.versions.majorMinor finalAttrs.version}.html"; + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ ttuegel lnl7 AndersonTorres ]; + platforms = lib.platforms.all; + mainProgram = "cmake"; + broken = (/*qt5UI &&*/ stdenv.isDarwin); + }; +}) diff --git a/pkgs/by-name/cm/cmake/packages.nix b/pkgs/by-name/cm/cmake/packages.nix new file mode 100644 index 0000000..638a24a --- /dev/null +++ b/pkgs/by-name/cm/cmake/packages.nix @@ -0,0 +1,20 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + cmake = callPackage ./. { }; + + # can't use override - it triggers infinite recursion + cmakeMinimal = callPackage ./. { + isMinimalBuild = true; + }; + + cmakeCurses = cmake.override { + uiToolkits = [ "ncurses" ]; + }; + + cmakeWithGui = cmake.override { + uiToolkits = [ "ncurses" "qt5" ]; + }; +} diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh new file mode 100755 index 0000000..b28ed42 --- /dev/null +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -0,0 +1,184 @@ +addCMakeParams() { + addToSearchPath CMAKE_PREFIX_PATH $1 +} + +fixCmakeFiles() { + # Replace occurences of /usr and /opt by /var/empty. + echo "fixing cmake files..." + find "$1" \( -type f -name "*.cmake" -o -name "*.cmake.in" -o -name CMakeLists.txt \) -print | + while read fn; do + sed -e 's^/usr\([ /]\|$\)^/var/empty\1^g' -e 's^/opt\([ /]\|$\)^/var/empty\1^g' < "$fn" > "$fn.tmp" + mv "$fn.tmp" "$fn" + done +} + +cmakeConfigurePhase() { + runHook preConfigure + + # default to CMake defaults if unset + : ${cmakeBuildDir:=build} + + export CTEST_OUTPUT_ON_FAILURE=1 + if [ -n "${enableParallelChecking-1}" ]; then + export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES + fi + + if [ -z "${dontFixCmake-}" ]; then + fixCmakeFiles . + fi + + if [ -z "${dontUseCmakeBuildDir-}" ]; then + mkdir -p "$cmakeBuildDir" + cd "$cmakeBuildDir" + : ${cmakeDir:=..} + else + : ${cmakeDir:=.} + fi + + if [ -z "${dontAddPrefix-}" ]; then + cmakeFlags="-DCMAKE_INSTALL_PREFIX=$prefix $cmakeFlags" + fi + + # We should set the proper `CMAKE_SYSTEM_NAME`. + # http://www.cmake.org/Wiki/CMake_Cross_Compiling + # + # Unfortunately cmake seems to expect absolute paths for ar, ranlib, and + # strip. Otherwise they are taken to be relative to the source root of the + # package being built. + cmakeFlags="-DCMAKE_CXX_COMPILER=$CXX $cmakeFlags" + cmakeFlags="-DCMAKE_C_COMPILER=$CC $cmakeFlags" + cmakeFlags="-DCMAKE_AR=$(command -v $AR) $cmakeFlags" + cmakeFlags="-DCMAKE_RANLIB=$(command -v $RANLIB) $cmakeFlags" + cmakeFlags="-DCMAKE_STRIP=$(command -v $STRIP) $cmakeFlags" + + # on macOS we want to prefer Unix-style headers to Frameworks + # because we usually do not package the framework + cmakeFlags="-DCMAKE_FIND_FRAMEWORK=LAST $cmakeFlags" + + # we never want to use the global macOS SDK + cmakeFlags="-DCMAKE_OSX_SYSROOT= $cmakeFlags" + + # correctly detect our clang compiler + cmakeFlags="-DCMAKE_POLICY_DEFAULT_CMP0025=NEW $cmakeFlags" + + # This installs shared libraries with a fully-specified install + # name. By default, cmake installs shared libraries with just the + # basename as the install name, which means that, on Darwin, they + # can only be found by an executable at runtime if the shared + # libraries are in a system path or in the same directory as the + # executable. This flag makes the shared library accessible from its + # nix/store directory. + cmakeFlags="-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib $cmakeFlags" + + # The docdir flag needs to include PROJECT_NAME as per GNU guidelines, + # try to extract it from CMakeLists.txt. + if [[ -z "$shareDocName" ]]; then + local cmakeLists="${cmakeDir}/CMakeLists.txt" + if [[ -f "$cmakeLists" ]]; then + local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' < "$cmakeLists" | head -n1)" + fi + # The argument sometimes contains garbage or variable interpolation. + # When that is the case, let’s fall back to the derivation name. + if [[ -z "$shareDocName" ]] || echo "$shareDocName" | grep -q '[^a-zA-Z0-9_+-]'; then + if [[ -n "${pname-}" ]]; then + shareDocName="$pname" + else + shareDocName="$(echo "$name" | sed 's/-[^a-zA-Z].*//')" + fi + fi + fi + + # This ensures correct paths with multiple output derivations + # It requires the project to use variables from GNUInstallDirs module + # https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html + cmakeFlags="-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName} $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale $cmakeFlags" + + # Don’t build tests when doCheck = false + if [ -z "${doCheck-}" ]; then + cmakeFlags="-DBUILD_TESTING=OFF $cmakeFlags" + fi + + # Always build Release, to ensure optimisation flags + cmakeFlags="-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release} $cmakeFlags" + + # Disable user package registry to avoid potential side effects + # and unecessary attempts to access non-existent home folder + # https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry + cmakeFlags="-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON $cmakeFlags" + cmakeFlags="-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF $cmakeFlags" + cmakeFlags="-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF $cmakeFlags" + + if [ "${buildPhase-}" = ninjaBuildPhase ]; then + cmakeFlags="-GNinja $cmakeFlags" + fi + + echo "cmake flags: $cmakeFlags ${cmakeFlagsArray[@]}" + + cmake "$cmakeDir" $cmakeFlags "${cmakeFlagsArray[@]}" + + if ! [[ -v enableParallelBuilding ]]; then + enableParallelBuilding=1 + echo "cmake: enabled parallel building" + fi + + if ! [[ -v enableParallelInstalling ]]; then + enableParallelInstalling=1 + echo "cmake: enabled parallel installing" + fi + + runHook postConfigure +} + +if [ -z "${dontUseCmakeConfigure-}" -a -z "${configurePhase-}" ]; then + setOutputFlags= + configurePhase=cmakeConfigurePhase +fi + +addEnvHooks "$targetOffset" addCMakeParams + +makeCmakeFindLibs(){ + isystem_seen= + iframework_seen= + for flag in ${NIX_CFLAGS_COMPILE-} ${NIX_LDFLAGS-}; do + if test -n "$isystem_seen" && test -d "$flag"; then + isystem_seen= + export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH-}${CMAKE_INCLUDE_PATH:+:}${flag}" + elif test -n "$iframework_seen" && test -d "$flag"; then + iframework_seen= + export CMAKE_FRAMEWORK_PATH="${CMAKE_FRAMEWORK_PATH-}${CMAKE_FRAMEWORK_PATH:+:}${flag}" + else + isystem_seen= + iframework_seen= + case $flag in + -I*) + export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH-}${CMAKE_INCLUDE_PATH:+:}${flag:2}" + ;; + -L*) + export CMAKE_LIBRARY_PATH="${CMAKE_LIBRARY_PATH-}${CMAKE_LIBRARY_PATH:+:}${flag:2}" + ;; + -F*) + export CMAKE_FRAMEWORK_PATH="${CMAKE_FRAMEWORK_PATH-}${CMAKE_FRAMEWORK_PATH:+:}${flag:2}" + ;; + -isystem) + isystem_seen=1 + ;; + -iframework) + iframework_seen=1 + ;; + esac + fi + done +} + +# not using setupHook, because it could be a setupHook adding additional +# include flags to NIX_CFLAGS_COMPILE +postHooks+=(makeCmakeFindLibs) diff --git a/pkgs/by-name/co/coeurl/default.nix b/pkgs/by-name/co/coeurl/default.nix new file mode 100644 index 0000000..b0743e0 --- /dev/null +++ b/pkgs/by-name/co/coeurl/default.nix @@ -0,0 +1,55 @@ +{ lib +, stdenv +, fetchFromGitLab +, fetchpatch +, ninja +, pkg-config +, meson +, libevent +, curl +, spdlog +}: + +stdenv.mkDerivation rec { + pname = "coeurl"; + version = "0.3.0"; + + src = fetchFromGitLab { + domain = "nheko.im"; + owner = "nheko-reborn"; + repo = pname; + rev = "v${version}"; + hash = "sha256-sN+YSddUOdnJLcnHyWdjNm1PpxCwnkwiqSvyrwUrg6w="; + }; + patches = [ + # Fix compatibility issues with curl > 7.85, see: + # https://nheko.im/nheko-reborn/coeurl/-/commit/d926893007c353fbc149d8538a5762ca8384273a + # PATCH CAN BE REMOVED AFTER 0.3.0 + (fetchpatch { + url = "https://nheko.im/nheko-reborn/coeurl/-/commit/d926893007c353fbc149d8538a5762ca8384273a.patch"; + hash = "sha256-hOBk7riuVI7k7qe/SMq3XJnFzyZ0gB9kVG7dKvWOsPY="; + }) + # Fix error when building with fmt >= 10, see: + # https://nheko.im/nheko-reborn/coeurl/-/commit/831e2ee8e9cf08ea1ee9736cde8370f9d0312abc + # PATCH CAN BE REMOVED AFTER 0.3.0 + (fetchpatch { + url = "https://nheko.im/nheko-reborn/coeurl/-/commit/831e2ee8e9cf08ea1ee9736cde8370f9d0312abc.patch"; + hash = "sha256-a52Id7Nm3Mmmwv7eL58j6xovjlkpAO4KahVM/Q3H65w="; + }) + ]; + postPatch = '' + substituteInPlace subprojects/curl.wrap --replace '[provides]' '[provide]' + ''; + + nativeBuildInputs = [ ninja pkg-config meson ]; + + buildInputs = [ libevent curl spdlog ]; + + meta = with lib; { + description = "A simple async wrapper around CURL for C++"; + homepage = "https://nheko.im/nheko-reborn/coeurl"; + license = licenses.mit; + platforms = platforms.all; + maintainers = with maintainers; [ rnhmjoj ]; + }; +} diff --git a/pkgs/by-name/co/coreutils/default.nix b/pkgs/by-name/co/coreutils/default.nix new file mode 100644 index 0000000..efcdce1 --- /dev/null +++ b/pkgs/by-name/co/coreutils/default.nix @@ -0,0 +1,189 @@ +{ lib +, stdenv +, fetchurl +, autoreconfHook +, buildPackages +, libiconv +, perl +, texinfo +, xz +, gmpSupport ? true, gmp +, aclSupport ? stdenv.isLinux, acl +, attrSupport ? stdenv.isLinux, attr +, selinuxSupport ? false, libselinux, libsepol +# No openssl in default version, so openssl-induced rebuilds aren't too big. +# It makes *sum functions significantly faster. +, minimal ? true +, withOpenssl ? !minimal, openssl +, withPrefix ? false +, singleBinary ? "symlinks" # you can also pass "shebangs" or false +}: + +# Note: this package is used for bootstrapping fetchurl, and thus cannot use +# fetchpatch! All mutable patches (generated by GitHub or cgit) that are needed +# here should be included directly in Nixpkgs as files. + +assert aclSupport -> acl != null; +assert selinuxSupport -> libselinux != null && libsepol != null; + +let + inherit (lib) concatStringsSep isString optional optionals optionalString; + isCross = (stdenv.hostPlatform != stdenv.buildPlatform); +in +stdenv.mkDerivation rec { + pname = "coreutils" + (optionalString (!minimal) "-full"); + version = "9.5"; + + src = fetchurl { + url = "mirror://gnu/coreutils/coreutils-${version}.tar.xz"; + hash = "sha256-zTKO3qyS9qZl3p8yPJO3Eq8YWLwuDYjz9xAEaUcKG4o="; + }; + + patches = lib.optionals stdenv.hostPlatform.isMusl [ + # https://lists.gnu.org/archive/html/bug-coreutils/2024-03/msg00089.html + ./fix-test-failure-musl.patch + ]; + + postPatch = '' + # The test tends to fail on btrfs, f2fs and maybe other unusual filesystems. + sed '2i echo Skipping dd sparse test && exit 77' -i ./tests/dd/sparse.sh + sed '2i echo Skipping du threshold test && exit 77' -i ./tests/du/threshold.sh + sed '2i echo Skipping cp reflink-auto test && exit 77' -i ./tests/cp/reflink-auto.sh + sed '2i echo Skipping cp sparse test && exit 77' -i ./tests/cp/sparse.sh + sed '2i echo Skipping env test && exit 77' -i ./tests/env/env.sh + sed '2i echo Skipping rm deep-2 test && exit 77' -i ./tests/rm/deep-2.sh + sed '2i echo Skipping du long-from-unreadable test && exit 77' -i ./tests/du/long-from-unreadable.sh + + # Some target platforms, especially when building inside a container have + # issues with the inotify test. + sed '2i echo Skipping tail inotify dir recreate test && exit 77' -i ./tests/tail/inotify-dir-recreate.sh + + # sandbox does not allow setgid + sed '2i echo Skipping chmod setgid test && exit 77' -i ./tests/chmod/setgid.sh + substituteInPlace ./tests/install/install-C.sh \ + --replace 'mode3=2755' 'mode3=1755' + + # Fails on systems with a rootfs. Looks like a bug in the test, see + # https://lists.gnu.org/archive/html/bug-coreutils/2019-12/msg00000.html + sed '2i print "Skipping df skip-rootfs test"; exit 77' -i ./tests/df/skip-rootfs.sh + + # these tests fail in the unprivileged nix sandbox (without nix-daemon) as we break posix assumptions + for f in ./tests/chgrp/{basic.sh,recurse.sh,default-no-deref.sh,no-x.sh,posix-H.sh}; do + sed '2i echo Skipping chgrp && exit 77' -i "$f" + done + for f in gnulib-tests/{test-chown.c,test-fchownat.c,test-lchown.c}; do + echo "int main() { return 77; }" > "$f" + done + + # We don't have localtime in the sandbox + for f in gnulib-tests/{test-localtime_r.c,test-localtime_r-mt.c}; do + echo "int main() { return 77; }" > "$f" + done + + # intermittent failures on builders, unknown reason + sed '2i echo Skipping du basic test && exit 77' -i ./tests/du/basic.sh + '' + (optionalString (stdenv.hostPlatform.libc == "musl") (concatStringsSep "\n" [ + '' + echo "int main() { return 77; }" > gnulib-tests/test-parse-datetime.c + echo "int main() { return 77; }" > gnulib-tests/test-getlogin.c + '' + ])) + (optionalString stdenv.isAarch64 '' + # Sometimes fails: https://github.com/NixOS/nixpkgs/pull/143097#issuecomment-954462584 + sed '2i echo Skipping cut huge range test && exit 77' -i ./tests/cut/cut-huge-range.sh + ''); + + outputs = [ "out" "info" ]; + separateDebugInfo = true; + + nativeBuildInputs = [ + # autoreconfHook is due to patch, normally only needed for cygwin + autoreconfHook + perl + xz.bin + ] + ++ optionals stdenv.hostPlatform.isCygwin [ + # due to patch + texinfo + ]; + + buildInputs = [ ] + ++ optional aclSupport acl + ++ optional attrSupport attr + ++ optional gmpSupport gmp + ++ optional withOpenssl openssl + ++ optionals selinuxSupport [ libselinux libsepol ] + # TODO(@Ericson2314): Investigate whether Darwin could benefit too + ++ optional (isCross && stdenv.hostPlatform.libc != "glibc") libiconv; + + hardeningDisable = [ "trivialautovarinit" ]; + + configureFlags = [ "--with-packager=https://nixos.org" ] + ++ optional (singleBinary != false) + ("--enable-single-binary" + optionalString (isString singleBinary) "=${singleBinary}") + ++ optional withOpenssl "--with-openssl" + ++ optional stdenv.hostPlatform.isSunOS "ac_cv_func_inotify_init=no" + ++ optional withPrefix "--program-prefix=g" + # the shipped configure script doesn't enable nls, but using autoreconfHook + # does so which breaks the build + ++ optional stdenv.isDarwin "--disable-nls" + ++ optionals (isCross && stdenv.hostPlatform.libc == "glibc") [ + # TODO(19b98110126fde7cbb1127af7e3fe1568eacad3d): Needed for fstatfs() I + # don't know why it is not properly detected cross building with glibc. + "fu_cv_sys_stat_statfs2_bsize=yes" + ] + # /proc/uptime is available on Linux and produces accurate results even if + # the boot time is set to the epoch because the system has no RTC. We + # explicitly enable it for cases where it can't be detected automatically, + # such as when cross-compiling. + ++ optional stdenv.hostPlatform.isLinux "gl_cv_have_proc_uptime=yes"; + + # The tests are known broken on Cygwin + # (http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/19025), + # Darwin (http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/19351), + # and {Open,Free}BSD. + # With non-standard storeDir: https://github.com/NixOS/nix/issues/512 + doCheck = (!isCross) + && (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.libc == "musl") + && !stdenv.isAarch32; + + # Prevents attempts of running 'help2man' on cross-built binaries. + PERL = if isCross then "missing" else null; + + enableParallelBuilding = true; + + NIX_LDFLAGS = optionalString selinuxSupport "-lsepol"; + FORCE_UNSAFE_CONFIGURE = optionalString stdenv.hostPlatform.isSunOS "1"; + env.NIX_CFLAGS_COMPILE = toString ([] + # Work around a bogus warning in conjunction with musl. + ++ optional stdenv.hostPlatform.isMusl "-Wno-error" + ++ optional stdenv.hostPlatform.isAndroid "-D__USE_FORTIFY_LEVEL=0"); + + # Works around a bug with 8.26: + # Makefile:3440: *** Recursive variable 'INSTALL' references itself (eventually). Stop. + preInstall = optionalString isCross '' + sed -i Makefile -e 's|^INSTALL =.*|INSTALL = ${buildPackages.coreutils}/bin/install -c|' + ''; + + postInstall = optionalString (isCross && !minimal) '' + rm $out/share/man/man1/* + cp ${buildPackages.coreutils-full}/share/man/man1/* $out/share/man/man1 + '' + # du: 8.7 M locale + 0.4 M man pages + + optionalString minimal '' + rm -r "$out/share" + ''; + + meta = with lib; { + homepage = "https://www.gnu.org/software/coreutils/"; + description = "The GNU Core Utilities"; + longDescription = '' + The GNU Core Utilities are the basic file, shell and text manipulation + utilities of the GNU operating system. These are the core utilities which + are expected to exist on every operating system. + ''; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ das_j ]; + platforms = with platforms; unix ++ windows; + priority = 10; + }; +} diff --git a/pkgs/by-name/co/coreutils/fix-test-failure-musl.patch b/pkgs/by-name/co/coreutils/fix-test-failure-musl.patch new file mode 100644 index 0000000..2d54dd2 --- /dev/null +++ b/pkgs/by-name/co/coreutils/fix-test-failure-musl.patch @@ -0,0 +1,23 @@ +From 1defda6356c29c7f731bddb9e9231f594e01d9c9 +(adjusted so it can be applied on coreutils to coreutils tarball) + +Reported by Adept's Lab via Pádraig Brady at +. + +diff --git a/gnulib-tests/test-canonicalize.c b/gnulib-tests/test-canonicalize.c +index 6763a525c9..5d19285c00 100644 +--- a/gnulib-tests/test-canonicalize.c ++++ b/gnulib-tests/test-canonicalize.c +@@ -394,9 +394,9 @@ main (void) + ASSERT (stat ("/", &st1) == 0); + ASSERT (stat ("//", &st2) == 0); + bool same = psame_inode (&st1, &st2); +-#if defined __MVS__ || defined MUSL_LIBC +- /* On IBM z/OS and musl libc, "/" and "//" both canonicalize to +- themselves, yet they both have st_dev == st_ino == 1. */ ++#if defined __MVS__ ++ /* On IBM z/OS, "/" and "//" both canonicalize to themselves, yet they both ++ have st_dev == st_ino == 1. */ + same = false; + #endif + if (same) diff --git a/pkgs/by-name/co/coreutils/packages.nix b/pkgs/by-name/co/coreutils/packages.nix new file mode 100644 index 0000000..f691731 --- /dev/null +++ b/pkgs/by-name/co/coreutils/packages.nix @@ -0,0 +1,13 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + coreutils = callPackage ./. { }; + + # The coreutils above are built with dependencies from + # bootstrapping. We cannot override it here, because that pulls in + # openssl from the previous stage as well. + coreutils-full = callPackage ./. { minimal = false; }; + coreutils-prefixed = coreutils.override { withPrefix = true; singleBinary = false; }; +} diff --git a/pkgs/by-name/cp/cpio/default.nix b/pkgs/by-name/cp/cpio/default.nix new file mode 100644 index 0000000..276cf41 --- /dev/null +++ b/pkgs/by-name/cp/cpio/default.nix @@ -0,0 +1,46 @@ +{ lib +, stdenv +, fetchurl +, autoreconfHook + +# for passthru.tests +# , git +# , libguestfs +# , nixosTests +# , rpm +}: + +stdenv.mkDerivation rec { + pname = "cpio"; + version = "2.15"; + + src = fetchurl { + url = "mirror://gnu/cpio/cpio-${version}.tar.bz2"; + hash = "sha256-k3YQuXwymh7JJoVT+3gAN7z/8Nz/6XJevE/ZwaqQdds="; + }; + + nativeBuildInputs = [ autoreconfHook ]; + + separateDebugInfo = true; + + preConfigure = lib.optionalString stdenv.isCygwin '' + sed -i gnu/fpending.h -e 's,include ,,' + ''; + + enableParallelBuilding = true; + + # passthru.tests = { + # inherit libguestfs rpm; + # git = git.tests.withInstallCheck; + # initrd = nixosTests.systemd-initrd-simple; + # }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/cpio/"; + description = "A program to create or extract from cpio archives"; + license = licenses.gpl3; + platforms = platforms.all; + priority = 6; # resolves collision with gnutar's "libexec/rmt" + mainProgram = "cpio"; + }; +} diff --git a/pkgs/by-name/cr/cracklib/default.nix b/pkgs/by-name/cr/cracklib/default.nix new file mode 100644 index 0000000..4c0badf --- /dev/null +++ b/pkgs/by-name/cr/cracklib/default.nix @@ -0,0 +1,42 @@ +let version = "2.9.11"; in +{ stdenv, lib, buildPackages, fetchurl, zlib, gettext +, lists ? [ (fetchurl { + url = "https://github.com/cracklib/cracklib/releases/download/v${version}/cracklib-words-${version}.gz"; + hash = "sha256-popxGjE1c517Z+nzYLM/DU7M+b1/rE0XwNXkVqkcUXo="; +}) ] +}: + +stdenv.mkDerivation rec { + pname = "cracklib"; + inherit version; + + src = fetchurl { + url = "https://github.com/${pname}/${pname}/releases/download/v${version}/${pname}-${version}.tar.bz2"; + hash = "sha256-yosEmjwtOyIloejRXWE3mOvHSOOVA4jtomlN5Qe6YCA="; + }; + + nativeBuildInputs = lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) buildPackages.cracklib; + buildInputs = [ zlib gettext ]; + + postPatch = lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) '' + chmod +x util/cracklib-format + patchShebangs util + + '' + '' + ln -vs ${toString lists} dicts/ + ''; + + postInstall = '' + make dict-local + ''; + doInstallCheck = true; + installCheckTarget = "test"; + + meta = with lib; { + homepage = "https://github.com/cracklib/cracklib"; + description = "A library for checking the strength of passwords"; + license = licenses.lgpl21; # Different license for the wordlist: http://www.openwall.com/wordlists + maintainers = with maintainers; [ lovek323 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/cr/cryptsetup/default.nix b/pkgs/by-name/cr/cryptsetup/default.nix new file mode 100644 index 0000000..0e32966 --- /dev/null +++ b/pkgs/by-name/cr/cryptsetup/default.nix @@ -0,0 +1,88 @@ +{ lib, stdenv, fetchurl, lvm2, json_c, asciidoctor +, openssl, libuuid, pkg-config, popt, nixosTests +, libargon2, withInternalArgon2 ? false + + # Programs enabled by default upstream are implicitly enabled unless + # manually set to false. +, programs ? {} + # The release tarballs contain precomputed manpage files, so we don't need + # to run asciidoctor on the man sources. By avoiding asciidoctor, we make + # the bare NixOS build hash independent of changes to the ruby ecosystem, + # saving mass-rebuilds. +, rebuildMan ? false +}: + +stdenv.mkDerivation rec { + pname = "cryptsetup"; + version = "2.7.1"; + + outputs = [ "bin" "out" "dev" "man" ]; + separateDebugInfo = true; + + src = fetchurl { + url = "mirror://kernel/linux/utils/cryptsetup/v${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + hash = "sha256-2l0UGeKobgGqMv15WCzVTSCIV8tUG8ov1Cal/xqqu8M="; + }; + + patches = [ + # Allow reading tokens from a relative path, see #167994 + ./relative-token-path.patch + ]; + + postPatch = '' + patchShebangs tests + + # O_DIRECT is filesystem dependent and fails in a sandbox (on tmpfs) + # and on several filesystem types (btrfs, zfs) without sandboxing. + # Remove it, see discussion in #46151 + substituteInPlace tests/unit-utils-io.c --replace "| O_DIRECT" "" + ''; + + NIX_LDFLAGS = lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) "-lgcc_s"; + + configureFlags = [ + "--with-crypto_backend=openssl" + "--disable-ssh-token" + ] ++ lib.optionals (!rebuildMan) [ + "--disable-asciidoc" + ] ++ lib.optionals (!withInternalArgon2) [ + "--enable-libargon2" + ] ++ lib.optionals stdenv.hostPlatform.isStatic [ + "--disable-external-tokens" + # We have to override this even though we're removing token + # support, because the path still gets included in the binary even + # though it isn't used. + "--with-luks2-external-tokens-path=/" + ] ++ (with lib; mapAttrsToList (flip enableFeature)) programs; + + nativeBuildInputs = [ pkg-config ] ++ lib.optionals rebuildMan [ asciidoctor ]; + buildInputs = [ lvm2 json_c openssl libuuid popt ] ++ lib.optional (!withInternalArgon2) libargon2; + + # The test [7] header backup in compat-test fails with a mysterious + # "out of memory" error, even though tons of memory is available. + # Issue filed upstream: https://gitlab.com/cryptsetup/cryptsetup/-/issues/763 + doCheck = !stdenv.hostPlatform.isMusl; + + passthru = { + tests = { + nixos = + lib.optionalAttrs stdenv.hostPlatform.isLinux ( + lib.recurseIntoAttrs ( + lib.filterAttrs + (name: _value: lib.hasPrefix "luks" name) + nixosTests.installer + ) + ); + }; + }; + + meta = { + homepage = "https://gitlab.com/cryptsetup/cryptsetup/"; + description = "LUKS for dm-crypt"; + changelog = "https://gitlab.com/cryptsetup/cryptsetup/-/raw/v${version}/docs/v${version}-ReleaseNotes"; + license = lib.licenses.gpl2; + mainProgram = "cryptsetup"; + maintainers = with lib.maintainers; [ raitobezarius ]; + platforms = with lib.platforms; linux; + }; +} diff --git a/pkgs/by-name/cr/cryptsetup/relative-token-path.patch b/pkgs/by-name/cr/cryptsetup/relative-token-path.patch new file mode 100644 index 0000000..dffd0ba --- /dev/null +++ b/pkgs/by-name/cr/cryptsetup/relative-token-path.patch @@ -0,0 +1,50 @@ +From 4f95ab1f8110a8ab9d7b0e192731ce467f6e5c26 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Janne=20He=C3=9F?= +Date: Sun, 4 Sep 2022 11:15:02 -0600 +Subject: [PATCH] Allow loading token handlers from the default search path + +Since [1] landed in cryptsetup, token handlers (libcryptsetup-token-*.so) +are loaded from a fixed path defined at compile-time. This is +problematic with NixOS since it introduces a dependency cycle +between cryptsetup and systemd. + +This downstream patch [2] allows loading token plugins from the +default library search path. This approach is not accepted upstream [3] +due to security concerns, but the potential attack vectors require +root access and they are sufficiently addressed: + +* cryptsetup could be used as a setuid binary (not used in NixOS). + In this case, LD_LIBRARY_PATH is ignored because of secure-execution + mode. +* cryptsetup running as root could lead to a malicious token handler + being loaded through LD_LIBRARY_PATH. However, fixing the path + doesn't prevent the same malicious .so being loaded through LD_PRELOAD. + +[1] https://gitlab.com/cryptsetup/cryptsetup/-/commit/5b9e98f94178d3cd179d9f6e2a0a68c7d9eb6507 +[2] https://github.com/NixOS/nixpkgs/issues/167994#issuecomment-1094249369 +[3] https://gitlab.com/cryptsetup/cryptsetup/-/issues/733 +--- + lib/luks2/luks2_token.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/lib/luks2/luks2_token.c b/lib/luks2/luks2_token.c +index 26467253..6f8329f0 100644 +--- a/lib/luks2/luks2_token.c ++++ b/lib/luks2/luks2_token.c +@@ -151,12 +151,10 @@ crypt_token_load_external(struct crypt_device *cd, const char *name, struct cryp + + token = &ret->u.v2; + +- r = snprintf(buf, sizeof(buf), "%s/libcryptsetup-token-%s.so", crypt_token_external_path(), name); ++ r = snprintf(buf, sizeof(buf), "libcryptsetup-token-%s.so", name); + if (r < 0 || (size_t)r >= sizeof(buf)) + return -EINVAL; + +- assert(*buf == '/'); +- + log_dbg(cd, "Trying to load %s.", buf); + + h = dlopen(buf, RTLD_LAZY); +-- +2.37.2 + diff --git a/pkgs/by-name/cu/cunit/default.nix b/pkgs/by-name/cu/cunit/default.nix new file mode 100644 index 0000000..77af649 --- /dev/null +++ b/pkgs/by-name/cu/cunit/default.nix @@ -0,0 +1,29 @@ +{ lib, stdenv, fetchurl, autoconf, automake, libtool, autoreconfHook}: + +stdenv.mkDerivation rec { + pname = "CUnit"; + version = "2.1-3"; + + nativeBuildInputs = [ autoreconfHook autoconf automake ]; + buildInputs = [libtool]; + + src = fetchurl { + url = "mirror://sourceforge/cunit/CUnit/${version}/${pname}-${version}.tar.bz2"; + sha256 = "057j82da9vv4li4z5ri3227ybd18nzyq81f6gsvhifs5z0vr3cpm"; + }; + + meta = { + description = "A Unit Testing Framework for C"; + + longDescription = '' + CUnit is a lightweight system for writing, administering, and running + unit tests in C. It provides C programmers a basic testing functionality + with a flexible variety of user interfaces. + ''; + + homepage = "https://cunit.sourceforge.net/"; + + license = lib.licenses.lgpl2; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/cu/curl/default.nix b/pkgs/by-name/cu/curl/default.nix new file mode 100644 index 0000000..63b7852 --- /dev/null +++ b/pkgs/by-name/cu/curl/default.nix @@ -0,0 +1,219 @@ +{ lib, stdenv, fetchurl, darwin, pkg-config, perl +, brotliSupport ? false, brotli +, c-aresSupport ? false, c-aresMinimal +, gnutlsSupport ? false, gnutls +, gsaslSupport ? false, gsasl +, gssSupport ? with stdenv.hostPlatform; ( + !isWindows && + # disable gss because of: undefined reference to `k5_bcmp' + # a very sad story re static: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=439039 + !isStatic && + # the "mig" tool does not configure its compiler correctly. This could be + # fixed in mig, but losing gss support on cross compilation to darwin is + # not worth the effort. + !(isDarwin && (stdenv.buildPlatform != stdenv.hostPlatform)) + ), libkrb5 +, http2Support ? true, nghttp2 +, http3Support ? false, nghttp3, ngtcp2 +, websocketSupport ? false +, idnSupport ? false, libidn2 +, ldapSupport ? false, openldap +, opensslSupport ? zlibSupport, openssl +, pslSupport ? false, libpsl +, rtmpSupport ? false, rtmpdump +, scpSupport ? zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin, libssh2 +, wolfsslSupport ? false, wolfssl +, rustlsSupport ? false, rustls-ffi +, zlibSupport ? true, zlib +, zstdSupport ? false, zstd + +# for passthru.tests +# , nixosTests +# , coeurl +# , curlpp +# , haskellPackages +# , ocamlPackages +# , phpExtensions +# , pkgsStatic +# , python3 +# , tests +# , testers +# , fetchpatch +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert !((lib.count (x: x) [ gnutlsSupport opensslSupport wolfsslSupport rustlsSupport ]) > 1); + +stdenv.mkDerivation (finalAttrs: { + pname = "curl"; + version = "8.7.1"; + + src = fetchurl { + urls = [ + "https://curl.haxx.se/download/curl-${finalAttrs.version}.tar.xz" + "https://github.com/curl/curl/releases/download/curl-${builtins.replaceStrings [ "." ] [ "_" ] finalAttrs.version}/curl-${finalAttrs.version}.tar.xz" + ]; + hash = "sha256-b+oqrGpGEPvQQAr7C83b5yWKZMY/H2jlhV68DGWXEM0="; + }; + + postPatch = '' + patchShebangs scripts + ''; + + outputs = [ "bin" "dev" "out" "man" "devdoc" ]; + separateDebugInfo = stdenv.isLinux; + + enableParallelBuilding = true; + + strictDeps = true; + + nativeBuildInputs = [ pkg-config perl ]; + + # Zlib and OpenSSL must be propagated because `libcurl.la' contains + # "-lz -lssl", which aren't necessary direct build inputs of + # applications that use Curl. + propagatedBuildInputs = with lib; + optional brotliSupport brotli ++ + optional c-aresSupport c-aresMinimal ++ + optional gnutlsSupport gnutls ++ + optional gsaslSupport gsasl ++ + optional gssSupport libkrb5 ++ + optional http2Support nghttp2 ++ + optionals http3Support [ nghttp3 ngtcp2 ] ++ + optional idnSupport libidn2 ++ + optional ldapSupport openldap ++ + optional opensslSupport openssl ++ + optional pslSupport libpsl ++ + optional rtmpSupport rtmpdump ++ + optional scpSupport libssh2 ++ + optional wolfsslSupport wolfssl ++ + optional rustlsSupport rustls-ffi ++ + optional zlibSupport zlib ++ + optional zstdSupport zstd ++ + optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ + CoreFoundation + CoreServices + SystemConfiguration + ]); + + # for the second line see https://curl.haxx.se/mail/tracker-2014-03/0087.html + preConfigure = '' + sed -e 's|/usr/bin|/no-such-path|g' -i.bak configure + rm src/tool_hugehelp.c + '' + lib.optionalString (pslSupport && stdenv.hostPlatform.isStatic) '' + # curl doesn't understand that libpsl2 has deps because it doesn't use + # pkg-config. + # https://github.com/curl/curl/pull/12919 + configureFlagsArray+=("LIBS=-lidn2 -lunistring") + ''; + + configureFlags = [ + # Build without manual + "--disable-manual" + (lib.enableFeature c-aresSupport "ares") + (lib.enableFeature ldapSupport "ldap") + (lib.enableFeature ldapSupport "ldaps") + (lib.enableFeature websocketSupport "websockets") + # --with-ca-fallback is only supported for openssl and gnutls https://github.com/curl/curl/blame/curl-8_0_1/acinclude.m4#L1640 + (lib.withFeature (opensslSupport || gnutlsSupport) "ca-fallback") + (lib.withFeature http3Support "nghttp3") + (lib.withFeature http3Support "ngtcp2") + (lib.withFeature rtmpSupport "librtmp") + (lib.withFeature rustlsSupport "rustls") + (lib.withFeature zstdSupport "zstd") + (lib.withFeature pslSupport "libpsl") + (lib.withFeatureAs brotliSupport "brotli" (lib.getDev brotli)) + (lib.withFeatureAs gnutlsSupport "gnutls" (lib.getDev gnutls)) + (lib.withFeatureAs idnSupport "libidn2" (lib.getDev libidn2)) + (lib.withFeatureAs opensslSupport "openssl" (lib.getDev openssl)) + (lib.withFeatureAs scpSupport "libssh2" (lib.getDev libssh2)) + (lib.withFeatureAs wolfsslSupport "wolfssl" (lib.getDev wolfssl)) + ] + ++ lib.optional gssSupport "--with-gssapi=${lib.getDev libkrb5}" + # For the 'urandom', maybe it should be a cross-system option + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + "--with-random=/dev/urandom" + ++ lib.optionals stdenv.hostPlatform.isWindows [ + "--disable-shared" + "--enable-static" + ] ++ lib.optionals stdenv.isDarwin [ + # Disable default CA bundle, use NIX_SSL_CERT_FILE or fallback to nss-cacert from the default profile. + # Without this curl might detect /etc/ssl/cert.pem at build time on macOS, causing curl to ignore NIX_SSL_CERT_FILE. + "--without-ca-bundle" + "--without-ca-path" + ] ++ lib.optionals (!gnutlsSupport && !opensslSupport && !wolfsslSupport && !rustlsSupport) [ + "--without-ssl" + ]; + + CXX = "${stdenv.cc.targetPrefix}c++"; + CXXCPP = "${stdenv.cc.targetPrefix}c++ -E"; + + # takes 14 minutes on a 24 core and because many other packages depend on curl + # they cannot be run concurrently and are a bottleneck + # tests are available in passthru.tests.withCheck + doCheck = false; + preCheck = '' + patchShebangs tests/ + '' + lib.optionalString stdenv.isDarwin '' + # bad interaction with sandbox if enabled? + rm tests/data/test1453 + rm tests/data/test1086 + '' + lib.optionalString stdenv.hostPlatform.isMusl '' + # different resolving behaviour? + rm tests/data/test1592 + ''; + + postInstall = '' + moveToOutput bin/curl-config "$dev" + + # Install completions + make -C scripts install + '' + lib.optionalString scpSupport '' + sed '/^dependency_libs/s|${lib.getDev libssh2}|${lib.getLib libssh2}|' -i "$out"/lib/*.la + '' + lib.optionalString gnutlsSupport '' + ln $out/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libcurl-gnutls${stdenv.hostPlatform.extensions.sharedLibrary} + ln $out/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libcurl-gnutls${stdenv.hostPlatform.extensions.sharedLibrary}.4 + ln $out/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libcurl-gnutls${stdenv.hostPlatform.extensions.sharedLibrary}.4.4.0 + ''; + + # passthru = let + # useThisCurl = attr: attr.override { curl = finalAttrs.finalPackage; }; + # in { + # inherit opensslSupport openssl; + # tests = { + # withCheck = finalAttrs.finalPackage.overrideAttrs (_: { doCheck = true; }); + # curlpp = useThisCurl curlpp; + # coeurl = useThisCurl coeurl; + # haskell-curl = useThisCurl haskellPackages.curl; + # ocaml-curly = useThisCurl ocamlPackages.curly; + # pycurl = useThisCurl python3.pkgs.pycurl; + # php-curl = useThisCurl phpExtensions.curl; + # error: attribute 'override' missing + # Additional checking with support http3 protocol. + # nginx-http3 = useThisCurl nixosTests.nginx-http3; + # nginx-http3 = nixosTests.nginx-http3; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # } // lib.optionalAttrs (stdenv.hostPlatform.system != "x86_64-darwin") { + # static = pkgsStatic.curl; + # } // lib.optionalAttrs (!stdenv.isDarwin) { + # fetchpatch = tests.fetchpatch.simple.override { fetchpatch = (fetchpatch.override { fetchurl = useThisCurl fetchurl; }) // { version = 1; }; }; + # }; + # }; + + meta = with lib; { + changelog = "https://curl.se/changes.html#${lib.replaceStrings [ "." ] [ "_" ] finalAttrs.version}"; + description = "A command line tool for transferring files with URL syntax"; + homepage = "https://curl.se/"; + license = licenses.curl; + maintainers = with maintainers; [ lovek323 ]; + platforms = platforms.all; + # Fails to link against static brotli or gss + broken = (stdenv.hostPlatform.isStatic && (brotliSupport || gssSupport || stdenv.hostPlatform.system == "x86_64-darwin")) || rustlsSupport; + pkgConfigModules = [ "libcurl" ]; + mainProgram = "curl"; + }; +}) diff --git a/pkgs/by-name/cu/curl/packages.nix b/pkgs/by-name/cu/curl/packages.nix new file mode 100644 index 0000000..24f50a6 --- /dev/null +++ b/pkgs/by-name/cu/curl/packages.nix @@ -0,0 +1,30 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + curlFull = curl.override { + ldapSupport = true; + gsaslSupport = true; + rtmpSupport = true; + pslSupport = true; + websocketSupport = true; + }; + + curlHTTP3 = curl.override { + openssl = quictls; + http3Support = true; + }; + + curl = curlMinimal.override ({ + idnSupport = true; + pslSupport = true; + zstdSupport = true; + } // lib.optionalAttrs (!stdenv.hostPlatform.isStatic) { + brotliSupport = true; + }); + + curlMinimal = callPackage ./. { }; + + curlWithGnuTls = curl.override { gnutlsSupport = true; opensslSupport = false; }; +} diff --git a/pkgs/by-name/cu/curlpp/default.nix b/pkgs/by-name/cu/curlpp/default.nix new file mode 100644 index 0000000..c8fe78d --- /dev/null +++ b/pkgs/by-name/cu/curlpp/default.nix @@ -0,0 +1,23 @@ +{ lib, stdenv, fetchFromGitHub, cmake, curl }: + +stdenv.mkDerivation rec { + pname = "curlpp"; + version = "0.8.1"; + src = fetchFromGitHub { + owner = "jpbarrette"; + repo = "curlpp"; + rev = "v${version}"; + sha256 = "1b0ylnnrhdax4kwjq64r1fk0i24n5ss6zfzf4hxwgslny01xiwrk"; + }; + + buildInputs = [ curl ]; + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + homepage = "https://www.curlpp.org/"; + description = "C++ wrapper around libcURL"; + mainProgram = "curlpp-config"; + license = licenses.mit; + maintainers = with maintainers; [ CrazedProgrammer ]; + }; +} diff --git a/pkgs/by-name/cy/cyrus-sasl/cyrus-sasl-ac-try-run-fix.patch b/pkgs/by-name/cy/cyrus-sasl/cyrus-sasl-ac-try-run-fix.patch new file mode 100644 index 0000000..f037679 --- /dev/null +++ b/pkgs/by-name/cy/cyrus-sasl/cyrus-sasl-ac-try-run-fix.patch @@ -0,0 +1,13 @@ +diff --git a/m4/sasl2.m4 b/m4/sasl2.m4 +index 098c853a..91d98def 100644 +--- a/m4/sasl2.m4 ++++ b/m4/sasl2.m4 +@@ -350,7 +350,7 @@ int main(void) + + return (!have_spnego); // 0 = success, 1 = failure + } +-],[ac_cv_gssapi_supports_spnego=yes],[ac_cv_gssapi_supports_spnego=no]) ++],[ac_cv_gssapi_supports_spnego=yes],[ac_cv_gssapi_supports_spnego=no],[ac_cv_gssapi_supports_spnego=no]) + LIBS="$cmu_save_LIBS" + ]) + AS_IF([test "$ac_cv_gssapi_supports_spnego" = yes],[ diff --git a/pkgs/by-name/cy/cyrus-sasl/default.nix b/pkgs/by-name/cy/cyrus-sasl/default.nix new file mode 100644 index 0000000..ab583cf --- /dev/null +++ b/pkgs/by-name/cy/cyrus-sasl/default.nix @@ -0,0 +1,74 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, openssl +, openldap +, libkrb5 +, db +, gettext +, pam +, libxcrypt +, fixDarwinDylibNames +, autoreconfHook +, enableLdap ? false +, buildPackages +, pruneLibtoolFiles +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation rec { + pname = "cyrus-sasl"; + version = "2.1.28"; + + src = fetchurl { + urls = + [ "https://github.com/cyrusimap/${pname}/releases/download/${pname}-${version}/${pname}-${version}.tar.gz" + "http://www.cyrusimap.org/releases/${pname}-${version}.tar.gz" + "http://www.cyrusimap.org/releases/old/${pname}-${version}.tar.gz" + ]; + sha256 = "sha256-fM/Gq9Ae1nwaCSSzU+Um8bdmsh9C1FYu5jWo6/xbs4w="; + }; + + patches = [ + # Fix cross-compilation + ./cyrus-sasl-ac-try-run-fix.patch + # make compatible with openssl3. can probably be dropped with any release after 2.1.28 + (fetchpatch { + url = "https://github.com/cyrusimap/cyrus-sasl/compare/cb549ef71c5bb646fe583697ebdcaba93267a237...dfaa62392e7caecc6ecf0097b4d73738ec4fc0a8.patch"; + hash = "sha256-pc0cZqj1QoxDqgd/j/5q3vWONEPrTm4Pr6MzHlfjRCc="; + }) + ]; + + outputs = [ "bin" "dev" "out" "man" "devdoc" ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ autoreconfHook pruneLibtoolFiles ] + ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; + buildInputs = + [ openssl db gettext libkrb5 libxcrypt ] + ++ lib.optional enableLdap openldap + ++ lib.optional stdenv.isLinux pam; + + configureFlags = [ + "--with-openssl=${openssl.dev}" + "--with-plugindir=${placeholder "out"}/lib/sasl2" + "--with-saslauthd=/run/saslauthd" + "--enable-login" + "--enable-shared" + ] ++ lib.optional enableLdap "--with-ldap=${openldap.dev}"; + + installFlags = lib.optionals stdenv.isDarwin [ "framedir=$(out)/Library/Frameworks/SASL2.framework" ]; + + # passthru.tests = { + # inherit (nixosTests) parsedmarc postfix; + # }; + + meta = with lib; { + homepage = "https://www.cyrusimap.org/sasl"; + description = "Library for adding authentication support to connection-based protocols"; + platforms = platforms.unix; + license = licenses.bsdOriginal; + }; +} diff --git a/pkgs/by-name/cy/cyrus-sasl/packages.nix b/pkgs/by-name/cy/cyrus-sasl/packages.nix new file mode 100644 index 0000000..e9e6f52 --- /dev/null +++ b/pkgs/by-name/cy/cyrus-sasl/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + cyrus_sasl = callPackage ./. { + libkrb5 = if stdenv.isFreeBSD then heimdal else libkrb5; + }; +} diff --git a/pkgs/by-name/da/darwin/darwin-packages.nix b/pkgs/by-name/da/darwin/darwin-packages.nix new file mode 100644 index 0000000..29337ca --- /dev/null +++ b/pkgs/by-name/da/darwin/darwin-packages.nix @@ -0,0 +1,265 @@ +{ lib +, buildPackages, pkgs, targetPackages +, generateSplicesForMkScope, makeScopeWithSplicing' +, stdenv +, preLibcCrossHeaders +, config +, path +}: + +let + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by + # default. + targetPrefix = lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) + (stdenv.targetPlatform.config + "-"); + + # Bootstrap `fetchurl` needed to build SDK packages without causing an infinite recursion. + fetchurlBoot = import (path + "/pkgs/build-support/fetchurl/boot.nix") { + inherit (stdenv) system; + }; + + aliases = self: super: {}; #lib.optionalAttrs config.allowAliases (import ../top-level/darwin-aliases.nix lib self super pkgs); +in + +makeScopeWithSplicing' { + otherSplices = generateSplicesForMkScope "darwin"; + extra = spliced: spliced.apple_sdk.frameworks; + f = lib.extends aliases (self: let + inherit (self) mkDerivation callPackage; + + # Must use pkgs.callPackage to avoid infinite recursion. + + # Open source packages that are built from source + appleSourcePackages = pkgs.callPackage ./packages/apple-source-releases { } self; + + impure-cmds = pkgs.callPackage ./packages/impure-cmds { }; + + # macOS 10.12 SDK + apple_sdk_10_12 = pkgs.callPackage ./packages/apple-sdk { + inherit (buildPackages.darwin) print-reexports; + inherit (self) darwin-stubs; + fetchurl = fetchurlBoot; + }; + + # macOS 11.0 SDK + apple_sdk_11_0 = pkgs.callPackage ./packages/apple-sdk-11.0 { + fetchurl = fetchurlBoot; + }; + + # Pick an SDK + apple_sdk = if stdenv.hostPlatform.isAarch64 then apple_sdk_11_0 else apple_sdk_10_12; + + # Pick the source of libraries: either Apple's open source releases, or the + # SDK. + useAppleSDKLibs = stdenv.hostPlatform.isAarch64; + + selectAttrs = attrs: names: + lib.listToAttrs (lib.concatMap (n: lib.optionals (attrs ? "${n}") [(lib.nameValuePair n attrs."${n}")]) names); + + chooseLibs = ( + # There are differences in which libraries are exported. Avoid evaluation + # errors when a package is not provided. + selectAttrs ( + if useAppleSDKLibs + then apple_sdk + else appleSourcePackages + ) ["Libsystem" "LibsystemCross" "libcharset" "libunwind" "objc4" "configd" "IOKit"] + ) // { + inherit ( + if useAppleSDKLibs + then apple_sdk.frameworks + else appleSourcePackages + ) Security; + }; +in + +impure-cmds // appleSourcePackages // chooseLibs // { + + inherit apple_sdk apple_sdk_10_12 apple_sdk_11_0; + + stdenvNoCF = stdenv.override { + extraBuildInputs = []; + }; + + binutils-unwrapped = callPackage ./packages/binutils { + inherit (pkgs) binutils-unwrapped; + inherit (pkgs.llvmPackages) llvm clang-unwrapped; + }; + + binutils = pkgs.wrapBintoolsWith { + libc = + if stdenv.targetPlatform != stdenv.hostPlatform + then pkgs.libcCross + else pkgs.stdenv.cc.libc; + bintools = self.binutils-unwrapped; + }; + + binutilsDualAs-unwrapped = callPackage ./packages/binutils { + inherit (pkgs) binutils-unwrapped; + inherit (pkgs.llvmPackages) llvm clang-unwrapped; + dualAs = true; + }; + + binutilsDualAs = pkgs.wrapBintoolsWith { + libc = + if stdenv.targetPlatform != stdenv.hostPlatform + then pkgs.libcCross + else pkgs.stdenv.cc.libc; + bintools = self.binutilsDualAs-unwrapped; + }; + + binutilsNoLibc = pkgs.wrapBintoolsWith { + libc = preLibcCrossHeaders; + bintools = self.binutils-unwrapped; + }; + + cctools = self.cctools-llvm; + + cctools-apple = callPackage ./packages/cctools/apple.nix { + stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; + }; + + cctools-llvm = callPackage ./packages/cctools/llvm.nix { + stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; + }; + + cctools-port = callPackage ./packages/cctools/port.nix { + stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; + }; + + # TODO(@connorbaker): See https://github.com/NixOS/nixpkgs/issues/229389. + cf-private = self.apple_sdk.frameworks.CoreFoundation; + + DarwinTools = callPackage ./packages/DarwinTools { }; + + darwin-stubs = callPackage ./packages/darwin-stubs { }; + + print-reexports = callPackage ./packages/print-reexports { }; + + rewrite-tbd = callPackage ./packages/rewrite-tbd { }; + + checkReexportsHook = pkgs.makeSetupHook { + name = "darwin-check-reexports-hook"; + propagatedBuildInputs = [ pkgs.darwin.print-reexports ]; + } ./packages/print-reexports/setup-hook.sh; + + sigtool = callPackage ./packages/sigtool { }; + + signingUtils = callPackage ./packages/signing-utils { }; + + postLinkSignHook = callPackage ./packages/signing-utils/post-link-sign-hook.nix { }; + + autoSignDarwinBinariesHook = pkgs.makeSetupHook { + name = "auto-sign-darwin-binaries-hook"; + propagatedBuildInputs = [ self.signingUtils ]; + } ./packages/signing-utils/auto-sign-hook.sh; + + iosSdkPkgs = callPackage ./packages/xcode/sdk-pkgs.nix { + buildIosSdk = buildPackages.darwin.iosSdkPkgs.sdk; + targetIosSdkPkgs = targetPackages.darwin.iosSdkPkgs; + inherit (pkgs.llvmPackages) clang-unwrapped; + }; + + iproute2mac = callPackage ./packages/iproute2mac { }; + + libobjc = self.objc4; + + lsusb = callPackage ./packages/lsusb { }; + + moltenvk = pkgs.darwin.apple_sdk_11_0.callPackage ./packages/moltenvk { + inherit (apple_sdk_11_0.frameworks) AppKit Foundation Metal QuartzCore; + inherit (apple_sdk_11_0.libs) simd; + }; + + openwith = pkgs.darwin.apple_sdk_11_0.callPackage ./packages/openwith { + inherit (apple_sdk_11_0.frameworks) AppKit Foundation UniformTypeIdentifiers; + }; + + stubs = pkgs.callPackages ./packages/stubs { }; + + trash = callPackage ./packages/trash { }; + + xattr = pkgs.python3Packages.callPackage ./packages/xattr { }; + + inherit (pkgs.callPackages ./packages/xcode { }) + xcode_8_1 xcode_8_2 + xcode_9_1 xcode_9_2 xcode_9_3 xcode_9_4 xcode_9_4_1 + xcode_10_1 xcode_10_2 xcode_10_2_1 xcode_10_3 + xcode_11 xcode_11_1 xcode_11_2 xcode_11_3_1 xcode_11_4 xcode_11_5 xcode_11_6 xcode_11_7 + xcode_12 xcode_12_0_1 xcode_12_1 xcode_12_2 xcode_12_3 xcode_12_4 xcode_12_5 xcode_12_5_1 + xcode_13 xcode_13_1 xcode_13_2 xcode_13_3 xcode_13_3_1 xcode_13_4 xcode_13_4_1 + xcode_14 xcode_14_1 + xcode_15 xcode_15_1 + xcode; + + CoreSymbolication = callPackage ./packages/CoreSymbolication { + inherit (apple_sdk) darwin-stubs; + }; + + # TODO: Remove the CF hook if a solution to the crashes is not found. + CF = + # CF used to refer to the open source version of CoreFoundation from the Swift + # project. As of macOS 14, the rpath-based approach allowing packages to choose + # which version to use no longer seems to work reliably. Sometimes they works, + # but sometimes they crash with the error (in the system crash logs): + # CF objects must have a non-zero isa. + # See https://developer.apple.com/forums/thread/739355 for more on that error. + # + # In this branch, we only have a single "CoreFoundation" to choose from. + # To be compatible with the existing convention, we define + # CoreFoundation with the setup hook, and CF as the same package but + # with the setup hook removed. + # + # This may seem unimportant, but without it packages (e.g., bacula) will + # fail with linker errors referring ___CFConstantStringClassReference. + # It's not clear to me why some packages need this extra setup. + lib.overrideDerivation apple_sdk.frameworks.CoreFoundation (drv: { + setupHook = null; + }); + + # Formerly the CF attribute. Use this is you need the open source release. + swift-corelibs-foundation = callPackage ./packages/swift-corelibs/corefoundation.nix { }; + + # As the name says, this is broken, but I don't want to lose it since it's a direction we want to go in + # libdispatch-broken = callPackage ./packages/swift-corelibs/libdispatch.nix { }; + + libtapi = callPackage ./packages/libtapi {}; + + ios-deploy = callPackage ./packages/ios-deploy {}; + + discrete-scroll = callPackage ./packages/discrete-scroll { }; + + # # See doc/packages/darwin-builder.section.md + # linux-builder = lib.makeOverridable ({ modules }: + # let + # toGuest = builtins.replaceStrings [ "darwin" ] [ "linux" ]; + + # nixos = import ../../nixos { + # configuration = { + # imports = [ + # ../../nixos/modules/profiles/macos-builder.nix + # ] ++ modules; + + # # If you need to override this, consider starting with the right Nixpkgs + # # in the first place, ie change `pkgs` in `pkgs.darwin.linux-builder`. + # # or if you're creating new wiring that's not `pkgs`-centric, perhaps use the + # # macos-builder profile directly. + # virtualisation.host = { inherit pkgs; }; + + # nixpkgs.hostPlatform = lib.mkDefault (toGuest stdenv.hostPlatform.system); + # }; + + # system = null; + # }; + + # in + # nixos.config.system.build.macos-builder-installer) { modules = [ ]; }; + + # linux-builder-x86_64 = self.linux-builder.override { + # modules = [ { nixpkgs.hostPlatform = "x86_64-linux"; } ]; + # }; + +}); +} diff --git a/pkgs/by-name/da/darwin/packages.nix b/pkgs/by-name/da/darwin/packages.nix new file mode 100644 index 0000000..f885a26 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages.nix @@ -0,0 +1,12 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Darwin package set + # + # Even though this is a set of packages not single package, use `callPackage` + # not `callPackages` so the per-package callPackages don't have their + # `.override` clobbered. C.F. `llvmPackages` which does the same. + darwin = recurseIntoAttrs (callPackage ./darwin-packages.nix { }); +} diff --git a/pkgs/by-name/da/darwin/packages/CoreSymbolication/default.nix b/pkgs/by-name/da/darwin/packages/CoreSymbolication/default.nix new file mode 100644 index 0000000..f6b0e2b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/CoreSymbolication/default.nix @@ -0,0 +1,58 @@ +{ + lib, + fetchFromGitHub, + fetchpatch, + stdenvNoCC, + darwin-stubs, +}: + +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "CoreSymbolication"; + inherit (darwin-stubs) version; + + src = fetchFromGitHub { + repo = "CoreSymbolication"; + owner = "matthewbauer"; + rev = "24c87c23664b3ee05dc7a5a87d647ae476a680e4"; + hash = "sha256-PzvLq94eNhP0+rLwGMKcMzxuD6MlrNI7iT/eV0obtSE="; + }; + + patches = [ + # Add missing symbol definitions needed to build `zlog` in system_cmds. + # https://github.com/matthewbauer/CoreSymbolication/pull/2 + (fetchpatch { + url = "https://github.com/matthewbauer/CoreSymbolication/commit/ae7ac6a7043dbae8e63d6ce5e63dfaf02b5977fe.patch"; + hash = "sha256-IuXGMsaR1LIGs+BpDU1b4YlznKm9VhK5DQ+Dthtb1mI="; + }) + (fetchpatch { + url = "https://github.com/matthewbauer/CoreSymbolication/commit/6531da946949a94643e6d8424236174ae64fe0ca.patch"; + hash = "sha256-+nDX04yY92yVT9KxiAFY2LxKcS7P8JpU539K+YVRqV4="; + }) + ]; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + mkdir -p $out/Library/Frameworks/CoreSymbolication.framework/Versions/A/Headers + + ln -s A $out/Library/Frameworks/CoreSymbolication.framework/Versions/Current + ln -s Versions/Current/Headers $out/Library/Frameworks/CoreSymbolication.framework/Headers + ln -s Versions/Current/CoreSymbolication.tbd $out/Library/Frameworks/CoreSymbolication.framework/CoreSymbolication.tbd + + cp *.h $out/Library/Frameworks/CoreSymbolication.framework/Versions/A/Headers + cp ${darwin-stubs}/System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication.tbd \ + $out/Library/Frameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication.tbd + + runHook postInstall + ''; + + meta = with lib; { + description = "Reverse engineered headers for Apple's CoreSymbolication framework"; + homepage = "https://github.com/matthewbauer/CoreSymbolication"; + license = licenses.mit; + platforms = platforms.darwin; + maintainers = with maintainers; [ matthewbauer ]; + }; +}) diff --git a/pkgs/by-name/da/darwin/packages/DarwinTools/default.nix b/pkgs/by-name/da/darwin/packages/DarwinTools/default.nix new file mode 100644 index 0000000..11e4c84 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/DarwinTools/default.nix @@ -0,0 +1,36 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "DarwinTools"; + version = "1"; + + src = fetchurl { + url = "https://web.archive.org/web/20180408044816/https://opensource.apple.com/tarballs/DarwinTools/DarwinTools-${version}.tar.gz"; + hash = "sha256-Fzo5QhLd3kZHVFKhJe7xzV6bmRz5nAsG2mNLkAqVBEI="; + }; + + patches = [ + ./sw_vers-CFPriv.patch + ]; + + configurePhase = '' + export SRCROOT=. + export SYMROOT=. + export DSTROOT=$out + ''; + + makeFlags = [ + "CC=${stdenv.cc.targetPrefix}cc" + "STRIP=${stdenv.cc.targetPrefix}strip" + ]; + + postInstall = '' + mv $out/usr/* $out + rmdir $out/usr + ''; + + meta = { + maintainers = [ lib.maintainers.matthewbauer ]; + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/DarwinTools/sw_vers-CFPriv.patch b/pkgs/by-name/da/darwin/packages/DarwinTools/sw_vers-CFPriv.patch new file mode 100644 index 0000000..6faeaa7 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/DarwinTools/sw_vers-CFPriv.patch @@ -0,0 +1,19 @@ +--- a/sw_vers.c 2021-04-19 13:06:50.131346864 +0900 ++++ b/sw_vers.c 2021-04-19 13:07:32.481967474 +0900 +@@ -28,7 +28,15 @@ + */ + + #include +-#include ++ ++// Avoid dependency on CoreFoundation/CFPriv, which no longer appears to be ++// part of the upstream sdk. ++ ++CFDictionaryRef _CFCopyServerVersionDictionary(void); ++CFDictionaryRef _CFCopySystemVersionDictionary(void); ++extern CFStringRef _kCFSystemVersionProductNameKey; ++extern CFStringRef _kCFSystemVersionProductVersionKey; ++extern CFStringRef _kCFSystemVersionBuildVersionKey; + + void usage(char *progname) { + fprintf(stderr, "Usage: %s [-productName|-productVersion|-buildVersion]\n", progname); diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/apple_sdk.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/apple_sdk.nix new file mode 100644 index 0000000..fdc3bd4 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/apple_sdk.nix @@ -0,0 +1,268 @@ +{ lib, stdenvNoCC, buildPackages, fetchurl, xar, cpio, pkgs, python3, pbzx, MacOSX-SDK }: + +# TODO: reorganize to make this just frameworks, and move libs to default.nix + +let + stdenv = stdenvNoCC; + + standardFrameworkPath = name: private: + "/System/Library/${lib.optionalString private "Private"}Frameworks/${name}.framework"; + + mkDepsRewrites = deps: + let + mergeRewrites = x: y: { + prefix = lib.mergeAttrs (x.prefix or {}) (y.prefix or {}); + const = lib.mergeAttrs (x.const or {}) (y.const or {}); + }; + + rewriteArgs = { prefix ? {}, const ? {} }: lib.concatLists ( + (lib.mapAttrsToList (from: to: [ "-p" "${from}:${to}" ]) prefix) ++ + (lib.mapAttrsToList (from: to: [ "-c" "${from}:${to}" ]) const) + ); + + rewrites = depList: lib.fold mergeRewrites {} + (map (dep: dep.tbdRewrites) + (lib.filter (dep: dep ? tbdRewrites) depList)); + in + lib.escapeShellArgs (rewriteArgs (rewrites (builtins.attrValues deps))); + + mkFramework = { name, deps, private ? false }: + let self = stdenv.mkDerivation { + pname = "apple-${lib.optionalString private "private-"}framework-${name}"; + version = MacOSX-SDK.version; + + dontUnpack = true; + + # because we copy files from the system + preferLocalBuild = true; + + disallowedRequisites = [ MacOSX-SDK ]; + + nativeBuildInputs = [ buildPackages.darwin.rewrite-tbd ]; + + installPhase = '' + mkdir -p $out/Library/Frameworks + + cp -r ${MacOSX-SDK}${standardFrameworkPath name private} $out/Library/Frameworks + + if [[ -d ${MacOSX-SDK}/usr/lib/swift/${name}.swiftmodule ]]; then + mkdir -p $out/lib/swift + cp -r -t $out/lib/swift \ + ${MacOSX-SDK}/usr/lib/swift/${name}.swiftmodule \ + ${MacOSX-SDK}/usr/lib/swift/libswift${name}.tbd + fi + + # Fix and check tbd re-export references + chmod u+w -R $out + find $out -name '*.tbd' -type f | while read tbd; do + echo "Fixing re-exports in $tbd" + rewrite-tbd \ + -p ${standardFrameworkPath name private}/:$out/Library/Frameworks/${name}.framework/ \ + -p /usr/lib/swift/:$out/lib/swift/ \ + ${mkDepsRewrites deps} \ + -r ${builtins.storeDir} \ + "$tbd" + done + ''; + + propagatedBuildInputs = builtins.attrValues deps; + + passthru = { + tbdRewrites = { + prefix."${standardFrameworkPath name private}/" = "${self}/Library/Frameworks/${name}.framework/"; + }; + }; + + meta = with lib; { + description = "Apple SDK framework ${name}"; + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + }; + }; + in self; + + framework = name: deps: mkFramework { inherit name deps; private = false; }; + privateFramework = name: deps: mkFramework { inherit name deps; private = true; }; +in rec { + libs = { + xpc = stdenv.mkDerivation { + name = "apple-lib-xpc"; + dontUnpack = true; + + installPhase = '' + mkdir -p $out/include + pushd $out/include >/dev/null + cp -r "${MacOSX-SDK}/usr/include/xpc" $out/include/xpc + cp "${MacOSX-SDK}/usr/include/launch.h" $out/include/launch.h + popd >/dev/null + ''; + }; + + Xplugin = stdenv.mkDerivation { + name = "apple-lib-Xplugin"; + dontUnpack = true; + + propagatedBuildInputs = with frameworks; [ + OpenGL ApplicationServices Carbon IOKit CoreGraphics CoreServices CoreText + ]; + + installPhase = '' + mkdir -p $out/include $out/lib + ln -s "${MacOSX-SDK}/include/Xplugin.h" $out/include/Xplugin.h + cp ${MacOSX-SDK}/usr/lib/libXplugin.1.tbd $out/lib + ln -s libXplugin.1.tbd $out/lib/libXplugin.tbd + ''; + }; + + utmp = stdenv.mkDerivation { + name = "apple-lib-utmp"; + dontUnpack = true; + + installPhase = '' + mkdir -p $out/include + pushd $out/include >/dev/null + ln -s "${MacOSX-SDK}/include/utmp.h" + ln -s "${MacOSX-SDK}/include/utmpx.h" + popd >/dev/null + ''; + }; + + sandbox = stdenv.mkDerivation { + name = "apple-lib-sandbox"; + + dontUnpack = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/include $out/lib + ln -s "${MacOSX-SDK}/usr/include/sandbox.h" $out/include/sandbox.h + cp "${MacOSX-SDK}/usr/lib/libsandbox.1.tbd" $out/lib + ln -s libsandbox.1.tbd $out/lib/libsandbox.tbd + ''; + }; + + libDER = stdenv.mkDerivation { + name = "apple-lib-libDER"; + dontUnpack = true; + installPhase = '' + mkdir -p $out/include + cp -r ${MacOSX-SDK}/usr/include/libDER $out/include + ''; + }; + + simd = stdenv.mkDerivation { + name = "apple-lib-simd"; + dontUnpack = true; + installPhase = '' + mkdir -p $out/include + cp -r ${MacOSX-SDK}/usr/include/simd $out/include + ''; + }; + }; + + frameworks = let + # Dependency map created by gen-frameworks.py. + generatedDeps = import ./frameworks.nix { + inherit frameworks libs; + }; + + # Additional dependencies that are not picked up by gen-frameworks.py. + # Some of these are simply private frameworks the generator does not see. + extraDeps = with libs; with frameworks; let + inherit (pkgs.darwin.apple_sdk_11_0) libnetwork; + libobjc = pkgs.darwin.apple_sdk_11_0.objc4; + in { + # Below this comment are entries migrated from before the generator was + # added. If, for a given framework, you are able to reverify the extra + # deps are really necessary on top of the generator deps, move it above + # this comment (and maybe document your findings). + AVFoundation = { inherit ApplicationServices AVFCapture AVFCore; }; + Accelerate = { inherit CoreWLAN IOBluetooth; }; + AddressBook = { inherit AddressBookCore ContactsPersistence libobjc; }; + AppKit = { inherit AudioToolbox AudioUnit UIFoundation; }; + AudioToolbox = { inherit AudioToolboxCore; }; + AudioUnit = { inherit Carbon CoreAudio; }; + Carbon = { inherit IOKit QuartzCore libobjc; }; + CoreAudio = { inherit IOKit; }; + CoreFoundation = { inherit libobjc; }; + CoreGraphics = { inherit SystemConfiguration; }; + CoreMIDIServer = { inherit CoreMIDI; }; + CoreMedia = { inherit ApplicationServices AudioToolbox AudioUnit; }; + CoreServices = { inherit CoreAudio NetFS ServiceManagement; }; + CoreWLAN = { inherit SecurityFoundation; }; + DiscRecording = { inherit IOKit libobjc; }; + Foundation = { inherit SystemConfiguration libobjc; }; + GameKit = { inherit GameCenterFoundation GameCenterUI GameCenterUICore ReplayKit; }; + ICADevices = { inherit Carbon libobjc; }; + IOBluetooth = { inherit CoreBluetooth; }; + JavaScriptCore = { inherit libobjc; }; + Kernel = { inherit IOKit; }; + LinkPresentation = { inherit URLFormatting; }; + MediaToolbox = { inherit AudioUnit; }; + MetricKit = { inherit SignpostMetrics; }; + Network = { inherit libnetwork; }; + PCSC = { inherit CoreData; }; + PassKit = { inherit PassKitCore; }; + QTKit = { inherit CoreMedia CoreMediaIO MediaToolbox VideoToolbox; }; + Quartz = { inherit QTKit; }; + QuartzCore = { inherit ApplicationServices CoreImage CoreVideo Metal OpenCL libobjc; }; + Security = { inherit IOKit libDER; }; + TWAIN = { inherit Carbon; }; + VideoDecodeAcceleration = { inherit CoreVideo; }; + WebKit = { inherit ApplicationServices Carbon libobjc; }; + }; + + # Overrides for framework derivations. + overrides = super: { + CoreFoundation = lib.overrideDerivation super.CoreFoundation (drv: { + setupHook = ./cf-setup-hook.sh; + }); + + # This framework doesn't exist in newer SDKs (somewhere around 10.13), but + # there are references to it in nixpkgs. + QuickTime = throw "QuickTime framework not available"; + + # Seems to be appropriate given https://developer.apple.com/forums/thread/666686 + JavaVM = super.JavaNativeFoundation; + + CoreVideo = lib.overrideDerivation super.CoreVideo (drv: { + installPhase = drv.installPhase + '' + # When used as a module, complains about a missing import for + # Darwin.C.stdint. Apparently fixed in later SDKs. + sed -e "/CFBase.h/ i #include " \ + -i $out/Library/Frameworks/CoreVideo.framework/Headers/CVBase.h + ''; + }); + + System = lib.overrideDerivation super.System (drv: { + installPhase = drv.installPhase + '' + # Contrarily to the other frameworks, System framework's TBD file + # is a symlink pointing to ${MacOSX-SDK}/usr/lib/libSystem.B.tbd. + # This produces an error when installing the framework as: + # 1. The original file is not copied into the output directory + # 2. Even if it was copied, the relative path wouldn't match + # Thus, it is easier to replace the file than to fix the symlink. + cp --remove-destination ${MacOSX-SDK}/usr/lib/libSystem.B.tbd \ + $out/Library/Frameworks/System.framework/Versions/B/System.tbd + ''; + }); + }; + + # Merge extraDeps into generatedDeps. + deps = generatedDeps // ( + lib.mapAttrs + (name: deps: generatedDeps.${name} // deps) + extraDeps + ); + + # Create derivations, and add private frameworks. + bareFrameworks = (lib.mapAttrs framework deps) // ( + lib.mapAttrs privateFramework (import ./private-frameworks.nix { + inherit frameworks; + libobjc = pkgs.darwin.apple_sdk_11_0.objc4; + }) + ); + in + # Apply derivation overrides. + bareFrameworks // overrides bareFrameworks; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/cf-setup-hook.sh b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/cf-setup-hook.sh new file mode 100644 index 0000000..b64eb95 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/cf-setup-hook.sh @@ -0,0 +1,6 @@ +forceLinkCoreFoundationFramework() { + NIX_CFLAGS_COMPILE="-F@out@/Library/Frameworks${NIX_CFLAGS_COMPILE:+ }${NIX_CFLAGS_COMPILE-}" + NIX_LDFLAGS+=" @out@/Library/Frameworks/CoreFoundation.framework/CoreFoundation.tbd" +} + +preConfigureHooks+=(forceLinkCoreFoundationFramework) diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/default.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/default.nix new file mode 100644 index 0000000..238c1b7 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/default.nix @@ -0,0 +1,160 @@ +{ stdenvNoCC, fetchurl, newScope, lib, pkgs +, stdenv, overrideCC +, xar, cpio, python3, pbzx }: + +let + mkSusDerivation = args: stdenvNoCC.mkDerivation (args // { + dontBuild = true; + darwinDontCodeSign = true; + + nativeBuildInputs = [ cpio pbzx ]; + + outputs = [ "out" ]; + + unpackPhase = '' + pbzx $src | cpio -idm + ''; + + passthru = { + inherit (args) version; + }; + }); + + MacOSX-SDK = mkSusDerivation { + pname = "MacOSX-SDK"; + version = "11.0.0"; + + # https://swscan.apple.com/content/catalogs/others/index-11-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog + src = fetchurl { + url = "http://swcdn.apple.com/content/downloads/46/21/001-89745-A_56FM390IW5/v1um2qppgfdnam2e9cdqcqu2r6k8aa3lis/CLTools_macOSNMOS_SDK.pkg"; + sha256 = "0n425smj4q1vxbza8fzwnk323fyzbbq866q32w288c44hl5yhwsf"; + }; + + installPhase = '' + mv Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk $out + ''; + }; + + CLTools_Executables = mkSusDerivation { + pname = "CLTools_Executables"; + version = "11.0.0"; + + # https://swscan.apple.com/content/catalogs/others/index-11-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog + src = fetchurl { + url = "http://swcdn.apple.com/content/downloads/46/21/001-89745-A_56FM390IW5/v1um2qppgfdnam2e9cdqcqu2r6k8aa3lis/CLTools_Executables.pkg"; + sha256 = "0nvb1qx7l81l2wcl8wvgbpsg5rcn51ylhivqmlfr2hrrv3zrrpl0"; + }; + + installPhase = '' + mv Library/Developer/CommandLineTools $out + ''; + }; + + mkCc = cc: + if stdenv.isAarch64 then cc + else + cc.override { + bintools = stdenv.cc.bintools.override { libc = packages.Libsystem; }; + libc = packages.Libsystem; + }; + + mkStdenv = stdenv: + if stdenv.isAarch64 then stdenv + else + let + darwinMinVersion = "10.12"; + darwinSdkVersion = "11.0"; + in + (overrideCC stdenv (mkCc stdenv.cc)).override { + extraBuildInputs = [ pkgs.darwin.apple_sdk_11_0.frameworks.CoreFoundation ]; + buildPlatform = stdenv.buildPlatform // { inherit darwinMinVersion darwinSdkVersion; }; + hostPlatform = stdenv.hostPlatform // { inherit darwinMinVersion darwinSdkVersion; }; + targetPlatform = stdenv.targetPlatform // { inherit darwinMinVersion darwinSdkVersion; }; + }; + + stdenvs = { + stdenv = mkStdenv stdenv; + } // builtins.listToAttrs (map + (v: { + name = "llvmPackages_${v}"; + value = pkgs."llvmPackages_${v}" // { + stdenv = mkStdenv pkgs."llvmPackages_${v}".stdenv; + clang = mkCc pkgs."llvmPackages_${v}".clang; + }; + }) + [ "12" "13" "14" "15" "16" ] + ); + + callPackage = newScope (packages // pkgs.darwin // { inherit MacOSX-SDK; }); + + packages = stdenvs // { + inherit (callPackage ./apple_sdk.nix { }) frameworks libs; + + # TODO: this is nice to be private. is it worth the callPackage above? + # Probably, I don't think that callPackage costs much at all. + inherit MacOSX-SDK CLTools_Executables; + + Libsystem = callPackage ./libSystem.nix { }; + LibsystemCross = pkgs.darwin.Libsystem; + libcharset = callPackage ./libcharset.nix { }; + libcompression = callPackage ./libcompression.nix { }; + libunwind = callPackage ./libunwind.nix { }; + libnetwork = callPackage ./libnetwork.nix { }; + libpm = callPackage ./libpm.nix { }; + # Avoid introducing a new objc4 if stdenv already has one, to prevent + # conflicting LLVM modules. + objc4 = stdenv.objc4 or (callPackage ./libobjc.nix { }); + + sdkRoot = pkgs.callPackage ../apple-sdk/sdkRoot.nix { sdkVersion = "11.0"; }; + + # questionable aliases + configd = pkgs.darwin.apple_sdk.frameworks.SystemConfiguration; + inherit (pkgs.darwin.apple_sdk.frameworks) IOKit; + + xcodebuild = pkgs.xcbuild.override { + inherit (pkgs.darwin.apple_sdk_11_0) stdenv; + inherit (pkgs.darwin.apple_sdk_11_0.frameworks) CoreServices CoreGraphics ImageIO; + }; + + rustPlatform = pkgs.makeRustPlatform { + inherit (pkgs.darwin.apple_sdk_11_0) stdenv; + inherit (pkgs) rustc cargo; + } // { + inherit (pkgs.callPackage ../../../build-support/rust/hooks { + inherit (pkgs.darwin.apple_sdk_11_0) stdenv; + inherit (pkgs) cargo rustc; + clang = mkCc pkgs.clang; + }) bindgenHook; + }; + + callPackage = newScope (lib.optionalAttrs stdenv.isDarwin (stdenvs // rec { + inherit (pkgs.darwin.apple_sdk_11_0) xcodebuild rustPlatform; + darwin = pkgs.darwin.overrideScope (_: prev: { + inherit (prev.darwin.apple_sdk_11_0) + IOKit + Libsystem + LibsystemCross + Security + configd + libcharset + libunwind + objc4 + ; + apple_sdk = prev.darwin.apple_sdk_11_0; + CF = prev.darwin.apple_sdk_11_0.CoreFoundation; + }); + xcbuild = xcodebuild; + })); + + darwin-stubs = stdenvNoCC.mkDerivation { + pname = "darwin-stubs"; + inherit (MacOSX-SDK) version; + + buildCommand = '' + mkdir -p "$out" + ln -s ${MacOSX-SDK}/System "$out/System" + ln -s ${MacOSX-SDK}/usr "$out/usr" + ''; + }; + }; +in packages diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/frameworks.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/frameworks.nix new file mode 100644 index 0000000..fa6945f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/frameworks.nix @@ -0,0 +1,196 @@ +# This file is generated by gen-frameworks.nix. +# Do not edit, put overrides in apple_sdk.nix instead. +{ libs, frameworks }: with libs; with frameworks; +{ + AGL = { inherit Carbon OpenGL; }; + AVFoundation = { inherit AudioToolbox CoreAudio CoreAudioTypes CoreFoundation CoreGraphics CoreImage CoreMIDI CoreMedia CoreVideo Foundation IOKit ImageIO MediaToolbox Metal QuartzCore UniformTypeIdentifiers simd; }; + AVKit = { inherit AVFoundation AppKit Cocoa Foundation; }; + Accelerate = { inherit CoreFoundation CoreGraphics CoreVideo Foundation IOKit Metal; }; + Accessibility = { inherit CoreGraphics Foundation; }; + Accounts = { inherit Foundation; }; + AdServices = { inherit Foundation; }; + AdSupport = { inherit Foundation; }; + AddressBook = { inherit Carbon Cocoa CoreFoundation Foundation; }; + AppKit = { inherit ApplicationServices CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal OpenGL QuartzCore; }; + AppTrackingTransparency = { inherit Foundation; }; + AppleScriptKit = {}; + AppleScriptObjC = { inherit Foundation; }; + ApplicationServices = { inherit ColorSync CoreFoundation CoreGraphics CoreServices CoreText ImageIO; }; + AudioToolbox = { inherit Carbon CoreAudio CoreAudioTypes CoreFoundation CoreMIDI Foundation; }; + AudioUnit = { inherit AudioToolbox; }; + AudioVideoBridging = { inherit Foundation IOKit; }; + AuthenticationServices = { inherit AppKit Foundation; }; + AutomaticAssessmentConfiguration = { inherit Foundation; }; + Automator = { inherit AppKit Cocoa Foundation OSAKit; }; + BackgroundTasks = { inherit Foundation; }; + BusinessChat = { inherit Cocoa Foundation; }; + CFNetwork = { inherit CoreFoundation; }; + CalendarStore = {}; + CallKit = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + Carbon = { inherit ApplicationServices CoreServices Foundation Security; }; + ClassKit = { inherit CoreGraphics Foundation; }; + CloudKit = { inherit CoreFoundation CoreGraphics CoreLocation Foundation IOKit; }; + Cocoa = { inherit AppKit CoreData Foundation; }; + Collaboration = { inherit AppKit CoreServices Foundation; }; + ColorSync = { inherit CoreFoundation; }; + Combine = {}; + Contacts = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + ContactsUI = { inherit AppKit; }; + CoreAudio = { inherit CoreAudioTypes CoreFoundation; }; + CoreAudioKit = { inherit AppKit AudioUnit Cocoa Foundation; }; + CoreAudioTypes = { inherit CoreFoundation; }; + CoreBluetooth = { inherit Foundation; }; + CoreData = { inherit CloudKit Combine CoreFoundation CoreGraphics CoreLocation Foundation IOKit; }; + CoreDisplay = {}; + CoreFoundation = {}; + CoreGraphics = { inherit CoreFoundation IOKit; }; + CoreHaptics = { inherit Foundation; }; + CoreImage = { inherit ApplicationServices CoreFoundation CoreGraphics CoreVideo Foundation IOKit IOSurface ImageIO Metal OpenGL; }; + CoreLocation = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + CoreMIDI = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + CoreMIDIServer = {}; + CoreML = { inherit CoreFoundation CoreGraphics CoreVideo Foundation IOKit ImageIO Metal; }; + CoreMedia = { inherit CoreAudio CoreAudioTypes CoreFoundation CoreGraphics CoreVideo Foundation IOKit Metal; }; + CoreMediaIO = { inherit CoreFoundation CoreMedia; }; + CoreMotion = { inherit Foundation; }; + CoreServices = { inherit CFNetwork CoreFoundation DiskArbitration Security; }; + CoreSpotlight = { inherit Foundation UniformTypeIdentifiers; }; + CoreTelephony = {}; + CoreText = { inherit CoreFoundation CoreGraphics; }; + CoreVideo = { inherit ApplicationServices CoreFoundation CoreGraphics IOSurface Metal OpenGL; }; + CoreWLAN = { inherit Foundation IOKit; }; + CryptoKit = { inherit CoreFoundation CoreGraphics Foundation IOKit LocalAuthentication Security; }; + CryptoTokenKit = { inherit CoreFoundation CoreGraphics Foundation IOKit Security; }; + DVDPlayback = { inherit ApplicationServices CoreFoundation Security; }; + DeveloperToolsSupport = { inherit Foundation; }; + DeviceCheck = { inherit Foundation; }; + DirectoryService = { inherit CoreFoundation; }; + DiscRecording = { inherit CoreServices Foundation; }; + DiscRecordingUI = { inherit Carbon Cocoa DiscRecording; }; + DiskArbitration = { inherit CoreFoundation IOKit; }; + DriverKit = {}; + EventKit = { inherit CoreGraphics CoreLocation Foundation; }; + ExceptionHandling = { inherit Foundation; }; + ExecutionPolicy = { inherit Foundation; }; + ExternalAccessory = { inherit Foundation; }; + FWAUserLib = { inherit IOKit; }; + FileProvider = { inherit CoreGraphics Foundation; }; + FileProviderUI = { inherit AppKit FileProvider Foundation; }; + FinderSync = { inherit AppKit Foundation; }; + ForceFeedback = { inherit CoreFoundation IOKit; }; + Foundation = { inherit ApplicationServices Combine CoreFoundation CoreGraphics CoreServices IOKit Security; }; + GLKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal ModelIO OpenGL QuartzCore simd; }; + GLUT = { inherit OpenGL; }; + GSS = { inherit CoreFoundation; }; + GameController = { inherit AppKit Foundation IOKit; }; + GameKit = { inherit AppKit Cocoa Contacts CoreGraphics Foundation GameController GameplayKit Metal MetalKit ModelIO SceneKit SpriteKit simd; }; + GameplayKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation GLKit IOKit Metal ModelIO QuartzCore SceneKit SpriteKit simd; }; + HIDDriverKit = { inherit IOKit USBDriverKit; }; + Hypervisor = {}; + ICADevices = { inherit CoreFoundation CoreGraphics CoreServices IOBluetooth; }; + IMServicePlugIn = { inherit Foundation; }; + IOBluetooth = { inherit CoreAudio CoreFoundation CoreServices Foundation IOKit; }; + IOBluetoothUI = { inherit Cocoa IOBluetooth; }; + IOKit = { inherit CoreFoundation; }; + IOSurface = { inherit CoreFoundation Foundation IOKit; }; + IOUSBHost = { inherit Foundation IOKit; }; + IdentityLookup = { inherit Foundation; }; + ImageCaptureCore = { inherit Cocoa CoreGraphics Foundation; }; + ImageIO = { inherit CoreFoundation CoreGraphics; }; + InputMethodKit = { inherit Carbon Cocoa Foundation; }; + InstallerPlugins = {}; + InstantMessage = {}; + Intents = { inherit CoreFoundation CoreGraphics CoreLocation Foundation IOKit; }; + JavaNativeFoundation = { inherit Foundation; }; + JavaRuntimeSupport = { inherit ApplicationServices Cocoa Foundation QuartzCore; }; + JavaScriptCore = { inherit CoreFoundation CoreGraphics Foundation; }; + Kerberos = {}; + Kernel = {}; + KernelManagement = { inherit Foundation; }; + LDAP = {}; + LatentSemanticMapping = { inherit Carbon CoreFoundation; }; + LinkPresentation = { inherit AppKit Foundation; }; + LocalAuthentication = { inherit Foundation; }; + MLCompute = { inherit CoreFoundation CoreGraphics Foundation IOKit Metal; }; + MapKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal QuartzCore; }; + MediaAccessibility = { inherit CoreFoundation CoreGraphics CoreText QuartzCore; }; + MediaLibrary = { inherit Foundation; }; + MediaPlayer = { inherit AVFoundation CoreGraphics Foundation; }; + MediaToolbox = { inherit AudioToolbox CoreFoundation CoreMedia; }; + Message = {}; + Metal = { inherit CoreFoundation CoreGraphics Foundation IOKit IOSurface; }; + MetalKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal ModelIO QuartzCore simd; }; + MetalPerformanceShaders = { inherit CoreGraphics Foundation Metal simd; }; + MetalPerformanceShadersGraph = { inherit Foundation MetalPerformanceShaders; }; + MetricKit = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + ModelIO = { inherit CoreFoundation CoreGraphics Foundation IOKit simd; }; + MultipeerConnectivity = { inherit Cocoa Foundation; }; + NaturalLanguage = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + NearbyInteraction = { inherit CoreFoundation CoreGraphics Foundation IOKit simd; }; + NetFS = { inherit CoreFoundation; }; + Network = { inherit CoreFoundation Foundation Security; }; + NetworkExtension = { inherit Foundation Network Security; }; + NetworkingDriverKit = {}; + NotificationCenter = { inherit AppKit Foundation; }; + OSAKit = { inherit Carbon Cocoa; }; + OSLog = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + OpenAL = {}; + OpenCL = { inherit OpenGL; }; + OpenDirectory = { inherit CoreFoundation Foundation; }; + OpenGL = {}; + PCIDriverKit = { inherit IOKit; }; + PCSC = {}; + PDFKit = { inherit AppKit Cocoa; }; + ParavirtualizedGraphics = { inherit AppKit CoreVideo Foundation IOSurface Metal; }; + PassKit = { inherit AppKit Contacts CoreGraphics Foundation; }; + PencilKit = { inherit AppKit CloudKit Cocoa CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal QuartzCore; }; + Photos = { inherit AVFoundation CoreAudio CoreFoundation CoreGraphics CoreImage CoreLocation CoreMIDI CoreMedia Foundation IOKit ImageIO Metal QuartzCore UniformTypeIdentifiers simd; }; + PhotosUI = { inherit AppKit Foundation MapKit Photos; }; + PreferencePanes = { inherit Cocoa; }; + PushKit = { inherit Foundation; }; + Python = { inherit Carbon; }; + QTKit = {}; + Quartz = { inherit AppKit ApplicationServices Cocoa Foundation ImageCaptureCore OpenGL PDFKit QuartzCore QuickLook; }; + QuartzCore = { inherit CoreFoundation CoreGraphics CoreImage CoreVideo Foundation IOKit Metal OpenGL; }; + QuickLook = { inherit ApplicationServices CoreFoundation; }; + QuickLookThumbnailing = { inherit CoreGraphics Foundation UniformTypeIdentifiers; }; + RealityKit = { inherit AVFoundation AppKit AudioToolbox CloudKit Combine CoreAudio CoreData CoreFoundation CoreGraphics CoreImage CoreLocation CoreMIDI CoreText Foundation IOKit Metal MultipeerConnectivity QuartzCore simd; }; + ReplayKit = { inherit AVFoundation AppKit Foundation; }; + Ruby = {}; + SafariServices = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit Metal QuartzCore; }; + SceneKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation GLKit IOKit Metal ModelIO QuartzCore simd; }; + ScreenSaver = { inherit AppKit Foundation; }; + ScreenTime = { inherit AppKit Foundation; }; + ScriptingBridge = { inherit ApplicationServices CoreServices Foundation; }; + Security = { inherit CoreFoundation; }; + SecurityFoundation = { inherit Foundation Security; }; + SecurityInterface = { inherit AppKit Cocoa Security SecurityFoundation; }; + SensorKit = { inherit CoreFoundation CoreLocation Foundation; }; + ServiceManagement = { inherit CoreFoundation Security; }; + Social = { inherit AppKit Foundation; }; + SoundAnalysis = { inherit AVFoundation CoreML CoreMedia Foundation; }; + Speech = { inherit AVFoundation CoreAudio CoreFoundation CoreGraphics CoreImage CoreMIDI CoreMedia Foundation IOKit Metal QuartzCore UniformTypeIdentifiers simd; }; + SpriteKit = { inherit AppKit CloudKit Cocoa CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation GLKit IOKit Metal ModelIO QuartzCore simd; }; + StoreKit = { inherit AppKit CoreGraphics Foundation; }; + SwiftUI = { inherit AppKit CloudKit Combine CoreData CoreFoundation CoreGraphics CoreImage CoreLocation DeveloperToolsSupport Foundation IOKit Metal QuartzCore UniformTypeIdentifiers; }; + SyncServices = {}; + System = {}; + SystemConfiguration = { inherit CoreFoundation Security; }; + SystemExtensions = { inherit Foundation; }; + TWAIN = {}; + Tcl = {}; + Tk = {}; + USBDriverKit = { inherit IOKit; }; + UniformTypeIdentifiers = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + UserNotifications = { inherit Foundation; }; + UserNotificationsUI = { inherit AppKit; }; + VideoDecodeAcceleration = {}; + VideoSubscriberAccount = { inherit Foundation; }; + VideoToolbox = { inherit CoreFoundation CoreGraphics CoreMedia CoreVideo; }; + Virtualization = { inherit CoreFoundation CoreGraphics Foundation IOKit; }; + Vision = { inherit CoreAudio CoreFoundation CoreGraphics CoreML CoreMedia CoreVideo Foundation IOKit ImageIO Metal simd; }; + WebKit = { inherit AppKit CloudKit CoreData CoreFoundation CoreGraphics CoreImage CoreLocation Foundation IOKit JavaScriptCore Metal OpenGL QuartzCore; }; + WidgetKit = { inherit Combine CoreFoundation CoreGraphics CoreVideo Foundation IOKit Intents Metal SwiftUI; }; + iTunesLibrary = { inherit Foundation; }; + vmnet = {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libSystem.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libSystem.nix new file mode 100644 index 0000000..b661da7 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libSystem.nix @@ -0,0 +1,88 @@ +{ stdenvNoCC, buildPackages, MacOSX-SDK }: + +stdenvNoCC.mkDerivation { + pname = "libSystem"; + version = MacOSX-SDK.version; + + dontBuild = true; + dontUnpack = true; + + nativeBuildInputs = [ buildPackages.darwin.rewrite-tbd ]; + + includeDirs = [ + "CommonCrypto" "_types" "architecture" "arpa" "atm" "bank" "bsd" "bsm" + "corecrypto" "corpses" "default_pager" "device" "dispatch" "hfs" "i386" + "iokit" "kern" "libkern" "mach" "mach-o" "mach_debug" "machine" "malloc" + "miscfs" "net" "netinet" "netinet6" "netkey" "nfs" "os" "osfmk" "pexpert" + "platform" "protocols" "pthread" "rpc" "rpcsvc" "secure" "security" + "servers" "sys" "uuid" "vfs" "voucher" "xlocale" + ] ++ [ + "arm" "xpc" "arm64" + ]; + + csu = [ + "bundle1.o" "crt0.o" "crt1.10.5.o" "crt1.10.6.o" "crt1.o" "dylib1.10.5.o" + "dylib1.o" "gcrt1.o" "lazydylib1.o" + ]; + + installPhase = '' + mkdir -p $out/{include,lib/swift} + + for dir in $includeDirs; do + from=${MacOSX-SDK}/usr/include/$dir + if [ -e "$from" ]; then + cp -dr $from $out/include + else + echo "Header directory '$from' doesn't exist: skipping" + fi + done + + cp -d \ + ${MacOSX-SDK}/usr/include/*.h \ + ${MacOSX-SDK}/usr/include/*.modulemap \ + ${MacOSX-SDK}/usr/include/*.apinotes \ + $out/include + + rm $out/include/tk*.h $out/include/tcl*.h + + cp -dr \ + ${MacOSX-SDK}/usr/lib/libSystem.* \ + ${MacOSX-SDK}/usr/lib/system \ + $out/lib + + # Extra libraries + for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.1 resolv; do + cp -d \ + ${MacOSX-SDK}/usr/lib/lib$name.tbd \ + ${MacOSX-SDK}/usr/lib/lib$name.*.tbd \ + $out/lib + done + + for name in os Dispatch; do + cp -dr \ + ${MacOSX-SDK}/usr/lib/swift/$name.swiftmodule \ + ${MacOSX-SDK}/usr/lib/swift/libswift$name.tbd \ + $out/lib/swift + done + + for f in $csu; do + from=${MacOSX-SDK}/usr/lib/$f + if [ -e "$from" ]; then + cp -d $from $out/lib + else + echo "Csu file '$from' doesn't exist: skipping" + fi + done + + chmod u+w -R $out/lib + find $out -name '*.tbd' -type f | while read tbd; do + rewrite-tbd \ + -c /usr/lib/libsystem.dylib:$out/lib/libsystem.dylib \ + -p /usr/lib/system/:$out/lib/system/ \ + -p /usr/lib/swift/:$out/lib/swift/ \ + -r ${builtins.storeDir} \ + "$tbd" + done + ''; +} + diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcharset.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcharset.nix new file mode 100644 index 0000000..bf55037 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcharset.nix @@ -0,0 +1,16 @@ +{ stdenvNoCC, buildPackages, MacOSX-SDK }: + +stdenvNoCC.mkDerivation { + pname = "libcharset"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + nativeBuildInputs = [ buildPackages.darwin.checkReexportsHook ]; + + installPhase = '' + mkdir -p $out/{include,lib} + cp ${MacOSX-SDK}/usr/lib/libcharset* $out/lib + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcompression.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcompression.nix new file mode 100644 index 0000000..92a45b7 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libcompression.nix @@ -0,0 +1,20 @@ +{ stdenvNoCC, buildPackages, MacOSX-SDK }: + +let self = stdenvNoCC.mkDerivation { + pname = "libcompression"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/lib + cp ${MacOSX-SDK}/usr/lib/libcompression* $out/lib + ''; + + passthru = { + tbdRewrites = { + const."/usr/lib/libcompression.dylib" = "${self}/lib/libcompression.dylib"; + }; + }; +}; in self diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libnetwork.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libnetwork.nix new file mode 100644 index 0000000..2e5c059 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libnetwork.nix @@ -0,0 +1,20 @@ +{ stdenvNoCC, buildPackages, MacOSX-SDK }: + +let self = stdenvNoCC.mkDerivation { + pname = "libnetwork"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/lib + cp ${MacOSX-SDK}/usr/lib/libnetwork* $out/lib + ''; + + passthru = { + tbdRewrites = { + const."/usr/lib/libnetwork.dylib" = "${self}/lib/libnetwork.dylib"; + }; + }; +}; in self diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libobjc.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libobjc.nix new file mode 100644 index 0000000..9288097 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libobjc.nix @@ -0,0 +1,24 @@ +{ stdenvNoCC, MacOSX-SDK, libcharset }: + +let self = stdenvNoCC.mkDerivation { + pname = "libobjc"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/{include,lib/swift} + cp -r ${MacOSX-SDK}/usr/include/objc $out/include + cp ${MacOSX-SDK}/usr/lib/libobjc* $out/lib + cp -r ${MacOSX-SDK}/usr/lib/swift/ObjectiveC.swiftmodule $out/lib/swift + cp ${MacOSX-SDK}/usr/lib/swift/libswiftObjectiveC.tbd $out/lib/swift + ''; + + passthru = { + tbdRewrites = { + const."/usr/lib/libobjc.A.dylib" = "${self}/lib/libobjc.A.dylib"; + const."/usr/lib/swift/libswiftObjectiveC.dylib" = "${self}/lib/swift/libswiftObjectiveC.dylib"; + }; + }; +}; in self diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libpm.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libpm.nix new file mode 100644 index 0000000..995f2b2 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libpm.nix @@ -0,0 +1,23 @@ +{ stdenvNoCC, MacOSX-SDK, checkReexportsHook }: + +stdenvNoCC.mkDerivation { + pname = "libpm"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + nativeBuildInputs = [ checkReexportsHook ]; + + installPhase = '' + mkdir -p $out/lib + cp ${MacOSX-SDK}/usr/lib/libpm* $out/lib + ''; + + passthru = { + tbdRewrites = { + const."/usr/lib/libpmenergy.dylib" = "${placeholder "out"}/lib/libpmenergy.dylib"; + const."/usr/lib/libpmsample.dylib" = "${placeholder "out"}/lib/libpmsample.dylib"; + }; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libunwind.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libunwind.nix new file mode 100644 index 0000000..885780e --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/libunwind.nix @@ -0,0 +1,24 @@ +{ stdenvNoCC, buildPackages, MacOSX-SDK }: + +stdenvNoCC.mkDerivation { + pname = "libunwind"; + version = MacOSX-SDK.version; + + dontUnpack = true; + dontBuild = true; + + nativeBuildInputs = [ buildPackages.darwin.checkReexportsHook ]; + + installPhase = '' + mkdir -p $out/include/mach-o + + cp \ + ${MacOSX-SDK}/usr/include/libunwind.h \ + ${MacOSX-SDK}/usr/include/unwind.h \ + $out/include + + cp \ + ${MacOSX-SDK}/usr/include/mach-o/compact_unwind_encoding.h \ + $out/include/mach-o + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/private-frameworks.nix b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/private-frameworks.nix new file mode 100644 index 0000000..4566c8a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk-11.0/private-frameworks.nix @@ -0,0 +1,32 @@ +{ frameworks, libobjc }: with frameworks; +# generated by hand to avoid exposing all private frameworks +# frameworks here are only the necessary ones used by public frameworks. +{ + Apple80211 = {}; + AVFCapture = {}; + AVFCore = {}; + AddressBookCore = { inherit ContactsPersistence; }; + AudioToolboxCore = {}; + ContactsPersistence = {}; + GameCenterFoundation = {}; + GameCenterUI = {}; + GameCenterUICore = {}; + MediaRemote = {}; + PassKitCore = {}; + SignpostMetrics = {}; + SkyLight = {}; + UIFoundation = {}; + URLFormatting = {}; + + # Also expose CoreSymbolication; used by `root` package. + CoreSymbolication = {}; + + # Also expose DebugSymbols; used by `llvmPackages_8.lldb` package. + DebugSymbols = {}; + + # Also expose DisplayServices; used by `sketchybar` package. + DisplayServices = { inherit libobjc; }; + + # Also expose MultitouchSupport; used by `chuck` package. + MultitouchSupport = {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/cf-setup-hook.sh b/pkgs/by-name/da/darwin/packages/apple-sdk/cf-setup-hook.sh new file mode 100644 index 0000000..5d0f58f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/cf-setup-hook.sh @@ -0,0 +1,9 @@ +linkSystemCoreFoundationFramework() { + NIX_CFLAGS_COMPILE="-F@out@/Library/Frameworks${NIX_CFLAGS_COMPILE:+ }${NIX_CFLAGS_COMPILE-}" + # gross! many symbols (such as _OBJC_CLASS_$_NSArray) are defined in system CF, but not + # in the opensource release + # if the package needs private headers, we assume they also want to link with system CF + NIX_LDFLAGS+=" @out@/Library/Frameworks/CoreFoundation.framework/CoreFoundation.tbd" +} + +preConfigureHooks+=(linkSystemCoreFoundationFramework) diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/default.nix b/pkgs/by-name/da/darwin/packages/apple-sdk/default.nix new file mode 100644 index 0000000..a3d1df0 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/default.nix @@ -0,0 +1,362 @@ +{ stdenv, fetchurl, cpio, pbzx, pkgs, lib, darwin-stubs, print-reexports }: + +let + # sadly needs to be exported because security_tool needs it + sdk = stdenv.mkDerivation rec { + pname = "MacOS_SDK"; + version = "10.12"; + + # This URL comes from https://swscan.apple.com/content/catalogs/others/index-10.12.merged-1.sucatalog, which we found by: + # 1. Google: site:swscan.apple.com and look for a name that seems appropriate for your version + # 2. In the resulting file, search for a file called DevSDK ending in .pkg + # 3. ??? + # 4. Profit + src = fetchurl { + url = "http://swcdn.apple.com/content/downloads/33/36/041-90419-A_7JJ4H9ZHO2/xs88ob5wjz6riz7g6764twblnvksusg4ps/DevSDK_OSX1012.pkg"; + sha256 = "13xq34sb7383b37hwy076gnhf96prpk1b4087p87xnwswxbrisih"; + }; + + nativeBuildInputs = [ cpio pbzx ]; + + outputs = [ "out" "dev" "man" ]; + + unpackPhase = '' + pbzx $src | cpio -idm + ''; + + sourceRoot = "."; + + installPhase = '' + mkdir -p $out + + cp -R System/Library $out + cp -R usr/* $out + + pushd $out/lib + cp ${darwin-stubs}/usr/lib/libcups*.tbd . + ln -s libcups.2.tbd libcups.tbd + ln -s libcupscgi.1.tbd libcupscgi.tbd + ln -s libcupsimage.2.tbd libcupsimage.tbd + ln -s libcupsmime.1.tbd libcupsmime.tbd + ln -s libcupsppdc.1.tbd libcupsppdc.tbd + popd + ''; + + meta = with lib; { + description = "Apple SDK ${version}"; + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + }; + }; + + mkFrameworkSubs = name: deps: + let + deps' = deps // { "${name}" = placeholder "out"; }; + substArgs = lib.concatMap (x: [ "--subst-var-by" x deps'."${x}" ]) (lib.attrNames deps'); + in lib.escapeShellArgs substArgs; + + framework = name: deps: stdenv.mkDerivation { + name = "apple-framework-${name}"; + + dontUnpack = true; + + # because we copy files from the system + preferLocalBuild = true; + + disallowedRequisites = [ sdk ]; + + nativeBuildInputs = [ print-reexports ]; + + extraTBDFiles = []; + + installPhase = '' + linkFramework() { + local path="$1" + local nested_path="$1" + if [ "$path" == "JavaNativeFoundation.framework" ]; then + local nested_path="JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework" + fi + if [ "$path" == "JavaRuntimeSupport.framework" ]; then + local nested_path="JavaVM.framework/Versions/A/Frameworks/JavaRuntimeSupport.framework" + fi + local name="$(basename "$path" .framework)" + local current="$(readlink "/System/Library/Frameworks/$nested_path/Versions/Current")" + if [ -z "$current" ]; then + current=A + fi + + local dest="$out/Library/Frameworks/$path" + + mkdir -p "$dest/Versions/$current" + pushd "$dest/Versions/$current" >/dev/null + + if [ -d "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" ]; then + cp -R "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current/Headers" . + elif [ -d "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" ]; then + current="$(readlink "/System/Library/Frameworks/$name.framework/Versions/Current")" + cp -R "${sdk.out}/Library/Frameworks/$name.framework/Versions/$current/Headers" . + fi + + local tbd_source=${darwin-stubs}/System/Library/Frameworks/$nested_path/Versions/$current + if [ "${name}" != "Kernel" ]; then + # The Kernel.framework has headers but no actual library component. + cp -v $tbd_source/*.tbd . + fi + + if [ -d "$tbd_source/Libraries" ]; then + mkdir Libraries + cp -v $tbd_source/Libraries/*.tbd Libraries/ + fi + + ln -s -L "/System/Library/Frameworks/$nested_path/Versions/$current/Resources" + + if [ -f "/System/Library/Frameworks/$nested_path/module.map" ]; then + ln -s "/System/Library/Frameworks/$nested_path/module.map" + fi + + pushd "${sdk.out}/Library/Frameworks/$nested_path/Versions/$current" >/dev/null + local children=$(echo Frameworks/*.framework) + popd >/dev/null + + for child in $children; do + childpath="$path/Versions/$current/$child" + linkFramework "$childpath" + done + + pushd ../.. >/dev/null + ln -s "$current" Versions/Current + ln -s Versions/Current/* . + popd >/dev/null + + popd >/dev/null + } + + linkFramework "${name}.framework" + + # linkFramework is recursive, the rest of the processing is not. + + local tbd_source=${darwin-stubs}/System/Library/Frameworks/${name}.framework + for tbd in $extraTBDFiles; do + local tbd_dest_dir=$out/Library/Frameworks/${name}.framework/$(dirname "$tbd") + mkdir -p "$tbd_dest_dir" + cp -v "$tbd_source/$tbd" "$tbd_dest_dir" + done + + # Fix and check tbd re-export references + find $out -name '*.tbd' | while read tbd; do + echo "Fixing re-exports in $tbd" + substituteInPlace "$tbd" ${mkFrameworkSubs name deps} + + echo "Checking re-exports in $tbd" + print-reexports "$tbd" | while read target; do + local expected="''${target%.dylib}.tbd" + if ! [ -e "$expected" ]; then + echo -e "Re-export missing:\n\t$target\n\t(expected $expected)" + echo -e "While processing\n\t$tbd" + exit 1 + else + echo "Re-exported target $target ok" + fi + done + done + ''; + + propagatedBuildInputs = builtins.attrValues deps; + + # don't use pure CF for dylibs that depend on frameworks + setupHook = ./framework-setup-hook.sh; + + # Not going to be more specific than this for now + __propagatedImpureHostDeps = lib.optionals (name != "Kernel") [ + # The setup-hook ensures that everyone uses the impure CoreFoundation who uses these SDK frameworks, so let's expose it + "/System/Library/Frameworks/CoreFoundation.framework" + "/System/Library/Frameworks/${name}.framework" + "/System/Library/Frameworks/${name}.framework/${name}" + ]; + + meta = with lib; { + description = "Apple SDK framework ${name}"; + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + }; + }; + + tbdOnlyFramework = name: { private ? true }: stdenv.mkDerivation { + name = "apple-framework-${name}"; + dontUnpack = true; + installPhase = '' + mkdir -p $out/Library/Frameworks/ + cp -r ${darwin-stubs}/System/Library/${lib.optionalString private "Private"}Frameworks/${name}.framework \ + $out/Library/Frameworks + + cd $out/Library/Frameworks/${name}.framework + + versions=(./Versions/*) + if [ "''${#versions[@]}" != 1 ]; then + echo "Unable to determine current version of framework ${name}" + exit 1 + fi + current=$(basename ''${versions[0]}) + + chmod u+w -R . + ln -s "$current" Versions/Current + ln -s Versions/Current/* . + + # NOTE there's no re-export checking here, this is probably wrong + ''; + }; +in rec { + libs = { + xpc = stdenv.mkDerivation { + name = "apple-lib-xpc"; + dontUnpack = true; + + installPhase = '' + mkdir -p $out/include + pushd $out/include >/dev/null + cp -r "${lib.getDev sdk}/include/xpc" $out/include/xpc + cp "${lib.getDev sdk}/include/launch.h" $out/include/launch.h + popd >/dev/null + ''; + }; + + Xplugin = stdenv.mkDerivation { + name = "apple-lib-Xplugin"; + dontUnpack = true; + + # Not enough + __propagatedImpureHostDeps = [ "/usr/lib/libXplugin.1.dylib" ]; + + propagatedBuildInputs = with frameworks; [ + OpenGL ApplicationServices Carbon IOKit CoreGraphics CoreServices CoreText + ]; + + installPhase = '' + mkdir -p $out/include $out/lib + ln -s "${lib.getDev sdk}/include/Xplugin.h" $out/include/Xplugin.h + cp ${darwin-stubs}/usr/lib/libXplugin.1.tbd $out/lib + ln -s libXplugin.1.tbd $out/lib/libXplugin.tbd + ''; + }; + + utmp = stdenv.mkDerivation { + name = "apple-lib-utmp"; + dontUnpack = true; + + installPhase = '' + mkdir -p $out/include + pushd $out/include >/dev/null + ln -s "${lib.getDev sdk}/include/utmp.h" + ln -s "${lib.getDev sdk}/include/utmpx.h" + popd >/dev/null + ''; + }; + + sandbox = stdenv.mkDerivation { + name = "apple-lib-sandbox"; + dontUnpack = true; + + installPhase = '' + mkdir -p $out/include $out/lib + ln -s "${lib.getDev sdk}/include/sandbox.h" $out/include/sandbox.h + cp "${darwin-stubs}/usr/lib/libsandbox.1.tbd" $out/lib + ln -s libsandbox.1.tbd $out/lib/libsandbox.tbd + ''; + }; + }; + + overrides = super: { + AppKit = lib.overrideDerivation super.AppKit (drv: { + __propagatedImpureHostDeps = drv.__propagatedImpureHostDeps or [] ++ [ + "/System/Library/PrivateFrameworks/" + ]; + }); + + Carbon = lib.overrideDerivation super.Carbon (drv: { + extraTBDFiles = [ "Versions/A/Frameworks/HTMLRendering.framework/Versions/A/HTMLRendering.tbd" ]; + }); + + CoreFoundation = lib.overrideDerivation super.CoreFoundation (drv: { + setupHook = ./cf-setup-hook.sh; + }); + + CoreMedia = lib.overrideDerivation super.CoreMedia (drv: { + __propagatedImpureHostDeps = drv.__propagatedImpureHostDeps or [] ++ [ + "/System/Library/Frameworks/CoreImage.framework" + ]; + }); + + CoreMIDI = lib.overrideDerivation super.CoreMIDI (drv: { + __propagatedImpureHostDeps = drv.__propagatedImpureHostDeps or [] ++ [ + "/System/Library/PrivateFrameworks/" + ]; + setupHook = ./private-frameworks-setup-hook.sh; + }); + + IMServicePlugIn = lib.overrideDerivation super.IMServicePlugIn (drv: { + extraTBDFiles = [ "Versions/A/Frameworks/IMServicePlugInSupport.framework/Versions/A/IMServicePlugInSupport.tbd" ]; + }); + + Security = lib.overrideDerivation super.Security (drv: { + setupHook = ./security-setup-hook.sh; + }); + + QuartzCore = lib.overrideDerivation super.QuartzCore (drv: { + installPhase = drv.installPhase + '' + f="$out/Library/Frameworks/QuartzCore.framework/Headers/CoreImage.h" + substituteInPlace "$f" \ + --replace "QuartzCore/../Frameworks/CoreImage.framework/Headers" "CoreImage" + ''; + }); + + MetalKit = lib.overrideDerivation super.MetalKit (drv: { + installPhase = drv.installPhase + '' + mkdir -p $out/include/simd + cp ${lib.getDev sdk}/include/simd/*.h $out/include/simd/ + ''; + }); + + System = lib.overrideDerivation super.System (drv: { + installPhase = '' + mkdir -p $out/Library/Frameworks/System.framework/Versions/B + ln -s $out/Library/Frameworks/System.framework/Versions/{B,Current} + ln -s ${pkgs.darwin.Libsystem}/lib/libSystem.B.tbd $out/Library/Frameworks/System.framework/Versions/B/System.tbd + ln -s $out/Library/Frameworks/System.framework/{Versions/Current/,}System.tbd + ''; + }); + + WebKit = lib.overrideDerivation super.WebKit (drv: { + extraTBDFiles = [ + "Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore.tbd" + "Versions/A/Frameworks/WebKitLegacy.framework/Versions/A/WebKitLegacy.tbd" + ]; + }); + } // lib.genAttrs [ + "ContactsPersistence" + "CoreSymbolication" + "DebugSymbols" + "DisplayServices" + "GameCenter" + "MultitouchSupport" + "SkyLight" + "UIFoundation" + ] + (x: tbdOnlyFramework x {}); + + bareFrameworks = lib.mapAttrs framework (import ./frameworks.nix { + inherit frameworks libs; + inherit (pkgs.darwin) libobjc; + }); + + frameworks = bareFrameworks // overrides bareFrameworks; + + inherit darwin-stubs; + + objc4 = pkgs.darwin.libobjc; + + sdkRoot = pkgs.callPackage ./sdkRoot.nix { sdkVersion = "10.12"; }; + + inherit (pkgs.darwin) Libsystem; + + inherit sdk; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/framework-setup-hook.sh b/pkgs/by-name/da/darwin/packages/apple-sdk/framework-setup-hook.sh new file mode 100644 index 0000000..b0d5915 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/framework-setup-hook.sh @@ -0,0 +1,42 @@ +# On macOS, frameworks are linked to the system CoreFoundation but +# dynamic libraries built with nix use a pure version of CF this +# causes segfaults for binaries that depend on it at runtime. This +# can be solved in two ways. +# 1. Rewrite references to the pure CF using this setup hook, this +# works for the simple case but this can still cause problems if other +# dependencies (eg. python) use the pure CF. +# 2. Create a wrapper for the binary that sets DYLD_FRAMEWORK_PATH to +# /System/Library/Frameworks. This will make everything load the +# system's CoreFoundation framework while still keeping the +# dependencies pure for other packages. + +fixupOutputHooks+=('fixDarwinFrameworksIn $prefix') + +fixDarwinFrameworks() { + local systemPrefix='/System/Library/Frameworks' + + for fn in "$@"; do + if [ -L "$fn" ]; then continue; fi + echo "$fn: fixing dylib" + + for framework in $(otool -L "$fn" | awk '/CoreFoundation\.framework/ {print $1}'); do + install_name_tool -change "$framework" "$systemPrefix/CoreFoundation.framework/Versions/A/CoreFoundation" "$fn" >&2 + done + done +} + +fixDarwinFrameworksIn() { + local dir="$1" + fixDarwinFrameworks $(find "$dir" -name "*.dylib") +} + + +# This configures the stdenv to use /System/Library/Frameworks/CoreFoundation.framework +# instead of the nix version by including the system frameworks path +# as an rpath entry when creating binaries. + +useSystemCoreFoundationFramework () { + export NIX_COREFOUNDATION_RPATH=/System/Library/Frameworks +} + +addEnvHooks "$hostOffset" useSystemCoreFoundationFramework diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/frameworks.nix b/pkgs/by-name/da/darwin/packages/apple-sdk/frameworks.nix new file mode 100644 index 0000000..a9fbcc0 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/frameworks.nix @@ -0,0 +1,130 @@ +# Current as of 10.12 +# Epic weird knot-tying happening here. +# TODO: clean up the process for generating this and include it + +{ frameworks, libs, libobjc, }: + +with frameworks; with libs; { + AGL = { inherit Carbon OpenGL; }; + AVFoundation = { inherit ApplicationServices CoreGraphics CoreMedia MediaToolbox; }; + AVKit = {}; + Accounts = {}; + AddressBook = { inherit libobjc Carbon ContactsPersistence; }; + AppKit = { inherit ApplicationServices AudioToolbox AudioUnit Foundation QuartzCore UIFoundation; }; + AppKitScripting = {}; + AppleScriptKit = {}; + AppleScriptObjC = {}; + AudioToolbox = { inherit CoreAudio CoreMIDI; }; + AudioUnit = { inherit AudioToolbox Carbon CoreAudio; }; + AudioVideoBridging = { inherit Foundation; }; + Automator = {}; + CFNetwork = {}; + CalendarStore = {}; + Cocoa = { inherit AppKit CoreData; }; + Collaboration = {}; + # Impure version of CoreFoundation, this should not be used unless another + # framework includes headers that are not available in the pure version. + CoreFoundation = {}; + CoreAudio = { inherit IOKit; }; + CoreAudioKit = { inherit AudioUnit; }; + CoreData = {}; + CoreGraphics = { inherit Accelerate IOKit IOSurface SystemConfiguration; }; + CoreImage = {}; + CoreLocation = {}; + CoreMIDI = {}; + CoreMIDIServer = { inherit CoreMIDI; }; + CoreMedia = { inherit ApplicationServices AudioToolbox AudioUnit CoreAudio CoreGraphics CoreVideo; }; + CoreMediaIO = { inherit CoreMedia; }; + CoreText = { inherit CoreGraphics; }; + CoreVideo = { inherit ApplicationServices CoreGraphics IOSurface OpenGL; }; + CoreWLAN = { inherit SecurityFoundation; }; + DVDPlayback = {}; + DirectoryService = {}; + DiscRecording = { inherit libobjc CoreServices IOKit; }; + DiscRecordingUI = {}; + DiskArbitration = { inherit IOKit; }; + EventKit = {}; + ExceptionHandling = {}; + FWAUserLib = {}; + ForceFeedback = { inherit IOKit; }; + Foundation = { inherit libobjc CoreFoundation Security ApplicationServices SystemConfiguration; }; + GLKit = {}; + GLUT = { inherit OpenGL; }; + GSS = {}; + GameCenter = {}; + GameController = {}; + GameKit = { inherit Cocoa Foundation GameCenter GameController GameplayKit Metal MetalKit ModelIO SceneKit SpriteKit; }; + GameplayKit = {}; + Hypervisor = {}; + ICADevices = { inherit libobjc Carbon IOBluetooth; }; + IMServicePlugIn = {}; + IOBluetoothUI = { inherit IOBluetooth; }; + IOKit = {}; + IOSurface = { inherit IOKit xpc; }; + ImageCaptureCore = {}; + ImageIO = { inherit CoreGraphics; }; + InputMethodKit = { inherit Carbon; }; + InstallerPlugins = {}; + InstantMessage = {}; + JavaFrameEmbedding = {}; + JavaNativeFoundation = {}; + JavaRuntimeSupport = {}; + JavaScriptCore = { inherit libobjc; }; + Kerberos = {}; + Kernel = { inherit IOKit; }; + LDAP = {}; + LatentSemanticMapping = { inherit Carbon; }; + LocalAuthentication = {}; + MapKit = {}; + MediaAccessibility = { inherit CoreGraphics CoreText QuartzCore; }; + MediaPlayer = {}; + MediaToolbox = { inherit AudioToolbox AudioUnit CoreMedia; }; + Metal = {}; + MetalKit = { inherit ModelIO Metal; }; + ModelIO = {}; + NetFS = {}; + OSAKit = { inherit Carbon; }; + OpenAL = {}; + OpenCL = { inherit IOSurface OpenGL; }; + OpenGL = {}; + PCSC = { inherit CoreData; }; + PreferencePanes = {}; + PubSub = {}; + QTKit = { inherit CoreMediaIO CoreMedia MediaToolbox QuickTime VideoToolbox; }; + QuickLook = { inherit ApplicationServices; }; + SceneKit = {}; + ScreenSaver = {}; + Scripting = {}; + ScriptingBridge = {}; + Security = { inherit IOKit; }; + SecurityFoundation = {}; + SecurityInterface = { inherit Security SecurityFoundation; }; + ServiceManagement = { inherit Security; }; + Social = {}; + SpriteKit = {}; + StoreKit = {}; + SyncServices = {}; + System = {}; + SystemConfiguration = { inherit Security; }; + TWAIN = { inherit Carbon; }; + Tcl = {}; + VideoDecodeAcceleration = { inherit CoreVideo; }; + VideoToolbox = { inherit CoreMedia CoreVideo; }; + WebKit = { inherit libobjc ApplicationServices Carbon JavaScriptCore OpenGL; }; + + # Umbrellas + Accelerate = { inherit CoreWLAN IOBluetooth; }; + ApplicationServices = { inherit CoreGraphics CoreServices CoreText ImageIO; }; + Carbon = { inherit libobjc ApplicationServices CoreServices Foundation IOKit Security QuartzCore; }; + CoreBluetooth = {}; + # TODO: figure out which part of the umbrella depends on CoreFoundation and move it there. + CoreServices = { inherit CFNetwork CoreFoundation CoreAudio CoreData DiskArbitration Security NetFS OpenDirectory ServiceManagement; }; + IOBluetooth = { inherit CoreBluetooth IOKit; }; + JavaVM = {}; + OpenDirectory = {}; + Quartz = { inherit QuartzCore QuickLook QTKit; }; + QuartzCore = { inherit libobjc ApplicationServices CoreVideo OpenCL CoreImage Metal; }; + QuickTime = { inherit ApplicationServices AudioUnit Carbon CoreAudio CoreServices OpenGL QuartzCore; }; + + vmnet = {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/impure-deps.nix b/pkgs/by-name/da/darwin/packages/apple-sdk/impure-deps.nix new file mode 100644 index 0000000..c111492 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/impure-deps.nix @@ -0,0 +1,256 @@ +rec { + CFNetwork = [ + "/System/Library/Frameworks/CFNetwork.framework" + "/usr/lib/libsqlite3.dylib" + "/usr/lib/libxml2.2.dylib" + ]; + ForceFeedback = [ + "/System/Library/Frameworks/ForceFeedback.framework" + ]; + AGL = [ + "/System/Library/Frameworks/AGL.framework" + ]; + IOKit = [ + "/System/Library/Frameworks/IOKit.framework" + ]; + JavaScriptCore = [ + "/System/Library/Frameworks/JavaScriptCore.framework" + ]; + QuickLook = [ + "/System/Library/Frameworks/QuickLook.framework" + ]; + Quartz = [ + "/System/Library/Frameworks/Quartz.framework" + "/System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo" + "/System/Library/PrivateFrameworks/CorePDF.framework/Versions/A/CorePDF" + "/usr/lib/libspindump.dylib" + ]; + ImageCaptureCore = [ + "/System/Library/Frameworks/ImageCaptureCore.framework" + ]; + VideoToolbox = [ + "/System/Library/Frameworks/VideoToolbox.framework" + "/System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA" + ]; + QuickTime = [ + "/System/Library/Frameworks/QuickTime.framework" + ]; + CoreMedia = [ + "/System/Library/Frameworks/CoreMedia.framework" + ]; + CoreMediaIO = [ + "/System/Library/Frameworks/CoreMediaIO.framework" + "/System/Library/PrivateFrameworks/AppSandbox.framework/Versions/A/AppSandbox" + "/System/Library/PrivateFrameworks/AppContainer.framework/Versions/A/AppContainer" + "/System/Library/PrivateFrameworks/SecCodeWrapper.framework/Versions/A/SecCodeWrapper" + "/System/Library/PrivateFrameworks/XPCService.framework/Versions/A/XPCService" + "/usr/lib/libsandbox.1.dylib" + "/usr/lib/libMatch.1.dylib" + ]; + MediaToolbox = [ + "/System/Library/Frameworks/MediaToolbox.framework" + "/System/Library/PrivateFrameworks/CoreAUC.framework/Versions/A/CoreAUC" + "/System/Library/PrivateFrameworks/NetworkStatistics.framework/Versions/A/NetworkStatistics" + ]; + QTKit = [ + "/System/Library/Frameworks/QTKit.framework" + "/System/Library/PrivateFrameworks/CoreMediaAuthoring.framework/Versions/A/CoreMediaAuthoring" + ]; + OSAKit = [ + "/System/Library/Frameworks/OSAKit.framework" + "/usr/lib/libexslt.0.dylib" + ]; + WebKit = [ + "/System/Library/Frameworks/WebKit.framework" + ]; + DiskArbitration = [ + "/System/Library/Frameworks/DiskArbitration.framework" + ]; + Security = [ + "/System/Library/Frameworks/Security.framework" + "/usr/lib/libbsm.0.dylib" + "/usr/lib/libbz2.1.0.dylib" + "/usr/lib/libpam.2.dylib" + "/usr/lib/libxar.1.dylib" + "/usr/lib/libxml2.2.dylib" + "/usr/lib/libsqlite3.dylib" + ]; + GSS = [ + "/System/Library/Frameworks/GSS.framework" + ]; + Kerberos = [ + "/System/Library/Frameworks/Kerberos.framework" + ]; + CoreServices = [ + "/System/Library/Frameworks/CoreServices.framework" + "/System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore" + "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC" + "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling" + "/usr/lib/libmecabra.dylib" + "/usr/lib/libcmph.dylib" + "/usr/lib/libiconv.2.dylib" + "/usr/lib/libxslt.1.dylib" + ] ++ Foundation; + IOSurface = [ + "/System/Library/Frameworks/IOSurface.framework" + ]; + CoreGraphics = [ + "/System/Library/Frameworks/CoreGraphics.framework" + "/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport" + "/usr/lib/libbsm.0.dylib" + "/usr/lib/libz.1.dylib" + ]; + CoreText = [ + "/System/Library/Frameworks/CoreText.framework" + ]; + ImageIO = [ + "/System/Library/Frameworks/ImageIO.framework" + ]; + ApplicationServices = [ + "/System/Library/Frameworks/ApplicationServices.framework" + "/usr/lib/libcups.2.dylib" + "/usr/lib/libresolv.9.dylib" + ] ++ AudioToolbox; + OpenGL = [ + "/System/Library/Frameworks/OpenGL.framework" + ]; + CoreVideo = [ + "/System/Library/Frameworks/CoreVideo.framework" + ]; + QuartzCore = [ + "/System/Library/Frameworks/QuartzCore.framework" + "/System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport" + ]; + PCSC = [ + "/System/Library/Frameworks/PCSC.framework" + ]; + AppKit = [ + "/System/Library/Frameworks/AppKit.framework" + "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Apple80211" + "/System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG" + "/System/Library/PrivateFrameworks/AppleVPA.framework/Versions/A/AppleVPA" + "/System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup" + "/System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary" + "/System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth" + "/System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication" + "/System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI" + "/System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi" + "/System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport" + "/System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore" + "/System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols" + "/System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv" + "/System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore" + "/System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage" + "/System/Library/PrivateFrameworks/Heimdal.framework/Heimdal" + "/System/Library/PrivateFrameworks/Heimdal.framework/Versions/Current" + "/System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal" + "/System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices" + "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling" + "/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport" + "/System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth" + "/System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis" + "/System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices" + "/System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing" + "/System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/Versions/A/SpeechRecognitionCore" + "/System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication" + "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC" + "/System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation" + "/System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport" + "/usr/lib/libCRFSuite.dylib" + "/usr/lib/libOpenScriptingUtil.dylib" + "/usr/lib/libarchive.2.dylib" + "/usr/lib/libbsm.0.dylib" + "/usr/lib/libbz2.1.0.dylib" + "/usr/lib/libc++.1.dylib" + "/usr/lib/libc++abi.dylib" + "/usr/lib/libcmph.dylib" + "/usr/lib/libcups.2.dylib" + "/usr/lib/libextension.dylib" + "/usr/lib/libheimdal-asn1.dylib" + "/usr/lib/libiconv.2.dylib" + "/usr/lib/libicucore.A.dylib" + "/usr/lib/liblangid.dylib" + "/usr/lib/liblzma.5.dylib" + "/usr/lib/libmecabra.dylib" + "/usr/lib/libpam.2.dylib" + "/usr/lib/libresolv.9.dylib" + "/usr/lib/libsqlite3.dylib" + "/usr/lib/libxar.1.dylib" + "/usr/lib/libxml2.2.dylib" + "/usr/lib/libxslt.1.dylib" + "/usr/lib/libz.1.dylib" + ]; + Foundation = [ + "/System/Library/Frameworks/Foundation.framework" + "/usr/lib/libextension.dylib" + "/usr/lib/libarchive.2.dylib" + "/usr/lib/liblzma.5.dylib" + "/usr/lib/liblangid.dylib" + "/usr/lib/libCRFSuite.dylib" + ]; + CoreData = [ + "/System/Library/Frameworks/CoreData.framework" + ]; + Cocoa = [ + "/System/Library/Frameworks/Cocoa.framework" + "/System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation" + "/System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A" + ]; + Carbon = [ + "/System/Library/Frameworks/Carbon.framework" + "/System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI" + "/System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv" + "/System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices" + "/System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary" + "/System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing" + "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Apple80211" + "/System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage" + ]; + CoreAudio = [ + "/System/Library/Frameworks/CoreAudio.framework" + ]; + AudioUnit = [ + "/System/Library/Frameworks/AudioUnit.framework" + ]; + CoreMIDI = [ + "/System/Library/Frameworks/CoreMIDI.framework" + ]; + AudioToolbox = [ + "/System/Library/Frameworks/AudioToolbox.framework" + ]; + SystemConfiguration = [ + "/System/Library/Frameworks/SystemConfiguration.framework" + ]; + NetFS = [ + "/System/Library/Frameworks/NetFS.framework" + "/System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth" + "/System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport" + ]; + Accelerate = [ + "/System/Library/Frameworks/Accelerate.framework" + ]; + OpenDirectory = [ + "/System/Library/Frameworks/OpenDirectory.framework" + ]; + ServiceManagement = [ + "/System/Library/Frameworks/ServiceManagement.framework" + ]; + OpenCL = [ + "/System/Library/Frameworks/OpenCL.framework" + ]; + CoreWLAN = [ + "/System/Library/Frameworks/CoreWLAN.framework" + ]; + IOBluetooth = [ + "/System/Library/Frameworks/IOBluetooth.framework" + ] ++ AudioUnit ++ CoreBluetooth; + CoreBluetooth = [ + "/System/Library/Frameworks/CoreBluetooth.framework" + ]; + SecurityFoundation = [ + "/System/Library/Frameworks/SecurityFoundation.framework" + ]; + Kernel = [ + "/System/Library/Frameworks/Kernel.framework" + ]; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/private-frameworks-setup-hook.sh b/pkgs/by-name/da/darwin/packages/apple-sdk/private-frameworks-setup-hook.sh new file mode 100644 index 0000000..a351c39 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/private-frameworks-setup-hook.sh @@ -0,0 +1,8 @@ +addPrivateFrameworks() { + flag="-F/System/Library/PrivateFrameworks" + if [[ "${NIX_CFLAGS_COMPILE-}" != *$flag* ]]; then + NIX_CFLAGS_COMPILE+=" $flag" + fi +} + +addEnvHooks "$hostOffset" addPrivateFrameworks diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/sdkRoot.nix b/pkgs/by-name/da/darwin/packages/apple-sdk/sdkRoot.nix new file mode 100644 index 0000000..67d9cbe --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/sdkRoot.nix @@ -0,0 +1,68 @@ +{ + lib, + runCommand, + writeText, + sdkVersion, +}: + +let + sdkName = "MacOSX${sdkVersion}"; + toolchainName = "com.apple.dt.toolchain.XcodeDefault"; + productBuildVer = null; + + inherit (lib.generators) toPlist toJSON; + + SDKSettings = { + CanonicalName = "macosx${sdkVersion}"; + DisplayName = "macOS ${sdkVersion}"; + Toolchains = [ toolchainName ]; + Version = sdkVersion; + MaximumDeploymentTarget = "${sdkVersion}.99"; + isBaseSDK = "YES"; + }; + + SystemVersion = + lib.optionalAttrs (productBuildVer != null) { ProductBuildVersion = productBuildVer; } + // { + ProductName = "macOS"; + ProductVersion = sdkVersion; + }; +in +runCommand "sdkroot-${sdkVersion}" { } '' + sdk="$out/${sdkName}.sdk" + + install -D ${writeText "SDKSettings.plist" (toPlist { } SDKSettings)} "$sdk/SDKSettings.plist" + install -D ${writeText "SDKSettings.json" (toJSON { } SDKSettings)} "$sdk/SDKSettings.json" + install -D ${ + writeText "SystemVersion.plist" (toPlist { } SystemVersion) + } "$sdk/System/Library/CoreServices/SystemVersion.plist" + + ln -s "$sdk" "$sdk/usr" + + install -D '${../../../build-support/setup-hooks/role.bash}' "$out/nix-support/setup-hook" + cat >> "$out/nix-support/setup-hook" <<-hook + # + # See comments in cc-wrapper's setup hook. This works exactly the same way. + # + [[ -z \''${strictDeps-} ]] || (( "\$hostOffset" < 0 )) || return 0 + + sdkRootHook() { + # See ../../../build-support/setup-hooks/role.bash + local role_post + getHostRoleEnvHook + + # Only set the SDK root if one has not been set via this hook or some other means. + if [[ ! \$NIX_CFLAGS_COMPILE =~ isysroot ]]; then + export NIX_CFLAGS_COMPILE\''${role_post}+=' -isysroot $out/${sdkName}.sdk' + fi + } + + # See ../../../build-support/setup-hooks/role.bash + getTargetRole + + addEnvHooks "\$targetOffset" sdkRootHook + + # No local scope in sourced file + unset -v role_post + hook +'' diff --git a/pkgs/by-name/da/darwin/packages/apple-sdk/security-setup-hook.sh b/pkgs/by-name/da/darwin/packages/apple-sdk/security-setup-hook.sh new file mode 100644 index 0000000..35cea77 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-sdk/security-setup-hook.sh @@ -0,0 +1,10 @@ +noDeprecatedDeclarations() { + # Security.framework has about 2000 deprecated constants, all of which the user will be + # warned about at compilation time + flag="-Wno-deprecated-declarations" + if [[ "${NIX_CFLAGS_COMPILE-}" != *$flag* ]]; then + NIX_CFLAGS_COMPILE+=" $flag" + fi +} + +addEnvHooks "$hostOffset" noDeprecatedDeclarations diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/CarbonHeaders/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/CarbonHeaders/default.nix new file mode 100644 index 0000000..f3ef0e9 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/CarbonHeaders/default.nix @@ -0,0 +1,20 @@ +{ lib, appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + dontBuild = true; + + installPhase = '' + mkdir -p $out/include + cp MacTypes.h $out/include + cp ConditionalMacros.h $out/include + + substituteInPlace $out/include/MacTypes.h \ + --replace "CarbonCore/" "" + ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/CommonCrypto/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/CommonCrypto/default.nix new file mode 100644 index 0000000..32e1429 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/CommonCrypto/default.nix @@ -0,0 +1,42 @@ +{ lib, appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/include/CommonCrypto + cp include/* $out/include/CommonCrypto + ''; + + appleHeaders = '' + CommonCrypto/CommonBaseXX.h + CommonCrypto/CommonBigNum.h + CommonCrypto/CommonCMACSPI.h + CommonCrypto/CommonCRC.h + CommonCrypto/CommonCrypto.h + CommonCrypto/CommonCryptoError.h + CommonCrypto/CommonCryptoPriv.h + CommonCrypto/CommonCryptor.h + CommonCrypto/CommonCryptorSPI.h + CommonCrypto/CommonDH.h + CommonCrypto/CommonDigest.h + CommonCrypto/CommonDigestSPI.h + CommonCrypto/CommonECCryptor.h + CommonCrypto/CommonHMAC.h + CommonCrypto/CommonHMacSPI.h + CommonCrypto/CommonKeyDerivation.h + CommonCrypto/CommonKeyDerivationSPI.h + CommonCrypto/CommonNumerics.h + CommonCrypto/CommonRSACryptor.h + CommonCrypto/CommonRandom.h + CommonCrypto/CommonRandomSPI.h + CommonCrypto/CommonSymmetricKeywrap.h + CommonCrypto/aes.h + CommonCrypto/lionCompat.h + CommonCrypto/module.modulemap + ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Csu/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Csu/default.nix new file mode 100644 index 0000000..8cb478d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Csu/default.nix @@ -0,0 +1,29 @@ +{ lib, appleDerivation', stdenv }: + +appleDerivation' stdenv { + + prePatch = '' + substituteInPlace Makefile \ + --replace /usr/lib /lib \ + --replace /usr/local/lib /lib \ + --replace /usr/bin "" \ + --replace /bin/ "" \ + --replace "CC = " "#" \ + --replace "SDK_DIR = " "SDK_DIR = . #" \ + + # Mac OS didn't support rpaths back before 10.5, but we don't care about it. + substituteInPlace Makefile \ + --replace -mmacosx-version-min=10.4 -mmacosx-version-min=10.6 \ + --replace -mmacosx-version-min=10.5 -mmacosx-version-min=10.6 + ''; + + installFlags = [ "DSTROOT=$(out)" ]; + enableParallelInstalling = false; # cp: cannot create regular file '$out/lib/crt1.10.6.o' + + meta = with lib; { + description = "Apple's common startup stubs for darwin"; + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/ICU/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/ICU/default.nix new file mode 100644 index 0000000..ed5e998 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/ICU/default.nix @@ -0,0 +1,86 @@ +{ appleDerivation, lib, stdenv, buildPackages, python3 }: + +let + formatVersionNumeric = version: + let + versionParts = lib.versions.splitVersion version; + major = lib.toInt (lib.elemAt versionParts 0); + minor = lib.toInt (lib.elemAt versionParts 1); + patch = if lib.length versionParts > 2 then lib.toInt (lib.elemAt versionParts 2) else 0; + in toString (major * 10000 + minor * 100 + patch); +in + +appleDerivation { + nativeBuildInputs = [ python3 ]; + + depsBuildBuild = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ buildPackages.stdenv.cc ]; + + postPatch = '' + substituteInPlace makefile \ + --replace "/usr/bin/" "" \ + --replace "xcrun --sdk macosx --find" "echo -n" \ + --replace "xcrun --sdk macosx.internal --show-sdk-path" "echo -n /dev/null" \ + --replace "-install_name " "-install_name $out" + + substituteInPlace icuSources/config/mh-darwin \ + --replace "-install_name " "-install_name $out/" + + # drop using impure /var/db/timezone/icutz + substituteInPlace makefile \ + --replace '-DU_TIMEZONE_FILES_DIR=\"\\\"$(TZDATA_LOOKUP_DIR)\\\"\" -DU_TIMEZONE_PACKAGE=\"\\\"$(TZDATA_PACKAGE)\\\"\"' "" + + # FIXME: This will cause `ld: warning: OS version (12.0) too small, changing to 13.0.0`, APPLE should fix it. + substituteInPlace makefile \ + --replace "ZIPPERING_LDFLAGS=-Wl,-iosmac_version_min,12.0" "ZIPPERING_LDFLAGS=" + + # skip test for missing encodingSamples data + substituteInPlace icuSources/test/cintltst/ucsdetst.c \ + --replace "&TestMailFilterCSS" "NULL" + + patchShebangs icuSources + '' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + + # This looks like a bug in the makefile. It defines ENV_BUILDHOST to + # propagate the correct value of CC, CXX, etc, but has the following double + # expansion that results in the empty string. + substituteInPlace makefile \ + --replace '$($(ENV_BUILDHOST))' '$(ENV_BUILDHOST)' + ''; + + # APPLE is using makefile to save its default configuration and call ./configure, so we hack makeFlags + # instead of configuring ourself, trying to stay abreast of APPLE. + dontConfigure = true; + makeFlags = [ + "DSTROOT=$(out)" + + # remove /usr prefix on include and lib + "PRIVATE_HDR_PREFIX=" + "libdir=/lib/" + + "DATA_INSTALL_DIR=/share/icu/" + "DATA_LOOKUP_DIR=$(DSTROOT)$(DATA_INSTALL_DIR)" + ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ # darwin* platform properties are only defined on darwin + # hack to use our lower macos version + "MAC_OS_X_VERSION_MIN_REQUIRED=${formatVersionNumeric stdenv.hostPlatform.darwinMinVersion}" + "ICU_TARGET_VERSION=-m${stdenv.hostPlatform.darwinPlatform}-version-min=${stdenv.hostPlatform.darwinMinVersion}" + ] + ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "CROSS_BUILD=YES" + "BUILD_TYPE=" + "RC_ARCHS=${stdenv.hostPlatform.darwinArch}" + "HOSTCC=cc" + "HOSTCXX=c++" + "CC=${stdenv.cc.targetPrefix}cc" + "CXX=${stdenv.cc.targetPrefix}c++" + "HOSTISYSROOT=" + "OSX_HOST_VERSION_MIN_STRING=${stdenv.buildPlatform.darwinMinVersion}" + ]; + + doCheck = true; + checkTarget = "check"; + + postInstall = '' + # we don't need all those in usr/local + rm -rf $out/usr + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/IOKit/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/IOKit/default.nix new file mode 100644 index 0000000..3943e2b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/IOKit/default.nix @@ -0,0 +1,188 @@ +{ lib, appleDerivation', stdenv, IOKitSrcs, xnu, darwin-stubs }: + +# Someday it'll make sense to split these out into their own packages, but today is not that day. +appleDerivation' stdenv { + srcs = lib.attrValues IOKitSrcs; + sourceRoot = "."; + + __propagatedImpureHostDeps = [ + "/System/Library/Frameworks/IOKit.framework/IOKit" + "/System/Library/Frameworks/IOKit.framework/Resources" + "/System/Library/Frameworks/IOKit.framework/Versions" + ]; + + installPhase = '' + mkdir -p $out/Library/Frameworks/IOKit.framework + + ###### IMPURITIES + ln -s /System/Library/Frameworks/IOKit.framework/Resources \ + $out/Library/Frameworks/IOKit.framework + + ###### STUBS + cp ${darwin-stubs}/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit.tbd \ + $out/Library/Frameworks/IOKit.framework + + ###### HEADERS + + export dest=$out/Library/Frameworks/IOKit.framework/Headers + mkdir -p $dest + + pushd $dest + mkdir audio avc DV firewire graphics hid hidsystem i2c kext ndrvsupport + mkdir network ps pwr_mgt sbp2 scsi serial storage stream usb video + popd + + # root: complete + cp IOKitUser-*/IOCFBundle.h $dest + cp IOKitUser-*/IOCFPlugIn.h $dest + cp IOKitUser-*/IOCFSerialize.h $dest + cp IOKitUser-*/IOCFUnserialize.h $dest + cp IOKitUser-*/IOCFURLAccess.h $dest + cp IOKitUser-*/IODataQueueClient.h $dest + cp IOKitUser-*/IOKitLib.h $dest + cp IOKitUser-*/iokitmig.h $dest + cp ${xnu}/Library/PrivateFrameworks/IOKit.framework/Versions/A/Headers/*.h $dest + + # audio: complete + cp IOAudioFamily-*/IOAudioDefines.h $dest/audio + cp IOKitUser-*/audio.subproj/IOAudioLib.h $dest/audio + cp IOAudioFamily-*/IOAudioTypes.h $dest/audio + + # avc: complete + cp IOFireWireAVC-*/IOFireWireAVC/IOFireWireAVCConsts.h $dest/avc + cp IOFireWireAVC-*/IOFireWireAVCLib/IOFireWireAVCLib.h $dest/avc + + # DV: complete + cp IOFWDVComponents-*/DVFamily.h $dest/DV + + # firewire: complete + cp IOFireWireFamily-*/IOFireWireFamily.kmodproj/IOFireWireFamilyCommon.h $dest/firewire + cp IOFireWireFamily-*/IOFireWireLib.CFPlugInProj/IOFireWireLib.h $dest/firewire + cp IOFireWireFamily-*/IOFireWireLib.CFPlugInProj/IOFireWireLibIsoch.h $dest/firewire + cp IOFireWireFamily-*/IOFireWireFamily.kmodproj/IOFWIsoch.h $dest/firewire + + # graphics: missing AppleGraphicsDeviceControlUserCommand.h + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOAccelClientConnect.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOAccelSurfaceConnect.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOAccelTypes.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOFramebufferShared.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOGraphicsEngine.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOGraphicsInterface.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOGraphicsInterfaceTypes.h $dest/graphics + cp IOKitUser-*/graphics.subproj/IOGraphicsLib.h $dest/graphics + cp IOGraphics-*/IOGraphicsFamily/IOKit/graphics/IOGraphicsTypes.h $dest/graphics + + # hid: complete + cp IOKitUser-*/hid.subproj/IOHIDBase.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDDevice.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDDevicePlugIn.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDElement.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDLib.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDManager.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDQueue.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDTransaction.h $dest/hid + cp IOKitUser-*/hid.subproj/IOHIDValue.h $dest/hid + cp IOHIDFamily-*/IOHIDFamily/IOHIDKeys.h $dest/hid + cp IOHIDFamily-*/IOHIDFamily/IOHIDUsageTables.h $dest/hid + cp IOHIDFamily-*/IOHIDLib/IOHIDLibObsolete.h $dest/hid + + # hidsystem: complete + cp IOHIDFamily-*/IOHIDSystem/IOKit/hidsystem/ev_keymap.h $dest/hidsystem + cp IOKitUser-*/hidsystem.subproj/event_status_driver.h $dest/hidsystem + cp IOKitUser-*/hidsystem.subproj/IOHIDLib.h $dest/hidsystem + cp IOHIDFamily-*/IOHIDSystem/IOKit/hidsystem/IOHIDParameter.h $dest/hidsystem + cp IOHIDFamily-*/IOHIDSystem/IOKit/hidsystem/IOHIDShared.h $dest/hidsystem + cp IOHIDFamily-*/IOHIDSystem/IOKit/hidsystem/IOHIDTypes.h $dest/hidsystem + cp IOHIDFamily-*/IOHIDSystem/IOKit/hidsystem/IOLLEvent.h $dest/hidsystem + + + # i2c: complete + cp IOGraphics-*/IOGraphicsFamily/IOKit/i2c/IOI2CInterface.h $dest/i2c + + # kext: complete + cp IOKitUser-*/kext.subproj/KextManager.h $dest/kext + + # ndrvsupport: complete + cp IOGraphics-*/IONDRVSupport/IOKit/ndrvsupport/IOMacOSTypes.h $dest/ndrvsupport + cp IOGraphics-*/IONDRVSupport/IOKit/ndrvsupport/IOMacOSVideo.h $dest/ndrvsupport + + # network: complete + cp IONetworkingFamily-*/IOEthernetController.h $dest/network + cp IONetworkingFamily-*/IOEthernetInterface.h $dest/network + cp IONetworkingFamily-*/IOEthernetStats.h $dest/network + cp IONetworkingFamily-*/IONetworkController.h $dest/network + cp IONetworkingFamily-*/IONetworkData.h $dest/network + cp IONetworkingFamily-*/IONetworkInterface.h $dest/network + cp IOKitUser-*/network.subproj/IONetworkLib.h $dest/network + cp IONetworkingFamily-*/IONetworkMedium.h $dest/network + cp IONetworkingFamily-*/IONetworkStack.h $dest/network + cp IONetworkingFamily-*/IONetworkStats.h $dest/network + cp IONetworkingFamily-*/IONetworkUserClient.h $dest/network + + # ps: missing IOUPSPlugIn.h + cp IOKitUser-*/ps.subproj/IOPowerSources.h $dest/ps + cp IOKitUser-*/ps.subproj/IOPSKeys.h $dest/ps + + # pwr_mgt: complete + cp IOKitUser-*/pwr_mgt.subproj/IOPMKeys.h $dest/pwr_mgt + cp IOKitUser-*/pwr_mgt.subproj/IOPMLib.h $dest/pwr_mgt + cp ${xnu}/Library/PrivateFrameworks/IOKit.framework/Versions/A/Headers/pwr_mgt/*.h $dest/pwr_mgt + cp IOKitUser-*/pwr_mgt.subproj/IOPMLibPrivate.h $dest/pwr_mgt # Private + + # sbp2: complete + cp IOFireWireSBP2-*/IOFireWireSBP2Lib/IOFireWireSBP2Lib.h $dest/sbp2 + + # scsi: omitted for now + + # serial: complete + cp IOSerialFamily-*/IOSerialFamily.kmodproj/IOSerialKeys.h $dest/serial + cp IOSerialFamily-*/IOSerialFamily.kmodproj/ioss.h $dest/serial + + # storage: complete + # Needs ata subdirectory + cp IOStorageFamily-*/IOAppleLabelScheme.h $dest/storage + cp IOStorageFamily-*/IOApplePartitionScheme.h $dest/storage + cp IOBDStorageFamily-*/IOBDBlockStorageDevice.h $dest/storage + cp IOBDStorageFamily-*/IOBDMedia.h $dest/storage + cp IOBDStorageFamily-*/IOBDMediaBSDClient.h $dest/storage + cp IOBDStorageFamily-*/IOBDTypes.h $dest/storage + cp IOStorageFamily-*/IOBlockStorageDevice.h $dest/storage + cp IOStorageFamily-*/IOBlockStorageDriver.h $dest/storage + cp IOCDStorageFamily-*/IOCDBlockStorageDevice.h $dest/storage + cp IOCDStorageFamily-*/IOCDMedia.h $dest/storage + cp IOCDStorageFamily-*/IOCDMediaBSDClient.h $dest/storage + cp IOCDStorageFamily-*/IOCDPartitionScheme.h $dest/storage + cp IOCDStorageFamily-*/IOCDTypes.h $dest/storage + cp IODVDStorageFamily-*/IODVDBlockStorageDevice.h $dest/storage + cp IODVDStorageFamily-*/IODVDMedia.h $dest/storage + cp IODVDStorageFamily-*/IODVDMediaBSDClient.h $dest/storage + cp IODVDStorageFamily-*/IODVDTypes.h $dest/storage + cp IOStorageFamily-*/IOFDiskPartitionScheme.h $dest/storage + cp IOStorageFamily-*/IOFilterScheme.h $dest/storage + cp IOFireWireSerialBusProtocolTransport-*/IOFireWireStorageCharacteristics.h $dest/storage + cp IOStorageFamily-*/IOGUIDPartitionScheme.h $dest/storage + cp IOStorageFamily-*/IOMedia.h $dest/storage + cp IOStorageFamily-*/IOMediaBSDClient.h $dest/storage + cp IOStorageFamily-*/IOPartitionScheme.h $dest/storage + cp IOStorageFamily-*/IOStorage.h $dest/storage + cp IOStorageFamily-*/IOStorageCardCharacteristics.h $dest/storage + cp IOStorageFamily-*/IOStorageDeviceCharacteristics.h $dest/storage + cp IOStorageFamily-*/IOStorageProtocolCharacteristics.h $dest/storage + + # stream: missing altogether + + # usb: complete + cp IOUSBFamily*-630.4.5/IOUSBFamily/Headers/IOUSBLib.h $dest/usb + cp IOUSBFamily*-630.4.5/IOUSBUserClient/Headers/IOUSBUserClient.h $dest/usb + cp IOUSBFamily*-560.4.2/IOUSBFamily/Headers/USB.h $dest/usb # This file is empty in 630.4.5! + cp IOUSBFamily*-630.4.5/IOUSBFamily/Headers/USBSpec.h $dest/usb + + # video: missing altogether + ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/0001-Define-TARGET_OS_EMBEDDED-in-std-lib-io-if-not-defin.patch b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/0001-Define-TARGET_OS_EMBEDDED-in-std-lib-io-if-not-defin.patch new file mode 100644 index 0000000..2ba6773 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/0001-Define-TARGET_OS_EMBEDDED-in-std-lib-io-if-not-defin.patch @@ -0,0 +1,47 @@ +From 187d0e8847d080790b22724352e51de50d214dd8 Mon Sep 17 00:00:00 2001 +From: toonn +Date: Tue, 27 Jul 2021 15:12:14 +0200 +Subject: [PATCH] Define TARGET_OS_EMBEDDED in std{lib,io} if not defined + +Originally attempted including `TargetConditionals.h` but this had +knock-on effects, for example, breaking the zlib build because of +`TARGET_OS_MAC` getting defined. + +This should be the lowest impact solution and corresponds to the default +behavior IIUC. +--- + include/stdio.h | 3 +++ + include/stdlib.h | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/include/stdio.h b/include/stdio.h +index d0cf7a5..487496e 100644 +--- a/include/stdio.h ++++ b/include/stdio.h +@@ -351,6 +351,9 @@ __END_DECLS + /* Additional functionality provided by: + * POSIX.2-1992 C Language Binding Option + */ ++#ifndef TARGET_OS_EMBEDDED ++# define TARGET_OS_EMBEDDED 0 ++#endif + #if TARGET_OS_EMBEDDED + #define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(ios_msg) + #else +diff --git a/include/stdlib.h b/include/stdlib.h +index c04d3a7..0b454ba 100644 +--- a/include/stdlib.h ++++ b/include/stdlib.h +@@ -183,6 +183,9 @@ unsigned long long + #ifndef LIBC_ALIAS_SYSTEM + //End-Libc + ++#ifndef TARGET_OS_EMBEDDED ++# define TARGET_OS_EMBEDDED 0 ++#endif + #if TARGET_OS_EMBEDDED + #define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(ios_msg) + #else +-- +2.17.2 (Apple Git-113) + diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/CrashReporterClient.h b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/CrashReporterClient.h new file mode 100644 index 0000000..a1cbb72 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/CrashReporterClient.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*********************************************************************** + * Not to be installed in /usr/local/include + ***********************************************************************/ + +#ifndef _LIBC_CRASHREPORTERCLIENT_H +#define _LIBC_CRASHREPORTERCLIENT_H + +#include "stdint.h" + +/* Fake the CrashReporterClient API */ +#define CRGetCrashLogMessage() 0 +#define CRSetCrashLogMessage(m) true + +#define CRASH_REPORTER_CLIENT_HIDDEN __attribute__((visibility("hidden"))) +#define CRASHREPORTER_ANNOTATIONS_VERSION 4 +#define CRASHREPORTER_ANNOTATIONS_SECTION "__crash_info" + +struct crashreporter_annotations_t { + uint64_t version; // unsigned long + uint64_t message; // char * + uint64_t signature_string; // char * + uint64_t backtrace; // char * + uint64_t message2; // char * + uint64_t thread; // uint64_t + uint64_t dialog_mode; // unsigned int +}; + +#endif diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/default.nix new file mode 100644 index 0000000..6ff3cec --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/default.nix @@ -0,0 +1,23 @@ +{ appleDerivation', stdenvNoCC, ed, unifdef, Libc_10-9 }: + +appleDerivation' stdenvNoCC { + nativeBuildInputs = [ ed unifdef ]; + + patches = [ + ./0001-Define-TARGET_OS_EMBEDDED-in-std-lib-io-if-not-defin.patch + ]; + + installPhase = '' + export SRCROOT=$PWD + export DSTROOT=$out + export PUBLIC_HEADERS_FOLDER_PATH=include + export PRIVATE_HEADERS_FOLDER_PATH=include + bash xcodescripts/headers.sh + + cp ${./CrashReporterClient.h} $out/include/CrashReporterClient.h + + cp ${Libc_10-9}/include/NSSystemDirectories.h $out/include + ''; + + appleHeaders = builtins.readFile ./headers.txt; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/headers.txt b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/headers.txt new file mode 100644 index 0000000..c7cad63 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libc/headers.txt @@ -0,0 +1,125 @@ +CrashReporterClient.h +NSSystemDirectories.h +_locale.h +_types.h +_types/_intmax_t.h +_types/_nl_item.h +_types/_uint16_t.h +_types/_uint32_t.h +_types/_uint64_t.h +_types/_uint8_t.h +_types/_uintmax_t.h +_types/_wctrans_t.h +_types/_wctype_t.h +_wctype.h +_xlocale.h +aio.h +alloca.h +ar.h +arpa/ftp.h +arpa/inet.h +arpa/nameser_compat.h +arpa/telnet.h +arpa/tftp.h +assert.h +bitstring.h +cpio.h +crt_externs.h +ctype.h +db.h +dirent.h +disktab.h +err.h +errno.h +execinfo.h +fcntl.h +fmtmsg.h +fnmatch.h +fsproperties.h +fstab.h +fts.h +ftw.h +get_compat.h +getopt.h +glob.h +inttypes.h +iso646.h +langinfo.h +libc.h +libc_private.h +libgen.h +limits.h +locale.h +memory.h +monetary.h +monitor.h +mpool.h +msgcat.h +ndbm.h +nl_types.h +nlist.h +os/assumes.h +os/debug_private.h +paths.h +poll.h +printf.h +protocols/routed.h +protocols/rwhod.h +protocols/talkd.h +protocols/timed.h +ranlib.h +readpassphrase.h +regex.h +runetype.h +search.h +secure/_common.h +secure/_stdio.h +secure/_string.h +semaphore.h +sgtty.h +signal.h +stab.h +standards.h +stddef.h +stdint.h +stdio.h +stdlib.h +strhash.h +string.h +stringlist.h +strings.h +struct.h +sys/acl.h +sys/rbtree.h +sys/statvfs.h +sysexits.h +syslog.h +tar.h +termios.h +time.h +timeconv.h +ttyent.h +tzfile.h +ulimit.h +unistd.h +util.h +utime.h +utmpx.h +utmpx_thread.h +vis.h +wchar.h +wctype.h +wordexp.h +xlocale.h +xlocale/__wctype.h +xlocale/_ctype.h +xlocale/_inttypes.h +xlocale/_langinfo.h +xlocale/_monetary.h +xlocale/_regex.h +xlocale/_stdio.h +xlocale/_stdlib.h +xlocale/_string.h +xlocale/_time.h +xlocale/_wchar.h +xlocale/_wctype.h diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libinfo/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libinfo/default.nix new file mode 100644 index 0000000..789e536 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libinfo/default.nix @@ -0,0 +1,50 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + substituteInPlace xcodescripts/install_files.sh \ + --replace "/usr/local/" "/" \ + --replace "/usr/" "/" \ + --replace '-o "$INSTALL_OWNER" -g "$INSTALL_GROUP"' "" \ + --replace "ln -h" "ln -n" + + export DSTROOT=$out + sh xcodescripts/install_files.sh + ''; + + appleHeaders = '' + aliasdb.h + bootparams.h + configuration_profile.h + grp.h + ifaddrs.h + ils.h + kvbuf.h + libinfo.h + libinfo_muser.h + membership.h + membershipPriv.h + netdb.h + netdb_async.h + ntsid.h + printerdb.h + pwd.h + rpc/auth.h + rpc/auth_unix.h + rpc/clnt.h + rpc/pmap_clnt.h + rpc/pmap_prot.h + rpc/pmap_rmt.h + rpc/rpc.h + rpc/rpc_msg.h + rpc/svc.h + rpc/svc_auth.h + rpc/types.h + rpc/xdr.h + rpcsvc/yp_prot.h + rpcsvc/ypclnt.h + si_data.h + si_module.h + thread_data.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/default.nix new file mode 100644 index 0000000..931bebe --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/default.nix @@ -0,0 +1,18 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + patches = [ + # The source release version of math.h is missing some symbols that are actually present + # in newer SDKs. Patch them into the header to avoid implicit function declaration errors + # when compiling with newer versions of clang. + ./missing-declarations.patch + ]; + + installPhase = '' + mkdir -p $out/include + + cp Source/Intel/math.h $out/include + cp Source/Intel/fenv.h $out/include + cp Source/complex.h $out/include + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/missing-declarations.patch b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/missing-declarations.patch new file mode 100644 index 0000000..e56934e --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libm/missing-declarations.patch @@ -0,0 +1,292 @@ +--- a/Source/Intel/math.h 2023-10-20 09:43:42.640416006 -0400 ++++ b/Source/Intel/math.h 2023-10-20 09:47:59.743127003 -0400 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. ++ * Copyright (c) 2002-2015 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * +@@ -27,14 +27,17 @@ + * Contains: typedefs, prototypes, and macros germane to C99 floating point.* + * * + *******************************************************************************/ ++#ifndef __MATH_H__ ++#define __MATH_H__ ++ + #ifndef __MATH__ + #define __MATH__ ++#endif + +-#include /* For definition of __DARWIN_UNIX03 et al */ ++#include ++#include + +-#ifdef __cplusplus +-extern "C" { +-#endif ++__BEGIN_DECLS + + /****************************************************************************** + * Floating point data types * +@@ -87,14 +90,26 @@ + #define FP_SUBNORMAL 5 + #define FP_SUPERNORMAL 6 /* meaningful only on PowerPC */ + +-/* fma() *function call* is more costly than equivalent (in-line) multiply and add operations */ +-/* For single and double precision, the cost isn't too bad, because we can fall back on higher */ +-/* precision hardware, with the necessary range to handle infinite precision products. However, */ +-/* expect the long double fma to be at least an order of magnitude slower than a simple multiply */ +-/* and an add. */ +-#undef FP_FAST_FMA +-#undef FP_FAST_FMAF +-#undef FP_FAST_FMAL ++#if defined __arm64__ || defined __ARM_VFPV4__ ++/* On these architectures, fma(), fmaf( ), and fmal( ) are generally about as ++ fast as (or faster than) separate multiply and add of the same operands. */ ++# define FP_FAST_FMA 1 ++# define FP_FAST_FMAF 1 ++# define FP_FAST_FMAL 1 ++#elif (defined __i386__ || defined __x86_64__) && (defined __FMA__) ++/* When targeting the FMA ISA extension, fma() and fmaf( ) are generally ++ about as fast as (or faster than) separate multiply and add of the same ++ operands, but fmal( ) may be more costly. */ ++# define FP_FAST_FMA 1 ++# define FP_FAST_FMAF 1 ++# undef FP_FAST_FMAL ++#else ++/* On these architectures, fma( ), fmaf( ), and fmal( ) function calls are ++ significantly more costly than separate multiply and add operations. */ ++# undef FP_FAST_FMA ++# undef FP_FAST_FMAF ++# undef FP_FAST_FMAL ++#endif + + /* The values returned by `ilogb' for 0 and NaN respectively. */ + #define FP_ILOGB0 (-2147483647 - 1) +@@ -191,6 +206,23 @@ + static __inline__ int __inline_isnormalf( float __x ) { float fabsf = __builtin_fabsf(__x); if( __x != __x ) return 0; return fabsf < __builtin_inff() && fabsf >= __FLT_MIN__; } + static __inline__ int __inline_isnormald( double __x ) { double fabsf = __builtin_fabs(__x); if( __x != __x ) return 0; return fabsf < __builtin_inf() && fabsf >= __DBL_MIN__; } + static __inline__ int __inline_isnormal( long double __x ) { long double fabsf = __builtin_fabsl(__x); if( __x != __x ) return 0; return fabsf < __builtin_infl() && fabsf >= __LDBL_MIN__; } ++ ++#if defined __i386__ || defined __x86_64__ ++__header_always_inline int __inline_signbitl(long double __x) { ++ union { ++ long double __ld; ++ struct{ unsigned long long __m; unsigned short __sexp; } __p; ++ } __u; ++ __u.__ld = __x; ++ return (int)(__u.__p.__sexp >> 15); ++} ++#else ++__header_always_inline int __inline_signbitl(long double __x) { ++ union { long double __f; unsigned long long __u;} __u; ++ __u.__f = __x; ++ return (int)(__u.__u >> 63); ++} ++#endif + + #else + +@@ -509,7 +541,112 @@ + extern long double __infl( void ); + extern float __nan( void ); /* 10.3 (and later) must retain in ABI for backward compatability */ + +-#if !defined(_ANSI_SOURCE) ++ ++/****************************************************************************** ++ * Apple extensions to the C standard * ++ ******************************************************************************/ ++ ++/* Because these functions are not specified by any relevant standard, they ++ are prefixed with __, which places them in the implementor's namespace, so ++ they should not conflict with any developer or third-party code. If they ++ are added to a relevant standard in the future, un-prefixed names may be ++ added to the library and they may be moved out of this section of the ++ header. ++ ++ Because these functions are non-standard, they may not be available on non- ++ Apple platforms. */ ++ ++/* __exp10(x) returns 10**x. Edge cases match those of exp( ) and exp2( ). */ ++extern float __exp10f(float) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern double __exp10(double) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++ ++/* __sincos(x,sinp,cosp) computes the sine and cosine of x with a single ++ function call, storing the sine in the memory pointed to by sinp, and ++ the cosine in the memory pointed to by cosp. Edge cases match those of ++ separate calls to sin( ) and cos( ). */ ++__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp); ++__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp); ++ ++/* __sinpi(x) returns the sine of pi times x; __cospi(x) and __tanpi(x) return ++ the cosine and tangent, respectively. These functions can produce a more ++ accurate answer than expressions of the form sin(M_PI * x) because they ++ avoid any loss of precision that results from rounding the result of the ++ multiplication M_PI * x. They may also be significantly more efficient in ++ some cases because the argument reduction for these functions is easier ++ to compute. Consult the man pages for edge case details. */ ++extern float __cospif(float) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern double __cospi(double) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern float __sinpif(float) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern double __sinpi(double) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern float __tanpif(float) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++extern double __tanpi(double) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); ++ ++#if (defined __MAC_OS_X_VERSION_MIN_REQUIRED && __MAC_OS_X_VERSION_MIN_REQUIRED < 1090) || \ ++ (defined __IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < 70000) ++/* __sincos and __sincosf were introduced in OSX 10.9 and iOS 7.0. When ++ targeting an older system, we simply split them up into discrete calls ++ to sin( ) and cos( ). */ ++__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp) { ++ *__sinp = sinf(__x); ++ *__cosp = cosf(__x); ++} ++ ++__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp) { ++ *__sinp = sin(__x); ++ *__cosp = cos(__x); ++} ++#else ++/* __sincospi(x,sinp,cosp) computes the sine and cosine of pi times x with a ++ single function call, storing the sine in the memory pointed to by sinp, ++ and the cosine in the memory pointed to by cosp. Edge cases match those ++ of separate calls to __sinpi( ) and __cospi( ), and are documented in the ++ man pages. ++ ++ These functions were introduced in OSX 10.9 and iOS 7.0. Because they are ++ implemented as header inlines, weak-linking does not function as normal, ++ and they are simply hidden when targeting earlier OS versions. */ ++__header_always_inline void __sincospif(float __x, float *__sinp, float *__cosp); ++__header_always_inline void __sincospi(double __x, double *__sinp, double *__cosp); ++ ++/* Implementation details of __sincos and __sincospi allowing them to return ++ two results while allowing the compiler to optimize away unnecessary load- ++ store traffic. Although these interfaces are exposed in the math.h header ++ to allow compilers to generate better code, users should call __sincos[f] ++ and __sincospi[f] instead and allow the compiler to emit these calls. */ ++struct __float2 { float __sinval; float __cosval; }; ++struct __double2 { double __sinval; double __cosval; }; ++ ++extern struct __float2 __sincosf_stret(float); ++extern struct __double2 __sincos_stret(double); ++extern struct __float2 __sincospif_stret(float); ++extern struct __double2 __sincospi_stret(double); ++ ++__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp) { ++ const struct __float2 __stret = __sincosf_stret(__x); ++ *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; ++} ++ ++__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp) { ++ const struct __double2 __stret = __sincos_stret(__x); ++ *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; ++} ++ ++__header_always_inline void __sincospif(float __x, float *__sinp, float *__cosp) { ++ const struct __float2 __stret = __sincospif_stret(__x); ++ *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; ++} ++ ++__header_always_inline void __sincospi(double __x, double *__sinp, double *__cosp) { ++ const struct __double2 __stret = __sincospi_stret(__x); ++ *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; ++} ++#endif ++ ++/****************************************************************************** ++ * POSIX/UNIX extensions to the C standard * ++ ******************************************************************************/ ++ ++#if __DARWIN_C_LEVEL >= 199506L + extern double j0 ( double ); + + extern double j1 ( double ); +@@ -543,14 +680,32 @@ + extern int signgam; /* required for unix 2003 */ + + +-#endif /* !defined(_ANSI_SOURCE) */ ++#endif /* __DARWIN_C_LEVEL >= 199506L */ + +-#if !defined(__NOEXTENSIONS__) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) +-#define __WANT_EXTENSIONS__ +-#endif ++/* Long-double versions of M_E, etc for convenience on Intel where long- ++ double is not the same as double. Define __MATH_LONG_DOUBLE_CONSTANTS ++ to make these constants available. */ ++#if defined __MATH_LONG_DOUBLE_CONSTANTS ++#define M_El 0xa.df85458a2bb4a9bp-2L ++#define M_LOG2El 0xb.8aa3b295c17f0bcp-3L ++#define M_LOG10El 0xd.e5bd8a937287195p-5L ++#define M_LN2l 0xb.17217f7d1cf79acp-4L ++#define M_LN10l 0x9.35d8dddaaa8ac17p-2L ++#define M_PIl 0xc.90fdaa22168c235p-2L ++#define M_PI_2l 0xc.90fdaa22168c235p-3L ++#define M_PI_4l 0xc.90fdaa22168c235p-4L ++#define M_1_PIl 0xa.2f9836e4e44152ap-5L ++#define M_2_PIl 0xa.2f9836e4e44152ap-4L ++#define M_2_SQRTPIl 0x9.06eba8214db688dp-3L ++#define M_SQRT2l 0xb.504f333f9de6484p-3L ++#define M_SQRT1_2l 0xb.504f333f9de6484p-4L ++#endif /* defined __MATH_LONG_DOUBLE_CONSTANTS */ + +-#ifdef __WANT_EXTENSIONS__ ++/****************************************************************************** ++ * Legacy BSD extensions to the C standard * ++ ******************************************************************************/ + ++#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL + #define FP_SNAN FP_NAN + #define FP_QNAN FP_NAN + +@@ -560,11 +715,6 @@ + /* Legacy API: please use C99 lround() instead. */ + extern long int roundtol ( double ); + +-/* +- * XOPEN/SVID +- */ +-#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) +-#if (!defined(_XOPEN_SOURCE) || defined(_DARWIN_C_SOURCE)) + #if !defined(__cplusplus) + /* used by matherr below */ + struct exception { +@@ -592,19 +742,12 @@ + #define TLOSS 5 + #define PLOSS 6 + +-#endif /* (!_XOPEN_SOURCE || _DARWIN_C_SOURCE) */ +-#endif /* !_ANSI_SOURCE && (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ +- +-#if !defined( __STRICT_ANSI__) && !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) +- + /* Legacy API: please use C99 isfinite() instead. */ + extern int finite ( double ); + + /* Legacy API: please use C99 tgamma() instead. */ + extern double gamma ( double ); + +-#if (!defined(_XOPEN_SOURCE) || defined(_DARWIN_C_SOURCE)) +- + #if !defined(__cplusplus) + extern int matherr ( struct exception * ); + #endif +@@ -633,14 +776,8 @@ + extern double lgamma_r ( double, int * ) AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; + extern long double lgammal_r ( long double, int * ) AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; + #endif /* _REENTRANT */ +- +-#endif /* (!_XOPEN_SOURCE || _DARWIN_C_SOURCE) */ +-#endif /* !_ANSI_SOURCE && (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ +- +-#endif /* __WANT_EXTENSIONS__ */ + +-#ifdef __cplusplus +-} +-#endif ++#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ + +-#endif /* __MATH__ */ ++__END_DECLS ++#endif /* __MATH_H__ */ diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libnotify/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libnotify/default.nix new file mode 100644 index 0000000..969e644 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libnotify/default.nix @@ -0,0 +1,9 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/include + cp notify.h $out/include + cp notify_keys.h $out/include + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Librpcsvc/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Librpcsvc/default.nix new file mode 100644 index 0000000..3c71531 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Librpcsvc/default.nix @@ -0,0 +1,22 @@ +{ lib, appleDerivation, developer_cmds }: + +appleDerivation { + buildInputs = [ developer_cmds ]; + + installPhase = '' + export DSTROOT=$out + export SRCROOT=$PWD + export OBJROOT=$PWD + + . ./xcodescripts/install_rpcsvc.sh + + mv $out/usr/* $out + rmdir $out/usr/ + ''; + + meta = with lib; { + maintainers = with maintainers; [ matthewbauer ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/default.nix new file mode 100644 index 0000000..87fb851 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/default.nix @@ -0,0 +1,175 @@ +{ lib, stdenv, buildPackages, fetchzip, fetchFromGitHub +, appleDerivation', xnu, Libc, Libm, libdispatch, Libinfo +, dyld, Csu, architecture, libclosure, CarbonHeaders, ncurses, CommonCrypto +, copyfile, removefile, libresolvHeaders, libresolv, Libnotify, libmalloc, libplatform, libpthread +, mDNSResponder, launchd, libutilHeaders, hfsHeaders, darwin-stubs +, headersOnly ? false +, withLibresolv ? !headersOnly +}: + +let + darling.src = fetchzip { + url = "https://github.com/darlinghq/darling/archive/d2cc5fa748003aaa70ad4180fff0a9a85dc65e9b.tar.gz"; + hash = "sha256-/YynrKJdi26Xj4lvp5wsN+TAhZjonOrNNHuk4L5tC7s="; + postFetch = '' + # The archive contains both `src/opendirectory` and `src/OpenDirectory`. + # Since neither directory is used for anything, we just remove them to avoid + # the potential issue where file systems with different case sensitivity produce + # different hashes. + rm -rf $out/src/{OpenDirectory,opendirectory} + ''; + }; + + # Libsystem needs `asl.h` from syslog. This is the version corresponding to the 10.12 SDK + # source release, but it hasn’t changed in newer versions. + syslog.src = fetchFromGitHub { + owner = "apple-oss-distributions"; + repo = "syslog"; + rev = "syslog-349.50.5"; + hash = "sha256-tXLW/TNsluhO1X9Rv3FANyzyOe5TE/hZz0gVo7JGvHA="; + }; +in +appleDerivation' stdenv { + dontBuild = true; + dontFixup = true; + + installPhase = '' + export NIX_ENFORCE_PURITY= + + mkdir -p $out/lib $out/include + + function copyHierarchy () { + mkdir -p $1 + while read f; do + mkdir -p $1/$(dirname $f) + cp --parents -pn $f $1 + done + } + + # Set up our include directories + (cd ${xnu}/include && find . -name '*.h' -or -name '*.defs' | copyHierarchy $out/include) + cp ${xnu}/Library/Frameworks/Kernel.framework/Versions/A/Headers/Availability*.h $out/include + cp ${xnu}/Library/Frameworks/Kernel.framework/Versions/A/Headers/stdarg.h $out/include + + for dep in ${Libc} ${Libm} ${Libinfo} ${dyld} ${architecture} \ + ${libclosure} ${CarbonHeaders} ${libdispatch} ${ncurses.dev} \ + ${CommonCrypto} ${copyfile} ${removefile} ${libresolvHeaders} \ + ${Libnotify} ${libplatform} ${mDNSResponder} ${launchd} \ + ${libutilHeaders} ${libmalloc} ${libpthread} ${hfsHeaders}; do + (cd $dep/include && find . -name '*.h' | copyHierarchy $out/include) + done + + (cd ${buildPackages.darwin.cctools.dev}/include/mach-o && find . -name '*.h' | copyHierarchy $out/include/mach-o) + + for header in pthread.h pthread_impl.h pthread_spis.h sched.h; do + ln -s "$out/include/pthread/$header" "$out/include/$header" + done + + # Copy `asl.h` from the syslog sources since it is no longer provided as part of Libc. + cp ${syslog.src}/libsystem_asl.tproj/include/asl.h $out/include + + mkdir -p $out/include/os + + cp ${darling.src}/src/libc/os/activity.h $out/include/os + cp ${darling.src}/src/libc/os/log.h $out/include/os + cp ${darling.src}/src/duct/include/os/trace.h $out/include/os + + cat < $out/include/os/availability.h + #ifndef __OS_AVAILABILITY__ + #define __OS_AVAILABILITY__ + #include + + #if defined(__has_feature) && defined(__has_attribute) && __has_attribute(availability) + #define API_AVAILABLE(...) __API_AVAILABLE_GET_MACRO(__VA_ARGS__, __API_AVAILABLE4, __API_AVAILABLE3, __API_AVAILABLE2, __API_AVAILABLE1)(__VA_ARGS__) + #define API_DEPRECATED(...) __API_DEPRECATED_MSG_GET_MACRO(__VA_ARGS__, __API_DEPRECATED_MSG5, __API_DEPRECATED_MSG4, __API_DEPRECATED_MSG3, __API_DEPRECATED_MSG2, __API_DEPRECATED_MSG1)(__VA_ARGS__) + #define API_DEPRECATED_WITH_REPLACEMENT(...) __API_DEPRECATED_REP_GET_MACRO(__VA_ARGS__, __API_DEPRECATED_REP5, __API_DEPRECATED_REP4, __API_DEPRECATED_REP3, __API_DEPRECATED_REP2, __API_DEPRECATED_REP1)(__VA_ARGS__) + #define API_UNAVAILABLE(...) __API_UNAVAILABLE_GET_MACRO(__VA_ARGS__, __API_UNAVAILABLE3, __API_UNAVAILABLE2, __API_UNAVAILABLE1)(__VA_ARGS__) + #else + + #define API_AVAILABLE(...) + #define API_DEPRECATED(...) + #define API_DEPRECATED_WITH_REPLACEMENT(...) + #define API_UNAVAILABLE(...) + + #endif + #endif + EOF + + cat < $out/include/TargetConditionals.h + #ifndef __TARGETCONDITIONALS__ + #define __TARGETCONDITIONALS__ + #define TARGET_OS_MAC 1 + #define TARGET_OS_WIN32 0 + #define TARGET_OS_UNIX 0 + #define TARGET_OS_OSX 1 + #define TARGET_OS_IPHONE 0 + #define TARGET_OS_IOS 0 + #define TARGET_OS_WATCH 0 + #define TARGET_OS_BRIDGE 0 + #define TARGET_OS_TV 0 + #define TARGET_OS_SIMULATOR 0 + #define TARGET_OS_EMBEDDED 0 + #define TARGET_OS_EMBEDDED_OTHER 0 /* Used in configd */ + #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ + #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */ + #define TARGET_OS_LINUX 0 + + #define TARGET_CPU_PPC 0 + #define TARGET_CPU_PPC64 0 + #define TARGET_CPU_68K 0 + #define TARGET_CPU_X86 0 + #define TARGET_CPU_X86_64 1 + #define TARGET_CPU_ARM 0 + #define TARGET_CPU_ARM64 0 + #define TARGET_CPU_MIPS 0 + #define TARGET_CPU_SPARC 0 + #define TARGET_CPU_ALPHA 0 + #define TARGET_RT_MAC_CFM 0 + #define TARGET_RT_MAC_MACHO 1 + #define TARGET_RT_LITTLE_ENDIAN 1 + #define TARGET_RT_BIG_ENDIAN 0 + #define TARGET_RT_64_BIT 1 + #endif /* __TARGETCONDITIONALS__ */ + EOF + '' + lib.optionalString (!headersOnly) '' + + # The startup object files + cp ${Csu}/lib/* $out/lib + + cp -vr \ + ${darwin-stubs}/usr/lib/libSystem.B.tbd \ + ${darwin-stubs}/usr/lib/system \ + $out/lib + + substituteInPlace $out/lib/libSystem.B.tbd \ + --replace "/usr/lib/system/" "$out/lib/system/" + ln -s libSystem.B.tbd $out/lib/libSystem.tbd + + # Set up links to pretend we work like a conventional unix (Apple's design, not mine!) + for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do + ln -s libSystem.tbd $out/lib/lib$name.tbd + done + '' + lib.optionalString withLibresolv '' + + # This probably doesn't belong here, but we want to stay similar to glibc, which includes resolv internally... + cp ${libresolv}/lib/libresolv.9.dylib $out/lib/libresolv.9.dylib + resolv_libSystem=$(${stdenv.cc.bintools.targetPrefix}otool -L "$out/lib/libresolv.9.dylib" | tail -n +3 | grep -o "$NIX_STORE.*-\S*") || true + echo $libs + + chmod +w $out/lib/libresolv.9.dylib + ${stdenv.cc.bintools.targetPrefix}install_name_tool \ + -id $out/lib/libresolv.9.dylib \ + -change "$resolv_libSystem" /usr/lib/libSystem.dylib \ + $out/lib/libresolv.9.dylib + ln -s libresolv.9.dylib $out/lib/libresolv.dylib + ''; + + appleHeaders = builtins.readFile ./headers.txt; + + meta = with lib; { + description = "The Mac OS libc/libSystem (tapi library with pure headers)"; + maintainers = with maintainers; [ copumpkin gridaphobe ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/headers.txt b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/headers.txt new file mode 100644 index 0000000..b6e608f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/headers.txt @@ -0,0 +1,1724 @@ +AssertMacros.h +Availability.h +AvailabilityInternal.h +AvailabilityMacros.h +Block.h +Block_private.h +CommonCrypto/CommonBaseXX.h +CommonCrypto/CommonBigNum.h +CommonCrypto/CommonCMACSPI.h +CommonCrypto/CommonCRC.h +CommonCrypto/CommonCrypto.h +CommonCrypto/CommonCryptoError.h +CommonCrypto/CommonCryptoPriv.h +CommonCrypto/CommonCryptor.h +CommonCrypto/CommonCryptorSPI.h +CommonCrypto/CommonDH.h +CommonCrypto/CommonDigest.h +CommonCrypto/CommonDigestSPI.h +CommonCrypto/CommonECCryptor.h +CommonCrypto/CommonHMAC.h +CommonCrypto/CommonHMacSPI.h +CommonCrypto/CommonKeyDerivation.h +CommonCrypto/CommonKeyDerivationSPI.h +CommonCrypto/CommonNumerics.h +CommonCrypto/CommonRSACryptor.h +CommonCrypto/CommonRandom.h +CommonCrypto/CommonRandomSPI.h +CommonCrypto/CommonSymmetricKeywrap.h +CommonCrypto/aes.h +CommonCrypto/lionCompat.h +ConditionalMacros.h +CrashReporterClient.h +ExtentManager.h +MacTypes.h +NSSystemDirectories.h +TargetConditionals.h +_errno.h +_libkernel_init.h +_locale.h +_simple.h +_types.h +_types/_intmax_t.h +_types/_nl_item.h +_types/_uint16_t.h +_types/_uint32_t.h +_types/_uint64_t.h +_types/_uint8_t.h +_types/_uintmax_t.h +_types/_wctrans_t.h +_types/_wctype_t.h +_wctype.h +_xlocale.h +aio.h +aliasdb.h +alloca.h +ar.h +architecture/alignment.h +architecture/byte_order.h +architecture/i386/alignment.h +architecture/i386/asm_help.h +architecture/i386/byte_order.h +architecture/i386/cpu.h +architecture/i386/desc.h +architecture/i386/fpu.h +architecture/i386/frame.h +architecture/i386/io.h +architecture/i386/pio.h +architecture/i386/reg_help.h +architecture/i386/sel.h +architecture/i386/table.h +architecture/i386/tss.h +arpa/ftp.h +arpa/inet.h +arpa/nameser.h +arpa/nameser_compat.h +arpa/telnet.h +arpa/tftp.h +asl.h +assert.h +atm/atm_notification.defs +atm/atm_types.defs +atm/atm_types.h +bank/bank_types.h +bitstring.h +bootparams.h +bootstrap.h +bootstrap_priv.h +bsd/bsm/audit.h +bsd/dev/random/randomdev.h +bsd/i386/_limits.h +bsd/i386/_mcontext.h +bsd/i386/_param.h +bsd/i386/_types.h +bsd/i386/endian.h +bsd/i386/limits.h +bsd/i386/param.h +bsd/i386/profile.h +bsd/i386/signal.h +bsd/i386/types.h +bsd/i386/vmparam.h +bsd/libkern/libkern.h +bsd/machine/_limits.h +bsd/machine/_mcontext.h +bsd/machine/_param.h +bsd/machine/_types.h +bsd/machine/byte_order.h +bsd/machine/disklabel.h +bsd/machine/endian.h +bsd/machine/limits.h +bsd/machine/param.h +bsd/machine/profile.h +bsd/machine/signal.h +bsd/machine/spl.h +bsd/machine/types.h +bsd/machine/vmparam.h +bsd/miscfs/devfs/devfs.h +bsd/miscfs/devfs/devfs_proto.h +bsd/miscfs/devfs/devfsdefs.h +bsd/miscfs/devfs/fdesc.h +bsd/miscfs/fifofs/fifo.h +bsd/miscfs/specfs/specdev.h +bsd/miscfs/union/union.h +bsd/net/bpf.h +bsd/net/dlil.h +bsd/net/ethernet.h +bsd/net/if.h +bsd/net/if_arp.h +bsd/net/if_dl.h +bsd/net/if_ether.h +bsd/net/if_llc.h +bsd/net/if_media.h +bsd/net/if_mib.h +bsd/net/if_types.h +bsd/net/if_utun.h +bsd/net/if_var.h +bsd/net/init.h +bsd/net/kext_net.h +bsd/net/kpi_interface.h +bsd/net/kpi_interfacefilter.h +bsd/net/kpi_protocol.h +bsd/net/ndrv.h +bsd/net/net_kev.h +bsd/net/pfkeyv2.h +bsd/net/radix.h +bsd/net/route.h +bsd/netinet/bootp.h +bsd/netinet/icmp6.h +bsd/netinet/icmp_var.h +bsd/netinet/if_ether.h +bsd/netinet/igmp.h +bsd/netinet/igmp_var.h +bsd/netinet/in.h +bsd/netinet/in_arp.h +bsd/netinet/in_pcb.h +bsd/netinet/in_systm.h +bsd/netinet/in_var.h +bsd/netinet/ip.h +bsd/netinet/ip6.h +bsd/netinet/ip_icmp.h +bsd/netinet/ip_var.h +bsd/netinet/kpi_ipfilter.h +bsd/netinet/tcp.h +bsd/netinet/tcp_fsm.h +bsd/netinet/tcp_seq.h +bsd/netinet/tcp_timer.h +bsd/netinet/tcp_var.h +bsd/netinet/tcpip.h +bsd/netinet/udp.h +bsd/netinet/udp_var.h +bsd/netinet6/ah.h +bsd/netinet6/esp.h +bsd/netinet6/in6.h +bsd/netinet6/in6_var.h +bsd/netinet6/ipcomp.h +bsd/netinet6/ipsec.h +bsd/netinet6/nd6.h +bsd/netinet6/raw_ip6.h +bsd/netinet6/scope6_var.h +bsd/netkey/keysock.h +bsd/security/audit/audit.h +bsd/security/audit/audit_bsd.h +bsd/security/audit/audit_ioctl.h +bsd/security/audit/audit_private.h +bsd/sys/_endian.h +bsd/sys/_select.h +bsd/sys/_structs.h +bsd/sys/_types.h +bsd/sys/_types/_blkcnt_t.h +bsd/sys/_types/_blksize_t.h +bsd/sys/_types/_clock_t.h +bsd/sys/_types/_ct_rune_t.h +bsd/sys/_types/_dev_t.h +bsd/sys/_types/_errno_t.h +bsd/sys/_types/_fd_clr.h +bsd/sys/_types/_fd_copy.h +bsd/sys/_types/_fd_def.h +bsd/sys/_types/_fd_isset.h +bsd/sys/_types/_fd_set.h +bsd/sys/_types/_fd_setsize.h +bsd/sys/_types/_fd_zero.h +bsd/sys/_types/_filesec_t.h +bsd/sys/_types/_fsblkcnt_t.h +bsd/sys/_types/_fsfilcnt_t.h +bsd/sys/_types/_fsid_t.h +bsd/sys/_types/_fsobj_id_t.h +bsd/sys/_types/_gid_t.h +bsd/sys/_types/_guid_t.h +bsd/sys/_types/_id_t.h +bsd/sys/_types/_in_addr_t.h +bsd/sys/_types/_in_port_t.h +bsd/sys/_types/_ino64_t.h +bsd/sys/_types/_ino_t.h +bsd/sys/_types/_int16_t.h +bsd/sys/_types/_int32_t.h +bsd/sys/_types/_int64_t.h +bsd/sys/_types/_int8_t.h +bsd/sys/_types/_intptr_t.h +bsd/sys/_types/_iovec_t.h +bsd/sys/_types/_key_t.h +bsd/sys/_types/_mach_port_t.h +bsd/sys/_types/_mbstate_t.h +bsd/sys/_types/_mode_t.h +bsd/sys/_types/_nlink_t.h +bsd/sys/_types/_null.h +bsd/sys/_types/_o_dsync.h +bsd/sys/_types/_o_sync.h +bsd/sys/_types/_off_t.h +bsd/sys/_types/_offsetof.h +bsd/sys/_types/_os_inline.h +bsd/sys/_types/_pid_t.h +bsd/sys/_types/_posix_vdisable.h +bsd/sys/_types/_ptrdiff_t.h +bsd/sys/_types/_rsize_t.h +bsd/sys/_types/_rune_t.h +bsd/sys/_types/_s_ifmt.h +bsd/sys/_types/_sa_family_t.h +bsd/sys/_types/_seek_set.h +bsd/sys/_types/_sigaltstack.h +bsd/sys/_types/_sigset_t.h +bsd/sys/_types/_size_t.h +bsd/sys/_types/_socklen_t.h +bsd/sys/_types/_ssize_t.h +bsd/sys/_types/_suseconds_t.h +bsd/sys/_types/_time_t.h +bsd/sys/_types/_timespec.h +bsd/sys/_types/_timeval.h +bsd/sys/_types/_timeval32.h +bsd/sys/_types/_timeval64.h +bsd/sys/_types/_u_int16_t.h +bsd/sys/_types/_u_int32_t.h +bsd/sys/_types/_u_int64_t.h +bsd/sys/_types/_u_int8_t.h +bsd/sys/_types/_ucontext.h +bsd/sys/_types/_ucontext64.h +bsd/sys/_types/_uid_t.h +bsd/sys/_types/_uintptr_t.h +bsd/sys/_types/_useconds_t.h +bsd/sys/_types/_user32_itimerval.h +bsd/sys/_types/_user32_timespec.h +bsd/sys/_types/_user32_timeval.h +bsd/sys/_types/_user64_itimerval.h +bsd/sys/_types/_user64_timespec.h +bsd/sys/_types/_user64_timeval.h +bsd/sys/_types/_user_timespec.h +bsd/sys/_types/_user_timeval.h +bsd/sys/_types/_uuid_t.h +bsd/sys/_types/_va_list.h +bsd/sys/_types/_wchar_t.h +bsd/sys/_types/_wint_t.h +bsd/sys/appleapiopts.h +bsd/sys/attr.h +bsd/sys/bsdtask_info.h +bsd/sys/buf.h +bsd/sys/cdefs.h +bsd/sys/codesign.h +bsd/sys/conf.h +bsd/sys/content_protection.h +bsd/sys/cprotect.h +bsd/sys/csr.h +bsd/sys/decmpfs.h +bsd/sys/dir.h +bsd/sys/dirent.h +bsd/sys/disk.h +bsd/sys/disklabel.h +bsd/sys/disktab.h +bsd/sys/dkstat.h +bsd/sys/doc_tombstone.h +bsd/sys/domain.h +bsd/sys/errno.h +bsd/sys/ev.h +bsd/sys/event.h +bsd/sys/eventvar.h +bsd/sys/fbt.h +bsd/sys/fcntl.h +bsd/sys/file.h +bsd/sys/file_internal.h +bsd/sys/filedesc.h +bsd/sys/fileport.h +bsd/sys/filio.h +bsd/sys/fsctl.h +bsd/sys/fsevents.h +bsd/sys/fslog.h +bsd/sys/guarded.h +bsd/sys/imgact.h +bsd/sys/ioccom.h +bsd/sys/ioctl.h +bsd/sys/ioctl_compat.h +bsd/sys/ipc.h +bsd/sys/kasl.h +bsd/sys/kauth.h +bsd/sys/kdebug.h +bsd/sys/kdebugevents.h +bsd/sys/kern_control.h +bsd/sys/kern_event.h +bsd/sys/kern_memorystatus.h +bsd/sys/kernel.h +bsd/sys/kernel_types.h +bsd/sys/kpi_mbuf.h +bsd/sys/kpi_private.h +bsd/sys/kpi_socket.h +bsd/sys/kpi_socketfilter.h +bsd/sys/ktrace.h +bsd/sys/linker_set.h +bsd/sys/lock.h +bsd/sys/lockf.h +bsd/sys/mach_swapon.h +bsd/sys/malloc.h +bsd/sys/mbuf.h +bsd/sys/md5.h +bsd/sys/memory_maintenance.h +bsd/sys/mman.h +bsd/sys/mount.h +bsd/sys/mount_internal.h +bsd/sys/msg.h +bsd/sys/msgbuf.h +bsd/sys/munge.h +bsd/sys/namei.h +bsd/sys/netport.h +bsd/sys/param.h +bsd/sys/paths.h +bsd/sys/persona.h +bsd/sys/pgo.h +bsd/sys/pipe.h +bsd/sys/posix_sem.h +bsd/sys/posix_shm.h +bsd/sys/priv.h +bsd/sys/proc.h +bsd/sys/proc_info.h +bsd/sys/proc_internal.h +bsd/sys/protosw.h +bsd/sys/pthread_internal.h +bsd/sys/pthread_shims.h +bsd/sys/queue.h +bsd/sys/quota.h +bsd/sys/random.h +bsd/sys/reason.h +bsd/sys/resource.h +bsd/sys/resourcevar.h +bsd/sys/sbuf.h +bsd/sys/select.h +bsd/sys/sem.h +bsd/sys/sem_internal.h +bsd/sys/semaphore.h +bsd/sys/shm.h +bsd/sys/shm_internal.h +bsd/sys/signal.h +bsd/sys/signalvar.h +bsd/sys/socket.h +bsd/sys/socketvar.h +bsd/sys/sockio.h +bsd/sys/spawn.h +bsd/sys/spawn_internal.h +bsd/sys/stackshot.h +bsd/sys/stat.h +bsd/sys/stdio.h +bsd/sys/sys_domain.h +bsd/sys/syscall.h +bsd/sys/sysctl.h +bsd/sys/syslimits.h +bsd/sys/syslog.h +bsd/sys/sysproto.h +bsd/sys/systm.h +bsd/sys/termios.h +bsd/sys/time.h +bsd/sys/tree.h +bsd/sys/tty.h +bsd/sys/ttychars.h +bsd/sys/ttycom.h +bsd/sys/ttydefaults.h +bsd/sys/ttydev.h +bsd/sys/types.h +bsd/sys/ubc.h +bsd/sys/ucontext.h +bsd/sys/ucred.h +bsd/sys/uio.h +bsd/sys/uio_internal.h +bsd/sys/ulock.h +bsd/sys/un.h +bsd/sys/unistd.h +bsd/sys/unpcb.h +bsd/sys/user.h +bsd/sys/utfconv.h +bsd/sys/vfs_context.h +bsd/sys/vm.h +bsd/sys/vmmeter.h +bsd/sys/vmparam.h +bsd/sys/vnode.h +bsd/sys/vnode_if.h +bsd/sys/vnode_internal.h +bsd/sys/wait.h +bsd/sys/xattr.h +bsd/uuid/uuid.h +bsd/vfs/vfs_support.h +bsd/vm/vnode_pager.h +bsm/audit.h +bsm/audit_domain.h +bsm/audit_errno.h +bsm/audit_fcntl.h +bsm/audit_internal.h +bsm/audit_kevents.h +bsm/audit_record.h +bsm/audit_socket_type.h +checkint.h +complex.h +configuration_profile.h +copyfile.h +corecrypto/cc.h +corecrypto/cc_config.h +corecrypto/cc_debug.h +corecrypto/cc_macros.h +corecrypto/cc_priv.h +corecrypto/ccaes.h +corecrypto/ccasn1.h +corecrypto/cccmac.h +corecrypto/ccder.h +corecrypto/ccdes.h +corecrypto/ccdigest.h +corecrypto/ccdigest_priv.h +corecrypto/ccdrbg.h +corecrypto/ccdrbg_impl.h +corecrypto/cchmac.h +corecrypto/ccmd5.h +corecrypto/ccmode.h +corecrypto/ccmode_factory.h +corecrypto/ccmode_impl.h +corecrypto/ccmode_siv.h +corecrypto/ccn.h +corecrypto/ccpad.h +corecrypto/ccpbkdf2.h +corecrypto/ccrc4.h +corecrypto/ccrng.h +corecrypto/ccrng_system.h +corecrypto/ccrsa.h +corecrypto/ccsha1.h +corecrypto/ccsha2.h +corecrypto/cczp.h +corpses/task_corpse.h +cpio.h +crt_externs.h +ctype.h +curses.h +cursesapp.h +cursesf.h +cursesm.h +cursesp.h +cursesw.h +cursslk.h +db.h +default_pager/default_pager_types.h +device/device.defs +device/device_port.h +device/device_types.defs +device/device_types.h +dirent.h +disktab.h +dispatch/base.h +dispatch/benchmark.h +dispatch/block.h +dispatch/data.h +dispatch/data_private.h +dispatch/dispatch.h +dispatch/group.h +dispatch/introspection.h +dispatch/introspection_private.h +dispatch/io.h +dispatch/io_private.h +dispatch/layout_private.h +dispatch/mach_private.h +dispatch/object.h +dispatch/once.h +dispatch/private.h +dispatch/queue.h +dispatch/queue_private.h +dispatch/semaphore.h +dispatch/source.h +dispatch/source_private.h +dispatch/time.h +dlfcn.h +dns.h +dns_sd.h +dns_util.h +err.h +errno.h +eti.h +etip.h +execinfo.h +fcntl.h +fenv.h +fmtmsg.h +fnmatch.h +form.h +fsproperties.h +fstab.h +fts.h +ftw.h +get_compat.h +gethostuuid.h +gethostuuid_private.h +getopt.h +glob.h +grp.h +hfs/BTreeScanner.h +hfs/BTreesInternal.h +hfs/BTreesPrivate.h +hfs/CatalogPrivate.h +hfs/FileMgrInternal.h +hfs/HFSUnicodeWrappers.h +hfs/UCStringCompareData.h +hfs/hfs.h +hfs/hfs_alloc_trace.h +hfs/hfs_attrlist.h +hfs/hfs_btreeio.h +hfs/hfs_catalog.h +hfs/hfs_cnode.h +hfs/hfs_cprotect.h +hfs/hfs_dbg.h +hfs/hfs_endian.h +hfs/hfs_extents.h +hfs/hfs_format.h +hfs/hfs_fsctl.h +hfs/hfs_hotfiles.h +hfs/hfs_iokit.h +hfs/hfs_journal.h +hfs/hfs_kdebug.h +hfs/hfs_key_roll.h +hfs/hfs_macos_defs.h +hfs/hfs_mount.h +hfs/hfs_quota.h +hfs/hfs_unistr.h +hfs/kext-config.h +hfs/rangelist.h +i386/_limits.h +i386/_mcontext.h +i386/_param.h +i386/_types.h +i386/eflags.h +i386/endian.h +i386/fasttrap_isa.h +i386/limits.h +i386/param.h +i386/profile.h +i386/signal.h +i386/types.h +i386/user_ldt.h +i386/vmparam.h +ifaddrs.h +ils.h +inttypes.h +iokit/IOKit/AppleKeyStoreInterface.h +iokit/IOKit/IOBSD.h +iokit/IOKit/IOBufferMemoryDescriptor.h +iokit/IOKit/IOCPU.h +iokit/IOKit/IOCatalogue.h +iokit/IOKit/IOCommand.h +iokit/IOKit/IOCommandGate.h +iokit/IOKit/IOCommandPool.h +iokit/IOKit/IOCommandQueue.h +iokit/IOKit/IOConditionLock.h +iokit/IOKit/IODMACommand.h +iokit/IOKit/IODMAController.h +iokit/IOKit/IODMAEventSource.h +iokit/IOKit/IODataQueue.h +iokit/IOKit/IODataQueueShared.h +iokit/IOKit/IODeviceMemory.h +iokit/IOKit/IODeviceTreeSupport.h +iokit/IOKit/IOEventSource.h +iokit/IOKit/IOFilterInterruptEventSource.h +iokit/IOKit/IOHibernatePrivate.h +iokit/IOKit/IOInterleavedMemoryDescriptor.h +iokit/IOKit/IOInterruptAccounting.h +iokit/IOKit/IOInterruptController.h +iokit/IOKit/IOInterruptEventSource.h +iokit/IOKit/IOInterrupts.h +iokit/IOKit/IOKernelReportStructs.h +iokit/IOKit/IOKernelReporters.h +iokit/IOKit/IOKitDebug.h +iokit/IOKit/IOKitDiagnosticsUserClient.h +iokit/IOKit/IOKitKeys.h +iokit/IOKit/IOKitKeysPrivate.h +iokit/IOKit/IOKitServer.h +iokit/IOKit/IOLib.h +iokit/IOKit/IOLocks.h +iokit/IOKit/IOLocksPrivate.h +iokit/IOKit/IOMapper.h +iokit/IOKit/IOMemoryCursor.h +iokit/IOKit/IOMemoryDescriptor.h +iokit/IOKit/IOMessage.h +iokit/IOKit/IOMultiMemoryDescriptor.h +iokit/IOKit/IONVRAM.h +iokit/IOKit/IONotifier.h +iokit/IOKit/IOPlatformExpert.h +iokit/IOKit/IOPolledInterface.h +iokit/IOKit/IORangeAllocator.h +iokit/IOKit/IORegistryEntry.h +iokit/IOKit/IOReportMacros.h +iokit/IOKit/IOReportTypes.h +iokit/IOKit/IOReturn.h +iokit/IOKit/IOService.h +iokit/IOKit/IOServicePM.h +iokit/IOKit/IOSharedDataQueue.h +iokit/IOKit/IOSharedLock.h +iokit/IOKit/IOStatistics.h +iokit/IOKit/IOStatisticsPrivate.h +iokit/IOKit/IOSubMemoryDescriptor.h +iokit/IOKit/IOSyncer.h +iokit/IOKit/IOTimeStamp.h +iokit/IOKit/IOTimerEventSource.h +iokit/IOKit/IOTypes.h +iokit/IOKit/IOUserClient.h +iokit/IOKit/IOWorkLoop.h +iokit/IOKit/OSMessageNotification.h +iokit/IOKit/assert.h +iokit/IOKit/nvram/IONVRAMController.h +iokit/IOKit/platform/AppleMacIO.h +iokit/IOKit/platform/AppleMacIODevice.h +iokit/IOKit/platform/AppleNMI.h +iokit/IOKit/platform/ApplePlatformExpert.h +iokit/IOKit/power/IOPwrController.h +iokit/IOKit/pwr_mgt/IOPM.h +iokit/IOKit/pwr_mgt/IOPMLibDefs.h +iokit/IOKit/pwr_mgt/IOPMPowerSource.h +iokit/IOKit/pwr_mgt/IOPMPowerSourceList.h +iokit/IOKit/pwr_mgt/IOPMpowerState.h +iokit/IOKit/pwr_mgt/IOPowerConnection.h +iokit/IOKit/pwr_mgt/RootDomain.h +iokit/IOKit/rtc/IORTCController.h +iokit/IOKit/system.h +iokit/IOKit/system_management/IOWatchDogTimer.h +iso646.h +kern/exc_resource.h +kern/kcdata.h +kern/kern_cdata.h +kvbuf.h +langinfo.h +launch.h +launch_internal.h +launch_priv.h +libc.h +libc_private.h +libgen.h +libinfo.h +libinfo_muser.h +libkern/OSAtomic.h +libkern/OSAtomicDeprecated.h +libkern/OSAtomicQueue.h +libkern/OSByteOrder.h +libkern/OSCacheControl.h +libkern/OSDebug.h +libkern/OSKextLib.h +libkern/OSReturn.h +libkern/OSSpinLockDeprecated.h +libkern/OSTypes.h +libkern/_OSByteOrder.h +libkern/firehose/chunk_private.h +libkern/firehose/firehose_types_private.h +libkern/firehose/ioctl_private.h +libkern/firehose/tracepoint_private.h +libkern/i386/OSByteOrder.h +libkern/i386/_OSByteOrder.h +libkern/libkern/OSAtomic.h +libkern/libkern/OSBase.h +libkern/libkern/OSByteOrder.h +libkern/libkern/OSDebug.h +libkern/libkern/OSKextLib.h +libkern/libkern/OSKextLibPrivate.h +libkern/libkern/OSMalloc.h +libkern/libkern/OSReturn.h +libkern/libkern/OSSerializeBinary.h +libkern/libkern/OSTypes.h +libkern/libkern/_OSByteOrder.h +libkern/libkern/c++/OSArray.h +libkern/libkern/c++/OSBoolean.h +libkern/libkern/c++/OSCPPDebug.h +libkern/libkern/c++/OSCollection.h +libkern/libkern/c++/OSCollectionIterator.h +libkern/libkern/c++/OSContainers.h +libkern/libkern/c++/OSData.h +libkern/libkern/c++/OSDictionary.h +libkern/libkern/c++/OSEndianTypes.h +libkern/libkern/c++/OSIterator.h +libkern/libkern/c++/OSKext.h +libkern/libkern/c++/OSLib.h +libkern/libkern/c++/OSMetaClass.h +libkern/libkern/c++/OSNumber.h +libkern/libkern/c++/OSObject.h +libkern/libkern/c++/OSOrderedSet.h +libkern/libkern/c++/OSSerialize.h +libkern/libkern/c++/OSSet.h +libkern/libkern/c++/OSString.h +libkern/libkern/c++/OSSymbol.h +libkern/libkern/c++/OSUnserialize.h +libkern/libkern/crypto/aes.h +libkern/libkern/crypto/aesxts.h +libkern/libkern/crypto/crypto_internal.h +libkern/libkern/crypto/des.h +libkern/libkern/crypto/md5.h +libkern/libkern/crypto/rand.h +libkern/libkern/crypto/register_crypto.h +libkern/libkern/crypto/rsa.h +libkern/libkern/crypto/sha1.h +libkern/libkern/crypto/sha2.h +libkern/libkern/i386/OSByteOrder.h +libkern/libkern/i386/_OSByteOrder.h +libkern/libkern/kernel_mach_header.h +libkern/libkern/kext_request_keys.h +libkern/libkern/kxld.h +libkern/libkern/kxld_types.h +libkern/libkern/locks.h +libkern/libkern/machine/OSByteOrder.h +libkern/libkern/mkext.h +libkern/libkern/prelink.h +libkern/libkern/section_keywords.h +libkern/libkern/stack_protector.h +libkern/libkern/sysctl.h +libkern/libkern/tree.h +libkern/libkern/version.h +libkern/libkern/zconf.h +libkern/libkern/zlib.h +libkern/machine/OSByteOrder.h +libkern/os/base.h +libkern/os/log.h +libkern/os/log_private.h +libkern/os/object.h +libkern/os/object_private.h +libkern/os/overflow.h +libkern/os/trace.h +libproc.h +libutil.h +limits.h +locale.h +mach-o/arch.h +mach-o/arm/reloc.h +mach-o/arm64/reloc.h +mach-o/dyld-interposing.h +mach-o/dyld.h +mach-o/dyld_gdb.h +mach-o/dyld_images.h +mach-o/dyld_priv.h +mach-o/dyld_process_info.h +mach-o/fat.h +mach-o/getsect.h +mach-o/hppa/reloc.h +mach-o/hppa/swap.h +mach-o/i386/swap.h +mach-o/i860/reloc.h +mach-o/i860/swap.h +mach-o/ldsyms.h +mach-o/loader.h +mach-o/m68k/swap.h +mach-o/m88k/reloc.h +mach-o/m88k/swap.h +mach-o/nlist.h +mach-o/ppc/reloc.h +mach-o/ppc/swap.h +mach-o/ranlib.h +mach-o/reloc.h +mach-o/sparc/reloc.h +mach-o/sparc/swap.h +mach-o/stab.h +mach-o/swap.h +mach-o/x86_64/reloc.h +mach/audit_triggers.defs +mach/boolean.h +mach/bootstrap.h +mach/clock.defs +mach/clock.h +mach/clock_priv.defs +mach/clock_priv.h +mach/clock_reply.defs +mach/clock_reply.h +mach/clock_types.defs +mach/clock_types.h +mach/dyld_kernel.h +mach/error.h +mach/exc.defs +mach/exc.h +mach/exception.h +mach/exception_types.h +mach/host_info.h +mach/host_notify.h +mach/host_notify_reply.defs +mach/host_priv.defs +mach/host_priv.h +mach/host_reboot.h +mach/host_security.defs +mach/host_security.h +mach/host_special_ports.h +mach/i386/_structs.h +mach/i386/asm.h +mach/i386/boolean.h +mach/i386/exception.h +mach/i386/fp_reg.h +mach/i386/kern_return.h +mach/i386/ndr_def.h +mach/i386/processor_info.h +mach/i386/rpc.h +mach/i386/sdt_isa.h +mach/i386/thread_state.h +mach/i386/thread_status.h +mach/i386/vm_param.h +mach/i386/vm_types.h +mach/kern_return.h +mach/kmod.h +mach/lock_set.defs +mach/lock_set.h +mach/mach.h +mach/mach_error.h +mach/mach_exc.defs +mach/mach_host.defs +mach/mach_host.h +mach/mach_init.h +mach/mach_interface.h +mach/mach_param.h +mach/mach_port.defs +mach/mach_port.h +mach/mach_port_internal.h +mach/mach_syscalls.h +mach/mach_time.h +mach/mach_traps.h +mach/mach_types.defs +mach/mach_types.h +mach/mach_vm.defs +mach/mach_vm.h +mach/mach_vm_internal.h +mach/mach_voucher.defs +mach/mach_voucher.h +mach/mach_voucher_attr_control.defs +mach/mach_voucher_types.h +mach/machine.h +mach/machine/asm.h +mach/machine/boolean.h +mach/machine/exception.h +mach/machine/kern_return.h +mach/machine/machine_types.defs +mach/machine/ndr_def.h +mach/machine/processor_info.h +mach/machine/rpc.h +mach/machine/sdt.h +mach/machine/sdt_isa.h +mach/machine/thread_state.h +mach/machine/thread_status.h +mach/machine/vm_param.h +mach/machine/vm_types.h +mach/memory_object_types.h +mach/message.h +mach/mig.h +mach/mig_errors.h +mach/mig_strncpy_zerofill_support.h +mach/mig_voucher_support.h +mach/ndr.h +mach/notify.defs +mach/notify.h +mach/policy.h +mach/port.h +mach/port_obj.h +mach/processor.defs +mach/processor.h +mach/processor_info.h +mach/processor_set.defs +mach/processor_set.h +mach/rpc.h +mach/sdt.h +mach/semaphore.h +mach/shared_memory_server.h +mach/shared_region.h +mach/std_types.defs +mach/std_types.h +mach/sync.h +mach/sync_policy.h +mach/task.defs +mach/task.h +mach/task_access.defs +mach/task_info.h +mach/task_policy.h +mach/task_special_ports.h +mach/telemetry_notification.defs +mach/thread_act.defs +mach/thread_act.h +mach/thread_act_internal.h +mach/thread_info.h +mach/thread_policy.h +mach/thread_special_ports.h +mach/thread_state.h +mach/thread_status.h +mach/thread_switch.h +mach/time_value.h +mach/vm_attributes.h +mach/vm_behavior.h +mach/vm_inherit.h +mach/vm_map.defs +mach/vm_map.h +mach/vm_map_internal.h +mach/vm_page_size.h +mach/vm_param.h +mach/vm_prot.h +mach/vm_purgable.h +mach/vm_region.h +mach/vm_statistics.h +mach/vm_sync.h +mach/vm_task.h +mach/vm_types.h +mach_debug/hash_info.h +mach_debug/ipc_info.h +mach_debug/lockgroup_info.h +mach_debug/mach_debug.h +mach_debug/mach_debug_types.defs +mach_debug/mach_debug_types.h +mach_debug/page_info.h +mach_debug/vm_info.h +mach_debug/zone_info.h +machine/_limits.h +machine/_mcontext.h +machine/_param.h +machine/_types.h +machine/byte_order.h +machine/endian.h +machine/fasttrap_isa.h +machine/limits.h +machine/param.h +machine/profile.h +machine/signal.h +machine/types.h +machine/vmparam.h +malloc/malloc.h +math.h +membership.h +membershipPriv.h +memory.h +menu.h +miscfs/devfs/devfs.h +miscfs/specfs/specdev.h +miscfs/union/union.h +mntopts.h +monetary.h +monitor.h +mpool.h +msgcat.h +nameser.h +nc_tparm.h +ncurses.h +ncurses_dll.h +ndbm.h +net/bpf.h +net/dlil.h +net/ethernet.h +net/if.h +net/if_arp.h +net/if_dl.h +net/if_llc.h +net/if_media.h +net/if_mib.h +net/if_types.h +net/if_utun.h +net/if_var.h +net/kext_net.h +net/ndrv.h +net/net_kev.h +net/pfkeyv2.h +net/route.h +netdb.h +netdb_async.h +netinet/bootp.h +netinet/icmp6.h +netinet/icmp_var.h +netinet/if_ether.h +netinet/igmp.h +netinet/igmp_var.h +netinet/in.h +netinet/in_pcb.h +netinet/in_systm.h +netinet/in_var.h +netinet/ip.h +netinet/ip6.h +netinet/ip_icmp.h +netinet/ip_var.h +netinet/tcp.h +netinet/tcp_fsm.h +netinet/tcp_seq.h +netinet/tcp_timer.h +netinet/tcp_var.h +netinet/tcpip.h +netinet/udp.h +netinet/udp_var.h +netinet6/ah.h +netinet6/esp.h +netinet6/in6.h +netinet6/in6_var.h +netinet6/ipcomp.h +netinet6/ipsec.h +netinet6/nd6.h +netinet6/raw_ip6.h +netinet6/scope6_var.h +netkey/keysock.h +nfs/krpc.h +nfs/nfs.h +nfs/nfs_gss.h +nfs/nfs_ioctl.h +nfs/nfs_lock.h +nfs/nfsdiskless.h +nfs/nfsm_subs.h +nfs/nfsmount.h +nfs/nfsnode.h +nfs/nfsproto.h +nfs/nfsrvcache.h +nfs/rpcv2.h +nfs/xdr_subs.h +nl_types.h +nlist.h +notify.h +notify_keys.h +ntsid.h +objc-shared-cache.h +os/activity.h +os/alloc_once_impl.h +os/assumes.h +os/availability.h +os/base.h +os/base_private.h +os/debug_private.h +os/internal/atomic.h +os/internal/crashlog.h +os/internal/internal_shared.h +os/lock.h +os/lock_private.h +os/log.h +os/object.h +os/object_private.h +os/once_private.h +os/overflow.h +os/semaphore_private.h +os/trace.h +os/tsd.h +os/voucher_activity_private.h +os/voucher_private.h +osfmk/UserNotification/KUNCUserNotifications.h +osfmk/UserNotification/UNDReply.defs +osfmk/UserNotification/UNDRequest.defs +osfmk/UserNotification/UNDTypes.defs +osfmk/UserNotification/UNDTypes.h +osfmk/atm/atm_internal.h +osfmk/atm/atm_notification.defs +osfmk/atm/atm_types.defs +osfmk/atm/atm_types.h +osfmk/bank/bank_types.h +osfmk/console/video_console.h +osfmk/corpses/task_corpse.h +osfmk/default_pager/default_pager_types.h +osfmk/device/device.defs +osfmk/device/device_port.h +osfmk/device/device_types.defs +osfmk/device/device_types.h +osfmk/gssd/gssd_mach.defs +osfmk/gssd/gssd_mach.h +osfmk/gssd/gssd_mach_types.h +osfmk/i386/apic.h +osfmk/i386/asm.h +osfmk/i386/atomic.h +osfmk/i386/bit_routines.h +osfmk/i386/cpu_capabilities.h +osfmk/i386/cpu_data.h +osfmk/i386/cpu_number.h +osfmk/i386/cpu_topology.h +osfmk/i386/cpuid.h +osfmk/i386/eflags.h +osfmk/i386/io_map_entries.h +osfmk/i386/lapic.h +osfmk/i386/lock.h +osfmk/i386/locks.h +osfmk/i386/machine_cpu.h +osfmk/i386/machine_routines.h +osfmk/i386/mp.h +osfmk/i386/mp_desc.h +osfmk/i386/mp_events.h +osfmk/i386/mtrr.h +osfmk/i386/pal_hibernate.h +osfmk/i386/pal_native.h +osfmk/i386/pal_routines.h +osfmk/i386/panic_hooks.h +osfmk/i386/pmCPU.h +osfmk/i386/pmap.h +osfmk/i386/proc_reg.h +osfmk/i386/rtclock_protos.h +osfmk/i386/seg.h +osfmk/i386/simple_lock.h +osfmk/i386/smp.h +osfmk/i386/tsc.h +osfmk/i386/tss.h +osfmk/i386/ucode.h +osfmk/i386/vmx.h +osfmk/ipc/ipc_types.h +osfmk/kdp/kdp_callout.h +osfmk/kdp/kdp_dyld.h +osfmk/kdp/kdp_en_debugger.h +osfmk/kern/affinity.h +osfmk/kern/assert.h +osfmk/kern/audit_sessionport.h +osfmk/kern/backtrace.h +osfmk/kern/bits.h +osfmk/kern/block_hint.h +osfmk/kern/call_entry.h +osfmk/kern/clock.h +osfmk/kern/coalition.h +osfmk/kern/cpu_data.h +osfmk/kern/cpu_number.h +osfmk/kern/debug.h +osfmk/kern/ecc.h +osfmk/kern/energy_perf.h +osfmk/kern/exc_resource.h +osfmk/kern/extmod_statistics.h +osfmk/kern/host.h +osfmk/kern/hv_support.h +osfmk/kern/ipc_mig.h +osfmk/kern/ipc_misc.h +osfmk/kern/kalloc.h +osfmk/kern/kcdata.h +osfmk/kern/kern_cdata.h +osfmk/kern/kern_types.h +osfmk/kern/kext_alloc.h +osfmk/kern/kpc.h +osfmk/kern/ledger.h +osfmk/kern/lock.h +osfmk/kern/locks.h +osfmk/kern/mach_param.h +osfmk/kern/macro_help.h +osfmk/kern/page_decrypt.h +osfmk/kern/pms.h +osfmk/kern/policy_internal.h +osfmk/kern/processor.h +osfmk/kern/queue.h +osfmk/kern/sched_prim.h +osfmk/kern/sfi.h +osfmk/kern/simple_lock.h +osfmk/kern/startup.h +osfmk/kern/task.h +osfmk/kern/telemetry.h +osfmk/kern/thread.h +osfmk/kern/thread_call.h +osfmk/kern/timer_call.h +osfmk/kern/waitq.h +osfmk/kern/zalloc.h +osfmk/kextd/kextd_mach.defs +osfmk/kextd/kextd_mach.h +osfmk/kperf/action.h +osfmk/kperf/context.h +osfmk/kperf/kdebug_trigger.h +osfmk/kperf/kperf.h +osfmk/kperf/kperf_timer.h +osfmk/kperf/kperfbsd.h +osfmk/kperf/pet.h +osfmk/lockd/lockd_mach.defs +osfmk/lockd/lockd_mach.h +osfmk/lockd/lockd_mach_types.h +osfmk/mach/audit_triggers.defs +osfmk/mach/audit_triggers_server.h +osfmk/mach/boolean.h +osfmk/mach/branch_predicates.h +osfmk/mach/clock.defs +osfmk/mach/clock.h +osfmk/mach/clock_priv.defs +osfmk/mach/clock_priv.h +osfmk/mach/clock_reply.defs +osfmk/mach/clock_reply_server.h +osfmk/mach/clock_types.defs +osfmk/mach/clock_types.h +osfmk/mach/coalition.h +osfmk/mach/coalition_notification_server.h +osfmk/mach/dyld_kernel.h +osfmk/mach/error.h +osfmk/mach/exc.defs +osfmk/mach/exc_server.h +osfmk/mach/exception.h +osfmk/mach/exception_types.h +osfmk/mach/host_info.h +osfmk/mach/host_notify.h +osfmk/mach/host_notify_reply.defs +osfmk/mach/host_priv.defs +osfmk/mach/host_priv.h +osfmk/mach/host_reboot.h +osfmk/mach/host_security.defs +osfmk/mach/host_security.h +osfmk/mach/host_special_ports.h +osfmk/mach/i386/_structs.h +osfmk/mach/i386/asm.h +osfmk/mach/i386/boolean.h +osfmk/mach/i386/exception.h +osfmk/mach/i386/fp_reg.h +osfmk/mach/i386/kern_return.h +osfmk/mach/i386/ndr_def.h +osfmk/mach/i386/processor_info.h +osfmk/mach/i386/rpc.h +osfmk/mach/i386/sdt_isa.h +osfmk/mach/i386/syscall_sw.h +osfmk/mach/i386/thread_state.h +osfmk/mach/i386/thread_status.h +osfmk/mach/i386/vm_param.h +osfmk/mach/i386/vm_types.h +osfmk/mach/kern_return.h +osfmk/mach/kmod.h +osfmk/mach/ktrace_background.h +osfmk/mach/lock_set.defs +osfmk/mach/lock_set.h +osfmk/mach/mach_exc.defs +osfmk/mach/mach_exc_server.h +osfmk/mach/mach_host.defs +osfmk/mach/mach_host.h +osfmk/mach/mach_interface.h +osfmk/mach/mach_param.h +osfmk/mach/mach_port.defs +osfmk/mach/mach_port.h +osfmk/mach/mach_syscalls.h +osfmk/mach/mach_time.h +osfmk/mach/mach_traps.h +osfmk/mach/mach_types.defs +osfmk/mach/mach_types.h +osfmk/mach/mach_vm.defs +osfmk/mach/mach_vm.h +osfmk/mach/mach_voucher.defs +osfmk/mach/mach_voucher.h +osfmk/mach/mach_voucher_attr_control.defs +osfmk/mach/mach_voucher_attr_control.h +osfmk/mach/mach_voucher_types.h +osfmk/mach/machine.h +osfmk/mach/machine/asm.h +osfmk/mach/machine/boolean.h +osfmk/mach/machine/exception.h +osfmk/mach/machine/kern_return.h +osfmk/mach/machine/machine_types.defs +osfmk/mach/machine/ndr_def.h +osfmk/mach/machine/processor_info.h +osfmk/mach/machine/rpc.h +osfmk/mach/machine/sdt.h +osfmk/mach/machine/sdt_isa.h +osfmk/mach/machine/syscall_sw.h +osfmk/mach/machine/thread_state.h +osfmk/mach/machine/thread_status.h +osfmk/mach/machine/vm_param.h +osfmk/mach/machine/vm_types.h +osfmk/mach/memory_object_control.h +osfmk/mach/memory_object_default_server.h +osfmk/mach/memory_object_types.h +osfmk/mach/message.h +osfmk/mach/mig.h +osfmk/mach/mig_errors.h +osfmk/mach/mig_strncpy_zerofill_support.h +osfmk/mach/mig_voucher_support.h +osfmk/mach/ndr.h +osfmk/mach/notify.defs +osfmk/mach/notify.h +osfmk/mach/notify_server.h +osfmk/mach/policy.h +osfmk/mach/port.h +osfmk/mach/processor.defs +osfmk/mach/processor.h +osfmk/mach/processor_info.h +osfmk/mach/processor_set.defs +osfmk/mach/processor_set.h +osfmk/mach/resource_monitors.h +osfmk/mach/rpc.h +osfmk/mach/sdt.h +osfmk/mach/semaphore.h +osfmk/mach/sfi_class.h +osfmk/mach/shared_memory_server.h +osfmk/mach/shared_region.h +osfmk/mach/std_types.defs +osfmk/mach/std_types.h +osfmk/mach/sync_policy.h +osfmk/mach/syscall_sw.h +osfmk/mach/sysdiagnose_notification_server.h +osfmk/mach/task.defs +osfmk/mach/task.h +osfmk/mach/task_access.defs +osfmk/mach/task_access.h +osfmk/mach/task_access_server.h +osfmk/mach/task_info.h +osfmk/mach/task_policy.h +osfmk/mach/task_special_ports.h +osfmk/mach/telemetry_notification.defs +osfmk/mach/telemetry_notification_server.h +osfmk/mach/thread_act.defs +osfmk/mach/thread_act.h +osfmk/mach/thread_info.h +osfmk/mach/thread_policy.h +osfmk/mach/thread_special_ports.h +osfmk/mach/thread_status.h +osfmk/mach/thread_switch.h +osfmk/mach/time_value.h +osfmk/mach/upl.h +osfmk/mach/vm_attributes.h +osfmk/mach/vm_behavior.h +osfmk/mach/vm_inherit.h +osfmk/mach/vm_map.defs +osfmk/mach/vm_map.h +osfmk/mach/vm_param.h +osfmk/mach/vm_prot.h +osfmk/mach/vm_purgable.h +osfmk/mach/vm_region.h +osfmk/mach/vm_statistics.h +osfmk/mach/vm_sync.h +osfmk/mach/vm_types.h +osfmk/mach_debug/hash_info.h +osfmk/mach_debug/ipc_info.h +osfmk/mach_debug/lockgroup_info.h +osfmk/mach_debug/mach_debug.h +osfmk/mach_debug/mach_debug_types.defs +osfmk/mach_debug/mach_debug_types.h +osfmk/mach_debug/page_info.h +osfmk/mach_debug/vm_info.h +osfmk/mach_debug/zone_info.h +osfmk/machine/atomic.h +osfmk/machine/cpu_capabilities.h +osfmk/machine/cpu_number.h +osfmk/machine/io_map_entries.h +osfmk/machine/lock.h +osfmk/machine/locks.h +osfmk/machine/machine_cpuid.h +osfmk/machine/machine_kpc.h +osfmk/machine/machine_routines.h +osfmk/machine/pal_hibernate.h +osfmk/machine/pal_routines.h +osfmk/machine/simple_lock.h +osfmk/prng/random.h +osfmk/string.h +osfmk/vm/WKdm_new.h +osfmk/vm/pmap.h +osfmk/vm/vm_compressor_algorithms.h +osfmk/vm/vm_fault.h +osfmk/vm/vm_kern.h +osfmk/vm/vm_map.h +osfmk/vm/vm_options.h +osfmk/vm/vm_pageout.h +osfmk/vm/vm_protos.h +osfmk/vm/vm_shared_region.h +osfmk/voucher/ipc_pthread_priority_types.h +osfmk/x86_64/machine_kpc.h +panel.h +paths.h +pexpert/boot.h +pexpert/i386/boot.h +pexpert/i386/efi.h +pexpert/i386/protos.h +pexpert/machine/boot.h +pexpert/machine/protos.h +pexpert/pexpert.h +pexpert/pexpert/boot.h +pexpert/pexpert/device_tree.h +pexpert/pexpert/i386/boot.h +pexpert/pexpert/i386/efi.h +pexpert/pexpert/i386/protos.h +pexpert/pexpert/machine/boot.h +pexpert/pexpert/machine/protos.h +pexpert/pexpert/pexpert.h +pexpert/pexpert/protos.h +pexpert/protos.h +platform/compat.h +platform/introspection_private.h +platform/string.h +poll.h +printerdb.h +printf.h +protocols/routed.h +protocols/rwhod.h +protocols/talkd.h +protocols/timed.h +pthread/introspection.h +pthread/pthread.h +pthread/pthread_impl.h +pthread/pthread_spis.h +pthread/qos.h +pthread/sched.h +pthread/spawn.h +pwd.h +ranlib.h +readpassphrase.h +reboot2.h +regex.h +removefile.h +resolv.h +rpc/auth.h +rpc/auth_unix.h +rpc/clnt.h +rpc/pmap_clnt.h +rpc/pmap_prot.h +rpc/pmap_rmt.h +rpc/rpc.h +rpc/rpc_msg.h +rpc/svc.h +rpc/svc_auth.h +rpc/types.h +rpc/xdr.h +rpcsvc/yp_prot.h +rpcsvc/ypclnt.h +runetype.h +search.h +secure/_common.h +secure/_stdio.h +secure/_string.h +security/audit/audit_ioctl.h +security/mac.h +security/mac_policy.h +security/security/_label.h +security/security/mac.h +security/security/mac_alloc.h +security/security/mac_data.h +security/security/mac_framework.h +security/security/mac_internal.h +security/security/mac_mach_internal.h +security/security/mac_policy.h +semaphore.h +servers/bootstrap.h +servers/bootstrap_defs.h +servers/key_defs.h +servers/ls_defs.h +servers/netname.h +servers/netname_defs.h +servers/nm_defs.h +setjmp.h +sgtty.h +si_data.h +si_module.h +signal.h +spawn.h +stab.h +standards.h +stdarg.h +stddef.h +stdint.h +stdio.h +stdlib.h +strhash.h +string.h +stringlist.h +strings.h +struct.h +sys/_endian.h +sys/_posix_availability.h +sys/_pthread/_pthread_attr_t.h +sys/_pthread/_pthread_cond_t.h +sys/_pthread/_pthread_condattr_t.h +sys/_pthread/_pthread_key_t.h +sys/_pthread/_pthread_mutex_t.h +sys/_pthread/_pthread_mutexattr_t.h +sys/_pthread/_pthread_once_t.h +sys/_pthread/_pthread_rwlock_t.h +sys/_pthread/_pthread_rwlockattr_t.h +sys/_pthread/_pthread_t.h +sys/_pthread/_pthread_types.h +sys/_select.h +sys/_structs.h +sys/_symbol_aliasing.h +sys/_types.h +sys/_types/_blkcnt_t.h +sys/_types/_blksize_t.h +sys/_types/_clock_t.h +sys/_types/_ct_rune_t.h +sys/_types/_dev_t.h +sys/_types/_errno_t.h +sys/_types/_fd_clr.h +sys/_types/_fd_copy.h +sys/_types/_fd_def.h +sys/_types/_fd_isset.h +sys/_types/_fd_set.h +sys/_types/_fd_setsize.h +sys/_types/_fd_zero.h +sys/_types/_filesec_t.h +sys/_types/_fsblkcnt_t.h +sys/_types/_fsfilcnt_t.h +sys/_types/_fsid_t.h +sys/_types/_fsobj_id_t.h +sys/_types/_gid_t.h +sys/_types/_guid_t.h +sys/_types/_id_t.h +sys/_types/_in_addr_t.h +sys/_types/_in_port_t.h +sys/_types/_ino64_t.h +sys/_types/_ino_t.h +sys/_types/_int16_t.h +sys/_types/_int32_t.h +sys/_types/_int64_t.h +sys/_types/_int8_t.h +sys/_types/_intptr_t.h +sys/_types/_iovec_t.h +sys/_types/_key_t.h +sys/_types/_mach_port_t.h +sys/_types/_mbstate_t.h +sys/_types/_mode_t.h +sys/_types/_nlink_t.h +sys/_types/_null.h +sys/_types/_o_dsync.h +sys/_types/_o_sync.h +sys/_types/_off_t.h +sys/_types/_offsetof.h +sys/_types/_os_inline.h +sys/_types/_pid_t.h +sys/_types/_posix_vdisable.h +sys/_types/_pthread_attr_t.h +sys/_types/_pthread_cond_t.h +sys/_types/_pthread_condattr_t.h +sys/_types/_pthread_key_t.h +sys/_types/_pthread_mutex_t.h +sys/_types/_pthread_mutexattr_t.h +sys/_types/_pthread_once_t.h +sys/_types/_pthread_rwlock_t.h +sys/_types/_pthread_rwlockattr_t.h +sys/_types/_pthread_t.h +sys/_types/_pthread_types.h +sys/_types/_ptrdiff_t.h +sys/_types/_rsize_t.h +sys/_types/_rune_t.h +sys/_types/_s_ifmt.h +sys/_types/_sa_family_t.h +sys/_types/_seek_set.h +sys/_types/_sigaltstack.h +sys/_types/_sigset_t.h +sys/_types/_size_t.h +sys/_types/_socklen_t.h +sys/_types/_ssize_t.h +sys/_types/_suseconds_t.h +sys/_types/_time_t.h +sys/_types/_timespec.h +sys/_types/_timeval.h +sys/_types/_timeval32.h +sys/_types/_timeval64.h +sys/_types/_u_int16_t.h +sys/_types/_u_int32_t.h +sys/_types/_u_int64_t.h +sys/_types/_u_int8_t.h +sys/_types/_ucontext.h +sys/_types/_ucontext64.h +sys/_types/_uid_t.h +sys/_types/_uintptr_t.h +sys/_types/_useconds_t.h +sys/_types/_uuid_t.h +sys/_types/_va_list.h +sys/_types/_wchar_t.h +sys/_types/_wint_t.h +sys/acct.h +sys/acl.h +sys/aio.h +sys/appleapiopts.h +sys/attr.h +sys/buf.h +sys/cdefs.h +sys/clonefile.h +sys/conf.h +sys/dir.h +sys/dirent.h +sys/disk.h +sys/dkstat.h +sys/domain.h +sys/dtrace.h +sys/dtrace_glue.h +sys/dtrace_impl.h +sys/errno.h +sys/ev.h +sys/event.h +sys/fasttrap.h +sys/fasttrap_isa.h +sys/fcntl.h +sys/file.h +sys/filedesc.h +sys/filio.h +sys/gmon.h +sys/ioccom.h +sys/ioctl.h +sys/ioctl_compat.h +sys/ipc.h +sys/kauth.h +sys/kdebug.h +sys/kdebug_signpost.h +sys/kern_control.h +sys/kern_event.h +sys/kernel.h +sys/kernel_types.h +sys/lctx.h +sys/loadable_fs.h +sys/lock.h +sys/lockf.h +sys/lockstat.h +sys/malloc.h +sys/mbuf.h +sys/mman.h +sys/mount.h +sys/msg.h +sys/msgbuf.h +sys/netport.h +sys/param.h +sys/paths.h +sys/pipe.h +sys/poll.h +sys/posix_sem.h +sys/posix_shm.h +sys/proc.h +sys/proc_info.h +sys/protosw.h +sys/ptrace.h +sys/qos.h +sys/qos_private.h +sys/queue.h +sys/quota.h +sys/random.h +sys/rbtree.h +sys/reboot.h +sys/resource.h +sys/resourcevar.h +sys/sbuf.h +sys/sdt.h +sys/select.h +sys/sem.h +sys/semaphore.h +sys/shm.h +sys/signal.h +sys/signalvar.h +sys/socket.h +sys/socketvar.h +sys/sockio.h +sys/spawn.h +sys/stat.h +sys/statvfs.h +sys/stdio.h +sys/sys_domain.h +sys/syscall.h +sys/sysctl.h +sys/syslimits.h +sys/syslog.h +sys/termios.h +sys/time.h +sys/timeb.h +sys/times.h +sys/tprintf.h +sys/trace.h +sys/tty.h +sys/ttychars.h +sys/ttycom.h +sys/ttydefaults.h +sys/ttydev.h +sys/types.h +sys/ubc.h +sys/ucontext.h +sys/ucred.h +sys/uio.h +sys/un.h +sys/unistd.h +sys/unpcb.h +sys/user.h +sys/utfconv.h +sys/utsname.h +sys/vadvise.h +sys/vcmd.h +sys/vm.h +sys/vmmeter.h +sys/vmparam.h +sys/vnioctl.h +sys/vnode.h +sys/vnode_if.h +sys/vstat.h +sys/wait.h +sys/xattr.h +sysexits.h +syslog.h +tar.h +term.h +term_entry.h +termcap.h +termios.h +thread_data.h +tic.h +time.h +timeconv.h +ttyent.h +tzfile.h +tzlink.h +tzlink_internal.h +ucontext.h +ulimit.h +unctrl.h +unistd.h +util.h +utime.h +utmpx.h +utmpx_thread.h +uuid/uuid.h +vfs/vfs_support.h +vis.h +voucher/ipc_pthread_priority_types.h +vproc.h +vproc_internal.h +vproc_priv.h +wchar.h +wctype.h +wipefs.h +wordexp.h +xlocale.h +xlocale/__wctype.h +xlocale/_ctype.h +xlocale/_inttypes.h +xlocale/_langinfo.h +xlocale/_monetary.h +xlocale/_regex.h +xlocale/_stdio.h +xlocale/_stdlib.h +xlocale/_string.h +xlocale/_time.h +xlocale/_wchar.h +xlocale/_wctype.h diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_c_symbols b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_c_symbols new file mode 100644 index 0000000..1ec6c63 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_c_symbols @@ -0,0 +1,1320 @@ +__CurrentRuneLocale +__DefaultRuneLocale +__Exit +__NSGetArgc +__NSGetArgv +__NSGetEnviron +__NSGetMachExecuteHeader +__NSGetProgname +__PathLocale +__Read_RuneMagi +___Balloc_D2A +___Bfree_D2A +___ULtod_D2A +____mb_cur_max +____mb_cur_max_l +____runetype +____runetype_l +____tolower +____tolower_l +____toupper +____toupper_l +___add_ovflpage +___addel +___any_on_D2A +___assert_rtn +___b2d_D2A +___big_delete +___big_insert +___big_keydata +___big_return +___big_split +___bigtens_D2A +___bt_close +___bt_cmp +___bt_defcmp +___bt_defpfx +___bt_delete +___bt_dleaf +___bt_fd +___bt_free +___bt_get +___bt_new +___bt_open +___bt_pgin +___bt_pgout +___bt_put +___bt_ret +___bt_search +___bt_seq +___bt_setcur +___bt_split +___bt_sync +___buf_free +___call_hash +___cleanup +___cmp_D2A +___collate_equiv_match +___collate_load_error +___collate_lookup +___copybits_D2A +___cxa_atexit +___cxa_finalize +___cxa_finalize_ranges +___cxa_thread_atexit +___d2b_D2A +___dbpanic +___decrement_D2A +___default_hash +___default_utx +___delpair +___diff_D2A +___dtoa +___expand_table +___fflush +___fgetwc +___find_bigpair +___find_last_page +___fix_locale_grouping_str +___fread +___free_ovflpage +___freedtoa +___gdtoa +___gdtoa_locks +___get_buf +___get_page +___gethex_D2A +___getonlyClocaleconv +___hash_open +___hdtoa +___hexdig_D2A +___hexdig_init_D2A +___hexnan_D2A +___hi0bits_D2A +___hldtoa +___i2b_D2A +___ibitmap +___increment_D2A +___isctype +___istype +___istype_l +___ldtoa +___libc_init +___lo0bits_D2A +___log2 +___lshift_D2A +___maskrune +___maskrune_l +___match_D2A +___mb_cur_max +___mb_sb_limit +___memccpy_chk +___memcpy_chk +___memmove_chk +___memset_chk +___mult_D2A +___multadd_D2A +___nrv_alloc_D2A +___opendir2 +___opendir2$INODE64 +___ovfl_delete +___ovfl_get +___ovfl_put +___pow5mult_D2A +___put_page +___quorem_D2A +___ratio_D2A +___rec_close +___rec_delete +___rec_dleaf +___rec_fd +___rec_fmap +___rec_fpipe +___rec_get +___rec_iput +___rec_open +___rec_put +___rec_ret +___rec_search +___rec_seq +___rec_sync +___rec_vmap +___rec_vpipe +___reclaim_buf +___rshift_D2A +___rv_alloc_D2A +___s2b_D2A +___sF +___sclose +___sdidinit +___set_ones_D2A +___setonlyClocaleconv +___sflags +___sflush +___sfp +___sfvwrite +___sglue +___sinit +___slbexpand +___smakebuf +___snprintf_chk +___split_page +___sprintf_chk +___sread +___srefill +___srget +___sseek +___stack_chk_fail +___stack_chk_guard +___stderrp +___stdinp +___stdoutp +___stpcpy_chk +___stpncpy_chk +___strcat_chk +___strcp_D2A +___strcpy_chk +___strlcat_chk +___strlcpy_chk +___strncat_chk +___strncpy_chk +___strtodg +___strtopdd +___strtopx +___sum_D2A +___svfscanf +___swbuf +___swhatbuf +___swrite +___swsetup +___tens_D2A +___tinytens_D2A +___tolower +___tolower_l +___toupper +___toupper_l +___trailz_D2A +___ulp_D2A +___ungetc +___ungetwc +___vsnprintf_chk +___vsprintf_chk +___wcwidth +___wcwidth_l +__allocenvstate +__atexit_receipt +__c_locale +__cleanup +__closeutx +__copyenv +__cthread_init_routine +__deallocenvstate +__endutxent +__flockfile_debug_stub +__fseeko +__ftello +__fwalk +__getenvp +__getutxent +__getutxid +__getutxline +__inet_aton_check +__init_clock_port +__int_to_time +__libc_fork_child +__libc_initializer +__long_to_time +__mkpath_np +__mktemp +__openutx +__os_assert_log +__os_assert_log_ctx +__os_assumes_log +__os_assumes_log_ctx +__os_avoid_tail_call +__os_crash +__os_crash_callback +__os_debug_log +__os_debug_log_error_str +__putenvp +__pututxline +__rand48_add +__rand48_mult +__rand48_seed +__readdir_unlocked +__readdir_unlocked$INODE64 +__reclaim_telldir +__seekdir +__seekdir$INODE64 +__setenvp +__setutxent +__sigaction_nobind +__sigintr +__signal_nobind +__sigvec_nobind +__sread +__sseek +__swrite +__time32_to_time +__time64_to_time +__time_to_int +__time_to_long +__time_to_time32 +__time_to_time64 +__unsetenvp +__utmpxname +_a64l +_abort +_abort_report_np +_abs +_acl_add_flag_np +_acl_add_perm +_acl_calc_mask +_acl_clear_flags_np +_acl_clear_perms +_acl_copy_entry +_acl_copy_ext +_acl_copy_ext_native +_acl_copy_int +_acl_copy_int_native +_acl_create_entry +_acl_create_entry_np +_acl_delete_def_file +_acl_delete_entry +_acl_delete_fd_np +_acl_delete_file_np +_acl_delete_flag_np +_acl_delete_link_np +_acl_delete_perm +_acl_dup +_acl_free +_acl_from_text +_acl_get_entry +_acl_get_fd +_acl_get_fd_np +_acl_get_file +_acl_get_flag_np +_acl_get_flagset_np +_acl_get_link_np +_acl_get_perm_np +_acl_get_permset +_acl_get_permset_mask_np +_acl_get_qualifier +_acl_get_tag_type +_acl_init +_acl_maximal_permset_mask_np +_acl_set_fd +_acl_set_fd_np +_acl_set_file +_acl_set_flagset_np +_acl_set_link_np +_acl_set_permset +_acl_set_permset_mask_np +_acl_set_qualifier +_acl_set_tag_type +_acl_size +_acl_to_text +_acl_valid +_acl_valid_fd_np +_acl_valid_file_np +_acl_valid_link +_addr2ascii +_alarm +_alphasort +_alphasort$INODE64 +_arc4random +_arc4random_addrandom +_arc4random_buf +_arc4random_stir +_arc4random_uniform +_ascii2addr +_asctime +_asctime_r +_asprintf +_asprintf_l +_asxprintf +_asxprintf_exec +_atexit +_atexit_b +_atof +_atof_l +_atoi +_atoi_l +_atol +_atol_l +_atoll +_atoll_l +_backtrace +_backtrace_symbols +_backtrace_symbols_fd +_basename +_basename_r +_bcmp +_bcopy +_brk +_bsd_signal +_bsearch +_bsearch_b +_btowc +_btowc_l +_bzero +_catclose +_catgets +_catopen +_cfgetispeed +_cfgetospeed +_cfmakeraw +_cfsetispeed +_cfsetospeed +_cfsetspeed +_cgetcap +_cgetclose +_cgetent +_cgetfirst +_cgetmatch +_cgetnext +_cgetnum +_cgetset +_cgetstr +_cgetustr +_chmodx_np +_clearerr +_clearerr_unlocked +_clock +_clock_getres +_clock_gettime +_clock_gettime_nsec_np +_clock_port +_clock_sem +_clock_settime +_closedir +_compat_mode +_confstr +_copy_printf_domain +_creat +_creat$NOCANCEL +_crypt +_ctermid +_ctermid_r +_ctime +_ctime_r +_daemon +_daemon$1050 +_daylight +_dbm_clearerr +_dbm_close +_dbm_delete +_dbm_dirfno +_dbm_error +_dbm_fetch +_dbm_firstkey +_dbm_nextkey +_dbm_open +_dbm_store +_dbopen +_devname +_devname_r +_difftime +_digittoint +_digittoint_l +_dirfd +_dirname +_dirname_r +_div +_dprintf +_dprintf_l +_drand48 +_duplocale +_dxprintf +_dxprintf_exec +_ecvt +_encrypt +_endttyent +_endusershell +_endutxent +_endutxent_wtmp +_erand48 +_err +_err_set_exit +_err_set_exit_b +_err_set_file +_errc +_errx +_execl +_execle +_execlp +_execv +_execvP +_execvp +_exit +_f_prealloc +_fchmodx_np +_fclose +_fcvt +_fdopen +_fdopen$DARWIN_EXTSN +_fdopendir +_fdopendir$INODE64 +_feof +_feof_unlocked +_ferror +_ferror_unlocked +_fflagstostr +_fflush +_fgetc +_fgetln +_fgetpos +_fgetrune +_fgets +_fgetwc +_fgetwc_l +_fgetwln +_fgetwln_l +_fgetws +_fgetws_l +_fileno +_fileno_unlocked +_filesec_dup +_filesec_free +_filesec_get_property +_filesec_init +_filesec_query_property +_filesec_set_property +_filesec_unset_property +_flockfile +_fmtcheck +_fmtmsg +_fnmatch +_fopen +_fopen$DARWIN_EXTSN +_fork +_forkpty +_fparseln +_fprintf +_fprintf_l +_fpurge +_fputc +_fputrune +_fputs +_fputwc +_fputwc_l +_fputws +_fputws_l +_fread +_free_printf_comp +_free_printf_domain +_freelocale +_freopen +_fscanf +_fscanf_l +_fseek +_fseeko +_fsetpos +_fstatvfs +_fstatx64_np +_fstatx_np +_fstatx_np$INODE64 +_fsync_volume_np +_ftell +_ftello +_ftime +_ftok +_ftrylockfile +_fts_children +_fts_children$INODE64 +_fts_close +_fts_close$INODE64 +_fts_open +_fts_open$INODE64 +_fts_open_b +_fts_open_b$INODE64 +_fts_read +_fts_read$INODE64 +_fts_set +_fts_set$INODE64 +_ftw +_ftw$INODE64 +_fungetrune +_funlockfile +_funopen +_fwide +_fwprintf +_fwprintf_l +_fwrite +_fwscanf +_fwscanf_l +_fxprintf +_fxprintf_exec +_gcvt +_getbsize +_getc +_getc_unlocked +_getchar +_getchar_unlocked +_getcwd +_getdate +_getdate_err +_getdelim +_getdiskbyname +_getenv +_getgroups$DARWIN_EXTSN +_gethostid +_gethostname +_getipv4sourcefilter +_getlastlogx +_getlastlogxbyname +_getline +_getloadavg +_getlogin +_getlogin_r +_getmntinfo +_getmntinfo$INODE64 +_getmntinfo64 +_getmode +_getopt +_getopt_long +_getopt_long_only +_getpagesize +_getpass +_getpeereid +_getprogname +_gets +_getsourcefilter +_getsubopt +_gettimeofday +_getttyent +_getttynam +_getusershell +_getutmp +_getutmpx +_getutxent +_getutxent_wtmp +_getutxid +_getutxline +_getvfsbyname +_getw +_getwc +_getwc_l +_getwchar +_getwchar_l +_getwd +_glob +_glob$INODE64 +_glob_b +_glob_b$INODE64 +_globfree +_gmtime +_gmtime_r +_grantpt +_hash_create +_hash_destroy +_hash_purge +_hash_search +_hash_stats +_hash_traverse +_hcreate +_hdestroy +_heapsort +_heapsort_b +_hsearch +_imaxabs +_imaxdiv +_index +_inet_addr +_inet_aton +_inet_lnaof +_inet_makeaddr +_inet_net_ntop +_inet_net_pton +_inet_neta +_inet_netof +_inet_network +_inet_nsap_addr +_inet_nsap_ntoa +_inet_ntoa +_inet_ntop +_inet_ntop4 +_inet_ntop6 +_inet_pton +_initstate +_insque +_isalnum +_isalnum_l +_isalpha +_isalpha_l +_isascii +_isatty +_isblank +_isblank_l +_iscntrl +_iscntrl_l +_isdigit +_isdigit_l +_isgraph +_isgraph_l +_ishexnumber +_ishexnumber_l +_isideogram +_isideogram_l +_islower +_islower_l +_isnumber +_isnumber_l +_isphonogram +_isphonogram_l +_isprint +_isprint_l +_ispunct +_ispunct_l +_isrune +_isrune_l +_isspace +_isspace_l +_isspecial +_isspecial_l +_isupper +_isupper_l +_iswalnum +_iswalnum_l +_iswalpha +_iswalpha_l +_iswascii +_iswblank +_iswblank_l +_iswcntrl +_iswcntrl_l +_iswctype +_iswctype_l +_iswdigit +_iswdigit_l +_iswgraph +_iswgraph_l +_iswhexnumber +_iswhexnumber_l +_iswideogram +_iswideogram_l +_iswlower +_iswlower_l +_iswnumber +_iswnumber_l +_iswphonogram +_iswphonogram_l +_iswprint +_iswprint_l +_iswpunct +_iswpunct_l +_iswrune +_iswrune_l +_iswspace +_iswspace_l +_iswspecial +_iswspecial_l +_iswupper +_iswupper_l +_iswxdigit +_iswxdigit_l +_isxdigit +_isxdigit_l +_jrand48 +_kOSThermalNotificationPressureLevelName +_killpg +_l64a +_labs +_lchflags +_lchmod +_lcong48 +_ldiv +_lfind +_link_addr +_link_ntoa +_llabs +_lldiv +_localeconv +_localeconv_l +_localtime +_localtime_r +_lockf +_lockf$NOCANCEL +_login +_login_tty +_logout +_logwtmp +_lrand48 +_lsearch +_lstatx64_np +_lstatx_np +_lstatx_np$INODE64 +_lutimes +_mblen +_mblen_l +_mbmb +_mbrlen +_mbrlen_l +_mbrrune +_mbrtowc +_mbrtowc_l +_mbrune +_mbsinit +_mbsinit_l +_mbsnrtowcs +_mbsnrtowcs_l +_mbsrtowcs +_mbsrtowcs_l +_mbstowcs +_mbstowcs_l +_mbtowc +_mbtowc_l +_memccpy +_memchr +_memcmp +_memcpy +_memmem +_memmove +_memset +_memset_pattern16 +_memset_pattern4 +_memset_pattern8 +_memset_s +_mergesort +_mergesort_b +_mkdirx_np +_mkdtemp +_mkfifox_np +_mkostemp +_mkostemps +_mkpath_np +_mkpathat_np +_mkstemp +_mkstemp_dprotected_np +_mkstemps +_mktemp +_mktime +_monaddition +_moncontrol +_moncount +_moninit +_monitor +_monoutput +_monreset +_monstartup +_mpool_close +_mpool_filter +_mpool_get +_mpool_new +_mpool_open +_mpool_put +_mpool_sync +_mrand48 +_nanosleep +_nanosleep$NOCANCEL +_new_printf_comp +_new_printf_domain +_newlocale +_nextwctype +_nextwctype_l +_nftw +_nftw$INODE64 +_nice +_nl_langinfo +_nl_langinfo_l +_nrand48 +_nvis +_off32 +_off64 +_offtime +_opendev +_opendir +_opendir$INODE64 +_openpty +_openx_np +_optarg +_opterr +_optind +_optopt +_optreset +_pause +_pause$NOCANCEL +_pclose +_perror +_popen +_popen$DARWIN_EXTSN +_posix2time +_posix_openpt +_posix_spawnp +_printf +_printf_l +_psignal +_psort +_psort_b +_psort_r +_ptsname +_putc +_putc_unlocked +_putchar +_putchar_unlocked +_putenv +_puts +_pututxline +_putw +_putwc +_putwc_l +_putwchar +_putwchar_l +_qsort +_qsort_b +_qsort_r +_querylocale +_radixsort +_raise +_rand +_rand_r +_random +_rb_tree_count +_rb_tree_find_node +_rb_tree_find_node_geq +_rb_tree_find_node_leq +_rb_tree_init +_rb_tree_insert_node +_rb_tree_iterate +_rb_tree_remove_node +_readdir +_readdir$INODE64 +_readdir_r +_readdir_r$INODE64 +_readpassphrase +_reallocf +_realpath +_realpath$DARWIN_EXTSN +_recv +_recv$NOCANCEL +_regcomp +_regcomp_l +_regerror +_regexec +_regfree +_register_printf_domain_function +_register_printf_domain_render_std +_regncomp +_regncomp_l +_regnexec +_regwcomp +_regwcomp_l +_regwexec +_regwncomp +_regwncomp_l +_regwnexec +_remove +_remque +_rewind +_rewinddir +_rewinddir$INODE64 +_rindex +_sbrk +_scandir +_scandir$INODE64 +_scandir_b +_scandir_b$INODE64 +_scanf +_scanf_l +_seed48 +_seekdir +_seekdir$INODE64 +_send +_send$NOCANCEL +_setbuf +_setbuffer +_setenv +_sethostid +_sethostname +_setinvalidrune +_setipv4sourcefilter +_setkey +_setlinebuf +_setlocale +_setlogin +_setmode +_setpgrp +_setprogname +_setrgid +_setruid +_setrunelocale +_setsourcefilter +_setstate +_settimeofday +_setttyent +_setusershell +_setutxent +_setutxent_wtmp +_setvbuf +_sigaction +_sigaddset +_sigaltstack +_sigblock +_sigdelset +_sigemptyset +_sigfillset +_sighold +_sigignore +_siginterrupt +_sigismember +_signal +_sigpause +_sigpause$NOCANCEL +_sigrelse +_sigset +_sigsetmask +_sigvec +_skip +_sl_add +_sl_find +_sl_free +_sl_init +_sleep +_sleep$NOCANCEL +_snprintf +_snprintf_l +_snvis +_sockatmark +_sprintf +_sprintf_l +_sradixsort +_srand +_srand48 +_sranddev +_srandom +_srandomdev +_sscanf +_sscanf_l +_statvfs +_statx64_np +_statx_np +_statx_np$INODE64 +_stpcpy +_stpncpy +_strcasecmp +_strcasecmp_l +_strcasestr +_strcasestr_l +_strcat +_strchr +_strcmp +_strcoll +_strcoll_l +_strcpy +_strcspn +_strdup +_strenvisx +_strerror +_strerror_r +_strfmon +_strfmon_l +_strftime +_strftime_l +_strlcat +_strlcpy +_strlen +_strmode +_strncasecmp +_strncasecmp_l +_strncat +_strncmp +_strncpy +_strndup +_strnlen +_strnstr +_strnunvis +_strnunvisx +_strnvis +_strnvisx +_strpbrk +_strptime +_strptime_l +_strrchr +_strsenvisx +_strsep +_strsignal +_strsnvis +_strsnvisx +_strspn +_strstr +_strsvis +_strsvisx +_strtod +_strtod_l +_strtof +_strtof_l +_strtofflags +_strtoimax +_strtoimax_l +_strtok +_strtok_r +_strtol +_strtol_l +_strtold +_strtold_l +_strtoll +_strtoll_l +_strtoq +_strtoq_l +_strtoul +_strtoul_l +_strtoull +_strtoull_l +_strtoumax +_strtoumax_l +_strtouq +_strtouq_l +_strunvis +_strunvisx +_strvis +_strvisx +_strxfrm +_strxfrm_l +_suboptarg +_svis +_swab +_swprintf +_swprintf_l +_swscanf +_swscanf_l +_sxprintf +_sxprintf_exec +_sync_volume_np +_sys_errlist +_sys_nerr +_sys_siglist +_sys_signame +_sysconf +_sysctl +_sysctlbyname +_sysctlnametomib +_system +_system$NOCANCEL +_tcdrain +_tcdrain$NOCANCEL +_tcflow +_tcflush +_tcgetattr +_tcgetpgrp +_tcgetsid +_tcsendbreak +_tcsetattr +_tcsetpgrp +_tdelete +_telldir +_telldir$INODE64 +_tempnam +_tfind +_thread_stack_pcs +_time +_time2posix +_timegm +_timelocal +_timeoff +_times +_timezone +_timingsafe_bcmp +_tmpfile +_tmpnam +_toascii +_tolower +_tolower_l +_toupper +_toupper_l +_towctrans +_towctrans_l +_towlower +_towlower_l +_towupper +_towupper_l +_tre_ast_new_catenation +_tre_ast_new_iter +_tre_ast_new_literal +_tre_ast_new_node +_tre_ast_new_union +_tre_compile +_tre_fill_pmatch +_tre_free +_tre_mem_alloc_impl +_tre_mem_destroy +_tre_mem_new_impl +_tre_parse +_tre_stack_destroy +_tre_stack_new +_tre_stack_num_objects +_tre_tnfa_run_backtrack +_tre_tnfa_run_parallel +_tsearch +_ttyname +_ttyname_r +_ttyslot +_twalk +_tzname +_tzset +_tzsetwall +_ualarm +_ulimit +_umaskx_np +_uname +_ungetc +_ungetwc +_ungetwc_l +_unlockpt +_unsetenv +_unvis +_uselocale +_usleep +_usleep$NOCANCEL +_utime +_utmpxname +_uuid_clear +_uuid_compare +_uuid_copy +_uuid_generate +_uuid_generate_random +_uuid_generate_time +_uuid_is_null +_uuid_pack +_uuid_parse +_uuid_unpack +_uuid_unparse +_uuid_unparse_lower +_uuid_unparse_upper +_vasprintf +_vasprintf_l +_vasxprintf +_vasxprintf_exec +_vdprintf +_vdprintf_l +_vdxprintf +_vdxprintf_exec +_verr +_verrc +_verrx +_vfprintf +_vfprintf_l +_vfscanf +_vfscanf_l +_vfwprintf +_vfwprintf_l +_vfwscanf +_vfwscanf_l +_vfxprintf +_vfxprintf_exec +_vis +_vprintf +_vprintf_l +_vscanf +_vscanf_l +_vsnprintf +_vsnprintf_l +_vsprintf +_vsprintf_l +_vsscanf +_vsscanf_l +_vswprintf +_vswprintf_l +_vswscanf +_vswscanf_l +_vsxprintf +_vsxprintf_exec +_vwarn +_vwarnc +_vwarnx +_vwprintf +_vwprintf_l +_vwscanf +_vwscanf_l +_vxprintf +_vxprintf_exec +_wait +_wait$NOCANCEL +_wait3 +_waitpid +_waitpid$NOCANCEL +_warn +_warnc +_warnx +_wcpcpy +_wcpncpy +_wcrtomb +_wcrtomb_l +_wcscasecmp +_wcscasecmp_l +_wcscat +_wcschr +_wcscmp +_wcscoll +_wcscoll_l +_wcscpy +_wcscspn +_wcsdup +_wcsftime +_wcsftime_l +_wcslcat +_wcslcpy +_wcslen +_wcsncasecmp +_wcsncasecmp_l +_wcsncat +_wcsncmp +_wcsncpy +_wcsnlen +_wcsnrtombs +_wcsnrtombs_l +_wcspbrk +_wcsrchr +_wcsrtombs +_wcsrtombs_l +_wcsspn +_wcsstr +_wcstod +_wcstod_l +_wcstof +_wcstof_l +_wcstoimax +_wcstoimax_l +_wcstok +_wcstol +_wcstol_l +_wcstold +_wcstold_l +_wcstoll +_wcstoll_l +_wcstombs +_wcstombs_l +_wcstoul +_wcstoul_l +_wcstoull +_wcstoull_l +_wcstoumax +_wcstoumax_l +_wcswidth +_wcswidth_l +_wcsxfrm +_wcsxfrm_l +_wctob +_wctob_l +_wctomb +_wctomb_l +_wctrans +_wctrans_l +_wctype +_wctype_l +_wcwidth +_wcwidth_l +_wmemchr +_wmemcmp +_wmemcpy +_wmemmove +_wmemset +_wordexp +_wordfree +_wprintf +_wprintf_l +_wscanf +_wscanf_l +_wtmpxname +_xprintf +_xprintf_exec +mcount diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_kernel_symbols b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_kernel_symbols new file mode 100644 index 0000000..7c5b90f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_kernel_symbols @@ -0,0 +1,1172 @@ +_NDR_record +_____old_semwait_signal_nocancel +_____sigwait_nocancel +____kernelVersionNumber +____kernelVersionString +___abort_with_payload +___accept +___accept_nocancel +___access_extended +___aio_suspend_nocancel +___bind +___bsdthread_create +___bsdthread_ctl +___bsdthread_register +___bsdthread_terminate +___carbon_delete +___channel_get_info +___channel_get_opt +___channel_open +___channel_set_opt +___channel_sync +___chmod +___chmod_extended +___close_nocancel +___coalition +___coalition_info +___commpage_gettimeofday +___connect +___connect_nocancel +___copyfile +___csrctl +___delete +___disable_threadsignal +___error +___exit +___fchmod +___fchmod_extended +___fcntl +___fcntl_nocancel +___fork +___fs_snapshot +___fstat64_extended +___fstat_extended +___fsync_nocancel +___get_remove_counter +___getattrlist +___getdirentries64 +___gethostuuid +___getlogin +___getpeername +___getpid +___getrlimit +___getsgroups +___getsockname +___gettid +___gettimeofday +___getwgroups +___guarded_open_dprotected_np +___guarded_open_np +___identitysvc +___inc_remove_counter +___initgroups +___ioctl +___iopolicysys +___kdebug_trace +___kdebug_trace64 +___kdebug_trace_string +___kdebug_typefilter +___kill +___lchown +___libkernel_init +___libkernel_voucher_init +___listen +___lseek +___lstat64_extended +___lstat_extended +___mac_execve +___mac_get_fd +___mac_get_file +___mac_get_link +___mac_get_mount +___mac_get_pid +___mac_get_proc +___mac_getfsstat +___mac_mount +___mac_set_fd +___mac_set_file +___mac_set_link +___mac_set_proc +___mac_syscall +___microstackshot +___mkdir_extended +___mkfifo_extended +___mmap +___mprotect +___msgctl +___msgrcv_nocancel +___msgsnd_nocancel +___msgsys +___msync +___msync_nocancel +___munmap +___nexus_create +___nexus_deregister +___nexus_destroy +___nexus_get_opt +___nexus_open +___nexus_register +___nexus_set_opt +___old_semwait_signal +___open +___open_dprotected_np +___open_extended +___open_nocancel +___openat +___openat_nocancel +___os_nexus_ifattach +___os_nexus_ifdetach +___persona +___pipe +___poll_nocancel +___posix_spawn +___pread_nocancel +___proc_info +___process_policy +___pselect +___pselect_nocancel +___psynch_cvbroad +___psynch_cvclrprepost +___psynch_cvsignal +___psynch_cvwait +___psynch_mutexdrop +___psynch_mutexwait +___psynch_rw_downgrade +___psynch_rw_longrdlock +___psynch_rw_rdlock +___psynch_rw_unlock +___psynch_rw_unlock2 +___psynch_rw_upgrade +___psynch_rw_wrlock +___psynch_rw_yieldwrlock +___pthread_canceled +___pthread_chdir +___pthread_fchdir +___pthread_kill +___pthread_markcancel +___pthread_sigmask +___ptrace +___pwrite_nocancel +___read_nocancel +___readv_nocancel +___recvfrom +___recvfrom_nocancel +___recvmsg +___recvmsg_nocancel +___rename +___renameat +___renameatx_np +___rmdir +___sandbox_me +___sandbox_mm +___sandbox_ms +___sandbox_msp +___select +___select_nocancel +___sem_open +___sem_wait_nocancel +___semctl +___semsys +___semwait_signal +___semwait_signal_nocancel +___sendmsg +___sendmsg_nocancel +___sendto +___sendto_nocancel +___setattrlist +___setlogin +___setpriority +___setregid +___setreuid +___setrlimit +___setsgroups +___settid +___settid_with_pid +___settimeofday +___setwgroups +___sfi_ctl +___sfi_pidctl +___shared_region_check_np +___shared_region_map_and_slide_np +___shm_open +___shmctl +___shmsys +___sigaction +___sigaltstack +___sigreturn +___sigsuspend +___sigsuspend_nocancel +___sigwait +___socketpair +___stack_snapshot_with_config +___stat64_extended +___stat_extended +___syscall +___syscall_logger +___sysctl +___sysctlbyname +___telemetry +___terminate_with_payload +___thread_selfid +___thread_selfusage +___ulock_wait +___ulock_wake +___umask_extended +___unlink +___unlinkat +___vfork +___wait4 +___wait4_nocancel +___waitid_nocancel +___work_interval_ctl +___workq_kernreturn +___workq_open +___write_nocancel +___writev_nocancel +__cpu_capabilities +__cpu_has_altivec +__exit +__get_cpu_capabilities +__getprivatesystemidentifier +__host_page_size +__init_cpu_capabilities +__kernelrpc_host_create_mach_voucher +__kernelrpc_mach_port_allocate +__kernelrpc_mach_port_allocate_full +__kernelrpc_mach_port_allocate_name +__kernelrpc_mach_port_allocate_qos +__kernelrpc_mach_port_allocate_trap +__kernelrpc_mach_port_construct +__kernelrpc_mach_port_construct_trap +__kernelrpc_mach_port_deallocate +__kernelrpc_mach_port_deallocate_trap +__kernelrpc_mach_port_destroy +__kernelrpc_mach_port_destroy_trap +__kernelrpc_mach_port_destruct +__kernelrpc_mach_port_destruct_trap +__kernelrpc_mach_port_dnrequest_info +__kernelrpc_mach_port_extract_member +__kernelrpc_mach_port_extract_member_trap +__kernelrpc_mach_port_extract_right +__kernelrpc_mach_port_get_attributes +__kernelrpc_mach_port_get_context +__kernelrpc_mach_port_get_refs +__kernelrpc_mach_port_get_set_status +__kernelrpc_mach_port_get_srights +__kernelrpc_mach_port_guard +__kernelrpc_mach_port_guard_trap +__kernelrpc_mach_port_insert_member +__kernelrpc_mach_port_insert_member_trap +__kernelrpc_mach_port_insert_right +__kernelrpc_mach_port_insert_right_trap +__kernelrpc_mach_port_kernel_object +__kernelrpc_mach_port_kobject +__kernelrpc_mach_port_mod_refs +__kernelrpc_mach_port_mod_refs_trap +__kernelrpc_mach_port_move_member +__kernelrpc_mach_port_move_member_trap +__kernelrpc_mach_port_names +__kernelrpc_mach_port_peek +__kernelrpc_mach_port_rename +__kernelrpc_mach_port_request_notification +__kernelrpc_mach_port_set_attributes +__kernelrpc_mach_port_set_context +__kernelrpc_mach_port_set_mscount +__kernelrpc_mach_port_set_seqno +__kernelrpc_mach_port_space_basic_info +__kernelrpc_mach_port_space_info +__kernelrpc_mach_port_type +__kernelrpc_mach_port_unguard +__kernelrpc_mach_port_unguard_trap +__kernelrpc_mach_vm_allocate +__kernelrpc_mach_vm_allocate_trap +__kernelrpc_mach_vm_deallocate +__kernelrpc_mach_vm_deallocate_trap +__kernelrpc_mach_vm_map +__kernelrpc_mach_vm_map_trap +__kernelrpc_mach_vm_protect +__kernelrpc_mach_vm_protect_trap +__kernelrpc_mach_vm_purgable_control +__kernelrpc_mach_vm_purgable_control_trap +__kernelrpc_mach_vm_read +__kernelrpc_mach_vm_remap +__kernelrpc_mach_voucher_extract_attr_recipe +__kernelrpc_task_set_port_space +__kernelrpc_thread_policy +__kernelrpc_thread_policy_set +__kernelrpc_thread_set_policy +__kernelrpc_vm_map +__kernelrpc_vm_purgable_control +__kernelrpc_vm_read +__kernelrpc_vm_remap +__mach_errors +__mach_fork_child +__mach_snprintf +__mach_vsnprintf +__os_alloc_once_table +__register_gethostuuid_callback +__thread_set_tsd_base +_abort_with_payload +_abort_with_reason +_accept +_accept$NOCANCEL +_access +_accessx_np +_acct +_act_get_state +_act_set_state +_adjtime +_aio_cancel +_aio_error +_aio_fsync +_aio_read +_aio_return +_aio_suspend +_aio_suspend$NOCANCEL +_aio_write +_audit +_audit_session_join +_audit_session_port +_audit_session_self +_auditctl +_auditon +_bind +_bootstrap_port +_cerror +_cerror_nocancel +_change_fdguard_np +_chdir +_chflags +_chmod +_chown +_chroot +_clock_alarm +_clock_alarm_reply +_clock_get_attributes +_clock_get_time +_clock_set_attributes +_clock_set_time +_clock_sleep +_clock_sleep_trap +_clonefile +_clonefileat +_close +_close$NOCANCEL +_coalition_create +_coalition_info_resource_usage +_coalition_reap +_coalition_terminate +_connect +_connect$NOCANCEL +_connectx +_csops +_csops_audittoken +_csr_check +_csr_get_active_config +_denap_boost_assertion_token +_disconnectx +_dup +_dup2 +_errno +_etap_trace_thread +_exc_server +_exc_server_routine +_exception_raise +_exception_raise_state +_exception_raise_state_identity +_exchangedata +_execve +_faccessat +_fchdir +_fchflags +_fchmod +_fchmodat +_fchown +_fchownat +_fclonefileat +_fcntl +_fcntl$NOCANCEL +_fdatasync +_ffsctl +_fgetattrlist +_fgetxattr +_fhopen +_fileport_makefd +_fileport_makeport +_flistxattr +_flock +_fpathconf +_fremovexattr +_fs_snapshot_create +_fs_snapshot_delete +_fs_snapshot_list +_fs_snapshot_mount +_fs_snapshot_rename +_fs_snapshot_revert +_fsctl +_fsetattrlist +_fsetxattr +_fsgetpath +_fstat +_fstat$INODE64 +_fstat64 +_fstatat +_fstatat$INODE64 +_fstatat64 +_fstatfs +_fstatfs$INODE64 +_fstatfs64 +_fsync +_fsync$NOCANCEL +_ftruncate +_futimes +_getattrlist +_getattrlistat +_getattrlistbulk +_getaudit +_getaudit_addr +_getauid +_getdirentries +_getdirentriesattr +_getdtablesize +_getegid +_getentropy +_geteuid +_getfh +_getfsstat +_getfsstat$INODE64 +_getfsstat64 +_getgid +_getgroups +_gethostuuid +_getiopolicy_np +_getitimer +_getpeername +_getpgid +_getpgrp +_getpid +_getppid +_getpriority +_getrlimit +_getrusage +_getsgroups_np +_getsid +_getsockname +_getsockopt +_getuid +_getwgroups_np +_getxattr +_grab_pgo_data +_guarded_close_np +_guarded_kqueue_np +_guarded_open_dprotected_np +_guarded_open_np +_guarded_pwrite_np +_guarded_write_np +_guarded_writev_np +_host_check_multiuser_mode +_host_create_mach_voucher +_host_create_mach_voucher_trap +_host_default_memory_manager +_host_get_UNDServer +_host_get_atm_diagnostic_flag +_host_get_boot_info +_host_get_clock_control +_host_get_clock_service +_host_get_exception_ports +_host_get_io_master +_host_get_multiuser_config_flags +_host_get_special_port +_host_info +_host_kernel_version +_host_lockgroup_info +_host_page_size +_host_priv_statistics +_host_processor_info +_host_processor_set_priv +_host_processor_sets +_host_processors +_host_reboot +_host_register_mach_voucher_attr_manager +_host_register_well_known_mach_voucher_attr_manager +_host_request_notification +_host_security_create_task_token +_host_security_set_task_token +_host_self +_host_self_trap +_host_set_UNDServer +_host_set_atm_diagnostic_flag +_host_set_exception_ports +_host_set_multiuser_config_flags +_host_set_special_port +_host_statistics +_host_statistics64 +_host_swap_exception_ports +_host_virtual_physical_table_info +_i386_get_ldt +_i386_set_ldt +_important_boost_assertion_token +_internal_catch_exc_subsystem +_ioctl +_issetugid +_kas_info +_kdebug_is_enabled +_kdebug_signpost +_kdebug_signpost_end +_kdebug_signpost_start +_kdebug_trace +_kdebug_trace_string +_kdebug_typefilter +_kevent +_kevent64 +_kevent_qos +_kext_request +_kill +_kmod_control +_kmod_create +_kmod_destroy +_kmod_get_info +_kpersona_alloc +_kpersona_dealloc +_kpersona_find +_kpersona_get +_kpersona_info +_kpersona_pidinfo +_kqueue +_lchown +_ledger +_link +_linkat +_lio_listio +_listen +_listxattr +_lock_acquire +_lock_handoff +_lock_handoff_accept +_lock_make_stable +_lock_release +_lock_set_create +_lock_set_destroy +_lock_try +_lseek +_lstat +_lstat$INODE64 +_lstat64 +_mach_absolute_time +_mach_approximate_time +_mach_boottime_usec +_mach_continuous_approximate_time +_mach_continuous_time +_mach_error +_mach_error_full_diag +_mach_error_string +_mach_error_type +_mach_generate_activity_id +_mach_get_times +_mach_host_self +_mach_init +_mach_make_memory_entry +_mach_make_memory_entry_64 +_mach_memory_info +_mach_memory_object_memory_entry +_mach_memory_object_memory_entry_64 +_mach_msg +_mach_msg_destroy +_mach_msg_overwrite +_mach_msg_overwrite_trap +_mach_msg_receive +_mach_msg_send +_mach_msg_server +_mach_msg_server_importance +_mach_msg_server_once +_mach_msg_trap +_mach_notify_dead_name +_mach_notify_no_senders +_mach_notify_port_deleted +_mach_notify_port_destroyed +_mach_notify_send_once +_mach_port_allocate +_mach_port_allocate_full +_mach_port_allocate_name +_mach_port_allocate_qos +_mach_port_construct +_mach_port_deallocate +_mach_port_destroy +_mach_port_destruct +_mach_port_dnrequest_info +_mach_port_extract_member +_mach_port_extract_right +_mach_port_get_attributes +_mach_port_get_context +_mach_port_get_refs +_mach_port_get_set_status +_mach_port_get_srights +_mach_port_guard +_mach_port_insert_member +_mach_port_insert_right +_mach_port_kernel_object +_mach_port_kobject +_mach_port_mod_refs +_mach_port_move_member +_mach_port_names +_mach_port_peek +_mach_port_rename +_mach_port_request_notification +_mach_port_set_attributes +_mach_port_set_context +_mach_port_set_mscount +_mach_port_set_seqno +_mach_port_space_basic_info +_mach_port_space_info +_mach_port_type +_mach_port_unguard +_mach_ports_lookup +_mach_ports_register +_mach_reply_port +_mach_task_self +_mach_task_self_ +_mach_thread_self +_mach_timebase_info +_mach_timebase_info_trap +_mach_vm_allocate +_mach_vm_behavior_set +_mach_vm_copy +_mach_vm_deallocate +_mach_vm_inherit +_mach_vm_machine_attribute +_mach_vm_map +_mach_vm_msync +_mach_vm_page_info +_mach_vm_page_query +_mach_vm_protect +_mach_vm_purgable_control +_mach_vm_read +_mach_vm_read_list +_mach_vm_read_overwrite +_mach_vm_region +_mach_vm_region_recurse +_mach_vm_remap +_mach_vm_wire +_mach_vm_write +_mach_voucher_attr_command +_mach_voucher_deallocate +_mach_voucher_debug_info +_mach_voucher_extract_all_attr_recipes +_mach_voucher_extract_attr_content +_mach_voucher_extract_attr_recipe +_mach_voucher_extract_attr_recipe_trap +_mach_wait_until +_mach_zone_force_gc +_mach_zone_info +_macx_backing_store_recovery +_macx_backing_store_suspend +_macx_swapoff +_macx_swapon +_macx_triggers +_madvise +_memorystatus_control +_memorystatus_get_level +_mig_allocate +_mig_dealloc_reply_port +_mig_deallocate +_mig_get_reply_port +_mig_put_reply_port +_mig_reply_setup +_mig_strncpy +_mig_strncpy_zerofill +_mincore +_minherit +_mk_timer_arm +_mk_timer_cancel +_mk_timer_create +_mk_timer_destroy +_mkdir +_mkdirat +_mkfifo +_mknod +_mlock +_mlockall +_mmap +_modwatch +_mount +_mprotect +_mremap_encrypted +_msg_receive +_msg_rpc +_msg_send +_msgctl +_msgget +_msgrcv +_msgrcv$NOCANCEL +_msgsnd +_msgsnd$NOCANCEL +_msgsys +_msync +_msync$NOCANCEL +_munlock +_munlockall +_munmap +_necp_client_action +_necp_match_policy +_necp_open +_netagent_trigger +_netname_check_in +_netname_check_out +_netname_look_up +_netname_version +_nfsclnt +_nfssvc +_non_boost_assertion_token +_normal_boost_assertion_token +_open +_open$NOCANCEL +_open_dprotected_np +_openat +_openat$NOCANCEL +_openbyid_np +_os_channel_advance_slot +_os_channel_attr_clone +_os_channel_attr_create +_os_channel_attr_destroy +_os_channel_attr_get +_os_channel_attr_get_key +_os_channel_attr_set +_os_channel_attr_set_key +_os_channel_available_slot_count +_os_channel_create +_os_channel_create_extended +_os_channel_destroy +_os_channel_get_fd +_os_channel_get_next_slot +_os_channel_pending +_os_channel_read_attr +_os_channel_read_nexus_extension_info +_os_channel_ring_id +_os_channel_rx_ring +_os_channel_set_slot_properties +_os_channel_sync +_os_channel_tx_ring +_os_channel_write_attr +_os_nexus_attr_clone +_os_nexus_attr_create +_os_nexus_attr_destroy +_os_nexus_attr_get +_os_nexus_attr_set +_os_nexus_controller_alloc_provider_instance +_os_nexus_controller_bind_provider_instance +_os_nexus_controller_create +_os_nexus_controller_deregister_provider +_os_nexus_controller_destroy +_os_nexus_controller_free_provider_instance +_os_nexus_controller_get_fd +_os_nexus_controller_read_provider_attr +_os_nexus_controller_register_provider +_os_nexus_controller_unbind_provider_instance +_panic +_panic_init +_pathconf +_peeloff +_pid_for_task +_pid_hibernate +_pid_resume +_pid_shutdown_sockets +_pid_suspend +_pipe +_poll +_poll$NOCANCEL +_port_obj_init +_port_obj_table +_port_obj_table_size +_posix_madvise +_posix_spawn +_posix_spawn_file_actions_addclose +_posix_spawn_file_actions_adddup2 +_posix_spawn_file_actions_addinherit_np +_posix_spawn_file_actions_addopen +_posix_spawn_file_actions_destroy +_posix_spawn_file_actions_init +_posix_spawnattr_destroy +_posix_spawnattr_get_darwin_role_np +_posix_spawnattr_get_qos_clamp_np +_posix_spawnattr_getbinpref_np +_posix_spawnattr_getcpumonitor +_posix_spawnattr_getflags +_posix_spawnattr_getmacpolicyinfo_np +_posix_spawnattr_getpcontrol_np +_posix_spawnattr_getpgroup +_posix_spawnattr_getprocesstype_np +_posix_spawnattr_getsigdefault +_posix_spawnattr_getsigmask +_posix_spawnattr_init +_posix_spawnattr_set_darwin_role_np +_posix_spawnattr_set_importancewatch_port_np +_posix_spawnattr_set_persona_gid_np +_posix_spawnattr_set_persona_groups_np +_posix_spawnattr_set_persona_np +_posix_spawnattr_set_persona_uid_np +_posix_spawnattr_set_qos_clamp_np +_posix_spawnattr_setauditsessionport_np +_posix_spawnattr_setbinpref_np +_posix_spawnattr_setcoalition_np +_posix_spawnattr_setcpumonitor +_posix_spawnattr_setcpumonitor_default +_posix_spawnattr_setexceptionports_np +_posix_spawnattr_setflags +_posix_spawnattr_setjetsam_ext +_posix_spawnattr_setmacpolicyinfo_np +_posix_spawnattr_setpcontrol_np +_posix_spawnattr_setpgroup +_posix_spawnattr_setprocesstype_np +_posix_spawnattr_setsigdefault +_posix_spawnattr_setsigmask +_posix_spawnattr_setspecialport_np +_pread +_pread$NOCANCEL +_proc_clear_cpulimits +_proc_clear_delayidlesleep +_proc_clear_dirty +_proc_clear_vmpressure +_proc_denap_assertion_begin_with_msg +_proc_denap_assertion_complete +_proc_disable_apptype +_proc_disable_cpumon +_proc_disable_wakemon +_proc_donate_importance_boost +_proc_enable_apptype +_proc_get_cpumon_params +_proc_get_dirty +_proc_get_wakemon_params +_proc_importance_assertion_begin_with_msg +_proc_importance_assertion_complete +_proc_kmsgbuf +_proc_libversion +_proc_list_uptrs +_proc_listallpids +_proc_listchildpids +_proc_listcoalitions +_proc_listpgrppids +_proc_listpids +_proc_listpidspath +_proc_name +_proc_pid_rusage +_proc_pidfdinfo +_proc_pidfileportinfo +_proc_pidinfo +_proc_pidoriginatorinfo +_proc_pidpath +_proc_regionfilename +_proc_resume_cpumon +_proc_rlimit_control +_proc_set_cpumon_defaults +_proc_set_cpumon_params +_proc_set_cpumon_params_fatal +_proc_set_delayidlesleep +_proc_set_dirty +_proc_set_owner_vmpressure +_proc_set_wakemon_defaults +_proc_set_wakemon_params +_proc_setcpu_percentage +_proc_setpcontrol +_proc_setthread_cpupercent +_proc_suppress +_proc_terminate +_proc_trace_log +_proc_track_dirty +_proc_uuid_policy +_processor_assign +_processor_control +_processor_exit +_processor_get_assignment +_processor_info +_processor_set_create +_processor_set_default +_processor_set_destroy +_processor_set_info +_processor_set_max_priority +_processor_set_policy_control +_processor_set_policy_disable +_processor_set_policy_enable +_processor_set_stack_usage +_processor_set_statistics +_processor_set_tasks +_processor_set_threads +_processor_start +_pselect +_pselect$1050 +_pselect$DARWIN_EXTSN +_pselect$DARWIN_EXTSN$NOCANCEL +_pselect$NOCANCEL +_pthread_getugid_np +_pthread_setugid_np +_ptrace +_pwrite +_pwrite$NOCANCEL +_quota +_quotactl +_read +_read$NOCANCEL +_readlink +_readlinkat +_readv +_readv$NOCANCEL +_reboot +_recvfrom +_recvfrom$NOCANCEL +_recvmsg +_recvmsg$NOCANCEL +_recvmsg_x +_removexattr +_rename +_rename_ext +_renameat +_renameatx_np +_renamex_np +_revoke +_rmdir +_searchfs +_select +_select$1050 +_select$DARWIN_EXTSN +_select$DARWIN_EXTSN$NOCANCEL +_select$NOCANCEL +_sem_close +_sem_destroy +_sem_getvalue +_sem_init +_sem_open +_sem_post +_sem_trywait +_sem_unlink +_sem_wait +_sem_wait$NOCANCEL +_semaphore_create +_semaphore_destroy +_semaphore_signal +_semaphore_signal_all +_semaphore_signal_all_trap +_semaphore_signal_thread +_semaphore_signal_thread_trap +_semaphore_signal_trap +_semaphore_timedwait +_semaphore_timedwait_signal +_semaphore_timedwait_signal_trap +_semaphore_timedwait_trap +_semaphore_wait +_semaphore_wait_signal +_semaphore_wait_signal_trap +_semaphore_wait_trap +_semctl +_semget +_semop +_semsys +_sendfile +_sendmsg +_sendmsg$NOCANCEL +_sendmsg_x +_sendto +_sendto$NOCANCEL +_setattrlist +_setaudit +_setaudit_addr +_setauid +_setegid +_seteuid +_setgid +_setgroups +_setiopolicy_np +_setitimer +_setpgid +_setpriority +_setprivexec +_setquota +_setregid +_setreuid +_setrlimit +_setsgroups_np +_setsid +_setsockopt +_setuid +_setwgroups_np +_setxattr +_sfi_get_class_offtime +_sfi_process_get_flags +_sfi_process_set_flags +_sfi_set_class_offtime +_shm_open +_shm_unlink +_shmat +_shmctl +_shmdt +_shmget +_shmsys +_shutdown +_sigpending +_sigprocmask +_sigsuspend +_sigsuspend$NOCANCEL +_socket +_socket_delegate +_socketpair +_stackshot_capture_with_config +_stackshot_config_create +_stackshot_config_dealloc +_stackshot_config_dealloc_buffer +_stackshot_config_get_stackshot_buffer +_stackshot_config_get_stackshot_size +_stackshot_config_set_delta_timestamp +_stackshot_config_set_flags +_stackshot_config_set_pid +_stackshot_config_set_size_hint +_stat +_stat$INODE64 +_stat64 +_statfs +_statfs$INODE64 +_statfs64 +_swapon +_swtch +_swtch_pri +_symlink +_symlinkat +_sync +_syscall +_syscall_thread_switch +_system_get_sfi_window +_system_override +_system_set_sfi_window +_task_assign +_task_assign_default +_task_create +_task_for_pid +_task_generate_corpse +_task_get_assignment +_task_get_dyld_image_infos +_task_get_emulation_vector +_task_get_exception_ports +_task_get_mach_voucher +_task_get_special_port +_task_get_state +_task_info +_task_map_corpse_info +_task_map_corpse_info_64 +_task_name_for_pid +_task_policy +_task_policy_get +_task_policy_set +_task_purgable_info +_task_register_dyld_get_process_state +_task_register_dyld_image_infos +_task_register_dyld_set_dyld_state +_task_register_dyld_shared_cache_image_info +_task_resume +_task_resume2 +_task_sample +_task_self_ +_task_self_trap +_task_set_emulation +_task_set_emulation_vector +_task_set_exception_ports +_task_set_info +_task_set_mach_voucher +_task_set_phys_footprint_limit +_task_set_policy +_task_set_port_space +_task_set_ras_pc +_task_set_special_port +_task_set_state +_task_suspend +_task_suspend2 +_task_swap_exception_ports +_task_swap_mach_voucher +_task_terminate +_task_threads +_task_unregister_dyld_image_infos +_task_zone_info +_terminate_with_payload +_terminate_with_reason +_thread_abort +_thread_abort_safely +_thread_assign +_thread_assign_default +_thread_create +_thread_create_running +_thread_depress_abort +_thread_get_assignment +_thread_get_exception_ports +_thread_get_mach_voucher +_thread_get_register_pointer_values +_thread_get_special_port +_thread_get_state +_thread_info +_thread_policy +_thread_policy_get +_thread_policy_set +_thread_resume +_thread_sample +_thread_self_trap +_thread_set_exception_ports +_thread_set_mach_voucher +_thread_set_policy +_thread_set_special_port +_thread_set_state +_thread_suspend +_thread_swap_exception_ports +_thread_swap_mach_voucher +_thread_switch +_thread_terminate +_thread_wire +_truncate +_umask +_undelete +_unlink +_unlinkat +_unmount +_usrctl +_utimes +_vfork +_vfs_purge +_vm_allocate +_vm_allocate_cpm +_vm_behavior_set +_vm_copy +_vm_deallocate +_vm_inherit +_vm_kernel_page_mask +_vm_kernel_page_shift +_vm_kernel_page_size +_vm_machine_attribute +_vm_map +_vm_map_page_query +_vm_msync +_vm_page_mask +_vm_page_shift +_vm_page_size +_vm_pressure_monitor +_vm_protect +_vm_purgable_control +_vm_read +_vm_read_list +_vm_read_overwrite +_vm_region_64 +_vm_region_recurse_64 +_vm_remap +_vm_wire +_vm_write +_voucher_mach_msg_adopt +_voucher_mach_msg_clear +_voucher_mach_msg_revert +_voucher_mach_msg_set +_vprintf_stderr_func +_wait4 +_waitevent +_waitid +_waitid$NOCANCEL +_watchevent +_work_interval_create +_work_interval_destroy +_work_interval_notify +_work_interval_notify_simple +_write +_write$NOCANCEL +_writev +_writev$NOCANCEL diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_symbols b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_symbols new file mode 100644 index 0000000..75a00ac --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Libsystem/system_symbols @@ -0,0 +1 @@ +_mach_init_routine diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/PowerManagement/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/PowerManagement/default.nix new file mode 100644 index 0000000..5685d09 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/PowerManagement/default.nix @@ -0,0 +1,10 @@ +{ appleDerivation, xcbuildHook, IOKit }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ IOKit ]; + xcbuildFlags = [ "-target" "caffeinate" ]; + installPhase = '' + install -D Products/Deployment/caffeinate $out/bin/caffeinate + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/boot.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/boot.nix new file mode 100644 index 0000000..f4fe65b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/boot.nix @@ -0,0 +1,115 @@ +{ appleDerivation', stdenv, darwin-stubs }: + +appleDerivation' stdenv { + __propagatedImpureHostDeps = [ + "/System/Library/Frameworks/Security.framework/Security" + "/System/Library/Frameworks/Security.framework/Resources" + "/System/Library/Frameworks/Security.framework/PlugIns" + "/System/Library/Frameworks/Security.framework/XPCServices" + "/System/Library/Frameworks/Security.framework/Versions" + ]; + + installPhase = '' + mkdir -p $out/Library/Frameworks/Security.framework + + ###### IMPURITIES + ln -s /System/Library/Frameworks/Security.framework/{Resources,Plugins,XPCServices} \ + $out/Library/Frameworks/Security.framework + + ###### STUBS + cp ${darwin-stubs}/System/Library/Frameworks/Security.framework/Versions/A/Security.tbd \ + $out/Library/Frameworks/Security.framework + + ###### HEADERS + + export dest=$out/Library/Frameworks/Security.framework/Headers + mkdir -p $dest + + cp libsecurity_asn1/lib/SecAsn1Coder.h $dest + cp libsecurity_asn1/lib/SecAsn1Templates.h $dest + cp libsecurity_asn1/lib/SecAsn1Types.h $dest + cp libsecurity_asn1/lib/oidsalg.h $dest + cp libsecurity_asn1/lib/oidsattr.h $dest + + cp libsecurity_authorization/lib/AuthSession.h $dest + cp libsecurity_authorization/lib/Authorization.h $dest + cp libsecurity_authorization/lib/AuthorizationDB.h $dest + cp libsecurity_authorization/lib/AuthorizationPlugin.h $dest + cp libsecurity_authorization/lib/AuthorizationTags.h $dest + + cp libsecurity_cms/lib/CMSDecoder.h $dest + cp libsecurity_cms/lib/CMSEncoder.h $dest + + cp libsecurity_codesigning/lib/CSCommon.h $dest + cp libsecurity_codesigning/lib/CodeSigning.h $dest + cp libsecurity_codesigning/lib/SecCode.h $dest + cp libsecurity_codesigning/lib/SecCodeHost.h $dest + cp libsecurity_codesigning/lib/SecRequirement.h $dest + cp libsecurity_codesigning/lib/SecStaticCode.h $dest + cp libsecurity_codesigning/lib/SecTask.h $dest + + cp libsecurity_cssm/lib/certextensions.h $dest + cp libsecurity_cssm/lib/cssm.h $dest + cp libsecurity_cssm/lib/cssmaci.h $dest + cp libsecurity_cssm/lib/cssmapi.h $dest + cp libsecurity_cssm/lib/cssmapple.h $dest + cp libsecurity_cssm/lib/cssmcli.h $dest + cp libsecurity_cssm/lib/cssmconfig.h $dest + cp libsecurity_cssm/lib/cssmcspi.h $dest + cp libsecurity_cssm/lib/cssmdli.h $dest + cp libsecurity_cssm/lib/cssmerr.h $dest + cp libsecurity_cssm/lib/cssmkrapi.h $dest + cp libsecurity_cssm/lib/cssmkrspi.h $dest + cp libsecurity_cssm/lib/cssmspi.h $dest + cp libsecurity_cssm/lib/cssmtpi.h $dest + cp libsecurity_cssm/lib/cssmtype.h $dest + cp libsecurity_cssm/lib/eisl.h $dest + cp libsecurity_cssm/lib/emmspi.h $dest + cp libsecurity_cssm/lib/emmtype.h $dest + cp libsecurity_cssm/lib/oidsbase.h $dest + cp libsecurity_cssm/lib/oidscert.h $dest + cp libsecurity_cssm/lib/oidscrl.h $dest + cp libsecurity_cssm/lib/x509defs.h $dest + + cp libsecurity_keychain/lib/SecACL.h $dest + cp libsecurity_keychain/lib/SecAccess.h $dest + cp libsecurity_keychain/lib/SecBase.h $dest + cp libsecurity_keychain/lib/SecCertificate.h $dest + cp libsecurity_keychain/lib/SecCertificatePriv.h $dest # Private + cp libsecurity_keychain/lib/SecCertificateOIDs.h $dest + cp libsecurity_keychain/lib/SecIdentity.h $dest + cp libsecurity_keychain/lib/SecIdentitySearch.h $dest + cp libsecurity_keychain/lib/SecImportExport.h $dest + cp libsecurity_keychain/lib/SecItem.h $dest + cp libsecurity_keychain/lib/SecKey.h $dest + cp libsecurity_keychain/lib/SecKeychain.h $dest + cp libsecurity_keychain/lib/SecKeychainItem.h $dest + cp libsecurity_keychain/lib/SecKeychainSearch.h $dest + cp libsecurity_keychain/lib/SecPolicy.h $dest + cp libsecurity_keychain/lib/SecPolicySearch.h $dest + cp libsecurity_keychain/lib/SecRandom.h $dest + cp libsecurity_keychain/lib/SecTrust.h $dest + cp libsecurity_keychain/lib/SecTrustSettings.h $dest + cp libsecurity_keychain/lib/SecTrustedApplication.h $dest + cp libsecurity_keychain/lib/Security.h $dest + + cp libsecurity_manifest/lib/SecureDownload.h $dest + + cp libsecurity_mds/lib/mds.h $dest + cp libsecurity_mds/lib/mds_schema.h $dest + + cp libsecurity_ssl/lib/CipherSuite.h $dest + cp libsecurity_ssl/lib/SecureTransport.h $dest + + cp libsecurity_transform/lib/SecCustomTransform.h $dest + cp libsecurity_transform/lib/SecDecodeTransform.h $dest + cp libsecurity_transform/lib/SecDigestTransform.h $dest + cp libsecurity_transform/lib/SecEncodeTransform.h $dest + cp libsecurity_transform/lib/SecEncryptTransform.h $dest + cp libsecurity_transform/lib/SecReadTransform.h $dest + cp libsecurity_transform/lib/SecSignVerifyTransform.h $dest + cp libsecurity_transform/lib/SecTransform.h $dest + cp libsecurity_transform/lib/SecTransformReadTransform.h $dest + + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/default.nix new file mode 100644 index 0000000..984910b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/Security/default.nix @@ -0,0 +1,19 @@ +{ appleDerivation, xcbuildHook, xpc, dtrace, xnu }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook dtrace ]; + # buildInputs = [ Foundation xpc darling ]; + buildInputs = [ xpc xnu ]; + + xcbuildFlags = [ "-target" "Security_frameworks_osx" ]; + + # env.NIX_CFLAGS_COMPILE = "-Wno-error -I${xnu}/include/libkern -DPRIVATE -I${xnu}/Library/Frameworks/System.framework/Headers"; + + preBuild = '' + dtrace -h -C -s OSX/libsecurity_utilities/lib/security_utilities.d -o OSX/libsecurity_utilities/lib/utilities_dtrace.h + + xcodebuild SYMROOT=$PWD/Products OBJROOT=$PWD/Intermediates -target copyHeadersToSystem + NIX_CFLAGS_COMPILE+=" -F./Products/Release" + ln -s $PWD/Products/Release/Security.bundle/Contents $PWD/Products/Release/Security.framework + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/boot.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/boot.nix new file mode 100644 index 0000000..7d1066a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/boot.nix @@ -0,0 +1,101 @@ +{ lib, stdenv, buildPackages, appleDerivation, fetchFromGitHub, bsdmake, perl, flex, bison +}: + +# this derivation sucks +# locale data was removed after adv_cmds-118, so our base is that because it's easier than +# replicating the bizarre bsdmake file structure +# +# sadly adv_cmds-118 builds a mklocale and colldef that generate files that our libc can no +# longer understand +# +# the more recent adv_cmds release is used for everything else in this package + +let recentAdvCmds = fetchFromGitHub { + owner = "apple-oss-distributions"; + repo = "adv_cmds"; + rev = "adv_cmds-158"; + hash = "sha256-1qL69pGHIaefooJJ8eT83XGz9+bW7Yg3k+X9fNkMCHw="; +}; + +in appleDerivation { + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ bsdmake perl bison flex ]; + buildInputs = [ flex ]; + + patchPhase = '' + substituteInPlace BSDmakefile \ + --replace chgrp true \ + --replace /Developer/Makefiles/bin/compress-man-pages.pl true \ + --replace "ps.tproj" "" --replace "gencat.tproj" "" --replace "md.tproj" "" \ + --replace "tabs.tproj" "" --replace "cap_mkdb.tproj" "" \ + --replace "!= tconf --test TARGET_OS_EMBEDDED" "= NO" + + substituteInPlace Makefile --replace perl true + + substituteInPlace colldef.tproj/scan.l \ + --replace 'static orderpass = 0;' 'static int orderpass = 0;' + + for subproject in colldef mklocale monetdef msgdef numericdef timedef; do + substituteInPlace usr-share-locale.tproj/$subproject/BSDmakefile \ + --replace /usr/share/locale "" \ + --replace '-o ''${BINOWN} -g ''${BINGRP}' "" \ + --replace "rsync -a" "cp -r" + done + ''; + + preBuild = '' + cp -r --no-preserve=all ${recentAdvCmds}/colldef . + + substituteInPlace colldef/scan.l \ + --replace 'static orderpass = 0;' 'static int orderpass = 0;' + + pushd colldef + mv locale/collate.h . + flex -t -8 -i scan.l > scan.c + yacc -d parse.y + clang *.c -o colldef -lfl + popd + mv colldef/colldef colldef.tproj/colldef + + cp -r --no-preserve=all ${recentAdvCmds}/mklocale . + pushd mklocale + flex -t -8 -i lex.l > lex.c + yacc -d yacc.y + clang *.c -o mklocale -lfl + popd + mv mklocale/mklocale mklocale.tproj/mklocale + ''; + + buildPhase = '' + runHook preBuild + + bsdmake -C usr-share-locale.tproj + + ${stdenv.cc.targetPrefix}clang ${recentAdvCmds}/ps/*.c -o ps + ''; + + installPhase = '' + bsdmake -C usr-share-locale.tproj install DESTDIR="$locale/share/locale" + + # need to get rid of runtime dependency on flex + # install -d 0755 $locale/bin + # install -m 0755 colldef.tproj/colldef $locale/bin + # install -m 0755 mklocale.tproj/mklocale $locale/bin + + install -d 0755 $ps/bin + install ps $ps/bin/ps + touch "$out" + ''; + + outputs = [ + "out" + "ps" + "locale" + ]; + setOutputFlags = false; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ gridaphobe ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/default.nix new file mode 100644 index 0000000..3ac338d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/adv_cmds/default.nix @@ -0,0 +1,65 @@ +{ stdenv, lib, appleDerivation, xcbuild, ncurses, libutil, Libc }: + +let + # Libc conflicts with libc++ 16, so provide only the header from it that’s needed to build. + msgcat = stdenv.mkDerivation { + pname = "Libc-msgcat"; + version = lib.getVersion Libc; + + buildCommand = '' + mkdir -p "$out/include" + ln -s ${lib.getDev Libc}/include/msgcat.h "$out/include/" + ''; + }; +in +appleDerivation { + # We can't just run the root build, because https://github.com/facebook/xcbuild/issues/264 + + patchPhase = '' + substituteInPlace adv_cmds.xcodeproj/project.pbxproj \ + --replace '/usr/lib/libtermcap.dylib' 'libncurses.dylib' + substituteInPlace colldef/scan.l \ + --replace 'static orderpass = 0;' 'static int orderpass = 0;' + ''; + + # pkill requires special private headers that are unavailable in + # NixPkgs. These ones are needed: + # - xpc/xpxc.h + # - os/base_private.h + # - _simple.h + # We disable it here for now. TODO: build pkill inside adv_cmds + buildPhase = '' + targets=$(xcodebuild -list \ + | awk '/Targets:/{p=1;print;next} p&&/^\s*$/{p=0};p' \ + | tail -n +2 | sed 's/^[ \t]*//' \ + | grep -v -e Desktop -e Embedded -e mklocale -e pkill -e pgrep -e colldef) + + for i in $targets; do + xcodebuild SYMROOT=$PWD/Products OBJROOT=$PWD/Intermediates -target $i + done + ''; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + + mkdir -p $out/System/Library/LaunchDaemons + install fingerd/finger.plist $out/System/Library/LaunchDaemons + + # from variant_links.sh + # ln -s $out/bin/pkill $out/bin/pgrep + # ln -s $out/share/man/man1/pkill.1 $out/share/man/man1/pgrep.1 + ''; + + nativeBuildInputs = [ xcbuild ]; + buildInputs = [ ncurses libutil msgcat ]; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/architecture/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/architecture/default.nix new file mode 100644 index 0000000..86f58b6 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/architecture/default.nix @@ -0,0 +1,39 @@ +{ lib, appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + dontBuild = true; + + postPatch = '' + substituteInPlace Makefile \ + --replace '/bin/mkdir' 'mkdir' \ + --replace '/usr/bin/install' 'install' + ''; + + installFlags = [ "EXPORT_DSTDIR=/include/architecture" ]; + + DSTROOT = "$(out)"; + + appleHeaders = '' + architecture/alignment.h + architecture/byte_order.h + architecture/i386/alignment.h + architecture/i386/asm_help.h + architecture/i386/byte_order.h + architecture/i386/cpu.h + architecture/i386/desc.h + architecture/i386/fpu.h + architecture/i386/frame.h + architecture/i386/io.h + architecture/i386/pio.h + architecture/i386/reg_help.h + architecture/i386/sel.h + architecture/i386/table.h + architecture/i386/tss.h + ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/basic_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/basic_cmds/default.nix new file mode 100644 index 0000000..7d011d2 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/basic_cmds/default.nix @@ -0,0 +1,32 @@ +{ lib, appleDerivation, xcbuildHook }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + + # These PBXcp calls should be patched in xcbuild to allow them to + # automatically be prefixed. + patchPhase = '' + substituteInPlace basic_cmds.xcodeproj/project.pbxproj \ + --replace "dstPath = /usr/share/man/man1;" "dstPath = $out/share/man/man1;" \ + --replace "dstPath = /usr/share/man/man5;" "dstPath = $out/share/man/man5;" + ''; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + + for n in 1; do + mkdir -p $out/share/man/man$n + install */*.$n $out/share/man/man$n + done + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/bootstrap_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/bootstrap_cmds/default.nix new file mode 100644 index 0000000..ff98ed8 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/bootstrap_cmds/default.nix @@ -0,0 +1,43 @@ +{ lib, appleDerivation, stdenv, bison, flex }: + +let + + # Hard to get CC to pull this off without infinite recursion + targetTargetPrefix = lib.optionalString + (with stdenv; hostPlatform != targetPlatform) + (stdenv.targetPlatform.config + "-"); + +in + +appleDerivation { + nativeBuildInputs = [ bison flex ]; + + buildPhase = '' + cd migcom.tproj + + # redundant file, don't know why apple not removing it. + rm handler.c + + yacc -d parser.y + flex --header-file=lexxer.yy.h -o lexxer.yy.c lexxer.l + + $CC -std=gnu99 -Os -dead_strip -DMIG_VERSION=\"$pname-$version\" -I. -o migcom *.c + ''; + + installPhase = '' + mkdir -p $out/bin $out/libexec $out/share/man/man1 + + chmod +x mig.sh + cp mig.sh $out/bin/mig + cp migcom $out/libexec + ln -s $out/libexec/migcom $out/bin/migcom + cp mig.1 $out/share/man/man1 + cp migcom.1 $out/share/man/man1 + + substituteInPlace $out/bin/mig \ + --replace 'arch=`/usr/bin/arch`' 'arch=${stdenv.targetPlatform.darwinArch}' \ + --replace '/usr/bin/' "" \ + --replace '/bin/rmdir' "rmdir" \ + --replace 'C=''${MIGCC}' "C=${targetTargetPrefix}cc" + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/bsdmake/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/bsdmake/default.nix new file mode 100644 index 0000000..214aa5d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/bsdmake/default.nix @@ -0,0 +1,55 @@ +{ lib, appleDerivation, makeWrapper }: + +appleDerivation { + nativeBuildInputs = [ makeWrapper ]; + + patchPhase = '' + substituteInPlace mk/bsd.prog.mk \ + --replace '-o ''${BINOWN} -g ''${BINGRP}' "" \ + --replace '-o ''${SCRIPTSOWN_''${.ALLSRC:T}}' "" \ + --replace '-g ''${SCRIPTSGRP_''${.ALLSRC:T}}' "" + substituteInPlace mk/bsd.lib.mk --replace '-o ''${LIBOWN} -g ''${LIBGRP}' "" + substituteInPlace mk/bsd.info.mk --replace '-o ''${INFOOWN} -g ''${INFOGRP}' "" + substituteInPlace mk/bsd.doc.mk --replace '-o ''${BINOWN} -g ''${BINGRP}' "" + substituteInPlace mk/bsd.man.mk --replace '-o ''${MANOWN} -g ''${MANGRP}' "" + substituteInPlace mk/bsd.files.mk \ + --replace '-o ''${''${group}OWN_''${.ALLSRC:T}}' "" \ + --replace '-g ''${''${group}GRP_''${.ALLSRC:T}}' "" \ + --replace '-o ''${''${group}OWN} -g ''${''${group}GRP}' "" + substituteInPlace mk/bsd.incs.mk \ + --replace '-o ''${''${group}OWN_''${.ALLSRC:T}}' "" \ + --replace '-g ''${''${group}GRP_''${.ALLSRC:T}}' "" \ + --replace '-o ''${''${group}OWN} -g ''${''${group}GRP}' "" + + # Workaround for https://github.com/NixOS/nixpkgs/issues/103172 + # Prevents bsdmake from failing on systems that already had default limits + # increased. + substituteInPlace main.c \ + --replace 'err(2, "setrlimit");' 'warn("setrlimit");' + ''; + + buildPhase = '' + objs=() + for file in $(find . -name '*.c'); do + obj="$(basename "$file" .c).o" + objs+=("$obj") + $CC -c "$file" -o "$obj" -DDEFSHELLNAME='"sh"' -D__FBSDID=__RCSID -mdynamic-no-pic -g + done + $CC "''${objs[@]}" -o bsdmake + ''; + + installPhase = '' + install -d 0644 $out/bin + install -m 0755 bsdmake $out/bin + install -d 0644 $out/share/mk + install -m 0755 mk/* $out/share/mk + ''; + + preFixup = '' + wrapProgram "$out/bin/bsdmake" --add-flags "-m $out/share/mk" + ''; + + meta = { + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/configd/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/configd/default.nix new file mode 100644 index 0000000..998bc86 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/configd/default.nix @@ -0,0 +1,184 @@ +{ lib, stdenv, runCommand, appleDerivation', launchd, bootstrap_cmds, swift-corelibs-foundation, xnu, xpc, ppp, IOKit, eap8021x, Security +, headersOnly ? false }: + +let + privateHeaders = runCommand "swift-corelibs-foundation-private" { } '' + mkdir -p $out/include/CoreFoundation + + cp ${swift-corelibs-foundation}/Library/Frameworks/CoreFoundation.framework/PrivateHeaders/* \ + $out/include/CoreFoundation + ''; +in +appleDerivation' stdenv { + meta.broken = stdenv.cc.nativeLibc; + + nativeBuildInputs = lib.optionals (!headersOnly) [ bootstrap_cmds ]; + buildInputs = lib.optionals (!headersOnly) [ privateHeaders launchd ppp xpc IOKit eap8021x ]; + + propagatedBuildInputs = lib.optionals (!headersOnly) [ Security ]; + + env = lib.optionalAttrs (!headersOnly) { + NIX_CFLAGS_COMPILE = toString [ + "-ISystemConfiguration.framework/Headers" + "-I${xnu}/Library/Frameworks/System.framework/Versions/B/PrivateHeaders" + ]; + }; + + patchPhase = lib.optionalString (!headersOnly) '' + substituteInPlace SystemConfiguration.fproj/reachability/SCNetworkReachabilityServer_client.c \ + --replace '#include ' "" + + substituteInPlace SystemConfiguration.fproj/SCNetworkReachability.c \ + --replace ''$'#define\tHAVE_VPN_STATUS' "" + ''; + + dontBuild = headersOnly; + + buildPhase = '' + pushd SystemConfiguration.fproj >/dev/null + + mkdir -p SystemConfiguration.framework/Resources + cp ../get-mobility-info SystemConfiguration.framework/Resources + cp Info.plist SystemConfiguration.framework/Resources + cp -r English.lproj SystemConfiguration.framework/Resources + cp NetworkConfiguration.plist SystemConfiguration.framework/Resources + + mkdir -p SystemConfiguration.framework/Headers + mkdir -p SystemConfiguration.framework/PrivateHeaders + + # The standard public headers + cp SCSchemaDefinitions.h SystemConfiguration.framework/Headers + cp SystemConfiguration.h SystemConfiguration.framework/Headers + cp SCDynamicStore.h SystemConfiguration.framework/Headers + cp SCDynamicStoreCopySpecific.h SystemConfiguration.framework/Headers + cp SCPreferences.h SystemConfiguration.framework/Headers + cp CaptiveNetwork.h SystemConfiguration.framework/Headers + cp SCPreferencesPath.h SystemConfiguration.framework/Headers + cp SCDynamicStoreKey.h SystemConfiguration.framework/Headers + cp SCPreferencesSetSpecific.h SystemConfiguration.framework/Headers + cp SCNetworkConfiguration.h SystemConfiguration.framework/Headers + cp SCNetworkConnection.h SystemConfiguration.framework/Headers + cp SCNetworkReachability.h SystemConfiguration.framework/Headers + cp DHCPClientPreferences.h SystemConfiguration.framework/Headers + cp SCNetwork.h SystemConfiguration.framework/Headers + cp SCDynamicStoreCopyDHCPInfo.h SystemConfiguration.framework/Headers + + # TODO: Do we want to preserve private headers or just make them public? + cp SCDPlugin.h SystemConfiguration.framework/PrivateHeaders + cp SCPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCDynamicStorePrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCDynamicStoreCopySpecificPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCDynamicStoreSetSpecificPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCValidation.h SystemConfiguration.framework/PrivateHeaders + cp SCPreferencesPrivate.h SystemConfiguration.framework/PrivateHeaders + cp DeviceOnHold.h SystemConfiguration.framework/PrivateHeaders + cp LinkConfiguration.h SystemConfiguration.framework/PrivateHeaders + cp SCPreferencesPathKey.h SystemConfiguration.framework/PrivateHeaders + cp SCPreferencesSetSpecificPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCNetworkConnectionPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCPreferencesGetSpecificPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCSchemaDefinitionsPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCNetworkConfigurationPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCPreferencesKeychainPrivate.h SystemConfiguration.framework/PrivateHeaders + cp SCNetworkSignature.h SystemConfiguration.framework/PrivateHeaders + cp SCNetworkSignaturePrivate.h SystemConfiguration.framework/PrivateHeaders + cp VPNPrivate.h SystemConfiguration.framework/PrivateHeaders + cp VPNConfiguration.h SystemConfiguration.framework/PrivateHeaders + cp VPNTunnelPrivate.h SystemConfiguration.framework/PrivateHeaders + cp VPNTunnel.h SystemConfiguration.framework/PrivateHeaders + + mkdir derived + + cat >derived/SystemConfiguration_vers.c </dev/null + ''; + + installPhase = '' + mkdir -p $out/include + cp dnsinfo/*.h $out/include/ + '' + lib.optionalString (!headersOnly) '' + mkdir -p $out/Library/Frameworks/ + mv SystemConfiguration.fproj/SystemConfiguration.framework $out/Library/Frameworks + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/copyfile/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/copyfile/default.nix new file mode 100644 index 0000000..5e7f38e --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/copyfile/default.nix @@ -0,0 +1,9 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + dontBuild = true; + installPhase = '' + mkdir -p $out/include/ + cp copyfile.h $out/include/ + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/default.nix new file mode 100644 index 0000000..1bd574f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/default.nix @@ -0,0 +1,331 @@ +{ lib, stdenv, fetchurl, fetchFromGitHub, pkgs }: + +let + # This attrset can in theory be computed automatically, but for that to work nicely we need + # import-from-derivation to work properly. Currently it's rather ugly when we try to bootstrap + # a stdenv out of something like this. With some care we can probably get rid of this, but for + # now it's staying here. + versions = { + "macos-14.3" = { + system_cmds = "970.0.4"; + }; + "osx-10.12.6" = { + xnu = "3789.70.16"; + libiconv = "50"; + Libnotify = "165.20.1"; + objc4 = "709.1"; + dyld = "433.5"; + CommonCrypto = "60092.50.5"; + copyfile = "138"; + ppp = "838.50.1"; + libclosure = "67"; + Libinfo = "503.50.4"; + Libsystem = "1238.60.2"; + removefile = "45"; + libmalloc = "116.50.8"; + libresolv = "64"; + libplatform = "126.50.8"; + mDNSResponder = "765.50.9"; + libutil = "47.30.1"; + libunwind = "35.3"; + Libc = "1158.50.2"; + dtrace = "209.50.12"; + libpthread = "218.60.3"; + hfs = "366.70.1"; + }; + "osx-10.11.6" = { + PowerManagement = "572.50.1"; + dtrace = "168"; + xnu = "3248.60.10"; + libpthread = "138.10.4"; + libiconv = "44"; + Libnotify = "150.40.1"; + objc4 = "680"; + eap8021x = "222.40.1"; + dyld = "360.22"; + architecture = "268"; + CommonCrypto = "60075.50.1"; + copyfile = "127"; + Csu = "85"; + ppp = "809.50.2"; + libclosure = "65"; + Libinfo = "477.50.4"; + Libsystem = "1226.10.1"; + removefile = "41"; + libresolv = "60"; + + # Their release page is a bit of a mess here, so I'm going to lie a bit and say this version + # is the right one, even though it isn't. The version I have here doesn't appear to be linked + # to any OS releases, but Apple also doesn't mention mDNSResponder from 10.11 to 10.11.6, and + # neither of those versions are publicly available. + libplatform = "125"; + mDNSResponder = "625.41.2"; + + # IOKit contains a set of packages with different versions, so we don't have a general version + IOKit = ""; + + libutil = "43"; + libunwind = "35.3"; + Librpcsvc = "26"; + developer_cmds= "62"; + network_cmds = "481.20.1"; + basic_cmds = "55"; + adv_cmds = "163"; + file_cmds = "264.1.1"; + shell_cmds = "187"; + system_cmds = "550.6"; + diskdev_cmds = "593"; + top = "108"; + text_cmds = "99"; + }; + "osx-10.11.5" = { + Libc = "1082.50.1"; # 10.11.6 still unreleased :/ + }; + "osx-10.10.5" = { + adv_cmds = "158"; + CF = "1153.18"; + ICU = "531.48"; + libdispatch = "442.1.4"; + Security = "57031.40.6"; + + IOAudioFamily = "203.3"; + IOFireWireFamily = "458"; + IOFWDVComponents = "207.4.1"; + IOFireWireAVC = "423"; + IOFireWireSBP2 = "427"; + IOFireWireSerialBusProtocolTransport = "251.0.1"; + IOGraphics = "485.40.1"; + IOHIDFamily = "606.40.1"; + IONetworkingFamily = "101"; + IOSerialFamily = "74.20.1"; + IOStorageFamily = "182.1.1"; + IOBDStorageFamily = "14"; + IOCDStorageFamily = "51"; + IODVDStorageFamily = "35"; + IOKitUser = "1050.20.2"; + }; + "osx-10.9.5" = { + launchd = "842.92.1"; + libauto = "185.5"; + Libc = "997.90.3"; # We use this, but not from here + Libsystem = "1197.1.1"; + Security = "55471.14.18"; + security_dotmac_tp = "55107.1"; + + IOStorageFamily = "172"; + }; + "osx-10.8.5" = { + configd = "453.19"; + Libc = "825.40.1"; + IOUSBFamily = "630.4.5"; + }; + "osx-10.8.4" = { + IOUSBFamily = "560.4.2"; + }; + "osx-10.7.4" = { + Libm = "2026"; + }; + "osx-10.6.2" = { + CarbonHeaders = "18.1"; + }; + "osx-10.5.8" = { + adv_cmds = "119"; + }; + "dev-tools-7.0" = { + bootstrap_cmds = "93"; + }; + "dev-tools-5.1" = { + bootstrap_cmds = "86"; + }; + "dev-tools-3.2.6" = { + bsdmake = "24"; + }; + }; + + fetchApple' = pname: version: sha256: let + # When cross-compiling, fetchurl depends on libiconv, resulting + # in an infinite recursion without this. It's not clear why this + # worked fine when not cross-compiling + fetch = if pname == "libiconv" + then stdenv.fetchurlBoot + else fetchurl; + in fetch { + url = "https://github.com/apple-oss-distributions/${pname}/archive/refs/tags/${pname}-${version}.tar.gz"; + inherit sha256; + }; + + fetchApple = sdkName: sha256: pname: let + version = versions.${sdkName}.${pname}; + in fetchApple' pname version sha256; + + appleDerivation'' = stdenv: pname: version: sdkName: sha256: attrs: stdenv.mkDerivation (finalAttrs: { + inherit pname version; + + src = if attrs ? srcs then null else (fetchApple' pname version sha256); + + enableParallelBuilding = true; + + # In rare cases, APPLE may drop some headers quietly on new release. + doInstallCheck = attrs ? appleHeaders; + passAsFile = [ "appleHeaders" ]; + installCheckPhase = '' + cd $out/include + + result=$(diff -u "$appleHeadersPath" <(find * -type f | sort) --label "Listed in appleHeaders" --label "Found in \$out/include" || true) + + if [ -z "$result" ]; then + echo "Apple header list is matched." + else + echo >&2 "\ + Apple header list is inconsistent, please ensure no header file is unexpectedly dropped. + $result + " + exit 1 + fi + ''; + + } // (if builtins.isFunction attrs then attrs finalAttrs else attrs) // { + meta = (with lib; { + platforms = platforms.darwin; + license = licenses.apple-psl20; + }) // (attrs.meta or {}); + }); + + IOKitSpecs = { + IOAudioFamily = fetchApple "osx-10.10.5" "sha256-frs2pm2OpGUOz68ZXsjktlyHlgn5oXM+ltbmAf//Cio="; + IOFireWireFamily = fetchApple "osx-10.10.5" "sha256-V9fNeo/Wj9dm1/XM4hkOInnMk01M6c9QSjJs5zJKB60="; + IOFWDVComponents = fetchApple "osx-10.10.5" "sha256-KenCX9C/Z2ErUK8tpKpm65gEmhn2NsXFxlzK7NKomaI="; + IOFireWireAVC = fetchApple "osx-10.10.5" "sha256-Gd8+PK/mk+xEXgF8dGAx+3jsXv4NX1GiBFyjyrf6sTo="; + IOFireWireSBP2 = fetchApple "osx-10.10.5" "sha256-Z3nP8pX1YG4Fbt7MrnqO06ihE9aYOex5Eib/rqOpoPk="; + IOFireWireSerialBusProtocolTransport = fetchApple "osx-10.10.5" "sha256-zdYE0UCKiVhDRGdWaH8L51ArbYTnsQOmcN/OMmpNdFA="; + IOGraphics = fetchApple "osx-10.10.5" "sha256-lXoW4sx3pyl5fg5Qde3sQi2i8rTLnpeCdDaTHjbfaMI="; + IOHIDFamily = fetchApple "osx-10.10.5" "sha256-b+S1p3p5d8olYE18VrBns4euerVINaQSFEp34sko5rM="; + IONetworkingFamily = fetchApple "osx-10.10.5" "sha256-NOpFOBKS6iwFj9DJxduZYZfZJuhDyBQw2QMKHbu7j40="; + IOSerialFamily = fetchApple "osx-10.10.5" "sha256-hpYrgXsuTul4CYoYIjQjerfvQRqISM2tCcfVXlnjbZo="; + IOStorageFamily = fetchApple "osx-10.9.5" "sha256-CeA4rHUrBKHsDeJU9ssIY9LQwDw09a+vQUyruosaLKA="; + IOBDStorageFamily = fetchApple "osx-10.10.5" "sha256-gD52RKXGKWGga/QGlutxsgsPNSN6gcRfFQRT8v51N3E="; + IOCDStorageFamily = fetchApple "osx-10.10.5" "sha256-+nyqH6lMPmIkDLYXNVSeR4vBYS165oyJx+DkCkKOGRg="; + IODVDStorageFamily = fetchApple "osx-10.10.5" "sha256-Jy3UuRzdd0bBdhJgI/f8vLXh2GdGs1RVN3G2iEs86kQ="; + # There should be an IOStreamFamily project here, but they haven't released it :( + IOUSBFamily = fetchApple "osx-10.8.5" "sha256-FwgGoP97Sj47VGXMxbY0oUugKf7jtxAL1RzL6+315cU="; # This is from 10.8 :( + IOUSBFamily_older = fetchApple "osx-10.8.4" "sha256-5apCsqtHK0EC8x1uPTTll43x69eal/nsokfS80qLlxs=" "IOUSBFamily"; # This is even older :( + IOKitUser = fetchApple "osx-10.10.5" "sha256-3UHM3g91v4RugmONbM+SAPr1SfoUPY3QPcTwTpt+zuY="; + # There should be an IOVideo here, but they haven't released it :( + }; + + IOKitSrcs = lib.mapAttrs (name: value: if lib.isFunction value then value name else value) IOKitSpecs; + +in + +# darwin package set +self: + +let + macosPackages_11_0_1 = import ./macos-11.0.1.nix { inherit applePackage'; }; + developerToolsPackages_11_3_1 = import ./developer-tools-11.3.1.nix { inherit applePackage'; }; + + applePackage' = namePath: version: sdkName: sha256: + let + pname = builtins.head (lib.splitString "/" namePath); + appleDerivation' = stdenv: appleDerivation'' stdenv pname version sdkName sha256; + appleDerivation = appleDerivation' stdenv; + callPackage = self.newScope { inherit appleDerivation' appleDerivation; }; + in callPackage (./. + "/${namePath}"); + + applePackage = namePath: sdkName: sha256: let + pname = builtins.head (lib.splitString "/" namePath); + version = versions.${sdkName}.${pname}; + in applePackage' namePath version sdkName sha256; + + # Only used for bootstrapping. It’s convenient because it was the last version to come with a real makefile. + adv_cmds-boot = applePackage "adv_cmds/boot.nix" "osx-10.5.8" "sha256-/OJLNpATyS31W5nWfJgSVO5itp8j55TRwG57/QLT5Fg=" {}; + +in + +developerToolsPackages_11_3_1 // macosPackages_11_0_1 // { + # TODO: shorten this list, we should cut down to a minimum set of bootstrap or necessary packages here. + + inherit (adv_cmds-boot) ps locale; + architecture = applePackage "architecture" "osx-10.11.6" "sha256-cUKeMx6mOAxBSRHIdfzsrR65Qv86m7+20XvpKqVfwVI=" {}; + bsdmake = applePackage "bsdmake" "dev-tools-3.2.6" "sha256-CW8zP5QZMhWTGp+rhrm8oHE/vSLsRlv1VRAGe1OUDmI=" {}; + CarbonHeaders = applePackage "CarbonHeaders" "osx-10.6.2" "sha256-UNaHvxzYzEBnYYuoMLqWUVprZa6Wqn/3XleoSCco050=" {}; + CommonCrypto = applePackage "CommonCrypto" "osx-10.12.6" "sha256-FLgODBrfv+XsGaAjddncYAm/BIJJYw6LcwX/z7ncKFM=" {}; + configd = applePackage "configd" "osx-10.8.5" "sha256-6I3FWNjTgds5abEcZrD++s9b+P9a2+qUf8KFAb72DwI=" { + Security = applePackage "Security/boot.nix" "osx-10.9.5" "sha256-7qr0IamjCXCobIJ6V9KtvbMBkJDfRCy4C5eqpHJlQLI=" {}; + inherit (pkgs.darwin.apple_sdk.libs) xpc; + }; + copyfile = applePackage "copyfile" "osx-10.12.6" "sha256-uHqLFOIpXK+n0RHyOZzVsP2DDZcFDivKCnqHBaXvHns=" {}; + Csu = applePackage "Csu" "osx-10.11.6" "sha256-h6a/sQMEVeFxKNWAPgKBXjWhyL2L2nvX9BQUMaTQ6sY=" {}; + dtrace = applePackage "dtrace" "osx-10.12.6" "sha256-Icr22ozixHquI0kRB2XZ+LlxD6V46sJHsHy4L/tDXZg=" {}; + dyld = applePackage "dyld" "osx-10.12.6" "sha256-JmKnOZtBPf96zEx7vhYHLBSTOPyKN71IdYE3R0IeJww=" {}; + eap8021x = applePackage "eap8021x" "osx-10.11.6" "sha256-54P3+YhVhOanoZQoqswDnr/GbR/AdEERse135nyuIQo=" {}; + IOKit = applePackage "IOKit" "osx-10.11.6" "" { inherit IOKitSrcs; }; + launchd = applePackage "launchd" "osx-10.9.5" "sha256-dmV0UK7hG9wvTr+F4Z47nCFXcVZCV+cQ46WbE0DBtJs=" {}; + libauto = applePackage "libauto" "osx-10.9.5" "sha256-GnRcKq8jRbEsI/PSDphwUjWtpEIEcnLlQL9yxYLgSsU=" {}; + Libc = applePackage "Libc" "osx-10.12.6" "sha256-LSsL7S3KFgGU9qjK4atu/4wBh8ftgfsk6JOvg+ZTZOY=" { + Libc_10-9 = fetchFromGitHub { + owner = "apple-oss-distributions"; + repo = "Libc"; + rev = "Libc-997.90.3"; + hash = "sha256-B18RNO+Rai5XE52TKdJV7eknosTZ+bRERkiU12d/kPU="; + }; + }; + libclosure = applePackage "libclosure" "osx-10.11.6" "sha256-L5rQ+UBpf3B+W1U+gZKk7fXulslHsc8lxnCsplV+nr0=" {}; + libdispatch = applePackage "libdispatch" "osx-10.10.5" "sha256-jfAEk0OLrJa9AIZVikIoHomd+l+4rCfc320Xh50qK5M=" {}; + libiconv = applePackage "libiconv" "osx-10.12.6" "sha256-ZzPFkchK3EU95UQUVVrR0t8iilhi/VnIkjjtP6KT2oI=" {}; + Libinfo = applePackage "Libinfo" "osx-10.11.6" "sha256-6F7wiwerv4nz/xXHtp1qCHSaFzZgzcRN+jbmXA5oWOQ=" {}; + Libm = applePackage "Libm" "osx-10.7.4" "sha256-KjMETfT4qJm0m0Ux/F6Rq8bI4Q4UVnFx6IKbKxXd+Es=" {}; + Libnotify = applePackage "Libnotify" "osx-10.12.6" "sha256-6wvMBxAUfiYcQtmlfYCj1d3kFmFM/jdboTd7hRvi3e4=" {}; + libmalloc = if stdenv.isx86_64 then + applePackage "libmalloc" "osx-10.12.6" "sha256-brfG4GEF2yZipKdhlPq6DhT2z5hKYSb2MAmffaikdO4=" {} + else macosPackages_11_0_1.libmalloc; + libplatform = if stdenv.isx86_64 then + applePackage "libplatform" "osx-10.12.6" "sha256-6McMTjw55xtnCsFI3AB1osRagnuB5pSTqeMKD3gpGtM=" {} + else macosPackages_11_0_1.libplatform; + libpthread = applePackage "libpthread" "osx-10.12.6" "sha256-QvJ9PERmrCWBiDmOWrLvQUKZ4JxHuh8gS5nlZKDLqE8=" {}; + libresolv = applePackage "libresolv" "osx-10.12.6" "sha256-FtvwjJKSFX6j9APYPC8WLXVOjbHLZa1Gcoc8yxLy8qE=" {}; + Libsystem = applePackage "Libsystem" "osx-10.12.6" "sha256-zvRdCP//TjKCGAqm/5nJXPppshU1cv2fg/L/yK/olGQ=" {}; + libutil = applePackage "libutil" "osx-10.12.6" "sha256-4PFuk+CTLwvd/Ll9GLBkiIM0Sh/CVaiKwh5m1noheRs=" {}; + libunwind = applePackage "libunwind" "osx-10.12.6" "sha256-CC0sndP/mKYe3dZu3v7fjuDASV4V4w7dAcnWMvpoquE=" {}; + mDNSResponder = applePackage "mDNSResponder" "osx-10.12.6" "sha256-ddZr6tropkpdMJhq/kUlm3OwO8b0yxtkrMpwec8R4FY=" {}; + objc4 = applePackage "objc4" "osx-10.12.6" "sha256-ZsxRpdsfv3Dxs7yBBCkjbKXKR6aXwkEpxc1XYXz7ueM=" {}; + ppp = applePackage "ppp" "osx-10.12.6" "sha256-M1zoEjjeKIDUEP6ACbpUJk3OXjobw4g/qzUmxGdX1J0=" {}; + removefile = applePackage "removefile" "osx-10.12.6" "sha256-UpNk27kGXnZss1ZXWVJU9jLz/NW63ZAZEDLhyCYoi9M=" {}; + xnu = if stdenv.isx86_64 then + applePackage "xnu" "osx-10.12.6" "sha256-C8TPQlUT3RbzAy8YnZPNtr70hpaVG9Llv0h42s3NENI=" { + python3 = pkgs.buildPackages.buildPackages.python3; # TODO(@Ericson2314) this shouldn't be needed. + } + else macosPackages_11_0_1.xnu; + hfs = applePackage "hfs" "osx-10.12.6" "sha256-eGi18HQFJrU5UHoBOE0LqO5gQ0xOf8+OJuAWQljfKE4=" {}; + Librpcsvc = applePackage "Librpcsvc" "osx-10.11.6" "sha256-YHbGws901xONzAbo6sB5zSea4Wp0sgYUJ8YgwVfWxnE=" {}; + adv_cmds = applePackage "adv_cmds" "osx-10.11.6" "sha256-Ztp8ALWcviEpthoiY8ttWzGI8OcsLzsULjlqe8GIzw8=" {}; + basic_cmds = applePackage "basic_cmds" "osx-10.11.6" "sha256-BYPPTg4/7x6RPs0WwwQlkNiZxxArV+7EVe6bM+a/I6Q=" {}; + developer_cmds = applePackage "developer_cmds" "osx-10.11.6" "sha256-h0wMVlS6QdRvKOVJ74W9ziHYGApjvnk77AIR6ukYBRo=" {}; + diskdev_cmds = applePackage "diskdev_cmds" "osx-10.11.6" "sha256-VX+hcZ7JhOA8EhwLloPlM3Yx79RXp9OYHV9Mi10uw3Q=" { + macosPackages_11_0_1 = macosPackages_11_0_1; + }; + network_cmds = if stdenv.isx86_64 then + applePackage "network_cmds" "osx-10.11.6" "sha256-I89CLIswGheewOjiNZwQTgWvWbhm0qtB5+KUqzxnQ5M=" {} + else macosPackages_11_0_1.network_cmds; + file_cmds = applePackage "file_cmds" "osx-10.11.6" "sha256-JYy6HwmultKeZtLfaysbsyLoWg+OaTh7eJu54JkJC0Q=" {}; + shell_cmds = applePackage "shell_cmds" "osx-10.11.6" "sha256-kmEOprkiJGMVcl7yHkGX8ymk/5KjE99gWuF8j2hK5hY=" {}; + system_cmds = applePackage "system_cmds" "macos-14.3" "sha256-qFp9nkzsq9uQ7zoyfvO+3gvDlc7kaPvn6luvmO/Io30=" {}; + text_cmds = applePackage "text_cmds" "osx-10.11.6" "sha256-KSebU7ZyUsPeqn51nzuGNaNxs9pvmlIQQdkWXIVzDxw=" {}; + top = applePackage "top" "osx-10.11.6" "sha256-jbz64ODogtpNyLpXGSZj1jCBdFPVXcVcBkL1vc7g5qQ=" {}; + PowerManagement = applePackage "PowerManagement" "osx-10.11.6" "sha256-bYGtYnBOcE5W03AZzfVTJXPZ6GgryGAMt/LgLPxFkVk=" {}; + + # `configdHeaders` can’t use an override because `pkgs.darwin.configd` on aarch64-darwin will + # be replaced by SystemConfiguration.framework from the macOS SDK. + configdHeaders = applePackage "configd" "osx-10.8.5" "sha256-6I3FWNjTgds5abEcZrD++s9b+P9a2+qUf8KFAb72DwI=" { + headersOnly = true; + Security = null; + xpc = null; + }; + libutilHeaders = pkgs.darwin.libutil.override { headersOnly = true; }; + hfsHeaders = pkgs.darwin.hfs.override { headersOnly = true; }; + libresolvHeaders= pkgs.darwin.libresolv.override { headersOnly = true; }; + + # TODO(matthewbauer): + # To be removed, once I figure out how to build a newer Security version. + Security = applePackage "Security/boot.nix" "osx-10.9.5" "sha256-7qr0IamjCXCobIJ6V9KtvbMBkJDfRCy4C5eqpHJlQLI=" {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/developer-tools-11.3.1.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer-tools-11.3.1.nix new file mode 100644 index 0000000..7eeafec --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer-tools-11.3.1.nix @@ -0,0 +1,8 @@ +# Generated using: ./generate-sdk-packages.sh developer-tools 11.3.1 + +{ applePackage' }: + +{ +bootstrap_cmds = applePackage' "bootstrap_cmds" "116" "developer-tools-11.3.1" "06nw99ajkd264vdi6n2zv252ppxp3wx3120hqf3jqdh6c1wavy0b" {}; +developer_cmds = applePackage' "developer_cmds" "66" "developer-tools-11.3.1" "0f7vphpscjcypq49gjckbs20xhm7yjalr4nnbphqcqp8v1al56dc" {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/default.nix new file mode 100644 index 0000000..23a5ae0 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/default.nix @@ -0,0 +1,41 @@ +{ lib, appleDerivation, xcbuildHook, llvmPackages, makeWrapper }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook makeWrapper ]; + + patches = [ + # The following copied from + # https://github.com/Homebrew/homebrew-core/commit/712ed3e948868e17f96b7e59972b5f45d4faf688 + # is needed to build libvirt. + ./rpcgen-support-hyper-and-quad-types.patch + ]; + + postPatch = '' + makeWrapper ${llvmPackages.clang}/bin/clang $out/bin/clang-cpp --add-flags "--driver-mode=cpp" + substituteInPlace rpcgen/rpc_main.c \ + --replace "/usr/bin/cpp" "$out/bin/clang-cpp" + ''; + + # Workaround build failure on -fno-common toolchains: + # duplicate symbol '_btype_2' in:args.o pr_comment.o + env.NIX_CFLAGS_COMPILE = "-fcommon"; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + + for n in 1; do + mkdir -p $out/share/man/man$n + install */*.$n $out/share/man/man$n + done + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/rpcgen-support-hyper-and-quad-types.patch b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/rpcgen-support-hyper-and-quad-types.patch new file mode 100644 index 0000000..481cf0f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/developer_cmds/rpcgen-support-hyper-and-quad-types.patch @@ -0,0 +1,66 @@ +diff --git a/rpcgen/rpc_parse.c b/rpcgen/rpc_parse.c +index 52edc9f..db0c1f1 100644 +--- a/rpcgen/rpc_parse.c ++++ b/rpcgen/rpc_parse.c +@@ -580,6 +580,10 @@ get_type(prefixp, typep, dkind) + *typep = "long"; + (void) peekscan(TOK_INT, &tok); + break; ++ case TOK_HYPER: ++ *typep = "int64_t"; ++ (void) peekscan(TOK_INT, &tok); ++ break; + case TOK_VOID: + if (dkind != DEF_UNION && dkind != DEF_PROGRAM) { + error("voids allowed only inside union and program definitions with one argument"); +@@ -592,6 +596,7 @@ get_type(prefixp, typep, dkind) + case TOK_INT: + case TOK_FLOAT: + case TOK_DOUBLE: ++ case TOK_QUAD: + case TOK_BOOL: + *typep = tok.str; + break; +@@ -622,6 +627,11 @@ unsigned_dec(typep) + *typep = "u_long"; + (void) peekscan(TOK_INT, &tok); + break; ++ case TOK_HYPER: ++ get_token(&tok); ++ *typep = "u_int64_t"; ++ (void) peekscan(TOK_INT, &tok); ++ break; + case TOK_INT: + get_token(&tok); + *typep = "u_int"; +diff --git a/rpcgen/rpc_scan.c b/rpcgen/rpc_scan.c +index a8df441..4130107 100644 +--- a/rpcgen/rpc_scan.c ++++ b/rpcgen/rpc_scan.c +@@ -419,8 +419,10 @@ static token symbols[] = { + {TOK_UNSIGNED, "unsigned"}, + {TOK_SHORT, "short"}, + {TOK_LONG, "long"}, ++ {TOK_HYPER, "hyper"}, + {TOK_FLOAT, "float"}, + {TOK_DOUBLE, "double"}, ++ {TOK_QUAD, "quadruple"}, + {TOK_STRING, "string"}, + {TOK_PROGRAM, "program"}, + {TOK_VERSION, "version"}, +diff --git a/rpcgen/rpc_scan.h b/rpcgen/rpc_scan.h +index bac2be4..e4c57c8 100644 +--- a/rpcgen/rpc_scan.h ++++ b/rpcgen/rpc_scan.h +@@ -66,9 +66,11 @@ enum tok_kind { + TOK_INT, + TOK_SHORT, + TOK_LONG, ++ TOK_HYPER, + TOK_UNSIGNED, + TOK_FLOAT, + TOK_DOUBLE, ++ TOK_QUAD, + TOK_OPAQUE, + TOK_CHAR, + TOK_STRING, \ No newline at end of file diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/default.nix new file mode 100644 index 0000000..e4431c6 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/default.nix @@ -0,0 +1,46 @@ +{ lib, appleDerivation, xcbuildHook, Libc, stdenv, macosPackages_11_0_1, xnu +, fetchurl, libutil }: + +let + xnu-src = if stdenv.isAarch64 then macosPackages_11_0_1.xnu.src else xnu.src; + arch = if stdenv.isAarch64 then "arm" else "i386"; +in appleDerivation { + patches = [ + # Fixes a build failure with newer versions of clang that make implicit int an error. + ./fix-implicit-int.patch + ]; + + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ libutil ]; + + env.NIX_CFLAGS_COMPILE = "-I."; + NIX_LDFLAGS = "-lutil"; + prePatch = '' + # ugly hacks for missing headers + # most are bsd related - probably should make this a drv + unpackFile ${Libc.src} + unpackFile ${xnu-src} + mkdir System sys machine ${arch} + cp xnu-*/bsd/sys/disklabel.h sys + cp xnu-*/bsd/machine/disklabel.h machine + cp xnu-*/bsd/${arch}/disklabel.h ${arch} + cp -r xnu-*/bsd/sys System + cp -r Libc-*/uuid System + substituteInPlace diskdev_cmds.xcodeproj/project.pbxproj \ + --replace 'DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";' "" + ''; + installPhase = '' + install -D Products/Release/libdisk.a $out/lib/libdisk.a + rm Products/Release/libdisk.a + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/fix-implicit-int.patch b/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/fix-implicit-int.patch new file mode 100644 index 0000000..df0fff9 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/diskdev_cmds/fix-implicit-int.patch @@ -0,0 +1,11 @@ +diff -ur a/diskdev_cmds.xcodeproj/project.pbxproj b/diskdev_cmds.xcodeproj/project.pbxproj +--- a/quota.tproj/quota.c 2021-10-06 01:13:40.000000000 -0400 ++++ b/quota.tproj/quota.c 2023-10-27 08:24:05.960965958 -0400 +@@ -115,6 +115,7 @@ + + int + main(argc, argv) ++ int argc; + char *argv[]; + { + int ngroups; diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/dtrace/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/dtrace/default.nix new file mode 100644 index 0000000..afff789 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/dtrace/default.nix @@ -0,0 +1,57 @@ +{ appleDerivation, xcbuildHook, CoreSymbolication, apple_sdk +, xnu, bison, flex, stdenv, fixDarwinDylibNames }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook flex bison fixDarwinDylibNames ]; + buildInputs = [ CoreSymbolication apple_sdk.frameworks.CoreSymbolication xnu ]; + # -fcommon: workaround build failure on -fno-common toolchains: + # duplicate symbol '_kCSRegionMachHeaderName' in: libproc.o dt_module_apple.o + env.NIX_CFLAGS_COMPILE = "-DCTF_OLD_VERSIONS -DPRIVATE -DYYDEBUG=1 -I${xnu}/Library/Frameworks/System.framework/Headers -Wno-error=implicit-function-declaration -fcommon"; + NIX_LDFLAGS = "-L./Products/Release"; + xcbuildFlags = [ "-target" "dtrace_frameworks" "-target" "dtrace" ]; + + doCheck = false; + checkPhase = "xcodebuild -target dtrace_tests"; + + postPatch = '' + substituteInPlace dtrace.xcodeproj/project.pbxproj \ + --replace "/usr/sbin" "" + substituteInPlace libdtrace/dt_open.c \ + --replace /usr/bin/clang ${stdenv.cc.cc}/bin/clang \ + --replace /usr/bin/ld ${stdenv.cc.bintools.bintools}/bin/ld \ + --replace /usr/lib/dtrace/dt_cpp.h $out/include/dt_cpp.h \ + --replace /usr/lib/dtrace $out/lib/dtrace + substituteInPlace libproc/libproc.c \ + --replace "#include " "" + ''; + + # hack to handle xcbuild's broken lex handling + preBuild = '' + pushd libdtrace + yacc -d dt_grammar.y + flex -l -d dt_lex.l + popd + + substituteInPlace dtrace.xcodeproj/project.pbxproj \ + --replace '6EBC9800099BFBBF0001019C /* dt_grammar.y */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.yacc; name = dt_grammar.y; path = libdtrace/dt_grammar.y; sourceTree = ""; };' '6EBC9800099BFBBF0001019C /* y.tab.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = y.tab.c; path = libdtrace/y.tab.c; sourceTree = ""; };' \ + --replace '6EBC9808099BFBBF0001019C /* dt_lex.l */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.lex; name = dt_lex.l; path = libdtrace/dt_lex.l; sourceTree = ""; };' '6EBC9808099BFBBF0001019C /* lex.yy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lex.yy.c; path = libdtrace/lex.yy.c; sourceTree = ""; };' + ''; + + # xcbuild doesn't support install + installPhase = '' + mkdir -p $out + + cp -r Products/Release/usr/include $out/include + cp scripts/dt_cpp.h $out/include/dt_cpp.h + + mkdir $out/lib + cp Products/Release/*.dylib $out/lib + + mkdir $out/bin + cp Products/Release/dtrace $out/bin + + mkdir -p $out/lib/dtrace + + install_name_tool -change $PWD/Products/Release/libdtrace.dylib $out/lib/libdtrace.dylib $out/bin/dtrace + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/dyld/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/dyld/default.nix new file mode 100644 index 0000000..e91d703 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/dyld/default.nix @@ -0,0 +1,16 @@ +{ lib, appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/lib $out/include + ln -s /usr/lib/dyld $out/lib/dyld + cp -r include $out/ + ''; + + meta = with lib; { + description = "Impure primitive symlinks to the Mac OS native dyld, along with headers"; + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/eap8021x/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/eap8021x/default.nix new file mode 100644 index 0000000..f5c47f0 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/eap8021x/default.nix @@ -0,0 +1,10 @@ +{ appleDerivation', stdenv }: + +appleDerivation' stdenv { + dontBuild = true; + installPhase = '' + mkdir -p $out/Library/Frameworks/EAP8021X.framework/Headers + + cp EAP8021X.fproj/EAPClientProperties.h $out/Library/Frameworks/EAP8021X.framework/Headers + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/file_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/file_cmds/default.nix new file mode 100644 index 0000000..8d44cc8 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/file_cmds/default.nix @@ -0,0 +1,42 @@ +{ lib, appleDerivation, xcbuildHook, zlib, bzip2, xz, ncurses, libutil, Libinfo }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ zlib bzip2 xz ncurses libutil Libinfo ]; + + # some commands not working: + # mtree: _simple.h not found + # ipcs: sys/ipcs.h not found + # so remove their targets from the project + patchPhase = '' + substituteInPlace file_cmds.xcodeproj/project.pbxproj \ + --replace "FC8A8CAA14B655FD001B97AD /* PBXTargetDependency */," "" \ + --replace "FC8A8C9C14B655FD001B97AD /* PBXTargetDependency */," "" \ + --replace "productName = file_cmds;" "" \ + --replace '/usr/lib/libcurses.dylib' 'libncurses.dylib' + sed -i -re "s/name = ([a-zA-Z]+);/name = \1; productName = \1;/" file_cmds.xcodeproj/project.pbxproj + ''; + + # Workaround build failure on -fno-common toolchains: + # duplicate symbol '_chdname' in: ar_io.o tty_subs.o + env.NIX_CFLAGS_COMPILE = "-fcommon"; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + + for n in 1; do + mkdir -p $out/share/man/man$n + install */*.$n $out/share/man/man$n + done + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/generate-sdk-packages.sh b/pkgs/by-name/da/darwin/packages/apple-source-releases/generate-sdk-packages.sh new file mode 100755 index 0000000..418a1d6 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/generate-sdk-packages.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p curl jq + +usage() { + cat <$outfile echo "# Generated using: ./$(basename "$0") $1 $2 + +{ applePackage' }: + +{" + +parse_line() { + readarray -t -d$'-' package < <(printf "%s" $2) + local pname=${package[0]} version=${package[1]} + + if [ -d $pname ]; then + sha256=$(nix-prefetch-url "https://github.com/apple-oss-distributions/$pname/archive/refs/tags/$pname-$version.tar.gz") + >>$outfile echo "$pname = applePackage' \"$pname\" \"$version\" \"$sdkName\" \"$sha256\" {};" + fi +} +readarray -s1 -c1 -C parse_line < <(curl -sSL "https://github.com/apple-oss-distributions/distribution-${1//-/_}/raw/${sdkName//./}/release.json" | jq -r ".projects[].tag") + +>>$outfile echo '}' diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/hfs/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/hfs/default.nix new file mode 100644 index 0000000..093e852 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/hfs/default.nix @@ -0,0 +1,47 @@ +{ appleDerivation', stdenv, stdenvNoCC, lib, headersOnly ? true }: + +appleDerivation' (if headersOnly then stdenvNoCC else stdenv) { + installPhase = lib.optionalString headersOnly '' + mkdir -p $out/include/hfs + cp core/*.h $out/include/hfs + ''; + + appleHeaders = '' + hfs/BTreeScanner.h + hfs/BTreesInternal.h + hfs/BTreesPrivate.h + hfs/CatalogPrivate.h + hfs/FileMgrInternal.h + hfs/HFSUnicodeWrappers.h + hfs/UCStringCompareData.h + hfs/hfs.h + hfs/hfs_alloc_trace.h + hfs/hfs_attrlist.h + hfs/hfs_btreeio.h + hfs/hfs_catalog.h + hfs/hfs_cnode.h + hfs/hfs_cprotect.h + hfs/hfs_dbg.h + hfs/hfs_endian.h + hfs/hfs_extents.h + hfs/hfs_format.h + hfs/hfs_fsctl.h + hfs/hfs_hotfiles.h + hfs/hfs_iokit.h + hfs/hfs_journal.h + hfs/hfs_kdebug.h + hfs/hfs_key_roll.h + hfs/hfs_macos_defs.h + hfs/hfs_mount.h + hfs/hfs_quota.h + hfs/hfs_unistr.h + hfs/kext-config.h + hfs/rangelist.h + ''; + + meta = { + # Seems nobody wants its binary, so we didn't implement building. + broken = !headersOnly; + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/launchd/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/launchd/default.nix new file mode 100644 index 0000000..67e051d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/launchd/default.nix @@ -0,0 +1,26 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + # No clue why the same file has two different names. Ask Apple! + installPhase = '' + mkdir -p $out/include/ $out/include/servers + cp liblaunch/*.h $out/include + + cp liblaunch/bootstrap.h $out/include/servers + cp liblaunch/bootstrap.h $out/include/servers/bootstrap_defs.h + ''; + + appleHeaders = '' + bootstrap.h + bootstrap_priv.h + launch.h + launch_internal.h + launch_priv.h + reboot2.h + servers/bootstrap.h + servers/bootstrap_defs.h + vproc.h + vproc_internal.h + vproc_priv.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/auto_dtrace.h b/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/auto_dtrace.h new file mode 100644 index 0000000..bf367a3 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/auto_dtrace.h @@ -0,0 +1,129 @@ +/* + * Generated by dtrace(1M). + */ + +#ifndef _AUTO_DTRACE_H +#define _AUTO_DTRACE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define GARBAGE_COLLECTION_STABILITY "___dtrace_stability$garbage_collection$v1$1_1_0_1_1_0_1_1_0_1_1_0_1_1_0" + +#define GARBAGE_COLLECTION_TYPEDEFS "___dtrace_typedefs$garbage_collection$v2$6175746f5f636f6c6c656374696f6e5f70686173655f74$6175746f5f636f6c6c656374696f6e5f747970655f74$6d616c6c6f635f7a6f6e655f74" + +#if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED + +#define GARBAGE_COLLECTION_AUTO_BLOCK_LOST_THREAD_LOCALITY(arg0, arg1) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$auto_block_lost_thread_locality$v1$766f6964202a$75696e7436345f74(arg0, arg1); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_AUTO_BLOCK_LOST_THREAD_LOCALITY_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$auto_block_lost_thread_locality$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define GARBAGE_COLLECTION_AUTO_REFCOUNT_ONE_ALLOCATION(arg0) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$auto_refcount_one_allocation$v1$75696e7436345f74(arg0); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_AUTO_REFCOUNT_ONE_ALLOCATION_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$auto_refcount_one_allocation$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define GARBAGE_COLLECTION_COLLECTION_BEGIN(arg0, arg1) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$collection_begin$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f747970655f74(arg0, arg1); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_COLLECTION_BEGIN_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$collection_begin$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define GARBAGE_COLLECTION_COLLECTION_END(arg0, arg1, arg2, arg3, arg4) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$collection_end$v1$6d616c6c6f635f7a6f6e655f74202a$75696e7436345f74$75696e7436345f74$75696e7436345f74$75696e7436345f74(arg0, arg1, arg2, arg3, arg4); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_COLLECTION_END_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$collection_end$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_BEGIN(arg0, arg1) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$collection_phase_begin$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f70686173655f74(arg0, arg1); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_BEGIN_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$collection_phase_begin$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_END(arg0, arg1, arg2, arg3) \ +do { \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_TYPEDEFS); \ + __dtrace_probe$garbage_collection$collection_phase_end$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f70686173655f74$75696e7436345f74$75696e7436345f74(arg0, arg1, arg2, arg3); \ + __asm__ volatile(".reference " GARBAGE_COLLECTION_STABILITY); \ +} while (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_END_ENABLED() \ + ({ int _r = __dtrace_isenabled$garbage_collection$collection_phase_end$v1(); \ + __asm__ volatile(""); \ + _r; }) + + +extern void __dtrace_probe$garbage_collection$auto_block_lost_thread_locality$v1$766f6964202a$75696e7436345f74(const void *, uint64_t); +extern int __dtrace_isenabled$garbage_collection$auto_block_lost_thread_locality$v1(void); +extern void __dtrace_probe$garbage_collection$auto_refcount_one_allocation$v1$75696e7436345f74(uint64_t); +extern int __dtrace_isenabled$garbage_collection$auto_refcount_one_allocation$v1(void); +extern void __dtrace_probe$garbage_collection$collection_begin$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f747970655f74(const malloc_zone_t *, auto_collection_type_t); +extern int __dtrace_isenabled$garbage_collection$collection_begin$v1(void); +extern void __dtrace_probe$garbage_collection$collection_end$v1$6d616c6c6f635f7a6f6e655f74202a$75696e7436345f74$75696e7436345f74$75696e7436345f74$75696e7436345f74(const malloc_zone_t *, uint64_t, uint64_t, uint64_t, uint64_t); +extern int __dtrace_isenabled$garbage_collection$collection_end$v1(void); +extern void __dtrace_probe$garbage_collection$collection_phase_begin$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f70686173655f74(const malloc_zone_t *, auto_collection_phase_t); +extern int __dtrace_isenabled$garbage_collection$collection_phase_begin$v1(void); +extern void __dtrace_probe$garbage_collection$collection_phase_end$v1$6d616c6c6f635f7a6f6e655f74202a$6175746f5f636f6c6c656374696f6e5f70686173655f74$75696e7436345f74$75696e7436345f74(const malloc_zone_t *, auto_collection_phase_t, uint64_t, uint64_t); +extern int __dtrace_isenabled$garbage_collection$collection_phase_end$v1(void); + +#else + +#define GARBAGE_COLLECTION_AUTO_BLOCK_LOST_THREAD_LOCALITY(arg0, arg1) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_AUTO_BLOCK_LOST_THREAD_LOCALITY_ENABLED() (0) +#define GARBAGE_COLLECTION_AUTO_REFCOUNT_ONE_ALLOCATION(arg0) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_AUTO_REFCOUNT_ONE_ALLOCATION_ENABLED() (0) +#define GARBAGE_COLLECTION_COLLECTION_BEGIN(arg0, arg1) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_COLLECTION_BEGIN_ENABLED() (0) +#define GARBAGE_COLLECTION_COLLECTION_END(arg0, arg1, arg2, arg3, arg4) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_COLLECTION_END_ENABLED() (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_BEGIN(arg0, arg1) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_BEGIN_ENABLED() (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_END(arg0, arg1, arg2, arg3) \ +do { \ + } while (0) +#define GARBAGE_COLLECTION_COLLECTION_PHASE_END_ENABLED() (0) + +#endif /* !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _AUTO_DTRACE_H */ diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/default.nix new file mode 100644 index 0000000..8a551dc --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libauto/default.nix @@ -0,0 +1,86 @@ +{ lib, stdenv, appleDerivation, libdispatch, Libsystem }: + +appleDerivation { + # these are included in the pure libc + buildInputs = lib.optionals stdenv.cc.nativeLibc [ libdispatch Libsystem ]; + + buildPhase = '' + cp ${./auto_dtrace.h} ./auto_dtrace.h + + substituteInPlace ThreadLocalCollector.h --replace SubZone.h Subzone.h + + substituteInPlace auto_zone.cpp \ + --replace "#include " ''$'#include \nstatic void msgtracer_log_with_keys(...) { };' + + substituteInPlace Definitions.h \ + --replace "#include " "" \ + --replace 'void * const, void * const' 'void * const, void *' + + # getspecific_direct is more efficient, but this should be equivalent... + substituteInPlace Zone.h \ + --replace "_pthread_getspecific_direct" "pthread_getspecific" \ + --replace "_pthread_has_direct_tsd()" "0" \ + --replace "__PTK_FRAMEWORK_GC_KEY0" "110" \ + --replace "__PTK_FRAMEWORK_GC_KEY1" "111" \ + --replace "__PTK_FRAMEWORK_GC_KEY2" "112" \ + --replace "__PTK_FRAMEWORK_GC_KEY3" "113" \ + --replace "__PTK_FRAMEWORK_GC_KEY4" "114" \ + --replace "__PTK_FRAMEWORK_GC_KEY5" "115" \ + --replace "__PTK_FRAMEWORK_GC_KEY6" "116" \ + --replace "__PTK_FRAMEWORK_GC_KEY7" "117" \ + --replace "__PTK_FRAMEWORK_GC_KEY8" "118" \ + --replace "__PTK_FRAMEWORK_GC_KEY9" "119" + + substituteInPlace auto_zone.cpp \ + --replace "__PTK_FRAMEWORK_GC_KEY9" "119" \ + --replace "__PTK_FRAMEWORK_GC_KEY0" "110" \ + + substituteInPlace Zone.cpp \ + --replace "_pthread_getspecific_direct" "pthread_getspecific" \ + --replace "__PTK_FRAMEWORK_GC_KEY9" "119" \ + --replace "__PTK_FRAMEWORK_GC_KEY0" "110" \ + --replace "__PTK_LIBDISPATCH_KEY0" "20" \ + --replace "struct auto_zone_cursor {" ''$'extern "C" int pthread_key_init_np(int, void (*)(void *));\nstruct auto_zone_cursor {' + + substituteInPlace auto_impl_utilities.c \ + --replace "# include " "void CRSetCrashLogMessage(void *msg) { };" + + c++ -I. -O3 -c -Wno-c++11-extensions auto_zone.cpp + cc -I. -O3 -Iauto_tester -c auto_impl_utilities.c + c++ -I. -O3 -c auto_weak.cpp + c++ -I. -O3 -c Admin.cpp + c++ -I. -O3 -c Bitmap.cpp + c++ -I. -O3 -c Definitions.cpp + c++ -I. -O3 -c Environment.cpp + c++ -I. -O3 -c Large.cpp + c++ -I. -O3 -c Region.cpp + c++ -I. -O3 -c Subzone.cpp + c++ -I. -O3 -c WriteBarrier.cpp + c++ -I. -O3 -c Zone.cpp + c++ -I. -O3 -c Thread.cpp + c++ -I. -O3 -c InUseEnumerator.cpp + c++ -I. -O3 -c auto_gdb_interface.cpp + c++ -I. -O3 -c PointerHash.cpp + c++ -I. -O3 -c ThreadLocalCollector.cpp + c++ -I. -O3 -c ZoneDump.cpp + c++ -I. -O3 -c ZoneCollectors.cpp + c++ -I. -O3 -c SubzonePartition.cpp + c++ -I. -O3 -c ZoneCollectionChecking.cpp + c++ -I. -O3 -c ZoneCompaction.cpp + c++ -I. -O3 -c BlockRef.cpp + + c++ -Wl,-no_dtrace_dof --stdlib=libc++ -dynamiclib -install_name $out/lib/libauto.dylib -o libauto.dylib *.o + ''; + + installPhase = '' + mkdir -p $out/lib $out/include + cp auto_zone.h auto_weak.h auto_tester/auto_tester.h auto_gdb_interface.h $out/include + cp libauto.dylib $out/lib + ''; + + meta = { + # libauto is only used by objc4/pure.nix , but objc4 is now using the impure approach, so we don't bother to fix this. + broken = true; + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libclosure/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libclosure/default.nix new file mode 100644 index 0000000..976658b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libclosure/default.nix @@ -0,0 +1,13 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/include + cp *.h $out/include/ + ''; + + appleHeaders = '' + Block.h + Block_private.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libdispatch/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libdispatch/default.nix new file mode 100644 index 0000000..176cb86 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libdispatch/default.nix @@ -0,0 +1,54 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + dontConfigure = true; + dontBuild = true; + installPhase = '' + mkdir -p $out/include/dispatch $out/include/os + + # Move these headers so CF can find + mv private/voucher*.h $out/include/os + cp -r private/*.h $out/include/dispatch + + cp -r dispatch/*.h $out/include/dispatch + cp -r os/object*.h $out/include/os + + # gcc compatibility. Source: https://stackoverflow.com/a/28014302/3714556 + substituteInPlace $out/include/dispatch/object.h \ + --replace 'typedef void (^dispatch_block_t)(void);' \ + '#ifdef __clang__ + typedef void (^dispatch_block_t)(void); + #else + typedef void* dispatch_block_t; + #endif' + ''; + + appleHeaders = '' + dispatch/base.h + dispatch/benchmark.h + dispatch/block.h + dispatch/data.h + dispatch/data_private.h + dispatch/dispatch.h + dispatch/group.h + dispatch/introspection.h + dispatch/introspection_private.h + dispatch/io.h + dispatch/io_private.h + dispatch/layout_private.h + dispatch/mach_private.h + dispatch/object.h + dispatch/once.h + dispatch/private.h + dispatch/queue.h + dispatch/queue_private.h + dispatch/semaphore.h + dispatch/source.h + dispatch/source_private.h + dispatch/time.h + os/object.h + os/object_private.h + os/voucher_activity_private.h + os/voucher_private.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libiconv/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libiconv/default.nix new file mode 100644 index 0000000..6a3bddc --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libiconv/default.nix @@ -0,0 +1,38 @@ +{ stdenv, appleDerivation, lib +, enableStatic ? stdenv.hostPlatform.isStatic +, enableShared ? !stdenv.hostPlatform.isStatic +}: + +appleDerivation { + postUnpack = "sourceRoot=$sourceRoot/libiconv"; + + preConfigure = lib.optionalString stdenv.hostPlatform.isiOS '' + sed -i 's/darwin\*/ios\*/g' configure libcharset/configure + ''; + + configureFlags = [ + (lib.enableFeature enableStatic "static") + (lib.enableFeature enableShared "shared") + ]; + + postInstall = lib.optionalString enableShared '' + mv $out/lib/libiconv.dylib $out/lib/libiconv-nocharset.dylib + ${stdenv.cc.bintools.targetPrefix}install_name_tool -id $out/lib/libiconv-nocharset.dylib $out/lib/libiconv-nocharset.dylib + + # re-export one useless symbol; ld will reject a dylib that only reexports other dylibs + echo 'void dont_use_this(){}' | ${stdenv.cc.bintools.targetPrefix}clang -dynamiclib -x c - -current_version 2.4.0 \ + -compatibility_version 7.0.0 -current_version 7.0.0 -o $out/lib/libiconv.dylib \ + -Wl,-reexport_library -Wl,$out/lib/libiconv-nocharset.dylib \ + -Wl,-reexport_library -Wl,$out/lib/libcharset.dylib + ''; + + setupHooks = [ + ../../../../build-support/setup-hooks/role.bash + ../../../../development/libraries/libiconv/setup-hook.sh + ]; + + meta = { + mainProgram = "iconv"; + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libmalloc/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libmalloc/default.nix new file mode 100644 index 0000000..8b362a2 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libmalloc/default.nix @@ -0,0 +1,10 @@ +{ appleDerivation', stdenvNoCC }: + +# Unfortunately, buiding libmalloc is not feasible due to its use of non-public headers, but its +# headers are needed by Libsystem. +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/include + cp -R include/malloc $out/include/ + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libplatform/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libplatform/default.nix new file mode 100644 index 0000000..e0b25d2 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libplatform/default.nix @@ -0,0 +1,39 @@ +{ lib, appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC (finalAttrs: { + installPhase = '' + mkdir $out + cp -r include $out/include + test -d private && cp -r private/* $out/include + ''; + + appleHeaders = '' + _simple.h + libkern/OSAtomic.h + libkern/OSAtomicDeprecated.h + libkern/OSAtomicQueue.h + libkern/OSCacheControl.h + libkern/OSSpinLockDeprecated.h + os/alloc_once_impl.h + os/base.h + os/base_private.h + os/internal/atomic.h + os/internal/crashlog.h + os/internal/internal_shared.h + os/lock.h + os/lock_private.h + os/once_private.h + os/semaphore_private.h + platform/compat.h + platform/introspection_private.h + platform/string.h + setjmp.h + '' + ( + if lib.versionAtLeast finalAttrs.version "254.40.4" then '' + string_x86.h + ucontext.h + '' else '' + ucontext.h + '' + ); +}) diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libpthread/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libpthread/default.nix new file mode 100644 index 0000000..3d62270 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libpthread/default.nix @@ -0,0 +1,55 @@ +{ lib, appleDerivation', stdenvNoCC, libdispatch, xnu }: + +appleDerivation' stdenvNoCC { + propagatedBuildInputs = [ libdispatch xnu ]; + + installPhase = '' + mkdir -p $out/include/pthread/ + mkdir -p $out/include/sys/_types + cp pthread/*.h $out/include/pthread/ + + # This overwrites qos.h, and is probably not necessary, but I'll leave it here for now + # cp private/*.h $out/include/pthread/ + + cp -r sys $out/include + cp -r sys/_pthread/*.h $out/include/sys/_types/ + ''; + + appleHeaders = '' + pthread/introspection.h + pthread/pthread.h + pthread/pthread_impl.h + pthread/pthread_spis.h + pthread/qos.h + pthread/sched.h + pthread/spawn.h + sys/_pthread/_pthread_attr_t.h + sys/_pthread/_pthread_cond_t.h + sys/_pthread/_pthread_condattr_t.h + sys/_pthread/_pthread_key_t.h + sys/_pthread/_pthread_mutex_t.h + sys/_pthread/_pthread_mutexattr_t.h + sys/_pthread/_pthread_once_t.h + sys/_pthread/_pthread_rwlock_t.h + sys/_pthread/_pthread_rwlockattr_t.h + sys/_pthread/_pthread_t.h + sys/_pthread/_pthread_types.h + sys/_types/_pthread_attr_t.h + sys/_types/_pthread_cond_t.h + sys/_types/_pthread_condattr_t.h + sys/_types/_pthread_key_t.h + sys/_types/_pthread_mutex_t.h + sys/_types/_pthread_mutexattr_t.h + sys/_types/_pthread_once_t.h + sys/_types/_pthread_rwlock_t.h + sys/_types/_pthread_rwlockattr_t.h + sys/_types/_pthread_t.h + sys/_types/_pthread_types.h + sys/qos.h + sys/qos_private.h + ''; + + meta = { + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libresolv/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libresolv/default.nix new file mode 100644 index 0000000..2a8a609 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libresolv/default.nix @@ -0,0 +1,52 @@ +{ lib, appleDerivation', stdenv, stdenvNoCC, Libinfo, configdHeaders, mDNSResponder +, headersOnly ? false +}: + +appleDerivation' (if headersOnly then stdenvNoCC else stdenv) { + buildInputs = lib.optionals (!headersOnly) [ Libinfo configdHeaders mDNSResponder ]; + + buildPhase = lib.optionalString (!headersOnly) '' + $CC -I. -c dns_util.c + $CC -I. -c dns.c + $CC -I. -c dns_async.c + $CC -I. -c base64.c + $CC -I. -c dst_api.c + $CC -I. -c dst_hmac_link.c + $CC -I. -c dst_support.c + $CC -I. -c ns_date.c + $CC -I. -c ns_name.c + $CC -I. -c ns_netint.c + $CC -I. -c ns_parse.c + $CC -I. -c ns_print.c + $CC -I. -c ns_samedomain.c + $CC -I. -c ns_sign.c + $CC -I. -c ns_ttl.c + $CC -I. -c ns_verify.c + $CC -I. -c res_comp.c + $CC -I. -c res_data.c + $CC -I. -c res_debug.c + $CC -I. -c res_findzonecut.c + $CC -I. -c res_init.c + $CC -I. -c res_mkquery.c + $CC -I. -c res_mkupdate.c + $CC -I. -c res_query.c + $CC -I. -c res_send.c + $CC -I. -c res_sendsigned.c + $CC -I. -c res_update.c + $CC -dynamiclib -install_name $out/lib/libresolv.9.dylib -current_version 1.0.0 -compatibility_version 1.0.0 -o libresolv.9.dylib *.o + ''; + + installPhase = '' + mkdir -p $out/include $out/include/arpa $out/lib + + cp dns.h $out/include/ + cp dns_util.h $out/include + cp nameser.h $out/include + ln -s ../nameser.h $out/include/arpa + cp resolv.h $out/include + '' + lib.optionalString (!headersOnly) '' + + cp libresolv.9.dylib $out/lib + ln -s libresolv.9.dylib $out/lib/libresolv.dylib + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libunwind/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libunwind/default.nix new file mode 100644 index 0000000..df3c565 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libunwind/default.nix @@ -0,0 +1,17 @@ +{ lib, appleDerivation }: + +appleDerivation { + dontBuild = true; + + # install headers only + installPhase = '' + mkdir -p $out/lib + cp -R include $out/include + ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin lnl7 ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/libutil/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/libutil/default.nix new file mode 100644 index 0000000..5cc8e0f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/libutil/default.nix @@ -0,0 +1,43 @@ +{ lib, stdenv, stdenvNoCC, appleDerivation', xcbuildHook + +# headersOnly is true when building for libSystem +, headersOnly ? false }: + +appleDerivation' (if headersOnly then stdenvNoCC else stdenv) { + nativeBuildInputs = lib.optional (!headersOnly) xcbuildHook; + + prePatch = '' + substituteInPlace tzlink.c \ + --replace '#include ' "" + ''; + + xcbuildFlags = [ "-target" "util" ]; + + installPhase = '' + mkdir -p $out/include + '' + lib.optionalString headersOnly '' + cp *.h $out/include + '' + lib.optionalString (!headersOnly)'' + mkdir -p $out/lib $out/include + + cp Products/Release/*.dylib $out/lib + cp Products/Release/*.h $out/include + + # TODO: figure out how to get this to be right the first time around + install_name_tool -id $out/lib/libutil.dylib $out/lib/libutil.dylib + ''; + + # FIXME: headers are different against headersOnly. And all the headers are NOT in macos, do we really want them? + # appleHeaders = '' + # libutil.h + # mntopts.h + # tzlink.h + # wipefs.h + # ''; + + meta = with lib; { + maintainers = with maintainers; [ copumpkin ]; + platforms = platforms.darwin; + license = licenses.apple-psl20; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/mDNSResponder/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/mDNSResponder/default.nix new file mode 100644 index 0000000..0ba4cae --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/mDNSResponder/default.nix @@ -0,0 +1,12 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + dontBuild = true; + installPhase = '' + mkdir -p $out/include + # TODO: Do this only for 765.50.9 once there is a way to apply version-specific + # logic in a source-release derivation. + substitute mDNSShared/dns_sd.h $out/include/dns_sd.h \ + --replace '#define _DNS_SD_LIBDISPATCH 0' '#define _DNS_SD_LIBDISPATCH 1' + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/macos-11.0.1.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/macos-11.0.1.nix new file mode 100644 index 0000000..b4a7bbc --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/macos-11.0.1.nix @@ -0,0 +1,46 @@ +# Generated using: ./generate-sdk-packages.sh macos 11.0.1 + +{ applePackage' }: + +{ +CommonCrypto = applePackage' "CommonCrypto" "60178.40.2" "macos-11.0.1" "129gsxhhcxqycg0zjrdrz2ay4dv2ih1ckafqh33qrc499z8dam2p" {}; +Csu = applePackage' "Csu" "88" "macos-11.0.1" "1lzp9x8iv60c2h12q2s89nf49b5hvpqq4a9li44zr2fxszn8lqxh" {}; +ICU = applePackage' "ICU" "66108" "macos-11.0.1" "0mclizp99daihghqy2sgzjkid8i93dsn5pi8q9p7b3156chrhw57" {}; +Libc = applePackage' "Libc" "1439.40.11" "macos-11.0.1" "12k5sbz2k1pl839w2lk9iw414zzl50zdjzgq2x6bm20yjbfj69qm" {}; +Libinfo = applePackage' "Libinfo" "542.40.3" "macos-11.0.1" "18jvl7cdg64x6clhsfv5pbzxis2aldddpca5r81xqakrmi9mck80" {}; +Libnotify = applePackage' "Libnotify" "279.40.4" "macos-11.0.1" "1vr11s0c42ssjs29shy1m8rj008np7aswdzjpimsfzyav47jb6y7" {}; +Librpcsvc = applePackage' "Librpcsvc" "26" "macos-11.0.1" "0wf6srbw28664wa0dckldbhrl9ydg70fms06rj6i7mvlrz1ccxk0" {}; +Libsystem = applePackage' "Libsystem" "1292.50.1" "macos-11.0.1" "0d3flh1p4kskic8ypi8wia4kinfbprx9fvyfqc3mcq0710i0gy77" {}; +PowerManagement = applePackage' "PowerManagement" "1132.50.3" "macos-11.0.1" "1sb2nz92vdf6v3h17ry0vgw0z9zsva82lhdrhsf3k60jhfw1fi2v" {}; +Security = applePackage' "Security" "59754.41.1" "macos-11.0.1" "0jq70mnwkvrrhws64ipx0i68pi3n0sk95jlhacxxikdj9f4hpbsw" {}; +adv_cmds = applePackage' "adv_cmds" "176" "macos-11.0.1" "0sskwl3jc7llbrlyd1i7qlb03yhm1xkbxd1k9xhh7f9wqhlzq31j" {}; +architecture = applePackage' "architecture" "279" "macos-11.0.1" "19s93rqr9r98qh0rlndf7kv3v4n1ifh9i539mbpsx6kbixcx8vvp" {}; +basic_cmds = applePackage' "basic_cmds" "55" "macos-11.0.1" "1913pzk376zfap2fwmrb233rkn4h4l2c65nd7s8ixvrz1r7cz0q5" {}; +bootstrap_cmds = applePackage' "bootstrap_cmds" "121" "macos-11.0.1" "0qgbgwijv7xqmm9gn74jibyw2dh516xpj7h1grj2j1i80m3b16bl" {}; +configd = applePackage' "configd" "1109.40.9" "macos-11.0.1" "024ny63lpwzgnm8g28hh8dldvmmislmrl298n721rm0blqjhahz5" {}; +copyfile = applePackage' "copyfile" "173.40.2" "macos-11.0.1" "1j20909inn2iw8n51b8vk551wznfi3bhfziy8nbv08qj5lk50m04" {}; +diskdev_cmds = applePackage' "diskdev_cmds" "667.40.1" "macos-11.0.1" "0wr60vyvgkbc4wyldnsqas0xss2k1fgmbdk3vnhj6v6jqa98l1ny" {}; +dtrace = applePackage' "dtrace" "370.40.1" "macos-11.0.1" "1qj74mix1x3drffr1qpafm57aby42bc61kynba5q0ppbcf0lrbp1" {}; +dyld = applePackage' "dyld" "832.7.1" "macos-11.0.1" "01q7fsibr6xp94l3w22sh8qfjgwzzf1v82mhgq39ivkxwwc4jdy0" {}; +eap8021x = applePackage' "eap8021x" "304.40.1" "macos-11.0.1" "1aihyklri64w380d1mvi830n5cnzs9gd38z8i9ccd37n48gmz88p" {}; +file_cmds = applePackage' "file_cmds" "321.40.3" "macos-11.0.1" "0p077lnbcy8266m03a0fssj4214bjxh88y3qkspnzcvi0g84k43q" {}; +hfs = applePackage' "hfs" "556.41.1" "macos-11.0.1" "0a0s6b12b0q07wslfifna0bj51dml9v098i4crr2m1vivnx4xj75" {}; +libclosure = applePackage' "libclosure" "78" "macos-11.0.1" "0vf9n0k3m8dbprv1bf45zqg0g43bidy2i5z1v9a826bsf8lv7am7" {}; +libdispatch = applePackage' "libdispatch" "1271.40.12" "macos-11.0.1" "1ck5srcjapg18vqb8wl08gacs7ndc6xr067qjn3ngx39q1jdcywz" {}; +libiconv = applePackage' "libiconv" "59" "macos-11.0.1" "0lwa4brdwm4lvrdnxylzsn1yph4m7csgri2zkc4xb4xiisz32pwp" {}; +libmalloc = applePackage' "libmalloc" "317.40.8" "macos-11.0.1" "sha256-Tdhb0mq3w4Hwvp3xHB79Vr22hCOQK6h28HCsd7jvITI=" {}; +libplatform = applePackage' "libplatform" "254.40.4" "macos-11.0.1" "1qf3ri0yd8b1xjln1j1gyx7ks6k3a2jhd63blyvfby75y9s7flky" {}; +libpthread = applePackage' "libpthread" "454.40.3" "macos-11.0.1" "0zljbw8mpb80n1if65hhi9lkgwbgjr8vc9wvf7q1nl3mzyl35f8p" {}; +libresolv = applePackage' "libresolv" "68" "macos-11.0.1" "045ahh8nvaam9whryc2f5g5xagwp7d187r80kcff82snp5p66aq1" {}; +libunwind = applePackage' "libunwind" "200.10" "macos-11.0.1" "0wa4ssr7skn5j0ncm1rigd56qmbs982zvwr3qpjn28krwp8wvigd" {}; +libutil = applePackage' "libutil" "58.40.2" "macos-11.0.1" "11s0vizk7bg0k0yjx21j8vaji4j4vk57131qbp07i9lpksb3bcy4" {}; +mDNSResponder = applePackage' "mDNSResponder" "1310.40.42" "macos-11.0.1" "0xxrqqbqsf0pagfs1yzwfbwf7lhr0sns97k18y7kh4ri0p09h44c" {}; +network_cmds = applePackage' "network_cmds" "606.40.2" "macos-11.0.1" "1jsy13nraarafq6wmgh3wyir8wrwfra148xsjns7cw7q5xn40a1w" {}; +objc4 = applePackage' "objc4" "818.2" "macos-11.0.1" "0m8mk1qd18wqjfn2jsq2lx6fxvllhmadmvz11jzg8vjw8pq91nw2" {}; +ppp = applePackage' "ppp" "877.40.2" "macos-11.0.1" "06xznc77j45zzi12m4cmr3jj853qlc8dbmynbg1z6m9qf5phdbgk" {}; +removefile = applePackage' "removefile" "49.40.3" "macos-11.0.1" "0870ihxpmvj8ggaycwlismbgbw9768lz7w6mc9vxf8l6nlc43z4f" {}; +shell_cmds = applePackage' "shell_cmds" "216.40.4" "macos-11.0.1" "0wbysc9lwf1xgl686r3yn95rndcmqlp17zc1ig9gsl5fxyy5bghh" {}; +text_cmds = applePackage' "text_cmds" "106" "macos-11.0.1" "17fn35m6i866zjrf8da6cq6crydp6vp4zq0aaab243rv1fx303yy" {}; +top = applePackage' "top" "129" "macos-11.0.1" "0d9pqmv3mwkfcv7c05hfvnvnn4rbsl92plr5hsazp854pshzqw2k" {}; +xnu = applePackage' "xnu" "7195.50.7.100.1" "macos-11.0.1" "11zjmpw11rcc6a0xlbwramra1rsr65s4ypnxwpajgbr2c657lipl" {}; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/network_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/network_cmds/default.nix new file mode 100644 index 0000000..600571f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/network_cmds/default.nix @@ -0,0 +1,54 @@ +{ lib, appleDerivation, xcbuildHook, stdenv +, Librpcsvc, xnu, libpcap, developer_cmds }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ xnu Librpcsvc libpcap developer_cmds ]; + + # Work around error from on aarch64-darwin: + # error: 'TARGET_OS_IPHONE' is not defined, evaluates to 0 [-Werror,-Wundef-prefix=TARGET_OS_] + env.NIX_CFLAGS_COMPILE = "-Wno-error=undef-prefix -I./unbound -I${xnu}/Library/Frameworks/System.framework/Headers/"; + + # "spray" requires some files that aren't compiling correctly in xcbuild. + # "rtadvd" seems to fail with some missing constants. + # "traceroute6" and "ping6" require ipsec which doesn't build correctly + # "unbound" doesn’t build against supported versions of OpenSSL or LibreSSL + patchPhase = '' + substituteInPlace network_cmds.xcodeproj/project.pbxproj \ + --replace "7294F0EA0EE8BAC80052EC88 /* PBXTargetDependency */," "" \ + --replace "7216D34D0EE89FEC00AE70E4 /* PBXTargetDependency */," "" \ + --replace "72CD1D9C0EE8C47C005F825D /* PBXTargetDependency */," "" \ + --replace "7216D2C20EE89ADF00AE70E4 /* PBXTargetDependency */," "" \ + --replace "71D958C51A9455A000C9B286 /* PBXTargetDependency */," "" + ''; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + + for n in 1 5; do + mkdir -p $out/share/man/man$n + install */*.$n $out/share/man/man$n + done + + # TODO: patch files to load from $out/ instead of /usr/ + + # mkdir -p $out/etc/ + # install rtadvd.tproj/rtadvd.conf ip6addrctl.tproj/ip6addrctl.conf $out/etc/ + + # mkdir -p $out/local/OpenSourceVersions/ + # install network_cmds.plist $out/local/OpenSourceVersions/ + + # mkdir -p $out/System/Library/LaunchDaemons + # install kdumpd.tproj/com.apple.kdumpd.plist $out/System/Library/LaunchDaemons + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/default.nix new file mode 100644 index 0000000..315f0fb --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/default.nix @@ -0,0 +1,35 @@ +{ appleDerivation, darwin-stubs }: + +appleDerivation { + # Not strictly necessary, since libSystem depends on it, but it's nice to be explicit so we + # can easily find out what's impure. + __propagatedImpureHostDeps = [ + "/usr/lib/libauto.dylib" + "/usr/lib/libc++abi.dylib" + "/usr/lib/libc++.1.dylib" + "/usr/lib/libSystem.B.dylib" + ]; + + installPhase = '' + mkdir -p $out/include/objc $out/lib + cp ${darwin-stubs}/usr/lib/libobjc.A.tbd $out/lib/libobjc.A.tbd + ln -s libobjc.A.tbd $out/lib/libobjc.tbd + cp runtime/OldClasses.subproj/List.h $out/include/objc/List.h + cp runtime/NSObjCRuntime.h $out/include/objc/NSObjCRuntime.h + cp runtime/NSObject.h $out/include/objc/NSObject.h + cp runtime/Object.h $out/include/objc/Object.h + cp runtime/Protocol.h $out/include/objc/Protocol.h + cp runtime/hashtable.h $out/include/objc/hashtable.h + cp runtime/hashtable2.h $out/include/objc/hashtable2.h + cp runtime/message.h $out/include/objc/message.h + cp runtime/objc-api.h $out/include/objc/objc-api.h + cp runtime/objc-auto.h $out/include/objc/objc-auto.h + cp runtime/objc-class.h $out/include/objc/objc-class.h + cp runtime/objc-exception.h $out/include/objc/objc-exception.h + cp runtime/objc-load.h $out/include/objc/objc-load.h + cp runtime/objc-runtime.h $out/include/objc/objc-runtime.h + cp runtime/objc-sync.h $out/include/objc/objc-sync.h + cp runtime/objc.h $out/include/objc/objc.h + cp runtime/runtime.h $out/include/objc/runtime.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/objc-probes.h b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/objc-probes.h new file mode 100644 index 0000000..4ad9ba9 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/objc-probes.h @@ -0,0 +1,65 @@ +/* + * Generated by dtrace(1M). + */ + +#ifndef _OBJC_PROBES_H +#define _OBJC_PROBES_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OBJC_RUNTIME_STABILITY "___dtrace_stability$objc_runtime$v1$1_1_0_1_1_0_1_1_0_1_1_0_1_1_0" + +#define OBJC_RUNTIME_TYPEDEFS "___dtrace_typedefs$objc_runtime$v2" + +#if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED + +#define OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW() \ +do { \ + __asm__ volatile(".reference " OBJC_RUNTIME_TYPEDEFS); \ + __dtrace_probe$objc_runtime$objc_exception_rethrow$v1(); \ + __asm__ volatile(".reference " OBJC_RUNTIME_STABILITY); \ +} while (0) +#define OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW_ENABLED() \ + ({ int _r = __dtrace_isenabled$objc_runtime$objc_exception_rethrow$v1(); \ + __asm__ volatile(""); \ + _r; }) +#define OBJC_RUNTIME_OBJC_EXCEPTION_THROW(arg0) \ +do { \ + __asm__ volatile(".reference " OBJC_RUNTIME_TYPEDEFS); \ + __dtrace_probe$objc_runtime$objc_exception_throw$v1$766f6964202a(arg0); \ + __asm__ volatile(".reference " OBJC_RUNTIME_STABILITY); \ +} while (0) +#define OBJC_RUNTIME_OBJC_EXCEPTION_THROW_ENABLED() \ + ({ int _r = __dtrace_isenabled$objc_runtime$objc_exception_throw$v1(); \ + __asm__ volatile(""); \ + _r; }) + + +extern void __dtrace_probe$objc_runtime$objc_exception_rethrow$v1(void); +extern int __dtrace_isenabled$objc_runtime$objc_exception_rethrow$v1(void); +extern void __dtrace_probe$objc_runtime$objc_exception_throw$v1$766f6964202a(const void *); +extern int __dtrace_isenabled$objc_runtime$objc_exception_throw$v1(void); + +#else + +#define OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW() \ +do { \ + } while (0) +#define OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW_ENABLED() (0) +#define OBJC_RUNTIME_OBJC_EXCEPTION_THROW(arg0) \ +do { \ + } while (0) +#define OBJC_RUNTIME_OBJC_EXCEPTION_THROW_ENABLED() (0) + +#endif /* !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _OBJC_PROBES_H */ diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/pure.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/pure.nix new file mode 100644 index 0000000..6a0c819 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/pure.nix @@ -0,0 +1,118 @@ +{ stdenv, fetchapplesource, libauto, launchd, libc_old, libunwind }: + +stdenv.mkDerivation rec { + version = "551.1"; + pname = "objc4"; + + src = fetchapplesource { + inherit version; + name = "objc4"; + sha256 = "1jrdb6yyb5jwwj27c1r0nr2y2ihqjln8ynj61mpkvp144c1cm5bg"; + }; + + patches = [ ./spinlocks.patch ]; + + buildInputs = [ libauto launchd libc_old libunwind ]; + + buildPhase = '' + cp ${./objc-probes.h} runtime/objc-probes.h + + mkdir -p build/include/objc + + cp runtime/hashtable.h build/include/objc/hashtable.h + cp runtime/OldClasses.subproj/List.h build/include/objc/List.h + cp runtime/hashtable2.h build/include/objc/hashtable2.h + cp runtime/message.h build/include/objc/message.h + cp runtime/objc-api.h build/include/objc/objc-api.h + cp runtime/objc-auto.h build/include/objc/objc-auto.h + cp runtime/objc-class.h build/include/objc/objc-class.h + cp runtime/objc-exception.h build/include/objc/objc-exception.h + cp runtime/objc-load.h build/include/objc/objc-load.h + cp runtime/objc-sync.h build/include/objc/objc-sync.h + cp runtime/objc.h build/include/objc/objc.h + cp runtime/objc-runtime.h build/include/objc/objc-runtime.h + cp runtime/Object.h build/include/objc/Object.h + cp runtime/Protocol.h build/include/objc/Protocol.h + cp runtime/runtime.h build/include/objc/runtime.h + cp runtime/NSObject.h build/include/objc/NSObject.h + cp runtime/NSObjCRuntime.h build/include/objc/NSObjCRuntime.h + + # These would normally be in local/include but we don't do local, so they're + # going in with the others + cp runtime/maptable.h build/include/objc/maptable.h + cp runtime/objc-abi.h build/include/objc/objc-abi.h + cp runtime/objc-auto-dump.h build/include/objc/objc-auto-dump.h + cp runtime/objc-gdb.h build/include/objc/objc-gdb.h + cp runtime/objc-internal.h build/include/objc/objc-internal.h + + cc -o markgc markgc.c + + FLAGS="-Wno-deprecated-register -Wno-unknown-pragmas -Wno-deprecated-objc-isa-usage -Wno-invalid-offsetof -Wno-inline-new-delete -Wno-cast-of-sel-type -Iruntime -Ibuild/include -Iruntime/Accessors.subproj -D_LIBCPP_VISIBLE= -DOS_OBJECT_USE_OBJC=0 -DNDEBUG=1" + + cc -std=gnu++11 $FLAGS -c runtime/hashtable2.mm + cc -std=gnu++11 $FLAGS -c runtime/maptable.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-auto.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-cache.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-class-old.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-class.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-errors.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-exception.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-file.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-initialize.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-layout.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-load.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-loadmethod.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-lockdebug.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-runtime-new.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-runtime-old.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-runtime.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-sel-set.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-sel.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-sync.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-typeencoding.mm + cc -std=gnu++11 $FLAGS -c runtime/Object.mm + cc -std=gnu++11 $FLAGS -c runtime/Protocol.mm + + cc -std=gnu++11 $FLAGS -c runtime/objc-references.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-os.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-auto-dump.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-file-old.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-block-trampolines.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-externalref.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-weak.mm + cc -std=gnu++11 $FLAGS -c runtime/NSObject.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-opt.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-cache-old.mm + cc -std=gnu++11 $FLAGS -c runtime/objc-sel-old.mm + + cc -std=gnu++11 $FLAGS -c runtime/Accessors.subproj/objc-accessors.mm + + cc $FLAGS -c runtime/objc-sel-table.s + + cc $FLAGS -c runtime/OldClasses.subproj/List.m + cc $FLAGS -c runtime/Messengers.subproj/objc-msg-arm.s + cc $FLAGS -c runtime/Messengers.subproj/objc-msg-i386.s + cc $FLAGS -c runtime/Messengers.subproj/objc-msg-x86_64.s + cc $FLAGS -c runtime/Messengers.subproj/objc-msg-simulator-i386.s + + cc $FLAGS -c runtime/a1a2-blocktramps-i386.s + cc $FLAGS -c runtime/a2a3-blocktramps-i386.s + + cc $FLAGS -c runtime/a1a2-blocktramps-x86_64.s + cc $FLAGS -c runtime/a2a3-blocktramps-x86_64.s + + cc $FLAGS -c runtime/a1a2-blocktramps-arm.s + cc $FLAGS -c runtime/a2a3-blocktramps-arm.s + + c++ -Wl,-no_dtrace_dof --stdlib=libc++ -dynamiclib -lauto -install_name $out/lib/libobjc.dylib -o libobjc.dylib *.o + + ./markgc -p libobjc.dylib + ''; + + installPhase = '' + mkdir -p $out/include $out/lib + + mv build/include/objc $out/include + mv libobjc.dylib $out/lib + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/spinlocks.patch b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/spinlocks.patch new file mode 100644 index 0000000..50c6a98 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/objc4/spinlocks.patch @@ -0,0 +1,107 @@ +--- objc4-551.1/runtime/objc-os.h 2013-06-10 21:16:15.000000000 -0400 ++++ ../objc4-551.1/runtime/objc-os.h 2015-01-19 01:01:36.000000000 -0500 +@@ -77,27 +77,72 @@ + # include + # include + # include +-# include + # include + # include +-# include + # include "objc-probes.h" // generated dtrace probe definitions. + ++#define __PTK_FRAMEWORK_OBJC_KEY5 45 ++#define __PTK_FRAMEWORK_OBJC_KEY6 46 ++#define __PTK_FRAMEWORK_OBJC_KEY7 47 ++#define __PTK_FRAMEWORK_OBJC_KEY8 48 ++#define __PTK_FRAMEWORK_OBJC_KEY9 49 ++ ++extern "C" int pthread_key_init_np(int, void (*)(void *)); ++ + // Some libc functions call objc_msgSend() + // so we can't use them without deadlocks. + void syslog(int, const char *, ...) UNAVAILABLE_ATTRIBUTE; + void vsyslog(int, const char *, va_list) UNAVAILABLE_ATTRIBUTE; + ++#if defined(__i386__) || defined(__x86_64__) ++ ++// Inlined spinlock. ++// Not for arm on iOS because it hurts uniprocessor performance. ++ ++#define ARR_SPINLOCK_INIT 0 ++// XXX -- Careful: OSSpinLock isn't volatile, but should be ++typedef volatile int ARRSpinLock; ++__attribute__((always_inline)) ++static inline void ARRSpinLockLock(ARRSpinLock *l) ++{ ++ unsigned y; ++again: ++ if (__builtin_expect(__sync_lock_test_and_set(l, 1), 0) == 0) { ++ return; ++ } ++ for (y = 1000; y; y--) { ++#if defined(__i386__) || defined(__x86_64__) ++ asm("pause"); ++#endif ++ if (*l == 0) goto again; ++ } ++ thread_switch(THREAD_NULL, SWITCH_OPTION_DEPRESS, 1); ++ goto again; ++} ++__attribute__((always_inline)) ++static inline void ARRSpinLockUnlock(ARRSpinLock *l) ++{ ++ __sync_lock_release(l); ++} ++__attribute__((always_inline)) ++static inline int ARRSpinLockTry(ARRSpinLock *l) ++{ ++ return __sync_bool_compare_and_swap(l, 0, 1); ++} ++ ++#define spinlock_t ARRSpinLock ++#define spinlock_trylock(l) ARRSpinLockTry(l) ++#define spinlock_lock(l) ARRSpinLockLock(l) ++#define spinlock_unlock(l) ARRSpinLockUnlock(l) ++#define SPINLOCK_INITIALIZER ARR_SPINLOCK_INIT + +-#define spinlock_t os_lock_handoff_s +-#define spinlock_trylock(l) os_lock_trylock(l) +-#define spinlock_lock(l) os_lock_lock(l) +-#define spinlock_unlock(l) os_lock_unlock(l) +-#define SPINLOCK_INITIALIZER OS_LOCK_HANDOFF_INIT ++#endif + + + #if !TARGET_OS_IPHONE +-# include ++#define CRSetCrashLogMessage(msg) ++#define CRGetCrashLogMessage() 0 ++#define CRSetCrashLogMessage2(msg) + #else + // CrashReporterClient not yet available on iOS + __BEGIN_DECLS +@@ -594,21 +639,13 @@ + { + assert(is_valid_direct_key(k)); + +- if (_pthread_has_direct_tsd()) { +- return _pthread_getspecific_direct(k); +- } else { +- return pthread_getspecific(k); +- } ++ return pthread_getspecific(k); + } + static inline void tls_set_direct(tls_key_t k, void *value) + { + assert(is_valid_direct_key(k)); + +- if (_pthread_has_direct_tsd()) { +- _pthread_setspecific_direct(k, value); +- } else { +- pthread_setspecific(k, value); +- } ++ pthread_setspecific(k, value); + } + + // not arm diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/ppp/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/ppp/default.nix new file mode 100644 index 0000000..4ced564 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/ppp/default.nix @@ -0,0 +1,15 @@ +{ appleDerivation', stdenv }: + +appleDerivation' stdenv { + dontBuild = true; + installPhase = '' + mkdir -p $out/include/ppp + + cp Controller/ppp_msg.h $out/include/ppp + cp Controller/pppcontroller_types.h $out/include/ppp + cp Controller/pppcontroller_types.h $out/include + cp Controller/pppcontroller.defs $out/include/ppp + cp Controller/pppcontroller_mach_defines.h $out/include + cp Controller/PPPControllerPriv.h $out/include/ppp + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/removefile/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/removefile/default.nix new file mode 100644 index 0000000..611f445 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/removefile/default.nix @@ -0,0 +1,13 @@ +{ appleDerivation', stdenvNoCC }: + +appleDerivation' stdenvNoCC { + installPhase = '' + mkdir -p $out/include/ + cp removefile.h checkint.h $out/include/ + ''; + + appleHeaders = '' + checkint.h + removefile.h + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/shell_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/shell_cmds/default.nix new file mode 100644 index 0000000..a835228 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/shell_cmds/default.nix @@ -0,0 +1,50 @@ +{ lib, appleDerivation, xcbuildHook, launchd }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook launchd ]; + + patchPhase = '' + # NOTE: these hashes must be recalculated for each version change + + # disables: + # - su ('security/pam_appl.h' file not found) + # - find (Undefined symbol '_get_date') + # - w (Undefined symbol '_res_9_init') + # - expr + substituteInPlace shell_cmds.xcodeproj/project.pbxproj \ + --replace "FCBA168714A146D000AA698B /* PBXTargetDependency */," "" \ + --replace "FCBA165914A146D000AA698B /* PBXTargetDependency */," "" \ + --replace "FCBA169514A146D000AA698B /* PBXTargetDependency */," "" \ + --replace "FCBA165514A146D000AA698B /* PBXTargetDependency */," "" + + # disable w, test install + # get rid of permission stuff + substituteInPlace xcodescripts/install-files.sh \ + --replace 'ln -f "$BINDIR/w" "$BINDIR/uptime"' "" \ + --replace 'ln -f "$DSTROOT/bin/test" "$DSTROOT/bin/["' "" \ + --replace "-o root -g wheel -m 0755" "" \ + --replace "-o root -g wheel -m 0644" "" + ''; + + # temporary install phase until xcodebuild has "install" support + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/usr/bin/$(basename $f) + fi + done + + export DSTROOT=$out + export SRCROOT=$PWD + . xcodescripts/install-files.sh + + mv $out/usr/* $out + mv $out/private/etc $out + rmdir $out/usr $out/private + ''; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/default.nix new file mode 100644 index 0000000..7bd3cae --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/default.nix @@ -0,0 +1,161 @@ +{ + lib, + stdenv, + stdenvNoCC, + appleDerivation, + fetchFromGitHub, + runCommand, + gawk, + meson, + ninja, + pkg-config, + libdispatch, + libmalloc, + libplatform, + Librpcsvc, + libutil, + ncurses, + openbsm, + pam, + xnu, + CoreFoundation, + CoreSymbolication, + DirectoryService, + IOKit, + Kernel, + Libc, + OpenDirectory, + WebKit, +}: + +let + OpenDirectoryPrivate = stdenvNoCC.mkDerivation (finalAttrs: { + name = "apple-private-framework-OpenDirectory"; + version = "146"; + + src = fetchFromGitHub { + owner = "apple-oss-distributions"; + repo = "OpenDirectory"; + rev = "OpenDirectory-${finalAttrs.version}"; + hash = "sha256-6fSl8PasCZSBfe0ftaePcBuSEO3syb6kK+mfDI6iR7A="; + }; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/include/CFOpenDirectory" "$out/include/OpenDirectory" + install -t "$out/include/CFOpenDirectory" \ + Core/CFOpenDirectoryPriv.h \ + Core/CFODTrigger.h + touch "$out/include/CFOpenDirectory/CFOpenDirectoryConstantsPriv.h" + install -t "$out/include/OpenDirectory" \ + Framework/OpenDirectoryPriv.h \ + Framework/NSOpenDirectoryPriv.h + + runHook postInstall + ''; + }); + + libmallocPrivate = stdenvNoCC.mkDerivation { + pname = "libmalloc-private"; + version = lib.getVersion libmalloc; + + inherit (libmalloc) src; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/include" + cp -r private/*.h "$out/include" + + runHook postInstall + ''; + }; + + # Private xnu headers that are part of the source tree but not in the xnu derivation. + xnuPrivate = stdenvNoCC.mkDerivation { + pname = "xnu-private"; + version = lib.getVersion xnu; + + inherit (xnu) src; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/include" + cp libsyscall/wrappers/spawn/spawn_private.h "$out/include" + + runHook postInstall + ''; + }; +in +appleDerivation (finalAttrs: { + nativeBuildInputs = [ + gawk + meson + ninja + pkg-config + ]; + + buildInputs = [ + libdispatch + libplatform + Librpcsvc + libutil + ncurses + openbsm + pam + xnu + CoreFoundation + CoreSymbolication + DirectoryService + IOKit + Kernel + OpenDirectory + ]; + + postPatch = '' + # Replace hard-coded, impure system paths with the output path in the store. + sed -e "s|PATH=[^;]*|PATH='$out/bin'|" -i "pagesize/pagesize.sh" + ''; + + # A vendored meson.build is used instead of the upstream Xcode project. + # This is done for a few reasons: + # - The upstream project causes `xcbuild` to crash. + # See: https://github.com/facebookarchive/xcbuild/issues/188; + # - Achieving the same flexibility regarding SDK version would require modifying the + # Xcode project, but modifying Xcode projects without using Xcode is painful; and + # - Using Meson allows the derivation to leverage the robust Meson support in nixpkgs, + # and it allows it to use Meson features to simplify the build (e.g., generators). + preConfigure = '' + substitute '${./meson.build}' meson.build \ + --subst-var-by kernel '${Kernel}' \ + --subst-var-by libc_private '${Libc}' \ + --subst-var-by libmalloc_private '${libmallocPrivate}' \ + --subst-var-by opendirectory '${OpenDirectory}' \ + --subst-var-by opendirectory_private '${OpenDirectoryPrivate}' \ + --subst-var-by xnu '${xnu}' \ + --subst-var-by xnu_private '${xnuPrivate}' \ + --subst-var-by version '${finalAttrs.version}' + cp '${./meson.options}' meson.options + ''; + + mesonFlags = [ (lib.mesonOption "sdk_version" stdenv.hostPlatform.darwinSdkVersion) ]; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ + shlevy + matthewbauer + ]; + }; +}) diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.build b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.build new file mode 100644 index 0000000..de73e88 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.build @@ -0,0 +1,544 @@ +# Build settings based on the upstream Xcode project. +# See: https://github.com/apple-oss-distributions/system_cmds/blob/main/system_cmds.xcodeproj/project.pbxproj + + +# Project settings +project('system_cmds', 'c', version : '@version@') + +if host_machine.system() != 'linux' + add_project_arguments('-D__FreeBSD__', language : 'c') +endif + +sdk_version = get_option('sdk_version') + + +# Dependencies +cc = meson.get_compiler('c') +# Upstream uses awk to process `.gperf` files instead of gperf, which can’t process them. +fake_gperf = find_program('awk', required : true) + +## Frameworks +core_foundation = dependency('appleframeworks', modules : 'CoreFoundation') +core_symbolication = dependency('appleframeworks', modules : 'CoreSymbolication') +directory_service = dependency('appleframeworks', modules : 'DirectoryService') +iokit = dependency('appleframeworks', modules : 'IOKit') +kernel = declare_dependency(include_directories : '@kernel@/Library/Frameworks/Kernel.framework/Headers') +open_directory = dependency('appleframeworks', modules : 'OpenDirectory') + +## Private Headers +cfopen_directory = declare_dependency( + dependencies : declare_dependency( + compile_args :[ '-iframework', '@opendirectory@/Library/Frameworks/OpenDirectory.framework/Frameworks' ], + ), + include_directories : '@opendirectory_private@/include', +) +libc_private = declare_dependency(include_directories : '@libc_private@/include') +libmalloc_private = declare_dependency(include_directories : '@libmalloc_private@/include') + +xnu_include_dirs = [ + '@xnu@/include/bsd', + '@xnu@/include/libkern', + '@xnu@/include/iokit', + '@xnu@/include/osfmk', + '@xnu_private@/include' +] +if sdk_version.version_compare('>=10.13') + xnu_include_dirs += '@xnu@/include/san' +endif +xnu_private = declare_dependency( + compile_args : [ + # Suppresses suffixing symbols with '$UNIX2003', which causes link failures. + '-D__DARWIN_ONLY_UNIX_CONFORMANCE=1', + # Make sure Darwin is correctly detected as macOS + '-DPLATFORM_MacOSX=1', + # Access private definitions + '-DPRIVATE=1' + ], + include_directories : xnu_include_dirs +) + +## Libraries +ncurses = dependency('ncurses') +openbsm = cc.find_library('bsm') +pam = cc.find_library('pam') + +# Feature Tests +if sdk_version.version_compare('<12') + add_project_arguments('-DkIOMainPortDefault=kIOMasterPortDefault', language : 'c') + add_project_arguments('-DIOMainPort=IOMasterPort', language : 'c') +endif + + +# Generators +pgperf = generator( + fake_gperf, + arguments : [ '-f', meson.source_root() + '/getconf/fake-gperf.awk', '@INPUT@' ], + capture : true, + output : '@BASENAME@.gperf.c' +) + + +# Binaries +executable('ac', install : true, sources : 'ac/ac.c') +install_man('ac/ac.8') + +executable('accton', install : true, sources : 'accton/accton.c') +install_man('accton/accton.8') + +executable( + 'arch', + build_by_default : sdk_version.version_compare('>=11'), + install : sdk_version.version_compare('>=11'), + sources : 'arch/arch.c' +) +install_man( + 'arch/arch.1', + 'arch/machine.1' +) + +executable( + 'at', + c_args : [ + '-DDAEMON_UID=1', + '-DDAEMON_GID=1', + '-DDEFAULT_AT_QUEUE=\'a\'', + '-DDEFAULT_BATCH_QUEUE=\'b\'', + '-DPERM_PATH="/usr/lib/cron"', + ], + install : true, + sources : [ + 'at/at.c', + 'at/panic.c', + 'at/parsetime.c', + 'at/perm.c' + ] +) +install_man('at/at.1') + +executable( + 'atrun', + c_args : [ '-DDAEMON_UID=1', '-DDAEMON_GID=1' ], + include_directories : 'at', + install : true, + sources : [ + 'atrun/atrun.c', + 'atrun/gloadavg.c' + ] +) +install_man('atrun/atrun.8') + +executable( + 'chkpasswd', + c_args : '-DUSE_PAM', + dependencies : [ core_foundation, open_directory, pam ], + install : true, + sources : [ + 'chkpasswd/file_passwd.c', + 'chkpasswd/nis_passwd.c', + 'chkpasswd/od_passwd.c', + 'chkpasswd/pam_passwd.c', + 'chkpasswd/passwd.c', + 'chkpasswd/stringops.c' + ] +) +install_man('chkpasswd/chkpasswd.8') + +executable( + 'chpass', + dependencies : [ cfopen_directory, directory_service, open_directory ], + install : true, + sources : [ + 'chpass/chpass.c', + 'chpass/edit.c', + 'chpass/field.c', + 'chpass/open_directory.c', + 'chpass/table.c', + 'chpass/util.c' + ] +) +install_man('chpass/chpass.1') + +executable('cpuctl', install : true, sources : 'cpuctl/cpuctl.c') +install_man('cpuctl/cpuctl.8') + +executable('dmesg', install : true, sources : 'dmesg/dmesg.c') +install_man('dmesg/dmesg.8') + +executable( + 'dynamic_pager', + c_args : '-DNO_DIRECT_RPC', + install : true, + sources : 'dynamic_pager/dynamic_pager.c' +) +install_man('dynamic_pager/dynamic_pager.8') + +executable( + 'fs_usage', + # Requires 'ktrace/session.h' + build_by_default : false, + install : false, + sources : 'fs_usage/fs_usage.c' +) +# install_man('fs_usage/fs_usage.1') + +executable( + 'gcore', + # Requires XPC private APIs + build_by_default : false and sdk_version.version_compare('>=11'), + install : false and sdk_version.version_compare('>=11'), + sources : [ + 'gcore/convert.c', + 'gcore/corefile.c', + 'gcore/dyld.c', + 'gcore/dyld_shared_cache.c', + 'gcore/main.c', + 'gcore/sparse.c', + 'gcore/threads.c', + 'gcore/utils.c', + 'gcore/vanilla.c', + 'gcore/vm.c' + ] +) +# install_man('gcore/gcore-internal.1', 'gcore/gcore.1') + +executable( + 'getconf', + c_args : '-DAPPLE_GETCONF_UNDERSCORE', + include_directories : 'getconf', + install : true, + sources : [ + 'getconf/getconf.c', + ] + pgperf.process( + [ + 'getconf/confstr.gperf', + 'getconf/limits.gperf', + 'getconf/unsigned_limits.gperf', + 'getconf/progenv.gperf', + 'getconf/sysconf.gperf', + 'getconf/pathconf.gperf' + ] + ) +) +install_man('getconf/getconf.1') + +executable( + 'getty', + install : true, + sources : [ + 'getty/chat.c', + 'getty/init.c', + 'getty/main.c', + 'getty/subr.c' + ] +) +install_man( + 'getty/getty.8', + 'getty/gettytab.5', + 'getty/ttys.5' +) + +executable('hostinfo', install : true, sources : 'hostinfo/hostinfo.c') +install_man('hostinfo/hostinfo.8') + +executable( + 'iosim', + dependencies : [ core_foundation, iokit ], + include_directories : 'at', + install : true, + sources : 'iosim/iosim.c' +) +install_man('iosim/iosim.1') + +executable( + 'iostat', + dependencies : [ core_foundation, iokit ], + install : true, + sources : 'iostat/iostat.c' +) +install_man('iostat/iostat.8') + +executable( + 'kpgo', + dependencies : [ xnu_private ], + install : true, + sources : 'kpgo/kpgo.c' +) +# No man pages for `kpgo` + +executable( + 'latency', + build_by_default : sdk_version.version_compare('>=12'), + dependencies : ncurses, + install : sdk_version.version_compare('>=12'), + sources : 'latency/latency.c' +) +if sdk_version.version_compare('>=12') + install_man('latency/latency.1') +endif + +executable( + 'login', + # Requires SoftLinking/WeakLinking.h and end-point security entitlements + build_by_default : false, + c_args : '-DUSE_BSM_AUDIT=1', + dependencies : [ openbsm, xnu_private ], + install : false, + sources : [ + 'login/login.c', + 'login/login_audit.c' + ] +) +# install_man('login/login.1') + +executable( + 'lskq', + build_by_default : sdk_version.version_compare('>=12'), + install : sdk_version.version_compare('>=12'), + sources : 'lskq/lskq.c' +) +if sdk_version.version_compare('>=12') + install_man('lskq/lskq.1') +endif + +executable( + 'lsmp', + build_by_default : sdk_version.version_compare('>=12'), + install : sdk_version.version_compare('>=12'), + sources : [ + 'lsmp/lsmp.c', + 'lsmp/port_details.c', + 'lsmp/task_details.c' + ] +) +if sdk_version.version_compare('>=12') + install_man('lsmp/lsmp.1') +endif + +executable( + 'ltop', + install : true, + sources : 'ltop/ltop.c' +) +install_man('ltop/ltop.1') + +executable('mean', install : true, sources : 'mean/mean.c') +# No man pages for `mean`. + +executable( + 'memory_pressure', + dependencies : [ xnu_private ], + install : true, + sources : 'memory_pressure/memory_pressure.c' +) +install_man('memory_pressure/memory_pressure.1') + +executable('mkfile', install : true, sources : 'mkfile/mkfile.c') +install_man('mkfile/mkfile.8') + +executable( + 'mslutil', + build_by_default : sdk_version.version_compare('>=10.13'), + dependencies : [ libmalloc_private ], + install : sdk_version.version_compare('>=10.13'), + sources : 'mslutil/mslutil.c' +) +if sdk_version.version_compare('>=10.13') + install_man('mslutil/mslutil.1') +endif + +executable('newgrp', install : true, sources : 'newgrp/newgrp.c') +install_man('newgrp/newgrp.1') + +executable('nologin', install : true, sources : 'nologin/nologin.c') +install_man( + 'nologin/nologin.5', + 'nologin/nologin.8' +) + +executable( + 'nvram', + c_args : '-DTARGET_OS_BRIDGE=0', + dependencies : [ iokit, libc_private, xnu_private ], + install : true, + sources : 'nvram/nvram.c' +) +install_man('nvram/nvram.8') + +custom_target( + 'pagesize', + command : [ 'cp', '@INPUT@', '@OUTPUT@' ], + install : true, + install_dir : get_option('bindir'), + install_mode : 'r-xr-xr-x', + input : 'pagesize/pagesize.sh', + output : 'pagesize' +) +install_man('pagesize/pagesize.1') + +executable( + 'passwd', + dependencies : [ cfopen_directory, directory_service, open_directory, pam ], + install : true, + sources : [ + 'passwd/file_passwd.c', + 'passwd/nis_passwd.c', + 'passwd/od_passwd.c', + 'passwd/pam_passwd.c', + 'passwd/passwd.c' + ] +) +install_man('passwd/passwd.1') + +executable( + 'proc_uuid_policy', + install : true, + sources : 'proc_uuid_policy/proc_uuid_policy.c' +) +install_man('proc_uuid_policy/proc_uuid_policy.1') + +executable('purge', install : true, sources : 'purge/purge.c') +install_man('purge/purge.8') + +executable( + 'pwd_mkdb', + c_args : [ '-D_PW_NAME_LEN=MAXLOGNAME', '-D_PW_YPTOKEN="__YP!"' ], + install : true, + sources : [ + 'pwd_mkdb/pw_scan.c', + 'pwd_mkdb/pwd_mkdb.c' + ] +) +install_man('pwd_mkdb/pwd_mkdb.8') + +executable( + 'reboot', + # Requires IOKitUser kext APIs + build_by_default : false, + install : false, + sources : 'reboot/reboot.c' +) +# install_man('reboot/reboot.8') + +executable( + 'sa', + c_args : '-DAHZV1', + install : true, + sources : [ + 'sa/db.c', + 'sa/main.c', + 'sa/pdb.c', + 'sa/usrdb.c' + ] +) +install_man('sa/sa.8') + +executable( + 'sc_usage', + build_by_default : sdk_version.version_compare('>=12'), + dependencies : ncurses, + install : sdk_version.version_compare('>=12'), + sources : 'sc_usage/sc_usage.c' +) +if sdk_version.version_compare('>=12') + install_man('sc_usage/sc_usage.1') +endif + +executable('shutdown', + # Requires IOKitUser kext APIs + build_by_default : false, + install : false, + sources : 'shutdown/shutdown.c' +) +# install_man('shutdown/shutdown.8') + +executable( + 'stackshot', + build_by_default : sdk_version.version_compare('>=10.13'), + dependencies : [ xnu_private ], + install : sdk_version.version_compare('>=10.13'), + sources : 'stackshot/stackshot.c' +) +# No man pages for `stackshot`. + +executable('sync', install : true, sources : 'sync/sync.c') +# No man pages for `sync`. + +executable('sysctl', install : true, sources : 'sysctl/sysctl.c') +install_man( + 'sysctl/sysctl.8', + 'sysctl/sysctl.conf.5' +) + +executable( + 'taskpolicy', + build_by_default : sdk_version.version_compare('>=11'), + dependencies : [ xnu_private ], + install : sdk_version.version_compare('>=11'), + sources : 'taskpolicy/taskpolicy.c' +) +if sdk_version.version_compare('>=11') + install_man('taskpolicy/taskpolicy.8') +endif + +executable('vifs', install : true, sources : 'vifs/vifs.c') +install_man('vifs/vifs.8') + +executable( + 'vipw', + install : true, + sources : [ + 'vipw/pw_util.c', + 'vipw/vipw.c' + ] +) +install_man('vipw/vipw.8') + +executable('vm_purgeable_stat', + build_by_default : sdk_version.version_compare('>=11'), + install : sdk_version.version_compare('>=11'), + sources : 'vm_purgeable_stat/vm_purgeable_stat.c' +) +if sdk_version.version_compare('>=11') + install_man('vm_purgeable_stat/vm_purgeable_stat.1') +endif + +executable('vm_stat', install : true, sources : 'vm_stat/vm_stat.c') +install_man('vm_stat/vm_stat.1') + +executable('wait4path', install : true, sources : 'wait4path/wait4path.c') +install_man('wait4path/wait4path.1') + +executable('wordexp-helper', install : true, sources : 'wordexp-helper/wordexp-helper.c') +# No man pages for `wordexp-helper`. + +executable('zdump', include_directories : 'zic', install : true, sources : 'zdump/zdump.c') +install_man('zdump/zdump.8') + +executable('zic', install : true, sources : 'zic/zic.c') +install_man('zic/zic.8') + +executable( + 'zlog', + build_by_default : sdk_version.version_compare('>=11'), + c_args : '-DKERN_NOT_FOUND=56', + dependencies : core_symbolication, + install : sdk_version.version_compare('>=11'), + sources : [ + 'zlog/SymbolicationHelper.c', + 'zlog/zlog.c', + ] +) +if sdk_version.version_compare('>=11') + install_man('zlog/zlog.1') +endif + +executable( + 'zprint', + # Requires IOKitUser kext APIs + build_by_default : false, + dependencies: [ kernel ], + install : false, + sources : 'zprint/zprint.c' +) +# install_man('zprint/zprint.1') + diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.options b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.options new file mode 100644 index 0000000..8c4ce87 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/system_cmds/meson.options @@ -0,0 +1 @@ +option('sdk_version', type : 'string') diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/text_cmds/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/text_cmds/default.nix new file mode 100644 index 0000000..c6fc009 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/text_cmds/default.nix @@ -0,0 +1,34 @@ +{ lib, appleDerivation, xcbuildHook, ncurses, bzip2, zlib, xz }: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ ncurses bzip2 zlib xz ]; + + # patches to use ncursees + # disables md5 + patchPhase = '' + substituteInPlace text_cmds.xcodeproj/project.pbxproj \ + --replace 'FC6C98FB149A94EB00DDCC47 /* libcurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurses.dylib; path = /usr/lib/libcurses.dylib; sourceTree = ""; };' 'FC6C98FB149A94EB00DDCC47 /* libncurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libncurses.dylib; path = /usr/lib/libncurses.dylib; sourceTree = ""; };' \ + --replace 'FC7A7EB5149875E00086576A /* PBXTargetDependency */,' "" + ''; + + installPhase = '' + for f in Products/Release/*; do + if [ -f $f ]; then + install -D $f $out/bin/$(basename $f) + fi + done + ''; + + env.NIX_CFLAGS_COMPILE = toString [ + # hardeningDisable doesn't cut it + "-Wno-error=format-security" + # Required to build with clang 16 + "-Wno-error=deprecated-non-prototype" + ]; + + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/top/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/top/default.nix new file mode 100644 index 0000000..2a47de0 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/top/default.nix @@ -0,0 +1,19 @@ +{xcbuildHook, appleDerivation, apple_sdk, ncurses, libutil, lib}: + +appleDerivation { + nativeBuildInputs = [ xcbuildHook ]; + buildInputs = [ apple_sdk.frameworks.IOKit ncurses libutil ]; + # Workaround build failure on -fno-common toolchains: + # duplicate symbol '_tsamp' in: main.o top.o + env.NIX_CFLAGS_COMPILE = "-fcommon"; + NIX_LDFLAGS = "-lutil"; + installPhase = '' + install -D Products/Release/libtop.a $out/lib/libtop.a + install -D Products/Release/libtop.h $out/include/libtop.h + install -D Products/Release/top $out/bin/top + ''; + meta = { + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/apple-source-releases/xnu/default.nix b/pkgs/by-name/da/darwin/packages/apple-source-releases/xnu/default.nix new file mode 100644 index 0000000..14ede79 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/apple-source-releases/xnu/default.nix @@ -0,0 +1,164 @@ +{ appleDerivation', lib, stdenv, stdenvNoCC, buildPackages +, bootstrap_cmds, bison, flex +, gnum4, unifdef, perl, python3 +, headersOnly ? true +}: + +appleDerivation' (if headersOnly then stdenvNoCC else stdenv) ( + let arch = if stdenv.isx86_64 then "x86_64" else "arm64"; + in + { + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + nativeBuildInputs = [ bootstrap_cmds bison flex gnum4 unifdef perl python3 ]; + + patches = lib.optionals stdenv.isx86_64 [ ./python3.patch ]; + + postPatch = '' + substituteInPlace Makefile \ + --replace "/bin/" "" \ + --replace "MAKEJOBS := " '# MAKEJOBS := ' + + substituteInPlace makedefs/MakeInc.cmd \ + --replace "/usr/bin/" "" \ + --replace "/bin/" "" \ + --replace "-Werror " "" + + substituteInPlace makedefs/MakeInc.def \ + --replace "-c -S -m" "-c -m" + + substituteInPlace makedefs/MakeInc.top \ + --replace "MEMORY_SIZE := " 'MEMORY_SIZE := 1073741824 # ' + + substituteInPlace libkern/kxld/Makefile \ + --replace "-Werror " "" + + substituteInPlace SETUP/kextsymboltool/Makefile \ + --replace "-lstdc++" "-lc++" + + substituteInPlace libsyscall/xcodescripts/mach_install_mig.sh \ + --replace "/usr/include" "/include" \ + --replace "/usr/local/include" "/include" \ + --replace 'MIG=`' "# " \ + --replace 'MIGCC=`' "# " \ + --replace " -o 0" "" \ + --replace '$SRC/$mig' '-I$DSTROOT/include $SRC/$mig' \ + --replace '$SRC/servers/netname.defs' '-I$DSTROOT/include $SRC/servers/netname.defs' \ + --replace '$BUILT_PRODUCTS_DIR/mig_hdr' '$BUILT_PRODUCTS_DIR' \ + --replace 'MACHINE_ARCH=armv7' 'MACHINE_ARCH=arm64' # this might break the comments saying 32-bit is required + + patchShebangs . + '' + lib.optionalString stdenv.isAarch64 '' + # iig is closed-sourced, we don't have it + # create an empty file to the header instead + # this line becomes: echo "" > $@; echo --header ... + substituteInPlace iokit/DriverKit/Makefile \ + --replace '--def $<' '> $@; echo' + ''; + + PLATFORM = "MacOSX"; + SDKVERSION = "10.11"; + CC = "${stdenv.cc.targetPrefix or ""}cc"; + CXX = "${stdenv.cc.targetPrefix or ""}c++"; + MIG = "mig"; + MIGCOM = "migcom"; + STRIP = "${stdenv.cc.bintools.targetPrefix or ""}strip"; + RANLIB = "${stdenv.cc.bintools.targetPrefix or ""}ranlib"; + NM = "${stdenv.cc.bintools.targetPrefix or ""}nm"; + UNIFDEF = "unifdef"; + DSYMUTIL = "dsymutil"; + HOST_OS_VERSION = "10.10"; + HOST_CC = "${buildPackages.stdenv.cc.targetPrefix or ""}cc"; + HOST_FLEX = "flex"; + HOST_BISON = "bison"; + HOST_GM4 = "m4"; + MIGCC = "cc"; + ARCHS = arch; + ARCH_CONFIGS = arch; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + preBuild = let macosVersion = + "10.0 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11" + + lib.optionalString stdenv.isAarch64 " 10.12 10.13 10.14 10.15 11.0"; + in '' + # This is a bit of a hack... + mkdir -p sdk/usr/local/libexec + + cat > sdk/usr/local/libexec/availability.pl < 0 ) { +- if ( !platforms().minOS(ld::version2008) ) +- throw "-rpath can only be used when targeting Mac OS X 10.5 or later"; +- switch ( fOutputKind ) { +- case Options::kDynamicExecutable: +- case Options::kDynamicLibrary: +- case Options::kDynamicBundle: +- break; +- case Options::kStaticExecutable: +- case Options::kObjectFile: +- case Options::kDyld: +- case Options::kPreload: +- case Options::kKextBundle: +- throw "-rpath can only be used when creating a dynamic final linked image"; +- } +- } +- + if ( fPositionIndependentExecutable ) { + switch ( fOutputKind ) { + case Options::kDynamicExecutable: diff --git a/pkgs/by-name/da/darwin/packages/cctools/llvm.nix b/pkgs/by-name/da/darwin/packages/cctools/llvm.nix new file mode 100644 index 0000000..f2986bf --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/cctools/llvm.nix @@ -0,0 +1,113 @@ +# Create a cctools-compatible bintools that uses equivalent tools from LLVM in place of the ones +# from cctools when possible. + +{ lib, stdenv, makeWrapper, cctools-port, llvmPackages, enableManpages ? stdenv.targetPlatform == stdenv.hostPlatform }: + +let + inherit (stdenv) targetPlatform hostPlatform; + + cctoolsVersion = lib.getVersion cctools-port; + llvmVersion = llvmPackages.release_version; + + # `bitcode_strip` is not available until LLVM 12. + useLLVMBitcodeStrip = lib.versionAtLeast llvmVersion "12"; + + # A compatible implementation of `otool` was not added until LLVM 13. + useLLVMOtool = lib.versionAtLeast llvmVersion "13"; + + # Older versions of `strip` cause problems for the version of `codesign_allocate` available in + # the version of cctools in nixpkgs. The version of `codesign_allocate` in cctools-1005.2 does + # not appear to have issues, but the source is not available yet (as of June 2023). + useLLVMStrip = lib.versionAtLeast llvmVersion "15" || lib.versionAtLeast cctoolsVersion "1005.2"; + + # Clang 11 performs an optimization on x86_64 that is sensitive to the presence of debug info. + # This causes GCC to fail to bootstrap due to object file differences between stages 2 and 3. + useClangAssembler = lib.versionAtLeast llvmVersion "12" || !stdenv.isx86_64; + + llvm_bins = [ + "dwarfdump" + "nm" + "objdump" + "size" + "strings" + ] + ++ lib.optional useLLVMBitcodeStrip "bitcode-strip" + ++ lib.optional useLLVMOtool "otool" + ++ lib.optional useLLVMStrip "strip"; + + # Only include the tools that LLVM doesn’t provide and that are present normally on Darwin. + # The only exceptions are the following tools, which should be reevaluated when LLVM is bumped. + # - install_name_tool (llvm-objcopy): unrecognized linker commands when building open source CF; + # - libtool (llvm-libtool-darwin): not fully compatible when used with xcbuild; and + # - lipo (llvm-lipo): crashes when running the LLVM test suite. + cctools_bins = [ + "cmpdylib" + "codesign_allocate" + "ctf_insert" + "install_name_tool" + "ld" + "libtool" + "lipo" + "nmedit" + "pagestuff" + "ranlib" + "segedit" + "vtool" + ] + ++ lib.optional (!useLLVMBitcodeStrip) "bitcode_strip" + ++ lib.optional (!useLLVMOtool) "otool" + ++ lib.optional (!useLLVMStrip) "strip" + ++ lib.optional (!useClangAssembler) "as"; + + targetPrefix = lib.optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-"; + + linkManPages = pkg: source: target: lib.optionalString enableManpages '' + sourcePath=${pkg}/share/man/man1/${source}.1.gz + targetPath=$man/share/man/man1/${target}.1.gz + + if [ -f "$sourcePath" ]; then + mkdir -p "$(dirname "$targetPath")" + ln -s "$sourcePath" "$targetPath" + fi + ''; +in +stdenv.mkDerivation { + pname = "cctools-llvm"; + version = "${llvmVersion}-${cctoolsVersion}"; + + nativeBuildInputs = [ makeWrapper ]; + + # The `man` output has to be included unconditionally because darwin.binutils expects it. + outputs = [ "out" "dev" "man" ]; + + buildCommand = '' + mkdir -p "$out/bin" "$man" + ln -s ${lib.getDev cctools-port} "$dev" + + '' + lib.optionalString useClangAssembler '' + # Use the clang-integrated assembler instead of using `as` from cctools. + makeWrapper "${lib.getBin llvmPackages.clang-unwrapped}/bin/clang" "$out/bin/${targetPrefix}as" \ + --add-flags "-x assembler -integrated-as -c" + + '' + '' + ln -s "${lib.getBin llvmPackages.bintools-unwrapped}/bin/${targetPrefix}llvm-ar" "$out/bin/${targetPrefix}ar" + ${linkManPages llvmPackages.llvm-manpages "llvm-ar" "ar"} + + for tool in ${toString llvm_bins}; do + cctoolsTool=''${tool/-/_} + ln -s "${lib.getBin llvmPackages.llvm}/bin/llvm-$tool" "$out/bin/${targetPrefix}$cctoolsTool" + ${linkManPages llvmPackages.llvm-manpages "llvm-$tool" "$cctoolsTool"} + done + + for tool in ${toString cctools_bins}; do + ln -s "${lib.getBin cctools-port}/bin/${targetPrefix}$tool" "$out/bin/${targetPrefix}$tool" + ${linkManPages (lib.getMan cctools-port) "$tool" "$tool"} + done + + ${linkManPages (lib.getMan cctools-port) "ld64" "ld64"} + ${lib.optionalString (!useLLVMOtool) # The actual man page for otool in cctools is llvm-otool + (linkManPages (lib.getMan cctools-port) "llvm-otool" "llvm-otool")} + ''; + + passthru = { inherit targetPrefix; }; +} diff --git a/pkgs/by-name/da/darwin/packages/cctools/port.nix b/pkgs/by-name/da/darwin/packages/cctools/port.nix new file mode 100644 index 0000000..377d84d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/cctools/port.nix @@ -0,0 +1,192 @@ +{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, autoreconfHook, memstreamHook +, installShellFiles +, libuuid +, libobjc ? null, maloader ? null +, enableTapiSupport ? true, libtapi +, fetchpatch +}: + +let + + # The targetPrefix prepended to binary names to allow multiple binuntils on the + # PATH to both be usable. + targetPrefix = lib.optionalString + (stdenv.targetPlatform != stdenv.hostPlatform) + "${stdenv.targetPlatform.config}-"; +in + +# Non-Darwin alternatives +assert (!stdenv.hostPlatform.isDarwin) -> maloader != null; + +stdenv.mkDerivation { + pname = "${targetPrefix}cctools-port"; + version = "973.0.1"; + + src = fetchFromGitHub { + owner = "tpoechtrager"; + repo = "cctools-port"; + # This is the commit before: https://github.com/tpoechtrager/cctools-port/pull/114 + # That specific change causes trouble for us (see the PR discussion), but + # is also currently the last commit on master at the time of writing, so we + # can just go back one step. + rev = "457dc6ddf5244ebf94f28e924e3a971f1566bd66"; + sha256 = "0ns12q7vg9yand4dmdsps1917cavfbw67yl5q7bm6kb4ia5kkx13"; + }; + + outputs = [ "out" "dev" "man" ]; + + nativeBuildInputs = [ autoconf automake libtool autoreconfHook installShellFiles ] + ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [ memstreamHook ]; + buildInputs = [ libuuid ] + ++ lib.optionals stdenv.isDarwin [ libobjc ] + ++ lib.optional enableTapiSupport libtapi; + + patches = [ + ./ld-ignore-rpath-link.patch + ./ld-rpath-nonfinal.patch + (fetchpatch { + url = "https://github.com/tpoechtrager/cctools-port/commit/4a734070cd2838e49658464003de5b92271d8b9e.patch"; + hash = "sha256-72KaJyu7CHXxJJ1GNq/fz+kW1RslO3UaKI91LhBtiXA="; + }) + (fetchpatch { + url = "https://github.com/MercuryTechnologies/cctools-port/commit/025899b7b3593dedb0c681e689e57c0e7bbd9b80.patch"; + hash = "sha256-SWVUzFaJHH2fu9y8RcU3Nx/QKx60hPE5zFx0odYDeQs="; + }) + # Always use `open_memstream`. This is provided by memstream via hook on x86_64-darwin. + ./darwin-memstream.patch + ]; + + __propagatedImpureHostDeps = [ + # As far as I can tell, otool from cctools is the only thing that depends on these two, and we should fix them + "/usr/lib/libobjc.A.dylib" + "/usr/lib/libobjc.dylib" + ]; + + enableParallelBuilding = true; + + # TODO(@Ericson2314): Always pass "--target" and always targetPrefix. + configurePlatforms = [ "build" "host" ] + ++ lib.optional (stdenv.targetPlatform != stdenv.hostPlatform) "target"; + configureFlags = [ "--disable-clang-as" ] + ++ lib.optionals enableTapiSupport [ + "--enable-tapi-support" + "--with-libtapi=${libtapi}" + ]; + + postPatch = lib.optionalString stdenv.hostPlatform.isDarwin '' + substituteInPlace cctools/Makefile.am --replace libobjc2 "" + '' + '' + sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp + + # FIXME: there are far more absolute path references that I don't want to fix right now + substituteInPlace cctools/configure.ac \ + --replace "-isystem /usr/local/include -isystem /usr/pkg/include" "" \ + --replace "-L/usr/local/lib" "" \ + + # Appears to use new libdispatch API not available in macOS SDK 10.12. + substituteInPlace cctools/ld64/src/ld/libcodedirectory.c \ + --replace "#define LIBCD_PARALLEL 1" "" + + patchShebangs tools + sed -i -e 's/which/type -P/' tools/*.sh + + cd cctools + ''; + + preInstall = '' + installManPage ar/ar.{1,5} + + # The makefile rules for installing headers are missing in 973.0.1. + # The below is derived from 949.0.1. + mkdir -p $dev/include/mach-o/i386 + mkdir -p $dev/include/mach-o/ppc + mkdir -p $dev/include/mach-o/x86_64 + mkdir -p $dev/include/mach-o/arm + mkdir -p $dev/include/mach-o/arm64 + mkdir -p $dev/include/mach-o/m68k + mkdir -p $dev/include/mach-o/sparc + mkdir -p $dev/include/mach-o/hppa + mkdir -p $dev/include/mach-o/i860 + mkdir -p $dev/include/mach-o/m88k + mkdir -p $dev/include/dyld + mkdir -p $dev/include/cbt + + pushd include/mach-o + install -c -m 444 arch.h ldsyms.h reloc.h \ + stab.h loader.h fat.h swap.h getsect.h nlist.h \ + ranlib.h $dev/include/mach-o + popd + + pushd include/mach-o/i386 + install -c -m 444 swap.h \ + $dev/include/mach-o/i386 + popd + + pushd include/mach-o/ppc + install -c -m 444 reloc.h swap.h \ + $dev/include/mach-o/ppc + popd + + pushd include/mach-o/x86_64 + install -c -m 444 reloc.h \ + $dev/include/mach-o/x86_64 + popd + + pushd include/mach-o/arm + install -c -m 444 reloc.h \ + $dev/include/mach-o/arm + popd + + pushd include/mach-o/arm64 + install -c -m 444 reloc.h \ + $dev/include/mach-o/arm64 + popd + + pushd include/mach-o/m68k + install -c -m 444 swap.h \ + $dev/include/mach-o/m68k + popd + + pushd include/mach-o/sparc + install -c -m 444 reloc.h swap.h \ + $dev/include/mach-o/sparc + popd + + pushd include/mach-o/hppa + install -c -m 444 reloc.h swap.h \ + $dev/include/mach-o/hppa + popd + + pushd include/mach-o/i860 + install -c -m 444 reloc.h swap.h \ + $dev/include/mach-o/i860 + popd + + pushd include/mach-o/m88k + install -c -m 444 reloc.h swap.h \ + $dev/include/mach-o/m88k + popd + + pushd include/stuff + install -c -m 444 bool.h \ + $dev/include/dyld + popd + + pushd include/cbt + install -c -m 444 libsyminfo.h \ + $dev/include/cbt + popd + ''; + + passthru = { + inherit targetPrefix; + }; + + meta = { + broken = !stdenv.targetPlatform.isDarwin; # Only supports darwin targets + homepage = "http://www.opensource.apple.com/source/cctools/"; + description = "MacOS Compiler Tools (cross-platform port)"; + license = lib.licenses.apple-psl20; + maintainers = with lib.maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/darwin-stubs/default.nix b/pkgs/by-name/da/darwin/packages/darwin-stubs/default.nix new file mode 100644 index 0000000..6e34394 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/darwin-stubs/default.nix @@ -0,0 +1,18 @@ +{ stdenvNoCC, fetchurl }: + +stdenvNoCC.mkDerivation { + pname = "darwin-stubs"; + version = "10.12"; + + src = fetchurl { + url = "https://github.com/NixOS/darwin-stubs/releases/download/v20201216/10.12.tar.gz"; + sha256 = "1fyd3xig7brkzlzp0ql7vyfj5sp8iy56kgp548mvicqdyw92adgm"; + }; + + dontBuild = true; + + installPhase = '' + mkdir $out + mv * $out + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/discrete-scroll/default.nix b/pkgs/by-name/da/darwin/packages/discrete-scroll/default.nix new file mode 100644 index 0000000..f38bf8d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/discrete-scroll/default.nix @@ -0,0 +1,36 @@ +{ stdenv, lib, fetchFromGitHub, Cocoa }: + +## after launching for the first time, grant access for parent application (e.g. Terminal.app) +## from 'system preferences >> security & privacy >> accessibility' +## and then launch again + +stdenv.mkDerivation rec { + pname = "discrete-scroll"; + version = "0.1.1"; + + src = fetchFromGitHub { + owner = "emreyolcu"; + repo = "discrete-scroll"; + rev = "v${version}"; + sha256 = "0aqkp4kkwjlkll91xbqwf8asjww8ylsdgqvdk8d06bwdvg2cgvhg"; + }; + + buildInputs = [ Cocoa ]; + + buildPhase = '' + cc -std=c99 -O3 -Wall -framework Cocoa -o dc DiscreteScroll/main.m + ''; + + installPhase = '' + mkdir -p $out/bin + cp ./dc $out/bin/discretescroll + ''; + + meta = with lib; { + description = "Fix for OS X's scroll wheel problem"; + homepage = "https://github.com/emreyolcu/discrete-scroll"; + platforms = platforms.darwin; + license = licenses.mit; + maintainers = with lib.maintainers; [ bb2020 ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/impure-cmds/default.nix b/pkgs/by-name/da/darwin/packages/impure-cmds/default.nix new file mode 100644 index 0000000..51e345f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/impure-cmds/default.nix @@ -0,0 +1,34 @@ +{ lib, runCommandLocal }: + +# On darwin, there are some commands neither opensource nor able to build in nixpkgs. +# We have no choice but to use those system-shipped impure ones. + +let + commands = { + ditto = "/usr/bin/ditto"; # ditto is not opensource + sudo = "/usr/bin/sudo"; # sudo must be owned by uid 0 and have the setuid bit set + }; + + mkImpureDrv = name: path: + runCommandLocal "${name}-impure-darwin" { + __impureHostDeps = [ path ]; + + meta = { + platforms = lib.platforms.darwin; + }; + } '' + if ! [ -x ${path} ]; then + echo Cannot find command ${path} + exit 1 + fi + + mkdir -p $out/bin + ln -s ${path} $out/bin + + manpage="/usr/share/man/man1/${name}.1" + if [ -f $manpage ]; then + mkdir -p $out/share/man/man1 + ln -s $manpage $out/share/man/man1 + fi + ''; +in lib.mapAttrs mkImpureDrv commands diff --git a/pkgs/by-name/da/darwin/packages/ios-deploy/default.nix b/pkgs/by-name/da/darwin/packages/ios-deploy/default.nix new file mode 100644 index 0000000..c405ac8 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/ios-deploy/default.nix @@ -0,0 +1,62 @@ +{ lib +, stdenv +, fetchFromGitHub +, darwin +, testers +}: + +let + privateFrameworks = "/Library/Apple/System/Library/PrivateFrameworks"; +in +stdenv.mkDerivation (finalAttrs: { + pname = "ios-deploy"; + version = "1.12.2"; + + src = fetchFromGitHub { + owner = "ios-control"; + repo = "ios-deploy"; + rev = finalAttrs.version; + hash = "sha256-TVGC+f+1ow3b93CK3PhIL70le5SZxxb2ug5OkIg8XCA="; + }; + + buildInputs = [ + darwin.apple_sdk.frameworks.Foundation + ]; + + buildPhase = '' + runHook preBuild + + awk '{ print "\""$0"\\n\""}' src/scripts/lldb.py >> src/ios-deploy/lldb.py.h + clang src/ios-deploy/ios-deploy.m \ + -framework Foundation \ + -F${privateFrameworks} -framework MobileDevice \ + -o ios-deploy + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -Dm755 ios-deploy $out/bin/ios-deploy + + runHook postInstall + ''; + + __impureHostDeps = [ + privateFrameworks + ]; + + passthru.tests.version = testers.testVersion { + package = finalAttrs.finalPackage; + }; + + meta = { + description = "Install and debug iPhone apps from the command line, without using Xcode"; + homepage = "https://github.com/ios-control/ios-deploy"; + license = lib.licenses.gpl3Plus; + mainProgram = "ios-deploy"; + maintainers = with lib.maintainers; [ wegank ]; + platforms = lib.platforms.darwin; + }; +}) diff --git a/pkgs/by-name/da/darwin/packages/iproute2mac/default.nix b/pkgs/by-name/da/darwin/packages/iproute2mac/default.nix new file mode 100644 index 0000000..a7f1f0b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/iproute2mac/default.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchFromGitHub, darwin, python3 }: + +stdenv.mkDerivation rec { + version = "1.4.1"; + pname = "iproute2mac"; + + src = fetchFromGitHub { + owner = "brona"; + repo = "iproute2mac"; + rev = "v${version}"; + sha256 = "sha256-MaL8eb9UOZ71BL4Jvc6Od+EJ+F6j96n9a+vRnHeveIU="; + }; + + buildInputs = [ python3 ]; + + postPatch = '' + substituteInPlace src/ip.py \ + --replace /sbin/ifconfig ${darwin.network_cmds}/bin/ifconfig \ + --replace /sbin/route ${darwin.network_cmds}/bin/route \ + --replace /usr/sbin/netstat ${darwin.network_cmds}/bin/netstat \ + --replace /usr/sbin/ndp ${darwin.network_cmds}/bin/ndp \ + --replace /usr/sbin/arp ${darwin.network_cmds}/bin/arp \ + --replace /usr/sbin/networksetup ${darwin.network_cmds}/bin/networksetup + ''; + installPhase = '' + mkdir -p $out/bin + install -D -m 755 src/ip.py $out/bin/ip + ''; + + meta = with lib; { + homepage = "https://github.com/brona/iproute2mac"; + description = "CLI wrapper for basic network utilites on Mac OS X inspired with iproute2 on Linux systems - ip command."; + license = licenses.mit; + maintainers = with maintainers; [ jiegec ]; + platforms = platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/libtapi/default.nix b/pkgs/by-name/da/darwin/packages/libtapi/default.nix new file mode 100644 index 0000000..cb6b3cf --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/libtapi/default.nix @@ -0,0 +1,75 @@ +{ lib, stdenv, fetchFromGitHub, pkgsBuildBuild, cmake, python3, ncurses }: + +stdenv.mkDerivation (finalAttrs: { + pname = "libtapi"; + version = "1100.0.11"; # determined by looking at VERSION.txt + + src = fetchFromGitHub { + owner = "tpoechtrager"; + repo = "apple-libtapi"; + rev = "664b8414f89612f2dfd35a9b679c345aa5389026"; + sha256 = "1y1yl46msabfy14z0rln333a06087bk14f5h7q1cdawn8nmvbdbr"; + }; + + sourceRoot = "${finalAttrs.src.name}/src/llvm"; + + # Backported from newer llvm, fixes configure error when cross compiling. + # Also means we don't have to manually fix the result with install_name_tool. + patches = [ + ./disable-rpath.patch + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # TODO: make unconditional and rebuild the world + # TODO: send upstream + ./native-clang-tblgen.patch + ]; + + nativeBuildInputs = [ cmake python3 ]; + + # ncurses is required here to avoid a reference to bootstrap-tools, which is + # not allowed for the stdenv. + buildInputs = [ ncurses ]; + + cmakeFlags = [ "-DLLVM_INCLUDE_TESTS=OFF" ] + ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "-DCMAKE_CROSSCOMPILING=True" + # This package could probably have a llvm_6 llvm-tblgen and clang-tblgen + # provided to reduce some building. This package seems intended to + # include all of its dependencies, including enough of LLVM to build the + # required tablegens. + ( + let + nativeCC = pkgsBuildBuild.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=${lib.concatStringsSep ";" nativeToolchainFlags}" + ) + ]; + + # fixes: fatal error: 'clang/Basic/Diagnostic.h' file not found + # adapted from upstream + # https://github.com/tpoechtrager/apple-libtapi/blob/3cb307764cc5f1856c8a23bbdf3eb49dfc6bea48/build.sh#L58-L60 + preConfigure = '' + INCLUDE_FIX="-I $PWD/projects/clang/include" + INCLUDE_FIX+=" -I $PWD/build/projects/clang/include" + + cmakeFlagsArray+=(-DCMAKE_CXX_FLAGS="$INCLUDE_FIX") + ''; + + buildFlags = [ "clangBasic" "libtapi" "tapi" ]; + + installTargets = [ "install-libtapi" "install-tapi-headers" "install-tapi" ]; + + meta = with lib; { + description = "Replaces the Mach-O Dynamic Library Stub files in Apple's SDKs to reduce the size"; + mainProgram = "tapi"; + homepage = "https://github.com/tpoechtrager/apple-libtapi"; + license = licenses.ncsa; + maintainers = with maintainers; [ matthewbauer ]; + }; +}) diff --git a/pkgs/by-name/da/darwin/packages/libtapi/disable-rpath.patch b/pkgs/by-name/da/darwin/packages/libtapi/disable-rpath.patch new file mode 100644 index 0000000..87c0cf3 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/libtapi/disable-rpath.patch @@ -0,0 +1,14 @@ +diff --git a/src/llvm/cmake/modules/AddLLVM.cmake b/src/llvm/cmake/modules/AddLLVM.cmake +index a53016eb0..b65e608a4 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -1683,8 +1683,7 @@ function(llvm_setup_rpath name) + endif() + + if (APPLE) +- set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib" ${extra_libdir}) ++ set(_install_name_dir) + elseif(UNIX) + set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") diff --git a/pkgs/by-name/da/darwin/packages/libtapi/native-clang-tblgen.patch b/pkgs/by-name/da/darwin/packages/libtapi/native-clang-tblgen.patch new file mode 100644 index 0000000..9b71576 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/libtapi/native-clang-tblgen.patch @@ -0,0 +1,21 @@ +diffprojects/libtapi/CMakeLists.txt b/src/llvm/projects/libtapi/CMakeLists.txt +index 8ee6d8138..8277be147 100644 +--- a/projects/libtapi/CMakeLists.txt ++++ b/projects/libtapi/CMakeLists.txt +@@ -193,7 +193,15 @@ if (NOT DEFINED CLANG_VERSION) + set(CLANG_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}") + endif () + if (NOT DEFINED CLANG_TABLEGEN_EXE) +- set(CLANG_TABLEGEN_EXE "${LLVM_TOOLS_BINARY_DIR}/clang-tblgen") ++ if(LLVM_USE_HOST_TOOLS) ++ if (NOT CMAKE_CONFIGURATION_TYPES) ++ set(CLANG_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/bin/clang-tblgen") ++ else() ++ set(CLANG_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/Release/bin/clang-tblgen") ++ endif() ++ else() ++ set(CLANG_TABLEGEN_EXE "${LLVM_TOOLS_BINARY_DIR}/clang-tblgen") ++ endif () + endif () + + # Include must go first. diff --git a/pkgs/by-name/da/darwin/packages/lsusb/default.nix b/pkgs/by-name/da/darwin/packages/lsusb/default.nix new file mode 100644 index 0000000..712e32f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/lsusb/default.nix @@ -0,0 +1,28 @@ +{ lib, stdenv, fetchFromGitHub }: + +stdenv.mkDerivation { + version = "1.0"; + pname = "lsusb"; + + src = fetchFromGitHub { + owner = "jlhonora"; + repo = "lsusb"; + rev = "8a6bd7084a55a58ade6584af5075c1db16afadd1"; + sha256 = "0p8pkcgvsx44dd56wgipa8pzi3298qk9h4rl9pwsw1939hjx6h0g"; + }; + + installPhase = '' + mkdir -p $out/bin + mkdir -p $out/share/man/man8 + install -m 0755 lsusb $out/bin + install -m 0444 man/lsusb.8 $out/share/man/man8 + ''; + + meta = { + homepage = "https://github.com/jlhonora/lsusb"; + description = "lsusb command for Mac OS X"; + platforms = lib.platforms.darwin; + license = lib.licenses.mit; + maintainers = [ lib.maintainers.varunpatro ]; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/moltenvk/default.nix b/pkgs/by-name/da/darwin/packages/moltenvk/default.nix new file mode 100644 index 0000000..1324bde --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/moltenvk/default.nix @@ -0,0 +1,208 @@ +{ + lib, + stdenv, + fetchFromGitHub, + gitUpdater, + cereal, + libcxx, + glslang, + simd, + spirv-cross, + spirv-headers, + spirv-tools, + vulkan-headers, + xcbuild, + AppKit, + Foundation, + Metal, + QuartzCore, + # MoltenVK supports using private APIs to implement some Vulkan functionality. + # Applications that use private APIs can’t be distributed on the App Store, + # but that’s not really a concern for nixpkgs, so use them by default. + # See: https://github.com/KhronosGroup/MoltenVK/blob/main/README.md#metal_private_api + enablePrivateAPIUsage ? true, +}: + +let + inherit (stdenv.hostPlatform) isStatic; +in +stdenv.mkDerivation (finalAttrs: { + pname = "MoltenVK"; + version = "1.2.8"; + + buildInputs = [ + AppKit + Foundation + Metal + QuartzCore + cereal + glslang + simd + spirv-cross + spirv-headers + spirv-tools + vulkan-headers + ]; + + nativeBuildInputs = [ xcbuild ]; + + outputs = [ + "out" + "bin" + "dev" + ]; + + src = fetchFromGitHub { + owner = "KhronosGroup"; + repo = "MoltenVK"; + rev = "v${finalAttrs.version}"; + hash = "sha256-nsNN2iCSjXzfarSdaNmeNbfDliUBMQMsb0rXEENWJqw="; + }; + + postPatch = '' + # Move `mvkGitRevDerived.h` to a stable location + substituteInPlace Scripts/gen_moltenvk_rev_hdr.sh \ + --replace-fail '$'''{BUILT_PRODUCTS_DIR}' "$NIX_BUILD_TOP/$sourceRoot/build/include" \ + --replace-fail '$(git rev-parse HEAD)' ${finalAttrs.src.rev} + + # Modify MoltenVK Xcode projects to build with xcbuild and dependencies from nixpkgs. + for proj in MoltenVK MoltenVKShaderConverter; do + # Remove xcframework dependencies from the Xcode projects. The basic format is: + # (children|files) = ( + # DCFD7F822A45BDA0007BBBF7 /* SPIRVCross.xcframework in Frameworks */, + # etc + # ) + # This regex will only remove lines matching `xcframework` that are in these blocks + # to avoid accidentally corrupting the project. + sed -E -e '/(children|files) = /,/;/{/xcframework/d}' \ + -i "$proj/$proj.xcodeproj/project.pbxproj" + # Ensure the namespace used is consistent with the spirv-cross package in nixpkgs. + substituteInPlace "$proj/$proj.xcodeproj/project.pbxproj" \ + --replace-fail SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross SPIRV_CROSS_NAMESPACE_OVERRIDE=spirv_cross + done + substituteInPlace MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj \ + --replace-fail MetalGLShaderConverterTool MoltenVKShaderConverter \ + --replace-fail MetalGLShaderConverter-macOS MoltenVKShaderConverter + + # Don’t try to build `xcframework`s because `xcbuild` can’t build them. + sed -e '/xcframework/d' -i Scripts/package_all.sh + + # Remove vendored dependency links. + find . -lname '*/External/*' -delete + + # The library will be linked in the install phase regardless of version, + # so truncate it if it exists to avoid link failures. + test -f Scripts/create_dylib.sh && truncate --size 0 Scripts/create_dylib.sh + + # Link glslang source because MoltenVK needs non-public headers to build. + mkdir -p build/include + ln -s "${glslang.src}" "build/include/glslang" + ''; + + env.NIX_CFLAGS_COMPILE = toString ( + [ + "-isystem ${lib.getDev libcxx}/include/c++/v1" + "-I${lib.getDev spirv-cross}/include/spirv_cross" + "-I${lib.getDev spirv-headers}/include/spirv/unified1" + ] + ++ lib.optional enablePrivateAPIUsage "-DMVK_USE_METAL_PRIVATE_API=1" + ); + + env.NIX_LDFLAGS = toString [ + "-lMachineIndependent" + "-lGenericCodeGen" + "-lglslang" + "-lOSDependent" + "-lSPIRV" + "-lSPIRV-Tools" + "-lSPIRV-Tools-opt" + "-lspirv-cross-msl" + "-lspirv-cross-core" + "-lspirv-cross-glsl" + "-lspirv-cross-reflect" + ]; + + buildPhase = '' + runHook preBuild + + NIX_CFLAGS_COMPILE+=" \ + -I$NIX_BUILD_TOP/$sourceRoot/build/include \ + -I$NIX_BUILD_TOP/$sourceRoot/Common" + + xcodebuild build \ + SYMROOT=$PWD/Products OBJROOT=$PWD/Intermedates \ + -jobs $NIX_BUILD_CORES \ + -configuration Release \ + -project MoltenVKPackaging.xcodeproj \ + -scheme 'MoltenVK Package (macOS only)' \ + -destination generic/platform=macOS \ + -arch ${stdenv.hostPlatform.darwinArch} + + runHook postBuild + ''; + + postBuild = + if isStatic then + '' + mkdir -p Package/Release/MoltenVK/static + cp Products/Release/libMoltenVK.a Package/Release/MoltenVK/static + '' + else + '' + # MoltenVK’s Xcode project builds the dylib, but it doesn’t seem to work with + # xcbuild. This is based on the script versions prior to 1.2.8 used. + mkdir -p Package/Release/MoltenVK/dynamic/dylib + clang++ -Wl,-all_load -Wl,-w \ + -dynamiclib \ + -compatibility_version 1.0.0 -current_version 1.0.0 \ + -LProducts/Release \ + -framework AppKit \ + -framework CoreGraphics \ + -framework Foundation \ + -framework IOKit \ + -framework IOSurface \ + -framework Metal \ + -framework QuartzCore \ + -lobjc \ + -lMoltenVKShaderConverter \ + -lspirv-cross-reflect \ + -install_name "$out/lib/libMoltenVK.dylib" \ + -o Package/Release/MoltenVK/dynamic/dylib/libMoltenVK.dylib \ + -force_load Products/Release/libMoltenVK.a + ''; + + installPhase = '' + runHook preInstall + + libraryExtension=${if isStatic then ".a" else ".dylib"} + packagePath=${if isStatic then "static" else "dynamic/dylib"} + + mkdir -p "$out/lib" "$out/share/vulkan/icd.d" "$bin/bin" "$dev" + + cp Package/Release/MoltenVKShaderConverter/Tools/MoltenVKShaderConverter "$bin/bin" + cp -r Package/Release/MoltenVK/include "$dev" + cp Package/Release/MoltenVK/$packagePath/libMoltenVK$libraryExtension "$out/lib" + + # Install ICD definition for use with vulkan-loader. + install -m644 MoltenVK/icd/MoltenVK_icd.json \ + "$out/share/vulkan/icd.d/MoltenVK_icd.json" + substituteInPlace "$out/share/vulkan/icd.d/MoltenVK_icd.json" \ + --replace-fail ./libMoltenVK.dylib "$out/lib/libMoltenVK.dylib" + + runHook postInstall + ''; + + passthru.updateScript = gitUpdater { + rev-prefix = "v"; + ignoredVersions = ".*-(beta|rc).*"; + }; + + meta = { + description = "A Vulkan Portability implementation built on top of Apple’s Metal API"; + homepage = "https://github.com/KhronosGroup/MoltenVK"; + changelog = "https://github.com/KhronosGroup/MoltenVK/releases"; + maintainers = [ lib.maintainers.reckenrode ]; + license = lib.licenses.asl20; + platforms = lib.platforms.darwin; + }; +}) diff --git a/pkgs/by-name/da/darwin/packages/openwith/default.nix b/pkgs/by-name/da/darwin/packages/openwith/default.nix new file mode 100644 index 0000000..eb78f7a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/openwith/default.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchFromGitHub, swift, AppKit, Foundation, UniformTypeIdentifiers }: + +let + arch = if stdenv.isAarch64 then "arm64" else "x86_64"; +in +stdenv.mkDerivation rec { + pname = "openwith"; + version = "unstable-2022-10-28"; + + src = fetchFromGitHub { + owner = "jdek"; + repo = "openwith"; + rev = "a8a99ba0d1cabee7cb470994a1e2507385c30b6e"; + hash = "sha256-lysleg3qM2MndXeKjNk+Y9Tkk40urXA2ZdxY5KZNANo="; + }; + + nativeBuildInputs = [ swift ]; + + buildInputs = [ AppKit Foundation UniformTypeIdentifiers ]; + + makeFlags = [ "openwith_${arch}" ]; + + installPhase = '' + runHook preInstall + install openwith_${arch} -D $out/bin/openwith + runHook postInstall + ''; + + meta = with lib; { + description = "Utility to specify which application bundle should open specific file extensions"; + homepage = "https://github.com/jdek/openwith"; + license = licenses.unlicense; + maintainers = with maintainers; [ zowoq ]; + platforms = [ "aarch64-darwin" "x86_64-darwin" ]; + broken = stdenv.isx86_64; # https://hydra.nixos.org/build/219354133/nixlog/3 + }; +} diff --git a/pkgs/by-name/da/darwin/packages/print-reexports/default.nix b/pkgs/by-name/da/darwin/packages/print-reexports/default.nix new file mode 100644 index 0000000..992cf1b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/print-reexports/default.nix @@ -0,0 +1,18 @@ +{ lib, stdenv, libyaml }: + +stdenv.mkDerivation { + name = "print-reexports"; + src = lib.sourceFilesBySuffices ./. [".c"]; + + buildInputs = [ libyaml ]; + + buildPhase = '' + $CC -lyaml -o print-reexports main.c + ''; + + installPhase = '' + mkdir -p $out/bin + mv print-reexports $out/bin + ''; + meta.mainProgram = "print-reexports"; +} diff --git a/pkgs/by-name/da/darwin/packages/print-reexports/main.c b/pkgs/by-name/da/darwin/packages/print-reexports/main.c new file mode 100644 index 0000000..e6ff527 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/print-reexports/main.c @@ -0,0 +1,213 @@ +/** + * Display the list of re-exported libraries from a TAPI v2 .tbd file, one per + * line on stdout. + * + * TAPI files are the equivalent of library files for the purposes of linking. + * Like dylib files, they may re-export other libraries. In upstream usage + * these refer to the absolute paths of dylibs, and are resolved to .tbd files + * in combination with the syslibroot option. In nixpkgs, the .tbd files refer + * directly to other .tbd files without a syslibroot. Note that each .tbd file + * contains an install name, so the re-exported path does not affect the final + * result. + * + * In nixpkgs each framework is a distinct store path and some frameworks + * re-export other frameworks. The re-exported names are rewritten to refer to + * the store paths of dependencies via textual substitution. This utility is + * used to emit every file that is listed as a re-exported library, which + * allows the framework builder to verify their existence. + */ + +#include +#include +#include + +#define LOG(str, ...) fprintf(stderr, "%s", str) + +#define LOGF(...) fprintf(stderr, __VA_ARGS__) + +static yaml_node_t *get_mapping_entry(yaml_document_t *document, yaml_node_t *mapping, const char *name) { + if (!mapping) { + fprintf(stderr, "get_mapping_entry: mapping is null\n"); + return NULL; + } + + for ( + yaml_node_pair_t *pair = mapping->data.mapping.pairs.start; + pair < mapping->data.mapping.pairs.top; + ++pair + ) { + yaml_node_t *key = yaml_document_get_node(document, pair->key); + + if (!key) { + LOGF("key (%d) is null\n", pair->key); + return NULL; + } + + if (key->type != YAML_SCALAR_NODE) { + LOG("get_mapping_entry: key is not a scalar\n"); + return NULL; + } + + if (strncmp((const char *)key->data.scalar.value, name, key->data.scalar.length) != 0) { + continue; + } + + return yaml_document_get_node(document, pair->value); + } + + return NULL; +} + +static int emit_reexports_v2(yaml_document_t *document) { + yaml_node_t *root = yaml_document_get_root_node(document); + + yaml_node_t *exports = get_mapping_entry(document, root, "exports"); + + if (!exports) { + return 1; + } + + if (exports->type != YAML_SEQUENCE_NODE) { + LOG("value is not a sequence\n"); + return 0; + } + + for ( + yaml_node_item_t *export = exports->data.sequence.items.start; + export < exports->data.sequence.items.top; + ++export + ) { + yaml_node_t *export_node = yaml_document_get_node(document, *export); + + yaml_node_t *reexports = get_mapping_entry(document, export_node, "re-exports"); + + if (!reexports) { + continue; + } + + if (reexports->type != YAML_SEQUENCE_NODE) { + LOG("re-exports is not a sequence\n"); + return 0; + } + + for ( + yaml_node_item_t *reexport = reexports->data.sequence.items.start; + reexport < reexports->data.sequence.items.top; + ++reexport + ) { + yaml_node_t *val = yaml_document_get_node(document, *reexport); + + if (val->type != YAML_SCALAR_NODE) { + LOG("item is not a scalar\n"); + return 0; + } + + fwrite(val->data.scalar.value, val->data.scalar.length, 1, stdout); + putchar('\n'); + } + } + + return 1; +} + +static int emit_reexports_v4(yaml_document_t *document) { + yaml_node_t *root = yaml_document_get_root_node(document); + yaml_node_t *reexports = get_mapping_entry(document, root, "reexported-libraries"); + + if (!reexports) { + return 1; + } + + if (reexports->type != YAML_SEQUENCE_NODE) { + LOG("value is not a sequence\n"); + return 0; + } + + for ( + yaml_node_item_t *entry = reexports->data.sequence.items.start; + entry < reexports->data.sequence.items.top; + ++entry + ) { + yaml_node_t *entry_node = yaml_document_get_node(document, *entry); + + yaml_node_t *libs = get_mapping_entry(document, entry_node, "libraries"); + + if (!libs) { + continue; + } + + if (libs->type != YAML_SEQUENCE_NODE) { + LOG("libraries is not a sequence\n"); + return 0; + } + + for ( + yaml_node_item_t *lib = libs->data.sequence.items.start; + lib < libs->data.sequence.items.top; + ++lib + ) { + yaml_node_t *val = yaml_document_get_node(document, *lib); + + if (val->type != YAML_SCALAR_NODE) { + LOG("item is not a scalar\n"); + return 0; + } + + fwrite(val->data.scalar.value, val->data.scalar.length, 1, stdout); + putchar('\n'); + } + } + + return 1; +} + +int main(int argc, char **argv) { + int result = 0; + + if (argc != 2) { + fprintf(stderr, "Invalid usage\n"); + result = 2; + goto done; + } + + FILE *f = fopen(argv[1], "r"); + if (!f) { + perror("opening input file"); + result = errno; + goto done; + } + + yaml_parser_t yaml_parser; + if (!yaml_parser_initialize(&yaml_parser)) { + fprintf(stderr, "Failed to initialize yaml parser\n"); + result = 1; + goto err_file; + } + + yaml_parser_set_input_file(&yaml_parser, f); + + yaml_document_t yaml_document; + + if(!yaml_parser_load(&yaml_parser, &yaml_document)) { + fprintf(stderr, "Failed to load yaml file\n"); + result = 1; + goto err_yaml; + } + + // Try both, only fail if one reports an error. A lack of re-exports is not + // considered an error. + int ok = 1; + ok = ok && emit_reexports_v2(&yaml_document); + ok = ok && emit_reexports_v4(&yaml_document); + + result = !ok; + +err_yaml: + yaml_parser_delete(&yaml_parser); + +err_file: + fclose(f); + +done: + return result; +} diff --git a/pkgs/by-name/da/darwin/packages/print-reexports/setup-hook.sh b/pkgs/by-name/da/darwin/packages/print-reexports/setup-hook.sh new file mode 100644 index 0000000..9efb00a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/print-reexports/setup-hook.sh @@ -0,0 +1,19 @@ +fixupOutputHooks+=('checkTbdReexports') + +checkTbdReexports() { + local dir="$1" + + while IFS= read -r -d $'\0' tbd; do + echo "checkTbdRexports: checking re-exports in $tbd" + while read -r target; do + local expected="${target%.dylib}.tbd" + if ! [ -e "$expected" ]; then + echo -e "Re-export missing:\n\t'$target'\n\t(expected '$expected')" + echo -e "While processing\n\t'$tbd'" + exit 1 + else + echo "Re-exported target '$target' ok" + fi + done < <(print-reexports "$tbd") + done < <(find $prefix -type f -name '*.tbd' -print0) +} diff --git a/pkgs/by-name/da/darwin/packages/rewrite-tbd/default.nix b/pkgs/by-name/da/darwin/packages/rewrite-tbd/default.nix new file mode 100644 index 0000000..527cca8 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/rewrite-tbd/default.nix @@ -0,0 +1,32 @@ +{ stdenv, lib, fetchFromGitHub, libyaml }: + +stdenv.mkDerivation { + pname = "rewrite-tbd"; + version = "unstable-2023-03-27"; + + src = fetchFromGitHub { + owner = "thefloweringash"; + repo = "rewrite-tbd"; + rev = "d7852691762635028d237b7d00c3dc6a6613de79"; + hash = "sha256-syxioFiGvEv4Ypk5hlIjLQth5YmdFdr+NC+aXSXzG4k="; + }; + + # Nix takes care of these paths. Avoiding the use of `pkg-config` prevents an infinite recursion. + postPatch = '' + substituteInPlace Makefile.boot \ + --replace '$(shell pkg-config --cflags yaml-0.1)' "" \ + --replace '$(shell pkg-config --libs yaml-0.1)' "-lyaml" + ''; + + buildInputs = [ libyaml ]; + + makeFlags = [ "-f" "Makefile.boot" "PREFIX=${placeholder "out"}"]; + + meta = with lib; { + homepage = "https://github.com/thefloweringash/rewrite-tbd/"; + description = "Rewrite filepath in .tbd to Nix applicable format"; + mainProgram = "rewrite-tbd"; + platforms = platforms.unix; + license = licenses.mit; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/signing-utils/auto-sign-hook.sh b/pkgs/by-name/da/darwin/packages/signing-utils/auto-sign-hook.sh new file mode 100644 index 0000000..6a254cd --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/signing-utils/auto-sign-hook.sh @@ -0,0 +1,31 @@ +postFixupHooks+=(signDarwinBinariesInAllOutputs) + +# Uses signingUtils, see definition of autoSignDarwinBinariesHook in +# darwin-packages.nix + +signDarwinBinariesIn() { + local dir="$1" + + if [ ! -d "$dir" ]; then + return 0 + fi + + if [ "${darwinDontCodeSign:-}" ]; then + return 0 + fi + + echo "signing $dir" + + while IFS= read -r -d $'\0' f; do + signIfRequired "$f" + done < <(find "$dir" -type f -print0) +} + +# Apply fixup to each output. +signDarwinBinariesInAllOutputs() { + local output + + for output in $(getAllOutputNames); do + signDarwinBinariesIn "${!output}" + done +} diff --git a/pkgs/by-name/da/darwin/packages/signing-utils/default.nix b/pkgs/by-name/da/darwin/packages/signing-utils/default.nix new file mode 100644 index 0000000..035ac59 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/signing-utils/default.nix @@ -0,0 +1,24 @@ +{ stdenvNoCC +, sigtool +, cctools +}: + +let + stdenv = stdenvNoCC; +in + +stdenv.mkDerivation { + name = "signing-utils"; + + dontUnpack = true; + dontConfigure = true; + dontBuild = true; + + installPhase = '' + substituteAll ${./utils.sh} $out + ''; + + # Substituted variables + inherit sigtool; + codesignAllocate = "${cctools}/bin/${cctools.targetPrefix}codesign_allocate"; +} diff --git a/pkgs/by-name/da/darwin/packages/signing-utils/post-link-sign-hook.nix b/pkgs/by-name/da/darwin/packages/signing-utils/post-link-sign-hook.nix new file mode 100644 index 0000000..13595e3 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/signing-utils/post-link-sign-hook.nix @@ -0,0 +1,13 @@ +{ writeTextFile, cctools, sigtool }: + +writeTextFile { + name = "post-link-sign-hook"; + executable = true; + + text = '' + if [ "$linkerOutput" != "/dev/null" ]; then + CODESIGN_ALLOCATE=${cctools}/bin/${cctools.targetPrefix}codesign_allocate \ + ${sigtool}/bin/codesign -f -s - "$linkerOutput" + fi + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/signing-utils/utils.sh b/pkgs/by-name/da/darwin/packages/signing-utils/utils.sh new file mode 100644 index 0000000..6d23a46 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/signing-utils/utils.sh @@ -0,0 +1,43 @@ +# Work around for some odd behaviour where we can't codesign a file +# in-place if it has been called before. This happens for example if +# you try to fix-up a binary using strip/install_name_tool, after it +# had been used previous. The solution is to copy the binary (with +# the corrupted signature from strip/install_name_tool) to some +# location, sign it there and move it back into place. +# +# This does not appear to happen with the codesign tool that ships +# with recent macOS BigSur installs on M1 arm64 machines. However it +# had also been happening with the tools that shipped with the DTKs. +sign() { + local tmpdir + tmpdir=$(mktemp -d) + + # $1 is the file + + cp "$1" "$tmpdir" + CODESIGN_ALLOCATE=@codesignAllocate@ \ + @sigtool@/bin/codesign -f -s - "$tmpdir/$(basename "$1")" + mv "$tmpdir/$(basename "$1")" "$1" + rmdir "$tmpdir" +} + +checkRequiresSignature() { + local file=$1 + local rc=0 + + @sigtool@/bin/sigtool --file "$file" check-requires-signature || rc=$? + + if [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ]; then + return "$rc" + fi + + echo "Unexpected exit status from sigtool: $rc" + exit 1 +} + +signIfRequired() { + local file=$1 + if checkRequiresSignature "$file"; then + sign "$file" + fi +} diff --git a/pkgs/by-name/da/darwin/packages/sigtool/default.nix b/pkgs/by-name/da/darwin/packages/sigtool/default.nix new file mode 100644 index 0000000..eb323a8 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/sigtool/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchFromGitHub, pkg-config, openssl }: + +stdenv.mkDerivation rec { + pname = "sigtool"; + version = "0.1.3"; + + src = fetchFromGitHub { + owner = "thefloweringash"; + repo = "sigtool"; + rev = "v${version}"; + sha256 = "sha256-K3VSFaqcZEomF7kROJz+AwxdW1MmxxEFDaRnWnzcw54="; + }; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ openssl ]; + + installFlags = [ "PREFIX=$(out)" ]; + + meta = with lib; { + description = "A tool for working with embedded signatures in Mach-O files"; + homepage = "https://github.com/thefloweringash/sigtool"; + license = licenses.mit; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/stubs/default.nix b/pkgs/by-name/da/darwin/packages/stubs/default.nix new file mode 100644 index 0000000..862305a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/stubs/default.nix @@ -0,0 +1,15 @@ +{ lib, writeScriptBin, runtimeShell }: + +let fake = name: lib.overrideDerivation (writeScriptBin name '' + #!${runtimeShell} + echo >&2 "Faking call to ${name} with arguments:" + echo >&2 "$@" +'') (drv: { + name = "${name}-stub"; +}); in + +{ + setfile = fake "SetFile"; + rez = fake "Rez"; + derez = fake "DeRez"; +} diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0001-Add-missing-TARGET_OS_-defines.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0001-Add-missing-TARGET_OS_-defines.patch new file mode 100644 index 0000000..db17c51 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0001-Add-missing-TARGET_OS_-defines.patch @@ -0,0 +1,30 @@ +From 549160574ee44656d50997b27ef83736e0848201 Mon Sep 17 00:00:00 2001 +From: toonn +Date: Mon, 26 Apr 2021 20:51:05 +0200 +Subject: [PATCH] Add missing TARGET_OS_* defines + +--- + .../Base.subproj/SwiftRuntime/TargetConditionals.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h b/CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h +index 6d42b873..abf746c9 100644 +--- a/CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h ++++ b/CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h +@@ -118,6 +118,13 @@ + + #define TARGET_OS_WIN32 TARGET_OS_WINDOWS + #define TARGET_OS_MAC TARGET_OS_DARWIN ++#define TARGET_OS_OSX TARGET_OS_DARWIN ++ ++#define TARGET_OS_IPHONE 0 ++#define TARGET_OS_WATCH 0 ++#define TARGET_OS_TV 0 ++#define TARGET_OS_EMBEDDED 0 ++ + + #if __x86_64__ + #define TARGET_CPU_PPC 0 +-- +2.17.2 (Apple Git-113) + diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0002-Add-missing-launchd-header.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0002-Add-missing-launchd-header.patch new file mode 100644 index 0000000..b1187c5 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0002-Add-missing-launchd-header.patch @@ -0,0 +1,11 @@ +--- a/CoreFoundation/RunLoop.subproj/CFMessagePort.c 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/RunLoop.subproj/CFMessagePort.c 2023-06-09 20:25:28.599209755 -0400 +@@ -28,6 +28,8 @@ + #endif + #endif + ++#include ++ + extern pid_t getpid(void); + + #define __kCFMessagePortMaxNameLengthMax 255 diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0003-Fix-incompatible-pointer-conversion.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0003-Fix-incompatible-pointer-conversion.patch new file mode 100644 index 0000000..910b622 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0003-Fix-incompatible-pointer-conversion.patch @@ -0,0 +1,25 @@ +diff -u a/CoreFoundation/URL.subproj/CFURLComponents.c b/CoreFoundation/URL.subproj/CFURLComponents.c +--- a/CoreFoundation/URL.subproj/CFURLComponents.c 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/URL.subproj/CFURLComponents.c 2023-06-09 20:36:52.995514573 -0400 +@@ -66,7 +66,8 @@ + return CFRetain(CFSTR("A really nice CFURLComponents object")); + } + +-CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFURLComponentsRef instance) { ++CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFTypeRef cf) { ++ CFURLComponentsRef instance = (CFURLComponentsRef)cf; + __CFGenericValidateType(instance, _CFURLComponentsGetTypeID()); + + if (instance->_urlString) CFRelease(instance->_urlString); +diff -u a/CoreFoundation/URL.subproj/CFURLComponents.h b/CoreFoundation/URL.subproj/CFURLComponents.h +--- a/CoreFoundation/URL.subproj/CFURLComponents.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/URL.subproj/CFURLComponents.h 2023-06-09 20:39:36.967857713 -0400 +@@ -38,7 +38,7 @@ + + CF_EXPORT CFTypeID _CFURLComponentsGetTypeID(void); + +-CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFURLComponentsRef); ++CF_CROSS_PLATFORM_EXPORT void __CFURLComponentsDeallocate(CFTypeRef); + + // URLComponents are always mutable. + CF_EXPORT _Nullable CFURLComponentsRef _CFURLComponentsCreate(CFAllocatorRef alloc); diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0004-Fix-Darwin-cmake-build.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0004-Fix-Darwin-cmake-build.patch new file mode 100644 index 0000000..afffa1a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0004-Fix-Darwin-cmake-build.patch @@ -0,0 +1,66 @@ +--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:52:49.096019700 -0400 +@@ -129,7 +129,7 @@ + Base.subproj/CFByteOrder.h + Base.subproj/CFUUID.h + Base.subproj/CFUtilities.h +- Base.subproj/SwiftRuntime/CoreFoundation.h ++ Base.subproj/CoreFoundation.h # The SwiftRuntime version of this file causes linker errors and is not correct for standalone CF. + Base.subproj/SwiftRuntime/TargetConditionals.h + # Collections + Collections.subproj/CFArray.h +@@ -245,6 +245,8 @@ + # RunLoop + RunLoop.subproj/CFRunLoop.c + RunLoop.subproj/CFSocket.c ++ RunLoop.subproj/CFMachPort.c # These files are missing from the upstream `CMakeLists.txt` but required to build on Darwin. ++ RunLoop.subproj/CFMessagePort.c + # Stream + Stream.subproj/CFConcreteStreams.c + Stream.subproj/CFSocketStream.c +@@ -336,6 +338,11 @@ + target_include_directories(CoreFoundation + PRIVATE + ${CURL_INCLUDE_DIRS}) ++elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) ++ find_package(CURL REQUIRED) ++ target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS}) ++ find_package(LibXml2 REQUIRED) ++ target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR}) + else() + target_include_directories(CoreFoundation + PRIVATE +@@ -365,6 +372,10 @@ + PRIVATE + ${CURL_LIBRARIES} + ${LIBXML2_LIBRARIES}) ++elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) ++ target_link_libraries(CoreFoundation PRIVATE ++ ${CURL_LIBRARIES} ++ ${LIBXML2_LIBRARIES}) + else() + target_link_libraries(CoreFoundation + PRIVATE +@@ -398,9 +400,19 @@ + target_link_libraries(CoreFoundation + PRIVATE + icucore) +- set_target_properties(CoreFoundation +- PROPERTIES LINK_FLAGS +- -Xlinker;-alias_list;-Xlinker;Base.subproj/DarwinSymbolAliases;-twolevel_namespace;-sectcreate;__UNICODE;__csbitmaps;CharacterSets/CFCharacterSetBitmaps.bitmap;-sectcreate;__UNICODE;__properties;CharacterSets/CFUniCharPropertyDatabase.data;-sectcreate;__UNICODE;__data;CharacterSets/CFUnicodeData-L.mapping;-segprot;__UNICODE;r;r) ++ target_link_options(CoreFoundation ++ PUBLIC ++ "LINKER:-alias_list,../Base.subproj/DarwinSymbolAliases" ++ "LINKER:-twolevel_namespace" ++ "LINKER:-sectcreate,__UNICODE,__csbitmaps,../CharacterSets/CFCharacterSetBitmaps.bitmap" ++ "LINKER:-sectcreate,__UNICODE,__properties,../CharacterSets/CFUniCharPropertyDatabase.data" ++ "LINKER:-sectcreate,__UNICODE,__data,../CharacterSets/CFUnicodeData-L.mapping" ++ "LINKER:-segprot,__UNICODE,r,r" ++ "LINKER:-current_version,1454.90.0" ++ "LINKER:-compatibility_version,150.0.0" ++ "LINKER:-init,___CFInitialize") ++ set(CMAKE_SHARED_LIBRARY_PREFIX "") ++ set(CMAKE_SHARED_LIBRARY_SUFFIX "") + endif() + + install(TARGETS diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0005-Fix-framework-installation-path.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0005-Fix-framework-installation-path.patch new file mode 100644 index 0000000..e771ab3 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0005-Fix-framework-installation-path.patch @@ -0,0 +1,23 @@ +diff -u aa/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt +--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:59:19.492601179 -0400 + +@@ -424,16 +424,11 @@ + set(CMAKE_SHARED_LIBRARY_SUFFIX "") + endif() + +-install(TARGETS +- CoreFoundation +- DESTINATION +- "${CMAKE_INSTALL_FULL_LIBDIR}") + install(DIRECTORY + ${CoreFoundation_FRAMEWORK_DIRECTORY} + DESTINATION +- ${CMAKE_INSTALL_PREFIX}/System/Library/Frameworks +- USE_SOURCE_PERMISSIONS +- PATTERN PrivateHeaders EXCLUDE) ++ ${CMAKE_INSTALL_PREFIX}/Library/Frameworks ++ USE_SOURCE_PERMISSIONS) + + + # TODO(compnerd) formalize this diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0006-System-CF-framework-compatibility.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0006-System-CF-framework-compatibility.patch new file mode 100644 index 0000000..248cb5f --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0006-System-CF-framework-compatibility.patch @@ -0,0 +1,84 @@ +diff -u a/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt +--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/CMakeLists.txt 2023-06-29 18:59:08.659632504 -0400 +@@ -1,5 +1,5 @@ + +-cmake_minimum_required(VERSION 3.4.3) ++cmake_minimum_required(VERSION 3.14) + list(APPEND CMAKE_MODULE_PATH + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + +@@ -45,6 +45,8 @@ + ${FRAMEWORK_LIBRARY_TYPE} + FRAMEWORK_DIRECTORY + CoreFoundation_FRAMEWORK_DIRECTORY ++ VERSION ++ A + MODULE_MAP + Base.subproj/module.modulemap + PRIVATE_HEADERS +diff -u a/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake b/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake +--- a/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/cmake/modules/CoreFoundationAddFramework.cmake 2023-06-29 18:57:55.792860996 -0400 +@@ -3,7 +3,7 @@ + + function(add_framework NAME) + set(options STATIC SHARED) +- set(single_value_args MODULE_MAP FRAMEWORK_DIRECTORY) ++ set(single_value_args MODULE_MAP FRAMEWORK_DIRECTORY VERSION) + set(multiple_value_args PRIVATE_HEADERS PUBLIC_HEADERS SOURCES) + cmake_parse_arguments(AF "${options}" "${single_value_args}" "${multiple_value_args}" ${ARGN}) + +@@ -14,26 +14,32 @@ + set(AF_TYPE SHARED) + endif() + ++ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/${AF_VERSION}) ++ file(CREATE_LINK ${AF_VERSION} ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current SYMBOLIC) ++ + if(AF_MODULE_MAP) + file(COPY + ${AF_MODULE_MAP} + DESTINATION +- ${CMAKE_BINARY_DIR}/${NAME}.framework/Modules ++ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/Modules + NO_SOURCE_PERMISSIONS) ++ file(CREATE_LINK Versions/Current/Modules ${CMAKE_BINARY_DIR}/${NAME}.framework/Modules SYMBOLIC) + endif() + if(AF_PUBLIC_HEADERS) + file(COPY + ${AF_PUBLIC_HEADERS} + DESTINATION +- ${CMAKE_BINARY_DIR}/${NAME}.framework/Headers ++ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/Headers + NO_SOURCE_PERMISSIONS) ++ file(CREATE_LINK Versions/Current/Headers ${CMAKE_BINARY_DIR}/${NAME}.framework/Headers SYMBOLIC) + endif() + if(AF_PRIVATE_HEADERS) + file(COPY + ${AF_PRIVATE_HEADERS} + DESTINATION +- ${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders ++ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current/PrivateHeaders + NO_SOURCE_PERMISSIONS) ++ file(CREATE_LINK Versions/Current/PrivateHeaders ${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders SYMBOLIC) + endif() + add_custom_target(${NAME}_POPULATE_HEADERS + DEPENDS +@@ -51,13 +57,15 @@ + set_target_properties(${NAME} + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY +- ${CMAKE_BINARY_DIR}/${NAME}.framework) ++ ${CMAKE_BINARY_DIR}/${NAME}.framework/Versions/Current) + target_compile_options(${NAME} + PRIVATE + -F;${CMAKE_BINARY_DIR} + -I;${CMAKE_BINARY_DIR}/${NAME}.framework/PrivateHeaders) + add_dependencies(${NAME} ${NAME}_POPULATE_HEADERS) + ++ file(CREATE_LINK Versions/Current/${NAME} ${CMAKE_BINARY_DIR}/${NAME}.framework/${NAME} SYMBOLIC) ++ + if(AF_FRAMEWORK_DIRECTORY) + set(${AF_FRAMEWORK_DIRECTORY} ${CMAKE_BINARY_DIR}/${NAME}.framework PARENT_SCOPE) + endif() diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0007-Use-nixpkgs-icu.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0007-Use-nixpkgs-icu.patch new file mode 100644 index 0000000..78fa517 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0007-Use-nixpkgs-icu.patch @@ -0,0 +1,31 @@ +diff -ur d/CoreFoundation/CMakeLists.txt e/CoreFoundation/CMakeLists.txt +--- d/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ e/CoreFoundation/CMakeLists.txt 2023-06-29 19:13:15.561253229 -0400 +@@ -343,6 +343,7 @@ + elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) + find_package(CURL REQUIRED) + target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS}) ++ find_package(ICU COMPONENTS uc i18n data REQUIRED) + find_package(LibXml2 REQUIRED) + target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR}) + else() +@@ -377,6 +378,9 @@ + elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) + target_link_libraries(CoreFoundation PRIVATE + ${CURL_LIBRARIES} ++ ICU::uc ++ ICU::i18n ++ ICU::data + ${LIBXML2_LIBRARIES}) + else() + target_link_libraries(CoreFoundation +@@ -408,9 +412,6 @@ + PROPERTIES LINK_FLAGS + -Xlinker;@${CMAKE_SOURCE_DIR}/linux.ld;-Bsymbolic) + elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) +- target_link_libraries(CoreFoundation +- PRIVATE +- icucore) + target_link_options(CoreFoundation + PUBLIC + "LINKER:-alias_list,../Base.subproj/DarwinSymbolAliases" diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/0008-Dont-link-libcurl.patch b/pkgs/by-name/da/darwin/packages/swift-corelibs/0008-Dont-link-libcurl.patch new file mode 100644 index 0000000..4207bf1 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/0008-Dont-link-libcurl.patch @@ -0,0 +1,46 @@ +diff -u a/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt +--- a/CoreFoundation/CMakeLists.txt 1969-12-31 19:00:01.000000000 -0500 ++++ b/CoreFoundation/CMakeLists.txt 2023-06-29 19:39:30.074449222 -0400 +@@ -104,7 +104,6 @@ + # URL + URL.subproj/CFURL.inc.h + URL.subproj/CFURLPriv.h +- URL.subproj/CFURLSessionInterface.h + PUBLIC_HEADERS + # FIXME: PrivateHeaders referenced by public headers + Base.subproj/CFKnownLocations.h +@@ -120,7 +119,6 @@ + String.subproj/CFRegularExpression.h + String.subproj/CFRunArray.h + URL.subproj/CFURLPriv.h +- URL.subproj/CFURLSessionInterface.h + + # AppServices + AppServices.subproj/CFNotificationCenter.h +@@ -280,8 +278,7 @@ + URL.subproj/CFURL.c + URL.subproj/CFURLAccess.c + URL.subproj/CFURLComponents.c +- URL.subproj/CFURLComponents_URIParser.c +- URL.subproj/CFURLSessionInterface.c) ++ URL.subproj/CFURLComponents_URIParser.c) + if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL Android) + target_compile_definitions(CoreFoundation + PRIVATE +@@ -341,8 +338,6 @@ + PRIVATE + ${CURL_INCLUDE_DIRS}) + elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) +- find_package(CURL REQUIRED) +- target_include_directories(CoreFoundation PRIVATE ${CURL_INCLUDE_DIRS}) + find_package(ICU COMPONENTS uc i18n data REQUIRED) + find_package(LibXml2 REQUIRED) + target_include_directories(CoreFoundation PRIVATE ${LIBXML2_INCLUDE_DIR}) +@@ -377,7 +372,6 @@ + ${LIBXML2_LIBRARIES}) + elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) + target_link_libraries(CoreFoundation PRIVATE +- ${CURL_LIBRARIES} + ICU::uc + ICU::i18n + ICU::data diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/corefoundation.nix b/pkgs/by-name/da/darwin/packages/swift-corelibs/corefoundation.nix new file mode 100644 index 0000000..5c593b1 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/corefoundation.nix @@ -0,0 +1,91 @@ +{ lib, stdenv, fetchFromGitHub, fetchurl, makeSetupHook, cmake, pkg-config, launchd, libdispatch, python3Minimal, libxml2, objc4, icu }: + +let + # 10.12 adds a new sysdir.h that our version of CF in the main derivation depends on, but + # isn't available publicly, so instead we grab an older version of the same file that did + # not use sysdir.h, but provided the same functionality. Luckily it's simple :) hack hack + sysdir-free-system-directories = fetchurl { + url = "https://raw.githubusercontent.com/apple/swift-corelibs-foundation/9a5d8420f7793e63a8d5ec1ede516c4ebec939f0/CoreFoundation/Base.subproj/CFSystemDirectories.c"; + sha256 = "0krfyghj4f096arvvpf884ra5czqlmbrgf8yyc0b3avqmb613pcc"; + }; +in + +stdenv.mkDerivation { + pname = "swift-corefoundation"; + version = "unstable-2018-09-14"; + + src = fetchFromGitHub { + owner = "apple"; + repo = "swift-corelibs-foundation"; + rev = "71aaba20e1450a82c516af1342fe23268e15de0a"; + sha256 = "17kpql0f27xxz4jjw84vpas5f5sn4vdqwv10g151rc3rswbwln1z"; + }; + + nativeBuildInputs = [ cmake pkg-config python3Minimal ]; + buildInputs = [ (lib.getDev launchd) libdispatch libxml2 objc4 icu ]; + + patches = [ + ./0001-Add-missing-TARGET_OS_-defines.patch + # CFMessagePort.h uses `bootstrap_check_in` without declaring it, which is defined in the launchd headers. + ./0002-Add-missing-launchd-header.patch + # CFURLComponents fails to build with clang 16 due to an invalid pointer conversion. This is fixed upstream. + ./0003-Fix-incompatible-pointer-conversion.patch + # Fix `CMakeLists.txt` to allow it to be used instead of `build.py` to build on Darwin. + ./0004-Fix-Darwin-cmake-build.patch + # Install CF framework in `$out/Library/Frameworks` instead of `$out/System/Frameworks`. + ./0005-Fix-framework-installation-path.patch + # Build a framework that matches the contents of the system CoreFoundation. This patch adds + # versioning and drops the prefix and suffix, so the dynamic library is named `CoreFoundation` + # instead of `libCoreFoundation.dylib`. + ./0006-System-CF-framework-compatibility.patch + # Link against the nixpkgs ICU instead of using Apple’s vendored version. + ./0007-Use-nixpkgs-icu.patch + # Don’t link against libcurl. This breaks a cycle between CF and curl, which depends on CF and + # uses the SystemConfiguration framework to support NAT64. + # This is safe because the symbols provided in CFURLSessionInterface are not provided by the + # system CoreFoundation. They are meant to be used by the implementation of `NSURLSession` in + # swift-corelibs-foundation, which is not built because it is not fully compatible with the + # system Foundation used on Darwin. + ./0008-Dont-link-libcurl.patch + ]; + + postPatch = '' + cd CoreFoundation + + cp ${sysdir-free-system-directories} Base.subproj/CFSystemDirectories.c + + # Includes xpc for some initialization routine that they don't define anyway, so no harm here + substituteInPlace PlugIn.subproj/CFBundlePriv.h \ + --replace '#if (TARGET_OS_MAC' '#if (0' + + # Why do we define __GNU__? Is that normal? + substituteInPlace Base.subproj/CFAsmMacros.h \ + --replace '#if defined(__GNU__) ||' '#if 0 &&' + + # The MIN macro doesn't seem to be defined sensibly for us. Not sure if our stdenv or their bug + substituteInPlace Base.subproj/CoreFoundation_Prefix.h \ + --replace '#if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX' '#if 1' + ''; + + env.NIX_CFLAGS_COMPILE = toString [ + # Silence warnings regarding other targets + "-Wno-error=undef-prefix" + # Avoid redefinitions when including objc headers + "-DINCLUDE_OBJC=1" + ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + "-DCF_ENABLE_LIBDISPATCH=OFF" + ]; + + enableParallelBuilding = true; + + postInstall = '' + install_name_tool -id '@rpath/CoreFoundation.framework/Versions/A/CoreFoundation' \ + "$out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation" + + mkdir -p "$out/nix-support" + substituteAll ${./pure-corefoundation-hook.sh} "$out/nix-support/setup-hook" + ''; +} diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/libdispatch.nix b/pkgs/by-name/da/darwin/packages/swift-corelibs/libdispatch.nix new file mode 100644 index 0000000..a5b4b2a --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/libdispatch.nix @@ -0,0 +1,13 @@ +{ stdenv, fetchFromGitHub, cmake, apple_sdk_sierra, xnu-new }: + +stdenv.mkDerivation rec { + name = "swift-corelibs-libdispatch"; + src = fetchFromGitHub { + owner = "apple"; + repo = name; + rev = "f83b5a498bad8e9ff8916183cf6e8ccf677c346b"; + sha256 = "1czkyyc9llq2mnqfp19mzcfsxzas0y8zrk0gr5hg60acna6jkz2l"; + }; + nativeBuildInputs = [ cmake ]; + buildInputs = [ apple_sdk_sierra.sdk xnu-new ]; +} diff --git a/pkgs/by-name/da/darwin/packages/swift-corelibs/pure-corefoundation-hook.sh b/pkgs/by-name/da/darwin/packages/swift-corelibs/pure-corefoundation-hook.sh new file mode 100644 index 0000000..d5539f5 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/swift-corelibs/pure-corefoundation-hook.sh @@ -0,0 +1,7 @@ +usePureCoreFoundation() { +# Avoid overriding value set by the impure CF + if [ -z "${NIX_COREFOUNDATION_RPATH:-}" ]; then + export NIX_COREFOUNDATION_RPATH=@out@/Library/Frameworks + fi +} +addEnvHooks "$hostOffset" usePureCoreFoundation diff --git a/pkgs/by-name/da/darwin/packages/trash/default.nix b/pkgs/by-name/da/darwin/packages/trash/default.nix new file mode 100644 index 0000000..a239f66 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/trash/default.nix @@ -0,0 +1,34 @@ +{ lib, stdenv, fetchFromGitHub, perl, AppKit, Cocoa, ScriptingBridge }: + +stdenv.mkDerivation rec { + version = "0.9.2"; + pname = "trash"; + + src = fetchFromGitHub { + owner = "ali-rantakari"; + repo = "trash"; + rev = "v${version}"; + sha256 = "1d3rc03vgz32faj7qi18iiggxvxlqrj9lsk5jkpa9r1mcs5d89my"; + }; + + buildInputs = [ perl Cocoa AppKit ScriptingBridge ]; + + patches = [ ./trash.diff ]; + + buildPhase = "make all docs"; + + installPhase = '' + mkdir -p $out/bin + mkdir -p $out/share/man/man1 + install -m 0755 trash $out/bin + install -m 0444 trash.1 $out/share/man/man1 + ''; + + meta = { + homepage = "https://github.com/ali-rantakari/trash"; + description = "Small command-line program for OS X that moves files or + folders to the trash."; + platforms = lib.platforms.darwin; + license = lib.licenses.mit; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/trash/trash.diff b/pkgs/by-name/da/darwin/packages/trash/trash.diff new file mode 100644 index 0000000..d96f6c9 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/trash/trash.diff @@ -0,0 +1,13 @@ +diff --git a/Makefile b/Makefile +index 5e4306f..9c975fc 100644 +--- a/Makefile ++++ b/Makefile +@@ -10,7 +10,7 @@ trash: $(SOURCE_FILES) + @echo + @echo ---- Compiling: + @echo ====================================== +- $(CC) -O2 -Wall -Wextra -Wpartial-availability -Wno-unguarded-availability -force_cpusubtype_ALL -mmacosx-version-min=10.7 -arch i386 -arch x86_64 -framework AppKit -framework ScriptingBridge -o $@ $(SOURCE_FILES) ++ $(CC) -O2 -Wall -Wextra -Wpartial-availability -Wno-unguarded-availability -framework AppKit -framework ScriptingBridge -o $@ $(SOURCE_FILES) + + analyze: + @echo diff --git a/pkgs/by-name/da/darwin/packages/xattr/default.nix b/pkgs/by-name/da/darwin/packages/xattr/default.nix new file mode 100644 index 0000000..7fe0f84 --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/xattr/default.nix @@ -0,0 +1,79 @@ +{ lib +, stdenv +, fetchFromGitHub +, buildPythonPackage +, python +, ed +, unifdef +}: + +buildPythonPackage rec { + pname = "xattr"; + version = "61.60.1"; + + src = fetchFromGitHub { + owner = "apple-oss-distributions"; + repo = "python_modules"; + rev = "python_modules-${version}"; + hash = "sha256-kfMGPzNAJsPvvUCSzcR0kgg85U6/NFf/ie1uwg9tfqY="; + }; + + sourceRoot = "${src.name}/Modules/xattr-0.6.4"; + format = "other"; + + nativeBuildInputs = [ + ed + unifdef + python.pkgs.setuptools + ]; + + makeFlags = [ + "OBJROOT=$(PWD)" + "DSTROOT=${placeholder "out"}" + "OSL=${placeholder "doc"}/share/xattr/OpenSourceLicenses" + "OSV=${placeholder "doc"}/share/xattr/OpenSourceVersions" + ]; + + # need to use `out` instead of `bin` since buildPythonPackage ignores the latter + outputs = [ "out" "doc" "python" ]; + + # We need to patch a reference to gnutar in an included Makefile + postUnpack = '' + chmod u+w $sourceRoot/.. + ''; + + postPatch = '' + substituteInPlace ../Makefile.inc --replace gnutar tar + substituteInPlace Makefile --replace "/usr" "" + ''; + + preInstall = '' + # prevent setup.py from trying to download setuptools + sed -i xattr-*/setup.py -e '/ez_setup/d' + + # create our custom target dirs we patch in + mkdir -p "$doc/share/xattr/"OpenSource{Licenses,Versions} + mkdir -p "$python/lib/${python.libPrefix}" + ''; + + # move python package to its own output to reduce clutter + postInstall = '' + mv "$out/lib/python" "$python/${python.sitePackages}" + rmdir "$out/lib" + ''; + + makeWrapperArgs = [ + "--prefix" + "PYTHONPATH" + ":" + "${placeholder "python"}/${python.sitePackages}" + ]; + + meta = with lib; { + description = "Display and manipulate extended attributes"; + license = [ licenses.psfl licenses.mit ]; # see $doc/share/xattr/OpenSourceLicenses + maintainers = [ maintainers.sternenseemann ]; + homepage = "https://opensource.apple.com/source/python_modules/"; + platforms = lib.platforms.darwin; + }; +} diff --git a/pkgs/by-name/da/darwin/packages/xcode/default.nix b/pkgs/by-name/da/darwin/packages/xcode/default.nix new file mode 100644 index 0000000..1b7949d --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/xcode/default.nix @@ -0,0 +1,87 @@ +{ stdenv, requireFile, lib }: + +let requireXcode = version: sha256: + let + xip = "Xcode_" + version + ".xip"; + + unxip = if stdenv.buildPlatform.isDarwin + then '' + open -W ${xip} + rm -rf ${xip} + '' + else '' + xar -xf ${xip} + rm -rf ${xip} + pbzx -n Content | cpio -i + rm Content Metadata + rcodesign verify Xcode.app/Contents/MacOS/Xcode + ''; + + app = requireFile rec { + name = "Xcode.app"; + url = "https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_${version}/${xip}"; + hashMode = "recursive"; + inherit sha256; + message = '' + Unfortunately, we cannot download ${name} automatically. + Please go to ${url} + to download it yourself, and add it to the Nix store by running the following commands. + Note: download (~ 5GB), extraction and storing of Xcode will take a while + + ${unxip} + nix-store --add-fixed --recursive sha256 Xcode.app + rm -rf Xcode.app + ''; + }; + meta = with lib; { + homepage = "https://developer.apple.com/downloads/"; + description = "Apple's XCode SDK"; + license = licenses.unfree; + platforms = platforms.darwin ++ platforms.linux; + }; + + in app.overrideAttrs ( oldAttrs: oldAttrs // { inherit meta; }); + +in lib.makeExtensible (self: { + xcode_8_1 = requireXcode "8.1" "sha256-VuAovU/b4rcLh+xMtcsZmbTWwTk35VGfMSp+fqPbsqM="; + xcode_8_2 = requireXcode "8.2" "sha256-ohqgGD7JEEmXEvmfn/N9Ga2lM8jNwhIuh+ky7PQPzY4="; + xcode_9_1 = requireXcode "9.1" "sha256-LG7pVMh1rNh5uP/bASvV9sKvGDrSGWH90J4gzwcgYSk="; + xcode_9_2 = requireXcode "9.2" "sha256-jMiG2G2zoGw4m00CjkGE+2cn0qeOdSUcXosZI2577q0="; + xcode_9_3 = requireXcode "9.3" "sha256-XIQYjfDVSmrYbyolnZIUtmOMhj9uhyWIn0KncsiaqYo="; + xcode_9_4 = requireXcode "9.4" "sha256-ZzE4F4UHVgKlJIn36kfs6Pba8iUAe6P/rh/VmxwLXwE="; + xcode_9_4_1 = requireXcode "9.4.1" "sha256-fFGB/XMZJQ2u9qh+2LYBHFh6mj5lr6gMlSQwgyS8M3k="; + xcode_10_1 = requireXcode "10.1" "sha256-u4Br3SsWbPCv6r4vGHFQUQmfPb9oUEmcdCFktMlbTes="; + xcode_10_2 = requireXcode "10.2" "sha256-592xNBS3Obp/3sDROyI4SxPN77cKMk45Lnis/QJd/vc="; + xcode_10_2_1 = requireXcode "10.2.1" "sha256-r65DbLDpiFJ78VH2hvfp7ZVpehoI44PSnaeDbElZTYc="; + xcode_10_3 = requireXcode "10.3" "sha256-61lDed7/Wi6uVBaj6/fUELISvmH3j69dQE19Y91GwsQ="; + xcode_11 = requireXcode "11" "sha256-EDM5tjuzGTzlVUg6MJKup/Q2OBrFXjzFdXSRO+eQA+Q="; + xcode_11_1 = requireXcode "11.1" "sha256-gXGVkEG+dFEoDbRjtfyN8MeUcoA6hcfsUaVDKAn7T7A="; + xcode_11_2 = requireXcode "11.2" "sha256-8qFEgRVhgOomSnJk23WaM/nACK9JFmiIICjUfT/Co9I="; + xcode_11_3 = requireXcode "11.3" "sha256-6nPCY0rIU2c7nRYDXMWcDHrCm34eqZq6wx157mk3OxM="; + xcode_11_3_1 = requireXcode "11.3.1" "sha256-BI8Olfqyxh51jyNpydiRkPwTQ4OK+ZpHUybPkCSL1tw="; + xcode_11_4 = requireXcode "11.4" "sha256-x/sLazHPs4SoCPKJ0CgFbTEmxlzJeZ7HtinMlse6uRg="; + xcode_11_5 = requireXcode "11.5" "sha256-fLqMcIOM6ZqacTBMF6N0swJzOmnt+FfYlDt8m/BXP7Y="; + xcode_11_6 = requireXcode "11.6" "sha256-nVDsbD7pGCM2jgXzRtV+VIFc/klmX05W6x/eOAOHjvg="; + xcode_11_7 = requireXcode "11.7" "sha256-stKqjXmERNQ4qF/73EE34oLtfF9+WZXK9BwXSVjLQhA="; + xcode_12 = requireXcode "12" "sha256-H8Hcre9dB2v2VT8/SrEkU+RZ2rZRiM0JqMX6i4yoffA="; + xcode_12_0_1 = requireXcode "12.0.1" "sha256-gK7PZ22aR3ow72pSjr7tUIOsgoAEUqcMZgNCEFVp29w="; + xcode_12_1 = requireXcode "12.1" "sha256-l4+MW8IWMqR/9dxd9FVtfxJs3M/qtIcj6nyQ2cjxLfI="; + xcode_12_2 = requireXcode "12.2" "sha256-G8jku/9WB8Q1zgKWGbSv06bSWE385sPlc7xnfonjIJ4="; + xcode_12_3 = requireXcode "12.3" "sha256-CYU2fAeT+DWiK/mpRoGv57RjGfseL23BDU57SokPjk8="; + xcode_12_4 = requireXcode "12.4" "sha256-Qw4j+XFry85/AviHQVhjjjKLAfmRNNwMGN5G8FheJwQ="; + xcode_12_5 = requireXcode "12.5" "sha256-xiGffnV0P9Ojd6IrJSXILUX4oznPif7zm00WAksn3qU="; + xcode_12_5_1 = requireXcode "12.5.1" "sha256-zL0kS86ZzBkIrKLPKvWguDvXj9Tqbr7uR/VZaT/uZ9A="; + xcode_13 = requireXcode "13" "sha256-uTY6d5DBu4OOQLkxs3ExDfLXh50rE2LLlqtCbk3Qn6E="; + xcode_13_1 = requireXcode "13.1" "sha256-vd+4eFVaAyvXsdaExcfbDZSXOwkpt+rEbkBYSMjdUEA="; + xcode_13_2 = requireXcode "13.2" "sha256-guJXm/QnMfvUZwAcJwoy0QeO+DpDcUhs8AxVKvm9tYQ="; + xcode_13_2_1 = requireXcode "13.2.1" "sha256-r832Uu+Q8utK4zN0CtwiMCvMYT5HstWInyq4cNIaZJM="; + xcode_13_3 = requireXcode "13.3" "sha256-p2zaWMpmUeNHQtYOOaVdhCt3cgapvzL3l73/J+UwzCE="; + xcode_13_3_1 = requireXcode "13.3.1" "sha256-j71vpJVJpyj/IOlL+4+5lYgOlhf/zn+7ExIHbxL51cQ="; + xcode_13_4 = requireXcode "13.4" "sha256-IY1coss90GlBeJg/HQPMU8v2rOOxsqlY5q+2Qxe8nnY="; + xcode_13_4_1 = requireXcode "13.4.1" "sha256-Jk8fLgvnODoIhuVJqfV0KrpBBL40fRrHJbFmm44NRKE="; + xcode_14 = requireXcode "14" "sha256-E+wjPgQx/lbYAsauksdmGsygL5VPBA8R9pHB93eA7T0="; + xcode_14_1 = requireXcode "14.1" "sha256-QJGAUVIhuDYyzDNttBPv5lIGOfvkYqdOFSUAr5tlkfs="; + xcode_15 = requireXcode "15" "sha256-ffqISt2Ayccln5BArKIjSdzbEgoSoNwq8TPLGysAE0c="; + xcode_15_1 = requireXcode "15.1" "sha256-0djqoSamU87rCpjo50Un3cFg9wKf+pSczRko6uumGM0="; + xcode = self."xcode_${lib.replaceStrings ["."] ["_"] (if (stdenv.targetPlatform ? xcodeVer) then stdenv.targetPlatform.xcodeVer else "12.3")}"; +}) diff --git a/pkgs/by-name/da/darwin/packages/xcode/sdk-pkgs.nix b/pkgs/by-name/da/darwin/packages/xcode/sdk-pkgs.nix new file mode 100644 index 0000000..45cb12b --- /dev/null +++ b/pkgs/by-name/da/darwin/packages/xcode/sdk-pkgs.nix @@ -0,0 +1,61 @@ +{ stdenv +, clang-unwrapped +, binutils-unwrapped +, runCommand + +, wrapBintoolsWith +, wrapCCWith +, buildIosSdk, targetIosSdkPkgs +, xcode +, lib +}: + +let + +minSdkVersion = stdenv.targetPlatform.minSdkVersion or "9.0"; + +in + +rec { + sdk = rec { + name = "ios-sdk"; + type = "derivation"; + outPath = xcode + "/Contents/Developer/Platforms/${platform}.platform/Developer/SDKs/${platform}${version}.sdk"; + + platform = stdenv.targetPlatform.xcodePlatform or ""; + version = stdenv.targetPlatform.sdkVer or ""; + }; + + binutils = wrapBintoolsWith { + libc = targetIosSdkPkgs.libraries; + bintools = binutils-unwrapped; + }; + + clang = (wrapCCWith { + cc = clang-unwrapped; + bintools = binutils; + libc = targetIosSdkPkgs.libraries; + extraPackages = [ "${sdk}/System" ]; + extraBuildCommands = '' + tr '\n' ' ' < $out/nix-support/cc-cflags > cc-cflags.tmp + mv cc-cflags.tmp $out/nix-support/cc-cflags + echo "-target ${stdenv.targetPlatform.config}" >> $out/nix-support/cc-cflags + echo "-isystem ${sdk}/usr/include${lib.optionalString (lib.versionAtLeast "10" sdk.version) " -isystem ${sdk}/usr/include/c++/4.2.1/ -stdlib=libstdc++"}" >> $out/nix-support/cc-cflags + ${lib.optionalString (lib.versionAtLeast sdk.version "14") "echo -isystem ${xcode}/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 >> $out/nix-support/cc-cflags"} + ''; + }) // { + inherit sdk; + }; + + libraries = let sdk = buildIosSdk; in runCommand "libSystem-prebuilt" { + passthru = { + inherit sdk; + }; + } '' + if ! [ -d ${sdk} ]; then + echo "You must have version ${sdk.version} of the ${sdk.platform} sdk installed at ${sdk}" >&2 + exit 1 + fi + ln -s ${sdk}/usr $out + ''; +} diff --git a/pkgs/by-name/db/db/CVE-2017-10140-4.8-cwd-db_config.patch b/pkgs/by-name/db/db/CVE-2017-10140-4.8-cwd-db_config.patch new file mode 100644 index 0000000..ed916fc --- /dev/null +++ b/pkgs/by-name/db/db/CVE-2017-10140-4.8-cwd-db_config.patch @@ -0,0 +1,11 @@ +--- a/env/env_open.c.old 2017-06-26 10:32:11.011419981 +0200 ++++ b/env/env_open.c 2017-06-26 10:32:46.893721233 +0200 +@@ -473,7 +473,7 @@ + env->db_mode = mode == 0 ? DB_MODE_660 : mode; + + /* Read the DB_CONFIG file. */ +- if ((ret = __env_read_db_config(env)) != 0) ++ if (env->db_home != NULL && (ret = __env_read_db_config(env)) != 0) + return (ret); + + /* diff --git a/pkgs/by-name/db/db/CVE-2017-10140-cwd-db_config.patch b/pkgs/by-name/db/db/CVE-2017-10140-cwd-db_config.patch new file mode 100644 index 0000000..652e962 --- /dev/null +++ b/pkgs/by-name/db/db/CVE-2017-10140-cwd-db_config.patch @@ -0,0 +1,11 @@ +--- db-5.3.28/src/env/env_open.c.old 2017-06-26 10:32:11.011419981 +0200 ++++ db-5.3.28/src/env/env_open.c 2017-06-26 10:32:46.893721233 +0200 +@@ -473,7 +473,7 @@ + env->db_mode = mode == 0 ? DB_MODE_660 : mode; + + /* Read the DB_CONFIG file. */ +- if ((ret = __env_read_db_config(env)) != 0) ++ if (env->db_home != NULL && (ret = __env_read_db_config(env)) != 0) + return (ret); + + /* diff --git a/pkgs/by-name/db/db/clang-4.8.patch b/pkgs/by-name/db/db/clang-4.8.patch new file mode 100644 index 0000000..0aff876 --- /dev/null +++ b/pkgs/by-name/db/db/clang-4.8.patch @@ -0,0 +1,205 @@ +diff --git a/dbinc/atomic.h b/dbinc/atomic.h +index 0034dcc..160c8ea 100644 +--- a/dbinc/atomic.h ++++ b/dbinc/atomic.h +@@ -70,7 +70,7 @@ typedef struct { + * These have no memory barriers; the caller must include them when necessary. + */ + #define atomic_read(p) ((p)->value) +-#define atomic_init(p, val) ((p)->value = (val)) ++#define atomic_init_db(p, val) ((p)->value = (val)) + + #ifdef HAVE_ATOMIC_SUPPORT + +@@ -144,7 +144,7 @@ typedef LONG volatile *interlocked_val; + #define atomic_inc(env, p) __atomic_inc(p) + #define atomic_dec(env, p) __atomic_dec(p) + #define atomic_compare_exchange(env, p, o, n) \ +- __atomic_compare_exchange((p), (o), (n)) ++ __atomic_compare_exchange_int((p), (o), (n)) + static inline int __atomic_inc(db_atomic_t *p) + { + int temp; +@@ -176,7 +176,7 @@ static inline int __atomic_dec(db_atomic_t *p) + * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html + * which configure could be changed to use. + */ +-static inline int __atomic_compare_exchange( ++static inline int __atomic_compare_exchange_int( + db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval) + { + atomic_value_t was; +@@ -206,7 +206,7 @@ static inline int __atomic_compare_exchange( + #define atomic_dec(env, p) (--(p)->value) + #define atomic_compare_exchange(env, p, oldval, newval) \ + (DB_ASSERT(env, atomic_read(p) == (oldval)), \ +- atomic_init(p, (newval)), 1) ++ atomic_init_db(p, (newval)), 1) + #else + #define atomic_inc(env, p) __atomic_inc(env, p) + #define atomic_dec(env, p) __atomic_dec(env, p) +diff --git a/mp/mp_fget.c b/mp/mp_fget.c +index 5fdee5a..0b75f57 100644 +--- a/mp/mp_fget.c ++++ b/mp/mp_fget.c +@@ -617,7 +617,7 @@ alloc: /* Allocate a new buffer header and data space. */ + + /* Initialize enough so we can call __memp_bhfree. */ + alloc_bhp->flags = 0; +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + #ifdef DIAGNOSTIC + if ((uintptr_t)alloc_bhp->buf & (sizeof(size_t) - 1)) { + __db_errx(env, +@@ -911,7 +911,7 @@ alloc: /* Allocate a new buffer header and data space. */ + MVCC_MPROTECT(bhp->buf, mfp->stat.st_pagesize, + PROT_READ); + +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + MUTEX_LOCK(env, alloc_bhp->mtx_buf); + alloc_bhp->priority = bhp->priority; + alloc_bhp->pgno = bhp->pgno; +diff --git a/mp/mp_mvcc.c b/mp/mp_mvcc.c +index 34467d2..f05aa0c 100644 +--- a/mp/mp_mvcc.c ++++ b/mp/mp_mvcc.c +@@ -276,7 +276,7 @@ __memp_bh_freeze(dbmp, infop, hp, bhp, need_frozenp) + #else + memcpy(frozen_bhp, bhp, SSZA(BH, buf)); + #endif +- atomic_init(&frozen_bhp->ref, 0); ++ atomic_init_db(&frozen_bhp->ref, 0); + if (mutex != MUTEX_INVALID) + frozen_bhp->mtx_buf = mutex; + else if ((ret = __mutex_alloc(env, MTX_MPOOL_BH, +@@ -428,7 +428,7 @@ __memp_bh_thaw(dbmp, infop, hp, frozen_bhp, alloc_bhp) + #endif + alloc_bhp->mtx_buf = mutex; + MUTEX_LOCK(env, alloc_bhp->mtx_buf); +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + F_CLR(alloc_bhp, BH_FROZEN); + } + +diff --git a/mp/mp_region.c b/mp/mp_region.c +index e6cece9..ddbe906 100644 +--- a/mp/mp_region.c ++++ b/mp/mp_region.c +@@ -224,7 +224,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) + MTX_MPOOL_FILE_BUCKET, 0, &htab[i].mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&htab[i].hash_bucket); +- atomic_init(&htab[i].hash_page_dirty, 0); ++ atomic_init_db(&htab[i].hash_page_dirty, 0); + } + + /* +@@ -269,7 +269,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) + hp->mtx_hash = (mtx_base == MUTEX_INVALID) ? MUTEX_INVALID : + mtx_base + i; + SH_TAILQ_INIT(&hp->hash_bucket); +- atomic_init(&hp->hash_page_dirty, 0); ++ atomic_init_db(&hp->hash_page_dirty, 0); + #ifdef HAVE_STATISTICS + hp->hash_io_wait = 0; + hp->hash_frozen = hp->hash_thawed = hp->hash_frozen_freed = 0; +diff --git a/mutex/mut_method.c b/mutex/mut_method.c +index 2588763..5c6d516 100644 +--- a/mutex/mut_method.c ++++ b/mutex/mut_method.c +@@ -426,7 +426,7 @@ atomic_compare_exchange(env, v, oldval, newval) + MUTEX_LOCK(env, mtx); + ret = atomic_read(v) == oldval; + if (ret) +- atomic_init(v, newval); ++ atomic_init_db(v, newval); + MUTEX_UNLOCK(env, mtx); + + return (ret); +diff --git a/mutex/mut_tas.c b/mutex/mut_tas.c +index f3922e0..e40fcdf 100644 +--- a/mutex/mut_tas.c ++++ b/mutex/mut_tas.c +@@ -46,7 +46,7 @@ __db_tas_mutex_init(env, mutex, flags) + + #ifdef HAVE_SHARED_LATCHES + if (F_ISSET(mutexp, DB_MUTEX_SHARED)) +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + else + #endif + if (MUTEX_INIT(&mutexp->tas)) { +@@ -486,7 +486,7 @@ __db_tas_mutex_unlock(env, mutex) + F_CLR(mutexp, DB_MUTEX_LOCKED); + /* Flush flag update before zeroing count */ + MEMBAR_EXIT(); +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + } else { + DB_ASSERT(env, sharecount > 0); + MEMBAR_EXIT(); +diff -ur a/dist/aclocal/clock.m4 b/dist/aclocal/clock.m4 +--- a/dist/aclocal/clock.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/clock.m4 2023-06-05 19:14:02.007080500 -0400 +@@ -21,6 +21,7 @@ + AC_CACHE_CHECK([for clock_gettime monotonic clock], db_cv_clock_monotonic, [ + AC_TRY_RUN([ + #include ++int + main() { + struct timespec t; + return (clock_gettime(CLOCK_MONOTONIC, &t) != 0); +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -4,6 +4,7 @@ + AC_DEFUN(AM_PTHREADS_SHARED, [ + AC_TRY_RUN([ + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -46,6 +47,7 @@ + AC_DEFUN(AM_PTHREADS_PRIVATE, [ + AC_TRY_RUN([ + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +diff -ur a/dist/aclocal/sequence.m4 b/dist/aclocal/sequence.m4 +--- a/dist/aclocal/sequence.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/sequence.m4 2023-06-05 19:14:02.007869956 -0400 +@@ -43,6 +43,9 @@ + # test, which won't test for the appropriate printf format strings. + if test "$db_cv_build_sequence" = "yes"; then + AC_TRY_RUN([ ++ #include ++ #include ++ int + main() { + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; +@@ -59,7 +62,9 @@ + return (1); + return (0); + }],, [db_cv_build_sequence="no"], +- AC_TRY_LINK(,[ ++ AC_TRY_LINK([ ++ #include ++ #include ],[ + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; + char buf@<:@100@:>@; +diff -ur a/dist/RELEASE b/dist/RELEASE +--- a/dist/RELEASE 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/RELEASE 2023-07-02 17:32:34.703953049 -0400 +@@ -7,5 +7,5 @@ + + DB_VERSION_UNIQUE_NAME=`printf "_%d%03d" $DB_VERSION_MAJOR $DB_VERSION_MINOR` + +-DB_RELEASE_DATE=`date "+%B %e, %Y"` ++DB_RELEASE_DATE="April 9, 2010" + DB_VERSION_STRING="Berkeley DB $DB_VERSION: ($DB_RELEASE_DATE)" diff --git a/pkgs/by-name/db/db/clang-5.3.patch b/pkgs/by-name/db/db/clang-5.3.patch new file mode 100644 index 0000000..823a71d --- /dev/null +++ b/pkgs/by-name/db/db/clang-5.3.patch @@ -0,0 +1,249 @@ +diff --git a/src/dbinc/atomic.h b/src/dbinc/atomic.h +index 6a858f7..9f338dc 100644 +--- a/src/dbinc/atomic.h ++++ b/src/dbinc/atomic.h +@@ -70,7 +70,7 @@ typedef struct { + * These have no memory barriers; the caller must include them when necessary. + */ + #define atomic_read(p) ((p)->value) +-#define atomic_init(p, val) ((p)->value = (val)) ++#define atomic_init_db(p, val) ((p)->value = (val)) + + #ifdef HAVE_ATOMIC_SUPPORT + +@@ -144,7 +144,7 @@ typedef LONG volatile *interlocked_val; + #define atomic_inc(env, p) __atomic_inc(p) + #define atomic_dec(env, p) __atomic_dec(p) + #define atomic_compare_exchange(env, p, o, n) \ +- __atomic_compare_exchange((p), (o), (n)) ++ __atomic_compare_exchange_int((p), (o), (n)) + static inline int __atomic_inc(db_atomic_t *p) + { + int temp; +@@ -176,7 +176,7 @@ static inline int __atomic_dec(db_atomic_t *p) + * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html + * which configure could be changed to use. + */ +-static inline int __atomic_compare_exchange( ++static inline int __atomic_compare_exchange_int( + db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval) + { + atomic_value_t was; +@@ -206,7 +206,7 @@ static inline int __atomic_compare_exchange( + #define atomic_dec(env, p) (--(p)->value) + #define atomic_compare_exchange(env, p, oldval, newval) \ + (DB_ASSERT(env, atomic_read(p) == (oldval)), \ +- atomic_init(p, (newval)), 1) ++ atomic_init_db(p, (newval)), 1) + #else + #define atomic_inc(env, p) __atomic_inc(env, p) + #define atomic_dec(env, p) __atomic_dec(env, p) +diff --git a/src/mp/mp_fget.c b/src/mp/mp_fget.c +index 16de695..d0dcc29 100644 +--- a/src/mp/mp_fget.c ++++ b/src/mp/mp_fget.c +@@ -649,7 +649,7 @@ alloc: /* Allocate a new buffer header and data space. */ + + /* Initialize enough so we can call __memp_bhfree. */ + alloc_bhp->flags = 0; +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + #ifdef DIAGNOSTIC + if ((uintptr_t)alloc_bhp->buf & (sizeof(size_t) - 1)) { + __db_errx(env, DB_STR("3025", +@@ -955,7 +955,7 @@ alloc: /* Allocate a new buffer header and data space. */ + MVCC_MPROTECT(bhp->buf, mfp->pagesize, + PROT_READ); + +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + MUTEX_LOCK(env, alloc_bhp->mtx_buf); + alloc_bhp->priority = bhp->priority; + alloc_bhp->pgno = bhp->pgno; +diff --git a/src/mp/mp_mvcc.c b/src/mp/mp_mvcc.c +index 770bad8..e28cce0 100644 +--- a/src/mp/mp_mvcc.c ++++ b/src/mp/mp_mvcc.c +@@ -276,7 +276,7 @@ __memp_bh_freeze(dbmp, infop, hp, bhp, need_frozenp) + #else + memcpy(frozen_bhp, bhp, SSZA(BH, buf)); + #endif +- atomic_init(&frozen_bhp->ref, 0); ++ atomic_init_db(&frozen_bhp->ref, 0); + if (mutex != MUTEX_INVALID) + frozen_bhp->mtx_buf = mutex; + else if ((ret = __mutex_alloc(env, MTX_MPOOL_BH, +@@ -428,7 +428,7 @@ __memp_bh_thaw(dbmp, infop, hp, frozen_bhp, alloc_bhp) + #endif + alloc_bhp->mtx_buf = mutex; + MUTEX_LOCK(env, alloc_bhp->mtx_buf); +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + F_CLR(alloc_bhp, BH_FROZEN); + } + +diff --git a/src/mp/mp_region.c b/src/mp/mp_region.c +index 4952030..47645f8 100644 +--- a/src/mp/mp_region.c ++++ b/src/mp/mp_region.c +@@ -245,7 +245,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) + MTX_MPOOL_FILE_BUCKET, 0, &htab[i].mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&htab[i].hash_bucket); +- atomic_init(&htab[i].hash_page_dirty, 0); ++ atomic_init_db(&htab[i].hash_page_dirty, 0); + } + + /* +@@ -302,7 +302,7 @@ no_prealloc: + } else + hp->mtx_hash = mtx_base + (i % dbenv->mp_mtxcount); + SH_TAILQ_INIT(&hp->hash_bucket); +- atomic_init(&hp->hash_page_dirty, 0); ++ atomic_init_db(&hp->hash_page_dirty, 0); + #ifdef HAVE_STATISTICS + hp->hash_io_wait = 0; + hp->hash_frozen = hp->hash_thawed = hp->hash_frozen_freed = 0; +diff --git a/src/mutex/mut_method.c b/src/mutex/mut_method.c +index 09353b0..177353c 100644 +--- a/src/mutex/mut_method.c ++++ b/src/mutex/mut_method.c +@@ -474,7 +474,7 @@ atomic_compare_exchange(env, v, oldval, newval) + MUTEX_LOCK(env, mtx); + ret = atomic_read(v) == oldval; + if (ret) +- atomic_init(v, newval); ++ atomic_init_db(v, newval); + MUTEX_UNLOCK(env, mtx); + + return (ret); +diff --git a/src/mutex/mut_tas.c b/src/mutex/mut_tas.c +index 106b161..fc4de9d 100644 +--- a/src/mutex/mut_tas.c ++++ b/src/mutex/mut_tas.c +@@ -47,7 +47,7 @@ __db_tas_mutex_init(env, mutex, flags) + + #ifdef HAVE_SHARED_LATCHES + if (F_ISSET(mutexp, DB_MUTEX_SHARED)) +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + else + #endif + if (MUTEX_INIT(&mutexp->tas)) { +@@ -536,7 +536,7 @@ __db_tas_mutex_unlock(env, mutex) + F_CLR(mutexp, DB_MUTEX_LOCKED); + /* Flush flag update before zeroing count */ + MEMBAR_EXIT(); +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + } else { + DB_ASSERT(env, sharecount > 0); + MEMBAR_EXIT(); +diff -ur a/dist/aclocal/clock.m4 b/dist/aclocal/clock.m4 +--- a/dist/aclocal/clock.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/clock.m4 2023-06-05 19:14:02.007080500 -0400 +@@ -21,6 +21,7 @@ + AC_CACHE_CHECK([for clock_gettime monotonic clock], db_cv_clock_monotonic, [ + AC_TRY_RUN([ + #include ++int + main() { + struct timespec t; + return (clock_gettime(CLOCK_MONOTONIC, &t) != 0); +diff -ur a/dist/aclocal/mmap.m4 b/dist/aclocal/mmap.m4 +--- a/dist/aclocal/mmap.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mmap.m4 2023-06-05 19:14:02.007323624 -0400 +@@ -29,6 +29,8 @@ + * system to system. + */ + #include ++ #include ++ #include + #include + #include + #include +@@ -42,12 +44,13 @@ + #define MAP_FAILED (-1) + #endif + +- int catch_sig(sig) ++ void catch_sig(sig) + int sig; + { + exit(1); + } + ++ int + main() { + const char *underlying; + unsigned gapsize; +@@ -88,8 +91,8 @@ + return (4); + } + +- (void) signal(SIGSEGV, catch_sig); +- (void) signal(SIGBUS, catch_sig); ++ (void) signal(SIGSEGV, &catch_sig); ++ (void) signal(SIGBUS, &catch_sig); + + for (i = sizeof(buf); i < total_size; i += gapsize) + base[i] = 'A'; +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -5,6 +5,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -49,6 +50,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -89,6 +91,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_condattr_t condattr; +@@ -110,6 +113,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_rwlock_t rwlock; + pthread_rwlockattr_t rwlockattr; +diff -ur a/dist/aclocal/sequence.m4 b/dist/aclocal/sequence.m4 +--- a/dist/aclocal/sequence.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/sequence.m4 2023-06-05 19:14:02.007869956 -0400 +@@ -43,6 +43,9 @@ + # test, which won't test for the appropriate printf format strings. + if test "$db_cv_build_sequence" = "yes"; then + AC_TRY_RUN([ ++ #include ++ #include ++ int + main() { + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; +@@ -59,7 +62,9 @@ + return (1); + return (0); + }],, [db_cv_build_sequence="no"], +- AC_TRY_LINK(,[ ++ AC_TRY_LINK([ ++ #include ++ #include ],[ + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; + char buf@<:@100@:>@; diff --git a/pkgs/by-name/db/db/clang-6.0.patch b/pkgs/by-name/db/db/clang-6.0.patch new file mode 100644 index 0000000..a411e60 --- /dev/null +++ b/pkgs/by-name/db/db/clang-6.0.patch @@ -0,0 +1,123 @@ +diff --git a/src/dbinc/atomic.h b/src/dbinc/atomic.h +index e4420aa..4799b5f 100644 +--- a/src/dbinc/atomic.h ++++ b/src/dbinc/atomic.h +@@ -70,7 +70,7 @@ typedef struct { + * These have no memory barriers; the caller must include them when necessary. + */ + #define atomic_read(p) ((p)->value) +-#define atomic_init(p, val) ((p)->value = (val)) ++#define atomic_init_db(p, val) ((p)->value = (val)) + + #ifdef HAVE_ATOMIC_SUPPORT + +@@ -225,7 +225,7 @@ static inline int __atomic_compare_exchange_int( + #define atomic_dec(env, p) (--(p)->value) + #define atomic_compare_exchange(env, p, oldval, newval) \ + (DB_ASSERT(env, atomic_read(p) == (oldval)), \ +- atomic_init(p, (newval)), 1) ++ atomic_init_db(p, (newval)), 1) + #else + #define atomic_inc(env, p) __atomic_inc_int(env, p) + #define atomic_dec(env, p) __atomic_dec_int(env, p) +diff --git a/src/mp/mp_fget.c b/src/mp/mp_fget.c +index 59fe9fe..fa4ced7 100644 +--- a/src/mp/mp_fget.c ++++ b/src/mp/mp_fget.c +@@ -654,7 +654,7 @@ alloc: /* Allocate a new buffer header and data space. */ + + /* Initialize enough so we can call __memp_bhfree. */ + alloc_bhp->flags = 0; +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + #ifdef DIAGNOSTIC + if ((uintptr_t)alloc_bhp->buf & (sizeof(size_t) - 1)) { + __db_errx(env, DB_STR("3025", +@@ -969,7 +969,7 @@ alloc: /* Allocate a new buffer header and data space. */ + MVCC_MPROTECT(bhp->buf, mfp->pagesize, + PROT_READ); + +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + MUTEX_LOCK(env, alloc_bhp->mtx_buf); + alloc_bhp->priority = bhp->priority; + alloc_bhp->pgno = bhp->pgno; +diff --git a/src/mp/mp_mvcc.c b/src/mp/mp_mvcc.c +index 83c4d72..0a47202 100644 +--- a/src/mp/mp_mvcc.c ++++ b/src/mp/mp_mvcc.c +@@ -281,7 +281,7 @@ __memp_bh_freeze(dbmp, infop, hp, bhp, need_frozenp) + #else + memcpy(frozen_bhp, bhp, SSZA(BH, buf)); + #endif +- atomic_init(&frozen_bhp->ref, 0); ++ atomic_init_db(&frozen_bhp->ref, 0); + if (mutex != MUTEX_INVALID) + frozen_bhp->mtx_buf = mutex; + else if ((ret = __mutex_alloc(env, MTX_MPOOL_BH, +@@ -440,7 +440,7 @@ __memp_bh_thaw(dbmp, infop, hp, frozen_bhp, alloc_bhp) + #endif + alloc_bhp->mtx_buf = mutex; + MUTEX_LOCK(env, alloc_bhp->mtx_buf); +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + F_CLR(alloc_bhp, BH_FROZEN); + } + +diff --git a/src/mp/mp_region.c b/src/mp/mp_region.c +index 4d95e4f..e97459c 100644 +--- a/src/mp/mp_region.c ++++ b/src/mp/mp_region.c +@@ -278,7 +278,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) + MTX_MPOOL_FILE_BUCKET, 0, &htab[i].mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&htab[i].hash_bucket); +- atomic_init(&htab[i].hash_page_dirty, 0); ++ atomic_init_db(&htab[i].hash_page_dirty, 0); + } + + mtx_base = mtx_prev = MUTEX_INVALID; +@@ -332,7 +332,7 @@ no_prealloc: + DB_MUTEX_SHARED, &hp->mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&hp->hash_bucket); +- atomic_init(&hp->hash_page_dirty, 0); ++ atomic_init_db(&hp->hash_page_dirty, 0); + #ifdef HAVE_STATISTICS + hp->hash_io_wait = 0; + hp->hash_frozen = hp->hash_thawed = hp->hash_frozen_freed = 0; +diff --git a/src/mutex/mut_method.c b/src/mutex/mut_method.c +index 72b34de..a9f9868 100644 +--- a/src/mutex/mut_method.c ++++ b/src/mutex/mut_method.c +@@ -501,7 +501,7 @@ __atomic_compare_exchange_int(env, v, oldval, newval) + MUTEX_LOCK(env, mtx); + ret = atomic_read(v) == oldval; + if (ret) +- atomic_init(v, newval); ++ atomic_init_db(v, newval); + MUTEX_UNLOCK(env, mtx); + + return (ret); +diff --git a/src/mutex/mut_tas.c b/src/mutex/mut_tas.c +index 7899c4b..d9420fa 100644 +--- a/src/mutex/mut_tas.c ++++ b/src/mutex/mut_tas.c +@@ -47,7 +47,7 @@ __db_tas_mutex_init(env, mutex, flags) + + #ifdef HAVE_SHARED_LATCHES + if (F_ISSET(mutexp, DB_MUTEX_SHARED)) +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + else + #endif + if (MUTEX_INIT(&mutexp->tas)) { +@@ -643,7 +643,7 @@ was_not_locked: + F_CLR(mutexp, DB_MUTEX_LOCKED); + /* Flush flag update before zeroing count */ + MEMBAR_EXIT(); +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + } else { + DB_ASSERT(env, sharecount > 0); + MEMBAR_EXIT(); diff --git a/pkgs/by-name/db/db/darwin-mutexes-4.8.patch b/pkgs/by-name/db/db/darwin-mutexes-4.8.patch new file mode 100644 index 0000000..09d5b81 --- /dev/null +++ b/pkgs/by-name/db/db/darwin-mutexes-4.8.patch @@ -0,0 +1,55 @@ +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -372,10 +376,11 @@ + + # _spin_lock_try/_spin_unlock: Apple/Darwin + if test "$db_cv_mutex" = no; then +-AC_TRY_LINK(,[ +- int x; +- _spin_lock_try(&x); +- _spin_unlock(&x); ++AC_TRY_LINK([ ++#include ],[ ++ os_unfair_lock x = OS_UNFAIR_LOCK_INIT; ++ bool _ = os_unfair_lock_trylock(&x); ++ os_unfair_lock_unlock(&x); + ], [db_cv_mutex=Darwin/_spin_lock_try]) + fi + +diff -ur a/dbinc/mutex_int.h b/dbinc/mutex_int.h +--- a/dbinc/mutex_int.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/dbinc/mutex_int.h 2023-06-05 19:15:37.510514745 -0400 +@@ -154,14 +154,13 @@ + * Apple/Darwin library functions. + *********************************************************************/ + #ifdef HAVE_MUTEX_DARWIN_SPIN_LOCK_TRY +-typedef u_int32_t tsl_t; ++#include ++typedef os_unfair_lock tsl_t; + + #ifdef LOAD_ACTUAL_MUTEX_CODE +-extern int _spin_lock_try(tsl_t *); +-extern void _spin_unlock(tsl_t *); +-#define MUTEX_SET(tsl) _spin_lock_try(tsl) +-#define MUTEX_UNSET(tsl) _spin_unlock(tsl) +-#define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0) ++#define MUTEX_SET(tsl) os_unfair_lock_trylock(tsl) ++#define MUTEX_UNSET(tsl) os_unfair_lock_unlock(tsl) ++#define MUTEX_INIT(tsl) ({ *(tsl) = OS_UNFAIR_LOCK_INIT; tsl; }) + #endif + #endif + +diff -ur a/dbinc/mutex_int.h b/dbinc/mutex_int.h +--- a/dbinc_auto/mutex_ext.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/dbinc_auto/mutex_ext.h 2023-07-01 22:38:20.749201366 -0400 +@@ -34,6 +34,9 @@ + #if !defined(HAVE_ATOMIC_SUPPORT) && defined(HAVE_MUTEX_SUPPORT) + atomic_value_t __atomic_dec __P((ENV *, db_atomic_t *)); + #endif ++#if !defined(HAVE_ATOMIC_SUPPORT) && defined(HAVE_MUTEX_SUPPORT) ++int atomic_compare_exchange __P((ENV *, db_atomic_t *, atomic_value_t, atomic_value_t)); ++#endif + int __db_pthread_mutex_init __P((ENV *, db_mutex_t, u_int32_t)); + int __db_pthread_mutex_lock __P((ENV *, db_mutex_t)); + #if defined(HAVE_SHARED_LATCHES) diff --git a/pkgs/by-name/db/db/darwin-mutexes.patch b/pkgs/by-name/db/db/darwin-mutexes.patch new file mode 100644 index 0000000..c0616fd --- /dev/null +++ b/pkgs/by-name/db/db/darwin-mutexes.patch @@ -0,0 +1,42 @@ +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -441,10 +445,11 @@ + + # _spin_lock_try/_spin_unlock: Apple/Darwin + if test "$db_cv_mutex" = no; then +-AC_TRY_LINK(,[ +- int x; +- _spin_lock_try(&x); +- _spin_unlock(&x); ++AC_TRY_LINK([ ++#include ],[ ++ os_unfair_lock x = OS_UNFAIR_LOCK_INIT; ++ bool _ = os_unfair_lock_trylock(&x); ++ os_unfair_lock_unlock(&x); + ], [db_cv_mutex=Darwin/_spin_lock_try]) + fi + +diff -ur a/src/dbinc/mutex_int.h b/src/dbinc/mutex_int.h +--- a/src/dbinc/mutex_int.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/src/dbinc/mutex_int.h 2023-06-05 19:15:37.510514745 -0400 +@@ -154,14 +154,13 @@ + * Apple/Darwin library functions. + *********************************************************************/ + #ifdef HAVE_MUTEX_DARWIN_SPIN_LOCK_TRY +-typedef u_int32_t tsl_t; ++#include ++typedef os_unfair_lock tsl_t; + + #ifdef LOAD_ACTUAL_MUTEX_CODE +-extern int _spin_lock_try(tsl_t *); +-extern void _spin_unlock(tsl_t *); +-#define MUTEX_SET(tsl) _spin_lock_try(tsl) +-#define MUTEX_UNSET(tsl) _spin_unlock(tsl) +-#define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0) ++#define MUTEX_SET(tsl) os_unfair_lock_trylock(tsl) ++#define MUTEX_UNSET(tsl) os_unfair_lock_unlock(tsl) ++#define MUTEX_INIT(tsl) ({ *(tsl) = OS_UNFAIR_LOCK_INIT; tsl; }) + #endif + #endif + diff --git a/pkgs/by-name/db/db/db-4.8.nix b/pkgs/by-name/db/db/db-4.8.nix new file mode 100644 index 0000000..8170537 --- /dev/null +++ b/pkgs/by-name/db/db/db-4.8.nix @@ -0,0 +1,14 @@ +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: + +import ./generic.nix (args // { + version = "4.8.30"; + sha256 = "0ampbl2f0hb1nix195kz1syrqqxpmvnvnfvphambj7xjrl3iljg0"; + extraPatches = [ + ./clang-4.8.patch + ./CVE-2017-10140-4.8-cwd-db_config.patch + ./darwin-mutexes-4.8.patch + ]; + + drvArgs.hardeningDisable = [ "format" ]; + drvArgs.doCheck = false; +}) diff --git a/pkgs/by-name/db/db/db-5.3.nix b/pkgs/by-name/db/db/db-5.3.nix new file mode 100644 index 0000000..2362cc9 --- /dev/null +++ b/pkgs/by-name/db/db/db-5.3.nix @@ -0,0 +1,11 @@ +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: + +import ./generic.nix (args // { + version = "5.3.28"; + sha256 = "0a1n5hbl7027fbz5lm0vp0zzfp1hmxnz14wx3zl9563h83br5ag0"; + extraPatches = [ + ./clang-5.3.patch + ./CVE-2017-10140-cwd-db_config.patch + ./darwin-mutexes.patch + ]; +}) diff --git a/pkgs/by-name/db/db/db-6.0.nix b/pkgs/by-name/db/db/db-6.0.nix new file mode 100644 index 0000000..d92d28d --- /dev/null +++ b/pkgs/by-name/db/db/db-6.0.nix @@ -0,0 +1,12 @@ +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: + +import ./generic.nix (args // { + version = "6.0.30"; + sha256 = "1lhglbvg65j5slrlv7qv4vi3cvd7kjywa07gq1abzschycf4p3k0"; + license = lib.licenses.agpl3Only; + extraPatches = [ + ./clang-6.0.patch + ./CVE-2017-10140-cwd-db_config.patch + ./darwin-mutexes.patch + ]; +}) diff --git a/pkgs/by-name/db/db/db-6.2.nix b/pkgs/by-name/db/db/db-6.2.nix new file mode 100644 index 0000000..fd5a532 --- /dev/null +++ b/pkgs/by-name/db/db/db-6.2.nix @@ -0,0 +1,12 @@ +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: + +import ./generic.nix (args // { + version = "6.2.32"; + sha256 = "1yx8wzhch5wwh016nh0kfxvknjkafv6ybkqh6nh7lxx50jqf5id9"; + license = lib.licenses.agpl3Only; + extraPatches = [ + ./clang-6.0.patch + ./CVE-2017-10140-cwd-db_config.patch + ./darwin-mutexes.patch + ]; +}) diff --git a/pkgs/by-name/db/db/generic.nix b/pkgs/by-name/db/db/generic.nix new file mode 100644 index 0000000..d715c1f --- /dev/null +++ b/pkgs/by-name/db/db/generic.nix @@ -0,0 +1,95 @@ +{ lib, stdenv, fetchurl, autoreconfHook +, cxxSupport ? true +, compat185 ? true +, dbmSupport ? false + +# Options from inherited versions +, version, sha256 +, extraPatches ? [ ] +, license ? lib.licenses.sleepycat +, drvArgs ? {} +}: + +stdenv.mkDerivation (rec { + pname = "db"; + inherit version; + + src = fetchurl { + url = "https://download.oracle.com/berkeley-db/${pname}-${version}.tar.gz"; + sha256 = sha256; + }; + + # The provided configure script features `main` returning implicit `int`, which causes + # configure checks to work incorrectly with clang 16. + nativeBuildInputs = [ autoreconfHook ]; + + patches = extraPatches; + + outputs = [ "bin" "out" "dev" ]; + + # Required when regenerated the configure script to make sure the vendored macros are found. + autoreconfFlags = [ "-fi" "-Iaclocal" "-Iaclocal_java" ]; + + preAutoreconf = '' + pushd dist + # Upstream’s `dist/s_config` cats everything into `aclocal.m4`, but that doesn’t work with + # autoreconfHook, so cat `config.m4` to another file. Otherwise, it won’t be found by `aclocal`. + cat aclocal/config.m4 >> aclocal/options.m4 + ''; + + # This isn’t pretty. The version information is kept separate from the configure script. + # After the configure script is regenerated, the version information has to be replaced with the + # contents of `dist/RELEASE`. + postAutoreconf = '' + ( + declare -a vars=( + "DB_VERSION_FAMILY" + "DB_VERSION_RELEASE" + "DB_VERSION_MAJOR" + "DB_VERSION_MINOR" + "DB_VERSION_PATCH" + "DB_VERSION_STRING" + "DB_VERSION_FULL_STRING" + "DB_VERSION_UNIQUE_NAME" + "DB_VERSION" + ) + source RELEASE + for var in "''${vars[@]}"; do + sed -e "s/__EDIT_''${var}__/''${!var}/g" -i configure + done + ) + popd + ''; + + configureFlags = + [ + (if cxxSupport then "--enable-cxx" else "--disable-cxx") + (if compat185 then "--enable-compat185" else "--disable-compat185") + ] + ++ lib.optional dbmSupport "--enable-dbm" + ++ lib.optional stdenv.isFreeBSD "--with-pic"; + + preConfigure = '' + cd build_unix + configureScript=../dist/configure + ''; + + postInstall = '' + rm -rf $out/docs + ''; + + enableParallelBuilding = true; + + doCheck = true; + + checkPhase = '' + make examples_c examples_cxx + ''; + + meta = with lib; { + homepage = "https://www.oracle.com/database/technologies/related/berkeleydb.html"; + description = "Berkeley DB"; + license = license; + platforms = platforms.unix; + }; +} // drvArgs) diff --git a/pkgs/by-name/db/db/packages.nix b/pkgs/by-name/db/db/packages.nix new file mode 100644 index 0000000..ff5dee7 --- /dev/null +++ b/pkgs/by-name/db/db/packages.nix @@ -0,0 +1,16 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Make bdb5 the default as it is the last release under the custom + # bsd-like license + db = db5; + db4 = db48; + db48 = callPackage ./db-4.8.nix { }; + db5 = db53; + db53 = callPackage ./db-5.3.nix { }; + db6 = db60; + db60 = callPackage ./db-6.0.nix { }; + db62 = callPackage ./db-6.2.nix { }; +} diff --git a/pkgs/by-name/db/dblatex/default.nix b/pkgs/by-name/db/dblatex/default.nix new file mode 100644 index 0000000..d615cef --- /dev/null +++ b/pkgs/by-name/db/dblatex/default.nix @@ -0,0 +1,67 @@ +{ lib, stdenv, fetchurl, python3, libxslt, texliveBasic +, enableAllFeatures ? false, imagemagick, fig2dev, inkscape, fontconfig, ghostscript + +, tex ? texliveBasic.withPackages (ps: with ps; [ # satisfy all packages that ./configure mentions + epstopdf anysize appendix changebar + fancybox fancyvrb float footmisc listings jknapltx/*for mathrsfs.sty*/ + multirow overpic pdfpages pdflscape graphics stmaryrd subfigure titlesec wasysym + # pkgs below don't seem requested by dblatex, but our manual fails without them + ec zapfding symbol eepic times rsfs cs tex4ht courier helvetic ly1 + ]) +}: + +# NOTE: enableAllFeatures just purifies the expression, it doesn't actually +# enable any extra features. + +stdenv.mkDerivation rec { + pname = "dblatex${lib.optionalString enableAllFeatures "-full"}"; + version = "0.3.12"; + + src = fetchurl { + url = "mirror://sourceforge/dblatex/${pname}3-${version}.tar.bz2"; + sha256 = "0yd09nypswy3q4scri1dg7dr99d7gd6r2dwx0xm81l9f4y32gs0n"; + }; + + buildInputs = [ python3 libxslt tex ] + ++ lib.optionals enableAllFeatures [ imagemagick fig2dev ]; + + # TODO: dblatex tries to execute texindy command, but nixpkgs doesn't have + # that yet. In Ubuntu, texindy is a part of the xindy package. + preConfigure = '' + sed -i 's|self.install_layout == "deb"|False|' setup.py + '' + lib.optionalString enableAllFeatures '' + for file in $(find -name "*.py"); do + sed -e 's|cmd = \["xsltproc|cmd = \["${libxslt.bin}/bin/xsltproc|g' \ + -e 's|Popen(\["xsltproc|Popen(\["${libxslt.bin}/bin/xsltproc|g' \ + -e 's|cmd = \["texindy|cmd = ["nixpkgs_is_missing_texindy|g' \ + -e 's|cmd = "epstopdf|cmd = "${tex}/bin/epstopdf|g' \ + -e 's|cmd = \["makeindex|cmd = ["${tex}/bin/makeindex|g' \ + -e 's|doc.program = "pdflatex"|doc.program = "${tex}/bin/pdflatex"|g' \ + -e 's|self.program = "latex"|self.program = "${tex}/bin/latex"|g' \ + -e 's|Popen("pdflatex|Popen("${tex}/bin/pdflatex|g' \ + -e 's|"fc-match"|"${fontconfig.bin}/bin/fc-match"|g' \ + -e 's|"fc-list"|"${fontconfig.bin}/bin/fc-list"|g' \ + -e 's|cmd = "inkscape|cmd = "${inkscape}/bin/inkscape|g' \ + -e 's|cmd = "fig2dev|cmd = "${fig2dev}/bin/fig2dev|g' \ + -e 's|cmd = \["ps2pdf|cmd = ["${ghostscript}/bin/ps2pdf|g' \ + -e 's|cmd = "convert|cmd = "${imagemagick.out}/bin/convert|g' \ + -i "$file" + done + ''; + + dontBuild = true; + + installPhase = '' + ${python3.interpreter} ./setup.py install --prefix="$out" --use-python-path --verbose + ''; + + passthru = { inherit tex; }; + + meta = { + description = "A program to convert DocBook to DVI, PostScript or PDF via LaTeX or ConTeXt"; + mainProgram = "dblatex"; + homepage = "https://dblatex.sourceforge.net/"; + license = lib.licenses.gpl2Plus; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/db/dblatex/packages.nix b/pkgs/by-name/db/dblatex/packages.nix new file mode 100644 index 0000000..c3deb97 --- /dev/null +++ b/pkgs/by-name/db/dblatex/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + dblatex = callPackage ./. { }; + dblatexFull = dblatex.override { enableAllFeatures = true; }; +} diff --git a/pkgs/by-name/db/dbus/default.nix b/pkgs/by-name/db/dbus/default.nix new file mode 100644 index 0000000..cb5fe9e --- /dev/null +++ b/pkgs/by-name/db/dbus/default.nix @@ -0,0 +1,124 @@ +{ stdenv +, lib +, fetchurl +, pkg-config +, expat +, enableSystemd ? lib.meta.availableOn stdenv.hostPlatform systemdMinimal +, systemdMinimal +, audit +, libapparmor +, dbus +, docbook_xml_dtd_44 +, docbook-xsl-nons +, xmlto +, autoreconfHook +, autoconf-archive +, x11Support ? (stdenv.isLinux || stdenv.isDarwin) +, xorg +}: + +stdenv.mkDerivation rec { + pname = "dbus"; + version = "1.14.10"; + + src = fetchurl { + url = "https://dbus.freedesktop.org/releases/dbus/dbus-${version}.tar.xz"; + sha256 = "sha256-uh8h0r2dM52i1KqHgMCd8y/qh5mLc9ok9Jq53x42pQ8="; + }; + + patches = lib.optional stdenv.isSunOS ./implement-getgrouplist.patch; + + postPatch = '' + substituteInPlace bus/Makefile.am \ + --replace 'install-data-hook:' 'disabled:' \ + --replace '$(mkinstalldirs) $(DESTDIR)$(localstatedir)/run/dbus' ':' + substituteInPlace tools/Makefile.am \ + --replace 'install-data-local:' 'disabled:' \ + --replace 'installcheck-local:' 'disabled:' + '' + /* cleanup of runtime references */ '' + substituteInPlace ./dbus/dbus-sysdeps-unix.c \ + --replace 'DBUS_BINDIR "/dbus-launch"' "\"$lib/bin/dbus-launch\"" + substituteInPlace ./tools/dbus-launch.c \ + --replace 'DBUS_DAEMONDIR"/dbus-daemon"' '"/run/current-system/sw/bin/dbus-daemon"' + ''; + + outputs = [ "out" "dev" "lib" "doc" "man" ]; + separateDebugInfo = true; + + strictDeps = true; + nativeBuildInputs = [ + autoreconfHook + autoconf-archive + pkg-config + docbook_xml_dtd_44 + docbook-xsl-nons + xmlto + ]; + + propagatedBuildInputs = [ + expat + ]; + + buildInputs = + lib.optionals x11Support (with xorg; [ + libX11 + libICE + libSM + ]) ++ lib.optional enableSystemd systemdMinimal + ++ lib.optionals stdenv.isLinux [ audit libapparmor ]; + # ToDo: optional selinux? + + __darwinAllowLocalNetworking = true; + + configureFlags = [ + "--enable-user-session" + "--enable-xml-docs" + "--libexecdir=${placeholder "out"}/libexec" + "--datadir=/etc" + "--localstatedir=/var" + "--runstatedir=/run" + "--sysconfdir=/etc" + "--with-session-socket-dir=/tmp" + "--with-system-pid-file=/run/dbus/pid" + "--with-system-socket=/run/dbus/system_bus_socket" + "--with-systemdsystemunitdir=${placeholder "out"}/etc/systemd/system" + "--with-systemduserunitdir=${placeholder "out"}/etc/systemd/user" + ] ++ lib.optional (!x11Support) "--without-x" + ++ lib.optionals stdenv.isLinux [ "--enable-apparmor" "--enable-libaudit" ] + ++ lib.optionals enableSystemd [ "SYSTEMCTL=${systemdMinimal}/bin/systemctl" ]; + + NIX_CFLAGS_LINK = lib.optionalString (!stdenv.isDarwin) "-Wl,--as-needed"; + + enableParallelBuilding = true; + + doCheck = true; + + makeFlags = [ + # Fix paths in XML catalog broken by mismatching build/install datadir. + "dtddir=${placeholder "out"}/share/xml/dbus-1" + ]; + + installFlags = [ + "sysconfdir=${placeholder "out"}/etc" + "datadir=${placeholder "out"}/share" + ]; + + # it's executed from $lib by absolute path + postFixup = '' + moveToOutput bin/dbus-launch "$lib" + ln -s "$lib/bin/dbus-launch" "$out/bin/" + ''; + + passthru = { + dbus-launch = "${dbus.lib}/bin/dbus-launch"; + }; + + meta = with lib; { + description = "Simple interprocess messaging system"; + homepage = "https://www.freedesktop.org/wiki/Software/dbus/"; + changelog = "https://gitlab.freedesktop.org/dbus/dbus/-/blob/dbus-${version}/NEWS"; + license = licenses.gpl2Plus; # most is also under AFL-2.1 + maintainers = teams.freedesktop.members ++ (with maintainers; [ ]); + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/db/dbus/implement-getgrouplist.patch b/pkgs/by-name/db/dbus/implement-getgrouplist.patch new file mode 100644 index 0000000..e3a4a25 --- /dev/null +++ b/pkgs/by-name/db/dbus/implement-getgrouplist.patch @@ -0,0 +1,108 @@ +Compatibility patch for Illumos/Solaris and possibly other platforms. +Implements getgrouplist when not provided by OS. +Without it, only the user's primary group is used in authentication! +--- 1970-01-01 00:00:00.000000000 +0000 ++++ dbus-1.6.8/dbus/getgrouplist.c 2013-02-28 13:10:51.081792722 +0000 +@@ -0,0 +1,89 @@ ++/* $OpenBSD: getgrouplist.c,v 1.12 2005/08/08 08:05:34 espie Exp $ */ ++/* ++ * Copyright (c) 1991, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++/* OPENBSD ORIGINAL: lib/libc/gen/getgrouplist.c */ ++ ++/* ++ * get credential ++ */ ++#include ++#include ++#include ++#include ++ ++int ++getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) ++{ ++ struct group *grp; ++ int i, ngroups; ++ int ret, maxgroups; ++ int bail; ++ ++ ret = 0; ++ ngroups = 0; ++ maxgroups = *grpcnt; ++ ++ /* ++ * install primary group ++ */ ++ if (ngroups >= maxgroups) { ++ *grpcnt = ngroups; ++ return (-1); ++ } ++ groups[ngroups++] = agroup; ++ ++ /* ++ * Scan the group file to find additional groups. ++ */ ++ setgrent(); ++ while ((grp = getgrent())) { ++ if (grp->gr_gid == agroup) ++ continue; ++ for (bail = 0, i = 0; bail == 0 && i < ngroups; i++) ++ if (groups[i] == grp->gr_gid) ++ bail = 1; ++ if (bail) ++ continue; ++ for (i = 0; grp->gr_mem[i]; i++) { ++ if (!strcmp(grp->gr_mem[i], uname)) { ++ if (ngroups >= maxgroups) { ++ ret = -1; ++ goto out; ++ } ++ groups[ngroups++] = grp->gr_gid; ++ break; ++ } ++ } ++ } ++out: ++ endgrent(); ++ *grpcnt = ngroups; ++ return (ret); ++} +--- dbus-1.6.8/dbus/dbus-sysdeps-unix.c.orig 2013-02-28 13:08:52.171215237 +0000 ++++ dbus-1.6.8/dbus/dbus-sysdeps-unix.c 2013-02-28 13:13:52.224615146 +0000 +@@ -21,6 +21,10 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ ++#ifndef HAVE_GETGROUPLIST ++#include "getgrouplist.c" ++#define HAVE_GETGROUPLIST ++#endif + + #include + diff --git a/pkgs/by-name/db/dbus/make-dbus-conf.nix b/pkgs/by-name/db/dbus/make-dbus-conf.nix new file mode 100644 index 0000000..0a8b630 --- /dev/null +++ b/pkgs/by-name/db/dbus/make-dbus-conf.nix @@ -0,0 +1,49 @@ +{ runCommand +, writeText +, libxslt +, dbus +, findXMLCatalogs +, serviceDirectories ? [] +, suidHelper ? "/var/setuid-wrappers/dbus-daemon-launch-helper" +, apparmor ? "disabled" # one of enabled, disabled, required +}: + +/* DBus has two configuration parsers -- normal and "trivial", which is used + * for suid helper. Unfortunately the latter doesn't support + * directive. That means that we can't just place our configuration to + * *-local.conf -- it needs to be in the main configuration file. + */ +runCommand "dbus-1" + { + inherit serviceDirectories suidHelper apparmor; + preferLocalBuild = true; + allowSubstitutes = false; + + nativeBuildInputs = [ + libxslt.bin + findXMLCatalogs + ]; + + buildInputs = [ + dbus.out + ]; + } + '' + mkdir -p $out + + xsltproc --nonet \ + --stringparam serviceDirectories "$serviceDirectories" \ + --stringparam suidHelper "$suidHelper" \ + --stringparam apparmor "$apparmor" \ + ${./make-system-conf.xsl} ${dbus}/share/dbus-1/system.conf \ + > $out/system.conf + xsltproc --nonet \ + --stringparam serviceDirectories "$serviceDirectories" \ + --stringparam apparmor "$apparmor" \ + ${./make-session-conf.xsl} ${dbus}/share/dbus-1/session.conf \ + > $out/session.conf + + # check if files are empty or only contain space characters + grep -q '[^[:space:]]' "$out/system.conf" || (echo "\"$out/system.conf\" was generated incorrectly and is empty, try building again." && exit 1) + grep -q '[^[:space:]]' "$out/session.conf" || (echo "\"$out/session.conf\" was generated incorrectly and is empty, try building again." && exit 1) + '' diff --git a/pkgs/by-name/db/dbus/make-session-conf.xsl b/pkgs/by-name/db/dbus/make-session-conf.xsl new file mode 100644 index 0000000..a744905 --- /dev/null +++ b/pkgs/by-name/db/dbus/make-session-conf.xsl @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + /share/dbus-1/services + /etc/dbus-1/session.d + /share/dbus-1/session.d + + + + + diff --git a/pkgs/by-name/db/dbus/make-system-conf.xsl b/pkgs/by-name/db/dbus/make-system-conf.xsl new file mode 100644 index 0000000..06233e7 --- /dev/null +++ b/pkgs/by-name/db/dbus/make-system-conf.xsl @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + /share/dbus-1/system-services + /etc/dbus-1/system.d + /share/dbus-1/system.d + + + + + diff --git a/pkgs/by-name/de/dejagnu/default.nix b/pkgs/by-name/de/dejagnu/default.nix new file mode 100644 index 0000000..5c7720a --- /dev/null +++ b/pkgs/by-name/de/dejagnu/default.nix @@ -0,0 +1,66 @@ +{ fetchurl, lib, stdenv, expect, makeWrapper }: + +stdenv.mkDerivation rec { + pname = "dejagnu"; + version = "1.6.3"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz"; + sha256 = "1qx2cv6qkxbiqg87jh217jb62hk3s7dmcs4cz1llm2wmsynfznl7"; + }; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ expect ]; + + # dejagnu-1.6.3 can't successfully run tests in source tree: + # https://wiki.linuxfromscratch.org/lfs/ticket/4871 + preConfigure = '' + mkdir build + cd build + ''; + configureScript = "../configure"; + + doCheck = !(with stdenv; isDarwin && isAarch64); + + # Note: The test-suite *requires* /dev/pts among the `build-chroot-dirs' of + # the build daemon when building in a chroot. See + # for + # details. + + # The test-suite needs to have a non-empty stdin: + # https://lists.gnu.org/archive/html/bug-dejagnu/2003-06/msg00002.html + checkPhase = '' + # Provide `runtest' with a log name, otherwise it tries to run + # `whoami', which fails when in a chroot. + LOGNAME="nix-build-daemon" make check < /dev/zero + ''; + + postInstall = '' + # 'runtest' and 'dejagnu' look up 'expect' in their 'bin' path + # first. We avoid use of 'wrapProgram' here because wrapping + # of shell scripts does not preserve argv[0] for schell scripts: + # https://sourceware.org/PR30052#c5 + ln -s ${expect}/bin/expect $out/bin/expect + ''; + + meta = with lib; { + description = "Framework for testing other programs"; + + longDescription = '' + DejaGnu is a framework for testing other programs. Its purpose + is to provide a single front end for all tests. Think of it as a + custom library of Tcl procedures crafted to support writing a + test harness. A test harness is the testing infrastructure that + is created to support a specific program or tool. Each program + can have multiple testsuites, all supported by a single test + harness. DejaGnu is written in Expect, which in turn uses Tcl -- + Tool command language. + ''; + + homepage = "https://www.gnu.org/software/dejagnu/"; + license = licenses.gpl2Plus; + + platforms = platforms.unix; + maintainers = with maintainers; [ vrthra ]; + }; +} diff --git a/pkgs/by-name/de/dejavu-fonts/default.nix b/pkgs/by-name/de/dejavu-fonts/default.nix new file mode 100644 index 0000000..ba9fed1 --- /dev/null +++ b/pkgs/by-name/de/dejavu-fonts/default.nix @@ -0,0 +1,65 @@ +{ fetchFromGitHub, lib, stdenv, fontforge, perl, perlPackages }: + +let + version = "2.37"; + + meta = { + description = "A typeface family based on the Bitstream Vera fonts"; + longDescription = '' + The DejaVu fonts are TrueType fonts based on the BitStream Vera fonts, + providing more styles and with greater coverage of Unicode. + + This package includes DejaVu Sans, DejaVu Serif, DejaVu Sans Mono, and + the TeX Gyre DejaVu Math font. + ''; + homepage = "https://dejavu-fonts.github.io/"; + + # Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. + # Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + # DejaVu changes are in public domain + # See http://dejavu-fonts.org/wiki/License for details + license = lib.licenses.free; + + platforms = lib.platforms.all; + }; + + full-ttf = stdenv.mkDerivation { + pname = "dejavu-fonts-full"; + inherit version; + nativeBuildInputs = [fontforge perl perlPackages.IOString perlPackages.FontTTF]; + + src = fetchFromGitHub { + owner = "dejavu-fonts"; + repo = "dejavu-fonts"; + rev = "version_${lib.replaceStrings ["."] ["_"] version}"; + sha256 = "1xknlg2h287dx34v2n5r33bpcl4biqf0cv7nak657rjki7s0k4bk"; + }; + + buildFlags = [ "full-ttf" ]; + + preBuild = "patchShebangs scripts"; + + installPhase = "install -m444 -Dt $out/share/fonts/truetype build/*.ttf"; + + inherit meta; + }; + + minimal = stdenv.mkDerivation { + pname = "dejavu-fonts-minimal"; + inherit version; + buildCommand = '' + install -m444 -Dt $out/share/fonts/truetype ${full-ttf}/share/fonts/truetype/DejaVuSans.ttf + ''; + inherit meta; + }; +in stdenv.mkDerivation { + pname = "dejavu-fonts"; + inherit version; + buildCommand = '' + install -m444 -Dt $out/share/fonts/truetype ${full-ttf}/share/fonts/truetype/*.ttf + ln -s --relative --force --target-directory=$out/share/fonts/truetype ${minimal}/share/fonts/truetype/DejaVuSans.ttf + ''; + inherit meta; + + passthru = { inherit minimal full-ttf; }; +} diff --git a/pkgs/by-name/de/dejavu-fonts/packages.nix b/pkgs/by-name/de/dejavu-fonts/packages.nix new file mode 100644 index 0000000..0c1f43f --- /dev/null +++ b/pkgs/by-name/de/dejavu-fonts/packages.nix @@ -0,0 +1,13 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + dejavu_fonts = lowPrio (callPackage ./. {}); + + # solve collision for nix-env before https://github.com/NixOS/nix/pull/815 + dejavu_fontsEnv = buildEnv { + name = dejavu_fonts.name; + paths = [ dejavu_fonts.out ]; + }; +} diff --git a/pkgs/by-name/di/diffutils/default.nix b/pkgs/by-name/di/diffutils/default.nix new file mode 100644 index 0000000..8c4a160 --- /dev/null +++ b/pkgs/by-name/di/diffutils/default.nix @@ -0,0 +1,46 @@ +{ lib, stdenv, fetchurl, xz, coreutils ? null }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "diffutils"; + version = "3.10"; + + src = fetchurl { + url = "mirror://gnu/diffutils/diffutils-${version}.tar.xz"; + hash = "sha256-kOXpPMck5OvhLt6A3xY0Bjx6hVaSaFkZv+YLVWyb0J4="; + }; + + outputs = [ "out" "info" ]; + + nativeBuildInputs = [ (lib.getBin xz) ]; + /* If no explicit coreutils is given, use the one from stdenv. */ + buildInputs = [ coreutils ]; + + # Disable stack-related gnulib tests on x86_64-darwin because they have problems running under + # Rosetta 2: test-c-stack hangs, test-sigsegv-catch-stackoverflow fails. + postPatch = if (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) then '' + sed -i -E 's:test-c-stack2?\.sh::g' gnulib-tests/Makefile.in + sed -i -E 's:test-sigsegv-catch-stackoverflow[12]::g' gnulib-tests/Makefile.in + '' else null; + + configureFlags = + # "pr" need not be on the PATH as a run-time dep, so we need to tell + # configure where it is. Covers the cross and native case alike. + lib.optional (coreutils != null) "PR_PROGRAM=${coreutils}/bin/pr" + ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "gl_cv_func_getopt_gnu=yes"; + + # Test failure on QEMU only (#300550) + doCheck = !stdenv.buildPlatform.isRiscV64; + + meta = with lib; { + homepage = "https://www.gnu.org/software/diffutils/diffutils.html"; + description = "Commands for showing the differences between files (diff, cmp, etc.)"; + license = licenses.gpl3; + platforms = platforms.unix; + maintainers = with maintainers; [ das_j ]; + }; +} diff --git a/pkgs/by-name/dj/djvulibre/CVE-2021-3500+CVE-2021-32490+CVE-2021-32491+CVE-2021-32492+CVE-2021-32493.patch b/pkgs/by-name/dj/djvulibre/CVE-2021-3500+CVE-2021-32490+CVE-2021-32491+CVE-2021-32492+CVE-2021-32493.patch new file mode 100644 index 0000000..e305c56 --- /dev/null +++ b/pkgs/by-name/dj/djvulibre/CVE-2021-3500+CVE-2021-32490+CVE-2021-32491+CVE-2021-32492+CVE-2021-32493.patch @@ -0,0 +1,105 @@ +From cd8b5c97b27a5c1dc83046498b6ca49ad20aa9b6 Mon Sep 17 00:00:00 2001 +From: Leon Bottou +Date: Tue, 11 May 2021 14:44:09 -0400 +Subject: [PATCH] Reviewed Fedora patches and adopted some of them (or variants + thereof) + + - Patch0: djvulibre-3.5.22-cdefs.patch (forward ported) +Does not make imuch sense. GSmartPointer.h already includes "stddef.h" + - Patch6: djvulibre-3.5.27-export-file.patch (forward ported) +Incorrect: inkscape command is --export-png, not --export-filename. + - Patch8: djvulibre-3.5.27-check-image-size.patch (forward ported) +Correct: adopted a variant of this + - Patch9: djvulibre-3.5.27-integer-overflow.patch (forward ported) +Correct: adopted a variant of this + - Patch10: djvulibre-3.5.27-check-input-pool.patch (forward ported) +Adopted: input validation never hurts + - Patch11: djvulibre-3.5.27-djvuport-stack-overflow.patch (forward ported) +Dubious: Instead I changed djvufile to prevent a file from including itself +which is the only way I can imagine to create an file creation loop. + - Patch12: djvulibre-3.5.27-unsigned-short-overflow.patch (forward ported) +Adopted: but without including limits.h +--- + libdjvu/DataPool.cpp | 3 ++- + libdjvu/DjVuFile.cpp | 2 ++ + libdjvu/GBitmap.cpp | 2 ++ + libdjvu/IW44Image.cpp | 4 ++++ + tools/ddjvu.cpp | 7 +++++-- + 5 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/libdjvu/DataPool.cpp b/libdjvu/DataPool.cpp +index 5fcbedf..b58fc45 100644 +--- a/libdjvu/DataPool.cpp ++++ b/libdjvu/DataPool.cpp +@@ -790,7 +790,8 @@ DataPool::create(const GP & pool, int start, int length) + { + DEBUG_MSG("DataPool::DataPool: pool=" << (void *)((DataPool *)pool) << " start=" << start << " length= " << length << "\n"); + DEBUG_MAKE_INDENT(3); +- ++ if (!pool) ++ G_THROW( ERR_MSG("DataPool.zero_DataPool") ); + DataPool *xpool=new DataPool(); + GP retval=xpool; + xpool->init(); +diff --git a/libdjvu/DjVuFile.cpp b/libdjvu/DjVuFile.cpp +index 143346b..2587491 100644 +--- a/libdjvu/DjVuFile.cpp ++++ b/libdjvu/DjVuFile.cpp +@@ -576,6 +576,8 @@ DjVuFile::process_incl_chunk(ByteStream & str, int file_num) + GURL incl_url=pcaster->id_to_url(this, incl_str); + if (incl_url.is_empty()) // Fallback. Should never be used. + incl_url=GURL::UTF8(incl_str,url.base()); ++ if (incl_url == url) // Infinite loop avoidance ++ G_THROW( ERR_MSG("DjVuFile.malformed") ); + + // Now see if there is already a file with this *name* created + { +diff --git a/libdjvu/GBitmap.cpp b/libdjvu/GBitmap.cpp +index c2fdbe4..8ad64b2 100644 +--- a/libdjvu/GBitmap.cpp ++++ b/libdjvu/GBitmap.cpp +@@ -1284,6 +1284,8 @@ GBitmap::decode(unsigned char *runs) + // initialize pixel array + if (nrows==0 || ncolumns==0) + G_THROW( ERR_MSG("GBitmap.not_init") ); ++ if (ncolumns + border != (unsigned short)(ncolumns+border)) ++ G_THROW("GBitmap: image size exceeds maximum (corrupted file?)"); + bytes_per_row = ncolumns + border; + if (runs==0) + G_THROW( ERR_MSG("GBitmap.null_arg") ); +diff --git a/libdjvu/IW44Image.cpp b/libdjvu/IW44Image.cpp +index e8d4b44..4a1797e 100644 +--- a/libdjvu/IW44Image.cpp ++++ b/libdjvu/IW44Image.cpp +@@ -676,9 +676,13 @@ IW44Image::Map::image(signed char *img8, int rowsize, int pixsep, int fast) + // Allocate reconstruction buffer + short *data16; + size_t sz = bw * bh; ++ if (sz == 0) ++ G_THROW("IW44Image: image size is zero (corrupted file?)"); + if (sz / (size_t)bw != (size_t)bh) // multiplication overflow + G_THROW("IW44Image: image size exceeds maximum (corrupted file?)"); + GPBuffer gdata16(data16,sz); ++ if (data16 == 0) ++ G_THROW("IW44Image: unable to allocate image buffer"); + // Copy coefficients + int i; + short *p = data16; +diff --git a/tools/ddjvu.cpp b/tools/ddjvu.cpp +index 7109952..e7b489b 100644 +--- a/tools/ddjvu.cpp ++++ b/tools/ddjvu.cpp +@@ -393,8 +393,11 @@ render(ddjvu_page_t *page, int pageno) + } else if (style == DDJVU_FORMAT_GREY8) + rowsize = rrect.w; + else +- rowsize = rrect.w * 3; +- if (! (image = (char*)malloc(rowsize * rrect.h))) ++ rowsize = rrect.w * 3; ++ size_t bufsize = (size_t)rowsize * rrect.h; ++ if (bufsize / rowsize != rrect.h) ++ die(i18n("Integer overflow when allocating image buffer for page %d"), pageno); ++ if (! (image = (char*)malloc(bufsize))) + die(i18n("Cannot allocate image buffer for page %d"), pageno); + + /* Render */ \ No newline at end of file diff --git a/pkgs/by-name/dj/djvulibre/c++17-register-class.patch b/pkgs/by-name/dj/djvulibre/c++17-register-class.patch new file mode 100644 index 0000000..88251b3 --- /dev/null +++ b/pkgs/by-name/dj/djvulibre/c++17-register-class.patch @@ -0,0 +1,21 @@ +diff -ur a/libdjvu/GBitmap.h b/libdjvu/GBitmap.h +--- a/libdjvu/GBitmap.h 2020-11-20 09:57:32.000000000 -0700 ++++ b/libdjvu/GBitmap.h 2023-07-07 07:07:45.519912414 -0600 +@@ -620,7 +620,7 @@ + inline int + GBitmap::read_run(unsigned char *&data) + { +- register int z=*data++; ++ int z=*data++; + return (z>=RUNOVERFLOWVALUE)? + ((z&~RUNOVERFLOWVALUE)<<8)|(*data++):z; + } +@@ -628,7 +628,7 @@ + inline int + GBitmap::read_run(const unsigned char *&data) + { +- register int z=*data++; ++ int z=*data++; + return (z>=RUNOVERFLOWVALUE)? + ((z&~RUNOVERFLOWVALUE)<<8)|(*data++):z; + } diff --git a/pkgs/by-name/dj/djvulibre/default.nix b/pkgs/by-name/dj/djvulibre/default.nix new file mode 100644 index 0000000..073a6e3 --- /dev/null +++ b/pkgs/by-name/dj/djvulibre/default.nix @@ -0,0 +1,50 @@ +{ lib, stdenv +, fetchurl +, libjpeg +, libtiff +, librsvg +, libiconv +, bash +}: + +stdenv.mkDerivation rec { + pname = "djvulibre"; + version = "3.5.28"; + + src = fetchurl { + url = "mirror://sourceforge/djvu/${pname}-${version}.tar.gz"; + sha256 = "1p1fiygq9ny8aimwc4vxwjc6k9ykgdsq1sq06slfbzalfvm0kl7w"; + }; + + outputs = [ "bin" "dev" "out" ]; + + strictDeps = true; + nativeBuildInputs = [ + librsvg + ]; + + buildInputs = [ + libjpeg + libtiff + libiconv + bash + ]; + + enableParallelBuilding = true; + + patches = [ + # Remove uses of the `register` storage class specifier, which was removed in C++17. + # Fixes compilation with clang 16, which defaults to C++17. + ./c++17-register-class.patch + + ./CVE-2021-3500+CVE-2021-32490+CVE-2021-32491+CVE-2021-32492+CVE-2021-32493.patch + ]; + + meta = with lib; { + description = "The big set of CLI tools to make/modify/optimize/show/export DJVU files"; + homepage = "https://djvu.sourceforge.net"; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ Anton-Latukha ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/do/docbook/packages.nix b/pkgs/by-name/do/docbook/packages.nix new file mode 100644 index 0000000..adc0263 --- /dev/null +++ b/pkgs/by-name/do/docbook/packages.nix @@ -0,0 +1,23 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + docbook5 = callPackage ./schemas/docbook-5.0 { }; + docbook_sgml_dtd_31 = callPackage ./schemas/sgml-dtd/docbook/3.1.nix { }; + docbook_sgml_dtd_41 = callPackage ./schemas/sgml-dtd/docbook/4.1.nix { }; + docbook_xml_dtd_412 = callPackage ./schemas/xml-dtd/docbook/4.1.2.nix { }; + docbook_xml_dtd_42 = callPackage ./schemas/xml-dtd/docbook/4.2.nix { }; + docbook_xml_dtd_43 = callPackage ./schemas/xml-dtd/docbook/4.3.nix { }; + docbook_xml_dtd_44 = callPackage ./schemas/xml-dtd/docbook/4.4.nix { }; + docbook_xml_dtd_45 = callPackage ./schemas/xml-dtd/docbook/4.5.nix { }; + docbook_xml_ebnf_dtd = callPackage ./schemas/xml-dtd/docbook-ebnf { }; + + inherit (callPackages ./stylesheets/xslt/docbook-xsl { }) + docbook-xsl-nons + docbook-xsl-ns; + + # TODO: move this to aliases + docbook_xsl = docbook-xsl-nons; + docbook_xsl_ns = docbook-xsl-ns; +} diff --git a/pkgs/by-name/do/docbook/schemas/docbook-5.0/default.nix b/pkgs/by-name/do/docbook/schemas/docbook-5.0/default.nix new file mode 100644 index 0000000..68bc610 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/docbook-5.0/default.nix @@ -0,0 +1,36 @@ +{ lib, stdenv, fetchurl, unzip }: + +stdenv.mkDerivation rec { + pname = "docbook5"; + version = "5.0.1"; + + src = fetchurl { + url = "http://www.docbook.org/xml/${version}/docbook-${version}.zip"; + sha256 = "1iz3hq1lqgnshvlz4j9gvh4jy1ml74qf90vqf2ikbq0h4i2xzybs"; + }; + + nativeBuildInputs = [ unzip ]; + + installPhase = + '' + dst=$out/share/xml/docbook-5.0 + mkdir -p $dst + cp -prv * $dst/ + + substituteInPlace $dst/catalog.xml --replace 'uri="' "uri=\"$dst/" + + rm -rf $dst/docs $dst/ChangeLog + + # Backwards compatibility. Will remove eventually. + mkdir -p $out/xml/rng $out/xml/dtd + ln -s $dst/rng $out/xml/rng/docbook + ln -s $dst/dtd $out/xml/dtd/docbook + ''; + + meta = { + description = "Schemas for DocBook 5.0, a semantic markup language for technical documentation"; + homepage = "https://docbook.org/xml/5.0/"; + maintainers = [ lib.maintainers.eelco ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/3.1.nix b/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/3.1.nix new file mode 100644 index 0000000..b1db363 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/3.1.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl, unzip }: + +let + + src = fetchurl { + url = "http://www.oasis-open.org/docbook/sgml/3.1/docbk31.zip"; + sha256 = "0f25ch7bywwhdxb1qa0hl28mgq1blqdap3rxzamm585rf4kis9i0"; + }; + + isoents = fetchurl { + url = "http://www.oasis-open.org/cover/ISOEnts.zip"; + sha256 = "1clrkaqnvc1ja4lj8blr0rdlphngkcda3snm7b9jzvcn76d3br6w"; + }; + +in + +stdenv.mkDerivation { + name = "docbook-sgml-3.1"; + + dontUnpack = true; + + nativeBuildInputs = [ unzip ]; + + installPhase = + '' + o=$out/sgml/dtd/docbook-3.1 + mkdir -p $o + cd $o + unzip ${src} + unzip ${isoents} + sed -e "s/iso-/ISO/" -e "s/.gml//" -i docbook.cat + ''; + + meta = { + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/4.1.nix b/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/4.1.nix new file mode 100644 index 0000000..85d7ab1 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/sgml-dtd/docbook/4.1.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl, unzip }: + +let + + src = fetchurl { + url = "http://www.oasis-open.org/docbook/sgml/4.1/docbk41.zip"; + sha256 = "04b3gp4zkh9c5g9kvnywdkdfkcqx3kjc04j4mpkr4xk7lgqgrany"; + }; + + isoents = fetchurl { + url = "http://www.oasis-open.org/cover/ISOEnts.zip"; + sha256 = "1clrkaqnvc1ja4lj8blr0rdlphngkcda3snm7b9jzvcn76d3br6w"; + }; + +in + +stdenv.mkDerivation { + name = "docbook-sgml-4.1"; + + dontUnpack = true; + + nativeBuildInputs = [ unzip ]; + + installPhase = + '' + o=$out/sgml/dtd/docbook-4.1 + mkdir -p $o + cd $o + unzip ${src} + unzip ${isoents} + sed -e "s/iso-/ISO/" -e "s/.gml//" -i docbook.cat + ''; + + meta = { + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/default.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/default.nix new file mode 100644 index 0000000..6be2e89 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/default.nix @@ -0,0 +1,26 @@ +{lib, stdenv, fetchurl}: + +stdenv.mkDerivation rec { + pname = "docbook-xml-ebnf"; + version = "1.2b1"; + + dtd = fetchurl { + url = "https://docbook.org/xml/ebnf/${version}/dbebnf.dtd"; + sha256 = "0min5dsc53my13b94g2yd65q1nkjcf4x1dak00bsc4ckf86mrx95"; + }; + catalog = ./docbook-ebnf.cat; + + unpackPhase = '' + mkdir -p $out/xml/dtd/docbook-ebnf + cd $out/xml/dtd/docbook-ebnf + ''; + + installPhase = '' + cp -p $dtd dbebnf.dtd + cp -p $catalog $(stripHash $catalog) + ''; + + meta = { + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/docbook-ebnf.cat b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/docbook-ebnf.cat new file mode 100644 index 0000000..896a833 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook-ebnf/docbook-ebnf.cat @@ -0,0 +1,2 @@ +PUBLIC "-//OASIS//DTD DocBook EBNF Module V1.0//EN" + "dbebnf.dtd" diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.1.2.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.1.2.nix new file mode 100644 index 0000000..c367e2a --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.1.2.nix @@ -0,0 +1,22 @@ +{lib, stdenv, fetchurl, unzip, findXMLCatalogs}: + +let + # Urgh, DocBook 4.1.2 doesn't come with an XML catalog. Use the one + # from 4.2. + docbook42catalog = fetchurl { + url = "https://docbook.org/xml/4.2/catalog.xml"; + sha256 = "18lhp6q2l0753s855r638shkbdwq9blm6akdjsc9nrik24k38j17"; + }; +in + +import ./generic.nix { + inherit lib stdenv unzip findXMLCatalogs; + version = "4.1.2"; + src = fetchurl { + url = "https://docbook.org/xml/4.1.2/docbkx412.zip"; + sha256 = "0wkp5rvnqj0ghxia0558mnn4c7s3n501j99q2isp3sp0ci069w1h"; + }; + postInstall = " + sed 's|V4.2|V4.1.2|g' < ${docbook42catalog} > catalog.xml + "; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.2.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.2.nix new file mode 100644 index 0000000..8f778ea --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.2.nix @@ -0,0 +1,10 @@ +{lib, stdenv, fetchurl, unzip, findXMLCatalogs}: + +import ./generic.nix { + inherit lib stdenv unzip findXMLCatalogs; + version = "4.2"; + src = fetchurl { + url = "https://docbook.org/xml/4.2/docbook-xml-4.2.zip"; + sha256 = "acc4601e4f97a196076b7e64b368d9248b07c7abf26b34a02cca40eeebe60fa2"; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.3.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.3.nix new file mode 100644 index 0000000..a58370e --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.3.nix @@ -0,0 +1,10 @@ +{lib, stdenv, fetchurl, unzip, findXMLCatalogs}: + +import ./generic.nix { + inherit lib stdenv unzip findXMLCatalogs; + version = "4.3"; + src = fetchurl { + url = "https://docbook.org/xml/4.3/docbook-xml-4.3.zip"; + sha256 = "0r1l2if1z4wm2v664sqdizm4gak6db1kx9y50jq89m3gxaa8l1i3"; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.4.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.4.nix new file mode 100644 index 0000000..3b46fe8 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.4.nix @@ -0,0 +1,10 @@ +{lib, stdenv, fetchurl, unzip, findXMLCatalogs}: + +import ./generic.nix { + inherit lib stdenv unzip findXMLCatalogs; + version = "4.4"; + src = fetchurl { + url = "https://docbook.org/xml/4.4/docbook-xml-4.4.zip"; + sha256 = "141h4zsyc71sfi2zzd89v4bb4qqq9ca1ri9ix2als9f4i3mmkw82"; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.5.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.5.nix new file mode 100644 index 0000000..c4ab1f6 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/4.5.nix @@ -0,0 +1,10 @@ +{lib, stdenv, fetchurl, unzip, findXMLCatalogs}: + +import ./generic.nix { + inherit lib stdenv unzip findXMLCatalogs; + version = "4.5"; + src = fetchurl { + url = "https://docbook.org/xml/4.5/docbook-xml-4.5.zip"; + sha256 = "1d671lcjckjri28xfbf6dq7y3xnkppa910w1jin8rjc35dx06kjf"; + }; +} diff --git a/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/generic.nix b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/generic.nix new file mode 100644 index 0000000..7a635f6 --- /dev/null +++ b/pkgs/by-name/do/docbook/schemas/xml-dtd/docbook/generic.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, unzip, src, version, postInstall ? "true", findXMLCatalogs }: + +stdenv.mkDerivation { + inherit version src postInstall; + pname = "docbook-xml"; + + nativeBuildInputs = [ unzip ]; + propagatedNativeBuildInputs = [ findXMLCatalogs ]; + + unpackPhase = '' + mkdir -p $out/xml/dtd/docbook + cd $out/xml/dtd/docbook + unpackFile $src + ''; + + installPhase = '' + find . -type f -exec chmod -x {} \; + runHook postInstall + ''; + + meta = { + branch = version; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/catalog-legacy-uris.patch b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/catalog-legacy-uris.patch new file mode 100644 index 0000000..72922ee --- /dev/null +++ b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/catalog-legacy-uris.patch @@ -0,0 +1,10 @@ +--- a/catalog.xml ++++ b/catalog.xml +@@ -5,4 +5,7 @@ + + + ++ ++ ++ + diff --git a/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/default.nix b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/default.nix new file mode 100644 index 0000000..a81d73a --- /dev/null +++ b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/default.nix @@ -0,0 +1,91 @@ +{ lib, stdenv, substituteAll, fetchurl, fetchpatch, findXMLCatalogs, writeScriptBin, /*ruby,*/ bash, withManOptDedupPatch ? false }: + +let + + common = { pname, sha256, suffix ? "" }: let + legacySuffix = lib.optionalString (suffix != "-nons") "-ns"; + self = stdenv.mkDerivation rec { + inherit pname; + version = "1.79.2"; + + src = fetchurl { + url = "https://github.com/docbook/xslt10-stylesheets/releases/download/release%2F${version}/docbook-xsl${suffix}-${version}.tar.bz2"; + inherit sha256; + }; + + patches = [ + # Prevent a potential stack overflow + # https://github.com/docbook/xslt10-stylesheets/pull/37 + (fetchpatch { + url = "https://src.fedoraproject.org/rpms/docbook-style-xsl/raw/e3ae7a97ed1d185594dd35954e1a02196afb205a/f/docbook-style-xsl-non-recursive-string-subst.patch"; + sha256 = "0lrjjg5kpwwmbhkxzz6i5zmimb6lsvrrdhzc2qgjmb3r6jnsmii3"; + stripLen = "1"; + }) + + # Fix reproducibility by respecting generate.consistent.ids in indexes + # https://github.com/docbook/xslt10-stylesheets/pull/88 + # https://sourceforge.net/p/docbook/bugs/1385/ + (fetchpatch { + url = "https://github.com/docbook/xslt10-stylesheets/commit/07631601e6602bc49b8eac3aab9d2b35968d3e7a.patch"; + sha256 = "0igfhcr6hzcydqsnjsd181h5yl3drjnrwdmxcybr236m8255vkq3"; + stripLen = "1"; + }) + + # Add legacy sourceforge.net URIs to the catalog + (substituteAll { + src = ./catalog-legacy-uris.patch; + inherit legacySuffix suffix version; + }) + ] ++ lib.optionals withManOptDedupPatch [ + # Fixes https://github.com/NixOS/nixpkgs/issues/166304 + # https://github.com/docbook/xslt10-stylesheets/pull/241 + ./fix-man-options-duplication.patch + ]; + + propagatedBuildInputs = [ findXMLCatalogs ]; + + dontBuild = true; + + installPhase = '' + dst=$out/share/xml/${pname} + mkdir -p $dst + rm -rf RELEASE* README* INSTALL TODO NEWS* BUGS install.sh tools Makefile tests extensions webhelp + mv * $dst/ + + # Backwards compatibility. Will remove eventually. + mkdir -p $out/xml/xsl + ln -s $dst $out/xml/xsl/docbook + + # More backwards compatibility + ln -s $dst $out/share/xml/docbook-xsl${legacySuffix} + ''; + + # passthru.dbtoepub = writeScriptBin "dbtoepub" + # '' + # #!${bash}/bin/bash + # exec -a dbtoepub ${ruby}/bin/ruby ${self}/share/xml/${pname}/epub/bin/dbtoepub "$@" + # ''; + + meta = { + homepage = "https://github.com/docbook/wiki/wiki/DocBookXslStylesheets"; + description = "XSL stylesheets for transforming DocBook documents into HTML and various other formats"; + license = lib.licenses.mit; + maintainers = [ lib.maintainers.eelco ]; + platforms = lib.platforms.all; + }; + }; + in self; + +in { + + docbook-xsl-nons = common { + pname = "docbook-xsl-nons"; + suffix = "-nons"; + sha256 = "00i1hdyxim8jymv2dz68ix3wbs5w6isxm8ijb03qk3vs1g59x2zf"; + }; + + docbook-xsl-ns = common { + pname = "docbook-xsl-ns"; + sha256 = "0wd33z41kdsybyx3ay21w6bdlmgpd9kyn3mr5y520lsf8km28r9i"; + }; +} diff --git a/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/fix-man-options-duplication.patch b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/fix-man-options-duplication.patch new file mode 100644 index 0000000..304d978 --- /dev/null +++ b/pkgs/by-name/do/docbook/stylesheets/xslt/docbook-xsl/fix-man-options-duplication.patch @@ -0,0 +1,11 @@ +--- a/manpages/lists.xsl ++++ b/manpages/lists.xsl +@@ -110,7 +110,7 @@ + .RE + + +- ++ + + + {options}->{'list-files'}; ++ } else { ++ $openstr = '>-'; ++ } + } + } diff --git a/pkgs/by-name/do/docbook2x/default.nix b/pkgs/by-name/do/docbook2x/default.nix new file mode 100644 index 0000000..3fa76f5 --- /dev/null +++ b/pkgs/by-name/do/docbook2x/default.nix @@ -0,0 +1,59 @@ +{ fetchurl, lib, stdenv, texinfo, perlPackages +, groff, libxml2, libxslt, gnused, libiconv, opensp +, docbook_xml_dtd_43, bash +, makeWrapper }: + +stdenv.mkDerivation rec { + pname = "docbook2X"; + version = "0.8.8"; + + src = fetchurl { + url = "mirror://sourceforge/docbook2x/docbook2X-${version}.tar.gz"; + sha256 = "0ifwzk99rzjws0ixzimbvs83x6cxqk1xzmg84wa1p7bs6rypaxs0"; + }; + + # This patch makes sure that `docbook2texi --to-stdout' actually + # writes its output to stdout instead of creating a file. + patches = [ ./db2x_texixml-to-stdout.patch ]; + + nativeBuildInputs = [ makeWrapper perlPackages.perl texinfo libxslt ]; + buildInputs = [ groff libxml2 opensp libiconv bash ] + ++ (with perlPackages; [ perl XMLSAX XMLParser XMLNamespaceSupport ]); + + postConfigure = '' + # Broken substitution is used for `perl/config.pl', which leaves literal + # `$prefix' in it. + substituteInPlace "perl/config.pl" \ + --replace '${"\$" + "{prefix}"}' "$out" + ''; + + doCheck = false; # fails a lot of tests + + postInstall = '' + perlPrograms="db2x_manxml db2x_texixml db2x_xsltproc + docbook2man docbook2texi"; + for i in $perlPrograms + do + # XXX: We work around the fact that `wrapProgram' doesn't support + # spaces below by inserting escaped backslashes. + wrapProgram $out/bin/$i \ + --prefix PERL5LIB : ${with perlPackages; makeFullPerlPath [XMLSAX XMLParser XMLNamespaceSupport]} \ + --prefix XML_CATALOG_FILES "\ " \ + "$out/share/docbook2X/dtd/catalog.xml\ $out/share/docbook2X/xslt/catalog.xml\ ${docbook_xml_dtd_43}/xml/dtd/docbook/catalog.xml" + done + + wrapProgram $out/bin/sgml2xml-isoent --prefix PATH : \ + "${gnused}/bin" + ''; + + meta = with lib; { + longDescription = '' + docbook2X is a software package that converts DocBook documents + into the traditional Unix man page format and the GNU Texinfo + format. + ''; + license = licenses.mit; + homepage = "https://docbook2x.sourceforge.net/"; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/do/doxygen/default.nix b/pkgs/by-name/do/doxygen/default.nix new file mode 100644 index 0000000..35fcdc7 --- /dev/null +++ b/pkgs/by-name/do/doxygen/default.nix @@ -0,0 +1,80 @@ +{ lib +, stdenv +, cmake +, fetchFromGitHub +, fetchpatch +, python3 +, flex +, bison +, qt5 +, CoreServices +, libiconv +, spdlog +, sqlite +}: + +stdenv.mkDerivation rec { + pname = "doxygen"; + version = "1.10.0"; + + src = fetchFromGitHub { + owner = "doxygen"; + repo = "doxygen"; + rev = "Release_${lib.replaceStrings [ "." ] [ "_" ] version}"; + sha256 = "sha256-FPI5ICdn9Tne/g9SP6jAQS813AAyoDNooDR/Hyvq6R4="; + }; + + patches = [ + (fetchpatch { + name = "sys-spdlog-fix.patch"; + url = "https://github.com/doxygen/doxygen/commit/0df6da616f01057d28b11c8bee28443c102dd424.patch"; + hash = "sha256-7efkCQFYGslwqhIuPsLYTEiA1rq+mO0DuyQBMt0O+m0="; + }) + ]; + + nativeBuildInputs = [ + cmake + python3 + flex + bison + ]; + + buildInputs = [ libiconv spdlog sqlite ] + ++ lib.optionals (qt5 != null) (with qt5; [ qtbase wrapQtAppsHook ]) + ++ lib.optionals stdenv.isDarwin [ CoreServices ]; + + cmakeFlags = [ + "-DICONV_INCLUDE_DIR=${libiconv}/include" + "-Duse_sys_spdlog=ON" + "-Duse_sys_sqlite3=ON" + ] ++ lib.optional (qt5 != null) "-Dbuild_wizard=YES"; + + env.NIX_CFLAGS_COMPILE = + lib.optionalString stdenv.isDarwin "-mmacosx-version-min=10.9"; + + # put examples in an output so people/tools can test against them + outputs = [ "out" "examples" ]; + postInstall = '' + cp -r ../examples $examples + ''; + + meta = { + license = lib.licenses.gpl2Plus; + homepage = "https://www.doxygen.nl/"; + changelog = "https://www.doxygen.nl/manual/changelog.html"; + description = "Source code documentation generator tool"; + mainProgram = "doxygen"; + + longDescription = '' + Doxygen is the de facto standard tool for generating documentation from + annotated C++ sources, but it also supports other popular programming + languages such as C, Objective-C, C#, PHP, Java, Python, IDL (Corba, + Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL and to some extent + D. It can generate an on-line documentation browser (in HTML) and/or an + off-line reference manual (in LaTeX) from a set of documented source + files. + ''; + + platforms = if qt5 != null then lib.platforms.linux else lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/do/doxygen/packages.nix b/pkgs/by-name/do/doxygen/packages.nix new file mode 100644 index 0000000..28e78cd --- /dev/null +++ b/pkgs/by-name/do/doxygen/packages.nix @@ -0,0 +1,12 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + doxygen = darwin.apple_sdk_11_0.callPackage ./. { + qt5 = null; + inherit (darwin.apple_sdk_11_0.frameworks) CoreServices; + }; + + doxygen_gui = lowPrio (doxygen.override { inherit qt5; }); +} diff --git a/pkgs/by-name/e2/e2fsprogs/default.nix b/pkgs/by-name/e2/e2fsprogs/default.nix new file mode 100644 index 0000000..fd9a71a --- /dev/null +++ b/pkgs/by-name/e2/e2fsprogs/default.nix @@ -0,0 +1,96 @@ +{ lib, stdenv, buildPackages, fetchurl, fetchpatch, pkg-config, libuuid, gettext, texinfo +, withFuse ? stdenv.isLinux, fuse +, shared ? !stdenv.hostPlatform.isStatic +# for passthru.tests +# , e2fsprogs, runCommand +}: + +stdenv.mkDerivation rec { + pname = "e2fsprogs"; + version = "1.47.0"; + + src = fetchurl { + url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz"; + hash = "sha256-Zmev3lbu8MavJmhJdEAOTSKI6knpRBv15iKRldUaNXg="; + }; + + # fuse2fs adds 14mb of dependencies + outputs = [ "bin" "dev" "out" "man" "info" ] + ++ lib.optionals withFuse [ "fuse2fs" ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ pkg-config texinfo ]; + buildInputs = [ libuuid gettext ] + ++ lib.optionals withFuse [ fuse ]; + + patches = [ + (fetchpatch { # avoid using missing __GNUC_PREREQ(X,Y) + url = "https://raw.githubusercontent.com/void-linux/void-packages/9583597eb3e6e6b33f61dbc615d511ce030bc443/srcpkgs/e2fsprogs/patches/fix-glibcism.patch"; + sha256 = "1gfcsr0i3q8q2f0lqza8na0iy4l4p3cbii51ds6zmj0y4hz2dwhb"; + excludes = [ "lib/ext2fs/hashmap.h" ]; + extraPrefix = ""; + }) + # Avoid trouble with older systems like NixOS 23.05. + # TODO: most likely drop this at some point, e.g. when 23.05 loses support. + (fetchurl { + name = "mke2fs-avoid-incompatible-features.patch"; + url = "https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/plain/debian/patches/disable-metadata_csum_seed-and-orphan_file-by-default?h=debian/master&id=3fb3d18baba90e5d48d94f4c0b79b2d271b0c913"; + hash = "sha256-YD11K4s2bqv0rvzrxtaiodzLp3ztULlOlPUf1XcpxRY="; + }) + ]; + + configureFlags = + if stdenv.isLinux then [ + # It seems that the e2fsprogs is one of the few packages that cannot be + # build with shared and static libs. + (if shared then "--enable-elf-shlibs" else "--disable-elf-shlibs") + "--enable-symlink-install" + "--enable-relative-symlinks" + "--with-crond-dir=no" + # fsck, libblkid, libuuid and uuidd are in util-linux-ng (the "libuuid" dependency) + "--disable-fsck" + "--disable-libblkid" + "--disable-libuuid" + "--disable-uuidd" + ] else [ + "--enable-libuuid --disable-e2initrd-helper" + ]; + + nativeCheckInputs = [ buildPackages.perl ]; + doCheck = true; + + postInstall = '' + # avoid cycle between outputs + if [ -f $out/lib/${pname}/e2scrub_all_cron ]; then + mv $out/lib/${pname}/e2scrub_all_cron $bin/bin/ + fi + '' + lib.optionalString withFuse '' + mkdir -p $fuse2fs/bin + mv $bin/bin/fuse2fs $fuse2fs/bin/fuse2fs + ''; + + enableParallelBuilding = true; + + # passthru.tests = { + # simple-filesystem = runCommand "e2fsprogs-create-fs" {} '' + # mkdir -p $out + # truncate -s10M $out/disc + # ${e2fsprogs}/bin/mkfs.ext4 $out/disc | tee $out/success + # ${e2fsprogs}/bin/e2fsck -n $out/disc | tee $out/success + # [ -e $out/success ] + # ''; + # }; + meta = with lib; { + homepage = "https://e2fsprogs.sourceforge.net/"; + changelog = "https://e2fsprogs.sourceforge.net/e2fsprogs-release.html#${version}"; + description = "Tools for creating and checking ext2/ext3/ext4 filesystems"; + license = with licenses; [ + gpl2Plus + lgpl2Plus # lib/ext2fs, lib/e2p + bsd3 # lib/uuid + mit # lib/et, lib/ss + ]; + platforms = platforms.unix; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/ed/ed/default.nix b/pkgs/by-name/ed/ed/default.nix new file mode 100644 index 0000000..c1f99de --- /dev/null +++ b/pkgs/by-name/ed/ed/default.nix @@ -0,0 +1,14 @@ +{ lib, pkgs }: + +lib.makeScope pkgs.newScope (self: + let + inherit (self) callPackage; + in { + sources = import ./sources.nix { + inherit lib; + inherit (pkgs) fetchurl; + }; + + ed = callPackage (self.sources.ed) { }; + edUnstable = callPackage (self.sources.edUnstable) { }; + }) diff --git a/pkgs/by-name/ed/ed/generic.nix b/pkgs/by-name/ed/ed/generic.nix new file mode 100644 index 0000000..70ec6ba --- /dev/null +++ b/pkgs/by-name/ed/ed/generic.nix @@ -0,0 +1,30 @@ +{ pname +, version +, src +, patches ? [ ] +, meta +}: + +# Note: this package is used for bootstrapping fetchurl, and thus cannot use +# fetchpatch! All mutable patches (generated by GitHub or cgit) that are needed +# here should be included directly in Nixpkgs as files. + +{ lib +, stdenv +, fetchurl +, lzip +}: + +stdenv.mkDerivation { + inherit pname version src patches; + + nativeBuildInputs = [ lzip ]; + + configureFlags = [ + "CC=${stdenv.cc.targetPrefix}cc" + ]; + + doCheck = true; + + inherit meta; +} diff --git a/pkgs/by-name/ed/ed/packages.nix b/pkgs/by-name/ed/ed/packages.nix new file mode 100644 index 0000000..daefac3 --- /dev/null +++ b/pkgs/by-name/ed/ed/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit (recurseIntoAttrs (callPackage ./. { })) + ed edUnstable; +} diff --git a/pkgs/by-name/ed/ed/sources.nix b/pkgs/by-name/ed/ed/sources.nix new file mode 100644 index 0000000..77e13da --- /dev/null +++ b/pkgs/by-name/ed/ed/sources.nix @@ -0,0 +1,45 @@ +{ lib +, fetchurl +}: + +let + meta = { + description = "The GNU implementation of the standard Unix editor"; + longDescription = '' + GNU ed is a line-oriented text editor. It is used to create, display, + modify and otherwise manipulate text files, both interactively and via + shell scripts. A restricted version of ed, red, can only edit files in the + current directory and cannot execute shell commands. Ed is the 'standard' + text editor in the sense that it is the original editor for Unix, and thus + widely available. For most purposes, however, it is superseded by + full-screen editors such as GNU Emacs or GNU Moe. + ''; + license = lib.licenses.gpl3Plus; + homepage = "https://www.gnu.org/software/ed/"; + maintainers = with lib.maintainers; [ AndersonTorres ]; + platforms = lib.platforms.unix; + }; +in +{ + ed = let + pname = "ed"; + version = "1.20.1"; + src = fetchurl { + url = "mirror://gnu/ed/ed-${version}.tar.lz"; + hash = "sha256-saRjspehQfmHbEsfzQFHf2Rc3tkhaAkOmjXbKvS6u8o="; + }; + in import ./generic.nix { + inherit pname version src meta; + }; + + edUnstable = let + pname = "ed"; + version = "1.20-pre2"; + src = fetchurl { + url = "http://download.savannah.gnu.org/releases/ed/ed-${version}.tar.lz"; + hash = "sha256-bHTDeMhVNNo3qqDNoBNaBA+DHDa4WJpfQNcTvAUPgsY="; + }; + in import ./generic.nix { + inherit pname version src meta; + }; +} diff --git a/pkgs/by-name/ed/editline/default.nix b/pkgs/by-name/ed/editline/default.nix new file mode 100644 index 0000000..4f891a2 --- /dev/null +++ b/pkgs/by-name/ed/editline/default.nix @@ -0,0 +1,42 @@ +{ lib, stdenv, fetchFromGitHub, autoreconfHook, nix-update-script, fetchpatch }: + +stdenv.mkDerivation rec { + pname = "editline"; + version = "1.17.1"; + src = fetchFromGitHub { + owner = "troglobit"; + repo = "editline"; + rev = version; + sha256 = "sha256-0FeDUVCUahbweH24nfaZwa7j7lSfZh1TnQK7KYqO+3g="; + }; + + patches = [ + (fetchpatch { + name = "fix-for-home-end-in-tmux.patch"; + url = "https://github.com/troglobit/editline/commit/265c1fb6a0b99bedb157dc7c320f2c9629136518.patch"; + sha256 = "sha256-9fhQH0hT8BcykGzOUoT18HBtWjjoXnePSGDJQp8GH30="; + }) + + # Pending autoconf-2.72 upstream support: + # https://github.com/troglobit/editline/pull/64 + (fetchpatch { + name = "autoconf-2.72.patch"; + url = "https://github.com/troglobit/editline/commit/f444a316f5178b8e20fe31e7b2d979e651da077e.patch"; + hash = "sha256-m3jExTkPvE+ZBwHzf/A+ugzzfbLmeWYn726l7Po7f10="; + }) + ]; + + nativeBuildInputs = [ autoreconfHook ]; + + outputs = [ "out" "dev" "man" "doc" ]; + + passthru.updateScript = nix-update-script { }; + + meta = with lib; { + homepage = "https://troglobit.com/projects/editline/"; + description = "A readline() replacement for UNIX without termcap (ncurses)"; + license = licenses.bsdOriginal; + maintainers = with maintainers; [ dtzWill oxalica ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/el/elf-header/default.nix b/pkgs/by-name/el/elf-header/default.nix new file mode 100644 index 0000000..72166bb --- /dev/null +++ b/pkgs/by-name/el/elf-header/default.nix @@ -0,0 +1,44 @@ +{ stdenvNoCC, lib, glibc, musl }: + +let + libc = + if stdenvNoCC.targetPlatform.isMusl + then musl + else glibc; + headerPath = + if stdenvNoCC.targetPlatform.isMusl + then "musl-${libc.version}/include/elf.h" + else "glibc-${libc.version}/elf/elf.h"; +in + +stdenvNoCC.mkDerivation { + pname = "elf-header"; + inherit (libc) version; + + src = null; + + dontUnpack = true; + + dontBuild = true; + + installPhase = '' + mkdir -p "$out/include"; + tar -xf \ + ${lib.escapeShellArg libc.src} \ + ${lib.escapeShellArg headerPath} \ + --to-stdout \ + | sed -e '/features\.h/d' \ + > "$out/include/elf.h" + ''; + + meta = libc.meta // { + outputsToInstall = [ "out" ]; + description = "The datastructures of ELF according to the target platform's libc"; + longDescription = '' + The Executable and Linkable Format (ELF, formerly named Extensible Linking + Format), is usually defined in a header like this. + ''; + platforms = lib.platforms.all; + maintainers = [ lib.maintainers.ericson2314 ]; + }; +} diff --git a/pkgs/by-name/el/elf-header/packages.nix b/pkgs/by-name/el/elf-header/packages.nix new file mode 100644 index 0000000..da6e0fb --- /dev/null +++ b/pkgs/by-name/el/elf-header/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Provided by libc on Operating Systems that use the Extensible Linker Format. + elf-header = if stdenv.hostPlatform.isElf then null else elf-header-real; + + elf-header-real = callPackage ./. { }; +} diff --git a/pkgs/by-name/el/elfutils/debug-info-from-env.patch b/pkgs/by-name/el/elfutils/debug-info-from-env.patch new file mode 100644 index 0000000..409f131 --- /dev/null +++ b/pkgs/by-name/el/elfutils/debug-info-from-env.patch @@ -0,0 +1,27 @@ +Look up .build-id files relative to the directories in the +colon-separated environment variable NIX_DEBUG_INFO_DIRS, unless +overriden by --debuginfo-path. + +diff -ru elfutils-0.169-orig/libdwfl/argp-std.c elfutils-0.169/libdwfl/argp-std.c +--- elfutils-0.169-orig/libdwfl/argp-std.c 2017-05-02 23:05:52.000000000 +0200 ++++ elfutils-0.169/libdwfl/argp-std.c 2017-07-28 16:08:06.739558106 +0200 +@@ -376,5 +376,7 @@ + const struct argp * + dwfl_standard_argp (void) + { ++ debuginfo_path = getenv("NIX_DEBUG_INFO_DIRS"); ++ + return &libdwfl_argp; + } +diff -ru elfutils-0.169-orig/src/stack.c elfutils-0.169/src/stack.c +--- elfutils-0.169-orig/src/stack.c 2017-02-24 11:55:28.000000000 +0100 ++++ elfutils-0.169/src/stack.c 2017-07-28 15:50:06.743196696 +0200 +@@ -631,6 +631,8 @@ + /* Set locale. */ + (void) setlocale (LC_ALL, ""); + ++ debuginfo_path = getenv("NIX_DEBUG_INFO_DIRS"); ++ + const struct argp_option options[] = + { + { NULL, 0, NULL, 0, N_("Input selection options:"), 0 }, diff --git a/pkgs/by-name/el/elfutils/default.nix b/pkgs/by-name/el/elfutils/default.nix new file mode 100644 index 0000000..6de0780 --- /dev/null +++ b/pkgs/by-name/el/elfutils/default.nix @@ -0,0 +1,108 @@ +{ lib, stdenv, fetchurl, fetchpatch, pkg-config, musl-fts +, musl-obstack, m4, zlib, zstd, bzip2, bison, flex, gettext, xz, setupDebugInfoDirs +, argp-standalone +, enableDebuginfod ? true, sqlite, curl, libmicrohttpd, libarchive +, gitUpdater +}: + +# TODO: Look at the hardcoded paths to kernel, modules etc. +stdenv.mkDerivation rec { + pname = "elfutils"; + version = "0.191"; + + src = fetchurl { + url = "https://sourceware.org/elfutils/ftp/${version}/${pname}-${version}.tar.bz2"; + hash = "sha256-33bbcTZtHXCDZfx6bGDKSDmPFDZ+sriVTvyIlxR62HE="; + }; + + patches = [ + ./debug-info-from-env.patch + (fetchpatch { + name = "fix-aarch64_fregs.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/elfutils/fix-aarch64_fregs.patch?id=2e3d4976eeffb4704cf83e2cc3306293b7c7b2e9"; + sha256 = "zvncoRkQx3AwPx52ehjA2vcFroF+yDC2MQR5uS6DATs="; + }) + (fetchpatch { + name = "musl-asm-ptrace-h.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/elfutils/musl-asm-ptrace-h.patch?id=2e3d4976eeffb4704cf83e2cc3306293b7c7b2e9"; + sha256 = "8D1wPcdgAkE/TNBOgsHaeTZYhd9l+9TrZg8d5C7kG6k="; + }) + (fetchpatch { + name = "musl-macros.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/elfutils/musl-macros.patch?id=2e3d4976eeffb4704cf83e2cc3306293b7c7b2e9"; + sha256 = "tp6O1TRsTAMsFe8vw3LMENT/vAu6OmyA8+pzgThHeA8="; + }) + (fetchpatch { + name = "musl-strndupa.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/elfutils/musl-strndupa.patch?id=2e3d4976eeffb4704cf83e2cc3306293b7c7b2e9"; + sha256 = "sha256-7daehJj1t0wPtQzTv+/Rpuqqs5Ng/EYnZzrcf2o/Lb0="; + }) + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ ./musl-error_h.patch ]; + + postPatch = '' + patchShebangs tests/*.sh + '' + lib.optionalString stdenv.hostPlatform.isRiscV '' + # disable failing test: + # + # > dwfl_thread_getframes: No DWARF information found + sed -i s/run-backtrace-dwarf.sh//g tests/Makefile.in + ''; + + outputs = [ "bin" "dev" "out" "man" ]; + + # We need bzip2 in NativeInputs because otherwise we can't unpack the src, + # as the host-bzip2 will be in the path. + nativeBuildInputs = [ m4 bison flex gettext bzip2 ] + ++ lib.optional enableDebuginfod pkg-config; + buildInputs = [ zlib zstd bzip2 xz ] + ++ lib.optionals stdenv.hostPlatform.isMusl [ + argp-standalone + musl-fts + musl-obstack + ] ++ lib.optionals enableDebuginfod [ + sqlite + curl + libmicrohttpd + libarchive + ]; + + propagatedNativeBuildInputs = [ setupDebugInfoDirs ]; + + configureFlags = [ + "--program-prefix=eu-" # prevent collisions with binutils + "--enable-deterministic-archives" + (lib.enableFeature enableDebuginfod "libdebuginfod") + (lib.enableFeature enableDebuginfod "debuginfod") + ]; + + enableParallelBuilding = true; + + + doCheck = + # Backtrace unwinding tests rely on glibc-internal symbol names. + # Musl provides slightly different forms and fails. + # Let's disable tests there until musl support is fully upstreamed. + !stdenv.hostPlatform.isMusl + # Test suite tries using `uname` to determine whether certain tests + # can be executed, so we need to match build and host platform exactly. + && (stdenv.hostPlatform == stdenv.buildPlatform); + doInstallCheck = !stdenv.hostPlatform.isMusl + && (stdenv.hostPlatform == stdenv.buildPlatform); + + passthru.updateScript = gitUpdater { + url = "https://sourceware.org/git/elfutils.git"; + rev-prefix = "elfutils-"; + }; + + meta = with lib; { + homepage = "https://sourceware.org/elfutils/"; + description = "A set of utilities to handle ELF objects"; + platforms = platforms.linux; + # https://lists.fedorahosted.org/pipermail/elfutils-devel/2014-November/004223.html + badPlatforms = [ lib.systems.inspect.platformPatterns.isStatic ]; + # licenses are GPL2 or LGPL3+ for libraries, GPL3+ for bins, + # but since this package isn't split that way, all three are listed. + license = with licenses; [ gpl2Only lgpl3Plus gpl3Plus ]; + maintainers = with maintainers; [ eelco r-burns ]; + }; +} diff --git a/pkgs/by-name/el/elfutils/musl-error_h.patch b/pkgs/by-name/el/elfutils/musl-error_h.patch new file mode 100644 index 0000000..7119280 --- /dev/null +++ b/pkgs/by-name/el/elfutils/musl-error_h.patch @@ -0,0 +1,66 @@ +diff -crb --new-file a/lib/error.h b/lib/error.h +*** a/lib/error.h 1969-12-31 19:00:00.000000000 -0500 +--- b/lib/error.h 2021-01-21 04:38:25.000000000 -0500 +*************** +*** 0 **** +--- 1,27 ---- ++ #ifndef _ERROR_H_ ++ #define _ERROR_H_ ++ ++ #include ++ #include ++ #include ++ #include ++ #include ++ ++ static unsigned int error_message_count = 0; ++ ++ static inline void error(int status, int errnum, const char* format, ...) ++ { ++ va_list ap; ++ fprintf(stderr, "%s: ", program_invocation_name); ++ va_start(ap, format); ++ vfprintf(stderr, format, ap); ++ va_end(ap); ++ if (errnum) ++ fprintf(stderr, ": %s", strerror(errnum)); ++ fprintf(stderr, "\n"); ++ error_message_count++; ++ if (status) ++ exit(status); ++ } ++ ++ #endif /* _ERROR_H_ */ +diff -crb --new-file a/src/error.h b/src/error.h +*** a/src/error.h 1969-12-31 19:00:00.000000000 -0500 +--- b/src/error.h 2021-01-21 04:38:29.000000000 -0500 +*************** +*** 0 **** +--- 1,27 ---- ++ #ifndef _ERROR_H_ ++ #define _ERROR_H_ ++ ++ #include ++ #include ++ #include ++ #include ++ #include ++ ++ static unsigned int error_message_count = 0; ++ ++ static inline void error(int status, int errnum, const char* format, ...) ++ { ++ va_list ap; ++ fprintf(stderr, "%s: ", program_invocation_name); ++ va_start(ap, format); ++ vfprintf(stderr, format, ap); ++ va_end(ap); ++ if (errnum) ++ fprintf(stderr, ": %s", strerror(errnum)); ++ fprintf(stderr, "\n"); ++ error_message_count++; ++ if (status) ++ exit(status); ++ } ++ ++ #endif /* _ERROR_H_ */ diff --git a/pkgs/by-name/el/ell/default.nix b/pkgs/by-name/el/ell/default.nix new file mode 100644 index 0000000..9c16a34 --- /dev/null +++ b/pkgs/by-name/el/ell/default.nix @@ -0,0 +1,55 @@ +{ lib, stdenv +, fetchgit +, autoreconfHook +, pkg-config +, dbus +, sysctl +, gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "ell"; + version = "0.64"; + + outputs = [ "out" "dev" ]; + + src = fetchgit { + url = "https://git.kernel.org/pub/scm/libs/ell/ell.git"; + rev = version; + hash = "sha256-LONfgFgPg8KCDwtw//WTOYQT9RpnIskdHAWcgafOhcg="; + }; + + nativeBuildInputs = [ + pkg-config + autoreconfHook + ]; + + nativeCheckInputs = [ + dbus + # required as the sysctl test works on some machines + sysctl + ]; + + enableParallelBuilding = true; + + # tests sporadically fail on musl + doCheck = !stdenv.hostPlatform.isMusl; + + passthru = { + updateScript = gitUpdater { + url = "https://git.kernel.org/pub/scm/libs/ell/ell.git"; + }; + }; + + meta = with lib; { + homepage = "https://git.kernel.org/pub/scm/libs/ell/ell.git"; + description = "Embedded Linux Library"; + longDescription = '' + The Embedded Linux* Library (ELL) provides core, low-level functionality for system daemons. It typically has no dependencies other than the Linux kernel, C standard library, and libdl (for dynamic linking). While ELL is designed to be efficient and compact enough for use on embedded Linux platforms, it is not limited to resource-constrained systems. + ''; + changelog = "https://git.kernel.org/pub/scm/libs/ell/ell.git/tree/ChangeLog?h=${version}"; + license = licenses.lgpl21Plus; + platforms = platforms.linux; + maintainers = with maintainers; [ mic92 dtzWill ]; + }; +} diff --git a/pkgs/by-name/ep/epubcheck/default.nix b/pkgs/by-name/ep/epubcheck/default.nix new file mode 100644 index 0000000..abd2803 --- /dev/null +++ b/pkgs/by-name/ep/epubcheck/default.nix @@ -0,0 +1,43 @@ +{ lib, stdenv, fetchzip +, jre, makeWrapper }: + +stdenv.mkDerivation rec { + pname = "epubcheck"; + version = "5.1.0"; + + src = fetchzip { + url = "https://github.com/w3c/epubcheck/releases/download/v${version}/epubcheck-${version}.zip"; + sha256 = "sha256-gskQ02lGka3nBHSDXO3TpKSQzaoaJUQY9AvWG7L+1YM="; + }; + + nativeBuildInputs = [ makeWrapper ]; + + dontBuild = true; + + installPhase = '' + mkdir -p $out/lib + cp -r lib/* $out/lib + + mkdir -p $out/libexec/epubcheck + cp epubcheck.jar $out/libexec/epubcheck + + classpath=$out/libexec/epubcheck/epubcheck.jar + for jar in $out/lib/*.jar; do + classpath="$classpath:$jar" + done + + mkdir -p $out/bin + makeWrapper ${jre}/bin/java $out/bin/epubcheck \ + --add-flags "-classpath $classpath com.adobe.epubcheck.tool.Checker" + ''; + + meta = with lib; { + homepage = "https://github.com/w3c/epubcheck"; + description = "Validation tool for EPUB"; + mainProgram = "epubcheck"; + sourceProvenance = with sourceTypes; [ binaryBytecode ]; + license = with licenses; [ asl20 bsd3 mpl10 w3c ]; + platforms = platforms.all; + maintainers = with maintainers; [ eadwu ]; + }; +} diff --git a/pkgs/by-name/ex/expat/default.nix b/pkgs/by-name/ex/expat/default.nix new file mode 100644 index 0000000..34775b2 --- /dev/null +++ b/pkgs/by-name/ex/expat/default.nix @@ -0,0 +1,76 @@ +{ lib +, stdenv +, fetchurl +# for passthru.tests +# , python3 +# , perlPackages +# , haskellPackages +# , luaPackages +# , ocamlPackages +# , testers +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let + version = "2.6.2"; + tag = "R_${lib.replaceStrings ["."] ["_"] version}"; +in +stdenv.mkDerivation (finalAttrs: { + pname = "expat"; + inherit version; + + src = fetchurl { + url = with finalAttrs; "https://github.com/libexpat/libexpat/releases/download/${tag}/${pname}-${version}.tar.xz"; + hash = "sha256-7hS0xdiQixvsN62TdgfqsYPU2YBqCK3uRyw8MSHSc2Q="; + }; + + strictDeps = true; + + outputs = [ "out" "dev" ]; # TODO: fix referrers + outputBin = "dev"; + + enableParallelBuilding = true; + + configureFlags = lib.optional stdenv.isFreeBSD "--with-pic"; + + outputMan = "dev"; # tiny page for a dev tool + + doCheck = true; # not cross; + + preCheck = '' + patchShebangs ./run.sh ./test-driver-wrapper.sh + ''; + + # CMake files incorrectly calculate library path from dev prefix + # https://github.com/libexpat/libexpat/issues/501 + postFixup = '' + substituteInPlace $dev/lib/cmake/expat-${finalAttrs.version}/expat-noconfig.cmake \ + --replace "$"'{_IMPORT_PREFIX}' $out + ''; + + # passthru.tests = { + # inherit python3; + # inherit (python3.pkgs) xmltodict; + # inherit (haskellPackages) hexpat; + # inherit (perlPackages) XMLSAXExpat XMLParser; + # inherit (luaPackages) luaexpat; + # inherit (ocamlPackages) ocaml_expat; + # pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + + meta = with lib; { + changelog = "https://github.com/libexpat/libexpat/blob/${tag}/expat/Changes"; + homepage = "https://libexpat.github.io/"; + description = "A stream-oriented XML parser library written in C"; + mainProgram = "xmlwf"; + platforms = platforms.all; + license = licenses.mit; # expat version + pkgConfigModules = [ "expat" ]; + }; +}) diff --git a/pkgs/by-name/ex/expect/default.nix b/pkgs/by-name/ex/expect/default.nix new file mode 100644 index 0000000..e2457ad --- /dev/null +++ b/pkgs/by-name/ex/expect/default.nix @@ -0,0 +1,58 @@ +{ lib, stdenv, buildPackages, fetchurl, tcl, makeWrapper, autoreconfHook, fetchpatch, substituteAll }: + +tcl.mkTclDerivation rec { + pname = "expect"; + version = "5.45.4"; + + src = fetchurl { + url = "mirror://sourceforge/expect/Expect/${version}/expect${version}.tar.gz"; + hash = "sha256-Safag7C92fRtBKBN7sGcd2e7mjI+QMR4H4nK92C5LDQ="; + }; + + patches = [ + (fetchpatch { + url = "https://raw.githubusercontent.com/buildroot/buildroot/c05e6aa361a4049eabd8b21eb64a34899ef83fc7/package/expect/0001-enable-cross-compilation.patch"; + hash = "sha256-yyzE0Jjac5qaj7Svn4VpMiAqSNLYrw7VZbtFqgMVncs="; + }) + (substituteAll { + src = ./fix-cross-compilation.patch; + tcl = "${buildPackages.tcl}/bin/tclsh"; + }) + # The following patches fix compilation with clang 15+ + (fetchpatch { + url = "https://sourceforge.net/p/expect/patches/24/attachment/0001-Add-prototype-to-function-definitions.patch"; + hash = "sha256-X2Vv6VVM3KjmBHo2ukVWe5YTVXRmqe//Kw2kr73OpZs="; + }) + (fetchpatch { + url = "https://sourceforge.net/p/expect/patches/_discuss/thread/b813ca9895/6759/attachment/expect-configure-c99.patch"; + hash = "sha256-PxQQ9roWgVXUoCMxkXEgu+it26ES/JuzHF6oML/nk54="; + }) + # Include `sys/ioctl.h` and `util.h` on Darwin, which are required for `ioctl` and `openpty`. + ./fix-darwin-clang16.patch + ]; + + postPatch = '' + sed -i "s,/bin/stty,$(type -p stty),g" configure.in + ''; + + nativeBuildInputs = [ autoreconfHook makeWrapper ]; + + strictDeps = true; + hardeningDisable = [ "format" ]; + + postInstall = '' + tclWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [ tcl ]}) + ${lib.optionalString stdenv.isDarwin "tclWrapperArgs+=(--prefix DYLD_LIBRARY_PATH : $out/lib/expect${version})"} + ''; + + outputs = [ "out" "dev" ]; + + meta = with lib; { + description = "A tool for automating interactive applications"; + homepage = "https://expect.sourceforge.net/"; + license = licenses.publicDomain; + platforms = platforms.unix; + mainProgram = "expect"; + maintainers = with maintainers; [ SuperSandro2000 ]; + }; +} diff --git a/pkgs/by-name/ex/expect/fix-cross-compilation.patch b/pkgs/by-name/ex/expect/fix-cross-compilation.patch new file mode 100644 index 0000000..8edc4be --- /dev/null +++ b/pkgs/by-name/ex/expect/fix-cross-compilation.patch @@ -0,0 +1,11 @@ +--- a/Makefile.in 2022-09-07 21:46:37.090519258 +0200 ++++ b/Makefile.in 2022-09-07 21:46:21.462592279 +0200 +@@ -380,7 +380,7 @@ + cp $(DIST_ROOT)/$(PKG_DIR).tar.gz $(top_builddir) + + $(SCRIPTS): +- $(TCLSH) $(srcdir)/fixline1 $(SHORT_BINDIR) < $(srcdir)/example/$@ > $@ ++ @tcl@ $(srcdir)/fixline1 $(SHORT_BINDIR) < $(srcdir)/example/$@ > $@ + + ## We cannot use TCL_LIBS below (after TCL_LIB_SPEC) because its + ## expansion references the contents of LIBS, which contains linker diff --git a/pkgs/by-name/ex/expect/fix-darwin-clang16.patch b/pkgs/by-name/ex/expect/fix-darwin-clang16.patch new file mode 100644 index 0000000..9454769 --- /dev/null +++ b/pkgs/by-name/ex/expect/fix-darwin-clang16.patch @@ -0,0 +1,31 @@ +diff -ur a/exp_win.c b/exp_win.c +--- a/exp_win.c 2018-02-02 14:15:52.000000000 -0500 ++++ b/exp_win.c 2023-10-10 07:47:33.082690432 -0400 +@@ -39,7 +39,8 @@ + /* Sigh. On AIX 2.3, termios.h exists but does not define TIOCGWINSZ */ + /* Instead, it has to come from ioctl.h. However, As I said above, this */ + /* can't be cavalierly included on all machines, even when it exists. */ +-#if defined(HAVE_TERMIOS) && !defined(HAVE_TIOCGWINSZ_IN_TERMIOS_H) ++/* Darwin also has termios.h, but it requires ioctl.h for `ioctl`. */ ++#if defined(HAVE_TERMIOS) && (defined(__APPLE__) || !defined(HAVE_TIOCGWINSZ_IN_TERMIOS_H)) + # include + #endif + +diff -ur d/pty_termios.c c/pty_termios.c +--- d/pty_termios.c 2023-10-10 07:59:23.244452442 -0400 ++++ c/pty_termios.c 2023-10-10 08:00:35.303231582 -0400 +@@ -7,7 +7,13 @@ + + */ + +-#include /* openpty */ ++/* openpty */ ++#ifdef __APPLE__ ++#include ++#else /* pty.h is Linux-specific */ ++#include ++#endif ++ + #include + #include + diff --git a/pkgs/by-name/fi/file/32-bit-time_t.patch b/pkgs/by-name/fi/file/32-bit-time_t.patch new file mode 100644 index 0000000..19c5952 --- /dev/null +++ b/pkgs/by-name/fi/file/32-bit-time_t.patch @@ -0,0 +1,38 @@ +https://github.com/file/file/commit/218fdf813fd5ccecbb8887a1b62509cd1c6dd3a1.patch + +From 218fdf813fd5ccecbb8887a1b62509cd1c6dd3a1 Mon Sep 17 00:00:00 2001 +From: Christos Zoulas +Date: Fri, 28 Jul 2023 14:38:25 +0000 +Subject: [PATCH] deal with 32 bit time_t + +--- + src/file.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/src/file.h b/src/file.h +index 2e0494d2f..78f574ea1 100644 +--- a/src/file.h ++++ b/src/file.h +@@ -27,7 +27,7 @@ + */ + /* + * file.h - definitions for file(1) program +- * @(#)$File: file.h,v 1.247 2023/07/27 19:40:22 christos Exp $ ++ * @(#)$File: file.h,v 1.248 2023/07/28 14:38:25 christos Exp $ + */ + + #ifndef __file_h__ +@@ -159,9 +159,11 @@ + /* + * Dec 31, 23:59:59 9999 + * we need to make sure that we don't exceed 9999 because some libc +- * implementations like muslc crash otherwise ++ * implementations like muslc crash otherwise. If you are unlucky ++ * to be running on a system with a 32 bit time_t, then it is even less. + */ +-#define MAX_CTIME CAST(time_t, 0x3afff487cfULL) ++#define MAX_CTIME \ ++ CAST(time_t, sizeof(time_t) > 4 ? 0x3afff487cfULL : 0x7fffffffULL) + + #define FILE_BADSIZE CAST(size_t, ~0ul) + #define MAXDESC 64 /* max len of text description/MIME type */ diff --git a/pkgs/by-name/fi/file/default.nix b/pkgs/by-name/fi/file/default.nix new file mode 100644 index 0000000..8cff5cc --- /dev/null +++ b/pkgs/by-name/fi/file/default.nix @@ -0,0 +1,53 @@ +{ lib, stdenv, fetchurl, file, zlib, libgnurx +, testers +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation (finalAttrs: { + pname = "file"; + version = "5.45"; + + src = fetchurl { + urls = [ + "https://astron.com/pub/file/${finalAttrs.pname}-${finalAttrs.version}.tar.gz" + "https://distfiles.macports.org/file/${finalAttrs.pname}-${finalAttrs.version}.tar.gz" + ]; + hash = "sha256-/Jf1ECm7DiyfTjv/79r2ePDgOe6HK53lwAKm0Jx4TYI="; + }; + + outputs = [ "out" "dev" "man" ]; + + patches = [ + # Upstream patch to fix 32-bit tests. + # Will be included in 5.46+ releases. + ./32-bit-time_t.patch + ]; + + strictDeps = true; + enableParallelBuilding = true; + + nativeBuildInputs = lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) file; + buildInputs = [ zlib ] + ++ lib.optional stdenv.hostPlatform.isWindows libgnurx; + + # https://bugs.astron.com/view.php?id=382 + doCheck = !stdenv.buildPlatform.isMusl; + + makeFlags = lib.optional stdenv.hostPlatform.isWindows "FILE_COMPILE=file"; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "https://darwinsys.com/file"; + description = "A program that shows the type of files"; + maintainers = with maintainers; [ doronbehar ]; + license = licenses.bsd2; + pkgConfigModules = [ "libmagic" ]; + platforms = platforms.all; + mainProgram = "file"; + }; +}) diff --git a/pkgs/by-name/fi/file/packages.nix b/pkgs/by-name/fi/file/packages.nix new file mode 100644 index 0000000..00ab6a0 --- /dev/null +++ b/pkgs/by-name/fi/file/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + file = callPackage ./. { + inherit (windows) libgnurx; + }; +} diff --git a/pkgs/by-name/fi/findutils/default.nix b/pkgs/by-name/fi/findutils/default.nix new file mode 100644 index 0000000..b37eaea --- /dev/null +++ b/pkgs/by-name/fi/findutils/default.nix @@ -0,0 +1,96 @@ +{ lib, stdenv, fetchurl +, coreutils +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "findutils"; + version = "4.9.0"; + + src = fetchurl { + url = "mirror://gnu/findutils/${pname}-${version}.tar.xz"; + sha256 = "sha256-or+4wJ1DZ3DtxZ9Q+kg+eFsWGjt7nVR1c8sIBl/UYv4="; + }; + + postPatch = '' + substituteInPlace xargs/xargs.c --replace 'char default_cmd[] = "echo";' 'char default_cmd[] = "${coreutils}/bin/echo";' + ''; + + patches = [ ./no-install-statedir.patch ]; + + buildInputs = [ coreutils ]; # bin/updatedb script needs to call sort + + # Since glibc-2.25 the i686 tests hang reliably right after test-sleep. + doCheck + = !stdenv.hostPlatform.isDarwin + && !(stdenv.hostPlatform.libc == "glibc" && stdenv.hostPlatform.isi686) + && (stdenv.hostPlatform.libc != "musl") + && stdenv.hostPlatform == stdenv.buildPlatform; + + outputs = [ "out" "info" "locate"]; + + configureFlags = [ + # "sort" need not be on the PATH as a run-time dep, so we need to tell + # configure where it is. Covers the cross and native case alike. + "SORT=${coreutils}/bin/sort" + "--localstatedir=/var/cache" + ]; + + CFLAGS = lib.optionals stdenv.isDarwin [ + # TODO: Revisit upstream issue https://savannah.gnu.org/bugs/?59972 + # https://github.com/Homebrew/homebrew-core/pull/69761#issuecomment-770268478 + "-D__nonnull\\(params\\)=" + ]; + + postInstall = '' + moveToOutput bin/locate $locate + moveToOutput bin/updatedb $locate + ''; + + # can't move man pages in postInstall because the multi-output hook will move them back to $out + postFixup = '' + moveToOutput share/man/man5 $locate + moveToOutput share/man/man1/locate.1.gz $locate + moveToOutput share/man/man1/updatedb.1.gz $locate + ''; + + enableParallelBuilding = true; + + # bionic libc is super weird and has issues with fortify outside of its own libc, check this comment: + # https://github.com/NixOS/nixpkgs/pull/192630#discussion_r978985593 + # or you can check libc/include/sys/cdefs.h in bionic source code + hardeningDisable = lib.optional (stdenv.hostPlatform.libc == "bionic") "fortify"; + + meta = { + homepage = "https://www.gnu.org/software/findutils/"; + description = "GNU Find Utilities, the basic directory searching utilities of the GNU operating system"; + + longDescription = '' + The GNU Find Utilities are the basic directory searching + utilities of the GNU operating system. These programs are + typically used in conjunction with other programs to provide + modular and powerful directory search and file locating + capabilities to other commands. + + The tools supplied with this package are: + + * find - search for files in a directory hierarchy; + * xargs - build and execute command lines from standard input. + + The following are available in the locate output: + + * locate - list files in databases that match a pattern; + * updatedb - update a file name database; + ''; + + platforms = lib.platforms.all; + + license = lib.licenses.gpl3Plus; + + mainProgram = "find"; + }; +} diff --git a/pkgs/by-name/fi/findutils/no-install-statedir.patch b/pkgs/by-name/fi/findutils/no-install-statedir.patch new file mode 100644 index 0000000..a7a4803 --- /dev/null +++ b/pkgs/by-name/fi/findutils/no-install-statedir.patch @@ -0,0 +1,11 @@ +--- a/locate/Makefile.in ++++ b/locate/Makefile.in +@@ -2357,7 +2357,7 @@ updatedb: updatedb.sh Makefile + chmod +x $@ + + install-data-hook: +- $(top_srcdir)/build-aux/mkinstalldirs $(DESTDIR)$(localstatedir) ++ #$(top_srcdir)/build-aux/mkinstalldirs $(DESTDIR)$(localstatedir) + + dblocation.texi: + echo '@set LOCATE_DB $(LOCATE_DB)' > $@.tmp diff --git a/pkgs/by-name/fl/flex/2.5.35.nix b/pkgs/by-name/fl/flex/2.5.35.nix new file mode 100644 index 0000000..d6a0992 --- /dev/null +++ b/pkgs/by-name/fl/flex/2.5.35.nix @@ -0,0 +1,35 @@ +{ lib, stdenv, fetchurl, autoreconfHook, flex, bison, texinfo, help2man, m4 }: + +stdenv.mkDerivation rec { + pname = "flex"; + version = "2.5.35"; + + src = fetchurl { + url = "https://github.com/westes/flex/archive/flex-${lib.replaceStrings ["."] ["-"] version}.tar.gz"; + sha256 = "0wh06nix8bd4w1aq4k2fbbkdq5i30a9lxz3xczf3ff28yy0kfwzm"; + }; + + postPatch = '' + patchShebangs tests + ''; + + nativeBuildInputs = [ flex bison texinfo help2man autoreconfHook ]; + + propagatedBuildInputs = [ m4 ]; + + preConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + ac_cv_func_malloc_0_nonnull=yes + ac_cv_func_realloc_0_nonnull=yes + ''; + + doCheck = false; # fails 2 out of 46 tests + + meta = with lib; { + branch = "2.5.35"; + homepage = "https://flex.sourceforge.net/"; + description = "A fast lexical analyser generator"; + mainProgram = "flex"; + license = licenses.bsd2; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/fl/flex/default.nix b/pkgs/by-name/fl/flex/default.nix new file mode 100644 index 0000000..8991c14 --- /dev/null +++ b/pkgs/by-name/fl/flex/default.nix @@ -0,0 +1,60 @@ +{ lib, stdenv, buildPackages, fetchurl, bison, m4 +, autoreconfHook, help2man +}: + +# Avoid 'fetchpatch' to allow 'flex' to be used as a possible 'gcc' +# dependency during bootstrap. Useful when gcc is built from snapshot +# or from a git tree (flex lexers are not pre-generated there). + +stdenv.mkDerivation rec { + pname = "flex"; + version = "2.6.4"; + + src = fetchurl { + url = "https://github.com/westes/flex/releases/download/v${version}/flex-${version}.tar.gz"; + sha256 = "15g9bv236nzi665p9ggqjlfn4dwck5835vf0bbw2cz7h5c1swyp8"; + }; + + # Also upstream, will be part of 2.6.5 + # https://github.com/westes/flex/commit/24fd0551333e + patches = [(fetchurl { + name = "glibc-2.26.patch"; + url = "https://raw.githubusercontent.com/lede-project/source/0fb14a2b1ab2f82ce63f4437b062229d73d90516/tools/flex/patches/200-build-AC_USE_SYSTEM_EXTENSIONS-in-configure.ac.patch"; + sha256 = "0mpp41zdg17gx30kcpj83jl8hssks3adbks0qzbhcz882b9c083r"; + })]; + + postPatch = '' + patchShebangs tests + '' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + substituteInPlace Makefile.in --replace "tests" " " + + substituteInPlace doc/Makefile.am --replace 'flex.1: $(top_srcdir)/configure.ac' 'flex.1: ' + ''; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ autoreconfHook help2man ]; + buildInputs = [ bison ]; + propagatedBuildInputs = [ m4 ]; + + preConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + export ac_cv_func_malloc_0_nonnull=yes + export ac_cv_func_realloc_0_nonnull=yes + ''; + + postConfigure = lib.optionalString (stdenv.isDarwin || stdenv.isCygwin) '' + sed -i Makefile -e 's/-no-undefined//;' + ''; + + dontDisableStatic = stdenv.buildPlatform != stdenv.hostPlatform; + + postInstall = '' + ln -s $out/bin/flex $out/bin/lex + ''; + + meta = with lib; { + homepage = "https://github.com/westes/flex"; + description = "A fast lexical analyser generator"; + license = licenses.bsd2; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/fl/flex/packages.nix b/pkgs/by-name/fl/flex/packages.nix new file mode 100644 index 0000000..248e6d0 --- /dev/null +++ b/pkgs/by-name/fl/flex/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + flex_2_5_35 = callPackage ./2.5.35.nix { }; + flex = callPackage ./. { }; +} diff --git a/pkgs/by-name/fm/fmt/default.nix b/pkgs/by-name/fm/fmt/default.nix new file mode 100644 index 0000000..9866be4 --- /dev/null +++ b/pkgs/by-name/fm/fmt/default.nix @@ -0,0 +1,73 @@ +{ lib +, stdenv +, fetchFromGitHub, fetchpatch +, cmake +, enableShared ? !stdenv.hostPlatform.isStatic + +# for passthru.tests +# , mpd +# , openimageio +# , fcitx5 +# , spdlog +}: + +let + generic = { version, sha256, patches ? [ ] }: + stdenv.mkDerivation { + pname = "fmt"; + inherit version; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "fmtlib"; + repo = "fmt"; + rev = version; + inherit sha256; + }; + + inherit patches; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=${if enableShared then "ON" else "OFF"}" + ]; + + doCheck = true; + + # passthru.tests = { + # inherit mpd openimageio fcitx5 spdlog; + # }; + + meta = with lib; { + description = "Small, safe and fast formatting library"; + longDescription = '' + fmt (formerly cppformat) is an open-source formatting library. It can be + used as a fast and safe alternative to printf and IOStreams. + ''; + homepage = "https://fmt.dev/"; + changelog = "https://github.com/fmtlib/fmt/blob/${version}/ChangeLog.rst"; + downloadPage = "https://github.com/fmtlib/fmt/"; + maintainers = [ maintainers.jdehaas ]; + license = licenses.mit; + platforms = platforms.all; + }; + }; +in +{ + fmt_8 = generic { + version = "8.1.1"; + sha256 = "sha256-leb2800CwdZMJRWF5b1Y9ocK0jXpOX/nwo95icDf308="; + }; + + fmt_9 = generic { + version = "9.1.0"; + sha256 = "sha256-rP6ymyRc7LnKxUXwPpzhHOQvpJkpnRFOt2ctvUNlYI0="; + }; + + fmt_10 = generic { + version = "10.2.1"; + sha256 = "sha256-pEltGLAHLZ3xypD/Ur4dWPWJ9BGVXwqQyKcDWVmC3co="; + }; +} diff --git a/pkgs/by-name/fm/fmt/packages.nix b/pkgs/by-name/fm/fmt/packages.nix new file mode 100644 index 0000000..14fd8b1 --- /dev/null +++ b/pkgs/by-name/fm/fmt/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit (callPackages ./. { }) fmt_8 fmt_9 fmt_10; + fmt = fmt_10; +} diff --git a/pkgs/by-name/fo/fontconfig/default.nix b/pkgs/by-name/fo/fontconfig/default.nix new file mode 100644 index 0000000..a3150ca --- /dev/null +++ b/pkgs/by-name/fo/fontconfig/default.nix @@ -0,0 +1,96 @@ +{ stdenv +, lib +, fetchurl +, pkg-config +, python3 +, freetype +, expat +, libxslt +, gperf +, dejavu_fonts +, autoreconfHook +, CoreFoundation +# for passthru.tests +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "fontconfig"; + version = "2.15.0"; + + outputs = [ "bin" "dev" "lib" "out" ]; # $out contains all the config + + src = fetchurl { + url = with finalAttrs; "https://www.freedesktop.org/software/fontconfig/release/${pname}-${version}.tar.xz"; + hash = "sha256-Y6BljQ4G4PqIYQZFK1jvBPIfWCAuoCqUw53g0zNdfA4="; + }; + + nativeBuildInputs = [ + autoreconfHook + gperf + libxslt + pkg-config + python3 + ]; + + buildInputs = [ + expat + ] ++ lib.optional stdenv.isDarwin CoreFoundation; + + propagatedBuildInputs = [ + freetype + ]; + + postPatch = '' + # Requires networking. + sed -i '/check_PROGRAMS += test-crbug1004254/d' test/Makefile.am + ''; + + configureFlags = [ + "--sysconfdir=/etc" + "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}" + "--with-cache-dir=/var/cache/fontconfig" # otherwise the fallback is in $out/ + # just <1MB; this is what you get when loading config fails for some reason + "--with-default-fonts=${dejavu_fonts.minimal}" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}" + ]; + + enableParallelBuilding = true; + + doCheck = true; + + installFlags = [ + # Don't try to write to /var/cache/fontconfig at install time. + "fc_cachedir=$(TMPDIR)/dummy" + "RUN_FC_CACHE_TEST=false" + "sysconfdir=${placeholder "out"}/etc" + ]; + + postInstall = '' + cd "$out/etc/fonts" + xsltproc --stringparam fontDirectories "${dejavu_fonts.minimal}" \ + --path $out/share/xml/fontconfig \ + ${./make-fonts-conf.xsl} $out/etc/fonts/fonts.conf \ + > fonts.conf.tmp + mv fonts.conf.tmp $out/etc/fonts/fonts.conf + # We don't keep section 3 of the manpages, as they are quite large and + # probably not so useful. + rm -r $bin/share/man/man3 + ''; + + # passthru.tests = { + # pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + + meta = with lib; { + description = "A library for font customization and configuration"; + homepage = "http://fontconfig.org/"; + license = licenses.bsd2; # custom but very bsd-like + platforms = platforms.all; + maintainers = with maintainers; [ ]; + pkgConfigModules = [ "fontconfig" ]; + }; +}) diff --git a/pkgs/by-name/fo/fontconfig/make-fonts-cache.nix b/pkgs/by-name/fo/fontconfig/make-fonts-cache.nix new file mode 100644 index 0000000..47884b9 --- /dev/null +++ b/pkgs/by-name/fo/fontconfig/make-fonts-cache.nix @@ -0,0 +1,33 @@ +{ runCommand, lib, fontconfig, fontDirectories }: + +runCommand "fc-cache" + { + nativeBuildInputs = [ fontconfig.bin ]; + preferLocalBuild = true; + allowSubstitutes = false; + passAsFile = [ "fontDirs" ]; + fontDirs = '' + + ${lib.concatStringsSep "\n" (map (font: "${font}") fontDirectories)} + ''; + } + '' + export FONTCONFIG_FILE=$(pwd)/fonts.conf + + cat > fonts.conf << EOF + + + + ${fontconfig.out}/etc/fonts/fonts.conf + $out + EOF + cat "$fontDirsPath" >> fonts.conf + echo "" >> fonts.conf + + mkdir -p $out + fc-cache -sv + + # This is not a cache dir in the normal sense -- it won't be automatically + # recreated. + rm -f "$out/CACHEDIR.TAG" + '' diff --git a/pkgs/by-name/fo/fontconfig/make-fonts-conf.nix b/pkgs/by-name/fo/fontconfig/make-fonts-conf.nix new file mode 100644 index 0000000..a03f744 --- /dev/null +++ b/pkgs/by-name/fo/fontconfig/make-fonts-conf.nix @@ -0,0 +1,37 @@ +{ runCommand, stdenv, lib, libxslt, fontconfig, dejavu_fonts }: + +let fontconfig_ = fontconfig; in +{ + fontconfig ? fontconfig_ + # an array of fonts, e.g. `[ pkgs.dejavu_fonts.minimal ]` +, fontDirectories + , impureFontDirectories ? [ + # nix user profile + "~/.nix-profile/lib/X11/fonts" "~/.nix-profile/share/fonts" + ] + ++ lib.optional stdenv.isDarwin "~/Library/Fonts" + ++ [ + # FHS paths for non-NixOS platforms + "/usr/share/fonts" "/usr/local/share/fonts" + ] + # darwin paths + ++ lib.optionals stdenv.isDarwin [ "/Library/Fonts" "/System/Library/Fonts" ] + # nix default profile + ++ [ "/nix/var/nix/profiles/default/lib/X11/fonts" "/nix/var/nix/profiles/default/share/fonts" ] +}: + +runCommand "fonts.conf" + { + nativeBuildInputs = [ libxslt ]; + buildInputs = [ fontconfig ]; + inherit fontDirectories; + # Add a default font for non-nixos systems, <1MB and in nixos defaults. + impureFontDirectories = impureFontDirectories ++ [ dejavu_fonts.minimal ]; + } + '' + xsltproc --stringparam fontDirectories "$fontDirectories" \ + --stringparam impureFontDirectories "$impureFontDirectories" \ + --path ${fontconfig.out}/share/xml/fontconfig \ + ${./make-fonts-conf.xsl} ${fontconfig.out}/etc/fonts/fonts.conf \ + > $out + '' diff --git a/pkgs/by-name/fo/fontconfig/make-fonts-conf.xsl b/pkgs/by-name/fo/fontconfig/make-fonts-conf.xsl new file mode 100644 index 0000000..d04e4ff --- /dev/null +++ b/pkgs/by-name/fo/fontconfig/make-fonts-conf.xsl @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + fontconfig + + + /var/cache/fontconfig + + + + /etc/fonts/conf.d + + + fonts + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkgs/by-name/fo/fontconfig/packages.nix b/pkgs/by-name/fo/fontconfig/packages.nix new file mode 100644 index 0000000..8670a20 --- /dev/null +++ b/pkgs/by-name/fo/fontconfig/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + fontconfig = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) CoreFoundation; + }; +} diff --git a/pkgs/by-name/fo/fontforge/default.nix b/pkgs/by-name/fo/fontforge/default.nix new file mode 100644 index 0000000..d7a083b --- /dev/null +++ b/pkgs/by-name/fo/fontforge/default.nix @@ -0,0 +1,79 @@ +{ stdenv, fetchFromGitHub, lib, fetchpatch +, cmake, uthash, pkg-config +, python, freetype, zlib, glib, giflib, libpng, libjpeg, libtiff, libxml2, cairo, pango +, readline, woff2, zeromq +, withSpiro ? false, libspiro +, withGTK ? false, gtk3 +, withGUI ? withGTK +, withPython ? true +, withExtras ? true +, Carbon, Cocoa +}: + +assert withGTK -> withGUI; + +stdenv.mkDerivation rec { + pname = "fontforge"; + version = "20230101"; + + src = fetchFromGitHub { + owner = pname; + repo = pname; + rev = version; + sha256 = "sha256-/RYhvL+Z4n4hJ8dmm+jbA1Ful23ni2DbCRZC5A3+pP0="; + }; + + patches = [ + (fetchpatch { + name = "CVE-2024-25081.CVE-2024-25082.patch"; + url = "https://github.com/fontforge/fontforge/commit/216eb14b558df344b206bf82e2bdaf03a1f2f429.patch"; + hash = "sha256-aRnir09FSQMT50keoB7z6AyhWAVBxjSQsTRvBzeBuHU="; + }) + ]; + + # use $SOURCE_DATE_EPOCH instead of non-deterministic timestamps + postPatch = '' + find . -type f -name '*.c' -exec sed -r -i 's#\btime\(&(.+)\)#if (getenv("SOURCE_DATE_EPOCH")) \1=atol(getenv("SOURCE_DATE_EPOCH")); else &#g' {} \; + sed -r -i 's#author\s*!=\s*NULL#& \&\& !getenv("SOURCE_DATE_EPOCH")#g' fontforge/cvexport.c fontforge/dumppfa.c fontforge/print.c fontforge/svg.c fontforge/splineutil2.c + sed -r -i 's#\bb.st_mtime#getenv("SOURCE_DATE_EPOCH") ? atol(getenv("SOURCE_DATE_EPOCH")) : &#g' fontforge/parsepfa.c fontforge/sfd.c fontforge/svg.c + sed -r -i 's#^\s*ttf_fftm_dump#if (!getenv("SOURCE_DATE_EPOCH")) ttf_fftm_dump#g' fontforge/tottf.c + sed -r -i 's#sprintf\(.+ author \);#if (!getenv("SOURCE_DATE_EPOCH")) &#g' fontforgeexe/fontinfo.c + ''; + + # do not use x87's 80-bit arithmetic, rouding errors result in very different font binaries + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isi686 "-msse2 -mfpmath=sse"; + + nativeBuildInputs = [ pkg-config cmake ]; + buildInputs = [ + readline uthash woff2 zeromq + python freetype zlib glib giflib libpng libjpeg libtiff libxml2 + ] + ++ lib.optionals withSpiro [ libspiro ] + ++ lib.optionals withGUI [ gtk3 cairo pango ] + ++ lib.optionals stdenv.isDarwin [ Carbon Cocoa ]; + + cmakeFlags = [ "-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON" ] + ++ lib.optional (!withSpiro) "-DENABLE_LIBSPIRO=OFF" + ++ lib.optional (!withGUI) "-DENABLE_GUI=OFF" + ++ lib.optional (!withGTK) "-DENABLE_X11=ON" + ++ lib.optional withExtras "-DENABLE_FONTFORGE_EXTRAS=ON"; + + preConfigure = '' + # The way $version propagates to $version of .pe-scripts (https://github.com/dejavu-fonts/dejavu-fonts/blob/358190f/scripts/generate.pe#L19) + export SOURCE_DATE_EPOCH=$(date -d ${version} +%s) + ''; + + postInstall = + # get rid of the runtime dependency on python + lib.optionalString (!withPython) '' + rm -r "$out/share/fontforge/python" + ''; + + meta = with lib; { + description = "A font editor"; + homepage = "https://fontforge.github.io"; + platforms = platforms.all; + license = licenses.bsd3; + maintainers = [ maintainers.erictapen ]; + }; +} diff --git a/pkgs/by-name/fo/fontforge/fontforge-fonttools.nix b/pkgs/by-name/fo/fontforge/fontforge-fonttools.nix new file mode 100644 index 0000000..ea4acfc --- /dev/null +++ b/pkgs/by-name/fo/fontforge/fontforge-fonttools.nix @@ -0,0 +1 @@ +{ fontforge }: fontforge.override { withExtras = true; } diff --git a/pkgs/by-name/fo/fontforge/packages.nix b/pkgs/by-name/fo/fontforge/packages.nix new file mode 100644 index 0000000..fe4c9f3 --- /dev/null +++ b/pkgs/by-name/fo/fontforge/packages.nix @@ -0,0 +1,18 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + fontforge = lowPrio (callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Carbon Cocoa; + python = python3; + }); + fontforge-gtk = fontforge.override { + withSpiro = true; + withGTK = true; + gtk3 = gtk3-x11; + inherit (darwin.apple_sdk.frameworks) Carbon Cocoa; + }; + + fontforge-fonttools = callPackage ./fontforge-fonttools.nix { }; +} diff --git a/pkgs/by-name/fo/fop/default.nix b/pkgs/by-name/fo/fop/default.nix new file mode 100644 index 0000000..94a2421 --- /dev/null +++ b/pkgs/by-name/fo/fop/default.nix @@ -0,0 +1,81 @@ +{ lib +, stdenv +, fetchurl +, ant +, jdk +, jre +, makeWrapper +, stripJavaArchivesHook +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "fop"; + version = "2.8"; + + src = fetchurl { + url = "mirror://apache/xmlgraphics/fop/fop-${finalAttrs.version}-src.tar.gz"; + hash = "sha256-b7Av17wu6Ar/npKOiwYqzlvBFSIuXTpqTacM1sxtBvc="; + }; + + nativeBuildInputs = [ + ant + jdk + makeWrapper + stripJavaArchivesHook + ]; + + # Note: not sure if this is needed anymore + env.JAVA_TOOL_OPTIONS = "-Dfile.encoding=UTF8"; + + buildPhase = '' + runHook preBuild + + # build only the "package" target, which generates the fop command. + ant -f fop/build.xml package + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib $out/share/doc/fop + cp fop/build/*.jar fop/lib/*.jar $out/lib/ + cp -r README fop/examples/ $out/share/doc/fop/ + + # There is a fop script in the source archive, but it has many impurities. + # Instead of patching out 90 % of the script, we write our own. + makeWrapper ${jre}/bin/java $out/bin/fop \ + --add-flags "-Djava.awt.headless=true" \ + --add-flags "-classpath $out/lib/\*" \ + --add-flags "org.apache.fop.cli.Main" + + runHook postInstall + ''; + + meta = { + changelog = "https://xmlgraphics.apache.org/fop/changes.html"; + description = "XML formatter driven by XSL Formatting Objects (XSL-FO)"; + longDescription = '' + FOP is a Java application that reads a formatting object tree and then + turns it into a wide variety of output presentations (including AFP, PCL, + PDF, PNG, PostScript, RTF, TIFF, and plain text), or displays the result + on-screen. + + The formatting object tree can be in the form of an XML document (output + by an XSLT engine like xalan) or can be passed in memory as a DOM + Document or (in the case of xalan) SAX events. + + This package contains the fop command line tool. + ''; + homepage = "https://xmlgraphics.apache.org/fop/"; + license = lib.licenses.asl20; + mainProgram = "fop"; + maintainers = with lib.maintainers; [ bjornfor tomasajt ]; + platforms = jre.meta.platforms; + sourceProvenance = with lib.sourceTypes; [ + fromSource + binaryBytecode # source bundles dependencies as jars + ]; + }; +}) diff --git a/pkgs/by-name/fo/fortify-headers/default.nix b/pkgs/by-name/fo/fortify-headers/default.nix new file mode 100644 index 0000000..1f418af --- /dev/null +++ b/pkgs/by-name/fo/fortify-headers/default.nix @@ -0,0 +1,39 @@ +{ lib +, stdenv +, fetchurl +}: + +stdenv.mkDerivation { + pname = "fortify-headers"; + version = "1.1alpine3"; + + # upstream only accessible via git - unusable during bootstrap, hence + # extract from the alpine package + src = fetchurl { + url = "https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/fortify-headers-1.1-r3.apk"; + name = "fortify-headers.tar.gz"; # ensure it's extracted as a .tar.gz + hash = "sha256-8A8JcKHIBgXpUuIP4zs3Q1yBs5jCGd5F3H2E8UN/S2g="; + }; + + patches = [ + ./wchar-imports-skip.patch + ./restore-macros.patch + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r include/fortify $out/include + + runHook postInstall + ''; + + meta = { + description = "Standalone header-based fortify-source implementation"; + homepage = "https://git.2f30.org/fortify-headers"; + license = lib.licenses.bsd0; + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ ris ]; + }; +} diff --git a/pkgs/by-name/fo/fortify-headers/restore-macros.patch b/pkgs/by-name/fo/fortify-headers/restore-macros.patch new file mode 100644 index 0000000..f7d31a3 --- /dev/null +++ b/pkgs/by-name/fo/fortify-headers/restore-macros.patch @@ -0,0 +1,283 @@ +restore #undef'ed macro values after we're done + +some programs that define these miss them if removed + +push_macro and pop_macro pragmas allegedly well supported +by gcc, clang and msvc + +--- a/include/fortify/poll.h ++++ b/include/fortify/poll.h +@@ -29,6 +29,7 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("poll") + #undef poll + + _FORTIFY_FN(poll) int poll(struct pollfd * _FORTIFY_POS0 __f, nfds_t __n, int __s) +@@ -40,6 +41,8 @@ _FORTIFY_FN(poll) int poll(struct pollfd * _FORTIFY_POS0 __f, nfds_t __n, int __ + return __orig_poll(__f, __n, __s); + } + ++#pragma pop_macro("poll") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/stdio.h ++++ b/include/fortify/stdio.h +@@ -29,12 +29,19 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("fgets") + #undef fgets ++#pragma push_macro("fread") + #undef fread ++#pragma push_macro("fwrite") + #undef fwrite ++#pragma push_macro("vsprintf") + #undef vsprintf ++#pragma push_macro("vsnprintf") + #undef vsnprintf ++#pragma push_macro("snprintf") + #undef snprintf ++#pragma push_macro("sprintf") + #undef sprintf + + _FORTIFY_FN(fgets) char *fgets(char * _FORTIFY_POS0 __s, int __n, FILE *__f) +@@ -140,6 +147,14 @@ _FORTIFY_FN(sprintf) int sprintf(char *__s, const char *__f, ...) + #endif /* __has_builtin(__builtin_va_arg_pack) */ + #endif /* defined(__has_builtin) */ + ++#pragma pop_macro("fgets") ++#pragma pop_macro("fread") ++#pragma pop_macro("fwrite") ++#pragma pop_macro("vsprintf") ++#pragma pop_macro("vsnprintf") ++#pragma pop_macro("snprintf") ++#pragma pop_macro("sprintf") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/stdlib.h ++++ b/include/fortify/stdlib.h +@@ -38,7 +38,10 @@ extern "C" { + + /* FIXME clang */ + #if (defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)) && !defined(__clang__) ++ ++#pragma push_macro("realpath") + #undef realpath ++ + _FORTIFY_FN(realpath) char *realpath(const char *__p, char *__r) + { + #ifndef PATH_MAX +@@ -60,6 +63,9 @@ _FORTIFY_FN(realpath) char *realpath(const char *__p, char *__r) + return __orig_realpath(__p, __r); + #endif + } ++ ++#pragma pop_macro("realpath") ++ + #endif + + #ifdef __cplusplus +--- a/include/fortify/string.h ++++ b/include/fortify/string.h +@@ -29,12 +29,19 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("memcpy") + #undef memcpy ++#pragma push_macro("memmove") + #undef memmove ++#pragma push_macro("memset") + #undef memset ++#pragma push_macro("strcat") + #undef strcat ++#pragma push_macro("strcpy") + #undef strcpy ++#pragma push_macro("strncat") + #undef strncat ++#pragma push_macro("strncpy") + #undef strncpy + + _FORTIFY_FN(memcpy) void *memcpy(void * _FORTIFY_POS0 __od, +@@ -183,6 +190,14 @@ _FORTIFY_FN(strlcpy) size_t strlcpy(char * _FORTIFY_POS0 __d, + } + #endif + ++#pragma pop_macro("memcpy") ++#pragma pop_macro("memmove") ++#pragma pop_macro("memset") ++#pragma pop_macro("strcat") ++#pragma pop_macro("strcpy") ++#pragma pop_macro("strncat") ++#pragma pop_macro("strncpy") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/strings.h ++++ b/include/fortify/strings.h +@@ -29,8 +29,12 @@ extern "C" { + #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \ + || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \ + || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700) ++ ++#pragma push_macro("bcopy") + #undef bcopy ++#pragma push_macro("bzero") + #undef bzero ++ + _FORTIFY_FN(bcopy) void bcopy(const void * _FORTIFY_POS0 __s, + void * _FORTIFY_POS0 __d, size_t __n) + { +@@ -52,6 +56,9 @@ _FORTIFY_FN(bzero) void bzero(void * _FORTIFY_POS0 __s, size_t __n) + } + #endif + ++#pragma pop_macro("bcopy") ++#pragma pop_macro("bzero") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/sys/socket.h ++++ b/include/fortify/sys/socket.h +@@ -29,9 +29,13 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("recv") + #undef recv ++#pragma push_macro("recvfrom") + #undef recvfrom ++#pragma push_macro("send") + #undef send ++#pragma push_macro("sendto") + #undef sendto + + _FORTIFY_FN(recv) ssize_t recv(int __f, void * _FORTIFY_POS0 __s, size_t __n, +@@ -76,6 +80,11 @@ _FORTIFY_FN(sendto) ssize_t sendto(int __f, const void * _FORTIFY_POS0 __s, + return __orig_sendto(__f, __s, __n, __fl, __a, __l); + } + ++#pragma push_macro("recv") ++#pragma push_macro("recvfrom") ++#pragma push_macro("send") ++#pragma push_macro("sendto") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/unistd.h ++++ b/include/fortify/unistd.h +@@ -29,16 +29,27 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("confstr") + #undef confstr ++#pragma push_macro("getcwd") + #undef getcwd ++#pragma push_macro("getgroups") + #undef getgroups ++#pragma push_macro("gethostname") + #undef gethostname ++#pragma push_macro("getlogin_r") + #undef getlogin_r ++#pragma push_macro("pread") + #undef pread ++#pragma push_macro("read") + #undef read ++#pragma push_macro("readlink") + #undef readlink ++#pragma push_macro("readlinkat") + #undef readlinkat ++#pragma push_macro("ttyname_r") + #undef ttyname_r ++#pragma push_macro("write") + #undef write + + _FORTIFY_FN(confstr) size_t confstr(int __n, char * _FORTIFY_POS0 __s, size_t __l) +@@ -158,6 +169,18 @@ _FORTIFY_FN(write) ssize_t write(int __f, const void * _FORTIFY_POS0 __s, + return __orig_write(__f, __s, __n); + } + ++#pragma pop_macro("confstr") ++#pragma pop_macro("getcwd") ++#pragma pop_macro("getgroups") ++#pragma pop_macro("gethostname") ++#pragma pop_macro("getlogin_r") ++#pragma pop_macro("pread") ++#pragma pop_macro("read") ++#pragma pop_macro("readlink") ++#pragma pop_macro("readlinkat") ++#pragma pop_macro("ttyname_r") ++#pragma pop_macro("write") ++ + #ifdef __cplusplus + } + #endif +--- a/include/fortify/wchar.h ++++ b/include/fortify/wchar.h +@@ -43,19 +43,33 @@ __extension__ + extern "C" { + #endif + ++#pragma push_macro("fgetws") + #undef fgetws ++#pragma push_macro("mbsrtowcs") + #undef mbsrtowcs ++#pragma push_macro("mbstowcs") + #undef mbstowcs ++#pragma push_macro("wcrtomb") + #undef wcrtomb ++#pragma push_macro("wcscat") + #undef wcscat ++#pragma push_macro("wcscpy") + #undef wcscpy ++#pragma push_macro("wcsncat") + #undef wcsncat ++#pragma push_macro("wcsncpy") + #undef wcsncpy ++#pragma push_macro("wcsrtombs") + #undef wcsrtombs ++#pragma push_macro("wcstombs") + #undef wcstombs ++#pragma push_macro("wctomb") + #undef wctomb ++#pragma push_macro("wmemcpy") + #undef wmemcpy ++#pragma push_macro("wmemmove") + #undef wmemmove ++#pragma push_macro("wmemset") + #undef wmemset + + _FORTIFY_FN(fgetws) wchar_t *fgetws(wchar_t * _FORTIFY_POS0 __s, +@@ -269,6 +283,21 @@ _FORTIFY_FN(wmemset) wchar_t *wmemset(wchar_t * _FORTIFY_POS0 __s, + return __orig_wmemset(__s, __c, __n); + } + ++#pragma pop_macro("fgetws") ++#pragma pop_macro("mbsrtowcs") ++#pragma pop_macro("mbstowcs") ++#pragma pop_macro("wcrtomb") ++#pragma pop_macro("wcscat") ++#pragma pop_macro("wcscpy") ++#pragma pop_macro("wcsncat") ++#pragma pop_macro("wcsncpy") ++#pragma pop_macro("wcsrtombs") ++#pragma pop_macro("wcstombs") ++#pragma pop_macro("wctomb") ++#pragma pop_macro("wmemcpy") ++#pragma pop_macro("wmemmove") ++#pragma pop_macro("wmemset") ++ + #ifdef __cplusplus + } + #endif diff --git a/pkgs/by-name/fo/fortify-headers/wchar-imports-skip.patch b/pkgs/by-name/fo/fortify-headers/wchar-imports-skip.patch new file mode 100644 index 0000000..255ceba --- /dev/null +++ b/pkgs/by-name/fo/fortify-headers/wchar-imports-skip.patch @@ -0,0 +1,41 @@ +wchar.h: only include other headers if _FORTIFY_SOURCE is enabled + +unexpectedly including other headers can cause problems with +sensitive/brittle code, particularly with alternative compilers +(clang) which are already operating on the margins of what's +supported/expected by some projects. + +having a way to almost entirely short-circuit these headers (by +disabling _FORTIFY_SOURCE) is therefore important. + +--- a/include/fortify/wchar.h ++++ b/include/fortify/wchar.h +@@ -20,21 +20,23 @@ + #if !defined(__cplusplus) && !defined(__clang__) + __extension__ + #endif +-#include_next ++#include_next ++ ++#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 ++ + #if !defined(__cplusplus) && !defined(__clang__) + __extension__ + #endif +-#include_next ++#include_next + #if !defined(__cplusplus) && !defined(__clang__) + __extension__ + #endif +-#include_next ++#include_next + #if !defined(__cplusplus) && !defined(__clang__) + __extension__ + #endif +-#include_next ++#include_next + +-#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 + #include "fortify-headers.h" + + #ifdef __cplusplus diff --git a/pkgs/by-name/fr/freetype/default.nix b/pkgs/by-name/fr/freetype/default.nix new file mode 100644 index 0000000..0d56ab1 --- /dev/null +++ b/pkgs/by-name/fr/freetype/default.nix @@ -0,0 +1,122 @@ +{ lib +, stdenv +, fetchurl +, buildPackages +, pkgsHostHost +, pkg-config +, which +, makeWrapper +, zlib +, bzip2 +, brotli +, libpng +, gnumake +, glib + +, # FreeType supports LCD filtering (colloquially referred to as sub-pixel rendering). + # LCD filtering is also known as ClearType and covered by several Microsoft patents. + # This option allows it to be disabled. See http://www.freetype.org/patents.html. + useEncumberedCode ? true + + # for passthru.tests +# , cairo +# , fontforge +# , ghostscript +# , graphicsmagick +# , gtk3 +# , harfbuzz +# , imagemagick +# , pango +# , poppler +# , python3 +# , qt5 +# , texmacs +# , ttfautohint +# , testers +}: + + +stdenv.mkDerivation (finalAttrs: { + pname = "freetype"; + version = "2.13.2"; + + src = let inherit (finalAttrs) pname version; in fetchurl { + url = "mirror://savannah/${pname}/${pname}-${version}.tar.xz"; + sha256 = "sha256-EpkcTlXFBt1/m3ZZM+Yv0r4uBtQhUF15UKEy5PG7SE0="; + }; + + propagatedBuildInputs = [ zlib bzip2 brotli libpng ]; # needed when linking against freetype + + # dependence on harfbuzz is looser than the reverse dependence + nativeBuildInputs = [ pkg-config which ] + ++ lib.optional (!stdenv.hostPlatform.isWindows) makeWrapper + # FreeType requires GNU Make, which is not part of stdenv on FreeBSD. + ++ lib.optional (!stdenv.isLinux) gnumake; + + patches = [ + ./enable-table-validation.patch + ] ++ lib.optional useEncumberedCode ./enable-subpixel-rendering.patch; + + outputs = [ "out" "dev" ]; + + configureFlags = [ "--bindir=$(dev)/bin" "--enable-freetype-config" ]; + + # native compiler to generate building tool + CC_BUILD = "${buildPackages.stdenv.cc}/bin/cc"; + + # The asm for armel is written with the 'asm' keyword. + CFLAGS = lib.optionalString stdenv.isAarch32 "-std=gnu99" + + lib.optionalString stdenv.hostPlatform.is32bit " -D_FILE_OFFSET_BITS=64"; + + enableParallelBuilding = true; + + doCheck = true; + + postInstall = glib.flattenInclude + # pkgsCross.mingwW64.pkg-config doesn't build + # makeWrapper doesn't cross-compile to windows #120726 + + '' + substituteInPlace $dev/bin/freetype-config \ + --replace ${buildPackages.pkg-config} ${pkgsHostHost.pkg-config} + '' + lib.optionalString (!stdenv.hostPlatform.isMinGW) '' + + wrapProgram "$dev/bin/freetype-config" \ + --set PKG_CONFIG_PATH "$PKG_CONFIG_PATH:$dev/lib/pkgconfig" + ''; + + # passthru.tests = { + # inherit + # cairo + # fontforge + # ghostscript + # graphicsmagick + # gtk3 + # harfbuzz + # imagemagick + # pango + # poppler + # texmacs + # ttfautohint; + # inherit (python3.pkgs) freetype-py; + # inherit (qt5) qtbase; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # }; + + meta = with lib; { + description = "A font rendering engine"; + mainProgram = "freetype-config"; + longDescription = '' + FreeType is a portable and efficient library for rendering fonts. It + supports TrueType, Type 1, CFF fonts, and WOFF, PCF, FNT, BDF and PFR + fonts. It has a bytecode interpreter and has an automatic hinter called + autofit which can be used instead of hinting instructions included in + fonts. + ''; + homepage = "https://www.freetype.org/"; + changelog = "https://gitlab.freedesktop.org/freetype/freetype/-/raw/VER-${builtins.replaceStrings ["."] ["-"] finalAttrs.version}/docs/CHANGES"; + license = licenses.gpl2Plus; # or the FreeType License (BSD + advertising clause) + platforms = platforms.all; + pkgConfigModules = [ "freetype2" ]; + maintainers = with maintainers; [ ]; + }; +}) diff --git a/pkgs/by-name/fr/freetype/enable-subpixel-rendering.patch b/pkgs/by-name/fr/freetype/enable-subpixel-rendering.patch new file mode 100644 index 0000000..6b3577e --- /dev/null +++ b/pkgs/by-name/fr/freetype/enable-subpixel-rendering.patch @@ -0,0 +1,12 @@ +Index: freetype-2.10.0/include/freetype/config/ftoption.h +--- a/include/freetype/config/ftoption.h ++++ b/include/freetype/config/ftoption.h +@@ -126,7 +126,7 @@ FT_BEGIN_HEADER + * macro is not defined, FreeType offers alternative LCD rendering + * technology that produces excellent output without LCD filtering. + */ +-/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ ++#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + + /************************************************************************** diff --git a/pkgs/by-name/fr/freetype/enable-table-validation.patch b/pkgs/by-name/fr/freetype/enable-table-validation.patch new file mode 100644 index 0000000..bd964c3 --- /dev/null +++ b/pkgs/by-name/fr/freetype/enable-table-validation.patch @@ -0,0 +1,20 @@ +Index: freetype-2.10.0/modules.cfg +=================================================================== +--- freetype-2.10.0.orig/modules.cfg ++++ freetype-2.10.0/modules.cfg +@@ -120,6 +120,6 @@ AUX_MODULES += cache + # TrueType GX/AAT table validation. Needs ftgxval.c below. + # +-# AUX_MODULES += gxvalid ++AUX_MODULES += gxvalid + + # Support for streams compressed with gzip (files with suffix .gz). + # +@@ -143,6 +143,6 @@ AUX_MODULES += bzip2 + # OpenType table validation. Needs ftotval.c below. + # +-# AUX_MODULES += otvalid ++AUX_MODULES += otvalid + + # Auxiliary PostScript driver component to share common code. + # diff --git a/pkgs/by-name/fu/fuse/common.nix b/pkgs/by-name/fu/fuse/common.nix new file mode 100644 index 0000000..f4b8bfc --- /dev/null +++ b/pkgs/by-name/fu/fuse/common.nix @@ -0,0 +1,108 @@ +{ version, hash }: + +{ lib, stdenv, fetchFromGitHub, fetchpatch +, fusePackages, util-linux, gettext, shadow +, meson, ninja, pkg-config +, autoreconfHook +, python3Packages, which +}: + +let + isFuse3 = lib.hasPrefix "3" version; +in stdenv.mkDerivation rec { + pname = "fuse"; + inherit version; + + src = fetchFromGitHub { + owner = "libfuse"; + repo = "libfuse"; + rev = "${pname}-${version}"; + inherit hash; + }; + + preAutoreconf = "touch config.rpath"; + + patches = + lib.optional + (!isFuse3 && (stdenv.isAarch64 || stdenv.hostPlatform.isLoongArch64)) + (fetchpatch { + url = "https://github.com/libfuse/libfuse/commit/914871b20a901e3e1e981c92bc42b1c93b7ab81b.patch"; + sha256 = "1w4j6f1awjrycycpvmlv0x5v9gprllh4dnbjxl4dyl2jgbkaw6pa"; + }) + ++ (if isFuse3 + then [ ./fuse3-install.patch ./fuse3-Do-not-set-FUSERMOUNT_DIR.patch ] + else [ + ./fuse2-Do-not-set-FUSERMOUNT_DIR.patch + (fetchpatch { + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/sys-fs/fuse/files/fuse-2.9.9-closefrom-glibc-2-34.patch?id=8a970396fca7aca2d5a761b8e7a8242f1eef14c9"; + sha256 = "sha256-ELYBW/wxRcSMssv7ejCObrpsJHtOPJcGq33B9yHQII4="; + }) + ]); + + nativeBuildInputs = if isFuse3 + then [ meson ninja pkg-config ] + else [ autoreconfHook gettext ]; + + outputs = [ "out" ] ++ lib.optional isFuse3 "common"; + + mesonFlags = lib.optionals isFuse3 [ + "-Dudevrulesdir=/udev/rules.d" + "-Duseroot=false" + "-Dinitscriptdir=" + ]; + + preConfigure = '' + export MOUNT_FUSE_PATH=$out/sbin + export INIT_D_PATH=$TMPDIR/etc/init.d + export UDEV_RULES_PATH=$out/etc/udev/rules.d + + # Ensure that FUSE calls the setuid wrapper, not + # $out/bin/fusermount. It falls back to calling fusermount in + # $PATH, so it should also work on non-NixOS systems. + export NIX_CFLAGS_COMPILE="-DFUSERMOUNT_DIR=\"/run/wrappers/bin\"" + + substituteInPlace lib/mount_util.c --replace "/bin/" "${util-linux}/bin/" + '' + (if isFuse3 then '' + # The configure phase will delete these files (temporary workaround for + # ./fuse3-install_man.patch) + install -D -m444 doc/fusermount3.1 $out/share/man/man1/fusermount3.1 + install -D -m444 doc/mount.fuse3.8 $out/share/man/man8/mount.fuse3.8 + '' else '' + substituteInPlace util/mount.fuse.c --replace '"su"' '"${shadow.su}/bin/su"' + sed -e 's@CONFIG_RPATH=/usr/share/gettext/config.rpath@CONFIG_RPATH=${gettext}/share/gettext/config.rpath@' -i makeconf.sh + ./makeconf.sh + ''); + + nativeCheckInputs = [ which ] ++ (with python3Packages; [ python pytest ]); + + checkPhase = '' + python3 -m pytest test/ + ''; + + doCheck = false; # v2: no tests, v3: all tests get skipped in a sandbox + + postFixup = "cd $out\n" + (if isFuse3 then '' + install -D -m444 etc/fuse.conf $common/etc/fuse.conf + install -D -m444 etc/udev/rules.d/99-fuse3.rules $common/etc/udev/rules.d/99-fuse.rules + '' else '' + cp ${fusePackages.fuse_3.common}/etc/fuse.conf etc/fuse.conf + cp ${fusePackages.fuse_3.common}/etc/udev/rules.d/99-fuse.rules etc/udev/rules.d/99-fuse.rules + ''); + + meta = with lib; { + description = "Library that allows filesystems to be implemented in user space"; + longDescription = '' + FUSE (Filesystem in Userspace) is an interface for userspace programs to + export a filesystem to the Linux kernel. The FUSE project consists of two + components: The fuse kernel module (maintained in the regular kernel + repositories) and the libfuse userspace library (this package). libfuse + provides the reference implementation for communicating with the FUSE + kernel module. + ''; + homepage = "https://github.com/libfuse/libfuse"; + changelog = "https://github.com/libfuse/libfuse/releases/tag/fuse-${version}"; + platforms = platforms.linux; + license = with licenses; [ gpl2Only lgpl21Only ]; + maintainers = [ maintainers.primeos ]; + }; +} diff --git a/pkgs/by-name/fu/fuse/default.nix b/pkgs/by-name/fu/fuse/default.nix new file mode 100644 index 0000000..f692c2f --- /dev/null +++ b/pkgs/by-name/fu/fuse/default.nix @@ -0,0 +1,17 @@ +{ callPackage, util-linux }: + +let + mkFuse = args: callPackage (import ./common.nix args) { + inherit util-linux; + }; +in { + fuse_2 = mkFuse { + version = "2.9.9"; + hash = "sha256-dgjM6M7xk5MHi9xPyCyvF0vq0KM8UCsEYBcMhkrdvfs="; + }; + + fuse_3 = mkFuse { + version = "3.16.2"; + hash = "sha256-QO9s+IkR0rkqIYNqt2IYST6AVBkCr56jcuuz5nKJuA4="; + }; +} diff --git a/pkgs/by-name/fu/fuse/fuse2-Do-not-set-FUSERMOUNT_DIR.patch b/pkgs/by-name/fu/fuse/fuse2-Do-not-set-FUSERMOUNT_DIR.patch new file mode 100644 index 0000000..8ff40f3 --- /dev/null +++ b/pkgs/by-name/fu/fuse/fuse2-Do-not-set-FUSERMOUNT_DIR.patch @@ -0,0 +1,11 @@ +--- a/lib/Makefile.am ++++ b/lib/Makefile.am +@@ -1,7 +1,7 @@ + ## Process this file with automake to produce Makefile.in + + AUTOMAKE_OPTIONS = subdir-objects +-AM_CPPFLAGS = -I$(top_srcdir)/include -DFUSERMOUNT_DIR=\"$(bindir)\" \ ++AM_CPPFLAGS = -I$(top_srcdir)/include \ + -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=26 + + lib_LTLIBRARIES = libfuse.la libulockmgr.la diff --git a/pkgs/by-name/fu/fuse/fuse3-Do-not-set-FUSERMOUNT_DIR.patch b/pkgs/by-name/fu/fuse/fuse3-Do-not-set-FUSERMOUNT_DIR.patch new file mode 100644 index 0000000..582d3eb --- /dev/null +++ b/pkgs/by-name/fu/fuse/fuse3-Do-not-set-FUSERMOUNT_DIR.patch @@ -0,0 +1,13 @@ +diff --git a/lib/meson.build b/lib/meson.build +--- a/lib/meson.build ++++ b/lib/meson.build +@@ -37,8 +37,7 @@ libfuse = library('fuse3', libfuse_sources, version: meson.project_version(), + soversion: '3', include_directories: include_dirs, + dependencies: deps, install: true, + link_depends: 'fuse_versionscript', +- c_args: [ '-DFUSE_USE_VERSION=312', +- '-DFUSERMOUNT_DIR="@0@"'.format(fusermount_path) ], ++ c_args: [ '-DFUSE_USE_VERSION=312' ], + link_args: ['-Wl,--version-script,' + meson.current_source_dir() + + '/fuse_versionscript' ]) + diff --git a/pkgs/by-name/fu/fuse/fuse3-install.patch b/pkgs/by-name/fu/fuse/fuse3-install.patch new file mode 100644 index 0000000..769e308 --- /dev/null +++ b/pkgs/by-name/fu/fuse/fuse3-install.patch @@ -0,0 +1,27 @@ +--- a/util/install_helper.sh 2023-08-26 22:12:11.028651669 +0200 ++++ b/util/install_helper.sh 2023-08-26 22:38:03.165058694 +0200 +@@ -39,12 +39,12 @@ + + if [ "${udevrulesdir}" != "" ]; then + install -D -m 644 "${MESON_SOURCE_ROOT}/util/udev.rules" \ +- "${DESTDIR}${udevrulesdir}/99-fuse3.rules" ++ "${sysconfdir}${udevrulesdir}/99-fuse3.rules" + fi + + if [ "$initscriptdir" != "" ]; then + install -D -m 755 "${MESON_SOURCE_ROOT}/util/init_script" \ +- "${DESTDIR}${initscriptdir}/fuse3" ++ "${sysconfdir}${initscriptdir}/fuse3" + + if test -x /usr/sbin/update-rc.d && test -z "${DESTDIR}"; then + /usr/sbin/update-rc.d fuse3 start 34 S . start 41 0 6 . || /bin/true +diff --git a/util/meson.build b/util/meson.build +index aa0e734..06d4378 100644 +--- a/util/meson.build ++++ b/util/meson.build +@@ -1,4 +1,4 @@ +-fuseconf_path = join_paths(get_option('prefix'), get_option('sysconfdir'), 'fuse.conf') ++fuseconf_path = join_paths('/', get_option('sysconfdir'), 'fuse.conf') + + executable('fusermount3', ['fusermount.c', '../lib/mount_util.c'], + include_directories: include_dirs, diff --git a/pkgs/by-name/fu/fuse/packages.nix b/pkgs/by-name/fu/fuse/packages.nix new file mode 100644 index 0000000..7f1604c --- /dev/null +++ b/pkgs/by-name/fu/fuse/packages.nix @@ -0,0 +1,13 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + fusePackages = dontRecurseIntoAttrs (callPackage ./. { + util-linux = util-linuxMinimal; + }); + fuse = fuse2; + fuse2 = lowPrio (if stdenv.isDarwin then macfuse-stubs else fusePackages.fuse_2); + fuse3 = fusePackages.fuse_3; + fuse-common = hiPrio fusePackages.fuse_3.common; +} diff --git a/pkgs/by-name/ga/gawk/default.nix b/pkgs/by-name/ga/gawk/default.nix new file mode 100644 index 0000000..d85880e --- /dev/null +++ b/pkgs/by-name/ga/gawk/default.nix @@ -0,0 +1,87 @@ +{ lib, stdenv, fetchurl +# TODO: links -lsigsegv but loses the reference for some reason +, withSigsegv ? (false && stdenv.hostPlatform.system != "x86_64-cygwin"), libsigsegv +, interactive ? false, readline +, autoreconfHook # no-pma fix + +/* Test suite broke on: + stdenv.isCygwin # XXX: `test-dup2' segfaults on Cygwin 6.1 + || stdenv.isDarwin # XXX: `locale' segfaults + || stdenv.isSunOS # XXX: `_backsmalls1' fails, locale stuff? + || stdenv.isFreeBSD +*/ +, doCheck ? (interactive && stdenv.isLinux), glibcLocales ? null +, locale ? null +}: + +assert (doCheck && stdenv.isLinux) -> glibcLocales != null; + +stdenv.mkDerivation rec { + pname = "gawk" + lib.optionalString interactive "-interactive"; + version = "5.2.2"; + + src = fetchurl { + url = "mirror://gnu/gawk/gawk-${version}.tar.xz"; + hash = "sha256-PB/OFEa0y+4c0nO9fsZLyH2J9hU3RxzT4F4zqWWiUOk="; + }; + + # PIE is incompatible with the "persistent malloc" ("pma") feature. + # While build system attempts to pass -no-pie to gcc. nixpkgs' `ld` + # wrapped still passes `-pie` flag to linker and breaks linkage. + # Let's disable "pie" until `ld` is fixed to do the right thing. + hardeningDisable = [ "pie" ]; + + # When we do build separate interactive version, it makes sense to always include man. + outputs = [ "out" "info" ] + ++ lib.optional (!interactive) "man"; + + # no-pma fix + nativeBuildInputs = [ autoreconfHook ] + ++ lib.optional (doCheck && stdenv.isLinux) glibcLocales; + + buildInputs = lib.optional withSigsegv libsigsegv + ++ lib.optional interactive readline + ++ lib.optional stdenv.isDarwin locale; + + configureFlags = [ + (if withSigsegv then "--with-libsigsegv-prefix=${libsigsegv}" else "--without-libsigsegv") + (if interactive then "--with-readline=${readline.dev}" else "--without-readline") + ]; + + makeFlags = [ + "AR=${stdenv.cc.targetPrefix}ar" + ]; + + inherit doCheck; + + postInstall = '' + rm "$out"/bin/gawk-* + ln -s gawk.1 "''${!outputMan}"/share/man/man1/awk.1 + ''; + + passthru = { + libsigsegv = if withSigsegv then libsigsegv else null; # for stdenv bootstrap + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/gawk/"; + description = "GNU implementation of the Awk programming language"; + longDescription = '' + Many computer users need to manipulate text files: extract and then + operate on data from parts of certain lines while discarding the rest, + make changes in various text files wherever certain patterns appear, + and so on. To write a program to do these things in a language such as + C or Pascal is a time-consuming inconvenience that may take many lines + of code. The job is easy with awk, especially the GNU implementation: + Gawk. + + The awk utility interprets a special-purpose programming language that + makes it possible to handle many data-reformatting jobs with just a few + lines of code. + ''; + license = licenses.gpl3Plus; + platforms = platforms.unix ++ platforms.windows; + maintainers = [ ]; + mainProgram = "gawk"; + }; +} diff --git a/pkgs/by-name/ga/gawk/fix-typos-corrected-in-libharu-2.4.4.patch b/pkgs/by-name/ga/gawk/fix-typos-corrected-in-libharu-2.4.4.patch new file mode 100644 index 0000000..6b4a416 --- /dev/null +++ b/pkgs/by-name/ga/gawk/fix-typos-corrected-in-libharu-2.4.4.patch @@ -0,0 +1,62 @@ +diff --git a/haru/pdf.c b/haru/pdf.c +index d16f573..3129427 100644 +--- a/haru/pdf.c ++++ b/haru/pdf.c +@@ -105,7 +105,7 @@ static awk_scalar_t HPDF_CS_PATTERN_node; + /* LineCap */ + static awk_scalar_t HPDF_BUTT_END_node; + static awk_scalar_t HPDF_ROUND_END_node; +-static awk_scalar_t HPDF_PROJECTING_SCUARE_END_node; ++static awk_scalar_t HPDF_PROJECTING_SQUARE_END_node; + + /* _LineJoin */ + static awk_scalar_t HPDF_MITER_JOIN_node; +@@ -248,7 +248,7 @@ static awk_scalar_t HPDF_ENCODER_UNKNOWN_node; + /* ByteType */ + static awk_scalar_t HPDF_BYTE_TYPE_SINGLE_node; + static awk_scalar_t HPDF_BYTE_TYPE_LEAD_node; +-static awk_scalar_t HPDF_BYTE_TYPE_TRIAL_node; ++static awk_scalar_t HPDF_BYTE_TYPE_TRAIL_node; + static awk_scalar_t HPDF_BYTE_TYPE_UNKNOWN_node; + + /* TextAlignment */ +@@ -308,7 +308,7 @@ static const struct varinit varinit[] = { + ENTRY(HPDF_CS_PATTERN, 1) + ENTRY(HPDF_BUTT_END, 1) + ENTRY(HPDF_ROUND_END, 1) +- ENTRY(HPDF_PROJECTING_SCUARE_END, 1) ++ ENTRY(HPDF_PROJECTING_SQUARE_END, 1) + ENTRY(HPDF_MITER_JOIN, 1) + ENTRY(HPDF_ROUND_JOIN, 1) + ENTRY(HPDF_BEVEL_JOIN, 1) +@@ -417,7 +417,7 @@ static const struct varinit varinit[] = { + ENTRY(HPDF_ENCODER_UNKNOWN, 1) + ENTRY(HPDF_BYTE_TYPE_SINGLE, 1) + ENTRY(HPDF_BYTE_TYPE_LEAD, 1) +- ENTRY(HPDF_BYTE_TYPE_TRIAL, 1) ++ ENTRY(HPDF_BYTE_TYPE_TRAIL, 1) + ENTRY(HPDF_BYTE_TYPE_UNKNOWN, 1) + ENTRY(HPDF_TALIGN_LEFT, 1) + ENTRY(HPDF_TALIGN_RIGHT, 1) +diff --git a/haru/pdf.h b/haru/pdf.h +index a4ef39a..07cf168 100644 +--- a/haru/pdf.h ++++ b/haru/pdf.h +@@ -86,7 +86,7 @@ + + #define DEFAULT_HPDF_BUTT_END HPDF_BUTT_END + #define DEFAULT_HPDF_ROUND_END HPDF_ROUND_END +-#define DEFAULT_HPDF_PROJECTING_SCUARE_END HPDF_PROJECTING_SCUARE_END ++#define DEFAULT_HPDF_PROJECTING_SQUARE_END HPDF_PROJECTING_SQUARE_END + + /* _LineJoin */ + #define DEFAULT_HPDF_MITER_JOIN HPDF_MITER_JOIN +@@ -229,7 +229,7 @@ + /* ByteType */ + #define DEFAULT_HPDF_BYTE_TYPE_SINGLE HPDF_BYTE_TYPE_SINGLE + #define DEFAULT_HPDF_BYTE_TYPE_LEAD HPDF_BYTE_TYPE_LEAD +-#define DEFAULT_HPDF_BYTE_TYPE_TRIAL HPDF_BYTE_TYPE_TRIAL ++#define DEFAULT_HPDF_BYTE_TYPE_TRAIL HPDF_BYTE_TYPE_TRAIL + #define DEFAULT_HPDF_BYTE_TYPE_UNKNOWN HPDF_BYTE_TYPE_UNKNOWN + + /* TextAlignment */ diff --git a/pkgs/by-name/ga/gawk/gawk-with-extensions.nix b/pkgs/by-name/ga/gawk/gawk-with-extensions.nix new file mode 100644 index 0000000..1b82d79 --- /dev/null +++ b/pkgs/by-name/ga/gawk/gawk-with-extensions.nix @@ -0,0 +1,13 @@ +{ runCommand, gawk, extensions, makeWrapper }: + +runCommand "gawk-with-extensions" { + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ gawk ] ++ extensions; +} '' + mkdir -p $out/bin + for i in ${gawk}/bin/*; do + name="$(basename "$i")" + makeWrapper $i $out/bin/$name \ + --prefix AWKLIBPATH : "${gawk}/lib/gawk:''${AWKLIBPATH:-}" + done +'' diff --git a/pkgs/by-name/ga/gawk/gawkextlib.nix b/pkgs/by-name/ga/gawk/gawkextlib.nix new file mode 100644 index 0000000..86bf2be --- /dev/null +++ b/pkgs/by-name/ga/gawk/gawkextlib.nix @@ -0,0 +1,157 @@ +{ lib, stdenv, recurseIntoAttrs, fetchgit, pkg-config, autoreconfHook +, autoconf, automake, libiconv, libtool, texinfo, gettext, gawk, rapidjson, gd +, libharu, lmdb, gmp, glibcLocales, mpfr, more, postgresql, hiredis +, expat, tre }: + +let + buildExtension = lib.makeOverridable + ({ name, gawkextlib, extraBuildInputs ? [ ], doCheck ? true, patches ? [ ] }: + let is_extension = gawkextlib != null; + in stdenv.mkDerivation rec { + pname = "gawkextlib-${name}"; + version = "unstable-2022-10-20"; + + src = fetchgit { + url = "git://git.code.sf.net/p/gawkextlib/code"; + rev = "f6c75b4ac1e0cd8d70c2f6c7a8d58b4d94cfde97"; + sha256 = "sha256-0p3CrQ3TBl7UcveZytK/9rkAzn69RRM2GwY2eCeqlkg="; + }; + + inherit patches; + + postPatch = '' + cd ${name} + ''; + + nativeBuildInputs = [ + autoconf + automake + libtool + autoreconfHook + pkg-config + texinfo + gettext + ]; + + buildInputs = [ gawk ] ++ extraBuildInputs; + propagatedBuildInputs = lib.optional is_extension gawkextlib; + + setupHook = if is_extension then ./setup-hook.sh else null; + inherit gawk; + + inherit doCheck; + nativeCheckInputs = [ more ]; + + meta = with lib; { + homepage = "https://sourceforge.net/projects/gawkextlib/"; + description = "Dynamically loaded extension libraries for GNU AWK"; + mainProgram = "xmlgawk"; + longDescription = '' + The gawkextlib project provides several extension libraries for + gawk (GNU AWK), as well as libgawkextlib containing some APIs that + are useful for building gawk extension libraries. These libraries + enable gawk to process XML data, interact with a PostgreSQL + database, use the GD graphics library, and perform unlimited + precision MPFR calculations. + ''; + license = licenses.gpl3Plus; + platforms = platforms.unix; + maintainers = with maintainers; [ tomberek ]; + }; + }); + gawkextlib = buildExtension { + gawkextlib = null; + name = "lib"; + }; + libs = { + abort = buildExtension { + inherit gawkextlib; + name = "abort"; + }; + aregex = buildExtension { + inherit gawkextlib; + name = "aregex"; + extraBuildInputs = [ tre ]; + }; + csv = buildExtension { + inherit gawkextlib; + name = "csv"; + }; + errno = buildExtension { + inherit gawkextlib; + name = "errno"; + }; + gd = buildExtension { + inherit gawkextlib; + name = "gd"; + extraBuildInputs = [ gd ]; + }; + haru = buildExtension { + inherit gawkextlib; + name = "haru"; + extraBuildInputs = [ libharu ]; + patches = [ + # Renames references to two identifiers with typos that libharu fixed in 2.4.4 + # https://github.com/libharu/libharu/commit/88271b73c68c521a49a15e3555ef00395aa40810 + ./fix-typos-corrected-in-libharu-2.4.4.patch + ]; + }; + json = buildExtension { + inherit gawkextlib; + name = "json"; + extraBuildInputs = [ rapidjson ]; + }; + lmdb = buildExtension { + inherit gawkextlib; + name = "lmdb"; + extraBuildInputs = [ lmdb ]; + # mdb_env_open(env, /dev/null) + #! No such device + # mdb_env_open(env, /dev/null) + #! Operation not supported by device + doCheck = !stdenv.isDarwin; + }; + mbs = buildExtension { + inherit gawkextlib; + name = "mbs"; + extraBuildInputs = [ glibcLocales ]; + #! "spät": length: 5, mbs_length: 6, wcswidth: 4 + doCheck = !stdenv.isDarwin; + }; + mpfr = buildExtension { + inherit gawkextlib; + name = "mpfr"; + extraBuildInputs = [ gmp mpfr ]; + }; + nl_langinfo = buildExtension { + inherit gawkextlib; + name = "nl_langinfo"; + }; + pgsql = buildExtension { + inherit gawkextlib; + name = "pgsql"; + extraBuildInputs = [ postgresql ]; + }; + redis = buildExtension { + inherit gawkextlib; + name = "redis"; + extraBuildInputs = [ hiredis ]; + }; + select = buildExtension { + inherit gawkextlib; + name = "select"; + }; + timex = buildExtension { + inherit gawkextlib; + name = "timex"; + }; + xml = buildExtension { + inherit gawkextlib; + name = "xml"; + extraBuildInputs = [ expat libiconv ]; + }; + }; +in recurseIntoAttrs (libs // { + inherit gawkextlib buildExtension; + full = builtins.attrValues libs; +}) diff --git a/pkgs/by-name/ga/gawk/packages.nix b/pkgs/by-name/ga/gawk/packages.nix new file mode 100644 index 0000000..635e621 --- /dev/null +++ b/pkgs/by-name/ga/gawk/packages.nix @@ -0,0 +1,16 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gawk = callPackage ./. { + inherit (darwin) locale; + }; + + gawk-with-extensions = callPackage ./gawk-with-extensions.nix { + extensions = gawkextlib.full; + }; + gawkextlib = callPackage ./gawkextlib.nix { }; + + gawkInteractive = gawk.override { interactive = true; }; +} diff --git a/pkgs/by-name/ga/gawk/setup-hook.sh b/pkgs/by-name/ga/gawk/setup-hook.sh new file mode 100644 index 0000000..d568cb8 --- /dev/null +++ b/pkgs/by-name/ga/gawk/setup-hook.sh @@ -0,0 +1,6 @@ +local oldOpts="-u" +shopt -qo nounset || oldOpts="+u" +set +u +. @gawk@/etc/profile.d/gawk.sh +gawklibpath_append @out@/lib/gawk +set "$oldOpts" diff --git a/pkgs/by-name/gc/gcc/all.nix b/pkgs/by-name/gc/gcc/all.nix new file mode 100644 index 0000000..70b4b75 --- /dev/null +++ b/pkgs/by-name/gc/gcc/all.nix @@ -0,0 +1,50 @@ +{ lib +, stdenv +, gccStdenv +, gcc7Stdenv +, callPackage +, isl_0_11, isl_0_14, isl_0_17, isl_0_20 +, libcCross +, threadsCrossFor +, noSysDirs +, texinfo5 +, cloog_0_18_0, cloog +, lowPrio +, wrapCC +}@args: + +let + versions = import ./versions.nix; + gccForMajorMinorVersion = majorMinorVersion: + let + atLeast = lib.versionAtLeast majorMinorVersion; + attrName = "gcc${lib.replaceStrings ["."] [""] majorMinorVersion}"; + pkg = lowPrio (wrapCC (callPackage ./default.nix ({ + inherit noSysDirs; + inherit majorMinorVersion; + reproducibleBuild = true; + profiledCompiler = false; + libcCross = if stdenv.targetPlatform != stdenv.buildPlatform then args.libcCross else null; + threadsCross = if stdenv.targetPlatform != stdenv.buildPlatform then threadsCrossFor majorMinorVersion else { }; + isl = if stdenv.isDarwin then null + else if atLeast "9" then isl_0_20 + else if atLeast "7" then isl_0_17 + else if atLeast "6" then (if stdenv.targetPlatform.isRedox then isl_0_17 else isl_0_14) + else if atLeast "4.9" then isl_0_11 + else /* "4.8" */ isl_0_14; + } // lib.optionalAttrs (majorMinorVersion == "4.8") { + texinfo = texinfo5; # doesn't validate since 6.1 -> 6.3 bump + } // lib.optionalAttrs (!(atLeast "6")) { + cloog = if stdenv.isDarwin + then null + else if atLeast "4.9" then cloog_0_18_0 + else /* 4.8 */ cloog; + } // lib.optionalAttrs (atLeast "6" && !(atLeast "9")) { + # gcc 10 is too strict to cross compile gcc <= 8 + stdenv = if (stdenv.targetPlatform != stdenv.buildPlatform) && stdenv.cc.isGNU then gcc7Stdenv else stdenv; + }))); + in + lib.nameValuePair attrName pkg; +in +lib.listToAttrs (map gccForMajorMinorVersion versions.allMajorVersions) + diff --git a/pkgs/by-name/gc/gcc/common/builder.nix b/pkgs/by-name/gc/gcc/common/builder.nix new file mode 100644 index 0000000..25c5646 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/builder.nix @@ -0,0 +1,295 @@ +{ lib +, stdenv +, enableMultilib +, targetConfig +}: + +let + forceLibgccToBuildCrtStuff = + import ./libgcc-buildstuff.nix { inherit lib stdenv; }; +in + +originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { + passthru = (originalAttrs.passthru or {}) // { inherit forceLibgccToBuildCrtStuff; }; + preUnpack = '' + oldOpts="$(shopt -po nounset)" || true + set -euo pipefail + + export NIX_FIXINC_DUMMY="$NIX_BUILD_TOP/dummy" + mkdir "$NIX_FIXINC_DUMMY" + + if test "$staticCompiler" = "1"; then + EXTRA_LDFLAGS="-static" + else + EXTRA_LDFLAGS="-Wl,-rpath,''${!outputLib}/lib" + fi + + # GCC interprets empty paths as ".", which we don't want. + if test -z "''${CPATH-}"; then unset CPATH; fi + if test -z "''${LIBRARY_PATH-}"; then unset LIBRARY_PATH; fi + echo "\$CPATH is \`''${CPATH-}'" + echo "\$LIBRARY_PATH is \`''${LIBRARY_PATH-}'" + + if test "$noSysDirs" = "1"; then + + declare -g \ + EXTRA_FLAGS_FOR_BUILD EXTRA_FLAGS EXTRA_FLAGS_FOR_TARGET \ + EXTRA_LDFLAGS_FOR_BUILD EXTRA_LDFLAGS_FOR_TARGET + + # Extract flags from Bintools Wrappers + for post in '_FOR_BUILD' ""; do + curBintools="NIX_BINTOOLS''${post}" + + declare -a extraLDFlags=() + if [[ -e "''${!curBintools}/nix-support/orig-libc" ]]; then + # Figure out what extra flags when linking to pass to the gcc + # compilers being generated to make sure that they use our libc. + extraLDFlags=($(< "''${!curBintools}/nix-support/libc-ldflags") $(< "''${!curBintools}/nix-support/libc-ldflags-before" || true)) + if [ -e ''${!curBintools}/nix-support/ld-set-dynamic-linker ]; then + extraLDFlags=-dynamic-linker=$(< ''${!curBintools}/nix-support/dynamic-linker) + fi + + # The path to the Libc binaries such as `crti.o'. + libc_libdir="$(< "''${!curBintools}/nix-support/orig-libc")/lib" + else + # Hack: support impure environments. + extraLDFlags=("-L/usr/lib64" "-L/usr/lib") + libc_libdir="/usr/lib" + fi + extraLDFlags=("-L$libc_libdir" "-rpath" "$libc_libdir" + "''${extraLDFlags[@]}") + for i in "''${extraLDFlags[@]}"; do + declare -g EXTRA_LDFLAGS''${post}+=" -Wl,$i" + done + done + + # Extract flags from CC Wrappers + for post in '_FOR_BUILD' ""; do + curCC="NIX_CC''${post}" + curFIXINC="NIX_FIXINC_DUMMY''${post}" + + declare -a extraFlags=() + if [[ -e "''${!curCC}/nix-support/orig-libc" ]]; then + # Figure out what extra compiling flags to pass to the gcc compilers + # being generated to make sure that they use our libc. + extraFlags=($(< "''${!curCC}/nix-support/libc-crt1-cflags") $(< "''${!curCC}/nix-support/libc-cflags")) + + # The path to the Libc headers + libc_devdir="$(< "''${!curCC}/nix-support/orig-libc-dev")" + + # Use *real* header files, otherwise a limits.h is generated that + # does not include Libc's limits.h (notably missing SSIZE_MAX, + # which breaks the build). + declare -g NIX_FIXINC_DUMMY''${post}="$libc_devdir/include" + else + # Hack: support impure environments. + extraFlags=("-isystem" "/usr/include") + declare -g NIX_FIXINC_DUMMY''${post}=/usr/include + fi + + extraFlags=("-I''${!curFIXINC}" "''${extraFlags[@]}") + + # BOOT_CFLAGS defaults to `-g -O2'; since we override it below, make + # sure to explictly add them so that files compiled with the bootstrap + # compiler are optimized and (optionally) contain debugging information + # (info "(gccinstall) Building"). + if test -n "''${dontStrip-}"; then + extraFlags=("-O2" "-g" "''${extraFlags[@]}") + else + # Don't pass `-g' at all; this saves space while building. + extraFlags=("-O2" "''${extraFlags[@]}") + fi + + declare -g EXTRA_FLAGS''${post}="''${extraFlags[*]}" + done + + if test -z "''${targetConfig-}"; then + # host = target, so the flags are the same + EXTRA_FLAGS_FOR_TARGET="$EXTRA_FLAGS" + EXTRA_LDFLAGS_FOR_TARGET="$EXTRA_LDFLAGS" + fi + + # CFLAGS_FOR_TARGET are needed for the libstdc++ configure script to find + # the startfiles. + # FLAGS_FOR_TARGET are needed for the target libraries to receive the -Bxxx + # for the startfiles. + makeFlagsArray+=( + "BUILD_SYSTEM_HEADER_DIR=$NIX_FIXINC_DUMMY_FOR_BUILD" + "SYSTEM_HEADER_DIR=$NIX_FIXINC_DUMMY_FOR_BUILD" + "NATIVE_SYSTEM_HEADER_DIR=$NIX_FIXINC_DUMMY" + + "LDFLAGS_FOR_BUILD=$EXTRA_LDFLAGS_FOR_BUILD" + #"LDFLAGS=$EXTRA_LDFLAGS" + "LDFLAGS_FOR_TARGET=$EXTRA_LDFLAGS_FOR_TARGET" + + "CFLAGS_FOR_BUILD=$EXTRA_FLAGS_FOR_BUILD $EXTRA_LDFLAGS_FOR_BUILD" + "CXXFLAGS_FOR_BUILD=$EXTRA_FLAGS_FOR_BUILD $EXTRA_LDFLAGS_FOR_BUILD" + "FLAGS_FOR_BUILD=$EXTRA_FLAGS_FOR_BUILD $EXTRA_LDFLAGS_FOR_BUILD" + + # It seems there is a bug in GCC 5 + #"CFLAGS=$EXTRA_FLAGS $EXTRA_LDFLAGS" + #"CXXFLAGS=$EXTRA_FLAGS $EXTRA_LDFLAGS" + + "CFLAGS_FOR_TARGET=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" + "CXXFLAGS_FOR_TARGET=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" + "FLAGS_FOR_TARGET=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" + ) + + if test -z "''${targetConfig-}"; then + makeFlagsArray+=( + "BOOT_CFLAGS=$EXTRA_FLAGS $EXTRA_LDFLAGS" + "BOOT_LDFLAGS=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" + ) + fi + + if test "$withoutTargetLibc" == 1; then + # We don't want the gcc build to assume there will be a libc providing + # limits.h in this stage + makeFlagsArray+=( + 'LIMITS_H_TEST=false' + ) + else + makeFlagsArray+=( + 'LIMITS_H_TEST=true' + ) + fi + fi + + eval "$oldOpts" + ''; + + preConfigure = (originalAttrs.preConfigure or "") + '' + if test -n "$newlibSrc"; then + tar xvf "$newlibSrc" -C .. + ln -s ../newlib-*/newlib newlib + # Patch to get armvt5el working: + sed -i -e 's/ arm)/ arm*)/' newlib/configure.host + fi + + # Bug - they packaged zlib + if test -d "zlib"; then + # This breaks the build without-headers, which should build only + # the target libgcc as target libraries. + # See 'configure:5370' + rm -Rf zlib + fi + + if test -n "$crossMingw" -a -n "$withoutTargetLibc"; then + mkdir -p ../mingw + # --with-build-sysroot expects that: + cp -R $libcCross/include ../mingw + configureFlags="$configureFlags --with-build-sysroot=`pwd`/.." + fi + + # Perform the build in a different directory. + mkdir ../build + cd ../build + configureScript=../$sourceRoot/configure + ''; + + postConfigure = '' + # Avoid store paths when embedding ./configure flags into gcc. + # Mangled arguments are still useful when reporting bugs upstream. + sed -e "/TOPLEVEL_CONFIGURE_ARGUMENTS=/ s|$NIX_STORE/[a-z0-9]\{32\}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" -i Makefile + ''; + + preInstall = '' + mkdir -p "$out/''${targetConfig}/lib" + mkdir -p "''${!outputLib}/''${targetConfig}/lib" + '' + + # if cross-compiling, link from $lib/lib to $lib/${targetConfig}. + # since native-compiles have $lib/lib as a directory (not a + # symlink), this ensures that in every case we can assume that + # $lib/lib contains the .so files + lib.optionalString (with stdenv; targetPlatform.config != hostPlatform.config) '' + ln -Ts "''${!outputLib}/''${targetConfig}/lib" $lib/lib + '' + + # Make `lib64` symlinks to `lib`. + lib.optionalString (!enableMultilib && stdenv.hostPlatform.is64bit && !stdenv.hostPlatform.isMips64n32) '' + ln -s lib "$out/''${targetConfig}/lib64" + ln -s lib "''${!outputLib}/''${targetConfig}/lib64" + '' + + # On mips platforms, gcc follows the IRIX naming convention: + # + # $PREFIX/lib = mips32 + # $PREFIX/lib32 = mips64n32 + # $PREFIX/lib64 = mips64 + # + # Make `lib32` symlinks to `lib`. + lib.optionalString (!enableMultilib && stdenv.targetPlatform.isMips64n32) '' + ln -s lib "$out/''${targetConfig}/lib32" + ln -s lib "''${!outputLib}/''${targetConfig}/lib32" + ''; + + postInstall = '' + # Move runtime libraries to lib output. + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.so*" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.la" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.dylib" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.dll.a" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.dll" "''${!outputLib}" + moveToOutput "share/gcc-*/python" "''${!outputLib}" + + if [ -z "$enableShared" ]; then + moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.a" "''${!outputLib}" + fi + + for i in "''${!outputLib}/''${targetConfig}"/lib/*.{la,py}; do + substituteInPlace "$i" --replace "$out" "''${!outputLib}" + done + + if [ -n "$enableMultilib" ]; then + moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.so*" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.la" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.dylib" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.dll.a" "''${!outputLib}" + moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.dll" "''${!outputLib}" + + for i in "''${!outputLib}/''${targetConfig}"/lib64/*.{la,py}; do + substituteInPlace "$i" --replace "$out" "''${!outputLib}" + done + fi + + # Remove `fixincl' to prevent a retained dependency on the + # previous gcc. + rm -rf $out/libexec/gcc/*/*/install-tools + rm -rf $out/lib/gcc/*/*/install-tools + + # More dependencies with the previous gcc or some libs (gccbug stores the build command line) + rm -rf $out/bin/gccbug + + if type "install_name_tool"; then + for i in "''${!outputLib}"/lib/*.*.dylib "''${!outputLib}"/lib/*.so.[0-9]; do + install_name_tool -id "$i" "$i" || true + for old_path in $(otool -L "$i" | grep "$out" | awk '{print $1}'); do + new_path=`echo "$old_path" | sed "s,$out,''${!outputLib},"` + install_name_tool -change "$old_path" "$new_path" "$i" || true + done + done + fi + + # Get rid of some "fixed" header files + rm -rfv $out/lib/gcc/*/*/include-fixed/{root,linux,sys/mount.h,bits/statx.h} + + # Replace hard links for i686-pc-linux-gnu-gcc etc. with symlinks. + for i in $out/bin/*-gcc*; do + if cmp -s $out/bin/gcc $i; then + ln -sfn gcc $i + fi + done + + for i in $out/bin/c++ $out/bin/*-c++* $out/bin/*-g++*; do + if cmp -s $out/bin/g++ $i; then + ln -sfn g++ $i + fi + done + + # Two identical man pages are shipped (moving and compressing is done later) + for i in "$out"/share/man/man1/*g++.1; do + if test -e "$i"; then + man_prefix=`echo "$i" | sed "s,.*/\(.*\)g++.1,\1,"` + ln -sf "$man_prefix"gcc.1 "$i" + fi + done + ''; +})) diff --git a/pkgs/by-name/gc/gcc/common/checksum.nix b/pkgs/by-name/gc/gcc/common/checksum.nix new file mode 100644 index 0000000..7a20ed1 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/checksum.nix @@ -0,0 +1,40 @@ +{ lib +, stdenv +, nukeReferences +, langC +, langCC +, runtimeShell +}: + +let + enableChecksum = (with stdenv; buildPlatform == hostPlatform && hostPlatform == targetPlatform) && langC && langCC && !stdenv.hostPlatform.isDarwin; +in +(pkg: pkg.overrideAttrs (previousAttrs: lib.optionalAttrs enableChecksum { + outputs = previousAttrs.outputs ++ lib.optionals enableChecksum [ "checksum" ]; + # This is a separate phase because gcc assembles its phase scripts + # in bash instead of nix (we should fix that). + preFixupPhases = (previousAttrs.preFixupPhases or []) ++ [ "postInstallSaveChecksumPhase" ]; + # + # gcc uses an auxiliary utility `genchecksum` to md5-hash (most of) its + # `.o` and `.a` files prior to linking (in case the linker is + # nondeterministic). Since we want to compare across gccs built from two + # separate derivations, we wrap `genchecksum` with a `nuke-references` + # call. We also stash copies of the inputs to `genchecksum` in + # `$checksum/inputs/` -- this is extremely helpful for debugging since + # it's hard to get Nix to not delete the $NIX_BUILD_TOP of a successful + # build. + # + postInstallSaveChecksumPhase = '' + mv gcc/build/genchecksum gcc/build/.genchecksum-wrapped + cat > gcc/build/genchecksum <<\EOF + #!${runtimeShell} + ${nukeReferences}/bin/nuke-refs $@ + for INPUT in "$@"; do install -Dt $INPUT $checksum/inputs/; done + exec build/.genchecksum-wrapped $@ + EOF + chmod +x gcc/build/genchecksum + rm gcc/*-checksum.* + make -C gcc cc1-checksum.o cc1plus-checksum.o + install -Dt $checksum/checksums/ gcc/cc*-checksum.o + ''; +})) diff --git a/pkgs/by-name/gc/gcc/common/configure-flags.nix b/pkgs/by-name/gc/gcc/common/configure-flags.nix new file mode 100644 index 0000000..b8dccf9 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/configure-flags.nix @@ -0,0 +1,261 @@ +{ lib, stdenv +, targetPackages + +, withoutTargetLibc, libcCross +, threadsCross +, version + +, binutils, gmp, mpfr, libmpc, isl +, cloog ? null + +, enableLTO +, enableMultilib +, enablePlugin +, disableGdbPlugin ? !enablePlugin +, enableShared + +, langC +, langCC +, langD ? false +, langFortran +, langJava ? false, javaAwtGtk ? false, javaAntlr ? null, javaEcj ? null +, langAda ? false +, langGo +, langObjC +, langObjCpp +, langJit +, disableBootstrap ? stdenv.targetPlatform != stdenv.hostPlatform +}: + +assert !enablePlugin -> disableGdbPlugin; +assert langJava -> lib.versionOlder version "7"; + +# Note [Windows Exception Handling] +# sjlj (short jump long jump) exception handling makes no sense on x86_64, +# it's forcably slowing programs down as it produces a constant overhead. +# On x86_64 we have SEH (Structured Exception Handling) and we should use +# that. On i686, we do not have SEH, and have to use sjlj with dwarf2. +# Hence it's now conditional on x86_32 (i686 is 32bit). +# +# ref: https://stackoverflow.com/questions/15670169/what-is-difference-between-sjlj-vs-dwarf-vs-seh + + +let + inherit (stdenv) + buildPlatform hostPlatform targetPlatform; + + # See https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903 + disableBootstrap' = disableBootstrap && !langFortran && !langGo; + + crossMingw = targetPlatform != hostPlatform && targetPlatform.isMinGW; + crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; + + targetPrefix = lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) + "${stdenv.targetPlatform.config}-"; + + crossConfigureFlags = + # Ensure that -print-prog-name is able to find the correct programs. + [ + "--with-as=${if targetPackages.stdenv.cc.bintools.isLLVM then binutils else targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + ] + ++ (if withoutTargetLibc then [ + "--disable-libssp" + "--disable-nls" + "--without-headers" + "--disable-threads" + "--disable-libgomp" + "--disable-libquadmath" + (lib.enableFeature enableShared "shared") + "--disable-libatomic" # requires libc + "--disable-decimal-float" # requires libc + "--disable-libmpx" # requires libc + ] ++ lib.optionals crossMingw [ + "--with-headers=${lib.getDev libcCross}/include" + "--with-gcc" + "--with-gnu-as" + "--with-gnu-ld" + "--disable-debug" + "--disable-win32-registry" + "--enable-hash-synchronization" + "--enable-libssp" + "--disable-nls" + # To keep ABI compatibility with upstream mingw-w64 + "--enable-fully-dynamic-string" + ] ++ lib.optionals (crossMingw && targetPlatform.isx86_32) [ + # See Note [Windows Exception Handling] + "--enable-sjlj-exceptions" + "--with-dwarf2" + ] else [ + (if crossDarwin then "--with-sysroot=${lib.getLib libcCross}/share/sysroot" + else "--with-headers=${lib.getDev libcCross}${libcCross.incdir or "/include"}") + "--enable-__cxa_atexit" + "--enable-long-long" + "--enable-threads=${if targetPlatform.isUnix then "posix" + else if targetPlatform.isWindows then (threadsCross.model or "win32") + else "single"}" + "--enable-nls" + ] ++ lib.optionals (targetPlatform.libc == "uclibc" || targetPlatform.libc == "musl") [ + # libsanitizer requires netrom/netrom.h which is not + # available in uclibc. + "--disable-libsanitizer" + ] ++ lib.optional (targetPlatform.libc == "newlib" || targetPlatform.libc == "newlib-nano") "--with-newlib" + ++ lib.optional (targetPlatform.libc == "avrlibc") "--with-avrlibc" + ); + + configureFlags = + # Basic dependencies + [ + "--with-gmp-include=${gmp.dev}/include" + "--with-gmp-lib=${gmp.out}/lib" + "--with-mpfr-include=${mpfr.dev}/include" + "--with-mpfr-lib=${mpfr.out}/lib" + "--with-mpc=${libmpc}" + ] + ++ lib.optionals (!withoutTargetLibc) [ + (if libcCross == null + then "--with-native-system-header-dir=${lib.getDev stdenv.cc.libc}/include" + else "--with-native-system-header-dir=${lib.getDev libcCross}${libcCross.incdir or "/include"}") + # gcc builds for cross-compilers (build != host) or cross-built + # gcc (host != target) always apply the offset prefix to disentangle + # target headers from build or host headers: + # ${with_build_sysroot}${native_system_header_dir} + # or ${test_exec_prefix}/${target_noncanonical}/sys-include + # or ${with_sysroot}${native_system_header_dir} + # While native build (build == host == target) uses passed headers + # path as is: + # ${with_build_sysroot}${native_system_header_dir} + # + # Nixpkgs uses flat directory structure for both native and cross + # cases. As a result libc headers don't get found for cross case + # and many modern features get disabled (libssp is used instead of + # target-specific implementations and similar). More details at: + # https://github.com/NixOS/nixpkgs/pull/181802#issuecomment-1186822355 + # + # We pick "/" path to effectively avoid sysroot offset and make it work + # as a native case. + "--with-build-sysroot=/" + # Same with the stdlibc++ headers embedded in the gcc output + "--with-gxx-include-dir=${placeholder "out"}/include/c++/${version}/" + ] + + # Basic configuration + ++ [ + # Force target prefix. The behavior if `--target` and `--host` + # are specified is inconsistent: Sometimes specifying `--target` + # always causes a prefix to be generated, sometimes it's only + # added if the `--host` and `--target` differ. This means that + # sometimes there may be a prefix even though nixpkgs doesn't + # expect one and sometimes there may be none even though nixpkgs + # expects one (since not all information is serialized into the + # config attribute). The easiest way out of these problems is to + # always set the program prefix, so gcc will conform to our + # expectations. + "--program-prefix=${targetPrefix}" + + (lib.enableFeature enableLTO "lto") + "--disable-libstdcxx-pch" + "--without-included-gettext" + "--with-system-zlib" + "--enable-static" + "--enable-languages=${ + lib.concatStringsSep "," + ( lib.optional langC "c" + ++ lib.optional langCC "c++" + ++ lib.optional langD "d" + ++ lib.optional langFortran "fortran" + ++ lib.optional langJava "java" + ++ lib.optional langAda "ada" + ++ lib.optional langGo "go" + ++ lib.optional langObjC "objc" + ++ lib.optional langObjCpp "obj-c++" + ++ lib.optionals crossDarwin [ "objc" "obj-c++" ] + ++ lib.optional langJit "jit" + ) + }" + ] + + ++ (if (enableMultilib || targetPlatform.isAvr) + then ["--enable-multilib" "--disable-libquadmath"] + else ["--disable-multilib"]) + ++ lib.optional (!enableShared) "--disable-shared" + ++ lib.singleton (lib.enableFeature enablePlugin "plugin") + # Libcc1 is the GCC cc1 plugin for the GDB debugger which is only used by gdb + ++ lib.optional disableGdbPlugin "--disable-libcc1" + + # Support -m32 on powerpc64le/be + ++ lib.optional (targetPlatform.system == "powerpc64le-linux") + "--enable-targets=powerpcle-linux" + ++ lib.optional (targetPlatform.system == "powerpc64-linux") + "--enable-targets=powerpc-linux" + + # Fix "unknown long double size, cannot define BFP_FMT" + ++ lib.optional (targetPlatform.isPower && targetPlatform.isMusl) + "--disable-decimal-float" + + # Optional features + ++ lib.optional (isl != null) "--with-isl=${isl}" + ++ lib.optionals (lib.versionOlder version "5" && cloog != null) [ + "--with-cloog=${cloog}" + "--disable-cloog-version-check" + "--enable-cloog-backend=isl" + ] + + # Ada options, gcc can't build the runtime library for a cross compiler + ++ lib.optional langAda + (if hostPlatform == targetPlatform + then "--enable-libada" + else "--disable-libada") + + # Java options + ++ lib.optionals langJava [ + "--with-ecj-jar=${javaEcj}" + + # Follow Sun's layout for the convenience of IcedTea/OpenJDK. See + # . + "--enable-java-home" + "--with-java-home=\${prefix}/lib/jvm/jre" + ] + ++ lib.optional javaAwtGtk "--enable-java-awt=gtk" + ++ lib.optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" + + ++ import ../common/platform-flags.nix { inherit (stdenv) targetPlatform; inherit lib; } + ++ lib.optionals (targetPlatform != hostPlatform) crossConfigureFlags + ++ lib.optional disableBootstrap' "--disable-bootstrap" + + # Platform-specific flags + ++ lib.optional (targetPlatform == hostPlatform && targetPlatform.isx86_32) "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}" + ++ lib.optional targetPlatform.isNetBSD "--disable-libssp" # Provided by libc. + ++ lib.optionals hostPlatform.isSunOS [ + "--enable-long-long" "--enable-libssp" "--enable-threads=posix" "--disable-nls" "--enable-__cxa_atexit" + # On Illumos/Solaris GNU as is preferred + "--with-gnu-as" "--without-gnu-ld" + ] + ++ lib.optional (targetPlatform.libc == "musl") + # musl at least, disable: https://git.buildroot.net/buildroot/commit/?id=873d4019f7fb00f6a80592224236b3ba7d657865 + "--disable-libmpx" + ++ lib.optionals (targetPlatform == hostPlatform && targetPlatform.libc == "musl") [ + "--disable-libsanitizer" + "--disable-symvers" + "libat_cv_have_ifunc=no" + "--disable-gnu-indirect-function" + ] + ++ lib.optionals langJit [ + "--enable-host-shared" + ] + ++ lib.optionals (langD) [ + "--with-target-system-zlib=yes" + ] + # On mips64-unknown-linux-gnu libsanitizer defines collide with + # glibc's definitions and fail the build. It was fixed in gcc-13+. + ++ lib.optionals (targetPlatform.isMips && targetPlatform.parsed.abi.name == "gnu" && lib.versions.major version == "12") [ + "--disable-libsanitizer" + ] + ++ lib.optionals targetPlatform.isAlpha [ + # Workaround build failures like: + # cc1: error: fp software completion requires '-mtrap-precision=i' [-Werror] + "--disable-werror" + ] + ; + +in configureFlags diff --git a/pkgs/by-name/gc/gcc/common/dependencies.nix b/pkgs/by-name/gc/gcc/common/dependencies.nix new file mode 100644 index 0000000..a38cdcb --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/dependencies.nix @@ -0,0 +1,92 @@ +{ lib +, stdenv +, version +, buildPackages +, targetPackages +, texinfo +, which +, gettext +, pkg-config ? null +, gnused +, patchelf +, gmp +, mpfr +, libmpc +, libucontext ? null +, libxcrypt ? null +, cloog ? null +, isl ? null +, zlib ? null +, gnat-bootstrap ? null +, flex ? null +, boehmgc ? null +, zip ? null +, unzip ? null +, gtk2 ? null +, libart_lgpl ? null +, perl ? null +, xlibs ? null +, langJava ? false +, javaAwtGtk ? false +, langAda ? false +, langGo ? false +, withoutTargetLibc ? null +, threadsCross ? null +}: + +let + inherit (lib) optionals; + inherit (stdenv) buildPlatform hostPlatform targetPlatform; +in + +{ + # same for all gcc's + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + nativeBuildInputs = [ + texinfo + which + gettext + ] + ++ optionals (perl != null) [ perl ] + ++ optionals javaAwtGtk [ pkg-config ] + ++ optionals (with stdenv.targetPlatform; isVc4 || isRedox && flex != null) [ flex ] + ++ optionals langAda [ gnat-bootstrap ] + # The builder relies on GNU sed (for instance, Darwin's `sed' fails with + # "-i may not be used with stdin"), and `stdenvNative' doesn't provide it. + ++ optionals buildPlatform.isDarwin [ gnused ] + ; + + # For building runtime libs + # same for all gcc's + depsBuildTarget = + ( + if hostPlatform == buildPlatform then [ + targetPackages.stdenv.cc.bintools # newly-built gcc will be used + ] else assert targetPlatform == hostPlatform; [ + # build != host == target + stdenv.cc + ] + ) + ++ optionals targetPlatform.isLinux [ patchelf ]; + + buildInputs = [ + gmp + mpfr + libmpc + ] + ++ optionals (lib.versionAtLeast version "10") [ libxcrypt ] + ++ [ + targetPackages.stdenv.cc.bintools # For linking code at run-time + ] + ++ optionals (lib.versionOlder version "5" && cloog != null) [ cloog ] + ++ optionals (isl != null) [ isl ] + ++ optionals (zlib != null) [ zlib ] + ++ optionals langJava [ boehmgc zip unzip ] + ++ optionals javaAwtGtk ([ gtk2 libart_lgpl ] ++ xlibs) + ++ optionals (langGo && stdenv.hostPlatform.isMusl) [ libucontext ] + ; + + # threadsCross.package after gcc6 so i assume its okay for 4.8 and 4.9 too + depsTargetTarget = optionals (!withoutTargetLibc && threadsCross != { } && threadsCross.package != null) [ threadsCross.package ]; +} diff --git a/pkgs/by-name/gc/gcc/common/extra-target-flags.nix b/pkgs/by-name/gc/gcc/common/extra-target-flags.nix new file mode 100644 index 0000000..30a2418 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/extra-target-flags.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, withoutTargetLibc, langD ? false, libcCross, threadsCross }: + +let + inherit (stdenv) hostPlatform targetPlatform; +in + +{ + # For non-cross builds these flags are currently assigned in builder.sh. + # It would be good to consolidate the generation of makeFlags + # ({C,CXX,LD}FLAGS_FOR_{BUILD,TARGET}, etc...) at some point. + EXTRA_FLAGS_FOR_TARGET = let + mkFlags = dep: langD: lib.optionals (targetPlatform != hostPlatform && dep != null && !langD) ([ + "-O2 -idirafter ${lib.getDev dep}${dep.incdir or "/include"}" + ] ++ lib.optionals (! withoutTargetLibc) [ + "-B${lib.getLib dep}${dep.libdir or "/lib"}" + ]); + in mkFlags libcCross langD + ++ lib.optionals (!withoutTargetLibc) (mkFlags (threadsCross.package or null) langD) + ; + + EXTRA_LDFLAGS_FOR_TARGET = let + mkFlags = dep: lib.optionals (targetPlatform != hostPlatform && dep != null) ([ + "-Wl,-L${lib.getLib dep}${dep.libdir or "/lib"}" + ] ++ (if withoutTargetLibc then [ + "-B${lib.getLib dep}${dep.libdir or "/lib"}" + ] else [ + "-Wl,-rpath,${lib.getLib dep}${dep.libdir or "/lib"}" + "-Wl,-rpath-link,${lib.getLib dep}${dep.libdir or "/lib"}" + ])); + in mkFlags libcCross + ++ lib.optionals (!withoutTargetLibc) (mkFlags (threadsCross.package or null)) + ; +} diff --git a/pkgs/by-name/gc/gcc/common/libgcc-buildstuff.nix b/pkgs/by-name/gc/gcc/common/libgcc-buildstuff.nix new file mode 100644 index 0000000..991efc2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/libgcc-buildstuff.nix @@ -0,0 +1,53 @@ +{ lib +, stdenv +}: + +# Trick to build a gcc that is capable of emitting shared libraries *without* having the +# targetPlatform libc available beforehand. Taken from: +# https://web.archive.org/web/20170222224855/http://frank.harvard.edu/~coldwell/toolchain/ +# https://web.archive.org/web/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff +let + # crt{i,n}.o are the first and last (respectively) object file + # linked when producing an executable. Traditionally these + # files are delivered as part of the C library, but on GNU + # systems they are in fact built by GCC. Since libgcc needs to + # build before glibc, we can't wait for them to be copied by + # glibc. At this early pre-glibc stage these files sometimes + # have different names. + crtstuff-ofiles = + if stdenv.targetPlatform.isPower + then "ecrti.o ecrtn.o ncrti.o ncrtn.o" + else "crti.o crtn.o"; + + # Normally, `SHLIB_LC` is set to `-lc`, which means that + # `libgcc_s.so` cannot be built until `libc.so` is available. + # The assignment below clobbers this variable, removing the + # `-lc`. + # + # On PowerPC we add `-mnewlib`, which means "libc has not been + # built yet". This causes libgcc's Makefile to use the + # gcc-built `{e,n}crt{n,i}.o` instead of failing to find the + # versions which have been repackaged in libc as `crt{n,i}.o` + # + SHLIB_LC = lib.optionalString stdenv.targetPlatform.isPower "-mnewlib"; + +in +'' + echo 'libgcc.a: ${crtstuff-ofiles}' >> libgcc/Makefile.in + echo 'SHLIB_LC=${SHLIB_LC}' >> libgcc/Makefile.in +'' + + # Meanwhile, crt{i,n}.S are not present on certain platforms + # (e.g. LoongArch64), resulting in the following error: + # + # No rule to make target '../../../gcc-xx.x.x/libgcc/config/loongarch/crti.S', needed by 'crti.o'. Stop. + # + # For LoongArch64 and S390, a hacky workaround is to simply touch them, + # as the platform forces .init_array support. + # + # https://www.openwall.com/lists/musl/2022/11/09/3 + # + # 'parsed.cpu.family' won't be correct for every platform. ++ lib.optionalString (stdenv.targetPlatform.isLoongArch64 || stdenv.targetPlatform.isS390 || stdenv.targetPlatform.isAlpha) '' + touch libgcc/config/${stdenv.targetPlatform.parsed.cpu.family}/crt{i,n}.S +'' diff --git a/pkgs/by-name/gc/gcc/common/libgcc.nix b/pkgs/by-name/gc/gcc/common/libgcc.nix new file mode 100644 index 0000000..a7de840 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/libgcc.nix @@ -0,0 +1,160 @@ +{ lib +, stdenv +, version +, langC +, langCC +, langJit +, enableShared +, targetPlatform +, hostPlatform +, withoutTargetLibc +, libcCross +}: + +assert !stdenv.targetPlatform.hasSharedLibraries -> !enableShared; + +drv: lib.pipe drv + +([ + + (pkg: pkg.overrideAttrs (previousAttrs: + lib.optionalAttrs ( + targetPlatform != hostPlatform && + (enableShared || targetPlatform.isMinGW) && + withoutTargetLibc + ) { + makeFlags = [ "all-gcc" "all-target-libgcc" ]; + installTargets = "install-gcc install-target-libgcc"; + })) + +] ++ + +# nixpkgs did not add the "libgcc" output until gcc11. In theory +# the following condition can be changed to `true`, but that has not +# been tested. +lib.optionals (lib.versionAtLeast version "11.0") + +(let + targetPlatformSlash = + if hostPlatform == targetPlatform + then "" + else "${targetPlatform.config}/"; + + # If we are building a cross-compiler and the target libc provided + # to us at build time has a libgcc, use that instead of building a + # new one. This avoids having two separate (but identical) libgcc + # outpaths in the closure of most packages, which can be confusing. + useLibgccFromTargetLibc = + libcCross != null && + libcCross?passthru.libgcc; + + enableLibGccOutput = + (!stdenv.targetPlatform.isWindows || (with stdenv; targetPlatform == hostPlatform)) && + !langJit && + !stdenv.hostPlatform.isDarwin && + enableShared && + !useLibgccFromTargetLibc + ; + + # For some reason libgcc_s.so has major-version "2" on m68k but + # "1" everywhere else. Might be worth changing this to "*". + libgcc_s-version-major = + if targetPlatform.isM68k + then "2" + else "1"; + +in +[ + +(pkg: pkg.overrideAttrs (previousAttrs: lib.optionalAttrs useLibgccFromTargetLibc { + passthru = (previousAttrs.passthru or {}) // { + inherit (libcCross) libgcc; + }; +})) + +(pkg: pkg.overrideAttrs (previousAttrs: lib.optionalAttrs ((!langC) || langJit || enableLibGccOutput) { + outputs = previousAttrs.outputs ++ lib.optionals enableLibGccOutput [ "libgcc" ]; + # This is a separate phase because gcc assembles its phase scripts + # in bash instead of nix (we should fix that). + preFixupPhases = (previousAttrs.preFixupPhases or []) ++ lib.optionals ((!langC) || enableLibGccOutput) [ "preFixupLibGccPhase" ]; + preFixupLibGccPhase = + # delete extra/unused builds of libgcc_s in non-langC builds + # (i.e. libgccjit, gnat, etc) to avoid potential confusion + lib.optionalString (!langC) '' + rm -f $out/lib/libgcc_s.so* + '' + + # TODO(amjoseph): remove the `libgcc_s.so` symlinks below and replace them + # with a `-L${gccForLibs.libgcc}/lib` in cc-wrapper's + # `$out/nix-support/cc-flags`. See also: + # - https://github.com/NixOS/nixpkgs/pull/209870#discussion_r1130614895 + # - https://github.com/NixOS/nixpkgs/pull/209870#discussion_r1130635982 + # - https://github.com/NixOS/nixpkgs/commit/404155c6acfa59456aebe6156b22fe385e7dec6f + # + # move `libgcc_s.so` into its own output, `$libgcc` + + lib.optionalString enableLibGccOutput ('' + # move libgcc from lib to its own output (libgcc) + mkdir -p $libgcc/lib + mv $lib/${targetPlatformSlash}lib/libgcc_s.so $libgcc/lib/ + mv $lib/${targetPlatformSlash}lib/libgcc_s.so.${libgcc_s-version-major} $libgcc/lib/ + ln -s $libgcc/lib/libgcc_s.so $lib/${targetPlatformSlash}lib/ + ln -s $libgcc/lib/libgcc_s.so.${libgcc_s-version-major} $lib/${targetPlatformSlash}lib/ + '' + # + # Nixpkgs ordinarily turns dynamic linking into pseudo-static linking: + # libraries are still loaded dynamically, exactly which copy of each + # library is loaded is permanently fixed at compile time (via RUNPATH). + # For libgcc_s we must revert to the "impure dynamic linking" style found + # in imperative software distributions. We must do this because + # `libgcc_s` calls `malloc()` and therefore has a `DT_NEEDED` for `libc`, + # which creates two problems: + # + # 1. A circular package dependency `glibc`<-`libgcc`<-`glibc` + # + # 2. According to the `-Wl,-rpath` flags added by Nixpkgs' `ld-wrapper`, + # the two versions of `glibc` in the cycle above are actually + # different packages. The later one is compiled by this `gcc`, but + # the earlier one was compiled by the compiler *that compiled* this + # `gcc` (usually the bootstrapFiles). In any event, the `glibc` + # dynamic loader won't honor that specificity without namespaced + # manual loads (`dlmopen()`). Once a `libc` is present in the address + # space of a process, that `libc` will be used to satisfy all + # `DT_NEEDED`s for `libc`, regardless of `RUNPATH`s. + # + # So we wipe the RUNPATH using `patchelf --set-rpath ""`. We can't use + # `patchelf --remove-rpath`, because at least as of patchelf 0.15.0 it + # will leave the old RUNPATH string in the file where the reference + # scanner can still find it: + # + # https://github.com/NixOS/patchelf/issues/453 + # + # Note: we might be using the bootstrapFiles' copy of patchelf, so we have + # to keep doing it this way until both the issue is fixed *and* all the + # bootstrapFiles are regenerated, on every platform. + # + # This patchelfing is *not* effectively equivalent to copying + # `libgcc_s` into `glibc`'s outpath. There is one minor and one + # major difference: + # + # 1. (Minor): multiple builds of `glibc` (say, with different + # overrides or parameters) will all reference a single store + # path: + # + # /nix/store/xxx...xxx-gcc-libgcc/lib/libgcc_s.so.1 + # + # This many-to-one referrer relationship will be visible in the store's + # dependency graph, and will be available to `nix-store -q` queries. + # Copying `libgcc_s` into each of its referrers would lose that + # information. + # + # 2. (Major): by referencing `libgcc_s.so.1`, rather than copying it, we + # are still able to run `nix-store -qd` on it to find out how it got + # built! Most importantly, we can see from that deriver which compiler + # was used to build it (or if it is part of the unpacked + # bootstrap-files). Copying `libgcc_s.so.1` from one outpath to + # another eliminates the ability to make these queries. + # + + '' + patchelf --set-rpath "" $libgcc/lib/libgcc_s.so.${libgcc_s-version-major} + ''); +}))])) diff --git a/pkgs/by-name/gc/gcc/common/meta.nix b/pkgs/by-name/gc/gcc/common/meta.nix new file mode 100644 index 0000000..5ce4cec --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/meta.nix @@ -0,0 +1,28 @@ +{ lib, version, }: + +let + inherit (lib) + licenses + # maintainers + platforms + # teams + versionOlder + ; +in +{ + homepage = "https://gcc.gnu.org/"; + license = licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ + description = "GNU Compiler Collection, version ${version}"; + longDescription = '' + The GNU Compiler Collection includes compiler front ends for C, C++, + Objective-C, Fortran, OpenMP for C/C++/Fortran, and Ada, as well as + libraries for these languages (libstdc++, libgomp,...). + + GCC development is a part of the GNU Project, aiming to improve the + compiler used in the GNU system including the GNU/Linux variant. + ''; + + platforms = platforms.unix; + # maintainers = if versionOlder version "5" then [ maintainers.veprbl ] else teams.gcc.members; + +} diff --git a/pkgs/by-name/gc/gcc/common/platform-flags.nix b/pkgs/by-name/gc/gcc/common/platform-flags.nix new file mode 100644 index 0000000..cc6a67d --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/platform-flags.nix @@ -0,0 +1,32 @@ +{ lib, targetPlatform }: + +let + isAarch64Darwin = targetPlatform.isDarwin && targetPlatform.isAarch64; + gcc = targetPlatform.gcc or {}; + p = gcc + // targetPlatform.parsed.abi; +in lib.concatLists [ + # --with-arch= is unknown flag on x86_64 and aarch64-darwin. + (lib.optional (!targetPlatform.isx86_64 && !isAarch64Darwin && p ? arch) "--with-arch=${p.arch}") + # --with-cpu on aarch64-darwin fails with "Unknown cpu used in --with-cpu=apple-a13". + (lib.optional (!isAarch64Darwin && p ? cpu) "--with-cpu=${p.cpu}") + (lib.optional (p ? abi) "--with-abi=${p.abi}") + (lib.optional (p ? fpu) "--with-fpu=${p.fpu}") + (lib.optional (p ? float) "--with-float=${p.float}") + (lib.optional (p ? mode) "--with-mode=${p.mode}") + (lib.optionals targetPlatform.isPower64 + # musl explicitly rejects 128-bit long double on + # powerpc64; see musl/arch/powerpc64/bits/float.h + (lib.optionals + (!targetPlatform.isMusl + && (targetPlatform.isLittleEndian || + # "... --with-long-double-format is only supported if the default cpu is power7 or newer" + # https://github.com/NixOS/nixpkgs/pull/170215#issuecomment-1202164709 + (lib.lists.elem + (lib.strings.substring 0 6 (p.cpu or "")) + [ "power7" "power8" "power9" "power1"/*0, 11, etc*/ ]))) [ + "--with-long-double-128" + "--with-long-double-format=${gcc.long-double-format or "ieee"}" + ])) + (lib.optional targetPlatform.isMips64n32 "--disable-libsanitizer") # libsanitizer does not compile on mips64n32 +] diff --git a/pkgs/by-name/gc/gcc/common/pre-configure.nix b/pkgs/by-name/gc/gcc/common/pre-configure.nix new file mode 100644 index 0000000..77179d7 --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/pre-configure.nix @@ -0,0 +1,129 @@ +{ lib +, stdenv +, version, buildPlatform, hostPlatform, targetPlatform +, gnat-bootstrap ? null +, langAda ? false +, langFortran +, langJava ? false +, langJit ? false +, langGo +, withoutTargetLibc +, enableShared +, enableMultilib +, pkgsBuildTarget +}: + +assert langJava -> lib.versionOlder version "7"; +assert langAda -> gnat-bootstrap != null; let + needsLib + = (lib.versionOlder version "7" && (langJava || langGo)) + || (lib.versions.major version == "4" && lib.versions.minor version == "9" && targetPlatform.isDarwin); +in lib.optionalString (hostPlatform.isSunOS && hostPlatform.is64bit) '' + export NIX_LDFLAGS=`echo $NIX_LDFLAGS | sed -e s~$prefix/lib~$prefix/lib/amd64~g` + export LDFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $LDFLAGS_FOR_TARGET" + export CXXFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CXXFLAGS_FOR_TARGET" + export CFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CFLAGS_FOR_TARGET" +'' + lib.optionalString needsLib '' + export lib=$out; +'' + lib.optionalString langAda '' + export PATH=${gnat-bootstrap}/bin:$PATH +'' + +# For a cross-built native compiler, i.e. build!=(host==target), the +# bundled libgfortran needs a gfortran which can run on the +# buildPlatform and emit code for the targetPlatform. The compiler +# which is built alongside gfortran in this configuration doesn't +# meet that need: it runs on the hostPlatform. ++ lib.optionalString (langFortran && (with stdenv; buildPlatform != hostPlatform && hostPlatform == targetPlatform)) '' + export GFORTRAN_FOR_TARGET=${pkgsBuildTarget.gfortran}/bin/${stdenv.targetPlatform.config}-gfortran +'' + +# On x86_64-darwin, the gnat-bootstrap bootstrap compiler that we need to build a +# native GCC with Ada support emits assembly that is accepted by the Clang +# integrated assembler, but not by the GNU assembler in cctools-port that Nix +# usually in the x86_64-darwin stdenv. In particular, x86_64-darwin gnat-bootstrap +# emits MOVQ as the mnemonic for quadword interunit moves, such as between XMM +# and general registers (e.g "movq %xmm0, %rbp"); the cctools-port assembler, +# however, only recognises MOVD for such moves. +# +# Therefore, for native x86_64-darwin builds that support Ada, we have to use +# the Clang integrated assembler to build (at least stage 1 of) GCC, but have to +# target GCC at the cctools-port GNU assembler. In the wrapped x86_64-darwin +# gnat-bootstrap, the former is provided as `as`, while the latter is provided as +# `gas`. +# ++ lib.optionalString ( + langAda + && buildPlatform == hostPlatform + && hostPlatform == targetPlatform + && targetPlatform.isx86_64 + && targetPlatform.isDarwin + ) '' + export AS_FOR_BUILD=${gnat-bootstrap}/bin/as + export AS_FOR_TARGET=${gnat-bootstrap}/bin/gas +'' + +# NOTE 2020/3/18: This environment variable prevents configure scripts from +# detecting the presence of aligned_alloc on Darwin. There are many facts that +# collectively make this fix necessary: +# - Nix uses a fixed set of standard library headers on all MacOS systems, +# regardless of their actual version. (Nix uses version 10.12 headers.) +# - Nix uses the native standard library binaries for the build system. That +# means the standard library binaries may not exactly match the standard +# library headers. +# - The aligned_alloc procedure is present in MacOS 10.15 (Catalina), but not +# in earlier versions. Therefore on Catalina systems, aligned_alloc is +# linkable (i.e. present in the binary libraries) but not present in the +# headers. +# - Configure scripts detect a procedure's existence by checking whether it is +# linkable. They do not check whether it is present in the headers. +# - GCC throws an error during compilation because aligned_alloc is not +# defined in the headers---even though the linker can see it. +# +# This fix would not be necessary if ANY of the above were false: +# - If Nix used native headers for each different MacOS version, aligned_alloc +# would be in the headers on Catalina. +# - If Nix used the same library binaries for each MacOS version, aligned_alloc +# would not be in the library binaries. +# - If Catalina did not include aligned_alloc, this wouldn't be a problem. +# - If the configure scripts looked for header presence as well as +# linkability, they would see that aligned_alloc is missing. +# - If GCC allowed implicit declaration of symbols, it would not fail during +# compilation even if the configure scripts did not check header presence. +# ++ lib.optionalString (buildPlatform.isDarwin) '' + export build_configargs=ac_cv_func_aligned_alloc=no +'' + lib.optionalString (hostPlatform.isDarwin) '' + export host_configargs=ac_cv_func_aligned_alloc=no +'' + lib.optionalString (targetPlatform.isDarwin) '' + export target_configargs=ac_cv_func_aligned_alloc=no +'' + +# In order to properly install libgccjit on macOS Catalina, strip(1) +# upon installation must not remove external symbols, otherwise the +# install step errors with "symbols referenced by indirect symbol +# table entries that can't be stripped". ++ lib.optionalString (hostPlatform.isDarwin && langJit) '' + export STRIP='strip -x' +'' + +# HACK: if host and target config are the same, but the platforms are +# actually different we need to convince the configure script that it +# is in fact building a cross compiler although it doesn't believe it. ++ lib.optionalString (targetPlatform.config == hostPlatform.config && targetPlatform != hostPlatform) '' + substituteInPlace configure --replace is_cross_compiler=no is_cross_compiler=yes +'' + +# Normally (for host != target case) --without-headers automatically +# enables 'inhibit_libc=true' in gcc's gcc/configure.ac. But case of +# gcc->clang or dynamic->static "cross"-compilation manages to evade it: there +# hostPlatform != targetPlatform, hostPlatform.config == targetPlatform.config. +# We explicitly inhibit libc headers use in this case as well. ++ lib.optionalString (targetPlatform != hostPlatform && + withoutTargetLibc && + targetPlatform.config == hostPlatform.config) '' + export inhibit_libc=true +'' + ++ lib.optionalString (targetPlatform != hostPlatform && withoutTargetLibc && enableShared) + (import ./libgcc-buildstuff.nix { inherit lib stdenv; }) diff --git a/pkgs/by-name/gc/gcc/common/strip-attributes.nix b/pkgs/by-name/gc/gcc/common/strip-attributes.nix new file mode 100644 index 0000000..f2f0efb --- /dev/null +++ b/pkgs/by-name/gc/gcc/common/strip-attributes.nix @@ -0,0 +1,70 @@ +{ lib, stdenv, langJit }: + +{ + # Note [Cross-compiler stripping] + # gcc requires delicate stripping as it installs ELF files for both + # HOST and TARGET platforms. It requires according strip tool otherwise + # strip could remove sections it's not aware of. + # Example ARM breakage by x86_64 strip: https://bugs.gentoo.org/697428 + # + # Let's recap the file layout for directories with object files for a + # cross-compiler: + # + # $out (host != target) + # `- bin: HOST + # lib/*.{a,o}: HOST + # `- gcc///*.{a,o}: TARGET + # `- plugin/: HOST + # `- lib{,32,64,x32}: symlink to lib or identical layout + # `- libexec/: HOST + # `- /: TARGET + # + # $out (host == target) has identical directory layout. + # + # $lib (host != target): + # `- /lib/*.{la,so}: TARGET + # + # $lib (host == target): + # `- lib/*.{la,so}: HOST + + # The rest of stripDebugList{Host,Target} will be populated in + # postInstall to disambiguate lib/ object files. + stripDebugList = [ "bin" "libexec" ]; + stripDebugListTarget = [ stdenv.targetPlatform.config ]; + + preFixup = '' + # Populate most delicated lib/ part of stripDebugList{,Target} + updateDebugListPaths() { + local oldOpts + oldOpts="$(shopt -p nullglob)" || true + shopt -s nullglob + + pushd $out + local -ar outHostFiles=( + lib{,32,64}/*.{a,o,so*} + lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/plugin + ) + local -ar outTargetFiles=( + lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/*.{a,o,so*} + ) + popd + '' + lib.optionalString (!langJit) '' + ${/*keep indentation*/ ""} + pushd $lib + local -ar libHostFiles=( + lib{,32,64}/*.{a,o,so*} + ) + local -ar libTargetFiles=( + lib{,32,64}/${stdenv.targetPlatform.config}/*.{a,o,so*} + ) + popd + + '' + '' + eval "$oldOpts" + + stripDebugList="$stripDebugList ''${outHostFiles[*]} ''${libHostFiles[*]}" + stripDebugListTarget="$stripDebugListTarget ''${outTargetFiles[*]} ''${libTargetFiles[*]}" + } + updateDebugListPaths + ''; +} diff --git a/pkgs/by-name/gc/gcc/default.nix b/pkgs/by-name/gc/gcc/default.nix new file mode 100644 index 0000000..748cbdd --- /dev/null +++ b/pkgs/by-name/gc/gcc/default.nix @@ -0,0 +1,472 @@ +{ lib, stdenv, targetPackages, fetchurl, fetchpatch, fetchFromGitHub, noSysDirs +, langC ? true, langCC ? true, langFortran ? false +, langAda ? false +, langObjC ? stdenv.targetPlatform.isDarwin +, langObjCpp ? stdenv.targetPlatform.isDarwin +, langD ? false +, langGo ? false +, reproducibleBuild ? true +, profiledCompiler ? false +, langJit ? false +, staticCompiler ? false +, enableShared ? stdenv.targetPlatform.hasSharedLibraries +, enableLTO ? stdenv.hostPlatform.hasSharedLibraries +, texinfo ? null +, perl ? null # optional, for texi2pod (then pod2man) +, gmp, mpfr, libmpc, gettext, which, patchelf, binutils +, isl ? null # optional, for the Graphite optimization framework. +, zlib ? null +, libucontext ? null +, gnat-bootstrap ? null +, enableMultilib ? false +, enablePlugin ? stdenv.hostPlatform == stdenv.buildPlatform # Whether to support user-supplied plug-ins +, name ? "gcc" +, libcCross ? null +, threadsCross ? null # for MinGW +, withoutTargetLibc ? false +, gnused ? null +, cloog # unused; just for compat with gcc4, as we override the parameter on some places +, buildPackages +, pkgsBuildTarget +, libxcrypt +, disableGdbPlugin ? !enablePlugin || (stdenv.targetPlatform.isAvr && stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) +, nukeReferences +, callPackage +, majorMinorVersion +, darwin + +# only for gcc<=6.x +, langJava ? false +, flex +, boehmgc ? null +, zip ? null, unzip ? null, pkg-config ? null +, gtk2 ? null, libart_lgpl ? null +, libX11 ? null, libXt ? null, libSM ? null, libICE ? null, libXtst ? null +, libXrender ? null, xorgproto ? null +, libXrandr ? null, libXi ? null +, x11Support ? langJava +}: + +let + inherit (lib) + callPackageWith + filter + getBin + # maintainers + makeLibraryPath + makeSearchPathOutput + mapAttrs + optional + optionalAttrs + optionals + optionalString + pipe + platforms + versionAtLeast + versions + ; + + gccVersions = import ./versions.nix; + version = gccVersions.fromMajorMinor majorMinorVersion; + + majorVersion = versions.major version; + atLeast13 = versionAtLeast version "13"; + atLeast12 = versionAtLeast version "12"; + atLeast11 = versionAtLeast version "11"; + atLeast10 = versionAtLeast version "10"; + atLeast9 = versionAtLeast version "9"; + atLeast8 = versionAtLeast version "8"; + atLeast7 = versionAtLeast version "7"; + atLeast6 = versionAtLeast version "6"; + atLeast49 = versionAtLeast version "4.9"; + is13 = majorVersion == "13"; + is12 = majorVersion == "12"; + is11 = majorVersion == "11"; + is10 = majorVersion == "10"; + is9 = majorVersion == "9"; + is8 = majorVersion == "8"; + is7 = majorVersion == "7"; + is6 = majorVersion == "6"; + is49 = majorVersion == "4" && versions.minor version == "9"; + is48 = majorVersion == "4" && versions.minor version == "8"; + + disableBootstrap = atLeast11 && !stdenv.hostPlatform.isDarwin && (atLeast12 -> !profiledCompiler); + + inherit (stdenv) buildPlatform hostPlatform targetPlatform; + targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; + + patches = callFile ./patches {}; + + /* Cross-gcc settings (build == host != target) */ + crossMingw = targetPlatform != hostPlatform && targetPlatform.isMinGW; + stageNameAddon = optionalString withoutTargetLibc "-nolibc"; + crossNameAddon = optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}${stageNameAddon}-"; + + javaAwtGtk = langJava && x11Support; + xlibs = [ + libX11 libXt libSM libICE libXtst libXrender libXrandr libXi + xorgproto + ]; + callFile = callPackageWith ({ + # lets + inherit + majorVersion + version + buildPlatform + hostPlatform + targetPlatform + targetConfig + patches + crossMingw + stageNameAddon + crossNameAddon + ; + # inherit generated with 'nix eval --json --impure --expr "with import ./. {}; lib.attrNames (lib.functionArgs gcc${majorVersion}.cc.override)" | jq '.[]' --raw-output' + inherit + binutils + buildPackages + cloog + withoutTargetLibc + disableBootstrap + disableGdbPlugin + enableLTO + enableMultilib + enablePlugin + enableShared + fetchpatch + fetchurl + gettext + gmp + gnat-bootstrap + gnused + isl + langAda + langC + langCC + langD + langFortran + langGo + langJit + langObjC + langObjCpp + lib + libcCross + libmpc + libucontext + libxcrypt + mpfr + name + noSysDirs + nukeReferences + patchelf + perl + pkgsBuildTarget + profiledCompiler + reproducibleBuild + staticCompiler + stdenv + targetPackages + texinfo + threadsCross + which + zip + zlib + ; + } // optionalAttrs (!atLeast7) { + inherit + boehmgc + flex + gnat-bootstrap + gtk2 + langAda + langJava + libICE + libSM + libX11 + libXi + libXrandr + libXrender + libXt + libXtst + libart_lgpl + pkg-config + unzip + x11Support + xorgproto + javaAwtGtk + xlibs + ; + javaEcj = fetchurl { + # The `$(top_srcdir)/ecj.jar' file is automatically picked up at + # `configure' time. + + # XXX: Eventually we might want to take it from upstream. + url = "ftp://sourceware.org/pub/java/ecj-4.3.jar"; + sha256 = "0jz7hvc0s6iydmhgh5h2m15yza7p2rlss2vkif30vm9y77m97qcx"; + }; + + # Antlr (optional) allows the Java `gjdoc' tool to be built. We want a + # binary distribution here to allow the whole chain to be bootstrapped. + javaAntlr = fetchurl { + url = "https://www.antlr.org/download/antlr-4.4-complete.jar"; + sha256 = "02lda2imivsvsis8rnzmbrbp8rh1kb8vmq4i67pqhkwz7lf8y6dz"; + }; + }); + +in + +# We enable the isl cloog backend. +assert !atLeast6 -> (cloog != null -> isl != null); + +assert langJava -> !atLeast7 && zip != null && unzip != null && zlib != null && boehmgc != null && perl != null; # for `--enable-java-home' + +# Make sure we get GNU sed. +assert stdenv.buildPlatform.isDarwin -> gnused != null; + +# The go frontend is written in c++ +assert langGo -> langCC; +assert (atLeast6 && !is7 && !is8) -> (langAda -> gnat-bootstrap != null); + +# TODO: fixup D bootstapping, probably by using gdc11 (and maybe other changes). +# error: GDC is required to build d +assert atLeast12 -> !langD; + +# threadsCross is just for MinGW +assert threadsCross != {} -> stdenv.targetPlatform.isWindows; + +# profiledCompiler builds inject non-determinism in one of the compilation stages. +# If turned on, we can't provide reproducible builds anymore +assert reproducibleBuild -> profiledCompiler == false; + +# We need all these X libraries when building AWT with GTK. +assert !atLeast7 -> (x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []); + +pipe ((callFile ./common/builder.nix {}) ({ + pname = "${crossNameAddon}${name}"; + inherit version; + + src = if is6 && stdenv.targetPlatform.isVc4 then fetchFromGitHub { + owner = "itszor"; + repo = "gcc-vc4"; + rev = "e90ff43f9671c760cf0d1dd62f569a0fb9bf8918"; + sha256 = "0gxf66hwqk26h8f853sybphqa5ca0cva2kmrw5jsiv6139g0qnp8"; + } else if is6 && stdenv.targetPlatform.isRedox then fetchFromGitHub { + owner = "redox-os"; + repo = "gcc"; + rev = "f360ac095028d286fc6dde4d02daed48f59813fa"; # `redox` branch + sha256 = "1an96h8l58pppyh3qqv90g8hgcfd9hj7igvh2gigmkxbrx94khfl"; + } else fetchurl { + url = if atLeast7 + then "mirror://gcc/releases/gcc-${version}/gcc-${version}.tar.xz" + else if atLeast6 + then "mirror://gnu/gcc/gcc-${version}/gcc-${version}.tar.xz" + else "mirror://gnu/gcc/gcc-${version}/gcc-${version}.tar.bz2"; + ${if is10 || is11 || is13 then "hash" else "sha256"} = + gccVersions.srcHashForVersion version; + }; + + inherit patches; + + outputs = + if atLeast7 + then [ "out" "man" "info" ] ++ optional (!langJit) "lib" + else if atLeast49 && (langJava || langGo || (if atLeast6 then langJit else targetPlatform.isDarwin)) then ["out" "man" "info"] + else [ "out" "lib" "man" "info" ]; + + setOutputFlags = false; + + libc_dev = stdenv.cc.libc_dev; + + hardeningDisable = [ "format" "pie" ] + ++ optionals (is11 && langAda) [ "fortify3" ]; + + postPatch = optionalString atLeast7 '' + configureScripts=$(find . -name configure) + for configureScript in $configureScripts; do + patchShebangs $configureScript + done + '' + # This should kill all the stdinc frameworks that gcc and friends like to + # insert into default search paths. + + optionalString (atLeast6 && hostPlatform.isDarwin) '' + substituteInPlace gcc/config/darwin-c.c${optionalString atLeast12 "c"} \ + --replace 'if (stdinc)' 'if (0)' + + substituteInPlace libgcc/config/t-slibgcc-darwin \ + --replace "-install_name @shlib_slibdir@/\$(SHLIB_INSTALL_NAME)" "-install_name ''${!outputLib}/lib/\$(SHLIB_INSTALL_NAME)" + + substituteInPlace libgfortran/configure \ + --replace "-install_name \\\$rpath/\\\$soname" "-install_name ''${!outputLib}/lib/\\\$soname" + '' + + ( + optionalString (targetPlatform != hostPlatform || stdenv.cc.libc != null) + # On NixOS, use the right path to the dynamic linker instead of + # `/lib/ld*.so'. + (let + libc = if libcCross != null then libcCross else stdenv.cc.libc; + in + ( + '' echo "fixing the {GLIBC,UCLIBC,MUSL}_DYNAMIC_LINKER macros..." + for header in "gcc/config/"*-gnu.h "gcc/config/"*"/"*.h + do + grep -q ${optionalString (!atLeast6) "LIBC"}_DYNAMIC_LINKER "$header" || continue + echo " fixing $header..." + sed -i "$header" \ + -e 's|define[[:blank:]]*\([UCG]\+\)LIBC_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define \1LIBC_DYNAMIC_LINKER\2 "${libc.out}\3"|g' \ + -e 's|define[[:blank:]]*MUSL_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define MUSL_DYNAMIC_LINKER\1 "${libc.out}\2"|g' + done + '' + optionalString (atLeast6 && targetPlatform.libc == "musl") '' + sed -i gcc/config/linux.h -e '1i#undef LOCAL_INCLUDE_DIR' + '' + ) + )) + + optionalString (atLeast7 && targetPlatform.isAvr) ('' + makeFlagsArray+=( + '-s' # workaround for hitting hydra log limit + 'LIMITS_H_TEST=false' + ) + ''); + + inherit noSysDirs staticCompiler withoutTargetLibc + libcCross crossMingw; + + inherit (callFile ./common/dependencies.nix { }) depsBuildBuild nativeBuildInputs depsBuildTarget buildInputs depsTargetTarget; + + preConfigure = (callFile ./common/pre-configure.nix { }) + optionalString atLeast10 '' + ln -sf ${libxcrypt}/include/crypt.h libsanitizer/sanitizer_common/crypt.h + ''; + + dontDisableStatic = true; + + configurePlatforms = [ "build" "host" "target" ]; + + configureFlags = (callFile ./common/configure-flags.nix { }) + ++ optional (is7 && targetPlatform.isAarch64) "--enable-fix-cortex-a53-843419" + ++ optional (is7 && targetPlatform.isNetBSD) "--disable-libcilkrts"; + + inherit targetConfig; + + buildFlags = + # we do not yet have Nix-driven profiling + assert atLeast12 -> (profiledCompiler -> !disableBootstrap); + if atLeast11 + then let target = + optionalString (profiledCompiler) "profiled" + + optionalString (targetPlatform == hostPlatform && hostPlatform == buildPlatform && !disableBootstrap) "bootstrap"; + in optional (target != "") target + else + optional + (targetPlatform == hostPlatform && hostPlatform == buildPlatform) + (if profiledCompiler then "profiledbootstrap" else "bootstrap"); + + inherit (callFile ./common/strip-attributes.nix { }) + stripDebugList + stripDebugListTarget + preFixup; + + # https://gcc.gnu.org/PR109898 + enableParallelInstalling = false; + + env = mapAttrs (_: v: toString v) ({ + + NIX_NO_SELF_RPATH = true; + + # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 + ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; + + # Setting $CPATH and $LIBRARY_PATH to make sure both `gcc' and `xgcc' find the + # library headers and binaries, regarless of the language being compiled. + # + # Note: When building the Java AWT GTK peer, the build system doesn't honor + # `--with-gmp' et al., e.g., when building + # `libjava/classpath/native/jni/java-math/gnu_java_math_GMP.c', so we just add + # them to $CPATH and $LIBRARY_PATH in this case. + # + # Likewise, the LTO code doesn't find zlib. + # + # Cross-compiling, we need gcc not to read ./specs in order to build the g++ + # compiler (after the specs for the cross-gcc are created). Having + # LIBRARY_PATH= makes gcc read the specs from ., and the build breaks. + + CPATH = optionals (targetPlatform == hostPlatform) (makeSearchPathOutput "dev" "include" ([] + ++ optional (zlib != null) zlib + ++ optional langJava boehmgc + ++ optionals javaAwtGtk xlibs + ++ optionals javaAwtGtk [ gmp mpfr ] + )); + + LIBRARY_PATH = optionals (targetPlatform == hostPlatform) (makeLibraryPath ( + optional (zlib != null) zlib + ++ optional langJava boehmgc + ++ optionals javaAwtGtk xlibs + ++ optionals javaAwtGtk [ gmp mpfr ] + )); + + inherit (callFile ./common/extra-target-flags.nix { }) + EXTRA_FLAGS_FOR_TARGET + EXTRA_LDFLAGS_FOR_TARGET + ; + } // optionalAttrs is7 { + NIX_CFLAGS_COMPILE = optionalString (stdenv.cc.isClang && langFortran) "-Wno-unused-command-line-argument" + # Downgrade register storage class specifier errors to warnings when building a cross compiler from a clang stdenv. + + optionalString (stdenv.cc.isClang && targetPlatform != hostPlatform) " -Wno-register"; + } // optionalAttrs (!is7 && !atLeast12 && stdenv.cc.isClang && targetPlatform != hostPlatform) { + NIX_CFLAGS_COMPILE = "-Wno-register"; + } // optionalAttrs (!atLeast7) { + inherit langJava; + } // optionalAttrs atLeast6 { + NIX_LDFLAGS = optionalString hostPlatform.isSunOS "-lm"; + }); + + passthru = { + inherit langC langCC langObjC langObjCpp langAda langFortran langGo langD langJava version; + isGNU = true; + hardeningUnsupportedFlags = optional is48 "stackprotector" + ++ optional (!atLeast11) "zerocallusedregs" + ++ optionals (!atLeast12) [ "fortify3" "trivialautovarinit" ] + ++ optionals (langFortran) [ "fortify" "format" ]; + }; + + enableParallelBuilding = true; + inherit enableShared enableMultilib; + + meta = { + inherit (callFile ./common/meta.nix { }) + homepage + license + description + longDescription + platforms + # maintainers + ; + } // optionalAttrs (!atLeast11) { + badPlatforms = + # avr-gcc8 is maintained for the `qmk` package + if (is8 && targetPlatform.isAvr) then [] + else if !(is48 || is49) then [ "aarch64-darwin" ] + else platforms.darwin; + } // optionalAttrs is11 { + badPlatforms = if targetPlatform != hostPlatform then [ "aarch64-darwin" ] else [ ]; + }; +} // optionalAttrs (!atLeast10 && stdenv.targetPlatform.isDarwin) { + # GCC <10 requires default cctools `strip` instead of `llvm-strip` used by Darwin bintools. + preBuild = '' + makeFlagsArray+=('STRIP=${getBin darwin.cctools-port}/bin/${stdenv.cc.targetPrefix}strip') + ''; +} // optionalAttrs (!atLeast8) { + doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv +} // optionalAttrs enableMultilib { + dontMoveLib64 = true; +} // optionalAttrs (((is49 && !stdenv.hostPlatform.isDarwin) || is6) && langJava) { + postFixup = '' + target="$(echo "$out/libexec/gcc"/*/*/ecj*)" + patchelf --set-rpath "$(patchelf --print-rpath "$target"):$out/lib" "$target" + ''; +} +)) +([ + (callPackage ./common/libgcc.nix { inherit version langC langCC langJit targetPlatform hostPlatform withoutTargetLibc enableShared libcCross; }) +] ++ optionals atLeast11 [ + (callPackage ./common/checksum.nix { inherit langC langCC; }) +]) + diff --git a/pkgs/by-name/gc/gcc/packages.nix b/pkgs/by-name/gc/gcc/packages.nix new file mode 100644 index 0000000..9937bd2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/packages.nix @@ -0,0 +1,379 @@ +{ noSysDirs, ... }: +res: pkgs: super: + +with pkgs; +{ + default-gcc-version = + if (with stdenv.targetPlatform; isVc4 || libc == "relibc") then 6 + else 13; + gcc = pkgs.${"gcc${toString default-gcc-version}"}; + gccFun = callPackage ./.; + gcc-unwrapped = gcc.cc; + + gccStdenv = + if stdenv.cc.isGNU + then stdenv + else + stdenv.override { + cc = buildPackages.gcc; + allowedRequisites = null; + # Remove libcxx/libcxxabi, and add clang for AS if on darwin (it uses + # clang's internal assembler). + extraBuildInputs = lib.optional stdenv.hostPlatform.isDarwin clang.cc; + }; + + gcc49Stdenv = overrideCC gccStdenv buildPackages.gcc49; + gcc6Stdenv = overrideCC gccStdenv buildPackages.gcc6; + gcc7Stdenv = overrideCC gccStdenv buildPackages.gcc7; + gcc8Stdenv = overrideCC gccStdenv buildPackages.gcc8; + gcc9Stdenv = overrideCC gccStdenv buildPackages.gcc9; + gcc10Stdenv = overrideCC gccStdenv buildPackages.gcc10; + gcc11Stdenv = overrideCC gccStdenv buildPackages.gcc11; + gcc12Stdenv = overrideCC gccStdenv buildPackages.gcc12; + gcc13Stdenv = overrideCC gccStdenv buildPackages.gcc13; + + # This is not intended for use in nixpkgs but for providing a faster-running + # compiler to nixpkgs users by building gcc with reproducibility-breaking + # profile-guided optimizations + fastStdenv = overrideCC gccStdenv (wrapNonDeterministicGcc gccStdenv buildPackages.gcc_latest); + + wrapCCMulti = cc: + if stdenv.targetPlatform.system == "x86_64-linux" then + let + # Binutils with glibc multi + bintools = cc.bintools.override { + libc = glibc_multi; + }; + in + lowPrio (wrapCCWith { + cc = cc.cc.override { + stdenv = overrideCC stdenv (wrapCCWith { + cc = cc.cc; + inherit bintools; + libc = glibc_multi; + }); + profiledCompiler = false; + enableMultilib = true; + }; + libc = glibc_multi; + inherit bintools; + extraBuildCommands = '' + echo "dontMoveLib64=1" >> $out/nix-support/setup-hook + ''; + }) else throw "Multilib ${cc.name} not supported for ‘${stdenv.targetPlatform.system}’"; + + gcc_multi = wrapCCMulti gcc; + + gccMultiStdenv = overrideCC stdenv buildPackages.gcc_multi; + + gcc_debug = lowPrio (wrapCC (gcc.cc.overrideAttrs { + dontStrip = true; + })); + + gccCrossLibcStdenv = overrideCC stdenv buildPackages.gccWithoutTargetLibc; + + + # The GCC used to build libc for the target platform. Normal gccs will be + # built with, and use, that cross-compiled libc. + gccWithoutTargetLibc = assert stdenv.targetPlatform != stdenv.hostPlatform; let + libcCross1 = binutilsNoLibc.libc; + in + wrapCCWith { + cc = gccFun { + # copy-pasted + inherit noSysDirs; + majorMinorVersion = toString default-gcc-version; + + reproducibleBuild = true; + profiledCompiler = false; + + isl = if !stdenv.isDarwin then isl_0_20 else null; + + withoutTargetLibc = true; + langCC = false; + libcCross = libcCross1; + targetPackages.stdenv.cc.bintools = binutilsNoLibc; + enableShared = + stdenv.targetPlatform.hasSharedLibraries + + # temporarily disabled due to breakage; + # see https://github.com/NixOS/nixpkgs/pull/243249 + && !stdenv.targetPlatform.isWindows + && !(stdenv.targetPlatform.useLLVM or false) + ; + }; + bintools = binutilsNoLibc; + libc = libcCross1; + extraPackages = [ ]; + }; + + inherit (callPackage ./all.nix { inherit noSysDirs; }) + gcc48 gcc49 gcc6 gcc7 gcc8 gcc9 gcc10 gcc11 gcc12 gcc13; + + gcc_latest = gcc13; + + libgcc = stdenv.cc.cc.libgcc or null; + + # This is for e.g. LLVM libraries on linux. + gccForLibs = + if stdenv.targetPlatform == stdenv.hostPlatform && targetPackages.stdenv.cc.isGNU + # Can only do this is in the native case, otherwise we might get infinite + # recursion if `targetPackages.stdenv.cc.cc` itself uses `gccForLibs`. + then targetPackages.stdenv.cc.cc + else gcc.cc; + + wrapNonDeterministicGcc = stdenv: ccWrapper: + if ccWrapper.isGNU then + ccWrapper.overrideAttrs + (old: { + env = old.env // { + cc = old.env.cc.override { + reproducibleBuild = false; + profiledCompiler = with stdenv; (!isDarwin && hostPlatform.isx86); + }; + }; + }) else ccWrapper; + + + # Use the same GCC version as the one from stdenv by default + gfortran = wrapCC (gcc.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran48 = wrapCC (gcc48.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran49 = wrapCC (gcc49.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran6 = wrapCC (gcc6.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran7 = wrapCC (gcc7.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran8 = wrapCC (gcc8.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran9 = wrapCC (gcc9.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran10 = wrapCC (gcc10.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran11 = wrapCC (gcc11.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran12 = wrapCC (gcc12.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + gfortran13 = wrapCC (gcc13.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + + libgccjit = gcc.cc.override { + name = "libgccjit"; + langFortran = false; + langCC = false; + langC = false; + profiledCompiler = false; + langJit = true; + enableLTO = false; + }; + + gcj = gcj6; + gcj6 = wrapCC (gcc6.cc.override { + name = "gcj"; + langJava = true; + langFortran = false; + langCC = false; + langC = false; + profiledCompiler = false; + inherit zip unzip zlib boehmgc gettext pkg-config perl; + inherit (gnome2) libart_lgpl; + }); + + gnat = gnat12; # When changing this, update also gnatPackages + + gnat11 = wrapCC (gcc11.cc.override { + name = "gnat"; + langC = true; + langCC = false; + langAda = true; + profiledCompiler = false; + # As per upstream instructions building a cross compiler + # should be done with a (native) compiler of the same version. + # If we are cross-compiling GNAT, we may as well do the same. + gnat-bootstrap = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + then buildPackages.gnat-bootstrap11 + else buildPackages.gnat11; + }); + + gnat12 = wrapCC (gcc12.cc.override { + name = "gnat"; + langC = true; + langCC = false; + langAda = true; + profiledCompiler = false; + # As per upstream instructions building a cross compiler + # should be done with a (native) compiler of the same version. + # If we are cross-compiling GNAT, we may as well do the same. + gnat-bootstrap = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + then buildPackages.gnat-bootstrap12 + else buildPackages.gnat12; + stdenv = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + && stdenv.buildPlatform.isDarwin + && stdenv.buildPlatform.isx86_64 + then overrideCC stdenv gnat-bootstrap12 + else stdenv; + }); + + gnat13 = wrapCC (gcc13.cc.override { + name = "gnat"; + langC = true; + langCC = false; + langAda = true; + profiledCompiler = false; + # As per upstream instructions building a cross compiler + # should be done with a (native) compiler of the same version. + # If we are cross-compiling GNAT, we may as well do the same. + gnat-bootstrap = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + then buildPackages.gnat-bootstrap12 + else buildPackages.gnat13; + stdenv = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + && stdenv.buildPlatform.isDarwin + && stdenv.buildPlatform.isx86_64 + then overrideCC stdenv gnat-bootstrap12 + else stdenv; + }); + + gnat-bootstrap = gnat-bootstrap12; + gnat-bootstrap11 = wrapCC (callPackage ../development/compilers/gnat-bootstrap { majorVersion = "11"; }); + gnat-bootstrap12 = wrapCCWith ({ + cc = callPackage ../development/compilers/gnat-bootstrap { majorVersion = "12"; }; + } // lib.optionalAttrs (stdenv.hostPlatform.isDarwin) { + bintools = bintoolsDualAs; + }); + + gnat12Packages = recurseIntoAttrs (callPackage ./ada-packages.nix { gnat = buildPackages.gnat12; }); + gnat13Packages = recurseIntoAttrs (callPackage ./ada-packages.nix { gnat = buildPackages.gnat13; }); + gnatPackages = gnat12Packages; + + inherit (gnatPackages) + gprbuild + gnatprove; + + gccgo = wrapCC (gcc.cc.override + { + name = "gccgo"; + langCC = true; #required for go. + langC = true; + langGo = true; + langJit = true; + profiledCompiler = false; + } // { + # not supported on darwin: https://github.com/golang/go/issues/463 + meta.broken = stdenv.hostPlatform.isDarwin; + }); + + gccgo12 = wrapCC (gcc12.cc.override + { + name = "gccgo"; + langCC = true; #required for go. + langC = true; + langGo = true; + langJit = true; + profiledCompiler = false; + } // { + # not supported on darwin: https://github.com/golang/go/issues/463 + meta.broken = stdenv.hostPlatform.isDarwin; + }); + + gccgo13 = wrapCC (gcc13.cc.override + { + name = "gccgo"; + langCC = true; #required for go. + langC = true; + langGo = true; + langJit = true; + profiledCompiler = false; + } // { + # not supported on darwin: https://github.com/golang/go/issues/463 + meta.broken = stdenv.hostPlatform.isDarwin; + }); + + + # It would be better to match the default gcc so that there are no linking errors + # when using C/C++ libraries in D packages, but right now versions >= 12 are broken. + gdc = gdc11; + gdc11 = wrapCC (gcc11.cc.override { + name = "gdc"; + langCC = false; + langC = false; + langD = true; + profiledCompiler = false; + }); +} diff --git a/pkgs/by-name/gc/gcc/patches/10/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/10/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..d9809e8 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/10/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++extern "C" int ++__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/by-name/gc/gcc/patches/11/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/11/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..7720243 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/11/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++namespace __cxxabiv1 { ++extern "C" int ++__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++} ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/by-name/gc/gcc/patches/11/gcc-issue-103910.patch b/pkgs/by-name/gc/gcc/patches/11/gcc-issue-103910.patch new file mode 100644 index 0000000..c3edd96 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/11/gcc-issue-103910.patch @@ -0,0 +1,41 @@ +From d243f4009d8071b734df16cd70f4c5d09a373769 Mon Sep 17 00:00:00 2001 +From: Andrew Pinski +Date: Wed, 5 Jan 2022 22:00:07 +0000 +Subject: [PATCH] Fix target/103910: missing GTY on x86_mfence causing PCH + usage to ICE + +With -O3 -march=opteron, a mfence builtin is added after the loop +to say the nontemporal stores are no longer needed. This all good +without precompiled headers as the function decl that is referneced +by x86_mfence is referenced in another variable but with precompiled +headers, x86_mfence is all messed up and the decl was GC'ed away. +This fixes the problem by marking x86_mfence as GTY to save/restore +during precompiled headers just like most other variables in +the header file. + +Committed as obvious after a bootstrap/test on x86_64-linux-gnu. + +gcc/ChangeLog: + + PR target/103910 + * config/i386/i386.h (x86_mfence): Mark with GTY. +--- + gcc/config/i386/i386.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h +index f027608eefa..3ac0f698ae2 100644 +--- a/gcc/config/i386/i386.h ++++ b/gcc/config/i386/i386.h +@@ -486,7 +486,7 @@ extern unsigned char ix86_prefetch_sse; + + /* Fence to use after loop using storent. */ + +-extern tree x86_mfence; ++extern GTY(()) tree x86_mfence; + #define FENCE_FOLLOWING_MOVNT x86_mfence + + /* Once GDB has been enhanced to deal with functions without frame +-- +2.31.1 + diff --git a/pkgs/by-name/gc/gcc/patches/11/libgcc-aarch64-darwin-detection.patch b/pkgs/by-name/gc/gcc/patches/11/libgcc-aarch64-darwin-detection.patch new file mode 100644 index 0000000..08dbfec --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/11/libgcc-aarch64-darwin-detection.patch @@ -0,0 +1,21 @@ +diff -u a/libgcc/config.host b/libgcc/config.host +--- a/libgcc/config.host 2023-11-05 11:01:55.778638446 -0500 ++++ b/libgcc/config.host 2023-11-05 11:07:29.405103979 -0500 +@@ -227,7 +227,7 @@ + tmake_file="$tmake_file t-slibgcc-darwin" + # newer toolsets produce warnings when building for unsupported versions. + case ${host} in +- *-*-darwin1[89]* | *-*-darwin2* ) ++ *-*-darwin1[89]* | *-*-darwin2* | aarch64*-*-darwin*) + tmake_file="t-darwin-min-8 $tmake_file" + ;; + *-*-darwin9* | *-*-darwin1[0-7]*) +diff -ur a/libgcc/config/t-darwin-rpath b/libgcc/config/t-darwin-rpath +--- a/libgcc/config/t-darwin-rpath 2023-11-05 11:34:18.691150009 -0500 ++++ b/libgcc/config/t-darwin-rpath 2023-11-05 11:50:36.968920904 -0500 +@@ -2,4 +2,4 @@ + SHLIB_RPATH = @rpath + + # Which does not work for Darwin < 9 +-HOST_LIBGCC2_CFLAGS += -mmacosx-version-min=10.5 ++SHLIB_LOADER_PATH = -Wl,-rpath,@loader_path diff --git a/pkgs/by-name/gc/gcc/patches/12/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/12/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..7720243 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/12/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++namespace __cxxabiv1 { ++extern "C" int ++__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++} ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/by-name/gc/gcc/patches/12/lambda-ICE-PR109241.patch b/pkgs/by-name/gc/gcc/patches/12/lambda-ICE-PR109241.patch new file mode 100644 index 0000000..a27a8a0 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/12/lambda-ICE-PR109241.patch @@ -0,0 +1,77 @@ +https://gcc.gnu.org/PR109241 + +Fix ICE on ccache. + +From 396a4e76afec30d2461638f569cae18955eb4ad2 Mon Sep 17 00:00:00 2001 +From: Jason Merrill +Date: Wed, 22 Mar 2023 16:11:47 -0400 +Subject: [PATCH] c++: local class in nested generic lambda [PR109241] + +In this testcase, the tree walk to look for bare parameter packs was +confused by finding a type with no TREE_BINFO. But it should be fine that +it's unset; we already checked for unexpanded packs at parse time. + +I also tried doing the partial instantiation of the local class, which is +probably the long-term direction we want to go, but for stage 4 let's go +with this safer change. + + PR c++/109241 + +gcc/cp/ChangeLog: + + * pt.cc (find_parameter_packs_r): Handle null TREE_BINFO. + +gcc/testsuite/ChangeLog: + + * g++.dg/cpp1y/lambda-generic-local-class2.C: New test. +--- + gcc/cp/pt.cc | 12 ++++++++---- + .../g++.dg/cpp1y/lambda-generic-local-class2.C | 13 +++++++++++++ + 2 files changed, 21 insertions(+), 4 deletions(-) + create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-local-class2.C + +diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc +index c7f4a95a723..79bc9c014c8 100644 +--- a/gcc/cp/pt.cc ++++ b/gcc/cp/pt.cc +@@ -4106,10 +4106,14 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data) + case TAG_DEFN: + t = TREE_TYPE (t); + if (CLASS_TYPE_P (t)) +- /* Local class, need to look through the whole definition. */ +- for (tree bb : BINFO_BASE_BINFOS (TYPE_BINFO (t))) +- cp_walk_tree (&BINFO_TYPE (bb), &find_parameter_packs_r, +- ppd, ppd->visited); ++ { ++ /* Local class, need to look through the whole definition. ++ TYPE_BINFO might be unset for a partial instantiation. */ ++ if (TYPE_BINFO (t)) ++ for (tree bb : BINFO_BASE_BINFOS (TYPE_BINFO (t))) ++ cp_walk_tree (&BINFO_TYPE (bb), &find_parameter_packs_r, ++ ppd, ppd->visited); ++ } + else + /* Enum, look at the values. */ + for (tree l = TYPE_VALUES (t); l; l = TREE_CHAIN (l)) +diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-local-class2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-local-class2.C +new file mode 100644 +index 00000000000..83856de1f41 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-local-class2.C +@@ -0,0 +1,13 @@ ++// PR c++/109241 ++// { dg-do compile { target c++14 } } ++// { dg-options "" } no pedantic ++ ++void g() { ++ [](auto) { ++ [](auto) { ++ ({ ++ struct A {}; ++ }); ++ }; ++ }(1); ++} +-- +2.40.1 + diff --git a/pkgs/by-name/gc/gcc/patches/12/mangle-NIX_STORE-in-__FILE__.patch b/pkgs/by-name/gc/gcc/patches/12/mangle-NIX_STORE-in-__FILE__.patch new file mode 100644 index 0000000..8a09af2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/12/mangle-NIX_STORE-in-__FILE__.patch @@ -0,0 +1,99 @@ +From 30908556fece379ffd7c0da96c774d8bd297e459 Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich +Date: Fri, 22 Sep 2023 22:41:49 +0100 +Subject: [PATCH] gcc/file-prefix-map.cc: always mangle __FILE__ into invalid + store path + +Without the change `__FILE__` used in static inline functions in headers +embed paths to header files into executable images. For local headers +it's not a problem, but for headers in `/nix/store` this causes `-dev` +inputs to be retained in runtime closure. + +Typical examples are `nix` -> `nlohmann_json` and `pipewire` -> +`lttng-ust.dev`. + +For this reason we want to remove the occurrences of hashes in the +expansion of `__FILE__`. `nuke-references` does it by replacing hashes +by `eeeeee...`. It is handy to be able to invert the transformation to +go back to the original store path. The chosen solution is to make the +hash uppercase: +- it does not trigger runtime references (except for all digit hashes, + which are unlikely enough) +- it visually looks like a bogus store path +- it is easy to find the original store path if required + +Ideally we would like to use `-fmacro-prefix-map=` feature of `gcc` as: + + -fmacro-prefix-map=/nix/store/$hash1-nlohmann-json-ver=/nix/store/$HASH1-nlohmann-json-ver + -fmacro-prefix-map=/nix/... + +In practice it quickly exhausts argument length limit due to `gcc` +deficiency: https://gcc.gnu.org/PR111527 + +Until it's fixed let's hardcode header mangling if $NIX_STORE variable +is present in the environment. + +Tested as: + + $ printf "# 0 \"/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-pppppp-vvvvvvv\" \nconst char * f(void) { return __FILE__; }" | NIX_STORE=/nix/store ./gcc/xgcc -Bgcc -x c - -S -o - + ... + .string "/nix/store/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-pppppp-vvvvvvv" + ... + +Mangled successfully. + +To reverse the effect of the mangle use new `NIX_GCC_DONT_MANGLE_PREFIX_MAP` +environment variable. It should not normally be needed. +--- a/gcc/file-prefix-map.cc ++++ b/gcc/file-prefix-map.cc +@@ -65,7 +65,7 @@ add_prefix_map (file_prefix_map *&maps, const char *arg, const char *opt) + remapping was performed. */ + + static const char * +-remap_filename (file_prefix_map *maps, const char *filename) ++remap_filename (file_prefix_map *maps, const char *filename, bool mangle_nix_store = false) + { + file_prefix_map *map; + char *s; +@@ -76,7 +76,31 @@ remap_filename (file_prefix_map *maps, const char *filename) + if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0) + break; + if (!map) +- return filename; ++ { ++ if (mangle_nix_store && getenv("NIX_GCC_DONT_MANGLE_PREFIX_MAP") == NULL) ++ { ++ /* Remap the 32 characters after $NIX_STORE/ to uppercase ++ * ++ * That way we avoid argument parameters explosion ++ * and still avoid embedding headers into runtime closure: ++ * https://gcc.gnu.org/PR111527 ++ */ ++ char * nix_store = getenv("NIX_STORE"); ++ size_t nix_store_len = nix_store ? strlen(nix_store) : 0; ++ const char * name = filename; ++ size_t name_len = strlen(name); ++ if (nix_store && name_len >= nix_store_len + 1 + 32 && memcmp(name, nix_store, nix_store_len) == 0) ++ { ++ s = (char *) ggc_alloc_atomic (name_len + 1); ++ memcpy(s, name, name_len + 1); ++ for (size_t i = nix_store_len + 1; i < nix_store_len + 1 + 32; i++) { ++ s[i] = TOUPPER(s[i]); ++ } ++ return s; ++ } ++ } ++ return filename; ++ } + name = filename + map->old_len; + name_len = strlen (name) + 1; + +@@ -129,7 +153,7 @@ add_profile_prefix_map (const char *arg) + const char * + remap_macro_filename (const char *filename) + { +- return remap_filename (macro_prefix_maps, filename); ++ return remap_filename (macro_prefix_maps, filename, true); + } + + /* Remap using -fdebug-prefix-map. Return the GC-allocated new name diff --git a/pkgs/by-name/gc/gcc/patches/13/ICE-PR110280.patch b/pkgs/by-name/gc/gcc/patches/13/ICE-PR110280.patch new file mode 100644 index 0000000..7338b3d --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/13/ICE-PR110280.patch @@ -0,0 +1,60 @@ +From f4029de35fb1b293a4fd586574b1b4b73ddf7880 Mon Sep 17 00:00:00 2001 +From: Prathamesh Kulkarni +Date: Wed, 26 Jul 2023 22:36:26 +0530 +Subject: [PATCH] [aarch64/match.pd] Fix ICE observed in PR110280. + +gcc/ChangeLog: + PR tree-optimization/110280 + * match.pd (vec_perm_expr(v, v, mask) -> v): Explicitly build vector + using build_vector_from_val with the element of input operand, and + mask's type if operand and mask's types don't match. + +gcc/testsuite/ChangeLog: + PR tree-optimization/110280 + * gcc.target/aarch64/sve/pr110280.c: New test. + +(cherry picked from commit 85d8e0d8d5342ec8b4e6a54e22741c30b33c6f04) +--- + gcc/match.pd | 9 ++++++++- + gcc/testsuite/gcc.target/aarch64/sve/pr110280.c | 12 ++++++++++++ + 2 files changed, 20 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr110280.c + +diff --git a/gcc/match.pd b/gcc/match.pd +index 9118244825054..c3bb4fbc0a7a2 100644 +--- a/gcc/match.pd ++++ b/gcc/match.pd +@@ -8292,7 +8292,14 @@ and, + + (simplify + (vec_perm vec_same_elem_p@0 @0 @1) +- @0) ++ (if (types_match (type, TREE_TYPE (@0))) ++ @0 ++ (with ++ { ++ tree elem = uniform_vector_p (@0); ++ } ++ (if (elem) ++ { build_vector_from_val (type, elem); })))) + + /* Push VEC_PERM earlier if that may help FMA perception (PR101895). */ + (simplify +diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr110280.c b/gcc/testsuite/gcc.target/aarch64/sve/pr110280.c +new file mode 100644 +index 0000000000000..d3279f383629f +--- /dev/null ++++ b/gcc/testsuite/gcc.target/aarch64/sve/pr110280.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O3 -fdump-tree-optimized" } */ ++ ++#include "arm_sve.h" ++ ++svuint32_t l() ++{ ++ _Alignas(16) const unsigned int lanes[4] = {0, 0, 0, 0}; ++ return svld1rq_u32(svptrue_b8(), lanes); ++} ++ ++/* { dg-final { scan-tree-dump-not "VEC_PERM_EXPR" "optimized" } } */ diff --git a/pkgs/by-name/gc/gcc/patches/13/mangle-NIX_STORE-in-__FILE__.patch b/pkgs/by-name/gc/gcc/patches/13/mangle-NIX_STORE-in-__FILE__.patch new file mode 100644 index 0000000..87613c2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/13/mangle-NIX_STORE-in-__FILE__.patch @@ -0,0 +1,97 @@ +From e160a8cd4a704f4b7724df02b62394f677cc4198 Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich +Date: Fri, 22 Sep 2023 22:41:49 +0100 +Subject: [PATCH] gcc/file-prefix-map.cc: always mangle __FILE__ into invalid + store path + +Without the change `__FILE__` used in static inline functions in headers +embed paths to header files into executable images. For local headers +it's not a problem, but for headers in `/nix/store` this causes `-dev` +inputs to be retained in runtime closure. + +Typical examples are `nix` -> `nlohmann_json` and `pipewire` -> +`lttng-ust.dev`. + +For this reason we want to remove the occurrences of hashes in the +expansion of `__FILE__`. `nuke-references` does it by replacing hashes +by `eeeeee...`. It is handy to be able to invert the transformation to +go back to the original store path. The chosen solution is to make the +hash uppercase: +- it does not trigger runtime references (except for all digit hashes, + which are unlikely enough) +- it visually looks like a bogus store path +- it is easy to find the original store path if required + +Ideally we would like to use `-fmacro-prefix-map=` feature of `gcc` as: + + -fmacro-prefix-map=/nix/store/$hash1-nlohmann-json-ver=/nix/store/$HASH1-nlohmann-json-ver + -fmacro-prefix-map=/nix/... + +In practice it quickly exhausts argument length limit due to `gcc` +deficiency: https://gcc.gnu.org/PR111527 + +Until it's fixed let's hardcode header mangling if $NIX_STORE variable +is present in the environment. + +Tested as: + + $ printf "# 0 \"/nix/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-pppppp-vvvvvvv\" \nconst char * f(void) { return __FILE__; }" | NIX_STORE=/nix/store ./gcc/xgcc -Bgcc -x c - -S -o - + ... + .string "/nix/store/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-pppppp-vvvvvvv" + ... + +Mangled successfully. + +To reverse the effect of the mangle use new `NIX_GCC_DONT_MANGLE_PREFIX_MAP` +environment variable. It should not normally be needed. +--- a/gcc/file-prefix-map.cc ++++ b/gcc/file-prefix-map.cc +@@ -74,7 +74,7 @@ add_prefix_map (file_prefix_map *&maps, const char *arg, const char *opt) + remapping was performed. */ + + static const char * +-remap_filename (file_prefix_map *maps, const char *filename) ++remap_filename (file_prefix_map *maps, const char *filename, bool mangle_nix_store = false) + { + file_prefix_map *map; + char *s; +@@ -102,6 +102,30 @@ remap_filename (file_prefix_map *maps, const char *filename) + break; + if (!map) + { ++ if (mangle_nix_store && getenv("NIX_GCC_DONT_MANGLE_PREFIX_MAP") == NULL) ++ { ++ /* Remap all fo $NIX_STORE/.{32} paths to uppercase ++ * ++ * That way we avoid argument parameters explosion ++ * and still avoid embedding headers into runtime closure: ++ * https://gcc.gnu.org/PR111527 ++ */ ++ char * nix_store = getenv("NIX_STORE"); ++ size_t nix_store_len = nix_store ? strlen(nix_store) : 0; ++ const char * name = realname ? realname : filename; ++ size_t name_len = strlen(name); ++ if (nix_store && name_len >= nix_store_len + 1 + 32 && memcmp(name, nix_store, nix_store_len) == 0) ++ { ++ s = (char *) ggc_alloc_atomic (name_len + 1); ++ memcpy(s, name, name_len + 1); ++ for (size_t i = nix_store_len + 1; i < nix_store_len + 1 + 32; i++) { ++ s[i] = TOUPPER(s[i]); ++ } ++ if (realname != filename) ++ free (const_cast (realname)); ++ return s; ++ } ++ } + if (realname != filename) + free (const_cast (realname)); + return filename; +@@ -163,7 +187,7 @@ add_profile_prefix_map (const char *arg) + const char * + remap_macro_filename (const char *filename) + { +- return remap_filename (macro_prefix_maps, filename); ++ return remap_filename (macro_prefix_maps, filename, true); + } + + /* Remap using -fdebug-prefix-map. Return the GC-allocated new name diff --git a/pkgs/by-name/gc/gcc/patches/13/no-sys-dirs-riscv.patch b/pkgs/by-name/gc/gcc/patches/13/no-sys-dirs-riscv.patch new file mode 100644 index 0000000..add4d59 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/13/no-sys-dirs-riscv.patch @@ -0,0 +1,13 @@ +--- a/gcc/config/riscv/linux.h ++++ b/gcc/config/riscv/linux.h +@@ -69,9 +69,5 @@ + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack + +-#define STARTFILE_PREFIX_SPEC \ +- "/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/lib/ " \ +- "/usr/lib/ " ++#define STARTFILE_PREFIX_SPEC "" + diff --git a/pkgs/by-name/gc/gcc/patches/4.9/darwin-clang-as.patch b/pkgs/by-name/gc/gcc/patches/4.9/darwin-clang-as.patch new file mode 100644 index 0000000..095713e --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/4.9/darwin-clang-as.patch @@ -0,0 +1,16 @@ +diff -ur a/libgcc/config/t-darwin b/libgcc/config/t-darwin +--- a/libgcc/config/t-darwin 2012-07-14 09:50:59.000000000 -0400 ++++ b/libgcc/config/t-darwin 2023-11-05 21:26:11.696825584 -0500 +@@ -7,12 +7,6 @@ + crttme.o: $(srcdir)/config/darwin-crt-tm.c + $(crt_compile) $(DARWIN_EXTRA_CRT_BUILD_CFLAGS) -DEND -c $< + +-# -pipe because there's an assembler bug, 4077127, which causes +-# it to not properly process the first # directive, causing temporary +-# file names to appear in stabs, causing the bootstrap to fail. Using -pipe +-# works around this by not having any temporary file names. +-HOST_LIBGCC2_CFLAGS += -pipe +- + # Use unwind-dw2-fde-darwin + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/config/unwind-dw2-fde-darwin.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c diff --git a/pkgs/by-name/gc/gcc/patches/4.9/libsanitizer.patch b/pkgs/by-name/gc/gcc/patches/4.9/libsanitizer.patch new file mode 100644 index 0000000..f1a438a --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/4.9/libsanitizer.patch @@ -0,0 +1,24 @@ +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +index aec950454..5bda9b3a3 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -156,18 +156,13 @@ namespace __sanitizer { + #elif defined(__sparc__) + # if defined(__arch64__) + unsigned mode; +- unsigned short __pad1; +-# else +- unsigned short __pad1; +- unsigned short mode; + unsigned short __pad2; + # endif + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; + #else +- unsigned short mode; +- unsigned short __pad1; ++ unsigned int mode; + unsigned short __seq; + unsigned short __pad2; + #if defined(__x86_64__) && !defined(_LP64) diff --git a/pkgs/by-name/gc/gcc/patches/4.9/parallel-strsignal.patch b/pkgs/by-name/gc/gcc/patches/4.9/parallel-strsignal.patch new file mode 100644 index 0000000..4c98ca2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/4.9/parallel-strsignal.patch @@ -0,0 +1,61 @@ +gcc/Makefile.in: fix parallel building failure + +The gcc-ar.o, gcc-nm.o, gcc-ranlib.o and errors.o included +config.h which was a generated file. But no explicity rule +to clarify the dependency. There was potential building +failure while parallel make. + +For gcc-ar.o, gcc-nm.o and gcc-ranlib.o, they were compiled from one C +source file gcc-ar.c, we add them to ALL_HOST_BACKEND_OBJS, so the +'$(ALL_HOST_OBJS) : | $(generated_files)' rule could work for these +objects. + +For errors.o, it is part of gengtype, and the gengtype generator program +is special: Two versions are built. One is for the build machine, and one +is for the host. We refered what gengtype-parse.o did (which also is part +of gengtype). + +[GCC #61899] +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61899 + +Upstream-Status: Send to gcc-patches@gcc.gnu.org mailing list + +Signed-off-by: Hongxu Jia +--- + gcc/Makefile.in | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/gcc/Makefile.in b/gcc/Makefile.in +index 6475cba..56e50bb 100644 +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -1481,13 +1481,16 @@ OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \ + opts.o opts-common.o options.o vec.o hooks.o common/common-targhooks.o \ + hash-table.o file-find.o + ++# Objects compiled from one C source file gcc-ar.c ++OBJS-gcc-ar = gcc-ar.o gcc-nm.o gcc-ranlib.o ++ + # This lists all host objects for the front ends. + ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS)) + + ALL_HOST_BACKEND_OBJS = $(GCC_OBJS) $(OBJS) $(OBJS-libcommon) \ + $(OBJS-libcommon-target) @TREEBROWSER@ main.o c-family/cppspec.o \ + $(COLLECT2_OBJS) $(EXTRA_GCC_OBJS) $(GCOV_OBJS) $(GCOV_DUMP_OBJS) \ +- lto-wrapper.o ++ lto-wrapper.o $(OBJS-gcc-ar) + + # This lists all host object files, whether they are included in this + # compilation or not. +@@ -2437,6 +2440,8 @@ gengtype-parse.o: $(CONFIG_H) + CFLAGS-build/gengtype-parse.o += -DGENERATOR_FILE + build/gengtype-parse.o: $(BCONFIG_H) + ++errors.o : $(CONFIG_H) ++ + gengtype-state.o build/gengtype-state.o: gengtype-state.c $(SYSTEM_H) \ + gengtype.h errors.h double-int.h version.h $(HASHTAB_H) $(OBSTACK_H) \ + $(XREGEX_H) +-- +1.8.1.2 + diff --git a/pkgs/by-name/gc/gcc/patches/6/0001-Fix-build-for-glibc-2.31.patch b/pkgs/by-name/gc/gcc/patches/6/0001-Fix-build-for-glibc-2.31.patch new file mode 100644 index 0000000..0cd04e2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/6/0001-Fix-build-for-glibc-2.31.patch @@ -0,0 +1,62 @@ +From 8b55f1047cf3491429c1af607e5dac08a81db6e1 Mon Sep 17 00:00:00 2001 +From: Maximilian Bosch +Date: Thu, 20 Feb 2020 15:08:36 +0100 +Subject: [PATCH] Fix build for glibc 2.31 + +--- + .../sanitizer_platform_limits_posix.cc | 5 +++-- + .../sanitizer_platform_limits_posix.h | 15 +-------------- + 2 files changed, 4 insertions(+), 16 deletions(-) + +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +index 069d8d557..c49c28c6e 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -1130,8 +1130,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, cgid); + #ifndef __GLIBC_PREREQ + #define __GLIBC_PREREQ(x, y) 0 + #endif +-#if !defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21) +-/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */ ++#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31) ++/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit ++ on many architectures. */ + CHECK_SIZE_AND_OFFSET(ipc_perm, mode); + #endif + +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +index 304d04e39..568081a79 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -200,27 +200,14 @@ namespace __sanitizer { + unsigned __seq; + u64 __unused1; + u64 __unused2; +-#elif defined(__mips__) || defined(__aarch64__) +- unsigned int mode; +- unsigned short __seq; +- unsigned short __pad1; +- unsigned long __unused1; +- unsigned long __unused2; + #elif defined(__sparc__) +-# if defined(__arch64__) + unsigned mode; +- unsigned short __pad1; +-# else +- unsigned short __pad1; +- unsigned short mode; + unsigned short __pad2; +-# endif + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; + #else +- unsigned short mode; +- unsigned short __pad1; ++ unsigned int mode; + unsigned short __seq; + unsigned short __pad2; + #if defined(__x86_64__) && !defined(_LP64) +-- +2.25.0 + diff --git a/pkgs/by-name/gc/gcc/patches/6/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/6/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..25e3a90 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/6/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,285 @@ +From 30534f48c6ede142dad0008d1641392d82b8a137 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Mon, 18 Apr 2016 11:50:55 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + 15 files changed, 71 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 858b878d4b3..6f745790d64 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1722,6 +1722,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index fe11333a2d1..cac85802f38 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index e04818966fa..7b75a372506 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 954673c1c43..6b5667f1c70 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11702,7 +11702,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index 4c65d441e72..e6fa04ada4f 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1593,7 +1593,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index eab2765d7fd..f4058b6f4a2 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -124,7 +124,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 2b139b8befc..fb18d2a042e 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -712,6 +712,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -736,6 +739,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index e7d6c75a6f7..664d0f852c4 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5077,6 +5077,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index b5ae4213f94..c484d3aee5f 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15177,6 +15177,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index e6520c1094f..3d6907796dd 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++extern "C" int ++__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -163,3 +179,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 9b617998ffe..a441fdbb616 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \ +@@ -424,3 +445,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +-- +2.12.1 + diff --git a/pkgs/by-name/gc/gcc/patches/6/gnat-glibc234.patch b/pkgs/by-name/gc/gcc/patches/6/gnat-glibc234.patch new file mode 100644 index 0000000..2d29cd7 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/6/gnat-glibc234.patch @@ -0,0 +1,30 @@ +Fix build with glibc 2.34. Adapted from: +https://github.com/gcc-mirror/gcc/commit/331763de7d4850702a0f67298f36017c73cdb103 +--- a/gcc/ada/init.c ++++ b/gcc/ada/init.c +@@ -579,12 +579,8 @@ + + #ifndef __ia64__ + #define HAVE_GNAT_ALTERNATE_STACK 1 +-/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. +- It must be larger than MINSIGSTKSZ and hopefully near 2 * SIGSTKSZ. */ +-# if 16 * 1024 < MINSIGSTKSZ +-# error "__gnat_alternate_stack too small" +-# endif +-char __gnat_alternate_stack[16 * 1024]; ++/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. */ ++char __gnat_alternate_stack[32 * 1024]; + #endif + + #ifdef __XENO__ +--- a/gcc/ada/s-osinte-linux.ads ++++ b/gcc/ada/s-osinte-linux.ads +@@ -328,7 +328,7 @@ + oss : access stack_t) return int; + pragma Import (C, sigaltstack, "sigaltstack"); + +- Alternate_Stack_Size : constant := 16 * 1024; ++ Alternate_Stack_Size : constant := 32 * 1024; + -- This must be in keeping with init.c:__gnat_alternate_stack + + Alternate_Stack : aliased char_array (1 .. Alternate_Stack_Size); diff --git a/pkgs/by-name/gc/gcc/patches/6/gogcc-workaround-glibc-2.36.patch b/pkgs/by-name/gc/gcc/patches/6/gogcc-workaround-glibc-2.36.patch new file mode 100644 index 0000000..bc11f99 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/6/gogcc-workaround-glibc-2.36.patch @@ -0,0 +1,14 @@ +diff --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh +index dd456e907..24e607c7b 100755 +--- a/libgo/mksysinfo.sh ++++ b/libgo/mksysinfo.sh +@@ -148,9 +148,6 @@ cat > sysinfo.c < + #endif +-#if defined(HAVE_LINUX_FS_H) +-#include +-#endif + #if defined(HAVE_LINUX_REBOOT_H) + #include + #endif diff --git a/pkgs/by-name/gc/gcc/patches/6/libstdc++-disable-flat_namespace.patch b/pkgs/by-name/gc/gcc/patches/6/libstdc++-disable-flat_namespace.patch new file mode 100644 index 0000000..5716444 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/6/libstdc++-disable-flat_namespace.patch @@ -0,0 +1,26 @@ +Backported from GCC 7. + +diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host +index 304a7f5aff6..d1a189d93d0 100644 +--- a/libstdc++-v3/configure.host ++++ b/libstdc++-v3/configure.host +@@ -234,7 +234,7 @@ case "${host_os}" in + os_include_dir="os/newlib" + OPT_LDFLAGS="${OPT_LDFLAGS} \$(lt_host_flags)" + ;; +- darwin | darwin[1-7] | darwin[1-7].*) ++ darwin[1-7] | darwin[1-7].*) + # On Darwin, performance is improved if libstdc++ is single-module. + # Up to at least 10.3.7, -flat_namespace is required for proper + # treatment of coalesced symbols. +@@ -252,6 +252,10 @@ case "${host_os}" in + esac + os_include_dir="os/bsd/darwin" + ;; ++ darwin*) ++ # Post Darwin8, defaults should be sufficient. ++ os_include_dir="os/bsd/darwin" ++ ;; + *djgpp*) # leading * picks up "msdosdjgpp" + os_include_dir="os/djgpp" + error_constants_dir="os/djgpp" diff --git a/pkgs/by-name/gc/gcc/patches/7/0001-Fix-build-for-glibc-2.31.patch b/pkgs/by-name/gc/gcc/patches/7/0001-Fix-build-for-glibc-2.31.patch new file mode 100644 index 0000000..d8aad14 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/7/0001-Fix-build-for-glibc-2.31.patch @@ -0,0 +1,62 @@ +From 2d03b6eaf823fc2db6a32b4a95e18f8a7474b47f Mon Sep 17 00:00:00 2001 +From: Maximilian Bosch +Date: Thu, 20 Feb 2020 01:56:42 +0100 +Subject: [PATCH] Fix build for glibc 2.31 + +--- + .../sanitizer_platform_limits_posix.cc | 5 +++-- + .../sanitizer_platform_limits_posix.h | 15 +-------------- + 2 files changed, 4 insertions(+), 16 deletions(-) + +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +index 97eae3fc7..4089d4695 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -1145,8 +1145,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid); + CHECK_SIZE_AND_OFFSET(ipc_perm, gid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cuid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cgid); +-#if !defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21) +-/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */ ++#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31) ++/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit ++ on many architectures. */ + CHECK_SIZE_AND_OFFSET(ipc_perm, mode); + #endif + +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +index c13932283..3456fb2db 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -204,27 +204,14 @@ namespace __sanitizer { + unsigned __seq; + u64 __unused1; + u64 __unused2; +-#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__) +- unsigned int mode; +- unsigned short __seq; +- unsigned short __pad1; +- unsigned long __unused1; +- unsigned long __unused2; + #elif defined(__sparc__) +-# if defined(__arch64__) + unsigned mode; +- unsigned short __pad1; +-# else +- unsigned short __pad1; +- unsigned short mode; + unsigned short __pad2; +-# endif + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; + #else +- unsigned short mode; +- unsigned short __pad1; ++ unsigned int mode; + unsigned short __seq; + unsigned short __pad2; + #if defined(__x86_64__) && !defined(_LP64) +-- +2.25.0 + diff --git a/pkgs/by-name/gc/gcc/patches/7/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/7/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..0c5d0ee --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/7/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,285 @@ +From d3cb66e4751fcbd581b81a14a973de2d78fc02ad Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Mon, 18 Apr 2016 11:50:55 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + 15 files changed, 71 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 8f91197f34e..59db37cac04 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1719,6 +1719,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 270ec0dd037..88966f79695 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index e5f014cb473..989cfbe894e 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index ea73b151a4e..317200e5620 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11681,7 +11681,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index 9d4c792a33f..d51899a5676 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index b8af3ab2546..73248438a8c 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -125,7 +125,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index b279a6458f9..20d22f585da 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -710,6 +710,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -734,6 +737,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index 45c459788c3..8fc569ef16e 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5086,6 +5086,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index 2406cb9d946..50e7e4ced89 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15182,6 +15182,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index 923a0707556..a55d85aad2d 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++extern "C" int ++__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 19953bc52f0..72fd5f26d5b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +-- +2.12.1 + diff --git a/pkgs/by-name/gc/gcc/patches/7/gcc8-asan-glibc-2.34.patch b/pkgs/by-name/gc/gcc/patches/7/gcc8-asan-glibc-2.34.patch new file mode 100644 index 0000000..5645b97 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/7/gcc8-asan-glibc-2.34.patch @@ -0,0 +1,70 @@ +From ef195a39d0d3b929cc676302d074b42c25460601 Mon Sep 17 00:00:00 2001 +From: Jakub Jelinek +Date: Sat, 17 Apr 2021 11:27:14 +0200 +Subject: [PATCH] sanitizer: Fix asan against glibc 2.34 [PR100114] + +As mentioned in the PR, SIGSTKSZ is no longer a compile time constant in +glibc 2.34 and later, so +static const uptr kAltStackSize = SIGSTKSZ * 4; +needs dynamic initialization, but is used by a function called indirectly +from .preinit_array and therefore before the variable is constructed. +This results in using 0 size instead and all asan instrumented programs +die with: +==91==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22) + +Here is a cherry-pick from upstream to fix this. + +2021-04-17 Jakub Jelinek + + PR sanitizer/100114 + * sanitizer_common/sanitizer_posix_libcdep.cc: Cherry-pick + llvm-project revisions 82150606fb11d28813ae6da1101f5bda638165fe + and b93629dd335ffee2fc4b9b619bf86c3f9e6b0023. + +(cherry picked from commit 950bac27d63c1c2ac3a6ed867692d6a13f21feb3) +--- + .../sanitizer_common/sanitizer_posix_libcdep.cc | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc +index 1a37118c299..066079b3954 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc +@@ -159,7 +159,11 @@ bool SupportsColoredOutput(fd_t fd) { + + #if !SANITIZER_GO + // TODO(glider): different tools may require different altstack size. +-static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough. ++static uptr GetAltStackSize() { ++ // SIGSTKSZ is not enough. ++ static const uptr kAltStackSize = SIGSTKSZ * 4; ++ return kAltStackSize; ++} + + void SetAlternateSignalStack() { + stack_t altstack, oldstack; +@@ -170,10 +174,9 @@ void SetAlternateSignalStack() { + // TODO(glider): the mapped stack should have the MAP_STACK flag in the + // future. It is not required by man 2 sigaltstack now (they're using + // malloc()). +- void* base = MmapOrDie(kAltStackSize, __func__); +- altstack.ss_sp = (char*) base; ++ altstack.ss_size = GetAltStackSize(); ++ altstack.ss_sp = (char *)MmapOrDie(altstack.ss_size, __func__); + altstack.ss_flags = 0; +- altstack.ss_size = kAltStackSize; + CHECK_EQ(0, sigaltstack(&altstack, nullptr)); + } + +@@ -181,7 +184,7 @@ void UnsetAlternateSignalStack() { + stack_t altstack, oldstack; + altstack.ss_sp = nullptr; + altstack.ss_flags = SS_DISABLE; +- altstack.ss_size = kAltStackSize; // Some sane value required on Darwin. ++ altstack.ss_size = GetAltStackSize(); // Some sane value required on Darwin. + CHECK_EQ(0, sigaltstack(&altstack, &oldstack)); + UnmapOrDie(oldstack.ss_sp, oldstack.ss_size); + } +-- +2.27.0 + diff --git a/pkgs/by-name/gc/gcc/patches/7/riscv-no-relax.patch b/pkgs/by-name/gc/gcc/patches/7/riscv-no-relax.patch new file mode 100644 index 0000000..93d9cd1 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/7/riscv-no-relax.patch @@ -0,0 +1,109 @@ +commit e7c570f37384d824cb9725f237920e9691e57269 +gpg: Signature made Tue 06 Mar 2018 04:52:46 PM PST +gpg: using RSA key 00CE76D1834960DFCE886DF8EF4CA1502CCBAB41 +gpg: issuer "palmer@dabbelt.com" +gpg: Good signature from "Palmer Dabbelt " [ultimate] +gpg: aka "Palmer Dabbelt " [ultimate] +Author: Palmer Dabbelt +Date: Thu Mar 1 12:01:06 2018 -0800 + + RISC-V: Add and document the "-mno-relax" option + + RISC-V relies on aggressive linker relaxation to get good code size. As + a result no text symbol addresses can be known until link time, which + means that alignment must be handled during the link. This alignment + pass is essentially just another linker relaxation, so this has the + unfortunate side effect that linker relaxation is required for + correctness on many RISC-V targets. + + The RISC-V assembler has supported an ".option norelax" for a long time + because there are situations in which linker relaxation is a bad idea -- + the canonical example is when trying to materialize the initial value of + the global pointer into a register, which would otherwise be relaxed to + a NOP. We've been relying on users who want to disable relaxation for + an entire link to pass "-Wl,--no-relax", but that still relies on the + linker relaxing R_RISCV_ALIGN to handle alignment despite it not being + strictly necessary. + + This patch adds a GCC option, "-mno-relax", that disable linker + relaxation by adding ".option norelax" to the top of every generated + assembly file. The assembler is smart enough to handle alignment at + assemble time for files that have never emitted a relaxable relocation, + so this is sufficient to really disable all relaxations in the linker, + which results in significantly faster link times for large objects. + + This also has the side effect of allowing toolchains that don't support + linker relaxation (LLVM and the Linux module loader) to function + correctly. Toolchains that don't support linker relaxation should + default to "-mno-relax" and error when presented with any R_RISCV_ALIGN + relocation as those need to be handled for correctness. + + gcc/ChangeLog + + 2018-03-01 Palmer Dabbelt + + * config/riscv/riscv.opt (mrelax): New option. + * config/riscv/riscv.c (riscv_file_start): Emit ".option + "norelax" when riscv_mrelax is disabled. + * doc/invoke.texi (RISC-V): Document "-mrelax" and "-mno-relax". + +diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c +index c38f6c394d54..3e81874de232 100644 +--- a/gcc/config/riscv/riscv.c ++++ b/gcc/config/riscv/riscv.c +@@ -3979,6 +3979,11 @@ riscv_file_start (void) + + /* Instruct GAS to generate position-[in]dependent code. */ + fprintf (asm_out_file, "\t.option %spic\n", (flag_pic ? "" : "no")); ++ ++ /* If the user specifies "-mno-relax" on the command line then disable linker ++ relaxation in the assembler. */ ++ if (! riscv_mrelax) ++ fprintf (asm_out_file, "\t.option norelax\n"); + } + + /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text +diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt +index 581a26bb5c1e..b37ac75d9bb4 100644 +--- a/gcc/config/riscv/riscv.opt ++++ b/gcc/config/riscv/riscv.opt +@@ -106,6 +106,11 @@ mexplicit-relocs + Target Report Mask(EXPLICIT_RELOCS) + Use %reloc() operators, rather than assembly macros, to load addresses. + ++mrelax ++Target Bool Var(riscv_mrelax) Init(1) ++Take advantage of linker relaxations to reduce the number of instructions ++required to materialize symbol addresses. ++ + Mask(64BIT) + + Mask(MUL) +diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi +index 8d366c626bae..deb48af2ecad 100644 +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -1042,7 +1042,8 @@ See RS/6000 and PowerPC Options. + -msave-restore -mno-save-restore @gol + -mstrict-align -mno-strict-align @gol + -mcmodel=medlow -mcmodel=medany @gol +--mexplicit-relocs -mno-explicit-relocs @gol} ++-mexplicit-relocs -mno-explicit-relocs @gol ++-mrelax -mno-relax @gol} + + @emph{RL78 Options} + @gccoptlist{-msim -mmul=none -mmul=g13 -mmul=g14 -mallregs @gol +@@ -23102,6 +23103,12 @@ Use or do not use assembler relocation operators when dealing with symbolic + addresses. The alternative is to use assembler macros instead, which may + limit optimization. + ++@item -mrelax ++@itemx -mno-relax ++Take advantage of linker relaxations to reduce the number of instructions ++required to materialize symbol addresses. The default is to take advantage of ++linker relaxations. ++ + @end table + + @node RL78 Options + diff --git a/pkgs/by-name/gc/gcc/patches/7/riscv-pthread-reentrant.patch b/pkgs/by-name/gc/gcc/patches/7/riscv-pthread-reentrant.patch new file mode 100644 index 0000000..c7527ff --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/7/riscv-pthread-reentrant.patch @@ -0,0 +1,13 @@ +Index: gcc/config/riscv/linux.h +=================================================================== +--- a/gcc/config/riscv/linux.h (revision 257620) ++++ b/gcc/config/riscv/linux.h (revision 257621) +@@ -47,6 +47,8 @@ + + #define ICACHE_FLUSH_FUNC "__riscv_flush_icache" + ++#define CPP_SPEC "%{pthread:-D_REENTRANT}" ++ + #define LINK_SPEC "\ + -melf" XLEN_SPEC "lriscv \ + %{shared} \ diff --git a/pkgs/by-name/gc/gcc/patches/8/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/8/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..d9809e8 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/8/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++extern "C" int ++__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/by-name/gc/gcc/patches/8/avr-gcc-8-darwin.patch b/pkgs/by-name/gc/gcc/patches/8/avr-gcc-8-darwin.patch new file mode 100644 index 0000000..3705ed9 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/8/avr-gcc-8-darwin.patch @@ -0,0 +1,16 @@ +From https://gist.githubusercontent.com/DavidEGrayson/88bceb3f4e62f45725ecbb9248366300/raw/c1f515475aff1e1e3985569d9b715edb0f317648/gcc-11-arm-darwin.patch + +diff -ur a/gcc/config/host-darwin.c b/gcc/config/host-darwin.c +--- a/gcc/config/host-darwin.c 2021-04-27 03:00:13.000000000 -0700 ++++ b/gcc/config/host-darwin.c 2021-06-11 14:49:13.754000000 -0700 +@@ -22,6 +22,10 @@ + #include "coretypes.h" + #include "diagnostic-core.h" + #include "config/host-darwin.h" ++#include "hosthooks.h" ++#include "hosthooks-def.h" ++ ++const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER; + + /* Yes, this is really supposed to work. */ + /* This allows for a pagesize of 16384, which we have on Darwin20, but should \ No newline at end of file diff --git a/pkgs/by-name/gc/gcc/patches/8/gcc8-darwin-as-gstabs.patch b/pkgs/by-name/gc/gcc/patches/8/gcc8-darwin-as-gstabs.patch new file mode 100644 index 0000000..1ac870e --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/8/gcc8-darwin-as-gstabs.patch @@ -0,0 +1,96 @@ +Backported from https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=b2cee5e1e89c8f939bc36fe9756befcb93d96982 + +diff -ur a/gcc/config/darwin.h b/gcc/config/darwin.h +--- a/gcc/config/darwin.h 2021-05-14 04:42:08.000000000 -0400 ++++ b/gcc/config/darwin.h 2023-11-06 08:53:27.629155053 -0500 +@@ -233,12 +233,18 @@ + + #define DSYMUTIL "\ndsymutil" + ++/* Spec that controls whether the debug linker is run automatically for ++ a link step. This needs to be done if there is a source file on the ++ command line which will result in a temporary object (and debug is ++ enabled). */ ++ + #define DSYMUTIL_SPEC \ + "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ + %{v} \ +- %{gdwarf-2:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ +- %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm: \ +- %{gdwarf-2:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" ++ %{g*:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ ++ %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm|.s|.f|.f90|\ ++ .f95|.f03|.f77|.for|.F|.F90|.F95|.F03: \ ++ %{g*:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" + + #define LINK_COMMAND_SPEC LINK_COMMAND_SPEC_A DSYMUTIL_SPEC + +@@ -469,18 +475,31 @@ + /* Default ASM_DEBUG_SPEC. Darwin's as cannot currently produce dwarf + debugging data. */ + ++#ifdef HAS_AS_STABS_DIRECTIVE ++/* We only pass a debug option to the assembler if that supports stabs, since ++ dwarf is not uniformly supported in the assemblers. */ + #define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):%{!gdwarf*:--gstabs}}}" ++#else ++#define ASM_DEBUG_SPEC "" ++#endif ++ ++#undef ASM_DEBUG_OPTION_SPEC ++#define ASM_DEBUG_OPTION_SPEC "" ++ + #define ASM_FINAL_SPEC \ + "%{gsplit-dwarf:%ngsplit-dwarf is not supported on this platform } %. */ + +-/* Prefer DWARF2. */ +-#undef PREFERRED_DEBUGGING_TYPE +-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG +-#define DARWIN_PREFER_DWARF +- +-/* Since DWARF2 is default, conditions for running dsymutil are different. */ +-#undef DSYMUTIL_SPEC +-#define DSYMUTIL_SPEC \ +- "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ +- %{v} \ +- %{g*:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ +- %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm|.s|.f|.f90|.f95|.f03|.f77|.for|.F|.F90|.F95|.F03: \ +- %{g*:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" +- +-/* Tell collect2 to run dsymutil for us as necessary. */ +-#define COLLECT_RUN_DSYMUTIL 1 +- +-/* Only ask as for debug data if the debug style is stabs (since as doesn't +- yet generate dwarf.) */ +- +-#undef ASM_DEBUG_SPEC +-#define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):%{gstabs:--gstabs}}}" +- + #undef ASM_OUTPUT_ALIGNED_COMMON + #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ + do { \ diff --git a/pkgs/by-name/gc/gcc/patches/9/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/by-name/gc/gcc/patches/9/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 0000000..d9809e8 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/9/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++extern "C" int ++__cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/by-name/gc/gcc/patches/9/fix-struct-redefinition-on-glibc-2.36.patch b/pkgs/by-name/gc/gcc/patches/9/fix-struct-redefinition-on-glibc-2.36.patch new file mode 100644 index 0000000..5b4abfd --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/9/fix-struct-redefinition-on-glibc-2.36.patch @@ -0,0 +1,31 @@ +Derived from ../11/fix-struct-redefinition-on-glibc-2.36.patch (upstream commit d2356ebb0084a0d80dbfe33040c9afe938c15d19) + +diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +index e8fce8a02..cb1ac806e 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -65,7 +65,9 @@ + #include + #include + #include ++#if SANITIZER_ANDROID + #include ++#endif + #include + #include + #include +@@ -846,10 +848,10 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + unsigned IOCTL_EVIOCGPROP = IOCTL_NOT_PRESENT; + unsigned IOCTL_EVIOCSKEYCODE_V2 = IOCTL_NOT_PRESENT; + #endif +- unsigned IOCTL_FS_IOC_GETFLAGS = FS_IOC_GETFLAGS; +- unsigned IOCTL_FS_IOC_GETVERSION = FS_IOC_GETVERSION; +- unsigned IOCTL_FS_IOC_SETFLAGS = FS_IOC_SETFLAGS; +- unsigned IOCTL_FS_IOC_SETVERSION = FS_IOC_SETVERSION; ++ unsigned IOCTL_FS_IOC_GETFLAGS = _IOR('f', 1, long); ++ unsigned IOCTL_FS_IOC_GETVERSION = _IOR('v', 1, long); ++ unsigned IOCTL_FS_IOC_SETFLAGS = _IOW('f', 2, long); ++ unsigned IOCTL_FS_IOC_SETVERSION = _IOW('v', 2, long); + unsigned IOCTL_GIO_CMAP = GIO_CMAP; + unsigned IOCTL_GIO_FONT = GIO_FONT; + unsigned IOCTL_GIO_UNIMAP = GIO_UNIMAP; diff --git a/pkgs/by-name/gc/gcc/patches/9/gcc9-darwin-as-gstabs.patch b/pkgs/by-name/gc/gcc/patches/9/gcc9-darwin-as-gstabs.patch new file mode 100644 index 0000000..454139c --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/9/gcc9-darwin-as-gstabs.patch @@ -0,0 +1,99 @@ +Backported from https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=b2cee5e1e89c8f939bc36fe9756befcb93d96982 + +diff -ur a/gcc/config/darwin.h b/gcc/config/darwin.h +--- a/gcc/config/darwin.h 2022-05-27 03:21:10.947379000 -0400 ++++ b/gcc/config/darwin.h 2023-11-06 12:18:27.209236423 -0500 +@@ -230,12 +230,18 @@ + + #define DSYMUTIL "\ndsymutil" + ++/* Spec that controls whether the debug linker is run automatically for ++ a link step. This needs to be done if there is a source file on the ++ command line which will result in a temporary object (and debug is ++ enabled). */ ++ + #define DSYMUTIL_SPEC \ + "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ + %{v} \ +- %{gdwarf-2:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ +- %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm: \ +- %{gdwarf-2:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" ++ %{g*:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ ++ %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm|.s|.f|.f90|\ ++ .f95|.f03|.f77|.for|.F|.F90|.F95|.F03: \ ++ %{g*:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" + + #define LINK_COMMAND_SPEC LINK_COMMAND_SPEC_A DSYMUTIL_SPEC + +@@ -463,21 +469,31 @@ + %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \ + %{static}" ASM_MMACOSX_VERSION_MIN_SPEC + +-/* Default ASM_DEBUG_SPEC. Darwin's as cannot currently produce dwarf +- debugging data. */ +- ++#ifdef HAS_AS_STABS_DIRECTIVE ++/* We only pass a debug option to the assembler if that supports stabs, since ++ dwarf is not uniformly supported in the assemblers. */ + #define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):%{!gdwarf*:--gstabs}}}" ++#else ++#define ASM_DEBUG_SPEC "" ++#endif ++ ++#undef ASM_DEBUG_OPTION_SPEC ++#define ASM_DEBUG_OPTION_SPEC "" ++ + #define ASM_FINAL_SPEC \ + "%{gsplit-dwarf:%ngsplit-dwarf is not supported on this platform} %. */ + +-/* Prefer DWARF2. */ +-#undef PREFERRED_DEBUGGING_TYPE +-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG +-#define DARWIN_PREFER_DWARF +- +-/* Since DWARF2 is default, conditions for running dsymutil are different. */ +-#undef DSYMUTIL_SPEC +-#define DSYMUTIL_SPEC \ +- "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ +- %{v} \ +- %{g*:%{!gstabs*:%{%:debug-level-gt(0): -idsym}}}\ +- %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm|.s|.f|.f90|.f95|.f03|.f77|.for|.F|.F90|.F95|.F03: \ +- %{g*:%{!gstabs*:%{%:debug-level-gt(0): -dsym}}}}}}}}}}}" +- +-/* Tell collect2 to run dsymutil for us as necessary. */ +-#define COLLECT_RUN_DSYMUTIL 1 +- +-/* Only ask as for debug data if the debug style is stabs (since as doesn't +- yet generate dwarf.) */ +- +-#undef ASM_DEBUG_SPEC +-#define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):%{gstabs:--gstabs}}}" +- + #undef ASM_OUTPUT_ALIGNED_COMMON + #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ + do { \ diff --git a/pkgs/by-name/gc/gcc/patches/ada-cctools-as-detection-configure.patch b/pkgs/by-name/gc/gcc/patches/ada-cctools-as-detection-configure.patch new file mode 100644 index 0000000..e6b5b36 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/ada-cctools-as-detection-configure.patch @@ -0,0 +1,33 @@ +As originally implemented, the error message check +described in the configure script +breaks detection of Ada compiler support on x86_64-darwin, +because the assembler in the version of cctools currently used +unconditionally emits a deprecation message to stdout, +with no way to disable it. + +Furthermore, GCC 3.4 was the minimum version needed to build GNAT +as far back as GCC 4.4 (see the GCC git repo, tags/releases/gcc-4.4.0, +gcc/doc/install.texi, lines 2052-2053 [1]); +GCC 3.4 is newer than any of the broken GCC versions +that the configure script works around +(see the part of the comment in the configure script +before the context in the patch below), +and GCC 4.4 is older than any GCC that Nix currently packages (GCC 4.8). + +We therefore choose to not check for error messages, +and just check for an error code. +There's no harm in still checking for an object file being created, though. + +[1]: https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/doc/install.texi;h=6bdfbece981f7fb6c26da672d45e5d3ba7879c69;hb=b7fc996728085c0591ea7c5d0e1c84a8f6a29bd8#l2052 +--- a/configure 2022-08-19 18:09:52.000000000 +1000 ++++ b/configure 2022-12-26 17:30:49.000000000 +1100 +@@ -5622,8 +5622,7 @@ + # Other compilers, like HP Tru64 UNIX cc, exit successfully when + # given a .adb file, but produce no object file. So we must check + # if an object file was really produced to guard against this. +-errors=`(${CC} -c conftest.adb) 2>&1 || echo failure` +-if test x"$errors" = x && test -f conftest.$ac_objext; then ++if ${CC} -c conftest.adb && test -f conftest.$ac_objext; then + acx_cv_cc_gcc_supports_ada=yes + fi + rm -f conftest.* diff --git a/pkgs/by-name/gc/gcc/patches/clang-genconditions.patch b/pkgs/by-name/gc/gcc/patches/clang-genconditions.patch new file mode 100644 index 0000000..655afd2 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/clang-genconditions.patch @@ -0,0 +1,34 @@ +From https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92061#c5 + +--- a/gcc/genconditions.c 2019-01-01 12:37:19.064943662 +0100 ++++ b/gcc/genconditions.c 2019-10-11 10:57:11.464595789 +0200 +@@ -57,8 +57,9 @@ write_header (void) + \n\ + /* It is necessary, but not entirely safe, to include the headers below\n\ + in a generator program. As a defensive measure, don't do so when the\n\ +- table isn't going to have anything in it. */\n\ +-#if GCC_VERSION >= 3001\n\ ++ table isn't going to have anything in it.\n\ ++ Clang 9 is buggy and doesn't handle __builtin_constant_p correctly. */\n\ ++#if GCC_VERSION >= 3001 && __clang_major__ < 9\n\ + \n\ + /* Do not allow checking to confuse the issue. */\n\ + #undef CHECKING_P\n\ +@@ -170,7 +171,7 @@ struct c_test\n\ + vary at run time. It works in 3.0.1 and later; 3.0 only when not\n\ + optimizing. */\n\ + \n\ +-#if GCC_VERSION >= 3001\n\ ++#if GCC_VERSION >= 3001 && __clang_major__ < 9\n\ + static const struct c_test insn_conditions[] = {\n"); + + traverse_c_tests (write_one_condition, 0); +@@ -191,7 +192,7 @@ write_writer (void) + " unsigned int i;\n" + " const char *p;\n" + " puts (\"(define_conditions [\");\n" +- "#if GCC_VERSION >= 3001\n" ++ "#if GCC_VERSION >= 3001 && __clang_major__ < 9\n" + " for (i = 0; i < ARRAY_SIZE (insn_conditions); i++)\n" + " {\n" + " printf (\" (%d \\\"\", insn_conditions[i].value);\n" diff --git a/pkgs/by-name/gc/gcc/patches/default.nix b/pkgs/by-name/gc/gcc/patches/default.nix new file mode 100644 index 0000000..8f0c8f6 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/default.nix @@ -0,0 +1,338 @@ +{ lib, stdenv +, langC +, langAda +, langObjC +, langObjCpp +, langD +, langFortran +, langGo +, reproducibleBuild +, profiledCompiler +, langJit +, staticCompiler +, enableShared +, enableLTO +, version +, fetchpatch +, majorVersion +, targetPlatform +, hostPlatform +, noSysDirs +, buildPlatform +, fetchurl +, withoutTargetLibc +, threadsCross +}: + +let + atLeast13 = lib.versionAtLeast version "13"; + atLeast12 = lib.versionAtLeast version "12"; + atLeast11 = lib.versionAtLeast version "11"; + atLeast10 = lib.versionAtLeast version "10"; + atLeast9 = lib.versionAtLeast version "9"; + atLeast8 = lib.versionAtLeast version "8"; + atLeast7 = lib.versionAtLeast version "7"; + atLeast6 = lib.versionAtLeast version "6"; + atLeast49 = lib.versionAtLeast version "4.9"; + is13 = majorVersion == "13"; + is12 = majorVersion == "12"; + is11 = majorVersion == "11"; + is10 = majorVersion == "10"; + is9 = majorVersion == "9"; + is8 = majorVersion == "8"; + is7 = majorVersion == "7"; + is6 = majorVersion == "6"; + is49 = majorVersion == "4" && lib.versions.minor version == "9"; + is48 = majorVersion == "4" && lib.versions.minor version == "8"; + inherit (lib) optionals optional; +in + +# +# Patches below are organized into three general categories: +# 1. Patches relevant to gcc>=12 on every platform +# 2. Patches relevant to gcc>=12 on specific platforms +# 3. Patches relevant only to gcc<12 +# + + +## 1. Patches relevant to gcc>=12 on every platform #################################### + +[] +++ optional (atLeast6 && !atLeast12) ./fix-bug-80431.patch +++ optional (targetPlatform != hostPlatform) ./libstdc++-target.patch +++ optionals (noSysDirs) ( + [(if atLeast12 then ./gcc-12-no-sys-dirs.patch else ./no-sys-dirs.patch)] ++ + ({ + "13" = [ ./13/no-sys-dirs-riscv.patch ./13/mangle-NIX_STORE-in-__FILE__.patch ]; + "12" = [ ./no-sys-dirs-riscv.patch ./12/mangle-NIX_STORE-in-__FILE__.patch ]; + "11" = [ ./no-sys-dirs-riscv.patch ]; + "10" = [ ./no-sys-dirs-riscv.patch ]; + "9" = [ ./no-sys-dirs-riscv-gcc9.patch ]; + }."${majorVersion}" or []) +) +++ optional (atLeast12 && langAda) ./gnat-cflags-11.patch +++ optional langFortran (if atLeast12 then ./gcc-12-gfortran-driving.patch else ./gfortran-driving.patch) +++ optional atLeast7 ./ppc-musl.patch +++ optional is12 ./12/lambda-ICE-PR109241.patch # backport ICE fix on ccache code +++ optional is13 ./13/ICE-PR110280.patch # backport ICE fix on const_unop +++ optional (atLeast9 && langD) ./libphobos.patch + + + +## 2. Patches relevant to gcc>=12 on specific platforms #################################### + +### Musl+Go+gcc12 + +# backport fixes to build gccgo with musl libc +++ optionals (stdenv.hostPlatform.isMusl && langGo && atLeast12) [ + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/cf79b1117bd177d3d4c6ed24b6fa243c3628ac2d.diff"; + hash = "sha256-mS5ZiYi5D8CpGXrWg3tXlbhp4o86ew1imCTwaHLfl+I="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/7f195a2270910a6ed08bd76e3a16b0a6503f9faf.diff"; + hash = "sha256-Ze/cFM0dQofKH00PWPDoklXUlwWhwA1nyTuiDAZ6FKo="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/762fd5e5547e464e25b4bee435db6df4eda0de90.diff"; + hash = "sha256-o28upwTcHAnHG2Iq0OewzwSBEhHs+XpBGdIfZdT81pk="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/e73d9fcafbd07bc3714fbaf8a82db71d50015c92.diff"; + hash = "sha256-1SjYCVHLEUihdON2TOC3Z2ufM+jf2vH0LvYtZL+c1Fo="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/b6c6a3d64f2e4e9347733290aca3c75898c44b2e.diff"; + hash = "sha256-RycJ3YCHd3MXtYFjxP0zY2Wuw7/C4bWoBAQtTKJZPOQ="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/2b1a604a9b28fbf4f382060bebd04adb83acc2f9.diff"; + hash = "sha256-WiBQG0Xbk75rHk+AMDvsbrm+dc7lDH0EONJXSdEeMGE="; + }) + (fetchpatch { + url = "https://github.com/gcc-mirror/gcc/commit/c86b726c048eddc1be320c0bf64a897658bee13d.diff"; + hash = "sha256-QSIlqDB6JRQhbj/c3ejlmbfWz9l9FurdSWxpwDebnlI="; + }) +] + + +## Darwin + +# Fix detection of bootstrap compiler Ada support (cctools as) on Nix Darwin +++ optional (atLeast12 && stdenv.isDarwin && langAda) ./ada-cctools-as-detection-configure.patch + +# Use absolute path in GNAT dylib install names on Darwin +++ optionals (stdenv.isDarwin && langAda) ({ + "13" = [ ./gnat-darwin-dylib-install-name-13.patch ]; + "12" = [ ./gnat-darwin-dylib-install-name.patch ]; +}.${majorVersion} or []) + +# We only apply this patch when building a native toolchain for aarch64-darwin, as it breaks building +# a foreign one: https://github.com/iains/gcc-12-branch/issues/18 +++ optionals (stdenv.isDarwin && stdenv.isAarch64 && buildPlatform == hostPlatform && hostPlatform == targetPlatform) ({ + "13" = [ (fetchpatch { + name = "gcc-13-darwin-aarch64-support.patch"; + url = "https://raw.githubusercontent.com/Homebrew/formula-patches/3c5cbc8e9cf444a1967786af48e430588e1eb481/gcc/gcc-13.2.0.diff"; + sha256 = "sha256-Y5r3U3dwAFG6+b0TNCFd18PNxYu2+W/5zDbZ5cHvv+U="; + }) ]; + "12" = [ (fetchurl { + name = "gcc-12-darwin-aarch64-support.patch"; + url = "https://raw.githubusercontent.com/Homebrew/formula-patches/f1188b90d610e2ed170b22512ff7435ba5c891e2/gcc/gcc-12.3.0.diff"; + sha256 = "sha256-naL5ZNiurqfDBiPSU8PTbTmLqj25B+vjjiqc4fAFgYs="; + }) ]; + "11" = [ (fetchpatch { + # There are no upstream release tags in https://github.com/iains/gcc-11-branch. + # ff4bf32 is the commit from https://github.com/gcc-mirror/gcc/releases/tag/releases%2Fgcc-11.4.0 + url = "https://github.com/iains/gcc-11-branch/compare/ff4bf326d03e750a8d4905ea49425fe7d15a04b8..gcc-11.4-darwin-r0.diff"; + hash = "sha256-6prPgR2eGVJs7vKd6iM1eZsEPCD1ShzLns2Z+29vlt4="; + }) ]; +}.${majorVersion} or []) + + +## Windows + +# Obtain latest patch with ../update-mcfgthread-patches.sh +++ optional (atLeast6 && !atLeast13 && !withoutTargetLibc && targetPlatform.isMinGW && threadsCross.model == "mcf") + (./. + "/${majorVersion}/Added-mcf-thread-model-support-from-mcfgthread.patch") + + + + +############################################################################## +## +## 3. Patches relevant only to gcc<12 +## +## Above this point are patches which might potentially be applied +## to gcc version 12 or newer. Below this point are patches which +## will *only* be used for gcc versions older than gcc12. +## +############################################################################## + + + + +## gcc 11.0 and older ############################################################################## + +# libgcc’s `configure` script misdetects aarch64-darwin, resulting in an invalid deployment target. +++ optional (is11 && stdenv.isDarwin && stdenv.isAarch64) ./11/libgcc-aarch64-darwin-detection.patch + +# openjdk build fails without this on -march=opteron; is upstream in gcc12 +++ optionals (is11) [ ./11/gcc-issue-103910.patch ] + + + +## gcc 10.0 and older ############################################################################## + +++ optional (langAda && (is9 || is10)) ./gnat-cflags.patch +++ optional (is10 && buildPlatform.system == "aarch64-darwin" && targetPlatform != buildPlatform) (fetchpatch { + url = "https://raw.githubusercontent.com/richard-vd/musl-cross-make/5e9e87f06fc3220e102c29d3413fbbffa456fcd6/patches/gcc-${version}/0008-darwin-aarch64-self-host-driver.patch"; + sha256 = "sha256-XtykrPd5h/tsnjY1wGjzSOJ+AyyNLsfnjuOZ5Ryq9vA="; +}) + +# Fix undefined symbol errors when building older versions with clang +++ optional (!atLeast11 && stdenv.cc.isClang && stdenv.hostPlatform.isDarwin) ./clang-genconditions.patch + + +## gcc 9.0 and older ############################################################################## + +++ optional (majorVersion == "9") ./9/fix-struct-redefinition-on-glibc-2.36.patch +++ optional (atLeast7 && !atLeast10 && targetPlatform.isNetBSD) ./libstdc++-netbsd-ctypes.patch + +# Make Darwin bootstrap respect whether the assembler supports `--gstabs`, +# which is not supported by the clang integrated assembler used by default on Darwin. +++ optional (is9 && hostPlatform.isDarwin) ./9/gcc9-darwin-as-gstabs.patch + + +## gcc 8.0 and older ############################################################################## + +# for 49 this is applied later +++ optional (atLeast49 && !is49 && !atLeast9) ./libsanitizer-no-cyclades-9.patch +++ optional (is7 || is8) ./9/fix-struct-redefinition-on-glibc-2.36.patch + +# Make Darwin bootstrap respect whether the assembler supports `--gstabs`, +# which is not supported by the clang integrated assembler used by default on Darwin. +++ optional (is8 && hostPlatform.isDarwin) ./8/gcc8-darwin-as-gstabs.patch + +# Make avr-gcc8 build on aarch64-darwin +# avr-gcc8 is maintained for the `qmk` package +# https://github.com/osx-cross/homebrew-avr/blob/main/Formula/avr-gcc%408.rb#L69 +++ optional (is8 && targetPlatform.isAvr && hostPlatform.isDarwin && hostPlatform.isAarch64) ./8/avr-gcc-8-darwin.patch + + +## gcc 7.0 and older ############################################################################## + +++ optional (is7 && hostPlatform != buildPlatform) (fetchpatch { # XXX: Refine when this should be applied + url = "https://git.busybox.net/buildroot/plain/package/gcc/7.1.0/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02"; + sha256 = "0mrvxsdwip2p3l17dscpc1x8vhdsciqw1z5q9i6p5g9yg1cqnmgs"; +}) +++ optionals (is7) [ + # https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00633.html + (./. + "/${majorVersion}/riscv-pthread-reentrant.patch") + # https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00297.html + (./. + "/${majorVersion}/riscv-no-relax.patch") + # Fix for asan w/glibc-2.34. Although there's no upstream backport to v7, + # the patch from gcc 8 seems to work perfectly fine. + (./. + "/${majorVersion}/gcc8-asan-glibc-2.34.patch") + (./. + "/${majorVersion}/0001-Fix-build-for-glibc-2.31.patch") +] +++ optional ((is6 || is7) && targetPlatform.libc == "musl" && targetPlatform.isx86_32) (fetchpatch { + url = "https://git.alpinelinux.org/aports/plain/main/gcc/gcc-6.1-musl-libssp.patch?id=5e4b96e23871ee28ef593b439f8c07ca7c7eb5bb"; + sha256 = "1jf1ciz4gr49lwyh8knfhw6l5gvfkwzjy90m7qiwkcbsf4a3fqn2"; +}) +++ optional ((is6 || is7 || is8) && !atLeast9 && targetPlatform.libc == "musl") ./libgomp-dont-force-initial-exec.patch + + + +## gcc 6.0 and older ############################################################################## + +++ optional (is6 && langGo) ./gogcc-workaround-glibc-2.36.patch +++ optional (is49 || is6) ./9/fix-struct-redefinition-on-glibc-2.36.patch +++ optional (is49 || (is6 && !stdenv.targetPlatform.isRedox)) ./use-source-date-epoch.patch +++ optional (is6 && !stdenv.targetPlatform.isRedox) ./6/0001-Fix-build-for-glibc-2.31.patch +++ optionals (is6 && langAda) [ + ./gnat-cflags.patch + ./6/gnat-glibc234.patch +] + +# The clang-based assembler used in darwin.cctools-llvm (LLVM >11) does not support piping input. +# Fortunately, it does not exhibit the problem GCC has with the cctools assembler. +# This patch can be dropped should darwin.cctools-llvm ever implement support. +++ optional (!atLeast7 && hostPlatform.isDarwin && lib.versionAtLeast (lib.getVersion stdenv.cc) "12") ./4.9/darwin-clang-as.patch + +# Building libstdc++ with flat namespaces results in trying to link CoreFoundation, which +# defaults to the impure, system location and causes the build to fail. +++ optional (is6 && hostPlatform.isDarwin) ./6/libstdc++-disable-flat_namespace.patch + +## gcc 4.9 and older ############################################################################## + +++ optional (!atLeast6) ./parallel-bconfig.patch +++ optionals (is49) [ + (./. + "/${lib.versions.major version}.${lib.versions.minor version}/parallel-strsignal.patch") + (./. + "/${lib.versions.major version}.${lib.versions.minor version}/libsanitizer.patch") + (fetchpatch { + name = "avoid-ustat-glibc-2.28.patch"; + url = "https://gitweb.gentoo.org/proj/gcc-patches.git/plain/4.9.4/gentoo/100_all_avoid-ustat-glibc-2.28.patch?id=55fcb515620a8f7d3bb77eba938aa0fcf0d67c96"; + sha256 = "0b32sb4psv5lq0ij9fwhi1b4pjbwdjnv24nqprsk14dsc6xmi1g0"; + }) + # has to be applied after "avoid-ustat-glibc-2.28.patch" + ./libsanitizer-no-cyclades-9.patch + # glibc-2.26 + ./struct-ucontext.patch + ./struct-sigaltstack-4.9.patch +] +# Retpoline patches pulled from the branch hjl/indirect/gcc-4_9-branch (by H.J. Lu, the author of GCC upstream retpoline commits) +++ optionals is49 + (builtins.map ({commit, sha256}: fetchpatch {url = "https://github.com/hjl-tools/gcc/commit/${commit}.patch"; inherit sha256;}) + [{ commit = "e623d21608e96ecd6b65f0d06312117d20488a38"; sha256 = "1ix8i4d2r3ygbv7npmsdj790rhxqrnfwcqzv48b090r9c3ij8ay3"; } + { commit = "2015a09e332309f12de1dadfe179afa6a29368b8"; sha256 = "0xcfs0cbb63llj2gbcdrvxim79ax4k4aswn0a3yjavxsj71s1n91"; } + { commit = "6b11591f4494f705e8746e7d58b7f423191f4e92"; sha256 = "0aydyhsm2ig0khgbp27am7vq7liyqrq6kfhfi2ki0ij0ab1hfbga"; } + { commit = "203c7d9c3e9cb0f88816b481ef8e7e87b3ecc373"; sha256 = "0wqn16y7wy5kg8ngfcni5qdwfphl01axczibbk49bxclwnzvldqa"; } + { commit = "f039c6f284b2c9ce97c8353d6034978795c4872e"; sha256 = "13fkgdb17lpyxfksz1zanxhgpsm0jrss9w61nbl7an4im22hz7ci"; } + { commit = "ed42606bdab1c5d9e5ad828cd6fe1a0557f193b7"; sha256 = "0gdnn8v3p03imj3qga2mzdhpgbmjcklkxdl97jvz5xia2ikzknxm"; } + { commit = "5278e062ef292fd2fbf987d25389785f4c5c0f99"; sha256 = "0j81x758wf8v7j4rx5wc1cy7yhkvhlhv3wmnarwakxiwsspq0vrs"; } + { commit = "76f1ffbbb6cd9f6ecde6c82cd16e20a27242e890"; sha256 = "1py56y6gp7fjf4f8bbsfwh5bs1gnmlqda1ycsmnwlzfm0cshdp0c"; } + { commit = "4ca48b2b688b135c0390f54ea9077ef10aedd52c"; sha256 = "15r019pzr3k0lpgyvdc92c8fayw8b5lrzncna4bqmamcsdz7vsaw"; } + { commit = "98c7bf9ddc80db965d69d61521b1c7a1cec32d9a"; sha256 = "1d7pfdv1q23nf0wadw7jbp6d6r7pnzjpbyxgbdfv7j1vr9l1bp60"; } + { commit = "3dc76b53ad896494ca62550a7a752fecbca3f7a2"; sha256 = "0jvdzfpvfdmklfcjwqblwq1i22iqis7ljpvm7adra5d7zf2xk7xz"; } + { commit = "1e961ed49b18e176c7457f53df2433421387c23b"; sha256 = "04dnqqs4qsvz4g8cq6db5id41kzys7hzhcaycwmc9rpqygs2ajwz"; } + { commit = "e137c72d099f9b3b47f4cc718aa11eab14df1a9c"; sha256 = "1ms0dmz74yf6kwgjfs4d2fhj8y6mcp2n184r3jk44wx2xc24vgb2"; }]) + +++ optional (is49 && !atLeast6) [ + # gcc-11 compatibility + (fetchpatch { + name = "gcc4-char-reload.patch"; + url = "https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff_plain;h=d57c99458933a21fdf94f508191f145ad8d5ec58"; + includes = [ "gcc/reload.h" ]; + sha256 = "sha256-66AMP7/ajunGKAN5WJz/yPn42URZ2KN51yPrFdsxEuM="; + }) +] + + +## gcc 4.8 only ############################################################################## + +++ optional (!atLeast49 && hostPlatform.isDarwin) ./gfortran-darwin-NXConstStr.patch +++ optionals is48 [ + (fetchpatch { + name = "libc_name_p.diff"; # needed to build with gcc6 + url = "https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff_plain;h=ec1cc0263f1"; + sha256 = "01jd7pdarh54ki498g6sz64ijl9a1l5f9v8q2696aaxalvh2vwzl"; + excludes = [ "gcc/cp/ChangeLog" ]; + }) + # glibc-2.26 + ./struct-ucontext-4.8.patch + ./sigsegv-not-declared.patch + ./res_state-not-declared.patch + # gcc-11 compatibility + (fetchpatch { + name = "gcc4-char-reload.patch"; + url = "https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff_plain;h=d57c99458933a21fdf94f508191f145ad8d5ec58"; + includes = [ "gcc/reload.h" ]; + sha256 = "sha256-66AMP7/ajunGKAN5WJz/yPn42URZ2KN51yPrFdsxEuM="; + }) +] diff --git a/pkgs/by-name/gc/gcc/patches/fix-bug-80431.patch b/pkgs/by-name/gc/gcc/patches/fix-bug-80431.patch new file mode 100644 index 0000000..2d688b8 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/fix-bug-80431.patch @@ -0,0 +1,92 @@ +From de31f5445b12fd9ab9969dc536d821fe6f0edad0 Mon Sep 17 00:00:00 2001 +From: Patrick Palka +Date: Mon, 21 Jun 2021 07:54:26 -0400 +Subject: [PATCH] c++: conversion to base of vbase in NSDMI [PR80431] + +The delayed processing of conversions to a virtual base in an NSDMI +assumes the target base type is a (possibly indirect) virtual base of +the current class, but the target base type could also be a base of a +virtual base, as in the testcase below. Since such a base isn't a part +of CLASSTYPE_VBASECLASSES, we end up miscompiling the testcase due to +the call to build_base_path (with binfo=NULL_TREE) silently returning +error_mark_node. Fix this by using convert_to_base to build the +conversion instead. + + PR c++/80431 + +gcc/cp/ChangeLog: + + * tree.c (bot_replace): Use convert_to_base to build the + conversion to the (morally) virtual base. + +gcc/testsuite/ChangeLog: + + * g++.dg/cpp0x/nsdmi-virtual1a.C: New test. +--- + gcc/cp/tree.c | 14 ++++------ + gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1a.C | 28 ++++++++++++++++++++ + 2 files changed, 33 insertions(+), 9 deletions(-) + create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1a.C + +diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c +index fec5afaa2be..297da2b1550 100644 +--- a/gcc/cp/tree.c ++++ b/gcc/cp/tree.c +@@ -3242,15 +3242,11 @@ bot_replace (tree* t, int* /*walk_subtrees*/, void* data_) + else if (TREE_CODE (*t) == CONVERT_EXPR + && CONVERT_EXPR_VBASE_PATH (*t)) + { +- /* In an NSDMI build_base_path defers building conversions to virtual +- bases, and we handle it here. */ +- tree basetype = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (*t))); +- vec *vbases = CLASSTYPE_VBASECLASSES (current_class_type); +- int i; tree binfo; +- FOR_EACH_VEC_SAFE_ELT (vbases, i, binfo) +- if (BINFO_TYPE (binfo) == basetype) +- break; +- *t = build_base_path (PLUS_EXPR, TREE_OPERAND (*t, 0), binfo, true, ++ /* In an NSDMI build_base_path defers building conversions to morally ++ virtual bases, and we handle it here. */ ++ tree basetype = TREE_TYPE (*t); ++ *t = convert_to_base (TREE_OPERAND (*t, 0), basetype, ++ /*check_access=*/false, /*nonnull=*/true, + tf_warning_or_error); + } + +diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1a.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1a.C +new file mode 100644 +index 00000000000..dc847cc16e5 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1a.C +@@ -0,0 +1,28 @@ ++// PR c++/80431 ++// { dg-do run { target c++11 } } ++ ++// A variant of nsdmi-virtual1.C where A is only a morally virtual base of B. ++ ++struct A ++{ ++ A(): i(42) { } ++ int i; ++ int f() { return i; } ++}; ++ ++struct D : A { int pad; }; ++ ++struct B : virtual D ++{ ++ int j = i + f(); ++ int k = A::i + A::f(); ++}; ++ ++struct C: B { int pad; }; ++ ++int main() ++{ ++ C c; ++ if (c.j != 84 || c.k != 84) ++ __builtin_abort(); ++} +-- +2.31.1 + diff --git a/pkgs/by-name/gc/gcc/patches/gcc-12-gfortran-driving.patch b/pkgs/by-name/gc/gcc/patches/gcc-12-gfortran-driving.patch new file mode 100644 index 0000000..0ad1f25 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gcc-12-gfortran-driving.patch @@ -0,0 +1,20 @@ +This patch fixes interaction with Libtool. +See , for details. + +--- a/gcc/fortran/gfortranspec.cc ++++ b/gcc/fortran/gfortranspec.cc +@@ -461,8 +461,15 @@ For more information about these matters, see the file named COPYING\n\n")); + { + fprintf (stderr, _("Driving:")); + for (i = 0; i < g77_newargc; i++) ++ { ++ if (g77_new_decoded_options[i].opt_index == OPT_l) ++ /* Make sure no white space is inserted after `-l'. */ ++ fprintf (stderr, " -l%s", ++ g77_new_decoded_options[i].canonical_option[1]); ++ else + fprintf (stderr, " %s", + g77_new_decoded_options[i].orig_option_with_args_text); ++ } + fprintf (stderr, "\n"); + } diff --git a/pkgs/by-name/gc/gcc/patches/gcc-12-no-sys-dirs.patch b/pkgs/by-name/gc/gcc/patches/gcc-12-no-sys-dirs.patch new file mode 100644 index 0000000..67a9429 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gcc-12-no-sys-dirs.patch @@ -0,0 +1,26 @@ +--- a/gcc/cppdefault.cc 2013-01-10 21:38:27.000000000 +0100 ++++ b/gcc/cppdefault.cc 2014-08-18 16:20:32.893944536 +0200 +@@ -35,6 +35,8 @@ + # undef CROSS_INCLUDE_DIR + #endif + ++#undef LOCAL_INCLUDE_DIR ++ + const struct default_include cpp_include_defaults[] + #ifdef INCLUDE_DEFAULTS + = INCLUDE_DEFAULTS; +--- a/gcc/gcc.cc 2014-03-23 12:30:57.000000000 +0100 ++++ b/gcc/gcc.cc 2014-08-18 13:19:32.689201690 +0200 +@@ -1162,10 +1162,10 @@ + /* Default prefixes to attach to command names. */ + + #ifndef STANDARD_STARTFILE_PREFIX_1 +-#define STANDARD_STARTFILE_PREFIX_1 "/lib/" ++#define STANDARD_STARTFILE_PREFIX_1 "" + #endif + #ifndef STANDARD_STARTFILE_PREFIX_2 +-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/" ++#define STANDARD_STARTFILE_PREFIX_2 "" + #endif + + #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */ diff --git a/pkgs/by-name/gc/gcc/patches/gfortran-darwin-NXConstStr.patch b/pkgs/by-name/gc/gcc/patches/gfortran-darwin-NXConstStr.patch new file mode 100644 index 0000000..a7e158c --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gfortran-darwin-NXConstStr.patch @@ -0,0 +1,27 @@ +From 82f81877458ea372176eabb5de36329431dce99b Mon Sep 17 00:00:00 2001 +From: Iain Sandoe +Date: Sat, 21 Dec 2013 00:30:18 +0000 +Subject: [PATCH] don't try to mark local symbols as no-dead-strip + +--- + gcc/config/darwin.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c +index 40804b8..0080299 100644 +--- a/gcc/config/darwin.c ++++ b/gcc/config/darwin.c +@@ -1259,6 +1259,11 @@ darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED) + void + darwin_mark_decl_preserved (const char *name) + { ++ /* Actually we shouldn't mark any local symbol this way, but for now ++ this only happens with ObjC meta-data. */ ++ if (darwin_label_is_anonymous_local_objc_name (name)) ++ return; ++ + fprintf (asm_out_file, "\t.no_dead_strip "); + assemble_name (asm_out_file, name); + fputc ('\n', asm_out_file); +-- +2.2.1 diff --git a/pkgs/by-name/gc/gcc/patches/gfortran-driving.patch b/pkgs/by-name/gc/gcc/patches/gfortran-driving.patch new file mode 100644 index 0000000..7070888 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gfortran-driving.patch @@ -0,0 +1,20 @@ +This patch fixes interaction with Libtool. +See , for details. + +--- a/gcc/fortran/gfortranspec.c ++++ b/gcc/fortran/gfortranspec.c +@@ -461,8 +461,15 @@ For more information about these matters, see the file named COPYING\n\n")); + { + fprintf (stderr, _("Driving:")); + for (i = 0; i < g77_newargc; i++) ++ { ++ if (g77_new_decoded_options[i].opt_index == OPT_l) ++ /* Make sure no white space is inserted after `-l'. */ ++ fprintf (stderr, " -l%s", ++ g77_new_decoded_options[i].canonical_option[1]); ++ else + fprintf (stderr, " %s", + g77_new_decoded_options[i].orig_option_with_args_text); ++ } + fprintf (stderr, "\n"); + } diff --git a/pkgs/by-name/gc/gcc/patches/gnat-cflags-11.patch b/pkgs/by-name/gc/gcc/patches/gnat-cflags-11.patch new file mode 100644 index 0000000..03ef286 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gnat-cflags-11.patch @@ -0,0 +1,35 @@ +diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in +index 4e74252bd74..0d848b5b4e3 100644 +--- a/gcc/ada/gcc-interface/Makefile.in ++++ b/gcc/ada/gcc-interface/Makefile.in +@@ -111,7 +111,7 @@ NO_OMIT_ADAFLAGS = -fno-omit-frame-pointer + NO_SIBLING_ADAFLAGS = -fno-optimize-sibling-calls + NO_REORDER_ADAFLAGS = -fno-toplevel-reorder + GNATLIBFLAGS = -W -Wall -gnatg -nostdinc +-GNATLIBCFLAGS = -g -O2 ++GNATLIBCFLAGS = -g -O2 $(CFLAGS_FOR_TARGET) + # Pretend that _Unwind_GetIPInfo is available for the target by default. This + # should be autodetected during the configuration of libada and passed down to + # here, but we need something for --disable-libada and hope for the best. +@@ -198,7 +198,7 @@ RTSDIR = rts$(subst /,_,$(MULTISUBDIR)) + # Link flags used to build gnat tools. By default we prefer to statically + # link with libgcc to avoid a dependency on shared libgcc (which is tricky + # to deal with as it may conflict with the libgcc provided by the system). +-GCC_LINK_FLAGS=-static-libstdc++ -static-libgcc ++GCC_LINK_FLAGS=-static-libstdc++ -static-libgcc $(CFLAGS_FOR_TARGET) + + # End of variables for you to override. + +diff --git a/libada/Makefile.in b/libada/Makefile.in +index 522b9207326..ca866c74471 100644 +--- a/libada/Makefile.in ++++ b/libada/Makefile.in +@@ -59,7 +59,7 @@ LDFLAGS= + CFLAGS=-g + PICFLAG = @PICFLAG@ + GNATLIBFLAGS= -W -Wall -gnatpg -nostdinc +-GNATLIBCFLAGS= -g -O2 ++GNATLIBCFLAGS= -g -O2 $(CFLAGS) + GNATLIBCFLAGS_FOR_C = -W -Wall $(GNATLIBCFLAGS) $(CFLAGS_FOR_TARGET) \ + -fexceptions -DIN_RTS @have_getipinfo@ @have_capability@ + diff --git a/pkgs/by-name/gc/gcc/patches/gnat-cflags.patch b/pkgs/by-name/gc/gcc/patches/gnat-cflags.patch new file mode 100644 index 0000000..a16266b --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gnat-cflags.patch @@ -0,0 +1,35 @@ +diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in +index 4e74252bd74..0d848b5b4e3 100644 +--- a/gcc/ada/gcc-interface/Makefile.in ++++ b/gcc/ada/gcc-interface/Makefile.in +@@ -111,7 +111,7 @@ NO_OMIT_ADAFLAGS = -fno-omit-frame-pointer + NO_SIBLING_ADAFLAGS = -fno-optimize-sibling-calls + NO_REORDER_ADAFLAGS = -fno-toplevel-reorder + GNATLIBFLAGS = -W -Wall -gnatpg -nostdinc +-GNATLIBCFLAGS = -g -O2 ++GNATLIBCFLAGS = -g -O2 $(CFLAGS_FOR_TARGET) + # Pretend that _Unwind_GetIPInfo is available for the target by default. This + # should be autodetected during the configuration of libada and passed down to + # here, but we need something for --disable-libada and hope for the best. +@@ -198,7 +198,7 @@ RTSDIR = rts$(subst /,_,$(MULTISUBDIR)) + # Link flags used to build gnat tools. By default we prefer to statically + # link with libgcc to avoid a dependency on shared libgcc (which is tricky + # to deal with as it may conflict with the libgcc provided by the system). +-GCC_LINK_FLAGS=-static-libstdc++ -static-libgcc ++GCC_LINK_FLAGS=-static-libstdc++ -static-libgcc $(CFLAGS_FOR_TARGET) + + # End of variables for you to override. + +diff --git a/libada/Makefile.in b/libada/Makefile.in +index 522b9207326..ca866c74471 100644 +--- a/libada/Makefile.in ++++ b/libada/Makefile.in +@@ -59,7 +59,7 @@ LDFLAGS= + CFLAGS=-g + PICFLAG = @PICFLAG@ + GNATLIBFLAGS= -W -Wall -gnatpg -nostdinc +-GNATLIBCFLAGS= -g -O2 ++GNATLIBCFLAGS= -g -O2 $(CFLAGS) + GNATLIBCFLAGS_FOR_C = -W -Wall $(GNATLIBCFLAGS) $(CFLAGS_FOR_TARGET) \ + -fexceptions -DIN_RTS @have_getipinfo@ @have_capability@ + diff --git a/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name-13.patch b/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name-13.patch new file mode 100644 index 0000000..19c405d --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name-13.patch @@ -0,0 +1,18 @@ +--- a/gcc/ada/gcc-interface/Makefile.in ++++ b/gcc/ada/gcc-interface/Makefile.in +@@ -788,13 +788,13 @@ gnatlib-shared-darwin: + -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ + $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -Wl,-install_name,$(ADA_RTL_DSO_DIR)/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(MISCLIB) + cd $(RTSDIR); $(GCC_FOR_ADA_RTS) -dynamiclib $(PICFLAG_FOR_TARGET) \ + -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(GNATRTL_TASKING_OBJS) \ + $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -Wl,-install_name,$(ADA_RTL_DSO_DIR)/libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) + cd $(RTSDIR); $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + libgnat$(soext) diff --git a/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name.patch b/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name.patch new file mode 100644 index 0000000..01e5de8 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/gnat-darwin-dylib-install-name.patch @@ -0,0 +1,19 @@ +--- a/gcc/ada/gcc-interface/Makefile.in 2022-08-19 18:09:52.000000000 +1000 ++++ b/gcc/ada/gcc-interface/Makefile.in 2023-01-11 01:54:06.000000000 +1100 +@@ -795,14 +795,14 @@ + -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \ + $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -Wl,-install_name,$(ADA_RTL_DSO_DIR)/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(MISCLIB) + cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \ + | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(PICFLAG_FOR_TARGET) \ + -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(GNATRTL_TASKING_OBJS) \ + $(SO_OPTS) \ +- -Wl,-install_name,@rpath/libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ ++ -Wl,-install_name,$(ADA_RTL_DSO_DIR)/libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \ + $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) + cd $(RTSDIR); $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \ + libgnat$(soext) diff --git a/pkgs/by-name/gc/gcc/patches/libgomp-dont-force-initial-exec.patch b/pkgs/by-name/gc/gcc/patches/libgomp-dont-force-initial-exec.patch new file mode 100644 index 0000000..afd1f74 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/libgomp-dont-force-initial-exec.patch @@ -0,0 +1,40 @@ +From 01c433f4788441c0963005b9d3fad5b2865e6651 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Mon, 24 Sep 2018 19:57:50 -0500 +Subject: [PATCH] libgomp/configure.tgt: don't force initial-exec tls-model + +--- + libgomp/configure.tgt | 17 ----------------- + 1 file changed, 17 deletions(-) + +diff --git a/libgomp/configure.tgt b/libgomp/configure.tgt +index 74d95a570c7..b608c55f0c1 100644 +--- a/libgomp/configure.tgt ++++ b/libgomp/configure.tgt +@@ -10,23 +10,6 @@ + # XCFLAGS Add extra compile flags to use. + # XLDFLAGS Add extra link flags to use. + +-# Optimize TLS usage by avoiding the overhead of dynamic allocation. +-if test $gcc_cv_have_tls = yes ; then +- case "${target}" in +- +- *-*-k*bsd*-gnu*) +- ;; +- +- *-*-linux* | *-*-gnu*) +- XCFLAGS="${XCFLAGS} -ftls-model=initial-exec" +- ;; +- +- *-*-rtems*) +- XCFLAGS="${XCFLAGS} -ftls-model=local-exec" +- ;; +- esac +-fi +- + # Since we require POSIX threads, assume a POSIX system by default. + config_path="posix" + +-- +2.19.0 + diff --git a/pkgs/by-name/gc/gcc/patches/libphobos.patch b/pkgs/by-name/gc/gcc/patches/libphobos.patch new file mode 100644 index 0000000..a16ea54 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/libphobos.patch @@ -0,0 +1,119 @@ +diff --git a/Makefile.in b/Makefile.in +index a375471..83c5ecb 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -804,7 +804,7 @@ BASE_FLAGS_TO_PASS = \ + "STAGE1_LANGUAGES=$(STAGE1_LANGUAGES)" \ + "GNATBIND=$(GNATBIND)" \ + "GNATMAKE=$(GNATMAKE)" \ +- "GDC=$(GDC)" \ ++ "`echo 'GDC=$(GDC)' | sed -e 's/-idirafter [^ ]*//g'`" \ + "GDCFLAGS=$(GDCFLAGS)" \ + "AR_FOR_TARGET=$(AR_FOR_TARGET)" \ + "AS_FOR_TARGET=$(AS_FOR_TARGET)" \ +@@ -817,7 +817,7 @@ BASE_FLAGS_TO_PASS = \ + "GFORTRAN_FOR_TARGET=$(GFORTRAN_FOR_TARGET)" \ + "GOC_FOR_TARGET=$(GOC_FOR_TARGET)" \ + "GOCFLAGS_FOR_TARGET=$(GOCFLAGS_FOR_TARGET)" \ +- "GDC_FOR_TARGET=$(GDC_FOR_TARGET)" \ ++ "`echo 'GDC_FOR_TARGET=$(GDC_FOR_TARGET)' | sed -e 's/-idirafter [^ ]*//g'`" \ + "GDCFLAGS_FOR_TARGET=$(GDCFLAGS_FOR_TARGET)" \ + "LD_FOR_TARGET=$(LD_FOR_TARGET)" \ + "LIPO_FOR_TARGET=$(LIPO_FOR_TARGET)" \ +@@ -890,7 +890,7 @@ EXTRA_HOST_FLAGS = \ + 'DLLTOOL=$(DLLTOOL)' \ + 'GFORTRAN=$(GFORTRAN)' \ + 'GOC=$(GOC)' \ +- 'GDC=$(GDC)' \ ++ "`echo 'GDC=$(GDC)' | sed -e 's/-idirafter [^ ]*//g'`" \ + 'LD=$(LD)' \ + 'LIPO=$(LIPO)' \ + 'NM=$(NM)' \ +@@ -966,8 +966,11 @@ EXTRA_TARGET_FLAGS = \ + 'STAGE1_LDFLAGS=$$(POSTSTAGE1_LDFLAGS)' \ + 'STAGE1_LIBS=$$(POSTSTAGE1_LIBS)' \ + "TFLAGS=$$TFLAGS" ++EXTRA_TARGET_FLAGS_D = \ ++ "`echo $(EXTRA_TARGET_FLAGS) | sed -e 's/-idirafter [^ ]*//g'`" + + TARGET_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) ++TARGET_FLAGS_TO_PASS_D = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS_D) + + # Flags to pass down to gcc. gcc builds a library, libgcc.a, so it + # unfortunately needs the native compiler and the target ar and +@@ -47285,7 +47288,7 @@ check-target-libphobos: + s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ + $(NORMAL_TARGET_EXPORTS) \ + (cd $(TARGET_SUBDIR)/libphobos && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) check) ++ $(MAKE) $(TARGET_FLAGS_TO_PASS_D) check) + + @endif target-libphobos + +@@ -47300,7 +47303,7 @@ install-target-libphobos: installdirs + s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ + $(NORMAL_TARGET_EXPORTS) \ + (cd $(TARGET_SUBDIR)/libphobos && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) install) ++ $(MAKE) $(TARGET_FLAGS_TO_PASS_D) install) + + @endif target-libphobos + +@@ -47315,7 +47318,7 @@ install-strip-target-libphobos: installdirs + s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \ + $(NORMAL_TARGET_EXPORTS) \ + (cd $(TARGET_SUBDIR)/libphobos && \ +- $(MAKE) $(TARGET_FLAGS_TO_PASS) install-strip) ++ $(MAKE) $(TARGET_FLAGS_TO_PASS_D) install-strip) + + @endif target-libphobos + +diff --git a/Makefile.tpl b/Makefile.tpl +index 41cae58..b3d32e7 100644 +--- a/Makefile.tpl ++++ b/Makefile.tpl +@@ -721,8 +721,11 @@ EXTRA_TARGET_FLAGS = \ + 'STAGE1_LDFLAGS=$$(POSTSTAGE1_LDFLAGS)' \ + 'STAGE1_LIBS=$$(POSTSTAGE1_LIBS)' \ + "TFLAGS=$$TFLAGS" ++EXTRA_TARGET_FLAGS_D = \ ++ "`echo $(EXTRA_TARGET_FLAGS) | sed -e 's/-idirafter [^ ]*//g'`" + + TARGET_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) ++TARGET_FLAGS_TO_PASS_D = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS_D) + + # Flags to pass down to gcc. gcc builds a library, libgcc.a, so it + # unfortunately needs the native compiler and the target ar and +diff --git a/libphobos/Makefile.in b/libphobos/Makefile.in +index e894417..2d18dcb 100644 +--- a/libphobos/Makefile.in ++++ b/libphobos/Makefile.in +@@ -365,6 +365,7 @@ AM_MAKEFLAGS = \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ + "MAKE=$(MAKE)" \ ++ "`echo 'MAKEFLAGS=$(MAKEFLAGS)' | sed -e 's/-j[0-9]+/-j1/'`" \ + "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ + "PICFLAG=$(PICFLAG)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ +@@ -694,6 +695,8 @@ uninstall-am: + + .PRECIOUS: Makefile + ++.NOTPARALLEL: ++ + # GNU Make needs to see an explicit $(MAKE) variable in the command it + # runs to enable its job server during parallel builds. Hence the + # comments below. +diff --git a/libphobos/configure b/libphobos/configure +index b3cb5f3..25adf2b 100755 +--- a/libphobos/configure ++++ b/libphobos/configure +@@ -5122,6 +5122,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + ++GDC=`$as_echo "$GDC" | sed -e 's/-idirafter [^ ]*//g'` + + ac_ext=d + ac_compile='$GDC -c $GDCFLAGS conftest.$ac_ext >&5' diff --git a/pkgs/by-name/gc/gcc/patches/libsanitizer-no-cyclades-9.patch b/pkgs/by-name/gc/gcc/patches/libsanitizer-no-cyclades-9.patch new file mode 100644 index 0000000..072403d --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/libsanitizer-no-cyclades-9.patch @@ -0,0 +1,82 @@ +https://gcc.gnu.org/git/?p=gcc.git;a=patch;h=2b40941d23b1570cdd90083b58fa0f66aa58c86e +https://gcc.gnu.org/PR100379 +--- a/libsanitizer/sanitizer_common/sanitizer_common_interceptors_ioctl.inc ++++ b/libsanitizer/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +@@ -365,15 +365,6 @@ static void ioctl_table_fill() { + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE +- _(CYGETDEFTHRESH, WRITE, sizeof(int)); +- _(CYGETDEFTIMEOUT, WRITE, sizeof(int)); +- _(CYGETMON, WRITE, struct_cyclades_monitor_sz); +- _(CYGETTHRESH, WRITE, sizeof(int)); +- _(CYGETTIMEOUT, WRITE, sizeof(int)); +- _(CYSETDEFTHRESH, NONE, 0); +- _(CYSETDEFTIMEOUT, NONE, 0); +- _(CYSETTHRESH, NONE, 0); +- _(CYSETTIMEOUT, NONE, 0); + _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz); + _(EQL_ENSLAVE, WRITE, struct_ifreq_sz); + _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -157,7 +157,6 @@ typedef struct user_fpregs elf_fpregset_t; + # include + #endif + #include +-#include + #include + #include + #include +@@ -466,7 +465,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); +- unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); + #if EV_VERSION > (0x010000) + unsigned struct_input_keymap_entry_sz = sizeof(struct input_keymap_entry); + #else +@@ -833,15 +831,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + #endif // SANITIZER_LINUX || SANITIZER_FREEBSD + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +- unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; +- unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; +- unsigned IOCTL_CYGETMON = CYGETMON; +- unsigned IOCTL_CYGETTHRESH = CYGETTHRESH; +- unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT; +- unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH; +- unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT; +- unsigned IOCTL_CYSETTHRESH = CYSETTHRESH; +- unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT; + unsigned IOCTL_EQL_EMANCIPATE = EQL_EMANCIPATE; + unsigned IOCTL_EQL_ENSLAVE = EQL_ENSLAVE; + unsigned IOCTL_EQL_GETMASTRCFG = EQL_GETMASTRCFG; +--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -1040,7 +1040,6 @@ struct __sanitizer_cookie_io_functions_t { + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + extern unsigned struct_ax25_parms_struct_sz; +- extern unsigned struct_cyclades_monitor_sz; + extern unsigned struct_input_keymap_entry_sz; + extern unsigned struct_ipx_config_data_sz; + extern unsigned struct_kbdiacrs_sz; +@@ -1385,15 +1384,6 @@ struct __sanitizer_cookie_io_functions_t { + #endif // SANITIZER_LINUX || SANITIZER_FREEBSD + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +- extern unsigned IOCTL_CYGETDEFTHRESH; +- extern unsigned IOCTL_CYGETDEFTIMEOUT; +- extern unsigned IOCTL_CYGETMON; +- extern unsigned IOCTL_CYGETTHRESH; +- extern unsigned IOCTL_CYGETTIMEOUT; +- extern unsigned IOCTL_CYSETDEFTHRESH; +- extern unsigned IOCTL_CYSETDEFTIMEOUT; +- extern unsigned IOCTL_CYSETTHRESH; +- extern unsigned IOCTL_CYSETTIMEOUT; + extern unsigned IOCTL_EQL_EMANCIPATE; + extern unsigned IOCTL_EQL_ENSLAVE; + extern unsigned IOCTL_EQL_GETMASTRCFG; +-- +2.27.0 diff --git a/pkgs/by-name/gc/gcc/patches/libstdc++-netbsd-ctypes.patch b/pkgs/by-name/gc/gcc/patches/libstdc++-netbsd-ctypes.patch new file mode 100644 index 0000000..28fff80 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/libstdc++-netbsd-ctypes.patch @@ -0,0 +1,141 @@ +diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h +index ff3ec893974..21eccf9fde1 100644 +--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h ++++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h +@@ -38,40 +38,46 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + /// @brief Base class for ctype. + struct ctype_base + { +- // Non-standard typedefs. +- typedef const unsigned char* __to_type; + + // NB: Offsets into ctype::_M_table force a particular size + // on the mask type. Because of this, we don't use an enum. +- typedef unsigned char mask; + + #ifndef _CTYPE_U +- static const mask upper = _U; +- static const mask lower = _L; +- static const mask alpha = _U | _L; +- static const mask digit = _N; +- static const mask xdigit = _N | _X; +- static const mask space = _S; +- static const mask print = _P | _U | _L | _N | _B; +- static const mask graph = _P | _U | _L | _N; +- static const mask cntrl = _C; +- static const mask punct = _P; +- static const mask alnum = _U | _L | _N; ++ // Non-standard typedefs. ++ typedef const unsigned char* __to_type; ++ ++ typedef unsigned char mask; ++ ++ static const mask upper = _U; ++ static const mask lower = _L; ++ static const mask alpha = _U | _L; ++ static const mask digit = _N; ++ static const mask xdigit = _N | _X; ++ static const mask space = _S; ++ static const mask print = _P | _U | _L | _N | _B; ++ static const mask graph = _P | _U | _L | _N; ++ static const mask cntrl = _C; ++ static const mask punct = _P; ++ static const mask alnum = _U | _L | _N; + #else +- static const mask upper = _CTYPE_U; +- static const mask lower = _CTYPE_L; +- static const mask alpha = _CTYPE_U | _CTYPE_L; +- static const mask digit = _CTYPE_N; +- static const mask xdigit = _CTYPE_N | _CTYPE_X; +- static const mask space = _CTYPE_S; +- static const mask print = _CTYPE_P | _CTYPE_U | _CTYPE_L | _CTYPE_N | _CTYPE_B; +- static const mask graph = _CTYPE_P | _CTYPE_U | _CTYPE_L | _CTYPE_N; +- static const mask cntrl = _CTYPE_C; +- static const mask punct = _CTYPE_P; +- static const mask alnum = _CTYPE_U | _CTYPE_L | _CTYPE_N; ++ typedef const unsigned short* __to_type; ++ ++ typedef unsigned short mask; ++ ++ static const mask upper = _CTYPE_U; ++ static const mask lower = _CTYPE_L; ++ static const mask alpha = _CTYPE_A; ++ static const mask digit = _CTYPE_D; ++ static const mask xdigit = _CTYPE_X; ++ static const mask space = _CTYPE_S; ++ static const mask print = _CTYPE_R; ++ static const mask graph = _CTYPE_G; ++ static const mask cntrl = _CTYPE_C; ++ static const mask punct = _CTYPE_P; ++ static const mask alnum = _CTYPE_A | _CTYPE_D; + #endif + #if __cplusplus >= 201103L +- static const mask blank = space; ++ static const mask blank = space; + #endif + }; + +diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc +index ed3b7cd0d6a..33358e8f5d8 100644 +--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc ++++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc +@@ -38,11 +38,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + + // Information as gleaned from /usr/include/ctype.h + +- extern "C" const u_int8_t _C_ctype_[]; +- + const ctype_base::mask* + ctype::classic_table() throw() +- { return _C_ctype_ + 1; } ++ { return _C_ctype_tab_ + 1; } + + ctype::ctype(__c_locale, const mask* __table, bool __del, + size_t __refs) +@@ -69,14 +67,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + + char + ctype::do_toupper(char __c) const +- { return ::toupper((int) __c); } ++ { return ::toupper((int)(unsigned char) __c); } + + const char* + ctype::do_toupper(char* __low, const char* __high) const + { + while (__low < __high) + { +- *__low = ::toupper((int) *__low); ++ *__low = ::toupper((int)(unsigned char) *__low); + ++__low; + } + return __high; +@@ -84,14 +82,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + + char + ctype::do_tolower(char __c) const +- { return ::tolower((int) __c); } ++ { return ::tolower((int)(unsigned char) __c); } + + const char* + ctype::do_tolower(char* __low, const char* __high) const + { + while (__low < __high) + { +- *__low = ::tolower((int) *__low); ++ *__low = ::tolower((int)(unsigned char) *__low); + ++__low; + } + return __high; +diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h b/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h +index ace1120fba2..3234ce17c70 100644 +--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h ++++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_inline.h +@@ -48,7 +48,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION + is(const char* __low, const char* __high, mask* __vec) const + { + while (__low < __high) +- *__vec++ = _M_table[*__low++]; ++ *__vec++ = _M_table[(unsigned char)*__low++]; + return __high; + } + diff --git a/pkgs/by-name/gc/gcc/patches/libstdc++-target.patch b/pkgs/by-name/gc/gcc/patches/libstdc++-target.patch new file mode 100644 index 0000000..fb622b3 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/libstdc++-target.patch @@ -0,0 +1,32 @@ +Patch to make the target libraries 'configure' scripts find the proper CPP. +I noticed that building the mingw32 cross compiler. +Looking at the build script for mingw in archlinux, I think that only nixos +needs this patch. I don't know why. +diff --git a/Makefile.in b/Makefile.in +index 93f66b6..d691917 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -266,6 +266,7 @@ BASE_TARGET_EXPORTS = \ + AR="$(AR_FOR_TARGET)"; export AR; \ + AS="$(COMPILER_AS_FOR_TARGET)"; export AS; \ + CC="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \ ++ CPP="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CC; \ + CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \ + CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \ + CPPFLAGS="$(CPPFLAGS_FOR_TARGET)"; export CPPFLAGS; \ +@@ -291,11 +292,13 @@ BASE_TARGET_EXPORTS = \ + RAW_CXX_TARGET_EXPORTS = \ + $(BASE_TARGET_EXPORTS) \ + CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \ +- CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; ++ CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \ ++ CXXCPP="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX; + + NORMAL_TARGET_EXPORTS = \ + $(BASE_TARGET_EXPORTS) \ +- CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; ++ CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \ ++ CXXCPP="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX; + + # Where to find GMP + HOST_GMPLIBS = @gmplibs@ diff --git a/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv-gcc9.patch b/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv-gcc9.patch new file mode 100644 index 0000000..afe3f26 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv-gcc9.patch @@ -0,0 +1,17 @@ +diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h +index 701f5ea1544..8de333caf54 100644 +--- a/gcc/config/riscv/riscv.h ++++ b/gcc/config/riscv/riscv.h +@@ -886,11 +886,7 @@ extern unsigned riscv_stack_boundary; + "%{mabi=lp64f:lp64f}" \ + "%{mabi=lp64d:lp64d}" \ + +-#define STARTFILE_PREFIX_SPEC \ +- "/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/lib/ " \ +- "/usr/lib/ " ++#define STARTFILE_PREFIX_SPEC "" + + /* ISA constants needed for code generation. */ + #define OPCODE_LW 0x2003 diff --git a/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv.patch b/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv.patch new file mode 100644 index 0000000..00e2838 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/no-sys-dirs-riscv.patch @@ -0,0 +1,12 @@ +--- a/gcc/config/riscv/linux.h ++++ b/gcc/config/riscv/linux.h +@@ -69,8 +69,4 @@ + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack + +-#define STARTFILE_PREFIX_SPEC \ +- "/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ +- "/lib/ " \ +- "/usr/lib/ " ++#define STARTFILE_PREFIX_SPEC "" diff --git a/pkgs/by-name/gc/gcc/patches/no-sys-dirs.patch b/pkgs/by-name/gc/gcc/patches/no-sys-dirs.patch new file mode 100644 index 0000000..36df519 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/no-sys-dirs.patch @@ -0,0 +1,28 @@ +diff -ru -x '*~' gcc-4.8.3-orig/gcc/cppdefault.c gcc-4.8.3/gcc/cppdefault.c +--- gcc-4.8.3-orig/gcc/cppdefault.c 2013-01-10 21:38:27.000000000 +0100 ++++ gcc-4.8.3/gcc/cppdefault.c 2014-08-18 16:20:32.893944536 +0200 +@@ -35,6 +35,8 @@ + # undef CROSS_INCLUDE_DIR + #endif + ++#undef LOCAL_INCLUDE_DIR ++ + const struct default_include cpp_include_defaults[] + #ifdef INCLUDE_DEFAULTS + = INCLUDE_DEFAULTS; +diff -ru -x '*~' gcc-4.8.3-orig/gcc/gcc.c gcc-4.8.3/gcc/gcc.c +--- gcc-4.8.3-orig/gcc/gcc.c 2014-03-23 12:30:57.000000000 +0100 ++++ gcc-4.8.3/gcc/gcc.c 2014-08-18 13:19:32.689201690 +0200 +@@ -1162,10 +1162,10 @@ + /* Default prefixes to attach to command names. */ + + #ifndef STANDARD_STARTFILE_PREFIX_1 +-#define STANDARD_STARTFILE_PREFIX_1 "/lib/" ++#define STANDARD_STARTFILE_PREFIX_1 "" + #endif + #ifndef STANDARD_STARTFILE_PREFIX_2 +-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/" ++#define STANDARD_STARTFILE_PREFIX_2 "" + #endif + + #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */ diff --git a/pkgs/by-name/gc/gcc/patches/parallel-bconfig.patch b/pkgs/by-name/gc/gcc/patches/parallel-bconfig.patch new file mode 100644 index 0000000..bc56ac6 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/parallel-bconfig.patch @@ -0,0 +1,32 @@ +Hacky work-around for highly parallel builds. +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57125 + +diff --git a/gcc/Makefile.in b/gcc/Makefile.in +index aad927c..182f666 100644 +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -3908,21 +3908,21 @@ build/gengtype-lex.o: $(BCONFIG_H) + + gengtype-parse.o build/gengtype-parse.o : gengtype-parse.c gengtype.h \ + $(SYSTEM_H) +-gengtype-parse.o: $(CONFIG_H) ++gengtype-parse.o: $(CONFIG_H) $(BCONFIG_H) + CFLAGS-gengtype-parse.o += -DGENERATOR_FILE + build/gengtype-parse.o: $(BCONFIG_H) + + gengtype-state.o build/gengtype-state.o: gengtype-state.c $(SYSTEM_H) \ + gengtype.h errors.h double-int.h version.h $(HASHTAB_H) $(OBSTACK_H) \ + $(XREGEX_H) +-gengtype-state.o: $(CONFIG_H) ++gengtype-state.o: $(CONFIG_H) $(BCONFIG_H) + CFLAGS-gengtype-state.o += -DGENERATOR_FILE + build/gengtype-state.o: $(BCONFIG_H) + + gengtype.o build/gengtype.o : gengtype.c $(SYSTEM_H) gengtype.h \ + rtl.def insn-notes.def errors.h double-int.h version.h $(HASHTAB_H) \ + $(OBSTACK_H) $(XREGEX_H) +-gengtype.o: $(CONFIG_H) ++gengtype.o: $(CONFIG_H) $(BCONFIG_H) + CFLAGS-gengtype.o += -DGENERATOR_FILE + build/gengtype.o: $(BCONFIG_H) + diff --git a/pkgs/by-name/gc/gcc/patches/ppc-musl.patch b/pkgs/by-name/gc/gcc/patches/ppc-musl.patch new file mode 100644 index 0000000..bc90888 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/ppc-musl.patch @@ -0,0 +1,18 @@ +diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h +index cbee89140dd..e1f26b0a096 100644 +--- a/gcc/config/rs6000/sysv4.h ++++ b/gcc/config/rs6000/sysv4.h +@@ -996,13 +996,7 @@ ncrtn.o%s" + { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, \ + GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 }, + +-#ifdef LOCAL_INCLUDE_DIR +-#define INCLUDE_DEFAULTS_MUSL_LOCAL \ +- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, \ +- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, +-#else + #define INCLUDE_DEFAULTS_MUSL_LOCAL +-#endif + + #ifdef PREFIX_INCLUDE_DIR + #define INCLUDE_DEFAULTS_MUSL_PREFIX \ diff --git a/pkgs/by-name/gc/gcc/patches/res_state-not-declared.patch b/pkgs/by-name/gc/gcc/patches/res_state-not-declared.patch new file mode 100644 index 0000000..e970487 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/res_state-not-declared.patch @@ -0,0 +1,13 @@ +diff --git a/libsanitizer/tsan/tsan_platform_linux.cc b/libsanitizer/tsan/tsan_platform_linux.cc +index fe69430..49f5270 100644 +--- a/libsanitizer/tsan/tsan_platform_linux.cc ++++ b/libsanitizer/tsan/tsan_platform_linux.cc +@@ -351,7 +351,7 @@ bool IsGlobalVar(uptr addr) { + // closes within glibc. The code is a pure hack. + int ExtractResolvFDs(void *state, int *fds, int nfd) { + int cnt = 0; +- __res_state *statp = (__res_state*)state; ++ struct __res_state *statp = (struct __res_state*)state; + for (int i = 0; i < MAXNS && cnt < nfd; i++) { + if (statp->_u._ext.nsaddrs[i] && statp->_u._ext.nssocks[i] != -1) + fds[cnt++] = statp->_u._ext.nssocks[i]; diff --git a/pkgs/by-name/gc/gcc/patches/sigsegv-not-declared.patch b/pkgs/by-name/gc/gcc/patches/sigsegv-not-declared.patch new file mode 100644 index 0000000..f9cfaec --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/sigsegv-not-declared.patch @@ -0,0 +1,13 @@ +error: 'SIGSEGV' was not declared in this scope +diff --git a/libsanitizer/asan/asan_linux.cc b/libsanitizer/asan/asan_linux.cc +index 0692eb1..472f734 100644 +--- a/libsanitizer/asan/asan_linux.cc ++++ b/libsanitizer/asan/asan_linux.cc +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/pkgs/by-name/gc/gcc/patches/struct-sigaltstack-4.9.patch b/pkgs/by-name/gc/gcc/patches/struct-sigaltstack-4.9.patch new file mode 100644 index 0000000..fc126b4 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/struct-sigaltstack-4.9.patch @@ -0,0 +1,78 @@ +hand-resolved trivial conflicts for 4.9 from the upstream patch +72edc2c02f8b4768ad660f46a1c7e2400c0a8e06 +diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.cc b/libsanitizer/sanitizer_common/sanitizer_linux.cc +index 69c9c10..8e53673 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_linux.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_linux.cc +@@ -599,8 +599,7 @@ uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5) { + return internal_syscall(__NR_prctl, option, arg2, arg3, arg4, arg5); + } + +-uptr internal_sigaltstack(const struct sigaltstack *ss, +- struct sigaltstack *oss) { ++uptr internal_sigaltstack(const void *ss, void *oss) { + return internal_syscall(__NR_sigaltstack, (uptr)ss, (uptr)oss); + } + +diff --git a/libsanitizer/sanitizer_common/sanitizer_linux.h b/libsanitizer/sanitizer_common/sanitizer_linux.h +index 6422df1..8e111d1 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_linux.h ++++ b/libsanitizer/sanitizer_common/sanitizer_linux.h +@@ -18,7 +18,6 @@ + #include "sanitizer_platform_limits_posix.h" + + struct link_map; // Opaque type returned by dlopen(). +-struct sigaltstack; + + namespace __sanitizer { + // Dirent structure for getdents(). Note that this structure is different from +@@ -28,8 +27,7 @@ struct linux_dirent; + // Syscall wrappers. + uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count); + uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5); +-uptr internal_sigaltstack(const struct sigaltstack* ss, +- struct sigaltstack* oss); ++uptr internal_sigaltstack(const void* ss, void* oss); + uptr internal_sigaction(int signum, const __sanitizer_kernel_sigaction_t *act, + __sanitizer_kernel_sigaction_t *oldact); + uptr internal_sigprocmask(int how, __sanitizer_kernel_sigset_t *set, +diff --git a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc +index 891386dc..234e8c6 100644 +--- a/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc ++++ b/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc +@@ -273,7 +273,7 @@ static int TracerThread(void* argument) { + + // Alternate stack for signal handling. + InternalScopedBuffer handler_stack_memory(kHandlerStackSize); +- struct sigaltstack handler_stack; ++ stack_t handler_stack; + internal_memset(&handler_stack, 0, sizeof(handler_stack)); + handler_stack.ss_sp = handler_stack_memory.data(); + handler_stack.ss_size = kHandlerStackSize; +diff --git a/libsanitizer/tsan/tsan_platform_linux.cc b/libsanitizer/tsan/tsan_platform_linux.cc +index 2ed5718..6f972ab 100644 +--- a/libsanitizer/tsan/tsan_platform_linux.cc ++++ b/libsanitizer/tsan/tsan_platform_linux.cc +@@ -287,7 +287,7 @@ void InitializePlatform() { + int ExtractResolvFDs(void *state, int *fds, int nfd) { + #if SANITIZER_LINUX && !SANITIZER_ANDROID + int cnt = 0; +- __res_state *statp = (__res_state*)state; ++ struct __res_state *statp = (struct __res_state*)state; + for (int i = 0; i < MAXNS && cnt < nfd; i++) { + if (statp->_u._ext.nsaddrs[i] && statp->_u._ext.nssocks[i] != -1) + fds[cnt++] = statp->_u._ext.nssocks[i]; + +error: 'SIGSEGV' was not declared in this scope +diff --git a/libsanitizer/asan/asan_linux.cc b/libsanitizer/asan/asan_linux.cc +index 0692eb1..472f734 100644 +--- a/libsanitizer/asan/asan_linux.cc ++++ b/libsanitizer/asan/asan_linux.cc +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/pkgs/by-name/gc/gcc/patches/struct-ucontext-4.8.patch b/pkgs/by-name/gc/gcc/patches/struct-ucontext-4.8.patch new file mode 100644 index 0000000..630ef65 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/struct-ucontext-4.8.patch @@ -0,0 +1,177 @@ +From b685411208e0aaa79190d54faf945763514706b8 Mon Sep 17 00:00:00 2001 +From: jsm28 +Date: Tue, 4 Jul 2017 10:23:57 +0000 +Subject: [PATCH] Use ucontext_t not struct ucontext in linux-unwind.h files. + +Current glibc no longer gives the ucontext_t type the tag struct +ucontext, to conform with POSIX namespace rules. This requires +various linux-unwind.h files in libgcc, that were previously using +struct ucontext, to be fixed to use ucontext_t instead. This is +similar to the removal of the struct siginfo tag from siginfo_t some +years ago. + +This patch changes those files to use ucontext_t instead. As the +standard name that should be unconditionally safe, so this is not +restricted to architectures supported by glibc, or conditioned on the +glibc version. + +Tested compilation together with current glibc with glibc's +build-many-glibcs.py. + + * config/aarch64/linux-unwind.h (aarch64_fallback_frame_state), + config/alpha/linux-unwind.h (alpha_fallback_frame_state), + config/bfin/linux-unwind.h (bfin_fallback_frame_state), + config/i386/linux-unwind.h (x86_64_fallback_frame_state, + x86_fallback_frame_state), config/m68k/linux-unwind.h (struct + uw_ucontext), config/nios2/linux-unwind.h (struct nios2_ucontext), + config/pa/linux-unwind.h (pa32_fallback_frame_state), + config/sh/linux-unwind.h (sh_fallback_frame_state), + config/tilepro/linux-unwind.h (tile_fallback_frame_state), + config/xtensa/linux-unwind.h (xtensa_fallback_frame_state): Use + ucontext_t instead of struct ucontext. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@249957 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + libgcc/ChangeLog (REMOVED) | 14 ++++++++++++++ + libgcc/config/aarch64/linux-unwind.h | 2 +- + libgcc/config/alpha/linux-unwind.h | 2 +- + libgcc/config/bfin/linux-unwind.h | 2 +- + libgcc/config/i386/linux-unwind.h | 4 ++-- + libgcc/config/m68k/linux-unwind.h | 2 +- + libgcc/config/nios2/linux-unwind.h | 2 +- + libgcc/config/pa/linux-unwind.h | 2 +- + libgcc/config/sh/linux-unwind.h | 2 +- + libgcc/config/tilepro/linux-unwind.h | 2 +- + libgcc/config/xtensa/linux-unwind.h | 2 +- + 11 files changed, 25 insertions(+), 11 deletions(-) + +diff --git a/libgcc/config/aarch64/linux-unwind.h b/libgcc/config/aarch64/linux-unwind.h +index 4512efb..06de45a 100644 +--- a/libgcc/config/aarch64/linux-unwind.h ++++ b/libgcc/config/aarch64/linux-unwind.h +@@ -52,7 +52,7 @@ aarch64_fallback_frame_state (struct _Unwind_Context *context, + struct rt_sigframe + { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + }; + + struct rt_sigframe *rt_; +diff --git a/libgcc/config/alpha/linux-unwind.h b/libgcc/config/alpha/linux-unwind.h +index bdbba4a..e84812e 100644 +--- a/libgcc/config/alpha/linux-unwind.h ++++ b/libgcc/config/alpha/linux-unwind.h +@@ -51,7 +51,7 @@ alpha_fallback_frame_state (struct _Unwind_Context *context, + { + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + sc = &rt_->uc.uc_mcontext; + } +diff --git a/libgcc/config/bfin/linux-unwind.h b/libgcc/config/bfin/linux-unwind.h +index 77b7c23..8bf5e82 100644 +--- a/libgcc/config/bfin/linux-unwind.h ++++ b/libgcc/config/bfin/linux-unwind.h +@@ -52,7 +52,7 @@ bfin_fallback_frame_state (struct _Unwind_Context *context, + void *puc; + char retcode[8]; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + + /* The void * cast is necessary to avoid an aliasing warning. +diff --git a/libgcc/config/i386/linux-unwind.h b/libgcc/config/i386/linux-unwind.h +index 540a0a2..29efbe3 100644 +--- a/libgcc/config/i386/linux-unwind.h ++++ b/libgcc/config/i386/linux-unwind.h +@@ -58,7 +58,7 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context, + if (*(unsigned char *)(pc+0) == 0x48 + && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL) + { +- struct ucontext *uc_ = context->cfa; ++ ucontext_t *uc_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem + because it does not alias anything. */ +@@ -138,7 +138,7 @@ x86_fallback_frame_state (struct _Unwind_Context *context, + siginfo_t *pinfo; + void *puc; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem +diff --git a/libgcc/config/m68k/linux-unwind.h b/libgcc/config/m68k/linux-unwind.h +index 75b7cf7..f964e24 100644 +--- a/libgcc/config/m68k/linux-unwind.h ++++ b/libgcc/config/m68k/linux-unwind.h +@@ -33,7 +33,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + /* is unfortunately broken right now. */ + struct uw_ucontext { + unsigned long uc_flags; +- struct ucontext *uc_link; ++ ucontext_t *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + unsigned long uc_filler[80]; +diff --git a/libgcc/config/pa/linux-unwind.h b/libgcc/config/pa/linux-unwind.h +index 9a2657f..e47493d 100644 +--- a/libgcc/config/pa/linux-unwind.h ++++ b/libgcc/config/pa/linux-unwind.h +@@ -80,7 +80,7 @@ pa32_fallback_frame_state (struct _Unwind_Context *context, + struct sigcontext *sc; + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *frame; + + /* rt_sigreturn trampoline: +diff --git a/libgcc/config/sh/linux-unwind.h b/libgcc/config/sh/linux-unwind.h +index e389cac..0bf43ba 100644 +--- a/libgcc/config/sh/linux-unwind.h ++++ b/libgcc/config/sh/linux-unwind.h +@@ -180,7 +180,7 @@ sh_fallback_frame_state (struct _Unwind_Context *context, + { + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem +diff --git a/libgcc/config/tilepro/linux-unwind.h b/libgcc/config/tilepro/linux-unwind.h +index 796e976..75f8890 100644 +--- a/libgcc/config/tilepro/linux-unwind.h ++++ b/libgcc/config/tilepro/linux-unwind.h +@@ -61,7 +61,7 @@ tile_fallback_frame_state (struct _Unwind_Context *context, + struct rt_sigframe { + unsigned char save_area[C_ABI_SAVE_AREA_SIZE]; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_; + + /* Return if this is not a signal handler. */ +diff --git a/libgcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h +index 9872492..586a9d4 100644 +--- a/libgcc/config/xtensa/linux-unwind.h ++++ b/libgcc/config/xtensa/linux-unwind.h +@@ -67,7 +67,7 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, + + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_; + + /* movi a2, __NR_rt_sigreturn; syscall */ +-- +2.9.3 + diff --git a/pkgs/by-name/gc/gcc/patches/struct-ucontext.patch b/pkgs/by-name/gc/gcc/patches/struct-ucontext.patch new file mode 100644 index 0000000..c7fb6d1 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/struct-ucontext.patch @@ -0,0 +1,190 @@ +From b685411208e0aaa79190d54faf945763514706b8 Mon Sep 17 00:00:00 2001 +From: jsm28 +Date: Tue, 4 Jul 2017 10:23:57 +0000 +Subject: [PATCH] Use ucontext_t not struct ucontext in linux-unwind.h files. + +Current glibc no longer gives the ucontext_t type the tag struct +ucontext, to conform with POSIX namespace rules. This requires +various linux-unwind.h files in libgcc, that were previously using +struct ucontext, to be fixed to use ucontext_t instead. This is +similar to the removal of the struct siginfo tag from siginfo_t some +years ago. + +This patch changes those files to use ucontext_t instead. As the +standard name that should be unconditionally safe, so this is not +restricted to architectures supported by glibc, or conditioned on the +glibc version. + +Tested compilation together with current glibc with glibc's +build-many-glibcs.py. + + * config/aarch64/linux-unwind.h (aarch64_fallback_frame_state), + config/alpha/linux-unwind.h (alpha_fallback_frame_state), + config/bfin/linux-unwind.h (bfin_fallback_frame_state), + config/i386/linux-unwind.h (x86_64_fallback_frame_state, + x86_fallback_frame_state), config/m68k/linux-unwind.h (struct + uw_ucontext), config/nios2/linux-unwind.h (struct nios2_ucontext), + config/pa/linux-unwind.h (pa32_fallback_frame_state), + config/sh/linux-unwind.h (sh_fallback_frame_state), + config/tilepro/linux-unwind.h (tile_fallback_frame_state), + config/xtensa/linux-unwind.h (xtensa_fallback_frame_state): Use + ucontext_t instead of struct ucontext. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@249957 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + libgcc/ChangeLog (REMOVED) | 14 ++++++++++++++ + libgcc/config/aarch64/linux-unwind.h | 2 +- + libgcc/config/alpha/linux-unwind.h | 2 +- + libgcc/config/bfin/linux-unwind.h | 2 +- + libgcc/config/i386/linux-unwind.h | 4 ++-- + libgcc/config/m68k/linux-unwind.h | 2 +- + libgcc/config/nios2/linux-unwind.h | 2 +- + libgcc/config/pa/linux-unwind.h | 2 +- + libgcc/config/sh/linux-unwind.h | 2 +- + libgcc/config/tilepro/linux-unwind.h | 2 +- + libgcc/config/xtensa/linux-unwind.h | 2 +- + 11 files changed, 25 insertions(+), 11 deletions(-) + +diff --git a/libgcc/config/aarch64/linux-unwind.h b/libgcc/config/aarch64/linux-unwind.h +index 4512efb..06de45a 100644 +--- a/libgcc/config/aarch64/linux-unwind.h ++++ b/libgcc/config/aarch64/linux-unwind.h +@@ -52,7 +52,7 @@ aarch64_fallback_frame_state (struct _Unwind_Context *context, + struct rt_sigframe + { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + }; + + struct rt_sigframe *rt_; +diff --git a/libgcc/config/alpha/linux-unwind.h b/libgcc/config/alpha/linux-unwind.h +index bdbba4a..e84812e 100644 +--- a/libgcc/config/alpha/linux-unwind.h ++++ b/libgcc/config/alpha/linux-unwind.h +@@ -51,7 +51,7 @@ alpha_fallback_frame_state (struct _Unwind_Context *context, + { + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + sc = &rt_->uc.uc_mcontext; + } +diff --git a/libgcc/config/bfin/linux-unwind.h b/libgcc/config/bfin/linux-unwind.h +index 77b7c23..8bf5e82 100644 +--- a/libgcc/config/bfin/linux-unwind.h ++++ b/libgcc/config/bfin/linux-unwind.h +@@ -52,7 +52,7 @@ bfin_fallback_frame_state (struct _Unwind_Context *context, + void *puc; + char retcode[8]; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + + /* The void * cast is necessary to avoid an aliasing warning. +diff --git a/libgcc/config/i386/linux-unwind.h b/libgcc/config/i386/linux-unwind.h +index 540a0a2..29efbe3 100644 +--- a/libgcc/config/i386/linux-unwind.h ++++ b/libgcc/config/i386/linux-unwind.h +@@ -58,7 +58,7 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context, + if (*(unsigned char *)(pc+0) == 0x48 + && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL) + { +- struct ucontext *uc_ = context->cfa; ++ ucontext_t *uc_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem + because it does not alias anything. */ +@@ -138,7 +138,7 @@ x86_fallback_frame_state (struct _Unwind_Context *context, + siginfo_t *pinfo; + void *puc; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem +diff --git a/libgcc/config/m68k/linux-unwind.h b/libgcc/config/m68k/linux-unwind.h +index 75b7cf7..f964e24 100644 +--- a/libgcc/config/m68k/linux-unwind.h ++++ b/libgcc/config/m68k/linux-unwind.h +@@ -33,7 +33,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + /* is unfortunately broken right now. */ + struct uw_ucontext { + unsigned long uc_flags; +- struct ucontext *uc_link; ++ ucontext_t *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + unsigned long uc_filler[80]; +diff --git a/libgcc/config/nios2/linux-unwind.h b/libgcc/config/nios2/linux-unwind.h +index 2304142..30f25ea 100644 +--- a/libgcc/config/nios2/linux-unwind.h ++++ b/libgcc/config/nios2/linux-unwind.h +@@ -38,7 +38,7 @@ struct nios2_mcontext { + + struct nios2_ucontext { + unsigned long uc_flags; +- struct ucontext *uc_link; ++ ucontext_t *uc_link; + stack_t uc_stack; + struct nios2_mcontext uc_mcontext; + sigset_t uc_sigmask; /* mask last for extensibility */ +diff --git a/libgcc/config/pa/linux-unwind.h b/libgcc/config/pa/linux-unwind.h +index 9a2657f..e47493d 100644 +--- a/libgcc/config/pa/linux-unwind.h ++++ b/libgcc/config/pa/linux-unwind.h +@@ -80,7 +80,7 @@ pa32_fallback_frame_state (struct _Unwind_Context *context, + struct sigcontext *sc; + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *frame; + + /* rt_sigreturn trampoline: +diff --git a/libgcc/config/sh/linux-unwind.h b/libgcc/config/sh/linux-unwind.h +index e389cac..0bf43ba 100644 +--- a/libgcc/config/sh/linux-unwind.h ++++ b/libgcc/config/sh/linux-unwind.h +@@ -180,7 +180,7 @@ sh_fallback_frame_state (struct _Unwind_Context *context, + { + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_ = context->cfa; + /* The void * cast is necessary to avoid an aliasing warning. + The aliasing warning is correct, but should not be a problem +diff --git a/libgcc/config/tilepro/linux-unwind.h b/libgcc/config/tilepro/linux-unwind.h +index 796e976..75f8890 100644 +--- a/libgcc/config/tilepro/linux-unwind.h ++++ b/libgcc/config/tilepro/linux-unwind.h +@@ -61,7 +61,7 @@ tile_fallback_frame_state (struct _Unwind_Context *context, + struct rt_sigframe { + unsigned char save_area[C_ABI_SAVE_AREA_SIZE]; + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_; + + /* Return if this is not a signal handler. */ +diff --git a/libgcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h +index 9872492..586a9d4 100644 +--- a/libgcc/config/xtensa/linux-unwind.h ++++ b/libgcc/config/xtensa/linux-unwind.h +@@ -67,7 +67,7 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, + + struct rt_sigframe { + siginfo_t info; +- struct ucontext uc; ++ ucontext_t uc; + } *rt_; + + /* movi a2, __NR_rt_sigreturn; syscall */ +-- +2.9.3 + diff --git a/pkgs/by-name/gc/gcc/patches/update-mcfgthread-patches.sh b/pkgs/by-name/gc/gcc/patches/update-mcfgthread-patches.sh new file mode 100755 index 0000000..c4fd79b --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/update-mcfgthread-patches.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env nix-shell +#! nix-shell -i bash -p curl + +# We use this script to download local copies instead of using +# fetchpatch because lmhouse/MINGW-packages-dev is constantly rebased +# against msys2/MINGW-packages-dev and won't have stable commit hashes. + +name=Added-mcf-thread-model-support-from-mcfgthread.patch +source=https://raw.githubusercontent.com/lhmouse/MINGW-packages-dev/master/mingw-w64-gcc-git +dest=$(dirname "$0") + +for majorVersion in 6 7 8 9 10; do + curl "$source/9000-gcc-$majorVersion-branch-$name" \ + > "$dest/$majorVersion/$name" +done diff --git a/pkgs/by-name/gc/gcc/patches/use-source-date-epoch.patch b/pkgs/by-name/gc/gcc/patches/use-source-date-epoch.patch new file mode 100644 index 0000000..65a5ab0 --- /dev/null +++ b/pkgs/by-name/gc/gcc/patches/use-source-date-epoch.patch @@ -0,0 +1,52 @@ +https://gcc.gnu.org/ml/gcc-patches/2015-06/msg02210.html + +diff --git a/libcpp/macro.c b/libcpp/macro.c +index 1e0a0b5..a52e3cb 100644 +--- a/libcpp/macro.c ++++ b/libcpp/macro.c +@@ -349,14 +349,38 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node) + slow on some systems. */ + time_t tt; + struct tm *tb = NULL; ++ char *source_date_epoch; + +- /* (time_t) -1 is a legitimate value for "number of seconds +- since the Epoch", so we have to do a little dance to +- distinguish that from a genuine error. */ +- errno = 0; +- tt = time(NULL); +- if (tt != (time_t)-1 || errno == 0) +- tb = localtime (&tt); ++ /* Allow the date and time to be set externally by an exported ++ environment variable to enable reproducible builds. */ ++ source_date_epoch = getenv ("SOURCE_DATE_EPOCH"); ++ if (source_date_epoch) ++ { ++ errno = 0; ++ tt = (time_t) strtol (source_date_epoch, NULL, 10); ++ if (errno == 0) ++ { ++ tb = gmtime (&tt); ++ if (tb == NULL) ++ cpp_error (pfile, CPP_DL_ERROR, ++ "SOURCE_DATE_EPOCH=\"%s\" is not a valid date", ++ source_date_epoch); ++ } ++ else ++ cpp_error (pfile, CPP_DL_ERROR, ++ "SOURCE_DATE_EPOCH=\"%s\" is not a valid number", ++ source_date_epoch); ++ } ++ else ++ { ++ /* (time_t) -1 is a legitimate value for "number of seconds ++ since the Epoch", so we have to do a little dance to ++ distinguish that from a genuine error. */ ++ errno = 0; ++ tt = time(NULL); ++ if (tt != (time_t)-1 || errno == 0) ++ tb = localtime (&tt); ++ } + + if (tb) + { diff --git a/pkgs/by-name/gc/gcc/versions.nix b/pkgs/by-name/gc/gcc/versions.nix new file mode 100644 index 0000000..261ffc6 --- /dev/null +++ b/pkgs/by-name/gc/gcc/versions.nix @@ -0,0 +1,38 @@ +let + majorMinorToVersionMap = { + "13" = "13.2.0"; + "12" = "12.3.0"; + "11" = "11.4.0"; + "10" = "10.5.0"; + "9" = "9.5.0"; + "8" = "8.5.0"; + "7" = "7.5.0"; + "6" = "6.5.0"; + "4.9"= "4.9.4"; + "4.8"= "4.8.5"; + }; + + fromMajorMinor = majorMinorVersion: + majorMinorToVersionMap."${majorMinorVersion}"; + + # TODO(amjoseph): convert older hashes to SRI form + srcHashForVersion = version: { + # NOTE: there is no need to remove hashes of obsolete minor + # versions when adding a new minor version. + "13.2.0" = "sha256-4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o="; + "12.3.0" = "sha256-lJpdT5nnhkIak7Uysi/6tVeN5zITaZdbka7Jet/ajDs="; + "11.4.0" = "sha256-Py2yIrAH6KSiPNW6VnJu8I6LHx6yBV7nLBQCzqc6jdk="; + "10.5.0" = "sha256-JRCVQ/30bzl8NHtdi3osflaUpaUczkucbh6opxyjB8E="; + "9.5.0" = "13ygjmd938m0wmy946pxdhz9i1wq7z4w10l6pvidak0xxxj9yxi7"; + "8.5.0" = "0l7d4m9jx124xsk6xardchgy2k5j5l2b15q322k31f0va4d8826k"; + "7.5.0" = "0qg6kqc5l72hpnj4vr6l0p69qav0rh4anlkk3y55540zy3klc6dq"; + "6.5.0" = "0i89fksfp6wr1xg9l8296aslcymv2idn60ip31wr9s4pwin7kwby"; + "4.9.4" = "14l06m7nvcvb0igkbip58x59w3nq6315k6jcz3wr9ch1rn9d44bc"; + "4.8.5" = "08yggr18v373a1ihj0rg2vd6psnic42b518xcgp3r9k81xz1xyr2"; + }."${version}"; + +in { + inherit fromMajorMinor; + inherit srcHashForVersion; + allMajorVersions = builtins.attrNames majorMinorToVersionMap; +} diff --git a/pkgs/by-name/gd/gd/default.nix b/pkgs/by-name/gd/gd/default.nix new file mode 100644 index 0000000..af96d9d --- /dev/null +++ b/pkgs/by-name/gd/gd/default.nix @@ -0,0 +1,67 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, autoconf +, automake +, pkg-config +, zlib +, libpng +, libjpeg +, libwebp +, libtiff +, withXorg ? true +, libXpm +, libavif +, fontconfig +, freetype +}: + +stdenv.mkDerivation rec { + pname = "gd"; + version = "2.3.3"; + + src = fetchurl { + url = "https://github.com/libgd/libgd/releases/download/${pname}-${version}/libgd-${version}.tar.xz"; + sha256 = "0qas3q9xz3wgw06dm2fj0i189rain6n60z1vyq50d5h7wbn25s1z"; + }; + + patches = [ + (fetchpatch { # included in > 2.3.3 + name = "restore-GD_FLIP.patch"; + url = "https://github.com/libgd/libgd/commit/f4bc1f5c26925548662946ed7cfa473c190a104a.diff"; + sha256 = "XRXR3NOkbEub3Nybaco2duQk0n8vxif5mTl2AUacn9w="; + }) + ]; + + hardeningDisable = [ "format" ]; + + configureFlags = [ + "--enable-gd-formats" + ] + # -pthread gets passed to clang, causing warnings + ++ lib.optional stdenv.isDarwin "--enable-werror=no"; + + nativeBuildInputs = [ autoconf automake pkg-config ]; + + buildInputs = [ zlib freetype libpng libjpeg libwebp libtiff libavif ] + ++ lib.optionals withXorg [ fontconfig libXpm ]; + + outputs = [ "bin" "dev" "out" ]; + + postFixup = '' + moveToOutput "bin/gdlib-config" $dev + ''; + + enableParallelBuilding = true; + + doCheck = false; # fails 2 tests + + meta = with lib; { + homepage = "https://libgd.github.io/"; + description = "A dynamic image creation library"; + license = licenses.free; # some custom license + platforms = platforms.unix; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/gd/gd/packages.nix b/pkgs/by-name/gd/gd/packages.nix new file mode 100644 index 0000000..5d7d62f --- /dev/null +++ b/pkgs/by-name/gd/gd/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gd = callPackage ../development/libraries/gd { + automake = automake115x; + }; +} diff --git a/pkgs/by-name/gd/gdb/darwin-target-match.patch b/pkgs/by-name/gd/gdb/darwin-target-match.patch new file mode 100644 index 0000000..978a679 --- /dev/null +++ b/pkgs/by-name/gd/gdb/darwin-target-match.patch @@ -0,0 +1,11 @@ +--- a/configure 2017-06-05 00:51:26.000000000 +0900 ++++ b/configure 2018-03-06 23:12:58.000000000 +0900 +@@ -3644,7 +3644,7 @@ + noconfigdirs="$noconfigdirs ld gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- x86_64-*-darwin[912]*) ++ x86_64-*-darwin*) + noconfigdirs="$noconfigdirs ld gas gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; diff --git a/pkgs/by-name/gd/gdb/debug-info-from-env.patch b/pkgs/by-name/gd/gdb/debug-info-from-env.patch new file mode 100644 index 0000000..7a3d78d --- /dev/null +++ b/pkgs/by-name/gd/gdb/debug-info-from-env.patch @@ -0,0 +1,17 @@ +--- a/gdb/main.c ++++ b/gdb/main.c +@@ -708,8 +708,12 @@ captured_main_1 (struct captured_main_args *context) + if (gdb_sysroot.empty ()) + gdb_sysroot = TARGET_SYSROOT_PREFIX; + +- debug_file_directory +- = relocate_gdb_directory (DEBUGDIR, DEBUGDIR_RELOCATABLE); ++ const char * nix_debug = getenv ("NIX_DEBUG_INFO_DIRS"); ++ if (nix_debug != NULL) ++ debug_file_directory = nix_debug; ++ else ++ debug_file_directory ++ = relocate_gdb_directory (DEBUGDIR, DEBUGDIR_RELOCATABLE); + + gdb_datadir = relocate_gdb_directory (GDB_DATADIR, + GDB_DATADIR_RELOCATABLE); diff --git a/pkgs/by-name/gd/gdb/default.nix b/pkgs/by-name/gd/gdb/default.nix new file mode 100644 index 0000000..e607967 --- /dev/null +++ b/pkgs/by-name/gd/gdb/default.nix @@ -0,0 +1,159 @@ +{ lib, stdenv, targetPackages + +# Build time +, fetchurl, fetchpatch, pkg-config, perl, texinfo, setupDebugInfoDirs, buildPackages + +# Run time +, ncurses, readline, gmp, mpfr, expat, libipt, zlib, zstd, xz, dejagnu, sourceHighlight, libiconv + +, pythonSupport ? stdenv.hostPlatform == stdenv.buildPlatform && !stdenv.hostPlatform.isCygwin, python3 ? null +, enableDebuginfod ? lib.meta.availableOn stdenv.hostPlatform elfutils, elfutils +, guile ? null +, hostCpuOnly ? false +, enableSim ? false +, safePaths ? [ + # $debugdir:$datadir/auto-load are whitelisted by default by GDB + "$debugdir" "$datadir/auto-load" + # targetPackages so we get the right libc when cross-compiling and using buildPackages.gdb + targetPackages.stdenv.cc.cc.lib + ] +, writeScript +}: + +let + basename = "gdb"; + targetPrefix = lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) + "${stdenv.targetPlatform.config}-"; +in + +assert pythonSupport -> python3 != null; + +stdenv.mkDerivation rec { + pname = targetPrefix + basename + lib.optionalString hostCpuOnly "-host-cpu-only"; + version = "14.2"; + + src = fetchurl { + url = "mirror://gnu/gdb/${basename}-${version}.tar.xz"; + hash = "sha256-LU3YBh2N7RK2xj9V5FNEiB6CJhBfTSqbI0BA76XOd3I="; + }; + + postPatch = lib.optionalString stdenv.isDarwin '' + substituteInPlace gdb/darwin-nat.c \ + --replace '#include "bfd/mach-o.h"' '#include "mach-o.h"' + '' + lib.optionalString stdenv.hostPlatform.isMusl '' + substituteInPlace sim/erc32/erc32.c --replace sys/fcntl.h fcntl.h + substituteInPlace sim/erc32/interf.c --replace sys/fcntl.h fcntl.h + substituteInPlace sim/erc32/sis.c --replace sys/fcntl.h fcntl.h + substituteInPlace sim/ppc/emul_unix.c --replace sys/termios.h termios.h + ''; + + patches = [ + ./debug-info-from-env.patch + ] ++ lib.optionals stdenv.isDarwin [ + ./darwin-target-match.patch + ]; + + nativeBuildInputs = [ pkg-config texinfo perl setupDebugInfoDirs ]; + + buildInputs = [ ncurses readline gmp mpfr expat libipt zlib zstd xz guile sourceHighlight ] + ++ lib.optional pythonSupport python3 + ++ lib.optional doCheck dejagnu + ++ lib.optional enableDebuginfod (elfutils.override { enableDebuginfod = true; }) + ++ lib.optional stdenv.isDarwin libiconv; + + propagatedNativeBuildInputs = [ setupDebugInfoDirs ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + enableParallelBuilding = true; + + # darwin build fails with format hardening since v7.12 + hardeningDisable = lib.optionals stdenv.isDarwin [ "format" ]; + + env.NIX_CFLAGS_COMPILE = "-Wno-format-nonliteral"; + + configurePlatforms = [ "build" "host" "target" ]; + + preConfigure = '' + # remove precompiled docs, required for man gdbinit to mention /etc/gdb/gdbinit + rm gdb/doc/*.info* + rm gdb/doc/*.5 + rm gdb/doc/*.1 + # fix doc build https://sourceware.org/bugzilla/show_bug.cgi?id=27808 + rm gdb/doc/GDBvn.texi + + # GDB have to be built out of tree. + mkdir _build + cd _build + ''; + configureScript = "../configure"; + + configureFlags = with lib; [ + # Set the program prefix to the current targetPrefix. + # This ensures that the prefix always conforms to + # nixpkgs' expectations instead of relying on the build + # system which only receives `config` which is merely a + # subset of the platform description. + "--program-prefix=${targetPrefix}" + + "--disable-werror" + ] ++ lib.optional (!hostCpuOnly) "--enable-targets=all" ++ [ + "--enable-64-bit-bfd" + "--disable-install-libbfd" + "--disable-shared" "--enable-static" + "--with-system-zlib" + "--with-system-readline" + + "--with-system-gdbinit=/etc/gdb/gdbinit" + "--with-system-gdbinit-dir=/etc/gdb/gdbinit.d" + + "--with-gmp=${gmp.dev}" + "--with-mpfr=${mpfr.dev}" + "--with-expat" "--with-libexpat-prefix=${expat.dev}" + "--with-auto-load-safe-path=${builtins.concatStringsSep ":" safePaths}" + ] ++ lib.optional (!pythonSupport) "--without-python" + ++ lib.optional stdenv.hostPlatform.isMusl "--disable-nls" + ++ lib.optional stdenv.hostPlatform.isStatic "--disable-inprocess-agent" + ++ lib.optional enableDebuginfod "--with-debuginfod=yes" + ++ lib.optional (!enableSim) "--disable-sim"; + + postInstall = + '' # Remove Info files already provided by Binutils and other packages. + rm -v $out/share/info/bfd.info + ''; + + # TODO: Investigate & fix the test failures. + doCheck = false; + + passthru = { + updateScript = writeScript "update-gdb" '' + #!/usr/bin/env nix-shell + #!nix-shell -i bash -p curl pcre common-updater-scripts + + set -eu -o pipefail + + # Expect the text in format of '

GDB version 12.1

' + new_version="$(curl -s https://www.sourceware.org/gdb/ | + pcregrep -o1 '

GDB version ([0-9.]+)

')" + update-source-version ${pname} "$new_version" + ''; + }; + + meta = with lib; { + description = "The GNU Project debugger"; + + longDescription = '' + GDB, the GNU Project debugger, allows you to see what is going + on `inside' another program while it executes -- or what another + program was doing at the moment it crashed. + ''; + + homepage = "https://www.gnu.org/software/gdb/"; + + license = lib.licenses.gpl3Plus; + + # GDB upstream does not support ARM darwin + platforms = with platforms; linux ++ cygwin ++ ["x86_64-darwin"]; + maintainers = with maintainers; [ pierron globin lsix ]; + }; +} diff --git a/pkgs/by-name/gd/gdb/packages.nix b/pkgs/by-name/gd/gdb/packages.nix new file mode 100644 index 0000000..d933365 --- /dev/null +++ b/pkgs/by-name/gd/gdb/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gdb = callPackage ./. { + guile = null; + }; + gdbHostCpuOnly = gdb.override { hostCpuOnly = true; }; +} diff --git a/pkgs/by-name/gd/gdbm/default.nix b/pkgs/by-name/gd/gdbm/default.nix new file mode 100644 index 0000000..e1a3def --- /dev/null +++ b/pkgs/by-name/gd/gdbm/default.nix @@ -0,0 +1,67 @@ +{ stdenv, lib, fetchurl }: + +stdenv.mkDerivation rec { + pname = "gdbm"; + version = "1.23"; + + src = fetchurl { + url = "mirror://gnu/gdbm/${pname}-${version}.tar.gz"; + sha256 = "sha256-dLEIHSH/8TrkvXwW5dblBKTCb3zeHcoNljpIQXS7ys0="; + }; + + doCheck = true; # not cross; + + # Linking static stubs on cygwin requires correct ordering. + # Consider upstreaming this. + + # Disable dbmfetch03.at test because it depends on unlink() + # failing on a link in a chmod -w directory, which cygwin + # apparently allows. + postPatch = lib.optionalString stdenv.buildPlatform.isCygwin '' + substituteInPlace tests/Makefile.in --replace \ + '_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la' \ + '_LDADD = ../compat/libgdbm_compat.la ../src/libgdbm.la' + substituteInPlace tests/testsuite.at --replace \ + 'm4_include([dbmfetch03.at])' "" + ''; + + enableParallelBuilding = true; + configureFlags = [ "--enable-libgdbm-compat" ]; + + # create symlinks for compatibility + postInstall = '' + install -dm755 $out/include/gdbm + ( + cd $out/include/gdbm + ln -s ../gdbm.h gdbm.h + ln -s ../ndbm.h ndbm.h + ln -s ../dbm.h dbm.h + ) + ''; + + meta = with lib; { + description = "GNU dbm key/value database library"; + longDescription = '' + GNU dbm (or GDBM, for short) is a library of database functions that + use extensible hashing and work similar to the standard UNIX dbm. + These routines are provided to a programmer needing to create and + manipulate a hashed database. + + The basic use of GDBM is to store key/data pairs in a data file. + Each key must be unique and each key is paired with only one data + item. + + The library provides primitives for storing key/data pairs, + searching and retrieving the data by its key and deleting a key + along with its data. It also support sequential iteration over all + key/data pairs in a database. + + For compatibility with programs using old UNIX dbm function, the + package also provides traditional dbm and ndbm interfaces. + ''; + homepage = "https://www.gnu.org/software/gdbm/"; + license = licenses.gpl3Plus; + platforms = platforms.all; + maintainers = [ maintainers.vrthra ]; + }; +} diff --git a/pkgs/by-name/ge/getopt/default.nix b/pkgs/by-name/ge/getopt/default.nix new file mode 100644 index 0000000..6b6cbf6 --- /dev/null +++ b/pkgs/by-name/ge/getopt/default.nix @@ -0,0 +1,28 @@ +{lib, stdenv, fetchurl}: + +stdenv.mkDerivation rec { + pname = "getopt"; + version = "1.1.6"; + src = fetchurl { + url = "http://frodo.looijaard.name/system/files/software/${pname}/${pname}-${version}.tar.gz"; + sha256 = "1zn5kp8ar853rin0ay2j3p17blxy16agpp8wi8wfg4x98b31vgyh"; + }; + + # This should be fine on Linux and Darwin. Clang 16 requires it because otherwise getopt will + # attempt to use C library functions without declaring them, which is raised as an error. + env.NIX_CFLAGS_COMPILE = "-D__GNU_LIBRARY__"; + + makeFlags = [ + "WITHOUT_GETTEXT=1" + "LIBCGETOPT=0" + "prefix=${placeholder "out"}" + "CC:=$(CC)" + ]; + + meta = { + platforms = lib.platforms.unix; + homepage = "http://frodo.looijaard.name/project/getopt"; + description = "Parses command-line arguments from shell scripts"; + mainProgram = "getopt"; + }; +} diff --git a/pkgs/by-name/ge/gettext/0001-msginit-Do-not-use-POT-Creation-Date.patch b/pkgs/by-name/ge/gettext/0001-msginit-Do-not-use-POT-Creation-Date.patch new file mode 100644 index 0000000..eea9dc6 --- /dev/null +++ b/pkgs/by-name/ge/gettext/0001-msginit-Do-not-use-POT-Creation-Date.patch @@ -0,0 +1,32 @@ +From 1e000ca711886055176a2f90197a383d09de0e67 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Miguel=20=C3=81ngel=20Arruga=20Vivas?= + +Date: Fri, 18 Dec 2020 14:19:36 +0100 +Subject: [PATCH] msginit: Do not use POT-Creation-Date. + +* gettext-tools/src/msginit.c (po_revision_date): Do not use +POT-Creation-Date when the file is automatically generated. +--- + gettext-tools/src/msginit.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/gettext-tools/src/msginit.c b/gettext-tools/src/msginit.c +index 8ca9a3b77..06e0e7195 100644 +--- a/gettext-tools/src/msginit.c ++++ b/gettext-tools/src/msginit.c +@@ -1075,9 +1075,9 @@ static const char * + po_revision_date (const char *header) + { + if (no_translator) +- /* Because the PO file is automatically generated, we use the +- POT-Creation-Date, not the current time. */ +- return get_field (header, "POT-Creation-Date"); ++ /* Because the PO file is automatically generated, we don't ++ generate PO-Revision-Date field. */ ++ return NULL; + else + { + /* Assume the translator will modify the PO file now. */ +-- +2.29.2 + diff --git a/pkgs/by-name/ge/gettext/absolute-paths.diff b/pkgs/by-name/ge/gettext/absolute-paths.diff new file mode 100644 index 0000000..af37f61 --- /dev/null +++ b/pkgs/by-name/ge/gettext/absolute-paths.diff @@ -0,0 +1,21 @@ +diff --git a/gettext-runtime/src/gettext.sh.in b/gettext-runtime/src/gettext.sh.in +index 1dfa3bb..d6ef8a8 100644 +--- a/gettext-runtime/src/gettext.sh.in ++++ b/gettext-runtime/src/gettext.sh.in +@@ -86,14 +86,14 @@ fi + # looks up the translation of MSGID and substitutes shell variables in the + # result. + eval_gettext () { +- gettext "$1" | (export PATH `envsubst --variables "$1"`; envsubst "$1") ++ @out@/bin/gettext "$1" | (export PATH `@out@/bin/envsubst --variables "$1"`; @out@/bin/envsubst "$1") + } + + # eval_ngettext MSGID MSGID-PLURAL COUNT + # looks up the translation of MSGID / MSGID-PLURAL for COUNT and substitutes + # shell variables in the result. + eval_ngettext () { +- ngettext "$1" "$2" "$3" | (export PATH `envsubst --variables "$1 $2"`; envsubst "$1 $2") ++ @out@/bin/ngettext "$1" "$2" "$3" | (export PATH `@out@/bin/envsubst --variables "$1 $2"`; @out@/bin/envsubst "$1 $2") + } + + # Note: This use of envsubst is much safer than using the shell built-in 'eval' diff --git a/pkgs/by-name/ge/gettext/default.nix b/pkgs/by-name/ge/gettext/default.nix new file mode 100644 index 0000000..f4757e9 --- /dev/null +++ b/pkgs/by-name/ge/gettext/default.nix @@ -0,0 +1,109 @@ +{ stdenv, lib, fetchurl, libiconv, xz, bash, path +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "gettext"; + version = "0.21.1"; + + src = fetchurl { + url = "mirror://gnu/gettext/${pname}-${version}.tar.gz"; + sha256 = "sha256-6MNlDh2M7odcTzVWQjgsHfgwWL1aEe6FVcDPJ21kbUU="; + }; + patches = [ + ./absolute-paths.diff + # fix reproducibile output, in particular in the grub2 build + # https://savannah.gnu.org/bugs/index.php?59658 + ./0001-msginit-Do-not-use-POT-Creation-Date.patch + ]; + + outputs = [ "out" "man" "doc" "info" ]; + + hardeningDisable = [ "format" ]; + + LDFLAGS = lib.optionalString stdenv.isSunOS "-lm -lmd -lmp -luutil -lnvpair -lnsl -lidmap -lavl -lsec"; + + configureFlags = [ + "--disable-csharp" "--with-xz" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # On cross building, gettext supposes that the wchar.h from libc + # does not fulfill gettext needs, so it tries to work with its + # own wchar.h file, which does not cope well with the system's + # wchar.h and stddef.h (gcc-4.3 - glibc-2.9) + "gl_cv_func_wcwidth_works=yes" + ]; + + postPatch = '' + substituteAllInPlace gettext-runtime/src/gettext.sh.in + substituteInPlace gettext-tools/projects/KDE/trigger --replace "/bin/pwd" pwd + substituteInPlace gettext-tools/projects/GNOME/trigger --replace "/bin/pwd" pwd + substituteInPlace gettext-tools/src/project-id --replace "/bin/pwd" pwd + '' + lib.optionalString stdenv.hostPlatform.isCygwin '' + sed -i -e "s/\(cldr_plurals_LDADD = \)/\\1..\/gnulib-lib\/libxml_rpl.la /" gettext-tools/src/Makefile.in + sed -i -e "s/\(libgettextsrc_la_LDFLAGS = \)/\\1..\/gnulib-lib\/libxml_rpl.la /" gettext-tools/src/Makefile.in + '' + lib.optionalString stdenv.hostPlatform.isMinGW '' + sed -i "s/@GNULIB_CLOSE@/1/" */*/unistd.in.h + ''; + + strictDeps = true; + nativeBuildInputs = [ + xz + xz.bin + ]; + buildInputs = lib.optionals (!stdenv.hostPlatform.isMinGW) [ + bash + ] + ++ lib.optionals (!stdenv.isLinux && !stdenv.hostPlatform.isCygwin) [ + # HACK, see #10874 (and 14664) + libiconv + ]; + + setupHooks = [ + # TODO: don't use relative path + (path + "/pkgs/build-support/setup-hooks/role.bash") + ./gettext-setup-hook.sh + ]; + env = { + gettextNeedsLdflags = stdenv.hostPlatform.libc != "glibc" && !stdenv.hostPlatform.isMusl; + }; + + enableParallelBuilding = true; + enableParallelChecking = false; # fails sometimes + + meta = with lib; { + description = "Well integrated set of translation tools and documentation"; + + longDescription = '' + Usually, programs are written and documented in English, and use + English at execution time for interacting with users. Using a common + language is quite handy for communication between developers, + maintainers and users from all countries. On the other hand, most + people are less comfortable with English than with their own native + language, and would rather be using their mother tongue for day to + day's work, as far as possible. Many would simply love seeing their + computer screen showing a lot less of English, and far more of their + own language. + + GNU `gettext` is an important step for the GNU Translation Project, as + it is an asset on which we may build many other steps. This package + offers to programmers, translators, and even users, a well integrated + set of tools and documentation. Specifically, the GNU `gettext` + utilities are a set of tools that provides a framework to help other + GNU packages produce multi-lingual messages. + ''; + + homepage = "https://www.gnu.org/software/gettext/"; + + maintainers = with maintainers; [ zimbatm vrthra ]; + license = licenses.gpl2Plus; + platforms = platforms.all; + }; +} + +// lib.optionalAttrs stdenv.isDarwin { + makeFlags = [ "CFLAGS=-D_FORTIFY_SOURCE=0" ]; +} diff --git a/pkgs/by-name/ge/gettext/gettext-setup-hook.sh b/pkgs/by-name/ge/gettext/gettext-setup-hook.sh new file mode 100644 index 0000000..5cc9655 --- /dev/null +++ b/pkgs/by-name/ge/gettext/gettext-setup-hook.sh @@ -0,0 +1,17 @@ +gettextDataDirsHook() { + # See pkgs/build-support/setup-hooks/role.bash + getHostRoleEnvHook + if [ -d "$1/share/gettext" ]; then + addToSearchPath "GETTEXTDATADIRS${role_post}" "$1/share/gettext" + fi +} + +addEnvHooks "$hostOffset" gettextDataDirsHook + +# libintl must be listed in load flags on non-Glibc +# it doesn't hurt to have it in Glibc either though +if [ -n "@gettextNeedsLdflags@" -a -z "${dontAddExtraLibs-}" ]; then + # See pkgs/build-support/setup-hooks/role.bash + getHostRole + export NIX_LDFLAGS${role_post}+=" -lintl" +fi diff --git a/pkgs/by-name/ge/gettext/packages.nix b/pkgs/by-name/ge/gettext/packages.nix new file mode 100644 index 0000000..ce3a167 --- /dev/null +++ b/pkgs/by-name/ge/gettext/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gettext = callPackage ./. { }; + # On non-GNU systems we need GNU Gettext for libintl. + libintl = if stdenv.hostPlatform.libc != "glibc" then gettext else null; +} diff --git a/pkgs/by-name/gh/ghostscript/default.nix b/pkgs/by-name/gh/ghostscript/default.nix new file mode 100644 index 0000000..cfb3cae --- /dev/null +++ b/pkgs/by-name/gh/ghostscript/default.nix @@ -0,0 +1,196 @@ +{ config +, stdenv +, lib +, fetchurl +, pkg-config +, zlib +, expat +, openssl +, autoconf +, libjpeg +, libpng +, libtiff +, freetype +, fontconfig +, libpaper +, jbig2dec +, libiconv +, ijs +, lcms2 +, callPackage +, bash +, buildPackages +, openjpeg +, cupsSupport ? config.ghostscript.cups or (!stdenv.isDarwin) +, cups +, x11Support ? cupsSupport +, xorg # with CUPS, X11 only adds very little +, dynamicDrivers ? true + +# for passthru.tests +# , graphicsmagick +# , imagemagick +# , libspectre +# , lilypond +# , pstoedit +# , python3 +}: + +let + fonts = stdenv.mkDerivation { + name = "ghostscript-fonts"; + + srcs = [ + (fetchurl { + url = "mirror://sourceforge/gs-fonts/ghostscript-fonts-std-8.11.tar.gz"; + sha256 = "00f4l10xd826kak51wsmaz69szzm2wp8a41jasr4jblz25bg7dhf"; + }) + (fetchurl { + url = "mirror://gnu/ghostscript/gnu-gs-fonts-other-6.0.tar.gz"; + sha256 = "1cxaah3r52qq152bbkiyj2f7dx1rf38vsihlhjmrvzlr8v6cqil1"; + }) + # ... add other fonts here + ]; + + installPhase = '' + mkdir "$out" + mv -v * "$out/" + ''; + }; + +in +stdenv.mkDerivation rec { + pname = "ghostscript${lib.optionalString x11Support "-with-X"}"; + version = "10.02.1"; + + src = fetchurl { + url = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs${lib.replaceStrings ["."] [""] version}/ghostscript-${version}.tar.xz"; + hash = "sha512-7g91TBvYoYQorRTqo+rYD/i5YnWvUBLnqDhPHxBJDaBW7smuPMeRp6E6JOFuVN9bzN0QnH1ToUU0u9c2CjALEQ="; + }; + + patches = [ + ./urw-font-files.patch + ./doc-no-ref.diff + ]; + + outputs = [ "out" "man" "doc" ]; + + enableParallelBuilding = true; + + depsBuildBuild = [ + buildPackages.stdenv.cc + ]; + + nativeBuildInputs = [ pkg-config autoconf zlib ] + ++ lib.optional cupsSupport cups; + + buildInputs = [ + zlib expat openssl + libjpeg libpng libtiff freetype fontconfig libpaper jbig2dec + libiconv ijs lcms2 bash openjpeg + ] + ++ lib.optionals x11Support [ xorg.libICE xorg.libX11 xorg.libXext xorg.libXt ] + ++ lib.optional cupsSupport cups + ; + + preConfigure = '' + # https://ghostscript.com/doc/current/Make.htm + export CCAUX=$CC_FOR_BUILD + ${lib.optionalString cupsSupport ''export CUPSCONFIG="${cups.dev}/bin/cups-config"''} + + rm -rf jpeg libpng zlib jasper expat tiff lcms2mt jbig2dec freetype cups/libs ijs openjpeg + + sed "s@if ( test -f \$(INCLUDE)[^ ]* )@if ( true )@; s@INCLUDE=/usr/include@INCLUDE=/no-such-path@" -i base/unix-aux.mak + sed "s@^ZLIBDIR=.*@ZLIBDIR=${zlib.dev}/include@" -i configure.ac + + autoconf + ''; + + configureFlags = [ + "--with-system-libtiff" + "--without-tesseract" + ] ++ lib.optionals dynamicDrivers [ + "--enable-dynamic" + "--disable-hidden-visibility" + ] ++ lib.optionals x11Support [ + "--with-x" + ] ++ lib.optionals cupsSupport [ + "--enable-cups" + ]; + + # make check does nothing useful + doCheck = false; + + # don't build/install statically linked bin/gs + buildFlags = [ "so" ] + # without -headerpad, the following error occurs on Darwin when compiling with X11 support (as of 10.02.0) + # error: install_name_tool: changing install names or rpaths can't be redone for: [...]libgs.dylib.10 (the program must be relinked, and you may need to use -headerpad or -headerpad_max_install_names) + ++ lib.optional (x11Support && stdenv.isDarwin) "LDFLAGS=-headerpad_max_install_names"; + installTargets = [ "soinstall" ]; + + postInstall = '' + ln -s gsc "$out"/bin/gs + + cp -r Resource "$out/share/ghostscript/${version}" + + ln -s "${fonts}" "$out/share/ghostscript/fonts" + '' + lib.optionalString stdenv.isDarwin '' + for file in $out/lib/*.dylib* ; do + install_name_tool -id "$file" $file + done + ''; + + # dynamic library name only contains maj.min, eg. '9.53' + dylib_version = lib.versions.majorMinor version; + preFixup = lib.optionalString stdenv.isDarwin '' + install_name_tool -change libgs.dylib.$dylib_version $out/lib/libgs.dylib.$dylib_version $out/bin/gs + install_name_tool -change libgs.dylib.$dylib_version $out/lib/libgs.dylib.$dylib_version $out/bin/gsx + ''; + + # validate dynamic linkage + doInstallCheck = true; + installCheckPhase = '' + runHook preInstallCheck + + $out/bin/gs --version + $out/bin/gsx --version + pushd examples + for f in *.{ps,eps,pdf}; do + echo "Rendering $f" + $out/bin/gs \ + -dNOPAUSE \ + -dBATCH \ + -sDEVICE=bitcmyk \ + -sOutputFile=/dev/null \ + -r600 \ + -dBufferSpace=100000 \ + $f + done + popd # examples + + runHook postInstallCheck + ''; + + # passthru.tests = { + # test-corpus-render = callPackage ./test-corpus-render.nix {}; + # inherit graphicsmagick imagemagick libspectre lilypond pstoedit; + # inherit (python3.pkgs) matplotlib; + # }; + + meta = { + homepage = "https://www.ghostscript.com/"; + description = "PostScript interpreter (mainline version)"; + longDescription = '' + Ghostscript is the name of a set of tools that provides (i) an + interpreter for the PostScript language and the PDF file format, + (ii) a set of C procedures (the Ghostscript library) that + implement the graphics capabilities that appear as primitive + operations in the PostScript language, and (iii) a wide variety + of output drivers for various file formats and printers. + ''; + license = lib.licenses.agpl3Plus; + platforms = lib.platforms.all; + maintainers = [ lib.maintainers.viric ]; + mainProgram = "gs"; + }; +} diff --git a/pkgs/by-name/gh/ghostscript/doc-no-ref.diff b/pkgs/by-name/gh/ghostscript/doc-no-ref.diff new file mode 100644 index 0000000..7380ba2 --- /dev/null +++ b/pkgs/by-name/gh/ghostscript/doc-no-ref.diff @@ -0,0 +1,7 @@ +Kill the reference from libgc.so to the documentation directory. +It's bad for closure, and probably not really good for anything. +--- a/base/gs.mak ++++ b/base/gs.mak +@@ -538,1 +538,1 @@ +- $(EXP)$(ECHOGS_XE) -a $(gconfigd_h) -x 23 define -s -u GS_DOCDIR -x 2022 $(GS_DOCDIR) -x 22 ++ $(EXP)$(ECHOGS_XE) -a $(gconfigd_h) -x 23 define -s -u GS_DOCDIR -x 2022 /no-path-to-docs -x 22 diff --git a/pkgs/by-name/gh/ghostscript/packages.nix b/pkgs/by-name/gh/ghostscript/packages.nix new file mode 100644 index 0000000..618a9c4 --- /dev/null +++ b/pkgs/by-name/gh/ghostscript/packages.nix @@ -0,0 +1,16 @@ + +{ ... }: +res: pkgs: super: + +with pkgs; +{ + ghostscript = callPackage ./. { }; + ghostscriptX = ghostscript.override { + cupsSupport = true; + x11Support = true; + }; + ghostscript_headless = ghostscript.override { + cupsSupport = false; + x11Support = false; + }; +} diff --git a/pkgs/by-name/gh/ghostscript/test-corpus-render.nix b/pkgs/by-name/gh/ghostscript/test-corpus-render.nix new file mode 100644 index 0000000..0896612 --- /dev/null +++ b/pkgs/by-name/gh/ghostscript/test-corpus-render.nix @@ -0,0 +1,37 @@ +{ stdenv +, fetchgit +, ghostscript +}: + +stdenv.mkDerivation { + pname = "ghostscript-test-corpus-render"; + version = "unstable-2023-05-19"; + + src = fetchgit { + url = "git://git.ghostscript.com/tests.git"; + rev = "f7d5087d3d6c236707842dcd428818c6cb8fb041"; + hash = "sha256-xHOEo1ZJG1GCcEKqaXLDpfRRQxpbSy0bzicKju9hG40="; + }; + + dontConfigure = true; + dontBuild = true; + + doCheck = true; + checkPhase = '' + find . -iregex '.*\.\(ps\|eps\|pdf\)' | while read f; do + echo "Rendering $f" + ${ghostscript}/bin/gs \ + -dNOPAUSE \ + -dBATCH \ + -sDEVICE=bitcmyk \ + -sOutputFile=/dev/null \ + -r600 \ + -dBufferSpace=100000 \ + $f + done + ''; + + installPhase = '' + touch $out + ''; +} diff --git a/pkgs/by-name/gh/ghostscript/urw-font-files.patch b/pkgs/by-name/gh/ghostscript/urw-font-files.patch new file mode 100644 index 0000000..9a4aab0 --- /dev/null +++ b/pkgs/by-name/gh/ghostscript/urw-font-files.patch @@ -0,0 +1,61 @@ +Sometime between 8.62 and 8.64, the fontmap file was changed such that the +`.pfb' files of the URW++ fonts no longer appear in 8.64, making it impossible +to display/render these fonts. + +--- gnu-ghostscript-8.64/Resource/Init/Fontmap.GS 2009-05-27 02:19:02.000000000 +0200 ++++ gnu-ghostscript-8.62/Resource/Init/Fontmap.GS 2009-05-27 02:19:09.000000000 +0200 +@@ -81,6 +81,54 @@ + % Copyright URW Software, Copyright 1994 by URW. + % + ++% Actual fonts ++ ++/URWBookmanL-DemiBold (b018015l.pfb) ; ++/URWBookmanL-DemiBoldItal (b018035l.pfb) ; ++/URWBookmanL-Ligh (b018012l.pfb) ; ++/URWBookmanL-LighItal (b018032l.pfb) ; ++ ++/NimbusMonL-Regu (n022003l.pfb) ; ++/NimbusMonL-ReguObli (n022023l.pfb) ; ++/NimbusMonL-Bold (n022004l.pfb) ; ++/NimbusMonL-BoldObli (n022024l.pfb) ; ++ ++/URWGothicL-Book (a010013l.pfb) ; ++/URWGothicL-BookObli (a010033l.pfb) ; ++/URWGothicL-Demi (a010015l.pfb) ; ++/URWGothicL-DemiObli (a010035l.pfb) ; ++ ++/NimbusSanL-Regu (n019003l.pfb) ; ++/NimbusSanL-ReguItal (n019023l.pfb) ; ++/NimbusSanL-Bold (n019004l.pfb) ; ++/NimbusSanL-BoldItal (n019024l.pfb) ; ++ ++/NimbusSanL-ReguCond (n019043l.pfb) ; ++/NimbusSanL-ReguCondItal (n019063l.pfb) ; ++/NimbusSanL-BoldCond (n019044l.pfb) ; ++/NimbusSanL-BoldCondItal (n019064l.pfb) ; ++ ++/URWPalladioL-Roma (p052003l.pfb) ; ++/URWPalladioL-Ital (p052023l.pfb) ; ++/URWPalladioL-Bold (p052004l.pfb) ; ++/URWPalladioL-BoldItal (p052024l.pfb) ; ++ ++/CenturySchL-Roma (c059013l.pfb) ; ++/CenturySchL-Ital (c059033l.pfb) ; ++/CenturySchL-Bold (c059016l.pfb) ; ++/CenturySchL-BoldItal (c059036l.pfb) ; ++ ++/NimbusRomNo9L-Regu (n021003l.pfb) ; ++/NimbusRomNo9L-ReguItal (n021023l.pfb) ; ++/NimbusRomNo9L-Medi (n021004l.pfb) ; ++/NimbusRomNo9L-MediItal (n021024l.pfb) ; ++ ++/StandardSymL (s050000l.pfb) ; ++ ++/URWChanceryL-MediItal (z003034l.pfb) ; ++ ++/Dingbats (d050000l.pfb) ; ++ + % Aliases + + /Bookman-Demi /URWBookmanL-DemiBold ; diff --git a/pkgs/by-name/gi/giflib/CVE-2021-40633.patch b/pkgs/by-name/gi/giflib/CVE-2021-40633.patch new file mode 100644 index 0000000..8a665bb --- /dev/null +++ b/pkgs/by-name/gi/giflib/CVE-2021-40633.patch @@ -0,0 +1,26 @@ +From ccbc956432650734c91acb3fc88837f7b81267ff Mon Sep 17 00:00:00 2001 +From: "Eric S. Raymond" +Date: Wed, 21 Feb 2024 18:55:00 -0500 +Subject: [PATCH] Clean up memory better at end of run (CVE-2021-40633) + +--- + gif2rgb.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/gif2rgb.c b/gif2rgb.c +index d51226d..fc2e683 100644 +--- a/gif2rgb.c ++++ b/gif2rgb.c +@@ -517,6 +517,9 @@ static void GIF2RGB(int NumFiles, char *FileName, bool OneFileFlag, + DumpScreen2RGB(OutFileName, OneFileFlag, ColorMap, ScreenBuffer, + GifFile->SWidth, GifFile->SHeight); + ++ for (i = 0; i < GifFile->SHeight; i++) { ++ (void)free(ScreenBuffer[i]); ++ } + (void)free(ScreenBuffer); + + { +-- +2.44.0 + diff --git a/pkgs/by-name/gi/giflib/default.nix b/pkgs/by-name/gi/giflib/default.nix new file mode 100644 index 0000000..9c24d11 --- /dev/null +++ b/pkgs/by-name/gi/giflib/default.nix @@ -0,0 +1,63 @@ +{ stdenv +, lib +, fetchurl +, fetchpatch +, fixDarwinDylibNames +, pkgsStatic +, imagemagick_light +}: + +stdenv.mkDerivation rec { + pname = "giflib"; + version = "5.2.2"; + + src = fetchurl { + url = "mirror://sourceforge/giflib/giflib-${version}.tar.gz"; + hash = "sha256-vn/70FfK3r4qoURUL9kMaDjGoIO16KkEi47jtmsp1fs="; + }; + + patches = [ + ./CVE-2021-40633.patch + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ + # Build dll libraries. + (fetchurl { + url = "https://aur.archlinux.org/cgit/aur.git/plain/001-mingw-build.patch?h=mingw-w64-giflib&id=b7311edf54824ac797c7916cd3ddc3a4b2368a19"; + hash = "sha256-bBx7lw7FWtxZJ+E9AAbKIpCGcJnS5lrGpjYcv/zBtKk="; + }) + + # Install executables. + ./mingw-install-exes.patch + ]; + + nativeBuildInputs = [ + imagemagick_light + ] ++ lib.optionals stdenv.isDarwin [ + fixDarwinDylibNames + ]; + + makeFlags = [ + "PREFIX=${builtins.placeholder "out"}" + ]; + + postPatch = lib.optionalString stdenv.hostPlatform.isStatic '' + # Upstream build system does not support NOT building shared libraries. + sed -i '/all:/ s/$(LIBGIFSO)//' Makefile + sed -i '/all:/ s/$(LIBUTILSO)//' Makefile + sed -i '/-m 755 $(LIBGIFSO)/ d' Makefile + sed -i '/ln -sf $(LIBGIFSOVER)/ d' Makefile + sed -i '/ln -sf $(LIBGIFSOMAJOR)/ d' Makefile + ''; + + passthru.tests = { + static = pkgsStatic.giflib; + }; + + meta = { + description = "A library for reading and writing gif images"; + homepage = "https://giflib.sourceforge.net/"; + platforms = lib.platforms.unix ++ lib.platforms.windows; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ ]; + branch = "5.2"; + }; +} diff --git a/pkgs/by-name/gi/giflib/mingw-install-exes.patch b/pkgs/by-name/gi/giflib/mingw-install-exes.patch new file mode 100644 index 0000000..5ec3fda --- /dev/null +++ b/pkgs/by-name/gi/giflib/mingw-install-exes.patch @@ -0,0 +1,11 @@ +--- a/Makefile ++++ b/Makefile +@@ -92,7 +92,7 @@ + install: all install-bin install-include install-lib install-man + install-bin: $(INSTALLABLE) + $(INSTALL) -d "$(DESTDIR)$(BINDIR)" +- $(INSTALL) $^ "$(DESTDIR)$(BINDIR)" ++ $(INSTALL) $(^:=.exe) "$(DESTDIR)$(BINDIR)" + install-include: + $(INSTALL) -d "$(DESTDIR)$(INCDIR)" + $(INSTALL) -m 644 gif_lib.h "$(DESTDIR)$(INCDIR)" diff --git a/pkgs/by-name/gi/git/default.nix b/pkgs/by-name/gi/git/default.nix new file mode 100644 index 0000000..fcf5edb --- /dev/null +++ b/pkgs/by-name/gi/git/default.nix @@ -0,0 +1,395 @@ +{ fetchurl, lib, stdenv, buildPackages +, curl, openssl, zlib, expat, perlPackages, python3, gettext, cpio +, gnugrep, gnused, gawk, coreutils # needed at runtime by git-filter-branch etc +, openssh, pcre2, bash +, asciidoc, texinfo, xmlto, docbook2x, docbook_xsl, docbook_xml_dtd_45 +, libxslt, tcl, tk, makeWrapper, libiconv +, svnSupport ? false, subversionClient, perlLibs, smtpPerlLibs +, perlSupport ? stdenv.buildPlatform == stdenv.hostPlatform +, nlsSupport ? true +, osxkeychainSupport ? stdenv.isDarwin +, guiSupport ? false +, withManual ? true +, pythonSupport ? true +, withpcre2 ? true +, sendEmailSupport ? perlSupport +, Security, CoreServices +, withLibsecret ? false +, pkg-config, glib, libsecret +, gzip # needed at runtime by gitweb.cgi +, withSsh ? false +, sysctl +, doInstallCheck ? !stdenv.isDarwin # extremely slow on darwin +# for passthru.tests +# , nixosTests +# , tests +}: + +assert osxkeychainSupport -> stdenv.isDarwin; +assert sendEmailSupport -> perlSupport; +assert svnSupport -> perlSupport; + +let + version = "2.44.0"; + svn = subversionClient.override { perlBindings = perlSupport; }; + gitwebPerlLibs = with perlPackages; [ CGI HTMLParser CGIFast FCGI FCGIProcManager HTMLTagCloud ]; +in + +stdenv.mkDerivation (finalAttrs: { + pname = "git" + + lib.optionalString svnSupport "-with-svn" + + lib.optionalString (!svnSupport && !guiSupport && !sendEmailSupport && !withManual && !pythonSupport && !withpcre2) "-minimal"; + inherit version; + + src = fetchurl { + url = "https://www.kernel.org/pub/software/scm/git/git-${version}.tar.xz"; + hash = "sha256-41hzjctbXqNAzpAKABXAOuhugE5/9k5HqkYx3e5oHeM="; + }; + + outputs = [ "out" ] ++ lib.optional withManual "doc"; + separateDebugInfo = true; + + hardeningDisable = [ "format" ]; + + enableParallelBuilding = true; + + patches = [ + ./docbook2texi.patch + ./git-sh-i18n.patch + ./git-send-email-honor-PATH.patch + ./installCheck-path.patch + ] ++ lib.optionals withSsh [ + ./ssh-path.patch + ]; + + postPatch = '' + # Fix references to gettext introduced by ./git-sh-i18n.patch + substituteInPlace git-sh-i18n.sh \ + --subst-var-by gettext ${gettext} + + # ensure we are using the correct shell when executing the test scripts + patchShebangs t/*.sh + '' + lib.optionalString withSsh '' + for x in connect.c git-gui/lib/remote_add.tcl ; do + substituteInPlace "$x" \ + --subst-var-by ssh "${openssh}/bin/ssh" + done + ''; + + nativeBuildInputs = [ gettext perlPackages.perl makeWrapper pkg-config ] + ++ lib.optionals withManual [ asciidoc texinfo xmlto docbook2x + docbook_xsl docbook_xml_dtd_45 libxslt ]; + buildInputs = [ curl openssl zlib expat cpio libiconv bash ] + ++ lib.optionals perlSupport [ perlPackages.perl ] + ++ lib.optionals guiSupport [tcl tk] + ++ lib.optionals withpcre2 [ pcre2 ] + ++ lib.optionals stdenv.isDarwin [ Security CoreServices ] + ++ lib.optionals withLibsecret [ glib libsecret ]; + + # required to support pthread_cancel() + NIX_LDFLAGS = lib.optionalString (stdenv.cc.isGNU && stdenv.hostPlatform.libc == "glibc") "-lgcc_s" + + lib.optionalString (stdenv.isFreeBSD) "-lthr"; + + configureFlags = [ + "ac_cv_prog_CURL_CONFIG=${lib.getDev curl}/bin/curl-config" + ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "ac_cv_fread_reads_directories=yes" + "ac_cv_snprintf_returns_bogus=no" + "ac_cv_iconv_omits_bom=no" + ]; + + preBuild = '' + makeFlagsArray+=( perllibdir=$out/$(perl -MConfig -wle 'print substr $Config{installsitelib}, 1 + length $Config{siteprefixexp}') ) + ''; + + makeFlags = [ + "prefix=\${out}" + ] + # Git does not allow setting a shell separately for building and run-time. + # Therefore lets leave it at the default /bin/sh when cross-compiling + ++ lib.optional (stdenv.buildPlatform == stdenv.hostPlatform) "SHELL_PATH=${stdenv.shell}" + ++ (if perlSupport then ["PERL_PATH=${perlPackages.perl}/bin/perl"] else ["NO_PERL=1"]) + ++ (if pythonSupport then ["PYTHON_PATH=${python3}/bin/python"] else ["NO_PYTHON=1"]) + ++ lib.optionals stdenv.isSunOS ["INSTALL=install" "NO_INET_NTOP=" "NO_INET_PTON="] + ++ (if stdenv.isDarwin then ["NO_APPLE_COMMON_CRYPTO=1"] else ["sysconfdir=/etc"]) + ++ lib.optionals stdenv.hostPlatform.isMusl ["NO_SYS_POLL_H=1" "NO_GETTEXT=YesPlease"] + ++ lib.optional withpcre2 "USE_LIBPCRE2=1" + ++ lib.optional (!nlsSupport) "NO_GETTEXT=1" + # git-gui refuses to start with the version of tk distributed with + # macOS Catalina. We can prevent git from building the .app bundle + # by specifying an invalid tk framework. The postInstall step will + # then ensure that git-gui uses tcl/tk from nixpkgs, which is an + # acceptable version. + # + # See https://github.com/Homebrew/homebrew-core/commit/dfa3ccf1e7d3901e371b5140b935839ba9d8b706 + ++ lib.optional stdenv.isDarwin "TKFRAMEWORK=/nonexistent"; + + disallowedReferences = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + stdenv.shellPackage + ]; + + + postBuild = '' + make -C contrib/subtree + '' + (lib.optionalString perlSupport '' + make -C contrib/diff-highlight + '') + (lib.optionalString osxkeychainSupport '' + make -C contrib/credential/osxkeychain + '') + (lib.optionalString withLibsecret '' + make -C contrib/credential/libsecret + ''); + + + ## Install + + # WARNING: Do not `rm` or `mv` files from the source tree; use `cp` instead. + # We need many of these files during the installCheckPhase. + + installFlags = [ "NO_INSTALL_HARDLINKS=1" ]; + + preInstall = (lib.optionalString osxkeychainSupport '' + mkdir -p $out/bin + ln -s $out/share/git/contrib/credential/osxkeychain/git-credential-osxkeychain $out/bin/ + rm -f $PWD/contrib/credential/osxkeychain/git-credential-osxkeychain.o + '') + (lib.optionalString withLibsecret '' + mkdir -p $out/bin + ln -s $out/share/git/contrib/credential/libsecret/git-credential-libsecret $out/bin/ + rm -f $PWD/contrib/credential/libsecret/git-credential-libsecret.o + ''); + + postInstall = + '' + notSupported() { + unlink $1 || true + } + + # Install git-subtree. + make -C contrib/subtree install ${lib.optionalString withManual "install-doc"} + rm -rf contrib/subtree + + # Install contrib stuff. + mkdir -p $out/share/git + cp -a contrib $out/share/git/ + mkdir -p $out/share/bash-completion/completions + ln -s $out/share/git/contrib/completion/git-completion.bash $out/share/bash-completion/completions/git + ln -s $out/share/git/contrib/completion/git-prompt.sh $out/share/bash-completion/completions/ + # only readme, developed in another repo + rm -r contrib/hooks/multimail + mkdir -p $out/share/git-core/contrib + cp -a contrib/hooks/ $out/share/git-core/contrib/ + substituteInPlace $out/share/git-core/contrib/hooks/pre-auto-gc-battery \ + --replace ' grep' ' ${gnugrep}/bin/grep' \ + + # grep is a runtime dependency, need to patch so that it's found + substituteInPlace $out/libexec/git-core/git-sh-setup \ + --replace ' grep' ' ${gnugrep}/bin/grep' \ + --replace ' egrep' ' ${gnugrep}/bin/egrep' + + # Fix references to the perl, sed, awk and various coreutil binaries used by + # shell scripts that git calls (e.g. filter-branch) + SCRIPT="$(cat <<'EOS' + BEGIN{ + @a=( + '${gnugrep}/bin/grep', '${gnused}/bin/sed', '${gawk}/bin/awk', + '${coreutils}/bin/cut', '${coreutils}/bin/basename', '${coreutils}/bin/dirname', + '${coreutils}/bin/wc', '${coreutils}/bin/tr' + ${lib.optionalString perlSupport ", '${perlPackages.perl}/bin/perl'"} + ); + } + foreach $c (@a) { + $n=(split("/", $c))[-1]; + s|(?<=[^#][^/.-])\b''${n}(?=\s)|''${c}|g + } + EOS + )" + perl -0777 -i -pe "$SCRIPT" \ + $out/libexec/git-core/git-{sh-setup,filter-branch,merge-octopus,mergetool,quiltimport,request-pull,submodule,subtree,web--browse} + + + # Also put git-http-backend into $PATH, so that we can use smart + # HTTP(s) transports for pushing + ln -s $out/libexec/git-core/git-http-backend $out/bin/git-http-backend + ln -s $out/share/git/contrib/git-jump/git-jump $out/bin/git-jump + '' + lib.optionalString perlSupport '' + # wrap perl commands + makeWrapper "$out/share/git/contrib/credential/netrc/git-credential-netrc.perl" $out/bin/git-credential-netrc \ + --set PERL5LIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath perlLibs}" + wrapProgram $out/libexec/git-core/git-cvsimport \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath perlLibs}" + wrapProgram $out/libexec/git-core/git-archimport \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath perlLibs}" + wrapProgram $out/libexec/git-core/git-instaweb \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath perlLibs}" + wrapProgram $out/libexec/git-core/git-cvsexportcommit \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath perlLibs}" + + # gzip (and optionally bzip2, xz, zip) are runtime dependencies for + # gitweb.cgi, need to patch so that it's found + sed -i -e "s|'compressor' => \['gzip'|'compressor' => ['${gzip}/bin/gzip'|" \ + $out/share/gitweb/gitweb.cgi + # Give access to CGI.pm and friends (was removed from perl core in 5.22) + for p in ${lib.concatStringsSep " " gitwebPerlLibs}; do + sed -i -e "/use CGI /i use lib \"$p/${perlPackages.perl.libPrefix}\";" \ + "$out/share/gitweb/gitweb.cgi" + done + '' + + + (if svnSupport then '' + # wrap git-svn + wrapProgram $out/libexec/git-core/git-svn \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath (perlLibs ++ [svn.out])}" \ + --prefix PATH : "${svn.out}/bin" '' + else '' # replace git-svn by notification script + notSupported $out/libexec/git-core/git-svn + '') + + + (if sendEmailSupport then '' + # wrap git-send-email + wrapProgram $out/libexec/git-core/git-send-email \ + --set GITPERLLIB "$out/${perlPackages.perl.libPrefix}:${perlPackages.makePerlPath smtpPerlLibs}" + '' else '' + # replace git-send-email by notification script + notSupported $out/libexec/git-core/git-send-email + '') + + + lib.optionalString withManual ''# Install man pages + make -j $NIX_BUILD_CORES PERL_PATH="${buildPackages.perl}/bin/perl" cmd-list.made install install-html \ + -C Documentation '' + + + (if guiSupport then '' + # Wrap Tcl/Tk programs + for prog in bin/gitk libexec/git-core/{git-gui,git-citool,git-gui--askpass}; do + sed -i -e "s|exec 'wish'|exec '${tk}/bin/wish'|g" \ + -e "s|exec wish|exec '${tk}/bin/wish'|g" \ + "$out/$prog" + done + ln -s $out/share/git/contrib/completion/git-completion.bash $out/share/bash-completion/completions/gitk + '' else '' + # Don't wrap Tcl/Tk, replace them by notification scripts + for prog in bin/gitk libexec/git-core/git-gui; do + notSupported "$out/$prog" + done + '') + + lib.optionalString osxkeychainSupport '' + # enable git-credential-osxkeychain on darwin if desired (default) + mkdir -p $out/etc + cat > $out/etc/gitconfig << EOF + [credential] + helper = osxkeychain + EOF + ''; + + + ## InstallCheck + + doCheck = false; + inherit doInstallCheck; + + installCheckTarget = "test"; + + # see also installCheckFlagsArray + installCheckFlags = [ + "DEFAULT_TEST_TARGET=prove" + "PERL_PATH=${buildPackages.perl}/bin/perl" + ]; + + nativeInstallCheckInputs = lib.optional stdenv.isDarwin sysctl; + + preInstallCheck = '' + installCheckFlagsArray+=( + GIT_PROVE_OPTS="--jobs $NIX_BUILD_CORES --failures --state=failed,save" + GIT_TEST_INSTALLED=$out/bin + ${lib.optionalString (!svnSupport) "NO_SVN_TESTS=y"} + ) + + function disable_test { + local test=$1 pattern=$2 + if [ $# -eq 1 ]; then + mv t/{,skip-}$test.sh || true + else + sed -i t/$test.sh \ + -e "/^\s*test_expect_.*$pattern/,/^\s*' *\$/{s/^/: #/}" + fi + } + + # Shared permissions are forbidden in sandbox builds: + substituteInPlace t/test-lib.sh \ + --replace "test_set_prereq POSIXPERM" "" + # TODO: Investigate while these still fail (without POSIXPERM): + disable_test t0001-init 'shared overrides system' + disable_test t0001-init 'init honors global core.sharedRepository' + disable_test t1301-shared-repo + # /build/git-2.44.0/contrib/completion/git-completion.bash: line 452: compgen: command not found + disable_test t9902-completion + + # Our patched gettext never fallbacks + disable_test t0201-gettext-fallbacks + '' + lib.optionalString (!sendEmailSupport) '' + # Disable sendmail tests + disable_test t9001-send-email + '' + '' + # XXX: I failed to understand why this one fails. + # Could someone try to re-enable it on the next release ? + # Tested to fail: 2.18.0 and 2.19.0 + disable_test t1700-split-index "null sha1" + + # Flaky tests: + disable_test t5319-multi-pack-index + disable_test t6421-merge-partial-clone + + # Fails reproducibly on ZFS on Linux with formD normalization + disable_test t0021-conversion + disable_test t3910-mac-os-precompose + + '' + lib.optionalString (!perlSupport) '' + # request-pull is a Bash script that invokes Perl, so it is not available + # when NO_PERL=1, and the test should be skipped, but the test suite does + # not check for the Perl prerequisite. + disable_test t5150-request-pull + '' + lib.optionalString stdenv.isDarwin '' + # XXX: Some tests added in 2.24.0 fail. + # Please try to re-enable on the next release. + disable_test t7816-grep-binary-pattern + # fail (as of 2.33.0) + #===( 18623;1208 8/? 224/? 2/? )= =fatal: Not a valid object name refs/tags/signed-empty + disable_test t6300-for-each-ref + # not ok 1 - populate workdir (with 2.33.1 on x86_64-darwin) + disable_test t5003-archive-zip + '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' + disable_test t7527-builtin-fsmonitor + '' + lib.optionalString stdenv.hostPlatform.isMusl '' + # Test fails (as of 2.17.0, musl 1.1.19) + disable_test t3900-i18n-commit + # Fails largely due to assumptions about BOM + # Tested to fail: 2.18.0 + disable_test t0028-working-tree-encoding + ''; + + stripDebugList = [ "lib" "libexec" "bin" "share/git/contrib/credential/libsecret" ]; + + passthru = { + shellPath = "/bin/git-shell"; + # tests = { + # withInstallCheck = finalAttrs.finalPackage.overrideAttrs (_: { + # doInstallCheck = true; + # }); + # buildbot-integration = nixosTests.buildbot; + # } // tests.fetchgit; + }; + + meta = { + homepage = "https://git-scm.com/"; + description = "Distributed version control system"; + license = lib.licenses.gpl2; + changelog = "https://github.com/git/git/blob/v${version}/Documentation/RelNotes/${version}.txt"; + + longDescription = '' + Git, a popular distributed version control system designed to + handle very large projects with speed and efficiency. + ''; + + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ primeos wmertens globin kashw2 ]; + mainProgram = "git"; + }; +}) diff --git a/pkgs/by-name/gi/git/docbook2texi.patch b/pkgs/by-name/gi/git/docbook2texi.patch new file mode 100644 index 0000000..f8f8ab8 --- /dev/null +++ b/pkgs/by-name/gi/git/docbook2texi.patch @@ -0,0 +1,38 @@ +This patch does two things: (1) use the right name for `docbook2texi', +and (2) make sure `gitman.info' isn't produced since it's broken (duplicate +node names). + +diff --git a/Documentation/Makefile b/Documentation/Makefile +index 26a2342bea..ceccd67ebb 100644 +--- a/Documentation/Makefile ++++ b/Documentation/Makefile +@@ -132,7 +132,7 @@ HTML_REPO = ../../git-htmldocs + + MAKEINFO = makeinfo + INSTALL_INFO = install-info +-DOCBOOK2X_TEXI = docbook2x-texi ++DOCBOOK2X_TEXI = docbook2texi + DBLATEX = dblatex + ASCIIDOC_DBLATEX_DIR = /etc/asciidoc/dblatex + DBLATEX_COMMON = -p $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.xsl -s $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.sty +@@ -250,7 +250,7 @@ man1: $(DOC_MAN1) + man5: $(DOC_MAN5) + man7: $(DOC_MAN7) + +-info: git.info gitman.info ++info: git.info + + pdf: user-manual.pdf + +@@ -266,10 +266,9 @@ install-man: man + + install-info: info + $(INSTALL) -d -m 755 $(DESTDIR)$(infodir) +- $(INSTALL) -m 644 git.info gitman.info $(DESTDIR)$(infodir) ++ $(INSTALL) -m 644 git.info $(DESTDIR)$(infodir) + if test -r $(DESTDIR)$(infodir)/dir; then \ + $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) git.info ;\ +- $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) gitman.info ;\ + else \ + echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \ + fi diff --git a/pkgs/by-name/gi/git/git-send-email-honor-PATH.patch b/pkgs/by-name/gi/git/git-send-email-honor-PATH.patch new file mode 100644 index 0000000..c784008 --- /dev/null +++ b/pkgs/by-name/gi/git/git-send-email-honor-PATH.patch @@ -0,0 +1,31 @@ +diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt +index 3db4eab4ba..39bc0e77c9 100644 +--- a/Documentation/git-send-email.txt ++++ b/Documentation/git-send-email.txt +@@ -220,9 +220,9 @@ a password is obtained using 'git-credential'. + --smtp-server=:: + If set, specifies the outgoing SMTP server to use (e.g. + `smtp.example.com` or a raw IP address). If unspecified, and if +- `--sendmail-cmd` is also unspecified, the default is to search +- for `sendmail` in `/usr/sbin`, `/usr/lib` and $PATH if such a +- program is available, falling back to `localhost` otherwise. ++ `--sendmail-cmd` is also unspecified, the default is to search for ++ `sendmail` in $PATH if such a program is available, falling back to ++ `localhost` otherwise. + + + For backward compatibility, this option can also specify a full pathname + of a sendmail-like program instead; the program must support the `-i` +diff --git a/git-send-email.perl b/git-send-email.perl +index e65d969d0b..508d49483d 100755 +--- a/git-send-email.perl ++++ b/git-send-email.perl +@@ -1066,8 +1066,7 @@ sub expand_one_alias { + } + + if (!defined $sendmail_cmd && !defined $smtp_server) { +- my @sendmail_paths = qw( /usr/sbin/sendmail /usr/lib/sendmail ); +- push @sendmail_paths, map {"$_/sendmail"} split /:/, $ENV{PATH}; ++ my @sendmail_paths = map {"$_/sendmail"} split /:/, $ENV{PATH}; + foreach (@sendmail_paths) { + if (-x $_) { + $sendmail_cmd = $_; diff --git a/pkgs/by-name/gi/git/git-sh-i18n.patch b/pkgs/by-name/gi/git/git-sh-i18n.patch new file mode 100644 index 0000000..721f2aa --- /dev/null +++ b/pkgs/by-name/gi/git/git-sh-i18n.patch @@ -0,0 +1,23 @@ +diff --git a/git-sh-i18n.sh b/git-sh-i18n.sh +index e1d917fd27..e90f8e1414 100644 +--- a/git-sh-i18n.sh ++++ b/git-sh-i18n.sh +@@ -26,7 +26,7 @@ then + elif test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS" + then + : no probing necessary +-elif type gettext.sh >/dev/null 2>&1 ++elif type @gettext@/bin/gettext.sh >/dev/null 2>&1 + then + # GNU libintl's gettext.sh + GIT_INTERNAL_GETTEXT_SH_SCHEME=gnu +@@ -43,7 +43,8 @@ export GIT_INTERNAL_GETTEXT_SH_SCHEME + case "$GIT_INTERNAL_GETTEXT_SH_SCHEME" in + gnu) + # Use libintl's gettext.sh, or fall back to English if we can't. +- . gettext.sh ++ . @gettext@/bin/gettext.sh ++ export PATH=@gettext@/bin:$PATH + ;; + gettext_without_eval_gettext) + # Solaris has a gettext(1) but no eval_gettext(1) diff --git a/pkgs/by-name/gi/git/installCheck-path.patch b/pkgs/by-name/gi/git/installCheck-path.patch new file mode 100644 index 0000000..4b73d11 --- /dev/null +++ b/pkgs/by-name/gi/git/installCheck-path.patch @@ -0,0 +1,13 @@ +diff --git a/t/test-lib.sh b/t/test-lib.sh +index 8665b0a9b6..8bb892b1af 100644 +--- a/t/test-lib.sh ++++ b/t/test-lib.sh +@@ -1227,7 +1227,7 @@ elif test -n "$GIT_TEST_INSTALLED" + then + GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || + error "Cannot run git from $GIT_TEST_INSTALLED." +- PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$PATH ++ PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR/t/helper:$GIT_BUILD_DIR:$PATH + GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} + else # normal case, use ../bin-wrappers only unless $with_dashes: + if test -n "$no_bin_wrappers" diff --git a/pkgs/by-name/gi/git/packages.nix b/pkgs/by-name/gi/git/packages.nix new file mode 100644 index 0000000..70a8432 --- /dev/null +++ b/pkgs/by-name/gi/git/packages.nix @@ -0,0 +1,47 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + git = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) CoreServices Security; + perlLibs = [ perlPackages.LWP perlPackages.URI perlPackages.TermReadKey ]; + smtpPerlLibs = [ + perlPackages.libnet + perlPackages.NetSMTPSSL + perlPackages.IOSocketSSL + perlPackages.NetSSLeay + perlPackages.AuthenSASL + perlPackages.DigestHMAC + ]; + }; + + # The full-featured Git. + gitFull = git.override { + svnSupport = true; + guiSupport = true; + sendEmailSupport = true; + withSsh = true; + withLibsecret = !stdenv.isDarwin; + }; + + # Git with SVN support, but without GUI. + gitSVN = lowPrio (git.override { svnSupport = true; }); + + git-doc = lib.addMetaAttrs + { + description = "Additional documentation for Git"; + longDescription = '' + This package contains additional documentation (HTML and text files) that + is referenced in the man pages of Git. + ''; + } + gitFull.doc; + + gitMinimal = git.override { + withManual = false; + pythonSupport = false; + perlSupport = false; + withpcre2 = false; + }; +} diff --git a/pkgs/by-name/gi/git/ssh-path.patch b/pkgs/by-name/gi/git/ssh-path.patch new file mode 100644 index 0000000..71cdc69 --- /dev/null +++ b/pkgs/by-name/gi/git/ssh-path.patch @@ -0,0 +1,26 @@ +diff --git a/connect.c b/connect.c +index 4813f005ab..b3f12f3268 100644 +--- a/connect.c ++++ b/connect.c +@@ -1183,7 +1183,7 @@ static void fill_ssh_args(struct child_process *conn, const char *ssh_host, + + ssh = getenv("GIT_SSH"); + if (!ssh) +- ssh = "ssh"; ++ ssh = "@ssh@"; + variant = determine_ssh_variant(ssh, 0); + } + +diff --git a/git-gui/lib/remote_add.tcl b/git-gui/lib/remote_add.tcl +index 480a6b30d0..7817204241 100644 +--- a/git-gui/lib/remote_add.tcl ++++ b/git-gui/lib/remote_add.tcl +@@ -139,7 +139,7 @@ method _add {} { + # Parse the location + if { [regexp {(?:git\+)?ssh://([^/]+)(/.+)} $location xx host path] + || [regexp {([^:][^:]+):(.+)} $location xx host path]} { +- set ssh ssh ++ set ssh @ssh@ + if {[info exists env(GIT_SSH)]} { + set ssh $env(GIT_SSH) + } diff --git a/pkgs/by-name/gi/git/update.sh b/pkgs/by-name/gi/git/update.sh new file mode 100755 index 0000000..5457472 --- /dev/null +++ b/pkgs/by-name/gi/git/update.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p curl common-updater-scripts jq git + +set -eu -o pipefail + +oldVersion="$(nix-instantiate --eval -E "with import ./. {}; lib.getVersion git" | tr -d '"')" +latestTag="$(git ls-remote --tags --sort="v:refname" https://github.com/git/git.git | grep -v '\{\}' | grep -v '\-rc' | tail -1 | sed 's|^.*/v\(.*\)|\1|')" +targetVersion="${1:-$latestTag}" + +if [ ! "${oldVersion}" = "${targetVersion}" ]; then + update-source-version git "${targetVersion}" + nixpkgs="$(git rev-parse --show-toplevel)" + default_nix="$nixpkgs/pkgs/applications/version-management/git-and-tools/git/default.nix" + nix-build -A git + git add "${default_nix}" + git commit -m "git: ${oldVersion} -> ${targetVersion}" +else + echo "git is already up-to-date" +fi diff --git a/pkgs/by-name/gl/glib/darwin-compilation.patch b/pkgs/by-name/gl/glib/darwin-compilation.patch new file mode 100644 index 0000000..f215eef --- /dev/null +++ b/pkgs/by-name/gl/glib/darwin-compilation.patch @@ -0,0 +1,24 @@ +Fix compilation on Mac OS X with gcc 4.8. + +diff -ru glib-2.40.0-orig/gio/gdummyfile.c glib-2.40.0/gio/gdummyfile.c +--- glib-2.40.0-orig/gio/gdummyfile.c 2014-02-03 18:40:41.000000000 +0100 ++++ glib-2.40.0/gio/gdummyfile.c 2014-07-15 10:58:31.000000000 +0200 +@@ -454,7 +454,8 @@ + result = g_malloc (escaped_string_end - escaped_string + 1); + + out = result; +- for (in = escaped_string; in < escaped_string_end; in++) ++ in = escaped_string; ++ for (; in < escaped_string_end; in++) + { + character = *in; + if (*in == '%') +@@ -551,6 +552,7 @@ + + decoded->scheme = g_malloc (p - uri); + out = decoded->scheme; +- for (in = uri; in < p - 1; in++) ++ in = uri; ++ for (; in < p - 1; in++) + *out++ = g_ascii_tolower (*in); + *out = 0; diff --git a/pkgs/by-name/gl/glib/default.nix b/pkgs/by-name/gl/glib/default.nix new file mode 100644 index 0000000..09a8c46 --- /dev/null +++ b/pkgs/by-name/gl/glib/default.nix @@ -0,0 +1,295 @@ +{ config +, lib +, stdenv +, fetchurl +, fetchpatch +, gettext +, meson +, ninja +, pkg-config +, perl +, python3 +, libiconv, zlib, libffi, pcre2, elfutils, /*gnome,*/ libselinux, bash, gnum4, gtk-doc, docbook_xsl, docbook_xml_dtd_45, libxslt +# use util-linuxMinimal to avoid circular dependency (util-linux, systemd, glib) +, util-linuxMinimal ? null +, buildPackages + +# for passthru.tests +# this is just for tests (not in the closure of any regular package) +, coreutils, dbus, libxml2, tzdata +, desktop-file-utils, shared-mime-info +, darwin +# , makeHardcodeGsettingsPatch +, testers +}: + +assert stdenv.isLinux -> util-linuxMinimal != null; + +let + # Some packages don't get "Cflags" from pkg-config correctly + # and then fail to build when directly including like . + # This is intended to be run in postInstall of any package + # which has $out/include/ containing just some disjunct directories. + flattenInclude = '' + for dir in "''${!outputInclude}"/include/*; do + cp -r "$dir"/* "''${!outputInclude}/include/" + rm -r "$dir" + ln -s . "$dir" + done + ln -sr -t "''${!outputInclude}/include/" "''${!outputInclude}"/lib/*/include/* 2>/dev/null || true + ''; + + buildDocs = stdenv.hostPlatform == stdenv.buildPlatform && !stdenv.hostPlatform.isStatic; +in + +stdenv.mkDerivation (finalAttrs: { + pname = "glib"; + version = "2.78.4"; + + src = fetchurl { + url = "mirror://gnome/sources/glib/${lib.versions.majorMinor finalAttrs.version}/glib-${finalAttrs.version}.tar.xz"; + sha256 = "sha256-JLjgZy3KEgzDLTlLzLhYROcy4E/nXRi7BXOy28dUj2M="; + }; + + patches = lib.optionals stdenv.isDarwin [ + ./darwin-compilation.patch + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + ./quark_init_on_demand.patch + ./gobject_init_on_demand.patch + ] ++ [ + (fetchpatch { + name = "GLib-against-PCRE2-10.43.patch"; + url = "https://gitlab.gnome.org/GNOME/glib/-/commit/cce3ae98a2c1966719daabff5a4ec6cf94a846f6.patch"; + hash = "sha256-vgKzb5hQmFQGD8zxRrXnuX9Gpg/TeSrzehlOH2vA1xU="; + }) + + ./glib-appinfo-watch.patch + ./schema-override-variable.patch + + # Add support for Pantheon’s terminal emulator. + ./elementary-terminal-support.patch + + # GLib contains many binaries used for different purposes; + # we will install them to different outputs: + # 1. Tools for desktop environment ($bin) + # * gapplication (non-darwin) + # * gdbus + # * gio + # * gio-launch-desktop (symlink to $out) + # * gsettings + # 2. Development/build tools ($dev) + # * gdbus-codegen + # * gio-querymodules + # * glib-compile-resources + # * glib-compile-schemas + # * glib-genmarshal + # * glib-gettextize + # * glib-mkenums + # * gobject-query + # * gresource + # * gtester + # * gtester-report + # 3. Tools for desktop environment that cannot go to $bin due to $out depending on them ($out) + # * gio-launch-desktop + ./split-dev-programs.patch + + # Disable flaky test. + # https://gitlab.gnome.org/GNOME/glib/-/issues/820 + ./skip-timer-test.patch + ]; + + outputs = [ "bin" "out" "dev" "devdoc" ]; + + setupHook = ./setup-hook.sh; + + buildInputs = [ + finalAttrs.setupHook + pcre2 + ] ++ lib.optionals (!stdenv.hostPlatform.isWindows) [ + bash gnum4 # install glib-gettextize and m4 macros for other apps to use + ] ++ lib.optionals (lib.meta.availableOn stdenv.hostPlatform elfutils) [ + elfutils + ] ++ lib.optionals stdenv.isLinux [ + libselinux + util-linuxMinimal # for libmount + ] ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ + AppKit Carbon Cocoa CoreFoundation CoreServices Foundation + ]) ++ lib.optionals buildDocs [ + # Note: this needs to be both in buildInputs and nativeBuildInputs. The + # Meson gtkdoc module uses find_program to look it up (-> build dep), but + # glib's own Meson configuration uses the host pkg-config to find its + # version (-> host dep). We could technically go and fix this in glib, add + # pkg-config to depsBuildBuild, but this would be a futile exercise since + # Meson's gtkdoc integration does not support cross compilation[1] anyway + # and this derivation disables the docs build when cross compiling. + # + # [1] https://github.com/mesonbuild/meson/issues/2003 + gtk-doc + ]; + + strictDeps = true; + + nativeBuildInputs = [ + meson + ninja + pkg-config + perl + python3 + gettext + libxslt + docbook_xsl + ] ++ lib.optionals buildDocs [ + gtk-doc + docbook_xml_dtd_45 + libxml2 + ]; + + propagatedBuildInputs = [ zlib libffi gettext libiconv ]; + + mesonFlags = [ + # Avoid the need for gobject introspection binaries in PATH in cross-compiling case. + # Instead we just copy them over from the native output. + "-Dgtk_doc=${lib.boolToString buildDocs}" + "-Dnls=enabled" + "-Ddevbindir=${placeholder "dev"}/bin" + ] ++ lib.optionals (!lib.meta.availableOn stdenv.hostPlatform elfutils) [ + "-Dlibelf=disabled" + ] ++ lib.optionals (!stdenv.isDarwin) [ + "-Dman=true" # broken on Darwin + ] ++ lib.optionals stdenv.isFreeBSD [ + "-Db_lundef=false" + "-Dxattr=false" + ]; + + env.NIX_CFLAGS_COMPILE = toString [ + "-Wno-error=nonnull" + # Default for release buildtype but passed manually because + # we're using plain + "-DG_DISABLE_CAST_CHECKS" + ]; + + postPatch = '' + chmod +x gio/tests/gengiotypefuncs.py + patchShebangs gio/tests/gengiotypefuncs.py + chmod +x docs/reference/gio/concat-files-helper.py + patchShebangs docs/reference/gio/concat-files-helper.py + patchShebangs glib/gen-unicode-tables.pl + patchShebangs glib/tests/gen-casefold-txt.py + patchShebangs glib/tests/gen-casemap-txt.py + patchShebangs tools/gen-visibility-macros.py + + # Needs machine-id, comment the test + sed -e '/\/gdbus\/codegen-peer-to-peer/ s/^\/*/\/\//' -i gio/tests/gdbus-peer.c + sed -e '/g_test_add_func/ s/^\/*/\/\//' -i gio/tests/gdbus-address-get-session.c + # All gschemas fail to pass the test, upstream bug? + sed -e '/g_test_add_data_func/ s/^\/*/\/\//' -i gio/tests/gschema-compile.c + # Cannot reproduce the failing test_associations on hydra + sed -e '/\/appinfo\/associations/d' -i gio/tests/appinfo.c + # Needed because of libtool wrappers + sed -e '/g_subprocess_launcher_set_environ (launcher, envp);/a g_subprocess_launcher_setenv (launcher, "PATH", g_getenv("PATH"), TRUE);' -i gio/tests/gsubprocess.c + '' + lib.optionalString stdenv.hostPlatform.isWindows '' + substituteInPlace gio/win32/meson.build \ + --replace "libintl, " "" + ''; + + postConfigure = '' + patchShebangs gio/gdbus-2.0/codegen/gdbus-codegen gobject/glib-{genmarshal,mkenums} + ''; + + DETERMINISTIC_BUILD = 1; + + postInstall = '' + moveToOutput "share/glib-2.0" "$dev" + substituteInPlace "$dev/bin/gdbus-codegen" --replace "$out" "$dev" + sed -i "$dev/bin/glib-gettextize" -e "s|^gettext_dir=.*|gettext_dir=$dev/share/glib-2.0/gettext|" + + # This file is *included* in gtk3 and would introduce runtime reference via __FILE__. + sed '1i#line 1 "glib-${finalAttrs.version}/include/glib-2.0/gobject/gobjectnotifyqueue.c"' \ + -i "$dev"/include/glib-2.0/gobject/gobjectnotifyqueue.c + for i in $bin/bin/*; do + moveToOutput "share/bash-completion/completions/''${i##*/}" "$bin" + done + for i in $dev/bin/*; do + moveToOutput "share/bash-completion/completions/''${i##*/}" "$dev" + done + '' + lib.optionalString (!buildDocs) '' + cp -r ${buildPackages.glib.devdoc} $devdoc + ''; + + # Move man pages to the same output as their binaries (needs to be + # done after preFixupHooks which moves man pages too - in + # _multioutDocs) + postFixup = '' + for i in $dev/bin/*; do + moveToOutput "share/man/man1/''${i##*/}.1.*" "$dev" + done + ''; + + nativeCheckInputs = [ tzdata desktop-file-utils shared-mime-info ]; + + preCheck = lib.optionalString finalAttrs.finalPackage.doCheck or config.doCheckByDefault or false '' + export LD_LIBRARY_PATH="$NIX_BUILD_TOP/glib-${finalAttrs.version}/glib/.libs''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" + export TZDIR="${tzdata}/share/zoneinfo" + export XDG_CACHE_HOME="$TMP" + export XDG_RUNTIME_HOME="$TMP" + export HOME="$TMP" + export XDG_DATA_DIRS="${desktop-file-utils}/share:${shared-mime-info}/share" + export G_TEST_DBUS_DAEMON="${dbus}/bin/dbus-daemon" + export PATH="$PATH:$(pwd)/gobject" + echo "PATH=$PATH" + ''; + + separateDebugInfo = stdenv.isLinux; + + passthru = rec { + gioModuleDir = "lib/gio/modules"; + + makeSchemaDataDirPath = dir: name: "${dir}/share/gsettings-schemas/${name}"; + makeSchemaPath = dir: name: "${makeSchemaDataDirPath dir name}/glib-2.0/schemas"; + getSchemaPath = pkg: makeSchemaPath pkg pkg.name; + getSchemaDataDirPath = pkg: makeSchemaDataDirPath pkg pkg.name; + + tests = { + withChecks = finalAttrs.finalPackage.overrideAttrs (_: { doCheck = true; }); + pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; + + inherit flattenInclude; + # updateScript = gnome.updateScript { + # packageName = "glib"; + # versionPolicy = "odd-unstable"; + # }; + + # mkHardcodeGsettingsPatch = + # { + # src, + # glib-schema-to-var, + # }: + # builtins.trace + # "glib.mkHardcodeGsettingsPatch is deprecated, please use makeHardcodeGsettingsPatch instead" + # (makeHardcodeGsettingsPatch { + # inherit src; + # schemaIdToVariableMapping = glib-schema-to-var; + # }); + }; + + meta = with lib; { + description = "C library of programming buildings blocks"; + homepage = "https://gitlab.gnome.org/GNOME/glib"; + license = licenses.lgpl21Plus; + maintainers = teams.gnome.members ++ (with maintainers; [ lovek323 raskin ]); + pkgConfigModules = [ + "gio-2.0" + "gobject-2.0" + "gthread-2.0" + ]; + platforms = platforms.unix ++ platforms.windows; + + longDescription = '' + GLib provides the core application building blocks for libraries + and applications written in C. It provides the core object + system used in GNOME, the main loop implementation, and a large + set of utility functions for strings and common data structures. + ''; + }; +}) diff --git a/pkgs/by-name/gl/glib/elementary-terminal-support.patch b/pkgs/by-name/gl/glib/elementary-terminal-support.patch new file mode 100644 index 0000000..34a56c8 --- /dev/null +++ b/pkgs/by-name/gl/glib/elementary-terminal-support.patch @@ -0,0 +1,12 @@ +diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c +index 30fcb2937..a6a7163a7 100644 +--- a/gio/gdesktopappinfo.c ++++ b/gio/gdesktopappinfo.c +@@ -2704,6 +2704,7 @@ prepend_terminal_to_vector (int *argc, + { "gnome-terminal", "--" }, + { "mate-terminal", "-x" }, + { "xfce4-terminal", "-x" }, ++ { "io.elementary.terminal", "-x" }, + { "tilix", "-e" }, + { "konsole", "-e" }, + { "nxterm", "-e" }, diff --git a/pkgs/by-name/gl/glib/glib-appinfo-watch.patch b/pkgs/by-name/gl/glib/glib-appinfo-watch.patch new file mode 100644 index 0000000..cbd78a6 --- /dev/null +++ b/pkgs/by-name/gl/glib/glib-appinfo-watch.patch @@ -0,0 +1,102 @@ +This patch lets GLib's GDesktopAppInfo API watch and notice changes +to the Nix user and system profiles. That way, the list of available +applications shown by the desktop environment is immediately updated +when the user installs or removes any +(see ). + +It does so by monitoring /nix/var/nix/profiles (for changes to the system +profile) and /nix/var/nix/profiles/per-user/USER (for changes to the user +profile) as well as /etc/profiles/per-user (for chanes to the user +environment profile) and crawling their share/applications sub-directory when +changes happen. + +diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c +index b779b30..31069f7 100644 +--- a/gio/gdesktopappinfo.c ++++ b/gio/gdesktopappinfo.c +@@ -150,6 +150,7 @@ typedef struct + gchar *alternatively_watching; + gboolean is_config; + gboolean is_setup; ++ gchar *nix_profile_watch_dir; + GFileMonitor *monitor; + GHashTable *app_names; + GHashTable *mime_tweaks; +@@ -181,6 +182,7 @@ desktop_file_dir_unref (DesktopFileDir *dir) + { + desktop_file_dir_reset (dir); + g_free (dir->path); ++ g_free (dir->nix_profile_watch_dir); + g_free (dir); + } + } +@@ -205,6 +207,14 @@ desktop_file_dir_get_alternative_dir (DesktopFileDir *dir) + { + gchar *parent; + ++ /* If DIR is a profile, watch the specified directory--e.g., ++ * /nix/var/nix/profiles/per-user/$USER/ for the user profile. Do not watch ++ * ~/.nix-profile or /run/current-system/sw because GFileMonitor does ++ * not pass IN_DONT_FOLLOW and thus cannot notice any change. ++ * /etc/profiles/per-user is monitored directly for the same reason. */ ++ if (dir->nix_profile_watch_dir != NULL) ++ return g_strdup (dir->nix_profile_watch_dir); ++ + /* If the directory itself exists then we need no alternative. */ + if (g_access (dir->path, R_OK | X_OK) == 0) + return NULL; +@@ -250,11 +260,11 @@ desktop_file_dir_changed (GFileMonitor *monitor, + * + * If this is a notification for a parent directory (because the + * desktop directory didn't exist) then we shouldn't fire the signal +- * unless something actually changed. ++ * unless something actually changed or it's part of a Nix profile. + */ + g_mutex_lock (&desktop_file_dir_lock); + +- if (dir->alternatively_watching) ++ if (dir->alternatively_watching && dir->nix_profile_watch_dir == NULL) + { + gchar *alternative_dir; + +@@ -1556,6 +1566,40 @@ desktop_file_dirs_lock (void) + for (i = 0; dirs[i]; i++) + g_ptr_array_add (desktop_file_dirs, desktop_file_dir_new (dirs[i])); + ++ { ++ /* Monitor the system and user profile under /nix/var/nix/profiles and ++ * treat modifications to them as if they were modifications to their ++ * /share sub-directory. */ ++ const gchar *user; ++ DesktopFileDir *system_profile_dir, *user_profile_dir, *user_env_dir; ++ ++ system_profile_dir = ++ desktop_file_dir_new ("/nix/var/nix/profiles/system/sw/share"); ++ system_profile_dir->nix_profile_watch_dir = g_strdup ("/nix/var/nix/profiles"); ++ g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (system_profile_dir)); ++ ++ user = g_get_user_name (); ++ if (user != NULL) ++ { ++ gchar *profile_dir, *user_data_dir, *env_dir, *env_data_dir; ++ ++ profile_dir = g_build_filename ("/nix/var/nix/profiles/per-user", user, NULL); ++ user_data_dir = g_build_filename (profile_dir, "profile", "share", NULL); ++ user_profile_dir = desktop_file_dir_new (user_data_dir); ++ user_profile_dir->nix_profile_watch_dir = profile_dir; ++ ++ env_dir = g_build_filename ("/etc/profiles/per-user", NULL); ++ env_data_dir = g_build_filename (env_dir, user, "share", NULL); ++ user_env_dir = desktop_file_dir_new (env_data_dir); ++ user_env_dir->nix_profile_watch_dir = env_dir; ++ ++ g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (user_profile_dir)); ++ g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (user_env_dir)); ++ g_free (user_data_dir); ++ g_free (env_data_dir); ++ } ++ } ++ + /* The list of directories will never change after this, unless + * g_get_user_config_dir() changes due to %G_TEST_OPTION_ISOLATE_DIRS. */ + desktop_file_dirs_config_dir = user_config_dir; diff --git a/pkgs/by-name/gl/glib/gobject_init_on_demand.patch b/pkgs/by-name/gl/glib/gobject_init_on_demand.patch new file mode 100644 index 0000000..d72d0b6 --- /dev/null +++ b/pkgs/by-name/gl/glib/gobject_init_on_demand.patch @@ -0,0 +1,87 @@ +--- glib-source/gobject/gtype.c 2016-08-17 17:20:47.000000000 +0200 ++++ glib-source/gobject/gtype.c 2016-09-01 21:56:31.777406646 +0200 +@@ -209,6 +209,9 @@ + static gboolean type_node_is_a_L (TypeNode *node, + TypeNode *iface_node); + ++#if !defined(__GLIBC__) ++static void gobject_init (void); ++#endif + + /* --- enumeration --- */ + +@@ -2631,7 +2634,10 @@ + GTypeFlags flags) + { + TypeNode *node; +- ++ ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + g_return_val_if_fail (type_id > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); +@@ -2749,6 +2755,9 @@ + TypeNode *pnode, *node; + GType type = 0; + ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + g_return_val_if_fail (parent_type > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); +@@ -2804,6 +2813,9 @@ + TypeNode *pnode, *node; + GType type; + ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + g_return_val_if_fail (parent_type > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); +@@ -3319,6 +3331,9 @@ + { + TypeNode *node; + ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + + node = lookup_type_node_I (type); +@@ -4343,6 +4358,9 @@ + void + g_type_init_with_debug_flags (GTypeDebugFlags debug_flags) + { ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + + if (debug_flags) +@@ -4361,6 +4379,9 @@ + void + g_type_init (void) + { ++#if !defined(__GLIBC__) ++ gobject_init(); ++#endif + g_assert_type_system_initialized (); + } + +@@ -4372,6 +4393,12 @@ + TypeNode *node; + GType type; + ++#if !defined(__GLIBC__) ++ static int gobject_initialized = 0; ++ if (gobject_initialized) ++ return; ++ gobject_initialized = 1; ++#endif + /* Ensure GLib is initialized first, see + * https://bugzilla.gnome.org/show_bug.cgi?id=756139 + */ diff --git a/pkgs/by-name/gl/glib/packages.nix b/pkgs/by-name/gl/glib/packages.nix new file mode 100644 index 0000000..610c6c2 --- /dev/null +++ b/pkgs/by-name/gl/glib/packages.nix @@ -0,0 +1,18 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + glib = callPackage ./. ( + let + glib-untested = glib.overrideAttrs { doCheck = false; }; + in + { + # break dependency cycles + # these things are only used for tests, they don't get into the closure + shared-mime-info = shared-mime-info.override { glib = glib-untested; }; + desktop-file-utils = desktop-file-utils.override { glib = glib-untested; }; + dbus = dbus.override { enableSystemd = false; }; + } + ); +} diff --git a/pkgs/by-name/gl/glib/quark_init_on_demand.patch b/pkgs/by-name/gl/glib/quark_init_on_demand.patch new file mode 100644 index 0000000..1680864 --- /dev/null +++ b/pkgs/by-name/gl/glib/quark_init_on_demand.patch @@ -0,0 +1,33 @@ +--- glib-source/glib/gquark.c 2016-08-17 17:20:47.000000000 +0200 ++++ glib-source/glib/gquark.c 2016-08-30 07:49:13.298234757 +0200 +@@ -57,6 +57,9 @@ + void + g_quark_init (void) + { ++ if (quark_ht) ++ return; ++ + g_assert (quark_seq_id == 0); + quark_ht = g_hash_table_new (g_str_hash, g_str_equal); + quarks = g_new (gchar*, QUARK_BLOCK_SIZE); +@@ -138,9 +141,12 @@ + return 0; + + G_LOCK (quark_global); ++#if !defined(__GLIBC__) ++ g_quark_init (); ++#endif + quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string)); + G_UNLOCK (quark_global); + + return quark; + } + +@@ -280,6 +286,7 @@ + GQuark quark; + gchar **quarks_new; + ++ g_quark_init (); + if (quark_seq_id % QUARK_BLOCK_SIZE == 0) + { + quarks_new = g_new (gchar*, quark_seq_id + QUARK_BLOCK_SIZE); diff --git a/pkgs/by-name/gl/glib/schema-override-variable.patch b/pkgs/by-name/gl/glib/schema-override-variable.patch new file mode 100644 index 0000000..f98af04 --- /dev/null +++ b/pkgs/by-name/gl/glib/schema-override-variable.patch @@ -0,0 +1,14 @@ +diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c +index 1282c10a1..feadfe3aa 100644 +--- a/gio/gsettingsschema.c ++++ b/gio/gsettingsschema.c +@@ -360,6 +360,9 @@ initialise_schema_sources (void) + + try_prepend_data_dir (g_get_user_data_dir ()); + ++ if (!is_setuid && (path = g_getenv ("NIX_GSETTINGS_OVERRIDES_DIR")) != NULL) ++ try_prepend_dir (path); ++ + /* Disallow loading extra schemas if running as setuid, as that could + * allow reading privileged files. */ + if (!is_setuid && (path = g_getenv ("GSETTINGS_SCHEMA_DIR")) != NULL) diff --git a/pkgs/by-name/gl/glib/setup-hook.sh b/pkgs/by-name/gl/glib/setup-hook.sh new file mode 100644 index 0000000..8ead551 --- /dev/null +++ b/pkgs/by-name/gl/glib/setup-hook.sh @@ -0,0 +1,34 @@ +make_glib_find_gsettings_schemas() { + # For packages that need gschemas of other packages (e.g. empathy) + for maybe_dir in "$1"/share/gsettings-schemas/*; do + if [[ -d "$maybe_dir/glib-2.0/schemas" ]]; then + addToSearchPath GSETTINGS_SCHEMAS_PATH "$maybe_dir" + fi + done +} +addEnvHooks "$targetOffset" make_glib_find_gsettings_schemas + +# Install gschemas, if any, in a package-specific directory +glibPreInstallPhase() { + makeFlagsArray+=("gsettingsschemadir=${!outputLib}/share/gsettings-schemas/$name/glib-2.0/schemas/") +} +preInstallPhases+=" glibPreInstallPhase" + +glibPreFixupPhase() { + # Move gschemas in case the install flag didn't help + if [ -d "$prefix/share/glib-2.0/schemas" ]; then + mkdir -p "${!outputLib}/share/gsettings-schemas/$name/glib-2.0" + mv "$prefix/share/glib-2.0/schemas" "${!outputLib}/share/gsettings-schemas/$name/glib-2.0/" + fi + + addToSearchPath GSETTINGS_SCHEMAS_PATH "${!outputLib}/share/gsettings-schemas/$name" +} + +# gappsWrapperArgsHook expects GSETTINGS_SCHEMAS_PATH variable to be set by this. +# Until we have dependency mechanism in generic builder, we need to use this ugly hack. +if [[ " ${preFixupPhases:-} " =~ " gappsWrapperArgsHook " ]]; then + preFixupPhases+=" " + preFixupPhases="${preFixupPhases/ gappsWrapperArgsHook / glibPreFixupPhase gappsWrapperArgsHook }" +else + preFixupPhases+=" glibPreFixupPhase" +fi diff --git a/pkgs/by-name/gl/glib/skip-timer-test.patch b/pkgs/by-name/gl/glib/skip-timer-test.patch new file mode 100644 index 0000000..942f3e7 --- /dev/null +++ b/pkgs/by-name/gl/glib/skip-timer-test.patch @@ -0,0 +1,17 @@ +Description: Skip test which performs some unreliable floating point comparisons +Forwarded: https://bugzilla.gnome.org/show_bug.cgi?id=722604 + +Index: b/glib/tests/timer.c +=================================================================== +--- a/glib/tests/timer.c ++++ b/glib/tests/timer.c +@@ -203,7 +203,7 @@ + { + g_test_init (&argc, &argv, NULL); + +- g_test_add_func ("/timer/basic", test_timer_basic); ++/* g_test_add_func ("/timer/basic", test_timer_basic);*/ +- g_test_add_func ("/timer/stop", test_timer_stop); ++/* g_test_add_func ("/timer/stop", test_timer_stop);*/ + g_test_add_func ("/timer/continue", test_timer_continue); + g_test_add_func ("/timer/reset", test_timer_reset); diff --git a/pkgs/by-name/gl/glib/split-dev-programs.patch b/pkgs/by-name/gl/glib/split-dev-programs.patch new file mode 100644 index 0000000..0333c5c --- /dev/null +++ b/pkgs/by-name/gl/glib/split-dev-programs.patch @@ -0,0 +1,214 @@ +diff --git a/gio/gdbus-2.0/codegen/meson.build b/gio/gdbus-2.0/codegen/meson.build +index 65faae9b2..4297513d4 100644 +--- a/gio/gdbus-2.0/codegen/meson.build ++++ b/gio/gdbus-2.0/codegen/meson.build +@@ -20,7 +20,7 @@ gdbus_codegen_conf.set('DATADIR', glib_datadir) + # Install gdbus-codegen executable + gdbus_codegen = configure_file(input : 'gdbus-codegen.in', + output : 'gdbus-codegen', +- install_dir : get_option('bindir'), ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + configuration : gdbus_codegen_conf + ) +diff --git a/gio/meson.build b/gio/meson.build +index 75686bb3e..2f1a73482 100644 +--- a/gio/meson.build ++++ b/gio/meson.build +@@ -882,14 +882,15 @@ pkg.generate(libgio, + 'schemasdir=' + '${datadir}' / schemas_subdir, + 'dtdsdir=' + '${datadir}' / dtds_subdir, + 'bindir=' + '${prefix}' / get_option('bindir'), ++ 'devbindir=' + get_option('devbindir'), + 'giomoduledir=' + pkgconfig_giomodulesdir, + 'gio=' + '${bindir}' / 'gio', +- 'gio_querymodules=' + pkgconfig_multiarch_bindir / 'gio-querymodules', +- 'glib_compile_schemas=' + pkgconfig_multiarch_bindir / 'glib-compile-schemas', +- 'glib_compile_resources=' + '${bindir}' / 'glib-compile-resources', ++ 'gio_querymodules=' + '${devbindir}' / 'gio-querymodules', ++ 'glib_compile_schemas=' + '${devbindir}' / 'glib-compile-schemas', ++ 'glib_compile_resources=' + '${devbindir}' / 'glib-compile-resources', + 'gdbus=' + '${bindir}' /'gdbus', +- 'gdbus_codegen=' + '${bindir}' / 'gdbus-codegen', +- 'gresource=' + '${bindir}' / 'gresource', ++ 'gdbus_codegen=' + '${devbindir}' / 'gdbus-codegen', ++ 'gresource=' + '${devbindir}' / 'gresource', + 'gsettings=' + '${bindir}' / 'gsettings', + ], + version : glib_version, +@@ -992,6 +993,7 @@ executable('gio', gio_tool_sources, + + executable('gresource', 'gresource-tool.c', + install : true, ++ install_dir : get_option('devbindir'), + install_tag : 'bin', + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, +@@ -999,7 +1001,7 @@ executable('gresource', 'gresource-tool.c', + + gio_querymodules = executable('gio-querymodules', 'gio-querymodules.c', 'giomodule-priv.c', + install : true, +- install_dir : multiarch_bindir, ++ install_dir : get_option('devbindir'), + install_tag : 'bin', + c_args : gio_c_args, + # intl.lib is not compatible with SAFESEH +@@ -1009,7 +1011,7 @@ gio_querymodules = executable('gio-querymodules', 'gio-querymodules.c', 'giomodu + glib_compile_schemas = executable('glib-compile-schemas', + ['glib-compile-schemas.c'], + install : true, +- install_dir : multiarch_bindir, ++ install_dir : get_option('devbindir'), + install_tag : 'bin', + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, +@@ -1018,6 +1020,7 @@ glib_compile_schemas = executable('glib-compile-schemas', + glib_compile_resources = executable('glib-compile-resources', + [gconstructor_as_data_h, 'glib-compile-resources.c'], + install : true, ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + c_args : gio_c_args, + # intl.lib is not compatible with SAFESEH +diff --git a/gio/tests/meson.build b/gio/tests/meson.build +index 4ef3343ab..2a0a6b56b 100644 +--- a/gio/tests/meson.build ++++ b/gio/tests/meson.build +@@ -1131,16 +1131,18 @@ if have_bash and have_pkg_config + + gio_binaries = [ + 'gio', +- 'glib-compile-resources', + 'gdbus', +- 'gdbus-codegen', +- 'gresource', + 'gsettings', + ] +- gio_multiarch_binaries = [ ++ gio_dev_binaries = [ ++ 'glib-compile-resources', ++ 'gdbus-codegen', ++ 'gresource', + 'gio-querymodules', + 'glib-compile-schemas', + ] ++ gio_multiarch_binaries = [ ++ ] + + foreach binary: gio_binaries + pkg_config_tests += [ +@@ -1149,6 +1151,13 @@ if have_bash and have_pkg_config + prefix / get_option('bindir') / binary) + ] + endforeach ++ foreach binary: gio_dev_binaries ++ pkg_config_tests += [ ++ 'test "$(pkg-config --variable=@0@ gio-2.0)" = "@1@"'.format( ++ binary.underscorify(), ++ prefix / get_option('devbindir') / binary) ++ ] ++ endforeach + + foreach binary: gio_multiarch_binaries + pkg_config_tests += [ +diff --git a/glib/meson.build b/glib/meson.build +index c26a35e42..38effe12a 100644 +--- a/glib/meson.build ++++ b/glib/meson.build +@@ -447,9 +447,10 @@ pkg.generate(libglib, + variables : [ + 'bindir=' + '${prefix}' / get_option('bindir'), + 'datadir=' + '${prefix}' / get_option('datadir'), +- 'glib_genmarshal=' + '${bindir}' / 'glib-genmarshal', +- 'gobject_query=' + '${bindir}' / 'gobject-query', +- 'glib_mkenums=' + '${bindir}' / 'glib-mkenums', ++ 'devbindir=' + get_option('devbindir'), ++ 'glib_genmarshal=' + '${devbindir}' / 'glib-genmarshal', ++ 'gobject_query=' + '${devbindir}' / 'gobject-query', ++ 'glib_mkenums=' + '${devbindir}' / 'glib-mkenums', + 'glib_valgrind_suppressions=' + '${datadir}' / + valgrind_suppression_file_install_subdir / + fs.name(valgrind_suppression_file), +@@ -490,6 +491,7 @@ if host_system == 'windows' + else + gtester = executable('gtester', 'gtester.c', + install : true, ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + c_args : ['-UG_DISABLE_ASSERT'], + include_directories : configinc, +@@ -505,7 +507,7 @@ report_conf.set('PYTHON', python_name) + configure_file( + input: 'gtester-report.in', + output: 'gtester-report', +- install_dir: get_option('bindir'), ++ install_dir: get_option('devbindir'), + install_tag : 'bin-devel', + configuration: report_conf, + install_mode: 'rwxr-xr-x' +diff --git a/glib/tests/meson.build b/glib/tests/meson.build +index 09ecd5ab3..9748d4122 100644 +--- a/glib/tests/meson.build ++++ b/glib/tests/meson.build +@@ -508,9 +508,9 @@ if have_bash and have_pkg_config + 'test "$(pkg-config --variable=datadir glib-2.0)" = "@0@"'.format( + prefix / get_option('datadir')), + 'test "$(pkg-config --variable=gobject_query glib-2.0)" = "@0@"'.format( +- prefix / get_option('bindir') / 'gobject-query'), ++ prefix / get_option('devbindir') / 'gobject-query'), + 'test "$(pkg-config --variable=glib_mkenums glib-2.0)" = "@0@"'.format( +- prefix / get_option('bindir') / 'glib-mkenums'), ++ prefix / get_option('devbindir') / 'glib-mkenums'), + 'test "$(pkg-config --variable=glib_valgrind_suppressions glib-2.0)" = "@0@"'.format( + prefix / get_option('datadir') / + valgrind_suppression_file_install_subdir / fs.name(valgrind_suppression_file)), +diff --git a/gobject/meson.build b/gobject/meson.build +index 2129aaf8a..da8462428 100644 +--- a/gobject/meson.build ++++ b/gobject/meson.build +@@ -94,7 +94,7 @@ foreach tool: python_tools + input : tool + '.in', + output : tool, + configuration : python_tools_conf, +- install_dir : glib_bindir, ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + ) + +@@ -172,6 +172,7 @@ meson.override_dependency('gobject-2.0', libgobject_dep) + + gobject_query = executable('gobject-query', 'gobject-query.c', + install : true, ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + dependencies : [libglib_dep, libgobject_dep]) + +diff --git a/meson_options.txt b/meson_options.txt +index 517d5757c..198cc1b3c 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -4,6 +4,11 @@ option('runtime_libdir', + description : 'install runtime libraries relative to libdir', + deprecated: true) + ++option('devbindir', ++ type : 'string', ++ value : '', ++ description : 'bindir for development tools') ++ + option('charsetalias_dir', + type : 'string', + value : '', +diff --git a/tools/meson.build b/tools/meson.build +index 257312ebf..f8315392b 100644 +--- a/tools/meson.build ++++ b/tools/meson.build +@@ -8,7 +8,7 @@ if have_sh + gettextize_conf.set('datarootdir', glib_datadir) + gettextize_conf.set('datadir', glib_datadir) + configure_file(input : 'glib-gettextize.in', +- install_dir : glib_bindir, ++ install_dir : get_option('devbindir'), + install_tag : 'bin-devel', + output : 'glib-gettextize', + configuration : gettextize_conf) diff --git a/pkgs/by-name/gl/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch b/pkgs/by-name/gl/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch new file mode 100644 index 0000000..100bf31 --- /dev/null +++ b/pkgs/by-name/gl/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch @@ -0,0 +1,134 @@ +From e207c3dbcff1d3d09c60eec99b6fec2a698b01bd Mon Sep 17 00:00:00 2001 +From: Bernardo Meurer +Date: Fri, 22 Jul 2022 22:11:07 -0700 +Subject: [PATCH] Revert "Remove all usage of @BASH@ or ${BASH} in installed + files, and hardcode /bin/bash instead" + +We need the ability to override to use `/bin/sh` here to avoid having +some bootstrap tools in a final build product. + +This reverts commit 5188a9d0265cc6f7235a8af1d31ab02e4a24853d. + +Co-authored-by: Maximilian Bosch +--- + debug/Makefile | 5 +++-- + debug/xtrace.sh | 2 +- + elf/Makefile | 4 +++- + elf/ldd.bash.in | 2 +- + elf/sotruss.sh | 2 +- + malloc/Makefile | 5 +++-- + malloc/memusage.sh | 2 +- + timezone/Makefile | 3 ++- + 8 files changed, 15 insertions(+), 10 deletions(-) + +diff --git a/debug/Makefile b/debug/Makefile +index 3903cc97a3..b041acca71 100644 +--- a/debug/Makefile ++++ b/debug/Makefile +@@ -343,8 +343,9 @@ $(objpfx)pcprofiledump: $(objpfx)pcprofiledump.o + + $(objpfx)xtrace: xtrace.sh + rm -f $@.new +- sed -e 's|@VERSION@|$(version)|' -e 's|@SLIBDIR@|$(sLIBdir)|' \ +- -e 's|@BINDIR@|$(bindir)|' -e 's|@PKGVERSION@|$(PKGVERSION)|' \ ++ sed -e 's|@BASH@|$(BASH)|' -e 's|@VERSION@|$(version)|' \ ++ -e 's|@SLIBDIR@|$(sLIBdir)|' -e 's|@BINDIR@|$(bindir)|' \ ++ -e 's|@PKGVERSION@|$(PKGVERSION)|' \ + -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|' $^ > $@.new \ + && rm -f $@ && mv $@.new $@ && chmod +x $@ + +diff --git a/debug/xtrace.sh b/debug/xtrace.sh +index 77ec1d84df..5614404a71 100755 +--- a/debug/xtrace.sh ++++ b/debug/xtrace.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#! @BASH@ + # Copyright (C) 1999-2024 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + +diff --git a/elf/Makefile b/elf/Makefile +index 5d78b659ce..a2145d7b64 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -249,7 +249,8 @@ $(objpfx)sotruss-lib.so: $(common-objpfx)libc.so $(objpfx)ld.so \ + $(common-objpfx)libc_nonshared.a + + $(objpfx)sotruss: sotruss.sh $(common-objpfx)config.make +- sed -e 's%@VERSION@%$(version)%g' \ ++ sed -e 's%@BASH@%$(BASH)%g' \ ++ -e 's%@VERSION@%$(version)%g' \ + -e 's%@TEXTDOMAINDIR@%$(localedir)%g' \ + -e 's%@PREFIX@%$(prefix)%g' \ + -e 's|@PKGVERSION@|$(PKGVERSION)|g' \ +@@ -1392,6 +1393,7 @@ ldd-rewrite = -e 's%@RTLD@%$(rtlddir)/$(rtld-installed-name)%g' \ + -e 's%@VERSION@%$(version)%g' \ + -e 's|@PKGVERSION@|$(PKGVERSION)|g' \ + -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|g' \ ++ -e 's%@BASH@%$(BASH)%g' \ + -e 's%@TEXTDOMAINDIR@%$(localedir)%g' + + ifeq ($(ldd-rewrite-script),no) +diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in +index d6b640df66..46111670cd 100644 +--- a/elf/ldd.bash.in ++++ b/elf/ldd.bash.in +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#! @BASH@ + # Copyright (C) 1996-2024 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + +diff --git a/elf/sotruss.sh b/elf/sotruss.sh +index ac1a83984e..2bf17c518e 100755 +--- a/elf/sotruss.sh ++++ b/elf/sotruss.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#! @BASH@ + # Copyright (C) 2011-2024 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + +diff --git a/malloc/Makefile b/malloc/Makefile +index c83ade5f10..8dd9174b79 100644 +--- a/malloc/Makefile ++++ b/malloc/Makefile +@@ -312,8 +312,9 @@ $(objpfx)mtrace: mtrace.pl + + $(objpfx)memusage: memusage.sh + rm -f $@.new +- sed -e 's|@VERSION@|$(version)|' -e 's|@SLIBDIR@|$(sLIBdir)|' \ +- -e 's|@BINDIR@|$(bindir)|' -e 's|@PKGVERSION@|$(PKGVERSION)|' \ ++ sed -e 's|@BASH@|$(BASH)|' -e 's|@VERSION@|$(version)|' \ ++ -e 's|@SLIBDIR@|$(sLIBdir)|' -e 's|@BINDIR@|$(bindir)|' \ ++ -e 's|@PKGVERSION@|$(PKGVERSION)|' \ + -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|' $^ > $@.new \ + && rm -f $@ && mv $@.new $@ && chmod +x $@ + +diff --git a/malloc/memusage.sh b/malloc/memusage.sh +index d2d9d17ea8..2e7efc9049 100755 +--- a/malloc/memusage.sh ++++ b/malloc/memusage.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#! @BASH@ + # Copyright (C) 1999-2024 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + +diff --git a/timezone/Makefile b/timezone/Makefile +index d7acb387ba..c8e203ea3a 100644 +--- a/timezone/Makefile ++++ b/timezone/Makefile +@@ -132,7 +132,8 @@ $(testdata)/XT5: testdata/gen-XT5.sh + mv $@.tmp $@ + + $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make +- sed -e 's|TZDIR=[^}]*|TZDIR=$(zonedir)|' \ ++ sed -e 's|/bin/bash|$(BASH)|' \ ++ -e 's|TZDIR=[^}]*|TZDIR=$(zonedir)|' \ + -e '/TZVERSION=/s|see_Makefile|"$(version)"|' \ + -e '/PKGVERSION=/s|=.*|="$(PKGVERSION)"|' \ + -e '/REPORT_BUGS_TO=/s|=.*|="$(REPORT_BUGS_TO)"|' \ +-- +2.42.0 + diff --git a/pkgs/by-name/gl/glibc/0001-aarch64-math-vector.h-add-NVCC-include-guard.patch b/pkgs/by-name/gl/glibc/0001-aarch64-math-vector.h-add-NVCC-include-guard.patch new file mode 100644 index 0000000..234bc19 --- /dev/null +++ b/pkgs/by-name/gl/glibc/0001-aarch64-math-vector.h-add-NVCC-include-guard.patch @@ -0,0 +1,37 @@ +From 44d0a3a9bd8c6fe59f6ccb44206a50a900bfcf4a Mon Sep 17 00:00:00 2001 +From: Connor Baker +Date: Tue, 31 Oct 2023 14:30:24 +0000 +Subject: [PATCH] aarch64/math-vector.h: add NVCC include guard + +--- + sysdeps/aarch64/fpu/bits/math-vector.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/sysdeps/aarch64/fpu/bits/math-vector.h b/sysdeps/aarch64/fpu/bits/math-vector.h +index 7c200599c1..583a426494 100644 +--- a/sysdeps/aarch64/fpu/bits/math-vector.h ++++ b/sysdeps/aarch64/fpu/bits/math-vector.h +@@ -25,17 +25,17 @@ + /* Get default empty definitions for simd declarations. */ + #include + +-#if __GNUC_PREREQ(9, 0) ++#if __GNUC_PREREQ(9, 0) && !defined(__CUDACC__) + # define __ADVSIMD_VEC_MATH_SUPPORTED + typedef __Float32x4_t __f32x4_t; + typedef __Float64x2_t __f64x2_t; +-#elif __glibc_clang_prereq(8, 0) ++#elif __glibc_clang_prereq(8, 0) && !defined(__CUDACC__) + # define __ADVSIMD_VEC_MATH_SUPPORTED + typedef __attribute__ ((__neon_vector_type__ (4))) float __f32x4_t; + typedef __attribute__ ((__neon_vector_type__ (2))) double __f64x2_t; + #endif + +-#if __GNUC_PREREQ(10, 0) || __glibc_clang_prereq(11, 0) ++#if (__GNUC_PREREQ(10, 0) || __glibc_clang_prereq(11, 0)) && !defined(__CUDACC__) + # define __SVE_VEC_MATH_SUPPORTED + typedef __SVFloat32_t __sv_f32_t; + typedef __SVFloat64_t __sv_f64_t; +-- +2.42.0 + diff --git a/pkgs/by-name/gl/glibc/2.39-master.patch b/pkgs/by-name/gl/glibc/2.39-master.patch new file mode 100644 index 0000000..3e08155 --- /dev/null +++ b/pkgs/by-name/gl/glibc/2.39-master.patch @@ -0,0 +1,566 @@ +commit 6d1e3fb07b45e2e31e469b16cf21b24bccf8914c +Author: Andreas K. Hüttel +Date: Wed Jan 31 02:12:43 2024 +0100 + + Replace advisories directory + + Signed-off-by: Andreas K. Hüttel + +diff --git a/ADVISORIES b/ADVISORIES +new file mode 100644 +index 0000000000..d4e33f2df3 +--- /dev/null ++++ b/ADVISORIES +@@ -0,0 +1,2 @@ ++For the GNU C Library Security Advisories, see the git master branch: ++https://sourceware.org/git/?p=glibc.git;a=tree;f=advisories;hb=HEAD +diff --git a/advisories/GLIBC-SA-2023-0001 b/advisories/GLIBC-SA-2023-0001 +deleted file mode 100644 +index 3d19c91b6a..0000000000 +--- a/advisories/GLIBC-SA-2023-0001 ++++ /dev/null +@@ -1,14 +0,0 @@ +-printf: incorrect output for integers with thousands separator and width field +- +-When the printf family of functions is called with a format specifier +-that uses an (enable grouping) and a minimum width +-specifier, the resulting output could be larger than reasonably expected +-by a caller that computed a tight bound on the buffer size. The +-resulting larger than expected output could result in a buffer overflow +-in the printf family of functions. +- +-CVE-Id: CVE-2023-25139 +-Public-Date: 2023-02-02 +-Vulnerable-Commit: e88b9f0e5cc50cab57a299dc7efe1a4eb385161d (2.37) +-Fix-Commit: c980549cc6a1c03c23cc2fe3e7b0fe626a0364b0 (2.38) +-Fix-Commit: 07b9521fc6369d000216b96562ff7c0ed32a16c4 (2.37-4) +diff --git a/advisories/GLIBC-SA-2023-0002 b/advisories/GLIBC-SA-2023-0002 +deleted file mode 100644 +index 5122669a64..0000000000 +--- a/advisories/GLIBC-SA-2023-0002 ++++ /dev/null +@@ -1,15 +0,0 @@ +-getaddrinfo: Stack read overflow in no-aaaa mode +- +-If the system is configured in no-aaaa mode via /etc/resolv.conf, +-getaddrinfo is called for the AF_UNSPEC address family, and a DNS +-response is received over TCP that is larger than 2048 bytes, +-getaddrinfo may potentially disclose stack contents via the returned +-address data, or crash. +- +-CVE-Id: CVE-2023-4527 +-Public-Date: 2023-09-12 +-Vulnerable-Commit: f282cdbe7f436c75864e5640a409a10485e9abb2 (2.36) +-Fix-Commit: bd77dd7e73e3530203be1c52c8a29d08270cb25d (2.39) +-Fix-Commit: 4ea972b7edd7e36610e8cde18bf7a8149d7bac4f (2.36-113) +-Fix-Commit: b7529346025a130fee483d42178b5c118da971bb (2.37-38) +-Fix-Commit: b25508dd774b617f99419bdc3cf2ace4560cd2d6 (2.38-19) +diff --git a/advisories/GLIBC-SA-2023-0003 b/advisories/GLIBC-SA-2023-0003 +deleted file mode 100644 +index d3aef80348..0000000000 +--- a/advisories/GLIBC-SA-2023-0003 ++++ /dev/null +@@ -1,15 +0,0 @@ +-getaddrinfo: Potential use-after-free +- +-When an NSS plugin only implements the _gethostbyname2_r and +-_getcanonname_r callbacks, getaddrinfo could use memory that was freed +-during buffer resizing, potentially causing a crash or read or write to +-arbitrary memory. +- +-CVE-Id: CVE-2023-4806 +-Public-Date: 2023-09-12 +-Fix-Commit: 973fe93a5675c42798b2161c6f29c01b0e243994 (2.39) +-Fix-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) +-Fix-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) +-Fix-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) +-Fix-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) +-Fix-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) +diff --git a/advisories/GLIBC-SA-2023-0004 b/advisories/GLIBC-SA-2023-0004 +deleted file mode 100644 +index 5286a7aa54..0000000000 +--- a/advisories/GLIBC-SA-2023-0004 ++++ /dev/null +@@ -1,16 +0,0 @@ +-tunables: local privilege escalation through buffer overflow +- +-If a tunable of the form NAME=NAME=VAL is passed in the environment of a +-setuid program and NAME is valid, it may result in a buffer overflow, +-which could be exploited to achieve escalated privileges. This flaw was +-introduced in glibc 2.34. +- +-CVE-Id: CVE-2023-4911 +-Public-Date: 2023-10-03 +-Vulnerable-Commit: 2ed18c5b534d9e92fc006202a5af0df6b72e7aca (2.34) +-Fix-Commit: 1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa (2.39) +-Fix-Commit: dcc367f148bc92e7f3778a125f7a416b093964d9 (2.34-423) +-Fix-Commit: c84018a05aec80f5ee6f682db0da1130b0196aef (2.35-274) +-Fix-Commit: 22955ad85186ee05834e47e665056148ca07699c (2.36-118) +-Fix-Commit: b4e23c75aea756b4bddc4abcf27a1c6dca8b6bd3 (2.37-45) +-Fix-Commit: 750a45a783906a19591fb8ff6b7841470f1f5701 (2.38-27) +diff --git a/advisories/GLIBC-SA-2023-0005 b/advisories/GLIBC-SA-2023-0005 +deleted file mode 100644 +index cc4eb90b82..0000000000 +--- a/advisories/GLIBC-SA-2023-0005 ++++ /dev/null +@@ -1,18 +0,0 @@ +-getaddrinfo: DoS due to memory leak +- +-The fix for CVE-2023-4806 introduced a memory leak when an application +-calls getaddrinfo for AF_INET6 with AI_CANONNAME, AI_ALL and AI_V4MAPPED +-flags set. +- +-CVE-Id: CVE-2023-5156 +-Public-Date: 2023-09-25 +-Vulnerable-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) +-Vulnerable-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) +-Vulnerable-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) +-Vulnerable-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) +-Vulnerable-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) +-Fix-Commit: 8006457ab7e1cd556b919f477348a96fe88f2e49 (2.34-421) +-Fix-Commit: 17092c0311f954e6f3c010f73ce3a78c24ac279a (2.35-272) +-Fix-Commit: 856bac55f98dc840e7c27cfa82262b933385de90 (2.36-116) +-Fix-Commit: 4473d1b87d04b25cdd0e0354814eeaa421328268 (2.37-42) +-Fix-Commit: 5ee59ca371b99984232d7584fe2b1a758b4421d3 (2.38-24) +diff --git a/advisories/GLIBC-SA-2024-0001 b/advisories/GLIBC-SA-2024-0001 +deleted file mode 100644 +index 28931c75ae..0000000000 +--- a/advisories/GLIBC-SA-2024-0001 ++++ /dev/null +@@ -1,15 +0,0 @@ +-syslog: Heap buffer overflow in __vsyslog_internal +- +-__vsyslog_internal did not handle a case where printing a SYSLOG_HEADER +-containing a long program name failed to update the required buffer +-size, leading to the allocation and overflow of a too-small buffer on +-the heap. +- +-CVE-Id: CVE-2023-6246 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: 6bd0e4efcc78f3c0115e5ea9739a1642807450da (2.39) +-Fix-Commit: 23514c72b780f3da097ecf33a793b7ba9c2070d2 (2.38-42) +-Fix-Commit: 97a4292aa4a2642e251472b878d0ec4c46a0e59a (2.37-57) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: d1a83b6767f68b3cb5b4b4ea2617254acd040c82 (2.36-126) +diff --git a/advisories/GLIBC-SA-2024-0002 b/advisories/GLIBC-SA-2024-0002 +deleted file mode 100644 +index 940bfcf2fc..0000000000 +--- a/advisories/GLIBC-SA-2024-0002 ++++ /dev/null +@@ -1,15 +0,0 @@ +-syslog: Heap buffer overflow in __vsyslog_internal +- +-__vsyslog_internal used the return value of snprintf/vsnprintf to +-calculate buffer sizes for memory allocation. If these functions (for +-any reason) failed and returned -1, the resulting buffer would be too +-small to hold output. +- +-CVE-Id: CVE-2023-6779 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: 7e5a0c286da33159d47d0122007aac016f3e02cd (2.39) +-Fix-Commit: d0338312aace5bbfef85e03055e1212dd0e49578 (2.38-43) +-Fix-Commit: 67062eccd9a65d7fda9976a56aeaaf6c25a80214 (2.37-58) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: 2bc9d7c002bdac38b5c2a3f11b78e309d7765b83 (2.36-127) +diff --git a/advisories/GLIBC-SA-2024-0003 b/advisories/GLIBC-SA-2024-0003 +deleted file mode 100644 +index b43a5150ab..0000000000 +--- a/advisories/GLIBC-SA-2024-0003 ++++ /dev/null +@@ -1,13 +0,0 @@ +-syslog: Integer overflow in __vsyslog_internal +- +-__vsyslog_internal calculated a buffer size by adding two integers, but +-did not first check if the addition would overflow. +- +-CVE-Id: CVE-2023-6780 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: ddf542da94caf97ff43cc2875c88749880b7259b (2.39) +-Fix-Commit: d37c2b20a4787463d192b32041c3406c2bd91de0 (2.38-44) +-Fix-Commit: 2b58cba076e912961ceaa5fa58588e4b10f791c0 (2.37-59) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: b9b7d6a27aa0632f334352fa400771115b3c69b7 (2.36-128) +diff --git a/advisories/README b/advisories/README +deleted file mode 100644 +index 94e68b1350..0000000000 +--- a/advisories/README ++++ /dev/null +@@ -1,73 +0,0 @@ +-GNU C Library Security Advisory Format +-====================================== +- +-Security advisories in this directory follow a simple git commit log +-format, with a heading and free-format description augmented with tags +-to allow parsing key information. References to code changes are +-specific to the glibc repository and follow a specific format: +- +- Tag-name: (release-version) +- +-The indicates a specific commit in the repository. The +-release-version indicates the publicly consumable release in which this +-commit is known to exist. The release-version is derived from the +-git-describe format, (i.e. stripped out from glibc-2.34.NNN-gxxxx) and +-is of the form 2.34-NNN. If the -NNN suffix is absent, it means that +-the change is in that release tarball, otherwise the change is on the +-release/2.YY/master branch and not in any released tarball. +- +-The following tags are currently being used: +- +-CVE-Id: +-This is the CVE-Id assigned under the CVE Program +-(https://www.cve.org/). +- +-Public-Date: +-The date this issue became publicly known. +- +-Vulnerable-Commit: +-The commit that introduced this vulnerability. There could be multiple +-entries, one for each release branch in the glibc repository; the +-release-version portion of this tag should tell you which branch this is +-on. +- +-Fix-Commit: +-The commit that fixed this vulnerability. There could be multiple +-entries for each release branch in the glibc repository, indicating that +-all of those commits contributed to fixing that issue in each of those +-branches. +- +-Adding an Advisory +------------------- +- +-An advisory for a CVE needs to be added on the master branch in two steps: +- +-1. Add the text of the advisory without any Fix-Commit tags along with +- the fix for the CVE. Add the Vulnerable-Commit tag, if applicable. +- The advisories directory does not exist in release branches, so keep +- the advisory text commit distinct from the code changes, to ease +- backports. Ask for the GLIBC-SA advisory number from the security +- team. +- +-2. Finish all backports on release branches and then back on the msater +- branch, add all commit refs to the advisory using the Fix-Commit +- tags. Don't bother adding the release-version subscript since the +- next step will overwrite it. +- +-3. Run the process-advisories.sh script in the scripts directory on the +- advisory: +- +- scripts/process-advisories.sh update GLIBC-SA-YYYY-NNNN +- +- (replace YYYY-NNNN with the actual advisory number). +- +-4. Verify the updated advisory and push the result. +- +-Getting a NEWS snippet from advisories +--------------------------------------- +- +-Run: +- +- scripts/process-advisories.sh news +- +-and copy the content into the NEWS file. + +commit 63295e4fda1f6dab4bf7442706fe303bf283036c +Author: Adhemerval Zanella +Date: Mon Feb 5 16:10:24 2024 +0000 + + arm: Remove wrong ldr from _dl_start_user (BZ 31339) + + The commit 49d877a80b29d3002887b084eec6676d9f5fec18 (arm: Remove + _dl_skip_args usage) removed the _SKIP_ARGS literal, which was + previously loader to r4 on loader _start. However, the cleanup did not + remove the following 'ldr r4, [sl, r4]' on _dl_start_user, used to check + to skip the arguments after ld self-relocations. + + In my testing, the kernel initially set r4 to 0, which makes the + ldr instruction just read the _GLOBAL_OFFSET_TABLE_. However, since r4 + is a callee-saved register; a different runtime might not zero + initialize it and thus trigger an invalid memory access. + + Checked on arm-linux-gnu. + + Reported-by: Adrian Ratiu + Reviewed-by: Szabolcs Nagy + (cherry picked from commit 1e25112dc0cb2515d27d8d178b1ecce778a9d37a) + +diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h +index b857bbc868..dd1a0f6b6e 100644 +--- a/sysdeps/arm/dl-machine.h ++++ b/sysdeps/arm/dl-machine.h +@@ -139,7 +139,6 @@ _start:\n\ + _dl_start_user:\n\ + adr r6, .L_GET_GOT\n\ + add sl, sl, r6\n\ +- ldr r4, [sl, r4]\n\ + @ save the entry point in another register\n\ + mov r6, r0\n\ + @ get the original arg count\n\ + +commit 312e159626b67fe11f39e83e222cf4348a3962f3 +Author: Adhemerval Zanella +Date: Thu Feb 1 14:29:53 2024 -0300 + + mips: FIx clone3 implementation (BZ 31325) + + For o32 we need to setup a minimal stack frame to allow cprestore + on __thread_start_clone3 (which instruct the linker to save the + gp for PIC). Also, there is no guarantee by kABI that $8 will be + preserved after syscall execution, so we need to save it on the + provided stack. + + Checked on mipsel-linux-gnu. + + Reported-by: Khem Raj + Tested-by: Khem Raj + (cherry picked from commit bbd248ac0d75efdef8fe61ea69b1fb25fb95b6e7) + +diff --git a/sysdeps/unix/sysv/linux/mips/clone3.S b/sysdeps/unix/sysv/linux/mips/clone3.S +index e9fec2fa47..481b8ae963 100644 +--- a/sysdeps/unix/sysv/linux/mips/clone3.S ++++ b/sysdeps/unix/sysv/linux/mips/clone3.S +@@ -37,11 +37,6 @@ + + .text + .set nomips16 +-#if _MIPS_SIM == _ABIO32 +-# define EXTRA_LOCALS 1 +-#else +-# define EXTRA_LOCALS 0 +-#endif + #define FRAMESZ ((NARGSAVE*SZREG)+ALSZ)&ALMASK + GPOFF= FRAMESZ-(1*SZREG) + NESTED(__clone3, SZREG, sp) +@@ -68,8 +63,31 @@ NESTED(__clone3, SZREG, sp) + beqz a0, L(error) /* No NULL cl_args pointer. */ + beqz a2, L(error) /* No NULL function pointer. */ + ++#if _MIPS_SIM == _ABIO32 ++ /* Both stack and stack_size on clone_args are defined as uint64_t, and ++ there is no need to handle values larger than to 32 bits for o32. */ ++# if __BYTE_ORDER == __BIG_ENDIAN ++# define CL_STACKPOINTER_OFFSET 44 ++# define CL_STACKSIZE_OFFSET 52 ++# else ++# define CL_STACKPOINTER_OFFSET 40 ++# define CL_STACKSIZE_OFFSET 48 ++# endif ++ ++ /* For o32 we need to setup a minimal stack frame to allow cprestore ++ on __thread_start_clone3. Also there is no guarantee by kABI that ++ $8 will be preserved after syscall execution (so we need to save it ++ on the provided stack). */ ++ lw t0, CL_STACKPOINTER_OFFSET(a0) /* Load the stack pointer. */ ++ lw t1, CL_STACKSIZE_OFFSET(a0) /* Load the stack_size. */ ++ addiu t1, -32 /* Update the stack size. */ ++ addu t2, t1, t0 /* Calculate the thread stack. */ ++ sw a3, 0(t2) /* Save argument pointer. */ ++ sw t1, CL_STACKSIZE_OFFSET(a0) /* Save the new stack size. */ ++#else + move $8, a3 /* a3 is set to 0/1 for syscall success/error + while a4/$8 is returned unmodified. */ ++#endif + + /* Do the system call, the kernel expects: + v0: system call number +@@ -125,7 +143,11 @@ L(thread_start_clone3): + + /* Restore the arg for user's function. */ + move t9, a2 /* Function pointer. */ ++#if _MIPS_SIM == _ABIO32 ++ PTR_L a0, 0(sp) ++#else + move a0, $8 /* Argument pointer. */ ++#endif + + /* Call the user's function. */ + jal t9 + +commit d0724994de40934c552f1f68de89053848a44927 +Author: Xi Ruoyao +Date: Thu Feb 22 21:26:55 2024 +0100 + + math: Update mips64 ulps + + Signed-off-by: Andreas K. Hüttel + (cherry picked from commit e2a65ecc4b30a797df7dc6529f09b712aa256029) + +diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps +index 78969745b2..933aba4735 100644 +--- a/sysdeps/mips/mips64/libm-test-ulps ++++ b/sysdeps/mips/mips64/libm-test-ulps +@@ -1066,17 +1066,17 @@ double: 1 + ldouble: 1 + + Function: "j0": +-double: 2 ++double: 3 + float: 9 + ldouble: 2 + + Function: "j0_downward": +-double: 5 ++double: 6 + float: 9 + ldouble: 9 + + Function: "j0_towardzero": +-double: 6 ++double: 7 + float: 9 + ldouble: 9 + +@@ -1146,6 +1146,7 @@ float: 6 + ldouble: 8 + + Function: "log": ++double: 1 + float: 1 + ldouble: 1 + + +commit e0910f1d3278f05439fb434ee528fc9be1b6bd5e +Author: Stefan Liebler +Date: Thu Feb 22 15:03:27 2024 +0100 + + S390: Do not clobber r7 in clone [BZ #31402] + + Starting with commit e57d8fc97b90127de4ed3e3a9cdf663667580935 + "S390: Always use svc 0" + clone clobbers the call-saved register r7 in error case: + function or stack is NULL. + + This patch restores the saved registers also in the error case. + Furthermore the existing test misc/tst-clone is extended to check + all error cases and that clone does not clobber registers in this + error case. + + (cherry picked from commit 02782fd12849b6673cb5c2728cb750e8ec295aa3) + +diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S +index 4c882ef2ee..a7a863242c 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S +@@ -53,6 +53,7 @@ ENTRY(__clone) + br %r14 + error: + lhi %r2,-EINVAL ++ lm %r6,%r7,24(%r15) /* Load registers. */ + j SYSCALL_ERROR_LABEL + PSEUDO_END (__clone) + +diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S +index 4eb104be71..c552a6b8de 100644 +--- a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S ++++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S +@@ -54,6 +54,7 @@ ENTRY(__clone) + br %r14 + error: + lghi %r2,-EINVAL ++ lmg %r6,%r7,48(%r15) /* Restore registers. */ + jg SYSCALL_ERROR_LABEL + PSEUDO_END (__clone) + +diff --git a/sysdeps/unix/sysv/linux/tst-clone.c b/sysdeps/unix/sysv/linux/tst-clone.c +index 470676ab2b..2bc7124983 100644 +--- a/sysdeps/unix/sysv/linux/tst-clone.c ++++ b/sysdeps/unix/sysv/linux/tst-clone.c +@@ -16,12 +16,16 @@ + License along with the GNU C Library; if not, see + . */ + +-/* BZ #2386 */ ++/* BZ #2386, BZ #31402 */ + #include + #include + #include + #include + #include ++#include /* For _STACK_GROWS_{UP,DOWN}. */ ++#include ++ ++volatile unsigned v = 0xdeadbeef; + + int child_fn(void *arg) + { +@@ -30,22 +34,67 @@ int child_fn(void *arg) + } + + static int +-do_test (void) ++__attribute__((noinline)) ++do_clone (int (*fn)(void *), void *stack) + { + int result; ++ unsigned int a = v; ++ unsigned int b = v; ++ unsigned int c = v; ++ unsigned int d = v; ++ unsigned int e = v; ++ unsigned int f = v; ++ unsigned int g = v; ++ unsigned int h = v; ++ unsigned int i = v; ++ unsigned int j = v; ++ unsigned int k = v; ++ unsigned int l = v; ++ unsigned int m = v; ++ unsigned int n = v; ++ unsigned int o = v; ++ ++ result = clone (fn, stack, 0, NULL); ++ ++ /* Check that clone does not clobber call-saved registers. */ ++ TEST_VERIFY (a == v && b == v && c == v && d == v && e == v && f == v ++ && g == v && h == v && i == v && j == v && k == v && l == v ++ && m == v && n == v && o == v); ++ ++ return result; ++} ++ ++static void ++__attribute__((noinline)) ++do_test_single (int (*fn)(void *), void *stack) ++{ ++ printf ("%s (fn=%p, stack=%p)\n", __FUNCTION__, fn, stack); ++ errno = 0; ++ ++ int result = do_clone (fn, stack); ++ ++ TEST_COMPARE (errno, EINVAL); ++ TEST_COMPARE (result, -1); ++} + +- result = clone (child_fn, NULL, 0, NULL); ++static int ++do_test (void) ++{ ++ char st[128 * 1024] __attribute__ ((aligned)); ++ void *stack = NULL; ++#if _STACK_GROWS_DOWN ++ stack = st + sizeof (st); ++#elif _STACK_GROWS_UP ++ stack = st; ++#else ++# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" ++#endif + +- if (errno != EINVAL || result != -1) +- { +- printf ("FAIL: clone()=%d (wanted -1) errno=%d (wanted %d)\n", +- result, errno, EINVAL); +- return 1; +- } ++ do_test_single (child_fn, NULL); ++ do_test_single (NULL, stack); ++ do_test_single (NULL, NULL); + +- puts ("All OK"); + return 0; + } + +-#define TEST_FUNCTION do_test () +-#include "../test-skeleton.c" ++#include diff --git a/pkgs/by-name/gl/glibc/common.nix b/pkgs/by-name/gl/glibc/common.nix new file mode 100644 index 0000000..4d6fb5a --- /dev/null +++ b/pkgs/by-name/gl/glibc/common.nix @@ -0,0 +1,292 @@ +/* Build configuration used to build glibc, Info files, and locale + information. + + Note that this derivation has multiple outputs and does not respect the + standard convention of putting the executables into the first output. The + first output is `lib` so that the libraries provided by this derivation + can be accessed directly, e.g. + + "${pkgs.glibc}/lib/ld-linux-x86_64.so.2" + + The executables are put into `bin` output and need to be referenced via + the `bin` attribute of the main package, e.g. + + "${pkgs.glibc.bin}/bin/ldd". + + The executables provided by glibc typically include `ldd`, `locale`, `iconv` + but the exact set depends on the library version and the configuration. +*/ + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +{ stdenv, lib +, buildPackages +, fetchurl +, linuxHeaders ? null +, gd ? null, libpng ? null +, libidn2 +, bison +, python3Minimal +}: + +{ pname +, withLinuxHeaders ? false +, profilingLibraries ? false +, withGd ? false +, extraBuildInputs ? [] +, extraNativeBuildInputs ? [] +, ... +} @ args: + +let + version = "2.39"; + patchSuffix = "-5"; + sha256 = "sha256-93vUfPgXDFc2Wue/hmlsEYrbOxINMlnGTFAtPcHi2SY="; +in + +assert withLinuxHeaders -> linuxHeaders != null; +assert withGd -> gd != null && libpng != null; + +stdenv.mkDerivation ({ + version = version + patchSuffix; + + enableParallelBuilding = true; + + patches = + [ + /* No tarballs for stable upstream branch, only https://sourceware.org/git/glibc.git and using git would complicate bootstrapping. + $ git fetch --all -p && git checkout origin/release/2.39/master && git describe + glibc-2.39-5-ge0910f1d32 + $ git show --minimal --reverse glibc-2.39.. > 2.39-master.patch + + To compare the archive contents zdiff can be used. + $ diff -u 2.39-master.patch ../nixpkgs/pkgs/development/libraries/glibc/2.39-master.patch + */ + ./2.39-master.patch + + /* Allow NixOS and Nix to handle the locale-archive. */ + ./nix-locale-archive.patch + + /* Don't use /etc/ld.so.cache, for non-NixOS systems. */ + ./dont-use-system-ld-so-cache.patch + + /* Don't use /etc/ld.so.preload, but /etc/ld-nix.so.preload. */ + ./dont-use-system-ld-so-preload.patch + + /* The command "getconf CS_PATH" returns the default search path + "/bin:/usr/bin", which is inappropriate on NixOS machines. This + patch extends the search path by "/run/current-system/sw/bin". */ + ./fix_path_attribute_in_getconf.patch + + ./fix-x64-abi.patch + + /* https://github.com/NixOS/nixpkgs/pull/137601 */ + ./nix-nss-open-files.patch + + ./0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch + + /* Patch derived from archlinux, + https://gitlab.archlinux.org/archlinux/packaging/packages/glibc/-/blob/e54d98e2d1aae4930ecad9404ef12234922d9dfd/reenable_DT_HASH.patch + + See also https://github.com/ValveSoftware/Proton/issues/6051 + & https://github.com/NixOS/nixpkgs/pull/188492#issuecomment-1233802991 + */ + ./reenable_DT_HASH.patch + ] + /* NVCC does not support ARM intrinsics. Since is pulled in by almost + every HPC piece of software, without this patch CUDA compilation on ARM + is effectively broken. See + https://forums.developer.nvidia.com/t/nvcc-fails-to-build-with-arm-neon-instructions-cpp-vs-cu/248355/2. + */ + ++ ( + let + isAarch64 = stdenv.buildPlatform.isAarch64 || stdenv.hostPlatform.isAarch64; + isLinux = stdenv.buildPlatform.isLinux || stdenv.hostPlatform.isLinux; + in + lib.optional (isAarch64 && isLinux) ./0001-aarch64-math-vector.h-add-NVCC-include-guard.patch + ) + ++ lib.optional stdenv.hostPlatform.isMusl ./fix-rpc-types-musl-conflicts.patch + ++ lib.optional stdenv.buildPlatform.isDarwin ./darwin-cross-build.patch; + + postPatch = + '' + # Needed for glibc to build with the gnumake 3.82 + # http://comments.gmane.org/gmane.linux.lfs.support/31227 + sed -i 's/ot \$/ot:\n\ttouch $@\n$/' manual/Makefile + + # nscd needs libgcc, and we don't want it dynamically linked + # because we don't want it to depend on bootstrap-tools libs. + echo "LDFLAGS-nscd += -static-libgcc" >> nscd/Makefile + + # Ensure that `__nss_files_fopen` can still be wrapped by `libredirect`. + sed -i -e '/libc_hidden_def (__nss_files_fopen)/d' nss/nss_files_fopen.c + sed -i -e '/libc_hidden_proto (__nss_files_fopen)/d' include/nss_files.h + '' + # FIXME: find a solution for infinite recursion in cross builds. + # For now it's hopefully acceptable that IDN from libc doesn't reliably work. + + lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) '' + + # Ensure that libidn2 is found. + patch -p 1 < config.cache << "EOF" + libc_cv_forced_unwind=yes + libc_cv_c_cleanup=yes + libc_cv_gnu89_inline=yes + EOF + + # ./configure has logic like + # + # AR=`$CC -print-prog-name=ar` + # + # This searches various directories in the gcc and its wrapper. In nixpkgs, + # this returns the bare string "ar", which is build ar. This can result as + # a build failure with the following message: + # + # libc_pic.a: error adding symbols: archive has no index; run ranlib to add one + # + # (Observed cross compiling from aarch64-linux -> armv7l-linux). + # + # Nixpkgs passes a correct value for AR and friends, so to use the correct + # set of tools, we only need to delete this special handling. + sed -i \ + -e '/^AR=/d' \ + -e '/^AS=/d' \ + -e '/^LD=/d' \ + -e '/^OBJCOPY=/d' \ + -e '/^OBJDUMP=/d' \ + $configureScript + ''; + + preBuild = lib.optionalString withGd "unset NIX_DONT_SET_RPATH"; + + doCheck = false; # fails + + meta = with lib; { + homepage = "https://www.gnu.org/software/libc/"; + description = "The GNU C Library"; + + longDescription = + '' Any Unix-like operating system needs a C library: the library which + defines the "system calls" and other basic facilities such as + open, malloc, printf, exit... + + The GNU C library is used as the C library in the GNU system and + most systems with the Linux kernel. + ''; + + license = licenses.lgpl2Plus; + + maintainers = with maintainers; [ eelco ma27 connorbaker ]; + platforms = platforms.linux; + } // (args.meta or {}); +}) diff --git a/pkgs/by-name/gl/glibc/darwin-cross-build.patch b/pkgs/by-name/gl/glibc/darwin-cross-build.patch new file mode 100644 index 0000000..b746e63 --- /dev/null +++ b/pkgs/by-name/gl/glibc/darwin-cross-build.patch @@ -0,0 +1,77 @@ +enable cross-compilation of glibc on Darwin (build=Darwin, host=Linux) +* increase ulimit for open files: macOS default of 256 is too low for glibc build system +* use host version of ar, which is given by environment variable +* build system uses stamp.os and stamp.oS files, which only differ in case; + this fails on macOS, so replace .oS with .o_S +--- glibc-2.32/Makefile.in 2018-02-01 17:17:18.000000000 +0100 ++++ glibc-2.32/Makefile.in 2020-12-27 18:21:30.000000000 +0100 +@@ -6,9 +6,11 @@ + .PHONY: all install bench + + all .DEFAULT: +- $(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@ ++ ulimit -n 1024; \ ++ $(MAKE) -r AR=$$AR PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@ + + install: ++ ulimit -n 1024; \ + LC_ALL=C; export LC_ALL; \ + $(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@ + +--- glibc-2.32/Makerules 2018-02-01 17:17:18.000000000 +0100 ++++ glibc-2.32/Makerules 2020-12-27 18:21:30.000000000 +0100 +@@ -847,8 +847,8 @@ + ifndef objects + + # Create the stamp$o files to keep the parent makefile happy. +-subdir_lib: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o) +-$(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o): ++subdir_lib: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$(subst .oS,.o_S,$o)) ++$(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$(subst .oS,.o_S,$o)): + $(make-target-directory) + rm -f $@; > $@ + else +@@ -859,7 +859,7 @@ + # The parent will then actually add them all to the archive in the + # archive rule, below. + define o-iterator-doit +-$(objpfx)stamp$o: $(o-objects); $$(do-stamp) ++$(objpfx)stamp$(subst .oS,.o_S,$o): $(o-objects); $$(do-stamp) + endef + define do-stamp + $(make-target-directory) +@@ -875,14 +875,14 @@ + # on the stamp files built above. + define o-iterator-doit + $(common-objpfx)$(patsubst %,$(libtype$o),c): \ +- $(subdirs-stamp-o) $(common-objpfx)stamp$o; $$(do-makelib) ++ $(subdirs-stamp-o) $(common-objpfx)stamp$(subst .oS,.o_S,$o); $$(do-makelib) + endef + define do-makelib + cd $(common-objdir) && \ + $(AR) $(CREATE_ARFLAGS) $(@F) `cat $(patsubst $(common-objpfx)%,%,$^)` + endef + subdirs-stamps := $(foreach d,$(subdirs),$(common-objpfx)$d/stamp%) +-subdirs-stamp-o = $(subst %,$o,$(subdirs-stamps)) ++subdirs-stamp-o = $(subst %,$(subst .oS,.o_S,$o),$(subdirs-stamps)) + ifndef subdir + $(subdirs-stamps): subdir_lib; + endif +@@ -893,7 +893,7 @@ + # This makes all the object files. + .PHONY: objects objs libobjs extra-objs + objects objs: libobjs extra-objs +-libobjs: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o) ++libobjs: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$(subst .oS,.o_S,$o)) + extra-objs: $(addprefix $(objpfx),$(extra-objs)) + + # Canned sequence for building an extra library archive. +@@ -1499,7 +1499,7 @@ + $(rmobjs) + define rmobjs + $(foreach o,$(object-suffixes-for-libc), +--rm -f $(objpfx)stamp$o $(o-objects)) ++-rm -f $(objpfx)stamp$(subst .oS,.o_S,$o) $(o-objects)) + endef + + # Also remove the dependencies and generated source files. diff --git a/pkgs/by-name/gl/glibc/default.nix b/pkgs/by-name/gl/glibc/default.nix new file mode 100644 index 0000000..3f73314 --- /dev/null +++ b/pkgs/by-name/gl/glibc/default.nix @@ -0,0 +1,186 @@ +{ lib, stdenv, callPackage +, withLinuxHeaders ? true +, profilingLibraries ? false +, withGd ? false +, pkgsBuildBuild +, libgcc +}: + +let + gdCflags = [ + "-Wno-error=stringop-truncation" + "-Wno-error=missing-attributes" + "-Wno-error=array-bounds" + ]; +in + +(callPackage ./common.nix { inherit stdenv; } { + inherit withLinuxHeaders withGd profilingLibraries; + pname = "glibc" + lib.optionalString withGd "-gd" + lib.optionalString (stdenv.cc.isGNU && libgcc==null) "-nolibgcc"; +}).overrideAttrs(previousAttrs: { + + # Note: + # Things you write here override, and do not add to, + # the values in `common.nix`. + # (For example, if you define `patches = [...]` here, it will + # override the patches in `common.nix` -- so instead you should + # write `patches = (previousAttrs.patches or []) ++ [ ... ]`. + + NIX_NO_SELF_RPATH = true; + + postConfigure = '' + # Hack: get rid of the `-static' flag set by the bootstrap stdenv. + # This has to be done *after* `configure' because it builds some + # test binaries. + export NIX_CFLAGS_LINK= + export NIX_LDFLAGS_BEFORE= + + export NIX_DONT_SET_RPATH=1 + unset CFLAGS + + # Apparently --bindir is not respected. + makeFlagsArray+=("bindir=$bin/bin" "sbindir=$bin/sbin" "rootsbindir=$bin/sbin") + '' + lib.optionalString stdenv.buildPlatform.isDarwin '' + # ld-wrapper will otherwise attempt to inject CoreFoundation into ld-linux's RUNPATH + export NIX_COREFOUNDATION_RPATH= + ''; + + # The pie, stackprotector and fortify hardening flags are autodetected by + # glibc and enabled by default if supported. Setting it for every gcc + # invocation does not work. + hardeningDisable = [ "fortify" "pie" "stackprotector" ]; + + env = (previousAttrs.env or { }) // { + NIX_CFLAGS_COMPILE = (previousAttrs.env.NIX_CFLAGS_COMPILE or "") + lib.concatStringsSep " " + (builtins.concatLists [ + (lib.optionals withGd gdCflags) + # Fix -Werror build failure when building glibc with musl with GCC >= 8, see: + # https://github.com/NixOS/nixpkgs/pull/68244#issuecomment-544307798 + (lib.optional stdenv.hostPlatform.isMusl "-Wno-error=attribute-alias") + (lib.optionals ((stdenv.hostPlatform != stdenv.buildPlatform) || stdenv.hostPlatform.isMusl) [ + # Ignore "error: '__EI___errno_location' specifies less restrictive attributes than its target '__errno_location'" + # New warning as of GCC 9 + # Same for musl: https://github.com/NixOS/nixpkgs/issues/78805 + "-Wno-error=missing-attributes" + ]) + (lib.optionals (stdenv.hostPlatform.isPower64) [ + # Do not complain about the Processor Specific ABI (i.e. the + # choice to use IEEE-standard `long double`). We pass this + # flag in order to mute a `-Werror=psabi` passed by glibc; + # hopefully future glibc releases will not pass that flag. + "-Wno-error=psabi" + ]) + ]); + }; + + # glibc needs to `dlopen()` `libgcc_s.so` but does not link + # against it. Furthermore, glibc doesn't use the ordinary + # `dlopen()` call to do this; instead it uses one which ignores + # most paths: + # + # https://sourceware.org/legacy-ml/libc-help/2013-11/msg00026.html + # + # In order to get it to not ignore `libgcc_s.so`, we have to add its path to + # `user-defined-trusted-dirs`: + # + # https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/Makefile;h=b509b3eada1fb77bf81e2a0ca5740b94ad185764#l1355 + # + # Conveniently, this will also inform Nix of the fact that glibc depends on + # gcc.libgcc, since the path will be embedded in the resulting binary. + # + makeFlags = + (previousAttrs.makeFlags or []) + ++ lib.optionals (libgcc != null) [ + "user-defined-trusted-dirs=${libgcc}/lib" + ]; + + postInstall = previousAttrs.postInstall + (if stdenv.buildPlatform.canExecute stdenv.hostPlatform then '' + echo SUPPORTED-LOCALES=C.UTF-8/UTF-8 > ../glibc-2*/localedata/SUPPORTED + make -j''${NIX_BUILD_CORES:-1} localedata/install-locales + '' else lib.optionalString stdenv.buildPlatform.isLinux + # This is based on http://www.linuxfromscratch.org/lfs/view/development/chapter06/glibc.html + # Instead of using their patch to build a build-native localedef, + # we simply use the one from pkgsBuildBuild. + # + # Note that we can't use pkgsBuildHost (aka buildPackages) here, because + # that will cause an eval-time infinite recursion: "buildPackages.glibc + # depended on buildPackages.libgcc, which, since it's GCC, depends on the + # target's bintools, which depend on the target's glibc, which, again, + # depends on buildPackages.glibc, causing an infinute recursion when + # evaluating buildPackages.glibc when glibc hasn't come from stdenv + # (e.g. on musl)." https://github.com/NixOS/nixpkgs/pull/259964 + '' + pushd ../glibc-2*/localedata + export I18NPATH=$PWD GCONV_PATH=$PWD/../iconvdata + mkdir -p $NIX_BUILD_TOP/${pkgsBuildBuild.glibc}/lib/locale + ${lib.getBin pkgsBuildBuild.glibc}/bin/localedef \ + --alias-file=../intl/locale.alias \ + -i locales/C \ + -f charmaps/UTF-8 \ + --prefix $NIX_BUILD_TOP \ + ${if stdenv.hostPlatform.parsed.cpu.significantByte.name == "littleEndian" then + "--little-endian" + else + "--big-endian"} \ + C.UTF-8 + cp -r $NIX_BUILD_TOP/${pkgsBuildBuild.glibc}/lib/locale $out/lib + popd + '') + '' + + test -f $out/etc/ld.so.cache && rm $out/etc/ld.so.cache + + if test -n "$linuxHeaders"; then + # Include the Linux kernel headers in Glibc, except the `scsi' + # subdirectory, which Glibc provides itself. + (cd $dev/include && \ + ln -sv $(ls -d $linuxHeaders/include/* | grep -v scsi\$) .) + fi + + # Fix for NIXOS-54 (ldd not working on x86_64). Make a symlink + # "lib64" to "lib". + if test -n "$is64bit"; then + ln -s lib $out/lib64 + fi + + # Get rid of more unnecessary stuff. + rm -rf $out/var $bin/bin/sln + + # Backwards-compatibility to fix e.g. + # "configure: error: Pthreads are required to build libgomp" during `gcc`-build + # because it's not actually needed anymore to link against `pthreads` since + # it's now part of `libc.so.6` itself, but the gcc build breaks if + # this doesn't work. + ln -sf $out/lib/libpthread.so.0 $out/lib/libpthread.so + ln -sf $out/lib/librt.so.1 $out/lib/librt.so + ln -sf $out/lib/libdl.so.2 $out/lib/libdl.so + test -f $out/lib/libutil.so.1 && ln -sf $out/lib/libutil.so.1 $out/lib/libutil.so + touch $out/lib/libpthread.a + + # Put libraries for static linking in a separate output. Note + # that libc_nonshared.a and libpthread_nonshared.a are required + # for dynamically-linked applications. + mkdir -p $static/lib + mv $out/lib/*.a $static/lib + mv $static/lib/lib*_nonshared.a $out/lib + # If libutil.so.1 is missing, libutil.a is required. + test -f $out/lib/libutil.so.1 || mv $static/lib/libutil.a $out/lib + # Some of *.a files are linker scripts where moving broke the paths. + sed "/^GROUP/s|$out/lib/lib|$static/lib/lib|g" \ + -i "$static"/lib/*.a + + # Work around a Nix bug: hard links across outputs cause a build failure. + cp $bin/bin/getconf $bin/bin/getconf_ + mv $bin/bin/getconf_ $bin/bin/getconf + ''; + + separateDebugInfo = true; + + passthru = + (previousAttrs.passthru or {}) + // lib.optionalAttrs (libgcc != null) { + inherit libgcc; + }; + + meta = (previousAttrs.meta or {}) // { description = "The GNU C Library"; }; +}) + diff --git a/pkgs/by-name/gl/glibc/dont-use-system-ld-so-cache.patch b/pkgs/by-name/gl/glibc/dont-use-system-ld-so-cache.patch new file mode 100644 index 0000000..0e0315a --- /dev/null +++ b/pkgs/by-name/gl/glibc/dont-use-system-ld-so-cache.patch @@ -0,0 +1,64 @@ +diff --git a/elf/Makefile b/elf/Makefile +index 5d666b1b..a5017e9c 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -669,14 +669,14 @@ $(objpfx)sln: $(sln-modules:%=$(objpfx)%.o) + + $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o) + +-SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"' +-CFLAGS-ldconfig.c += $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \ ++PREFIX-FLAGS := -D'PREFIX="$(prefix)"' ++CFLAGS-ldconfig.c += $(PREFIX-FLAGS) -D'LIBDIR="$(libdir)"' \ + -D'SLIBDIR="$(slibdir)"' + libof-ldconfig = ldconfig +-CFLAGS-dl-cache.c += $(SYSCONF-FLAGS) +-CFLAGS-cache.c += $(SYSCONF-FLAGS) +-CFLAGS-rtld.c += $(SYSCONF-FLAGS) +-CFLAGS-dl-usage.c += $(SYSCONF-FLAGS) \ ++CFLAGS-dl-cache.c += $(PREFIX-FLAGS) ++CFLAGS-cache.c += $(PREFIX-FLAGS) ++CFLAGS-rtld.c += $(PREFIX-FLAGS) ++CFLAGS-dl-usage.c += $(PREFIX-FLAGS) \ + -D'RTLD="$(rtlddir)/$(rtld-installed-name)"' + + cpp-srcs-left := $(all-rtld-routines:=.os) +diff --git a/elf/dl-diagnostics.c b/elf/dl-diagnostics.c +index bef224b3..8e166b12 100644 +--- a/elf/dl-diagnostics.c ++++ b/elf/dl-diagnostics.c +@@ -205,7 +205,7 @@ print_paths (void) + { + _dl_diagnostics_print_labeled_string ("path.prefix", PREFIX); + _dl_diagnostics_print_labeled_string ("path.rtld", RTLD); +- _dl_diagnostics_print_labeled_string ("path.sysconfdir", SYSCONFDIR); ++ _dl_diagnostics_print_labeled_string ("path.sysconfdir", PREFIX "/etc"); + + unsigned int index = 0; + static const char *system_dirs = SYSTEM_DIRS "\0"; +diff --git a/elf/ldconfig.c b/elf/ldconfig.c +index 28ed637a..6f07b79a 100644 +--- a/elf/ldconfig.c ++++ b/elf/ldconfig.c +@@ -57,7 +57,7 @@ + #define TLS_HWCAP_BIT 63 + + #ifndef LD_SO_CONF +-# define LD_SO_CONF SYSCONFDIR "/ld.so.conf" ++# define LD_SO_CONF PREFIX "/etc/ld.so.conf" + #endif + + /* Get libc version number. */ +diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h +index 964d50a4..2224d651 100644 +--- a/sysdeps/generic/dl-cache.h ++++ b/sysdeps/generic/dl-cache.h +@@ -35,7 +35,7 @@ + #endif + + #ifndef LD_SO_CACHE +-# define LD_SO_CACHE SYSCONFDIR "/ld.so.cache" ++# define LD_SO_CACHE PREFIX "/etc/ld.so.cache" + #endif + + #ifndef add_system_dir diff --git a/pkgs/by-name/gl/glibc/dont-use-system-ld-so-preload.patch b/pkgs/by-name/gl/glibc/dont-use-system-ld-so-preload.patch new file mode 100644 index 0000000..894e2a1 --- /dev/null +++ b/pkgs/by-name/gl/glibc/dont-use-system-ld-so-preload.patch @@ -0,0 +1,12 @@ +diff -ru glibc-2.20-orig/elf/rtld.c glibc-2.20/elf/rtld.c +--- glibc-2.20-orig/elf/rtld.c 2014-09-07 10:09:09.000000000 +0200 ++++ glibc-2.20/elf/rtld.c 2014-10-27 11:32:25.203043157 +0100 +@@ -1513,7 +1513,7 @@ + open(). So we do this first. If it succeeds we do almost twice + the work but this does not matter, since it is not for production + use. */ +- static const char preload_file[] = "/etc/ld.so.preload"; ++ static const char preload_file[] = "/etc/ld-nix.so.preload"; + if (__glibc_unlikely (__access (preload_file, R_OK) == 0)) + { + /* Read the contents of the file. */ diff --git a/pkgs/by-name/gl/glibc/fix-rpc-types-musl-conflicts.patch b/pkgs/by-name/gl/glibc/fix-rpc-types-musl-conflicts.patch new file mode 100644 index 0000000..19f8bfc --- /dev/null +++ b/pkgs/by-name/gl/glibc/fix-rpc-types-musl-conflicts.patch @@ -0,0 +1,38 @@ +@@ -, +, @@ +--- + sunrpc/rpc/types.h | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) +--- a/sunrpc/rpc/types.h ++++ a/sunrpc/rpc/types.h +@@ -69,24 +69,14 @@ typedef unsigned long rpcport_t; + #include + #endif + +-#if defined __APPLE_CC__ || defined __FreeBSD__ +-# define __u_char_defined +-# define __daddr_t_defined +-#endif +- +-#ifndef __u_char_defined +-typedef __u_char u_char; +-typedef __u_short u_short; +-typedef __u_int u_int; +-typedef __u_long u_long; +-typedef __quad_t quad_t; +-typedef __u_quad_t u_quad_t; +-typedef __fsid_t fsid_t; ++/* IMPORTANT NOTE: This has been modified to build against the musl C ++ * library and it probably now ONLY builds with the musl C library. ++ * ++ * See: https://sourceware.org/bugzilla/show_bug.cgi?id=21604 ++ */ + # define __u_char_defined +-#endif + #ifndef __daddr_t_defined +-typedef __daddr_t daddr_t; +-typedef __caddr_t caddr_t; ++typedef int daddr_t; + # define __daddr_t_defined + #endif + +-- diff --git a/pkgs/by-name/gl/glibc/fix-x64-abi.patch b/pkgs/by-name/gl/glibc/fix-x64-abi.patch new file mode 100644 index 0000000..1d60dcd --- /dev/null +++ b/pkgs/by-name/gl/glibc/fix-x64-abi.patch @@ -0,0 +1,35 @@ +From 3288c6da64add3b4561b8c10fff522027caea01c Mon Sep 17 00:00:00 2001 +From: Nicholas Miell +Date: Sat, 17 Jun 2017 18:21:07 -0700 +Subject: [PATCH] Align the stack on entry to __tls_get_addr() + +Old versions of gcc (4 & 5) didn't align the stack according to the +AMD64 psABI when calling __tls_get_addr(). Apparently new versions of +gcc (7) got much more aggressive about vectorizing and generating MOVAPS +instructions, which means old binaries built with the buggy versions of +gcc are much more likely to crash when using versions of glibc built +using gcc 7. + +For example, a large number of Linux games built using the Unity game +engine and available for purchase on Steam. +--- + elf/dl-tls.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/elf/dl-tls.c b/elf/dl-tls.c +index 5aba33b3fa..3f3cb917de 100644 +--- a/elf/dl-tls.c ++++ b/elf/dl-tls.c +@@ -827,6 +827,10 @@ rtld_hidden_proto (__tls_get_addr) + rtld_hidden_def (__tls_get_addr) + #endif + ++#ifdef __x86_64__ ++/* Old versions of gcc didn't align the stack. */ ++__attribute__((force_align_arg_pointer)) ++#endif + /* The generic dynamic and local dynamic model cannot be used in + statically linked applications. */ + void * +-- +2.13.0 diff --git a/pkgs/by-name/gl/glibc/fix_path_attribute_in_getconf.patch b/pkgs/by-name/gl/glibc/fix_path_attribute_in_getconf.patch new file mode 100644 index 0000000..714e49d --- /dev/null +++ b/pkgs/by-name/gl/glibc/fix_path_attribute_in_getconf.patch @@ -0,0 +1,6 @@ +diff -ubr glibc-2.17-orig/sysdeps/unix/confstr.h glibc-2.17/sysdeps/unix/confstr.h +--- glibc-2.17-orig/sysdeps/unix/confstr.h 2013-06-03 22:01:44.829726968 +0200 ++++ glibc-2.17/sysdeps/unix/confstr.h 2013-06-03 22:04:39.469376740 +0200 +@@ -1 +1 @@ +-#define CS_PATH "/bin:/usr/bin" ++#define CS_PATH "/run/current-system/sw/bin:/bin:/usr/bin" diff --git a/pkgs/by-name/gl/glibc/info.nix b/pkgs/by-name/gl/glibc/info.nix new file mode 100644 index 0000000..d643d8a --- /dev/null +++ b/pkgs/by-name/gl/glibc/info.nix @@ -0,0 +1,23 @@ +{ callPackage, texinfo, perl }: + +callPackage ./common.nix {} { + pname = "glibc-info"; + + outputs = [ "out" ]; + + configureFlags = [ "--enable-add-ons" ]; + + extraNativeBuildInputs = [ texinfo perl ]; + + makeFlags = [ "info" ]; + + # I don't know why the info is not generated in 'build' + # Somehow building the info still does not work, because the final + # libc.info hasn't a Top node. + installPhase = '' + mkdir -p "$out/share/info" + cp -v "manual/"*.info* "$out/share/info" + ''; + + meta.description = "GNU Info manual of the GNU C Library"; +} diff --git a/pkgs/by-name/gl/glibc/locales-builder.sh b/pkgs/by-name/gl/glibc/locales-builder.sh new file mode 100644 index 0000000..27894b0 --- /dev/null +++ b/pkgs/by-name/gl/glibc/locales-builder.sh @@ -0,0 +1,18 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +# Glibc cannot have itself in its RPATH. +export NIX_NO_SELF_RPATH=1 + +source $stdenv/setup + +postConfigure() { + # Hack: get rid of the `-static' flag set by the bootstrap stdenv. + # This has to be done *after* `configure' because it builds some + # test binaries. + export NIX_CFLAGS_LINK= + export NIX_LDFLAGS_BEFORE= + + export NIX_DONT_SET_RPATH=1 + unset CFLAGS +} + +genericBuild diff --git a/pkgs/by-name/gl/glibc/locales.nix b/pkgs/by-name/gl/glibc/locales.nix new file mode 100644 index 0000000..eddeb5e --- /dev/null +++ b/pkgs/by-name/gl/glibc/locales.nix @@ -0,0 +1,86 @@ +/* This function builds just the `lib/locale/locale-archive' file from + Glibc and nothing else. If `allLocales' is true, all supported + locales are included; otherwise, just the locales listed in + `locales'. See localedata/SUPPORTED in the Glibc source tree for + the list of all supported locales: + https://sourceware.org/git/?p=glibc.git;a=blob;f=localedata/SUPPORTED +*/ + +{ lib, stdenv, buildPackages, callPackage, writeText, glibc +, allLocales ? true, locales ? [ "en_US.UTF-8/UTF-8" ] +}: + +(callPackage ./common.nix { inherit stdenv; } { + pname = "glibc-locales"; + extraNativeBuildInputs = [ glibc ]; +}).overrideAttrs(finalAttrs: previousAttrs: { + + builder = ./locales-builder.sh; + + outputs = [ "out" ]; + + LOCALEDEF_FLAGS = [ + (if stdenv.hostPlatform.isLittleEndian + then "--little-endian" + else "--big-endian") + ]; + + preBuild = (previousAttrs.preBuild or "") + '' + # Awful hack: `localedef' doesn't allow the path to `locale-archive' + # to be overriden, but you *can* specify a prefix, i.e. it will use + # //lib/locale/locale-archive. So we use + # $TMPDIR as a prefix, meaning that the locale-archive is placed in + # $TMPDIR/nix/store/...-glibc-.../lib/locale/locale-archive. + LOCALEDEF_FLAGS+=" --prefix=$TMPDIR" + + mkdir -p $TMPDIR/"${buildPackages.glibc.out}/lib/locale" + + echo 'C.UTF-8/UTF-8 \' >> ../glibc-2*/localedata/SUPPORTED + + # Hack to allow building of the locales (needed since glibc-2.12) + sed -i -e 's,^$(rtld-prefix) $(common-objpfx)locale/localedef,localedef $(LOCALEDEF_FLAGS),' ../glibc-2*/localedata/Makefile + '' + + lib.optionalString (!allLocales) '' + # Check that all locales to be built are supported + echo -n '${lib.concatMapStrings (s: s + " \\\n") locales}' \ + | sort -u > locales-to-build.txt + cat ../glibc-2*/localedata/SUPPORTED | grep ' \\' \ + | sort -u > locales-supported.txt + comm -13 locales-supported.txt locales-to-build.txt \ + > locales-unsupported.txt + if [[ $(wc -c locales-unsupported.txt) != "0 locales-unsupported.txt" ]]; then + cat locales-supported.txt + echo "Error: unsupported locales detected:" + cat locales-unsupported.txt + echo "You should choose from the list above the error." + false + fi + + echo SUPPORTED-LOCALES='${toString locales}' > ../glibc-2*/localedata/SUPPORTED + ''; + + # Current `nixpkgs` way of building locales is not compatible with + # parallel install. `locale-archive` is updated in parallel with + # multiple `localedef` processes and causes non-deterministic result: + # https://github.com/NixOS/nixpkgs/issues/245360 + enableParallelBuilding = false; + + makeFlags = (previousAttrs.makeFlags or []) ++ [ + "localedata/install-locales" + "localedir=${builtins.placeholder "out"}/lib/locale" + ]; + + installPhase = + '' + mkdir -p "$out/lib/locale" "$out/share/i18n" + cp -v "$TMPDIR/$NIX_STORE/"*"/lib/locale/locale-archive" "$out/lib/locale" + cp -v ../glibc-2*/localedata/SUPPORTED "$out/share/i18n/SUPPORTED" + ''; + + setupHook = writeText "locales-setup-hook.sh" + '' + export LOCALE_ARCHIVE=@out@/lib/locale/locale-archive + ''; + + meta.description = "Locale information for the GNU C Library"; +}) diff --git a/pkgs/by-name/gl/glibc/mtrace.nix b/pkgs/by-name/gl/glibc/mtrace.nix new file mode 100644 index 0000000..926c0d9 --- /dev/null +++ b/pkgs/by-name/gl/glibc/mtrace.nix @@ -0,0 +1,41 @@ +{ glibc, perl }: + +# Small wrapper which only exposes `mtrace(3)` from `glibc`. This can't be placed +# into `glibc` itself because it depends on Perl which would mean that the final +# `glibc` inside a stdenv bootstrap has a dependency `glibc -> perl -> bootstrap tools`, +# so this is now in its own package that isn't used for bootstrapping. +# +# `glibc` needs to be overridden here because it's still needed to `./configure` the source in order +# to have a build environment where we can call the needed make target. + +glibc.overrideAttrs (oldAttrs: { + pname = "glibc-mtrace"; + + buildPhase = '' + runHook preBuild + + mkdir malloc + make -C ../glibc-${glibc.minorRelease}/malloc objdir=`pwd` `pwd`/malloc/mtrace; + + runHook postBuild + ''; + + installPhase = '' + mkdir -p $out/bin + mv malloc/mtrace $out/bin/ + ''; + + # Perl checked during configure + nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ perl ]; + # Perl shebang used for `mtrace`. + buildInputs = oldAttrs.buildInputs ++ [ perl ]; + + # Reset a few things declared by `pkgs.glibc`. + outputs = [ "out" ]; + separateDebugInfo = false; + + meta = oldAttrs.meta // { + description = "Perl script used to interpret and provide human readable output of the trace log contained in the file mtracedata, whose contents were produced by mtrace(3)."; + mainProgram = "mtrace"; + }; +}) diff --git a/pkgs/by-name/gl/glibc/multi.nix b/pkgs/by-name/gl/glibc/multi.nix new file mode 100644 index 0000000..5cd4895 --- /dev/null +++ b/pkgs/by-name/gl/glibc/multi.nix @@ -0,0 +1,38 @@ +{ lib +, runCommand, glibc, glibc32 +}: + +let + nameVersion = builtins.parseDrvName glibc.name; + glibc64 = glibc; +in +runCommand "${nameVersion.name}-multi-${nameVersion.version}" + # out as the first output is an exception exclusive to glibc + { + outputs = [ "out" "bin" "dev" ]; # TODO: no static version here (yet) + passthru = { + libgcc = lib.lists.filter (x: x!=null) [ + (glibc64.libgcc or null) + (glibc32.libgcc or null) + ]; + }; + } + '' + mkdir -p "$out/lib" + ln -s '${glibc64.out}'/lib/* "$out/lib" + ln -s '${glibc32.out}/lib' "$out/lib/32" + ln -s lib "$out/lib64" + + # fixing ldd RLTDLIST + mkdir -p "$bin/bin" + cp -s '${glibc64.bin}'/bin/* "$bin/bin/" + rm "$bin/bin/ldd" + sed -e "s|^RTLDLIST=.*$|RTLDLIST=\"$out/lib/ld-linux-x86-64.so.2 $out/lib/32/ld-linux.so.2\"|g" \ + '${glibc64.bin}/bin/ldd' > "$bin/bin/ldd" + chmod +x "$bin/bin/ldd" + + mkdir "$dev" + cp -rs '${glibc32.dev}'/include "$dev/" + chmod +w -R "$dev" + cp -rsf '${glibc64.dev}'/include "$dev/" + '' diff --git a/pkgs/by-name/gl/glibc/nix-locale-archive.patch b/pkgs/by-name/gl/glibc/nix-locale-archive.patch new file mode 100644 index 0000000..2fedf2a --- /dev/null +++ b/pkgs/by-name/gl/glibc/nix-locale-archive.patch @@ -0,0 +1,121 @@ +diff --git a/locale/loadarchive.c b/locale/loadarchive.c +index 512769eaec..171dbb4ad9 100644 +--- a/locale/loadarchive.c ++++ b/locale/loadarchive.c +@@ -123,6 +123,23 @@ calculate_head_size (const struct locarhead *h) + return MAX (namehash_end, MAX (string_end, locrectab_end)); + } + ++static int ++open_locale_archive (void) ++{ ++ int fd = -1; ++ char *versioned_path = getenv ("LOCALE_ARCHIVE_2_27"); ++ char *path = getenv ("LOCALE_ARCHIVE"); ++ if (versioned_path) ++ fd = __open_nocancel (versioned_path, O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ if (path && fd < 0) ++ fd = __open_nocancel (path, O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ if (fd < 0) ++ fd = __open_nocancel (archfname, O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ if (fd < 0) ++ fd = __open_nocancel ("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ return fd; ++} ++ + + /* Find the locale *NAMEP in the locale archive, and return the + internalized data structure for its CATEGORY data. If this locale has +@@ -202,7 +219,7 @@ _nl_load_locale_from_archive (int category, const char **namep) + archmapped = &headmap; + + /* The archive has never been opened. */ +- fd = __open_nocancel (archfname, O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ fd = open_locale_archive (); + if (fd < 0) + /* Cannot open the archive, for whatever reason. */ + return NULL; +@@ -397,8 +414,7 @@ _nl_load_locale_from_archive (int category, const char **namep) + if (fd == -1) + { + struct __stat64_t64 st; +- fd = __open_nocancel (archfname, +- O_RDONLY|O_LARGEFILE|O_CLOEXEC); ++ fd = open_locale_archive(); + if (fd == -1) + /* Cannot open the archive, for whatever reason. */ + return NULL; +diff --git a/locale/programs/locale.c b/locale/programs/locale.c +index ca0a95be99..e484783402 100644 +--- a/locale/programs/locale.c ++++ b/locale/programs/locale.c +@@ -633,6 +633,24 @@ nameentcmp (const void *a, const void *b) + } + + ++static int ++open_locale_archive (void) ++{ ++ int fd = -1; ++ char *versioned_path = getenv ("LOCALE_ARCHIVE_2_27"); ++ char *path = getenv ("LOCALE_ARCHIVE"); ++ if (versioned_path) ++ fd = open64 (versioned_path, O_RDONLY); ++ if (path && fd < 0) ++ fd = open64 (path, O_RDONLY); ++ if (fd < 0) ++ fd = open64 (ARCHIVE_NAME, O_RDONLY); ++ if (fd < 0) ++ fd = open64 ("/usr/lib/locale/locale-archive", O_RDONLY); ++ return fd; ++} ++ ++ + static int + write_archive_locales (void **all_datap, char *linebuf) + { +@@ -645,7 +663,7 @@ write_archive_locales (void **all_datap, char *linebuf) + int fd, ret = 0; + uint32_t cnt; + +- fd = open64 (ARCHIVE_NAME, O_RDONLY); ++ fd = open_locale_archive (); + if (fd < 0) + return 0; + +diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c +index f38e835c52..779a3199fc 100644 +--- a/locale/programs/locarchive.c ++++ b/locale/programs/locarchive.c +@@ -117,6 +117,22 @@ prepare_address_space (int fd, size_t total, size_t *reserved, int *xflags, + } + + ++static int ++open_locale_archive (const char * archivefname, int flags) ++{ ++ int fd = -1; ++ char *versioned_path = getenv ("LOCALE_ARCHIVE_2_27"); ++ char *path = getenv ("LOCALE_ARCHIVE"); ++ if (versioned_path) ++ fd = open64 (versioned_path, flags); ++ if (path && fd < 0) ++ fd = open64 (path, flags); ++ if (fd < 0) ++ fd = open64 (archivefname, flags); ++ return fd; ++} ++ ++ + static void + create_archive (const char *archivefname, struct locarhandle *ah) + { +@@ -578,7 +594,7 @@ open_archive (struct locarhandle *ah, bool readonly) + while (1) + { + /* Open the archive. We must have exclusive write access. */ +- fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR); ++ fd = open_locale_archive (archivefname, readonly ? O_RDONLY : O_RDWR); + if (fd == -1) + { + /* Maybe the file does not yet exist? If we are opening diff --git a/pkgs/by-name/gl/glibc/nix-nss-open-files.patch b/pkgs/by-name/gl/glibc/nix-nss-open-files.patch new file mode 100644 index 0000000..9a515c4 --- /dev/null +++ b/pkgs/by-name/gl/glibc/nix-nss-open-files.patch @@ -0,0 +1,51 @@ +diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c +index 1db9e46127..3a567e0224 100644 +--- a/nss/nss_files/files-XXX.c ++++ b/nss/nss_files/files-XXX.c +@@ -75,8 +75,20 @@ internal_setent (FILE **stream) + + if (*stream == NULL) + { +- *stream = __nss_files_fopen (DATAFILE); +- ++ const char *file = DATAFILE; ++ ++ #ifdef NIX_DATAFILE ++ // use the Nix environment variable such as `NIX_ETC_PROTOCOLS` ++ char *path = secure_getenv (NIX_DATAFILE); ++ ++ // if the environment variable is set, then read from the /nix/store entry instead ++ if (path && path[0]) { ++ file = path; ++ } ++ #endif ++ ++ *stream = __nss_files_fopen (file); ++ + if (*stream == NULL) + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + } +diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c +index c30bedc0aa..b321e68d3c 100644 +--- a/nss/nss_files/files-proto.c ++++ b/nss/nss_files/files-proto.c +@@ -23,6 +23,7 @@ NSS_DECLARE_MODULE_FUNCTIONS (files) + + #define ENTNAME protoent + #define DATABASE "protocols" ++#define NIX_DATAFILE "NIX_ETC_PROTOCOLS" + + struct protoent_data {}; + +diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c +index bfc2590699..0bff36aee5 100644 +--- a/nss/nss_files/files-service.c ++++ b/nss/nss_files/files-service.c +@@ -24,6 +24,7 @@ NSS_DECLARE_MODULE_FUNCTIONS (files) + + #define ENTNAME servent + #define DATABASE "services" ++#define NIX_DATAFILE "NIX_ETC_SERVICES" + + struct servent_data {}; + diff --git a/pkgs/by-name/gl/glibc/packages.nix b/pkgs/by-name/gl/glibc/packages.nix new file mode 100644 index 0000000..dc55236 --- /dev/null +++ b/pkgs/by-name/gl/glibc/packages.nix @@ -0,0 +1,47 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + glibc = callPackage ./. { + stdenv = gccStdenv; # doesn't compile without gcc + }; + + mtrace = callPackage ./mtrace.nix { }; + + glibc_memusage = callPackage ./. { + withGd = true; + }; + + # Being redundant to avoid cycles on boot. TODO: find a better way + glibcCross = callPackage ./. { + stdenv = gccCrossLibcStdenv; # doesn't compile without gcc + # TODO: Fix broken reference to libgcc + # libgcc = callPackage ../core/gcc/libgcc { + # gcc = gccCrossLibcStdenv.cc; + # glibc = glibcCross.override { libgcc = null; }; + # stdenvNoLibs = gccCrossLibcStdenv; + # }; + }; + + # Only supported on Linux and only on glibc + glibcLocales = + if stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isGnu + then callPackage ./locales.nix { } + else null; + glibcLocalesUtf8 = + if stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isGnu + then callPackage ./locales.nix { allLocales = false; } + else null; + + glibcInfo = callPackage ./info.nix { }; + + glibc_multi = callPackage ./multi.nix { + # The buildPackages is required for cross-compilation. The pkgsi686Linux set + # has target and host always set to the same value based on target platform + # of the current set. We need host to be same as build to correctly get i686 + # variant of glibc. + glibc32 = pkgsi686Linux.buildPackages.glibc; + }; + +} diff --git a/pkgs/by-name/gl/glibc/reenable_DT_HASH.patch b/pkgs/by-name/gl/glibc/reenable_DT_HASH.patch new file mode 100644 index 0000000..87a2329 --- /dev/null +++ b/pkgs/by-name/gl/glibc/reenable_DT_HASH.patch @@ -0,0 +1,28 @@ +From 31915e55f9c34f6137ab1c5ac002375a2d5d4589 Mon Sep 17 00:00:00 2001 +From: Frederik Schwan +Date: Fri, 4 Aug 2023 15:19:57 +0200 +Subject: [PATCH] force --hash-style=both to keep compatibility with old niche + software + +--- + Makeconfig | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/Makeconfig b/Makeconfig +index 77d7fd14df..2ae67c4beb 100644 +--- a/Makeconfig ++++ b/Makeconfig +@@ -378,6 +378,10 @@ relro-LDFLAGS = -Wl,-z,relro + LDFLAGS.so += $(relro-LDFLAGS) + LDFLAGS-rtld += $(relro-LDFLAGS) + ++hashstyle-LDFLAGS = -Wl,--hash-style=both ++LDFLAGS.so += $(hashstyle-LDFLAGS) ++LDFLAGS-rtld += $(hashstyle-LDFLAGS) ++ + # Linker options to enable and disable DT_RELR. + ifeq ($(have-dt-relr),yes) + dt-relr-ldflag = -Wl,-z,pack-relative-relocs +-- +2.41.0 + diff --git a/pkgs/by-name/gm/gmp/4.3.2.nix b/pkgs/by-name/gm/gmp/4.3.2.nix new file mode 100644 index 0000000..e809ed9 --- /dev/null +++ b/pkgs/by-name/gm/gmp/4.3.2.nix @@ -0,0 +1,78 @@ +{ lib, stdenv, fetchurl, m4, cxx ? true }: + +let self = stdenv.mkDerivation rec { + pname = "gmp"; + version = "4.3.2"; + + src = fetchurl { + url = "mirror://gnu/gmp/gmp-${version}.tar.bz2"; + sha256 = "0x8prpqi9amfcmi7r4zrza609ai9529pjaq0h4aw51i867064qck"; + }; + + #outputs TODO: split $cxx due to libstdc++ dependency + # maybe let ghc use a version with *.so shared with rest of nixpkgs and *.a added + # - see #5855 for related discussion + outputs = [ "out" "dev" "info" ]; + passthru.static = self.out; + + nativeBuildInputs = [ m4 ]; + + # Prevent the build system from using sub-architecture-specific + # instructions (e.g., SSE2 on i686). + # + # This is not a problem for Apple machines, which are all alike. In + # addition, `configfsf.guess' would return `i386-apple-darwin10.2.0' on + # `x86_64-darwin', leading to a 32-bit ABI build, which is undesirable. + preConfigure = + if !stdenv.isDarwin + then "ln -sf configfsf.guess config.guess" + else ''echo "Darwin host is `./config.guess`."''; + + configureFlags = [ + (lib.enableFeature cxx "cxx") + ] ++ lib.optionals stdenv.isDarwin [ + "ac_cv_build=x86_64-apple-darwin13.4.0" + "ac_cv_host=x86_64-apple-darwin13.4.0" + ]; + + # The test t-lucnum_ui fails (on Linux/x86_64) when built with GCC 4.8. + # Newer versions of GMP don't have that issue anymore. + doCheck = false; + + meta = { + branch = "4"; + description = "GNU multiple precision arithmetic library"; + + longDescription = + '' GMP is a free library for arbitrary precision arithmetic, operating + on signed integers, rational numbers, and floating point numbers. + There is no practical limit to the precision except the ones implied + by the available memory in the machine GMP runs on. GMP has a rich + set of functions, and the functions have a regular interface. + + The main target applications for GMP are cryptography applications + and research, Internet security applications, algebra systems, + computational algebra research, etc. + + GMP is carefully designed to be as fast as possible, both for small + operands and for huge operands. The speed is achieved by using + fullwords as the basic arithmetic type, by using fast algorithms, + with highly optimised assembly code for the most common inner loops + for a lot of CPUs, and by a general emphasis on speed. + + GMP is faster than any other bignum library. The advantage for GMP + increases with the operand sizes for many operations, since GMP uses + asymptotically faster algorithms. + ''; + + homepage = "https://gmplib.org/"; + license = lib.licenses.lgpl3Plus; + + maintainers = [ ]; + platforms = lib.platforms.all; + badPlatforms = [ "x86_64-darwin" ]; + # never built on aarch64-darwin, aarch64-linux since first introduction in nixpkgs + broken = (stdenv.isDarwin && stdenv.isAarch64) || (stdenv.isLinux && stdenv.isAarch64); + }; +}; + in self diff --git a/pkgs/by-name/gm/gmp/5.1.3-CVE-2021-43618.patch b/pkgs/by-name/gm/gmp/5.1.3-CVE-2021-43618.patch new file mode 100644 index 0000000..13b9bc5 --- /dev/null +++ b/pkgs/by-name/gm/gmp/5.1.3-CVE-2021-43618.patch @@ -0,0 +1,20 @@ +Based on https://gmplib.org/repo/gmp-6.2/raw-rev/561a9c25298e, +adapted for 5.x by ris + +diff -r e1fd9db13b47 -r 561a9c25298e mpz/inp_raw.c +--- a/mpz/inp_raw.c Tue Dec 22 23:49:51 2020 +0100 ++++ b/mpz/inp_raw.c Thu Oct 21 19:06:49 2021 +0200 +@@ -81,8 +81,11 @@ + + abs_csize = ABS (csize); + ++ if (UNLIKELY (abs_csize > ~(mp_bitcnt_t) 0 / 8)) ++ return 0; /* Bit size overflows */ ++ + /* round up to a multiple of limbs */ +- abs_xsize = (abs_csize*8 + GMP_NUMB_BITS-1) / GMP_NUMB_BITS; ++ abs_xsize = ((mp_bitcnt_t)abs_csize*8 + GMP_NUMB_BITS-1) / GMP_NUMB_BITS; + + if (abs_xsize != 0) + { + diff --git a/pkgs/by-name/gm/gmp/5.1.x.nix b/pkgs/by-name/gm/gmp/5.1.x.nix new file mode 100644 index 0000000..e4fb89d --- /dev/null +++ b/pkgs/by-name/gm/gmp/5.1.x.nix @@ -0,0 +1,87 @@ +{ lib, stdenv, fetchurl, m4 +, cxx ? true +, withStatic ? stdenv.hostPlatform.isStatic +}: + +let inherit (lib) optional; in + +let self = stdenv.mkDerivation rec { + pname = "gmp"; + version = "5.1.3"; + + src = fetchurl { # we need to use bz2, others aren't in bootstrapping stdenv + urls = [ "mirror://gnu/gmp/gmp-${version}.tar.bz2" "ftp://ftp.gmplib.org/pub/gmp-${version}/gmp-${version}.tar.bz2" ]; + sha256 = "0q5i39pxrasgn9qdxzpfbwhh11ph80p57x6hf48m74261d97j83m"; + }; + + #outputs TODO: split $cxx due to libstdc++ dependency + # maybe let ghc use a version with *.so shared with rest of nixpkgs and *.a added + # - see #5855 for related discussion + outputs = [ "out" "dev" "info" ]; + passthru.static = self.out; + + nativeBuildInputs = [ m4 ]; + + patches = [ + ./5.1.3-CVE-2021-43618.patch + ] ++ lib.optionals stdenv.isDarwin [ + ./need-size-t.patch + ]; + + configureFlags = [ + "--with-pic" + (lib.enableFeature cxx "cxx") + # Build a "fat binary", with routines for several sub-architectures + # (x86), except on Solaris where some tests crash with "Memory fault". + # See , for instance. + # + # no darwin because gmp uses ASM that clang doesn't like + (lib.enableFeature (!stdenv.isSunOS && stdenv.hostPlatform.isx86) "fat") + # The config.guess in GMP tries to runtime-detect various + # ARM optimization flags via /proc/cpuinfo (and is also + # broken on multicore CPUs). Avoid this impurity. + "--build=${stdenv.buildPlatform.config}" + ] ++ optional (cxx && stdenv.isDarwin) "CPPFLAGS=-fexceptions" + ++ optional (stdenv.isDarwin && stdenv.is64bit) "ABI=64" + ; + + doCheck = true; + + dontDisableStatic = withStatic; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://gmplib.org/"; + description = "GNU multiple precision arithmetic library"; + license = licenses.gpl3Plus; + + longDescription = + '' GMP is a free library for arbitrary precision arithmetic, operating + on signed integers, rational numbers, and floating point numbers. + There is no practical limit to the precision except the ones implied + by the available memory in the machine GMP runs on. GMP has a rich + set of functions, and the functions have a regular interface. + + The main target applications for GMP are cryptography applications + and research, Internet security applications, algebra systems, + computational algebra research, etc. + + GMP is carefully designed to be as fast as possible, both for small + operands and for huge operands. The speed is achieved by using + fullwords as the basic arithmetic type, by using fast algorithms, + with highly optimised assembly code for the most common inner loops + for a lot of CPUs, and by a general emphasis on speed. + + GMP is faster than any other bignum library. The advantage for GMP + increases with the operand sizes for many operations, since GMP uses + asymptotically faster algorithms. + ''; + + platforms = platforms.all; + badPlatforms = [ "x86_64-darwin" ]; + # never built on aarch64-darwin since first introduction in nixpkgs + broken = stdenv.isDarwin && stdenv.isAarch64; + }; +}; + in self diff --git a/pkgs/by-name/gm/gmp/6.x.nix b/pkgs/by-name/gm/gmp/6.x.nix new file mode 100644 index 0000000..4487424 --- /dev/null +++ b/pkgs/by-name/gm/gmp/6.x.nix @@ -0,0 +1,93 @@ +{ lib, stdenv, fetchurl, m4 +, cxx ? !stdenv.hostPlatform.useAndroidPrebuilt && !stdenv.hostPlatform.isWasm +, buildPackages +, withStatic ? stdenv.hostPlatform.isStatic +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let inherit (lib) optional; in + +let self = stdenv.mkDerivation rec { + pname = "gmp${lib.optionalString cxx "-with-cxx"}"; + version = "6.3.0"; + + src = fetchurl { # we need to use bz2, others aren't in bootstrapping stdenv + urls = [ "mirror://gnu/gmp/gmp-${version}.tar.bz2" "ftp://ftp.gmplib.org/pub/gmp-${version}/gmp-${version}.tar.bz2" ]; + hash = "sha256-rCghGnz7YJuuLiyNYFjWbI/pZDT3QM9v4uR7AA0cIMs="; + }; + + #outputs TODO: split $cxx due to libstdc++ dependency + # maybe let ghc use a version with *.so shared with rest of nixpkgs and *.a added + # - see #5855 for related discussion + outputs = [ "out" "dev" "info" ]; + passthru.static = self.out; + + strictDeps = true; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ m4 ]; + + configureFlags = [ + "--with-pic" + (lib.enableFeature cxx "cxx") + # Build a "fat binary", with routines for several sub-architectures + # (x86), except on Solaris where some tests crash with "Memory fault". + # See , for instance. + # + # no darwin because gmp uses ASM that clang doesn't like + (lib.enableFeature (!stdenv.isSunOS && stdenv.hostPlatform.isx86) "fat") + # The config.guess in GMP tries to runtime-detect various + # ARM optimization flags via /proc/cpuinfo (and is also + # broken on multicore CPUs). Avoid this impurity. + "--build=${stdenv.buildPlatform.config}" + ] ++ optional (cxx && stdenv.isDarwin) "CPPFLAGS=-fexceptions" + ++ optional (stdenv.isDarwin && stdenv.is64bit) "ABI=64" + # to build a .dll on windows, we need --disable-static + --enable-shared + # see https://gmplib.org/manual/Notes-for-Particular-Systems.html + ++ optional (!withStatic && stdenv.hostPlatform.isWindows) "--disable-static --enable-shared" + ++ optional (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) "--disable-assembly"; + + doCheck = true; # not cross; + + dontDisableStatic = withStatic; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://gmplib.org/"; + description = "GNU multiple precision arithmetic library"; + license = with licenses; [ + lgpl3Only + gpl2Only + ]; + + longDescription = + '' GMP is a free library for arbitrary precision arithmetic, operating + on signed integers, rational numbers, and floating point numbers. + There is no practical limit to the precision except the ones implied + by the available memory in the machine GMP runs on. GMP has a rich + set of functions, and the functions have a regular interface. + + The main target applications for GMP are cryptography applications + and research, Internet security applications, algebra systems, + computational algebra research, etc. + + GMP is carefully designed to be as fast as possible, both for small + operands and for huge operands. The speed is achieved by using + fullwords as the basic arithmetic type, by using fast algorithms, + with highly optimised assembly code for the most common inner loops + for a lot of CPUs, and by a general emphasis on speed. + + GMP is faster than any other bignum library. The advantage for GMP + increases with the operand sizes for many operations, since GMP uses + asymptotically faster algorithms. + ''; + + platforms = platforms.all; + maintainers = [ maintainers.vrthra ]; + }; +}; + in self diff --git a/pkgs/by-name/gm/gmp/need-size-t.patch b/pkgs/by-name/gm/gmp/need-size-t.patch new file mode 100644 index 0000000..c4ba086 --- /dev/null +++ b/pkgs/by-name/gm/gmp/need-size-t.patch @@ -0,0 +1,18 @@ +diff --git a/gmp-h.in b/gmp-h.in +index 7deb67a..240d663 100644 +--- a/gmp-h.in ++++ b/gmp-h.in +@@ -46,13 +46,11 @@ along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ + #ifndef __GNU_MP__ + #define __GNU_MP__ 5 + +-#define __need_size_t /* tell gcc stddef.h we only want size_t */ + #if defined (__cplusplus) + #include /* for size_t */ + #else + #include /* for size_t */ + #endif +-#undef __need_size_t + + /* Instantiated by configure. */ + #if ! defined (__GMP_WITHIN_CONFIGURE) diff --git a/pkgs/by-name/gm/gmp/packages.nix b/pkgs/by-name/gm/gmp/packages.nix new file mode 100644 index 0000000..fe320c4 --- /dev/null +++ b/pkgs/by-name/gm/gmp/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gmp4 = callPackage ./4.3.2.nix { }; # required by older GHC versions + gmp5 = callPackage ./5.1.x.nix { }; + gmp6 = callPackage ./6.x.nix { }; + gmp = gmp6; + gmpxx = gmp.override { cxx = true; }; +} diff --git a/pkgs/by-name/gn/gnu-config/default.nix b/pkgs/by-name/gn/gnu-config/default.nix new file mode 100644 index 0000000..0315f39 --- /dev/null +++ b/pkgs/by-name/gn/gnu-config/default.nix @@ -0,0 +1,64 @@ +{ lib, stdenv, fetchurl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let + rev = "28ea239c53a2d5d8800c472bc2452eaa16e37af2"; + + # Don't use fetchgit as this is needed during Aarch64 bootstrapping + configGuess = fetchurl { + name = "config.guess-${builtins.substring 0 7 rev}"; + url = "https://git.savannah.gnu.org/cgit/config.git/plain/config.guess?id=${rev}"; + hash = "sha256-7CV3YUJSMm+InfHel7mkV8A6mpSBEEhWPCEaRElti6M="; + }; + configSub = fetchurl { + name = "config.sub-${builtins.substring 0 7 rev}"; + url = "https://git.savannah.gnu.org/cgit/config.git/plain/config.sub?id=${rev}"; + hash = "sha256-Rlxf5nx9NrcugIgScWRF1NONS5RzTKjTaoY50SMjh4s="; + }; +in stdenv.mkDerivation { + pname = "gnu-config"; + version = "2023-09-19"; + + unpackPhase = '' + runHook preUnpack + cp ${configGuess} ./config.guess + cp ${configSub} ./config.sub + chmod +w ./config.sub ./config.guess + runHook postUnpack + ''; + + # If this isn't set, `pkgs.gnu-config.overrideAttrs( _: { patches + # = ...; })` will behave very counterintuitively: the (unpatched) + # gnu-config from the updateAutotoolsGnuConfigScriptsHook stdenv's + # defaultNativeBuildInputs will "update" the patched gnu-config by + # reverting the patch! + dontUpdateAutotoolsGnuConfigScripts = true; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + install -Dm755 ./config.guess $out/config.guess + install -Dm755 ./config.sub $out/config.sub + runHook postInstall + ''; + + meta = with lib; { + description = "Attempt to guess a canonical system name"; + homepage = "https://savannah.gnu.org/projects/config"; + license = licenses.gpl3; + # In addition to GPLv3: + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that + # program. + maintainers = with maintainers; [ dezgeg emilytrau ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gn/gnugrep/default.nix b/pkgs/by-name/gn/gnugrep/default.nix new file mode 100644 index 0000000..5df8127 --- /dev/null +++ b/pkgs/by-name/gn/gnugrep/default.nix @@ -0,0 +1,79 @@ +{ lib, stdenv, glibcLocales, fetchurl, pcre2, libiconv, perl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let version = "3.11"; in + +stdenv.mkDerivation { + pname = "gnugrep"; + inherit version; + + src = fetchurl { + url = "mirror://gnu/grep/grep-${version}.tar.xz"; + hash = "sha256-HbKu3eidDepCsW2VKPiUyNFdrk4ZC1muzHj1qVEnbqs="; + }; + + # Some gnulib tests fail + # - on Musl: https://github.com/NixOS/nixpkgs/pull/228714 + # - on x86_64-darwin: https://github.com/NixOS/nixpkgs/pull/228714#issuecomment-1576826330 + postPatch = if stdenv.hostPlatform.isMusl || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) then '' + sed -i 's:gnulib-tests::g' Makefile.in + '' else null; + + nativeCheckInputs = [ perl glibcLocales ]; + outputs = [ "out" "info" ]; # the man pages are rather small + + buildInputs = [ pcre2 libiconv ]; + + # cygwin: FAIL: multibyte-white-space + # freebsd: FAIL mb-non-UTF8-performance + # x86_64-darwin: fails 'stack-overflow' tests on Rosetta 2 emulator + doCheck = !stdenv.isCygwin && !stdenv.isFreeBSD && !(stdenv.isDarwin && stdenv.hostPlatform.isx86_64) && !stdenv.buildPlatform.isRiscV64; + + # On macOS, force use of mkdir -p, since Grep's fallback + # (./install-sh) is broken. + preConfigure = '' + export MKDIR_P="mkdir -p" + ''; + + enableParallelBuilding = true; + + # Fix reference to sh in bootstrap-tools, and invoke grep via + # absolute path rather than looking at argv[0]. + postInstall = + '' + rm $out/bin/egrep $out/bin/fgrep + echo "#! /bin/sh" > $out/bin/egrep + echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep + echo "#! /bin/sh" > $out/bin/fgrep + echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep + chmod +x $out/bin/egrep $out/bin/fgrep + ''; + + meta = with lib; { + homepage = "https://www.gnu.org/software/grep/"; + description = "GNU implementation of the Unix grep command"; + + longDescription = '' + The grep command searches one or more input files for lines + containing a match to a specified pattern. By default, grep + prints the matching lines. + ''; + + license = licenses.gpl3Plus; + + maintainers = [ + maintainers.das_j + maintainers.m00wl + ]; + platforms = platforms.all; + mainProgram = "grep"; + }; + + passthru = { + inherit pcre2; + }; +} diff --git a/pkgs/by-name/gn/gnulib/default.nix b/pkgs/by-name/gn/gnulib/default.nix new file mode 100644 index 0000000..be6719c --- /dev/null +++ b/pkgs/by-name/gn/gnulib/default.nix @@ -0,0 +1,48 @@ +{ lib, stdenv, fetchFromSavannah, python3 }: + +stdenv.mkDerivation rec { + pname = "gnulib"; + version = "20231109"; + + src = fetchFromSavannah { + repo = "gnulib"; + rev = "2dd1a7984c6b3e6056cef7e3f9933e0039c21634"; + hash = "sha256-QtWf3mljEnr0TTogkoKN63Y5HTm14A2e/sIXX3xe2SE="; + }; + + postPatch = '' + patchShebangs gnulib-tool.py + ''; + + buildInputs = [ python3 ]; + + installPhase = '' + mkdir -p $out/bin + cp -r * $out/ + ln -s $out/lib $out/include + ln -s $out/gnulib-tool $out/bin/ + ''; + + # do not change headers to not update all vendored build files + dontFixup = true; + + passthru = { + # This patch is used by multiple other packages (currently: + # gnused, gettext) which contain vendored copies of gnulib. + # Without it, compilation will fail with error messages about + # "__LDBL_REDIR1_DECL" or similar on platforms with longdouble + # redirects (currently powerpc64). Once all of those other + # packages make a release with a newer gnulib we can drop this + # patch. + longdouble-redirect-patch = ./gnulib-longdouble-redirect.patch; + }; + + meta = with lib; { + description = "Central location for code to be shared among GNU packages"; + homepage = "https://www.gnu.org/software/gnulib/"; + changelog = "https://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob;f=ChangeLog"; + license = licenses.gpl3Plus; + mainProgram = "gnulib-tool"; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/gn/gnulib/gnulib-longdouble-redirect.patch b/pkgs/by-name/gn/gnulib/gnulib-longdouble-redirect.patch new file mode 100644 index 0000000..f684292 --- /dev/null +++ b/pkgs/by-name/gn/gnulib/gnulib-longdouble-redirect.patch @@ -0,0 +1,72 @@ + +Below is the subset of gnulib commit +776af40e09b476a41073131a90022572f448c189 which deals with long double +redirects. The rest of that commit has been removed. + +diff --git a/lib/cdefs.h b/lib/cdefs.h +index fd72b7b..4383e70 100644 +--- a/lib/cdefs.h ++++ b/lib/cdefs.h +@@ -483,7 +493,37 @@ + # include + #endif + +-#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH ++#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1 ++# ifdef __REDIRECT ++ ++/* Alias name defined automatically. */ ++# define __LDBL_REDIR(name, proto) ... unused__ldbl_redir ++# define __LDBL_REDIR_DECL(name) \ ++ extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128")); ++ ++/* Alias name defined automatically, with leading underscores. */ ++# define __LDBL_REDIR2_DECL(name) \ ++ extern __typeof (__##name) __##name \ ++ __asm (__ASMNAME ("__" #name "ieee128")); ++ ++/* Alias name defined manually. */ ++# define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1 ++# define __LDBL_REDIR1_DECL(name, alias) \ ++ extern __typeof (name) name __asm (__ASMNAME (#alias)); ++ ++# define __LDBL_REDIR1_NTH(name, proto, alias) \ ++ __REDIRECT_NTH (name, proto, alias) ++# define __REDIRECT_NTH_LDBL(name, proto, alias) \ ++ __LDBL_REDIR1_NTH (name, proto, __##alias##ieee128) ++ ++/* Unused. */ ++# define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl ++# define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth ++ ++# else ++_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform"); ++# endif ++#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH + # define __LDBL_COMPAT 1 + # ifdef __REDIRECT + # define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias) +@@ -492,6 +532,8 @@ + # define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias) + # define __LDBL_REDIR_NTH(name, proto) \ + __LDBL_REDIR1_NTH (name, proto, __nldbl_##name) ++# define __LDBL_REDIR2_DECL(name) \ ++ extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name)); + # define __LDBL_REDIR1_DECL(name, alias) \ + extern __typeof (name) name __asm (__ASMNAME (#alias)); + # define __LDBL_REDIR_DECL(name) \ +@@ -502,11 +544,13 @@ + __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias) + # endif + #endif +-#if !defined __LDBL_COMPAT || !defined __REDIRECT ++#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \ ++ || !defined __REDIRECT + # define __LDBL_REDIR1(name, proto, alias) name proto + # define __LDBL_REDIR(name, proto) name proto + # define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW + # define __LDBL_REDIR_NTH(name, proto) name proto __THROW ++# define __LDBL_REDIR2_DECL(name) + # define __LDBL_REDIR_DECL(name) + # ifdef __REDIRECT + # define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias) diff --git a/pkgs/by-name/gn/gnum4/default.nix b/pkgs/by-name/gn/gnum4/default.nix new file mode 100644 index 0000000..66de4eb --- /dev/null +++ b/pkgs/by-name/gn/gnum4/default.nix @@ -0,0 +1,57 @@ +{ lib, stdenv, fetchurl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "gnum4"; + version = "1.4.19"; + + src = fetchurl { + url = "mirror://gnu/m4/m4-${version}.tar.bz2"; + sha256 = "sha256-swapHA/ZO8QoDPwumMt6s5gf91oYe+oyk4EfRSyJqMg="; + }; + + # https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-devel/m4/m4-1.4.19-r1.ebuild + patches = lib.optional stdenv.hostPlatform.isLoongArch64 ./loong-fix-build.patch; + postPatch = if stdenv.hostPlatform.isLoongArch64 then '' + touch ./aclocal.m4 ./lib/config.hin ./configure ./doc/stamp-vti || die + find . -name Makefile.in -exec touch {} + || die + '' else null; + + strictDeps = true; + enableParallelBuilding = true; + + doCheck = false; + + configureFlags = [ "--with-syscmd-shell=${stdenv.shell}" ] + ++ lib.optional stdenv.hostPlatform.isMinGW "CFLAGS=-fno-stack-protector"; + + meta = { + description = "GNU M4, a macro processor"; + longDescription = '' + GNU M4 is an implementation of the traditional Unix macro + processor. It is mostly SVR4 compatible although it has some + extensions (for example, handling more than 9 positional + parameters to macros). GNU M4 also has built-in functions for + including files, running shell commands, doing arithmetic, etc. + + GNU M4 is a macro processor in the sense that it copies its + input to the output expanding macros as it goes. Macros are + either builtin or user-defined and can take any number of + arguments. Besides just doing macro expansion, m4 has builtin + functions for including named files, running UNIX commands, + doing integer arithmetic, manipulating text in various ways, + recursion etc... m4 can be used either as a front-end to a + compiler or as a macro processor in its own right. + ''; + homepage = "https://www.gnu.org/software/m4/"; + + license = lib.licenses.gpl3Plus; + mainProgram = "m4"; + platforms = lib.platforms.unix ++ lib.platforms.windows; + }; + +} diff --git a/pkgs/by-name/gn/gnum4/loong-fix-build.patch b/pkgs/by-name/gn/gnum4/loong-fix-build.patch new file mode 100644 index 0000000..d524335 --- /dev/null +++ b/pkgs/by-name/gn/gnum4/loong-fix-build.patch @@ -0,0 +1,30 @@ +[xen0n: this is https://github.com/sunhaiyong1978/CLFS-for-LoongArch/blob/1.0/patches/stack-direction-add-loongarch.patch with line number tweak, and change to generated file added as well.] +From: Sun Haiyong +Date: Tue, 31 Aug 2021 11:11:52 +0800 +Subject: [PATCH] stack-direction: Add support for loongarch CPU + +* m4/stack-direction.m4 (SV_STACK_DIRECTION): When the CPU is loongarch, +set "sv_cv_stack_direction" to "-1" . +--- a/m4/stack-direction.m4 ++++ b/m4/stack-direction.m4 +@@ -31,6 +31,7 @@ AC_DEFUN([SV_STACK_DIRECTION], + i?86 | x86_64 | \ + i860 | \ + ia64 | \ ++ loongarch* | \ + m32r | \ + m68* | \ + m88k | \ +--- a/configure ++++ b/configure +@@ -46399,6 +46399,7 @@ else $as_nop + i?86 | x86_64 | \ + i860 | \ + ia64 | \ ++ loongarch* | \ + m32r | \ + m68* | \ + m88k | \ +-- +2.17.2 + diff --git a/pkgs/by-name/gn/gnum4/packages.nix b/pkgs/by-name/gn/gnum4/packages.nix new file mode 100644 index 0000000..ed44883 --- /dev/null +++ b/pkgs/by-name/gn/gnum4/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gnum4 = callPackage ./. { }; + m4 = gnum4; +} diff --git a/pkgs/by-name/gn/gnumake/0001-No-impure-bin-sh.patch b/pkgs/by-name/gn/gnumake/0001-No-impure-bin-sh.patch new file mode 100644 index 0000000..58ee2d6 --- /dev/null +++ b/pkgs/by-name/gn/gnumake/0001-No-impure-bin-sh.patch @@ -0,0 +1,35 @@ +From e00a5257a6ca5fedbf68b09eee7df3502971a057 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= +Date: Sat, 24 Apr 2021 10:11:40 +0200 +Subject: [PATCH 1/2] No impure bin sh + +default_shell is used to populuate default shell used to execute jobs. +Unless SHELL is set to a different value this would be /bin/sh. +Our stdenv provides sh in form of bash anyway. Having this value not +hard-coded has some advantages: + +- It would ensure that on all systems it uses sh from its PATH rather + than /bin/sh, which helps as different systems might have different + shells there (bash vs. dash) +- In the past I had issues with LD_PRELOAD with BEAR, where /bin/sh + used a different glibc than BEAR which came from my development shell. +--- + src/job.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/job.c b/src/job.c +index ae1f18b..6b4ddb3 100644 +--- a/src/job.c ++++ b/src/job.c +@@ -77,7 +77,7 @@ char * vms_strsignal (int status); + + #else + +-const char *default_shell = "/bin/sh"; ++const char *default_shell = "sh"; + int batch_mode_shell = 0; + + #endif +-- +2.31.1 + diff --git a/pkgs/by-name/gn/gnumake/0002-remove-impure-dirs.patch b/pkgs/by-name/gn/gnumake/0002-remove-impure-dirs.patch new file mode 100644 index 0000000..e62aee7 --- /dev/null +++ b/pkgs/by-name/gn/gnumake/0002-remove-impure-dirs.patch @@ -0,0 +1,40 @@ +From 795d63d3c8b5c0dbb7e544954f75507b371b7228 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= +Date: Sat, 24 Apr 2021 10:20:16 +0200 +Subject: [PATCH 2/2] remove impure dirs + +--- + src/read.c | 3 --- + src/remake.c | 2 -- + 2 files changed, 5 deletions(-) + +diff --git a/src/read.c b/src/read.c +index fa197fb..defacfb 100644 +--- a/src/read.c ++++ b/src/read.c +@@ -109,9 +109,6 @@ static const char *default_include_directories[] = + #endif + INCLUDEDIR, + #ifndef _AMIGA +- "/usr/gnu/include", +- "/usr/local/include", +- "/usr/include", + #endif + 0 + }; +diff --git a/src/remake.c b/src/remake.c +index fb237c5..94bff7d 100644 +--- a/src/remake.c ++++ b/src/remake.c +@@ -1601,8 +1601,6 @@ library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr) + static const char *dirs[] = + { + #ifndef _AMIGA +- "/lib", +- "/usr/lib", + #endif + #if defined(WINDOWS32) && !defined(LIBDIR) + /* +-- +2.31.1 + diff --git a/pkgs/by-name/gn/gnumake/4.2/default.nix b/pkgs/by-name/gn/gnumake/4.2/default.nix new file mode 100644 index 0000000..21e9abd --- /dev/null +++ b/pkgs/by-name/gn/gnumake/4.2/default.nix @@ -0,0 +1,61 @@ +{ lib, stdenv, fetchurl, guileSupport ? false, pkg-config ? null , guile ? null }: + +assert guileSupport -> ( pkg-config != null && guile != null ); + +stdenv.mkDerivation rec { + pname = "gnumake"; + version = "4.2.1"; + + src = fetchurl { + url = "mirror://gnu/make/make-${version}.tar.bz2"; + sha256 = "12f5zzyq2w56g95nni65hc0g5p7154033y2f3qmjvd016szn5qnn"; + }; + + patchFlags = [ "-p0" ]; + patches = [ + # Purity: don't look for library dependencies (of the form `-lfoo') in /lib + # and /usr/lib. It's a stupid feature anyway. Likewise, when searching for + # included Makefiles, don't look in /usr/include and friends. + ./impure-dirs.patch + ./pselect.patch + # Fix support for glibc 2.27's glob, inspired by http://www.linuxfromscratch.org/lfs/view/8.2/chapter05/make.html + ./glibc-2.27-glob.patch + ./glibc-2.33-glob.patch + ]; + + nativeBuildInputs = lib.optionals guileSupport [ pkg-config ]; + buildInputs = lib.optionals guileSupport [ guile ]; + + configureFlags = lib.optional guileSupport "--with-guile" + + # Make uses this test to decide whether it should keep track of + # subseconds. Apple made this possible with APFS and macOS 10.13. + # However, we still support macOS 10.11 and 10.12. Binaries built + # in Nixpkgs will be unable to use futimens to set mtime less than + # a second. So, tell Make to ignore nanoseconds in mtime here by + # overriding the autoconf test for the struct. + # See https://github.com/NixOS/nixpkgs/issues/51221 for discussion. + ++ lib.optional stdenv.isDarwin "ac_cv_struct_st_mtim_nsec=no"; + + outputs = [ "out" "man" "info" ]; + + meta = with lib; { + description = "A tool to control the generation of non-source files from sources"; + longDescription = '' + Make is a tool which controls the generation of executables and + other non-source files of a program from the program's source files. + + Make gets its knowledge of how to build your program from a file + called the makefile, which lists each of the non-source files and + how to compute it from other files. When you write a program, you + should write a makefile for it, so that it is possible to use Make + to build and install the program. + ''; + homepage = "https://www.gnu.org/software/make/"; + + license = licenses.gpl3Plus; + maintainers = [ maintainers.vrthra ]; + mainProgram = "make"; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gn/gnumake/4.2/glibc-2.27-glob.patch b/pkgs/by-name/gn/gnumake/4.2/glibc-2.27-glob.patch new file mode 100644 index 0000000..186212d --- /dev/null +++ b/pkgs/by-name/gn/gnumake/4.2/glibc-2.27-glob.patch @@ -0,0 +1,32 @@ +diff -Naur glob/glob.c glob/glob.c +--- glob/glob.c 2013-10-20 13:14:38.000000000 -0400 ++++ glob/glob.c 2018-03-16 14:32:38.483496170 -0400 +@@ -208,28 +208,9 @@ + #endif /* __GNU_LIBRARY__ || __DJGPP__ */ + + +-#if !defined __alloca && !defined __GNU_LIBRARY__ +- +-# ifdef __GNUC__ +-# undef alloca +-# define alloca(n) __builtin_alloca (n) +-# else /* Not GCC. */ +-# ifdef HAVE_ALLOCA_H + # include +-# else /* Not HAVE_ALLOCA_H. */ +-# ifndef _AIX +-# ifdef WINDOWS32 +-# include +-# else +-extern char *alloca (); +-# endif /* WINDOWS32 */ +-# endif /* Not _AIX. */ +-# endif /* sparc or HAVE_ALLOCA_H. */ +-# endif /* GCC. */ +- + # define __alloca alloca + +-#endif + + #ifndef __GNU_LIBRARY__ + # define __stat stat diff --git a/pkgs/by-name/gn/gnumake/4.2/glibc-2.33-glob.patch b/pkgs/by-name/gn/gnumake/4.2/glibc-2.33-glob.patch new file mode 100644 index 0000000..d3e424d --- /dev/null +++ b/pkgs/by-name/gn/gnumake/4.2/glibc-2.33-glob.patch @@ -0,0 +1,17 @@ +diff --git glob/glob.c glob/glob.c +index 924f2b3..d4ef0c5 100644 +--- glob/glob.c ++++ glob/glob.c +@@ -212,8 +212,8 @@ my_realloc (p, n) + # define __alloca alloca + + +-#ifndef __GNU_LIBRARY__ + # define __stat stat ++#ifndef __GNU_LIBRARY__ + # ifdef STAT_MACROS_BROKEN + # undef S_ISDIR + # endif +-- +2.31.1 + diff --git a/pkgs/by-name/gn/gnumake/4.2/impure-dirs.patch b/pkgs/by-name/gn/gnumake/4.2/impure-dirs.patch new file mode 100644 index 0000000..f6646f1 --- /dev/null +++ b/pkgs/by-name/gn/gnumake/4.2/impure-dirs.patch @@ -0,0 +1,34 @@ +diff -rc read.c read.c +*** read.c 2006-03-17 15:24:20.000000000 +0100 +--- read.c 2007-05-24 17:16:31.000000000 +0200 +*************** +*** 99,107 **** +--- 99,109 ---- + #endif + INCLUDEDIR, + #ifndef _AMIGA ++ #if 0 + "/usr/gnu/include", + "/usr/local/include", + "/usr/include", ++ #endif + #endif + 0 + }; +diff -rc reremake.c +*** remake.c 2006-03-20 03:36:37.000000000 +0100 +--- remake.c 2007-05-24 17:06:54.000000000 +0200 +*************** +*** 1452,1460 **** +--- 1452,1462 ---- + static char *dirs[] = + { + #ifndef _AMIGA ++ #if 0 + "/lib", + "/usr/lib", + #endif ++ #endif + #if defined(WINDOWS32) && !defined(LIBDIR) + /* + * This is completely up to the user at product install time. Just define diff --git a/pkgs/by-name/gn/gnumake/4.2/pselect.patch b/pkgs/by-name/gn/gnumake/4.2/pselect.patch new file mode 100644 index 0000000..5a03acb --- /dev/null +++ b/pkgs/by-name/gn/gnumake/4.2/pselect.patch @@ -0,0 +1,170 @@ +From b552b05251980f693c729e251f93f5225b400714 Mon Sep 17 00:00:00 2001 +From: Paul Smith +Date: Sat, 3 Jun 2017 16:20:51 -0400 +Subject: [SV 51159] Use a non-blocking read with pselect to avoid hangs. + +* posixos.c (set_blocking): Set blocking on a file descriptor. +(jobserver_setup): Set non-blocking on the jobserver read side. +(jobserver_parse_auth): Ditto. +(jobserver_acquire_all): Set blocking to avoid a busy-wait loop. +(jobserver_acquire): If the non-blocking read() returns without +taking a token then try again. +--- + posixos.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 71 insertions(+), 26 deletions(-) + +diff --git posixos.c posixos.c +index e642d7f..dbafa51 100644 +--- posixos.c ++++ posixos.c +@@ -62,6 +62,24 @@ make_job_rfd (void) + #endif + } + ++static void ++set_blocking (int fd, int blocking) ++{ ++ // If we're not using pselect() don't change the blocking ++#ifdef HAVE_PSELECT ++ int flags; ++ EINTRLOOP (flags, fcntl (fd, F_GETFL)); ++ if (flags >= 0) ++ { ++ int r; ++ flags = blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK); ++ EINTRLOOP (r, fcntl (fd, F_SETFL, flags)); ++ if (r < 0) ++ pfatal_with_name ("fcntl(O_NONBLOCK)"); ++ } ++#endif ++} ++ + unsigned int + jobserver_setup (int slots) + { +@@ -86,6 +104,9 @@ jobserver_setup (int slots) + pfatal_with_name (_("init jobserver pipe")); + } + ++ /* When using pselect() we want the read to be non-blocking. */ ++ set_blocking (job_fds[0], 0); ++ + return 1; + } + +@@ -121,6 +142,9 @@ jobserver_parse_auth (const char *auth) + return 0; + } + ++ /* When using pselect() we want the read to be non-blocking. */ ++ set_blocking (job_fds[0], 0); ++ + return 1; + } + +@@ -169,7 +193,10 @@ jobserver_acquire_all (void) + { + unsigned int tokens = 0; + +- /* Close the write side, so the read() won't hang. */ ++ /* Use blocking reads to wait for all outstanding jobs. */ ++ set_blocking (job_fds[0], 1); ++ ++ /* Close the write side, so the read() won't hang forever. */ + close (job_fds[1]); + job_fds[1] = -1; + +@@ -236,18 +263,12 @@ jobserver_pre_acquire (void) + unsigned int + jobserver_acquire (int timeout) + { +- sigset_t empty; +- fd_set readfds; + struct timespec spec; + struct timespec *specp = NULL; +- int r; +- char intake; ++ sigset_t empty; + + sigemptyset (&empty); + +- FD_ZERO (&readfds); +- FD_SET (job_fds[0], &readfds); +- + if (timeout) + { + /* Alarm after one second (is this too granular?) */ +@@ -256,28 +277,52 @@ jobserver_acquire (int timeout) + specp = &spec; + } + +- r = pselect (job_fds[0]+1, &readfds, NULL, NULL, specp, &empty); +- +- if (r == -1) ++ while (1) + { +- /* Better be SIGCHLD. */ +- if (errno != EINTR) +- pfatal_with_name (_("pselect jobs pipe")); +- return 0; +- } ++ fd_set readfds; ++ int r; ++ char intake; + +- if (r == 0) +- /* Timeout. */ +- return 0; ++ FD_ZERO (&readfds); ++ FD_SET (job_fds[0], &readfds); + +- /* The read FD is ready: read it! */ +- EINTRLOOP (r, read (job_fds[0], &intake, 1)); +- if (r < 0) +- pfatal_with_name (_("read jobs pipe")); ++ r = pselect (job_fds[0]+1, &readfds, NULL, NULL, specp, &empty); ++ if (r < 0) ++ switch (errno) ++ { ++ case EINTR: ++ /* SIGCHLD will show up as an EINTR. */ ++ return 0; ++ ++ case EBADF: ++ /* Someone closed the jobs pipe. ++ That shouldn't happen but if it does we're done. */ ++ O (fatal, NILF, _("job server shut down")); + +- /* What does it mean if read() returns 0? It shouldn't happen because only +- the master make can reap all the tokens and close the write side...?? */ +- return r > 0; ++ default: ++ pfatal_with_name (_("pselect jobs pipe")); ++ } ++ ++ if (r == 0) ++ /* Timeout. */ ++ return 0; ++ ++ /* The read FD is ready: read it! This is non-blocking. */ ++ EINTRLOOP (r, read (job_fds[0], &intake, 1)); ++ ++ if (r < 0) ++ { ++ /* Someone sniped our token! Try again. */ ++ if (errno == EAGAIN) ++ continue; ++ ++ pfatal_with_name (_("read jobs pipe")); ++ } ++ ++ /* read() should never return 0: only the master make can reap all the ++ tokens and close the write side...?? */ ++ return r > 0; ++ } + } + + #else +-- +cgit v1.0-41-gc330 + diff --git a/pkgs/by-name/gn/gnumake/default.nix b/pkgs/by-name/gn/gnumake/default.nix new file mode 100644 index 0000000..23fe1b5 --- /dev/null +++ b/pkgs/by-name/gn/gnumake/default.nix @@ -0,0 +1,76 @@ +{ lib +, stdenv +, fetchurl +, guileSupport ? false, guile +# avoid guile depend on bootstrap to prevent dependency cycles +, inBootstrap ? false +, pkg-config +# for passthru.tests +# , gnumake +}: + +let + guileEnabled = guileSupport && !inBootstrap; +in + +stdenv.mkDerivation rec { + pname = "gnumake"; + version = "4.4.1"; + + src = fetchurl { + url = "mirror://gnu/make/make-${version}.tar.gz"; + sha256 = "sha256-3Rb7HWe/q3mnL16DkHNcSePo5wtJRaFasfgd23hlj7M="; + }; + + # to update apply these patches with `git am *.patch` to https://git.savannah.gnu.org/git/make.git + patches = [ + # Replaces /bin/sh with sh, see patch file for reasoning + ./0001-No-impure-bin-sh.patch + # Purity: don't look for library dependencies (of the form `-lfoo') in /lib + # and /usr/lib. It's a stupid feature anyway. Likewise, when searching for + # included Makefiles, don't look in /usr/include and friends. + ./0002-remove-impure-dirs.patch + ]; + + nativeBuildInputs = lib.optionals guileEnabled [ pkg-config ]; + buildInputs = lib.optionals guileEnabled [ guile ]; + + configureFlags = lib.optional guileEnabled "--with-guile" + + # Make uses this test to decide whether it should keep track of + # subseconds. Apple made this possible with APFS and macOS 10.13. + # However, we still support macOS 10.11 and 10.12. Binaries built + # in Nixpkgs will be unable to use futimens to set mtime less than + # a second. So, tell Make to ignore nanoseconds in mtime here by + # overriding the autoconf test for the struct. + # See https://github.com/NixOS/nixpkgs/issues/51221 for discussion. + ++ lib.optional stdenv.isDarwin "ac_cv_struct_st_mtim_nsec=no"; + + outputs = [ "out" "man" "info" ]; + separateDebugInfo = true; + + # passthru.tests = { + # # make sure that the override doesn't break bootstrapping + # gnumakeWithGuile = gnumake.override { guileSupport = true; }; + # }; + + meta = with lib; { + description = "A tool to control the generation of non-source files from sources"; + longDescription = '' + Make is a tool which controls the generation of executables and + other non-source files of a program from the program's source files. + + Make gets its knowledge of how to build your program from a file + called the makefile, which lists each of the non-source files and + how to compute it from other files. When you write a program, you + should write a makefile for it, so that it is possible to use Make + to build and install the program. + ''; + homepage = "https://www.gnu.org/software/make/"; + + license = licenses.gpl3Plus; + maintainers = [ maintainers.vrthra ]; + mainProgram = "make"; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gn/gnumake/packages.nix b/pkgs/by-name/gn/gnumake/packages.nix new file mode 100644 index 0000000..d516d78 --- /dev/null +++ b/pkgs/by-name/gn/gnumake/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gnumake = callPackage ./. { }; + gnumake42 = callPackage ./4.2 { }; +} diff --git a/pkgs/by-name/gn/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch b/pkgs/by-name/gn/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch new file mode 100644 index 0000000..98c9aa8 --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/Allow_input_files_to_be_missing_for_ed-style_patches.patch @@ -0,0 +1,33 @@ +From b5a91a01e5d0897facdd0f49d64b76b0f02b43e1 Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Fri, 6 Apr 2018 11:34:51 +0200 +Subject: Allow input files to be missing for ed-style patches + +* src/pch.c (do_ed_script): Allow input files to be missing so that new +files will be created as with non-ed-style patches. +--- + src/pch.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/src/pch.c b/src/pch.c +index bc6278c..0c5cc26 100644 +--- a/src/pch.c ++++ b/src/pch.c +@@ -2394,9 +2394,11 @@ do_ed_script (char const *inname, char const *outname, + + if (! dry_run && ! skip_rest_of_patch) { + int exclusive = *outname_needs_removal ? 0 : O_EXCL; +- assert (! inerrno); +- *outname_needs_removal = true; +- copy_file (inname, outname, 0, exclusive, instat.st_mode, true); ++ if (inerrno != ENOENT) ++ { ++ *outname_needs_removal = true; ++ copy_file (inname, outname, 0, exclusive, instat.st_mode, true); ++ } + sprintf (buf, "%s %s%s", editor_program, + verbosity == VERBOSE ? "" : "- ", + outname); +-- +cgit v1.0-41-gc330 + diff --git a/pkgs/by-name/gn/gnupatch/CVE-2018-1000156.patch b/pkgs/by-name/gn/gnupatch/CVE-2018-1000156.patch new file mode 100644 index 0000000..36f33de --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/CVE-2018-1000156.patch @@ -0,0 +1,211 @@ +From 123eaff0d5d1aebe128295959435b9ca5909c26d Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Fri, 6 Apr 2018 12:14:49 +0200 +Subject: Fix arbitrary command execution in ed-style patches + (CVE-2018-1000156) + +* src/pch.c (do_ed_script): Write ed script to a temporary file instead +of piping it to ed: this will cause ed to abort on invalid commands +instead of rejecting them and carrying on. +* tests/ed-style: New test case. +* tests/Makefile.am (TESTS): Add test case. +--- + src/pch.c | 91 ++++++++++++++++++++++++++++++++++++++++--------------- + tests/Makefile.am | 1 + + tests/ed-style | 41 +++++++++++++++++++++++++ + 3 files changed, 108 insertions(+), 25 deletions(-) + create mode 100644 tests/ed-style + +diff --git a/src/pch.c b/src/pch.c +index 0c5cc26..4fd5a05 100644 +--- a/src/pch.c ++++ b/src/pch.c +@@ -33,6 +33,7 @@ + # include + #endif + #include ++#include + + #define INITHUNKMAX 125 /* initial dynamic allocation size */ + +@@ -2389,24 +2390,28 @@ do_ed_script (char const *inname, char const *outname, + static char const editor_program[] = EDITOR_PROGRAM; + + file_offset beginning_of_this_line; +- FILE *pipefp = 0; + size_t chars_read; ++ FILE *tmpfp = 0; ++ char const *tmpname; ++ int tmpfd; ++ pid_t pid; ++ ++ if (! dry_run && ! skip_rest_of_patch) ++ { ++ /* Write ed script to a temporary file. This causes ed to abort on ++ invalid commands such as when line numbers or ranges exceed the ++ number of available lines. When ed reads from a pipe, it rejects ++ invalid commands and treats the next line as a new command, which ++ can lead to arbitrary command execution. */ ++ ++ tmpfd = make_tempfile (&tmpname, 'e', NULL, O_RDWR | O_BINARY, 0); ++ if (tmpfd == -1) ++ pfatal ("Can't create temporary file %s", quotearg (tmpname)); ++ tmpfp = fdopen (tmpfd, "w+b"); ++ if (! tmpfp) ++ pfatal ("Can't open stream for file %s", quotearg (tmpname)); ++ } + +- if (! dry_run && ! skip_rest_of_patch) { +- int exclusive = *outname_needs_removal ? 0 : O_EXCL; +- if (inerrno != ENOENT) +- { +- *outname_needs_removal = true; +- copy_file (inname, outname, 0, exclusive, instat.st_mode, true); +- } +- sprintf (buf, "%s %s%s", editor_program, +- verbosity == VERBOSE ? "" : "- ", +- outname); +- fflush (stdout); +- pipefp = popen(buf, binary_transput ? "wb" : "w"); +- if (!pipefp) +- pfatal ("Can't open pipe to %s", quotearg (buf)); +- } + for (;;) { + char ed_command_letter; + beginning_of_this_line = file_tell (pfp); +@@ -2417,14 +2422,14 @@ do_ed_script (char const *inname, char const *outname, + } + ed_command_letter = get_ed_command_letter (buf); + if (ed_command_letter) { +- if (pipefp) +- if (! fwrite (buf, sizeof *buf, chars_read, pipefp)) ++ if (tmpfp) ++ if (! fwrite (buf, sizeof *buf, chars_read, tmpfp)) + write_fatal (); + if (ed_command_letter != 'd' && ed_command_letter != 's') { + p_pass_comments_through = true; + while ((chars_read = get_line ()) != 0) { +- if (pipefp) +- if (! fwrite (buf, sizeof *buf, chars_read, pipefp)) ++ if (tmpfp) ++ if (! fwrite (buf, sizeof *buf, chars_read, tmpfp)) + write_fatal (); + if (chars_read == 2 && strEQ (buf, ".\n")) + break; +@@ -2437,13 +2442,49 @@ do_ed_script (char const *inname, char const *outname, + break; + } + } +- if (!pipefp) ++ if (!tmpfp) + return; +- if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, pipefp) == 0 +- || fflush (pipefp) != 0) ++ if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) == 0 ++ || fflush (tmpfp) != 0) + write_fatal (); +- if (pclose (pipefp) != 0) +- fatal ("%s FAILED", editor_program); ++ ++ if (lseek (tmpfd, 0, SEEK_SET) == -1) ++ pfatal ("Can't rewind to the beginning of file %s", quotearg (tmpname)); ++ ++ if (! dry_run && ! skip_rest_of_patch) { ++ int exclusive = *outname_needs_removal ? 0 : O_EXCL; ++ *outname_needs_removal = true; ++ if (inerrno != ENOENT) ++ { ++ *outname_needs_removal = true; ++ copy_file (inname, outname, 0, exclusive, instat.st_mode, true); ++ } ++ sprintf (buf, "%s %s%s", editor_program, ++ verbosity == VERBOSE ? "" : "- ", ++ outname); ++ fflush (stdout); ++ ++ pid = fork(); ++ if (pid == -1) ++ pfatal ("Can't fork"); ++ else if (pid == 0) ++ { ++ dup2 (tmpfd, 0); ++ execl ("/bin/sh", "sh", "-c", buf, (char *) 0); ++ _exit (2); ++ } ++ else ++ { ++ int wstatus; ++ if (waitpid (pid, &wstatus, 0) == -1 ++ || ! WIFEXITED (wstatus) ++ || WEXITSTATUS (wstatus) != 0) ++ fatal ("%s FAILED", editor_program); ++ } ++ } ++ ++ fclose (tmpfp); ++ safe_unlink (tmpname); + + if (ofp) + { +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 6b6df63..16f8693 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -32,6 +32,7 @@ TESTS = \ + crlf-handling \ + dash-o-append \ + deep-directories \ ++ ed-style \ + empty-files \ + false-match \ + fifo \ +diff --git a/tests/ed-style b/tests/ed-style +new file mode 100644 +index 0000000..d8c0689 +--- /dev/null ++++ b/tests/ed-style +@@ -0,0 +1,41 @@ ++# Copyright (C) 2018 Free Software Foundation, Inc. ++# ++# Copying and distribution of this file, with or without modification, ++# in any medium, are permitted without royalty provided the copyright ++# notice and this notice are preserved. ++ ++. $srcdir/test-lib.sh ++ ++require cat ++use_local_patch ++use_tmpdir ++ ++# ============================================================== ++ ++cat > ed1.diff < ed2.diff < /dev/null || echo "Status: $?"' < +Date: Mon, 12 Feb 2018 16:48:24 +0100 +Subject: Fix segfault with mangled rename patch + +http://savannah.gnu.org/bugs/?53132 +* src/pch.c (intuit_diff_type): Ensure that two filenames are specified +for renames and copies (fix the existing check). +--- + src/pch.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/pch.c b/src/pch.c +index ff9ed2c..bc6278c 100644 +--- a/src/pch.c ++++ b/src/pch.c +@@ -974,7 +974,8 @@ intuit_diff_type (bool need_header, mode_t *p_file_type) + if ((pch_rename () || pch_copy ()) + && ! inname + && ! ((i == OLD || i == NEW) && +- p_name[! reverse] && ++ p_name[reverse] && p_name[! reverse] && ++ name_is_valid (p_name[reverse]) && + name_is_valid (p_name[! reverse]))) + { + say ("Cannot %s file without two valid file names\n", pch_rename () ? "rename" : "copy"); +-- +cgit v1.0-41-gc330 diff --git a/pkgs/by-name/gn/gnupatch/CVE-2018-6952.patch b/pkgs/by-name/gn/gnupatch/CVE-2018-6952.patch new file mode 100644 index 0000000..2da323c --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/CVE-2018-6952.patch @@ -0,0 +1,28 @@ +From 9c986353e420ead6e706262bf204d6e03322c300 Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Fri, 17 Aug 2018 13:35:40 +0200 +Subject: Fix swapping fake lines in pch_swap + +* src/pch.c (pch_swap): Fix swapping p_bfake and p_efake when there is a +blank line in the middle of a context-diff hunk: that empty line stays +in the middle of the hunk and isn't swapped. + +Fixes: https://savannah.gnu.org/bugs/index.php?53133 +--- + src/pch.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/pch.c b/src/pch.c +index e92bc64..a500ad9 100644 +--- a/src/pch.c ++++ b/src/pch.c +@@ -2122,7 +2122,7 @@ pch_swap (void) + } + if (p_efake >= 0) { /* fix non-freeable ptr range */ + if (p_efake <= i) +- n = p_end - i + 1; ++ n = p_end - p_ptrn_lines; + else + n = -i; + p_efake += n; +-- diff --git a/pkgs/by-name/gn/gnupatch/CVE-2019-13636.patch b/pkgs/by-name/gn/gnupatch/CVE-2019-13636.patch new file mode 100644 index 0000000..e62c3d4 --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/CVE-2019-13636.patch @@ -0,0 +1,108 @@ +From dce4683cbbe107a95f1f0d45fabc304acfb5d71a Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Mon, 15 Jul 2019 16:21:48 +0200 +Subject: Don't follow symlinks unless --follow-symlinks is given + +* src/inp.c (plan_a, plan_b), src/util.c (copy_to_fd, copy_file, +append_to_file): Unless the --follow-symlinks option is given, open files with +the O_NOFOLLOW flag to avoid following symlinks. So far, we were only doing +that consistently for input files. +* src/util.c (create_backup): When creating empty backup files, (re)create them +with O_CREAT | O_EXCL to avoid following symlinks in that case as well. +--- + src/inp.c | 12 ++++++++++-- + src/util.c | 14 +++++++++++--- + 2 files changed, 21 insertions(+), 5 deletions(-) + +diff --git a/src/inp.c b/src/inp.c +index 32d0919..22d7473 100644 +--- a/src/inp.c ++++ b/src/inp.c +@@ -238,8 +238,13 @@ plan_a (char const *filename) + { + if (S_ISREG (instat.st_mode)) + { +- int ifd = safe_open (filename, O_RDONLY|binary_transput, 0); ++ int flags = O_RDONLY | binary_transput; + size_t buffered = 0, n; ++ int ifd; ++ ++ if (! follow_symlinks) ++ flags |= O_NOFOLLOW; ++ ifd = safe_open (filename, flags, 0); + if (ifd < 0) + pfatal ("can't open file %s", quotearg (filename)); + +@@ -340,6 +345,7 @@ plan_a (char const *filename) + static void + plan_b (char const *filename) + { ++ int flags = O_RDONLY | binary_transput; + int ifd; + FILE *ifp; + int c; +@@ -353,7 +359,9 @@ plan_b (char const *filename) + + if (instat.st_size == 0) + filename = NULL_DEVICE; +- if ((ifd = safe_open (filename, O_RDONLY | binary_transput, 0)) < 0 ++ if (! follow_symlinks) ++ flags |= O_NOFOLLOW; ++ if ((ifd = safe_open (filename, flags, 0)) < 0 + || ! (ifp = fdopen (ifd, binary_transput ? "rb" : "r"))) + pfatal ("Can't open file %s", quotearg (filename)); + if (TMPINNAME_needs_removal) +diff --git a/src/util.c b/src/util.c +index 1cc08ba..fb38307 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -388,7 +388,7 @@ create_backup (char const *to, const struct stat *to_st, bool leave_original) + + try_makedirs_errno = ENOENT; + safe_unlink (bakname); +- while ((fd = safe_open (bakname, O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0) ++ while ((fd = safe_open (bakname, O_CREAT | O_EXCL | O_WRONLY | O_TRUNC, 0666)) < 0) + { + if (errno != try_makedirs_errno) + pfatal ("Can't create file %s", quotearg (bakname)); +@@ -579,10 +579,13 @@ create_file (char const *file, int open_flags, mode_t mode, + static void + copy_to_fd (const char *from, int tofd) + { ++ int from_flags = O_RDONLY | O_BINARY; + int fromfd; + ssize_t i; + +- if ((fromfd = safe_open (from, O_RDONLY | O_BINARY, 0)) < 0) ++ if (! follow_symlinks) ++ from_flags |= O_NOFOLLOW; ++ if ((fromfd = safe_open (from, from_flags, 0)) < 0) + pfatal ("Can't reopen file %s", quotearg (from)); + while ((i = read (fromfd, buf, bufsize)) != 0) + { +@@ -625,6 +628,8 @@ copy_file (char const *from, char const *to, struct stat *tost, + else + { + assert (S_ISREG (mode)); ++ if (! follow_symlinks) ++ to_flags |= O_NOFOLLOW; + tofd = create_file (to, O_WRONLY | O_BINARY | to_flags, mode, + to_dir_known_to_exist); + copy_to_fd (from, tofd); +@@ -640,9 +645,12 @@ copy_file (char const *from, char const *to, struct stat *tost, + void + append_to_file (char const *from, char const *to) + { ++ int to_flags = O_WRONLY | O_APPEND | O_BINARY; + int tofd; + +- if ((tofd = safe_open (to, O_WRONLY | O_BINARY | O_APPEND, 0)) < 0) ++ if (! follow_symlinks) ++ to_flags |= O_NOFOLLOW; ++ if ((tofd = safe_open (to, to_flags, 0)) < 0) + pfatal ("Can't reopen file %s", quotearg (to)); + copy_to_fd (from, tofd); + if (close (tofd) != 0) +-- +cgit v1.0-41-gc330 + diff --git a/pkgs/by-name/gn/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch b/pkgs/by-name/gn/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch new file mode 100644 index 0000000..38caff6 --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/CVE-2019-13638-and-CVE-2018-20969.patch @@ -0,0 +1,38 @@ +From 3fcd042d26d70856e826a42b5f93dc4854d80bf0 Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Fri, 6 Apr 2018 19:36:15 +0200 +Subject: Invoke ed directly instead of using the shell + +* src/pch.c (do_ed_script): Invoke ed directly instead of using a shell +command to avoid quoting vulnerabilities. +--- + src/pch.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/src/pch.c b/src/pch.c +index 4fd5a05..16e001a 100644 +--- a/src/pch.c ++++ b/src/pch.c +@@ -2459,9 +2459,6 @@ do_ed_script (char const *inname, char const *outname, + *outname_needs_removal = true; + copy_file (inname, outname, 0, exclusive, instat.st_mode, true); + } +- sprintf (buf, "%s %s%s", editor_program, +- verbosity == VERBOSE ? "" : "- ", +- outname); + fflush (stdout); + + pid = fork(); +@@ -2470,7 +2467,8 @@ do_ed_script (char const *inname, char const *outname, + else if (pid == 0) + { + dup2 (tmpfd, 0); +- execl ("/bin/sh", "sh", "-c", buf, (char *) 0); ++ assert (outname[0] != '!' && outname[0] != '-'); ++ execlp (editor_program, editor_program, "-", outname, (char *) NULL); + _exit (2); + } + else +-- +cgit v1.0-41-gc330 + diff --git a/pkgs/by-name/gn/gnupatch/default.nix b/pkgs/by-name/gn/gnupatch/default.nix new file mode 100644 index 0000000..c19e087 --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/default.nix @@ -0,0 +1,60 @@ +{ lib, stdenv, fetchurl +, ed, autoreconfHook +}: + +stdenv.mkDerivation rec { + pname = "patch"; + version = "2.7.6"; + + src = fetchurl { + url = "mirror://gnu/patch/patch-${version}.tar.xz"; + sha256 = "1zfqy4rdcy279vwn2z1kbv19dcfw25d2aqy9nzvdkq5bjzd0nqdc"; + }; + + patches = [ + # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=f290f48a621867084884bfff87f8093c15195e6a + ./CVE-2018-6951.patch + + # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=b5a91a01e5d0897facdd0f49d64b76b0f02b43e1 + ./Allow_input_files_to_be_missing_for_ed-style_patches.patch + + # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=123eaff0d5d1aebe128295959435b9ca5909c26d + ./CVE-2018-1000156.patch + + # https://git.savannah.gnu.org/cgit/patch.git/commit/?id=9c986353e420ead6e706262bf204d6e03322c300 + ./CVE-2018-6952.patch + + # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=dce4683cbbe107a95f1f0d45fabc304acfb5d71a + ./CVE-2019-13636.patch + + # https://git.savannah.gnu.org/cgit/patch.git/patch/?id=3fcd042d26d70856e826a42b5f93dc4854d80bf0 + ./CVE-2019-13638-and-CVE-2018-20969.patch + ]; + + nativeBuildInputs = [ autoreconfHook ]; + + configureFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "ac_cv_func_strnlen_working=yes" + ]; + + doCheck = stdenv.hostPlatform.libc != "musl"; # not cross; + nativeCheckInputs = [ed]; + + meta = { + description = "GNU Patch, a program to apply differences to files"; + mainProgram = "patch"; + + longDescription = + '' GNU Patch takes a patch file containing a difference listing + produced by the diff program and applies those differences to one or + more original files, producing patched versions. + ''; + + homepage = "https://savannah.gnu.org/projects/patch"; + + license = lib.licenses.gpl3Plus; + + maintainers = [ ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/gn/gnupatch/packages.nix b/pkgs/by-name/gn/gnupatch/packages.nix new file mode 100644 index 0000000..a4025d7 --- /dev/null +++ b/pkgs/by-name/gn/gnupatch/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gnupatch = callPackage ./. { }; + patch = gnupatch; +} diff --git a/pkgs/by-name/gn/gnused/default.nix b/pkgs/by-name/gn/gnused/default.nix new file mode 100644 index 0000000..f493e4f --- /dev/null +++ b/pkgs/by-name/gn/gnused/default.nix @@ -0,0 +1,39 @@ +{ lib, stdenv, fetchurl, perl }: + +stdenv.mkDerivation rec { + pname = "gnused"; + version = "4.9"; + + src = fetchurl { + url = "mirror://gnu/sed/sed-${version}.tar.xz"; + sha256 = "sha256-biJrcy4c1zlGStaGK9Ghq6QteYKSLaelNRljHSSXUYE="; + }; + + outputs = [ "out" "info" ]; + + nativeBuildInputs = [ perl ]; + preConfigure = "patchShebangs ./build-aux/help2man"; + + # Prevents attempts of running 'help2man' on cross-built binaries. + PERL = if stdenv.hostPlatform == stdenv.buildPlatform then null else "missing"; + + meta = { + homepage = "https://www.gnu.org/software/sed/"; + description = "GNU sed, a batch stream editor"; + + longDescription = '' + Sed (stream editor) isn't really a true text editor or text + processor. Instead, it is used to filter text, i.e., it takes + text input and performs some operation (or set of operations) on + it and outputs the modified text. Sed is typically used for + extracting part of a file using pattern matching or substituting + multiple occurrences of a string within a file. + ''; + + license = lib.licenses.gpl3Plus; + + platforms = lib.platforms.unix; + maintainers = with lib.maintainers; [ mic92 ]; + mainProgram = "sed"; + }; +} diff --git a/pkgs/by-name/gn/gnutar/default.nix b/pkgs/by-name/gn/gnutar/default.nix new file mode 100644 index 0000000..331d977 --- /dev/null +++ b/pkgs/by-name/gn/gnutar/default.nix @@ -0,0 +1,78 @@ +{ lib, stdenv, fetchurl, autoreconfHook, acl, libintl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "gnutar"; + version = "1.35"; + + src = fetchurl { + url = "mirror://gnu/tar/tar-${version}.tar.xz"; + sha256 = "sha256-TWL/NzQux67XSFNTI5MMfPlKz3HDWRiCsmp+pQ8+3BY="; + }; + + # avoid retaining reference to CF during stdenv bootstrap + configureFlags = lib.optionals stdenv.isDarwin [ + "gt_cv_func_CFPreferencesCopyAppValue=no" + "gt_cv_func_CFLocaleCopyCurrent=no" + "gt_cv_func_CFLocaleCopyPreferredLanguages=no" + ]; + + # gnutar tries to call into gettext between `fork` and `exec`, + # which is not safe on darwin. + # see http://article.gmane.org/gmane.os.macosx.fink.devel/21882 + postPatch = lib.optionalString stdenv.isDarwin '' + substituteInPlace src/system.c --replace '_(' 'N_(' + ''; + + outputs = [ "out" "info" ]; + + nativeBuildInputs = lib.optional stdenv.isDarwin autoreconfHook; + # Add libintl on Darwin specifically as it fails to link (or skip) + # NLS on it's own: + # "_libintl_textdomain", referenced from: + # _main in tar.o + # ld: symbol(s) not found for architecture x86_64 + buildInputs = lib.optional stdenv.isLinux acl ++ lib.optional stdenv.isDarwin libintl; + + # May have some issues with root compilation because the bootstrap tool + # cannot be used as a login shell for now. + FORCE_UNSAFE_CONFIGURE = lib.optionalString (stdenv.hostPlatform.system == "armv7l-linux" || stdenv.isSunOS) "1"; + + preConfigure = if stdenv.isCygwin then '' + sed -i gnu/fpending.h -e 's,include ,,' + '' else null; + + doCheck = false; # fails + doInstallCheck = false; # fails + + meta = { + description = "GNU implementation of the `tar' archiver"; + longDescription = '' + The Tar program provides the ability to create tar archives, as + well as various other kinds of manipulation. For example, you + can use Tar on previously created archives to extract files, to + store additional files, or to update or list files which were + already stored. + + Initially, tar archives were used to store files conveniently on + magnetic tape. The name "Tar" comes from this use; it stands + for tape archiver. Despite the utility's name, Tar can direct + its output to available devices, files, or other programs (using + pipes), it can even access remote devices or files (as + archives). + ''; + homepage = "https://www.gnu.org/software/tar/"; + + license = lib.licenses.gpl3Plus; + + maintainers = [ ]; + mainProgram = "tar"; + platforms = lib.platforms.all; + + priority = 10; + }; +} diff --git a/pkgs/by-name/gn/gnutls/default.nix b/pkgs/by-name/gn/gnutls/default.nix new file mode 100644 index 0000000..28eb6a8 --- /dev/null +++ b/pkgs/by-name/gn/gnutls/default.nix @@ -0,0 +1,187 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch2 +, zlib +, lzo +, libtasn1 +, nettle +, pkg-config +, lzip +, perl +, gmp +, autoconf +, automake +, libidn2 +, libiconv +, texinfo +, unbound +, dns-root-data +, gettext +, util-linux +, cxxBindings ? !stdenv.hostPlatform.isStatic # tries to link libstdc++.so +, tpmSupport ? false +, trousers +, which +, nettools +, libunistring +, withP11-kit ? !stdenv.hostPlatform.isStatic +, p11-kit +, Security # darwin Security.framework + # certificate compression - only zlib now, more possible: zstd, brotli + + # for passthru.tests +# , curlWithGnuTls +# , emacs +# , ffmpeg +# , haskellPackages +# , knot-resolver +# , ngtcp2-gnutls +# , ocamlPackages +# , pkgsStatic +# , python3Packages +# , qemu +# , rsyslog +# , openconnect +# , samba +}: + +let + + # XXX: Gnulib's `test-select' fails on FreeBSD: + # https://hydra.nixos.org/build/2962084/nixlog/1/raw . + doCheck = !stdenv.isFreeBSD && !stdenv.isDarwin + && stdenv.buildPlatform == stdenv.hostPlatform; + + inherit (stdenv.hostPlatform) isDarwin; +in + +stdenv.mkDerivation rec { + pname = "gnutls"; + version = "3.8.4"; + + src = fetchurl { + url = "mirror://gnupg/gnutls/v${lib.versions.majorMinor version}/gnutls-${version}.tar.xz"; + hash = "sha256-K+pOFUeU8/ABgPoqXFH+iwBax6Mc1YvUTN+n8268Ops="; + }; + + outputs = [ "bin" "dev" "out" ] + ++ lib.optionals (!stdenv.hostPlatform.isMinGW) [ "man" "devdoc" ]; + + # Not normally useful docs. + outputInfo = "devdoc"; + outputDoc = "devdoc"; + + patches = [ + ./nix-ssl-cert-file.patch + # Revert https://gitlab.com/gnutls/gnutls/-/merge_requests/1800 + # dlopen isn't as easy in NixPkgs, as noticed in tests broken by this. + # Without getting the libs into RPATH they won't be found. + (fetchpatch2 { + name = "revert-dlopen-compression.patch"; + url = "https://gitlab.com/gnutls/gnutls/-/commit/8584908d6b679cd4e7676de437117a793e18347c.diff"; + revert = true; + hash = "sha256-r/+Gmwqy0Yc1LHL/PdPLXlErUBC5JxquLzCBAN3LuRM="; + }) + ]; + + # Skip some tests: + # - pkg-config: building against the result won't work before installing (3.5.11) + # - fastopen: no idea; it broke between 3.6.2 and 3.6.3 (3437fdde6 in particular) + # - trust-store: default trust store path (/etc/ssl/...) is missing in sandbox (3.5.11) + # - psk-file: no idea; it broke between 3.6.3 and 3.6.4 + # Change p11-kit test to use pkg-config to find p11-kit + postPatch = '' + sed '2iexit 77' -i tests/{pkgconfig,fastopen}.sh + sed '/^void doit(void)/,/^{/ s/{/{ exit(77);/' -i tests/{trust-store,psk-file}.c + sed 's:/usr/lib64/pkcs11/ /usr/lib/pkcs11/ /usr/lib/x86_64-linux-gnu/pkcs11/:`pkg-config --variable=p11_module_path p11-kit-1`:' -i tests/p11-kit-trust.sh + '' + lib.optionalString stdenv.hostPlatform.isMusl '' # See https://gitlab.com/gnutls/gnutls/-/issues/945 + sed '2iecho "certtool tests skipped in musl build"\nexit 0' -i tests/cert-tests/certtool.sh + '' + lib.optionalString stdenv.hostPlatform.isStatic '' + # Adapted from https://gitlab.com/gnutls/gnutls/-/commit/d214cd4570fb1559a20e941bb7ceac7df52e96d3 + # Can be removed with 3.8.5+. + sed -i lib/nettle/backport/rsa-sign-tr.c -e \ + '/^#include /i\ + #define nettle_rsa_compute_root_tr _gnutls_nettle_backport_rsa_compute_root_tr' + ''; + + preConfigure = "patchShebangs ."; + configureFlags = + lib.optionals withP11-kit [ + "--with-default-trust-store-file=/etc/ssl/certs/ca-certificates.crt" + "--with-default-trust-store-pkcs11=pkcs11:" + ] ++ [ + "--disable-dependency-tracking" + "--enable-fast-install" + "--with-unbound-root-key-file=${dns-root-data}/root.key" + (lib.withFeature withP11-kit "p11-kit") + (lib.enableFeature cxxBindings "cxx") + ] ++ lib.optionals (stdenv.hostPlatform.isMinGW) [ + "--disable-doc" + ]; + + enableParallelBuilding = true; + + hardeningDisable = [ "trivialautovarinit" ]; + + buildInputs = [ lzo lzip libtasn1 libidn2 zlib gmp libunistring unbound gettext libiconv ] + ++ lib.optional (withP11-kit) p11-kit + ++ lib.optional (tpmSupport && stdenv.isLinux) trousers; + + nativeBuildInputs = [ perl pkg-config texinfo ] ++ [ autoconf automake ] + ++ lib.optionals doCheck [ which nettools util-linux ]; + + propagatedBuildInputs = [ nettle ] + # Builds dynamically linking against gnutls seem to need the framework now. + ++ lib.optional isDarwin Security; + + inherit doCheck; + # stdenv's `NIX_SSL_CERT_FILE=/no-cert-file.crt` breaks tests. + # Also empty files won't work, and we want to avoid potentially impure /etc/ + preCheck = "NIX_SSL_CERT_FILE=${./dummy.crt}"; + + # Fixup broken libtool and pkg-config files + preFixup = lib.optionalString (!isDarwin) '' + sed ${lib.optionalString tpmSupport "-e 's,-ltspi,-L${trousers}/lib -ltspi,'"} \ + -e 's,-lz,-L${zlib.out}/lib -lz,' \ + -e 's,-L${gmp.dev}/lib,-L${gmp.out}/lib,' \ + -e 's,-lgmp,-L${gmp.out}/lib -lgmp,' \ + -i $out/lib/*.la "$dev/lib/pkgconfig/gnutls.pc" + '' + '' + # It seems only useful for static linking but basically noone does that. + substituteInPlace "$out/lib/libgnutls.la" \ + --replace "-lunistring" "" + ''; + + # passthru.tests = { + # inherit ngtcp2-gnutls curlWithGnuTls ffmpeg emacs qemu knot-resolver samba openconnect; + # inherit (ocamlPackages) ocamlnet; + # haskell-gnutls = haskellPackages.gnutls; + # python3-gnutls = python3Packages.python3-gnutls; + # rsyslog = rsyslog.override { withGnutls = true; }; + # static = pkgsStatic.gnutls; + # }; + + meta = with lib; { + description = "The GNU Transport Layer Security Library"; + + longDescription = '' + GnuTLS is a project that aims to develop a library which + provides a secure layer, over a reliable transport + layer. Currently the GnuTLS library implements the proposed standards by + the IETF's TLS working group. + + Quoting from the TLS protocol specification: + + "The TLS protocol provides communications privacy over the + Internet. The protocol allows client/server applications to + communicate in a way that is designed to prevent eavesdropping, + tampering, or message forgery." + ''; + + homepage = "https://gnutls.org/"; + license = licenses.lgpl21Plus; + maintainers = with maintainers; [ vcunat ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gn/gnutls/dummy.crt b/pkgs/by-name/gn/gnutls/dummy.crt new file mode 100644 index 0000000..77300f6 --- /dev/null +++ b/pkgs/by-name/gn/gnutls/dummy.crt @@ -0,0 +1,45 @@ +ACCVRAIZ1 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- diff --git a/pkgs/by-name/gn/gnutls/nix-ssl-cert-file.patch b/pkgs/by-name/gn/gnutls/nix-ssl-cert-file.patch new file mode 100644 index 0000000..c0f27f7 --- /dev/null +++ b/pkgs/by-name/gn/gnutls/nix-ssl-cert-file.patch @@ -0,0 +1,17 @@ +allow overriding system trust store location via $NIX_SSL_CERT_FILE + +--- a/lib/system/certs.c ++++ b/lib/system/certs.c +@@ -404,6 +404,10 @@ gnutls_x509_trust_list_add_system_trust(gnutls_x509_trust_list_t list, + unsigned int tl_flags, + unsigned int tl_vflags) + { +- return add_system_trust(list, tl_flags | GNUTLS_TL_NO_DUPLICATES, +- tl_vflags); ++ tl_flags = tl_flags|GNUTLS_TL_NO_DUPLICATES; ++ const char *file = secure_getenv("NIX_SSL_CERT_FILE"); ++ return file ++ ? gnutls_x509_trust_list_add_trust_file( ++ list, file, NULL/*CRL*/, GNUTLS_X509_FMT_PEM, tl_flags, tl_vflags) ++ : add_system_trust(list, tl_flags, tl_vflags); + } diff --git a/pkgs/by-name/gn/gnutls/packages.nix b/pkgs/by-name/gn/gnutls/packages.nix new file mode 100644 index 0000000..f595e4f --- /dev/null +++ b/pkgs/by-name/gn/gnutls/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gnutls = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + util-linux = util-linuxMinimal; # break the cyclic dependency + autoconf = buildPackages.autoconf269; + }; +} diff --git a/pkgs/by-name/gp/gperf/3.0.x.nix b/pkgs/by-name/gp/gperf/3.0.x.nix new file mode 100644 index 0000000..bceef75 --- /dev/null +++ b/pkgs/by-name/gp/gperf/3.0.x.nix @@ -0,0 +1,48 @@ +{ lib, stdenv, fetchurl, autoreconfHook }: + +stdenv.mkDerivation rec { + pname = "gperf"; + version = "3.0.4"; + + src = fetchurl { + url = "mirror://gnu/gperf/gperf-${version}.tar.gz"; + sha256 = "0gnnm8iqcl52m8iha3sxrzrl9mcyhg7lfrhhqgdn4zj00ji14wbn"; + }; + + nativeBuildInputs = [ autoreconfHook ]; + patches = [ + ./gperf-ar-fix.patch + # Clang 16 defaults to C++17, which does not allow `register` as a storage class specifier. + ./gperf-c++17-register-fix.patch + ]; + + # Replace the conditional inclusion of `string.h` on VMS with unconditional inclusion on all + # platforms. Otherwise, clang 16 fails to build gperf due to use of undeclared library functions. + postPatch = '' + sed '/#ifdef VMS/{N;N;N;N;N;s/.*/#include /}' -i lib/getopt.c + ''; + + meta = { + description = "Perfect hash function generator"; + mainProgram = "gperf"; + + longDescription = '' + GNU gperf is a perfect hash function generator. For a given + list of strings, it produces a hash function and hash table, in + form of C or C++ code, for looking up a value depending on the + input string. The hash function is perfect, which means that + the hash table has no collisions, and the hash table lookup + needs a single string comparison only. + + GNU gperf is highly customizable. There are options for + generating C or C++ code, for emitting switch statements or + nested ifs instead of a hash table, and for tuning the algorithm + employed by gperf. + ''; + + license = lib.licenses.gpl3Plus; + + homepage = "https://www.gnu.org/software/gperf/"; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/gp/gperf/default.nix b/pkgs/by-name/gp/gperf/default.nix new file mode 100644 index 0000000..bdc3b7a --- /dev/null +++ b/pkgs/by-name/gp/gperf/default.nix @@ -0,0 +1,42 @@ +{lib, stdenv, fetchurl}: + +stdenv.mkDerivation rec { + pname = "gperf"; + version = "3.1"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz"; + sha256 = "1qispg6i508rq8pkajh26cznwimbnj06wq9sd85vg95v8nwld1aq"; + }; + + patches = [ + # Clang 16 defaults to C++17, which does not allow `register` as a storage class specifier. + ./gperf-c++17-register-fix.patch + ]; + + enableParallelBuilding = true; + + meta = { + description = "Perfect hash function generator"; + + longDescription = '' + GNU gperf is a perfect hash function generator. For a given + list of strings, it produces a hash function and hash table, in + form of C or C++ code, for looking up a value depending on the + input string. The hash function is perfect, which means that + the hash table has no collisions, and the hash table lookup + needs a single string comparison only. + + GNU gperf is highly customizable. There are options for + generating C or C++ code, for emitting switch statements or + nested ifs instead of a hash table, and for tuning the algorithm + employed by gperf. + ''; + + license = lib.licenses.gpl3Plus; + + homepage = "https://www.gnu.org/software/gperf/"; + platforms = lib.platforms.unix; + mainProgram = "gperf"; + }; +} diff --git a/pkgs/by-name/gp/gperf/gperf-ar-fix.patch b/pkgs/by-name/gp/gperf/gperf-ar-fix.patch new file mode 100644 index 0000000..942d726 --- /dev/null +++ b/pkgs/by-name/gp/gperf/gperf-ar-fix.patch @@ -0,0 +1,46 @@ +--- gperf-3.0.4/lib/configure.ac 2009-01-15 02:24:31.000000000 +0200 ++++ gperf-3.0.4.patched/lib/configure.ac 2018-11-29 06:37:20.968627533 +0300 +@@ -21,10 +21,12 @@ + + AC_PREREQ([2.60]) + AC_INIT([hash.cc]) ++m4_include([../aclocal.m4]) + AC_PROG_MAKE_SET + dnl + dnl checks for programs + dnl ++AC_SUBST([AR]) + AC_PROG_CC + dnl sets variable CC + AC_PROG_CPP +--- gperf-3.0.4/lib/Makefile.in 2008-08-23 21:52:48.000000000 +0300 ++++ gperf-3.0.4.patched/lib/Makefile.in 2018-11-29 06:36:43.161998888 +0300 +@@ -41,7 +41,7 @@ + # Both C and C++ compiler + OBJEXT = @OBJEXT@ + # Other +-AR = ar ++AR = @AR@ + AR_FLAGS = rc + RANLIB = @RANLIB@ + MV = mv +--- gperf-3.0.4/doc/configure.ac 2009-01-15 02:24:31.000000000 +0200 ++++ gperf-3.0.4.patched/doc/configure.ac 2018-11-29 06:36:00.961288421 +0300 +@@ -21,6 +21,7 @@ + + AC_PREREQ([2.60]) + AC_INIT([gperf.1]) ++m4_include([../aclocal.m4]) + PACKAGE=gperf + AC_SUBST([PACKAGE]) + AC_PROG_MAKE_SET +--- gperf-3.0.4/src/configure.ac 2009-01-15 02:24:30.000000000 +0200 ++++ gperf-3.0.4.patched/src/configure.ac 2018-11-29 06:34:21.718576658 +0300 +@@ -21,6 +21,7 @@ + + AC_PREREQ([2.60]) + AC_INIT([main.cc]) ++m4_include([../aclocal.m4]) + AC_CONFIG_HEADER([config.h]) + AC_PROG_MAKE_SET + dnl diff --git a/pkgs/by-name/gp/gperf/gperf-c++17-register-fix.patch b/pkgs/by-name/gp/gperf/gperf-c++17-register-fix.patch new file mode 100644 index 0000000..bb8c414 --- /dev/null +++ b/pkgs/by-name/gp/gperf/gperf-c++17-register-fix.patch @@ -0,0 +1,13 @@ +diff --git a/lib/getline.cc b/lib/getline.cc +index c57c633..0984a7c 100644 +--- a/lib/getline.cc ++++ b/lib/getline.cc +@@ -55,7 +55,7 @@ getstr (char **lineptr, size_t *n, FILE *stream, char terminator, size_t offset) + + for (;;) + { +- register int c = getc (stream); ++ int c = getc (stream); + + /* We always want at least one char left in the buffer, since we + always (unless we get an error while reading the first char) diff --git a/pkgs/by-name/gp/gperf/packages.nix b/pkgs/by-name/gp/gperf/packages.nix new file mode 100644 index 0000000..a91b33b --- /dev/null +++ b/pkgs/by-name/gp/gperf/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gperf = callPackage ./. { }; + # 3.1 changed some parameters from int to size_t, leading to mismatches. + gperf_3_0 = callPackage ./3.0.x.nix { }; +} diff --git a/pkgs/by-name/gp/gpm/default.nix b/pkgs/by-name/gp/gpm/default.nix new file mode 100644 index 0000000..1c083b8 --- /dev/null +++ b/pkgs/by-name/gp/gpm/default.nix @@ -0,0 +1,65 @@ +{ lib, stdenv, fetchFromGitHub, automake, autoconf, libtool, flex, bison, texinfo, fetchpatch, pkgsStatic +, withNcurses ? true, ncurses +}: + +stdenv.mkDerivation rec { + pname = "gpm"; + version = "unstable-2020-06-17"; + + src = fetchFromGitHub { + owner = "telmich"; + repo = "gpm"; + rev = "e82d1a653ca94aa4ed12441424da6ce780b1e530"; + sha256 = "0ndn6dwc87slvyqp2cnbb02a6hkjwb6zjhs6viysykv06hq7ihy6"; + }; + + postPatch = '' + substituteInPlace src/prog/gpm-root.y --replace __sigemptyset sigemptyset + ''; + + nativeBuildInputs = [ automake autoconf libtool flex bison texinfo ]; + buildInputs = [ ncurses ]; + + hardeningDisable = [ "format" ]; + + patches = [ + (fetchpatch { # pull request telmich/gpm#42 + url = "https://github.com/kaction/gpm/commit/217b4fe4c9b62298a4e9a54c1f07e3b52b013a09.patch"; + sha256 = "1f74h12iph4z1dldbxk9imcq11805c3ai2xhbsqvx8jpjrcfp19q"; + }) + + # Pull fix pending upstream inclusion to fix parallel installation: + # https://github.com/telmich/gpm/pull/43 + (fetchpatch { + name = "parallel-install.patch"; + url = "https://github.com/telmich/gpm/commit/a88fb82a7afe96e872bb31c554e9ad5888f5a451.patch"; + sha256 = "0g1jhz9bjw7vqjv922xkhs8xkjxdqh11nj38jj3c8nv5lcil76nx"; + }) + ]; + preConfigure = '' + ./autogen.sh + ''; + + configureFlags = [ + "--sysconfdir=/etc" + "--localstatedir=/var" + (if withNcurses then "--with-curses" else "--without-curses") + ]; + + enableParallelBuilding = true; + + # Provide libgpm.so for compatibility + postInstall = '' + ln -sv $out/lib/libgpm.so.2 $out/lib/libgpm.so + ''; + + passthru.tests.static = pkgsStatic.gpm; + + meta = with lib; { + homepage = "https://www.nico.schottelius.org/software/gpm/"; + description = "A daemon that provides mouse support on the Linux console"; + license = licenses.gpl2; + platforms = platforms.linux ++ platforms.cygwin; + maintainers = with maintainers; [ eelco ]; + }; +} diff --git a/pkgs/by-name/gp/gpm/packages.nix b/pkgs/by-name/gp/gpm/packages.nix new file mode 100644 index 0000000..f900d7b --- /dev/null +++ b/pkgs/by-name/gp/gpm/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + gpm = callPackage ./. { + withNcurses = false; # Keep curses disabled for lack of value + + # latest 6.8 mysteriously fails to parse '@headings single': + # https://lists.gnu.org/archive/html/bug-texinfo/2021-09/msg00011.html + texinfo = buildPackages.texinfo6_7; + }; + gpm-ncurses = gpm.override { withNcurses = true; }; +} diff --git a/pkgs/by-name/gr/graphviz/default.nix b/pkgs/by-name/gr/graphviz/default.nix new file mode 100644 index 0000000..dfa994d --- /dev/null +++ b/pkgs/by-name/gr/graphviz/default.nix @@ -0,0 +1,114 @@ +{ lib +, stdenv +, fetchFromGitLab +, autoreconfHook +, pkg-config +, cairo +, expat +, flex +, fontconfig +, gd +, gts +, libjpeg +, libpng +, libtool +, pango +, bash +, bison +, xorg +, ApplicationServices +, Foundation +, python3 +, withXorg ? true + +# for passthru.tests +# , exiv2 +# , fltk +# , graphicsmagick +}: + +let + inherit (lib) optional optionals optionalString; +in +stdenv.mkDerivation rec { + pname = "graphviz"; + version = "10.0.1"; + + src = fetchFromGitLab { + owner = "graphviz"; + repo = "graphviz"; + rev = version; + hash = "sha256-KAqJUVqPld3F2FHlUlfbw848GPXXOmyRQkab8jlH1NM="; + }; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + python3 + bison + flex + ]; + + buildInputs = [ + libpng + libjpeg + expat + fontconfig + gd + gts + pango + bash + ] ++ optionals withXorg (with xorg; [ libXrender libXaw libXpm ]) + ++ optionals stdenv.isDarwin [ ApplicationServices Foundation ]; + + hardeningDisable = [ "fortify" ]; + + configureFlags = [ + "--with-ltdl-lib=${libtool.lib}/lib" + "--with-ltdl-include=${libtool}/include" + ] ++ optional (xorg == null) "--without-x"; + + enableParallelBuilding = true; + + CPPFLAGS = optionalString (withXorg && stdenv.isDarwin) + "-I${cairo.dev}/include/cairo"; + + doCheck = false; # fails with "Graphviz test suite requires ksh93" which is not in nixpkgs + + preAutoreconf = '' + # components under this directory require a tool `CompileXIB` to build + # and there's no official way to disable this on darwin. + substituteInPlace Makefile.am --replace-fail 'SUBDIRS += macosx' "" + + ./autogen.sh + ''; + + postFixup = optionalString withXorg '' + substituteInPlace $out/bin/vimdot \ + --replace '"/usr/bin/vi"' '"$(command -v vi)"' \ + --replace '"/usr/bin/vim"' '"$(command -v vim)"' \ + --replace /usr/bin/vimdot $out/bin/vimdot \ + ''; + + # passthru.tests = { + # inherit (python3.pkgs) + # graphviz + # pydot + # pygraphviz + # xdot + # ; + # inherit + # exiv2 + # fltk + # graphicsmagick + # ; + # }; + + meta = with lib; { + homepage = "https://graphviz.org"; + description = "Graph visualization tools"; + license = licenses.epl10; + platforms = platforms.unix; + maintainers = with maintainers; [ bjornfor raskin ]; + }; +} diff --git a/pkgs/by-name/gr/graphviz/packages.nix b/pkgs/by-name/gr/graphviz/packages.nix new file mode 100644 index 0000000..045d21e --- /dev/null +++ b/pkgs/by-name/gr/graphviz/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + graphviz = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) ApplicationServices Foundation; + }; + + graphviz-nox = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) ApplicationServices Foundation; + withXorg = false; + }; +} diff --git a/pkgs/by-name/gr/groff/default.nix b/pkgs/by-name/gr/groff/default.nix new file mode 100644 index 0000000..df06292 --- /dev/null +++ b/pkgs/by-name/gr/groff/default.nix @@ -0,0 +1,136 @@ +{ lib, stdenv, fetchurl, fetchpatch, perl +, enableGhostscript ? false +, ghostscript, gawk, libX11, libXaw, libXt, libXmu # for postscript and html output +, enableHtml ? false, psutils, netpbm # for html output +, enableIconv ? false, iconv +, enableLibuchardet ? false, libuchardet # for detecting input file encoding in preconv(1) +, buildPackages +, autoreconfHook +, pkg-config +, texinfo +, bison +, bash +}: + +stdenv.mkDerivation rec { + pname = "groff"; + version = "1.23.0"; + + src = fetchurl { + url = "mirror://gnu/groff/${pname}-${version}.tar.gz"; + hash = "sha256-a5dX9ZK3UYtJAutq9+VFcL3Mujeocf3bLTCuOGNRHBM="; + }; + + outputs = [ "out" "man" "doc" "info" "perl" ]; + + enableParallelBuilding = true; + + postPatch = '' + # BASH_PROG gets replaced with a path to the build bash which doesn't get automatically patched by patchShebangs + substituteInPlace contrib/gdiffmk/gdiffmk.sh \ + --replace "@BASH_PROG@" "/bin/sh" + '' + lib.optionalString enableHtml '' + substituteInPlace src/preproc/html/pre-html.cpp \ + --replace "psselect" "${psutils}/bin/psselect" \ + --replace "pnmcut" "${lib.getBin netpbm}/bin/pnmcut" \ + --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \ + --replace "pnmtopng" "${lib.getBin netpbm}/bin/pnmtopng" + substituteInPlace tmac/www.tmac.in \ + --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \ + --replace "pngtopnm" "${lib.getBin netpbm}/bin/pngtopnm" \ + --replace "@PNMTOPS_NOSETPAGE@" "${lib.getBin netpbm}/bin/pnmtops -nosetpage" + '' + lib.optionalString (enableGhostscript || enableHtml) '' + substituteInPlace contrib/pdfmark/pdfroff.sh \ + --replace '$GROFF_GHOSTSCRIPT_INTERPRETER' "${lib.getBin ghostscript}/bin/gs" \ + --replace '$GROFF_AWK_INTERPRETER' "${lib.getBin gawk}/bin/gawk" + ''; + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook pkg-config texinfo ] + # Required due to the patch that changes .ypp files. + ++ lib.optional (stdenv.cc.isClang && lib.versionAtLeast stdenv.cc.version "9") bison; + buildInputs = [ perl bash ] + ++ lib.optionals enableGhostscript [ ghostscript gawk libX11 libXaw libXt libXmu ] + ++ lib.optionals enableHtml [ psutils netpbm ] + ++ lib.optionals enableIconv [ iconv ] + ++ lib.optionals enableLibuchardet [ libuchardet ]; + + # Builds running without a chroot environment may detect the presence + # of /usr/X11 in the host system, leading to an impure build of the + # package. To avoid this issue, X11 support is explicitly disabled. + configureFlags = lib.optionals (!enableGhostscript) [ + "--without-x" + ] ++ [ + "ac_cv_path_PERL=${buildPackages.perl}/bin/perl" + ] ++ lib.optionals enableGhostscript [ + "--with-gs=${lib.getBin ghostscript}/bin/gs" + "--with-awk=${lib.getBin gawk}/bin/gawk" + "--with-appresdir=${placeholder "out"}/lib/X11/app-defaults" + ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "gl_cv_func_signbit=yes" + ]; + + makeFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + # Trick to get the build system find the proper 'native' groff + # http://www.mail-archive.com/bug-groff@gnu.org/msg01335.html + "GROFF_BIN_PATH=${buildPackages.groff}/bin" + "GROFFBIN=${buildPackages.groff}/bin/groff" + ]; + + doCheck = true; + + postInstall = '' + for f in 'man.local' 'mdoc.local'; do + cat '${./site.tmac}' >>"$out/share/groff/site-tmac/$f" + done + + moveToOutput bin/gropdf $perl + moveToOutput bin/pdfmom $perl + moveToOutput bin/roff2text $perl + moveToOutput bin/roff2pdf $perl + moveToOutput bin/roff2ps $perl + moveToOutput bin/roff2dvi $perl + moveToOutput bin/roff2ps $perl + moveToOutput bin/roff2html $perl + moveToOutput bin/glilypond $perl + moveToOutput bin/mmroff $perl + moveToOutput bin/roff2x $perl + moveToOutput bin/afmtodit $perl + moveToOutput bin/gperl $perl + moveToOutput bin/chem $perl + + moveToOutput bin/gpinyin $perl + moveToOutput lib/groff/gpinyin $perl + substituteInPlace $perl/bin/gpinyin \ + --replace $out/lib/groff/gpinyin $perl/lib/groff/gpinyin + + moveToOutput bin/grog $perl + moveToOutput lib/groff/grog $perl + substituteInPlace $perl/bin/grog \ + --replace $out/lib/groff/grog $perl/lib/groff/grog + + find $perl/ -type f -print0 | xargs --null sed -i 's|${buildPackages.perl}|${perl}|' + ''; + + meta = with lib; { + homepage = "https://www.gnu.org/software/groff/"; + description = "GNU Troff, a typesetting package that reads plain text and produces formatted output"; + license = licenses.gpl3Plus; + platforms = platforms.all; + maintainers = with maintainers; [ pSub ]; + + longDescription = '' + groff is the GNU implementation of troff, a document formatting + system. Included in this release are implementations of troff, + pic, eqn, tbl, grn, refer, -man, -mdoc, -mom, and -ms macros, + and drivers for PostScript, TeX dvi format, HP LaserJet 4 + printers, Canon CAPSL printers, HTML and XHTML format (beta + status), and typewriter-like devices. Also included is a + modified version of the Berkeley -me macros, the enhanced + version gxditview of the X11 xditview previewer, and an + implementation of the -mm macros. + ''; + + outputsToInstall = [ "out" "perl" ]; + }; +} diff --git a/pkgs/by-name/gr/groff/site.tmac b/pkgs/by-name/gr/groff/site.tmac new file mode 100644 index 0000000..6f0f18d --- /dev/null +++ b/pkgs/by-name/gr/groff/site.tmac @@ -0,0 +1,26 @@ +. +.if n \{\ +. \" With groff 1.23.0 "[t]he 'utf8' output device now maps the input +. \" characters '^' (caret, circumflex accent, or 'hat') and '~' (tilde) +. \" to U+02C6 (modifier letter circumflex accent) and U+02DC (small tilde), +. \" respectively, for consistency with groff's other output devices. +. \" This change is expected to expose glyph usage errors in man pages. +. \" See [http://git.savannah.gnu.org/cgit/groff.git/tree/PROBLEMS] for +. \" a recipe that will conceal these errors" +. \" -- https://lists.gnu.org/archive/html/groff/2023-07/msg00051.html +. \" +. \" Conceal glyph usage errors in man pages with the following +. \" character translations for non-keyboard characters to make them searchable. +. if '\*[.T]'utf8' \{\ +. char \- \N'45' +. char - \N'45' +. char \' \[aq] +. char ' \[aq] +. char ` \[ga] +. char ^ \[ha] +. char ~ \[ti] +. \} +.\} +. +.ds doc-default-operating-system Nixpkgs +.ds doc-volume-operating-system Nixpkgs diff --git a/pkgs/by-name/gr/grpc/default.nix b/pkgs/by-name/gr/grpc/default.nix new file mode 100644 index 0000000..46a75fc --- /dev/null +++ b/pkgs/by-name/gr/grpc/default.nix @@ -0,0 +1,114 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, buildPackages +, cmake +, zlib +, c-ares +, pkg-config +, re2 +, openssl +, protobuf +, grpc +, abseil-cpp +, libnsl + +# for passthru.tests +# , python3 +# , arrow-cpp +}: + +stdenv.mkDerivation rec { + pname = "grpc"; + version = "1.62.1"; # N.B: if you change this, please update: + # pythonPackages.grpcio-tools + # pythonPackages.grpcio-status + + src = fetchFromGitHub { + owner = "grpc"; + repo = "grpc"; + rev = "v${version}"; + hash = "sha256-L0bn6Bg36UKIRxznH9o4T7WXUqMwFjr8ybeQfbUi8xM="; + fetchSubmodules = true; + }; + + patches = [ + (fetchpatch { + # armv6l support, https://github.com/grpc/grpc/pull/21341 + name = "grpc-link-libatomic.patch"; + url = "https://github.com/lopsided98/grpc/commit/a9b917666234f5665c347123d699055d8c2537b2.patch"; + hash = "sha256-Lm0GQsz/UjBbXXEE14lT0dcRzVmCKycrlrdBJj+KLu8="; + }) + ]; + + nativeBuildInputs = [ cmake pkg-config ] + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) grpc; + propagatedBuildInputs = [ c-ares re2 zlib abseil-cpp ]; + buildInputs = [ openssl protobuf ] + ++ lib.optionals stdenv.isLinux [ libnsl ]; + + cmakeFlags = [ + "-DgRPC_ZLIB_PROVIDER=package" + "-DgRPC_CARES_PROVIDER=package" + "-DgRPC_RE2_PROVIDER=package" + "-DgRPC_SSL_PROVIDER=package" + "-DgRPC_PROTOBUF_PROVIDER=package" + "-DgRPC_ABSL_PROVIDER=package" + "-DBUILD_SHARED_LIBS=ON" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "-D_gRPC_PROTOBUF_PROTOC_EXECUTABLE=${buildPackages.protobuf}/bin/protoc" + "-D_gRPC_CPP_PLUGIN=${buildPackages.grpc}/bin/grpc_cpp_plugin" + ] + # The build scaffold defaults to c++14 on darwin, even when the compiler uses + # a more recent c++ version by default [1]. However, downgrades are + # problematic, because the compatibility types in abseil will have different + # interface definitions than the ones used for building abseil itself. + # [1] https://github.com/grpc/grpc/blob/v1.57.0/CMakeLists.txt#L239-L243 + ++ (let + defaultCxxIsOlderThan17 = + (stdenv.cc.isClang && lib.versionAtLeast stdenv.cc.cc.version "16.0") + || (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.cc.version "11.0"); + in lib.optionals (stdenv.hostPlatform.isDarwin && defaultCxxIsOlderThan17) + [ + "-DCMAKE_CXX_STANDARD=17" + ]); + + # CMake creates a build directory by default, this conflicts with the + # basel BUILD file on case-insensitive filesystems. + preConfigure = '' + rm -vf BUILD + ''; + + # When natively compiling, grpc_cpp_plugin is executed from the build directory, + # needing to load dynamic libraries from the build directory, so we set + # LD_LIBRARY_PATH to enable this. When cross compiling we need to avoid this, + # since it can cause the grpc_cpp_plugin executable from buildPackages to + # crash if build and host architecture are compatible (e. g. pkgsLLVM). + preBuild = lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) '' + export LD_LIBRARY_PATH=$(pwd)''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH + ''; + + env.NIX_CFLAGS_COMPILE = toString ([ + "-Wno-error" + ] ++ lib.optionals stdenv.isDarwin [ + # Workaround for https://github.com/llvm/llvm-project/issues/48757 + "-Wno-elaborated-enum-base" + ]); + + enableParallelBuilds = true; + + # passthru.tests = { + # inherit (python3.pkgs) grpcio-status grpcio-tools jaxlib; + # inherit arrow-cpp; + # }; + + meta = with lib; { + description = "The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)"; + license = licenses.asl20; + maintainers = with maintainers; [ lnl7 ]; + homepage = "https://grpc.io/"; + platforms = platforms.all; + changelog = "https://github.com/grpc/grpc/releases/tag/v${version}"; + }; +} diff --git a/pkgs/by-name/gr/grpc/packages.nix b/pkgs/by-name/gr/grpc/packages.nix new file mode 100644 index 0000000..ab22528 --- /dev/null +++ b/pkgs/by-name/gr/grpc/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + grpc = darwin.apple_sdk_11_0.callPackage ../development/libraries/grpc { + stdenv = if stdenv.isDarwin && stdenv.isx86_64 + then overrideSDK darwin.apple_sdk_11_0.stdenv { darwinMinVersion = "10.13"; } + else stdenv; + }; +} diff --git a/pkgs/by-name/gs/gsasl/default.nix b/pkgs/by-name/gs/gsasl/default.nix new file mode 100644 index 0000000..787c096 --- /dev/null +++ b/pkgs/by-name/gs/gsasl/default.nix @@ -0,0 +1,49 @@ +{ fetchurl, lib, stdenv, libidn, libkrb5 +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "gsasl"; + version = "2.2.1"; + + src = fetchurl { + url = "mirror://gnu/gsasl/${finalAttrs.pname}-${finalAttrs.version}.tar.gz"; + sha256 = "sha256-1FtWLhO9E7n8ILNy9LUyaXQM9iefg28JzhG50yvO4HU="; + }; + + # This is actually bug in musl. It is already fixed in trunc and + # this patch won't be necessary with musl > 1.2.3. + # + # https://git.musl-libc.org/cgit/musl/commit/?id=b50eb8c36c20f967bd0ed70c0b0db38a450886ba + patches = lib.optional stdenv.hostPlatform.isMusl ./gsasl.patch; + + buildInputs = [ libidn libkrb5 ]; + + configureFlags = [ "--with-gssapi-impl=mit" ]; + + preCheck = '' + export LOCALDOMAIN="dummydomain" + ''; + doCheck = !stdenv.hostPlatform.isDarwin; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = { + description = "GNU SASL, Simple Authentication and Security Layer library"; + mainProgram = "gsasl"; + + longDescription = + '' GNU SASL is a library that implements the IETF Simple + Authentication and Security Layer (SASL) framework and + some SASL mechanisms. SASL is used in network servers + (e.g. IMAP, SMTP, etc.) to authenticate peers. + ''; + + homepage = "https://www.gnu.org/software/gsasl/"; + license = lib.licenses.gpl3Plus; + + maintainers = with lib.maintainers; [ shlevy ]; + pkgConfigModules = [ "libgsasl" ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/by-name/gs/gsasl/gsasl.patch b/pkgs/by-name/gs/gsasl/gsasl.patch new file mode 100644 index 0000000..572d303 --- /dev/null +++ b/pkgs/by-name/gs/gsasl/gsasl.patch @@ -0,0 +1,21 @@ +GNU libc and Musl libc have different ideas what + + strverscmp("UNKNOWN", "2.2.0") + +should return. Hopefully nobody depend on this particular behaviour in +practice. + +--- a/tests/version.c 1970-01-01 00:00:00.000000000 -0000 ++++ b/tests/version.c 1970-01-01 00:00:00.000000000 -0000 +@@ -111,11 +111,5 @@ + exit_code = EXIT_FAILURE; + } + +- if (gsasl_check_version ("UNKNOWN")) +- { +- printf ("FAIL: gsasl_check_version (UNKNOWN)\n"); +- exit_code = EXIT_FAILURE; +- } +- + return exit_code; + } diff --git a/pkgs/by-name/gt/gtest/default.nix b/pkgs/by-name/gt/gtest/default.nix new file mode 100644 index 0000000..51e0c68 --- /dev/null +++ b/pkgs/by-name/gt/gtest/default.nix @@ -0,0 +1,46 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, ninja +, static ? stdenv.hostPlatform.isStatic, +}: + +stdenv.mkDerivation rec { + pname = "gtest"; + version = "1.14.0"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "google"; + repo = "googletest"; + rev = "v${version}"; + hash = "sha256-t0RchAHTJbuI5YW4uyBPykTvcjy90JW9AOPNjIhwh6U="; + }; + + patches = [ + ./fix-cmake-config-includedir.patch + ]; + + nativeBuildInputs = [ cmake ninja ]; + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=${if static then "OFF" else "ON"}" + ] ++ lib.optionals ( + (stdenv.cc.isGNU && (lib.versionOlder stdenv.cc.version "11.0")) + || (stdenv.cc.isClang && (lib.versionOlder stdenv.cc.version "16.0")) + ) [ + # Enable C++17 support + # https://github.com/google/googletest/issues/3081 + "-DCMAKE_CXX_STANDARD=17" + ]; + + meta = with lib; { + description = "Google's framework for writing C++ tests"; + homepage = "https://github.com/google/googletest"; + license = licenses.bsd3; + platforms = platforms.all; + maintainers = with maintainers; [ ivan-tkatchev ]; + }; +} diff --git a/pkgs/by-name/gt/gtest/fix-cmake-config-includedir.patch b/pkgs/by-name/gt/gtest/fix-cmake-config-includedir.patch new file mode 100644 index 0000000..6d29e04 --- /dev/null +++ b/pkgs/by-name/gt/gtest/fix-cmake-config-includedir.patch @@ -0,0 +1,34 @@ +diff --git a/googlemock/CMakeLists.txt b/googlemock/CMakeLists.txt +index 428bd9f8..04b84539 100644 +--- a/googlemock/CMakeLists.txt ++++ b/googlemock/CMakeLists.txt +@@ -104,10 +104,10 @@ endif() + string(REPLACE ";" "$" dirs "${gmock_build_include_dirs}") + target_include_directories(gmock SYSTEM INTERFACE + "$" +- "$/${CMAKE_INSTALL_INCLUDEDIR}>") ++ "$") + target_include_directories(gmock_main SYSTEM INTERFACE + "$" +- "$/${CMAKE_INSTALL_INCLUDEDIR}>") ++ "$") + + ######################################################################## + # +diff --git a/googletest/CMakeLists.txt b/googletest/CMakeLists.txt +index 51a67c91..fb09e978 100644 +--- a/googletest/CMakeLists.txt ++++ b/googletest/CMakeLists.txt +@@ -143,10 +143,10 @@ set_target_properties(gtest_main PROPERTIES VERSION ${GOOGLETEST_VERSION}) + string(REPLACE ";" "$" dirs "${gtest_build_include_dirs}") + target_include_directories(gtest SYSTEM INTERFACE + "$" +- "$/${CMAKE_INSTALL_INCLUDEDIR}>") ++ "$") + target_include_directories(gtest_main SYSTEM INTERFACE + "$" +- "$/${CMAKE_INSTALL_INCLUDEDIR}>") ++ "$") + if(CMAKE_SYSTEM_NAME MATCHES "QNX") + target_link_libraries(gtest PUBLIC regex) + endif() diff --git a/pkgs/by-name/gt/gtk-doc/default.nix b/pkgs/by-name/gt/gtk-doc/default.nix new file mode 100644 index 0000000..75a6731 --- /dev/null +++ b/pkgs/by-name/gt/gtk-doc/default.nix @@ -0,0 +1,98 @@ +{ lib +, fetchFromGitLab +, meson +, ninja +, pkg-config +, python3 +, docbook_xml_dtd_43 +, docbook-xsl-nons +, libxslt +, gettext +, withDblatex ? false, dblatex +# for passthru +# , gnome +}: + +python3.pkgs.buildPythonApplication rec { + pname = "gtk-doc"; + version = "1.33.2"; + + outputDevdoc = "out"; + + format = "other"; + + src = fetchFromGitLab { + domain = "gitlab.gnome.org"; + owner = "GNOME"; + repo = pname; + rev = version; + sha256 = "A6OXpazrJ05SUIO1ZPVN0xHTXOSov8UnPvUolZAv/Iw="; + }; + + patches = [ + ./respect-xml-catalog-files-var.patch + ]; + + postPatch = '' + substituteInPlace meson.build \ + --replace "pkg-config" "$PKG_CONFIG" + ''; + + strictDeps = true; + + depsBuildBuild = [ + python3 + pkg-config + ]; + + nativeBuildInputs = [ + pkg-config + gettext + meson + ninja + libxslt # for xsltproc + ]; + + buildInputs = [ + docbook_xml_dtd_43 + docbook-xsl-nons + libxslt + ] ++ lib.optionals withDblatex [ + dblatex + ]; + + pythonPath = with python3.pkgs; [ + pygments # Needed for https://gitlab.gnome.org/GNOME/gtk-doc/blob/GTK_DOC_1_32/meson.build#L42 + lxml + ]; + + mesonFlags = [ + "-Dtests=false" + "-Dyelp_manual=false" + ]; + + doCheck = false; # requires a lot of stuff + doInstallCheck = false; # fails + + postFixup = '' + # Do not propagate Python + substituteInPlace $out/nix-support/propagated-build-inputs \ + --replace "${python3}" "" + ''; + + # passthru = { + # # Consumers are expected to copy the m4 files to their source tree, let them reuse the patch + # respect_xml_catalog_files_var_patch = ./respect-xml-catalog-files-var.patch; + # updateScript = gnome.updateScript { + # packageName = pname; + # versionPolicy = "none"; + # }; + # }; + + meta = with lib; { + description = "Tools to extract documentation embedded in GTK and GNOME source code"; + homepage = "https://gitlab.gnome.org/GNOME/gtk-doc"; + license = licenses.gpl2Plus; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/gt/gtk-doc/respect-xml-catalog-files-var.patch b/pkgs/by-name/gt/gtk-doc/respect-xml-catalog-files-var.patch new file mode 100644 index 0000000..95f6879 --- /dev/null +++ b/pkgs/by-name/gt/gtk-doc/respect-xml-catalog-files-var.patch @@ -0,0 +1,13 @@ +--- a/m4/gtkdoc_jh_check_xml_catalog.m4 ++++ b/m4/gtkdoc_jh_check_xml_catalog.m4 +@@ -5,8 +5,8 @@ + [ + AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl + AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog]) +- if $jh_found_xmlcatalog && \ +- AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then ++ # empty argument forces libxml to use XML_CATALOG_FILES variable ++ if AC_RUN_LOG([$XMLCATALOG --noout "" "$1" >&2]); then + AC_MSG_RESULT([found]) + ifelse([$3],,,[$3]) + else diff --git a/pkgs/by-name/gu/guile/1.8.nix b/pkgs/by-name/gu/guile/1.8.nix new file mode 100644 index 0000000..51ac9ba --- /dev/null +++ b/pkgs/by-name/gu/guile/1.8.nix @@ -0,0 +1,110 @@ +{ lib +, stdenv +, fetchurl +, buildPackages +, gawk +, gmp +, libtool +, makeWrapper +, pkg-config +, pkgsBuildBuild +, readline +}: + +stdenv.mkDerivation rec { + pname = "guile"; + version = "1.8.8"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz"; + sha256 = "0l200a0v7h8bh0cwz6v7hc13ds39cgqsmfrks55b1rbj5vniyiy3"; + }; + + outputs = [ "out" "dev" "info" ]; + setOutputFlags = false; # $dev gets into the library otherwise + + # GCC 4.6 raises a number of set-but-unused warnings. + configureFlags = [ + "--disable-error-on-warning" + ] + # Guile needs patching to preset results for the configure tests about + # pthreads, which work only in native builds. + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + "--with-threads=no"; + + depsBuildBuild = [ + buildPackages.stdenv.cc + ] + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + pkgsBuildBuild.guile_1_8; + nativeBuildInputs = [ + makeWrapper + pkg-config + ]; + buildInputs = [ + libtool + readline + ]; + propagatedBuildInputs = [ + gmp + + # XXX: These ones aren't normally needed here, but `libguile*.la' has '-l' + # flags for them without corresponding '-L' flags. Adding them here will add + # the needed `-L' flags. As for why the `.la' file lacks the `-L' flags, + # see below. + libtool + ]; + + patches = [ + # Fix doc snarfing with GCC 4.5. + ./cpp-4.5.patch + # Self explanatory + ./CVE-2016-8605.patch + ]; + + preBuild = '' + sed -e '/lt_dlinit/a lt_dladdsearchdir("'$out/lib'");' -i libguile/dynl.c + ''; + + postInstall = '' + wrapProgram $out/bin/guile-snarf --prefix PATH : "${gawk}/bin" + '' + # XXX: See http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18903 for + # why `--with-libunistring-prefix' and similar options coming from + # `AC_LIB_LINKFLAGS_BODY' don't work on NixOS/x86_64. + + '' + sed -i "$out/lib/pkgconfig/guile"-*.pc \ + -e "s|-lltdl|-L${libtool.lib}/lib -lltdl|g" + ''; + + # One test fails. + # ERROR: file: "libtest-asmobs", message: "file not found" + # This is fixed here: + # . + doCheck = false; + doInstallCheck = doCheck; + + setupHook = ./setup-hook-1.8.sh; + + passthru = { + effectiveVersion = lib.versions.majorMinor version; + siteCcacheDir = "lib/guile/site-ccache"; + siteDir = "share/guile/site"; + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/guile/"; + description = "Embeddable Scheme implementation"; + longDescription = '' + GNU Guile is an implementation of the Scheme programming language, with + support for many SRFIs, packaged for use in a wide variety of + environments. In addition to implementing the R5RS Scheme standard and a + large subset of R6RS, Guile includes a module system, full access to POSIX + system calls, networking support, multiple threads, dynamic linking, a + foreign function call interface, and powerful string processing. + ''; + license = licenses.lgpl3Plus; + maintainers = with maintainers; [ ludo ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gu/guile/2.0.nix b/pkgs/by-name/gu/guile/2.0.nix new file mode 100644 index 0000000..18daad8 --- /dev/null +++ b/pkgs/by-name/gu/guile/2.0.nix @@ -0,0 +1,166 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, boehmgc +, buildPackages +, coverageAnalysis ? null +, gawk +, gmp +, libffi +, libtool +, libunistring +, makeWrapper +, pkg-config +, pkgsBuildBuild +, readline +}: + +let + # Do either a coverage analysis build or a standard build. + builder = if coverageAnalysis != null + then coverageAnalysis + else stdenv.mkDerivation; +in +builder rec { + pname = "guile"; + version = "2.0.13"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz"; + sha256 = "12yqkr974y91ylgw6jnmci2v90i90s7h9vxa4zk0sai8vjnz4i1p"; + }; + + outputs = [ "out" "dev" "info" ]; + setOutputFlags = false; # $dev gets into the library otherwise + + depsBuildBuild = [ + buildPackages.stdenv.cc + ] + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + pkgsBuildBuild.guile_2_0; + + nativeBuildInputs = [ + makeWrapper + pkg-config + ]; + buildInputs = [ + readline + libtool + libunistring + libffi + ]; + propagatedBuildInputs = [ + boehmgc + gmp + + # These ones aren't normally needed here, but `libguile*.la' has '-l' + # flags for them without corresponding '-L' flags. Adding them here will + # add the needed `-L' flags. As for why the `.la' file lacks the `-L' + # flags, see below. + libtool + libunistring + ]; + + enableParallelBuilding = true; + + patches = [ + # Small fixes to Clang compiler + ./clang.patch + # Self-explanatory + ./disable-gc-sensitive-tests.patch + # Read the header of the patch to more info + ./eai_system.patch + # RISC-V endianness + ./riscv.patch + # Fixes stability issues with 00-repl-server.test + (fetchpatch { + url = "https://git.savannah.gnu.org/cgit/guile.git/patch/?id=2fbde7f02adb8c6585e9baf6e293ee49cd23d4c4"; + sha256 = "0p6c1lmw1iniq03z7x5m65kg3lq543kgvdb4nrxsaxjqf3zhl77v"; + })] ++ + (lib.optional (coverageAnalysis != null) ./gcov-file-name.patch) + ++ lib.optionals stdenv.isDarwin [ + ./filter-mkostemp-darwin.patch + (fetchpatch { + url = "https://gitlab.gnome.org/GNOME/gtk-osx/raw/52898977f165777ad9ef169f7d4818f2d4c9b731/patches/guile-clocktime.patch"; + sha256 = "12wvwdna9j8795x59ldryv9d84c1j3qdk2iskw09306idfsis207"; + }) + ]; + + # Explicitly link against libgcc_s, to work around the infamous + # "libgcc_s.so.1 must be installed for pthread_cancel to work". + + # don't have "libgcc_s.so.1" on darwin + LDFLAGS = lib.optionalString + (!stdenv.isDarwin && !stdenv.hostPlatform.isMusl) "-lgcc_s"; + + configureFlags = [ + "--with-libreadline-prefix" + ] ++ lib.optionals stdenv.isSunOS [ + # Make sure the right is found, and not the incompatible + # /usr/include/mp.h from OpenSolaris. See + # + # for details. + "--with-libgmp-prefix=${lib.getDev gmp}" + + # Same for these (?). + "--with-libreadline-prefix=${lib.getDev readline}" + "--with-libunistring-prefix=${libunistring}" + + # See below. + "--without-threads" + ]; + + postInstall = '' + wrapProgram $out/bin/guile-snarf --prefix PATH : "${gawk}/bin" + '' + # XXX: See http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18903 for + # why `--with-libunistring-prefix' and similar options coming from + # `AC_LIB_LINKFLAGS_BODY' don't work on NixOS/x86_64. + + '' + sed -i "$out/lib/pkgconfig/guile"-*.pc \ + -e "s|-lunistring|-L${libunistring}/lib -lunistring|g ; + s|^Cflags:\(.*\)$|Cflags: -I${libunistring.dev}/include \1|g ; + s|-lltdl|-L${libtool.lib}/lib -lltdl|g ; + s|includedir=$out|includedir=$dev|g + " + ''; + + # make check doesn't work on darwin + # On Linuxes+Hydra the tests are flaky; feel free to investigate deeper. + doCheck = false; + doInstallCheck = doCheck; + + setupHook = ./setup-hook-2.0.sh; + + passthru = rec { + effectiveVersion = lib.versions.majorMinor version; + siteCcacheDir = "lib/guile/${effectiveVersion}/site-ccache"; + siteDir = "share/guile/site/${effectiveVersion}"; + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/guile/"; + description = "Embeddable Scheme implementation"; + longDescription = '' + GNU Guile is an implementation of the Scheme programming language, with + support for many SRFIs, packaged for use in a wide variety of + environments. In addition to implementing the R5RS Scheme standard and + a large subset of R6RS, Guile includes a module system, full access to + POSIX system calls, networking support, multiple threads, dynamic + linking, a foreign function call interface, and powerful string + processing. + ''; + license = licenses.lgpl3Plus; + maintainers = with maintainers; [ ludo lovek323 vrthra ]; + platforms = platforms.all; + }; +} + +// + +(lib.optionalAttrs (!stdenv.isLinux) { + # Work around . + SHELL = stdenv.shell; + CONFIG_SHELL = stdenv.shell; +}) diff --git a/pkgs/by-name/gu/guile/2.2.nix b/pkgs/by-name/gu/guile/2.2.nix new file mode 100644 index 0000000..9187355 --- /dev/null +++ b/pkgs/by-name/gu/guile/2.2.nix @@ -0,0 +1,148 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, boehmgc +, buildPackages +, coverageAnalysis ? null +, gawk +, gmp +, libffi +, libtool +, libunistring +, makeWrapper +, pkg-config +, pkgsBuildBuild +, readline +}: + +let + # Do either a coverage analysis build or a standard build. + builder = if coverageAnalysis != null + then coverageAnalysis + else stdenv.mkDerivation; +in +builder rec { + pname = "guile"; + version = "2.2.7"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz"; + sha256 = "013mydzhfswqci6xmyc1ajzd59pfbdak15i0b090nhr9bzm7dxyd"; + }; + + outputs = [ "out" "dev" "info" ]; + setOutputFlags = false; # $dev gets into the library otherwise + + depsBuildBuild = [ + buildPackages.stdenv.cc + ] + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + pkgsBuildBuild.guile_2_2; + nativeBuildInputs = [ + makeWrapper + pkg-config + ]; + buildInputs = [ + libffi + libtool + libunistring + readline + ]; + propagatedBuildInputs = [ + boehmgc + gmp + + # XXX: These ones aren't normally needed here, but `libguile*.la' has '-l' + # flags for them without corresponding '-L' flags. Adding them here will add + # the needed `-L' flags. As for why the `.la' file lacks the `-L' flags, + # see below. + libtool + libunistring + ]; + + # According to Bernhard M. Wiedemann on + # #reproducible-builds on irc.oftc.net, (2020-01-29): they had to + # build Guile without parallel builds to make it reproducible. + # + # re: https://issues.guix.gnu.org/issue/20272 + # re: https://build.opensuse.org/request/show/732638 + enableParallelBuilding = false; + + patches = [ + # Read the header of the patch to more info + ./eai_system.patch + ] ++ lib.optional (coverageAnalysis != null) ./gcov-file-name.patch + ++ lib.optional stdenv.isDarwin + (fetchpatch { + url = "https://gitlab.gnome.org/GNOME/gtk-osx/raw/52898977f165777ad9ef169f7d4818f2d4c9b731/patches/guile-clocktime.patch"; + sha256 = "12wvwdna9j8795x59ldryv9d84c1j3qdk2iskw09306idfsis207"; + }); + + # Explicitly link against libgcc_s, to work around the infamous + # "libgcc_s.so.1 must be installed for pthread_cancel to work". + + # don't have "libgcc_s.so.1" on clang + LDFLAGS = lib.optionalString + (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) "-lgcc_s"; + + configureFlags = [ + "--with-libreadline-prefix=${lib.getDev readline}" + ] ++ lib.optionals stdenv.isSunOS [ + # Make sure the right is found, and not the incompatible + # /usr/include/mp.h from OpenSolaris. See + # + # for details. + "--with-libgmp-prefix=${lib.getDev gmp}" + + # Same for these (?). + "--with-libunistring-prefix=${libunistring}" + + # See below. + "--without-threads" + ]; + + postInstall = '' + wrapProgram $out/bin/guile-snarf --prefix PATH : "${gawk}/bin" + '' + # XXX: See http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18903 for + # why `--with-libunistring-prefix' and similar options coming from + # `AC_LIB_LINKFLAGS_BODY' don't work on NixOS/x86_64. + + '' + sed -i "$out/lib/pkgconfig/guile"-*.pc \ + -e "s|-lunistring|-L${libunistring}/lib -lunistring|g ; + s|^Cflags:\(.*\)$|Cflags: -I${libunistring.dev}/include \1|g ; + s|-lltdl|-L${libtool.lib}/lib -lltdl|g ; + s|includedir=$out|includedir=$dev|g + " + ''; + + # make check doesn't work on darwin + # On Linuxes+Hydra the tests are flaky; feel free to investigate deeper. + doCheck = false; + doInstallCheck = doCheck; + + setupHook = ./setup-hook-2.2.sh; + + passthru = rec { + effectiveVersion = lib.versions.majorMinor version; + siteCcacheDir = "lib/guile/${effectiveVersion}/site-ccache"; + siteDir = "share/guile/site/${effectiveVersion}"; + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/guile/"; + description = "Embeddable Scheme implementation"; + longDescription = '' + GNU Guile is an implementation of the Scheme programming language, with + support for many SRFIs, packaged for use in a wide variety of + environments. In addition to implementing the R5RS Scheme standard and a + large subset of R6RS, Guile includes a module system, full access to POSIX + system calls, networking support, multiple threads, dynamic linking, a + foreign function call interface, and powerful string processing. + ''; + license = licenses.lgpl3Plus; + maintainers = with maintainers; [ ludo lovek323 vrthra ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gu/guile/3.0.nix b/pkgs/by-name/gu/guile/3.0.nix new file mode 100644 index 0000000..fb78837 --- /dev/null +++ b/pkgs/by-name/gu/guile/3.0.nix @@ -0,0 +1,170 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, boehmgc +, buildPackages +, coverageAnalysis ? null +, gawk +, gmp +, libffi +, libtool +, libunistring +, libxcrypt +, makeWrapper +, pkg-config +, pkgsBuildBuild +, readline +, writeScript +}: + +let + # Do either a coverage analysis build or a standard build. + builder = if coverageAnalysis != null + then coverageAnalysis + else stdenv.mkDerivation; +in +builder rec { + pname = "guile"; + version = "3.0.9"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz"; + sha256 = "sha256-GiYlrHKyNm6VeS8/51j9Lfd1tARKkKSpeHMm5mwNdQ0="; + }; + + outputs = [ "out" "dev" "info" ]; + setOutputFlags = false; # $dev gets into the library otherwise + + depsBuildBuild = [ + buildPackages.stdenv.cc + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + pkgsBuildBuild.guile_3_0; + nativeBuildInputs = [ + makeWrapper + pkg-config + ]; + buildInputs = [ + libffi + libtool + libunistring + readline + ] ++ lib.optionals stdenv.isLinux [ + libxcrypt + ]; + propagatedBuildInputs = [ + boehmgc + gmp + + # These ones aren't normally needed here, but `libguile*.la' has '-l' + # flags for them without corresponding '-L' flags. Adding them here will + # add the needed `-L' flags. As for why the `.la' file lacks the `-L' + # flags, see below. + libtool + libunistring + ] ++ lib.optionals stdenv.isLinux [ + libxcrypt + ]; + + # According to + # https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/guile.scm?h=a39207f7afd977e4e4299c6f0bb34bcb6d153818#n405 + # starting with Guile 3.0.8, parallel builds can be done + # bit-reproducibly as long as we're not cross-compiling + enableParallelBuilding = stdenv.buildPlatform == stdenv.hostPlatform; + + patches = [ + ./eai_system.patch + ./guile-hurd-posix-spawn.patch + ] ++ lib.optional (coverageAnalysis != null) ./gcov-file-name.patch + ++ lib.optional stdenv.isDarwin + (fetchpatch { + url = "https://gitlab.gnome.org/GNOME/gtk-osx/raw/52898977f165777ad9ef169f7d4818f2d4c9b731/patches/guile-clocktime.patch"; + sha256 = "12wvwdna9j8795x59ldryv9d84c1j3qdk2iskw09306idfsis207"; + }); + + # Explicitly link against libgcc_s, to work around the infamous + # "libgcc_s.so.1 must be installed for pthread_cancel to work". + + # don't have "libgcc_s.so.1" on clang + LDFLAGS = lib.optionalString + (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) "-lgcc_s"; + + configureFlags = [ + "--with-libreadline-prefix=${lib.getDev readline}" + ] ++ lib.optionals stdenv.isSunOS [ + # Make sure the right is found, and not the incompatible + # /usr/include/mp.h from OpenSolaris. See + # + # for details. + "--with-libgmp-prefix=${lib.getDev gmp}" + + # Same for these (?). + "--with-libunistring-prefix=${libunistring}" + + # See below. + "--without-threads" + ] + # At least on x86_64-darwin '-flto' autodetection is not correct: + # https://github.com/NixOS/nixpkgs/pull/160051#issuecomment-1046193028 + ++ lib.optional (stdenv.isDarwin) "--disable-lto"; + + postInstall = '' + wrapProgram $out/bin/guile-snarf --prefix PATH : "${gawk}/bin" + '' + # XXX: See http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18903 for + # why `--with-libunistring-prefix' and similar options coming from + # `AC_LIB_LINKFLAGS_BODY' don't work on NixOS/x86_64. + + '' + sed -i "$out/lib/pkgconfig/guile"-*.pc \ + -e "s|-lunistring|-L${libunistring}/lib -lunistring|g ; + s|-lltdl|-L${libtool.lib}/lib -lltdl|g ; + s|-lcrypt|-L${libxcrypt}/lib -lcrypt|g ; + s|^Cflags:\(.*\)$|Cflags: -I${libunistring.dev}/include \1|g ; + s|includedir=$out|includedir=$dev|g + " + ''; + + # make check doesn't work on darwin + # On Linuxes+Hydra the tests are flaky; feel free to investigate deeper. + doCheck = false; + doInstallCheck = doCheck; + + # In procedure bytevector-u8-ref: Argument 2 out of range + dontStrip = stdenv.isDarwin; + + setupHook = ./setup-hook-3.0.sh; + + passthru = rec { + effectiveVersion = lib.versions.majorMinor version; + siteCcacheDir = "lib/guile/${effectiveVersion}/site-ccache"; + siteDir = "share/guile/site/${effectiveVersion}"; + + updateScript = writeScript "update-guile-3" '' + #!/usr/bin/env nix-shell + #!nix-shell -i bash -p curl pcre common-updater-scripts + + set -eu -o pipefail + + # Expect the text in format of '"https://ftp.gnu.org/gnu/guile/guile-3.0.8.tar.gz"' + new_version="$(curl -s https://www.gnu.org/software/guile/download/ | + pcregrep -o1 '"https://ftp.gnu.org/gnu/guile/guile-(3[.0-9]+).tar.gz"')" + update-source-version guile_3_0 "$new_version" + ''; + }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/guile/"; + description = "Embeddable Scheme implementation"; + longDescription = '' + GNU Guile is an implementation of the Scheme programming language, with + support for many SRFIs, packaged for use in a wide variety of + environments. In addition to implementing the R5RS Scheme standard and a + large subset of R6RS, Guile includes a module system, full access to POSIX + system calls, networking support, multiple threads, dynamic linking, a + foreign function call interface, and powerful string processing. + ''; + license = licenses.lgpl3Plus; + maintainers = with maintainers; [ ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/gu/guile/CVE-2016-8605.patch b/pkgs/by-name/gu/guile/CVE-2016-8605.patch new file mode 100644 index 0000000..2fc2813 --- /dev/null +++ b/pkgs/by-name/gu/guile/CVE-2016-8605.patch @@ -0,0 +1,59 @@ +commit d514e3fc42eb14a1bc5846b27ef89f50ba3a5d48 +Author: Ludovic Courtès +Date: Tue Oct 11 10:14:26 2016 +0200 + + Remove 'umask' calls from 'mkdir'. + + Fixes . + + * libguile/filesys.c (SCM_DEFINE): Remove calls to 'umask' when MODE is + unbound; instead, use 0777 as the mode. Update docstring to clarify + this. + +diff --git a/libguile/filesys.c b/libguile/filesys.c +index c8acb13ef..921f765f1 100644 +--- a/libguile/filesys.c ++++ b/libguile/filesys.c +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1996,1997,1998,1999,2000,2001, 2002, 2004, 2006, 2008 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2006, ++ * 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -791,26 +792,21 @@ SCM_DEFINE (scm_delete_file, "delete-file", 1, 0, 0, + SCM_DEFINE (scm_mkdir, "mkdir", 1, 1, 0, + (SCM path, SCM mode), + "Create a new directory named by @var{path}. If @var{mode} is omitted\n" +- "then the permissions of the directory file are set using the current\n" +- "umask. Otherwise they are set to the decimal value specified with\n" +- "@var{mode}. The return value is unspecified.") ++ "then the permissions of the directory are set to @code{#o777}\n" ++ "masked with the current umask (@pxref{Processes, @code{umask}}).\n" ++ "Otherwise they are set to the value specified with @var{mode}.\n" ++ "The return value is unspecified.") + #define FUNC_NAME s_scm_mkdir + { + int rv; +- mode_t mask; ++ mode_t c_mode; + +- if (SCM_UNBNDP (mode)) +- { +- mask = umask (0); +- umask (mask); +- STRING_SYSCALL (path, c_path, rv = mkdir (c_path, 0777 ^ mask)); +- } +- else +- { +- STRING_SYSCALL (path, c_path, rv = mkdir (c_path, scm_to_uint (mode))); +- } ++ c_mode = SCM_UNBNDP (mode) ? 0777 : scm_to_uint (mode); ++ ++ STRING_SYSCALL (path, c_path, rv = mkdir (c_path, c_mode)); + if (rv != 0) + SCM_SYSERROR; ++ + return SCM_UNSPECIFIED; + } + #undef FUNC_NAME diff --git a/pkgs/by-name/gu/guile/clang.patch b/pkgs/by-name/gu/guile/clang.patch new file mode 100644 index 0000000..4d0f342 --- /dev/null +++ b/pkgs/by-name/gu/guile/clang.patch @@ -0,0 +1,14 @@ +diff --git a/lib/stdint.in.h b/lib/stdint.in.h +index 889bca7..15d39b0 100644 +--- a/lib/stdint.in.h ++++ b/lib/stdint.in.h +@@ -74,7 +74,8 @@ + in would reinclude us, skipping our contents because + _@GUARD_PREFIX@_STDINT_H is defined. + The include_next requires a split double-inclusion guard. */ +-# @INCLUDE_NEXT@ @NEXT_STDINT_H@ ++# include ++// # @INCLUDE_NEXT@ @NEXT_STDINT_H@ + #endif + + #if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H diff --git a/pkgs/by-name/gu/guile/cpp-4.5.patch b/pkgs/by-name/gu/guile/cpp-4.5.patch new file mode 100644 index 0000000..7e7671f --- /dev/null +++ b/pkgs/by-name/gu/guile/cpp-4.5.patch @@ -0,0 +1,24 @@ +Fix doc snarfing with GCC 4.5. +From . + +diff --git a/scripts/snarf-check-and-output-texi b/scripts/snarf-check-and-output-texi +index ea33e17..8cd42e8 100755 +--- a/scripts/snarf-check-and-output-texi ++++ b/scripts/snarf-check-and-output-texi +@@ -267,6 +267,17 @@ exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@" + (set! *file* file) + (set! *line* line)) + ++ ;; newer gccs like to throw around more location markers into the ++ ;; preprocessed source; these (hash . hash) bits are what they translate to ++ ;; in snarfy terms. ++ (('location ('string . file) ('int . line) ('hash . 'hash)) ++ (set! *file* file) ++ (set! *line* line)) ++ ++ (('location ('hash . 'hash) ('string . file) ('int . line) ('hash . 'hash)) ++ (set! *file* file) ++ (set! *line* line)) ++ + (('arglist rest ...) + (set! *args* (do-arglist rest))) diff --git a/pkgs/by-name/gu/guile/disable-gc-sensitive-tests.patch b/pkgs/by-name/gu/guile/disable-gc-sensitive-tests.patch new file mode 100644 index 0000000..076091a --- /dev/null +++ b/pkgs/by-name/gu/guile/disable-gc-sensitive-tests.patch @@ -0,0 +1,25 @@ +This patch disable GC-sensitive tests. This is particularly useful when +compiling with `-O0' (as is done with coverage analysis) since there may +be many false references held on the stack, leading to the failure of +such tests. + +--- a/test-suite/tests/gc.test ++++ b/test-suite/tests/gc.test +@@ -67,6 +67,7 @@ + + (with-test-prefix "gc" + (pass-if "Unused modules are removed" ++ (throw 'unresolved) + (let* ((guard (make-guardian)) + (total 1000)) + +--- a/test-suite/tests/threads.test ++++ b/test-suite/tests/threads.test +@@ -366,6 +366,7 @@ + (not (mutex-owner m)))) + + (pass-if "mutex with owner not retained (bug #27450)" ++ (throw 'unresolved) + (let ((g (make-guardian))) + (g (let ((m (make-mutex))) (lock-mutex m) m)) + diff --git a/pkgs/by-name/gu/guile/eai_system.patch b/pkgs/by-name/gu/guile/eai_system.patch new file mode 100644 index 0000000..b0eb7ac --- /dev/null +++ b/pkgs/by-name/gu/guile/eai_system.patch @@ -0,0 +1,24 @@ +Building nixpkgs in non-chroot, NSS modules may fail +and that will report EAI_SYSTEM in getaddrinfo. +https://bugzilla.novell.com/show_bug.cgi?id=794696 + +Index: guile-2.0.7/test-suite/tests/net-db.test +=================================================================== +--- guile-2.0.7.orig/test-suite/tests/net-db.test ++++ guile-2.0.7/test-suite/tests/net-db.test +@@ -79,6 +79,7 @@ + (and (defined? 'EAI_NODATA) ; GNU extension + (= errcode EAI_NODATA)) + (= errcode EAI_AGAIN) ++ (= errcode EAI_SYSTEM) + (begin + (format #t "unexpected error code: ~a ~s~%" + errcode (gai-strerror errcode)) +@@ -105,6 +106,7 @@ + ;; `EAI_NONAME'.) + (and (or (= errcode EAI_SERVICE) + (= errcode EAI_NONAME) ++ (= errcode EAI_SYSTEM) + (and (defined? 'EAI_NODATA) + (= errcode EAI_NODATA))) + (string? (gai-strerror errcode)))))))) diff --git a/pkgs/by-name/gu/guile/filter-mkostemp-darwin.patch b/pkgs/by-name/gu/guile/filter-mkostemp-darwin.patch new file mode 100644 index 0000000..8b9b853 --- /dev/null +++ b/pkgs/by-name/gu/guile/filter-mkostemp-darwin.patch @@ -0,0 +1,28 @@ +Filter incompat. mkostemp(3) flags on macOS 10.12 + +macOS Sierra introduces a mkostemp(3) function which is used when +present. Contrary to the GNUlib version of mkostemp(3) that was used +previously, this version fails with 'invalid argument' when flags other +than from a specified set are passed. From mktemp(3): + +| The mkostemp() function is like mkstemp() but allows specifying +| additional open(2) flags (defined in ). The permitted flags +| are O_APPEND, O_SHLOCK, O_EXLOCK and O_CLOEXEC. + +Signed-off-by: Clemens Lang +Upstream-Status: Submitted [https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24862#23] +--- a/libguile/filesys.c.orig 2017-01-09 00:53:27.000000000 +0100 ++++ b/libguile/filesys.c 2017-01-09 00:54:48.000000000 +0100 +@@ -1486,6 +1486,12 @@ + mode_bits = scm_i_mode_bits (mode); + } + ++#ifdef __APPLE__ ++ /* macOS starting with 10.12 defines mkostemp(2) which is used if defined, ++ * but only accepts some flags according to its manpage. It fails with ++ * invalid argument when other flags are passed. */ ++ open_flags &= O_APPEND | O_SHLOCK | O_EXLOCK | O_CLOEXEC; ++#endif + SCM_SYSCALL (rv = mkostemp (c_tmpl, open_flags)); + if (rv == -1) + SCM_SYSERROR; diff --git a/pkgs/by-name/gu/guile/gcov-file-name.patch b/pkgs/by-name/gu/guile/gcov-file-name.patch new file mode 100644 index 0000000..f144296 --- /dev/null +++ b/pkgs/by-name/gu/guile/gcov-file-name.patch @@ -0,0 +1,42 @@ +This patch arranges so that we don't end up, with profiling builds, with a +file named `.gcov' since that confuses lcov: + + :cannot open source file + geninfo: ERROR: cannot read .gcov! + +--- guile/libguile/c-tokenize.c 2009-09-13 13:05:15.000000000 +0200 ++++ guile/libguile/c-tokenize.c 2009-10-28 16:24:15.000000000 +0100 +@@ -1,5 +1,5 @@ + +-#line 3 "" ++#line 3 "c-tokenize.c" + + #define YY_INT_ALIGNED short int + +@@ -616,7 +616,7 @@ int cookie_was_last = 0; + #define IS_COOKIE cookie_was_last = 1 + #define IS_NOT_COOKIE cookie_was_last = 0 + +-#line 620 "" ++#line 620 "c-tokenize.c" + + #define INITIAL 0 + +@@ -799,7 +799,7 @@ YY_DECL + #line 65 "./c-tokenize.lex" + + +-#line 803 "" ++#line 803 "c-tokenize.c" + + if ( !(yy_init) ) + { +@@ -1235,7 +1235,7 @@ YY_RULE_SETUP + #line 181 "./c-tokenize.lex" + ECHO; + YY_BREAK +-#line 1239 "" ++#line 1239 "c-tokenize.c" + case YY_STATE_EOF(INITIAL): + yyterminate(); + diff --git a/pkgs/by-name/gu/guile/guile-hurd-posix-spawn.patch b/pkgs/by-name/gu/guile/guile-hurd-posix-spawn.patch new file mode 100644 index 0000000..7cf600b --- /dev/null +++ b/pkgs/by-name/gu/guile/guile-hurd-posix-spawn.patch @@ -0,0 +1,44 @@ +Fix , which affects GNU/Hurd. + +diff --git a/libguile/posix.c b/libguile/posix.c +index 3a8be94e4..f5fdc544c 100644 +--- a/libguile/posix.c ++++ b/libguile/posix.c +@@ -1326,7 +1326,14 @@ static void + close_inherited_fds_slow (posix_spawn_file_actions_t *actions, int max_fd) + { + while (--max_fd > 2) +- posix_spawn_file_actions_addclose (actions, max_fd); ++ { ++ /* Adding invalid file descriptors to an 'addclose' action leads ++ to 'posix_spawn' failures on some operating systems: ++ . Hence the extra check. */ ++ int flags = fcntl (max_fd, F_GETFD, NULL); ++ if ((flags >= 0) && ((flags & FD_CLOEXEC) == 0)) ++ posix_spawn_file_actions_addclose (actions, max_fd); ++ } + } + + static void + +Fix . + +diff --git a/test-suite/tests/posix.test b/test-suite/tests/posix.test +index f20e04453..d5cf47cda 100644 +--- a/test-suite/tests/posix.test ++++ b/test-suite/tests/posix.test +@@ -431,7 +431,13 @@ + (let ((str (get-string-all (car input+output)))) + (close-port (car input+output)) + (waitpid pid) +- str))) ++ ++ ;; On GNU/Hurd, the exec server prepends 'LD_ORIGIN_PATH' for ++ ;; every program: . Strip it. ++ (if (and (string=? "GNU" (utsname:sysname (uname))) ++ (string-prefix? "LD_ORIGIN_PATH=" str)) ++ (string-drop str (+ 1 (string-index str #\newline))) ++ str)))) + + (pass-if-equal "ls /proc/self/fd" + "0\n1\n2\n3\n" ;fourth FD is for /proc/self/fd diff --git a/pkgs/by-name/gu/guile/packages.nix b/pkgs/by-name/gu/guile/packages.nix new file mode 100644 index 0000000..bc29563 --- /dev/null +++ b/pkgs/by-name/gu/guile/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Needed for autogen + guile_2_0 = callPackage ./2.0.nix { }; + guile_2_2 = callPackage ./2.2.nix { }; + guile_3_0 = callPackage ./3.0.nix { }; + guile = guile_3_0; +} diff --git a/pkgs/by-name/gu/guile/riscv.patch b/pkgs/by-name/gu/guile/riscv.patch new file mode 100644 index 0000000..b835e16 --- /dev/null +++ b/pkgs/by-name/gu/guile/riscv.patch @@ -0,0 +1,13 @@ +diff --git a/module/system/base/target.scm b/module/system/base/target.scm +index 95ab8d8c9..93616f4a3 100644 +--- a/module/system/base/target.scm ++++ b/module/system/base/target.scm +@@ -86,6 +86,8 @@ + (endianness big)) + ((string=? "aarch64" cpu) + (endianness little)) ++ ((string-match "riscv[1-9][0-9]*" cpu) ++ (endianness little)) + (else + (error "unknown CPU endianness" cpu))))) + diff --git a/pkgs/by-name/gu/guile/setup-hook-1.8.sh b/pkgs/by-name/gu/guile/setup-hook-1.8.sh new file mode 100644 index 0000000..9a6ffb7 --- /dev/null +++ b/pkgs/by-name/gu/guile/setup-hook-1.8.sh @@ -0,0 +1,7 @@ +addGuileLibPath () { + if test -d "$1/share/guile/site"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site" + fi +} + +addEnvHooks "$hostOffset" addGuileLibPath diff --git a/pkgs/by-name/gu/guile/setup-hook-2.0.sh b/pkgs/by-name/gu/guile/setup-hook-2.0.sh new file mode 100644 index 0000000..9ef0fae --- /dev/null +++ b/pkgs/by-name/gu/guile/setup-hook-2.0.sh @@ -0,0 +1,19 @@ +addGuileLibPath () { + if test -d "$1/share/guile/site/2.0"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site/2.0" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site/2.0" + elif test -d "$1/share/guile/site"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site" + fi + + if test -d "$1/lib/guile/2.0/ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/2.0/ccache" + fi + + if test -d "$1/lib/guile/2.0/site-ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/2.0/site-ccache" + fi +} + +addEnvHooks "$hostOffset" addGuileLibPath diff --git a/pkgs/by-name/gu/guile/setup-hook-2.2.sh b/pkgs/by-name/gu/guile/setup-hook-2.2.sh new file mode 100644 index 0000000..932a5b6 --- /dev/null +++ b/pkgs/by-name/gu/guile/setup-hook-2.2.sh @@ -0,0 +1,19 @@ +addGuileLibPath () { + if test -d "$1/share/guile/site/2.2"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site/2.2" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site/2.2" + elif test -d "$1/share/guile/site"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site" + fi + + if test -d "$1/lib/guile/2.2/ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/2.2/ccache" + fi + + if test -d "$1/lib/guile/2.2/site-ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/2.2/site-ccache" + fi +} + +addEnvHooks "$hostOffset" addGuileLibPath diff --git a/pkgs/by-name/gu/guile/setup-hook-3.0.sh b/pkgs/by-name/gu/guile/setup-hook-3.0.sh new file mode 100644 index 0000000..1a71e82 --- /dev/null +++ b/pkgs/by-name/gu/guile/setup-hook-3.0.sh @@ -0,0 +1,25 @@ +addGuileLibPath () { + if test -d "$1/share/guile/site/3.0"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site/3.0" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site/3.0" + addToSearchPath GUILE_EXTENSIONS_PATH "$1/share/guile/site/3.0" + elif test -d "$1/share/guile/site"; then + addToSearchPath GUILE_LOAD_PATH "$1/share/guile/site" + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/share/guile/site" + addToSearchPath GUILE_EXTENSIONS_PATH "$1/share/guile/site" + fi + + if test -d "$1/lib/guile/3.0/ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/3.0/ccache" + fi + + if test -d "$1/lib/guile/3.0/site-ccache"; then + addToSearchPath GUILE_LOAD_COMPILED_PATH "$1/lib/guile/3.0/site-ccache" + fi + + if test -d "$1/lib/guile/3.0/extensions"; then + addToSearchPath GUILE_EXTENSIONS_PATH "$1/lib/guile/3.0/extensions" + fi +} + +addEnvHooks "$hostOffset" addGuileLibPath diff --git a/pkgs/by-name/gz/gzip/default.nix b/pkgs/by-name/gz/gzip/default.nix new file mode 100644 index 0000000..baff7f0 --- /dev/null +++ b/pkgs/by-name/gz/gzip/default.nix @@ -0,0 +1,74 @@ +{ lib, stdenv +, fetchurl +, makeWrapper +, xz +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "gzip"; + version = "1.13"; + + src = fetchurl { + url = "mirror://gnu/gzip/${pname}-${version}.tar.xz"; + hash = "sha256-dFTraTXbF8ZlVXbC4bD6vv04tNCTbg+H9IzQYs6RoFc="; + }; + + outputs = [ "out" "man" "info" ]; + + enableParallelBuilding = true; + + nativeBuildInputs = [ xz.bin makeWrapper ]; + + makeFlags = [ + "SHELL=/bin/sh" + "GREP=grep" + # gzip 1.12 doesn't build `zless` unless it can find `less`, but we + # can avoid having `less` as a build input if we just override these. + "ZLESS_MAN=zless.1" + "ZLESS_PROG=zless" + ]; + + # Many gzip executables are shell scripts that depend upon other gzip + # executables being in $PATH. Rather than try to re-write all the + # internal cross-references, just add $out/bin to PATH at the top of + # all the executables that are shell scripts. + preFixup = '' + sed -i '1{;/#!\/bin\/sh/aPATH="'$out'/bin:$PATH" + }' $out/bin/* + '' + # run gzip with "-n" when $GZIP_NO_TIMESTAMPS (set by stdenv's setup.sh) is set to stop gzip from adding timestamps + # to archive headers: https://github.com/NixOS/nixpkgs/issues/86348 + # if changing so that there's no longer a .gzip-wrapped then update copy in make-bootstrap-tools.nix + + '' + wrapProgram $out/bin/gzip \ + --add-flags "\''${GZIP_NO_TIMESTAMPS:+-n}" + ''; + + meta = { + homepage = "https://www.gnu.org/software/gzip/"; + description = "GNU zip compression program"; + + longDescription = + ''gzip (GNU zip) is a popular data compression program written by + Jean-loup Gailly for the GNU project. Mark Adler wrote the + decompression part. + + We developed this program as a replacement for compress because of + the Unisys and IBM patents covering the LZW algorithm used by + compress. These patents made it impossible for us to use compress, + and we needed a replacement. The superior compression ratio of gzip + is just a bonus. + ''; + + platforms = lib.platforms.all; + + license = lib.licenses.gpl3Plus; + + mainProgram = "gzip"; + }; +} diff --git a/pkgs/by-name/he/help2man/1.40.4-cygwin-nls.patch b/pkgs/by-name/he/help2man/1.40.4-cygwin-nls.patch new file mode 100644 index 0000000..82f8cf1 --- /dev/null +++ b/pkgs/by-name/he/help2man/1.40.4-cygwin-nls.patch @@ -0,0 +1,165 @@ +LD_PRELOAD by itself only works with Cygwin builtin functions, but +textdomain() and friends come from libintl. In order to override +those functions, we have to "replace" cygintl-?.dll since functions are +bound to a DLL name at link time. Our replacement will be used since +it is loaded first by LD_PRELOAD. + +But as we are making this *the* libintl, we need to provide +pass-throughs for the other functions which we're not overriding, +otherwise Locale::gettext won't load (not to mention the program +that we're trying to help2man). + +--- help2man-1.46.5/Makefile.in 2014-10-09 13:03:01.000000000 +0200 ++++ help2man-1.46.5/Makefile.in 2015-05-12 14:46:52.995521900 +0200 +@@ -76,7 +76,8 @@ + fi + + install_preload: install_dirs preload +- $(INSTALL_PROGRAM) $(preload).so $(DESTDIR)$(pkglibdir) ++ $(INSTALL_PROGRAM) lib/cygintl-9.dll $(DESTDIR)$(pkglibdir) ++ ln -sf cygintl-9.dll $(DESTDIR)$(pkglibdir)/$(preload).so + + install_l10n: install_dirs msg_l10n man_l10n info_l10n + set -e; \ +@@ -144,7 +146,9 @@ + + preload: $(preload).so + $(preload).so: $(srcdir)/$(preload).c +- $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ -fPIC -shared $? $(LIBS) ++ mkdir -p lib ++ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o lib/cygintl-9.dll -shared $? $(LIBS) ++ ln -sf lib/cygintl-9.dll $@ + + man: $(target).1 + $(target).1: $(srcdir)/$(target).PL $(srcdir)/$(target).h2m.PL +--- help2man-1.46.5/bindtextdomain.c 2009-11-13 00:01:34.000000000 -0600 ++++ help2man-1.46.5/bindtextdomain.c 2011-12-29 00:24:33.608078600 -0600 +@@ -27,12 +27,34 @@ static char *(*r_textdomain)(char const + static char *(*r_bindtextdomain)(char const *, char const *) = 0; + static char *(*r_bind_textdomain_codeset)(char const *, char const *) = 0; + ++#ifdef __CYGWIN__ ++static void *RTLD_NEXT = 0; ++static char *(*r_gettext)(const char *) = 0; ++static char *(*r_dgettext)(const char *, const char *) = 0; ++static char *(*r_dcgettext)(const char *, const char *, int) = 0; ++static char *(*r_ngettext)(const char *, const char *, unsigned long int) = 0; ++static char *(*r_dngettext)(const char *, const char *, const char *, ++ unsigned long int) = 0; ++static char *(*r_dcngettext)(const char *, const char *, const char *, ++ unsigned long int, int) = 0; ++static char *(*r_setlocale)(int, const char *) = 0; ++ ++#define SYM(sym) libintl_ ## sym ++#else ++#define SYM(sym) sym ++#endif ++ + void setup() + { + static int done = 0; + if (done++) + return; + ++#ifdef __CYGWIN__ ++ if (!(RTLD_NEXT = dlopen("/usr/bin/cygintl-9.dll", RTLD_LAZY))) ++ die("libintl8 not found"); ++#endif ++ + if (!(e_textdomain = getenv("TEXTDOMAIN"))) + die("TEXTDOMAIN not set"); + +@@ -48,9 +70,19 @@ void setup() + if (!(r_bind_textdomain_codeset = dlsym(RTLD_NEXT, + "bind_textdomain_codeset"))) + die("can't find symbol \"bind_textdomain_codeset\""); ++ ++#ifdef __CYGWIN__ ++ r_gettext = dlsym(RTLD_NEXT, "libintl_gettext"); ++ r_dgettext = dlsym(RTLD_NEXT, "libintl_dgettext"); ++ r_dcgettext = dlsym(RTLD_NEXT, "libintl_dcgettext"); ++ r_ngettext = dlsym(RTLD_NEXT, "libintl_ngettext"); ++ r_dngettext = dlsym(RTLD_NEXT, "libintl_dngettext"); ++ r_dcngettext = dlsym(RTLD_NEXT, "libintl_dcngettext"); ++ r_setlocale = dlsym(RTLD_NEXT, "libintl_setlocale"); ++#endif + } + +-char *textdomain(char const *domainname) ++char *SYM(textdomain)(char const *domainname) + { + char *r; + setup(); +@@ -61,7 +93,7 @@ char *textdomain(char const *domainname) + return r; + } + +-char *bindtextdomain(char const *domainname, char const *dirname) ++char *SYM(bindtextdomain)(char const *domainname, char const *dirname) + { + char const *dir = dirname; + setup(); +@@ -71,7 +103,7 @@ char *bindtextdomain(char const *domainn + return r_bindtextdomain(domainname, dir); + } + +-char *bind_textdomain_codeset(char const *domainname, char const *codeset) ++char *SYM(bind_textdomain_codeset)(char const *domainname, char const *codeset) + { + char *r; + setup(); +@@ -81,3 +113,54 @@ char *bind_textdomain_codeset(char const + + return r; + } ++ ++#ifdef __CYGWIN__ ++ ++char *libintl_gettext(const char *msgid) ++{ ++ setup(); ++ return r_gettext(msgid); ++} ++ ++char *libintl_dgettext (const char *domainname, const char *msgid) ++{ ++ setup(); ++ return r_dgettext(domainname, msgid); ++} ++ ++char *libintl_dcgettext (const char *domainname, const char *msgid, ++ int category) ++{ ++ setup(); ++ return r_dcgettext (domainname, msgid, category); ++} ++ ++char *libintl_ngettext (const char *msgid1, const char *msgid2, ++ unsigned long int n) ++{ ++ setup(); ++ return r_ngettext (msgid1, msgid2, n); ++} ++ ++char *libintl_dngettext (const char *domainname, const char *msgid1, ++ const char *msgid2, unsigned long int n) ++{ ++ setup(); ++ return r_dngettext (domainname, msgid1, msgid2, n); ++} ++ ++char *libintl_dcngettext (const char *domainname, ++ const char *msgid1, const char *msgid2, ++ unsigned long int n, int category) ++{ ++ setup(); ++ return r_dcngettext (domainname, msgid1, msgid2, n, category); ++} ++ ++char *libintl_setlocale (int i, const char *s) ++{ ++ setup(); ++ return r_setlocale (i, s); ++} ++ ++#endif diff --git a/pkgs/by-name/he/help2man/default.nix b/pkgs/by-name/he/help2man/default.nix new file mode 100644 index 0000000..9fd35a0 --- /dev/null +++ b/pkgs/by-name/he/help2man/default.nix @@ -0,0 +1,56 @@ +{ lib, stdenv, fetchurl, perlPackages, gettext, libintl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "help2man"; + version = "1.49.3"; + + src = fetchurl { + url = "mirror://gnu/help2man/help2man-${version}.tar.xz"; + sha256 = "sha256-TX5P3vLspq/geiaCFRzqeHgeCk6PliIULZ9wwIOi/U8="; + }; + + strictDeps = true; + + enableParallelBuilding = true; + + nativeBuildInputs = [ gettext perlPackages.perl perlPackages.LocaleGettext ]; + buildInputs = [ perlPackages.LocaleGettext libintl ]; + + configureFlags = [ + "--enable-nls" + ]; + + doCheck = false; # target `check' is missing + + patches = lib.optional stdenv.hostPlatform.isCygwin ./1.40.4-cygwin-nls.patch; + + # We don't use makeWrapper here because it uses substitutions our + # bootstrap shell can't handle. + postInstall = '' + mv $out/bin/help2man $out/bin/.help2man-wrapped + cat > $out/bin/help2man < +Date: Wed Nov 29 23:55:38 2023 -0500 + + Make build system: enable/disable shared/static support + + This allows building this package in static-lib-only distros. + +diff --git a/Makefile b/Makefile +index 5d21221..cbc7914 100644 +--- a/Makefile ++++ b/Makefile +@@ -18,6 +18,9 @@ + # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + # IN THE SOFTWARE. + ++ENABLE_SHARED ?= 1 ++ENABLE_STATIC ?= ++ + PLATFORM ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"') + HELPER ?= + BINEXT ?= +@@ -25,6 +28,8 @@ SOLIBNAME = libhttp_parser + SOMAJOR = 2 + SOMINOR = 9 + SOREV = 4 ++AEXT = a ++STATICLIBNAME = $(SOLIBNAME).$(AEXT) + ifeq (darwin,$(PLATFORM)) + SOEXT ?= dylib + SONAME ?= $(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOEXT) +@@ -109,11 +114,17 @@ test-valgrind: test_g + libhttp_parser.o: http_parser.c http_parser.h Makefile + $(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o + +-library: libhttp_parser.o +- $(CC) $(LDFLAGS_LIB) -o $(LIBNAME) $< ++.PHONY: library ++library: $(LIBNAME) ++ ++$(LIBNAME): libhttp_parser.o ++ $(CC) $(LDFLAGS_LIB) -o $@ $< + +-package: http_parser.o +- $(AR) rcs libhttp_parser.a http_parser.o ++.PHONY: package ++package: $(STATICLIBNAME) ++ ++$(STATICLIBNAME): http_parser.o ++ $(AR) rcs $@ $< + + url_parser: http_parser.o contrib/url_parser.c + $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o $@ +@@ -130,12 +141,30 @@ parsertrace_g: http_parser_g.o contrib/parsertrace.c + tags: http_parser.c http_parser.h test.c + ctags $^ + +-install: library ++.PHONY: install-headers ++install-headers: + $(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h ++ ++.PHONY: install-library ++install-library: library + $(INSTALL) -D $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME) + ln -sf $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SONAME) + ln -sf $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT) + ++.PHONY: install-package ++install-package: package ++ $(INSTALL) -D $(STATICLIBNAME) $(DESTDIR)$(LIBDIR)/$(STATICLIBNAME) ++ ++.PHONY: install ++install: install-headers ++ifeq ($(ENABLE_SHARED),1) ++install: install-library ++endif ++ifeq ($(ENABLE_STATIC),1) ++install: install-package ++endif ++ ++.PHONY: install-strip + install-strip: library + $(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h + $(INSTALL) -D -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME) +@@ -147,6 +176,7 @@ uninstall: + rm $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT) + rm $(DESTDIR)$(LIBDIR)/$(SONAME) + rm $(DESTDIR)$(LIBDIR)/$(LIBNAME) ++ rm $(DESTDIR)$(LIBDIR)/$(STATICLIBNAME) + + clean: + rm -f *.o *.a tags test test_fast test_g \ diff --git a/pkgs/by-name/hw/hwdata/default.nix b/pkgs/by-name/hw/hwdata/default.nix new file mode 100644 index 0000000..83519d7 --- /dev/null +++ b/pkgs/by-name/hw/hwdata/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchFromGitHub }: + +stdenv.mkDerivation rec { + pname = "hwdata"; + version = "0.381"; + + src = fetchFromGitHub { + owner = "vcrhonek"; + repo = "hwdata"; + rev = "v${version}"; + hash = "sha256-FD1p4qyO+ZsBdMXRa9u6CpO07RewWH8OxULLxcYAsyk="; + }; + + configureFlags = [ "--datadir=${placeholder "out"}/share" ]; + + doCheck = false; # this does build machine-specific checks (e.g. enumerates PCI bus) + + meta = { + homepage = "https://github.com/vcrhonek/hwdata"; + description = "Hardware Database, including Monitors, pci.ids, usb.ids, and video cards"; + license = lib.licenses.gpl2Plus; + maintainers = with lib.maintainers; [ pedrohlc ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/ic/icu/default.nix b/pkgs/by-name/ic/icu/default.nix new file mode 100644 index 0000000..bf59510 --- /dev/null +++ b/pkgs/by-name/ic/icu/default.nix @@ -0,0 +1,77 @@ +{ stdenv, lib, fetchurl, fetchpatch, fixDarwinDylibNames, testers, buildPackages }: + +let + make-icu = (import ./make-icu.nix) { + inherit stdenv lib buildPackages fetchurl fixDarwinDylibNames testers; + }; +in +{ + icu74 = make-icu { + version = "74.2"; + hash = "sha256-aNsIIhKpbW9T411g9H04uWLp+dIHp0z6x4Apro/14Iw="; + }; + icu73 = make-icu { + version = "73.2"; + hash = "sha256-gYqAcS7TyqzZtlIwXgGvx/oWfm8ulJltpEuQwqtgTOE="; + }; + icu72 = make-icu { + version = "72.1"; + hash = "sha256-otLTghcJKn7VZjXjRGf5L5drNw4gGCrTJe3qZoGnHWg="; + }; + icu71 = make-icu { + version = "71.1"; + hash = "sha256-Z6fm5R9h+vEwa2k1Mz4TssSKvY2m0vRs5q3KJLHiHr8="; + }; + icu70 = make-icu { + version = "70.1"; + hash = "sha256-jSBUKMF78Tu1NTAGae0oszihV7HAGuZtMdDT4tR8P9U="; + }; + icu69 = make-icu { + version = "69.1"; + hash = "sha256-TLp7es0dPELES7DBS+ZjcJjH+vKzMM6Ha8XzuRXQl0U="; + }; + icu68 = make-icu { + version = "68.2"; + hash = "sha256-x5GT3uOQeiGZuClqk7UsXLdDMsJvPRZyaUh2gNR51iU="; + }; + icu67 = make-icu { + version = "67.1"; + hash = "sha256-lKgM1vJRpTvSqZf28bWsZlP+eR36tm4esCJ3QPuG1dw="; + }; + icu66 = make-icu { + version = "66.1"; + hash = "sha256-UqPyIJq5VVnBzwoU8kM4AB84lhW/AOJYXvPbxD7PCi4="; + }; + icu64 = make-icu { + version = "64.2"; + hash = "sha256-Yn1dhHjm2W/IyQ/tSFEjkHmlYaaoueSLCJLyToLTHWw="; + }; + icu63 = make-icu { + version = "63.1"; + hash = "sha256-BcSQtpRU/OWGC36OKCEjFnSvChHX7y/r6poyUSmYy50="; + patches = [ + # https://bugzilla.mozilla.org/show_bug.cgi?id=1499398 + (fetchpatch { + url = "https://github.com/unicode-org/icu/commit/8baff8f03e07d8e02304d0c888d0bb21ad2eeb01.patch"; + sha256 = "1awfa98ljcf95a85cssahw6bvdnpbq5brf1kgspy14w4mlmhd0jb"; + }) + ]; + patchFlags = [ "-p3" ]; + }; + icu60 = make-icu { + version = "60.2"; + hash = "sha256-8HPqjzW5JtcLsz5ld1CKpkKosxaoA/Eb4grzhIEdtBg="; + }; + icu58 = make-icu { + version = "58.2"; + hash = "sha256-KwpEEBU6myDeDiDH2LZgSacq7yRLU2g9DXUhNxaD2gw="; + patches = [ + (fetchurl { + url = "http://bugs.icu-project.org/trac/changeset/39484?format=diff"; + name = "icu-changeset-39484.diff"; + sha256 = "0hxhpgydalyxacaaxlmaddc1sjwh65rsnpmg0j414mnblq74vmm8"; + }) + ]; + patchFlags = [ "-p4" ]; + }; +} diff --git a/pkgs/by-name/ic/icu/make-icu.nix b/pkgs/by-name/ic/icu/make-icu.nix new file mode 100644 index 0000000..836a7e3 --- /dev/null +++ b/pkgs/by-name/ic/icu/make-icu.nix @@ -0,0 +1,107 @@ +{ stdenv, lib, buildPackages, fetchurl, fixDarwinDylibNames, testers }: + +{ version, hash, patches ? [], patchFlags ? [] }: + +let + # Cross-compiled icu4c requires a build-root of a native compile + nativeBuildRoot = buildPackages."icu${lib.versions.major version}".buildRootOnly; + + pname = "icu4c"; + + baseAttrs = { + src = fetchurl { + url = "https://github.com/unicode-org/icu/releases/download/release-${lib.replaceStrings [ "." ] [ "-" ] version}/icu4c-${lib.replaceStrings [ "." ] [ "_" ] version}-src.tgz"; + inherit hash; + }; + + postUnpack = '' + sourceRoot=''${sourceRoot}/source + echo Source root reset to ''${sourceRoot} + ''; + + # https://sourceware.org/glibc/wiki/Release/2.26#Removal_of_.27xlocale.h.27 + postPatch = if (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.libc == "musl") && lib.versionOlder version "62.1" + then "substituteInPlace i18n/digitlst.cpp --replace '' ''" + else null; # won't find locale_t on darwin + + inherit patchFlags patches; + + preConfigure = '' + sed -i -e "s|/bin/sh|${stdenv.shell}|" configure + + # $(includedir) is different from $(prefix)/include due to multiple outputs + sed -i -e 's|^\(CPPFLAGS = .*\) -I\$(prefix)/include|\1 -I$(includedir)|' config/Makefile.inc.in + '' + lib.optionalString stdenv.isAarch32 '' + # From https://archlinuxarm.org/packages/armv7h/icu/files/icudata-stdlibs.patch + sed -e 's/LDFLAGSICUDT=-nodefaultlibs -nostdlib/LDFLAGSICUDT=/' -i config/mh-linux + ''; + + configureFlags = [ "--disable-debug" ] + ++ lib.optional (stdenv.isFreeBSD || stdenv.isDarwin) "--enable-rpath" + ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "--with-cross-build=${nativeBuildRoot}"; + + enableParallelBuilding = true; + + meta = with lib; { + description = "Unicode and globalization support library"; + homepage = "https://icu.unicode.org/"; + maintainers = with maintainers; [ raskin ]; + pkgConfigModules = [ + "icu-i18n" + "icu-io" + "icu-uc" + ]; + platforms = platforms.all; + }; + }; + + realAttrs = baseAttrs // { + name = pname + "-" + version; + + outputs = [ "out" "dev" ]; + outputBin = "dev"; + + # FIXME: This fixes dylib references in the dylibs themselves, but + # not in the programs in $out/bin. + nativeBuildInputs = lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; + + # remove dependency on bootstrap-tools in early stdenv build + postInstall = lib.optionalString stdenv.isDarwin '' + sed -i 's/INSTALL_CMD=.*install/INSTALL_CMD=install/' $out/lib/icu/${version}/pkgdata.inc + '' + (let + replacements = [ + { from = "\${prefix}/include"; to = "${placeholder "dev"}/include"; } # --cppflags-searchpath + { from = "\${pkglibdir}/Makefile.inc"; to = "${placeholder "dev"}/lib/icu/Makefile.inc"; } # --incfile + { from = "\${pkglibdir}/pkgdata.inc"; to = "${placeholder "dev"}/lib/icu/pkgdata.inc"; } # --incpkgdatafile + ]; + in '' + substituteInPlace "$dev/bin/icu-config" \ + ${lib.concatMapStringsSep " " (r: "--replace '${r.from}' '${r.to}'") replacements} + ''); + + postFixup = ''moveToOutput lib/icu "$dev" ''; + }; + + buildRootOnlyAttrs = baseAttrs // { + name = pname + "-build-root-" + version; + + preConfigure = baseAttrs.preConfigure + '' + mkdir build + cd build + configureScript=../configure + ''; + + postBuild = '' + cd .. + mv build $out + echo "Doing build-root only, exiting now" >&2 + exit 0 + ''; + }; + + mkWithAttrs = attrs: stdenv.mkDerivation (finalAttrs: attrs // { + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + passthru.buildRootOnly = mkWithAttrs buildRootOnlyAttrs; + }); +in + mkWithAttrs realAttrs diff --git a/pkgs/by-name/ic/icu/packages.nix b/pkgs/by-name/ic/icu/packages.nix new file mode 100644 index 0000000..f1f7dcc --- /dev/null +++ b/pkgs/by-name/ic/icu/packages.nix @@ -0,0 +1,24 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + icu-versions = callPackages ./. { }; + inherit (icu-versions) + icu58 + icu60 + icu63 + icu64 + icu66 + icu67 + icu68 + icu69 + icu70 + icu71 + icu72 + icu73 + icu74 + ; + + icu = icu73; +} diff --git a/pkgs/by-name/im/imagemagick/6.x.nix b/pkgs/by-name/im/imagemagick/6.x.nix new file mode 100644 index 0000000..a433cc6 --- /dev/null +++ b/pkgs/by-name/im/imagemagick/6.x.nix @@ -0,0 +1,144 @@ +{ lib, stdenv, fetchFromGitHub, pkg-config, libtool +, bzip2Support ? true, bzip2 +, zlibSupport ? true, zlib +, libX11Support ? !stdenv.hostPlatform.isMinGW, libX11 +, libXtSupport ? !stdenv.hostPlatform.isMinGW, libXt +, fontconfigSupport ? true, fontconfig +, freetypeSupport ? true, freetype +, ghostscriptSupport ? false, ghostscript +, libjpegSupport ? true, libjpeg +, djvulibreSupport ? true, djvulibre +, lcms2Support ? true, lcms2 +, openexrSupport ? !stdenv.hostPlatform.isMinGW, openexr +, libpngSupport ? true, libpng +, liblqr1Support ? true, liblqr1 +, librsvgSupport ? !stdenv.hostPlatform.isMinGW, librsvg +, libtiffSupport ? true, libtiff +, libxml2Support ? true, libxml2 +, openjpegSupport ? !stdenv.hostPlatform.isMinGW, openjpeg +, libwebpSupport ? !stdenv.hostPlatform.isMinGW, libwebp +, libheifSupport ? true, libheif +, libde265Support ? true, libde265 +, fftw +, ApplicationServices, Foundation +, testers +}: + +let + arch = + if stdenv.hostPlatform.system == "i686-linux" then "i686" + else if stdenv.hostPlatform.system == "x86_64-linux" || stdenv.hostPlatform.system == "x86_64-darwin" then "x86-64" + else if stdenv.hostPlatform.system == "armv7l-linux" then "armv7l" + else if stdenv.hostPlatform.system == "aarch64-linux" || stdenv.hostPlatform.system == "aarch64-darwin" then "aarch64" + else if stdenv.hostPlatform.system == "powerpc64le-linux" then "ppc64le" + else null; +in + +stdenv.mkDerivation (finalAttrs: { + pname = "imagemagick"; + version = "6.9.12-68"; + + src = fetchFromGitHub { + owner = "ImageMagick"; + repo = "ImageMagick6"; + rev = finalAttrs.version; + sha256 = "sha256-slQcA0cblxtG/1DiJx5swUh7Kfwgz5HG70eqJFLaQJI="; + }; + + outputs = [ "out" "dev" "doc" ]; # bin/ isn't really big + outputMan = "out"; # it's tiny + + enableParallelBuilding = true; + + configureFlags = [ + "--with-frozenpaths" + (lib.withFeatureAs (arch != null) "gcc-arch" arch) + (lib.withFeature librsvgSupport "rsvg") + (lib.withFeature liblqr1Support "lqr") + (lib.withFeatureAs ghostscriptSupport "gs-font-dir" "${ghostscript}/share/ghostscript/fonts") + (lib.withFeature ghostscriptSupport "gslib") + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ + # due to libxml2 being without DLLs ATM + "--enable-static" "--disable-shared" + ]; + + nativeBuildInputs = [ pkg-config libtool ]; + + buildInputs = [ ] + ++ lib.optional zlibSupport zlib + ++ lib.optional fontconfigSupport fontconfig + ++ lib.optional ghostscriptSupport ghostscript + ++ lib.optional liblqr1Support liblqr1 + ++ lib.optional libpngSupport libpng + ++ lib.optional libtiffSupport libtiff + ++ lib.optional libxml2Support libxml2 + ++ lib.optional libheifSupport libheif + ++ lib.optional libde265Support libde265 + ++ lib.optional djvulibreSupport djvulibre + ++ lib.optional openexrSupport openexr + ++ lib.optional librsvgSupport librsvg + ++ lib.optional openjpegSupport openjpeg + ++ lib.optionals stdenv.isDarwin [ + ApplicationServices + Foundation + ]; + + propagatedBuildInputs = [ fftw ] + ++ lib.optional bzip2Support bzip2 + ++ lib.optional freetypeSupport freetype + ++ lib.optional libjpegSupport libjpeg + ++ lib.optional lcms2Support lcms2 + ++ lib.optional libX11Support libX11 + ++ lib.optional libXtSupport libXt + ++ lib.optional libwebpSupport libwebp; + + doCheck = false; # fails 2 out of 76 tests + + postInstall = '' + (cd "$dev/include" && ln -s ImageMagick* ImageMagick) + moveToOutput "bin/*-config" "$dev" + moveToOutput "lib/ImageMagick-*/config-Q16" "$dev" # includes configure params + for file in "$dev"/bin/*-config; do + substituteInPlace "$file" --replace "${pkg-config}/bin/pkg-config -config" \ + ${pkg-config}/bin/${pkg-config.targetPrefix}pkg-config + substituteInPlace "$file" --replace ${pkg-config}/bin/pkg-config \ + "PKG_CONFIG_PATH='$dev/lib/pkgconfig' '${pkg-config}/bin/${pkg-config.targetPrefix}pkg-config'" + done + '' + lib.optionalString ghostscriptSupport '' + for la in $out/lib/*.la; do + sed 's|-lgs|-L${lib.getLib ghostscript}/lib -lgs|' -i $la + done + ''; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "https://legacy.imagemagick.org/"; + changelog = "https://legacy.imagemagick.org/script/changelog.php"; + description = "A software suite to create, edit, compose, or convert bitmap images"; + pkgConfigModules = [ "ImageMagick" "MagickWand" ]; + platforms = platforms.linux ++ platforms.darwin; + maintainers = with maintainers; [ ]; + license = licenses.asl20; + knownVulnerabilities = [ + "CVE-2018-16328" + "CVE-2018-16329" + "CVE-2019-13136" + "CVE-2019-17547" + "CVE-2020-25663" + "CVE-2020-27768" + "CVE-2021-3596" + "CVE-2021-3596" + "CVE-2021-3596" + "CVE-2021-3610" + "CVE-2021-20244" + "CVE-2021-20244" + "CVE-2021-20310" + "CVE-2021-20311" + "CVE-2021-20312" + "CVE-2021-20313" + "CVE-2022-0284" + "CVE-2022-2719" + ]; + }; +}) diff --git a/pkgs/by-name/im/imagemagick/default.nix b/pkgs/by-name/im/imagemagick/default.nix new file mode 100644 index 0000000..a507a13 --- /dev/null +++ b/pkgs/by-name/im/imagemagick/default.nix @@ -0,0 +1,152 @@ +{ lib +, stdenv +, fetchFromGitHub +, pkg-config +, libtool +, bzip2Support ? true, bzip2 +, zlibSupport ? true, zlib +, libX11Support ? !stdenv.hostPlatform.isMinGW, libX11 +, libXtSupport ? !stdenv.hostPlatform.isMinGW, libXt +, fontconfigSupport ? true, fontconfig +, freetypeSupport ? true, freetype +, ghostscriptSupport ? false, ghostscript +, libjpegSupport ? true, libjpeg +, djvulibreSupport ? true, djvulibre +, lcms2Support ? true, lcms2 +, openexrSupport ? !stdenv.hostPlatform.isMinGW, openexr +, libjxlSupport ? true, libjxl +, libpngSupport ? true, libpng +, liblqr1Support ? true, liblqr1 +, librawSupport ? true, libraw +, librsvgSupport ? !stdenv.hostPlatform.isMinGW, librsvg, pango +, libtiffSupport ? true, libtiff +, libxml2Support ? true, libxml2 +, openjpegSupport ? !stdenv.hostPlatform.isMinGW, openjpeg +, libwebpSupport ? !stdenv.hostPlatform.isMinGW, libwebp +, libheifSupport ? true, libheif +, potrace +, coreutils +, curl +, ApplicationServices +, Foundation +# for passthru.tests +# , testers +# , imagemagick +# , nixos-icons +# , perlPackages +# , python3 +}: + +assert libXtSupport -> libX11Support; + +let + arch = + if stdenv.hostPlatform.system == "i686-linux" then "i686" + else if stdenv.hostPlatform.system == "x86_64-linux" || stdenv.hostPlatform.system == "x86_64-darwin" then "x86-64" + else if stdenv.hostPlatform.system == "armv7l-linux" then "armv7l" + else if stdenv.hostPlatform.system == "aarch64-linux" || stdenv.hostPlatform.system == "aarch64-darwin" then "aarch64" + else if stdenv.hostPlatform.system == "powerpc64le-linux" then "ppc64le" + else null; +in + +stdenv.mkDerivation (finalAttrs: { + pname = "imagemagick"; + version = "7.1.1-29"; + + src = fetchFromGitHub { + owner = "ImageMagick"; + repo = "ImageMagick"; + rev = finalAttrs.version; + hash = "sha256-W9WbHzmTa0dA9+mOxXu88qmN1mO9ORaH0Nj6r2s1Q+E="; + }; + + outputs = [ "out" "dev" "doc" ]; # bin/ isn't really big + outputMan = "out"; # it's tiny + + enableParallelBuilding = true; + + configureFlags = [ + # specify delegates explicitly otherwise `convert` will invoke the build + # coreutils for filetypes it doesn't natively support. + "MVDelegate=${lib.getExe' coreutils "mv"}" + "RMDelegate=${lib.getExe' coreutils "rm"}" + "--with-frozenpaths" + (lib.withFeatureAs (arch != null) "gcc-arch" arch) + (lib.withFeature librsvgSupport "rsvg") + (lib.withFeature librsvgSupport "pango") + (lib.withFeature liblqr1Support "lqr") + (lib.withFeature libjxlSupport "jxl") + (lib.withFeatureAs ghostscriptSupport "gs-font-dir" "${ghostscript}/share/ghostscript/fonts") + (lib.withFeature ghostscriptSupport "gslib") + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ + # due to libxml2 being without DLLs ATM + "--enable-static" "--disable-shared" + ]; + + nativeBuildInputs = [ pkg-config libtool ]; + + buildInputs = [ potrace ] + ++ lib.optional zlibSupport zlib + ++ lib.optional fontconfigSupport fontconfig + ++ lib.optional ghostscriptSupport ghostscript + ++ lib.optional liblqr1Support liblqr1 + ++ lib.optional libpngSupport libpng + ++ lib.optional librawSupport libraw + ++ lib.optional libtiffSupport libtiff + ++ lib.optional libxml2Support libxml2 + ++ lib.optional libheifSupport libheif + ++ lib.optional djvulibreSupport djvulibre + ++ lib.optional libjxlSupport libjxl + ++ lib.optional openexrSupport openexr + ++ lib.optionals librsvgSupport [ + librsvg + pango + ] + ++ lib.optional openjpegSupport openjpeg + ++ lib.optionals stdenv.isDarwin [ + ApplicationServices + Foundation + ]; + + propagatedBuildInputs = [ curl ] + ++ lib.optional bzip2Support bzip2 + ++ lib.optional freetypeSupport freetype + ++ lib.optional libjpegSupport libjpeg + ++ lib.optional lcms2Support lcms2 + ++ lib.optional libX11Support libX11 + ++ lib.optional libXtSupport libXt + ++ lib.optional libwebpSupport libwebp; + + postInstall = '' + (cd "$dev/include" && ln -s ImageMagick* ImageMagick) + moveToOutput "bin/*-config" "$dev" + moveToOutput "lib/ImageMagick-*/config-Q16HDRI" "$dev" # includes configure params + for file in "$dev"/bin/*-config; do + substituteInPlace "$file" --replace pkg-config \ + "PKG_CONFIG_PATH='$dev/lib/pkgconfig' '$(command -v $PKG_CONFIG)'" + done + '' + lib.optionalString ghostscriptSupport '' + for la in $out/lib/*.la; do + sed 's|-lgs|-L${lib.getLib ghostscript}/lib -lgs|' -i $la + done + ''; + + # passthru.tests = { + # version = testers.testVersion { package = finalAttrs.finalPackage; }; + # inherit nixos-icons; + # inherit (perlPackages) ImageMagick; + # inherit (python3.pkgs) img2pdf; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # }; + + meta = with lib; { + homepage = "http://www.imagemagick.org/"; + changelog = "https://github.com/ImageMagick/Website/blob/main/ChangeLog.md"; + description = "A software suite to create, edit, compose, or convert bitmap images"; + pkgConfigModules = [ "ImageMagick" "MagickWand" ]; + platforms = platforms.linux ++ platforms.darwin; + maintainers = with maintainers; [ erictapen dotlambda rhendric ]; + license = licenses.asl20; + mainProgram = "magick"; + }; +}) diff --git a/pkgs/by-name/im/imagemagick/packages.nix b/pkgs/by-name/im/imagemagick/packages.nix new file mode 100644 index 0000000..8fbd6d7 --- /dev/null +++ b/pkgs/by-name/im/imagemagick/packages.nix @@ -0,0 +1,66 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + imagemagick6_light = imagemagick6.override { + bzip2Support = false; + zlibSupport = false; + libX11Support = false; + libXtSupport = false; + fontconfigSupport = false; + freetypeSupport = false; + ghostscriptSupport = false; + libjpegSupport = false; + djvulibreSupport = false; + lcms2Support = false; + openexrSupport = false; + libpngSupport = false; + liblqr1Support = false; + librsvgSupport = false; + libtiffSupport = false; + libxml2Support = false; + openjpegSupport = false; + libwebpSupport = false; + libheifSupport = false; + libde265Support = false; + }; + + imagemagick6 = callPackage ./6.x.nix { + inherit (darwin.apple_sdk.frameworks) ApplicationServices Foundation; + }; + + imagemagick6Big = imagemagick6.override { + ghostscriptSupport = true; + }; + + imagemagick_light = lowPrio (imagemagick.override { + bzip2Support = false; + zlibSupport = false; + libX11Support = false; + libXtSupport = false; + fontconfigSupport = false; + freetypeSupport = false; + libjpegSupport = false; + djvulibreSupport = false; + lcms2Support = false; + openexrSupport = false; + libjxlSupport = false; + libpngSupport = false; + liblqr1Support = false; + librsvgSupport = false; + libtiffSupport = false; + libxml2Support = false; + openjpegSupport = false; + libwebpSupport = false; + libheifSupport = false; + }); + + imagemagick = lowPrio (callPackage ./. { + inherit (darwin.apple_sdk.frameworks) ApplicationServices Foundation; + }); + + imagemagickBig = lowPrio (imagemagick.override { + ghostscriptSupport = true; + }); +} diff --git a/pkgs/by-name/im/imlib2/default.nix b/pkgs/by-name/im/imlib2/default.nix new file mode 100644 index 0000000..9c75eef --- /dev/null +++ b/pkgs/by-name/im/imlib2/default.nix @@ -0,0 +1,101 @@ +{ lib, stdenv, fetchurl +# Image file formats +, libjpeg, libtiff, giflib, libpng, libwebp, libjxl +, libspectre +# imlib2 can load images from ID3 tags. +, libid3tag, librsvg, libheif +, freetype , bzip2, pkg-config +, x11Support ? true +, webpSupport ? true +, svgSupport ? false +, heifSupport ? false +, jxlSupport ? false +, psSupport ? false + +# for passthru.tests +# , libcaca +# , diffoscopeMinimal +# , feh +# , icewm +# , openbox +# , fluxbox +# , enlightenment +, xorg +# , testers + +# , gitUpdater +}: + +let + inherit (lib) optional optionals; +in +stdenv.mkDerivation (finalAttrs: { + pname = "imlib2"; + version = "1.12.2"; + + src = fetchurl { + url = "mirror://sourceforge/enlightenment/${finalAttrs.pname}-${finalAttrs.version}.tar.xz"; + hash = "sha256-zEmTGiBWCWioZIycoHkIWXYIXqltWaAbHhfLVa8P/kI="; + }; + + buildInputs = [ + libjpeg libtiff giflib libpng + bzip2 freetype libid3tag + ] ++ optionals x11Support [ xorg.libXft xorg.libXext ] + ++ optional heifSupport libheif + ++ optional svgSupport librsvg + ++ optional webpSupport libwebp + ++ optional jxlSupport libjxl + ++ optional psSupport libspectre; + + nativeBuildInputs = [ pkg-config ]; + + enableParallelBuilding = true; + + # Do not build amd64 assembly code on Darwin, because it fails to compile + # with unknow directive errors + configureFlags = optional stdenv.isDarwin "--enable-amd64=no" + ++ optional (!svgSupport) "--without-svg" + ++ optional (!heifSupport) "--without-heif" + ++ optional (!x11Support) "--without-x"; + + outputs = [ "bin" "out" "dev" ]; + + # passthru = { + # tests = { + # inherit + # libcaca + # diffoscopeMinimal + # feh + # icewm + # openbox + # fluxbox + # enlightenment; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # }; + # updateScript = gitUpdater { + # # No nicer place to find latest release. + # url = "https://git.enlightenment.org/old/legacy-imlib2.git"; + # rev-prefix = "v"; + # }; + # }; + + meta = with lib; { + description = "Image manipulation library"; + + longDescription = '' + This is the Imlib 2 library - a library that does image file loading and + saving as well as rendering, manipulation, arbitrary polygon support, etc. + It does ALL of these operations FAST. Imlib2 also tries to be highly + intelligent about doing them, so writing naive programs can be done + easily, without sacrificing speed. + ''; + + homepage = "https://docs.enlightenment.org/api/imlib2/html"; + changelog = "https://git.enlightenment.org/old/legacy-imlib2/raw/tag/v${finalAttrs.version}/ChangeLog"; + license = licenses.imlib2; + pkgConfigModules = [ "imlib2" ]; + platforms = platforms.unix; + maintainers = with maintainers; [ ]; + }; +}) diff --git a/pkgs/by-name/im/imlib2/packages.nix b/pkgs/by-name/im/imlib2/packages.nix new file mode 100644 index 0000000..54acd8b --- /dev/null +++ b/pkgs/by-name/im/imlib2/packages.nix @@ -0,0 +1,19 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + imlib2 = callPackage ./. { }; + imlib2Full = imlib2.override { + # Compilation error on Darwin with librsvg. For more information see: + # https://github.com/NixOS/nixpkgs/pull/166452#issuecomment-1090725613 + svgSupport = !stdenv.isDarwin; + heifSupport = !stdenv.isDarwin; + webpSupport = true; + jxlSupport = true; + psSupport = true; + }; + imlib2-nox = imlib2.override { + x11Support = false; + }; +} diff --git a/pkgs/by-name/in/inotify-tools/default.nix b/pkgs/by-name/in/inotify-tools/default.nix new file mode 100644 index 0000000..e8536ea --- /dev/null +++ b/pkgs/by-name/in/inotify-tools/default.nix @@ -0,0 +1,30 @@ +{ lib, stdenv, autoreconfHook, fetchFromGitHub, nix-update-script, fanotifySupport ? true }: + +stdenv.mkDerivation (finalAttrs: { + pname = "inotify-tools"; + version = "4.23.9.0"; + + src = fetchFromGitHub { + repo = "inotify-tools"; + owner = "inotify-tools"; + rev = finalAttrs.version; + hash = "sha256-6kM2JzxRcwUjUmbUWGnQ+gAvZcn7C32/enRwiYiuQGU="; + }; + + configureFlags = [ + (lib.enableFeature fanotifySupport "fanotify") + ]; + + nativeBuildInputs = [ autoreconfHook ]; + + passthru = { + updateScript = nix-update-script { }; + }; + + meta = with lib; { + homepage = "https://github.com/inotify-tools/inotify-tools/wiki"; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ marcweber pSub shamilton ]; + platforms = platforms.linux; + }; +}) diff --git a/pkgs/by-name/in/intltool/default.nix b/pkgs/by-name/in/intltool/default.nix new file mode 100644 index 0000000..967fc44 --- /dev/null +++ b/pkgs/by-name/in/intltool/default.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl, fetchpatch, gettext, perlPackages, buildPackages }: + +stdenv.mkDerivation rec { + pname = "intltool"; + version = "0.51.0"; + + src = fetchurl { + url = "https://launchpad.net/intltool/trunk/${version}/+download/${pname}-${version}.tar.gz"; + sha256 = "1karx4sb7bnm2j67q0q74hspkfn6lqprpy5r99vkn5bb36a4viv7"; + }; + + # fix "unescaped left brace" errors when using intltool in some cases + patches = [(fetchpatch { + name = "perl5.26-regex-fixes.patch"; + urls = [ + "https://sources.debian.org/data/main/i/intltool/0.51.0-5/debian/patches/perl5.26-regex-fixes.patch" + "https://src.fedoraproject.org/rpms/intltool/raw/d8d2ef29fb122a42a6b6678eb1ec97ae56902af2/f/intltool-perl5.26-regex-fixes.patch" + ]; + sha256 = "12q2140867r5d0dysly72khi7b0mm2gd7nlm1k81iyg7fxgnyz45"; + })]; + + nativeBuildInputs = with perlPackages; [ perl XMLParser ]; + propagatedBuildInputs = [ gettext ] ++ (with perlPackages; [ perl XMLParser ]); + + postInstall = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + for f in $out/bin/*; do + substituteInPlace $f --replace "${buildPackages.perl}" "${perlPackages.perl}" + done + ''; + meta = with lib; { + description = "Translation helper tool"; + homepage = "https://launchpad.net/intltool/"; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ raskin ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ip/iptables/default.nix b/pkgs/by-name/ip/iptables/default.nix new file mode 100644 index 0000000..b824845 --- /dev/null +++ b/pkgs/by-name/ip/iptables/default.nix @@ -0,0 +1,60 @@ +{ lib, stdenv, fetchurl +, autoreconfHook, pkg-config, pruneLibtoolFiles, flex, bison +, libmnl, libnetfilter_conntrack, libnfnetlink, libnftnl, libpcap +, nftablesCompat ? true +, gitUpdater +}: + +stdenv.mkDerivation rec { + version = "1.8.10"; + pname = "iptables"; + + src = fetchurl { + url = "https://www.netfilter.org/projects/${pname}/files/${pname}-${version}.tar.xz"; + sha256 = "XMJVwYk1bjF9BwdVzpNx62Oht4PDRJj7jDAmTzzFnJw="; + }; + + outputs = [ "out" "dev" "man" ]; + + nativeBuildInputs = [ + autoreconfHook pkg-config pruneLibtoolFiles flex bison + ]; + + buildInputs = [ libmnl libnetfilter_conntrack libnfnetlink libnftnl libpcap ]; + + configureFlags = [ + "--enable-bpf-compiler" + "--enable-devel" + "--enable-libipq" + "--enable-nfsynproxy" + "--enable-shared" + ] ++ lib.optional (!nftablesCompat) "--disable-nftables"; + + enableParallelBuilding = true; + + postInstall = lib.optionalString nftablesCompat '' + rm $out/sbin/{iptables,iptables-restore,iptables-save,ip6tables,ip6tables-restore,ip6tables-save} + ln -sv xtables-nft-multi $out/bin/iptables + ln -sv xtables-nft-multi $out/bin/iptables-restore + ln -sv xtables-nft-multi $out/bin/iptables-save + ln -sv xtables-nft-multi $out/bin/ip6tables + ln -sv xtables-nft-multi $out/bin/ip6tables-restore + ln -sv xtables-nft-multi $out/bin/ip6tables-save + ''; + + passthru = { + updateScript = gitUpdater { + url = "https://git.netfilter.org/iptables"; + rev-prefix = "v"; + }; + }; + + meta = with lib; { + description = "A program to configure the Linux IP packet filtering ruleset"; + homepage = "https://www.netfilter.org/projects/iptables/index.html"; + platforms = platforms.linux; + maintainers = with maintainers; [ fpletz ]; + license = licenses.gpl2; + downloadPage = "https://www.netfilter.org/projects/iptables/files/"; + }; +} diff --git a/pkgs/by-name/ip/iptables/packages.nix b/pkgs/by-name/ip/iptables/packages.nix new file mode 100644 index 0000000..8ad4c55 --- /dev/null +++ b/pkgs/by-name/ip/iptables/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + iptables = callPackage ./. { }; + iptables-legacy = callPackage ./. { nftablesCompat = false; }; + iptables-nftables-compat = iptables; +} diff --git a/pkgs/by-name/is/isl/0.11.1.nix b/pkgs/by-name/is/isl/0.11.1.nix new file mode 100644 index 0000000..a11d9ec --- /dev/null +++ b/pkgs/by-name/is/isl/0.11.1.nix @@ -0,0 +1,8 @@ +import ./generic.nix { + version = "0.11.1"; + urls = [ + "https://src.fedoraproject.org/repo/pkgs/gcc/isl-0.11.1.tar.bz2/bce1586384d8635a76d2f017fb067cd2/isl-0.11.1.tar.bz2" + ]; + sha256 = "13d9cqa5rzhbjq0xf0b2dyxag7pqa72xj9dhsa03m8ccr1a4npq9"; + patches = [ ./fix-gcc-build.diff ]; +} diff --git a/pkgs/by-name/is/isl/0.14.1.nix b/pkgs/by-name/is/isl/0.14.1.nix new file mode 100644 index 0000000..1a368d2 --- /dev/null +++ b/pkgs/by-name/is/isl/0.14.1.nix @@ -0,0 +1,8 @@ +import ./generic.nix rec { + version = "0.14.1"; + urls = [ + "mirror://sourceforge/libisl/isl-${version}.tar.xz" + "https://libisl.sourceforge.io/isl-${version}.tar.xz" + ]; + sha256 = "0xa6xagah5rywkywn19rzvbvhfvkmylhcxr6z9z7bz29cpiwk0l8"; +} diff --git a/pkgs/by-name/is/isl/0.17.1.nix b/pkgs/by-name/is/isl/0.17.1.nix new file mode 100644 index 0000000..2e0110d --- /dev/null +++ b/pkgs/by-name/is/isl/0.17.1.nix @@ -0,0 +1,8 @@ +import ./generic.nix rec { + version = "0.17.1"; + urls = [ + "mirror://sourceforge/libisl/isl-${version}.tar.xz" + "https://libisl.sourceforge.io/isl-${version}.tar.xz" + ]; + sha256 = "be152e5c816b477594f4c6194b5666d8129f3a27702756ae9ff60346a8731647"; +} diff --git a/pkgs/by-name/is/isl/0.20.0.nix b/pkgs/by-name/is/isl/0.20.0.nix new file mode 100644 index 0000000..d7567be --- /dev/null +++ b/pkgs/by-name/is/isl/0.20.0.nix @@ -0,0 +1,11 @@ +import ./generic.nix rec { + version = "0.20"; + urls = [ + "mirror://sourceforge/libisl/isl-${version}.tar.xz" + "https://libisl.sourceforge.io/isl-${version}.tar.xz" + ]; + sha256 = "1akpgq0rbqbah5517blg2zlnfvjxfcl9cjrfc75nbcx5p2gnlnd5"; + configureFlags = [ + "--with-gcc-arch=generic" # don't guess -march=/mtune= + ]; +} diff --git a/pkgs/by-name/is/isl/0.24.0.nix b/pkgs/by-name/is/isl/0.24.0.nix new file mode 100644 index 0000000..90eb5ec --- /dev/null +++ b/pkgs/by-name/is/isl/0.24.0.nix @@ -0,0 +1,11 @@ +import ./generic.nix rec { + version = "0.24"; + urls = [ + "mirror://sourceforge/libisl/isl-${version}.tar.xz" + "https://libisl.sourceforge.io/isl-${version}.tar.xz" + ]; + sha256 = "1bgbk6n93qqn7w8v21kxf4x6dc3z0ypqrzvgfd46nhagak60ac84"; + configureFlags = [ + "--with-gcc-arch=generic" # don't guess -march=/mtune= + ]; +} diff --git a/pkgs/by-name/is/isl/fix-gcc-build.diff b/pkgs/by-name/is/isl/fix-gcc-build.diff new file mode 100644 index 0000000..6fbd1f9 --- /dev/null +++ b/pkgs/by-name/is/isl/fix-gcc-build.diff @@ -0,0 +1,12 @@ +diff -ru isl-0.11.1/include/isl/int.h isl-0.11.1.new/include/isl/int.h +--- isl-0.11.1/include/isl/int.h 2012-11-29 09:47:32.000000000 +0100 ++++ isl-0.11.1.new/include/isl/int.h 2013-10-27 15:35:31.348553812 +0100 +@@ -14,7 +14,7 @@ + #include + #include + #if defined(__cplusplus) +-#include ++#include + #endif + + #if defined(__cplusplus) diff --git a/pkgs/by-name/is/isl/generic.nix b/pkgs/by-name/is/isl/generic.nix new file mode 100644 index 0000000..31bd990 --- /dev/null +++ b/pkgs/by-name/is/isl/generic.nix @@ -0,0 +1,41 @@ +{ version +, urls +, sha256 +, configureFlags ? [] +, patches ? [] +}: + +{ lib +, stdenv +, fetchurl +, gmp +, autoreconfHook +, buildPackages +}: + +stdenv.mkDerivation { + pname = "isl"; + inherit version; + + src = fetchurl { + inherit urls sha256; + }; + + inherit patches; + + strictDeps = true; + depsBuildBuild = lib.optionals (lib.versionAtLeast version "0.24") [ buildPackages.stdenv.cc ]; + nativeBuildInputs = lib.optionals (stdenv.hostPlatform.isRiscV && lib.versionOlder version "0.24") [ autoreconfHook ]; + buildInputs = [ gmp ]; + + inherit configureFlags; + + enableParallelBuilding = true; + + meta = { + homepage = "https://libisl.sourceforge.io/"; + license = lib.licenses.lgpl21; + description = "A library for manipulating sets and relations of integer points bounded by linear constraints"; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/is/isl/packages.nix b/pkgs/by-name/is/isl/packages.nix new file mode 100644 index 0000000..80e0e82 --- /dev/null +++ b/pkgs/by-name/is/isl/packages.nix @@ -0,0 +1,12 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + isl = isl_0_20; + isl_0_11 = callPackage ./0.11.1.nix { }; + isl_0_14 = callPackage ./0.14.1.nix { }; + isl_0_17 = callPackage ./0.17.1.nix { }; + isl_0_20 = callPackage ./0.20.0.nix { }; + isl_0_24 = callPackage ./0.24.0.nix { }; +} diff --git a/pkgs/by-name/it/itstool/default.nix b/pkgs/by-name/it/itstool/default.nix new file mode 100644 index 0000000..c8889d3 --- /dev/null +++ b/pkgs/by-name/it/itstool/default.nix @@ -0,0 +1,44 @@ +{ stdenv +, lib +, fetchurl +, python3 +}: + +stdenv.mkDerivation rec { + pname = "itstool"; + version = "2.0.7"; + + src = fetchurl { + url = "http://files.itstool.org/${pname}/${pname}-${version}.tar.bz2"; + hash = "sha256-a5p80poSu5VZj1dQ6HY87niDahogf4W3TYsydbJ+h8o="; + }; + + strictDeps = true; + + nativeBuildInputs = [ + python3 + python3.pkgs.wrapPython + ]; + + buildInputs = [ + python3 + python3.pkgs.libxml2 + ]; + + pythonPath = [ + python3.pkgs.libxml2 + ]; + + postFixup = '' + wrapPythonPrograms + ''; + + meta = { + homepage = "https://itstool.org/"; + description = "XML to PO and back again"; + mainProgram = "itstool"; + license = lib.licenses.gpl3Plus; + platforms = lib.platforms.all; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/ja/jansson/default.nix b/pkgs/by-name/ja/jansson/default.nix new file mode 100644 index 0000000..e868324 --- /dev/null +++ b/pkgs/by-name/ja/jansson/default.nix @@ -0,0 +1,30 @@ +{ lib, stdenv, fetchFromGitHub, cmake }: + +stdenv.mkDerivation rec { + pname = "jansson"; + version = "2.14"; + + src = fetchFromGitHub { + owner = "akheron"; + repo = "jansson"; + rev = "v${version}"; + sha256 = "sha256-FQgy2+g3AyRVJeniqPQj0KNeHgPdza2pmEIXqSyYry4="; + }; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ + # networkmanager relies on libjansson.so: + # https://github.com/NixOS/nixpkgs/pull/176302#issuecomment-1150239453 + "-DJANSSON_BUILD_SHARED_LIBS=${if stdenv.hostPlatform.isStatic then "OFF" else "ON"}" + ]; + + meta = with lib; { + homepage = "https://github.com/akheron/jansson"; + description = "C library for encoding, decoding and manipulating JSON data"; + changelog = "https://github.com/akheron/jansson/raw/v${version}/CHANGES"; + license = licenses.mit; + platforms = platforms.all; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/generate-sources.py b/pkgs/by-name/ja/java/adoptopenjdk-bin/generate-sources.py new file mode 100755 index 0000000..5ff56b2 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/generate-sources.py @@ -0,0 +1,68 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -i python3 -p "python3.withPackages (ps: with ps; [ requests ])" + +import json +import re +import requests +import sys + +# openjdk15 is only for bootstrapping openjdk +releases = ("openjdk8", "openjdk11", "openjdk13", "openjdk14", "openjdk15", "openjdk16", "openjdk17") +oses = ("mac", "linux", "alpine_linux") +types = ("jre", "jdk") +impls = ("hotspot", "openj9") + +arch_to_nixos = { + "x64": ("x86_64",), + "aarch64": ("aarch64",), + "arm": ("armv6l", "armv7l"), + "ppc64le": ("powerpc64le",), +} + +def get_sha256(url): + resp = requests.get(url) + if resp.status_code != 200: + print("error: could not fetch checksum from url {}: code {}".format(url, resp.status_code), file=sys.stderr) + sys.exit(1) + return resp.text.strip().split(" ")[0] + +def generate_sources(release, assets): + out = {} + for asset in assets: + if asset["os"] not in oses: continue + if asset["binary_type"] not in types: continue + if asset["openjdk_impl"] not in impls: continue + if asset["heap_size"] != "normal": continue + if asset["architecture"] not in arch_to_nixos: continue + + # examples: 11.0.1+13, 8.0.222+10 + version, build = asset["version_data"]["semver"].split("+") + + type_map = out.setdefault(asset["os"], {}) + impl_map = type_map.setdefault(asset["binary_type"], {}) + arch_map = impl_map.setdefault(asset["openjdk_impl"], { + "packageType": asset["binary_type"], + "vmType": asset["openjdk_impl"], + }) + + for nixos_arch in arch_to_nixos[asset["architecture"]]: + arch_map[nixos_arch] = { + "url": asset["binary_link"], + "sha256": get_sha256(asset["checksum_link"]), + "version": version, + "build": build, + } + + return out + +out = {} +for release in releases: + resp = requests.get("https://api.adoptopenjdk.net/v2/latestAssets/releases/" + release) + if resp.status_code != 200: + print("error: could not fetch data for release {} (code {})".format(release, resp.code), file=sys.stderr) + sys.exit(1) + out[release] = generate_sources(release, resp.json()) + +with open("sources.json", "w") as f: + json.dump(out, f, indent=2, sort_keys=True) + f.write('\n') diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-darwin-base.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-darwin-base.nix new file mode 100644 index 0000000..68d33b6 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-darwin-base.nix @@ -0,0 +1,66 @@ +{ sourcePerArch, knownVulnerabilities ? [] }: + +{ swingSupport ? true # not used for now +, lib, stdenv +, fetchurl +, setJavaClassPath +}: + +assert (stdenv.isDarwin && stdenv.isx86_64); + +let cpuName = stdenv.hostPlatform.parsed.cpu.name; + result = stdenv.mkDerivation { + pname = if sourcePerArch.packageType == "jdk" + then "adoptopenjdk-${sourcePerArch.vmType}-bin" + else "adoptopenjdk-${sourcePerArch.packageType}-${sourcePerArch.vmType}-bin"; + version = sourcePerArch.${cpuName}.version or (throw "unsupported CPU ${cpuName}"); + + src = fetchurl { + inherit (sourcePerArch.${cpuName}) url sha256; + }; + + # See: https://github.com/NixOS/patchelf/issues/10 + dontStrip = 1; + + installPhase = '' + cd .. + + mv $sourceRoot $out + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/Contents/Home/include/darwin/*_md.h $out/Contents/Home/include/ + + rm -rf $out/Home/demo + + # Remove some broken manpages. + rm -rf $out/Home/man/ja* + + ln -s $out/Contents/Home/* $out/ + + # Propagate the setJavaClassPath setup hook from the JDK so that + # any package that depends on the JDK has $CLASSPATH set up + # properly. + mkdir -p $out/nix-support + printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + cat <> $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi + EOF + ''; + + # FIXME: use multiple outputs or return actual JRE package + passthru.jre = result; + + passthru.home = result; + + meta = with lib; { + license = licenses.gpl2Classpath; + description = "AdoptOpenJDK, prebuilt OpenJDK binary"; + platforms = [ "x86_64-darwin" ]; # some inherit jre.meta.platforms + maintainers = with lib.maintainers; [ taku0 ]; + inherit knownVulnerabilities; + mainProgram = "java"; + }; + +}; in result diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-linux-base.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-linux-base.nix new file mode 100644 index 0000000..712efc2 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk-linux-base.nix @@ -0,0 +1,123 @@ +{ sourcePerArch, knownVulnerabilities ? [] }: + +{ stdenv +, lib +, fetchurl +, autoPatchelfHook +, makeWrapper +, setJavaClassPath +# minimum dependencies +, alsa-lib +, fontconfig +, freetype +, libffi +, xorg +, zlib +# runtime dependencies +, cups +# runtime dependencies for GTK+ Look and Feel +, gtkSupport ? true +, cairo +, glib +, gtk3 +}: + +let + cpuName = stdenv.hostPlatform.parsed.cpu.name; + runtimeDependencies = [ + cups + ] ++ lib.optionals gtkSupport [ + cairo glib gtk3 + ]; + runtimeLibraryPath = lib.makeLibraryPath runtimeDependencies; +in + +let result = stdenv.mkDerivation rec { + pname = if sourcePerArch.packageType == "jdk" + then "adoptopenjdk-${sourcePerArch.vmType}-bin" + else "adoptopenjdk-${sourcePerArch.packageType}-${sourcePerArch.vmType}-bin"; + + version = sourcePerArch.${cpuName}.version or (throw "unsupported CPU ${cpuName}"); + + src = fetchurl { + inherit (sourcePerArch.${cpuName}) url sha256; + }; + + buildInputs = [ + alsa-lib # libasound.so wanted by lib/libjsound.so + fontconfig + freetype + stdenv.cc.cc.lib # libstdc++.so.6 + xorg.libX11 + xorg.libXext + xorg.libXi + xorg.libXrender + xorg.libXtst + zlib + ] ++ lib.optional stdenv.isAarch32 libffi; + + nativeBuildInputs = [ autoPatchelfHook makeWrapper ]; + + # See: https://github.com/NixOS/patchelf/issues/10 + dontStrip = 1; + + installPhase = '' + cd .. + + mv $sourceRoot $out + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + rm -rf $out/demo + + # Remove some broken manpages. + rm -rf $out/man/ja* + + # Remove embedded freetype to avoid problems like + # https://github.com/NixOS/nixpkgs/issues/57733 + find "$out" -name 'libfreetype.so*' -delete + + # Propagate the setJavaClassPath setup hook from the JDK so that + # any package that depends on the JDK has $CLASSPATH set up + # properly. + mkdir -p $out/nix-support + printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + cat <> "$out/nix-support/setup-hook" + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi + EOF + + # We cannot use -exec since wrapProgram is a function but not a command. + # + # jspawnhelper is executed from JVM, so it doesn't need to wrap it, and it + # breaks building OpenJDK (#114495). + for bin in $( find "$out" -executable -type f -not -name jspawnhelper ); do + if patchelf --print-interpreter "$bin" &> /dev/null; then + wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${runtimeLibraryPath}" + fi + done + ''; + + preFixup = '' + find "$out" -name libfontmanager.so -exec \ + patchelf --add-needed libfontconfig.so {} \; + ''; + + # FIXME: use multiple outputs or return actual JRE package + passthru.jre = result; + + passthru.home = result; + + meta = with lib; { + license = licenses.gpl2Classpath; + sourceProvenance = with sourceTypes; [ binaryNativeCode binaryBytecode ]; + description = "AdoptOpenJDK, prebuilt OpenJDK binary"; + platforms = lib.mapAttrsToList (arch: _: arch + "-linux") sourcePerArch; # some inherit jre.meta.platforms + maintainers = with lib.maintainers; [ taku0 ]; + inherit knownVulnerabilities; + mainProgram = "java"; + }; + +}; in result diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-darwin.nix new file mode 100644 index 0000000..1fd2fd8 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk11.mac.jdk.hotspot; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk11.mac.jre.hotspot; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk11.mac.jdk.openj9; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk11.mac.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-linux.nix new file mode 100644 index 0000000..fcad500 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk11-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk11.${variant}.jdk.hotspot; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk11.${variant}.jre.hotspot; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk11.${variant}.jdk.openj9; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk11.${variant}.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-darwin.nix new file mode 100644 index 0000000..fdde25b --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk13.mac.jdk.hotspot; knownVulnerabilities = ["Support ended"]; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk13.mac.jre.hotspot; knownVulnerabilities = ["Support ended"]; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk13.mac.jdk.openj9; knownVulnerabilities = ["Support ended"]; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk13.mac.jre.openj9; knownVulnerabilities = ["Support ended"]; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-linux.nix new file mode 100644 index 0000000..6c57b54 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk13-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk13.${variant}.jdk.hotspot; knownVulnerabilities = ["Support ended"]; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk13.${variant}.jre.hotspot; knownVulnerabilities = ["Support ended"]; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk13.${variant}.jdk.openj9; knownVulnerabilities = ["Support ended"]; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk13.${variant}.jre.openj9; knownVulnerabilities = ["Support ended"]; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-darwin.nix new file mode 100644 index 0000000..1c776f6 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk14.mac.jdk.hotspot; knownVulnerabilities = ["Support ended"]; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk14.mac.jre.hotspot; knownVulnerabilities = ["Support ended"]; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk14.mac.jdk.openj9; knownVulnerabilities = ["Support ended"]; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk14.mac.jre.openj9; knownVulnerabilities = ["Support ended"]; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-linux.nix new file mode 100644 index 0000000..573fc17 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk14-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk14.${variant}.jdk.hotspot; knownVulnerabilities = ["Support ended"]; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk14.${variant}.jre.hotspot; knownVulnerabilities = ["Support ended"]; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk14.${variant}.jdk.openj9; knownVulnerabilities = ["Support ended"]; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk14.${variant}.jre.openj9; knownVulnerabilities = ["Support ended"]; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-darwin.nix new file mode 100644 index 0000000..b9d7066 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk15.mac.jdk.hotspot; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk15.mac.jre.hotspot; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk15.mac.jdk.openj9; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk15.mac.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-linux.nix new file mode 100644 index 0000000..7c6d1d3 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk15-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk15.${variant}.jdk.hotspot; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk15.${variant}.jre.hotspot; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk15.${variant}.jdk.openj9; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk15.${variant}.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-darwin.nix new file mode 100644 index 0000000..a747371 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk16.mac.jdk.hotspot; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk16.mac.jre.hotspot; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk16.mac.jdk.openj9; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk16.mac.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-linux.nix new file mode 100644 index 0000000..3d80390 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk16-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk16.${variant}.jdk.hotspot; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk16.${variant}.jre.hotspot; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk16.${variant}.jdk.openj9; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk16.${variant}.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-darwin.nix new file mode 100644 index 0000000..d9309d9 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-darwin.nix @@ -0,0 +1,9 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk17.mac.jdk.hotspot; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk17.mac.jre.hotspot; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-linux.nix new file mode 100644 index 0000000..e069a85 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk17-linux.nix @@ -0,0 +1,10 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk17.${variant}.jdk.hotspot; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk17.${variant}.jre.hotspot; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-darwin.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-darwin.nix new file mode 100644 index 0000000..8468708 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-darwin.nix @@ -0,0 +1,11 @@ +{ lib }: + +let + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk8.mac.jdk.hotspot; }; + jre-hotspot = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk8.mac.jre.hotspot; }; + jdk-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk8.mac.jdk.openj9; }; + jre-openj9 = import ./jdk-darwin-base.nix { sourcePerArch = sources.openjdk8.mac.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-linux.nix b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-linux.nix new file mode 100644 index 0000000..2b0cac6 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/jdk8-linux.nix @@ -0,0 +1,12 @@ +{ stdenv, lib }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine_linux" else "linux"; + sources = lib.importJSON ./sources.json; +in +{ + jdk-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk8.${variant}.jdk.hotspot; }; + jre-hotspot = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk8.${variant}.jre.hotspot; }; + jdk-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk8.${variant}.jdk.openj9; }; + jre-openj9 = import ./jdk-linux-base.nix { sourcePerArch = sources.openjdk8.${variant}.jre.openj9; }; +} diff --git a/pkgs/by-name/ja/java/adoptopenjdk-bin/sources.json b/pkgs/by-name/ja/java/adoptopenjdk-bin/sources.json new file mode 100644 index 0000000..18b8e68 --- /dev/null +++ b/pkgs/by-name/ja/java/adoptopenjdk-bin/sources.json @@ -0,0 +1,1192 @@ +{ + "openjdk11": { + "alpine_linux": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "45f56d75da2f55b29e7307cc790958e379abbe6b5f160a3824dc26e320c718e5", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_x64_alpine-linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "b5d71cdf3032040e7d2a577712bf525e32e87686af3430219308a39878b98851", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_x64_alpine-linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + } + } + }, + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "0c7763a19b4af4ef5fbae831781b5184e988d6f131d264482399eeaf51b6e254", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "armv6l": { + "build": "7", + "sha256": "be07af349f0d2e1ffb7e01e1e8bac8bffd76e22f6cc1354e5b627222e3395f41", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_arm_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "armv7l": { + "build": "7", + "sha256": "be07af349f0d2e1ffb7e01e1e8bac8bffd76e22f6cc1354e5b627222e3395f41", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_arm_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "1e3704c8e155f8f894953c2a6708a52e6f449bbf5a85450be6fbb2ec76581700", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "5f19fb28aea3e28fcc402b73ce72f62b602992d48769502effe81c52ca39a581", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + }, + "openj9": { + "aarch64": { + "build": "9", + "sha256": "31242e10bb826679aae3ed303be17ad3ef3c2551afbbd19f031ada87dd73258f", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jdk_aarch64_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11-ea" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "9", + "sha256": "691f2b252b5be5e36079177d56ff7b516e3058277f0ba852a16a9a0cd9668224", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jdk_ppc64le_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + }, + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "a605ab06f76533d44ce0828bd96836cc9c0e71ec3df3f8672052ea98dcbcca22", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jdk_x64_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "1fe4b20d808f393422610818711c728331992a4455eeeb061d3d05b45412771d", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_aarch64_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "armv6l": { + "build": "7", + "sha256": "cb754b055177381f9f6852b7e5469904a15edddd7f8e136043c28b1e33aee47c", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_arm_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "armv7l": { + "build": "7", + "sha256": "cb754b055177381f9f6852b7e5469904a15edddd7f8e136043c28b1e33aee47c", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_arm_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "8019d938e5525938ec8e68e2989c4413263b0d9b7b3f20fe0c45f6d967919cfb", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_ppc64le_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "32dcf760664f93531594b72ce9226e9216567de5705a23c9ff5a77c797948054", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_x64_linux_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + }, + "openj9": { + "aarch64": { + "build": "9", + "sha256": "434219d233bdb8f1bee024b1ca5accfc3f1f832320b5221ded715eed101e705f", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jre_aarch64_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11-ea" + }, + "packageType": "jre", + "powerpc64le": { + "build": "9", + "sha256": "f11ae15da7f2809caeeca70a7cf3b9e7f943848869f498f1b73efc10ef7170f0", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jre_ppc64le_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + }, + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "152bf992d965ed018e9e1c3c2eb2c1771f92e0b6485b9a1f2c6d84d282117715", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jre_x64_linux_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "f3b416ecccf51f45cc8c986975eb7bd35e7e1ad953656ab0a807125963fcf73b", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_aarch64_mac_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "fc34c4f0e590071dcd65a0f93540913466ccac3aa8caa984826713b67afb696d", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jdk_x64_mac_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "797cee6b9f6e18bcc026ee9dcebbce81d62ca897038402d247630b25d41efe15", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jdk_x64_mac_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "78a07bd60c278f65bafd0df93890d909ff60259ccbd22ad71a1c3b312906508e", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_aarch64_mac_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "87e439b2193e1a2cf1a8782168bba83b558f54e2708f88ea8296184ea2735c89", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.19%2B7/OpenJDK11U-jre_x64_mac_hotspot_11.0.19_7.tar.gz", + "version": "11.0.19" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "80a0c03f0b603d6008e29c651f884878743fcaa90fc05aef15f3411749da94e7", + "url": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9_openj9-0.26.0/OpenJDK11U-jre_x64_mac_openj9_11.0.11_9_openj9-0.26.0.tar.gz", + "version": "11.0.11" + } + } + } + } + }, + "openjdk13": { + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "8.1", + "sha256": "0e6081cb51f8a6f3062bef4f4c45dbe1fccfd3f3b4b5d52522a3edb76581e3af", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_aarch64_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "armv6l": { + "build": "8.1", + "sha256": "9beec080f2b2a7f6883b024272f4e8d5a0b027325e83647be318215781af1d1a", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_arm_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "armv7l": { + "build": "8.1", + "sha256": "9beec080f2b2a7f6883b024272f4e8d5a0b027325e83647be318215781af1d1a", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_arm_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "8.1", + "sha256": "fb3362e34aac091a4682394d20dcdc3daea51995d369d62c28424573e0fc04aa", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_ppc64le_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "8.1", + "sha256": "9ccc063569f19899fd08e41466f8c4cd4e05058abdb5178fa374cb365dcf5998", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_x64_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "powerpc64le": { + "build": "8.1", + "sha256": "f71513e525172dfef695b7c27b25e151f232e05b2281648c2b794650c4970832", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jdk_ppc64le_linux_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "8.1", + "sha256": "aeecf6d30d0c847db81d07793cf97e5dc44890c29366d7d9f8f9f397f6c52590", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jdk_x64_linux_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "8.1", + "sha256": "6c4b69d1609f4c65c576c80d6aa101de80048f8ce5566f890e8fff5349228bae", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jre_aarch64_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "8.1", + "sha256": "43d6fb71bdf7b6ad9295087c46dfc9b00bf26db1b5cdcff0c418cbe43b49904a", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jre_ppc64le_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "8.1", + "sha256": "897f16fe8e056395209e35d2384013bd1ff250e717465769079e3f4793628c34", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jre_x64_linux_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + } + }, + "openj9": { + "packageType": "jre", + "powerpc64le": { + "build": "8.1", + "sha256": "7bf8dc4c3b95e87b154f7bc2f9388a6539413fe76d49b362bba878217ccb7ed7", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jre_ppc64le_linux_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "8.1", + "sha256": "a0ab38607811e282f64082edc68a2dea3fa6a5113391efb124a6d7d02883110a", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jre_x64_linux_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "8.1", + "sha256": "0ddb24efdf5aab541898d19b7667b149a1a64a8bd039b708fc58ee0284fa7e07", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jdk_x64_mac_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "8.1", + "sha256": "dd8d92eec98a3455ec5cd065a0a6672cc1aef280c6a68c507c372ccc1d98fbaa", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jdk_x64_mac_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "8.1", + "sha256": "3149b9ebf0db1eaf2dc152df9efae82003e7971efb1cf550060e6a4798fe8c5c", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8/OpenJDK13U-jre_x64_mac_hotspot_13.0.2_8.tar.gz", + "version": "13.0.2" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "8.1", + "sha256": "6a8a636fca4c7e368241e232a37cd73c9867cdec8f0869fd158b1f58c6128cc2", + "url": "https://github.com/AdoptOpenJDK/openjdk13-binaries/releases/download/jdk-13.0.2%2B8_openj9-0.18.0/OpenJDK13U-jre_x64_mac_openj9_13.0.2_8_openj9-0.18.0.tar.gz", + "version": "13.0.2" + } + } + } + } + }, + "openjdk14": { + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "12", + "sha256": "ee87e9f03b1fbe6f328429b78fe1a9f44900026d220c90dfd747fe0bcd62d904", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_aarch64_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "armv6l": { + "build": "12", + "sha256": "65f193496c6977ba7aed1563edc4b5be091b5ff03e3d790074bb4e389a034b36", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_arm_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "armv7l": { + "build": "12", + "sha256": "65f193496c6977ba7aed1563edc4b5be091b5ff03e3d790074bb4e389a034b36", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_arm_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "12", + "sha256": "465a3b8e931896b8d95e452d479615c4bf543535c05b6ea246323ae114e67d7d", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_ppc64le_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "7d5ee7e06909b8a99c0d029f512f67b092597aa5b0e78c109bd59405bbfa74fe", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_x64_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "powerpc64le": { + "build": "12", + "sha256": "177fd161ae14df92203d70cd618559daf889ec0c172d6ee615859352f68a2371", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jdk_ppc64le_linux_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "12", + "sha256": "306f7138cdb65daaf2596ec36cafbde72088144c83b2e964f0193662e6caf3be", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jdk_x64_linux_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "12", + "sha256": "2b749ceead19d68dd7e3c28b143dc4f94bb0916378a98b7346e851318ea4da84", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_aarch64_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "armv6l": { + "build": "12", + "sha256": "4468ecf74956783ae41a46e8ba023c003c69e4d111622944aad1af764a1bc4af", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_arm_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "armv7l": { + "build": "12", + "sha256": "4468ecf74956783ae41a46e8ba023c003c69e4d111622944aad1af764a1bc4af", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_arm_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "12", + "sha256": "0f96998be562cfbe8a4114581349dbd2609d0a23091e538fe142dcd9c83e70cf", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_ppc64le_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "1107845947da56e6bdad0da0b79210a079a74ec5c806f815ec5db9d09e1a9236", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_x64_linux_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + } + }, + "openj9": { + "packageType": "jre", + "powerpc64le": { + "build": "12", + "sha256": "ad7a55a3669878c0c7d7c66faafe7c626d4341374719b6fdd81d2986c6e80945", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jre_ppc64le_linux_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "12", + "sha256": "3a137146a7b0bd8b029e72beb37c5fbb09dcfb9e33a10125076fff1555227cfd", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jre_x64_linux_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "09b7e6ab5d5eb4b73813f4caa793a0b616d33794a17988fa6a6b7c972e8f3dd3", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jdk_x64_mac_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "12", + "sha256": "95e6abcc12dde676ccd5ba65ab86f06ddaa22749dde00e31f4c6d3ea95277359", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jdk_x64_mac_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "e8b5196de8ecb2b136a28494c2888784b9d9e22e29d2c38528892fb7d0c95260", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12/OpenJDK14U-jre_x64_mac_hotspot_14.0.2_12.tar.gz", + "version": "14.0.2" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "12", + "sha256": "2562a442d7278409358f474071db34df4ba9c555925f28d0270139f97133c8d5", + "url": "https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.2%2B12_openj9-0.21.0/OpenJDK14U-jre_x64_mac_openj9_14.0.2_12_openj9-0.21.0.tar.gz", + "version": "14.0.2" + } + } + } + } + }, + "openjdk15": { + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "6e8b6b037148cf20a284b5b257ec7bfdf9cc31ccc87778d0dfd95a2fddf228d4", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_aarch64_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "ff39c0380224e419d940382c4d651cb1e6297a794854e0cc459c1fd4973b3368", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_arm_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "ff39c0380224e419d940382c4d651cb1e6297a794854e0cc459c1fd4973b3368", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_arm_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "486f2aad94c5580c0b27c9007beebadfccd4677c0bd9565a77ca5c34af5319f9", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_ppc64le_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "94f20ca8ea97773571492e622563883b8869438a015d02df6028180dd9acc24d", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + } + }, + "openj9": { + "aarch64": { + "build": "7", + "sha256": "b69a4bc87ed2e985d252cff02d53f1a11b8d83d39e0800cd4a1cab4521375314", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jdk_aarch64_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2-ea" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "5b2158268de0be247801b7823ee3e7f739254d77718a1879848627181feee2f4", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jdk_ppc64le_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "5515ccd79b1b5e8d8a615b80d5fe1272f7bb41100e46d94fb78ee611ea014816", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jdk_x64_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "1c1fc968d76004b0be0042027712835dcbe3570a6fc3a208157a4ab6adabbef2", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_aarch64_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "304be224952dbea7000cda6223b2978b3eefdf2e3749032c3b381a213c8d9c5e", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_arm_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "304be224952dbea7000cda6223b2978b3eefdf2e3749032c3b381a213c8d9c5e", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_arm_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "dc2480948ac3e6b192fb77c9d37227510f44482e52a330002d6e7497a62a7d67", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_ppc64le_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "31af7efdb1cc0ffd001bc145c3d255266889ad6b502133283ae8bf233d11334c", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_x64_linux_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + } + }, + "openj9": { + "aarch64": { + "build": "7", + "sha256": "37492012e75d75021dfb2b25fe5cc73664c03fee85532cec30ce4f5a4e5389c6", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jre_aarch64_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2-ea" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "79f657141f1cd0e4a70d041b9215b8b00140d479ce73ed71bc4f3dd015157958", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jre_ppc64le_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + }, + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "a4ae1b7275fcfd6d87a3387edacc8e353dc95ee44f00ca5a348ea90331ec2084", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jre_x64_linux_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "d358a7ff03905282348c6c80562a4da2e04eb377b60ad2152be4c90f8d580b7f", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_mac_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "1336ae5529af3a0e35ae569e4188944831aeed7080a482f2490fc619380cbe53", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jdk_x64_mac_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "6a7150fa3ca8277394ff5bae6f56a70f61d2144a5dbbea4f008d86a3e5498795", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jre_x64_mac_hotspot_15.0.2_7.tar.gz", + "version": "15.0.2" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "2c0ba5e66764d660037343db4bf32f1ed75ad27661e54e9a4df23d40cae448b0", + "url": "https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7_openj9-0.24.0/OpenJDK15U-jre_x64_mac_openj9_15.0.2_7_openj9-0.24.0.tar.gz", + "version": "15.0.2" + } + } + } + } + }, + "openjdk16": { + "alpine_linux": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "85788b1a1f470ca7ddc576028f29abbc3bc3b08f82dd811a3e24371689d7dc0f", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_alpine-linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "5f10ffc12056b735f5fe505ec6c481fff94de27e80c1d77ea9f9e2830669cc1d", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_x64_alpine-linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + } + } + } + }, + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "cb77d9d126f97898dfdc8b5fb694d1e0e5d93d13a0a6cb2aeda76f8635384340", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_aarch64_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "7721ef81416af8122a28448f3d661eb4bda40a9f78d400e4ecc55b58e627a00c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_arm_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "7721ef81416af8122a28448f3d661eb4bda40a9f78d400e4ecc55b58e627a00c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_arm_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "36ebe6c72f2fc19b8b17371f731390e15fa3aab08c28b55b9a8b71d0a578adc9", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_ppc64le_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "323d6d7474a359a28eff7ddd0df8e65bd61554a8ed12ef42fd9365349e573c2c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + }, + "openj9": { + "aarch64": { + "build": "9", + "sha256": "abc56cd266b4acc96cc700b166ad016907dac97d7a593bd5c369d54efc4b4acd", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jdk_aarch64_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1-ea" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "9", + "sha256": "9200acc9ddb6b0d4facf3ea44b17d3a10035316a379b4b148382b25cacf2bb83", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jdk_ppc64le_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + }, + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "7395aaa479a7410bbe5bd5efc43d2669718c61ba146b06657315dbd467b98bf1", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jdk_x64_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "9", + "sha256": "4e47f1cbf46190727be74cd73445ec2b693f5ba4a74542c554d6b3285811cab5", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_aarch64_linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + }, + "armv6l": { + "build": "9", + "sha256": "c1f88f3ce955cb2e9a4236a916cc6660ef55231d29c4390b1a4398ebbca358b7", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_arm_linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + }, + "armv7l": { + "build": "9", + "sha256": "c1f88f3ce955cb2e9a4236a916cc6660ef55231d29c4390b1a4398ebbca358b7", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_arm_linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + }, + "packageType": "jre", + "powerpc64le": { + "build": "9", + "sha256": "495805e2e9bcabeac0d8271623b6c92604440608286f4ce411ea48f582854930", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_ppc64le_linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "5eca19d406c6d130e9c3a4b932b9cb0a6e9cd45932450668c3e911bded4bcf40", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_x64_linux_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + } + }, + "openj9": { + "aarch64": { + "build": "9", + "sha256": "01d8337d1069b8bfdcdf096b30cc24d1df42ffeede676da99fed77bef2670454", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jre_aarch64_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1-ea" + }, + "packageType": "jre", + "powerpc64le": { + "build": "9", + "sha256": "f9734c100f0e85ac63b9f9327b77135221a905e1d743cd9cd4edc0ea0e0fe8d9", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jre_ppc64le_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + }, + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "fab572dd1a2ef00fd18ad4f5a4c373d0cf140045e61f9104cd5b8dbf6b3a517d", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jre_x64_linux_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "27975d9e695cfbb93861540926f9f7bcac973a254ceecbee549706a99cbbdf95", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_mac_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "6d4241c6ede2167fb71bd57f7a770a74564ee007c06bcae98e1abc3c1de4756f", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jdk_x64_mac_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "33eeccbeea75e70b09610ba12e9591386a0e42248525b8358c9ae683bce82779", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jre_x64_mac_hotspot_16.0.1_9.tar.gz", + "version": "16.0.1" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "9", + "sha256": "f57a6f04cf21a8470bb6f9488c57031d89db73c8b24997d74812855372f4e6b8", + "url": "https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9_openj9-0.26.0/OpenJDK16U-jre_x64_mac_openj9_16.0.1_9_openj9-0.26.0.tar.gz", + "version": "16.0.1" + } + } + } + } + }, + "openjdk17": { + "alpine_linux": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "b6edac2fa669876ef16b4895b36b61d01066626e7a69feba2acc19760c8d18cb", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_x64_alpine-linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "711f837bacf8222dee9e8cd7f39941a4a0acf869243f03e6038ca3ba189f66ca", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_x64_alpine-linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + } + }, + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "0084272404b89442871e0a1f112779844090532978ad4d4191b8d03fc6adfade", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "armv6l": { + "build": "7", + "sha256": "e7a84c3e59704588510d7e6cce1f732f397b54a3b558c521912a18a1b4d0abdc", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_arm_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "armv7l": { + "build": "7", + "sha256": "e7a84c3e59704588510d7e6cce1f732f397b54a3b558c521912a18a1b4d0abdc", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_arm_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "8f4366ff1eddb548b1744cd82a1a56ceee60abebbcbad446bfb3ead7ac0f0f85", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "e9458b38e97358850902c2936a1bb5f35f6cffc59da9fcd28c63eab8dbbfbc3b", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "2ff6a4fd1fa354047c93ba8c3179967156162f27bd683aee1f6e52a480bcbe6a", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_aarch64_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "armv6l": { + "build": "7", + "sha256": "5b0401199c7c9163b8395ebf25195ed395fec7b7ef7158c36302420cf993825a", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_arm_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "armv7l": { + "build": "7", + "sha256": "5b0401199c7c9163b8395ebf25195ed395fec7b7ef7158c36302420cf993825a", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_arm_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "cc25e74c0817cd4d943bba056b256b86e0e9148bf41d7600c5ec2e1eadb2e470", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_ppc64le_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "bb025133b96266f6415d5084bb9b260340a813968007f1d2d14690f20bd021ca", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_x64_linux_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "1d6aeb55b47341e8ec33cc1644d58b88dfdcce17aa003a858baa7460550e6ff9", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_aarch64_mac_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "50d0e9840113c93916418068ba6c845f1a72ed0dab80a8a1f7977b0e658b65fb", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jdk_x64_mac_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "625d070a297a3c856badbaa5c65adaaa1adb3ea3813363fb8335c47709b69140", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_aarch64_mac_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "62559a927a8dbac2ea1d7879f590a62fea87d61bfaa92894e578d2045b8d921b", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.7%2B7/OpenJDK17U-jre_x64_mac_hotspot_17.0.7_7.tar.gz", + "version": "17.0.7" + } + } + } + } + }, + "openjdk8": { + "alpine_linux": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "cfdf8e07c8eeb087b7a2895b90fc0a19986bcff85006f1e2b708e3964909aa8e", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_x64_alpine-linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "95d8cb8b5375ec00a064ed728eb60d925d44c1a79fe92f6ca7385b5863d4f78c", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_x64_alpine-linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + } + } + }, + "linux": { + "jdk": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "195808eb42ab73535c84de05188914a52a47c1ac784e4bf66de95fe1fd315a5a", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_aarch64_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "armv6l": { + "build": "7", + "sha256": "3f4848700a4bf856d3c138dc9c2b305b978879c8fbef5aa7df34a7c2fe1b64b8", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_arm_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "armv7l": { + "build": "7", + "sha256": "3f4848700a4bf856d3c138dc9c2b305b978879c8fbef5aa7df34a7c2fe1b64b8", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_arm_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "bb85303848fe402d4f1004f748f80ccb39cb11f356f50a513555d1083c3913b8", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_ppc64le_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "78a0b3547d6f3d46227f2ad8c774248425f20f1cd63f399b713f0cdde2cc376c", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_x64_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + }, + "openj9": { + "aarch64": { + "build": "10", + "sha256": "b168245ddc18b85135c15ed6baea5cbcc06192b49af04dcfa698458373efc061", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jdk_aarch64_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292-ea" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "10", + "sha256": "bc88be757a884b90a2bb91365b7e922c0e7d0fea991cd69d1f74c59b2257a4b5", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jdk_ppc64le_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + }, + "vmType": "openj9", + "x86_64": { + "build": "10", + "sha256": "06d6c9421778575cf59d50f69b7ac6a7bb237485b3a3c2f89cfb61a056c7b2de", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jdk_x64_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + } + } + }, + "jre": { + "hotspot": { + "aarch64": { + "build": "7", + "sha256": "f8e440273c8feb3fcfaca88ba18fec291deae18a548adde8a37cd1db08107b95", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_aarch64_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "armv6l": { + "build": "7", + "sha256": "e58e017012838ae4f0db78293e3246cc09958e6ea9a2393c5947ec003bf736dd", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_arm_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "armv7l": { + "build": "7", + "sha256": "e58e017012838ae4f0db78293e3246cc09958e6ea9a2393c5947ec003bf736dd", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_arm_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "ba5f8141a16722e39576bf42b69d2b8ebf95fc2c05441e3200f609af4dd9f1ea", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_ppc64le_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "b6fdfe32085a884c11b31f66aa67ac62811df7112fb6fb08beea61376a86fbb4", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_x64_linux_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + }, + "openj9": { + "aarch64": { + "build": "10", + "sha256": "f87f90673e25c3ce9e868e96a6059b22665f12d05e389813f75dfbc95d970393", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jre_aarch64_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292-ea" + }, + "packageType": "jre", + "powerpc64le": { + "build": "10", + "sha256": "b75216f7905cff08432a9200a78a2694a4074279f79d859d27f82a998ca1b1e9", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jre_ppc64le_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + }, + "vmType": "openj9", + "x86_64": { + "build": "10", + "sha256": "6d5b67979e0935febe893895b622647bf8a59df6093ae57074db11d2ac9373ea", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jre_x64_linux_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + } + } + } + }, + "mac": { + "jdk": { + "hotspot": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "9c33db312cc46b6bfe705770fdc5c08edb7d790ba70be4e8b12a98e79da5f4a1", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jdk_x64_mac_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + }, + "openj9": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "10", + "sha256": "d262bc226895e80b7e80d61905e65fe043ca0a3e3b930f7b88ddfacb8835e939", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jdk_x64_mac_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + } + } + }, + "jre": { + "hotspot": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "6c876ea7bfa778ae78ec5a976e557b2b981a592a3639eb0d3dc3c8d3dda8d321", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u372-b07/OpenJDK8U-jre_x64_mac_hotspot_8u372b07.tar.gz", + "version": "8.0.372" + } + }, + "openj9": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "10", + "sha256": "50cbc5ef48d0167d649d3ba2c2b8d71553541bffb98914418f4a26e0c5f69aca", + "url": "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10_openj9-0.26.0/OpenJDK8U-jre_x64_mac_openj9_8u292b10_openj9-0.26.0.tar.gz", + "version": "8.0.292" + } + } + } + } + } +} diff --git a/pkgs/by-name/ja/java/java-packages.nix b/pkgs/by-name/ja/java/java-packages.nix new file mode 100644 index 0000000..090a1ce --- /dev/null +++ b/pkgs/by-name/ja/java/java-packages.nix @@ -0,0 +1,250 @@ +{ pkgs }: + +with pkgs; + +let + openjfx11 = callPackage ./openjdk/openjfx/11.nix { }; + openjfx15 = callPackage ./openjdk/openjfx/15.nix { }; + openjfx17 = callPackage ./openjdk/openjfx/17.nix { }; + openjfx19 = callPackage ./openjdk/openjfx/19.nix { }; + openjfx20 = callPackage ./openjdk/openjfx/20.nix { }; + openjfx21 = callPackage ./openjdk/openjfx/21.nix { }; + openjfx22 = callPackage ./openjdk/openjfx/22.nix { }; + +in { + inherit openjfx11 openjfx15 openjfx17 openjfx19 openjfx20 openjfx21 openjfx22; + + compiler = let + + gnomeArgs = { + inherit (gnome2) GConf gnome_vfs; + }; + + bootstrapArgs = gnomeArgs // { + openjfx = openjfx11; /* need this despite next line :-( */ + enableJavaFX = false; + headless = true; + }; + + mkAdoptopenjdk = path-linux: path-darwin: let + package-linux = import path-linux { inherit stdenv lib; }; + package-darwin = import path-darwin { inherit lib; }; + package = if stdenv.isLinux + then package-linux + else package-darwin; + in { + inherit package-linux package-darwin; + __attrsFailEvaluation = true; + + jdk-hotspot = callPackage package.jdk-hotspot {}; + jre-hotspot = callPackage package.jre-hotspot {}; + } // lib.optionalAttrs (package?jdk-openj9) { + jdk-openj9 = callPackage package.jdk-openj9 {}; + } // lib.optionalAttrs (package?jre-openj9) { + jre-openj9 = callPackage package.jre-openj9 {}; + }; + + mkBootstrap = adoptopenjdk: path: args: + /* adoptopenjdk not available for i686, so fall back to our old builds for bootstrapping */ + if !stdenv.hostPlatform.isi686 + then + # only linux has the gtkSupport option + if stdenv.isLinux + then adoptopenjdk.jdk-hotspot.override { gtkSupport = false; } + else adoptopenjdk.jdk-hotspot + else callPackage path args; + + mkOpenjdk = path-linux: path-darwin: args: + if stdenv.isLinux + then mkOpenjdkLinuxOnly path-linux args + else let + openjdk = callPackage path-darwin {}; + in openjdk // { headless = openjdk; }; + + mkOpenjdkLinuxOnly = path-linux: args: let + openjdk = callPackage path-linux (gnomeArgs // args); + in assert stdenv.isLinux; openjdk // { + headless = openjdk.override { headless = true; }; + }; + + in rec { + adoptopenjdk-8 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk8-linux.nix + ./adoptopenjdk-bin/jdk8-darwin.nix; + + adoptopenjdk-11 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk11-linux.nix + ./adoptopenjdk-bin/jdk11-darwin.nix; + + adoptopenjdk-13 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk13-linux.nix + ./adoptopenjdk-bin/jdk13-darwin.nix; + + adoptopenjdk-14 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk14-linux.nix + ./adoptopenjdk-bin/jdk14-darwin.nix; + + adoptopenjdk-15 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk15-linux.nix + ./adoptopenjdk-bin/jdk15-darwin.nix; + + adoptopenjdk-16 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk16-linux.nix + ./adoptopenjdk-bin/jdk16-darwin.nix; + + adoptopenjdk-17 = mkAdoptopenjdk + ./adoptopenjdk-bin/jdk17-linux.nix + ./adoptopenjdk-bin/jdk17-darwin.nix; + + corretto11 = callPackage ./corretto/11.nix { }; + corretto17 = callPackage ./corretto/17.nix { }; + corretto19 = callPackage ./corretto/19.nix { }; + corretto21 = callPackage ./corretto/21.nix { }; + + openjdk8-bootstrap = mkBootstrap adoptopenjdk-8 + ./openjdk/bootstrap.nix + { version = "8"; }; + + openjdk11-bootstrap = mkBootstrap adoptopenjdk-11 + ./openjdk/bootstrap.nix + { version = "10"; }; + + openjdk13-bootstrap = mkBootstrap adoptopenjdk-13 + ./openjdk/12.nix + (bootstrapArgs // { + inherit openjdk11-bootstrap; + /* build segfaults with gcc9 or newer, so use gcc8 like Debian does */ + stdenv = gcc8Stdenv; + }); + + openjdk14-bootstrap = mkBootstrap adoptopenjdk-14 + ./openjdk/13.nix + (bootstrapArgs // { + inherit openjdk13-bootstrap; + }); + + openjdk15-bootstrap = mkBootstrap adoptopenjdk-15 + ./openjdk/14.nix + (bootstrapArgs // { + inherit openjdk14-bootstrap; + }); + + openjdk16-bootstrap = mkBootstrap adoptopenjdk-16 + ./openjdk/15.nix + (bootstrapArgs // { + inherit openjdk15-bootstrap; + }); + + openjdk17-bootstrap = mkBootstrap adoptopenjdk-17 + ./openjdk/16.nix + (bootstrapArgs // { + inherit openjdk16-bootstrap; + }); + + openjdk18-bootstrap = mkBootstrap adoptopenjdk-17 + ./openjdk/17.nix + (bootstrapArgs // { + inherit openjdk17-bootstrap; + }); + + openjdk8 = mkOpenjdk + ./openjdk/8.nix + ./zulu/8.nix + { }; + + openjdk11 = mkOpenjdk + ./openjdk/11.nix + ./zulu/11.nix + { openjfx = openjfx11; }; + + openjdk12 = mkOpenjdkLinuxOnly ./openjdk/12.nix { + /* build segfaults with gcc9 or newer, so use gcc8 like Debian does */ + stdenv = gcc8Stdenv; + openjfx = openjfx11; + }; + + openjdk13 = mkOpenjdkLinuxOnly ./openjdk/13.nix { + inherit openjdk13-bootstrap; + openjfx = openjfx11; + }; + + openjdk14 = mkOpenjdkLinuxOnly ./openjdk/14.nix { + inherit openjdk14-bootstrap; + openjfx = openjfx11; + }; + + openjdk15 = mkOpenjdkLinuxOnly ./openjdk/15.nix { + inherit openjdk15-bootstrap; + openjfx = openjfx15; + }; + + openjdk16 = mkOpenjdkLinuxOnly ./openjdk/16.nix { + inherit openjdk16-bootstrap; + openjfx = openjfx15; + }; + + openjdk17 = mkOpenjdk + ./openjdk/17.nix + ./zulu/17.nix + { + inherit openjdk17-bootstrap; + openjfx = openjfx17; + }; + + openjdk18 = mkOpenjdk + ./openjdk/18.nix + ./zulu/18.nix + { + inherit openjdk18-bootstrap; + openjfx = openjfx17; + }; + + openjdk19 = mkOpenjdk + ./openjdk/19.nix + ./zulu/19.nix + { + openjdk19-bootstrap = temurin-bin.jdk-19; + openjfx = openjfx19; + }; + + openjdk20 = mkOpenjdk + ./openjdk/20.nix + ./zulu/20.nix + { + openjdk20-bootstrap = temurin-bin.jdk-20; + openjfx = openjfx20; + }; + + openjdk21 = mkOpenjdk + ./openjdk/21.nix + ./zulu/21.nix + { + openjdk21-bootstrap = temurin-bin.jdk-21; + openjfx = openjfx21; + }; + + openjdk22 = mkOpenjdk + ./openjdk/22.nix + ./zulu/22.nix + { + openjdk22-bootstrap = temurin-bin.jdk-21; + openjfx = openjfx22; + }; + + temurin-bin = recurseIntoAttrs (callPackage ( + if stdenv.isLinux + then ./temurin-bin/jdk-linux.nix + else ./temurin-bin/jdk-darwin.nix + ) {}); + + semeru-bin = recurseIntoAttrs (callPackage ( + if stdenv.isLinux + then ./semeru-bin/jdk-linux.nix + else ./semeru-bin/jdk-darwin.nix + ) {}); + }; +} +// lib.optionalAttrs config.allowAliases { + jogl_2_4_0 = throw "'jogl_2_4_0' is renamed to/replaced by 'jogl'"; + mavenfod = throw "'mavenfod' is renamed to/replaced by 'maven.buildMavenPackage'"; +} diff --git a/pkgs/by-name/ja/java/openjdk/11.nix b/pkgs/by-name/ja/java/openjdk/11.nix new file mode 100644 index 0000000..e9b8961 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/11.nix @@ -0,0 +1,171 @@ +{ stdenv, lib, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio, file, which, unzip +, zip, perl, cups, freetype, harfbuzz, alsa-lib, libjpeg, giflib, libpng, zlib, lcms2 +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama +, libXcursor, libXrandr, fontconfig, openjdk11-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + major = "11"; + minor = "0"; + update = "19"; + build = "7"; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk11-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation rec { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${major}.${minor}.${update}+${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${major}u"; + rev = "jdk-${version}"; + sha256 = "sha256-mp8toB1dWcwOtMqNFd7UwRg8pLJckovqD/LD5p9zUoA="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype harfbuzz alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap.patch + ./fix-library-path-jdk11.patch + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk10.patch + ]; + + preConfigure = '' + chmod +x configure + substituteInPlace configure --replace /bin/bash "${bash}/bin/bash" + ''; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-harfbuzz=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + "--disable-warnings-as-errors" + ] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc" + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + # Workaround for + # `cc1plus: error: '-Wformat-security' ignored without '-Wformat' [-Werror=format-security]` + # when building jtreg + env.NIX_CFLAGS_COMPILE = "-Wformat"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + meta = import ./meta.nix lib version; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/12.nix b/pkgs/by-name/ja/java/openjdk/12.nix new file mode 100644 index 0000000..ab0696e --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/12.nix @@ -0,0 +1,172 @@ +{ stdenv, lib, fetchurl, bash, pkg-config, autoconf, cpio, file, which, unzip +, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib, libpng, zlib, lcms2 +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama +, libXcursor, libXrandr, fontconfig, openjdk11-bootstrap, fetchpatch +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + major = "12"; + update = ".0.2"; + build = "ga"; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk11-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation rec { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${major}${update}-${build}"; + + src = fetchurl { + url = "http://hg.openjdk.java.net/jdk-updates/jdk${major}u/archive/jdk-${version}.tar.gz"; + sha256 = "1ndlxmikyy298z7lqpr1bd0zxq7yx6xidj8y3c8mw9m9fy64h9c7"; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap.patch + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + # Fix gnumake 4.3 incompatibility + (fetchpatch { + url = "https://github.com/openjdk/panama-foreign/commit/af5c725b8109ce83fc04ef0f8bf6aaf0b50c0441.patch"; + sha256 = "0ja84kih5wkjn58pml53s59qnavb1z92dc88cbgw7vcyqwc1gs0h"; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk10.patch + ]; + + prePatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc" + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = toString [ "-Wno-error" ]; + + NIX_LDFLAGS = lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]; + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + meta = import ./meta.nix lib version; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/13.nix b/pkgs/by-name/ja/java/openjdk/13.nix new file mode 100644 index 0000000..5d5d9f7 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/13.nix @@ -0,0 +1,177 @@ +{ stdenv, lib, fetchurl, bash, pkg-config, autoconf, cpio, file, which, unzip +, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib, libpng, zlib, lcms2 +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama +, libXcursor, libXrandr, fontconfig, openjdk13-bootstrap, fetchpatch +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + major = "13"; + update = ".0.2"; + build = "-ga"; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk13-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation rec { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${major}${update}${build}"; + + src = fetchurl { + url = "http://hg.openjdk.java.net/jdk-updates/jdk${major}u/archive/jdk-${version}.tar.gz"; + sha256 = "1871ziss7ny19rw8f7bay5vznmhpqbfi4ihn3yygs06wyxhm0zmv"; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + # Fix gnumake 4.3 incompatibility + (fetchpatch { + url = "https://github.com/openjdk/panama-foreign/commit/af5c725b8109ce83fc04ef0f8bf6aaf0b50c0441.patch"; + sha256 = "0ja84kih5wkjn58pml53s59qnavb1z92dc88cbgw7vcyqwc1gs0h"; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + prePatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc" + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + meta = (import ./meta.nix lib version) // { broken = true; }; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/14.nix b/pkgs/by-name/ja/java/openjdk/14.nix new file mode 100644 index 0000000..348fd39 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/14.nix @@ -0,0 +1,173 @@ +{ stdenv, lib, fetchurl, bash, pkg-config, autoconf, cpio, file, which, unzip +, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib, libpng, zlib, lcms2 +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama +, libXcursor, libXrandr, fontconfig, openjdk14-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + major = "14"; + update = ".0.2"; + build = "-ga"; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk14-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation rec { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${major}${update}${build}"; + + src = fetchurl { + url = "https://hg.openjdk.java.net/jdk-updates/jdk${major}u/archive/jdk-${version}.tar.gz"; + sha256 = "1s1pc6ihzf0awp4hbaqfxmbica0hnrg8nr7s0yd2hfn7nan8xmf3"; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + prePatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc" + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + meta = (import ./meta.nix lib version) // { broken = true; }; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/15.nix b/pkgs/by-name/ja/java/openjdk/15.nix new file mode 100644 index 0000000..2447b07 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/15.nix @@ -0,0 +1,176 @@ +{ stdenv, lib, fetchurl, bash, pkg-config, autoconf, cpio, file, which, unzip +, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib, libpng, zlib, lcms2 +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama +, libXcursor, libXrandr, fontconfig, openjdk15-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + major = "15"; + update = ".0.1"; + build = "-ga"; + __toString = self: "${self.major}${self.update}${self.build}"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk15-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + inherit version; + + src = fetchurl { + url = "https://hg.openjdk.java.net/jdk-updates/jdk${version.major}u/archive/jdk-${version}.tar.gz"; + sha256 = "1h8n5figc9q0k9p8b0qggyhvqagvxanfih1lj5j492c74cd1mx1l"; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip zip file which ]; + buildInputs = [ + cpio perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + prePatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "major" version; + meta = import ./meta.nix lib version.major; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/16.nix b/pkgs/by-name/ja/java/openjdk/16.nix new file mode 100644 index 0000000..4b0874a --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/16.nix @@ -0,0 +1,180 @@ +{ stdenv, lib, fetchurl, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk16-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "16"; + interim = "0"; + build = "36"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk16-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}+${version.build}"; + sha256 = "165nr15dqfcxzsl5z95g4iklln4rlfkgdigdma576mx8813ldi44"; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + ./fix-glibc-2.34.patch + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + prePatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/17.nix b/pkgs/by-name/ja/java/openjdk/17.nix new file mode 100644 index 0000000..d2c7168 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/17.nix @@ -0,0 +1,194 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, harfbuzz, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk17-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "17"; + interim = ".0.7"; + build = "7"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk17-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}${version.interim}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}${version.interim}+${version.build}"; + sha256 = "sha256-S6QOB4Tbi+K1yjvvywTfvwFI2eX8AiqIx5c3zfxcskc="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype harfbuzz alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk17.patch + ./fix-library-path-jdk17.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Patch borrowed from Alpine to fix build errors with musl libc and recent gcc. + # This is applied anywhere to prevent patchrot. + (fetchurl { + url = "https://git.alpinelinux.org/aports/plain/community/openjdk17/FixNullPtrCast.patch?id=41e78a067953e0b13d062d632bae6c4f8028d91c"; + sha256 = "sha256-LzmSew51+DyqqGyyMw2fbXeBluCiCYsS1nCjt9hX6zo="; + }) + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-harfbuzz=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/18.nix b/pkgs/by-name/ja/java/openjdk/18.nix new file mode 100644 index 0000000..2c49672 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/18.nix @@ -0,0 +1,190 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, harfbuzz, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk18-bootstrap +, setJavaClassPath +, headless ? false +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "18"; + build = "36"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk18-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}+${version.build}"; + sha256 = "sha256-yGPC8VA983Ml6Fv/oiEgRrcVe4oe+Q4oCHbzOmFbZq8="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype harfbuzz alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk18.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Patch borrowed from Alpine to fix build errors with musl libc and recent gcc. + # This is applied anywhere to prevent patchrot. + (fetchpatch { + url = "https://git.alpinelinux.org/aports/plain/testing/openjdk18/FixNullPtrCast.patch?id=b93d1fc37fcf106144958d957bb97c7db67bd41f"; + hash = "sha256-nvO8RcmKwMcPdzq28mZ4If1XJ6FQ76CYWqRIozPCk5U="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-freetype=system" + "--with-harfbuzz=system" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + postBuild = '' + cd build/linux* + make images + cd - + ''; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/19.nix b/pkgs/by-name/ja/java/openjdk/19.nix new file mode 100644 index 0000000..51fd0d8 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/19.nix @@ -0,0 +1,194 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk19-bootstrap +, ensureNewerSourcesForZipFilesHook +, setJavaClassPath +# TODO(@sternenseemann): gtk3 fails to evaluate in pkgsCross.ghcjs.buildPackages +# which should be fixable, this is a no-rebuild workaround for GHC. +, headless ? stdenv.targetPlatform.isGhcjs +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "19"; + interim = ".0.2"; + build = "7"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk19-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}${version.interim}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}${version.interim}+${version.build}"; + hash = "sha256-pBEHmBtIgG4Czou4C/zpBBYZEDImvXiLoA5CjOzpeyI="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ensureNewerSourcesForZipFilesHook ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk18.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Patch borrowed from Alpine to fix build errors with musl libc and recent gcc. + # This is applied anywhere to prevent patchrot. + (fetchpatch { + url = "https://git.alpinelinux.org/aports/plain/testing/openjdk19/FixNullPtrCast.patch?id=93dc07f97ff716b647c5f57c6224901ea06da560"; + hash = "sha256-H4X3Yip5bCpXMH7MSu9BgXIOYRVUBMZPZW8EvZSWI5k="; + }) + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/20.nix b/pkgs/by-name/ja/java/openjdk/20.nix new file mode 100644 index 0000000..2be834a --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/20.nix @@ -0,0 +1,194 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk20-bootstrap +, ensureNewerSourcesForZipFilesHook +, setJavaClassPath +# TODO(@sternenseemann): gtk3 fails to evaluate in pkgsCross.ghcjs.buildPackages +# which should be fixable, this is a no-rebuild workaround for GHC. +, headless ? stdenv.targetPlatform.isGhcjs +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "20"; + interim = ""; + build = "36"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk20-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}${version.interim}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}${version.interim}+${version.build}"; + hash = "sha256-fXoSO8nq5qpUYbCtbrRr2C46XRdYX77Pxmk7GfmlZV4="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ensureNewerSourcesForZipFilesHook ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk10.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk18.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Patch borrowed from Alpine to fix build errors with musl libc and recent gcc. + # This is applied anywhere to prevent patchrot. + (fetchpatch { + url = "https://git.alpinelinux.org/aports/plain/testing/openjdk19/FixNullPtrCast.patch?id=93dc07f97ff716b647c5f57c6224901ea06da560"; + hash = "sha256-H4X3Yip5bCpXMH7MSu9BgXIOYRVUBMZPZW8EvZSWI5k="; + }) + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/21.nix b/pkgs/by-name/ja/java/openjdk/21.nix new file mode 100644 index 0000000..623ac28 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/21.nix @@ -0,0 +1,188 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchFromGitHub, bash, pkg-config, autoconf, cpio +, file, which, unzip, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib +, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst +, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk21-bootstrap +, ensureNewerSourcesForZipFilesHook +, setJavaClassPath +# TODO(@sternenseemann): gtk3 fails to evaluate in pkgsCross.ghcjs.buildPackages +# which should be fixable, this is a no-rebuild workaround for GHC. +, headless ? stdenv.targetPlatform.isGhcjs +, enableJavaFX ? false, openjfx +, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf +}: + +let + version = { + feature = "21"; + interim = ""; + build = "35"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk21-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}${version.interim}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}${version.interim}+${version.build}"; + hash = "sha256-fA8nRWBuTL87S8mwapmNfCPPQoI2aKHjbHJ6PDN3khs="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ensureNewerSourcesForZipFilesHook ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib + libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk21.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk18.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = ["build" "host"]; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc" + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in openjdk diff --git a/pkgs/by-name/ja/java/openjdk/22.nix b/pkgs/by-name/ja/java/openjdk/22.nix new file mode 100644 index 0000000..bef62b6 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/22.nix @@ -0,0 +1,260 @@ +{ stdenv +, lib +, fetchurl +, fetchpatch +, fetchFromGitHub +, bash +, pkg-config +, autoconf +, cpio +, file +, which +, unzip +, zip +, perl +, cups +, freetype +, alsa-lib +, libjpeg +, giflib +, libpng +, zlib +, lcms2 +, libX11 +, libICE +, libXrender +, libXext +, libXt +, libXtst +, libXi +, libXinerama +, libXcursor +, libXrandr +, fontconfig +, openjdk22-bootstrap +, ensureNewerSourcesForZipFilesHook +, setJavaClassPath + # TODO(@sternenseemann): gtk3 fails to evaluate in pkgsCross.ghcjs.buildPackages + # which should be fixable, this is a no-rebuild workaround for GHC. +, headless ? stdenv.targetPlatform.isGhcjs +, enableJavaFX ? false +, openjfx +, enableGnome2 ? true +, gtk3 +, gnome_vfs +, glib +, GConf +}: + +let + version = { + feature = "22"; + interim = ""; + build = "36"; + }; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk22-bootstrap.override { gtkSupport = !headless; }; + + openjdk = stdenv.mkDerivation { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "${version.feature}${version.interim}+${version.build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk${version.feature}u"; + rev = "jdk-${version.feature}${version.interim}+${version.build}"; + hash = "sha256-itjvIedPwJl/l3a2gIVpNMs1zkbrjioVqbCj1Z1nCJE="; + }; + + nativeBuildInputs = [ pkg-config autoconf unzip ensureNewerSourcesForZipFilesHook ]; + buildInputs = [ + cpio + file + which + zip + perl + zlib + cups + freetype + alsa-lib + libjpeg + giflib + libpng + zlib + lcms2 + libX11 + libICE + libXrender + libXext + libXtst + libXt + libXtst + libXi + libXinerama + libXcursor + libXrandr + fontconfig + openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk3 + gnome_vfs + GConf + glib + ]; + + patches = [ + ./fix-java-home-jdk21.patch + ./read-truststore-from-env-jdk10.patch + ./currency-date-range-jdk10.patch + ./increase-javadoc-heap-jdk13.patch + ./ignore-LegalNoticeFilePlugin-jdk18.patch + + # -Wformat etc. are stricter in newer gccs, per + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677 + # so grab the work-around from + # https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24 + (fetchurl { + url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch"; + sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r"; + }) + + # Fix build for gnumake-4.4.1: + # https://github.com/openjdk/jdk/pull/12992 + (fetchpatch { + name = "gnumake-4.4.1"; + url = "https://github.com/openjdk/jdk/commit/9341d135b855cc208d48e47d30cd90aafa354c36.patch"; + hash = "sha256-Qcm3ZmGCOYLZcskNjj7DYR85R4v07vYvvavrVOYL8vg="; + }) + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk13.patch + ]; + + postPatch = '' + chmod +x configure + patchShebangs --build configure + ''; + + # JDK's build system attempts to specifically detect + # and special-case WSL, and we don't want it to do that, + # so pass the correct platform names explicitly + configurePlatforms = [ "build" "host" ]; + + + # https://openjdk.org/groups/build/doc/building.html + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-version-build=${version.build}" + "--with-version-opt=nixos" + "--with-version-pre=" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--with-libjpeg=system" + "--with-giflib=system" + "--with-libpng=system" + "--with-zlib=system" + "--with-lcms=system" + "--with-stdc++lib=dynamic" + ] + ++ lib.optional headless "--enable-headless-only" + ++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + NIX_LDFLAGS = toString (lib.optionals (!headless) [ + "-lfontconfig" + "-lcups" + "-lXinerama" + "-lXrandr" + "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-3" + "-lgio-2.0" + "-lgnomevfs-2" + "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "images" ]; + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/jdk $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081) + ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo + ${lib.optionalString headless '' + rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so + ''} + + ln -s $out/lib/openjdk/bin $out/bin + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook so that any package + # that depends on the JDK has $CLASSPATH set up properly. + mkdir -p $out/nix-support + #TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040 + echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk-bootstrap ]; + + pos = builtins.unsafeGetAttrPos "feature" version; + meta = import ./meta.nix lib version.feature; + + passthru = { + architecture = ""; + home = "${openjdk}/lib/openjdk"; + inherit gtk3; + }; + }; +in +openjdk diff --git a/pkgs/by-name/ja/java/openjdk/8.nix b/pkgs/by-name/ja/java/openjdk/8.nix new file mode 100644 index 0000000..aebfcee --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/8.nix @@ -0,0 +1,226 @@ +{ stdenv, lib, fetchFromGitHub, pkg-config, lndir, bash, cpio, file, which, unzip, zip +, cups, freetype, alsa-lib, cacert, perl, liberation_ttf, fontconfig, zlib +, libX11, libICE, libXrender, libXext, libXt, libXtst, libXi, libXinerama, libXcursor, libXrandr +, libjpeg, giflib +, openjdk8-bootstrap +, setJavaClassPath +, headless ? false +, enableGnome2 ? true, gtk2, gnome_vfs, glib, GConf +}: + +let + + /** + * The JRE libraries are in directories that depend on the CPU. + */ + architecture = { + i686-linux = "i386"; + x86_64-linux = "amd64"; + aarch64-linux = "aarch64"; + powerpc64le-linux = "ppc64le"; + }.${stdenv.system} or (throw "Unsupported platform ${stdenv.system}"); + + update = "362"; + build = "ga"; + + # when building a headless jdk, also bootstrap it with a headless jdk + openjdk-bootstrap = openjdk8-bootstrap.override { gtkSupport = !headless; }; + + openjdk8 = stdenv.mkDerivation rec { + pname = "openjdk" + lib.optionalString headless "-headless"; + version = "8u${update}-${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jdk8u"; + rev = "jdk${version}"; + sha256 = "sha256-C5dQwfIIpIrLeO3JWERyFCQHUSgG8gARuc3qXAeLkJ4="; + }; + outputs = [ "out" "jre" ]; + + nativeBuildInputs = [ pkg-config lndir unzip ]; + buildInputs = [ + cpio file which zip perl zlib cups freetype alsa-lib + libjpeg giflib libX11 libICE libXext libXrender libXtst libXt libXtst + libXi libXinerama libXcursor libXrandr fontconfig openjdk-bootstrap + ] ++ lib.optionals (!headless && enableGnome2) [ + gtk2 gnome_vfs GConf glib + ]; + + patches = [ + ./fix-java-home-jdk8.patch + ./read-truststore-from-env-jdk8.patch + ./currency-date-range-jdk8.patch + ./fix-library-path-jdk8.patch + ] ++ lib.optionals (!headless && enableGnome2) [ + ./swing-use-gtk-jdk8.patch + ]; + + # Hotspot cares about the host(!) version otherwise + DISABLE_HOTSPOT_OS_VERSION_CHECK = "ok"; + + preConfigure = '' + chmod +x configure + substituteInPlace configure --replace /bin/bash "${bash}/bin/bash" + substituteInPlace hotspot/make/linux/adlc_updater --replace /bin/sh "${stdenv.shell}" + substituteInPlace hotspot/make/linux/makefiles/dtrace.make --replace /usr/include/sys/sdt.h "/no-such-path" + ''; + + configureFlags = [ + "--with-boot-jdk=${openjdk-bootstrap.home}" + "--with-update-version=${update}" + "--with-build-number=${build}" + "--with-milestone=fcs" + "--enable-unlimited-crypto" + "--with-native-debug-symbols=internal" + "--disable-freetype-bundling" + "--with-zlib=system" + "--with-giflib=system" + "--with-stdc++lib=dynamic" + ] ++ lib.optional headless "--disable-headful"; + + separateDebugInfo = true; + + env.NIX_CFLAGS_COMPILE = toString ([ + # glibc 2.24 deprecated readdir_r so we need this + # See https://www.mail-archive.com/openembedded-devel@lists.openembedded.org/msg49006.html + "-Wno-error=deprecated-declarations" + ] ++ lib.optionals stdenv.cc.isGNU [ + # https://bugzilla.redhat.com/show_bug.cgi?id=1306558 + # https://github.com/JetBrains/jdk8u/commit/eaa5e0711a43d64874111254d74893fa299d5716 + "-fno-lifetime-dse" + "-fno-delete-null-pointer-checks" + "-std=gnu++98" + "-Wno-error" + ]); + + NIX_LDFLAGS= toString (lib.optionals (!headless) [ + "-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic" + ] ++ lib.optionals (!headless && enableGnome2) [ + "-lgtk-x11-2.0" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2" + ]); + + # -j flag is explicitly rejected by the build system: + # Error: 'make -jN' is not supported, use 'make JOBS=N' + # Note: it does not make build sequential. Build system + # still runs in parallel. + enableParallelBuilding = false; + + buildFlags = [ "all" ]; + + doCheck = false; # fails with "No rule to make target 'y'." + + installPhase = '' + mkdir -p $out/lib + + mv build/*/images/j2sdk-image $out/lib/openjdk + + # Remove some broken manpages. + rm -rf $out/lib/openjdk/man/ja* + + # Mirror some stuff in top-level. + mkdir -p $out/share + ln -s $out/lib/openjdk/include $out/include + ln -s $out/lib/openjdk/man $out/share/man + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove crap from the installation. + rm -rf $out/lib/openjdk/demo $out/lib/openjdk/sample + ${lib.optionalString headless '' + rm $out/lib/openjdk/jre/lib/${architecture}/{libjsound,libjsoundalsa,libsplashscreen,libawt*,libfontmanager}.so + rm $out/lib/openjdk/jre/bin/policytool + rm $out/lib/openjdk/bin/{policytool,appletviewer} + ''} + + # Move the JRE to a separate output + mkdir -p $jre/lib/openjdk + mv $out/lib/openjdk/jre $jre/lib/openjdk/jre + mkdir $out/lib/openjdk/jre + lndir $jre/lib/openjdk/jre $out/lib/openjdk/jre + + # Make sure cmm/*.pf are not symlinks: + # https://youtrack.jetbrains.com/issue/IDEA-147272 + rm -rf $out/lib/openjdk/jre/lib/cmm + ln -s {$jre,$out}/lib/openjdk/jre/lib/cmm + + # Setup fallback fonts + ${lib.optionalString (!headless) '' + mkdir -p $jre/lib/openjdk/jre/lib/fonts + ln -s ${liberation_ttf}/share/fonts/truetype $jre/lib/openjdk/jre/lib/fonts/fallback + ''} + + # Remove duplicate binaries. + for i in $(cd $out/lib/openjdk/bin && echo *); do + if [ "$i" = java ]; then continue; fi + if cmp -s $out/lib/openjdk/bin/$i $jre/lib/openjdk/jre/bin/$i; then + ln -sfn $jre/lib/openjdk/jre/bin/$i $out/lib/openjdk/bin/$i + fi + done + + # Generate certificates. + ( + cd $jre/lib/openjdk/jre/lib/security + rm cacerts + perl ${./generate-cacerts.pl} $jre/lib/openjdk/jre/bin/keytool ${cacert}/etc/ssl/certs/ca-bundle.crt + ) + + ln -s $out/lib/openjdk/bin $out/bin + ln -s $jre/lib/openjdk/jre/bin $jre/bin + ln -s $jre/lib/openjdk/jre $out/jre + ''; + + propagatedBuildInputs = [ setJavaClassPath ]; + + preFixup = '' + # Propagate the setJavaClassPath setup hook from the JRE so that + # any package that depends on the JRE has $CLASSPATH set up + # properly. + mkdir -p $jre/nix-support + printWords ${setJavaClassPath} > $jre/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + mkdir -p $out/nix-support + cat < $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi + EOF + ''; + + postFixup = '' + # Build the set of output library directories to rpath against + LIBDIRS="" + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort | uniq | tr '\n' ':'):$LIBDIRS" + done + # Add the local library paths to remove dependencies on the bootstrap + for output in $(getAllOutputNames); do + if [ "$output" = debug ]; then continue; fi + OUTPUTDIR=$(eval echo \$$output) + BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*) + echo "$BINLIBS" | while read i; do + patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true + patchelf --shrink-rpath "$i" || true + done + done + ''; + + disallowedReferences = [ openjdk8-bootstrap ]; + + meta = with lib; { + homepage = "http://openjdk.java.net/"; + license = licenses.gpl2; + description = "The open-source Java Development Kit"; + maintainers = with maintainers; [ edwtjo ]; + platforms = [ "i686-linux" "x86_64-linux" "aarch64-linux" ]; + mainProgram = "java"; + }; + + passthru = { + inherit architecture; + home = "${openjdk8}/lib/openjdk"; + inherit gtk2; + }; + }; +in openjdk8 diff --git a/pkgs/by-name/ja/java/openjdk/bootstrap.nix b/pkgs/by-name/ja/java/openjdk/bootstrap.nix new file mode 100644 index 0000000..e58888c --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/bootstrap.nix @@ -0,0 +1,40 @@ +{ stdenv +, runCommand, fetchurl, zlib + +, version +}: + +assert stdenv.hostPlatform.libc == "glibc"; + +let + fetchboot = version: arch: sha256: fetchurl { + name = "openjdk${version}-bootstrap-${arch}-linux.tar.xz"; + url = "http://tarballs.nixos.org/openjdk/2018-03-31/${version}/${arch}-linux.tar.xz"; + inherit sha256; + }; + + src = if stdenv.hostPlatform.system == "x86_64-linux" then + (if version == "10" then fetchboot "10" "x86_64" "08085fsxc1qhqiv3yi38w8lrg3vm7s0m2yvnwr1c92v019806yq2" + else if version == "8" then fetchboot "8" "x86_64" "18zqx6jhm3lizn9hh6ryyqc9dz3i96pwaz8f6nxfllk70qi5gvks" + else throw "No bootstrap jdk for version ${version}") + else if stdenv.hostPlatform.system == "i686-linux" then + (if version == "10" then fetchboot "10" "i686" "1blb9gyzp8gfyggxvggqgpcgfcyi00ndnnskipwgdm031qva94p7" + else if version == "8" then fetchboot "8" "i686" "1yx04xh8bqz7amg12d13rw5vwa008rav59mxjw1b9s6ynkvfgqq9" + else throw "No bootstrap for version") + else throw "No bootstrap jdk for system ${stdenv.hostPlatform.system}"; + + bootstrap = runCommand "openjdk-bootstrap" { + passthru.home = "${bootstrap}/lib/openjdk"; + } '' + tar xvf ${src} + mv openjdk-bootstrap $out + + LIBDIRS="$(find $out -name \*.so\* -exec dirname {} \; | sort | uniq | tr '\n' ':')" + + find "$out" -type f -print0 | while IFS= read -r -d "" elf; do + isELF "$elf" || continue + patchelf --set-interpreter $(cat "${stdenv.cc}/nix-support/dynamic-linker") "$elf" || true + patchelf --set-rpath "${stdenv.cc.libc}/lib:${stdenv.cc.cc.lib}/lib:${zlib}/lib:$LIBDIRS" "$elf" || true + done + ''; +in bootstrap diff --git a/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk10.patch b/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk10.patch new file mode 100644 index 0000000..e058eff --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk10.patch @@ -0,0 +1,13 @@ +--- ./make/jdk/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java ++++ ./make/jdk/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java +@@ -281,8 +281,8 @@ + checkCurrencyCode(newCurrency); + String timeString = currencyInfo.substring(4, length - 4); + long time = format.parse(timeString).getTime(); +- if (Math.abs(time - System.currentTimeMillis()) > ((long) 10) * 365 * 24 * 60 * 60 * 1000) { +- throw new RuntimeException("time is more than 10 years from present: " + time); ++ if (Math.abs(time - System.currentTimeMillis()) > ((long) 20) * 365 * 24 * 60 * 60 * 1000) { ++ throw new RuntimeException("time is more than 20 years from present: " + time); + } + specialCaseCutOverTimes[specialCaseCount] = time; + specialCaseOldCurrencies[specialCaseCount] = oldCurrency; diff --git a/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk8.patch b/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk8.patch new file mode 100644 index 0000000..2ff0fcc --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/currency-date-range-jdk8.patch @@ -0,0 +1,14 @@ +diff -Naur openjdk-7u65-b32-upstream/jdk/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java openjdk-7u65-b32/jdk/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java +--- openjdk-7u65-b32-upstream/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java 2014-07-17 05:42:14.000000000 -0430 ++++ openjdk-7u65-b32/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java 2014-12-30 10:15:50.327905933 -0430 +@@ -281,8 +281,8 @@ + checkCurrencyCode(newCurrency); + String timeString = currencyInfo.substring(4, length - 4); + long time = format.parse(timeString).getTime(); +- if (Math.abs(time - System.currentTimeMillis()) > ((long) 10) * 365 * 24 * 60 * 60 * 1000) { +- throw new RuntimeException("time is more than 10 years from present: " + time); ++ if (Math.abs(time - System.currentTimeMillis()) > ((long) 20) * 365 * 24 * 60 * 60 * 1000) { ++ throw new RuntimeException("time is more than 20 years from present: " + time); + } + specialCaseCutOverTimes[specialCaseCount] = time; + specialCaseOldCurrencies[specialCaseCount] = oldCurrency; diff --git a/pkgs/by-name/ja/java/openjdk/fix-glibc-2.34.patch b/pkgs/by-name/ja/java/openjdk/fix-glibc-2.34.patch new file mode 100644 index 0000000..7bf8b2b --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-glibc-2.34.patch @@ -0,0 +1,24 @@ +Taken from https://build.opensuse.org/package/view_file/Java:Factory/java-15-openjdk/openjdk-glibc234.patch + +--- openjdk/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c 2021-04-09 11:36:58.000000000 +0200 ++++ openjdk/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c 2021-08-26 15:42:52.326232581 +0200 +@@ -67,8 +67,17 @@ + longjmp(context, 1); + } + ++static char* altstack = NULL; ++ + void set_signal_handler() { +- static char altstack[SIGSTKSZ]; ++ if (altstack == NULL) { ++ // Dynamically allocated in case SIGSTKSZ is not constant ++ altstack = malloc(SIGSTKSZ); ++ if (altstack == NULL) { ++ fprintf(stderr, "Test ERROR. Unable to malloc altstack space\n"); ++ exit(7); ++ } ++ } + + stack_t ss = { + .ss_size = SIGSTKSZ, + diff --git a/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk10.patch b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk10.patch new file mode 100644 index 0000000..c037fde --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk10.patch @@ -0,0 +1,14 @@ +--- a/src/hotspot/os/linux/os_linux.cpp 2017-07-04 23:09:02.533972226 -0400 ++++ b/src/hotspot/os/linux/os_linux.cpp 2017-07-04 23:07:52.118338845 -0400 +@@ -2270,8 +2270,5 @@ + assert(ret, "cannot locate libjvm"); + char *rp = NULL; + if (ret && dli_fname[0] != '\0') { +- rp = os::Posix::realpath(dli_fname, buf, buflen); +- } +- if (rp == NULL) { +- return; ++ snprintf(buf, buflen, "%s", dli_fname); + } + + if (Arguments::sun_java_launcher_is_altjvm()) { diff --git a/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk21.patch b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk21.patch new file mode 100644 index 0000000..ede201e --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk21.patch @@ -0,0 +1,14 @@ +--- a/src/hotspot/os/linux/os_linux.cpp 2017-07-04 23:09:02.533972226 -0400 ++++ b/src/hotspot/os/linux/os_linux.cpp 2017-07-04 23:07:52.118338845 -0400 +@@ -2270,8 +2270,5 @@ + assert(ret, "cannot locate libjvm"); + char *rp = nullptr; + if (ret && dli_fname[0] != '\0') { +- rp = os::Posix::realpath(dli_fname, buf, buflen); +- } +- if (rp == nullptr) { +- return; ++ snprintf(buf, buflen, "%s", dli_fname); + } + + if (Arguments::sun_java_launcher_is_altjvm()) { diff --git a/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk8.patch b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk8.patch new file mode 100644 index 0000000..6189412 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-java-home-jdk8.patch @@ -0,0 +1,15 @@ +--- a/hotspot/src/os/linux/vm/os_linux.cpp 2015-02-04 21:14:39.000000000 +0100 ++++ b/hotspot/src/os/linux/vm/os_linux.cpp 2015-05-19 16:17:29.960107613 +0200 +@@ -2304,10 +2304,8 @@ + assert(ret, "cannot locate libjvm"); + char *rp = NULL; + if (ret && dli_fname[0] != '\0') { +- rp = realpath(dli_fname, buf); ++ snprintf(buf, buflen, "%s", dli_fname); + } +- if (rp == NULL) +- return; + + if (Arguments::created_by_gamma_launcher()) { + // Support for the gamma launcher. Typical value for buf is + diff --git a/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk11.patch b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk11.patch new file mode 100644 index 0000000..ce30edb --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk11.patch @@ -0,0 +1,55 @@ +From 83f97773ea99fe2191a49e551ea43d51c9a765cd Mon Sep 17 00:00:00 2001 +Subject: [PATCH] strip some hard-coded default paths for libs and extensions + +--- + src/hotspot/os/linux/os_linux.cpp | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp +index 476b1c2175..2695ed2301 100644 +--- a/src/hotspot/os/linux/os_linux.cpp ++++ b/src/hotspot/os/linux/os_linux.cpp +@@ -417,20 +417,20 @@ void os::init_system_properties_values() { + // ... + // 7: The default directories, normally /lib and /usr/lib. + #if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390) +- #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" ++ #define DEFAULT_LIBPATH "" + #else + #if defined(AARCH64) + // Use 32-bit locations first for AARCH64 (a 64-bit architecture), since some systems + // might not adhere to the FHS and it would be a change in behaviour if we used + // DEFAULT_LIBPATH of other 64-bit architectures which prefer the 64-bit paths. +- #define DEFAULT_LIBPATH "/lib:/usr/lib:/usr/lib64:/lib64" ++ #define DEFAULT_LIBPATH "" + #else +- #define DEFAULT_LIBPATH "/lib:/usr/lib" ++ #define DEFAULT_LIBPATH "" + #endif // AARCH64 + #endif + + // Base path of extensions installed on the system. +-#define SYS_EXT_DIR "/usr/java/packages" ++#define SYS_EXT_DIR "" + #define EXTENSIONS_DIR "/lib/ext" + + // Buffer that fits several sprintfs. +@@ -490,13 +490,13 @@ void os::init_system_properties_values() { + strlen(v) + 1 + + sizeof(SYS_EXT_DIR) + sizeof("/lib/") + sizeof(DEFAULT_LIBPATH) + 1, + mtInternal); +- sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib:" DEFAULT_LIBPATH, v, v_colon); ++ sprintf(ld_library_path, "%s", v); + Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path); + } + + // Extensions directories. +- sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); + Arguments::set_ext_dirs(buf); + + FREE_C_HEAP_ARRAY(char, buf); +-- +2.35.1 + diff --git a/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk17.patch b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk17.patch new file mode 100644 index 0000000..4c38aca --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk17.patch @@ -0,0 +1,60 @@ +--- a/src/hotspot/os/linux/os_linux.cpp ++++ b/src/hotspot/os/linux/os_linux.cpp +@@ -412,18 +412,8 @@ void os::init_system_properties_values() { + // 1: ... + // ... + // 7: The default directories, normally /lib and /usr/lib. +-#ifndef OVERRIDE_LIBPATH +- #if defined(_LP64) +- #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" +- #else +- #define DEFAULT_LIBPATH "/lib:/usr/lib" +- #endif +-#else +- #define DEFAULT_LIBPATH OVERRIDE_LIBPATH +-#endif + + // Base path of extensions installed on the system. +-#define SYS_EXT_DIR "/usr/java/packages" + #define EXTENSIONS_DIR "/lib/ext" + + // Buffer that fits several sprintfs. +@@ -431,7 +421,7 @@ void os::init_system_properties_values() { + // by the nulls included by the sizeof operator. + const size_t bufsize = + MAX2((size_t)MAXPATHLEN, // For dll_dir & friends. +- (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir + char *buf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); + + // sysclasspath, java_home, dll_dir +@@ -478,26 +468,22 @@ void os::init_system_properties_values() { + // should always exist (until the legacy problem cited above is + // addressed). + const char *v = ::getenv("LD_LIBRARY_PATH"); +- const char *v_colon = ":"; +- if (v == NULL) { v = ""; v_colon = ""; } ++ if (v == NULL) { v = ""; } + // That's +1 for the colon and +1 for the trailing '\0'. + char *ld_library_path = NEW_C_HEAP_ARRAY(char, +- strlen(v) + 1 + +- sizeof(SYS_EXT_DIR) + sizeof("/lib/") + sizeof(DEFAULT_LIBPATH) + 1, ++ strlen(v) + 1, + mtInternal); +- sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib:" DEFAULT_LIBPATH, v, v_colon); ++ sprintf(ld_library_path, "%s", v); + Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path); + } + + // Extensions directories. +- sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); + Arguments::set_ext_dirs(buf); + + FREE_C_HEAP_ARRAY(char, buf); + +-#undef DEFAULT_LIBPATH +-#undef SYS_EXT_DIR + #undef EXTENSIONS_DIR + } \ No newline at end of file diff --git a/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk8.patch b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk8.patch new file mode 100644 index 0000000..3780e95 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/fix-library-path-jdk8.patch @@ -0,0 +1,37 @@ +diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp +index c477851c1b..ff5e28d95b 100644 +--- a/hotspot/src/os/linux/vm/os_linux.cpp ++++ b/hotspot/src/os/linux/vm/os_linux.cpp +@@ -368,13 +368,13 @@ void os::init_system_properties_values() { + // ... + // 7: The default directories, normally /lib and /usr/lib. + #if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) +-#define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" ++#define DEFAULT_LIBPATH "" + #else +-#define DEFAULT_LIBPATH "/lib:/usr/lib" ++#define DEFAULT_LIBPATH "" + #endif + + // Base path of extensions installed on the system. +-#define SYS_EXT_DIR "/usr/java/packages" ++#define SYS_EXT_DIR "" + #define EXTENSIONS_DIR "/lib/ext" + #define ENDORSED_DIR "/lib/endorsed" + +@@ -437,13 +437,13 @@ void os::init_system_properties_values() { + strlen(v) + 1 + + sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1, + mtInternal); +- sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch); ++ sprintf(ld_library_path, "%s", v); + Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); + } + + // Extensions directories. +- sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); + Arguments::set_ext_dirs(buf); + + // Endorsed standards default directory. diff --git a/pkgs/by-name/ja/java/openjdk/generate-cacerts.pl b/pkgs/by-name/ja/java/openjdk/generate-cacerts.pl new file mode 100644 index 0000000..3bdd42f --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/generate-cacerts.pl @@ -0,0 +1,366 @@ +#!/usr/bin/perl + +# Copyright (C) 2007, 2008 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# generate-cacerts.pl generates a JKS keystore named 'cacerts' from +# OpenSSL's certificate bundle using OpenJDK's keytool. + +# First extract each of OpenSSL's bundled certificates into its own +# aliased filename. + +# Downloaded from http://cvs.fedoraproject.org/viewvc/rpms/ca-certificates/F-12/generate-cacerts.pl?revision=1.2 +# Check and prevention of duplicate aliases added by Vlastimil Babka + +$file = $ARGV[1]; +open(CERTS, $file); +@certs = ; +close(CERTS); + +$pem_file_count = 0; +$in_cert_block = 0; +$write_current_cert = 1; +foreach $cert (@certs) +{ + if ($cert =~ /Issuer: /) + { + $_ = $cert; + if ($cert =~ /personal-freemail/) + { + $cert_alias = "thawtepersonalfreemailca"; + } + elsif ($cert =~ /personal-basic/) + { + $cert_alias = "thawtepersonalbasicca"; + } + elsif ($cert =~ /personal-premium/) + { + $cert_alias = "thawtepersonalpremiumca"; + } + elsif ($cert =~ /server-certs/) + { + $cert_alias = "thawteserverca"; + } + elsif ($cert =~ /premium-server/) + { + $cert_alias = "thawtepremiumserverca"; + } + elsif ($cert =~ /Class 1 Public Primary Certification Authority$/) + { + $cert_alias = "verisignclass1ca"; + } + elsif ($cert =~ /Class 1 Public Primary Certification Authority - G2/) + { + $cert_alias = "verisignclass1g2ca"; + } + elsif ($cert =~ + /VeriSign Class 1 Public Primary Certification Authority - G3/) + { + $cert_alias = "verisignclass1g3ca"; + } + elsif ($cert =~ /Class 2 Public Primary Certification Authority$/) + { + $cert_alias = "verisignclass2ca"; + } + elsif ($cert =~ /Class 2 Public Primary Certification Authority - G2/) + { + $cert_alias = "verisignclass2g2ca"; + } + elsif ($cert =~ + /VeriSign Class 2 Public Primary Certification Authority - G3/) + { + $cert_alias = "verisignclass2g3ca"; + } + elsif ($cert =~ /Class 3 Public Primary Certification Authority$/) + { + $cert_alias = "verisignclass3ca"; + } + # Version 1 of Class 3 Public Primary Certification Authority + # - G2 is added. Version 3 is excluded. See below. + elsif ($cert =~ + /VeriSign Class 3 Public Primary Certification Authority - G3/) + { + $cert_alias = "verisignclass3g3ca"; + } + elsif ($cert =~ + /RSA Data Security.*Secure Server Certification Authority/) + { + $cert_alias = "verisignserverca"; + } + elsif ($cert =~ /GTE CyberTrust Global Root/) + { + $cert_alias = "gtecybertrustglobalca"; + } + elsif ($cert =~ /Baltimore CyberTrust Root/) + { + $cert_alias = "baltimorecybertrustca"; + } + elsif ($cert =~ /www.entrust.net\/Client_CA_Info\/CPS/) + { + $cert_alias = "entrustclientca"; + } + elsif ($cert =~ /www.entrust.net\/GCCA_CPS/) + { + $cert_alias = "entrustglobalclientca"; + } + elsif ($cert =~ /www.entrust.net\/CPS_2048/) + { + $cert_alias = "entrust2048ca"; + } + elsif ($cert =~ /www.entrust.net\/CPS /) + { + $cert_alias = "entrustsslca"; + } + elsif ($cert =~ /www.entrust.net\/SSL_CPS/) + { + $cert_alias = "entrustgsslca"; + } + elsif ($cert =~ /The Go Daddy Group/) + { + $cert_alias = "godaddyclass2ca"; + } + elsif ($cert =~ /Starfield Class 2 Certification Authority/) + { + $cert_alias = "starfieldclass2ca"; + } + elsif ($cert =~ /ValiCert Class 2 Policy Validation Authority/) + { + $cert_alias = "valicertclass2ca"; + } + elsif ($cert =~ /GeoTrust Global CA$/) + { + $cert_alias = "geotrustglobalca"; + } + elsif ($cert =~ /Equifax Secure Certificate Authority/) + { + $cert_alias = "equifaxsecureca"; + } + elsif ($cert =~ /Equifax Secure eBusiness CA-1/) + { + $cert_alias = "equifaxsecureebusinessca1"; + } + elsif ($cert =~ /Equifax Secure eBusiness CA-2/) + { + $cert_alias = "equifaxsecureebusinessca2"; + } + elsif ($cert =~ /Equifax Secure Global eBusiness CA-1/) + { + $cert_alias = "equifaxsecureglobalebusinessca1"; + } + elsif ($cert =~ /Sonera Class1 CA/) + { + $cert_alias = "soneraclass1ca"; + } + elsif ($cert =~ /Sonera Class2 CA/) + { + $cert_alias = "soneraclass2ca"; + } + elsif ($cert =~ /AAA Certificate Services/) + { + $cert_alias = "comodoaaaca"; + } + elsif ($cert =~ /AddTrust Class 1 CA Root/) + { + $cert_alias = "addtrustclass1ca"; + } + elsif ($cert =~ /AddTrust External CA Root/) + { + $cert_alias = "addtrustexternalca"; + } + elsif ($cert =~ /AddTrust Qualified CA Root/) + { + $cert_alias = "addtrustqualifiedca"; + } + elsif ($cert =~ /UTN-USERFirst-Hardware/) + { + $cert_alias = "utnuserfirsthardwareca"; + } + elsif ($cert =~ /UTN-USERFirst-Client Authentication and Email/) + { + $cert_alias = "utnuserfirstclientauthemailca"; + } + elsif ($cert =~ /UTN - DATACorp SGC/) + { + $cert_alias = "utndatacorpsgcca"; + } + elsif ($cert =~ /UTN-USERFirst-Object/) + { + $cert_alias = "utnuserfirstobjectca"; + } + elsif ($cert =~ /America Online Root Certification Authority 1/) + { + $cert_alias = "aolrootca1"; + } + elsif ($cert =~ /DigiCert Assured ID Root CA/) + { + $cert_alias = "digicertassuredidrootca"; + } + elsif ($cert =~ /DigiCert Global Root CA/) + { + $cert_alias = "digicertglobalrootca"; + } + elsif ($cert =~ /DigiCert High Assurance EV Root CA/) + { + $cert_alias = "digicerthighassuranceevrootca"; + } + elsif ($cert =~ /GlobalSign Root CA$/) + { + $cert_alias = "globalsignca"; + } + elsif ($cert =~ /GlobalSign Root CA - R2/) + { + $cert_alias = "globalsignr2ca"; + } + elsif ($cert =~ /Elektronik.*Kas.*2005/) + { + $cert_alias = "extra-elektronikkas2005"; + } + elsif ($cert =~ /Elektronik/) + { + $cert_alias = "extra-elektronik2005"; + } + # Mozilla does not provide these certificates: + # baltimorecodesigningca + # gtecybertrust5ca + # trustcenterclass2caii + # trustcenterclass4caii + # trustcenteruniversalcai + else + { + # Generate an alias using the OU and CN attributes of the + # Issuer field if both are present, otherwise use only the + # CN attribute. The Issuer field must have either the OU + # or the CN attribute. + $_ = $cert; + if ($cert =~ /OU=/) + { + s/Issuer:.*?OU=//; + # Remove other occurrences of OU=. + s/OU=.*CN=//; + # Remove CN= if there were not other occurrences of OU=. + s/CN=//; + s/\/emailAddress.*//; + s/Certificate Authority/ca/g; + s/Certification Authority/ca/g; + } + elsif ($cert =~ /CN=/) + { + s/Issuer:.*CN=//; + s/\/emailAddress.*//; + s/Certificate Authority/ca/g; + s/Certification Authority/ca/g; + } + s/\W//g; + tr/A-Z/a-z/; + $cert_alias = "extra-$_"; + + } + while (-e "$cert_alias.pem") + { + $cert_alias = "$cert_alias" . "_"; + } + } + # When it attempts to parse: + # + # Class 3 Public Primary Certification Authority - G2, Version 3 + # + # keytool says: + # + # #2: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false + # Unparseable AuthorityInfoAccess extension due to + # java.io.IOException: Invalid encoding of URI + # + # If we do not exclude this file + # openjdk/jdk/test/lib/security/cacerts/VerifyCACerts.java fails + # on this cert, printing: + # + # Couldn't verify: java.security.SignatureException: Signature + # does not match. + # + elsif ($cert =~ + /A6:0F:34:C8:62:6C:81:F6:8B:F7:7D:A9:F6:67:58:8A:90:3F:7D:36/) + { + $write_current_cert = 0; + $pem_file_count--; + } + elsif ($cert eq "-----BEGIN CERTIFICATE-----\n") + { + $_ = $cert; + s/\W//g; + tr/A-Z/a-z/; + $cert_alias = "extra-$_"; + while (-e "$cert_alias.pem") + { + $cert_alias = "$cert_alias" . "_"; + } + if ($in_cert_block != 0) + { + die "$file is malformed."; + } + $in_cert_block = 1; + if ($write_current_cert == 1) + { + $pem_file_count++; + if (-e "$cert_alias.pem") + { + print "$cert_alias"; + die "already exists" + } + open(PEM, ">$cert_alias.pem"); + print PEM $cert; + } + } + elsif ($cert eq "-----END CERTIFICATE-----\n") + { + $in_cert_block = 0; + if ($write_current_cert == 1) + { + print PEM $cert; + close(PEM); + } + $write_current_cert = 1 + } + else + { + if ($in_cert_block == 1 && $write_current_cert == 1) + { + print PEM $cert; + } + } +} + +# Check that the correct number of .pem files were produced. +@pem_files = <*.pem>; +if (@pem_files != $pem_file_count) +{ + print "$pem_file_count"; + die "Number of .pem files produced does not match". + " number of certs read from $file."; +} + +# Now store each cert in the 'cacerts' file using keytool. +$certs_written_count = 0; +foreach $pem_file (@pem_files) +{ + system "$ARGV[0] -noprompt -import". + " -alias `basename $pem_file .pem`". + " -keystore cacerts -storepass 'changeit' -file $pem_file"; + unlink($pem_file); + $certs_written_count++; +} + +# Check that the correct number of certs were added to the keystore. +if ($certs_written_count != $pem_file_count) +{ + die "Number of certs added to keystore does not match". + " number of certs read from $file."; +} diff --git a/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk17.patch b/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk17.patch new file mode 100644 index 0000000..3bb610e --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk17.patch @@ -0,0 +1,21 @@ +--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/LegalNoticeFilePlugin.java ++++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/LegalNoticeFilePlugin.java +@@ -112,18 +112,6 @@ + .filter(e -> Arrays.equals(e.contentBytes(), entry.contentBytes())) + .findFirst(); + if (!otarget.isPresent()) { +- if (errorIfNotSameContent) { +- // all legal notices of the same file name are expected +- // to contain the same content +- Optional ores = +- entries.stream().filter(e -> e.linkedTarget() == null) +- .findAny(); +- +- if (ores.isPresent()) { +- throw new PluginException(ores.get().path() + " " + +- entry.path() + " contain different content"); +- } +- } + entries.add(entry); + } else { + entries.add(ResourcePoolEntry.createSymLink(entry.path(), diff --git a/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk18.patch b/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk18.patch new file mode 100644 index 0000000..cda9358 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/ignore-LegalNoticeFilePlugin-jdk18.patch @@ -0,0 +1,21 @@ +--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/LegalNoticeFilePlugin.java ++++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/LegalNoticeFilePlugin.java +@@ -112,18 +112,6 @@ + .filter(e -> Arrays.equals(e.contentBytes(), entry.contentBytes())) + .findFirst(); + if (otarget.isEmpty()) { +- if (errorIfNotSameContent) { +- // all legal notices of the same file name are expected +- // to contain the same content +- Optional ores = +- entries.stream().filter(e -> e.linkedTarget() == null) +- .findAny(); +- +- if (ores.isPresent()) { +- throw new PluginException(ores.get().path() + " " + +- entry.path() + " contain different content"); +- } +- } + entries.add(entry); + } else { + entries.add(ResourcePoolEntry.createSymLink(entry.path(), diff --git a/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap-jdk13.patch b/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap-jdk13.patch new file mode 100644 index 0000000..6e48db6 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap-jdk13.patch @@ -0,0 +1,12 @@ +diff -uw -r a/make/Docs.gmk b/make/Docs.gmk +--- a/make/Docs.gmk 2019-10-09 08:05:43.107349180 -0400 ++++ b/make/Docs.gmk 2019-10-09 08:09:29.330118790 -0400 +@@ -277,7 +277,7 @@ + $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_INDIRECT_EXPORTS)) + + $1_JAVA_ARGS := -Dextlink.spec.version=$$(VERSION_SPECIFICATION) \ +- -Djspec.version=$$(VERSION_SPECIFICATION) ++ -Djspec.version=$$(VERSION_SPECIFICATION) -Xmx1G + + ifeq ($$(ENABLE_FULL_DOCS), true) + # Tell the ModuleGraph taglet to generate html links to soon-to-be-created diff --git a/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap.patch b/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap.patch new file mode 100644 index 0000000..6a1b253 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/increase-javadoc-heap.patch @@ -0,0 +1,12 @@ +--- a/make/Docs.gmk 2019-07-24 13:07:37.013405090 -0400 ++++ b/make/Docs.gmk 2019-07-24 13:07:28.406550535 -0400 +@@ -274,7 +274,7 @@ + $1_INDIRECT_EXPORTS := $$(call FindTransitiveIndirectDepsForModules, $$($1_MODULES)) + $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_INDIRECT_EXPORTS)) + +- $1_JAVA_ARGS := -Dextlink.spec.version=$$(VERSION_SPECIFICATION) ++ $1_JAVA_ARGS := -Dextlink.spec.version=$$(VERSION_SPECIFICATION) -Xmx1G + + ifeq ($$(ENABLE_FULL_DOCS), true) + # Tell the ModuleGraph taglet to generate html links to soon-to-be-created + diff --git a/pkgs/by-name/ja/java/openjdk/jre.nix b/pkgs/by-name/ja/java/openjdk/jre.nix new file mode 100644 index 0000000..02f6da9 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/jre.nix @@ -0,0 +1,39 @@ +{ stdenv +, jdk +, lib +, callPackage +, modules ? [ "java.base" ] +}: + +let + jre = stdenv.mkDerivation { + pname = "${jdk.pname}-minimal-jre"; + version = jdk.version; + + buildInputs = [ jdk ]; + + dontUnpack = true; + + # Strip more heavily than the default '-S', since if you're + # using this derivation you probably care about this. + stripDebugFlags = [ "--strip-unneeded" ]; + + buildPhase = '' + runHook preBuild + + jlink --module-path ${jdk}/lib/openjdk/jmods --add-modules ${lib.concatStringsSep "," modules} --output $out + + runHook postBuild + ''; + + dontInstall = true; + + passthru = { + home = "${jre}"; + tests = [ + (callPackage ./tests/test_jre_minimal.nix {}) + (callPackage ./tests/test_jre_minimal_with_logging.nix {}) + ]; + }; + }; +in jre diff --git a/pkgs/by-name/ja/java/openjdk/make-bootstrap.nix b/pkgs/by-name/ja/java/openjdk/make-bootstrap.nix new file mode 100644 index 0000000..aac5441 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/make-bootstrap.nix @@ -0,0 +1,31 @@ +{ runCommand, openjdk, nukeReferences }: + +runCommand "${openjdk.name}-bootstrap.tar.xz" {} '' + mkdir -pv openjdk-bootstrap/lib + + # Do a deep copy of the openjdk + cp -vrL ${openjdk.home} openjdk-bootstrap/lib + + # Includes are needed for building the native jvm + cp -vrL ${openjdk}/include openjdk-bootstrap + + # The binaries are actually stored in the openjdk lib + ln -sv lib/openjdk/bin openjdk-bootstrap/bin + find . -name libjli.so + (cd openjdk-bootstrap/lib; find . -name libjli.so -exec ln -sfv {} libjli.so \;) + + chmod -R +w openjdk-bootstrap + + # Remove components we don't need + find openjdk-bootstrap -name \*.diz -exec rm {} \; + find openjdk-bootstrap -name \*.ttf -exec rm {} \; + find openjdk-bootstrap -name \*.gif -exec rm {} \; + find openjdk-bootstrap -name src.zip -exec rm {} \; + rm -rf openjdk-bootstrap/lib/openjdk/jre/bin + + # Remove all of the references to the native nix store + find openjdk-bootstrap -print0 | xargs -0 ${nukeReferences}/bin/nuke-refs + + # Create the output tarball + tar cv openjdk-bootstrap | xz > $out +'' diff --git a/pkgs/by-name/ja/java/openjdk/meta.nix b/pkgs/by-name/ja/java/openjdk/meta.nix new file mode 100644 index 0000000..74383dd --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/meta.nix @@ -0,0 +1,11 @@ +lib: version: with lib; { + homepage = "https://openjdk.java.net/"; + license = licenses.gpl2Only; + description = "The open-source Java Development Kit"; + maintainers = with maintainers; [ edwtjo ]; + platforms = [ "i686-linux" "x86_64-linux" "aarch64-linux" "armv7l-linux" "armv6l-linux" "powerpc64le-linux" ]; + mainProgram = "java"; + knownVulnerabilities = optionals (builtins.elem (versions.major version) [ "12" "13" "14" "15" "16" "18" ]) [ + "This OpenJDK version has reached its end of life." + ]; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/11.nix b/pkgs/by-name/ja/java/openjdk/openjfx/11.nix new file mode 100644 index 0000000..424c41c --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/11.nix @@ -0,0 +1,136 @@ +{ stdenv, lib, fetchFromGitHub, writeText, gradle_7, pkg-config, perl, cmake +, gperf, gtk2, gtk3, libXtst, libXxf86vm, glib, alsa-lib, ffmpeg_4-headless, python3, ruby, fetchurl, runCommand +, openjdk11-bootstrap +, withMedia ? true +, withWebKit ? false +}: + +let + major = "11"; + update = ".0.18"; + build = "1"; + repover = "${major}${update}+${build}"; + gradle_ = (gradle_7.override { + java = openjdk11-bootstrap; + }); + + icuVersionWithSep = s: "71${s}1"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "_"}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-pVWIy0BkICsthA5mxhR9SJQHleMNnaEcGl/AaLi5qZM="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}-${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx${major}u"; + rev = repover; + sha256 = "sha256-46DjIzcBHkmp5vnhYnLu78CG72bIBRM4A6mgk2OLOko="; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4-headless ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + postPatch = '' + substituteInPlace buildSrc/linux.gradle \ + --replace ', "-Werror=implicit-function-declaration"' "" + + # Add missing includes for gcc-13 for webkit build: + sed -e '1i #include ' \ + -i modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/Heap.cpp \ + modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/IsoSharedPageInlines.h + ''; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk11-bootstrap.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "sha256-syceJMUEknBDCHK8eGs6rUU3IQn+HnQfURfCrDxYPa9="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | sed -E 's,:?${openjdk11-bootstrap}[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + + # Remove licenses, otherwise they may conflict with the ones included in the openjdk + rm -rf $out/modules_legal/* + ''; + + disallowedReferences = [ openjdk11-bootstrap ]; + + passthru.deps = deps; + + # Uses a lot of RAM, OOMs otherwise + requiredSystemFeatures = [ "big-parallel" ]; + + meta = with lib; { + homepage = "http://openjdk.java.net/projects/openjfx/"; + license = licenses.gpl2; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/15.nix b/pkgs/by-name/ja/java/openjdk/openjfx/15.nix new file mode 100644 index 0000000..1fb48f4 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/15.nix @@ -0,0 +1,129 @@ +{ stdenv, lib, fetchFromGitHub, writeText, openjdk11_headless, gradle_6 +, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst, libXxf86vm, glib, alsa-lib +, ffmpeg_4-headless, python3, ruby +, withMedia ? true +, withWebKit ? false +}: + +let + major = "15"; + update = ".0.1"; + build = "+1"; + repover = "${major}${update}${build}"; + gradle_ = (gradle_6.override { + java = openjdk11_headless; + }); + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx"; + rev = repover; + sha256 = "019glq8rhn6amy3n5jc17vi2wpf1pxpmmywvyz1ga8n09w7xscq1"; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4-headless ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk11_headless.home} + '' + args.gradleProperties or ""); + + env.NIX_CFLAGS_COMPILE = toString [ + #avoids errors about deprecation of GTypeDebugFlags, GTimeVal, etc. + "-DGLIB_DISABLE_DEPRECATION_WARNINGS" + + # gstreamer workaround for -fno-common toolchains: + # ld: gsttypefindelement.o:(.bss._gst_disable_registry_cache+0x0): multiple definition of + # `_gst_disable_registry_cache'; gst.o:(.bss._gst_disable_registry_cache+0x0): first defined here + "-fcommon" + ]; + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "sha256-fGLTMM9s/Vn7eMzn6OQR3tL0cGbAYc7c4J4/aW3JvkI="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + # glib-2.62 deprecations + # -fcommon: gstreamer workaround for -fno-common toolchains: + # ld: gsttypefindelement.o:(.bss._gst_disable_registry_cache+0x0): multiple definition of + # `_gst_disable_registry_cache'; gst.o:(.bss._gst_disable_registry_cache+0x0): first defined here + env.NIX_CFLAGS_COMPILE = "-DGLIB_DISABLE_DEPRECATION_WARNINGS -fcommon"; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk11_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk11_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "http://openjdk.java.net/projects/openjfx/"; + license = licenses.gpl2; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + knownVulnerabilities = [ + "This OpenJFX version has reached its end of life." + ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/17.nix b/pkgs/by-name/ja/java/openjdk/openjfx/17.nix new file mode 100644 index 0000000..c5d6c6a --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/17.nix @@ -0,0 +1,128 @@ +{ stdenv, lib, fetchFromGitHub, writeText, openjdk17_headless, gradle_7 +, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst, libXxf86vm, glib, alsa-lib +, ffmpeg_4-headless, python3, ruby, fetchurl, runCommand +, withMedia ? true +, withWebKit ? false +}: + +let + major = "17"; + update = ".0.6"; + build = "+3"; + repover = "${major}${update}${build}"; + gradle_ = (gradle_7.override { + java = openjdk17_headless; + }); + + icuVersionWithSep = s: "71${s}1"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "_"}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-pVWIy0BkICsthA5mxhR9SJQHleMNnaEcGl/AaLi5qZM="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx${major}u"; + rev = repover; + sha256 = "sha256-9VfXk2EfMebMyVKPohPRP2QXRFf8XemUtfY0JtBCHyw="; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4-headless ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + postPatch = '' + # Add missing includes for gcc-13 for webkit build: + sed -e '1i #include ' \ + -i modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/Heap.cpp \ + modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/IsoSharedPageInlines.h + ''; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk17_headless.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "sha256-dV7/U5GpFxhI13smZ587C6cVE4FRNPY0zexZkYK4Yqo="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk17_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk17_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "http://openjdk.java.net/projects/openjfx/"; + license = licenses.gpl2; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/19.nix b/pkgs/by-name/ja/java/openjdk/openjfx/19.nix new file mode 100644 index 0000000..6f173db --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/19.nix @@ -0,0 +1,145 @@ +{ stdenv, lib, fetchFromGitHub, fetchpatch, writeText, openjdk17_headless +, openjdk19_headless, gradle_7, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst +, libXxf86vm, glib, alsa-lib, ffmpeg_4, python3, ruby, fetchurl, runCommand +, withMedia ? true +, withWebKit ? false +}: + +let + major = "19"; + update = ".0.2.1"; + build = "+1"; + repover = "${major}${update}${build}"; + gradle_ = (gradle_7.override { + # note: gradle does not yet support running on 19 + java = openjdk17_headless; + }); + + icuVersionWithSep = s: "68${s}2"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "."}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-ieQCLBTNrskuf8j3IUQS3QLIAQzLom/O58muMP363Lw="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx"; + rev = repover; + hash = "sha256-A08GhCGpzWlUG1+f6mcjvkJmMNaOReacQKPEmNpUvLs="; + }; + + patches = [ + # 8295962: Reference to State in Task.java is ambiguous when building with JDK 19 + (fetchpatch { + url = "https://github.com/openjdk/jfx/pull/933/commits/cfaee2a52350eff39dd4352484c892716076d3de.patch"; + hash = "sha256-hzJMenhvtmHs/6BJj8GfaLp14myV8VCXCLLC8n32yEw="; + }) + # ditto + (fetchpatch { + url = "https://github.com/openjdk/jfx/pull/933/commits/bd46ce12df0a93a56fe0d58d3653d08e58409b7f.patch"; + hash = "sha256-o9908uw9vYvULmAh/lbfyHhgxz6jpgPq2fcAltWsYoU="; + }) + ]; + + postPatch = '' + # Add missing includes for gcc-13 for webkit build: + sed -e '1i #include ' \ + -i modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/Heap.cpp \ + modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/IsoSharedPageInlines.h + ''; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4 ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk19_headless.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + # suspiciously the same as for openjfx 17 ... + # could they really not have changed any of their dependencies? + # or did we miss changing another upstream hash when copy-pasting? + outputHash = "sha256-dV7/U5GpFxhI13smZ587C6cVE4FRNPY0zexZkYK4Yqo="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk19_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk17_headless openjdk19_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "https://openjdk.org/projects/openjfx/"; + license = licenses.gpl2Classpath; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/20.nix b/pkgs/by-name/ja/java/openjdk/openjfx/20.nix new file mode 100644 index 0000000..794590d --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/20.nix @@ -0,0 +1,132 @@ +{ stdenv, lib, fetchFromGitHub, fetchpatch, writeText, openjdk17_headless +, openjdk19_headless, gradle_7, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst +, libXxf86vm, glib, alsa-lib, ffmpeg_4, python3, ruby, fetchurl, runCommand +, withMedia ? true +, withWebKit ? false +}: + +let + major = "20"; + update = ""; + build = "+19"; + repover = "${major}${update}${build}"; + gradle_ = (gradle_7.override { + # note: gradle does not yet support running on 19 + java = openjdk17_headless; + }); + + icuVersionWithSep = s: "71${s}1"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "_"}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-pVWIy0BkICsthA5mxhR9SJQHleMNnaEcGl/AaLi5qZM="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx"; + rev = repover; + hash = "sha256-QPPJyl6+XU+m5xqYOFtQKJNNrovqy7ngNE/e7kiEJVU="; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4 ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + postPatch = '' + # Add missing includes for gcc-13 for webkit build: + sed -e '1i #include ' \ + -i modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/Heap.cpp \ + modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/IsoSharedPageInlines.h + ''; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk19_headless.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + # suspiciously the same as for openjfx 17 ... + # could they really not have changed any of their dependencies? + # or did we miss changing another upstream hash when copy-pasting? + outputHash = "sha256-dV7/U5GpFxhI13smZ587C6cVE4FRNPY0zexZkYK4Yqo="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk19_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk17_headless openjdk19_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "https://openjdk.org/projects/openjfx/"; + license = licenses.gpl2Classpath; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/21.nix b/pkgs/by-name/ja/java/openjdk/openjfx/21.nix new file mode 100644 index 0000000..f49dbe3 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/21.nix @@ -0,0 +1,132 @@ +{ stdenv, lib, fetchFromGitHub, fetchpatch, writeText, openjdk17_headless +, openjdk19_headless, gradle_7, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst +, libXxf86vm, glib, alsa-lib, ffmpeg_4, python3, ruby, fetchurl, runCommand +, withMedia ? true +, withWebKit ? false +}: + +let + major = "21"; + update = ""; + build = "-ga"; + repover = "${major}${update}${build}"; + gradle_ = (gradle_7.override { + # note: gradle does not yet support running on 19 + java = openjdk17_headless; + }); + + icuVersionWithSep = s: "73${s}1"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "_"}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-QDgpjuAqDDiRcYXvj/Tr3pyLVSx3f9A+TfbGtLGCXiA="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx"; + rev = repover; + hash = "sha256-deNAGfnA6gwcAa64l0AWdkX+vJd3ZOfIgAifSl+/m+s="; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4 ]; + nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + postPatch = '' + # Add missing includes for gcc-13 for webkit build: + sed -e '1i #include ' \ + -i modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/Heap.cpp \ + modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/IsoSharedPageInlines.h + ''; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk19_headless.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + # suspiciously the same as for openjfx 17 ... + # could they really not have changed any of their dependencies? + # or did we miss changing another upstream hash when copy-pasting? + outputHash = "sha256-dV7/U5GpFxhI13smZ587C6cVE4FRNPY0zexZkYK4Yqo="; + }; + +in makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk19_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk17_headless openjdk19_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "https://openjdk.org/projects/openjfx/"; + license = licenses.gpl2Classpath; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/openjfx/22.nix b/pkgs/by-name/ja/java/openjdk/openjfx/22.nix new file mode 100644 index 0000000..d585dbd --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/openjfx/22.nix @@ -0,0 +1,138 @@ +{ stdenv +, lib +, fetchFromGitHub +, fetchpatch +, fetchurl +, runCommand +, writeText +, openjdk21_headless +, gradle +, pkg-config +, perl +, cmake +, gperf +, gtk2 +, gtk3 +, libXtst +, libXxf86vm +, glib +, alsa-lib +, ffmpeg_4 +, python3 +, ruby +, withMedia ? true +, withWebKit ? false +}: + +let + major = "22"; + update = ""; + build = "+30"; + repover = "${major}${update}${build}"; + + icuVersionWithSep = s: "73${s}1"; + icuPath = "download/release-${icuVersionWithSep "-"}/icu4c-${icuVersionWithSep "_"}-data-bin-l.zip"; + icuData = fetchurl { + url = "https://github.com/unicode-org/icu/releases/${icuPath}"; + hash = "sha256-QDgpjuAqDDiRcYXvj/Tr3pyLVSx3f9A+TfbGtLGCXiA="; + }; + icuFakeRepository = runCommand "icu-data-repository" {} '' + install -Dm644 ${icuData} $out/${icuPath} + ''; + + makePackage = args: stdenv.mkDerivation ({ + version = "${major}${update}${build}"; + + src = fetchFromGitHub { + owner = "openjdk"; + repo = "jfx"; + rev = repover; + hash = "sha256-sZF7ZPC0kgTTxWgtkxmGtOlfroGPGVZcMw0/wSTJUxQ="; + }; + + buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4 ]; + nativeBuildInputs = [ gradle perl pkg-config cmake gperf python3 ruby ]; + + dontUseCmakeConfigure = true; + + config = writeText "gradle.properties" ('' + CONF = Release + JDK_HOME = ${openjdk21_headless.home} + '' + args.gradleProperties or ""); + + buildPhase = '' + runHook preBuild + + export NUMBER_OF_PROCESSORS=$NIX_BUILD_CORES + export GRADLE_USER_HOME=$(mktemp -d) + ln -s $config gradle.properties + export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE" + gradle --no-daemon --console=plain $gradleFlags sdk + + runHook postBuild + ''; + } // args); + + # Fake build to pre-download deps into fixed-output derivation. + # We run nearly full build because I see no other way to download everything that's needed. + # Anyone who knows a better way? + deps = makePackage { + pname = "openjfx-deps"; + + # perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \ + | sh + rm -rf $out/tmp + ''; + + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = "sha256-2I7LvYcudlB4DKJ/wEiTjY6nICUxUY52euosUqOA+Bs="; + }; + +in +makePackage { + pname = "openjfx-modular-sdk"; + + gradleProperties = '' + COMPILE_MEDIA = ${lib.boolToString withMedia} + COMPILE_WEBKIT = ${lib.boolToString withWebKit} + ${lib.optionalString withWebKit "icuRepositoryURL = file://${icuFakeRepository}"} + ''; + + preBuild = '' + swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)" + substituteInPlace build.gradle \ + --replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \ + --replace 'name: SWT_FILE_NAME' "files('$swtJar')" + ''; + + installPhase = '' + cp -r build/modular-sdk $out + ''; + + stripDebugList = [ "." ]; + + postFixup = '' + # Remove references to bootstrap. + export openjdkOutPath='${openjdk21_headless.outPath}' + find "$out" -name \*.so | while read lib; do + new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')" + patchelf --set-rpath "$new_refs" "$lib" + done + ''; + + disallowedReferences = [ openjdk21_headless openjdk21_headless ]; + + passthru.deps = deps; + + meta = with lib; { + homepage = "https://openjdk.org/projects/openjfx/"; + license = licenses.gpl2Classpath; + description = "The next-generation Java client toolkit"; + maintainers = with maintainers; [ abbradar ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk10.patch b/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk10.patch new file mode 100644 index 0000000..6203064 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk10.patch @@ -0,0 +1,30 @@ +--- a/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java 2017-06-26 21:48:25.000000000 -0400 ++++ b/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java 2017-07-05 20:45:57.491295030 -0400 +@@ -71,6 +71,7 @@ + * + * The preference of the default trusted KeyStore is: + * javax.net.ssl.trustStore ++ * system environment variable JAVAX_NET_SSL_TRUSTSTORE + * jssecacerts + * cacerts + */ +@@ -132,7 +133,8 @@ + public TrustStoreDescriptor run() { + // Get the system properties for trust store. + String storePropName = System.getProperty( +- "javax.net.ssl.trustStore", jsseDefaultStore); ++ "javax.net.ssl.trustStore", ++ System.getenv("JAVAX_NET_SSL_TRUSTSTORE")); + String storePropType = System.getProperty( + "javax.net.ssl.trustStoreType", + KeyStore.getDefaultType()); +@@ -144,6 +146,9 @@ + String temporaryName = ""; + File temporaryFile = null; + long temporaryTime = 0L; ++ if (storePropName == null) { ++ storePropName = jsseDefaultStore; ++ } + if (!"NONE".equals(storePropName)) { + String[] fileNames = + new String[] {storePropName, defaultStore}; diff --git a/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk8.patch b/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk8.patch new file mode 100644 index 0000000..08cf554 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/read-truststore-from-env-jdk8.patch @@ -0,0 +1,30 @@ +--- a/jdk/src/share/classes/sun/security/ssl/TrustStoreManager.java 2017-06-26 21:48:25.000000000 -0400 ++++ b/jdk/src/share/classes/sun/security/ssl/TrustStoreManager.java 2017-07-05 20:45:57.491295030 -0400 +@@ -71,6 +71,7 @@ + * + * The preference of the default trusted KeyStore is: + * javax.net.ssl.trustStore ++ * system environment variable JAVAX_NET_SSL_TRUSTSTORE + * jssecacerts + * cacerts + */ +@@ -132,7 +133,8 @@ + public TrustStoreDescriptor run() { + // Get the system properties for trust store. + String storePropName = System.getProperty( +- "javax.net.ssl.trustStore", jsseDefaultStore); ++ "javax.net.ssl.trustStore", ++ System.getenv("JAVAX_NET_SSL_TRUSTSTORE")); + String storePropType = System.getProperty( + "javax.net.ssl.trustStoreType", + KeyStore.getDefaultType()); +@@ -144,6 +146,9 @@ + String temporaryName = ""; + File temporaryFile = null; + long temporaryTime = 0L; ++ if (storePropName == null) { ++ storePropName = jsseDefaultStore; ++ } + if (!"NONE".equals(storePropName)) { + String[] fileNames = + new String[] {storePropName, defaultStore}; diff --git a/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk10.patch b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk10.patch new file mode 100644 index 0000000..b9258c5 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk10.patch @@ -0,0 +1,24 @@ +--- a/src/java.desktop/share/classes/javax/swing/UIManager.java ++++ b/src/java.desktop/share/classes/javax/swing/UIManager.java +@@ -607,11 +607,9 @@ + if (osType == OSInfo.OSType.WINDOWS) { + return "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; + } else { +- String desktop = AccessController.doPrivileged(new GetPropertyAction("sun.desktop")); + Toolkit toolkit = Toolkit.getDefaultToolkit(); +- if ("gnome".equals(desktop) && +- toolkit instanceof SunToolkit && +- ((SunToolkit) toolkit).isNativeGTKAvailable()) { ++ if (toolkit instanceof SunToolkit && ++ ((SunToolkit) toolkit).isNativeGTKAvailable()) { + // May be set on Linux and Solaris boxs. + return "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; + } +@@ -1341,7 +1339,7 @@ + lafName = (String) lafData.remove("defaultlaf"); + } + if (lafName == null) { +- lafName = getCrossPlatformLookAndFeelClassName(); ++ lafName = getSystemLookAndFeelClassName(); + } + lafName = swingProps.getProperty(defaultLAFKey, lafName); diff --git a/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk13.patch b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk13.patch new file mode 100644 index 0000000..8a1b9b6 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk13.patch @@ -0,0 +1,22 @@ +--- a/src/java.desktop/share/classes/javax/swing/UIManager.java 2019-08-08 01:05:04.000000000 -0400 ++++ b/src/java.desktop/share/classes/javax/swing/UIManager.java 2019-10-09 08:20:31.791606748 -0400 +@@ -660,9 +660,8 @@ + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof SunToolkit) { + SunToolkit suntk = (SunToolkit)toolkit; +- String desktop = suntk.getDesktop(); + boolean gtkAvailable = suntk.isNativeGTKAvailable(); +- if ("gnome".equals(desktop) && gtkAvailable) { ++ if (gtkAvailable) { + return "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; + } + } +@@ -1397,7 +1396,7 @@ + lafName = lafData.remove("defaultlaf"); + } + if (lafName == null) { +- lafName = getCrossPlatformLookAndFeelClassName(); ++ lafName = getSystemLookAndFeelClassName(); + } + lafName = swingProps.getProperty(defaultLAFKey, lafName); + diff --git a/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk8.patch b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk8.patch new file mode 100644 index 0000000..9538aad --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/swing-use-gtk-jdk8.patch @@ -0,0 +1,26 @@ +diff -ru3 a/jdk/src/share/classes/javax/swing/UIManager.java b/jdk/src/share/classes/javax/swing/UIManager.java +--- a/jdk/src/share/classes/javax/swing/UIManager.java 2016-07-26 00:41:37.000000000 +0300 ++++ b/jdk/src/share/classes/javax/swing/UIManager.java 2016-10-02 22:46:01.890071761 +0300 +@@ -607,11 +607,9 @@ + if (osType == OSInfo.OSType.WINDOWS) { + return "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; + } else { +- String desktop = AccessController.doPrivileged(new GetPropertyAction("sun.desktop")); + Toolkit toolkit = Toolkit.getDefaultToolkit(); +- if ("gnome".equals(desktop) && +- toolkit instanceof SunToolkit && +- ((SunToolkit) toolkit).isNativeGTKAvailable()) { ++ if (toolkit instanceof SunToolkit && ++ ((SunToolkit) toolkit).isNativeGTKAvailable()) { + // May be set on Linux and Solaris boxs. + return "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; + } +@@ -1341,7 +1339,7 @@ + lafName = (String) lafData.remove("defaultlaf"); + } + if (lafName == null) { +- lafName = getCrossPlatformLookAndFeelClassName(); ++ lafName = getSystemLookAndFeelClassName(); + } + lafName = swingProps.getProperty(defaultLAFKey, lafName); + diff --git a/pkgs/by-name/ja/java/openjdk/tests/hello-logging.nix b/pkgs/by-name/ja/java/openjdk/tests/hello-logging.nix new file mode 100644 index 0000000..71f3a55 --- /dev/null +++ b/pkgs/by-name/ja/java/openjdk/tests/hello-logging.nix @@ -0,0 +1,47 @@ +{ jdk +, jre +, pkgs +}: + +/* 'Hello world' Java application derivation for use in tests */ +let + source = pkgs.writeTextDir "src/Hello.java" '' + import java.util.logging.Logger; + import java.util.logging.Level; + + class Hello { + static Logger logger = Logger.getLogger(Hello.class.getName()); + + public static void main(String[] args) { + logger.log(Level.INFO, "Hello, world!"); + } + } + ''; +in + pkgs.stdenv.mkDerivation { + pname = "hello"; + version = "1.0.0"; + + src = source; + + buildPhase = '' + runHook preBuildPhase + ${jdk}/bin/javac src/Hello.java + runHook postBuildPhase + ''; + installPhase = '' + runHook preInstallPhase + + mkdir -p $out/lib + cp src/Hello.class $out/lib + + mkdir -p $out/bin + cat >$out/bin/hello <$out/bin/hello </dev/stdout | grep "Hello, world!" + touch $out + '' diff --git a/pkgs/by-name/ja/java/packages.nix b/pkgs/by-name/ja/java/packages.nix new file mode 100644 index 0000000..dac9ec6 --- /dev/null +++ b/pkgs/by-name/ja/java/packages.nix @@ -0,0 +1,74 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + javaPackages = recurseIntoAttrs (callPackage ./java-packages.nix { }); + + inherit (javaPackages) openjfx11 openjfx15 openjfx17 openjfx19 openjfx20 openjfx21 openjfx22; + openjfx = openjfx17; + + openjdk8-bootstrap = javaPackages.compiler.openjdk8-bootstrap; + openjdk8 = javaPackages.compiler.openjdk8; + openjdk8_headless = javaPackages.compiler.openjdk8.headless; + jdk8 = openjdk8; + jdk8_headless = openjdk8_headless; + jre8 = openjdk8.jre; + jre8_headless = openjdk8_headless.jre; + + openjdk11-bootstrap = javaPackages.compiler.openjdk11-bootstrap; + openjdk11 = javaPackages.compiler.openjdk11; + openjdk11_headless = javaPackages.compiler.openjdk11.headless; + jdk11 = openjdk11; + jdk11_headless = openjdk11_headless; + + openjdk17-bootstrap = javaPackages.compiler.openjdk17-bootstrap; + openjdk17 = javaPackages.compiler.openjdk17; + openjdk17_headless = javaPackages.compiler.openjdk17.headless; + jdk17 = openjdk17; + jdk17_headless = openjdk17_headless; + + openjdk16-bootstrap = javaPackages.compiler.openjdk16-bootstrap; + + openjdk19 = javaPackages.compiler.openjdk19; + openjdk19_headless = javaPackages.compiler.openjdk19.headless; + jdk19 = openjdk19; + jdk19_headless = openjdk19_headless; + + openjdk20 = javaPackages.compiler.openjdk20; + openjdk20_headless = javaPackages.compiler.openjdk20.headless; + jdk20 = openjdk20; + jdk20_headless = openjdk20_headless; + + openjdk21 = javaPackages.compiler.openjdk21; + openjdk21_headless = javaPackages.compiler.openjdk21.headless; + jdk21 = openjdk21; + jdk21_headless = openjdk21_headless; + + openjdk22 = javaPackages.compiler.openjdk22; + openjdk22_headless = javaPackages.compiler.openjdk22.headless; + jdk22 = openjdk22; + jdk22_headless = openjdk22_headless; + + /* default JDK */ + jdk = jdk21; + jdk_headless = jdk21_headless; + + # Since the introduction of the Java Platform Module System in Java 9, Java + # no longer ships a separate JRE package. + # + # If you are building a 'minimal' system/image, you are encouraged to use + # 'jre_minimal' to build a bespoke JRE containing only the modules you need. + # + # For a general-purpose system, 'jre' defaults to the full JDK: + jre = jdk; + jre_headless = jdk_headless; + + jre17_minimal = callPackage ./openjdk/jre.nix { + jdk = jdk17; + }; + jre_minimal = callPackage ./openjdk/jre.nix { }; + + openjdk = jdk; + openjdk_headless = jdk_headless; +} diff --git a/pkgs/by-name/ja/java/semeru-bin/generate-sources.py b/pkgs/by-name/ja/java/semeru-bin/generate-sources.py new file mode 100755 index 0000000..da23559 --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/generate-sources.py @@ -0,0 +1,85 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -i python3 -p "python3.withPackages (ps: with ps; [ requests ])" + +import json +import re +import requests +import sys + +feature_versions = (8, 11, 16, 17) +oses = ("mac", "linux") +types = ("jre", "jdk") +impls = ("openj9") + +arch_to_nixos = { + "x64": ("x86_64",), + "aarch64": ("aarch64",), + "arm": ("armv6l", "armv7l"), +} + +def get_sha256(url): + resp = requests.get(url) + if resp.status_code != 200: + print("error: could not fetch checksum from url {}: code {}".format(url, resp.status_code), file=sys.stderr) + sys.exit(1) + return resp.text.strip().split(" ")[0] + +def generate_sources(releases, feature_version, out): + latest_version = None + for release in releases: + if release["prerelease"]: continue + if not re.search("_openj9-", release["name"]): continue + + for asset in release["assets"]: + match = re.match("ibm-semeru-open-(?P[a-z]*)_(?P[a-z0-9]*)_(?P[a-z]*)_(?:(?P[0-9]*)u(?P[0-9]*)b(?P[0-9]*)|(?P[0-9]*)\\.(?P[0-9]*)\\.(?P[0-9]*)_(?P[0-9]*))_(?P[a-z0-9]*)-[0-9]*\\.[0-9]*\\.[0-9]\\.tar\\.gz$", asset["name"]) + + if not match: continue + if match["os"] not in oses: continue + if match["image_type"] not in types: continue + if match["jvm_impl"] not in impls: continue + if match["architecture"] not in arch_to_nixos: continue + + version = ".".join([ + match["major1"] or match["major2"], + match["minor2"] or "0", + match["security1"] or match["security2"] + ]) + build = match["build1"] or match["build2"] + + if latest_version and latest_version != (version, build): continue + latest_version = (version, build) + + arch_map = ( + out + .setdefault(match["jvm_impl"], {}) + .setdefault(match["os"], {}) + .setdefault(match["image_type"], {}) + .setdefault(feature_version, { + "packageType": match["image_type"], + "vmType": match["jvm_impl"], + }) + ) + + for nixos_arch in arch_to_nixos[match["architecture"]]: + arch_map[nixos_arch] = { + "url": asset["browser_download_url"], + "sha256": get_sha256(asset["browser_download_url"] + ".sha256.txt"), + "version": version, + "build": build, + } + + return out + + +out = {} +for feature_version in feature_versions: + resp = requests.get(f"https://api.github.com/repos/ibmruntimes/semeru{feature_version}-binaries/releases") + + if resp.status_code != 200: + print("error: could not fetch data for release {} (code {}) {}".format(feature_version, resp.status_code, resp.content), file=sys.stderr) + sys.exit(1) + generate_sources(resp.json(), f"openjdk{feature_version}", out) + +with open("sources.json", "w") as f: + json.dump(out, f, indent=2, sort_keys=True) + f.write('\n') diff --git a/pkgs/by-name/ja/java/semeru-bin/jdk-darwin-base.nix b/pkgs/by-name/ja/java/semeru-bin/jdk-darwin-base.nix new file mode 100644 index 0000000..ccbc7d8 --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/jdk-darwin-base.nix @@ -0,0 +1,5 @@ +args: +import ../temurin-bin/jdk-darwin-base.nix ({ + name-prefix = "semeru"; + brand-name = "IBM Semeru Runtime"; +} // args) diff --git a/pkgs/by-name/ja/java/semeru-bin/jdk-darwin.nix b/pkgs/by-name/ja/java/semeru-bin/jdk-darwin.nix new file mode 100644 index 0000000..f58fec3 --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/jdk-darwin.nix @@ -0,0 +1,16 @@ +{ lib, callPackage }: + +let + sources = (lib.importJSON ./sources.json).openj9.mac; + common = opts: callPackage (import ./jdk-darwin-base.nix opts) {}; +in +{ + jdk-8 = common { sourcePerArch = sources.jdk.openjdk8; }; + jre-8 = common { sourcePerArch = sources.jre.openjdk8; }; + jdk-11 = common { sourcePerArch = sources.jdk.openjdk11; }; + jre-11 = common { sourcePerArch = sources.jre.openjdk11; }; + jdk-16 = common { sourcePerArch = sources.jdk.openjdk16; }; + jre-16 = common { sourcePerArch = sources.jre.openjdk16; }; + jdk-17 = common { sourcePerArch = sources.jdk.openjdk17; }; + jre-17 = common { sourcePerArch = sources.jre.openjdk17; }; +} diff --git a/pkgs/by-name/ja/java/semeru-bin/jdk-linux-base.nix b/pkgs/by-name/ja/java/semeru-bin/jdk-linux-base.nix new file mode 100644 index 0000000..41879ea --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/jdk-linux-base.nix @@ -0,0 +1,5 @@ +args: +import ../temurin-bin/jdk-linux-base.nix ({ + name-prefix = "semeru"; + brand-name = "IBM Semeru Runtime"; +} // args) diff --git a/pkgs/by-name/ja/java/semeru-bin/jdk-linux.nix b/pkgs/by-name/ja/java/semeru-bin/jdk-linux.nix new file mode 100644 index 0000000..c80dd99 --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/jdk-linux.nix @@ -0,0 +1,16 @@ +{ lib, callPackage }: + +let + sources = (lib.importJSON ./sources.json).openj9.linux; + common = opts: callPackage (import ./jdk-linux-base.nix opts) {}; +in +{ + jdk-8 = common { sourcePerArch = sources.jdk.openjdk8; }; + jre-8 = common { sourcePerArch = sources.jre.openjdk8; }; + jdk-11 = common { sourcePerArch = sources.jdk.openjdk11; }; + jre-11 = common { sourcePerArch = sources.jre.openjdk11; }; + jdk-16 = common { sourcePerArch = sources.jdk.openjdk16; }; + jre-16 = common { sourcePerArch = sources.jre.openjdk16; }; + jdk-17 = common { sourcePerArch = sources.jdk.openjdk17; }; + jre-17 = common { sourcePerArch = sources.jre.openjdk17; }; +} diff --git a/pkgs/by-name/ja/java/semeru-bin/sources.json b/pkgs/by-name/ja/java/semeru-bin/sources.json new file mode 100644 index 0000000..5e04fa9 --- /dev/null +++ b/pkgs/by-name/ja/java/semeru-bin/sources.json @@ -0,0 +1,248 @@ +{ + "openj9": { + "linux": { + "jdk": { + "openjdk11": { + "aarch64": { + "build": "8", + "sha256": "488739171f84e3949df6ccb1c40eaf1b73541748b123d88780329648d6b383d0", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jdk_aarch64_linux_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "eeca01d4e245a001d01663c5c20a8d50ef3d572b47a9b3689a5154f2a37bf005", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jdk_x64_linux_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + } + }, + "openjdk16": { + "aarch64": { + "build": "7", + "sha256": "022cda1210331488c3db3d0d1282ea74467397fdabc34cb482cdfe81c45f6a15", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jdk_aarch64_linux_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "1349eb9a1d9af491a1984d66a80126730357c4a5c4fcbe7112a2c832f6c0886e", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jdk_x64_linux_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "8", + "sha256": "18d291411ee4a956018b4dcefe436971e73694128782617f1b44beca991956c5", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jdk_aarch64_linux_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "78ae15d9e01fce3a473f4d6a90c331fb766211b950931088c2a85590f178ad39", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jdk_x64_linux_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + } + }, + "openjdk8": { + "aarch64": { + "build": "01", + "sha256": "6b89e648899709459b7c7dbe0a5b1ea480a88da84c6163f01255d638dbdd051b", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jdk_aarch64_linux_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "01", + "sha256": "82c8232a5cb420246457d65a5014602feb8b288079cdae896e22a2eb6e390b58", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jdk_x64_linux_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + } + } + }, + "jre": { + "openjdk11": { + "aarch64": { + "build": "8", + "sha256": "49dc05a3e9f3f99c5f8fa466261aa3e33a753694c67cabfa7d3f682e5a2e3685", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jre_aarch64_linux_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "ba09711193b8b8664478f3f949b5320232f65c1bdf61f32a885d84de73c02767", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jre_x64_linux_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + } + }, + "openjdk16": { + "aarch64": { + "build": "7", + "sha256": "575dc3827077fc661fd1103effaa13ccd0f1606d01a33643956ed2eb1ece9763", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jre_aarch64_linux_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "b077cd0b35d3ed1927c22e5b498264ecff67297992809056187b42662edfc536", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jre_x64_linux_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "8", + "sha256": "6c40c1e0d7ee0509c44465e9f26dd970904137a95fd751e6447b1d6a9ef5092a", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jre_aarch64_linux_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "b2c176f8aa8cc7138d4c22ce9298d8f49597e1d8e3fdd33125898e5ee0182c93", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jre_x64_linux_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + } + }, + "openjdk8": { + "aarch64": { + "build": "01", + "sha256": "03caff41622e84a6e7fa66a225414a9b6eefb38dd215f830cae0bc4bbfc55b5c", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jre_aarch64_linux_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "01", + "sha256": "0d4fe62716b9da2ccce324b5b46d57e8d47e5dfb5d128f87e16135ee9bc36cdc", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jre_x64_linux_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + } + } + } + }, + "mac": { + "jdk": { + "openjdk11": { + "aarch64": { + "build": "8", + "sha256": "9881b292142a129f6f5c6b21608b090f8f94625052b4f7d0ce5bd982c054ca2e", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jdk_aarch64_mac_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "8638735d2cae3efff212f898728685380355bb0a298076e9e46244d0bf3d4a64", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jdk_x64_mac_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + } + }, + "openjdk16": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "89e807261145243a358a2a626f64340944c03622f34eaa35429053e2085d7aef", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jdk_x64_mac_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "8", + "sha256": "bf22628b54115dff9939b94751531544ab735b7cbbc8d6ddfe83d1b04df3a532", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jdk_aarch64_mac_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + }, + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "a935f20564e347a9292955c04eb57e51efdb1853ae7f0b4fe759b22c9fe248be", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jdk_x64_mac_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + } + }, + "openjdk8": { + "packageType": "jdk", + "vmType": "openj9", + "x86_64": { + "build": "01", + "sha256": "c69086950c006b17484a70ef7bc85e92d121be15e69e282e1446fd238d42b6b4", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jdk_x64_mac_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + } + } + }, + "jre": { + "openjdk11": { + "aarch64": { + "build": "8", + "sha256": "39802020896476342dc11486e3cbdf10f6311c172abeb4a1e2931b472da4417e", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jre_aarch64_mac_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "92f87a3c2fb5fe60d3d51020ff95b9c234b2ae2677b79aebbe749dda717c9cdd", + "url": "https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.16%2B8_openj9-0.33.0/ibm-semeru-open-jre_x64_mac_11.0.16_8_openj9-0.33.0.tar.gz", + "version": "11.0.16" + } + }, + "openjdk16": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "7", + "sha256": "2cb8007de405d0c8f160549309bcfc1adc82e304eb372e86ce0e0a214239438f", + "url": "https://github.com/ibmruntimes/semeru16-binaries/releases/download/jdk-16.0.2%2B7_openj9-0.27.0/ibm-semeru-open-jre_x64_mac_16.0.2_7_openj9-0.27.0.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "8", + "sha256": "4057c94cd46b814cc5a4d683d5f0b95dbd0b9e13e8c2e11155561ad0d8bec85b", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jre_aarch64_mac_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + }, + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "8", + "sha256": "8e957d2eb47eaca64516ac669272c6e5186155ed8ee4d6a77e0d4b7811cd7bb6", + "url": "https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.4%2B8_openj9-0.33.0/ibm-semeru-open-jre_x64_mac_17.0.4_8_openj9-0.33.0.tar.gz", + "version": "17.0.4" + } + }, + "openjdk8": { + "packageType": "jre", + "vmType": "openj9", + "x86_64": { + "build": "01", + "sha256": "019e08dea8fbd54517dacbeac791d85717902800dd8bba77fbca1dfc6b0abd9e", + "url": "https://github.com/ibmruntimes/semeru8-binaries/releases/download/8u345-b01_openj9-0.33.0/ibm-semeru-open-jre_x64_mac_8u345b01_openj9-0.33.0.tar.gz", + "version": "8.0.345" + } + } + } + } + } +} diff --git a/pkgs/by-name/ja/java/temurin-bin/generate-sources.py b/pkgs/by-name/ja/java/temurin-bin/generate-sources.py new file mode 100755 index 0000000..bb60d69 --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/generate-sources.py @@ -0,0 +1,72 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -i python3 -p "python3.withPackages (ps: with ps; [ requests ])" + +import json +import re +import requests +import sys + +feature_versions = (8, 11, 16, 17, 18, 19, 20, 21) +oses = ("mac", "linux", "alpine-linux") +types = ("jre", "jdk") +impls = ("hotspot") + +arch_to_nixos = { + "x64": ("x86_64",), + "aarch64": ("aarch64",), + "arm": ("armv6l", "armv7l"), + "ppc64le": ("powerpc64le",), +} + +def generate_sources(assets, feature_version, out): + for asset in assets: + binary = asset["binary"] + if binary["os"] not in oses: continue + if binary["image_type"] not in types: continue + if binary["jvm_impl"] not in impls: continue + if binary["heap_size"] != "normal": continue + if binary["architecture"] not in arch_to_nixos: continue + + version = ".".join(str(v) for v in [ + asset["version"]["major"], + asset["version"]["minor"], + asset["version"]["security"] + ]) + build = str(asset["version"]["build"]) + + arch_map = ( + out + .setdefault(binary["jvm_impl"], {}) + .setdefault(binary["os"], {}) + .setdefault(binary["image_type"], {}) + .setdefault(feature_version, { + "packageType": binary["image_type"], + "vmType": binary["jvm_impl"], + }) + ) + + for nixos_arch in arch_to_nixos[binary["architecture"]]: + arch_map[nixos_arch] = { + "url": binary["package"]["link"], + "sha256": binary["package"]["checksum"], + "version": version, + "build": build, + } + + return out + + +out = {} +for feature_version in feature_versions: + # Default user-agenet is blocked by Azure WAF. + headers = {'user-agent': 'nixpkgs-temurin-generate-sources/1.0.0'} + resp = requests.get(f"https://api.adoptium.net/v3/assets/latest/{feature_version}/hotspot", headers=headers) + + if resp.status_code != 200: + print("error: could not fetch data for release {} (code {}) {}".format(feature_version, resp.status_code, resp.content), file=sys.stderr) + sys.exit(1) + generate_sources(resp.json(), f"openjdk{feature_version}", out) + +with open("sources.json", "w") as f: + json.dump(out, f, indent=2, sort_keys=True) + f.write('\n') diff --git a/pkgs/by-name/ja/java/temurin-bin/jdk-darwin-base.nix b/pkgs/by-name/ja/java/temurin-bin/jdk-darwin-base.nix new file mode 100644 index 0000000..8f6831a --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/jdk-darwin-base.nix @@ -0,0 +1,75 @@ +{ name-prefix ? "temurin" +, brand-name ? "Eclipse Temurin" +, sourcePerArch +, knownVulnerabilities ? [] +}: + +{ swingSupport ? true # not used for now +, lib, stdenv +, fetchurl +, setJavaClassPath +}: + +let + cpuName = stdenv.hostPlatform.parsed.cpu.name; + validCpuTypes = builtins.attrNames lib.systems.parse.cpuTypes; + providedCpuTypes = builtins.filter + (arch: builtins.elem arch validCpuTypes) + (builtins.attrNames sourcePerArch); + result = stdenv.mkDerivation { + pname = if sourcePerArch.packageType == "jdk" + then "${name-prefix}-bin" + else "${name-prefix}-${sourcePerArch.packageType}-bin"; + version = + sourcePerArch.${cpuName}.version or (throw "unsupported CPU ${cpuName}"); + + src = fetchurl { + inherit (sourcePerArch.${cpuName} or (throw "unsupported system ${stdenv.hostPlatform.system}")) url sha256; + }; + + # See: https://github.com/NixOS/patchelf/issues/10 + dontStrip = 1; + + installPhase = '' + cd .. + + mv $sourceRoot $out + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/Contents/Home/include/darwin/*_md.h $out/Contents/Home/include/ + + # Remove some broken manpages. + # Only for 11 and earlier. + [ -e "$out/Contents/Home/man/ja" ] && rm -r $out/Contents/Home/man/ja + + ln -s $out/Contents/Home/* $out/ + + # Propagate the setJavaClassPath setup hook from the JDK so that + # any package that depends on the JDK has $CLASSPATH set up + # properly. + mkdir -p $out/nix-support + printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + cat <> $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi + EOF + ''; + + # FIXME: use multiple outputs or return actual JRE package + passthru = { + jre = result; + home = result; + }; + + meta = with lib; { + license = licenses.gpl2Classpath; + sourceProvenance = with sourceTypes; [ binaryNativeCode binaryBytecode ]; + description = "${brand-name}, prebuilt OpenJDK binary"; + platforms = builtins.map (arch: arch + "-darwin") providedCpuTypes; # some inherit jre.meta.platforms + maintainers = with maintainers; [ taku0 ]; + inherit knownVulnerabilities; + mainProgram = "java"; + }; + }; +in result diff --git a/pkgs/by-name/ja/java/temurin-bin/jdk-darwin.nix b/pkgs/by-name/ja/java/temurin-bin/jdk-darwin.nix new file mode 100644 index 0000000..5122b6e --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/jdk-darwin.nix @@ -0,0 +1,28 @@ +{ lib, callPackage }: + +let + sources = (lib.importJSON ./sources.json).hotspot.mac; + common = opts: callPackage (import ./jdk-darwin-base.nix opts) {}; +in +{ + jdk-8 = common { sourcePerArch = sources.jdk.openjdk8; }; + jre-8 = common { sourcePerArch = sources.jre.openjdk8; }; + jdk-11 = common { sourcePerArch = sources.jdk.openjdk11; }; + jre-11 = common { sourcePerArch = sources.jre.openjdk11; }; + jdk-16 = common { sourcePerArch = sources.jdk.openjdk16; }; + + jdk-17 = common { sourcePerArch = sources.jdk.openjdk17; }; + jre-17 = common { sourcePerArch = sources.jre.openjdk17; }; + + jdk-18 = common { sourcePerArch = sources.jdk.openjdk18; }; + jre-18 = common { sourcePerArch = sources.jre.openjdk18; }; + + jdk-19 = common { sourcePerArch = sources.jdk.openjdk19; }; + jre-19 = common { sourcePerArch = sources.jre.openjdk19; }; + + jdk-20 = common { sourcePerArch = sources.jdk.openjdk20; }; + jre-20 = common { sourcePerArch = sources.jre.openjdk20; }; + + jdk-21 = common { sourcePerArch = sources.jdk.openjdk21; }; + jre-21 = common { sourcePerArch = sources.jre.openjdk21; }; +} diff --git a/pkgs/by-name/ja/java/temurin-bin/jdk-linux-base.nix b/pkgs/by-name/ja/java/temurin-bin/jdk-linux-base.nix new file mode 100644 index 0000000..ba56518 --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/jdk-linux-base.nix @@ -0,0 +1,132 @@ +{ name-prefix ? "temurin" +, brand-name ? "Eclipse Temurin" +, sourcePerArch +, knownVulnerabilities ? [] +}: + +{ stdenv +, lib +, fetchurl +, autoPatchelfHook +, makeWrapper +, setJavaClassPath +# minimum dependencies +, alsa-lib +, fontconfig +, freetype +, libffi +, xorg +, zlib +# runtime dependencies +, cups +# runtime dependencies for GTK+ Look and Feel +# TODO(@sternenseemann): gtk3 fails to evaluate in pkgsCross.ghcjs.buildPackages +# which should be fixable, this is a no-rebuild workaround for GHC. +, gtkSupport ? !stdenv.targetPlatform.isGhcjs +, cairo +, glib +, gtk3 +}: + +let + cpuName = stdenv.hostPlatform.parsed.cpu.name; + runtimeDependencies = [ + cups + ] ++ lib.optionals gtkSupport [ + cairo glib gtk3 + ]; + runtimeLibraryPath = lib.makeLibraryPath runtimeDependencies; + validCpuTypes = builtins.attrNames lib.systems.parse.cpuTypes; + providedCpuTypes = builtins.filter + (arch: builtins.elem arch validCpuTypes) + (builtins.attrNames sourcePerArch); + result = stdenv.mkDerivation { + pname = if sourcePerArch.packageType == "jdk" + then "${name-prefix}-bin" + else "${name-prefix}-${sourcePerArch.packageType}-bin"; + + version = + sourcePerArch.${cpuName}.version or (throw "unsupported CPU ${cpuName}"); + + src = fetchurl { + inherit (sourcePerArch.${cpuName}) url sha256; + }; + + buildInputs = [ + alsa-lib # libasound.so wanted by lib/libjsound.so + fontconfig + freetype + stdenv.cc.cc.lib # libstdc++.so.6 + xorg.libX11 + xorg.libXext + xorg.libXi + xorg.libXrender + xorg.libXtst + zlib + ] ++ lib.optional stdenv.isAarch32 libffi; + + nativeBuildInputs = [ autoPatchelfHook makeWrapper ]; + + # See: https://github.com/NixOS/patchelf/issues/10 + dontStrip = 1; + + installPhase = '' + cd .. + + mv $sourceRoot $out + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/linux/*_md.h $out/include/ + + # Remove some broken manpages. + # Only for 11 and earlier. + [ -e "$out/man/ja" ] && rm -r $out/man/ja* + + # Remove embedded freetype to avoid problems like + # https://github.com/NixOS/nixpkgs/issues/57733 + find "$out" -name 'libfreetype.so*' -delete + + # Propagate the setJavaClassPath setup hook from the JDK so that + # any package that depends on the JDK has $CLASSPATH set up + # properly. + mkdir -p $out/nix-support + printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + cat <> "$out/nix-support/setup-hook" + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi + EOF + + # We cannot use -exec since wrapProgram is a function but not a command. + # + # jspawnhelper is executed from JVM, so it doesn't need to wrap it, and it + # breaks building OpenJDK (#114495). + for bin in $( find "$out" -executable -type f -not -name jspawnhelper ); do + if patchelf --print-interpreter "$bin" &> /dev/null; then + wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${runtimeLibraryPath}" + fi + done + ''; + + preFixup = '' + find "$out" -name libfontmanager.so -exec \ + patchelf --add-needed libfontconfig.so {} \; + ''; + + # FIXME: use multiple outputs or return actual JRE package + passthru = { + jre = result; + home = result; + }; + + meta = with lib; { + license = licenses.gpl2Classpath; + sourceProvenance = with sourceTypes; [ binaryNativeCode binaryBytecode ]; + description = "${brand-name}, prebuilt OpenJDK binary"; + platforms = builtins.map (arch: arch + "-linux") providedCpuTypes; # some inherit jre.meta.platforms + maintainers = with maintainers; [ taku0 ]; + inherit knownVulnerabilities; + mainProgram = "java"; + }; + }; +in result diff --git a/pkgs/by-name/ja/java/temurin-bin/jdk-linux.nix b/pkgs/by-name/ja/java/temurin-bin/jdk-linux.nix new file mode 100644 index 0000000..87a00a3 --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/jdk-linux.nix @@ -0,0 +1,29 @@ +{ stdenv, lib, callPackage }: + +let + variant = if stdenv.hostPlatform.isMusl then "alpine-linux" else "linux"; + sources = (lib.importJSON ./sources.json).hotspot.${variant}; + common = opts: callPackage (import ./jdk-linux-base.nix opts) {}; +in +{ + jdk-8 = common { sourcePerArch = sources.jdk.openjdk8; }; + jre-8 = common { sourcePerArch = sources.jre.openjdk8; }; + jdk-11 = common { sourcePerArch = sources.jdk.openjdk11; }; + jre-11 = common { sourcePerArch = sources.jre.openjdk11; }; + jdk-16 = common { sourcePerArch = sources.jdk.openjdk16; }; + + jdk-17 = common { sourcePerArch = sources.jdk.openjdk17; }; + jre-17 = common { sourcePerArch = sources.jre.openjdk17; }; + + jdk-18 = common { sourcePerArch = sources.jdk.openjdk18; }; + jre-18 = common { sourcePerArch = sources.jre.openjdk18; }; + + jdk-19 = common { sourcePerArch = sources.jdk.openjdk19; }; + jre-19 = common { sourcePerArch = sources.jre.openjdk19; }; + + jdk-20 = common { sourcePerArch = sources.jdk.openjdk20; }; + jre-20 = common { sourcePerArch = sources.jre.openjdk20; }; + + jdk-21 = common { sourcePerArch = sources.jdk.openjdk21; }; + jre-21 = common { sourcePerArch = sources.jre.openjdk21; }; +} diff --git a/pkgs/by-name/ja/java/temurin-bin/sources.json b/pkgs/by-name/ja/java/temurin-bin/sources.json new file mode 100644 index 0000000..00a0e72 --- /dev/null +++ b/pkgs/by-name/ja/java/temurin-bin/sources.json @@ -0,0 +1,868 @@ +{ + "hotspot": { + "alpine-linux": { + "jdk": { + "openjdk11": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "d5e2235d3707526f7c9ba3f0dc194e60d5dec33eceff2a2dcf9d874464cc0e9e", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_alpine-linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk16": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "85788b1a1f470ca7ddc576028f29abbc3bc3b08f82dd811a3e24371689d7dc0f", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_alpine-linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "c2a571a56e5bd3f30956b17b048880078c7801ed9e8754af6d1e38b9176059a9", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_alpine-linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "478c8f56dec7378ed8c687e8d7d0fbf729973c62c497cfc8cf58bd621849d764", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_x64_alpine-linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "e2d971400ad2db25ad43ea6fa2058b269c0236e3977986dcdee2097da301beb2", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_x64_alpine-linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "b03aced4b7a1c49bc00297e35e45480fd03818862b93e17e1551a3b721e89306", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_alpine-linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "77006c0a753808c2a6662007906eb6eb230f2fb6eb9d201a39cc46113e68f82c", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_aarch64_alpine-linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "422f23f5109056cacb9227247bebf8532e2dc3c9d505e71637ba610569d6b3ff", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_x64_alpine-linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "5", + "sha256": "6cf2d4925c387c4cdc0bf2e71de3690527141b5244695d0b3109ce83a8512235", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jdk_x64_alpine-linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + } + } + }, + "jre": { + "openjdk11": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "6a3d1759bdf91433411d37ca2ad1505a7f214c1401797834e9884165c2457368", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_x64_alpine-linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk17": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "70e5d108f51ae7c7b2435d063652df058723e303a18b4f72f17f75c5320052d3", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_x64_alpine-linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "ad23309a82e690f769037b1e6417022f588702d214da533289f116bba0f61f4e", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_x64_alpine-linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "6c0ce0ead2e7ce3e0f06b9578447499c8bd0509306c95fcd81dbecb634228933", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_x64_alpine-linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "53b34747a3c042a4cccb2b8b78fba3330b105bc523f0861237baa9143dc39115", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jre_x64_alpine-linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "2898ea1ddf6f70f09b09cf99d928f6d4c862f78f81104f5dce3e44a832b8444a", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_aarch64_alpine-linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "a8fcc43927664ba191c9a77d1013f1f32fec1acc22fe6f0c29d687221f2cc95d", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_x64_alpine-linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "5", + "sha256": "7040d865493f13204194c5a1add63e22516b1fa4481264baa6a5b2614a275a0e", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jre_x64_alpine-linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + } + } + } + }, + "linux": { + "jdk": { + "openjdk11": { + "aarch64": { + "build": "9", + "sha256": "8c3146035b99c55ab26a2982f4b9abd2bf600582361cf9c732539f713d271faf", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "armv6l": { + "build": "1", + "sha256": "e83674aee238ebb5f359b9395b3c5e3fad5b645846095494662802d2f0fd01c9", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_arm_linux_hotspot_11.0.20.1_1.tar.gz", + "version": "11.0.20" + }, + "armv7l": { + "build": "1", + "sha256": "e83674aee238ebb5f359b9395b3c5e3fad5b645846095494662802d2f0fd01c9", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_arm_linux_hotspot_11.0.20.1_1.tar.gz", + "version": "11.0.20" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "9", + "sha256": "262ff98d6d88a7c7cc522cb4ec4129491a0eb04f5b17dcca0da57cfcdcf3830d", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "60ea98daa09834fdd3162ca91ddc8d92a155ab3121204f6f643176ee0c2d0d5e", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk16": { + "aarch64": { + "build": "7", + "sha256": "cb77d9d126f97898dfdc8b5fb694d1e0e5d93d13a0a6cb2aeda76f8635384340", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_aarch64_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "7721ef81416af8122a28448f3d661eb4bda40a9f78d400e4ecc55b58e627a00c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_arm_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "7721ef81416af8122a28448f3d661eb4bda40a9f78d400e4ecc55b58e627a00c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_arm_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "36ebe6c72f2fc19b8b17371f731390e15fa3aab08c28b55b9a8b71d0a578adc9", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_ppc64le_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "323d6d7474a359a28eff7ddd0df8e65bd61554a8ed12ef42fd9365349e573c2c", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_linux_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "9", + "sha256": "e2c5e26f8572544b201bc22a9b28f2b1a3147ab69be111cea07c7f52af252e75", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "armv6l": { + "build": "1", + "sha256": "b1f1d8b7fcb159a0a8029b6c3106d1d16207cecbb2047f9a4be2a64d29897da5", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_arm_linux_hotspot_17.0.8.1_1.tar.gz", + "version": "17.0.8" + }, + "armv7l": { + "build": "1", + "sha256": "b1f1d8b7fcb159a0a8029b6c3106d1d16207cecbb2047f9a4be2a64d29897da5", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_arm_linux_hotspot_17.0.8.1_1.tar.gz", + "version": "17.0.8" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "9", + "sha256": "3ae4b254d5b720f94f986481e787fbd67f0667571140ba2e2ae5020ceddbc826", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "7b175dbe0d6e3c9c23b6ed96449b018308d8fc94a5ecd9c0df8b8bc376c3c18a", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "aarch64": { + "build": "1", + "sha256": "262be608e266fd76d7496af83b2832be853c3aaf7460d6a4da198cd40db74553", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_aarch64_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "armv6l": { + "build": "1", + "sha256": "4cd49b92d13847bfad7b3bf635cca349e2c89c7641748c5288bc40d612cdbbd6", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_arm_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "armv7l": { + "build": "1", + "sha256": "4cd49b92d13847bfad7b3bf635cca349e2c89c7641748c5288bc40d612cdbbd6", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_arm_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "1", + "sha256": "030261a2189a8f773fda543a85ab9beb4c430bf81ca5be37cf6cb970b5ccbb03", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_ppc64le_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "7d6beba8cfc0a8347f278f7414351191a95a707d46b6586e9a786f2669af0f8b", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_x64_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "aarch64": { + "build": "7", + "sha256": "1c4be9aa173cb0deb0d215643d9509c8900e5497290b29eee4bee335fa57984f", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_aarch64_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "6a51cb3868b5a3b81848a0d276267230ff3f8639f20ba9ae9ef1d386440bf1fd", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_arm_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "6a51cb3868b5a3b81848a0d276267230ff3f8639f20ba9ae9ef1d386440bf1fd", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_arm_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "7", + "sha256": "173d1256dfb9d13d309b5390e6bdf72d143b512201b0868f9d349d5ed3d64072", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_ppc64le_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "3a3ba7a3f8c3a5999e2c91ea1dca843435a0d1c43737bd2f6822b2f02fc52165", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_x64_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "aarch64": { + "build": "9", + "sha256": "b475bcc23db0bd618c815bb8f11d8e084dc58288ea3bcdf4e7f389ed41c89f56", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_aarch64_linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "36", + "sha256": "45dde71faf8cbb78fab3c976894259655c8d3de827347f23e0ebe5710921dded", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20%2B36/OpenJDK20U-jdk_ppc64le_linux_hotspot_20_36.tar.gz", + "version": "20.0.0" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "3d91842e9c172967ac397076523249d05a82ead51b0006838f5f0315ad52222c", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "e184dc29a6712c1f78754ab36fb48866583665fa345324f1a79e569c064f95e9", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "12", + "sha256": "9574828ef3d735a25404ced82e09bf20e1614f7d6403956002de9cfbfcb8638f", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_ppc64le_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "1a6fa8abda4c5caed915cfbeeb176e7fbd12eb6b222f26e290ee45808b529aa1", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_x64_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "aarch64": { + "build": "8", + "sha256": "70636c2fa4927913e9e869d471607a99d3a521c1fa3f3687b889c2acba67c493", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jdk_aarch64_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + }, + "armv6l": { + "build": "5", + "sha256": "5d805ff157f272acf0f7d192f21af4a3b68c840333ca95568e4e07142efc369d", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jdk_arm_linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + }, + "armv7l": { + "build": "5", + "sha256": "5d805ff157f272acf0f7d192f21af4a3b68c840333ca95568e4e07142efc369d", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jdk_arm_linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + }, + "packageType": "jdk", + "powerpc64le": { + "build": "8", + "sha256": "9d9813d2840360ffdbc449c45e71124e8170c31a3b6cce9151fbb31352064406", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jdk_ppc64le_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + }, + "vmType": "hotspot", + "x86_64": { + "build": "8", + "sha256": "15d091e22aa0cad12a241acff8c1634e7228b9740f8d19634250aa6fe0c19a33", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + } + } + }, + "jre": { + "openjdk11": { + "aarch64": { + "build": "9", + "sha256": "8dc527e5c5da62f80ad3b6a2cd7b1789f745b1d90d5e83faba45f7a1d0b6cab8", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_aarch64_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "armv6l": { + "build": "1", + "sha256": "2fc1cc935897312c0bc2515b2e7ea1fa3b267e77305a1b51a8c3917d92af380f", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jre_arm_linux_hotspot_11.0.20.1_1.tar.gz", + "version": "11.0.20" + }, + "armv7l": { + "build": "1", + "sha256": "2fc1cc935897312c0bc2515b2e7ea1fa3b267e77305a1b51a8c3917d92af380f", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jre_arm_linux_hotspot_11.0.20.1_1.tar.gz", + "version": "11.0.20" + }, + "packageType": "jre", + "powerpc64le": { + "build": "9", + "sha256": "286e37ce06316185377eea847d2aa9f1523b9f1428684e59e772f2f6055e89b9", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_ppc64le_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "156861bb901ef18759e05f6f008595220c7d1318a46758531b957b0c950ef2c3", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_x64_linux_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk17": { + "aarch64": { + "build": "9", + "sha256": "05b192f81ed478178ba953a2a779b67fc5a810acadb633ad69f8c4412399edb8", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_aarch64_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "armv6l": { + "build": "1", + "sha256": "8af898c5d356f0b2cee2db67ff9c8e7a8e738c0f6b3a61c383150b3168b9ea58", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jre_arm_linux_hotspot_17.0.8.1_1.tar.gz", + "version": "17.0.8" + }, + "armv7l": { + "build": "1", + "sha256": "8af898c5d356f0b2cee2db67ff9c8e7a8e738c0f6b3a61c383150b3168b9ea58", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jre_arm_linux_hotspot_17.0.8.1_1.tar.gz", + "version": "17.0.8" + }, + "packageType": "jre", + "powerpc64le": { + "build": "9", + "sha256": "79c85ecf1320c67b828310167e1ced62e402bc86a5d47ca9cc7bfa3b708cb07a", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_ppc64le_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "c37f729200b572884b8f8e157852c739be728d61d9a1da0f920104876d324733", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_x64_linux_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "aarch64": { + "build": "1", + "sha256": "e11e00438c2f6f79f86ff1ca2b015913b0e16bd9491953a082d5c786402cb50a", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_aarch64_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "armv6l": { + "build": "1", + "sha256": "0ae7281fa883de0d39a75b39bfbbcec1d2a5f8ed8691af12226962ce1a761cd7", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_arm_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "armv7l": { + "build": "1", + "sha256": "0ae7281fa883de0d39a75b39bfbbcec1d2a5f8ed8691af12226962ce1a761cd7", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_arm_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "1", + "sha256": "2298504c99b4c15f620f70415215e481766d2b2f784d066206eed8c583922f8f", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_ppc64le_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "74f602ab5abaa554859a5e92a65e5bb6e23c2d4165228299c7f54ed56dbc5959", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_x64_linux_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "aarch64": { + "build": "7", + "sha256": "3653f9e5ad21e4744e5a655e243fba2895651029bee23f3d2366d5debc41a736", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_aarch64_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "armv6l": { + "build": "7", + "sha256": "d4588e8c01ca60da2ceed68b7d43d2fd9ec3350b93043f0dabd0eb6cb03cb23d", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_arm_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "armv7l": { + "build": "7", + "sha256": "d4588e8c01ca60da2ceed68b7d43d2fd9ec3350b93043f0dabd0eb6cb03cb23d", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_arm_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "7", + "sha256": "a30203431c7c21602227d39368c5af6e7abd19000d6da5562de7f3f5c57cbad5", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_ppc64le_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "7386e10c74f00a4382be0540bc0494854804ad79427d8a50ac77a4c7208ff348", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_x64_linux_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "aarch64": { + "build": "9", + "sha256": "63a730d5a3b6d21d31f7cba15dc44b019a8a4d8652e13acec45040f98584112c", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jre_aarch64_linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + }, + "packageType": "jre", + "powerpc64le": { + "build": "36", + "sha256": "a1c5a16d5a438ce7da4563cd51ff6778cdf62331c00a3096ab2388a916e076d2", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20%2B36/OpenJDK20U-jre_ppc64le_linux_hotspot_20_36.tar.gz", + "version": "20.0.0" + }, + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "e3592e86290c192804d9c6b5035d42cc32cf04141d1c0b9d1ecb67739826c8c5", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jre_x64_linux_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "4582c4cc0c6d498ba7a23fdb0a5179c9d9c0d7a26f2ee8610468d5c2954fcf2f", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_aarch64_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jre", + "powerpc64le": { + "build": "12", + "sha256": "05cc9b7bfbe246c27d307783b3d5095797be747184b168018ae3f7cc55608db2", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_ppc64le_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "277f4084bee875f127a978253cfbaad09c08df597feaf5ccc82d2206962279a3", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_x64_linux_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "aarch64": { + "build": "8", + "sha256": "37b997f12cd572da979283fccafec9ba903041a209605b50fcb46cc34f1a9917", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jre_aarch64_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + }, + "armv6l": { + "build": "5", + "sha256": "b92fb3972372b5d1f9fb51815def903105722b747f680b7ecf2ba2ba863ab156", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jre_arm_linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + }, + "armv7l": { + "build": "5", + "sha256": "b92fb3972372b5d1f9fb51815def903105722b747f680b7ecf2ba2ba863ab156", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u382-b05/OpenJDK8U-jre_arm_linux_hotspot_8u382b05.tar.gz", + "version": "8.0.382" + }, + "packageType": "jre", + "powerpc64le": { + "build": "8", + "sha256": "0ecb0aeb54fb9d3c9e1a7ea411490127e8e298d93219fafc4dd6051a5b74671f", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jre_ppc64le_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + }, + "vmType": "hotspot", + "x86_64": { + "build": "8", + "sha256": "91d31027da0d985be3549714389593d9e0da3da5057d87e3831c7c538b9a2a0f", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jre_x64_linux_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + } + } + } + }, + "mac": { + "jdk": { + "openjdk11": { + "aarch64": { + "build": "9", + "sha256": "3be236f2cf9612cd38cd6b7cfa4b8eef642a88beab0cd37c6ccf1766d755b4cc", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_aarch64_mac_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "39e30e333d01f70765f0fdc57332bc2c5ae101392bcc315ef06f472d80d8e2d7", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_mac_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk16": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "27975d9e695cfbb93861540926f9f7bcac973a254ceecbee549706a99cbbdf95", + "url": "https://github.com/adoptium/temurin16-binaries/releases/download/jdk-16.0.2%2B7/OpenJDK16U-jdk_x64_mac_hotspot_16.0.2_7.tar.gz", + "version": "16.0.2" + } + }, + "openjdk17": { + "aarch64": { + "build": "9", + "sha256": "823777266415347983bbd87ccd8136537242ff27e62f307b7e8521494c665f0d", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_aarch64_mac_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "c69b37ea72136df49ce54972408803584b49b2c91b0fbc876d7125e963c7db37", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_mac_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "aarch64": { + "build": "1", + "sha256": "c5ec423f52d8f3aa632941f29fd289f2e31dce5fe6f3abed9b72bd374f54cd41", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_aarch64_mac_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "2ed916b0c9d197a6bf71b76e84d94125023c2609e0a9b22c64553eff5c9c29c1", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jdk_x64_mac_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "aarch64": { + "build": "7", + "sha256": "c419330cc8d6b9974d3bf1937f8f0e747c34c469afd5c546831d35aa19e03d49", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_aarch64_mac_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "f59d4157b3b53a35e72db283659d47f14aecae0ff5936d5f8078000504299da6", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_x64_mac_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "aarch64": { + "build": "9", + "sha256": "6ef42b63581c0265c5a6b734e203bb922ee720571a8de46532ecca50a804c596", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_aarch64_mac_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "bdeb37322a7c9292434e417d4db9f5debd7477cf413335d3a653a4e5e50a2473", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jdk_x64_mac_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "0d29257c9bcb5f20f5c4643ef9437f36b10376863eddaf6248d09093796c6b30", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "35f3cbc86d7ff0a01facefd741d5cfb675867e0a5ec137f62ba071d2511a45c9", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_x64_mac_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "packageType": "jdk", + "vmType": "hotspot", + "x86_64": { + "build": "8", + "sha256": "d152f5b2ed8473ee0eb29c7ee134958d75ea86c8ccbafb5ee04a5545dd76108f", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jdk_x64_mac_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + } + } + }, + "jre": { + "openjdk11": { + "aarch64": { + "build": "9", + "sha256": "bcac3231195a95cac397a35410bfa3f0945ec03e5194e7b0c1d0e785a48f8b76", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_aarch64_mac_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "43d29affe994a09de31bf2fb6f8ab6d6792ba4267b9a2feacaa1f6e042481b9b", + "url": "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jre_x64_mac_hotspot_11.0.21_9.tar.gz", + "version": "11.0.21" + } + }, + "openjdk17": { + "aarch64": { + "build": "9", + "sha256": "89831d03b7cd9922bd178f1a9c8544a36c54d52295366db4e6628454b01acaef", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_aarch64_mac_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "ba214f2217dc134e94432085cff4fc5a97e964ffc211d343725fd535f3cd98a0", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_x64_mac_hotspot_17.0.9_9.tar.gz", + "version": "17.0.9" + } + }, + "openjdk18": { + "aarch64": { + "build": "1", + "sha256": "071f073efb9550838bc02e429ef972f9450b477360f803dd1cf19096ca41182e", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_aarch64_mac_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "1", + "sha256": "3629e3dc9dbab7ed13070fbea3a827030acdd62afa557496e88a6d01f9300474", + "url": "https://github.com/adoptium/temurin18-binaries/releases/download/jdk-18.0.2.1%2B1/OpenJDK18U-jre_x64_mac_hotspot_18.0.2.1_1.tar.gz", + "version": "18.0.2" + } + }, + "openjdk19": { + "aarch64": { + "build": "7", + "sha256": "1cd53e60478912fe5f2095313821e90c4926e74ff60a4aa9d99fc2ec912411c1", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_aarch64_mac_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "7", + "sha256": "33a37be7a5d7a6003595eeee6d09e47abfa1a1065a4da9a6f592b4b09cfcea19", + "url": "https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jre_x64_mac_hotspot_19.0.2_7.tar.gz", + "version": "19.0.2" + } + }, + "openjdk20": { + "aarch64": { + "build": "9", + "sha256": "81b475ab029ab224b2c711ccdfa9c25e0300539faad342a4ceefd33772fb38b4", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jre_aarch64_mac_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "9", + "sha256": "565d62faac325c098670705fb26a5cc3d4af0a25e86444ddd643f779ad2a3417", + "url": "https://github.com/adoptium/temurin20-binaries/releases/download/jdk-20.0.2%2B9/OpenJDK20U-jre_x64_mac_hotspot_20.0.2_9.tar.gz", + "version": "20.0.2" + } + }, + "openjdk21": { + "aarch64": { + "build": "12", + "sha256": "bc384961d3a866198b1055a80fdff7fb6946aa6823b3ce624cc8c3125a26bed5", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_aarch64_mac_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + }, + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "12", + "sha256": "c21a2648ec21bc4701acfb6b7a1fd90aca001db1efb8454e2980d4c8dcd9e310", + "url": "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jre_x64_mac_hotspot_21.0.1_12.tar.gz", + "version": "21.0.1" + } + }, + "openjdk8": { + "packageType": "jre", + "vmType": "hotspot", + "x86_64": { + "build": "8", + "sha256": "f1f15920ed299e10c789aef6274d88d45eb21b72f9a7b0d246a352107e344e6a", + "url": "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u392-b08/OpenJDK8U-jre_x64_mac_hotspot_8u392b08.tar.gz", + "version": "8.0.392" + } + } + } + } + } +} diff --git a/pkgs/by-name/ja/java/zulu/11.nix b/pkgs/by-name/ja/java/zulu/11.nix new file mode 100644 index 0000000..afe3363 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/11.nix @@ -0,0 +1,42 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-11-lts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-linux = { + zuluVersion = "11.70.15"; + jdkVersion = "11.0.22"; + hash = + if enableJavaFX then "sha256-FxTHgng7/oDY3n3qy8j1ztbpBQeoGcEBJbEXqaE4Zr4=" + else "sha256-V41ZRrJtkle3joKhwoID5bvWkN5I4gFjmbEnTD7no8U="; + }; + + aarch64-linux = { + zuluVersion = "11.70.15"; + jdkVersion = "11.0.22"; + hash = + if enableJavaFX then throw "JavaFX is not available for aarch64-linux" + else "sha256-u6XWMXAArUhMMb6j3KFOhkIxpVYR1oYLF0Wde7/tI0k="; + }; + + x86_64-darwin = { + zuluVersion = "11.70.15"; + jdkVersion = "11.0.22"; + hash = + if enableJavaFX then "sha256-JkJZwk+D28wHWqwUoLo7WW5ypwTrT5biSoP+70YI3eQ=" + else "sha256-ca/ttkPe2tbcm1ruguDgPsxKWbEdKcICsKCDXaup9N4="; + }; + + aarch64-darwin = { + zuluVersion = "11.70.15"; + jdkVersion = "11.0.22"; + hash = + if enableJavaFX then "sha256-bAgH4lCxPvvFOeif5gI2aoLt1aC4EXPzb2YmiS9bQsU=" + else "sha256-PWQOF+P9djZarjAJaE3I0tuI1E4H/9584VN04BMzmvM="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/17.nix b/pkgs/by-name/ja/java/zulu/17.nix new file mode 100644 index 0000000..74e00df --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/17.nix @@ -0,0 +1,42 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-17-lts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-linux = { + zuluVersion = "17.48.15"; + jdkVersion = "17.0.10"; + hash = + if enableJavaFX then "sha256-YvuD/n84+DARPm+38TxIUB727SIhASFo+WX9+PtJqyw=" + else "sha256-VyhNob2G1Tq/WCKT0g0Y//f+JD2hWgj6QU9idfvUj+I="; + }; + + aarch64-linux = { + zuluVersion = "17.48.15"; + jdkVersion = "17.0.10"; + hash = + if enableJavaFX then throw "JavaFX is not available for aarch64-linux" + else "sha256-9OZl8ruaLvjdpg42fC3IM5mC/9lmshCppNfUuz/Sf8E="; + }; + + x86_64-darwin = { + zuluVersion = "17.48.15"; + jdkVersion = "17.0.10"; + hash = + if enableJavaFX then "sha256-VOIcFtjQiYsA4AiP1TCa0Q76Ew5FdeJCICwsYGU+Dnw=" + else "sha256-huSKGvOnrEUAiE2MJbdHWtF2saeLGaQkZllXzDo8o+g="; + }; + + aarch64-darwin = { + zuluVersion = "17.48.15"; + jdkVersion = "17.0.10"; + hash = + if enableJavaFX then "sha256-fxBDhHMeL5IP4eRw9ykXrRRh7Nl9DnvDB1YLaQwFHLg=" + else "sha256-kuEiHSkb4WFtPB3m0A968LPZw7Wl0sKquhbzDF8vQS8="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/18.nix b/pkgs/by-name/ja/java/zulu/18.nix new file mode 100644 index 0000000..cbee8ac --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/18.nix @@ -0,0 +1,26 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-18-sts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-darwin = { + zuluVersion = "18.32.13"; + jdkVersion = "18.0.2.1"; + hash = + if enableJavaFX then "sha256-ZVZ1gbpJwxTduq2PPOCKqbSl+shq2NTFgqG++OXvFcg=" + else "sha256-uHPcyOgxUdTgzmIVRp/awtwve9zSt+1TZNef7DUuoRg="; + }; + + aarch64-darwin = { + zuluVersion = "18.32.13"; + jdkVersion = "18.0.2.1"; + hash = + if enableJavaFX then "sha256-tNx0a1u9iamcN9VFOJ3eqDEA6C204dtIBJZvuAH2Vjk=" + else "sha256-jAZDgxtWMq/74yKAxA69oOU0C9nXvKG5MjmZLsK04iM="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/19.nix b/pkgs/by-name/ja/java/zulu/19.nix new file mode 100644 index 0000000..28dbf58 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/19.nix @@ -0,0 +1,26 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-19-sts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-darwin = { + zuluVersion = if enableJavaFX then "19.32.15" else "19.32.13"; + jdkVersion = "19.0.2"; + hash = + if enableJavaFX then "sha256-AwLcIId0gH5D6DUU8CgJ3qnKVQm28LXYirBeXBHwPYE=" + else "sha256-KARXWumsY+OcqpEOV2EL9SsPni1nGSipjRji/Mn2KsE="; + }; + + aarch64-darwin = { + zuluVersion = if enableJavaFX then "19.32.15" else "19.32.13"; + jdkVersion = "19.0.2"; + hash = + if enableJavaFX then "sha256-/R2rrcBr64qPGEtvhruXBhPwnvurt/hiR1ICzZAdYxE=" + else "sha256-F30FjZaLL756X/Xs6xjNwW9jds4pEATxoxOeeLL7Y5E="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/20.nix b/pkgs/by-name/ja/java/zulu/20.nix new file mode 100644 index 0000000..38083a8 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/20.nix @@ -0,0 +1,26 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-20-sts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-darwin = { + zuluVersion = "20.32.11"; + jdkVersion = "20.0.2"; + hash = + if enableJavaFX then "sha256-hyxQAivZAXtqMebe30L+EYa7p+TdSdKNYj7Rl/ZwRNQ=" + else "sha256-Ev9KG6DvuBnsZrOguLsO1KQzudHCBcJNwKh45Inpnfo="; + }; + + aarch64-darwin = { + zuluVersion = "20.32.11"; + jdkVersion = "20.0.2"; + hash = + if enableJavaFX then "sha256-iPQzZS4CwaoqT8cSzg4kWCT1OyGBSJLq+NETcbucLo4=" + else "sha256-15uNZ6uMfSASV3QU2q2oA/jBk2PCHOfSjn1GY7/7qIY="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/21.nix b/pkgs/by-name/ja/java/zulu/21.nix new file mode 100644 index 0000000..db2d3a3 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/21.nix @@ -0,0 +1,42 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-21-lts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-linux = { + zuluVersion = "21.32.17"; + jdkVersion = "21.0.2"; + hash = + if enableJavaFX then "sha256-CEM2lMjyZLWS1tBcS1tBTUxBwAyzW3vrpRWFVVSFVGY=" + else "sha256-Wtcw++5rtJv/8QvznoQ5LnKNiRA9NHSn5d7w/RNLMAo="; + }; + + aarch64-linux = { + zuluVersion = "21.32.17"; + jdkVersion = "21.0.2"; + hash = + if enableJavaFX then throw "JavaFX is not available for aarch64-linux" + else "sha256-zn3xr11EqfRVYXxLiJFEP74+Syacd32Lgu1m93Fnz+A="; + }; + + x86_64-darwin = { + zuluVersion = "21.32.17"; + jdkVersion = "21.0.2"; + hash = + if enableJavaFX then "sha256-CbEKa9Z/ItFqVM4BqsWXyRf5ejQZXPK8OqkULr9Cpqk=" + else "sha256-Otj+KI61fZdcJ4auRToDaqRuR6sqw9gVOOuuKlTTwCU="; + }; + + aarch64-darwin = { + zuluVersion = "21.32.17"; + jdkVersion = "21.0.2"; + hash = + if enableJavaFX then "sha256-PK+cafgQsnK6acuQxun4IUiyYHQJsBfUawwfGV8OCfQ=" + else "sha256-6CYFFt6LYGYUIqcl8d8sNu+Ij2+zU5NWawDnMl2z0E4="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/22.nix b/pkgs/by-name/ja/java/zulu/22.nix new file mode 100644 index 0000000..96b0e68 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/22.nix @@ -0,0 +1,42 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-22-lts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-linux = { + zuluVersion = "22.28.91"; + jdkVersion = "22.0.0"; + hash = + if enableJavaFX then "sha256-HvMiODsz+puu1xtxG2RRXH/PWCk91PGNZ7UcOd9orqQ=" + else "sha256-HvMiODsz+puu1xtxG2RRXH/PWCk91PGNZ7UcOd9orqQ="; + }; + + aarch64-linux = { + zuluVersion = "22.28.91"; + jdkVersion = "22.0.0"; + hash = + if enableJavaFX then throw "JavaFX is not available for aarch64-linux" + else "sha256-3RLNNEbMk5wAZsQmbQj/jpx9iTL/yr9N3wL4t7m6c+s="; + }; + + x86_64-darwin = { + zuluVersion = "22.28.91"; + jdkVersion = "22.0.0"; + hash = + if enableJavaFX then "sha256-Y6PSNQjHRXukwux2sVbvpTIqT+Cg+KeG1C0iSEwyKZw=" + else "sha256-Y6PSNQjHRXukwux2sVbvpTIqT+Cg+KeG1C0iSEwyKZw="; + }; + + aarch64-darwin = { + zuluVersion = "22.28.91"; + jdkVersion = "22.0.0"; + hash = + if enableJavaFX then "sha256-o0VkWB4+PzBmNNWy+FZlyjTgukBTe6owfydb3YNfEE0=" + else "sha256-o0VkWB4+PzBmNNWy+FZlyjTgukBTe6owfydb3YNfEE0="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/8.nix b/pkgs/by-name/ja/java/zulu/8.nix new file mode 100644 index 0000000..0541114 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/8.nix @@ -0,0 +1,42 @@ +{ callPackage +, enableJavaFX ? false +, ... +}@args: + +callPackage ./common.nix ({ + # Details from https://www.azul.com/downloads/?version=java-8-lts&package=jdk + # Note that the latest build may differ by platform + dists = { + x86_64-linux = { + zuluVersion = "8.76.0.17"; + jdkVersion = "8.0.402"; + hash = + if enableJavaFX then "sha256-29aDAu8WVYQFSpMUFq4gG64BBz/ei/VDMg72xrpB9w4=" + else "sha256-34DI6O7T8iqDHsX63S3xk+BKDu8IHRRWNvtxpsnUJEk="; + }; + + aarch64-linux = { + zuluVersion = "8.74.0.17"; + jdkVersion = "8.0.392"; + hash = + if enableJavaFX then throw "JavaFX is not available for aarch64-linux" + else "sha256-xESdKEmfkiE657X/xclwsJR5M+P72BpWErtAcYMcK0Y="; + }; + + x86_64-darwin = { + zuluVersion = "8.76.0.17"; + jdkVersion = "8.0.402"; + hash = + if enableJavaFX then "sha256-oqFpKeWwfiXr3oX78LGvAyDGAAS2GON2gAm6fHGH7Ow=" + else "sha256-edZqDEsydQCDEwC1ZCDF/MjWVTnuQNWcKR2k/RjaIEI="; + }; + + aarch64-darwin = { + zuluVersion = "8.76.0.17"; + jdkVersion = "8.0.402"; + hash = + if enableJavaFX then "sha256-UCWRXCz4v381IWzWPDYzwJwbhsmZOYxKPLGJBQGjPmc=" + else "sha256-0VPlOuNB39gDnU+pK0DGTSUjTHTtYoxaRg3YD2LyLXg="; + }; + }; +} // builtins.removeAttrs args [ "callPackage" ]) diff --git a/pkgs/by-name/ja/java/zulu/common.nix b/pkgs/by-name/ja/java/zulu/common.nix new file mode 100644 index 0000000..c905623 --- /dev/null +++ b/pkgs/by-name/ja/java/zulu/common.nix @@ -0,0 +1,172 @@ +{ lib +, stdenv +, fetchurl +, setJavaClassPath +, enableJavaFX ? false +, dists + # minimum dependencies +, unzip +, autoPatchelfHook +, makeWrapper +, alsa-lib +, fontconfig +, freetype +, zlib +, xorg + # runtime dependencies +, cups + # runtime dependencies for GTK+ Look and Feel +, gtkSupport ? stdenv.isLinux +, cairo +, glib +, gtk2 +, gtk3 + # runtime dependencies for JavaFX +, ffmpeg +}: +let + dist = dists.${stdenv.hostPlatform.system} + or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); + + arch = { + "aarch64" = "aarch64"; + "x86_64" = "x64"; + }.${stdenv.hostPlatform.parsed.cpu.name} + or (throw "Unsupported architecture: ${stdenv.hostPlatform.parsed.cpu.name}"); + + platform = { + "darwin" = "macosx"; + "linux" = "linux"; + }.${stdenv.hostPlatform.parsed.kernel.name} + or (throw "Unsupported platform: ${stdenv.hostPlatform.parsed.kernel.name}"); + + runtimeDependencies = [ + cups + ] ++ lib.optionals gtkSupport [ + cairo + glib + gtk3 + ] ++ lib.optionals (gtkSupport && lib.versionOlder dist.jdkVersion "17") [ + gtk2 + ] ++ lib.optionals (stdenv.isLinux && enableJavaFX) [ + ffmpeg.lib + ]; + + runtimeLibraryPath = lib.makeLibraryPath runtimeDependencies; + + jce-policies = fetchurl { + url = "https://web.archive.org/web/20211126120343/http://cdn.azul.com/zcek/bin/ZuluJCEPolicies.zip"; + hash = "sha256-gCGii4ysQbRPFCH9IQoKCCL8r4jWLS5wo1sv9iioZ1o="; + }; + + javaPackage = if enableJavaFX then "ca-fx-jdk" else "ca-jdk"; + + isJdk8 = lib.versions.major dist.jdkVersion == "8"; + + jdk = stdenv.mkDerivation rec { + pname = "zulu-${javaPackage}"; + version = dist.jdkVersion; + + src = fetchurl { + url = "https://cdn.azul.com/zulu/bin/zulu${dist.zuluVersion}-${javaPackage}${dist.jdkVersion}-${platform}_${arch}.tar.gz"; + inherit (dist) hash; + curlOpts = "-H Referer:https://www.azul.com/downloads/zulu/"; + }; + + nativeBuildInputs = [ + unzip + ] ++ lib.optionals stdenv.isLinux [ + autoPatchelfHook + makeWrapper + ]; + + buildInputs = lib.optionals stdenv.isLinux [ + alsa-lib # libasound.so wanted by lib/libjsound.so + fontconfig + freetype + stdenv.cc.cc # libstdc++.so.6 + xorg.libX11 + xorg.libXext + xorg.libXi + xorg.libXrender + xorg.libXtst + xorg.libXxf86vm + zlib + ] ++ lib.optionals (stdenv.isLinux && enableJavaFX) runtimeDependencies; + + autoPatchelfIgnoreMissingDeps = if (stdenv.isLinux && enableJavaFX) then [ + "libavcodec*.so.*" + "libavformat*.so.*" + ] else null; + + installPhase = '' + mkdir -p $out + mv * $out + + unzip ${jce-policies} + mv -f ZuluJCEPolicies/*.jar $out/${lib.optionalString isJdk8 "jre/"}lib/security/ + + # jni.h expects jni_md.h to be in the header search path. + ln -s $out/include/${stdenv.hostPlatform.parsed.kernel.name}/*_md.h $out/include/ + + if [ -f $out/LICENSE ]; then + install -D $out/LICENSE $out/share/zulu/LICENSE + rm $out/LICENSE + fi + ''; + + preFixup = '' + # Propagate the setJavaClassPath setup hook from the ${if isJdk8 then "JRE" else "JDK"} so that + # any package that depends on the ${if isJdk8 then "JRE" else "JDK"} has $CLASSPATH set up + # properly. + mkdir -p $out/nix-support + printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs + + # Set JAVA_HOME automatically. + cat <> $out/nix-support/setup-hook + if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi + EOF + '' + lib.optionalString stdenv.isLinux '' + # We cannot use -exec since wrapProgram is a function but not a command. + # + # jspawnhelper is executed from JVM, so it doesn't need to wrap it, and it + # breaks building OpenJDK (#114495). + for bin in $( find "$out" -executable -type f -not -name jspawnhelper ); do + if patchelf --print-interpreter "$bin" &> /dev/null; then + wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${runtimeLibraryPath}" + fi + done + '' + # FIXME: move all of the above to installPhase. + + lib.optionalString stdenv.isLinux '' + find "$out" -name libfontmanager.so -exec \ + patchelf --add-needed libfontconfig.so {} \; + ''; + + # fixupPhase is moving the man to share/man which breaks it because it's a + # relative symlink. + postFixup = lib.optionalString stdenv.isDarwin '' + ln -nsf ../zulu-${lib.versions.major version}.jdk/Contents/Home/man $out/share/man + ''; + + passthru = (lib.optionalAttrs isJdk8 { + jre = jdk; + }) // { + home = jdk; + }; + + meta = (import ../openjdk/meta.nix lib version) // { + description = "Certified builds of OpenJDK"; + longDescription = '' + Certified builds of OpenJDK that can be deployed across multiple + operating systems, containers, hypervisors and Cloud platforms. + ''; + homepage = "https://www.azul.com/products/zulu/"; + mainProgram = "java"; + maintainers = [ ]; + platforms = builtins.attrNames dists; + sourceProvenance = with lib.sourceTypes; [ binaryBytecode binaryNativeCode ]; + }; + }; +in +jdk diff --git a/pkgs/by-name/je/jemalloc/default.nix b/pkgs/by-name/je/jemalloc/default.nix new file mode 100644 index 0000000..902c0d7 --- /dev/null +++ b/pkgs/by-name/je/jemalloc/default.nix @@ -0,0 +1,67 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +# By default, jemalloc puts a je_ prefix onto all its symbols on OSX, which +# then stops downstream builds (mariadb in particular) from detecting it. This +# option should remove the prefix and give us a working jemalloc. +# Causes segfaults with some software (ex. rustc), but defaults to true for backward +# compatibility. +, stripPrefix ? stdenv.hostPlatform.isDarwin +, disableInitExecTls ? false +}: + +stdenv.mkDerivation rec { + pname = "jemalloc"; + version = "5.3.0"; + + src = fetchurl { + url = "https://github.com/jemalloc/jemalloc/releases/download/${version}/${pname}-${version}.tar.bz2"; + sha256 = "sha256-LbgtHnEZ3z5xt2QCGbbf6EeJvAU3mDw7esT3GJrs/qo="; + }; + + patches = [ + # fix tests under --with-jemalloc-prefix=, see https://github.com/jemalloc/jemalloc/pull/2340 + (fetchpatch { + url = "https://github.com/jemalloc/jemalloc/commit/d00ecee6a8dfa90afcb1bbc0858985c17bef6559.patch"; + hash = "sha256-N5i4IxGJ4SSAgFiq5oGRnrNeegdk2flw9Sh2mP0yl4c="; + }) + ]; + + configureFlags = + # see the comment on stripPrefix + lib.optional stripPrefix "--with-jemalloc-prefix=" + ++ lib.optional disableInitExecTls "--disable-initial-exec-tls" + # jemalloc is unable to correctly detect transparent hugepage support on + # ARM (https://github.com/jemalloc/jemalloc/issues/526), and the default + # kernel ARMv6/7 kernel does not enable it, so we explicitly disable support + ++ lib.optionals (stdenv.isAarch32 && lib.versionOlder version "5") [ + "--disable-thp" + "je_cv_thp=no" + ] + # AArch64 has configurable page size up to 64k. The default configuration + # for jemalloc only supports 4k page sizes. + ++ lib.optional stdenv.isAarch64 "--with-lg-page=16" + # See https://github.com/jemalloc/jemalloc/issues/1997 + # Using a value of 48 should work on both emulated and native x86_64-darwin. + ++ lib.optional (stdenv.isDarwin && stdenv.isx86_64) "--with-lg-vaddr=48" + ; + + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-Wno-error=array-bounds"; + + # Tries to link test binaries binaries dynamically and fails + doCheck = !stdenv.hostPlatform.isStatic; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://jemalloc.net/"; + description = "General purpose malloc(3) implementation"; + longDescription = '' + malloc(3)-compatible memory allocator that emphasizes fragmentation + avoidance and scalable concurrency support. + ''; + license = licenses.bsd2; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/je/jemalloc/rust.nix b/pkgs/by-name/je/jemalloc/rust.nix new file mode 100644 index 0000000..1a99689 --- /dev/null +++ b/pkgs/by-name/je/jemalloc/rust.nix @@ -0,0 +1,24 @@ +{ lib +, stdenv +, jemalloc +, writeText + +, unprefixed ? false +}: + +let + # On some platforms the unprefixed feature will be ignored: + # https://github.com/tikv/jemallocator/blob/ab0676d77e81268cd09b059260c75b38dbef2d51/jemalloc-sys/src/env.rs + unprefixed' = unprefixed && !stdenv.hostPlatform.isMusl && !stdenv.hostPlatform.isDarwin && !stdenv.hostPlatform.isAndroid; + +in jemalloc.overrideAttrs (oldAttrs: { + configureFlags = oldAttrs.configureFlags ++ [ + "--with-private-namespace=_rjem_" + ] ++ lib.optionals (!unprefixed') [ + "--with-jemalloc-prefix=_rjem_" + ]; + + setupHook = writeText "setup-hook.sh" '' + export JEMALLOC_OVERRIDE="@out@/lib/libjemalloc${stdenv.hostPlatform.extensions.library}" + ''; +}) diff --git a/pkgs/by-name/jq/jq/default.nix b/pkgs/by-name/jq/jq/default.nix new file mode 100644 index 0000000..432fe68 --- /dev/null +++ b/pkgs/by-name/jq/jq/default.nix @@ -0,0 +1,84 @@ +{ lib +, stdenv +, fetchurl +, removeReferencesTo +, autoreconfHook +, bison +, onigurumaSupport ? true +, oniguruma +}: + +stdenv.mkDerivation rec { + pname = "jq"; + version = "1.7.1"; + + # Note: do not use fetchpatch or fetchFromGitHub to keep this package available in __bootPackages + src = fetchurl { + url = "https://github.com/jqlang/jq/releases/download/jq-${version}/jq-${version}.tar.gz"; + hash = "sha256-R4ycoSn9LjRD/icxS0VeIR4NjGC8j/ffcDhz3u7lgMI="; + }; + + outputs = [ "bin" "doc" "man" "dev" "lib" "out" ]; + + # Upstream script that writes the version that's eventually compiled + # and printed in `jq --help` relies on a .git directory which our src + # doesn't keep. + preConfigure = '' + echo "#!/bin/sh" > scripts/version + echo "echo ${version}" >> scripts/version + patchShebangs scripts/version + ''; + + # paranoid mode: make sure we never use vendored version of oniguruma + # Note: it must be run after automake, or automake will complain + preBuild = '' + rm -r ./modules/oniguruma + ''; + + buildInputs = lib.optionals onigurumaSupport [ oniguruma ]; + nativeBuildInputs = [ removeReferencesTo autoreconfHook bison ]; + + # Darwin requires _REENTRANT be defined to use functions like `lgamma_r`. + # Otherwise, configure will detect that they’re in libm, but the build will fail + # with clang 16+ due to calls to undeclared functions. + # This is fixed upstream and can be removed once jq is updated (to 1.7 or an unstable release). + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin (toString [ + "-D_REENTRANT=1" + "-D_DARWIN_C_SOURCE=1" + ]); + + configureFlags = [ + "--bindir=\${bin}/bin" + "--sbindir=\${bin}/bin" + "--datadir=\${doc}/share" + "--mandir=\${man}/share/man" + ] ++ lib.optional (!onigurumaSupport) "--with-oniguruma=no" + # jq is linked to libjq: + ++ lib.optional (!stdenv.isDarwin) "LDFLAGS=-Wl,-rpath,\\\${libdir}"; + + # Break the dependency cycle: $dev refers to $bin via propagated-build-outputs, and + # $bin refers to $dev because of https://github.com/jqlang/jq/commit/583e4a27188a2db097dd043dd203b9c106bba100 + postFixup = '' + remove-references-to -t "$dev" "$bin/bin/jq" + ''; + + doInstallCheck = true; + installCheckTarget = "check"; + + postInstallCheck = '' + $bin/bin/jq --help >/dev/null + $bin/bin/jq -r '.values[1]' <<< '{"values":["hello","world"]}' | grep '^world$' > /dev/null + ''; + + passthru = { inherit onigurumaSupport; }; + + meta = with lib; { + description = "A lightweight and flexible command-line JSON processor"; + homepage = "https://jqlang.github.io/jq/"; + license = licenses.mit; + maintainers = with maintainers; [ raskin artturin ncfavier ]; + platforms = platforms.unix; + downloadPage = "https://jqlang.github.io/jq/download/"; + mainProgram = "jq"; + }; +} diff --git a/pkgs/by-name/js/json_c/default.nix b/pkgs/by-name/js/json_c/default.nix new file mode 100644 index 0000000..ab3d2be --- /dev/null +++ b/pkgs/by-name/js/json_c/default.nix @@ -0,0 +1,36 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "json-c"; + version = "0.17"; + + src = fetchFromGitHub { + owner = "json-c"; + repo = "json-c"; + rev = "json-c-0.17-20230812"; + hash = "sha256-R5KIJ0xVgGqffjzJaZvvvhAneJ+ZBuanyF6KYTTxb58="; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + description = "A JSON implementation in C"; + longDescription = '' + JSON-C implements a reference counting object model that allows you to + easily construct JSON objects in C, output them as JSON formatted strings + and parse JSON formatted strings back into the C representation of JSON + objects. + ''; + homepage = "https://github.com/json-c/json-c/wiki"; + changelog = "https://github.com/json-c/json-c/blob/${finalAttrs.src.rev}/ChangeLog"; + maintainers = with maintainers; [ lovek323 ]; + platforms = platforms.unix; + license = licenses.mit; + }; +}) diff --git a/pkgs/by-name/ke/kerberos/heimdal.nix b/pkgs/by-name/ke/kerberos/heimdal.nix new file mode 100644 index 0000000..ff211b6 --- /dev/null +++ b/pkgs/by-name/ke/kerberos/heimdal.nix @@ -0,0 +1,178 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook +, pkg-config +, python3 +, perl +, bison +, flex +, texinfo +, perlPackages + +, openldap +, libcap_ng +, sqlite +, openssl +, db +, libedit +, pam +, krb5 +, libmicrohttpd +, cjson + +, CoreFoundation +, Security +, SystemConfiguration + +, curl +, jdk +, unzip +, which + +, nixosTests + +, withCJSON ? true +, withCapNG ? stdenv.isLinux +# libmicrohttpd should theoretically work for darwin as well, but something is broken. +# It affects tests check-bx509d and check-httpkadmind. +, withMicroHTTPD ? stdenv.isLinux +, withOpenLDAP ? true +, withOpenLDAPAsHDBModule ? false +, withOpenSSL ? true +, withSQLite3 ? true +}: + +assert lib.assertMsg (withOpenLDAPAsHDBModule -> withOpenLDAP) '' + OpenLDAP needs to be enabled in order to build the OpenLDAP HDB Module. +''; + +stdenv.mkDerivation { + pname = "heimdal"; + version = "7.8.0-unstable-2023-11-29"; + + src = fetchFromGitHub { + owner = "heimdal"; + repo = "heimdal"; + rev = "3253c49544eacb33d5ad2f6f919b0696e5aab794"; + hash = "sha256-uljzQBzXrZCZjcIWfioqHN8YsbUUNy14Vo+A3vZIXzM="; + }; + + outputs = [ "out" "dev" "man" "info" ]; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + python3 + perl + bison + flex + texinfo + ] + ++ (with perlPackages; [ JSON ]); + + buildInputs = [ db libedit pam ] + ++ lib.optionals (stdenv.isDarwin) [ CoreFoundation Security SystemConfiguration ] + ++ lib.optionals (withCJSON) [ cjson ] + ++ lib.optionals (withCapNG) [ libcap_ng ] + ++ lib.optionals (withMicroHTTPD) [ libmicrohttpd ] + ++ lib.optionals (withOpenLDAP) [ openldap ] + ++ lib.optionals (withOpenSSL) [ openssl ] + ++ lib.optionals (withSQLite3) [ sqlite ]; + + doCheck = true; + nativeCheckInputs = [ + curl + jdk + unzip + which + ]; + + configureFlags = [ + "--with-libedit-include=${libedit.dev}/include" + "--with-libedit-lib=${libedit}/lib" + "--with-berkeley-db-include=${db.dev}/include" + "--with-berkeley-db" + + "--without-x" + "--disable-afs-string-to-key" + ] ++ lib.optionals (withCapNG) [ + "--with-capng" + ] ++ lib.optionals (withCJSON) [ + "--with-cjson=${cjson}" + ] ++ lib.optionals (withOpenLDAP) [ + "--with-openldap=${openldap.dev}" + ] ++ lib.optionals (withOpenLDAPAsHDBModule) [ + "--enable-hdb-openldap-module" + ] ++ lib.optionals (withSQLite3) [ + "--with-sqlite3=${sqlite.dev}" + ]; + + # (check-ldap) slapd resides within ${openldap}/libexec, + # which is not part of $PATH by default. + # (check-ldap) prepending ${openldap}/bin to the path to avoid + # using the default installation of openldap on unsandboxed darwin systems, + # which does not support the new mdb backend at the moment (2024-01-13). + # (check-ldap) the bdb backend got deprecated in favour of mdb in openldap 2.5.0, + # but the heimdal tests still seem to expect bdb as the openldap backend. + # This might be fixed upstream in a future update. + patchPhase = '' + runHook prePatch + + substituteInPlace tests/ldap/slapd-init.in \ + --replace 'SCHEMA_PATHS="' 'SCHEMA_PATHS="${openldap}/etc/schema ' + substituteInPlace tests/ldap/check-ldap.in \ + --replace 'PATH=' 'PATH=${openldap}/libexec:${openldap}/bin:' + substituteInPlace tests/ldap/slapd.conf \ + --replace 'database bdb' 'database mdb' + + runHook postPatch + ''; + + # (test_cc) heimdal uses librokens implementation of `secure_getenv` on darwin, + # which expects either USER or LOGNAME to be set. + preCheck = lib.optionalString (stdenv.isDarwin) '' + export USER=nix-builder + ''; + + # We need to build hcrypt for applications like samba + postBuild = '' + (cd include/hcrypto; make -j $NIX_BUILD_CORES) + (cd lib/hcrypto; make -j $NIX_BUILD_CORES) + ''; + + postInstall = '' + # Install hcrypto + (cd include/hcrypto; make -j $NIX_BUILD_CORES install) + (cd lib/hcrypto; make -j $NIX_BUILD_CORES install) + + mkdir -p $dev/bin + mv $out/bin/krb5-config $dev/bin/ + + # asn1 compilers, move them to $dev + mv $out/libexec/heimdal/* $dev/bin + rmdir $out/libexec/heimdal + + # compile_et is needed for cross-compiling this package and samba + mv lib/com_err/.libs/compile_et $dev/bin + ''; + + # Issues with hydra + # In file included from hxtool.c:34:0: + # hx_locl.h:67:25: fatal error: pkcs10_asn1.h: No such file or directory + #enableParallelBuilding = true; + + passthru = { + implementation = "heimdal"; + tests.nixos = nixosTests.kerberos.heimdal; + }; + + meta = with lib; { + homepage = "https://www.heimdal.software"; + changelog = "https://github.com/heimdal/heimdal/releases"; + description = "An implementation of Kerberos 5 (and some more stuff)"; + license = licenses.bsd3; + platforms = platforms.unix; + maintainers = with maintainers; [ h7x4 ]; + }; +} diff --git a/pkgs/by-name/ke/kerberos/krb5.nix b/pkgs/by-name/ke/kerberos/krb5.nix new file mode 100644 index 0000000..edf5a06 --- /dev/null +++ b/pkgs/by-name/ke/kerberos/krb5.nix @@ -0,0 +1,130 @@ +{ lib, stdenv, fetchurl, pkg-config, perl, bison, bootstrap_cmds +, openssl, openldap, libedit, keyutils, libverto, darwin + +# for passthru.tests +# , bind +# , curl +# , nixosTests +# , openssh +# , postgresql +# , python3 + +# Extra Arguments +, type ? "" +# This is called "staticOnly" because krb5 does not support +# builting both static and shared, see below. +, staticOnly ? false +, withLdap ? false +, withVerto ? false +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let + libOnly = type == "lib"; +in + +assert withLdap -> !libOnly; + +stdenv.mkDerivation rec { + pname = "${type}krb5"; + version = "1.21.2"; + + src = fetchurl { + url = "https://kerberos.org/dist/krb5/${lib.versions.majorMinor version}/krb5-${version}.tar.gz"; + hash = "sha256-lWCUGp2EPAJDpxsXp6xv4xx867W845g9t55Srn6FBJE="; + }; + + outputs = [ "out" "dev" ]; + + configureFlags = [ "--localstatedir=/var/lib" ] + # krb5's ./configure does not allow passing --enable-shared and --enable-static at the same time. + # See https://bbs.archlinux.org/viewtopic.php?pid=1576737#p1576737 + ++ lib.optionals staticOnly [ "--enable-static" "--disable-shared" ] + ++ lib.optional withLdap "--with-ldap" + ++ lib.optional withVerto "--with-system-verto" + ++ lib.optional stdenv.isFreeBSD ''WARN_CFLAGS=""'' + ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) + [ "krb5_cv_attr_constructor_destructor=yes,yes" + "ac_cv_func_regcomp=yes" + "ac_cv_printf_positional=yes" + ]; + + nativeBuildInputs = [ pkg-config perl ] + ++ lib.optional (!libOnly) bison + # Provides the mig command used by the build scripts + ++ lib.optional stdenv.isDarwin bootstrap_cmds; + + buildInputs = [ openssl ] + ++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.libc != "bionic" && !(stdenv.hostPlatform.useLLVM or false)) [ keyutils ] + ++ lib.optionals (!libOnly) [ libedit ] + ++ lib.optionals withLdap [ openldap ] + ++ lib.optionals withVerto [ libverto ]; + + propagatedBuildInputs = lib.optionals stdenv.isDarwin (with darwin.apple_sdk; [ + libs.xpc + frameworks.Kerberos + ]); + + sourceRoot = "krb5-${version}/src"; + + postPatch = '' + substituteInPlace config/shlib.conf \ + --replace "'ld " "'${stdenv.cc.targetPrefix}ld " + ''; + + libFolders = [ "util" "include" "lib" "build-tools" ]; + + buildPhase = lib.optionalString libOnly '' + runHook preBuild + + MAKE="make -j $NIX_BUILD_CORES" + for folder in $libFolders; do + $MAKE -C $folder + done + + runHook postBuild + ''; + + installPhase = lib.optionalString libOnly '' + runHook preInstall + + mkdir -p "$out"/{bin,sbin,lib/pkgconfig,share/{et,man/man1}} \ + "$dev"/include/{gssapi,gssrpc,kadm5,krb5} + for folder in $libFolders; do + $MAKE -C $folder install + done + + runHook postInstall + ''; + + # not via outputBin, due to reference from libkrb5.so + postInstall = '' + moveToOutput bin/krb5-config "$dev" + ''; + + enableParallelBuilding = true; + doCheck = false; # fails with "No suitable file for testing purposes" + + meta = with lib; { + description = "MIT Kerberos 5"; + homepage = "http://web.mit.edu/kerberos/"; + license = licenses.mit; + platforms = platforms.unix ++ platforms.windows; + }; + + # passthru = { + # implementation = "krb5"; + # tests = { + # inherit (nixosTests) kerberos; + # inherit (python3.pkgs) requests-credssp; + # bind = bind.override { enableGSSAPI = true; }; + # curl = curl.override { gssSupport = true; }; + # openssh = openssh.override { withKerberos = true; }; + # # postgresql = postgresql.override { gssSupport = true; }; + # }; + # }; +} diff --git a/pkgs/by-name/ke/kerberos/packages.nix b/pkgs/by-name/ke/kerberos/packages.nix new file mode 100644 index 0000000..2a8c57d --- /dev/null +++ b/pkgs/by-name/ke/kerberos/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + krb5 = callPackage ./krb5.nix { + inherit (buildPackages.darwin) bootstrap_cmds; + }; + libkrb5 = krb5.override { type = "lib"; }; + + heimdal = callPackage ./heimdal.nix { + inherit (darwin.apple_sdk.frameworks) CoreFoundation Security SystemConfiguration; + autoreconfHook = buildPackages.autoreconfHook269; + }; +} diff --git a/pkgs/by-name/ke/kernel-headers/default.nix b/pkgs/by-name/ke/kernel-headers/default.nix new file mode 100644 index 0000000..fc2f8dd --- /dev/null +++ b/pkgs/by-name/ke/kernel-headers/default.nix @@ -0,0 +1,125 @@ +{ stdenvNoCC, lib, buildPackages, fetchurl, perl, elf-header +, bison, flex, rsync +, writeTextFile +}: + +let + + # As part of building a hostPlatform=mips kernel, Linux creates and runs a + # tiny utility `arch/mips/boot/tools/relocs_main.c` for the buildPlatform. + # This utility references a glibc-specific header `byteswap.h`. There is a + # compatibility header in gnulib for most BSDs, but not for Darwin, so we + # synthesize one here. + darwin-endian-h = writeTextFile { + name = "endian-h"; + text = '' + #include + ''; + destination = "/include/endian.h"; + }; + darwin-byteswap-h = writeTextFile { + name = "byteswap-h"; + text = '' + #pragma once + #include + #define bswap_16 OSSwapInt16 + #define bswap_32 OSSwapInt32 + #define bswap_64 OSSwapInt64 + ''; + destination = "/include/byteswap.h"; + }; + + makeLinuxHeaders = { src, version, patches ? [] }: stdenvNoCC.mkDerivation { + inherit src; + + pname = "linux-headers"; + inherit version; + + ARCH = stdenvNoCC.hostPlatform.linuxArch; + + strictDeps = true; + enableParallelBuilding = true; + + # It may look odd that we use `stdenvNoCC`, and yet explicit depend on a cc. + # We do this so we have a build->build, not build->host, C compiler. + depsBuildBuild = [ buildPackages.stdenv.cc ]; + # `elf-header` is null when libc provides `elf.h`. + nativeBuildInputs = [ + perl elf-header + ] ++ lib.optionals stdenvNoCC.hostPlatform.isAndroid [ + bison flex rsync + ] ++ lib.optionals (stdenvNoCC.buildPlatform.isDarwin && + stdenvNoCC.hostPlatform.isMips) [ + darwin-endian-h + darwin-byteswap-h + ]; + + extraIncludeDirs = lib.optionals (with stdenvNoCC.hostPlatform; isPower && is32bit && isBigEndian) ["ppc"]; + + inherit patches; + + hardeningDisable = lib.optional stdenvNoCC.buildPlatform.isDarwin "format"; + + makeFlags = [ + "SHELL=bash" + # Avoid use of runtime build->host compilers for checks. These + # checks only cared to work around bugs in very old compilers, so + # these changes should be safe. + "cc-version:=9999" + "cc-fullversion:=999999" + # `$(..)` expanded by make alone + "HOSTCC:=$(CC_FOR_BUILD)" + "HOSTCXX:=$(CXX_FOR_BUILD)" + ]; + + # Skip clean on darwin, case-sensitivity issues. + buildPhase = lib.optionalString (!stdenvNoCC.buildPlatform.isDarwin) '' + make mrproper $makeFlags + '' + (if stdenvNoCC.hostPlatform.isAndroid then '' + make defconfig + make headers_install + '' else '' + make headers $makeFlags + ''); + + checkPhase = '' + make headers_check $makeFlags + ''; + + # The following command requires rsync: + # make headers_install INSTALL_HDR_PATH=$out $makeFlags + # but rsync depends on popt which does not compile on aarch64 without + # updateAutotoolsGnuConfigScriptsHook which is not enabled in stage2, + # so we replicate it with cp. This also reduces bootstrap closure size. + installPhase = '' + mkdir -p $out + cp -r usr/include $out + find $out -type f ! -name '*.h' -delete + '' + # Some builds (e.g. KVM) want a kernel.release. + + '' + mkdir -p $out/include/config + echo "${version}-default" > $out/include/config/kernel.release + ''; + + meta = with lib; { + description = "Header files and scripts for Linux kernel"; + license = licenses.gpl2; + platforms = platforms.linux; + }; + }; +in { + inherit makeLinuxHeaders; + + linuxHeaders = let version = "6.7"; in + makeLinuxHeaders { + inherit version; + src = fetchurl { + url = "mirror://kernel/linux/kernel/v${lib.versions.major version}.x/linux-${version}.tar.xz"; + hash = "sha256-7zEUSiV20IDYwxaY6D7J9mv5fGd/oqrw1bu58zRbEGk="; + }; + patches = [ + ./no-relocs.patch # for building x86 kernel headers on non-ELF platforms + ]; + }; +} diff --git a/pkgs/by-name/ke/kernel-headers/no-relocs.patch b/pkgs/by-name/ke/kernel-headers/no-relocs.patch new file mode 100644 index 0000000..32c8822 --- /dev/null +++ b/pkgs/by-name/ke/kernel-headers/no-relocs.patch @@ -0,0 +1,7 @@ +--- a/arch/x86/Makefile ++++ b/arch/x86/Makefile +@@ -231,3 +231,3 @@ endif + archscripts: scripts_basic +- $(Q)$(MAKE) $(build)=arch/x86/tools relocs ++ $(Q)$(MAKE) $(build)=arch/x86/tools + diff --git a/pkgs/by-name/ke/kernel-headers/packages.nix b/pkgs/by-name/ke/kernel-headers/packages.nix new file mode 100644 index 0000000..6467245 --- /dev/null +++ b/pkgs/by-name/ke/kernel-headers/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit (callPackages ./. { inherit (pkgsBuildBuild) elf-header; }) + linuxHeaders makeLinuxHeaders; +} diff --git a/pkgs/by-name/ke/keyutils/0001-Remove-unused-function-after_eq.patch b/pkgs/by-name/ke/keyutils/0001-Remove-unused-function-after_eq.patch new file mode 100644 index 0000000..61ad2a4 --- /dev/null +++ b/pkgs/by-name/ke/keyutils/0001-Remove-unused-function-after_eq.patch @@ -0,0 +1,28 @@ +From 59d91e57d103fb4686d2f45ee3c688878244367a Mon Sep 17 00:00:00 2001 +From: Christian Kampka +Date: Tue, 24 Nov 2020 22:12:40 +0100 +Subject: [PATCH] Remove unused function 'after_eq' + +--- + keyctl_watch.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/keyctl_watch.c b/keyctl_watch.c +index a70a19a..c4ca7f7 100644 +--- a/keyctl_watch.c ++++ b/keyctl_watch.c +@@ -47,11 +47,6 @@ static struct watch_notification_filter filter = { + }, + }; + +-static inline bool after_eq(unsigned int a, unsigned int b) +-{ +- return (signed int)(a - b) >= 0; +-} +- + static void consumer_term(int sig) + { + consumer_stop = 1; +-- +2.28.0 + diff --git a/pkgs/by-name/ke/keyutils/conf-symlink.patch b/pkgs/by-name/ke/keyutils/conf-symlink.patch new file mode 100644 index 0000000..02762e8 --- /dev/null +++ b/pkgs/by-name/ke/keyutils/conf-symlink.patch @@ -0,0 +1,13 @@ +diff --git a/request-key.c b/request-key.c +index bf47c0a..105fee8 100644 +--- a/request-key.c ++++ b/request-key.c +@@ -313,7 +313,7 @@ static void scan_conf_dir(struct parameters *params, const char *confdir) + while ((d = readdir(dir))) { + if (d->d_name[0] == '.') + continue; +- if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG) ++ if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG && d->d_type != DT_LNK) + continue; + l = strlen(d->d_name); + if (l < 5) diff --git a/pkgs/by-name/ke/keyutils/default.nix b/pkgs/by-name/ke/keyutils/default.nix new file mode 100644 index 0000000..3426266 --- /dev/null +++ b/pkgs/by-name/ke/keyutils/default.nix @@ -0,0 +1,62 @@ +{ lib, stdenv, fetchurl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "keyutils"; + version = "1.6.3"; + + src = fetchurl { + url = "https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git/snapshot/${pname}-${version}.tar.gz"; + sha256 = "sha256-ph1XBhNq5MBb1I+GGGvP29iN2L1RB+Phlckkz8Gzm7Q="; + }; + + patches = [ + ./conf-symlink.patch + # This patch solves a duplicate symbol error when building with a clang stdenv + # Before removing this patch, please ensure the package still builds by running eg. + # nix-build -E 'with import ./. {}; pkgs.keyutils.override { stdenv = pkgs.clangStdenv; }' + ./0001-Remove-unused-function-after_eq.patch + + # Fix build for s390-linux, where size_t is different from ptrdiff_t. + (fetchurl { + url = "https://lore.kernel.org/keyrings/20230301134250.301819-1-hi@alyssa.is/raw"; + sha256 = "1cbgwxq28fw5ldh38ngcs7xiqvpnmrw0hw9zzhbhb1hdxkavrc1s"; + }) + ]; + + makeFlags = lib.optionals stdenv.hostPlatform.isStatic "NO_SOLIB=1"; + + outputs = [ "out" "lib" "dev" "man" ]; + + postPatch = '' + # https://github.com/archlinux/svntogit-packages/blob/packages/keyutils/trunk/reproducible.patch + substituteInPlace Makefile \ + --replace \ + 'VCPPFLAGS := -DPKGBUILD="\"$(shell date -u +%F)\""' \ + 'VCPPFLAGS := -DPKGBUILD="\"$(date -ud "@$SOURCE_DATE_EPOCH" +%F)\""' + ''; + + enableParallelBuilding = true; + + installFlags = [ + "ETCDIR=$(out)/etc" + "BINDIR=$(out)/bin" + "SBINDIR=$(out)/sbin" + "SHAREDIR=$(out)/share/keyutils" + "MANDIR=$(out)/share/man" + "INCLUDEDIR=$(dev)/include" + "LIBDIR=$(lib)/lib" + "USRLIBDIR=$(lib)/lib" + ]; + + meta = with lib; { + homepage = "https://people.redhat.com/dhowells/keyutils/"; + description = "Tools used to control the Linux kernel key management system"; + license = licenses.gpl2Plus; + platforms = platforms.linux; + }; +} diff --git a/pkgs/by-name/lc/lcms2/default.nix b/pkgs/by-name/lc/lcms2/default.nix new file mode 100644 index 0000000..ab98488 --- /dev/null +++ b/pkgs/by-name/lc/lcms2/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchurl, libtiff, libjpeg, zlib }: + +stdenv.mkDerivation rec { + pname = "lcms2"; + version = "2.16"; + + src = fetchurl { + url = "mirror://sourceforge/lcms/${pname}-${version}.tar.gz"; + hash = "sha256-2HPTSti5tM6gEGMfGmIo0gh0deTcXnY+uBrMI9nUWlE="; + }; + + outputs = [ "bin" "dev" "out" ]; + + propagatedBuildInputs = [ libtiff libjpeg zlib ]; + + # See https://trac.macports.org/ticket/60656 + LDFLAGS = if stdenv.hostPlatform.isDarwin then "-Wl,-w" else null; + + meta = with lib; { + description = "Color management engine"; + homepage = "http://www.littlecms.com/"; + license = licenses.mit; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/ld/ldns/default.nix b/pkgs/by-name/ld/ldns/default.nix new file mode 100644 index 0000000..1e696b1 --- /dev/null +++ b/pkgs/by-name/ld/ldns/default.nix @@ -0,0 +1,51 @@ +{ lib, stdenv, fetchurl, openssl, perl, which, dns-root-data }: + +stdenv.mkDerivation rec { + pname = "ldns"; + version = "1.8.3"; + + src = fetchurl { + url = "https://www.nlnetlabs.nl/downloads/ldns/${pname}-${version}.tar.gz"; + sha256 = "sha256-w/ct0QNrKQfjpW5qz537LlUSVrPBu9l4eULe7rcOeGA="; + }; + + postPatch = '' + patchShebangs doc/doxyparse.pl + ''; + + outputs = [ "out" "dev" "man" "examples" ]; + + nativeBuildInputs = [ perl ]; + buildInputs = [ openssl ]; + + configureFlags = [ + "--with-ssl=${openssl.dev}" + "--with-trust-anchor=${dns-root-data}/root.key" + "--with-drill" + "--disable-gost" + "--with-examples" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "ac_cv_func_malloc_0_nonnull=yes" + "ac_cv_func_realloc_0_nonnull=yes" + ]; + + nativeCheckInputs = [ which ]; + doCheck = false; # fails. missing some files + + postInstall = '' + # Only 'drill' stays in $out + # the rest are examples: + moveToOutput "bin/ldns*" "$examples" + # with exception of ldns-config, which goes to $dev: + moveToOutput "bin/ldns-config" "$dev" + ''; + + meta = with lib; { + description = "Library with the aim of simplifying DNS programming in C"; + homepage = "http://www.nlnetlabs.nl/projects/ldns/"; + license = licenses.bsd3; + maintainers = with maintainers; [ dtzWill ]; + mainProgram = "drill"; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/le/lerc/default.nix b/pkgs/by-name/le/lerc/default.nix new file mode 100644 index 0000000..f7bba51 --- /dev/null +++ b/pkgs/by-name/le/lerc/default.nix @@ -0,0 +1,40 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, cmake +}: + +stdenv.mkDerivation rec { + pname = "lerc"; + version = "4.0.0"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "esri"; + repo = "lerc"; + rev = "v${version}"; + hash = "sha256-IHY9QtNYsxPz/ksxRMZGHleT+/bawfTYNVRSTAuYQ7Y="; + }; + + patches = [ + # https://github.com/Esri/lerc/pull/227 + (fetchpatch { + name = "use-cmake-install-full-dir.patch"; + url = "https://github.com/Esri/lerc/commit/5462ca7f7dfb38c65e16f5abfd96873af177a0f8.patch"; + hash = "sha256-qaNR3QwLe0AB6vu1nXOh9KhlPdWM3DmgCJj4d0VdOUk="; + }) + ]; + + nativeBuildInputs = [ + cmake + ]; + + meta = { + description = "C++ library for Limited Error Raster Compression"; + homepage = "https://github.com/esri/lerc"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/li/libarchive/default.nix b/pkgs/by-name/li/libarchive/default.nix new file mode 100644 index 0000000..6a368fe --- /dev/null +++ b/pkgs/by-name/li/libarchive/default.nix @@ -0,0 +1,136 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, acl +, attr +, autoreconfHook +, bzip2 +, e2fsprogs +, lzo +, openssl +, pkg-config +, sharutils +, xz +, zlib +, zstd +# Optional but increases closure only negligibly. Also, while libxml2 builds +# fine on windows, libarchive has trouble linking windows things it depends on +# for some reason. +, xarSupport ? stdenv.hostPlatform.isUnix, libxml2 + +# for passthru.tests +# , cmake +# , nix +# , samba +}: + +assert xarSupport -> libxml2 != null; +stdenv.mkDerivation (finalAttrs: { + pname = "libarchive"; + version = "3.7.2"; + + src = fetchFromGitHub { + owner = "libarchive"; + repo = "libarchive"; + rev = "v${finalAttrs.version}"; + hash = "sha256-p2JgJ/rvqaQ6yyXSh+ehScUH565ud5bQncl+lOnsWfc="; + }; + + patches = [ + # Pull fix for test failure on 32-bit systems: + (fetchpatch { + name = "32-bit-tests-fix.patch"; + url = "https://github.com/libarchive/libarchive/commit/3bd918d92f8c34ba12de9c6604d96f9e262a59fc.patch"; + hash = "sha256-RM3xFM6S2DkM5DJ0kAba8eLzEXuY5/7AaU06maHJ6rM="; + }) + (fetchpatch { + name = "fix-suspicious-commit-from-known-bad-actor.patch"; + url = "https://github.com/libarchive/libarchive/commit/6110e9c82d8ba830c3440f36b990483ceaaea52c.patch"; + hash = "sha256-/j6rJ0xWhtXU0YCu1LOokxxNppy5Of6Q0XyO4U6la7M="; + }) + ]; + + outputs = [ "out" "lib" "dev" ]; + + postPatch = let + skipTestPaths = [ + # test won't work in nix sandbox + "libarchive/test/test_write_disk_perms.c" + # the filesystem does not necessarily have sparse capabilities + "libarchive/test/test_sparse_basic.c" + # the filesystem does not necessarily have hardlink capabilities + "libarchive/test/test_write_disk_hardlink.c" + # access-time-related tests flakey on some systems + "cpio/test/test_option_a.c" + "cpio/test/test_option_t.c" + ] ++ lib.optionals (stdenv.isAarch64 && stdenv.isLinux) [ + # only on some aarch64-linux systems? + "cpio/test/test_basic.c" + "cpio/test/test_format_newc.c" + ]; + removeTest = testPath: '' + substituteInPlace Makefile.am --replace "${testPath}" "" + rm "${testPath}" + ''; + in '' + substituteInPlace Makefile.am --replace '/bin/pwd' "$(type -P pwd)" + + ${lib.concatStringsSep "\n" (map removeTest skipTestPaths)} + ''; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + ]; + + buildInputs = [ + bzip2 + lzo + openssl + xz + zlib + zstd + ] ++ lib.optional stdenv.hostPlatform.isUnix sharutils + ++ lib.optionals stdenv.isLinux [ acl attr e2fsprogs ] + ++ lib.optional xarSupport libxml2; + + # Without this, pkg-config-based dependencies are unhappy + propagatedBuildInputs = lib.optionals stdenv.isLinux [ attr acl ]; + + configureFlags = lib.optional (!xarSupport) "--without-xml2"; + + preBuild = lib.optionalString stdenv.isCygwin '' + echo "#include " >> config.h + ''; + + # https://github.com/libarchive/libarchive/issues/1475 + doCheck = !stdenv.hostPlatform.isMusl; + + preFixup = '' + sed -i $lib/lib/libarchive.la \ + -e 's|-lcrypto|-L${lib.getLib openssl}/lib -lcrypto|' \ + -e 's|-llzo2|-L${lzo}/lib -llzo2|' + ''; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "http://libarchive.org"; + description = "Multi-format archive and compression library"; + longDescription = '' + The libarchive project develops a portable, efficient C library that can + read and write streaming archives in a variety of formats. It also + includes implementations of the common tar, cpio, and zcat command-line + tools that use the libarchive library. + ''; + changelog = "https://github.com/libarchive/libarchive/releases/tag/v${finalAttrs.version}"; + license = licenses.bsd3; + maintainers = with maintainers; [ jcumming AndersonTorres ]; + platforms = platforms.all; + }; + + # passthru.tests = { + # inherit cmake nix samba; + # }; +}) diff --git a/pkgs/by-name/li/libbsd/darwin-fix-libbsd.sym.patch b/pkgs/by-name/li/libbsd/darwin-fix-libbsd.sym.patch new file mode 100644 index 0000000..de40da9 --- /dev/null +++ b/pkgs/by-name/li/libbsd/darwin-fix-libbsd.sym.patch @@ -0,0 +1,15 @@ +diff --git a/src/Makefile.am b/src/Makefile.am +index 9d22b00..c6848fc 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -198,7 +198,9 @@ libbsd_ctor_a_SOURCES = \ + # Generate a simple libtool symbol export list to be used as a fallback if + # there is no version script support. + libbsd.sym: libbsd.map +- $(AM_V_GEN) $(SED) -ne 's/^[[:space:]]\{1,\}\([A-Za-z0-9_]\{1,\}\);/\1/p' libbsd.map > $@ ++ $(AM_V_GEN) $(SED) -ne 's/^[[:space:]]\{1,\}\([A-Za-z0-9_]\{1,\}\);/\1/p' libbsd.map \ ++ | grep -Ev '(group_from_gid|user_from_uid|nlist|__fdnlist|bsd_getopt)' \ ++ > $@ + + if NEED_TRANSPARENT_LIBMD + TRANSPARENT_LIBMD_DEPENDS = format.ld diff --git a/pkgs/by-name/li/libbsd/default.nix b/pkgs/by-name/li/libbsd/default.nix new file mode 100644 index 0000000..9e80d17 --- /dev/null +++ b/pkgs/by-name/li/libbsd/default.nix @@ -0,0 +1,47 @@ +{ lib +, stdenv +, fetchurl +, autoreconfHook +, libmd +, gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "libbsd"; + version = "0.11.8"; + + src = fetchurl { + url = "https://libbsd.freedesktop.org/releases/${pname}-${version}.tar.xz"; + hash = "sha256-Vf36Jpb7TVWlkvqa0Uqd+JfHsACN2zswxBmRSEH4XzM="; + }; + + outputs = [ "out" "dev" "man" ]; + + enableParallelBuilding = true; + + doCheck = true; + + nativeBuildInputs = [ autoreconfHook ]; + propagatedBuildInputs = [ libmd ]; + + patches = lib.optionals stdenv.isDarwin [ + # Temporary build system hack from upstream maintainer + # https://gitlab.freedesktop.org/libbsd/libbsd/-/issues/19#note_2017684 + ./darwin-fix-libbsd.sym.patch + ]; + + passthru.updateScript = gitUpdater { + # No nicer place to find latest release. + url = "https://gitlab.freedesktop.org/libbsd/libbsd.git"; + }; + + meta = with lib; { + description = "Common functions found on BSD systems"; + homepage = "https://libbsd.freedesktop.org/"; + license = with licenses; [ beerware bsd2 bsd3 bsdOriginal isc mit ]; + platforms = platforms.unix; + # See architectures defined in src/local-elf.h. + badPlatforms = lib.platforms.microblaze; + maintainers = with maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/by-name/li/libcap_ng/default.nix b/pkgs/by-name/li/libcap_ng/default.nix new file mode 100644 index 0000000..59aa5bb --- /dev/null +++ b/pkgs/by-name/li/libcap_ng/default.nix @@ -0,0 +1,24 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "libcap-ng"; + version = "0.8.4"; + + src = fetchurl { + url = "https://people.redhat.com/sgrubb/libcap-ng/libcap-ng-${version}.tar.gz"; + sha256 = "sha256-aFgdOzjnVTy29t33gTsfyZ5ShW8hQh97R3zlq9JgWoo="; + }; + + outputs = [ "out" "dev" "man" ]; + + configureFlags = [ + "--without-python" + ]; + + meta = with lib; { + description = "Library for working with POSIX capabilities"; + homepage = "https://people.redhat.com/sgrubb/libcap-ng/"; + platforms = platforms.linux; + license = licenses.lgpl21; + }; +} diff --git a/pkgs/by-name/li/libcpuid/default.nix b/pkgs/by-name/li/libcpuid/default.nix new file mode 100644 index 0000000..cf4afd8 --- /dev/null +++ b/pkgs/by-name/li/libcpuid/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook }: + +stdenv.mkDerivation rec { + pname = "libcpuid"; + version = "0.6.5"; + + src = fetchFromGitHub { + owner = "anrieff"; + repo = "libcpuid"; + rev = "v${version}"; + sha256 = "sha256-Bq16UH4IUR7dU57bGHKq8P6JsjaB4arOJ4zFeNyxXSg="; + }; + + nativeBuildInputs = [ autoreconfHook ]; + + meta = with lib; { + homepage = "https://libcpuid.sourceforge.net/"; + description = "A small C library for x86 CPU detection and feature extraction"; + mainProgram = "cpuid_tool"; + changelog = "https://raw.githubusercontent.com/anrieff/libcpuid/master/ChangeLog"; + license = licenses.bsd2; + maintainers = with maintainers; [ orivej artuuge ]; + platforms = platforms.x86; + }; +} diff --git a/pkgs/by-name/li/libdeflate/default.nix b/pkgs/by-name/li/libdeflate/default.nix new file mode 100644 index 0000000..c59ace0 --- /dev/null +++ b/pkgs/by-name/li/libdeflate/default.nix @@ -0,0 +1,42 @@ +{ lib +, stdenv +, fetchFromGitHub +, fixDarwinDylibNames +, pkgsStatic +, cmake +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libdeflate"; + version = "1.20"; + + src = fetchFromGitHub { + owner = "ebiggers"; + repo = "libdeflate"; + rev = "v${finalAttrs.version}"; + sha256 = "sha256-kHLdu/Pb94+arj98Jjp57FpvWbAXW49s9cxCA1cf898="; + }; + + cmakeFlags = lib.optionals stdenv.hostPlatform.isStatic [ "-DLIBDEFLATE_BUILD_SHARED_LIB=OFF" ]; + + nativeBuildInputs = [ cmake ] + ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; + + passthru.tests = { + static = pkgsStatic.libdeflate; + pkg-config = testers.hasPkgConfigModules { + package = finalAttrs.finalPackage; + }; + }; + + meta = with lib; { + description = "Fast DEFLATE/zlib/gzip compressor and decompressor"; + license = licenses.mit; + homepage = "https://github.com/ebiggers/libdeflate"; + changelog = "https://github.com/ebiggers/libdeflate/blob/v${finalAttrs.version}/NEWS.md"; + platforms = platforms.unix ++ platforms.windows; + maintainers = with maintainers; [ orivej kaction ]; + pkgConfigModules = [ "libdeflate" ]; + }; +}) diff --git a/pkgs/by-name/li/libedit/01-cygwin.patch b/pkgs/by-name/li/libedit/01-cygwin.patch new file mode 100644 index 0000000..33bd39e --- /dev/null +++ b/pkgs/by-name/li/libedit/01-cygwin.patch @@ -0,0 +1,25 @@ +--- libedit-20120311-3.0/src/chartype.h 2012-03-11 10:54:58.000000000 +0100 ++++ libedit-20120311-3.0/src/chartype.h 2012-05-03 19:00:20.651847423 +0200 +@@ -56,9 +56,11 @@ + /* Oh for a with char32_t and __STDC_UTF_32__ in it... + * ref: ISO/IEC DTR 19769 + */ ++#ifndef __CYGWIN__ + #if WCHAR_MAX < INT32_MAX + #warning Build environment does not support non-BMP characters + #endif ++#endif + + #ifndef HAVE_WCSDUP + wchar_t *wcsdup(const wchar_t *s); +--- libedit-20120311-3.0/src/editline/readline.h 2011-02-26 23:42:59.000000000 +0100 ++++ libedit-20120311-3.0/src/editline/readline.h 2012-05-03 19:00:49.211244803 +0200 +@@ -75,7 +75,7 @@ typedef KEYMAP_ENTRY *Keymap; + + #ifndef CTRL + #include +-#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) ++#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) && !defined(__CYGWIN__) + #include + #endif + #ifndef CTRL diff --git a/pkgs/by-name/li/libedit/default.nix b/pkgs/by-name/li/libedit/default.nix new file mode 100644 index 0000000..aeb7981 --- /dev/null +++ b/pkgs/by-name/li/libedit/default.nix @@ -0,0 +1,56 @@ +{ lib +, stdenv +, fetchurl +, ncurses +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libedit"; + version = "20230828-3.1"; + + src = fetchurl { + url = "https://thrysoee.dk/editline/libedit-${finalAttrs.version}.tar.gz"; + hash = "sha256-TugYK25WkpDn0fRPD3jayHFrNfZWt2Uo9pnGnJiBTa0="; + }; + + outputs = [ "out" "dev" "man" ]; + + patches = [ + ./01-cygwin.patch + ]; + + propagatedBuildInputs = [ + ncurses + ]; + + # GCC automatically include `stdc-predefs.h` while Clang does not do this by + # default. While Musl is ISO 10646 compliant, it does not define + # __STDC_ISO_10646__. + # This definition is in `stdc-predefs.h` -- that's why libedit builds just + # fine with GCC and Musl. + # There is a DR to fix this issue with Clang which is not merged yet. + # https://reviews.llvm.org/D137043 + env.NIX_CFLAGS_COMPILE = + lib.optionalString (stdenv.targetPlatform.isMusl && stdenv.cc.isClang) + "-D__STDC_ISO_10646__=201103L"; + + postFixup = '' + find $out/lib -type f | \ + grep '\.\(la\|pc\)''$' | \ + xargs sed -i -e 's,-lncurses[a-z]*,-L${ncurses.out}/lib -lncursesw,g' + ''; + + meta = { + homepage = "http://www.thrysoee.dk/editline/"; + description = "A port of the NetBSD Editline library (libedit)"; + longDescription = '' + This is an autotool- and libtoolized port of the NetBSD Editline library + (libedit). This Berkeley-style licensed command line editor library + provides generic line editing, history, and tokenization functions, + similar to those found in GNU Readline. + ''; + license = with lib.licenses; [ bsd3 ]; + maintainers = with lib.maintainers; [ AndersonTorres ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/by-name/li/libepoxy/default.nix b/pkgs/by-name/li/libepoxy/default.nix new file mode 100644 index 0000000..b9ab0d7 --- /dev/null +++ b/pkgs/by-name/li/libepoxy/default.nix @@ -0,0 +1,85 @@ +{ lib +, stdenv +, fetchFromGitHub +, meson +, ninja +, pkg-config +, utilmacros +, python3 +, libGL +, libX11 +, Carbon +, OpenGL +, x11Support ? !stdenv.isDarwin +# for passthru.tests +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libepoxy"; + version = "1.5.10"; + + src = with finalAttrs; fetchFromGitHub { + owner = "anholt"; + repo = pname; + rev = version; + sha256 = "sha256-gZiyPOW2PeTMILcPiUTqPUGRNlMM5mI1z9563v4SgEs="; + }; + + patches = [ ./libgl-path.patch ]; + + postPatch = '' + patchShebangs src/*.py + '' + + lib.optionalString stdenv.isDarwin '' + substituteInPlace src/dispatch_common.h --replace "PLATFORM_HAS_GLX 0" "PLATFORM_HAS_GLX 1" + '' + # cgl_core and cgl_epoxy_api fail in darwin sandbox and on Hydra (because it's headless?) + + lib.optionalString stdenv.isDarwin '' + substituteInPlace test/meson.build \ + --replace "[ 'cgl_epoxy_api', [ 'cgl_epoxy_api.c' ] ]," "" + '' + + lib.optionalString (stdenv.isDarwin && stdenv.isx86_64) '' + substituteInPlace test/meson.build \ + --replace "[ 'cgl_core', [ 'cgl_core.c' ] ]," "" + ''; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ meson ninja pkg-config utilmacros python3 ]; + + buildInputs = lib.optionals (x11Support && !stdenv.isDarwin) [ + libGL + ] ++ lib.optionals x11Support [ + libX11 + ] ++ lib.optionals stdenv.isDarwin [ + Carbon + OpenGL + ]; + + mesonFlags = [ + "-Degl=${if (x11Support && !stdenv.isDarwin) then "yes" else "no"}" + "-Dglx=${if x11Support then "yes" else "no"}" + "-Dtests=${lib.boolToString finalAttrs.doCheck}" + "-Dx11=${lib.boolToString x11Support}" + ]; + + env.NIX_CFLAGS_COMPILE = lib.optionalString (x11Support && !stdenv.isDarwin) ''-DLIBGL_PATH="${lib.getLib libGL}/lib"''; + + doCheck = true; + + # passthru.tests = { + # pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + + meta = with lib; { + description = "A library for handling OpenGL function pointer management"; + homepage = "https://github.com/anholt/libepoxy"; + license = licenses.mit; + maintainers = with maintainers; [ goibhniu ]; + platforms = platforms.unix; + pkgConfigModules = [ "epoxy" ]; + }; +}) diff --git a/pkgs/by-name/li/libepoxy/libgl-path.patch b/pkgs/by-name/li/libepoxy/libgl-path.patch new file mode 100644 index 0000000..8f38ee2 --- /dev/null +++ b/pkgs/by-name/li/libepoxy/libgl-path.patch @@ -0,0 +1,24 @@ +diff --git a/src/dispatch_common.c b/src/dispatch_common.c +index b3e4f5f..303e8f5 100644 +--- a/src/dispatch_common.c ++++ b/src/dispatch_common.c +@@ -310,6 +310,19 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail, bool l + flags |= RTLD_NOLOAD; + + *handle = dlopen(lib_name, flags); ++#ifdef LIBGL_PATH ++ if (!*handle) { ++ char pathbuf[sizeof(LIBGL_PATH) + 1 + 1024 + 1]; ++ int l = snprintf(pathbuf, sizeof(pathbuf), "%s/%s", LIBGL_PATH, lib_name); ++ if (l < 0 || l >= sizeof(pathbuf)) { ++ // This really shouldn't happen ++ fprintf(stderr, "Error prefixing library pathname\n"); ++ exit(1); ++ } ++ *handle = dlopen(pathbuf, flags); ++ } ++#endif ++ + if (!*handle) { + if (exit_on_fail) { + fprintf(stderr, "Couldn't open %s: %s\n", lib_name, dlerror()); diff --git a/pkgs/by-name/li/libev/default.nix b/pkgs/by-name/li/libev/default.nix new file mode 100644 index 0000000..750cb39 --- /dev/null +++ b/pkgs/by-name/li/libev/default.nix @@ -0,0 +1,28 @@ +{ lib, stdenv, fetchurl +, # Note: -static hasn’t work on darwin + static ? with stdenv.hostPlatform; isStatic && !isDarwin +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "libev"; + version="4.33"; + + src = fetchurl { + url = "http://dist.schmorp.de/libev/Attic/${pname}-${version}.tar.gz"; + sha256 = "1sjs4324is7fp21an4aas2z4dwsvs6z4xwrmp72vwpq1s6wbfzjh"; + }; + + configureFlags = lib.optional (static) "LDFLAGS=-static"; + + meta = { + description = "A high-performance event loop/event model with lots of features"; + maintainers = [ lib.maintainers.raskin ]; + platforms = lib.platforms.all; + license = lib.licenses.bsd2; # or GPL2+ + }; +} diff --git a/pkgs/by-name/li/libexecinfo/30-linux-makefile.patch b/pkgs/by-name/li/libexecinfo/30-linux-makefile.patch new file mode 100644 index 0000000..134c644 --- /dev/null +++ b/pkgs/by-name/li/libexecinfo/30-linux-makefile.patch @@ -0,0 +1,44 @@ +--- Makefile.orig ++++ Makefile +@@ -23,24 +23,25 @@ + # SUCH DAMAGE. + # + # $Id: Makefile,v 1.3 2004/07/19 05:19:55 sobomax Exp $ ++# ++# Linux Makefile by Matt Smith , 2011/01/04 + +-LIB= execinfo ++CC=cc ++AR=ar ++EXECINFO_CFLAGS=$(CFLAGS) -O2 -pipe -fno-strict-aliasing -std=gnu99 -c ++EXECINFO_LDFLAGS=$(LDFLAGS) + +-SRCS= stacktraverse.c stacktraverse.h execinfo.c execinfo.h ++all: static dynamic + +-INCS= execinfo.h ++static: ++ $(CC) $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) stacktraverse.c ++ $(CC) $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) execinfo.c ++ $(AR) rcs libexecinfo.a stacktraverse.o execinfo.o + +-SHLIB_MAJOR= 1 +-SHLIB_MINOR= 0 ++dynamic: ++ $(CC) -fpic -DPIC $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) stacktraverse.c -o stacktraverse.So ++ $(CC) -fpic -DPIC $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) execinfo.c -o execinfo.So ++ $(CC) -shared -Wl,-soname,libexecinfo.so.1 -o libexecinfo.so.1 stacktraverse.So execinfo.So + +-NOPROFILE= yes +- +-DPADD= ${LIBM} +-LDADD= -lm +- +-#WARNS?= 4 +- +-#stacktraverse.c: gen.py +-# ./gen.py > stacktraverse.c +- +-.include ++clean: ++ rm -rf *.o *.So *.a *.so diff --git a/pkgs/by-name/li/libexecinfo/default.nix b/pkgs/by-name/li/libexecinfo/default.nix new file mode 100644 index 0000000..36f956e --- /dev/null +++ b/pkgs/by-name/li/libexecinfo/default.nix @@ -0,0 +1,53 @@ +{ lib, stdenv, fetchurl, fetchpatch +, enableStatic ? true +, enableShared ? !stdenv.hostPlatform.isStatic +}: + +stdenv.mkDerivation rec { + pname = "libexecinfo"; + version = "1.1"; + + src = fetchurl { + url = "http://distcache.freebsd.org/local-distfiles/itetcu/${pname}-${version}.tar.bz2"; + sha256 = "07wvlpc1jk1sj4k5w53ml6wagh0zm9kv2l1jngv8xb7xww9ik8n9"; + }; + + patches = [ + (fetchpatch { + name = "10-execinfo.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/libexecinfo/10-execinfo.patch?id=730cdcef6901750f4029d4c3b8639ce02ee3ead1"; + sha256 = "0lnphrad4vspyljnvmm62dyxj98vgp3wabj4w3vfzfph7j8piw7g"; + }) + (fetchpatch { + name = "20-define-gnu-source.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/libexecinfo/20-define-gnu-source.patch?id=730cdcef6901750f4029d4c3b8639ce02ee3ead1"; + sha256 = "1mp8mc639b0h2s69m5z6s2h3q3n1zl298j9j0plzj7f979j76302"; + }) + ./30-linux-makefile.patch + ]; + + makeFlags = [ "CC:=$(CC)" "AR:=$(AR)" ]; + hardeningEnable = [ "stackprotector" ]; + + buildFlags = + lib.optional enableStatic "static" + ++ lib.optional enableShared "dynamic"; + + patchFlags = [ "-p0" ]; + + installPhase = '' + install -Dm644 execinfo.h stacktraverse.h -t $out/include + '' + lib.optionalString enableShared '' + install -Dm755 libexecinfo.so.1 -t $out/lib + ln -s $out/lib/libexecinfo.so{.1,} + '' + lib.optionalString enableStatic '' + install -Dm755 libexecinfo.a -t $out/lib + ''; + + meta = with lib; { + description = "Quick-n-dirty BSD licensed clone of the GNU libc backtrace facility"; + license = licenses.bsd2; + homepage = "https://www.freshports.org/devel/libexecinfo"; + maintainers = with maintainers; [ dtzWill ]; + }; +} diff --git a/pkgs/by-name/li/libffi/3.3.nix b/pkgs/by-name/li/libffi/3.3.nix new file mode 100644 index 0000000..294717d --- /dev/null +++ b/pkgs/by-name/li/libffi/3.3.nix @@ -0,0 +1,69 @@ +{ lib, stdenv, fetchurl, fetchpatch +, autoreconfHook + +, doCheck ? true # test suite depends on dejagnu which cannot be used during bootstrapping +, dejagnu +}: + +stdenv.mkDerivation rec { + pname = "libffi"; + version = "3.3"; + + src = fetchurl { + url = "https://github.com/libffi/libffi/releases/download/v${version}/${pname}-${version}.tar.gz"; + hash = "sha256-cvunkicD3fp6Ao1ROsFahcjVTI1n9V+lpIAohdxlIFY="; + }; + + patches = []; + + outputs = [ "out" "dev" "man" "info" ]; + + configureFlags = [ + "--with-gcc-arch=generic" # no detection of -march= or -mtune= + "--enable-pax_emutramp" + + # Causes issues in downstream packages which misuse ffi_closure_alloc + # Reenable once these issues are fixed and merged: + # https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6155 + # https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/283 + "--disable-exec-static-tramp" + ]; + + # with fortify3, tests fail for some reason + hardeningDisable = [ "fortify3" ]; + + preCheck = '' + # The tests use -O0 which is not compatible with -D_FORTIFY_SOURCE. + NIX_HARDENING_ENABLE=''${NIX_HARDENING_ENABLE/fortify/} + ''; + + dontStrip = stdenv.hostPlatform != stdenv.buildPlatform; # Don't run the native `strip' when cross-compiling. + + inherit doCheck; + + nativeCheckInputs = [ dejagnu ]; + + meta = with lib; { + description = "A foreign function call interface library"; + longDescription = '' + The libffi library provides a portable, high level programming + interface to various calling conventions. This allows a + programmer to call any function specified by a call interface + description at run-time. + + FFI stands for Foreign Function Interface. A foreign function + interface is the popular name for the interface that allows code + written in one language to call code written in another + language. The libffi library really only provides the lowest, + machine dependent layer of a fully featured foreign function + interface. A layer must exist above libffi that handles type + conversions for values passed between the two languages. + ''; + homepage = "http://sourceware.org/libffi/"; + license = licenses.mit; + maintainers = with maintainers; [ armeenm ]; + platforms = platforms.all; + # never built on aarch64-darwin since first introduction in nixpkgs + broken = stdenv.isDarwin && stdenv.isAarch64; + }; +} diff --git a/pkgs/by-name/li/libffi/default.nix b/pkgs/by-name/li/libffi/default.nix new file mode 100644 index 0000000..edd16ec --- /dev/null +++ b/pkgs/by-name/li/libffi/default.nix @@ -0,0 +1,83 @@ +{ lib, stdenv, fetchurl, fetchpatch +, autoreconfHook + + # test suite depends on dejagnu which cannot be used during bootstrapping + # dejagnu also requires tcl which can't be built statically at the moment +, doCheck ? !(stdenv.hostPlatform.isStatic) +, dejagnu +, nix-update-script +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libffi"; + version = "3.4.6"; + + src = fetchurl { + url = with finalAttrs; "https://github.com/libffi/libffi/releases/download/v${version}/${pname}-${version}.tar.gz"; + hash = "sha256-sN6p3yPIY6elDoJUQPPr/6vWXfFJcQjl1Dd0eEOJWk4="; + }; + + # Note: this package is used for bootstrapping fetchurl, and thus + # cannot use fetchpatch! All mutable patches (generated by GitHub or + # cgit) that are needed here should be included directly in Nixpkgs as + # files. + patches = [ + ]; + + strictDeps = true; + outputs = [ "out" "dev" "man" "info" ]; + + enableParallelBuilding = true; + + configurePlatforms = [ "build" "host" ]; + + configureFlags = [ + "--with-gcc-arch=generic" # no detection of -march= or -mtune= + "--enable-pax_emutramp" + ]; + + preCheck = '' + # The tests use -O0 which is not compatible with -D_FORTIFY_SOURCE. + NIX_HARDENING_ENABLE=''${NIX_HARDENING_ENABLE/fortify3/} + NIX_HARDENING_ENABLE=''${NIX_HARDENING_ENABLE/fortify/} + ''; + + dontStrip = stdenv.hostPlatform != stdenv.buildPlatform; # Don't run the native `strip' when cross-compiling. + + inherit doCheck; + + nativeCheckInputs = [ dejagnu ]; + + passthru = { + updateScript = nix-update-script { }; + tests = { + pkg-config = testers.hasPkgConfigModules { + package = finalAttrs.finalPackage; + }; + }; + }; + + meta = with lib; { + description = "A foreign function call interface library"; + longDescription = '' + The libffi library provides a portable, high level programming + interface to various calling conventions. This allows a + programmer to call any function specified by a call interface + description at run-time. + + FFI stands for Foreign Function Interface. A foreign function + interface is the popular name for the interface that allows code + written in one language to call code written in another + language. The libffi library really only provides the lowest, + machine dependent layer of a fully featured foreign function + interface. A layer must exist above libffi that handles type + conversions for values passed between the two languages. + ''; + homepage = "http://sourceware.org/libffi/"; + license = licenses.mit; + maintainers = with maintainers; [ matthewbauer ]; + platforms = platforms.all; + pkgConfigModules = [ "libffi" ]; + }; +}) diff --git a/pkgs/by-name/li/libffi/packages.nix b/pkgs/by-name/li/libffi/packages.nix new file mode 100644 index 0000000..76275b6 --- /dev/null +++ b/pkgs/by-name/li/libffi/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libffi = callPackage ./. { }; + libffi_3_3 = callPackage ./3.3.nix { }; + libffiBoot = libffi.override { + doCheck = false; + }; +} diff --git a/pkgs/by-name/li/libfido2/default.nix b/pkgs/by-name/li/libfido2/default.nix new file mode 100644 index 0000000..b3c3cc4 --- /dev/null +++ b/pkgs/by-name/li/libfido2/default.nix @@ -0,0 +1,59 @@ +{ lib +, stdenv +, fetchurl +, cmake +, pkg-config +, hidapi +, libcbor +, openssl +, udev +, zlib +, withPcsclite ? true +, pcsclite +}: + +stdenv.mkDerivation rec { + pname = "libfido2"; + version = "1.14.0"; + + # releases on https://developers.yubico.com/libfido2/Releases/ are signed + src = fetchurl { + url = "https://developers.yubico.com/${pname}/Releases/${pname}-${version}.tar.gz"; + sha256 = "sha256-NgF5LjIAMtQoACxMzoSZpMe4AzGQUaJaDJ8fE4/+5Fo="; + }; + + nativeBuildInputs = [ cmake pkg-config ]; + + buildInputs = [ libcbor zlib ] + ++ lib.optionals stdenv.isDarwin [ hidapi ] + ++ lib.optionals stdenv.isLinux [ udev ] + ++ lib.optionals (stdenv.isLinux && withPcsclite) [ pcsclite ]; + + propagatedBuildInputs = [ openssl ]; + + outputs = [ "out" "dev" "man" ]; + + cmakeFlags = [ + "-DUDEV_RULES_DIR=${placeholder "out"}/etc/udev/rules.d" + "-DCMAKE_INSTALL_LIBDIR=lib" + ] ++ lib.optionals stdenv.isDarwin [ + "-DUSE_HIDAPI=1" + ] ++ lib.optionals stdenv.isLinux [ + "-DNFC_LINUX=1" + ] ++ lib.optionals (stdenv.isLinux && withPcsclite) [ + "-DUSE_PCSC=1" + ]; + + # causes possible redefinition of _FORTIFY_SOURCE? + hardeningDisable = [ "fortify3" ]; + + meta = with lib; { + description = '' + Provides library functionality for FIDO 2.0, including communication with a device over USB. + ''; + homepage = "https://github.com/Yubico/libfido2"; + license = licenses.bsd2; + maintainers = with maintainers; [ dtzWill prusnak ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/li/libgcrypt/1.8.nix b/pkgs/by-name/li/libgcrypt/1.8.nix new file mode 100644 index 0000000..226aed7 --- /dev/null +++ b/pkgs/by-name/li/libgcrypt/1.8.nix @@ -0,0 +1,75 @@ +{ lib +, stdenv +, fetchurl +, libgpg-error +, enableCapabilities ? false, libcap +, buildPackages +# for passthru.tests +# , gnupg +# , libotr +# , rsyslog +}: + +assert enableCapabilities -> stdenv.isLinux; + +stdenv.mkDerivation rec { + pname = "libgcrypt"; + version = "1.8.10"; + + src = fetchurl { + url = "mirror://gnupg/libgcrypt/libgcrypt-${version}.tar.bz2"; + sha256 = "sha256-aJaRVQH5UeI9AtywRTRpwswiqk13oAH/c6JkfC0p590="; + }; + + outputs = [ "out" "dev" "info" ]; + outputBin = "dev"; + + # The CPU Jitter random number generator must not be compiled with + # optimizations and the optimize -O0 pragma only works for gcc. + # The build enables -O2 by default for everything else. + hardeningDisable = lib.optional stdenv.cc.isClang "fortify"; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + buildInputs = [ libgpg-error ] + ++ lib.optional enableCapabilities libcap; + + strictDeps = true; + + configureFlags = [ "--with-libgpg-error-prefix=${libgpg-error.dev}" ] + ++ lib.optional (stdenv.hostPlatform.isMusl || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)) "--disable-asm"; # for darwin see https://dev.gnupg.org/T5157 + + # Necessary to generate correct assembly when compiling for aarch32 on + # aarch64 + configurePlatforms = [ "host" "build" ]; + + postConfigure = '' + sed -i configure \ + -e 's/NOEXECSTACK_FLAGS=$/NOEXECSTACK_FLAGS="-Wa,--noexecstack"/' + ''; + + # Make sure libraries are correct for .pc and .la files + # Also make sure includes are fixed for callers who don't use libgpgcrypt-config + postFixup = '' + sed -i 's,#include ,#include "${libgpg-error.dev}/include/gpg-error.h",g' "$dev/include/gcrypt.h" + '' + lib.optionalString enableCapabilities '' + sed -i 's,\(-lcap\),-L${libcap.lib}/lib \1,' $out/lib/libgcrypt.la + ''; + + doCheck = true; + + # passthru.tests = { + # inherit gnupg libotr rsyslog; + # }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/libgcrypt/"; + changelog = "https://git.gnupg.org/cgi-bin/gitweb.cgi?p=${pname}.git;a=blob;f=NEWS;hb=refs/tags/${pname}-${version}"; + description = "General-purpose cryptographic library"; + license = licenses.lgpl2Plus; + platforms = platforms.all; + knownVulnerabilities = [ + "CVE-2021-40528" + ]; + }; +} diff --git a/pkgs/by-name/li/libgcrypt/default.nix b/pkgs/by-name/li/libgcrypt/default.nix new file mode 100644 index 0000000..4130f50 --- /dev/null +++ b/pkgs/by-name/li/libgcrypt/default.nix @@ -0,0 +1,85 @@ +{ lib +, stdenv +, fetchurl +, gettext +, libgpg-error +, enableCapabilities ? false, libcap +, buildPackages +# for passthru.tests +# , gnupg +# , libotr +# , rsyslog +}: + +assert enableCapabilities -> stdenv.isLinux; + +stdenv.mkDerivation rec { + pname = "libgcrypt"; + version = "1.10.3"; + + src = fetchurl { + url = "mirror://gnupg/libgcrypt/${pname}-${version}.tar.bz2"; + hash = "sha256-iwhwiXrFrGfe1Wjc+t9Flpz6imvrD9YK8qnq3Coycqo="; + }; + + outputs = [ "out" "dev" "info" ]; + outputBin = "dev"; + + # The CPU Jitter random number generator must not be compiled with + # optimizations and the optimize -O0 pragma only works for gcc. + # The build enables -O2 by default for everything else. + hardeningDisable = lib.optional stdenv.cc.isClang "fortify"; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + buildInputs = [ libgpg-error ] + ++ lib.optional stdenv.isDarwin gettext + ++ lib.optional enableCapabilities libcap; + + strictDeps = true; + + configureFlags = [ "--with-libgpg-error-prefix=${libgpg-error.dev}" ] + ++ lib.optional (stdenv.hostPlatform.isMusl || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)) "--disable-asm"; # for darwin see https://dev.gnupg.org/T5157 + + # Necessary to generate correct assembly when compiling for aarch32 on + # aarch64 + configurePlatforms = [ "host" "build" ]; + + postConfigure = '' + sed -i configure \ + -e 's/NOEXECSTACK_FLAGS=$/NOEXECSTACK_FLAGS="-Wa,--noexecstack"/' + ''; + + enableParallelBuilding = true; + + # Make sure libraries are correct for .pc and .la files + # Also make sure includes are fixed for callers who don't use libgpgcrypt-config + postFixup = '' + sed -i 's,#include ,#include "${libgpg-error.dev}/include/gpg-error.h",g' "$dev/include/gcrypt.h" + '' + lib.optionalString enableCapabilities '' + sed -i 's,\(-lcap\),-L${libcap.lib}/lib \1,' $out/lib/libgcrypt.la + ''; + + # TODO: figure out why this is even necessary and why the missing dylib only crashes + # random instead of every test + preCheck = lib.optionalString stdenv.isDarwin '' + mkdir -p $out/lib + cp src/.libs/libgcrypt.20.dylib $out/lib + ''; + + doCheck = true; + enableParallelChecking = true; + + # passthru.tests = { + # inherit gnupg libotr rsyslog; + # }; + + meta = with lib; { + homepage = "https://www.gnu.org/software/libgcrypt/"; + changelog = "https://git.gnupg.org/cgi-bin/gitweb.cgi?p=${pname}.git;a=blob;f=NEWS;hb=refs/tags/${pname}-${version}"; + description = "General-purpose cryptographic library"; + license = licenses.lgpl2Plus; + platforms = platforms.all; + maintainers = with maintainers; [ vrthra ]; + }; +} diff --git a/pkgs/by-name/li/libgcrypt/packages.nix b/pkgs/by-name/li/libgcrypt/packages.nix new file mode 100644 index 0000000..7b417e4 --- /dev/null +++ b/pkgs/by-name/li/libgcrypt/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libgcrypt = callPackage ./. { }; + libgcrypt_1_8 = callPackage ./1.8.nix { }; +} diff --git a/pkgs/by-name/li/libgit2/default.nix b/pkgs/by-name/li/libgit2/default.nix new file mode 100644 index 0000000..e95dc72 --- /dev/null +++ b/pkgs/by-name/li/libgit2/default.nix @@ -0,0 +1,83 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, pkg-config +, python3 +, zlib +, libssh2 +, openssl +, pcre +, http-parser +, libiconv +, Security +, staticBuild ? stdenv.hostPlatform.isStatic +# for passthru.tests +# , libgit2-glib +# , python3Packages +# , gitstatus +}: + +stdenv.mkDerivation rec { + pname = "libgit2"; + version = "1.7.2"; + # also check the following packages for updates: python3Packages.pygit2 and libgit2-glib + + outputs = ["lib" "dev" "out"]; + + src = fetchFromGitHub { + owner = "libgit2"; + repo = "libgit2"; + rev = "v${version}"; + hash = "sha256-fVPY/byE2/rxmv/bUykcAbmUFMlF3UZogVuTzjOXJUU="; + }; + + cmakeFlags = [ + "-DUSE_HTTP_PARSER=system" + "-DUSE_SSH=ON" + "-DBUILD_SHARED_LIBS=${if staticBuild then "OFF" else "ON"}" + ] ++ lib.optionals stdenv.hostPlatform.isWindows [ + "-DDLLTOOL=${stdenv.cc.bintools.targetPrefix}dlltool" + # For ws2_32, refered to by a `*.pc` file + "-DCMAKE_LIBRARY_PATH=${stdenv.cc.libc}/lib" + ]; + + nativeBuildInputs = [ cmake python3 pkg-config ]; + + buildInputs = [ zlib libssh2 openssl pcre http-parser ] + ++ lib.optional stdenv.isDarwin Security; + + propagatedBuildInputs = lib.optional (!stdenv.isLinux) libiconv; + + doCheck = true; + checkPhase = '' + testArgs=(-v -xonline) + + # slow + testArgs+=(-xclone::nonetwork::bad_urls) + + # failed to set permissions on ...: Operation not permitted + testArgs+=(-xrepo::init::extended_1) + testArgs+=(-xrepo::template::extended_with_template_and_shared_mode) + + ( + set -x + ./libgit2_tests ''${testArgs[@]} + ) + ''; + + # passthru.tests = { + # inherit libgit2-glib; + # inherit (python3Packages) pygit2; + # inherit gitstatus; + # }; + + meta = with lib; { + description = "Linkable library implementation of Git that you can use in your application"; + mainProgram = "git2"; + homepage = "https://libgit2.org/"; + license = licenses.gpl2Plus; + platforms = platforms.all; + maintainers = with maintainers; [ SuperSandro2000 ]; + }; +} diff --git a/pkgs/by-name/li/libgit2/packages.nix b/pkgs/by-name/li/libgit2/packages.nix new file mode 100644 index 0000000..99acc68 --- /dev/null +++ b/pkgs/by-name/li/libgit2/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libgit2 = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/li/libguestfs/appliance.nix b/pkgs/by-name/li/libguestfs/appliance.nix new file mode 100644 index 0000000..1cedb03 --- /dev/null +++ b/pkgs/by-name/li/libguestfs/appliance.nix @@ -0,0 +1,31 @@ +{ lib +, stdenvNoCC +, fetchurl +}: + +stdenvNoCC.mkDerivation rec { + pname = "libguestfs-appliance"; + version = "1.46.0"; + + src = fetchurl { + url = "http://download.libguestfs.org/binaries/appliance/appliance-${version}.tar.xz"; + hash = "sha256-p1UN5wv3y+V5dFMG5yM3bVf1vaoDzQnVv9apfwC4gNg="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp README.fixed initrd kernel root $out + + runHook postInstall + ''; + + meta = with lib; { + description = "VM appliance disk image used in libguestfs package"; + homepage = "https://libguestfs.org"; + license = with licenses; [ gpl2Plus lgpl2Plus ]; + platforms = [ "i686-linux" "x86_64-linux" ]; + hydraPlatforms = [ ]; # Hydra fails with "Output limit exceeded" + }; +} diff --git a/pkgs/by-name/li/libguestfs/default.nix b/pkgs/by-name/li/libguestfs/default.nix new file mode 100644 index 0000000..0b2b427 --- /dev/null +++ b/pkgs/by-name/li/libguestfs/default.nix @@ -0,0 +1,168 @@ +{ lib +, stdenv +, fetchurl +, pkg-config +, autoreconfHook +, makeWrapper +, libxcrypt +, ncurses +, cpio +, gperf +, cdrkit +, flex +, bison +, qemu +, pcre2 +, augeas +, libxml2 +, acl +, libcap +, libcap_ng +, libconfig +, systemd +, fuse +, yajl +, libvirt +, hivex +, db +, gmp +, readline +, file +, numactl +, libapparmor +, jansson +, getopt +, perlPackages +, ocamlPackages +, libtirpc +, appliance ? null +, javaSupport ? false +, jdk +, zstd +}: + +assert appliance == null || lib.isDerivation appliance; + +stdenv.mkDerivation rec { + pname = "libguestfs"; + version = "1.50.1"; + + src = fetchurl { + url = "https://libguestfs.org/download/${lib.versions.majorMinor version}-stable/${pname}-${version}.tar.gz"; + sha256 = "sha256-Xmhx6I+C5SHjHUQt5qELZJcCN8t5VumdEXsSO1hWWm8="; + }; + + strictDeps = true; + nativeBuildInputs = [ + autoreconfHook + bison + cdrkit + cpio + flex + getopt + gperf + makeWrapper + pkg-config + qemu + zstd + ] ++ (with perlPackages; [ perl libintl-perl GetoptLong ModuleBuild ]) + ++ (with ocamlPackages; [ ocaml findlib ]); + buildInputs = [ + libxcrypt + ncurses + jansson + pcre2 + augeas + libxml2 + acl + libcap + libcap_ng + libconfig + systemd + fuse + yajl + libvirt + gmp + readline + file + hivex + db + numactl + libapparmor + perlPackages.ModuleBuild + libtirpc + ] ++ (with ocamlPackages; [ ocamlbuild ocaml_libvirt gettext-stub ounit ]) + ++ lib.optional javaSupport jdk; + + prePatch = '' + # build-time scripts + substituteInPlace run.in --replace '#!/bin/bash' '#!${stdenv.shell}' + substituteInPlace ocaml-link.sh.in --replace '#!/bin/bash' '#!${stdenv.shell}' + + # $(OCAMLLIB) is read-only "${ocamlPackages.ocaml}/lib/ocaml" + substituteInPlace ocaml/Makefile.am --replace '$(DESTDIR)$(OCAMLLIB)' '$(out)/lib/ocaml' + substituteInPlace ocaml/Makefile.in --replace '$(DESTDIR)$(OCAMLLIB)' '$(out)/lib/ocaml' + + # some scripts hardcore /usr/bin/env which is not available in the build env + patchShebangs . + ''; + configureFlags = [ + "--disable-appliance" + "--disable-daemon" + "--with-distro=NixOS" + "--with-guestfs-path=${placeholder "out"}/lib/guestfs" + ] ++ lib.optionals (!javaSupport) [ "--without-java" ]; + patches = [ + ./libguestfs-syms.patch + ]; + + createFindlibDestdir = true; + + installFlags = [ "REALLY_INSTALL=yes" ]; + enableParallelBuilding = true; + + postInstall = '' + mv "$out/lib/ocaml/guestfs" "$OCAMLFIND_DESTDIR/guestfs" + for bin in $out/bin/*; do + wrapProgram "$bin" \ + --prefix PATH : "$out/bin:${hivex}/bin:${qemu}/bin" \ + --prefix PERL5LIB : "$out/${perlPackages.perl.libPrefix}" + done + ''; + + postFixup = lib.optionalString (appliance != null) '' + mkdir -p $out/{lib,lib64} + ln -s ${appliance} $out/lib64/guestfs + ln -s ${appliance} $out/lib/guestfs + ''; + + doInstallCheck = appliance != null; + installCheckPhase = '' + runHook preInstallCheck + + export HOME=$(mktemp -d) # avoid access to /homeless-shelter/.guestfish + + ${qemu}/bin/qemu-img create -f qcow2 disk1.img 10G + + $out/bin/guestfish <<'EOF' + add-drive disk1.img + run + list-filesystems + part-disk /dev/sda mbr + mkfs ext2 /dev/sda1 + list-filesystems + EOF + + runHook postInstallCheck + ''; + + meta = with lib; { + description = "Tools for accessing and modifying virtual machine disk images"; + license = with licenses; [ gpl2Plus lgpl21Plus ]; + homepage = "https://libguestfs.org/"; + maintainers = with maintainers; [ offline ]; + platforms = platforms.linux; + # this is to avoid "output size exceeded" + hydraPlatforms = if appliance != null then appliance.meta.hydraPlatforms else platforms.linux; + }; +} diff --git a/pkgs/by-name/li/libguestfs/libguestfs-syms.patch b/pkgs/by-name/li/libguestfs/libguestfs-syms.patch new file mode 100644 index 0000000..09c4b13 --- /dev/null +++ b/pkgs/by-name/li/libguestfs/libguestfs-syms.patch @@ -0,0 +1,13 @@ +diff --git a/lib/Makefile.am b/lib/Makefile.am +--- a/lib/Makefile.am ++++ b/lib/Makefile.am +@@ -168,8 +168,7 @@ libguestfs_la_LIBADD = \ + # Force libtool to name the library 'libguestfs.so.0.$(MAX_PROC_NR).0'. + # Include the version script to limit which symbols are exported. + libguestfs_la_LDFLAGS = \ +- -version-info $(MAX_PROC_NR):0:$(MAX_PROC_NR) \ +- $(VERSION_SCRIPT_FLAGS)$(srcdir)/libguestfs.syms ++ -version-info $(MAX_PROC_NR):0:$(MAX_PROC_NR) + + if HAVE_FUSE + # XXX Unfortunately FUSE_CFLAGS defines _FILE_OFFSET_BITS=64. diff --git a/pkgs/by-name/li/libguestfs/packages.nix b/pkgs/by-name/li/libguestfs/packages.nix new file mode 100644 index 0000000..ee8550e --- /dev/null +++ b/pkgs/by-name/li/libguestfs/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libguestfs-appliance = callPackage ./appliance.nix { }; + libguestfs = callPackage ./. { + autoreconfHook = buildPackages.autoreconfHook264; + ocamlPackages = ocaml-ng.ocamlPackages_4_14; + }; + libguestfs-with-appliance = libguestfs.override { + appliance = libguestfs-appliance; + autoreconfHook = buildPackages.autoreconfHook264; + }; +} diff --git a/pkgs/by-name/li/libheif/default.nix b/pkgs/by-name/li/libheif/default.nix new file mode 100644 index 0000000..cdff03f --- /dev/null +++ b/pkgs/by-name/li/libheif/default.nix @@ -0,0 +1,72 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, pkg-config +, dav1d +, rav1e +, libde265 +, x265 +, libpng +, libjpeg +, libaom +, gdk-pixbuf + +# for passthru.tests +, gimp +, imagemagick +, imlib2Full +, imv +, vips +}: + +stdenv.mkDerivation rec { + pname = "libheif"; + version = "1.17.6"; + + outputs = [ "bin" "out" "dev" "man" ]; + + src = fetchFromGitHub { + owner = "strukturag"; + repo = "libheif"; + rev = "v${version}"; + sha256 = "sha256-pp+PjV/pfExLqzFE61mxliOtVAYOePh1+i1pwZxDLAM="; + }; + + nativeBuildInputs = [ + pkg-config + cmake + ]; + + buildInputs = [ + dav1d + rav1e + libde265 + x265 + libpng + libjpeg + libaom + gdk-pixbuf + ]; + + # Fix installation path for gdk-pixbuf module + PKG_CONFIG_GDK_PIXBUF_2_0_GDK_PIXBUF_MODULEDIR = "${placeholder "out"}/${gdk-pixbuf.moduleDir}"; + + # Wrong include path in .cmake. It's a bit difficult to patch because of special characters. + postFixup = '' + sed '/^ INTERFACE_INCLUDE_DIRECTORIES/s|"[^"]*/include"|"${placeholder "dev"}/include"|' \ + -i "$dev"/lib/cmake/libheif/libheif-config.cmake + ''; + + passthru.tests = { + inherit gimp imagemagick imlib2Full imv vips; + }; + + meta = { + homepage = "http://www.libheif.org/"; + description = "ISO/IEC 23008-12:2017 HEIF image file format decoder and encoder"; + license = lib.licenses.lgpl3Plus; + platforms = lib.platforms.unix; + maintainers = with lib.maintainers; [ gebner ]; + }; +} diff --git a/pkgs/by-name/li/libical/default.nix b/pkgs/by-name/li/libical/default.nix new file mode 100644 index 0000000..9cfe47f --- /dev/null +++ b/pkgs/by-name/li/libical/default.nix @@ -0,0 +1,112 @@ +{ lib +, stdenv +, fetchFromGitHub +, pkgsBuildBuild +, pkgsBuildHost +, cmake +, glib +, icu +, libxml2 +, ninja +, perl +, pkg-config +, libical +, python3 +, tzdata +, fixDarwinDylibNames +, withIntrospection ? stdenv.hostPlatform.emulatorAvailable pkgsBuildHost +, gobject-introspection +, vala +}: + +stdenv.mkDerivation rec { + pname = "libical"; + version = "3.0.18"; + + outputs = [ "out" "dev" ]; # "devdoc" ]; + + src = fetchFromGitHub { + owner = "libical"; + repo = "libical"; + rev = "v${version}"; + sha256 = "sha256-32FNnCybXO67Vtg1LM6miJUaK+r0mlfjxgLQg1LD8Es="; + }; + + strictDeps = true; + + depsBuildBuild = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # provides ical-glib-src-generator that runs during build + libical + ]; + + nativeBuildInputs = [ + cmake + ninja + perl + pkg-config + ] ++ lib.optionals withIntrospection [ + gobject-introspection + vala + # Docs building fails: + # https://github.com/NixOS/nixpkgs/pull/67204 + # previously with https://github.com/NixOS/nixpkgs/pull/61657#issuecomment-495579489 + # gtk-doc docbook_xsl docbook_xml_dtd_43 # for docs + ] ++ lib.optionals stdenv.isDarwin [ + fixDarwinDylibNames + ]; + nativeInstallCheckInputs = [ + # running libical-glib tests + (python3.pythonOnBuildForHost.withPackages (pkgs: with pkgs; [ + pygobject3 + ])) + ]; + + buildInputs = [ + glib + libxml2 + icu + ]; + + cmakeFlags = [ + "-DENABLE_GTK_DOC=False" + "-DGOBJECT_INTROSPECTION=${if withIntrospection then "True" else "False"}" + "-DICAL_GLIB_VAPI=${if withIntrospection then "True" else "False"}" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "-DIMPORT_ICAL_GLIB_SRC_GENERATOR=${lib.getDev pkgsBuildBuild.libical}/lib/cmake/LibIcal/IcalGlibSrcGenerator.cmake" + ]; + + patches = [ + # Will appear in 3.1.0 + # https://github.com/libical/libical/issues/350 + ./respect-env-tzdir.patch + ]; + + # Using install check so we do not have to manually set + # LD_LIBRARY_PATH and GI_TYPELIB_PATH variables + # Musl does not support TZDIR. + doInstallCheck = !stdenv.hostPlatform.isMusl; + enableParallelChecking = false; + preInstallCheck = if stdenv.isDarwin then '' + for testexe in $(find ./src/test -maxdepth 1 -type f -executable); do + for lib in $(cd lib && ls *.3.dylib); do + install_name_tool -change $lib $out/lib/$lib $testexe + done + done + '' else null; + installCheckPhase = '' + runHook preInstallCheck + + export TZDIR=${tzdata}/share/zoneinfo + ctest --output-on-failure + + runHook postInstallCheck + ''; + + meta = with lib; { + homepage = "https://github.com/libical/libical"; + description = "An Open Source implementation of the iCalendar protocols"; + changelog = "https://github.com/libical/libical/raw/v${version}/ReleaseNotes.txt"; + license = licenses.mpl20; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/li/libical/respect-env-tzdir.patch b/pkgs/by-name/li/libical/respect-env-tzdir.patch new file mode 100644 index 0000000..59d23e4 --- /dev/null +++ b/pkgs/by-name/li/libical/respect-env-tzdir.patch @@ -0,0 +1,29 @@ +--- a/src/libical/icaltz-util.c ++++ b/src/libical/icaltz-util.c +@@ -94,9 +94,9 @@ + static const char *zdir = NULL; + + static const char *search_paths[] = { ++ "/etc/zoneinfo", + "/usr/share/zoneinfo", + "/usr/lib/zoneinfo", +- "/etc/zoneinfo", + "/usr/share/lib/zoneinfo" + }; + +@@ -178,6 +178,15 @@ + const char *fname = ZONES_TAB_SYSTEM_FILENAME; + size_t i, num_search_paths; + ++ const char *env_tzdir = getenv ("TZDIR"); ++ if (env_tzdir) { ++ sprintf (file_path, "%s/%s", env_tzdir, fname); ++ if (!access (file_path, F_OK|R_OK)) { ++ zdir = env_tzdir; ++ return; ++ } ++ } ++ + num_search_paths = sizeof(search_paths) / sizeof(search_paths[0]); + for (i = 0; i < num_search_paths; i++) { + snprintf(file_path, MAXPATHLEN, "%s/%s", search_paths[i], fname); diff --git a/pkgs/by-name/li/libiconv/default.nix b/pkgs/by-name/li/libiconv/default.nix new file mode 100644 index 0000000..ed162d1 --- /dev/null +++ b/pkgs/by-name/li/libiconv/default.nix @@ -0,0 +1,88 @@ +{ fetchurl, stdenv, lib +, enableStatic ? stdenv.hostPlatform.isStatic +, enableShared ? !stdenv.hostPlatform.isStatic +, enableDarwinABICompat ? false +}: + +# assert !stdenv.hostPlatform.isLinux || stdenv.hostPlatform != stdenv.buildPlatform; # TODO: improve on cross + +stdenv.mkDerivation rec { + pname = "libiconv"; + version = "1.17"; + + src = fetchurl { + url = "mirror://gnu/libiconv/${pname}-${version}.tar.gz"; + sha256 = "sha256-j3QhO1YjjIWlClMp934GGYdx5w3Zpzl3n0wC9l2XExM="; + }; + + enableParallelBuilding = true; + + setupHooks = [ + ../../../build-support/setup-hooks/role.bash + ./setup-hook.sh + ]; + + postPatch = + lib.optionalString ((stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.isMinGW) || stdenv.cc.nativeLibc) + '' + sed '/^_GL_WARN_ON_USE (gets/d' -i srclib/stdio.in.h + '' + + lib.optionalString (!enableShared) '' + sed -i -e '/preload/d' Makefile.in + '' + # The system libiconv is based on libiconv 1.11 with some ABI differences. The following changes + # build a compatible libiconv on Darwin, allowing it to be sustituted in place of the system one + # using `install_name_tool`. This removes the need to for a separate, Darwin-specific libiconv + # derivation and allows Darwin to benefit from upstream updates and fixes. + + lib.optionalString enableDarwinABICompat '' + for iconv_h_in in iconv.h.in iconv.h.build.in; do + substituteInPlace "include/$iconv_h_in" \ + --replace-fail "#define iconv libiconv" "" \ + --replace-fail "#define iconv_close libiconv_close" "" \ + --replace-fail "#define iconv_open libiconv_open" "" \ + --replace-fail "#define iconv_open_into libiconv_open_into" "" \ + --replace-fail "#define iconvctl libiconvctl" "" \ + --replace-fail "#define iconvlist libiconvlist" "" + done + ''; + + # This is hacky, but `libiconv.dylib` needs to reexport `libcharset.dylib` to match the behavior + # of the system libiconv on Darwin. Trying to do this by modifying the `Makefile` results in an + # error linking `iconv` because `libcharset.dylib` is not at its final path yet. Avoid the error + # by building without the reexport then clean and rebuild `libiconv.dylib` with the reexport. + # + # For an explanation why `libcharset.dylib` is reexported, see: + # https://github.com/apple-oss-distributions/libiconv/blob/a167071feb7a83a01b27ec8d238590c14eb6faff/xcodeconfig/libiconv.xcconfig + postBuild = lib.optionalString enableDarwinABICompat '' + make clean -C lib + NIX_CFLAGS_COMPILE+=" -Wl,-reexport-lcharset -L. " make -C lib -j$NIX_BUILD_CORES SHELL=$SHELL + ''; + + configureFlags = [ + (lib.enableFeature enableStatic "static") + (lib.enableFeature enableShared "shared") + ] ++ lib.optional stdenv.isFreeBSD "--with-pic"; + + meta = { + description = "An iconv(3) implementation"; + + longDescription = '' + Some programs, like mailers and web browsers, must be able to convert + between a given text encoding and the user's encoding. Other programs + internally store strings in Unicode, to facilitate internal processing, + and need to convert between internal string representation (Unicode) + and external string representation (a traditional encoding) when they + are doing I/O. GNU libiconv is a conversion library for both kinds of + applications. + ''; + + homepage = "https://www.gnu.org/software/libiconv/"; + license = lib.licenses.lgpl2Plus; + + maintainers = [ ]; + mainProgram = "iconv"; + + # This library is not needed on GNU platforms. + hydraPlatforms = with lib.platforms; cygwin ++ darwin ++ freebsd; + }; +} diff --git a/pkgs/by-name/li/libiconv/packages.nix b/pkgs/by-name/li/libiconv/packages.nix new file mode 100644 index 0000000..a9e7355 --- /dev/null +++ b/pkgs/by-name/li/libiconv/packages.nix @@ -0,0 +1,43 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # GNU libc provides libiconv so systems with glibc don't need to + # build libiconv separately. Additionally, Apple forked/repackaged + # libiconv so we use that instead of the vanilla version on that OS, + # and BSDs include libiconv in libc. + # + # We also provide `libiconvReal`, which will always be a standalone libiconv, + # just in case you want it regardless of platform. + libiconv = + if lib.elem stdenv.hostPlatform.libc [ "glibc" "musl" "nblibc" "wasilibc" ] + then + libcIconv + (if stdenv.hostPlatform != stdenv.buildPlatform + then libcCross + else stdenv.cc.libc) + # else if stdenv.hostPlatform.isDarwin + # then darwin.libiconv + else libiconvReal; + + libcIconv = libc: + let + inherit (libc) pname version; + libcDev = lib.getDev libc; + in + runCommand "${pname}-iconv-${version}" { strictDeps = true; } '' + mkdir -p $out/include + ln -sv ${libcDev}/include/iconv.h $out/include + ''; + + libiconvReal = callPackage ./. { }; + + iconv = + if lib.elem stdenv.hostPlatform.libc [ "glibc" "musl" ] then + lib.getBin stdenv.cc.libc + else if stdenv.hostPlatform.isDarwin then + lib.getBin darwin.libiconv + else + lib.getBin libiconvReal; +} diff --git a/pkgs/by-name/li/libiconv/setup-hook.sh b/pkgs/by-name/li/libiconv/setup-hook.sh new file mode 100644 index 0000000..3d9656f --- /dev/null +++ b/pkgs/by-name/li/libiconv/setup-hook.sh @@ -0,0 +1,8 @@ +# libiconv must be listed in load flags on non-Glibc +# it doesn't hurt to have it in Glibc either though + +# See pkgs/build-support/setup-hooks/role.bash +if [ -z "${dontAddExtraLibs-}" ]; then + getHostRole + export NIX_LDFLAGS${role_post}+=" -liconv" +fi diff --git a/pkgs/by-name/li/libid3tag/CVE-2017-11550-and-CVE-2017-11551.patch b/pkgs/by-name/li/libid3tag/CVE-2017-11550-and-CVE-2017-11551.patch new file mode 100644 index 0000000..b1f9d09 --- /dev/null +++ b/pkgs/by-name/li/libid3tag/CVE-2017-11550-and-CVE-2017-11551.patch @@ -0,0 +1,13 @@ +Common subdirectories: libid3tag-0.15.1b/msvc++ and libid3tag-0.15.1b-patched/msvc++ +diff -uwp libid3tag-0.15.1b/utf16.c libid3tag-0.15.1b-patched/utf16.c +--- libid3tag-0.15.1b/utf16.c 2004-01-23 10:41:32.000000000 +0100 ++++ libid3tag-0.15.1b-patched/utf16.c 2018-11-01 13:12:00.866050641 +0100 +@@ -250,6 +250,8 @@ id3_ucs4_t *id3_utf16_deserialize(id3_by + id3_ucs4_t *ucs4; + + end = *ptr + (length & ~1); ++ if (end == *ptr) ++ return 0; + + utf16 = malloc((length / 2 + 1) * sizeof(*utf16)); + if (utf16 == 0) diff --git a/pkgs/by-name/li/libid3tag/debian-patches.patch b/pkgs/by-name/li/libid3tag/debian-patches.patch new file mode 100644 index 0000000..0a828b3 --- /dev/null +++ b/pkgs/by-name/li/libid3tag/debian-patches.patch @@ -0,0 +1,89 @@ +diff --git a/compat.gperf b/compat.gperf +index 4e24613..5635980 100644 +--- a/compat.gperf ++++ b/compat.gperf +@@ -236,6 +236,10 @@ int id3_compat_fixup(struct id3_tag *tag) + + encoding = id3_parse_uint(&data, 1); + string = id3_parse_string(&data, end - data, encoding, 0); ++ if (!string) ++ { ++ continue; ++ } + + if (id3_ucs4_length(string) < 4) { + free(string); +diff --git a/genre.dat b/genre.dat +index 17acab5..1f02779 100644 +--- a/genre.dat ++++ b/genre.dat +@@ -277,8 +277,8 @@ static id3_ucs4_t const genre_PUNK_ROCK[] = + { 'P', 'u', 'n', 'k', ' ', 'R', 'o', 'c', 'k', 0 }; + static id3_ucs4_t const genre_DRUM_SOLO[] = + { 'D', 'r', 'u', 'm', ' ', 'S', 'o', 'l', 'o', 0 }; +-static id3_ucs4_t const genre_A_CAPPELLA[] = +- { 'A', ' ', 'C', 'a', 'p', 'p', 'e', 'l', 'l', 'a', 0 }; ++static id3_ucs4_t const genre_A_CAPELLA[] = ++ { 'A', ' ', 'C', 'a', 'p', 'e', 'l', 'l', 'a', 0 }; + static id3_ucs4_t const genre_EURO_HOUSE[] = + { 'E', 'u', 'r', 'o', '-', 'H', 'o', 'u', 's', 'e', 0 }; + static id3_ucs4_t const genre_DANCE_HALL[] = +@@ -452,7 +452,7 @@ static id3_ucs4_t const *const genre_table[] = { + genre_DUET, + genre_PUNK_ROCK, + genre_DRUM_SOLO, +- genre_A_CAPPELLA, ++ genre_A_CAPELLA, + genre_EURO_HOUSE, + genre_DANCE_HALL, + genre_GOA, +diff --git a/genre.dat.in b/genre.dat.in +index 872de40..e71e34b 100644 +--- a/genre.dat.in ++++ b/genre.dat.in +@@ -153,7 +153,7 @@ Freestyle + Duet + Punk Rock + Drum Solo +-A Cappella ++A Capella + Euro-House + Dance Hall + Goa +diff --git a/parse.c b/parse.c +index 86a3f21..947c249 100644 +--- a/parse.c ++++ b/parse.c +@@ -165,6 +165,9 @@ id3_ucs4_t *id3_parse_string(id3_byte_t const **ptr, id3_length_t length, + case ID3_FIELD_TEXTENCODING_UTF_8: + ucs4 = id3_utf8_deserialize(ptr, length); + break; ++ default: ++ /* FIXME: Unknown encoding! Print warning? */ ++ return NULL; + } + + if (ucs4 && !full) { +diff --git a/utf16.c b/utf16.c +index 70ee9d5..6e60a75 100644 +--- a/utf16.c ++++ b/utf16.c +@@ -282,5 +282,18 @@ id3_ucs4_t *id3_utf16_deserialize(id3_byte_t const **ptr, id3_length_t length, + + free(utf16); + ++ if (end == *ptr && length % 2 != 0) ++ { ++ /* We were called with a bogus length. It should always ++ * be an even number. We can deal with this in a few ways: ++ * - Always give an error. ++ * - Try and parse as much as we can and ++ * - return an error if we're called again when we ++ * already tried to parse everything we can. ++ * - tell that we parsed it, which is what we do here. ++ */ ++ (*ptr)++; ++ } ++ + return ucs4; + } \ No newline at end of file diff --git a/pkgs/by-name/li/libid3tag/default.nix b/pkgs/by-name/li/libid3tag/default.nix new file mode 100644 index 0000000..c8c9d8b --- /dev/null +++ b/pkgs/by-name/li/libid3tag/default.nix @@ -0,0 +1,48 @@ +{ lib, stdenv, fetchurl, zlib, gperf_3_0 }: + +stdenv.mkDerivation rec { + pname = "libid3tag"; + version = "0.15.1b"; + + src = fetchurl { + url = "mirror://sourceforge/mad/libid3tag-${version}.tar.gz"; + sha256 = "63da4f6e7997278f8a3fef4c6a372d342f705051d1eeb6a46a86b03610e26151"; + }; + + outputs = [ "out" "dev" ]; + setOutputFlags = false; + + strictDeps = true; + + nativeBuildInputs = [ gperf_3_0 ]; + + buildInputs = [ zlib ]; + + patches = [ + ./debian-patches.patch + ./CVE-2017-11550-and-CVE-2017-11551.patch + ]; + + preConfigure = '' + configureFlagsArray+=( + --includedir=$dev/include + ) + ''; + + postInstall = '' + mkdir -p $dev/lib/pkgconfig + cp ${./id3tag.pc} $dev/lib/pkgconfig/id3tag.pc + substituteInPlace $dev/lib/pkgconfig/id3tag.pc \ + --subst-var-by out $out \ + --subst-var-by dev $dev \ + --subst-var-by version "${version}" + ''; + + meta = with lib; { + description = "ID3 tag manipulation library"; + homepage = "https://mad.sourceforge.net/"; + license = licenses.gpl2; + maintainers = [ ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/li/libid3tag/id3tag.pc b/pkgs/by-name/li/libid3tag/id3tag.pc new file mode 100644 index 0000000..e3df7b3 --- /dev/null +++ b/pkgs/by-name/li/libid3tag/id3tag.pc @@ -0,0 +1,11 @@ +prefix=@out@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=@dev@/include + +Name: libid3tag +Description: ID3 tag manipulation library +Version: @version@ + +Libs: -L${libdir} -lid3tag +Cflags: -I${includedir} diff --git a/pkgs/by-name/li/libidn2/default.nix b/pkgs/by-name/li/libidn2/default.nix new file mode 100644 index 0000000..bfe9c2a --- /dev/null +++ b/pkgs/by-name/li/libidn2/default.nix @@ -0,0 +1,47 @@ +{ fetchurl, lib, stdenv, libiconv, libunistring, help2man, texinfo, buildPackages }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "libidn2"; + version = "2.3.7"; + + src = fetchurl { + url = "https://ftp.gnu.org/gnu/libidn/${pname}-${version}.tar.gz"; + hash = "sha256-TCGnkbYQuVGbnQ4SuAl78vNZsS+N2SZHYRqSnmv9fWQ="; + }; + + strictDeps = true; + # Beware: non-bootstrap libidn2 is overridden by ./hack.nix + outputs = [ "bin" "dev" "out" "info" "devdoc" ]; + + enableParallelBuilding = true; + + # The above patch causes the documentation to be regenerated, so the + # documentation tools are required. + nativeBuildInputs = lib.optionals stdenv.isDarwin [ help2man texinfo ]; + buildInputs = [ libunistring ] ++ lib.optional stdenv.isDarwin libiconv; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + meta = { + homepage = "https://www.gnu.org/software/libidn/#libidn2"; + description = "Free software implementation of IDNA2008 and TR46"; + + longDescription = '' + Libidn2 is believed to be a complete IDNA2008 and TR46 implementation, + but has yet to be as extensively used as the IDNA2003 Libidn library. + + The installed C library libidn2 is dual-licensed under LGPLv3+|GPLv2+, + while the rest of the package is GPLv3+. See the file COPYING for + detailed information. + ''; + + mainProgram = "idn2"; + license = with lib.licenses; [ lgpl3Plus gpl2Plus gpl3Plus ]; + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ fpletz ]; + }; +} diff --git a/pkgs/by-name/li/libidn2/no-bootstrap-reference.nix b/pkgs/by-name/li/libidn2/no-bootstrap-reference.nix new file mode 100644 index 0000000..216beb5 --- /dev/null +++ b/pkgs/by-name/li/libidn2/no-bootstrap-reference.nix @@ -0,0 +1,31 @@ +{ stdenv, lib, libidn2, libunistring, runCommandLocal, patchelf }: +# Construct a copy of libidn2.* where all (transitive) libc references (in .bin) +# get replaced by a new one, so that there's no reference to bootstrap tools. +runCommandLocal + "${libidn2.pname}-${libidn2.version}" + { + outputs = [ "bin" "dev" "out" ]; + passthru = { + inherit (libidn2) out info devdoc; # no need to touch these store paths + }; + inherit (libidn2) meta; + } + '' + cp -r '${libidn2.bin}' "$bin" + chmod +w "$bin"/bin/* + patchelf \ + --set-interpreter '${stdenv.cc.bintools.dynamicLinker}' \ + --set-rpath '${lib.concatMapStringsSep ":" (p: lib.getLib p + "/lib") + [ stdenv.cc.libc libunistring libidn2 ]}' \ + "$bin"/bin/* + + cp -r '${libidn2.dev}' "$dev" + chmod +w "$dev"/nix-support/propagated-build-inputs + substituteInPlace "$dev"/nix-support/propagated-build-inputs \ + --replace '${libidn2.bin}' "$bin" + substituteInPlace "$dev"/lib/pkgconfig/libidn2.pc \ + --replace '${libidn2.dev}' "$dev" + + ln -s '${libidn2.out}' "$out" # it's hard to be without any $out + '' + diff --git a/pkgs/by-name/li/libipt/default.nix b/pkgs/by-name/li/libipt/default.nix new file mode 100644 index 0000000..ed88ed8 --- /dev/null +++ b/pkgs/by-name/li/libipt/default.nix @@ -0,0 +1,23 @@ +{ lib, stdenv, fetchFromGitHub, cmake }: + +stdenv.mkDerivation rec { + pname = "libipt"; + version = "2.1.1"; + + src = fetchFromGitHub { + owner = "intel"; + repo = "libipt"; + rev = "v${version}"; + sha256 = "sha256-tyOheitSlccf/n3mklGL2oAKLBKYT60LSLre9/G/b9Q="; + }; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + description = "Intel Processor Trace decoder library"; + homepage = "https://github.com/intel/libipt"; + license = licenses.bsd3; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej ]; + }; +} diff --git a/pkgs/by-name/li/libjpeg-turbo/0001-Compile-transupp.c-as-part-of-the-library.patch b/pkgs/by-name/li/libjpeg-turbo/0001-Compile-transupp.c-as-part-of-the-library.patch new file mode 100644 index 0000000..7753150 --- /dev/null +++ b/pkgs/by-name/li/libjpeg-turbo/0001-Compile-transupp.c-as-part-of-the-library.patch @@ -0,0 +1,34 @@ +From 6442d11617f95d13e2a371bd3e01f5082a9c356d Mon Sep 17 00:00:00 2001 +From: Las +Date: Sun, 3 Jan 2021 18:35:37 +0000 +Subject: [PATCH] Compile transupp.c as part of the library + +--- + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index adb0ca45..46fc16dd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -581,7 +581,7 @@ set(JPEG_SOURCES ${JPEG12_SOURCES} jcapimin.c jchuff.c jcicc.c jcinit.c + jclhuff.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c jctrans.c + jdapimin.c jdatadst.c jdatasrc.c jdhuff.c jdicc.c jdinput.c jdlhuff.c + jdmarker.c jdmaster.c jdphuff.c jdtrans.c jerror.c jfdctflt.c jmemmgr.c +- jmemnobs.c jpeg_nbits.c) ++ jmemnobs.c jpeg_nbits.c transupp.c) + + if(WITH_ARITH_ENC OR WITH_ARITH_DEC) + set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c) +@@ -1803,7 +1803,7 @@ install(EXPORT ${CMAKE_PROJECT_NAME}Targets + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h + ${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h +- ${CMAKE_CURRENT_SOURCE_DIR}/jpeglib.h ++ ${CMAKE_CURRENT_SOURCE_DIR}/jpeglib.h ${CMAKE_CURRENT_SOURCE_DIR}/transupp.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + + include(cmakescripts/BuildPackages.cmake) +-- +2.43.0 + diff --git a/pkgs/by-name/li/libjpeg-turbo/0002-Make-exported-symbols-in-transupp.c-weak.patch b/pkgs/by-name/li/libjpeg-turbo/0002-Make-exported-symbols-in-transupp.c-weak.patch new file mode 100644 index 0000000..fc23b77 --- /dev/null +++ b/pkgs/by-name/li/libjpeg-turbo/0002-Make-exported-symbols-in-transupp.c-weak.patch @@ -0,0 +1,81 @@ +From 6442d11617f95d13e2a371bd3e01f5082a9c356d Mon Sep 17 00:00:00 2001 +From: Las +Date: Sun, 3 Jan 2021 18:35:37 +0000 +Subject: [PATCH] Make exported symbols in transupp.c weak + +The exported symbols are made weak to not conflict with users +of the library that already vendor this functionality. +--- + transupp.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/transupp.c b/transupp.c +index 34fbb371..c0ade5a9 100644 +--- a/transupp.c ++++ b/transupp.c +@@ -1388,7 +1388,7 @@ jt_read_integer(const char **strptr, JDIMENSION *result) + * This code is loosely based on XParseGeometry from the X11 distribution. + */ + +-GLOBAL(boolean) ++GLOBAL(boolean) __attribute__((weak)) + jtransform_parse_crop_spec(jpeg_transform_info *info, const char *spec) + { + info->crop = FALSE; +@@ -1488,7 +1488,7 @@ trim_bottom_edge(jpeg_transform_info *info, JDIMENSION full_height) + * and transformation is not perfect. Otherwise returns TRUE. + */ + +-GLOBAL(boolean) ++GLOBAL(boolean) __attribute__((weak)) + jtransform_request_workspace(j_decompress_ptr srcinfo, + jpeg_transform_info *info) + { +@@ -2035,7 +2035,7 @@ adjust_exif_parameters(JOCTET *data, unsigned int length, JDIMENSION new_width, + * to jpeg_write_coefficients(). + */ + +-GLOBAL(jvirt_barray_ptr *) ++GLOBAL(jvirt_barray_ptr *) __attribute__((weak)) + jtransform_adjust_parameters(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info) +@@ -2154,7 +2154,7 @@ jtransform_adjust_parameters(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + * Note that some transformations will modify the source data arrays! + */ + +-GLOBAL(void) ++GLOBAL(void) __attribute__((weak)) + jtransform_execute_transform(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info) +@@ -2266,7 +2266,7 @@ jtransform_execute_transform(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + * (may use custom action then) + */ + +-GLOBAL(boolean) ++GLOBAL(boolean) __attribute__((weak)) + jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height, + int MCU_width, int MCU_height, + JXFORM_CODE transform) +@@ -2305,7 +2305,7 @@ jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height, + * This must be called before jpeg_read_header() to have the desired effect. + */ + +-GLOBAL(void) ++GLOBAL(void) __attribute__((weak)) + jcopy_markers_setup(j_decompress_ptr srcinfo, JCOPY_OPTION option) + { + #ifdef SAVE_MARKERS_SUPPORTED +@@ -2337,7 +2337,7 @@ jcopy_markers_setup(j_decompress_ptr srcinfo, JCOPY_OPTION option) + * JFIF APP0 or Adobe APP14 markers if selected. + */ + +-GLOBAL(void) ++GLOBAL(void) __attribute__((weak)) + jcopy_markers_execute(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JCOPY_OPTION option) + { +-- +2.43.0 + diff --git a/pkgs/by-name/li/libjpeg-turbo/default.nix b/pkgs/by-name/li/libjpeg-turbo/default.nix new file mode 100644 index 0000000..4a5b478 --- /dev/null +++ b/pkgs/by-name/li/libjpeg-turbo/default.nix @@ -0,0 +1,117 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, cmake +, nasm +, openjdk +, enableJava ? false # whether to build the java wrapper +, enableJpeg7 ? false # whether to build libjpeg with v7 compatibility +, enableJpeg8 ? false # whether to build libjpeg with v8 compatibility +, enableStatic ? stdenv.hostPlatform.isStatic +, enableShared ? !stdenv.hostPlatform.isStatic + +# for passthru.tests +# , dvgrab +# , epeg +# , freeimage +# , gd +# , graphicsmagick +# , imagemagick +# , imlib2 +# , jhead +# , libjxl +# , mjpegtools +# , opencv +# , python3 +# , vips +# , testers +}: + +assert !(enableJpeg7 && enableJpeg8); # pick only one or none, not both + +stdenv.mkDerivation (finalAttrs: { + + pname = "libjpeg-turbo"; + version = "3.0.2"; + + src = fetchFromGitHub { + owner = "libjpeg-turbo"; + repo = "libjpeg-turbo"; + rev = finalAttrs.version; + hash = "sha256-xHjd0WHN50b75wdWPHUwfmJGsiWKmj+zA59UwakIo74="; + }; + + patches = [ + (fetchpatch { + name = "CMAKE_CROSSCOMPILING_EMULATOR=env-fix.patch"; + url = "https://github.com/libjpeg-turbo/libjpeg-turbo/compare/36c51dd3eb60ebde3ca77d3cfa7df3422f1aaaf1..b6ee1016abbc55116304ad396cf88aa19391e10a.patch"; + hash = "sha256-dNwXicvZEsG02TBaM5nYMlZ+VczT/Dfx6ZM/6huZpwE="; + }) + + # This is needed by freeimage + ./0001-Compile-transupp.c-as-part-of-the-library.patch + ] ++ lib.optionals (!stdenv.hostPlatform.isMinGW) [ + ./0002-Make-exported-symbols-in-transupp.c-weak.patch + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ + ./mingw-boolean.patch + ]; + + outputs = [ "bin" "dev" "dev_private" "out" "man" "doc" ]; + + postFixup = '' + moveToOutput include/transupp.h $dev_private + ''; + + nativeBuildInputs = [ + cmake + nasm + ] ++ lib.optionals enableJava [ + openjdk + ]; + + cmakeFlags = [ + "-DENABLE_STATIC=${if enableStatic then "1" else "0"}" + "-DENABLE_SHARED=${if enableShared then "1" else "0"}" + ] ++ lib.optionals enableJava [ + "-DWITH_JAVA=1" + ] ++ lib.optionals enableJpeg7 [ + "-DWITH_JPEG7=1" + ] ++ lib.optionals enableJpeg8 [ + "-DWITH_JPEG8=1" + ] ++ lib.optionals stdenv.hostPlatform.isRiscV [ + # https://github.com/libjpeg-turbo/libjpeg-turbo/issues/428 + # https://github.com/libjpeg-turbo/libjpeg-turbo/commit/88bf1d16786c74f76f2e4f6ec2873d092f577c75 + "-DFLOATTEST=fp-contract" + ]; + + doInstallCheck = true; + installCheckTarget = "test"; + + # passthru.tests = { + # inherit + # dvgrab + # epeg + # freeimage + # gd + # graphicsmagick + # imagemagick + # imlib2 + # jhead + # libjxl + # mjpegtools + # opencv + # vips; + # inherit (python3.pkgs) pillow imread pyturbojpeg; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # }; + + meta = with lib; { + homepage = "https://libjpeg-turbo.org/"; + description = "A faster (using SIMD) libjpeg implementation"; + license = licenses.ijg; # and some parts under other BSD-style licenses + pkgConfigModules = [ "libjpeg" "libturbojpeg" ]; + maintainers = with maintainers; [ vcunat colemickens kamadorueda ]; + platforms = platforms.all; + }; +}) diff --git a/pkgs/by-name/li/libjpeg-turbo/mingw-boolean.patch b/pkgs/by-name/li/libjpeg-turbo/mingw-boolean.patch new file mode 100644 index 0000000..9b9483d --- /dev/null +++ b/pkgs/by-name/li/libjpeg-turbo/mingw-boolean.patch @@ -0,0 +1,19 @@ +Ported to updated libjpeg-turbo from +https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-libjpeg-turbo/jpeg-typedefs.patch +--- a/jmorecfg.h 2012-02-10 06:47:55 +0300 ++++ b/jmorecfg.h 2012-05-03 10:29:13 +0400 +@@ -224,7 +224,13 @@ + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +-#ifndef HAVE_BOOLEAN ++#if defined(_WIN32) && !defined(HAVE_BOOLEAN) ++#ifndef __RPCNDR_H__ ++typedef unsigned char boolean; ++#endif ++#define HAVE_BOOLEAN ++#endif ++#if !defined(HAVE_BOOLEAN) && !defined(__RPCNDR_H__) + typedef int boolean; + #endif + #ifndef FALSE /* in case these macros already exist */ diff --git a/pkgs/by-name/li/libjpeg-turbo/packages.nix b/pkgs/by-name/li/libjpeg-turbo/packages.nix new file mode 100644 index 0000000..c998453 --- /dev/null +++ b/pkgs/by-name/li/libjpeg-turbo/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # also known as libturbojpeg + libjpeg_turbo = callPackage ./. { }; + libjpeg = libjpeg_turbo; + libjpeg8 = libjpeg_turbo.override { enableJpeg8 = true; }; +} diff --git a/pkgs/by-name/li/libjpeg/default.nix b/pkgs/by-name/li/libjpeg/default.nix new file mode 100644 index 0000000..d161ff3 --- /dev/null +++ b/pkgs/by-name/li/libjpeg/default.nix @@ -0,0 +1,29 @@ +{ lib, stdenv, fetchurl +, testers +, static ? false +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libjpeg"; + version = "9f"; + + src = fetchurl { + url = "http://www.ijg.org/files/jpegsrc.v${finalAttrs.version}.tar.gz"; + sha256 = "sha256-BHBcEQyyRpyqeftx+6PXv4NJFHBulkGkWJSFwfgyVls="; + }; + + configureFlags = lib.optional static "--enable-static --disable-shared"; + + outputs = [ "bin" "dev" "out" "man" ]; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "https://www.ijg.org/"; + description = "A library that implements the JPEG image file format"; + maintainers = with maintainers; [ ]; + license = licenses.free; + pkgConfigModules = [ "libjpeg" ]; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/li/libjpeg/packages.nix b/pkgs/by-name/li/libjpeg/packages.nix new file mode 100644 index 0000000..fdb1200 --- /dev/null +++ b/pkgs/by-name/li/libjpeg/packages.nix @@ -0,0 +1,8 @@ + +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libjpeg_original = callPackage ./. { }; +} diff --git a/pkgs/by-name/li/libjxl/default.nix b/pkgs/by-name/li/libjxl/default.nix new file mode 100644 index 0000000..c91ae27 --- /dev/null +++ b/pkgs/by-name/li/libjxl/default.nix @@ -0,0 +1,148 @@ +{ stdenv, lib, fetchFromGitHub +, brotli +, cmake +, giflib +, gperftools +, gtest +, libhwy +, libjpeg +, libpng +, libwebp +, gdk-pixbuf +, openexr_3 +, pkg-config +, makeWrapper +, zlib +, asciidoc +, graphviz +, doxygen +, python3 +, lcms2 +, enablePlugins ? stdenv.buildPlatform.canExecute stdenv.hostPlatform +}: + +let + loadersPath = "${gdk-pixbuf.binaryDir}/jxl-loaders.cache"; +in + +stdenv.mkDerivation rec { + pname = "libjxl"; + version = "0.9.1"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "libjxl"; + repo = "libjxl"; + rev = "v${version}"; + hash = "sha256-n5KNbbw6NQRROEM7Cojla/igRCFNawUq7nfhzJlMlPI="; + # There are various submodules in `third_party/`. + fetchSubmodules = true; + }; + + strictDeps = true; + + nativeBuildInputs = [ + cmake + pkg-config + gdk-pixbuf + makeWrapper + asciidoc + doxygen + python3 + ]; + + depsBuildBuild = [ + graphviz + ]; + + # Functionality not currently provided by this package + # that the cmake build can apparently use: + # OpenGL/GLUT (for Examples -> comparison with sjpeg) + # viewer (see `cmakeFlags`) + # plugins like for GDK and GIMP (see `cmakeFlags`) + + # Vendored libraries: + # `libjxl` currently vendors many libraries as git submodules that they + # might patch often (e.g. test/gmock, see + # https://github.com/NixOS/nixpkgs/pull/103160#discussion_r519487734). + # When it has stabilised in the future, we may want to tell the build + # to use use nixpkgs system libraries. + + # As of writing, libjxl does not point out all its dependencies + # conclusively in its README or otherwise; they can best be determined + # by checking the CMake output for "Could NOT find". + buildInputs = [ + lcms2 + giflib + gperftools # provides `libtcmalloc` + gtest + libjpeg + libpng + libwebp + gdk-pixbuf + openexr_3 + zlib + ]; + + propagatedBuildInputs = [ + brotli + libhwy + ]; + + cmakeFlags = [ + # For C dependencies like brotli, which are dynamically linked, + # we want to use the system libraries, so that we don't have to care about + # installing their .so files generated by this build. + # The other C++ dependencies are statically linked in, so there + # using the vendorered ones is easier. + "-DJPEGXL_FORCE_SYSTEM_BROTLI=ON" + + # Use our version of highway, though it is still statically linked in + "-DJPEGXL_FORCE_SYSTEM_HWY=ON" + + # Use our version of gtest + "-DJPEGXL_FORCE_SYSTEM_GTEST=ON" + + # TODO: Update this package to enable this (overridably via an option): + # Viewer tools for evaluation. + # "-DJPEGXL_ENABLE_VIEWERS=ON" + ] ++ lib.optionals enablePlugins [ + # Enable plugins, such as: + # * the `gdk-pixbuf` one, which allows applications like `eog` to load jpeg-xl files + # * the `gimp` one, which allows GIMP to load jpeg-xl files + "-DJPEGXL_ENABLE_PLUGINS=ON" + ] ++ lib.optionals stdenv.hostPlatform.isStatic [ + "-DJPEGXL_STATIC=ON" + ] ++ lib.optionals stdenv.hostPlatform.isAarch32 [ + "-DJPEGXL_FORCE_NEON=ON" + ]; + + postPatch = '' + substituteInPlace plugins/gdk-pixbuf/jxl.thumbnailer \ + --replace '/usr/bin/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-jxl" + ''; + + postInstall = lib.optionalString enablePlugins '' + GDK_PIXBUF_MODULEDIR="$out/${gdk-pixbuf.moduleDir}" \ + GDK_PIXBUF_MODULE_FILE="$out/${loadersPath}" \ + gdk-pixbuf-query-loaders --update-cache + mkdir -p "$out/bin" + makeWrapper ${gdk-pixbuf}/bin/gdk-pixbuf-thumbnailer "$out/libexec/gdk-pixbuf-thumbnailer-jxl" \ + --set GDK_PIXBUF_MODULE_FILE "$out/${loadersPath}" + ''; + + CXXFLAGS = lib.optionalString stdenv.hostPlatform.isAarch32 "-mfp16-format=ieee"; + + # FIXME x86_64-darwin: + # https://github.com/NixOS/nixpkgs/pull/204030#issuecomment-1352768690 + doCheck = with stdenv; !(hostPlatform.isi686 || isDarwin && isx86_64); + + meta = with lib; { + homepage = "https://github.com/libjxl/libjxl"; + description = "JPEG XL image format reference implementation."; + license = licenses.bsd3; + maintainers = with maintainers; [ nh2 ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/li/liblqr1/default.nix b/pkgs/by-name/li/liblqr1/default.nix new file mode 100644 index 0000000..6b8c2eb --- /dev/null +++ b/pkgs/by-name/li/liblqr1/default.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, fetchFromGitHub, pkg-config, glib, Carbon, AppKit }: + +stdenv.mkDerivation rec { + pname = "liblqr-1"; + version = "0.4.2"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "carlobaldassi"; + repo = "liblqr"; + rev = "v${version}"; + sha256 = "10mrl5k3l2hxjhz4w93n50xwywp6y890rw2vsjcgai8627x5f1df"; + }; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = lib.optionals stdenv.isDarwin [ Carbon AppKit ]; + propagatedBuildInputs = [ glib ]; + + meta = with lib; { + homepage = "http://liblqr.wikidot.com"; + description = "Seam-carving C/C++ library called Liquid Rescaling"; + platforms = platforms.all; + license = with licenses; [ gpl3 lgpl3 ]; + }; +} diff --git a/pkgs/by-name/li/liblqr1/packages.nix b/pkgs/by-name/li/liblqr1/packages.nix new file mode 100644 index 0000000..9441e21 --- /dev/null +++ b/pkgs/by-name/li/liblqr1/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + liblqr1 = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Carbon AppKit; + }; +} diff --git a/pkgs/by-name/li/libmd/default.nix b/pkgs/by-name/li/libmd/default.nix new file mode 100644 index 0000000..bf156fb --- /dev/null +++ b/pkgs/by-name/li/libmd/default.nix @@ -0,0 +1,30 @@ +{ lib, stdenv, fetchurl, fetchpatch, autoreconfHook }: + +stdenv.mkDerivation (finalAttrs: { + pname = "libmd"; + version = "1.1.0"; + + src = fetchurl { + urls = [ + "https://archive.hadrons.org/software/libmd/libmd-${finalAttrs.version}.tar.xz" + "https://libbsd.freedesktop.org/releases/libmd-${finalAttrs.version}.tar.xz" + ]; + sha256 = "sha256-G9aqQidTE68xQcfPLluWTosf1IgCXK8vlx9DsAd2szI="; + }; + + enableParallelBuilding = true; + + doCheck = true; + + nativeBuildInputs = [ autoreconfHook ]; + + meta = with lib; { + homepage = "https://www.hadrons.org/software/libmd/"; + changelog = "https://archive.hadrons.org/software/libmd/libmd-${finalAttrs.version}.announce"; + # Git: https://git.hadrons.org/cgit/libmd.git + description = "Message Digest functions from BSD systems"; + license = with licenses; [ bsd3 bsd2 isc beerware publicDomain ]; + maintainers = with maintainers; [ primeos ]; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/li/libmnl/default.nix b/pkgs/by-name/li/libmnl/default.nix new file mode 100644 index 0000000..9a6f6a1 --- /dev/null +++ b/pkgs/by-name/li/libmnl/default.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "libmnl"; + version = "1.0.5"; + + src = fetchurl { + url = "https://netfilter.org/projects/libmnl/files/${pname}-${version}.tar.bz2"; + sha256 = "09851ns07399rbz0y8slrlmnw3fn1nakr8d37pxjn5gkks8rnjr7"; + }; + + meta = { + description = "Minimalistic user-space library oriented to Netlink developers"; + longDescription = '' + libmnl is a minimalistic user-space library oriented to Netlink developers. + There are a lot of common tasks in parsing, validating, constructing of both the Netlink + header and TLVs that are repetitive and easy to get wrong. + This library aims to provide simple helpers that allows you to re-use code and to avoid + re-inventing the wheel. + ''; + homepage = "https://netfilter.org/projects/libmnl/index.html"; + license = lib.licenses.lgpl21Plus; + + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/by-name/li/libmpc/default.nix b/pkgs/by-name/li/libmpc/default.nix new file mode 100644 index 0000000..fe11b59 --- /dev/null +++ b/pkgs/by-name/li/libmpc/default.nix @@ -0,0 +1,41 @@ +{ lib, stdenv, fetchurl +, gmp, mpfr +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "libmpc"; + version = "1.3.1"; # to avoid clash with the MPD client + + src = fetchurl { + url = "mirror://gnu/mpc/mpc-${version}.tar.gz"; + sha256 = "sha256-q2QkkvXPiCt0qgy3MM1BCoHtzb7IlRg86TDnBsHHWbg="; + }; + + strictDeps = true; + enableParallelBuilding = true; + + buildInputs = [ gmp mpfr ]; + + doCheck = true; # not cross; + + meta = { + description = "Library for multiprecision complex arithmetic with exact rounding"; + + longDescription = + '' GNU MPC is a C library for the arithmetic of complex numbers with + arbitrarily high precision and correct rounding of the result. It is + built upon and follows the same principles as GNU MPFR. + ''; + + homepage = "https://www.multiprecision.org/mpc/"; + license = lib.licenses.lgpl2Plus; + + platforms = lib.platforms.all; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/li/libnatspec/default.nix b/pkgs/by-name/li/libnatspec/default.nix new file mode 100644 index 0000000..4124422 --- /dev/null +++ b/pkgs/by-name/li/libnatspec/default.nix @@ -0,0 +1,25 @@ +{ lib, stdenv, fetchurl, autoreconfHook, popt, libiconv }: + +stdenv.mkDerivation rec { + pname = "libnatspec"; + version = "0.3.0"; + + src = fetchurl { + url = "mirror://sourceforge/natspec/${pname}-${version}.tar.bz2"; + sha256 = "0wffxjlc8svilwmrcg3crddpfrpv35mzzjgchf8ygqsvwbrbb3b7"; + }; + + nativeBuildInputs = [ autoreconfHook ]; + + buildInputs = [ popt ]; + + propagatedBuildInputs = [ libiconv ]; + + meta = with lib; { + homepage = "https://natspec.sourceforge.net/"; + description = "A library intended to smooth national specificities in using of programs"; + mainProgram = "natspec"; + platforms = platforms.unix; + license = licenses.lgpl21; + }; +} diff --git a/pkgs/by-name/li/libnetfilter_conntrack/default.nix b/pkgs/by-name/li/libnetfilter_conntrack/default.nix new file mode 100644 index 0000000..c424879 --- /dev/null +++ b/pkgs/by-name/li/libnetfilter_conntrack/default.nix @@ -0,0 +1,38 @@ +{ lib, stdenv, fetchurl, fetchpatch, pkg-config, libnfnetlink, libmnl }: + +stdenv.mkDerivation rec { + pname = "libnetfilter_conntrack"; + version = "1.0.9"; + + src = fetchurl { + url = "https://netfilter.org/projects/libnetfilter_conntrack/files/${pname}-${version}.tar.bz2"; + sha256 = "sha256-Z72d9J/jTouCFE9t+5OzIPOEqOpZcn6S/40YtfS1eag="; + }; + + patches = [ + # Fix Musl build. + (fetchpatch { + url = "https://git.netfilter.org/libnetfilter_conntrack/patch/?id=21ee35dde73aec5eba35290587d479218c6dd824"; + sha256 = "00rp82jrx5ygcw8la3c7bv7sigw9qzbn956dk71qjx981a2g2kqk"; + }) + ]; + + hardeningDisable = [ "trivialautovarinit" ]; + + buildInputs = [ libmnl ]; + propagatedBuildInputs = [ libnfnetlink ]; + nativeBuildInputs = [ pkg-config ]; + + meta = with lib; { + description = "Userspace library providing an API to the in-kernel connection tracking state table"; + longDescription = '' + libnetfilter_conntrack is a userspace library providing a programming interface (API) to the + in-kernel connection tracking state table. The library libnetfilter_conntrack has been + previously known as libnfnetlink_conntrack and libctnetlink. This library is currently used + by conntrack-tools among many other applications + ''; + homepage = "https://netfilter.org/projects/libnetfilter_conntrack/"; + license = licenses.gpl2Plus; + platforms = platforms.linux; + }; +} diff --git a/pkgs/by-name/li/libnfnetlink/default.nix b/pkgs/by-name/li/libnfnetlink/default.nix new file mode 100644 index 0000000..3b6b804 --- /dev/null +++ b/pkgs/by-name/li/libnfnetlink/default.nix @@ -0,0 +1,28 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "libnfnetlink"; + version = "1.0.2"; + + src = fetchurl { + url = "https://www.netfilter.org/projects/libnfnetlink/files/libnfnetlink-${version}.tar.bz2"; + sha256 = "0xn3rcrzxr6g82kfxzs9bqn2zvl2kf2yda30drwb9vr6sk1wfr5h"; + }; + + meta = { + description = "Low-level library for netfilter related kernel/userspace communication"; + longDescription = '' + libnfnetlink is the low-level library for netfilter related kernel/userspace communication. + It provides a generic messaging infrastructure for in-kernel netfilter subsystems + (such as nfnetlink_log, nfnetlink_queue, nfnetlink_conntrack) and their respective users + and/or management tools in userspace. + + This library is not meant as a public API for application developers. + It is only used by other netfilter.org projects, like the aforementioned ones. + ''; + homepage = "https://www.netfilter.org/projects/libnfnetlink/index.html"; + license = lib.licenses.gpl2; + + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/by-name/li/libnftnl/default.nix b/pkgs/by-name/li/libnftnl/default.nix new file mode 100644 index 0000000..b3e8c2f --- /dev/null +++ b/pkgs/by-name/li/libnftnl/default.nix @@ -0,0 +1,22 @@ +{ lib, stdenv, fetchurl, pkg-config, libmnl }: + +stdenv.mkDerivation rec { + version = "1.2.6"; + pname = "libnftnl"; + + src = fetchurl { + url = "https://netfilter.org/projects/${pname}/files/${pname}-${version}.tar.xz"; + hash = "sha256-zurqLNkhR9oZ8To1p/GkvCdn/4l+g45LR5z1S1nHd/Q="; + }; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libmnl ]; + + meta = with lib; { + description = "A userspace library providing a low-level netlink API to the in-kernel nf_tables subsystem"; + homepage = "https://netfilter.org/projects/libnftnl/"; + license = licenses.gpl2Plus; + platforms = platforms.linux; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/li/libnl/default.nix b/pkgs/by-name/li/libnl/default.nix new file mode 100644 index 0000000..68f4ee2 --- /dev/null +++ b/pkgs/by-name/li/libnl/default.nix @@ -0,0 +1,68 @@ +{ stdenv +, file +, lib +, fetchFromGitHub +, autoreconfHook +, bison +, flex +, pkg-config +, doxygen +, graphviz +, mscgen +, asciidoc +, sourceHighlight +, pythonSupport ? false +, swig ? null +, python ? null +}: + +stdenv.mkDerivation rec { + pname = "libnl"; + version = "3.8.0"; + + src = fetchFromGitHub { + repo = "libnl"; + owner = "thom311"; + rev = "libnl${lib.replaceStrings ["."] ["_"] version}"; + hash = "sha256-zVpoRlB5xDfo6wJkCJGGptuCXkNkriudtZF2Job9YD4="; + }; + + outputs = [ "bin" "dev" "out" "man" ] ++ lib.optional pythonSupport "py"; + + enableParallelBuilding = true; + + nativeBuildInputs = [ + autoreconfHook + bison + flex + pkg-config + file + doxygen + graphviz + mscgen + asciidoc + sourceHighlight + ] ++ lib.optional pythonSupport swig; + + postBuild = lib.optionalString (pythonSupport) '' + cd python + ${python.pythonOnBuildForHost.interpreter} setup.py install --prefix=../pythonlib + cd - + ''; + + postFixup = lib.optionalString pythonSupport '' + mv "pythonlib/" "$py" + ''; + + passthru = { + inherit pythonSupport; + }; + + meta = with lib; { + homepage = "http://www.infradead.org/~tgr/libnl/"; + description = "Linux Netlink interface library suite"; + license = licenses.lgpl21; + maintainers = with maintainers; [ fpletz ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/by-name/li/libpcap/default.nix b/pkgs/by-name/li/libpcap/default.nix new file mode 100644 index 0000000..db2ca67 --- /dev/null +++ b/pkgs/by-name/li/libpcap/default.nix @@ -0,0 +1,71 @@ +{ lib +, stdenv +, fetchurl +, flex +, bison +, bluez +, libnl +, libxcrypt +, pkg-config +, withBluez ? false +, withRemote ? false + +# for passthru.tests +# , ettercap +# , nmap +# , ostinato +# , tcpreplay +# , vde2 +# , wireshark +# , python3 +# , haskellPackages +}: + +stdenv.mkDerivation rec { + pname = "libpcap"; + version = "1.10.4"; + + src = fetchurl { + url = "https://www.tcpdump.org/release/${pname}-${version}.tar.gz"; + hash = "sha256-7RmgOD+tcuOtQ1/SOdfNgNZJFrhyaVUBWdIORxYOvl8="; + }; + + buildInputs = lib.optionals stdenv.isLinux [ libnl ] + ++ lib.optionals withRemote [ libxcrypt ]; + + nativeBuildInputs = [ flex bison ] + ++ lib.optionals stdenv.isLinux [ pkg-config ] + ++ lib.optionals withBluez [ bluez.dev ]; + + # We need to force the autodetection because detection doesn't + # work in pure build environments. + configureFlags = [ + "--with-pcap=${if stdenv.isLinux then "linux" else "bpf"}" + ] ++ lib.optionals stdenv.isDarwin [ + "--disable-universal" + ] ++ lib.optionals withRemote [ + "--enable-remote" + ] ++ lib.optionals (stdenv.hostPlatform == stdenv.buildPlatform) + [ "ac_cv_linux_vers=2" ]; + + postInstall = '' + if [ "$dontDisableStatic" -ne "1" ]; then + rm -f $out/lib/libpcap.a + fi + ''; + + # passthru.tests = { + # inherit ettercap nmap ostinato tcpreplay vde2 wireshark; + # inherit (python3.pkgs) pcapy-ng scapy; + # haskell-pcap = haskellPackages.pcap; + # }; + + meta = with lib; { + homepage = "https://www.tcpdump.org"; + description = "Packet Capture Library"; + mainProgram = "pcap-config"; + platforms = platforms.unix; + maintainers = with maintainers; [ fpletz ]; + license = licenses.bsd3; + }; +} diff --git a/pkgs/by-name/li/libpfm/default.nix b/pkgs/by-name/li/libpfm/default.nix new file mode 100644 index 0000000..0598fd6 --- /dev/null +++ b/pkgs/by-name/li/libpfm/default.nix @@ -0,0 +1,52 @@ +{ lib +, stdenv +, fetchurl +, enableShared ? !stdenv.hostPlatform.isStatic +, windows +}: + +stdenv.mkDerivation (finalAttrs: { + version = "4.13.0"; + pname = "libpfm"; + + src = fetchurl { + url = "mirror://sourceforge/perfmon2/libpfm4/libpfm-${finalAttrs.version}.tar.gz"; + sha256 = "sha256-0YuXdkx1VSjBBR03bjNUXQ62DG6/hWgENoE/pbBMw9E="; + }; + + # Don't install libpfm.so on windows as it doesn't exist + # This target is created only if `ifeq ($(SYS),Linux)` passes + patches = [ ./fix-windows.patch ]; + + # Upstream uses "WINDOWS" instead of "Windows" which is incorrect + # See: https://github.com/NixOS/nixpkgs/pull/252982#discussion_r1314346216 + postPatch = '' + substituteInPlace config.mk examples/Makefile \ + --replace '($(SYS),WINDOWS)' '($(SYS),Windows)' + ''; + + makeFlags = [ + "PREFIX=${placeholder "out"}" + "LDCONFIG=true" + "ARCH=${stdenv.hostPlatform.uname.processor}" + "SYS=${stdenv.hostPlatform.uname.system}" + ]; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + env.CONFIG_PFMLIB_SHARED = if enableShared then "y" else "n"; + + buildInputs = lib.optional stdenv.hostPlatform.isWindows windows.libgnurx; + + meta = with lib; { + description = "Helper library to program the performance monitoring events"; + longDescription = '' + This package provides a library, called libpfm4 which is used to + develop monitoring tools exploiting the performance monitoring + events such as those provided by the Performance Monitoring Unit + (PMU) of modern processors. + ''; + license = licenses.gpl2; + maintainers = with maintainers; [ pierron t4ccer ]; + platforms = platforms.linux ++ platforms.windows; + }; +}) diff --git a/pkgs/by-name/li/libpfm/fix-windows.patch b/pkgs/by-name/li/libpfm/fix-windows.patch new file mode 100644 index 0000000..584b9ba --- /dev/null +++ b/pkgs/by-name/li/libpfm/fix-windows.patch @@ -0,0 +1,18 @@ +diff --git a/lib/Makefile b/lib/Makefile +index 5ca71e3..cd0717f 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -428,11 +428,13 @@ install: + -mkdir -p $(DESTDIR)$(LIBDIR) + $(INSTALL) -m 644 $(ALIBPFM) $(DESTDIR)$(LIBDIR) + ifeq ($(CONFIG_PFMLIB_SHARED),y) ++ifeq ($(SYS),Linux) + $(INSTALL) $(SLIBPFM) $(DESTDIR)$(LIBDIR) + cd $(DESTDIR)$(LIBDIR); $(LN) $(SLIBPFM) $(VLIBPFM) + cd $(DESTDIR)$(LIBDIR); $(LN) $(SLIBPFM) libpfm.$(SOLIBEXT) + -$(LDCONFIG) + endif ++endif + + tags: + $(CTAGS) -o $(TOPDIR)/tags --tag-relative=yes $(SRCS) $(INCDEP) diff --git a/pkgs/by-name/li/libpipeline/default.nix b/pkgs/by-name/li/libpipeline/default.nix new file mode 100644 index 0000000..3630980 --- /dev/null +++ b/pkgs/by-name/li/libpipeline/default.nix @@ -0,0 +1,20 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "libpipeline"; + version = "1.5.7"; + + src = fetchurl { + url = "mirror://savannah/libpipeline/libpipeline-${version}.tar.gz"; + sha256 = "sha256-uLRRlJiQIqeewTF/ZKKnWxVRsqVb6gb2dwTLKi5GkLA="; + }; + + patches = lib.optionals stdenv.isDarwin [ ./fix-on-osx.patch ]; + + meta = with lib; { + homepage = "http://libpipeline.nongnu.org"; + description = "C library for manipulating pipelines of subprocesses in a flexible and convenient way"; + platforms = platforms.unix; + license = licenses.gpl3; + }; +} diff --git a/pkgs/by-name/li/libpipeline/fix-on-osx.patch b/pkgs/by-name/li/libpipeline/fix-on-osx.patch new file mode 100644 index 0000000..c539e2d --- /dev/null +++ b/pkgs/by-name/li/libpipeline/fix-on-osx.patch @@ -0,0 +1,13 @@ +diff --git a/lib/pipeline.c b/lib/pipeline.c +index 26478f9..1612307 100644 +--- a/lib/pipeline.c ++++ b/lib/pipeline.c +@@ -75,6 +75,8 @@ + # endif + #endif + ++const char* program_name = "libpipeline"; ++ + #if defined(HAVE_SETENV) && !defined(HAVE_CLEARENV) + int clearenv (void) + { diff --git a/pkgs/by-name/li/libpkgconf/default.nix b/pkgs/by-name/li/libpkgconf/default.nix new file mode 100644 index 0000000..bfa79f3 --- /dev/null +++ b/pkgs/by-name/li/libpkgconf/default.nix @@ -0,0 +1,61 @@ +{ lib +, stdenv +, fetchurl +, removeReferencesTo +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "pkgconf"; + version = "2.1.1"; + + src = fetchurl { + url = "https://distfiles.dereferenced.org/pkgconf/pkgconf-${finalAttrs.version}.tar.xz"; + hash = "sha256-OiJPKszwkbd6V4Exbie57juoLAg8wuU54IlAtopE/sU="; + }; + + outputs = [ "out" "lib" "dev" "man" "doc" ]; + + nativeBuildInputs = [ removeReferencesTo ]; + + enableParallelBuilding = true; + + # Debian has outputs like these too + # (https://packages.debian.org/source/bullseye/pkgconf), so it is safe to + # remove those references + postFixup = '' + remove-references-to \ + -t "${placeholder "out"}" \ + "${placeholder "lib"}"/lib/* + remove-references-to \ + -t "${placeholder "dev"}" \ + "${placeholder "lib"}"/lib/* \ + "${placeholder "out"}"/bin/* + '' + # Move back share/aclocal. Yes, this normally goes in the dev output for good + # reason, but in this case the dev output is for the `libpkgconf` library, + # while the aclocal stuff is for the tool. The tool is already for use during + # development, so there is no reason to have separate "dev-bin" and "dev-lib" + # outputs or something. + + '' + mv ${placeholder "dev"}/share ${placeholder "out"} + ''; + + meta = { + homepage = "https://github.com/pkgconf/pkgconf"; + description = "Package compiler and linker metadata toolkit"; + longDescription = '' + pkgconf is a program which helps to configure compiler and linker flags + for development libraries. It is similar to pkg-config from + freedesktop.org. + + libpkgconf is a library which provides access to most of pkgconf's + functionality, to allow other tooling such as compilers and IDEs to + discover and use libraries configured by pkgconf. + ''; + changelog = "https://github.com/pkgconf/pkgconf/blob/pkgconf-${finalAttrs.version}/NEWS"; + license = lib.licenses.isc; + mainProgram = "pkgconf"; + maintainers = with lib.maintainers; [ zaninime AndersonTorres ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/by-name/li/libpkgconf/packages.nix b/pkgs/by-name/li/libpkgconf/packages.nix new file mode 100644 index 0000000..aab7186 --- /dev/null +++ b/pkgs/by-name/li/libpkgconf/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libpkgconf = callPackage ./. { }; + + pkgconf-unwrapped = libpkgconf; + + pkgconf = callPackage (path + "/pkgs/build-support/pkg-config-wrapper") { + pkg-config = pkgconf-unwrapped; + baseBinName = "pkgconf"; + }; +} diff --git a/pkgs/by-name/li/libpng/12.nix b/pkgs/by-name/li/libpng/12.nix new file mode 100644 index 0000000..e94bd02 --- /dev/null +++ b/pkgs/by-name/li/libpng/12.nix @@ -0,0 +1,39 @@ +{ lib, stdenv, fetchurl, zlib +, testers +}: + +assert stdenv.hostPlatform == stdenv.buildPlatform -> zlib != null; + +stdenv.mkDerivation (finalAttrs: { + pname = "libpng"; + version = "1.2.59"; + + src = fetchurl { + url = "mirror://sourceforge/libpng/libpng-${finalAttrs.version}.tar.xz"; + sha256 = "1izw9ybm27llk8531w6h4jp4rk2rxy2s9vil16nwik5dp0amyqxl"; + }; + + outputs = [ "out" "dev" "man" ]; + + propagatedBuildInputs = [ zlib ]; + + configureFlags = [ "--enable-static" ]; + + postInstall = ''mv "$out/bin" "$dev/bin"''; + + passthru = { + inherit zlib; + + tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; + + meta = with lib; { + description = "The official reference implementation for the PNG file format"; + homepage = "http://www.libpng.org/pub/png/libpng.html"; + license = licenses.libpng; + maintainers = [ ]; + branch = "1.2"; + pkgConfigModules = [ "libpng" "libpng12" ]; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/li/libpng/default.nix b/pkgs/by-name/li/libpng/default.nix new file mode 100644 index 0000000..34d7a3e --- /dev/null +++ b/pkgs/by-name/li/libpng/default.nix @@ -0,0 +1,47 @@ +{ lib, stdenv, fetchurl, zlib, apngSupport ? true +, testers +}: + +assert zlib != null; + +let + patchVersion = "1.6.43"; + patch_src = fetchurl { + url = "mirror://sourceforge/libpng-apng/libpng-${patchVersion}-apng.patch.gz"; + hash = "sha256-0QdXnpDVU4bQDmCG6nUJQvIqBLmrR2u6DGYHcM76/iI="; + }; + whenPatched = lib.optionalString apngSupport; + +in stdenv.mkDerivation (finalAttrs: { + pname = "libpng" + whenPatched "-apng"; + version = "1.6.43"; + + src = fetchurl { + url = "mirror://sourceforge/libpng/libpng-${finalAttrs.version}.tar.xz"; + hash = "sha256-alygZSOSotfJ2yrltAIQhDwLvAgcvUEIJasAzFnxSmw="; + }; + postPatch = whenPatched "gunzip < ${patch_src} | patch -Np1"; + + outputs = [ "out" "dev" "man" ]; + outputBin = "dev"; + + propagatedBuildInputs = [ zlib ]; + + doCheck = true; + + passthru = { + inherit zlib; + + tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; + + meta = with lib; { + description = "The official reference implementation for the PNG file format" + whenPatched " with animation patch"; + homepage = "http://www.libpng.org/pub/png/libpng.html"; + changelog = "https://github.com/pnggroup/libpng/blob/v${finalAttrs.version}/CHANGES"; + license = licenses.libpng2; + pkgConfigModules = [ "libpng" "libpng16" ]; + platforms = platforms.all; + maintainers = with maintainers; [ vcunat ]; + }; +}) diff --git a/pkgs/by-name/li/libpng/packages.nix b/pkgs/by-name/li/libpng/packages.nix new file mode 100644 index 0000000..f5aeb36 --- /dev/null +++ b/pkgs/by-name/li/libpng/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libpng = callPackage ./. { }; + libpng12 = callPackage ./12.nix { }; +} diff --git a/pkgs/by-name/li/libpsl/default.nix b/pkgs/by-name/li/libpsl/default.nix new file mode 100644 index 0000000..e875864 --- /dev/null +++ b/pkgs/by-name/li/libpsl/default.nix @@ -0,0 +1,87 @@ +{ lib, stdenv +, fetchurl +, autoreconfHook +, docbook_xsl +, docbook_xml_dtd_43 +, gtk-doc +, lzip +, libidn2 +, libunistring +, libxslt +, pkg-config +, python3 +# , valgrind +, publicsuffix-list +}: + +stdenv.mkDerivation rec { + pname = "libpsl"; + version = "0.21.5"; + + src = fetchurl { + url = "https://github.com/rockdaboot/libpsl/releases/download/${version}/libpsl-${version}.tar.lz"; + hash = "sha256-mp9qjG7bplDPnqVUdc0XLdKEhzFoBOnHMgLZdXLNOi0="; + }; + + # bin/psl-make-dafsa brings a large runtime closure through python3 + outputs = [ "bin" "out" "dev" ]; + + nativeBuildInputs = [ + autoreconfHook + docbook_xsl + docbook_xml_dtd_43 + gtk-doc + lzip + pkg-config + python3 + libxslt + ]; + + buildInputs = [ + libidn2 + libunistring + libxslt + ]; + + propagatedBuildInputs = [ + publicsuffix-list + ]; + + postPatch = '' + patchShebangs src/psl-make-dafsa + ''; + + preAutoreconf = '' + gtkdocize + ''; + + configureFlags = [ + # "--enable-gtk-doc" + "--enable-man" + "--with-psl-distfile=${publicsuffix-list}/share/publicsuffix/public_suffix_list.dat" + "--with-psl-file=${publicsuffix-list}/share/publicsuffix/public_suffix_list.dat" + "--with-psl-testfile=${publicsuffix-list}/share/publicsuffix/test_psl.txt" + ]; + + enableParallelBuilding = true; + + doCheck = true; + + meta = with lib; { + description = "C library for the Publix Suffix List"; + longDescription = '' + libpsl is a C library for the Publix Suffix List (PSL). A "public suffix" + is a domain name under which Internet users can directly register own + names. Browsers and other web clients can use it to avoid privacy-leaking + "supercookies" and "super domain" certificates, for highlighting parts of + the domain in a user interface or sorting domain lists by site. + ''; + homepage = "https://rockdaboot.github.io/libpsl/"; + changelog = "https://raw.githubusercontent.com/rockdaboot/${pname}/${pname}-${version}/NEWS"; + license = licenses.mit; + maintainers = [ maintainers.c0bw3b ]; + mainProgram = "psl"; + platforms = platforms.unix ++ platforms.windows; + pkgConfigModules = [ "libpsl" ]; + }; +} diff --git a/pkgs/by-name/li/libraw/default.nix b/pkgs/by-name/li/libraw/default.nix new file mode 100644 index 0000000..f840641 --- /dev/null +++ b/pkgs/by-name/li/libraw/default.nix @@ -0,0 +1,48 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook +, lcms2 +, pkg-config + +# for passthru.tests +# , deepin +# , freeimage +# , hdrmerge +# , imagemagick +# , python3 +}: + +stdenv.mkDerivation rec { + pname = "libraw"; + version = "0.21.2"; + + src = fetchFromGitHub { + owner = "LibRaw"; + repo = "LibRaw"; + rev = version; + hash = "sha256-p9CmOCulvV7+KKn1lXwpcysOo0+mD5UgPqy2ki0cIFE="; + }; + + outputs = [ "out" "lib" "dev" "doc" ]; + + propagatedBuildInputs = [ lcms2 ]; + + nativeBuildInputs = [ autoreconfHook pkg-config ]; + + enableParallelBuilding = true; + + # passthru.tests = { + # inherit imagemagick hdrmerge freeimage; + # inherit (deepin) deepin-image-viewer; + # inherit (python3.pkgs) rawkit; + # }; + + meta = with lib; { + description = "Library for reading RAW files obtained from digital photo cameras (CRW/CR2, NEF, RAF, DNG, and others)"; + homepage = "https://www.libraw.org/"; + license = with licenses; [ cddl lgpl2Plus ]; + platforms = platforms.unix; + }; +} + diff --git a/pkgs/by-name/li/librsvg/default.nix b/pkgs/by-name/li/librsvg/default.nix new file mode 100644 index 0000000..ee840b8 --- /dev/null +++ b/pkgs/by-name/li/librsvg/default.nix @@ -0,0 +1,226 @@ +{ lib +, stdenv +, fetchurl +, pkg-config +, glib +, gdk-pixbuf +, installShellFiles +, pango +, cairo +, libxml2 +, bzip2 +, libintl +, ApplicationServices +, Foundation +, libobjc +, rustPlatform +, rustc +, cargo-auditable-cargo-wrapper +, gi-docgen +, python3Packages +, gnome +, vala +, writeScript +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, buildPackages +, gobject-introspection +, _experimental-update-script-combinators +, common-updater-scripts +, jq +, nix + +# for passthru.tests +, enlightenment +, ffmpeg +, gegl +, gimp +, imagemagick +, imlib2 +, vips +, xfce +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "librsvg"; + version = "2.58.0"; + + outputs = [ "out" "dev" ] ++ lib.optionals withIntrospection [ + "devdoc" + ]; + + src = fetchurl { + url = "mirror://gnome/sources/librsvg/${lib.versions.majorMinor finalAttrs.version}/librsvg-${finalAttrs.version}.tar.xz"; + hash = "sha256-18REqSZAa1l5C+DerhluGO0mBZ2lc/oaqeycp2WKVZw="; + }; + + cargoDeps = rustPlatform.fetchCargoTarball { + inherit (finalAttrs) src; + name = "librsvg-deps-${finalAttrs.version}"; + hash = "sha256-ta+3KkDtqTLGoKknUn89c+3XHzvcZyPFPFpgLH5f5uw="; + # TODO: move this to fetchCargoTarball + dontConfigure = true; + }; + + strictDeps = true; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + gdk-pixbuf + installShellFiles + pkg-config + rustc + cargo-auditable-cargo-wrapper + python3Packages.docutils + vala + rustPlatform.cargoSetupHook + ] ++ lib.optionals withIntrospection [ + gobject-introspection + gi-docgen + ]; + + buildInputs = [ + libxml2 + bzip2 + pango + libintl + vala # for share/vala/Makefile.vapigen + ] ++ lib.optionals stdenv.isDarwin [ + ApplicationServices + Foundation + libobjc + ]; + + propagatedBuildInputs = [ + glib + gdk-pixbuf + cairo + ]; + + configureFlags = [ + (lib.enableFeature withIntrospection "introspection") + (lib.enableFeature withIntrospection "vala") + + "--enable-always-build-tests" + ] ++ lib.optional stdenv.isDarwin "--disable-Bsymbolic" + ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "RUST_TARGET=${stdenv.hostPlatform.rust.rustcTarget}"; + + doCheck = false; # all tests fail on libtool-generated rsvg-convert not being able to find coreutils + + GDK_PIXBUF_QUERYLOADERS = writeScript "gdk-pixbuf-loader-loaders-wrapped" '' + ${lib.optionalString (stdenv.hostPlatform.emulatorAvailable buildPackages) (stdenv.hostPlatform.emulator buildPackages)} ${lib.getDev gdk-pixbuf}/bin/gdk-pixbuf-query-loaders + ''; + + # librsvg only links Foundation, but it also requiers libobjc. The Framework.tbd in the 11.0 SDK + # reexports libobjc, but the one in the 10.12 SDK does not, so link it manually. + env = lib.optionalAttrs (stdenv.isDarwin && stdenv.isx86_64) { + NIX_LDFLAGS = "-lobjc"; + }; + + preConfigure = '' + PKG_CONFIG_VAPIGEN_VAPIGEN="$(type -p vapigen)" + export PKG_CONFIG_VAPIGEN_VAPIGEN + ''; + + # It wants to add loaders and update the loaders.cache in gdk-pixbuf + # Patching the Makefiles to it creates rsvg specific loaders and the + # relevant loader.cache here. + # The loaders.cache can be used by setting GDK_PIXBUF_MODULE_FILE to + # point to this file in a wrapper. + postConfigure = '' + GDK_PIXBUF=$out/lib/gdk-pixbuf-2.0/2.10.0 + mkdir -p $GDK_PIXBUF/loaders + sed -i gdk-pixbuf-loader/Makefile \ + -e "s#gdk_pixbuf_moduledir = .*#gdk_pixbuf_moduledir = $GDK_PIXBUF/loaders#" \ + -e "s#gdk_pixbuf_cache_file = .*#gdk_pixbuf_cache_file = $GDK_PIXBUF/loaders.cache#" \ + -e "s#\$(GDK_PIXBUF_QUERYLOADERS)#GDK_PIXBUF_MODULEDIR=$GDK_PIXBUF/loaders \$(GDK_PIXBUF_QUERYLOADERS)#" + + # Fix thumbnailer path + sed -e "s#@bindir@\(/gdk-pixbuf-thumbnailer\)#${gdk-pixbuf}/bin\1#g" \ + -i gdk-pixbuf-loader/librsvg.thumbnailer.in + + # 'error: linker `cc` not found' when cross-compiling + export RUSTFLAGS="-Clinker=$CC" + '' + lib.optionalString ((stdenv.buildPlatform != stdenv.hostPlatform) && (stdenv.hostPlatform.emulatorAvailable buildPackages)) '' + # the replacement is the native conditional + substituteInPlace gdk-pixbuf-loader/Makefile \ + --replace 'RUN_QUERY_LOADER_TEST = false' 'RUN_QUERY_LOADER_TEST = test -z "$(DESTDIR)"' \ + ''; + + # Not generated when cross compiling. + postInstall = let emulator = stdenv.hostPlatform.emulator buildPackages; in + lib.optionalString (stdenv.hostPlatform.emulatorAvailable buildPackages) '' + # Merge gdkpixbuf and librsvg loaders + cat ${lib.getLib gdk-pixbuf}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache $GDK_PIXBUF/loaders.cache > $GDK_PIXBUF/loaders.cache.tmp + mv $GDK_PIXBUF/loaders.cache.tmp $GDK_PIXBUF/loaders.cache + + installShellCompletion --cmd rsvg-convert \ + --bash <(${emulator} $out/bin/rsvg-convert --completion bash) \ + --fish <(${emulator} $out/bin/rsvg-convert --completion fish) \ + --zsh <(${emulator} $out/bin/rsvg-convert --completion zsh) + ''; + + postFixup = lib.optionalString withIntrospection '' + # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back. + moveToOutput "share/doc" "$devdoc" + ''; + + passthru = { + updateScript = + let + updateSource = gnome.updateScript { + packageName = "librsvg"; + }; + + updateLockfile = { + command = [ + "sh" + "-c" + '' + PATH=${lib.makeBinPath [ + common-updater-scripts + jq + nix + ]} + # update-source-version does not allow updating to the same version so we need to clear it temporarily. + # Get the current version so that we can restore it later. + latestVersion=$(nix-instantiate --eval -A librsvg.version | jq --raw-output) + # Clear the version. Provide hash so that we do not need to do pointless TOFU. + # Needs to be a fake SRI hash that is non-zero, since u-s-v uses zero as a placeholder. + # Also cannot be here verbatim or u-s-v would be confused what to replace. + update-source-version librsvg 0 "sha256-${lib.fixedWidthString 44 "B" "="}" --source-key=cargoDeps > /dev/null + update-source-version librsvg "$latestVersion" --source-key=cargoDeps > /dev/null + '' + ]; + # Experimental feature: do not copy! + supportedFeatures = [ "silent" ]; + }; + in + _experimental-update-script-combinators.sequence [ + updateSource + updateLockfile + ]; + tests = { + inherit + gegl + gimp + imagemagick + imlib2 + vips; + inherit (enlightenment) efl; + inherit (xfce) xfwm4; + ffmpeg = ffmpeg.override { withSvg = true; }; + }; + }; + + meta = with lib; { + description = "A small library to render SVG images to Cairo surfaces"; + homepage = "hhttps://gitlab.gnome.org/GNOME/librsvg"; + license = licenses.lgpl2Plus; + maintainers = teams.gnome.members; + mainProgram = "rsvg-convert"; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/li/librsvg/packages.nix b/pkgs/by-name/li/librsvg/packages.nix new file mode 100644 index 0000000..69bb6bf --- /dev/null +++ b/pkgs/by-name/li/librsvg/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + librsvg = callPackage ../development/libraries/librsvg { + inherit (darwin) libobjc; + inherit (darwin.apple_sdk.frameworks) ApplicationServices Foundation; + }; +} diff --git a/pkgs/by-name/li/libseccomp/default.nix b/pkgs/by-name/li/libseccomp/default.nix new file mode 100644 index 0000000..19ba1f2 --- /dev/null +++ b/pkgs/by-name/li/libseccomp/default.nix @@ -0,0 +1,56 @@ +{ lib, stdenv, fetchurl, getopt, util-linuxMinimal, which, gperf, nix-update-script }: + +stdenv.mkDerivation rec { + pname = "libseccomp"; + version = "2.5.5"; + + src = fetchurl { + url = "https://github.com/seccomp/libseccomp/releases/download/v${version}/libseccomp-${version}.tar.gz"; + hash = "sha256-JIosik2bmFiqa69ScSw0r+/PnJ6Ut23OAsHJqiX7M3U="; + }; + + outputs = [ "out" "lib" "dev" "man" "pythonsrc" ]; + + nativeBuildInputs = [ gperf ]; + buildInputs = [ getopt ]; + + patchPhase = '' + patchShebangs . + ''; + + nativeCheckInputs = [ util-linuxMinimal which ]; + doCheck = true; + + # Hack to ensure that patchelf --shrink-rpath get rids of a $TMPDIR reference. + preFixup = "rm -rfv src"; + + # Copy the python module code into a tarball that we can export and use as the + # src input for buildPythonPackage calls + postInstall = '' + cp -R ./src/python/ tmp-pythonsrc/ + tar -zcf $pythonsrc --mtime="@$SOURCE_DATE_EPOCH" --sort=name --transform s/tmp-pythonsrc/python-foundationdb/ ./tmp-pythonsrc/ + ''; + + passthru = { + updateScript = nix-update-script { }; + }; + + meta = with lib; { + description = "High level library for the Linux Kernel seccomp filter"; + mainProgram = "scmp_sys_resolver"; + homepage = "https://github.com/seccomp/libseccomp"; + license = licenses.lgpl21Only; + platforms = platforms.linux; + badPlatforms = [ + "alpha-linux" + "loongarch64-linux" + "m68k-linux" + "microblaze-linux" + "microblazeel-linux" + "riscv32-linux" + "sparc-linux" + "sparc64-linux" + ]; + maintainers = with maintainers; [ thoughtpolice ]; + }; +} diff --git a/pkgs/by-name/li/libsecret/default.nix b/pkgs/by-name/li/libsecret/default.nix new file mode 100644 index 0000000..040722e --- /dev/null +++ b/pkgs/by-name/li/libsecret/default.nix @@ -0,0 +1,129 @@ +{ stdenv +, lib +, fetchurl +, glib +, meson +, ninja +, pkg-config +, gettext +, libxslt +, python3 +, docbook-xsl-nons +, docbook_xml_dtd_42 +, libgcrypt +, gobject-introspection +, buildPackages +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, vala +, gi-docgen +, gnome +, gjs +, libintl +, dbus +}: + +stdenv.mkDerivation rec { + pname = "libsecret"; + version = "0.21.4"; + + outputs = [ "out" "dev" ] ++ lib.optional withIntrospection "devdoc"; + + src = fetchurl { + url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + hash = "sha256-Fj0I14O+bUq5qXnOtaT+y8HZZg08NBaMWBMBzVORKyA="; + }; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + meson + ninja + pkg-config + gettext + libxslt # for xsltproc for building man pages + docbook-xsl-nons + docbook_xml_dtd_42 + libintl + vala + glib + ] ++ lib.optionals withIntrospection [ + gi-docgen + gobject-introspection + ]; + + buildInputs = [ + libgcrypt + ]; + + propagatedBuildInputs = [ + glib + ]; + + nativeCheckInputs = [ + python3 + python3.pkgs.dbus-python + python3.pkgs.pygobject3 + dbus + gjs + ]; + + mesonFlags = [ + (lib.mesonBool "introspection" withIntrospection) + (lib.mesonBool "gtk_doc" withIntrospection) + ]; + + doCheck = stdenv.isLinux && withIntrospection; + separateDebugInfo = true; + + postPatch = '' + patchShebangs ./tool/test-*.sh + ''; + + preCheck = '' + # Our gobject-introspection patches make the shared library paths absolute + # in the GIR files. When running tests, the library is not yet installed, + # though, so we need to replace the absolute path with a local one during build. + # We are using a symlink that will be overwitten during installation. + mkdir -p $out/lib $out/lib + ln -s "$PWD/libsecret/libmock-service.so" "$out/lib/libmock-service.so" + ln -s "$PWD/libsecret/libsecret-1.so.0" "$out/lib/libsecret-1.so.0" + ''; + + checkPhase = '' + runHook preCheck + + dbus-run-session \ + --config-file=${dbus}/share/dbus-1/session.conf \ + meson test --print-errorlogs --timeout-multiplier 0 + + runHook postCheck + ''; + + postCheck = '' + # This is test-only so it won’t be overwritten during installation. + rm "$out/lib/libmock-service.so" + ''; + + postFixup = '' + # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back. + moveToOutput "share/doc" "$devdoc" + ''; + + passthru = { + updateScript = gnome.updateScript { + packageName = pname; + # Does not seem to use the odd-unstable policy: https://gitlab.gnome.org/GNOME/libsecret/issues/30 + versionPolicy = "none"; + }; + }; + + meta = { + description = "A library for storing and retrieving passwords and other secrets"; + homepage = "https://gitlab.gnome.org/GNOME/libsecret"; + license = lib.licenses.lgpl21Plus; + mainProgram = "secret-tool"; + inherit (glib.meta) platforms maintainers; + }; +} diff --git a/pkgs/by-name/li/libselinux/default.nix b/pkgs/by-name/li/libselinux/default.nix new file mode 100644 index 0000000..c0711f6 --- /dev/null +++ b/pkgs/by-name/li/libselinux/default.nix @@ -0,0 +1,99 @@ +{ lib, stdenv, fetchurl, fetchpatch, buildPackages, pcre2, pkg-config, libsepol +, enablePython ? !stdenv.hostPlatform.isStatic +, swig ? null, python3 ? null, python3Packages +, fts +}: + +assert enablePython -> swig != null && python3 != null; + +with lib; + +stdenv.mkDerivation rec { + pname = "libselinux"; + version = "3.6"; + inherit (libsepol) se_url; + + outputs = [ "bin" "out" "dev" "man" ] ++ optional enablePython "py"; + + src = fetchurl { + url = "${se_url}/${version}/libselinux-${version}.tar.gz"; + hash = "sha256-uk4O80snDnZypeXxtSP+K+qzpAuzPZOJ9K06hyjyG1I="; + }; + + patches = [ + # Make it possible to disable shared builds (for pkgsStatic). + # + # We can't use fetchpatch because it processes includes/excludes + # /after/ stripping the prefix, which wouldn't work here because + # there would be no way to distinguish between + # e.g. libselinux/src/Makefile and libsepol/src/Makefile. + # + # This is a static email, so we shouldn't have to worry about + # normalizing the patch. + (fetchurl { + url = "https://lore.kernel.org/selinux/20211113141616.361640-1-hi@alyssa.is/raw"; + sha256 = "16a2s2ji9049892i15yyqgp4r20hi1hij4c1s4s8law9jsx65b3n"; + postFetch = '' + mv "$out" $TMPDIR/patch + ${buildPackages.patchutils_0_3_3}/bin/filterdiff \ + -i 'a/libselinux/*' --strip 1 <$TMPDIR/patch >"$out" + ''; + }) + + (fetchurl { + url = "https://git.yoctoproject.org/meta-selinux/plain/recipes-security/selinux/libselinux/0003-libselinux-restore-drop-the-obsolete-LSF-transitiona.patch?id=62b9c816a5000dc01b28e78213bde26b58cbca9d"; + sha256 = "sha256-RiEUibLVzfiRU6N/J187Cs1iPAih87gCZrlyRVI2abU="; + }) + ]; + + nativeBuildInputs = [ pkg-config python3 ] ++ optionals enablePython [ + python3Packages.pip + python3Packages.setuptools + python3Packages.wheel + swig + ]; + buildInputs = [ libsepol pcre2 fts ] ++ optionals enablePython [ python3 ]; + + # drop fortify here since package uses it by default, leading to compile error: + # command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] + hardeningDisable = [ "fortify" ]; + + env.NIX_CFLAGS_COMPILE = "-Wno-error -D_FILE_OFFSET_BITS=64"; + + makeFlags = [ + "PREFIX=$(out)" + "INCDIR=$(dev)/include/selinux" + "INCLUDEDIR=$(dev)/include" + "MAN3DIR=$(man)/share/man/man3" + "MAN5DIR=$(man)/share/man/man5" + "MAN8DIR=$(man)/share/man/man8" + "SBINDIR=$(bin)/sbin" + "SHLIBDIR=$(out)/lib" + + "LIBSEPOLA=${lib.getLib libsepol}/lib/libsepol.a" + "ARCH=${stdenv.hostPlatform.linuxArch}" + ] ++ optionals (fts != null) [ + "FTS_LDLIBS=-lfts" + ] ++ optionals stdenv.hostPlatform.isStatic [ + "DISABLE_SHARED=y" + ] ++ optionals enablePython [ + "PYTHON=${python3.pythonOnBuildForHost.interpreter}" + "PYTHONLIBDIR=$(py)/${python3.sitePackages}" + "PYTHON_SETUP_ARGS=--no-build-isolation" + ]; + + postPatch = lib.optionalString stdenv.hostPlatform.isMusl '' + substituteInPlace src/procattr.c \ + --replace "#include " "" + ''; + + preInstall = optionalString enablePython '' + mkdir -p $py/${python3.sitePackages}/selinux + ''; + + installTargets = [ "install" ] ++ optional enablePython "install-pywrap"; + + meta = removeAttrs libsepol.meta ["outputsToInstall"] // { + description = "SELinux core library"; + }; +} diff --git a/pkgs/by-name/li/libsepol/default.nix b/pkgs/by-name/li/libsepol/default.nix new file mode 100644 index 0000000..548d522 --- /dev/null +++ b/pkgs/by-name/li/libsepol/default.nix @@ -0,0 +1,46 @@ +{ lib, stdenv, fetchurl, fetchpatch, flex }: + +stdenv.mkDerivation rec { + pname = "libsepol"; + version = "3.6"; + se_url = "https://github.com/SELinuxProject/selinux/releases/download"; + + outputs = [ "bin" "out" "dev" "man" ]; + + src = fetchurl { + url = "${se_url}/${version}/libsepol-${version}.tar.gz"; + sha256 = "sha256-ydxYXqlJA9eE1ZfIYc1dzmRZFo+V4isxoOqxzdgAl1o="; + }; + + postPatch = lib.optionalString stdenv.hostPlatform.isStatic '' + substituteInPlace src/Makefile --replace 'all: $(LIBA) $(LIBSO)' 'all: $(LIBA)' + sed -i $'/^\t.*LIBSO/d' src/Makefile + ''; + + nativeBuildInputs = [ flex ]; + + makeFlags = [ + "PREFIX=$(out)" + "BINDIR=$(bin)/bin" + "INCDIR=$(dev)/include/sepol" + "INCLUDEDIR=$(dev)/include" + "MAN3DIR=$(man)/share/man/man3" + "MAN8DIR=$(man)/share/man/man8" + "SHLIBDIR=$(out)/lib" + ]; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + enableParallelBuilding = true; + + passthru = { inherit se_url; }; + + meta = with lib; { + description = "SELinux binary policy manipulation library"; + homepage = "http://userspace.selinuxproject.org"; + platforms = platforms.linux; + maintainers = [ ]; + license = lib.licenses.gpl2Plus; + pkgConfigModules = [ "libselinux" ]; + }; +} diff --git a/pkgs/by-name/li/libsigsegv/default.nix b/pkgs/by-name/li/libsigsegv/default.nix new file mode 100644 index 0000000..84c2f19 --- /dev/null +++ b/pkgs/by-name/li/libsigsegv/default.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl +, enableSigbusFix ? false # required by kernels < 3.18.6 +}: + +stdenv.mkDerivation rec { + pname = "libsigsegv"; + version = "2.14"; + + src = fetchurl { + url = "mirror://gnu/libsigsegv/libsigsegv-${version}.tar.gz"; + sha256 = "sha256-zaw5QYAzZM+BqQhJm+t5wgDq1gtrW0DK0ST9HgbKopU="; + }; + + patches = if enableSigbusFix then [ ./sigbus_fix.patch ] else null; + + doCheck = true; # not cross; + + meta = { + homepage = "https://www.gnu.org/software/libsigsegv/"; + description = "Library to handle page faults in user mode"; + + longDescription = '' + GNU libsigsegv is a library for handling page faults in user mode. A + page fault occurs when a program tries to access to a region of memory + that is currently not available. Catching and handling a page fault is + a useful technique for implementing pageable virtual memory, + memory-mapped access to persistent databases, generational garbage + collectors, stack overflow handlers, distributed shared memory, and + more. + ''; + + license = lib.licenses.gpl2Plus; + + maintainers = [ ]; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/li/libsigsegv/sigbus_fix.patch b/pkgs/by-name/li/libsigsegv/sigbus_fix.patch new file mode 100644 index 0000000..6f1c399 --- /dev/null +++ b/pkgs/by-name/li/libsigsegv/sigbus_fix.patch @@ -0,0 +1,8 @@ +--- a/src/signals.h 2017-08-23 14:07:05.000000000 +0100 ++++ b/src/signals.h 2017-08-23 14:06:53.000000000 +0100 +@@ -18,4 +18,4 @@ + /* List of signals that are sent when an invalid virtual memory address + is accessed, or when the stack overflows. */ + #define SIGSEGV_FOR_ALL_SIGNALS(var,body) \ +- { int var; var = SIGSEGV; { body } } ++ { int var; var = SIGSEGV; { body } var = SIGBUS; { body } } diff --git a/pkgs/by-name/li/libsodium/default.nix b/pkgs/by-name/li/libsodium/default.nix new file mode 100644 index 0000000..4570b10 --- /dev/null +++ b/pkgs/by-name/li/libsodium/default.nix @@ -0,0 +1,49 @@ +{ lib, stdenv, fetchurl, fetchpatch, autoreconfHook +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libsodium"; + version = "1.0.19"; + + src = fetchurl { + url = "https://download.libsodium.org/libsodium/releases/${finalAttrs.pname}-${finalAttrs.version}.tar.gz"; + hash = "sha256-AY15/goEXMoHMx03vQy1ey6DjFG8SP2DehRy5QBou+o="; + }; + + outputs = [ "out" "dev" ]; + + patches = [ + # Drop -Ofast as it breaks floating point arithmetics in downstream + # users. + (fetchpatch { + name = "drop-Ofast.patch"; + url = "https://github.com/jedisct1/libsodium/commit/ffd1e374989197b44d815ac8b5d8f0b43b6ce534.patch"; + hash = "sha256-jG0VirIoFBwYmRx6zHSu2xe6pXYwbeqNVhPJxO6eJEY="; + }) + ]; + + nativeBuildInputs = [ autoreconfHook ]; + + separateDebugInfo = stdenv.isLinux && stdenv.hostPlatform.libc != "musl"; + + enableParallelBuilding = true; + hardeningDisable = lib.optional (stdenv.hostPlatform.isMusl && stdenv.hostPlatform.isx86_32) "stackprotector"; + + # FIXME: the hardeingDisable attr above does not seems effective, so + # the need to disable stackprotector via configureFlags + configureFlags = lib.optional (stdenv.hostPlatform.isMusl && stdenv.hostPlatform.isx86_32) "--disable-ssp"; + + doCheck = true; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + description = "A modern and easy-to-use crypto library"; + homepage = "https://doc.libsodium.org/"; + license = licenses.isc; + maintainers = with maintainers; [ raskin ]; + pkgConfigModules = [ "libsodium" ]; + platforms = platforms.all; + }; +}) diff --git a/pkgs/by-name/li/libsoup/3.x.nix b/pkgs/by-name/li/libsoup/3.x.nix new file mode 100644 index 0000000..4d5f30c --- /dev/null +++ b/pkgs/by-name/li/libsoup/3.x.nix @@ -0,0 +1,108 @@ +{ stdenv +, lib +, fetchurl +, glib +, meson +, ninja +, pkg-config +, gnome +, libsysprof-capture +, sqlite +, buildPackages +, gobject-introspection +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, vala +, libpsl +, python3 +, gi-docgen +, brotli +, libnghttp2 +}: + +stdenv.mkDerivation rec { + pname = "libsoup"; + version = "3.4.4"; + + outputs = [ "out" "dev" ] ++ lib.optional withIntrospection "devdoc"; + + src = fetchurl { + url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + sha256 = "sha256-KRxncl827ZDqQ+//JQZLacWi0ZgUiEd8BcSBo7Swxao="; + }; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + meson + ninja + pkg-config + glib + python3 + ] ++ lib.optionals withIntrospection [ + gi-docgen + gobject-introspection + vala + ]; + + buildInputs = [ + sqlite + libpsl + glib.out + brotli + libnghttp2 + ] ++ lib.optionals stdenv.isLinux [ + libsysprof-capture + ]; + + propagatedBuildInputs = [ + glib + ]; + + mesonFlags = [ + "-Dtls_check=false" # glib-networking is a runtime dependency, not a compile-time dependency + "-Dgssapi=disabled" + "-Dntlm=disabled" + # Requires wstest from autobahn-testsuite. + "-Dautobahn=disabled" + # Requires gnutls, not added for closure size. + "-Dpkcs11_tests=disabled" + + (lib.mesonEnable "docs" withIntrospection) + (lib.mesonEnable "introspection" withIntrospection) + (lib.mesonEnable "sysprof" stdenv.isLinux) + (lib.mesonEnable "vapi" withIntrospection) + ]; + + # TODO: For some reason the pkg-config setup hook does not pick this up. + PKG_CONFIG_PATH = "${libnghttp2.dev}/lib/pkgconfig"; + + # HSTS tests fail. + doCheck = false; + separateDebugInfo = true; + + postPatch = '' + patchShebangs libsoup/ + ''; + + postFixup = '' + # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back. + moveToOutput "share/doc" "$devdoc" + ''; + + passthru = { + updateScript = gnome.updateScript { + attrPath = "libsoup_3"; + packageName = pname; + versionPolicy = "odd-unstable"; + }; + }; + + meta = { + description = "HTTP client/server library for GNOME"; + homepage = "https://gitlab.gnome.org/GNOME/libsoup"; + license = lib.licenses.lgpl2Plus; + inherit (glib.meta) maintainers platforms; + }; +} diff --git a/pkgs/by-name/li/libsoup/default.nix b/pkgs/by-name/li/libsoup/default.nix new file mode 100644 index 0000000..e92c59b --- /dev/null +++ b/pkgs/by-name/li/libsoup/default.nix @@ -0,0 +1,104 @@ +{ stdenv +, lib +, fetchurl +, glib +, libxml2 +, meson +, ninja +, pkg-config +, gnome +, libsysprof-capture +, gobject-introspection +, vala +, libpsl +, brotli +, gnomeSupport ? true +, sqlite +, buildPackages +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +}: + +stdenv.mkDerivation rec { + pname = "libsoup"; + version = "2.74.3"; + + outputs = [ "out" "dev" ]; + + src = fetchurl { + url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + sha256 = "sha256-5Ld8Qc/EyMWgNfzcMgx7xs+3XvfFoDQVPfFBP6HZLxM="; + }; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + meson + ninja + pkg-config + glib + ] ++ lib.optionals withIntrospection [ + gobject-introspection + vala + ]; + + buildInputs = [ + sqlite + libpsl + glib.out + brotli + ] ++ lib.optionals stdenv.isLinux [ + libsysprof-capture + ]; + + propagatedBuildInputs = [ + glib + libxml2 + ]; + + mesonFlags = [ + "-Dtls_check=false" # glib-networking is a runtime dependency, not a compile-time dependency + "-Dgssapi=disabled" + "-Dvapi=${if withIntrospection then "enabled" else "disabled"}" + "-Dintrospection=${if withIntrospection then "enabled" else "disabled"}" + "-Dgnome=${lib.boolToString gnomeSupport}" + "-Dntlm=disabled" + ] ++ lib.optionals (!stdenv.isLinux) [ + "-Dsysprof=disabled" + ]; + + env.NIX_CFLAGS_COMPILE = "-lpthread"; + + doCheck = false; # ERROR:../tests/socket-test.c:37:do_unconnected_socket_test: assertion failed (res == SOUP_STATUS_OK): (2 == 200) + separateDebugInfo = true; + + postPatch = '' + # fixes finding vapigen when cross-compiling + # the commit is in 3.0.6 + # https://gitlab.gnome.org/GNOME/libsoup/-/commit/5280e936d0a76f94dbc5d8489cfbdc0a06343f65 + substituteInPlace meson.build \ + --replace "required: vapi_opt)" "required: vapi_opt, native: false)" + + patchShebangs libsoup/ + ''; + + passthru = { + updateScript = gnome.updateScript { + packageName = pname; + versionPolicy = "odd-unstable"; + freeze = true; + }; + }; + + meta = { + description = "HTTP client/server library for GNOME"; + homepage = "https://gitlab.gnome.org/GNOME/libsoup"; + license = lib.licenses.lgpl2Plus; + inherit (glib.meta) maintainers platforms; + pkgConfigModules = [ + "libsoup-2.4" + "libsoup-gnome-2.4" + ]; + }; +} diff --git a/pkgs/by-name/li/libspectre/default.nix b/pkgs/by-name/li/libspectre/default.nix new file mode 100644 index 0000000..9299e4d --- /dev/null +++ b/pkgs/by-name/li/libspectre/default.nix @@ -0,0 +1,38 @@ +{ fetchurl, lib, stdenv, pkg-config, ghostscript, cairo }: + +stdenv.mkDerivation rec { + pname = "libspectre"; + version = "0.2.12"; + + src = fetchurl { + url = "https://libspectre.freedesktop.org/releases/${pname}-${version}.tar.gz"; + hash = "sha256-VadRfNNXK9JWXfDPRQlEoE1Sc7J567NpqJU5GVfw+WA="; + }; + + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ + # Need `libgs.so'. + ghostscript + ]; + + doCheck = true; + + checkInputs = [ + cairo + ]; + + meta = { + homepage = "http://libspectre.freedesktop.org/"; + description = "PostScript rendering library"; + + longDescription = '' + libspectre is a small library for rendering Postscript + documents. It provides a convenient easy to use API for + handling and rendering Postscript documents. + ''; + + license = lib.licenses.gpl2Plus; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/li/libssh2/CVE-2023-48795.patch b/pkgs/by-name/li/libssh2/CVE-2023-48795.patch new file mode 100644 index 0000000..c89e4a1 --- /dev/null +++ b/pkgs/by-name/li/libssh2/CVE-2023-48795.patch @@ -0,0 +1,459 @@ +From d34d9258b8420b19ec3f97b4cc5bf7aa7d98e35a Mon Sep 17 00:00:00 2001 +From: Michael Buckley +Date: Thu, 30 Nov 2023 15:08:02 -0800 +Subject: [PATCH] src: add 'strict KEX' to fix CVE-2023-48795 "Terrapin Attack" + +Refs: +https://terrapin-attack.com/ +https://seclists.org/oss-sec/2023/q4/292 +https://osv.dev/list?ecosystem=&q=CVE-2023-48795 +https://github.com/advisories/GHSA-45x7-px36-x8w8 +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-48795 + +Fixes #1290 +Closes #1291 +--- + src/kex.c | 63 +++++++++++++++++++++++------------ + src/libssh2_priv.h | 18 +++++++--- + src/packet.c | 83 +++++++++++++++++++++++++++++++++++++++++++--- + src/packet.h | 2 +- + src/session.c | 3 ++ + src/transport.c | 12 ++++++- + 6 files changed, 149 insertions(+), 32 deletions(-) + +diff --git a/src/kex.c b/src/kex.c +index 8e7b7f0af3..a7b301e157 100644 +--- a/src/kex.c ++++ b/src/kex.c +@@ -3032,6 +3032,13 @@ kex_method_extension_negotiation = { + 0, + }; + ++static const LIBSSH2_KEX_METHOD ++kex_method_strict_client_extension = { ++ "kex-strict-c-v00@openssh.com", ++ NULL, ++ 0, ++}; ++ + static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { + #if LIBSSH2_ED25519 + &kex_method_ssh_curve25519_sha256, +@@ -3050,6 +3057,7 @@ static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { + &kex_method_diffie_helman_group1_sha1, + &kex_method_diffie_helman_group_exchange_sha1, + &kex_method_extension_negotiation, ++ &kex_method_strict_client_extension, + NULL + }; + +@@ -3302,13 +3310,13 @@ static int kexinit(LIBSSH2_SESSION * session) + return 0; + } + +-/* kex_agree_instr ++/* _libssh2_kex_agree_instr + * Kex specific variant of strstr() + * Needle must be preceded by BOL or ',', and followed by ',' or EOL + */ +-static unsigned char * +-kex_agree_instr(unsigned char *haystack, size_t haystack_len, +- const unsigned char *needle, size_t needle_len) ++unsigned char * ++_libssh2_kex_agree_instr(unsigned char *haystack, size_t haystack_len, ++ const unsigned char *needle, size_t needle_len) + { + unsigned char *s; + unsigned char *end_haystack; +@@ -3393,7 +3401,7 @@ static int kex_agree_hostkey(LIBSSH2_SESSION * session, + while(s && *s) { + unsigned char *p = (unsigned char *) strchr((char *) s, ','); + size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); +- if(kex_agree_instr(hostkey, hostkey_len, s, method_len)) { ++ if(_libssh2_kex_agree_instr(hostkey, hostkey_len, s, method_len)) { + const LIBSSH2_HOSTKEY_METHOD *method = + (const LIBSSH2_HOSTKEY_METHOD *) + kex_get_method_by_name((char *) s, method_len, +@@ -3427,9 +3435,9 @@ static int kex_agree_hostkey(LIBSSH2_SESSION * session, + } + + while(hostkeyp && (*hostkeyp) && (*hostkeyp)->name) { +- s = kex_agree_instr(hostkey, hostkey_len, +- (unsigned char *) (*hostkeyp)->name, +- strlen((*hostkeyp)->name)); ++ s = _libssh2_kex_agree_instr(hostkey, hostkey_len, ++ (unsigned char *) (*hostkeyp)->name, ++ strlen((*hostkeyp)->name)); + if(s) { + /* So far so good, but does it suit our purposes? (Encrypting vs + Signing) */ +@@ -3463,6 +3471,12 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, + { + const LIBSSH2_KEX_METHOD **kexp = libssh2_kex_methods; + unsigned char *s; ++ const unsigned char *strict = ++ (unsigned char *)"kex-strict-s-v00@openssh.com"; ++ ++ if(_libssh2_kex_agree_instr(kex, kex_len, strict, 28)) { ++ session->kex_strict = 1; ++ } + + if(session->kex_prefs) { + s = (unsigned char *) session->kex_prefs; +@@ -3470,7 +3484,7 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, + while(s && *s) { + unsigned char *q, *p = (unsigned char *) strchr((char *) s, ','); + size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); +- q = kex_agree_instr(kex, kex_len, s, method_len); ++ q = _libssh2_kex_agree_instr(kex, kex_len, s, method_len); + if(q) { + const LIBSSH2_KEX_METHOD *method = (const LIBSSH2_KEX_METHOD *) + kex_get_method_by_name((char *) s, method_len, +@@ -3504,9 +3518,9 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, + } + + while(*kexp && (*kexp)->name) { +- s = kex_agree_instr(kex, kex_len, +- (unsigned char *) (*kexp)->name, +- strlen((*kexp)->name)); ++ s = _libssh2_kex_agree_instr(kex, kex_len, ++ (unsigned char *) (*kexp)->name, ++ strlen((*kexp)->name)); + if(s) { + /* We've agreed on a key exchange method, + * Can we agree on a hostkey that works with this kex? +@@ -3550,7 +3564,7 @@ static int kex_agree_crypt(LIBSSH2_SESSION * session, + unsigned char *p = (unsigned char *) strchr((char *) s, ','); + size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); + +- if(kex_agree_instr(crypt, crypt_len, s, method_len)) { ++ if(_libssh2_kex_agree_instr(crypt, crypt_len, s, method_len)) { + const LIBSSH2_CRYPT_METHOD *method = + (const LIBSSH2_CRYPT_METHOD *) + kex_get_method_by_name((char *) s, method_len, +@@ -3572,9 +3586,9 @@ static int kex_agree_crypt(LIBSSH2_SESSION * session, + } + + while(*cryptp && (*cryptp)->name) { +- s = kex_agree_instr(crypt, crypt_len, +- (unsigned char *) (*cryptp)->name, +- strlen((*cryptp)->name)); ++ s = _libssh2_kex_agree_instr(crypt, crypt_len, ++ (unsigned char *) (*cryptp)->name, ++ strlen((*cryptp)->name)); + if(s) { + endpoint->crypt = *cryptp; + return 0; +@@ -3614,7 +3628,7 @@ static int kex_agree_mac(LIBSSH2_SESSION * session, + unsigned char *p = (unsigned char *) strchr((char *) s, ','); + size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); + +- if(kex_agree_instr(mac, mac_len, s, method_len)) { ++ if(_libssh2_kex_agree_instr(mac, mac_len, s, method_len)) { + const LIBSSH2_MAC_METHOD *method = (const LIBSSH2_MAC_METHOD *) + kex_get_method_by_name((char *) s, method_len, + (const LIBSSH2_COMMON_METHOD **) +@@ -3635,8 +3649,9 @@ static int kex_agree_mac(LIBSSH2_SESSION * session, + } + + while(*macp && (*macp)->name) { +- s = kex_agree_instr(mac, mac_len, (unsigned char *) (*macp)->name, +- strlen((*macp)->name)); ++ s = _libssh2_kex_agree_instr(mac, mac_len, ++ (unsigned char *) (*macp)->name, ++ strlen((*macp)->name)); + if(s) { + endpoint->mac = *macp; + return 0; +@@ -3667,7 +3682,7 @@ static int kex_agree_comp(LIBSSH2_SESSION *session, + unsigned char *p = (unsigned char *) strchr((char *) s, ','); + size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); + +- if(kex_agree_instr(comp, comp_len, s, method_len)) { ++ if(_libssh2_kex_agree_instr(comp, comp_len, s, method_len)) { + const LIBSSH2_COMP_METHOD *method = + (const LIBSSH2_COMP_METHOD *) + kex_get_method_by_name((char *) s, method_len, +@@ -3689,8 +3704,9 @@ static int kex_agree_comp(LIBSSH2_SESSION *session, + } + + while(*compp && (*compp)->name) { +- s = kex_agree_instr(comp, comp_len, (unsigned char *) (*compp)->name, +- strlen((*compp)->name)); ++ s = _libssh2_kex_agree_instr(comp, comp_len, ++ (unsigned char *) (*compp)->name, ++ strlen((*compp)->name)); + if(s) { + endpoint->comp = *compp; + return 0; +@@ -3871,6 +3887,7 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, + session->local.kexinit = key_state->oldlocal; + session->local.kexinit_len = key_state->oldlocal_len; + key_state->state = libssh2_NB_state_idle; ++ session->state &= ~LIBSSH2_STATE_INITIAL_KEX; + session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; + session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS; + return -1; +@@ -3896,6 +3913,7 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, + session->local.kexinit = key_state->oldlocal; + session->local.kexinit_len = key_state->oldlocal_len; + key_state->state = libssh2_NB_state_idle; ++ session->state &= ~LIBSSH2_STATE_INITIAL_KEX; + session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; + session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS; + return -1; +@@ -3944,6 +3962,7 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, + session->remote.kexinit = NULL; + } + ++ session->state &= ~LIBSSH2_STATE_INITIAL_KEX; + session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; + session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS; + +diff --git a/src/libssh2_priv.h b/src/libssh2_priv.h +index 7660366954..18d9ab2130 100644 +--- a/src/libssh2_priv.h ++++ b/src/libssh2_priv.h +@@ -736,6 +736,9 @@ struct _LIBSSH2_SESSION + /* key signing algorithm preferences -- NULL yields server order */ + char *sign_algo_prefs; + ++ /* Whether to use the OpenSSH Strict KEX extension */ ++ int kex_strict; ++ + /* (remote as source of data -- packet_read ) */ + libssh2_endpoint_data remote; + +@@ -908,6 +911,7 @@ struct _LIBSSH2_SESSION + int fullpacket_macstate; + size_t fullpacket_payload_len; + int fullpacket_packet_type; ++ uint32_t fullpacket_required_type; + + /* State variables used in libssh2_sftp_init() */ + libssh2_nonblocking_states sftpInit_state; +@@ -948,10 +952,11 @@ struct _LIBSSH2_SESSION + }; + + /* session.state bits */ +-#define LIBSSH2_STATE_EXCHANGING_KEYS 0x00000001 +-#define LIBSSH2_STATE_NEWKEYS 0x00000002 +-#define LIBSSH2_STATE_AUTHENTICATED 0x00000004 +-#define LIBSSH2_STATE_KEX_ACTIVE 0x00000008 ++#define LIBSSH2_STATE_INITIAL_KEX 0x00000001 ++#define LIBSSH2_STATE_EXCHANGING_KEYS 0x00000002 ++#define LIBSSH2_STATE_NEWKEYS 0x00000004 ++#define LIBSSH2_STATE_AUTHENTICATED 0x00000008 ++#define LIBSSH2_STATE_KEX_ACTIVE 0x00000010 + + /* session.flag helpers */ + #ifdef MSG_NOSIGNAL +@@ -1182,6 +1187,11 @@ ssize_t _libssh2_send(libssh2_socket_t socket, const void *buffer, + int _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, + key_exchange_state_t * state); + ++unsigned char *_libssh2_kex_agree_instr(unsigned char *haystack, ++ size_t haystack_len, ++ const unsigned char *needle, ++ size_t needle_len); ++ + /* Let crypt.c/hostkey.c expose their method structs */ + const LIBSSH2_CRYPT_METHOD **libssh2_crypt_methods(void); + const LIBSSH2_HOSTKEY_METHOD **libssh2_hostkey_methods(void); +diff --git a/src/packet.c b/src/packet.c +index eccb8c56a8..6da14e9fa1 100644 +--- a/src/packet.c ++++ b/src/packet.c +@@ -624,14 +624,13 @@ packet_authagent_open(LIBSSH2_SESSION * session, + * layer when it has received a packet. + * + * The input pointer 'data' is pointing to allocated data that this function +- * is asked to deal with so on failure OR success, it must be freed fine. +- * The only exception is when the return code is LIBSSH2_ERROR_EAGAIN. ++ * will be freed unless return the code is LIBSSH2_ERROR_EAGAIN. + * + * This function will always be called with 'datalen' greater than zero. + */ + int + _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, +- size_t datalen, int macstate) ++ size_t datalen, int macstate, uint32_t seq) + { + int rc = 0; + unsigned char *message = NULL; +@@ -676,6 +675,70 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, + break; + } + ++ if(session->state & LIBSSH2_STATE_INITIAL_KEX) { ++ if(msg == SSH_MSG_KEXINIT) { ++ if(!session->kex_strict) { ++ if(datalen < 17) { ++ LIBSSH2_FREE(session, data); ++ session->packAdd_state = libssh2_NB_state_idle; ++ return _libssh2_error(session, ++ LIBSSH2_ERROR_BUFFER_TOO_SMALL, ++ "Data too short extracting kex"); ++ } ++ else { ++ const unsigned char *strict = ++ (unsigned char *)"kex-strict-s-v00@openssh.com"; ++ struct string_buf buf; ++ unsigned char *algs = NULL; ++ size_t algs_len = 0; ++ ++ buf.data = (unsigned char *)data; ++ buf.dataptr = buf.data; ++ buf.len = datalen; ++ buf.dataptr += 17; /* advance past type and cookie */ ++ ++ if(_libssh2_get_string(&buf, &algs, &algs_len)) { ++ LIBSSH2_FREE(session, data); ++ session->packAdd_state = libssh2_NB_state_idle; ++ return _libssh2_error(session, ++ LIBSSH2_ERROR_BUFFER_TOO_SMALL, ++ "Algs too short"); ++ } ++ ++ if(algs_len == 0 || ++ _libssh2_kex_agree_instr(algs, algs_len, strict, 28)) { ++ session->kex_strict = 1; ++ } ++ } ++ } ++ ++ if(session->kex_strict && seq) { ++ LIBSSH2_FREE(session, data); ++ session->socket_state = LIBSSH2_SOCKET_DISCONNECTED; ++ session->packAdd_state = libssh2_NB_state_idle; ++ libssh2_session_disconnect(session, "strict KEX violation: " ++ "KEXINIT was not the first packet"); ++ ++ return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT, ++ "strict KEX violation: " ++ "KEXINIT was not the first packet"); ++ } ++ } ++ ++ if(session->kex_strict && session->fullpacket_required_type && ++ session->fullpacket_required_type != msg) { ++ LIBSSH2_FREE(session, data); ++ session->socket_state = LIBSSH2_SOCKET_DISCONNECTED; ++ session->packAdd_state = libssh2_NB_state_idle; ++ libssh2_session_disconnect(session, "strict KEX violation: " ++ "unexpected packet type"); ++ ++ return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT, ++ "strict KEX violation: " ++ "unexpected packet type"); ++ } ++ } ++ + if(session->packAdd_state == libssh2_NB_state_allocated) { + /* A couple exceptions to the packet adding rule: */ + switch(msg) { +@@ -1364,6 +1427,15 @@ _libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type, + + return 0; + } ++ else if(session->kex_strict && ++ (session->state & LIBSSH2_STATE_INITIAL_KEX)) { ++ libssh2_session_disconnect(session, "strict KEX violation: " ++ "unexpected packet type"); ++ ++ return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_DISCONNECT, ++ "strict KEX violation: " ++ "unexpected packet type"); ++ } + packet = _libssh2_list_next(&packet->node); + } + return -1; +@@ -1425,7 +1497,10 @@ _libssh2_packet_require(LIBSSH2_SESSION * session, unsigned char packet_type, + } + + while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) { +- int ret = _libssh2_transport_read(session); ++ int ret; ++ session->fullpacket_required_type = packet_type; ++ ret = _libssh2_transport_read(session); ++ session->fullpacket_required_type = 0; + if(ret == LIBSSH2_ERROR_EAGAIN) + return ret; + else if(ret < 0) { +diff --git a/src/packet.h b/src/packet.h +index 1d90b8af12..955351e5f6 100644 +--- a/src/packet.h ++++ b/src/packet.h +@@ -72,6 +72,6 @@ int _libssh2_packet_burn(LIBSSH2_SESSION * session, + int _libssh2_packet_write(LIBSSH2_SESSION * session, unsigned char *data, + unsigned long data_len); + int _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, +- size_t datalen, int macstate); ++ size_t datalen, int macstate, uint32_t seq); + + #endif /* LIBSSH2_PACKET_H */ +diff --git a/src/session.c b/src/session.c +index 35e7929fe7..9d89ade8ec 100644 +--- a/src/session.c ++++ b/src/session.c +@@ -469,6 +469,8 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)), + session->abstract = abstract; + session->api_timeout = 0; /* timeout-free API by default */ + session->api_block_mode = 1; /* blocking API by default */ ++ session->state = LIBSSH2_STATE_INITIAL_KEX; ++ session->fullpacket_required_type = 0; + session->packet_read_timeout = LIBSSH2_DEFAULT_READ_TIMEOUT; + session->flag.quote_paths = 1; /* default behavior is to quote paths + for the scp subsystem */ +@@ -1223,6 +1225,7 @@ libssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason, + const char *desc, const char *lang) + { + int rc; ++ session->state &= ~LIBSSH2_STATE_INITIAL_KEX; + session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS; + BLOCK_ADJUST(rc, session, + session_disconnect(session, reason, desc, lang)); +diff --git a/src/transport.c b/src/transport.c +index 21be9d2b80..a8bb588a4b 100644 +--- a/src/transport.c ++++ b/src/transport.c +@@ -186,6 +186,7 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) + struct transportpacket *p = &session->packet; + int rc; + int compressed; ++ uint32_t seq = session->remote.seqno; + + if(session->fullpacket_state == libssh2_NB_state_idle) { + session->fullpacket_macstate = LIBSSH2_MAC_CONFIRMED; +@@ -317,7 +318,7 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) + if(session->fullpacket_state == libssh2_NB_state_created) { + rc = _libssh2_packet_add(session, p->payload, + session->fullpacket_payload_len, +- session->fullpacket_macstate); ++ session->fullpacket_macstate, seq); + if(rc == LIBSSH2_ERROR_EAGAIN) + return rc; + if(rc) { +@@ -328,6 +329,11 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) + + session->fullpacket_state = libssh2_NB_state_idle; + ++ if(session->kex_strict && ++ session->fullpacket_packet_type == SSH_MSG_NEWKEYS) { ++ session->remote.seqno = 0; ++ } ++ + return session->fullpacket_packet_type; + } + +@@ -1093,6 +1099,10 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, + + session->local.seqno++; + ++ if(session->kex_strict && data[0] == SSH_MSG_NEWKEYS) { ++ session->local.seqno = 0; ++ } ++ + ret = LIBSSH2_SEND(session, p->outbuf, total_length, + LIBSSH2_SOCKET_SEND_FLAGS(session)); + if(ret < 0) diff --git a/pkgs/by-name/li/libssh2/default.nix b/pkgs/by-name/li/libssh2/default.nix new file mode 100644 index 0000000..f7a51da --- /dev/null +++ b/pkgs/by-name/li/libssh2/default.nix @@ -0,0 +1,31 @@ +{ lib, stdenv, fetchurl, openssl, zlib, windows }: + +stdenv.mkDerivation rec { + pname = "libssh2"; + version = "1.11.0"; + + src = fetchurl { + url = "https://www.libssh2.org/download/libssh2-${version}.tar.gz"; + sha256 = "sha256-NzYWHkHiaTMk3rOMJs/cPv5iCdY0ukJY2xzs/2pa1GE="; + }; + + patches = [ + # fetchpatch cannot be used due to infinite recursion + # https://github.com/libssh2/libssh2/commit/d34d9258b8420b19ec3f97b4cc5bf7aa7d98e35a + ./CVE-2023-48795.patch + ]; + + outputs = [ "out" "dev" "devdoc" ]; + + propagatedBuildInputs = [ openssl ]; # see Libs: in libssh2.pc + buildInputs = [ zlib ] + ++ lib.optional stdenv.hostPlatform.isMinGW windows.mingw_w64; + + meta = with lib; { + description = "A client-side C library implementing the SSH2 protocol"; + homepage = "https://www.libssh2.org"; + platforms = platforms.all; + license = with licenses; [ bsd3 libssh2 ]; + maintainers = with maintainers; [ SuperSandro2000 ]; + }; +} diff --git a/pkgs/by-name/li/libstemmer/default.nix b/pkgs/by-name/li/libstemmer/default.nix new file mode 100644 index 0000000..3f66ee9 --- /dev/null +++ b/pkgs/by-name/li/libstemmer/default.nix @@ -0,0 +1,40 @@ +{ lib, stdenv, fetchFromGitHub, perl, buildPackages }: + +stdenv.mkDerivation rec { + pname = "libstemmer"; + version = "2.2.0"; + + src = fetchFromGitHub { + owner = "snowballstem"; + repo = "snowball"; + rev = "v${version}"; + sha256 = "sha256-qXrypwv/I+5npvGHGsHveijoui0ZnoGYhskCfLkewVE="; + }; + + nativeBuildInputs = [ perl ]; + + prePatch = '' + patchShebangs . + '' + lib.optionalString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' + substituteInPlace GNUmakefile \ + --replace './snowball' '${lib.getBin buildPackages.libstemmer}/bin/snowball' + ''; + + makeTarget = "libstemmer.a"; + + installPhase = '' + runHook preInstall + install -Dt $out/lib libstemmer.a + install -Dt $out/include include/libstemmer.h + install -Dt $out/bin {snowball,stemwords} + runHook postInstall + ''; + + meta = with lib; { + description = "Snowball Stemming Algorithms"; + homepage = "https://snowballstem.org/"; + license = licenses.bsd3; + maintainers = with maintainers; [ fpletz ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/li/libtiff/default.nix b/pkgs/by-name/li/libtiff/default.nix new file mode 100644 index 0000000..10363e7 --- /dev/null +++ b/pkgs/by-name/li/libtiff/default.nix @@ -0,0 +1,99 @@ +{ lib +, stdenv +, fetchFromGitLab +# , nix-update-script + +, autoreconfHook +, pkg-config +, sphinx + +, lerc +, libdeflate +, libjpeg +, xz +, zlib + + # for passthru.tests +# , libgeotiff +# , python3Packages +# , imagemagick +# , graphicsmagick +# , gdal +# , openimageio +# , freeimage +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libtiff"; + version = "4.6.0"; + + src = fetchFromGitLab { + owner = "libtiff"; + repo = "libtiff"; + rev = "v${finalAttrs.version}"; + hash = "sha256-qCg5qjsPPynCHIg0JsPJldwVdcYkI68zYmyNAKUCoyw="; + }; + + patches = [ + # FreeImage needs this patch + ./headers.patch + # libc++abi 11 has an `#include `, this picks up files name + # `version` in the project's include paths + ./rename-version.patch + ]; + + postPatch = '' + mv VERSION VERSION.txt + ''; + + outputs = [ "bin" "dev" "dev_private" "out" "man" "doc" ]; + + postFixup = '' + moveToOutput include/tif_config.h $dev_private + moveToOutput include/tif_dir.h $dev_private + moveToOutput include/tif_hash_set.h $dev_private + moveToOutput include/tiffiop.h $dev_private + ''; + + # If you want to change to a different build system, please make + # sure cross-compilation works first! + nativeBuildInputs = [ autoreconfHook pkg-config sphinx ]; + + buildInputs = [ + lerc + ]; + + # TODO: opengl support (bogus configure detection) + propagatedBuildInputs = [ + libdeflate + libjpeg + xz + zlib + ]; + + enableParallelBuilding = true; + + doCheck = true; + + # passthru = { + # tests = { + # inherit libgeotiff imagemagick graphicsmagick gdal openimageio freeimage; + # inherit (python3Packages) pillow imread; + # pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + # updateScript = nix-update-script { }; + # }; + + meta = with lib; { + description = "Library and utilities for working with the TIFF image file format"; + homepage = "https://libtiff.gitlab.io/libtiff"; + changelog = "https://libtiff.gitlab.io/libtiff/releases/v${finalAttrs.version}.html"; + license = licenses.libtiff; + platforms = platforms.unix ++ platforms.windows; + pkgConfigModules = [ "libtiff-4" ]; + maintainers = []; + }; +}) diff --git a/pkgs/by-name/li/libtiff/headers.patch b/pkgs/by-name/li/libtiff/headers.patch new file mode 100644 index 0000000..933e06f --- /dev/null +++ b/pkgs/by-name/li/libtiff/headers.patch @@ -0,0 +1,16 @@ +export private headers for freeimage +--- i/libtiff/Makefile.am ++++ w/libtiff/Makefile.am +@@ -36,8 +36,12 @@ EXTRA_DIST = \ + tif_win32_versioninfo.rc + + libtiffinclude_HEADERS = \ ++ tif_config.h \ ++ tif_dir.h \ ++ tif_hash_set.h \ + tiff.h \ + tiffio.h \ ++ tiffiop.h \ + tiffvers.h + + if HAVE_CXX diff --git a/pkgs/by-name/li/libtiff/libtiff_t.nix b/pkgs/by-name/li/libtiff/libtiff_t.nix new file mode 100644 index 0000000..37e48f6 --- /dev/null +++ b/pkgs/by-name/li/libtiff/libtiff_t.nix @@ -0,0 +1,73 @@ +{ lib +, stdenv +, fetchzip + +, autoreconfHook +, pkg-config +, sphinx + +, libdeflate +, libjpeg +, xz +, zlib +}: + +# This is a fork created by the hylafaxplus developer to +# restore tools dropped by original libtiff in version 4.6.0. + +stdenv.mkDerivation (finalAttrs: { + pname = "libtiff_t"; + version = "4.6.0t"; + + src = fetchzip { + url = "http://www.libtiff.org/downloads/tiff-${finalAttrs.version}.tar.xz"; + hash = "sha256-9ov4w2jw4LtKr82/4jWMAGhc5GEdviJ7bT+y0+U/Ac4="; + }; + + patches = [ + # FreeImage needs this patch + ./headers.patch + # libc++abi 11 has an `#include `, this picks up files name + # `version` in the project's include paths + ./rename-version.patch + ]; + + postPatch = '' + mv VERSION VERSION.txt + ''; + + outputs = [ "bin" "dev" "dev_private" "out" "man" "doc" ]; + + postFixup = '' + moveToOutput include/tif_config.h $dev_private + moveToOutput include/tif_dir.h $dev_private + moveToOutput include/tif_hash_set.h $dev_private + moveToOutput include/tiffiop.h $dev_private + ''; + + # If you want to change to a different build system, please make + # sure cross-compilation works first! + nativeBuildInputs = [ autoreconfHook pkg-config sphinx ]; + + # TODO: opengl support (bogus configure detection) + propagatedBuildInputs = [ + libdeflate + libjpeg + xz + zlib + ]; + + enableParallelBuilding = true; + + doCheck = true; + + meta = with lib; { + description = "Library and utilities for working with the TIFF image file format (fork containing tools dropped in original libtiff version)"; + homepage = "http://www.libtiff.org"; + changelog = "http://www.libtiff.org/releases/v${finalAttrs.version}.html"; + maintainers = with maintainers; [ yarny ]; + license = licenses.libtiff; + platforms = platforms.unix ++ platforms.windows; + pkgConfigModules = [ "libtiff-4" ]; + }; +}) diff --git a/pkgs/by-name/li/libtiff/packages.nix b/pkgs/by-name/li/libtiff/packages.nix new file mode 100644 index 0000000..1ae1e5d --- /dev/null +++ b/pkgs/by-name/li/libtiff/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit + ({ + libtiff = callPackage ./. { }; + libtiff_t = callPackage ./libtiff_t.nix { }; + }) + libtiff + libtiff_t + ; +} diff --git a/pkgs/by-name/li/libtiff/rename-version.patch b/pkgs/by-name/li/libtiff/rename-version.patch new file mode 100644 index 0000000..04fa1bf --- /dev/null +++ b/pkgs/by-name/li/libtiff/rename-version.patch @@ -0,0 +1,21 @@ +fix case-insensitive build +--- a/Makefile.am ++++ b/Makefile.am +@@ -34,7 +34,7 @@ docfiles = \ + README.md \ + RELEASE-DATE \ + TODO \ +- VERSION ++ VERSION.txt + + EXTRA_DIST = \ + placeholder.h \ +@@ -68,7 +68,7 @@ NEW_LIBTIFF_RELEASE_DATE=$(shell date +"%Y%m%d") + release: + @(echo --- Setting release date to $(NEW_LIBTIFF_RELEASE_DATE) and release version to $(LIBTIFF_VERSION) ---) + (rm -f $(top_srcdir)/RELEASE-DATE && echo $(NEW_LIBTIFF_RELEASE_DATE) > $(top_srcdir)/RELEASE-DATE) +- (rm -f $(top_srcdir)/VERSION && echo $(LIBTIFF_VERSION) > $(top_srcdir)/VERSION) ++ (rm -f $(top_srcdir)/VERSION && echo $(LIBTIFF_VERSION) > $(top_srcdir)/VERSION.txt) + (rm -f $(top_builddir)/libtiff/tiffvers.h && sed 's,LIBTIFF_VERSION,$(LIBTIFF_VERSION),;s,LIBTIFF_RELEASE_DATE,$(NEW_LIBTIFF_RELEASE_DATE),;s,LIBTIFF_MAJOR_VERSION,$(LIBTIFF_MAJOR_VERSION),;s,LIBTIFF_MINOR_VERSION,$(LIBTIFF_MINOR_VERSION),;s,LIBTIFF_MICRO_VERSION,$(LIBTIFF_MICRO_VERSION),' $(top_srcdir)/libtiff/tiffvers.h.in > $(top_builddir)/libtiff/tiffvers.h && sed -i 's,@,,g' $(top_builddir)/libtiff/tiffvers.h) + + pkgconfigdir = $(libdir)/pkgconfig diff --git a/pkgs/by-name/li/libtool/default.nix b/pkgs/by-name/li/libtool/default.nix new file mode 100644 index 0000000..6970d2a --- /dev/null +++ b/pkgs/by-name/li/libtool/default.nix @@ -0,0 +1,40 @@ +{lib, stdenv, fetchurl, m4, perl}: + +stdenv.mkDerivation rec { + pname = "libtool"; + version = "1.5.26"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.gz"; + sha256 = "029ggq5kri1gjn6nfqmgw4w920gyfzscjjxbsxxidal5zqsawd8w"; + }; + + nativeBuildInputs = [m4]; + buildInputs = [perl]; + + # Don't fixup "#! /bin/sh" in Libtool, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + dontFixLibtool = true; + + meta = { + description = "Generic library support script"; + + longDescription = '' + GNU libtool is a generic library support script. Libtool hides + the complexity of using shared libraries behind a consistent, + portable interface. + + To use libtool, add the new generic library building commands to + your Makefile, Makefile.in, or Makefile.am. See the + documentation for details. + ''; + + homepage = "https://www.gnu.org/software/libtool/"; + + license = lib.licenses.gpl2Plus; + platforms = lib.platforms.unix; + + mainProgram = "libtool"; + }; +} diff --git a/pkgs/by-name/li/libtool/libtool2.nix b/pkgs/by-name/li/libtool/libtool2.nix new file mode 100644 index 0000000..50c064c --- /dev/null +++ b/pkgs/by-name/li/libtool/libtool2.nix @@ -0,0 +1,73 @@ +{ lib, stdenv, fetchurl, fetchpatch, m4 +, runtimeShell +, file +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "libtool"; + version = "2.4.7"; + + src = fetchurl { + url = "mirror://gnu/libtool/${pname}-${version}.tar.gz"; + sha256 = "sha256-BOlsJATqcMWQxUbrpCAqThJyLGQAFsErmy8c49SB6ag="; + }; + + outputs = [ "out" "lib" ]; + + # FILECMD was added in libtool 2.4.7; previous versions hardwired `/usr/bin/file` + # https://lists.gnu.org/archive/html/autotools-announce/2022-03/msg00000.html + FILECMD = "${file}/bin/file"; + + postPatch = + # libtool commit da2e352735722917bf0786284411262195a6a3f6 changed + # the shebang from `/bin/sh` (which is a special sandbox exception) + # to `/usr/bin/env sh`, meaning that we now need to patch shebangs + # in libtoolize.in: + '' + substituteInPlace libtoolize.in --replace '#! /usr/bin/env sh' '#!${runtimeShell}' + # avoid help2man run after 'libtoolize.in' update + touch doc/libtoolize.1 + ''; + + strictDeps = true; + # As libtool is an early bootstrap dependency try hard not to + # add autoconf and automake or help2man dependencies here. That way we can + # avoid pulling in perl and get away with just an `m4` depend. + nativeBuildInputs = [ m4 file ]; + propagatedBuildInputs = [ m4 file ]; + + # Don't fixup "#! /bin/sh" in Libtool, otherwise it will use the + # "fixed" path in generated files! + dontPatchShebangs = true; + dontFixLibtool = true; + + # XXX: The GNU ld wrapper does all sorts of nasty things wrt. RPATH, which + # leads to the failure of a number of tests. + doCheck = false; + doInstallCheck = false; + + enableParallelBuilding = true; + + meta = with lib; { + description = "GNU Libtool, a generic library support script"; + longDescription = '' + GNU libtool is a generic library support script. Libtool hides + the complexity of using shared libraries behind a consistent, + portable interface. + + To use libtool, add the new generic library building commands to + your Makefile, Makefile.in, or Makefile.am. See the + documentation for details. + ''; + homepage = "https://www.gnu.org/software/libtool/"; + license = licenses.gpl2Plus; + maintainers = [ ]; + platforms = platforms.unix; + mainProgram = "libtool"; + }; +} diff --git a/pkgs/by-name/li/libtool/packages.nix b/pkgs/by-name/li/libtool/packages.nix new file mode 100644 index 0000000..4e0206c --- /dev/null +++ b/pkgs/by-name/li/libtool/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libtool = libtool_2; + libtool_1_5 = callPackage ./. { }; + libtool_2 = callPackage ./libtool2.nix { }; +} diff --git a/pkgs/by-name/li/libuchardet/default.nix b/pkgs/by-name/li/libuchardet/default.nix new file mode 100644 index 0000000..642c39e --- /dev/null +++ b/pkgs/by-name/li/libuchardet/default.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, fetchurl, cmake }: + +stdenv.mkDerivation rec { + pname = "uchardet"; + version = "0.0.8"; + + outputs = [ "bin" "out" "man" "dev" ]; + + src = fetchurl { + url = "https://www.freedesktop.org/software/${pname}/releases/${pname}-${version}.tar.xz"; + sha256 = "sha256-6Xpgz8AKHBR6Z0sJe7FCKr2fp4otnOPz/cwueKNKxfA="; + }; + + nativeBuildInputs = [ cmake ]; + + doCheck = !stdenv.isi686; # tests fail on i686 + + meta = with lib; { + description = "Mozilla's Universal Charset Detector C/C++ API"; + mainProgram = "uchardet"; + homepage = "https://www.freedesktop.org/wiki/Software/uchardet/"; + license = licenses.mpl11; + maintainers = with maintainers; [ ]; + platforms = with platforms; unix; + }; +} diff --git a/pkgs/by-name/li/libunistring/default.nix b/pkgs/by-name/li/libunistring/default.nix new file mode 100644 index 0000000..51eb555 --- /dev/null +++ b/pkgs/by-name/li/libunistring/default.nix @@ -0,0 +1,74 @@ +{ fetchurl, lib, stdenv, libiconv }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "libunistring"; + version = "1.1"; + + src = fetchurl { + url = "mirror://gnu/libunistring/${pname}-${version}.tar.gz"; + sha256 = "sha256-oiUr7uyDCsREufaNazitiD2xmRnbNbUiIs+CfDhb22o="; + }; + + outputs = [ "out" "dev" "info" "doc" ]; + + strictDeps = true; + propagatedBuildInputs = lib.optional (!stdenv.isLinux) libiconv; + + configureFlags = [ + "--with-libiconv-prefix=${libiconv}" + ]; + + doCheck = false; + + /* This seems to cause several random failures like these, which I assume + is because of bad or missing target dependencies in their build system: + + ./unistdio/test-u16-vasnprintf2.sh: line 16: ./test-u16-vasnprintf1: No such file or directory + FAIL unistdio/test-u16-vasnprintf2.sh (exit status: 1) + + FAIL: unistdio/test-u16-vasnprintf3.sh + ====================================== + + ./unistdio/test-u16-vasnprintf3.sh: line 16: ./test-u16-vasnprintf1: No such file or directory + FAIL unistdio/test-u16-vasnprintf3.sh (exit status: 1) + */ + enableParallelChecking = false; + enableParallelBuilding = true; + + meta = { + homepage = "https://www.gnu.org/software/libunistring/"; + + description = "Unicode string library"; + + longDescription = '' + This library provides functions for manipulating Unicode strings + and for manipulating C strings according to the Unicode + standard. + + GNU libunistring is for you if your application involves + non-trivial text processing, such as upper/lower case + conversions, line breaking, operations on words, or more + advanced analysis of text. Text provided by the user can, in + general, contain characters of all kinds of scripts. The text + processing functions provided by this library handle all scripts + and all languages. + + libunistring is for you if your application already uses the ISO + C / POSIX , functions and the text it + operates on is provided by the user and can be in any language. + + libunistring is also for you if your application uses Unicode + strings as internal in-memory representation. + ''; + + license = lib.licenses.lgpl3Plus; + + maintainers = [ ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/li/libunwind/default.nix b/pkgs/by-name/li/libunwind/default.nix new file mode 100644 index 0000000..5144abc --- /dev/null +++ b/pkgs/by-name/li/libunwind/default.nix @@ -0,0 +1,56 @@ +{ stdenv, lib, fetchFromGitHub, fetchpatch, autoreconfHook, xz, buildPackages }: + +stdenv.mkDerivation rec { + pname = "libunwind"; + version = "1.8.1"; + + src = fetchFromGitHub { + owner = "libunwind"; + repo = "libunwind"; + rev = "v${version}"; + hash = "sha256-rCFBHs6rCSnp5FEwbUR5veNNTqSQpFblAv8ebSPX0qE="; + }; + + postPatch = if (stdenv.cc.isClang || stdenv.hostPlatform.isStatic) then '' + substituteInPlace configure.ac --replace "-lgcc_s" "" + '' else lib.optionalString stdenv.hostPlatform.isMusl '' + substituteInPlace configure.ac --replace "-lgcc_s" "-lgcc_eh" + ''; + + nativeBuildInputs = [ autoreconfHook ]; + + outputs = [ "out" "dev" "devman" ]; + + configureFlags = [ + # Starting from 1.8.1 libunwind installs testsuite by default. + # As we don't run the tests we disable it (this also fixes circular + # reference install failure). + "--disable-tests" + # Without latex2man, no man pages are installed despite being + # prebuilt in the source tarball. + "LATEX2MAN=${buildPackages.coreutils}/bin/true" + ] + # See https://github.com/libunwind/libunwind/issues/693 + ++ lib.optionals (with stdenv.hostPlatform; isAarch64 && isMusl && !isStatic) [ + "CFLAGS=-mno-outline-atomics" + ]; + + propagatedBuildInputs = [ xz ]; + + postInstall = '' + find $out -name \*.la | while read file; do + sed -i 's,-llzma,${xz.out}/lib/liblzma.la,' $file + done + ''; + + doCheck = false; # fails + + meta = with lib; { + homepage = "https://www.nongnu.org/libunwind"; + description = "A portable and efficient API to determine the call-chain of a program"; + maintainers = with maintainers; [ orivej ]; + # https://github.com/libunwind/libunwind#libunwind + platforms = [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-freebsd" "i686-linux" "loongarch64-linux" "mips64el-linux" "mipsel-linux" "powerpc64-linux" "powerpc64le-linux" "riscv64-linux" "s390x-linux" "x86_64-freebsd" "x86_64-linux" "x86_64-solaris" ]; + license = licenses.mit; + }; +} diff --git a/pkgs/by-name/li/libunwind/packages.nix b/pkgs/by-name/li/libunwind/packages.nix new file mode 100644 index 0000000..2f30259 --- /dev/null +++ b/pkgs/by-name/li/libunwind/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libunwind = + if stdenv.isDarwin then darwin.libunwind + else if stdenv.hostPlatform.system == "riscv32-linux" then llvmPackages_14.libunwind + else callPackage ./. { }; +} diff --git a/pkgs/by-name/li/libuv/default.nix b/pkgs/by-name/li/libuv/default.nix new file mode 100644 index 0000000..5c79ba1 --- /dev/null +++ b/pkgs/by-name/li/libuv/default.nix @@ -0,0 +1,128 @@ +{ stdenv +, lib +, fetchFromGitHub +, autoconf +, automake +, libtool +, pkg-config +, pkgsStatic + +# for passthru.tests +# , bind +# , cmake +# , knot-resolver +# , lispPackages +# , luajitPackages +# , mosquitto +# , neovim +# , nodejs +# , ocamlPackages +# , python3 +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + version = "1.48.0"; + pname = "libuv"; + + src = fetchFromGitHub { + owner = "libuv"; + repo = "libuv"; + rev = "v${finalAttrs.version}"; + hash = "sha256-U68BmIQNpmIy3prS7LkYl+wvDJQNikoeFiKh50yQFoA="; + }; + + outputs = [ "out" "dev" ]; + + postPatch = let + toDisable = [ + "getnameinfo_basic" "udp_send_hang_loop" # probably network-dependent + "tcp_connect_timeout" # tries to reach out to 8.8.8.8 + "spawn_setuid_fails" "spawn_setgid_fails" "fs_chown" # user namespaces + "getaddrinfo_fail" "getaddrinfo_fail_sync" "tcp_connect6_link_local" + "threadpool_multiple_event_loops" # times out on slow machines + "get_passwd" # passed on NixOS but failed on other Linuxes + "tcp_writealot" "udp_multicast_join" "udp_multicast_join6" "metrics_pool_events" # times out sometimes + "fs_fstat" # https://github.com/libuv/libuv/issues/2235#issuecomment-1012086927 + + # Assertion failed in test/test-tcp-bind6-error.c on line 60: r == UV_EADDRINUSE + # Assertion failed in test/test-tcp-bind-error.c on line 99: r == UV_EADDRINUSE + "tcp_bind6_error_addrinuse" "tcp_bind_error_addrinuse_listen" + # https://github.com/libuv/libuv/pull/4075#issuecomment-1935572237 + "thread_priority" + ] ++ lib.optionals stdenv.isDarwin [ + # Sometimes: timeout (no output), failed uv_listen. Someone + # should report these failures to libuv team. There tests should + # be much more robust. + "process_title" "emfile" "poll_duplex" "poll_unidirectional" + "ipc_listen_before_write" "ipc_listen_after_write" "ipc_tcp_connection" + "tcp_alloc_cb_fail" "tcp_ping_pong" "tcp_ref3" "tcp_ref4" + "tcp_bind6_error_inval" "tcp_bind6_error_addrinuse" "tcp_read_stop" + "tcp_unexpected_read" "tcp_write_to_half_open_connection" + "tcp_oob" "tcp_close_accept" "tcp_create_early_accept" + "tcp_create_early" "tcp_close" "tcp_bind_error_inval" + "tcp_bind_error_addrinuse" "tcp_shutdown_after_write" + "tcp_open" "tcp_write_queue_order" "tcp_try_write" "tcp_writealot" + "multiple_listen" "delayed_accept" "udp_recv_in_a_row" + "shutdown_close_tcp" "shutdown_eof" "shutdown_twice" "callback_stack" + "tty_pty" "condvar_5" "hrtime" "udp_multicast_join" + # Tests that fail when sandboxing is enabled. + "fs_event_close_in_callback" "fs_event_watch_dir" "fs_event_error_reporting" + "fs_event_watch_dir_recursive" "fs_event_watch_file" + "fs_event_watch_file_current_dir" "fs_event_watch_file_exact_path" + "process_priority" "udp_create_early_bad_bind" + ] ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [ + # fail on macos < 10.15 (starting in libuv 1.47.0) + "fs_write_alotof_bufs_with_offset" "fs_write_multiple_bufs" "fs_read_bufs" + ] ++ lib.optionals stdenv.isAarch32 [ + # I observe this test failing with some regularity on ARMv7: + # https://github.com/libuv/libuv/issues/1871 + "shutdown_close_pipe" + ]; + tdRegexp = lib.concatStringsSep "\\|" toDisable; + in lib.optionalString (finalAttrs.finalPackage.doCheck) '' + sed '/${tdRegexp}/d' -i test/test-list.h + ''; + + nativeBuildInputs = [ automake autoconf libtool pkg-config ]; + + preConfigure = '' + LIBTOOLIZE=libtoolize ./autogen.sh + ''; + + enableParallelBuilding = true; + + # separateDebugInfo breaks static build + # https://github.com/NixOS/nixpkgs/issues/219466 + separateDebugInfo = !stdenv.hostPlatform.isStatic; + + doCheck = + # routinely hangs on powerpc64le + !stdenv.hostPlatform.isPower64; + + # Some of the tests use localhost networking. + __darwinAllowLocalNetworking = true; + + # passthru.tests = { + # inherit bind cmake knot-resolver mosquitto neovim nodejs; + # inherit (lispPackages) cl-libuv; + # luajit-libluv = luajitPackages.libluv; + # luajit-luv = luajitPackages.luv; + # ocaml-luv = ocamlPackages.luv; + # python-pyuv = python3.pkgs.pyuv; + # python-uvloop = python3.pkgs.uvloop; + # static = pkgsStatic.libuv; + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # }; + + meta = with lib; { + description = "A multi-platform support library with a focus on asynchronous I/O"; + homepage = "https://libuv.org/"; + changelog = "https://github.com/libuv/libuv/blob/v${finalAttrs.version}/ChangeLog"; + pkgConfigModules = [ "libuv" ]; + maintainers = with maintainers; [ ]; + platforms = platforms.all; + license = with licenses; [ mit isc bsd2 bsd3 cc-by-40 ]; + }; + +}) diff --git a/pkgs/by-name/li/libuv/packages.nix b/pkgs/by-name/li/libuv/packages.nix new file mode 100644 index 0000000..4db7a03 --- /dev/null +++ b/pkgs/by-name/li/libuv/packages.nix @@ -0,0 +1,7 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libuv = darwin.apple_sdk_11_0.callPackage ./. { }; +} diff --git a/pkgs/by-name/li/libverto/default.nix b/pkgs/by-name/li/libverto/default.nix new file mode 100644 index 0000000..d161f2b --- /dev/null +++ b/pkgs/by-name/li/libverto/default.nix @@ -0,0 +1,54 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook +, glib +, libev +, libevent +, pkg-config +, glibSupport ? true +, libevSupport ? true +, libeventSupport ? true +}: + +let + inherit (lib) optional; +in +stdenv.mkDerivation (finalAttrs: { + pname = "libverto"; + version = "0.3.2"; + + src = fetchFromGitHub { + owner = "latchset"; + repo = "libverto"; + rev = finalAttrs.version; + hash = "sha256-csoJ0WdKyrza8kBSMKoaItKvcbijI6Wl8nWCbywPScQ="; + }; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + ]; + + buildInputs = + optional glibSupport glib + ++ optional libevSupport libev + ++ optional libeventSupport libevent; + + meta = with lib; { + homepage = "https://github.com/latchset/libverto"; + description = "Asynchronous event loop abstraction library"; + longDescription = '' + Libverto exists to solve an important problem: many applications and + libraries are unable to write asynchronous code because they are unable to + pick an event loop. This is particularly true of libraries who want to be + useful to many applications who use loops that do not integrate with one + another or which use home-grown loops. libverto provides a loop-neutral + async api which allows the library to expose asynchronous interfaces and + offload the choice of the main loop to the application. + ''; + license = licenses.mit; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/li/libwebp/default.nix b/pkgs/by-name/li/libwebp/default.nix new file mode 100644 index 0000000..2605dab --- /dev/null +++ b/pkgs/by-name/li/libwebp/default.nix @@ -0,0 +1,77 @@ +{ lib, stdenv, fetchFromGitHub, autoreconfHook, libtool +, threadingSupport ? true # multi-threading +, openglSupport ? false, freeglut, libGL, libGLU # OpenGL (required for vwebp) +, pngSupport ? true, libpng # PNG image format +, jpegSupport ? true, libjpeg # JPEG image format +, tiffSupport ? true, libtiff # TIFF image format +, gifSupport ? true, giflib # GIF image format +, alignedSupport ? false # Force aligned memory operations +, swap16bitcspSupport ? false # Byte swap for 16bit color spaces +, experimentalSupport ? false # Experimental code +, libwebpmuxSupport ? true # Build libwebpmux +, libwebpdemuxSupport ? true # Build libwebpdemux +, libwebpdecoderSupport ? true # Build libwebpdecoder + +# for passthru.tests +, freeimage +, gd +, graphicsmagick +, haskellPackages +, imagemagick +, imlib2 +, libjxl +, opencv +, python3 +, vips +}: + +stdenv.mkDerivation rec { + pname = "libwebp"; + version = "1.3.2"; + + src = fetchFromGitHub { + owner = "webmproject"; + repo = pname; + rev = "v${version}"; + hash = "sha256-UYO2Fmm8nzQR8VBC26wEwWd3qZTD+6MHKcmKBoNcpEE="; + }; + + configureFlags = [ + (lib.enableFeature threadingSupport "threading") + (lib.enableFeature openglSupport "gl") + (lib.enableFeature pngSupport "png") + (lib.enableFeature jpegSupport "jpeg") + (lib.enableFeature tiffSupport "tiff") + (lib.enableFeature gifSupport "gif") + (lib.enableFeature alignedSupport "aligned") + (lib.enableFeature swap16bitcspSupport "swap-16bit-csp") + (lib.enableFeature experimentalSupport "experimental") + (lib.enableFeature libwebpmuxSupport "libwebpmux") + (lib.enableFeature libwebpdemuxSupport "libwebpdemux") + (lib.enableFeature libwebpdecoderSupport "libwebpdecoder") + ]; + + nativeBuildInputs = [ autoreconfHook libtool ]; + buildInputs = [ ] + ++ lib.optionals openglSupport [ freeglut libGL libGLU ] + ++ lib.optionals pngSupport [ libpng ] + ++ lib.optionals jpegSupport [ libjpeg ] + ++ lib.optionals tiffSupport [ libtiff ] + ++ lib.optionals gifSupport [ giflib ]; + + enableParallelBuilding = true; + + passthru.tests = { + inherit freeimage gd graphicsmagick imagemagick imlib2 libjxl opencv vips; + inherit (python3.pkgs) pillow imread; + haskell-webp = haskellPackages.webp; + }; + + meta = with lib; { + description = "Tools and library for the WebP image format"; + homepage = "https://developers.google.com/speed/webp/"; + license = licenses.bsd3; + platforms = platforms.all; + maintainers = with maintainers; [ ajs124 ]; + }; +} diff --git a/pkgs/by-name/li/libxcrypt/check_passthru_matches.py b/pkgs/by-name/li/libxcrypt/check_passthru_matches.py new file mode 100644 index 0000000..ebe728e --- /dev/null +++ b/pkgs/by-name/li/libxcrypt/check_passthru_matches.py @@ -0,0 +1,70 @@ +import tarfile +import sys + + +def process_columns(line: list[str]) -> tuple[str, list[str]]: + match line: + case [name, h_prefix, nrbytes, flags]: + return (h_prefix, flags.lower().split(",")) + case other: + raise Exception("Unsupported hashes.conf line format", other) + + +def find_tar_file(tar: tarfile.TarFile, requested_name: str): + """Attempts to find a single file with given name in tarball.""" + all_names = tar.getnames() + + if requested_name in all_names: + return requested_name + + requested_suffix = f"/{requested_name}" + candidate_names = [name for name in all_names if name.endswith(requested_suffix)] + match candidate_names: + case [real_name]: + return real_name + case other: + raise KeyError( + f"Could not locate a single {requested_name} in the contents of the tarball." + ) + + +hashes_path = "lib/hashes.conf" + + +def main() -> None: + match sys.argv: + case [_name, src, enable_hashes, "--", *enabled_crypt_scheme_ids]: + pass + case other: + raise Exception( + "Incorrect number of arguments. Usage: check_passthru_matches.py -- " + ) + + with tarfile.open(src, "r") as tar: + real_hashes_path = find_tar_file(tar, hashes_path) + config = tar.extractfile(real_hashes_path).read().decode("utf-8") + + formats = [ + process_columns(columns) + for line in config.splitlines() + if not line.startswith("#") and len(columns := line.split()) > 0 + ] + expected_supported_formats = set( + prefix + for (prefix, flags) in formats + if enable_hashes in flags or enable_hashes == "all" + ) + passthru_supported_schemes = set( + f"${scheme}$" for scheme in enabled_crypt_scheme_ids + ) + + assert ( + len(expected_supported_formats - passthru_supported_schemes) == 0 + ), f"libxcrypt package enables the following crypt schemes that are not listed in passthru.enabledCryptSchemeIds: {expected_supported_formats - passthru_supported_schemes}" + assert ( + len(passthru_supported_schemes - expected_supported_formats) == 0 + ), f"libxcrypt package lists the following crypt schemes in passthru.enabledCryptSchemeIds that are not supported: {passthru_supported_schemes - expected_supported_formats}" + + +if __name__ == "__main__": + main() diff --git a/pkgs/by-name/li/libxcrypt/default.nix b/pkgs/by-name/li/libxcrypt/default.nix new file mode 100644 index 0000000..b2093dc --- /dev/null +++ b/pkgs/by-name/li/libxcrypt/default.nix @@ -0,0 +1,71 @@ +{ lib, stdenv, fetchurl, perl +# Update the enabled crypt scheme ids in passthru when the enabled hashes change +, enableHashes ? "strong" +# , nixosTests +, runCommand +, python3 +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libxcrypt"; + version = "4.4.36"; + + src = fetchurl { + url = "https://github.com/besser82/libxcrypt/releases/download/v${finalAttrs.version}/libxcrypt-${finalAttrs.version}.tar.xz"; + hash = "sha256-5eH0yu4KAd4q7ibjE4gH1tPKK45nKHlm0f79ZeH9iUM="; + }; + + outputs = [ + "out" + "man" + ]; + + configureFlags = [ + "--enable-hashes=${enableHashes}" + "--enable-obsolete-api=glibc" + "--disable-failure-tokens" + # required for musl, android, march=native + "--disable-werror" + ]; + + # fixes: can't build x86_64-w64-mingw32 shared library unless -no-undefined is specified + makeFlags = lib.optionals stdenv.hostPlatform.isWindows [ "LDFLAGS=-no-undefined"] ; + + nativeBuildInputs = [ + perl + ]; + + enableParallelBuilding = true; + + doCheck = true; + + passthru = { + tests = { + # inherit (nixosTests) login shadow; + + passthruMatches = runCommand "libxcrypt-test-passthru-matches" { } '' + ${python3.interpreter} "${./check_passthru_matches.py}" ${lib.escapeShellArgs ([ finalAttrs.src enableHashes "--" ] ++ finalAttrs.passthru.enabledCryptSchemeIds)} + touch "$out" + ''; + }; + enabledCryptSchemeIds = [ + # https://github.com/besser82/libxcrypt/blob/v4.4.35/lib/hashes.conf + "y" # yescrypt + "gy" # gost_yescrypt + "7" # scrypt + "2b" # bcrypt + "2y" # bcrypt_y + "2a" # bcrypt_a + "6" # sha512crypt + ]; + }; + + meta = with lib; { + changelog = "https://github.com/besser82/libxcrypt/blob/v${finalAttrs.version}/NEWS"; + description = "Extended crypt library for descrypt, md5crypt, bcrypt, and others"; + homepage = "https://github.com/besser82/libxcrypt/"; + platforms = platforms.all; + maintainers = with maintainers; [ dottedmag hexa ]; + license = licenses.lgpl21Plus; + }; +}) diff --git a/pkgs/by-name/li/libxcrypt/packages.nix b/pkgs/by-name/li/libxcrypt/packages.nix new file mode 100644 index 0000000..3d3253c --- /dev/null +++ b/pkgs/by-name/li/libxcrypt/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libxcrypt = callPackage ./. { + fetchurl = stdenv.fetchurlBoot; + perl = buildPackages.perl.override { + enableCrypt = false; + fetchurl = stdenv.fetchurlBoot; + }; + }; + libxcrypt-legacy = libxcrypt.override { enableHashes = "all"; }; +} diff --git a/pkgs/by-name/li/libxml2/default.nix b/pkgs/by-name/li/libxml2/default.nix new file mode 100644 index 0000000..fd71e3e --- /dev/null +++ b/pkgs/by-name/li/libxml2/default.nix @@ -0,0 +1,133 @@ +{ stdenv +, lib +, fetchurl +, zlib +, pkg-config +, autoreconfHook +, xz +, libintl +, python +, gettext +, ncurses +, findXMLCatalogs +, libiconv +# Python limits cross-compilation to an allowlist of host OSes. +# https://github.com/python/cpython/blob/dfad678d7024ab86d265d84ed45999e031a03691/configure.ac#L534-L562 +, pythonSupport ? enableShared && + (stdenv.hostPlatform == stdenv.buildPlatform || stdenv.hostPlatform.isCygwin || stdenv.hostPlatform.isLinux || stdenv.hostPlatform.isWasi) +, icuSupport ? false +, icu +, enableShared ? !stdenv.hostPlatform.isMinGW && !stdenv.hostPlatform.isStatic +, enableStatic ? !enableShared +# , gnome +, testers +}: + +stdenv.mkDerivation (finalAttrs: rec { + pname = "libxml2"; + version = "2.12.6"; + + outputs = [ "bin" "dev" "out" "doc" ] + ++ lib.optional pythonSupport "py" + ++ lib.optional (enableStatic && enableShared) "static"; + outputMan = "bin"; + + src = fetchurl { + url = "mirror://gnome/sources/libxml2/${lib.versions.majorMinor version}/libxml2-${version}.tar.xz"; + hash = "sha256-iJxZOogaPbX92WzJMYyH3zTrZI7fxFgnKtRv1gc1P7s="; + }; + + strictDeps = true; + + nativeBuildInputs = [ + pkg-config + autoreconfHook + ]; + + buildInputs = lib.optionals pythonSupport [ + python + ] ++ lib.optionals (pythonSupport && python?isPy2 && python.isPy2) [ + gettext + ] ++ lib.optionals (pythonSupport && python?isPy3 && python.isPy3) [ + ncurses + ] ++ lib.optionals (stdenv.isDarwin && pythonSupport && python?isPy2 && python.isPy2) [ + libintl + ] ++ lib.optionals stdenv.isFreeBSD [ + # Libxml2 has an optional dependency on liblzma. However, on impure + # platforms, it may end up using that from /usr/lib, and thus lack a + # RUNPATH for that, leading to undefined references for its users. + xz + ]; + + propagatedBuildInputs = [ + zlib + findXMLCatalogs + ] ++ lib.optionals stdenv.isDarwin [ + libiconv + ] ++ lib.optionals icuSupport [ + icu + ]; + + configureFlags = [ + "--exec-prefix=${placeholder "dev"}" + (lib.enableFeature enableStatic "static") + (lib.enableFeature enableShared "shared") + (lib.withFeature icuSupport "icu") + (lib.withFeature pythonSupport "python") + (lib.optionalString pythonSupport "PYTHON=${python.pythonOnBuildForHost.interpreter}") + ]; + + installFlags = lib.optionals pythonSupport [ + "pythondir=\"${placeholder "py"}/${python.sitePackages}\"" + "pyexecdir=\"${placeholder "py"}/${python.sitePackages}\"" + ]; + + enableParallelBuilding = true; + + doCheck = + (stdenv.hostPlatform == stdenv.buildPlatform) && + stdenv.hostPlatform.libc != "musl"; + preCheck = lib.optional stdenv.isDarwin '' + export DYLD_LIBRARY_PATH="$PWD/.libs:$DYLD_LIBRARY_PATH" + ''; + + preConfigure = lib.optionalString (lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11") '' + MACOSX_DEPLOYMENT_TARGET=10.16 + ''; + + preInstall = lib.optionalString pythonSupport '' + substituteInPlace python/libxml2mod.la --replace "$dev/${python.sitePackages}" "$py/${python.sitePackages}" + ''; + + postFixup = '' + moveToOutput bin/xml2-config "$dev" + moveToOutput lib/xml2Conf.sh "$dev" + '' + lib.optionalString (enableStatic && enableShared) '' + moveToOutput lib/libxml2.a "$static" + ''; + + passthru = { + inherit version; + pythonSupport = pythonSupport; + + # TODO: Fix updateScript + # updateScript = gnome.updateScript { + # packageName = pname; + # versionPolicy = "none"; + # }; + tests = { + pkg-config = testers.hasPkgConfigModules { + package = finalAttrs.finalPackage; + }; + }; + }; + + meta = with lib; { + homepage = "https://gitlab.gnome.org/GNOME/libxml2"; + description = "XML parsing library for C"; + license = licenses.mit; + platforms = platforms.all; + maintainers = with maintainers; [ eelco jtojnar ]; + pkgConfigModules = [ "libxml-2.0" ]; + }; +}) diff --git a/pkgs/by-name/li/libxml2/packages.nix b/pkgs/by-name/li/libxml2/packages.nix new file mode 100644 index 0000000..396819c --- /dev/null +++ b/pkgs/by-name/li/libxml2/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libxml2 = callPackage ./. { + python = python3; + }; +} diff --git a/pkgs/by-name/li/libxslt/default.nix b/pkgs/by-name/li/libxslt/default.nix new file mode 100644 index 0000000..acf7878 --- /dev/null +++ b/pkgs/by-name/li/libxslt/default.nix @@ -0,0 +1,91 @@ +{ lib +, stdenv +, fetchurl +, pkg-config +, autoreconfHook +, libxml2 +, findXMLCatalogs +, gettext +, python +, ncurses +, libxcrypt +, libgcrypt +, cryptoSupport ? false +, pythonSupport ? libxml2.pythonSupport +# , gnome +}: + +stdenv.mkDerivation rec { + pname = "libxslt"; + version = "1.1.39"; + + outputs = [ "bin" "dev" "out" "doc" "devdoc" ] ++ lib.optional pythonSupport "py"; + outputMan = "bin"; + + src = fetchurl { + url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + hash = "sha256-KiCtYhFIM5sHWcTU6WcZNi3uZMmgltu6YlugU4RjSfA="; + }; + + strictDeps = true; + + nativeBuildInputs = [ + pkg-config + autoreconfHook + ]; + + buildInputs = [ + libxml2.dev libxcrypt + ] ++ lib.optionals stdenv.isDarwin [ + gettext + ] ++ lib.optionals pythonSupport [ + libxml2.py + python + ncurses + ] ++ lib.optionals cryptoSupport [ + libgcrypt + ]; + + propagatedBuildInputs = [ + findXMLCatalogs + ]; + + configureFlags = [ + "--without-debug" + "--without-mem-debug" + "--without-debugger" + (lib.withFeature pythonSupport "python") + (lib.optionalString pythonSupport "PYTHON=${python.pythonOnBuildForHost.interpreter}") + ] ++ lib.optionals (!cryptoSupport) [ + "--without-crypto" + ]; + + enableParallelBuilding = true; + + postFixup = '' + moveToOutput bin/xslt-config "$dev" + moveToOutput lib/xsltConf.sh "$dev" + '' + lib.optionalString pythonSupport '' + mkdir -p $py/nix-support + echo ${libxml2.py} >> $py/nix-support/propagated-build-inputs + moveToOutput ${python.sitePackages} "$py" + ''; + + passthru = { + inherit pythonSupport; + + # updateScript = gnome.updateScript { + # packageName = pname; + # versionPolicy = "none"; + # }; + }; + + meta = with lib; { + homepage = "https://gitlab.gnome.org/GNOME/libxslt"; + description = "A C library and tools to do XSL transformations"; + license = licenses.mit; + platforms = platforms.all; + maintainers = with maintainers; [ eelco jtojnar ]; + broken = pythonSupport && !libxml2.pythonSupport; # see #73102 for why this is not an assert + }; +} diff --git a/pkgs/by-name/li/libxslt/packages.nix b/pkgs/by-name/li/libxslt/packages.nix new file mode 100644 index 0000000..98cb249 --- /dev/null +++ b/pkgs/by-name/li/libxslt/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + libxslt = callPackage ./. { + python = python3; + }; +} diff --git a/pkgs/by-name/li/lilypond/default.nix b/pkgs/by-name/li/lilypond/default.nix new file mode 100644 index 0000000..acb3a54 --- /dev/null +++ b/pkgs/by-name/li/lilypond/default.nix @@ -0,0 +1,69 @@ +{ stdenv, lib, fetchurl, ghostscript, gyre-fonts, texinfo, imagemagick, texi2html, guile +, python3, gettext, flex, perl, bison, pkg-config, autoreconfHook, dblatex +, fontconfig, freetype, pango, fontforge, help2man, zip, netpbm, groff +, freefont_ttf, makeFontsConf +, makeWrapper, t1utils, boehmgc, rsync, coreutils +, texliveSmall, tex ? texliveSmall.withPackages (ps: with ps; [ lh metafont epsf fontinst ]) +}: + +stdenv.mkDerivation rec { + pname = "lilypond"; + version = "2.24.3"; + + src = fetchurl { + url = "http://lilypond.org/download/sources/v${lib.versions.majorMinor version}/lilypond-${version}.tar.gz"; + sha256 = "sha256-3wBfdu969aTNdKEPjnEVJ4t/p58UAYk3tlwQlJjsRL4="; + }; + + postInstall = '' + for f in "$out/bin/"*; do + # Override default argv[0] setting so LilyPond can find + # its Scheme libraries. + wrapProgram "$f" \ + --set GUILE_AUTO_COMPILE 0 \ + --set PATH "${lib.makeBinPath [ ghostscript coreutils (placeholder "out") ]}" \ + --argv0 "$f" + done + ''; + + configureFlags = [ + "--disable-documentation" + # FIXME: these URW fonts are not OTF, configure reports "URW++ OTF files... no". + "--with-urwotf-dir=${ghostscript}/share/ghostscript/fonts" + "--with-texgyre-dir=${gyre-fonts}/share/fonts/truetype/" + ]; + + preConfigure = '' + sed -e "s@mem=mf2pt1@mem=$PWD/mf/mf2pt1@" -i scripts/build/mf2pt1.pl + export HOME=$TMPDIR/home + ''; + + nativeBuildInputs = [ autoreconfHook bison flex makeWrapper pkg-config ]; + + buildInputs = + [ ghostscript texinfo imagemagick texi2html guile dblatex tex zip netpbm + python3 gettext perl fontconfig freetype pango + fontforge help2man groff t1utils boehmgc rsync + ]; + + autoreconfPhase = "NOCONFIGURE=1 sh autogen.sh"; + + enableParallelBuilding = true; + + passthru.updateScript = { + command = [ ./update.sh ]; + supportedFeatures = [ "commit" ]; + }; + + meta = with lib; { + description = "Music typesetting system"; + homepage = "http://lilypond.org/"; + license = licenses.gpl3; + maintainers = with maintainers; [ marcweber yurrriq ]; + platforms = platforms.all; + }; + + FONTCONFIG_FILE = lib.optional stdenv.isDarwin (makeFontsConf { + fontDirectories = [ freefont_ttf ]; + }); +} diff --git a/pkgs/by-name/li/lilypond/fonts.nix b/pkgs/by-name/li/lilypond/fonts.nix new file mode 100644 index 0000000..b624498 --- /dev/null +++ b/pkgs/by-name/li/lilypond/fonts.nix @@ -0,0 +1,138 @@ +{ lib, stdenv, fetchFromGitHub, lilypond }: + +let + + olpFont = { fontName, rev, sha256, version ? rev, ... }: + stdenv.mkDerivation { + inherit version; + pname = "openlilypond-font-${fontName}"; + + src = fetchFromGitHub { + inherit rev sha256; + owner = "OpenLilyPondFonts"; + repo = fontName; + }; + + installPhase = '' + local fontsdir="$out/share/lilypond/${lilypond.version}/fonts" + + install -m755 -d "$fontsdir/otf" + + shopt -s globstar + + for font in {otf,supplementary-fonts,supplementary-files}/**/*.{o,t}tf; do + echo $font + install -Dt "$fontsdir/otf" -m644 "$font" + done + + install -m755 -d "$fontsdir/svg" + for font in {svg,woff}/**.{svg,woff}; do + install -Dt "$fontsdir/svg" -m644 "$font" + done + ''; + + meta = with lib; { + inherit (lilypond.meta) homepage platforms; + description = "${fontName} font for LilyPond"; + license = licenses.ofl; + maintainers = with maintainers; [ yurrriq ]; + }; + }; + +in + +rec { + beethoven = olpFont { + fontName = "beethoven"; + rev = "669f400"; + sha256 = "17wdklg5shmqwnb7b81qavfg52v32wx5yf15c6al0hbvv1nqqj2i"; + }; + bravura = olpFont { + fontName = "bravura"; + rev = "53c7744"; + sha256 = "1p27w1c3bzxlnm6rzq8n7dbfjwbxqjy4r0fhkmk9jbm8awmzw214"; + }; + cadence = olpFont { + fontName = "cadence"; + rev = "1cc0fb7"; + sha256 = "1zxb3m8glh8iwj8mzcgyaxhlq0bji0rwniw702m70h9kpifiim1j"; + }; + gonville = olpFont { + fontName = "gonville"; + rev = "a638bc9"; + sha256 = "15khy9677crgd6bpajn7l1drysgxy49wiym3b248khgpavidwyy9"; + }; + gutenberg1939 = olpFont { + fontName = "gutenberg1939"; + rev = "2316a35"; + sha256 = "1lkhivmrx92z37zfrb5mkhzhwggyaga9cm0wl89r0n2f2kayyc7q"; + }; + haydn = olpFont { + fontName = "haydn"; + rev = "9e7de8b"; + sha256 = "1jmbhb2jm887sdc498l2jilpivq1d8lmmgdb8lp59lv8d9fx105z"; + }; + improviso = olpFont { + fontName = "improviso"; + rev = "0753f5a"; + sha256 = "1clin9c74gjhhira12mwxynxn4b1ixij5bg04mvk828lbr740mfm"; + }; + lilyboulez = olpFont { + fontName = "lilyboulez"; + rev = "e8455fc"; + sha256 = "0mq92x0rbgfb6s7ipgg2zcxika2si30w3ay89rp7m6vwca01649y"; + }; + lilyjazz = olpFont { + fontName = "lilyjazz"; + rev = "8fa7d554"; + sha256 = "1z7px7k2sn7snnj7yfjv0p9axwbn452vn9ww9icmb1249b0d1qry"; + }; + lv-goldenage = olpFont { + fontName = "lv-goldenage"; + rev = "8a92fd3"; + sha256 = "03nbd1vmlaj7wkhsnl2lq09nafv7zj1k518zs966vclzah94qghp"; + }; + paganini = olpFont { + fontName = "paganini"; + rev = "8e4e55a"; + sha256 = "0gw9wr4hfn205j40rpgnfddhzhn9x4pwfinamj5b7607880nvx29"; + }; + profondo = olpFont { + fontName = "profondo"; + rev = "8cfb668"; + sha256 = "0armwbg9y0l935949b7klngws6fq42fi944lws61qvjl61780br8"; + }; + ross = olpFont { + fontName = "ross"; + rev = "aa8127f"; + sha256 = "1w2x3pd1d1z4x0107dpq95v7m547cj4nkkzxgqpmzfqa0074idqd"; + }; + scorlatti = olpFont { + fontName = "scorlatti"; + rev = "1db87da"; + sha256 = "07jam5hwdy6bydrm98cdla6p6rl8lmy8zzsfq46i55l64l3w956h"; + }; + sebastiano = olpFont { + fontName = "sebastiano"; + rev = "44bf262"; + sha256 = "09i8p3p4z6vz69j187cpxvikkgc4pk6gxippahy0k7i7bh0d4qaj"; + }; + + all = [ + beethoven + bravura + cadence + gonville + gutenberg1939 + haydn + improviso + lilyboulez + lilyjazz + lv-goldenage + paganini + profondo + ross + scorlatti + sebastiano + ]; +} diff --git a/pkgs/by-name/li/lilypond/unstable.nix b/pkgs/by-name/li/lilypond/unstable.nix new file mode 100644 index 0000000..f500a79 --- /dev/null +++ b/pkgs/by-name/li/lilypond/unstable.nix @@ -0,0 +1,14 @@ +{ lib, fetchurl, lilypond }: + +lilypond.overrideAttrs (oldAttrs: rec { + version = "2.25.14"; + src = fetchurl { + url = "https://lilypond.org/download/sources/v${lib.versions.majorMinor version}/lilypond-${version}.tar.gz"; + hash = "sha256-b0qfNjr5jxEJbCYINX2/JhESMOIf9DefRHI47gn5Zio="; + }; + + passthru.updateScript = { + command = [ ./update.sh "unstable" ]; + supportedFeatures = [ "commit" ]; + }; +}) diff --git a/pkgs/by-name/li/lilypond/update.sh b/pkgs/by-name/li/lilypond/update.sh new file mode 100755 index 0000000..e9c3f48 --- /dev/null +++ b/pkgs/by-name/li/lilypond/update.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env nix-shell +#!nix-shell -I nixpkgs=./. -i bash -p curl gnused nix + +set -euo pipefail + +if [ $# -gt 0 ] && [ "$1" = "unstable" ]; then + ATTR="lilypond-unstable" + FILE="$(dirname "${BASH_SOURCE[@]}")/unstable.nix" + QUERY="VERSION_DEVEL=" +else + ATTR="lilypond" + FILE="$(dirname "${BASH_SOURCE[@]}")/default.nix" + QUERY="VERSION_STABLE=" +fi + +# update version +PREV=$(nix eval --raw -f default.nix $ATTR.version) +NEXT=$(curl -s 'https://gitlab.com/lilypond/lilypond/-/raw/master/VERSION' | grep "$QUERY" | cut -d= -f2) +sed -i "s|$PREV|$NEXT|" "$FILE" +echo "[{\"commitMessage\":\"$ATTR: $PREV -> $NEXT\"}]" + +# update hash +PREV=$(nix eval --raw -f default.nix $ATTR.src.outputHash) +NEXT=$(nix hash to-sri --type sha256 $(nix-prefetch-url --type sha256 $(nix eval --raw -f default.nix $ATTR.src.url))) +sed -i "s|$PREV|$NEXT|" "$FILE" diff --git a/pkgs/by-name/li/lilypond/with-fonts.nix b/pkgs/by-name/li/lilypond/with-fonts.nix new file mode 100644 index 0000000..2cfd151 --- /dev/null +++ b/pkgs/by-name/li/lilypond/with-fonts.nix @@ -0,0 +1,17 @@ +{ lib, symlinkJoin, makeWrapper +, lilypond, openlilylib-fonts +}: + +lib.appendToName "with-fonts" (symlinkJoin { + inherit (lilypond) meta name version ; + + paths = [ lilypond ] ++ openlilylib-fonts.all; + + nativeBuildInputs = [ makeWrapper ]; + + postBuild = '' + for p in $out/bin/*; do + wrapProgram "$p" --set LILYPOND_DATADIR "$out/share/lilypond/${lilypond.version}" + done + ''; +}) diff --git a/pkgs/by-name/li/lix/common.nix b/pkgs/by-name/li/lix/common.nix new file mode 100644 index 0000000..d01d895 --- /dev/null +++ b/pkgs/by-name/li/lix/common.nix @@ -0,0 +1,284 @@ +{ lib +, fetchFromGitHub +, version +, suffix ? "" +, hash ? null +, src ? fetchFromGitHub { + owner = "lix-project"; + repo = "lix"; + rev = version; + inherit hash; + } +, docCargoHash ? null +, patches ? [ ] +, maintainers ? lib.teams.lix.members +, +}@args: +assert (hash == null) -> (src != null); +{ stdenv +, meson +, bash +, bison +, boehmgc +, boost +, brotli +, busybox-sandbox-shell +, bzip2 +, callPackage +, coreutils +, curl +, cmake +, docbook_xsl_ns +, docbook5 +, doxygen +, editline +, flex +, git +, gnutar +, gtest +, gzip +, jq +, lib +, libarchive +, libcpuid +, libgit2 +, libsodium +, libxml2 +, libxslt +, lowdown +, lsof +, man +, mercurial +, mdbook +, mdbook-linkcheck +, nlohmann_json +, ninja +, openssl +, toml11 +, python3 +, perl +, pkg-config +, rapidcheck +, Security +, sqlite +, util-linuxMinimal +, xz +# , nixosTests +, enableDocumentation ? stdenv.hostPlatform == stdenv.buildPlatform +, enableStatic ? stdenv.hostPlatform.isStatic +, withAWS ? !enableStatic && (stdenv.isLinux || stdenv.isDarwin) +, aws-sdk-cpp +, # RISC-V support in progress https://github.com/seccomp/libseccomp/pull/50 + withLibseccomp ? lib.meta.availableOn stdenv.hostPlatform libseccomp +, libseccomp +, confDir +, stateDir +, storeDir +, +}: +let + lix-doc = callPackage ./doc { + inherit src; + version = "${version}${suffix}"; + cargoHash = docCargoHash; + }; + self = stdenv.mkDerivation { + pname = "lix"; + + version = "${version}${suffix}"; + VERSION_SUFFIX = suffix; + + inherit src patches; + + outputs = + [ + "out" + "dev" + ] + ++ lib.optionals enableDocumentation [ + "man" + "doc" + ]; + + strictDeps = true; + + nativeBuildInputs = + [ + pkg-config + bison + flex + jq + meson + ninja + cmake + python3 + doxygen + + # Tests + git + mercurial + jq + lsof + ] + ++ lib.optionals (enableDocumentation) [ + (lib.getBin lowdown) + mdbook + mdbook-linkcheck + ] + ++ lib.optionals stdenv.isLinux [ util-linuxMinimal ]; + + buildInputs = + [ + boost + brotli + bzip2 + curl + editline + libsodium + openssl + sqlite + xz + gtest + libarchive + lowdown + rapidcheck + toml11 + lix-doc + ] + ++ lib.optionals stdenv.isDarwin [ Security ] + ++ lib.optionals (stdenv.isx86_64) [ libcpuid ] + ++ lib.optionals withLibseccomp [ libseccomp ] + ++ lib.optionals withAWS [ aws-sdk-cpp ]; + + propagatedBuildInputs = [ + boehmgc + nlohmann_json + ]; + + postPatch = '' + patchShebangs --build tests + ''; + + preConfigure = + # Copy libboost_context so we don't get all of Boost in our closure. + # https://github.com/NixOS/nixpkgs/issues/45462 + lib.optionalString (!enableStatic) '' + mkdir -p $out/lib + cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib + rm -f $out/lib/*.a + ${lib.optionalString stdenv.isLinux '' + chmod u+w $out/lib/*.so.* + patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.* + ''} + ${lib.optionalString stdenv.hostPlatform.isDarwin '' + for LIB in $out/lib/*.dylib; do + chmod u+w $LIB + install_name_tool -id $LIB $LIB + install_name_tool -delete_rpath ${boost}/lib/ $LIB || true + done + install_name_tool -change ${boost}/lib/libboost_system.dylib $out/lib/libboost_system.dylib $out/lib/libboost_thread.dylib + ''} + ''; + + mesonFlags = + [ + (lib.mesonEnable "gc" true) + (lib.mesonBool "enable-tests" true) + (lib.mesonBool "enable-docs" enableDocumentation) + (lib.mesonBool "enable-embedded-sandbox-shell" (stdenv.isLinux && stdenv.hostPlatform.isStatic)) + (lib.mesonEnable "seccomp-sandboxing" withLibseccomp) + + (lib.mesonOption "store-dir" storeDir) + (lib.mesonOption "state-dir" stateDir) + (lib.mesonOption "sysconfdir" confDir) + ] + ++ lib.optionals stdenv.isLinux [ + (lib.mesonOption "sandbox-shell" "${busybox-sandbox-shell}/bin/busybox") + ]; + + # Needed for Meson to find Boost. + # https://github.com/NixOS/nixpkgs/issues/86131. + env = { + BOOST_INCLUDEDIR = "${lib.getDev boost}/include"; + BOOST_LIBRARYDIR = "${lib.getLib boost}/lib"; + }; + + postInstall = + '' + mkdir -p $doc/nix-support + echo "doc manual $doc/share/doc/nix/manual" >> $doc/nix-support/hydra-build-products + '' + + lib.optionalString stdenv.hostPlatform.isStatic '' + mkdir -p $out/nix-support + echo "file binary-dist $out/bin/nix" >> $out/nix-support/hydra-build-products + '' + + lib.optionalString stdenv.isDarwin '' + for lib in libnixutil.dylib libnixexpr.dylib; do + install_name_tool \ + -change "${lib.getLib boost}/lib/libboost_context.dylib" \ + "$out/lib/libboost_context.dylib" \ + "$out/lib/$lib" + done + ''; + + doCheck = true; + mesonCheckFlags = [ "--suite=check" ]; + checkInputs = [ + gtest + rapidcheck + ]; + + doInstallCheck = true; + mesonInstallCheckFlags = [ "--suite=installcheck" ]; + + preInstallCheck = lib.optionalString stdenv.hostPlatform.isDarwin '' + # socket path becomes too long otherwise + export TMPDIR=$NIX_BUILD_TOP + # Prevent crashes in libcurl due to invoking Objective-C `+initialize` methods after `fork`. + # See http://sealiesoftware.com/blog/archive/2017/6/5/Objective-C_and_fork_in_macOS_1013.html. + export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + ''; + + installCheckPhase = '' + runHook preInstallCheck + flagsArray=($mesonInstallCheckFlags "''${mesonInstallCheckFlagsArray[@]}") + meson test --no-rebuild "''${flagsArray[@]}" + runHook postInstallCheck + ''; + # strictoverflow is disabled because we trap on signed overflow instead + hardeningDisable = [ "strictoverflow" ] ++ lib.optional stdenv.hostPlatform.isStatic "pie"; + # hardeningEnable = lib.optionals (!stdenv.isDarwin) [ "pie" ]; + # hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "fortify"; + separateDebugInfo = stdenv.isLinux && !enableStatic; + enableParallelBuilding = true; + + passthru = { + inherit aws-sdk-cpp boehmgc; + # tests = { + # misc = nixosTests.misc.lix.passthru.override { nixPackage = self; }; + # }; + }; + + # point 'nix edit' and ofborg at the file that defines the attribute, + # not this common file. + pos = builtins.unsafeGetAttrPos "version" args; + meta = with lib; { + description = "Powerful package manager that makes package management reliable and reproducible"; + longDescription = '' + Lix (a fork of Nix) is a powerful package manager for Linux and other Unix systems that + makes package management reliable and reproducible. It provides atomic + upgrades and rollbacks, side-by-side installation of multiple versions of + a package, multi-user package management and easy setup of build + environments. + ''; + homepage = "https://lix.systems"; + license = licenses.lgpl21Plus; + inherit maintainers; + platforms = platforms.unix; + outputsToInstall = [ "out" ] ++ optional enableDocumentation "man"; + mainProgram = "nix"; + broken = enableStatic; + }; + }; +in +self diff --git a/pkgs/by-name/li/lix/default.nix b/pkgs/by-name/li/lix/default.nix new file mode 100644 index 0000000..579c8c6 --- /dev/null +++ b/pkgs/by-name/li/lix/default.nix @@ -0,0 +1,60 @@ +{ lib +, aws-sdk-cpp +, boehmgc +, callPackage +, fetchFromGitHub +, Security +, storeDir ? "/nix/store" +, stateDir ? "/nix/var" +, confDir ? "/etc" +, path +, +}: +let + boehmgc-nix_2_3 = boehmgc.override { enableLargeConfig = true; }; + + boehmgc-nix = boehmgc-nix_2_3.overrideAttrs (drv: { + patches = (drv.patches or [ ]) ++ [ + # Part of the GC solution in https://github.com/NixOS/nix/pull/4944 + (path + "/pkgs/by-name/ni/nix/patches/boehmgc-coroutine-sp-fallback.patch") + ]; + }); + + aws-sdk-cpp-nix = + (aws-sdk-cpp.override { + apis = [ + "s3" + "transfer" + ]; + customMemoryManagement = false; + }).overrideAttrs + { + # only a stripped down version is build which takes a lot less resources to build + requiredSystemFeatures = [ ]; + }; + + common = + args: + callPackage (import ./common.nix ({ inherit lib fetchFromGitHub; } // args)) { + inherit + Security + storeDir + stateDir + confDir + ; + boehmgc = boehmgc-nix; + aws-sdk-cpp = aws-sdk-cpp-nix; + }; +in +lib.makeExtensible (self: ({ + lix_2_90 = ( + common { + version = "2.90-beta.1"; + hash = "sha256-REWlo2RYHfJkxnmZTEJu3Cd/2VM+wjjpPy7Xi4BdDTQ="; + docCargoHash = "sha256-oH248kR4Of0MhcY2DYxNX0A+/XJ3L+UuIpBKn3sJt54="; + } + ); + + latest = self.lix_2_90; + stable = self.lix_2_90; +})) diff --git a/pkgs/by-name/li/lix/doc/default.nix b/pkgs/by-name/li/lix/doc/default.nix new file mode 100644 index 0000000..a3c1d7d --- /dev/null +++ b/pkgs/by-name/li/lix/doc/default.nix @@ -0,0 +1,12 @@ +{ + src, + rustPlatform, + version, + cargoHash, +}: + +rustPlatform.buildRustPackage { + pname = "lix-doc"; + sourceRoot = "${src.name}/lix-doc"; + inherit version src cargoHash; +} diff --git a/pkgs/by-name/li/lix/packages.nix b/pkgs/by-name/li/lix/packages.nix new file mode 100644 index 0000000..1568048 --- /dev/null +++ b/pkgs/by-name/li/lix/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + lixVersions = recurseIntoAttrs (callPackage ./. { + storeDir = config.nix.storeDir or "/nix/store"; + stateDir = config.nix.stateDir or "/nix/var"; + inherit (darwin.apple_sdk.frameworks) Security; + }); + + lix = lixVersions.stable; + + lixStatic = pkgsStatic.lix; +} diff --git a/pkgs/by-name/ll/llvm/12/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..b834d38 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/clang/gnu-install-dirs.patch @@ -0,0 +1,235 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9e74014134a0..976e6a1757fd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -5,6 +5,8 @@ cmake_minimum_required(VERSION 3.13.4) + if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) + project(Clang) + ++ include(GNUInstallDirs) ++ + set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to") + set(CMAKE_CXX_STANDARD_REQUIRED YES) + set(CMAKE_CXX_EXTENSIONS NO) +@@ -416,7 +418,7 @@ include_directories(BEFORE + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/clang include/clang-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT clang-headers + FILES_MATCHING + PATTERN "*.def" +@@ -425,7 +427,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + ) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT clang-headers + FILES_MATCHING + PATTERN "CMakeFiles" EXCLUDE +@@ -445,7 +447,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh) + install(PROGRAMS utils/bash-autocomplete.sh +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT bash-autocomplete) + if(NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-bash-autocomplete +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 704278a0e93b..d25c8d325c71 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -123,9 +123,9 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- RUNTIME DESTINATION bin) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if (NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-${lib} +@@ -170,7 +170,7 @@ macro(add_clang_tool name) + + install(TARGETS ${name} + ${export_to_clangtargets} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT ${name}) + + if(NOT LLVM_ENABLE_IDE) +@@ -185,7 +185,7 @@ endmacro() + macro(add_clang_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() + + function(clang_target_link_libraries target type) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index b2c0ce8dd4a0..19e5443d8c25 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -215,7 +215,7 @@ set_target_properties(clang-resource-headers PROPERTIES + FOLDER "Misc" + RUNTIME_OUTPUT_DIRECTORY "${output_dir}") + +-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) + + install( + FILES ${files} ${generated_files} +diff --git a/tools/c-index-test/CMakeLists.txt b/tools/c-index-test/CMakeLists.txt +index ceef4b08637c..8efad5520ca4 100644 +--- a/tools/c-index-test/CMakeLists.txt ++++ b/tools/c-index-test/CMakeLists.txt +@@ -54,7 +54,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + set_property(TARGET c-index-test APPEND PROPERTY INSTALL_RPATH + "@executable_path/../../lib") + else() +- set(INSTALL_DESTINATION bin) ++ set(INSTALL_DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + install(TARGETS c-index-test +diff --git a/tools/clang-format/CMakeLists.txt b/tools/clang-format/CMakeLists.txt +index 35ecdb11253c..d77d75de0094 100644 +--- a/tools/clang-format/CMakeLists.txt ++++ b/tools/clang-format/CMakeLists.txt +@@ -21,20 +21,20 @@ if( LLVM_LIB_FUZZING_ENGINE OR LLVM_USE_SANITIZE_COVERAGE ) + endif() + + install(PROGRAMS clang-format-bbedit.applescript +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format-diff.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format-sublime.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format.el +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS git-clang-format +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT clang-format) +diff --git a/tools/clang-rename/CMakeLists.txt b/tools/clang-rename/CMakeLists.txt +index cda8e29ec5b1..0134d8ccd70b 100644 +--- a/tools/clang-rename/CMakeLists.txt ++++ b/tools/clang-rename/CMakeLists.txt +@@ -19,8 +19,8 @@ clang_target_link_libraries(clang-rename + ) + + install(PROGRAMS clang-rename.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-rename) + install(PROGRAMS clang-rename.el +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-rename) +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 51ff2e7e1565..1ed5f8a079a1 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -166,7 +166,7 @@ endif() + if(INTERNAL_INSTALL_PREFIX) + set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include") + else() +- set(LIBCLANG_HEADERS_INSTALL_DESTINATION include) ++ set(LIBCLANG_HEADERS_INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + endif() + + install(DIRECTORY ../../include/clang-c +@@ -196,7 +196,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build/CMakeLists.txt b/tools/scan-build/CMakeLists.txt +index ec0702d76f18..d25d982f51da 100644 +--- a/tools/scan-build/CMakeLists.txt ++++ b/tools/scan-build/CMakeLists.txt +@@ -47,7 +47,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile}) + install(PROGRAMS bin/${BinFile} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT scan-build) + endforeach() + +@@ -61,7 +61,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libexec/${LibexecFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/libexec/${LibexecFile}) + install(PROGRAMS libexec/${LibexecFile} +- DESTINATION libexec ++ DESTINATION ${CMAKE_INSTALL_LIBEXECDIR} + COMPONENT scan-build) + endforeach() + +@@ -89,7 +89,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/scan-build/${ShareFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile}) + install(FILES share/scan-build/${ShareFile} +- DESTINATION share/scan-build ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-build + COMPONENT scan-build) + endforeach() + +diff --git a/tools/scan-view/CMakeLists.txt b/tools/scan-view/CMakeLists.txt +index dd3d33439299..fea19c12ce70 100644 +--- a/tools/scan-view/CMakeLists.txt ++++ b/tools/scan-view/CMakeLists.txt +@@ -19,7 +19,7 @@ if(CLANG_INSTALL_SCANVIEW) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile}) + install(PROGRAMS bin/${BinFile} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT scan-view) + endforeach() + +@@ -33,7 +33,7 @@ if(CLANG_INSTALL_SCANVIEW) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile}) + install(FILES share/${ShareFile} +- DESTINATION share/scan-view ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-view + COMPONENT scan-view) + endforeach() + +diff --git a/utils/hmaptool/CMakeLists.txt b/utils/hmaptool/CMakeLists.txt +index 62f2de0cb15c..6aa66825b6ec 100644 +--- a/utils/hmaptool/CMakeLists.txt ++++ b/utils/hmaptool/CMakeLists.txt +@@ -10,7 +10,7 @@ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HM + + list(APPEND Depends ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HMAPTOOL}) + install(PROGRAMS ${CLANG_HMAPTOOL} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT hmaptool) + + add_custom_target(hmaptool ALL DEPENDS ${Depends}) diff --git a/pkgs/by-name/ll/llvm/12/clang/purity.patch b/pkgs/by-name/ll/llvm/12/clang/purity.patch new file mode 100644 index 0000000..deb230a --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/clang/purity.patch @@ -0,0 +1,28 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,12 +487,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + if (!IsStatic) { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); +- +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/12/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/12/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..66742e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -345,4 +345,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -608,6 +612,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/12/compiler-rt/armv7l.patch b/pkgs/by-name/ll/llvm/12/compiler-rt/armv7l.patch new file mode 100644 index 0000000..120cfe6 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/compiler-rt/armv7l.patch @@ -0,0 +1,32 @@ +diff -ur compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake +--- compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake 2020-05-10 03:42:00.883450706 +0900 +@@ -24,7 +24,7 @@ + + + set(ARM64 aarch64) +-set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k) ++set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv7l) + set(HEXAGON hexagon) + set(X86 i386) + set(X86_64 x86_64) +diff -ur compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt +--- compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt 2020-05-10 03:44:49.468579650 +0900 +@@ -474,6 +474,7 @@ + set(armv7_SOURCES ${arm_SOURCES}) + set(armv7s_SOURCES ${arm_SOURCES}) + set(armv7k_SOURCES ${arm_SOURCES}) ++set(armv7l_SOURCES ${arm_SOURCES}) + set(arm64_SOURCES ${aarch64_SOURCES}) + + # macho_embedded archs +@@ -595,7 +596,7 @@ + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported +- if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") ++ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7l|armv7m|armv7em)$") + string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}") + check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP) + if(NOT COMPILER_RT_HAS_${arch}_VFP) diff --git a/pkgs/by-name/ll/llvm/12/compiler-rt/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/compiler-rt/gnu-install-dirs.patch new file mode 100644 index 0000000..5f02576 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/compiler-rt/gnu-install-dirs.patch @@ -0,0 +1,129 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b44ad2c2118e..d42f5664d448 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -8,6 +8,7 @@ cmake_minimum_required(VERSION 3.13.4) + # Check if compiler-rt is built as a standalone project. + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR COMPILER_RT_STANDALONE_BUILD) + project(CompilerRT C CXX ASM) ++ include(GNUInstallDirs) + set(COMPILER_RT_STANDALONE_BUILD TRUE) + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + endif() +diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake +index 361538a58e47..f0d8d9ab80f1 100644 +--- a/cmake/Modules/AddCompilerRT.cmake ++++ b/cmake/Modules/AddCompilerRT.cmake +@@ -495,7 +495,7 @@ macro(add_compiler_rt_resource_file target_name file_name component) + add_custom_target(${target_name} DEPENDS ${dst_file}) + # Install in Clang resource directory. + install(FILES ${file_name} +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/share ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_DATADIR} + COMPONENT ${component}) + add_dependencies(${component} ${target_name}) + +@@ -512,7 +512,7 @@ macro(add_compiler_rt_script name) + add_custom_target(${name} DEPENDS ${dst}) + install(FILES ${dst} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/bin) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_BINDIR}) + endmacro(add_compiler_rt_script src name) + + # Builds custom version of libc++ and installs it in . +diff --git a/cmake/Modules/CompilerRTDarwinUtils.cmake b/cmake/Modules/CompilerRTDarwinUtils.cmake +index 456a8dcda59f..7a09e74c7c79 100644 +--- a/cmake/Modules/CompilerRTDarwinUtils.cmake ++++ b/cmake/Modules/CompilerRTDarwinUtils.cmake +@@ -508,7 +508,7 @@ macro(darwin_add_embedded_builtin_libraries) + set(DARWIN_macho_embedded_LIBRARY_OUTPUT_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/macho_embedded) + set(DARWIN_macho_embedded_LIBRARY_INSTALL_DIR +- ${COMPILER_RT_INSTALL_PATH}/lib/macho_embedded) ++ ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_LIBDIR}/macho_embedded) + + set(CFLAGS_armv7 "-target thumbv7-apple-darwin-eabi") + set(CFLAGS_i386 "-march=pentium") +diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake +index f61d487e93a0..f1f46fb9599c 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -378,7 +378,7 @@ endfunction() + function(get_compiler_rt_install_dir arch install_dir) + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + get_compiler_rt_target(${arch} target) +- set(${install_dir} ${COMPILER_RT_INSTALL_PATH}/lib/${target} PARENT_SCOPE) ++ set(${install_dir} ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_LIBDIR}/${target} PARENT_SCOPE) + else() + set(${install_dir} ${COMPILER_RT_LIBRARY_INSTALL_DIR} PARENT_SCOPE) + endif() +diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake +index 1edab43e7c0d..1aac6b73ff82 100644 +--- a/cmake/base-config-ix.cmake ++++ b/cmake/base-config-ix.cmake +@@ -65,11 +65,11 @@ if (LLVM_TREE_AVAILABLE) + else() + # Take output dir and install path from the user. + set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH +- "Path where built compiler-rt libraries should be stored.") ++ "Path where built compiler-rt build artifacts should be stored.") + set(COMPILER_RT_EXEC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin CACHE PATH + "Path where built compiler-rt executables should be stored.") +- set(COMPILER_RT_INSTALL_PATH ${CMAKE_INSTALL_PREFIX} CACHE PATH +- "Path where built compiler-rt libraries should be installed.") ++ set(COMPILER_RT_INSTALL_PATH "" CACHE PATH ++ "Prefix where built compiler-rt artifacts should be installed, comes before CMAKE_INSTALL_PREFIX.") + option(COMPILER_RT_INCLUDE_TESTS "Generate and build compiler-rt unit tests." OFF) + option(COMPILER_RT_ENABLE_WERROR "Fail and stop if warning is triggered" OFF) + # Use a host compiler to compile/link tests. +@@ -97,7 +97,7 @@ else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR) + set(COMPILER_RT_LIBRARY_OUTPUT_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) + set(COMPILER_RT_LIBRARY_INSTALL_DIR +- ${COMPILER_RT_INSTALL_PATH}/lib/${COMPILER_RT_OS_DIR}) ++ ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_LIBDIR}/${COMPILER_RT_OS_DIR}) + endif() + + if(APPLE) +diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt +index b00e8caa1ddd..0fe64e4862c9 100644 +--- a/include/CMakeLists.txt ++++ b/include/CMakeLists.txt +@@ -69,22 +69,22 @@ set_target_properties(compiler-rt-headers PROPERTIES FOLDER "Compiler-RT Misc") + install(FILES ${SANITIZER_HEADERS} + COMPONENT compiler-rt-headers + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/sanitizer) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_INCLUDEDIR}/sanitizer) + # Install fuzzer headers. + install(FILES ${FUZZER_HEADERS} + COMPONENT compiler-rt-headers + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/fuzzer) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_INCLUDEDIR}/fuzzer) + # Install xray headers. + install(FILES ${XRAY_HEADERS} + COMPONENT compiler-rt-headers + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/xray) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_INCLUDEDIR}/xray) + # Install profile headers. + install(FILES ${PROFILE_HEADERS} + COMPONENT compiler-rt-headers + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/profile) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_INCLUDEDIR}/profile) + + if (NOT CMAKE_CONFIGURATION_TYPES) # don't add this for IDEs. + add_custom_target(install-compiler-rt-headers +diff --git a/lib/dfsan/CMakeLists.txt b/lib/dfsan/CMakeLists.txt +index a29de8deff1b..d39ff01613d2 100644 +--- a/lib/dfsan/CMakeLists.txt ++++ b/lib/dfsan/CMakeLists.txt +@@ -57,4 +57,4 @@ add_custom_command(OUTPUT ${dfsan_abilist_filename} + DEPENDS done_abilist.txt libc_ubuntu1404_abilist.txt) + add_dependencies(dfsan dfsan_abilist) + install(FILES ${dfsan_abilist_filename} +- DESTINATION ${COMPILER_RT_INSTALL_PATH}/share) ++ DESTINATION ${COMPILER_RT_INSTALL_PATH}/${CMAKE_INSTALL_FULL_DATADIR}) diff --git a/pkgs/by-name/ll/llvm/12/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/12/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..135cf62 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +index f1f46fb9599c..6f19e69507ba 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -302,8 +302,9 @@ macro(load_llvm_config) + # Get some LLVM variables from LLVMConfig. + include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake") + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + endif() + endmacro() + diff --git a/pkgs/by-name/ll/llvm/12/default.nix b/pkgs/by-name/ll/llvm/12/default.nix new file mode 100644 index 0000000..45955dc --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/default.nix @@ -0,0 +1,357 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake +, preLibcCrossHeaders +, substitute, substituteAll, fetchFromGitHub, fetchpatch +, libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM version's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +}: + +let + release_version = "12.0.1"; + candidate = ""; # empty or "rcN" + dash-candidate = lib.optionalString (candidate != "") "-${candidate}"; + version = "${release_version}${dash-candidate}"; # differentiating these (variables) is important for RCs + + fetch = name: sha256: fetchurl { + url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/${name}-${release_version}${candidate}.src.tar.xz"; + inherit sha256; + }; + + clang-tools-extra_src = fetch "clang-tools-extra" "1r9a4fdz9ci58b5z2inwvm4z4cdp6scrivnaw05dggkxz7yrwrb5"; + + inherit (import ../common/common-let.nix { inherit lib release_version; }) llvm_meta; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch buildLlvmTools; }); + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + src = fetch "clang" "0px4gl27az6cdz6adds89qzdwb1cqpjsfvrldbz9qvpmphrj34bf"; + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + (substituteAll { + src = ../common/clang/clang-11-15-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit clang-tools-extra_src llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + # disabled until recommonmark supports sphinx 3 + #Llvm-manpages = lowPrio (tools.libllvm.override { + # enableManpages = true; + # python3 = pkgs.python3; # don't use python-boot + #}); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # disabled until recommonmark supports sphinx 3 + # lldb-manpages = lowPrio (tools.lldb.override { + # enableManpages = true; + # python3 = pkgs.python3; # don't use python-boot + # }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc + else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + src = fetch "lld" "0qg3fgc7wj34hdkqn21y03zcmsdd01szhhm1hfki63iifrm3y2v9"; + patches = [ + ./lld/gnu-install-dirs.patch + ]; + inherit llvm_meta; + inherit (libraries) libunwind; + }; + + lldb = callPackage ../common/lldb.nix { + src = fetch "lldb" "0g3pj1m3chafavpr35r9fynm85y2hdyla6klj0h28khxs2613i78"; + patches = + let + resourceDirPatch = callPackage + ({ substituteAll, libclang }: substituteAll + { + src = ./lldb/resource-dir.patch; + clangLibDir = "${libclang.lib}/lib"; + }) + { }; + in + [ + ./lldb/procfs.patch + resourceDirPatch + ./lldb/gnu-install-dirs.patch + ]; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt -Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + '' + lib.optionalString (!stdenv.targetPlatform.isWasm) '' + echo "--unwindlib=libunwind" >> $out/nix-support/cc-cflags + echo "-L${targetLlvmLibraries.libunwind}/lib" >> $out/nix-support/cc-ldflags + '' + lib.optionalString (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) '' + echo "-lunwind" >> $out/nix-support/cc-ldflags + '' + lib.optionalString stdenv.targetPlatform.isWasm '' + echo "-fno-exceptions" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + echo "-nostdlib++" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = '' + echo "-nostartfiles" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands0 cc; + }; + + clangNoCompilerRtWithLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + }; + + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + src = fetch "compiler-rt" "1950rg294izdwkaasi7yjrmadc9mzdd5paf0q63jjcq2m3rdbj5l"; + patches = [ + ../common/compiler-rt/7-12-codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + src = fetch "compiler-rt" "1950rg294izdwkaasi7yjrmadc9mzdd5paf0q63jjcq2m3rdbj5l"; + patches = [ + ../common/compiler-rt/7-12-codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + libcxx = callPackage ../common/libcxx { + src = fetchFromGitHub { + owner = "llvm"; + repo = "llvm-project"; + rev = "refs/tags/llvmorg-${version}"; + sparseCheckout = [ + "libcxx" + "libcxxabi" + "llvm/cmake" + "llvm/utils" + "runtimes" + ]; + hash = "sha256-etxgXIdWxMTmbZ83Hsc0w6Jt5OSQSUEPVEWqLkHsNBY="; + }; + patches = [ + (substitute { + src = ../common/libcxxabi/wasm.patch; + replacements = [ + "--replace-fail" "/cmake/" "/llvm/cmake/" + ]; + }) + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + (substitute { + src = ../common/libcxx/libcxx-0001-musl-hacks.patch; + replacements = [ + "--replace-fail" "/include/" "/libcxx/include/" + ]; + }) + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + src = fetch "libunwind" "192ww6n81lj2mb9pj4043z79jp3cf58a9c2qrxjwm5c3a64n1shb"; + patches = [ + ./libunwind/gnu-install-dirs.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + src = fetch "openmp" "14dh0r6h2xh747ffgnsl4z08h0ri04azi9vf79cbz7ma1r27kzk0"; + patches = [ + # Fix cross. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5e2358c781b85a18d1463fd924d2741d4ae5e42e.patch"; + hash = "sha256-UxIlAifXnexF/MaraPW0Ut6q+sf3e7y1fMdEv1q103A="; + }) + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/12/libunwind/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/libunwind/gnu-install-dirs.patch new file mode 100644 index 0000000..a791d6c --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/libunwind/gnu-install-dirs.patch @@ -0,0 +1,34 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 48cb8e004e08..fec8144fb95a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -23,6 +23,8 @@ set(LIBUNWIND_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBUNWIND_STANDALONE_BUILD) + project(libunwind LANGUAGES C CXX ASM) + ++ include(GNUInstallDirs) ++ + set(PACKAGE_NAME libunwind) + set(PACKAGE_VERSION 12.0.0) + set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") +@@ -115,17 +117,17 @@ set(CMAKE_MODULE_PATH + + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++) ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++) + if(LIBCXX_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) + string(APPEND LIBUNWIND_INSTALL_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) + endif() + elseif(LLVM_LIBRARY_OUTPUT_INTDIR) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX}) ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX}) + else() + set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX}) ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX}) + endif() + + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBUNWIND_LIBRARY_DIR}) diff --git a/pkgs/by-name/ll/llvm/12/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..61e2f0e --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/lld/gnu-install-dirs.patch @@ -0,0 +1,68 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d4e561b50d8f..cfa5bdd79c2a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -6,6 +6,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(LLD_BUILT_STANDALONE TRUE) + ++ include(GNUInstallDirs) ++ + find_program(LLVM_CONFIG_PATH "llvm-config" DOC "Path to llvm-config binary") + if(NOT LLVM_CONFIG_PATH) + message(FATAL_ERROR "llvm-config not found: specify LLVM_CONFIG_PATH") +@@ -179,7 +181,7 @@ include_directories(BEFORE + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + ) +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index 23df41312403..d62372c88de7 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -20,9 +20,9 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- RUNTIME DESTINATION bin) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) + add_llvm_install_targets(install-${name} +@@ -54,7 +54,7 @@ macro(add_lld_tool name) + + install(TARGETS ${name} + ${export_to_lldtargets} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT ${name}) + + if(NOT CMAKE_CONFIGURATION_TYPES) +@@ -69,5 +69,5 @@ endmacro() + macro(add_lld_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() +diff --git a/tools/lld/CMakeLists.txt b/tools/lld/CMakeLists.txt +index 5cff736ff57f..64e775c771b9 100644 +--- a/tools/lld/CMakeLists.txt ++++ b/tools/lld/CMakeLists.txt +@@ -21,7 +21,7 @@ target_link_libraries(lld + ) + + install(TARGETS lld +- RUNTIME DESTINATION bin) ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if(NOT LLD_SYMLINKS_TO_CREATE) + set(LLD_SYMLINKS_TO_CREATE diff --git a/pkgs/by-name/ll/llvm/12/lldb/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/lldb/gnu-install-dirs.patch new file mode 100644 index 0000000..afc945c --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/lldb/gnu-install-dirs.patch @@ -0,0 +1,91 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b5633e21c56a..f2f1035e9238 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,6 +10,8 @@ set(CMAKE_MODULE_PATH + # If we are not building as part of LLVM, build LLDB as a standalone project, + # using LLVM as an external library. + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) ++ include(GNUInstallDirs) ++ + project(lldb) + include(LLDBStandalone) + +diff --git a/cmake/modules/AddLLDB.cmake b/cmake/modules/AddLLDB.cmake +index 4ed5c647c5d2..89f96e710d55 100644 +--- a/cmake/modules/AddLLDB.cmake ++++ b/cmake/modules/AddLLDB.cmake +@@ -107,13 +107,13 @@ function(add_lldb_library name) + endif() + + if(PARAM_SHARED) +- set(install_dest lib${LLVM_LIBDIR_SUFFIX}) ++ set(install_dest ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(PARAM_INSTALL_PREFIX) + set(install_dest ${PARAM_INSTALL_PREFIX}) + endif() + # RUNTIME is relevant for DLL platforms, FRAMEWORK for macOS + install(TARGETS ${name} COMPONENT ${name} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${install_dest} + ARCHIVE DESTINATION ${install_dest} + FRAMEWORK DESTINATION ${install_dest}) +diff --git a/cmake/modules/LLDBConfig.cmake b/cmake/modules/LLDBConfig.cmake +index 2fdf1502d055..37364341ff8b 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -225,7 +225,7 @@ include_directories(BEFORE + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ + COMPONENT lldb-headers +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN ".cmake" EXCLUDE +@@ -233,7 +233,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ + COMPONENT lldb-headers +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN ".cmake" EXCLUDE +diff --git a/tools/intel-features/CMakeLists.txt b/tools/intel-features/CMakeLists.txt +index 734167e51bc5..f95761b5df58 100644 +--- a/tools/intel-features/CMakeLists.txt ++++ b/tools/intel-features/CMakeLists.txt +@@ -65,4 +65,4 @@ if (LLDB_ENABLE_PYTHON AND LLDB_BUILD_INTEL_PT) + endif() + + install(TARGETS lldbIntelFeatures +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) +diff --git a/cmake/modules/LLDBStandalone.cmake b/cmake/modules/LLDBStandalone.cmake +index 752113b..010f187 100644 +--- a/cmake/modules/LLDBStandalone.cmake ++++ b/cmake/modules/LLDBStandalone.cmake +@@ -62,7 +62,7 @@ endif() + + # They are used as destination of target generators. + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) +-set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 OR CYGWIN) + # DLL platform -- put DLLs into bin. + set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b5633e2..86e4738 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -79,7 +79,7 @@ if (LLDB_ENABLE_PYTHON) + if(LLDB_BUILD_FRAMEWORK) + set(lldb_python_target_dir "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Resources/Python/lldb") + else() +- set(lldb_python_target_dir "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_PYTHON_RELATIVE_PATH}/lldb") ++ set(lldb_python_target_dir "${CMAKE_INSTALL_LIBDIR}/../${LLDB_PYTHON_RELATIVE_PATH}/lldb") + endif() + get_target_property(lldb_python_bindings_dir swig_wrapper_python BINARY_DIR) + finish_swig_python("lldb-python" "${lldb_python_bindings_dir}" "${lldb_python_target_dir}") diff --git a/pkgs/by-name/ll/llvm/12/lldb/procfs.patch b/pkgs/by-name/ll/llvm/12/lldb/procfs.patch new file mode 100644 index 0000000..b075dba --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/lldb/procfs.patch @@ -0,0 +1,31 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -11,21 +11,12 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif diff --git a/pkgs/by-name/ll/llvm/12/lldb/resource-dir.patch b/pkgs/by-name/ll/llvm/12/lldb/resource-dir.patch new file mode 100644 index 0000000..e0db80a --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/lldb/resource-dir.patch @@ -0,0 +1,13 @@ +diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake +index 37364341ff8b..7f74c1a3e257 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -257,7 +257,7 @@ if (NOT TARGET clang-resource-headers) + # Iterate over the possible places where the external resource directory + # could be and pick the first that exists. + foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}" +- "${LLVM_BUILD_LIBRARY_DIR}" ++ "${LLVM_BUILD_LIBRARY_DIR}" "@clangLibDir@" + "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") + # Build the resource directory path by appending 'clang/'. + set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}") diff --git a/pkgs/by-name/ll/llvm/12/llvm/default.nix b/pkgs/by-name/ll/llvm/12/llvm/default.nix new file mode 100644 index 0000000..4745345 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/llvm/default.nix @@ -0,0 +1,357 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, fetch +, fetchpatch +, cmake +, python3 +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, buildLlvmTools +, debugVersion ? false +, doCheck ? stdenv.isLinux && (!stdenv.isx86_32) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +# broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 +# broken for the armv7l builder +, enablePFM ? stdenv.isLinux && !stdenv.hostPlatform.isAarch +, enablePolly ? false +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + let + checkDeps = ps: with ps; [ psutil ]; + in python3.withPackages checkDeps + else python3; + +in stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = fetch pname "1pzx9zrmd7r3481sbhwvkms68fwhffpp4mmz45dgrkjpyl2q96kx"; + polly_src = fetch "polly" "1yfm9ixda4a2sx7ak5vswijx4ydk5lv1c1xh39xmd2kh299y4m12"; + + unpackPhase = '' + unpackFile $src + mv llvm-${release_version}* llvm + sourceRoot=$PWD/llvm + '' + optionalString enablePolly '' + unpackFile $polly_src + mv polly-* $sourceRoot/tools/polly + ''; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake python ] + ++ optionals enableManpages [ python3.pkgs.sphinx python3.pkgs.recommonmark ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = optionals (stdenv.buildPlatform == stdenv.hostPlatform) [ ncurses ] + ++ [ zlib ]; + + patches = [ + # When cross-compiling we configure llvm-config-native with an approximation + # of the flags used for the normal LLVM build. To avoid the need for building + # a native libLLVM.so (which would fail) we force llvm-config to be linked + # statically against the necessary LLVM components always. + ../../common/llvm/llvm-config-link-static.patch + # Fix llvm being miscompiled by some gccs. See llvm/llvm-project#49955 + # Fix llvm being miscompiled by some gccs. See https://github.com/llvm/llvm-project/issues/49955 + ./fix-llvm-issue-49955.patch + + ./gnu-install-dirs.patch + # On older CPUs (e.g. Hydra/wendy) we'd be getting an error in this test. + (fetchpatch { + name = "uops-CMOV16rm-noreg.diff"; + url = "https://github.com/llvm/llvm-project/commit/9e9f991ac033.diff"; + sha256 = "sha256:12s8vr6ibri8b48h2z38f3afhwam10arfiqfy4yg37bmc054p5hi"; + stripLen = 1; + }) + + # Fix musl build. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5cd554303ead0f8891eee3cd6d25cb07f5a7bf67.patch"; + relative = "llvm"; + hash = "sha256-XPbvNJ45SzjMGlNUgt/IgEvM2dHQpDOe6woUJY+nUYA="; + }) + + # Backport gcc-13 fixes with missing includes. + (fetchpatch { + name = "signals-gcc-13.patch"; + url = "https://github.com/llvm/llvm-project/commit/ff1681ddb303223973653f7f5f3f3435b48a1983.patch"; + hash = "sha256-CXwYxQezTq5vdmc8Yn88BUAEly6YZ5VEIA6X3y5NNOs="; + stripLen = 1; + }) + (fetchpatch { + name = "base64-gcc-13.patch"; + url = "https://github.com/llvm/llvm-project/commit/5e9be93566f39ee6cecd579401e453eccfbe81e5.patch"; + hash = "sha256-PAwrVrvffPd7tphpwCkYiz+67szPRzRB2TXBvKfzQ7U="; + stripLen = 1; + }) + ] ++ lib.optional enablePolly ./gnu-install-dirs-polly.patch; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + # TODO: Fix failing tests: + rm test/DebugInfo/X86/vla-multi.ll + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-objcopy/MachO/universal-object.test + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + '' + '' + # Tweak tests to ignore namespace part of type to support + # gcc-12: https://gcc.gnu.org/PR103598. + # The change below mangles strings like: + # CHECK-NEXT: Starting llvm::Function pass manager run. + # to: + # CHECK-NEXT: Starting {{.*}}Function pass manager run. + for f in \ + test/Other/new-pass-manager.ll \ + test/Other/new-pm-O0-defaults.ll \ + test/Other/new-pm-defaults.ll \ + test/Other/new-pm-lto-defaults.ll \ + test/Other/new-pm-thinlto-defaults.ll \ + test/Other/pass-pipeline-parsing.ll \ + test/Transforms/Inline/cgscc-incremental-invalidate.ll \ + test/Transforms/Inline/clear-analyses.ll \ + test/Transforms/LoopUnroll/unroll-loop-invalidation.ll \ + test/Transforms/SCCP/ipsccp-preserve-analysis.ll \ + test/Transforms/SCCP/preserve-analysis.ll \ + test/Transforms/SROA/dead-inst.ll \ + test/tools/gold/X86/new-pm.ll \ + ; do + echo "PATCH: $f" + substituteInPlace $f \ + --replace 'Starting llvm::' 'Starting {{.*}}' \ + --replace 'Finished llvm::' 'Finished {{.*}}' + done + '' + '' + # gcc-13 fix + sed -i '/#include /i#include ' \ + include/llvm/DebugInfo/Symbolize/DIPrinter.h + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS='-svj''${NIX_BUILD_CORES} --no-progress-bar' + ) + ''; + + # hacky fix: created binaries need to be run before installation + preBuild = '' + mkdir -p $out/ + ln -sv $PWD/lib $out + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals (enableGoldPlugin) [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postBuild = '' + rm -fR $out + ''; + + preCheck = '' + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/lib + ''; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + buildPhase = '' + make docs-llvm-man + ''; + + propagatedBuildInputs = []; + + installPhase = '' + make -C docs install + ''; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/12/llvm/fix-llvm-issue-49955.patch b/pkgs/by-name/ll/llvm/12/llvm/fix-llvm-issue-49955.patch new file mode 100644 index 0000000..b515583 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/llvm/fix-llvm-issue-49955.patch @@ -0,0 +1,13 @@ +diff --git a/lib/CodeGen/AsmPrinter/CMakeLists.txt b/lib/CodeGen/AsmPrinter/CMakeLists.txt +index eb924282..c77c140b 100644 +--- a/lib/CodeGen/AsmPrinter/CMakeLists.txt ++++ b/lib/CodeGen/AsmPrinter/CMakeLists.txt +@@ -44,3 +44,8 @@ add_llvm_component_library(LLVMAsmPrinter + Support + Target + ) ++ ++if (CMAKE_COMPILER_IS_GNUCXX) ++ set_source_files_properties(DwarfCompileUnit.cpp PROPERTIES ++ COMPILE_FLAGS -fno-strict-aliasing) ++endif() diff --git a/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..68f3c45 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,105 @@ +diff --git a/tools/polly/CMakeLists.txt b/tools/polly/CMakeLists.txt +index ca7c04c565bb..6ed5db5dd4f8 100644 +--- a/tools/polly/CMakeLists.txt ++++ b/tools/polly/CMakeLists.txt +@@ -2,7 +2,11 @@ + if (NOT DEFINED LLVM_MAIN_SRC_DIR) + project(Polly) + cmake_minimum_required(VERSION 3.13.4) ++endif() ++ ++include(GNUInstallDirs) + ++if (NOT DEFINED LLVM_MAIN_SRC_DIR) + # Where is LLVM installed? + find_package(LLVM CONFIG REQUIRED) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LLVM_CMAKE_DIR}) +@@ -122,13 +126,13 @@ include_directories( + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + ) + + install(DIRECTORY ${POLLY_BINARY_DIR}/include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN "CMakeFiles" EXCLUDE +diff --git a/tools/polly/cmake/CMakeLists.txt b/tools/polly/cmake/CMakeLists.txt +index 7cc129ba2e90..137be25e4b80 100644 +--- a/tools/polly/cmake/CMakeLists.txt ++++ b/tools/polly/cmake/CMakeLists.txt +@@ -79,18 +79,18 @@ file(GENERATE + + # Generate PollyConfig.cmake for the install tree. + unset(POLLY_EXPORTS) +-set(POLLY_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") ++set(POLLY_INSTALL_PREFIX "") + set(POLLY_CONFIG_LLVM_CMAKE_DIR "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") +-set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}") +-set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}") ++set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}") ++set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + if (POLLY_BUNDLED_ISL) + set(POLLY_CONFIG_INCLUDE_DIRS +- "${POLLY_INSTALL_PREFIX}/include" +- "${POLLY_INSTALL_PREFIX}/include/polly" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}/polly" + ) + else() + set(POLLY_CONFIG_INCLUDE_DIRS +- "${POLLY_INSTALL_PREFIX}/include" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_INCLUDEDIR}" + ${ISL_INCLUDE_DIRS} + ) + endif() +@@ -100,12 +100,12 @@ endif() + foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS) + get_target_property(tgt_type ${tgt} TYPE) + if (tgt_type STREQUAL "EXECUTABLE") +- set(tgt_prefix "bin/") ++ set(tgt_prefix "${CMAKE_INSTALL_BINDIR}/") + else() +- set(tgt_prefix "lib/") ++ set(tgt_prefix "${CMAKE_INSTALL_LIBDIR}/") + endif() + +- set(tgt_path "${CMAKE_INSTALL_PREFIX}/${tgt_prefix}$") ++ set(tgt_path "${tgt_prefix}$") + file(RELATIVE_PATH tgt_path ${POLLY_CONFIG_CMAKE_DIR} ${tgt_path}) + + if (NOT tgt_type STREQUAL "INTERFACE_LIBRARY") +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) +diff --git a/tools/polly/lib/External/CMakeLists.txt b/tools/polly/lib/External/CMakeLists.txt +index 8991094d92c7..178d8ad606bb 100644 +--- a/tools/polly/lib/External/CMakeLists.txt ++++ b/tools/polly/lib/External/CMakeLists.txt +@@ -275,7 +275,7 @@ if (POLLY_BUNDLED_ISL) + install(DIRECTORY + ${ISL_SOURCE_DIR}/include/ + ${ISL_BINARY_DIR}/include/ +- DESTINATION include/polly ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/polly + FILES_MATCHING + PATTERN "*.h" + PATTERN "CMakeFiles" EXCLUDE diff --git a/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..da8dc14 --- /dev/null +++ b/pkgs/by-name/ll/llvm/12/llvm/gnu-install-dirs.patch @@ -0,0 +1,417 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 277d0fe54d7b..af69c8be8745 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -256,15 +256,21 @@ if (CMAKE_BUILD_TYPE AND + message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") + endif() + ++include(GNUInstallDirs) ++ + set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) + +-set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')") ++set(LLVM_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING ++ "Path for binary subdirectory (defaults to 'bin')") + mark_as_advanced(LLVM_TOOLS_INSTALL_DIR) + + set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING + "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)") + mark_as_advanced(LLVM_UTILS_INSTALL_DIR) + ++set(LLVM_INSTALL_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/cmake/llvm" CACHE STRING ++ "Path for CMake subdirectory (defaults to lib/cmake/llvm)" ) ++ + # They are used as destination of target generators. + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) +@@ -567,9 +573,9 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF) + option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON) + option (LLVM_ENABLE_BINDINGS "Build bindings." ON) + +-set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html" ++set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html" + CACHE STRING "Doxygen-generated HTML documentation install directory") +-set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html" ++set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/ocaml-html" + CACHE STRING "OCamldoc-generated HTML documentation install directory") + + option (LLVM_BUILD_EXTERNAL_COMPILER_RT +@@ -1027,7 +1033,7 @@ endif() + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/llvm include/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "*.def" +@@ -1038,7 +1044,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + ) + + install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "*.def" +@@ -1052,13 +1058,13 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + if (LLVM_INSTALL_MODULEMAPS) + install(DIRECTORY include/llvm include/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "module.modulemap" + ) + install(FILES include/llvm/module.install.modulemap +- DESTINATION include/llvm ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm + COMPONENT llvm-headers + RENAME "module.extern.modulemap" + ) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 97c9980c7de3..409e8b615f75 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -804,9 +804,9 @@ macro(add_llvm_library name) + + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- RUNTIME DESTINATION bin COMPONENT ${name}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-${name} +@@ -1022,7 +1022,7 @@ function(process_llvm_pass_plugins) + "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})") + install(FILES + ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake +- DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} ++ DESTINATION ${LLVM_INSTALL_CMAKE_DIR} + COMPONENT cmake-exports) + + set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def") +@@ -1242,7 +1242,7 @@ macro(add_llvm_example name) + endif() + add_llvm_executable(${name} ${ARGN}) + if( LLVM_BUILD_EXAMPLES ) +- install(TARGETS ${name} RUNTIME DESTINATION examples) ++ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples) + endif() + set_target_properties(${name} PROPERTIES FOLDER "Examples") + endmacro(add_llvm_example name) +@@ -1854,7 +1854,7 @@ function(llvm_install_library_symlink name dest type) + set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) + set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir bin) + endif() +@@ -1871,7 +1871,7 @@ function(llvm_install_library_symlink name dest type) + endif() + endfunction() + +-function(llvm_install_symlink name dest) ++function(llvm_install_symlink name dest output_dir) + cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN}) + foreach(path ${CMAKE_MODULE_PATH}) + if(EXISTS ${path}/LLVMInstallSymlink.cmake) +@@ -1894,7 +1894,7 @@ function(llvm_install_symlink name dest) + set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) + + install(SCRIPT ${INSTALL_SYMLINK} +- CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})" ++ CODE "install_symlink(${full_name} ${full_dest} ${output_dir})" + COMPONENT ${component}) + + if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) +@@ -1977,7 +1977,8 @@ function(add_llvm_tool_symlink link_name target) + endif() + + if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS) +- llvm_install_symlink(${link_name} ${target}) ++ GNUInstallDirs_get_absolute_install_dir(output_dir LLVM_TOOLS_INSTALL_DIR) ++ llvm_install_symlink(${link_name} ${target} ${output_dir}) + endif() + endif() + endfunction() +@@ -2100,9 +2101,9 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 554046b20edf..4d1ad980641e 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -144,9 +144,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/AddSphinxTarget.cmake b/cmake/modules/AddSphinxTarget.cmake +index e80c3b5c1cac..482f6d715ef5 100644 +--- a/cmake/modules/AddSphinxTarget.cmake ++++ b/cmake/modules/AddSphinxTarget.cmake +@@ -90,7 +90,7 @@ function (add_sphinx_target builder project) + endif() + elseif (builder STREQUAL html) + string(TOUPPER "${project}" project_upper) +- set(${project_upper}_INSTALL_SPHINX_HTML_DIR "share/doc/${project}/html" ++ set(${project_upper}_INSTALL_SPHINX_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/html" + CACHE STRING "HTML documentation install directory for ${project}") + + # '/.' indicates: copy the contents of the directory directly into +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index 505dc9a29d70..36e6c63af3f4 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -1,4 +1,4 @@ +-set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) ++set(LLVM_INSTALL_PACKAGE_DIR ${LLVM_INSTALL_CMAKE_DIR} CACHE STRING "Path for CMake subdirectory (defaults to 'cmake/llvm')") + set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") + + # First for users who use an installed LLVM, create the LLVMExports.cmake file. +@@ -107,13 +107,13 @@ foreach(p ${_count}) + set(LLVM_CONFIG_CODE "${LLVM_CONFIG_CODE} + get_filename_component(LLVM_INSTALL_PREFIX \"\${LLVM_INSTALL_PREFIX}\" PATH)") + endforeach(p) +-set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/include") ++set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") + set(LLVM_CONFIG_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}") + set(LLVM_CONFIG_MAIN_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}") +-set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/lib\${LLVM_LIBDIR_SUFFIX}") ++set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_CMAKE_DIR "\${LLVM_INSTALL_PREFIX}/${LLVM_INSTALL_PACKAGE_DIR}") + set(LLVM_CONFIG_BINARY_DIR "\${LLVM_INSTALL_PREFIX}") +-set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/bin") ++set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + + # Generate a default location for lit + if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS) +diff --git a/cmake/modules/LLVMInstallSymlink.cmake b/cmake/modules/LLVMInstallSymlink.cmake +index 09fed8085c23..aa79f192abf0 100644 +--- a/cmake/modules/LLVMInstallSymlink.cmake ++++ b/cmake/modules/LLVMInstallSymlink.cmake +@@ -10,7 +10,7 @@ function(install_symlink name target outdir) + set(LINK_OR_COPY copy) + endif() + +- set(bindir "${DESTDIR}${CMAKE_INSTALL_PREFIX}/${outdir}/") ++ set(bindir "${DESTDIR}${outdir}/") + + message(STATUS "Creating ${name}") + +diff --git a/docs/CMake.rst b/docs/CMake.rst +index bb821b417ad9..6a528f7c2ad3 100644 +--- a/docs/CMake.rst ++++ b/docs/CMake.rst +@@ -196,7 +196,7 @@ CMake manual, or execute ``cmake --help-variable VARIABLE_NAME``. + **LLVM_LIBDIR_SUFFIX**:STRING + Extra suffix to append to the directory where libraries are to be + installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64`` +- to install libraries to ``/usr/lib64``. ++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``. + + **CMAKE_C_FLAGS**:STRING + Extra flags to use when compiling C source files. +@@ -550,8 +550,8 @@ LLVM-specific variables + + **LLVM_INSTALL_DOXYGEN_HTML_DIR**:STRING + The path to install Doxygen-generated HTML documentation to. This path can +- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to +- `share/doc/llvm/doxygen-html`. ++ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to ++ `${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html`. + + **LLVM_ENABLE_SPHINX**:BOOL + If specified, CMake will search for the ``sphinx-build`` executable and will make +@@ -582,13 +582,33 @@ LLVM-specific variables + + **LLVM_INSTALL_SPHINX_HTML_DIR**:STRING + The path to install Sphinx-generated HTML documentation to. This path can +- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to +- `share/doc/llvm/html`. ++ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to ++ `${CMAKE_INSTALL_DOCDIR}/${project}/html`. + + **LLVM_INSTALL_OCAMLDOC_HTML_DIR**:STRING + The path to install OCamldoc-generated HTML documentation to. This path can +- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to +- `share/doc/llvm/ocaml-html`. ++ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to ++ `${CMAKE_INSTALL_DOCDIR}/${project}/ocaml-html`. ++ ++**CMAKE_INSTALL_BINDIR**:STRING ++ The path to install binary tools, relative to the ``CMAKE_INSTALL_PREFIX``. ++ Defaults to `bin`. ++ ++**CMAKE_INSTALL_LIBDIR**:STRING ++ The path to install libraries, relative to the ``CMAKE_INSTALL_PREFIX``. ++ Defaults to `lib`. ++ ++**CMAKE_INSTALL_INCLUDEDIR**:STRING ++ The path to install header files, relative to the ``CMAKE_INSTALL_PREFIX``. ++ Defaults to `include`. ++ ++**CMAKE_INSTALL_DOCDIR**:STRING ++ The path to install documentation, relative to the ``CMAKE_INSTALL_PREFIX``. ++ Defaults to `share/doc`. ++ ++**CMAKE_INSTALL_MANDIR**:STRING ++ The path to install manpage files, relative to the ``CMAKE_INSTALL_PREFIX``. ++ Defaults to `share/man`. + + **LLVM_CREATE_XCODE_TOOLCHAIN**:BOOL + macOS Only: If enabled CMake will generate a target named +@@ -786,9 +806,11 @@ the ``cmake`` command or by setting it directly in ``ccmake`` or ``cmake-gui``). + + This file is available in two different locations. + +-* ``/lib/cmake/llvm/LLVMConfig.cmake`` where +- ```` is the install prefix of an installed version of LLVM. +- On Linux typically this is ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. ++* ``LLVMConfig.cmake`` where ++ ```` is the location where LLVM CMake modules are ++ installed as part of an installed version of LLVM. This is typically ++ ``cmake/llvm/`` within the lib directory. On Linux, this is typically ++ ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. + + * ``/lib/cmake/llvm/LLVMConfig.cmake`` where + ```` is the root of the LLVM build tree. **Note: this is only +diff --git a/examples/Bye/CMakeLists.txt b/examples/Bye/CMakeLists.txt +index bb96edb4b4bf..678c22fb43c8 100644 +--- a/examples/Bye/CMakeLists.txt ++++ b/examples/Bye/CMakeLists.txt +@@ -14,6 +14,6 @@ if (NOT WIN32) + BUILDTREE_ONLY + ) + +- install(TARGETS ${name} RUNTIME DESTINATION examples) ++ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples) + set_target_properties(${name} PROPERTIES FOLDER "Examples") + endif() +diff --git a/include/llvm/CMakeLists.txt b/include/llvm/CMakeLists.txt +index b46319f24fc8..2feabd1954e4 100644 +--- a/include/llvm/CMakeLists.txt ++++ b/include/llvm/CMakeLists.txt +@@ -5,5 +5,5 @@ add_subdirectory(Frontend) + # If we're doing an out-of-tree build, copy a module map for generated + # header files into the build area. + if (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +- configure_file(module.modulemap.build module.modulemap COPYONLY) ++ configure_file(module.modulemap.build ${LLVM_INCLUDE_DIR}/module.modulemap COPYONLY) + endif (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index ebe5b73a5c65..70c497be12f5 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,10 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_BINDIR "@CMAKE_INSTALL_BINDIR@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" ++#define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" ++#define LLVM_INSTALL_CMAKEDIR "@LLVM_INSTALL_CMAKE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" + #define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@" + #define LLVM_BUILD_SYSTEM "@LLVM_BUILD_SYSTEM@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index 1a2f04552d13..44fa7d3eec6b 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -357,12 +357,26 @@ int main(int argc, char **argv) { + ("-I" + ActiveIncludeDir + " " + "-I" + ActiveObjRoot + "/include"); + } else { + ActivePrefix = CurrentExecPrefix; +- ActiveIncludeDir = ActivePrefix + "/include"; +- SmallString<256> path(StringRef(LLVM_TOOLS_INSTALL_DIR)); +- sys::fs::make_absolute(ActivePrefix, path); +- ActiveBinDir = std::string(path.str()); +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; +- ActiveCMakeDir = ActiveLibDir + "/cmake/llvm"; ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_INCLUDEDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveIncludeDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_BINDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveBinDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveLibDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_CMAKEDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveCMakeDir = std::string(path.str()); ++ } + ActiveIncludeOption = "-I" + ActiveIncludeDir; + } + +diff --git a/tools/lto/CMakeLists.txt b/tools/lto/CMakeLists.txt +index 2963f97cad88..69d66c9c9ca1 100644 +--- a/tools/lto/CMakeLists.txt ++++ b/tools/lto/CMakeLists.txt +@@ -25,7 +25,7 @@ add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS + intrinsics_gen) + + install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h +- DESTINATION include/llvm-c ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c + COMPONENT LTO) + + if (APPLE) +diff --git a/tools/opt-viewer/CMakeLists.txt b/tools/opt-viewer/CMakeLists.txt +index ead73ec13a8f..250362021f17 100644 +--- a/tools/opt-viewer/CMakeLists.txt ++++ b/tools/opt-viewer/CMakeLists.txt +@@ -8,7 +8,7 @@ set (files + + foreach (file ${files}) + install(PROGRAMS ${file} +- DESTINATION share/opt-viewer ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/opt-viewer + COMPONENT opt-viewer) + endforeach (file) + +diff --git a/tools/remarks-shlib/CMakeLists.txt b/tools/remarks-shlib/CMakeLists.txt +index 865436247270..ce1daa62f6ab 100644 +--- a/tools/remarks-shlib/CMakeLists.txt ++++ b/tools/remarks-shlib/CMakeLists.txt +@@ -19,7 +19,7 @@ if(LLVM_ENABLE_PIC) + endif() + + install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/Remarks.h +- DESTINATION include/llvm-c ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c + COMPONENT Remarks) + + if (APPLE) diff --git a/pkgs/by-name/ll/llvm/13/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/13/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..b834d38 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/clang/gnu-install-dirs.patch @@ -0,0 +1,235 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9e74014134a0..976e6a1757fd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -5,6 +5,8 @@ cmake_minimum_required(VERSION 3.13.4) + if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) + project(Clang) + ++ include(GNUInstallDirs) ++ + set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to") + set(CMAKE_CXX_STANDARD_REQUIRED YES) + set(CMAKE_CXX_EXTENSIONS NO) +@@ -416,7 +418,7 @@ include_directories(BEFORE + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/clang include/clang-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT clang-headers + FILES_MATCHING + PATTERN "*.def" +@@ -425,7 +427,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + ) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT clang-headers + FILES_MATCHING + PATTERN "CMakeFiles" EXCLUDE +@@ -445,7 +447,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh) + install(PROGRAMS utils/bash-autocomplete.sh +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT bash-autocomplete) + if(NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-bash-autocomplete +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 704278a0e93b..d25c8d325c71 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -123,9 +123,9 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- RUNTIME DESTINATION bin) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if (NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-${lib} +@@ -170,7 +170,7 @@ macro(add_clang_tool name) + + install(TARGETS ${name} + ${export_to_clangtargets} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT ${name}) + + if(NOT LLVM_ENABLE_IDE) +@@ -185,7 +185,7 @@ endmacro() + macro(add_clang_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() + + function(clang_target_link_libraries target type) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index b2c0ce8dd4a0..19e5443d8c25 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -215,7 +215,7 @@ set_target_properties(clang-resource-headers PROPERTIES + FOLDER "Misc" + RUNTIME_OUTPUT_DIRECTORY "${output_dir}") + +-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) + + install( + FILES ${files} ${generated_files} +diff --git a/tools/c-index-test/CMakeLists.txt b/tools/c-index-test/CMakeLists.txt +index ceef4b08637c..8efad5520ca4 100644 +--- a/tools/c-index-test/CMakeLists.txt ++++ b/tools/c-index-test/CMakeLists.txt +@@ -54,7 +54,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + set_property(TARGET c-index-test APPEND PROPERTY INSTALL_RPATH + "@executable_path/../../lib") + else() +- set(INSTALL_DESTINATION bin) ++ set(INSTALL_DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + install(TARGETS c-index-test +diff --git a/tools/clang-format/CMakeLists.txt b/tools/clang-format/CMakeLists.txt +index 35ecdb11253c..d77d75de0094 100644 +--- a/tools/clang-format/CMakeLists.txt ++++ b/tools/clang-format/CMakeLists.txt +@@ -21,20 +21,20 @@ if( LLVM_LIB_FUZZING_ENGINE OR LLVM_USE_SANITIZE_COVERAGE ) + endif() + + install(PROGRAMS clang-format-bbedit.applescript +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format-diff.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format-sublime.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format.el +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS clang-format.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-format) + install(PROGRAMS git-clang-format +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT clang-format) +diff --git a/tools/clang-rename/CMakeLists.txt b/tools/clang-rename/CMakeLists.txt +index cda8e29ec5b1..0134d8ccd70b 100644 +--- a/tools/clang-rename/CMakeLists.txt ++++ b/tools/clang-rename/CMakeLists.txt +@@ -19,8 +19,8 @@ clang_target_link_libraries(clang-rename + ) + + install(PROGRAMS clang-rename.py +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-rename) + install(PROGRAMS clang-rename.el +- DESTINATION share/clang ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/clang + COMPONENT clang-rename) +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 51ff2e7e1565..1ed5f8a079a1 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -166,7 +166,7 @@ endif() + if(INTERNAL_INSTALL_PREFIX) + set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include") + else() +- set(LIBCLANG_HEADERS_INSTALL_DESTINATION include) ++ set(LIBCLANG_HEADERS_INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + endif() + + install(DIRECTORY ../../include/clang-c +@@ -196,7 +196,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build/CMakeLists.txt b/tools/scan-build/CMakeLists.txt +index ec0702d76f18..d25d982f51da 100644 +--- a/tools/scan-build/CMakeLists.txt ++++ b/tools/scan-build/CMakeLists.txt +@@ -47,7 +47,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile}) + install(PROGRAMS bin/${BinFile} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT scan-build) + endforeach() + +@@ -61,7 +61,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libexec/${LibexecFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/libexec/${LibexecFile}) + install(PROGRAMS libexec/${LibexecFile} +- DESTINATION libexec ++ DESTINATION ${CMAKE_INSTALL_LIBEXECDIR} + COMPONENT scan-build) + endforeach() + +@@ -89,7 +89,7 @@ if(CLANG_INSTALL_SCANBUILD) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/scan-build/${ShareFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile}) + install(FILES share/scan-build/${ShareFile} +- DESTINATION share/scan-build ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-build + COMPONENT scan-build) + endforeach() + +diff --git a/tools/scan-view/CMakeLists.txt b/tools/scan-view/CMakeLists.txt +index dd3d33439299..fea19c12ce70 100644 +--- a/tools/scan-view/CMakeLists.txt ++++ b/tools/scan-view/CMakeLists.txt +@@ -19,7 +19,7 @@ if(CLANG_INSTALL_SCANVIEW) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile}) + install(PROGRAMS bin/${BinFile} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT scan-view) + endforeach() + +@@ -33,7 +33,7 @@ if(CLANG_INSTALL_SCANVIEW) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile}) + install(FILES share/${ShareFile} +- DESTINATION share/scan-view ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/scan-view + COMPONENT scan-view) + endforeach() + +diff --git a/utils/hmaptool/CMakeLists.txt b/utils/hmaptool/CMakeLists.txt +index 62f2de0cb15c..6aa66825b6ec 100644 +--- a/utils/hmaptool/CMakeLists.txt ++++ b/utils/hmaptool/CMakeLists.txt +@@ -10,7 +10,7 @@ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HM + + list(APPEND Depends ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin/${CLANG_HMAPTOOL}) + install(PROGRAMS ${CLANG_HMAPTOOL} +- DESTINATION bin ++ DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT hmaptool) + + add_custom_target(hmaptool ALL DEPENDS ${Depends}) diff --git a/pkgs/by-name/ll/llvm/13/clang/purity.patch b/pkgs/by-name/ll/llvm/13/clang/purity.patch new file mode 100644 index 0000000..deb230a --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/clang/purity.patch @@ -0,0 +1,28 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,12 +487,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + if (!IsStatic) { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); +- +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/13/clang/revert-malloc-alignment-assumption.patch b/pkgs/by-name/ll/llvm/13/clang/revert-malloc-alignment-assumption.patch new file mode 100644 index 0000000..f8e55ff --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/clang/revert-malloc-alignment-assumption.patch @@ -0,0 +1,78 @@ +--- b/include/clang/Basic/TargetInfo.h ++++ a/include/clang/Basic/TargetInfo.h +@@ -612,8 +612,8 @@ + } + + /// Return the largest alignment for which a suitably-sized allocation with ++ /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned ++ /// pointer. +- /// '::operator new(size_t)' or 'malloc' is guaranteed to produce a +- /// correctly-aligned pointer. + unsigned getNewAlign() const { + return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign); + } +--- b/lib/CodeGen/CGCall.cpp ++++ a/lib/CodeGen/CGCall.cpp +@@ -2048,24 +2048,6 @@ + // allows it to work on indirect virtual function calls. + if (AttrOnCallSite && TargetDecl->hasAttr()) + FuncAttrs.addAttribute(llvm::Attribute::NoMerge); +- +- // Add known guaranteed alignment for allocation functions. +- if (unsigned BuiltinID = Fn->getBuiltinID()) { +- switch (BuiltinID) { +- case Builtin::BIaligned_alloc: +- case Builtin::BIcalloc: +- case Builtin::BImalloc: +- case Builtin::BImemalign: +- case Builtin::BIrealloc: +- case Builtin::BIstrdup: +- case Builtin::BIstrndup: +- RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / +- Context.getTargetInfo().getCharWidth()); +- break; +- default: +- break; +- } +- } + } + + // 'const', 'pure' and 'noalias' attributed functions are also nounwind. +--- b/test/CodeGen/alloc-fns-alignment.c ++++ /dev/null +@@ -1,35 +0,0 @@ +-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +-// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +-// RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 +-// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN8 +-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-malloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-MALLOC +-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-calloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-CALLOC +-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-realloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-REALLOC +- +-typedef __SIZE_TYPE__ size_t; +- +-void *malloc(size_t); +-void *calloc(size_t, size_t); +-void *realloc(void *, size_t); +- +-void *malloc_test(size_t n) { +- return malloc(n); +-} +- +-void *calloc_test(size_t n) { +- return calloc(1, n); +-} +- +-void *raalloc_test(void *p, size_t n) { +- return realloc(p, n); +-} +- +-// ALIGN16: align 16 i8* @malloc +-// ALIGN16: align 16 i8* @calloc +-// ALIGN16: align 16 i8* @realloc +-// ALIGN8: align 8 i8* @malloc +-// ALIGN8: align 8 i8* @calloc +-// ALIGN8: align 8 i8* @realloc +-// NOBUILTIN-MALLOC: declare i8* @malloc +-// NOBUILTIN-CALLOC: declare i8* @calloc +-// NOBUILTIN-REALLOC: declare i8* @realloc diff --git a/pkgs/by-name/ll/llvm/13/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/13/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..66742e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -345,4 +345,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -608,6 +612,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/13/compiler-rt/armv7l.patch b/pkgs/by-name/ll/llvm/13/compiler-rt/armv7l.patch new file mode 100644 index 0000000..6818684 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/compiler-rt/armv7l.patch @@ -0,0 +1,31 @@ +diff -ur compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake +--- compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake 2020-05-10 03:42:00.883450706 +0900 +@@ -37,6 +37,6 @@ + + set(ARM64 aarch64) +-set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main) ++set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv7l armv8m.main armv8.1m.main) + set(HEXAGON hexagon) + set(X86 i386) + set(X86_64 x86_64) +diff -ur compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt +--- compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt 2020-05-10 03:44:49.468579650 +0900 +@@ -555,6 +555,7 @@ + set(armv7_SOURCES ${arm_SOURCES}) + set(armv7s_SOURCES ${arm_SOURCES}) + set(armv7k_SOURCES ${arm_SOURCES}) ++set(armv7l_SOURCES ${arm_SOURCES}) + set(arm64_SOURCES ${aarch64_SOURCES}) + + # macho_embedded archs +@@ -705,7 +705,7 @@ + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported +- if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$") ++ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7l|armv7m|armv7em|armv8m.main|armv8.1m.main)$") + string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}") + check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP) + if(NOT COMPILER_RT_HAS_${arch}_VFP) diff --git a/pkgs/by-name/ll/llvm/13/compiler-rt/codesign.patch b/pkgs/by-name/ll/llvm/13/compiler-rt/codesign.patch new file mode 100644 index 0000000..065959d --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/compiler-rt/codesign.patch @@ -0,0 +1,33 @@ +From 3dec5f3475a26aeb4678627795c4b67c6b7b4785 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 19 Sep 2017 13:13:06 -0500 +Subject: [PATCH] remove codesign use on Apple, disable ios sim testing that + needs it + +--- + cmake/Modules/AddCompilerRT.cmake | 8 ------ + test/asan/CMakeLists.txt | 52 --------------------------------------- + test/tsan/CMakeLists.txt | 47 ----------------------------------- + 3 files changed, 107 deletions(-) + +diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake +index bc69ec95c419..9f100fdcec2f 100644 +--- a/cmake/Modules/AddCompilerRT.cmake ++++ b/cmake/Modules/AddCompilerRT.cmake +@@ -366,14 +366,6 @@ function(add_compiler_rt_runtime name type) + set_target_properties(${libname} PROPERTIES IMPORT_PREFIX "") + set_target_properties(${libname} PROPERTIES IMPORT_SUFFIX ".lib") + endif() +- if(APPLE) +- # Ad-hoc sign the dylibs +- add_custom_command(TARGET ${libname} +- POST_BUILD +- COMMAND codesign --sign - $ +- WORKING_DIRECTORY ${COMPILER_RT_OUTPUT_LIBRARY_DIR} +- ) +- endif() + endif() + + set(parent_target_arg) +2.14.1 + diff --git a/pkgs/by-name/ll/llvm/13/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/13/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/13/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/13/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..135cf62 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +index f1f46fb9599c..6f19e69507ba 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -302,8 +302,9 @@ macro(load_llvm_config) + # Get some LLVM variables from LLVMConfig. + include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake") + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + endif() + endmacro() + diff --git a/pkgs/by-name/ll/llvm/13/default.nix b/pkgs/by-name/ll/llvm/13/default.nix new file mode 100644 index 0000000..018fb0c --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/default.nix @@ -0,0 +1,388 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake +, preLibcCrossHeaders +, fetchpatch +, libxml2, python3, isl, fetchFromGitHub, substitute, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM version's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "13.0.1"; sha256 = "06dv6h5dmvzdxbif2s8njki6h32796v368dyb5945x8gjj72xh7k"; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null + +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + # Import releaseInfo separately to avoid infinite recursion + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + inherit (releaseInfo) release_version version; + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + src = monorepoSrc; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version src buildLlvmTools; }); + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + # Revert of https://reviews.llvm.org/D100879 + # The malloc alignment assumption is incorrect for jemalloc and causes + # mis-compilation in firefox. + # See: https://bugzilla.mozilla.org/show_bug.cgi?id=1741454 + ./clang/revert-malloc-alignment-assumption.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-11-15-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # TODO: lldb/docs/index.rst:155:toctree contains reference to nonexisting document 'design/structureddataplugins' + # lldb-manpages = lowPrio (tools.lldb.override { + # enableManpages = true; + # python3 = pkgs.python3; # don't use python-boot + # }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc + else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ]; + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + patches = + let + resourceDirPatch = callPackage + ({ substituteAll, libclang }: substituteAll + { + src = ./lldb/resource-dir.patch; + clangLibDir = "${libclang.lib}/lib"; + }) + { }; + in + [ + ./lldb/procfs.patch + resourceDirPatch + ./lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt -Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + '' + lib.optionalString (!stdenv.targetPlatform.isWasm) '' + echo "--unwindlib=libunwind" >> $out/nix-support/cc-cflags + echo "-L${targetLlvmLibraries.libunwind}/lib" >> $out/nix-support/cc-ldflags + '' + lib.optionalString (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) '' + echo "-lunwind" >> $out/nix-support/cc-ldflags + '' + lib.optionalString stdenv.targetPlatform.isWasm '' + echo "-fno-exceptions" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + echo "-nostdlib++" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = '' + echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags + echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands cc; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = '' + echo "-nostartfiles" >> $out/nix-support/cc-cflags + '' + mkExtraBuildCommands0 cc; + }; + + clangNoCompilerRtWithLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + }; + + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version src; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ../common/compiler-rt/armv6-scudo-no-yield.patch + ../common/compiler-rt/armv6-scudo-libatomic.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ../common/compiler-rt/armv6-scudo-no-yield.patch + ../common/compiler-rt/armv6-scudo-libatomic.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + libcxx = callPackage ../common/libcxx { + patches = [ + (substitute { + src = ../common/libcxxabi/wasm.patch; + replacements = [ + "--replace-fail" "/cmake/" "/llvm/cmake/" + ]; + }) + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + (substitute { + src = ../common/libcxx/libcxx-0001-musl-hacks.patch; + replacements = [ + "--replace-fail" "/include/" "/libcxx/include/" + ]; + }) + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + monorepoSrc = src; + }; + + libunwind = callPackage ../common/libunwind { + patches = [ + ./libunwind/gnu-install-dirs.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + # Fix cross. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5e2358c781b85a18d1463fd924d2741d4ae5e42e.patch"; + hash = "sha256-UxIlAifXnexF/MaraPW0Ut6q+sf3e7y1fMdEv1q103A="; + }) + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/13/libunwind/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/13/libunwind/gnu-install-dirs.patch new file mode 100644 index 0000000..8cd25c5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/libunwind/gnu-install-dirs.patch @@ -0,0 +1,36 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 81eddbc24879..e2afb2002150 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -23,6 +23,8 @@ set(LIBUNWIND_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBUNWIND_STANDALONE_BUILD) + project(libunwind LANGUAGES C CXX ASM) + ++ include(GNUInstallDirs) ++ + set(PACKAGE_NAME libunwind) + set(PACKAGE_VERSION 13.0.0git) + set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") +@@ -116,7 +118,7 @@ set(CMAKE_MODULE_PATH + + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH + "Path where built libunwind libraries should be installed.") + if(LIBCXX_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) +@@ -124,11 +126,11 @@ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + endif() + elseif(LLVM_LIBRARY_OUTPUT_INTDIR) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} CACHE PATH + "Path where built libunwind libraries should be installed.") + else() + set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} CACHE PATH + "Path where built libunwind libraries should be installed.") + endif() + diff --git a/pkgs/by-name/ll/llvm/13/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/13/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..61e2f0e --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/lld/gnu-install-dirs.patch @@ -0,0 +1,68 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d4e561b50d8f..cfa5bdd79c2a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -6,6 +6,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(LLD_BUILT_STANDALONE TRUE) + ++ include(GNUInstallDirs) ++ + find_program(LLVM_CONFIG_PATH "llvm-config" DOC "Path to llvm-config binary") + if(NOT LLVM_CONFIG_PATH) + message(FATAL_ERROR "llvm-config not found: specify LLVM_CONFIG_PATH") +@@ -179,7 +181,7 @@ include_directories(BEFORE + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + ) +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index 23df41312403..d62372c88de7 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -20,9 +20,9 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- RUNTIME DESTINATION bin) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) + add_llvm_install_targets(install-${name} +@@ -54,7 +54,7 @@ macro(add_lld_tool name) + + install(TARGETS ${name} + ${export_to_lldtargets} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT ${name}) + + if(NOT CMAKE_CONFIGURATION_TYPES) +@@ -69,5 +69,5 @@ endmacro() + macro(add_lld_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() +diff --git a/tools/lld/CMakeLists.txt b/tools/lld/CMakeLists.txt +index 5cff736ff57f..64e775c771b9 100644 +--- a/tools/lld/CMakeLists.txt ++++ b/tools/lld/CMakeLists.txt +@@ -21,7 +21,7 @@ target_link_libraries(lld + ) + + install(TARGETS lld +- RUNTIME DESTINATION bin) ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + if(NOT LLD_SYMLINKS_TO_CREATE) + set(LLD_SYMLINKS_TO_CREATE diff --git a/pkgs/by-name/ll/llvm/13/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/13/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/13/lldb/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/13/lldb/gnu-install-dirs.patch new file mode 100644 index 0000000..afc945c --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/lldb/gnu-install-dirs.patch @@ -0,0 +1,91 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b5633e21c56a..f2f1035e9238 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,6 +10,8 @@ set(CMAKE_MODULE_PATH + # If we are not building as part of LLVM, build LLDB as a standalone project, + # using LLVM as an external library. + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) ++ include(GNUInstallDirs) ++ + project(lldb) + include(LLDBStandalone) + +diff --git a/cmake/modules/AddLLDB.cmake b/cmake/modules/AddLLDB.cmake +index 4ed5c647c5d2..89f96e710d55 100644 +--- a/cmake/modules/AddLLDB.cmake ++++ b/cmake/modules/AddLLDB.cmake +@@ -107,13 +107,13 @@ function(add_lldb_library name) + endif() + + if(PARAM_SHARED) +- set(install_dest lib${LLVM_LIBDIR_SUFFIX}) ++ set(install_dest ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(PARAM_INSTALL_PREFIX) + set(install_dest ${PARAM_INSTALL_PREFIX}) + endif() + # RUNTIME is relevant for DLL platforms, FRAMEWORK for macOS + install(TARGETS ${name} COMPONENT ${name} +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${install_dest} + ARCHIVE DESTINATION ${install_dest} + FRAMEWORK DESTINATION ${install_dest}) +diff --git a/cmake/modules/LLDBConfig.cmake b/cmake/modules/LLDBConfig.cmake +index 2fdf1502d055..37364341ff8b 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -225,7 +225,7 @@ include_directories(BEFORE + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ + COMPONENT lldb-headers +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN ".cmake" EXCLUDE +@@ -233,7 +233,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ + COMPONENT lldb-headers +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN ".cmake" EXCLUDE +diff --git a/tools/intel-features/CMakeLists.txt b/tools/intel-features/CMakeLists.txt +index 734167e51bc5..f95761b5df58 100644 +--- a/tools/intel-features/CMakeLists.txt ++++ b/tools/intel-features/CMakeLists.txt +@@ -65,4 +65,4 @@ if (LLDB_ENABLE_PYTHON AND LLDB_BUILD_INTEL_PT) + endif() + + install(TARGETS lldbIntelFeatures +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) +diff --git a/cmake/modules/LLDBStandalone.cmake b/cmake/modules/LLDBStandalone.cmake +index 752113b..010f187 100644 +--- a/cmake/modules/LLDBStandalone.cmake ++++ b/cmake/modules/LLDBStandalone.cmake +@@ -62,7 +62,7 @@ endif() + + # They are used as destination of target generators. + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) +-set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 OR CYGWIN) + # DLL platform -- put DLLs into bin. + set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b5633e2..86e4738 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -79,7 +79,7 @@ if (LLDB_ENABLE_PYTHON) + if(LLDB_BUILD_FRAMEWORK) + set(lldb_python_target_dir "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Resources/Python/lldb") + else() +- set(lldb_python_target_dir "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_PYTHON_RELATIVE_PATH}/lldb") ++ set(lldb_python_target_dir "${CMAKE_INSTALL_LIBDIR}/../${LLDB_PYTHON_RELATIVE_PATH}/lldb") + endif() + get_target_property(lldb_python_bindings_dir swig_wrapper_python BINARY_DIR) + finish_swig_python("lldb-python" "${lldb_python_bindings_dir}" "${lldb_python_target_dir}") diff --git a/pkgs/by-name/ll/llvm/13/lldb/procfs.patch b/pkgs/by-name/ll/llvm/13/lldb/procfs.patch new file mode 100644 index 0000000..b075dba --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/lldb/procfs.patch @@ -0,0 +1,31 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -11,21 +11,12 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif diff --git a/pkgs/by-name/ll/llvm/13/lldb/resource-dir.patch b/pkgs/by-name/ll/llvm/13/lldb/resource-dir.patch new file mode 100644 index 0000000..e0db80a --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/lldb/resource-dir.patch @@ -0,0 +1,13 @@ +diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake +index 37364341ff8b..7f74c1a3e257 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -257,7 +257,7 @@ if (NOT TARGET clang-resource-headers) + # Iterate over the possible places where the external resource directory + # could be and pick the first that exists. + foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}" +- "${LLVM_BUILD_LIBRARY_DIR}" ++ "${LLVM_BUILD_LIBRARY_DIR}" "@clangLibDir@" + "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") + # Build the resource directory path by appending 'clang/'. + set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}") diff --git a/pkgs/by-name/ll/llvm/13/llvm/default.nix b/pkgs/by-name/ll/llvm/13/llvm/default.nix new file mode 100644 index 0000000..58e742b --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/llvm/default.nix @@ -0,0 +1,315 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, src +, fetchpatch +, cmake +, python3 +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, buildLlvmTools +, debugVersion ? false +, doCheck ? stdenv.isLinux && (!stdenv.isx86_32) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +# broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 +# broken for the armv7l builder +, enablePFM ? stdenv.isLinux && !stdenv.hostPlatform.isAarch +, enablePolly ? false +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + let + checkDeps = ps: with ps; [ psutil ]; + in python3.withPackages checkDeps + else python3; + +in stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + inherit src; + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake python ] + ++ optionals enableManpages [ python3.pkgs.sphinx python3.pkgs.recommonmark ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = optionals (stdenv.hostPlatform == stdenv.buildPlatform) [ ncurses ] + ++ [ zlib ]; + + nativeCheckInputs = [ which ]; + + patches = [ + # When cross-compiling we configure llvm-config-native with an approximation + # of the flags used for the normal LLVM build. To avoid the need for building + # a native libLLVM.so (which would fail) we force llvm-config to be linked + # statically against the necessary LLVM components always. + ../../common/llvm/llvm-config-link-static.patch + + ./gnu-install-dirs.patch + + # Fix random compiler crashes: https://bugs.llvm.org/show_bug.cgi?id=50611 + (fetchpatch { + url = "https://raw.githubusercontent.com/archlinux/svntogit-packages/4764a4f8c920912a2bfd8b0eea57273acfe0d8a8/trunk/no-strict-aliasing-DwarfCompileUnit.patch"; + sha256 = "18l6mrvm2vmwm77ckcnbjvh6ybvn72rhrb799d4qzwac4x2ifl7g"; + stripLen = 1; + }) + + # Fix musl build. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5cd554303ead0f8891eee3cd6d25cb07f5a7bf67.patch"; + relative = "llvm"; + hash = "sha256-XPbvNJ45SzjMGlNUgt/IgEvM2dHQpDOe6woUJY+nUYA="; + }) + + # Backport gcc-13 fixes with missing includes. + (fetchpatch { + name = "signals-gcc-13.patch"; + url = "https://github.com/llvm/llvm-project/commit/ff1681ddb303223973653f7f5f3f3435b48a1983.patch"; + hash = "sha256-CXwYxQezTq5vdmc8Yn88BUAEly6YZ5VEIA6X3y5NNOs="; + stripLen = 1; + }) + (fetchpatch { + name = "base64-gcc-13.patch"; + url = "https://github.com/llvm/llvm-project/commit/5e9be93566f39ee6cecd579401e453eccfbe81e5.patch"; + hash = "sha256-PAwrVrvffPd7tphpwCkYiz+67szPRzRB2TXBvKfzQ7U="; + stripLen = 1; + }) + ] ++ lib.optional enablePolly ./gnu-install-dirs-polly.patch; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS='-svj''${NIX_BUILD_CORES} --no-progress-bar' + ) + ''; + + # hacky fix: created binaries need to be run before installation + preBuild = '' + mkdir -p $out/ + ln -sv $PWD/lib $out + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals (enableGoldPlugin) [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postBuild = '' + rm -fR $out + ''; + + preCheck = '' + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/lib + ''; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + buildPhase = '' + make docs-llvm-man + ''; + + propagatedBuildInputs = []; + + installPhase = '' + make -C docs install + ''; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..68f3c45 --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,105 @@ +diff --git a/tools/polly/CMakeLists.txt b/tools/polly/CMakeLists.txt +index ca7c04c565bb..6ed5db5dd4f8 100644 +--- a/tools/polly/CMakeLists.txt ++++ b/tools/polly/CMakeLists.txt +@@ -2,7 +2,11 @@ + if (NOT DEFINED LLVM_MAIN_SRC_DIR) + project(Polly) + cmake_minimum_required(VERSION 3.13.4) ++endif() ++ ++include(GNUInstallDirs) + ++if (NOT DEFINED LLVM_MAIN_SRC_DIR) + # Where is LLVM installed? + find_package(LLVM CONFIG REQUIRED) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LLVM_CMAKE_DIR}) +@@ -122,13 +126,13 @@ include_directories( + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + ) + + install(DIRECTORY ${POLLY_BINARY_DIR}/include/ +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN "CMakeFiles" EXCLUDE +diff --git a/tools/polly/cmake/CMakeLists.txt b/tools/polly/cmake/CMakeLists.txt +index 7cc129ba2e90..137be25e4b80 100644 +--- a/tools/polly/cmake/CMakeLists.txt ++++ b/tools/polly/cmake/CMakeLists.txt +@@ -79,18 +79,18 @@ file(GENERATE + + # Generate PollyConfig.cmake for the install tree. + unset(POLLY_EXPORTS) +-set(POLLY_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") ++set(POLLY_INSTALL_PREFIX "") + set(POLLY_CONFIG_LLVM_CMAKE_DIR "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") +-set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}") +-set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}") ++set(POLLY_CONFIG_CMAKE_DIR "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_PREFIX}/${POLLY_INSTALL_PACKAGE_DIR}") ++set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + if (POLLY_BUNDLED_ISL) + set(POLLY_CONFIG_INCLUDE_DIRS +- "${POLLY_INSTALL_PREFIX}/include" +- "${POLLY_INSTALL_PREFIX}/include/polly" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_LIBDIR}/polly" + ) + else() + set(POLLY_CONFIG_INCLUDE_DIRS +- "${POLLY_INSTALL_PREFIX}/include" ++ "${POLLY_INSTALL_PREFIX}${CMAKE_INSTALL_FULL_INCLUDEDIR}" + ${ISL_INCLUDE_DIRS} + ) + endif() +@@ -100,12 +100,12 @@ endif() + foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS) + get_target_property(tgt_type ${tgt} TYPE) + if (tgt_type STREQUAL "EXECUTABLE") +- set(tgt_prefix "bin/") ++ set(tgt_prefix "${CMAKE_INSTALL_BINDIR}/") + else() +- set(tgt_prefix "lib/") ++ set(tgt_prefix "${CMAKE_INSTALL_LIBDIR}/") + endif() + +- set(tgt_path "${CMAKE_INSTALL_PREFIX}/${tgt_prefix}$") ++ set(tgt_path "${tgt_prefix}$") + file(RELATIVE_PATH tgt_path ${POLLY_CONFIG_CMAKE_DIR} ${tgt_path}) + + if (NOT tgt_type STREQUAL "INTERFACE_LIBRARY") +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) +diff --git a/tools/polly/lib/External/CMakeLists.txt b/tools/polly/lib/External/CMakeLists.txt +index 8991094d92c7..178d8ad606bb 100644 +--- a/tools/polly/lib/External/CMakeLists.txt ++++ b/tools/polly/lib/External/CMakeLists.txt +@@ -275,7 +275,7 @@ if (POLLY_BUNDLED_ISL) + install(DIRECTORY + ${ISL_SOURCE_DIR}/include/ + ${ISL_BINARY_DIR}/include/ +- DESTINATION include/polly ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/polly + FILES_MATCHING + PATTERN "*.h" + PATTERN "CMakeFiles" EXCLUDE diff --git a/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..18fa5fc --- /dev/null +++ b/pkgs/by-name/ll/llvm/13/llvm/gnu-install-dirs.patch @@ -0,0 +1,381 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 135036f509d2..265c36f8211b 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -270,15 +270,21 @@ if (CMAKE_BUILD_TYPE AND + message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") + endif() + ++include(GNUInstallDirs) ++ + set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) + +-set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')") ++set(LLVM_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING ++ "Path for binary subdirectory (defaults to 'bin')") + mark_as_advanced(LLVM_TOOLS_INSTALL_DIR) + + set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING + "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)") + mark_as_advanced(LLVM_UTILS_INSTALL_DIR) + ++set(LLVM_INSTALL_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/cmake/llvm" CACHE STRING ++ "Path for CMake subdirectory (defaults to lib/cmake/llvm)" ) ++ + # They are used as destination of target generators. + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) +@@ -581,9 +587,9 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF) + option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON) + option (LLVM_ENABLE_BINDINGS "Build bindings." ON) + +-set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html" ++set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html" + CACHE STRING "Doxygen-generated HTML documentation install directory") +-set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html" ++set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/ocaml-html" + CACHE STRING "OCamldoc-generated HTML documentation install directory") + + option (LLVM_BUILD_EXTERNAL_COMPILER_RT +@@ -1048,7 +1054,7 @@ endif() + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/llvm include/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "*.def" +@@ -1059,7 +1065,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + ) + + install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "*.def" +@@ -1073,13 +1079,13 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + + if (LLVM_INSTALL_MODULEMAPS) + install(DIRECTORY include/llvm include/llvm-c +- DESTINATION include ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT llvm-headers + FILES_MATCHING + PATTERN "module.modulemap" + ) + install(FILES include/llvm/module.install.modulemap +- DESTINATION include/llvm ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm + COMPONENT llvm-headers + RENAME "module.extern.modulemap" + ) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 9c2b85374307..5531ceeb2eeb 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -818,9 +818,9 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- RUNTIME DESTINATION bin COMPONENT ${name}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-${name} +@@ -1036,7 +1036,7 @@ function(process_llvm_pass_plugins) + "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})") + install(FILES + ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake +- DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} ++ DESTINATION ${LLVM_INSTALL_CMAKE_DIR} + COMPONENT cmake-exports) + + set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def") +@@ -1250,7 +1250,7 @@ macro(add_llvm_example name) + endif() + add_llvm_executable(${name} ${ARGN}) + if( LLVM_BUILD_EXAMPLES ) +- install(TARGETS ${name} RUNTIME DESTINATION examples) ++ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples) + endif() + set_target_properties(${name} PROPERTIES FOLDER "Examples") + endmacro(add_llvm_example name) +@@ -1868,7 +1868,7 @@ function(llvm_install_library_symlink name dest type) + set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) + set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir bin) + endif() +@@ -1879,7 +1879,7 @@ function(llvm_install_library_symlink name dest type) + + endfunction() + +-function(llvm_install_symlink name dest) ++function(llvm_install_symlink name dest output_dir) + cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN}) + foreach(path ${CMAKE_MODULE_PATH}) + if(EXISTS ${path}/LLVMInstallSymlink.cmake) +@@ -1902,7 +1902,7 @@ function(llvm_install_symlink name dest) + set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) + + install(SCRIPT ${INSTALL_SYMLINK} +- CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})" ++ CODE "install_symlink(${full_name} ${full_dest} ${output_dir})" + COMPONENT ${component}) + + if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) +@@ -1985,7 +1985,8 @@ function(add_llvm_tool_symlink link_name target) + endif() + + if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS) +- llvm_install_symlink(${link_name} ${target}) ++ GNUInstallDirs_get_absolute_install_dir(output_dir LLVM_TOOLS_INSTALL_DIR) ++ llvm_install_symlink(${link_name} ${target} ${output_dir}) + endif() + endif() + endfunction() +@@ -2114,9 +2115,9 @@ function(llvm_setup_rpath name) + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 554046b20edf..4d1ad980641e 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -144,9 +144,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/AddSphinxTarget.cmake b/cmake/modules/AddSphinxTarget.cmake +index e80c3b5c1cac..482f6d715ef5 100644 +--- a/cmake/modules/AddSphinxTarget.cmake ++++ b/cmake/modules/AddSphinxTarget.cmake +@@ -90,7 +90,7 @@ function (add_sphinx_target builder project) + endif() + elseif (builder STREQUAL html) + string(TOUPPER "${project}" project_upper) +- set(${project_upper}_INSTALL_SPHINX_HTML_DIR "share/doc/${project}/html" ++ set(${project_upper}_INSTALL_SPHINX_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/html" + CACHE STRING "HTML documentation install directory for ${project}") + + # '/.' indicates: copy the contents of the directory directly into +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index 51b6a4fdc284..4adc2acfc074 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -1,6 +1,6 @@ + include(LLVMDistributionSupport) + +-set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) ++set(LLVM_INSTALL_PACKAGE_DIR ${LLVM_INSTALL_CMAKE_DIR} CACHE STRING "Path for CMake subdirectory (defaults to 'cmake/llvm')") + set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") + + # First for users who use an installed LLVM, create the LLVMExports.cmake file. +@@ -109,13 +109,13 @@ foreach(p ${_count}) + set(LLVM_CONFIG_CODE "${LLVM_CONFIG_CODE} + get_filename_component(LLVM_INSTALL_PREFIX \"\${LLVM_INSTALL_PREFIX}\" PATH)") + endforeach(p) +-set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/include") ++set(LLVM_CONFIG_INCLUDE_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") + set(LLVM_CONFIG_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}") + set(LLVM_CONFIG_MAIN_INCLUDE_DIR "${LLVM_CONFIG_INCLUDE_DIRS}") +-set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/lib\${LLVM_LIBDIR_SUFFIX}") ++set(LLVM_CONFIG_LIBRARY_DIRS "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_CMAKE_DIR "\${LLVM_INSTALL_PREFIX}/${LLVM_INSTALL_PACKAGE_DIR}") + set(LLVM_CONFIG_BINARY_DIR "\${LLVM_INSTALL_PREFIX}") +-set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/bin") ++set(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + + # Generate a default location for lit + if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS) +diff --git a/cmake/modules/LLVMInstallSymlink.cmake b/cmake/modules/LLVMInstallSymlink.cmake +index 3e6a2c9a2648..52e14d955c60 100644 +--- a/cmake/modules/LLVMInstallSymlink.cmake ++++ b/cmake/modules/LLVMInstallSymlink.cmake +@@ -4,7 +4,7 @@ + + function(install_symlink name target outdir) + set(DESTDIR $ENV{DESTDIR}) +- set(bindir "${DESTDIR}${CMAKE_INSTALL_PREFIX}/${outdir}/") ++ set(bindir "${DESTDIR}${outdir}/") + + message(STATUS "Creating ${name}") + +diff --git a/docs/CMake.rst b/docs/CMake.rst +index f1ac2c7d4934..c6e1469b5e13 100644 +--- a/docs/CMake.rst ++++ b/docs/CMake.rst +@@ -202,7 +202,7 @@ CMake manual, or execute ``cmake --help-variable VARIABLE_NAME``. + **LLVM_LIBDIR_SUFFIX**:STRING + Extra suffix to append to the directory where libraries are to be + installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64`` +- to install libraries to ``/usr/lib64``. ++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``. + + Rarely-used CMake variables + --------------------------- +@@ -551,8 +551,8 @@ LLVM-specific variables + + **LLVM_INSTALL_DOXYGEN_HTML_DIR**:STRING + The path to install Doxygen-generated HTML documentation to. This path can +- either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to +- `share/doc/llvm/doxygen-html`. ++ either be absolute or relative to the ``CMAKE_INSTALL_PREFIX``. Defaults to ++ `${CMAKE_INSTALL_DOCDIR}/${project}/doxygen-html`. + + **LLVM_LINK_LLVM_DYLIB**:BOOL + If enabled, tools will be linked with the libLLVM shared library. Defaults +@@ -792,9 +792,11 @@ the ``cmake`` command or by setting it directly in ``ccmake`` or ``cmake-gui``). + + This file is available in two different locations. + +-* ``/lib/cmake/llvm/LLVMConfig.cmake`` where +- ```` is the install prefix of an installed version of LLVM. +- On Linux typically this is ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. ++* ``LLVMConfig.cmake`` where ++ ```` is the location where LLVM CMake modules are ++ installed as part of an installed version of LLVM. This is typically ++ ``cmake/llvm/`` within the lib directory. On Linux, this is typically ++ ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. + + * ``/lib/cmake/llvm/LLVMConfig.cmake`` where + ```` is the root of the LLVM build tree. **Note: this is only +diff --git a/examples/Bye/CMakeLists.txt b/examples/Bye/CMakeLists.txt +index bb96edb4b4bf..678c22fb43c8 100644 +--- a/examples/Bye/CMakeLists.txt ++++ b/examples/Bye/CMakeLists.txt +@@ -14,6 +14,6 @@ if (NOT WIN32) + BUILDTREE_ONLY + ) + +- install(TARGETS ${name} RUNTIME DESTINATION examples) ++ install(TARGETS ${name} RUNTIME DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples) + set_target_properties(${name} PROPERTIES FOLDER "Examples") + endif() +diff --git a/include/llvm/CMakeLists.txt b/include/llvm/CMakeLists.txt +index b46319f24fc8..2feabd1954e4 100644 +--- a/include/llvm/CMakeLists.txt ++++ b/include/llvm/CMakeLists.txt +@@ -5,5 +5,5 @@ add_subdirectory(Frontend) + # If we're doing an out-of-tree build, copy a module map for generated + # header files into the build area. + if (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +- configure_file(module.modulemap.build module.modulemap COPYONLY) ++ configure_file(module.modulemap.build ${LLVM_INCLUDE_DIR}/module.modulemap COPYONLY) + endif (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index ebe5b73a5c65..70c497be12f5 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,10 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_BINDIR "@CMAKE_INSTALL_BINDIR@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" ++#define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" ++#define LLVM_INSTALL_CMAKEDIR "@LLVM_INSTALL_CMAKE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" + #define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@" + #define LLVM_BUILD_SYSTEM "@LLVM_BUILD_SYSTEM@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index 1a2f04552d13..44fa7d3eec6b 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -357,12 +357,26 @@ int main(int argc, char **argv) { + ("-I" + ActiveIncludeDir + " " + "-I" + ActiveObjRoot + "/include"); + } else { + ActivePrefix = CurrentExecPrefix; +- ActiveIncludeDir = ActivePrefix + "/include"; +- SmallString<256> path(StringRef(LLVM_TOOLS_INSTALL_DIR)); +- sys::fs::make_absolute(ActivePrefix, path); +- ActiveBinDir = std::string(path.str()); +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; +- ActiveCMakeDir = ActiveLibDir + "/cmake/llvm"; ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_INCLUDEDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveIncludeDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_BINDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveBinDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveLibDir = std::string(path.str()); ++ } ++ { ++ SmallString<256> path(StringRef(LLVM_INSTALL_CMAKEDIR)); ++ sys::fs::make_absolute(ActivePrefix, path); ++ ActiveCMakeDir = std::string(path.str()); ++ } + ActiveIncludeOption = "-I" + ActiveIncludeDir; + } + +diff --git a/tools/lto/CMakeLists.txt b/tools/lto/CMakeLists.txt +index 0af29ad762c5..37b99b83e35c 100644 +--- a/tools/lto/CMakeLists.txt ++++ b/tools/lto/CMakeLists.txt +@@ -33,7 +33,7 @@ add_llvm_library(${LTO_LIBRARY_NAME} ${LTO_LIBRARY_TYPE} INSTALL_WITH_TOOLCHAIN + ${SOURCES} DEPENDS intrinsics_gen) + + install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h +- DESTINATION include/llvm-c ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c + COMPONENT LTO) + + if (APPLE) +diff --git a/tools/opt-viewer/CMakeLists.txt b/tools/opt-viewer/CMakeLists.txt +index ead73ec13a8f..250362021f17 100644 +--- a/tools/opt-viewer/CMakeLists.txt ++++ b/tools/opt-viewer/CMakeLists.txt +@@ -8,7 +8,7 @@ set (files + + foreach (file ${files}) + install(PROGRAMS ${file} +- DESTINATION share/opt-viewer ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/opt-viewer + COMPONENT opt-viewer) + endforeach (file) + +diff --git a/tools/remarks-shlib/CMakeLists.txt b/tools/remarks-shlib/CMakeLists.txt +index 865436247270..ce1daa62f6ab 100644 +--- a/tools/remarks-shlib/CMakeLists.txt ++++ b/tools/remarks-shlib/CMakeLists.txt +@@ -19,7 +19,7 @@ if(LLVM_ENABLE_PIC) + endif() + + install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/Remarks.h +- DESTINATION include/llvm-c ++ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/llvm-c + COMPONENT Remarks) + + if (APPLE) diff --git a/pkgs/by-name/ll/llvm/14/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..57c54e1 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/clang/gnu-install-dirs.patch @@ -0,0 +1,50 @@ +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 9bbbfc032b7d..947bd0da865d 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +@@ -175,7 +175,7 @@ endmacro() + macro(add_clang_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() + + function(clang_target_link_libraries target type) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index 078988980c52..14b58614b40a 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -234,7 +234,7 @@ set_target_properties(clang-resource-headers PROPERTIES + FOLDER "Misc" + RUNTIME_OUTPUT_DIRECTORY "${output_dir}") + +-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) + + install( + FILES ${files} ${generated_files} +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 4e0647971ab4..68dd67fcc476 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -216,7 +216,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) diff --git a/pkgs/by-name/ll/llvm/14/clang/purity.patch b/pkgs/by-name/ll/llvm/14/clang/purity.patch new file mode 100644 index 0000000..deb230a --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/clang/purity.patch @@ -0,0 +1,28 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,12 +487,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + if (!IsStatic) { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); +- +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..66742e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -345,4 +345,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -608,6 +612,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/armv7l.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/armv7l.patch new file mode 100644 index 0000000..6818684 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/armv7l.patch @@ -0,0 +1,31 @@ +diff -ur compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake +--- compiler-rt-10.0.0.src/cmake/builtin-config-ix.cmake 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/cmake/builtin-config-ix.cmake 2020-05-10 03:42:00.883450706 +0900 +@@ -37,6 +37,6 @@ + + set(ARM64 aarch64) +-set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main) ++set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv7l armv8m.main armv8.1m.main) + set(HEXAGON hexagon) + set(X86 i386) + set(X86_64 x86_64) +diff -ur compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt +--- compiler-rt-10.0.0.src/lib/builtins/CMakeLists.txt 2020-03-24 00:01:02.000000000 +0900 ++++ compiler-rt-10.0.0.src-patched/lib/builtins/CMakeLists.txt 2020-05-10 03:44:49.468579650 +0900 +@@ -555,6 +555,7 @@ + set(armv7_SOURCES ${arm_SOURCES}) + set(armv7s_SOURCES ${arm_SOURCES}) + set(armv7k_SOURCES ${arm_SOURCES}) ++set(armv7l_SOURCES ${arm_SOURCES}) + set(arm64_SOURCES ${aarch64_SOURCES}) + + # macho_embedded archs +@@ -705,7 +705,7 @@ + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported +- if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$") ++ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7l|armv7m|armv7em|armv8m.main|armv8.1m.main)$") + string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}") + check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP) + if(NOT COMPILER_RT_HAS_${arch}_VFP) diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/codesign.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/codesign.patch new file mode 100644 index 0000000..065959d --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/codesign.patch @@ -0,0 +1,33 @@ +From 3dec5f3475a26aeb4678627795c4b67c6b7b4785 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 19 Sep 2017 13:13:06 -0500 +Subject: [PATCH] remove codesign use on Apple, disable ios sim testing that + needs it + +--- + cmake/Modules/AddCompilerRT.cmake | 8 ------ + test/asan/CMakeLists.txt | 52 --------------------------------------- + test/tsan/CMakeLists.txt | 47 ----------------------------------- + 3 files changed, 107 deletions(-) + +diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake +index bc69ec95c419..9f100fdcec2f 100644 +--- a/cmake/Modules/AddCompilerRT.cmake ++++ b/cmake/Modules/AddCompilerRT.cmake +@@ -366,14 +366,6 @@ function(add_compiler_rt_runtime name type) + set_target_properties(${libname} PROPERTIES IMPORT_PREFIX "") + set_target_properties(${libname} PROPERTIES IMPORT_SUFFIX ".lib") + endif() +- if(APPLE) +- # Ad-hoc sign the dylibs +- add_custom_command(TARGET ${libname} +- POST_BUILD +- COMMAND codesign --sign - $ +- WORKING_DIRECTORY ${COMPILER_RT_OUTPUT_LIBRARY_DIR} +- ) +- endif() + endif() + + set(parent_target_arg) +2.14.1 + diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/gnu-install-dirs.patch new file mode 100644 index 0000000..55837bd --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/gnu-install-dirs.patch @@ -0,0 +1,42 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 3a41aa43e406..f000cee6eae0 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -5,6 +5,8 @@ + + cmake_minimum_required(VERSION 3.13.4) + ++include(GNUInstallDirs) ++ + # Check if compiler-rt is built as a standalone project. + if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR COMPILER_RT_STANDALONE_BUILD) + project(CompilerRT C CXX ASM) +diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake +index d7b0124f3546..3e111146df4d 100644 +--- a/cmake/base-config-ix.cmake ++++ b/cmake/base-config-ix.cmake +@@ -67,7 +67,7 @@ if (LLVM_TREE_AVAILABLE) + else() + # Take output dir and install path from the user. + set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH +- "Path where built compiler-rt libraries should be stored.") ++ "Path where built compiler-rt build artifacts should be stored.") + set(COMPILER_RT_EXEC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin CACHE PATH + "Path where built compiler-rt executables should be stored.") + set(COMPILER_RT_INSTALL_PATH "" CACHE PATH +@@ -99,13 +99,13 @@ endif() + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}/${COMPILER_RT_OS_DIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + endif() diff --git a/pkgs/by-name/ll/llvm/14/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/14/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..135cf62 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +index f1f46fb9599c..6f19e69507ba 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -302,8 +302,9 @@ macro(load_llvm_config) + # Get some LLVM variables from LLVMConfig. + include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake") + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + endif() + endmacro() + diff --git a/pkgs/by-name/ll/llvm/14/default.nix b/pkgs/by-name/ll/llvm/14/default.nix new file mode 100644 index 0000000..588dc8f --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/default.nix @@ -0,0 +1,380 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, substitute, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM version's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "14.0.6"; sha256 = "sha256-vffu4HilvYwtzwgq+NlS26m65DGbp6OSSne2aje1yJE="; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + # Import releaseInfo separately to avoid infinite recursion + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + inherit (releaseInfo) release_version version; + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-11-15-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # TODO: lldb/docs/index.rst:155:toctree contains reference to nonexisting document 'design/structureddataplugins' + # lldb-manpages = lowPrio (tools.lldb.override { + # enableManpages = true; + # python3 = pkgs.python3; # don't use python-boot + # }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc + else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ./lld/fix-root-src-dir.patch + ]; + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + patches = + let + resourceDirPatch = callPackage + ({ substituteAll, libclang }: substituteAll + { + src = ./lldb/resource-dir.patch; + clangLibDir = "${libclang.lib}/lib"; + }) + { }; + in + [ + ./lldb/procfs.patch + resourceDirPatch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ]; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ]; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = [ "-nostartfiles" ]; + }; + + clangNoCompilerRtWithLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + }; + + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ../common/compiler-rt/armv6-scudo-no-yield.patch + ../common/compiler-rt/armv6-scudo-libatomic.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/codesign.patch # Revert compiler-rt commit that makes codesign mandatory + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + ./compiler-rt/armv7l.patch + # Fix build on armv6l + ../common/compiler-rt/armv6-mcr-dmb.patch + ../common/compiler-rt/armv6-sync-ops-no-thumb.patch + ../common/compiler-rt/armv6-no-ldrexd-strexd.patch + ../common/compiler-rt/armv6-scudo-no-yield.patch + ../common/compiler-rt/armv6-scudo-libatomic.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + libcxx = callPackage ../common/libcxx { + patches = [ + (substitute { + src = ../common/libcxxabi/wasm.patch; + replacements = [ + "--replace-fail" "/cmake/" "/llvm/cmake/" + ]; + }) + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + (substitute { + src = ../common/libcxx/libcxx-0001-musl-hacks.patch; + replacements = [ + "--replace-fail" "/include/" "/libcxx/include/" + ]; + }) + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + patches = [ + ./libunwind/gnu-install-dirs.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/gnu-install-dirs.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/14/libunwind/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/libunwind/gnu-install-dirs.patch new file mode 100644 index 0000000..3fce8bf --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/libunwind/gnu-install-dirs.patch @@ -0,0 +1,21 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -147,7 +147,7 @@ set(LIBUNWIND_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH + + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH + "Path where built libunwind libraries should be installed.") + if(LIBCXX_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) +@@ -159,7 +159,7 @@ else() + else() + set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) + endif() +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH + "Path where built libunwind libraries should be installed.") + endif() + diff --git a/pkgs/by-name/ll/llvm/14/lld/fix-root-src-dir.patch b/pkgs/by-name/ll/llvm/14/lld/fix-root-src-dir.patch new file mode 100644 index 0000000..38fb965 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/lld/fix-root-src-dir.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9bcc135665d0..d38679ed41e9 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -74,7 +74,7 @@ if(LLD_BUILT_STANDALONE) + + set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include") + set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") +- set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") ++ set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree") + + find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} + NO_DEFAULT_PATH) diff --git a/pkgs/by-name/ll/llvm/14/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..89a5822 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/lld/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index dd2898ce6236..ebbea040ff54 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) +@@ -62,5 +62,5 @@ endmacro() + macro(add_lld_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets +- llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) ++ llvm_install_symlink(${name} ${dest} ${CMAKE_INSTALL_FULL_BINDIR} ALWAYS_GENERATE) + endmacro() diff --git a/pkgs/by-name/ll/llvm/14/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/14/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/14/lldb/procfs.patch b/pkgs/by-name/ll/llvm/14/lldb/procfs.patch new file mode 100644 index 0000000..b075dba --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/lldb/procfs.patch @@ -0,0 +1,31 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -11,21 +11,12 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif diff --git a/pkgs/by-name/ll/llvm/14/lldb/resource-dir.patch b/pkgs/by-name/ll/llvm/14/lldb/resource-dir.patch new file mode 100644 index 0000000..e0db80a --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/lldb/resource-dir.patch @@ -0,0 +1,13 @@ +diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake +index 37364341ff8b..7f74c1a3e257 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -257,7 +257,7 @@ if (NOT TARGET clang-resource-headers) + # Iterate over the possible places where the external resource directory + # could be and pick the first that exists. + foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}" +- "${LLVM_BUILD_LIBRARY_DIR}" ++ "${LLVM_BUILD_LIBRARY_DIR}" "@clangLibDir@" + "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") + # Build the resource directory path by appending 'clang/'. + set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}") diff --git a/pkgs/by-name/ll/llvm/14/llvm/default.nix b/pkgs/by-name/ll/llvm/14/llvm/default.nix new file mode 100644 index 0000000..124d07e --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/llvm/default.nix @@ -0,0 +1,323 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, fetchpatch +, cmake +, python3 +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, buildLlvmTools +, debugVersion ? false +, doCheck ? stdenv.isLinux && (!stdenv.isx86_32) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +# broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 +# broken for the armv7l builder +, enablePFM ? stdenv.isLinux && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + let + checkDeps = ps: with ps; [ psutil ]; + in python3.withPackages checkDeps + else python3; + +in stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake python ] + ++ optionals enableManpages [ python3.pkgs.sphinx python3.pkgs.recommonmark ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ which ]; + + patches = [ + ./gnu-install-dirs.patch + + # Fix musl build. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5cd554303ead0f8891eee3cd6d25cb07f5a7bf67.patch"; + relative = "llvm"; + hash = "sha256-XPbvNJ45SzjMGlNUgt/IgEvM2dHQpDOe6woUJY+nUYA="; + }) + # fix RuntimeDyld usage on aarch64-linux (e.g. python312Packages.numba tests) + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/2e1b838a889f9793d4bcd5dbfe10db9796b77143.patch"; + relative = "llvm"; + hash = "sha256-Ot45P/iwaR4hkcM3xtLwfryQNgHI6pv6ADjv98tgdZA="; + }) + ] ++ lib.optional enablePolly ./gnu-install-dirs-polly.patch; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + optionalString stdenv.hostPlatform.isRiscV '' + rm test/ExecutionEngine/frem.ll + rm test/ExecutionEngine/mov64zext32.ll + rm test/ExecutionEngine/test-interp-vec-arithm_float.ll + rm test/ExecutionEngine/test-interp-vec-arithm_int.ll + rm test/ExecutionEngine/test-interp-vec-logical.ll + rm test/ExecutionEngine/test-interp-vec-setcond-fp.ll + rm test/ExecutionEngine/test-interp-vec-setcond-int.ll + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "CrashRecoveryTest.cpp" "" + rm unittests/Support/CrashRecoveryTest.cpp + substituteInPlace unittests/ExecutionEngine/Orc/CMakeLists.txt \ + --replace "OrcCAPITest.cpp" "" + rm unittests/ExecutionEngine/Orc/OrcCAPITest.cpp + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS='-svj''${NIX_BUILD_CORES} --no-progress-bar' + ) + ''; + + # hacky fix: created binaries need to be run before installation + preBuild = '' + mkdir -p $out/ + ln -sv $PWD/lib $out + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals (enableGoldPlugin) [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postBuild = '' + rm -fR $out + ''; + + preCheck = '' + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/lib + ''; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + buildPhase = '' + make docs-llvm-man + ''; + + propagatedBuildInputs = []; + + installPhase = '' + make -C docs install + ''; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..b01363e --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,19 @@ +This is the one remaining Polly install dirs related change that hasn't made it +into upstream yet; previously this patch file also included: +https://reviews.llvm.org/D117541 + +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) diff --git a/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..55862ab --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/llvm/gnu-install-dirs.patch @@ -0,0 +1,220 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index fec956091cd5..5a766f5c5d7c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -303,6 +303,9 @@ set(LLVM_EXAMPLES_INSTALL_DIR "examples" CACHE STRING + "Path for examples subdirectory (enabled by LLVM_BUILD_EXAMPLES=ON) (defaults to 'examples')") + mark_as_advanced(LLVM_EXAMPLES_INSTALL_DIR) + ++set(LLVM_INSTALL_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/cmake/llvm" CACHE STRING ++ "Path for CMake subdirectory (defaults to lib/cmake/llvm)" ) ++ + # They are used as destination of target generators. + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index fed1fec7d72e..4baed19b9e98 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -838,8 +838,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -1056,7 +1056,7 @@ function(process_llvm_pass_plugins) + "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})") + install(FILES + ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake +- DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} ++ DESTINATION ${LLVM_INSTALL_CMAKE_DIR} + COMPONENT cmake-exports) + + set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def") +@@ -1902,7 +1902,7 @@ function(llvm_install_library_symlink name dest type) + set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) + set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir bin) + endif() +@@ -1913,7 +1913,7 @@ function(llvm_install_library_symlink name dest type) + + endfunction() + +-function(llvm_install_symlink name dest) ++function(llvm_install_symlink name dest output_dir) + cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN}) + foreach(path ${CMAKE_MODULE_PATH}) + if(EXISTS ${path}/LLVMInstallSymlink.cmake) +@@ -1936,7 +1936,7 @@ function(llvm_install_symlink name dest) + set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) + + install(SCRIPT ${INSTALL_SYMLINK} +- CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})" ++ CODE "install_symlink(${full_name} ${full_dest} ${output_dir})" + COMPONENT ${component}) + + if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) +@@ -2019,7 +2019,8 @@ function(add_llvm_tool_symlink link_name target) + endif() + + if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS) +- llvm_install_symlink(${link_name} ${target}) ++ GNUInstallDirs_get_absolute_install_dir(output_dir LLVM_TOOLS_INSTALL_DIR) ++ llvm_install_symlink(${link_name} ${target} ${output_dir}) + endif() + endif() + endfunction() +@@ -2148,9 +2149,9 @@ function(llvm_setup_rpath name) + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index cea0c1df0a14..eedcd9450312 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -2,7 +2,7 @@ include(ExtendPath) + include(LLVMDistributionSupport) + include(FindPrefixFromConfig) + +-set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) ++set(LLVM_INSTALL_PACKAGE_DIR ${LLVM_INSTALL_CMAKE_DIR} CACHE STRING "Path for CMake subdirectory (defaults to 'cmake/llvm')") + set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") + + # First for users who use an installed LLVM, create the LLVMExports.cmake file. +@@ -122,7 +122,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/cmake/modules/LLVMInstallSymlink.cmake b/cmake/modules/LLVMInstallSymlink.cmake +index b5c35f706cb7..9261ab797de6 100644 +--- a/cmake/modules/LLVMInstallSymlink.cmake ++++ b/cmake/modules/LLVMInstallSymlink.cmake +@@ -6,7 +6,7 @@ include(GNUInstallDirs) + + function(install_symlink name target outdir) + set(DESTDIR $ENV{DESTDIR}) +- set(bindir "${DESTDIR}${CMAKE_INSTALL_PREFIX}/${outdir}") ++ set(bindir "${DESTDIR}${outdir}/") + + message(STATUS "Creating ${name}") + +diff --git a/docs/CMake.rst b/docs/CMake.rst +index 044ec8a4d39d..504d0eac3ade 100644 +--- a/docs/CMake.rst ++++ b/docs/CMake.rst +@@ -224,7 +224,7 @@ description is in `LLVM-related variables`_ below. + **LLVM_LIBDIR_SUFFIX**:STRING + Extra suffix to append to the directory where libraries are to be + installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64`` +- to install libraries to ``/usr/lib64``. ++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``. + + **LLVM_PARALLEL_{COMPILE,LINK}_JOBS**:STRING + Building the llvm toolchain can use a lot of resources, particularly +@@ -910,9 +910,11 @@ the ``cmake`` command or by setting it directly in ``ccmake`` or ``cmake-gui``). + + This file is available in two different locations. + +-* ``/lib/cmake/llvm/LLVMConfig.cmake`` where +- ```` is the install prefix of an installed version of LLVM. +- On Linux typically this is ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. ++* ``LLVMConfig.cmake`` where ++ ```` is the location where LLVM CMake modules are ++ installed as part of an installed version of LLVM. This is typically ++ ``cmake/llvm/`` within the lib directory. On Linux, this is typically ++ ``/usr/lib/cmake/llvm/LLVMConfig.cmake``. + + * ``/lib/cmake/llvm/LLVMConfig.cmake`` where + ```` is the root of the LLVM build tree. **Note: this is only +diff --git a/include/llvm/CMakeLists.txt b/include/llvm/CMakeLists.txt +index b46319f24fc8..2feabd1954e4 100644 +--- a/include/llvm/CMakeLists.txt ++++ b/include/llvm/CMakeLists.txt +@@ -5,5 +5,5 @@ add_subdirectory(Frontend) + # If we're doing an out-of-tree build, copy a module map for generated + # header files into the build area. + if (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +- configure_file(module.modulemap.build module.modulemap COPYONLY) ++ configure_file(module.modulemap.build ${LLVM_INCLUDE_DIR}/module.modulemap COPYONLY) + endif (NOT "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index abbb8a450da6..70c497be12f5 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,7 +23,10 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_BINDIR "@CMAKE_INSTALL_BINDIR@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" ++#define LLVM_INSTALL_CMAKEDIR "@LLVM_INSTALL_CMAKE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" + #define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@" + #define LLVM_BUILD_SYSTEM "@LLVM_BUILD_SYSTEM@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index 8ed88f33ead4..5e7184bab90d 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -363,12 +363,20 @@ int main(int argc, char **argv) { + ActiveIncludeDir = std::string(Path.str()); + } + { +- SmallString<256> Path(LLVM_TOOLS_INSTALL_DIR); ++ SmallString<256> Path(LLVM_INSTALL_BINDIR); + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; +- ActiveCMakeDir = ActiveLibDir + "/cmake/llvm"; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } ++ { ++ SmallString<256> Path(LLVM_INSTALL_CMAKEDIR); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveCMakeDir = std::string(Path.str()); ++ } + ActiveIncludeOption = "-I" + ActiveIncludeDir; + } + diff --git a/pkgs/by-name/ll/llvm/14/openmp/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/14/openmp/gnu-install-dirs.patch new file mode 100644 index 0000000..e85fde4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/openmp/gnu-install-dirs.patch @@ -0,0 +1,45 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -24,7 +24,7 @@ if (OPENMP_STANDALONE_BUILD) + set(OPENMP_LIBDIR_SUFFIX "" CACHE STRING + "Suffix of lib installation directory, e.g. 64 => lib64") + # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR. +- set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}") + + # Group test settings. + set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING +@@ -35,7 +35,7 @@ if (OPENMP_STANDALONE_BUILD) + else() + set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) + # If building in tree, we honor the same install suffix LLVM uses. +- set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + + if (NOT MSVC) + set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) +diff --git a/libomptarget/plugins/amdgpu/CMakeLists.txt b/libomptarget/plugins/amdgpu/CMakeLists.txt +--- a/libomptarget/plugins/amdgpu/CMakeLists.txt ++++ b/libomptarget/plugins/amdgpu/CMakeLists.txt +@@ -74,7 +74,7 @@ add_library(omptarget.rtl.amdgpu SHARED + + # Install plugin under the lib destination folder. + # When we build for debug, OPENMP_LIBDIR_SUFFIX get set to -debug +-install(TARGETS omptarget.rtl.amdgpu LIBRARY DESTINATION "lib${OPENMP_LIBDIR_SUFFIX}") ++install(TARGETS omptarget.rtl.amdgpu LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}") + set_property(TARGET omptarget.rtl.amdgpu PROPERTY INSTALL_RPATH_USE_LINK_PATH ON) + + if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") +diff --git a/libomptarget/plugins/ve/CMakeLists.txt b/libomptarget/plugins/ve/CMakeLists.txt +--- a/libomptarget/plugins/ve/CMakeLists.txt ++++ b/libomptarget/plugins/ve/CMakeLists.txt +@@ -32,7 +32,7 @@ if(${LIBOMPTARGET_DEP_VEO_FOUND}) + + # Install plugin under the lib destination folder. + install(TARGETS "omptarget.rtl.${tmachine_libname}" +- LIBRARY DESTINATION lib${OPENMP_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}) + + target_link_libraries( + "omptarget.rtl.${tmachine_libname}" diff --git a/pkgs/by-name/ll/llvm/14/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/14/openmp/run-lit-directly.patch new file mode 100644 index 0000000..1e952fd --- /dev/null +++ b/pkgs/by-name/ll/llvm/14/openmp/run-lit-directly.patch @@ -0,0 +1,12 @@ +diff --git a/cmake/OpenMPTesting.cmake b/cmake/OpenMPTesting.cmake +--- a/cmake/OpenMPTesting.cmake ++++ b/cmake/OpenMPTesting.cmake +@@ -185,7 +185,7 @@ function(add_openmp_testsuite target comment) + if (${OPENMP_STANDALONE_BUILD}) + set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS}) + add_custom_target(${target} +- COMMAND ${PYTHON_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} ++ COMMAND ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} + COMMENT ${comment} + DEPENDS ${ARG_DEPENDS} + USES_TERMINAL diff --git a/pkgs/by-name/ll/llvm/15/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..f767c56 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/clang/gnu-install-dirs.patch @@ -0,0 +1,105 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c27beec313d7..480f13e73c9f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -78,15 +78,17 @@ if(CLANG_BUILT_STANDALONE) + if (NOT LLVM_CONFIG_FOUND) + # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config + # path is removed. +- set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}") ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) + set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") + # N.B. this is just a default value, the CACHE PATHs below can be overriden. + set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") + set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}") + set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") + endif() + +- set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include") ++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") + set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") + set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") + set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin") +@@ -128,7 +130,7 @@ if(CLANG_BUILT_STANDALONE) + set(LLVM_INCLUDE_TESTS ON) + endif() + +- include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}") ++ include_directories(${LLVM_INCLUDE_DIRS}) + link_directories("${LLVM_LIBRARY_DIR}") + + set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 21ac332e4f5f..b16c314bd1e2 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index 6e2060991b92..b9bc930d26b8 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -420,7 +420,7 @@ add_header_target("openmp-resource-headers" ${openmp_wrapper_files}) + add_header_target("windows-resource-headers" ${windows_only_files}) + add_header_target("utility-resource-headers" ${utility_files}) + +-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include) + + ############################################################# + # Install rules for the catch-all clang-resource-headers target +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 8d95d0900e8c..ebc70ff7526d 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -180,7 +180,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt +index 061dc7ef4dd9..adc54b2edc32 100644 +--- a/tools/scan-build-py/CMakeLists.txt ++++ b/tools/scan-build-py/CMakeLists.txt +@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib}) + install(PROGRAMS lib/libscanbuild/${lib} +- DESTINATION lib/libscanbuild ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild" + COMPONENT scan-build-py) + endforeach() + +@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource}) + install(PROGRAMS lib/libscanbuild/resources/${resource} +- DESTINATION lib/libscanbuild/resources ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources" + COMPONENT scan-build-py) + endforeach() + +@@ -122,7 +122,7 @@ foreach(lib ${LibEar}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib}) + install(PROGRAMS lib/libear/${lib} +- DESTINATION lib/libear ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear" + COMPONENT scan-build-py) + endforeach() + diff --git a/pkgs/by-name/ll/llvm/15/clang/purity.patch b/pkgs/by-name/ll/llvm/15/clang/purity.patch new file mode 100644 index 0000000..1c94f29 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/clang/purity.patch @@ -0,0 +1,29 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,13 +487,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + } else { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); + +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE && +- !Args.hasArg(options::OPT_r)) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/15/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/15/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..07013e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -348,4 +348,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -723,6 +723,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/15/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/15/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/15/compiler-rt/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/compiler-rt/gnu-install-dirs.patch new file mode 100644 index 0000000..f3b1f63 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/compiler-rt/gnu-install-dirs.patch @@ -0,0 +1,20 @@ +diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake +index 8a6219568b3f..30ee68a47ccf 100644 +--- a/cmake/base-config-ix.cmake ++++ b/cmake/base-config-ix.cmake +@@ -100,13 +100,13 @@ endif() + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}/${COMPILER_RT_OS_DIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + endif() diff --git a/pkgs/by-name/ll/llvm/15/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/15/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..135cf62 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +index f1f46fb9599c..6f19e69507ba 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -302,8 +302,9 @@ macro(load_llvm_config) + # Get some LLVM variables from LLVMConfig. + include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake") + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + endif() + endmacro() + diff --git a/pkgs/by-name/ll/llvm/15/default.nix b/pkgs/by-name/ll/llvm/15/default.nix new file mode 100644 index 0000000..bfcbe2b --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/default.nix @@ -0,0 +1,396 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake, ninja +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, fetchpatch, substitute, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM version's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "15.0.7"; sha256 = "sha256-wjuZQyXQ/jsmvy6y1aksCcEDXGBjuhpgngF3XQJ/T4s="; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + # Import releaseInfo separately to avoid infinite recursion + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + inherit (releaseInfo) release_version version; + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + lldbPlugins = lib.makeExtensible (lldbPlugins: let + callPackage = newScope (lldbPlugins // { inherit stdenv; inherit (tools) lldb; }); + in { + llef = callPackage ../common/lldb-plugins/llef.nix {}; + }); + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-11-15-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + lldb-manpages = lowPrio (tools.lldb.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc + else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ]; + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + patches = + let + resourceDirPatch = callPackage + ({ substituteAll, libclang }: substituteAll + { + src = ./lldb/resource-dir.patch; + clangLibDir = "${libclang.lib}/lib"; + }) + { }; + in + [ + ./lldb/procfs.patch + resourceDirPatch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = + [ + "-nostartfiles" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRtWithLibc = wrapCCWith (rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + } // lib.optionalAttrs stdenv.targetPlatform.isWasm { + nixSupport.cc-cflags = [ "-fno-exceptions" ]; + }); + + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + # `libcxx` requires a fairly modern C++ compiler, + # so: we use the clang from this LLVM package set instead of the regular + # stdenv's compiler. + libcxx = callPackage ../common/libcxx { + patches = [ + # See: + # - https://reviews.llvm.org/D133566 + # - https://github.com/NixOS/nixpkgs/issues/214524#issuecomment-1429146432 + # !!! Drop in LLVM 16+ + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/57c7bb3ec89565c68f858d316504668f9d214d59.patch"; + hash = "sha256-B07vHmSjy5BhhkGSj3e1E0XmMv5/9+mvC/k70Z29VwY="; + }) + (substitute { + src = ../common/libcxxabi/wasm.patch; + replacements = [ + "--replace-fail" "/cmake/" "/llvm/cmake/" + ]; + }) + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + (substitute { + src = ../common/libcxx/libcxx-0001-musl-hacks.patch; + replacements = [ + "--replace-fail" "/include/" "/libcxx/include/" + ]; + }) + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + patches = [ + ./libunwind/gnu-install-dirs.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/fix-find-tool.patch + ./openmp/gnu-install-dirs.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version lldbPlugins; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/15/libunwind/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/libunwind/gnu-install-dirs.patch new file mode 100644 index 0000000..edfb2a8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/libunwind/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5a06805f05f1..86a50329e6a8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -117,7 +117,7 @@ set(LIBUNWIND_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH + + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH + "Path where built libunwind libraries should be installed.") + if(LIBCXX_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) +@@ -129,7 +129,7 @@ else() + else() + set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) + endif() +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH + "Path where built libunwind libraries should be installed.") + endif() + diff --git a/pkgs/by-name/ll/llvm/15/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..ea62b2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/lld/gnu-install-dirs.patch @@ -0,0 +1,46 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index dcc649629a4b..58dca54642e4 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -70,13 +70,15 @@ if(LLD_BUILT_STANDALONE) + if (NOT LLVM_CONFIG_FOUND) + # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config + # path is removed. +- set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}") ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) + set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") + # N.B. this is just a default value, the CACHE PATHs below can be overridden. + set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") + endif() + +- set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include") ++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") + set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") + set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") + +@@ -95,7 +97,7 @@ if(LLD_BUILT_STANDALONE) + + set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") + +- include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS}) ++ include_directories(${LLVM_INCLUDE_DIRS}) + link_directories(${LLVM_LIBRARY_DIRS}) + + if(LLVM_INCLUDE_TESTS) +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index d3924f7243d4..42a7cd62281c 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) diff --git a/pkgs/by-name/ll/llvm/15/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/15/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/15/lldb/procfs.patch b/pkgs/by-name/ll/llvm/15/lldb/procfs.patch new file mode 100644 index 0000000..7b200e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/lldb/procfs.patch @@ -0,0 +1,46 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -10,6 +10,13 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include ++ ++// on i686 preprocessor symbols with these register names are defined as ++// numeric constants; these symbols clash with identifier names used in ++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h` ++#undef FS ++#undef CS + + #include "lldb/lldb-types.h" + +@@ -17,23 +24,13 @@ + + #include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif + + namespace lldb_private { + namespace process_linux { diff --git a/pkgs/by-name/ll/llvm/15/lldb/resource-dir.patch b/pkgs/by-name/ll/llvm/15/lldb/resource-dir.patch new file mode 100644 index 0000000..e0db80a --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/lldb/resource-dir.patch @@ -0,0 +1,13 @@ +diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake +index 37364341ff8b..7f74c1a3e257 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -257,7 +257,7 @@ if (NOT TARGET clang-resource-headers) + # Iterate over the possible places where the external resource directory + # could be and pick the first that exists. + foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}" +- "${LLVM_BUILD_LIBRARY_DIR}" ++ "${LLVM_BUILD_LIBRARY_DIR}" "@clangLibDir@" + "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") + # Build the resource directory path by appending 'clang/'. + set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}") diff --git a/pkgs/by-name/ll/llvm/15/llvm/default.nix b/pkgs/by-name/ll/llvm/15/llvm/default.nix new file mode 100644 index 0000000..d7ebcbc --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/default.nix @@ -0,0 +1,442 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, fetchpatch +, cmake +, darwin +, ninja +, python3 +, python3Packages +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, sysctl +, buildLlvmTools +, debugVersion ? false +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +, enablePFM ? stdenv.isLinux /* PFM only supports Linux */ + # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 + # broken for the armv7l builder + && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + # Note that we _explicitly_ ask for a python interpreter for our host + # platform here; the splicing that would ordinarily take care of this for + # us does not seem to work once we use `withPackages`. + let + checkDeps = ps: with ps; [ psutil ]; + in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps + else python3; + +in stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake ninja python ] + ++ optionals enableManpages [ + # Note: we intentionally use `python3Packages` instead of `python3.pkgs`; + # splicing does *not* work with the latter. (TODO: fix) + python3Packages.sphinx python3Packages.recommonmark + ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ + which + ] ++ lib.optional stdenv.isDarwin sysctl; + + patches = [ + ./gnu-install-dirs.patch + + # Running the tests involves invoking binaries (like `opt`) that depend on + # the LLVM dylibs and reference them by absolute install path (i.e. their + # nix store path). + # + # Because we have not yet run the install phase (we're running these tests + # as part of `checkPhase` instead of `installCheckPhase`) these absolute + # paths do not exist yet; to work around this we point the loader (`ld` on + # unix, `dyld` on macOS) at the `lib` directory which will later become this + # package's `lib` output. + # + # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib` + # dir but: + # - this doesn't generalize well to other platforms; `lit` doesn't forward + # `DYLD_LIBRARY_PATH` (macOS): + # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26 + # - even if `lit` forwarded this env var, we actually cannot set + # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because + # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for + # "protected processes" (i.e. the python interpreter that runs `lit`): + # https://stackoverflow.com/a/35570229 + # - other LLVM subprojects deal with this issue by having their `lit` + # configuration set these env vars for us; it makes sense to do the same + # for LLVM: + # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31 + # + # !!! TODO: look into upstreaming this patch + ./llvm-lit-cfg-add-libs-to-dylib-path.patch + + # `lit` has a mode where it executes run lines as a shell script which is + # constructs; this is problematic for macOS because it means that there's + # another process in between `lit` and the binaries being tested. As noted + # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our + # tests fail with dyld errors. + # + # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when + # present in the test configuration. + # + # It's not clear to me why this isn't an issue for LLVM developers running + # on macOS (nothing about this _seems_ nix specific).. + ./lit-shell-script-runner-set-dyld-library-path.patch + + # Fix musl build. + (fetchpatch { + url = "https://github.com/llvm/llvm-project/commit/5cd554303ead0f8891eee3cd6d25cb07f5a7bf67.patch"; + relative = "llvm"; + hash = "sha256-XPbvNJ45SzjMGlNUgt/IgEvM2dHQpDOe6woUJY+nUYA="; + }) + ] ++ lib.optionals enablePolly [ + ./gnu-install-dirs-polly.patch + + # Just like the `llvm-lit-cfg` patch, but for `polly`. + ./polly-lit-cfg-add-libs-to-dylib-path.patch + ]; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + + # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick + # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7 + rm test/MC/ELF/cfi-version.ll + + # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`) + # and thus fails under the sandbox: + substituteInPlace unittests/Support/Host.cpp \ + --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }" + '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) '' + # This test tries to call the intrinsics `@llvm.roundeven.f32` and + # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf` + # and `roundeven` on x86_64 macOS. + # + # However these functions are glibc specific so the test fails: + # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html + # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html + # + # TODO(@rrbutani): this seems to run fine on `aarch64-darwin`, why does it + # pass there? + substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \ + --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \ + --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" "" + + # This test fails on darwin x86_64 because `sw_vers` reports a different + # macOS version than what LLVM finds by reading + # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into + # the sandbox on macOS). + # + # The `sw_vers` provided by nixpkgs reports the macOS version associated + # with the `CoreFoundation` framework with which it was built. Because + # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what + # `sw_vers` reports is not guaranteed to match the macOS version of the host + # that's building this derivation. + # + # Astute readers will note that we only _patch_ this test on aarch64-darwin + # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright. + # So why does this test pass on aarch64? + # + # Well, it seems that `sw_vers` on aarch64 actually links against the _host_ + # CoreFoundation framework instead of the nixpkgs provided one. + # + # Not entirely sure what the right fix is here. I'm assuming aarch64 + # `sw_vers` doesn't intentionally link against the host `CoreFoundation` + # (still digging into how this ends up happening, will follow up) but that + # aside I think the more pertinent question is: should we be patching LLVM's + # macOS version detection logic to use `sw_vers` instead of reading host + # paths? This *is* a way in which details about builder machines can creep + # into the artifacts that are produced, affecting reproducibility, but it's + # not clear to me when/where/for what this even gets used in LLVM. + # + # TODO(@rrbutani): fix/follow-up + substituteInPlace unittests/Support/Host.cpp \ + --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion" + + # This test fails with a `dysmutil` crash; have not yet dug into what's + # going on here (TODO(@rrbutani)). + rm test/tools/dsymutil/ARM/obfuscated.test + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + # timing-based tests are trouble + rm utils/lit/tests/googletest-timeout.py + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + + # !!! Note: these tests are removed in LLVM 16. + # + # See here for context: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999790443 + rm test/CodeGen/RISCV/rv32zbp.ll + rm test/CodeGen/RISCV/rv64zbp.ll + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar" + ) + ''; + + # Defensive check: some paths (that we make symlinks to) depend on the release + # version, for example: + # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185 + # + # So we want to sure that the version in the source matches the release + # version we were given. + # + # We do this check here, in the LLVM build, because it happens early. + postConfigure = let + v = lib.versions; + major = v.major release_version; + minor = v.minor release_version; + patch = v.patch release_version; + in '' + # $1: part, $2: expected + check_version() { + part="''${1^^}" + part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)" + + if [[ "$part" != "$2" ]]; then + echo >&2 \ + "mismatch in the $1 version! we have version ${release_version}" \ + "and expected the $1 version to be '$2'; the source has '$part' instead" + exit 3 + fi + } + + check_version major ${major} + check_version minor ${minor} + check_version patch ${patch} + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals (enableGoldPlugin) [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + propagatedBuildInputs = []; + + ninjaFlags = [ "docs-llvm-man" ]; + installTargets = [ "install-docs-llvm-man" ]; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..b01363e --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,19 @@ +This is the one remaining Polly install dirs related change that hasn't made it +into upstream yet; previously this patch file also included: +https://reviews.llvm.org/D117541 + +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) diff --git a/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..0ef317a --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/gnu-install-dirs.patch @@ -0,0 +1,138 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 45399dc0537e..5d946e9e6583 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -942,7 +942,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") + add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) + install(TARGETS tf_xla_runtime EXPORT LLVMExports +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime) + # Once we add more modules, we should handle this more automatically. + if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 057431208322..56f0dcb258da 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -844,8 +844,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -2007,7 +2007,7 @@ function(llvm_install_library_symlink name dest type) + set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) + set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir "${CMAKE_INSTALL_BINDIR}") + endif() +@@ -2271,15 +2271,15 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) + # $ORIGIN is not interpreted at link time by aix ld. + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index d4b0ab959148..26ed981fd09f 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -128,7 +128,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/docs/CMake.rst b/docs/CMake.rst +index 879b7b231d4c..9c31d14e8950 100644 +--- a/docs/CMake.rst ++++ b/docs/CMake.rst +@@ -250,7 +250,7 @@ description is in `LLVM-related variables`_ below. + **LLVM_LIBDIR_SUFFIX**:STRING + Extra suffix to append to the directory where libraries are to be + installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64`` +- to install libraries to ``/usr/lib64``. ++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``. + + **LLVM_PARALLEL_{COMPILE,LINK}_JOBS**:STRING + Building the llvm toolchain can use a lot of resources, particularly +@@ -284,6 +284,10 @@ manual, or execute ``cmake --help-variable VARIABLE_NAME``. + The path to install executables, relative to the *CMAKE_INSTALL_PREFIX*. + Defaults to "bin". + ++**CMAKE_INSTALL_LIBDIR**:PATH ++ The path to install libraries, relative to the *CMAKE_INSTALL_PREFIX*. ++ Defaults to "lib". ++ + **CMAKE_INSTALL_INCLUDEDIR**:PATH + The path to install header files, relative to the *CMAKE_INSTALL_PREFIX*. + Defaults to "include". +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index 370005cd8d7d..7e790bc52111 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,7 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" + #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index 2c6c55f89d38..f6d2068a0827 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -369,7 +369,11 @@ int main(int argc, char **argv) { + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } + { + SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR); + sys::fs::make_absolute(ActivePrefix, Path); diff --git a/pkgs/by-name/ll/llvm/15/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/by-name/ll/llvm/15/llvm/lit-shell-script-runner-set-dyld-library-path.patch new file mode 100644 index 0000000..32f1d13 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/lit-shell-script-runner-set-dyld-library-path.patch @@ -0,0 +1,26 @@ +diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py +index 0242e0b75af3..d732011306f7 100644 +--- a/utils/lit/lit/TestRunner.py ++++ b/utils/lit/lit/TestRunner.py +@@ -1029,6 +1029,12 @@ def executeScript(test, litConfig, tmpBase, commands, cwd): + f.write('@echo off\n') + f.write('\n@if %ERRORLEVEL% NEQ 0 EXIT\n'.join(commands)) + else: ++ # This env var is *purged* when invoking subprocesses so we have to ++ # manually set it from within the bash script in order for the commands ++ # in run lines to see this var: ++ if "DYLD_LIBRARY_PATH" in test.config.environment: ++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n') ++ + for i, ln in enumerate(commands): + match = re.match(kPdbgRegex, ln) + if match: +@@ -1363,7 +1369,7 @@ def applySubstitutions(script, substitutions, conditions={}, + return processed + + process = processLine if recursion_limit is None else processLineToFixedPoint +- ++ + return [unescapePercents(process(ln)) for ln in script] + + diff --git a/pkgs/by-name/ll/llvm/15/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/15/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..d824516 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,79 @@ +diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py +index 81e8dc04acea..479ff95681e2 100644 +--- a/test/Unit/lit.cfg.py ++++ b/test/Unit/lit.cfg.py +@@ -3,6 +3,7 @@ + # Configuration file for the 'lit' test runner. + + import os ++import platform + import subprocess + + import lit.formats +@@ -55,3 +56,26 @@ if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir): + # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. + if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ: + config.environment['SYSTEMDRIVE'] = os.environ['SYSTEMDRIVE'] ++ ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']: ++ yield 'LD_LIBRARY_PATH' ++ elif platform.system() == 'Darwin': ++ yield 'DYLD_LIBRARY_PATH' ++ elif platform.system() == 'Windows': ++ yield 'PATH' ++ elif platform.system() == 'AIX': ++ yield 'LIBPATH' ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = os.path.pathsep.join( ++ (config.shlibdir, ++ config.environment.get(shlibpath_var, ''))) ++ config.environment[shlibpath_var] = shlibpath ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 75a38b4c5dad..856fc75c9d74 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -42,6 +42,26 @@ llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True) + llvm_config.with_system_environment( + ['HOME', 'INCLUDE', 'LIB', 'TMP', 'TEMP']) + ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']: ++ yield 'LD_LIBRARY_PATH' ++ elif platform.system() == 'Darwin': ++ yield 'DYLD_LIBRARY_PATH' ++ elif platform.system() == 'Windows': ++ yield 'PATH' ++ elif platform.system() == 'AIX': ++ yield 'LIBPATH' ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = config.llvm_shlib_dir ++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True) ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) + + # Set up OCAMLPATH to include newly built OCaml libraries. + top_ocaml_lib = os.path.join(config.llvm_lib_dir, 'ocaml') +@@ -318,7 +338,7 @@ def have_cxx_shared_library(): + + try: + readobj_cmd = subprocess.Popen( +- [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE) ++ [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE, env=config.environment) + except OSError: + print('could not exec llvm-readobj') + return False diff --git a/pkgs/by-name/ll/llvm/15/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/15/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..1354ad2 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,24 @@ +diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg +index 41e3a589c61e..09f3b17498b0 100644 +--- a/tools/polly/test/lit.cfg ++++ b/tools/polly/test/lit.cfg +@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']] + path = os.path.pathsep.join(base_paths + config.extra_paths) + config.environment['PATH'] = path + ++# (Copied from polly/test/Unit/lit.cfg) ++if platform.system() == 'Darwin': ++ shlibpath_var = 'DYLD_LIBRARY_PATH' ++elif platform.system() == 'Windows': ++ shlibpath_var = 'PATH' ++else: ++ shlibpath_var = 'LD_LIBRARY_PATH' ++ + path = os.path.pathsep.join((config.llvm_libs_dir, +- config.environment.get('LD_LIBRARY_PATH',''))) +-config.environment['LD_LIBRARY_PATH'] = path ++ config.environment.get(shlibpath_var,''))) ++config.environment[shlibpath_var] = path + + llvm_config.use_default_substitutions() + diff --git a/pkgs/by-name/ll/llvm/15/openmp/fix-find-tool.patch b/pkgs/by-name/ll/llvm/15/openmp/fix-find-tool.patch new file mode 100644 index 0000000..103b054 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/openmp/fix-find-tool.patch @@ -0,0 +1,18 @@ +diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt +index ce66214822a2..6ab7b33c95da 100644 +--- a/libomptarget/DeviceRTL/CMakeLists.txt ++++ b/libomptarget/DeviceRTL/CMakeLists.txt +@@ -27,10 +27,10 @@ endif() + if (LLVM_DIR) + # Builds that use pre-installed LLVM have LLVM_DIR set. + # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route +- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR}) + find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR} +- NO_DEFAULT_PATH) +- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ ) ++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR}) + if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL)) + libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL} or opt: ${OPT_TOOL}") + return() diff --git a/pkgs/by-name/ll/llvm/15/openmp/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/15/openmp/gnu-install-dirs.patch new file mode 100644 index 0000000..77a9320 --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/openmp/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b6ddbe90516d..311ab1d50e7f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -29,7 +29,7 @@ if (OPENMP_STANDALONE_BUILD) + set(OPENMP_LIBDIR_SUFFIX "" CACHE STRING + "Suffix of lib installation directory, e.g. 64 => lib64") + # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR. +- set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}") + + # Group test settings. + set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING +@@ -40,7 +40,7 @@ if (OPENMP_STANDALONE_BUILD) + else() + set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) + # If building in tree, we honor the same install suffix LLVM uses. +- set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + + if (NOT MSVC) + set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) diff --git a/pkgs/by-name/ll/llvm/15/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/15/openmp/run-lit-directly.patch new file mode 100644 index 0000000..1e952fd --- /dev/null +++ b/pkgs/by-name/ll/llvm/15/openmp/run-lit-directly.patch @@ -0,0 +1,12 @@ +diff --git a/cmake/OpenMPTesting.cmake b/cmake/OpenMPTesting.cmake +--- a/cmake/OpenMPTesting.cmake ++++ b/cmake/OpenMPTesting.cmake +@@ -185,7 +185,7 @@ function(add_openmp_testsuite target comment) + if (${OPENMP_STANDALONE_BUILD}) + set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS}) + add_custom_target(${target} +- COMMAND ${PYTHON_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} ++ COMMAND ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} + COMMENT ${comment} + DEPENDS ${ARG_DEPENDS} + USES_TERMINAL diff --git a/pkgs/by-name/ll/llvm/16/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..e5465c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/clang/gnu-install-dirs.patch @@ -0,0 +1,109 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 090cfa352078..624b7c9f3400 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -38,12 +38,26 @@ if(CLANG_BUILT_STANDALONE) + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") + list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") + +- # Turn into CACHE PATHs for overwritting +- set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") +- set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree") +- set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree") +- set(LLVM_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin") +- set(LLVM_LIBRARY_DIR "${LLVM_LIBRARY_DIR}" CACHE PATH "Path to llvm/lib") ++ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets ++ # LLVM_CONFIG. ++ if (NOT LLVM_CONFIG_FOUND) ++ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config ++ # path is removed. ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) ++ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") ++ # N.B. this is just a default value, the CACHE PATHs below can be overriden. ++ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") ++ set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}") ++ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") ++ endif() ++ ++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") ++ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") ++ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") ++ set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin") ++ set(LLVM_LIBRARY_DIR "${LIBRARY_DIR}" CACHE PATH "Path to llvm/lib") + + find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} + NO_DEFAULT_PATH) +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 75b0080f6715..c895b884cd27 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index bb9a11eabbef..e2de91c65fbb 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -437,7 +437,7 @@ add_header_target("openmp-resource-headers" ${openmp_wrapper_files}) + add_header_target("windows-resource-headers" ${windows_only_files}) + add_header_target("utility-resource-headers" ${utility_files}) + +-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include) + + ############################################################# + # Install rules for the catch-all clang-resource-headers target +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 4f23065a2472..6a0f55991e24 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt +index 3aca22c0b0a8..3115353e3fe3 100644 +--- a/tools/scan-build-py/CMakeLists.txt ++++ b/tools/scan-build-py/CMakeLists.txt +@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib}) + install(FILES lib/libscanbuild/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild" + COMPONENT scan-build-py) + endforeach() + +@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource}) + install(FILES lib/libscanbuild/resources/${resource} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources" + COMPONENT scan-build-py) + endforeach() + +@@ -122,7 +122,7 @@ foreach(lib ${LibEar}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib}) + install(FILES lib/libear/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear" + COMPONENT scan-build-py) + endforeach() + diff --git a/pkgs/by-name/ll/llvm/16/clang/purity.patch b/pkgs/by-name/ll/llvm/16/clang/purity.patch new file mode 100644 index 0000000..1c94f29 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/clang/purity.patch @@ -0,0 +1,29 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,13 +487,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + } else { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); + +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE && +- !Args.hasArg(options::OPT_r)) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/16/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/16/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..07013e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -348,4 +348,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -723,6 +723,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/16/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/16/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/16/compiler-rt/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/compiler-rt/gnu-install-dirs.patch new file mode 100644 index 0000000..f3b1f63 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/compiler-rt/gnu-install-dirs.patch @@ -0,0 +1,20 @@ +diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake +index 8a6219568b3f..30ee68a47ccf 100644 +--- a/cmake/base-config-ix.cmake ++++ b/cmake/base-config-ix.cmake +@@ -100,13 +100,13 @@ endif() + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}/${COMPILER_RT_OS_DIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + endif() diff --git a/pkgs/by-name/ll/llvm/16/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/16/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..2b25fd4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake +index 4c85551d7766..297d7a47c54b 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -328,8 +328,9 @@ macro(load_llvm_config) + endif() + endif() + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + + set(LLVM_MAIN_SRC_DIR "${LLVM_MAIN_SRC_DIR_DEFAULT}" CACHE PATH "Path to LLVM source tree") + message(STATUS "LLVM_MAIN_SRC_DIR: \"${LLVM_MAIN_SRC_DIR}\"") diff --git a/pkgs/by-name/ll/llvm/16/default.nix b/pkgs/by-name/ll/llvm/16/default.nix new file mode 100644 index 0000000..5dd07d7 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/default.nix @@ -0,0 +1,389 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake, ninja +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM verion's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "16.0.6"; sha256 = "sha256-fspqSReX+VD+Nl/Cfq+tDcdPtnQPV1IRopNDfd5VtUs="; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + # Import releaseInfo separately to avoid infinite recursion + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + inherit (releaseInfo) release_version version; + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + lldbPlugins = lib.makeExtensible (lldbPlugins: let + callPackage = newScope (lldbPlugins // { inherit stdenv; inherit (tools) lldb; }); + in { + llef = callPackage ../common/lldb-plugins/llef.nix {}; + }); + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + major = lib.versions.major release_version; + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${major}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-at-least-16-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + lldb-manpages = lowPrio (tools.lldb.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ./lld/add-table-base.patch + ]; + inherit llvm_meta; + }; + + mlir = callPackage ../common/mlir { + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + src = callPackage ({ runCommand }: runCommand "lldb-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/lldb "$out" + '') { }; + patches = + let + resourceDirPatch = callPackage + ({ substituteAll, libclang }: substituteAll + { + src = ./lldb/resource-dir.patch; + clangLibDir = "${libclang.lib}/lib"; + }) + { }; + in + [ + # FIXME: do we need this? ./procfs.patch + resourceDirPatch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = + [ + "-nostartfiles" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRtWithLibc = wrapCCWith (rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + } // lib.optionalAttrs stdenv.targetPlatform.isWasm { + nixSupport.cc-cflags = [ "-fno-exceptions" ]; + }); + + # Has to be in tools despite mostly being a library, + # because we use a native helper executable from a + # non-cross build in cross builds. + libclc = callPackage ../common/libclc.nix { + inherit buildLlvmTools; + }; + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic) + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid || stdenv.hostPlatform.isDarwin + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + # `libcxx` requires a fairly modern C++ compiler, + # so: we use the clang from this LLVM package set instead of the regular + # stdenv's compiler. + libcxx = callPackage ../common/libcxx { + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + patches = [ + ./libunwind/gnu-install-dirs.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/fix-find-tool.patch + ./openmp/gnu-install-dirs.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version lldbPlugins; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/16/libunwind/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/libunwind/gnu-install-dirs.patch new file mode 100644 index 0000000..edfb2a8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/libunwind/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5a06805f05f1..86a50329e6a8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -117,7 +117,7 @@ set(LIBUNWIND_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH + + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH + "Path where built libunwind libraries should be installed.") + if(LIBCXX_LIBDIR_SUBDIR) + string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) +@@ -129,7 +129,7 @@ else() + else() + set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) + endif() +- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH ++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH + "Path where built libunwind libraries should be installed.") + endif() + diff --git a/pkgs/by-name/ll/llvm/16/lld/add-table-base.patch b/pkgs/by-name/ll/llvm/16/lld/add-table-base.patch new file mode 100644 index 0000000..15fc903 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/lld/add-table-base.patch @@ -0,0 +1,190 @@ +From 93adcb770b99351b18553089c164fe3ef2119699 Mon Sep 17 00:00:00 2001 +From: Sam Clegg +Date: Fri, 25 Aug 2023 13:56:16 -0700 +Subject: [PATCH] [lld][WebAssembly] Add `--table-base` setting + +This is similar to `--global-base` but determines where to place the +table segments rather than that data segments. + +See https://github.com/emscripten-core/emscripten/issues/20097 + +Differential Revision: https://reviews.llvm.org/D158892 +--- + test/wasm/table-base.s | 72 ++++++++++++++++++++++++++++++++++++++ + wasm/Driver.cpp | 19 ++++++++-- + wasm/Options.td | 5 ++- + wasm/Writer.cpp | 8 ----- + 4 files changed, 93 insertions(+), 11 deletions(-) + create mode 100644 test/wasm/table-base.s + +diff --git a/test/wasm/table-base.s b/test/wasm/table-base.s +new file mode 100644 +index 000000000000000..56fff414fd31d96 +--- /dev/null ++++ b/test/wasm/table-base.s +@@ -0,0 +1,72 @@ ++# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o ++ ++# RUN: wasm-ld --export=__table_base -o %t.wasm %t.o ++# RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=CHECK-DEFAULT ++ ++# RUN: wasm-ld --table-base=100 --export=__table_base -o %t.wasm %t.o ++# RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=CHECK-100 ++ ++.globl _start ++_start: ++ .functype _start () -> () ++ i32.const _start ++ drop ++ end_function ++ ++# CHECK-DEFAULT: - Type: TABLE ++# CHECK-DEFAULT-NEXT: Tables: ++# CHECK-DEFAULT-NEXT: - Index: 0 ++# CHECK-DEFAULT-NEXT: ElemType: FUNCREF ++# CHECK-DEFAULT-NEXT: Limits: ++# CHECK-DEFAULT-NEXT: Flags: [ HAS_MAX ] ++# CHECK-DEFAULT-NEXT: Minimum: 0x2 ++# CHECK-DEFAULT-NEXT: Maximum: 0x2 ++ ++# CHECK-DEFAULT: - Type: GLOBAL ++# CHECK-DEFAULT-NEXT: Globals: ++# CHECK-DEFAULT-NEXT: - Index: 0 ++# CHECK-DEFAULT-NEXT: Type: I32 ++# CHECK-DEFAULT-NEXT: Mutable: true ++# CHECK-DEFAULT-NEXT: InitExpr: ++# CHECK-DEFAULT-NEXT: Opcode: I32_CONST ++# CHECK-DEFAULT-NEXT: Value: 66560 ++# CHECK-DEFAULT-NEXT: - Index: 1 ++# CHECK-DEFAULT-NEXT: Type: I32 ++# CHECK-DEFAULT-NEXT: Mutable: false ++# CHECK-DEFAULT-NEXT: InitExpr: ++# CHECK-DEFAULT-NEXT: Opcode: I32_CONST ++# CHECK-DEFAULT-NEXT: Value: 1 ++ ++# CHECK-DEFAULT: - Type: EXPORT ++# CHECK-DEFAULT: - Name: __table_base ++# CHECK-DEFAULT-NEXT: Kind: GLOBAL ++# CHECK-DEFAULT-NEXT: Index: 1 ++ ++# CHECK-100: - Type: TABLE ++# CHECK-100-NEXT: Tables: ++# CHECK-100-NEXT: - Index: 0 ++# CHECK-100-NEXT: ElemType: FUNCREF ++# CHECK-100-NEXT: Limits: ++# CHECK-100-NEXT: Flags: [ HAS_MAX ] ++# CHECK-100-NEXT: Minimum: 0x65 ++# CHECK-100-NEXT: Maximum: 0x65 ++ ++# CHECK-100: - Type: GLOBAL ++# CHECK-100-NEXT: Globals: ++# CHECK-100-NEXT: - Index: 0 ++# CHECK-100-NEXT: Type: I32 ++# CHECK-100-NEXT: Mutable: true ++# CHECK-100-NEXT: InitExpr: ++# CHECK-100-NEXT: Opcode: I32_CONST ++# CHECK-100-NEXT: Value: 66560 ++# CHECK-100-NEXT: - Index: 1 ++# CHECK-100-NEXT: Type: I32 ++# CHECK-100-NEXT: Mutable: false ++# CHECK-100-NEXT: InitExpr: ++# CHECK-100-NEXT: Opcode: I32_CONST ++# CHECK-100-NEXT: Value: 100 ++ ++# CHECK-100: - Type: EXPORT ++# CHECK-100: - Name: __table_base ++# CHECK-100-NEXT: Kind: GLOBAL ++# CHECK-100-NEXT: Index: 1 +diff --git a/wasm/Driver.cpp b/wasm/Driver.cpp +index 84304881f5ca34e..c2f5f0185781f36 100644 +--- a/wasm/Driver.cpp ++++ b/wasm/Driver.cpp +@@ -502,6 +502,7 @@ static void readConfigs(opt::InputArgList &args) { + + config->initialMemory = args::getInteger(args, OPT_initial_memory, 0); + config->globalBase = args::getInteger(args, OPT_global_base, 0); ++ config->tableBase = args::getInteger(args, OPT_table_base, 0); + config->maxMemory = args::getInteger(args, OPT_max_memory, 0); + config->zStackSize = + args::getZOptionValue(args, OPT_z, "stack-size", WasmPageSize); +@@ -573,6 +574,17 @@ static void setConfigs() { + if (config->exportTable) + error("-shared/-pie is incompatible with --export-table"); + config->importTable = true; ++ } else { ++ // Default table base. Defaults to 1, reserving 0 for the NULL function ++ // pointer. ++ if (!config->tableBase) ++ config->tableBase = 1; ++ // The default offset for static/global data, for when --global-base is ++ // not specified on the command line. The precise value of 1024 is ++ // somewhat arbitrary, and pre-dates wasm-ld (Its the value that ++ // emscripten used prior to wasm-ld). ++ if (!config->globalBase && !config->relocatable && !config->stackFirst) ++ config->globalBase = 1024; + } + + if (config->relocatable) { +@@ -666,8 +678,11 @@ static void checkOptions(opt::InputArgList &args) { + warn("-Bsymbolic is only meaningful when combined with -shared"); + } + +- if (config->globalBase && config->isPic) { +- error("--global-base may not be used with -shared/-pie"); ++ if (config->isPic) { ++ if (config->globalBase) ++ error("--global-base may not be used with -shared/-pie"); ++ if (config->tableBase) ++ error("--table-base may not be used with -shared/-pie"); + } + } + +diff --git a/wasm/Options.td b/wasm/Options.td +index 50417d2928e0a34..bb764396bf4df14 100644 +--- a/wasm/Options.td ++++ b/wasm/Options.td +@@ -191,7 +191,7 @@ def growable_table: FF<"growable-table">, + HelpText<"Remove maximum size from function table, allowing table to grow">; + + def global_base: JJ<"global-base=">, +- HelpText<"Where to start to place global data">; ++ HelpText<"Memory offset at which to place global data (Defaults to 1024)">; + + def import_memory: FF<"import-memory">, + HelpText<"Import the module's memory from the default module of \"env\" with the name \"memory\".">; +@@ -224,6 +224,9 @@ def no_entry: FF<"no-entry">, + def stack_first: FF<"stack-first">, + HelpText<"Place stack at start of linear memory rather than after data">; + ++def table_base: JJ<"table-base=">, ++ HelpText<"Table offset at which to place address taken functions (Defaults to 1)">; ++ + defm whole_archive: B<"whole-archive", + "Force load of all members in a static library", + "Do not force load of all members in a static library (default)">; +diff --git a/wasm/Writer.cpp b/wasm/Writer.cpp +index f25d358dc5bae6f..0576bf2907e49c4 100644 +--- a/wasm/Writer.cpp ++++ b/wasm/Writer.cpp +@@ -358,13 +358,6 @@ void Writer::layoutMemory() { + memoryPtr = config->globalBase; + } + } else { +- if (!config->globalBase && !config->relocatable && !config->isPic) { +- // The default offset for static/global data, for when --global-base is +- // not specified on the command line. The precise value of 1024 is +- // somewhat arbitrary, and pre-dates wasm-ld (Its the value that +- // emscripten used prior to wasm-ld). +- config->globalBase = 1024; +- } + memoryPtr = config->globalBase; + } + +@@ -1685,7 +1678,6 @@ void Writer::run() { + // For PIC code the table base is assigned dynamically by the loader. + // For non-PIC, we start at 1 so that accessing table index 0 always traps. + if (!config->isPic) { +- config->tableBase = 1; + if (WasmSym::definedTableBase) + WasmSym::definedTableBase->setVA(config->tableBase); + if (WasmSym::definedTableBase32) diff --git a/pkgs/by-name/ll/llvm/16/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..86e76f4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/lld/gnu-install-dirs.patch @@ -0,0 +1,46 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 3d6225646fe6..9b5d0b15af13 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -33,10 +33,22 @@ if(LLD_BUILT_STANDALONE) + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") + list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") + +- # Turn into CACHE PATHs for overwriting +- set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") +- set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree") +- set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree") ++ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets ++ # LLVM_CONFIG. ++ if (NOT LLVM_CONFIG_FOUND) ++ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config ++ # path is removed. ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) ++ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") ++ # N.B. this is just a default value, the CACHE PATHs below can be overridden. ++ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") ++ endif() ++ ++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") ++ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") ++ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") + + find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} + NO_DEFAULT_PATH) +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index d3924f7243d4..42a7cd62281c 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) diff --git a/pkgs/by-name/ll/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/16/lldb/procfs.patch b/pkgs/by-name/ll/llvm/16/lldb/procfs.patch new file mode 100644 index 0000000..7b200e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/lldb/procfs.patch @@ -0,0 +1,46 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -10,6 +10,13 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include ++ ++// on i686 preprocessor symbols with these register names are defined as ++// numeric constants; these symbols clash with identifier names used in ++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h` ++#undef FS ++#undef CS + + #include "lldb/lldb-types.h" + +@@ -17,23 +24,13 @@ + + #include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif + + namespace lldb_private { + namespace process_linux { diff --git a/pkgs/by-name/ll/llvm/16/lldb/resource-dir.patch b/pkgs/by-name/ll/llvm/16/lldb/resource-dir.patch new file mode 100644 index 0000000..3e1a8b7 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/lldb/resource-dir.patch @@ -0,0 +1,14 @@ +diff --git a/cmake/modules/LLDBConfig.cmake b/cmake/modules/LLDBConfig.cmake +index ec06ba285f27..286162f098fb 100644 +--- a/cmake/modules/LLDBConfig.cmake ++++ b/cmake/modules/LLDBConfig.cmake +@@ -290,7 +290,8 @@ if (NOT TARGET clang-resource-headers) + # could be and pick the first that exists. + foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}" + "${LLVM_BUILD_LIBRARY_DIR}" +- "${LLVM_LIBRARY_DIR}") ++ "${LLVM_LIBRARY_DIR}" ++ "@clangLibDir@") + # Build the resource directory path by appending 'clang/'. + set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}") + if (IS_DIRECTORY "${CANDIDATE_RESOURCE_DIR}") diff --git a/pkgs/by-name/ll/llvm/16/llvm/default.nix b/pkgs/by-name/ll/llvm/16/llvm/default.nix new file mode 100644 index 0000000..0a8d877 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/default.nix @@ -0,0 +1,435 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, cmake +, darwin +, ninja +, python3 +, python3Packages +, libffi +# TODO: Gold plugin on LLVM16 has a severe memory corruption bug: https://github.com/llvm/llvm-project/issues/61350. +, enableGoldPlugin ? false +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, sysctl +, buildLlvmTools +, debugVersion ? false +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +, enablePFM ? stdenv.isLinux /* PFM only supports Linux */ + # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 + # broken for the armv7l builder + && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + # Note that we _explicitly_ ask for a python interpreter for our host + # platform here; the splicing that would ordinarily take care of this for + # us does not seem to work once we use `withPackages`. + let + checkDeps = ps: with ps; [ psutil ]; + in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps + else python3; + +in + assert (lib.assertMsg (!enableGoldPlugin) "Gold plugin cannot be enabled on LLVM16 due to a upstream issue: https://github.com/llvm/llvm-project/issues/61350"); + stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake ninja python ] + ++ optionals enableManpages [ + # Note: we intentionally use `python3Packages` instead of `python3.pkgs`; + # splicing does *not* work with the latter. (TODO: fix) + python3Packages.sphinx python3Packages.recommonmark + ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ + which + ] ++ lib.optional stdenv.isDarwin sysctl; + + patches = [ + ./gnu-install-dirs.patch + + # Running the tests involves invoking binaries (like `opt`) that depend on + # the LLVM dylibs and reference them by absolute install path (i.e. their + # nix store path). + # + # Because we have not yet run the install phase (we're running these tests + # as part of `checkPhase` instead of `installCheckPhase`) these absolute + # paths do not exist yet; to work around this we point the loader (`ld` on + # unix, `dyld` on macOS) at the `lib` directory which will later become this + # package's `lib` output. + # + # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib` + # dir but: + # - this doesn't generalize well to other platforms; `lit` doesn't forward + # `DYLD_LIBRARY_PATH` (macOS): + # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26 + # - even if `lit` forwarded this env var, we actually cannot set + # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because + # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for + # "protected processes" (i.e. the python interpreter that runs `lit`): + # https://stackoverflow.com/a/35570229 + # - other LLVM subprojects deal with this issue by having their `lit` + # configuration set these env vars for us; it makes sense to do the same + # for LLVM: + # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31 + # + # !!! TODO: look into upstreaming this patch + ./llvm-lit-cfg-add-libs-to-dylib-path.patch + + # `lit` has a mode where it executes run lines as a shell script which is + # constructs; this is problematic for macOS because it means that there's + # another process in between `lit` and the binaries being tested. As noted + # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our + # tests fail with dyld errors. + # + # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when + # present in the test configuration. + # + # It's not clear to me why this isn't an issue for LLVM developers running + # on macOS (nothing about this _seems_ nix specific).. + ./lit-shell-script-runner-set-dyld-library-path.patch + ] ++ lib.optionals enablePolly [ + ./gnu-install-dirs-polly.patch + + # Just like the `llvm-lit-cfg` patch, but for `polly`. + ./polly-lit-cfg-add-libs-to-dylib-path.patch + ]; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + + # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick + # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7 + rm test/MC/ELF/cfi-version.ll + + # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`) + # and thus fails under the sandbox: + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }" + + # This test tries to call the intrinsics `@llvm.roundeven.f32` and + # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf` + # and `roundeven` on macOS. + # + # However these functions are glibc specific so the test fails: + # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html + # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html + # + substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \ + --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \ + --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" "" + '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) '' + # This test fails on darwin x86_64 because `sw_vers` reports a different + # macOS version than what LLVM finds by reading + # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into + # the sandbox on macOS). + # + # The `sw_vers` provided by nixpkgs reports the macOS version associated + # with the `CoreFoundation` framework with which it was built. Because + # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what + # `sw_vers` reports is not guaranteed to match the macOS version of the host + # that's building this derivation. + # + # Astute readers will note that we only _patch_ this test on aarch64-darwin + # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright. + # So why does this test pass on aarch64? + # + # Well, it seems that `sw_vers` on aarch64 actually links against the _host_ + # CoreFoundation framework instead of the nixpkgs provided one. + # + # Not entirely sure what the right fix is here. I'm assuming aarch64 + # `sw_vers` doesn't intentionally link against the host `CoreFoundation` + # (still digging into how this ends up happening, will follow up) but that + # aside I think the more pertinent question is: should we be patching LLVM's + # macOS version detection logic to use `sw_vers` instead of reading host + # paths? This *is* a way in which details about builder machines can creep + # into the artifacts that are produced, affecting reproducibility, but it's + # not clear to me when/where/for what this even gets used in LLVM. + # + # TODO(@rrbutani): fix/follow-up + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion" + + # This test fails with a `dysmutil` crash; have not yet dug into what's + # going on here (TODO(@rrbutani)). + rm test/tools/dsymutil/ARM/obfuscated.test + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + + # Fails in the presence of anti-virus software or other intrusion-detection software that + # modifies the atime when run. See #284056. + rm test/tools/llvm-objcopy/ELF/strip-preserve-atime.test + + # timing-based tests are trouble + rm utils/lit/tests/googletest-timeout.py + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar" + ) + ''; + + # Defensive check: some paths (that we make symlinks to) depend on the release + # version, for example: + # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185 + # + # So we want to sure that the version in the source matches the release + # version we were given. + # + # We do this check here, in the LLVM build, because it happens early. + postConfigure = let + v = lib.versions; + major = v.major release_version; + minor = v.minor release_version; + patch = v.patch release_version; + in '' + # $1: part, $2: expected + check_version() { + part="''${1^^}" + part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)" + + if [[ "$part" != "$2" ]]; then + echo >&2 \ + "mismatch in the $1 version! we have version ${release_version}" \ + "and expected the $1 version to be '$2'; the source has '$part' instead" + exit 3 + fi + } + + check_version major ${major} + check_version minor ${minor} + check_version patch ${patch} + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals enableGoldPlugin [ + # For LLVMgold plugin + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + propagatedBuildInputs = []; + + ninjaFlags = [ "docs-llvm-man" ]; + installTargets = [ "install-docs-llvm-man" ]; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..b01363e --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,19 @@ +This is the one remaining Polly install dirs related change that hasn't made it +into upstream yet; previously this patch file also included: +https://reviews.llvm.org/D117541 + +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) diff --git a/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..1c2d52d --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/gnu-install-dirs.patch @@ -0,0 +1,161 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 7e25e0407db2..72f031a82b75 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -995,7 +995,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") + add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) + install(TARGETS tf_xla_runtime EXPORT LLVMExports +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime) + # Once we add more modules, we should handle this more automatically. + if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 93e6d67551de..8d367457af5a 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -874,8 +874,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -2043,7 +2043,7 @@ function(llvm_install_library_symlink name dest type) + set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) + set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir "${CMAKE_INSTALL_BINDIR}") + endif() +@@ -2312,16 +2312,37 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) + # $ORIGIN is not interpreted at link time by aix ld. + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}") ++ # Note that we add `extra_libdir` (aka `LLVM_LIBRARY_DIR` in our case) back ++ # to `_install_rpath` here. ++ # ++ # In nixpkgs we do not build and install LLVM alongside rdeps of LLVM (i.e. ++ # clang); instead LLVM is its own package and thus lands at its own nix ++ # store path. This makes it so that the default relative rpath (`../lib/`) ++ # does not point at the LLVM shared objects. ++ # ++ # More discussion here: ++ # - https://github.com/NixOS/nixpkgs/pull/235624#discussion_r1220150329 ++ # - https://reviews.llvm.org/D146918 (16.0.5+) ++ # ++ # Note that we leave `extra_libdir` in `_build_rpath`: without FHS there is ++ # no potential that this will result in us pulling in the "wrong" LLVM. ++ # Adding this to the build rpath means we aren't forced to use ++ # `installCheckPhase` instead of `checkPhase` (i.e. binaries in the build ++ # dir, pre-install, will have the right rpath for LLVM). ++ # ++ # As noted in the differential above, an alternative solution is to have ++ # all rdeps of nixpkgs' LLVM (that use the AddLLVM.cmake machinery) set ++ # `CMAKE_INSTALL_RPATH`. ++ set(_build_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index d99af79aa38e..21e794224b99 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -127,7 +127,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/docs/CMake.rst b/docs/CMake.rst +index 7926de258ec8..5ae01adc3905 100644 +--- a/docs/CMake.rst ++++ b/docs/CMake.rst +@@ -250,7 +250,7 @@ description is in `LLVM-related variables`_ below. + **LLVM_LIBDIR_SUFFIX**:STRING + Extra suffix to append to the directory where libraries are to be + installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64`` +- to install libraries to ``/usr/lib64``. ++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``. + + **LLVM_PARALLEL_{COMPILE,LINK}_JOBS**:STRING + Building the llvm toolchain can use a lot of resources, particularly +@@ -284,6 +284,10 @@ manual, or execute ``cmake --help-variable VARIABLE_NAME``. + The path to install executables, relative to the *CMAKE_INSTALL_PREFIX*. + Defaults to "bin". + ++**CMAKE_INSTALL_LIBDIR**:PATH ++ The path to install libraries, relative to the *CMAKE_INSTALL_PREFIX*. ++ Defaults to "lib". ++ + **CMAKE_INSTALL_INCLUDEDIR**:PATH + The path to install header files, relative to the *CMAKE_INSTALL_PREFIX*. + Defaults to "include". +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index 370005cd8d7d..7e790bc52111 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,7 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" + #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index b1d795a0a349..de6cb1514f05 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -366,7 +366,11 @@ int main(int argc, char **argv) { + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } + { + SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR); + sys::fs::make_absolute(ActivePrefix, Path); diff --git a/pkgs/by-name/ll/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/by-name/ll/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch new file mode 100644 index 0000000..82b7b21 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch @@ -0,0 +1,17 @@ +diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py +index 0242e0b75af3..d732011306f7 100644 +--- a/utils/lit/lit/TestRunner.py ++++ b/utils/lit/lit/TestRunner.py +@@ -1029,6 +1029,12 @@ def executeScript(test, litConfig, tmpBase, commands, cwd): + f.write('@echo off\n') + f.write('\n@if %ERRORLEVEL% NEQ 0 EXIT\n'.join(commands)) + else: ++ # This env var is *purged* when invoking subprocesses so we have to ++ # manually set it from within the bash script in order for the commands ++ # in run lines to see this var: ++ if "DYLD_LIBRARY_PATH" in test.config.environment: ++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n') ++ + for i, ln in enumerate(commands): + match = re.match(kPdbgRegex, ln) + if match: diff --git a/pkgs/by-name/ll/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..d824516 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,79 @@ +diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py +index 81e8dc04acea..479ff95681e2 100644 +--- a/test/Unit/lit.cfg.py ++++ b/test/Unit/lit.cfg.py +@@ -3,6 +3,7 @@ + # Configuration file for the 'lit' test runner. + + import os ++import platform + import subprocess + + import lit.formats +@@ -55,3 +56,26 @@ if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir): + # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. + if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ: + config.environment['SYSTEMDRIVE'] = os.environ['SYSTEMDRIVE'] ++ ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']: ++ yield 'LD_LIBRARY_PATH' ++ elif platform.system() == 'Darwin': ++ yield 'DYLD_LIBRARY_PATH' ++ elif platform.system() == 'Windows': ++ yield 'PATH' ++ elif platform.system() == 'AIX': ++ yield 'LIBPATH' ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = os.path.pathsep.join( ++ (config.shlibdir, ++ config.environment.get(shlibpath_var, ''))) ++ config.environment[shlibpath_var] = shlibpath ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 75a38b4c5dad..856fc75c9d74 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -42,6 +42,26 @@ llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True) + llvm_config.with_system_environment( + ['HOME', 'INCLUDE', 'LIB', 'TMP', 'TEMP']) + ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']: ++ yield 'LD_LIBRARY_PATH' ++ elif platform.system() == 'Darwin': ++ yield 'DYLD_LIBRARY_PATH' ++ elif platform.system() == 'Windows': ++ yield 'PATH' ++ elif platform.system() == 'AIX': ++ yield 'LIBPATH' ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = config.llvm_shlib_dir ++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True) ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) + + # Set up OCAMLPATH to include newly built OCaml libraries. + top_ocaml_lib = os.path.join(config.llvm_lib_dir, 'ocaml') +@@ -318,7 +338,7 @@ def have_cxx_shared_library(): + + try: + readobj_cmd = subprocess.Popen( +- [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE) ++ [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE, env=config.environment) + except OSError: + print('could not exec llvm-readobj') + return False diff --git a/pkgs/by-name/ll/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..1354ad2 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,24 @@ +diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg +index 41e3a589c61e..09f3b17498b0 100644 +--- a/tools/polly/test/lit.cfg ++++ b/tools/polly/test/lit.cfg +@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']] + path = os.path.pathsep.join(base_paths + config.extra_paths) + config.environment['PATH'] = path + ++# (Copied from polly/test/Unit/lit.cfg) ++if platform.system() == 'Darwin': ++ shlibpath_var = 'DYLD_LIBRARY_PATH' ++elif platform.system() == 'Windows': ++ shlibpath_var = 'PATH' ++else: ++ shlibpath_var = 'LD_LIBRARY_PATH' ++ + path = os.path.pathsep.join((config.llvm_libs_dir, +- config.environment.get('LD_LIBRARY_PATH',''))) +-config.environment['LD_LIBRARY_PATH'] = path ++ config.environment.get(shlibpath_var,''))) ++config.environment[shlibpath_var] = path + + llvm_config.use_default_substitutions() + diff --git a/pkgs/by-name/ll/llvm/16/openmp/fix-find-tool.patch b/pkgs/by-name/ll/llvm/16/openmp/fix-find-tool.patch new file mode 100644 index 0000000..dd0a79f --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/openmp/fix-find-tool.patch @@ -0,0 +1,21 @@ +diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt +index 49b398c9f765..6f1dd1340010 100644 +--- a/libomptarget/DeviceRTL/CMakeLists.txt ++++ b/libomptarget/DeviceRTL/CMakeLists.txt +@@ -27,11 +27,11 @@ endif() + if (LLVM_DIR) + # Builds that use pre-installed LLVM have LLVM_DIR set. + # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route +- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(PACKAGER_TOOL clang-offload-packager PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(EXTRACT_TOOL llvm-extract PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR}) ++ find_program(PACKAGER_TOOL clang-offload-packager PATHS ${LLVM_TOOLS_BINARY_DIR}) ++ find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR}) ++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR}) ++ find_program(EXTRACT_TOOL llvm-extract PATHS ${LLVM_TOOLS_BINARY_DIR}) + if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL) OR (NOT EXTRACT_TOOL) OR (NOT PACKAGER_TOOL)) + libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL}, opt: ${OPT_TOOL}, llvm-extract: ${EXTRACT_TOOL}, or clang-offload-packager: ${PACKAGER_TOOL}") + return() diff --git a/pkgs/by-name/ll/llvm/16/openmp/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/16/openmp/gnu-install-dirs.patch new file mode 100644 index 0000000..77a9320 --- /dev/null +++ b/pkgs/by-name/ll/llvm/16/openmp/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b6ddbe90516d..311ab1d50e7f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -29,7 +29,7 @@ if (OPENMP_STANDALONE_BUILD) + set(OPENMP_LIBDIR_SUFFIX "" CACHE STRING + "Suffix of lib installation directory, e.g. 64 => lib64") + # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR. +- set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}") + + # Group test settings. + set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING +@@ -40,7 +40,7 @@ if (OPENMP_STANDALONE_BUILD) + else() + set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) + # If building in tree, we honor the same install suffix LLVM uses. +- set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + + if (NOT MSVC) + set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) diff --git a/pkgs/by-name/ll/llvm/16/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/16/openmp/run-lit-directly.patch new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/ll/llvm/17/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/17/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..cc8737f --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/clang/gnu-install-dirs.patch @@ -0,0 +1,98 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f7936d72e088..a362fa49b534 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -31,7 +31,21 @@ if(CLANG_BUILT_STANDALONE) + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") + list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") + +- # Turn into CACHE PATHs for overwritting ++ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets ++ # LLVM_CONFIG. ++ if (NOT LLVM_CONFIG_FOUND) ++ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config ++ # path is removed. ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) ++ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") ++ # N.B. this is just a default value, the CACHE PATHs below can be overriden. ++ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") ++ set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}") ++ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") ++ endif() ++ + set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") + set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree") + set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree") +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 75b0080f6715..c895b884cd27 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index f2b0c5cddcbb..52f37fc368ce 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -473,6 +473,7 @@ add_header_target("windows-resource-headers" ${windows_only_files}) + add_header_target("utility-resource-headers" ${utility_files}) + + get_clang_resource_dir(header_install_dir SUBDIR include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${CLANG_VERSION_MAJOR}/include) + + ############################################################# + # Install rules for the catch-all clang-resource-headers target +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 4f23065a2472..6a0f55991e24 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt +index 3aca22c0b0a8..3115353e3fe3 100644 +--- a/tools/scan-build-py/CMakeLists.txt ++++ b/tools/scan-build-py/CMakeLists.txt +@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib}) + install(FILES lib/libscanbuild/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild" + COMPONENT scan-build-py) + endforeach() + +@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource}) + install(FILES lib/libscanbuild/resources/${resource} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources" + COMPONENT scan-build-py) + endforeach() + +@@ -122,7 +122,7 @@ foreach(lib ${LibEar}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib}) + install(FILES lib/libear/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear" + COMPONENT scan-build-py) + endforeach() + diff --git a/pkgs/by-name/ll/llvm/17/clang/purity.patch b/pkgs/by-name/ll/llvm/17/clang/purity.patch new file mode 100644 index 0000000..1c94f29 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/clang/purity.patch @@ -0,0 +1,29 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -487,13 +487,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + } else { + if (Args.hasArg(options::OPT_rdynamic)) + CmdArgs.push_back("-export-dynamic"); + +- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE && +- !Args.hasArg(options::OPT_r)) { +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); +- } + } + + CmdArgs.push_back("-o"); +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/17/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/17/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..07013e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -348,4 +348,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -723,6 +723,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/17/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/17/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/17/compiler-rt/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/17/compiler-rt/gnu-install-dirs.patch new file mode 100644 index 0000000..f3b1f63 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/compiler-rt/gnu-install-dirs.patch @@ -0,0 +1,20 @@ +diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake +index 8a6219568b3f..30ee68a47ccf 100644 +--- a/cmake/base-config-ix.cmake ++++ b/cmake/base-config-ix.cmake +@@ -100,13 +100,13 @@ endif() + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(COMPILER_RT_OUTPUT_LIBRARY_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) +- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") ++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}/${COMPILER_RT_OS_DIR}") + set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") + endif() diff --git a/pkgs/by-name/ll/llvm/17/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/17/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..2b25fd4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake +index 4c85551d7766..297d7a47c54b 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -328,8 +328,9 @@ macro(load_llvm_config) + endif() + endif() + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + + set(LLVM_MAIN_SRC_DIR "${LLVM_MAIN_SRC_DIR_DEFAULT}" CACHE PATH "Path to LLVM source tree") + message(STATUS "LLVM_MAIN_SRC_DIR: \"${LLVM_MAIN_SRC_DIR}\"") diff --git a/pkgs/by-name/ll/llvm/17/default.nix b/pkgs/by-name/ll/llvm/17/default.nix new file mode 100644 index 0000000..9f4be22 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/default.nix @@ -0,0 +1,379 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake, ninja +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, fetchpatch, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM verion's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "17.0.6"; sha256 = "sha256-8MEDLLhocshmxoEBRSKlJ/GzJ8nfuzQ8qn0X/vLA+ag="; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + + inherit (releaseInfo) release_version version; + + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + major = lib.versions.major release_version; + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${major}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-at-least-16-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + lldb-manpages = lowPrio (tools.lldb.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ./lld/add-table-base.patch + ]; + inherit llvm_meta; + }; + + mlir = callPackage ../common/mlir { + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + src = callPackage ({ runCommand }: runCommand "lldb-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/lldb "$out" + '') { }; + patches = + [ + # FIXME: do we need this? ./procfs.patch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = + [ + "-nostartfiles" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRtWithLibc = wrapCCWith (rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + } // lib.optionalAttrs stdenv.targetPlatform.isWasm { + nixSupport.cc-cflags = [ "-fno-exceptions" ]; + }); + + # Has to be in tools despite mostly being a library, + # because we use a native helper executable from a + # non-cross build in cross builds. + libclc = callPackage ../common/libclc.nix { + inherit buildLlvmTools; + }; + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic) + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + ./compiler-rt/gnu-install-dirs.patch + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # Prevent a compilation error on darwin + ./compiler-rt/darwin-targetconditionals.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid || stdenv.hostPlatform.isDarwin + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + # `libcxx` requires a fairly modern C++ compiler, + # so: we use the clang from this LLVM package set instead of the regular + # stdenv's compiler. + libcxx = callPackage ../common/libcxx { + patches = lib.optionals (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [ + # https://github.com/llvm/llvm-project/issues/64226 + (fetchpatch { + name = "0042-mbstate_t-not-defined.patch"; + url = "https://github.com/macports/macports-ports/raw/acd8acb171f1658596ed1cf25da48d5b932e2d19/lang/llvm-17/files/0042-mbstate_t-not-defined.patch"; + hash = "sha256-jo+DYA6zuSv9OH3A0bYwY5TlkWprup4OKQ7rfK1WHBI="; + }) + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/fix-find-tool.patch + ./openmp/gnu-install-dirs.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/17/lld/add-table-base.patch b/pkgs/by-name/ll/llvm/17/lld/add-table-base.patch new file mode 100644 index 0000000..15fc903 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/lld/add-table-base.patch @@ -0,0 +1,190 @@ +From 93adcb770b99351b18553089c164fe3ef2119699 Mon Sep 17 00:00:00 2001 +From: Sam Clegg +Date: Fri, 25 Aug 2023 13:56:16 -0700 +Subject: [PATCH] [lld][WebAssembly] Add `--table-base` setting + +This is similar to `--global-base` but determines where to place the +table segments rather than that data segments. + +See https://github.com/emscripten-core/emscripten/issues/20097 + +Differential Revision: https://reviews.llvm.org/D158892 +--- + test/wasm/table-base.s | 72 ++++++++++++++++++++++++++++++++++++++ + wasm/Driver.cpp | 19 ++++++++-- + wasm/Options.td | 5 ++- + wasm/Writer.cpp | 8 ----- + 4 files changed, 93 insertions(+), 11 deletions(-) + create mode 100644 test/wasm/table-base.s + +diff --git a/test/wasm/table-base.s b/test/wasm/table-base.s +new file mode 100644 +index 000000000000000..56fff414fd31d96 +--- /dev/null ++++ b/test/wasm/table-base.s +@@ -0,0 +1,72 @@ ++# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o ++ ++# RUN: wasm-ld --export=__table_base -o %t.wasm %t.o ++# RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=CHECK-DEFAULT ++ ++# RUN: wasm-ld --table-base=100 --export=__table_base -o %t.wasm %t.o ++# RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=CHECK-100 ++ ++.globl _start ++_start: ++ .functype _start () -> () ++ i32.const _start ++ drop ++ end_function ++ ++# CHECK-DEFAULT: - Type: TABLE ++# CHECK-DEFAULT-NEXT: Tables: ++# CHECK-DEFAULT-NEXT: - Index: 0 ++# CHECK-DEFAULT-NEXT: ElemType: FUNCREF ++# CHECK-DEFAULT-NEXT: Limits: ++# CHECK-DEFAULT-NEXT: Flags: [ HAS_MAX ] ++# CHECK-DEFAULT-NEXT: Minimum: 0x2 ++# CHECK-DEFAULT-NEXT: Maximum: 0x2 ++ ++# CHECK-DEFAULT: - Type: GLOBAL ++# CHECK-DEFAULT-NEXT: Globals: ++# CHECK-DEFAULT-NEXT: - Index: 0 ++# CHECK-DEFAULT-NEXT: Type: I32 ++# CHECK-DEFAULT-NEXT: Mutable: true ++# CHECK-DEFAULT-NEXT: InitExpr: ++# CHECK-DEFAULT-NEXT: Opcode: I32_CONST ++# CHECK-DEFAULT-NEXT: Value: 66560 ++# CHECK-DEFAULT-NEXT: - Index: 1 ++# CHECK-DEFAULT-NEXT: Type: I32 ++# CHECK-DEFAULT-NEXT: Mutable: false ++# CHECK-DEFAULT-NEXT: InitExpr: ++# CHECK-DEFAULT-NEXT: Opcode: I32_CONST ++# CHECK-DEFAULT-NEXT: Value: 1 ++ ++# CHECK-DEFAULT: - Type: EXPORT ++# CHECK-DEFAULT: - Name: __table_base ++# CHECK-DEFAULT-NEXT: Kind: GLOBAL ++# CHECK-DEFAULT-NEXT: Index: 1 ++ ++# CHECK-100: - Type: TABLE ++# CHECK-100-NEXT: Tables: ++# CHECK-100-NEXT: - Index: 0 ++# CHECK-100-NEXT: ElemType: FUNCREF ++# CHECK-100-NEXT: Limits: ++# CHECK-100-NEXT: Flags: [ HAS_MAX ] ++# CHECK-100-NEXT: Minimum: 0x65 ++# CHECK-100-NEXT: Maximum: 0x65 ++ ++# CHECK-100: - Type: GLOBAL ++# CHECK-100-NEXT: Globals: ++# CHECK-100-NEXT: - Index: 0 ++# CHECK-100-NEXT: Type: I32 ++# CHECK-100-NEXT: Mutable: true ++# CHECK-100-NEXT: InitExpr: ++# CHECK-100-NEXT: Opcode: I32_CONST ++# CHECK-100-NEXT: Value: 66560 ++# CHECK-100-NEXT: - Index: 1 ++# CHECK-100-NEXT: Type: I32 ++# CHECK-100-NEXT: Mutable: false ++# CHECK-100-NEXT: InitExpr: ++# CHECK-100-NEXT: Opcode: I32_CONST ++# CHECK-100-NEXT: Value: 100 ++ ++# CHECK-100: - Type: EXPORT ++# CHECK-100: - Name: __table_base ++# CHECK-100-NEXT: Kind: GLOBAL ++# CHECK-100-NEXT: Index: 1 +diff --git a/wasm/Driver.cpp b/wasm/Driver.cpp +index 84304881f5ca34e..c2f5f0185781f36 100644 +--- a/wasm/Driver.cpp ++++ b/wasm/Driver.cpp +@@ -502,6 +502,7 @@ static void readConfigs(opt::InputArgList &args) { + + config->initialMemory = args::getInteger(args, OPT_initial_memory, 0); + config->globalBase = args::getInteger(args, OPT_global_base, 0); ++ config->tableBase = args::getInteger(args, OPT_table_base, 0); + config->maxMemory = args::getInteger(args, OPT_max_memory, 0); + config->zStackSize = + args::getZOptionValue(args, OPT_z, "stack-size", WasmPageSize); +@@ -573,6 +574,17 @@ static void setConfigs() { + if (config->exportTable) + error("-shared/-pie is incompatible with --export-table"); + config->importTable = true; ++ } else { ++ // Default table base. Defaults to 1, reserving 0 for the NULL function ++ // pointer. ++ if (!config->tableBase) ++ config->tableBase = 1; ++ // The default offset for static/global data, for when --global-base is ++ // not specified on the command line. The precise value of 1024 is ++ // somewhat arbitrary, and pre-dates wasm-ld (Its the value that ++ // emscripten used prior to wasm-ld). ++ if (!config->globalBase && !config->relocatable && !config->stackFirst) ++ config->globalBase = 1024; + } + + if (config->relocatable) { +@@ -666,8 +678,11 @@ static void checkOptions(opt::InputArgList &args) { + warn("-Bsymbolic is only meaningful when combined with -shared"); + } + +- if (config->globalBase && config->isPic) { +- error("--global-base may not be used with -shared/-pie"); ++ if (config->isPic) { ++ if (config->globalBase) ++ error("--global-base may not be used with -shared/-pie"); ++ if (config->tableBase) ++ error("--table-base may not be used with -shared/-pie"); + } + } + +diff --git a/wasm/Options.td b/wasm/Options.td +index 50417d2928e0a34..bb764396bf4df14 100644 +--- a/wasm/Options.td ++++ b/wasm/Options.td +@@ -191,7 +191,7 @@ def growable_table: FF<"growable-table">, + HelpText<"Remove maximum size from function table, allowing table to grow">; + + def global_base: JJ<"global-base=">, +- HelpText<"Where to start to place global data">; ++ HelpText<"Memory offset at which to place global data (Defaults to 1024)">; + + def import_memory: FF<"import-memory">, + HelpText<"Import the module's memory from the default module of \"env\" with the name \"memory\".">; +@@ -224,6 +224,9 @@ def no_entry: FF<"no-entry">, + def stack_first: FF<"stack-first">, + HelpText<"Place stack at start of linear memory rather than after data">; + ++def table_base: JJ<"table-base=">, ++ HelpText<"Table offset at which to place address taken functions (Defaults to 1)">; ++ + defm whole_archive: B<"whole-archive", + "Force load of all members in a static library", + "Do not force load of all members in a static library (default)">; +diff --git a/wasm/Writer.cpp b/wasm/Writer.cpp +index f25d358dc5bae6f..0576bf2907e49c4 100644 +--- a/wasm/Writer.cpp ++++ b/wasm/Writer.cpp +@@ -358,13 +358,6 @@ void Writer::layoutMemory() { + memoryPtr = config->globalBase; + } + } else { +- if (!config->globalBase && !config->relocatable && !config->isPic) { +- // The default offset for static/global data, for when --global-base is +- // not specified on the command line. The precise value of 1024 is +- // somewhat arbitrary, and pre-dates wasm-ld (Its the value that +- // emscripten used prior to wasm-ld). +- config->globalBase = 1024; +- } + memoryPtr = config->globalBase; + } + +@@ -1685,7 +1678,6 @@ void Writer::run() { + // For PIC code the table base is assigned dynamically by the loader. + // For non-PIC, we start at 1 so that accessing table index 0 always traps. + if (!config->isPic) { +- config->tableBase = 1; + if (WasmSym::definedTableBase) + WasmSym::definedTableBase->setVA(config->tableBase); + if (WasmSym::definedTableBase32) diff --git a/pkgs/by-name/ll/llvm/17/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/17/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..86e76f4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/lld/gnu-install-dirs.patch @@ -0,0 +1,46 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 3d6225646fe6..9b5d0b15af13 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -33,10 +33,22 @@ if(LLD_BUILT_STANDALONE) + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") + list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") + +- # Turn into CACHE PATHs for overwriting +- set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") +- set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree") +- set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree") ++ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets ++ # LLVM_CONFIG. ++ if (NOT LLVM_CONFIG_FOUND) ++ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config ++ # path is removed. ++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) ++ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") ++ # N.B. this is just a default value, the CACHE PATHs below can be overridden. ++ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") ++ else() ++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}") ++ endif() ++ ++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed") ++ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") ++ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") + + find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} + NO_DEFAULT_PATH) +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index d3924f7243d4..42a7cd62281c 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) diff --git a/pkgs/by-name/ll/llvm/17/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/17/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/17/lldb/procfs.patch b/pkgs/by-name/ll/llvm/17/lldb/procfs.patch new file mode 100644 index 0000000..7b200e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/lldb/procfs.patch @@ -0,0 +1,46 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -10,6 +10,13 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include ++ ++// on i686 preprocessor symbols with these register names are defined as ++// numeric constants; these symbols clash with identifier names used in ++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h` ++#undef FS ++#undef CS + + #include "lldb/lldb-types.h" + +@@ -17,23 +24,13 @@ + + #include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif + + namespace lldb_private { + namespace process_linux { diff --git a/pkgs/by-name/ll/llvm/17/llvm/default.nix b/pkgs/by-name/ll/llvm/17/llvm/default.nix new file mode 100644 index 0000000..a045bea --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/default.nix @@ -0,0 +1,431 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, cmake +, darwin +, ninja +, python3 +, python3Packages +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, sysctl +, buildLlvmTools +, debugVersion ? false +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +, enablePFM ? stdenv.isLinux /* PFM only supports Linux */ + # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 + # broken for the armv7l builder + && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + # Note that we _explicitly_ ask for a python interpreter for our host + # platform here; the splicing that would ordinarily take care of this for + # us does not seem to work once we use `withPackages`. + let + checkDeps = ps: with ps; [ psutil ]; + in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps + else python3; + +in + +stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake ninja python ] + ++ optionals enableManpages [ + # Note: we intentionally use `python3Packages` instead of `python3.pkgs`; + # splicing does *not* work with the latter. (TODO: fix) + python3Packages.sphinx python3Packages.recommonmark + ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ + which + ] ++ lib.optional stdenv.isDarwin sysctl; + + patches = [ + ./gnu-install-dirs.patch + + # Running the tests involves invoking binaries (like `opt`) that depend on + # the LLVM dylibs and reference them by absolute install path (i.e. their + # nix store path). + # + # Because we have not yet run the install phase (we're running these tests + # as part of `checkPhase` instead of `installCheckPhase`) these absolute + # paths do not exist yet; to work around this we point the loader (`ld` on + # unix, `dyld` on macOS) at the `lib` directory which will later become this + # package's `lib` output. + # + # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib` + # dir but: + # - this doesn't generalize well to other platforms; `lit` doesn't forward + # `DYLD_LIBRARY_PATH` (macOS): + # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26 + # - even if `lit` forwarded this env var, we actually cannot set + # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because + # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for + # "protected processes" (i.e. the python interpreter that runs `lit`): + # https://stackoverflow.com/a/35570229 + # - other LLVM subprojects deal with this issue by having their `lit` + # configuration set these env vars for us; it makes sense to do the same + # for LLVM: + # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31 + # + # !!! TODO: look into upstreaming this patch + ./llvm-lit-cfg-add-libs-to-dylib-path.patch + + # `lit` has a mode where it executes run lines as a shell script which is + # constructs; this is problematic for macOS because it means that there's + # another process in between `lit` and the binaries being tested. As noted + # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our + # tests fail with dyld errors. + # + # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when + # present in the test configuration. + # + # It's not clear to me why this isn't an issue for LLVM developers running + # on macOS (nothing about this _seems_ nix specific).. + ./lit-shell-script-runner-set-dyld-library-path.patch + ] ++ lib.optionals enablePolly [ + ./gnu-install-dirs-polly.patch + + # Just like the `llvm-lit-cfg` patch, but for `polly`. + ./polly-lit-cfg-add-libs-to-dylib-path.patch + ]; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + + # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick + # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7 + rm test/MC/ELF/cfi-version.ll + + # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`) + # and thus fails under the sandbox: + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }" + + # This test tries to call the intrinsics `@llvm.roundeven.f32` and + # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf` + # and `roundeven` on macOS. + # + # However these functions are glibc specific so the test fails: + # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html + # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html + # + substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \ + --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \ + --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" "" + '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) '' + # This test fails on darwin x86_64 because `sw_vers` reports a different + # macOS version than what LLVM finds by reading + # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into + # the sandbox on macOS). + # + # The `sw_vers` provided by nixpkgs reports the macOS version associated + # with the `CoreFoundation` framework with which it was built. Because + # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what + # `sw_vers` reports is not guaranteed to match the macOS version of the host + # that's building this derivation. + # + # Astute readers will note that we only _patch_ this test on aarch64-darwin + # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright. + # So why does this test pass on aarch64? + # + # Well, it seems that `sw_vers` on aarch64 actually links against the _host_ + # CoreFoundation framework instead of the nixpkgs provided one. + # + # Not entirely sure what the right fix is here. I'm assuming aarch64 + # `sw_vers` doesn't intentionally link against the host `CoreFoundation` + # (still digging into how this ends up happening, will follow up) but that + # aside I think the more pertinent question is: should we be patching LLVM's + # macOS version detection logic to use `sw_vers` instead of reading host + # paths? This *is* a way in which details about builder machines can creep + # into the artifacts that are produced, affecting reproducibility, but it's + # not clear to me when/where/for what this even gets used in LLVM. + # + # TODO(@rrbutani): fix/follow-up + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion" + + # This test fails with a `dysmutil` crash; have not yet dug into what's + # going on here (TODO(@rrbutani)). + rm test/tools/dsymutil/ARM/obfuscated.test + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + + # Fails in the presence of anti-virus software or other intrusion-detection software that + # modifies the atime when run. See #284056. + rm test/tools/llvm-objcopy/ELF/strip-preserve-atime.test + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + rm test/CodeGen/RISCV/attributes.ll + rm test/CodeGen/RISCV/xtheadmempair.ll + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar" + ) + ''; + + # Defensive check: some paths (that we make symlinks to) depend on the release + # version, for example: + # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185 + # + # So we want to sure that the version in the source matches the release + # version we were given. + # + # We do this check here, in the LLVM build, because it happens early. + postConfigure = let + v = lib.versions; + major = v.major release_version; + minor = v.minor release_version; + patch = v.patch release_version; + in '' + # $1: part, $2: expected + check_version() { + part="''${1^^}" + part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)" + + if [[ "$part" != "$2" ]]; then + echo >&2 \ + "mismatch in the $1 version! we have version ${release_version}" \ + "and expected the $1 version to be '$2'; the source has '$part' instead" + exit 3 + fi + } + + check_version major ${major} + check_version minor ${minor} + check_version patch ${patch} + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals enableGoldPlugin [ + # For LLVMgold plugin + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + propagatedBuildInputs = []; + + ninjaFlags = [ "docs-llvm-man" ]; + installTargets = [ "install-docs-llvm-man" ]; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..b01363e --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,19 @@ +This is the one remaining Polly install dirs related change that hasn't made it +into upstream yet; previously this patch file also included: +https://reviews.llvm.org/D117541 + +diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake +index 518a09b45a42..bd9d6f5542ad 100644 +--- a/tools/polly/cmake/polly_macros.cmake ++++ b/tools/polly/cmake/polly_macros.cmake +@@ -44,8 +44,8 @@ macro(add_polly_library name) + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly") + install(TARGETS ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + endmacro(add_polly_library) diff --git a/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..e2122eb --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/gnu-install-dirs.patch @@ -0,0 +1,137 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 471817d68286..c51463304159 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1010,7 +1010,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") + add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) + install(TARGETS tf_xla_runtime EXPORT LLVMExports +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime) + # Once we add more modules, we should handle this more automatically. + if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 230620c37027..dd16cab1835e 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -876,8 +876,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -2069,7 +2069,7 @@ function(llvm_install_library_symlink name dest type) + set(LLVM_LINK_OR_COPY copy) + endif() + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir "${CMAKE_INSTALL_BINDIR}") + endif() +@@ -2344,16 +2344,37 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) + # $ORIGIN is not interpreted at link time by aix ld. + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}") ++ # Note that we add `extra_libdir` (aka `LLVM_LIBRARY_DIR` in our case) back ++ # to `_install_rpath` here. ++ # ++ # In nixpkgs we do not build and install LLVM alongside rdeps of LLVM (i.e. ++ # clang); instead LLVM is its own package and thus lands at its own nix ++ # store path. This makes it so that the default relative rpath (`../lib/`) ++ # does not point at the LLVM shared objects. ++ # ++ # More discussion here: ++ # - https://github.com/NixOS/nixpkgs/pull/235624#discussion_r1220150329 ++ # - https://reviews.llvm.org/D146918 (16.0.5+) ++ # ++ # Note that we leave `extra_libdir` in `_build_rpath`: without FHS there is ++ # no potential that this will result in us pulling in the "wrong" LLVM. ++ # Adding this to the build rpath means we aren't forced to use ++ # `installCheckPhase` instead of `checkPhase` (i.e. binaries in the build ++ # dir, pre-install, will have the right rpath for LLVM). ++ # ++ # As noted in the differential above, an alternative solution is to have ++ # all rdeps of nixpkgs' LLVM (that use the AddLLVM.cmake machinery) set ++ # `CMAKE_INSTALL_RPATH`. ++ set(_build_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index d99af79aa38e..21e794224b99 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -127,7 +127,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index 370005cd8d7d..7e790bc52111 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,7 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" + #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index e86eb2b44b10..f63e207e792e 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -366,7 +366,11 @@ int main(int argc, char **argv) { + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } + { + SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR); + sys::fs::make_absolute(ActivePrefix, Path); diff --git a/pkgs/by-name/ll/llvm/17/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/by-name/ll/llvm/17/llvm/lit-shell-script-runner-set-dyld-library-path.patch new file mode 100644 index 0000000..82b7b21 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/lit-shell-script-runner-set-dyld-library-path.patch @@ -0,0 +1,17 @@ +diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py +index 0242e0b75af3..d732011306f7 100644 +--- a/utils/lit/lit/TestRunner.py ++++ b/utils/lit/lit/TestRunner.py +@@ -1029,6 +1029,12 @@ def executeScript(test, litConfig, tmpBase, commands, cwd): + f.write('@echo off\n') + f.write('\n@if %ERRORLEVEL% NEQ 0 EXIT\n'.join(commands)) + else: ++ # This env var is *purged* when invoking subprocesses so we have to ++ # manually set it from within the bash script in order for the commands ++ # in run lines to see this var: ++ if "DYLD_LIBRARY_PATH" in test.config.environment: ++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n') ++ + for i, ln in enumerate(commands): + match = re.match(kPdbgRegex, ln) + if match: diff --git a/pkgs/by-name/ll/llvm/17/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/17/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..d4ccb2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,80 @@ +diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py +index 81e8dc04acea..479ff95681e2 100644 +--- a/test/Unit/lit.cfg.py ++++ b/test/Unit/lit.cfg.py +@@ -3,6 +3,7 @@ + # Configuration file for the 'lit' test runner. + + import os ++import platform + import subprocess + + import lit.formats +@@ -55,3 +56,26 @@ if sys.platform in ["win32", "cygwin"] and os.path.isdir(config.shlibdir): + # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. + if sys.platform == "win32" and "SYSTEMDRIVE" in os.environ: + config.environment["SYSTEMDRIVE"] = os.environ["SYSTEMDRIVE"] ++ ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = os.path.pathsep.join( ++ (config.shlibdir, ++ config.environment.get(shlibpath_var, ''))) ++ config.environment[shlibpath_var] = shlibpath ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 75a38b4c5dad..856fc75c9d74 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -42,6 +42,26 @@ llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True) + llvm_config.with_system_environment( + ["HOME", "INCLUDE", "LIB", "TMP", "TEMP"]) + ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = config.llvm_shlib_dir ++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True) ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) + + # Set up OCAMLPATH to include newly built OCaml libraries. + top_ocaml_lib = os.path.join(config.llvm_lib_dir, "ocaml") +@@ -318,7 +338,7 @@ def have_cxx_shared_library(): + + try: + readobj_cmd = subprocess.Popen( +- [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE ++ [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE, env=config.environment + ) + except OSError: + print("could not exec llvm-readobj") + diff --git a/pkgs/by-name/ll/llvm/17/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/17/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..1354ad2 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,24 @@ +diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg +index 41e3a589c61e..09f3b17498b0 100644 +--- a/tools/polly/test/lit.cfg ++++ b/tools/polly/test/lit.cfg +@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']] + path = os.path.pathsep.join(base_paths + config.extra_paths) + config.environment['PATH'] = path + ++# (Copied from polly/test/Unit/lit.cfg) ++if platform.system() == 'Darwin': ++ shlibpath_var = 'DYLD_LIBRARY_PATH' ++elif platform.system() == 'Windows': ++ shlibpath_var = 'PATH' ++else: ++ shlibpath_var = 'LD_LIBRARY_PATH' ++ + path = os.path.pathsep.join((config.llvm_libs_dir, +- config.environment.get('LD_LIBRARY_PATH',''))) +-config.environment['LD_LIBRARY_PATH'] = path ++ config.environment.get(shlibpath_var,''))) ++config.environment[shlibpath_var] = path + + llvm_config.use_default_substitutions() + diff --git a/pkgs/by-name/ll/llvm/17/openmp/fix-find-tool.patch b/pkgs/by-name/ll/llvm/17/openmp/fix-find-tool.patch new file mode 100644 index 0000000..b7f5119 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/openmp/fix-find-tool.patch @@ -0,0 +1,17 @@ +diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt +index 630947abec7e..9f032dc7bd3f 100644 +--- a/libomptarget/DeviceRTL/CMakeLists.txt ++++ b/libomptarget/DeviceRTL/CMakeLists.txt +@@ -27,10 +27,10 @@ endif() + if (LLVM_DIR) + # Builds that use pre-installed LLVM have LLVM_DIR set. + # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route +- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR}) + find_program(PACKAGER_TOOL clang-offload-packager PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) + find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR}) + if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL) OR (NOT PACKAGER_TOOL)) + libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL}, opt: ${OPT_TOOL}, or clang-offload-packager: ${PACKAGER_TOOL}") + return() diff --git a/pkgs/by-name/ll/llvm/17/openmp/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/17/openmp/gnu-install-dirs.patch new file mode 100644 index 0000000..77a9320 --- /dev/null +++ b/pkgs/by-name/ll/llvm/17/openmp/gnu-install-dirs.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b6ddbe90516d..311ab1d50e7f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -29,7 +29,7 @@ if (OPENMP_STANDALONE_BUILD) + set(OPENMP_LIBDIR_SUFFIX "" CACHE STRING + "Suffix of lib installation directory, e.g. 64 => lib64") + # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR. +- set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}") + + # Group test settings. + set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING +@@ -40,7 +40,7 @@ if (OPENMP_STANDALONE_BUILD) + else() + set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) + # If building in tree, we honor the same install suffix LLVM uses. +- set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") ++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}") + + if (NOT MSVC) + set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) diff --git a/pkgs/by-name/ll/llvm/17/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/17/openmp/run-lit-directly.patch new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/ll/llvm/18/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/18/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..9517df9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/clang/gnu-install-dirs.patch @@ -0,0 +1,71 @@ +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 75b0080f6715..c895b884cd27 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index f2b0c5cddcbb..52f37fc368ce 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -473,6 +473,7 @@ add_header_target("windows-resource-headers" ${windows_only_files}) + add_header_target("utility-resource-headers" ${utility_files}) + + get_clang_resource_dir(header_install_dir SUBDIR include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include) + + ############################################################# + # Install rules for the catch-all clang-resource-headers target +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 4f23065a2472..6a0f55991e24 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt +index 3aca22c0b0a8..3115353e3fe3 100644 +--- a/tools/scan-build-py/CMakeLists.txt ++++ b/tools/scan-build-py/CMakeLists.txt +@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib}) + install(FILES lib/libscanbuild/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild" + COMPONENT scan-build-py) + endforeach() + +@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource}) + install(FILES lib/libscanbuild/resources/${resource} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources" + COMPONENT scan-build-py) + endforeach() + +@@ -122,7 +122,7 @@ foreach(lib ${LibEar}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib}) + install(FILES lib/libear/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear" + COMPONENT scan-build-py) + endforeach() + diff --git a/pkgs/by-name/ll/llvm/18/clang/purity.patch b/pkgs/by-name/ll/llvm/18/clang/purity.patch new file mode 100644 index 0000000..5ce14a3 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/clang/purity.patch @@ -0,0 +1,25 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -446,9 +446,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + ToolChain.isPIEDefault(Args)); + if (IsPIE) + CmdArgs.push_back("-pie"); +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); + } + } + +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/18/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/18/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..07013e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -348,4 +348,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -723,6 +723,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/18/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/18/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/18/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/18/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..2b25fd4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake +index 4c85551d7766..297d7a47c54b 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -328,8 +328,9 @@ macro(load_llvm_config) + endif() + endif() + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + + set(LLVM_MAIN_SRC_DIR "${LLVM_MAIN_SRC_DIR_DEFAULT}" CACHE PATH "Path to LLVM source tree") + message(STATUS "LLVM_MAIN_SRC_DIR: \"${LLVM_MAIN_SRC_DIR}\"") diff --git a/pkgs/by-name/ll/llvm/18/default.nix b/pkgs/by-name/ll/llvm/18/default.nix new file mode 100644 index 0000000..4d2b160 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/default.nix @@ -0,0 +1,367 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake, ninja +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM verion's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? { version = "18.1.3"; sha256 = "sha256-saQGbpYd95JuudwLcdG80GL8YhadH7TUY1FC0o0ithY="; } + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + + inherit (releaseInfo) release_version version; + + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + major = lib.versions.major release_version; + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${major}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-at-least-16-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + lldb-manpages = lowPrio (tools.lldb.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ]; + inherit llvm_meta; + }; + + mlir = callPackage ../common/mlir { + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + src = callPackage ({ runCommand }: runCommand "lldb-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/lldb "$out" + '') { }; + patches = + [ + # FIXME: do we need this? ./procfs.patch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = + [ + "-nostartfiles" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRtWithLibc = wrapCCWith (rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + } // lib.optionalAttrs stdenv.targetPlatform.isWasm { + nixSupport.cc-cflags = [ "-fno-exceptions" ]; + }); + + # Has to be in tools despite mostly being a library, + # because we use a native helper executable from a + # non-cross build in cross builds. + libclc = callPackage ../common/libclc.nix { + inherit buildLlvmTools; + }; + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic) + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid || stdenv.hostPlatform.isDarwin + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + # `libcxx` requires a fairly modern C++ compiler, + # so: we use the clang from this LLVM package set instead of the regular + # stdenv's compiler. + libcxx = callPackage ../common/libcxx { + patches = lib.optionals (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [ + # https://github.com/llvm/llvm-project/issues/64226 + ./libcxx/0001-darwin-10.12-mbstate_t-fix.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/fix-find-tool.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/18/libcxx/0001-darwin-10.12-mbstate_t-fix.patch b/pkgs/by-name/ll/llvm/18/libcxx/0001-darwin-10.12-mbstate_t-fix.patch new file mode 100644 index 0000000..29942f8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/libcxx/0001-darwin-10.12-mbstate_t-fix.patch @@ -0,0 +1,31 @@ +From 9c1cb26c1dd3f92d1c1177e548107d2cd3c5e616 Mon Sep 17 00:00:00 2001 +From: annalee <150648636+a-n-n-a-l-e-e@users.noreply.github.com> +Date: Fri, 23 Feb 2024 22:58:58 +0000 +Subject: [PATCH] darwin 10.12 mbstate_t fix + +https://github.com/llvm/llvm-project/issues/64226 + +removes space from +https://github.com/macports/macports-ports/raw/acd8acb171f1658596ed1cf25da48d5b932e2d19/lang/llvm-17/files/0042-mbstate_t-not-defined.patch +so it applies cleanly +--- + libcxx/include/__mbstate_t.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/libcxx/include/__mbstate_t.h b/libcxx/include/__mbstate_t.h +index bfa6d61..5f51112 100644 +--- a/libcxx/include/__mbstate_t.h ++++ b/libcxx/include/__mbstate_t.h +@@ -42,6 +42,9 @@ + #elif __has_include() + # include // works on most Unixes + #elif __has_include() ++# if __has_include() ++# include ++# endif + # include // works on Darwin + #elif !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) && __has_include_next() + # include_next // fall back to the C standard provider of mbstate_t +-- +2.43.0 + diff --git a/pkgs/by-name/ll/llvm/18/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/18/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..6c73a24 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/lld/gnu-install-dirs.patch @@ -0,0 +1,15 @@ +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index d3924f7243d4..42a7cd62281c 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) diff --git a/pkgs/by-name/ll/llvm/18/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/18/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/18/lldb/procfs.patch b/pkgs/by-name/ll/llvm/18/lldb/procfs.patch new file mode 100644 index 0000000..7b200e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/lldb/procfs.patch @@ -0,0 +1,46 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -10,6 +10,13 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include ++ ++// on i686 preprocessor symbols with these register names are defined as ++// numeric constants; these symbols clash with identifier names used in ++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h` ++#undef FS ++#undef CS + + #include "lldb/lldb-types.h" + +@@ -17,23 +24,13 @@ + + #include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif + + namespace lldb_private { + namespace process_linux { diff --git a/pkgs/by-name/ll/llvm/18/llvm/default.nix b/pkgs/by-name/ll/llvm/18/llvm/default.nix new file mode 100644 index 0000000..a973276 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/default.nix @@ -0,0 +1,439 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, cmake +, darwin +, ninja +, python3 +, python3Packages +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, sysctl +, buildLlvmTools +, debugVersion ? false +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +, enablePFM ? stdenv.isLinux /* PFM only supports Linux */ + # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 + # broken for the armv7l builder + && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + # Note that we _explicitly_ ask for a python interpreter for our host + # platform here; the splicing that would ordinarily take care of this for + # us does not seem to work once we use `withPackages`. + let + checkDeps = ps: with ps; [ psutil ]; + in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps + else python3; + +in + +stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake ninja python ] + ++ optionals enableManpages [ + # Note: we intentionally use `python3Packages` instead of `python3.pkgs`; + # splicing does *not* work with the latter. (TODO: fix) + python3Packages.sphinx + ] ++ optionals (lib.versionOlder version "18" && enableManpages) [ + python3Packages.recommonmark + ] ++ optionals (lib.versionAtLeast version "18" && enableManpages) [ + python3Packages.myst-parser + ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ + which + ] ++ lib.optional stdenv.isDarwin sysctl; + + patches = [ + ./gnu-install-dirs.patch + + # Running the tests involves invoking binaries (like `opt`) that depend on + # the LLVM dylibs and reference them by absolute install path (i.e. their + # nix store path). + # + # Because we have not yet run the install phase (we're running these tests + # as part of `checkPhase` instead of `installCheckPhase`) these absolute + # paths do not exist yet; to work around this we point the loader (`ld` on + # unix, `dyld` on macOS) at the `lib` directory which will later become this + # package's `lib` output. + # + # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib` + # dir but: + # - this doesn't generalize well to other platforms; `lit` doesn't forward + # `DYLD_LIBRARY_PATH` (macOS): + # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26 + # - even if `lit` forwarded this env var, we actually cannot set + # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because + # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for + # "protected processes" (i.e. the python interpreter that runs `lit`): + # https://stackoverflow.com/a/35570229 + # - other LLVM subprojects deal with this issue by having their `lit` + # configuration set these env vars for us; it makes sense to do the same + # for LLVM: + # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31 + # + # !!! TODO: look into upstreaming this patch + ./llvm-lit-cfg-add-libs-to-dylib-path.patch + + # `lit` has a mode where it executes run lines as a shell script which is + # constructs; this is problematic for macOS because it means that there's + # another process in between `lit` and the binaries being tested. As noted + # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our + # tests fail with dyld errors. + # + # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when + # present in the test configuration. + # + # It's not clear to me why this isn't an issue for LLVM developers running + # on macOS (nothing about this _seems_ nix specific).. + ./lit-shell-script-runner-set-dyld-library-path.patch + ] ++ lib.optionals enablePolly [ + ./gnu-install-dirs-polly.patch + + # Just like the `llvm-lit-cfg` patch, but for `polly`. + ./polly-lit-cfg-add-libs-to-dylib-path.patch + ]; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + + # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick + # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7 + rm test/MC/ELF/cfi-version.ll + + # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`) + # and thus fails under the sandbox: + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }" + + # This test tries to call the intrinsics `@llvm.roundeven.f32` and + # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf` + # and `roundeven` on macOS. + # + # However these functions are glibc specific so the test fails: + # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html + # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html + # + substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \ + --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \ + --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" "" + + # fails when run in sandbox + substituteInPlace unittests/Support/VirtualFileSystemTest.cpp \ + --replace "PhysicalFileSystemWorkingDirFailure" "DISABLED_PhysicalFileSystemWorkingDirFailure" + '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) '' + # This test fails on darwin x86_64 because `sw_vers` reports a different + # macOS version than what LLVM finds by reading + # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into + # the sandbox on macOS). + # + # The `sw_vers` provided by nixpkgs reports the macOS version associated + # with the `CoreFoundation` framework with which it was built. Because + # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what + # `sw_vers` reports is not guaranteed to match the macOS version of the host + # that's building this derivation. + # + # Astute readers will note that we only _patch_ this test on aarch64-darwin + # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright. + # So why does this test pass on aarch64? + # + # Well, it seems that `sw_vers` on aarch64 actually links against the _host_ + # CoreFoundation framework instead of the nixpkgs provided one. + # + # Not entirely sure what the right fix is here. I'm assuming aarch64 + # `sw_vers` doesn't intentionally link against the host `CoreFoundation` + # (still digging into how this ends up happening, will follow up) but that + # aside I think the more pertinent question is: should we be patching LLVM's + # macOS version detection logic to use `sw_vers` instead of reading host + # paths? This *is* a way in which details about builder machines can creep + # into the artifacts that are produced, affecting reproducibility, but it's + # not clear to me when/where/for what this even gets used in LLVM. + # + # TODO(@rrbutani): fix/follow-up + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion" + + # This test fails with a `dysmutil` crash; have not yet dug into what's + # going on here (TODO(@rrbutani)). + rm test/tools/dsymutil/ARM/obfuscated.test + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + + # Fails in the presence of anti-virus software or other intrusion-detection software that + # modifies the atime when run. See #284056. + rm test/tools/llvm-objcopy/ELF/strip-preserve-atime.test + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + rm test/CodeGen/RISCV/attributes.ll + rm test/CodeGen/RISCV/xtheadmempair.ll + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar" + ) + ''; + + # Defensive check: some paths (that we make symlinks to) depend on the release + # version, for example: + # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185 + # + # So we want to sure that the version in the source matches the release + # version we were given. + # + # We do this check here, in the LLVM build, because it happens early. + postConfigure = let + v = lib.versions; + major = v.major release_version; + minor = v.minor release_version; + patch = v.patch release_version; + in '' + # $1: part, $2: expected + check_version() { + part="''${1^^}" + part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)" + + if [[ "$part" != "$2" ]]; then + echo >&2 \ + "mismatch in the $1 version! we have version ${release_version}" \ + "and expected the $1 version to be '$2'; the source has '$part' instead" + exit 3 + fi + } + + check_version major ${major} + check_version minor ${minor} + check_version patch ${patch} + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals enableGoldPlugin [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + propagatedBuildInputs = []; + + ninjaFlags = [ "docs-llvm-man" ]; + installTargets = [ "install-docs-llvm-man" ]; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..6a359bd --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,13 @@ +--- a/tools/polly/cmake/polly_macros.cmake 2024-03-15 17:36:20.550893344 -0700 ++++ b/tools/polly/cmake/polly_macros.cmake 2024-03-15 17:37:06.277332960 -0700 +@@ -45,8 +45,8 @@ + install(TARGETS ${name} + COMPONENT ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + add_llvm_install_targets(install-${name} + COMPONENT ${name}) + endif() diff --git a/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..8b89839 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/gnu-install-dirs.patch @@ -0,0 +1,137 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 471817d68286..c51463304159 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1010,7 +1010,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") + add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) + install(TARGETS tf_xla_runtime EXPORT LLVMExports +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime) + # Once we add more modules, we should handle this more automatically. + if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 230620c37027..dd16cab1835e 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -876,8 +876,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -2069,7 +2069,7 @@ function(llvm_install_library_symlink name dest type) + set(LLVM_LINK_OR_COPY copy) + endif() + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir "${CMAKE_INSTALL_BINDIR}") + endif() +@@ -2344,16 +2344,37 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath ${extra_libdir}) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) + # $ORIGIN is not interpreted at link time by aix ld. + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}") ++ # Note that we add `extra_libdir` (aka `LLVM_LIBRARY_DIR` in our case) back ++ # to `_install_rpath` here. ++ # ++ # In nixpkgs we do not build and install LLVM alongside rdeps of LLVM (i.e. ++ # clang); instead LLVM is its own package and thus lands at its own nix ++ # store path. This makes it so that the default relative rpath (`../lib/`) ++ # does not point at the LLVM shared objects. ++ # ++ # More discussion here: ++ # - https://github.com/NixOS/nixpkgs/pull/235624#discussion_r1220150329 ++ # - https://reviews.llvm.org/D146918 (16.0.5+) ++ # ++ # Note that we leave `extra_libdir` in `_build_rpath`: without FHS there is ++ # no potential that this will result in us pulling in the "wrong" LLVM. ++ # Adding this to the build rpath means we aren't forced to use ++ # `installCheckPhase` instead of `checkPhase` (i.e. binaries in the build ++ # dir, pre-install, will have the right rpath for LLVM). ++ # ++ # As noted in the differential above, an alternative solution is to have ++ # all rdeps of nixpkgs' LLVM (that use the AddLLVM.cmake machinery) set ++ # `CMAKE_INSTALL_RPATH`. ++ set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath ${LLVM_LIBRARY_DIR}) + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath ${LLVM_LIBRARY_DIR}) + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index d99af79aa38e..21e794224b99 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -127,7 +127,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index 370005cd8d7d..7e790bc52111 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,7 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" + #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index e86eb2b44b10..f63e207e792e 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -366,7 +366,11 @@ int main(int argc, char **argv) { + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } + { + SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR); + sys::fs::make_absolute(ActivePrefix, Path); diff --git a/pkgs/by-name/ll/llvm/18/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/by-name/ll/llvm/18/llvm/lit-shell-script-runner-set-dyld-library-path.patch new file mode 100644 index 0000000..e4f049f --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/lit-shell-script-runner-set-dyld-library-path.patch @@ -0,0 +1,12 @@ +--- a/utils/lit/lit/TestRunner.py 2024-03-15 17:27:53.170780798 -0700 ++++ b/utils/lit/lit/TestRunner.py 2024-03-15 17:28:43.277447791 -0700 +@@ -1183,6 +1183,9 @@ + f.write("@echo on\n") + f.write("\n@if %ERRORLEVEL% NEQ 0 EXIT\n".join(commands)) + else: ++ if "DYLD_LIBRARY_PATH" in test.config.environment: ++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n') ++ + for i, ln in enumerate(commands): + match = re.fullmatch(kPdbgRegex, ln) + if match: diff --git a/pkgs/by-name/ll/llvm/18/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/18/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..d4ccb2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,80 @@ +diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py +index 81e8dc04acea..479ff95681e2 100644 +--- a/test/Unit/lit.cfg.py ++++ b/test/Unit/lit.cfg.py +@@ -3,6 +3,7 @@ + # Configuration file for the 'lit' test runner. + + import os ++import platform + import subprocess + + import lit.formats +@@ -55,3 +56,26 @@ if sys.platform in ["win32", "cygwin"] and os.path.isdir(config.shlibdir): + # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. + if sys.platform == "win32" and "SYSTEMDRIVE" in os.environ: + config.environment["SYSTEMDRIVE"] = os.environ["SYSTEMDRIVE"] ++ ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = os.path.pathsep.join( ++ (config.shlibdir, ++ config.environment.get(shlibpath_var, ''))) ++ config.environment[shlibpath_var] = shlibpath ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 75a38b4c5dad..856fc75c9d74 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -42,6 +42,26 @@ llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True) + llvm_config.with_system_environment( + ["HOME", "INCLUDE", "LIB", "TMP", "TEMP"]) + ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = config.llvm_shlib_dir ++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True) ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) + + # Set up OCAMLPATH to include newly built OCaml libraries. + top_ocaml_lib = os.path.join(config.llvm_lib_dir, "ocaml") +@@ -318,7 +338,7 @@ def have_cxx_shared_library(): + + try: + readobj_cmd = subprocess.Popen( +- [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE ++ [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE, env=config.environment + ) + except OSError: + print("could not exec llvm-readobj") + diff --git a/pkgs/by-name/ll/llvm/18/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/18/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..1354ad2 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,24 @@ +diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg +index 41e3a589c61e..09f3b17498b0 100644 +--- a/tools/polly/test/lit.cfg ++++ b/tools/polly/test/lit.cfg +@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']] + path = os.path.pathsep.join(base_paths + config.extra_paths) + config.environment['PATH'] = path + ++# (Copied from polly/test/Unit/lit.cfg) ++if platform.system() == 'Darwin': ++ shlibpath_var = 'DYLD_LIBRARY_PATH' ++elif platform.system() == 'Windows': ++ shlibpath_var = 'PATH' ++else: ++ shlibpath_var = 'LD_LIBRARY_PATH' ++ + path = os.path.pathsep.join((config.llvm_libs_dir, +- config.environment.get('LD_LIBRARY_PATH',''))) +-config.environment['LD_LIBRARY_PATH'] = path ++ config.environment.get(shlibpath_var,''))) ++config.environment[shlibpath_var] = path + + llvm_config.use_default_substitutions() + diff --git a/pkgs/by-name/ll/llvm/18/openmp/fix-find-tool.patch b/pkgs/by-name/ll/llvm/18/openmp/fix-find-tool.patch new file mode 100644 index 0000000..b7f5119 --- /dev/null +++ b/pkgs/by-name/ll/llvm/18/openmp/fix-find-tool.patch @@ -0,0 +1,17 @@ +diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt +index 630947abec7e..9f032dc7bd3f 100644 +--- a/libomptarget/DeviceRTL/CMakeLists.txt ++++ b/libomptarget/DeviceRTL/CMakeLists.txt +@@ -27,10 +27,10 @@ endif() + if (LLVM_DIR) + # Builds that use pre-installed LLVM have LLVM_DIR set. + # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route +- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR}) + find_program(PACKAGER_TOOL clang-offload-packager PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) + find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR}) + if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL) OR (NOT PACKAGER_TOOL)) + libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL}, opt: ${OPT_TOOL}, or clang-offload-packager: ${PACKAGER_TOOL}") + return() diff --git a/pkgs/by-name/ll/llvm/18/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/18/openmp/run-lit-directly.patch new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/ll/llvm/README.md b/pkgs/by-name/ll/llvm/README.md new file mode 100644 index 0000000..af5530f --- /dev/null +++ b/pkgs/by-name/ll/llvm/README.md @@ -0,0 +1,79 @@ +## How to upgrade llvm_git + +- Run `update-git.py`. + This will set the github revision and sha256 for `llvmPackages_git.llvm` to whatever the latest chromium build is using. + For a more recent, commit run `nix-prefetch-github` and change the rev and sha256 accordingly. + +- That was the easy part. + The hard part is updating the patch files. + + The general process is: + + 1. Try to build `llvmPackages_git.llvm` and associated packages such as + `clang` and `compiler-rt`. You can use the `-L` and `--keep-failed` flags to make + debugging patch errors easy, e.g., `nix build .#llvmPackages_git.clang -L --keep-failed` + + 2. The build will error out with something similar to this: + ```sh + ... + clang-unstable> patching sources + clang-unstable> applying patch /nix/store/nndv6gq6w608n197fndvv5my4a5zg2qi-purity.patch + clang-unstable> patching file lib/Driver/ToolChains/Gnu.cpp + clang-unstable> Hunk #1 FAILED at 487. + clang-unstable> 1 out of 1 hunk FAILED -- saving rejects to file lib/Driver/ToolChains/Gnu.cpp.rej + note: keeping build directory '/tmp/nix-build-clang-unstable-2022-25-07.drv-17' + error: builder for '/nix/store/zwi123kpkyz52fy7p6v23azixd807r8c-clang-unstable-2022-25-07.drv' failed with exit code 1; + last 8 log lines: + > unpacking sources + > unpacking source archive /nix/store/mrxadx11wv1ckjr2208qgxp472pmmg6g-clang-src-unstable-2022-25-07 + > source root is clang-src-unstable-2022-25-07/clang + > patching sources + > applying patch /nix/store/nndv6gq6w608n197fndvv5my4a5zg2qi-purity.patch + > patching file lib/Driver/ToolChains/Gnu.cpp + > Hunk #1 FAILED at 487. + > 1 out of 1 hunk FAILED -- saving rejects to file lib/Driver/ToolChains/Gnu.cpp.rej + For full logs, run 'nix log /nix/store/zwi123kpkyz52fy7p6v23azixd807r8c-clang-unstable-2022-25-07.drv'. + note: keeping build directory '/tmp/nix-build-compiler-rt-libc-unstable-2022-25-07.drv-20' + error: 1 dependencies of derivation '/nix/store/ndbbh3wrl0l39b22azf46f1n7zlqwmag-clang-wrapper-unstable-2022-25-07.drv' failed to build + ``` + + Notice the `Hunk #1 Failed at 487` line. + The lines above show us that the `purity.patch` failed on `lib/Driver/ToolChains/Gnu.cpp` when compiling `clang`. + + 3. The task now is to cross reference the hunks in the purity patch with + `lib/Driver/ToolCahins/Gnu.cpp.orig` to see why the patch failed. + The `.orig` file will be in the build directory referenced in the line `note: keeping build directory ...`; + this message results from the `--keep-failed` flag. + + 4. Now you should be able to open whichever patch failed, and the `foo.orig` file that it failed on. + Correct the patch by adapting it to the new code and be mindful of whitespace; + which can be an easily missed reason for failures. + For cases where the hunk is no longer needed you can simply remove it from the patch. + + This is fine for small corrections, but when more serious changes are needed its better to use git. + + 1. Clone the LLVM monorepo at https://github.com/llvm/llvm-project/ + + 2. Check out the revision we were using before. + + 3. Use `patch -p1 < path/to-path` in the project subdirectories to apply the patches and commit. + + 4. Use `git rebase HEAD^ --onto ` to rebase the patches onto the new revision we are trying to build, and fix all conflicts. + + 5. Use `git diff HEAD^: HEAD:` to get subdir diff to write back to Nixpkgs. + +## Information on our current patch sets + +### "GNU Install Dirs" patches + +Use CMake's [`GNUInstallDirs`](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html) to support multiple outputs. + +Previously, LLVM Just hard-coded `bin`, `include`, and `lib${LLVM_TARGET_PREFIX}`. +We are making it use these variables. + +For the older LLVM versions, these patches live in https://github.com/Ericson2314/llvm-project branches `split-prefix`. +Instead of applying the patches to the worktree per the above instructions, one can checkout those directly and rebase those instead. + +For newer LLVM versions, enough has has been upstreamed, +(see https://reviews.llvm.org/differential/query/5UAfpj_9zHwY/ for my progress upstreaming), +that I have just assembled new gnu-install-dirs patches from the remaining unmerged patches instead of rebasing from the prior LLVM's gnu install dirs patch. diff --git a/pkgs/by-name/ll/llvm/common/bintools.nix b/pkgs/by-name/ll/llvm/common/bintools.nix new file mode 100644 index 0000000..85b570d --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/bintools.nix @@ -0,0 +1,49 @@ +{ lib, runCommand, stdenv, llvm, lld, version, release_version }: + +let + targetPrefix = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) "${stdenv.targetPlatform.config}-"; +in +runCommand "llvm-binutils-${version}" +{ + preferLocalBuild = true; + passthru = { + isLLVM = true; + inherit targetPrefix; + }; +} + ('' + mkdir -p $out/bin + for prog in ${lld}/bin/*; do + ln -s $prog $out/bin/${targetPrefix}$(basename $prog) + done + for prog in ${llvm}/bin/*; do + ln -sf $prog $out/bin/${targetPrefix}$(basename $prog) + done + + llvmBin="${llvm}/bin" + + ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}ar + ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}dlltool + ln -s $llvmBin/llvm-ar $out/bin/${targetPrefix}ranlib + ln -s $llvmBin/llvm-cxxfilt $out/bin/${targetPrefix}c++filt + ln -s $llvmBin/llvm-dwp $out/bin/${targetPrefix}dwp + ln -s $llvmBin/llvm-nm $out/bin/${targetPrefix}nm + ln -s $llvmBin/llvm-objcopy $out/bin/${targetPrefix}objcopy + ln -s $llvmBin/llvm-objcopy $out/bin/${targetPrefix}strip + ln -s $llvmBin/llvm-objdump $out/bin/${targetPrefix}objdump + ln -s $llvmBin/llvm-readobj $out/bin/${targetPrefix}readelf + ln -s $llvmBin/llvm-size $out/bin/${targetPrefix}size + ln -s $llvmBin/llvm-strings $out/bin/${targetPrefix}strings + ln -s $llvmBin/llvm-symbolizer $out/bin/${targetPrefix}addr2line + + if [ -e "$llvmBin/llvm-debuginfod" ]; then + ln -s $llvmBin/llvm-debuginfod $out/bin/${targetPrefix}debuginfod + ln -s $llvmBin/llvm-debuginfod-find $out/bin/${targetPrefix}debuginfod-find + fi + + ln -s ${lld}/bin/lld $out/bin/${targetPrefix}ld + + # Only >=13 show GNU windres compatible in help + '' + lib.optionalString (lib.versionAtLeast release_version "13") '' + ln -s $llvmBin/llvm-rc $out/bin/${targetPrefix}windres + '') diff --git a/pkgs/by-name/ll/llvm/common/clang/add-nostdlibinc-flag.patch b/pkgs/by-name/ll/llvm/common/clang/add-nostdlibinc-flag.patch new file mode 100644 index 0000000..80c2eb3 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/clang/add-nostdlibinc-flag.patch @@ -0,0 +1,18 @@ +diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp +index 3f29afd35971..223d2769cdfc 100644 +--- a/lib/Driver/Driver.cpp ++++ b/lib/Driver/Driver.cpp +@@ -491,6 +491,13 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { + } + #endif + ++ { ++ Arg *A = DAL->MakeFlagArg(/*BaseArg=*/nullptr, ++ Opts.getOption(options::OPT_nostdlibinc)); ++ A->claim(); ++ DAL->append(A); ++ } ++ + return DAL; + } + diff --git a/pkgs/by-name/ll/llvm/common/clang/clang-11-15-LLVMgold-path.patch b/pkgs/by-name/ll/llvm/common/clang/clang-11-15-LLVMgold-path.patch new file mode 100644 index 0000000..8f89919 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/clang/clang-11-15-LLVMgold-path.patch @@ -0,0 +1,13 @@ +diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp +index 6b6e276b8ce7..7896542a1202 100644 +--- a/lib/Driver/ToolChains/CommonArgs.cpp ++++ b/lib/Driver/ToolChains/CommonArgs.cpp +@@ -409,7 +409,7 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, + + SmallString<1024> Plugin; + llvm::sys::path::native( +- Twine(D.Dir) + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold" + Suffix, ++ Twine("@libllvmLibdir@" "/LLVMgold") + Suffix, + Plugin); + CmdArgs.push_back(Args.MakeArgString(Plugin)); + } diff --git a/pkgs/by-name/ll/llvm/common/clang/clang-6-10-LLVMgold-path.patch b/pkgs/by-name/ll/llvm/common/clang/clang-6-10-LLVMgold-path.patch new file mode 100644 index 0000000..9350431 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/clang/clang-6-10-LLVMgold-path.patch @@ -0,0 +1,15 @@ +diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp +index 37ec73468570..b73e75aa6e59 100644 +--- a/lib/Driver/ToolChains/CommonArgs.cpp ++++ b/lib/Driver/ToolChains/CommonArgs.cpp +@@ -370,8 +370,8 @@ void tools::AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, + #endif + + SmallString<1024> Plugin; +- llvm::sys::path::native(Twine(ToolChain.getDriver().Dir) + +- "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold" + ++ llvm::sys::path::native(Twine("@libllvmLibdir@" ++ "/LLVMgold") + + Suffix, + Plugin); + CmdArgs.push_back(Args.MakeArgString(Plugin)); diff --git a/pkgs/by-name/ll/llvm/common/clang/clang-at-least-16-LLVMgold-path.patch b/pkgs/by-name/ll/llvm/common/clang/clang-at-least-16-LLVMgold-path.patch new file mode 100644 index 0000000..74cdbac --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/clang/clang-at-least-16-LLVMgold-path.patch @@ -0,0 +1,14 @@ +diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp +index 34640b3c450d..93c4a4f4ec5c 100644 +--- a/lib/Driver/ToolChains/CommonArgs.cpp ++++ b/lib/Driver/ToolChains/CommonArgs.cpp +@@ -589,8 +589,7 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, + #endif + + SmallString<1024> Plugin; +- llvm::sys::path::native(Twine(D.Dir) + +- "/../" CLANG_INSTALL_LIBDIR_BASENAME + ++ llvm::sys::path::native(Twine("@libllvmLibdir@") + + PluginName + Suffix, + Plugin); + CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin)); diff --git a/pkgs/by-name/ll/llvm/common/clang/default.nix b/pkgs/by-name/ll/llvm/common/clang/default.nix new file mode 100644 index 0000000..2373795 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/clang/default.nix @@ -0,0 +1,201 @@ +{ lib +, stdenv +, llvm_meta +, patches ? [] +, src ? null +, monorepoSrc ? null +, runCommand +, substituteAll +, cmake +, ninja +, libxml2 +, libllvm +, release_version +, version +, python3 +, buildLlvmTools +, fixDarwinDylibNames +, enableManpages ? false +, clang-tools-extra_src ? null +}: + +let + pname = "clang"; + + src' = if monorepoSrc != null then + runCommand "${pname}-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/clang-tools-extra "$out" + '' else src; + + self = stdenv.mkDerivation (finalAttrs: rec { + inherit pname version patches; + + src = src'; + + sourceRoot = if lib.versionOlder release_version "13" then null + else "${src.name}/${pname}"; + + nativeBuildInputs = [ cmake ] + ++ (lib.optional (lib.versionAtLeast release_version "15") ninja) + ++ [ python3 ] + ++ lib.optional (lib.versionAtLeast version "18" && enableManpages) python3.pkgs.myst-parser + ++ lib.optional enableManpages python3.pkgs.sphinx + ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames; + + buildInputs = [ libxml2 libllvm ]; + + cmakeFlags = (lib.optionals (lib.versionAtLeast release_version "15") [ + "-DCLANG_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/clang" + ]) ++ [ + "-DCLANGD_BUILD_XPC=OFF" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ lib.optionals (lib.versionAtLeast release_version "17") [ + "-DLLVM_INCLUDE_TESTS=OFF" + ] ++ lib.optionals enableManpages [ + "-DCLANG_INCLUDE_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) ([ + "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen" + "-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen" + ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + # Added in LLVM15: + # `clang-tidy-confusable-chars-gen`: https://github.com/llvm/llvm-project/commit/c3574ef739fbfcc59d405985a3a4fa6f4619ecdb + # `clang-pseudo-gen`: https://github.com/llvm/llvm-project/commit/cd2292ef824591cc34cc299910a3098545c840c7 + "-DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${buildLlvmTools.libclang.dev}/bin/clang-tidy-confusable-chars-gen" + "-DCLANG_PSEUDO_GEN=${buildLlvmTools.libclang.dev}/bin/clang-pseudo-gen" + ]); + + postPatch = (if lib.versionOlder release_version "13" then '' + sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \ + -e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \ + lib/Driver/ToolChains/*.cpp + '' else '' + (cd tools && ln -s ../../clang-tools-extra extra) + '') + lib.optionalString stdenv.hostPlatform.isMusl '' + sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp + ''; + + outputs = [ "out" "lib" "dev" "python" ]; + + postInstall = '' + ln -sv $out/bin/clang $out/bin/cpp + '' + (lib.optionalString (lib.versions.major release_version == "17") '' + + mkdir -p $lib/lib/clang + mv $lib/lib/17 $lib/lib/clang/17 + '') + '' + + # Move libclang to 'lib' output + moveToOutput "lib/libclang.*" "$lib" + moveToOutput "lib/libclang-cpp.*" "$lib" + '' + (if lib.versionOlder release_version "15" then '' + substituteInPlace $out/lib/cmake/clang/ClangTargets-release.cmake \ + --replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \ + --replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp." + '' else '' + substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \ + --replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \ + --replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp." + '') + '' + + '' + (if lib.versionOlder release_version "15" then '' + mkdir -p $python/bin $python/share/{clang,scan-view} + '' else '' + mkdir -p $python/bin $python/share/clang/ + '') + '' + mv $out/bin/{git-clang-format,scan-view} $python/bin + if [ -e $out/bin/set-xcode-analyzer ]; then + mv $out/bin/set-xcode-analyzer $python/bin + fi + mv $out/share/clang/*.py $python/share/clang + '' + (lib.optionalString (lib.versionOlder release_version "15") '' + mv $out/share/scan-view/*.py $python/share/scan-view + '') + '' + rm $out/bin/c-index-test + patchShebangs $python/bin + + mkdir -p $dev/bin + '' + (if lib.versionOlder release_version "15" then '' + cp bin/clang-tblgen $dev/bin + '' else '' + cp bin/{clang-tblgen,clang-tidy-confusable-chars-gen,clang-pseudo-gen} $dev/bin + ''); + + passthru = { + inherit libllvm; + isClang = true; + } // (lib.optionalAttrs (lib.versionAtLeast release_version "15") { + hardeningUnsupportedFlags = [ + "fortify3" + ]; + hardeningUnsupportedFlagsByTargetPlatform = targetPlatform: + lib.optional (!(targetPlatform.isx86_64 || targetPlatform.isAarch64)) "zerocallusedregs" + ++ (finalAttrs.passthru.hardeningUnsupportedFlags or []); + }) // (lib.optionalAttrs (lib.versionOlder release_version "15") { + hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" ]; + }); + + meta = llvm_meta // { + homepage = "https://clang.llvm.org/"; + description = "A C language family frontend for LLVM"; + longDescription = '' + The Clang project provides a language front-end and tooling + infrastructure for languages in the C language family (C, C++, Objective + C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. + It aims to deliver amazingly fast compiles, extremely useful error and + warning messages and to provide a platform for building great source + level tools. The Clang Static Analyzer and clang-tidy are tools that + automatically find bugs in your code, and are great examples of the sort + of tools that can be built using the Clang frontend as a library to + parse C/C++ code. + ''; + mainProgram = "clang"; + }; + } // lib.optionalAttrs enableManpages ({ + pname = "clang-manpages"; + + installPhase = '' + mkdir -p $out/share/man/man1 + # Manually install clang manpage + cp docs/man/*.1 $out/share/man/man1/ + ''; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man page for Clang ${version}"; + }; + } // (if lib.versionOlder release_version "15" then { + buildPhase = '' + make docs-clang-man + ''; + } else { + ninjaFlags = [ "docs-clang-man" ]; + })) // (lib.optionalAttrs (clang-tools-extra_src != null) { inherit clang-tools-extra_src; }) + // (lib.optionalAttrs (lib.versionOlder release_version "13") { + unpackPhase = '' + unpackFile $src + mv clang-* clang + sourceRoot=$PWD/clang + unpackFile ${clang-tools-extra_src} + mv clang-tools-extra-* $sourceRoot/tools/extra + substituteInPlace $sourceRoot/tools/extra/clangd/quality/CompletionModel.cmake \ + --replace ' ''${CMAKE_SOURCE_DIR}/../clang-tools-extra' ' ''${CMAKE_SOURCE_DIR}/tools/extra' + ''; + }) + // (lib.optionalAttrs (lib.versionAtLeast release_version "15") { + env = lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) { + # The following warning is triggered with (at least) gcc >= + # 12, but appears to occur only for cross compiles. + NIX_CFLAGS_COMPILE = "-Wno-maybe-uninitialized"; + }; + })); +in self diff --git a/pkgs/by-name/ll/llvm/common/common-let.nix b/pkgs/by-name/ll/llvm/common/common-let.nix new file mode 100644 index 0000000..31360f5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/common-let.nix @@ -0,0 +1,60 @@ +{ lib +, fetchFromGitHub ? null +, release_version ? null +, gitRelease ? null +, officialRelease ? null +, monorepoSrc' ? null +}: + +rec { + llvm_meta = { + license = lib.licenses.ncsa; + maintainers = lib.teams.llvm.members; + + # See llvm/cmake/config-ix.cmake. + platforms = + lib.platforms.aarch64 ++ + lib.platforms.arm ++ + lib.platforms.mips ++ + lib.platforms.power ++ + lib.platforms.s390x ++ + lib.platforms.wasi ++ + lib.platforms.x86 ++ + lib.optionals (lib.versionAtLeast release_version "7") lib.platforms.riscv ++ + lib.optionals (lib.versionAtLeast release_version "14") lib.platforms.m68k; + }; + + releaseInfo = + if gitRelease != null then rec { + original = gitRelease; + release_version = original.version; + version = gitRelease.rev-version; + } else rec { + original = officialRelease; + release_version = original.version; + version = + if original ? candidate then + "${release_version}-${original.candidate}" + else + release_version; + }; + + monorepoSrc = + if monorepoSrc' != null then + monorepoSrc' + else + let + sha256 = releaseInfo.original.sha256; + rev = + if gitRelease != null then + gitRelease.rev + else + "llvmorg-${releaseInfo.version}"; + in + fetchFromGitHub { + owner = "llvm"; + repo = "llvm-project"; + inherit rev sha256; + }; + +} diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/7-12-codesign.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/7-12-codesign.patch new file mode 100644 index 0000000..3cc12b9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/7-12-codesign.patch @@ -0,0 +1,33 @@ +From 3dec5f3475a26aeb4678627795c4b67c6b7b4785 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Tue, 19 Sep 2017 13:13:06 -0500 +Subject: [PATCH] remove codesign use on Apple, disable ios sim testing that + needs it + +--- + cmake/Modules/AddCompilerRT.cmake | 8 ------ + test/asan/CMakeLists.txt | 52 --------------------------------------- + test/tsan/CMakeLists.txt | 47 ----------------------------------- + 3 files changed, 107 deletions(-) + +diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake +index bc5fb9ff7..b64eb4246 100644 +--- a/cmake/Modules/AddCompilerRT.cmake ++++ b/cmake/Modules/AddCompilerRT.cmake +@@ -210,14 +210,6 @@ function(add_compiler_rt_runtime name type) + set_target_properties(${libname} PROPERTIES IMPORT_PREFIX "") + set_target_properties(${libname} PROPERTIES IMPORT_SUFFIX ".lib") + endif() +- if(APPLE) +- # Ad-hoc sign the dylibs +- add_custom_command(TARGET ${libname} +- POST_BUILD +- COMMAND codesign --sign - $ +- WORKING_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR} +- ) +- endif() + endif() + install(TARGETS ${libname} + ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR} +2.14.1 + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-mcr-dmb.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-mcr-dmb.patch new file mode 100644 index 0000000..acdcc9e --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-mcr-dmb.patch @@ -0,0 +1,75 @@ +From a11d1cc41c725ec6dee58f75e4a852a658dd7543 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 10 Mar 2022 19:30:00 -0800 +Subject: [PATCH] [builtins] Use mcr for dmb instruction on armv6 + +At present compiler-rt cross compiles for armv6 ( -march=armv6 ) but includes +dmb instructions which are only available in armv7+ this causes SIGILL on +clang+compiler-rt compiled components on rpi0w platforms. + +Reviewed By: MaskRay + +Differential Revision: https://reviews.llvm.org/D99282 +--- + compiler-rt/lib/builtins/arm/sync-ops.h | 8 ++++---- + compiler-rt/lib/builtins/assembly.h | 8 ++++++++ + 2 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/lib/builtins/arm/sync-ops.h b/lib/builtins/arm/sync-ops.h +index c9623249e5d20..7a26170741ad2 100644 +--- a/lib/builtins/arm/sync-ops.h ++++ b/lib/builtins/arm/sync-ops.h +@@ -19,14 +19,14 @@ + .thumb; \ + .syntax unified; \ + DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \ +- dmb; \ ++ DMB; \ + mov r12, r0; \ + LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12]; \ + op(r2, r0, r1); \ + strex r3, r2, [r12]; \ + cmp r3, #0; \ + bne LOCAL_LABEL(tryatomic_##op); \ +- dmb; \ ++ DMB; \ + bx lr + + #define SYNC_OP_8(op) \ +@@ -35,14 +35,14 @@ + .syntax unified; \ + DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \ + push {r4, r5, r6, lr}; \ +- dmb; \ ++ DMB; \ + mov r12, r0; \ + LOCAL_LABEL(tryatomic_##op) : ldrexd r0, r1, [r12]; \ + op(r4, r5, r0, r1, r2, r3); \ + strexd r6, r4, r5, [r12]; \ + cmp r6, #0; \ + bne LOCAL_LABEL(tryatomic_##op); \ +- dmb; \ ++ DMB; \ + pop { r4, r5, r6, pc } + + #define MINMAX_4(rD, rN, rM, cmp_kind) \ +diff --git a/lib/builtins/assembly.h b/lib/builtins/assembly.h +index 69a3d8620f924..06aa18162e3b4 100644 +--- a/lib/builtins/assembly.h ++++ b/lib/builtins/assembly.h +@@ -189,6 +189,14 @@ + JMP(ip) + #endif + ++#if __ARM_ARCH >= 7 ++#define DMB dmb ++#elif __ARM_ARCH >= 6 ++#define DMB mcr p15, #0, r0, c7, c10, #5 ++#else ++#error only supported on ARMv6+ ++#endif ++ + #if defined(USE_THUMB_2) + #define WIDE(op) op.w + #else + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-no-ldrexd-strexd.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-no-ldrexd-strexd.patch new file mode 100644 index 0000000..2537ae1 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-no-ldrexd-strexd.patch @@ -0,0 +1,162 @@ +From 4fe3f21bf8b20c766877d2251d61118d0ff36688 Mon Sep 17 00:00:00 2001 +From: Ben Wolsieffer +Date: Wed, 7 Dec 2022 14:56:51 -0500 +Subject: [PATCH] [compiler-rt][builtins] Do not use ldrexd or strexd on ARMv6 + +The ldrexd and strexd instructions are not available on base ARMv6, and were +only added in ARMv6K (see [1]). This patch solves this problem once and for all +using the __ARM_FEATURE_LDREX macro (see [2]) defined in the ARM C Language +Extensions (ACLE). Although this macro is technically deprecated in the ACLE, +it allows compiler-rt to reliably detect whether ldrexd and strexd are supported +without complicated conditionals to detect different ARM architecture variants. + +[1] https://developer.arm.com/documentation/dht0008/a/ch01s02s01 +[2] https://arm-software.github.io/acle/main/acle.html#ldrexstrex + +Differential Revision: https://reviews.llvm.org/D139585 +--- + compiler-rt/lib/builtins/arm/sync_fetch_and_add_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_and_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_max_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_min_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_nand_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_or_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_sub_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_umax_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_umin_8.S | 2 +- + compiler-rt/lib/builtins/arm/sync_fetch_and_xor_8.S | 2 +- + 10 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/lib/builtins/arm/sync_fetch_and_add_8.S b/lib/builtins/arm/sync_fetch_and_add_8.S +index 18bdd875b8b7..bee6f7ba0f34 100644 +--- a/lib/builtins/arm/sync_fetch_and_add_8.S ++++ b/lib/builtins/arm/sync_fetch_and_add_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define add_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + adds rD_LO, rN_LO, rM_LO ; \ + adc rD_HI, rN_HI, rM_HI +diff --git a/lib/builtins/arm/sync_fetch_and_and_8.S b/lib/builtins/arm/sync_fetch_and_and_8.S +index 3716eff809d5..b4e77a54edf6 100644 +--- a/lib/builtins/arm/sync_fetch_and_and_8.S ++++ b/lib/builtins/arm/sync_fetch_and_and_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define and_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + and rD_LO, rN_LO, rM_LO ; \ + and rD_HI, rN_HI, rM_HI +diff --git a/lib/builtins/arm/sync_fetch_and_max_8.S b/lib/builtins/arm/sync_fetch_and_max_8.S +index 06115ab55246..1813274cc649 100644 +--- a/lib/builtins/arm/sync_fetch_and_max_8.S ++++ b/lib/builtins/arm/sync_fetch_and_max_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define max_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, gt) + + SYNC_OP_8(max_8) +diff --git a/lib/builtins/arm/sync_fetch_and_min_8.S b/lib/builtins/arm/sync_fetch_and_min_8.S +index 4f3e299d95cc..fa8f3477757b 100644 +--- a/lib/builtins/arm/sync_fetch_and_min_8.S ++++ b/lib/builtins/arm/sync_fetch_and_min_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define min_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, lt) + + SYNC_OP_8(min_8) +diff --git a/lib/builtins/arm/sync_fetch_and_nand_8.S b/lib/builtins/arm/sync_fetch_and_nand_8.S +index 425c94474af7..fb27219ee200 100644 +--- a/lib/builtins/arm/sync_fetch_and_nand_8.S ++++ b/lib/builtins/arm/sync_fetch_and_nand_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define nand_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + bic rD_LO, rN_LO, rM_LO ; \ + bic rD_HI, rN_HI, rM_HI +diff --git a/lib/builtins/arm/sync_fetch_and_or_8.S b/lib/builtins/arm/sync_fetch_and_or_8.S +index 4f18dcf84df9..3b077c8737b1 100644 +--- a/lib/builtins/arm/sync_fetch_and_or_8.S ++++ b/lib/builtins/arm/sync_fetch_and_or_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define or_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + orr rD_LO, rN_LO, rM_LO ; \ + orr rD_HI, rN_HI, rM_HI +diff --git a/lib/builtins/arm/sync_fetch_and_sub_8.S b/lib/builtins/arm/sync_fetch_and_sub_8.S +index 25a4a1076555..c171607eabd8 100644 +--- a/lib/builtins/arm/sync_fetch_and_sub_8.S ++++ b/lib/builtins/arm/sync_fetch_and_sub_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define sub_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + subs rD_LO, rN_LO, rM_LO ; \ + sbc rD_HI, rN_HI, rM_HI +diff --git a/lib/builtins/arm/sync_fetch_and_umax_8.S b/lib/builtins/arm/sync_fetch_and_umax_8.S +index aa5213ff1def..d1224f758049 100644 +--- a/lib/builtins/arm/sync_fetch_and_umax_8.S ++++ b/lib/builtins/arm/sync_fetch_and_umax_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define umax_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, hi) + + SYNC_OP_8(umax_8) +diff --git a/lib/builtins/arm/sync_fetch_and_umin_8.S b/lib/builtins/arm/sync_fetch_and_umin_8.S +index 8b40541ab47d..595444e6d053 100644 +--- a/lib/builtins/arm/sync_fetch_and_umin_8.S ++++ b/lib/builtins/arm/sync_fetch_and_umin_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define umin_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, lo) + + SYNC_OP_8(umin_8) +diff --git a/lib/builtins/arm/sync_fetch_and_xor_8.S b/lib/builtins/arm/sync_fetch_and_xor_8.S +index 7436eb1d4cae..9fc3d85cef75 100644 +--- a/lib/builtins/arm/sync_fetch_and_xor_8.S ++++ b/lib/builtins/arm/sync_fetch_and_xor_8.S +@@ -13,7 +13,7 @@ + + #include "sync-ops.h" + +-#if __ARM_ARCH_PROFILE != 'M' ++#if __ARM_FEATURE_LDREX & 8 + #define xor_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ + eor rD_LO, rN_LO, rM_LO ; \ + eor rD_HI, rN_HI, rM_HI +-- +2.38.1 + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-libatomic.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-libatomic.patch new file mode 100644 index 0000000..13b67eb --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-libatomic.patch @@ -0,0 +1,65 @@ +From a56bb19a9dc303a50ef12d83cd24c2395bf81076 Mon Sep 17 00:00:00 2001 +From: Ben Wolsieffer +Date: Wed, 7 Dec 2022 21:25:46 -0500 +Subject: [PATCH] [scudo][standalone] Use CheckAtomic to decide to link to + libatomic + +Standalone scudo uses the atomic operation builtin functions, which require +linking to libatomic on some platforms. Currently, this is done in an ad-hoc +manner. MIPS platforms always link to libatomic, and the tests are always linked +to it as well. libatomic is required on base ARMv6 (but not ARMv6K), but it is +currently not linked, causing the build to fail. + +This patch replaces this ad-hoc logic with the CheckAtomic CMake module already +used in other parts of LLVM. The CheckAtomic module checks whether std::atomic +requires libatomic, which is not strictly the same as checking the atomic +builtins, but should have the same results as far as I know. If this is +problematic, a custom version of CheckAtomic could be used to specifically test +the builtins. +--- + compiler-rt/lib/scudo/standalone/CMakeLists.txt | 7 +++++++ + compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt | 4 +--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/lib/scudo/standalone/CMakeLists.txt b/lib/scudo/standalone/CMakeLists.txt +index ae5c354768c8..eb27374ca520 100644 +--- a/lib/scudo/standalone/CMakeLists.txt ++++ b/lib/scudo/standalone/CMakeLists.txt +@@ -1,5 +1,8 @@ + add_compiler_rt_component(scudo_standalone) + ++include(DetermineGCCCompatible) ++include(CheckAtomic) ++ + include_directories(../.. include) + + set(SCUDO_CFLAGS) +@@ -34,6 +37,10 @@ list(APPEND SCUDO_LINK_FLAGS -Wl,-z,defs,-z,now,-z,relro) + + list(APPEND SCUDO_LINK_FLAGS -ffunction-sections -fdata-sections -Wl,--gc-sections) + ++if(HAVE_CXX_ATOMICS_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB) ++ list(APPEND SCUDO_LINK_FLAGS -latomic) ++endif() ++ + # We don't use the C++ standard library, so avoid including it by mistake. + append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SCUDO_LINK_FLAGS) + +diff --git a/lib/scudo/standalone/tests/CMakeLists.txt b/lib/scudo/standalone/tests/CMakeLists.txt +index 6d0936cbb5c1..70a5a7e959c1 100644 +--- a/lib/scudo/standalone/tests/CMakeLists.txt ++++ b/lib/scudo/standalone/tests/CMakeLists.txt +@@ -38,9 +38,7 @@ set(LINK_FLAGS + ${SANITIZER_TEST_CXX_LIBRARIES} + ) + list(APPEND LINK_FLAGS -pthread) +-# Linking against libatomic is required with some compilers +-check_library_exists(atomic __atomic_load_8 "" COMPILER_RT_HAS_LIBATOMIC) +-if (COMPILER_RT_HAS_LIBATOMIC) ++if(HAVE_CXX_ATOMICS_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB) + list(APPEND LINK_FLAGS -latomic) + endif() + +-- +2.38.1 + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-no-yield.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-no-yield.patch new file mode 100644 index 0000000..2fd48ed --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-scudo-no-yield.patch @@ -0,0 +1,34 @@ +From ff0b373b959165477f45d9f5f9a8da471ae111ab Mon Sep 17 00:00:00 2001 +From: Ben Wolsieffer +Date: Wed, 7 Dec 2022 18:03:56 -0500 +Subject: [PATCH] [scudo][standalone] Only use yield on ARMv6K and newer + +The yield instruction is only available in ARMv6K and newer. It behaves as a +nop on single threaded platforms anyway, so use nop instead on unsupported +architectures. + +Differential Revision: https://reviews.llvm.org/D139600 +--- + compiler-rt/lib/scudo/standalone/common.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/lib/scudo/standalone/common.h b/lib/scudo/standalone/common.h +index bc3dfec6dbba..862cda1d4bc4 100644 +--- a/lib/scudo/standalone/common.h ++++ b/lib/scudo/standalone/common.h +@@ -109,7 +109,12 @@ inline void yieldProcessor(u8 Count) { + #elif defined(__aarch64__) || defined(__arm__) + __asm__ __volatile__("" ::: "memory"); + for (u8 I = 0; I < Count; I++) ++#if __ARM_ARCH >= 6 && !defined(__ARM_ARCH_6__) ++ // yield is supported on ARMv6K and newer + __asm__ __volatile__("yield"); ++#else ++ __asm__ __volatile__("nop"); ++#endif + #endif + __asm__ __volatile__("" ::: "memory"); + } +-- +2.38.1 + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-sync-ops-no-thumb.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-sync-ops-no-thumb.patch new file mode 100644 index 0000000..098a155 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv6-sync-ops-no-thumb.patch @@ -0,0 +1,52 @@ +From 5017de8ba4b1fe985169cf54590e858a9019a91f Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Fri, 11 Mar 2022 16:25:49 -0800 +Subject: [PATCH] [builtins] Do not force thumb mode directive in + arm/sync-ops.h + +.thumb_func was not switching mode until [1] +so it did not show up but now that .thumb_func (without argument) is +switching mode, its causing build failures on armv6 ( rpi0 ) even when +build is explicitly asking for this file to be built with -marm (ARM +mode), therefore use DEFINE_COMPILERRT_FUNCTION macro to add function +header which considers arch and mode from compiler cmdline to decide if +the function is built using thumb mode or arm mode. + +[1] https://reviews.llvm.org/D101975 + +Note that it also needs https://reviews.llvm.org/D99282 + +Reviewed By: peter.smith, MaskRay + +Differential Revision: https://reviews.llvm.org/D104183 +--- + compiler-rt/lib/builtins/arm/sync-ops.h | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/lib/builtins/arm/sync-ops.h b/lib/builtins/arm/sync-ops.h +index 7a26170741ad2..d914f9d3a1093 100644 +--- a/lib/builtins/arm/sync-ops.h ++++ b/lib/builtins/arm/sync-ops.h +@@ -16,9 +16,8 @@ + + #define SYNC_OP_4(op) \ + .p2align 2; \ +- .thumb; \ + .syntax unified; \ +- DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \ ++ DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_##op) \ + DMB; \ + mov r12, r0; \ + LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12]; \ +@@ -31,9 +30,8 @@ + + #define SYNC_OP_8(op) \ + .p2align 2; \ +- .thumb; \ + .syntax unified; \ +- DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op) \ ++ DEFINE_COMPILERRT_FUNCTION(__sync_fetch_and_##op) \ + push {r4, r5, r6, lr}; \ + DMB; \ + mov r12, r0; \ + diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/armv7l-15.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/armv7l-15.patch new file mode 100644 index 0000000..ca1c233 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/armv7l-15.patch @@ -0,0 +1,32 @@ +diff -ur a/cmake/builtin-config-ix.cmake b/cmake/builtin-config-ix.cmake +--- a/cmake/builtin-config-ix.cmake @llvm 15.0.6 ++++ b/cmake/builtin-config-ix.cmake +@@ -46,7 +46,7 @@ + + set(ARM64 aarch64) +-set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main) ++set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv7l armv8m.main armv8.1m.main) + set(AVR avr) + set(HEXAGON hexagon) + set(X86 i386) + set(X86_64 x86_64) +diff -ur a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +--- a/lib/builtins/CMakeLists.txt @llvm 15.0.6 ++++ b/lib/builtins/CMakeLists.txt +@@ -565,6 +565,7 @@ + set(armv7_SOURCES ${arm_SOURCES}) + set(armv7s_SOURCES ${arm_SOURCES}) + set(armv7k_SOURCES ${arm_SOURCES}) ++set(armv7l_SOURCES ${arm_SOURCES}) + set(arm64_SOURCES ${aarch64_SOURCES}) + + # macho_embedded archs +@@ -734,7 +735,7 @@ + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported +- if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$") ++ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7l|armv7m|armv7em|armv8m.main|armv8.1m.main)$") + string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}") + check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP) + if(NOT COMPILER_RT_HAS_${arch}_VFP) diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/darwin-plistbuddy-workaround.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/darwin-plistbuddy-workaround.patch new file mode 100644 index 0000000..dae8b3a --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/darwin-plistbuddy-workaround.patch @@ -0,0 +1,25 @@ +CMake tries to read a list field from SDKSettings.plist, but the output of +xcbuild PlistBuddy is incompatible with Apple's. (Plus we don't want it in our +dependencies.) + +Simply assume ARM64 is supported by the SDK. We already limit the actual archs +we build for by setting DARWIN_osx_BUILTIN_ARCHS explicitely. + +--- a/cmake/builtin-config-ix.cmake ++++ b/cmake/builtin-config-ix.cmake +@@ -97,14 +97,7 @@ if(APPLE) + set(DARWIN_osx_BUILTIN_MIN_VER 10.5) + set(DARWIN_osx_BUILTIN_MIN_VER_FLAG + -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER}) +- set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) +- # Add support for arm64 macOS if available in SDK. +- foreach(arch ${ARM64}) +- sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT) +- if (MACOS_ARM_SUPPORT) +- list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch}) +- endif() +- endforeach(arch) ++ set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64} ${ARM64}) + + if(COMPILER_RT_ENABLE_IOS) + list(APPEND DARWIN_EMBEDDED_PLATFORMS ios) diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/default.nix b/pkgs/by-name/ll/llvm/common/compiler-rt/default.nix new file mode 100644 index 0000000..4f44d63 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/default.nix @@ -0,0 +1,173 @@ +{ lib +, stdenv +, llvm_meta +, release_version +, version +, patches ? [] +, src ? null +, monorepoSrc ? null +, runCommand +, cmake +, ninja +, python3 +, xcbuild +, libllvm +, linuxHeaders +, libxcrypt +, doFakeLibgcc ? stdenv.hostPlatform.isFreeBSD +}: + +let + + useLLVM = stdenv.hostPlatform.useLLVM or false; + bareMetal = stdenv.hostPlatform.parsed.kernel.name == "none"; + haveLibc = stdenv.cc.libc != null; + isDarwinStatic = stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic && lib.versionAtLeast release_version "16"; + inherit (stdenv.hostPlatform) isMusl isAarch64; + + baseName = "compiler-rt"; + pname = baseName + lib.optionalString (haveLibc) "-libc"; + + src' = if monorepoSrc != null then + runCommand "${baseName}-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${baseName} "$out" + '' else src; + + preConfigure = lib.optionalString (useLLVM && !haveLibc) '' + cmakeFlagsArray+=(-DCMAKE_C_FLAGS="-nodefaultlibs -ffreestanding") + ''; +in + +stdenv.mkDerivation ({ + inherit pname version patches; + + src = src'; + sourceRoot = if lib.versionOlder release_version "13" then null + else "${src'.name}/${baseName}"; + + nativeBuildInputs = [ cmake ] + ++ (lib.optional (lib.versionAtLeast release_version "15") ninja) + ++ [ python3 libllvm.dev ] + ++ lib.optional stdenv.isDarwin xcbuild.xcrun; + buildInputs = + lib.optional (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isRiscV) linuxHeaders; + + env.NIX_CFLAGS_COMPILE = toString ([ + "-DSCUDO_DEFAULT_OPTIONS=DeleteSizeMismatch=0:DeallocationTypeMismatch=0" + ] ++ lib.optionals (!haveLibc) [ + # The compiler got stricter about this, and there is a usellvm patch below + # which patches out the assert include causing an implicit definition of + # assert. It would be nicer to understand why compiler-rt thinks it should + # be able to #include in the first place; perhaps it's in the + # wrong, or perhaps there is a way to provide an assert.h. + "-Wno-error=implicit-function-declaration" + ]); + + cmakeFlags = [ + "-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON" + "-DCMAKE_C_COMPILER_TARGET=${stdenv.hostPlatform.config}" + "-DCMAKE_ASM_COMPILER_TARGET=${stdenv.hostPlatform.config}" + ] ++ lib.optionals (haveLibc && stdenv.hostPlatform.libc == "glibc") [ + "-DSANITIZER_COMMON_CFLAGS=-I${libxcrypt}/include" + ] ++ lib.optionals ((useLLVM || bareMetal || isMusl || isAarch64) && (lib.versions.major release_version == "13")) [ + "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF" + ] ++ lib.optionals (useLLVM || bareMetal || isMusl || isDarwinStatic) [ + "-DCOMPILER_RT_BUILD_SANITIZERS=OFF" + "-DCOMPILER_RT_BUILD_XRAY=OFF" + "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF" + "-DCOMPILER_RT_BUILD_MEMPROF=OFF" + "-DCOMPILER_RT_BUILD_ORC=OFF" # may be possible to build with musl if necessary + ] ++ lib.optionals (useLLVM || bareMetal) [ + "-DCOMPILER_RT_BUILD_PROFILE=OFF" + ] ++ lib.optionals ((useLLVM && !haveLibc) || bareMetal || isDarwinStatic) [ + "-DCMAKE_CXX_COMPILER_WORKS=ON" + ] ++ lib.optionals ((useLLVM && !haveLibc) || bareMetal) [ + "-DCMAKE_C_COMPILER_WORKS=ON" + "-DCOMPILER_RT_BAREMETAL_BUILD=ON" + "-DCMAKE_SIZEOF_VOID_P=${toString (stdenv.hostPlatform.parsed.cpu.bits / 8)}" + ] ++ lib.optionals (useLLVM && !haveLibc) [ + "-DCMAKE_C_FLAGS=-nodefaultlibs" + ] ++ lib.optionals (useLLVM) [ + "-DCOMPILER_RT_BUILD_BUILTINS=ON" + #https://stackoverflow.com/questions/53633705/cmake-the-c-compiler-is-not-able-to-compile-a-simple-test-program + "-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY" + ] ++ lib.optionals (bareMetal) [ + "-DCOMPILER_RT_OS_DIR=baremetal" + ] ++ lib.optionals (stdenv.hostPlatform.isDarwin) (lib.optionals (lib.versionAtLeast release_version "16") [ + "-DCMAKE_LIPO=${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}lipo" + ] ++ [ + "-DDARWIN_macosx_OVERRIDE_SDK_VERSION=ON" + "-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.darwinArch}" + "-DDARWIN_osx_BUILTIN_ARCHS=${stdenv.hostPlatform.darwinArch}" + ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + # `COMPILER_RT_DEFAULT_TARGET_ONLY` does not apply to Darwin: + # https://github.com/llvm/llvm-project/blob/27ef42bec80b6c010b7b3729ed0528619521a690/compiler-rt/cmake/base-config-ix.cmake#L153 + "-DCOMPILER_RT_ENABLE_IOS=OFF" + ]) ++ lib.optionals (lib.versionAtLeast version "19" && stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [ + "-DSANITIZER_MIN_OSX_VERSION=10.10" + ]; + + outputs = [ "out" "dev" ]; + + # TSAN requires XPC on Darwin, which we have no public/free source files for. We can depend on the Apple frameworks + # to get it, but they're unfree. Since LLVM is rather central to the stdenv, we patch out TSAN support so that Hydra + # can build this. If we didn't do it, basically the entire nixpkgs on Darwin would have an unfree dependency and we'd + # get no binary cache for the entire platform. If you really find yourself wanting the TSAN, make this controllable by + # a flag and turn the flag off during the stdenv build. + postPatch = lib.optionalString (!stdenv.isDarwin) '' + substituteInPlace cmake/builtin-config-ix.cmake \ + --replace 'set(X86 i386)' 'set(X86 i386 i486 i586 i686)' + '' + lib.optionalString stdenv.isDarwin '' + substituteInPlace cmake/config-ix.cmake \ + --replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)' + '' + lib.optionalString (useLLVM && !haveLibc) ((lib.optionalString (lib.versionAtLeast release_version "18") '' + substituteInPlace lib/builtins/aarch64/sme-libc-routines.c \ + --replace "" "" + '') + '' + substituteInPlace lib/builtins/int_util.c \ + --replace "#include " "" + substituteInPlace lib/builtins/clear_cache.c \ + --replace "#include " "" + substituteInPlace lib/builtins/cpu_model${lib.optionalString (lib.versionAtLeast version "18") "/x86"}.c \ + --replace "#include " "" + ''); + + # Hack around weird upsream RPATH bug + postInstall = lib.optionalString (stdenv.hostPlatform.isDarwin) '' + ln -s "$out/lib"/*/* "$out/lib" + '' + lib.optionalString (useLLVM && stdenv.hostPlatform.isLinux) '' + ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbegin.o + ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtend.o + # Note the history of crt{begin,end}S in previous versions of llvm in nixpkg: + # The presence of crtbegin_shared has been added and removed; it's possible + # people have added/removed it to get it working on their platforms. + # Try each in turn for now. + ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbeginS.o + ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtendS.o + ln -s $out/lib/*/clang_rt.crtbegin_shared-*.o $out/lib/crtbeginS.o + ln -s $out/lib/*/clang_rt.crtend_shared-*.o $out/lib/crtendS.o + '' + lib.optionalString doFakeLibgcc '' + ln -s $out/lib/freebsd/libclang_rt.builtins-*.a $out/lib/libgcc.a + ''; + + meta = llvm_meta // { + homepage = "https://compiler-rt.llvm.org/"; + description = "Compiler runtime libraries"; + longDescription = '' + The compiler-rt project provides highly tuned implementations of the + low-level code generator support routines like "__fixunsdfdi" and other + calls generated when a target doesn't have a short sequence of native + instructions to implement a core IR operation. It also provides + implementations of run-time libraries for dynamic testing tools such as + AddressSanitizer, ThreadSanitizer, MemorySanitizer, and DataFlowSanitizer. + ''; + # "All of the code in the compiler-rt project is dual licensed under the MIT + # license and the UIUC License (a BSD-like license)": + license = with lib.licenses; [ mit ncsa ]; + # compiler-rt requires a Clang stdenv on 32-bit RISC-V: + # https://reviews.llvm.org/D43106#1019077 + broken = stdenv.hostPlatform.isRiscV32 && !stdenv.cc.isClang; + }; +} // (if lib.versionOlder release_version "16" then { inherit preConfigure; } else {})) diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/glibc.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/glibc.patch new file mode 100644 index 0000000..2d21179 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/glibc.patch @@ -0,0 +1,48 @@ +diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +index 54da635..c5dc1cd 100644 +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -1158,8 +1158,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid); + CHECK_SIZE_AND_OFFSET(ipc_perm, gid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cuid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cgid); +-#if !defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21) +-/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */ ++#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31) ++/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit ++ on many architectures. */ + CHECK_SIZE_AND_OFFSET(ipc_perm, mode); + #endif + +diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h +index f89a113..f6f986f 100644 +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -213,26 +213,13 @@ namespace __sanitizer { + u64 __unused1; + u64 __unused2; + #elif defined(__sparc__) +-#if defined(__arch64__) + unsigned mode; +- unsigned short __pad1; +-#else +- unsigned short __pad1; +- unsigned short mode; + unsigned short __pad2; +-#endif + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; +-#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__) +- unsigned int mode; +- unsigned short __seq; +- unsigned short __pad1; +- unsigned long __unused1; +- unsigned long __unused2; + #else +- unsigned short mode; +- unsigned short __pad1; ++ unsigned int mode; + unsigned short __seq; + unsigned short __pad2; + #if defined(__x86_64__) && !defined(_LP64) diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-11.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-11.patch new file mode 100644 index 0000000..890230c --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-11.patch @@ -0,0 +1,80 @@ +https://github.com/llvm/llvm-project/commit/68d5235cb58f988c71b403334cd9482d663841ab.patch +https://reviews.llvm.org/D102059 +--- a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc ++++ b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +@@ -370,15 +370,6 @@ static void ioctl_table_fill() { + + #if SANITIZER_GLIBC + // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE +- _(CYGETDEFTHRESH, WRITE, sizeof(int)); +- _(CYGETDEFTIMEOUT, WRITE, sizeof(int)); +- _(CYGETMON, WRITE, struct_cyclades_monitor_sz); +- _(CYGETTHRESH, WRITE, sizeof(int)); +- _(CYGETTIMEOUT, WRITE, sizeof(int)); +- _(CYSETDEFTHRESH, NONE, 0); +- _(CYSETDEFTIMEOUT, NONE, 0); +- _(CYSETTHRESH, NONE, 0); +- _(CYSETTIMEOUT, NONE, 0); + _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz); + _(EQL_ENSLAVE, WRITE, struct_ifreq_sz); + _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp +@@ -143,7 +143,6 @@ typedef struct user_fpregs elf_fpregset_t; + # include + #endif + #include +-#include + #include + #include + #include +@@ -460,7 +459,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + + #if SANITIZER_GLIBC + unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); +- unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); + #if EV_VERSION > (0x010000) + unsigned struct_input_keymap_entry_sz = sizeof(struct input_keymap_entry); + #else +@@ -824,15 +822,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + #endif // SANITIZER_LINUX + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +- unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; +- unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; +- unsigned IOCTL_CYGETMON = CYGETMON; +- unsigned IOCTL_CYGETTHRESH = CYGETTHRESH; +- unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT; +- unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH; +- unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT; +- unsigned IOCTL_CYSETTHRESH = CYSETTHRESH; +- unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT; + unsigned IOCTL_EQL_EMANCIPATE = EQL_EMANCIPATE; + unsigned IOCTL_EQL_ENSLAVE = EQL_ENSLAVE; + unsigned IOCTL_EQL_GETMASTRCFG = EQL_GETMASTRCFG; +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -983,7 +983,6 @@ extern unsigned struct_vt_mode_sz; + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + extern unsigned struct_ax25_parms_struct_sz; +-extern unsigned struct_cyclades_monitor_sz; + extern unsigned struct_input_keymap_entry_sz; + extern unsigned struct_ipx_config_data_sz; + extern unsigned struct_kbdiacrs_sz; +@@ -1328,15 +1327,6 @@ extern unsigned IOCTL_VT_WAITACTIVE; + #endif // SANITIZER_LINUX + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +-extern unsigned IOCTL_CYGETDEFTHRESH; +-extern unsigned IOCTL_CYGETDEFTIMEOUT; +-extern unsigned IOCTL_CYGETMON; +-extern unsigned IOCTL_CYGETTHRESH; +-extern unsigned IOCTL_CYGETTIMEOUT; +-extern unsigned IOCTL_CYSETDEFTHRESH; +-extern unsigned IOCTL_CYSETDEFTIMEOUT; +-extern unsigned IOCTL_CYSETTHRESH; +-extern unsigned IOCTL_CYSETTIMEOUT; + extern unsigned IOCTL_EQL_EMANCIPATE; + extern unsigned IOCTL_EQL_ENSLAVE; + extern unsigned IOCTL_EQL_GETMASTRCFG; diff --git a/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-9.patch b/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-9.patch new file mode 100644 index 0000000..7ef02a1 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/compiler-rt/libsanitizer-no-cyclades-9.patch @@ -0,0 +1,80 @@ +https://github.com/llvm/llvm-project/commit/68d5235cb58f988c71b403334cd9482d663841ab.patch +https://reviews.llvm.org/D102059 +--- a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc ++++ b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +@@ -370,15 +370,6 @@ static void ioctl_table_fill() { + + #if SANITIZER_GLIBC + // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE +- _(CYGETDEFTHRESH, WRITE, sizeof(int)); +- _(CYGETDEFTIMEOUT, WRITE, sizeof(int)); +- _(CYGETMON, WRITE, struct_cyclades_monitor_sz); +- _(CYGETTHRESH, WRITE, sizeof(int)); +- _(CYGETTIMEOUT, WRITE, sizeof(int)); +- _(CYSETDEFTHRESH, NONE, 0); +- _(CYSETDEFTIMEOUT, NONE, 0); +- _(CYSETTHRESH, NONE, 0); +- _(CYSETTIMEOUT, NONE, 0); + _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz); + _(EQL_ENSLAVE, WRITE, struct_ifreq_sz); + _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -143,7 +143,6 @@ typedef struct user_fpregs elf_fpregset_t; + # include + #endif + #include +-#include + #include + #include + #include +@@ -460,7 +459,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + + #if SANITIZER_GLIBC + unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); +- unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); + #if EV_VERSION > (0x010000) + unsigned struct_input_keymap_entry_sz = sizeof(struct input_keymap_entry); + #else +@@ -824,15 +822,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); + #endif // SANITIZER_LINUX + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +- unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; +- unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; +- unsigned IOCTL_CYGETMON = CYGETMON; +- unsigned IOCTL_CYGETTHRESH = CYGETTHRESH; +- unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT; +- unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH; +- unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT; +- unsigned IOCTL_CYSETTHRESH = CYSETTHRESH; +- unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT; + unsigned IOCTL_EQL_EMANCIPATE = EQL_EMANCIPATE; + unsigned IOCTL_EQL_ENSLAVE = EQL_ENSLAVE; + unsigned IOCTL_EQL_GETMASTRCFG = EQL_GETMASTRCFG; +--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -983,7 +983,6 @@ extern unsigned struct_vt_mode_sz; + + #if SANITIZER_LINUX && !SANITIZER_ANDROID + extern unsigned struct_ax25_parms_struct_sz; +- extern unsigned struct_cyclades_monitor_sz; + extern unsigned struct_input_keymap_entry_sz; + extern unsigned struct_ipx_config_data_sz; + extern unsigned struct_kbdiacrs_sz; +@@ -1328,15 +1327,6 @@ extern unsigned IOCTL_VT_WAITACTIVE; + #endif // SANITIZER_LINUX + + #if SANITIZER_LINUX && !SANITIZER_ANDROID +- extern unsigned IOCTL_CYGETDEFTHRESH; +- extern unsigned IOCTL_CYGETDEFTIMEOUT; +- extern unsigned IOCTL_CYGETMON; +- extern unsigned IOCTL_CYGETTHRESH; +- extern unsigned IOCTL_CYGETTIMEOUT; +- extern unsigned IOCTL_CYSETDEFTHRESH; +- extern unsigned IOCTL_CYSETDEFTIMEOUT; +- extern unsigned IOCTL_CYSETTHRESH; +- extern unsigned IOCTL_CYSETTIMEOUT; + extern unsigned IOCTL_EQL_EMANCIPATE; + extern unsigned IOCTL_EQL_ENSLAVE; + extern unsigned IOCTL_EQL_GETMASTRCFG; diff --git a/pkgs/by-name/ll/llvm/common/libclc.nix b/pkgs/by-name/ll/llvm/common/libclc.nix new file mode 100644 index 0000000..4c2081e --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libclc.nix @@ -0,0 +1,54 @@ +{ lib, stdenv, version, runCommand, monorepoSrc, llvm, buildPackages, buildLlvmTools, ninja, cmake, python3 }: + +stdenv.mkDerivation rec { + pname = "libclc"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + ''; + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "dev" ]; + + patches = [ + ./libclc/libclc-gnu-install-dirs.patch + ]; + + # cmake expects all required binaries to be in the same place, so it will not be able to find clang without the patch + postPatch = '' + substituteInPlace CMakeLists.txt \ + --replace 'find_program( LLVM_CLANG clang PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \ + 'find_program( LLVM_CLANG clang PATHS "${buildLlvmTools.clang.cc}/bin" NO_DEFAULT_PATH )' \ + --replace 'find_program( LLVM_AS llvm-as PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \ + 'find_program( LLVM_AS llvm-as PATHS "${buildLlvmTools.llvm}/bin" NO_DEFAULT_PATH )' \ + --replace 'find_program( LLVM_LINK llvm-link PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \ + 'find_program( LLVM_LINK llvm-link PATHS "${buildLlvmTools.llvm}/bin" NO_DEFAULT_PATH )' \ + --replace 'find_program( LLVM_OPT opt PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \ + 'find_program( LLVM_OPT opt PATHS "${buildLlvmTools.llvm}/bin" NO_DEFAULT_PATH )' \ + --replace 'find_program( LLVM_SPIRV llvm-spirv PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \ + 'find_program( LLVM_SPIRV llvm-spirv PATHS "${buildPackages.spirv-llvm-translator.override { inherit (buildLlvmTools) llvm; }}/bin" NO_DEFAULT_PATH )' + '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + substituteInPlace CMakeLists.txt \ + --replace 'COMMAND prepare_builtins' 'COMMAND ${buildLlvmTools.libclc.dev}/bin/prepare_builtins' + ''; + + nativeBuildInputs = [ cmake ninja python3 ]; + buildInputs = [ llvm ]; + strictDeps = true; + + postInstall = '' + install -Dt $dev/bin prepare_builtins + ''; + + meta = with lib; { + homepage = "http://libclc.llvm.org/"; + description = "Implementation of the library requirements of the OpenCL C programming language"; + mainProgram = "prepare_builtins"; + license = licenses.mit; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/ll/llvm/common/libclc/libclc-gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/common/libclc/libclc-gnu-install-dirs.patch new file mode 100644 index 0000000..1e5108a --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libclc/libclc-gnu-install-dirs.patch @@ -0,0 +1,10 @@ +--- a/libclc.pc.in ++++ b/libclc.pc.in +@@ -1,5 +1,5 @@ +-includedir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@ +-libexecdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/clc ++includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ ++libexecdir=@CMAKE_INSTALL_FULL_DATADIR@/clc + + Name: libclc + Description: Library requirements of the OpenCL C programming language diff --git a/pkgs/by-name/ll/llvm/common/libcxx/default.nix b/pkgs/by-name/ll/llvm/common/libcxx/default.nix new file mode 100644 index 0000000..0e91f50 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libcxx/default.nix @@ -0,0 +1,157 @@ +{ lib +, stdenv +, llvm_meta +, release_version +, monorepoSrc ? null +, src ? null +, patches ? [] +, runCommand +, substitute +, cmake +, lndir +, ninja +, python3 +, fixDarwinDylibNames +, version +, cxxabi ? if stdenv.hostPlatform.isFreeBSD then libcxxrt else null +, libcxxrt +, libunwind +, enableShared ? !stdenv.hostPlatform.isStatic +}: + +# external cxxabi is not supported on Darwin as the build will not link libcxx +# properly and not re-export the cxxabi symbols into libcxx +# https://github.com/NixOS/nixpkgs/issues/166205 +# https://github.com/NixOS/nixpkgs/issues/269548 +assert cxxabi == null || !stdenv.hostPlatform.isDarwin; +let + basename = "libcxx"; + pname = basename; + cxxabiName = "lib${if cxxabi == null then "cxxabi" else cxxabi.libName}"; + runtimes = [ "libcxx" ] ++ lib.optional (cxxabi == null) "libcxxabi"; + + # Note: useLLVM is likely false for Darwin but true under pkgsLLVM + useLLVM = stdenv.hostPlatform.useLLVM or false; + + src' = if monorepoSrc != null then + runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out/llvm" + '' + (lib.optionalString (lib.versionAtLeast release_version "14") '' + cp -r ${monorepoSrc}/cmake "$out" + '') + '' + cp -r ${monorepoSrc}/libcxx "$out" + cp -r ${monorepoSrc}/llvm/cmake "$out/llvm" + cp -r ${monorepoSrc}/llvm/utils "$out/llvm" + '' + (lib.optionalString (lib.versionAtLeast release_version "14") '' + cp -r ${monorepoSrc}/third-party "$out" + '') + '' + cp -r ${monorepoSrc}/runtimes "$out" + '' + (lib.optionalString (cxxabi == null) '' + cp -r ${monorepoSrc}/libcxxabi "$out" + '')) else src; + + cxxabiCMakeFlags = lib.optionals (lib.versionAtLeast release_version "18") [ + "-DLIBCXXABI_USE_LLVM_UNWINDER=OFF" + ] ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) (if lib.versionAtLeast release_version "18" then [ + "-DLIBCXXABI_ADDITIONAL_LIBRARIES=unwind" + "-DLIBCXXABI_USE_COMPILER_RT=ON" + ] else [ + "-DLIBCXXABI_USE_COMPILER_RT=ON" + "-DLIBCXXABI_USE_LLVM_UNWINDER=ON" + ]) ++ lib.optionals stdenv.hostPlatform.isWasm [ + "-DLIBCXXABI_ENABLE_THREADS=OFF" + "-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF" + ] ++ lib.optionals (!enableShared) [ + "-DLIBCXXABI_ENABLE_SHARED=OFF" + ]; + + cxxCMakeFlags = [ + "-DLIBCXX_CXX_ABI=${cxxabiName}" + ] ++ lib.optionals (cxxabi != null) [ + "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${lib.getDev cxxabi}/include" + ] ++ lib.optionals (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) [ + "-DLIBCXX_HAS_MUSL_LIBC=1" + ] ++ lib.optionals (lib.versionAtLeast release_version "18" && !useLLVM && stdenv.hostPlatform.libc == "glibc" && !stdenv.hostPlatform.isStatic) [ + "-DLIBCXX_ADDITIONAL_LIBRARIES=gcc_s" + ] ++ lib.optionals useLLVM [ + "-DLIBCXX_USE_COMPILER_RT=ON" + ] ++ lib.optionals (useLLVM && lib.versionAtLeast release_version "16") [ + "-DLIBCXX_ADDITIONAL_LIBRARIES=unwind" + ] ++ lib.optionals stdenv.hostPlatform.isWasm [ + "-DLIBCXX_ENABLE_THREADS=OFF" + "-DLIBCXX_ENABLE_FILESYSTEM=OFF" + "-DLIBCXX_ENABLE_EXCEPTIONS=OFF" + ] ++ lib.optionals (!enableShared) [ + "-DLIBCXX_ENABLE_SHARED=OFF" + ]; + + cmakeFlags = [ + "-DLLVM_ENABLE_RUNTIMES=${lib.concatStringsSep ";" runtimes}" + ] ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [ + # libcxxabi's CMake looks as though it treats -nostdlib++ as implying -nostdlib, + # but that does not appear to be the case for example when building + # pkgsLLVM.libcxxabi (which uses clangNoCompilerRtWithLibc). + "-DCMAKE_EXE_LINKER_FLAGS=-nostdlib" + "-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib" + ] ++ lib.optionals stdenv.hostPlatform.isWasm [ + "-DCMAKE_C_COMPILER_WORKS=ON" + "-DCMAKE_CXX_COMPILER_WORKS=ON" + "-DUNIX=ON" # Required otherwise libc++ fails to detect the correct linker + ] ++ cxxCMakeFlags + ++ lib.optionals (cxxabi == null) cxxabiCMakeFlags; + +in + +stdenv.mkDerivation (rec { + inherit pname version cmakeFlags patches; + + src = src'; + + outputs = [ "out" "dev" ]; + + preConfigure = lib.optionalString stdenv.hostPlatform.isMusl '' + patchShebangs utils/cat_files.py + ''; + + nativeBuildInputs = [ cmake ninja python3 ] + ++ lib.optional stdenv.isDarwin fixDarwinDylibNames + ++ lib.optional (cxxabi != null) lndir; + + buildInputs = [ cxxabi ] + ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [ libunwind ]; + + # libc++.so is a linker script which expands to multiple libraries, + # libc++.so.1 and libc++abi.so or the external cxxabi. ld-wrapper doesn't + # support linker scripts so the external cxxabi needs to be symlinked in + postInstall = lib.optionalString (cxxabi != null) '' + lndir ${lib.getDev cxxabi}/include $dev/include/c++/v1 + lndir ${lib.getLib cxxabi}/lib $out/lib + ''; + + passthru = { + isLLVM = true; + }; + + meta = llvm_meta // { + homepage = "https://libcxx.llvm.org/"; + description = "C++ standard library"; + longDescription = '' + libc++ is an implementation of the C++ standard library, targeting C++11, + C++14 and above. + ''; + # "All of the code in libc++ is dual licensed under the MIT license and the + # UIUC License (a BSD-like license)": + license = with lib.licenses; [ mit ncsa ]; + }; +} // (if (lib.versionOlder release_version "16" || lib.versionAtLeast release_version "17") then { + postPatch = (lib.optionalString (lib.versionAtLeast release_version "14" && lib.versionOlder release_version "15") '' + # fix CMake error when static and LIBCXXABI_USE_LLVM_UNWINDER=ON. aren't + # building unwind so don't need to depend on it + substituteInPlace libcxx/src/CMakeLists.txt \ + --replace-fail "add_dependencies(cxx_static unwind)" "# add_dependencies(cxx_static unwind)" + '') + '' + cd runtimes + ''; +} else { + sourceRoot = "${src'.name}/runtimes"; +})) diff --git a/pkgs/by-name/ll/llvm/common/libcxx/libcxx-0001-musl-hacks.patch b/pkgs/by-name/ll/llvm/common/libcxx/libcxx-0001-musl-hacks.patch new file mode 100644 index 0000000..bcb5ad8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libcxx/libcxx-0001-musl-hacks.patch @@ -0,0 +1,39 @@ +From 1c936d7fda3275265e37f93697232a1ed652390f Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Sat, 9 Jul 2016 19:22:54 -0500 +Subject: [PATCH] musl fixes/hacks + +Conflicts: + + include/__config + include/locale + src/locale.cpp +--- + include/locale | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/include/locale b/include/locale +index 3d804e8..9b01f5b 100644 +--- a/include/locale ++++ b/include/locale +@@ -695,7 +695,7 @@ __num_get_signed_integral(const char* __a, const char* __a_end, + typename remove_reference::type __save_errno = errno; + errno = 0; + char *__p2; +- long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++ long long __ll = strtoll(__a, &__p2, __base); + typename remove_reference::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; +@@ -735,7 +735,7 @@ __num_get_unsigned_integral(const char* __a, const char* __a_end, + typename remove_reference::type __save_errno = errno; + errno = 0; + char *__p2; +- unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++ unsigned long long __ll = strtoull(__a, &__p2, __base); + typename remove_reference::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; +-- +1.7.1 + diff --git a/pkgs/by-name/ll/llvm/common/libcxxabi/no-threads.patch b/pkgs/by-name/ll/llvm/common/libcxxabi/no-threads.patch new file mode 100644 index 0000000..787f3e1 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libcxxabi/no-threads.patch @@ -0,0 +1,12 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4138acf..41b4763 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -362,6 +362,7 @@ if (NOT LIBCXXABI_ENABLE_THREADS) + " is also set to ON.") + endif() + add_definitions(-D_LIBCXXABI_HAS_NO_THREADS) ++ add_definitions(-D_LIBCPP_HAS_NO_THREADS) + endif() + + if (LIBCXXABI_HAS_EXTERNAL_THREAD_API) diff --git a/pkgs/by-name/ll/llvm/common/libcxxabi/wasm.patch b/pkgs/by-name/ll/llvm/common/libcxxabi/wasm.patch new file mode 100644 index 0000000..4ebfe46 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libcxxabi/wasm.patch @@ -0,0 +1,16 @@ +diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake +index 15497d405e0..33f7f18193a 100644 +--- a/cmake/modules/HandleLLVMOptions.cmake ++++ b/cmake/modules/HandleLLVMOptions.cmake +@@ -127,7 +127,10 @@ else(WIN32) + set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) + endif() + else(FUCHSIA OR UNIX) +- MESSAGE(SEND_ERROR "Unable to determine platform") ++ if(${CMAKE_SYSTEM_NAME} MATCHES "Wasi") ++ else() ++ MESSAGE(SEND_ERROR "Unable to determine platform") ++ endif() + endif(FUCHSIA OR UNIX) + endif(WIN32) + diff --git a/pkgs/by-name/ll/llvm/common/libunwind/default.nix b/pkgs/by-name/ll/llvm/common/libunwind/default.nix new file mode 100644 index 0000000..515914e --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/libunwind/default.nix @@ -0,0 +1,87 @@ +{ lib +, stdenv +, release_version +, patches ? [] +, src ? null +, llvm_meta +, version +, monorepoSrc ? null +, runCommand +, cmake +, ninja +, python3 +, libcxx +, enableShared ? !stdenv.hostPlatform.isStatic +}: +let + pname = "libunwind"; + src' = if monorepoSrc != null then + runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + mkdir -p "$out/libcxx" + cp -r ${monorepoSrc}/libcxx/cmake "$out/libcxx" + cp -r ${monorepoSrc}/libcxx/utils "$out/libcxx" + mkdir -p "$out/llvm" + cp -r ${monorepoSrc}/llvm/cmake "$out/llvm" + '' + lib.optionalString (lib.versionAtLeast release_version "15") '' + cp -r ${monorepoSrc}/llvm/utils "$out/llvm" + cp -r ${monorepoSrc}/runtimes "$out" + '') else src; + + hasPatches = builtins.length patches > 0; + + postUnpack = lib.optionalString (lib.versions.major release_version == "12") '' + ln -s ${libcxx.src}/libcxx . + ln -s ${libcxx.src}/llvm . + ''; + + prePatch = lib.optionalString (lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18")) '' + cd ../${pname} + chmod -R u+w . + ''; + + postPatch = lib.optionalString (lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18")) '' + cd ../runtimes + ''; + + postInstall = lib.optionalString (enableShared && !stdenv.hostPlatform.isDarwin) '' + # libcxxabi wants to link to libunwind_shared.so (?). + ln -s $out/lib/libunwind.so $out/lib/libunwind_shared.so + ''; +in +stdenv.mkDerivation (rec { + inherit pname version patches; + + src = src'; + + sourceRoot = + if lib.versionOlder release_version "13" then null + else if lib.versionAtLeast release_version "15" then "${src.name}/runtimes" + else "${src.name}/${pname}"; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ cmake ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + ninja python3 + ]; + + cmakeFlags = lib.optional (lib.versionAtLeast release_version "15") "-DLLVM_ENABLE_RUNTIMES=libunwind" + ++ lib.optional (!enableShared) "-DLIBUNWIND_ENABLE_SHARED=OFF"; + + meta = llvm_meta // { + # Details: https://github.com/llvm/llvm-project/blob/main/libunwind/docs/index.rst + homepage = "https://clang.llvm.org/docs/Toolchain.html#unwind-library"; + description = "LLVM's unwinder library"; + longDescription = '' + The unwind library provides a family of _Unwind_* functions implementing + the language-neutral stack unwinding portion of the Itanium C++ ABI (Level + I). It is a dependency of the C++ ABI library, and sometimes is a + dependency of other runtimes. + ''; + }; +} // (if postUnpack != "" then { inherit postUnpack; } else {}) + // (if (lib.versionAtLeast release_version "15") then { inherit postInstall; } else {}) + // (if prePatch != "" then { inherit prePatch; } else {}) + // (if postPatch != "" then { inherit postPatch; } else {})) diff --git a/pkgs/by-name/ll/llvm/common/lld/default.nix b/pkgs/by-name/ll/llvm/common/lld/default.nix new file mode 100644 index 0000000..be296be --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/lld/default.nix @@ -0,0 +1,77 @@ +{ lib +, stdenv +, llvm_meta +, release_version +, patches ? [] +, buildLlvmTools +, monorepoSrc ? null +, src ? null +, libunwind ? null +, runCommand +, cmake +, ninja +, libxml2 +, libllvm +, version +}: +let + pname = "lld"; + src' = + if monorepoSrc != null then + runCommand "lld-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + mkdir -p "$out/libunwind" + cp -r ${monorepoSrc}/libunwind/include "$out/libunwind" + mkdir -p "$out/llvm" + '' else src; + + postPatch = lib.optionalString (lib.versions.major release_version == "12") '' + substituteInPlace MachO/CMakeLists.txt --replace \ + '(''${LLVM_MAIN_SRC_DIR}/' '(' + mkdir -p libunwind/include + tar -xf "${libunwind.src}" --wildcards -C libunwind/include --strip-components=2 "libunwind-*/include/" + '' + lib.optionalString (lib.versions.major release_version == "13" && stdenv.isDarwin) '' + substituteInPlace MachO/CMakeLists.txt --replace \ + '(''${LLVM_MAIN_SRC_DIR}/' '(../' + ''; +in +stdenv.mkDerivation (rec { + inherit pname version patches; + + src = src'; + + sourceRoot = + if lib.versionOlder release_version "13" then null + else "${src.name}/${pname}"; + + nativeBuildInputs = [ cmake ] ++ lib.optional (lib.versionAtLeast release_version "15") ninja; + buildInputs = [ libllvm libxml2 ]; + + cmakeFlags = lib.optionals (lib.versionOlder release_version "14") [ + "-DLLVM_CONFIG_PATH=${libllvm.dev}/bin/llvm-config${lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) "-native"}" + ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + "-DLLD_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/lld" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ]; + + # Musl's default stack size is too small for lld to be able to link Firefox. + LDFLAGS = lib.optionalString stdenv.hostPlatform.isMusl "-Wl,-z,stack-size=2097152"; + + outputs = [ "out" "lib" "dev" ]; + + meta = llvm_meta // { + homepage = "https://lld.llvm.org/"; + description = "The LLVM linker (unwrapped)"; + longDescription = '' + LLD is a linker from the LLVM project that is a drop-in replacement for + system linkers and runs much faster than them. It also provides features + that are useful for toolchain developers. + The linker supports ELF (Unix), PE/COFF (Windows), Mach-O (macOS), and + WebAssembly in descending order of completeness. Internally, LLD consists + of several different linkers. + ''; + }; +} // (if (postPatch == "" && lib.versions.major release_version != "13") then {} else { inherit postPatch; })) diff --git a/pkgs/by-name/ll/llvm/common/lldb-plugins/llef.nix b/pkgs/by-name/ll/llvm/common/lldb-plugins/llef.nix new file mode 100644 index 0000000..f671132 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/lldb-plugins/llef.nix @@ -0,0 +1,43 @@ +{ lib +, stdenv +, fetchFromGitHub +, makeWrapper +, lldb +}: + +stdenv.mkDerivation { + pname = "llef"; + version = "unstable-2023-10-18"; + + src = fetchFromGitHub { + owner = "foundryzero"; + repo = "llef"; + rev = "629bd75f44c356f7a3576a6436d3919ce111240d"; + hash = "sha256-JtCHG89s436Di/6+V7Le4CZnkIPh/RYIllfXEO/B7+8"; + }; + + dontBuild = true; + + nativeBuildInputs = [ makeWrapper ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/llef + cp -r llef.py arch commands common handlers $out/share/llef + makeWrapper ${lib.getExe lldb} $out/bin/llef \ + --add-flags "-o 'settings set stop-disassembly-display never'" \ + --add-flags "-o \"command script import $out/share/llef/llef.py\"" + + runHook postInstall + ''; + + meta = with lib; { + description = "LLEF is a plugin for LLDB to make it more useful for RE and VR"; + homepage = "https://github.com/foundryzero/llef"; + license = licenses.mit; + platforms = platforms.all; + maintainers = with maintainers; [ nrabulinski ]; + mainProgram = "llef"; + }; +} diff --git a/pkgs/by-name/ll/llvm/common/lldb.nix b/pkgs/by-name/ll/llvm/common/lldb.nix new file mode 100644 index 0000000..59e427e --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/lldb.nix @@ -0,0 +1,218 @@ +{ lib +, stdenv +, llvm_meta +, release_version +, cmake +, zlib +, ncurses +, swig3 +, swig4 +, which +, libedit +, libxml2 +, libllvm +, libclang +, python3 +, version +, darwin +, lit +, makeWrapper +, lua5_3 +, ninja +, runCommand +, src ? null +, monorepoSrc ? null +, patches ? [ ] +, enableManpages ? false +, ... +}: + +let + src' = + if monorepoSrc != null then + runCommand "lldb-src-${version}" { } '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/lldb "$out" + '' else src; + vscodeExt = { + name = if lib.versionAtLeast release_version "18" then "lldb-dap" else "lldb-vscode"; + version = if lib.versionAtLeast release_version "18" then "0.2.0" else "0.1.0"; + }; + swig = if lib.versionAtLeast release_version "18" then swig4 else swig3; +in + +stdenv.mkDerivation (rec { + passthru.monorepoSrc = monorepoSrc; + pname = "lldb"; + inherit version; + + src = src'; + inherit patches; + + outputs = [ "out" "lib" "dev" ]; + + sourceRoot = lib.optional (lib.versionAtLeast release_version "13") "${src.name}/${pname}"; + + nativeBuildInputs = [ + cmake + python3 + which + swig + lit + makeWrapper + lua5_3 + ] ++ lib.optionals enableManpages [ + python3.pkgs.sphinx + ] ++ lib.optionals (lib.versionOlder release_version "18" && enableManpages) [ + python3.pkgs.recommonmark + ] ++ lib.optionals (lib.versionAtLeast release_version "18" && enableManpages) [ + python3.pkgs.myst-parser + ] ++ lib.optionals (lib.versionAtLeast release_version "14") [ + ninja + ]; + + buildInputs = [ + ncurses + zlib + libedit + libxml2 + libllvm + ] ++ lib.optionals (lib.versionAtLeast release_version "16") [ + # Starting with LLVM 16, the resource dir patch is no longer enough to get + # libclang into the rpath of the lldb executables. By putting it into + # buildInputs cc-wrapper will set up rpath correctly for us. + (lib.getLib libclang) + ] ++ lib.optionals stdenv.isDarwin [ + darwin.libobjc + darwin.apple_sdk.libs.xpc + darwin.apple_sdk.frameworks.Foundation + darwin.bootstrap_cmds + darwin.apple_sdk.frameworks.Carbon + darwin.apple_sdk.frameworks.Cocoa + ] + # The older libSystem used on x86_64 macOS is missing the + # `` header which `lldb` uses. + # + # We copy this header over from macOS 10.12 SDK. + # + # See here for context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional + ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionAtLeast release_version "15") + ) + ( + runCommand "bsm-audit-session-header" { } '' + install -Dm444 \ + "${lib.getDev darwin.apple_sdk.sdk}/include/bsm/audit_session.h" \ + "$out/include/bsm/audit_session.h" + '' + ); + + hardeningDisable = [ "format" ]; + + cmakeFlags = [ + "-DLLDB_INCLUDE_TESTS=${if doCheck then "YES" else "NO"}" + "-DLLVM_ENABLE_RTTI=OFF" + "-DClang_DIR=${lib.getDev libclang}/lib/cmake" + "-DLLVM_EXTERNAL_LIT=${lit}/bin/lit" + ] ++ lib.optionals stdenv.isDarwin [ + "-DLLDB_USE_SYSTEM_DEBUGSERVER=ON" + ] ++ lib.optionals (!stdenv.isDarwin) [ + "-DLLDB_CODESIGN_IDENTITY=" # codesigning makes nondeterministic + ] ++ lib.optionals (lib.versionAtLeast release_version "17") [ + "-DCLANG_RESOURCE_DIR=../../../../${libclang.lib}" + ] ++ lib.optionals enableManpages ([ + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + # docs reference `automodapi` but it's not added to the extensions list when + # only building the manpages: + # https://github.com/llvm/llvm-project/blob/af6ec9200b09039573d85e349496c4f5b17c3d7f/lldb/docs/conf.py#L54 + # + # so, we just ignore the resulting errors + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ]) ++ lib.optionals doCheck [ + "-DLLDB_TEST_C_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc" + "-DLLDB_TEST_CXX_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++" + ]; + + doCheck = false; + doInstallCheck = lib.versionOlder release_version "15"; + + # TODO: cleanup with mass-rebuild + installCheckPhase = '' + if [ ! -e $lib/${python3.sitePackages}/lldb/_lldb*.so ] ; then + echo "ERROR: python files not installed where expected!"; + return 1; + fi + '' # Something lua is built on older versions but this file doesn't exist. + + lib.optionalString (lib.versionAtLeast release_version "14") '' + if [ ! -e "$lib/lib/lua/${lua5_3.luaversion}/lldb.so" ] ; then + echo "ERROR: lua files not installed where expected!"; + return 1; + fi + ''; + + postInstall = '' + wrapProgram $out/bin/lldb --prefix PYTHONPATH : $lib/${python3.sitePackages}/ + + # Editor support + # vscode: + install -D ../tools/${vscodeExt.name}/package.json $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/package.json + mkdir -p $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/bin + ln -s $out/bin/*${if lib.versionAtLeast release_version "18" then vscodeExt.name else "-vscode"} $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/bin + ''; + + passthru.vscodeExtName = vscodeExt.name; + passthru.vscodeExtPublisher = "llvm"; + passthru.vscodeExtUniqueId = "llvm-org.${vscodeExt.name}-${vscodeExt.version}"; + + meta = llvm_meta // { + homepage = "https://lldb.llvm.org/"; + description = "A next-generation high-performance debugger"; + longDescription = '' + LLDB is a next generation, high-performance debugger. It is built as a set + of reusable components which highly leverage existing libraries in the + larger LLVM Project, such as the Clang expression parser and LLVM + disassembler. + ''; + # llvm <10 never built on aarch64-darwin since first introduction in nixpkgs + broken = + (lib.versionOlder release_version "11" && stdenv.isDarwin && stdenv.isAarch64) + || (((lib.versions.major release_version) == "13") && stdenv.isDarwin); + mainProgram = "lldb"; + }; +} // lib.optionalAttrs enableManpages { + pname = "lldb-manpages"; + + buildPhase = lib.optionalString (lib.versionOlder release_version "15") '' + make ${if (lib.versionOlder release_version "12") then "docs-man" else "docs-lldb-man"} + ''; + + + ninjaFlags = lib.optionals (lib.versionAtLeast release_version "15") [ "docs-lldb-man" ]; + + propagatedBuildInputs = [ ]; + + # manually install lldb man page + installPhase = '' + mkdir -p $out/share/man/man1 + install docs/man/lldb.1 -t $out/share/man/man1/ + ''; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLDB ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/common/lldb/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/common/lldb/gnu-install-dirs.patch new file mode 100644 index 0000000..093b9a8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/lldb/gnu-install-dirs.patch @@ -0,0 +1,49 @@ +diff --git a/bindings/lua/CMakeLists.txt b/bindings/lua/CMakeLists.txt +index 1a739a980..59f8fc3a0 100644 +--- a/bindings/lua/CMakeLists.txt ++++ b/bindings/lua/CMakeLists.txt +@@ -56,7 +56,7 @@ function(finish_swig_lua swig_target lldb_lua_bindings_dir lldb_lua_target_dir) + if(LLDB_BUILD_FRAMEWORK) + set(LLDB_LUA_INSTALL_PATH ${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Resources/Python) + else() +- set(LLDB_LUA_INSTALL_PATH ${LLDB_LUA_RELATIVE_PATH}) ++ set(LLDB_LUA_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}/../${LLDB_LUA_RELATIVE_PATH}) + endif() + install(DIRECTORY ${lldb_lua_target_dir}/ + DESTINATION ${LLDB_LUA_INSTALL_PATH} +diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt +index c631faf52ac3..1d92d069960b 100644 +--- a/bindings/python/CMakeLists.txt ++++ b/bindings/python/CMakeLists.txt +@@ -160,7 +160,7 @@ function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_tar + if(LLDB_BUILD_FRAMEWORK) + set(LLDB_PYTHON_INSTALL_PATH ${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/Python) + else() +- set(LLDB_PYTHON_INSTALL_PATH ${LLDB_PYTHON_RELATIVE_PATH}) ++ set(LLDB_PYTHON_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}/../${LLDB_PYTHON_RELATIVE_PATH}) + endif() + if (NOT CMAKE_CFG_INTDIR STREQUAL ".") + string(REPLACE ${CMAKE_CFG_INTDIR} "\$\{CMAKE_INSTALL_CONFIG_NAME\}" LLDB_PYTHON_INSTALL_PATH ${LLDB_PYTHON_INSTALL_PATH}) +diff --git a/cmake/modules/AddLLDB.cmake b/cmake/modules/AddLLDB.cmake +index 3291a7c808e1..b27d27ce6a87 100644 +--- a/cmake/modules/AddLLDB.cmake ++++ b/cmake/modules/AddLLDB.cmake +@@ -109,7 +109,7 @@ function(add_lldb_library name) + endif() + + if(PARAM_SHARED) +- set(install_dest lib${LLVM_LIBDIR_SUFFIX}) ++ set(install_dest ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(PARAM_INSTALL_PREFIX) + set(install_dest ${PARAM_INSTALL_PREFIX}) + endif() +diff --git a/tools/intel-features/CMakeLists.txt b/tools/intel-features/CMakeLists.txt +index 7d48491ec89a..c04543585588 100644 +--- a/tools/intel-features/CMakeLists.txt ++++ b/tools/intel-features/CMakeLists.txt +@@ -30,4 +30,4 @@ add_lldb_library(lldbIntelFeatures SHARED + ) + + install(TARGETS lldbIntelFeatures +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) diff --git a/pkgs/by-name/ll/llvm/common/llvm/TLI-musl.patch b/pkgs/by-name/ll/llvm/common/llvm/TLI-musl.patch new file mode 100644 index 0000000..1a69080 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/llvm/TLI-musl.patch @@ -0,0 +1,35 @@ +From 5c571082fdaf61f6df19d9b7137dc26d71334058 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Thu, 18 Feb 2016 10:33:04 +0100 +Subject: [PATCH 2/3] Fix build with musl libc + +On musl libc the fopen64 and fopen are the same thing, but for +compatibility they have a `#define fopen64 fopen`. Same applies for +fseek64, fstat64, fstatvfs64, ftello64, lstat64, stat64 and tmpfile64. +--- + include/llvm/Analysis/TargetLibraryInfo.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/include/llvm/Analysis/TargetLibraryInfo.h b/include/llvm/Analysis/TargetLibraryInfo.h +index 7becdf0..7f14427 100644 +--- a/include/llvm/Analysis/TargetLibraryInfo.h ++++ b/include/llvm/Analysis/TargetLibraryInfo.h +@@ -18,6 +18,15 @@ + #include "llvm/IR/Module.h" + #include "llvm/Pass.h" + ++#undef fopen64 ++#undef fseeko64 ++#undef fstat64 ++#undef fstatvfs64 ++#undef ftello64 ++#undef lstat64 ++#undef stat64 ++#undef tmpfile64 ++ + namespace llvm { + /// VecDesc - Describes a possible vectorization of a function. + /// Function 'VectorFnName' is equivalent to 'ScalarFnName' vectorized +-- +2.7.3 + diff --git a/pkgs/by-name/ll/llvm/common/llvm/llvm-config-link-static.patch b/pkgs/by-name/ll/llvm/common/llvm/llvm-config-link-static.patch new file mode 100644 index 0000000..3881cc5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/llvm/llvm-config-link-static.patch @@ -0,0 +1,12 @@ +diff --git llvm/tools/llvm-config/CMakeLists.txt llvm/tools/llvm-config/CMakeLists.txt +index 16ba54c0cf2f..20b017195e84 100644 +--- llvm/tools/llvm-config/CMakeLists.txt ++++ llvm/tools/llvm-config/CMakeLists.txt +@@ -6,6 +6,7 @@ set(BUILDVARIABLES_OBJPATH ${CMAKE_CURRENT_BINARY_DIR}/BuildVariables.inc) + # Add the llvm-config tool. + add_llvm_tool(llvm-config + llvm-config.cpp ++ DISABLE_LLVM_LINK_LLVM_DYLIB + ) + + # Compute the substitution values for various items. diff --git a/pkgs/by-name/ll/llvm/common/mlir/default.nix b/pkgs/by-name/ll/llvm/common/mlir/default.nix new file mode 100644 index 0000000..7a79ac3 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/mlir/default.nix @@ -0,0 +1,77 @@ +{ lib, stdenv, llvm_meta +, buildLlvmTools +, monorepoSrc, runCommand +, cmake +, ninja +, libxml2 +, libllvm +, version +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) +}: + +stdenv.mkDerivation rec { + pname = "mlir"; + inherit version doCheck; + + # Blank llvm dir just so relative path works + src = runCommand "${pname}-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/mlir "$out" + cp -r ${monorepoSrc}/third-party "$out/third-party" + + mkdir -p "$out/llvm" + ''; + + sourceRoot = "${src.name}/mlir"; + + patches = [ + ./gnu-install-dirs.patch + ]; + + nativeBuildInputs = [ + cmake + ninja + ]; + + buildInputs = [ + libllvm + libxml2 + ]; + + cmakeFlags = [ + "-DLLVM_BUILD_TOOLS=ON" + # Install headers as well + "-DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF" + "-DMLIR_TOOLS_INSTALL_DIR=${placeholder "out"}/bin/" + "-DLLVM_ENABLE_IDE=OFF" + "-DLLD_INSTALL_PACKAGE_DIR=${placeholder "out"}/lib/cmake/mlir" + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ lib.optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=OFF" + ] ++ lib.optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen" + "-DMLIR_TABLEGEN_EXE=${buildLlvmTools.mlir}/bin/mlir-tblgen" + ]; + + outputs = [ "out" "dev" ]; + + meta = llvm_meta // { + homepage = "https://mlir.llvm.org/"; + description = "Multi-Level IR Compiler Framework"; + longDescription = '' + The MLIR project is a novel approach to building reusable and extensible + compiler infrastructure. MLIR aims to address software fragmentation, + improve compilation for heterogeneous hardware, significantly reduce + the cost of building domain specific compilers, and aid in connecting + existing compilers together. + ''; + }; +} diff --git a/pkgs/by-name/ll/llvm/common/mlir/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/common/mlir/gnu-install-dirs.patch new file mode 100644 index 0000000..9519102 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/mlir/gnu-install-dirs.patch @@ -0,0 +1,15 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c91e9cd93dc8..23b6032a46b7 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -32,8 +32,8 @@ if(MLIR_STANDALONE_BUILD) + endif() + + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY +- "${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}") +- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") ++ "${CMAKE_INSTALL_LIBDIR}/${LLVM_LIBDIR_SUFFIX}") ++ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_INSTALL_BINDIR}") + + set(LLVM_LIT_ARGS "-sv" CACHE STRING "Default options for lit") + endif() diff --git a/pkgs/by-name/ll/llvm/common/openmp/default.nix b/pkgs/by-name/ll/llvm/common/openmp/default.nix new file mode 100644 index 0000000..7d9d813 --- /dev/null +++ b/pkgs/by-name/ll/llvm/common/openmp/default.nix @@ -0,0 +1,86 @@ +{ lib +, stdenv +, llvm_meta +, release_version +, patches ? [] +, monorepoSrc ? null +, src ? null +, runCommand +, cmake +, ninja +, llvm +, targetLlvm +, lit +, clang-unwrapped +, perl +, pkg-config +, xcbuild +, version +}: +let + pname = "openmp"; + src' = + if monorepoSrc != null then + runCommand "${pname}-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + '' else src; +in +stdenv.mkDerivation (rec { + inherit pname version patches; + + src = src'; + + sourceRoot = + if lib.versionOlder release_version "13" then null + else "${src.name}/${pname}"; + + outputs = [ "out" ] + ++ lib.optionals (lib.versionAtLeast release_version "14") [ "dev" ]; + + patchFlags = + if lib.versionOlder release_version "14" then [ "-p2" ] + else null; + + nativeBuildInputs = [ + cmake + ] ++ lib.optionals (lib.versionAtLeast release_version "15") [ + ninja + ] ++ [ perl ] ++ lib.optionals (lib.versionAtLeast release_version "14") [ + pkg-config lit + ]; + + buildInputs = [ + (if stdenv.buildPlatform == stdenv.hostPlatform then llvm else targetLlvm) + ]; + + cmakeFlags = lib.optionals (lib.versions.major release_version == "13") [ + "-DLIBOMPTARGET_BUILD_AMDGCN_BCLIB=OFF" # Building the AMDGCN device RTL fails + ] ++ lib.optionals (lib.versionAtLeast release_version "14") [ + "-DCLANG_TOOL=${clang-unwrapped}/bin/clang" + "-DOPT_TOOL=${llvm}/bin/opt" + "-DLINK_TOOL=${llvm}/bin/llvm-link" + ]; + + meta = llvm_meta // { + homepage = "https://openmp.llvm.org/"; + description = "Support for the OpenMP language"; + longDescription = '' + The OpenMP subproject of LLVM contains the components required to build an + executable OpenMP program that are outside the compiler itself. + Contains the code for the runtime library against which code compiled by + "clang -fopenmp" must be linked before it can run and the library that + supports offload to target devices. + ''; + # "All of the code is dual licensed under the MIT license and the UIUC + # License (a BSD-like license)": + license = with lib.licenses; [ mit ncsa ]; + }; +} // (lib.optionalAttrs (lib.versionAtLeast release_version "14") { + doCheck = false; + checkTarget = "check-openmp"; + preCheck = '' + patchShebangs ../tools/archer/tests/deflake.bash + ''; +})) diff --git a/pkgs/by-name/ll/llvm/git/clang/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/git/clang/gnu-install-dirs.patch new file mode 100644 index 0000000..9517df9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/clang/gnu-install-dirs.patch @@ -0,0 +1,71 @@ +diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake +index 75b0080f6715..c895b884cd27 100644 +--- a/cmake/modules/AddClang.cmake ++++ b/cmake/modules/AddClang.cmake +@@ -119,8 +119,8 @@ macro(add_clang_library name) + install(TARGETS ${lib} + COMPONENT ${lib} + ${export_to_clangtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (NOT LLVM_ENABLE_IDE) +diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt +index f2b0c5cddcbb..52f37fc368ce 100644 +--- a/lib/Headers/CMakeLists.txt ++++ b/lib/Headers/CMakeLists.txt +@@ -473,6 +473,7 @@ add_header_target("windows-resource-headers" ${windows_only_files}) + add_header_target("utility-resource-headers" ${utility_files}) + + get_clang_resource_dir(header_install_dir SUBDIR include) ++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include) + + ############################################################# + # Install rules for the catch-all clang-resource-headers target +diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt +index 4f23065a2472..6a0f55991e24 100644 +--- a/tools/libclang/CMakeLists.txt ++++ b/tools/libclang/CMakeLists.txt +@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS}) + COMPONENT + libclang-python-bindings + DESTINATION +- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") ++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages") + endforeach() + if(NOT LLVM_ENABLE_IDE) + add_custom_target(libclang-python-bindings) +diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt +index 3aca22c0b0a8..3115353e3fe3 100644 +--- a/tools/scan-build-py/CMakeLists.txt ++++ b/tools/scan-build-py/CMakeLists.txt +@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib}) + install(FILES lib/libscanbuild/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild" + COMPONENT scan-build-py) + endforeach() + +@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource}) + install(FILES lib/libscanbuild/resources/${resource} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources" + COMPONENT scan-build-py) + endforeach() + +@@ -122,7 +122,7 @@ foreach(lib ${LibEar}) + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib}) + list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib}) + install(FILES lib/libear/${lib} +- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear ++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear" + COMPONENT scan-build-py) + endforeach() + diff --git a/pkgs/by-name/ll/llvm/git/clang/purity.patch b/pkgs/by-name/ll/llvm/git/clang/purity.patch new file mode 100644 index 0000000..5ce14a3 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/clang/purity.patch @@ -0,0 +1,25 @@ +From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001 +From: Will Dietz +Date: Thu, 18 May 2017 11:56:12 -0500 +Subject: [PATCH] "purity" patch for 5.0 + +--- + lib/Driver/ToolChains/Gnu.cpp | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index fe3c0191bb..c6a482bece 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -446,9 +446,6 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, + ToolChain.isPIEDefault(Args)); + if (IsPIE) + CmdArgs.push_back("-pie"); +- CmdArgs.push_back("-dynamic-linker"); +- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) + +- ToolChain.getDynamicLinker(Args))); + } + } + +-- +2.11.0 diff --git a/pkgs/by-name/ll/llvm/git/compiler-rt/X86-support-extension.patch b/pkgs/by-name/ll/llvm/git/compiler-rt/X86-support-extension.patch new file mode 100644 index 0000000..07013e5 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/compiler-rt/X86-support-extension.patch @@ -0,0 +1,21 @@ +diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt +index 3a66dd9c3fb..7efc85d9f9f 100644 +--- a/lib/builtins/CMakeLists.txt ++++ b/lib/builtins/CMakeLists.txt +@@ -348,4 +348,8 @@ if (NOT MSVC) + ++ set(i486_SOURCES ${i386_SOURCES}) ++ set(i586_SOURCES ${i386_SOURCES}) ++ set(i686_SOURCES ${i386_SOURCES}) ++ + if (WIN32) + set(i386_SOURCES + ${i386_SOURCES} +@@ -723,6 +723,7 @@ else () + endif() + + foreach (arch ${BUILTIN_SUPPORTED_ARCH}) ++ message("arch: ${arch}") + if (CAN_TARGET_${arch}) + # For ARM archs, exclude any VFP builtins if VFP is not supported + if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") diff --git a/pkgs/by-name/ll/llvm/git/compiler-rt/darwin-targetconditionals.patch b/pkgs/by-name/ll/llvm/git/compiler-rt/darwin-targetconditionals.patch new file mode 100644 index 0000000..425dc2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/compiler-rt/darwin-targetconditionals.patch @@ -0,0 +1,71 @@ +diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp +--- a/lib/sanitizer_common/sanitizer_mac.cpp ++++ b/lib/sanitizer_common/sanitizer_mac.cpp +@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) { + // Offset example: + // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4 + constexpr u16 GetOSMajorKernelOffset() { +- if (TARGET_OS_OSX) return 4; +- if (TARGET_OS_IOS || TARGET_OS_TV) return 6; +- if (TARGET_OS_WATCH) return 13; ++#if TARGET_OS_OSX ++ return 4; ++#endif ++#if TARGET_OS_IOS || TARGET_OS_TV ++ return 6; ++#endif ++#if TARGET_OS_WATCH ++ return 13; ++#endif + } + + using VersStr = char[64]; +@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) { + u16 os_major = kernel_major - offset; + + const char *format = "%d.0"; +- if (TARGET_OS_OSX) { +- if (os_major >= 16) { // macOS 11+ +- os_major -= 5; +- } else { // macOS 10.15 and below +- format = "10.%d"; +- } ++#if TARGET_OS_OSX ++ if (os_major >= 16) { // macOS 11+ ++ os_major -= 5; ++ } else { // macOS 10.15 and below ++ format = "10.%d"; + } ++#endif + return internal_snprintf(vers, sizeof(VersStr), format, os_major); + } + +@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) { + // Aligned versions example: + // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6 + static void MapToMacos(u16 *major, u16 *minor) { +- if (TARGET_OS_OSX) +- return; +- +- if (TARGET_OS_IOS || TARGET_OS_TV) ++#if !TARGET_OS_OSX ++#if TARGET_OS_IOS || TARGET_OS_TV + *major += 2; +- else if (TARGET_OS_WATCH) ++#elif TARGET_OS_WATCH + *major += 9; +- else ++#else + UNREACHABLE("unsupported platform"); ++#endif + + if (*major >= 16) { // macOS 11+ + *major -= 5; +@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) { + *minor = *major; + *major = 10; + } ++#endif + } + + static MacosVersion GetMacosAlignedVersionInternal() { diff --git a/pkgs/by-name/ll/llvm/git/compiler-rt/normalize-var.patch b/pkgs/by-name/ll/llvm/git/compiler-rt/normalize-var.patch new file mode 100644 index 0000000..2b25fd4 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/compiler-rt/normalize-var.patch @@ -0,0 +1,16 @@ +diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake +index 4c85551d7766..297d7a47c54b 100644 +--- a/cmake/Modules/CompilerRTUtils.cmake ++++ b/cmake/Modules/CompilerRTUtils.cmake +@@ -328,8 +328,9 @@ macro(load_llvm_config) + endif() + endif() + +- set(LLVM_LIBRARY_OUTPUT_INTDIR +- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) ++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR ++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX} ++ REALPATH) + + set(LLVM_MAIN_SRC_DIR "${LLVM_MAIN_SRC_DIR_DEFAULT}" CACHE PATH "Path to LLVM source tree") + message(STATUS "LLVM_MAIN_SRC_DIR: \"${LLVM_MAIN_SRC_DIR}\"") diff --git a/pkgs/by-name/ll/llvm/git/default.nix b/pkgs/by-name/ll/llvm/git/default.nix new file mode 100644 index 0000000..1a34130 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/default.nix @@ -0,0 +1,372 @@ +{ lowPrio, newScope, pkgs, lib, stdenv, cmake, ninja +, preLibcCrossHeaders +, libxml2, python3, fetchFromGitHub, substituteAll, overrideCC, wrapCCWith, wrapBintoolsWith +, buildLlvmTools # tools, but from the previous stage, for cross +, targetLlvmLibraries # libraries, but from the next stage, for cross +, targetLlvm +# This is the default binutils, but with *this* version of LLD rather +# than the default LLVM verion's, if LLD is the choice. We use these for +# the `useLLVM` bootstrapping below. +, bootBintoolsNoLibc ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintoolsNoLibc +, bootBintools ? + if stdenv.targetPlatform.linker == "lld" + then null + else pkgs.bintools +, darwin +# LLVM release information; specify one of these but not both: +, gitRelease ? { + version = "19.0.0-git"; + rev = "cebf77fb936a7270c7e3fa5c4a7e76216321d385"; + rev-version = "19.0.0-unstable-2024-04-07"; + sha256 = "sha256-616tscgsiFgHQcXW4KzK5srrudYizQFnJVM6K0qRf+I="; +} + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # rev = /* commit SHA */; + # rev-version = /* human readable version; i.e. "15.0.0-unstable-2022-07-26" */; + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +, officialRelease ? null + # i.e.: + # { + # version = /* i.e. "15.0.0" */; + # candidate = /* optional; if specified, should be: "rcN" */ + # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */; + # } +# By default, we'll try to fetch a release from `github:llvm/llvm-project` +# corresponding to the `gitRelease` or `officialRelease` specified. +# +# You can provide your own LLVM source by specifying this arg but then it's up +# to you to make sure that the LLVM repo given matches the release configuration +# specified. +, monorepoSrc ? null +}: + +assert + lib.assertMsg + (lib.xor + (gitRelease != null) + (officialRelease != null)) + ("must specify `gitRelease` or `officialRelease`" + + (lib.optionalString (gitRelease != null) " — not both")); +let + monorepoSrc' = monorepoSrc; +in let + inherit (import ../common/common-let.nix { inherit lib gitRelease officialRelease; }) releaseInfo; + + inherit (releaseInfo) release_version version; + + inherit (import ../common/common-let.nix { inherit lib fetchFromGitHub release_version gitRelease officialRelease monorepoSrc'; }) llvm_meta monorepoSrc; + + tools = lib.makeExtensible (tools: let + callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; }); + major = lib.versions.major release_version; + mkExtraBuildCommands0 = cc: '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc.lib}/lib/clang/${major}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + '' + ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share" + ''; + + bintoolsNoLibc' = + if bootBintoolsNoLibc == null + then tools.bintoolsNoLibc + else bootBintoolsNoLibc; + bintools' = + if bootBintools == null + then tools.bintools + else bootBintools; + + in { + + libllvm = callPackage ./llvm { + inherit llvm_meta; + }; + + # `llvm` historically had the binaries. When choosing an output explicitly, + # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get* + llvm = tools.libllvm; + + libclang = callPackage ../common/clang { + patches = [ + ./clang/purity.patch + # https://reviews.llvm.org/D51899 + ./clang/gnu-install-dirs.patch + ../common/clang/add-nostdlibinc-flag.patch + (substituteAll { + src = ../common/clang/clang-at-least-16-LLVMgold-path.patch; + libllvmLibdir = "${tools.libllvm.lib}/lib"; + }) + ]; + inherit llvm_meta; + }; + + clang-unwrapped = tools.libclang; + + llvm-manpages = lowPrio (tools.libllvm.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + clang-manpages = lowPrio (tools.libclang.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + lldb-manpages = lowPrio (tools.lldb.override { + enableManpages = true; + python3 = pkgs.python3; # don't use python-boot + }); + + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; + + libstdcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + libcxxClang = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + }; + + lld = callPackage ../common/lld { + patches = [ + ./lld/gnu-install-dirs.patch + ]; + inherit llvm_meta; + }; + + mlir = callPackage ../common/mlir { + inherit llvm_meta; + }; + + lldb = callPackage ../common/lldb.nix { + src = callPackage ({ runCommand }: runCommand "lldb-src-${version}" {} '' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/lldb "$out" + '') { }; + patches = + [ + # FIXME: do we need this? ./procfs.patch + ../common/lldb/gnu-install-dirs.patch + ] + # This is a stopgap solution if/until the macOS SDK used for x86_64 is + # updated. + # + # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h` + # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use + # of this preprocessor symbol in `lldb` with its expansion. + # + # See here for some context: + # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132 + ++ lib.optional ( + stdenv.targetPlatform.isDarwin + && !stdenv.targetPlatform.isAarch64 + && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0") + ) ./lldb/cpu_subtype_arm64e_replacement.patch; + inherit llvm_meta; + }; + + # Below, is the LLVM bootstrapping logic. It handles building a + # fully LLVM toolchain from scratch. No GCC toolchain should be + # pulled in. As a consequence, it is very quick to build different + # targets provided by LLVM and we can also build for what GCC + # doesn’t support like LLVM. Probably we should move to some other + # file. + + bintools-unwrapped = callPackage ../common/bintools.nix { }; + + bintoolsNoLibc = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + libc = preLibcCrossHeaders; + }; + + bintools = wrapBintoolsWith { + bintools = tools.bintools-unwrapped; + }; + + clangUseLLVM = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = targetLlvmLibraries.libcxx; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [ + targetLlvmLibraries.libunwind + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ "-rtlib=compiler-rt" + "-Wno-unused-command-line-argument" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind" + ++ lib.optional + (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false) + "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + nixSupport.cc-ldflags = lib.optionals (!stdenv.targetPlatform.isWasm) [ "-L${targetLlvmLibraries.libunwind}/lib" ]; + }; + + clangNoLibcxx = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + "-nostdlib++" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoLibc = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ + targetLlvmLibraries.compiler-rt + ]; + extraBuildCommands = mkExtraBuildCommands cc; + nixSupport.cc-cflags = + [ + "-rtlib=compiler-rt" + "-B${targetLlvmLibraries.compiler-rt}/lib" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRt = wrapCCWith rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintoolsNoLibc'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + nixSupport.cc-cflags = + [ + "-nostartfiles" + ] + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; + }; + + clangNoCompilerRtWithLibc = wrapCCWith (rec { + cc = tools.clang-unwrapped; + libcxx = null; + bintools = bintools'; + extraPackages = [ ]; + extraBuildCommands = mkExtraBuildCommands0 cc; + } // lib.optionalAttrs stdenv.targetPlatform.isWasm { + nixSupport.cc-cflags = [ "-fno-exceptions" ]; + }); + + # Has to be in tools despite mostly being a library, + # because we use a native helper executable from a + # non-cross build in cross builds. + libclc = callPackage ../common/libclc.nix { + inherit buildLlvmTools; + }; + }); + + libraries = lib.makeExtensible (libraries: let + callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; }); + in { + + compiler-rt-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false || (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic) + then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc + else stdenv; + }; + + compiler-rt-no-libc = callPackage ../common/compiler-rt { + patches = [ + ./compiler-rt/X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config + # ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the + # extra `/`. + ./compiler-rt/normalize-var.patch + # See: https://github.com/NixOS/nixpkgs/pull/186575 + ../common/compiler-rt/darwin-plistbuddy-workaround.patch + # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893 + # ../common/compiler-rt/armv7l-15.patch + ]; + inherit llvm_meta; + stdenv = if stdenv.hostPlatform.useLLVM or false + then overrideCC stdenv buildLlvmTools.clangNoCompilerRt + else stdenv; + }; + + # N.B. condition is safe because without useLLVM both are the same. + compiler-rt = if stdenv.hostPlatform.isAndroid || stdenv.hostPlatform.isDarwin + then libraries.compiler-rt-libc + else libraries.compiler-rt-no-libc; + + stdenv = overrideCC stdenv buildLlvmTools.clang; + + libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang; + + # `libcxx` requires a fairly modern C++ compiler, + # so: we use the clang from this LLVM package set instead of the regular + # stdenv's compiler. + libcxx = callPackage ../common/libcxx { + patches = lib.optionals (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [ + # https://github.com/llvm/llvm-project/issues/64226 + ./libcxx/0001-darwin-10.12-mbstate_t-fix.patch + ]; + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + libunwind = callPackage ../common/libunwind { + inherit llvm_meta; + stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx; + }; + + openmp = callPackage ../common/openmp { + patches = [ + ./openmp/fix-find-tool.patch + ./openmp/run-lit-directly.patch + ]; + inherit llvm_meta targetLlvm; + }; + }); + noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; + +in { inherit tools libraries release_version; } // (noExtend libraries) // (noExtend tools) diff --git a/pkgs/by-name/ll/llvm/git/libcxx/0001-darwin-10.12-mbstate_t-fix.patch b/pkgs/by-name/ll/llvm/git/libcxx/0001-darwin-10.12-mbstate_t-fix.patch new file mode 100644 index 0000000..29942f8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/libcxx/0001-darwin-10.12-mbstate_t-fix.patch @@ -0,0 +1,31 @@ +From 9c1cb26c1dd3f92d1c1177e548107d2cd3c5e616 Mon Sep 17 00:00:00 2001 +From: annalee <150648636+a-n-n-a-l-e-e@users.noreply.github.com> +Date: Fri, 23 Feb 2024 22:58:58 +0000 +Subject: [PATCH] darwin 10.12 mbstate_t fix + +https://github.com/llvm/llvm-project/issues/64226 + +removes space from +https://github.com/macports/macports-ports/raw/acd8acb171f1658596ed1cf25da48d5b932e2d19/lang/llvm-17/files/0042-mbstate_t-not-defined.patch +so it applies cleanly +--- + libcxx/include/__mbstate_t.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/libcxx/include/__mbstate_t.h b/libcxx/include/__mbstate_t.h +index bfa6d61..5f51112 100644 +--- a/libcxx/include/__mbstate_t.h ++++ b/libcxx/include/__mbstate_t.h +@@ -42,6 +42,9 @@ + #elif __has_include() + # include // works on most Unixes + #elif __has_include() ++# if __has_include() ++# include ++# endif + # include // works on Darwin + #elif !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) && __has_include_next() + # include_next // fall back to the C standard provider of mbstate_t +-- +2.43.0 + diff --git a/pkgs/by-name/ll/llvm/git/lld/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/git/lld/gnu-install-dirs.patch new file mode 100644 index 0000000..6c73a24 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/lld/gnu-install-dirs.patch @@ -0,0 +1,15 @@ +diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake +index d3924f7243d4..42a7cd62281c 100644 +--- a/cmake/modules/AddLLD.cmake ++++ b/cmake/modules/AddLLD.cmake +@@ -18,8 +18,8 @@ macro(add_lld_library name) + install(TARGETS ${name} + COMPONENT ${name} + ${export_to_lldtargets} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) diff --git a/pkgs/by-name/ll/llvm/git/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/by-name/ll/llvm/git/lldb/cpu_subtype_arm64e_replacement.patch new file mode 100644 index 0000000..20d35c9 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/lldb/cpu_subtype_arm64e_replacement.patch @@ -0,0 +1,12 @@ +diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm ++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm +@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32, + len = sizeof(is_64_bit_capable); + ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0); + +- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) { ++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers + // The arm64e architecture is a preview. Pretend the host architecture + // is arm64. + cpusubtype = CPU_SUBTYPE_ARM64_ALL; diff --git a/pkgs/by-name/ll/llvm/git/lldb/procfs.patch b/pkgs/by-name/ll/llvm/git/lldb/procfs.patch new file mode 100644 index 0000000..7b200e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/lldb/procfs.patch @@ -0,0 +1,46 @@ +--- a/source/Plugins/Process/Linux/Procfs.h ++++ b/source/Plugins/Process/Linux/Procfs.h +@@ -10,6 +10,13 @@ + // sys/procfs.h on Android/Linux for all supported architectures. + + #include ++#include ++ ++// on i686 preprocessor symbols with these register names are defined as ++// numeric constants; these symbols clash with identifier names used in ++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h` ++#undef FS ++#undef CS + + #include "lldb/lldb-types.h" + +@@ -17,23 +24,13 @@ + + #include + +-#ifdef __ANDROID__ +-#if defined(__arm64__) || defined(__aarch64__) +-typedef unsigned long elf_greg_t; +-typedef elf_greg_t +- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))]; +-typedef struct user_fpsimd_state elf_fpregset_t; +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#elif defined(__mips__) +-#ifndef NT_FPREGSET +-#define NT_FPREGSET NT_PRFPREG +-#endif // NT_FPREGSET +-#endif +-#else // __ANDROID__ ++#if !defined(__GLIBC__) && defined(__powerpc__) ++#define pt_regs musl_pt_regs ++#include ++#undef pt_regs ++#else + #include +-#endif // __ANDROID__ ++#endif + + namespace lldb_private { + namespace process_linux { diff --git a/pkgs/by-name/ll/llvm/git/llvm/default.nix b/pkgs/by-name/ll/llvm/git/llvm/default.nix new file mode 100644 index 0000000..8987103 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/default.nix @@ -0,0 +1,435 @@ +{ lib, stdenv, llvm_meta +, pkgsBuildBuild +, monorepoSrc +, runCommand +, cmake +, darwin +, ninja +, python3 +, python3Packages +, libffi +, enableGoldPlugin ? libbfd.hasPluginAPI +, libbfd +, libpfm +, libxml2 +, ncurses +, version +, release_version +, zlib +, which +, sysctl +, buildLlvmTools +, debugVersion ? false +, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl) + && (stdenv.hostPlatform == stdenv.buildPlatform) +, enableManpages ? false +, enableSharedLibraries ? !stdenv.hostPlatform.isStatic +, enablePFM ? stdenv.isLinux /* PFM only supports Linux */ + # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245 + # broken for the armv7l builder + && !stdenv.hostPlatform.isAarch +, enablePolly ? true +}: + +let + inherit (lib) optional optionals optionalString; + + # Used when creating a version-suffixed symlink of libLLVM.dylib + shortVersion = with lib; + concatStringsSep "." (take 1 (splitString "." release_version)); + + # Ordinarily we would just the `doCheck` and `checkDeps` functionality + # `mkDerivation` gives us to manage our test dependencies (instead of breaking + # out `doCheck` as a package level attribute). + # + # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in + # particular the children it uses to do feature detection. + # + # This means that python deps we add to `checkDeps` (which the python + # interpreter is made aware of via `$PYTHONPATH` – populated by the python + # setup hook) are not picked up by `lit` which causes it to skip tests. + # + # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work + # because this package is shadowed in `$PATH` by the regular `python3` + # package. + # + # So, we "manually" assemble one python derivation for the package to depend + # on, taking into account whether checks are enabled or not: + python = if doCheck then + # Note that we _explicitly_ ask for a python interpreter for our host + # platform here; the splicing that would ordinarily take care of this for + # us does not seem to work once we use `withPackages`. + let + checkDeps = ps: with ps; [ psutil ]; + in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps + else python3; + +in + +stdenv.mkDerivation (rec { + pname = "llvm"; + inherit version; + + src = runCommand "${pname}-src-${version}" {} ('' + mkdir -p "$out" + cp -r ${monorepoSrc}/cmake "$out" + cp -r ${monorepoSrc}/${pname} "$out" + cp -r ${monorepoSrc}/third-party "$out" + '' + lib.optionalString enablePolly '' + chmod u+w "$out/${pname}/tools" + cp -r ${monorepoSrc}/polly "$out/${pname}/tools" + ''); + + sourceRoot = "${src.name}/${pname}"; + + outputs = [ "out" "lib" "dev" "python" ]; + + nativeBuildInputs = [ cmake ninja python ] + ++ optionals enableManpages [ + # Note: we intentionally use `python3Packages` instead of `python3.pkgs`; + # splicing does *not* work with the latter. (TODO: fix) + python3Packages.sphinx + ] ++ optionals (lib.versionOlder version "18" && enableManpages) [ + python3Packages.recommonmark + ] ++ optionals (lib.versionAtLeast version "18" && enableManpages) [ + python3Packages.myst-parser + ]; + + buildInputs = [ libxml2 libffi ] + ++ optional enablePFM libpfm; # exegesis + + propagatedBuildInputs = [ ncurses zlib ]; + + nativeCheckInputs = [ + which + ] ++ lib.optional stdenv.isDarwin sysctl; + + patches = [ + ./gnu-install-dirs.patch + + # Running the tests involves invoking binaries (like `opt`) that depend on + # the LLVM dylibs and reference them by absolute install path (i.e. their + # nix store path). + # + # Because we have not yet run the install phase (we're running these tests + # as part of `checkPhase` instead of `installCheckPhase`) these absolute + # paths do not exist yet; to work around this we point the loader (`ld` on + # unix, `dyld` on macOS) at the `lib` directory which will later become this + # package's `lib` output. + # + # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib` + # dir but: + # - this doesn't generalize well to other platforms; `lit` doesn't forward + # `DYLD_LIBRARY_PATH` (macOS): + # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26 + # - even if `lit` forwarded this env var, we actually cannot set + # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because + # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for + # "protected processes" (i.e. the python interpreter that runs `lit`): + # https://stackoverflow.com/a/35570229 + # - other LLVM subprojects deal with this issue by having their `lit` + # configuration set these env vars for us; it makes sense to do the same + # for LLVM: + # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31 + # + # !!! TODO: look into upstreaming this patch + ./llvm-lit-cfg-add-libs-to-dylib-path.patch + + # `lit` has a mode where it executes run lines as a shell script which is + # constructs; this is problematic for macOS because it means that there's + # another process in between `lit` and the binaries being tested. As noted + # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our + # tests fail with dyld errors. + # + # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when + # present in the test configuration. + # + # It's not clear to me why this isn't an issue for LLVM developers running + # on macOS (nothing about this _seems_ nix specific).. + ./lit-shell-script-runner-set-dyld-library-path.patch + ] ++ lib.optionals enablePolly [ + ./gnu-install-dirs-polly.patch + + # Just like the `llvm-lit-cfg` patch, but for `polly`. + ./polly-lit-cfg-add-libs-to-dylib-path.patch + ]; + + postPatch = optionalString stdenv.isDarwin '' + substituteInPlace cmake/modules/AddLLVM.cmake \ + --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \ + --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' "" + + # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick + # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7 + rm test/MC/ELF/cfi-version.ll + + # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`) + # and thus fails under the sandbox: + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }" + + # This test tries to call the intrinsics `@llvm.roundeven.f32` and + # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf` + # and `roundeven` on macOS. + # + # However these functions are glibc specific so the test fails: + # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html + # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html + # + substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \ + --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \ + --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" "" + + # fails when run in sandbox + substituteInPlace unittests/Support/VirtualFileSystemTest.cpp \ + --replace "PhysicalFileSystemWorkingDirFailure" "DISABLED_PhysicalFileSystemWorkingDirFailure" + '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) '' + # This test fails on darwin x86_64 because `sw_vers` reports a different + # macOS version than what LLVM finds by reading + # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into + # the sandbox on macOS). + # + # The `sw_vers` provided by nixpkgs reports the macOS version associated + # with the `CoreFoundation` framework with which it was built. Because + # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what + # `sw_vers` reports is not guaranteed to match the macOS version of the host + # that's building this derivation. + # + # Astute readers will note that we only _patch_ this test on aarch64-darwin + # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright. + # So why does this test pass on aarch64? + # + # Well, it seems that `sw_vers` on aarch64 actually links against the _host_ + # CoreFoundation framework instead of the nixpkgs provided one. + # + # Not entirely sure what the right fix is here. I'm assuming aarch64 + # `sw_vers` doesn't intentionally link against the host `CoreFoundation` + # (still digging into how this ends up happening, will follow up) but that + # aside I think the more pertinent question is: should we be patching LLVM's + # macOS version detection logic to use `sw_vers` instead of reading host + # paths? This *is* a way in which details about builder machines can creep + # into the artifacts that are produced, affecting reproducibility, but it's + # not clear to me when/where/for what this even gets used in LLVM. + # + # TODO(@rrbutani): fix/follow-up + substituteInPlace unittests/TargetParser/Host.cpp \ + --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion" + '' + '' + # FileSystem permissions tests fail with various special bits + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "Path.cpp" "" + rm unittests/Support/Path.cpp + substituteInPlace unittests/IR/CMakeLists.txt \ + --replace "PassBuilderCallbacksTest.cpp" "" + rm unittests/IR/PassBuilderCallbacksTest.cpp + rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test + + # Fails in the presence of anti-virus software or other intrusion-detection software that + # modifies the atime when run. See #284056. + rm test/tools/llvm-objcopy/ELF/strip-preserve-atime.test + '' + optionalString stdenv.hostPlatform.isMusl '' + patch -p1 -i ${../../common/llvm/TLI-musl.patch} + substituteInPlace unittests/Support/CMakeLists.txt \ + --replace "add_subdirectory(DynamicLibrary)" "" + rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp + # valgrind unhappy with musl or glibc, but fails w/musl only + rm test/CodeGen/AArch64/wineh4.mir + '' + optionalString stdenv.hostPlatform.isAarch32 '' + # skip failing X86 test cases on 32-bit ARM + rm test/DebugInfo/X86/convert-debugloc.ll + rm test/DebugInfo/X86/convert-inlined.ll + rm test/DebugInfo/X86/convert-linked.ll + rm test/tools/dsymutil/X86/op-convert.test + rm test/tools/gold/X86/split-dwarf.ll + rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s + rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s + rm test/CodeGen/RISCV/attributes.ll + rm test/CodeGen/RISCV/xtheadmempair.ll + '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") '' + # Seems to require certain floating point hardware (NEON?) + rm test/ExecutionEngine/frem.ll + '' + '' + patchShebangs test/BugPoint/compile-custom.ll.py + ''; + + preConfigure = '' + # Workaround for configure flags that need to have spaces + cmakeFlagsArray+=( + -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar" + ) + ''; + + # Defensive check: some paths (that we make symlinks to) depend on the release + # version, for example: + # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185 + # + # So we want to sure that the version in the source matches the release + # version we were given. + # + # We do this check here, in the LLVM build, because it happens early. + postConfigure = let + v = lib.versions; + major = v.major release_version; + minor = v.minor release_version; + patch = v.patch release_version; + in '' + # $1: part, $2: expected + check_version() { + part="''${1^^}" + part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)" + + if [[ "$part" != "$2" ]]; then + echo >&2 \ + "mismatch in the $1 version! we have version ${release_version}" \ + "and expected the $1 version to be '$2'; the source has '$part' instead" + exit 3 + fi + } + + check_version major ${major} + check_version minor ${minor} + check_version patch ${patch} + ''; + + # E.g. mesa.drivers use the build-id as a cache key (see #93946): + LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1"; + + hardeningDisable = [ "trivialautovarinit" ]; + + cmakeBuildType = if debugVersion then "Debug" else "Release"; + + cmakeFlags = with stdenv; let + # These flags influence llvm-config's BuildVariables.inc in addition to the + # general build. We need to make sure these are also passed via + # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native + # will return different results from the cross llvm-config. + # + # Some flags don't need to be repassed because LLVM already does so (like + # CMAKE_BUILD_TYPE), others are irrelevant to the result. + flagsForLlvmConfig = [ + "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm" + "-DLLVM_ENABLE_RTTI=ON" + ] ++ optionals enableSharedLibraries [ + "-DLLVM_LINK_LLVM_DYLIB=ON" + ]; + in flagsForLlvmConfig ++ [ + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + "-DLLVM_ENABLE_DUMP=ON" + ] ++ optionals stdenv.hostPlatform.isStatic [ + # Disables building of shared libs, -fPIC is still injected by cc-wrapper + "-DLLVM_ENABLE_PIC=OFF" + "-DLLVM_BUILD_STATIC=ON" + "-DLLVM_LINK_LLVM_DYLIB=off" + # libxml2 needs to be disabled because the LLVM build system ignores its .la + # file and doesn't link zlib as well. + # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812 + "-DLLVM_ENABLE_LIBXML2=OFF" + ] ++ optionals enableManpages [ + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ] ++ optionals enableGoldPlugin [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + ] ++ optionals isDarwin [ + "-DLLVM_ENABLE_LIBCXX=ON" + "-DCAN_TARGET_i386=false" + ] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [ + "-DCMAKE_CROSSCOMPILING=True" + "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen" + ( + let + nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc; + nativeBintools = nativeCC.bintools.bintools; + nativeToolchainFlags = [ + "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc" + "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++" + "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar" + "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip" + "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib" + ]; + # We need to repass the custom GNUInstallDirs values, otherwise CMake + # will choose them for us, leading to wrong results in llvm-config-native + nativeInstallFlags = [ + "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" + "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin" + "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include" + "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec" + ]; + in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list=" + + lib.concatStringsSep ";" (lib.concatLists [ + flagsForLlvmConfig + nativeToolchainFlags + nativeInstallFlags + ]) + ) + ]; + + postInstall = '' + mkdir -p $python/share + mv $out/share/opt-viewer $python/share/opt-viewer + moveToOutput "bin/llvm-config*" "$dev" + substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \ + --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" + substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \ + --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")' + '' + + optionalString (stdenv.isDarwin && enableSharedLibraries) '' + ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib + '' + + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native + ''; + + inherit doCheck; + + checkTarget = "check-all"; + + # For the update script: + passthru.monorepoSrc = monorepoSrc; + + requiredSystemFeatures = [ "big-parallel" ]; + meta = llvm_meta // { + homepage = "https://llvm.org/"; + description = "A collection of modular and reusable compiler and toolchain technologies"; + longDescription = '' + The LLVM Project is a collection of modular and reusable compiler and + toolchain technologies. Despite its name, LLVM has little to do with + traditional virtual machines. The name "LLVM" itself is not an acronym; it + is the full name of the project. + LLVM began as a research project at the University of Illinois, with the + goal of providing a modern, SSA-based compilation strategy capable of + supporting both static and dynamic compilation of arbitrary programming + languages. Since then, LLVM has grown to be an umbrella project consisting + of a number of subprojects, many of which are being used in production by + a wide variety of commercial and open source projects as well as being + widely used in academic research. Code in the LLVM project is licensed + under the "Apache 2.0 License with LLVM exceptions". + ''; + }; +} // lib.optionalAttrs enableManpages { + pname = "llvm-manpages"; + + propagatedBuildInputs = []; + + ninjaFlags = [ "docs-llvm-man" ]; + installTargets = [ "install-docs-llvm-man" ]; + + postPatch = null; + postInstall = null; + + outputs = [ "out" ]; + + doCheck = false; + + meta = llvm_meta // { + description = "man pages for LLVM ${version}"; + }; +}) diff --git a/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs-polly.patch b/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs-polly.patch new file mode 100644 index 0000000..6a359bd --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs-polly.patch @@ -0,0 +1,13 @@ +--- a/tools/polly/cmake/polly_macros.cmake 2024-03-15 17:36:20.550893344 -0700 ++++ b/tools/polly/cmake/polly_macros.cmake 2024-03-15 17:37:06.277332960 -0700 +@@ -45,8 +45,8 @@ + install(TARGETS ${name} + COMPONENT ${name} + EXPORT LLVMExports +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + add_llvm_install_targets(install-${name} + COMPONENT ${name}) + endif() diff --git a/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs.patch b/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs.patch new file mode 100644 index 0000000..8b89839 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/gnu-install-dirs.patch @@ -0,0 +1,137 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 471817d68286..c51463304159 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1010,7 +1010,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") + add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) + install(TARGETS tf_xla_runtime EXPORT LLVMExports +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime) + # Once we add more modules, we should handle this more automatically. + if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL) +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 230620c37027..dd16cab1835e 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -876,8 +876,8 @@ macro(add_llvm_library name) + get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) + install(TARGETS ${name} + ${export_to_llvmexports} +- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} +- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) + + if (NOT LLVM_ENABLE_IDE) +@@ -2069,7 +2069,7 @@ function(llvm_install_library_symlink name dest type) + set(LLVM_LINK_OR_COPY copy) + endif() + +- set(output_dir lib${LLVM_LIBDIR_SUFFIX}) ++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}) + if(WIN32 AND "${type}" STREQUAL "SHARED") + set(output_dir "${CMAKE_INSTALL_BINDIR}") + endif() +@@ -2344,16 +2344,37 @@ function(llvm_setup_rpath name) + + if (APPLE) + set(_install_name_dir INSTALL_NAME_DIR "@rpath") +- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath ${extra_libdir}) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) + # $ORIGIN is not interpreted at link time by aix ld. + # Since BUILD_SHARED_LIBS is only recommended for use by developers, + # hardcode the rpath to build/install lib dir first in this mode. + # FIXME: update this when there is better solution. +- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) + elseif(UNIX) +- set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) +- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}") ++ # Note that we add `extra_libdir` (aka `LLVM_LIBRARY_DIR` in our case) back ++ # to `_install_rpath` here. ++ # ++ # In nixpkgs we do not build and install LLVM alongside rdeps of LLVM (i.e. ++ # clang); instead LLVM is its own package and thus lands at its own nix ++ # store path. This makes it so that the default relative rpath (`../lib/`) ++ # does not point at the LLVM shared objects. ++ # ++ # More discussion here: ++ # - https://github.com/NixOS/nixpkgs/pull/235624#discussion_r1220150329 ++ # - https://reviews.llvm.org/D146918 (16.0.5+) ++ # ++ # Note that we leave `extra_libdir` in `_build_rpath`: without FHS there is ++ # no potential that this will result in us pulling in the "wrong" LLVM. ++ # Adding this to the build rpath means we aren't forced to use ++ # `installCheckPhase` instead of `checkPhase` (i.e. binaries in the build ++ # dir, pre-install, will have the right rpath for LLVM). ++ # ++ # As noted in the differential above, an alternative solution is to have ++ # all rdeps of nixpkgs' LLVM (that use the AddLLVM.cmake machinery) set ++ # `CMAKE_INSTALL_RPATH`. ++ set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) ++ set(_install_rpath ${extra_libdir}) + if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") + set_property(TARGET ${name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-z,origin ") +diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake +index 891c9e6d618c..8d963f3b0069 100644 +--- a/cmake/modules/AddOCaml.cmake ++++ b/cmake/modules/AddOCaml.cmake +@@ -147,9 +147,9 @@ function(add_ocaml_library name) + endforeach() + + if( APPLE ) +- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath ${LLVM_LIBRARY_DIR}) + elseif( UNIX ) +- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}") ++ set(ocaml_rpath ${LLVM_LIBRARY_DIR}) + endif() + list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}") + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index d99af79aa38e..21e794224b99 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -127,7 +127,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS + ) + list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) + +-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") ++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}") + set(LLVM_CONFIG_LIBRARY_DIRS + "${LLVM_CONFIG_LIBRARY_DIR}" + # FIXME: Should there be other entries here? +diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in +index 370005cd8d7d..7e790bc52111 100644 +--- a/tools/llvm-config/BuildVariables.inc.in ++++ b/tools/llvm-config/BuildVariables.inc.in +@@ -23,6 +23,7 @@ + #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@" + #define LLVM_BUILDMODE "@LLVM_BUILDMODE@" + #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@" ++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@" + #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@" + #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@" + #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@" +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index e86eb2b44b10..f63e207e792e 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -366,7 +366,11 @@ int main(int argc, char **argv) { + sys::fs::make_absolute(ActivePrefix, Path); + ActiveBinDir = std::string(Path.str()); + } +- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX; ++ { ++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX); ++ sys::fs::make_absolute(ActivePrefix, Path); ++ ActiveLibDir = std::string(Path.str()); ++ } + { + SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR); + sys::fs::make_absolute(ActivePrefix, Path); diff --git a/pkgs/by-name/ll/llvm/git/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/by-name/ll/llvm/git/llvm/lit-shell-script-runner-set-dyld-library-path.patch new file mode 100644 index 0000000..e4f049f --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/lit-shell-script-runner-set-dyld-library-path.patch @@ -0,0 +1,12 @@ +--- a/utils/lit/lit/TestRunner.py 2024-03-15 17:27:53.170780798 -0700 ++++ b/utils/lit/lit/TestRunner.py 2024-03-15 17:28:43.277447791 -0700 +@@ -1183,6 +1183,9 @@ + f.write("@echo on\n") + f.write("\n@if %ERRORLEVEL% NEQ 0 EXIT\n".join(commands)) + else: ++ if "DYLD_LIBRARY_PATH" in test.config.environment: ++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n') ++ + for i, ln in enumerate(commands): + match = re.fullmatch(kPdbgRegex, ln) + if match: diff --git a/pkgs/by-name/ll/llvm/git/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/git/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..d4ccb2a --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,80 @@ +diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py +index 81e8dc04acea..479ff95681e2 100644 +--- a/test/Unit/lit.cfg.py ++++ b/test/Unit/lit.cfg.py +@@ -3,6 +3,7 @@ + # Configuration file for the 'lit' test runner. + + import os ++import platform + import subprocess + + import lit.formats +@@ -55,3 +56,26 @@ if sys.platform in ["win32", "cygwin"] and os.path.isdir(config.shlibdir): + # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. + if sys.platform == "win32" and "SYSTEMDRIVE" in os.environ: + config.environment["SYSTEMDRIVE"] = os.environ["SYSTEMDRIVE"] ++ ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = os.path.pathsep.join( ++ (config.shlibdir, ++ config.environment.get(shlibpath_var, ''))) ++ config.environment[shlibpath_var] = shlibpath ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 75a38b4c5dad..856fc75c9d74 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -42,6 +42,26 @@ llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True) + llvm_config.with_system_environment( + ["HOME", "INCLUDE", "LIB", "TMP", "TEMP"]) + ++# Add the LLVM dynamic libs to the platform-specific loader search path env var: ++# ++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify.. ++def find_shlibpath_var(): ++ if platform.system() in ["Linux", "FreeBSD", "NetBSD", "OpenBSD", "SunOS"]: ++ yield "LD_LIBRARY_PATH" ++ elif platform.system() == "Darwin": ++ yield "DYLD_LIBRARY_PATH" ++ elif platform.system() == "Windows": ++ yield "PATH" ++ elif platform.system() == "AIX": ++ yield "LIBPATH" ++ ++for shlibpath_var in find_shlibpath_var(): ++ shlibpath = config.llvm_shlib_dir ++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True) ++ break ++else: ++ lit_config.warning("unable to inject shared library path on '{}'" ++ .format(platform.system())) + + # Set up OCAMLPATH to include newly built OCaml libraries. + top_ocaml_lib = os.path.join(config.llvm_lib_dir, "ocaml") +@@ -318,7 +338,7 @@ def have_cxx_shared_library(): + + try: + readobj_cmd = subprocess.Popen( +- [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE ++ [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE, env=config.environment + ) + except OSError: + print("could not exec llvm-readobj") + diff --git a/pkgs/by-name/ll/llvm/git/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/by-name/ll/llvm/git/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch new file mode 100644 index 0000000..1354ad2 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch @@ -0,0 +1,24 @@ +diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg +index 41e3a589c61e..09f3b17498b0 100644 +--- a/tools/polly/test/lit.cfg ++++ b/tools/polly/test/lit.cfg +@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']] + path = os.path.pathsep.join(base_paths + config.extra_paths) + config.environment['PATH'] = path + ++# (Copied from polly/test/Unit/lit.cfg) ++if platform.system() == 'Darwin': ++ shlibpath_var = 'DYLD_LIBRARY_PATH' ++elif platform.system() == 'Windows': ++ shlibpath_var = 'PATH' ++else: ++ shlibpath_var = 'LD_LIBRARY_PATH' ++ + path = os.path.pathsep.join((config.llvm_libs_dir, +- config.environment.get('LD_LIBRARY_PATH',''))) +-config.environment['LD_LIBRARY_PATH'] = path ++ config.environment.get(shlibpath_var,''))) ++config.environment[shlibpath_var] = path + + llvm_config.use_default_substitutions() + diff --git a/pkgs/by-name/ll/llvm/git/openmp/fix-find-tool.patch b/pkgs/by-name/ll/llvm/git/openmp/fix-find-tool.patch new file mode 100644 index 0000000..b7f5119 --- /dev/null +++ b/pkgs/by-name/ll/llvm/git/openmp/fix-find-tool.patch @@ -0,0 +1,17 @@ +diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt +index 630947abec7e..9f032dc7bd3f 100644 +--- a/libomptarget/DeviceRTL/CMakeLists.txt ++++ b/libomptarget/DeviceRTL/CMakeLists.txt +@@ -27,10 +27,10 @@ endif() + if (LLVM_DIR) + # Builds that use pre-installed LLVM have LLVM_DIR set. + # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route +- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR}) + find_program(PACKAGER_TOOL clang-offload-packager PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) + find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) +- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) ++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR}) + if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL) OR (NOT PACKAGER_TOOL)) + libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL}, opt: ${OPT_TOOL}, or clang-offload-packager: ${PACKAGER_TOOL}") + return() diff --git a/pkgs/by-name/ll/llvm/git/openmp/run-lit-directly.patch b/pkgs/by-name/ll/llvm/git/openmp/run-lit-directly.patch new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/ll/llvm/multi.nix b/pkgs/by-name/ll/llvm/multi.nix new file mode 100644 index 0000000..136e13b --- /dev/null +++ b/pkgs/by-name/ll/llvm/multi.nix @@ -0,0 +1,60 @@ +{ runCommand, +clang, +gcc64, +gcc32, +glibc_multi +}: + +let + combine = basegcc: runCommand "combine-gcc-libc" {} '' + mkdir -p $out + cp -r ${basegcc.cc}/lib $out/lib + + chmod u+rw -R $out/lib + cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*) + ''; + gcc_multi_sysroot = runCommand "gcc-multi-sysroot" { + passthru = { + inherit (gcc64) version; + lib = gcc_multi_sysroot; + }; + } '' + mkdir -p $out/lib{,64}/gcc + + ln -s ${combine gcc64}/lib/gcc/* $out/lib64/gcc/ + ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/ + # XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown" + ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu + + + # includes + mkdir -p $out/include + ln -s ${glibc_multi.dev}/include/* $out/include + ln -s ${gcc64.cc}/include/c++ $out/include/c++ + + # dynamic linkers + mkdir -p $out/lib/32 + ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib + ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/ + ''; + + clangMulti = clang.override { + # Only used for providing expected structure re:dynamic linkers, AFAIK Most + # of the magic is done by setting the --gcc-toolchain option via + # `gccForLibs`. + libc = gcc_multi_sysroot; + + bintools = clang.bintools.override { + libc = gcc_multi_sysroot; + }; + + gccForLibs = gcc_multi_sysroot // { + inherit (glibc_multi) libgcc; + langCC = + assert (gcc64.cc.langCC != gcc32.cc.langCC) + -> throw "(gcc64.cc.langCC=${gcc64.cc.langCC}) != (gcc32.cc.langCC=${gcc32.cc.langCC})"; + gcc64.cc.langCC; + }; + }; + +in clangMulti diff --git a/pkgs/by-name/ll/llvm/packages.nix b/pkgs/by-name/ll/llvm/packages.nix new file mode 100644 index 0000000..b36ae68 --- /dev/null +++ b/pkgs/by-name/ll/llvm/packages.nix @@ -0,0 +1,162 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + + lld = llvmPackages.lld; + lld_12 = llvmPackages_12.lld; + lld_13 = llvmPackages_13.lld; + lld_14 = llvmPackages_14.lld; + lld_15 = llvmPackages_15.lld; + lld_16 = llvmPackages_16.lld; + lld_17 = llvmPackages_17.lld; + + lldb = llvmPackages.lldb; + lldb_12 = llvmPackages_12.lldb; + lldb_13 = llvmPackages_13.lldb; + lldb_14 = llvmPackages_14.lldb; + lldb_15 = llvmPackages_15.lldb; + lldb_16 = llvmPackages_16.lldb; + lldb_17 = llvmPackages_17.lldb; + + llvm = llvmPackages.llvm; + llvm_12 = llvmPackages_12.llvm; + llvm_13 = llvmPackages_13.llvm; + llvm_14 = llvmPackages_14.llvm; + llvm_15 = llvmPackages_15.llvm; + llvm_16 = llvmPackages_16.llvm; + llvm_17 = llvmPackages_17.llvm; + + mlir_16 = llvmPackages_16.mlir; + mlir_17 = llvmPackages_17.mlir; + + libllvm = llvmPackages.libllvm; + llvm-manpages = llvmPackages.llvm-manpages; + + llvmPackages = + let + # This returns the minimum supported version for the platform. The + # assumption is that or any later version is good. + choose = platform: + /**/ + if platform.isDarwin then 16 + else if platform.isFreeBSD then 12 + else if platform.isAndroid then 12 + else if platform.isLinux then 17 + else if platform.isWasm then 16 + # For unknown systems, assume the latest version is required. + else 17; + # We take the "max of the mins". Why? Since those are lower bounds of the + # supported version set, this is like intersecting those sets and then + # taking the min bound of that. + minSupported = toString (lib.trivial.max (choose stdenv.hostPlatform) (choose + stdenv.targetPlatform)); + in + pkgs.${"llvmPackages_${minSupported}"}; + + llvmPackages_12 = recurseIntoAttrs (callPackage ./12 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_12.tools; + targetLlvmLibraries = targetPackages.llvmPackages_12.libraries or llvmPackages_12.libraries; + targetLlvm = targetPackages.llvmPackages_12.llvm or llvmPackages_12.llvm; + })); + + llvmPackages_13 = recurseIntoAttrs (callPackage ./13 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_13.tools; + targetLlvmLibraries = targetPackages.llvmPackages_13.libraries or llvmPackages_13.libraries; + targetLlvm = targetPackages.llvmPackages_13.llvm or llvmPackages_13.llvm; + stdenv = if stdenv.cc.cc.isGNU or false then gcc12Stdenv else stdenv; # does not build with gcc13 + })); + + llvmPackages_14 = recurseIntoAttrs (callPackage ./14 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_14.tools; + targetLlvmLibraries = targetPackages.llvmPackages_14.libraries or llvmPackages_14.libraries; + targetLlvm = targetPackages.llvmPackages_14.llvm or llvmPackages_14.llvm; + })); + + llvmPackages_15 = recurseIntoAttrs (callPackage ./15 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_15.tools; + targetLlvmLibraries = targetPackages.llvmPackages_15.libraries or llvmPackages_15.libraries; + targetLlvm = targetPackages.llvmPackages_15.llvm or llvmPackages_15.llvm; + })); + + llvmPackages_16 = recurseIntoAttrs (callPackage ./16 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_16.tools; + targetLlvmLibraries = targetPackages.llvmPackages_16.libraries or llvmPackages_16.libraries; + targetLlvm = targetPackages.llvmPackages_16.llvm or llvmPackages_16.llvm; + })); + + llvmPackages_17 = recurseIntoAttrs (callPackage ./17 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_17.tools; + targetLlvmLibraries = targetPackages.llvmPackages_17.libraries or llvmPackages_17.libraries; + targetLlvm = targetPackages.llvmPackages_17.llvm or llvmPackages_17.llvm; + })); + + inherit + (rec { + llvmPackages_18 = recurseIntoAttrs (callPackage ./18 ({ + inherit (stdenvAdapters) overrideCC; + buildLlvmTools = buildPackages.llvmPackages_18.tools; + targetLlvmLibraries = targetPackages.llvmPackages_18.libraries or llvmPackages_18.libraries; + targetLlvm = targetPackages.llvmPackages_18.llvm or llvmPackages_18.llvm; + })); + + clang_18 = llvmPackages_18.clang; + lld_18 = llvmPackages_18.lld; + lldb_18 = llvmPackages_18.lldb; + llvm_18 = llvmPackages_18.llvm; + + # TODO: Fix clang-tools override + # clang-tools_18 = callPackage ../development/tools/clang-tools { + # llvmPackages = llvmPackages_18; + # }; + }) + llvmPackages_18 + clang_18 + lld_18 + lldb_18 + llvm_18 + clang-tools_18; + + wrapClangMulti = clang: + if stdenv.targetPlatform.system == "x86_64-linux" then + callPackage ./multi.nix + { + inherit clang; + gcc32 = pkgsi686Linux.gcc; + gcc64 = pkgs.gcc; + } + else throw "Multilib ${clang.cc.name} not supported for '${stdenv.targetPlatform.system}'"; + clang_multi = wrapClangMulti clang; + + clangMultiStdenv = overrideCC stdenv buildPackages.clang_multi; + libclang = llvmPackages.libclang; + clang-manpages = llvmPackages.clang-manpages; + + clang-sierraHack = clang.override { + name = "clang-wrapper-with-reexport-hack"; + bintools = darwin.binutils.override { + useMacosReexportHack = true; + }; + }; + + clang = llvmPackages.clang; + clang_12 = llvmPackages_12.clang; + clang_13 = llvmPackages_13.clang; + clang_14 = llvmPackages_14.clang; + clang_15 = llvmPackages_15.clang; + clang_16 = llvmPackages_16.clang; + clang_17 = llvmPackages_17.clang; + + #Use this instead of stdenv to build with clang + clangStdenv = if stdenv.cc.isClang then stdenv else lowPrio llvmPackages.stdenv; + clang-sierraHack-stdenv = overrideCC stdenv buildPackages.clang-sierraHack; + libcxxStdenv = if stdenv.isDarwin then stdenv else lowPrio llvmPackages.libcxxStdenv; + +} diff --git a/pkgs/by-name/ll/llvm/update-git.py b/pkgs/by-name/ll/llvm/update-git.py new file mode 100755 index 0000000..9be43e8 --- /dev/null +++ b/pkgs/by-name/ll/llvm/update-git.py @@ -0,0 +1,88 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i python3 -p python3 nix + +import csv +import fileinput +import json +import os +import re +import subprocess +import sys + +from codecs import iterdecode +from datetime import datetime +from urllib.request import urlopen, Request + + +DEFAULT_NIX = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'git/default.nix') + + +def get_latest_chromium_build(): + RELEASES_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms/linux/channels/dev/versions/all/releases?filter=endtime=none&order_by=version%20desc' + print(f'GET {RELEASES_URL}') + with urlopen(RELEASES_URL) as resp: + return json.load(resp)['releases'][0] + + +def get_file_revision(revision, file_path): + """Fetches the requested Git revision of the given Chromium file.""" + url = f'https://raw.githubusercontent.com/chromium/chromium/{revision}/{file_path}' + with urlopen(url) as http_response: + return http_response.read().decode() + + +def get_commit(ref): + url = f'https://api.github.com/repos/llvm/llvm-project/commits/{ref}' + headers = {'Accept': 'application/vnd.github.v3+json'} + request = Request(url, headers=headers) + with urlopen(request) as http_response: + return json.loads(http_response.read().decode()) + + +def get_current_revision(): + """Get the current revision of llvmPackages_git.""" + with open(DEFAULT_NIX) as f: + for line in f: + rev = re.search(r'^ rev = "(.*)";', line) + if rev: + return rev.group(1) + sys.exit(1) + + +def nix_prefetch_url(url, algo='sha256'): + """Prefetches the content of the given URL.""" + print(f'nix-prefetch-url {url}') + out = subprocess.check_output(['nix-prefetch-url', '--type', algo, '--unpack', url]) + return out.decode('utf-8').rstrip() + + +chromium_build = get_latest_chromium_build() +chromium_version = chromium_build['version'] +print(f'chromiumDev version: {chromium_version}') +print('Getting LLVM commit...') +clang_update_script = get_file_revision(chromium_version, 'tools/clang/scripts/update.py') +clang_revision = re.search(r"^CLANG_REVISION = '(.+)'$", clang_update_script, re.MULTILINE).group(1) +clang_commit_short = re.search(r"llvmorg-[0-9]+-init-[0-9]+-g([0-9a-f]{8})", clang_revision).group(1) +release_version = re.search(r"^RELEASE_VERSION = '(.+)'$", clang_update_script, re.MULTILINE).group(1) +commit = get_commit(clang_commit_short) +if get_current_revision() == commit["sha"]: + print('No new update available.') + sys.exit(0) +date = datetime.fromisoformat(commit['commit']['committer']['date'].rstrip('Z')).date().isoformat() +version = f'unstable-{date}' +print('Prefetching source tarball...') +hash = nix_prefetch_url(f'https://github.com/llvm/llvm-project/archive/{commit["sha"]}.tar.gz') +print('Updating default.nix...') +with fileinput.FileInput(DEFAULT_NIX, inplace=True) as f: + for line in f: + if match := re.search(r'^ rev-version = "unstable-(.+)";', line): + old_date = match.group(1) + result = re.sub(r'^ version = ".+";', f' version = "{release_version}";', line) + result = re.sub(r'^ rev = ".*";', f' rev = "{commit["sha"]}";', result) + result = re.sub(r'^ rev-version = ".+";', f' rev-version = "{version}";', result) + result = re.sub(r'^ sha256 = ".+";', f' sha256 = "{hash}";', result) + print(result, end='') +# Commit the result: +commit_message = f"llvmPackages_git: {old_date} -> {date}" +subprocess.run(['git', 'add', DEFAULT_NIX], check=True) +subprocess.run(['git', 'commit', '--file=-'], input=commit_message.encode(), check=True) diff --git a/pkgs/by-name/ll/llvm/update.sh b/pkgs/by-name/ll/llvm/update.sh new file mode 100755 index 0000000..95ad356 --- /dev/null +++ b/pkgs/by-name/ll/llvm/update.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -eu + +# Example usage: ./pkgs/development/compilers/llvm/update.sh 12.0.0-rc4 + +readonly VERSION="$1" +readonly VERSION_MAJOR="${VERSION%%.*}" +readonly VERSION_MAIN="${VERSION%%-*}" +declare VERSION_PATCH="${VERSION/$VERSION_MAIN/}" +readonly VERSION_PATCH="${VERSION_PATCH/-/}" + +readonly DIR="pkgs/development/compilers/llvm/$VERSION_MAJOR" +readonly FILE="$DIR/default.nix" + +sed -Ei \ + -e "s/release_version = \".+\";/release_version = \"$VERSION_MAIN\";/" \ + -e "s/candidate = \".*\";/candidate = \"$VERSION_PATCH\";/" \ + "$FILE" + +readonly ATTRSET="llvmPackages_$VERSION_MAJOR" + +if [ "$VERSION_MAJOR" -ge "14" ]; then + readonly SOURCES=( + "llvm.monorepoSrc" + ) +elif [ "$VERSION_MAJOR" -eq "13" ]; then + readonly SOURCES=( + "llvm.src" + ) +else + readonly SOURCES=( + "clang-unwrapped.src" + "compiler-rt.src" + "clang-unwrapped.clang-tools-extra_src" + "libcxx.src" + "libcxxabi.src" + "libunwind.src" + "lld.src" + "lldb.src" + "llvm.src" + "llvm.polly_src" + "openmp.src" + ) +fi + +for SOURCE in "${SOURCES[@]}"; do + echo "Updating the hash of $SOURCE:" + declare ATTR="$ATTRSET.$SOURCE" + declare OLD_HASH="$(nix --extra-experimental-features nix-command eval -f . $ATTR.outputHash)" + declare NEW_HASH="\"$(nix-prefetch-url -A $ATTR)\"" + find "$DIR" -type f -exec sed -i "s/$OLD_HASH/$NEW_HASH/" {} + +done + +echo OK diff --git a/pkgs/by-name/lo/lowdown/default.nix b/pkgs/by-name/lo/lowdown/default.nix new file mode 100644 index 0000000..2c659ef --- /dev/null +++ b/pkgs/by-name/lo/lowdown/default.nix @@ -0,0 +1,93 @@ +{ lib, stdenv, fetchurl, fixDarwinDylibNames, which, dieHook +, enableShared ? !stdenv.hostPlatform.isStatic +, enableStatic ? stdenv.hostPlatform.isStatic +# for passthru.tests +# , nix +}: + +stdenv.mkDerivation rec { + pname = "lowdown"; + version = "1.1.0"; + + outputs = [ "out" "lib" "dev" "man" ]; + + src = fetchurl { + url = "https://kristaps.bsd.lv/lowdown/snapshots/lowdown-${version}.tar.gz"; + hash = "sha512-EpAWTz7Zy+2qqJGgzLrt0tK7WEZ+hHbdyqzAmMiaqc6uNXscR88git6/UbTjvB9Yanvetvw9huSuyhcORCEIug=="; + }; + + nativeBuildInputs = [ which dieHook ] + ++ lib.optionals stdenv.isDarwin [ fixDarwinDylibNames ]; + + preConfigure = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' + echo 'HAVE_SANDBOX_INIT=0' > configure.local + ''; + + configurePhase = '' + runHook preConfigure + ./configure PREFIX=''${!outputDev} \ + BINDIR=''${!outputBin}/bin \ + LIBDIR=''${!outputLib}/lib \ + MANDIR=''${!outputMan}/share/man + runHook postConfigure + ''; + + makeFlags = [ + "bins" # prevents shared object from being built unnecessarily + ]; + + installTargets = [ + "install" + ] ++ lib.optionals enableShared [ + "install_shared" + ] ++ lib.optionals enableStatic [ + "install_static" + ]; + + postInstall = + let + soVersion = "1"; + in + + # Check that soVersion is up to date even if we are not on darwin + lib.optionalString (enableShared && !stdenv.isDarwin) '' + test -f $lib/lib/liblowdown.so.${soVersion} || \ + die "postInstall: expected $lib/lib/liblowdown.so.${soVersion} is missing" + '' + # Fix lib extension so that fixDarwinDylibNames detects it, see + # . + + lib.optionalString (enableShared && stdenv.isDarwin) '' + darwinDylib="$lib/lib/liblowdown.${soVersion}.dylib" + mv "$lib/lib/liblowdown.so.${soVersion}" "$darwinDylib" + + # Make sure we are re-creating a symbolic link here + test -L "$lib/lib/liblowdown.so" || \ + die "postInstall: expected $lib/lib/liblowdown.so to be a symlink" + ln -s "$darwinDylib" "$lib/lib/liblowdown.dylib" + rm "$lib/lib/liblowdown.so" + ''; + + doInstallCheck = true; + installCheckPhase = '' + runHook preInstallCheck + echo '# TEST' > test.md + $out/bin/lowdown test.md + runHook postInstallCheck + ''; + + doCheck = true; + checkTarget = "regress"; + + # passthru.tests = { + # # most important consumer in nixpkgs + # inherit nix; + # }; + + meta = with lib; { + homepage = "https://kristaps.bsd.lv/lowdown/"; + description = "Simple markdown translator"; + license = licenses.isc; + maintainers = [ maintainers.sternenseemann ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ls/lsof/default.nix b/pkgs/by-name/ls/lsof/default.nix new file mode 100644 index 0000000..4cce674 --- /dev/null +++ b/pkgs/by-name/ls/lsof/default.nix @@ -0,0 +1,69 @@ +{ lib, stdenv, fetchFromGitHub, buildPackages, perl, which, ncurses, nukeReferences }: + +let + dialect = with lib; last (splitString "-" stdenv.hostPlatform.system); +in + +stdenv.mkDerivation rec { + pname = "lsof"; + version = "4.99.3"; + + src = fetchFromGitHub { + owner = "lsof-org"; + repo = "lsof"; + rev = version; + hash = "sha256-XW3l+E9D8hgI9jGJGKkIAKa8O9m0JHgZhEASqg4gYuw="; + }; + + postPatch = '' + patchShebangs --build lib/dialects/*/Mksrc + # Do not re-build version.h in every 'make' to allow nuke-refs below. + # We remove phony 'FRC' target that forces rebuilds: + # 'version.h: FRC ...' is translated to 'version.h: ...'. + sed -i lib/dialects/*/Makefile -e 's/version.h:\s*FRC/version.h:/' + '' + lib.optionalString stdenv.isDarwin '' + sed -i 's|lcurses|lncurses|g' Configure + ''; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ nukeReferences perl which ]; + buildInputs = [ ncurses ]; + + # Stop build scripts from searching global include paths + LSOF_INCLUDE = "${lib.getDev stdenv.cc.libc}/include"; + configurePhase = "LINUX_CONF_CC=$CC_FOR_BUILD LSOF_CC=$CC LSOF_AR=\"$AR cr\" LSOF_RANLIB=$RANLIB ./Configure -n ${dialect}"; + + preBuild = '' + for filepath in $(find dialects/${dialect} -type f); do + sed -i "s,/usr/include,$LSOF_INCLUDE,g" $filepath + done + + # Wipe out development-only flags from CFLAGS embedding + make version.h + nuke-refs version.h + ''; + + installPhase = '' + # Fix references from man page https://github.com/lsof-org/lsof/issues/66 + substituteInPlace Lsof.8 \ + --replace ".so ./00DIALECTS" "" \ + --replace ".so ./version" ".ds VN ${version}" + mkdir -p $out/bin $out/man/man8 + cp Lsof.8 $out/man/man8/lsof.8 + cp lsof $out/bin + ''; + + meta = with lib; { + homepage = "https://github.com/lsof-org/lsof"; + description = "A tool to list open files"; + mainProgram = "lsof"; + longDescription = '' + List open files. Can show what process has opened some file, + socket (IPv6/IPv4/UNIX local), or partition (by opening a file + from it). + ''; + license = licenses.purdueBsd; + maintainers = with maintainers; [ dezgeg ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ly/lynx/default.nix b/pkgs/by-name/ly/lynx/default.nix new file mode 100644 index 0000000..a31dc94 --- /dev/null +++ b/pkgs/by-name/ly/lynx/default.nix @@ -0,0 +1,58 @@ +{ lib +, stdenv +, buildPackages +, fetchurl +, pkg-config +, ncurses +, gzip +, sslSupport ? true +, openssl +, nukeReferences +, fetchpatch +}: + +stdenv.mkDerivation rec { + pname = "lynx"; + version = "2.9.0dev.12"; + + src = fetchurl { + urls = [ + "ftp://ftp.invisible-island.net/lynx/tarballs/lynx${version}.tar.bz2" + "https://invisible-mirror.net/archives/lynx/tarballs/lynx${version}.tar.bz2" + ]; + hash = "sha256-pkVbFZ0Ad22OwQUShcly3B8MVS0FcaDP8Coj7BRu6OU="; + }; + + enableParallelBuilding = true; + + hardeningEnable = [ "pie" ]; + + configureFlags = [ + "--enable-default-colors" + "--enable-widec" + "--enable-ipv6" + ] ++ lib.optional sslSupport "--with-ssl"; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ nukeReferences ] + ++ lib.optional sslSupport pkg-config; + + buildInputs = [ ncurses gzip ] + ++ lib.optional sslSupport openssl; + + # cfg_defs.h captures lots of references to build-only dependencies, derived + # from config.cache. + postConfigure = '' + make cfg_defs.h + nuke-refs cfg_defs.h + ''; + + meta = with lib; { + description = "A text-mode web browser"; + homepage = "https://lynx.invisible-island.net/"; + mainProgram = "lynx"; + maintainers = with maintainers; [ ]; + license = licenses.gpl2Plus; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/lz/lzip/default.nix b/pkgs/by-name/lz/lzip/default.nix new file mode 100644 index 0000000..82052ba --- /dev/null +++ b/pkgs/by-name/lz/lzip/default.nix @@ -0,0 +1,42 @@ +{ lib, stdenv, fetchurl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "lzip"; + version = "1.24.1"; + outputs = [ "out" "man" "info" ]; + + src = fetchurl { + url = "mirror://savannah/lzip/${pname}-${version}.tar.gz"; + hash = "sha256-MMnLagYF9HnElsN262KaSLChaW0WfjweCQxd76SBsWI="; + }; + + patches = lib.optionals stdenv.hostPlatform.isMinGW [ + ./mingw-install-exe-file.patch + ]; + + configureFlags = [ + "CPPFLAGS=-DNDEBUG" + "CFLAGS=-O3" + "CXXFLAGS=-O3" + "CXX=${stdenv.cc.targetPrefix}c++" + ]; + + setupHook = ./lzip-setup-hook.sh; + + doCheck = true; + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://www.nongnu.org/lzip/lzip.html"; + description = "A lossless data compressor based on the LZMA algorithm"; + license = lib.licenses.gpl2Plus; + maintainers = with maintainers; [ vlaci ]; + platforms = lib.platforms.all; + mainProgram = "lzip"; + }; +} diff --git a/pkgs/by-name/lz/lzip/lzip-setup-hook.sh b/pkgs/by-name/lz/lzip/lzip-setup-hook.sh new file mode 100644 index 0000000..092ad77 --- /dev/null +++ b/pkgs/by-name/lz/lzip/lzip-setup-hook.sh @@ -0,0 +1,5 @@ +lzipUnpackCmdHook() { + [[ "$1" = *.tar.lz ]] && tar --lzip -xf "$1" +} + +unpackCmdHooks+=(lzipUnpackCmdHook) diff --git a/pkgs/by-name/lz/lzip/mingw-install-exe-file.patch b/pkgs/by-name/lz/lzip/mingw-install-exe-file.patch new file mode 100644 index 0000000..b2b4b2b --- /dev/null +++ b/pkgs/by-name/lz/lzip/mingw-install-exe-file.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile.in b/Makefile.in +index d07ad5a..1c15203 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -64,7 +64,7 @@ install-strip-compress : install-bin-strip install-info-compress install-man-com + + install-bin : all + if [ ! -d "$(DESTDIR)$(bindir)" ] ; then $(INSTALL_DIR) "$(DESTDIR)$(bindir)" ; fi +- $(INSTALL_PROGRAM) ./$(progname) "$(DESTDIR)$(bindir)/$(progname)" ++ $(INSTALL_PROGRAM) ./$(progname).exe "$(DESTDIR)$(bindir)/$(progname).exe" + + install-bin-strip : all + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install-bin diff --git a/pkgs/by-name/lz/lzo/default.nix b/pkgs/by-name/lz/lzo/default.nix new file mode 100644 index 0000000..480e2bb --- /dev/null +++ b/pkgs/by-name/lz/lzo/default.nix @@ -0,0 +1,37 @@ +{lib, stdenv, fetchurl}: + +stdenv.mkDerivation rec { + pname = "lzo"; + version = "2.10"; + + src = fetchurl { + url = "https://www.oberhumer.com/opensource/lzo/download/${pname}-${version}.tar.gz"; + sha256 = "0wm04519pd3g8hqpjqhfr72q8qmbiwqaxcs3cndny9h86aa95y60"; + }; + + configureFlags = lib.optional (!stdenv.hostPlatform.isStatic) "--enable-shared" ; + + enableParallelBuilding = true; + + doCheck = true; # not cross; + + strictDeps = true; + + meta = with lib; { + description = "Real-time data (de)compression library"; + longDescription = '' + LZO is a portable lossless data compression library written in ANSI C. + Both the source code and the compressed data format are designed to be + portable across platforms. + LZO offers pretty fast compression and *extremely* fast decompression. + While it favours speed over compression ratio, it includes slower + compression levels achieving a quite competitive compression ratio + while still decompressing at this very high speed. + ''; + + homepage = "http://www.oberhumer.com/opensource/lzo"; + license = licenses.gpl2Plus; + + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/ma/mailcap/default.nix b/pkgs/by-name/ma/mailcap/default.nix new file mode 100644 index 0000000..06c8047 --- /dev/null +++ b/pkgs/by-name/ma/mailcap/default.nix @@ -0,0 +1,32 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "mailcap"; + version = "2.1.53"; + + src = fetchurl { + url = "https://releases.pagure.org/mailcap/mailcap-${version}.tar.xz"; + sha256 = "sha256-Xuou8XswSXe6PsuHr61DGfoEQPgl5Pb7puj6L/64h4U="; + }; + + installPhase = '' + runHook preInstall + + substituteInPlace mailcap --replace "/usr/bin/" "" + sh generate-nginx-mimetypes.sh < mime.types > nginx-mime.types + + install -D -m0644 nginx-mime.types $out/etc/nginx/mime.types + install -D -m0644 -t $out/etc mailcap mime.types + install -D -m0644 -t $out/share/man/man5 mailcap.5 + + runHook postInstall + ''; + + meta = with lib; { + description = "Helper application and MIME type associations for file types"; + homepage = "https://pagure.io/mailcap"; + license = licenses.mit; + maintainers = with maintainers; [ c0bw3b ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/ma/man-db/default.nix b/pkgs/by-name/ma/man-db/default.nix new file mode 100644 index 0000000..846c0c3 --- /dev/null +++ b/pkgs/by-name/ma/man-db/default.nix @@ -0,0 +1,98 @@ +{ buildPackages +, db +, fetchurl +, groff +, gzip +, lib +, libiconv +, libpipeline +, makeWrapper +, pkg-config +, stdenv +, zstd +, autoreconfHook +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation rec { + pname = "man-db"; + version = "2.12.1"; + + src = fetchurl { + url = "mirror://savannah/man-db/man-db-${version}.tar.xz"; + hash = "sha256-3e4kna63jPkrq3lMzQacyLV1mSJl6iDiOeiHFW6IAmU="; + }; + + outputs = [ "out" "doc" ]; + outputMan = "out"; # users will want `man man` to work + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook groff makeWrapper pkg-config zstd ]; + buildInputs = [ libpipeline db groff ]; # (Yes, 'groff' is both native and build input) + nativeCheckInputs = [ libiconv /* for 'iconv' binary */ ]; + + patches = [ + ./systemwide-man-db-conf.patch + ]; + + postPatch = '' + # Remove all mandatory manpaths. Nixpkgs makes no requirements on + # these directories existing. + sed -i 's/^MANDATORY_MANPATH/# &/' src/man_db.conf.in + + # Add Nix-related manpaths + echo "MANPATH_MAP /nix/var/nix/profiles/default/bin /nix/var/nix/profiles/default/share/man" >> src/man_db.conf.in + + # Add mandb locations for the above + echo "MANDB_MAP /nix/var/nix/profiles/default/share/man /var/cache/man/nixpkgs" >> src/man_db.conf.in + ''; + + configureFlags = [ + "--disable-setuid" + "--disable-cache-owner" + "--localstatedir=/var" + "--with-config-file=${placeholder "out"}/etc/man_db.conf" + "--with-systemdtmpfilesdir=${placeholder "out"}/lib/tmpfiles.d" + "--with-systemdsystemunitdir=${placeholder "out"}/lib/systemd/system" + "--with-pager=less" + ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ + "ac_cv_func__set_invalid_parameter_handler=no" + "ac_cv_func_posix_fadvise=no" + "ac_cv_func_mempcpy=no" + ]; + + preConfigure = '' + configureFlagsArray+=("--with-sections=1 n l 8 3 0 2 5 4 9 6 7") + ''; + + postInstall = '' + # apropos/whatis uses program name to decide whether to act like apropos or whatis + # (multi-call binary). `apropos` is actually just a symlink to whatis. So we need to + # make sure that we don't wrap symlinks (since that changes argv[0] to the -wrapped name) + find "$out/bin" -type f | while read file; do + wrapProgram "$file" \ + --prefix PATH : "${lib.makeBinPath [ groff gzip zstd ]}" + done + ''; + + disallowedReferences = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + buildPackages.groff + ]; + + enableParallelBuilding = true; + + doCheck = !stdenv.hostPlatform.isMusl /* iconv binary */; + + # passthru.tests = { + # nixos = nixosTests.man; + # }; + + meta = with lib; { + homepage = "http://man-db.nongnu.org"; + description = "An implementation of the standard Unix documentation system accessed using the man command"; + license = licenses.gpl2; + platforms = lib.platforms.unix; + mainProgram = "man"; + }; +} diff --git a/pkgs/by-name/ma/man-db/packages.nix b/pkgs/by-name/ma/man-db/packages.nix new file mode 100644 index 0000000..70423b2 --- /dev/null +++ b/pkgs/by-name/ma/man-db/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + man = man-db; + man-db = callPackage ./. { }; +} diff --git a/pkgs/by-name/ma/man-db/systemwide-man-db-conf.patch b/pkgs/by-name/ma/man-db/systemwide-man-db-conf.patch new file mode 100644 index 0000000..2d44777 --- /dev/null +++ b/pkgs/by-name/ma/man-db/systemwide-man-db-conf.patch @@ -0,0 +1,39 @@ +commit 9089291006a4258c39c75a920ad536b61504251a +Author: rnhmjoj +Date: Fri May 1 19:32:15 2020 +0200 + + check for systemwide man_db.conf before the bundled one + +diff --git a/src/manp.c b/src/manp.c +index 5441339..0bbf566 100644 +--- a/src/manp.c ++++ b/src/manp.c +@@ -841,18 +841,24 @@ void read_config_file (bool optional) + } + + if (getenv ("MAN_TEST_DISABLE_SYSTEM_CONFIG") == NULL) { +- config_file = fopen (CONFIG_FILE, "r"); ++ const char *config_filepath; ++ if (access ("/etc/man_db.conf", F_OK) != -1) { ++ config_filepath = "/etc/man_db.conf"; ++ } else { ++ config_filepath = CONFIG_FILE; ++ } ++ config_file = fopen (config_filepath, "r"); + if (config_file == NULL) { + if (optional) + debug ("can't open %s; continuing anyway\n", +- CONFIG_FILE); ++ config_filepath); + else + error (FAIL, 0, + _("can't open the manpath " + "configuration file %s"), +- CONFIG_FILE); ++ config_filepath); + } else { +- debug ("From the config file %s:\n", CONFIG_FILE); ++ debug ("From the config file %s:\n", config_filepath); + + add_to_dirlist (config_file, 0); + fclose (config_file); diff --git a/pkgs/by-name/ma/maturin/default.nix b/pkgs/by-name/ma/maturin/default.nix new file mode 100644 index 0000000..f7c213c --- /dev/null +++ b/pkgs/by-name/ma/maturin/default.nix @@ -0,0 +1,46 @@ +{ callPackage +, lib +, stdenv +, fetchFromGitHub +, rustPlatform +, libiconv +, Security +}: + +rustPlatform.buildRustPackage rec { + pname = "maturin"; + version = "1.5.1"; + + src = fetchFromGitHub { + owner = "PyO3"; + repo = "maturin"; + rev = "v${version}"; + hash = "sha256-3rID2epV1pCwpofFf9Wuafs1SlBWH7e7/4HPaSUAriQ="; + }; + + cargoHash = "sha256-hPyPMQm/Oege0PPjYIrd1fEDOGqoQ1ffS2l6o8je4t4="; + + buildInputs = lib.optionals stdenv.isDarwin [ Security libiconv ]; + + # Requires network access, fails in sandbox. + doCheck = false; + + passthru.tests.pyo3 = callPackage ./pyo3-test {}; + + meta = with lib; { + description = "Build and publish Rust crates Python packages"; + mainProgram = "maturin"; + longDescription = '' + Build and publish Rust crates with PyO3, rust-cpython, and + cffi bindings as well as Rust binaries as Python packages. + + This project is meant as a zero-configuration replacement for + setuptools-rust and Milksnake. It supports building wheels for + Python and can upload them to PyPI. + ''; + homepage = "https://github.com/PyO3/maturin"; + changelog = "https://github.com/PyO3/maturin/blob/v${version}/Changelog.md"; + license = with licenses; [ asl20 /* or */ mit ]; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/ma/maturin/packages.nix b/pkgs/by-name/ma/maturin/packages.nix new file mode 100644 index 0000000..9a1d75b --- /dev/null +++ b/pkgs/by-name/ma/maturin/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + maturin = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/ma/maturin/pyo3-test/Cargo.lock b/pkgs/by-name/ma/maturin/pyo3-test/Cargo.lock new file mode 100644 index 0000000..5e698d4 --- /dev/null +++ b/pkgs/by-name/ma/maturin/pyo3-test/Cargo.lock @@ -0,0 +1,682 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "ahash" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" + +[[package]] +name = "assert_approx_eq" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c07dab4369547dbe5114677b33fbbf724971019f3818172d59a97a61c774ffd" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "byteorder" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const_fn" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" + +[[package]] +name = "crossbeam-channel" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +dependencies = [ + "cfg-if", + "const_fn", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "ctor" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "ghost" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +dependencies = [ + "ahash", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f" +dependencies = [ + "ctor", + "ghost", + "inventory-impl", +] + +[[package]] +name = "inventory-impl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "lock_api" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "memoffset" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num-bigint" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a41747ae4633fce5adffb4d2e81ffc5e89593cb19917f8fb2cc5ff76507bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "paste" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" +dependencies = [ + "paste-impl", + "proc-macro-hack", +] + +[[package]] +name = "paste-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" +dependencies = [ + "proc-macro-hack", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proptest" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12e6c80c1139113c28ee4670dc50cc42915228b51f56a9e407f0ec60f966646f" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "num-traits", + "quick-error", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", +] + +[[package]] +name = "pyo3" +version = "0.13.2" +dependencies = [ + "assert_approx_eq", + "cfg-if", + "ctor", + "hashbrown", + "indoc", + "inventory", + "libc", + "num-bigint", + "num-complex", + "parking_lot", + "paste", + "proptest", + "pyo3", + "pyo3-macros", + "rustversion", + "serde", + "serde_json", + "trybuild", + "unindent", +] + +[[package]] +name = "pyo3-macros" +version = "0.13.2" +dependencies = [ + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.13.2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_xorshift" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex-syntax" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" + +[[package]] +name = "rustapi-module" +version = "0.1.0" +dependencies = [ + "pyo3", +] + +[[package]] +name = "rustversion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "trybuild" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99471a206425fba51842a9186315f32d91c56eadc21ea4c21f847b59cf778f8b" +dependencies = [ + "glob", + "lazy_static", + "serde", + "serde_json", + "termcolor", + "toml", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "word-count" +version = "0.1.0" +dependencies = [ + "pyo3", + "rayon", +] diff --git a/pkgs/by-name/ma/maturin/pyo3-test/default.nix b/pkgs/by-name/ma/maturin/pyo3-test/default.nix new file mode 100644 index 0000000..7f79c85 --- /dev/null +++ b/pkgs/by-name/ma/maturin/pyo3-test/default.nix @@ -0,0 +1,12 @@ +{ python3 +, rustPlatform +}: + +python3.pkgs.callPackage ./generic.nix { + buildAndTestSubdir = "examples/word-count"; + + nativeBuildInputs = with rustPlatform; [ + cargoSetupHook + maturinBuildHook + ]; +} diff --git a/pkgs/by-name/ma/maturin/pyo3-test/generic.nix b/pkgs/by-name/ma/maturin/pyo3-test/generic.nix new file mode 100644 index 0000000..7bc7e8d --- /dev/null +++ b/pkgs/by-name/ma/maturin/pyo3-test/generic.nix @@ -0,0 +1,45 @@ +# Derivation prototype, used by maturin and setuptools-rust +# passthrough tests. + +{ lib +, fetchFromGitHub +, python +, rustPlatform + +, nativeBuildInputs + +, buildAndTestSubdir ? null +, format ? "pyproject" +, preConfigure ? "" +}: + +python.pkgs.buildPythonPackage rec { + pname = "word-count"; + version = "0.13.2"; + + src = fetchFromGitHub { + owner = "PyO3"; + repo = "pyo3"; + rev = "v${version}"; + hash = "sha256-NOMrrfo8WjlPhtGxWUOPJS/UDDdbLQRCXR++Zd6JmIA="; + }; + + cargoDeps = rustPlatform.importCargoLock { + lockFile = ./Cargo.lock; + }; + + postPatch = '' + ln -s ${./Cargo.lock} Cargo.lock + ''; + + inherit buildAndTestSubdir format nativeBuildInputs preConfigure; + + pythonImportsCheck = [ "word_count" ]; + + meta = with lib; { + description = "PyO3 word count example"; + homepage = "https://github.com/PyO3/pyo3"; + license = licenses.asl20; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/mc/mcpp/default.nix b/pkgs/by-name/mc/mcpp/default.nix new file mode 100644 index 0000000..9db55e2 --- /dev/null +++ b/pkgs/by-name/mc/mcpp/default.nix @@ -0,0 +1,31 @@ +{ lib +, stdenv +, fetchFromGitHub +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "mcpp"; + version = "2.7.2.1"; + + src = fetchFromGitHub { + owner = "museoa"; + repo = "mcpp"; + rev = finalAttrs.version; + hash= "sha256-T4feegblOeG+NU+c+PAobf8HT8KDSfcINkRAa1hNpkY="; + }; + + patches = [ + ./readlink.patch + ]; + + configureFlags = [ "--enable-mcpplib" ]; + + meta = with lib; { + homepage = "https://github.com/museoa/mcpp"; + description = "Matsui's C preprocessor"; + mainProgram = "mcpp"; + license = licenses.bsd2; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/mc/mcpp/readlink.patch b/pkgs/by-name/mc/mcpp/readlink.patch new file mode 100644 index 0000000..0f5fc6d --- /dev/null +++ b/pkgs/by-name/mc/mcpp/readlink.patch @@ -0,0 +1,24 @@ +From 1c4b0f26614bff331eb8a9f2b514309af6f31fd0 Mon Sep 17 00:00:00 2001 +From: Jose +Date: Mon, 26 Jun 2023 16:43:43 +0200 +Subject: [PATCH] Add 'unistd' header for readlink (#8) + +--- + src/system.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/system.c b/src/system.c +index a3501f9..646caf6 100644 +--- a/src/system.c ++++ b/src/system.c +@@ -37,6 +37,11 @@ + * 2. append the system-dependent routines in this file. + */ ++ ++#ifndef _MSC_VER ++# include // For readlink() ++#endif ++ + #if PREPROCESSED + #include "mcpp.H" + #else diff --git a/pkgs/by-name/md/mdbook-linkcheck/default.nix b/pkgs/by-name/md/mdbook-linkcheck/default.nix new file mode 100644 index 0000000..b8d19d0 --- /dev/null +++ b/pkgs/by-name/md/mdbook-linkcheck/default.nix @@ -0,0 +1,34 @@ +{ lib, stdenv, fetchFromGitHub, rustPlatform, pkg-config, openssl, Security +, testers, mdbook-linkcheck }: + +rustPlatform.buildRustPackage rec { + pname = "mdbook-linkcheck"; + version = "0.7.7"; + + src = fetchFromGitHub { + owner = "Michael-F-Bryan"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-ZbraChBHuKAcUA62EVHZ1RygIotNEEGv24nhSPAEj00="; + }; + + cargoSha256 = "sha256-AwixlCL5ZcLgj9wYeBvkSy2U6J8alXf488l8DMn73w4="; + + buildInputs = if stdenv.isDarwin then [ Security ] else [ openssl ]; + + nativeBuildInputs = lib.optionals (!stdenv.isDarwin) [ pkg-config ]; + + OPENSSL_NO_VENDOR = 1; + + doCheck = false; # tries to access network to test broken web link functionality + + passthru.tests.version = testers.testVersion { package = mdbook-linkcheck; }; + + meta = with lib; { + description = "A backend for `mdbook` which will check your links for you"; + mainProgram = "mdbook-linkcheck"; + homepage = "https://github.com/Michael-F-Bryan/mdbook-linkcheck"; + license = licenses.mit; + maintainers = with maintainers; [ zhaofengli matthiasbeyer ]; + }; +} diff --git a/pkgs/by-name/md/mdbook-linkcheck/packages.nix b/pkgs/by-name/md/mdbook-linkcheck/packages.nix new file mode 100644 index 0000000..6a43971 --- /dev/null +++ b/pkgs/by-name/md/mdbook-linkcheck/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + mdbook-linkcheck = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/md/mdbook/default.nix b/pkgs/by-name/md/mdbook/default.nix new file mode 100644 index 0000000..4939cfc --- /dev/null +++ b/pkgs/by-name/md/mdbook/default.nix @@ -0,0 +1,41 @@ +{ lib, stdenv, fetchFromGitHub, nix, rustPlatform, CoreServices, installShellFiles }: + +rustPlatform.buildRustPackage rec { + pname = "mdbook"; + version = "0.4.37"; + + src = fetchFromGitHub { + owner = "rust-lang"; + repo = "mdBook"; + rev = "refs/tags/v${version}"; + sha256 = "sha256-A8ZSqIG+rGKwggs9ogvbMIi9gClFKe8gS6D5W426ebc="; + }; + + cargoHash = "sha256-8GQM4pHiFbyoRkOx3SXuIV118ndzL+O+eA+Gd2jbsdI="; + + nativeBuildInputs = [ installShellFiles ]; + + buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ]; + + postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' + installShellCompletion --cmd mdbook \ + --bash <($out/bin/mdbook completions bash) \ + --fish <($out/bin/mdbook completions fish) \ + --zsh <($out/bin/mdbook completions zsh ) + ''; + + passthru = { + tests = { + inherit nix; + }; + }; + + meta = with lib; { + description = "Create books from MarkDown"; + mainProgram = "mdbook"; + homepage = "https://github.com/rust-lang/mdBook"; + changelog = "https://github.com/rust-lang/mdBook/blob/v${version}/CHANGELOG.md"; + license = [ licenses.mpl20 ]; + maintainers = with maintainers; [ havvy Frostman matthiasbeyer ]; + }; +} diff --git a/pkgs/by-name/md/mdbook/packages.nix b/pkgs/by-name/md/mdbook/packages.nix new file mode 100644 index 0000000..8955cac --- /dev/null +++ b/pkgs/by-name/md/mdbook/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + mdbook = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) CoreServices; + }; +} diff --git a/pkgs/by-name/me/memstream/default.nix b/pkgs/by-name/me/memstream/default.nix new file mode 100644 index 0000000..90505a5 --- /dev/null +++ b/pkgs/by-name/me/memstream/default.nix @@ -0,0 +1,43 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "memstream"; + version = "0.1"; + + src = fetchurl { + url = "https://piumarta.com/software/memstream/memstream-${version}.tar.gz"; + sha256 = "0kvdb897g7nyviaz72arbqijk2g2wa61cmi3l5yh48rzr49r3a3a"; + }; + + dontConfigure = true; + + postBuild = '' + $AR rcs libmemstream.a memstream.o + ''; + + doCheck = true; + checkPhase = '' + runHook preCheck + + ./test | grep "This is a test of memstream" + + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + + install -D libmemstream.a "$out"/lib/libmemstream.a + install -D memstream.h "$out"/include/memstream.h + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://www.piumarta.com/software/memstream/"; + description = "memstream.c is an implementation of the POSIX function open_memstream() for BSD and BSD-like operating systems"; + license = licenses.mit; + maintainers = with maintainers; [ veprbl ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/me/memstream/packages.nix b/pkgs/by-name/me/memstream/packages.nix new file mode 100644 index 0000000..f238576 --- /dev/null +++ b/pkgs/by-name/me/memstream/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + memstream = callPackage ./. { }; + memstreamHook = makeSetupHook { + name = "memstream-hook"; + propagatedBuildInputs = [ memstream ]; + } ./setup-hook.sh; +} diff --git a/pkgs/by-name/me/memstream/setup-hook.sh b/pkgs/by-name/me/memstream/setup-hook.sh new file mode 100644 index 0000000..09aabe7 --- /dev/null +++ b/pkgs/by-name/me/memstream/setup-hook.sh @@ -0,0 +1,6 @@ +useMemstream () { + export NIX_CFLAGS_COMPILE="${NIX_CFLAGS_COMPILE-}${NIX_CFLAGS_COMPILE:+ }-include memstream.h"; + export NIX_LDFLAGS="${NIX_LDFLAGS-}${NIX_LDFLAGS:+ }-lmemstream"; +} + +postHooks+=(useMemstream) diff --git a/pkgs/by-name/me/mercurial/default.nix b/pkgs/by-name/me/mercurial/default.nix new file mode 100644 index 0000000..a5a5b2b --- /dev/null +++ b/pkgs/by-name/me/mercurial/default.nix @@ -0,0 +1,228 @@ +{ lib, stdenv, fetchurl, fetchpatch, python3Packages, makeWrapper, gettext, installShellFiles +, re2Support ? true +# depends on rust-cpython which won't support python312 +# https://github.com/dgrunwald/rust-cpython/commit/e815555629e557be084813045ca1ddebc2f76ef9 +, rustSupport ? (stdenv.hostPlatform.isLinux && python3Packages.pythonOlder "3.12"), cargo, rustPlatform, rustc +, fullBuild ? false +, gitSupport ? fullBuild +, guiSupport ? fullBuild, tk +, highlightSupport ? fullBuild +, ApplicationServices +# for passthru.tests +# , runCommand +# , unzip +# , which +# , sqlite +# , git +# , cacert +# , gnupg +}: + +let + inherit (python3Packages) docutils python fb-re2 pygit2 pygments; + + self = python3Packages.buildPythonApplication rec { + pname = "mercurial${lib.optionalString fullBuild "-full"}"; + version = "6.6.3"; + + src = fetchurl { + url = "https://mercurial-scm.org/release/mercurial-${version}.tar.gz"; + hash = "sha256-911qSnWCOht9cTpJZ+yi9Zb0ZuWPxrwG1yZCky/X4wc="; + }; + + format = "other"; + + passthru = { inherit python; }; # pass it so that the same version can be used in hg2git + + cargoDeps = if rustSupport then rustPlatform.fetchCargoTarball { + inherit src; + name = "mercurial-${version}"; + sha256 = "sha256-G5tzwoIGOgpVI35rYXDeelnBgTbAiq7BDcXCHQzqSrs="; + sourceRoot = "mercurial-${version}/rust"; + } else null; + cargoRoot = if rustSupport then "rust" else null; + + propagatedBuildInputs = lib.optional re2Support fb-re2 + ++ lib.optional gitSupport pygit2 + ++ lib.optional highlightSupport pygments; + nativeBuildInputs = [ makeWrapper gettext installShellFiles python3Packages.setuptools ] + ++ lib.optionals rustSupport [ + rustPlatform.cargoSetupHook + cargo + rustc + ]; + buildInputs = [ docutils ] + ++ lib.optionals stdenv.isDarwin [ ApplicationServices ]; + + makeFlags = [ "PREFIX=$(out)" ] + ++ lib.optional rustSupport "PURE=--rust"; + + postInstall = (lib.optionalString guiSupport '' + mkdir -p $out/etc/mercurial + cp contrib/hgk $out/bin + cat >> $out/etc/mercurial/hgrc << EOF + [extensions] + hgk=$out/${python.sitePackages}/hgext/hgk.py + EOF + # setting HG so that hgk can be run itself as well (not only hg view) + WRAP_TK=" --set TK_LIBRARY ${tk}/lib/${tk.libPrefix} + --set HG $out/bin/hg + --prefix PATH : ${tk}/bin " + '') + '' + for i in $(cd $out/bin && ls); do + wrapProgram $out/bin/$i \ + $WRAP_TK + done + + # copy hgweb.cgi to allow use in apache + mkdir -p $out/share/cgi-bin + cp -v hgweb.cgi contrib/hgweb.wsgi $out/share/cgi-bin + chmod u+x $out/share/cgi-bin/hgweb.cgi + + installShellCompletion --cmd hg \ + --bash contrib/bash_completion \ + --zsh contrib/zsh_completion + ''; + + # passthru.tests = { + # mercurial-tests = makeTests { flags = "--with-hg=$MERCURIAL_BASE/bin/hg"; }; + # }; + + meta = with lib; { + description = "A fast, lightweight SCM system for very large distributed projects"; + homepage = "https://www.mercurial-scm.org"; + downloadPage = "https://www.mercurial-scm.org/release/"; + changelog = "https://wiki.mercurial-scm.org/Release${versions.majorMinor version}"; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ eelco lukegb pacien techknowlogick ]; + platforms = platforms.unix; + mainProgram = "hg"; + }; + }; + + # makeTests = { mercurial ? self, nameSuffix ? "", flags ? "" }: runCommand "${mercurial.pname}${nameSuffix}-tests" { + # inherit (mercurial) src; + + # SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; # needed for git + # MERCURIAL_BASE = mercurial; + # nativeBuildInputs = [ + # python + # unzip + # which + # sqlite + # git + # gnupg + # ]; + + # postPatch = '' + # patchShebangs . + + # for f in **/*.{py,c,t}; do + # # not only used in shebangs + # substituteAllInPlace "$f" '/bin/sh' '${stdenv.shell}' + # done + + # for f in **/*.t; do + # substituteInPlace 2>/dev/null "$f" \ + # --replace '*/hg:' '*/*hg*:' \${/* paths emitted by our wrapped hg look like ..hg-wrapped-wrapped */""} + # --replace '"$PYTHON" "$BINDIR"/hg' '"$BINDIR"/hg' ${/* 'hg' is a wrapper; don't run using python directly */""} + # done + # ''; + + # # This runs Mercurial _a lot_ of times. + # requiredSystemFeatures = [ "big-parallel" ]; + + # # Don't run tests if not-Linux or if cross-compiling. + # meta.broken = !stdenv.hostPlatform.isLinux || stdenv.buildPlatform != stdenv.hostPlatform; + # } '' + # addToSearchPathWithCustomDelimiter : PYTHONPATH "${mercurial}/${python.sitePackages}" + + # unpackPhase + # cd "$sourceRoot" + # patchPhase + + # cat << EOF > tests/blacklists/nix + # # tests enforcing "/usr/bin/env" shebangs, which are patched for nix + # test-run-tests.t + # test-check-shbang.t + + # # unstable experimental/unsupported features + # # https://bz.mercurial-scm.org/show_bug.cgi?id=6633#c1 + # test-git-interop.t + + # # doesn't like the extra setlocale warnings emitted by our bash wrappers + # test-locale.t + + # # Python 3.10-3.12 deprecation warning: asyncore + # # https://bz.mercurial-scm.org/show_bug.cgi?id=6727 + # test-patchbomb-tls.t + # EOF + + # export HGTEST_REAL_HG="${mercurial}/bin/hg" + # # include tests for native components + # export HGMODULEPOLICY="rust+c" + # # extended timeout necessary for tests to pass on the busy CI workers + # export HGTESTFLAGS="--blacklist blacklists/nix --timeout 1800 -j$NIX_BUILD_CORES ${flags}" + # make check + # touch $out + # ''; +in + self.overridePythonAttrs (origAttrs: { + passthru = origAttrs.passthru // rec { + # withExtensions takes a function which takes the python packages set and + # returns a list of extensions to install. + # + # for instance: mercurial.withExtension (pm: [ pm.hg-evolve ]) + withExtensions = f: let + python = self.python; + mercurialHighPrio = ps: (ps.toPythonModule self).overrideAttrs (oldAttrs: { + meta = oldAttrs.meta // { + priority = 50; + }; + }); + plugins = (f python.pkgs) ++ [ (mercurialHighPrio python.pkgs) ]; + env = python.withPackages (ps: plugins); + in stdenv.mkDerivation { + pname = "${self.pname}-with-extensions"; + + inherit (self) src version meta; + + buildInputs = self.buildInputs ++ self.propagatedBuildInputs; + nativeBuildInputs = self.nativeBuildInputs; + + dontUnpack = true; + dontPatch = true; + dontConfigure = true; + dontBuild = true; + doCheck = false; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + + for bindir in ${lib.concatStringsSep " " (map (d: "${lib.getBin d}/bin") plugins)}; do + for bin in $bindir/*; do + ln -s ${env}/bin/$(basename $bin) $out/bin/ + done + done + + ln -s ${self}/share $out/share + + runHook postInstall + ''; + + installCheckPhase = '' + runHook preInstallCheck + + $out/bin/hg help >/dev/null || exit 1 + + runHook postInstallCheck + ''; + }; + + # tests = origAttrs.passthru.tests // { + # withExtensions = withExtensions (pm: [ pm.hg-evolve ]); + # }; + }; + }) diff --git a/pkgs/by-name/me/mercurial/packages.nix b/pkgs/by-name/me/mercurial/packages.nix new file mode 100644 index 0000000..a9f055c --- /dev/null +++ b/pkgs/by-name/me/mercurial/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + mercurial = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) ApplicationServices; + }; +} diff --git a/pkgs/by-name/me/mesa/default.nix b/pkgs/by-name/me/mesa/default.nix new file mode 100644 index 0000000..a544e1b --- /dev/null +++ b/pkgs/by-name/me/mesa/default.nix @@ -0,0 +1,417 @@ +{ stdenv, lib, fetchurl, fetchpatch, fetchCrate, buildPackages +, meson, pkg-config, ninja +, intltool, bison, flex, file, python3Packages, wayland-scanner +, expat, libdrm, xorg, wayland, wayland-protocols, openssl +, llvmPackages, libffi, libomxil-bellagio, libva-minimal +, elfutils, libvdpau +, libglvnd, libunwind, lm_sensors +, vulkan-loader, glslang +, galliumDrivers ? + if stdenv.isLinux then + [ + "d3d12" # WSL emulated GPU (aka Dozen) + "kmsro" # special "render only" driver for GPUs without a display controller + "nouveau" # Nvidia + "radeonsi" # new AMD (GCN+) + "r300" # very old AMD + "r600" # less old AMD + "swrast" # software renderer (aka LLVMPipe) + "svga" # VMWare virtualized GPU + "virgl" # QEMU virtualized GPU (aka VirGL) + "zink" # generic OpenGL over Vulkan, experimental + ] ++ lib.optionals (stdenv.isAarch64 || stdenv.isAarch32) [ + "etnaviv" # Vivante GPU designs (mostly NXP/Marvell SoCs) + "freedreno" # Qualcomm Adreno (all Qualcomm SoCs) + "lima" # ARM Mali 4xx + "panfrost" # ARM Mali Midgard and up (T/G series) + "vc4" # Broadcom VC4 (Raspberry Pi 0-3) + ] ++ lib.optionals stdenv.isAarch64 [ + "tegra" # Nvidia Tegra SoCs + "v3d" # Broadcom VC5 (Raspberry Pi 4) + ] ++ lib.optionals stdenv.hostPlatform.isx86 [ + "iris" # new Intel, could work on non-x86 with PCIe cards, but doesn't build as of 22.3.4 + "crocus" # Intel legacy, x86 only + "i915" # Intel extra legacy, x86 only + ] + else [ "auto" ] +, vulkanDrivers ? + if stdenv.isLinux then + [ + "amd" # AMD (aka RADV) + "microsoft-experimental" # WSL virtualized GPU (aka DZN/Dozen) + "nouveau-experimental" # Nouveau (aka NVK) + "swrast" # software renderer (aka Lavapipe) + ] + ++ lib.optionals (stdenv.hostPlatform.isAarch -> lib.versionAtLeast stdenv.hostPlatform.parsed.cpu.version "6") [ + # QEMU virtualized GPU (aka VirGL) + # Requires ATOMIC_INT_LOCK_FREE == 2. + "virtio" + ] + ++ lib.optionals stdenv.isAarch64 [ + "broadcom" # Broadcom VC5 (Raspberry Pi 4, aka V3D) + "freedreno" # Qualcomm Adreno (all Qualcomm SoCs) + "imagination-experimental" # PowerVR Rogue (currently N/A) + "panfrost" # ARM Mali Midgard and up (T/G series) + ] + ++ lib.optionals stdenv.hostPlatform.isx86 [ + "intel" # Intel (aka ANV), could work on non-x86 with PCIe cards, but doesn't build + "intel_hasvk" # Intel Haswell/Broadwell, "legacy" Vulkan driver (https://www.phoronix.com/news/Intel-HasVK-Drop-Dead-Code) + ] + else [ "auto" ] +, eglPlatforms ? [ "x11" ] ++ lib.optionals stdenv.isLinux [ "wayland" ] +, vulkanLayers ? lib.optionals (!stdenv.isDarwin) [ "device-select" "overlay" "intel-nullhw" ] # No Vulkan support on Darwin +, OpenGL, Xplugin +, withValgrind ? lib.meta.availableOn stdenv.hostPlatform valgrind-light && !valgrind-light.meta.broken, valgrind-light +, withLibunwind ? lib.meta.availableOn stdenv.hostPlatform libunwind +, enableGalliumNine ? stdenv.isLinux +, enableOSMesa ? stdenv.isLinux +, enableOpenCL ? stdenv.isLinux && stdenv.isx86_64 +, enablePatentEncumberedCodecs ? true +, jdupes +, rustPlatform +, rust-bindgen +, rustc +, spirv-llvm-translator +, zstd +, directx-headers +, udev +}: + +# When updating this package, please verify at least these build (assuming x86_64-linux): +# nix build .#mesa .#pkgsi686Linux.mesa .#pkgsCross.aarch64-multiplatform.mesa .#pkgsMusl.mesa + +let + version = "24.0.5"; + hash = "sha256-OMwkXKj6o8adptJof4kGN3AB9jNlNIpizG9/r7HowBg="; + + # Release calendar: https://www.mesa3d.org/release-calendar.html + # Release frequency: https://www.mesa3d.org/releasing.html#schedule + branch = lib.versions.major version; + + withLibdrm = lib.meta.availableOn stdenv.hostPlatform libdrm; + + haveWayland = lib.elem "wayland" eglPlatforms; + haveZink = lib.elem "zink" galliumDrivers; + haveDozen = (lib.elem "d3d12" galliumDrivers) || (lib.elem "microsoft-experimental" vulkanDrivers); + + rustDeps = [ + { + pname = "proc-macro2"; + version = "1.0.70"; + hash = "sha256-e4ZgyZUTu5nAtaH5QVkLelqJQX/XPj/rWkzf/g2c+1g="; + } + { + pname = "quote"; + version = "1.0.33"; + hash = "sha256-VWRCZJO0/DJbNu0/V9TLaqlwMot65YjInWT9VWg57DY="; + } + { + pname = "syn"; + version = "2.0.39"; + hash = "sha256-Mjen2L/omhVbhU/+Ao65mogs3BP3fY+Bodab3uU63EI="; + } + { + pname = "unicode-ident"; + version = "1.0.12"; + hash = "sha256-KX8NqYYw6+rGsoR9mdZx8eT1HIPEUUyxErdk2H/Rlj8="; + } + ]; + + copyRustDep = dep: '' + cp -R --no-preserve=mode,ownership ${fetchCrate dep} subprojects/${dep.pname}-${dep.version} + cp -R subprojects/packagefiles/${dep.pname}/* subprojects/${dep.pname}-${dep.version}/ + ''; + + copyRustDeps = lib.concatStringsSep "\n" (builtins.map copyRustDep rustDeps); + +self = stdenv.mkDerivation { + pname = "mesa"; + inherit version; + + src = fetchurl { + urls = [ + "https://archive.mesa3d.org/mesa-${version}.tar.xz" + "https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz" + "ftp://ftp.freedesktop.org/pub/mesa/mesa-${version}.tar.xz" + "ftp://ftp.freedesktop.org/pub/mesa/${version}/mesa-${version}.tar.xz" + "ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz" + ]; + inherit hash; + }; + + patches = [ + ./opencl.patch + ]; + + postPatch = '' + patchShebangs . + + # The drirc.d directory cannot be installed to $drivers as that would cause a cyclic dependency: + substituteInPlace src/util/xmlconfig.c --replace \ + 'DATADIR "/drirc.d"' '"${placeholder "out"}/share/drirc.d"' + substituteInPlace src/util/meson.build --replace \ + "get_option('datadir')" "'${placeholder "out"}/share'" + substituteInPlace src/amd/vulkan/meson.build --replace \ + "get_option('datadir')" "'${placeholder "out"}/share'" + + ${copyRustDeps} + ''; + + outputs = [ "out" "dev" "drivers" ] + ++ lib.optional enableOSMesa "osmesa" + ++ lib.optional stdenv.isLinux "driversdev" + ++ lib.optional enableOpenCL "opencl" + # the Dozen drivers depend on libspirv2dxil, but link it statically, and + # libspirv2dxil itself is pretty chonky, so relocate it to its own output + # in case anything wants to use it at some point + ++ lib.optional haveDozen "spirv2dxil"; + + # Keep build-ids so drivers can use them for caching, etc. + # Also some drivers segfault without this. + separateDebugInfo = true; + + # Needed to discover llvm-config for cross + preConfigure = '' + PATH=${llvmPackages.libllvm.dev}/bin:$PATH + ''; + + mesonFlags = [ + "--sysconfdir=/etc" + "--datadir=${placeholder "drivers"}/share" # Vendor files + + # Don't build in debug mode + # https://gitlab.freedesktop.org/mesa/mesa/blob/master/docs/meson.html#L327 + "-Db_ndebug=true" + + "-Ddri-search-path=${libglvnd.driverLink}/lib/dri" + + "-Dplatforms=${lib.concatStringsSep "," eglPlatforms}" + "-Dgallium-drivers=${lib.concatStringsSep "," galliumDrivers}" + "-Dvulkan-drivers=${lib.concatStringsSep "," vulkanDrivers}" + + "-Ddri-drivers-path=${placeholder "drivers"}/lib/dri" + "-Dvdpau-libs-path=${placeholder "drivers"}/lib/vdpau" + "-Domx-libs-path=${placeholder "drivers"}/lib/bellagio" + "-Dva-libs-path=${placeholder "drivers"}/lib/dri" + "-Dd3d-drivers-path=${placeholder "drivers"}/lib/d3d" + + "-Dgallium-nine=${lib.boolToString enableGalliumNine}" # Direct3D in Wine + "-Dosmesa=${lib.boolToString enableOSMesa}" # used by wine + "-Dmicrosoft-clc=disabled" # Only relevant on Windows (OpenCL 1.2 API on top of D3D12) + + # To enable non-mesa gbm backends to be found (e.g. Nvidia) + "-Dgbm-backends-path=${libglvnd.driverLink}/lib/gbm:${placeholder "out"}/lib/gbm" + + # meson auto_features enables these features, but we do not want them + "-Dandroid-libbacktrace=disabled" + + ] ++ lib.optionals stdenv.isLinux [ + "-Dglvnd=true" + + # Enable RT for Intel hardware + # https://gitlab.freedesktop.org/mesa/mesa/-/issues/9080 + (lib.mesonEnable "intel-clc" (stdenv.buildPlatform == stdenv.hostPlatform)) + ] ++ lib.optionals stdenv.isDarwin [ + # Disable features that are explicitly unsupported on the platform + "-Dgbm=disabled" + "-Dxlib-lease=disabled" + "-Degl=disabled" + "-Dgallium-vdpau=disabled" + "-Dgallium-va=disabled" + "-Dgallium-xa=disabled" + "-Dlmsensors=disabled" + ] ++ lib.optionals enableOpenCL [ + # Clover, old OpenCL frontend + "-Dgallium-opencl=icd" + "-Dopencl-spirv=true" + + # Rusticl, new OpenCL frontend + "-Dgallium-rusticl=true" + "-Dclang-libdir=${llvmPackages.clang-unwrapped.lib}/lib" + ] ++ lib.optionals (!withValgrind) [ + "-Dvalgrind=disabled" + ] ++ lib.optionals (!withLibunwind) [ + "-Dlibunwind=disabled" + ] ++ lib.optional enablePatentEncumberedCodecs + "-Dvideo-codecs=all" + ++ lib.optional (vulkanLayers != []) "-D vulkan-layers=${builtins.concatStringsSep "," vulkanLayers}"; + + strictDeps = true; + + buildInputs = with xorg; [ + expat glslang llvmPackages.libllvm libglvnd xorgproto + libX11 libXext libxcb libXt libXfixes libxshmfence libXrandr + libffi libvdpau libXvMC + libpthreadstubs openssl + zstd + ] ++ lib.optionals withLibunwind [ + libunwind + ] ++ [ + python3Packages.python # for shebang + ] ++ lib.optionals haveWayland [ wayland wayland-protocols ] + ++ lib.optionals stdenv.isLinux [ libomxil-bellagio libva-minimal udev lm_sensors ] + ++ lib.optionals (lib.meta.availableOn stdenv.hostPlatform elfutils) [ elfutils ] + ++ lib.optionals enableOpenCL [ llvmPackages.libclc llvmPackages.clang llvmPackages.clang-unwrapped spirv-llvm-translator ] + ++ lib.optional withValgrind valgrind-light + ++ lib.optional haveZink vulkan-loader + ++ lib.optional haveDozen directx-headers; + + depsBuildBuild = [ pkg-config ] + # Adding this unconditionally makes x86_64-darwin pick up an older toolchain, as + # we explicitly call Mesa with 11.0 stdenv, but buildPackages is still 10.something, + # and Mesa can't build with that. + # FIXME: figure this out, or figure out how to get rid of Mesa on Darwin, + # whichever is easier. + ++ lib.optional (!stdenv.isDarwin) buildPackages.stdenv.cc; + + nativeBuildInputs = [ + meson pkg-config ninja + intltool bison flex file + python3Packages.python python3Packages.mako python3Packages.ply + jdupes glslang + rustc rust-bindgen rustPlatform.bindgenHook + ] ++ lib.optional haveWayland wayland-scanner; + + propagatedBuildInputs = with xorg; [ + libXdamage libXxf86vm + ] ++ lib.optional withLibdrm libdrm + ++ lib.optionals stdenv.isDarwin [ OpenGL Xplugin ]; + + doCheck = false; + + postInstall = '' + # Some installs don't have any drivers so this directory is never created. + mkdir -p $drivers $osmesa + '' + lib.optionalString stdenv.isLinux '' + mkdir -p $drivers/lib + + if [ -n "$(shopt -s nullglob; echo "$out/lib/libxatracker"*)" -o -n "$(shopt -s nullglob; echo "$out/lib/libvulkan_"*)" ]; then + # move gallium-related stuff to $drivers, so $out doesn't depend on LLVM + mv -t $drivers/lib \ + $out/lib/libpowervr_rogue* \ + $out/lib/libxatracker* \ + $out/lib/libvulkan_* + fi + + if [ -n "$(shopt -s nullglob; echo "$out"/lib/lib*_mesa*)" ]; then + # Move other drivers to a separate output + mv -t $drivers/lib $out/lib/lib*_mesa* + fi + + # Update search path used by glvnd + for js in $drivers/share/glvnd/egl_vendor.d/*.json; do + substituteInPlace "$js" --replace '"libEGL_' '"'"$drivers/lib/libEGL_" + done + + # Update search path used by Vulkan (it's pointing to $out but + # drivers are in $drivers) + for js in $drivers/share/vulkan/icd.d/*.json; do + substituteInPlace "$js" --replace "$out" "$drivers" + done + '' + lib.optionalString enableOpenCL '' + # Move OpenCL stuff + mkdir -p $opencl/lib + mv -t "$opencl/lib/" \ + $out/lib/gallium-pipe \ + $out/lib/lib*OpenCL* + + # We construct our own .icd files that contain absolute paths. + mkdir -p $opencl/etc/OpenCL/vendors/ + echo $opencl/lib/libMesaOpenCL.so > $opencl/etc/OpenCL/vendors/mesa.icd + echo $opencl/lib/libRusticlOpenCL.so > $opencl/etc/OpenCL/vendors/rusticl.icd + '' + lib.optionalString enableOSMesa '' + # move libOSMesa to $osmesa, as it's relatively big + mkdir -p $osmesa/lib + mv -t $osmesa/lib/ $out/lib/libOSMesa* + '' + lib.optionalString (vulkanLayers != []) '' + mv -t $drivers/lib $out/lib/libVkLayer* + for js in $drivers/share/vulkan/{im,ex}plicit_layer.d/*.json; do + substituteInPlace "$js" --replace '"libVkLayer_' '"'"$drivers/lib/libVkLayer_" + done + '' + lib.optionalString haveDozen '' + mkdir -p $spirv2dxil/{bin,lib} + mv -t $spirv2dxil/lib $out/lib/libspirv_to_dxil* + mv -t $spirv2dxil/bin $out/bin/spirv2dxil + ''; + + postFixup = lib.optionalString stdenv.isLinux '' + # set the default search path for DRI drivers; used e.g. by X server + for pc in lib/pkgconfig/{dri,d3d}.pc; do + [ -f "$dev/$pc" ] && substituteInPlace "$dev/$pc" --replace "$drivers" "${libglvnd.driverLink}" + done + + # remove pkgconfig files for GL/EGL; they are provided by libGL. + rm -f $dev/lib/pkgconfig/{gl,egl}.pc + + # Move development files for libraries in $drivers to $driversdev + mkdir -p $driversdev/include + mv $dev/include/xa_* $dev/include/d3d* -t $driversdev/include || true + mkdir -p $driversdev/lib/pkgconfig + for pc in lib/pkgconfig/{xatracker,d3d}.pc; do + if [ -f "$dev/$pc" ]; then + substituteInPlace "$dev/$pc" --replace $out $drivers + mv $dev/$pc $driversdev/$pc + fi + done + + # Don't depend on build python + patchShebangs --host --update $out/bin/* + + # NAR doesn't support hard links, so convert them to symlinks to save space. + jdupes --hard-links --link-soft --recurse "$drivers" + + # add RPATH so the drivers can find the moved libgallium and libdricore9 + # moved here to avoid problems with stripping patchelfed files + for lib in $drivers/lib/*.so* $drivers/lib/*/*.so*; do + if [[ ! -L "$lib" ]]; then + patchelf --set-rpath "$(patchelf --print-rpath $lib):$drivers/lib" "$lib" + fi + done + # add RPATH here so Zink can find libvulkan.so + ${lib.optionalString haveZink '' + patchelf --add-rpath ${vulkan-loader}/lib $drivers/lib/dri/zink_dri.so + ''} + ''; + + env.NIX_CFLAGS_COMPILE = toString (lib.optionals stdenv.isDarwin [ "-fno-common" ] ++ lib.optionals enableOpenCL [ + "-UPIPE_SEARCH_DIR" + "-DPIPE_SEARCH_DIR=\"${placeholder "opencl"}/lib/gallium-pipe\"" + ]); + + passthru = { + inherit (libglvnd) driverLink; + inherit llvmPackages; + + libdrm = if withLibdrm then libdrm else null; + + tests = lib.optionalAttrs stdenv.isLinux { + devDoesNotDependOnLLVM = stdenv.mkDerivation { + name = "mesa-dev-does-not-depend-on-llvm"; + buildCommand = '' + echo ${self.dev} >>$out + ''; + disallowedRequisites = [ llvmPackages.llvm self.drivers ]; + }; + }; + }; + + meta = with lib; { + description = "An open source 3D graphics library"; + longDescription = '' + The Mesa project began as an open-source implementation of the OpenGL + specification - a system for rendering interactive 3D graphics. Over the + years the project has grown to implement more graphics APIs, including + OpenGL ES (versions 1, 2, 3), OpenCL, OpenMAX, VDPAU, VA API, XvMC, and + Vulkan. A variety of device drivers allows the Mesa libraries to be used + in many different environments ranging from software emulation to + complete hardware acceleration for modern GPUs. + ''; + homepage = "https://www.mesa3d.org/"; + changelog = "https://www.mesa3d.org/relnotes/${version}.html"; + license = licenses.mit; # X11 variant, in most files + platforms = platforms.mesaPlatforms; + maintainers = with maintainers; [ primeos vcunat ]; # Help is welcome :) + }; +}; + +in self diff --git a/pkgs/by-name/me/mesa/opencl.patch b/pkgs/by-name/me/mesa/opencl.patch new file mode 100644 index 0000000..cd27f0a --- /dev/null +++ b/pkgs/by-name/me/mesa/opencl.patch @@ -0,0 +1,66 @@ +diff --git a/meson.build b/meson.build +index fbb0b29322d..b4825056449 100644 +--- a/meson.build ++++ b/meson.build +@@ -1805,7 +1805,7 @@ endif + + dep_clang = null_dep + if with_clc +- llvm_libdir = dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir') ++ llvm_libdir = get_option('clang-libdir') + + dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false) + +diff --git a/meson_options.txt b/meson_options.txt +index e885ba61a8a..591ed957c85 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -23,6 +23,12 @@ option( + description : 'the window system EGL assumes for EGL_DEFAULT_DISPLAY', + ) + ++option( ++ 'clang-libdir', ++ type : 'string', ++ value : '', ++ description : 'Locations to search for clang libraries.' ++) + option( + 'android-stub', + type : 'boolean', +diff --git a/src/gallium/targets/opencl/meson.build b/src/gallium/targets/opencl/meson.build +index 7c14135898e..74dc6850603 100644 +--- a/src/gallium/targets/opencl/meson.build ++++ b/src/gallium/targets/opencl/meson.build +@@ -39,7 +39,8 @@ if dep_llvm.version().version_compare('>=10.0.0') + polly_isl_dep = cpp.find_library('PollyISL', dirs : llvm_libdir, required : false) + endif + +-dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false) ++clang_libdir = get_option('clang-libdir') ++dep_clang = cpp.find_library('clang-cpp', dirs : clang_libdir, required : false) + + # meson will return clang-cpp from system dirs if it's not found in llvm_libdir + linker_rpath_arg = '-Wl,--rpath=@0@'.format(llvm_libdir) +@@ -123,7 +124,7 @@ if with_opencl_icd + configuration : _config, + input : 'mesa.icd.in', + output : 'mesa.icd', +- install : true, ++ install : false, + install_tag : 'runtime', + install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'), + ) +diff --git a/src/gallium/targets/rusticl/meson.build b/src/gallium/targets/rusticl/meson.build +index b2963fe6dfa..99d6d801b94 100644 +--- a/src/gallium/targets/rusticl/meson.build ++++ b/src/gallium/targets/rusticl/meson.build +@@ -76,7 +76,7 @@ configure_file( + configuration : _config, + input : 'rusticl.icd.in', + output : 'rusticl.icd', +- install : true, ++ install : false, + install_tag : 'runtime', + install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'), + ) diff --git a/pkgs/by-name/me/mesa/packages.nix b/pkgs/by-name/me/mesa/packages.nix new file mode 100644 index 0000000..2f74a9d --- /dev/null +++ b/pkgs/by-name/me/mesa/packages.nix @@ -0,0 +1,22 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Default libGL implementation, should provide headers and + # libGL.so/libEGL.so/... to link agains them. Android NDK provides + # an OpenGL implementation, we can just use that. + libGL = if stdenv.hostPlatform.useAndroidPrebuilt then stdenv + else callPackage ./stubs.nix { + inherit (darwin.apple_sdk.frameworks) OpenGL; + }; + + # Default libGLU + libGLU = mesa_glu; + + mesa = darwin.apple_sdk_11_0.callPackage ./. { + inherit (darwin.apple_sdk_11_0.frameworks) OpenGL; + inherit (darwin.apple_sdk_11_0.libs) Xplugin; + }; + mesa_i686 = pkgsi686Linux.mesa; # make it build on Hydra +} diff --git a/pkgs/by-name/me/mesa/stubs.nix b/pkgs/by-name/me/mesa/stubs.nix new file mode 100644 index 0000000..7738975 --- /dev/null +++ b/pkgs/by-name/me/mesa/stubs.nix @@ -0,0 +1,87 @@ +{ stdenv +, libglvnd +, mesa +, OpenGL +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "libGL"; + inherit (if stdenv.hostPlatform.isDarwin then mesa else libglvnd) version; + outputs = [ "out" "dev" ]; + + # On macOS, libglvnd is not supported, so we just use what mesa + # build. We need to also include OpenGL.framework, and some + # extra tricks to go along with. We add mesa’s libGLX to support + # the X extensions to OpenGL. + buildCommand = if stdenv.hostPlatform.isDarwin then '' + mkdir -p $out/nix-support $dev + echo ${OpenGL} >> $out/nix-support/propagated-build-inputs + ln -s ${mesa.out}/lib $out/lib + + mkdir -p $dev/lib/pkgconfig $dev/nix-support + echo "$out" > $dev/nix-support/propagated-build-inputs + ln -s ${mesa.dev}/include $dev/include + + cat <$dev/lib/pkgconfig/gl.pc + Name: gl + Description: gl library + Version: ${mesa.version} + Libs: -L${mesa.out}/lib -lGL + Cflags: -I${mesa.dev}/include + EOF + + cat <$dev/lib/pkgconfig/glesv1_cm.pc + Name: glesv1_cm + Description: glesv1_cm library + Version: ${mesa.version} + Libs: -L${mesa.out}/lib -lGLESv1_CM + Cflags: -I${mesa.dev}/include + EOF + + cat <$dev/lib/pkgconfig/glesv2.pc + Name: glesv2 + Description: glesv2 library + Version: ${mesa.version} + Libs: -L${mesa.out}/lib -lGLESv2 + Cflags: -I${mesa.dev}/include + EOF + '' + + # Otherwise, setup gl stubs to use libglvnd. + else '' + mkdir -p $out/nix-support + ln -s ${libglvnd.out}/lib $out/lib + + mkdir -p $dev/{,lib/pkgconfig,nix-support} + echo "$out ${libglvnd} ${libglvnd.dev}" > $dev/nix-support/propagated-build-inputs + ln -s ${libglvnd.dev}/include $dev/include + + genPkgConfig() { + local name="$1" + local lib="$2" + + cat <$dev/lib/pkgconfig/$name.pc + Name: $name + Description: $lib library + Version: ${libglvnd.version} + Libs: -L${libglvnd.out}/lib -l$lib + Cflags: -I${libglvnd.dev}/include + EOF + } + + genPkgConfig gl GL + genPkgConfig egl EGL + genPkgConfig glesv1_cm GLESv1_CM + genPkgConfig glesv2 GLESv2 + ''; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = { + description = "Stub bindings using " + (if stdenv.hostPlatform.isDarwin then "mesa" else "libglvnd"); + pkgConfigModules = [ "gl" "egl" "glesv1_cm" "glesv2" ]; + } // { + inherit (if stdenv.hostPlatform.isDarwin then mesa.meta else libglvnd.meta) homepage license platforms; + }; +}) diff --git a/pkgs/by-name/me/meson/0001-Revert-rust-recursively-pull-proc-macro-dependencies.patch b/pkgs/by-name/me/meson/0001-Revert-rust-recursively-pull-proc-macro-dependencies.patch new file mode 100644 index 0000000..ff94409 --- /dev/null +++ b/pkgs/by-name/me/meson/0001-Revert-rust-recursively-pull-proc-macro-dependencies.patch @@ -0,0 +1,92 @@ +From 8304b645c655832c47ee9ca706d182c26d29eaff Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= +Date: Tue, 9 Apr 2024 06:35:39 +0000 +Subject: [PATCH] Revert "rust: recursively pull proc-macro dependencies as + well" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit aee941559c4b88a062e88186819a820c69c200ae. + +Signed-off-by: Jörg Thalheim +--- + mesonbuild/build.py | 2 ++ + test cases/rust/18 proc-macro/lib.rs | 8 -------- + test cases/rust/18 proc-macro/meson.build | 11 ----------- + test cases/rust/18 proc-macro/subdir/meson.build | 1 - + .../rust/18 proc-macro/transitive-proc-macro.rs | 7 ------- + 5 files changed, 2 insertions(+), 27 deletions(-) + delete mode 100644 test cases/rust/18 proc-macro/lib.rs + delete mode 100644 test cases/rust/18 proc-macro/subdir/meson.build + delete mode 100644 test cases/rust/18 proc-macro/transitive-proc-macro.rs + +diff --git a/mesonbuild/build.py b/mesonbuild/build.py +index 6f0d6a2dd..7be9b497b 100644 +--- a/mesonbuild/build.py ++++ b/mesonbuild/build.py +@@ -1295,6 +1295,8 @@ def get_dependencies_recurse(self, result: OrderedSet[BuildTargetTypes], include + for t in self.link_targets: + if t in result: + continue ++ if t.rust_crate_type == 'proc-macro': ++ continue + if include_internals or not t.is_internal(): + result.add(t) + if isinstance(t, StaticLibrary): +diff --git a/test cases/rust/18 proc-macro/lib.rs b/test cases/rust/18 proc-macro/lib.rs +deleted file mode 100644 +index 5242886cc..000000000 +--- a/test cases/rust/18 proc-macro/lib.rs ++++ /dev/null +@@ -1,8 +0,0 @@ +-extern crate proc_macro_examples; +-use proc_macro_examples::make_answer; +- +-make_answer!(); +- +-pub fn func() -> u32 { +- answer() +-} +diff --git a/test cases/rust/18 proc-macro/meson.build b/test cases/rust/18 proc-macro/meson.build +index e8b28eda1..c5f0dfc82 100644 +--- a/test cases/rust/18 proc-macro/meson.build ++++ b/test cases/rust/18 proc-macro/meson.build +@@ -31,14 +31,3 @@ main = executable( + ) + + test('main_test2', main) +- +-subdir('subdir') +- +-staticlib = static_library('staticlib', 'lib.rs', +- link_with: pm_in_subdir, +- rust_dependency_map : {'proc_macro_examples3' : 'proc_macro_examples'} +-) +- +-executable('transitive-proc-macro', 'transitive-proc-macro.rs', +- link_with: staticlib, +-) +diff --git a/test cases/rust/18 proc-macro/subdir/meson.build b/test cases/rust/18 proc-macro/subdir/meson.build +deleted file mode 100644 +index 04842c431..000000000 +--- a/test cases/rust/18 proc-macro/subdir/meson.build ++++ /dev/null +@@ -1 +0,0 @@ +-pm_in_subdir = rust.proc_macro('proc_macro_examples3', '../proc.rs') +diff --git a/test cases/rust/18 proc-macro/transitive-proc-macro.rs b/test cases/rust/18 proc-macro/transitive-proc-macro.rs +deleted file mode 100644 +index 4c804b3b6..000000000 +--- a/test cases/rust/18 proc-macro/transitive-proc-macro.rs ++++ /dev/null +@@ -1,7 +0,0 @@ +-extern crate staticlib; +-use staticlib::func; +- +- +-fn main() { +- assert_eq!(42, func()); +-} +-- +2.44.0 + diff --git a/pkgs/by-name/me/meson/001-fix-rpath.patch b/pkgs/by-name/me/meson/001-fix-rpath.patch new file mode 100644 index 0000000..29bec79 --- /dev/null +++ b/pkgs/by-name/me/meson/001-fix-rpath.patch @@ -0,0 +1,24 @@ +--- a/mesonbuild/backend/backends.py ++++ b/mesonbuild/backend/backends.py +@@ -723,6 +723,21 @@ + @staticmethod + def get_rpath_dirs_from_link_args(args: T.List[str]) -> T.Set[str]: + dirs: T.Set[str] = set() ++ ++ nix_ldflags = os.environ.get('NIX_LDFLAGS', '').split() ++ next_is_path = False ++ # Try to add rpaths set by user or ld-wrapper so that they are not removed. ++ # Based on https://github.com/NixOS/nixpkgs/blob/69711a2f5ffe8cda208163be5258266172ff527f/pkgs/build-support/bintools-wrapper/ld-wrapper.sh#L148-L177 ++ for flag in nix_ldflags: ++ if flag == '-rpath' or flag == '-L': ++ next_is_path = True ++ elif next_is_path or flag.startswith('-L/'): ++ if flag.startswith('-L/'): ++ flag = flag[2:] ++ if flag.startswith('@storeDir@'): ++ dirs.add(flag) ++ next_is_path = False ++ + # Match rpath formats: + # -Wl,-rpath= + # -Wl,-rpath, diff --git a/pkgs/by-name/me/meson/002-clear-old-rpath.patch b/pkgs/by-name/me/meson/002-clear-old-rpath.patch new file mode 100644 index 0000000..f1e3c76 --- /dev/null +++ b/pkgs/by-name/me/meson/002-clear-old-rpath.patch @@ -0,0 +1,20 @@ +diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py +index 4176b9a03..faaabf616 100644 +--- a/mesonbuild/scripts/depfixer.py ++++ b/mesonbuild/scripts/depfixer.py +@@ -336,6 +336,15 @@ class Elf(DataSizes): + if not new_rpath: + self.remove_rpath_entry(entrynum) + else: ++ # Clear old rpath to avoid stale references, ++ # not heeding the warning above about de-duplication ++ # since it does not seem to cause issues for us ++ # and not doing so trips up Nix’s reference checker. ++ # See https://github.com/NixOS/nixpkgs/pull/46020 ++ # and https://github.com/NixOS/nixpkgs/issues/95163 ++ self.bf.seek(rp_off) ++ self.bf.write(b'\0'*len(old_rpath)) ++ + self.bf.seek(rp_off) + self.bf.write(new_rpath) + self.bf.write(b'\0') diff --git a/pkgs/by-name/me/meson/003-more-env-vars.patch b/pkgs/by-name/me/meson/003-more-env-vars.patch new file mode 100644 index 0000000..e4ad435 --- /dev/null +++ b/pkgs/by-name/me/meson/003-more-env-vars.patch @@ -0,0 +1,12 @@ +diff -Naur meson-0.60.2-old/mesonbuild/environment.py meson-0.60.2-new/mesonbuild/environment.py +--- meson-0.60.2-old/mesonbuild/environment.py 2021-11-02 16:58:13.000000000 -0300 ++++ meson-0.60.2-new/mesonbuild/environment.py 2021-12-12 17:44:00.350499307 -0300 +@@ -68,7 +68,7 @@ + # compiling we fall back on the unprefixed host version. This + # allows native builds to never need to worry about the 'BUILD_*' + # ones. +- ([var_name + '_FOR_BUILD'] if is_cross else [var_name]), ++ [var_name + '_FOR_BUILD'] + ([] if is_cross else [var_name]), + # Always just the unprefixed host versions + [var_name] + )[for_machine] diff --git a/pkgs/by-name/me/meson/004-gir-fallback-path.patch b/pkgs/by-name/me/meson/004-gir-fallback-path.patch new file mode 100644 index 0000000..e6d7402 --- /dev/null +++ b/pkgs/by-name/me/meson/004-gir-fallback-path.patch @@ -0,0 +1,21 @@ +diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py +index 1c6952df7..9466a0b7d 100644 +--- a/mesonbuild/modules/gnome.py ++++ b/mesonbuild/modules/gnome.py +@@ -923,6 +923,16 @@ class GnomeModule(ExtensionModule): + if fatal_warnings: + scan_command.append('--warn-error') + ++ if len(set(girtarget.get_custom_install_dir()[0] for girtarget in girtargets if girtarget.get_custom_install_dir())) > 1: ++ raise MesonException('generate_gir tries to build multiple libraries with different install_dir at once: {}'.format(','.join([str(girtarget) for girtarget in girtargets]))) ++ ++ if girtargets[0].get_custom_install_dir(): ++ fallback_libpath = girtargets[0].get_custom_install_dir()[0] ++ else: ++ fallback_libpath = None ++ if fallback_libpath is not None and isinstance(fallback_libpath, str) and len(fallback_libpath) > 0 and fallback_libpath[0] == "/": ++ scan_command += ['--fallback-library-path=' + fallback_libpath] ++ + generated_files = [f for f in libsources if isinstance(f, (GeneratedList, CustomTarget, CustomTargetIndex))] + + scan_target = self._make_gir_target(state, girfile, scan_command, generated_files, depends, kwargs) diff --git a/pkgs/by-name/me/meson/005-boost-Do-not-add-system-paths-on-nix.patch b/pkgs/by-name/me/meson/005-boost-Do-not-add-system-paths-on-nix.patch new file mode 100644 index 0000000..0a2eda9 --- /dev/null +++ b/pkgs/by-name/me/meson/005-boost-Do-not-add-system-paths-on-nix.patch @@ -0,0 +1,21 @@ +diff -Naur meson-0.60.2-old/mesonbuild/dependencies/boost.py meson-0.60.2-new/mesonbuild/dependencies/boost.py +--- meson-0.60.2-old/mesonbuild/dependencies/boost.py 2021-11-02 16:58:07.000000000 -0300 ++++ meson-0.60.2-new/mesonbuild/dependencies/boost.py 2021-12-12 19:21:27.895705897 -0300 +@@ -682,16 +682,7 @@ + else: + tmp = [] # type: T.List[Path] + +- # Add some default system paths +- tmp += [Path('/opt/local')] +- tmp += [Path('/usr/local/opt/boost')] +- tmp += [Path('/usr/local')] +- tmp += [Path('/usr')] +- +- # Cleanup paths +- tmp = [x for x in tmp if x.is_dir()] +- tmp = [x.resolve() for x in tmp] +- roots += tmp ++ # Remove such spurious, non-explicit "system" paths for Nix&Nixpkgs + + self.check_and_set_roots(roots, use_system=True) + diff --git a/pkgs/by-name/me/meson/006-disable-bitcode.patch b/pkgs/by-name/me/meson/006-disable-bitcode.patch new file mode 100644 index 0000000..a72997c --- /dev/null +++ b/pkgs/by-name/me/meson/006-disable-bitcode.patch @@ -0,0 +1,24 @@ +--- a/mesonbuild/compilers/mixins/clang.py ++++ b/mesonbuild/compilers/mixins/clang.py +@@ -56,10 +56,6 @@ class ClangCompiler(GnuLikeCompiler): + {OptionKey('b_colorout'), OptionKey('b_lto_threads'), OptionKey('b_lto_mode'), OptionKey('b_thinlto_cache'), + OptionKey('b_thinlto_cache_dir')}) + +- # TODO: this really should be part of the linker base_options, but +- # linkers don't have base_options. +- if isinstance(self.linker, AppleDynamicLinker): +- self.base_options.add(OptionKey('b_bitcode')) + # All Clang backends can also do LLVM IR + self.can_compile_suffixes.add('ll') + +--- a/mesonbuild/linkers/linkers.py ++++ b/mesonbuild/linkers/linkers.py +@@ -785,7 +785,7 @@ class AppleDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker): + return self._apply_prefix('-headerpad_max_install_names') + + def bitcode_args(self) -> T.List[str]: +- return self._apply_prefix('-bitcode_bundle') ++ raise MesonException('Nixpkgs cctools does not support bitcode bundles') + + def fatal_warnings(self) -> T.List[str]: + return self._apply_prefix('-fatal_warnings') diff --git a/pkgs/by-name/me/meson/default.nix b/pkgs/by-name/me/meson/default.nix new file mode 100644 index 0000000..b2c85c4 --- /dev/null +++ b/pkgs/by-name/me/meson/default.nix @@ -0,0 +1,165 @@ +{ lib +, stdenv +, fetchFromGitHub +, installShellFiles +, coreutils +, darwin +, libxcrypt +, openldap +, ninja +, pkg-config +, python3 +, substituteAll +, zlib +}: + +let + inherit (darwin.apple_sdk.frameworks) AppKit Cocoa Foundation LDAP OpenAL OpenGL; +in +python3.pkgs.buildPythonApplication rec { + pname = "meson"; + version = "1.4.0"; + + src = fetchFromGitHub { + owner = "mesonbuild"; + repo = "meson"; + rev = "refs/tags/${version}"; + hash = "sha256-hRTmKO2E6SIdvAhO7OJtV8dcsGm39c51H+2ZGEkdcFY="; + }; + + patches = [ + # In typical distributions, RPATH is only needed for internal libraries so + # meson removes everything else. With Nix, the locations of libraries + # are not as predictable, therefore we need to keep them in the RPATH. + # At the moment we are keeping the paths starting with /nix/store. + # https://github.com/NixOS/nixpkgs/issues/31222#issuecomment-365811634 + (substituteAll { + src = ./001-fix-rpath.patch; + inherit (builtins) storeDir; + }) + + # When Meson removes build_rpath from DT_RUNPATH entry, it just writes + # the shorter NUL-terminated new rpath over the old one to reduce + # the risk of potentially breaking the ELF files. + # But this can cause much bigger problem for Nix as it can produce + # cut-in-half-by-\0 store path references. + # Let’s just clear the whole rpath and hope for the best. + ./002-clear-old-rpath.patch + + # Meson is currently inspecting fewer variables than autoconf does, which + # makes it harder for us to use setup hooks, etc. + # https://github.com/mesonbuild/meson/pull/6827 + ./003-more-env-vars.patch + + # Unlike libtool, vanilla Meson does not pass any information about the path + # library will be installed to to g-ir-scanner, breaking the GIR when path + # other than ${!outputLib}/lib is used. + # We patch Meson to add a --fallback-library-path argument with library + # install_dir to g-ir-scanner. + ./004-gir-fallback-path.patch + + # Patch out default boost search paths to avoid impure builds on + # unsandboxed non-NixOS builds, see: + # https://github.com/NixOS/nixpkgs/issues/86131#issuecomment-711051774 + ./005-boost-Do-not-add-system-paths-on-nix.patch + + # Nixpkgs cctools does not have bitcode support. + ./006-disable-bitcode.patch + + # Fix cross-compilation of proc-macro (and mesa) + # https://github.com/mesonbuild/meson/issues/12973 + ./0001-Revert-rust-recursively-pull-proc-macro-dependencies.patch + ]; + + buildInputs = lib.optionals (python3.pythonOlder "3.9") [ + libxcrypt + ]; + + nativeBuildInputs = [ installShellFiles ]; + + nativeCheckInputs = [ + ninja + pkg-config + ]; + + checkInputs = [ + zlib + ] + ++ lib.optionals stdenv.isDarwin [ + AppKit + Cocoa + Foundation + LDAP + OpenAL + OpenGL + openldap + ]; + + checkPhase = lib.concatStringsSep "\n" ([ + "runHook preCheck" + '' + patchShebangs 'test cases' + substituteInPlace \ + 'test cases/native/8 external program shebang parsing/script.int.in' \ + 'test cases/common/273 customtarget exe for test/generate.py' \ + --replace /usr/bin/env ${coreutils}/bin/env + '' + ] + # Remove problematic tests + ++ (builtins.map (f: ''rm -vr "${f}";'') [ + # requires git, creating cyclic dependency + ''test cases/common/66 vcstag'' + # requires glib, creating cyclic dependency + ''test cases/linuxlike/6 subdir include order'' + ''test cases/linuxlike/9 compiler checks with dependencies'' + # requires static zlib, see #66461 + ''test cases/linuxlike/14 static dynamic linkage'' + # Nixpkgs cctools does not have bitcode support. + ''test cases/osx/7 bitcode'' + ]) + ++ [ + ''HOME="$TMPDIR" python ./run_project_tests.py'' + "runHook postCheck" + ]); + + postInstall = '' + installShellCompletion --zsh data/shell-completions/zsh/_meson + installShellCompletion --bash data/shell-completions/bash/meson + ''; + + postFixup = '' + pushd $out/bin + # undo shell wrapper as meson tools are called with python + for i in *; do + mv ".$i-wrapped" "$i" + done + popd + + # Do not propagate Python + rm $out/nix-support/propagated-build-inputs + + substituteInPlace "$out/share/bash-completion/completions/meson" \ + --replace "python3 -c " "${python3.interpreter} -c " + ''; + + setupHook = ./setup-hook.sh; + + meta = { + homepage = "https://mesonbuild.com"; + description = "An open source, fast and friendly build system made in Python"; + mainProgram = "meson"; + longDescription = '' + Meson is an open source build system meant to be both extremely fast, and, + even more importantly, as user friendly as possible. + + The main design point of Meson is that every moment a developer spends + writing or debugging build definitions is a second wasted. So is every + second spent waiting for the build system to actually start compiling + code. + ''; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ AndersonTorres ]; + inherit (python3.meta) platforms; + }; +} +# TODO: a more Nixpkgs-tailoired test suite diff --git a/pkgs/by-name/me/meson/emulator-hook.sh b/pkgs/by-name/me/meson/emulator-hook.sh new file mode 100644 index 0000000..4f08087 --- /dev/null +++ b/pkgs/by-name/me/meson/emulator-hook.sh @@ -0,0 +1,5 @@ +add_meson_exe_wrapper_cross_flag() { + mesonFlagsArray+=(--cross-file=@crossFile@) +} + +preConfigureHooks+=(add_meson_exe_wrapper_cross_flag) diff --git a/pkgs/by-name/me/meson/packages.nix b/pkgs/by-name/me/meson/packages.nix new file mode 100644 index 0000000..58d7361 --- /dev/null +++ b/pkgs/by-name/me/meson/packages.nix @@ -0,0 +1,31 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + meson = callPackage ./. { }; + + # while building documentation meson may want to run binaries for host + # which needs an emulator + # example of an error which this fixes + # [Errno 8] Exec format error: './gdk3-scan' + mesonEmulatorHook = + makeSetupHook + { + name = "mesonEmulatorHook"; + substitutions = { + crossFile = writeText "cross-file.conf" '' + [binaries] + exe_wrapper = ${lib.escapeShellArg (stdenv.targetPlatform.emulator pkgs)} + ''; + }; + } + # The throw is moved into the `makeSetupHook` derivation, so that its + # outer level, but not its outPath can still be evaluated if the condition + # doesn't hold. This ensures that splicing still can work correctly. + (if (!stdenv.hostPlatform.canExecute stdenv.targetPlatform) then + ../by-name/me/meson/emulator-hook.sh + else + throw "mesonEmulatorHook may only be added to nativeBuildInputs when the target binaries can't be executed; however you are attempting to use it in a situation where ${stdenv.hostPlatform.config} can execute ${stdenv.targetPlatform.config}. Consider only adding mesonEmulatorHook according to a conditional based canExecute in your package expression."); +} + diff --git a/pkgs/by-name/me/meson/setup-hook.sh b/pkgs/by-name/me/meson/setup-hook.sh new file mode 100644 index 0000000..85849fb --- /dev/null +++ b/pkgs/by-name/me/meson/setup-hook.sh @@ -0,0 +1,87 @@ +# shellcheck shell=bash disable=SC2206 + +mesonConfigurePhase() { + runHook preConfigure + + local flagsArray=() + + if [ -z "${dontAddPrefix-}" ]; then + flagsArray+=("--prefix=$prefix") + fi + + # See multiple-outputs.sh and meson’s coredata.py + flagsArray+=( + "--libdir=${!outputLib}/lib" + "--libexecdir=${!outputLib}/libexec" + "--bindir=${!outputBin}/bin" + "--sbindir=${!outputBin}/sbin" + "--includedir=${!outputInclude}/include" + "--mandir=${!outputMan}/share/man" + "--infodir=${!outputInfo}/share/info" + "--localedir=${!outputLib}/share/locale" + "-Dauto_features=${mesonAutoFeatures:-enabled}" + "-Dwrap_mode=${mesonWrapMode:-nodownload}" + ${crossMesonFlags} + "--buildtype=${mesonBuildType:-plain}" + ) + + flagsArray+=( + $mesonFlags + "${mesonFlagsArray[@]}" + ) + + echoCmd 'mesonConfigurePhase flags' "${flagsArray[@]}" + + meson setup build "${flagsArray[@]}" + cd build || { echoCmd 'mesonConfigurePhase' "could not cd to build"; exit 1; } + + if ! [[ -v enableParallelBuilding ]]; then + enableParallelBuilding=1 + echoCmd 'mesonConfigurePhase' "enabled parallel building" + fi + + if [[ ${checkPhase-ninjaCheckPhase} = ninjaCheckPhase && -z $dontUseMesonCheck ]]; then + checkPhase=mesonCheckPhase + fi + if [[ ${installPhase-ninjaInstallPhase} = ninjaInstallPhase && -z $dontUseMesonInstall ]]; then + installPhase=mesonInstallPhase + fi + + runHook postConfigure +} + +mesonCheckPhase() { + runHook preCheck + + local flagsArray=($mesonCheckFlags "${mesonCheckFlagsArray[@]}") + + echoCmd 'mesonCheckPhase flags' "${flagsArray[@]}" + meson test --no-rebuild "${flagsArray[@]}" + + runHook postCheck +} + +mesonInstallPhase() { + runHook preInstall + + local flagsArray=() + + if [[ -n "$mesonInstallTags" ]]; then + flagsArray+=("--tags" "${mesonInstallTags// /,}") + fi + flagsArray+=( + $mesonInstallFlags + "${mesonInstallFlagsArray[@]}" + ) + + echoCmd 'mesonInstallPhase flags' "${flagsArray[@]}" + meson install --no-rebuild "${flagsArray[@]}" + + runHook postInstall +} + +if [ -z "${dontUseMesonConfigure-}" ] && [ -z "${configurePhase-}" ]; then + # shellcheck disable=SC2034 + setOutputFlags= + configurePhase=mesonConfigurePhase +fi diff --git a/pkgs/by-name/mi/minizip/default.nix b/pkgs/by-name/mi/minizip/default.nix new file mode 100644 index 0000000..586dd11 --- /dev/null +++ b/pkgs/by-name/mi/minizip/default.nix @@ -0,0 +1,19 @@ +{ lib, stdenv, zlib, autoreconfHook, fetchpatch }: + +stdenv.mkDerivation { + pname = "minizip"; + inherit (zlib) src version; + + patchFlags = [ "-p3" ]; + + nativeBuildInputs = [ autoreconfHook ]; + buildInputs = [ zlib ]; + + sourceRoot = "zlib-${zlib.version}/contrib/minizip"; + + meta = { + description = "Compression library implementing the deflate compression method found in gzip and PKZIP"; + inherit (zlib.meta) license homepage; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/mp/mpdecimal/default.nix b/pkgs/by-name/mp/mpdecimal/default.nix new file mode 100644 index 0000000..514c61f --- /dev/null +++ b/pkgs/by-name/mp/mpdecimal/default.nix @@ -0,0 +1,55 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "mpdecimal"; + version = "4.0.0"; + outputs = [ "out" "cxx" "doc" "dev" ]; + + src = fetchurl { + url = "https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-${version}.tar.gz"; + hash = "sha256-lCRFwyRbInMP1Bpnp8XCMdEcsbmTa5wPdjNPt9C0Row="; + }; + + configureFlags = [ "LD=${stdenv.cc.targetPrefix}cc" ]; + + postInstall = '' + mkdir -p $cxx/lib + mv $out/lib/*c++* $cxx/lib + + mkdir -p $dev/nix-support + echo -n $cxx >> $dev/nix-support/propagated-build-inputs + ''; + + meta = { + description = "Library for arbitrary precision decimal floating point arithmetic"; + + longDescription = '' + libmpdec is a fast C/C++ library for correctly-rounded arbitrary + precision decimal floating point arithmetic. It is a complete + implementation of Mike Cowlishaw/IBM's General Decimal Arithmetic + Specification. The full specification is available here: + + http://speleotrove.com/decimal/ + + libmpdec will - with minor restrictions - also conform to the IEEE + 754-2008 Standard for Floating-Point Arithmetic, provided that the + appropriate context parameters are set. + + libmpdec++ is a complete implementation of the General Decimal Arithmetic + Specification. libmpdec++ is mostly a header library around libmpdec's C + functions. + ''; + + homepage = "https://www.bytereef.org/mpdecimal/index.html"; + + downloadPage = "https://www.bytereef.org/mpdecimal/download.html"; + + changelog = "https://www.bytereef.org/mpdecimal/changelog.html"; + + license = lib.licenses.bsd2; + + maintainers = with lib.maintainers; [ kaction ]; + + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/mp/mpfr/default.nix b/pkgs/by-name/mp/mpfr/default.nix new file mode 100644 index 0000000..dec33a6 --- /dev/null +++ b/pkgs/by-name/mp/mpfr/default.nix @@ -0,0 +1,78 @@ +{ lib +, stdenv +, fetchurl +, gmp +, writeScript +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + version = "4.2.1"; + pname = "mpfr"; + + src = fetchurl { + urls = [ + "https://www.mpfr.org/${pname}-${version}/${pname}-${version}.tar.xz" + "mirror://gnu/mpfr/${pname}-${version}.tar.xz" + ]; + hash = "sha256-J3gHNTpnJpeJlpRa8T5Sgp46vXqaW3+yeTiU4Y8fy7I="; + }; + + outputs = [ "out" "dev" "doc" "info" ]; + + strictDeps = true; + # mpfr.h requires gmp.h + propagatedBuildInputs = [ gmp ]; + + configureFlags = lib.optional stdenv.hostPlatform.isSunOS "--disable-thread-safe" + ++ lib.optional stdenv.hostPlatform.is64bit "--with-pic" + ++ lib.optionals stdenv.hostPlatform.isPower64 [ + # Without this, the `tget_set_d128` test experiences a link + # error due to missing `__dpd_trunctdkf`. + "--disable-decimal-float" + ]; + + doCheck = true; # not cross; + + enableParallelBuilding = true; + + passthru = { + updateScript = writeScript "update-mpfr" '' + #!/usr/bin/env nix-shell + #!nix-shell -i bash -p curl pcre common-updater-scripts + + set -eu -o pipefail + + # Expect the text in format of 'GNU MPFR version 4.1.1' + new_version="$(curl -s https://www.mpfr.org/mpfr-current/ | + pcregrep -o1 'GNU MPFR version ([0-9.]+)')" + update-source-version ${pname} "$new_version" + ''; + }; + + meta = { + homepage = "https://www.mpfr.org/"; + description = "Library for multiple-precision floating-point arithmetic"; + + longDescription = '' + The GNU MPFR library is a C library for multiple-precision + floating-point computations with correct rounding. MPFR is + based on the GMP multiple-precision library. + + The main goal of MPFR is to provide a library for + multiple-precision floating-point computation which is both + efficient and has a well-defined semantics. It copies the good + ideas from the ANSI/IEEE-754 standard for double-precision + floating-point arithmetic (53-bit mantissa). + ''; + + license = lib.licenses.lgpl2Plus; + + maintainers = [ ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/ms/mscgen/default.nix b/pkgs/by-name/ms/mscgen/default.nix new file mode 100644 index 0000000..a391a62 --- /dev/null +++ b/pkgs/by-name/ms/mscgen/default.nix @@ -0,0 +1,54 @@ +{ lib, stdenv +, bison +, fetchurl +, flex +, gd +, libjpeg +, libpng +, libwebp +, pkg-config +, runtimeShell +, zlib +}: + +stdenv.mkDerivation rec { + pname = "mscgen"; + version = "0.20"; + + src = fetchurl { + url = "http://www.mcternan.me.uk/mscgen/software/mscgen-src-${version}.tar.gz"; + sha256 = "3c3481ae0599e1c2d30b7ed54ab45249127533ab2f20e768a0ae58d8551ddc23"; + }; + + nativeBuildInputs = [ bison flex pkg-config ]; + buildInputs = [ gd libjpeg libpng libwebp zlib ]; + + doCheck = true; + preCheck = '' + sed -i -e "s|#!/bin/bash|#!${runtimeShell}|" test/renderercheck.sh + ''; + + outputs = [ "out" "man" ]; + + meta = { + homepage = "http://www.mcternan.me.uk/mscgen/"; + description = "Convert Message Sequence Chart descriptions into PNG, SVG, or EPS images"; + license = lib.licenses.gpl2; + + longDescription = '' + Mscgen is a small program that parses Message Sequence Chart + descriptions and produces PNG, SVG, EPS or server side image maps + (ismaps) as the output. Message Sequence Charts (MSCs) are a way + of representing entities and interactions over some time period + and are often used in combination with SDL. MSCs are popular in + Telecoms to specify how protocols operate although MSCs need not + be complicated to create or use. Mscgen aims to provide a simple + text language that is clear to create, edit and understand, which + can also be transformed into common image formats for display or + printing. + ''; + + platforms = lib.platforms.unix; + mainProgram = "mscgen"; + }; +} diff --git a/pkgs/by-name/mu/musl/default.nix b/pkgs/by-name/mu/musl/default.nix new file mode 100644 index 0000000..9f78670 --- /dev/null +++ b/pkgs/by-name/mu/musl/default.nix @@ -0,0 +1,161 @@ +{ stdenv, lib, fetchurl +, linuxHeaders ? null +, useBSDCompatHeaders ? true +}: +let + cdefs_h = fetchurl { + name = "sys-cdefs.h"; + url = "https://git.alpinelinux.org/aports/plain/main/libc-dev/sys-cdefs.h?id=7ca0ed62d4c0d713d9c7dd5b9a077fba78bce578"; + sha256 = "16l3dqnfq0f20rzbkhc38v74nqcsh9n3f343bpczqq8b1rz6vfrh"; + }; + queue_h = fetchurl { + name = "sys-queue.h"; + url = "http://git.alpinelinux.org/aports/plain/main/libc-dev/sys-queue.h?id=7ca0ed62d4c0d713d9c7dd5b9a077fba78bce578"; + sha256 = "12qm82id7zys92a1qh2l1qf2wqgq6jr4qlbjmqyfffz3s3nhfd61"; + }; + tree_h = fetchurl { + name = "sys-tree.h"; + url = "http://git.alpinelinux.org/aports/plain/main/libc-dev/sys-tree.h?id=7ca0ed62d4c0d713d9c7dd5b9a077fba78bce578"; + sha256 = "14igk6k00bnpfw660qhswagyhvr0gfqg4q55dxvaaq7ikfkrir71"; + }; + + stack_chk_fail_local_c = fetchurl { + name = "__stack_chk_fail_local.c"; + url = "https://git.alpinelinux.org/aports/plain/main/musl/__stack_chk_fail_local.c?id=9afbe3cbbf4c30ff23c733218c3c03d7e8c6461d"; + sha256 = "1nhkzzy9pklgjcq2yg89d3l18jif331srd3z3vhy5qwxl1spv6i9"; + }; + + # iconv tool, implemented by musl author. + # Original: http://git.etalabs.net/cgit/noxcuse/plain/src/iconv.c?id=02d288d89683e99fd18fe9f54d4e731a6c474a4f + # We use copy from Alpine which fixes error messages, see: + # https://git.alpinelinux.org/aports/commit/main/musl/iconv.c?id=a3d97e95f766c9c378194ee49361b375f093b26f + iconv_c = fetchurl { + name = "iconv.c"; + url = "https://git.alpinelinux.org/aports/plain/main/musl/iconv.c?id=a3d97e95f766c9c378194ee49361b375f093b26f"; + sha256 = "1mzxnc2ncq8lw9x6n7p00fvfklc9p3wfv28m68j0dfz5l8q2k6pp"; + }; + + arch = if stdenv.hostPlatform.isx86_64 + then "x86_64" + else if stdenv.hostPlatform.isx86_32 + then "i386" + else null; + +in +stdenv.mkDerivation rec { + pname = "musl"; + version = "1.2.3"; + + src = fetchurl { + url = "https://musl.libc.org/releases/${pname}-${version}.tar.gz"; + sha256 = "sha256-fVsLYGJSHkYn4JnkydyCSNMqMChelZt+7Kp4DPjP1KQ="; + }; + + enableParallelBuilding = true; + + # Disable auto-adding stack protector flags, + # so musl can selectively disable as needed + hardeningDisable = [ "stackprotector" ]; + + # Leave these, be friendlier to debuggers/perf tools + # Don't force them on, but don't force off either + postPatch = '' + substituteInPlace configure \ + --replace -fno-unwind-tables "" \ + --replace -fno-asynchronous-unwind-tables "" + ''; + + patches = [ + # Minor touchup to build system making dynamic linker symlink relative + (fetchurl { + url = "https://raw.githubusercontent.com/openwrt/openwrt/87606e25afac6776d1bbc67ed284434ec5a832b4/toolchain/musl/patches/300-relative.patch"; + sha256 = "0hfadrycb60sm6hb6by4ycgaqc9sgrhh42k39v8xpmcvdzxrsq2n"; + }) + + # fix parsing lines with optional fields in fstab etc. NOTE: Remove for the next release since it has been merged upstream + (fetchurl { + url = "https://git.musl-libc.org/cgit/musl/patch/?id=751bee0ee727e8d8b003c87cff77ac76f1dbecd6"; + sha256 = "sha256-qCw132TCSaZrkISmtDb8Q8ufyt8sAJdwACkvfwuoi/0="; + }) + ]; + CFLAGS = [ "-fstack-protector-strong" ] + ++ lib.optional stdenv.hostPlatform.isPower "-mlong-double-64"; + + configureFlags = [ + "--enable-shared" + "--enable-static" + "--enable-debug" + "--enable-wrapper=all" + "--syslibdir=${placeholder "out"}/lib" + ]; + + outputs = [ "out" "bin" "dev" ]; + + dontDisableStatic = true; + dontAddStaticConfigureFlags = true; + separateDebugInfo = true; + + NIX_DONT_SET_RPATH = true; + + preBuild = '' + ${lib.optionalString (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32) + "# the -x c flag is required since the file extension confuses gcc + # that detect the file as a linker script. + $CC -x c -c ${stack_chk_fail_local_c} -o __stack_chk_fail_local.o + $AR r libssp_nonshared.a __stack_chk_fail_local.o" + } + ''; + + postInstall = '' + # Not sure why, but link in all but scsi directory as that's what uclibc/glibc do. + # Apparently glibc provides scsi itself? + (cd $dev/include && ln -s $(ls -d ${linuxHeaders}/include/* | grep -v "scsi$") .) + + ${lib.optionalString (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32) + "install -D libssp_nonshared.a $out/lib/libssp_nonshared.a" + } + + # Create 'ldd' symlink, builtin + ln -s $out/lib/libc.so $bin/bin/ldd + + # (impure) cc wrapper around musl for interactive usuage + for i in musl-gcc musl-clang ld.musl-clang; do + moveToOutput bin/$i $dev + done + moveToOutput lib/musl-gcc.specs $dev + substituteInPlace $dev/bin/musl-gcc \ + --replace $out/lib/musl-gcc.specs $dev/lib/musl-gcc.specs + + # provide 'iconv' utility, using just-built headers, libc/ldso + $CC ${iconv_c} -o $bin/bin/iconv \ + -I$dev/include \ + -L$out/lib -Wl,-rpath=$out/lib \ + -lc \ + -B $out/lib \ + -Wl,-dynamic-linker=$(ls $out/lib/ld-*) + '' + lib.optionalString (arch != null) '' + # Create 'libc.musl-$arch' symlink + ln -rs $out/lib/libc.so $out/lib/libc.musl-${arch}.so.1 + '' + lib.optionalString useBSDCompatHeaders '' + install -D ${queue_h} $dev/include/sys/queue.h + install -D ${cdefs_h} $dev/include/sys/cdefs.h + install -D ${tree_h} $dev/include/sys/tree.h + ''; + + passthru.linuxHeaders = linuxHeaders; + + meta = with lib; { + description = "An efficient, small, quality libc implementation"; + homepage = "https://musl.libc.org/"; + changelog = "https://git.musl-libc.org/cgit/musl/tree/WHATSNEW?h=v${version}"; + license = licenses.mit; + platforms = [ + "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" + "armv7l-linux" "i686-linux" "x86_64-linux" "m68k-linux" + "microblaze-linux" "microblazeel-linux" "mips-linux" "mips64-linux" + "mipsel-linux" "mips64el-linux" "powerpc64-linux" "powerpc64le-linux" + "riscv64-linux" "s390x-linux" + ]; + maintainers = with maintainers; [ thoughtpolice dtzWill ]; + }; +} diff --git a/pkgs/by-name/mu/musl/packages.nix b/pkgs/by-name/mu/musl/packages.nix new file mode 100644 index 0000000..7dd8e56 --- /dev/null +++ b/pkgs/by-name/mu/musl/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + musl = callPackage ./. { }; + muslCross = musl.override { + stdenv = crossLibcStdenv; + }; +} diff --git a/pkgs/by-name/na/nasm/default.nix b/pkgs/by-name/na/nasm/default.nix new file mode 100644 index 0000000..64abd3a --- /dev/null +++ b/pkgs/by-name/na/nasm/default.nix @@ -0,0 +1,45 @@ +{ lib +, stdenv +, fetchurl +, perl +, gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "nasm"; + version = "2.16.02"; + + src = fetchurl { + url = "https://www.nasm.us/pub/nasm/releasebuilds/${version}/${pname}-${version}.tar.xz"; + sha256 = "sha256-HhuULqiPIu2uiWWeFb4m+gJ+rgdH9RQTVA9S1OrEeQ0="; + }; + + nativeBuildInputs = [ perl ]; + + enableParallelBuilding = true; + + doCheck = true; + + checkPhase = '' + runHook preCheck + + make golden + make test + + runHook postCheck + ''; + + passthru.updateScript = gitUpdater { + url = "https://github.com/netwide-assembler/nasm.git"; + rev-prefix = "nasm-"; + ignoredVersions = "rc.*"; + }; + + meta = with lib; { + homepage = "https://www.nasm.us/"; + description = "An 80x86 and x86-64 assembler designed for portability and modularity"; + platforms = platforms.unix; + maintainers = with maintainers; [ pSub willibutz ]; + license = licenses.bsd2; + }; +} diff --git a/pkgs/by-name/nc/ncompress/default.nix b/pkgs/by-name/nc/ncompress/default.nix new file mode 100644 index 0000000..c4678cd --- /dev/null +++ b/pkgs/by-name/nc/ncompress/default.nix @@ -0,0 +1,27 @@ +{ lib, stdenv, fetchFromGitHub }: + +stdenv.mkDerivation rec { + pname = "ncompress"; + version = "5.0"; + + src = fetchFromGitHub { + owner = "vapier"; + repo = "ncompress"; + rev = "v${version}"; + sha256 = "sha256-Yhs3C5/kR7Ve56E84usYJprxIMAIwXVahLi1N9TIfj0="; + }; + + makeFlags = [ "PREFIX=$(out)" ]; + installTargets = "install_core"; + + postInstall = '' + mv $out/bin/uncompress $out/bin/uncompress-ncompress + ''; + + meta = with lib; { + homepage = "http://ncompress.sourceforge.net/"; + license = licenses.publicDomain; + description = "A fast, simple LZW file compressor"; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/nc/ncurses/default.nix b/pkgs/by-name/nc/ncurses/default.nix new file mode 100644 index 0000000..2d383c8 --- /dev/null +++ b/pkgs/by-name/nc/ncurses/default.nix @@ -0,0 +1,203 @@ +{ lib +, stdenv +, fetchurl +, buildPackages +, ncurses +, pkg-config +, abiVersion ? "6" +, enableStatic ? stdenv.hostPlatform.isStatic +, withCxx ? !stdenv.hostPlatform.useAndroidPrebuilt +, mouseSupport ? false, gpm +, unicodeSupport ? true +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + version = "6.4"; + pname = "ncurses" + lib.optionalString (abiVersion == "5") "-abi5-compat"; + + src = fetchurl { + url = "https://invisible-island.net/archives/ncurses/ncurses-${finalAttrs.version}.tar.gz"; + hash = "sha256-aTEoPZrIfFBz8wtikMTHXyFjK7T8NgOsgQCBK+0kgVk="; + }; + + outputs = [ "out" "dev" "man" ]; + setOutputFlags = false; # some aren't supported + + configureFlags = [ + (lib.withFeature (!enableStatic) "shared") + "--without-debug" + "--enable-pc-files" + "--enable-symlinks" + "--with-manpage-format=normal" + "--disable-stripping" + "--with-versioned-syms" + ] ++ lib.optional unicodeSupport "--enable-widec" + ++ lib.optional (!withCxx) "--without-cxx" + ++ lib.optional (abiVersion == "5") "--with-abi-version=5" + ++ lib.optional stdenv.hostPlatform.isNetBSD "--enable-rpath" + ++ lib.optionals stdenv.hostPlatform.isWindows [ + "--enable-sp-funcs" + "--enable-term-driver" + ] ++ lib.optionals (stdenv.hostPlatform.isUnix && stdenv.hostPlatform.isStatic) [ + # For static binaries, the point is to have a standalone binary with + # minimum dependencies. So here we make sure that binaries using this + # package won't depend on a terminfo database located in the Nix store. + "--with-terminfo-dirs=${lib.concatStringsSep ":" [ + "/etc/terminfo" # Debian, Fedora, Gentoo + "/lib/terminfo" # Debian + "/usr/share/terminfo" # upstream default, probably all FHS-based distros + "/run/current-system/sw/share/terminfo" # NixOS + ]}" + ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "--with-build-cc=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc" + ]; + + # Only the C compiler, and explicitly not C++ compiler needs this flag on solaris: + CFLAGS = lib.optionalString stdenv.isSunOS "-D_XOPEN_SOURCE_EXTENDED"; + + strictDeps = true; + + nativeBuildInputs = [ + pkg-config + ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + # for `tic`, build already depends on for build `cc` so it's weird the build doesn't just build `tic`. + ncurses + ]; + + buildInputs = lib.optional (mouseSupport && stdenv.isLinux) gpm; + + preConfigure = '' + export PKG_CONFIG_LIBDIR="$dev/lib/pkgconfig" + mkdir -p "$PKG_CONFIG_LIBDIR" + configureFlagsArray+=( + "--libdir=$out/lib" + "--includedir=$dev/include" + "--bindir=$dev/bin" + "--mandir=$man/share/man" + "--with-pkg-config-libdir=$PKG_CONFIG_LIBDIR" + ) + '' + + lib.optionalString stdenv.isSunOS '' + sed -i -e '/-D__EXTENSIONS__/ s/-D_XOPEN_SOURCE=\$cf_XOPEN_SOURCE//' \ + -e '/CPPFLAGS="$CPPFLAGS/s/ -D_XOPEN_SOURCE_EXTENDED//' \ + configure + CFLAGS=-D_XOPEN_SOURCE_EXTENDED + ''; + + enableParallelBuilding = true; + + doCheck = false; + + postFixup = let + abiVersion-extension = if stdenv.isDarwin then "${abiVersion}.$dylibtype" else "$dylibtype.${abiVersion}"; in + '' + # Determine what suffixes our libraries have + suffix="$(awk -F': ' 'f{print $3; f=0} /default library suffix/{f=1}' config.log)" + '' + # When building a wide-character (Unicode) build, create backward + # compatibility links from the the "normal" libraries to the + # wide-character libraries (e.g. libncurses.so to libncursesw.so). + + lib.optionalString unicodeSupport '' + libs="$(ls $dev/lib/pkgconfig | tr ' ' '\n' | sed "s,\(.*\)$suffix\.pc,\1,g")" + suffixes="$(echo "$suffix" | awk '{for (i=1; i < length($0); i++) {x=substr($0, i+1, length($0)-i); print x}}')" + + # Get the path to the config util + cfg=$(basename $dev/bin/ncurses*-config) + + # symlink the full suffixed include directory + ln -svf . $dev/include/ncurses$suffix + + for newsuffix in $suffixes ""; do + # Create a non-abi versioned config util links + ln -svf $cfg $dev/bin/ncurses$newsuffix-config + + # Allow for end users who #include + ln -svf . $dev/include/ncurses$newsuffix + + for library in $libs; do + for dylibtype in so dll dylib; do + if [ -e "$out/lib/lib''${library}$suffix.$dylibtype" ]; then + ln -svf lib''${library}$suffix.$dylibtype $out/lib/lib$library$newsuffix.$dylibtype + ln -svf lib''${library}$suffix.${abiVersion-extension} $out/lib/lib$library$newsuffix.${abiVersion-extension} + if [ "ncurses" = "$library" ] + then + # make libtinfo symlinks + ln -svf lib''${library}$suffix.$dylibtype $out/lib/libtinfo$newsuffix.$dylibtype + ln -svf lib''${library}$suffix.${abiVersion-extension} $out/lib/libtinfo$newsuffix.${abiVersion-extension} + fi + fi + done + for statictype in a dll.a la; do + if [ -e "$out/lib/lib''${library}$suffix.$statictype" ]; then + ln -svf lib''${library}$suffix.$statictype $out/lib/lib$library$newsuffix.$statictype + if [ "ncurses" = "$library" ] + then + # make libtinfo symlinks + ln -svf lib''${library}$suffix.$statictype $out/lib/libtinfo$newsuffix.$statictype + fi + fi + done + ln -svf ''${library}$suffix.pc $dev/lib/pkgconfig/$library$newsuffix.pc + done + done + '' + # Unconditional patches. Leading newline is to avoid mass rebuilds. + + '' + + # add pkg-config aliases for libraries that are built-in to libncurses(w) + for library in tinfo tic; do + for suffix in "" ${lib.optionalString unicodeSupport "w"}; do + ln -svf ncurses$suffix.pc $dev/lib/pkgconfig/$library$suffix.pc + done + done + + # move some utilities to $bin + # these programs are used at runtime and don't really belong in $dev + moveToOutput "bin/clear" "$out" + moveToOutput "bin/reset" "$out" + moveToOutput "bin/tabs" "$out" + moveToOutput "bin/tic" "$out" + moveToOutput "bin/tput" "$out" + moveToOutput "bin/tset" "$out" + moveToOutput "bin/captoinfo" "$out" + moveToOutput "bin/infotocap" "$out" + moveToOutput "bin/infocmp" "$out" + ''; + + preFixup = lib.optionalString (!stdenv.hostPlatform.isCygwin && !enableStatic) '' + rm "$out"/lib/*.a + ''; + + meta = with lib; { + homepage = "https://www.gnu.org/software/ncurses/"; + description = "Free software emulation of curses in SVR4 and more"; + longDescription = '' + The Ncurses (new curses) library is a free software emulation of curses in + System V Release 4.0, and more. It uses Terminfo format, supports pads and + color and multiple highlights and forms characters and function-key + mapping, and has all the other SYSV-curses enhancements over BSD Curses. + + The ncurses code was developed under GNU/Linux. It has been in use for + some time with OpenBSD as the system curses library, and on FreeBSD and + NetBSD as an external package. It should port easily to any + ANSI/POSIX-conforming UNIX. It has even been ported to OS/2 Warp! + ''; + license = licenses.mit; + pkgConfigModules = let + base = [ + "form" + "menu" + "ncurses" + "panel" + ] ++ lib.optional withCxx "ncurses++"; + in base ++ lib.optionals unicodeSupport (map (p: p + "w") base); + platforms = platforms.all; + }; + + passthru = { + ldflags = "-lncurses"; + inherit unicodeSupport abiVersion; + tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; +}) diff --git a/pkgs/by-name/nc/ncurses/packages.nix b/pkgs/by-name/nc/ncurses/packages.nix new file mode 100644 index 0000000..663cacd --- /dev/null +++ b/pkgs/by-name/nc/ncurses/packages.nix @@ -0,0 +1,16 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + ncurses5 = ncurses.override { + abiVersion = "5"; + }; + ncurses6 = ncurses.override { + abiVersion = "6"; + }; + ncurses = + if stdenv.hostPlatform.useiOSPrebuilt + then null + else callPackage ./. { }; +} diff --git a/pkgs/by-name/ne/netbsd/default.nix b/pkgs/by-name/ne/netbsd/default.nix new file mode 100644 index 0000000..fd5e24a --- /dev/null +++ b/pkgs/by-name/ne/netbsd/default.nix @@ -0,0 +1,137 @@ +{ stdenv, lib, stdenvNoCC +, makeScopeWithSplicing', generateSplicesForMkScope +, buildPackages +, fetchcvs +}: + +makeScopeWithSplicing' { + otherSplices = generateSplicesForMkScope "netbsd"; + f = (self: lib.packagesFromDirectoryRecursive { + callPackage = self.callPackage; + directory = ./pkgs; + } // (let inherit (self) mkDerivation; in { + + fetchNetBSD = path: version: sha256: fetchcvs { + cvsRoot = ":pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot"; + module = "src/${path}"; + inherit sha256; + tag = "netbsd-${lib.replaceStrings ["."] ["-"] version}-RELEASE"; + }; + + defaultMakeFlags = [ + "MKSOFTFLOAT=${if stdenv.hostPlatform.gcc.float or (stdenv.hostPlatform.parsed.abi.float or "hard") == "soft" + then "yes" + else "no"}" + ]; + + compatIfNeeded = lib.optional (!stdenvNoCC.hostPlatform.isNetBSD) self.compat; + + # The manual callPackages below should in principle be unnecessary because + # they're just selecting arguments that would be selected anyway. However, + # if we don't perform these manual calls, we get infinite recursion issues + # because of the splices. + + mkDerivation = self.callPackage ./pkgs/mkDerivation.nix { + inherit stdenv stdenvNoCC; + inherit (buildPackages.netbsd) netbsdSetupHook makeMinimal install tsort lorder; + inherit (buildPackages) mandoc; + inherit (buildPackages.buildPackages) rsync; + + }; + + makeMinimal = self.callPackage ./pkgs/makeMinimal.nix { + inherit (self) make; + }; + + compat = self.callPackage ./pkgs/compat/package.nix { + inherit (buildPackages) coreutils; + inherit (buildPackages.darwin) cctools-port; + inherit (buildPackages.buildPackages) rsync; + inherit (buildPackages.netbsd) makeMinimal; + inherit (self) install include libc libutil; + }; + + install = self.callPackage ./pkgs/install/package.nix { + inherit (self) fts mtree make compatIfNeeded; + inherit (buildPackages.buildPackages) rsync; + inherit (buildPackages.netbsd) makeMinimal; + }; + + # See note in pkgs/stat/package.nix + stat = self.callPackage ./pkgs/stat/package.nix { + inherit (buildPackages.netbsd) makeMinimal install; + inherit (buildPackages.buildPackages) rsync; + }; + + # See note in pkgs/stat/hook.nix + statHook = self.callPackage ./pkgs/stat/hook.nix { + inherit (self) stat; + }; + + tsort = self.callPackage ./pkgs/tsort.nix { + inherit (buildPackages.netbsd) makeMinimal install; + inherit (buildPackages.buildPackages) rsync; + }; + + lorder = self.callPackage ./pkgs/lorder.nix { + inherit (buildPackages.netbsd) makeMinimal install; + inherit (buildPackages.buildPackages) rsync; + }; + + config = self.callPackage ./pkgs/config.nix { + inherit (buildPackages.netbsd) makeMinimal install; + inherit (buildPackages.buildPackages) rsync; + inherit (self) cksum; + }; + + include = self.callPackage ./pkgs/include.nix { + inherit (buildPackages.netbsd) + makeMinimal install nbperf rpcgen; + inherit (buildPackages) stdenv; + inherit (buildPackages.buildPackages) rsync; + }; + + sys-headers = self.callPackage ./pkgs/sys/headers.nix { + inherit (buildPackages.netbsd) + makeMinimal install tsort lorder statHook uudecode config genassym; + inherit (buildPackages.buildPackages) rsync; + }; + + libutil = self.callPackage ./pkgs/libutil.nix { + inherit (self) libc sys; + }; + + libpthread-headers = self.callPackage ./pkgs/libpthread/headers.nix { }; + + csu = self.callPackage ./pkgs/csu.nix { + inherit (self) headers sys ld_elf_so; + inherit (buildPackages.netbsd) + netbsdSetupHook + makeMinimal + install + genassym gencat lorder tsort statHook; + inherit (buildPackages.buildPackages) rsync; + }; + + _mainLibcExtraPaths = with self; [ + common i18n_module.src sys.src + ld_elf_so.src libpthread.src libm.src libresolv.src + librpcsvc.src libutil.src librt.src libcrypt.src + ]; + + libc = self.callPackage ./pkgs/libc.nix { + inherit (self) headers csu librt; + inherit (buildPackages.netbsd) + netbsdSetupHook + makeMinimal + install + genassym gencat lorder tsort statHook rpcgen; + inherit (buildPackages.buildPackages) rsync; + }; + + mtree = self.callPackage ./pkgs/mtree.nix { + inherit (self) mknod; + }; + + })); +} diff --git a/pkgs/by-name/ne/netbsd/packages.nix b/pkgs/by-name/ne/netbsd/packages.nix new file mode 100644 index 0000000..2ca3c8a --- /dev/null +++ b/pkgs/by-name/ne/netbsd/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + netbsd = callPackage ./. { }; + netbsdCross = callPackage ./. { + stdenv = crossLibcStdenv; + }; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/cksum.nix b/pkgs/by-name/ne/netbsd/pkgs/cksum.nix new file mode 100644 index 0000000..a2ec387 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/cksum.nix @@ -0,0 +1,8 @@ +{ lib, mkDerivation }: + +mkDerivation { + path = "usr.bin/cksum"; + version = "9.2"; + sha256 = "0msfhgyvh5c2jmc6qjnf12c378dhw32ffsl864qz4rdb2b98rfcq"; + meta.platforms = lib.platforms.netbsd; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/column.nix b/pkgs/by-name/ne/netbsd/pkgs/column.nix new file mode 100644 index 0000000..f3cebfa --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/column.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/column"; + version = "9.2"; + sha256 = "0r6b0hjn5ls3j3sv6chibs44fs32yyk2cg8kh70kb4cwajs4ifyl"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/common.nix b/pkgs/by-name/ne/netbsd/pkgs/common.nix new file mode 100644 index 0000000..464fc1c --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/common.nix @@ -0,0 +1,3 @@ +{ fetchNetBSD }: + +fetchNetBSD "common" "9.2" "1pfylz9r3ap5wnwwbwczbfjb1m5qdyspzbnmxmcdkpzz2zgj64b9" diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/compat-cxx-safe-header.patch b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-cxx-safe-header.patch new file mode 100644 index 0000000..2aaa90b --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-cxx-safe-header.patch @@ -0,0 +1,18 @@ +diff -u -r1.35.2.1 nbtool_config.h.in +--- a/tools/compat/nbtool_config.h.in 22 Apr 2015 07:18:58 -0000 1.35.2.1 ++++ b/tools/compat/nbtool_config.h.in 31 May 2018 01:46:53 -0000 +@@ -680,5 +680,14 @@ + /* Define if you have u_int8_t, but not uint8_t. */ + #undef uint8_t + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ + #include "compat_defs.h" ++ ++#ifdef __cplusplus ++} ++#endif ++ + #endif /* !__NETBSD_NBTOOL_CONFIG_H__ */ diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/compat-dont-configure-twice.patch b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-dont-configure-twice.patch new file mode 100644 index 0000000..2758e25 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-dont-configure-twice.patch @@ -0,0 +1,22 @@ +commit f2d0ff85e05b49e9d11735ce4810b242c1dbf5af +Author: John Ericson +Date: Wed Sep 1 15:38:56 2021 +0000 + + Make should not hit configure + +diff --git a/Makefile b/Makefile +index b5adb8a5f2e9..1a914ef16739 100644 +--- a/tools/compat/Makefile ++++ b/tools/compat/Makefile +@@ -76,11 +76,6 @@ _CURDIR:= ${.CURDIR} + + SRCS:= ${SRCS:M*.c} + +-config.cache: include/.stamp configure nbtool_config.h.in defs.mk.in +- rm -f ${.TARGET} +- CC=${HOST_CC:Q} CFLAGS=${HOST_CFLAGS:Q} LDFLAGS=${HOST_LDFLAGS:Q} \ +- ${HOST_SH} ${.CURDIR}/configure --cache-file=config.cache +- + defs.mk: config.cache + @touch ${.TARGET} + diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/compat-no-force-native.patch b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-no-force-native.patch new file mode 100644 index 0000000..117fb7e --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-no-force-native.patch @@ -0,0 +1,101 @@ +commit 5acf3bdea5140e90135d15d6479f29fbf624f75e +Author: John Ericson +Date: Wed Sep 1 15:38:56 2021 +0000 + + Don't force building and installing for the build platform + + Also remove `compat/` subdir from install directories. + +diff --git a/Makefile b/Makefile +index 4bcf227f0e75..9ed1d6eea6ff 100644 +--- a/tools/compat/Makefile ++++ b/tools/compat/Makefile +@@ -1,6 +1,6 @@ + # $NetBSD: Makefile,v 1.87 2019/05/08 02:25:50 thorpej Exp $ + +-HOSTLIB= nbcompat ++LIB= nbcompat + +-.include ++.include + +@@ -94,63 +94,37 @@ include/.stamp: + + # Install rules + +-HOST_LIBDIR= ${TOOLDIR}/lib +-HOST_INCSDIR= ${TOOLDIR}/include +-HOST_SHAREDIR= ${TOOLDIR}/share +- +-install: .PHONY install.lib includes install.defs.mk +- +-# Install lib${HOSTLIB}.a in ${TOOLDIR}/lib +-install.lib: .PHONY ${HOST_LIBDIR}/lib${HOSTLIB}.a +-${HOST_LIBDIR}/lib${HOSTLIB}.a: lib${HOSTLIB}.a +- ${_MKTARGET_INSTALL} +- ${HOST_INSTALL_DIR} ${HOST_LIBDIR} +- ${HOST_INSTALL_FILE} -m ${LIBMODE} ${.ALLSRC} ${.TARGET} ++install: .PHONY includes install.defs.mk + + .for _f in ${INCFILES} +-HOST_INCINSTFILES+= ${HOST_INCSDIR}/compat/${_f} +-${HOST_INCSDIR}/compat/${_f}: ${_f} ++INCINSTFILES+= ${INCSDIR}/${_f} ++${INCSDIR}/${_f}: ${_f} + ${_MKTARGET_INSTALL} +- ${HOST_INSTALL_FILE} ${.ALLSRC} ${.TARGET} ++ ${INSTALL_FILE} ${.ALLSRC} ${.TARGET} + .endfor + + .for _d in ${INCSUBDIRS} +-HOST_INCINSTDIRS+= ${HOST_INCSDIR}/compat/${_d} +-${HOST_INCSDIR}/compat/${_d}: ++INCINSTDIRS+= ${INCSDIR}/${_d} ++${INCSDIR}/${_d}: + ${_MKTARGET_INSTALL} +- ${HOST_INSTALL_DIR} ${.TARGET} ++ ${INSTALL_DIR} ${.TARGET} + .endfor + +-# Install include files in ${TOOLDIR}/include/compat +-includes: .PHONY ${HOST_INCINSTDIRS} .WAIT ${HOST_INCINSTFILES} ++# Install include files in ${INCSDIR} ++includes: .PHONY ${INCINSTDIRS} .WAIT ${INCINSTFILES} + @(cd include && find . -name '*.h' -print | while read f ; do \ +- ${HOST_INSTALL_FILE} $$f ${HOST_INCSDIR}/compat/$$f ; \ ++ ${INSTALL_FILE} $$f ${INCSDIR}/$$f ; \ + done) + + +-# Install defs.mk in ${TOOLDIR}/share/compat +-install.defs.mk: .PHONY ${HOST_SHAREDIR}/compat/defs.mk +-${HOST_SHAREDIR}/compat/defs.mk: defs.mk ++# Install defs.mk in ${DATADIR} ++install.defs.mk: .PHONY ${DATADIR}/defs.mk ++${DATADIR}/defs.mk: defs.mk + ${_MKTARGET_INSTALL} +- ${HOST_INSTALL_DIR} ${HOST_SHAREDIR} +- ${HOST_INSTALL_DIR} ${HOST_SHAREDIR}/compat +- ${HOST_INSTALL_FILE} ${.ALLSRC} ${.TARGET} +- +-# bsd.hostlib.mk wants HOST_CPPFLAGS, not CPPFLAGS +- +-HOST_CPPFLAGS:= ${CPPFLAGS} +-CPPFLAGS:= # empty +- +-.include +- +-# Use uninstalled copy of host-mkdep +-HOST_MKDEP_OBJ!= cd ${.CURDIR}/../host-mkdep && ${PRINTOBJDIR} +-HOST_MKDEP= ${HOST_MKDEP_OBJ}/host-mkdep +-MKDEP= ${HOST_MKDEP} ++ ${INSTALL_DIR} ${DATADIR} ++ ${INSTALL_FILE} ${.ALLSRC} ${.TARGET} + +-# Use uninstalled copy of the install program +-INSTALL_OBJ!= cd ${NETBSDSRCDIR}/tools/binstall && ${PRINTOBJDIR} +-INSTALL= ${INSTALL_OBJ}/xinstall ++.include + + # Run "${TOOLDIR}/bin/nbmake-${MACHINE} regen" by hand after editing + # configure.ac. See more detailed instructions in configure.ac. diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/compat-setup-hook.sh b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-setup-hook.sh new file mode 100644 index 0000000..acd90b7 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/compat-setup-hook.sh @@ -0,0 +1,5 @@ +# See pkgs/build-support/setup-hooks/role.bash +getHostRole + +export NIX_LDFLAGS${role_post}+=" -lnbcompat" +export NIX_CFLAGS_COMPILE${role_post}+=" -DHAVE_NBTOOL_CONFIG_H" diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/libbsd-overlay.pc b/pkgs/by-name/ne/netbsd/pkgs/compat/libbsd-overlay.pc new file mode 100644 index 0000000..3aadabe --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/libbsd-overlay.pc @@ -0,0 +1,11 @@ +prefix=@out@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: nbcompat +Description: NetBSD compatibility framework +Version: @version@ +URL: https://www.netbsd.org/ +Libs: -L${libdir} -lnbcompat +Cflags: -I${includedir} -DHAVE_NBTOOL_CONFIG_H -include nbtool_config.h diff --git a/pkgs/by-name/ne/netbsd/pkgs/compat/package.nix b/pkgs/by-name/ne/netbsd/pkgs/compat/package.nix new file mode 100644 index 0000000..a1336ad --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/compat/package.nix @@ -0,0 +1,120 @@ +{ lib, mkDerivation, stdenv +, zlib +, defaultMakeFlags +, coreutils +, cctools-port +, include, libc, libutil +, install +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, rsync +, fetchNetBSD +, _mainLibcExtraPaths +}: + +mkDerivation (let + version = "9.2"; + commonDeps = [ zlib ]; + in { + path = "tools/compat"; + sha256 = "1vsxg7136nlhc72vpa664vs22874xh7ila95nkmsd8crn3z3cyn0"; + inherit version; + + setupHooks = [ + ../../../../../build-support/setup-hooks/role.bash + ./compat-setup-hook.sh + ]; + + preConfigure = '' + make include/.stamp configure nbtool_config.h.in defs.mk.in + ''; + + configurePlatforms = [ "build" "host" ]; + configureFlags = [ + "--cache-file=config.cache" + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + # We include this header in our musl package only for legacy + # compatibility, and compat works fine without it (and having it + # know about sys/cdefs.h breaks packages like glib when built + # statically). + "ac_cv_header_sys_cdefs_h=no" + ]; + + nativeBuildInputs = commonDeps ++ [ + bsdSetupHook netbsdSetupHook + makeMinimal + rsync + ]; + + buildInputs = commonDeps; + + # temporarily use gnuinstall for bootstrapping + # bsdinstall will be built later + makeFlags = defaultMakeFlags ++ [ + "INSTALL=${coreutils}/bin/install" + "DATADIR=$(out)/share" + # Can't sort object files yet + "LORDER=echo" + "TSORT=cat" + # Can't process man pages yet + "MKSHARE=no" + ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ + # GNU objcopy produces broken .a libs which won't link into dependers. + # Makefiles only invoke `$OBJCOPY -x/-X`, so cctools strip works here. + "OBJCOPY=${cctools-port}/bin/strip" + ]; + RENAME = "-D"; + + passthru.tests = { netbsd-install = install; }; + + patches = [ + ./compat-cxx-safe-header.patch + ./compat-dont-configure-twice.patch + ./compat-no-force-native.patch + ]; + + preInstall = '' + makeFlagsArray+=('INSTALL_FILE=''${INSTALL} ''${COPY} ''${PRESERVE} ''${RENAME}') + makeFlagsArray+=('INSTALL_DIR=''${INSTALL} -d') + makeFlagsArray+=('INSTALL_SYMLINK=''${INSTALL} ''${SYMLINK} ''${RENAME}') + ''; + + postInstall = '' + # why aren't these installed by netbsd? + install -D compat_defs.h $out/include/compat_defs.h + install -D $BSDSRCDIR/include/cdbw.h $out/include/cdbw.h + install -D $BSDSRCDIR/sys/sys/cdbr.h $out/include/cdbr.h + install -D $BSDSRCDIR/sys/sys/featuretest.h \ + $out/include/sys/featuretest.h + install -D $BSDSRCDIR/sys/sys/md5.h $out/include/md5.h + install -D $BSDSRCDIR/sys/sys/rmd160.h $out/include/rmd160.h + install -D $BSDSRCDIR/sys/sys/sha1.h $out/include/sha1.h + install -D $BSDSRCDIR/sys/sys/sha2.h $out/include/sha2.h + install -D $BSDSRCDIR/sys/sys/queue.h $out/include/sys/queue.h + install -D $BSDSRCDIR/include/vis.h $out/include/vis.h + install -D $BSDSRCDIR/include/db.h $out/include/db.h + install -D $BSDSRCDIR/include/netconfig.h $out/include/netconfig.h + install -D $BSDSRCDIR/include/utmpx.h $out/include/utmpx.h + install -D $BSDSRCDIR/include/tzfile.h $out/include/tzfile.h + install -D $BSDSRCDIR/sys/sys/tree.h $out/include/sys/tree.h + install -D $BSDSRCDIR/include/nl_types.h $out/include/nl_types.h + install -D $BSDSRCDIR/include/stringlist.h $out/include/stringlist.h + + # Collapse includes slightly to fix dangling reference + install -D $BSDSRCDIR/common/include/rpc/types.h $out/include/rpc/types.h + sed -i '1s;^;#include "nbtool_config.h"\n;' $out/include/rpc/types.h + '' + lib.optionalString stdenv.isDarwin '' + mkdir -p $out/include/ssp + touch $out/include/ssp/ssp.h + '' + '' + mkdir -p $out/lib/pkgconfig + substitute ${./libbsd-overlay.pc} $out/lib/pkgconfig/libbsd-overlay.pc \ + --subst-var-by out $out \ + --subst-var-by version ${version} + ''; + extraPaths = [ include.src libc.src libutil.src + (fetchNetBSD "external/bsd/flex" "9.2" "0h98jpfj7vx5zh7vd7bk6b1hmzgkcb757a8j6d9zgygxxv13v43m") + (fetchNetBSD "sys/sys" "9.2" "0zawhw51klaigqqwkx0lzrx3mim2jywrc24cm7c66qsf1im9awgd") + (fetchNetBSD "common/include/rpc/types.h" "9.2" "0n2df12mlc3cbc48jxq35yzl1y7ghgpykvy7jnfh898rdhac7m9a") + ] ++ libutil.extraPaths ++ _mainLibcExtraPaths; + }) diff --git a/pkgs/by-name/ne/netbsd/pkgs/config.nix b/pkgs/by-name/ne/netbsd/pkgs/config.nix new file mode 100644 index 0000000..277d701 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/config.nix @@ -0,0 +1,18 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal, install, mandoc, byacc, flex, rsync +, compatIfNeeded +, cksum +}: +mkDerivation { + path = "usr.bin/config"; + version = "9.2"; + sha256 = "1yz3n4hncdkk6kp595fh2q5lg150vpqg8iw2dccydkyw4y3hgsjj"; + env.NIX_CFLAGS_COMPILE = toString [ "-DMAKE_BOOTSTRAP" ]; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal install mandoc byacc flex rsync + ]; + buildInputs = compatIfNeeded; + extraPaths = [ cksum.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/csu.nix b/pkgs/by-name/ne/netbsd/pkgs/csu.nix new file mode 100644 index 0000000..2d13ced --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/csu.nix @@ -0,0 +1,24 @@ +{ lib, mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, flex +, byacc, genassym, gencat, lorder, tsort, statHook, rsync +, headers +, sys +, ld_elf_so +}: + +mkDerivation { + path = "lib/csu"; + version = "9.2"; + sha256 = "0al5jfazvhlzn9hvmnrbchx4d0gm282hq5gp4xs2zmj9ycmf6d03"; + meta.platforms = lib.platforms.netbsd; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff flex + byacc genassym gencat lorder tsort statHook rsync + ]; + buildInputs = [ headers ]; + extraPaths = [ sys.src ld_elf_so.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/dict.nix b/pkgs/by-name/ne/netbsd/pkgs/dict.nix new file mode 100644 index 0000000..0d7d026 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/dict.nix @@ -0,0 +1,9 @@ +{ mkDerivation, defaultMakeFlags }: + +mkDerivation { + path = "share/dict"; + noCC = true; + version = "9.2"; + sha256 = "0svfc0byk59ri37pyjslv4c4rc7zw396r73mr593i78d39q5g3ad"; + makeFlags = defaultMakeFlags ++ [ "BINDIR=$(out)/share" ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/fts/fts-setup-hook.sh b/pkgs/by-name/ne/netbsd/pkgs/fts/fts-setup-hook.sh new file mode 100644 index 0000000..b6cb5aa --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/fts/fts-setup-hook.sh @@ -0,0 +1,4 @@ +# See pkgs/build-support/setup-hooks/role.bash +getHostRole + +export NIX_LDFLAGS${role_post}+=" -lfts" diff --git a/pkgs/by-name/ne/netbsd/pkgs/fts/package.nix b/pkgs/by-name/ne/netbsd/pkgs/fts/package.nix new file mode 100644 index 0000000..0393d36 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/fts/package.nix @@ -0,0 +1,41 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook, rsync +, compatIfNeeded +, fetchNetBSD +}: + +mkDerivation { + pname = "fts"; + path = "include/fts.h"; + sha256 = "01d4fpxvz1pgzfk5xznz5dcm0x0gdzwcsfm1h3d0xc9kc6hj2q77"; + version = "9.2"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook rsync + ]; + propagatedBuildInputs = compatIfNeeded; + extraPaths = [ + (fetchNetBSD "lib/libc/gen/fts.c" "9.2" "1a8hmf26242nmv05ipn3ircxb0jqmmi66rh78kkyi9vjwkfl3qn7") + (fetchNetBSD "lib/libc/include/namespace.h" "9.2" "0kksr3pdwdc1cplqf5z12ih4cml6l11lqrz91f7hjjm64y7785kc") + (fetchNetBSD "lib/libc/gen/fts.3" "9.2" "1asxw0n3fhjdadwkkq3xplfgqgl3q32w1lyrvbakfa3gs0wz5zc1") + ]; + skipIncludesPhase = true; + buildPhase = '' + "$CC" -c -Iinclude -Ilib/libc/include lib/libc/gen/fts.c \ + -o lib/libc/gen/fts.o + "$AR" -rsc libfts.a lib/libc/gen/fts.o + ''; + installPhase = '' + runHook preInstall + + install -D lib/libc/gen/fts.3 $out/share/man/man3/fts.3 + install -D include/fts.h $out/include/fts.h + install -D lib/libc/include/namespace.h $out/include/namespace.h + install -D libfts.a $out/lib/libfts.a + + runHook postInstall + ''; + setupHooks = [ + ../../../../../build-support/setup-hooks/role.bash + ./fts-setup-hook.sh + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/genassym.nix b/pkgs/by-name/ne/netbsd/pkgs/genassym.nix new file mode 100644 index 0000000..7f81a77 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/genassym.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/genassym"; + version = "9.2"; + sha256 = "1acl1dz5kvh9h5806vkz2ap95rdsz7phmynh5i3x5y7agbki030c"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/gencat.nix b/pkgs/by-name/ne/netbsd/pkgs/gencat.nix new file mode 100644 index 0000000..411be85 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/gencat.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/gencat"; + version = "9.2"; + sha256 = "0gd463x1hg36bhr7y0xryb5jyxk0z0g7xvy8rgk82nlbnlnsbbwb"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/getconf.nix b/pkgs/by-name/ne/netbsd/pkgs/getconf.nix new file mode 100644 index 0000000..c8483d4 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/getconf.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/getconf"; + sha256 = "122vslz4j3h2mfs921nr2s6m078zcj697yrb75rwp2hnw3qz4s8q"; + version = "9.2"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/getent/getent.patch b/pkgs/by-name/ne/netbsd/pkgs/getent/getent.patch new file mode 100644 index 0000000..18258b6 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/getent/getent.patch @@ -0,0 +1,455 @@ +Author: Matthew Bauer +Description: Remove unavailable getent databases +Version: 7.1.2 +--- a/usr.bin/getent/getent.c 2018-04-16 13:33:49.000000000 -0500 ++++ b/usr.bin/getent/getent.c 2018-04-16 13:29:30.000000000 -0500 +@@ -42,7 +42,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -57,27 +56,16 @@ + #include + + #include +-#include + + #include /* for INET6_ADDRSTRLEN */ + +-#include +- +-#include +- + static int usage(void) __attribute__((__noreturn__)); + static int parsenum(const char *, unsigned long *); +-static int disktab(int, char *[]); +-static int gettytab(int, char *[]); +-static int ethers(int, char *[]); + static int group(int, char *[]); + static int hosts(int, char *[]); +-static int netgroup(int, char *[]); + static int networks(int, char *[]); + static int passwd(int, char *[]); +-static int printcap(int, char *[]); + static int protocols(int, char *[]); +-static int rpc(int, char *[]); + static int services(int, char *[]); + static int shells(int, char *[]); + +@@ -92,17 +80,11 @@ + const char *name; + int (*callback)(int, char *[]); + } databases[] = { +- { "disktab", disktab, }, +- { "ethers", ethers, }, +- { "gettytab", gettytab, }, + { "group", group, }, + { "hosts", hosts, }, +- { "netgroup", netgroup, }, + { "networks", networks, }, + { "passwd", passwd, }, +- { "printcap", printcap, }, + { "protocols", protocols, }, +- { "rpc", rpc, }, + { "services", services, }, + { "shells", shells, }, + +@@ -195,49 +177,6 @@ + (void)printf("\n"); + } + +- +- /* +- * ethers +- */ +- +-static int +-ethers(int argc, char *argv[]) +-{ +- char hostname[MAXHOSTNAMELEN + 1], *hp; +- struct ether_addr ea, *eap; +- int i, rv; +- +- assert(argc > 1); +- assert(argv != NULL); +- +-#define ETHERSPRINT (void)printf("%-17s %s\n", ether_ntoa(eap), hp) +- +- rv = RV_OK; +- if (argc == 2) { +- warnx("Enumeration not supported on ethers"); +- rv = RV_NOENUM; +- } else { +- for (i = 2; i < argc; i++) { +- if ((eap = ether_aton(argv[i])) == NULL) { +- eap = &ea; +- hp = argv[i]; +- if (ether_hostton(hp, eap) != 0) { +- rv = RV_NOTFOUND; +- break; +- } +- } else { +- hp = hostname; +- if (ether_ntohost(hp, eap) != 0) { +- rv = RV_NOTFOUND; +- break; +- } +- } +- ETHERSPRINT; +- } +- } +- return rv; +-} +- + /* + * group + */ +@@ -298,7 +237,7 @@ + hosts(int argc, char *argv[]) + { + struct hostent *he; +- char addr[IN6ADDRSZ]; ++ char addr[NS_IN6ADDRSZ]; + int i, rv; + + assert(argc > 1); +@@ -312,9 +251,9 @@ + } else { + for (i = 2; i < argc; i++) { + if (inet_pton(AF_INET6, argv[i], (void *)addr) > 0) +- he = gethostbyaddr(addr, IN6ADDRSZ, AF_INET6); ++ he = gethostbyaddr(addr, NS_IN6ADDRSZ, AF_INET6); + else if (inet_pton(AF_INET, argv[i], (void *)addr) > 0) +- he = gethostbyaddr(addr, INADDRSZ, AF_INET); ++ he = gethostbyaddr(addr, NS_INADDRSZ, AF_INET); + else + he = gethostbyname(argv[i]); + if (he != NULL) +@@ -330,48 +269,6 @@ + } + + /* +- * netgroup +- */ +-static int +-netgroup(int argc, char *argv[]) +-{ +- int rv, i; +- bool first; +- const char *host, *user, *domain; +- +- assert(argc > 1); +- assert(argv != NULL); +- +-#define NETGROUPPRINT(s) (((s) != NULL) ? (s) : "") +- +- rv = RV_OK; +- if (argc == 2) { +- warnx("Enumeration not supported on netgroup"); +- rv = RV_NOENUM; +- } else { +- for (i = 2; i < argc; i++) { +- setnetgrent(argv[i]); +- first = true; +- while (getnetgrent(&host, &user, &domain) != 0) { +- if (first) { +- first = false; +- (void)fputs(argv[i], stdout); +- } +- (void)printf(" (%s,%s,%s)", +- NETGROUPPRINT(host), +- NETGROUPPRINT(user), +- NETGROUPPRINT(domain)); +- } +- if (!first) +- (void)putchar('\n'); +- endnetgrent(); +- } +- } +- +- return rv; +-} +- +- /* + * networks + */ + +@@ -464,227 +361,6 @@ + return rv; + } + +-static char * +-mygetent(const char * const * db_array, const char *name) +-{ +- char *buf = NULL; +- int error; +- +- switch (error = cgetent(&buf, db_array, name)) { +- case -3: +- warnx("tc= loop in record `%s' in `%s'", name, db_array[0]); +- break; +- case -2: +- warn("system error fetching record `%s' in `%s'", name, +- db_array[0]); +- break; +- case -1: +- case 0: +- break; +- case 1: +- warnx("tc= reference not found in record for `%s' in `%s'", +- name, db_array[0]); +- break; +- default: +- warnx("unknown error %d in record `%s' in `%s'", error, name, +- db_array[0]); +- break; +- } +- return buf; +-} +- +-static char * +-mygetone(const char * const * db_array, int first) +-{ +- char *buf = NULL; +- int error; +- +- switch (error = (first ? cgetfirst : cgetnext)(&buf, db_array)) { +- case -2: +- warnx("tc= loop in `%s'", db_array[0]); +- break; +- case -1: +- warn("system error fetching record in `%s'", db_array[0]); +- break; +- case 0: +- case 1: +- break; +- case 2: +- warnx("tc= reference not found in `%s'", db_array[0]); +- break; +- default: +- warnx("unknown error %d in `%s'", error, db_array[0]); +- break; +- } +- return buf; +-} +- +-static void +-capprint(const char *cap) +-{ +- char *c = strchr(cap, ':'); +- if (c) +- if (c == cap) +- (void)printf("true\n"); +- else { +- int l = (int)(c - cap); +- (void)printf("%*.*s\n", l, l, cap); +- } +- else +- (void)printf("%s\n", cap); +-} +- +-static void +-prettyprint(char *b) +-{ +-#define TERMWIDTH 65 +- int did = 0; +- size_t len; +- char *s, c; +- +- for (;;) { +- len = strlen(b); +- if (len <= TERMWIDTH) { +-done: +- if (did) +- printf("\t:"); +- printf("%s\n", b); +- return; +- } +- for (s = b + TERMWIDTH; s > b && *s != ':'; s--) +- continue; +- if (*s++ != ':') +- goto done; +- c = *s; +- *s = '\0'; +- if (did) +- printf("\t:"); +- did++; +- printf("%s\\\n", b); +- *s = c; +- b = s; +- } +-} +- +-static void +-handleone(const char * const *db_array, char *b, int recurse, int pretty, +- int level) +-{ +- char *tc; +- +- if (level && pretty) +- printf("\n"); +- if (pretty) +- prettyprint(b); +- else +- printf("%s\n", b); +- if (!recurse || cgetstr(b, "tc", &tc) <= 0) +- return; +- +- b = mygetent(db_array, tc); +- free(tc); +- +- if (b == NULL) +- return; +- +- handleone(db_array, b, recurse, pretty, ++level); +- free(b); +-} +- +-static int +-handlecap(const char *db, int argc, char *argv[]) +-{ +- static const char sfx[] = "=#:"; +- const char *db_array[] = { db, NULL }; +- char *b, *cap; +- int i, rv, c; +- size_t j; +- int expand = 1, recurse = 0, pretty = 0; +- +- assert(argc > 1); +- assert(argv != NULL); +- +- argc--; +- argv++; +- while ((c = getopt(argc, argv, "pnr")) != -1) +- switch (c) { +- case 'n': +- expand = 0; +- break; +- case 'r': +- expand = 0; +- recurse = 1; +- break; +- case 'p': +- pretty = 1; +- break; +- default: +- usage(); +- break; +- } +- +- argc -= optind; +- argv += optind; +- csetexpandtc(expand); +- rv = RV_OK; +- if (argc == 0) { +- for (b = mygetone(db_array, 1); b; b = mygetone(db_array, 0)) { +- handleone(db_array, b, recurse, pretty, 0); +- free(b); +- } +- } else { +- if ((b = mygetent(db_array, argv[0])) == NULL) +- return RV_NOTFOUND; +- if (argc == 1) +- handleone(db_array, b, recurse, pretty, 0); +- else { +- for (i = 2; i < argc; i++) { +- for (j = 0; j < sizeof(sfx) - 1; j++) { +- cap = cgetcap(b, argv[i], sfx[j]); +- if (cap) { +- capprint(cap); +- break; +- } +- } +- if (j == sizeof(sfx) - 1) +- printf("false\n"); +- } +- } +- free(b); +- } +- return rv; +-} +- +- /* +- * gettytab +- */ +- +-static int +-gettytab(int argc, char *argv[]) +-{ +- return handlecap(_PATH_GETTYTAB, argc, argv); +-} +- +- /* +- * printcap +- */ +- +-static int +-printcap(int argc, char *argv[]) +-{ +- return handlecap(_PATH_PRINTCAP, argc, argv); +-} +- +- /* +- * disktab +- */ +- +-static int +-disktab(int argc, char *argv[]) +-{ +- return handlecap(_PATH_DISKTAB, argc, argv); +-} +- + /* + * protocols + */ +@@ -726,47 +402,6 @@ + } + + /* +- * rpc +- */ +- +-static int +-rpc(int argc, char *argv[]) +-{ +- struct rpcent *re; +- unsigned long id; +- int i, rv; +- +- assert(argc > 1); +- assert(argv != NULL); +- +-#define RPCPRINT printfmtstrings(re->r_aliases, " ", " ", \ +- "%-16s %6d", \ +- re->r_name, re->r_number) +- +- setrpcent(1); +- rv = RV_OK; +- if (argc == 2) { +- while ((re = getrpcent()) != NULL) +- RPCPRINT; +- } else { +- for (i = 2; i < argc; i++) { +- if (parsenum(argv[i], &id)) +- re = getrpcbynumber((int)id); +- else +- re = getrpcbyname(argv[i]); +- if (re != NULL) +- RPCPRINT; +- else { +- rv = RV_NOTFOUND; +- break; +- } +- } +- } +- endrpcent(); +- return rv; +-} +- +- /* + * services + */ + diff --git a/pkgs/by-name/ne/netbsd/pkgs/getent/package.nix b/pkgs/by-name/ne/netbsd/pkgs/getent/package.nix new file mode 100644 index 0000000..7a9acb1 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/getent/package.nix @@ -0,0 +1,8 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/getent"; + sha256 = "1qngywcmm0y7nl8h3n8brvkxq4jw63szbci3kc1q6a6ndhycbbvr"; + version = "9.2"; + patches = [ ./getent.patch ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/headers.nix b/pkgs/by-name/ne/netbsd/pkgs/headers.nix new file mode 100644 index 0000000..646e567 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/headers.nix @@ -0,0 +1,11 @@ +{ lib, symlinkJoin, include, sys-headers, libpthread-headers }: + +symlinkJoin { + name = "netbsd-headers-9.2"; + paths = [ + include + sys-headers + libpthread-headers + ]; + meta.platforms = lib.platforms.netbsd; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/i18n_module.nix b/pkgs/by-name/ne/netbsd/pkgs/i18n_module.nix new file mode 100644 index 0000000..60b091e --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/i18n_module.nix @@ -0,0 +1,9 @@ +{ lib, mkDerivation, libc }: + +mkDerivation { + path = "lib/i18n_module"; + version = "9.2"; + sha256 = "0w6y5v3binm7gf2kn7y9jja8k18rhnyl55cvvfnfipjqdxvxd9jd"; + meta.platforms = lib.platforms.netbsd; + extraPaths = [ libc.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/include.nix b/pkgs/by-name/ne/netbsd/pkgs/include.nix new file mode 100644 index 0000000..1ecdec9 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/include.nix @@ -0,0 +1,40 @@ +{ lib, mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, rsync, nbperf, rpcgen +, common +, defaultMakeFlags +, stdenv +}: + +mkDerivation { + path = "include"; + version = "9.2"; + sha256 = "0nxnmj4c8s3hb9n3fpcmd0zl3l1nmhivqgi9a35sis943qvpgl9h"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff rsync nbperf rpcgen + ]; + + # The makefiles define INCSDIR per subdirectory, so we have to set + # something else on the command line so those definitions aren't + # overridden. + postPatch = '' + find "$BSDSRCDIR" -name Makefile -exec \ + sed -i -E \ + -e 's_/usr/include_''${INCSDIR0}_' \ + {} \; + ''; + + # multiple header dirs, see above + postConfigure = '' + makeFlags=''${makeFlags/INCSDIR/INCSDIR0} + ''; + + extraPaths = [ common ]; + headersOnly = true; + noCC = true; + meta.platforms = lib.platforms.netbsd; + makeFlags = defaultMakeFlags ++ [ "RPCGEN_CPP=${stdenv.cc.cc}/bin/cpp" ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/install/install-setup-hook.sh b/pkgs/by-name/ne/netbsd/pkgs/install/install-setup-hook.sh new file mode 100644 index 0000000..4bfd4d7 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/install/install-setup-hook.sh @@ -0,0 +1,8 @@ +addNetBSDInstallMakeFlags() { + export INSTALL_FILE="install -U -c" + export INSTALL_DIR="install -U -d" + export INSTALL_LINK="install -U -l h" + export INSTALL_SYMLINK="install -U -l s" +} + +preConfigureHooks+=(addNetBSDInstallMakeFlags) diff --git a/pkgs/by-name/ne/netbsd/pkgs/install/package.nix b/pkgs/by-name/ne/netbsd/pkgs/install/package.nix new file mode 100644 index 0000000..991517a --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/install/package.nix @@ -0,0 +1,49 @@ +{ mkDerivation +, writeShellScript +, mtree, make +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, mandoc, groff, rsync +, compatIfNeeded, fts + +}: + +# HACK: to ensure parent directories exist. This emulates GNU +# install’s -D option. No alternative seems to exist in BSD install. +let + binstall = writeShellScript "binstall" '' + set -eu + for last in "$@"; do true; done + mkdir -p $(dirname $last) + @out@/bin/xinstall "$@" + ''; +in + mkDerivation { + path = "usr.bin/xinstall"; + version = "9.2"; + sha256 = "1f6pbz3qv1qcrchdxif8p5lbmnwl8b9nq615hsd3cyl4avd5bfqj"; + extraPaths = [ mtree.src make.src ]; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + mandoc groff rsync + ]; + skipIncludesPhase = true; + buildInputs = compatIfNeeded + # fts header is needed. glibc already has this header, but musl doesn't, + # so make sure pkgsMusl.netbsd.install still builds in case you want to + # remove it! + ++ [ fts ]; + installPhase = '' + runHook preInstall + + install -D install.1 $out/share/man/man1/install.1 + install -D xinstall $out/bin/xinstall + install -D -m 0550 ${binstall} $out/bin/binstall + substituteInPlace $out/bin/binstall --subst-var out + ln -s $out/bin/binstall $out/bin/install + + runHook postInstall + ''; + setupHook = ./install-setup-hook.sh; + } diff --git a/pkgs/by-name/ne/netbsd/pkgs/ld_elf_so.nix b/pkgs/by-name/ne/netbsd/pkgs/ld_elf_so.nix new file mode 100644 index 0000000..1496ad6 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/ld_elf_so.nix @@ -0,0 +1,18 @@ +{ lib +, mkDerivation +, libc +, defaultMakeFlags +}: + +mkDerivation { + path = "libexec/ld.elf_so"; + version = "9.2"; + sha256 = "0ia9mqzdljly0vqfwflm5mzz55k7qsr4rw2bzhivky6k30vgirqa"; + meta.platforms = lib.platforms.netbsd; + LIBC_PIC = "${libc}/lib/libc_pic.a"; + # Hack to prevent a symlink being installed here for compatibility. + SHLINKINSTALLDIR = "/usr/libexec"; + USE_FORT = "yes"; + makeFlags = defaultMakeFlags ++ [ "BINDIR=$(out)/libexec" "CLIBOBJ=${libc}/lib" ]; + extraPaths = [ libc.src ] ++ libc.extraPaths; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libarch.nix b/pkgs/by-name/ne/netbsd/pkgs/libarch.nix new file mode 100644 index 0000000..93ea02f --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libarch.nix @@ -0,0 +1,8 @@ +{ lib, mkDerivation }: + +mkDerivation { + path = "lib/libarch"; + version = "9.2"; + sha256 = "6ssenRhuSwp0Jn71ErT0PrEoCJ+cIYRztwdL4QTDZsQ="; + meta.platforms = lib.platforms.netbsd; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libc.nix b/pkgs/by-name/ne/netbsd/pkgs/libc.nix new file mode 100644 index 0000000..ebc01a1 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libc.nix @@ -0,0 +1,76 @@ +{ lib +, mkDerivation +, defaultMakeFlags +, _mainLibcExtraPaths +, fetchNetBSD +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, flex +, byacc, genassym, gencat, lorder, tsort, statHook, rsync, rpcgen +, csu, headers +, librt +}: + +mkDerivation { + path = "lib/libc"; + version = "9.2"; + sha256 = "1y9c13igg0kai07sqvf9cm6yqmd8lhfd8hq3q7biilbgs1l99as3"; + USE_FORT = "yes"; + MKPROFILE = "no"; + extraPaths = _mainLibcExtraPaths ++ [ + (fetchNetBSD "external/bsd/jemalloc" "9.2" "0cq704swa0h2yxv4gc79z2lwxibk9k7pxh3q5qfs7axx3jx3n8kb") + ]; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff flex + byacc genassym gencat lorder tsort statHook rsync rpcgen + ]; + buildInputs = [ headers csu ]; + env.NIX_CFLAGS_COMPILE = "-B${csu}/lib -fcommon"; + meta.platforms = lib.platforms.netbsd; + SHLIBINSTALLDIR = "$(out)/lib"; + MKPICINSTALL = "yes"; + NLSDIR = "$(out)/share/nls"; + makeFlags = defaultMakeFlags ++ [ "FILESDIR=$(out)/var/db"]; + postInstall = '' + pushd ${headers} + find . -type d -exec mkdir -p $out/\{} \; + find . \( -type f -o -type l \) -exec cp -pr \{} $out/\{} \; + popd + + pushd ${csu} + find . -type d -exec mkdir -p $out/\{} \; + find . \( -type f -o -type l \) -exec cp -pr \{} $out/\{} \; + popd + + NIX_CFLAGS_COMPILE+=" -B$out/lib" + NIX_CFLAGS_COMPILE+=" -I$out/include" + NIX_LDFLAGS+=" -L$out/lib" + + make -C $BSDSRCDIR/lib/libpthread $makeFlags + make -C $BSDSRCDIR/lib/libpthread $makeFlags install + + make -C $BSDSRCDIR/lib/libm $makeFlags + make -C $BSDSRCDIR/lib/libm $makeFlags install + + make -C $BSDSRCDIR/lib/libresolv $makeFlags + make -C $BSDSRCDIR/lib/libresolv $makeFlags install + + make -C $BSDSRCDIR/lib/librpcsvc $makeFlags + make -C $BSDSRCDIR/lib/librpcsvc $makeFlags install + + make -C $BSDSRCDIR/lib/i18n_module $makeFlags + make -C $BSDSRCDIR/lib/i18n_module $makeFlags install + + make -C $BSDSRCDIR/lib/libutil $makeFlags + make -C $BSDSRCDIR/lib/libutil $makeFlags install + + make -C $BSDSRCDIR/lib/librt $makeFlags + make -C $BSDSRCDIR/lib/librt $makeFlags install + + make -C $BSDSRCDIR/lib/libcrypt $makeFlags + make -C $BSDSRCDIR/lib/libcrypt $makeFlags install + ''; + inherit (librt) postPatch; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libcrypt.nix b/pkgs/by-name/ne/netbsd/pkgs/libcrypt.nix new file mode 100644 index 0000000..c5f9def --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libcrypt.nix @@ -0,0 +1,9 @@ +{ lib, mkDerivation }: + +mkDerivation { + path = "lib/libcrypt"; + version = "9.2"; + sha256 = "0siqan1wdqmmhchh2n8w6a8x1abbff8n4yb6jrqxap3hqn8ay54g"; + SHLIBINSTALLDIR = "$(out)/lib"; + meta.platforms = lib.platforms.netbsd; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libcurses.nix b/pkgs/by-name/ne/netbsd/pkgs/libcurses.nix new file mode 100644 index 0000000..2409879 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libcurses.nix @@ -0,0 +1,27 @@ +{ lib, mkDerivation, stdenv +, libterminfo +, compatIfNeeded +, defaultMakeFlags +}: + +mkDerivation { + path = "lib/libcurses"; + version = "9.2"; + sha256 = "0pd0dggl3w4bv5i5h0s1wrc8hr66n4hkv3zlklarwfdhc692fqal"; + buildInputs = [ libterminfo ]; + env.NIX_CFLAGS_COMPILE = toString ([ + "-D__scanflike(a,b)=" + "-D__va_list=va_list" + "-D__warn_references(a,b)=" + ] ++ lib.optional stdenv.isDarwin "-D__strong_alias(a,b)="); + propagatedBuildInputs = compatIfNeeded; + MKDOC = "no"; # missing vfontedpr + makeFlags = defaultMakeFlags ++ [ "LIBDO.terminfo=${libterminfo}/lib" ]; + postPatch = lib.optionalString (!stdenv.isDarwin) '' + substituteInPlace $COMPONENT_PATH/printw.c \ + --replace "funopen(win, NULL, __winwrite, NULL, NULL)" NULL \ + --replace "__strong_alias(vwprintw, vw_printw)" 'extern int vwprintw(WINDOW*, const char*, va_list) __attribute__ ((alias ("vw_printw")));' + substituteInPlace $COMPONENT_PATH/scanw.c \ + --replace "__strong_alias(vwscanw, vw_scanw)" 'extern int vwscanw(WINDOW*, const char*, va_list) __attribute__ ((alias ("vw_scanw")));' + ''; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libedit.nix b/pkgs/by-name/ne/netbsd/pkgs/libedit.nix new file mode 100644 index 0000000..eb734f3 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libedit.nix @@ -0,0 +1,26 @@ +{ lib, mkDerivation +, libterminfo, libcurses +, compatIfNeeded +, defaultMakeFlags +}: + +mkDerivation { + path = "lib/libedit"; + version = "9.2"; + sha256 = "1wqhngraxwqk4jgrf5f18jy195yrp7c06n1gf31pbplq79mg1bcj"; + buildInputs = [ libterminfo libcurses ]; + propagatedBuildInputs = compatIfNeeded; + SHLIBINSTALLDIR = "$(out)/lib"; + makeFlags = defaultMakeFlags ++ [ "LIBDO.terminfo=${libterminfo}/lib" ]; + postPatch = '' + sed -i '1i #undef bool_t' $COMPONENT_PATH/el.h + substituteInPlace $COMPONENT_PATH/config.h \ + --replace "#define HAVE_STRUCT_DIRENT_D_NAMLEN 1" "" + substituteInPlace $COMPONENT_PATH/readline/Makefile --replace /usr/include "$out/include" + ''; + env.NIX_CFLAGS_COMPILE = toString [ + "-D__noinline=" + "-D__scanflike(a,b)=" + "-D__va_list=va_list" + ]; + } diff --git a/pkgs/by-name/ne/netbsd/pkgs/libm.nix b/pkgs/by-name/ne/netbsd/pkgs/libm.nix new file mode 100644 index 0000000..8699008 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libm.nix @@ -0,0 +1,10 @@ +{ lib, mkDerivation, sys }: + +mkDerivation { + path = "lib/libm"; + version = "9.2"; + sha256 = "1apwfr26shdmbqqnmg7hxf7bkfxw44ynqnnnghrww9bnhqdnsy92"; + SHLIBINSTALLDIR = "$(out)/lib"; + meta.platforms = lib.platforms.netbsd; + extraPaths = [ sys.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libossaudio.nix b/pkgs/by-name/ne/netbsd/pkgs/libossaudio.nix new file mode 100644 index 0000000..51bbc21 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libossaudio.nix @@ -0,0 +1,8 @@ +{ lib, mkDerivation }: + +mkDerivation { + path = "lib/libossaudio"; + version = "9.2"; + sha256 = "16l3bfy6dcwqnklvh3x0ps8ld1y504vf57v9rx8f9adzhb797jh0"; + meta.platforms = lib.platforms.netbsd; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libpci.nix b/pkgs/by-name/ne/netbsd/pkgs/libpci.nix new file mode 100644 index 0000000..21ca0f6 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libpci.nix @@ -0,0 +1,11 @@ +{ lib, mkDerivation, sys }: + +mkDerivation { + pname = "libpci"; + path = "lib/libpci"; + version = "9.2"; + sha256 = "+IOEO1Bw3/H3iCp3uk3bwsFZbvCqN5Ciz70irnPl8E8="; + env.NIX_CFLAGS_COMPILE = toString [ "-I." ]; + meta.platforms = lib.platforms.netbsd; + extraPaths = [ sys.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libpthread/base.nix b/pkgs/by-name/ne/netbsd/pkgs/libpthread/base.nix new file mode 100644 index 0000000..485a128 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libpthread/base.nix @@ -0,0 +1,6 @@ +{ + path = "lib/libpthread"; + version = "9.2"; + sha256 = "0mlmc31k509dwfmx5s2x010wxjc44mr6y0cbmk30cfipqh8c962h"; +} + diff --git a/pkgs/by-name/ne/netbsd/pkgs/libpthread/headers.nix b/pkgs/by-name/ne/netbsd/pkgs/libpthread/headers.nix new file mode 100644 index 0000000..3896562 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libpthread/headers.nix @@ -0,0 +1,9 @@ +{ lib, mkDerivation }: + +mkDerivation (import ./base.nix // { + pname = "libpthread-headers"; + installPhase = "includesPhase"; + dontBuild = true; + noCC = true; + meta.platforms = lib.platforms.netbsd; +}) diff --git a/pkgs/by-name/ne/netbsd/pkgs/libpthread/package.nix b/pkgs/by-name/ne/netbsd/pkgs/libpthread/package.nix new file mode 100644 index 0000000..c2a0d40 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libpthread/package.nix @@ -0,0 +1,15 @@ +{ lib, mkDerivation +, headers +, common, libc, librt, sys +}: + +mkDerivation (import ./base.nix // { + pname = "libpthread"; + installPhase = null; + noCC = false; + dontBuild = false; + buildInputs = [ headers ]; + SHLIBINSTALLDIR = "$(out)/lib"; + extraPaths = [ common libc.src librt.src sys.src ]; + meta.platforms = lib.platforms.netbsd; +}) diff --git a/pkgs/by-name/ne/netbsd/pkgs/libresolv.nix b/pkgs/by-name/ne/netbsd/pkgs/libresolv.nix new file mode 100644 index 0000000..2427592 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libresolv.nix @@ -0,0 +1,9 @@ +{ lib, mkDerivation, libc }: + +mkDerivation { + path = "lib/libresolv"; + version = "9.2"; + sha256 = "1am74s74mf1ynwz3p4ncjkg63f78a1zjm983q166x4sgzps15626"; + meta.platforms = lib.platforms.netbsd; + extraPaths = [ libc.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/librpcsvc.nix b/pkgs/by-name/ne/netbsd/pkgs/librpcsvc.nix new file mode 100644 index 0000000..8752433 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/librpcsvc.nix @@ -0,0 +1,21 @@ +{ lib +, mkDerivation +, defaultMakeFlags +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, tsort, lorder, rpcgen, statHook +}: + +mkDerivation { + path = "lib/librpcsvc"; + version = "9.2"; + sha256 = "1q34pfiyjbrgrdqm46jwrsqms49ly6z3b0xh1wg331zga900vq5n"; + makeFlags = defaultMakeFlags ++ [ "INCSDIR=$(out)/include/rpcsvc" ]; + meta.platforms = lib.platforms.netbsd; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install tsort lorder rpcgen statHook + ]; +} + diff --git a/pkgs/by-name/ne/netbsd/pkgs/librt.nix b/pkgs/by-name/ne/netbsd/pkgs/librt.nix new file mode 100644 index 0000000..2ffe078 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/librt.nix @@ -0,0 +1,13 @@ +{ lib, mkDerivation, libc, headers }: + +mkDerivation { + path = "lib/librt"; + version = "9.2"; + sha256 = "07f8mpjcqh5kig5z5sp97fg55mc4dz6aa1x5g01nv2pvbmqczxc6"; + meta.platforms = lib.platforms.netbsd; + extraPaths = [ libc.src ] ++ libc.extraPaths; + postPatch = '' + sed -i 's,/usr\(/include/sys/syscall.h\),${headers}\1,g' \ + $BSDSRCDIR/lib/{libc,librt}/sys/Makefile.inc + ''; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libterminfo.nix b/pkgs/by-name/ne/netbsd/pkgs/libterminfo.nix new file mode 100644 index 0000000..b9268cc --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libterminfo.nix @@ -0,0 +1,32 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal, install, tsort, lorder, mandoc, statHook, nbperf, tic, rsync +, compatIfNeeded +, fetchNetBSD +}: + +mkDerivation { + path = "lib/libterminfo"; + version = "9.2"; + sha256 = "0pq05k3dj0dfsczv07frnnji92mazmy2qqngqbx2zgqc1x251414"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal install tsort lorder mandoc statHook nbperf tic rsync + ]; + buildInputs = compatIfNeeded; + SHLIBINSTALLDIR = "$(out)/lib"; + postPatch = '' + substituteInPlace $COMPONENT_PATH/term.c --replace /usr/share $out/share + substituteInPlace $COMPONENT_PATH/setupterm.c \ + --replace '#include ' 'void use_env(bool);' + ''; + postBuild = '' + make -C $BSDSRCDIR/share/terminfo $makeFlags BINDIR=$out/share + ''; + postInstall = '' + make -C $BSDSRCDIR/share/terminfo $makeFlags BINDIR=$out/share install + ''; + extraPaths = [ + (fetchNetBSD "share/terminfo" "9.2" "1vh9rl4w8118a9qdpblfxmv1wkpm83rm9gb4rzz5bpm56i6d7kk7") + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/libutil.nix b/pkgs/by-name/ne/netbsd/pkgs/libutil.nix new file mode 100644 index 0000000..4aaf8f0 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/libutil.nix @@ -0,0 +1,21 @@ +{ mkDerivation +, common, libc, sys +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, byacc, install, tsort, lorder, mandoc, statHook, rsync +, headers +}: + +mkDerivation { + path = "lib/libutil"; + version = "9.2"; + sha256 = "02gm5a5zhh8qp5r5q5r7x8x6x50ir1i0ncgsnfwh1vnrz6mxbq7z"; + extraPaths = [ common libc.src sys.src ]; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + byacc install tsort lorder mandoc statHook rsync + ]; + buildInputs = [ headers ]; + SHLIBINSTALLDIR = "$(out)/lib"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/locale/locale.patch b/pkgs/by-name/ne/netbsd/pkgs/locale/locale.patch new file mode 100644 index 0000000..4b7f478 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/locale/locale.patch @@ -0,0 +1,85 @@ +--- a/usr.bin/locale/locale.c 2018-06-11 14:39:06.449762000 -0400 ++++ b/usr.bin/locale/locale.c 2018-06-11 14:42:28.461122899 -0400 +@@ -56,14 +56,8 @@ + #include + #include + +-#include "citrus_namespace.h" +-#include "citrus_region.h" +-#include "citrus_lookup.h" +-#include "setlocale_local.h" +- + /* Local prototypes */ + void init_locales_list(void); +-void init_locales_list_alias(void); + void list_charmaps(void); + void list_locales(void); + const char *lookup_localecat(int); +@@ -221,6 +215,8 @@ + }; + #define NKWINFO (sizeof(kwinfo)/sizeof(kwinfo[0])) + ++const char *_PathLocale = NULL; ++ + int + main(int argc, char *argv[]) + { +@@ -411,8 +407,7 @@ + while ((dp = readdir(dirp)) != NULL) { + /* exclude "." and "..", _LOCALE_ALIAS_NAME */ + if ((dp->d_name[0] != '.' || (dp->d_name[1] != '\0' && +- (dp->d_name[1] != '.' || dp->d_name[2] != '\0'))) && +- strcmp(_LOCALE_ALIAS_NAME, dp->d_name) != 0) { ++ (dp->d_name[1] != '.' || dp->d_name[2] != '\0')))) { + s = strdup(dp->d_name); + if (s == NULL) + err(1, "could not allocate memory"); +@@ -431,48 +426,10 @@ + if (sl_find(locales, "C") == NULL) + sl_add(locales, "C"); + +- init_locales_list_alias(); +- + /* make output nicer, sort the list */ + qsort(locales->sl_str, locales->sl_cur, sizeof(char *), scmp); + } + +-void +-init_locales_list_alias(void) +-{ +- char aliaspath[PATH_MAX]; +- struct _lookup *hlookup; +- struct _region key, dat; +- size_t n; +- char *s, *t; +- +- _DIAGASSERT(locales != NULL); +- _DIAGASSERT(_PathLocale != NULL); +- +- (void)snprintf(aliaspath, sizeof(aliaspath), +- "%s/" _LOCALE_ALIAS_NAME, _PathLocale); +- +- if (_lookup_seq_open(&hlookup, aliaspath, +- _LOOKUP_CASE_SENSITIVE) == 0) { +- while (_lookup_seq_next(hlookup, &key, &dat) == 0) { +- n = _region_size((const struct _region *)&key); +- s = _region_head((const struct _region *)&key); +- for (t = s; n > 0 && *s!= '/'; --n, ++s); +- n = (size_t)(s - t); +- s = malloc(n + 1); +- if (s == NULL) +- err(1, "could not allocate memory"); +- memcpy(s, t, n); +- s[n] = '\0'; +- if (sl_find(locales, s) == NULL) +- sl_add(locales, s); +- else +- free(s); +- } +- _lookup_seq_close(hlookup); +- } +-} +- + /* + * Show current locale status, depending on environment variables + */ diff --git a/pkgs/by-name/ne/netbsd/pkgs/locale/package.nix b/pkgs/by-name/ne/netbsd/pkgs/locale/package.nix new file mode 100644 index 0000000..3c61e85 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/locale/package.nix @@ -0,0 +1,9 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/locale"; + version = "9.2"; + sha256 = "0kk6v9k2bygq0wf9gbinliqzqpzs9bgxn0ndyl2wcv3hh2bmsr9p"; + patches = [ ./locale.patch ]; + env.NIX_CFLAGS_COMPILE = "-DYESSTR=__YESSTR -DNOSTR=__NOSTR"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/lorder.nix b/pkgs/by-name/ne/netbsd/pkgs/lorder.nix new file mode 100644 index 0000000..d310960 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/lorder.nix @@ -0,0 +1,16 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, rsync +}: + +mkDerivation { + path = "usr.bin/lorder"; + version = "9.2"; + sha256 = "0rjf9blihhm0n699vr2bg88m4yjhkbxh6fxliaay3wxkgnydjwn2"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff rsync + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/make.nix b/pkgs/by-name/ne/netbsd/pkgs/make.nix new file mode 100644 index 0000000..dcd80ef --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/make.nix @@ -0,0 +1,60 @@ +{ lib, mkDerivation, fetchNetBSD, stdenv }: + +mkDerivation { + path = "usr.bin/make"; + sha256 = "0vi73yicbmbp522qzqvd979cx6zm5jakhy77xh73c1kygf8klccs"; + version = "9.2"; + + postPatch = '' + substituteInPlace $BSDSRCDIR/share/mk/bsd.doc.mk \ + --replace '-o ''${DOCOWN}' "" \ + --replace '-g ''${DOCGRP}' "" + for mk in $BSDSRCDIR/share/mk/bsd.inc.mk $BSDSRCDIR/share/mk/bsd.kinc.mk; do + substituteInPlace $mk \ + --replace '-o ''${BINOWN}' "" \ + --replace '-g ''${BINGRP}' "" + done + substituteInPlace $BSDSRCDIR/share/mk/bsd.kmodule.mk \ + --replace '-o ''${KMODULEOWN}' "" \ + --replace '-g ''${KMODULEGRP}' "" + substituteInPlace $BSDSRCDIR/share/mk/bsd.lib.mk \ + --replace '-o ''${LIBOWN}' "" \ + --replace '-g ''${LIBGRP}' "" \ + --replace '-o ''${DEBUGOWN}' "" \ + --replace '-g ''${DEBUGGRP}' "" + substituteInPlace $BSDSRCDIR/share/mk/bsd.lua.mk \ + --replace '-o ''${LIBOWN}' "" \ + --replace '-g ''${LIBGRP}' "" + substituteInPlace $BSDSRCDIR/share/mk/bsd.man.mk \ + --replace '-o ''${MANOWN}' "" \ + --replace '-g ''${MANGRP}' "" + substituteInPlace $BSDSRCDIR/share/mk/bsd.nls.mk \ + --replace '-o ''${NLSOWN}' "" \ + --replace '-g ''${NLSGRP}' "" + substituteInPlace $BSDSRCDIR/share/mk/bsd.prog.mk \ + --replace '-o ''${BINOWN}' "" \ + --replace '-g ''${BINGRP}' "" \ + --replace '-o ''${RUMPBINOWN}' "" \ + --replace '-g ''${RUMPBINGRP}' "" \ + --replace '-o ''${DEBUGOWN}' "" \ + --replace '-g ''${DEBUGGRP}' "" + + # make needs this to pick up our sys make files + export NIX_CFLAGS_COMPILE+=" -D_PATH_DEFSYSPATH=\"$out/share/mk\"" + + substituteInPlace $BSDSRCDIR/share/mk/bsd.lib.mk \ + --replace '_INSTRANLIB=''${empty(PRESERVE):?-a "''${RANLIB} -t":}' '_INSTRANLIB=' + substituteInPlace $BSDSRCDIR/share/mk/bsd.kinc.mk \ + --replace /bin/rm rm + '' + lib.optionalString stdenv.isDarwin '' + substituteInPlace $BSDSRCDIR/share/mk/bsd.sys.mk \ + --replace '-Wl,--fatal-warnings' "" \ + --replace '-Wl,--warn-shared-textrel' "" + ''; + postInstall = '' + make -C $BSDSRCDIR/share/mk FILESDIR=$out/share/mk install + ''; + extraPaths = [ + (fetchNetBSD "share/mk" "9.2" "0w9x77cfnm6zwy40slradzi0ip9gz80x6lk7pvnlxzsr2m5ra5sy") + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/makeMinimal.nix b/pkgs/by-name/ne/netbsd/pkgs/makeMinimal.nix new file mode 100644 index 0000000..18655b3 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/makeMinimal.nix @@ -0,0 +1,43 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook, rsync +, make +}: + +mkDerivation { + path = "tools/make"; + sha256 = "0fh0nrnk18m613m5blrliq2aydciv51qhc0ihsj4k63incwbk90n"; + version = "9.2"; + + buildInputs = []; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook rsync + ]; + + skipIncludesPhase = true; + + postPatch = '' + patchShebangs $COMPONENT_PATH/configure + ${make.postPatch} + ''; + + buildPhase = '' + runHook preBuild + + sh ./buildmake.sh + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -D nbmake $out/bin/nbmake + ln -s $out/bin/nbmake $out/bin/make + mkdir -p $out/share + cp -r $BSDSRCDIR/share/mk $out/share/mk + + runHook postInstall + ''; + + extraPaths = [ make.src ] ++ make.extraPaths; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/man.nix b/pkgs/by-name/ne/netbsd/pkgs/man.nix new file mode 100644 index 0000000..bce5bce --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/man.nix @@ -0,0 +1,17 @@ +{ mkDerivation, defaultMakeFlags }: + +mkDerivation { + path = "share/man"; + noCC = true; + version = "9.2"; + sha256 = "1l4lmj4kmg8dl86x94sr45w0xdnkz8dn4zjx0ipgr9bnq98663zl"; + # man0 generates a man.pdf using ps2pdf, but doesn't install it later, + # so we can avoid the dependency on ghostscript + postPatch = '' + substituteInPlace $COMPONENT_PATH/man0/Makefile --replace "ps2pdf" "echo noop " + ''; + makeFlags = defaultMakeFlags ++ [ + "FILESDIR=$(out)/share" + "MKRUMP=no" # would require to have additional path sys/rump/share/man + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/misc.nix b/pkgs/by-name/ne/netbsd/pkgs/misc.nix new file mode 100644 index 0000000..7f96f4d --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/misc.nix @@ -0,0 +1,9 @@ +{ mkDerivation, defaultMakeFlags }: + +mkDerivation { + path = "share/misc"; + noCC = true; + version = "9.2"; + sha256 = "1j2cdssdx6nncv8ffj7f7ybl7m9hadjj8vm8611skqdvxnjg6nbc"; + makeFlags = defaultMakeFlags ++ [ "BINDIR=$(out)/share" ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/mkDerivation.nix b/pkgs/by-name/ne/netbsd/pkgs/mkDerivation.nix new file mode 100644 index 0000000..82e8889 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/mkDerivation.nix @@ -0,0 +1,82 @@ +{ lib +, stdenvNoCC, stdenv +, fetchNetBSD +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, tsort, lorder +, mandoc, groff, statHook, rsync +, compatIfNeeded +, defaultMakeFlags +}: + +lib.makeOverridable (attrs: let + stdenv' = if attrs.noCC or false then stdenvNoCC else stdenv; +in stdenv'.mkDerivation ({ + pname = "${attrs.pname or (baseNameOf attrs.path)}-netbsd"; + inherit (attrs) version; + src = fetchNetBSD attrs.path attrs.version attrs.sha256; + + extraPaths = [ ]; + + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install tsort lorder mandoc groff statHook rsync + ]; + buildInputs = compatIfNeeded; + + HOST_SH = stdenv'.shell; + + MACHINE_ARCH = { + i486 = "i386"; + i586 = "i386"; + i686 = "i386"; + }.${stdenv'.hostPlatform.parsed.cpu.name} + or stdenv'.hostPlatform.parsed.cpu.name; + + MACHINE = { + x86_64 = "amd64"; + aarch64 = "evbarm64"; + i486 = "i386"; + i586 = "i386"; + i686 = "i386"; + }.${stdenv'.hostPlatform.parsed.cpu.name} + or stdenv'.hostPlatform.parsed.cpu.name; + + COMPONENT_PATH = attrs.path; + + makeFlags = defaultMakeFlags; + + strictDeps = true; + + meta = with lib; { + maintainers = with maintainers; [ matthewbauer qyliss ]; + platforms = platforms.unix; + license = licenses.bsd2; + }; + +} // lib.optionalAttrs stdenv'.hasCC { + # TODO should CC wrapper set this? + CPP = "${stdenv'.cc.targetPrefix}cpp"; +} // lib.optionalAttrs stdenv'.isDarwin { + MKRELRO = "no"; +} // lib.optionalAttrs (stdenv'.cc.isClang or false) { + HAVE_LLVM = lib.versions.major (lib.getVersion stdenv'.cc.cc); +} // lib.optionalAttrs (stdenv'.cc.isGNU or false) { + HAVE_GCC = lib.versions.major (lib.getVersion stdenv'.cc.cc); +} // lib.optionalAttrs (stdenv'.isx86_32) { + USE_SSP = "no"; +} // lib.optionalAttrs (attrs.headersOnly or false) { + installPhase = "includesPhase"; + dontBuild = true; +} // attrs // { + # Files that use NetBSD-specific macros need to have nbtool_config.h + # included ahead of them on non-NetBSD platforms. + postPatch = lib.optionalString (!stdenv'.hostPlatform.isNetBSD) '' + set +e + grep -Zlr "^__RCSID + ^__BEGIN_DECLS" $COMPONENT_PATH | xargs -0r grep -FLZ nbtool_config.h | + xargs -0tr sed -i '0,/^#/s//#include \n\0/' + set -e + '' + attrs.postPatch or ""; +})) diff --git a/pkgs/by-name/ne/netbsd/pkgs/mknod.nix b/pkgs/by-name/ne/netbsd/pkgs/mknod.nix new file mode 100644 index 0000000..5c4c172 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/mknod.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "sbin/mknod"; + version = "9.2"; + sha256 = "1d9369shzwgixz3nph991i8q5vk7hr04py3n9avbfbhzy4gndqs2"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/mtree.nix b/pkgs/by-name/ne/netbsd/pkgs/mtree.nix new file mode 100644 index 0000000..723da3a --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/mtree.nix @@ -0,0 +1,8 @@ +{ mkDerivation, mknod }: + +mkDerivation { + path = "usr.sbin/mtree"; + version = "9.2"; + sha256 = "04p7w540vz9npvyb8g8hcf2xa05phn1y88hsyrcz3vwanvpc0yv9"; + extraPaths = [ mknod.src ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/nbperf.nix b/pkgs/by-name/ne/netbsd/pkgs/nbperf.nix new file mode 100644 index 0000000..02ce7cf --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/nbperf.nix @@ -0,0 +1,8 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/nbperf"; + version = "9.2"; + sha256 = "1nxc302vgmjhm3yqdivqyfzslrg0vjpbss44s74rcryrl19mma9r"; +} + diff --git a/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/package.nix b/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/package.nix new file mode 100644 index 0000000..e80571f --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/package.nix @@ -0,0 +1,5 @@ +{ makeSetupHook }: + +makeSetupHook { + name = "netbsd-setup-hook"; + } ./setup-hook.sh diff --git a/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/setup-hook.sh b/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/setup-hook.sh new file mode 100644 index 0000000..fa8b19e --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/netbsdSetupHook/setup-hook.sh @@ -0,0 +1,15 @@ +mergeNetBSDSourceDir() { + # merge together all extra paths + # there should be a better way to do this + chmod -R u+w $BSDSRCDIR + for path in $extraPaths; do + rsync -Er --chmod u+w $path/ $BSDSRCDIR/ + done +} + +addNetBSDMakeFlags() { + makeFlags="INCSDIR=${!outputDev}/include $makeFlags" +} + +postUnpackHooks+=(mergeNetBSDSourceDir) +preConfigureHooks+=(addNetBSDMakeFlags) diff --git a/pkgs/by-name/ne/netbsd/pkgs/rpcgen.nix b/pkgs/by-name/ne/netbsd/pkgs/rpcgen.nix new file mode 100644 index 0000000..b1482d4 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/rpcgen.nix @@ -0,0 +1,7 @@ +{ mkDerivation }: + +mkDerivation { + path = "usr.bin/rpcgen"; + version = "9.2"; + sha256 = "1kfgfx54jg98wbg0d95p0rvf4w0302v8fz724b0bdackdsrd4988"; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/stat/hook.nix b/pkgs/by-name/ne/netbsd/pkgs/stat/hook.nix new file mode 100644 index 0000000..78186f5 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/stat/hook.nix @@ -0,0 +1,14 @@ +{ makeSetupHook, writeText, stat }: + +# stat isn't in POSIX, and NetBSD stat supports a completely +# different range of flags than GNU stat, so including it in PATH +# breaks stdenv. Work around that with a hook that will point +# NetBSD's build system and NetBSD stat without including it in +# PATH. + +makeSetupHook { + name = "netbsd-stat-hook"; +} (writeText "netbsd-stat-hook-impl" '' + makeFlagsArray+=(TOOL_STAT=${stat}/bin/stat) +'') + diff --git a/pkgs/by-name/ne/netbsd/pkgs/stat/package.nix b/pkgs/by-name/ne/netbsd/pkgs/stat/package.nix new file mode 100644 index 0000000..fa4d5cb --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/stat/package.nix @@ -0,0 +1,19 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, rsync +}: + +# Don't add this to nativeBuildInputs directly. +# Use statHook instead. See note in stat/hook.nix + +mkDerivation { + path = "usr.bin/stat"; + version = "9.2"; + sha256 = "18nqwlndfc34qbbgqx5nffil37jfq9aw663ippasfxd2hlyc106x"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff rsync + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/sys/base.nix b/pkgs/by-name/ne/netbsd/pkgs/sys/base.nix new file mode 100644 index 0000000..ba458ef --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/sys/base.nix @@ -0,0 +1,72 @@ +{ lib, mkDerivation +, include +, bsdSetupHook, netbsdSetupHook +, makeMinimal, install, tsort, lorder, statHook, rsync, uudecode, config, genassym +, defaultMakeFlags +, common +}: +{ + path = "sys"; + version = "9.2"; + sha256 = "03s18q8d9giipf05bx199fajc2qwikji0djz7hw63d2lya6bfnpj"; + + # Make the build ignore linker warnings + prePatch = '' + substituteInPlace sys/conf/Makefile.kern.inc \ + --replace "-Wa,--fatal-warnings" "" + ''; + + patches = [ + # Fix this error when building bootia32.efi and bootx64.efi: + # error: PHDR segment not covered by LOAD segment + ./no-dynamic-linker.patch + + # multiple header dirs, see above + ./sys-headers-incsdir.patch + ]; + + postPatch = + '' + substituteInPlace sys/arch/i386/stand/efiboot/Makefile.efiboot \ + --replace "-nocombreloc" "-z nocombreloc" + '' + + # multiple header dirs, see above + include.postPatch; + + CONFIG = "GENERIC"; + + propagatedBuildInputs = [ include ]; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal install tsort lorder statHook rsync uudecode config genassym + ]; + + postConfigure = '' + pushd arch/$MACHINE/conf + config $CONFIG + popd + '' + # multiple header dirs, see above + + include.postConfigure; + + makeFlags = defaultMakeFlags ++ [ "FIRMWAREDIR=$(out)/libdata/firmware" ]; + hardeningDisable = [ "pic" ]; + MKKMOD = "no"; + env.NIX_CFLAGS_COMPILE = toString [ + "-Wno-error=array-parameter" + "-Wno-error=array-bounds" + "-Wa,--no-warn" + ]; + + postBuild = '' + make -C arch/$MACHINE/compile/$CONFIG $makeFlags + ''; + + postInstall = '' + cp arch/$MACHINE/compile/$CONFIG/netbsd $out + ''; + + meta.platforms = lib.platforms.netbsd; + extraPaths = [ common ]; + +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/sys/headers.nix b/pkgs/by-name/ne/netbsd/pkgs/sys/headers.nix new file mode 100644 index 0000000..a3f20d7 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/sys/headers.nix @@ -0,0 +1,21 @@ +{ lib, mkDerivation +, include +, bsdSetupHook, netbsdSetupHook +, makeMinimal, install, tsort, lorder, statHook, rsync, uudecode, config, genassym +, defaultMakeFlags +, common +}: +let + base = import ./base.nix { + inherit + lib mkDerivation include bsdSetupHook netbsdSetupHook makeMinimal install + tsort lorder statHook rsync uudecode config genassym defaultMakeFlags + common; + }; +in + mkDerivation (base // { + pname = "sys-headers"; + installPhase = "includesPhase"; + dontBuild = true; + noCC = true; + }) diff --git a/pkgs/by-name/ne/netbsd/pkgs/sys/no-dynamic-linker.patch b/pkgs/by-name/ne/netbsd/pkgs/sys/no-dynamic-linker.patch new file mode 100644 index 0000000..b3e9f3c --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/sys/no-dynamic-linker.patch @@ -0,0 +1,16 @@ +=================================================================== +RCS file: /ftp/cvs/cvsroot/src/sys/arch/i386/stand/efiboot/Makefile.efiboot,v +rcsdiff: /ftp/cvs/cvsroot/src/sys/arch/i386/stand/efiboot/Makefile.efiboot,v: warning: Unknown phrases like `commitid ...;' are present. +retrieving revision 1.16 +retrieving revision 1.17 +diff -u -p -r1.16 -r1.17 +--- a/sys/arch/i386/stand/efiboot/Makefile.efiboot 2019/09/13 02:19:45 1.16 ++++ b/sys/arch/i386/stand/efiboot/Makefile.efiboot 2020/04/04 15:30:46 1.17 +@@ -41,6 +41,7 @@ BINMODE=444 + .PATH: ${.CURDIR}/../../libsa + + LDSCRIPT?= ${.CURDIR}/ldscript ++LDFLAGS+= --no-dynamic-linker --noinhibit-exec + LDFLAGS+= -nostdlib -T${LDSCRIPT} -Bsymbolic -shared -nocombreloc + CPPFLAGS+= -I$S -I${.CURDIR} -I${.CURDIR}/.. -I$S/lib/libsa + CPPFLAGS+= -I${.OBJDIR} diff --git a/pkgs/by-name/ne/netbsd/pkgs/sys/package.nix b/pkgs/by-name/ne/netbsd/pkgs/sys/package.nix new file mode 100644 index 0000000..87031a5 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/sys/package.nix @@ -0,0 +1,21 @@ +{ lib, mkDerivation +, include +, bsdSetupHook, netbsdSetupHook +, makeMinimal, install, tsort, lorder, statHook, rsync, uudecode, config, genassym +, defaultMakeFlags +, common +}: +let + base = import ./base.nix { + inherit + lib mkDerivation include bsdSetupHook netbsdSetupHook makeMinimal install + tsort lorder statHook rsync uudecode config genassym defaultMakeFlags + common; + }; +in + mkDerivation (base // { + pname = "sys"; + installPhase = null; + noCC = false; + dontBuild = false; + }) diff --git a/pkgs/by-name/ne/netbsd/pkgs/sys/sys-headers-incsdir.patch b/pkgs/by-name/ne/netbsd/pkgs/sys/sys-headers-incsdir.patch new file mode 100644 index 0000000..5cfb2a5 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/sys/sys-headers-incsdir.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile b/Makefile +index 3f1e18dc659d..163362b82f94 100644 +--- a/sys/Makefile ++++ b/sys/Makefile +@@ -2,6 +2,8 @@ + + .include + ++INCSDIR= ${INCSDIR0} ++ + SUBDIR= altq arch compat dev fs miscfs \ + net net80211 netatalk netbt netcan netipsec netinet netinet6 \ + netmpls netsmb \ diff --git a/pkgs/by-name/ne/netbsd/pkgs/tic.nix b/pkgs/by-name/ne/netbsd/pkgs/tic.nix new file mode 100644 index 0000000..2a7e364 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/tic.nix @@ -0,0 +1,28 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, nbperf, rsync +, compatIfNeeded +, defaultMakeFlags +, libterminfo +, fetchNetBSD +}: + +mkDerivation { + path = "tools/tic"; + version = "9.2"; + sha256 = "092y7db7k4kh2jq8qc55126r5qqvlb8lq8mhmy5ipbi36hwb4zrz"; + HOSTPROG = "tic"; + buildInputs = compatIfNeeded; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff nbperf rsync + ]; + makeFlags = defaultMakeFlags ++ [ "TOOLDIR=$(out)" ]; + extraPaths = [ + libterminfo.src + (fetchNetBSD "usr.bin/tic" "9.2" "1mwdfg7yx1g43ss378qsgl5rqhsxskqvsd2mqvrn38qw54i8v5i1") + (fetchNetBSD "tools/Makefile.host" "9.2" "15b4ab0n36lqj00j5lz2xs83g7l8isk3wx1wcapbrn66qmzz2sxy") + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/tsort.nix b/pkgs/by-name/ne/netbsd/pkgs/tsort.nix new file mode 100644 index 0000000..334eccc --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/tsort.nix @@ -0,0 +1,16 @@ +{ mkDerivation +, bsdSetupHook, netbsdSetupHook +, makeMinimal +, install, mandoc, groff, rsync +}: + +mkDerivation { + path = "usr.bin/tsort"; + version = "9.2"; + sha256 = "1dqvf9gin29nnq3c4byxc7lfd062pg7m84843zdy6n0z63hnnwiq"; + nativeBuildInputs = [ + bsdSetupHook netbsdSetupHook + makeMinimal + install mandoc groff rsync + ]; +} diff --git a/pkgs/by-name/ne/netbsd/pkgs/uudecode.nix b/pkgs/by-name/ne/netbsd/pkgs/uudecode.nix new file mode 100644 index 0000000..dac9674 --- /dev/null +++ b/pkgs/by-name/ne/netbsd/pkgs/uudecode.nix @@ -0,0 +1,10 @@ +{ lib, mkDerivation, stdenv }: + +mkDerivation { + path = "usr.bin/uudecode"; + version = "9.2"; + sha256 = "00a3zmh15pg4vx6hz0kaa5mi8d2b1sj4h512d7p6wbvxq6mznwcn"; + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isLinux "-DNO_BASE64"; + NIX_LDFLAGS = lib.optional stdenv.isDarwin "-lresolv"; +} + diff --git a/pkgs/by-name/ne/netpbm/default.nix b/pkgs/by-name/ne/netpbm/default.nix new file mode 100644 index 0000000..e7cc5a6 --- /dev/null +++ b/pkgs/by-name/ne/netpbm/default.nix @@ -0,0 +1,130 @@ +{ lib +, stdenv +, fetchsvn +, pkg-config +, libjpeg +, libpng +, jbigkit +, flex +, zlib +, perl +, libxml2 +, makeWrapper +, libtiff +, enableX11 ? false +, libX11 +, buildPackages +}: + +stdenv.mkDerivation { + # Determine version and revision from: + # https://sourceforge.net/p/netpbm/code/HEAD/log/?path=/advanced + pname = "netpbm"; + version = "11.6.0"; + + outputs = [ "bin" "out" "dev" ]; + + src = fetchsvn { + url = "https://svn.code.sf.net/p/netpbm/code/advanced"; + rev = "4897"; + sha256 = "2aTDM0aVfav2mnOLXj0HuTdbsY7EUH8ieBrXgaFU7FU="; + }; + + nativeBuildInputs = [ + pkg-config + flex + makeWrapper + ]; + + buildInputs = [ + zlib + perl + libpng + libjpeg + libxml2 + libtiff + jbigkit + ] ++ lib.optional enableX11 libX11; + + + strictDeps = true; + + enableParallelBuilding = true; + + # Environment variables + STRIPPROG = "${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}strip"; + + postPatch = '' + # Install libnetpbm.so symlink to correct destination + substituteInPlace lib/Makefile \ + --replace '/sharedlink' '/lib' + ''; + + configurePhase = '' + runHook preConfigure + + cp config.mk.in config.mk + + # Disable building static library + echo "STATICLIB_TOO = N" >> config.mk + + # Enable cross-compilation + echo 'AR = ${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ar' >> config.mk + echo 'CC = ${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc' >> config.mk + echo 'CC_FOR_BUILD = ${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc' >> config.mk + echo 'LD_FOR_BUILD = $(CC_FOR_BUILD)' >> config.mk + echo 'PKG_CONFIG = ${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config' >> config.mk + echo 'RANLIB = ${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ranlib' >> config.mk + + # Use libraries from Nixpkgs + echo "TIFFLIB = libtiff.so" >> config.mk + echo "TIFFLIB_NEEDS_JPEG = N" >> config.mk + echo "TIFFLIB_NEEDS_Z = N" >> config.mk + echo "JPEGLIB = libjpeg.so" >> config.mk + echo "JBIGLIB = libjbig.a" >> config.mk + # Insecure + echo "JASPERLIB = NONE" >> config.mk + + # Fix path to rgb.txt + echo "RGB_DB_PATH = $out/share/netpbm/misc/rgb.txt" >> config.mk + '' + lib.optionalString stdenv.isDarwin '' + echo "LDSHLIB=-dynamiclib -install_name $out/lib/libnetpbm.\$(MAJ).dylib" >> config.mk + echo "NETPBMLIBTYPE = dylib" >> config.mk + echo "NETPBMLIBSUFFIX = dylib" >> config.mk + '' + '' + runHook postConfigure + ''; + + env = lib.optionalAttrs stdenv.cc.isClang { + NIX_CFLAGS_COMPILE = "-Wno-implicit-function-declaration"; + }; + + installPhase = '' + runHook preInstall + + make package pkgdir=$out + + rm -rf $out/*_template $out/{pkginfo,README,VERSION} $out/man/web + + mkdir -p $out/share/netpbm + mv $out/misc $out/share/netpbm/ + + moveToOutput bin "''${!outputBin}" + + # wrap any scripts that expect other programs in the package to be in their PATH + for prog in ppmquant; do + wrapProgram "''${!outputBin}/bin/$prog" --prefix PATH : "''${!outputBin}/bin" + done + + runHook postInstall + ''; + + passthru.updateScript = ./update.sh; + + meta = { + homepage = "https://netpbm.sourceforge.net/"; + description = "Toolkit for manipulation of graphic images"; + license = lib.licenses.free; # http://netpbm.svn.code.sourceforge.net/p/netpbm/code/trunk/doc/copyright_summary + platforms = with lib.platforms; linux ++ darwin; + }; +} diff --git a/pkgs/by-name/ne/netpbm/update.sh b/pkgs/by-name/ne/netpbm/update.sh new file mode 100755 index 0000000..670e872 --- /dev/null +++ b/pkgs/by-name/ne/netpbm/update.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p bash -p subversion -p common-updater-scripts -i bash + +die() { + echo "error: $1" >&2 + exit 1 +} + +attr=netpbm +svnRoot=https://svn.code.sf.net/p/netpbm/code/advanced + +oldRev=$(nix-instantiate --eval -E "with import ./. {}; $attr.src.rev" | tr -d '"') +if [[ -z "$oldRev" ]]; then + die "Could not extract old revision." +fi + +latestRev=$(svn info --show-item "last-changed-revision" "$svnRoot") +if [[ -z "$latestRev" ]]; then + die "Could not find out last changed revision." +fi + +versionInfo=$(svn cat -r "$latestRev" "$svnRoot/version.mk") +if [[ -z "$versionInfo" ]]; then + die "Could not get version info." +fi + +nixFile=$(nix-instantiate --eval --strict -A "$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/') +if [[ ! -f "$nixFile" ]]; then + die "Could not evaluate '$attr.meta.position' to locate the .nix file!" +fi + +# h remembers if we found the pattern; on the last line, if a pattern was previously found, we exit with 1 +# https://stackoverflow.com/a/12145797/160386 +sed -i "$nixFile" -re '/(\brev\b\s*=\s*)"'"$oldRev"'"/{ s||\1"'"$latestRev"'"|; h }; ${x; /./{x; q1}; x}' && die "Unable to update revision." + +majorRelease=$(grep --perl-regex --only-matching 'NETPBM_MAJOR_RELEASE = \K.+' <<< "$versionInfo") +minorRelease=$(grep --perl-regex --only-matching 'NETPBM_MINOR_RELEASE = \K.+' <<< "$versionInfo") +pointRelease=$(grep --perl-regex --only-matching 'NETPBM_POINT_RELEASE = \K.+' <<< "$versionInfo") + +update-source-version "$attr" "$majorRelease.$minorRelease.$pointRelease" diff --git a/pkgs/by-name/ng/nghttp2/default.nix b/pkgs/by-name/ng/nghttp2/default.nix new file mode 100644 index 0000000..3abd7b2 --- /dev/null +++ b/pkgs/by-name/ng/nghttp2/default.nix @@ -0,0 +1,104 @@ +{ lib +, stdenv +, fetchurl +, installShellFiles +, pkg-config + +# Optional dependencies +, enableApp ? with stdenv.hostPlatform; !isWindows && !isStatic +, c-aresMinimal, libev, openssl, zlib +, enableGetAssets ? false, libxml2 +, enableHpack ? false, jansson +, enableHttp3 ? false, ngtcp2, nghttp3, quictls +, enableJemalloc ? false, jemalloc +, enablePython ? false, python3, ncurses + +# Unit tests ; we have to set TZDIR, which is a GNUism. +, enableTests ? stdenv.hostPlatform.isGnu, cunit, tzdata + +# for passthru.tests +# downstream dependencies, for testing +# , curl +# , libsoup +}: + +# Note: this package is used for bootstrapping fetchurl, and thus cannot use fetchpatch! +# All mutable patches (generated by GitHub or cgit) that are needed here +# should be included directly in Nixpkgs as files. + +assert enableGetAssets -> enableApp; +assert enableHpack -> enableApp; +assert enableHttp3 -> enableApp; +assert enableJemalloc -> enableApp; + +stdenv.mkDerivation rec { + pname = "nghttp2"; + version = "1.61.0"; + + src = fetchurl { + url = "https://github.com/${pname}/${pname}/releases/download/v${version}/${pname}-${version}.tar.bz2"; + sha256 = "sha256-Toz37DLUxaQwlmJC1yA10lXNlHCodm1h7tegGQ3VRP0="; + }; + + outputs = [ "out" "dev" "lib" "doc" "man" ]; + + nativeBuildInputs = [ pkg-config ] + ++ lib.optionals (enableApp) [ installShellFiles ]; + + buildInputs = lib.optionals enableApp [ c-aresMinimal libev zlib ] + ++ lib.optionals (enableApp && !enableHttp3) [ openssl ] + ++ lib.optionals (enableGetAssets) [ libxml2 ] + ++ lib.optionals (enableHpack) [ jansson ] + ++ lib.optionals (enableJemalloc) [ jemalloc ] + ++ lib.optionals (enableHttp3) [ ngtcp2 nghttp3 quictls ] + ++ lib.optionals (enablePython) [ python3 ]; + + enableParallelBuilding = true; + + configureFlags = [ + "--disable-examples" + (lib.enableFeature enableApp "app") + (lib.enableFeature enableHttp3 "http3") + ]; + + # Unit tests require CUnit and setting TZDIR environment variable + doCheck = enableTests; + nativeCheckInputs = lib.optionals (enableTests) [ cunit tzdata ]; + preCheck = lib.optionalString (enableTests) '' + export TZDIR=${tzdata}/share/zoneinfo + ''; + + postInstall = lib.optionalString (enableApp) '' + installShellCompletion --bash doc/bash_completion/{h2load,nghttp,nghttpd,nghttpx} + '' + lib.optionalString (!enableApp) '' + rm -r $out/bin + '' + lib.optionalString (enablePython) '' + patchShebangs $out/share/nghttp2 + '' + lib.optionalString (!enablePython) '' + rm -r $out/share + ''; + + # passthru.tests = { + # inherit curl libsoup; + # }; + + meta = with lib; { + description = "HTTP/2 C library and tools"; + longDescription = '' + nghttp2 is an implementation of the HyperText Transfer Protocol version 2 in C. + The framing layer of HTTP/2 is implemented as a reusable C library. On top of that, + we have implemented an HTTP/2 client, server and proxy. We have also developed + load test and benchmarking tools for HTTP/2. + An HPACK encoder and decoder are available as a public API. + We have Python bindings of this library, but we do not have full code coverage yet. + An experimental high level C++ library is also available. + ''; + + homepage = "https://nghttp2.org/"; + changelog = "https://github.com/nghttp2/nghttp2/releases/tag/v${version}"; + # News articles with changes summary can be found here: https://nghttp2.org/blog/archives/ + license = licenses.mit; + maintainers = with maintainers; [ c0bw3b ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/ng/nghttp2/packages.nix b/pkgs/by-name/ng/nghttp2/packages.nix new file mode 100644 index 0000000..25246e1 --- /dev/null +++ b/pkgs/by-name/ng/nghttp2/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + nghttp2 = callPackage ./. { }; + libnghttp2 = nghttp2.lib; +} diff --git a/pkgs/by-name/ng/nghttp3/default.nix b/pkgs/by-name/ng/nghttp3/default.nix new file mode 100644 index 0000000..6bf25dc --- /dev/null +++ b/pkgs/by-name/ng/nghttp3/default.nix @@ -0,0 +1,44 @@ +{ lib, stdenv, fetchFromGitHub +, cmake +, CoreServices +# for passthru.tests +# , curlHTTP3 +}: + +stdenv.mkDerivation rec { + pname = "nghttp3"; + version = "1.2.0"; + + src = fetchFromGitHub { + owner = "ngtcp2"; + repo = pname; + rev = "v${version}"; + hash = "sha256-kJt4aQGNiJ0XhlEKunR8jYKytv3rh23jRrNelCDe/Kk="; + fetchSubmodules = true; + }; + + outputs = [ "out" "dev" "doc" ]; + + nativeBuildInputs = [ cmake ]; + buildInputs = lib.optionals stdenv.isDarwin [ + CoreServices + ]; + + cmakeFlags = [ + (lib.cmakeBool "ENABLE_STATIC_LIB" false) + ]; + + doCheck = true; + + # passthru.tests = { + # inherit curlHTTP3; + # }; + + meta = with lib; { + homepage = "https://github.com/ngtcp2/nghttp3"; + description = "nghttp3 is an implementation of HTTP/3 mapping over QUIC and QPACK in C."; + license = licenses.mit; + platforms = platforms.unix; + maintainers = with maintainers; [ izorkin ]; + }; +} diff --git a/pkgs/by-name/ng/nghttp3/packages.nix b/pkgs/by-name/ng/nghttp3/packages.nix new file mode 100644 index 0000000..bb285bc --- /dev/null +++ b/pkgs/by-name/ng/nghttp3/packages.nix @@ -0,0 +1,7 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + nghttp3 = callPackage ./. { inherit (darwin.apple_sdk.frameworks) CoreServices; }; +} diff --git a/pkgs/by-name/ng/ngtcp2/default.nix b/pkgs/by-name/ng/ngtcp2/default.nix new file mode 100644 index 0000000..c511d89 --- /dev/null +++ b/pkgs/by-name/ng/ngtcp2/default.nix @@ -0,0 +1,51 @@ +{ lib, stdenv, fetchFromGitHub +, cmake +, brotli, libev, nghttp3, quictls +, CoreServices +, withJemalloc ? false, jemalloc +# for passthru.tests +# , curlHTTP3 +}: + +stdenv.mkDerivation rec { + pname = "ngtcp2"; + version = "1.4.0"; + + src = fetchFromGitHub { + owner = "ngtcp2"; + repo = pname; + rev = "v${version}"; + hash = "sha256-te/kFt7/09QpmkHZ7dJxyKvvxP+mHtIQIgESkJATR38="; + fetchSubmodules = true; + }; + + outputs = [ "out" "dev" "doc" ]; + + nativeBuildInputs = [ cmake ]; + buildInputs = [ + brotli + libev + nghttp3 + quictls + ] ++ lib.optionals stdenv.isDarwin [ + CoreServices + ] ++ lib.optional withJemalloc jemalloc; + + cmakeFlags = [ + (lib.cmakeBool "ENABLE_STATIC_LIB" false) + ]; + + doCheck = true; + + # passthru.tests = { + # inherit curlHTTP3; + # }; + + meta = with lib; { + homepage = "https://github.com/ngtcp2/ngtcp2"; + description = "ngtcp2 project is an effort to implement QUIC protocol which is now being discussed in IETF QUICWG for its standardization."; + license = licenses.mit; + platforms = platforms.unix; + maintainers = with maintainers; [ izorkin ]; + }; +} diff --git a/pkgs/by-name/ng/ngtcp2/gnutls.nix b/pkgs/by-name/ng/ngtcp2/gnutls.nix new file mode 100644 index 0000000..b521569 --- /dev/null +++ b/pkgs/by-name/ng/ngtcp2/gnutls.nix @@ -0,0 +1,53 @@ +{ lib, stdenv, fetchFromGitHub +, autoreconfHook, pkg-config +, gnutls +, cunit, ncurses, knot-dns +}: + +stdenv.mkDerivation rec { + pname = "ngtcp2"; + version = "1.4.0"; + + src = fetchFromGitHub { + owner = "ngtcp2"; + repo = "ngtcp2"; + rev = "v${version}"; + hash = "sha256-C1Rk0KzTvFpwCz8vXvhSqGjYmGyLZxmnzZhPLZiL97M="; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ autoreconfHook pkg-config ]; + buildInputs = [ gnutls ]; + + configureFlags = [ "--with-gnutls=yes" ]; + enableParallelBuilding = true; + + doCheck = true; + nativeCheckInputs = [ cunit ] + ++ lib.optional stdenv.isDarwin ncurses; + + passthru.tests = knot-dns.passthru.tests; # the only consumer so far + + meta = with lib; { + homepage = "https://github.com/ngtcp2/ngtcp2"; + description = "an effort to implement RFC9000 QUIC protocol."; + license = licenses.mit; + platforms = platforms.unix; + maintainers = with maintainers; [ vcunat/* for knot-dns */ ]; + }; +} + +/* + Why split from ./default.nix? + + ngtcp2 libs contain helpers to plug into various crypto libs (gnutls, patched openssl, ...). + Building multiple of them while keeping closures separable would be relatively complicated. + Separating the builds is easier for now; the missed opportunity to share the 0.3--0.4 MB + library isn't such a big deal. + + Moreover upstream still commonly does incompatible changes, so agreeing + on a single version might be hard sometimes. That's why it seemed simpler + to completely separate the nix expressions, too. +*/ + diff --git a/pkgs/by-name/ng/ngtcp2/packages.nix b/pkgs/by-name/ng/ngtcp2/packages.nix new file mode 100644 index 0000000..8f14934 --- /dev/null +++ b/pkgs/by-name/ng/ngtcp2/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + ngtcp2 = callPackage ./ngtcp2 { inherit (darwin.apple_sdk.frameworks) CoreServices; }; + ngtcp2-gnutls = callPackage ./gnutls.nix { }; +} diff --git a/pkgs/by-name/ni/ninja/default.nix b/pkgs/by-name/ni/ninja/default.nix new file mode 100644 index 0000000..3402bcf --- /dev/null +++ b/pkgs/by-name/ni/ninja/default.nix @@ -0,0 +1,108 @@ +{ lib +, stdenv +, fetchFromGitHub +, fetchpatch +, asciidoc +, docbook_xml_dtd_45 +, docbook_xsl +, installShellFiles +, libxslt +, python3 +, re2c +, buildPackages +, buildDocs ? true +}: + +stdenv.mkDerivation rec { + pname = "ninja"; + version = "1.11.1"; + + src = fetchFromGitHub { + owner = "ninja-build"; + repo = "ninja"; + rev = "v${version}"; + hash = "sha256-LvV/Fi2ARXBkfyA1paCRmLUwCh/rTyz+tGMg2/qEepI="; + }; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + nativeBuildInputs = [ + python3 + re2c + installShellFiles + ] + ++ lib.optionals buildDocs [ + asciidoc + docbook_xml_dtd_45 + docbook_xsl + libxslt.bin + ]; + + patches = lib.optionals stdenv.is32bit [ + # Otherwise ninja may fail on some files in a larger FS. + (fetchpatch { + name = "stat64.patch"; + url = "https://github.com/ninja-build/ninja/commit/7bba11ae704efc84cac5fde5e9be53f653f237d1.diff"; + hash = "sha256-tINS57xLh1lwnYFWCQs5OudfgtIShaOh5zbmv7w5BnQ="; + }) + ]; + + postPatch = '' + # write rebuild args to file after bootstrap + substituteInPlace configure.py --replace "subprocess.check_call(rebuild_args)" "open('rebuild_args','w').write(rebuild_args[0])" + ''; + + buildPhase = '' + runHook preBuild + + # for list of env vars + # see https://github.com/ninja-build/ninja/blob/v1.11.1/configure.py#L264 + CXX="$CXX_FOR_BUILD" \ + AR="$AR_FOR_BUILD" \ + CFLAGS="$CFLAGS_FOR_BUILD" \ + CXXFLAGS="$CXXFLAGS_FOR_BUILD" \ + LDFLAGS="$LDFLAGS_FOR_BUILD" \ + python configure.py --bootstrap + python configure.py + + source rebuild_args + '' + lib.optionalString buildDocs '' + # "./ninja -vn manual" output copied here to support cross compilation. + asciidoc -b docbook -d book -o build/manual.xml doc/manual.asciidoc + xsltproc --nonet doc/docbook.xsl build/manual.xml > doc/manual.html + '' + '' + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -Dm555 -t $out/bin ninja + installShellCompletion --name ninja \ + --bash misc/bash-completion \ + --zsh misc/zsh-completion + '' + lib.optionalString buildDocs '' + install -Dm444 -t $out/share/doc/ninja doc/manual.asciidoc doc/manual.html + '' + '' + + runHook postInstall + ''; + + setupHook = ./setup-hook.sh; + + meta = with lib; { + description = "Small build system with a focus on speed"; + mainProgram = "ninja"; + longDescription = '' + Ninja is a small build system with a focus on speed. It differs from + other build systems in two major respects: it is designed to have its + input files generated by a higher-level build system, and it is designed + to run builds as fast as possible. + ''; + homepage = "https://ninja-build.org/"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ thoughtpolice bjornfor orivej ]; + }; +} diff --git a/pkgs/by-name/ni/ninja/setup-hook.sh b/pkgs/by-name/ni/ninja/setup-hook.sh new file mode 100644 index 0000000..7fa5e46 --- /dev/null +++ b/pkgs/by-name/ni/ninja/setup-hook.sh @@ -0,0 +1,86 @@ +ninjaBuildPhase() { + runHook preBuild + + local buildCores=1 + + # Parallel building is enabled by default. + if [ "${enableParallelBuilding-1}" ]; then + buildCores="$NIX_BUILD_CORES" + fi + + local flagsArray=( + -j$buildCores + $ninjaFlags "${ninjaFlagsArray[@]}" + ) + + echoCmd 'build flags' "${flagsArray[@]}" + TERM=dumb ninja "${flagsArray[@]}" + + runHook postBuild +} + +ninjaCheckPhase() { + runHook preCheck + + if [ -z "${checkTarget:-}" ]; then + if ninja -t query test >/dev/null 2>&1; then + checkTarget=test + fi + fi + + if [ -z "${checkTarget:-}" ]; then + echo "no test target found in ninja, doing nothing" + else + local buildCores=1 + + if [ "${enableParallelChecking-1}" ]; then + buildCores="$NIX_BUILD_CORES" + fi + + local flagsArray=( + -j$buildCores + $ninjaFlags "${ninjaFlagsArray[@]}" + $checkTarget + ) + + echoCmd 'check flags' "${flagsArray[@]}" + TERM=dumb ninja "${flagsArray[@]}" + fi + + runHook postCheck +} + +ninjaInstallPhase() { + runHook preInstall + + local buildCores=1 + + # Parallel building is enabled by default. + if [ "${enableParallelInstalling-1}" ]; then + buildCores="$NIX_BUILD_CORES" + fi + + # shellcheck disable=SC2086 + local flagsArray=( + -j$buildCores + $ninjaFlags "${ninjaFlagsArray[@]}" + ${installTargets:-install} + ) + + echoCmd 'install flags' "${flagsArray[@]}" + TERM=dumb ninja "${flagsArray[@]}" + + runHook postInstall +} + +if [ -z "${dontUseNinjaBuild-}" -a -z "${buildPhase-}" ]; then + buildPhase=ninjaBuildPhase +fi + +if [ -z "${dontUseNinjaCheck-}" -a -z "${checkPhase-}" ]; then + checkPhase=ninjaCheckPhase +fi + +if [ -z "${dontUseNinjaInstall-}" -a -z "${installPhase-}" ]; then + installPhase=ninjaInstallPhase +fi diff --git a/pkgs/by-name/ni/nix/common.nix b/pkgs/by-name/ni/nix/common.nix new file mode 100644 index 0000000..b04c593 --- /dev/null +++ b/pkgs/by-name/ni/nix/common.nix @@ -0,0 +1,277 @@ +{ lib +, fetchFromGitHub +, version +, suffix ? "" +, hash ? null +, src ? fetchFromGitHub { owner = "NixOS"; repo = "nix"; rev = version; inherit hash; } +, patches ? [ ] +, maintainers ? with lib.maintainers; [ eelco lovesegfault artturin ma27 ] +}@args: +assert (hash == null) -> (src != null); +let + atLeast24 = lib.versionAtLeast version "2.4pre"; + atLeast25 = lib.versionAtLeast version "2.5pre"; + atLeast27 = lib.versionAtLeast version "2.7pre"; + atLeast210 = lib.versionAtLeast version "2.10pre"; + atLeast213 = lib.versionAtLeast version "2.13pre"; + atLeast214 = lib.versionAtLeast version "2.14pre"; + atLeast219 = lib.versionAtLeast version "2.19pre"; + atLeast220 = lib.versionAtLeast version "2.20pre"; + atLeast221 = lib.versionAtLeast version "2.21pre"; + # Major.minor versions unaffected by CVE-2024-27297 + unaffectedByFodSandboxEscape = [ + "2.3" + "2.16" + "2.18" + "2.19" + "2.20" + ]; +in +{ stdenv +, autoconf-archive +, autoreconfHook +, bash +, bison +, boehmgc +, boost +, brotli +, busybox-sandbox-shell +, bzip2 +, callPackage +, coreutils +, curl +, docbook_xsl_ns +, docbook5 +, editline +, flex +, git +, gnutar +, gtest +, gzip +, jq +, lib +, libarchive +, libcpuid +, libgit2 +, libsodium +, libxml2 +, libxslt +, lowdown +, man +, mdbook +, mdbook-linkcheck +, nlohmann_json +, openssl +, perl +, pkg-config +, rapidcheck +, Security +, sqlite +, util-linuxMinimal +, xz + +, enableDocumentation ? !atLeast24 || stdenv.hostPlatform == stdenv.buildPlatform +, enableStatic ? stdenv.hostPlatform.isStatic +, withAWS ? !enableStatic && (stdenv.isLinux || stdenv.isDarwin), aws-sdk-cpp +, withLibseccomp ? lib.meta.availableOn stdenv.hostPlatform libseccomp, libseccomp + +, confDir +, stateDir +, storeDir + + # passthru tests +, pkgsi686Linux +}: let +self = stdenv.mkDerivation { + pname = "nix"; + + version = "${version}${suffix}"; + VERSION_SUFFIX = suffix; + + inherit src patches; + + outputs = + [ "out" "dev" ] + ++ lib.optionals enableDocumentation [ "man" "doc" ]; + + hardeningEnable = lib.optionals (!stdenv.isDarwin) [ "pie" ]; + + hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "fortify"; + + nativeBuildInputs = [ + pkg-config + autoconf-archive + autoreconfHook + bison + flex + jq + ] ++ lib.optionals (enableDocumentation && !atLeast24) [ + libxslt + libxml2 + docbook_xsl_ns + docbook5 + ] ++ lib.optionals (enableDocumentation && atLeast24) [ + (lib.getBin lowdown) + mdbook + ] ++ lib.optionals (atLeast213 && enableDocumentation) [ + mdbook-linkcheck + ] ++ lib.optionals stdenv.isLinux [ + util-linuxMinimal + ]; + + buildInputs = [ + boost + brotli + bzip2 + curl + editline + libsodium + openssl + sqlite + xz + gtest + libarchive + lowdown + ] ++ lib.optionals atLeast220 [ + libgit2 + ] ++ lib.optionals stdenv.isDarwin [ + Security + ] ++ lib.optionals (stdenv.isx86_64) [ + libcpuid + ] ++ lib.optionals atLeast214 [ + rapidcheck + ] ++ lib.optionals withLibseccomp [ + libseccomp + ] ++ lib.optionals withAWS [ + aws-sdk-cpp + ]; + + installCheckInputs = lib.optionals atLeast221 [ + git + ] ++ lib.optionals atLeast219 [ + man + ]; + + propagatedBuildInputs = [ + boehmgc + ] ++ lib.optionals (atLeast27) [ + nlohmann_json + ]; + + postPatch = '' + patchShebangs --build tests + ''; + + preConfigure = + # Copy libboost_context so we don't get all of Boost in our closure. + # https://github.com/NixOS/nixpkgs/issues/45462 + lib.optionalString (!enableStatic) '' + mkdir -p $out/lib + cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib + rm -f $out/lib/*.a + ${lib.optionalString stdenv.isLinux '' + chmod u+w $out/lib/*.so.* + patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.* + ''} + '' + + # On all versions before c9f51e87057652db0013289a95deffba495b35e7, which + # removes config.nix entirely and is not present in 2.3.x, we need to + # patch around an issue where the Nix configure step pulls in the build + # system's bash and other utilities when cross-compiling. + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform && !atLeast24) '' + mkdir tmp/ + substitute corepkgs/config.nix.in tmp/config.nix.in \ + --subst-var-by bash ${bash}/bin/bash \ + --subst-var-by coreutils ${coreutils}/bin \ + --subst-var-by bzip2 ${bzip2}/bin/bzip2 \ + --subst-var-by gzip ${gzip}/bin/gzip \ + --subst-var-by xz ${xz}/bin/xz \ + --subst-var-by tar ${gnutar}/bin/tar \ + --subst-var-by tr ${coreutils}/bin/tr + mv tmp/config.nix.in corepkgs/config.nix.in + ''; + + configureFlags = [ + "--with-store-dir=${storeDir}" + "--localstatedir=${stateDir}" + "--sysconfdir=${confDir}" + "--enable-gc" + ] ++ lib.optionals (!enableDocumentation) [ + "--disable-doc-gen" + ] ++ lib.optionals stdenv.isLinux [ + "--with-sandbox-shell=${busybox-sandbox-shell}/bin/busybox" + ] ++ lib.optionals (atLeast210 && stdenv.isLinux && stdenv.hostPlatform.isStatic) [ + "--enable-embedded-sandbox-shell" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform ? nix && stdenv.hostPlatform.nix ? system) [ + "--with-system=${stdenv.hostPlatform.nix.system}" + ] ++ lib.optionals (!withLibseccomp) [ + # RISC-V support in progress https://github.com/seccomp/libseccomp/pull/50 + "--disable-seccomp-sandboxing" + ] ++ lib.optionals (atLeast210 && stdenv.cc.isGNU && !enableStatic) [ + "--enable-lto" + ]; + + makeFlags = [ + # gcc runs multi-threaded LTO using make and does not yet detect the new fifo:/path style + # of make jobserver. until gcc adds support for this we have to instruct make to use this + # old style or LTO builds will run their linking on only one thread, which takes forever. + "--jobserver-style=pipe" + "profiledir=$(out)/etc/profile.d" + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "PRECOMPILE_HEADERS=0" + ++ lib.optional (stdenv.hostPlatform.isDarwin) "PRECOMPILE_HEADERS=1"; + + installFlags = [ "sysconfdir=$(out)/etc" ]; + + doInstallCheck = true; + installCheckTarget = if atLeast210 then "installcheck" else null; + + # socket path becomes too long otherwise + preInstallCheck = lib.optionalString stdenv.isDarwin '' + export TMPDIR=$NIX_BUILD_TOP + '' + # Prevent crashes in libcurl due to invoking Objective-C `+initialize` methods after `fork`. + # See http://sealiesoftware.com/blog/archive/2017/6/5/Objective-C_and_fork_in_macOS_1013.html. + + lib.optionalString stdenv.isDarwin '' + export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + '' + # See https://github.com/NixOS/nix/issues/5687 + + lib.optionalString (atLeast25 && stdenv.isDarwin) '' + echo "exit 99" > tests/gc-non-blocking.sh + ''; + + separateDebugInfo = stdenv.isLinux && (atLeast24 -> !enableStatic); + + enableParallelBuilding = true; + + passthru = { + inherit aws-sdk-cpp boehmgc; + + perl-bindings = perl.pkgs.toPerlModule (callPackage ./nix-perl.nix { nix = self; inherit Security; }); + + tests = { + nixi686 = pkgsi686Linux.nixVersions.${"nix_${lib.versions.major version}_${lib.versions.minor version}"}; + }; + }; + + # point 'nix edit' and ofborg at the file that defines the attribute, + # not this common file. + pos = builtins.unsafeGetAttrPos "version" args; + meta = with lib; { + description = "Powerful package manager that makes package management reliable and reproducible"; + longDescription = '' + Nix is a powerful package manager for Linux and other Unix systems that + makes package management reliable and reproducible. It provides atomic + upgrades and rollbacks, side-by-side installation of multiple versions of + a package, multi-user package management and easy setup of build + environments. + ''; + homepage = "https://nixos.org/"; + license = licenses.lgpl21Plus; + inherit maintainers; + platforms = platforms.unix; + outputsToInstall = [ "out" ] ++ optional enableDocumentation "man"; + mainProgram = "nix"; + knownVulnerabilities = lib.optional (!builtins.elem (lib.versions.majorMinor version) unaffectedByFodSandboxEscape && !atLeast221) "CVE-2024-27297"; + }; +}; +in self diff --git a/pkgs/by-name/ni/nix/default.nix b/pkgs/by-name/ni/nix/default.nix new file mode 100644 index 0000000..4c8f26e --- /dev/null +++ b/pkgs/by-name/ni/nix/default.nix @@ -0,0 +1,217 @@ +{ lib +, config +, aws-sdk-cpp +, boehmgc +, callPackage +, fetchFromGitHub +, fetchpatch +, fetchpatch2 +, runCommand +, Security + +, storeDir ? "/nix/store" +, stateDir ? "/nix/var" +, confDir ? "/etc" + +, path +}: +let + boehmgc-nix_2_3 = boehmgc.override { enableLargeConfig = true; }; + + boehmgc-nix = boehmgc-nix_2_3.overrideAttrs (drv: { + patches = (drv.patches or [ ]) ++ [ + # Part of the GC solution in https://github.com/NixOS/nix/pull/4944 + ./patches/boehmgc-coroutine-sp-fallback.patch + ]; + }); + + # old nix fails to build with newer aws-sdk-cpp and the patch doesn't apply + aws-sdk-cpp-old-nix = (aws-sdk-cpp.override { + apis = [ "s3" "transfer" ]; + customMemoryManagement = false; + }).overrideAttrs (args: rec { + # intentionally overriding postPatch + version = "1.9.294"; + + src = fetchFromGitHub { + owner = "aws"; + repo = "aws-sdk-cpp"; + rev = version; + hash = "sha256-Z1eRKW+8nVD53GkNyYlZjCcT74MqFqqRMeMc33eIQ9g="; + }; + postPatch = '' + # Avoid blanket -Werror to evade build failures on less + # tested compilers. + substituteInPlace cmake/compiler_settings.cmake \ + --replace '"-Werror"' ' ' + + # Missing includes for GCC11 + sed '5i#include ' -i \ + aws-cpp-sdk-cloudfront-integration-tests/CloudfrontOperationTest.cpp \ + aws-cpp-sdk-cognitoidentity-integration-tests/IdentityPoolOperationTest.cpp \ + aws-cpp-sdk-dynamodb-integration-tests/TableOperationTest.cpp \ + aws-cpp-sdk-elasticfilesystem-integration-tests/ElasticFileSystemTest.cpp \ + aws-cpp-sdk-lambda-integration-tests/FunctionTest.cpp \ + aws-cpp-sdk-mediastore-data-integration-tests/MediaStoreDataTest.cpp \ + aws-cpp-sdk-queues/source/sqs/SQSQueue.cpp \ + aws-cpp-sdk-redshift-integration-tests/RedshiftClientTest.cpp \ + aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp \ + aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp \ + aws-cpp-sdk-s3control-integration-tests/S3ControlTest.cpp \ + aws-cpp-sdk-sqs-integration-tests/QueueOperationTest.cpp \ + aws-cpp-sdk-transfer-tests/TransferTests.cpp + # Flaky on Hydra + rm aws-cpp-sdk-core-tests/aws/auth/AWSCredentialsProviderTest.cpp + # Includes aws-c-auth private headers, so only works with submodule build + rm aws-cpp-sdk-core-tests/aws/auth/AWSAuthSignerTest.cpp + # TestRandomURLMultiThreaded fails + rm aws-cpp-sdk-core-tests/http/HttpClientTest.cpp + '' + lib.optionalString aws-sdk-cpp.stdenv.isi686 '' + # EPSILON is exceeded + rm aws-cpp-sdk-core-tests/aws/client/AdaptiveRetryStrategyTest.cpp + ''; + + patches = (args.patches or [ ]) ++ [ ./patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch ]; + + # only a stripped down version is build which takes a lot less resources to build + requiredSystemFeatures = [ ]; + }); + + aws-sdk-cpp-nix = (aws-sdk-cpp.override { + apis = [ "s3" "transfer" ]; + customMemoryManagement = false; + }).overrideAttrs { + # only a stripped down version is build which takes a lot less resources to build + requiredSystemFeatures = [ ]; + }; + + + common = args: + callPackage + (import ./common.nix ({ inherit lib fetchFromGitHub; } // args)) + { + inherit Security storeDir stateDir confDir; + boehmgc = boehmgc-nix; + aws-sdk-cpp = if lib.versionAtLeast args.version "2.12pre" then aws-sdk-cpp-nix else aws-sdk-cpp-old-nix; + }; + + # https://github.com/NixOS/nix/pull/7585 + patch-monitorfdhup = fetchpatch2 { + name = "nix-7585-monitor-fd-hup.patch"; + url = "https://github.com/NixOS/nix/commit/1df3d62c769dc68c279e89f68fdd3723ed3bcb5a.patch"; + hash = "sha256-f+F0fUO+bqyPXjt+IXJtISVr589hdc3y+Cdrxznb+Nk="; + }; + + # Intentionally does not support overrideAttrs etc + # Use only for tests that are about the package relation to `pkgs` and/or NixOS. + addTestsShallowly = tests: pkg: pkg // { + tests = pkg.tests // tests; + # In case someone reads the wrong attribute + passthru.tests = pkg.tests // tests; + }; + + addFallbackPathsCheck = pkg: addTestsShallowly + { nix-fallback-paths = + runCommand "test-nix-fallback-paths-version-equals-nix-stable" { + paths = lib.concatStringsSep "\n" (builtins.attrValues (import ./nix-fallback-paths.nix)); + } '' + if [[ "" != $(grep -v 'nix-${pkg.version}$' <<< "$paths") ]]; then + echo "nix-fallback-paths not up to date with nixVersions.stable (nix-${pkg.version})" + echo "The following paths are not up to date:" + grep -v 'nix-${pkg.version}$' <<< "$paths" + echo + echo "Fix it by running in nixpkgs:" + echo + echo "curl https://releases.nixos.org/nix/nix-${pkg.version}/fallback-paths.nix >nixos/modules/installer/tools/nix-fallback-paths.nix" + echo + exit 1 + else + echo "nix-fallback-paths versions up to date" + touch $out + fi + ''; + } + pkg; + +in lib.makeExtensible (self: ({ + nix_2_3 = ((common { + version = "2.3.18"; + hash = "sha256-jBz2Ub65eFYG+aWgSI3AJYvLSghio77fWQiIW1svA9U="; + patches = [ + patch-monitorfdhup + ]; + maintainers = with lib.maintainers; [ flokli raitobezarius ]; + }).override { boehmgc = boehmgc-nix_2_3; }).overrideAttrs { + # https://github.com/NixOS/nix/issues/10222 + # spurious test/add.sh failures + enableParallelChecking = false; + }; + + nix_2_18 = common { + version = "2.18.2"; + hash = "sha256-8gNJlBlv2bnffRg0CejiBXc6U/S6YeCLAdHrYvTPyoY="; + }; + + nix_2_19 = common { + version = "2.19.4"; + hash = "sha256-qXjyVmDm1SFWk1az3GWIsJ0fVG0nWet2FdldFOnUydI="; + }; + + nix_2_20 = common { + version = "2.20.6"; + hash = "sha256-BSl8Jijq1A4n1ToQy0t0jDJCXhJK+w1prL8QMHS5t54="; + }; + + nix_2_21 = common { + version = "2.21.2"; + hash = "sha256-ObaVDDPtnOeIE0t7m4OVk5G+OS6d9qYh+ktK67Fe/zE="; + }; + + nix_2_22 = common { + version = "2.22.0"; + hash = "sha256-Ugcc+lSq8nJP+mddMlGFnoG4Ix1lRFHWOal3299bqR8="; + }; + + git = common rec { + version = "2.23.0"; + suffix = "pre20240502_${lib.substring 0 8 src.rev}"; + src = fetchFromGitHub { + owner = "NixOS"; + repo = "nix"; + rev = "00ca2b05b8fbbef09be5d1e4820857605d4c31b6"; + hash = "sha256-trTxWfGElp0rkjquqG5I5RYVoxo8foCflxJFUtHwnOQ="; + }; + }; + + latest = self.nix_2_22; + + # The minimum Nix version supported by Nixpkgs + # Note that some functionality *might* have been backported into this Nix version, + # making this package an inaccurate representation of what features are available + # in the actual lowest minver.nix *patch* version. + minimum = + let + minver = import (path + "/lib/minver.nix"); + major = lib.versions.major minver; + minor = lib.versions.minor minver; + attribute = "nix_${major}_${minor}"; + nix = self.${attribute}; + in + if ! self ? ${attribute} then + throw "The minimum supported Nix version is ${minver} (declared in lib/minver.nix), but pkgs.nixVersions.${attribute} does not exist." + else + nix; + + stable = addFallbackPathsCheck self.nix_2_18; +} // lib.optionalAttrs config.allowAliases ( + lib.listToAttrs (map ( + minor: + let + attr = "nix_2_${toString minor}"; + in + lib.nameValuePair attr (throw "${attr} has been removed") + ) (lib.range 4 17)) + // { + unstable = throw "nixVersions.unstable has been removed. For bleeding edge (Nix master, roughly weekly updated) use nixVersions.git, otherwise use nixVersions.latest."; + } +))) diff --git a/pkgs/by-name/ni/nix/nix-fallback-paths.nix b/pkgs/by-name/ni/nix/nix-fallback-paths.nix new file mode 100644 index 0000000..e4241e9 --- /dev/null +++ b/pkgs/by-name/ni/nix/nix-fallback-paths.nix @@ -0,0 +1,7 @@ +{ + x86_64-linux = "/nix/store/azvn85cras6xv4z5j85fiy406f24r1q0-nix-2.18.1"; + i686-linux = "/nix/store/9bnwy7f9h0kzdzmcnjjsjg0aak5waj40-nix-2.18.1"; + aarch64-linux = "/nix/store/hh65xwqm9s040s3cgn9vzcmrxj0sf5ij-nix-2.18.1"; + x86_64-darwin = "/nix/store/6zi5fqzn9n17wrk8r41rhdw4j7jqqsi3-nix-2.18.1"; + aarch64-darwin = "/nix/store/0pbq6wzr2f1jgpn5212knyxpwmkjgjah-nix-2.18.1"; +} diff --git a/pkgs/by-name/ni/nix/nix-perl.nix b/pkgs/by-name/ni/nix/nix-perl.nix new file mode 100644 index 0000000..8fc2657 --- /dev/null +++ b/pkgs/by-name/ni/nix/nix-perl.nix @@ -0,0 +1,83 @@ +{ stdenv +, lib +, perl +, pkg-config +, curl +, nix +, libsodium +, boost +, autoreconfHook +, autoconf-archive +, nlohmann_json +, xz +, Security +, meson +, ninja +, bzip2 +}: + +let + atLeast223 = lib.versionAtLeast nix.version "2.23"; + + mkConfigureOption = { mesonOption, autoconfOption, value }: + let + setFlagTo = if atLeast223 + then lib.mesonOption mesonOption + else lib.withFeatureAs true autoconfOption; + in + setFlagTo value; +in stdenv.mkDerivation (finalAttrs: { + pname = "nix-perl"; + inherit (nix) version src; + + postUnpack = "sourceRoot=$sourceRoot/perl"; + + buildInputs = [ + boost + bzip2 + curl + libsodium + nix + perl + xz + ] ++ lib.optional (stdenv.isDarwin) Security; + + # Not cross-safe since Nix checks for curl/perl via + # NEED_PROG/find_program, but both seem to be needed at runtime + # as well. + nativeBuildInputs = [ + pkg-config + perl + curl + ] ++ (if atLeast223 then [ + meson + ninja + ] else [ + autoconf-archive + autoreconfHook + ]); + + # `perlPackages.Test2Harness` is marked broken for Darwin + doCheck = !stdenv.isDarwin; + + nativeCheckInputs = [ + perl.pkgs.Test2Harness + ]; + + ${if atLeast223 then "mesonFlags" else "configureFlags"} = [ + (mkConfigureOption { + mesonOption = "dbi_path"; + autoconfOption = "dbi"; + value = "${perl.pkgs.DBI}/${perl.libPrefix}"; + }) + (mkConfigureOption { + mesonOption = "dbd_sqlite_path"; + autoconfOption = "dbd-sqlite"; + value = "${perl.pkgs.DBDSQLite}/${perl.libPrefix}"; + }) + ] ++ lib.optionals atLeast223 [ + (lib.mesonEnable "tests" finalAttrs.doCheck) + ]; + + preConfigure = "export NIX_STATE_DIR=$TMPDIR"; +}) diff --git a/pkgs/by-name/ni/nix/packages.nix b/pkgs/by-name/ni/nix/packages.nix new file mode 100644 index 0000000..7d9e468 --- /dev/null +++ b/pkgs/by-name/ni/nix/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + nixVersions = recurseIntoAttrs (callPackage ./. { + storeDir = config.nix.storeDir or "/nix/store"; + stateDir = config.nix.stateDir or "/nix/var"; + inherit (darwin.apple_sdk.frameworks) Security; + }); + + nix = nixVersions.stable; + + nixStatic = pkgsStatic.nix; +} diff --git a/pkgs/by-name/ni/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch b/pkgs/by-name/ni/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch new file mode 100644 index 0000000..59cc305 --- /dev/null +++ b/pkgs/by-name/ni/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch @@ -0,0 +1,127 @@ +From 7d58e303159b2fb343af9a1ec4512238efa147c7 Mon Sep 17 00:00:00 2001 +From: Eelco Dolstra +Date: Mon, 6 Aug 2018 17:15:04 +0200 +Subject: [PATCH] TransferManager: Allow setting a content-encoding for S3 uploads + +--- a/aws-cpp-sdk-transfer/include/aws/transfer/TransferHandle.h ++++ b/aws-cpp-sdk-transfer/include/aws/transfer/TransferHandle.h +@@ -297,6 +297,14 @@ namespace Aws + * Content type of the object being transferred + */ + inline void SetContentType(const Aws::String& value) { std::lock_guard locker(m_getterSetterLock); m_contentType = value; } ++ /** ++ * Content encoding of the object being transferred ++ */ ++ inline const Aws::String GetContentEncoding() const { std::lock_guard locker(m_getterSetterLock); return m_contentEncoding; } ++ /** ++ * Content type of the object being transferred ++ */ ++ inline void SetContentEncoding(const Aws::String& value) { std::lock_guard locker(m_getterSetterLock); m_contentEncoding = value; } + /** + * In case of an upload, this is the metadata that was placed on the object when it was uploaded. + * In the case of a download, this is the object metadata from the GetObject operation. +@@ -383,6 +391,7 @@ namespace Aws + Aws::String m_key; + Aws::String m_fileName; + Aws::String m_contentType; ++ Aws::String m_contentEncoding; + Aws::String m_versionId; + Aws::Map m_metadata; + TransferStatus m_status; +--- a/aws-cpp-sdk-transfer/include/aws/transfer/TransferManager.h ++++ b/aws-cpp-sdk-transfer/include/aws/transfer/TransferManager.h +@@ -154,7 +154,8 @@ namespace Aws + const Aws::String& keyName, + const Aws::String& contentType, + const Aws::Map& metadata, +- const std::shared_ptr& context = nullptr); ++ const std::shared_ptr& context = nullptr, ++ const Aws::String& contentEncoding = ""); + + /** + * Downloads the contents of bucketName/keyName in S3 to the file specified by writeToFile. This will perform a GetObject operation. +@@ -246,7 +247,8 @@ namespace Aws + const Aws::Map& metadata, + const std::shared_ptr& context, +- const Aws::String& fileName = ""); ++ const Aws::String& fileName = "", ++ const Aws::String& contentEncoding = ""); + + /** + * Submits the actual task to task schecduler +@@ -262,7 +264,8 @@ namespace Aws + const Aws::String& keyName, + const Aws::String& contentType, + const Aws::Map& metadata, +- const std::shared_ptr& context); ++ const std::shared_ptr& context, ++ const Aws::String& contentEncoding); + + /** + * Uploads the contents of file, to bucketName/keyName in S3. contentType and metadata will be added to the object. If the object is larger than the configured bufferSize, +--- a/aws-cpp-sdk-transfer/source/transfer/TransferManager.cpp ++++ b/aws-cpp-sdk-transfer/source/transfer/TransferManager.cpp +@@ -87,9 +87,10 @@ namespace Aws + const Aws::String& bucketName, + const Aws::String& keyName, const Aws::String& contentType, + const Aws::Map& metadata, +- const std::shared_ptr& context) ++ const std::shared_ptr& context, ++ const Aws::String& contentEncoding) + { +- return this->DoUploadFile(fileStream, bucketName, keyName, contentType, metadata, context); ++ return this->DoUploadFile(fileStream, bucketName, keyName, contentType, metadata, context, contentEncoding); + } + + std::shared_ptr TransferManager::DownloadFile(const Aws::String& bucketName, +@@ -286,6 +287,9 @@ namespace Aws + createMultipartRequest.WithKey(handle->GetKey()); + createMultipartRequest.WithMetadata(handle->GetMetadata()); + ++ if (handle->GetContentEncoding() != "") ++ createMultipartRequest.WithContentEncoding(handle->GetContentEncoding()); ++ + auto createMultipartResponse = m_transferConfig.s3Client->CreateMultipartUpload(createMultipartRequest); + if (createMultipartResponse.IsSuccess()) + { +@@ -441,6 +445,9 @@ namespace Aws + + putObjectRequest.SetContentType(handle->GetContentType()); + ++ if (handle->GetContentEncoding() != "") ++ putObjectRequest.SetContentEncoding(handle->GetContentEncoding()); ++ + auto buffer = m_bufferManager.Acquire(); + + auto lengthToWrite = (std::min)(m_transferConfig.bufferSize, handle->GetBytesTotalSize()); +@@ -1140,12 +1147,15 @@ namespace Aws + const Aws::String& contentType, + const Aws::Map& metadata, + const std::shared_ptr& context, +- const Aws::String& fileName) ++ const Aws::String& fileName, ++ const Aws::String& contentEncoding) + { + auto handle = Aws::MakeShared(CLASS_TAG, bucketName, keyName, 0, fileName); + handle->SetContentType(contentType); + handle->SetMetadata(metadata); + handle->SetContext(context); ++ if (contentEncoding != "") ++ handle->SetContentEncoding(contentEncoding); + + if (!fileStream->good()) + { +@@ -1213,9 +1223,10 @@ namespace Aws + const Aws::String& keyName, + const Aws::String& contentType, + const Aws::Map& metadata, +- const std::shared_ptr& context) ++ const std::shared_ptr& context, ++ const Aws::String& contentEncoding) + { +- auto handle = CreateUploadFileHandle(fileStream.get(), bucketName, keyName, contentType, metadata, context); ++ auto handle = CreateUploadFileHandle(fileStream.get(), bucketName, keyName, contentType, metadata, context, "", contentEncoding); + return SubmitUpload(handle, fileStream); + } + diff --git a/pkgs/by-name/ni/nix/patches/boehmgc-coroutine-sp-fallback.patch b/pkgs/by-name/ni/nix/patches/boehmgc-coroutine-sp-fallback.patch new file mode 100644 index 0000000..578bd32 --- /dev/null +++ b/pkgs/by-name/ni/nix/patches/boehmgc-coroutine-sp-fallback.patch @@ -0,0 +1,45 @@ +diff --git a/pthread_stop_world.c b/pthread_stop_world.c +index 2b45489..0e6d8ef 100644 +--- a/pthread_stop_world.c ++++ b/pthread_stop_world.c +@@ -776,6 +776,8 @@ STATIC void GC_restart_handler(int sig) + /* world is stopped. Should not fail if it isn't. */ + GC_INNER void GC_push_all_stacks(void) + { ++ size_t stack_limit; ++ pthread_attr_t pattr; + GC_bool found_me = FALSE; + size_t nthreads = 0; + int i; +@@ -868,6 +870,31 @@ GC_INNER void GC_push_all_stacks(void) + hi = p->altstack + p->altstack_size; + # endif + /* FIXME: Need to scan the normal stack too, but how ? */ ++ } else { ++ if (pthread_getattr_np(p->id, &pattr)) { ++ ABORT("GC_push_all_stacks: pthread_getattr_np failed!"); ++ } ++ if (pthread_attr_getstacksize(&pattr, &stack_limit)) { ++ ABORT("GC_push_all_stacks: pthread_attr_getstacksize failed!"); ++ } ++ if (pthread_attr_destroy(&pattr)) { ++ ABORT("GC_push_all_stacks: pthread_attr_destroy failed!"); ++ } ++ // When a thread goes into a coroutine, we lose its original sp until ++ // control flow returns to the thread. ++ // While in the coroutine, the sp points outside the thread stack, ++ // so we can detect this and push the entire thread stack instead, ++ // as an approximation. ++ // We assume that the coroutine has similarly added its entire stack. ++ // This could be made accurate by cooperating with the application ++ // via new functions and/or callbacks. ++ #ifndef STACK_GROWS_UP ++ if (lo >= hi || lo < hi - stack_limit) { // sp outside stack ++ lo = hi - stack_limit; ++ } ++ #else ++ #error "STACK_GROWS_UP not supported in boost_coroutine2 (as of june 2021), so we don't support it in Nix." ++ #endif + } + # ifdef STACKPTR_CORRECTOR_AVAILABLE + if (GC_sp_corrector != 0) diff --git a/pkgs/by-name/ni/nix/patches/flaky-tests.patch b/pkgs/by-name/ni/nix/patches/flaky-tests.patch new file mode 100644 index 0000000..3684b09 --- /dev/null +++ b/pkgs/by-name/ni/nix/patches/flaky-tests.patch @@ -0,0 +1,12 @@ +diff --git a/mk/run_test.sh b/mk/run_test.sh +index 7e95df2ac..58420c317 100755 +--- a/mk/run_test.sh ++++ b/mk/run_test.sh +@@ -27,7 +27,6 @@ run_test "$1" + # appear randomly without anyone knowing why. + # See https://github.com/NixOS/nix/issues/3605 for more info + if [[ $status -ne 0 && $status -ne 99 && \ +- "$(uname)" == "Darwin" && \ + "$log" =~ "unexpected EOF reading a line" \ + ]]; then + echo "$post_run_msg [${yellow}FAIL$normal] (possibly flaky, so will be retried)" diff --git a/pkgs/by-name/nl/nlohmann_json/default.nix b/pkgs/by-name/nl/nlohmann_json/default.nix new file mode 100644 index 0000000..339db2b --- /dev/null +++ b/pkgs/by-name/nl/nlohmann_json/default.nix @@ -0,0 +1,48 @@ +{ stdenv +, lib +, fetchFromGitHub +, cmake +}: +let + testData = fetchFromGitHub { + owner = "nlohmann"; + repo = "json_test_data"; + rev = "v3.1.0"; + hash = "sha256-bG34W63ew7haLnC82A3lS7bviPDnApLipaBjJAjLcVk="; + }; +in stdenv.mkDerivation (finalAttrs: { + pname = "nlohmann_json"; + version = "3.11.3"; + + src = fetchFromGitHub { + owner = "nlohmann"; + repo = "json"; + rev = "v${finalAttrs.version}"; + hash = "sha256-7F0Jon+1oWL7uqet5i1IgHX0fUw/+z0QwEcA3zs5xHg="; + }; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ + "-DJSON_BuildTests=${if finalAttrs.finalPackage.doCheck then "ON" else "OFF"}" + "-DJSON_FastTests=ON" + "-DJSON_MultipleHeaders=ON" + ] ++ lib.optional finalAttrs.finalPackage.doCheck "-DJSON_TestDataDirectory=${testData}"; + + doCheck = stdenv.hostPlatform == stdenv.buildPlatform; + + # skip tests that require git or modify “installed files” + preCheck = '' + checkFlagsArray+=("ARGS=-LE 'not_reproducible|git_required'") + ''; + + postInstall = "rm -rf $out/lib64"; + + meta = with lib; { + description = "JSON for Modern C++"; + homepage = "https://json.nlohmann.me"; + changelog = "https://github.com/nlohmann/json/blob/develop/ChangeLog.md"; + license = licenses.mit; + platforms = platforms.all; + }; +}) diff --git a/pkgs/by-name/on/oniguruma/default.nix b/pkgs/by-name/on/oniguruma/default.nix new file mode 100644 index 0000000..cf00629 --- /dev/null +++ b/pkgs/by-name/on/oniguruma/default.nix @@ -0,0 +1,27 @@ +{ lib, stdenv, fetchurl, autoreconfHook }: + +stdenv.mkDerivation rec { + pname = "oniguruma"; + version = "6.9.9"; + + # Note: do not use fetchpatch or fetchFromGitHub to keep this package available in __bootPackages + src = fetchurl { + url = "https://github.com/kkos/oniguruma/releases/download/v${version}/onig-${version}.tar.gz"; + sha256 = "sha256-YBYr07n8b0iG1MegeSX/03QWdzL1Xc6MSRv9nNgYps8="; + }; + + outputs = [ "dev" "lib" "out" ]; + outputBin = "dev"; # onig-config + + nativeBuildInputs = [ autoreconfHook ]; + configureFlags = [ "--enable-posix-api=yes" ]; + + meta = with lib; { + homepage = "https://github.com/kkos/oniguruma"; + description = "Regular expressions library"; + mainProgram = "onig-config"; + license = licenses.bsd2; + maintainers = with maintainers; [ artturin ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/op/openexr/3.nix b/pkgs/by-name/op/openexr/3.nix new file mode 100644 index 0000000..074fdf4 --- /dev/null +++ b/pkgs/by-name/op/openexr/3.nix @@ -0,0 +1,60 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, imath +, libdeflate +, pkg-config +, pkgsCross +}: + +stdenv.mkDerivation rec { + pname = "openexr"; + version = "3.2.4"; + + src = fetchFromGitHub { + owner = "AcademySoftwareFoundation"; + repo = "openexr"; + rev = "v${version}"; + hash = "sha256-mVUxxYe6teiJ18PQ9703/kjBpJ9+a7vcDme+NwtQQQM="; + }; + + outputs = [ "bin" "dev" "out" "doc" ]; + + patches = + # Disable broken test on musl libc + # https://github.com/AcademySoftwareFoundation/openexr/issues/1556 + lib.optional stdenv.hostPlatform.isMusl ./disable-iex-test.patch + ; + + # tests are determined to use /var/tmp on unix + postPatch = '' + cat <(find . -name tmpDir.h) <(echo src/test/OpenEXRCoreTest/main.cpp) | while read -r f ; do + substituteInPlace $f --replace '/var/tmp' "$TMPDIR" + done + ''; + + cmakeFlags = lib.optional stdenv.hostPlatform.isStatic "-DCMAKE_SKIP_RPATH=ON"; + + nativeBuildInputs = [ cmake pkg-config ]; + propagatedBuildInputs = [ imath libdeflate ]; + + # Without 'sse' enforcement tests fail on i686 as due to excessive precision as: + # error reading back channel B pixel 21,-76 got -nan expected -nan + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isi686 "-msse2 -mfpmath=sse"; + + # https://github.com/AcademySoftwareFoundation/openexr/issues/1400 + doCheck = !stdenv.isAarch32; + + passthru.tests = { + musl = pkgsCross.musl64.openexr_3; + }; + + meta = with lib; { + description = "A high dynamic-range (HDR) image file format"; + homepage = "https://www.openexr.com"; + license = licenses.bsd3; + maintainers = with maintainers; [ paperdigits ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/op/openexr/default.nix b/pkgs/by-name/op/openexr/default.nix new file mode 100644 index 0000000..6d45ca3 --- /dev/null +++ b/pkgs/by-name/op/openexr/default.nix @@ -0,0 +1,69 @@ +{ lib +, stdenv +, fetchFromGitHub +, zlib +, ilmbase +, fetchpatch +, cmake +}: + +stdenv.mkDerivation rec { + pname = "openexr"; + version = "2.5.10"; + + outputs = [ "bin" "dev" "out" "doc" ]; + + src = fetchFromGitHub { + owner = "AcademySoftwareFoundation"; + repo = "openexr"; + rev = "v${version}"; + hash = "sha256-xdC+T79ZQBx/XhuIXtP93Roj0N9lF+E65ReEKQ4kIsg="; + }; + + patches = [ + (fetchpatch { + name = "CVE-2021-45942.patch"; + url = "https://github.com/AcademySoftwareFoundation/openexr/commit/11cad77da87c4fa2aab7d58dd5339e254db7937e.patch"; + stripLen = 4; + extraPrefix = "OpenEXR/IlmImf/"; + sha256 = "1wa2jn6sa0n3phaqvklnlbgk1bz60y756ad4jk4d757pzpnannsy"; + }) + (fetchpatch { + name = "CVE-2021-3933.patch"; + url = "https://github.com/AcademySoftwareFoundation/openexr/commit/5db6f7aee79e3e75e8c3780b18b28699614dd08e.patch"; + stripLen = 4; + extraPrefix = "OpenEXR/IlmImf/"; + sha256 = "sha256-DrpldpNgN5pWKzIuuPIrynGX3EpP8YhJlu+lLfNFGxQ="; + }) + + # GCC 13 fixes + ./gcc-13.patch + ]; + + postPatch = '' + # tests are determined to use /var/tmp on unix + find . -name tmpDir.h | while read -r f ; do + substituteInPlace $f --replace '/var/tmp' "$TMPDIR" + done + # On slower machines this test can take more than the default 1500 seconds + echo 'set_tests_properties(OpenEXR.IlmImf PROPERTIES TIMEOUT 3000)' >> OpenEXR/IlmImfTest/CMakeLists.txt + ''; + + cmakeFlags = [ + "-DCMAKE_CTEST_ARGUMENTS=--timeout;3600" + ] ++ lib.optional stdenv.hostPlatform.isStatic "-DCMAKE_SKIP_RPATH=ON"; + + nativeBuildInputs = [ cmake ]; + propagatedBuildInputs = [ ilmbase zlib ]; + + # https://github.com/AcademySoftwareFoundation/openexr/issues/1400 + # https://github.com/AcademySoftwareFoundation/openexr/issues/1281 + doCheck = !stdenv.isAarch32 && !stdenv.isi686; + + meta = with lib; { + description = "A high dynamic-range (HDR) image file format"; + homepage = "https://www.openexr.com/"; + license = licenses.bsd3; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/op/openexr/disable-iex-test.patch b/pkgs/by-name/op/openexr/disable-iex-test.patch new file mode 100644 index 0000000..f1ceb13 --- /dev/null +++ b/pkgs/by-name/op/openexr/disable-iex-test.patch @@ -0,0 +1,13 @@ +diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt +index 25f429da..918f56e9 100644 +--- a/src/test/CMakeLists.txt ++++ b/src/test/CMakeLists.txt +@@ -5,7 +5,7 @@ + # combined python 2 + 3 support + + if (OPENEXR_TEST_LIBRARIES) +- add_subdirectory(IexTest) ++ #add_subdirectory(IexTest) + add_subdirectory(OpenEXRCoreTest) + add_subdirectory(OpenEXRTest) + add_subdirectory(OpenEXRUtilTest) diff --git a/pkgs/by-name/op/openexr/gcc-13.patch b/pkgs/by-name/op/openexr/gcc-13.patch new file mode 100644 index 0000000..6264a8d --- /dev/null +++ b/pkgs/by-name/op/openexr/gcc-13.patch @@ -0,0 +1,25 @@ +From 8aa103fe6e815514990e59708468eabc36f7f332 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=A9clairevoyant?= + <848000+eclairevoyant@users.noreply.github.com> +Date: Fri, 5 Jan 2024 18:12:16 -0500 +Subject: [PATCH] gcc13 + +--- + OpenEXR/IlmImf/ImfTiledMisc.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/OpenEXR/IlmImf/ImfTiledMisc.cpp b/OpenEXR/IlmImf/ImfTiledMisc.cpp +index 06ea3144..749537d4 100644 +--- a/OpenEXR/IlmImf/ImfTiledMisc.cpp ++++ b/OpenEXR/IlmImf/ImfTiledMisc.cpp +@@ -46,6 +46,7 @@ + #include + #include + #include ++#include + + #include "ImfNamespace.h" + +-- +2.42.0 + diff --git a/pkgs/by-name/op/openexr/packages.nix b/pkgs/by-name/op/openexr/packages.nix new file mode 100644 index 0000000..7ea0169 --- /dev/null +++ b/pkgs/by-name/op/openexr/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + openexr = openexr_2; + openexr_2 = callPackage ./. { }; + openexr_3 = callPackage ./3.nix { }; +} diff --git a/pkgs/by-name/op/openjpeg/default.nix b/pkgs/by-name/op/openjpeg/default.nix new file mode 100644 index 0000000..12b05df --- /dev/null +++ b/pkgs/by-name/op/openjpeg/default.nix @@ -0,0 +1,67 @@ +{ lib, stdenv, fetchFromGitHub, cmake, pkg-config +, libdeflate, libpng, libtiff, zlib, lcms2, jpylyzer +, jpipLibSupport ? false # JPIP library & executables +, jpipServerSupport ? false, curl, fcgi # JPIP Server +, jdk +, poppler +}: + +let + mkFlag = optSet: flag: "-D${flag}=${if optSet then "ON" else "OFF"}"; +in + +stdenv.mkDerivation rec { + pname = "openjpeg"; + version = "2.5.2"; + + src = fetchFromGitHub { + owner = "uclouvain"; + repo = "openjpeg"; + rev = "v${version}"; + hash = "sha256-mQ9B3MJY2/bg0yY/7jUJrAXM6ozAHT5fmwES5Q1SGxw="; + }; + + outputs = [ "out" "dev" ]; + + cmakeFlags = [ + "-DCMAKE_INSTALL_NAME_DIR=\${CMAKE_INSTALL_PREFIX}/lib" + "-DBUILD_SHARED_LIBS=ON" + "-DBUILD_CODEC=ON" + "-DBUILD_THIRDPARTY=OFF" + (mkFlag jpipLibSupport "BUILD_JPIP") + (mkFlag jpipServerSupport "BUILD_JPIP_SERVER") + "-DBUILD_VIEWER=OFF" + "-DBUILD_JAVA=OFF" + (mkFlag doCheck "BUILD_TESTING") + ]; + + nativeBuildInputs = [ cmake pkg-config ]; + + buildInputs = [ libpng libtiff zlib lcms2 ] + ++ lib.optionals jpipServerSupport [ curl fcgi ] + ++ lib.optional (jpipLibSupport) jdk; + + doCheck = (!stdenv.isAarch64 && !stdenv.hostPlatform.isPower64); # tests fail on aarch64-linux and powerpc64 + nativeCheckInputs = [ jpylyzer ]; + checkPhase = '' + substituteInPlace ../tools/ctest_scripts/travis-ci.cmake \ + --replace "JPYLYZER_EXECUTABLE=" "JPYLYZER_EXECUTABLE=\"$(command -v jpylyzer)\" # " + OPJ_SOURCE_DIR=.. ctest -S ../tools/ctest_scripts/travis-ci.cmake + ''; + + passthru = { + incDir = "openjpeg-${lib.versions.majorMinor version}"; + tests = { + inherit poppler; + }; + }; + + meta = with lib; { + description = "Open-source JPEG 2000 codec written in C language"; + homepage = "https://www.openjpeg.org/"; + license = licenses.bsd2; + maintainers = with maintainers; [ codyopel ]; + platforms = platforms.all; + changelog = "https://github.com/uclouvain/openjpeg/blob/v${version}/CHANGELOG.md"; + }; +} diff --git a/pkgs/by-name/op/openldap/default.nix b/pkgs/by-name/op/openldap/default.nix new file mode 100644 index 0000000..4a00f40 --- /dev/null +++ b/pkgs/by-name/op/openldap/default.nix @@ -0,0 +1,141 @@ +{ lib +, stdenv +, fetchurl + +# dependencies +, cyrus_sasl +, groff +, libsodium +, libtool +, openssl +, systemdMinimal +, libxcrypt + +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation rec { + pname = "openldap"; + version = "2.6.7"; + + src = fetchurl { + url = "https://www.openldap.org/software/download/OpenLDAP/openldap-release/${pname}-${version}.tgz"; + hash = "sha256-zXdfYlyUTteKPaGKA7A7CO6nPIqryXtBuzNumhCVSTA="; + }; + + # TODO: separate "out" and "bin" + outputs = [ + "out" + "dev" + "man" + "devdoc" + ]; + + __darwinAllowLocalNetworking = true; + + enableParallelBuilding = true; + + nativeBuildInputs = [ + groff + ]; + + buildInputs = [ + (cyrus_sasl.override { + inherit openssl; + }) + libsodium + libtool + openssl + ] ++ lib.optionals (stdenv.isLinux) [ + libxcrypt # causes linking issues on *-darwin + systemdMinimal + ]; + + preConfigure = lib.optionalString (lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11") '' + MACOSX_DEPLOYMENT_TARGET=10.16 + ''; + + configureFlags = [ + "--enable-argon2" + "--enable-crypt" + "--enable-modules" + "--enable-overlays" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--with-yielding_select=yes" + "ac_cv_func_memcmp_working=yes" + ] ++ lib.optional stdenv.isFreeBSD "--with-pic"; + + env.NIX_CFLAGS_COMPILE = toString [ "-DLDAPI_SOCK=\"/run/openldap/ldapi\"" ]; + + makeFlags= [ + "CC=${stdenv.cc.targetPrefix}cc" + "STRIP=" # Disable install stripping as it breaks cross-compiling. We strip binaries anyway in fixupPhase. + "STRIP_OPTS=" + "prefix=${placeholder "out"}" + "sysconfdir=/etc" + "systemdsystemunitdir=${placeholder "out"}/lib/systemd/system" + # contrib modules require these + "moduledir=${placeholder "out"}/lib/modules" + "mandir=${placeholder "out"}/share/man" + ]; + + extraContribModules = [ + # https://git.openldap.org/openldap/openldap/-/tree/master/contrib/slapd-modules + "passwd/sha2" + "passwd/pbkdf2" + "passwd/totp" + ]; + + postBuild = '' + for module in $extraContribModules; do + make $makeFlags CC=$CC -C contrib/slapd-modules/$module + done + ''; + + preCheck = '' + substituteInPlace tests/scripts/all \ + --replace "/bin/rm" "rm" + + # skip flaky tests + rm -f tests/scripts/test063-delta-multiprovider + + # https://bugs.openldap.org/show_bug.cgi?id=10009 + # can probably be re-added once https://github.com/cyrusimap/cyrus-sasl/pull/772 + # has made it to a release + rm -f tests/scripts/test076-authid-rewrite + ''; + + doCheck = true; + + # The directory is empty and serve no purpose. + preFixup = '' + rm -r $out/var + ''; + + installFlags = [ + "prefix=${placeholder "out"}" + "sysconfdir=${placeholder "out"}/etc" + "moduledir=${placeholder "out"}/lib/modules" + "INSTALL=install" + ]; + + postInstall = '' + for module in $extraContribModules; do + make $installFlags install -C contrib/slapd-modules/$module + done + chmod +x "$out"/lib/*.{so,dylib} + ''; + + # passthru.tests = { + # inherit (nixosTests) openldap; + # }; + + meta = with lib; { + homepage = "https://www.openldap.org/"; + description = "An open source implementation of the Lightweight Directory Access Protocol"; + license = licenses.openldap; + maintainers = with maintainers; [ hexa ] ++ teams.helsinki-systems.members; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/op/openmpi/default.nix b/pkgs/by-name/op/openmpi/default.nix new file mode 100644 index 0000000..913cccf --- /dev/null +++ b/pkgs/by-name/op/openmpi/default.nix @@ -0,0 +1,136 @@ +{ lib, stdenv, fetchurl, removeReferencesTo, gfortran, perl, libnl +, rdma-core, zlib, numactl, libevent, hwloc, targetPackages, symlinkJoin +, libpsm2, libfabric, pmix, ucx, ucc, makeWrapper +, config +# Enable CUDA support +, cudaSupport ? config.cudaSupport, cudaPackages ? null + +# Enable the Sun Grid Engine bindings +, enableSGE ? false + +# Pass PATH/LD_LIBRARY_PATH to point to current mpirun by default +, enablePrefix ? false + +# Enable libfabric support (necessary for Omnipath networks) on x86_64 linux +, fabricSupport ? stdenv.isLinux && stdenv.isx86_64 + +# Enable Fortran support +, fortranSupport ? true +}: + +stdenv.mkDerivation rec { + pname = "openmpi"; + version = "4.1.6"; + + src = with lib.versions; fetchurl { + url = "https://www.open-mpi.org/software/ompi/v${major version}.${minor version}/downloads/${pname}-${version}.tar.bz2"; + sha256 = "sha256-90CZRIVRbetjtTEa8SLCZRefUyig2FelZ7hdsAsR5BU="; + }; + + postPatch = '' + patchShebangs ./ + + # Ensure build is reproducible + ts=`date -d @$SOURCE_DATE_EPOCH` + sed -i 's/OPAL_CONFIGURE_USER=.*/OPAL_CONFIGURE_USER="nixbld"/' configure + sed -i 's/OPAL_CONFIGURE_HOST=.*/OPAL_CONFIGURE_HOST="localhost"/' configure + sed -i "s/OPAL_CONFIGURE_DATE=.*/OPAL_CONFIGURE_DATE=\"$ts\"/" configure + find -name "Makefile.in" -exec sed -i "s/\`date\`/$ts/" \{} \; + ''; + + outputs = [ "out" "man" "dev" ]; + + buildInputs = [ zlib ] + ++ lib.optionals stdenv.isLinux [ libnl numactl pmix ucx ucc ] + ++ lib.optionals cudaSupport [ cudaPackages.cuda_cudart ] + ++ [ libevent hwloc ] + ++ lib.optional (stdenv.isLinux || stdenv.isFreeBSD) rdma-core + ++ lib.optionals fabricSupport [ libpsm2 libfabric ]; + + nativeBuildInputs = [ perl removeReferencesTo makeWrapper ] + ++ lib.optionals cudaSupport [ cudaPackages.cuda_nvcc ] + ++ lib.optionals fortranSupport [ gfortran ]; + + configureFlags = lib.optional (!cudaSupport) "--disable-mca-dso" + ++ lib.optional (!fortranSupport) "--disable-mpi-fortran" + ++ lib.optionals stdenv.isLinux [ + "--with-libnl=${lib.getDev libnl}" + "--with-pmix=${lib.getDev pmix}" + "--with-pmix-libdir=${pmix}/lib" + "--enable-mpi-cxx" + ] ++ lib.optional enableSGE "--with-sge" + ++ lib.optional enablePrefix "--enable-mpirun-prefix-by-default" + # TODO: add UCX support, which is recommended to use with cuda for the most robust OpenMPI build + # https://github.com/openucx/ucx + # https://www.open-mpi.org/faq/?category=buildcuda + ++ lib.optionals cudaSupport [ "--with-cuda=${cudaPackages.cuda_cudart}" "--enable-dlopen" ] + ++ lib.optionals fabricSupport [ "--with-psm2=${lib.getDev libpsm2}" "--with-libfabric=${lib.getDev libfabric}" ] + ; + + enableParallelBuilding = true; + + postInstall = '' + find $out/lib/ -name "*.la" -exec rm -f \{} \; + + for f in mpi shmem osh; do + for i in f77 f90 CC c++ cxx cc fort; do + moveToOutput "bin/$f$i" "''${!outputDev}" + echo "move $fi$i" + moveToOutput "share/openmpi/$f$i-wrapper-data.txt" "''${!outputDev}" + done + done + + for i in ortecc orte-info ompi_info oshmem_info opal_wrapper; do + moveToOutput "bin/$i" "''${!outputDev}" + done + + moveToOutput "share/openmpi/ortecc-wrapper-data.txt" "''${!outputDev}" + ''; + + postFixup = '' + remove-references-to -t $dev $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) + remove-references-to -t $man $(readlink -f $out/lib/libopen-pal${stdenv.hostPlatform.extensions.sharedLibrary}) + + # The path to the wrapper is hard coded in libopen-pal.so, which we just cleared. + wrapProgram $dev/bin/opal_wrapper \ + --set OPAL_INCLUDEDIR $dev/include \ + --set OPAL_PKGDATADIR $dev/share/openmpi + + # default compilers should be indentical to the + # compilers at build time + + echo "$dev/share/openmpi/mpicc-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ + $dev/share/openmpi/mpicc-wrapper-data.txt + + echo "$dev/share/openmpi/ortecc-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc:' \ + $dev/share/openmpi/ortecc-wrapper-data.txt + + echo "$dev/share/openmpi/mpic++-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}c++:' \ + $dev/share/openmpi/mpic++-wrapper-data.txt + '' + lib.optionalString fortranSupport '' + + echo "$dev/share/openmpi/mpifort-wrapper-data.txt" + sed -i 's:compiler=.*:compiler=${gfortran}/bin/${gfortran.targetPrefix}gfortran:' \ + $dev/share/openmpi/mpifort-wrapper-data.txt + + ''; + + doCheck = true; + + passthru = { + inherit cudaSupport; + cudatoolkit = cudaPackages.cudatoolkit; # For backward compatibility only + }; + + meta = with lib; { + homepage = "https://www.open-mpi.org/"; + description = "Open source MPI-3 implementation"; + longDescription = "The Open MPI Project is an open source MPI-3 implementation that is developed and maintained by a consortium of academic, research, and industry partners. Open MPI is therefore able to combine the expertise, technologies, and resources from all across the High Performance Computing community in order to build the best MPI library available. Open MPI offers advantages for system and software vendors, application developers and computer science researchers."; + maintainers = with maintainers; [ markuskowa ]; + license = licenses.bsd3; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/op/openmpi/packages.nix b/pkgs/by-name/op/openmpi/packages.nix new file mode 100644 index 0000000..95e875f --- /dev/null +++ b/pkgs/by-name/op/openmpi/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + openmpi = callPackage ./. { }; + mpi = openmpi; # this attribute should used to build MPI applications + mpiCheckPhaseHook = callPackage (path + "/pkgs/build-support/setup-hooks/mpi-check-hook") { }; +} diff --git a/pkgs/by-name/op/opensp/default.nix b/pkgs/by-name/op/opensp/default.nix new file mode 100644 index 0000000..27f5dc4 --- /dev/null +++ b/pkgs/by-name/op/opensp/default.nix @@ -0,0 +1,62 @@ +{ lib, stdenv, fetchurl, fetchpatch, xmlto, docbook_xml_dtd_412 +, docbook_xsl, autoconf, automake, libtool +, autoreconfHook +}: + +stdenv.mkDerivation rec { + pname = "opensp"; + version = "1.5.2"; + + src = fetchurl { + url = "mirror://sourceforge/openjade/OpenSP-${version}.tar.gz"; + sha256 = "1khpasr6l0a8nfz6kcf3s81vgdab8fm2dj291n5r2s53k228kx2p"; + }; + + postPatch = '' + sed -i s,/usr/share/sgml/docbook/xml-dtd-4.1.2/,${docbook_xml_dtd_412}/xml/dtd/docbook/, \ + docsrc/*.xml + ''; + + patches = [ + (fetchpatch { + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/app-text/opensp/files/opensp-1.5.2-c11-using.patch?id=688d9675782dfc162d4e6cff04c668f7516118d0"; + sha256 = "04q14s8qsad0bkjmj067dn831i0r6v7742rafdlnbfm5y249m2q6"; + }) + # Clang 16 defaults to C++17, which does not allow `register` as a storage class specifier. + ./fix-register-storage-class.patch + ]; + + setupHook = ./setup-hook.sh; + + postFixup = '' + # Remove random ids in the release notes + sed -i -e 's/href="#idm.*"//g' $out/share/doc/OpenSP/releasenotes.html + sed -i -e 's/name="idm.*"//g' $out/share/doc/OpenSP/releasenotes.html + ''; + + preConfigure = lib.optionalString stdenv.isCygwin '' + autoreconf -fi + ''; + + strictDeps = true; + + nativeBuildInputs = [ + xmlto + docbook_xml_dtd_412 + docbook_xsl + ] + # Clang 16 fails to build due to inappropriate definitions in the `config.h` generated by the + # existing configure scripts. Regenerate them to make sure they detect its features correctly. + ++ lib.optional stdenv.cc.isClang autoreconfHook + ++ lib.optionals stdenv.isCygwin [ autoconf automake libtool ]; + + doCheck = false; # fails + + meta = with lib; { + description = "A suite of SGML/XML processing tools"; + license = licenses.mit; + homepage = "https://openjade.sourceforge.net/"; + platforms = platforms.unix; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/op/opensp/fix-register-storage-class.patch b/pkgs/by-name/op/opensp/fix-register-storage-class.patch new file mode 100644 index 0000000..ce1aba3 --- /dev/null +++ b/pkgs/by-name/op/opensp/fix-register-storage-class.patch @@ -0,0 +1,11 @@ +--- a/lib/Recognizer.cxx 2005-11-05 04:05:20.000000000 -0500 ++++ b/lib/Recognizer.cxx 2023-06-03 11:45:04.497116217 -0400 +@@ -39,7 +39,7 @@ + } + else + in->startTokenNoMulticode(); +- register const Trie *pos = trie_.pointer(); ++ const Trie *pos = trie_.pointer(); + do { + pos = pos->next(map_[in->tokenChar(mgr)]); + } while (pos->hasNext()); diff --git a/pkgs/by-name/op/opensp/setup-hook.sh b/pkgs/by-name/op/opensp/setup-hook.sh new file mode 100644 index 0000000..5bace3c --- /dev/null +++ b/pkgs/by-name/op/opensp/setup-hook.sh @@ -0,0 +1,22 @@ +addSGMLCatalogs () { + if test -d $1/sgml/dtd; then + for i in $(find $1/sgml/dtd -name docbook.cat); do + export SGML_CATALOG_FILES="${SGML_CATALOG_FILES:+:}$i" + done + fi +} + +if test -z "${sgmlHookDone-}"; then + sgmlHookDone=1 + + # Set http_proxy and ftp_proxy to a invalid host to prevent + # xmllint and xsltproc from trying to download DTDs from the + # network even when --nonet is not given. That would be impure. + # (Note that .invalid is a reserved domain guaranteed not to + # work.) + export http_proxy=http://nodtd.invalid/ + export ftp_proxy=http://nodtd.invalid/ + + export SGML_CATALOG_FILES + addEnvHooks "$targetOffset" addSGMLCatalogs +fi diff --git a/pkgs/by-name/op/openssh/common.nix b/pkgs/by-name/op/openssh/common.nix new file mode 100644 index 0000000..8d26085 --- /dev/null +++ b/pkgs/by-name/op/openssh/common.nix @@ -0,0 +1,188 @@ +{ pname +, version +, extraDesc ? "" +, src +, extraPatches ? [] +, extraNativeBuildInputs ? [] +, extraConfigureFlags ? [] +, extraMeta ? {} +}: + +{ lib, stdenv +# This *is* correct, though unusual. as a way of getting krb5-config from the +# package without splicing See: https://github.com/NixOS/nixpkgs/pull/107606 +, pkgs +, fetchurl +, autoreconfHook +, zlib +, openssl +, libedit +, ldns +, pkg-config +, pam +, libredirect +, etcDir ? null +, withKerberos ? true +, withLdns ? true +, libkrb5 +, libfido2 +, libxcrypt +, hostname +, withFIDO ? stdenv.hostPlatform.isUnix && !stdenv.hostPlatform.isMusl +, withPAM ? stdenv.hostPlatform.isLinux +, dsaKeysSupport ? false +, linkOpenssl ? true +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation { + inherit pname version src; + + patches = [ + ./locale_archive.patch + + (fetchurl { + url = "https://git.alpinelinux.org/aports/plain/main/openssh/gss-serv.c.patch?id=a7509603971ce2f3282486a43bb773b1b522af83"; + sha256 = "sha256-eFFOd4B2nccRZAQWwdBPBoKWjfEdKEVGJvKZAzLu3HU="; + }) + + # See discussion in https://github.com/NixOS/nixpkgs/pull/16966 + ./dont_create_privsep_path.patch + ] ++ extraPatches; + + postPatch = + # On Hydra this makes installation fail (sometimes?), + # and nix store doesn't allow such fancy permission bits anyway. + '' + substituteInPlace Makefile.in --replace '$(INSTALL) -m 4711' '$(INSTALL) -m 0711' + ''; + + strictDeps = true; + nativeBuildInputs = [ autoreconfHook pkg-config ] + # This is not the same as the libkrb5 from the inputs! pkgs.libkrb5 is + # needed here to access krb5-config in order to cross compile. See: + # https://github.com/NixOS/nixpkgs/pull/107606 + ++ lib.optional withKerberos pkgs.libkrb5 + ++ extraNativeBuildInputs; + buildInputs = [ zlib libedit ] + ++ [ (if linkOpenssl then openssl else libxcrypt) ] + ++ lib.optional withFIDO libfido2 + ++ lib.optional withKerberos libkrb5 + ++ lib.optional withLdns ldns + ++ lib.optional withPAM pam; + + preConfigure = '' + # Setting LD causes `configure' and `make' to disagree about which linker + # to use: `configure' wants `gcc', but `make' wants `ld'. + unset LD + ''; + + # I set --disable-strip because later we strip anyway. And it fails to strip + # properly when cross building. + configureFlags = [ + "--sbindir=\${out}/bin" + "--localstatedir=/var" + "--with-pid-dir=/run" + "--with-mantype=man" + "--with-libedit=yes" + "--disable-strip" + (lib.withFeature withPAM "pam") + (lib.enableFeature dsaKeysSupport "dsa-keys") + ] ++ lib.optional (etcDir != null) "--sysconfdir=${etcDir}" + ++ lib.optional withFIDO "--with-security-key-builtin=yes" + ++ lib.optional withKerberos (assert libkrb5 != null; "--with-kerberos5=${libkrb5}") + ++ lib.optional stdenv.isDarwin "--disable-libutil" + ++ lib.optional (!linkOpenssl) "--without-openssl" + ++ lib.optional withLdns "--with-ldns" + ++ extraConfigureFlags; + + ${if stdenv.hostPlatform.isStatic then "NIX_LDFLAGS" else null}= [ "-laudit" ] ++ lib.optionals withKerberos [ "-lkeyutils" ]; + + buildFlags = [ "SSH_KEYSIGN=ssh-keysign" ]; + + enableParallelBuilding = true; + + hardeningEnable = [ "pie" ]; + + doCheck = true; + enableParallelChecking = false; + nativeCheckInputs = [ openssl ] ++ lib.optional (!stdenv.isDarwin) hostname; + preCheck = lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) '' + # construct a dummy HOME + export HOME=$(realpath ../dummy-home) + mkdir -p ~/.ssh + + # construct a dummy /etc/passwd file for the sshd under test + # to use to look up the connecting user + DUMMY_PASSWD=$(realpath ../dummy-passwd) + cat > $DUMMY_PASSWD < ~/.ssh/environment.base < regress/test-exec.sh.new <> $HOME/.ssh/environment + EOF + mv regress/test-exec.sh.new regress/test-exec.sh + + # explicitly enable the PermitUserEnvironment feature + substituteInPlace regress/test-exec.sh \ + --replace \ + 'cat << EOF > $OBJ/sshd_config' \ + $'cat << EOF > $OBJ/sshd_config\n\tPermitUserEnvironment yes' + + # some tests want to use files under /bin as example files + for f in regress/sftp-cmds.sh regress/forwarding.sh; do + substituteInPlace $f --replace '/bin' "$(dirname $(type -p ls))" + done + + # set up NIX_REDIRECTS for direct invocations + set -a; source ~/.ssh/environment.base; set +a + ''; + # integration tests hard to get working on darwin with its shaky + # sandbox + # t-exec tests fail on musl + checkTarget = lib.optional (!stdenv.isDarwin && !stdenv.hostPlatform.isMusl) "t-exec" + # other tests are less demanding of the environment + ++ [ "unit" "file-tests" "interop-tests" ]; + + postInstall = '' + # Install ssh-copy-id, it's very useful. + cp contrib/ssh-copy-id $out/bin/ + chmod +x $out/bin/ssh-copy-id + cp contrib/ssh-copy-id.1 $out/share/man/man1/ + ''; + + installTargets = [ "install-nokeys" ]; + installFlags = [ + "sysconfdir=\${out}/etc/ssh" + ]; + + # passthru.tests = { + # borgbackup-integration = nixosTests.borgbackup; + # openssh = nixosTests.openssh; + # }; + + meta = with lib; { + description = "An implementation of the SSH protocol${extraDesc}"; + homepage = "https://www.openssh.com/"; + changelog = "https://www.openssh.com/releasenotes.html"; + license = licenses.bsd2; + platforms = platforms.unix ++ platforms.windows; + maintainers = (extraMeta.maintainers or []) ++ (with maintainers; [ eelco aneeshusa ]); + mainProgram = "ssh"; + } // extraMeta; +} diff --git a/pkgs/by-name/op/openssh/copyid.nix b/pkgs/by-name/op/openssh/copyid.nix new file mode 100644 index 0000000..40707c2 --- /dev/null +++ b/pkgs/by-name/op/openssh/copyid.nix @@ -0,0 +1,11 @@ +{ runCommand, openssh }: + +runCommand "ssh-copy-id-${openssh.version}" { + meta = openssh.meta // { + description = "A tool to copy SSH public keys to a remote machine"; + priority = (openssh.meta.priority or 0) - 1; + }; +} '' + install -Dm 755 {${openssh},$out}/bin/ssh-copy-id + install -Dm 644 {${openssh},$out}/share/man/man1/ssh-copy-id.1.gz +'' diff --git a/pkgs/by-name/op/openssh/default.nix b/pkgs/by-name/op/openssh/default.nix new file mode 100644 index 0000000..855ce3d --- /dev/null +++ b/pkgs/by-name/op/openssh/default.nix @@ -0,0 +1,81 @@ +{ callPackage, lib, fetchurl, fetchpatch, autoreconfHook }: +let + common = opts: callPackage (import ./common.nix opts) { }; +in +{ + openssh = common rec { + pname = "openssh"; + version = "9.7p1"; + + src = fetchurl { + url = "mirror://openbsd/OpenSSH/portable/openssh-${version}.tar.gz"; + hash = "sha256-SQQm92bYKidj/KzY2D6j1weYdQx70q/y5X3FZg93P/0="; + }; + + extraPatches = [ ./ssh-keysign-8.5.patch ]; + extraMeta.maintainers = lib.teams.helsinki-systems.members; + }; + + openssh_hpn = common rec { + pname = "openssh-with-hpn"; + version = "9.7p1"; + extraDesc = " with high performance networking patches"; + + src = fetchurl { + url = "mirror://openbsd/OpenSSH/portable/openssh-${version}.tar.gz"; + hash = "sha256-SQQm92bYKidj/KzY2D6j1weYdQx70q/y5X3FZg93P/0="; + }; + + extraPatches = let url = "https://raw.githubusercontent.com/freebsd/freebsd-ports/b3f86656fc67aa397f60747c85f7f7b967c3279d/security/openssh-portable/files/extra-patch-hpn"; in + [ + ./ssh-keysign-8.5.patch + + # HPN Patch from FreeBSD ports + (fetchpatch { + name = "ssh-hpn-wo-channels.patch"; + inherit url; + stripLen = 1; + excludes = [ "channels.c" ]; + hash = "sha256-MydulQvz8sDVQ6Up9U1yrsiyI5EGmyKl/stUk7DvVOU="; + }) + + (fetchpatch { + name = "ssh-hpn-channels.patch"; + inherit url; + extraPrefix = ""; + includes = [ "channels.c" ]; + hash = "sha256-pDLUbjv5XIyByEbiRAXC3WMUPKmn15af1stVmcvr7fE="; + }) + ]; + + extraNativeBuildInputs = [ autoreconfHook ]; + + extraConfigureFlags = [ "--with-hpn" ]; + extraMeta = { + maintainers = with lib.maintainers; [ abbe ]; + }; + }; + + openssh_gssapi = common rec { + pname = "openssh-with-gssapi"; + version = "9.7p1"; + extraDesc = " with GSSAPI support"; + + src = fetchurl { + url = "mirror://openbsd/OpenSSH/portable/openssh-${version}.tar.gz"; + hash = "sha256-SQQm92bYKidj/KzY2D6j1weYdQx70q/y5X3FZg93P/0="; + }; + + extraPatches = [ + ./ssh-keysign-8.5.patch + + (fetchpatch { + name = "openssh-gssapi.patch"; + url = "https://salsa.debian.org/ssh-team/openssh/raw/debian/1%25${version}-3/debian/patches/gssapi.patch"; + hash = "sha256-/lEbH5sIS+o+DStEDAghFy43nZlvcIXSFJrnvp+fDdY="; + }) + ]; + + extraNativeBuildInputs = [ autoreconfHook ]; + }; +} diff --git a/pkgs/by-name/op/openssh/dont_create_privsep_path.patch b/pkgs/by-name/op/openssh/dont_create_privsep_path.patch new file mode 100644 index 0000000..23f3ab6 --- /dev/null +++ b/pkgs/by-name/op/openssh/dont_create_privsep_path.patch @@ -0,0 +1,12 @@ +diff --git i/Makefile.in w/Makefile.in +index 04e1c8e5..9bd5d01b 100644 +--- i/Makefile.in ++++ w/Makefile.in +@@ -329,7 +329,6 @@ install-files: + $(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)5 + $(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)8 + $(MKDIR_P) $(DESTDIR)$(libexecdir) +- $(MKDIR_P) -m 0755 $(DESTDIR)$(PRIVSEP_PATH) + $(INSTALL) -m 0755 $(STRIP_OPT) ssh$(EXEEXT) $(DESTDIR)$(bindir)/ssh$(EXEEXT) + $(INSTALL) -m 0755 $(STRIP_OPT) scp$(EXEEXT) $(DESTDIR)$(bindir)/scp$(EXEEXT) + $(INSTALL) -m 0755 $(STRIP_OPT) ssh-add$(EXEEXT) $(DESTDIR)$(bindir)/ssh-add$(EXEEXT) diff --git a/pkgs/by-name/op/openssh/locale_archive.patch b/pkgs/by-name/op/openssh/locale_archive.patch new file mode 100644 index 0000000..3fe4a21 --- /dev/null +++ b/pkgs/by-name/op/openssh/locale_archive.patch @@ -0,0 +1,15 @@ +diff --git i/session.c w/session.c +index 58826db1..658dd911 100644 +--- i/session.c ++++ w/session.c +@@ -1053,6 +1053,10 @@ do_setup_env(struct ssh *ssh, Session *s, const char *shell) + if (getenv("TZ")) + child_set_env(&env, &envsize, "TZ", getenv("TZ")); + ++ /* NixOS path to the glibc locale archive, to be set in the systemd job */ ++ if (getenv("LOCALE_ARCHIVE")) ++ child_set_env(&env, &envsize, "LOCALE_ARCHIVE", getenv("LOCALE_ARCHIVE")); ++ + /* Set custom environment options from pubkey authentication. */ + if (options.permit_user_env) { + for (n = 0 ; n < auth_opts->nenv; n++) { diff --git a/pkgs/by-name/op/openssh/packages.nix b/pkgs/by-name/op/openssh/packages.nix new file mode 100644 index 0000000..4427ade --- /dev/null +++ b/pkgs/by-name/op/openssh/packages.nix @@ -0,0 +1,21 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + opensshPackages = dontRecurseIntoAttrs (callPackage ./. {}); + + openssh = opensshPackages.openssh.override { + etcDir = "/etc/ssh"; + }; + + openssh_hpn = opensshPackages.openssh_hpn.override { + etcDir = "/etc/ssh"; + }; + + openssh_gssapi = opensshPackages.openssh_gssapi.override { + etcDir = "/etc/ssh"; + }; + + ssh-copy-id = callPackage ./copyid.nix { }; +} diff --git a/pkgs/by-name/op/openssh/ssh-keysign-8.5.patch b/pkgs/by-name/op/openssh/ssh-keysign-8.5.patch new file mode 100644 index 0000000..67c45b6 --- /dev/null +++ b/pkgs/by-name/op/openssh/ssh-keysign-8.5.patch @@ -0,0 +1,24 @@ +diff --git a/pathnames.h b/pathnames.h +index cb44caa4..354fdf05 100644 +--- a/pathnames.h ++++ b/pathnames.h +@@ -124,7 +124,7 @@ + + /* Location of ssh-keysign for hostbased authentication */ + #ifndef _PATH_SSH_KEY_SIGN +-#define _PATH_SSH_KEY_SIGN "/usr/libexec/ssh-keysign" ++#define _PATH_SSH_KEY_SIGN "ssh-keysign" + #endif + + /* Location of ssh-pkcs11-helper to support keys in tokens */ +--- a/sshconnect2.c ++++ b/sshconnect2.c +@@ -2021,7 +2021,7 @@ + + debug3_f("[child] pid=%ld, exec %s", + (long)getpid(), _PATH_SSH_KEY_SIGN); +- execl(_PATH_SSH_KEY_SIGN, _PATH_SSH_KEY_SIGN, (char *)NULL); ++ execlp(_PATH_SSH_KEY_SIGN, _PATH_SSH_KEY_SIGN, (char *)NULL); + fatal_f("exec(%s): %s", _PATH_SSH_KEY_SIGN, + strerror(errno)); + } diff --git a/pkgs/by-name/op/openssl/1.1/nix-ssl-cert-file.patch b/pkgs/by-name/op/openssl/1.1/nix-ssl-cert-file.patch new file mode 100644 index 0000000..9e871cf --- /dev/null +++ b/pkgs/by-name/op/openssl/1.1/nix-ssl-cert-file.patch @@ -0,0 +1,15 @@ +diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c +index 244512c935..f0b70d7ea1 100644 +--- a/crypto/x509/by_file.c ++++ b/crypto/x509/by_file.c +@@ -46,7 +46,9 @@ static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, + switch (cmd) { + case X509_L_FILE_LOAD: + if (argl == X509_FILETYPE_DEFAULT) { +- file = ossl_safe_getenv(X509_get_default_cert_file_env()); ++ file = ossl_safe_getenv("NIX_SSL_CERT_FILE"); ++ if (!file) ++ file = ossl_safe_getenv(X509_get_default_cert_file_env()); + if (file) + ok = (X509_load_cert_crl_file(ctx, file, + X509_FILETYPE_PEM) != 0); diff --git a/pkgs/by-name/op/openssl/3.0/legacy.cnf b/pkgs/by-name/op/openssl/3.0/legacy.cnf new file mode 100644 index 0000000..a6485a8 --- /dev/null +++ b/pkgs/by-name/op/openssl/3.0/legacy.cnf @@ -0,0 +1,395 @@ +# Taken from OpenSSL 3.0.7 and modified according to: https://wiki.openssl.org/index.php/OpenSSL_3.0#Programming_in_OpenSSL_3.0 +# +# OpenSSL example configuration file. +# See doc/man5/config.pod for more info. +# +# This is mostly being used for generation of certificate requests, +# but may be used for auto loading of providers + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + + # Use this in order to automatically load providers. +openssl_conf = openssl_init + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + +# Extra OBJECT IDENTIFIER info: +# oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +# For FIPS +# Optionally include a file that is generated by the OpenSSL fipsinstall +# application. This file contains configuration data required by the OpenSSL +# fips provider. It contains a named section e.g. [fips_sect] which is +# referenced from the [provider_sect] below. +# Refer to the OpenSSL security policy for more information. +# .include fipsmodule.cnf + +[openssl_init] +providers = provider_sect + +# List of providers to load +[provider_sect] +default = default_sect +legacy = legacy_sect + +# The fips section name should match the section name inside the +# included fipsmodule.cnf. +# fips = fips_sect + +# If no providers are activated explicitly, the default one is activated implicitly. +# See man 7 OSSL_PROVIDER-default for more details. +# +# If you add a section explicitly activating any other provider(s), you most +# probably need to explicitly activate the default provider, otherwise it +# becomes unavailable in openssl. As a consequence applications depending on +# OpenSSL may not work correctly which could lead to significant system +# problems including inability to remotely access the system. +[default_sect] +activate = 1 + +[legacy_sect] +activate = 1 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) + +[insta] # CMP using Insta Demo CA +# Message transfer +server = pki.certificate.fi:8700 +# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080 +# tls_use = 0 +path = pkix/ + +# Server authentication +recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer +ignore_keyusage = 1 # potentially needed quirk +unprotected_errors = 1 # potentially needed quirk +extracertsout = insta.extracerts.pem + +# Client authentication +ref = 3078 # user identification +secret = pass:insta # can be used for both client and server side + +# Generic message options +cmd = ir # default operation, can be overridden on cmd line with, e.g., kur + +# Certificate enrollment +subject = "/CN=openssl-cmp-test" +newkey = insta.priv.pem +out_trusted = insta.ca.crt +certout = insta.cert.pem + +[pbm] # Password-based protection for Insta CA +# Server and client authentication +ref = $insta::ref # 3078 +secret = $insta::secret # pass:insta + +[signature] # Signature-based protection for Insta CA +# Server authentication +trusted = insta.ca.crt # does not include keyUsage digitalSignature + +# Client authentication +secret = # disable PBM +key = $insta::newkey # insta.priv.pem +cert = $insta::certout # insta.cert.pem + +[ir] +cmd = ir + +[cr] +cmd = cr + +[kur] +# Certificate update +cmd = kur +oldcert = $insta::certout # insta.cert.pem + +[rr] +# Certificate revocation +cmd = rr +oldcert = $insta::certout # insta.cert.pem diff --git a/pkgs/by-name/op/openssl/3.0/nix-ssl-cert-file.patch b/pkgs/by-name/op/openssl/3.0/nix-ssl-cert-file.patch new file mode 100644 index 0000000..e7090f4 --- /dev/null +++ b/pkgs/by-name/op/openssl/3.0/nix-ssl-cert-file.patch @@ -0,0 +1,15 @@ +diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c +index 37d73ca84c..e328896234 100644 +--- a/crypto/x509/by_file.c ++++ b/crypto/x509/by_file.c +@@ -54,7 +54,9 @@ static int by_file_ctrl_ex(X509_LOOKUP *ctx, int cmd, const char *argp, + switch (cmd) { + case X509_L_FILE_LOAD: + if (argl == X509_FILETYPE_DEFAULT) { +- file = ossl_safe_getenv(X509_get_default_cert_file_env()); ++ file = ossl_safe_getenv("NIX_SSL_CERT_FILE"); ++ if (!file) ++ file = ossl_safe_getenv(X509_get_default_cert_file_env()); + if (file) + ok = (X509_load_cert_crl_file_ex(ctx, file, X509_FILETYPE_PEM, + libctx, propq) != 0); diff --git a/pkgs/by-name/op/openssl/3.0/openssl-disable-kernel-detection.patch b/pkgs/by-name/op/openssl/3.0/openssl-disable-kernel-detection.patch new file mode 100644 index 0000000..0458556 --- /dev/null +++ b/pkgs/by-name/op/openssl/3.0/openssl-disable-kernel-detection.patch @@ -0,0 +1,25 @@ +diff --git a/Configure b/Configure +index a558e5ab1a..9a884f0b0f 100755 +--- a/Configure ++++ b/Configure +@@ -1714,20 +1714,6 @@ unless ($disabled{devcryptoeng}) { + + unless ($disabled{ktls}) { + $config{ktls}=""; +- my $cc = $config{CROSS_COMPILE}.$config{CC}; +- if ($target =~ m/^linux/) { +- system("printf '#include \n#include ' | $cc -E - >/dev/null 2>&1"); +- if ($? != 0) { +- disable('too-old-kernel', 'ktls'); +- } +- } elsif ($target =~ m/^BSD/) { +- system("printf '#include \n#include ' | $cc -E - >/dev/null 2>&1"); +- if ($? != 0) { +- disable('too-old-freebsd', 'ktls'); +- } +- } else { +- disable('not-linux-or-freebsd', 'ktls'); +- } + } + + push @{$config{openssl_other_defines}}, "OPENSSL_NO_KTLS" if ($disabled{ktls}); diff --git a/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs-darwin.patch b/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs-darwin.patch new file mode 100644 index 0000000..e8b07b4 --- /dev/null +++ b/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs-darwin.patch @@ -0,0 +1,13 @@ +diff --git a/include/internal/common.h b/include/internal/common.h +index 15666f1..d91e25b 100644 +--- a/include/internal/common.h ++++ b/include/internal/common.h +@@ -83,7 +83,7 @@ __owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr, + # ifndef OPENSSL_SYS_VMS + # define X509_CERT_AREA OPENSSLDIR + # define X509_CERT_DIR OPENSSLDIR "/certs" +-# define X509_CERT_FILE OPENSSLDIR "/cert.pem" ++# define X509_CERT_FILE "/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" + # define X509_PRIVATE_DIR OPENSSLDIR "/private" + # define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" + # else diff --git a/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs.patch b/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs.patch new file mode 100644 index 0000000..13a36fb --- /dev/null +++ b/pkgs/by-name/op/openssl/3.2/use-etc-ssl-certs.patch @@ -0,0 +1,13 @@ +diff --git a/include/internal/common.h b/include/internal/common.h +index 15666f1..d91e25b 100644 +--- a/include/internal/common.h ++++ b/include/internal/common.h +@@ -83,7 +83,7 @@ __owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr, + # ifndef OPENSSL_SYS_VMS + # define X509_CERT_AREA OPENSSLDIR + # define X509_CERT_DIR OPENSSLDIR "/certs" +-# define X509_CERT_FILE OPENSSLDIR "/cert.pem" ++# define X509_CERT_FILE "/etc/ssl/certs/ca-certificates.crt" + # define X509_PRIVATE_DIR OPENSSLDIR "/private" + # define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" + # else diff --git a/pkgs/by-name/op/openssl/default.nix b/pkgs/by-name/op/openssl/default.nix new file mode 100644 index 0000000..86afc47 --- /dev/null +++ b/pkgs/by-name/op/openssl/default.nix @@ -0,0 +1,335 @@ +{ lib, stdenv, fetchurl, buildPackages, perl, coreutils, writeShellScript +, makeWrapper +, withCryptodev ? false, cryptodev ? null +, withZlib ? false, zlib +, enableSSL2 ? false +, enableSSL3 ? false +, enableKTLS ? stdenv.isLinux +, static ? stdenv.hostPlatform.isStatic +# path to openssl.cnf file. will be placed in $etc/etc/ssl/openssl.cnf to replace the default +, conf ? null +, removeReferencesTo +, testers +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let + common = { version, hash, patches ? [], withDocs ? false, extraMeta ? {} }: + stdenv.mkDerivation (finalAttrs: { + pname = "openssl"; + inherit version; + + src = fetchurl { + url = "https://www.openssl.org/source/${finalAttrs.pname}-${version}.tar.gz"; + inherit hash; + }; + + inherit patches; + + postPatch = '' + patchShebangs Configure + '' + lib.optionalString (lib.versionOlder version "1.1.1") '' + patchShebangs test/* + for a in test/t* ; do + substituteInPlace "$a" \ + --replace /bin/rm rm + done + '' + # config is a configure script which is not installed. + + lib.optionalString (lib.versionAtLeast version "1.1.1") '' + substituteInPlace config --replace '/usr/bin/env' '${buildPackages.coreutils}/bin/env' + '' + lib.optionalString (lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isMusl) '' + substituteInPlace crypto/async/arch/async_posix.h \ + --replace '!defined(__ANDROID__) && !defined(__OpenBSD__)' \ + '!defined(__ANDROID__) && !defined(__OpenBSD__) && 0' + '' + # Move ENGINESDIR into OPENSSLDIR for static builds, in order to move + # it to the separate etc output. + + lib.optionalString static '' + substituteInPlace Configurations/unix-Makefile.tmpl \ + --replace 'ENGINESDIR=$(libdir)/engines-{- $sover_dirname -}' \ + 'ENGINESDIR=$(OPENSSLDIR)/engines-{- $sover_dirname -}' + ''; + + outputs = [ "bin" "dev" "out" "man" ] + ++ lib.optional withDocs "doc" + # Separate output for the runtime dependencies of the static build. + # Specifically, move OPENSSLDIR into this output, as its path will be + # compiled into 'libcrypto.a'. This makes it a runtime dependency of + # any package that statically links openssl, so we want to keep that + # output minimal. + ++ lib.optional static "etc"; + setOutputFlags = false; + separateDebugInfo = + !stdenv.hostPlatform.isDarwin && + !(stdenv.hostPlatform.useLLVM or false) && + stdenv.cc.isGNU; + + nativeBuildInputs = + lib.optional (!stdenv.hostPlatform.isWindows) makeWrapper + ++ [ perl ] + ++ lib.optionals static [ removeReferencesTo ]; + buildInputs = lib.optional withCryptodev cryptodev + ++ lib.optional withZlib zlib; + + # TODO(@Ericson2314): Improve with mass rebuild + configurePlatforms = []; + configureScript = { + armv5tel-linux = "./Configure linux-armv4 -march=armv5te"; + armv6l-linux = "./Configure linux-armv4 -march=armv6"; + armv7l-linux = "./Configure linux-armv4 -march=armv7-a"; + x86_64-darwin = "./Configure darwin64-x86_64-cc"; + aarch64-darwin = "./Configure darwin64-arm64-cc"; + x86_64-linux = "./Configure linux-x86_64"; + x86_64-solaris = "./Configure solaris64-x86_64-gcc"; + powerpc64-linux = "./Configure linux-ppc64"; + riscv64-linux = "./Configure linux64-riscv64"; + }.${stdenv.hostPlatform.system} or ( + if stdenv.hostPlatform == stdenv.buildPlatform + then "./config" + else if stdenv.hostPlatform.isBSD + then if stdenv.hostPlatform.isx86_64 then "./Configure BSD-x86_64" + else if stdenv.hostPlatform.isx86_32 + then "./Configure BSD-x86" + lib.optionalString stdenv.hostPlatform.isElf "-elf" + else "./Configure BSD-generic${toString stdenv.hostPlatform.parsed.cpu.bits}" + else if stdenv.hostPlatform.isMinGW + then "./Configure mingw${lib.optionalString + (stdenv.hostPlatform.parsed.cpu.bits != 32) + (toString stdenv.hostPlatform.parsed.cpu.bits)}" + else if stdenv.hostPlatform.isLinux + then if stdenv.hostPlatform.isx86_64 then "./Configure linux-x86_64" + else if stdenv.hostPlatform.isMips32 then "./Configure linux-mips32" + else if stdenv.hostPlatform.isMips64n32 then "./Configure linux-mips64" + else if stdenv.hostPlatform.isMips64n64 then "./Configure linux64-mips64" + else "./Configure linux-generic${toString stdenv.hostPlatform.parsed.cpu.bits}" + else if stdenv.hostPlatform.isiOS + then "./Configure ios${toString stdenv.hostPlatform.parsed.cpu.bits}-cross" + else + throw "Not sure what configuration to use for ${stdenv.hostPlatform.config}" + ); + + # OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags. + dontAddStaticConfigureFlags = true; + configureFlags = [ + "shared" # "shared" builds both shared and static libraries + "--libdir=lib" + (if !static then + "--openssldir=etc/ssl" + else + # Move OPENSSLDIR to the 'etc' output for static builds. Prepend '/.' + # to the path to make it appear absolute before variable expansion, + # else the 'prefix' would be prepended to it. + "--openssldir=/.$(etc)/etc/ssl" + ) + ] ++ lib.optionals withCryptodev [ + "-DHAVE_CRYPTODEV" + "-DUSE_CRYPTODEV_DIGESTS" + ] ++ lib.optional enableSSL2 "enable-ssl2" + ++ lib.optional enableSSL3 "enable-ssl3" + # We select KTLS here instead of the configure-time detection (which we patch out). + # KTLS should work on FreeBSD 13+ as well, so we could enable it if someone tests it. + ++ lib.optional (lib.versionAtLeast version "3.0.0" && enableKTLS) "enable-ktls" + ++ lib.optional (lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isAarch64) "no-afalgeng" + # OpenSSL needs a specific `no-shared` configure flag. + # See https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_Options + # for a comprehensive list of configuration options. + ++ lib.optional (lib.versionAtLeast version "1.1.1" && static) "no-shared" + ++ lib.optional (lib.versionAtLeast version "3.0.0" && static) "no-module" + # This introduces a reference to the CTLOG_FILE which is undesired when + # trying to build binaries statically. + ++ lib.optional static "no-ct" + ++ lib.optional withZlib "zlib" + ++ lib.optionals (stdenv.hostPlatform.isMips && stdenv.hostPlatform ? gcc.arch) [ + # This is necessary in order to avoid openssl adding -march + # flags which ultimately conflict with those added by + # cc-wrapper. Openssl assumes that it can scan CFLAGS to + # detect any -march flags, using this perl code: + # + # && !grep { $_ =~ /-m(ips|arch=)/ } (@{$config{CFLAGS}}) + # + # The following bogus CFLAGS environment variable triggers the + # the code above, inhibiting `./Configure` from adding the + # conflicting flags. + "CFLAGS=-march=${stdenv.hostPlatform.gcc.arch}" + ]; + + makeFlags = [ + "MANDIR=$(man)/share/man" + # This avoids conflicts between man pages of openssl subcommands (for + # example 'ts' and 'err') man pages and their equivalent top-level + # command in other packages (respectively man-pages and moreutils). + # This is done in ubuntu and archlinux, and possiibly many other distros. + "MANSUFFIX=ssl" + ]; + + enableParallelBuilding = true; + + postInstall = + (if static then '' + # OPENSSLDIR has a reference to self + remove-references-to -t $out $out/lib/*.a + '' else '' + # If we're building dynamic libraries, then don't install static + # libraries. + if [ -n "$(echo $out/lib/*.so $out/lib/*.dylib $out/lib/*.dll)" ]; then + rm "$out/lib/"*.a + fi + + # 'etc' is a separate output on static builds only. + etc=$out + '') + '' + mkdir -p $bin + mv $out/bin $bin/bin + + '' + lib.optionalString (!stdenv.hostPlatform.isWindows) + # makeWrapper is broken for windows cross (https://github.com/NixOS/nixpkgs/issues/120726) + '' + # c_rehash is a legacy perl script with the same functionality + # as `openssl rehash` + # this wrapper script is created to maintain backwards compatibility without + # depending on perl + makeWrapper $bin/bin/openssl $bin/bin/c_rehash \ + --add-flags "rehash" + '' + '' + + mkdir $dev + mv $out/include $dev/ + + # remove dependency on Perl at runtime + rm -r $etc/etc/ssl/misc + + rmdir $etc/etc/ssl/{certs,private} + + ${lib.optionalString (conf != null) "cat ${conf} > $etc/etc/ssl/openssl.cnf"} + ''; + + postFixup = lib.optionalString (!stdenv.hostPlatform.isWindows) '' + # Check to make sure the main output and the static runtime dependencies + # don't depend on perl + if grep -r '${buildPackages.perl}' $out $etc; then + echo "Found an erroneous dependency on perl ^^^" >&2 + exit 1 + fi + ''; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + homepage = "https://www.openssl.org/"; + changelog = "https://github.com/openssl/openssl/blob/openssl-${version}/CHANGES.md"; + description = "A cryptographic library that implements the SSL and TLS protocols"; + license = licenses.openssl; + mainProgram = "openssl"; + maintainers = with maintainers; [ thillux ]; + pkgConfigModules = [ + "libcrypto" + "libssl" + "openssl" + ]; + platforms = platforms.all; + } // extraMeta; + }); + +in { + # intended version "policy": + # - 1.1 as long as some package exists, which does not build without it + # - latest 3.x LTS + # - latest 3.x non-LTS as preview/for development + # + # - other versions in between only when reasonable need is stated for some package + # - backport every security critical fix release e.g. 3.0.y -> 3.0.y+1 but no new version, e.g. 3.1 -> 3.2 + + # If you do upgrade here, please update in pkgs/top-level/release.nix + # the permitted insecure version to ensure it gets cached for our users + # and backport this to stable release (23.05). + openssl_1_1 = common { + version = "1.1.1w"; + hash = "sha256-zzCYlQy02FOtlcCEHx+cbT3BAtzPys1SHZOSUgi3asg="; + patches = [ + ./1.1/nix-ssl-cert-file.patch + + (if stdenv.hostPlatform.isDarwin + then ./use-etc-ssl-certs-darwin.patch + else ./use-etc-ssl-certs.patch) + ]; + withDocs = true; + extraMeta = { + knownVulnerabilities = [ + "OpenSSL 1.1 is reaching its end of life on 2023/09/11 and cannot be supported through the NixOS 23.05 release cycle. https://www.openssl.org/blog/blog/2023/03/28/1.1.1-EOL/" + ]; + }; + }; + + openssl_3 = common { + version = "3.0.13"; + hash = "sha256-iFJXU/edO+wn0vp8ZqoLkrOqlJja/ZPXz6SzeAza4xM="; + + patches = [ + ./3.0/nix-ssl-cert-file.patch + + # openssl will only compile in KTLS if the current kernel supports it. + # This patch disables build-time detection. + ./3.0/openssl-disable-kernel-detection.patch + + (if stdenv.hostPlatform.isDarwin + then ./use-etc-ssl-certs-darwin.patch + else ./use-etc-ssl-certs.patch) + ]; + + withDocs = true; + + extraMeta = with lib; { + license = licenses.asl20; + }; + }; + + openssl_3_2 = common { + version = "3.2.1"; + hash = "sha256-g8cyn+UshQZ3115dCwyiRTCbl+jsvP3B39xKufrDWzk="; + + patches = [ + ./3.0/nix-ssl-cert-file.patch + + # openssl will only compile in KTLS if the current kernel supports it. + # This patch disables build-time detection. + ./3.0/openssl-disable-kernel-detection.patch + + (if stdenv.hostPlatform.isDarwin + then ./3.2/use-etc-ssl-certs-darwin.patch + else ./3.2/use-etc-ssl-certs.patch) + ]; + + withDocs = true; + + extraMeta = with lib; { + license = licenses.asl20; + }; + }; + + openssl_3_3 = common { + version = "3.3.0"; + hash = "sha256-U+ZrBDMipgar8Ah+dpmg4DOjf6E/65dC3zXDozsY+wI="; + + patches = [ + ./3.0/nix-ssl-cert-file.patch + + # openssl will only compile in KTLS if the current kernel supports it. + # This patch disables build-time detection. + ./3.0/openssl-disable-kernel-detection.patch + + (if stdenv.hostPlatform.isDarwin + then ./3.2/use-etc-ssl-certs-darwin.patch + else ./3.2/use-etc-ssl-certs.patch) + ]; + + withDocs = true; + + extraMeta = with lib; { + license = licenses.asl20; + }; + }; +} diff --git a/pkgs/by-name/op/openssl/packages.nix b/pkgs/by-name/op/openssl/packages.nix new file mode 100644 index 0000000..6f5163e --- /dev/null +++ b/pkgs/by-name/op/openssl/packages.nix @@ -0,0 +1,17 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + openssl = openssl_3; + + openssl_legacy = openssl.override { + conf = ./3.0/legacy.cnf; + }; + + inherit (callPackages ./. { }) + openssl_1_1 + openssl_3 + openssl_3_2 + openssl_3_3; +} diff --git a/pkgs/by-name/op/openssl/use-etc-ssl-certs-darwin.patch b/pkgs/by-name/op/openssl/use-etc-ssl-certs-darwin.patch new file mode 100644 index 0000000..2c98ccf --- /dev/null +++ b/pkgs/by-name/op/openssl/use-etc-ssl-certs-darwin.patch @@ -0,0 +1,13 @@ +diff --git a/include/internal/cryptlib.h b/include/internal/cryptlib.h +index 329ef62..9a8df64 100644 +--- a/include/internal/cryptlib.h ++++ b/include/internal/cryptlib.h +@@ -56,7 +56,7 @@ DEFINE_LHASH_OF(MEM); + # ifndef OPENSSL_SYS_VMS + # define X509_CERT_AREA OPENSSLDIR + # define X509_CERT_DIR OPENSSLDIR "/certs" +-# define X509_CERT_FILE OPENSSLDIR "/cert.pem" ++# define X509_CERT_FILE "/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" + # define X509_PRIVATE_DIR OPENSSLDIR "/private" + # define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" + # else diff --git a/pkgs/by-name/op/openssl/use-etc-ssl-certs.patch b/pkgs/by-name/op/openssl/use-etc-ssl-certs.patch new file mode 100644 index 0000000..67d1996 --- /dev/null +++ b/pkgs/by-name/op/openssl/use-etc-ssl-certs.patch @@ -0,0 +1,13 @@ +diff --git a/include/internal/cryptlib.h b/include/internal/cryptlib.h +index 329ef62..9a8df64 100644 +--- a/include/internal/cryptlib.h ++++ b/include/internal/cryptlib.h +@@ -56,7 +56,7 @@ DEFINE_LHASH_OF(MEM); + # ifndef OPENSSL_SYS_VMS + # define X509_CERT_AREA OPENSSLDIR + # define X509_CERT_DIR OPENSSLDIR "/certs" +-# define X509_CERT_FILE OPENSSLDIR "/cert.pem" ++# define X509_CERT_FILE "/etc/ssl/certs/ca-certificates.crt" + # define X509_PRIVATE_DIR OPENSSLDIR "/private" + # define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" + # else diff --git a/pkgs/by-name/pa/pam/default.nix b/pkgs/by-name/pa/pam/default.nix new file mode 100644 index 0000000..cb5b13e --- /dev/null +++ b/pkgs/by-name/pa/pam/default.nix @@ -0,0 +1,88 @@ +{ lib, stdenv, buildPackages, fetchurl, fetchpatch +, flex, cracklib, db4, gettext, audit, libxcrypt +, autoreconfHook269, pkg-config-unwrapped +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation rec { + pname = "linux-pam"; + version = "1.6.0"; + + src = fetchurl { + url = "https://github.com/linux-pam/linux-pam/releases/download/v${version}/Linux-PAM-${version}.tar.xz"; + hash = "sha256-//SjTlu+534ujxmS8nYx4jKby/igVj3etcM4m04xaa0="; + }; + + patches = [ + ./suid-wrapper-path.patch + + # Backport fix for missing include breaking musl builds. + (fetchpatch { + name = "pam_namespace-stdint.h.patch"; + url = "https://github.com/linux-pam/linux-pam/commit/cc9d40b7cdbd3e15ccaa324a0dda1680ef9dea13.patch"; + hash = "sha256-tCnH2yPO4dBbJOZA0fP2gm1EavHRMEJyfzB5Vy7YjAA="; + }) + + # Resotre handling of empty passwords: + # https://github.com/linux-pam/linux-pam/pull/784 + # TODO: drop upstreamed patch on 1.6.1 update. + (fetchpatch { + name = "revert-unconditional-helper.patch"; + url = "https://github.com/linux-pam/linux-pam/commit/8d0c575336ad301cd14e16ad2fdec6fe621764b8.patch"; + hash = "sha256-z9KfMxxqXQVnmNaixaVjLnQqaGsH8MBHhHbiP/8fvhE="; + }) + ]; + + # Case-insensitivity workaround for https://github.com/linux-pam/linux-pam/issues/569 + postPatch = if stdenv.buildPlatform.isDarwin && stdenv.buildPlatform != stdenv.hostPlatform then '' + rm CHANGELOG + touch ChangeLog + '' else null; + + outputs = [ "out" "doc" "man" /* "modules" */ ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + # autoreconfHook269 is needed for `suid-wrapper-path.patch` above. + # pkg-config-unwrapped is needed for `AC_CHECK_LIB` and `AC_SEARCH_LIBS` + nativeBuildInputs = [ flex autoreconfHook269 pkg-config-unwrapped ] + ++ lib.optional stdenv.buildPlatform.isDarwin gettext; + + buildInputs = [ cracklib db4 libxcrypt ] + ++ lib.optional stdenv.buildPlatform.isLinux audit; + + enableParallelBuilding = true; + + preConfigure = lib.optionalString (stdenv.hostPlatform.libc == "musl") '' + # export ac_cv_search_crypt=no + # (taken from Alpine linux, apparently insecure but also doesn't build O:)) + # disable insecure modules + # sed -e 's/pam_rhosts//g' -i modules/Makefile.am + sed -e 's/pam_rhosts//g' -i modules/Makefile.in + ''; + + configureFlags = [ + "--includedir=${placeholder "out"}/include/security" + "--enable-sconfigdir=/etc/security" + # The module is deprecated. We re-enable it explicitly until NixOS + # module stops using it. + "--enable-lastlog" + ]; + + installFlags = [ + "SCONFIGDIR=${placeholder "out"}/etc/security" + ]; + + doCheck = false; # fails + + # passthru.tests = { + # inherit (nixosTests) pam-oath-login pam-u2f shadow sssd-ldap; + # }; + + meta = with lib; { + homepage = "http://www.linux-pam.org/"; + description = "Pluggable Authentication Modules, a flexible mechanism for authenticating user"; + platforms = platforms.linux; + license = licenses.bsd3; + }; +} diff --git a/pkgs/by-name/pa/pam/packages.nix b/pkgs/by-name/pa/pam/packages.nix new file mode 100644 index 0000000..2084880 --- /dev/null +++ b/pkgs/by-name/pa/pam/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + linux-pam = callPackage ./. { }; + + pam = if stdenv.isLinux then linux-pam else openpam; +} diff --git a/pkgs/by-name/pa/pam/suid-wrapper-path.patch b/pkgs/by-name/pa/pam/suid-wrapper-path.patch new file mode 100644 index 0000000..a427ccf --- /dev/null +++ b/pkgs/by-name/pa/pam/suid-wrapper-path.patch @@ -0,0 +1,6 @@ +It needs the SUID version during runtime, and that can't be in /nix/store/** +--- a/modules/pam_unix/Makefile.am ++++ b/modules/pam_unix/Makefile.am +@@ -21 +21 @@ +- -DCHKPWD_HELPER=\"$(sbindir)/unix_chkpwd\" \ ++ -DCHKPWD_HELPER=\"/run/wrappers/bin/unix_chkpwd\" \ diff --git a/pkgs/by-name/pa/pango/default.nix b/pkgs/by-name/pa/pango/default.nix new file mode 100644 index 0000000..3428877 --- /dev/null +++ b/pkgs/by-name/pa/pango/default.nix @@ -0,0 +1,134 @@ +{ lib +, stdenv +, fetchurl +, pkg-config +, cairo +, harfbuzz +, libintl +, libthai +, darwin +, fribidi +, gnome +, gi-docgen +, makeFontsConf +, freefont_ttf +, meson +, ninja +, glib +, python3 +, x11Support? !stdenv.isDarwin, libXft +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, buildPackages, gobject-introspection +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "pango"; + version = "1.51.2"; + + outputs = [ "bin" "out" "dev" ] ++ lib.optional withIntrospection "devdoc"; + + src = fetchurl { + url = with finalAttrs; "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + sha256 = "sha256-PbpAfytfwRfhkvMCXwocyO3B/ZuTSxxXiyuXNCE5QVo="; + }; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + meson ninja + glib # for glib-mkenum + pkg-config + python3 + ] ++ lib.optionals withIntrospection [ + gi-docgen + gobject-introspection + ]; + + buildInputs = [ + fribidi + libthai + ] ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ + ApplicationServices + Carbon + CoreGraphics + CoreText + ]); + + propagatedBuildInputs = [ + cairo + glib + libintl + harfbuzz + ] ++ lib.optionals x11Support [ + libXft + ]; + + mesonFlags = [ + (lib.mesonBool "gtk_doc" withIntrospection) + (lib.mesonEnable "introspection" withIntrospection) + (lib.mesonEnable "xft" x11Support) + ]; + + # Fontconfig error: Cannot load default config file + FONTCONFIG_FILE = makeFontsConf { + fontDirectories = [ freefont_ttf ]; + }; + + # Run-time dependency gi-docgen found: NO (tried pkgconfig and cmake) + # it should be a build-time dep for build + # TODO: send upstream + postPatch = '' + substituteInPlace docs/meson.build \ + --replace "'gi-docgen', req" "'gi-docgen', native:true, req" + ''; + + doCheck = false; # test-font: FAIL + + postFixup = '' + # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back. + moveToOutput "share/doc" "$devdoc" + ''; + + passthru = { + updateScript = gnome.updateScript { + packageName = finalAttrs.pname; + # 1.90 is alpha for API 2. + freeze = "1.90.0"; + }; + tests = { + pkg-config = testers.hasPkgConfigModules { + package = finalAttrs.finalPackage; + }; + }; + }; + + meta = with lib; { + description = "A library for laying out and rendering of text, with an emphasis on internationalization"; + + longDescription = '' + Pango is a library for laying out and rendering of text, with an + emphasis on internationalization. Pango can be used anywhere + that text layout is needed, though most of the work on Pango so + far has been done in the context of the GTK widget toolkit. + Pango forms the core of text and font handling for GTK. + ''; + + homepage = "https://www.pango.org/"; + license = licenses.lgpl2Plus; + + maintainers = with maintainers; [ raskin ] ++ teams.gnome.members; + platforms = platforms.unix; + + pkgConfigModules = [ + "pango" + "pangocairo" + "pangofc" + "pangoft2" + "pangoot" + "pangoxft" + ]; + }; +}) diff --git a/pkgs/by-name/pa/pango/packages.nix b/pkgs/by-name/pa/pango/packages.nix new file mode 100644 index 0000000..2757e8c --- /dev/null +++ b/pkgs/by-name/pa/pango/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + pango = callPackage ./. { + harfbuzz = harfbuzz.override { withCoreText = stdenv.isDarwin; }; + }; +} diff --git a/pkgs/by-name/pa/patchelf/default.nix b/pkgs/by-name/pa/patchelf/default.nix new file mode 100644 index 0000000..94c0539 --- /dev/null +++ b/pkgs/by-name/pa/patchelf/default.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl }: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation rec { + pname = "patchelf"; + version = "0.15.0"; + + src = fetchurl { + url = "https://github.com/NixOS/${pname}/releases/download/${version}/${pname}-${version}.tar.bz2"; + sha256 = "sha256-9ANtPuTY4ijewb7/8PbkbYpA6eVw4AaOOdd+YuLIvcI="; + }; + + strictDeps = true; + + setupHook = [ ./setup-hook.sh ]; + + enableParallelBuilding = true; + + # fails 8 out of 24 tests, problems when loading libc.so.6 + doCheck = stdenv.name == "stdenv-linux" + # test scripts require unprefixed bintools binaries + # https://github.com/NixOS/patchelf/issues/417 + && stdenv.cc.targetPrefix == ""; + + meta = with lib; { + homepage = "https://github.com/NixOS/patchelf"; + license = licenses.gpl3Plus; + description = "A small utility to modify the dynamic linker and RPATH of ELF executables"; + mainProgram = "patchelf"; + maintainers = [ maintainers.eelco ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/pa/patchelf/setup-hook.sh b/pkgs/by-name/pa/patchelf/setup-hook.sh new file mode 100644 index 0000000..8f010a3 --- /dev/null +++ b/pkgs/by-name/pa/patchelf/setup-hook.sh @@ -0,0 +1,20 @@ +# This setup hook calls patchelf to automatically remove unneeded +# directories from the RPATH of every library or executable in every +# output. + +fixupOutputHooks+=('if [ -z "${dontPatchELF-}" ]; then patchELF "$prefix"; fi') + +patchELF() { + local dir="$1" + [ -e "$dir" ] || return 0 + + echo "shrinking RPATHs of ELF executables and libraries in $dir" + + local i + while IFS= read -r -d $'\0' i; do + if [[ "$i" =~ .build-id ]]; then continue; fi + if ! isELF "$i"; then continue; fi + echo "shrinking $i" + patchelf --shrink-rpath "$i" || true + done < <(find "$dir" -type f -print0) +} diff --git a/pkgs/by-name/pa/patchelf/unstable.nix b/pkgs/by-name/pa/patchelf/unstable.nix new file mode 100644 index 0000000..c2d9b2c --- /dev/null +++ b/pkgs/by-name/pa/patchelf/unstable.nix @@ -0,0 +1,41 @@ +{ lib, stdenv, fetchurl, autoreconfHook, fetchFromGitHub, unstableGitUpdater }: + +stdenv.mkDerivation rec { + pname = "patchelf"; + version = "unstable-2024-01-15"; + + src = fetchFromGitHub { + owner = "NixOS"; + repo = "patchelf"; + rev = "7c2f768bf9601268a4e71c2ebe91e2011918a70f"; + sha256 = "sha256-PPXqKY2hJng4DBVE0I4xshv/vGLUskL7jl53roB8UdU="; + }; + + # Drop test that fails on musl (?) + postPatch = lib.optionalString stdenv.hostPlatform.isMusl '' + substituteInPlace tests/Makefile.am \ + --replace "set-rpath-library.sh" "" + ''; + + setupHook = [ ./setup-hook.sh ]; + + nativeBuildInputs = [ autoreconfHook ]; + buildInputs = [ ]; + + doCheck = !stdenv.isDarwin; + + passthru = { + updateScript = unstableGitUpdater { + url = "https://github.com/NixOS/patchelf.git"; + }; + }; + + meta = with lib; { + homepage = "https://github.com/NixOS/patchelf"; + license = licenses.gpl3; + description = "A small utility to modify the dynamic linker and RPATH of ELF executables"; + mainProgram = "patchelf"; + maintainers = [ maintainers.eelco ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/pa/patchutils/0.3.3.nix b/pkgs/by-name/pa/patchutils/0.3.3.nix new file mode 100644 index 0000000..f503541 --- /dev/null +++ b/pkgs/by-name/pa/patchutils/0.3.3.nix @@ -0,0 +1,7 @@ +{ callPackage, ... } @ args: + +callPackage ./generic.nix (args // { + version = "0.3.3"; + sha256 = "0g5df00cj4nczrmr4k791l7la0sq2wnf8rn981fsrz1f3d2yix4i"; + patches = [ ./drop-comments.patch ]; # we would get into a cycle when using fetchpatch on this one +}) diff --git a/pkgs/by-name/pa/patchutils/0.4.2.nix b/pkgs/by-name/pa/patchutils/0.4.2.nix new file mode 100644 index 0000000..d3d26c1 --- /dev/null +++ b/pkgs/by-name/pa/patchutils/0.4.2.nix @@ -0,0 +1,9 @@ +{ callPackage, python3, ... } @ args: + +callPackage ./generic.nix (args // { + version = "0.4.2"; + sha256 = "sha256-iHWwll/jPeYriQ9s15O+f6/kGk5VLtv2QfH+1eu/Re0="; + # for gitdiff + extraBuildInputs = [ python3 ]; + patches = [ ./Revert-Fix-grepdiff-test.patch ]; +}) diff --git a/pkgs/by-name/pa/patchutils/Revert-Fix-grepdiff-test.patch b/pkgs/by-name/pa/patchutils/Revert-Fix-grepdiff-test.patch new file mode 100644 index 0000000..434378a --- /dev/null +++ b/pkgs/by-name/pa/patchutils/Revert-Fix-grepdiff-test.patch @@ -0,0 +1,38 @@ +From 13672e53371ea9593130bdca178f3b8b2e174032 Mon Sep 17 00:00:00 2001 +From: Alyssa Ross +Date: Thu, 25 Apr 2024 09:10:54 +0200 +Subject: [PATCH] Revert "Fix grepdiff test" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit a6538753a51db973a05c9034ed78f2dd946453db. + +There's no need for an escape here, because POSIX regexes don't treat +'+' specially if it's at the start of the experssion. musl rejects +the version with the backslash. + +I'm still not clear why this change was made in the first place, but +reverting it seems to make the test pass on both glibc and musl… + +Link: https://github.com/twaugh/patchutils/issues/61 +--- + tests/grepdiff1/run-test | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/grepdiff1/run-test b/tests/grepdiff1/run-test +index c4311f8..c3cebdd 100755 +--- a/tests/grepdiff1/run-test ++++ b/tests/grepdiff1/run-test +@@ -20,7 +20,7 @@ cat << EOF > diff + +b + EOF + +-${GREPDIFF} '\+a' diff 2>errors >index || exit 1 ++${GREPDIFF} '+a' diff 2>errors >index || exit 1 + [ -s errors ] && exit 1 + + cat << EOF | cmp - index || exit 1 +-- +2.44.0 + diff --git a/pkgs/by-name/pa/patchutils/default.nix b/pkgs/by-name/pa/patchutils/default.nix new file mode 100644 index 0000000..902773f --- /dev/null +++ b/pkgs/by-name/pa/patchutils/default.nix @@ -0,0 +1,6 @@ +{ callPackage, ... } @ args: + +callPackage ./generic.nix (args // { + version = "0.3.4"; + sha256 = "0xp8mcfyi5nmb5a2zi5ibmyshxkb1zv1dgmnyn413m7ahgdx8mfg"; +}) diff --git a/pkgs/by-name/pa/patchutils/drop-comments.patch b/pkgs/by-name/pa/patchutils/drop-comments.patch new file mode 100644 index 0000000..e02693a --- /dev/null +++ b/pkgs/by-name/pa/patchutils/drop-comments.patch @@ -0,0 +1,84 @@ +From 58987954647f51dc42fb13b7759923c6170dd905 Mon Sep 17 00:00:00 2001 +From: Tim Waugh +Date: Fri, 9 May 2014 16:23:27 +0100 +Subject: Make --clean drop comments after '@@' lines as well (trac #29). + + +diff --git a/Makefile.am b/Makefile.am +index 99ad2a3..f3c6dbc 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -198,6 +198,7 @@ TESTS = tests/newline1/run-test \ + tests/convert1/run-test \ + tests/convert2/run-test \ + tests/clean1/run-test \ ++ tests/clean2/run-test \ + tests/stdin/run-test + + # These ones don't work yet. +diff --git a/src/filterdiff.c b/src/filterdiff.c +index 383e72b..6ca2316 100644 +--- a/src/filterdiff.c ++++ b/src/filterdiff.c +@@ -2,7 +2,7 @@ + * filterdiff - extract (or exclude) a diff from a diff file + * lsdiff - show which files are modified by a patch + * grepdiff - show files modified by a patch containing a regexp +- * Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2011 Tim Waugh ++ * Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2011, 2013, 2014 Tim Waugh + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -408,7 +408,8 @@ do_unified (FILE *f, char *header[2], int match, char **line, + " Hunk #%lu, %s", + hunknum, bestname); + +- fputs (trailing, output_to); ++ fputs (clean_comments ? "\n" : trailing, ++ output_to); + break; + case Before: + // Note the initial line number +diff --git a/tests/clean2/run-test b/tests/clean2/run-test +new file mode 100755 +index 0000000..42320df +--- /dev/null ++++ b/tests/clean2/run-test +@@ -0,0 +1,34 @@ ++#!/bin/sh ++ ++# This is a filterdiff(1) testcase. ++# Test: Make sure --clean removes hunk-level comments. ++ ++ ++. ${top_srcdir-.}/tests/common.sh ++ ++cat << EOF > diff ++non-diff line ++--- a/file1 +++++ b/file1 ++@@ -0,0 +1 @@ this is a hunk-level comment +++a ++EOF ++ ++${FILTERDIFF} --clean diff 2>errors >filtered || exit 1 ++[ -s errors ] && exit 1 ++ ++cat << EOF | cmp - filtered || exit 1 ++--- a/file1 +++++ b/file1 ++@@ -0,0 +1 @@ +++a ++EOF ++ ++${FILTERDIFF} --clean -x file1 diff 2>errors >filtered || exit 1 ++[ -s errors ] && exit 1 ++cat << EOF | cmp - filtered || exit 1 ++--- a/file1 +++++ b/file1 ++@@ -0,0 +1 @@ +++a ++EOF +-- +cgit v0.10.1 + diff --git a/pkgs/by-name/pa/patchutils/generic.nix b/pkgs/by-name/pa/patchutils/generic.nix new file mode 100644 index 0000000..d1cd433 --- /dev/null +++ b/pkgs/by-name/pa/patchutils/generic.nix @@ -0,0 +1,45 @@ +{ lib, stdenv, fetchurl, perl, makeWrapper +, version, sha256, patches ? [], extraBuildInputs ? [] +, ... +}: +stdenv.mkDerivation rec { + pname = "patchutils"; + inherit version patches; + + src = fetchurl { + url = "http://cyberelk.net/tim/data/patchutils/stable/${pname}-${version}.tar.xz"; + inherit sha256; + }; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ perl ] ++ extraBuildInputs; + hardeningDisable = [ "format" ]; + + # tests fail when building in parallel + enableParallelBuilding = false; + + postInstall = '' + for bin in $out/bin/{splitdiff,rediff,editdiff,dehtmldiff}; do + wrapProgram "$bin" \ + --prefix PATH : "$out/bin" + done + ''; + + doCheck = lib.versionAtLeast version "0.3.4"; + + preCheck = '' + patchShebangs tests + chmod +x scripts/* + '' + lib.optionalString (lib.versionOlder version "0.4.2") '' + find tests -type f -name 'run-test' \ + -exec sed -i '{}' -e 's|/bin/echo|echo|g' \; + ''; + + meta = with lib; { + description = "Tools to manipulate patch files"; + homepage = "http://cyberelk.net/tim/software/patchutils"; + license = licenses.gpl2Plus; + platforms = platforms.all; + maintainers = with maintainers; [ artturin ]; + }; +} diff --git a/pkgs/by-name/pa/patchutils/packages.nix b/pkgs/by-name/pa/patchutils/packages.nix new file mode 100644 index 0000000..89b6c9c --- /dev/null +++ b/pkgs/by-name/pa/patchutils/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + patchutils = callPackage ./. { }; + patchutils_0_3_3 = callPackage ./0.3.3.nix { }; + patchutils_0_4_2 = callPackage ./0.4.2.nix { }; +} diff --git a/pkgs/by-name/pb/pbzx/default.nix b/pkgs/by-name/pb/pbzx/default.nix new file mode 100644 index 0000000..44555cd --- /dev/null +++ b/pkgs/by-name/pb/pbzx/default.nix @@ -0,0 +1,27 @@ +{stdenv, lib, fetchFromGitHub, xz, xar}: + +stdenv.mkDerivation rec { + pname = "pbzx"; + version = "1.0.2"; + src = fetchFromGitHub { + owner = "NiklasRosenstein"; + repo = "pbzx"; + rev = "v${version}"; + sha256 = "0bwd7wmnhpz1n5p39mh6asfyccj4cm06hwigslcwbb3pdwmvxc90"; + }; + buildInputs = [ xz xar ]; + buildPhase = '' + ${stdenv.cc.targetPrefix}cc pbzx.c -llzma -lxar -o pbzx + ''; + installPhase = '' + mkdir -p $out/bin + cp pbzx $out/bin + ''; + meta = with lib; { + description = "Stream parser of Apple's pbzx compression format"; + platforms = platforms.unix; + license = licenses.gpl3; + maintainers = [ maintainers.matthewbauer ]; + mainProgram = "pbzx"; + }; +} diff --git a/pkgs/by-name/pc/pcre/default.nix b/pkgs/by-name/pc/pcre/default.nix new file mode 100644 index 0000000..5221915 --- /dev/null +++ b/pkgs/by-name/pc/pcre/default.nix @@ -0,0 +1,65 @@ +{ lib, stdenv, fetchurl +, pcre, windows ? null +, variant ? null +}: + +assert lib.elem variant [ null "cpp" "pcre16" "pcre32" ]; + +stdenv.mkDerivation rec { + pname = "pcre" + + lib.optionalString (variant == "cpp") "-cpp" + + lib.optionalString (variant != "cpp" && variant != null) variant; + version = "8.45"; + + src = fetchurl { + url = "mirror://sourceforge/project/pcre/pcre/${version}/pcre-${version}.tar.bz2"; + sha256 = "sha256-Ta5v3NK7C7bDe1+Xwzwr6VTadDmFNpzdrDVG4yGL/7g="; + }; + + outputs = [ "bin" "dev" "out" "doc" "man" ]; + + # Disable jit on Apple Silicon, https://github.com/zherczeg/sljit/issues/51 + configureFlags = lib.optional (!(stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64)) "--enable-jit=auto" ++ [ + "--enable-unicode-properties" + "--disable-cpp" + ] + ++ lib.optional (variant != null) "--enable-${variant}"; + + # https://bugs.exim.org/show_bug.cgi?id=2173 + patches = [ ./stacksize-detection.patch ]; + + preCheck = '' + patchShebangs RunGrepTest + ''; + + doCheck = !(with stdenv.hostPlatform; isCygwin || isFreeBSD) && stdenv.hostPlatform == stdenv.buildPlatform; + # XXX: test failure on Cygwin + # we are running out of stack on both freeBSDs on Hydra + + postFixup = '' + moveToOutput bin/pcre-config "$dev" + '' + lib.optionalString (variant != null) '' + ln -sf -t "$out/lib/" '${pcre.out}'/lib/libpcre{,posix}.{so.*.*.*,*dylib,*a} + ''; + + meta = { + homepage = "http://www.pcre.org/"; + description = "A library for Perl Compatible Regular Expressions"; + license = lib.licenses.bsd3; + + longDescription = '' + The PCRE library is a set of functions that implement regular + expression pattern matching using the same syntax and semantics as + Perl 5. PCRE has its own native API, as well as a set of wrapper + functions that correspond to the POSIX regular expression API. The + PCRE library is free, even for building proprietary software. + ''; + + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ ]; + pkgConfigModules = [ + "libpcre" + "libpcreposix" + ]; + }; +} diff --git a/pkgs/by-name/pc/pcre/packages.nix b/pkgs/by-name/pc/pcre/packages.nix new file mode 100644 index 0000000..67a6fc0 --- /dev/null +++ b/pkgs/by-name/pc/pcre/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + pcre = callPackage ./. { }; + pcre16 = res.pcre.override { variant = "pcre16"; }; + # pcre32 seems unused + pcre-cpp = res.pcre.override { variant = "cpp"; }; +} diff --git a/pkgs/by-name/pc/pcre/stacksize-detection.patch b/pkgs/by-name/pc/pcre/stacksize-detection.patch new file mode 100644 index 0000000..4bc9706 --- /dev/null +++ b/pkgs/by-name/pc/pcre/stacksize-detection.patch @@ -0,0 +1,16 @@ +diff --git a/pcre_exec.c b/pcre_exec.c +--- a/pcre_exec.c ++++ b/pcre_exec.c +@@ -509,6 +509,12 @@ + (e.g. stopped by repeated call or recursion limit) + */ + ++#ifdef __GNUC__ ++static int ++match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, ++ PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb, ++ unsigned int rdepth) __attribute__((noinline,noclone)); ++#endif + static int + match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, + PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb, diff --git a/pkgs/by-name/pc/pcre2/default.nix b/pkgs/by-name/pc/pcre2/default.nix new file mode 100644 index 0000000..23234c4 --- /dev/null +++ b/pkgs/by-name/pc/pcre2/default.nix @@ -0,0 +1,54 @@ +{ lib +, stdenv +, fetchurl +, withJitSealloc ? true +}: + +stdenv.mkDerivation rec { + pname = "pcre2"; + version = "10.43"; + + src = fetchurl { + url = "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-${version}/pcre2-${version}.tar.bz2"; + hash = "sha256-4qU5hP8LB9/bWuRIa7ubIcyo598kNAlsyb8bcow1C8s="; + }; + + postPatch = '' + # Fix jit autodetection: + # https://github.com/PCRE2Project/pcre2/pull/396 + # Applying manually to avoid fetchpatch and autoreconfHook. + # TODO: remove once 10.44 is released + substituteInPlace configure --replace-fail \ + '#include "src/sljit/sljitConfigInternal.h"' \ + '#include "src/sljit/sljitConfigCPU.h"' + ''; + + configureFlags = [ + "--enable-pcre2-16" + "--enable-pcre2-32" + # only enable jit on supported platforms which excludes Apple Silicon, see https://github.com/zherczeg/sljit/issues/51 + "--enable-jit=${if stdenv.hostPlatform.isS390x then "no" else "auto"}" + ] + # fix pcre jit in systemd units that set MemoryDenyWriteExecute=true like gitea + ++ lib.optional withJitSealloc "--enable-jit-sealloc"; + + outputs = [ "bin" "dev" "out" "doc" "man" "devdoc" ]; + + postFixup = '' + moveToOutput bin/pcre2-config "$dev" + ''; + + meta = with lib; { + homepage = "https://www.pcre.org/"; + description = "Perl Compatible Regular Expressions"; + license = licenses.bsd3; + maintainers = with maintainers; [ ttuegel ]; + platforms = platforms.all; + pkgConfigModules = [ + "libpcre2-posix" + "libpcre2-8" + "libpcre2-16" + "libpcre2-32" + ]; + }; +} diff --git a/pkgs/by-name/pe/perl/cpp-precomp.patch b/pkgs/by-name/pe/perl/cpp-precomp.patch new file mode 100644 index 0000000..231853f --- /dev/null +++ b/pkgs/by-name/pe/perl/cpp-precomp.patch @@ -0,0 +1,11 @@ +--- a/hints/darwin.sh 2013-05-08 11:13:45.000000000 -0600 ++++ b/hints/darwin.sh 2013-05-08 11:15:04.000000000 -0600 +@@ -129,7 +129,7 @@ + + # Avoid Apple's cpp precompiler, better for extensions + if [ "X`echo | ${cc} -no-cpp-precomp -E - 2>&1 >/dev/null`" = "X" ]; then +- cppflags="${cppflags} -no-cpp-precomp" ++ #cppflags="${cppflags} -no-cpp-precomp" + + # This is necessary because perl's build system doesn't + # apply cppflags to cc compile lines as it should. diff --git a/pkgs/by-name/pe/perl/cross.patch b/pkgs/by-name/pe/perl/cross.patch new file mode 100644 index 0000000..e0f05ed --- /dev/null +++ b/pkgs/by-name/pe/perl/cross.patch @@ -0,0 +1,250 @@ +From: =?UTF-8?q?Christian=20K=C3=B6gler?= +Date: Mon, 10 Apr 2023 22:12:24 +0200 +Subject: [PATCH] miniperl compatible modules + +CPAN::Meta +ExtUtils::MakeMaker +JSON::PP +Data::Dumper + +Updated for perl v5.38.0 by stig@stig.io + +--- + +diff --git a/cpan/CPAN-Meta-Requirements/lib/CPAN/Meta/Requirements.pm b/cpan/CPAN-Meta-Requirements/lib/CPAN/Meta/Requirements.pm +index b0e83b0d2d..dab4907704 100644 +--- a/cpan/CPAN-Meta-Requirements/lib/CPAN/Meta/Requirements.pm ++++ b/cpan/CPAN-Meta-Requirements/lib/CPAN/Meta/Requirements.pm +@@ -86,21 +86,7 @@ sub new { + # from version::vpp + sub _find_magic_vstring { + my $value = shift; +- my $tvalue = ''; +- require B; +- my $sv = B::svref_2object(\$value); +- my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef; +- while ( $magic ) { +- if ( $magic->TYPE eq 'V' ) { +- $tvalue = $magic->PTR; +- $tvalue =~ s/^v?(.+)$/v$1/; +- last; +- } +- else { +- $magic = $magic->MOREMAGIC; +- } +- } +- return $tvalue; ++ return version::->parse($value)->stringify; + } + + # safe if given an unblessed reference +diff --git a/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm b/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm +index 746abd63bc..c55d7cd2d0 100644 +--- a/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm ++++ b/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm +@@ -1,6 +1,7 @@ + use 5.008001; # sane UTF-8 support + use strict; + use warnings; ++no warnings 'experimental::builtin'; + package CPAN::Meta::YAML; # git description: v1.68-2-gcc5324e + # XXX-INGY is 5.8.1 too old/broken for utf8? + # XXX-XDG Lancaster consensus was that it was sufficient until +@@ -650,27 +651,29 @@ sub _dump_string { + join '', map { "$_\n" } @lines; + } + +-sub _has_internal_string_value { ++# taken from cpan/JSON-PP/lib/JSON/PP.pm ++sub _looks_like_number { + my $value = shift; +- my $b_obj = B::svref_2object(\$value); # for round trip problem +- return $b_obj->FLAGS & B::SVf_POK(); ++ no warnings 'numeric'; ++ # if the utf8 flag is on, it almost certainly started as a string ++ return if utf8::is_utf8($value); ++ # detect numbers ++ # string & "" -> "" ++ # number & "" -> 0 (with warning) ++ # nan and inf can detect as numbers, so check with * 0 ++ return unless length((my $dummy = "") & $value); ++ return unless 0 + $value eq $value; ++ return 1 if $value * 0 == 0; ++ return -1; # inf/nan + } + + sub _dump_scalar { + my $string = $_[1]; + my $is_key = $_[2]; +- # Check this before checking length or it winds up looking like a string! +- my $has_string_flag = _has_internal_string_value($string); + return '~' unless defined $string; + return "''" unless length $string; +- if (Scalar::Util::looks_like_number($string)) { +- # keys and values that have been used as strings get quoted +- if ( $is_key || $has_string_flag ) { +- return qq['$string']; +- } +- else { +- return $string; +- } ++ if (_looks_like_number($string)) { ++ return qq['$string']; + } + if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) { + $string =~ s/\\/\\\\/g; +@@ -800,9 +803,6 @@ sub errstr { + # Helper functions. Possibly not needed. + + +-# Use to detect nv or iv +-use B; +- + # XXX-INGY Is flock CPAN::Meta::YAML's responsibility? + # Some platforms can't flock :-( + # XXX-XDG I think it is. When reading and writing files, we ought +@@ -822,35 +822,8 @@ sub _can_flock { + } + } + +- +-# XXX-INGY Is this core in 5.8.1? Can we remove this? +-# XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this +-##################################################################### +-# Use Scalar::Util if possible, otherwise emulate it +- +-use Scalar::Util (); + BEGIN { +- local $@; +- if ( eval { Scalar::Util->VERSION(1.18); } ) { +- *refaddr = *Scalar::Util::refaddr; +- } +- else { +- eval <<'END_PERL'; +-# Scalar::Util failed to load or too old +-sub refaddr { +- my $pkg = ref($_[0]) or return undef; +- if ( !! UNIVERSAL::can($_[0], 'can') ) { +- bless $_[0], 'Scalar::Util::Fake'; +- } else { +- $pkg = undef; +- } +- "$_[0]" =~ /0x(\w+)/; +- my $i = do { no warnings 'portable'; hex $1 }; +- bless $_[0], $pkg if defined $pkg; +- $i; +-} +-END_PERL +- } ++ *refaddr = *builtin::refaddr; + } + + delete $CPAN::Meta::YAML::{refaddr}; +diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm +index 3604eae402..991f69d275 100644 +--- a/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm ++++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm +@@ -1,12 +1,13 @@ + use strict; + use warnings; ++no warnings 'experimental::builtin'; + + package CPAN::Meta::Merge; + + our $VERSION = '2.150010'; + + use Carp qw/croak/; +-use Scalar::Util qw/blessed/; ++use builtin qw/blessed/; + use CPAN::Meta::Converter 2.141170; + + sub _is_identical { +diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm +index d4e93fd8a5..809da68d02 100644 +--- a/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm ++++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm +@@ -1,6 +1,7 @@ + use 5.006; + use strict; + use warnings; ++no warnings 'experimental::builtin'; + package CPAN::Meta::Prereqs; + + our $VERSION = '2.150010'; +@@ -14,7 +15,6 @@ our $VERSION = '2.150010'; + #pod =cut + + use Carp qw(confess); +-use Scalar::Util qw(blessed); + use CPAN::Meta::Requirements 2.121; + + #pod =method new +@@ -168,7 +168,12 @@ sub types_in { + sub with_merged_prereqs { + my ($self, $other) = @_; + +- my @other = blessed($other) ? $other : @$other; ++ eval 'require Scalar::Util'; ++ my @other = unless($@){ ++ Scalar::Util::blessed($other) ? $other : @$other; ++ }else{ ++ builtin::blessed($other) ? $other : @$other; ++ } + + my @prereq_objs = ($self, @other); + +diff --git a/cpan/JSON-PP/lib/JSON/PP.pm b/cpan/JSON-PP/lib/JSON/PP.pm +index fc8fcbc8f0..cda7b90c65 100644 +--- a/cpan/JSON-PP/lib/JSON/PP.pm ++++ b/cpan/JSON-PP/lib/JSON/PP.pm +@@ -4,6 +4,7 @@ package JSON::PP; + + use 5.008; + use strict; ++no warnings 'experimental::builtin'; + + use Exporter (); + BEGIN { our @ISA = ('Exporter') } +diff --git a/dist/Data-Dumper/Dumper.pm b/dist/Data-Dumper/Dumper.pm +index bb6d3caedb..0c2fde4743 100644 +--- a/dist/Data-Dumper/Dumper.pm ++++ b/dist/Data-Dumper/Dumper.pm +@@ -11,6 +11,7 @@ package Data::Dumper; + + use strict; + use warnings; ++no warnings 'experimental::builtin'; + + #$| = 1; + +@@ -125,8 +126,7 @@ sub new { + # Packed numeric addresses take less memory. Plus pack is faster than sprintf + + sub format_refaddr { +- require Scalar::Util; +- pack "J", Scalar::Util::refaddr(shift); ++ pack "J", builtin::refaddr(shift); + }; + + # +@@ -282,9 +282,8 @@ sub _dump { + warn "WARNING(Freezer method call failed): $@" if $@; + } + +- require Scalar::Util; +- my $realpack = Scalar::Util::blessed($val); +- my $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val; ++ my $realpack = builtin::blessed($val); ++ my $realtype = $realpack ? builtin::reftype($val) : ref $val; + $id = format_refaddr($val); + + # Note: By this point $name is always defined and of non-zero length. +@@ -576,7 +575,7 @@ sub _dump { + # here generates a different result. So there are actually "three" different + # implementations of Data::Dumper (kind of sort of) but we only test two. + elsif (!defined &_vstring +- and ref $ref eq 'VSTRING' || eval{Scalar::Util::isvstring($val)}) { ++ and ref $ref eq 'VSTRING') { + $out .= sprintf "v%vd", $val; + } + # \d here would treat "1\x{660}" as a safe decimal number diff --git a/pkgs/by-name/pe/perl/default.nix b/pkgs/by-name/pe/perl/default.nix new file mode 100644 index 0000000..dc0a2ea --- /dev/null +++ b/pkgs/by-name/pe/perl/default.nix @@ -0,0 +1,72 @@ +{ callPackage }: + +let + # Common passthru for all perl interpreters. + # copied from lua + passthruFun = + { overrides + , perlOnBuildForBuild + , perlOnBuildForHost + , perlOnBuildForTarget + , perlOnHostForHost + , perlOnTargetForTarget + , perlAttr ? null + , self # is perlOnHostForTarget + }: let + perlPackages = callPackage + # Function that when called + # - imports perl-packages.nix + # - adds spliced package sets to the package set + ({ stdenv, pkgs, perl, callPackage, makeScopeWithSplicing' }: let + perlPackagesFun = callPackage ./perl-packages.nix { + # allow 'perlPackages.override { pkgs = pkgs // { imagemagick = imagemagickBig; }; }' like in python3Packages + # most perl packages aren't called with callPackage so it's not possible to override their arguments individually + # the conditional is because the // above won't be applied to __splicedPackages and hopefully no one is doing that when cross-compiling + pkgs = if stdenv.buildPlatform != stdenv.hostPlatform then pkgs.__splicedPackages else pkgs; + inherit stdenv; + perl = self; + }; + + otherSplices = { + selfBuildBuild = perlOnBuildForBuild.pkgs; + selfBuildHost = perlOnBuildForHost.pkgs; + selfBuildTarget = perlOnBuildForTarget.pkgs; + selfHostHost = perlOnHostForHost.pkgs; + selfTargetTarget = perlOnTargetForTarget.pkgs or {}; + }; + in makeScopeWithSplicing' { + inherit otherSplices; + f = perlPackagesFun; + }) + { + perl = self; + }; + in rec { + buildEnv = callPackage ./wrapper.nix { + perl = self; + inherit (pkgs) requiredPerlModules; + }; + withPackages = f: buildEnv.override { extraLibs = f pkgs; }; + pkgs = perlPackages // (overrides pkgs); + interpreter = "${self}/bin/perl"; + libPrefix = "lib/perl5/site_perl"; + perlOnBuild = perlOnBuildForHost.override { inherit overrides; self = perlOnBuild; }; + }; + +in rec { + # Maint version + perl536 = callPackage ./interpreter.nix { + self = perl536; + version = "5.36.3"; + sha256 = "sha256-8qGtiBFjkaF2Ji3ULfxS7yKvtA9MDpgQ8V1WHm8ccmo="; + inherit passthruFun; + }; + + # Maint version + perl538 = callPackage ./interpreter.nix { + self = perl538; + version = "5.38.2"; + sha256 = "sha256-oKMVNEUet7g8fWWUpJdUOlTUiLyQygD140diV39AZV4="; + inherit passthruFun; + }; +} diff --git a/pkgs/by-name/pe/perl/http-tiny-verify-ssl-by-default.patch b/pkgs/by-name/pe/perl/http-tiny-verify-ssl-by-default.patch new file mode 100644 index 0000000..5924806 --- /dev/null +++ b/pkgs/by-name/pe/perl/http-tiny-verify-ssl-by-default.patch @@ -0,0 +1,79 @@ +Patch for HTTP::Tiny that defaults verify_SSL to 1 + +Based on proposed Debian patch by Dominic Hargreaves: +https://salsa.debian.org/perl-team/interpreter/perl/-/commit/1490431e40e22052f75a0b3449f1f53cbd27ba92 + + +diff --git a/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm b/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm +index 5803e4599..88ba51461 100644 +--- a/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm ++++ b/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm +@@ -40,7 +40,7 @@ sub _croak { require Carp; Carp::croak(@_) } + #pod * C — Request timeout in seconds (default is 60) If a socket open, + #pod read or write takes longer than the timeout, an exception is thrown. + #pod * C — A boolean that indicates whether to validate the SSL +-#pod certificate of an C — connection (default is false) ++#pod certificate of an C — connection (default is true) + #pod * C — A hashref of C — options to pass through to + #pod L + #pod +@@ -112,7 +112,7 @@ sub new { + max_redirect => 5, + timeout => defined $args{timeout} ? $args{timeout} : 60, + keep_alive => 1, +- verify_SSL => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default ++ verify_SSL => $args{verify_SSL} // $args{verify_ssl} // 1, # verification by default + no_proxy => $ENV{no_proxy}, + }; + +@@ -1038,7 +1038,7 @@ sub new { + timeout => 60, + max_line_size => 16384, + max_header_lines => 64, +- verify_SSL => 0, ++ verify_SSL => 1, + SSL_options => {}, + %args + }, $class; +@@ -1765,7 +1765,7 @@ C — Request timeout in seconds (default is 60) If a socket open, read + + =item * + +-C — A boolean that indicates whether to validate the SSL certificate of an C — connection (default is false) ++C — A boolean that indicates whether to validate the SSL certificate of an C — connection (default is true) + + =item * + +@@ -2035,7 +2035,7 @@ Verification of server identity + + =back + +-B. ++B. + + Server identity verification is controversial and potentially tricky because it + depends on a (usually paid) third-party Certificate Authority (CA) trust model +@@ -2043,16 +2043,14 @@ to validate a certificate as legitimate. This discriminates against servers + with self-signed certificates or certificates signed by free, community-driven + CA's such as L. + +-By default, HTTP::Tiny does not make any assumptions about your trust model, +-threat level or risk tolerance. It just aims to give you an encrypted channel +-when you need one. +- + Setting the C attribute to a true value will make HTTP::Tiny verify + that an SSL connection has a valid SSL certificate corresponding to the host + name of the connection and that the SSL certificate has been verified by a CA. + Assuming you trust the CA, this will protect against a L. If you are +-concerned about security, you should enable this option. ++attack|http://en.wikipedia.org/wiki/Man-in-the-middle_attack>. ++ ++If you are not concerned about security, and this default in NixOS causes ++problems, you should disable this option. + + Certificate verification requires a file containing trusted CA certificates. + +-- + + diff --git a/pkgs/by-name/pe/perl/interpreter.nix b/pkgs/by-name/pe/perl/interpreter.nix new file mode 100644 index 0000000..95ddc5a --- /dev/null +++ b/pkgs/by-name/pe/perl/interpreter.nix @@ -0,0 +1,261 @@ +{ stdenv +, fetchurl +, fetchFromGitHub +, buildPackages +, lib +, self +, version +, sha256 +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsTargetTarget +, zlib +, config +, passthruFun +, perlAttr ? "perl${lib.versions.major version}${lib.versions.minor version}" +, enableThreading ? true, coreutils, makeWrapper +, enableCrypt ? true, libxcrypt ? null +, overrides ? config.perlPackageOverrides or (p: {}) # TODO: (self: super: {}) like in python +} @ inputs: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert (enableCrypt -> (libxcrypt != null)); + +let + crossCompiling = stdenv.buildPlatform != stdenv.hostPlatform; + libc = if stdenv.cc.libc or null != null then stdenv.cc.libc else "/usr"; + libcInc = lib.getDev libc; + libcLib = lib.getLib libc; +in + +stdenv.mkDerivation (rec { + inherit version; + pname = "perl"; + + src = fetchurl { + url = "mirror://cpan/src/5.0/perl-${version}.tar.gz"; + inherit sha256; + }; + + strictDeps = true; + # TODO: Add a "dev" output containing the header files. + outputs = [ "out" "man" "devdoc" ] ++ + lib.optional crossCompiling "mini"; + setOutputFlags = false; + + # On FreeBSD, if Perl is built with threads support, having + # libxcrypt available will result in a build failure, because + # perl.h will get conflicting definitions of struct crypt_data + # from libc's unistd.h and libxcrypt's crypt.h. + # + # FreeBSD Ports has the same issue building the perl port if + # the libxcrypt port has been installed. + # + # Without libxcrypt, Perl will still find FreeBSD's crypt functions. + propagatedBuildInputs = lib.optional (enableCrypt && !stdenv.isFreeBSD) libxcrypt; + + disallowedReferences = [ stdenv.cc ]; + + patches = + # Enable TLS/SSL verification in HTTP::Tiny by default + lib.optional (lib.versionOlder version "5.38.0") ./http-tiny-verify-ssl-by-default.patch + + # Do not look in /usr etc. for dependencies. + ++ lib.optional (lib.versionOlder version "5.38.0") ./no-sys-dirs-5.31.patch + ++ lib.optional (lib.versionAtLeast version "5.38.0") ./no-sys-dirs-5.38.0.patch + + ++ lib.optional stdenv.isSunOS ./ld-shared.patch + ++ lib.optionals stdenv.isDarwin [ ./cpp-precomp.patch ./sw_vers.patch ] + ++ lib.optional crossCompiling ./cross.patch; + + # This is not done for native builds because pwd may need to come from + # bootstrap tools when building bootstrap perl. + postPatch = (if crossCompiling then '' + substituteInPlace dist/PathTools/Cwd.pm \ + --replace "/bin/pwd" '${coreutils}/bin/pwd' + substituteInPlace cnf/configure_tool.sh --replace "cc -E -P" "cc -E" + '' else '' + substituteInPlace dist/PathTools/Cwd.pm \ + --replace "/bin/pwd" "$(type -P pwd)" + '') + + # Perl's build system uses the src variable, and its value may end up in + # the output in some cases (when cross-compiling) + '' + unset src + ''; + + # Build a thread-safe Perl with a dynamic libperl.so. We need the + # "installstyle" option to ensure that modules are put under + # $out/lib/perl5 - this is the general default, but because $out + # contains the string "perl", Configure would select $out/lib. + # Miniperl needs -lm. perl needs -lrt. + configureFlags = + (if crossCompiling + then [ "-Dlibpth=\"\"" "-Dglibpth=\"\"" "-Ddefault_inc_excludes_dot" ] + else [ "-de" "-Dcc=cc" ]) + ++ [ + "-Uinstallusrbinperl" + "-Dinstallstyle=lib/perl5" + ] ++ lib.optional (!crossCompiling) "-Duseshrplib" ++ [ + "-Dlocincpth=${libcInc}/include" + "-Dloclibpth=${libcLib}/lib" + ] + ++ lib.optionals ((builtins.match ''5\.[0-9]*[13579]\..+'' version) != null) [ "-Dusedevel" "-Uversiononly" ] + ++ lib.optional stdenv.isSunOS "-Dcc=gcc" + ++ lib.optional enableThreading "-Dusethreads" + ++ lib.optional (!enableCrypt) "-A clear:d_crypt_r" + ++ lib.optional stdenv.hostPlatform.isStatic "--all-static" + ++ lib.optionals (!crossCompiling) [ + "-Dprefix=${placeholder "out"}" + "-Dman1dir=${placeholder "out"}/share/man/man1" + "-Dman3dir=${placeholder "out"}/share/man/man3" + ]; + + configureScript = lib.optionalString (!crossCompiling) "${stdenv.shell} ./Configure"; + + dontAddStaticConfigureFlags = true; + + dontAddPrefix = !crossCompiling; + + enableParallelBuilding = !crossCompiling; + + # perl includes the build date, the uname of the build system and the + # username of the build user in some files. + # We override these to make it build deterministically. + # other distro solutions + # https://github.com/bmwiedemann/openSUSE/blob/master/packages/p/perl/perl-reproducible.patch + # https://github.com/archlinux/svntogit-packages/blob/packages/perl/trunk/config.over + # https://salsa.debian.org/perl-team/interpreter/perl/blob/debian-5.26/debian/config.over + # A ticket has been opened upstream to possibly clean some of this up: https://rt.perl.org/Public/Bug/Display.html?id=133452 + preConfigure = '' + cat > config.over < ./cpan/Compress-Raw-Zlib/config.in </c libpth => ' '," \ + -i "$out"/lib/perl5/*/*/Config.pm + # TODO: removing those paths would be cleaner than overwriting with nonsense. + substituteInPlace "$out"/lib/perl5/*/*/Config_heavy.pl \ + --replace "${libcInc}" /no-such-path \ + --replace "${ + if stdenv.hasCC then stdenv.cc else "/no-such-path" + }" /no-such-path \ + --replace "${ + if stdenv.hasCC && stdenv.cc.cc != null then stdenv.cc.cc else "/no-such-path" + }" /no-such-path \ + --replace "$man" /no-such-path + '' + lib.optionalString crossCompiling + '' + mkdir -p $mini/lib/perl5/cross_perl/${version} + for dir in cnf/{stub,cpan}; do + cp -r $dir/* $mini/lib/perl5/cross_perl/${version} + done + + mkdir -p $mini/bin + install -m755 miniperl $mini/bin/perl + + export runtimeArch="$(ls $out/lib/perl5/site_perl/${version})" + # wrapProgram should use a runtime-native SHELL by default, but + # it actually uses a buildtime-native one. If we ever fix that, + # we'll need to fix this to use a buildtime-native one. + # + # Adding the arch-specific directory is morally incorrect, as + # miniperl can't load the native modules there. However, it can + # (and sometimes needs to) load and run some of the pure perl + # code there, so we add it anyway. When needed, stubs can be put + # into $mini/lib/perl5/cross_perl/${version}. + wrapProgram $mini/bin/perl --prefix PERL5LIB : \ + "$mini/lib/perl5/cross_perl/${version}:$out/lib/perl5/${version}:$out/lib/perl5/${version}/$runtimeArch" + ''; # */ + + meta = with lib; { + homepage = "https://www.perl.org/"; + description = "The standard implementation of the Perl 5 programming language"; + license = licenses.artistic1; + maintainers = [ maintainers.eelco ]; + platforms = platforms.all; + priority = 6; # in `buildEnv' (including the one inside `perl.withPackages') the library files will have priority over files in `perl` + mainProgram = "perl"; + }; +} // lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) rec { + crossVersion = "84db4c71ae3d3b01fb2966cd15a060a7be334710"; # Nov 29, 2023 + + perl-cross-src = fetchFromGitHub { + name = "perl-cross-${crossVersion}"; + owner = "arsv"; + repo = "perl-cross"; + rev = crossVersion; + sha256 = "sha256-1Zqw4sy/lD2nah0Z8rAE11tSpq1Ym9nBbatDczR+mxs="; + }; + + depsBuildBuild = [ buildPackages.stdenv.cc makeWrapper ]; + + postUnpack = '' + unpackFile ${perl-cross-src} + chmod -R u+w ${perl-cross-src.name} + cp -R ${perl-cross-src.name}/* perl-${version}/ + ''; + + configurePlatforms = [ "build" "host" "target" ]; + + # TODO merge setup hooks + setupHook = ./setup-hook-cross.sh; +}) diff --git a/pkgs/by-name/pe/perl/ld-shared.patch b/pkgs/by-name/pe/perl/ld-shared.patch new file mode 100644 index 0000000..9f92368 --- /dev/null +++ b/pkgs/by-name/pe/perl/ld-shared.patch @@ -0,0 +1,24 @@ +$NetBSD: patch-hints_solaris__2.sh,v 1.2 2015/10/27 09:10:44 jperkin Exp $ + +Redo PR pkg/44999. + +--- perl-5.20.2/hints/solaris_2.sh.orig 2015-05-13 20:19:29.000000000 +0000 ++++ perl-5.20.2/hints/solaris_2.sh +@@ -585,7 +585,7 @@ EOM + fi + fi + case "${cc:-cc} -v 2>/dev/null" in +- *gcc*) ++ *gcc*|clang*) + echo 'int main() { return 0; }' > try.c + case "`${cc:-cc} $ccflags -mcpu=v9 -m64 -S try.c 2>&1 | grep 'm64 is not supported by this configuration'`" in + *"m64 is not supported"*) +@@ -622,7 +622,7 @@ EOM + # use that with Solaris 11 and later, but keep + # the old behavior for older Solaris versions. + case "$osvers" in +- 2.?|2.10) lddlflags="$lddlflags -G -m64" ;; ++ 2.?|2.10) lddlflags="$lddlflags -shared -m64" ;; + *) lddlflags="$lddlflags -shared -m64" ;; + esac + ;; diff --git a/pkgs/by-name/pe/perl/no-sys-dirs-5.31.patch b/pkgs/by-name/pe/perl/no-sys-dirs-5.31.patch new file mode 100644 index 0000000..62dce0e --- /dev/null +++ b/pkgs/by-name/pe/perl/no-sys-dirs-5.31.patch @@ -0,0 +1,254 @@ +diff -ru -x '*~' -x '*.rej' perl-5.20.0-orig/Configure perl-5.20.0/Configure +--- perl-5.20.0-orig/Configure 2014-05-26 15:34:18.000000000 +0200 ++++ perl-5.20.0/Configure 2014-06-25 10:43:35.368285986 +0200 +@@ -106,15 +106,7 @@ + fi + + : Proper PATH setting +-paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin' +-paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin" +-paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin" +-paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin" +-paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb" +-paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /opt/ansic/bin /usr/ccs/bin" +-paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib" +-paths="$paths /sbin /usr/sbin /usr/libexec" +-paths="$paths /system/gnu_library/bin" ++paths='' + + for p in $paths + do +@@ -1337,8 +1329,7 @@ + archname='' + : Possible local include directories to search. + : Set locincpth to "" in a hint file to defeat local include searches. +-locincpth="/usr/local/include /opt/local/include /usr/gnu/include" +-locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include" ++locincpth="" + : + : no include file wanted by default + inclwanted='' +@@ -1349,17 +1340,12 @@ + + libnames='' + : change the next line if compiling for Xenix/286 on Xenix/386 +-xlibpth='/usr/lib/386 /lib/386' ++xlibpth='' + : Possible local library directories to search. +-loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib" +-loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib" ++loclibpth="" + + : general looking path for locating libraries +-glibpth="/lib /usr/lib $xlibpth" +-glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/local/lib" +-test -f /usr/shlib/libc.so && glibpth="/usr/shlib $glibpth" +-test -f /shlib/libc.so && glibpth="/shlib $glibpth" +-test -d /usr/lib64 && glibpth="$glibpth /lib64 /usr/lib64 /usr/local/lib64" ++glibpth="" + + : Private path used by Configure to find libraries. Its value + : is prepended to libpth. This variable takes care of special +@@ -1391,8 +1377,6 @@ + libswanted="$libswanted m crypt sec util c cposix posix ucb bsd BSD" + : We probably want to search /usr/shlib before most other libraries. + : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist. +-glibpth=`echo " $glibpth " | sed -e 's! /usr/shlib ! !'` +-glibpth="/usr/shlib $glibpth" + : Do not use vfork unless overridden by a hint file. + usevfork=false + +@@ -2446,7 +2430,6 @@ + zip + " + pth=`echo $PATH | sed -e "s/$p_/ /g"` +-pth="$pth $sysroot/lib $sysroot/usr/lib" + for file in $loclist; do + eval xxx=\$$file + case "$xxx" in +@@ -4936,7 +4919,7 @@ + : Set private lib path + case "$plibpth" in + '') if ./mips; then +- plibpth="$incpath/usr/lib $sysroot/usr/local/lib $sysroot/usr/ccs/lib" ++ plibpth="$incpath/usr/lib" + fi;; + esac + case "$libpth" in +@@ -8600,13 +8583,8 @@ + echo " " + case "$sysman" in + '') +- syspath='/usr/share/man/man1 /usr/man/man1' +- syspath="$syspath /usr/man/mann /usr/man/manl /usr/man/local/man1" +- syspath="$syspath /usr/man/u_man/man1" +- syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1" +- syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" +- syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1" +- sysman=`./loc . /usr/man/man1 $syspath` ++ syspath='' ++ sysman='' + ;; + esac + if $test -d "$sysman"; then +@@ -19900,9 +19878,10 @@ + case "$full_ar" in + '') full_ar=$ar ;; + esac ++full_ar=ar + + : Store the full pathname to the sed program for use in the C program +-full_sed=$sed ++full_sed=sed + + : see what type gids are declared as in the kernel + echo " " +Only in perl-5.20.0/: Configure.orig +diff -ru -x '*~' -x '*.rej' perl-5.20.0-orig/ext/Errno/Errno_pm.PL perl-5.20.0/ext/Errno/Errno_pm.PL +--- perl-5.20.0-orig/ext/Errno/Errno_pm.PL 2014-05-26 15:34:20.000000000 +0200 ++++ perl-5.20.0/ext/Errno/Errno_pm.PL 2014-06-25 10:31:24.317970047 +0200 +@@ -134,12 +126,7 @@ + if ($dep =~ /(\S+errno\.h)/) { + $file{$1} = 1; + } +- } elsif ($^O eq 'linux' && +- $Config{gccversion} ne '' && +- $Config{gccversion} !~ /intel/i && +- # might be using, say, Intel's icc +- $linux_errno_h +- ) { ++ } elsif (0) { + $file{$linux_errno_h} = 1; + } elsif ($^O eq 'haiku') { + # hidden in a special place +Only in perl-5.20.0/ext/Errno: Errno_pm.PL.orig +diff -ru -x '*~' -x '*.rej' perl-5.20.0-orig/hints/freebsd.sh perl-5.20.0/hints/freebsd.sh +--- perl-5.20.0-orig/hints/freebsd.sh 2014-01-31 22:55:51.000000000 +0100 ++++ perl-5.20.0/hints/freebsd.sh 2014-06-25 10:25:53.263964680 +0200 +@@ -119,21 +119,21 @@ + objformat=`/usr/bin/objformat` + if [ x$objformat = xaout ]; then + if [ -e /usr/lib/aout ]; then +- libpth="/usr/lib/aout /usr/local/lib /usr/lib" +- glibpth="/usr/lib/aout /usr/local/lib /usr/lib" ++ libpth="" ++ glibpth="" + fi + lddlflags='-Bshareable' + else +- libpth="/usr/lib /usr/local/lib" +- glibpth="/usr/lib /usr/local/lib" ++ libpth="" ++ glibpth="" + ldflags="-Wl,-E " + lddlflags="-shared " + fi + cccdlflags='-DPIC -fPIC' + ;; + *) +- libpth="/usr/lib /usr/local/lib" +- glibpth="/usr/lib /usr/local/lib" ++ libpth="" ++ glibpth="" + ldflags="-Wl,-E " + lddlflags="-shared " + cccdlflags='-DPIC -fPIC' +diff -ru -x '*~' -x '*.rej' perl-5.20.0-orig/hints/linux.sh perl-5.20.0/hints/linux.sh +--- perl-5.20.0-orig/hints/linux.sh 2014-05-26 15:34:20.000000000 +0200 ++++ perl-5.20.0/hints/linux.sh 2014-06-25 10:33:47.354883843 +0200 +@@ -150,28 +150,6 @@ case "$optimize" in + ;; + esac + +-# Ubuntu 11.04 (and later, presumably) doesn't keep most libraries +-# (such as -lm) in /lib or /usr/lib. So we have to ask gcc to tell us +-# where to look. We don't want gcc's own libraries, however, so we +-# filter those out. +-# This could be conditional on Unbuntu, but other distributions may +-# follow suit, and this scheme seems to work even on rather old gcc's. +-# This unconditionally uses gcc because even if the user is using another +-# compiler, we still need to find the math library and friends, and I don't +-# know how other compilers will cope with that situation. +-# Morever, if the user has their own gcc earlier in $PATH than the system gcc, +-# we don't want its libraries. So we try to prefer the system gcc +-# Still, as an escape hatch, allow Configure command line overrides to +-# plibpth to bypass this check. +-if [ -x /usr/bin/gcc ] ; then +- gcc=/usr/bin/gcc +-# clang also provides -print-search-dirs +-elif ${cc:-cc} --version 2>/dev/null | grep -q '^clang ' ; then +- gcc=${cc:-cc} +-else +- gcc=gcc +-fi +- + case "$plibpth" in + '') plibpth=`LANG=C LC_ALL=C $gcc $ccflags $ldflags -print-search-dirs | grep libraries | + cut -f2- -d= | tr ':' $trnl | grep -v 'gcc' | sed -e 's:/$::'` +@@ -208,32 +186,6 @@ case "$usequadmath" in + ;; + esac + +-case "$libc" in +-'') +-# If you have glibc, then report the version for ./myconfig bug reporting. +-# (Configure doesn't need to know the specific version since it just uses +-# gcc to load the library for all tests.) +-# We don't use __GLIBC__ and __GLIBC_MINOR__ because they +-# are insufficiently precise to distinguish things like +-# libc-2.0.6 and libc-2.0.7. +- for p in $plibpth +- do +- for trylib in libc.so.6 libc.so +- do +- if $test -e $p/$trylib; then +- libc=`ls -l $p/$trylib | awk '{print $NF}'` +- if $test "X$libc" != X; then +- break +- fi +- fi +- done +- if $test "X$libc" != X; then +- break +- fi +- done +- ;; +-esac +- + if ${sh:-/bin/sh} -c exit; then + echo '' + echo 'You appear to have a working bash. Good.' +@@ -311,33 +263,6 @@ sparc*) + ;; + esac + +-# SuSE8.2 has /usr/lib/libndbm* which are ld scripts rather than +-# true libraries. The scripts cause binding against static +-# version of -lgdbm which is a bad idea. So if we have 'nm' +-# make sure it can read the file +-# NI-S 2003/08/07 +-case "$nm" in +- '') ;; +- *) +- for p in $plibpth +- do +- if $test -r $p/libndbm.so; then +- if $nm $p/libndbm.so >/dev/null 2>&1 ; then +- echo 'Your shared -lndbm seems to be a real library.' +- _libndbm_real=1 +- break +- fi +- fi +- done +- if $test "X$_libndbm_real" = X; then +- echo 'Your shared -lndbm is not a real library.' +- set `echo X "$libswanted "| sed -e 's/ ndbm / /'` +- shift +- libswanted="$*" +- fi +- ;; +-esac +- + # Linux on Synology. + if [ -f /etc/synoinfo.conf -a -d /usr/syno ]; then + # Tested on Synology DS213 and DS413 diff --git a/pkgs/by-name/pe/perl/no-sys-dirs-5.38.0.patch b/pkgs/by-name/pe/perl/no-sys-dirs-5.38.0.patch new file mode 100644 index 0000000..c959730 --- /dev/null +++ b/pkgs/by-name/pe/perl/no-sys-dirs-5.38.0.patch @@ -0,0 +1,256 @@ +diff --git a/Configure b/Configure +index e261cb9548..3bbbc4b9df 100755 +--- a/Configure ++++ b/Configure +@@ -108,15 +108,7 @@ if test -d c:/. || ( uname -a | grep -i 'os\(/\|\)2' 2>&1 ) 2>&1 >/dev/null ; th + fi + + : Proper PATH setting +-paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin' +-paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin" +-paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin" +-paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin" +-paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb" +-paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /opt/ansic/bin /usr/ccs/bin" +-paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib" +-paths="$paths /sbin /usr/sbin /usr/libexec" +-paths="$paths /system/gnu_library/bin" ++paths='' + + for p in $paths + do +@@ -1455,8 +1447,7 @@ groupstype='' + i_whoami='' + : Possible local include directories to search. + : Set locincpth to "" in a hint file to defeat local include searches. +-locincpth="/usr/local/include /opt/local/include /usr/gnu/include" +-locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include" ++locincpth="" + : + : no include file wanted by default + inclwanted='' +@@ -1470,17 +1461,12 @@ DEBUGGING='' + archobjs='' + libnames='' + : change the next line if compiling for Xenix/286 on Xenix/386 +-xlibpth='/usr/lib/386 /lib/386' ++xlibpth='' + : Possible local library directories to search. +-loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib" +-loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib" ++loclibpth="" + + : general looking path for locating libraries +-glibpth="/lib /usr/lib $xlibpth" +-glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/local/lib" +-test -f /usr/shlib/libc.so && glibpth="/usr/shlib $glibpth" +-test -f /shlib/libc.so && glibpth="/shlib $glibpth" +-test -d /usr/lib64 && glibpth="$glibpth /lib64 /usr/lib64 /usr/local/lib64" ++glibpth="" + + : Private path used by Configure to find libraries. Its value + : is prepended to libpth. This variable takes care of special +@@ -1515,8 +1501,6 @@ libswanted="cl pthread socket bind inet ndbm gdbm dbm db malloc dl ld" + libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD" + : We probably want to search /usr/shlib before most other libraries. + : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist. +-glibpth=`echo " $glibpth " | sed -e 's! /usr/shlib ! !'` +-glibpth="/usr/shlib $glibpth" + : Do not use vfork unless overridden by a hint file. + usevfork=false + +@@ -2581,7 +2565,6 @@ uname + zip + " + pth=`echo $PATH | sed -e "s/$p_/ /g"` +-pth="$pth $sysroot/lib $sysroot/usr/lib" + for file in $loclist; do + eval xxx=\$$file + case "$xxx" in +@@ -5023,7 +5006,7 @@ esac + : Set private lib path + case "$plibpth" in + '') if ./mips; then +- plibpth="$incpath/usr/lib $sysroot/usr/local/lib $sysroot/usr/ccs/lib" ++ plibpth="$incpath/usr/lib" + fi;; + esac + case "$libpth" in +@@ -8860,13 +8843,8 @@ esac + echo " " + case "$sysman" in + '') +- syspath='/usr/share/man/man1 /usr/man/man1' +- syspath="$syspath /usr/man/mann /usr/man/manl /usr/man/local/man1" +- syspath="$syspath /usr/man/u_man/man1" +- syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1" +- syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" +- syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1" +- sysman=`./loc . /usr/man/man1 $syspath` ++ syspath='' ++ sysman='' + ;; + esac + if $test -d "$sysman"; then +@@ -21500,9 +21478,10 @@ $rm_try tryp + case "$full_ar" in + '') full_ar=$ar ;; + esac ++full_ar=ar + + : Store the full pathname to the sed program for use in the C program +-full_sed=$sed ++full_sed=sed + + : see what type gids are declared as in the kernel + echo " " +diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL +index ae647d5f06..9a05d66592 100644 +--- a/ext/Errno/Errno_pm.PL ++++ b/ext/Errno/Errno_pm.PL +@@ -135,12 +135,7 @@ sub get_files { + if ($dep =~ /(\S+errno\.h)/) { + push(@file, $1); + } +- } elsif ($^O eq 'linux' && +- $Config{gccversion} ne '' && +- $Config{gccversion} !~ /intel/i && +- # might be using, say, Intel's icc +- $linux_errno_h +- ) { ++ } elsif (0) { + push(@file, $linux_errno_h); + } elsif ($^O eq 'haiku') { + # hidden in a special place +diff --git a/hints/freebsd.sh b/hints/freebsd.sh +index 4d26835e99..c6d365d84d 100644 +--- a/hints/freebsd.sh ++++ b/hints/freebsd.sh +@@ -127,21 +127,21 @@ case "$osvers" in + objformat=`/usr/bin/objformat` + if [ x$objformat = xaout ]; then + if [ -e /usr/lib/aout ]; then +- libpth="/usr/lib/aout /usr/local/lib /usr/lib" +- glibpth="/usr/lib/aout /usr/local/lib /usr/lib" ++ libpth="" ++ glibpth="" + fi + lddlflags='-Bshareable' + else +- libpth="/usr/lib /usr/local/lib" +- glibpth="/usr/lib /usr/local/lib" ++ libpth="" ++ glibpth="" + ldflags="-Wl,-E " + lddlflags="-shared " + fi + cccdlflags='-DPIC -fPIC' + ;; + *) +- libpth="/usr/lib /usr/local/lib" +- glibpth="/usr/lib /usr/local/lib" ++ libpth="" ++ glibpth="" + ldflags="-Wl,-E " + lddlflags="-shared " + cccdlflags='-DPIC -fPIC' +diff --git a/hints/linux.sh b/hints/linux.sh +index e1508c7509..5a187c583a 100644 +--- a/hints/linux.sh ++++ b/hints/linux.sh +@@ -150,28 +150,6 @@ case "$optimize" in + ;; + esac + +-# Ubuntu 11.04 (and later, presumably) doesn't keep most libraries +-# (such as -lm) in /lib or /usr/lib. So we have to ask gcc to tell us +-# where to look. We don't want gcc's own libraries, however, so we +-# filter those out. +-# This could be conditional on Ubuntu, but other distributions may +-# follow suit, and this scheme seems to work even on rather old gcc's. +-# This unconditionally uses gcc because even if the user is using another +-# compiler, we still need to find the math library and friends, and I don't +-# know how other compilers will cope with that situation. +-# Morever, if the user has their own gcc earlier in $PATH than the system gcc, +-# we don't want its libraries. So we try to prefer the system gcc +-# Still, as an escape hatch, allow Configure command line overrides to +-# plibpth to bypass this check. +-if [ -x /usr/bin/gcc ] ; then +- gcc=/usr/bin/gcc +-# clang also provides -print-search-dirs +-elif ${cc:-cc} --version 2>/dev/null | grep -q '^clang ' ; then +- gcc=${cc:-cc} +-else +- gcc=gcc +-fi +- + case "$plibpth" in + '') plibpth=`LANG=C LC_ALL=C $gcc $ccflags $ldflags -print-search-dirs | grep libraries | + cut -f2- -d= | tr ':' $trnl | grep -v 'gcc' | sed -e 's:/$::'` +@@ -208,32 +186,6 @@ case "$usequadmath" in + ;; + esac + +-case "$libc" in +-'') +-# If you have glibc, then report the version for ./myconfig bug reporting. +-# (Configure doesn't need to know the specific version since it just uses +-# gcc to load the library for all tests.) +-# We don't use __GLIBC__ and __GLIBC_MINOR__ because they +-# are insufficiently precise to distinguish things like +-# libc-2.0.6 and libc-2.0.7. +- for p in $plibpth +- do +- for trylib in libc.so.6 libc.so +- do +- if $test -e $p/$trylib; then +- libc=`ls -l $p/$trylib | awk '{print $NF}'` +- if $test "X$libc" != X; then +- break +- fi +- fi +- done +- if $test "X$libc" != X; then +- break +- fi +- done +- ;; +-esac +- + if ${sh:-/bin/sh} -c exit; then + echo '' + echo 'You appear to have a working bash. Good.' +@@ -311,33 +263,6 @@ sparc*) + ;; + esac + +-# SuSE8.2 has /usr/lib/libndbm* which are ld scripts rather than +-# true libraries. The scripts cause binding against static +-# version of -lgdbm which is a bad idea. So if we have 'nm' +-# make sure it can read the file +-# NI-S 2003/08/07 +-case "$nm" in +- '') ;; +- *) +- for p in $plibpth +- do +- if $test -r $p/libndbm.so; then +- if $nm $p/libndbm.so >/dev/null 2>&1 ; then +- echo 'Your shared -lndbm seems to be a real library.' +- _libndbm_real=1 +- break +- fi +- fi +- done +- if $test "X$_libndbm_real" = X; then +- echo 'Your shared -lndbm is not a real library.' +- set `echo X "$libswanted "| sed -e 's/ ndbm / /'` +- shift +- libswanted="$*" +- fi +- ;; +-esac +- + # Linux on Synology. + if [ -f /etc/synoinfo.conf -a -d /usr/syno ]; then + # Tested on Synology DS213 and DS413 diff --git a/pkgs/by-name/pe/perl/packages.nix b/pkgs/by-name/pe/perl/packages.nix new file mode 100644 index 0000000..187aae6 --- /dev/null +++ b/pkgs/by-name/pe/perl/packages.nix @@ -0,0 +1,17 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + perlInterpreters = import ./. { inherit callPackage; }; + inherit (perlInterpreters) perl536 perl538; + + perl536Packages = recurseIntoAttrs perl536.pkgs; + perl538Packages = recurseIntoAttrs perl538.pkgs; + + perl = perl538; + perlPackages = perl538Packages; + + ack = perlPackages.ack; + po4a = perlPackages.Po4a; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Alien-FFI-dont-download.patch b/pkgs/by-name/pe/perl/perl-modules/Alien-FFI-dont-download.patch new file mode 100644 index 0000000..ba79c8c --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Alien-FFI-dont-download.patch @@ -0,0 +1,29 @@ +diff --git a/alienfile b/alienfile +index 18d6b42..5ccf296 100644 +--- a/alienfile ++++ b/alienfile +@@ -11,12 +11,6 @@ plugin 'PkgConfig' => 'libffi'; + + share { + +- plugin 'Download::GitHub' => ( +- github_user => 'libffi', +- github_repo => 'libffi', +- asset => 1, +- ); +- + plugin 'Build::Autoconf' => (); + + my $configure = '--disable-shared --enable-static --disable-builddir'; +diff --git a/t/00_diag.t b/t/00_diag.t +index 51dd784..2bc314c 100644 +--- a/t/00_diag.t ++++ b/t/00_diag.t +@@ -13,7 +13,6 @@ $modules{$_} = $_ for qw( + Alien::Base + Alien::Build + Alien::Build::MM +- Alien::Build::Plugin::Download::GitHub + Alien::Build::Plugin::Probe::Vcpkg + Capture::Tiny + ExtUtils::MakeMaker diff --git a/pkgs/by-name/pe/perl/perl-modules/ArchiveLibarchive-set-findlib-path.patch b/pkgs/by-name/pe/perl/perl-modules/ArchiveLibarchive-set-findlib-path.patch new file mode 100644 index 0000000..47bc8ee --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/ArchiveLibarchive-set-findlib-path.patch @@ -0,0 +1,25 @@ +diff --git a/lib/Archive/Libarchive/Lib.pm b/lib/Archive/Libarchive/Lib.pm +index 3fcbcf4..214df7a 100644 +--- a/lib/Archive/Libarchive/Lib.pm ++++ b/lib/Archive/Libarchive/Lib.pm +@@ -3,7 +3,7 @@ package Archive::Libarchive::Lib; + use strict; + use warnings; + use 5.020; +-use FFI::CheckLib 0.30 qw( find_lib_or_die ); ++use FFI::CheckLib qw( find_lib_or_die ); + use Encode qw( decode ); + use experimental qw( signatures ); + +index 3fcbcf4..718caed 100644 +--- a/lib/Archive/Libarchive/Lib.pm ++++ b/lib/Archive/Libarchive/Lib.pm +@@ -23,7 +23,7 @@ L. + + sub lib + { +- $ENV{ARCHIVE_LIBARCHIVE_LIB_DLL} // find_lib_or_die( lib => 'archive', symbol => ['archive_read_free','archive_write_free','archive_free'], alien => ['Alien::Libarchive3'] ); ++ $ENV{ARCHIVE_LIBARCHIVE_LIB_DLL} // find_lib_or_die( lib => 'archive', symbol => ['archive_read_free','archive_write_free','archive_free'], libpath => '@@libarchive@@' ); + } + + sub ffi diff --git a/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/default.nix b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/default.nix new file mode 100644 index 0000000..516b6d0 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/default.nix @@ -0,0 +1,66 @@ +{ + BioPerl, + IOString, + buildPerlModule, + fetchFromGitHub, + fetchpatch, + fetchurl, + kent, + lib, + libmysqlclient, + libpng, + openssl, + perl +}: + +buildPerlModule rec { + pname = "Bio-BigFile"; + version = "1.07"; + + src = fetchurl { + url = "mirror://cpan/authors/id/L/LD/LDS/Bio-BigFile-${version}.tar.gz"; + sha256 = "277b66ce8acbdd52399e2c5a0cf4e3bd5c74c12b94877cd383d0c4c97740d16d"; + }; + + # Only kent 335 works with Bio-BigFile, see + # - official documentation: https://www.ensembl.org/info/docs/tools/vep/script/vep_download.html#bigfile + # - one of the developer's answer: https://github.com/Ensembl/ensembl-vep/issues/1412 + # BioBigfile needs the environment variable KENT_SRC to find kent + KENT_SRC = kent.overrideAttrs (old: rec { + pname = "kent"; + version = "335"; + + src = fetchFromGitHub { + owner = "ucscGenomeBrowser"; + repo = "kent"; + rev = "v${version}_base"; + sha256 = "1455dwzpaq4hyhcqj3fpwgq5a39kp46qarfbr6ms6l2lz583r083"; + }; + + patches = [ + # Fix for linking error with zlib. Adding zlib as a dependency is not enough + ./kent-utils.patch + # Vendoring upstream patch (not merged in uscsGenomeBrowser/kent) + ./kent-316e4fd40f53c96850128fd65097a42623d1e736.patch + ]; + }); + + + buildInputs = [ + BioPerl + IOString + libpng + libmysqlclient + openssl + ]; + + # Ensure compatibility with GCC-11 (compilation fails if -Wno-format-security) + hardeningDisable = [ "format" ]; + + meta = with lib; { + homepage = "https://metacpan.org/dist/Bio-BigFile"; + description = "Manipulate Jim Kent's BigWig and BigBed index files for genomic features"; + license = licenses.artistic2; + maintainers = with maintainers; [ apraga ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-316e4fd40f53c96850128fd65097a42623d1e736.patch b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-316e4fd40f53c96850128fd65097a42623d1e736.patch new file mode 100644 index 0000000..42d122a --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-316e4fd40f53c96850128fd65097a42623d1e736.patch @@ -0,0 +1,25 @@ +From 316e4fd40f53c96850128fd65097a42623d1e736 Mon Sep 17 00:00:00 2001 +From: Marcel Bargull +Date: Sat, 27 Mar 2021 16:23:34 +0100 +Subject: [PATCH] Fix linking Clang 11 compiled objects + +With Clang 11 htmlRecover from lib/htmshell.h is picked up as a +definition, not just declaration of the jmp_buf. As such both +lib/htmshell.c and hg/lib/cart.c export two symbols with the same name. +--- + src/inc/htmshell.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/inc/htmshell.h b/src/inc/htmshell.h +index 9d85f45b936..dd586db761c 100644 +--- a/src/inc/htmshell.h ++++ b/src/inc/htmshell.h +@@ -160,7 +160,7 @@ void htmlBadVar(char *varName); + void htmlImage(char *fileName, int width, int height); + /* Display centered image file. */ + +-jmp_buf htmlRecover; /* Error recovery jump. Exposed for cart's use. */ ++extern jmp_buf htmlRecover; /* Error recovery jump. Exposed for cart's use. */ + + void htmlVaWarn(char *format, va_list args); + /* Write an error message. (Generally you just call warn() or errAbort(). diff --git a/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-utils.patch b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-utils.patch new file mode 100644 index 0000000..0c1db4d --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Bio-BigFile/kent-utils.patch @@ -0,0 +1,27 @@ +--- ./src/utils/bigWigCat/makefile 2023-03-27 14:03:01.585896516 +0000 ++++ ./src/utils/bigWigCat/makefile 2023-03-27 14:03:27.716180479 +0000 +@@ -1,3 +1,4 @@ + kentSrc = ../.. + A = bigWigCat + include $(kentSrc)/inc/userApp.mk ++L += -lz + +--- ./src/utils/pslLiftSubrangeBlat/makefile 1970-01-01 00:00:01.000000000 +0000 ++++ ./src/utils/pslLiftSubrangeBlat/makefile 2023-03-27 14:36:59.044600213 +0000 +@@ -3,7 +3,7 @@ + preMyLibs += ../../lib/$(MACHTYPE)/jkhgap.a + include $(kentSrc)/inc/userApp.mk + HG_INC += -I../../hg/inc +-L += $(MYSQLLIBS) -lm ++L += $(MYSQLLIBS) -lm -lz + + test:: + cd tests && ${MAKE} test + +--- ./src/utils/bigWigCorrelate/makefile 2023-03-27 14:36:23.117545553 +0000 ++++ ./src/utils/bigWigCorrelate/makefile 2023-03-27 14:36:33.854328176 +0000 +@@ -1,3 +1,4 @@ + kentSrc = ../.. + A = bigWigCorrelate + include $(kentSrc)/inc/userApp.mk ++L += -lz diff --git a/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/default.nix b/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/default.nix new file mode 100644 index 0000000..237a4be --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/default.nix @@ -0,0 +1,36 @@ +{ lib, buildPerlPackage, fetchFromGitHub }: + +buildPerlPackage rec { + pname = "BioExtAlign"; + version = "1.5.1"; + + outputs = [ "out" "dev" ]; + + src = fetchFromGitHub { + owner = "bioperl"; + repo = "bioperl-ext"; + rev = "bioperl-ext-release-${lib.replaceStrings ["."] ["-"] version}"; + sha256 = "sha256-+0tZ6q3PFem8DWa2vq+njOLmjDvMB0JhD0FGk00lVMA="; + }; + + patches = [ ./fprintf.patch ]; + + # Do not install other Bio-ext packages + preConfigure = '' + cd Bio/Ext/Align + ''; + + # Disable tests as it requires Bio::Tools::Align which is in a different directory + buildPhase = '' + make + ''; + + meta = { + homepage = "https://github.com/bioperl/bioperl-ext"; + description = "Write Perl Subroutines in Other Programming Languages"; + longDescription = '' + Part of BioPerl Extensions (BioPerl-Ext) distribution, a collection of Bioperl C-compiled extensions. + ''; + license = with lib.licenses; [ artistic1 ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/fprintf.patch b/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/fprintf.patch new file mode 100644 index 0000000..f62004a --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Bio-Ext-Align/fprintf.patch @@ -0,0 +1,13 @@ +diff --git a/libs/dpalign.c b/libs/dpalign.c +index 0e07b67..0eab932 100644 +--- a/Bio/Ext/Align/libs/dpalign.c ++++ b/Bio/Ext/Align/libs/dpalign.c +@@ -40,7 +40,7 @@ int blosum62[24][24] = { + void + dpAlign_fatal(char * s) + { +- fprintf(stderr, s); ++ fputs(stderr, s); + exit(-1); + } + diff --git a/pkgs/by-name/pe/perl/perl-modules/CSSDOM-replace-apostrophe.patch b/pkgs/by-name/pe/perl/perl-modules/CSSDOM-replace-apostrophe.patch new file mode 100644 index 0000000..54bc7f8 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/CSSDOM-replace-apostrophe.patch @@ -0,0 +1,1412 @@ +commit 7dda09313a63c4c64563f582844d7b04302d94bd +Author: Yves Orton +Date: Wed Feb 22 13:28:01 2023 +0100 + + Replace apostrophe with :: as package separator + + In 5.37.9 this is deprecated, and in 5.40 it will be forbidden + +diff --git a/lib/CSS/DOM/Parser.pm b/lib/CSS/DOM/Parser.pm +index 473992c..d688f19 100644 +--- a/lib/CSS/DOM/Parser.pm ++++ b/lib/CSS/DOM/Parser.pm +@@ -369,7 +369,7 @@ sub _parse_at_rule { for (shift) { for my $tokens (shift) { + + $selector =~ s/s\z// and pop @selector; + +- require CSS'DOM'Rule; ++ require CSS::DOM::Rule; + (my $rule = new CSS::DOM::Rule $_[0]||()) + ->_set_tokens( + $selector,\@selector +@@ -413,7 +413,7 @@ sub _parse_at_rule { for (shift) { for my $tokens (shift) { + my ($types,@tokens) = ("\@$1",$at,splice @$tokens,0,$+[0]); + $types =~ /"/ and return; # ignore rules w/invalid strings + $types =~ s/s\z// and pop @tokens; +- require CSS'DOM'Rule; ++ require CSS::DOM::Rule; + (my $rule = new CSS::DOM::Rule $_[0]||()) + ->_set_tokens( + $types, \@tokens +diff --git a/lib/CSS/DOM/PropertyParser.pm b/lib/CSS/DOM/PropertyParser.pm +index 258158f..76b0d99 100644 +--- a/lib/CSS/DOM/PropertyParser.pm ++++ b/lib/CSS/DOM/PropertyParser.pm +@@ -6,8 +6,8 @@ use warnings; no warnings qw 'utf8 parenthesis'; + use strict; + + use constant 1.03 (); # multiple +-use CSS::DOM'Constants ':primitive', ':value'; +-use CSS'DOM'Util; ++use CSS::DOM::Constants ':primitive', ':value'; ++use CSS::DOM::Util; + + use constant old_perl => $] < 5.01; + { no strict 'refs'; delete ${__PACKAGE__.'::'}{old_perl} } +@@ -19,7 +19,7 @@ use constant old_perl => $] < 5.01; + use constant naughty_perl => 0+$] eq 5.01; + { no strict 'refs'; delete ${__PACKAGE__.'::'}{naughty_perl} } + +-*s2c = *CSS'DOM'Constants'SuffixToConst; ++*s2c = *CSS::DOM::Constants::SuffixToConst; + our %s2c; + + our %compiled; # compiled formats +@@ -60,7 +60,7 @@ sub clone { + # exists &dclone or require Storable, "Storable"->import('dclone'); + # return dclone($_[0]); + require Clone; +- return Clone'clone($_[0]); ++ return Clone::clone($_[0]); + } + + # Declare the variables that the re-evals use. Some nasty hacker went and +@@ -202,7 +202,7 @@ sub _make_arg_list { + my($stypes,$stokens) = _space_out($types, $tokens); + my $css = join "", @$stokens; + if(@_ == 1) { # list property +- my $list = shift @'_; ++ my $list = shift @_; + my $sep = @$list <= 1 ? '' : do { + my $range_start = $$list[0][4]; + my $range_end = $$list[1][4] - length($$list[1][4]) - 1; +@@ -301,7 +301,7 @@ sub _make_arg_list { + + sub _space_out { + my($types,$tokens) = @_; +-Carp'cluck() if ref $tokens ne 'ARRAY'; ++Carp::cluck() if ref $tokens ne 'ARRAY'; + $tokens = [@$tokens]; + my @posses; + $types =~ s/(?<=[^(f])(?![),]|\z)/ +@@ -328,7 +328,7 @@ sub _prep_val { + } + else { + require CSS::DOM::Parser; +- ($types, $tokens) = CSS::DOM::Parser'tokenise($_[0]); ++ ($types, $tokens) = CSS::DOM::Parser::tokenise($_[0]); + } + + # strip out all whitespace tokens +diff --git a/lib/CSS/DOM/Rule.pm b/lib/CSS/DOM/Rule.pm +index 921efb0..666fb08 100644 +--- a/lib/CSS/DOM/Rule.pm ++++ b/lib/CSS/DOM/Rule.pm +@@ -46,7 +46,7 @@ sub _parse { # This method parses the code passed to it and checks to see + # the rule data from the new rule. + my $self = shift; + require CSS::DOM::Parser; +- my $new_rule = CSS::DOM::Parser'parse_statement(shift) ++ my $new_rule = CSS::DOM::Parser::parse_statement(shift) + || die CSS::DOM::Exception->new(SYNTAX_ERR, $@); + + ref $new_rule eq ref $self or die CSS::DOM::Exception->new( +diff --git a/lib/CSS/DOM/Rule/Import.pm b/lib/CSS/DOM/Rule/Import.pm +index 1afdcdc..75c8505 100644 +--- a/lib/CSS/DOM/Rule/Import.pm ++++ b/lib/CSS/DOM/Rule/Import.pm +@@ -45,7 +45,7 @@ sub cssText { + sub href { + my $self =shift; + $self->[hrfe] ||= do { +- require CSS'DOM'Parser; ++ require CSS::DOM::Parser; + if($self->[urlt][00] eq 'u') { + # ~~~ I probably ought to put things like this in a + # Parser::token_val function. +@@ -53,10 +53,10 @@ sub href { + $url =~ s/^url\([ \t\r\n\f]*//; + $url =~ s/[ \t\r\n\f]*\)\z//; + $url =~ s/^['"]// and chop $url; +- CSS'DOM'Parser'unescape($url); ++ CSS::DOM::Parser::unescape($url); + } + else { +- CSS'DOM'Parser'unescape( ++ CSS::DOM::Parser::unescape( + substr $$self[urlt][1], 1, -1 + ) + } +diff --git a/lib/CSS/DOM/Rule/Style.pm b/lib/CSS/DOM/Rule/Style.pm +index dfa7501..54da057 100644 +--- a/lib/CSS/DOM/Rule/Style.pm ++++ b/lib/CSS/DOM/Rule/Style.pm +@@ -93,8 +93,8 @@ sub _selector_matches { # ~~~ Does this work with initial space in the selector? + + # tokenise if necessary + unless(ref $self->[selc]) { +- require CSS'DOM'Parser; +- $self->[selc] = [ CSS'DOM'tokenise($self->[selc]) ]; ++ require CSS::DOM::Parser; ++ $self->[selc] = [ CSS::DOM::tokenise($self->[selc]) ]; + } + + # parse selector tokens if necessary +@@ -130,7 +130,7 @@ sub _selector_matches { # ~~~ Does this work with initial space in the selector? + + # ids: + if($types =~ s/^#//) { +- push @subsel, '#', CSS'DOM'Util'unescape( substr shift @tokens, 1 ), ++ push @subsel, '#', CSS::DOM::Util::unescape( substr shift @tokens, 1 ), + undef; + } + +@@ -138,12 +138,12 @@ sub _selector_matches { # ~~~ Does this work with initial space in the selector? + elsif($types =~ /^di/ && $tokens[0] eq '.') { + $types =~ s/^..//; shift @tokens; + push @subsel, '~', 'class', +- CSS'DOM'Util'unescape( shift @tokens ); ++ CSS::DOM::Util::unescape( shift @tokens ); + } + + # pseudo-elems and classes + elsif($types =~ s/^(::?)i//) { +- push @subsel, $1,lc CSS'DOM'Util'unescape($tokens[length $1]), undef; ++ push @subsel, $1,lc CSS::DOM::Util::unescape($tokens[length $1]), undef; + splice @tokens, 0, $+[0]; + } + +@@ -151,14 +151,14 @@ sub _selector_matches { # ~~~ Does this work with initial space in the selector? + elsif($types =~ s/^:fi\)//) { + push @subsel, + ':', +- lc CSS'DOM'Util'unescape(substr $tokens[1], 0, -1), +- lc CSS'DOM'Util'unescape($tokens[2]); ++ lc CSS::DOM::Util::unescape(substr $tokens[1], 0, -1), ++ lc CSS::DOM::Util::unescape($tokens[2]); + splice @tokens, 0, 4; + } + + # [attr] + elsif($types =~ s/^\[i]//) { +- push @subsel, '=', lc CSS'DOM'Util'unescape($tokens[1]), undef; ++ push @subsel, '=', lc CSS::DOM::Util::unescape($tokens[1]), undef; + splice @tokens, 0, 3; + } + +@@ -166,16 +166,16 @@ sub _selector_matches { # ~~~ Does this work with initial space in the selector? + elsif($types =~ /^\[id']/ && $tokens[2] eq '=') { + $types =~ s/^.{5}//; + push @subsel, '=', +- lc CSS'DOM'Util'unescape($tokens[1]), +- CSS'DOM'Util'unescape_str($tokens[3]); ++ lc CSS::DOM::Util::unescape($tokens[1]), ++ CSS::DOM::Util::unescape_str($tokens[3]); + splice @tokens, 0, 5; + } + + # [attr~='value'], [attr|='value'] + elsif($types =~ s/^\[i[~|]']//) { + push @subsel, $tokens[2], +- lc CSS'DOM'Util'unescape($tokens[1]), +- CSS'DOM'Util'unescape_str($tokens[3]); ++ lc CSS::DOM::Util::unescape($tokens[1]), ++ CSS::DOM::Util::unescape_str($tokens[3]); + splice @tokens, 0, 5; + } + +diff --git a/lib/CSS/DOM/Style.pm b/lib/CSS/DOM/Style.pm +index 47d1291..b42b8db 100644 +--- a/lib/CSS/DOM/Style.pm ++++ b/lib/CSS/DOM/Style.pm +@@ -171,9 +171,9 @@ sub setProperty { + # short-circuit for the common case + length $value or $self->removeProperty($name),return; + +- require CSS'DOM'Parser; +- my @tokens = eval { CSS'DOM'Parser'tokenise_value($value); } +- or die CSS::DOM'Exception->new( SYNTAX_ERR, $@); ++ require CSS::DOM::Parser; ++ my @tokens = eval { CSS::DOM::Parser::tokenise_value($value); } ++ or die CSS::DOM::Exception->new( SYNTAX_ERR, $@); + + # check for whitespace/comment assignment + $tokens[0] =~ /^s+\z/ and $self->removeProperty($name),return; +diff --git a/lib/CSS/DOM/Value.pm b/lib/CSS/DOM/Value.pm +index 45f89e9..83b04e7 100644 +--- a/lib/CSS/DOM/Value.pm ++++ b/lib/CSS/DOM/Value.pm +@@ -7,9 +7,9 @@ use strict; + + use Carp; + use CSS::DOM::Constants; +-use CSS'DOM'Exception 'NO_MODIFICATION_ALLOWED_ERR'; ++use CSS::DOM::Exception 'NO_MODIFICATION_ALLOWED_ERR'; + use Exporter 5.57 'import'; +-use Scalar'Util < weaken reftype >; ++use Scalar::Util < weaken reftype >; + + use constant 1.03 our $_const = { + type => 0, +@@ -46,11 +46,11 @@ sub cssText { + ? $self->[valu] : 'inherit' + if defined wantarray; + if(@_) { +- die new CSS'DOM'Exception ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + "Unowned value objects cannot be modified" + unless my $owner = $self->[ownr]; +- die new CSS'DOM'Exception ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + "CSS::DOM::Value objects that do not know to which " + ."property they belong cannot be modified" +diff --git a/lib/CSS/DOM/Value/List.pm b/lib/CSS/DOM/Value/List.pm +index 85f5ef5..e681fa2 100644 +--- a/lib/CSS/DOM/Value/List.pm ++++ b/lib/CSS/DOM/Value/List.pm +@@ -2,8 +2,8 @@ package CSS::DOM::Value::List; + + $VERSION = '0.17'; + +-use CSS'DOM'Constants ; +-use Scalar'Util 'weaken'; ++use CSS::DOM::Constants ; ++use Scalar::Util 'weaken'; + + # Object of this class are hashes, with the following keys: + # c: CSS code +@@ -14,7 +14,7 @@ use Scalar'Util 'weaken'; + + sub DOES { + return 1 if $_[1] eq 'CSS::DOM::Value'; +- goto &UNIVERSAL'DOES if defined &UNIVERSAL'DOES; ++ goto &UNIVERSAL::DOES if defined &UNIVERSAL::DOES; + } + + use overload +@@ -37,14 +37,14 @@ sub cssText { + if(defined wantarray) {{ + if(!defined $$self{c} || grep ref ne 'ARRAY', @{$$self{v}}) { + @{$$self{v}} or $old = 'none', last; +- require CSS'DOM'Value'Primitive; ++ require CSS::DOM::Value::Primitive; + my @args; my $index = 0; + for(@{$$self{v}}) { + next unless ref eq 'ARRAY'; + @args or @args = ( + (owner => property => @$self{})[0,2,1,3], index => $index + ); +- $_ = new CSS'DOM'Value'Primitive @$_, @args; ++ $_ = new CSS::DOM::Value::Primitive @$_, @args; + } + no warnings 'uninitialized'; + $old = join length $$self{s} ? $$self{s} : ' ', +@@ -53,11 +53,11 @@ sub cssText { + else { $old = $$self{c} } + }} + if(@_) { # assignment +- die new CSS'DOM'Exception ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + "Unowned value objects cannot be modified" + unless my $owner = $self->{o}; +- die new CSS'DOM'Exception ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + "CSS::DOM::Value objects that do not know to which " + ."property they belong cannot be modified" +@@ -67,8 +67,8 @@ sub cssText { + my @arsg + = $owner->property_parser->match($prop, $_[0]) + ) { +- require CSS'DOM'Value; +- CSS'DOM'Value::_apply_args_to_self($self,$owner,$prop,@arsg); ++ require CSS::DOM::Value; ++ CSS::DOM::Value::_apply_args_to_self($self,$owner,$prop,@arsg); + } + + if(my $mh = $owner->modification_handler) { +@@ -89,8 +89,8 @@ sub item { + defined or return; + ref eq 'ARRAY' or return exit die return $_; + +- require CSS'DOM'Value'Primitive; +- return $_ = new CSS'DOM'Value'Primitive ++ require CSS::DOM::Value::Primitive; ++ return $_ = new CSS::DOM::Value::Primitive + @$_, + (owner => property => @$self{})[0,2,1,3], + index => $index; +diff --git a/lib/CSS/DOM/Value/Primitive.pm b/lib/CSS/DOM/Value/Primitive.pm +index 2ce0e9d..2046ff4 100644 +--- a/lib/CSS/DOM/Value/Primitive.pm ++++ b/lib/CSS/DOM/Value/Primitive.pm +@@ -17,7 +17,7 @@ use Exporter 5.57 'import'; + + sub DOES { + return 1 if $_[1] eq 'CSS::DOM::Value'; +- goto &UNIVERSAL'DOES if defined &UNIVERSAL'DOES; ++ goto &UNIVERSAL::DOES if defined &UNIVERSAL::DOES; + } + + use constant 1.03 our $_const = { # Don’t conflict with the superclass! +@@ -203,8 +203,8 @@ sub cssText { + }} + } + if(@_) { +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + "Unowned value objects cannot be modified" + unless my $owner = $self->[ownr]; +@@ -213,15 +213,15 @@ sub cssText { + # deal with formats + if(my $format = $$self[form]) { + if(!our $parser) { +- require CSS'DOM'PropertyParser; ++ require CSS::DOM::PropertyParser; + add_property{ +- $parser = new CSS'DOM'PropertyParser ++ $parser = new CSS::DOM::PropertyParser + } _=>our $prop_spec = {}; + } + our $prop_spec->{format} = $format; + if(my @args = match { our $parser } _=> shift) { +- require CSS'DOM'Value; +- CSS'DOM'Value'_apply_args_to_self( ++ require CSS::DOM::Value; ++ CSS::DOM::Value::_apply_args_to_self( + $self, $owner, $prop, + @args, format => $format, + ); +@@ -231,8 +231,8 @@ sub cssText { + # This is never reached, at least not when CSS::DOM’s mod- + # ules call the constructor: + elsif(!defined $prop) { +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception + NO_MODIFICATION_ALLOWED_ERR, + ref($self) . " objects that do not know to which " + ."property they belong cannot be modified" +@@ -263,8 +263,8 @@ sub cssText { + $index+1..$length-1 + ), + ); +- require CSS'DOM'Value; +- CSS'DOM'Value'_load_if_necessary($arsg[1]); ++ require CSS::DOM::Value; ++ CSS::DOM::Value::_load_if_necessary($arsg[1]); + my $list = $arsg[1]->new( + owner => $owner, + property => $prop, +@@ -284,8 +284,8 @@ sub cssText { + my @arsg + = $owner->property_parser->match($prop, $_[0]) + ) { +- require CSS'DOM'Value; +- CSS'DOM'Value'_apply_args_to_self( ++ require CSS::DOM::Value; ++ CSS::DOM::Value::_apply_args_to_self( + $self, $owner, $prop, @arsg + ); + } +@@ -341,10 +341,10 @@ sub cssValueType { CSS::DOM::Value::CSS_PRIMITIVE_VALUE } + sub primitiveType { shift->[type] } + + sub setFloatValue { +- my ($self,$type,$val) = @'_; ++ my ($self,$type,$val) = @_; + +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception INVALID_ACCESS_ERR, "Invalid value type" ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception INVALID_ACCESS_ERR, "Invalid value type" + if $type == CSS_UNKNOWN || $type == CSS_COUNTER + || $type == CSS_RECT || $type == CSS_RGBCOLOR || $type == CSS_DIMENSION; + +@@ -352,8 +352,8 @@ sub setFloatValue { + # using this API. + no warnings 'numeric'; + $self->cssText(my $css = _serialise($type, $val)); +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception INVALID_ACCESS_ERR, "Invalid value: $css" ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception INVALID_ACCESS_ERR, "Invalid value: $css" + if $self->cssText ne $css; + _: + } +@@ -364,8 +364,8 @@ sub getFloatValue { + # There are more types that are numbers than are not, so we + # invert our list. + my $type = $self->[type]; +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception INVALID_ACCESS_ERR, "Not a numeric value" ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception INVALID_ACCESS_ERR, "Not a numeric value" + if $type == CSS_UNKNOWN || $type == CSS_STRING || $type == CSS_URI + || $type == CSS_IDENT || $type == CSS_ATTR || $type == CSS_COUNTER + || $type == CSS_RECT || $type == CSS_RGBCOLOR; +@@ -380,8 +380,8 @@ sub getStringValue { + my $self = shift; + + my $type = $self->[type]; +- require CSS'DOM'Exception, +- die new CSS'DOM'Exception INVALID_ACCESS_ERR, "Not a string value" ++ require CSS::DOM::Exception, ++ die new CSS::DOM::Exception INVALID_ACCESS_ERR, "Not a string value" + unless $type == CSS_STRING || $type == CSS_URI + || $type == CSS_IDENT || $type == CSS_ATTR; + +diff --git a/t/CSS2Properties.t b/t/CSS2Properties.t +index 315321b..13fc438 100644 +--- a/t/CSS2Properties.t ++++ b/t/CSS2Properties.t +@@ -3,8 +3,8 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; +-sub tests'import { $tests += pop if @_ > 1 }; ++sub tests::VERSION { $tests += pop }; ++sub tests::import { $tests += pop if @_ > 1 }; + use Test::More; + plan tests => $tests; + +diff --git a/t/CSSCharsetRule.t b/t/CSSCharsetRule.t +index 92a8e74..fc3dba5 100644 +--- a/t/CSSCharsetRule.t ++++ b/t/CSSCharsetRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -13,7 +13,7 @@ use_ok 'CSS::DOM::Rule::Charset',; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse( ++ my $ss = CSS::DOM::parse( + '@charset "utf-8";' + ) + )-> cssRules->[0]; +diff --git a/t/CSSFontFaceRule.t b/t/CSSFontFaceRule.t +index 9f4879e..abd5b6c 100644 +--- a/t/CSSFontFaceRule.t ++++ b/t/CSSFontFaceRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -13,7 +13,7 @@ use_ok 'CSS::DOM::Rule::FontFace',; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse( ++ my $ss = CSS::DOM::parse( + '@font-face { font-family: "foo";src:url(bar) }' + ) + )-> cssRules->[0]; +diff --git a/t/CSSImportRule.t b/t/CSSImportRule.t +index 6ec65ef..c8a6a51 100644 +--- a/t/CSSImportRule.t ++++ b/t/CSSImportRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -15,7 +15,7 @@ use_ok 'CSS::DOM::Rule::Import'; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse( ++ my $ss = CSS::DOM::parse( + '@import "foo.css" tv, screen' + ) + )-> cssRules->[0]; +@@ -95,7 +95,7 @@ use tests 5; # styleSheet + 'foo.css' => '@import "bar.css"', + 'bar.css' => 'a { color: blue }', + ); +- is CSS'DOM'parse('@import "foo.css',url_fetcher=>sub{$urls{$_[0]}}) ++ is CSS::DOM::parse('@import "foo.css',url_fetcher=>sub{$urls{$_[0]}}) + ->cssRules->[0]->styleSheet + ->cssRules->[0]->styleSheet + ->cssRules->[0]->style->color, +diff --git a/t/CSSMediaRule.t b/t/CSSMediaRule.t +index fffa7fb..9d01698 100644 +--- a/t/CSSMediaRule.t ++++ b/t/CSSMediaRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -15,7 +15,7 @@ use_ok 'CSS::DOM::Rule::Media'; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse( ++ my $ss = CSS::DOM::parse( + '@media print { body { background: none } }' + ) + )-> cssRules->[0]; +@@ -133,4 +133,4 @@ use tests 4; # deleteRule + cmp_ok $@, '==', CSS::DOM::Exception::INDEX_SIZE_ERR, + 'error raised by deleteRule'; + +-} +\ No newline at end of file ++} +diff --git a/t/CSSPageRule.t b/t/CSSPageRule.t +index 108923e..764e1a1 100644 +--- a/t/CSSPageRule.t ++++ b/t/CSSPageRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -14,7 +14,7 @@ use_ok 'CSS::DOM::Rule::Page',; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse( '@page:first{ margin-top: 3in }') ++ my $ss = CSS::DOM::parse( '@page:first{ margin-top: 3in }') + )-> cssRules->[0]; + + use tests 1; # isa +diff --git a/t/CSSPrimitiveValue.t b/t/CSSPrimitiveValue.t +index 5b30046..ad378f7 100644 +--- a/t/CSSPrimitiveValue.t ++++ b/t/CSSPrimitiveValue.t +@@ -4,8 +4,8 @@ use strict; use warnings; + no warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; +-sub tests'import { $tests += pop if @_ > 1 }; ++sub tests::VERSION { $tests += pop }; ++sub tests::import { $tests += pop if @_ > 1 }; + use Test::More; + plan tests => $tests; + +@@ -441,9 +441,9 @@ for(CSS::DOM::Value::Primitive->new( + # ------------------------------------------ + # Tests for setFloatValue and setStringValue + +-use CSS'DOM'Style; ++use CSS::DOM::Style; + require CSS::DOM::PropertyParser; +-my $s = new CSS'DOM'Style ++my $s = new CSS::DOM::Style + property_parser => $CSS::DOM::PropertyParser::Default; + + for my $meth ('setFloatValue' ,'setStringValue'){ +diff --git a/t/CSSRule.t b/t/CSSRule.t +index b33007c..582eb04 100644 +--- a/t/CSSRule.t ++++ b/t/CSSRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -24,7 +24,7 @@ use tests 7; # constants + + + require CSS::DOM; +-my $ss = CSS::DOM'parse( 'a{text-decoration: none} p { margin: 0 }'); ++my $ss = CSS::DOM::parse( 'a{text-decoration: none} p { margin: 0 }'); + my $rule = cssRules $ss ->[0]; + + use tests 1; # isa +diff --git a/t/CSSRuleList.t b/t/CSSRuleList.t +index bc2bfaf..5cee6f6 100644 +--- a/t/CSSRuleList.t ++++ b/t/CSSRuleList.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/CSSStyleDeclaration-setProperty.t b/t/CSSStyleDeclaration-setProperty.t +index cceb993..d0615b7 100644 +--- a/t/CSSStyleDeclaration-setProperty.t ++++ b/t/CSSStyleDeclaration-setProperty.t +@@ -7,7 +7,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/CSSStyleDeclaration.t b/t/CSSStyleDeclaration.t +index 57bfe98..7bcc370 100644 +--- a/t/CSSStyleDeclaration.t ++++ b/t/CSSStyleDeclaration.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis regexp once qw'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -26,7 +26,7 @@ use tests 3; # first make sure we can use it without loading CSS::DOM + + + require CSS::DOM; +-my $ss = CSS::DOM'parse ('a{text-decoration: none} p { margin: 0 }'); ++my $ss = CSS::DOM::parse ('a{text-decoration: none} p { margin: 0 }'); + my $rule = cssRules $ss ->[0]; + my $decl = $rule->style; + +@@ -105,7 +105,7 @@ like $decl->cssText, qr/color: blue !very\\ important/, + + use tests 4; # length + { +- my $decl = new CSS'DOM'Style; ++ my $decl = new CSS::DOM::Style; + is eval { $decl->length }, 0, # This used to die [RT #54810] + 'length when no properties have been added'; # (fixed in 0.09). + $decl = CSS::DOM::Style::parse( +diff --git a/t/CSSStyleRule.t b/t/CSSStyleRule.t +index 024012b..fb550da 100644 +--- a/t/CSSStyleRule.t ++++ b/t/CSSStyleRule.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -14,7 +14,7 @@ use_ok 'CSS::DOM::Rule::Style',; + + require CSS::DOM; + my $rule = ( +- my $ss = CSS::DOM'parse('a{text-decoration: none} p { margin: 0 }') ++ my $ss = CSS::DOM::parse('a{text-decoration: none} p { margin: 0 }') + )-> cssRules->[0]; + + use tests 1; # isa +diff --git a/t/CSSStyleSheet-insertRule.t b/t/CSSStyleSheet-insertRule.t +index 3302966..94b3ee7 100644 +--- a/t/CSSStyleSheet-insertRule.t ++++ b/t/CSSStyleSheet-insertRule.t +@@ -7,7 +7,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -19,4 +19,3 @@ ok eval{$ss->insertRule('a{ color: red }',0);1}, + 'insertRule on empty style sheet doesn\'t die'; + # At one point during development, it did die because it was call- + # ing methods on CSS::DOM::RuleParser which hadn’t been loaded. +- +diff --git a/t/CSSStyleSheet.t b/t/CSSStyleSheet.t +index ab82e6a..40b3edf 100644 +--- a/t/CSSStyleSheet.t ++++ b/t/CSSStyleSheet.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -30,7 +30,7 @@ use tests 3; # (_set_)ownerRule + + use tests 2; # cssRules + { +- $ss = CSS::DOM'parse( 'a{text-decoration: none} p { margin: 0 }'); ++ $ss = CSS::DOM::parse( 'a{text-decoration: none} p { margin: 0 }'); + is +()=$ss->cssRules, 2, 'cssRules in list context'; + isa_ok my $rules = cssRules $ss, 'CSS::DOM::RuleList', + 'cssRules in scalar context'; +@@ -38,7 +38,7 @@ use tests 2; # cssRules + + use tests 11; # insertRule + { +- $ss = CSS::DOM'parse ('a{text-decoration: none} p { margin: 0 }'); ++ $ss = CSS::DOM::parse ('a{text-decoration: none} p { margin: 0 }'); + + is $ss->insertRule('b { font-weight: bold }', 0), 0, + 'retval of insertRule'; +@@ -70,7 +70,7 @@ use tests 11; # insertRule + + use tests 4; # deleteRule + { +- $ss = CSS::DOM'parse ('a{text-decoration: none} p { margin: 0 } ++ $ss = CSS::DOM::parse ('a{text-decoration: none} p { margin: 0 } + i {}'); + is +()=$ss->deleteRule(1), 0, 'retval of deleteRule'; + is_deeply [map $_->selectorText, $ss->cssRules], [qw/ a i /], +@@ -82,4 +82,4 @@ use tests 4; # deleteRule + cmp_ok $@, '==', CSS::DOM::Exception::INDEX_SIZE_ERR, + 'error raised by deleteRule'; + +-} +\ No newline at end of file ++} +diff --git a/t/CSSValue-prim-cssText.t b/t/CSSValue-prim-cssText.t +index 09f657b..b19836a 100644 +--- a/t/CSSValue-prim-cssText.t ++++ b/t/CSSValue-prim-cssText.t +@@ -6,7 +6,7 @@ + use strict; use warnings; no warnings qw 'qw regexp once utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/CSSValue.t b/t/CSSValue.t +index 5fad855..f5a04d0 100644 +--- a/t/CSSValue.t ++++ b/t/CSSValue.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'qw regexp once utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -38,7 +38,7 @@ isa_ok +CSS::DOM::Value->new(type => &CSS_CUSTOM, value => "top left"), + + require CSS::DOM::Style; + require CSS::DOM::PropertyParser; +-my $s = new CSS'DOM'Style ++my $s = new CSS::DOM::Style + property_parser => my $spec = $CSS::DOM::PropertyParser::Default; + + # The default parser has no properties with a simple string, attr or +diff --git a/t/CSSValueList.t b/t/CSSValueList.t +index 1805209..25c1bec 100644 +--- a/t/CSSValueList.t ++++ b/t/CSSValueList.t +@@ -3,17 +3,17 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +-use CSS'DOM'Constants ':primitive'; +-use CSS'DOM'Value'List; ++use CSS::DOM::Constants ':primitive'; ++use CSS::DOM::Value::List; + + use tests 1; # DOES +-ok +CSS'DOM'Value'List->DOES('CSS::DOM::Value'), 'DOES'; ++ok +CSS::DOM::Value::List->DOES('CSS::DOM::Value'), 'DOES'; + +-my $v = new CSS'DOM'Value'List values => [ ++my $v = new CSS::DOM::Value::List values => [ + [ type => CSS_STRING, value => 'sphed' ], + [ type => CSS_STRING, value => 'flit' ], + ]; +diff --git a/t/MediaList.t b/t/MediaList.t +index 3092c62..0888d61 100644 +--- a/t/MediaList.t ++++ b/t/MediaList.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/RGBColor.t b/t/RGBColor.t +index 3758529..12d2938 100644 +--- a/t/RGBColor.t ++++ b/t/RGBColor.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/Rect.t b/t/Rect.t +index e7f83a4..ea8f046 100644 +--- a/t/Rect.t ++++ b/t/Rect.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -25,4 +25,4 @@ use tests 4; + is $v->left->cssText, '4cm', 'left'; + } + +-# ~~~ test for modifications of the cssText property +\ No newline at end of file ++# ~~~ test for modifications of the cssText property +diff --git a/t/StyleSheet.t b/t/StyleSheet.t +index a4469fb..e84e7d4 100644 +--- a/t/StyleSheet.t ++++ b/t/StyleSheet.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -55,7 +55,7 @@ use tests 1; # (set_)href + + use tests 1; # title + { +- sub foo'attr { return shift->{+shift} } ++ sub foo::attr { return shift->{+shift} } + $ss->set_ownerNode(my $foo = bless {title => 'tilde'}, 'foo'); + is $ss->title, 'tilde', 'title'; + } +diff --git a/t/StyleSheetList.t b/t/StyleSheetList.t +index 8e8c7cf..745f894 100644 +--- a/t/StyleSheetList.t ++++ b/t/StyleSheetList.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/charset.t b/t/charset.t +index eed053e..1666157 100644 +--- a/t/charset.t ++++ b/t/charset.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/css-dom-interface.t b/t/css-dom-interface.t +index 41bca29..76e5f2f 100644 +--- a/t/css-dom-interface.t ++++ b/t/css-dom-interface.t +@@ -6,7 +6,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/css-dom-style.t b/t/css-dom-style.t +index f852f6f..9a6582f 100644 +--- a/t/css-dom-style.t ++++ b/t/css-dom-style.t +@@ -6,13 +6,13 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + + use tests 4; # modification_handler + require CSS::DOM::Style; +-my $style = CSS::DOM::Style'parse('margin-top: 2px'); ++my $style = CSS::DOM::Style::parse('margin-top: 2px'); + $style->modification_handler(sub { ++$}; ${{} .= shift}); + $style->cssText('margin-bottom: 600%'); + is $}, 1, 'cssText triggers mod hander'; +@@ -25,4 +25,3 @@ is $}, 3, 'AUTOLOAD triggers the handler'; + # ~~~ We also needs tests for modification_handler triggered by: + # • removeProperty + # • modifications to CSSValue objects and their sub-objects (RGBColor etc +- +diff --git a/t/css-dom-util.t b/t/css-dom-util.t +index 5dbef09..554cd1b 100644 +--- a/t/css-dom-util.t ++++ b/t/css-dom-util.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +diff --git a/t/css-dom.t b/t/css-dom.t +index e36a046..d43d458 100644 +--- a/t/css-dom.t ++++ b/t/css-dom.t +@@ -3,7 +3,7 @@ + use strict; use warnings; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -28,7 +28,7 @@ use tests 1; # compute_style + local $SIG{__WARN__} = sub { $w .= shift }; + require CSS::DOM::Style; + my $elem = bless{ +- style => CSS'DOM'Style'parse('color:red'), tagName => 'p', ++ style => CSS::DOM::Style::parse('color:red'), tagName => 'p', + }, MyElem=>; + CSS::DOM::compute_style(element => $elem); + is $w, undef, 'no warnings for style belonging to element itself'; +diff --git a/t/parser-rules.t b/t/parser-rules.t +index 16cb536..7387caf 100644 +--- a/t/parser-rules.t ++++ b/t/parser-rules.t +@@ -8,7 +8,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -35,7 +35,7 @@ use tests 2; # miscellaneous CSS::DOM::parse stuff + + use tests 7; # + { +- my $sheet = CSS'DOM'parse ' ++ my $sheet = CSS::DOM::parse ' + /* /**/ + @at-rule {/* +@@ -46,9 +46,9 @@ use tests 7; # + '@at-rule {/*'; +- CSS'DOM'parse 'a { --> }'; ++ CSS::DOM::parse 'a { --> }'; + ok $@, 'invalid -->'; +- CSS'DOM'parse 'a { a { }');1}, + 'invalid --> before statement'; +@@ -62,7 +62,7 @@ use tests 7; # + + use tests 5; # single statement parser + { +- my $sheet = new CSS'DOM; ++ my $sheet = new CSS::DOM; + $sheet->insertRule('phoo { bar : baz} ',0); + isa_ok cssRules$sheet->[0], 'CSS::DOM::Rule::Style', + 'ruleset created by insertRule'; +@@ -79,36 +79,36 @@ use tests 5; # single statement parser + + use tests 9; # styledecl parser + { +- my $style = CSS'DOM'Style'parse ' foo : bar '; ++ my $style = CSS::DOM::Style::parse ' foo : bar '; + is $style->cssText, 'foo: bar', 'style parser'; +- CSS'DOM'Style'parse 'foo: bar}'; ++ CSS::DOM::Style::parse 'foo: bar}'; + ok $@, 'style parser chokes on }'; +- is CSS'DOM'Style'parse ' ; ;;;;;foo : bar ;;;; ; ',->cssText, ++ is CSS::DOM::Style::parse ' ; ;;;;;foo : bar ;;;; ; ',->cssText, + 'foo: bar', 'style wit extra semicolons'; +- is CSS'DOM'Style'parse 'foo:bar',->cssText, ++ is CSS::DOM::Style::parse 'foo:bar',->cssText, + 'foo: bar', 'style with no space'; +- is CSS'DOM'Style'parse 'foo:bar;;;baz:bonk;;',->cssText, ++ is CSS::DOM::Style::parse 'foo:bar;;;baz:bonk;;',->cssText, + 'foo: bar; baz: bonk', + 'style with no space & extra semicolons'; +- is CSS'DOM'Style'parse 'foo:bar;;;!baz:bonk;;',->cssText, ++ is CSS::DOM::Style::parse 'foo:bar;;;!baz:bonk;;',->cssText, + 'foo: bar', + 'style with delimiter+ident for property name'; +- is CSS'DOM'Style'parse '\70\41 dding:0;;;;;',->cssText, ++ is CSS::DOM::Style::parse '\70\41 dding:0;;;;;',->cssText, + 'padding: 0', + 'style with escaped property name'; + +- is CSS'DOM'Style'parse '\a\z\A\Z\)\a a :bar', ++ is CSS::DOM::Style::parse '\a\z\A\Z\)\a a :bar', + ->getPropertyValue("\nz\nZ)\na"), 'bar', + 'style with both kinds of ident escapes'; + + { package Phoo; use overload '""'=>sub{'foo:bar'}} +- is CSS'DOM'Style'parse(bless [], 'Phoo')->cssText, 'foo: bar', ++ is CSS::DOM::Style::parse(bless [], 'Phoo')->cssText, 'foo: bar', + '::Style::parse\'s force stringification'; + } + + use tests 121; # @media + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@media print{a{color:blue}}',0); + isa_ok $rule=pop@{$sheet->cssRules}, 'CSS::DOM::Rule::Media', +@@ -464,7 +464,7 @@ use tests 121; # @media + is $rule->cssText, "\@meDIa { }\n", + 'serialised empty unclosed fake @meDIa rule w/ws'; + +- $sheet = CSS'DOM'parse ' ++ $sheet = CSS::DOM::parse ' + @media print { a { color: blue } "stuff"} + td { padding: 0 } + '; +@@ -496,7 +496,7 @@ use tests 121; # @media + + use tests 1; # bracket closure + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@unknown {(rect([',0); + is +($rule=pop@{$sheet->cssRules})->cssText, +@@ -506,7 +506,7 @@ use tests 1; # bracket closure + + use tests 14; # @page + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@page{color:blue}',0); + is +($rule=pop@{$sheet->cssRules})->type, PAGE_RULE, +@@ -553,7 +553,7 @@ use tests 14; # @page + + use tests 6; # unrecognised at-rules + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@unknown \ / \ / :-P {...}',0); + is +($rule=pop@{$sheet->cssRules})->type, UNKNOWN_RULE, +@@ -579,7 +579,7 @@ use tests 6; # unrecognised at-rules + + use tests 6; # ruselet pasrer + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('a{text-decoration:none;color:blue}',0); + is +($rule=pop@{$sheet->cssRules})->type, STYLE_RULE, +@@ -605,7 +605,7 @@ use tests 6; # ruselet pasrer + + use tests 1; # invaldi strings + { +- my $sheet = CSS'DOM'parse q* ++ my $sheet = CSS::DOM::parse q* + p { + color: green; + font-family: 'Courier New Times +@@ -634,51 +634,51 @@ use tests 1; # invaldi strings + + use tests 10; # invalid closing brackets + { +- is CSS'DOM'parse q" @eotetet ]" =>-> cssRules->length,0, ++ is CSS::DOM::parse q" @eotetet ]" =>-> cssRules->length,0, + 'invalid closing bracket in unknown rule'; + ok $@, '$@ is set by invalid closing bracket in unknown rule'; +- is CSS'DOM'parse q" @media { ]" =>-> cssRules->length, 0, ++ is CSS::DOM::parse q" @media { ]" =>-> cssRules->length, 0, + 'invalid closing bracket in media rule'; + ok $@, '$@ is set by invalid closing bracket in media rule'; +- is CSS'DOM'parse q" @page { ]" =>-> cssRules->length, 0, ++ is CSS::DOM::parse q" @page { ]" =>-> cssRules->length, 0, + 'invalid closing bracket in page rule'; + ok $@, '$@ is set by invalid closing bracket in page rule'; +- is CSS'DOM'parse q" page ( ]" =>-> cssRules->length, 0, ++ is CSS::DOM::parse q" page ( ]" =>-> cssRules->length, 0, + 'invalid closing bracket in selector'; + ok $@, '$@ is set by invalid closing bracket in selector'; +- is CSS'DOM'parse q" a { (}" =>-> cssRules->length, 0, ++ is CSS::DOM::parse q" a { (}" =>-> cssRules->length, 0, + 'invalid closing bracket in style declaration'; + ok $@, '$@ is set by invalid closing bracket in selector'; + } + + use tests 14; # invalid [\@;] + { +- is CSS'DOM'parse q" @eotetet @aa ]" =>-> cssRules->length,0, ++ is CSS::DOM::parse q" @eotetet @aa ]" =>-> cssRules->length,0, + 'invalid @ in unknown rule'; + ok $@, '$@ is set by invalid @ in unknown rule'; +- is CSS'DOM'parse q" @eotetet aa (;" =>-> cssRules->length,0, ++ is CSS::DOM::parse q" @eotetet aa (;" =>-> cssRules->length,0, + 'invalid ; in unknown rule'; + ok $@, '$@ is set by invalid ; in unknown rule'; +- is CSS'DOM'parse q" @media {(; { " =>-> cssRules->length,0, ++ is CSS::DOM::parse q" @media {(; { " =>-> cssRules->length,0, + 'invalid ; in media rule'; + ok $@, '$@ is set by invalid ; in media rule'; +- is CSS'DOM'parse q" @page { (;fooo" =>-> cssRules->length,0, ++ is CSS::DOM::parse q" @page { (;fooo" =>-> cssRules->length,0, + 'invalid ; in page rule'; + ok $@, '$@ is set by invalid ; in page rule'; +- is CSS'DOM'parse q" page @oo " =>-> cssRules->length,0, ++ is CSS::DOM::parse q" page @oo " =>-> cssRules->length,0, + 'invalid @ in selector'; + ok $@, '$@ is set by invalid @ in selector'; +- is CSS'DOM'parse q" page ;( " =>-> cssRules->length,0, ++ is CSS::DOM::parse q" page ;( " =>-> cssRules->length,0, + 'invalid ; in selector'; + ok $@, '$@ is set by invalid ; in selector'; +- is CSS'DOM'parse q" a { ( ;( " =>-> cssRules->length,0, ++ is CSS::DOM::parse q" a { ( ;( " =>-> cssRules->length,0, + 'invalid ; in style declaration'; + ok $@, '$@ is set by invalid ; in style declaration'; + } + + use tests 14; # @import + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@import"foo.css"print,screen;',0); + is +($rule=pop@{$sheet->cssRules})->type, IMPORT_RULE, +@@ -722,7 +722,7 @@ use tests 14; # @import + + use tests 8; # @font-face + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@font-face{color:blue}',0); + is +($rule=pop@{$sheet->cssRules})->type, FONT_FACE_RULE, +@@ -751,7 +751,7 @@ use tests 8; # @font-face + + use tests 13; # @charset + { +- my $sheet = new CSS'DOM; my $rule; ++ my $sheet = new CSS::DOM; my $rule; + + $sheet->insertRule('@charset "utf-8";',0); + is +($rule=pop@{$sheet->cssRules})->type, CHARSET_RULE, +@@ -799,4 +799,3 @@ use tests 13; # @charset + is +($rule=pop@{$sheet->cssRules})->type, UNKNOWN_RULE, + '@charset w/space b4 ; is an unknown rule'; + } +- +diff --git a/t/parser-tokens.t b/t/parser-tokens.t +index 9c0fae3..d6a42b7 100644 +--- a/t/parser-tokens.t ++++ b/t/parser-tokens.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -37,7 +37,7 @@ for('_', 'a'..'z', 'A'.."Z", map(chr,0x80..0x100) ,"\x{2003}","\x{3000}"){ + { + my $style = CSS::DOM::Style::parse("--a: 65"); + is $style->cssText, '', 'identifier can\'t begin with --'; +- $style = CSS'DOM'Style'parse"-0b:-0b"; ++ $style = CSS::DOM::Style::parse"-0b:-0b"; + is $style->cssText, '', 'nor with -0'; + } + +@@ -49,7 +49,7 @@ use tests 8; # strings + . q/\'\"/; + my $expect = + qq/ \x{10ffff}f-_abcABC}}}}}}}}\xff\x{2003}\x{100}\t'"/; +- my $rule = new CSS::DOM::Rule'Import; ++ my $rule = new CSS::DOM::Rule::Import; + + $rule->cssText('@import ' . "'$nasty_escaped_string'"); + is $rule->href, $expect, "'...'"; +@@ -80,7 +80,7 @@ use tests 8; # strings + + use tests 23; # urls + { +- my $rule = new CSS'DOM'Rule::Import; ++ my $rule = new CSS::DOM::Rule::Import; + + $rule->cssText('@import url(!$#%&][\\\}|{*~foo/bar.gif)'); + is $rule->href, '!$#%&][\}|{*~foo/bar.gif', 'unquoted url'; +@@ -118,7 +118,7 @@ use tests 23; # urls + is $rule->href, "\x{2000}\x{2000}\n 0 )\tz", + 'double-quoted url with escapes'; + +- my $style = new CSS'DOM'Style; ++ my $style = new CSS::DOM::Style; + + $style->name('url(foo'); + is $style->name, 'url(foo)', 'unquoted, unterminated url'; +@@ -179,7 +179,7 @@ use tests 3; # spaces and comments + "name:valu /*eeeee " + ); + is $style->name, 'valu', 'another ws /**/ test'; +- $style = CSS'DOM'Style'parse( "name: /*\n*/valu"); ++ $style = CSS::DOM::Style::parse( "name: /*\n*/valu"); + is $style->name, 'valu', 'multiline comments'; + } + +@@ -187,27 +187,27 @@ use tests 3; # spaces and comments + + use tests 6; # + { +- my $sheet = CSS'DOM'parse ' @media print{}'; ++ my $sheet = CSS::DOM::parse ' @media print{}'; + is join('',map cssText$_,cssRules$sheet), + "{ name: value }\n\@media print {\n}\n", + 'ignored '; +- is CSS'DOM'parse"{}{name: value; n:v}" =>-> ++ is CSS::DOM::parse"{}{name: --> value; n:v}" =>-> + cssRules->length, + 1, + 'invalid -->'; + ok $@, '$@ after invalid -->'; +- is CSS'DOM'Style'parse"name:'",->name, ++ is CSS::DOM::Style::parse"name:'",->name, + "''", ' in a string'; + } + + use tests 1; # miscellaneous tokens + { +- my $sheet = CSS'DOM'parse '@foo ()[~=:,./+-]{[("\"'; ++ my $sheet = CSS::DOM::parse '@foo ()[~=:,./+-]{[("\"'; + is $sheet->cssRules->[0]->cssText, + '@foo ()[~=:,./+-]{[("\"")]}'. "\n", + 'miscellaneous tokens' +diff --git a/t/property-parser.t b/t/property-parser.t +index 6423b39..f785054 100644 +--- a/t/property-parser.t ++++ b/t/property-parser.t +@@ -3,7 +3,7 @@ + use strict; use warnings; no warnings qw 'utf8 parenthesis regexp once qw'; + our $tests; + BEGIN { ++$INC{'tests.pm'} } +-sub tests'VERSION { $tests += pop }; ++sub tests::VERSION { $tests += pop }; + use Test::More; + plan tests => $tests; + +@@ -18,11 +18,11 @@ isa_ok my $parser = CSS::DOM::PropertyParser->new, + + use tests 4; # clone + my $clone = (my $css21 = $CSS::DOM::PropertyParser::CSS21)->clone; +-isn't $clone, $css21, 'clone at the first level'; +-isn't $clone->get_property('background-position'), ++isnt $clone, $css21, 'clone at the first level'; ++isnt $clone->get_property('background-position'), + $css21->get_property('background-position'), + 'clone clones individual property specs'; +-isn't ++isnt + $clone->get_property('border-color')->{properties} + {'border-top-color'}, + $css21->get_property('border-color')->{properties} +@@ -1314,17 +1314,17 @@ use tests 2; # parsing colours + { # Tests for problems with colours in cygwin’s perl (broken in 0.08; fixed + # in 0.09) and for bugs temporarily introduced while those problems were + # being addressed. +- my $p = new CSS'DOM'PropertyParser; ++ my $p = new CSS::DOM::PropertyParser; + $p->add_property( + 'colours' => { + format => '+', + }, + ); +- my $s = CSS'DOM'Style'parse( ++ my $s = CSS::DOM::Style::parse( + "colours: rgb(0,0,0) rgb(1,1,1)", + property_parser => $p + ); +- use CSS'DOM'Constants 'CSS_CUSTOM'; ++ use CSS::DOM::Constants 'CSS_CUSTOM'; + is $s->getPropertyCSSValue('colours')->cssValueType, CSS_CUSTOM, + 'quantified s'; + $p->add_property( +@@ -1346,18 +1346,18 @@ use tests 1; # backtracking with list properties + # local ${$whatever}[0] localises one element. But it actually + # replaces the array temporarily with a new one, which cannot + # work with references. +- my $p = new CSS'DOM'PropertyParser; ++ my $p = new CSS::DOM::PropertyParser; + $p->add_property( + 'foo' => { + format => '[(foo)|(foo),]+', # [(foo),?]+ does not trigger the bug + list => 1, + }, + ); +- my $s = CSS'DOM'Style'parse( ++ my $s = CSS::DOM::Style::parse( + "foo: foo, foo", + property_parser => $p + ); +- use CSS'DOM'Constants 'CSS_VALUE_LIST'; ++ use CSS::DOM::Constants 'CSS_VALUE_LIST'; + is_deeply [map cssText $_, @{$s->getPropertyCSSValue('foo')}],[('foo')x2], + 'backtracking does not preserve existing captures'; + } diff --git a/pkgs/by-name/pe/perl/perl-modules/CatalystAuthenticationStoreHtpasswd-test-replace-DES-hash-with-bcrypt.patch b/pkgs/by-name/pe/perl/perl-modules/CatalystAuthenticationStoreHtpasswd-test-replace-DES-hash-with-bcrypt.patch new file mode 100644 index 0000000..f3ce028 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/CatalystAuthenticationStoreHtpasswd-test-replace-DES-hash-with-bcrypt.patch @@ -0,0 +1,12 @@ +Replaces the legacy DES crypt hash used in tests with a stronger +bcrypt function, as crypt() in pkgs.perl no longer supports DES + +# htpasswd -nbB mufasa "Circle of Life" + +diff --git a/t/lib/TestApp/htpasswd b/t/lib/TestApp/htpasswd +index 6cec784..91e5375 100644 +--- a/t/lib/TestApp/htpasswd ++++ b/t/lib/TestApp/htpasswd +@@ -1 +1 @@ +-mufasa:Y7hn4ncIVPOuI ++mufasa:$2y$05$.KPC4Gja9L5AxJATDQBzs.lCHkm49l/9dcoyPcJg0JhyIvsD6Gqza diff --git a/pkgs/by-name/pe/perl/perl-modules/CatalystXScriptServerStarman-fork-arg.patch b/pkgs/by-name/pe/perl/perl-modules/CatalystXScriptServerStarman-fork-arg.patch new file mode 100644 index 0000000..af7dc0d --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/CatalystXScriptServerStarman-fork-arg.patch @@ -0,0 +1,11 @@ +diff --git a/lib/CatalystX/Script/Server/Starman.pm b/lib/CatalystX/Script/Server/Starman.pm +index 670bd74..7b3bd2e 100644 +--- a/lib/CatalystX/Script/Server/Starman.pm ++++ b/lib/CatalystX/Script/Server/Starman.pm +@@ -9,5 +9,5 @@ our $VERSION = '0.02'; + + extends 'Catalyst::Script::Server'; + +-has '+fork' => ( default => 1, init_arg => undef ); ++has '+fork' => ( default => 1 ); + diff --git a/pkgs/by-name/pe/perl/perl-modules/DBD-SQLite/external-sqlite.patch b/pkgs/by-name/pe/perl/perl-modules/DBD-SQLite/external-sqlite.patch new file mode 100644 index 0000000..5aafa46 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/DBD-SQLite/external-sqlite.patch @@ -0,0 +1,11 @@ +--- a/Makefile.PL 2016-04-21 15:44:34.000000000 +0200 ++++ b/Makefile.PL 2017-10-31 11:04:28.389959946 +0100 +@@ -129,7 +129,7 @@ + # a system sqlite is also sophisticated enough to have a patching system + # that can change the if ( 0 ) to if ( 1 ) + my ($sqlite_local, $sqlite_base, $sqlite_lib, $sqlite_inc); +-if ( 0 ) { ++if ( 1 ) { + require File::Spec; + if ( $sqlite_base = (grep(/SQLITE_LOCATION=.*/, @ARGV))[0] ) { + $sqlite_base =~ /=(.*)/; diff --git a/pkgs/by-name/pe/perl/perl-modules/Data-Clone-fix-apostrophe-package-separator.patch b/pkgs/by-name/pe/perl/perl-modules/Data-Clone-fix-apostrophe-package-separator.patch new file mode 100644 index 0000000..4d2bef1 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Data-Clone-fix-apostrophe-package-separator.patch @@ -0,0 +1,26 @@ +https://github.com/gfx/p5-Data-Clone/pull/3 + +From 43102a83d15aedc61e5904eb5a6dab33c3c02b40 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Thu, 9 Feb 2023 16:24:45 +0100 +Subject: [PATCH] t/07_stack.t - isn't is deprecated, use isnt instead + +As of 5.37.8 use of apostrophe for a package separator is deprecated, +and in 5.40 it will be removed entirely. Switch to isnt() instead +of isn't(). +--- + t/07_stack.t | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/t/07_stack.t b/t/07_stack.t +index 165e6a5..a750366 100644 +--- a/t/07_stack.t ++++ b/t/07_stack.t +@@ -17,6 +17,6 @@ use Data::Clone; + + my $before = bless [], Bar::; + my $after = clone($before); +-isn't $after, $before, 'stack reallocation during callback'; ++isnt $after, $before, 'stack reallocation during callback'; + + done_testing; \ No newline at end of file diff --git a/pkgs/by-name/pe/perl/perl-modules/Data-UUID-CVE-2013-4184.patch b/pkgs/by-name/pe/perl/perl-modules/Data-UUID-CVE-2013-4184.patch new file mode 100644 index 0000000..731e2ee --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Data-UUID-CVE-2013-4184.patch @@ -0,0 +1,214 @@ +Eliminate use of state/node files in temp directory, which are a security concern due to insecure writing of State/Node files in a temporary directory, with predictable filenames, with a possible symlink attack. + +Fixes CVE-2013-4184 + +https://github.com/bleargh45/Data-UUID/pull/40 by Graham TerMarsch @bleargh45 + + +diff --git a/Makefile.PL b/Makefile.PL +index 4ca26af..fb1a0f0 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -89,30 +89,14 @@ WriteMakefile( + + CONFIGURE => sub { + my %opt; +- GetOptions(\%opt, 's|state-storage-directory:s', 'd|default-umask:s', +- 'help|?', 'man') or pod2usage(2); ++ GetOptions(\%opt, 'help|?', 'man') or pod2usage(2); + pod2usage(1) if $opt{help}; + pod2usage(-verbose => 2) if $opt{man}; + + print "Configured options (run perl Makefile.PL --help for how to change this):\n"; + +- my $d = File::Spec->tmpdir; +- $d = $opt{s} || $d; +- print "\tUUID state storage: $d\n"; +- $d =~ s/\\/\\\\/g if $^O eq 'MSWin32'; +- +- my $m = '0007'; +- unless ($^O eq 'MSWin32') { +- $m = $opt{d} || $m; +- print "\tdefault umask: $m\n"; +- } +- +- chmod(0666, sprintf("%s/%s", $d, ".UUID_NODEID")); +- chmod(0666, sprintf("%s/%s", $d, ".UUID_STATE")); + return { +- DEFINE => '-D_STDIR=' . shell_quote(c_quote($d)) +- . ' -D' . shell_quote("__$Config{osname}__") +- . ' -D_DEFAULT_UMASK=' . shell_quote($m) ++ DEFINE => ' -D' . shell_quote("__$Config{osname}__") + }; + } + ); +@@ -127,11 +111,9 @@ Makefile.PL - configure Makefile for Data::UUID + + perl Makefile.PL [options] [EU::MM options] + +-perl Makefile.PL -s=/var/local/lib/data-uuid -d=0007 ++perl Makefile.PL + + Options: +- --state-storage-directory directory for storing library state information +- --default-umask umask for files in the state storage directory + --help brief help message + --man full documentation + +@@ -141,18 +123,6 @@ Options can be abbreviated, see L. + + =over + +-=item --state-storage-directory +- +-Optional. Takes a string that is interpreted as directory for storing library +-state information. Default is c:/tmp/ on Windows if it already exists, or the +-operating system's temporary directory (see tmpdir in L), +-or /var/tmp as fallback. +- +-=item --default-umask +- +-Optional. Takes a string that is interpreted as umask for the files in the state +-storage directory. Default is 0007. This is ignored on Windows. +- + =item --help + + Print a brief help message and exits. +@@ -165,10 +135,7 @@ Prints the manual page and exits. + + =head1 DESCRIPTION + +-B writes the Makefile for the Data::UUID library. It is configured +-with the options L and L. +-Unless given, default values are used. In any case the values are printed for +-confirmation. ++B writes the Makefile for the Data::UUID library. + + Additionally, the usual EU::MM options are processed, see + L. +diff --git a/README b/README +index 8aaa1c2..34d53a5 100644 +--- a/README ++++ b/README +@@ -23,15 +23,6 @@ To install this module type the following: + make test + make install + +-NOTE: This module is designed to save its state information in a permanent +-storage location. The installation script (i.e. Makefile.PL) prompts for +-a directory name to use as a storage location for state file and defaults +-this directory to "/var/tmp" if no directory name is provided. +-The installation script will not accept names of directories that do not +-exist, however, it will take the locations, which the installing user +-has no write permissions to. In this case, the state information will not be +-saved, which will maximize the chances of generating duplicate UUIDs. +- + COPYRIGHT AND LICENCE + + Copyright (C) 2001, Alexander Golomshtok +diff --git a/UUID.h b/UUID.h +index dc5ea28..11d6e13 100644 +--- a/UUID.h ++++ b/UUID.h +@@ -44,23 +44,6 @@ + #include + #endif + +-#if !defined _STDIR +-# define _STDIR "/var/tmp" +-#endif +-#if !defined _DEFAULT_UMASK +-# define _DEFAULT_UMASK 0007 +-#endif +- +-#define UUID_STATE ".UUID_STATE" +-#define UUID_NODEID ".UUID_NODEID" +-#if defined __mingw32__ || (defined _WIN32 && !defined(__cygwin__)) || defined _MSC_VER +-#define UUID_STATE_NV_STORE _STDIR"\\"UUID_STATE +-#define UUID_NODEID_NV_STORE _STDIR"\\"UUID_NODEID +-#else +-#define UUID_STATE_NV_STORE _STDIR"/"UUID_STATE +-#define UUID_NODEID_NV_STORE _STDIR"/"UUID_NODEID +-#endif +- + #define UUIDS_PER_TICK 1024 + #ifdef _MSC_VER + #define I64(C) C##i64 +@@ -134,7 +117,6 @@ typedef struct _uuid_state_t { + typedef struct _uuid_context_t { + uuid_state_t state; + uuid_node_t nodeid; +- perl_uuid_time_t next_save; + } uuid_context_t; + + static void format_uuid_v1( +diff --git a/UUID.xs b/UUID.xs +index c3496a8..8191727 100644 +--- a/UUID.xs ++++ b/UUID.xs +@@ -356,29 +356,11 @@ PREINIT: + UV one = 1; + CODE: + RETVAL = (uuid_context_t *)PerlMemShared_malloc(sizeof(uuid_context_t)); +- if ((fd = fopen(UUID_STATE_NV_STORE, "rb"))) { +- fread(&(RETVAL->state), sizeof(uuid_state_t), 1, fd); +- fclose(fd); +- get_current_time(×tamp); +- RETVAL->next_save = timestamp; +- } +- if ((fd = fopen(UUID_NODEID_NV_STORE, "rb"))) { +- pid_t *hate = (pid_t *) &(RETVAL->nodeid); +- fread(&(RETVAL->nodeid), sizeof(uuid_node_t), 1, fd ); +- fclose(fd); +- +- *hate += getpid(); +- } else { ++ + get_random_info(seed); + seed[0] |= 0x80; + memcpy(&(RETVAL->nodeid), seed, sizeof(uuid_node_t)); +- mask = umask(_DEFAULT_UMASK); +- if ((fd = fopen(UUID_NODEID_NV_STORE, "wb"))) { +- fwrite(&(RETVAL->nodeid), sizeof(uuid_node_t), 1, fd); +- fclose(fd); +- }; +- umask(mask); +- } ++ + errno = 0; + #if DU_THREADSAFE + MUTEX_LOCK(&instances_mutex); +@@ -415,17 +397,6 @@ PPCODE: + self->state.node = self->nodeid; + self->state.ts = timestamp; + self->state.cs = clockseq; +- if (timestamp > self->next_save ) { +- mask = umask(_DEFAULT_UMASK); +- if((fd = fopen(UUID_STATE_NV_STORE, "wb"))) { +- LOCK(fd); +- fwrite(&(self->state), sizeof(uuid_state_t), 1, fd); +- UNLOCK(fd); +- fclose(fd); +- } +- umask(mask); +- self->next_save = timestamp + (10 * 10 * 1000 * 1000); +- } + ST(0) = make_ret(uuid, ix); + XSRETURN(1); + +@@ -585,14 +556,6 @@ CODE: + MUTEX_UNLOCK(&instances_mutex); + if (count == 0) { + #endif +- mask = umask(_DEFAULT_UMASK); +- if ((fd = fopen(UUID_STATE_NV_STORE, "wb"))) { +- LOCK(fd); +- fwrite(&(self->state), sizeof(uuid_state_t), 1, fd); +- UNLOCK(fd); +- fclose(fd); +- }; +- umask(mask); + PerlMemShared_free(self); + #if DU_THREADSAFE + } + diff --git a/pkgs/by-name/pe/perl/perl-modules/Device-OUI-1.04-hash.patch b/pkgs/by-name/pe/perl/perl-modules/Device-OUI-1.04-hash.patch new file mode 100644 index 0000000..6133ab6 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Device-OUI-1.04-hash.patch @@ -0,0 +1,11 @@ +--- Device-OUI-1.04/lib/Device/OUI.pm.orig 2009-03-07 02:23:17.000000000 +0000 ++++ Device-OUI-1.04/lib/Device/OUI.pm 2016-08-09 08:19:00.642799675 +0100 +@@ -54,7 +54,7 @@ + for my $x ( keys %hash ) { + if ( not defined $hash{ $x } ) { $hash{ $x } = '' } + } +- return $handle->{ $oui } = join( "\0", %hash ); ++ return $handle->{ $oui } = join( "\0", map {$_,$hash{$_}} sort keys %hash ); + } elsif ( my $x = $handle->{ $oui } ) { + return { split( "\0", $x ) }; + } diff --git a/pkgs/by-name/pe/perl/perl-modules/Exception-Base-remove-smartmatch-when-5.38.0.patch b/pkgs/by-name/pe/perl/perl-modules/Exception-Base-remove-smartmatch-when-5.38.0.patch new file mode 100644 index 0000000..00fd4b7 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Exception-Base-remove-smartmatch-when-5.38.0.patch @@ -0,0 +1,20 @@ +smartmatch deprecated in perl-5.37.10 + +Patch by @pghmcfc from +https://github.com/dex4er/perl-Exception-Base/issues/5#issuecomment-1637075218 + +diff --git a/t/tlib/Exception/BaseTest.pm b/t/tlib/Exception/BaseTest.pm +index d590d12..e531ed7 100644 +--- a/t/tlib/Exception/BaseTest.pm ++++ b/t/tlib/Exception/BaseTest.pm +@@ -569,8 +569,9 @@ sub test_overload { + $self->assert_matches(qr/String at /, $obj); + + # smart matching for Perl 5.10 +- if ($] >= 5.010) { ++ # Deprecation warning added in 5.37.10 ++ if ($] >= 5.010 && $] < 5.037010) { + no if $] >= 5.018, warnings => 'experimental::smartmatch'; + eval q{ + $self->assert_num_equals(1, 'String' ~~ $obj); + diff --git a/pkgs/by-name/pe/perl/perl-modules/ExtUtils-Constant-fix-indirect-method-call-in-test.patch b/pkgs/by-name/pe/perl/perl-modules/ExtUtils-Constant-fix-indirect-method-call-in-test.patch new file mode 100644 index 0000000..dbca37a --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/ExtUtils-Constant-fix-indirect-method-call-in-test.patch @@ -0,0 +1,31 @@ +https://rt.cpan.org/Public/Bug/Display.html?id=132995 + +From 94b5fc74c3d7ed835e83bac40632962af32f5b30 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= +Date: Mon, 13 Jul 2020 22:08:45 +0100 +Subject: [PATCH] Fix indirect method call in ExtUtils::Constant test + +It puts both "use $];" and "bootstrap $package \$VERSION;" in the +generated test module, which is going to break if we ever remove +`indirect` from the current feature bundle. + +Fix by making the method call direct instead. +--- + t/Constant.t | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/t/Constant.t b/t/Constant.t +index d6b45668da..526a32c779 100644 +--- a/t/Constant.t ++++ b/t/Constant.t +@@ -435,7 +435,7 @@ EOT + print FH ");\n"; + # Print the AUTOLOAD subroutine ExtUtils::Constant generated for us + print FH autoload ($package, $]); +- print FH "bootstrap $package \$VERSION;\n1;\n__END__\n"; ++ print FH "$package->bootstrap(\$VERSION);\n1;\n__END__\n"; + close FH or die "close $pm: $!\n"; + + ################ test.pl +-- +2.26.2 \ No newline at end of file diff --git a/pkgs/by-name/pe/perl/perl-modules/Google-ProtocolBuffers-multiline-comments.patch b/pkgs/by-name/pe/perl/perl-modules/Google-ProtocolBuffers-multiline-comments.patch new file mode 100644 index 0000000..6b634d0 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Google-ProtocolBuffers-multiline-comments.patch @@ -0,0 +1,12 @@ +diff -Naur Google-ProtocolBuffers-0.08-orig/lib/Google/ProtocolBuffers/Compiler.pm Google-ProtocolBuffers-0.08/lib/Google/ProtocolBuffers/Compiler.pm +--- Google-ProtocolBuffers-0.08-orig/lib/Google/ProtocolBuffers/Compiler.pm 2008-10-23 13:46:01.000000000 -0400 ++++ Google-ProtocolBuffers-0.08/lib/Google/ProtocolBuffers/Compiler.pm 2013-01-16 13:52:09.855063997 -0500 +@@ -16,7 +16,7 @@ + + my $grammar = <<'END_OF_GRAMMAR'; + +-proto : ++proto : + ## list of top level declarations. + ## Skip empty declarations and ";". + (message | extend | enum | import | package | option | service | syntax | ";")(s) /\Z/ diff --git a/pkgs/by-name/pe/perl/perl-modules/Gtk2-fix-incompatible-pointer-conversion.patch b/pkgs/by-name/pe/perl/perl-modules/Gtk2-fix-incompatible-pointer-conversion.patch new file mode 100644 index 0000000..1ac68ee --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Gtk2-fix-incompatible-pointer-conversion.patch @@ -0,0 +1,86 @@ +diff -ur a/gdk.typemap b/gdk.typemap +--- a/gdk.typemap 2017-05-21 15:02:54.000000000 -0400 ++++ b/gdk.typemap 2023-11-03 13:17:43.717890172 -0400 +@@ -23,6 +23,7 @@ + TYPEMAP + + # can be either a pointer or an integer, this handles both cases ++uintptr_t T_UV + GdkNativeWindow T_UV + + # GdkBitmap doesn't get its own type id, but needs to be treated separately. +diff -ur a/xs/GdkDnd.xs b/xs/GdkDnd.xs +--- a/xs/GdkDnd.xs 2017-05-21 15:02:54.000000000 -0400 ++++ b/xs/GdkDnd.xs 2023-11-03 13:23:22.478329089 -0400 +@@ -142,12 +142,12 @@ + void + gdk_drag_get_protocol_for_display (class, display, xid) + GdkDisplay *display +- guint32 xid ++ uintptr_t xid + PREINIT: + GdkDragProtocol protocol; +- guint32 ret; ++ uintptr_t ret; + PPCODE: +- ret = gdk_drag_get_protocol_for_display (display, xid, &protocol); ++ ret = (uintptr_t)gdk_drag_get_protocol_for_display (display, INT2PTR(GdkNativeWindow, xid), &protocol); + XPUSHs (sv_2mortal (newSVuv (ret))); + XPUSHs (sv_2mortal (ret + ? newSVGdkDragProtocol (protocol) +@@ -184,12 +184,12 @@ + =cut + void + gdk_drag_get_protocol (class, xid) +- guint32 xid ++ uintptr_t xid + PREINIT: + GdkDragProtocol protocol; +- guint32 ret; ++ uintptr_t ret; + PPCODE: +- ret = gdk_drag_get_protocol (xid, &protocol); ++ ret = (uintptr_t)gdk_drag_get_protocol (INT2PTR(GdkNativeWindow, xid), &protocol); + XPUSHs (sv_2mortal (newSVuv (ret))); + XPUSHs (sv_2mortal (newSVGdkDragProtocol (protocol))); + +diff -ur a/xs/GdkSelection.xs b/xs/GdkSelection.xs +--- a/xs/GdkSelection.xs 2017-05-21 15:02:54.000000000 -0400 ++++ b/xs/GdkSelection.xs 2023-11-03 13:26:58.976888906 -0400 +@@ -147,7 +147,7 @@ + ## void gdk_selection_send_notify (guint32 requestor, GdkAtom selection, GdkAtom target, GdkAtom property, guint32 time_) + void + gdk_selection_send_notify (class, requestor, selection, target, property, time_) +- guint32 requestor ++ GdkNativeWindow requestor + GdkAtom selection + GdkAtom target + GdkAtom property +@@ -161,7 +161,7 @@ + void + gdk_selection_send_notify_for_display (class, display, requestor, selection, target, property, time_) + GdkDisplay *display +- guint32 requestor ++ GdkNativeWindow requestor + GdkAtom selection + GdkAtom target + GdkAtom property +diff -ur a/xs/GtkWindow.xs b/xs/GtkWindow.xs +--- a/xs/GtkWindow.xs 2017-05-21 15:02:54.000000000 -0400 ++++ b/xs/GtkWindow.xs 2023-11-03 13:32:53.673168678 -0400 +@@ -581,13 +581,13 @@ + void + gtk_window_remove_embedded_xid (window, xid) + GtkWindow * window +- guint xid ++ GdkNativeWindow xid + + ## void gtk_window_add_embedded_xid (GtkWindow *window, guint xid) + void + gtk_window_add_embedded_xid (window, xid) + GtkWindow * window +- guint xid ++ GdkNativeWindow xid + + ##void gtk_window_reshow_with_initial_size (GtkWindow *window) + void diff --git a/pkgs/by-name/pe/perl/perl-modules/Hailo-fix-test-gld.patch b/pkgs/by-name/pe/perl/perl-modules/Hailo-fix-test-gld.patch new file mode 100644 index 0000000..24e45ac --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Hailo-fix-test-gld.patch @@ -0,0 +1,28 @@ +commit ce474dbca0c95c06a85a3a329fcdbcc97b8ad317 +Author: Stig Palmquist +Date: 2023-11-21 13:27:46 +0100 + + Fix t/shell.t compat with Getopt-Long-Descriptive 0.106 + +diff --git a/t/command/shell.t b/t/command/shell.t +index ebd67d8..a09afd2 100644 +--- a/t/command/shell.t ++++ b/t/command/shell.t +@@ -28,7 +28,7 @@ run_ok( $app, [ '--no-help' ], "Don't help me" ); + cmp_ok($return, '==', 1, 'Exit status is correct'); + like($stderr, qr/^$/s, 'no stderr'); + like($stdout, qr{usage: hailo}, 'Got usage header'); +- like($stdout, qr{progress\s+Display progress}, 'Got --progress'); ++ like($stdout, qr{progress\s*(?:\(or -p\))?\s+Display progress}, 'Got --progress'); + like($stdout, qr{files are assumed to be UTF-8 encoded}, 'Got UTF-8 note'); + unlike($stdout, qr{examples:}, "no examples on normal output"); + } +@@ -75,7 +75,7 @@ run_ok( $app, [ '--no-help' ], "Don't help me" ); + like($stderr, qr/^$/s, 'no stderr'); + like($stdout, qr/Unknown option: blah-blah-blah/, 'Unknown option'); + like($stdout, qr{usage: hailo}, 'Got usage header'); +- like($stdout, qr{progress\s+Display progress}, 'Got --progress'); ++ like($stdout, qr{progress\s*(?:\(or -p\))?\s+Display progress}, 'Got --progress'); + like($stdout, qr{files are assumed to be UTF-8 encoded}, 'Got UTF-8 note'); + unlike($stdout, qr{examples:}, "no examples on error"); + diff --git a/pkgs/by-name/pe/perl/perl-modules/IO-Tty-fix-makefile.patch b/pkgs/by-name/pe/perl/perl-modules/IO-Tty-fix-makefile.patch new file mode 100644 index 0000000..65c6d23 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/IO-Tty-fix-makefile.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile.PL b/Makefile.PL +index eaf47e0..32766d7 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -146,7 +146,7 @@ extern "C" + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char $f (); +-char (*f) (); ++char f; + + #ifdef F77_DUMMY_MAIN + # ifdef __cplusplus diff --git a/pkgs/by-name/pe/perl/perl-modules/ImageExifTool/default.nix b/pkgs/by-name/pe/perl/perl-modules/ImageExifTool/default.nix new file mode 100644 index 0000000..5ca983f --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/ImageExifTool/default.nix @@ -0,0 +1,55 @@ +{ lib +, stdenv +, buildPerlPackage +, exiftool +, fetchurl +, gitUpdater +, shortenPerlShebang +, testers +}: + +buildPerlPackage rec { + pname = "Image-ExifTool"; + version = "12.82"; + + src = fetchurl { + url = "https://exiftool.org/Image-ExifTool-${version}.tar.gz"; + hash = "sha256-1MfWz0AR+SaM2Ar7gAfLs38OJhOnP4cRekpe1uSjDD4="; + }; + + nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + postInstall = lib.optionalString stdenv.isDarwin '' + shortenPerlShebang $out/bin/exiftool + ''; + + passthru = { + tests.version = testers.testVersion { + inherit version; + command = "${lib.getExe exiftool} -ver"; + package = exiftool; + }; + updateScript = gitUpdater { + url = "https://github.com/exiftool/exiftool.git"; + }; + }; + + meta = { + description = "A tool to read, write and edit EXIF meta information"; + longDescription = '' + ExifTool is a platform-independent Perl library plus a command-line + application for reading, writing and editing meta information in a wide + variety of files. ExifTool supports many different metadata formats + including EXIF, GPS, IPTC, XMP, JFIF, GeoTIFF, ICC Profile, Photoshop + IRB, FlashPix, AFCP and ID3, as well as the maker notes of many digital + cameras by Canon, Casio, DJI, FLIR, FujiFilm, GE, GoPro, HP, + JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Motorola, Nikon, + Nintendo, Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Phase One, + Reconyx, Ricoh, Samsung, Sanyo, Sigma/Foveon and Sony. + ''; + homepage = "https://exiftool.org/"; + changelog = "https://exiftool.org/history.html"; + license = with lib.licenses; [ gpl1Plus /* or */ artistic2 ]; + maintainers = with lib.maintainers; [ kiloreux anthonyroussel ]; + mainProgram = "exiftool"; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/MNI/default.nix b/pkgs/by-name/pe/perl/perl-modules/MNI/default.nix new file mode 100644 index 0000000..067a08f --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/MNI/default.nix @@ -0,0 +1,24 @@ +{ fetchFromGitHub, buildPerlPackage, lib }: + +buildPerlPackage { + pname = "MNI-Perllib"; + version = "2012-04-13"; + + src = fetchFromGitHub { + owner = "BIC-MNI"; + repo = "mni-perllib"; + rev = "b908472b4390180ea5d19a121ac5edad6ed88d83"; + sha256 = "0vk99pwgbard62k63386r7dpnm3h435jdqywr4xqfq7p04dz6kyb"; + }; + + patches = [ ./no-stdin.patch ]; + + doCheck = false; # TODO: almost all tests fail ... is this a real problem? + + meta = { + description = "MNI MINC perllib (not used much anymore)"; + homepage = "https://github.com/BIC-MNI/mni-perllib"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + maintainers = with lib.maintainers; [ bcdarwin ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/MNI/no-stdin.patch b/pkgs/by-name/pe/perl/perl-modules/MNI/no-stdin.patch new file mode 100644 index 0000000..1e9e791 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/MNI/no-stdin.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile.PL b/Makefile.PL +index 9f2039a..12d699c 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -213,7 +213,7 @@ TEXT + } # &MY::postamble + + +-query_subs; ++#query_subs; + + my $f; + WriteMakefile diff --git a/pkgs/by-name/pe/perl/perl-modules/MouseX-Getopt-gld-tests.patch b/pkgs/by-name/pe/perl/perl-modules/MouseX-Getopt-gld-tests.patch new file mode 100644 index 0000000..6ca6e83 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/MouseX-Getopt-gld-tests.patch @@ -0,0 +1,143 @@ +From c1d1eed00099af8d858536b659864b7ccea41974 Mon Sep 17 00:00:00 2001 +From: Paul Howarth +Date: Sat, 13 Mar 2021 17:46:57 +0000 +Subject: [PATCH 1/2] Update for Getopt-Long-Descriptive 0.106 + +GLD is now outputting text with wrapping depending on the terminal +width. This update is enough to get the tests to pass when running +within "expect", which provides a PTY. It's almost certainly not +enough for general use. +--- + t/104_override_usage.t | 8 ++++++++ + t/107_no_auto_help.t | 2 +- + t/109_help_flag.t | 2 +- + t/110_sort_usage_by_attr_order.t | 12 ++++++++++++ + 4 files changed, 22 insertions(+), 2 deletions(-) + +diff --git a/t/104_override_usage.t b/t/104_override_usage.t +index bc45029..6641540 100644 +--- a/t/104_override_usage.t ++++ b/t/104_override_usage.t +@@ -61,9 +61,17 @@ use Test::Exception; + \t--foo INT A foo + } + : ++ $Getopt::Long::Descriptive::VERSION < 0.106 ? + qq{usage: 104_override_usage.t [-?] [long options...] + \t-? --[no-]usage --[no-]help Prints this usage information. + \t--foo INT A foo ++} ++ : ++ qq{usage: 104_override_usage.t [-?] [long options...] ++\t--[no-]help (or -?) Prints ++\t this usage information. ++\t aka --usage ++\t--foo INT A foo + } + + ]; +diff --git a/t/107_no_auto_help.t b/t/107_no_auto_help.t +index 27f87f5..103df43 100644 +--- a/t/107_no_auto_help.t ++++ b/t/107_no_auto_help.t +@@ -60,7 +60,7 @@ END { + warning_like { + throws_ok { Class->new_with_options } + #usage: 107_no_auto_help.t [-?] [long options...] +- qr/^usage: [\d\w]+\Q.t [-?] [long options...]\E.\s+\Q-? --\E(\[no-\])?usage --(\[no-\])?\Qhelp\E\s+\QPrints this usage information.\E.\s+--configfile/ms, ++ qr/^usage: [\d\w]+\Q.t [-?] [long options...]\E.\s+(\Q-? --\E(\[no-\])?usage )?--(\[no-\])?\Qhelp\E(\Q (or -?)\E)?\s+\QPrints this usage information.\E.(\s+\Qaka --usage\E.)?\s+--configfile/ms, + 'usage information looks good'; + } + qr/^Specified configfile \'this_value_unimportant\' does not exist, is empty, or is not readable$/, +diff --git a/t/109_help_flag.t b/t/109_help_flag.t +index 8c658e2..58dbca6 100644 +--- a/t/109_help_flag.t ++++ b/t/109_help_flag.t +@@ -40,7 +40,7 @@ foreach my $args ( ['--help'], ['--usage'], ['--?'], ['-?'] ) + local @ARGV = @$args; + + throws_ok { MyClass->new_with_options() } +- qr/^usage: (?:[\d\w]+)\Q.t [-?] [long options...]\E.^\t\Q-? --\E(\[no-\])?usage --(\[no-\])?help\s+\QPrints this usage information.\E$/ms, ++ qr/^usage: (?:[\d\w]+)\Q.t [-?] [long options...]\E.^\s+(\Q-? --\E(\[no-\])?usage )?--(\[no-\])?help(\Q (or -?)\E)?\s+Prints ?(.\s+)?\Qthis usage information.\E.(\s+\Qaka --usage\E.)?$/ms, + 'Help request detected; usage information properly printed'; + } + +diff --git a/t/110_sort_usage_by_attr_order.t b/t/110_sort_usage_by_attr_order.t +index e7dd177..7ec0c99 100644 +--- a/t/110_sort_usage_by_attr_order.t ++++ b/t/110_sort_usage_by_attr_order.t +@@ -64,6 +64,18 @@ usage: 110_sort_usage_by_attr_order.t [-?] [long options...] + --baz STR Documentation for "baz" + USAGE + } ++if ( $Getopt::Long::Descriptive::VERSION >= 0.106 ) ++{ ++$expected = <<'USAGE'; ++usage: 110_sort_usage_by_attr_order.t [-?] [long options...] ++ --[no-]help (or -?) Prints ++ this usage information. ++ aka --usage ++ --foo STR Documentation for "foo" ++ --bar STR Documentation for "bar" ++ --baz STR Documentation for "baz" ++USAGE ++} + $expected =~ s/^[ ]{4}/\t/xmsg; + is($obj->usage->text, $expected, 'Usage text has nicely sorted options'); + + +From 45ae6aaabc5413e985860fbfcc8da3bdc929a054 Mon Sep 17 00:00:00 2001 +From: Paul Howarth +Date: Mon, 15 Mar 2021 10:43:14 +0000 +Subject: [PATCH 2/2] Update for Getopt-Long-Descriptive 0.107 + +GLD's use of Term::ReadKey has been reverted, so this update should now +work reliably. Use with GLD 0.106 is not supported. +--- + t/104_override_usage.t | 6 +++--- + t/110_sort_usage_by_attr_order.t | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/t/104_override_usage.t b/t/104_override_usage.t +index 6641540..f7c6a31 100644 +--- a/t/104_override_usage.t ++++ b/t/104_override_usage.t +@@ -61,15 +61,15 @@ use Test::Exception; + \t--foo INT A foo + } + : +- $Getopt::Long::Descriptive::VERSION < 0.106 ? ++ # Note: Getopt::Long::Descriptive 0.106 not supported ++ $Getopt::Long::Descriptive::VERSION < 0.107 ? + qq{usage: 104_override_usage.t [-?] [long options...] + \t-? --[no-]usage --[no-]help Prints this usage information. + \t--foo INT A foo + } + : + qq{usage: 104_override_usage.t [-?] [long options...] +-\t--[no-]help (or -?) Prints +-\t this usage information. ++\t--[no-]help (or -?) Prints this usage information. + \t aka --usage + \t--foo INT A foo + } +diff --git a/t/110_sort_usage_by_attr_order.t b/t/110_sort_usage_by_attr_order.t +index 7ec0c99..16cdaa1 100644 +--- a/t/110_sort_usage_by_attr_order.t ++++ b/t/110_sort_usage_by_attr_order.t +@@ -64,12 +64,12 @@ usage: 110_sort_usage_by_attr_order.t [-?] [long options...] + --baz STR Documentation for "baz" + USAGE + } +-if ( $Getopt::Long::Descriptive::VERSION >= 0.106 ) ++# Note: Getopt::Long::Descriptive 0.106 not supported ++if ( $Getopt::Long::Descriptive::VERSION >= 0.107 ) + { + $expected = <<'USAGE'; + usage: 110_sort_usage_by_attr_order.t [-?] [long options...] +- --[no-]help (or -?) Prints +- this usage information. ++ --[no-]help (or -?) Prints this usage information. + aka --usage + --foo STR Documentation for "foo" + --bar STR Documentation for "bar" diff --git a/pkgs/by-name/pe/perl/perl-modules/Mozilla-LDAP/default.nix b/pkgs/by-name/pe/perl/perl-modules/Mozilla-LDAP/default.nix new file mode 100644 index 0000000..6c3d01a --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Mozilla-LDAP/default.nix @@ -0,0 +1,18 @@ +{ lib, fetchurl, openldap, buildPerlPackage }: + +buildPerlPackage rec { + pname = "Mozilla-Ldap"; + version = "1.5.3"; + USE_OPENLDAP = 1; + LDAPSDKDIR = openldap.dev; + LDAPSDKLIBDIR = "${openldap.out}/lib"; + src = fetchurl { + url = "https://ftp.mozilla.org/pub/directory/perldap/releases/${version}/src/perl-mozldap-${version}.tar.gz"; + sha256 = "0s0albdw0zvg3w37s7is7gddr4mqwicjxxsy400n1p96l7ipnw4x"; + }; + meta = { + description = "Mozilla's ldap client library"; + homepage = "https://metacpan.org/release/perldap"; + license = with lib.licenses; [ mpl20 lgpl21Plus gpl2Plus ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Paranoid-blessed-path.patch b/pkgs/by-name/pe/perl/perl-modules/Paranoid-blessed-path.patch new file mode 100644 index 0000000..99bd697 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Paranoid-blessed-path.patch @@ -0,0 +1,22 @@ +diff '--color=auto' -ur Paranoid-2.10/lib/Paranoid.pm Paranoid-2.10-patched/lib/Paranoid.pm +--- Paranoid-2.10/lib/Paranoid.pm 2022-03-08 10:01:04.000000000 +0100 ++++ Paranoid-2.10-patched/lib/Paranoid.pm 2023-10-20 16:57:54.025754755 +0200 +@@ -47,7 +47,7 @@ + %EXPORT_TAGS = ( all => [@EXPORT_OK], ); + + use constant PTRUE_ZERO => '0 but true'; +-use constant DEFAULT_PATH => '/bin:/sbin:/usr/bin:/usr/sbin'; ++use constant DEFAULT_PATH => '__BLESSED_PATH__'; + + ##################################################################### + # +diff '--color=auto' -ur Paranoid-2.10/t/01_init_core.t Paranoid-2.10-patched/t/01_init_core.t +--- Paranoid-2.10/t/01_init_core.t 2022-01-24 10:30:20.000000000 +0100 ++++ Paranoid-2.10-patched/t/01_init_core.t 2023-10-20 16:58:16.856288407 +0200 +@@ -35,5 +35,4 @@ + ok( psecureEnv('/bin:/sbin'), 'psecureEnv 1' ); + is( $ENV{PATH}, '/bin:/sbin', 'Validated PATH' ); + ok( psecureEnv(), 'psecureEnv 2' ); +-is( $ENV{PATH}, '/bin:/sbin:/usr/bin:/usr/sbin', 'Validated PATH' ); +- ++is( $ENV{PATH}, '__BLESSED_PATH__', 'Validated PATH' ); diff --git a/pkgs/by-name/pe/perl/perl-modules/Percona-Toolkit/default.nix b/pkgs/by-name/pe/perl/perl-modules/Percona-Toolkit/default.nix new file mode 100644 index 0000000..6a11573 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Percona-Toolkit/default.nix @@ -0,0 +1,32 @@ +{ lib, fetchFromGitHub, buildPerlPackage, shortenPerlShebang +, DBDmysql, DBI, IOSocketSSL, TermReadKey +}: + +buildPerlPackage rec { + pname = "Percona-Toolkit"; + version = "3.2.0"; + + src = fetchFromGitHub { + owner = "percona"; + repo = "percona-toolkit"; + rev = "v${version}"; + sha256 = "084ldpskvlfm32lfss5qqzm5y9b8hf029aa4i5pcnzgb53xaxkqx"; + }; + + outputs = [ "out" ]; + + nativeBuildInputs = [ shortenPerlShebang ]; + + buildInputs = [ DBDmysql DBI IOSocketSSL TermReadKey ]; + + postInstall = '' + shortenPerlShebang $(grep -l "/bin/env perl" $out/bin/*) + ''; + + meta = { + description = "Collection of advanced command-line tools to perform a variety of MySQL and system tasks"; + homepage = "https://www.percona.com/software/database-tools/percona-toolkit"; + license = with lib.licenses; [ gpl2Only ]; + maintainers = with lib.maintainers; [ izorkin ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Plack-test-replace-DES-hash-with-bcrypt.patch b/pkgs/by-name/pe/perl/perl-modules/Plack-test-replace-DES-hash-with-bcrypt.patch new file mode 100644 index 0000000..4f9918a --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Plack-test-replace-DES-hash-with-bcrypt.patch @@ -0,0 +1,12 @@ +Replaces the legacy DES crypt hash used in tests with a stronger +bcrypt function, as crypt() in pkgs.perl no longer supports DES + +# htpasswd -nbB admin s3cr3t + +diff --git a/t/Plack-Middleware/htpasswd b/t/Plack-Middleware/htpasswd +index b597da8..f80461d 100644 +--- a/t/Plack-Middleware/htpasswd ++++ b/t/Plack-Middleware/htpasswd +@@ -1,1 +1,1 @@ +-admin:6iSeSVcVHgNQw ++admin:$2y$05$qO4lTUQMcE5mU6KI0t7j9uCjcTkpf6sAp0cv6oZiemD0MI8keeKPa diff --git a/pkgs/by-name/pe/perl/perl-modules/Po4a/default.nix b/pkgs/by-name/pe/perl/perl-modules/Po4a/default.nix new file mode 100644 index 0000000..3856920 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Po4a/default.nix @@ -0,0 +1,67 @@ +{ stdenv, lib, fetchurl, docbook_xsl, docbook_xsl_ns, gettext, libxslt, glibcLocales, docbook_xml_dtd_412, docbook_sgml_dtd_41, opensp, bash +, perl, buildPerlPackage, ModuleBuild, TextWrapI18N, LocaleGettext, TermReadKey, SGMLSpm, UnicodeLineBreak, PodParser, YAMLTiny +, fetchpatch, writeShellScriptBin +}: + +buildPerlPackage rec { + pname = "po4a"; + version = "0.62"; + src = fetchurl { + url = "https://github.com/mquinson/po4a/releases/download/v${version}/po4a-${version}.tar.gz"; + sha256 = "0eb510a66f59de68cf7a205342036cc9fc08b39334b91f1456421a5f3359e68b"; + }; + patches = [ + (fetchpatch { + # make devdoc output reproducible + # https://github.com/mquinson/po4a/pull/387 + url = "https://github.com/mquinson/po4a/commit/df7433b58f6570558d44b6aac885c2a8f7862e51.patch"; + sha256 = "9MVkYiItR2P3PBCUc4OhEOUHQuLqTWUYtYlZ3L8miC8="; + }) + ]; + + strictDeps = true; + nativeBuildInputs = + # the tests for the tex-format use kpsewhich -- texlive's file finding utility. + # We don't want to depend on texlive here, so we replace it with a minimal + # shellscript that suffices for the tests in t/fmt/tex/, i.e. it looks up + # article.cls to an existing file, but doesn't find article-wrong.cls. + let kpsewhich-stub = writeShellScriptBin "kpsewhich" + ''[[ $1 = "article.cls" ]] && echo /dev/null''; + in + [ gettext libxslt docbook_xsl docbook_xsl_ns ModuleBuild docbook_xml_dtd_412 docbook_sgml_dtd_41 opensp kpsewhich-stub glibcLocales ]; + propagatedBuildInputs = lib.optional (!stdenv.hostPlatform.isMusl) TextWrapI18N ++ [ LocaleGettext SGMLSpm UnicodeLineBreak PodParser YAMLTiny ]; + # TODO: TermReadKey was temporarily removed from propagatedBuildInputs to unfreeze the build + buildInputs = [ bash ]; + LC_ALL = "en_US.UTF-8"; + SGML_CATALOG_FILES = "${docbook_xml_dtd_412}/xml/dtd/docbook/catalog.xml"; + preConfigure = '' + touch Makefile.PL + export PERL_MB_OPT="--install_base=$out --prefix=$out" + ''; + buildPhase = "perl Build.PL --install_base=$out --install_path=\"lib=$out/${perl.libPrefix}\"; ./Build build"; + + # Disabling tests on musl + # Void linux package have investigated the failure and tracked it down to differences in gettext behavior. They decided to disable tests. + # https://github.com/void-linux/void-packages/pull/34029#issuecomment-973267880 + # Alpine packagers have not worried about running the tests until now: + # https://git.alpinelinux.org/aports/tree/main/po4a/APKBUILD#n11 + # + # Disabling tests on Darwin until https://github.com/NixOS/nixpkgs/issues/236560 is resolved. + doCheck = (!stdenv.hostPlatform.isMusl) && (!stdenv.hostPlatform.isDarwin); + + checkPhase = '' + export SGML_CATALOG_FILES=${docbook_sgml_dtd_41}/sgml/dtd/docbook-4.1/docbook.cat + ./Build test + ''; + installPhase = '' + ./Build install + for f in $out/bin/*; do + substituteInPlace $f --replace "#! /usr/bin/env perl" "#!${perl}/bin/perl" + done + ''; + meta = { + description = "Tools for helping translation of documentation"; + homepage = "https://po4a.org"; + license = with lib.licenses; [ gpl2Only ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/Socket6-sv_undef.patch b/pkgs/by-name/pe/perl/perl-modules/Socket6-sv_undef.patch new file mode 100644 index 0000000..3ed4b61 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Socket6-sv_undef.patch @@ -0,0 +1,18 @@ +diff --git a/Socket6.xs b/Socket6.xs +index 05c791c..058e9d9 100644 +--- a/Socket6.xs ++++ b/Socket6.xs +@@ -105,10 +105,6 @@ const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; + #define HAVE_INET_PTON 1 + #endif + +-#ifndef HAVE_PL_SV_UNDEF +-#define PL_sv_undef sv_undef +-#endif +- + static int + not_here(char *s) + { +-- +2.16.3 + diff --git a/pkgs/by-name/pe/perl/perl-modules/TextBibTeX-use-lib.patch b/pkgs/by-name/pe/perl/perl-modules/TextBibTeX-use-lib.patch new file mode 100644 index 0000000..e5490ad --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/TextBibTeX-use-lib.patch @@ -0,0 +1,11 @@ +--- a/Build.PL ++++ b/Build.PL +@@ -88,7 +88,7 @@ if ( $^O =~ /mswin32/i ) { + } + } + else { +- if ( $Config{archname} =~ /^x86_64|^ppc64|^s390x|^aarch64|^riscv64/ ) { ++ if ( 0 ) { + $libdir =~ s/\bbin\b/lib64/; + if ( !-d $libdir ) { + my $test = $libdir; diff --git a/pkgs/by-name/pe/perl/perl-modules/Tirex/default.nix b/pkgs/by-name/pe/perl/perl-modules/Tirex/default.nix new file mode 100644 index 0000000..655610e --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/Tirex/default.nix @@ -0,0 +1,55 @@ +{ lib +, buildPerlPackage +, fetchFromGitHub +, fetchpatch +, GD +, IPCShareLite +, JSON +, LWP +, mapnik +, nix-update-script +}: + +buildPerlPackage rec { + pname = "Tirex"; + version = "0.7.1"; + + src = fetchFromGitHub { + owner = "openstreetmap"; + repo = "tirex"; + rev = "refs/tags/v${version}"; + hash = "sha256-p2P19tifA/AvJatTzboyhtt7W1SwKJQzqpU4oDalfhU="; + }; + + patches = [ + # https://github.com/openstreetmap/tirex/pull/54 + (fetchpatch { + url = "https://github.com/openstreetmap/tirex/commit/da0c5db926bc0939c53dd902a969b689ccf9edde.patch"; + hash = "sha256-bnL1ZGy8ZNSZuCRbZn59qRVLg3TL0GjFYnhRKroeVO0="; + }) + ]; + + buildInputs = [ + GD + IPCShareLite + JSON + LWP + mapnik + ] ++ mapnik.buildInputs; + + installPhase = '' + install -m 755 -d $out/usr/libexec + make install DESTDIR=$out INSTALLOPTS="" + mv $out/$out/lib $out/$out/share $out + rmdir $out/$out $out/nix/store $out/nix + ''; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Tools for running a map tile server"; + homepage = "https://wiki.openstreetmap.org/wiki/Tirex"; + maintainers = with lib.maintainers; [ jglukasik ]; + license = with lib.licenses; [ gpl2Only ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/WWW-YoutubeViewer/default.nix b/pkgs/by-name/pe/perl/perl-modules/WWW-YoutubeViewer/default.nix new file mode 100644 index 0000000..6ab6233 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/WWW-YoutubeViewer/default.nix @@ -0,0 +1,32 @@ +{ stdenv, lib, fetchFromGitHub, buildPerlPackage, shortenPerlShebang, LWP, LWPProtocolHttps, DataDump, JSON }: + +buildPerlPackage rec { + pname = "WWW-YoutubeViewer"; + version = "3.7.9"; + + src = fetchFromGitHub { + owner = "trizen"; + repo = "youtube-viewer"; + rev = version; + sha256 = "16p0sa91h0zpqdpqmy348g6b9qj5f6qrbzrljn157vk00cg6mx18"; + }; + + nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + propagatedBuildInputs = [ + LWP + LWPProtocolHttps + DataDump + JSON + ]; + postInstall = lib.optionalString stdenv.isDarwin '' + shortenPerlShebang $out/bin/youtube-viewer + ''; + + meta = with lib; { + description = "A lightweight application for searching and streaming videos from YouTube"; + homepage = "https://github.com/trizen/youtube-viewer"; + license = with licenses; [ artistic2 ]; + maintainers = with maintainers; [ woffs ]; + mainProgram = "youtube-viewer"; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/XML-LibXML-clang16.patch b/pkgs/by-name/pe/perl/perl-modules/XML-LibXML-clang16.patch new file mode 100644 index 0000000..9a19e32 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/XML-LibXML-clang16.patch @@ -0,0 +1,47 @@ +From 8751785951fbde48ffa16a476da3e4adb2bbcde5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 16 Jan 2023 18:50:10 -0800 +Subject: [PATCH] libxml-mm: Fix function prototypes in function pointers + +This is now detected with latest clang16+ + +Fixes +error: incompatible function pointer types passing 'void (void *, void *, xmlChar *)' (aka 'void (void *, void *, unsigned char *)') to parameter of type 'xmlHashScanner' (aka 'void (*)(void *, void *, const unsigned char *)') [-Wincompatible-function-pointer-types] + xmlHashScan(r, PmmRegistryDumpHashScanner, NULL); + +Signed-off-by: Khem Raj +--- + perl-libxml-mm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/perl-libxml-mm.c b/perl-libxml-mm.c +index a3e78a2..ec2b5ea 100644 +--- a/perl-libxml-mm.c ++++ b/perl-libxml-mm.c +@@ -121,7 +121,7 @@ PmmFreeHashTable(xmlHashTablePtr table) + extern SV* PROXY_NODE_REGISTRY_MUTEX; + + /* Utility method used by PmmDumpRegistry */ +-void PmmRegistryDumpHashScanner(void * payload, void * data, xmlChar * name) ++void PmmRegistryDumpHashScanner(void * payload, void * data, const xmlChar * name) + { + LocalProxyNodePtr lp = (LocalProxyNodePtr) payload; + ProxyNodePtr node = (ProxyNodePtr) lp->proxy; +@@ -215,7 +215,7 @@ PmmRegisterProxyNode(ProxyNodePtr proxy) + /* PP: originally this was static inline void, but on AIX the compiler + did not chew it, so I'm removing the inline */ + static void +-PmmRegistryHashDeallocator(void *payload, xmlChar *name) ++PmmRegistryHashDeallocator(void *payload, const xmlChar *name) + { + Safefree((LocalProxyNodePtr) payload); + } +@@ -279,7 +279,7 @@ PmmRegistryREFCNT_dec(ProxyNodePtr proxy) + * internal, used by PmmCloneProxyNodes + */ + void * +-PmmRegistryHashCopier(void *payload, xmlChar *name) ++PmmRegistryHashCopier(void *payload, const xmlChar *name) + { + ProxyNodePtr proxy = ((LocalProxyNodePtr) payload)->proxy; + LocalProxyNodePtr lp; diff --git a/pkgs/by-name/pe/perl/perl-modules/alien-sdl.patch b/pkgs/by-name/pe/perl/perl-modules/alien-sdl.patch new file mode 100644 index 0000000..b00f7dc --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/alien-sdl.patch @@ -0,0 +1,30 @@ +diff --git a/inc/My/Builder/Unix.pm b/inc/My/Builder/Unix.pm +index 15291d5..5c5ab24 100644 +--- a/inc/My/Builder/Unix.pm ++++ b/inc/My/Builder/Unix.pm +@@ -48,7 +48,7 @@ sub get_additional_libs { + + sub can_build_binaries_from_sources { + my $self = shift; +- return 1; # yes we can ++ return 0; # no we can't + } + + sub build_binaries { +diff --git a/t/004_get_header_version.t b/t/004_get_header_version.t +index d4146ff..27f53ea 100644 +--- a/t/004_get_header_version.t ++++ b/t/004_get_header_version.t +@@ -1,8 +1,11 @@ + # t/004_config.t + +-use Test::More tests => 1; ++use Test::More; + use Alien::SDL; + ++Test::More::plan( skip_all => 'NixOS doesn\'t have SDL headers in this location' ); ++ ++ + like( Alien::SDL->get_header_version('SDL_version.h'), qr/([0-9]+\.)*[0-9]+/, "Testing SDL_version.h" ); + #like( Alien::SDL->get_header_version('SDL_net.h'), qr/([0-9]+\.)*[0-9]+/, "Testing SDL_net.h" ); + #like( Alien::SDL->get_header_version('SDL_image.h'), qr/([0-9]+\.)*[0-9]+/, "Testing SDL_image.h" ); diff --git a/pkgs/by-name/pe/perl/perl-modules/boost-geometry-utils-fix-oom.patch b/pkgs/by-name/pe/perl/perl-modules/boost-geometry-utils-fix-oom.patch new file mode 100644 index 0000000..cbcce38 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/boost-geometry-utils-fix-oom.patch @@ -0,0 +1,34 @@ +From a46f0e41056b48a56c572fe8884d4b5104a8343e Mon Sep 17 00:00:00 2001 +From: Niko Tyni +Date: Sun, 29 Jun 2014 21:51:15 +0300 +Subject: [PATCH] multi_linestring2perl: only extend the array if needed + +When the size is 0, we end up extending the stack with +a negative value. As of Perl 5.19.4, more precisely + http://perl5.git.perl.org/perl.git/commit/fc16c3924bd6aa054f21ad5445fecf9b7f39dc36 +this ends up allocating memory for 4G-1 elements. + +See Dave Mitchell's comments on perl5-porters: + Message-ID: <20140522115758.GX15438@iabyn.com> + http://marc.info/?l=perl5-porters&m=140075990913228&w=2 +--- + src/mline2av.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/mline2av.h b/src/mline2av.h +index e4b3fc2..d7bacee 100644 +--- a/src/mline2av.h ++++ b/src/mline2av.h +@@ -9,7 +9,8 @@ multi_linestring2perl(pTHX_ const multi_linestring& mls) + { + AV* av = newAV(); + const unsigned int size = mls.size(); +- av_extend(av, size-1); ++ if (size > 0) ++ av_extend(av, size-1); + + for (int i = 0; i < size; i++) { + AV* lineav = newAV(); +-- +2.0.0 + diff --git a/pkgs/by-name/pe/perl/perl-modules/catalyst-plugin-static-simple-etag.patch b/pkgs/by-name/pe/perl/perl-modules/catalyst-plugin-static-simple-etag.patch new file mode 100644 index 0000000..06207a8 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/catalyst-plugin-static-simple-etag.patch @@ -0,0 +1,37 @@ +Send an ETag header, and honour the If-None-Match request header + +diff -ru -x '*~' Catalyst-Plugin-Static-Simple-0.30-orig/lib/Catalyst/Plugin/Static/Simple.pm Catalyst-Plugin-Static-Simple-0.30/lib/Catalyst/Plugin/Static/Simple.pm +--- Catalyst-Plugin-Static-Simple-0.30-orig/lib/Catalyst/Plugin/Static/Simple.pm 2012-05-04 18:49:30.000000000 +0200 ++++ Catalyst-Plugin-Static-Simple-0.30/lib/Catalyst/Plugin/Static/Simple.pm 2013-02-25 22:57:18.667150181 +0100 +@@ -187,16 +187,27 @@ + my $type = $c->_ext_to_type( $full_path ); + my $stat = stat $full_path; + +- $c->res->headers->content_type( $type ); +- $c->res->headers->content_length( $stat->size ); +- $c->res->headers->last_modified( $stat->mtime ); + # Tell Firefox & friends its OK to cache, even over SSL: +- $c->res->headers->header('Cache-control' => 'public'); ++ #$c->res->headers->header('Cache-control' => 'public'); ++ ++ $c->res->headers->last_modified( $stat->mtime ); + # Optionally, set a fixed expiry time: + if ($config->{expires}) { + $c->res->headers->expires(time() + $config->{expires}); + } + ++ if ($config->{send_etag}) { ++ my $etag = '"' . $stat->mtime . '-' . $stat->ino . '-'. $stat->size . '"'; ++ $c->res->headers->header('ETag' => $etag); ++ if (($c->req->header('If-None-Match') // "") eq $etag) { ++ $c->res->status(304); ++ return 1; ++ } ++ } ++ ++ $c->res->headers->content_type( $type ); ++ $c->res->headers->content_length( $stat->size ); ++ + my $fh = IO::File->new( $full_path, 'r' ); + if ( defined $fh ) { + binmode $fh; diff --git a/pkgs/by-name/pe/perl/perl-modules/crypt-openpgp-remove-impure-keygen-tests.patch b/pkgs/by-name/pe/perl/perl-modules/crypt-openpgp-remove-impure-keygen-tests.patch new file mode 100644 index 0000000..70dc082 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/crypt-openpgp-remove-impure-keygen-tests.patch @@ -0,0 +1,30 @@ +diff --git a/t/13-keygen.t b/t/13-keygen.t +index f430ffb..2050624 100644 +--- a/t/13-keygen.t ++++ b/t/13-keygen.t +@@ -1,5 +1,5 @@ + use strict; +-use Test::More tests => 29; ++use Test::More tests => 25; + + use Crypt::OpenPGP; + use Crypt::OpenPGP::Message; +@@ -26,9 +26,6 @@ for my $type ( qw( RSA DSA ) ) { + isa_ok $pub->key, 'Crypt::OpenPGP::Certificate'; + isa_ok $sec->key, 'Crypt::OpenPGP::Certificate'; + +- is $pub->key->key_id, $sec->key->key_id, +- 'public key_id matches secret key_id'; +- + is $pub->primary_uid, $id, 'primary_uid matches'; + + is $pub->key->key->size, $bits, 'keysize (in bits) matches for pubkey'; +@@ -47,8 +44,6 @@ for my $type ( qw( RSA DSA ) ) { + isa_ok $pieces[1], 'Crypt::OpenPGP::UserID'; + isa_ok $pieces[2], 'Crypt::OpenPGP::Signature'; + +- is $pieces[0]->key_id, $sec->key->key_id, +- 'serialized public key_id matches secret key_id'; + } + + { diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/filtered-requirements.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/filtered-requirements.sh new file mode 100755 index 0000000..2e3509d --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/filtered-requirements.sh @@ -0,0 +1,18 @@ +#! /bin/sh + +source lib-cache.sh; + +print_reqs() { + module_name="$1"; + + ./requirements.sh "$1"| while read; do + if let "$(./source-download-link.sh "${REPLY}" | wc -c)" && [ perl != "$REPLY" ]; then + echo "$REPLY"; + fi; + done; +} + +module_name="$1"; +module_basename="${module_name//::/-}"; + +cached_output print_reqs "$module_basename" "$module_name" "pure.deps"; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/full-requirements.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/full-requirements.sh new file mode 100755 index 0000000..91218f3 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/full-requirements.sh @@ -0,0 +1,21 @@ +#! /bin/sh + +source lib-cache.sh; + +print_requirements () { + module_name="$1"; + + ./requirements.sh "$module_name" | while read; do + echo "$REPLY"; + print_reqs_cache "$REPLY"; + done | sort | uniq +}; + +print_reqs_cache () { + module_name="$1"; + module_basename="${module_name//::/-}"; + + cached_output print_requirements "$module_basename" "$module_name" "full.deps"; +}; + +print_reqs_cache "$@"; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/grab-url.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/grab-url.sh new file mode 100755 index 0000000..8935cad --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/grab-url.sh @@ -0,0 +1,19 @@ +#! /bin/sh + +source lib-cache.sh + +get_file() { + url="$1"; + + if [ -n "$url" ]; then + curl "$1"; + else + echo -n; + fi; +} + +url="$1"; +name="$2"; +name=${name:-$(basename "$url")} + +cached_output get_file "${name%%.*}" "$url" "${name#*.}" diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/lib-cache.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/lib-cache.sh new file mode 100644 index 0000000..6509514 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/lib-cache.sh @@ -0,0 +1,18 @@ + +# First argument: command to run +# Second argument: cache name +# Third argument: argument to command +# Fourth argument: cache type +cached_output () { + cmd="$1"; + basename="$2"; + arg="$3"; + ext="$4"; + + if ! [ -e "cache-${ext//./-}/${basename}.${ext}" ]; then + mkdir -p "cache-${ext//./-}"; + $cmd $arg > "cache-${ext//./-}/${basename}.${ext}"; + fi; + + cat "cache-${ext//./-}/${basename}.${ext}"; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/make-clean-dir.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/make-clean-dir.sh new file mode 100755 index 0000000..996cb92 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/make-clean-dir.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +rm -rf test; +mkdir test; +for i in *.sh; do ln -s ../$i test; done; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/requirements.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/requirements.sh new file mode 100755 index 0000000..19b24c5 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/requirements.sh @@ -0,0 +1,17 @@ +#! /bin/sh + +source lib-cache.sh; + +module_name="$1"; +module_basename="${1//::/-}"; + +print_requirements () { + module_name="$1"; + + ./retrieve-meta-yaml.sh "$module_name" | + sed -re '1,/^requires:/d; /^[a-z]/,$d; s@^\s*@@; s@:\s.*@@'; + ./retrieve-meta-yaml.sh "$module_name" | + sed -re '1,/^build_requires:/d; /^[a-z]/,$d; s@^\s*@@; s@:\s.*@@'; +}; + +cached_output print_requirements "$module_basename" "$module_name" "direct.deps"; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-file-link.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-file-link.sh new file mode 100755 index 0000000..c8ec5df --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-file-link.sh @@ -0,0 +1,14 @@ +#! /bin/sh + +module_basename="$1"; +file_name="$2"; + +version_regexp="${module_basename}(-[0-9.a-z]+){0,1}"; +author_regexp="[A-Z0-9]+"; + +./retrieve-modulepage.sh "$module_basename" | + egrep "[<]a href=\"[a-z0-9/]*/(${author_regexp}/){0,1}${version_regexp}/${file_name}" | + sed -re "s@.*href=\"@@; s@\".*@@" | + sed -re 's@^/@http://search.cpan.org/@'; + +echo "$link_line"; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-meta-yaml.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-meta-yaml.sh new file mode 100755 index 0000000..3b162eb --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-meta-yaml.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +source lib-cache.sh; + +print_meta_yaml () { + module_name="$1"; + module_basename="${module_name//::/-}"; + + ./grab-url.sh "$(./retrieve-file-link.sh "$module_basename" "META.yml")" \ + "${module_basename}.meta.yml"; +}; + +module_name="$1"; +module_basename="${module_name//::/-}"; + +cached_output print_meta_yaml "$module_basename" "$module_name" meta.yaml; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-modulepage.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-modulepage.sh new file mode 100755 index 0000000..866dfa1 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/retrieve-modulepage.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +module_basename="$1"; + +./grab-url.sh "http://search.cpan.org/dist/$module_basename/" "$module_basename".html; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/source-download-link.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/source-download-link.sh new file mode 100755 index 0000000..779d131 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/source-download-link.sh @@ -0,0 +1,17 @@ +#! /bin/sh + +source lib-cache.sh; + +module_name="$1"; +module_basename="${module_name//::/-}"; + +write_link() { + module_basename="$1"; + + ./retrieve-modulepage.sh "$module_basename" | + grep -A 2 "This Release" | + grep href | + sed -re 's/.*href="//; s/".*//; s@^/@http://search.cpan.org/@'; +} + +cached_output write_link "$module_basename" "$module_basename" src.link; diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/usage.txt b/pkgs/by-name/pe/perl/perl-modules/expression-generator/usage.txt new file mode 100644 index 0000000..1aa0737 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/usage.txt @@ -0,0 +1,10 @@ +/path/to/write-nix-expression.sh Group::Module::Submodule + +It will output Nix assignment formatted for placing into +all-packages.nix amongst all the perl packages, like perlAlgorithmDiff. +Actually it will grab distribution unit Group-Module-Submodule via +search.cpan.org, and make some effort to write correct dependencies. +If among requirements there are some that have empty META.yml, or if +any of requirements acannot be installed by just getting distribution +unit whose name can be guessed by replacing :: with -, manual editing +will be needed. diff --git a/pkgs/by-name/pe/perl/perl-modules/expression-generator/write-nix-expression.sh b/pkgs/by-name/pe/perl/perl-modules/expression-generator/write-nix-expression.sh new file mode 100755 index 0000000..9f5cdb9 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/expression-generator/write-nix-expression.sh @@ -0,0 +1,34 @@ +#! /bin/sh + +cd $(dirname $0); + +source lib-cache.sh; + +print_expression () { + module_name="$1"; + module_basename="${module_name//::/-}"; + module_compressedname="perl${module_name//::/}"; + sourcelink="$(./source-download-link.sh "${module_name}")"; + version_name="${sourcelink%.tar.*}"; + version_name="${version_name##*/}"; + dependencies="$(./filtered-requirements.sh "$module_name" | sed -e 's/^/perl/; s/:://g' | xargs)"; + source_hash=$(nix-prefetch-url "$sourcelink" 2>/dev/null); + + cat < /dev/null) + if test "$first" = "#!"; then + echo "patching $fn..." + sed -i "$fn" -e "s|^#\!\(.*\bperl\b.*\)$|#\!\1$perlFlags|" + fi + fi + done + + perl Makefile.PL PREFIX=$out INSTALLDIRS=site $makeMakerFlags PERL=$(type -P perl) FULLPERL=\"$fullperl/bin/perl\" +} + +if test -n "$perlPreHook"; then + eval "$perlPreHook" +fi + +genericBuild + +if test -n "$perlPostHook"; then + eval "$perlPostHook" +fi diff --git a/pkgs/by-name/pe/perl/perl-modules/generic/default.nix b/pkgs/by-name/pe/perl/perl-modules/generic/default.nix new file mode 100644 index 0000000..e7afedf --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/generic/default.nix @@ -0,0 +1,57 @@ +{ lib, stdenv, perl, toPerlModule }: + +{ buildInputs ? [] +, nativeBuildInputs ? [] +, outputs ? [ "out" "devdoc" ] +, src ? null + +# enabling or disabling does nothing for perl packages so set it explicitly +# to false to not change hashes when enableParallelBuildingByDefault is enabled +, enableParallelBuilding ? false + +, doCheck ? true +, checkTarget ? "test" + +# Prevent CPAN downloads. +, PERL_AUTOINSTALL ? "--skipdeps" + +# From http://wiki.cpantesters.org/wiki/CPANAuthorNotes: "allows +# authors to skip certain tests (or include certain tests) when +# the results are not being monitored by a human being." +, AUTOMATED_TESTING ? true + +# current directory (".") is removed from @INC in Perl 5.26 but many old libs rely on it +# https://metacpan.org/pod/release/XSAWYERX/perl-5.26.0/pod/perldelta.pod#Removal-of-the-current-directory-%28%22.%22%29-from-@INC +, PERL_USE_UNSAFE_INC ? "1" + +, env ? {} + +, ... +}@attrs: + +lib.throwIf (attrs ? name) "buildPerlPackage: `name` (\"${attrs.name}\") is deprecated, use `pname` and `version` instead" + +(let + defaultMeta = { + homepage = "https://metacpan.org/dist/${attrs.pname}"; + inherit (perl.meta) platforms; + }; + + package = stdenv.mkDerivation (attrs // { + name = "perl${perl.version}-${attrs.pname}-${attrs.version}"; + + builder = ./builder.sh; + + buildInputs = buildInputs ++ [ perl ]; + nativeBuildInputs = nativeBuildInputs ++ (if stdenv.buildPlatform != stdenv.hostPlatform then [ perl.mini ] else [ perl ]); + + inherit outputs src doCheck checkTarget enableParallelBuilding; + env = { + inherit PERL_AUTOINSTALL AUTOMATED_TESTING PERL_USE_UNSAFE_INC; + fullperl = perl.__spliced.buildHost or perl; + } // env; + + meta = defaultMeta // (attrs.meta or { }); + }); + +in toPerlModule package) diff --git a/pkgs/by-name/pe/perl/perl-modules/ham/default.nix b/pkgs/by-name/pe/perl/perl-modules/ham/default.nix new file mode 100644 index 0000000..8d1fce1 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/ham/default.nix @@ -0,0 +1,49 @@ +{ lib +, buildPerlPackage +, fetchFromGitHub +, makeWrapper +, openssh +, GitRepository +, URI +, XMLParser +}: + +buildPerlPackage { + pname = "ham-unstable"; + version = "2023-10-06"; + + src = fetchFromGitHub { + owner = "kernkonzept"; + repo = "ham"; + rev = "90d104ce481ee8f9b770be4b37d97f34eef5f82f"; + hash = "sha256-DeHH7k9K7CmQW6eOyf8TCV/HNYS30oFnI1b8ztBDk/o="; + }; + + outputs = [ "out" ]; + + nativeBuildInputs = [ makeWrapper ]; + propagatedBuildInputs = [ openssh GitRepository URI XMLParser ]; + + preConfigure = '' + patchShebangs . + touch Makefile.PL + rm -f Makefile + ''; + + installPhase = '' + mkdir -p $out/lib $out/bin + cp -r . $out/lib/ham + + makeWrapper $out/lib/ham/ham $out/bin/ham --argv0 ham \ + --prefix PATH : ${openssh}/bin + ''; + + meta = with lib; { + description = "A tool to manage big projects consisting of multiple loosely-coupled git repositories"; + homepage = "https://github.com/kernkonzept/ham"; + license = licenses.bsd2; + maintainers = with maintainers; [ aw ]; + mainProgram = "ham"; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/lwp-protocol-https-cert-file.patch b/pkgs/by-name/pe/perl/perl-modules/lwp-protocol-https-cert-file.patch new file mode 100644 index 0000000..3b6156d --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/lwp-protocol-https-cert-file.patch @@ -0,0 +1,14 @@ +diff --git a/lib/LWP/Protocol/https.pm b/lib/LWP/Protocol/https.pm +index 645e828..7098f64 100644 +--- a/lib/LWP/Protocol/https.pm ++++ b/lib/LWP/Protocol/https.pm +@@ -29,6 +29,9 @@ sub _extra_sock_opts + } + } + if ($ssl_opts{SSL_verify_mode}) { ++ if ($ENV{NIX_SSL_CERT_FILE}) { ++ $ssl_opts{SSL_ca_file} //= $ENV{NIX_SSL_CERT_FILE}; ++ } + unless (exists $ssl_opts{SSL_ca_file} || exists $ssl_opts{SSL_ca_path}) { + if ($Net::HTTPS::SSL_SOCKET_CLASS eq 'IO::Socket::SSL' + && defined &IO::Socket::SSL::default_ca diff --git a/pkgs/by-name/pe/perl/perl-modules/maatkit/default.nix b/pkgs/by-name/pe/perl/perl-modules/maatkit/default.nix new file mode 100644 index 0000000..d694508 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/maatkit/default.nix @@ -0,0 +1,43 @@ +{buildPerlPackage, lib, fetchurl, DBDmysql}: + +buildPerlPackage { + pname = "maatkit"; + version = "7540"; + + src = fetchurl { + url = "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/maatkit/maatkit-7540.tar.gz"; + sha256 = "1a7rxrddkrsfxb2wj01ha91ld0vapfkqcy8j9p08l76zz2l8p2v1"; + }; + + outputs = [ "out" ]; + + buildInputs = [ DBDmysql ] ; + + preConfigure = '' + find . | while read fn; do + if test -f "$fn"; then + first=$(dd if="$fn" count=2 bs=1 2> /dev/null) + if test "$first" = "#!"; then + sed < "$fn" > "$fn".tmp \ + -e "s|^#\!\(.*[/\ ]perl.*\)$|#\!$perl/bin/perl $perlFlags|" + if test -x "$fn"; then chmod +x "$fn".tmp; fi + mv "$fn".tmp "$fn" + fi + fi + done + '' ; + + meta = with lib; { + description = "Database toolkit"; + longDescription = '' + You can use Maatkit to prove replication is working correctly, fix + corrupted data, automate repetitive tasks, speed up your servers, and + much more. + + In addition to MySQL, there is support for PostgreSQL, Memcached, and a + growing variety of other databases and technologies. + ''; + license = licenses.gpl2Plus; + homepage = "http://www.maatkit.org/"; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/module-pluggable.patch b/pkgs/by-name/pe/perl/perl-modules/module-pluggable.patch new file mode 100644 index 0000000..51a029c --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/module-pluggable.patch @@ -0,0 +1,27 @@ +diff -ru Module-Pluggable-4.8/lib/Module/Pluggable/Object.pm Module-Pluggable-4.8-new/lib/Module/Pluggable/Object.pm +--- Module-Pluggable-4.8/lib/Module/Pluggable/Object.pm 2013-05-28 01:30:06.000000000 +0200 ++++ Module-Pluggable-4.8-new/lib/Module/Pluggable/Object.pm 2013-06-02 23:24:52.704125205 +0200 +@@ -180,12 +180,13 @@ + my $sp = catdir($dir, (split /::/, $searchpath)); + + # if it doesn't exist or it's not a dir then skip it +- next unless ( -e $sp && -d _ ); # Use the cached stat the second time ++ next unless ( -d $sp ); + + my @files = $self->find_files($sp); + + # foreach one we've found + foreach my $file (@files) { ++ + # untaint the file; accept .pm only + next unless ($file) = ($file =~ /(.*$file_regex)$/); + # parse the file to get the name +@@ -314,7 +315,7 @@ + (my $path = $File::Find::name) =~ s#^\\./##; + push @files, $path; + } +- }, $search_path ); ++ }, "$search_path/." ); + } + #chdir $cwd; + return @files; diff --git a/pkgs/by-name/pe/perl/perl-modules/net-amazon-mechanicalturk.patch b/pkgs/by-name/pe/perl/perl-modules/net-amazon-mechanicalturk.patch new file mode 100644 index 0000000..dde13b9 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/net-amazon-mechanicalturk.patch @@ -0,0 +1,65 @@ +From http://daveviner.blogspot.com/2009/12/amazon-mechanical-turk-perl-library.html +http://www.vinertech.com/patches/net-amazon-mechanicalturk.patch + +diff -rubB Net-Amazon-MechanicalTurk-1.01/lib/Net/Amazon/MechanicalTurk/ModuleUtil.pm Net-Amazon-MechanicalTurk-1.01/lib/Net/Amazon/MechanicalTurk/ModuleUtil.pm +--- Net-Amazon-MechanicalTurk-1.01/lib/Net/Amazon/MechanicalTurk/ModuleUtil.pm 2007-08-13 11:38:53.000000000 -0700 ++++ Net-Amazon-MechanicalTurk-1.01/lib/Net/Amazon/MechanicalTurk/ModuleUtil.pm 2009-12-13 16:37:49.000000000 -0800 +@@ -29,17 +29,21 @@ + } + + sub packageExists { +- my ($class, $package) = @_; ++ my ($class, $package, $moduleFile) = @_; ++ ++ if (defined($moduleFile) && exists($INC{$moduleFile})) { ++ return 1; ++ } + # Symbol table black magic + no strict 'refs'; +- return defined %{*{"${package}::"}}; ++ return scalar(keys(%{*{"${package}::"}})); + } + + sub require { + my ($class, $module) = @_; +- if (!$class->packageExists($module)) { + my $moduleFile = $module . ".pm"; + $moduleFile =~ s/::/\//g; ++ if (!$class->packageExists($module, $moduleFile)) { + require $moduleFile; + } + } +diff -rubB Net-Amazon-MechanicalTurk-1.01/t/73-datagenerator-dbi.t Net-Amazon-MechanicalTurk-1.01/t/73-datagenerator-dbi.t +--- Net-Amazon-MechanicalTurk-1.01/t/73-datagenerator-dbi.t 2007-08-13 11:38:56.000000000 -0700 ++++ Net-Amazon-MechanicalTurk-1.01/t/73-datagenerator-dbi.t 2009-12-13 16:55:30.000000000 -0800 +@@ -8,10 +8,10 @@ + + eval { + require DBI; +- require DBD::SQLite2; ++ require DBD::SQLite; + }; + if ($@) { +- plan skip_all => "SQLite2 not installed."; ++ plan skip_all => "SQLite not installed."; + } + else { + plan tests => 2; +@@ -21,7 +21,7 @@ + #----------------------- + my $dbfile = "t/data/test.db"; + unlink($dbfile) if (-f $dbfile); +-my $dbh = DBI->connect("dbi:SQLite2:dbname=${dbfile}","","", { ++my $dbh = DBI->connect("dbi:SQLite:dbname=${dbfile}","","", { + RaiseError => 1, + AutoCommit => 1 + }); +@@ -42,7 +42,7 @@ + foreach my $id (1..30) { + $sth->execute($id, rand(), scalar localtime()); + } +- ++$sth->finish(); + + # Actual test + #---------------------- diff --git a/pkgs/by-name/pe/perl/perl-modules/perl-opengl-gl-extensions.txt b/pkgs/by-name/pe/perl/perl-modules/perl-opengl-gl-extensions.txt new file mode 100644 index 0000000..42df14c --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/perl-opengl-gl-extensions.txt @@ -0,0 +1,5 @@ +GLUT=20801 +VERSION=3.0 Mesa 10.2.6 +VENDOR=Intel Open Source Technology Center +RENDERER=Mesa DRI Intel(R) Ivybridge Mobile +EXTENSIONS=GL_ARB_multisample GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_copy_texture GL_EXT_polygon_offset GL_EXT_subtexture GL_EXT_texture_object GL_EXT_vertex_array GL_EXT_compiled_vertex_array GL_EXT_texture GL_EXT_texture3D GL_IBM_rasterpos_clip GL_ARB_point_parameters GL_EXT_draw_range_elements GL_EXT_packed_pixels GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_separate_specular_color GL_EXT_texture_edge_clamp GL_SGIS_generate_mipmap GL_SGIS_texture_border_clamp GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_ARB_framebuffer_sRGB GL_ARB_multitexture GL_EXT_framebuffer_sRGB GL_IBM_multimode_draw_arrays GL_IBM_texture_mirrored_repeat GL_3DFX_texture_compression_FXT1 GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_transpose_matrix GL_EXT_blend_func_separate GL_EXT_fog_coord GL_EXT_multi_draw_arrays GL_EXT_secondary_color GL_EXT_texture_env_add GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod_bias GL_INGR_blend_func_separate GL_NV_blend_square GL_NV_light_max_exponent GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_S3_s3tc GL_SUN_multi_draw_arrays GL_ARB_texture_border_clamp GL_ARB_texture_compression GL_EXT_framebuffer_object GL_EXT_texture_compression_s3tc GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_MESA_window_pos GL_NV_packed_depth_stencil GL_NV_texture_rectangle GL_ARB_depth_texture GL_ARB_occlusion_query GL_ARB_shadow GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_window_pos GL_ATI_envmap_bumpmap GL_EXT_stencil_two_side GL_EXT_texture_cube_map GL_NV_depth_clamp GL_APPLE_packed_pixels GL_APPLE_vertex_array_object GL_ARB_draw_buffers GL_ARB_fragment_program GL_ARB_fragment_shader GL_ARB_shader_objects GL_ARB_vertex_program GL_ARB_vertex_shader GL_ATI_draw_buffers GL_ATI_texture_env_combine3 GL_ATI_texture_float GL_EXT_shadow_funcs GL_EXT_stencil_wrap GL_MESA_pack_invert GL_NV_primitive_restart GL_ARB_depth_clamp GL_ARB_fragment_program_shadow GL_ARB_half_float_pixel GL_ARB_occlusion_query2 GL_ARB_point_sprite GL_ARB_shading_language_100 GL_ARB_sync GL_ARB_texture_non_power_of_two GL_ARB_vertex_buffer_object GL_ATI_blend_equation_separate GL_EXT_blend_equation_separate GL_OES_read_format GL_ARB_color_buffer_float GL_ARB_pixel_buffer_object GL_ARB_texture_compression_rgtc GL_ARB_texture_float GL_ARB_texture_rectangle GL_EXT_packed_float GL_EXT_pixel_buffer_object GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_rectangle GL_EXT_texture_sRGB GL_EXT_texture_shared_exponent GL_ARB_framebuffer_object GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_packed_depth_stencil GL_APPLE_object_purgeable GL_ARB_vertex_array_object GL_ATI_separate_stencil GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_gpu_program_parameters GL_EXT_texture_array GL_EXT_texture_integer GL_EXT_texture_sRGB_decode GL_EXT_timer_query GL_OES_EGL_image GL_AMD_performance_monitor GL_ARB_copy_buffer GL_ARB_depth_buffer_float GL_ARB_draw_instanced GL_ARB_half_float_vertex GL_ARB_instanced_arrays GL_ARB_map_buffer_range GL_ARB_texture_rg GL_ARB_texture_swizzle GL_ARB_vertex_array_bgra GL_EXT_texture_swizzle GL_EXT_vertex_array_bgra GL_NV_conditional_render GL_AMD_conservative_depth GL_AMD_draw_buffers_blend GL_AMD_seamless_cubemap_per_texture GL_ARB_ES2_compatibility GL_ARB_blend_func_extended GL_ARB_debug_output GL_ARB_draw_buffers_blend GL_ARB_draw_elements_base_vertex GL_ARB_explicit_attrib_location GL_ARB_fragment_coord_conventions GL_ARB_provoking_vertex GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_shader_texture_lod GL_ARB_texture_cube_map_array GL_ARB_texture_gather GL_ARB_texture_multisample GL_ARB_texture_query_lod GL_ARB_texture_rgb10_a2ui GL_ARB_uniform_buffer_object GL_ARB_vertex_type_2_10_10_10_rev GL_EXT_provoking_vertex GL_EXT_texture_snorm GL_MESA_texture_signed_rgba GL_ARB_get_program_binary GL_ARB_robustness GL_ARB_separate_shader_objects GL_ARB_shader_bit_encoding GL_ARB_timer_query GL_ARB_transform_feedback2 GL_ARB_transform_feedback3 GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ARB_conservative_depth GL_ARB_internalformat_query GL_ARB_map_buffer_alignment GL_ARB_shader_atomic_counters GL_ARB_shading_language_420pack GL_ARB_shading_language_packing GL_ARB_texture_storage GL_ARB_transform_feedback_instanced GL_EXT_framebuffer_multisample_blit_scaled GL_EXT_transform_feedback GL_AMD_shader_trinary_minmax GL_ARB_ES3_compatibility GL_ARB_clear_buffer_object GL_ARB_invalidate_subdata GL_ARB_texture_query_levels GL_ARB_texture_storage_multisample GL_ARB_texture_view GL_ARB_vertex_attrib_binding GL_KHR_debug GL_ARB_buffer_storage GL_ARB_multi_bind GL_ARB_texture_mirror_clamp_to_edge GL_ARB_vertex_type_10f_11f_11f_rev GL_EXT_shader_integer_mix GL_INTEL_performance_query diff --git a/pkgs/by-name/pe/perl/perl-modules/perl-opengl.patch b/pkgs/by-name/pe/perl/perl-modules/perl-opengl.patch new file mode 100644 index 0000000..a44dc4f --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/perl-opengl.patch @@ -0,0 +1,57 @@ +diff --git a/Makefile.PL b/Makefile.PL +index 55c485c..8501c02 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -124,14 +124,7 @@ if ($^O eq 'MSWin32' || $IS_W32API) + # Look for available libs + our @libdirs = qw + { +- -L/usr/lib +- -L/usr/lib/i386-linux-gnu +- -L/usr/X11R6/lib +- -L/opt/X11/lib +- -L/usr/local/lib +- -L/usr/openwin/lib +- -L/opt/csw/lib +- -L/usr/local/freeglut/lib ++ @@libpaths@@ + }; + + our @check_libs = qw +@@ -764,7 +759,6 @@ sub get_extensions + my $exc_file = 'gl_exclude.h'; + unlink($exc_file) if (-e $exc_file); + my $glv_file = 'utils/glversion.txt'; +- unlink($glv_file) if (-e $glv_file); + + # Only run the rest if GLUT is installed + print "Testing GLUT version\n" if ($verbose); +@@ -817,7 +811,7 @@ sub get_extensions + $make_ver = ";make -f Makefile " . (length($lib) ? "GLUT_LIB=$lib " : "") . (length($def) ? "GLUT_DEF=$def " : ""); + print "glversion: '$make_ver'\n" if $verbose>1; + } +- my $exec = 'cd utils'."$make_ver clean".$make_ver; ++ my $exec = 'cd utils'.$make_ver; + print "glversion: $exec\n" if ($verbose); + my $stat = `$exec`; + print "\n$stat\n\n" if ($verbose); +diff --git a/utils/Makefile b/utils/Makefile +index 910dcaf..1b1ac57 100644 +--- a/utils/Makefile ++++ b/utils/Makefile +@@ -21,14 +21,13 @@ EXTRALIBS=-lGLU -lXi -lXmu -lXext -lX11 -lm + all: glversion.txt + + glversion.txt: glversion +- ./glversion > glversion.txt ++ echo "skipping build of glversion.txt" + + glversion: glversion.o + ${LINK} glversion.o ${LDFLAGS} ${EXTRALIBS} -o glversion + chmod u+x glversion + + clean: +- rm -f glversion.txt + rm -f glversion + rm -f glversion.o + diff --git a/pkgs/by-name/pe/perl/perl-modules/sdl-modern-perl.patch b/pkgs/by-name/pe/perl/perl-modules/sdl-modern-perl.patch new file mode 100644 index 0000000..c97eeb0 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/sdl-modern-perl.patch @@ -0,0 +1,64 @@ +From d734d03862d7dcc776bd2fa3ba662cdd5879b32e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 12 Jul 2023 17:55:27 +0200 +Subject: [PATCH] Adapt to perl 5.37.1 + +Perl 5.37.1 removed a deprecated sv_nv() macro and SDL fails to build +with Perl 5.38.0: + +lib/SDLx/Controller/Interface.xs:60:26: error: implicit declaration of function 'sv_nv' + 60 | out->dv_x = sv_nv(temp); + | ^~~~~ + +Users are advised to use SvNVx() macro instead. SvNVx() seems to have been +available all the time (it predates a commit from 1993-10-07). + +This patch does that. + +https://github.com/PerlGameDev/SDL/issues/303 +--- + src/SDLx/Controller/Interface.xs | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/SDLx/Controller/Interface.xs b/src/SDLx/Controller/Interface.xs +index 3dc202b7..d326c885 100644 +--- a/src/SDLx/Controller/Interface.xs ++++ b/src/SDLx/Controller/Interface.xs +@@ -57,15 +57,15 @@ void evaluate(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, fl + + SV *temp; + temp = av_pop(accel); +- out->dv_x = sv_nv(temp); ++ out->dv_x = SvNVx(temp); + SvREFCNT_dec(temp); + + temp = av_pop(accel); +- out->dv_y = sv_nv(temp); ++ out->dv_y = SvNVx(temp); + SvREFCNT_dec(temp); + + temp = av_pop(accel); +- out->dang_v = sv_nv(temp); ++ out->dang_v = SvNVx(temp); + SvREFCNT_dec(temp); + + SvREFCNT_dec((SV *)accel); +@@ -90,15 +90,15 @@ void evaluate_dt(SDLx_Interface *obj, SDLx_Derivative *out, SDLx_State *initial, + + SV *temp; + temp = av_pop(accel); +- out->dv_x = sv_nv(temp); ++ out->dv_x = SvNVx(temp); + SvREFCNT_dec(temp); + + temp = av_pop(accel); +- out->dv_y = sv_nv(temp); ++ out->dv_y = SvNVx(temp); + SvREFCNT_dec(temp); + + temp = av_pop(accel); +- out->dang_v = sv_nv(temp); ++ out->dang_v = SvNVx(temp); + SvREFCNT_dec(temp); + + SvREFCNT_dec((SV *)accel); diff --git a/pkgs/by-name/pe/perl/perl-modules/strip-nondeterminism/default.nix b/pkgs/by-name/pe/perl/perl-modules/strip-nondeterminism/default.nix new file mode 100644 index 0000000..31b3fad --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/strip-nondeterminism/default.nix @@ -0,0 +1,69 @@ +{ lib +, stdenv +, file +, fetchFromGitLab +, buildPerlPackage +, ArchiveZip +, ArchiveCpio +, SubOverride +, shortenPerlShebang +}: + +buildPerlPackage rec { + pname = "strip-nondeterminism"; + version = "1.13.1"; + + outputs = [ "out" "dev" ]; # no "devdoc" + + src = fetchFromGitLab { + owner = "reproducible-builds"; + repo = "strip-nondeterminism"; + domain = "salsa.debian.org"; + rev = version; + sha256 = "czx9UhdgTsQSfDNo1mMOXCM/3/nuNe+cPZeyy2xdnKs="; + }; + + strictDeps = true; + nativeBuildInputs = lib.optionals stdenv.isDarwin [ shortenPerlShebang ]; + buildInputs = [ + ArchiveZip + ArchiveCpio + SubOverride + ]; + + postPatch = '' + substituteInPlace lib/File/StripNondeterminism.pm \ + --replace "exec('file'" "exec('${lib.getExe file}'" + ''; + + + postBuild = '' + patchShebangs ./bin + ''; + + postInstall = '' + # we don’t need the debhelper script + rm $out/bin/dh_strip_nondeterminism + rm $out/share/man/man1/dh_strip_nondeterminism.1 + '' + lib.optionalString stdenv.isDarwin '' + shortenPerlShebang $out/bin/strip-nondeterminism + ''; + + installCheckPhase = '' + runHook preInstallCheck + ($out/bin/strip-nondeterminism --help 2>&1 | grep -q "verbose") || (echo "'$out/bin/strip-nondeterminism --help' failed" && exit 1) + runHook postInstallCheck + ''; + + # running shortenPerlShebang in postBuild results in non-functioning binary 'exec format error' + doCheck = !stdenv.isDarwin; + doInstallCheck = true; + + meta = with lib; { + description = "A Perl module for stripping bits of non-deterministic information"; + mainProgram = "strip-nondeterminism"; + homepage = "https://reproducible-builds.org/"; + license = licenses.gpl3Only; + maintainers = with maintainers; [ pSub artturin ]; + }; +} diff --git a/pkgs/by-name/pe/perl/perl-modules/tk-configure-implicit-int-fix.patch b/pkgs/by-name/pe/perl/perl-modules/tk-configure-implicit-int-fix.patch new file mode 100644 index 0000000..215bf86 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/tk-configure-implicit-int-fix.patch @@ -0,0 +1,11 @@ +--- a/JPEG/jpeg/configure 2013-11-15 18:50:03.000000000 -0500 ++++ b/JPEG/jpeg/configure 2023-09-05 23:36:12.675151164 -0400 +@@ -623,7 +623,7 @@ + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + ac_cv_prog_cc_works=yes diff --git a/pkgs/by-name/pe/perl/perl-modules/xml-grove-utf8.patch b/pkgs/by-name/pe/perl/perl-modules/xml-grove-utf8.patch new file mode 100644 index 0000000..d0b9130 --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/xml-grove-utf8.patch @@ -0,0 +1,10 @@ +--- XML-Grove-0.46alpha/t/grove.t 2008-07-22 14:47:27.000000000 +0200 ++++ XML-Grove-0.46alpha/t/grove.t 2008-07-22 14:46:42.000000000 +0200 +@@ -13,6 +13,7 @@ use XML::Parser::PerlSAX; + use XML::Grove::Builder; + use XML::Grove::AsString; + use XML::Grove::AsCanonXML; ++use utf8; + + $loaded = 1; + print "ok 1\n"; diff --git a/pkgs/by-name/pe/perl/perl-modules/xml-parser-0001-HACK-Assumes-Expat-paths-are-good.patch b/pkgs/by-name/pe/perl/perl-modules/xml-parser-0001-HACK-Assumes-Expat-paths-are-good.patch new file mode 100644 index 0000000..add6d9d --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-modules/xml-parser-0001-HACK-Assumes-Expat-paths-are-good.patch @@ -0,0 +1,45 @@ +From e996904128653c67b04ddbdb1e10cef158098957 Mon Sep 17 00:00:00 2001 +From: Samuel Dionne-Riel +Date: Fri, 6 Dec 2019 23:00:51 -0500 +Subject: [PATCH] [HACK]: Assumes Expat paths are good. + +The `check_lib` check fails with the cross-compilation build platform's +Perl, since apparently `mktemp` is missing... + +Even then, side-stepping the issue, it seems it is not actually enough +to work, as the compilation fails. +--- + Makefile.PL | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +diff --git a/Makefile.PL b/Makefile.PL +index 505d1df..fc38b76 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -29,12 +29,17 @@ foreach (@ARGV) { + @ARGV = @replacement_args; + + unless ( +- check_lib( # fill in what you prompted the user for here +- lib => [qw(expat)], +- header => ['expat.h'], +- incpath => $expat_incpath, +- ( $expat_libpath ? ( libpath => $expat_libpath ) : () ), +- ) ++ #check_lib( # fill in what you prompted the user for here ++ # lib => [qw(expat)], ++ # header => ['expat.h'], ++ # incpath => $expat_incpath, ++ # ( $expat_libpath ? ( libpath => $expat_libpath ) : () ), ++ #) ++ # The check_lib implementation fails horribly with cross-compilation. ++ # We are giving known good paths to expat. ++ # And in all cases, the previous behaviour of not actually failing ++ # seemed to work just fine :/. ++ false + ) { + warn <<'Expat_Not_Installed;'; + +-- +2.23.0 + diff --git a/pkgs/by-name/pe/perl/perl-packages.nix b/pkgs/by-name/pe/perl/perl-packages.nix new file mode 100644 index 0000000..abb5bae --- /dev/null +++ b/pkgs/by-name/pe/perl/perl-packages.nix @@ -0,0 +1,29314 @@ +/* This file defines the composition for CPAN (Perl) packages. It has + been factored out of all-packages.nix because there are so many of + them. Also, because most Nix expressions for CPAN packages are + trivial, most are actually defined here. I.e. there's no function + for each package in a separate file: the call to the function would + be almost as much code as the function itself. */ + +{ config +, stdenv, lib, buildPackages, pkgs, darwin +, fetchurl, fetchpatch, fetchFromGitHub, fetchFromGitLab +, perl, shortenPerlShebang +# , nixosTests +}: + +self: + +# cpan2nix assumes that perl-packages.nix will be used only with perl 5.30.3 or above +assert lib.versionAtLeast perl.version "5.30.3"; +let + inherit (lib) maintainers teams; + +in +with self; { + + inherit perl; + perlPackages = self // { perlPackages = self.perlPackages // { __attrsFailEvaluation = true; }; }; + + # Check whether a derivation provides a perl module. + hasPerlModule = drv: drv ? perlModule ; + + requiredPerlModules = drvs: let + modules = lib.filter hasPerlModule drvs; + in lib.unique ([perl] ++ modules ++ lib.concatLists (lib.catAttrs "requiredPerlModules" modules)); + + # Convert derivation to a perl module. + toPerlModule = drv: + drv.overrideAttrs( oldAttrs: { + # Use passthru in order to prevent rebuilds when possible. + passthru = (oldAttrs.passthru or {}) // { + perlModule = perl; + requiredPerlModules = requiredPerlModules drv.propagatedBuildInputs; + }; + }); + + buildPerlPackage = callPackage ./perl-modules/generic { }; + + # Helper functions for packages that use Module::Build to build. + buildPerlModule = args: + buildPerlPackage ({ + buildPhase = '' + runHook preBuild + perl Build.PL --prefix=$out; ./Build build + runHook postBuild + ''; + installPhase = '' + runHook preInstall + ./Build install + runHook postInstall + ''; + checkPhase = '' + runHook preCheck + ./Build test + runHook postCheck + ''; + } // args // { + preConfigure = '' + touch Makefile.PL + ${args.preConfigure or ""} + ''; + buildInputs = (args.buildInputs or []) ++ [ ModuleBuild ]; + }); + + /* Construct a perl search path (such as $PERL5LIB) + + Example: + pkgs = import { } + makePerlPath [ pkgs.perlPackages.libnet ] + => "/nix/store/n0m1fk9c960d8wlrs62sncnadygqqc6y-perl-Net-SMTP-1.25/lib/perl5/site_perl" + */ + makePerlPath = lib.makeSearchPathOutput "lib" perl.libPrefix; + + /* Construct a perl search path recursively including all dependencies (such as $PERL5LIB) + + Example: + pkgs = import { } + makeFullPerlPath [ pkgs.perlPackages.CGI ] + => "/nix/store/fddivfrdc1xql02h9q500fpnqy12c74n-perl-CGI-4.38/lib/perl5/site_perl:/nix/store/8hsvdalmsxqkjg0c5ifigpf31vc4vsy2-perl-HTML-Parser-3.72/lib/perl5/site_perl:/nix/store/zhc7wh0xl8hz3y3f71nhlw1559iyvzld-perl-HTML-Tagset-3.20/lib/perl5/site_perl" + */ + makeFullPerlPath = deps: makePerlPath (lib.misc.closePropagation deps); + + + # ack = buildPerlPackage rec { + # pname = "ack"; + # version = "3.7.0"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/ack-v${version}.tar.gz"; + # hash = "sha256-6nyqFPdX3ggzEO0suimGYd3Mpd7gbsjxgEPqYlp53yA="; + # }; + + # outputs = [ "out" "man" ]; + + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # propagatedBuildInputs = [ FileNext ]; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/ack + # ''; + + # # tests fails on nixos and hydra because of different purity issues + # doCheck = false; + + # meta = { + # description = "A grep-like tool tailored to working with large trees of source code"; + # homepage = "https://beyondgrep.com"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ActionCircuitBreaker = buildPerlPackage { + # pname = "Action-CircuitBreaker"; + # version = "0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HANGY/Action-CircuitBreaker-0.1.tar.gz"; + # hash = "sha256-P49dcm+uU3qzNuAKaBmuSoWW5MXyQ+dypTbvLrbmBrE="; + # }; + # buildInputs = [ ActionRetry TryTiny ]; + # propagatedBuildInputs = [ Moo ]; + # meta = { + # description = "Module to try to perform an action, with an option to suspend execution after a number of failures"; + # homepage = "https://github.com/hangy/Action-CircuitBreaker"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ActionRetry = buildPerlPackage { + # pname = "Action-Retry"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAMS/Action-Retry-0.24.tar.gz"; + # hash = "sha256-o3WXQsW+8tGXWrc9NUmdgRMySRmySTYTAlXP8H0ClPc="; + # }; + # propagatedBuildInputs = [ MathFibonacci ModuleRuntime Moo ]; + # meta = { + # description = "Module to try to perform an action, with various ways of retrying and sleeping between retries"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlgorithmAnnotate = buildPerlPackage { + # pname = "Algorithm-Annotate"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CL/CLKAO/Algorithm-Annotate-0.10.tar.gz"; + # hash = "sha256-ybF2RkOTPrGjNWkGzDctSDqZQWIHox3z5Y7piS2ZIvk="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff ]; + # meta = { + # description = "Represent a series of changes in annotate form"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlgorithmBackoff = buildPerlPackage { + # pname = "Algorithm-Backoff"; + # version = "0.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/Algorithm-Backoff-0.009.tar.gz"; + # sha256 = "9f0ffcdf1e65a88022d6412f46ad977ede5a7b64be663009d13948fe8c9d180b"; + # }; + # buildInputs = [ TestException TestNumberDelta ]; + # meta = { + # homepage = "https://metacpan.org/release/Algorithm-Backoff"; + # description = "Various backoff strategies for retry"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlgorithmC3 = buildPerlPackage { + # pname = "Algorithm-C3"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Algorithm-C3-0.11.tar.gz"; + # hash = "sha256-qvSEZ3Zd7qbkgFS8fUPkbk1Ay82hZVLGKdN74Jgokwk="; + # }; + # meta = { + # description = "A module for merging hierarchies using the C3 algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlgorithmCheckDigits = buildPerlModule { + # pname = "Algorithm-CheckDigits"; + # version = "1.3.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAMAWE/Algorithm-CheckDigits-v1.3.6.tar.gz"; + # hash = "sha256-DySHqP0fMbGcUbJlCELyJkwed9liSHoTtSG74GbEtLw="; + # }; + # buildInputs = [ ProbePerl ]; + # meta = { + # description = "Perl extension to generate and test check digits"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "checkdigits.pl"; + # }; + # }; + + # AlgorithmDiff = buildPerlPackage { + # pname = "Algorithm-Diff"; + # version = "1.1903"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TY/TYEMQ/Algorithm-Diff-1.1903.tar.gz"; + # hash = "sha256-MOhKxLMdQLZik/exIhMxxaUFYaOdWA2FAE2cH/+ZF1E="; + # }; + # buildInputs = [ pkgs.unzip ]; + # meta = { + # description = "Compute 'intelligent' differences between two files / lists"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlgorithmLCSS = buildPerlPackage { + # pname = "Algorithm-LCSS"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JF/JFREEMAN/Algorithm-LCSS-0.01.tar.gz"; + # hash = "sha256-cXzvzHhCoXGrVXbyLrcuVm7fBhzq+H3Mvn8ggfVgH3g="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff ]; + # meta = { + # description = "Perl extension for getting the Longest Common Sub-Sequence"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AlgorithmMerge = buildPerlPackage { + # pname = "Algorithm-Merge"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JS/JSMITH/Algorithm-Merge-0.08.tar.gz"; + # hash = "sha256-nAaIJYodxLg5iAU7n5qY53KM25tppQCNy9JR0PgIFs8="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff ]; + # meta = { + # description = "Three-way merge and diff"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienBaseModuleBuild = buildPerlModule { + # pname = "Alien-Base-ModuleBuild"; + # version = "1.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-Base-ModuleBuild-1.17.tar.gz"; + # hash = "sha256-/nJwrHNa3ehk5GjiHGQqRxuoi6Ja0w2pRXiDITLyufQ="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ AlienBuild ArchiveExtract CaptureTiny Filechdir PathTiny ShellConfigGenerate ShellGuess SortVersions URI ]; + # meta = { + # description = "A Module::Build subclass for building Alien:: modules and their libraries"; + # homepage = "https://metacpan.org/pod/Alien::Base::ModuleBuild"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienBuild = buildPerlPackage { + # pname = "Alien-Build"; + # version = "2.80"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-Build-2.80.tar.gz"; + # hash = "sha256-2e3JNrBnBbtcte5aLqi89hEaPogVkU8XfhXjwP7TAfM="; + # }; + # propagatedBuildInputs = [ CaptureTiny FFICheckLib FileWhich Filechdir PathTiny PkgConfig ]; + # buildInputs = [ DevelHide Test2Suite ]; + # meta = { + # description = "Build external dependencies for use in CPAN"; + # homepage = "https://metacpan.org/pod/Alien::Build"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienBuildPluginDownloadGitLab = buildPerlPackage { + # pname = "Alien-Build-Plugin-Download-GitLab"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-Build-Plugin-Download-GitLab-0.01.tar.gz"; + # hash = "sha256-wfCJyOoVKniZCdSKg9v88mJvdz2vMEMchiJYKyarqQI="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ AlienBuild PathTiny URI ]; + # meta = { + # homepage = "https://metacpan.org/pod/Alien::Build::Plugin::Download::GitLab"; + # description = "Alien::Build plugin to download from GitLab"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienFFI = buildPerlPackage { + # pname = "Alien-FFI"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-FFI-0.27.tar.gz"; + # hash = "sha256-Kbsgg/P5gqOfSFIkP09qEZFpZvIObneGTpkmnRHotl4="; + # }; + # patches = [ ./perl-modules/Alien-FFI-dont-download.patch ]; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.libffi CaptureTiny Test2Suite NetSSLeay MojoDOM58 IOSocketSSL ]; + # propagatedBuildInputs = [ AlienBuild ]; + # meta = { + # homepage = "https://metacpan.org/pod/Alien::FFI"; + # description = "Build and make available libffi"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # AlienGMP = buildPerlPackage { + # pname = "Alien-GMP"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-GMP-1.16.tar.gz"; + # hash = "sha256-CQzUjuU1v2LxeIlWF6hReDrhGqTGAGof1NhKQy8RPaU="; + # }; + # propagatedBuildInputs = [ AlienBuild ]; + # buildInputs = [ pkgs.gmp Alienm4 DevelChecklib IOSocketSSL MojoDOM58 NetSSLeay SortVersions Test2Suite URI ]; + # meta = { + # description = "Alien package for the GNU Multiple Precision library"; + # homepage = "https://metacpan.org/pod/Alien::GMP"; + # license = with lib.licenses; [ lgpl3Plus ]; + # }; + # }; + + # AlienLibGumbo = buildPerlModule { + # pname = "Alien-LibGumbo"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RUZ/Alien-LibGumbo-0.05.tar.gz"; + # hash = "sha256-D76RarEfaA5cKM0ayAA3IyPioOBq/8bIs2J5/GTXZRc="; + # }; + # buildInputs = [ AlienBaseModuleBuild ]; + # propagatedBuildInputs = [ AlienBuild FileShareDir PathClass ]; + # meta = { + # description = "Gumbo parser library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.AlienLibGumbo.x86_64-darwin + # }; + # }; + + # AlienLibxml2 = buildPerlPackage { + # pname = "Alien-Libxml2"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-Libxml2-0.19.tar.gz"; + # hash = "sha256-9KZ0CZu9V0fAw7derYQfOyRJNdnvQro1NoAkvWERdMk="; + # }; + # strictDeps = true; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # propagatedBuildInputs = [ AlienBuild ]; + # buildInputs = [ pkgs.libxml2 AlienBuildPluginDownloadGitLab MojoDOM58 SortVersions Test2Suite URI ]; + # meta = { + # description = "Install the C libxml2 library on your system"; + # homepage = "https://metacpan.org/pod/Alien::Libxml2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # aliased = buildPerlModule { + # pname = "aliased"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/aliased-0.34.tar.gz"; + # hash = "sha256-w1BSRQfNgn+rhk5dTCzDULG6uqEvqVrsDKAIQ/zH3us="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Use shorter versions of class names"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # asa = buildPerlPackage { + # pname = "asa"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/asa-1.04.tar.gz"; + # hash = "sha256-5YM7dOczuu4Z0e9eBLEmPBz/nBdGmVrXL8QJGPRAZ14="; + # }; + # meta = { + # description = "Lets your class/object say it works like something else"; + # homepage = "https://github.com/karenetheridge/asa"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienSDL = buildPerlModule { + # pname = "Alien-SDL"; + # version = "1.446"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FROGGS/Alien-SDL-1.446.tar.gz"; + # hash = "sha256-yaosncPGPYl3PH1yA/KkbRuSTQxy2fgBrxR6Pci8USo="; + # }; + # patches = [ ./perl-modules/alien-sdl.patch ]; + + # installPhase = "./Build install --prefix $out"; + + # SDL_INST_DIR = lib.getDev pkgs.SDL; + # buildInputs = [ pkgs.SDL ArchiveExtract ArchiveZip TextPatch ]; + # propagatedBuildInputs = [ CaptureTiny FileShareDir FileWhich ]; + + # meta = { + # description = "Get, Build and Use SDL libraries"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienTidyp = buildPerlModule { + # pname = "Alien-Tidyp"; + # version = "1.4.7"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KM/KMX/Alien-Tidyp-v1.4.7.tar.gz"; + # hash = "sha256-uWTL2nH79sDqaaTztBUEwUXygWga/hmewrSUQC6/SmU="; + # }; + + # buildInputs = [ ArchiveExtract ]; + # TIDYP_DIR = pkgs.tidyp; + # propagatedBuildInputs = [ FileShareDir ]; + # meta = { + # description = "Building, finding and using tidyp library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AlienWxWidgets = buildPerlModule { + # pname = "Alien-wxWidgets"; + # version = "0.69"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MD/MDOOTSON/Alien-wxWidgets-0.69.tar.gz"; + # hash = "sha256-UyJOS7vv/0z3tj7ZpiljiTuf/Ull1w2WcQNI+Gdt4kk="; + # }; + # postPatch = '' + # substituteInPlace Build.PL \ + # --replace "gtk+-2.0" "gtk+-3.0" + # ''; + # propagatedBuildInputs = [ pkgs.pkg-config pkgs.gtk3 pkgs.wxGTK32 ModulePluggable ]; + # buildInputs = [ LWPProtocolHttps ]; + # meta = { + # description = "Building, finding and using wxWidgets binaries"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Alienm4 = buildPerlPackage { + # pname = "Alien-m4"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-m4-0.21.tar.gz"; + # hash = "sha256-qypAXIA5RP0BxR+h6fK+/VhxqwPxdE3sKlZonyFI02E="; + # }; + # propagatedBuildInputs = [ AlienBuild ]; + # buildInputs = [ pkgs.gnum4 Alienpatch IOSocketSSL MojoDOM58 NetSSLeay SortVersions Test2Suite URI ]; + # meta = { + # description = "Find or build GNU m4"; + # homepage = "https://metacpan.org/pod/Alien::m4"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Alienpatch = buildPerlPackage { + # pname = "Alien-patch"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Alien-patch-0.15.tar.gz"; + # hash = "sha256-/tZyJbLZamZpL30vQ+DTRykhRSnbHWsTsNykYgquANA="; + # }; + # propagatedBuildInputs = [ AlienBuild ]; + # buildInputs = [ IOSocketSSL MojoDOM58 NetSSLeay SortVersions Test2Suite URI ]; + # meta = { + # description = "Find or build patch"; + # homepage = "https://metacpan.org/pod/Alien::patch"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AltCryptRSABigInt = buildPerlPackage { + # pname = "Alt-Crypt-RSA-BigInt"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANAJ/Alt-Crypt-RSA-BigInt-0.06.tar.gz"; + # hash = "sha256-dvQ0yrNpmc3wmBE0W7Oda3y+1+CFsCM4Mox/RuCLOPM="; + # }; + # propagatedBuildInputs = [ ClassLoader ConvertASCIIArmour DataBuffer DigestMD2 MathBigIntGMP MathPrimeUtil SortVersions TieEncryptedHash ]; + # meta = { + # description = "RSA public-key cryptosystem, using Math::BigInt"; + # homepage = "https://github.com/danaj/Alt-Crypt-RSA-BigInt"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AnyEvent = buildPerlPackage { + # pname = "AnyEvent"; + # version = "7.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/AnyEvent-7.17.tar.gz"; + # hash = "sha256-UL7qaJwJj+Sq64OAbEC5/n+UbVdprPmfhJ8JkJGkuYU="; + # }; + # buildInputs = [ CanaryStability ]; + # meta = { + # description = "The DBI of event loop programming"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventAIO = buildPerlPackage { + # pname ="AnyEvent-AIO"; + # version = "1.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/AnyEvent-AIO-1.1.tar.gz"; + # hash = "sha256-axBbjGQVYWMfUz7DQj6AZ6PX1YBDv4Xw9eCdcGkFcGs="; + # }; + # propagatedBuildInputs = [ AnyEvent IOAIO ]; + # meta = { + # description = "Truly asynchronous file and directory I/O"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventBDB = buildPerlPackage rec { + # pname = "AnyEvent-BDB"; + # version = "1.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/${pname}-${version}.tar.gz"; + # hash = "sha256-k+NgEJQEZGJuXzG5+u3WXhLtjRq/Fs4FL+vyP0la78g="; + # }; + # buildInputs = [ CanaryStability ]; + # propagatedBuildInputs = [ BDB AnyEvent ]; + # meta = { + # description = "Truly asynchronous berkeley db access"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventCacheDNS = buildPerlModule { + # pname = "AnyEvent-CacheDNS"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PO/POTYL/AnyEvent-CacheDNS-0.08.tar.gz"; + # hash = "sha256-QcH68YO2GAa1WInO6hI3dQwfYbnOJzX98z3AVTZxLa4="; + # }; + # propagatedBuildInputs = [ AnyEvent ]; + # doCheck = false; # does an DNS lookup + # meta = { + # description = "Simple DNS resolver with caching"; + # homepage = "https://github.com/potyl/perl-AnyEvent-CacheDNS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventFastPing = buildPerlPackage { + # pname = "AnyEvent-FastPing"; + # version = "2.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/AnyEvent-FastPing-2.1.tar.gz"; + # hash = "sha256-5ZIbj3rTXJg6ACWuAKSPyVyQwX/uw+WFmBhwSwxScCw="; + # }; + # propagatedBuildInputs = [ AnyEvent commonsense ]; + # meta = { + # description = "Quickly ping a large number of hosts"; + # license = with lib.licenses; [ artistic1 gpl2Plus ]; + # mainProgram = "fastping"; + # }; + # }; + + # AnyEventHTTP = buildPerlPackage { + # pname = "AnyEvent-HTTP"; + # version = "2.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/AnyEvent-HTTP-2.25.tar.gz"; + # hash = "sha256-XPpTQWEkF29vTNMrAOqMp5otXfUSWGg5ic0E/obiUBM="; + # }; + # propagatedBuildInputs = [ AnyEvent commonsense ]; + # meta = { + # description = "Simple but non-blocking HTTP/HTTPS client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventI3 = buildPerlPackage { + # pname = "AnyEvent-I3"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTPLBG/AnyEvent-I3-0.17.tar.gz"; + # hash = "sha256-U4LJhMnxODlfKfDACvgaoMj0t2VYIFXHPt5LE/BKbWM="; + # }; + # propagatedBuildInputs = [ AnyEvent JSONXS ]; + # meta = { + # description = "Communicate with the i3 window manager"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventIRC = buildPerlPackage rec { + # pname = "AnyEvent-IRC"; + # version = "0.97"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EL/ELMEX/${pname}-${version}.tar.gz"; + # hash = "sha256-v9fPZFw8jGEUcQVxKGEUR+IPGt8BUWxpYky9i8d/W/A="; + # }; + # propagatedBuildInputs = [ AnyEvent ObjectEvent commonsense ]; + # meta = { + # description = "An event based IRC protocol client API"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyEventRabbitMQ = buildPerlPackage { + # pname = "AnyEvent-RabbitMQ"; + # version = "1.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DL/DLAMBLEY/AnyEvent-RabbitMQ-1.22.tar.gz"; + # hash = "sha256-mMUqH+cAcQ8+W8VaOLJd5iXpsug0HSeNz54bPz0ZrO4="; + # }; + # buildInputs = [ FileShareDirInstall TestException ]; + # propagatedBuildInputs = [ AnyEvent DevelGlobalDestruction FileShareDir ListMoreUtils NetAMQP Readonly namespaceclean ]; + # meta = { + # description = "An asynchronous and multi channel Perl AMQP client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyMoose = buildPerlPackage { + # pname = "Any-Moose"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Any-Moose-0.27.tar.gz"; + # hash = "sha256-qKY+N/qALoJYvpmYORbN5FElgdyAYt5Q5z1mr24thTU="; + # }; + # propagatedBuildInputs = [ Moose Mouse ]; + # meta = { + # description = "(DEPRECATED) use Moo instead!"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AnyURIEscape = buildPerlPackage { + # pname = "Any-URI-Escape"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/Any-URI-Escape-0.01.tar.gz"; + # hash = "sha256-44E87J8Qj6XAvmbgjBmGv7pNJCFRsPn07F4MXhcQjEw="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Load URI::Escape::XS preferentially over URI::Escape"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URIEscapeXS = buildPerlPackage { + # pname = "URI-Escape-XS"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANKOGAI/URI-Escape-XS-0.14.tar.gz"; + # hash = "sha256-w5rFDGwrgxrkvwhpLmyl1KP5xX3E1/nEywZj4shsJ1k="; + # }; + # meta = { + # description = "Drop-In replacement for URI::Escape"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ApacheAuthCookie = buildPerlPackage { + # pname = "Apache-AuthCookie"; + # version = "3.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHOUT/Apache-AuthCookie-3.31.tar.gz"; + # hash = "sha256-ByhnLrmLzWZSWWenXXxNYXwLTEEWIBOsmkzv5G99/3w="; + # }; + # buildInputs = [ ApacheTest ]; + # propagatedBuildInputs = [ ClassLoad HTTPBody HashMultiValue WWWFormUrlEncoded ]; + + # # Fails because /etc/protocols is not available in sandbox and make + # # getprotobyname('tcp') in ApacheTest fail. + # doCheck = !stdenv.isLinux; + + # meta = { + # description = "Perl Authentication and Authorization via cookies"; + # homepage = "https://github.com/mschout/apache-authcookie"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ApacheDB = buildPerlPackage { + # pname = "Apache-DB"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LZ/LZE/Apache-DB-0.18.tar.gz"; + # hash = "sha256-ZSf08VmCcL6ge+x4e3G98OwrVyVIvnQ4z3TyuaYAv+0="; + # }; + # meta = { + # description = "Run the interactive Perl debugger under mod_perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ApacheLogFormatCompiler = buildPerlModule { + # pname = "Apache-LogFormat-Compiler"; + # version = "0.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/Apache-LogFormat-Compiler-0.36.tar.gz"; + # hash = "sha256-lFCVA+506oIBg9BwwRYw7lvA/YwSy3T66VPtYuShrBc="; + # }; + # buildInputs = [ HTTPMessage ModuleBuildTiny TestMockTime TestRequires TryTiny URI ]; + # propagatedBuildInputs = [ POSIXstrftimeCompiler ]; + # # We cannot change the timezone on the fly. + # prePatch = "rm t/04_tz.t"; + # meta = { + # description = "Compile a log format string to perl-code"; + # homepage = "https://github.com/kazeburo/Apache-LogFormat-Compiler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ApacheSession = buildPerlModule { + # pname = "Apache-Session"; + # version = "1.94"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Apache-Session-1.94.tar.gz"; + # hash = "sha256-/mm3aJmv6QuK5bgt4qqnV1rakIk39EhbgKrvMXVj6Z8="; + # }; + # buildInputs = [ TestDeep TestException ]; + # meta = { + # description = "A persistence framework for session data"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ApacheTest = buildPerlPackage { + # pname = "Apache-Test"; + # version = "1.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHAY/Apache-Test-1.43.tar.gz"; + # hash = "sha256-qZmfAqeBpYkhi1ibGHnBHEladFrwlXXly7It/LZWgKw="; + # }; + # doCheck = false; + # meta = { + # description = "Test.pm wrapper with helpers for testing Apache"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # AppCLI = buildPerlPackage { + # pname = "App-CLI"; + # version = "0.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PT/PTC/App-CLI-0.52.tar.gz"; + # hash = "sha256-Ur1D9VWRPML/1kBfmVHSqr1Gr2PXAdm140amMycJ8M4="; + # }; + # propagatedBuildInputs = [ CaptureTiny ClassLoad ]; + # buildInputs = [ TestKwalitee TestPod ]; + # meta = { + # description = "Dispatcher module for command line interface programs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AppClusterSSH = buildPerlModule { + # pname = "App-ClusterSSH"; + # version = "4.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DU/DUNCS/App-ClusterSSH-4.16.tar.gz"; + # hash = "sha256-G3y4q2BoViRK34vZrE0nUHwuQWh7OvGiJs4dsvP9VXg="; + # }; + # propagatedBuildInputs = [ ExceptionClass Tk X11ProtocolOther XMLSimple ]; + # buildInputs = [ DataDump FileWhich Readonly TestDifferences TestTrap ]; + # preCheck = "rm t/30cluster.t t/15config.t"; # do not run failing tests + # postInstall = '' + # mkdir -p $out/share/bash-completion/completions + # mv $out/bin/clusterssh_bash_completion.dist \ + # $out/share/bash-completion/completions/clusterssh_bash_completion + # substituteInPlace $out/share/bash-completion/completions/clusterssh_bash_completion \ + # --replace '/bin/true' '${pkgs.coreutils}/bin/true' \ + # --replace 'grep' '${pkgs.gnugrep}/bin/grep' \ + # --replace 'sed' '${pkgs.gnused}/bin/sed' + # ''; + # meta = { + # description = "Cluster administration tool"; + # homepage = "https://github.com/duncs/clusterssh/wiki"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "cssh"; + # }; + # }; + + # AppCmd = buildPerlPackage { + # pname = "App-Cmd"; + # version = "0.336"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/App-Cmd-0.336.tar.gz"; + # hash = "sha256-35ZrV9WauxluADBIheW/EXypWBgq4/Tu3xchjqKDjoE="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ CaptureTiny ClassLoad GetoptLongDescriptive IOTieCombine ModulePluggable StringRewritePrefix ]; + # meta = { + # description = "Write command line apps with less suffering"; + # homepage = "https://github.com/rjbs/App-Cmd"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AppConfig = buildPerlPackage { + # pname = "AppConfig"; + # version = "1.71"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/AppConfig-1.71.tar.gz"; + # hash = "sha256-EXcCcCXssJ7mTZ+fJVYVwE214U91NsNEr2MgMuuIew8="; + # }; + # buildInputs = [ TestPod ]; + # meta = { + # description = "A bundle of Perl5 modules for reading configuration files and parsing command line arguments"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AppFatPacker = buildPerlPackage { + # pname = "App-FatPacker"; + # version = "0.010008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/App-FatPacker-0.010008.tar.gz"; + # hash = "sha256-Ep2zbchFZhpYIoaBDP4tUhbrLOCCutQK4fzc4PRd7M8="; + # }; + # meta = { + # description = "Pack your dependencies onto your script file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "fatpack"; + # }; + # }; + + # Appcpanminus = buildPerlPackage { + # pname = "App-cpanminus"; + # version = "1.7047"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7047.tar.gz"; + # hash = "sha256-lj5jxuGocl/y9iTpCGOWrhUNtR3QozfDeB0JqZSvBaU="; + # }; + # # Use TLS endpoints for downloads and metadata by default + # preConfigure = '' + # substituteInPlace bin/cpanm \ + # --replace http://www.cpan.org https://www.cpan.org \ + # --replace http://backpan.perl.org https://backpan.perl.org \ + # --replace http://fastapi.metacpan.org https://fastapi.metacpan.org \ + # --replace http://cpanmetadb.plackperl.org https://cpanmetadb.plackperl.org + # ''; + # propagatedBuildInputs = [ IOSocketSSL ]; + # meta = { + # description = "Get, unpack, build and install modules from CPAN"; + # homepage = "https://github.com/miyagawa/cpanminus"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "cpanm"; + # }; + # }; + + # Appcpm = buildPerlModule { + # pname = "App-cpm"; + # version = "0.997014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/App-cpm-0.997014.tar.gz"; + # hash = "sha256-LdTAPFQDnC0CzN0u+VvG/1bPvbdGzQdvywqVR8UEmQg="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ CPAN02PackagesSearch CPANCommonIndex CPANDistnameInfo ClassTiny CommandRunner ExtUtilsInstall ExtUtilsInstallPaths FileCopyRecursive Filepushd HTTPTinyish MenloLegacy Modulecpmfile ModuleCPANfile ParsePMFile ParallelPipes locallib ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/cpm + # ''; + # meta = { + # description = "A fast CPAN module installer"; + # homepage = "https://github.com/skaji/cpm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # mainProgram = "cpm"; + # }; + # }; + + # Applify = buildPerlPackage { + # pname = "Applify"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Applify-0.23.tar.gz"; + # hash = "sha256-fI3Z55e9DsJgDTAOzUnul4EZgxxlay0L3q7OoENIoRI="; + # }; + # meta = { + # description = "Write object oriented scripts with ease"; + # homepage = "https://github.com/jhthorsen/applify"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AppMusicChordPro = buildPerlPackage { + # pname = "App-Music-ChordPro"; + # version = "6.030"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/App-Music-ChordPro-6.030.tar.gz"; + # hash = "sha256-a+5H8U5gmYPkrBUyxxwajPQy9m6sWeDlaeHTfg2cwnc="; + # }; + # buildInputs = [ ObjectPad ]; + # propagatedBuildInputs = [ AppPackager FileLoadLines FileHomeDir IOString ImageInfo PDFAPI2 StringInterpolateNamed TextLayout ] + # ++ lib.optionals (!stdenv.isDarwin) [ Wx ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + + # # Delete tests that fail when version env var is set, see + # # https://github.com/ChordPro/chordpro/issues/293 + # patchPhase = '' + # rm t/320_subst.t t/321_subst.t t/322_subst.t + # ''; + + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/chordpro + # rm $out/bin/wxchordpro # Wx not supported on darwin + # ''; + # meta = { + # description = "A lyrics and chords formatting program"; + # homepage = "https://www.chordpro.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "chordpro"; + # }; + # }; + + # AppPackager = buildPerlPackage { + # pname = "App-Packager"; + # version = "1.440"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/App-Packager-1.440.tar.gz"; + # hash = "sha256-VoFBa+b9eJe+mEg8TqKOsN3gzGWzwg5o1HswRN7PKHo="; + # }; + # meta = { + # description = "Abstraction for Packagers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Appperlbrew = buildPerlModule { + # pname = "App-perlbrew"; + # version = "0.98"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GU/GUGOD/App-perlbrew-0.98.tar.gz"; + # hash = "sha256-oWD3ESJYjdU12pTbsLgwHkjlONJaRCobE/cZCWKIWTI="; + # }; + # buildInputs = [ pkgs.curl FileWhich IOAll ModuleBuildTiny PathClass TestException TestNoWarnings TestOutput TestSpec TestTempDirTiny ]; + # propagatedBuildInputs = [ CPANPerlReleases CaptureTiny DevelPatchPerl PodParser locallib ]; + + # doCheck = false; + + # meta = { + # description = "Manage perl installations in your $HOME"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "perlbrew"; + # }; + # }; + + # ArchiveAnyLite = buildPerlPackage { + # pname = "Archive-Any-Lite"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Archive-Any-Lite-0.11.tar.gz"; + # hash = "sha256-FcGIJTmTpLZuVZnweJsTJvCmbAkr2/rJMTcG1BwoUXA="; + # }; + # propagatedBuildInputs = [ ArchiveZip ]; + # buildInputs = [ ExtUtilsMakeMakerCPANfile TestUseAllModules ]; + # meta = { + # description = "Simple CPAN package extractor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AppSqitch = buildPerlModule { + # version = "1.4.0"; + # pname = "App-Sqitch"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DW/DWHEELER/App-Sqitch-v1.4.0.tar.gz"; + # hash = "sha256-sNs4cDH3dWJmLgA7xV16EComOAtK1/25qKO61XaeUBw="; + # }; + # buildInputs = [ CaptureTiny TestDeep TestDir TestException TestFile TestFileContents TestMockModule TestMockObject TestNoWarnings TestWarn ]; + # propagatedBuildInputs = [ Clone ConfigGitLike DBI DateTime EncodeLocale HashMerge IOPager IPCRun3 IPCSystemSimple ListMoreUtils PathClass PerlIOutf8_strict PodParser StringFormatter StringShellQuote TemplateTiny Throwable TypeTiny URIdb libintl-perl ]; + # doCheck = false; # Can't find home directory. + # meta = { + # description = "Sensible database change management"; + # homepage = "https://sqitch.org"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "sqitch"; + # }; + # }; + + # AppSt = buildPerlPackage { + # pname = "App-St"; + # version = "1.1.4"; + # src = fetchurl { + # url = "https://github.com/nferraz/st/archive/v1.1.4.tar.gz"; + # hash = "sha256-wCoW9n5MNXaQpUODGYQxSf1wDCIxKPn/6+yrKEnFi7g="; + # }; + # postInstall = + # '' + # ($out/bin/st --help || true) | grep Usage + # ''; + # meta = { + # description = "Simple Statistics"; + # homepage = "https://github.com/nferraz/st"; + # license = with lib.licenses; [ mit ]; + # maintainers = [ maintainers.eelco ]; + # mainProgram = "st"; + # }; + # }; + + # AttributeParamsValidate = buildPerlPackage { + # pname = "Attribute-Params-Validate"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Attribute-Params-Validate-1.21.tar.gz"; + # hash = "sha256-WGuTnO/9s3GIt8Rh3RqPnzVpUYTIcDsFw19tUIyAkPU="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ ParamsValidate ]; + # doCheck = false; + # meta = { + # description = "Validate method/function parameters"; + # homepage = "https://metacpan.org/release/Params-Validate"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ArchiveLibarchive = buildPerlPackage { + # pname = "Archive-Libarchive"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Archive-Libarchive-0.08.tar.gz"; + # hash = "sha256-6ONC1U/T1uXn4xYP4IjBOgpQM8/76JSBodJHHUNyAFk="; + # }; + # patches = [ ./perl-modules/ArchiveLibarchive-set-findlib-path.patch ]; + # postPatch = '' + # substituteInPlace lib/Archive/Libarchive/Lib.pm --replace "@@libarchive@@" "${pkgs.libarchive.lib}/lib" + # ''; + # buildInputs = [ FFIC Filechdir PathTiny SubIdentify TermTable Test2Suite Test2ToolsMemoryCycle TestArchiveLibarchive TestScript ]; + # propagatedBuildInputs = [ FFICStat FFICheckLib FFIPlatypus FFIPlatypusTypeEnum FFIPlatypusTypePtrObject RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/Archive::Libarchive"; + # description = "Modern Perl bindings to libarchive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # ArchiveLibarchiveExtract = buildPerlPackage { + # pname = "Archive-Libarchive-Extract"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Archive-Libarchive-Extract-0.03.tar.gz"; + # hash = "sha256-yXfAR0hnIX6zJvte5pA04e9spBQUkWHjEpAblf0SwIE="; + # }; + # buildInputs = [ Test2Suite TestScript ]; + # propagatedBuildInputs = [ ArchiveLibarchive Filechdir PathTiny RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/Archive::Libarchive::Extract"; + # description = "An archive extracting mechanism (using libarchive)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # ArchiveLibarchivePeek = buildPerlPackage { + # pname = "Archive-Libarchive-Peek"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Archive-Libarchive-Peek-0.04.tar.gz"; + # hash = "sha256-DYhJ4xG2RsozWz6gGodTtAIkK5XOgAo7zNXHCC4nJPo="; + # }; + # buildInputs = [ Filechdir Test2Suite TestScript ]; + # propagatedBuildInputs = [ ArchiveLibarchive PathTiny RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/Archive::Libarchive::Peek"; + # description = "Peek into archives without extracting them"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # ArrayCompare = buildPerlModule { + # pname = "Array-Compare"; + # version = "3.0.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVECROSS/Array-Compare-v3.0.8.tar.gz"; + # hash = "sha256-MEc7XpEBU4QNJDHqlGO55W5SPN56PFBhadaaK5dC2DQ="; + # }; + + # buildInputs = [ TestNoWarnings ]; + # propagatedBuildInputs = [ Moo TypeTiny ]; + # meta = { + # description = "Perl extension for comparing arrays"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ArrayDiff = buildPerlPackage { + # pname = "Array-Diff"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Array-Diff-0.09.tar.gz"; + # hash = "sha256-gAY5Lphh50FTfCu8kRbI5CuWLy4H6NZBov9qEcZEUHc="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff ClassAccessor ]; + # meta = { + # description = "Find the differences between two arrays"; + # homepage = "https://github.com/neilb/array-diff-perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ArrayFIFO = buildPerlPackage { + # pname = "Array-FIFO"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBURKE/Array-FIFO-0.13.tar.gz"; + # hash = "sha256-virrX1qa8alvADNQilacqTrRmtFdx8a5mObXvHQMZvc="; + # }; + # buildInputs = [ TestDeep TestSpec TestTrap ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "A Simple limitable FIFO array, with sum and average methods"; + # homepage = "https://github.com/dwburke/perl-Array-FIFO"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ArrayRefElem = buildPerlPackage { + # pname = "Array-RefElem"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id//G/GA/GAAS/Array-RefElem-1.00.tar.gz"; + # hash = "sha256-U7iAo67AQ+TjcM4SaCtHVt5F3XQtq1cpT+IaFUU87+M="; + # }; + # meta = { + # description = "Set up array elements as aliases"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ArrayUtils = buildPerlPackage { + # pname = "ArrayUtils"; + # version = "0.5"; + # src = fetchurl { + # url = "https://cpan.metacpan.org/authors/id/Z/ZM/ZMIJ/Array/Array-Utils-0.5.tar.gz"; + # hash = "sha256-id0bf82bQ3lJKjp3SW45/mzTebdz/QOmsWDdJu3mN3A="; + # }; + # meta = { + # description = "Small utils for array manipulation"; + # homepage = "https://metacpan.org/pod/Array::Utils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AsyncPing = buildPerlPackage { + # pname = "AsyncPing"; + # version = "2016.1207"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XI/XINFWANG/AsyncPing-2016.1207.tar.gz"; + # hash = "sha256-b76a/sF6d3B2+K2JksjSMAr2WpUDRD0dT/nD+NKZyVo="; + # }; + # meta = { + # description = "Ping a huge number of servers in several seconds"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # AsyncUtil = buildPerlPackage { + # pname = "Async-Util"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WH/WHITNEY/Async-Util-0.01.tar.gz"; + # hash = "sha256-jzKxHKvFD2Xjh79W8mWBV6IsNah5Nmbhtfis/hMQkQY="; + # }; + # buildInputs = [ AnyEvent ListMoreUtils ]; + # meta = { + # description = "Utilities for doing common async operations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ArchiveCpio = buildPerlPackage { + # pname = "Archive-Cpio"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PI/PIXEL/Archive-Cpio-0.10.tar.gz"; + # hash = "sha256-JG+zFml2TngzayGRE0Ei4HxE8tgtxPN9VSqyj4ZovtM="; + # }; + # meta = { + # description = "Module for manipulations of cpio archives"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; # See https://rt.cpan.org/Public/Bug/Display.html?id=43597#txn-569710 + # mainProgram = "cpio-filter"; + # }; + # }; + + # ArchiveExtract = buildPerlPackage { + # pname = "Archive-Extract"; + # version = "0.88"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Archive-Extract-0.88.tar.gz"; + # hash = "sha256-z/zxNc0GIih9OwIVT31nFklUSfyu0DlmYhlI4l6l90I="; + # }; + # meta = { + # description = "Generic archive extracting mechanism"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ArchiveTar = buildPerlPackage { + # pname = "Archive-Tar"; + # version = "3.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Archive-Tar-3.02.tar.gz"; + # hash = "sha256-gWM8h/c3hGGD01wPTJ1ALalHqEa0iBswzObZ6+PInRk="; + # }; + # meta = { + # description = "Manipulates TAR archives"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "ptar"; + # }; + # }; + + # ArchiveTarWrapper = buildPerlPackage { + # pname = "Archive-Tar-Wrapper"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARFREITAS/Archive-Tar-Wrapper-0.38.tar.gz"; + # hash = "sha256-GfPQ2qi5XP+2jHBDUN0GdKI+HS8U0DKQO36WCe23s3o="; + # }; + # propagatedBuildInputs = [ FileWhich IPCRun LogLog4perl ]; + # meta = { + # description = "API wrapper around the 'tar' utility"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # ArchiveZip = buildPerlPackage { + # pname = "Archive-Zip"; + # version = "1.68"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/Archive-Zip-1.68.tar.gz"; + # hash = "sha256-mE4YXXhbr2EpxudfjrREEXRawAv2Ei+xyOgio4YexlA="; + # }; + # buildInputs = [ TestMockModule ]; + # meta = { + # description = "Provide an interface to ZIP archive files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "crc32"; + # }; + # }; + + # AstroFITSHeader = buildPerlModule { + # pname = "Astro-FITS-Header"; + # version = "3.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GS/GSB/Astro-FITS-Header-3.09.tar.gz"; + # hash = "sha256-cq1oveWku+zv8VFtZ3A/4tACFDlwQpo81pplFlLVaYY="; + # }; + # meta = { + # description = "Object-oriented interface to FITS HDUs"; + # homepage = "https://github.com/timj/perl-Astro-FITS-Header"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # AudioCuefileParser = buildPerlPackage { + # pname = "Audio-Cuefile-Parser"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTK/Audio-Cuefile-Parser-0.02.tar.gz"; + # hash = "sha256-ulbQcMhz2WxoatmoH99P6JuETkPrSd/gAL+c70PFtmk="; + # }; + # meta = { + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AudioFLACHeader = buildPerlPackage { + # pname = "Audio-FLAC-Header"; + # version = "2.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANIEL/Audio-FLAC-Header-2.4.tar.gz"; + # hash = "sha256-+6WRHWwi2BUGVlzZoUOOhgVCD/eYbPA9GhLQBqQHBUM="; + # }; + # meta = { + # description = "Interface to FLAC header metadata"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AudioScan = buildPerlPackage { + # pname = "Audio-Scan"; + # version = "1.05"; + # src = fetchurl { + # url = "https://github.com/Logitech/slimserver-vendor/raw/public/8.3/CPAN/Audio-Scan-1.05.tar.gz"; + # hash = "sha256-9YXC8GHPRWKlV8emmTke7RB0HhiCbALmZQqtQFLcBi4="; + # }; + # buildInputs = [ pkgs.zlib TestWarn ]; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.zlib.dev}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.zlib.out}/lib -lz"; + # meta = { + # description = "Fast C metadata and tag reader for all common audio file formats, slimserver fork"; + # homepage = "https://github.com/Logitech/slimserver-vendor"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # AuthenDecHpwd = buildPerlModule { + # pname = "Authen-DecHpwd"; + # version = "2.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Authen-DecHpwd-2.007.tar.gz"; + # hash = "sha256-9DqTuwK0H3Mn2S+eljtpUF9nNQpS6PUHlvmK/E+z8Xc="; + # }; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # propagatedBuildInputs = [ DataInteger DigestCRC ScalarString ]; + # meta = { + # description = "DEC VMS password hashing"; + # license = with lib.licenses; [ gpl1Plus ]; + # }; + # }; + + # AuthenHtpasswd = buildPerlPackage { + # pname = "Authen-Htpasswd"; + # version = "0.171"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/Authen-Htpasswd-0.171.tar.gz"; + # hash = "sha256-tfr0fj+UikUoEGzLiMxxBIz+WY5bAmpEQ2i8fjk0gGc="; + # }; + # propagatedBuildInputs = [ ClassAccessor CryptPasswdMD5 DigestSHA1 IOLockedFile ]; + # # Remove test files that fail after DES support was removed from crypt() + # postPatch = '' + # rm t/04core.t t/05edit.t + # ''; + # meta = { + # description = "Interface to read and modify Apache .htpasswd files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AuthenKrb5 = buildPerlModule { + # pname = "Authen-Krb5"; + # version = "1.905"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IO/IOANR/Authen-Krb5-1.905.tar.gz"; + # hash = "sha256-13sAuxUBpW9xGOkarAx+Qi2888QY+c6YuAF3HDqg900="; + # }; + # perlPreHook = "export LD=$CC"; + # propagatedBuildInputs = [ pkgs.libkrb5 ]; + # buildInputs = [ DevelChecklib FileWhich PkgConfig ]; + # meta = { + # description = "XS bindings for Kerberos 5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AuthenKrb5Admin = buildPerlPackage { + # pname = "Authen-Krb5-Admin"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SJ/SJQUINNEY/Authen-Krb5-Admin-0.17.tar.gz"; + # hash = "sha256-XdScrNmD79YajD8aVlcbtzeF6xVZCLXXvsl+7XjfDFQ="; + # }; + # propagatedBuildInputs = [ pkgs.krb5.dev AuthenKrb5 ]; + # # The following ENV variables are required by Makefile.PL to find + # # programs in krb5.dev. It is not enough to just specify the + # # path to krb5-config as this tool returns the prefix of krb5, + # # which implies a working value for KRB5_LIBDIR, but not the others. + # perlPreHook = '' + # export KRB5_CONFTOOL=${pkgs.krb5.dev}/bin/krb5-config + # export KRB5_BINDIR=${pkgs.krb5.dev}/bin + # export KRB5_INCDIR=${pkgs.krb5.dev}/include + # ''; + # # Tests require working Kerberos infrastructure so replace with a + # # simple attempt to exercise the module. + # checkPhase = '' + # perl -I blib/lib -I blib/arch -MAuthen::Krb5::Admin -e 'print "1..1\nok 1\n"' + # ''; + # meta = { + # description = "Perl extension for MIT Kerberos 5 admin interface"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # AuthenModAuthPubTkt = buildPerlPackage { + # pname = "Authen-ModAuthPubTkt"; + # version = "0.1.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AG/AGORDON/Authen-ModAuthPubTkt-0.1.1.tar.gz"; + # hash = "sha256-eZbhpCxRIWADzPA8S1JQKGtMVWhCV5cYUfXs6RYdx90="; + # }; + # propagatedBuildInputs = [ pkgs.openssl IPCRun3 ]; + # patchPhase = '' + # sed -i 's|my $openssl_bin = "openssl";|my $openssl_bin = "${pkgs.openssl}/bin/openssl";|' lib/Authen/ModAuthPubTkt.pm + # # -dss1 doesn't exist for dgst in openssl 1.1, -sha1 can also handle DSA keys now + # sed -i 's|-dss1|-sha1|' lib/Authen/ModAuthPubTkt.pm + # ''; + # meta = { + # description = "Generate Tickets (Signed HTTP Cookies) for mod_auth_pubtkt protected websites"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mod_auth_pubtkt.pl"; + # }; + # }; + + # AuthenOATH = buildPerlPackage { + # pname = "Authen-OATH"; + # version = "2.0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OA/OALDERS/Authen-OATH-2.0.1.tar.gz"; + # hash = "sha256-GoE9vcBcP72d0528/YXiz7C6PQ9lLPaybsg6uBRt3Hc="; + # }; + # buildInputs = [ TestNeeds ]; + # propagatedBuildInputs = [ DigestHMAC Moo TypeTiny ]; + # meta = { + # description = "OATH One Time Passwords"; + # homepage = "https://github.com/oalders/authen-oath"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AuthenPassphrase = buildPerlModule { + # pname = "Authen-Passphrase"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Authen-Passphrase-0.008.tar.gz"; + # hash = "sha256-VdtFIGF9hZ2IwO5Ull2oFbcibXkrjNyN6/kgc1WeBGM="; + # }; + # propagatedBuildInputs = [ AuthenDecHpwd CryptDES CryptEksblowfish CryptMySQL CryptPasswdMD5 CryptUnixCryptXS DataEntropy DigestMD4 ModuleRuntime ]; + # meta = { + # description = "Hashed passwords/passphrases as objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AuthenRadius = buildPerlPackage { + # pname = "Authen-Radius"; + # version = "0.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PO/PORTAONE/Authen-Radius-0.32.tar.gz"; + # hash = "sha256-eyCPmDfIOhhCZyVIklNlh+7Qvd5J577euj1ypmUjF0A="; + # }; + # buildInputs = [ TestNoWarnings ]; + # propagatedBuildInputs = [ DataHexDump NetIP ]; + # meta = { + # description = "Provide simple Radius client facilities"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + AuthenSASL = buildPerlPackage { + pname = "Authen-SASL"; + version = "2.1700"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/EH/EHUELS/Authen-SASL-2.1700.tar.gz"; + hash = "sha256-uG1aV2uNOHruJPOfR6VK/RS7ZrCQA9tQZQAfHeA6js4="; + }; + propagatedBuildInputs = [ DigestHMAC ]; + meta = { + description = "SASL Authentication framework"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # AuthenSASLSASLprep = buildPerlModule { + # pname = "Authen-SASL-SASLprep"; + # version = "1.100"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFAERBER/Authen-SASL-SASLprep-1.100.tar.gz"; + # hash = "sha256-pMzMNLs/U6zwunjJ/GGvjRVtEJ0cEEh7pZiKVQd9H3A="; + # }; + # buildInputs = [ TestNoWarnings ]; + # propagatedBuildInputs = [ UnicodeStringprep ]; + # meta = { + # description = "A Stringprep Profile for User Names and Passwords (RFC 4013)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AuthenSCRAM = buildPerlPackage { + # pname = "Authen-SCRAM"; + # version = "0.011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Authen-SCRAM-0.011.tar.gz"; + # hash = "sha256-RRCMI5pzc9AJQdzw0XGs0D58FqY85vfZVo/wUrF89ag="; + # }; + # buildInputs = [ TestFailWarnings TestFatal ]; + # propagatedBuildInputs = [ AuthenSASLSASLprep CryptURandom Moo PBKDF2Tiny TypeTiny namespaceclean ]; + # meta = { + # description = "Salted Challenge Response Authentication Mechanism (RFC 5802)"; + # homepage = "https://github.com/dagolden/Authen-SCRAM"; + # license = with lib.licenses; [ asl20 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # AuthenSimple = buildPerlPackage { + # pname = "Authen-Simple"; + # version = "0.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/Authen-Simple-0.5.tar.gz"; + # hash = "sha256-As3atH+L8aHL1Mm/jSWPbQURFJnDP4MV5yRIEvcmE6o="; + # }; + # # Our C crypt() doesn't support this weak "crypt" algorithm anymore. + # postPatch = '' + # patch -p1 <<-EOF + # --- a/t/09password.t + # +++ b/t/09password.t + # @@ -10 +10 @@ + # -use Test::More tests => 16; + # +use Test::More tests => 14; + # @@ -14 +13,0 @@ + # - [ 'crypt', 'lk9Mh5KHGjAaM', 'crypt' ], + # @@ -18 +16,0 @@ + # - [ 'crypt', '{CRYPT}lk9Mh5KHGjAaM', '{CRYPT}' ], + # EOF + # ''; + # propagatedBuildInputs = [ ClassAccessor ClassDataInheritable CryptPasswdMD5 ParamsValidate ]; + # meta = { + # description = "Simple Authentication"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # AuthenSimplePasswd = buildPerlModule { + # pname = "Authen-Simple-Passwd"; + # version = "0.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/Authen-Simple-Passwd-0.6.tar.gz"; + # hash = "sha256-z1W8NiWe3w/Wr5rSusgbMdxbVqFixmBZDsuWnHwWdLI="; + # }; + # # Our C crypt() doesn't support this weak "crypt" algorithm anymore. + # postPatch = '' + # sed -e 's/tests => 8/tests => 7/' -e "/'crypt'/d" -i t/04basic.t + # ''; + # propagatedBuildInputs = [ AuthenSimple ]; + # meta = { + # description = "Simple Passwd authentication"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # autobox = buildPerlPackage { + # pname = "autobox"; + # version = "3.0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHOCOLATE/autobox-v3.0.1.tar.gz"; + # hash = "sha256-wwO3/M+qH/TUxCmrPxXlyip3VU74yfw7jGK6hZ6HTJg="; + # }; + # propagatedBuildInputs = [ ScopeGuard ]; + # buildInputs = [ IPCSystemSimple TestFatal ]; + # meta = { + # description = "Call methods on native types"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # Autodia = buildPerlPackage { + # pname = "Autodia"; + # version = "2.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TE/TEEJAY/Autodia-2.14.tar.gz"; + # hash = "sha256-rIElyIq+Odn+Aco6zBOgCinzM2pLt+9gRH5ri4Iv9CI="; + # }; + # propagatedBuildInputs = [ TemplateToolkit XMLSimple ]; + # buildInputs = [ DBI ]; + + # meta = { + # description = "AutoDia, create UML diagrams from source code"; + # longDescription = '' + # AutoDia is a modular application that parses source code, XML or data + # and produces an XML document in Dia format (or images via graphviz + # and vcg). Its goal is to be a UML / DB Schema diagram autocreation + # package. The diagrams its creates are standard UML diagrams showing + # dependencies, superclasses, packages, classes and inheritances, as + # well as the methods, etc of each class. + + # AutoDia supports any language that a Handler has been written for, + # which includes C, C++, Java, Perl, Python, and more. + # ''; + # homepage = "http://www.aarontrevena.co.uk/opensource/autodia/"; + # license = with lib.licenses; [ gpl2Plus ]; + # mainProgram = "autodia.pl"; + # }; + # }; + + # AWSSignature4 = buildPerlModule { + # pname = "AWS-Signature4"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LD/LDS/AWS-Signature4-1.02.tar.gz"; + # hash = "sha256-ILvBbLNFT+XozzT+YfGpH+JsPxfkSf9mX8u7kqtEPr0="; + # }; + # propagatedBuildInputs = [ LWP TimeDate URI ]; + # meta = { + # description = "Create a version4 signature for Amazon Web Services"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # autovivification = buildPerlPackage { + # pname = "autovivification"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VP/VPIT/autovivification-0.18.tar.gz"; + # hash = "sha256-LZmXVoUkKYDQqZBPY5FEwFnW7OFYme/eSst0LTJT8QU="; + # }; + # meta = { + # description = "Lexically disable autovivification"; + # homepage = "https://search.cpan.org/dist/autovivification"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BarcodeZBar = buildPerlPackage { + # pname = "Barcode-ZBar"; + # version = "0.04pre"; + # # The meta::cpan version of this module has been unmaintained from 2009 + # # This uses an updated version from the ZBar repo that works with the current ZBar library + # src = "${pkgs.zbar.src}/perl"; + # postPatch = '' + # substituteInPlace Makefile.PL --replace "-lzbar" "-L${pkgs.zbar.lib}/lib -lzbar" + # rm t/Processor.t + # ''; + # buildInputs =[ ExtUtilsMakeMaker ]; + # propagatedBuildInputs = [ pkgs.zbar PerlMagick ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Perl interface to the ZBar Barcode Reader"; + # homepage = "https://metacpan.org/pod/Barcode::ZBar"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # BC = buildPerlPackage { + # pname = "B-C"; + # version = "1.57"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/B-C-1.57.tar.gz"; + # hash = "sha256-BFKmEdNDrfnZX86ra6a2YXbjrX/MzlKAkiwOQx9RSf8="; + # }; + # propagatedBuildInputs = [ BFlags IPCRun Opcodes ]; + # doCheck = false; /* test fails */ + # meta = { + # description = "Perl compiler"; + # homepage = "https://github.com/rurban/perl-compiler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perlcc"; + # }; + # }; + + BCOW = buildPerlPackage { + pname = "B-COW"; + version = "0.007"; + src = fetchurl { + url = "mirror://cpan/authors/id/A/AT/ATOOMIC/B-COW-0.007.tar.gz"; + hash = "sha256-EpDa8ifosJiJoxzxguKRBvHPnxpOm/d1L53pLtEVi0Q="; + }; + meta = { + description = "B::COW additional B helpers to check COW status"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # BFlags = buildPerlPackage { + # pname = "B-Flags"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/B-Flags-0.17.tar.gz"; + # hash = "sha256-wduX0BMVvtEJtMSJWM0yGVz8nvXTt3B+tHhAwdV8ELI="; + # }; + # meta = { + # description = "Friendlier flags for B"; + # license = with lib.licenses; [ artistic1 gpl1Only ]; + # }; + # }; + + # BeanstalkClient = buildPerlPackage { + # pname = "Beanstalk-Client"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GB/GBARR/Beanstalk-Client-1.07.tar.gz"; + # hash = "sha256-MYirESfyyrqX32XIT2nbDscMZOXXDylvmiZ0+nnBEsw="; + # }; + # propagatedBuildInputs = [ ClassAccessor YAMLSyck ]; + # meta = { + # description = "Client to communicate with beanstalkd server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BerkeleyDB = buildPerlPackage { + # pname = "BerkeleyDB"; + # version = "0.65"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMQS/BerkeleyDB-0.65.tar.gz"; + # hash = "sha256-QQqonnIylB1JEGyeBI1jN0dVQ+wdIz6nzbcly1uWNQQ="; + # }; + + # preConfigure = '' + # echo "LIB = ${pkgs.db.out}/lib" > config.in + # echo "INCLUDE = ${pkgs.db.dev}/include" >> config.in + # ''; + # meta = { + # description = "Perl extension for Berkeley DB version 2, 3, 4, 5 or 6"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BDB = buildPerlPackage rec { + # pname = "BDB"; + # version = "1.92"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/${pname}-${version}.tar.gz"; + # hash = "sha256-o/LKnSuu/BqqQJCLL5y5KS/aPn15fji7146rudna62s="; + # }; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.db4.dev}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.db4.out}/lib -ldb"; + # buildInputs = [ pkgs.db4 ]; + # propagatedBuildInputs = [ commonsense ]; + # meta = { + # description = "Asynchronous Berkeley DB access"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BHooksEndOfScope = buildPerlPackage { + # pname = "B-Hooks-EndOfScope"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/B-Hooks-EndOfScope-0.26.tar.gz"; + # hash = "sha256-Od8vjAB6dUZyB1+VuQeXuuvpetptlEsZemNScJyzBnE="; + # }; + # propagatedBuildInputs = [ ModuleImplementation SubExporterProgressive ]; + # meta = { + # description = "Execute code after a scope finished compilation"; + # homepage = "https://github.com/karenetheridge/B-Hooks-EndOfScope"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BHooksOPAnnotation = buildPerlPackage { + # pname = "B-Hooks-OP-Annotation"; + # version = "0.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHOCOLATE/B-Hooks-OP-Annotation-0.44.tar.gz"; + # hash = "sha256-bib5k2f06pRBac9uBc9NBngyCCQkyo7O/Mt7WmMhexY="; + # }; + # propagatedBuildInputs = [ ExtUtilsDepends ]; + # meta = { + # description = "Annotate and delegate hooked OPs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BHooksOPCheck = buildPerlPackage { + # pname = "B-Hooks-OP-Check"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/B-Hooks-OP-Check-0.22.tar.gz"; + # hash = "sha256-x7XRvvWe+Qh/9n6zFo0mJL6UrlRkRp4lmtEb+4rYzc0="; + # }; + # buildInputs = [ ExtUtilsDepends ]; + # meta = { + # description = "Wrap OP check callbacks"; + # homepage = "https://github.com/karenetheridge/B-Hooks-OP-Check"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BioExtAlign = callPackage ./perl-modules/Bio-Ext-Align { }; + + # BioDBHTS = buildPerlModule { + # pname = "Bio-DB-HTS"; + # version = "3.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AV/AVULLO/Bio-DB-HTS-3.01.tar.gz"; + # sha256 = "12a6bc1f579513cac8b9167cce4e363655cc8eba26b7d9fe1170dfe95e044f42"; + # }; + + # buildInputs = [ pkgs.htslib pkgs.zlib ]; + + # propagatedBuildInputs = [ BioPerl ]; + # htslibStore = toString pkgs.htslib; + + # postPatch = '' + # # -Wl,-rpath not recognized : replaced by -rpath= + # sed -i 's/Wl,-rpath,/rpath=/' Build.PL + # ''; + + # preBuild = '' + # export HTSLIB_DIR=${pkgs.htslib} + # ''; + + # meta = { + # description = "Perl interface to HTS library for DNA sequencing"; + # license = lib.licenses.asl20; + # }; + # }; + + # BioBigFile = callPackage ./perl-modules/Bio-BigFile { }; + + # BioPerl = buildPerlPackage { + # pname = "BioPerl"; + # version = "1.7.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CJ/CJFIELDS/BioPerl-1.7.8.tar.gz"; + # hash = "sha256-xJCjvncV6m5DBe/ZcQ5e2rgtq8Vf14a2UFtVCjDXFzg="; + # }; + # buildInputs = [ ModuleBuild TestMemoryCycle TestWeaken TestDeep TestWarn TestException TestDifferences ]; + # propagatedBuildInputs = [ DataStag Error Graph HTTPMessage IOString IOStringy IPCRun LWP ListMoreUtils SetScalar TestMost TestRequiresInternet URI XMLDOM XMLLibXML XMLSAX XMLSAXBase XMLSAXWriter XMLTwig XMLWriter YAML DBFile libxml_perl ]; + # meta = { + # description = "Perl modules for biology"; + # homepage = "https://metacpan.org/release/BioPerl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BitVector = buildPerlPackage { + # pname = "Bit-Vector"; + # version = "7.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STBEY/Bit-Vector-7.4.tar.gz"; + # hash = "sha256-PG2qZx/s+8Nfkqk4W1Y9ZfUN/Gvci0gF+e9GwNA1qSY="; + # }; + # propagatedBuildInputs = [ CarpClan ]; + # meta = { + # description = "Efficient bit vector, set of integers and 'big int' math library"; + # license = with lib.licenses; [ artistic1 gpl1Plus lgpl2Only ]; + # }; + # }; + + # BKeywords = buildPerlPackage { + # pname = "B-Keywords"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/B-Keywords-1.26.tar.gz"; + # hash = "sha256-LaoVXS8mf7De3Yf4pMT7VmOHn8EGUXse4lg1Pvh67TQ="; + # }; + # meta = { + # description = "Lists of reserved barewords and symbol names"; + # license = with lib.licenses; [ artistic1 gpl2Only ]; + # }; + # }; + + # boolean = buildPerlPackage { + # pname = "boolean"; + # version = "0.46"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/boolean-0.46.tar.gz"; + # hash = "sha256-lcCICFw+g79oD+bOFtgmTsJjEEkPfRaA5BbqehGPFWo="; + # }; + # meta = { + # description = "Boolean support for Perl"; + # homepage = "https://github.com/ingydotnet/boolean-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BoostGeometryUtils = buildPerlModule { + # pname = "Boost-Geometry-Utils"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AA/AAR/Boost-Geometry-Utils-0.15.tar.gz"; + # hash = "sha256-AFTdP1c70/b0e3PugdHoRYQvugSq21KICqUnAcaH0co="; + # }; + # patches = [ + # # Fix out of memory error on Perl 5.19.4 and later. + # ./perl-modules/boost-geometry-utils-fix-oom.patch + # ]; + # perlPreHook = "export LD=$CC"; + # buildInputs = [ ExtUtilsCppGuess ExtUtilsTypemapsDefault ExtUtilsXSpp ModuleBuildWithXSpp ]; + # meta = { + # description = "Bindings for the Boost Geometry library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BotTraining = buildPerlPackage { + # pname = "Bot-Training"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AV/AVAR/Bot-Training-0.07.tar.gz"; + # hash = "sha256-7ma7+BTw3D0egGgOBQ+tELHgGP7Xkp9lPtQOCIsqopU="; + # }; + # buildInputs = [ FileSlurp ]; + # propagatedBuildInputs = [ ClassLoad DirSelf FileShareDir ModulePluggable MooseXGetopt namespaceclean ]; + # meta = { + # description = "Plain text training material for bots like Hailo and AI::MegaHAL"; + # homepage = "https://metacpan.org/release/Bot-Training"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "bot-training"; + # }; + # }; + + # BotTrainingMegaHAL = buildPerlPackage { + # pname = "Bot-Training-MegaHAL"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AV/AVAR/Bot-Training-MegaHAL-0.03.tar.gz"; + # hash = "sha256-lWByr/BPIW5cO4GWlltdgNTUdpXXfsqr1W5Z1l8iv2A="; + # }; + # buildInputs = [ FileShareDirInstall ]; + # propagatedBuildInputs = [ BotTraining ]; + # meta = { + # description = "Provide megahal.trn via Bot::Training"; + # homepage = "https://metacpan.org/release/Bot-Training-MegaHAL"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BotTrainingStarCraft = buildPerlPackage { + # pname = "Bot-Training-StarCraft"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AV/AVAR/Bot-Training-StarCraft-0.03.tar.gz"; + # hash = "sha256-58640Bxi5zLdib/l9Ng+eBwc2RJULRd8Iudht8hhTV4="; + # }; + # buildInputs = [ FileShareDirInstall ]; + # propagatedBuildInputs = [ BotTraining ]; + # meta = { + # description = "Provide starcraft.trn via Bot::Training"; + # homepage = "https://metacpan.org/release/Bot-Training-StarCraft"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BSDResource = buildPerlPackage { + # pname = "BSD-Resource"; + # version = "1.2911"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHI/BSD-Resource-1.2911.tar.gz"; + # hash = "sha256-nRz7oGPMGPckJ6IkUfeQiDa3MxrIeF2+B1U8WwQ6DD0="; + # }; + # meta = { + # description = "BSD process resource limit and priority functions"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # BSON = buildPerlPackage { + # pname = "BSON"; + # version = "1.12.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MONGODB/BSON-v1.12.2.tar.gz"; + # hash = "sha256-9GEsDDVDEHQbmattJkUSJoIxUMonEJsbORIy1c/dpts="; + # }; + # buildInputs = [ JSONMaybeXS PathTiny TestDeep TestFatal ]; + # propagatedBuildInputs = [ CryptURandom Moo TieIxHash boolean namespaceclean ]; + # meta = { + # description = "BSON serialization and deserialization (EOL)"; + # homepage = "https://github.com/mongodb-labs/mongo-perl-bson"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # BSONXS = buildPerlPackage { + # pname = "BSON-XS"; + # version = "0.8.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MONGODB/BSON-XS-v0.8.4.tar.gz"; + # hash = "sha256-KPfTOP14tvnJpggL6d4/XLI9iIuW6/b8v6zp8pZq6/k="; + # }; + # buildInputs = [ ConfigAutoConf JSONMaybeXS PathTiny TestDeep TestFatal TieIxHash ]; + # propagatedBuildInputs = [ BSON boolean JSONXS JSONPP CpanelJSONXS ]; + # meta = { + # description = "XS implementation of MongoDB's BSON serialization (EOL)"; + # homepage = "https://github.com/mongodb-labs/mongo-perl-bson-xs"; + # license = with lib.licenses; [ asl20 ]; + # platforms = lib.platforms.linux; # configure phase fails with "ld: unknown option: -mmacosx-version-min=10.12" + # }; + # }; + + # BUtils = buildPerlPackage { + # pname = "B-Utils"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/B-Utils-0.27.tar.gz"; + # hash = "sha256-+X9T9qMFAQmqQU/usYTK0QGBLUF2DpUrXYSZP2aF/+o="; + # }; + # propagatedBuildInputs = [ TaskWeaken ]; + # buildInputs = [ ExtUtilsDepends ]; + # meta = { + # description = "Helper functions for op tree manipulation"; + # homepage = "https://search.cpan.org/dist/B-Utils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BusinessHours = buildPerlPackage { + # pname = "Business-Hours"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Business-Hours-0.13.tar.gz"; + # hash = "sha256-qAf+P/u4T/pTlnEazOdXZPOknyQjZGc1DHHIp3pcPsI="; + # }; + # propagatedBuildInputs = [ SetIntSpan ]; + # meta = { + # description = "Calculate business hours in a time period"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # BusinessISBN = buildPerlPackage { + # pname = "Business-ISBN"; + # version = "3.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Business-ISBN-3.008.tar.gz"; + # hash = "sha256-GcSh1NmaDddpWpAZKxNASg4+7r7fy+l6AgLjayOMDmk="; + # }; + # propagatedBuildInputs = [ BusinessISBNData ]; + # meta = { + # description = "Work with International Standard Book Numbers"; + # homepage = "https://github.com/briandfoy/business-isbn"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # BusinessISBNData = buildPerlPackage { + # pname = "Business-ISBN-Data"; + # version = "20231006.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Business-ISBN-Data-20231006.001.tar.gz"; + # hash = "sha256-KhazbjIzXOjI337m8ig2LzSuc8T8wSNQCVCiyMd/F0g="; + # }; + # meta = { + # description = "Data pack for Business::ISBN"; + # homepage = "https://github.com/briandfoy/business-isbn-data"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # BusinessISMN = buildPerlPackage { + # pname = "Business-ISMN"; + # version = "1.203"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Business-ISMN-1.203.tar.gz"; + # hash = "sha256-T1Ou2rLmh9Th9yhW6vwiFZOQYhEj2q955FBqiX4pPog="; + # }; + # propagatedBuildInputs = [ TieCycle ]; + # meta = { + # description = "Work with International Standard Music Numbers"; + # homepage = "https://github.com/briandfoy/business-ismn"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # BusinessISSN = buildPerlPackage { + # pname = "Business-ISSN"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Business-ISSN-1.005.tar.gz"; + # hash = "sha256-OwmwJn8KZmD7krb1DEx3lu9qJjtirTu+qgcYmgx8ObM="; + # }; + # meta = { + # description = "Perl extension for International Standard Serial Numbers"; + # homepage = "https://github.com/briandfoy/business-issn"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # BytesRandomSecure = buildPerlPackage { + # pname = "Bytes-Random-Secure"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVIDO/Bytes-Random-Secure-0.29.tar.gz"; + # hash = "sha256-U7vTOeahHvygfGGaYVx8GIpouyvoSaHLfvw91Nmuha4="; + # }; + # propagatedBuildInputs = [ CryptRandomSeed MathRandomISAAC ]; + # meta = { + # description = "Perl extension to generate cryptographically-secure random bytes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # BytesRandomSecureTiny = buildPerlPackage { + # pname = "Bytes-Random-Secure-Tiny"; + # version = "1.011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVIDO/Bytes-Random-Secure-Tiny-1.011.tar.gz"; + # hash = "sha256-A9lntfgoRpCRN9WrmYSsVwrBCkQB4MYC89IgjEZayYI="; + # }; + # meta = { + # description = "A tiny Perl extension to generate cryptographically-secure random bytes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # CacheCache = buildPerlPackage { + # pname = "Cache-Cache"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Cache-Cache-1.08.tar.gz"; + # hash = "sha256-0sf9Xbpd0BC32JI1FokLtsz2tfGIzLafNcsP1sAx0eg="; + # }; + # propagatedBuildInputs = [ DigestSHA1 Error IPCShareLite ]; + # doCheck = false; # randomly fails + # meta = { + # description = "The Cache Interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheFastMmap = buildPerlPackage { + # pname = "Cache-FastMmap"; + # version = "1.57"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROBM/Cache-FastMmap-1.57.tar.gz"; + # hash = "sha256-4Es6KNmJ7bj7lur6zcK4f57MuE8EfrLifLJqp9CMx7g="; + # }; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Uses an mmap'ed file to act as a shared memory interprocess cache"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheKyotoTycoon = buildPerlModule { + # pname = "Cache-KyotoTycoon"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/Cache-KyotoTycoon-0.16.tar.gz"; + # hash = "sha256-zLBII1iUxItpegDleMtFC05evBQYpVSnz6hjJwezlHw="; + # }; + # propagatedBuildInputs = [ Furl URI ]; + # buildInputs = [ FileWhich TestRequires TestSharedFork TestTCP ]; + # meta = { + # description = "KyotoTycoon client library"; + # homepage = "https://github.com/tokuhirom/Cache-KyotoTycoon"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheMemcached = buildPerlPackage { + # pname = "Cache-Memcached"; + # version = "1.30"; + # src = fetchurl { + # url = + # "mirror://cpan/authors/id/D/DO/DORMANDO/Cache-Memcached-1.30.tar.gz"; + # hash = "sha256-MbPFHsDqrwMALizI49fVy+YZGc/a2mHACOuYU6ysQqk="; + # }; + # propagatedBuildInputs = [ StringCRC32 ]; + # meta = { + # description = "Client library for memcached (memory cache daemon)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheMemcachedFast = buildPerlPackage { + # pname = "Cache-Memcached-Fast"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RAZ/Cache-Memcached-Fast-0.28.tar.gz"; + # hash = "sha256-fEJMJTtl/2LPFXe7QYgCGSoYgF6jH6/Ap65YnkRsidI="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Perl client for memcached, in C language"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheMemory = buildPerlModule { + # pname = "Cache"; + # version = "2.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Cache-2.11.tar.gz"; + # hash = "sha256-4dLYlneYEWarxbtuXsxkcfAB8T61bVvpVE2AR9wIpZI="; + # }; + # propagatedBuildInputs = [ DBFile FileNFSLock HeapFibonacci IOString TimeDate ]; + # doCheck = false; # can time out + # meta = { + # description = "Memory based implementation of the Cache interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CacheSimpleTimedExpiry = buildPerlPackage { + # pname = "Cache-Simple-TimedExpiry"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JESSE/Cache-Simple-TimedExpiry-0.27.tar.gz"; + # hash = "sha256-Tni35N0jG1VxpIzQ7htjlT9eNHkMnQIOFZWnx9Crvkk="; + # }; + # meta = { + # description = "A lightweight cache with timed expiration"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Cairo = buildPerlPackage { + # pname = "Cairo"; + # version = "1.109"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Cairo-1.109.tar.gz"; + # hash = "sha256-ghlzbkAcIxHaX1FXdd5D/YfmOEtQTaNqGS8rIXZDB38="; + # }; + # buildInputs = [ pkgs.cairo ]; + # propagatedBuildInputs = [ ExtUtilsDepends ExtUtilsPkgConfig ]; + # meta = { + # description = "Perl interface to the cairo 2d vector graphics library"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Only ]; + # }; + # }; + + # CairoGObject = buildPerlPackage { + # pname = "Cairo-GObject"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Cairo-GObject-1.005.tar.gz"; + # hash = "sha256-jYlkRNceHQvKPSTjHl2CvQ2VQqrtkdH7fqs2e85nXFA="; + # }; + # buildInputs = [ pkgs.cairo ]; + # propagatedBuildInputs = [ Cairo Glib ]; + # meta = { + # description = "Integrate Cairo into the Glib type system"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Only ]; + # }; + # }; + + # CallContext = buildPerlPackage { + # pname = "Call-Context"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FELIPE/Call-Context-0.03.tar.gz"; + # hash = "sha256-Dua/RrxydVrbemsI550S4gfeX3gJcHs8NTtYyy8LWiY="; + # }; + # meta = { + # description = "Sanity-check calling context"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # cam_pdf = buildPerlModule { + # pname = "CAM-PDF"; + # version = "1.60"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CD/CDOLAN/CAM-PDF-1.60.tar.gz"; + # hash = "sha256-52r8fzimJJJKd8XJiMNsnjiL+ncW51zTl/744bQuu4k="; + # }; + # propagatedBuildInputs = [ CryptRC4 TextPDF ]; + # meta = { + # description = "PDF manipulation library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # capitalization = buildPerlPackage { + # pname = "capitalization"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/capitalization-0.03.tar.gz"; + # hash = "sha256-8TUW1XKUH2ihwj8uDkn1vwmyL5B+uSkrcrr/5ie77jw="; + # }; + # propagatedBuildInputs = [ DevelSymdump ]; + # meta = { + # description = "No capitalization on method names"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CanaryStability = buildPerlPackage { + # pname = "Canary-Stability"; + # version = "2013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/Canary-Stability-2013.tar.gz"; + # hash = "sha256-pckcYs+V/Lho9g6rXIMpCPaQUiEBP+orzj/1cEbXtuo="; + # }; + # meta = { + # description = "Canary to check perl compatibility for schmorp's modules"; + # license = with lib.licenses; [ gpl1Plus ]; + # }; + # }; + + # CaptchaReCAPTCHA = buildPerlPackage { + # pname = "Captcha-reCaptcha"; + # version = "0.99"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SU/SUNNYP/Captcha-reCaptcha-0.99.tar.gz"; + # hash = "sha256-uJI1dmARZu3j9/Ly/1X/bjw7znDmnzZaUe076MykQ5I="; + # }; + # propagatedBuildInputs = [ HTMLTiny LWP ]; + # meta = { + # description = "A Perl implementation of the reCAPTCHA API"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + CaptureTiny = buildPerlPackage { + pname = "Capture-Tiny"; + version = "0.48"; + src = fetchurl { + url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Capture-Tiny-0.48.tar.gz"; + hash = "sha256-bCMRPoe605MwjJCiBwE+UF9lknRzZjjYx5usnGfMPhk="; + }; + meta = { + description = "Capture STDOUT and STDERR from Perl, XS or external programs"; + homepage = "https://github.com/dagolden/Capture-Tiny"; + license = with lib.licenses; [ asl20 ]; + }; + }; + + # CarpAlways = buildPerlPackage { + # pname = "Carp-Always"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FERREIRA/Carp-Always-0.16.tar.gz"; + # hash = "sha256-mKoRSSFxwBb7CCdYGrH6XtAbHpnGNXSJ3fOoJzFYZvE="; + # }; + # buildInputs = [ TestBase ]; + # meta = { + # description = "Warns and dies noisily with stack backtraces"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CarpAssert = buildPerlPackage { + # pname = "Carp-Assert"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YV/YVES/Carp-Assert-0.22.tar.gz"; + # hash = "sha256-gH6pfGvtdqwuSWnvun2uSP7+ufKHl/ESZxs6yKSTVfc="; + # }; + # meta = { + # description = "Executable comments"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CarpAssertMore = buildPerlPackage { + # pname = "Carp-Assert-More"; + # version = "2.3.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/Carp-Assert-More-2.3.0.tar.gz"; + # hash = "sha256-/2nqCb2maiAPygiK3ZHFww5lcqt7ujF6f58zxRKzzqc="; + # }; + # propagatedBuildInputs = [ CarpAssert ]; + # buildInputs = [ TestException ]; + # meta = { + # description = "Convenience assertions for common situations"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # CarpClan = buildPerlPackage { + # pname = "Carp-Clan"; + # version = "6.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Carp-Clan-6.08.tar.gz"; + # hash = "sha256-x1+S40QizFplqwXRVYQrcBRSQ06a77ZJ1uIonEfvZwg="; + # }; + # meta = { + # description = "Report errors from perspective of caller of a \"clan\" of modules"; + # homepage = "https://github.com/karenetheridge/Carp-Clan"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Carton = buildPerlPackage { + # pname = "Carton"; + # version = "1.0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Carton-v1.0.35.tar.gz"; + # hash = "sha256-nEVYypfNCLaf37UrKMPdwgQ+9S8GJ7kOU9BaQIc0QXU="; + # }; + # propagatedBuildInputs = [ MenloLegacy PathTiny TryTiny ]; + # meta = { + # description = "Perl module dependency manager (aka Bundler for Perl)"; + # homepage = "https://github.com/perl-carton/carton"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "carton"; + # }; + # }; + + # CatalystActionRenderView = buildPerlPackage { + # pname = "Catalyst-Action-RenderView"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Action-RenderView-0.16.tar.gz"; + # hash = "sha256-hWUgOVCgV9Q+zWTpWTcV1WXC+9iwLJH0PFOyERrNOUg="; + # }; + # propagatedBuildInputs = [ CatalystRuntime DataVisitor ]; + # buildInputs = [ HTTPRequestAsCGI ]; + # meta = { + # description = "Sensible default end action"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystActionREST = buildPerlPackage { + # pname = "Catalyst-Action-REST"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JJ/JJNAPIORK/Catalyst-Action-REST-1.21.tar.gz"; + # hash = "sha256-zPgbulIA06CtaQH5I68XOj1EFmGK6gimk4uq/970yyA="; + # }; + # buildInputs = [ TestRequires ]; + # propagatedBuildInputs = [ CatalystRuntime URIFind ]; + # meta = { + # description = "Automated REST Method Dispatching"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystAuthenticationCredentialHTTP = buildPerlModule { + # pname = "Catalyst-Authentication-Credential-HTTP"; + # version = "1.018"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Catalyst-Authentication-Credential-HTTP-1.018.tar.gz"; + # hash = "sha256-b6GBbe5kSw216gzBXF5xHcLO0gg2JavOcJZSHx1lpSk="; + # }; + # buildInputs = [ ModuleBuildTiny TestException TestMockObject TestNeeds ]; + # propagatedBuildInputs = [ CatalystPluginAuthentication ClassAccessor DataUUID StringEscape ]; + # meta = { + # description = "HTTP Basic and Digest authentication for Catalyst"; + # homepage = "https://github.com/perl-catalyst/Catalyst-Authentication-Credential-HTTP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystAuthenticationStoreHtpasswd = buildPerlModule { + # pname = "Catalyst-Authentication-Store-Htpasswd"; + # version = "1.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Catalyst-Authentication-Store-Htpasswd-1.006.tar.gz"; + # hash = "sha256-x/2FYnXo3hjAAWHXNJTsZr0N3QoZ27dMQtVXHJ7ggE8="; + # }; + # buildInputs = [ ModuleBuildTiny TestLongString TestSimple13 TestWWWMechanize TestWWWMechanizeCatalyst ]; + # propagatedBuildInputs = [ AuthenHtpasswd CatalystPluginAuthentication ]; + # patches = [ + # ./perl-modules/CatalystAuthenticationStoreHtpasswd-test-replace-DES-hash-with-bcrypt.patch + # ]; + # meta = { + # description = "Authen::Htpasswd based user storage/authentication"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystAuthenticationStoreDBIxClass = buildPerlPackage { + # pname = "Catalyst-Authentication-Store-DBIx-Class"; + # version = "0.1506"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/Catalyst-Authentication-Store-DBIx-Class-0.1506.tar.gz"; + # hash = "sha256-fFefJZUoXmTD3LVUAzSqmgAkQ+HUyMg6tEk7kMxRskQ="; + # }; + # propagatedBuildInputs = [ CatalystModelDBICSchema CatalystPluginAuthentication ]; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Extensible and flexible object <-> relational mapper"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystAuthenticationStoreLDAP = buildPerlPackage { + # pname = "Catalyst-Authentication-Store-LDAP"; + # version = "1.017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/Catalyst-Authentication-Store-LDAP-1.017.tar.gz"; + # hash = "sha256-keW4vd/XOGYqNh6/6nPYQrO6Me1wne2xqE7DRB3O7sU="; + # }; + # propagatedBuildInputs = [ perlldap CatalystPluginAuthentication ClassAccessor ]; + # buildInputs = [ TestMockObject TestException NetLDAPServerTest ]; + # doCheck = !stdenv.isDarwin; # t/02-realms_api.t and t/50.auth.case.sensitivity.t + # meta = { + # description = "Authenticate Users against LDAP Directories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystComponentInstancePerContext = buildPerlPackage { + # pname = "Catalyst-Component-InstancePerContext"; + # version = "0.001001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRODITI/Catalyst-Component-InstancePerContext-0.001001.tar.gz"; + # hash = "sha256-f2P5MOHmE/FZVcnm1zhzZ1xQwKO8KmGgNHMzYe0m0nE="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ]; + # meta = { + # description = "Moose role to create only one instance of component per context"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystControllerHTMLFormFu = buildPerlPackage { + # pname = "Catalyst-Controller-HTML-FormFu"; + # version = "2.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NIGELM/Catalyst-Controller-HTML-FormFu-2.04.tar.gz"; + # hash = "sha256-8T+5s7OwCzXwarwxYURhyNc0b74H+1accejVhuXrXdw="; + # }; + # buildInputs = [ CatalystActionRenderView CatalystPluginSession CatalystPluginSessionStateCookie CatalystPluginSessionStoreFile CatalystViewTT CodeTidyAllPluginPerlAlignMooseAttributes PodCoverageTrustPod PodTidy TemplateToolkit TestCPANMeta TestDifferences TestEOL TestKwalitee TestLongString TestMemoryCycle TestNoTabs TestPAUSEPermissions TestPod TestPodCoverage TestWWWMechanize TestWWWMechanizeCatalyst ]; + # propagatedBuildInputs = [ CatalystComponentInstancePerContext HTMLFormFuMultiForm RegexpAssemble ]; + # doCheck = false; /* fails with 'open3: exec of .. perl .. failed: Argument list too long at .../TAP/Parser/Iterator/Process.pm line 165.' */ + # meta = { + # description = "HTML Form Creation, Rendering and Validation Framework"; + # homepage = "https://github.com/FormFu/HTML-FormFu"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystControllerPOD = buildPerlModule { + # pname = "Catalyst-Controller-POD"; + # version = "1.0.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLER/Catalyst-Controller-POD-1.0.0.tar.gz"; + # hash = "sha256-7ipLs+14uqFGQzVAjyhDRba6DvZXate/vXtlbHiKOfk="; + # }; + # buildInputs = [ ModuleInstall TestLongString TestWWWMechanize TestWWWMechanizeCatalyst ]; + # propagatedBuildInputs = [ CatalystPluginStaticSimple ClassAccessor FileSlurp JSONXS ListMoreUtils PodPOMViewTOC XMLSimple ]; + # meta = { + # description = "Serves PODs right from your Catalyst application"; + # homepage = "https://search.cpan.org/dist/Catalyst-Controller-POD"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # CatalystDevel = buildPerlPackage { + # pname = "Catalyst-Devel"; + # version = "1.42"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Devel-1.42.tar.gz"; + # hash = "sha256-fsbwtsq1uMCX5Hdp/HOk1MAVpYxB/bQPwk3z7nfEir0="; + # }; + # buildInputs = [ FileShareDirInstall TestFatal ]; + # propagatedBuildInputs = [ CatalystActionRenderView CatalystPluginConfigLoader CatalystPluginStaticSimple ConfigGeneral FileChangeNotify FileCopyRecursive ModuleInstall TemplateToolkit ]; + # meta = { + # description = "Catalyst Development Tools"; + # homepage = "http://dev.catalyst.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystDispatchTypeRegex = buildPerlModule { + # pname = "Catalyst-DispatchType-Regex"; + # version = "5.90035"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MG/MGRIMES/Catalyst-DispatchType-Regex-5.90035.tar.gz"; + # hash = "sha256-AC3Pnv7HxYiSoYP5CAFTnQzxPsOvzPjTrRkhfCsNWBo="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ]; + # meta = { + # description = "Regex DispatchType"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystManual = buildPerlPackage { + # pname = "Catalyst-Manual"; + # version = "5.9011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Manual-5.9011.tar.gz"; + # hash = "sha256-s54zllkDwAWD4BgOPdUopUkg9SB83wUmBcoTgoz6wTw="; + # }; + # meta = { + # description = "The Catalyst developer's manual"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystModelDBICSchema = buildPerlPackage { + # pname = "Catalyst-Model-DBIC-Schema"; + # version = "0.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Model-DBIC-Schema-0.66.tar.gz"; + # hash = "sha256-GST0wA6PD/HF0a+hbv5PhW8cXnT+VW7Cxfj1v2OtA0g="; + # }; + # buildInputs = [ DBDSQLite TestException TestRequires ]; + # propagatedBuildInputs = [ CatalystComponentInstancePerContext CatalystXComponentTraits DBIxClassSchemaLoader MooseXMarkAsMethods MooseXNonMoose MooseXTypesLoadableClass TieIxHash ]; + # meta = { + # description = "DBIx::Class::Schema Model Class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystRuntime = buildPerlPackage { + # pname = "Catalyst-Runtime"; + # version = "5.90131"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JJ/JJNAPIORK/Catalyst-Runtime-5.90131.tar.gz"; + # hash = "sha256-nWQe+s8PmTXm7LmPWjtHbJYbH4Gb0vjyOmR9HYZ+GEk="; + # }; + # buildInputs = [ TestFatal TypeTiny ]; + # propagatedBuildInputs = [ CGISimple CGIStruct ClassC3AdoptNEXT DataDump HTTPBody ModulePluggable MooseXEmulateClassAccessorFast MooseXGetopt MooseXMethodAttributes MooseXRoleWithOverloading PathClass PerlIOutf8_strict PlackMiddlewareFixMissingBodyInRedirect PlackMiddlewareMethodOverride PlackMiddlewareRemoveRedundantBody PlackMiddlewareReverseProxy PlackTestExternalServer SafeIsa StringRewritePrefix TaskWeaken TextSimpleTable TreeSimpleVisitorFactory URIws ]; + # meta = { + # description = "The Catalyst Framework Runtime"; + # homepage = "http://dev.catalyst.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "catalyst.pl"; + # }; + # }; + + # CatalystPluginAccessLog = buildPerlPackage { + # pname = "Catalyst-Plugin-AccessLog"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARODLAND/Catalyst-Plugin-AccessLog-1.10.tar.gz"; + # hash = "sha256-hz245OcqmU4+F661PSuDfm1SS0uLDzU58mITXIjMISA="; + # }; + # propagatedBuildInputs = [ CatalystRuntime DateTime ]; + # meta = { + # description = "Request logging from within Catalyst"; + # homepage = "https://metacpan.org/release/Catalyst-Plugin-AccessLog"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginAuthentication = buildPerlPackage { + # pname = "Catalyst-Plugin-Authentication"; + # version = "0.10023"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Authentication-0.10023.tar.gz"; + # hash = "sha256-NgOaq9rLB+Zoek16i/rHj+nQ+7BM2o1tlm1sHjJZ0Gw="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ CatalystPluginSession ]; + # meta = { + # description = "Infrastructure plugin for the Catalyst authentication framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginAuthorizationACL = buildPerlPackage { + # pname = "Catalyst-Plugin-Authorization-ACL"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/Catalyst-Plugin-Authorization-ACL-0.16.tar.gz"; + # hash = "sha256-KjfmU0gu/SyTuGxqg4lB4FbF+U3YbA8LiT1RkzMSg3w="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ClassThrowable ]; + # buildInputs = [ CatalystPluginAuthentication CatalystPluginAuthorizationRoles CatalystPluginSession CatalystPluginSessionStateCookie TestWWWMechanizeCatalyst ]; + # meta = { + # description = "ACL support for Catalyst applications"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginAuthorizationRoles = buildPerlPackage { + # pname = "Catalyst-Plugin-Authorization-Roles"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Authorization-Roles-0.09.tar.gz"; + # hash = "sha256-7kBE5eKg2UxOxRL61V7gyN4UTh47h4Ugf5YCXPmkA1E="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ CatalystPluginAuthentication SetObject UNIVERSALisa ]; + # meta = { + # description = "Role based authorization for Catalyst based on Catalyst::Plugin::Authentication"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginCache = buildPerlPackage { + # pname = "Catalyst-Plugin-Cache"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Cache-0.12.tar.gz"; + # hash = "sha256-KV/tRJyTJLBleP1GjjOR4E+/ZK0kN2oARAjRvG9UQ+A="; + # }; + # buildInputs = [ ClassAccessor TestDeep TestException ]; + # propagatedBuildInputs = [ CatalystRuntime ]; + # meta = { + # description = "Flexible caching support for Catalyst"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginCacheHTTP = buildPerlPackage { + # pname = "Catalyst-Plugin-Cache-HTTP"; + # version = "0.001000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRAF/Catalyst-Plugin-Cache-HTTP-0.001000.tar.gz"; + # hash = "sha256-aq2nDrKfYd90xTj5KaEHD92TIMW278lNJkwzghe8sWw="; + # }; + # buildInputs = [ CatalystRuntime TestLongString TestSimple13 TestWWWMechanize TestWWWMechanizeCatalyst ]; + # propagatedBuildInputs = [ ClassAccessor HTTPMessage MROCompat ]; + # meta = { + # description = "HTTP/1.1 cache validators for Catalyst"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginCaptcha = buildPerlPackage { + # pname = "Catalyst-Plugin-Captcha"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DI/DIEGOK/Catalyst-Plugin-Captcha-0.04.tar.gz"; + # hash = "sha256-Sj1ccgBiTT567ULQWnBnSSdGg+t7rSYN6Sx1W/aQnlI="; + # }; + # propagatedBuildInputs = [ CatalystPluginSession GDSecurityImage ]; + # meta = { + # description = "Create and validate Captcha for Catalyst"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginConfigLoader = buildPerlPackage { + # pname = "Catalyst-Plugin-ConfigLoader"; + # version = "0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Plugin-ConfigLoader-0.35.tar.gz"; + # hash = "sha256-nippim8tBG4NxeV1EpKc1CPIB9Sja6Pynp5a3NcaGXE="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ConfigAny DataVisitor ]; + # meta = { + # description = "Load config files of various types"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginFormValidator = buildPerlPackage { + # pname = "Catalyst-Plugin-FormValidator"; + # version = "0.094"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DH/DHOSS/Catalyst-Plugin-FormValidator-0.094.tar.gz"; + # hash = "sha256-WDTxG/XJ9LXTNtZcfOZjm3bOe/56KHXrBI1+ocgs4Fo="; + # }; + # propagatedBuildInputs = [ CatalystRuntime DataFormValidator ]; + # meta = { + # description = "Data::FormValidator"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginFormValidatorSimple = buildPerlPackage { + # pname = "Catalyst-Plugin-FormValidator-Simple"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DH/DHOSS/Catalyst-Plugin-FormValidator-Simple-0.15.tar.gz"; + # hash = "sha256-SGxqDo9BD9AXJ59IBKueNbpGMh0zoKlyH+Hgijkd56A="; + # }; + # propagatedBuildInputs = [ CatalystPluginFormValidator FormValidatorSimple ]; + # meta = { + # description = "Validation with simple chains of constraints "; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginLogHandler = buildPerlModule { + # pname = "Catalyst-Plugin-Log-Handler"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEPE/Catalyst-Plugin-Log-Handler-0.08.tar.gz"; + # hash = "sha256-DbPDpXtO49eJulEpiQ4oWJE/7wDYGFvcnF1/3jHgQ+8="; + # }; + # propagatedBuildInputs = [ ClassAccessor LogHandler MROCompat ]; + # meta = { + # description = "Log messages to several outputs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginPrometheusTiny = buildPerlPackage { + # pname = "Catalyst-Plugin-PrometheusTiny"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYSPETE/Catalyst-Plugin-PrometheusTiny-0.006.tar.gz"; + # hash = "sha256-Kzm5l7q/+rNTquMsol8smbdljlBEew23H7gKFsS2osE="; + # }; + # buildInputs = [ HTTPMessage Plack SubOverride TestDeep ]; + # propagatedBuildInputs = [ CatalystRuntime Moose PrometheusTiny PrometheusTinyShared ]; + # meta = { + # description = "A tiny Prometheus client"; + # homepage = "https://github.com/robn/Prometheus-Tiny"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSession = buildPerlPackage { + # pname = "Catalyst-Plugin-Session"; + # version = "0.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Plugin-Session-0.43.tar.gz"; + # hash = "sha256-Xn180rlbH8IkS8buuPRPg11gPqB/WjkRCIHbYJKLFMQ="; + # }; + # buildInputs = [ TestDeep TestException TestNeeds ]; + # propagatedBuildInputs = [ CatalystRuntime ObjectSignature ]; + # meta = { + # description = "Generic Session plugin - ties together server side storage and client side state required to maintain session data"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSessionDynamicExpiry = buildPerlPackage { + # pname = "Catalyst-Plugin-Session-DynamicExpiry"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Session-DynamicExpiry-0.04.tar.gz"; + # hash = "sha256-dwfFZzTNsVEvcz3EAPrfb0xTyyF7WCB4V4JNrWeAoHk="; + # }; + # propagatedBuildInputs = [ CatalystPluginSession ]; + # meta = { + # description = "Per-session custom expiry times"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSessionStateCookie = buildPerlPackage { + # pname = "Catalyst-Plugin-Session-State-Cookie"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-Plugin-Session-State-Cookie-0.18.tar.gz"; + # hash = "sha256-6bHHsrlsGU+Hpfd+FElxcHfHD/xnpL/CnwJsnuLge+o="; + # }; + # propagatedBuildInputs = [ CatalystPluginSession ]; + # meta = { + # description = "Maintain session IDs using cookies"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSessionStoreFastMmap = buildPerlPackage { + # pname = "Catalyst-Plugin-Session-Store-FastMmap"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Session-Store-FastMmap-0.16.tar.gz"; + # hash = "sha256-uut/17+QW+dGMciHYP2KKYDO6pVieZM5lYFkPvY3cnQ="; + # }; + # propagatedBuildInputs = [ CacheFastMmap CatalystPluginSession ]; + # meta = { + # description = "FastMmap session storage backend"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSessionStoreFile = buildPerlPackage { + # pname = "Catalyst-Plugin-Session-Store-File"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FL/FLORA/Catalyst-Plugin-Session-Store-File-0.18.tar.gz"; + # hash = "sha256-VHOOPOdvi+i2aUcJLSiXPHPXnR7hm12SsFdVL4/wm08="; + # }; + # propagatedBuildInputs = [ CacheCache CatalystPluginSession ClassDataInheritable ]; + # meta = { + # description = "File storage backend for session data"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginSmartURI = buildPerlPackage { + # pname = "Catalyst-Plugin-SmartURI"; + # version = "0.041"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/Catalyst-Plugin-SmartURI-0.041.tar.gz"; + # hash = "sha256-y4ghhphUUSA9kj19+QIKoELajcGUltgj4WU1twUfX1c="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ClassC3Componentised ]; + # buildInputs = [ CatalystActionREST TestWarnings TimeOut URISmartURI ]; + # meta = { + # description = "Configurable URIs for Catalyst"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginStackTrace = buildPerlPackage { + # pname = "Catalyst-Plugin-StackTrace"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-StackTrace-0.12.tar.gz"; + # hash = "sha256-Mp2s0LoJ0Qp2CHqxdvldtro9smotD+M+7i9eRs7XU6w="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ]; + # meta = { + # description = "Display a stack trace on the debug screen"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginStaticSimple = buildPerlPackage { + # pname = "Catalyst-Plugin-Static-Simple"; + # version = "0.37"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/Catalyst-Plugin-Static-Simple-0.37.tar.gz"; + # hash = "sha256-Wk2Fo1iM1Og/GwAlgUEufXG31X9mBW5dh6Nvk9icnnw="; + # }; + # patches = [ ./perl-modules/catalyst-plugin-static-simple-etag.patch ]; + # propagatedBuildInputs = [ CatalystRuntime MIMETypes MooseXTypes ]; + # meta = { + # description = "Make serving static pages painless"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystPluginStatusMessage = buildPerlPackage { + # pname = "Catalyst-Plugin-StatusMessage"; + # version = "1.002000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HK/HKCLARK/Catalyst-Plugin-StatusMessage-1.002000.tar.gz"; + # hash = "sha256-ZJyJSrFvn0itqPnMWZp+y7iJGrN2H/b9UQUgxt5AfB8="; + # }; + # propagatedBuildInputs = [ CatalystRuntime strictures ]; + # meta = { + # description = "Handle passing of status (success and error) messages between screens of a web application"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystViewCSV = buildPerlPackage { + # pname = "Catalyst-View-CSV"; + # version = "1.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMREIN/Catalyst-View-CSV-1.8.tar.gz"; + # hash = "sha256-vKcEaDzDXEevuJrDjHFRAu2+gIF57gcz0qDrMRojbN8="; + # }; + # buildInputs = [ CatalystActionRenderView CatalystModelDBICSchema CatalystPluginConfigLoader CatalystXComponentTraits ConfigGeneral DBDSQLite DBIxClass TestException ]; + # propagatedBuildInputs = [ CatalystRuntime TextCSV ]; + # meta = { + # description = "CSV view class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystViewDownload = buildPerlPackage { + # pname = "Catalyst-View-Download"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAUDEON/Catalyst-View-Download-0.09.tar.gz"; + # hash = "sha256-es+PXyRex/bzU/SHKdE3sSrxrPos8fvWXHA5HpM3+OE="; + # }; + # buildInputs = [ CatalystRuntime TestLongString TestSimple13 TestWWWMechanize TestWWWMechanizeCatalyst TextCSV XMLSimple ]; + # meta = { + # description = "A view module to help in the convenience of downloading data into many supportable formats"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystViewJSON = buildPerlPackage { + # pname = "Catalyst-View-JSON"; + # version = "0.37"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Catalyst-View-JSON-0.37.tar.gz"; + # hash = "sha256-xdo/bop3scmYVd431YgCwLGU4pp9hsYO04Mc/dWfnew="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ]; + # meta = { + # description = "JSON (JavaScript Object Notation) encoder/decoder"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystViewTT = buildPerlPackage { + # pname = "Catalyst-View-TT"; + # version = "0.46"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JJ/JJNAPIORK/Catalyst-View-TT-0.46.tar.gz"; + # hash = "sha256-7aRFfbv4GkJBtzWl1GnZcn2KMJHSSvGuPJog8CTeUcw="; + # }; + # propagatedBuildInputs = [ CatalystRuntime ClassAccessor TemplateTimer ]; + # meta = { + # description = "Template View Class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystXComponentTraits = buildPerlPackage { + # pname = "CatalystX-Component-Traits"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/CatalystX-Component-Traits-0.19.tar.gz"; + # hash = "sha256-CElE6cnQ37ENSrNFPhwSX97jkSm0bRfAI0w8U1FkBEc="; + # }; + # propagatedBuildInputs = [ CatalystRuntime MooseXTraitsPluggable ]; + # meta = { + # description = "Automatic Trait Loading and Resolution for Catalyst Components"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystXRoleApplicator = buildPerlPackage { + # pname = "CatalystX-RoleApplicator"; + # version = "0.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HD/HDP/CatalystX-RoleApplicator-0.005.tar.gz"; + # hash = "sha256-4o5HZ3aJva31VE4cQaKsV1WZNm+EDXO70LA8ZPtVim8="; + # }; + # propagatedBuildInputs = [ CatalystRuntime MooseXRelatedClassRoles ]; + # meta = { + # description = "Apply roles to your Catalyst application-related classes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystTraitForRequestProxyBase = buildPerlPackage { + # pname = "Catalyst-TraitFor-Request-ProxyBase"; + # version = "0.000005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Catalyst-TraitFor-Request-ProxyBase-0.000005.tar.gz"; + # hash = "sha256-p78Pqn4Syl32Jdn1/HEPEb/Ra6U4WDfkjUKz0obJcQo="; + # }; + # buildInputs = [ CatalystRuntime CatalystXRoleApplicator HTTPMessage ]; + # propagatedBuildInputs = [ Moose URI namespaceautoclean ]; + # meta = { + # description = "Replace request base with value passed by HTTP proxy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CatalystXScriptServerStarman = buildPerlPackage { + # pname = "CatalystX-Script-Server-Starman"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABRAXXA/CatalystX-Script-Server-Starman-0.03.tar.gz"; + # hash = "sha256-5jpH80y0P3+87GdYyaVCiAGOOIAjZTYYkLKjTfCKWyI="; + # }; + # patches = [ + # # See Nixpkgs issues #16074 and #17624 + # ./perl-modules/CatalystXScriptServerStarman-fork-arg.patch + # ]; + # buildInputs = [ TestWWWMechanizeCatalyst ]; + # propagatedBuildInputs = [ CatalystRuntime MooseXTypes PodParser Starman ]; + # meta = { + # description = "Replace the development server with Starman"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CDB_File = buildPerlPackage { + # pname = "CDB_File"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/CDB_File-1.05.tar.gz"; + # hash = "sha256-hWSEnVY5AV3iNiTlc8riU265CUMrZNkAmKHgtFKp60s="; + # }; + # buildInputs = [ TestFatal TestWarnings ]; + # propagatedBuildInputs = [ BCOW ]; + # meta = { + # description = "Perl extension for access to cdb databases"; + # homepage = "https://github.com/toddr/CDB_File"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Catmandu = buildPerlModule { + # pname = "Catmandu"; + # version = "1.2020"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HO/HOCHSTEN/Catmandu-1.2020.tar.gz"; + # hash = "sha256-1jIbR+NkGvkb7vZjNhWZVk88wzwAc5isa7opuO5A4cU="; + # }; + # propagatedBuildInputs = [ AnyURIEscape AppCmd CGIExpand ConfigOnion CpanelJSONXS DataCompare DataUtil IOHandleUtil LWP ListMoreUtils LogAny MIMETypes ModuleInfo MooXAliases ParserMGC PathIteratorRule PathTiny StringCamelCase TextCSV TextHogan Throwable TryTinyByClass URITemplate UUIDTiny YAMLLibYAML namespaceclean ]; + # buildInputs = [ LogAnyAdapterLog4perl LogLog4perl TestDeep TestException TestLWPUserAgent TestPod ]; + # meta = { + # description = "A data toolkit"; + # homepage = "https://github.com/LibreCat/Catmandu"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "catmandu"; + # }; + # }; + + # CDDB_get = buildPerlPackage { + # pname = "CDDB_get"; + # version = "2.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FO/FONKIE/CDDB_get-2.28.tar.gz"; + # hash = "sha256-vcy6H6jkwc8xicXlo1KaZpOmSKpSgrWXU4x6rdzm2ck="; + # }; + # meta = { + # description = "Get the CDDB info for an audio cd"; + # license = with lib.licenses; [ artistic1 ]; + # maintainers = [ maintainers.endgame ]; + # mainProgram = "cddb.pl"; + # }; + # }; + + # CDDBFile = buildPerlPackage { + # pname = "CDDB-File"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TM/TMTM/CDDB-File-1.05.tar.gz"; + # hash = "sha256-6+ZCnEFcFOc8bK/g1OLc3o4WnYFScfHhUjwmThrsx8k="; + # }; + # meta = { + # description = "Parse a CDDB/freedb data file"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + + CGI = buildPerlPackage { + pname = "CGI"; + version = "4.59"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEEJO/CGI-4.59.tar.gz"; + hash = "sha256-be5LibiLEOd8lvPAjRm1hq74M7F6Ql1hiq19KMJi+Rw="; + }; + buildInputs = [ TestDeep TestNoWarnings TestWarn ]; + propagatedBuildInputs = [ HTMLParser ]; + meta = { + description = "Handle Common Gateway Interface requests and responses"; + homepage = "https://metacpan.org/module/CGI"; + license = with lib.licenses; [ artistic2 ]; + }; + }; + + # CGICompile = buildPerlModule { + # pname = "CGI-Compile"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/CGI-Compile-0.26.tar.gz"; + # hash = "sha256-TzhcEMLJd+tgPzjNFT4OA2jfA3H9vSP1qm7nL0/GXcg="; + # }; + # propagatedBuildInputs = [ Filepushd SubName ]; + # buildInputs = [ CGI CaptureTiny ModuleBuildTiny SubIdentify Switch TestNoWarnings TestRequires TryTiny ]; + # meta = { + # description = "Compile .cgi scripts to a code reference like ModPerl::Registry"; + # homepage = "https://github.com/miyagawa/CGI-Compile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGICookieXS = buildPerlPackage { + # pname = "CGI-Cookie-XS"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AG/AGENT/CGI-Cookie-XS-0.18.tar.gz"; + # hash = "sha256-RpnLSr2XIBSvO+ubCmlbQluH2ibLK0vbJgIHCqrdPcY="; + # }; + # meta = { + # description = "HTTP Cookie parser in pure C"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGIEmulatePSGI = buildPerlPackage { + # pname = "CGI-Emulate-PSGI"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/CGI-Emulate-PSGI-0.23.tar.gz"; + # hash = "sha256-3VtsNT8I+6EA2uCZBChPf3P4Mo0x9qZ7LBNvrXKNFYs="; + # }; + # buildInputs = [ TestRequires ]; + # propagatedBuildInputs = [ CGI ]; + # meta = { + # description = "PSGI adapter for CGI"; + # homepage = "https://github.com/tokuhirom/p5-cgi-emulate-psgi"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGIExpand = buildPerlPackage { + # pname = "CGI-Expand"; + # version = "2.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOWMANBS/CGI-Expand-2.05.tar.gz"; + # hash = "sha256-boLRGOPEwMLa/NpYde3l6N2//+C336pkjkUeA5pFpKk="; + # }; + # buildInputs = [ TestException ]; + # meta = { + # description = "Convert flat hash to nested data using TT2's dot convention"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + CGIFast = buildPerlPackage { + pname = "CGI-Fast"; + version = "2.16"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEEJO/CGI-Fast-2.16.tar.gz"; + hash = "sha256-AiPX+RuAA3ud/183NgZAtx9dyNvZiaBZPV0i8/c8s9Q="; + }; + propagatedBuildInputs = [ CGI FCGI ]; + doCheck = false; + meta = { + description = "CGI Interface for Fast CGI"; + homepage = "https://metacpan.org/module/CGI::Fast"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # CGIFormBuilder = buildPerlPackage { + # pname = "CGI-FormBuilder"; + # version = "3.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BIGPRESH/CGI-FormBuilder-3.10.tar.gz"; + # hash = "sha256-rsmb4MDwZ6fnJpxTeOWubI1905s2i08SwNhGOxPucZg="; + # }; + + # propagatedBuildInputs = [ CGI ]; + # meta = { + # description = "Easily generate and process stateful forms"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGIMinimal = buildPerlModule { + # pname = "CGI-Minimal"; + # version = "1.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SN/SNOWHARE/CGI-Minimal-1.30.tar.gz"; + # hash = "sha256-uU1QghsCYR2m7lQjGTFFB4xNuygvKxYqSw1YCUmXvEc="; + # }; + # meta = { + # description = "A lightweight CGI form processing package"; + # homepage = "https://github.com/JerilynFranz/perl-CGI-Minimal"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # CGIPSGI = buildPerlPackage { + # pname = "CGI-PSGI"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/CGI-PSGI-0.15.tar.gz"; + # hash = "sha256-xQ3LEL+EhqmEO67QMq2J2Hn/L0HJkzQt6tYvlHpZjZE="; + # }; + # propagatedBuildInputs = [ CGI ]; + # meta = { + # description = "Adapt CGI.pm to the PSGI protocol"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGISession = buildPerlModule { + # pname = "CGI-Session"; + # version = "4.48"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKSTOS/CGI-Session-4.48.tar.gz"; + # hash = "sha256-RnVkYcJM52ZrgQjduW26thJpnfMBLIDvEQFmGf4VVPc="; + # }; + # propagatedBuildInputs = [ CGI ]; + # meta = { + # description = "Persistent session data in CGI applications"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # CGISimple = buildPerlPackage { + # pname = "CGI-Simple"; + # version = "1.280"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/CGI-Simple-1.280.tar.gz"; + # hash = "sha256-GOAen/uBTl5O6neshImyBp/oNlGFUPN/bCIT61Wcar8="; + # }; + # buildInputs = [ TestException TestNoWarnings ]; + # meta = { + # description = "A Simple totally OO CGI interface that is CGI.pm compliant"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CGIStruct = buildPerlPackage { + # pname = "CGI-Struct"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FU/FULLERMD/CGI-Struct-1.21.tar.gz"; + # hash = "sha256-0T2Np/3NbZBgVOR2D8KKcYrskb088GeliSf7fLHAnWw="; + # }; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Build structures from CGI data"; + # license = with lib.licenses; [ bsd2 ]; + # }; + # }; + + # CHI = buildPerlPackage { + # pname = "CHI"; + # version = "0.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASB/CHI-0.61.tar.gz"; + # hash = "sha256-WDVFyeUxK7QZOrFt6fVf+PS0p97RKM7o3SywIdRni1s="; + # }; + # preConfigure = '' + # # fix error 'Unescaped left brace in regex is illegal here in regex' + # substituteInPlace lib/CHI/t/Driver/Subcache/l1_cache.pm --replace 'qr/CHI stats: {' 'qr/CHI stats: \{' + # ''; + # buildInputs = [ TestClass TestDeep TestException TestWarn TimeDate ]; + # propagatedBuildInputs = [ CarpAssert ClassLoad DataUUID DigestJHash HashMoreUtils JSONMaybeXS ListMoreUtils LogAny Moo MooXTypesMooseLikeNumeric StringRewritePrefix TaskWeaken TimeDuration TimeDurationParse ]; + # meta = { + # description = "Unified cache handling interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Chart = buildPerlPackage { + # pname = "Chart"; + # version = "2.403.9"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LI/LICHTKIND/Chart-v2.403.9.tar.gz"; + # hash = "sha256-V8aCi7TIpyFw/rZ9wfFIq/Gcqzgnd54wh3tGEe1n86s="; + # }; + # buildInputs = [ TestWarn ]; + # propagatedBuildInputs = [ GD GraphicsToolkitColor ]; + # meta = { + # description = "A series of charting modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ChipcardPCSC = buildPerlPackage { + # pname = "Chipcard-PCSC"; + # version = "1.4.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WH/WHOM/Chipcard-PCSC-v1.4.16.tar.gz"; + # hash = "sha256-O14p1jRDXxQm7Nzfebo1G04mWPNsPCK+N7HTHjbKj6k="; + # }; + # buildInputs = [ pkgs.pcsclite ]; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # env.NIX_CFLAGS_COMPILE = toString ([ + # "-I${pkgs.pcsclite.dev}/include/PCSC" + # ] ++ lib.optionals stdenv.cc.isClang [ + # "-Wno-error=implicit-int" + # "-Wno-error=int-conversion" + # ]); + # postPatch = '' + # substituteInPlace Makefile.PL --replace pkg-config $PKG_CONFIG + # ''; + # NIX_CFLAGS_LINK = "-L${lib.getLib pkgs.pcsclite}/lib -lpcsclite"; + # # tests fail; look unfinished + # doCheck = false; + # meta = { + # description = "Communicate with a smart card using PC/SC"; + # homepage = "https://pcsc-perl.apdu.fr/"; + # license = with lib.licenses; [ gpl2Plus ]; + # maintainers = with maintainers; [ abbradar anthonyroussel ]; + # }; + # }; + + # CiscoIPPhone = buildPerlPackage { + # pname = "Cisco-IPPhone"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRPALMER/Cisco-IPPhone-0.05.tar.gz"; + # hash = "sha256-sDyiY/j0Gm7FRcU5MhOjFG02vUUzWt6Zr1HdQqtu4W0="; + # }; + # meta = { + # description = "Package for creating Cisco IPPhone XML objects"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # CLASS = buildPerlPackage { + # pname = "CLASS"; + # version = "1.1.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JD/JDEGUEST/CLASS-v1.1.8.tar.gz"; + # hash = "sha256-IZAaUmXL29iRJ36X/Gs0X3nby/B3RFePX/iGaltddgM="; + # }; + # meta = { + # description = "Alias for __PACKAGE__"; + # homepage = "https://metacpan.org/pod/CLASS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ClassAccessor = buildPerlPackage { + # pname = "Class-Accessor"; + # version = "0.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KASEI/Class-Accessor-0.51.tar.gz"; + # hash = "sha256-vxKj5d5aLG6KRHs2T09aBQv3RiTFbjFQIq55kv8vQRw="; + # }; + # meta = { + # description = "Automated accessor generation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassAccessorChained = buildPerlModule { + # pname = "Class-Accessor-Chained"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Class-Accessor-Chained-0.01.tar.gz"; + # hash = "sha256-pb9J04BPg60lobFvMn0U1MvuInATIQSyhwUDHbzMNNI="; + # }; + # propagatedBuildInputs = [ ClassAccessor ]; + # meta = { + # description = "Make chained accessors"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassAccessorGrouped = buildPerlPackage { + # pname = "Class-Accessor-Grouped"; + # version = "0.10014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Class-Accessor-Grouped-0.10014.tar.gz"; + # hash = "sha256-NdWwPvwJ9n86MVXJYkEmw+FiyOPKmP+CbbNYUzpExLs="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ ModuleRuntime ]; + # meta = { + # description = "Lets you build groups of accessors"; + # homepage = "https://metacpan.org/release/Class-Accessor-Grouped"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassAccessorLite = buildPerlPackage { + # pname = "Class-Accessor-Lite"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/Class-Accessor-Lite-0.08.tar.gz"; + # hash = "sha256-dbO47I7+aHZ3tj8KEO75ZuAfYHNcVmVs51y7RMq6M1o="; + # }; + # meta = { + # description = "A minimalistic variant of Class::Accessor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassAutouse = buildPerlPackage { + # pname = "Class-Autouse"; + # version = "2.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AD/ADAMK/Class-Autouse-2.01.tar.gz"; + # hash = "sha256-wFsyNsBXGdgZwg2w/ettCVR0fkPXpzgpTu1/vPNuzxs="; + # }; + # meta = { + # description = "Run-time load a class the first time you call a method in it"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassBase = buildPerlPackage { + # pname = "Class-Base"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YANICK/Class-Base-0.09.tar.gz"; + # hash = "sha256-4aW93lJQWAJmSpEIpRXJ6OUCy3IppJ3pT0CBsbKu7YQ="; + # }; + # propagatedBuildInputs = [ Clone ]; + # meta = { + # description = "Useful base class for deriving other modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassC3 = buildPerlPackage { + # pname = "Class-C3"; + # version = "0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Class-C3-0.35.tar.gz"; + # hash = "sha256-hAU88aaPzIwSBWwvEgrfBPf2jjvjT0QI6V0Cb+5n4z4="; + # }; + # propagatedBuildInputs = [ AlgorithmC3 ]; + # meta = { + # description = "A pragma to use the C3 method resolution order algorithm"; + # homepage = "https://metacpan.org/release/Class-C3"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassC3AdoptNEXT = buildPerlModule { + # pname = "Class-C3-Adopt-NEXT"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Class-C3-Adopt-NEXT-0.14.tar.gz"; + # hash = "sha256-hWdiJarbduhmamq+LgZZ1A60WBrWOFsXDupOHWvzS/c="; + # }; + # buildInputs = [ ModuleBuildTiny TestException ]; + # propagatedBuildInputs = [ MROCompat ]; + # meta = { + # description = "Make NEXT suck less"; + # homepage = "https://github.com/karenetheridge/Class-C3-Adopt-NEXT"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassC3Componentised = buildPerlPackage { + # pname = "Class-C3-Componentised"; + # version = "1.001002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Class-C3-Componentised-1.001002.tar.gz"; + # hash = "sha256-MFGxRtwe/q6hqaLp5rF3MICZW4mKtYPxVWWNX8gLlpM="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ ClassC3 ClassInspector MROCompat ]; + # meta = { + # description = "Load mix-ins or components to your C3-based class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassClassgenclassgen = buildPerlPackage { + # pname = "Class-Classgen-classgen"; + # version = "3.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHLUE/Class-Classgen-classgen-3.03.tar.gz"; + # hash = "sha256-m2XUG5kVOJkugWsyzE+ptKSguz6cEOfuvv+CZY27yPY="; + # }; + # meta = { + # description = "Simplifies creation, manipulation and usage of complex objects."; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "classgen"; + # }; + # }; + + # ClassContainer = buildPerlModule { + # pname = "Class-Container"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KW/KWILLIAMS/Class-Container-0.13.tar.gz"; + # hash = "sha256-9dSVsd+4JtXAxF0DtNDmtgR8uwbNv2vhX9TckCrutws="; + # }; + # propagatedBuildInputs = [ ParamsValidate ]; + # meta = { + # description = "Glues object frameworks together transparently"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassDataAccessor = buildPerlPackage { + # pname = "Class-Data-Accessor"; + # version = "0.04004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CL/CLACO/Class-Data-Accessor-0.04004.tar.gz"; + # hash = "sha256-wSLW4t9hNs6b6h5tK3dsueaeAAhezplTAYFMevOo6BQ="; + # }; + # meta = { + # description = "Inheritable, overridable class and instance data accessor creation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassDataInheritable = buildPerlPackage { + # pname = "Class-Data-Inheritable"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSHERER/Class-Data-Inheritable-0.09.tar.gz"; + # hash = "sha256-RAiNbpBxLhh7ilsFDKWxxw7+K6oyrhI+m9j1nynwbk0="; + # }; + # meta = { + # description = "Inheritable, overridable class data"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassEHierarchy = buildPerlPackage { + # pname = "Class-EHierarchy"; + # version = "2.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORLISS/Class-EHierarchy/Class-EHierarchy-2.01.tar.gz"; + # hash = "sha256-Y3q3a+s4MqmwcbmZobFb8F0pffamYsyxqABPKYcwg4I="; + # }; + # meta = { + # description = "Base class for hierarchally ordered objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # ClassFactory = buildPerlPackage { + # pname = "Class-Factory"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/Class-Factory-1.06.tar.gz"; + # hash = "sha256-w3otJp65NfNqI+ETSArglG+nwSoSeBOWoSJsjkNfMPU="; + # }; + # meta = { + # description = "Base class for dynamic factory classes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassFactoryUtil = buildPerlModule { + # pname = "Class-Factory-Util"; + # version = "1.7"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Class-Factory-Util-1.7.tar.gz"; + # hash = "sha256-bFFrRFtE+HNj+zoUhDHTHp7LXm8h+2SByJskBrZpLiY="; + # }; + # meta = { + # description = "Provide utility methods for factory classes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassGomor = buildPerlModule { + # pname = "Class-Gomor"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GO/GOMOR/Class-Gomor-1.03.tar.gz"; + # hash = "sha256-R9s86pzp/6mL+cdFV/0yz3AHkatTcCDJWKwwtKn/IAs="; + # }; + # meta = { + # description = "Another class and object builder"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + ClassInspector = buildPerlPackage { + pname = "Class-Inspector"; + version = "1.36"; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PL/PLICEASE/Class-Inspector-1.36.tar.gz"; + hash = "sha256-zCldI6RyaHwkSJ1YIm6tI7n9wliOUi8LXwdHdBcAaU4="; + }; + meta = { + description = "Get information about a class and its structure"; + homepage = "https://metacpan.org/pod/Class::Inspector"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ClassISA = buildPerlPackage { + # pname = "Class-ISA"; + # version = "0.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Class-ISA-0.36.tar.gz"; + # hash = "sha256-iBbzTpo46EmhDfdWAw3M+f4GGhlsEaw/qv1xE8kpuWQ="; + # }; + # meta = { + # description = "Report the search path for a class's ISA tree"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassIterator = buildPerlPackage { + # pname = "Class-Iterator"; + # version = "0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TE/TEXMEC/Class-Iterator-0.3.tar.gz"; + # hash = "sha256-2xuofKkQfxYf6cHp5+JnwAJt78Jv4+c7ytirj/wY750="; + # }; + # meta = { + # description = "Iterator class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassLoader = buildPerlPackage { + # pname = "Class-Loader"; + # version = "2.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VI/VIPUL/Class-Loader-2.03.tar.gz"; + # hash = "sha256-T+8gdurWBCNFT/H06ChZqam5lCtfuO7gyYucY8nyuOc="; + # }; + # meta = { + # description = "Load modules and create objects on demand"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassMakeMethods = buildPerlPackage { + # pname = "Class-MakeMethods"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EV/EVO/Class-MakeMethods-1.01.tar.gz"; + # hash = "sha256-rKx0LnnQ7Ip75Nj7gTqF6kTUfRnAFwzdswZEYCtYLGY="; + # }; + # preConfigure = '' + # # fix error 'Unescaped left brace in regex is illegal here in regex' + # substituteInPlace tests/xemulator/class_methodmaker/Test.pm --replace 's/(TEST\s{)/$1/g' 's/(TEST\s\{)/$1/g' + # ''; + # meta = { + # description = "Generate common types of methods"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassMember = buildPerlPackage { + # pname = "Class-Member"; + # version = "1.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OP/OPI/Class-Member-1.6.tar.gz"; + # hash = "sha256-p1KK8in6OhIF3NJakd59dKxvp9lSgbmTtV6Lb0+HuZE="; + # }; + # meta = { + # description = "A set of modules to make the module developement easier"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassMethodMaker = buildPerlPackage { + # pname = "Class-MethodMaker"; + # version = "2.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SC/SCHWIGON/class-methodmaker/Class-MethodMaker-2.24.tar.gz"; + # hash = "sha256-Xu9YzLJ+vQG83lsUvMVTtTR6Bpnlw+khx3gMNSaJAyg="; + # }; + # # Remove unnecessary, non-autoconf, configure script. + # prePatch = "rm configure"; + # meta = { + # description = "A module for creating generic methods"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ClassMethodModifiers = buildPerlPackage { + pname = "Class-Method-Modifiers"; + version = "2.15"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/ET/ETHER/Class-Method-Modifiers-2.15.tar.gz"; + hash = "sha256-Zc2Fv+R10GbpGG96jMY2BwmFswsOuxzehoHPBiwuFfw="; + }; + buildInputs = [ TestFatal TestNeeds ]; + meta = { + description = "Provides Moose-like method modifiers"; + homepage = "https://github.com/moose/Class-Method-Modifiers"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ClassMix = buildPerlModule { + # pname = "Class-Mix"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Class-Mix-0.006.tar.gz"; + # hash = "sha256-h0f2Q4k5FPjESXnxcW0MHsikE5R5ZVVEeUToYPH/fAs="; + # }; + # propagatedBuildInputs = [ ParamsClassify ]; + # meta = { + # description = "Dynamic class mixing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassRefresh = buildPerlPackage { + # pname = "Class-Refresh"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/Class-Refresh-0.07.tar.gz"; + # hash = "sha256-47ADU1XLs1oq7j8iNojVeJRqenxXCs05iyjN2x/UvrM="; + # }; + # buildInputs = [ TestFatal TestRequires ]; + # propagatedBuildInputs = [ ClassLoad ClassUnload DevelOverrideGlobalRequire TryTiny ]; + # meta = { + # homepage = "http://metacpan.org/release/Class-Refresh"; + # description = "Refresh your classes during runtime"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassReturnValue = buildPerlPackage { + # pname = "Class-ReturnValue"; + # version = "0.55"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JESSE/Class-ReturnValue-0.55.tar.gz"; + # hash = "sha256-7Tg2iF149zTM16mFUOxCKmFt98MTEMG3sfZFn1+w5L0="; + # }; + # propagatedBuildInputs = [ DevelStackTrace ]; + # meta = { + # description = "(deprecated) polymorphic return values"; + # homepage = "https://github.com/rjbs/Return-Value"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassSingleton = buildPerlPackage { + # pname = "Class-Singleton"; + # version = "1.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHAY/Class-Singleton-1.6.tar.gz"; + # hash = "sha256-J7oT8NlRKSkWa72MnvldkNYw/IDwyaG3RYiRBV6SgqQ="; + # }; + # meta = { + # description = "Implementation of a 'Singleton' class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassThrowable = buildPerlPackage { + # pname = "Class-Throwable"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KM/KMX/Class-Throwable-0.13.tar.gz"; + # hash = "sha256-3JoR4Nq1bcIg3qjJT+PEfbXn3Xwe0E3IF4qlu3v7vM4="; + # }; + # meta = { + # description = "A minimal lightweight exception class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassTiny = buildPerlPackage { + # pname = "Class-Tiny"; + # version = "1.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Class-Tiny-1.008.tar.gz"; + # hash = "sha256-7gWKY5Evofy5pySY9WykIaIFbcf59LZ4N0RtZCGBVhU="; + # }; + # meta = { + # description = "Minimalist class construction"; + # homepage = "https://github.com/dagolden/Class-Tiny"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # ClassLoad = buildPerlPackage { + # pname = "Class-Load"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Class-Load-0.25.tar.gz"; + # hash = "sha256-Kkj6d5tSl+VhVjgOizJjfGxY3stPSn88c1BSPhEnX48="; + # }; + # buildInputs = [ TestFatal TestNeeds ]; + # propagatedBuildInputs = [ DataOptList PackageStash ]; + # meta = { + # description = "A working (require \"Class::Name\") and more"; + # homepage = "https://github.com/moose/Class-Load"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassLoadXS = buildPerlPackage { + # pname = "Class-Load-XS"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Class-Load-XS-0.10.tar.gz"; + # hash = "sha256-W8Is9Tbr/SVkxb2vQvDYpM7j0ZMPyLRLfUpCA4YirdE="; + # }; + # buildInputs = [ TestFatal TestNeeds ]; + # propagatedBuildInputs = [ ClassLoad ]; + # meta = { + # description = "XS implementation of parts of Class::Load"; + # homepage = "https://github.com/moose/Class-Load-XS"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ClassObservable = buildPerlPackage { + # pname = "Class-Observable"; + # version = "2.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/Class-Observable-2.004.tar.gz"; + # hash = "sha256-bfMun+XwCIkfxO+k5PReqhQE0wIgRZyPyKUB8KfPLmk="; + # }; + # propagatedBuildInputs = [ ClassISA ]; + # meta = { + # description = "Allow other classes and objects to respond to events in yours"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassStd = buildPerlModule { + # pname = "Class-Std"; + # version = "0.013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Class-Std-0.013.tar.gz"; + # hash = "sha256-vNbYL2yK8P4Gn87X3RZaR5WwtukjUcfU5aGrmhT8NcY="; + # }; + # meta = { + # description = "Support for creating standard 'inside-out' classes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassStdFast = buildPerlModule { + # pname = "Class-Std-Fast"; + # version = "0.0.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AC/ACID/Class-Std-Fast-v0.0.8.tar.gz"; + # hash = "sha256-G9Q3Y8ajcxgwl6MOeH9dZxOw2ydRHFLVMyZrWdLPp4A="; + # }; + # propagatedBuildInputs = [ ClassStd ]; + # nativeCheckInputs = [ TestPod TestPodCoverage ]; + # meta = { + # description = "Faster but less secure than Class::Std"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassUnload = buildPerlPackage { + # pname = "Class-Unload"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/Class-Unload-0.11.tar.gz"; + # hash = "sha256-UuKXR6fk0uGiicDh3oEHY08QyEJs18nTHsrIOD5KCl8="; + # }; + # propagatedBuildInputs = [ ClassInspector ]; + # buildInputs = [ TestRequires ]; + # meta = { + # description = "Unload a class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassVirtual = buildPerlPackage { + # pname = "Class-Virtual"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/Class-Virtual-0.08.tar.gz"; + # hash = "sha256-xkmbQtO05cZIil6C+8KGmObJhgFlBy3d+mdJNVqc+7I="; + # }; + # propagatedBuildInputs = [ CarpAssert ClassDataInheritable ClassISA ]; + # meta = { + # description = "Base class for virtual base classes"; + # homepage = "https://metacpan.org/release/Class-Virtual"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClassXSAccessor = buildPerlPackage { + # pname = "Class-XSAccessor"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Class-XSAccessor-1.19.tar.gz"; + # hash = "sha256-mcVrOV8SOa8ZkB8v7rEl2ey041Gg2A2qlSkhGkcApvI="; + # }; + # meta = { + # description = "Generate fast XS accessors without runtime compilation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CLDRNumber = buildPerlModule { + # pname = "CLDR-Number"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PA/PATCH/CLDR-Number-0.19.tar.gz"; + # hash = "sha256-xnFkiOZf53n/eag/DyA2rZRGPv49DzSca5kRKXW9hfw="; + # }; + # buildInputs = [ SoftwareLicense TestDifferences TestException TestWarn ]; + # propagatedBuildInputs = + # [ ClassMethodModifiers MathRound Moo namespaceclean ]; + # meta = { + # description = "Localized number formatters using the Unicode CLDR"; + # homepage = "https://github.com/patch/cldr-number-pm5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CLIHelpers = buildPerlPackage { + # pname = "CLI-Helpers"; + # version = "2.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BL/BLHOTSKY/CLI-Helpers-2.0.tar.gz"; + # hash = "sha256-yhpPFnTzsfMmjyekfJiAszgmrenxI34sEUXnAqfIePY="; + # }; + # buildInputs = [ PodCoverageTrustPod TestPerlCritic ]; + # propagatedBuildInputs = [ CaptureTiny IOInteractive RefUtil TermReadKey YAML ]; + # meta = { + # description = "Subroutines for making simple command line scripts"; + # homepage = "https://github.com/reyjrar/CLI-Helpers"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # Clipboard = buildPerlModule { + # pname = "Clipboard"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Clipboard-0.28.tar.gz"; + # hash = "sha256-no15AVGUJjNXwloPXQlIAP/0O9v5+GAew7DtXrCWbSY="; + # }; + # propagatedBuildInputs = [ CGI ]; + # # Disable test on darwin because MacPasteboard fails when not logged in interactively. + # # Mac OS error -4960 (coreFoundationUnknownErr): The unknown error at lib/Clipboard/MacPasteboard.pm line 3. + # # Mac-Pasteboard-0.009.readme: 'NOTE that Mac OS X appears to restrict pasteboard access to processes that are logged in interactively. + # # Ssh sessions and cron jobs can not create the requisite pasteboard handles, giving coreFoundationUnknownErr (-4960)' + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Copy and paste with any OS"; + # homepage = "https://metacpan.org/release/Clipboard"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + + Clone = buildPerlPackage { + pname = "Clone"; + version = "0.46"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GA/GARU/Clone-0.46.tar.gz"; + hash = "sha256-qt7tXkyL1rvfaMDdAGbLUT4Wq55bQ4LcSgqv1ViQaXs="; + }; + buildInputs = [ BCOW ]; + meta = { + description = "Recursively copy Perl datatypes"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # CloneChoose = buildPerlPackage { + # pname = "Clone-Choose"; + # version = "0.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HE/HERMES/Clone-Choose-0.010.tar.gz"; + # hash = "sha256-ViNIH1jO6O25bNICqtDfViLUJ+X3SLJThR39YuUSNjI="; + # }; + # buildInputs = [ Clone ClonePP TestWithoutModule ]; + # meta = { + # description = "Choose appropriate clone utility"; + # homepage = "https://metacpan.org/release/Clone-Choose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ClonePP = buildPerlPackage { + # pname = "Clone-PP"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Clone-PP-1.08.tar.gz"; + # hash = "sha256-VyAwlKXYV0tqAJUejyOZtmb050+VEdnJ+1tFPV0R9Xg="; + # }; + # meta = { + # description = "Recursively copy Perl datatypes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CodeTidyAll = buildPerlPackage { + # pname = "Code-TidyAll"; + # version = "0.83"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Code-TidyAll-0.83.tar.gz"; + # hash = "sha256-FqBS0DprF/xYqEqZb68p5C7O124sQMRyc+uKsxzBXKE="; + # }; + # propagatedBuildInputs = [ CaptureTiny ConfigINI FileWhich Filepushd IPCRun3 IPCSystemSimple ListCompare ListSomeUtils LogAny Moo ScopeGuard SpecioLibraryPathTiny TextDiff TimeDate TimeDurationParse ]; + # buildInputs = [ TestClass TestClassMost TestDeep TestDifferences TestException TestFatal TestMost TestWarn TestWarnings librelative ]; + # meta = { + # description = "Engine for tidyall, your all-in-one code tidier and validator"; + # homepage = "https://metacpan.org/release/Code-TidyAll"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "tidyall"; + # }; + # }; + + # CodeTidyAllPluginPerlAlignMooseAttributes = buildPerlPackage { + # pname = "Code-TidyAll-Plugin-Perl-AlignMooseAttributes"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JS/JSWARTZ/Code-TidyAll-Plugin-Perl-AlignMooseAttributes-0.01.tar.gz"; + # hash = "sha256-jR3inlbwczFoXqONGDr87f8hCOccSp2zb0GeUN0sHOU="; + # }; + # propagatedBuildInputs = [ CodeTidyAll TextAligner ]; + # meta = { + # description = "TidyAll plugin to sort and align Moose-style attributes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ColorLibrary = buildPerlPackage { + # pname = "Color-Library"; + # version = "0.021"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROKR/Color-Library-0.021.tar.gz"; + # hash = "sha256-WMv34zPTpKQCl6vENBKzIdpEnGgWAg5PpmJasHn8kKU="; + # }; + # buildInputs = [ TestMost TestWarn TestException TestDeep TestDifferences ModulePluggable ]; + # propagatedBuildInputs = [ ClassAccessor ClassDataInheritable ]; + # meta = { + # description = "An easy-to-use and comprehensive named-color library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CommandRunner = buildPerlModule { + # pname = "Command-Runner"; + # version = "0.200"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/Command-Runner-0.200.tar.gz"; + # hash = "sha256-WtJtBhEb/s1TyPW7XeqUvyAl9seOlfbYAS5M+oninyY="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ CaptureTiny Filepushd StringShellQuote Win32ShellQuote ]; + # meta = { + # description = "Run external commands and Perl code refs"; + # homepage = "https://github.com/skaji/Command-Runner"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # commonsense = buildPerlPackage { + # pname = "common-sense"; + # version = "3.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/common-sense-3.75.tar.gz"; + # hash = "sha256-qGocTKTzAG10eQZEJaCfpbZonlcmH8uZT+Z9Bhy6Dn4="; + # }; + # meta = { + # description = "Implements some sane defaults for Perl programs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CompilerLexer = buildPerlModule { + # pname = "Compiler-Lexer"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GO/GOCCY/Compiler-Lexer-0.23.tar.gz"; + # hash = "sha256-YDHOSv67+k9JKidJSb57gjIxTpECOCjEOOR5gf8Kmds="; + # }; + # nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; + # buildInputs = [ ModuleBuildXSUtil ]; + # meta = { + # homepage = "https://github.com/goccy/p5-Compiler-Lexer"; + # description = "Lexical Analyzer for Perl5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CompressBzip2 = buildPerlPackage { + # pname = "Compress-Bzip2"; + # version = "2.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Compress-Bzip2-2.28.tar.gz"; + # hash = "sha256-hZ+DXD9cmYgQ2LKm+eKC/5nWy2bM+lXK5+Ztr7A1EW4="; + # }; + # meta = { + # description = "Interface to Bzip2 compression library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CompressLZF = buildPerlPackage rec { + # pname = "Compress-LZF"; + # version = "3.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/${pname}-${version}.tar.gz"; + # hash = "sha256-XR9d9IzhO03uHMnyeOzb+Bd4d7C5iBWk6zyRw0ZnFvI="; + # }; + # meta = { + # description = "Extremely light-weight Lempel-Ziv-Free compression"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CompressRawBzip2 = buildPerlPackage { + # pname = "Compress-Raw-Bzip2"; + # version = "2.206"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMQS/Compress-Raw-Bzip2-2.206.tar.gz"; + # hash = "sha256-ISuB2xwK6CLRmShhmmA70QjLXVxHAPxn3HyxaeDMZSU="; + # }; + + # # Don't build a private copy of bzip2. + # BUILD_BZIP2 = false; + # BZIP2_LIB = "${pkgs.bzip2.out}/lib"; + # BZIP2_INCLUDE = "${pkgs.bzip2.dev}/include"; + + # meta = { + # description = "Low-Level Interface to bzip2 compression library"; + # homepage = "https://github.com/pmqs/Compress-Raw-Bzip2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # CompressRawLzma = buildPerlPackage { + # pname = "Compress-Raw-Lzma"; + # version = "2.206"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMQS/Compress-Raw-Lzma-2.206.tar.gz"; + # hash = "sha256-4BpwQLhL3GdZLRPuwMeIWQ4faW0dTwfHCXvXKk+IbrQ="; + # }; + # preConfigure = '' + # cat > config.in < config.in < config.in < $out/${perl.libPrefix}/cross_perl/${perl.version}/DBI.pm < $out/${perl.libPrefix}/cross_perl/${perl.version}/DBI/DBD.pm < \$(BASEEXT).xsi + + # # --- + # '; + # } + # 1; + # EOF + # ''; + # meta = { + # description = "Database independent interface for Perl"; + # homepage = "https://dbi.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBICxTestDatabase = buildPerlPackage { + # pname = "DBICx-TestDatabase"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JR/JROCKWAY/DBICx-TestDatabase-0.05.tar.gz"; + # hash = "sha256-jjvCUwsBIWGIw6plrNvS9ZxOYx864IXfxDmr2J+PCs8="; + # }; + # buildInputs = [ DBIxClass TestSimple13 ]; + # propagatedBuildInputs = [ DBDSQLite SQLTranslator ]; + # meta = { + # description = "Create a temporary database from a DBIx::Class::Schema"; + # homepage = "https://metacpan.org/pod/DBICx::TestDatabase"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # DBIxClass = buildPerlPackage { + # pname = "DBIx-Class"; + # version = "0.082843"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RI/RIBASUSHI/DBIx-Class-0.082843.tar.gz"; + # hash = "sha256-NB4Lbssp2MSRdKbAnXxtvzhym6QBXuf9cDYKT/7h8lE="; + # }; + # buildInputs = [ DBDSQLite TestDeep TestException TestWarn ]; + # propagatedBuildInputs = [ ClassAccessorGrouped ClassC3Componentised ConfigAny ContextPreserve DBI DataDumperConcise DataPage DevelGlobalDestruction ModuleFind PathClass SQLAbstractClassic ScopeGuard SubName namespaceclean ]; + # meta = { + # description = "Extensible and flexible object <-> relational mapper"; + # homepage = "https://metacpan.org/pod/DBIx::Class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "dbicadmin"; + # }; + # }; + + # DBIxClassCandy = buildPerlPackage { + # pname = "DBIx-Class-Candy"; + # version = "0.005003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/DBIx-Class-Candy-0.005003.tar.gz"; + # hash = "sha256-uKIpp7FfVZCV1FYc+CIEYBKFQbp/w1Re01hpkj1GVlw="; + # }; + # buildInputs = [ TestDeep TestFatal ]; + # propagatedBuildInputs = [ DBIxClass LinguaENInflect SubExporter ]; + # meta = { + # description = "Sugar for your favorite ORM, DBIx::Class"; + # homepage = "https://github.com/frioux/DBIx-Class-Candy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxClassCursorCached = buildPerlPackage { + # pname = "DBIx-Class-Cursor-Cached"; + # version = "1.001004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARCANEZ/DBIx-Class-Cursor-Cached-1.001004.tar.gz"; + # hash = "sha256-NwhSMqEjClqodUOZ+1mw+PzV9Zeh4uNIxSJ0YaGSYiU="; + # }; + # buildInputs = [ CacheCache DBDSQLite ]; + # propagatedBuildInputs = [ CarpClan DBIxClass ]; + # meta = { + # description = "Cursor class with built-in caching support"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxClassDynamicDefault = buildPerlPackage { + # pname = "DBIx-Class-DynamicDefault"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/DBIx-Class-DynamicDefault-0.04.tar.gz"; + # hash = "sha256-Io9RqyJGQlhLTcY9tt4mZ8W/riqJSpN2shChBIBqWvs="; + # }; + # buildInputs = [ DBICxTestDatabase ]; + # propagatedBuildInputs = [ DBIxClass ]; + # meta = { + # description = "Automatically set and update fields"; + # homepage = "https://metacpan.org/pod/DBIx::Class::DynamicDefault"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # DBIxClassHTMLWidget = buildPerlPackage { + # pname = "DBIx-Class-HTMLWidget"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AN/ANDREMAR/DBIx-Class-HTMLWidget-0.16.tar.gz"; + # hash = "sha256-QUJ1YyFu31qTllCQrg4chaldN6gdcg8CwTYM+n208Bc="; + # }; + # propagatedBuildInputs = [ DBIxClass HTMLWidget ]; + # meta = { + # description = "Like FromForm but with DBIx::Class and HTML::Widget"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxClassHelpers = buildPerlPackage { + # pname = "DBIx-Class-Helpers"; + # version = "2.036000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/DBIx-Class-Helpers-2.036000.tar.gz"; + # hash = "sha256-t7i0iRqYPANO8LRfQRJASgpAVQxOIX2ut6IsoWhh79s="; + # }; + # buildInputs = [ DBDSQLite DateTimeFormatSQLite TestDeep TestFatal TestRoo aliased ]; + # propagatedBuildInputs = [ CarpClan DBIxClassCandy DBIxIntrospector SafeIsa TextBrew ]; + # meta = { + # description = "Simplify the common case stuff for DBIx::Class"; + # homepage = "https://github.com/frioux/DBIx-Class-Helpers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxClassInflateColumnSerializer = buildPerlPackage { + # pname = "DBIx-Class-InflateColumn-Serializer"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRUIZ/DBIx-Class-InflateColumn-Serializer-0.09.tar.gz"; + # hash = "sha256-YmK0hx22psRaDL583o8biQsiwpGt1OzEDKruq1o6b1A="; + # }; + # buildInputs = [ DBDSQLite TestException ]; + # propagatedBuildInputs = [ DBIxClass JSONMaybeXS YAML ]; + # meta = { + # description = "Inflators to serialize data structures for DBIx::Class"; + # homepage = "https://metacpan.org/release/DBIx-Class-InflateColumn-Serializer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # DBIxClassIntrospectableM2M = buildPerlPackage { + # pname = "DBIx-Class-IntrospectableM2M"; + # version = "0.001002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/DBIx-Class-IntrospectableM2M-0.001002.tar.gz"; + # hash = "sha256-xrqvtCQWk/2zSynr2QaZOt02S/Mar6RGLz4GIgTMh/A="; + # }; + # propagatedBuildInputs = [ DBIxClass ]; + # meta = { + # description = "Introspect many-to-many relationships"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxClassSchemaLoader = buildPerlPackage { + # pname = "DBIx-Class-Schema-Loader"; + # version = "0.07051"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VE/VEESH/DBIx-Class-Schema-Loader-0.07051.tar.gz"; + # hash = "sha256-GgieUISlJ2j0J0vCGB3LrhTcxXnk2YD89WnGeBsGCSw="; + # }; + # buildInputs = [ DBDSQLite TestDeep TestDifferences TestException TestWarn ]; + # propagatedBuildInputs = [ CarpClan ClassUnload DBIxClass DataDump StringCamelCase StringToIdentifierEN curry ]; + # meta = { + # description = "Create a DBIx::Class::Schema based on a database"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "dbicdump"; + # }; + # }; + + # DBIxConnector = buildPerlPackage { + # pname = "DBIx-Connector"; + # version = "0.59"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/DBIx-Connector-0.59.tar.gz"; + # hash = "sha256-eCmU8T9JVVhAU4SU+EBrC/JVj1M8zahsjSuV4jAQh/Q="; + # }; + # buildInputs = [ TestMockModule ]; + # propagatedBuildInputs = [ DBI ]; + # meta = { + # description = "Fast, safe DBI connection and transaction management"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxDBSchema = buildPerlPackage { + # pname = "DBIx-DBSchema"; + # version = "0.47"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IV/IVAN/DBIx-DBSchema-0.47.tar.gz"; + # hash = "sha256-7u4hDcFKjWPrAawtZsZ6HcJ5+Sib6WphckyJUXkcUhI="; + # }; + # propagatedBuildInputs = [ DBI ]; + # meta = { + # description = "Database-independent schema objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxSearchBuilder = buildPerlPackage { + # pname = "DBIx-SearchBuilder"; + # version = "1.77"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/DBIx-SearchBuilder-1.77.tar.gz"; + # hash = "sha256-O/il1cjF/cYK0vY/Y/c90fZJP/TYJYcoOj4iM36P4HA="; + # }; + # buildInputs = [ DBDSQLite ]; + # propagatedBuildInputs = [ CacheSimpleTimedExpiry ClassAccessor ClassReturnValue Clone DBIxDBSchema Want capitalization ]; + # meta = { + # description = "Encapsulate SQL queries and rows in simple perl objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBIxSimple = buildPerlPackage { + # pname = "DBIx-Simple"; + # version = "1.37"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JU/JUERD/DBIx-Simple-1.37.tar.gz"; + # hash = "sha256-RtMRqizgiQdAHFYRllhCbbsETFpA3nPZp7eb9QOQyuM="; + # }; + # propagatedBuildInputs = [ DBI ]; + # meta = { + # description = "Very complete easy-to-use OO interface to DBI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DBMDeep = buildPerlPackage { + # pname = "DBM-Deep"; + # version = "2.0017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/DBM-Deep-2.0017.tar.gz"; + # hash = "sha256-1yNFIFdVO72UXWMhXr/gqnepLsbg+jOw2spXrhuKTSQ="; + # }; + # buildInputs = [ TestDeep TestException TestPod TestPodCoverage TestWarn ]; + # meta = { + # description = "A pure perl multi-level hash/array DBM that supports transactions"; + # homepage = "https://github.com/robkinyon/dbm-deep"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DataBinary = buildPerlPackage { + # pname = "Data-Binary"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SN/SNKWATT/Data-Binary-0.01.tar.gz"; + # hash = "sha256-SCGi3hCscQj03LKEpxuHaYGwyx6mxe1q+xd78ufLjXM="; + # }; + # meta = { + # description = "Simple detection of binary versus text in strings"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # DataBuffer = buildPerlPackage { + # pname = "Data-Buffer"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BT/BTROTT/Data-Buffer-0.04.tar.gz"; + # hash = "sha256-Kz0Jt7zzifwRYgeyg77iUONI1EycY0YL7mfvq03SG7Q="; + # }; + # meta = { + # description = "Read/write buffer class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # DBIxIntrospector = buildPerlPackage { + # pname = "DBIx-Introspector"; + # version = "0.001005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/DBIx-Introspector-0.001005.tar.gz"; + # hash = "sha256-lqlNLMaQwfqP00ET47CEvypGmjI6l4AoWu+S3cOB5jo="; + # }; + + # propagatedBuildInputs = [ DBI Moo ]; + # buildInputs = [ DBDSQLite TestFatal TestRoo ]; + # meta = { + # description = "Detect what database you are connected to"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelCamelcadedb = buildPerlPackage { + # pname = "Devel-Camelcadedb"; + # version = "2023.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HU/HURRICUP/Devel-Camelcadedb-v2023.1.tar.gz"; + # hash = "sha256-z/jSTllF45RN6/ITmVprFVuR5YE0aRVrE9Ws819qXZ8="; + # }; + # propagatedBuildInputs = [ HashStoredIterator JSONXS PadWalker ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Perl side of the Perl debugger for IntelliJ IDEA and other JetBrains IDEs"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + DevelCycle = buildPerlPackage { + pname = "Devel-Cycle"; + version = "1.12"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LD/LDS/Devel-Cycle-1.12.tar.gz"; + hash = "sha256-/TNlxNiYsrK927eKRtUHoYzKhJCikBmVR9q38ec5C8I="; + }; + meta = { + description = "Find memory cycles in objects"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # DevelDeclare = buildPerlPackage { + # pname = "Devel-Declare"; + # version = "0.006022"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Devel-Declare-0.006022.tar.gz"; + # hash = "sha256-cvKco1ZGpZO+mDEf/dtyAzrh6KnYJUxiqiSL1iYOWW4="; + # }; + # buildInputs = [ ExtUtilsDepends TestRequires ]; + # propagatedBuildInputs = [ BHooksEndOfScope BHooksOPCheck SubName ]; + # meta = { + # description = "(DEPRECATED) Adding keywords to perl, in perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelFindPerl = buildPerlPackage { + # pname = "Devel-FindPerl"; + # version = "0.016"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Devel-FindPerl-0.016.tar.gz"; + # hash = "sha256-Q6K/L3h6PxuIEXkGMWKyqj58sET25eduxkZq6QqGETg="; + # }; + # meta = { + # description = "Find the path to your perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelGlobalDestruction = buildPerlPackage { + # pname = "Devel-GlobalDestruction"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Devel-GlobalDestruction-0.14.tar.gz"; + # hash = "sha256-NLil8pmRMRRo/mkTytq6df1dKws+47tB/ltT76uRVKs="; + # }; + # propagatedBuildInputs = [ SubExporterProgressive ]; + # meta = { + # description = "Provides function returning the equivalent of \${^GLOBAL_PHASE} eq 'DESTRUCT' for older perls"; + # homepage = "https://metacpan.org/release/Devel-GlobalDestruction"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelGlobalPhase = buildPerlPackage { + # pname = "Devel-GlobalPhase"; + # version = "0.003003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Devel-GlobalPhase-0.003003.tar.gz"; + # hash = "sha256-jaMCL3ynHf2/SqYGmJRNcgCsMUn0c32KnJG/Q4f/MvU="; + # }; + # meta = { + # description = "Detect perl's global phase on older perls"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelHide = buildPerlPackage { + # pname = "Devel-Hide"; + # version = "0.0015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/Devel-Hide-0.0015.tar.gz"; + # hash = "sha256-/I2+t/fXWnjtSWseDgXPyZxorKs6LpLP8VXKXw+l31g="; + # }; + # meta = { + # description = "Forces the unavailability of specified Perl modules (for testing)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelNYTProf = buildPerlPackage { + # pname = "Devel-NYTProf"; + # version = "6.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JK/JKEENAN/Devel-NYTProf-6.12.tar.gz"; + # hash = "sha256-qDtZheTalr24X1McFqtvPUkHGnM80JSqMPqF+2pLAsQ="; + # }; + # propagatedBuildInputs = [ FileWhich JSONMaybeXS ]; + # buildInputs = [ CaptureTiny TestDifferences ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/* + # ''; + # meta = { + # description = "Powerful fast feature-rich Perl source code profiler"; + # homepage = "https://code.google.com/p/perl-devel-nytprof"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelOverloadInfo = buildPerlPackage { + # pname = "Devel-OverloadInfo"; + # version = "0.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILMARI/Devel-OverloadInfo-0.007.tar.gz"; + # hash = "sha256-IaGEFjuQ+R8G/8f13guWg1ZUaum0AKnXXFc8lYwkYiI="; + # }; + # propagatedBuildInputs = [ MROCompat PackageStash SubIdentify ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Introspect overloaded operators"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelOverrideGlobalRequire = buildPerlPackage { + # pname = "Devel-OverrideGlobalRequire"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Devel-OverrideGlobalRequire-0.001.tar.gz"; + # hash = "sha256-B5GJLeOuKSr0qU44LyHbHuiCEIdQMYUebqgsNBB4Xvk="; + # }; + # meta = { + # homepage = "https://metacpan.org/release/Devel-OverrideGlobalRequire"; + # description = "Override CORE::GLOBAL::require safely"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelPartialDump = buildPerlPackage { + # pname = "Devel-PartialDump"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Devel-PartialDump-0.20.tar.gz"; + # hash = "sha256-rvD/PqWalpGWfCiFEY/2ZxVghJVwicQ4j0nbZG/T2Qc="; + # }; + # propagatedBuildInputs = [ ClassTiny SubExporter namespaceclean ]; + # buildInputs = [ TestSimple13 TestWarnings ]; + # meta = { + # description = "Partial dumping of data structures, optimized for argument printing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelStackTrace = buildPerlPackage { + # pname = "Devel-StackTrace"; + # version = "2.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Devel-StackTrace-2.04.tar.gz"; + # hash = "sha256-zTwD7VR9PULGH6WBTJgpYTk5LnlxwJLgmkMfLJ9daFU="; + # }; + # meta = { + # description = "An object representing a stack trace"; + # homepage = "https://metacpan.org/release/Devel-StackTrace"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # DevelSize = buildPerlPackage { + # pname = "Devel-Size"; + # version = "0.83"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NW/NWCLARK/Devel-Size-0.83.tar.gz"; + # hash = "sha256-dXpn4KpZrhA+pcoJLL7MAlZE69wyZzFoj/q2+II+9LM="; + # }; + # meta = { + # description = "Perl extension for finding the memory usage of Perl variables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelStackTraceAsHTML = buildPerlPackage { + # pname = "Devel-StackTrace-AsHTML"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Devel-StackTrace-AsHTML-0.15.tar.gz"; + # hash = "sha256-YoPb4hl+LyAAnMS0SZl3Qhac3ZUb/ETLxuYsKpYtMUc="; + # }; + # propagatedBuildInputs = [ DevelStackTrace ]; + # meta = { + # description = "Displays stack trace in HTML"; + # homepage = "https://github.com/miyagawa/Devel-StackTrace-AsHTML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DevelSymdump = buildPerlPackage { + # pname = "Devel-Symdump"; + # version = "2.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AN/ANDK/Devel-Symdump-2.18.tar.gz"; + # hash = "sha256-gm+BoQf1WSolFnZu1DvrR+EMyD7cnqSAkLAqNgQHdsA="; + # }; + # meta = { + # description = "Dump symbol names or the symbol table"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DigestCRC = buildPerlPackage { + # pname = "Digest-CRC"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OL/OLIMAUL/Digest-CRC-0.24.tar.gz"; + # hash = "sha256-ugIqBbGtvsc3EsRvIz2Eif4Tobn8QKH8zu2bUvkN78E="; + # }; + # meta = { + # description = "Module that calculates CRC sums of all sorts"; + # license = with lib.licenses; [ publicDomain ]; + # }; + # }; + + DigestHMAC = buildPerlPackage { + pname = "Digest-HMAC"; + version = "1.04"; + src = fetchurl { + url = "mirror://cpan/authors/id/A/AR/ARODLAND/Digest-HMAC-1.04.tar.gz"; + hash = "sha256-1ryBVqonXETXlLfBj0TNrEpYFAJFyVnmsZssODiwjtQ="; + }; + meta = { + description = "Keyed-Hashing for Message Authentication"; + homepage = "https://metacpan.org/release/Digest-HMAC"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # DigestJHash = buildPerlPackage { + # pname = "Digest-JHash"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Digest-JHash-0.10.tar.gz"; + # hash = "sha256-x0bPCoYaAECQJjzVTXco0MdZWgz5DLv9hAmzlu47AGM="; + # }; + # meta = { + # description = "Perl extension for 32 bit Jenkins Hashing Algorithm"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # DigestMD2 = buildPerlPackage { + # pname = "Digest-MD2"; + # version = "2.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/Digest-MD2-2.04.tar.gz"; + # hash = "sha256-0Kq/SDTCCsQRvqQnxKMItZpfyqMnZ571KUwdaKtx7tM="; + # }; + # meta = { + # description = "Perl interface to the MD2 Algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # DigestMD4 = buildPerlPackage { + # pname = "Digest-MD4"; + # version = "1.9"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKEM/DigestMD4/Digest-MD4-1.9.tar.gz"; + # hash = "sha256-ZlEQu6MkcPOY8xHNZGL9iXXXyDZ1/2dLwvbHtysMqqY="; + # }; + # meta = { + # description = "Perl interface to the MD4 Algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DigestMD5File = buildPerlPackage { + # pname = "Digest-MD5-File"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DM/DMUEY/Digest-MD5-File-0.08.tar.gz"; + # hash = "sha256-rbQ6VOMmJ7T35XyWQObrBtC7edjqVM0L157TVoj7Ehg="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "Perl extension for getting MD5 sums for files and urls"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DigestPerlMD5 = buildPerlPackage { + # pname = "Digest-Perl-MD5"; + # version = "1.9"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DELTA/Digest-Perl-MD5-1.9.tar.gz"; + # hash = "sha256-cQDLoXEPRfsOkH2LGnvYyu81xkrNMdfyJa/1r/7s2bE="; + # }; + # meta = { + # description = "Perl Implementation of Rivest's MD5 algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DigestSHA1 = buildPerlPackage { + # pname = "Digest-SHA1"; + # version = "2.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/Digest-SHA1-2.13.tar.gz"; + # hash = "sha256-aMHawhh0IfDrer9xRSoG8ZAYG4/Eso7e31uQKW+5Q8w="; + # }; + # meta = { + # description = "Perl interface to the SHA-1 algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DigestSHA3 = buildPerlPackage { + # pname = "Digest-SHA3"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSHELOR/Digest-SHA3-1.05.tar.gz"; + # hash = "sha256-rfG5B5sreBdV5XBId6FDCl8SmX6oIgX9KWbJzEZahSI="; + # }; + # meta = { + # description = "Perl extension for SHA-3"; + # homepage = "https://metacpan.org/release/Digest-SHA3"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # mainProgram = "sha3sum"; + # }; + # }; + + # DigestSRI = buildPerlPackage { + # pname = "Digest-SRI"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAUKEX/Digest-SRI-0.02.tar.gz"; + # hash = "sha256-VITN/m68OYwkZfeBx3w++1OKOULNSyDWiBjG//kHT8c="; + # }; + # meta = { + # description = "Calculate and verify Subresource Integrity hashes (SRI)"; + # homepage = "https://github.com/haukex/Digest-SRI"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # DirManifest = buildPerlModule { + # pname = "Dir-Manifest"; + # version = "0.6.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Dir-Manifest-0.6.1.tar.gz"; + # hash = "sha256-hP9yJoc9XoZW7Hc0TAg4wVOp8BW0a2Dh/oeYuykn5QU="; + # }; + # propagatedBuildInputs = [ Moo PathTiny ]; + # meta = { + # description = "Treat a directory and a manifest file as a hash/dictionary of keys to texts or blobs"; + # homepage = "https://metacpan.org/release/Dir-Manifest"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # DirSelf = buildPerlPackage { + # pname = "Dir-Self"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAUKE/Dir-Self-0.11.tar.gz"; + # hash = "sha256-4lGlGrx9m6PnCPc8KqII4J1HoMUo1iVHEPp4zI1ohbU="; + # }; + # meta = { + # description = "A __DIR__ constant for the directory your source file is in"; + # homepage = "https://github.com/mauke/Dir-Self"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DispatchClass = buildPerlPackage { + # pname = "Dispatch-Class"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAUKE/Dispatch-Class-0.02.tar.gz"; + # hash = "sha256-1020Oxr56L1G/8Fb/k3x5dgQxCzoWC6TdRDcKiyhZYI="; + # }; + # propagatedBuildInputs = [ ExporterTiny ]; + # meta = { + # description = "Dispatch on the type (class) of an argument"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistCheckConflicts = buildPerlPackage { + # pname = "Dist-CheckConflicts"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/Dist-CheckConflicts-0.11.tar.gz"; + # hash = "sha256-6oRLlobJTWZtnURDIddkSQss3i+YXEFltMLHdmXK7cQ="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ ModuleRuntime ]; + # meta = { + # description = "Declare version conflicts for your dist"; + # homepage = "https://metacpan.org/release/Dist-CheckConflicts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZilla = buildPerlPackage { + # pname = "Dist-Zilla"; + # version = "6.030"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Dist-Zilla-6.030.tar.gz"; + # hash = "sha256-xAa75oCelO23DKlDJMMBQz1sij375wsC3xLh3/LzsTA="; + # }; + # buildInputs = [ CPANMetaCheck TestDeep TestFailWarnings TestFatal TestFileShareDir ]; + # propagatedBuildInputs = [ AppCmd CPANUploader ConfigMVPReaderINI DateTime FileCopyRecursive FileFindRule FileShareDirInstall Filepushd LogDispatchouli MooseXLazyRequire MooseXSetOnce MooseXTypesPerl PathTiny PerlPrereqScanner SoftwareLicense TermEncoding TermUI YAMLTiny ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/dzil + # ''; + # doCheck = false; + # meta = { + # description = "Distribution builder; installer not included!"; + # homepage = "https://dzil.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "dzil"; + # }; + # }; + + # DistZillaPluginBundleTestingMania = buildPerlModule { + # pname = "Dist-Zilla-PluginBundle-TestingMania"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOHERTY/Dist-Zilla-PluginBundle-TestingMania-0.25.tar.gz"; + # hash = "sha256-XguywA8UD9ZNy9EvpdPJ4kS5NWgor0ZRmLYjBGnUWRw="; + # }; + # buildInputs = [ MooseAutobox TestCPANMeta TestPerlCritic TestVersion ]; + # propagatedBuildInputs = [ DistZillaPluginMojibakeTests DistZillaPluginTestCPANChanges DistZillaPluginTestCPANMetaJSON DistZillaPluginTestCompile DistZillaPluginTestDistManifest DistZillaPluginTestEOL DistZillaPluginTestKwalitee DistZillaPluginTestMinimumVersion DistZillaPluginTestNoTabs DistZillaPluginTestPerlCritic DistZillaPluginTestPodLinkCheck DistZillaPluginTestPortability DistZillaPluginTestSynopsis DistZillaPluginTestUnusedVars DistZillaPluginTestVersion PodCoverageTrustPod ]; + # doCheck = false; /* fails with 'open3: exec of .. perl .. failed: Argument list too long at .../TAP/Parser/Iterator/Process.pm line 165.' */ + # meta = { + # description = "Test your dist with every testing plugin conceivable"; + # homepage = "https://metacpan.org/release/Dist-Zilla-PluginBundle-TestingMania"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginCheckChangeLog = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-CheckChangeLog"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FA/FAYLAND/Dist-Zilla-Plugin-CheckChangeLog-0.05.tar.gz"; + # hash = "sha256-sLNNbXC1bxlE0DxfDcO49vJEdMgW0HtlehFsaSwuBSo="; + # }; + # propagatedBuildInputs = [ DistZilla ]; + # buildInputs = [ PathClass PodCoverage PodCoverageTrustPod PodMarkdown TestDeep TestException TestPod TestPodCoverage ]; + # meta = { + # description = "Dist::Zilla with Changes check"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginMojibakeTests = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-MojibakeTests"; + # version = "0.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYP/Dist-Zilla-Plugin-MojibakeTests-0.8.tar.gz"; + # hash = "sha256-8f/1R+okqPekg0Bqcu1sQFjXRtna6WNyVQLdugJas4A="; + # }; + # propagatedBuildInputs = [ DistZilla ]; + # buildInputs = [ TestMojibake ]; + # meta = { + # description = "Author tests for source encoding"; + # homepage = "https://github.com/creaktive/Dist-Zilla-Plugin-MojibakeTests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginPodWeaver = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-PodWeaver"; + # version = "4.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Dist-Zilla-Plugin-PodWeaver-4.010.tar.gz"; + # hash = "sha256-Zm1S1UXUjSpn8VN63HTPOMdkofmVHQtiNiP2IGDLYj4="; + # }; + # propagatedBuildInputs = [ DistZilla PodElementalPerlMunger PodWeaver ]; + # meta = { + # description = "Weave your Pod together from configuration and Dist::Zilla"; + # homepage = "https://github.com/rjbs/Dist-Zilla-Plugin-PodWeaver"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginReadmeAnyFromPod = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-ReadmeAnyFromPod"; + # version = "0.163250"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RT/RTHOMPSON/Dist-Zilla-Plugin-ReadmeAnyFromPod-0.163250.tar.gz"; + # hash = "sha256-1E8nmZIveLKnlh7YkSPhG913q/6FuiBA2CuArXLtE7w="; + # }; + # buildInputs = [ TestDeep TestDifferences TestException TestFatal TestMost TestRequires TestSharedFork TestWarn ]; + # propagatedBuildInputs = [ DistZillaRoleFileWatcher MooseXHasSugar PodMarkdownGithub ]; + # meta = { + # description = "Automatically convert POD to a README in any format for Dist::Zilla"; + # homepage = "https://github.com/DarwinAwardWinner/Dist-Zilla-Plugin-ReadmeAnyFromPod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginReadmeMarkdownFromPod = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-ReadmeMarkdownFromPod"; + # version = "0.141140"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RT/RTHOMPSON/Dist-Zilla-Plugin-ReadmeMarkdownFromPod-0.141140.tar.gz"; + # hash = "sha256-nKrXs2bqWRGa1zzdmdzdU/h3pRW9AWT8KLM5wBc5qAE="; + # }; + # buildInputs = [ TestDeep TestDifferences TestException TestMost TestWarn ]; + # propagatedBuildInputs = [ DistZillaPluginReadmeAnyFromPod ]; + # meta = { + # description = "Automatically convert POD to a README.mkdn for Dist::Zilla"; + # homepage = "https://github.com/DarwinAwardWinner/Dist-Zilla-Plugin-ReadmeMarkdownFromPod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestCPANChanges = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-Test-CPAN-Changes"; + # version = "0.012"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOHERTY/Dist-Zilla-Plugin-Test-CPAN-Changes-0.012.tar.gz"; + # hash = "sha256-IVs6XDxYyLqw6icTBEG72uxzfuzADwZwk39gi9v2SAY="; + # }; + # buildInputs = [ CPANChanges TestDeep ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Release tests for your changelog"; + # homepage = "https://metacpan.org/release/Dist-Zilla-Plugin-Test-CPAN-Changes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestCPANMetaJSON = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-CPAN-Meta-JSON"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOHERTY/Dist-Zilla-Plugin-Test-CPAN-Meta-JSON-0.004.tar.gz"; + # hash = "sha256-Clc+HVZAN05u5NVtT7lKPGfU511Ss93q5wz6ZFDhryI="; + # }; + # buildInputs = [ MooseAutobox TestCPANMetaJSON TestDeep ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Validate your CPAN META.json files"; + # homepage = "https://p3rl.org/Dist::Zilla::Plugin::Test::CPAN::Meta::JSON"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # DistZillaPluginTestCompile = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-Compile"; + # version = "2.058"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-Compile-2.058.tar.gz"; + # hash = "sha256-0M+T5SXxAuyg9/OWcSTS5Z0KIS9zjOVMHd2R3aJo2Io="; + # }; + # buildInputs = [ CPANMetaCheck ModuleBuildTiny TestDeep TestMinimumVersion TestWarnings ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Assert that your Perl files compile OK"; + # homepage = "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-Compile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestDistManifest = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-DistManifest"; + # version = "2.000006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-DistManifest-2.000006.tar.gz"; + # hash = "sha256-Wj2kW/yYzjhf7X3BZTp4kGEfC57xVsABOueFdPiWYH0="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestDistManifest TestOutput ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Author test that validates a package MANIFEST"; + # homepage = "https://github.com/jawnsy/Test-DistManifest"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestEOL = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-EOL"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-EOL-0.19.tar.gz"; + # hash = "sha256-orlZx6AszDLt1D7lhgmHVhPv1Ty8u9YDmeF/FUZ6Qzg="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestEOL TestWarnings ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Check the correct line endings in your project"; + # homepage = "https://github.com/karenetheridge/Test-EOL"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestKwalitee = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-Kwalitee"; + # version = "2.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-Kwalitee-2.12.tar.gz"; + # hash = "sha256-vdvPzHXo6y0tnIYRVS8AzcGwUfDwB5hiO4aS/1Awry8="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestFatal TestKwalitee ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Test the Kwalitee of a distribution before you release it"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestMinimumVersion = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-MinimumVersion"; + # version = "2.000010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-MinimumVersion-2.000010.tar.gz"; + # hash = "sha256-uLcfS2S2ifS2R6OofWqqrkWmiJLTXja6qXb2BXNjcPs="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestMinimumVersion TestOutput ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Release tests for minimum required versions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestNoTabs = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-NoTabs"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-NoTabs-0.15.tar.gz"; + # hash = "sha256-G2EMQpFpKbtwFDw2t55XF1JbDp3njj1GCal4ZCtk0KQ="; + # }; + # propagatedBuildInputs = [ DistZilla ]; + # buildInputs = [ ModuleBuildTiny TestDeep TestNoTabs TestRequires ]; + # meta = { + # description = "Check the presence of tabs in your project"; + # homepage = "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-NoTabs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestPerlCritic = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-Perl-Critic"; + # version = "3.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-Perl-Critic-3.001.tar.gz"; + # hash = "sha256-klC1nV3Brkxok7p4O9PwUTGxT/npGvtFVTFPVSaKOCU="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestPerlCritic ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Tests to check your code against best practices"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestPodLinkCheck = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-Test-Pod-LinkCheck"; + # version = "1.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RW/RWSTAUNER/Dist-Zilla-Plugin-Test-Pod-LinkCheck-1.004.tar.gz"; + # hash = "sha256-Ml0jbaCUA4jSqobsXBMmUWtK1Fre+Oek+Du5HV7hVJA="; + # }; + # # buildInputs = [ TestPodLinkCheck ]; + # propagatedBuildInputs = [ DistZilla ]; + # buildInputs = [ TestPodLinkCheck ]; + # meta = { + # description = "Add release tests for POD links"; + # homepage = "https://github.com/rwstauner/Dist-Zilla-Plugin-Test-Pod-LinkCheck"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestPortability = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-Portability"; + # version = "2.001001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-Portability-2.001001.tar.gz"; + # hash = "sha256-07kxVx4VoidI6BJwmq/aclEKdMAA/AaiyrWHVYEACyA="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestPortabilityFiles TestWarnings ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Author tests for portability"; + # homepage = "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-Portability"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestSynopsis = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-Test-Synopsis"; + # version = "2.000007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOHERTY/Dist-Zilla-Plugin-Test-Synopsis-2.000007.tar.gz"; + # hash = "sha256-59XiUwzYpbtarfPhZpplOqqW4yyte9a5yrprQlzqtWM="; + # }; + # buildInputs = [ TestDeep TestOutput TestSynopsis ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Release tests for synopses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestUnusedVars = buildPerlModule { + # pname = "Dist-Zilla-Plugin-Test-UnusedVars"; + # version = "2.001001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Plugin-Test-UnusedVars-2.001001.tar.gz"; + # hash = "sha256-df7W0NzCv0B/8nrJ4W7yFTRnFEuYbPovmPhpuqWNdkc="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestOutput TestVars ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Release tests for unused variables"; + # homepage = "https://metacpan.org/release/Dist-Zilla-Plugin-Test-UnusedVars"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # DistZillaPluginTestVersion = buildPerlPackage { + # pname = "Dist-Zilla-Plugin-Test-Version"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Dist-Zilla-Plugin-Test-Version-1.09.tar.gz"; + # hash = "sha256-ckBQhzG8G/bfrXcB7GVFChjvkkWlIasm69ass5qevhc="; + # }; + # buildInputs = [ Filechdir TestDeep TestEOL TestNoTabs TestScript TestVersion ]; + # propagatedBuildInputs = [ DistZilla ]; + # meta = { + # description = "Release Test::Version tests"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # DistZillaRoleFileWatcher = buildPerlModule { + # pname = "Dist-Zilla-Role-FileWatcher"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Dist-Zilla-Role-FileWatcher-0.006.tar.gz"; + # hash = "sha256-/jpEuVhtrxJ3/Lu69yFrAs4j77vWlPDfEbf3U0S+TpY="; + # }; + # propagatedBuildInputs = [ DistZilla SafeIsa ]; + # buildInputs = [ ModuleBuildTiny TestDeep TestFatal ]; + # meta = { + # description = "Receive notification when something changes a file's contents"; + # homepage = "https://github.com/karenetheridge/Dist-Zilla-Role-FileWatcher"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Dotenv = buildPerlPackage { + # pname = "Dotenv"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/Dotenv-0.002.tar.gz"; + # hash = "sha256-BMenzEURYX16cMTKQQ0QcH3EliSM2tICQK4kIiMhJFQ="; + # }; + # buildInputs = [ TestCPANMeta TestPod TestPodCoverage ]; + # propagatedBuildInputs = [ PathTiny ]; + # meta = { + # description = "Support for dotenv in Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Dumbbench = buildPerlPackage { + # pname = "Dumbbench"; + # version = "0.503"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Dumbbench-0.503.tar.gz"; + # hash = "sha256-0BYBmoGDE+cERk8oDPZB72Dodx0HeRtZuZ4XoeyAH6k="; + # }; + # propagatedBuildInputs = [ CaptureTiny ClassXSAccessor DevelCheckOS NumberWithError StatisticsCaseResampling ]; + # meta = { + # description = "More reliable benchmarking with the least amount of thinking"; + # homepage = "https://github.com/briandfoy/dumbbench"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "dumbbench"; + # }; + # }; + + # EmailAbstract = buildPerlPackage { + # pname = "Email-Abstract"; + # version = "3.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Abstract-3.010.tar.gz"; + # hash = "sha256-jBL2i1l0yvyZ10lCq+/IWXGTA1qv0nYxKOaqr8pLftY="; + # }; + # propagatedBuildInputs = [ EmailSimple MROCompat ModulePluggable ]; + # meta = { + # description = "Unified interface to mail representations"; + # homepage = "https://github.com/rjbs/Email-Abstract"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailAddress = buildPerlPackage { + # pname = "Email-Address"; + # version = "1.913"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Address-1.913.tar.gz"; + # hash = "sha256-avtUH232tTXM92QtNhrhjXqVo/k6zhvFNz9kwkEMpa8="; + # }; + # meta = { + # description = "RFC 2822 Address Parsing and Creation"; + # homepage = "https://github.com/rjbs/Email-Address"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailAddressList = buildPerlPackage { + # pname = "Email-Address-List"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Email-Address-List-0.06.tar.gz"; + # hash = "sha256-MFuUx3gBHO5w2fIVFNkumF+p3Mu4TGR5jwwfCyTrhw4="; + # }; + # buildInputs = [ JSON ]; + # propagatedBuildInputs = [ EmailAddress ]; + # meta = { + # description = "RFC close address list parsing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailAddressXS = buildPerlPackage { + # pname = "Email-Address-XS"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PA/PALI/Email-Address-XS-1.05.tar.gz"; + # hash = "sha256-FRC38Q1nIBA3zVDSLJ1rJu7KVe3tpM20a7yiflmk6hY="; + # }; + # meta = { + # description = "Parse and format RFC 5322 email addresses and groups"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailDateFormat = buildPerlPackage { + # pname = "Email-Date-Format"; + # version = "1.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Date-Format-1.008.tar.gz"; + # hash = "sha256-Qyt8g/+IdJrxKAA/UlfFc67BpGNBjbkO0ihDy7wli08="; + # }; + # meta = { + # description = "Produce RFC 2822 date strings"; + # homepage = "https://github.com/rjbs/Email-Date-Format"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailReply = buildPerlPackage { + # pname = "Email-Reply"; + # version = "1.204"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Reply-1.204.tar.gz"; + # hash = "sha256-uk/YCsUBfW0TLgNYx4aw7NHHrcvu5cGfs9opZHkaVvA="; + # }; + # propagatedBuildInputs = [ EmailAbstract EmailAddress EmailMIME ]; + # meta = { + # description = "Reply to an email message"; + # homepage = "https://github.com/Perl-Email-Project/Email-Reply"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailMessageID = buildPerlPackage { + # pname = "Email-MessageID"; + # version = "1.408"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-MessageID-1.408.tar.gz"; + # hash = "sha256-Hz1bT/Cxx7OemsfDGPs3rc0LrJVWA2VGSU0U8G3FZDw="; + # }; + # meta = { + # description = "Generate world unique message-ids"; + # homepage = "https://github.com/rjbs/Email-MessageID"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailMIME = buildPerlPackage { + # pname = "Email-MIME"; + # version = "1.953"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-MIME-1.953.tar.gz"; + # hash = "sha256-mPsGeFBpmiJLq8NI8c7+MNdExg2okC56XOnYt+c99zU="; + # }; + # propagatedBuildInputs = [ EmailAddressXS EmailMIMEContentType EmailMIMEEncodings EmailMessageID EmailSimple MIMETypes ModuleRuntime ]; + # meta = { + # description = "Easy MIME message handling"; + # homepage = "https://github.com/rjbs/Email-MIME"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailMIMEAttachmentStripper = buildPerlPackage { + # pname = "Email-MIME-Attachment-Stripper"; + # version = "1.317"; + # buildInputs = [ CaptureTiny ]; + # propagatedBuildInputs = [ EmailAbstract EmailMIME ]; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-MIME-Attachment-Stripper-1.317.tar.gz"; + # hash = "sha256-3LmLCdw+j3V+w4gqQjRUgQi7LRLjz635WibO84Gp54k="; + # }; + # meta = { + # description = "Strip the attachments from an email"; + # homepage = "https://github.com/rjbs/Email-MIME-Attachment-Stripper"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailMIMEContentType = buildPerlPackage { + # pname = "Email-MIME-ContentType"; + # version = "1.028"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-MIME-ContentType-1.028.tar.gz"; + # hash = "sha256-55UCRkM/ftbD5P1N8iJ+DyNBE3w8qxmJAY/DcPWBRcQ="; + # }; + # propagatedBuildInputs = [ TextUnidecode ]; + # meta = { + # description = "Parse and build a MIME Content-Type or Content-Disposition Header"; + # homepage = "https://github.com/rjbs/Email-MIME-ContentType"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailMIMEEncodings = buildPerlPackage { + # pname = "Email-MIME-Encodings"; + # version = "1.317"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-MIME-Encodings-1.317.tar.gz"; + # hash = "sha256-SppBZxqdFQTE2iQb5BmpUD+jSGJiUm7bgeyp4uvqC68="; + # }; + # buildInputs = [ CaptureTiny ]; + # meta = { + # description = "A unified interface to MIME encoding and decoding"; + # homepage = "https://github.com/rjbs/Email-MIME-Encodings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailSend = buildPerlPackage { + # pname = "Email-Send"; + # version = "2.201"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Send-2.201.tar.gz"; + # hash = "sha256-S77JM1WNfMm4FSutht0xPeJ3ohqJtOqD2E5hWH6V28Y="; + # }; + # propagatedBuildInputs = [ EmailAbstract EmailAddress ReturnValue ]; + # buildInputs = [ MIMETools MailTools ]; + # meta = { + # description = "Simply Sending Email"; + # homepage = "https://github.com/rjbs/Email-Send"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailOutlookMessage = buildPerlModule { + # pname = "Email-Outlook-Message"; + # version = "0.921"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MV/MVZ/Email-Outlook-Message-0.921.tar.gz"; + # hash = "sha256-+0q+6hTNpRweYLwhHPlSG7uq50uEEYym1Y8KciNoA4g="; + # }; + # propagatedBuildInputs = [ EmailMIME EmailSender IOAll IOString OLEStorage_Lite ]; + # preCheck = "rm t/internals.t t/plain_jpeg_attached.t"; # these tests expect EmailMIME version 1.946 and fail with 1.949 (the output difference in benign) + # meta = { + # homepage = "https://www.matijs.net/software/msgconv/"; + # description = "A .MSG to mbox converter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ peterhoeg ]; + # mainProgram = "msgconvert"; + # }; + # }; + + # EmailSender = buildPerlPackage { + # pname = "Email-Sender"; + # version = "2.600"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Sender-2.600.tar.gz"; + # hash = "sha256-7MZ10DDXnZpPsGRWfqiFxmsXw4Yjea0w+CBaKBzY7ik="; + # }; + # buildInputs = [ CaptureTiny ]; + # propagatedBuildInputs = [ EmailAbstract EmailAddressXS EmailSimple ModuleRuntime Moo MooXTypesMooseLike SubExporter Throwable TryTiny ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postPatch = '' + # patchShebangs --build util + # ''; + # preCheck = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang util/sendmail + # ''; + # meta = { + # description = "A library for sending email"; + # homepage = "https://github.com/rjbs/Email-Sender"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailSimple = buildPerlPackage { + # pname = "Email-Simple"; + # version = "2.218"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Simple-2.218.tar.gz"; + # hash = "sha256-Lc4daP3pnVPbnKQ+IRtpsWm6Lvrs+HpVyzOpM2BHyW0="; + # }; + # propagatedBuildInputs = [ EmailDateFormat ]; + # meta = { + # description = "Simple parsing of RFC2822 message format and headers"; + # homepage = "https://github.com/rjbs/Email-Simple"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailStuffer = buildPerlPackage { + # pname = "Email-Stuffer"; + # version = "0.020"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Stuffer-0.020.tar.gz"; + # hash = "sha256-Ch77fy3t05BSsSb3GMotO1hFpBI6OTkv2d+gx25gV8c="; + # }; + # buildInputs = [ Moo TestFatal ]; + # propagatedBuildInputs = [ EmailMIME EmailSender ModuleRuntime ParamsUtil ]; + # meta = { + # description = "A more casual approach to creating and sending Email:: emails"; + # homepage = "https://github.com/rjbs/Email-Stuffer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # EmailValid = buildPerlPackage { + # pname = "Email-Valid"; + # version = "1.203"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Email-Valid-1.203.tar.gz"; + # hash = "sha256-ICG/ux4sJ55evYRoDllvlzRNQphQsjIme3b0kDdSK5M="; + # }; + # propagatedBuildInputs = [ IOCaptureOutput MailTools NetDNS NetDomainTLD ]; + # doCheck = false; + # meta = { + # description = "Check validity of Internet email addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EmailValidLoose = buildPerlPackage { + # pname = "Email-Valid-Loose"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Email-Valid-Loose-0.05.tar.gz"; + # hash = "sha256-5xjnbt3uJAJRyZnhOcjL5vLMgBktpa+HXL0S+oq5Olk="; + # }; + # propagatedBuildInputs = [ EmailValid ]; + # meta = { + # description = "Email::Valid which allows dot before at mark"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Encode = buildPerlPackage { + # pname = "Encode"; + # version = "3.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANKOGAI/Encode-3.19.tar.gz"; + # hash = "sha256-kWP4SO72nk1MyIODl/CGH9nqft4AERfb2WlPjZUFLvU="; + # }; + # meta = { + # description = "Character encodings in Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "piconv"; + # }; + # }; + + # EncodeBase32GMP = buildPerlPackage { + # pname = "Encode-Base32-GMP"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JW/JWANG/Encode-Base32-GMP-0.02.tar.gz"; + # hash = "sha256-RUIG+n2C5V4DJ0aYcyNBtgcVDwDo4q7FjzUyagMIMtw="; + # }; + # buildInputs = [ TestBase ]; + # propagatedBuildInputs = [ MathGMPz ]; + # meta = { + # description = "High speed Base32 encoding using GMP with BigInt and MD5 support"; + # homepage = "https://metacpan.org/release/Encode-Base32-GMP"; + # license = with lib.licenses; [ mit ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # EncodeDetect = buildPerlModule { + # pname = "Encode-Detect"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JG/JGMYERS/Encode-Detect-1.01.tar.gz"; + # hash = "sha256-g02JOqfbbOPxWK+9DkMtbtFaJ24JQNsKdL4T/ZxLu/E="; + # }; + # nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; + # meta = { + # description = "An Encode::Encoding subclass that detects the encoding of data"; + # license = with lib.licenses; [ mpl11 gpl2Plus lgpl2Plus ]; # taken from fedora + # }; + # }; + + + # EncodeEUCJPASCII = buildPerlPackage { + # pname = "Encode-EUCJPASCII"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEZUMI/Encode-EUCJPASCII-0.03.tar.gz"; + # hash = "sha256-+ZjTTVX9nILPkQeGoESNHt+mC/aOLCMGckymfGKd6GE="; + # }; + # outputs = [ "out" ]; + # meta = { + # description = "EucJP-ascii - An eucJP-open mapping"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EncodeHanExtra = buildPerlPackage { + # pname = "Encode-HanExtra"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AU/AUDREYT/Encode-HanExtra-0.23.tar.gz"; + # hash = "sha256-H9SwbK2nCFgAOvFT+UyGOzuV8uPQO6GNBFGoHVHbRDo="; + # }; + # meta = { + # description = "Extra sets of Chinese encodings"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # EncodeIMAPUTF7 = buildPerlPackage { + # pname = "Encode-IMAPUTF7"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMAKHOLM/Encode-IMAPUTF7-1.05.tar.gz"; + # hash = "sha256-RwMF3cN0g8/o08FtE3cKKAEfYAv1V6y4w+B3OZl8N+E="; + # }; + # nativeCheckInputs = [ TestNoWarnings ]; + # meta = { + # description = "IMAP modified UTF-7 encoding"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EncodeJIS2K = buildPerlPackage { + # pname = "Encode-JIS2K"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANKOGAI/Encode-JIS2K-0.03.tar.gz"; + # hash = "sha256-HshNcts53rTa1vypWs/MIQM/RaJNNHwg+aGmlolsNcw="; + # }; + # outputs = [ "out" ]; + # meta = { + # description = "JIS X 0212 (aka JIS 2000) Encodings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + EncodeLocale = buildPerlPackage { + pname = "Encode-Locale"; + version = "1.05"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GA/GAAS/Encode-Locale-1.05.tar.gz"; + hash = "sha256-F2+gJ3H1QqTvsdvCpMko6PQ5G/QHhHO9YEDY8RrbDsE="; + }; + preCheck = if stdenv.isCygwin then '' + sed -i"" -e "s@plan tests => 13@plan tests => 10@" t/env.t + sed -i"" -e "s@ok(env(\"\\\x@#ok(env(\"\\\x@" t/env.t + sed -i"" -e "s@ok(\$ENV{\"\\\x@#ok(\$ENV{\"\\\x@" t/env.t + '' else null; + meta = { + description = "Determine the locale encoding"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # EncodeNewlines = buildPerlPackage { + # pname = "Encode-Newlines"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Encode-Newlines-0.05.tar.gz"; + # hash = "sha256-NLMfysjI/cghubNDSoLXEzIT73TM/yVf4UioavloN74="; + # }; + # meta = { + # description = "Normalize line ending sequences"; + # homepage = "https://github.com/neilb/Encode-Newlines"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EncodePunycode = buildPerlPackage { + # pname = "Encode-Punycode"; + # version = "1.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFAERBER/Encode-Punycode-1.002.tar.gz"; + # hash = "sha256-yjrO7NuAtdRaoQ4c3o/sTpC0+MkYnHUE3YZY8HH3cZQ="; + # }; + # buildInputs = [ TestNoWarnings ]; + # propagatedBuildInputs = [ NetIDNEncode ]; + # meta = { + # description = "Encode plugin for Punycode (RFC 3492)"; + # homepage = "https://search.cpan.org/dist/Encode-Punycode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # enum = buildPerlPackage { + # pname = "enum"; + # version = "1.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/enum-1.12.tar.gz"; + # hash = "sha256-aaeokc04iO2LAsXpmh9In5KmLsNRwLx4lP1719FEfqk="; + # }; + # meta = { + # description = "C style enumerated types and bitmask flags in Perl"; + # homepage = "https://github.com/neilb/enum"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Env = buildPerlPackage { + # pname = "Env"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FL/FLORA/Env-1.04.tar.gz"; + # hash = "sha256-2Uo9QS3yRq/cMaIZnL2K6RUWej9GhPe3AUzhIAJR67A="; + # }; + # meta = { + # description = "Perl module that imports environment variables as scalars or arrays"; + # homepage = "https://search.cpan.org/dist/Env"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EnvPath = buildPerlPackage { + # pname = "Env-Path"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DS/DSB/Env-Path-0.19.tar.gz"; + # hash = "sha256-JEvwk3mIMqfYQdnuW0sOa0iZlu72NUHlBQkao0qQFeI="; + # }; + # meta = { + # description = "Advanced operations on path variables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "envpath"; + # }; + # }; + + # EnvSanctify = buildPerlPackage { + # pname = "Env-Sanctify"; + # version = "1.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Env-Sanctify-1.12.tar.gz"; + # hash = "sha256-IOO1ZhwmVHSmnyiZR46ye5RkklWGu2tvtmYSnlgoMl8="; + # }; + # meta = { + # description = "Lexically scoped sanctification of %ENV"; + # homepage = "https://github.com/bingos/env-sanctify"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ENVUtil = buildPerlPackage { + # pname = "ENV-Util"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GARU/ENV-Util-0.03.tar.gz"; + # hash = "sha256-B1574ehSxD6wiGYvr978FS9O9WyEPB4F2QDaGQb3P60="; + # }; + # meta = { + # description = "Parse prefixed environment variables and dotnev (.env) files into Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Error = buildPerlModule { + # pname = "Error"; + # version = "0.17029"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Error-0.17029.tar.gz"; + # hash = "sha256-GiP3kTAyrtbUtoMhNzo4mcpmWQ9HJzkaCR7BnJW/etw="; + # }; + # meta = { + # description = "Error/exception handling in an OO-ish way"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EV = buildPerlPackage { + # pname = "EV"; + # version = "4.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/EV-4.34.tar.gz"; + # hash = "sha256-EhFoPc57Z3H0q3EMwVNxK913umFXoTKU0LtzSR/QZWA="; + # }; + # buildInputs = [ CanaryStability ]; + # propagatedBuildInputs = [ commonsense ]; + # meta = { + # description = "Perl interface to libev, a high performance full-featured event loop"; + # license = with lib.licenses; [ gpl1Plus ]; + # }; + # }; + + # EvalClosure = buildPerlPackage { + # pname = "Eval-Closure"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/Eval-Closure-0.14.tar.gz"; + # hash = "sha256-6glE8vXsmNiVvvbVA+bko3b+pjg6a8ZMdnDUb/IhjK0="; + # }; + # buildInputs = [ TestFatal TestRequires ]; + # meta = { + # description = "Safely and cleanly create closures via string eval"; + # homepage = "https://metacpan.org/release/Eval-Closure"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # EvalSafe = buildPerlPackage rec { + # pname = "Eval-Safe"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATHIAS/Eval-Safe/Eval-Safe-${version}.tar.gz"; + # hash = "sha256-VaUsIz4troYRP58Zs09hftz8hBb5vs5nEme9GBGxIRE="; + # }; + # outputs = [ "out" ]; + # meta = with lib; { + # description = "Simplified safe evaluation of Perl code"; + # homepage = "https://github.com/mkende/perl-eval-safe"; + # license = licenses.mit; + # maintainers = with maintainers; [ figsoda ]; + # }; + # }; + + # ExcelWriterXLSX = buildPerlPackage { + # pname = "Excel-Writer-XLSX"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMCNAMARA/Excel-Writer-XLSX-1.11.tar.gz"; + # hash = "sha256-yzMA0jEZxpiGTvC3PBmnLLpxi/wG7QBzWaUxP5YcwqA="; + # }; + # propagatedBuildInputs = [ ArchiveZip ]; + # meta = { + # description = "Create a new file in the Excel 2007+ XLSX format"; + # homepage = "https://jmcnamara.github.com/excel-writer-xlsx"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "extract_vba"; + # }; + # }; + + # ExceptionBase = buildPerlModule { + # pname = "Exception-Base"; + # version = "0.2501"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Exception-Base-0.2501.tar.gz"; + # hash = "sha256-VyPdePSsC00mKgXqRq9mPqANgJay6cCkNRXCEHYOHnU="; + # }; + # buildInputs = [ TestUnitLite ]; + # patches = [ + # ./perl-modules/Exception-Base-remove-smartmatch-when-5.38.0.patch + # ]; + # meta = { + # description = "Lightweight exceptions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExceptionClass = buildPerlPackage { + # pname = "Exception-Class"; + # version = "1.45"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Exception-Class-1.45.tar.gz"; + # hash = "sha256-VIKnfvAnyh+fOeH0jFWDVulUk2/I+73ubIEcUScBskk="; + # }; + # propagatedBuildInputs = [ ClassDataInheritable DevelStackTrace ]; + # meta = { + # description = "An Exception Object Class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExceptionDied = buildPerlModule { + # pname = "Exception-Died"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Exception-Died-0.06.tar.gz"; + # hash = "sha256-NcRAvCr9TVfiQaDbG05o2dUpXfLbjXidObX0UQWXirU="; + # }; + # buildInputs = [ TestAssert TestUnitLite ]; + # propagatedBuildInputs = [ ExceptionBase constantboolean ]; + # meta = { + # description = "Convert simple die into real exception object"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExceptionWarning = buildPerlModule { + # pname = "Exception-Warning"; + # version = "0.0401"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Exception-Warning-0.0401.tar.gz"; + # hash = "sha256-ezacps61se3ytdX4cOl0x8k+kwNnw5o5AL/2CZce06g="; + # }; + # buildInputs = [ TestAssert TestUnitLite ]; + # propagatedBuildInputs = [ ExceptionBase ]; + # meta = { + # description = "Convert simple warn into real exception object"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExporterDeclare = buildPerlModule { + # pname = "Exporter-Declare"; + # version = "0.114"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Exporter-Declare-0.114.tar.gz"; + # hash = "sha256-S9cNbKdvb2un5MYY1KyTuFk6WPEjPMvhixD18gTx1OQ="; + # }; + # buildInputs = [ FennecLite TestException ]; + # propagatedBuildInputs = [ MetaBuilder aliased ]; + # meta = { + # description = "Exporting done right"; + # homepage = "http://open-exodus.net/projects/Exporter-Declare"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExporterLite = buildPerlPackage { + # pname = "Exporter-Lite"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Exporter-Lite-0.09.tar.gz"; + # hash = "sha256-edixT9UBOSLGPoUPFb9RBZ8lAkBFNetmkO8jYSwqGY0="; + # }; + # meta = { + # description = "Lightweight exporting of functions and variables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ExporterTiny = buildPerlPackage { + pname = "Exporter-Tiny"; + version = "1.006002"; + src = fetchurl { + url = "mirror://cpan/authors/id/T/TO/TOBYINK/Exporter-Tiny-1.006002.tar.gz"; + hash = "sha256-byleLL/7HbwVvbna3DQWccHgzSvfLTErF1Jic8MiY40="; + }; + meta = { + description = "An exporter with the features of Sub::Exporter but only core dependencies"; + homepage = "https://metacpan.org/release/Exporter-Tiny"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # Expect = buildPerlPackage { + # pname = "Expect"; + # version = "1.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JACOBY/Expect-1.35.tar.gz"; + # hash = "sha256-CdknYUId7NSVhTEDN5FlqZ779FLHIPMCd2As8jZ5/QY="; + # }; + # propagatedBuildInputs = [ IOTty ]; + # meta = { + # description = "Automate interactions with command line programs that expose a text terminal interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExpectSimple = buildPerlPackage { + # pname = "Expect-Simple"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DJ/DJERIUS/Expect-Simple-0.04.tar.gz"; + # hash = "sha256-r4O5IYXmQmlZE/8Tjv6Bl1LoCFd1mZber8qrJwCtXbU="; + # }; + # propagatedBuildInputs = [ Expect ]; + # meta = { + # description = "Wrapper around the Expect module"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsCChecker = buildPerlModule { + # pname = "ExtUtils-CChecker"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/ExtUtils-CChecker-0.11.tar.gz"; + # hash = "sha256-EXc2Z343/GEfW3Y3TX+VLhlw64Dh9q1RUNUW565TG/U="; + # }; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Configure-time utilities for using C headers,"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ExtUtilsConfig = buildPerlPackage { + pname = "ExtUtils-Config"; + version = "0.008"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEONT/ExtUtils-Config-0.008.tar.gz"; + hash = "sha256-rlEE9jRlDc6KebftE/tZ1no5whOmd2z9qj7nSeYvGow="; + }; + meta = { + description = "A wrapper for perl's configuration"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ExtUtilsConstant = buildPerlPackage { + # pname = "ExtUtils-Constant"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NW/NWCLARK/ExtUtils-Constant-0.25.tar.gz"; + # hash = "sha256-aTPQ6WO2IoHvdWEGjmrsrIxKwrR2srugmrC5D7rJ11c="; + # }; + # patches = [ + # ./perl-modules/ExtUtils-Constant-fix-indirect-method-call-in-test.patch + # ]; + # meta = { + # description = "Generate XS code to import C header constants"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsCppGuess = buildPerlPackage { + # pname = "ExtUtils-CppGuess"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/ExtUtils-CppGuess-0.26.tar.gz"; + # hash = "sha256-yLNiuGAXKkB2rO4AQ49SuGRk8sUAcCz891J4Ef+aaD4="; + # }; + # doCheck = !stdenv.isDarwin; + # nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; + # propagatedBuildInputs = [ CaptureTiny ]; + # buildInputs = [ ModuleBuild ]; + # meta = { + # description = "Guess C++ compiler and flags"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsDepends = buildPerlPackage { + # pname = "ExtUtils-Depends"; + # version = "0.8001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/ExtUtils-Depends-0.8001.tar.gz"; + # hash = "sha256-ZzxDh+eJbBohYJnB+7P6qndj1/X5WhpWpgoqKQbBMcU="; + # }; + # meta = { + # description = "Easily build XS extensions that depend on XS extensions"; + # license = with lib.licenses; [ artistic1 gpl1Plus artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsF77 = buildPerlPackage { + # pname = "ExtUtils-F77"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/ExtUtils-F77-1.26.tar.gz"; + # hash = "sha256-q90dPuxMpPyuXxUrQLyqhi48gG4H5KqRI3V/aqSLndY="; + # }; + # buildInputs = [ pkgs.gfortran ]; + # propagatedBuildInputs = [ FileWhich ]; + # meta = { + # description = "A simple interface to F77 libs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ExtUtilsHelpers = buildPerlPackage { + pname = "ExtUtils-Helpers"; + version = "0.026"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEONT/ExtUtils-Helpers-0.026.tar.gz"; + hash = "sha256-3pAbZ5CkVXz07JCBSeA1eDsSW/EV65ZA/rG8HCTDNBY="; + }; + meta = { + description = "Various portability utilities for module builders"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ExtUtilsInstall = buildPerlPackage { + # pname = "ExtUtils-Install"; + # version = "2.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/ExtUtils-Install-2.22.tar.gz"; + # hash = "sha256-M3Jbr77Tgp1hPkxlHC4a0SBnDH0qxc8F+DdX/Jddb/I="; + # }; + # meta = { + # description = "Install files from here to there"; + # homepage = "https://metacpan.org/release/ExtUtils-Install"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ExtUtilsInstallPaths = buildPerlPackage { + pname = "ExtUtils-InstallPaths"; + version = "0.012"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEONT/ExtUtils-InstallPaths-0.012.tar.gz"; + hash = "sha256-hHNeMDe6sf3/o8JQhWetQSp4XJFZnbPBJZOlCh3UNO0="; + }; + propagatedBuildInputs = [ ExtUtilsConfig ]; + meta = { + description = "Build.PL install path logic made easy"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ExtUtilsLibBuilder = buildPerlModule { + # pname = "ExtUtils-LibBuilder"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AM/AMBS/ExtUtils-LibBuilder-0.08.tar.gz"; + # hash = "sha256-xRFx4G3lMDnwvKHZemRx7DeUH/Weij0csXDr3SVztdI="; + # }; + # perlPreHook = "export LD=$CC"; + # meta = { + # description = "A tool to build C libraries"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsMakeMaker = buildPerlPackage { + # pname = "ExtUtils-MakeMaker"; + # version = "7.70"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.70.tar.gz"; + # hash = "sha256-8Qi9RkINLwDSQoJfhlsPaIUQhJJJJPkiYdaExJ4+enQ="; + # }; + # meta = { + # description = "Create a module Makefile"; + # homepage = "https://metacpan.org/release/ExtUtils-MakeMaker"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "instmodsh"; + # }; + # }; + + # ExtUtilsMakeMakerCPANfile = buildPerlPackage { + # pname = "ExtUtils-MakeMaker-CPANfile"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/ExtUtils-MakeMaker-CPANfile-0.09.tar.gz"; + # hash = "sha256-LAd2B9SwoQhWkHTf926BaGWQYq2jpq94swzKDUD44nU="; + # }; + # propagatedBuildInputs = [ ModuleCPANfile ]; + # meta = { + # description = "Cpanfile support for EUMM"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsPkgConfig = buildPerlPackage { + # pname = "ExtUtils-PkgConfig"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/ExtUtils-PkgConfig-1.16.tar.gz"; + # hash = "sha256-u+rO2ZXX2NEM/FGjpaZtpBzrK8BP7cq1DhDmMA6AHG4="; + # }; + # nativeBuildInputs = [ buildPackages.pkg-config ]; + # propagatedBuildInputs = [ pkgs.pkg-config ]; + # postPatch = '' + # # no pkg-config binary when cross-compiling so the check fails + # substituteInPlace Makefile.PL \ + # --replace "pkg-config" "$PKG_CONFIG" + # ''; + # doCheck = false; # expects test_glib-2.0.pc in PKG_CONFIG_PATH + # meta = { + # description = "Simplistic interface to pkg-config"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # # From CPAN[1]: + # # This module exists merely as a compatibility wrapper around + # # ExtUtils::Typemaps. In a nutshell, ExtUtils::Typemap was renamed to + # # ExtUtils::Typemaps because the Typemap directory in lib/ could collide with + # # the typemap file on case-insensitive file systems. + # # + # # The ExtUtils::Typemaps module is part of the ExtUtils::ParseXS distribution + # # and ships with the standard library of perl starting with perl version + # # 5.16. + # # + # # [1] https://metacpan.org/pod/release/SMUELLER/ExtUtils-Typemap-1.00/lib/ExtUtils/Typemap.pm: + # ExtUtilsTypemap = buildPerlPackage { + # pname = "ExtUtils-Typemap"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/ExtUtils-Typemap-1.00.tar.gz"; + # hash = "sha256-sbAVdy27BouToPb/oC9dlIIjZeYBisXtK8U8pmkHH8c="; + # }; + # meta = { + # description = "Read/Write/Modify Perl/XS typemap files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsTypemapsDefault = buildPerlModule { + # pname = "ExtUtils-Typemaps-Default"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/ExtUtils-Typemaps-Default-1.05.tar.gz"; + # hash = "sha256-Pfr1g36/3AB4lb/KhMPC521Ymn0zZADo37MkPYGCFd4="; + # }; + # meta = { + # description = "A set of useful typemaps"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsXSBuilder = buildPerlPackage { + # pname = "ExtUtils-XSBuilder"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRICHTER/ExtUtils-XSBuilder-0.28.tar.gz"; + # hash = "sha256-jM7ThuPVRMXsLes67QVbcuvPwuqabIB9qHxCRScv6Ao="; + # }; + # propagatedBuildInputs = [ ParseRecDescent TieIxHash ]; + # meta = { + # description = "Automatic Perl XS glue code generation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ExtUtilsXSpp = buildPerlModule { + # pname = "ExtUtils-XSpp"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/ExtUtils-XSpp-0.18.tar.gz"; + # hash = "sha256-kXatZGcp470nz3q/EUvt00JL/xumEYXPx9VPOpIjqP8="; + # }; + # buildInputs = [ TestBase TestDifferences ]; + # meta = { + # description = "XS for C++"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "xspp"; + # }; + # }; + + # FatalException = buildPerlModule { + # pname = "Fatal-Exception"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Fatal-Exception-0.05.tar.gz"; + # hash = "sha256-KAldIT+zKknJwjKmhEg375Rdua1unmHkULTfTQjj7k8="; + # }; + # buildInputs = [ ExceptionWarning TestAssert TestUnitLite ]; + # propagatedBuildInputs = [ ExceptionDied ]; + # meta = { + # description = "Thrown when core function has a fatal error"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + FCGI = buildPerlPackage { + pname = "FCGI"; + version = "0.82"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/ET/ETHER/FCGI-0.82.tar.gz"; + hash = "sha256-TH1g4m2iwH8Fik40UCHpJQUnOzPJVCIVl34IRhHwns8="; + }; + buildInputs = [ FCGIClient ]; + postPatch = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + sed -i '/use IO::File/d' Makefile.PL + ''; + meta = { + description = "Fast CGI module"; + license = with lib.licenses; [ oml ]; + }; + }; + + FCGIClient = buildPerlModule { + pname = "FCGI-Client"; + version = "0.09"; + src = fetchurl { + url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/FCGI-Client-0.09.tar.gz"; + hash = "sha256-1TfLCc5aqz9Eemu0QV5GzAbv4BYRzVYom1WCvbRiIeg="; + }; + propagatedBuildInputs = [ Moo TypeTiny ]; + buildInputs = [ ModuleBuildTiny ]; + meta = { + description = "Client library for fastcgi protocol"; + homepage = "https://github.com/tokuhirom/p5-fcgi-client"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + FCGIProcManager = buildPerlPackage { + pname = "FCGI-ProcManager"; + version = "0.28"; + src = fetchurl { + url = "mirror://cpan/authors/id/A/AR/ARODLAND/FCGI-ProcManager-0.28.tar.gz"; + hash = "sha256-4clYwEJCehdeBR4ACPICXo7IBhPTx3UFl7+OUpsEQg4="; + }; + meta = { + description = "A perl-based FastCGI process manager"; + license = with lib.licenses; [ gpl2Plus ]; + }; + }; + + # FFIC = buildPerlPackage { + # pname = "FFI-C"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-C-0.15.tar.gz"; + # hash = "sha256-63BgfmZzvMsY3yf0zuRZ+23EGODak+aSzcNVX+QNL04="; + # }; + # buildInputs = [ CaptureTiny PathTiny Test2Suite ]; + # propagatedBuildInputs = [ ClassInspector FFIPlatypus FFIPlatypusTypeEnum RefUtil SubIdentify SubInstall ]; + # meta = { + # homepage = "https://metacpan.org/pod/FFI::C"; + # description = "C data types for FFI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # FFICheckLib = buildPerlPackage { + # pname = "FFI-CheckLib"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-CheckLib-0.31.tar.gz"; + # hash = "sha256-BNiF/Dd9RIluXqHE7DEPl5uwTy8YZYp+ek1Qn36Au4A="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ FileWhich ]; + # meta = { + # description = "Check that a library is available for FFI"; + # homepage = "https://metacpan.org/pod/FFI::CheckLib"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FeatureCompatTry = buildPerlModule { + # pname = "Feature-Compat-Try"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Feature-Compat-Try-0.05.tar.gz"; + # hash = "sha256-WaHHFzysMNsTHF8T+jhA9xhYju+bV5NS/+FWtVBxbXw="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ SyntaxKeywordTry ]; + # meta = { + # description = "Make C syntax available"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FFICStat = buildPerlPackage { + # pname = "FFI-C-Stat"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-C-Stat-0.03.tar.gz"; + # hash = "sha256-YOjveCyLs0cFXJ49ov1BTzX2EP5P77eNBzncyiQoQx4="; + # }; + # buildInputs = [ Filechdir PathTiny Test2Suite TestScript ]; + # propagatedBuildInputs = [ FFIPlatypus RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/FFI::C::Stat"; + # description = "Object-oriented FFI interface to native stat and lstat"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # FFIPlatypus = buildPerlPackage { + # pname = "FFI-Platypus"; + # version = "2.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-Platypus-2.08.tar.gz"; + # hash = "sha256-EbOrEU7ZY1YxzYWzjSKXhuFEv5Sjr5rAnD17s0M2uSQ="; + # }; + # buildInputs = [ AlienFFI Test2Suite ]; + # propagatedBuildInputs = [ CaptureTiny FFICheckLib ]; + # meta = { + # homepage = "https://pl.atypus.org"; + # description = "Write Perl bindings to non-Perl libraries with FFI. No XS required"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # FFIPlatypusTypePtrObject = buildPerlPackage { + # pname = "FFI-Platypus-Type-PtrObject"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-Platypus-Type-PtrObject-0.03.tar.gz"; + # hash = "sha256-4elJB++QtANgqabAPSlaEwR9T2ybVqyvHfK1TRcwf3Q="; + # }; + # buildInputs = [ Test2Suite Test2ToolsFFI ]; + # propagatedBuildInputs = [ FFIPlatypus RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/FFI::Platypus::Type::PtrObject"; + # description = "Platypus custom type for an object wrapped around an opaque pointer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # FFIPlatypusTypeEnum = buildPerlPackage { + # pname = "FFI-Platypus-Type-Enum"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/FFI-Platypus-Type-Enum-0.06.tar.gz"; + # hash = "sha256-yVSmBPfWkpYk+pQT2NDh2DtL2XfQVifKznPtU6lcd98="; + # }; + # buildInputs = [ FFIPlatypus Test2Suite ]; + # propagatedBuildInputs = [ RefUtil ]; + # meta = { + # homepage = "https://metacpan.org/pod/FFI::Platypus::Type::Enum"; + # description = "Custom platypus type for dealing with C enumerated types"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # FennecLite = buildPerlModule { + # pname = "Fennec-Lite"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Fennec-Lite-0.004.tar.gz"; + # hash = "sha256-3OKOOTJ2LC/5KqUtkEBcBuiY6By3sWTMrolmrnfx3Ks="; + # }; + # meta = { + # description = "Minimalist Fennec, the commonly used bits"; + # homepage = "http://open-exodus.net/projects/Fennec-Lite"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileChangeNotify = buildPerlPackage { + # pname = "File-ChangeNotify"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/File-ChangeNotify-0.31.tar.gz"; + # hash = "sha256-GSvbHOdiZsamlKjpYtA5463uuCm2rB4j9QV/K1Bjkr0="; + # }; + # buildInputs = [ Test2Suite TestRequires TestWithoutModule ]; + # propagatedBuildInputs = [ ModulePluggable Moo TypeTiny namespaceautoclean ]; + # meta = { + # description = "Watch for changes to files, cross-platform style"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # Filechdir = buildPerlPackage { + # pname = "File-chdir"; + # version = "0.1011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/File-chdir-0.1011.tar.gz"; + # hash = "sha256-Mev5Et9I1daB3vdLmIDXix86ykNRoO0f41cLjgOvbHk="; + # }; + # meta = { + # description = "A more sensible way to change directories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileBaseDir = buildPerlPackage { + # version = "0.09"; + # pname = "File-BaseDir"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/File-BaseDir-0.09.tar.gz"; + # hash = "sha256-bab3KBVirI8R7xo69q7bUcQRgrYPHxIs7QB579kpZ9k="; + # }; + # propagatedBuildInputs = [ IPCSystemSimple ]; + # nativeCheckInputs = [ FileWhich ]; + # meta = { + # description = "Use the Freedesktop.org base directory specification"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileBOM = buildPerlModule { + # pname = "File-BOM"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTLAW/File-BOM-0.18.tar.gz"; + # hash = "sha256-KO3EP8sRjhG8RYya6InVbTiMHZvCmZewCx3/2Fc4I6M="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ Readonly ]; + # meta = { + # description = "Utilities for handling Byte Order Marks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileCheckTree = buildPerlPackage { + # pname = "File-CheckTree"; + # version = "4.42"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/File-CheckTree-4.42.tar.gz"; + # hash = "sha256-ZvtBf4/4peW36iVgYVbnDiBIYcWfqMODGSW03T8VX4o="; + # }; + # meta = { + # description = "Run many filetest checks on a tree"; + # homepage = "https://search.cpan.org/dist/File-CheckTree"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Filechmod = buildPerlPackage { + # pname = "File-chmod"; + # version = "0.42"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XE/XENO/File-chmod-0.42.tar.gz"; + # hash = "sha256-bK+v/2i8hCFRaLVe3g0ZHctX+aMgG1HWHtsoWKJAd5U="; + # }; + # meta = { + # description = "Implements symbolic and ls chmod modes"; + # homepage = "https://metacpan.org/dist/File-chmod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FilechmodRecursive = buildPerlPackage { + # pname = "File-chmod-Recursive"; + # version = "1.0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MITHUN/File-chmod-Recursive-v1.0.3.tar.gz"; + # hash = "sha256-k0jKXFuI3q3MSDuTme98Lg/CUE+QWNtl88PFPEETmqc="; + # }; + # propagatedBuildInputs = [ Filechmod ]; + # meta = { + # description = "Run chmod recursively against directories"; + # homepage = "https://github.com/mithun/perl-file-chmod-recursive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileCopyRecursive = buildPerlPackage { + # pname = "File-Copy-Recursive"; + # version = "0.45"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DM/DMUEY/File-Copy-Recursive-0.45.tar.gz"; + # hash = "sha256-05cc94qDReOAQrIIu3s5y2lQgDhq9in0oE/9ZUnfEVc="; + # }; + # buildInputs = [ PathTiny TestDeep TestFatal TestFile TestWarnings ]; + # meta = { + # description = "Perl extension for recursively copying files and directories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileCopyRecursiveReduced = buildPerlPackage { + # pname = "File-Copy-Recursive-Reduced"; + # version = "0.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JK/JKEENAN/File-Copy-Recursive-Reduced-0.007.tar.gz"; + # hash = "sha256-07WFIuaYA6kUN+KcCZ63Bug3Px7vBRik3DZp3T383Cc="; + # }; + # buildInputs = [ CaptureTiny PathTiny ]; + # meta = { + # description = "Recursive copying of files and directories within Perl 5 toolchain"; + # homepage = "http://thenceforward.net/perl/modules/File-Copy-Recursive-Reduced"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileCountLines = buildPerlPackage { + # pname = "File-CountLines"; + # version = "0.0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MORITZ/File-CountLines-v0.0.3.tar.gz"; + # hash = "sha256-z9l8znyWE+TladR4dKK1cE8b6eztLwc5yHByVpQ4KmI="; + # }; + # meta = { + # description = "Efficiently count the number of line breaks in a file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileDesktopEntry = buildPerlPackage { + # version = "0.22"; + # pname = "File-DesktopEntry"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MICHIELB/File-DesktopEntry-0.22.tar.gz"; + # hash = "sha256-FpwB49ri9il2e+wanxzb1uxtcT0VAeCyeG5N0SNWNbg="; + # }; + # propagatedBuildInputs = [ FileBaseDir URI ]; + # meta = { + # description = "Object to handle .desktop files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileDirList = buildPerlPackage { + # version = "0.05"; + # pname = "File-DirList"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TP/TPABA/File-DirList/File-DirList-0.05.tar.gz"; + # sha256 = "sha256-mTt9dmLlV5hEih7azLmr0oHSvSO+fquZ9Wm44pYtO8M="; + # }; + # preCheck = '' + # export HOME="$TMPDIR" + # ''; + # meta = { + # description = "Provide a sorted list of directory content"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileFindIterator = buildPerlPackage { + # pname = "File-Find-Iterator"; + # version = "0.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TE/TEXMEC/File-Find-Iterator-0.4.tar.gz"; + # hash = "sha256-orh6uXVqLlu2dK29OZN2Y+0gwoxxa/WhCVo8pE1Uqyw="; + # }; + # propagatedBuildInputs = [ ClassIterator ]; + # meta = { + # description = "Iterator interface for search files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileFindObject = buildPerlModule { + # pname = "File-Find-Object"; + # version = "0.3.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/File-Find-Object-0.3.8.tar.gz"; + # hash = "sha256-TlJRRt6GTt+8kJsIRGKe7O0AY7YdQYuXLu8D+ES7NRQ="; + # }; + # buildInputs = [ FileTreeCreate TestFile ]; + # propagatedBuildInputs = [ ClassXSAccessor ]; + # meta = { + # description = "An object oriented File::Find replacement"; + # homepage = "https://metacpan.org/release/File-Find-Object"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # FileFindObjectRule = buildPerlModule { + # pname = "File-Find-Object-Rule"; + # version = "0.0313"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/File-Find-Object-Rule-0.0313.tar.gz"; + # hash = "sha256-gZQPKZ1khySPvzDY8ft99sajSz35RApWIbE1yONPz/I="; + # }; + # buildInputs = [ FileTreeCreate ]; + # propagatedBuildInputs = [ ClassXSAccessor FileFindObject NumberCompare TextGlob ]; + # # restore t/sample-data which is corrupted by patching shebangs + # preCheck = '' + # tar xf $src */t/sample-data --strip-components=1 + # ''; + # meta = { + # description = "Alternative interface to File::Find::Object"; + # homepage = "https://www.shlomifish.org/open-source/projects/File-Find-Object"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "findorule"; + # }; + # }; + + # FileFindRule = buildPerlPackage { + # pname = "File-Find-Rule"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/File-Find-Rule-0.34.tar.gz"; + # hash = "sha256-fm8WzDPrHyn/Jb7lHVE/S4qElHu/oY7bLTzECi1kyv4="; + # }; + # propagatedBuildInputs = [ NumberCompare TextGlob ]; + # meta = { + # description = "File::Find::Rule is a friendlier interface to File::Find"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "findrule"; + # }; + # }; + + # FileFindRulePerl = buildPerlPackage { + # pname = "File-Find-Rule-Perl"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/File-Find-Rule-Perl-1.16.tar.gz"; + # hash = "sha256-rhiGBQ2cohIjwHPihwq9yA3DDj9VKJoRw32jggqDIf8="; + # }; + # propagatedBuildInputs = [ FileFindRule ParamsUtil ]; + # meta = { + # description = "Common rules for searching for Perl things"; + # homepage = "https://github.com/karenetheridge/File-Find-Rule-Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileFinder = buildPerlPackage { + # pname = "File-Finder"; + # version = "0.53"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ME/MERLYN/File-Finder-0.53.tar.gz"; + # hash = "sha256-LsvBmsZ6nmNchyqAeo0+qv9bq8BU8VoZHUfN/F8XanQ="; + # }; + # propagatedBuildInputs = [ TextGlob ]; + # meta = { + # description = "Nice wrapper for File::Find ala find(1)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileFnMatch = buildPerlPackage { + # pname = "File-FnMatch"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MJ/MJP/File-FnMatch-0.02.tar.gz"; + # hash = "sha256-liRUuOhr6osTK/ivNXV9DGqPXVmQFb1qXWjLeuep6RY="; + # }; + # meta = { + # description = "Simple filename and pathname matching"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # FileFcntlLock = buildPerlPackage { + # pname = "File-FcntlLock"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JT/JTT/File-FcntlLock-0.22.tar.gz"; + # hash = "sha256-mpq7Lv/5Orc3QaEo0/cA5SUnNUbBXQTnxRxwSrCdvN8="; + # }; + # meta = { + # description = "File locking with fcntl(2)"; + # license = with lib.licenses; [ artistic1 ]; + # maintainers = with maintainers; [ das_j ]; + # }; + # }; + + # FileGrep = buildPerlPackage { + # pname = "File-Grep"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MN/MNEYLON/File-Grep-0.02.tar.gz"; + # hash = "sha256-Ri4VJ062J4UhQH6jAtnupyUs1EyrI4KHH33oM9X4VjI="; + # }; + # meta = { + # description = "Find matches to a pattern in a series of files and related functions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # FileHandleUnget = buildPerlPackage { + # pname = "FileHandle-Unget"; + # version = "0.1634"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCOPPIT/FileHandle-Unget-0.1634.tar.gz"; + # hash = "sha256-OA80rTzl6exmHUxGi7M5IjHBYjF9QXLfN4FGtCqrF4U="; + # }; + # buildInputs = [ FileSlurper TestCompile UNIVERSALrequire URI ]; + # meta = { + # description = "FileHandle which supports multi-byte unget"; + # homepage = "https://github.com/coppit/filehandle-unget"; + # license = with lib.licenses; [ gpl2Only ]; + # maintainers = with maintainers; [ romildo ]; + # }; + # }; + + # FileHomeDir = buildPerlPackage { + # pname = "File-HomeDir"; + # version = "1.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/File-HomeDir-1.006.tar.gz"; + # hash = "sha256-WTc3xi3w9tq11BIuC0R2QXlFu2Jiwz7twAlmXvFUiFI="; + # }; + # propagatedBuildInputs = [ FileWhich ]; + # preCheck = "export HOME=$TMPDIR"; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Find your home and other directories on any platform"; + # homepage = "https://metacpan.org/release/File-HomeDir"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileKeePass = buildPerlPackage { + # pname = "File-KeePass"; + # version = "2.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RH/RHANDOM/File-KeePass-2.03.tar.gz"; + # hash = "sha256-wwxogCelL/T1jNadbY7zVHKnzxBtTOlOtzp5a6fH/6c="; + # }; + # propagatedBuildInputs = [ CryptRijndael ]; + # meta = { + # description = "Interface to KeePass V1 and V2 database files"; + # license = with lib.licenses; [ gpl2Only gpl3Only ]; + # }; + # }; + + # Filelchown = buildPerlModule { + # pname = "File-lchown"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/File-lchown-0.02.tar.gz"; + # hash = "sha256-oC+/KFQGqKTZOZKE8DLy1VxWl1FUwuFnS9EJg3uAluw="; + # }; + # buildInputs = [ ExtUtilsCChecker ]; + # perlPreHook = lib.optionalString (stdenv.isi686 || stdenv.isDarwin) "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Modify attributes of symlinks without dereferencing them"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileLibMagic = buildPerlPackage { + # pname = "File-LibMagic"; + # version = "1.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/File-LibMagic-1.23.tar.gz"; + # hash = "sha256-Uuax3Hyy2HpM30OboUXguejPKMwmpIo8+Zd8g0Y5Z+4="; + # }; + # buildInputs = [ pkgs.file ConfigAutoConf TestFatal ]; + # makeMakerFlags = [ "--lib=${pkgs.file}/lib" ]; + # preCheck = '' + # substituteInPlace t/oo-api.t \ + # --replace "/usr/share/file/magic.mgc" "${pkgs.file}/share/misc/magic.mgc" + # ''; + # meta = { + # description = "Determine MIME types of data or files using libmagic"; + # homepage = "https://metacpan.org/release/File::LibMagic"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.FileLibMagic.x86_64-darwin + # }; + # }; + + FileListing = buildPerlPackage { + pname = "File-Listing"; + version = "6.16"; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PL/PLICEASE/File-Listing-6.16.tar.gz"; + hash = "sha256-GJs6E/wKG6QSudnsWQHp5eREzHRrnwFW1DmTcNM2VcY="; + }; + propagatedBuildInputs = [ HTTPDate ]; + meta = { + description = "Parse directory listing"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # FileLoadLines = buildPerlPackage { + # pname = "File-LoadLines"; + # version = "1.021"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/File-LoadLines-1.021.tar.gz"; + # hash = "sha256-mOQS98aSYRNPNLh4W926sxVrj0UlU9u1tWytaDuG//A="; + # }; + # buildInputs = [ TestException ]; + # meta = { + # description = "Load lines from file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileMimeInfo = buildPerlPackage { + # pname = "File-MimeInfo"; + # version = "0.33"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MICHIELB/File-MimeInfo-0.33.tar.gz"; + # hash = "sha256-9r6ms4kGITJeycJ5KvruiOlIoK4dEIcvpyxxELPhscQ="; + # }; + # doCheck = false; # Failed test 'desktop file is the right one' + # buildInputs = [ FileBaseDir FileDesktopEntry EncodeLocale ]; + # meta = { + # description = "Determine file type from the file name"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileMMagic = buildPerlPackage { + # pname = "File-MMagic"; + # version = "1.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KN/KNOK/File-MMagic-1.30.tar.gz"; + # hash = "sha256-zwwbHrKXBcAtl8KRNkgAnAvkLOk+wks2xpa/LU9evX4="; + # }; + # meta = { + # description = "Guess file type from contents"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # FileMap = buildPerlModule { + # pname = "File-Map"; + # version = "0.71"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/File-Map-0.71.tar.gz"; + # hash = "sha256-yOJpM4BOhw1KupJiO3iGrIs8dgyY+/zTvcSyMFxGR1k="; + # }; + # perlPreHook = "export LD=$CC"; + # propagatedBuildInputs = [ PerlIOLayers SubExporterProgressive ]; + # buildInputs = [ TestFatal TestWarnings ]; + # meta = { + # description = "Memory mapping made simple and safe"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileModified = buildPerlPackage { + # pname = "File-Modified"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/File-Modified-0.10.tar.gz"; + # hash = "sha256-a1CxqrbsaZigF/ZAPCc1s7weHPRhh70TTX623z/EUUQ="; + # }; + # meta = { + # description = "Checks intelligently if files have changed"; + # homepage = "https://github.com/neilbowers/File-Modified"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileNext = buildPerlPackage { + # pname = "File-Next"; + # version = "1.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/File-Next-1.18.tar.gz"; + # hash = "sha256-+QDLOVBetuFoqcpRoQtz8bveGRS5I6CezXLZwC5uwu8="; + # }; + # meta = { + # description = "File-finding iterator"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # FileNFSLock = buildPerlPackage { + # pname = "File-NFSLock"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBB/File-NFSLock-1.29.tar.gz"; + # hash = "sha256-YdQVmbSBFk7fm4vsq77y0j9iKpcn9sGDZekrV4LU+jc="; + # }; + # meta = { + # description = "Perl module to do NFS (or not) locking"; + # license = with lib.licenses; [ artistic1 gpl1Only ]; + # }; + # }; + + # FilePath = buildPerlPackage { + # pname = "File-Path"; + # version = "2.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JK/JKEENAN/File-Path-2.18.tar.gz"; + # hash = "sha256-mA8KF+2zU99G6c17NX+fWSnN4PgMRf16Bs9+DovWrd0="; + # }; + # meta = { + # description = "Create or remove directory trees"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FilePid = buildPerlPackage { + # pname = "File-Pid"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CW/CWEST/File-Pid-1.01.tar.gz"; + # hash = "sha256-uv7uj9yW6wYwagxYu9tyCbbeRfhQ51/caxbbV24F5CI="; + # }; + # patches = [(fetchpatch { + # name = "missing-pidfile.patch"; + # url = "https://sources.debian.org/data/main/libf/libfile-pid-perl/1.01-2/debian/patches/missing-pidfile.patch"; + # hash = "sha256-VBsIYyCnjcZLYQ2Uq2MKPK3kF2wiMKvnq0m727DoavM="; + # })]; + # propagatedBuildInputs = [ ClassAccessor ]; + # meta = { + # description = "Pid File Manipulation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # Filepushd = buildPerlPackage { + # pname = "File-pushd"; + # version = "1.016"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/File-pushd-1.016.tar.gz"; + # hash = "sha256-1zp/CUQpg7CYJg3z33qDKl9mB3OjE8onP6i1ZmX5fNw="; + # }; + # meta = { + # description = "Change directory temporarily for a limited scope"; + # homepage = "https://github.com/dagolden/File-pushd"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # FileReadBackwards = buildPerlPackage { + # pname = "File-ReadBackwards"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/File-ReadBackwards-1.06.tar.gz"; + # hash = "sha256-MrKgVJOJqviIde8D1+u//y1ZeeyoW3yBL2tLsQ0QL2I="; + # }; + # meta = { + # description = "Read a file backwards by lines"; + # homepage = "https://metacpan.org/pod/File::ReadBackwards"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileRemove = buildPerlModule { + # pname = "File-Remove"; + # version = "1.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/File-Remove-1.61.tar.gz"; + # hash = "sha256-/YV/WFkI/FA0YbnkizyFlOZTV2a8FL6xfJC6WNXcSXU="; + # }; + # meta = { + # description = "Remove files and directories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileShare = buildPerlPackage { + # pname = "File-Share"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/File-Share-0.27.tar.gz"; + # hash = "sha256-1uj0tV69OOC7ReRDkuP6J9wf3harxdH/U+FX4ZpXVb4="; + # }; + # propagatedBuildInputs = [ FileShareDir Readonly ]; + # meta = { + # description = "Extend File::ShareDir to Local Libraries"; + # homepage = "https://github.com/ingydotnet/file-share-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + FileShareDir = buildPerlPackage { + pname = "File-ShareDir"; + version = "1.118"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RE/REHSACK/File-ShareDir-1.118.tar.gz"; + hash = "sha256-O7KiC6Nd+VjcCk8jBvwF2QPYuMTePIvu/OF3OdKByVg="; + }; + propagatedBuildInputs = [ ClassInspector ]; + buildInputs = [ FileShareDirInstall ]; + meta = { + description = "Locate per-dist and per-module shared files"; + homepage = "https://metacpan.org/release/File-ShareDir"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # FileShareDirDist = buildPerlPackage { + # pname = "File-ShareDir-Dist"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/File-ShareDir-Dist-0.07.tar.gz"; + # hash = "sha256-jX/l0O4iNR9B75Wtwi29VsMf+iqbLBmEMA6S/36f6G0="; + # }; + # meta = { + # homepage = "https://metacpan.org/pod/File::ShareDir::Dist"; + # description = "Locate per-dist shared files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + FileShareDirInstall = buildPerlPackage { + pname = "File-ShareDir-Install"; + version = "0.14"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/ET/ETHER/File-ShareDir-Install-0.14.tar.gz"; + hash = "sha256-j5UzsZjy1KmlKIy8fSJPdnmtBaeoVzdFWZeJQovFrqA="; + }; + meta = { + description = "Install shared files"; + homepage = "https://github.com/Perl-Toolchain-Gang/File-ShareDir-Install"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # FilesysDf = buildPerlPackage { + # pname = "Filesys-Df"; + # version = "0.92"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IG/IGUTHRIE/Filesys-Df-0.92.tar.gz"; + # hash = "sha256-/onLtCfg4F8c2Xwt1tOGasayG8eoVzTt4Vm9w1R5VSo="; + # }; + # meta = { + # description = "Perl extension for filesystem disk space information."; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FilesysNotifySimple = buildPerlPackage { + # pname = "Filesys-Notify-Simple"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Filesys-Notify-Simple-0.14.tar.gz"; + # hash = "sha256-H9pxLUul4YaBWe019vjvv66dQ11jdvVgbVM7ywgFVaQ="; + # }; + # buildInputs = [ TestSharedFork ]; + # meta = { + # description = "Simple and dumb file system watcher"; + # homepage = "https://github.com/miyagawa/Filesys-Notify-Simple"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FilesysDiskUsage = buildPerlPackage { + # pname = "Filesys-DiskUsage"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/Filesys-DiskUsage-0.13.tar.gz"; + # hash = "sha256-/T5SxvYkEnGigTSNHUPEQVTC9hoyVD20aqnhVpLRtxM="; + # }; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Estimate file space usage (similar to `du`)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "fdu"; + # }; + # }; + + # FileSlurp = buildPerlPackage { + # pname = "File-Slurp"; + # version = "9999.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CAPOEIRAB/File-Slurp-9999.32.tar.gz"; + # hash = "sha256-TDwhmSqdQr46ed10o8g9J9OAVyadZVCaL1VeoPsrxbA="; + # }; + # meta = { + # description = "Simple and Efficient Reading/Writing/Modifying of Complete Files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileSlurper = buildPerlPackage { + # pname = "File-Slurper"; + # version = "0.014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/File-Slurper-0.014.tar.gz"; + # hash = "sha256-1aNkhzOYiMPNdY5kgWDuHXDrQVPKy6/1eEbbzvs0Sww="; + # }; + # buildInputs = [ TestWarnings ]; + # meta = { + # description = "A simple, sane and efficient module to slurp a file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileSlurpTiny = buildPerlPackage { + # pname = "File-Slurp-Tiny"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/File-Slurp-Tiny-0.004.tar.gz"; + # hash = "sha256-RSmVvuq/DpI+Zf3GJ6cl27EsnhDADYAYwW0QumJ1fx4="; + # }; + # meta = { + # description = "A simple, sane and efficient file slurper [DISCOURAGED]"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileTail = buildPerlPackage { + # pname = "File-Tail"; + # version = "1.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MG/MGRABNAR/File-Tail-1.3.tar.gz"; + # hash = "sha256-JtCfgYNuQ+rkACjVKD/lYg/m/mJ4vz6462AMSOw0r8c="; + # }; + # meta = { + # description = "Perl extension for reading from continously updated files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # FileTouch = buildPerlPackage { + # pname = "File-Touch"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/File-Touch-0.12.tar.gz"; + # hash = "sha256-KgTcQk30jpjFRVbGBFyrAmpJ43N6qUohz0l3YbDy5Zw="; + # }; + # meta = { + # description = "Update file access and modification times, optionally creating files if needed"; + # homepage = "https://github.com/neilb/File-Touch"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # FileTreeCreate = buildPerlModule { + # pname = "File-TreeCreate"; + # version = "0.0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/File-TreeCreate-0.0.1.tar.gz"; + # hash = "sha256-V2hvEIQ76Br/rRha5BMXkLoMSvNtIQTW+2kSZSgFUmc="; + # }; + # meta = { + # homepage = "http://metacpan.org/release/File-TreeCreate"; + # description = "Recursively create a directory tree"; + # license = lib.licenses.mit; + # }; + # }; + + # FileType = buildPerlModule { + # pname = "File-Type"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMISON/File-Type-0.22.tar.gz"; + # hash = "sha256-01zZX+9X/U39iDH2LDTilNfEuGH8kJ4Ct2Bxc51S00E="; + # }; + # meta = { + # description = "Uses magic numbers (typically at the start of a file) to determine the MIME type of that file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileUtil = buildPerlModule { + # pname = "File-Util"; + # version = "4.201720"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOMMY/File-Util-4.201720.tar.gz"; + # hash = "sha256-1EkQIYUNXFy9cCx+R0SFgHmEHS+pPxwtCd3Jp4Y2CN8="; + # }; + # buildInputs = [ TestNoWarnings ]; + # meta = { + # description = "Easy, versatile, portable file handling"; + # homepage = "https://github.com/tommybutler/file-util/wiki"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileUtilTempdir = buildPerlPackage { + # pname = "File-Util-Tempdir"; + # version = "0.034"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/File-Util-Tempdir-0.034.tar.gz"; + # hash = "sha256-0R3izl5vrT8GFLymR0ykScNa7TUSXVsyJ+ZpvBdv3Bw="; + # }; + # buildInputs = [ Perlosnames TestException ]; + # meta = { + # description = "Cross-platform way to get system-wide & user private temporary directory"; + # homepage = "https://metacpan.org/release/File-Util-Tempdir"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # FileWhich = buildPerlPackage { + # pname = "File-Which"; + # version = "1.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/File-Which-1.27.tar.gz"; + # hash = "sha256-MgHxpg4/FkhAguYEXIloQiYfw0Xen7LmIP0qLHrzqTo="; + # }; + # meta = { + # description = "Perl implementation of the which utility as an API"; + # homepage = "https://metacpan.org/pod/File::Which"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FileZglob = buildPerlPackage { + # pname = "File-Zglob"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/File-Zglob-0.11.tar.gz"; + # hash = "sha256-HLHt3iCsCU7wA3lLr+8sdiQWnPhALHNn2bdGD2wOZps="; + # }; + # meta = { + # description = "Extended globs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Filter = buildPerlPackage { + # pname = "Filter"; + # version = "1.64"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Filter-1.64.tar.gz"; + # hash = "sha256-E+f7fh0yZZjjZgEDzxl0vun2kKxbQ7M58sAi8rX87yw="; + # }; + # meta = { + # description = "Source Filters"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FinanceQuote = buildPerlPackage rec { + # pname = "Finance-Quote"; + # version = "1.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPSCHUCK/Finance-Quote-${version}.tar.gz"; + # hash = "sha256-Qw7p3yLcqjLrYwpNf7V6KFQvn+UHsmawo39nVLTzWgg="; + # }; + # buildInputs = [ DateManip DateRange DateSimple DateTime DateTimeFormatISO8601 StringUtil TestKwalitee TestPerlCritic TestPod TestPodCoverage ]; + # propagatedBuildInputs = [ DateManip DateTimeFormatStrptime Encode HTMLTableExtract HTMLTokeParserSimple HTMLTree HTMLTreeBuilderXPath HTTPCookies HTTPCookieJar JSON IOCompress IOString LWPProtocolHttps Readonly StringUtil SpreadsheetXLSX TextTemplate TryTiny WebScraper XMLLibXML libwwwperl ]; + # meta = { + # homepage = "https://finance-quote.sourceforge.net/"; + # changelog = "https://github.com/finance-quote/finance-quote/releases/tag/v${version}"; + # description = "Get stock and mutual fund quotes from various exchanges"; + # license = with lib.licenses; [ gpl2Plus ]; + # maintainers = with lib.maintainers; [ nevivurn ]; + # }; + # }; + + # FindLib = buildPerlPackage { + # pname = "Find-Lib"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YANNK/Find-Lib-1.04.tar.gz"; + # hash = "sha256-HXOSHjBh4bBG/kJo4tBf/VpMV2Jmbi5HI/g6rMFG6FE="; + # }; + # meta = { + # description = "Helper to smartly find libs to use in the filesystem tree"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FontAFM = buildPerlPackage { + # pname = "Font-AFM"; + # version = "1.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/Font-AFM-1.20.tar.gz"; + # hash = "sha256-MmcRZtoyWWoPa6rNDBIzglpgrK8lgF15yBo/GNYIi8E="; + # }; + # meta = { + # description = "Interface to Adobe Font Metrics files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FontTTF = buildPerlPackage { + # pname = "Font-TTF"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BH/BHALLISSY/Font-TTF-1.06.tar.gz"; + # hash = "sha256-S2l9REJZdZ6gLSxELJv/5f/hTJIUCEoB90NpOpRMwpM="; + # }; + # buildInputs = [ IOString ]; + # meta = { + # description = "TTF font support for Perl"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ForksSuper = buildPerlPackage { + # pname = "Forks-Super"; + # version = "0.97"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MOB/Forks-Super-0.97.tar.gz"; + # hash = "sha256-M9tDV+Es1vQPKlijq5b+tP/9JedC29SL75B9skLQKk4="; + # }; + # doCheck = false; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Extensions and convenience methods to manage background processes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FormValidatorSimple = buildPerlPackage { + # pname = "FormValidator-Simple"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LY/LYOKATO/FormValidator-Simple-0.29.tar.gz"; + # hash = "sha256-/Dpj3FS5YtdFhgcBdq2vW+hp8JtWG7MPX9Mu9TF5JmY="; + # }; + # propagatedBuildInputs = [ ClassAccessor ClassDataAccessor DateCalc DateTimeFormatStrptime EmailValidLoose ListMoreUtils TieIxHash UNIVERSALrequire YAML ]; + # buildInputs = [ CGI ]; + # meta = { + # description = "Validation with simple chains of constraints"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FreezeThaw = buildPerlPackage { + # pname = "FreezeThaw"; + # version = "0.5001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILYAZ/modules/FreezeThaw-0.5001.tar.gz"; + # hash = "sha256-PF4IMpEG+c7jq0RLgTMcWTX4MIShUdiFBeekZdpUD0E="; + # }; + # doCheck = false; + # meta = { + # description = "Converting Perl structures to strings and back"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FunctionParameters = buildPerlPackage { + # pname = "Function-Parameters"; + # version = "2.002004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAUKE/Function-Parameters-2.002004.tar.gz"; + # hash = "sha256-KKvqWODAnOMnmaCMvXr3DaHimXd8KZEZQpygaacYg+g="; + # }; + # buildInputs = [ DirSelf TestFatal ]; + # meta = { + # description = "Define functions and methods with parameter lists (\"subroutine signatures\")"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Furl = buildPerlModule { + # pname = "Furl"; + # version = "3.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYOHEX/Furl-3.14.tar.gz"; + # hash = "sha256-Nd29iIDXHxniAkM+F2H9EXc4XmML9QaFvEi2t6y4V7k="; + # }; + # propagatedBuildInputs = [ ClassAccessorLite HTTPParserXS MozillaCA ]; + # buildInputs = [ HTTPCookieJar HTTPProxy ModuleBuildTiny Plack Starlet TestFakeHTTPD TestRequires TestSharedFork TestTCP TestValgrind URI ]; + # meta = { + # description = "Lightning-fast URL fetcher"; + # homepage = "https://github.com/tokuhirom/Furl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Future = buildPerlModule { + # pname = "Future"; + # version = "0.50"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Future-0.50.tar.gz"; + # hash = "sha256-wDXj2eaaOvFEszrINN7p5lrTYPKlHbnxWNw0Ls3dX0Q="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Represent an operation awaiting completion"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # FutureAsyncAwait = buildPerlModule { + # pname = "Future-AsyncAwait"; + # version = "0.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Future-AsyncAwait-0.66.tar.gz"; + # hash = "sha256-xqD03kYr8yS1usoXddGZ7DJGo1jBPbm2Ssv82+bl7CE="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ Future XSParseKeyword XSParseSublike ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Deferred subroutine syntax for futures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # FutureIO = buildPerlModule { + # pname = "Future-IO"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Future-IO-0.14.tar.gz"; + # hash = "sha256-a1j++vwwlMJwHwp7mMsUCwmItRaKfV3069Hu6OhyBgo="; + # }; + # buildInputs = [ TestFutureIOImpl ]; + # propagatedBuildInputs = [ Future StructDumb ]; + # preCheck = "rm t/06connect.t"; # this test fails in sandbox + # meta = { + # description = "Future-returning IO methods"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # FutureQueue = buildPerlModule { + # pname = "Future-Queue"; + # version = "0.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Future-Queue-0.51.tar.gz"; + # hash = "sha256-HVAcOpot3/x8YPlvpmlp1AyykuCSBM9t7NHCuLUAPNY="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ Future ]; + # meta = { + # description = "A FIFO queue of values that uses Ls"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GamesSolitaireVerify = buildPerlModule { + # pname = "Games-Solitaire-Verify"; + # version = "0.2403"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Games-Solitaire-Verify-0.2403.tar.gz"; + # hash = "sha256-5atHXIK6HLCIrSj0I8pRTUaUTWrjw+tV6WNunn8dyJM="; + # }; + # buildInputs = [ DirManifest TestDifferences ]; + # propagatedBuildInputs = [ ClassXSAccessor ExceptionClass PathTiny ]; + # meta = { + # description = "Verify solutions for solitaire games"; + # homepage = "https://metacpan.org/release/Games-Solitaire-Verify"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "verify-solitaire-solution"; + # }; + # }; + + # GD = buildPerlPackage { + # pname = "GD"; + # version = "2.78"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/GD-2.78.tar.gz"; + # hash = "sha256-aDEFS/VCS09cI9NifT0UhEgPb5wsZmMiIpFfKFG+buQ="; + # }; + + # buildInputs = [ pkgs.gd pkgs.libjpeg pkgs.zlib pkgs.freetype pkgs.libpng pkgs.fontconfig pkgs.xorg.libXpm ExtUtilsPkgConfig TestFork TestNoWarnings ]; + + # # otherwise "cc1: error: -Wformat-security ignored without -Wformat [-Werror=format-security]" + # hardeningDisable = [ "format" ]; + + # makeMakerFlags = [ "--lib_png_path=${pkgs.libpng.out}" "--lib_jpeg_path=${pkgs.libjpeg.out}" "--lib_zlib_path=${pkgs.zlib.out}" "--lib_ft_path=${pkgs.freetype.out}" "--lib_fontconfig_path=${pkgs.fontconfig.lib}" "--lib_xpm_path=${pkgs.xorg.libXpm.out}" ]; + + # meta = { + # description = "Perl interface to the gd2 graphics library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "bdf2gdfont.pl"; + # }; + # }; + + # GDGraph = buildPerlPackage { + # pname = "GDGraph"; + # version = "1.56"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/GDGraph-1.56.tar.gz"; + # hash = "sha256-b0nMTlkBVIDbnJtrGK/YxQvjCIZoe2lBFRPQbziXERM="; + # }; + # propagatedBuildInputs = [ GDText ]; + # buildInputs = [ CaptureTiny TestException ]; + # meta = { + # description = "Graph Plotting Module for Perl 5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GDSecurityImage = buildPerlPackage { + # pname = "GD-SecurityImage"; + # version = "1.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BU/BURAK/GD-SecurityImage-1.75.tar.gz"; + # hash = "sha256-Pd4k2ay6lRzd5bVp0eQsrZRs/bUSgORGnzNv1f4MjqY="; + # }; + # propagatedBuildInputs = [ GD ]; + # meta = { + # description = "Security image (captcha) generator"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GDText = buildPerlPackage { + # pname = "GDTextUtil"; + # version = "0.86"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MV/MVERB/GDTextUtil-0.86.tar.gz"; + # hash = "sha256-iG7L+Fz+lPQTXuVonEhHqa54PsuZ5nWeEsc08t1hFrw="; + # }; + # propagatedBuildInputs = [ GD ]; + # meta = { + # description = "Text utilities for use with GD"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GeoIP = buildPerlPackage { + # pname = "Geo-IP"; + # version = "1.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/Geo-IP-1.51.tar.gz"; + # hash = "sha256-FjAgMV1cVEGDaseeCKd7Qo8nf9CQvqT6gNpwd7JDaro="; + # }; + # makeMakerFlags = [ "LIBS=-L${pkgs.geoip}/lib" "INC=-I${pkgs.geoip}/include" ]; + # doCheck = false; # seems to access the network + # meta = { + # description = "Look up location and network information by IP Address"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GeoIP2 = buildPerlPackage { + # pname = "GeoIP2"; + # version = "2.006002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/GeoIP2-2.006002.tar.gz"; + # hash = "sha256-CQVCqO7pvTwS5ZxLZWJMidAf/ZQgTx8Hah20CybAmDQ="; + # }; + # propagatedBuildInputs = [ JSONMaybeXS LWPProtocolHttps MaxMindDBReader ParamsValidate Throwable ]; + # buildInputs = [ PathClass TestFatal TestNumberDelta ]; + # meta = { + # description = "Perl API for MaxMind's GeoIP2 web services and databases"; + # homepage = "https://metacpan.org/release/GeoIP2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "web-service-request"; + # }; + # }; + + # GetoptArgvFile = buildPerlPackage { + # pname = "Getopt-ArgvFile"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JS/JSTENZEL/Getopt-ArgvFile-1.11.tar.gz"; + # hash = "sha256-NwmqUTzm/XHRpVoC400vCQAX1TUKm9RHAFZTybCDWyI="; + # }; + # meta = { + # description = "Interpolates script options from files into @ARGV or another array"; + # license = with lib.licenses; [ artistic1 ]; + # maintainers = [ maintainers.pSub ]; + # }; + # }; + + # GetoptLong = buildPerlPackage { + # pname = "Getopt-Long"; + # version = "2.54"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/Getopt-Long-2.54.tar.gz"; + # hash = "sha256-WEujyZuy1rNBN1IS+bh0YT9wbPsBzuIbiiZ2qYq5hf4="; + # }; + # meta = { + # description = "Extended processing of command line options"; + # license = with lib.licenses; [ artistic1 gpl2Plus ]; + # }; + # }; + + # GetoptLongDescriptive = buildPerlPackage { + # pname = "Getopt-Long-Descriptive"; + # version = "0.111"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Getopt-Long-Descriptive-0.111.tar.gz"; + # hash = "sha256-m40V/K8Y/ddAJGtDjw5+uRS4McUdnXCMCZ7Kd2YiB20="; + # }; + # buildInputs = [ CPANMetaCheck TestFatal TestWarnings ]; + # propagatedBuildInputs = [ ParamsValidate SubExporter ]; + # meta = { + # description = "Getopt::Long, but simpler and more powerful"; + # homepage = "https://github.com/rjbs/Getopt-Long-Descriptive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GetoptTabular = buildPerlPackage { + # pname = "Getopt-Tabular"; + # version = "0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GW/GWARD/Getopt-Tabular-0.3.tar.gz"; + # hash = "sha256-m98GdjO1kTEngg9OgDXtxT0INy+qzla6a/oAyWiiU3c="; + # }; + # meta = { + # description = "Table-driven argument parsing for Perl 5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Git = buildPerlPackage { + # pname = "Git"; + # version = "0.42"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSOUTH/Git-0.42.tar.gz"; + # hash = "sha256-lGmp85jzor8rBQBWbuQdP/b65GBBKhNxhXZ6HMR4Om0="; + # }; + # propagatedBuildInputs = [ Error ]; + # meta = { + # description = "This is the Git.pm, plus the other files in the perl/Git directory, from github's git/git"; + # license = with lib.licenses; [ gpl2Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # GitAutofixup = buildPerlPackage { + # pname = "App-Git-Autofixup"; + # version = "0.004001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TORBIAK/App-Git-Autofixup-0.004001.tar.gz"; + # hash = "sha256-WroBPI3hOZD1iRoOKjnJcHTQcnvjZTIMLGrxnTbF3aw="; + # }; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/git-autofixup + # ''; + # meta = { + # description = "Create fixup commits for topic branches"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.DamienCassou ]; + # mainProgram = "git-autofixup"; + # }; + # }; + + # GitPurePerl = buildPerlPackage { + # pname = "Git-PurePerl"; + # version = "0.53"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BR/BROQ/Git-PurePerl-0.53.tar.gz"; + # hash = "sha256-mHx0NmzEw37ghAUPmF+iVDWcicElB/W4v8ZgfeU41ag="; + # }; + # buildInputs = [ Testutf8 ]; + # propagatedBuildInputs = [ ArchiveExtract ConfigGitLike DataStreamBulk DateTime FileFindRule IODigest MooseXStrictConstructor MooseXTypesPathClass ]; + # doCheck = false; + # meta = { + # description = "A Pure Perl interface to Git repositories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GitRepository = buildPerlPackage { + # pname = "Git-Repository"; + # version = "1.325"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/Git-Repository-1.325.tar.gz"; + # hash = "sha256-mypPoZT0oOtFI1XQyAhyfl6cFsFFrH0kw+qW0Kvv7UM="; + # }; + # buildInputs = [ TestRequiresGit ]; + # propagatedBuildInputs = [ GitVersionCompare SystemCommand namespaceclean ]; + # meta = { + # description = "Perl interface to Git repositories"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GitVersionCompare = buildPerlPackage { + # pname = "Git-Version-Compare"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/Git-Version-Compare-1.005.tar.gz"; + # hash = "sha256-NX/e2eVflesvUWoY9dwbRyCp3u+eLA52vNX+SuubPLs="; + # }; + # buildInputs = [ TestNoWarnings ]; + # meta = { + # description = "Functions to compare Git versions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Glib = buildPerlPackage { + # pname = "Glib"; + # version = "1.3294"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Glib-1.3294.tar.gz"; + # hash = "sha256-1xX1qGvMGHB13oXnrlvAewcU1u3BlqktpDmG76ROXLs="; + # }; + # buildInputs = [ pkgs.glib ]; + # propagatedBuildInputs = [ ExtUtilsDepends ExtUtilsPkgConfig ]; + # meta = { + # description = "Perl wrappers for the GLib utility and Object libraries"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Only ]; + # }; + # }; + + # GlibObjectIntrospection = buildPerlPackage { + # pname = "Glib-Object-Introspection"; + # version = "0.051"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Glib-Object-Introspection-0.051.tar.gz"; + # hash = "sha256-ZWlhHcyArBSCx8IiZLGujJw1HUmDUR65psX0ehAVAIk="; + # }; + # nativeCheckInputs = [ pkgs.cairo CairoGObject ]; + # propagatedBuildInputs = [ pkgs.gobject-introspection Glib ]; + # preCheck = '' + # # Our gobject-introspection patches make the shared library paths absolute + # # in the GIR files. When running tests, the library is not yet installed, + # # though, so we need to replace the absolute path with a local one during build. + # # We are using a symlink that we will delete after the execution of the tests. + # mkdir -p $out/lib + # ln -s $PWD/build/*.so $out/lib/ + # ''; + # postCheck = '' + # rm -r $out/lib + # ''; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Dynamically create Perl language bindings"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Only ]; + # }; + # }; + + # Gnome2 = buildPerlPackage { + # pname = "Gnome2"; + # version = "1.048"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gnome2-1.048.tar.gz"; + # hash = "sha256-ZPzDgnFKvY1XaSrDdjKMOiDGy8i81zKwB9FMv5ooLd0="; + # }; + # buildInputs = [ ExtUtilsDepends ExtUtilsPkgConfig Glib Gnome2Canvas Gnome2VFS Gtk2 ]; + # propagatedBuildInputs = [ pkgs.gnome2.libgnomeui ]; + # meta = { + # description = "(DEPRECATED) Perl interface to the 2.x series of the GNOME libraries"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.Gnome2Canvas.x86_64-darwin + # }; + # }; + + # Gnome2Canvas = buildPerlPackage { + # pname = "Gnome2-Canvas"; + # version = "1.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gnome2-Canvas-1.006.tar.gz"; + # hash = "sha256-aQZnxziSHeLWUWtOtjlVOlceSoMQ2AMfFYZYU23lq0I="; + # }; + # buildInputs = [ pkgs.gnome2.libgnomecanvas ]; + # propagatedBuildInputs = [ Gtk2 ]; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "(DEPRECATED) A structured graphics canvas"; + # license = with lib.licenses; [ lgpl2Plus ]; + # }; + # }; + + # Gnome2VFS = buildPerlPackage { + # pname = "Gnome2-VFS"; + # version = "1.084"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gnome2-VFS-1.084.tar.gz"; + # hash = "sha256-PI2Mlca2XCN9ueiJx57bK7gIvzfAhKvfu9mFn+93h8w="; + # }; + # propagatedBuildInputs = [ pkgs.gnome2.gnome_vfs Glib ]; + # meta = { + # description = "(DEPRECATED) Perl interface to the 2.x series of the GNOME VFS"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # Gnome2Wnck = buildPerlPackage { + # pname = "Gnome2-Wnck"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gnome2-Wnck-0.18.tar.gz"; + # hash = "sha256-RL7OyLLX9B8ngKc7CSJp/bec1JJluuDI/zkQN8RWSjU="; + # }; + # buildInputs = [ pkgs.libwnck2 pkgs.glib pkgs.gtk2 ]; + # propagatedBuildInputs = [ Gtk2 ]; + # meta = { + # description = "(DEPRECATED) Perl interface to the Window Navigator"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # GnuPG = buildPerlPackage { + # pname = "GnuPG"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YANICK/GnuPG-0.19.tar.gz"; + # hash = "sha256-r1Py0/Yyl+BGZ26uFKdilq/dKRDglyO2sRNwhiK3mJs="; + # }; + # buildInputs = [ pkgs.gnupg1orig ]; + # doCheck = false; + # meta = { + # description = "Perl interface to the GNU Privacy Guard"; + # license = with lib.licenses; [ gpl2Plus ]; + # mainProgram = "gpgmailtunl"; + # }; + # }; + + # GnuPGInterface = buildPerlPackage { + # pname = "GnuPG-Interface"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/GnuPG-Interface-1.03.tar.gz"; + # hash = "sha256-WvVmMPD6wpDXJCGD9kSaoOAoKfRhHcYrxunps4CPGHo="; + # }; + # buildInputs = [ pkgs.which pkgs.gnupg1compat ]; + # propagatedBuildInputs = [ MooXHandlesVia MooXlate ]; + # doCheck = false; + # meta = { + # description = "Supply object methods for interacting with GnuPG"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GoferTransporthttp = buildPerlPackage { + # pname = "GoferTransport-http"; + # version = "1.017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TIMB/GoferTransport-http-1.017.tar.gz"; + # hash = "sha256-9z7/4+p6+hkHzol3yHOHq7DUQE+FpySuJjeymnMVSps="; + # }; + # propagatedBuildInputs = [ DBI LWP mod_perl2 ]; + # doCheck = false; # no make target 'test' + # meta = { + # description = "HTTP transport for DBI stateless proxy driver DBD::Gofer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GooCanvas = buildPerlPackage { + # pname = "Goo-Canvas"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YE/YEWENBIN/Goo-Canvas-0.06.tar.gz"; + # hash = "sha256-DFiMUH7tXmLRLtHMHkkcb/Oh9ZxPs9Q14UIUs3qzklE="; + # }; + # propagatedBuildInputs = [ pkgs.goocanvas pkgs.gtk2 Gtk2 ]; + # meta = { + # description = "Perl interface to the GooCanvas"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GooCanvas2 = buildPerlPackage { + # pname = "GooCanvas2"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLMAX/GooCanvas2-0.06.tar.gz"; + # hash = "sha256-4kyHhz4ZBj3U1eLHCcqs+MCuiIEEQ5W7hl3CtP3WO1A="; + # }; + # buildInputs = [ pkgs.gtk3 ]; + # propagatedBuildInputs = [ pkgs.goocanvas2 Gtk3 ]; + # meta = { + # description = "Perl binding for GooCanvas2 widget using Glib::Object::Introspection"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GooCanvas2CairoTypes = buildPerlPackage rec { + # pname = "GooCanvas2-CairoTypes"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASOKOLOV/GooCanvas2-CairoTypes-${version}.tar.gz"; + # hash = "sha256-uoBnNuvMnePYFBp2Omgr3quxy4cCveKZrf1XSs6HUFI="; + # }; + # propagatedBuildInputs = [ pkgs.goocanvas2 Gtk3 ]; + # meta = { + # description = "Bridge between GooCanvas2 and Cairo types"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GoogleProtocolBuffers = buildPerlPackage { + # pname = "Google-ProtocolBuffers"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAXJAZMAN/protobuf/Google-ProtocolBuffers-0.12.tar.gz"; + # hash = "sha256-s4RJxguaJxLd5IFIXMerA7KgrBw/1ICzhT5BEawpTXE="; + # }; + # propagatedBuildInputs = [ ClassAccessor ParseRecDescent ]; + # patches = + # [ ./perl-modules/Google-ProtocolBuffers-multiline-comments.patch ]; + # meta = { + # description = "Simple interface to Google Protocol Buffers"; + # homepage = "https://github.com/csirtgadgets/google-protocolbuffers-perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "protoc-perl"; + # }; + # }; + + # gotofile = buildPerlPackage { + # pname = "goto-file"; + # version = "0.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/goto-file-0.005.tar.gz"; + # hash = "sha256-xs3V7kps3L2/MU2SpPmYXbzfnkJYBIyudhJcBSqjH3c="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Stop parsing the current file and move on to a different one"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Graph = buildPerlPackage { + # pname = "Graph"; + # version = "0.9727"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/Graph-0.9727.tar.gz"; + # hash = "sha256-OSqJFtyVExq+jJE9/Kx2mEhL9IZrQq9fcEPABi50Iik="; + # }; + # propagatedBuildInputs = [ HeapFibonacci SetObject ]; + # meta = { + # description = "GRaph data structures and algorithms"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GraphicsColor = buildPerlPackage { + # pname = "Graphics-Color"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GP/GPHAT/Graphics-Color-0.31.tar.gz"; + # hash = "sha256-+qj+1bLYDlFgr5duXbIkLAs1VVQs4QQldf9raUWHoz0="; + # }; + # buildInputs = [ TestNumberDelta ModulePluggable ]; + # propagatedBuildInputs = [ ColorLibrary Moose MooseXAliases MooseXClone MooseXStorage MooseXTypes ]; + # meta = { + # description = "Device and library agnostic color spaces"; + # homepage = "https://github.com/gphat/graphics-color"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GraphicsTIFF = buildPerlPackage { + # pname = "Graphics-TIFF"; + # version = "20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RATCLIFFE/Graphics-TIFF-20.tar.gz"; + # hash = "sha256-PlXMIJRl4GQBmiFaUvBf9RBAKX0CA5P+n7PeJ60CDjU="; + # }; + # buildInputs = [ pkgs.libtiff ExtUtilsDepends ExtUtilsPkgConfig ]; + # propagatedBuildInputs = [ Readonly ]; + # nativeCheckInputs = [ TestRequires TestDeep pkgs.hexdump ]; + # meta = { + # description = "Perl extension for the libtiff library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GraphicsToolkitColor = buildPerlPackage { + # pname = "Graphics-Toolkit-Color"; + # version = "1.71"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LI/LICHTKIND/Graphics-Toolkit-Color-1.71.tar.gz"; + # hash = "sha256-NOiLb2hY9H2ZYQHxWC8esA23+G4Snl8dYb9/m922LvI="; + # }; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Color palette constructor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GraphViz = buildPerlPackage { + # pname = "GraphViz"; + # version = "2.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/GraphViz-2.26.tar.gz"; + # hash = "sha256-ml0lILMmK/MEdSct12SkRfjn+TG++Ivg49O/9EXacyg="; + # }; + + # # XXX: It'd be nicer it `GraphViz.pm' could record the path to graphviz. + # buildInputs = [ pkgs.graphviz TestPod ]; + # propagatedBuildInputs = [ FileWhich IPCRun ParseRecDescent XMLTwig XMLXPath ]; + + # meta = { + # description = "Perl interface to the GraphViz graphing tool"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # GraphViz2 = buildPerlPackage { + # pname = "GraphViz2"; + # version = "2.67"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/GraphViz2-2.67.tar.gz"; + # hash = "sha256-h8hcbt/86k+W5rSAD2+VEq6rGeuNOzSDAachMxvLhYA="; + # }; + + # # XXX: It'd be nicer if `GraphViz.pm' could record the path to graphviz. + # buildInputs = [ pkgs.graphviz TestPod Moo IPCRun3 TypeTiny TestSnapshot Graph ]; + # propagatedBuildInputs = [ FileWhich IPCRun ParseRecDescent XMLTwig XMLXPath DataSectionSimple ]; + + # # needed for fontconfig tests + # HOME = "/build"; + # FONTCONFIG_PATH = "${lib.getOutput "out" pkgs.fontconfig}/etc/fonts"; + + # meta = { + # description = "Perl interface to the GraphViz graphing tool"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # grepmail = buildPerlPackage { + # pname = "grepmail"; + # version = "5.3111"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCOPPIT/grepmail-5.3111.tar.gz"; + # hash = "sha256-0JhOP3ob4XrgFFdfcMFngVGlvMliIYXcWgUstjJxp2E="; + # }; + # buildInputs = [ FileHomeDir FileSlurper TestCompile UNIVERSALrequire URI ]; + # propagatedBuildInputs = [ MailMboxMessageParser TimeDate ]; + # outputs = [ "out" ]; + # meta = { + # description = "Search mailboxes for mail matching a regular expression"; + # homepage = "https://github.com/coppit/grepmail"; + # license = with lib.licenses; [ gpl2Only ]; + # maintainers = with maintainers; [ romildo ]; + # }; + # }; + + # GrowlGNTP = buildPerlModule { + # pname = "Growl-GNTP"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTN/Growl-GNTP-0.21.tar.gz"; + # hash = "sha256-KHl/jkJ0BnIFhMr9EOeAp47CtWnFVaGHQ9dFU9X1CD8="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ CryptCBC DataUUID ]; + # meta = { + # description = "Perl implementation of GNTP Protocol (Client Part)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # GSSAPI = buildPerlPackage { + # pname = "GSSAPI"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AG/AGROLMS/GSSAPI-0.28.tar.gz"; + # hash = "sha256-fY8se2F2L7TsctLsKBKQ8vh/nH0pgnPaRSVDKmXncNY="; + # }; + # propagatedBuildInputs = [ pkgs.krb5.dev ]; + # makeMakerFlags = [ "--gssapiimpl" "${pkgs.krb5.dev}" ]; + # meta = { + # description = "Perl extension providing access to the GSSAPIv2 library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # Gtk2 = buildPerlPackage { + # pname = "Gtk2"; + # version = "1.24993"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gtk2-1.24993.tar.gz"; + # hash = "sha256-ScRDdDsu7+EadoACck9/akxI78lP8806VZ+357aTyWc="; + # }; + # patches = [ + # # Fix incompatible function pointer conversion (assigning `GdkNativeWindow` to `guint32`). + # ./perl-modules/Gtk2-fix-incompatible-pointer-conversion.patch + # ]; + # buildInputs = [ pkgs.gtk2 ]; + # # https://rt.cpan.org/Public/Bug/Display.html?id=130742 + # # doCheck = !stdenv.isDarwin; + # doCheck = false; + # propagatedBuildInputs = [ Pango ]; + # meta = { + # description = "Perl interface to the 2.x series of the Gimp Toolkit library"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # Gtk2TrayIcon = buildPerlPackage { + # pname = "Gtk2-TrayIcon"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gtk2-TrayIcon-0.07.tar.gz"; + # hash = "sha256-OfwrmabmE9qeqXfYy1MD+l4H5poVJIk03hIXqXuWRVQ="; + # }; + # propagatedBuildInputs = [ pkgs.gtk2 Gtk2 ]; + # meta = { + # description = "(DEPRECATED) Perl interface to the EggTrayIcon library"; + # license = with lib.licenses; [ gpl2Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.Gtk2TrayIcon.x86_64-darwin + # }; + # }; + + # Gtk2AppIndicator = buildPerlPackage { + # pname = "Gtk2-AppIndicator"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OE/OESTERHOL/Gtk2-AppIndicator-0.15.tar.gz"; + # hash = "sha256-olywceIU+4m0RQqkYFAx6uibeWHhSbDW6PSRwZwUqQo="; + # }; + # propagatedBuildInputs = [ pkgs.libappindicator-gtk2 pkgs.libdbusmenu-gtk2 pkgs.gtk2 pkgs.pkg-config Gtk2 ]; + # # Tests fail due to no display: + # # Gtk-WARNING **: cannot open display: at /nix/store/HASH-perl-Gtk2-1.2498/lib/perl5/site_perl/5.22.2/x86_64-linux-thread-multi/Gtk2.pm line 126. + # doCheck = false; + # meta = { + # description = "Perl extension for libappindicator"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # Gtk2ImageView = buildPerlPackage { + # pname = "Gtk2-ImageView"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RATCLIFFE/Gtk2-ImageView-0.05.tar.gz"; + # hash = "sha256-CHGGw2k6zxlkUc9ZzIt/XPmnsFq+INMty8uggilT+4A="; + # }; + # buildInputs = [ pkgs.gtkimageview pkgs.gtk2 ]; + # propagatedBuildInputs = [ Gtk2 ]; + # # Tests fail due to no display server: + # # Gtk-WARNING **: cannot open display: at /nix/store/HASH-perl-Gtk2-1.2498/lib/perl5/site_perl/5.22.2/x86_64-linux-thread-multi/Gtk2.pm line 126. + # # t/animview.t ........... + # doCheck = false; + # meta = { + # description = "Perl bindings for the GtkImageView widget"; + # license = with lib.licenses; [ lgpl3Plus ]; + # }; + # }; + + # Gtk2Unique = buildPerlPackage { + # pname = "Gtk2-Unique"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gtk2-Unique-0.07.tar.gz"; + # hash = "sha256-nOX2ikFgC8z31u/eMMBwqxFOk57XqKx8O3rZE5mJGGc="; + # }; + # propagatedBuildInputs = [ pkgs.libunique pkgs.gtk2 Gtk2 ]; + # meta = { + # description = "(DEPRECATED) Use single instance applications"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.Gtk2Unique.x86_64-darwin + # }; + # }; + + # Gtk3 = buildPerlPackage rec { + # pname = "Gtk3"; + # version = "0.038"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Gtk3-${version}.tar.gz"; + # hash = "sha256-cNxL8qp0mBx54V/SmNmY4FqS66SBHxrVyfH03jdzesw="; + # }; + # propagatedBuildInputs = [ pkgs.gtk3 CairoGObject GlibObjectIntrospection ]; + # preCheck = lib.optionalString stdenv.isDarwin '' + # # Currently failing on macOS + # rm t/overrides.t + # rm t/signals.t + # rm t/zz-GdkEvent.t + # rm t/zz-GtkContainer.t + # rm t/zz-GtkDialog.t + # ''; + # meta = { + # description = "Perl interface to the 3.x series of the gtk+ toolkit"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # Gtk3ImageView = buildPerlPackage rec { + # pname = "Gtk3-ImageView"; + # version = "10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASOKOLOV/Gtk3-ImageView-${version}.tar.gz"; + # hash = "sha256-vHfnBgaeZPK7hBgZcP1KjepG+IvsDE3XwrH9U4xoN+Y="; + # }; + # buildInputs = [ pkgs.gtk3 ]; + # propagatedBuildInputs = [ Readonly Gtk3 ]; + # nativeCheckInputs = [ TestDifferences TestDeep ImageMagick TryTiny TestMockObject CarpAlways pkgs.librsvg ]; + # checkPhase = '' + # ${pkgs.xvfb-run}/bin/xvfb-run -s '-screen 0 800x600x24' \ + # make test + # ''; + # meta = { + # description = "Image viewer widget for Gtk3"; + # homepage = "https://github.com/carygravel/gtk3-imageview"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Gtk3SimpleList = buildPerlPackage { + # pname = "Gtk3-SimpleList"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TV/TVIGNAUD/Gtk3-SimpleList-0.21.tar.gz"; + # hash = "sha256-HURlEAvzvAR0opRppAb9AzVituNzYYgSEAA3KrKtqIQ="; + # }; + # propagatedBuildInputs = [ Gtk3 ]; + # meta = { + # description = "A simple interface to Gtk3's complex MVC list widget"; + # homepage = "https://github.com/soig/Gtk3-SimpleList"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # Guard = buildPerlPackage { + # pname = "Guard"; + # version = "1.023"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/Guard-1.023.tar.gz"; + # hash = "sha256-NMTd+R/JPRCQ2G2hTfcG0XWxYQxnNywB4SzpVV1N0dw="; + # }; + # meta = { + # description = "Safe cleanup blocks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HamAPRSFAP = buildPerlPackage { + # pname = "Ham-APRS-FAP"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HE/HESSU/Ham-APRS-FAP-1.21.tar.gz"; + # hash = "sha256-4BtFXUb0RxDbzyG2+oQ/CTWM5g7uHEFBvHTgogTToCA="; + # }; + # propagatedBuildInputs = [ DateCalc ]; + # meta = { + # description = "Finnish APRS Parser (Fabulous APRS Parser)"; + # maintainers = [ ]; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Hailo = buildPerlPackage { + # pname = "Hailo"; + # version = "0.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AV/AVAR/Hailo-0.75.tar.gz"; + # hash = "sha256-u6mcsM+j7oYy3YmQbG5voF/muzZ/IoLoiQnO/Y+RdMI="; + # }; + # buildInputs = [ BotTrainingMegaHAL BotTrainingStarCraft DataSection FileSlurp PodSection TestException TestExpect TestOutput TestScript TestScriptRun ]; + # propagatedBuildInputs = [ ClassLoad DBDSQLite DataDump DirSelf FileCountLines GetoptLongDescriptive IOInteractive IPCSystemSimple ListMoreUtils Moose MooseXGetopt MooseXStrictConstructor MooseXTypes RegexpCommon TermSk namespaceclean ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # patches = [ + # ./perl-modules/Hailo-fix-test-gld.patch + # ]; + # postPatch = '' + # patchShebangs bin + # ''; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/hailo + # ''; + # meta = { + # description = "A pluggable Markov engine analogous to MegaHAL"; + # homepage = "https://hailo.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "hailo"; + # }; + # }; + + # HashDiff = buildPerlPackage { + # pname = "Hash-Diff"; + # version = "0.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOLAV/Hash-Diff-0.010.tar.gz"; + # hash = "sha256-vJpKo47JjwqYKJ41q/mhfC8qMjmiIJoymADglwqi4MU="; + # }; + # propagatedBuildInputs = [ HashMerge ]; + # buildInputs = [ TestSimple13 ]; + + # meta = { + # description = "Return difference between two hashes as a hash"; + # homepage = "https://github.com/bolav/hash-diff"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ham = callPackage ./perl-modules/ham { }; + + # HashFlatten = buildPerlPackage { + # pname = "Hash-Flatten"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBC/Hash-Flatten-1.19.tar.gz"; + # hash = "sha256-cMbEnYtsRgdGQXpQmO3SoP0x/YuGxUv4SS6FPB9OS5g="; + # }; + # buildInputs = [ TestAssertions ]; + # propagatedBuildInputs = [ LogTrace ]; + # meta = { + # description = "Flatten/unflatten complex data hashes"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # HashMerge = buildPerlPackage { + # pname = "Hash-Merge"; + # version = "0.302"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HE/HERMES/Hash-Merge-0.302.tar.gz"; + # hash = "sha256-rgUi92U5YIth3eFGcOeWd+DzkQNoMvcKIfMa3eJThkQ="; + # }; + # propagatedBuildInputs = [ CloneChoose ]; + # buildInputs = [ Clone ClonePP ]; + # meta = { + # description = "Merges arbitrarily deep hashes into a single hash"; + # homepage = "https://metacpan.org/release/Hash-Merge"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashMergeSimple = buildPerlPackage { + # pname = "Hash-Merge-Simple"; + # version = "0.051"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROKR/Hash-Merge-Simple-0.051.tar.gz"; + # hash = "sha256-HFYyeHPS8E1XInd/BEhj2WiRBGaZd0DVWnVAccYoe3M="; + # }; + # buildInputs = [ TestDeep TestDifferences TestException TestMost TestWarn ]; + # propagatedBuildInputs = [ Clone ]; + # meta = { + # description = "Recursively merge two or more hashes, simply"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashMoreUtils = buildPerlPackage { + # pname = "Hash-MoreUtils"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/Hash-MoreUtils-0.06.tar.gz"; + # hash = "sha256-25qPuGfVB1PDgIiaXlQHVlG14IybO3IctyIMCINUfeg="; + # }; + # meta = { + # description = "Provide the stuff missing in Hash::Util"; + # homepage = "https://metacpan.org/release/Hash-MoreUtils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashMultiValue = buildPerlPackage { + # pname = "Hash-MultiValue"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/Hash-MultiValue-0.16.tar.gz"; + # hash = "sha256-Zhgd96po4nhvr2iVyIsYuVyACo5Ob7TAf9F2QQo8c/Q="; + # }; + # meta = { + # description = "Store multiple values per key"; + # homepage = "https://github.com/miyagawa/Hash-MultiValue"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashOrdered = buildPerlPackage { + # pname = "Hash-Ordered"; + # version = "0.014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Hash-Ordered-0.014.tar.gz"; + # hash = "sha256-jcNs15FVrjerij3l/ZEg/7qaMeQJJYwoUp7FJRxZdHs="; + # }; + # buildInputs = [ TestDeep TestFailWarnings TestFatal ]; + # meta = { + # homepage = "https://github.com/dagolden/Hash-Ordered"; + # description = "A fast, pure-Perl ordered hash class"; + # license = lib.licenses.asl20; + # }; + # }; + + # HashSafeKeys = buildPerlPackage { + # pname = "Hash-SafeKeys"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MOB/Hash-SafeKeys-0.04.tar.gz"; + # hash = "sha256-pSStO/naZ3wfi+bhWXG3ZXVAj3RJI9onZHro8dPDfMw="; + # }; + # meta = { + # description = "Get hash contents without resetting each iterator"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashSharedMem = buildPerlModule { + # pname = "Hash-SharedMem"; + # version = "0.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Hash-SharedMem-0.005.tar.gz"; + # hash = "sha256-Mkd2gIYC973EStqpN4lTZUVAKakm+mEfMhyb9rlAu14="; + # }; + # env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isAarch64 "-mno-outline-atomics"; + # buildInputs = [ ScalarString ]; + # meta = { + # description = "Efficient shared mutable hash"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.HashSharedMem.x86_64-darwin + # }; + # }; + + # HashStoredIterator = buildPerlModule { + # pname = "Hash-StoredIterator"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/Hash-StoredIterator-0.008.tar.gz"; + # hash = "sha256-ucvE3NgjPo0dfxSB3beaSl+dtxgMs+8CtLy+4F5l6gw="; + # }; + # buildInputs = [ Test2Suite ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Functions for accessing a hashes internal iterator"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HashUtilFieldHashCompat = buildPerlPackage { + # pname = "Hash-Util-FieldHash-Compat"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Hash-Util-FieldHash-Compat-0.11.tar.gz"; + # hash = "sha256-ZC5Gp1tTe6EUILMPiwNAPJCgahVFjNgAnzOf6eXzdBs="; + # }; + # meta = { + # description = "Use Hash::Util::FieldHash or ties, depending on availability"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HeapFibonacci = buildPerlPackage { + # pname = "Heap"; + # version = "0.80"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMM/Heap-0.80.tar.gz"; + # hash = "sha256-zNop88kxdq0P3/9N1vXkrJCzcMuksCg4a3NDv2QTm94="; + # }; + # meta = { + # description = "Perl extensions for keeping data partially sorted"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HookLexWrap = buildPerlPackage { + # pname = "Hook-LexWrap"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Hook-LexWrap-0.26.tar.gz"; + # hash = "sha256-tgvcX5j5T5KUsGre+CsdmW2hktXxg/n0NLYQ/RE37C0="; + # }; + # buildInputs = [ pkgs.unzip ]; + # meta = { + # description = "Lexically scoped subroutine wrappers"; + # homepage = "https://github.com/karenetheridge/Hook-LexWrap"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLClean = buildPerlPackage { + # pname = "HTML-Clean"; + # version = "1.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AZ/AZJADFTRE/HTML-Clean-1.4.tar.gz"; + # hash = "sha256-pn1KvadR/DxrSjUYU3eoi8pbZRxgszN5gEtOkKF4hwY="; + # }; + # meta = { + # description = "Cleans up HTML code for web browsers, not humans"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "htmlclean"; + # }; + # }; + + # HTMLElementExtended = buildPerlPackage { + # pname = "HTML-Element-Extended"; + # version = "1.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSISK/HTML-Element-Extended-1.18.tar.gz"; + # hash = "sha256-8+8a8Qjyf+8V6+xmR58lHOCKpJvQCwRiycgMhrS2sys="; + # }; + # propagatedBuildInputs = [ HTMLTree ]; + # meta = { + # description = "Perl extension for HTML::Element(3)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLEscape = buildPerlModule { + # pname = "HTML-Escape"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/HTML-Escape-1.11.tar.gz"; + # hash = "sha256-Wl7viWUA0epsJKkIXs++mkOr7mjPxmwD+InSostoml0="; + # }; + # buildInputs = [ ModuleBuildPluggablePPPort TestRequires ]; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Extremely fast HTML escaping"; + # homepage = "https://github.com/tokuhirom/HTML-Escape"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.HTMLEscape.x86_64-darwin + # }; + # }; + + # HTMLFromANSI = buildPerlPackage { + # pname = "HTML-FromANSI"; + # version = "2.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NU/NUFFIN/HTML-FromANSI-2.03.tar.gz"; + # hash = "sha256-IXdjRe1wGywEx7CTgK+UP5mEzH+ZYkCHrqRdtfwJw1k="; + # }; + # propagatedBuildInputs = [ HTMLParser TermVT102Boundless ]; + # meta = { + # description = "Mark up ANSI sequences as HTML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "ansi2html"; + # }; + # }; + + # HTMLForm = buildPerlPackage { + # pname = "HTML-Form"; + # version = "6.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SI/SIMBABQUE/HTML-Form-6.11.tar.gz"; + # hash = "sha256-Q7+qcIc5NIfS1RJhoap/b4Gpex2P73pI/PbvMrFtZFQ="; + # }; + # buildInputs = [ TestWarnings ]; + # propagatedBuildInputs = [ HTMLParser URI ]; + # meta = { + # description = "Class that represents an HTML form element"; + # homepage = "https://github.com/libwww-perl/HTML-Form"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormatter = buildPerlPackage { + # pname = "HTML-Formatter"; + # version = "2.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NIGELM/HTML-Formatter-2.16.tar.gz"; + # hash = "sha256-ywoN2Kpei6nKIUzkUb9N8zqgnBPpB+jTCC3a/rMBUcw="; + # }; + # buildInputs = [ FileSlurper TestWarnings ]; + # propagatedBuildInputs = [ FontAFM HTMLTree ]; + # meta = { + # description = "Base class for HTML formatters"; + # homepage = "https://metacpan.org/release/HTML-Formatter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormatExternal = buildPerlPackage { + # pname = "HTML-FormatExternal"; + # version = "26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/HTML-FormatExternal-26.tar.gz"; + # hash = "sha256-PFnyM9CxBoaoWu0MmUARzsaGJtoBKN6pC1xP3BdGz8M="; + # }; + # propagatedBuildInputs = [ IPCRun URI constant-defer ]; + # meta = { + # description = "HTML to text formatting using external programs"; + # homepage = "https://user42.tuxfamily.org/html-formatexternal/index.html"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # HTMLFormatTextWithLinks = buildPerlModule { + # pname = "HTML-FormatText-WithLinks"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STRUAN/HTML-FormatText-WithLinks-0.15.tar.gz"; + # hash = "sha256-f8wat561j7l9Q+W90U4heRolCiBJmJGMYtahcRMYM7E="; + # }; + # propagatedBuildInputs = [ HTMLFormatter ]; + # meta = { + # description = "HTML to text conversion with links as footnotes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormatTextWithLinksAndTables = buildPerlPackage { + # pname = "HTML-FormatText-WithLinks-AndTables"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DALEEVANS/HTML-FormatText-WithLinks-AndTables-0.07.tar.gz"; + # hash = "sha256-gJ7i8RcFcGszxUMStce+5nSDjyvqrtr4y5RecCquObY="; + # }; + # propagatedBuildInputs = [ HTMLFormatTextWithLinks ]; + # meta = { + # description = "Converts HTML to Text with tables intact"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormFu = buildPerlPackage { + # pname = "HTML-FormFu"; + # version = "2.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFRANKS/HTML-FormFu-2.07.tar.gz"; + # hash = "sha256-Ty8Bf3qHVPu26RIGyI7RPHVqFOO+oXgYjDuXdGNm6zI="; + # }; + # buildInputs = [ CGI FileShareDirInstall RegexpAssemble TestException TestMemoryCycle TestRequiresInternet ]; + # propagatedBuildInputs = [ ConfigAny DataVisitor DateTimeFormatBuilder DateTimeFormatNatural EmailValid HTMLScrubber HTMLTokeParserSimple HashFlatten JSONMaybeXS MooseXAliases MooseXAttributeChained NumberFormat PathClass Readonly RegexpCommon TaskWeaken YAMLLibYAML ]; + # meta = { + # description = "HTML Form Creation, Rendering and Validation Framework"; + # homepage = "https://github.com/FormFu/HTML-FormFu"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormFuMultiForm = buildPerlPackage { + # pname = "HTML-FormFu-MultiForm"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NIGELM/HTML-FormFu-MultiForm-1.03.tar.gz"; + # hash = "sha256-NvAM12u4luTaCd0rsOXYkGZ/cMePVCUa9NJYyCFJFZ8="; + # }; + # propagatedBuildInputs = [ CryptCBC CryptDES HTMLFormFu ]; + # meta = { + # description = "Handle multi-page/stage forms with FormFu"; + # homepage = "https://github.com/FormFu/HTML-FormFu-MultiForm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLFormHandler = buildPerlPackage { + # pname = "HTML-FormHandler"; + # version = "0.40068"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GS/GSHANK/HTML-FormHandler-0.40068.tar.gz"; + # hash = "sha256-63t43aMSV1LMi8wDltOXf70o2jPS1ExQQq1tNdbN6Cc="; + # }; + # # a single test is failing on perl 5.20 + # doCheck = false; + # buildInputs = [ FileShareDirInstall PadWalker TestDifferences TestException TestMemoryCycle TestWarn ]; + # propagatedBuildInputs = [ CryptBlowfish CryptCBC DataClone DateTimeFormatStrptime EmailValid HTMLTree JSONMaybeXS MooseXGetopt MooseXTypesCommon MooseXTypesLoadableClass aliased ]; + # meta = { + # description = "HTML forms using Moose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLGumbo = buildPerlModule { + # pname = "HTML-Gumbo"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RUZ/HTML-Gumbo-0.18.tar.gz"; + # hash = "sha256-v1C2HCRlbMP8lYYC2AqcfQFyR6842Nv6Dp3sW3VCXV8="; + # }; + # propagatedBuildInputs = [ AlienLibGumbo ]; + # meta = { + # description = "HTML5 parser based on gumbo C library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLMason = buildPerlPackage { + # pname = "HTML-Mason"; + # version = "1.60"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/HTML-Mason-1.60.tar.gz"; + # hash = "sha256-qgu9WmtjxiyJVfjFXsCF43DXktZSZrbDtcXweIu8d+Y="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ CGI CacheCache ClassContainer ExceptionClass LogAny ]; + # meta = { + # description = "High-performance, dynamic web site authoring system"; + # homepage = "https://metacpan.org/release/HTML-Mason"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLMasonPSGIHandler = buildPerlPackage { + # pname = "HTML-Mason-PSGIHandler"; + # version = "0.53"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RUZ/HTML-Mason-PSGIHandler-0.53.tar.gz"; + # hash = "sha256-6v18dlXfqCYd80RrkxooPTAwaHe4OsRnHEnP906n8As="; + # }; + # buildInputs = [ Plack ]; + # propagatedBuildInputs = [ CGIPSGI HTMLMason ]; + # meta = { + # description = "PSGI handler for HTML::Mason"; + # homepage = "https://search.cpan.org/dist/HTML-Mason-PSGIHandler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + HTMLParser = buildPerlPackage { + pname = "HTML-Parser"; + version = "3.81"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/HTML-Parser-3.81.tar.gz"; + hash = "sha256-wJEKXI+S+IF+3QbM/SJLocLr6MEPVR8DJYeh/IPWL/I="; + }; + propagatedBuildInputs = [ HTMLTagset HTTPMessage ]; + meta = { + description = "HTML parser class"; + homepage = "https://github.com/libwww-perl/HTML-Parser"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + HTMLTagCloud = buildPerlModule { + pname = "HTML-TagCloud"; + version = "0.38"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RO/ROBERTSD/HTML-TagCloud-0.38.tar.gz"; + hash = "sha256-SYCZRy3vhmtEi/YvQYLfrfWUcuE/JMuGZKZxynm2cBU="; + }; + meta = { + description = "Generate An HTML Tag Cloud"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # HTMLQuoted = buildPerlPackage { + # pname = "HTML-Quoted"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TS/TSIBLEY/HTML-Quoted-0.04.tar.gz"; + # hash = "sha256-i0HzE/3BgS8C9vbDfVjyEshP3PeCf3/UsDCQfzncZQw="; + # }; + # propagatedBuildInputs = [ HTMLParser ]; + # meta = { + # description = "Extract structure of quoted HTML mail message"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLRewriteAttributes = buildPerlPackage { + # pname = "HTML-RewriteAttributes"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TS/TSIBLEY/HTML-RewriteAttributes-0.05.tar.gz"; + # hash = "sha256-GAjsfN9A0nCFdf5hVaiPEDsX/sd5c6WDHC8kwlDnpYw="; + # }; + # propagatedBuildInputs = [ HTMLParser ]; + # meta = { + # description = "Concise attribute rewriting"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLSelectorXPath = buildPerlPackage { + # pname = "HTML-Selector-XPath"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORION/HTML-Selector-XPath-0.28.tar.gz"; + # hash = "sha256-QycX8D7Szz1kETDP09ShU/Ca1PhW2gB4E3kv4LLljQ8="; + # }; + # buildInputs = [ TestBase ]; + # meta = { + # description = "CSS Selector to XPath compiler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLScrubber = buildPerlPackage { + # pname = "HTML-Scrubber"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NIGELM/HTML-Scrubber-0.19.tar.gz"; + # hash = "sha256-rihVePhWX5FUxj5CNHBLV7aDX3ei+C/+ckiZ1FMmK7E="; + # }; + # propagatedBuildInputs = [ HTMLParser ]; + # buildInputs = [ TestDifferences TestMemoryCycle ]; + # meta = { + # description = "Perl extension for scrubbing/sanitizing HTML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLStripScripts = buildPerlPackage { + # pname = "HTML-StripScripts"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DRTECH/HTML-StripScripts-1.06.tar.gz"; + # hash = "sha256-Iiv7fsH9+kZeMto9xKvtLtxzZLvhno48UTx9WFsBCa0="; + # }; + # meta = { + # description = "Strip scripting constructs out of HTML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLStripScriptsParser = buildPerlPackage { + # pname = "HTML-StripScripts-Parser"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DRTECH/HTML-StripScripts-Parser-1.03.tar.gz"; + # hash = "sha256-R4waTkbrd/p7zpa6KIFo8LmMJ/JQ4A3GMSNlCBrtNAc="; + # }; + # propagatedBuildInputs = [ HTMLParser HTMLStripScripts ]; + # meta = { + # description = "XSS filter using HTML::Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLTableExtract = buildPerlPackage { + # pname = "HTML-TableExtract"; + # version = "2.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSISK/HTML-TableExtract-2.15.tar.gz"; + # hash = "sha256-hsWcnVjaPKF02l5i9aD7AvTaArGx4B355dFLtl5MPs8="; + # }; + # preCheck = '' + # # https://rt.cpan.org/Public/Bug/Display.html?id=121920 + # rm t/30_tree.t + # ''; + # propagatedBuildInputs = [ HTMLElementExtended ]; + # meta = { + # description = "Perl module for extracting the content contained in tables within an HTML document, either as text or encoded element trees"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + HTMLTagset = buildPerlPackage { + pname = "HTML-Tagset"; + version = "3.20"; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz"; + hash = "sha256-rbF9rJ42zQEfUkOIHJc5QX/RAvznYPjeTpvkxxMRCOI="; + }; + meta = { + description = "Data tables useful in parsing HTML"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # HTMLTemplate = buildPerlPackage { + # pname = "HTML-Template"; + # version = "2.97"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAMTREGAR/HTML-Template-2.97.tar.gz"; + # hash = "sha256-ZUevYfOqhXk/hhYZCTjWd9eZX7O3IMFiWAQLyTXiEp8="; + # }; + # propagatedBuildInputs = [ CGI ]; + # buildInputs = [ TestPod ]; + # meta = { + # description = "Perl module to use HTML-like templating language"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLTidy = buildPerlPackage { + # pname = "HTML-Tidy"; + # version = "1.60"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/HTML-Tidy-1.60.tar.gz"; + # hash = "sha256-vPv2XWh/jmcs9gyYIbzWXV6McqeCcrZ7sKwcaZoT18c="; + # }; + + # patchPhase = '' + # sed -i "s#/usr/include/tidyp#${pkgs.tidyp}/include/tidyp#" Makefile.PL + # sed -i "s#/usr/lib#${pkgs.tidyp}/lib#" Makefile.PL + # ''; + # buildInputs = [ TestException ]; + # meta = { + # description = "(X)HTML validation in a Perl object"; + # homepage = "https://github.com/petdance/html-tidy"; + # license = with lib.licenses; [ artistic2 ]; + # mainProgram = "webtidy"; + # }; + # }; + + # HTMLTiny = buildPerlPackage { + # pname = "HTML-Tiny"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/HTML-Tiny-1.08.tar.gz"; + # hash = "sha256-DwHfDJ/ICz2dooi6q/jApTdHRE964euWAOevxKPc/rU="; + # }; + # meta = { + # description = "Lightweight, dependency free HTML/XML generation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLTokeParserSimple = buildPerlModule { + # pname = "HTML-TokeParser-Simple"; + # version = "3.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/HTML-TokeParser-Simple-3.16.tar.gz"; + # hash = "sha256-7RETXGg55uDq+WlS5qw1Oi8i67QKchZZZx5dLcwOSp0="; + # }; + # propagatedBuildInputs = [ HTMLParser SubOverride ]; + # meta = { + # description = "Easy to use HTML::TokeParser interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLTree = buildPerlModule { + # pname = "HTML-Tree"; + # version = "5.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KE/KENTNL/HTML-Tree-5.07.tar.gz"; + # hash = "sha256-8DdNuEcxwgS4bB1bkJdf7w0wqGvZ3vkZND5VTjGp278="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ HTMLParser ]; + # meta = { + # description = "Work with HTML in a DOM-like tree structure"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "htmltree"; + # }; + # }; + + # HTMLTreeBuilderXPath = buildPerlPackage { + # pname = "HTML-TreeBuilder-XPath"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIROD/HTML-TreeBuilder-XPath-0.14.tar.gz"; + # hash = "sha256-Jeu9skRKClma5eekV9deCe/N8yZqXFcAsUA8y3SIpPM="; + # }; + # propagatedBuildInputs = [ HTMLTree XMLXPathEngine ]; + # meta = { + # description = "Add XPath support to HTML::TreeBuilder"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTMLWidget = buildPerlPackage { + # pname = "HTML-Widget"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFRANKS/HTML-Widget-1.11.tar.gz"; + # hash = "sha256-vkLfQFWSXOalob818eB60SvEP2VJ91JJAuozMFoOggs="; + # }; + # doCheck = false; + # propagatedBuildInputs = [ ClassAccessorChained ClassDataAccessor DateCalc EmailValid HTMLScrubber HTMLTree ModulePluggableFast ]; + # buildInputs = [ TestNoWarnings ]; + # meta = { + # description = "HTML Widget And Validation Framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPAcceptLanguage = buildPerlModule { + # pname = "HTTP-AcceptLanguage"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YAPPO/HTTP-AcceptLanguage-0.02.tar.gz"; + # hash = "sha256-LmBfVk7J66tlVI/17sk/nF3qvv7XBzpyneCuKE5OQq8="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Accept-Language header parser and find available language"; + # homepage = "https://github.com/yappo/p5-HTTP-AcceptLanguage"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPBody = buildPerlPackage { + # pname = "HTTP-Body"; + # version = "1.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GE/GETTY/HTTP-Body-1.23.tar.gz"; + # hash = "sha256-7OmB9BYWNaL7piFdAlcZXlOMTyNDhFMFAd/bahvY1jY="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ HTTPMessage ]; + # meta = { + # description = "HTTP Body Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + HTTPCookieJar = buildPerlPackage { + pname = "HTTP-CookieJar"; + version = "0.014"; + src = fetchurl { + url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/HTTP-CookieJar-0.014.tar.gz"; + hash = "sha256-cJTqXJH1NtJjuF6Dq06alj4RxECM4I7K5VP6nAzEfnM="; + }; + propagatedBuildInputs = [ HTTPDate ]; + buildInputs = [ TestDeep TestRequires URI ]; + # Broken on Hydra since 2021-06-17: https://hydra.nixos.org/build/146507373 + doCheck = false; + meta = { + description = "A minimalist HTTP user agent cookie jar"; + homepage = "https://github.com/dagolden/HTTP-CookieJar"; + license = with lib.licenses; [ asl20 ]; + }; + }; + + HTTPCookies = buildPerlPackage { + pname = "HTTP-Cookies"; + version = "6.10"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/HTTP-Cookies-6.10.tar.gz"; + hash = "sha256-4282Yzxc5rXkuHb/z3R4fMXv4HNt1/SHvdc8FPC9cAc="; + }; + propagatedBuildInputs = [ HTTPMessage ]; + meta = { + description = "HTTP cookie jars"; + homepage = "https://github.com/libwww-perl/HTTP-Cookies"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + HTTPDaemon = buildPerlPackage { + pname = "HTTP-Daemon"; + version = "6.16"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/HTTP-Daemon-6.16.tar.gz"; + hash = "sha256-s40JJyXm+k4MTcKkfhVwcEkbr6Db4Wx4o1joBqp+Fz0="; + }; + buildInputs = [ ModuleBuildTiny TestNeeds ]; + propagatedBuildInputs = [ HTTPMessage ]; + meta = { + description = "A simple http server class"; + homepage = "https://github.com/libwww-perl/HTTP-Daemon"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + HTTPDate = buildPerlPackage { + pname = "HTTP-Date"; + version = "6.06"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/HTTP-Date-6.06.tar.gz"; + hash = "sha256-e2hRkcasw+dz0fwCyV7h+frpT3d4MXX154wYHMktK1I="; + }; + propagatedBuildInputs = [ TimeDate ]; + meta = { + description = "Date conversion routines"; + homepage = "https://github.com/libwww-perl/HTTP-Date"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # HTTPEntityParser = buildPerlModule { + # pname = "HTTP-Entity-Parser"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/HTTP-Entity-Parser-0.25.tar.gz"; + # hash = "sha256-OozQ2Muj0XzYwE7oLXNB36okfb3ZSknrlLU/aeSD7Do="; + # }; + # propagatedBuildInputs = [ HTTPMultiPartParser HashMultiValue JSONMaybeXS StreamBuffered WWWFormUrlEncoded ]; + # buildInputs = [ HTTPMessage ModuleBuildTiny ]; + # meta = { + # description = "PSGI compliant HTTP Entity Parser"; + # homepage = "https://github.com/kazeburo/HTTP-Entity-Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPDAV = buildPerlPackage { + # pname = "HTTP-DAV"; + # version = "0.49"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/COSIMO/HTTP-DAV-0.49.tar.gz"; + # hash = "sha256-MzOd+ewQbeN9hgnP0NPAg8z7sGwWxlG1s4UaVtF6lXw="; + # }; + # propagatedBuildInputs = [ XMLDOM ]; + # meta = { + # description = "WebDAV client library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "dave"; + # }; + # }; + + # HTTPHeadersActionPack = buildPerlPackage { + # pname = "HTTP-Headers-ActionPack"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/HTTP-Headers-ActionPack-0.09.tar.gz"; + # hash = "sha256-x4ERq4V+SMaYJJA9S2zoKT/v/GtdZw21UKdn+FOsx9o="; + # }; + # buildInputs = [ TestFatal TestWarnings ]; + # propagatedBuildInputs = [ HTTPDate HTTPMessage ModuleRuntime SubExporter URI ]; + # meta = { + # description = "HTTP Action, Adventure and Excitement"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPHeaderParserXS = buildPerlPackage { + # pname = "HTTP-HeaderParser-XS"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKSMITH/HTTP-HeaderParser-XS-0.20.tar.gz"; + # hash = "sha256-qeAP/7PYmRoUqq/dxh1tFoxP8U4xSuPbstTaMAjXRu8="; + # }; + # meta = { + # description = "An XS extension for processing HTTP headers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = + # stdenv.isi686 # loadable library and perl binaries are mismatched (got handshake key 0x7d40080, needed 0x7dc0080) + # || stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.HTTPHeaderParserXS.x86_64-darwin + # }; + # }; + + # HTTPHeadersFast = buildPerlModule { + # pname = "HTTP-Headers-Fast"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/HTTP-Headers-Fast-0.22.tar.gz"; + # hash = "sha256-zEMdtoSW3YhNtLwMC3ESwfSk8dxoxPWjyqdXoedIG0g="; + # }; + # buildInputs = [ ModuleBuildTiny TestRequires ]; + # propagatedBuildInputs = [ HTTPDate ]; + # meta = { + # description = "Faster implementation of HTTP::Headers"; + # homepage = "https://github.com/tokuhirom/HTTP-Headers-Fast"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPLite = buildPerlPackage { + # pname = "HTTP-Lite"; + # version = "2.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/HTTP-Lite-2.44.tar.gz"; + # hash = "sha256-OOQ9eRHPwU46OPA4K2zHptVZMH0jsQnOc6x9JKmz53w="; + # }; + # buildInputs = [ CGI ]; + # meta = { + # description = "Lightweight HTTP implementation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + HTTPMessage = buildPerlPackage { + pname = "HTTP-Message"; + version = "6.45"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/HTTP-Message-6.45.tar.gz"; + hash = "sha256-AcuEBmEqP3OIQtHpcxOuTYdIcNG41tZjMfFgAJQ9TL4="; + }; + buildInputs = [ TestNeeds TryTiny ]; + propagatedBuildInputs = [ Clone EncodeLocale HTTPDate IOHTML LWPMediaTypes URI ]; + meta = { + description = "HTTP style message (base class)"; + homepage = "https://github.com/libwww-perl/HTTP-Message"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # HTTPMultiPartParser = buildPerlPackage { + # pname = "HTTP-MultiPartParser"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/HTTP-MultiPartParser-0.02.tar.gz"; + # hash = "sha256-Xt3aFZ9U0W+GjgMkQKwrAk5VqsSJMYcbYmJ/GhbQCxI="; + # }; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "HTTP MultiPart Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + HTTPNegotiate = buildPerlPackage { + pname = "HTTP-Negotiate"; + version = "6.01"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GA/GAAS/HTTP-Negotiate-6.01.tar.gz"; + hash = "sha256-HHKcHqYxAOh4QFzafWb5rf0+1PHWysrKDukVLfco4BY="; + }; + propagatedBuildInputs = [ HTTPMessage ]; + meta = { + description = "Choose a variant to serve"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # HTTPParserXS = buildPerlPackage { + # pname = "HTTP-Parser-XS"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/HTTP-Parser-XS-0.17.tar.gz"; + # hash = "sha256-eU5oM+MmsQ0kNp+c2/wWZxBe9lkej0HlYaPUGnAnqAk="; + # }; + # meta = { + # description = "A fast, primitive HTTP request parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPProxy = buildPerlPackage { + # pname = "HTTP-Proxy"; + # version = "0.304"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/HTTP-Proxy-0.304.tar.gz"; + # hash = "sha256-sFKQU07HNiXCGgVl/DUXCJDasWOEPZUzHCksI/UExp0="; + # }; + # propagatedBuildInputs = [ LWP ]; + # # tests fail because they require network access + # doCheck = false; + # meta = { + # description = "A pure Perl HTTP proxy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPRequestAsCGI = buildPerlPackage { + # pname = "HTTP-Request-AsCGI"; + # version = "1.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FL/FLORA/HTTP-Request-AsCGI-1.2.tar.gz"; + # hash = "sha256-lFv7B8bRr1J3P7eEW6YuOnQRGzXL0tXkPvgxnlWsvOo="; + # }; + # propagatedBuildInputs = [ ClassAccessor HTTPMessage ]; + # meta = { + # description = "Set up a CGI environment from an HTTP::Request"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPResponseEncoding = buildPerlPackage { + # pname = "HTTP-Response-Encoding"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANKOGAI/HTTP-Response-Encoding-0.06.tar.gz"; + # hash = "sha256-EBZ7jiOKaCAEqw16zL6dduri21evB8WuLfqAgHSkqKo="; + # }; + # propagatedBuildInputs = [ HTTPMessage ]; + # buildInputs = [ LWP ]; + # meta = { + # description = "Adds encoding() to HTTP::Response"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPServerSimple = buildPerlPackage { + # pname = "HTTP-Server-Simple"; + # version = "0.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/HTTP-Server-Simple-0.52.tar.gz"; + # hash = "sha256-2JOfpPEr1rjAQ1N/0L+WsFWsNoa5zdn6dz3KauZ5y0w="; + # }; + # doCheck = false; + # propagatedBuildInputs = [ CGI ]; + # meta = { + # description = "Lightweight HTTP server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPServerSimpleAuthen = buildPerlPackage { + # pname = "HTTP-Server-Simple-Authen"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/HTTP-Server-Simple-Authen-0.04.tar.gz"; + # hash = "sha256-Ld3Iq53ImGmAFR5LqDamu/CR9Fzxlb4XaOvbSpk+1Zs="; + # }; + # propagatedBuildInputs = [ AuthenSimple HTTPServerSimple ]; + # meta = { + # description = "Authentication plugin for HTTP::Server::Simple"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPServerSimpleMason = buildPerlPackage { + # pname = "HTTP-Server-Simple-Mason"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JESSE/HTTP-Server-Simple-Mason-0.14.tar.gz"; + # hash = "sha256-t6Sdjm5Vv/Cx8CeNlRaFRmsUMkO2+eWeBx9UcsoqAlo="; + # }; + # propagatedBuildInputs = [ HTMLMason HTTPServerSimple HookLexWrap ]; + # meta = { + # description = "A simple mason server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPServerSimplePSGI = buildPerlPackage { + # pname = "HTTP-Server-Simple-PSGI"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/HTTP-Server-Simple-PSGI-0.16.tar.gz"; + # hash = "sha256-X3zLhFMEO5cnhJKnVzKBFuEeA1LyhUooqcY05ukTHbo="; + # }; + # propagatedBuildInputs = [ HTTPServerSimple ]; + # meta = { + # description = "Perl Web Server Gateway Interface Specification"; + # homepage = "https://github.com/miyagawa/HTTP-Server-Simple-PSGI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # HTTPTinyCache = buildPerlPackage { + # pname = "HTTP-Tiny-Cache"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/HTTP-Tiny-Cache-0.002.tar.gz"; + # hash = "sha256-c323zxncN4By2Rysdnh/sorNg8DRB85OTrS708kRhiE="; + # }; + # propagatedBuildInputs = [ FileUtilTempdir Logger ]; + # meta = { + # description = "Cache HTTP::Tiny responses"; + # homepage = "https://metacpan.org/release/HTTP-Tiny-Cache"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # HTTPTinyish = buildPerlPackage { + # pname = "HTTP-Tinyish"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/HTTP-Tinyish-0.18.tar.gz"; + # hash = "sha256-gDgLjTPGv6lrsBBPpqQcJ9zE6cg6SN8frTkJf1/c/eU="; + # }; + # propagatedBuildInputs = [ FileWhich IPCRun3 ]; + # meta = { + # description = "HTTP::Tiny compatible HTTP client wrappers"; + # homepage = "https://github.com/miyagawa/HTTP-Tinyish"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # iCalParser = buildPerlPackage { + # pname = "iCal-Parser"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RI/RIXED/iCal-Parser-1.21.tar.gz"; + # hash = "sha256-DXk5pkSo5nAX7HI509lgTzmGu5pP+Avmj+cpnr/SJww="; + # }; + # propagatedBuildInputs = [ DateTimeFormatICal FreezeThaw IOString TextvFileasData ]; + # meta = { + # description = "Parse iCalendar files into a data structure"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ImagePNGLibpng = buildPerlPackage { + # pname = "Image-PNG-Libpng"; + # version = "0.57"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BK/BKB/Image-PNG-Libpng-0.56.tar.gz"; + # hash = "sha256-+vu/6/9CP3u4XvJ6MEH7YpG1AzbHpYIiSlysQzHDx9k="; + # }; + # buildInputs = [ pkgs.libpng ]; + # meta = { + # description = "Perl interface to libpng"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pnginspect"; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.ImagePNGLibpng.x86_64-darwin + # }; + # }; + + # Imager = buildPerlPackage { + # pname = "Imager"; + # version = "1.019"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TONYC/Imager-1.019.tar.gz"; + # hash = "sha256-dNRNcBwfFPxLmE+toelVcmtQTC2LBtJl56hh+llDy0g="; + # }; + # buildInputs = [ pkgs.freetype pkgs.fontconfig pkgs.libjpeg pkgs.libpng ]; + # makeMakerFlags = [ "--incpath ${pkgs.libjpeg.dev}/include" "--libpath ${pkgs.libjpeg.out}/lib" "--incpath" "${pkgs.libpng.dev}/include" "--libpath" "${pkgs.libpng.out}/lib" ]; + # meta = { + # description = "Perl extension for Generating 24 bit Images"; + # homepage = "http://imager.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ImagerQRCode = buildPerlPackage { + # pname = "Imager-QRCode"; + # version = "0.035"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KU/KURIHARA/Imager-QRCode-0.035.tar.gz"; + # hash = "sha256-KoSN66Kes5QsRHCaaFPjGKyrDEaMv+27m6rlR2ADJRM="; + # }; + # propagatedBuildInputs = [ Imager ]; + # meta = { + # description = "Generate QR Code with Imager using libqrencode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # ImageInfo = buildPerlPackage { + # pname = "Image-Info"; + # version = "1.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SREZIC/Image-Info-1.44.tar.gz"; + # hash = "sha256-y3/GXdHv/gHrR8HHmlLdFlT0KOOpfbHvI7EmzgFjbw0="; + # }; + # propagatedBuildInputs = [ IOStringy ]; + # meta = { + # description = "Extract meta information from image files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ImageSane = buildPerlPackage { + # pname = "Image-Sane"; + # version = "5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RATCLIFFE/Image-Sane-5.tar.gz"; + # hash = "sha256-Ipqg6fBJ76dg88L25h2dU5r0PY92S1Cm4DBktHKaNf8="; + # }; + # buildInputs = [ pkgs.sane-backends ExtUtilsDepends ExtUtilsPkgConfig TestRequires TryTiny ]; + # propagatedBuildInputs = [ ExceptionClass Readonly ]; + # meta = { + # description = "Perl extension for the SANE (Scanner Access Now Easy) Project"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ImageScale = buildPerlPackage { + # pname = "Image-Scale"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AG/AGRUNDMA/Image-Scale-0.14.tar.gz"; + # hash = "sha256-8JxfBmO4dzg2WsKBnhhrkJq+ue2F2DvBXudocslHzfg="; + # }; + # buildInputs = [ pkgs.libpng pkgs.libjpeg TestNoWarnings ]; + # propagatedBuildInputs = [ pkgs.zlib ]; + # makeMakerFlags = [ "--with-jpeg-includes=${pkgs.libjpeg.dev}/include" "--with-jpeg-libs=${pkgs.libjpeg.out}/lib" "--with-png-includes=${pkgs.libpng.dev}/include" "--with-png-libs=${pkgs.libpng.out}/lib" ]; + # meta = { + # description = "Fast, high-quality fixed-point image resizing"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # ImageSize = buildPerlPackage { + # pname = "Image-Size"; + # version = "3.300"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJRAY/Image-Size-3.300.tar.gz"; + # hash = "sha256-U8mx+GUxzeBg7mNwnR/ac8q8DPLVgdKbIrAUeBufAms="; + # }; + # buildInputs = [ ModuleBuild ]; + # meta = { + # description = "A library to extract height/width from images"; + # homepage = "https://search.cpan.org/dist/Image-Size"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "imgsize"; + # }; + # }; + + # ImageOCRTesseract = buildPerlPackage { + # pname = "Image-OCR-Tesseract"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEOCHARRE/Image-OCR-Tesseract-1.26.tar.gz"; + # hash = "sha256-mNkEJmpwYvCcm0b3fE6UUp4f6ZM54/g/2h+SAT8AfOo="; + # }; + # nativeBuildInputs = [ pkgs.which pkgs.makeWrapper pkgs.tesseract pkgs.imagemagick ]; + # propagatedBuildInputs = [ FileFindRule FileWhich LEOCHARRECLI StringShellQuote ]; + # postPatch = '' + # substituteInPlace lib/Image/OCR/Tesseract.pm \ + # --replace "which('tesseract')" "\"${pkgs.tesseract}/bin/tesseract\"" \ + # --replace "which('convert')" "\"${pkgs.imagemagick}/bin/convert"\" + # ''; + # postInstall = '' + # wrapProgram $out/bin/ocr --prefix PATH : ${lib.makeBinPath [ pkgs.tesseract pkgs.imagemagick ]} + # ''; + # meta = { + # description = "Read an image with tesseract ocr and get output"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "ocr"; + # }; + # }; + + # IMAPClient = buildPerlPackage { + # pname = "IMAP-Client"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CONTEB/IMAP-Client-0.13.tar.gz"; + # hash = "sha256-inovpVt1qFPEgBQXeDk62sKUts0gfN9UFA9nwS8kypU="; + # }; + # doCheck = false; # nondeterministic + # meta = { + # description = "Advanced manipulation of IMAP services w/ referral support"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Importer = buildPerlPackage { + # pname = "Importer"; + # version = "0.026"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Importer-0.026.tar.gz"; + # hash = "sha256-4I+oThPLmYt6iX/I7Jw0WfzBcWr/Jcw0Pjbvh1iRsO8="; + # }; + # meta = { + # description = "Alternative but compatible interface to modules that export symbols"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ImportInto = buildPerlPackage { + # pname = "Import-Into"; + # version = "1.002005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Import-Into-1.002005.tar.gz"; + # hash = "sha256-vZ53o/tmK0C0OxjTKAzTUu35+tjZQoPlGBgcwc6fBWc="; + # }; + # propagatedBuildInputs = [ ModuleRuntime ]; + # meta = { + # description = "Import packages into other packages"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IO = buildPerlPackage { + # pname = "IO"; + # version = "1.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/IO-1.51.tar.gz"; + # hash = "sha256-VJPqVZmHKM0rfsuCNMWPtdXfJwmNDwet3KIkRNdhbOA="; + # }; + # doCheck = false; + # meta = { + # description = "Perl core IO modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOAIO = buildPerlPackage { + # pname = "IO-AIO"; + # version = "4.73"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/IO-AIO-4.73.tar.gz"; + # hash = "sha256-mltHx4Ak+rdmPR5a90ob6rRQ19Y7poV+MbP9gobkrFo="; + # }; + # buildInputs = [ CanaryStability ]; + # propagatedBuildInputs = [ commonsense ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/treescan + # ''; + # meta = { + # description = "Asynchronous/Advanced Input/Output"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "treescan"; + # }; + # }; + + # IOAll = buildPerlPackage { + # pname = "IO-All"; + # version = "0.87"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/IO-All-0.87.tar.gz"; + # hash = "sha256-VOIdJQwCKRJ+MLd6NGHhAHeFTsJE8m+2cPG0Re1MTVs="; + # }; + # meta = { + # description = "IO::All of it to Graham and Damian!"; + # homepage = "https://github.com/ingydotnet/io-all-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOAsync = buildPerlModule { + # pname = "IO-Async"; + # version = "0.802"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/IO-Async-0.802.tar.gz"; + # hash = "sha256-5YJzFXd2fEfqxDXvKQRmPUp1Cw5oAqSmGJo38Mswhzg"; + # }; + # preCheck = "rm t/50resolver.t"; # this test fails with "Temporary failure in name resolution" in sandbox + # propagatedBuildInputs = [ Future StructDumb ]; + # buildInputs = [ TestFatal TestFutureIOImpl TestIdentity TestMetricsAny TestRefcount ]; + # meta = { + # description = "Asynchronous event-driven programming"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOAsyncSSL = buildPerlModule { + # pname = "IO-Async-SSL"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/IO-Async-SSL-0.25.tar.gz"; + # hash = "sha256-Te9IXbHv9OE5tLWRIgLA/WHDrtLOw1vVq4v3u9g/WnU="; + # }; + # buildInputs = [ TestIdentity ]; + # propagatedBuildInputs = [ Future IOAsync IOSocketSSL ]; + # meta = { + # description = "Use SSL/TLS with IO::Async"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # IOCapture = buildPerlPackage { + # pname = "IO-Capture"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REYNOLDS/IO-Capture-0.05.tar.gz"; + # hash = "sha256-wsFaJUynT7jFfSXXtsvK/3ejtPtWlUI/H4C7Qjq//qk="; + # }; + # meta = { + # description = "Abstract Base Class to build modules to capture output"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOCaptureOutput = buildPerlPackage { + # pname = "IO-CaptureOutput"; + # version = "1.1105"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/IO-CaptureOutput-1.1105.tar.gz"; + # hash = "sha256-rpkAn8oSc4APFp7LgvTtHMbHZ5XxVr7lwAkwBdVy9Ic="; + # }; + # meta = { + # description = "(DEPRECATED) capture STDOUT and STDERR from Perl code, subprocesses or XS"; + # homepage = "https://github.com/dagolden/IO-CaptureOutput"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOCompress = buildPerlPackage { + # pname = "IO-Compress"; + # version = "2.206"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMQS/IO-Compress-2.206.tar.gz"; + # hash = "sha256-fTBiuaSU91fo0GFPIg2D8icxu9oa6198/w5yqD9DPTU="; + # }; + # propagatedBuildInputs = [ CompressRawBzip2 CompressRawZlib ]; + # # Same as CompressRawZlib + # doCheck = false && !stdenv.isDarwin; + # meta = { + # description = "IO Interface to compressed data files/buffers"; + # homepage = "https://github.com/pmqs/IO-Compress"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "streamzip"; + # }; + # }; + + # IODigest = buildPerlPackage { + # pname = "IO-Digest"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CL/CLKAO/IO-Digest-0.11.tar.gz"; + # hash = "sha256-j/z4Wn9iE+XpQUCtzCsXntAkmOrchDCUV+kE3sk/f5I="; + # }; + # propagatedBuildInputs = [ PerlIOviadynamic ]; + # meta = { + # description = "Calculate digests while reading or writing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + IOHTML = buildPerlPackage { + pname = "IO-HTML"; + version = "1.004"; + src = fetchurl { + url = "mirror://cpan/authors/id/C/CJ/CJM/IO-HTML-1.004.tar.gz"; + hash = "sha256-yHst9ZRju/LDlZZ3PftcA73g9+EFGvM5+WP1jBy9i/U="; + }; + meta = { + description = "Open an HTML file with automatic charset detection"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # IOHandleUtil = buildPerlModule { + # pname = "IO-Handle-Util"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/IO-Handle-Util-0.02.tar.gz"; + # hash = "sha256-jblmqRPaxORkIwcCqiIr84r+ISGT5ja8DzzGUbrezO4="; + # }; + # propagatedBuildInputs = [ IOString SubExporter asa ]; + # buildInputs = [ ModuleBuildTiny TestSimple13 ]; + # meta = { + # description = "Functions for working with IO::Handle like objects"; + # homepage = "https://github.com/karenetheridge/IO-Handle-Util"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOInterface = buildPerlModule { + # pname = "IO-Interface"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LD/LDS/IO-Interface-1.09.tar.gz"; + # hash = "sha256-5j6BxS6x4OYOwtmD9VUtJJPhFxeZJclnV/I8S9n6cTo="; + # }; + # meta = { + # description = "Access and modify network interface card configuration"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOInteractive = buildPerlPackage { + # pname = "IO-Interactive"; + # version = "1.025"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/IO-Interactive-1.025.tar.gz"; + # hash = "sha256-yh7G+6t6AnXdLpz2e3yw4ARYY/MVMyEMfcVEYxtqqqc="; + # }; + # meta = { + # description = "Utilities for interactive I/O"; + # homepage = "https://github.com/briandfoy/io-interactive"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # IOInteractiveTiny = buildPerlPackage { + # pname = "IO-Interactive-Tiny"; + # version = "0.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DM/DMUEY/IO-Interactive-Tiny-0.2.tar.gz"; + # hash = "sha256-RcBpZQXH5DR4RfXNJRK3sbx4+85MvtK1gAgoP8lepfk="; + # }; + # meta = { + # description = "Is_interactive() without large deps"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # IOLockedFile = buildPerlPackage { + # pname = "IO-LockedFile"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RANI/IO-LockedFile-0.23.tar.gz"; + # hash = "sha256-sdt+amvxvh4GFabstc6+eLAOKHsSfVhW0/FrNd1H+LU="; + # }; + # meta = { + # description = "Supply object methods for locking files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOMultiplex = buildPerlPackage { + # pname = "IO-Multiplex"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBB/IO-Multiplex-1.16.tar.gz"; + # hash = "sha256-dNIsRLWtLnGQ4nhuihfXS79M74m00RV7ozWYtaJyDa0="; + # }; + # meta = { + # description = "Supply object methods for locking files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOPager = buildPerlPackage { + # version = "2.10"; + # pname = "IO-Pager"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JP/JPIERCE/IO-Pager-2.10.tgz"; + # hash = "sha256-vLTYwtKAyANLglkcwLnrZ6AE+QzpqgWXn8YHEwessZU="; + # }; + # propagatedBuildInputs = [ pkgs.more FileWhich TermReadKey ]; # `more` used in tests + # meta = { + # description = "Select a pager (possibly perl-based) & pipe it text if a TTY"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "tp"; + # }; + # }; + + # IOPty = buildPerlModule { + # pname = "IO-Pty"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/IO-Tty-1.16.tar.gz"; + # hash = "sha256-jxoJwHBzitxpXfkD8uf3QwjdjZkbkUwLw5Cg5gISlN0="; + # }; + # buildPhase = "make"; + # checkPhase = "make test"; + # installPhase = "make install"; + # meta = { + # homepage = "https://github.com/toddr/IO-Tty"; + # description = "Pseudo TTY object class"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOPrompt = buildPerlModule { + # pname = "IO-Prompt"; + # version = "0.997004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCONWAY/IO-Prompt-0.997004.tar.gz"; + # hash = "sha256-8XuzBe5qyLWyA+bYJuuUDE8/bW9L/nGcOzoiX0b1hhU="; + # }; + # propagatedBuildInputs = [ TermReadKey Want ]; + # doCheck = false; # needs access to /dev/tty + # meta = { + # description = "Interactively prompt for user input"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOSessionData = buildPerlPackage { + # pname = "IO-SessionData"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/IO-SessionData-1.03.tar.gz"; + # hash = "sha256-ZKRxKj7bs/0QIw2ylsKcjGbwZq37wMPfakglj+85Ld0="; + # }; + # outputs = [ "out" "dev" ]; # no "devdoc" + # meta = { + # description = "Supporting module for SOAP::Lite"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOSocketINET6 = buildPerlModule { + # pname = "IO-Socket-INET6"; + # version = "2.73"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/IO-Socket-INET6-2.73.tar.gz"; + # hash = "sha256-ttp0aFMlPVtKxDGRtPaaRxlZXuE6fKZ2qAVM825tFrs="; + # }; + # propagatedBuildInputs = [ Socket6 ]; + # doCheck = false; + # meta = { + # description = "[DEPRECATED] Object interface for AF_INET/AF_INET6 domain sockets"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + IOSocketSSL = buildPerlPackage { + pname = "IO-Socket-SSL"; + version = "2.083"; + src = fetchurl { + url = "mirror://cpan/authors/id/S/SU/SULLR/IO-Socket-SSL-2.083.tar.gz"; + hash = "sha256-kE7yh2VECpfYqaDfWX+MPX88sKBT0bCCwQvtA7yAIGk="; + }; + propagatedBuildInputs = [ MozillaCA NetSSLeay ]; + # Fix path to default certificate store. + postPatch = '' + substituteInPlace lib/IO/Socket/SSL.pm \ + --replace "\$openssldir/cert.pem" "/etc/ssl/certs/ca-certificates.crt" + ''; + doCheck = false; # tries to connect to facebook.com etc. + meta = { + description = "Nearly transparent SSL encapsulation for IO::Socket::INET"; + homepage = "https://github.com/noxxi/p5-io-socket-ssl"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # IOSocketTimeout = buildPerlModule { + # pname = "IO-Socket-Timeout"; + # version = "0.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAMS/IO-Socket-Timeout-0.32.tar.gz"; + # hash = "sha256-7fkV1sxmvuQ1A6ptwrNzNm846v9wFYIYPa0Qy4rfKXI="; + # }; + # buildInputs = [ ModuleBuildTiny TestSharedFork TestTCP ]; + # propagatedBuildInputs = [ PerlIOviaTimeout ]; + # meta = { + # description = "IO::Socket with read/write timeout"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOString = buildPerlPackage { + # pname = "IO-String"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/IO-String-1.08.tar.gz"; + # hash = "sha256-Kj9K2EQtkHB4DljvQ3ItGdHuIagDv3yCBod6EEgt5aA="; + # }; + # meta = { + # description = "Emulate file interface for in-core strings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOStringy = buildPerlPackage { + # pname = "IO-Stringy"; + # version = "2.113"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CAPOEIRAB/IO-Stringy-2.113.tar.gz"; + # hash = "sha256-USIPyvn2amObadJR17B1e/QgL0+d69Rb3TQaaspi/k4="; + # }; + # meta = { + # description = "I/O on in-core objects like strings and arrays"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOStty = buildPerlModule { + # pname = "IO-Stty"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/IO-Stty-0.04.tar.gz"; + # hash = "sha256-XJUJ8ahpPYKH+gE97wv4eqZM2ScThGHvjetVUDxmUcI="; + # }; + # buildPhase = "make"; + # checkPhase = "make test"; + # installPhase = "make install"; + # meta = { + # description = "Change and print terminal line settings"; + # homepage = "https://wiki.github.com/toddr/IO-Stty"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOTee = buildPerlPackage { + # pname = "IO-Tee"; + # version = "0.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/IO-Tee-0.66.tar.gz"; + # hash = "sha256-LZznIGUW+cMIY6NnqhwrmzVwLjabCrqhX5n7LMCFUuA="; + # }; + # meta = { + # description = "Multiplex output to multiple output handles"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOTieCombine = buildPerlPackage { + # pname = "IO-TieCombine"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/IO-TieCombine-1.005.tar.gz"; + # hash = "sha256-QC1NuDALPScWMvSZXgreMp2JKAp+R/K634s4r25Vaa8="; + # }; + # meta = { + # description = "Produce tied (and other) separate but combined variables"; + # homepage = "https://github.com/rjbs/IO-TieCombine"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOTty = buildPerlPackage { + # pname = "IO-Tty"; + # version = "1.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/IO-Tty-1.17.tar.gz"; + # hash = "sha256-pfGoMCC8W13WwbVw9Ix1RuCo9/rBCgaHQLA5Ja2eFOg="; + # }; + # patches = [ ./perl-modules/IO-Tty-fix-makefile.patch ]; + # doCheck = !stdenv.isDarwin; # openpty fails in the sandbox + # meta = { + # description = "Low-level allocate a pseudo-Tty, import constants"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IPCConcurrencyLimit = buildPerlPackage { + # pname = "IPC-ConcurrencyLimit"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTK/IPC-ConcurrencyLimit-0.17.tar.gz"; + # hash = "sha256-Lk11vlLpD8YFg31ajp+yacCofdPTYfMBLA/5Sl+9z+8="; + # }; + # buildInputs = [ ExtUtilsMakeMaker ]; + # propagatedBuildInputs = [ FilePath IO ]; + # meta = { + # description = "Lock-based limits on cooperative multi-processing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IPCountry = buildPerlPackage { + # pname = "IP-Country"; + # version = "2.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NW/NWETTERS/IP-Country-2.28.tar.gz"; + # hash = "sha256-iNuDOlqyLtBstT1vIFcl47U3GyVFlgU3OIhekfoQX3U="; + # }; + # propagatedBuildInputs = [ GeographyCountries ]; + # meta = { + # description = "Fast lookup of country codes from IP addresses"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "ip2cc"; + # }; + # }; + + # GeographyCountries = buildPerlPackage { + # pname = "Geography-Countries"; + # version = "2009041301"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABIGAIL/Geography-Countries-2009041301.tar.gz"; + # hash = "sha256-SMQuQOgoG6fJgXQ6hUxI5t7y1R6wkl6myW4lx0SX8g8="; + # }; + # meta = { + # description = "2-letter, 3-letter, and numerical codes for countries"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + + # IPCRun = buildPerlPackage { + # pname = "IPC-Run"; + # version = "20231003.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/IPC-Run-20231003.0.tar.gz"; + # hash = "sha256-6yW731kT0pF5fvG/6ZjxUTC0VdPtAqrN5oVvCyXk/lc="; + # }; + # doCheck = false; /* attempts a network connection to localhost */ + # propagatedBuildInputs = [ IOTty ]; + # buildInputs = [ Readonly ]; + # meta = { + # description = "System() and background procs w/ piping, redirs, ptys (Unix, Win32)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IPCRun3 = buildPerlPackage { + # pname = "IPC-Run3"; + # version = "0.048"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/IPC-Run3-0.048.tar.gz"; + # hash = "sha256-PYHDzBtc/2nMqTYeLG443wNSJRrntB4v8/68hQ5GNWU="; + # }; + # meta = { + # description = "Run a subprocess with input/output redirection"; + # license = with lib.licenses; [ artistic1 gpl1Plus bsd3 ]; + # }; + # }; + + # IPCShareLite = buildPerlPackage { + # pname = "IPC-ShareLite"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AN/ANDYA/IPC-ShareLite-0.17.tar.gz"; + # hash = "sha256-FNQGuR2pbWUh0NGoLSKjBidHZSJrhrClbn/93Plq578="; + # }; + # meta = { + # description = "Lightweight interface to shared memory"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IPCSystemSimple = buildPerlPackage { + # pname = "IPC-System-Simple"; + # version = "1.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JK/JKEENAN/IPC-System-Simple-1.30.tar.gz"; + # hash = "sha256-Iub1IitQXuUTBY/co1q3oeq4BTm5jlykqSOnCorpup4="; + # }; + # meta = { + # description = "Run commands simply, with detailed diagnostics"; + # homepage = "http://thenceforward.net/perl/modules/IPC-System-Simple"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IPCSysV = buildPerlPackage { + # pname = "IPC-SysV"; + # version = "2.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MH/MHX/IPC-SysV-2.09.tar.gz"; + # hash = "sha256-GJdUHHTVSP0QB+tsB/NBnTx1ddgFamK1ulJwohZtLb0="; + # }; + # meta = { + # description = "System V IPC constants and system calls"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IRCUtils = buildPerlPackage { + # pname = "IRC-Utils"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HI/HINRIK/IRC-Utils-0.12.tar.gz"; + # hash = "sha256-x9YxHrbHnpg4M8nmtOjUJtB6mHTSD0vGQbMTuZybyKA="; + # }; + # meta = { + # description = "Common utilities for IRC-related tasks"; + # homepage = "https://metacpan.org/release/IRC-Utils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # ImageExifTool = callPackage ./perl-modules/ImageExifTool { }; + + # Inline = buildPerlPackage { + # pname = "Inline"; + # version = "0.86"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Inline-0.86.tar.gz"; + # hash = "sha256-UQp94tARsNuAsIdOjA9zkAEJkQAK4TXP90dN8ebVHjo="; + # }; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Write Perl Subroutines in Other Programming Languages"; + # longDescription = '' + # The Inline module allows you to put source code from other + # programming languages directly "inline" in a Perl script or + # module. The code is automatically compiled as needed, and then loaded + # for immediate access from Perl. + # ''; + # homepage = "https://github.com/ingydotnet/inline-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # InlineC = buildPerlPackage { + # pname = "Inline-C"; + # version = "0.82"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/Inline-C-0.82.tar.gz"; + # hash = "sha256-EPvPHhWNHI134d2TTjeRZbEmpFwTZFrQvp3AfRUd0Mw="; + # }; + # buildInputs = [ FileCopyRecursive TestWarn YAMLLibYAML ]; + # propagatedBuildInputs = [ Inline ParseRecDescent Pegex ]; + # postPatch = '' + # # this test will fail with chroot builds + # rm -f t/08taint.t + # rm -f t/28autowrap.t + # ''; + # meta = { + # description = "C Language Support for Inline"; + # homepage = "https://github.com/ingydotnet/inline-c-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # InlineJava = buildPerlPackage { + # pname = "Inline-Java"; + # version = "0.67"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/Inline-Java-0.67.tar.gz"; + # hash = "sha256-9YVLMcvOFjwz4mJN0jFODA2X4JRDcbcYjlkBuj9vpMk="; + # }; + + # buildInputs = [ FileWhich ]; + # propagatedBuildInputs = [ Inline ]; + + # # TODO: upgrade https://github.com/NixOS/nixpkgs/pull/89731 + # makeMakerFlags = [ "J2SDK=${pkgs.jdk8}" ]; + + # # FIXME: Apparently tests want to access the network. + # doCheck = false; + + # meta = { + # description = "Write Perl classes in Java"; + # longDescription = '' + # The Inline::Java module allows you to put Java source code directly + # "inline" in a Perl script or module. A Java compiler is launched and + # the Java code is compiled. Then Perl asks the Java classes what + # public methods have been defined. These classes and methods are + # available to the Perl program as if they had been written in Perl. + # ''; + # license = with lib.licenses; [ artistic2 ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.InlineJava.x86_64-darwin + # }; + # }; + + # IPCSignal = buildPerlPackage { + # pname = "IPC-Signal"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROSCH/IPC-Signal-1.00.tar.gz"; + # hash = "sha256-fCH5yMLQwPDw9G533nw9h53VYmaN3wUlh1w4zvIHb9A="; + # }; + # meta = { + # description = "Utility functions dealing with signals"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JavaScriptMinifierXS = buildPerlPackage { + # pname = "JavaScript-Minifier-XS"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GT/GTERMARS/JavaScript-Minifier-XS-0.15.tar.gz"; + # hash = "sha256-XZsDT1jwtv9bZGR708WpzgWypw7e4zn7wxc67nR8wFA="; + # }; + # buildInputs = [ TestDiagINC ]; + # perlPreHook = lib.optionalString (stdenv.isi686 || stdenv.isDarwin) "export LD=$CC"; + # meta = { + # description = "XS based JavaScript minifier"; + # homepage = "https://metacpan.org/release/JavaScript-Minifier-XS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JavaScriptValueEscape = buildPerlModule { + # pname = "JavaScript-Value-Escape"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/JavaScript-Value-Escape-0.07.tar.gz"; + # hash = "sha256-msvaNwjt4R9r6uXxEvGIw6kCOk0myOzYmqgru2kxo9w="; + # }; + # meta = { + # description = "Avoid XSS with JavaScript value interpolation"; + # homepage = "https://github.com/kazeburo/JavaScript-Value-Escape"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSON = buildPerlPackage { + # pname = "JSON"; + # version = "4.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/JSON-4.10.tar.gz"; + # hash = "sha256-34tRQ9mn3pnEe1XxoXC9H2n3EZNcGGptwKtW3QV1jjU="; + # }; + # # Do not abort cross-compilation on failure to load native JSON module into host perl + # preConfigure = lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + # substituteInPlace Makefile.PL --replace "exit 0;" "" + # ''; + # buildInputs = [ TestPod ]; + # meta = { + # description = "JSON (JavaScript Object Notation) encoder/decoder"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONAny = buildPerlPackage { + # pname = "JSON-Any"; + # version = "1.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/JSON-Any-1.40.tar.gz"; + # hash = "sha256-CDJWJVpICU/ZrBI54P6ooQojg6nNHvSxxyZO3htEAKs="; + # }; + # buildInputs = [ TestFatal TestNeeds TestWarnings TestWithoutModule ]; + # meta = { + # description = "(DEPRECATED) Wrapper Class for the various JSON classes"; + # homepage = "https://github.com/karenetheridge/JSON-Any"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONCreate = buildPerlPackage { + # pname = "JSON-Create"; + # version = "0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BK/BKB/JSON-Create-0.35.tar.gz"; + # hash = "sha256-X67+DYM7gTJWiGUwjzI5082qG4oezJtWJNzx774QaD4="; + # }; + # propagatedBuildInputs = [ JSONParse UnicodeUTF8 ]; + # meta = { + # description = "Create JSON"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONMaybeXS = buildPerlPackage { + # pname = "JSON-MaybeXS"; + # version = "1.004005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/JSON-MaybeXS-1.004005.tar.gz"; + # hash = "sha256-9ba8GfV55mtymfh0i4rD4XGTbcTn/LcqiiV6m9SCozE="; + # }; + # buildInputs = [ TestNeeds ]; + # meta = { + # description = "Use Cpanel::JSON::XS with a fallback to JSON::XS and JSON::PP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONPP = buildPerlPackage { + # pname = "JSON-PP"; + # version = "4.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/JSON-PP-4.16.tar.gz"; + # hash = "sha256-i8LxYrr8QmRcSJkFrXJUDw08KEs2DJYpkJUYPDDMl4k="; + # }; + # meta = { + # description = "JSON::XS compatible pure-Perl module"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "json_pp"; + # }; + # }; + + # JSONPPCompat5006 = buildPerlPackage { + # pname = "JSON-PP-Compat5006"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAKAMAKA/JSON-PP-Compat5006-1.09.tar.gz"; + # hash = "sha256-GXAw31JjX5u+Ja8QdC7qW9dJcUcxGMETEfyry2LjcWo="; + # }; + # meta = { + # description = "Helper module in using JSON::PP in Perl 5.6"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONParse = buildPerlPackage { + # pname = "JSON-Parse"; + # version = "0.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BK/BKB/JSON-Parse-0.62.tar.gz"; + # hash = "sha256-YnMYD5OSSXQB3dbYIHBvWqhsG+iIkd1qq02Qa1z/Ztk="; + # }; + # meta = { + # description = "Parse JSON"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "validjson"; + # }; + # }; + + # JSONValidator = buildPerlPackage { + # pname = "JSON-Validator"; + # version = "5.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/JSON-Validator-5.14.tar.gz"; + # hash = "sha256-YISl1AdeQhqTj/su6XuFBPqjXoZtD3tbWBETr17ijhs="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ Mojolicious YAMLLibYAML ]; + # meta = { + # description = "Validate data against a JSON schema"; + # homepage = "https://github.com/mojolicious/json-validator"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # JSONWebToken = buildPerlModule { + # pname = "JSON-WebToken"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAICRON/JSON-WebToken-0.10.tar.gz"; + # hash = "sha256-d8GCqYUo8XFNgq/FSNWztNyT5nBpEou5uUE/JM8HJIs="; + # }; + # buildInputs = [ TestMockGuard TestRequires ]; + # propagatedBuildInputs = [ JSON ModuleRuntime ]; + # meta = { + # description = "JSON Web Token (JWT) implementation"; + # homepage = "https://github.com/xaicron/p5-JSON-WebToken"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # JSONXS = buildPerlPackage { + # pname = "JSON-XS"; + # version = "4.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/JSON-XS-4.03.tar.gz"; + # hash = "sha256-UVU29F8voafojIgkUzdY0BIdJnq5y0U6G1iHyKVrkGg="; + # }; + # propagatedBuildInputs = [ TypesSerialiser ]; + # buildInputs = [ CanaryStability ]; + # meta = { + # description = "JSON serialising/deserialising, done correctly and fast"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "json_xs"; + # }; + # }; + + # JSONXSVersionOneAndTwo = buildPerlPackage { + # pname = "JSON-XS-VersionOneAndTwo"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LB/LBROCARD/JSON-XS-VersionOneAndTwo-0.31.tar.gz"; + # hash = "sha256-5gksTZYfrnd6z3/pn7PNbltxD+yFdlprkEF0gOTJSjQ="; + # }; + # propagatedBuildInputs = [ JSONXS ]; + # meta = { + # description = "Support versions 1 and 2 of JSON::XS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Later = buildPerlPackage { + # version = "0.21"; + # pname = "Object-Realize-Later"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/Object-Realize-Later-0.21.tar.gz"; + # hash = "sha256-j3uWQMyONOqSvPbAEEmgPBReDrRuViJ14o3d06jW2Nk="; + # }; + # meta = { + # description = "Delayed creation of objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LatexIndent = buildPerlPackage rec { + # pname = "latexindent.pl"; + # version = "3.21"; + + # src = fetchFromGitHub { + # owner = "cmhughes"; + # repo = pname; + # rev = "V${version}"; + # hash = "sha256-STXHOzsshyN7rc2VtJxxt6La4UPGpRYlMO8TX1Jd7pM="; + # }; + + # outputs = [ "out" ]; + + # propagatedBuildInputs = [ FileHomeDir YAMLTiny ]; + + # preBuild = '' + # patchShebangs ./latexindent.pl + # ''; + + # meta = { + # description = "Perl script to add indentation to LaTeX files"; + # homepage = "https://github.com/cmhughes/latexindent.pl"; + # license = lib.licenses.gpl3Plus; + # }; + # }; + + # LaTeXML = buildPerlPackage rec { + # pname = "LaTeXML"; + # version = "0.8.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BR/BRMILLER/${pname}-${version}.tar.gz"; + # hash = "sha256-fSu+LOJSuvhro/OIzQ3sOqSDj0nWErnsfMT/iBBbrcw="; + # }; + # outputs = [ "out" "tex" ]; + # propagatedBuildInputs = [ ArchiveZip DBFile FileWhich IOString ImageMagick ImageSize JSONXS LWP ParseRecDescent PodParser TextUnidecode XMLLibXSLT ]; + # nativeBuildInputs = [ pkgs.makeWrapper ] ++ lib.optional stdenv.isDarwin shortenPerlShebang; + # makeMakerFlags = [ "TEXMF=\${tex}" "NOMKTEXLSR" ]; + # # shebangs need to be patched before executables are copied to $out + # preBuild = '' + # patchShebangs bin/ + # '' + lib.optionalString stdenv.isDarwin '' + # for file in bin/*; do + # shortenPerlShebang "$file" + # done + # ''; + # postInstall = '' + # for file in latexmlc latexmlmath latexmlpost ; do + # # add runtime dependencies that cause silent failures when missing + # wrapProgram $out/bin/$file --prefix PATH : ${lib.makeBinPath [ pkgs.ghostscript pkgs.potrace ]} + # done + # ''; + # passthru = { + # tlType = "run"; + # pkgs = [ LaTeXML.tex ]; + # }; + # meta = { + # description = "Transforms TeX and LaTeX into XML/HTML/MathML"; + # homepage = "https://dlmf.nist.gov/LaTeXML/"; + # license = with lib.licenses; [ publicDomain ]; + # maintainers = with maintainers; [ xworld21 ]; + # mainProgram = "latexmlc"; + # }; + # }; + + # LEOCHARRECLI = buildPerlPackage { + # pname = "LEOCHARRE-CLI"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEOCHARRE/LEOCHARRE-CLI-1.19.tar.gz"; + # hash = "sha256-N4NfEe41MmJBtNMDaK4bwZWlBBSzZi2z4TuGW9Uvzek="; + # }; + # propagatedBuildInputs = [ FileWhich Filechmod LEOCHARREDebug Linuxusermod YAML ]; + # meta = { + # description = "Useful subs for coding cli scripts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LEOCHARREDebug = buildPerlPackage { + # pname = "LEOCHARRE-Debug"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEOCHARRE/LEOCHARRE-Debug-1.03.tar.gz"; + # hash = "sha256-wWZao6vUV8yGJLjEGMb4vfWPs6aG+O7VFc9+k1FN8ZI="; + # }; + # meta = { + # description = "Debug sub"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LexicalSealRequireHints = buildPerlModule { + # pname = "Lexical-SealRequireHints"; + # version = "0.012"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Lexical-SealRequireHints-0.012.tar.gz"; + # hash = "sha256-wyvcOOBvjWyQdlu74xaMNYJH2n2uhbgLqEotoXY3V90="; + # }; + # meta = { + # description = "Prevent leakage of lexical hints"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # libapreq2 = buildPerlPackage rec { + # pname = "libapreq2"; + # version = "2.17"; + # src = fetchurl { + # url = "mirror://apache/httpd/libapreq/${pname}-${version}.tar.gz"; + # hash = "sha256-BGSH8ITBL6HIIq/8X33lbv7ZtIkFpCbmMaa5ScEU2Gw="; + # }; + # outputs = [ "out" ]; + # buildInputs = [ pkgs.apacheHttpd pkgs.apr pkgs.aprutil ApacheTest ExtUtilsXSBuilder ]; + # propagatedBuildInputs = [ (pkgs.apacheHttpdPackages.mod_perl.override { inherit perl; }) ]; + # makeMakerFlags = [ + # "--with-apache2-src=${pkgs.apacheHttpd.dev}" + # "--with-apache2-apxs=${pkgs.apacheHttpd.dev}/bin/apxs" + # "--with-apache2-httpd=${pkgs.apacheHttpd.out}/bin/httpd" + # "--with-apr-config=${pkgs.apr.dev}/bin/apr-1-config" + # "--with-apu-config=${pkgs.aprutil.dev}/bin/apu-1-config" + # ]; + # preConfigure = '' + # # override broken prereq check + # substituteInPlace configure --replace "prereq_check=\"\$PERL \$PERL_OPTS build/version_check.pl\"" "prereq_check=\"echo\"" + # ''; + # preBuild = '' + # substituteInPlace apreq2-config --replace "dirname" "${pkgs.coreutils}/bin/dirname" + # ''; + # installPhase = '' + # mkdir $out + + # # install the library + # make install DESTDIR=$out + # cp -r $out/${pkgs.apacheHttpd.dev}/. $out/. + # cp -r $out/$out/. $out/. + + # # install the perl module + # pushd glue/perl + # perl Makefile.PL + # make install DESTDIR=$out + # cp -r $out/${perl}/lib/perl5 $out/lib/ + # popd + + # # install the apache module + # # https://computergod.typepad.com/home/2007/06/webgui_and_suse.html + # # NOTE: if using the apache module you must use "apreq" as the module name, not "apreq2" + # # services.httpd.extraModules = [ { name = "apreq"; path = "''${pkgs.perlPackages.libapreq2}/modules/mod_apreq2.so"; } ]; + # pushd module + # make install DESTDIR=$out + # cp -r $out/${pkgs.apacheHttpd.out}/modules $out/ + # popd + + # rm -r $out/nix + # ''; + # doCheck = false; # test would need to start apache httpd + # meta = { + # description = "Wrapper for libapreq2's module/handle API"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # libintl-perl = buildPerlPackage { + # pname = "libintl-perl"; + # version = "1.33"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GU/GUIDO/libintl-perl-1.33.tar.gz"; + # hash = "sha256-USbtqczQ7rENuC3e9jy8r329dx54zA+xEMw7WmuGeec="; + # }; + # meta = { + # description = "Portable l10n and i10n functions"; + # license = with lib.licenses; [ gpl3Only ]; + # }; + # }; + + libnet = buildPerlPackage { + pname = "libnet"; + version = "3.15"; + src = fetchurl { + url = "mirror://cpan/authors/id/S/SH/SHAY/libnet-3.15.tar.gz"; + hash = "sha256-px9NtYDhp2fWk2+qW6848fpheCQ0LaB4tWEoPob49KI="; + }; + meta = { + description = "Collection of network protocol modules"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # librelative = buildPerlPackage { + # pname = "lib-relative"; + # version = "1.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/lib-relative-1.002.tar.gz"; + # hash = "sha256-5EcCFRZ8QGkXYD54vk2TESz2kTzTQq64ALQS4BHIp4s="; + # }; + # meta = { + # description = "Add paths relative to the current file to @INC"; + # homepage = "https://github.com/Grinnz/lib-relative"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # libwwwperl = buildPerlPackage { + # pname = "libwww-perl"; + # version = "6.72"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OA/OALDERS/libwww-perl-6.72.tar.gz"; + # hash = "sha256-6bg1T9XiC+IHr+I93VhPzVm/gpmNwHfez2hLodrloF0="; + # }; + # buildInputs = [ HTTPDaemon TestFatal TestNeeds TestRequiresInternet ]; + # propagatedBuildInputs = [ EncodeLocale FileListing HTMLParser HTTPCookieJar HTTPCookies HTTPDate HTTPMessage HTTPNegotiate LWPMediaTypes NetHTTP TryTiny URI WWWRobotRules ]; + # meta = { + # homepage = "https://github.com/libwww-perl/libwww-perl"; + # description = "The World-Wide Web library for Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # libxml_perl = buildPerlPackage { + # pname = "libxml-perl"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KM/KMACLEOD/libxml-perl-0.08.tar.gz"; + # hash = "sha256-RXEFm3tdSLfOUrATieldeYv1zyAgUjwVP/J7SYFTycs="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "Collection of Perl modules for working with XML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENFindNumber = buildPerlPackage { + # pname = "Lingua-EN-FindNumber"; + # version = "1.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Lingua-EN-FindNumber-1.32.tar.gz"; + # hash = "sha256-HRdtHIY/uYRL0Z0sKk5ooO1z2hWPckqJQFuQ236NvQQ="; + # }; + # propagatedBuildInputs = [ LinguaENWords2Nums ]; + # meta = { + # description = "Locate (written) numbers in English text "; + # homepage = "https://github.com/neilb/Lingua-EN-FindNumber"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENInflect = buildPerlPackage { + # pname = "Lingua-EN-Inflect"; + # version = "1.905"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCONWAY/Lingua-EN-Inflect-1.905.tar.gz"; + # hash = "sha256-BcKew0guVyMTpg2iGBsLMMXbfPAfiudhatZ+G2YmMpY="; + # }; + # meta = { + # description = "Convert singular to plural. Select 'a' or 'an'"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENInflectNumber = buildPerlPackage { + # pname = "Lingua-EN-Inflect-Number"; + # version = "1.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Lingua-EN-Inflect-Number-1.12.tar.gz"; + # hash = "sha256-Zvszg4USdG9cWX6AJk/qZmQ/fyZXDsL5IFthNa1nrL8="; + # }; + # propagatedBuildInputs = [ LinguaENInflect ]; + # meta = { + # description = "Force number of words to singular or plural"; + # homepage = "https://github.com/neilbowers/Lingua-EN-Inflect-Number"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENInflectPhrase = buildPerlPackage { + # pname = "Lingua-EN-Inflect-Phrase"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/Lingua-EN-Inflect-Phrase-0.20.tar.gz"; + # hash = "sha256-VQWJEamfF1XePrRJqZ/765LYjAH/XcYFEaJGeQUN3qg="; + # }; + # buildInputs = [ TestNoWarnings ]; + # propagatedBuildInputs = [ LinguaENInflectNumber LinguaENNumberIsOrdinal LinguaENTagger ]; + # meta = { + # description = "Inflect short English Phrases"; + # homepage = "https://metacpan.org/release/Lingua-EN-Inflect-Phrase"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENNumberIsOrdinal = buildPerlPackage { + # pname = "Lingua-EN-Number-IsOrdinal"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/Lingua-EN-Number-IsOrdinal-0.05.tar.gz"; + # hash = "sha256-KNVpVADA9OK9IJeTy3T22iuSVzVqrLKUfGA0JeCWGNY="; + # }; + # buildInputs = [ TestFatal TryTiny ]; + # propagatedBuildInputs = [ LinguaENFindNumber ]; + # meta = { + # description = "Detect if English number is ordinal or cardinal"; + # homepage = "https://metacpan.org/release/Lingua-EN-Number-IsOrdinal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaENTagger = buildPerlPackage { + # pname = "Lingua-EN-Tagger"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AC/ACOBURN/Lingua-EN-Tagger-0.31.tar.gz"; + # hash = "sha256-lJ6Mh+SAj3uglrl5Ig/wgbvgO21XiQ0u7NS4Ouhy6ZM="; + # }; + # propagatedBuildInputs = [ HTMLParser LinguaStem MemoizeExpireLRU ]; + # meta = { + # description = "Part-of-speech tagger for English natural language processing"; + # license = with lib.licenses; [ gpl3Only ]; + # }; + # }; + + # LinguaENWords2Nums = buildPerlPackage { + # pname = "Lingua-EN-Words2Nums"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JO/JOEY/Lingua-EN-Words2Nums-0.18.tar.gz"; + # hash = "sha256-aGVWeXzSpOqgZvGbvwOrJcBieCksnq0vGH39kDHqHYU="; + # }; + # meta = { + # description = "Convert English text to numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaPTStemmer = buildPerlPackage { + # pname = "Lingua-PT-Stemmer"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Lingua-PT-Stemmer-0.02.tar.gz"; + # hash = "sha256-WW3wH4q3n//9RQ6Ug2pUQ3HYpMk6FffojqLxt5xGhJ0="; + # }; + # meta = { + # description = "Portuguese language stemming"; + # homepage = "https://github.com/neilb/Lingua-PT-Stemmer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaStem = buildPerlModule { + # pname = "Lingua-Stem"; + # version = "2.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SN/SNOWHARE/Lingua-Stem-2.31.tar.gz"; + # hash = "sha256-qhqZMrZCflmCU+YajM0NBMxVn66dWNh3TCAncItjAmQ="; + # }; + # doCheck = false; + # propagatedBuildInputs = [ LinguaPTStemmer LinguaStemFr LinguaStemIt LinguaStemRu LinguaStemSnowballDa SnowballNorwegian SnowballSwedish TextGerman ]; + # meta = { + # description = "Stemming of words"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaStemFr = buildPerlPackage { + # pname = "Lingua-Stem-Fr"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SD/SDP/Lingua-Stem-Fr-0.02.tar.gz"; + # hash = "sha256-nU9ks6iJihhTQyGFJtWsaKSh+ObEQY1rqV1i9fnV2W8="; + # }; + # meta = { + # description = "Perl French Stemming"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaStemIt = buildPerlPackage { + # pname = "Lingua-Stem-It"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AC/ACALPINI/Lingua-Stem-It-0.02.tar.gz"; + # hash = "sha256-OOZz+3T+ARWILlrbJnTesIH6tyHXKO4qgRQWPVDIB4g="; + # }; + # meta = { + # description = "Porter's stemming algorithm for Italian"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaStemRu = buildPerlPackage { + # pname = "Lingua-Stem-Ru"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Lingua-Stem-Ru-0.04.tar.gz"; + # hash = "sha256-EnDOt0dk/blYNwqAiDSvl26H9pqFRw+LxGJYeX6rUig="; + # }; + # meta = { + # description = "Porter's stemming algorithm for Russian (KOI8-R only)"; + # homepage = "https://github.com/neilb/Lingua-Stem-Ru"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LinguaStemSnowballDa = buildPerlPackage { + # pname = "Lingua-Stem-Snowball-Da"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CI/CINE/Lingua-Stem-Snowball-Da-1.01.tar.gz"; + # hash = "sha256-Ljm+TuAVx+xHwrBnhYAYp0BuONUSHWVcikaHSt+poFY="; + # }; + # meta = { + # description = "Porters stemming algorithm for Denmark"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # LinguaTranslit = buildPerlPackage { + # pname = "Lingua-Translit"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALINKE/Lingua-Translit-0.29.tar.gz"; + # hash = "sha256-GtL6vAB52tcIt9nVVDfJ67GS5hC/lgryWUWFi5JZd1I="; + # }; + # doCheck = false; + # meta = { + # description = "Transliterates text between writing systems"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "translit"; + # }; + # }; + + # LinkEmbedder = buildPerlPackage { + # pname = "LinkEmbedder"; + # version = "1.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/LinkEmbedder-1.20.tar.gz"; + # hash = "sha256-sd6LTiXHIplEOeesA0vorjeiCUijG/SF8iu0hvzI3KU="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "Embed / expand oEmbed resources and other URL / links"; + # homepage = "https://github.com/jhthorsen/linkembedder"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # LinuxACL = buildPerlPackage { + # pname = "Linux-ACL"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NA/NAZAROV/Linux-ACL-0.05.tar.gz"; + # hash = "sha256-MSlAwfYPR8T8k/oKnSpiZCX6qDcEDIwvGtWO4J9i83E="; + # }; + # buildInputs = [ pkgs.acl ]; + # NIX_CFLAGS_LINK = "-L${pkgs.acl.out}/lib -lacl"; + # meta = { + # description = "Perl extension for reading and setting Access Control Lists for files by libacl linux library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # LinuxDesktopFiles = buildPerlModule { + # pname = "Linux-DesktopFiles"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TR/TRIZEN/Linux-DesktopFiles-0.25.tar.gz"; + # hash = "sha256-YDd6dPupD6RlIA7hx0MNvd5p1FTYX57hAcA5gDoH5fU="; + # }; + # meta = { + # description = "Fast parsing of the Linux desktop files"; + # homepage = "https://github.com/trizen/Linux-DesktopFiles"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # LinuxDistribution = buildPerlModule { + # pname = "Linux-Distribution"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Linux-Distribution-0.23.tar.gz"; + # hash = "sha256-YD4n2mB7PocqZp16ZtdZgvCWkVPqstSyDDQTR7Tr2l8="; + # }; + # # The tests fail if the distro it's built on isn't in the supported list. + # # This includes NixOS. + # doCheck = false; + # meta = { + # description = "Perl extension to detect on which Linux distribution we are running"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; + # }; + # }; + + # LinuxFD = buildPerlModule { + # pname = "Linux-FD"; + # version = "0.014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Linux-FD-0.014.tar.gz"; + # hash = "sha256-eDHcJkxG2bh/dkNhdNdmFBRSQ2Mwg+CQqrTZo1LwQ60="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ SubExporter ]; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Linux specific special filehandles"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; + # }; + # }; + + # LinuxInotify2 = buildPerlPackage { + # pname = "Linux-Inotify2"; + # version = "2.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/Linux-Inotify2-2.3.tar.gz"; + # hash = "sha256-y5kVD5/6UdvDvl7pjY6RyYzf6uIuuI5xjyzzZ78nDRc="; + # }; + # propagatedBuildInputs = [ commonsense ]; + + # meta = { + # description = "Scalable directory/file change notification for Perl on Linux"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; + # }; + # }; + + # Linuxusermod = buildPerlPackage { + # pname = "Linux-usermod"; + # version = "0.69"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VI/VIDUL/Linux-usermod-0.69.tar.gz"; + # hash = "sha256-l8oYajxBa/ae1i2gRvGmDYjYm45u0lAIsvlueH3unWA="; + # }; + # meta = { + # description = "This module adds, removes and modify user and group accounts according to the passwd and shadow files syntax"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; + # }; + # }; + + # ListAllUtils = buildPerlPackage { + # pname = "List-AllUtils"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/List-AllUtils-0.19.tar.gz"; + # hash = "sha256-MKgUarIad4e4xW1YKc+afysVJ207P8oHM2rDjTAC/7w="; + # }; + # propagatedBuildInputs = [ ListSomeUtils ListUtilsBy ]; + # meta = { + # description = "Combines List::Util, List::SomeUtils and List::UtilsBy in one bite-sized package"; + # homepage = "https://metacpan.org/release/List-AllUtils"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ListBinarySearch = buildPerlPackage { + # pname = "List-BinarySearch"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVIDO/List-BinarySearch-0.25.tar.gz"; + # hash = "sha256-yBEwcb1gQANe6KsBzxtyqRBXQZLx0XkQKud1qXPy6Co="; + # }; + # meta = { + # description = "Binary Search within a sorted array"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ListCompare = buildPerlPackage { + # pname = "List-Compare"; + # version = "0.55"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JK/JKEENAN/List-Compare-0.55.tar.gz"; + # hash = "sha256-zHGUeYNledUrArwyjtgKmPZ53wQ6mbVxCrLBkWaeuDc="; + # }; + # buildInputs = [ CaptureTiny ]; + # meta = { + # description = "Compare elements of two or more lists"; + # homepage = "http://thenceforward.net/perl/modules/List-Compare"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ListMoreUtils = buildPerlPackage { + # pname = "List-MoreUtils"; + # version = "0.430"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/List-MoreUtils-0.430.tar.gz"; + # hash = "sha256-Y7H3hCzULZtTjR404DMN5f8VWeTCc3NCUGQYJ29kZSc="; + # }; + # propagatedBuildInputs = [ ExporterTiny ListMoreUtilsXS ]; + # buildInputs = [ TestLeakTrace ]; + # meta = { + # description = "Provide the stuff missing in List::Util"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ListMoreUtilsXS = buildPerlPackage { + # pname = "List-MoreUtils-XS"; + # version = "0.430"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/List-MoreUtils-XS-0.430.tar.gz"; + # hash = "sha256-6M5G1XwXnuzYdYKT6UAP8wCq8g/v4KnRW5/iMCucskI="; + # }; + # preConfigure = '' + # export LD=$CC + # ''; + # meta = { + # description = "Provide the stuff missing in List::Util in XS"; + # homepage = "https://metacpan.org/release/List-MoreUtils-XS"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # ListSomeUtils = buildPerlPackage { + # pname = "List-SomeUtils"; + # version = "0.59"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/List-SomeUtils-0.59.tar.gz"; + # hash = "sha256-+rMDcuTGe/WkYGLaONHQyHVief6tqGbrQ5+ilXGi3Hs="; + # }; + # buildInputs = [ TestLeakTrace ]; + # propagatedBuildInputs = [ ModuleImplementation ]; + # meta = { + # description = "Provide the stuff missing in List::Util"; + # homepage = "https://metacpan.org/release/List-SomeUtils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ListUtilsBy = buildPerlModule { + # pname = "List-UtilsBy"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/List-UtilsBy-0.12.tar.gz"; + # hash = "sha256-//EoH9Rp/pgrGlgES+z9lw8xO/86JuHHsrP0wKXtceA="; + # }; + # meta = { + # description = "Higher-order list utility functions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleCodes = buildPerlPackage { + # pname = "Locale-Codes"; + # version = "3.76"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SB/SBECK/Locale-Codes-3.76.tar.gz"; + # hash = "sha256-Qo00GFUJ7fbaYoYoAJcohrsCwySTRU/L4Y+Zmk9DXzk="; + # }; + # buildInputs = [ TestInter ]; + # meta = { + # description = "A distribution of modules to handle locale codes"; + # homepage = "https://github.com/SBECK-github/Locale-Codes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + LocaleGettext = buildPerlPackage { + pname = "gettext"; + version = "1.07"; + strictDeps = true; + buildInputs = [ pkgs.gettext ]; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PV/PVANDRY/gettext-1.07.tar.gz"; + hash = "sha256-kJ1HlUaX58BCGPlykVt4e9EkTXXjvQFiC8Fn1bvEnBU="; + }; + LANG="C"; + meta = { + description = "Perl extension for emulating gettext-related API"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # LocaleMaketextLexiconGetcontext = buildPerlPackage { + # pname = "Locale-Maketext-Lexicon-Getcontext"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAPER/Locale-Maketext-Lexicon-Getcontext-0.05.tar.gz"; + # hash = "sha256-dcsz35RypZYt5UCC9CxqdrJg/EBboQylMkb7H4LAkgg="; + # }; + # propagatedBuildInputs = [ LocaleMaketextLexicon ]; + # meta = { + # description = "PO file parser for Maketext"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # LocaleMOFile = buildPerlPackage { + # pname = "Locale-MO-File"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-MO-File-0.09.tar.gz"; + # hash = "sha256-lwNtw/Cds3BSrp2aUUSH6IS1bZDHbKEtbKtAXSNWSj8="; + # }; + # propagatedBuildInputs = [ ConstFast MooXStrictConstructor MooXTypesMooseLike ParamsValidate namespaceautoclean ]; + # buildInputs = [ TestDifferences TestException TestHexDifferences TestNoWarnings ]; + # meta = { + # description = "Write or read gettext MO files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleMaketextFuzzy = buildPerlPackage { + # pname = "Locale-Maketext-Fuzzy"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AU/AUDREYT/Locale-Maketext-Fuzzy-0.11.tar.gz"; + # hash = "sha256-N4UXHOt4zHZxMZo6bYztmxkOCX382bKp68gEzRooL5Y="; + # }; + # meta = { + # description = "Maketext from already interpolated strings"; + # license = with lib.licenses; [ cc0 ]; + # }; + # }; + + # LocaleMaketextLexicon = buildPerlPackage { + # pname = "Locale-Maketext-Lexicon"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DRTECH/Locale-Maketext-Lexicon-1.00.tar.gz"; + # hash = "sha256-tz9rBKWNPw446/IRWkwVMvGk7vb6xcaipEnk4Uwd3Hw="; + # }; + # meta = { + # description = "Use other catalog formats in Maketext"; + # homepage = "https://search.cpan.org/dist/Locale-Maketext-Lexicon"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "xgettext.pl"; + # }; + # }; + + # LocaleMsgfmt = buildPerlPackage { + # pname = "Locale-Msgfmt"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AZ/AZAWAWI/Locale-Msgfmt-0.15.tar.gz"; + # hash = "sha256-wydoMcvuz1i+AggbzBgL00jao12iGnc3t7A4pZ9kOrQ="; + # }; + # meta = { + # description = "Compile .po files to .mo files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocalePO = buildPerlPackage { + # pname = "Locale-PO"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/COSIMO/Locale-PO-0.27.tar.gz"; + # hash = "sha256-PJlKS2Pm5Og2xveak/UZIcq3fJDJdT/g+LVCkiDVFrk="; + # }; + # propagatedBuildInputs = [ FileSlurp ]; + # meta = { + # description = "Perl module for manipulating .po entries from GNU gettext"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleTextDomainOO = buildPerlPackage { + # pname = "Locale-TextDomain-OO"; + # version = "1.036"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-TextDomain-OO-1.036.tar.gz"; + # hash = "sha256-tReD4aiWICE+oqg+RbrsOqhunL4en6W590+HSbBUDjg="; + # }; + # propagatedBuildInputs = [ ClassLoad Clone JSON LocaleMOFile LocalePO LocaleTextDomainOOUtil LocaleUtilsPlaceholderBabelFish LocaleUtilsPlaceholderMaketext LocaleUtilsPlaceholderNamed MooXSingleton PathTiny TieSub ]; + # buildInputs = [ TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Locale::TextDomain::OO - Perl OO Interface to Uniforum Message Translation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleTextDomainOOUtil = buildPerlPackage { + # pname = "Locale-TextDomain-OO-Util"; + # version = "4.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-TextDomain-OO-Util-4.002.tar.gz"; + # hash = "sha256-PF+gf2Xtd8Ap4g0kahBAQRSPGptH4332PzflHQK9RqA="; + # }; + # propagatedBuildInputs = [ namespaceautoclean ]; + # buildInputs = [ TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Locale::TextDomain::OO::Util - Lexicon utils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleUtilsPlaceholderBabelFish = buildPerlPackage { + # pname = "Locale-Utils-PlaceholderBabelFish"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-Utils-PlaceholderBabelFish-0.006.tar.gz"; + # hash = "sha256-LhwAU5ljqeyr0se5te+QpWBna7A0giUXYin8jqS0pMw="; + # }; + # propagatedBuildInputs = [ HTMLParser MooXStrictConstructor MooXTypesMooseLike namespaceautoclean ]; + # buildInputs = [ TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Locale::Utils::PlaceholderBabelFish - Utils to expand BabelFish palaceholders"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleUtilsPlaceholderMaketext = buildPerlPackage { + # pname = "Locale-Utils-PlaceholderMaketext"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-Utils-PlaceholderMaketext-1.005.tar.gz"; + # hash = "sha256-UChgS9jzPY0yymkp+9DagP9L30KN6ARfs/Bbp9FdNOs="; + # }; + # propagatedBuildInputs = [ MooXStrictConstructor MooXTypesMooseLike namespaceautoclean ]; + # buildInputs = [ TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Locale::Utils::PlaceholderMaketext - Utils to expand maketext placeholders"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LocaleUtilsPlaceholderNamed = buildPerlPackage { + # pname = "Locale-Utils-PlaceholderNamed"; + # version = "1.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Locale-Utils-PlaceholderNamed-1.004.tar.gz"; + # hash = "sha256-b9eOojm1w1m6lCJ1N2b2OO5PkM0hdRpZs4YVXipFpr0="; + # }; + # propagatedBuildInputs = [ MooXStrictConstructor MooXTypesMooseLike namespaceautoclean ]; + # buildInputs = [ TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Locale::Utils::PlaceholderNamed - Utils to expand named placeholders"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # locallib = buildPerlPackage { + # pname = "local-lib"; + # version = "2.000029"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/local-lib-2.000029.tar.gz"; + # hash = "sha256-jfh6EMFMjpCcW0fFcB5LgYfVGeUlHofIBwmwK7M+/dc="; + # }; + # propagatedBuildInputs = [ ModuleBuild ]; + # meta = { + # description = "Create and use a local lib/ for perl modules with PERL5LIB"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LockFileSimple = buildPerlPackage { + # pname = "LockFile-Simple"; + # version = "0.208"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SC/SCHWIGON/lockfile-simple/LockFile-Simple-0.208.tar.gz"; + # hash = "sha256-Rcd4lrKloKRfYgKm+BP0N/+LKD+EocYNDE83MIAq86I="; + # }; + # meta = { + # description = "Simple file locking scheme"; + # license = with lib.licenses; [ artistic1 gpl2Plus ]; + # }; + # }; + + # LogAny = buildPerlPackage { + # pname = "Log-Any"; + # version = "1.717"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PR/PREACTION/Log-Any-1.717.tar.gz"; + # hash = "sha256-VmSdoPOQAjDJ49KSUssKdIBvst3r0igFrNc2iVmmW8o="; + # }; + # # Syslog test fails. + # preCheck = "rm t/syslog.t"; + # meta = { + # description = "Bringing loggers and listeners together"; + # homepage = "https://github.com/preaction/Log-Any"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogAnyAdapterLog4perl = buildPerlPackage { + # pname = "Log-Any-Adapter-Log4perl"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PR/PREACTION/Log-Any-Adapter-Log4perl-0.09.tar.gz"; + # hash = "sha256-EZfT5BIhS+IIgAz3v1BXsf6hVCRTmip5J8/kb3FuwaU="; + # }; + # propagatedBuildInputs = [ LogAny LogLog4perl ]; + # meta = { + # description = "Log::Any adapter for Log::Log4perl"; + # homepage = "https://github.com/preaction/Log-Any-Adapter-Log4perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogAnyAdapterTAP = buildPerlPackage { + # pname = "Log-Any-Adapter-TAP"; + # version = "0.003003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NERDVANA/Log-Any-Adapter-TAP-0.003003.tar.gz"; + # hash = "sha256-Ex8GibK0KxsxRJcUxu2o+BHdlqfIZ0jx4DsjnP0BIcA="; + # }; + # propagatedBuildInputs = [ LogAny TryTiny ]; + # meta = { + # description = "Logger suitable for use with TAP test files"; + # homepage = "https://github.com/silverdirk/perl-Log-Any-Adapter-TAP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogContextual = buildPerlPackage { + # pname = "Log-Contextual"; + # version = "0.008001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/Log-Contextual-0.008001.tar.gz"; + # hash = "sha256-uTy8+7h5bVHINuOwAkPNpWMICMFSwU7uXyDKCclFGZM="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ DataDumperConcise ExporterDeclare Moo ]; + # meta = { + # description = "Simple logging interface with a contextual log"; + # homepage = "https://github.com/frioux/Log-Contextual"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogDispatch = buildPerlPackage { + # pname = "Log-Dispatch"; + # version = "2.71"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Log-Dispatch-2.71.tar.gz"; + # hash = "sha256-nWDZZIw1zidUcx603rfwWAns4b1jO3TXR5Wu2exzJXA="; + # }; + # propagatedBuildInputs = [ DevelGlobalDestruction ParamsValidationCompiler Specio namespaceautoclean ]; + # buildInputs = [ IPCRun3 TestFatal TestNeeds ]; + # meta = { + # description = "Dispatches messages to one or more outputs"; + # homepage = "https://metacpan.org/release/Log-Dispatch"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # LogDispatchFileRotate = buildPerlPackage { + # pname = "Log-Dispatch-FileRotate"; + # version = "1.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHOUT/Log-Dispatch-FileRotate-1.38.tar.gz"; + # hash = "sha256-tV1s7ePwoGQmSI+/pVT0VhMgsBTBAjiTztKVCOW85Ow="; + # }; + # propagatedBuildInputs = [ DateManip LogDispatch ]; + # buildInputs = [ PathTiny TestWarn ]; + # meta = { + # description = "Log to Files that Archive/Rotate Themselves"; + # homepage = "https://github.com/mschout/perl-log-dispatch-filerotate"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogfileRotate = buildPerlPackage { + # pname = "Logfile-Rotate"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PA/PAULG/Logfile-Rotate-1.04.tar.gz"; + # hash = "sha256-gQ+LfM2GV9Ox71PNR1glR4Rc67WCArBVObNAhjjK2j4="; + # }; + # meta = { + # description = "Perl module to rotate logfiles"; + # homepage = "https://metacpan.org/dist/Logfile-Rotate"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # Logger = buildPerlPackage { + # pname = "Log-ger"; + # version = "0.040"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/Log-ger-0.040.tar.gz"; + # hash = "sha256-6JEdM4ePoWmeQ+jQpU7V1WEEA4Z/9cM5+TQQPRfsZLA="; + # }; + # meta = { + # description = "A lightweight, flexible logging framework"; + # homepage = "https://metacpan.org/release/Log-ger"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # LogHandler = buildPerlModule { + # pname = "Log-Handler"; + # version = "0.90"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BL/BLOONIX/Log-Handler-0.90.tar.gz"; + # hash = "sha256-OlyA5xKEVHcPg6yrjL0+cOXsPVmmHcMnkqF48LMb900="; + # }; + # propagatedBuildInputs = [ ParamsValidate ]; + # meta = { + # description = "Log messages to several outputs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogMessage = buildPerlPackage { + # pname = "Log-Message"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Log-Message-0.08.tar.gz"; + # hash = "sha256-vWl91iqvJtEY6fCggTQp3rHFRORQFVmHm2H8vf6Z/kY="; + # }; + # meta = { + # description = "Powerful and flexible message logging mechanism"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogMessageSimple = buildPerlPackage { + # pname = "Log-Message-Simple"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Log-Message-Simple-0.10.tar.gz"; + # hash = "sha256-qhLRpMCsJguU1Ej6Af66JCqKhctsv9xmQy47W0aK3ZY="; + # }; + # propagatedBuildInputs = [ LogMessage ]; + # meta = { + # description = "Simplified interface to Log::Message"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogTrace = buildPerlPackage { + # pname = "Log-Trace"; + # version = "1.070"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBC/Log-Trace-1.070.tar.gz"; + # hash = "sha256-nsuCWO8wwvJN7/SRckDQ/nMkLaWyGSQC95gVsJLtNuM="; + # }; + # meta = { + # description = "Provides a unified approach to tracing"; + # license = with lib.licenses; [ gpl1Only ]; + # }; + # }; + + # MCE = buildPerlPackage { + # pname = "MCE"; + # version = "1.889"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARIOROY/MCE-1.889.tar.gz"; + # hash = "sha256-22FT5HTQRvwlMFC/U8VAAthM1Mp30hwrnfVv7rgJu+0="; + # }; + # meta = { + # description = "Many-Core Engine for Perl providing parallel processing capabilities"; + # homepage = "https://github.com/marioroy/mce-perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogLog4perl = buildPerlPackage { + # pname = "Log-Log4perl"; + # version = "1.57"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/Log-Log4perl-1.57.tar.gz"; + # hash = "sha256-D4/Ldjio89tMeX35T9vFYBN0kULy+Uy8lbQ8n8oJahM="; + # }; + # meta = { + # description = "Log4j implementation for Perl"; + # homepage = "https://mschilli.github.io/log4perl/"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "l4p-tmpl"; + # }; + # }; + + # LogDispatchArray = buildPerlPackage { + # pname = "Log-Dispatch-Array"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Log-Dispatch-Array-1.005.tar.gz"; + # hash = "sha256-MRZAt6ln+N18m7QaInBzVlY21w30/MHUT+2KgiOzR8o="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ LogDispatch ]; + # meta = { + # description = "Log events to an array (reference)"; + # homepage = "https://github.com/rjbs/Log-Dispatch-Array"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogDispatchouli = buildPerlPackage { + # pname = "Log-Dispatchouli"; + # version = "3.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Log-Dispatchouli-3.007.tar.gz"; + # hash = "sha256-mIEYlllSukmo+nkaZTaIDIkBf0651ywXRe1n0VwNJyw="; + # }; + # buildInputs = [ TestDeep TestFatal ]; + # propagatedBuildInputs = [ LogDispatchArray StringFlogger SubExporterGlobExporter ]; + # meta = { + # description = "A simple wrapper around Log::Dispatch"; + # homepage = "https://github.com/rjbs/Log-Dispatchouli"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogJournald = buildPerlModule { + # pname = "Log-Journald"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LK/LKUNDRAK/Log-Journald-0.30.tar.gz"; + # hash = "sha256-VZks+aHh+4M/QoMAUlv6fPftRrg+xBT4KgkXibN9CKM="; + # }; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.systemd ]; + # postPatch = '' + # substituteInPlace Build.PL \ + # --replace "libsystemd-journal" "libsystemd" + # ''; + # meta = { + # description = "Send messages to a systemd journal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LogLogLite = buildPerlPackage { + # pname = "Log-LogLite"; + # version = "0.82"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RANI/Log-LogLite-0.82.tar.gz"; + # hash = "sha256-BQn7i8VDrJZ1pI6xplpjUoYIxsP99ioZ4XBzUA5RGms="; + # }; + # propagatedBuildInputs = [ IOLockedFile ]; + # meta = { + # description = "Helps us create simple logs for our application"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LongJump = buildPerlPackage { + # pname = "Long-Jump"; + # version = "0.000001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Long-Jump-0.000001.tar.gz"; + # hash = "sha256-1dZFbYaZK1Wdj2b8kJYPkZKSzTgDwTQD+qxXV2LHevQ="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Mechanism for returning to a specific point from a deeply nested stack"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + LWP = buildPerlPackage { + pname = "libwww-perl"; + version = "6.72"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/libwww-perl-6.72.tar.gz"; + hash = "sha256-6bg1T9XiC+IHr+I93VhPzVm/gpmNwHfez2hLodrloF0="; + }; + propagatedBuildInputs = [ FileListing HTMLParser HTTPCookies HTTPCookieJar HTTPNegotiate NetHTTP TryTiny WWWRobotRules ]; + preCheck = '' + export NO_NETWORK_TESTING=1 + ''; + # support cross-compilation by avoiding using `has_module` which does not work in miniperl (it requires B native module) + postPatch = lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + substituteInPlace Makefile.PL --replace 'if has_module' 'if 0; #' + ''; + doCheck = !stdenv.isDarwin; + nativeCheckInputs = [ HTTPDaemon TestFatal TestNeeds TestRequiresInternet ]; + meta = { + description = "The World-Wide Web library for Perl"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # LWPAuthenOAuth = buildPerlPackage { + # pname = "LWP-Authen-OAuth"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TIMBRODY/LWP-Authen-OAuth-1.02.tar.gz"; + # hash = "sha256-544L196AAs+0dgBzJY1VXvVbLCfAepSz2KIWahf9lrw="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "Generate signed OAuth requests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + LWPMediaTypes = buildPerlPackage { + pname = "LWP-MediaTypes"; + version = "6.04"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/LWP-MediaTypes-6.04.tar.gz"; + hash = "sha256-jxvKEtqxahwqfAOknF5YzOQab+yVGfCq37qNrZl5Gdk="; + }; + buildInputs = [ TestFatal ]; + meta = { + description = "Guess media type for a file or a URL"; + homepage = "https://github.com/libwww-perl/lwp-mediatypes"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # LWPProtocolConnect = buildPerlPackage { + # pname = "LWP-Protocol-connect"; + # version = "6.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BE/BENNING/LWP-Protocol-connect-6.09.tar.gz"; + # hash = "sha256-nyUjlHdeI6pCwxdmEeWTBjirUo1RkBELRzGqWwvzWhU="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ LWPProtocolHttps ]; + # meta = { + # description = "Provides HTTP/CONNECT proxy support for LWP::UserAgent"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPProtocolHttps = buildPerlPackage { + # pname = "LWP-Protocol-https"; + # version = "6.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OA/OALDERS/LWP-Protocol-https-6.11.tar.gz"; + # hash = "sha256-ATLdvwNmFWXKhQUPKlCU+5Jjy7w8yxpNnEGsm7CDuRc="; + # }; + # patches = [ ./perl-modules/lwp-protocol-https-cert-file.patch ]; + # propagatedBuildInputs = [ IOSocketSSL LWP ]; + # preCheck = '' + # export NO_NETWORK_TESTING=1 + # ''; + # buildInputs = [ TestRequiresInternet TestNeeds ]; + # meta = { + # description = "Provide https support for LWP::UserAgent"; + # homepage = "https://github.com/libwww-perl/LWP-Protocol-https"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPProtocolhttp10 = buildPerlPackage { + # pname = "LWP-Protocol-http10"; + # version = "6.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/LWP-Protocol-http10-6.03.tar.gz"; + # hash = "sha256-8/+pEfnVkYHxcXkQ6iZiCQXCmLdNww99TlE57jAguNM="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "Legacy HTTP/1.0 support for LWP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPUserAgentCached = buildPerlPackage { + # pname = "LWP-UserAgent-Cached"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OL/OLEG/LWP-UserAgent-Cached-0.08.tar.gz"; + # hash = "sha256-Pc5atMeAQWVs54Vk92Az5b0ew4b1TS57MHQK5I7nh8M="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "LWP::UserAgent with simple caching mechanism"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPUserAgentDNSHosts = buildPerlModule { + # pname = "LWP-UserAgent-DNS-Hosts"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MASAKI/LWP-UserAgent-DNS-Hosts-0.14.tar.gz"; + # hash = "sha256-mWl5RD8Ib/yLNmvbukSGWR2T+SF7wgSz5dZrlHIghx8="; + # }; + # propagatedBuildInputs = [ LWP ScopeGuard ]; + # buildInputs = [ ModuleBuildTiny TestFakeHTTPD TestSharedFork TestTCP TestUseAllModules ]; + # meta = { + # description = "Override LWP HTTP/HTTPS request's host like /etc/hosts"; + # homepage = "https://github.com/masaki/p5-LWP-UserAgent-DNS-Hosts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPUserAgentDetermined = buildPerlPackage { + # pname = "LWP-UserAgent-Determined"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXMV/LWP-UserAgent-Determined-1.07.tar.gz"; + # hash = "sha256-BtjVDozTaSoRy0+0Si+E5UdqmPDi5qSg386fZ+Vd21M="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "A virtual browser that retries errors"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPUserAgentMockable = buildPerlModule { + # pname = "LWP-UserAgent-Mockable"; + # version = "1.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MJ/MJEMMESON/LWP-UserAgent-Mockable-1.18.tar.gz"; + # hash = "sha256-JYZPUOOlIZ+J00oYQlmFSUWussXtSBjzbw8wIShUQyQ="; + # }; + # propagatedBuildInputs = [ HookLexWrap LWP SafeIsa ]; + # # Tests require network connectivity + # # https://rt.cpan.org/Public/Bug/Display.html?id=63966 is the bug upstream, + # # which doesn't look like it will get fixed anytime soon. + # doCheck = false; + # buildInputs = [ ModuleBuildTiny TestRequiresInternet ]; + # meta = { + # description = "Permits recording, and later playing back of LWP requests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # LWPxParanoidAgent = buildPerlPackage { + # pname = "LWPx-ParanoidAgent"; + # version = "1.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAXJAZMAN/lwp/LWPx-ParanoidAgent-1.12.tar.gz"; + # hash = "sha256-zAQa7bdOGDzfkcvryhx71tdk/e5o+9yE8r4IveTg0D0="; + # }; + # doCheck = false; # 3 tests fail, probably because they try to connect to the network + # propagatedBuildInputs = [ LWP NetDNS ]; + # meta = { + # description = "Subclass of LWP::UserAgent that protects you from harm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # maatkit = callPackage ./perl-modules/maatkit { }; + + # MacPasteboard = buildPerlPackage { + # pname = "Mac-Pasteboard"; + # version = "0.103"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WY/WYANT/Mac-Pasteboard-0.103.tar.gz"; + # hash = "sha256-L16N0tsNZEVVhITKbULYOcWpfuiqGyUOaU1n1bf2Y0w="; + # }; + # buildInputs = [ pkgs.darwin.apple_sdk.frameworks.ApplicationServices ]; + # meta = { + # description = "Manipulate Mac OS X pasteboards"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.darwin; + # mainProgram = "pbtool"; + # }; + # }; + + # MacPropertyList = buildPerlPackage { + # pname = "Mac-PropertyList"; + # version = "1.504"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Mac-PropertyList-1.504.tar.gz"; + # hash = "sha256-aIl96Yw2j76c22iF1H3qADxG7Ho3MmNSPvZkVwc7eq4="; + # }; + # propagatedBuildInputs = [ XMLEntities ]; + # meta = { + # description = "Work with Mac plists at a low level"; + # homepage = "https://github.com/briandfoy/mac-propertylist"; + # license = lib.licenses.artistic2; + # }; + # }; + + # MacSysProfile = buildPerlPackage { + # pname = "Mac-SysProfile"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DM/DMUEY/Mac-SysProfile-0.05.tar.gz"; + # hash = "sha256-QDOXa3dbOcwqaTtyoC1l71p7oDveTU2w3/RuEmx9n2w="; + # }; + # propagatedBuildInputs = [ MacPropertyList ]; + # meta = { + # description = "Perl extension for OS X system_profiler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.darwin; + # }; + # }; + + # MailAuthenticationResults = buildPerlPackage { + # pname = "Mail-AuthenticationResults"; + # version = "2.20230112"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MB/MBRADSHAW/Mail-AuthenticationResults-2.20230112.tar.gz"; + # hash = "sha256-wtFEyuAiX4vJ0PX60cPxOdJ89TT85+rHB2T79m/SI0E="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ Clone JSON ]; + # meta = { + # description = "Object Oriented Authentication-Results Headers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailDMARC = buildPerlPackage { + # pname = "Mail-DMARC"; + # version = "1.20230215"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MB/MBRADSHAW/Mail-DMARC-1.20230215.tar.gz"; + # hash = "sha256-V9z1R1nLkkSOVukUE0D2E0QnTFjZ3WWqkKqczw5+uQM="; + # }; + # buildInputs = [ ExtUtilsMakeMaker FileShareDirInstall ]; + # doCheck = false; # uses actual DNS at runtime + # checkInputs = [ XMLSAX XMLValidatorSchema TestException TestFileShareDir TestMore TestOutput ]; + # propagatedBuildInputs = [ + # ConfigTiny DBDSQLite DBIxSimple EmailMIME EmailSender Encode FileShareDir GetoptLong + # IOCompress IO IOSocketSSL NetDNS NetIDNEncode NetIP NetSSLeay RegexpCommon Socket6 + # SysSyslog URI XMLLibXML + # ]; + # meta = { + # description = "Perl implementation of DMARC"; + # homepage = "https://github.com/msimerson/mail-dmarc"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailMaildir = buildPerlPackage { + # version = "1.0.0"; + # pname = "Mail-Maildir"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEROALTI/Mail-Maildir-100/Mail-Maildir-1.0.0.tar.bz2"; + # hash = "sha256-RF6s2ixmN5ApbXGbypzHKYVUX6GgkBRhdnFgo6/DM88="; + # }; + # meta = { + # description = "Handle Maildir folders"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailBox = buildPerlPackage { + # version = "3.010"; + # pname = "Mail-Box"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/Mail-Box-3.010.tar.gz"; + # hash = "sha256-rhlPolDFRcm5FT4/tRA8qyn3nPKs1On9dc7FMiAalWQ="; + # }; + + # doCheck = false; + + # propagatedBuildInputs = [ DevelGlobalDestruction FileRemove Later MailTransport ]; + # meta = { + # description = "Manage a mailbox, a folder with messages"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailMboxMessageParser = buildPerlPackage { + # pname = "Mail-Mbox-MessageParser"; + # version = "1.5111"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCOPPIT/Mail-Mbox-MessageParser-1.5111.tar.gz"; + # hash = "sha256-VyPAqpzBC6ue0eO/2dXJX3FZ5xwaR1QU6xrx3uOkYjc="; + # }; + # buildInputs = [ FileSlurper TestCompile TestPod TestPodCoverage TextDiff UNIVERSALrequire URI ]; + # propagatedBuildInputs = [ FileHandleUnget ]; + # meta = { + # description = "A fast and simple mbox folder reader"; + # homepage = "https://github.com/coppit/mail-mbox-messageparser"; + # license = with lib.licenses; [ gpl2Only ]; + # maintainers = with maintainers; [ romildo ]; + # }; + # }; + + # MailMessage = buildPerlPackage { + # pname = "Mail-Message"; + # version = "3.013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/Mail-Message-3.013.tar.gz"; + # hash = "sha256-yK1YiNsBWkUOti7Cqj6mbcLdwRtwpdtsjKGn+fgg6B8="; + # }; + # propagatedBuildInputs = [ IOStringy MIMETypes MailTools URI UserIdentity ]; + # meta = { + # description = "Processing MIME messages"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailDKIM = buildPerlPackage { + # pname = "Mail-DKIM"; + # version = "1.20230911"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MB/MBRADSHAW/Mail-DKIM-1.20230911.tar.gz"; + # hash = "sha256-kecxcoK3JM+9LJtuZjDvFDKISLb8UgPv1w3sL7hyaMo="; + # }; + # propagatedBuildInputs = [ CryptOpenSSLRSA MailAuthenticationResults MailTools NetDNS ]; + # doCheck = false; # tries to access the domain name system + # buildInputs = [ NetDNSResolverMock TestRequiresInternet YAMLLibYAML ]; + # meta = { + # description = "Signs/verifies Internet mail with DKIM/DomainKey signatures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailIMAPClient = buildPerlPackage { + # pname = "Mail-IMAPClient"; + # version = "3.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLOBBES/Mail-IMAPClient-3.43.tar.gz"; + # hash = "sha256-CTyX+sFbR6j+TSk27y3zd6v3fMirdAktISi7lF0ftG8="; + # }; + # propagatedBuildInputs = [ ParseRecDescent ]; + # meta = { + # description = "An IMAP Client API"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailPOP3Client = buildPerlPackage { + # pname = "Mail-POP3Client"; + # version = "2.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SD/SDOWD/Mail-POP3Client-2.21.tar.gz"; + # hash = "sha256-sW7yFJtuNXOHPx5ZDk1RNmxZlLi1MV3xaSXRe4niSQE="; + # }; + # meta = { + # description = "Perl 5 module to talk to a POP3 (RFC1939) server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailRFC822Address = buildPerlPackage { + # pname = "Mail-RFC822-Address"; + # version = "0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PD/PDWARREN/Mail-RFC822-Address-0.3.tar.gz"; + # hash = "sha256-NR70EE7LZ17K5pAIJD+ugkPRp+U8aB7rdZ57eBaEyKc="; + # }; + # meta = { + # description = "Perl extension for validating email addresses according to RFC822"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # MailSender = buildPerlPackage { + # pname = "Mail-Sender"; + # version = "0.903"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CAPOEIRAB/Mail-Sender-0.903.tar.gz"; + # hash = "sha256-RBPrSfUgqDGBUYEcywWo1UKXOq2iCqUDrTL5/8mKOb8="; + # }; + # meta = { + # description = "(DEPRECATED) module for sending mails with attachments through an SMTP server"; + # homepage = "https://github.com/Perl-Email-Project/Mail-Sender"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailSendmail = buildPerlPackage { + # pname = "Mail-Sendmail"; + # version = "0.80"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Mail-Sendmail-0.80.tar.gz"; + # hash = "sha256-W4qYy1zDnYBEGjiqsBCIXd+A5vzY5uAxQ5LLI+fCaOQ="; + # }; + # # The test suite simply loads the module and attempts to send an email to + # # the module's author, the latter of which is a) more of an integration + # # test, b) impossible to verify, and c) won't work from a sandbox. Replace + # # it in its entirety with the following simple smoke test. + # checkPhase = '' + # perl -I blib/lib -MMail::Sendmail -e 'print "1..1\nok 1\n"' + # ''; + # meta = { + # description = "Simple platform independent mailer"; + # homepage = "https://github.com/neilb/Mail-Sendmail"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # MailSPF = buildPerlPackage { + # pname = "Mail-SPF"; + # version = "2.9.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMEHNLE/mail-spf/Mail-SPF-v2.9.0.tar.gz"; + # hash = "sha256-YctZFfHHrMepMf/Bv8EpG9+sVV4qRusjkbmV6p7LYWI="; + # }; + # # remove this patch patches = [ ./perl-modules/Mail-SPF.patch ]; + + # buildInputs = [ ModuleBuild NetDNSResolverProgrammable ]; + # propagatedBuildInputs = [ Error NetAddrIP NetDNS URI ]; + + # buildPhase = "perl Build.PL --install_base=$out --install_path=\"sbin=$out/bin\" --install_path=\"lib=$out/${perl.libPrefix}\"; ./Build build "; + + # doCheck = false; # The main test performs network access + # meta = { + # description = "An object-oriented implementation of Sender Policy Framework"; + # license = with lib.licenses; [ bsd3 ]; + # mainProgram = "spfquery"; + # }; + # }; + + + # MailTools = buildPerlPackage { + # pname = "MailTools"; + # version = "2.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/MailTools-2.21.tar.gz"; + # hash = "sha256-Stm9aCa28DonJzMkZrG30piQyNmaMrSzsKjZJu4aRMs="; + # }; + # propagatedBuildInputs = [ TimeDate ]; + # meta = { + # description = "Various ancient e-mail related modules"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MailTransport = buildPerlPackage { + # pname = "Mail-Transport"; + # version = "3.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/Mail-Transport-3.005.tar.gz"; + # hash = "sha256-0Ny5P3BcEoXYCONN59htvijR7WaqKn3oMPZlH8NRlqM="; + # }; + # propagatedBuildInputs = [ MailMessage ]; + # meta = { + # description = "Email message exchange"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathBase85 = buildPerlPackage { + # pname = "Math-Base85"; + # version = "0.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PT/PTC/Math-Base85-0.5.tar.gz"; + # hash = "sha256-CwX3+2UKh5ezktjqkPLnK/uNCFBcmi4LlV39RacqNOU="; + # }; + # meta = { + # description = "Perl extension for base 85 numbers, as referenced by RFC 1924"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathBaseConvert = buildPerlPackage { + # pname = "Math-Base-Convert"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKER/Math-Base-Convert-0.11.tar.gz"; + # hash = "sha256-jAlxNV8kyTt553rVSkVwCQoaWY/Lm4b1wX66QvOLQOA="; + # }; + # meta = { + # description = "Very fast base to base conversion"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathLibm = buildPerlPackage { + # pname = "Math-Libm"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DS/DSLEWART/Math-Libm-1.00.tar.gz"; + # hash = "sha256-v9MJ8oOsjLm/AK+MfDoQvyWr/WQoYcICLvr/CkpSwnY="; + # }; + # meta = { + # description = "Perl extension for the C math library, libm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathCalcParser = buildPerlPackage { + # pname = "Math-Calc-Parser"; + # version = "1.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Math-Calc-Parser-1.005.tar.gz"; + # hash = "sha256-r8PrSWqzo6MBs0N68H4ZfrdDwGCQ8BAdrPggMC8rf3U="; + # }; + # buildInputs = [ TestNeeds ]; + # meta = { + # description = "Parse and evaluate mathematical expressions"; + # homepage = "https://github.com/Grinnz/Math-Calc-Parser"; + # broken = true; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # MathCalcUnits = buildPerlPackage { + # pname = "Math-Calc-Units"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SF/SFINK/Math-Calc-Units-1.07.tar.gz"; + # hash = "sha256-YePP2ye7O+4nvrlxJN2TB2DhA57cHreBbC9WJ3Zfj48="; + # }; + # meta = { + # description = "Human-readable unit-aware calculator"; + # license = with lib.licenses; [ artistic1 gpl2Only ]; + # mainProgram = "ucalc"; + # }; + # }; + + # MathBigInt = buildPerlPackage { + # pname = "Math-BigInt"; + # version = "1.999842"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PJ/PJACKLAM/Math-BigInt-1.999842.tar.gz"; + # hash = "sha256-VGAcUMaZPn7hPYw6wzRs8VpNgGMUnNu+husB5WEORnU="; + # }; + # meta = { + # description = "Arbitrary size integer/float math package"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathBigIntGMP = buildPerlPackage { + # pname = "Math-BigInt-GMP"; + # version = "1.6013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PJ/PJACKLAM/Math-BigInt-GMP-1.6013.tar.gz"; + # hash = "sha256-yxqS4CJn1AUV+OA6TiEvZv0wfJdMu9MT4j3jL98Q9rU="; + # }; + # buildInputs = [ pkgs.gmp ]; + # doCheck = false; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.gmp.dev}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.gmp.out}/lib -lgmp"; + # propagatedBuildInputs = [ MathBigInt ]; + # meta = { + # description = "Backend library for Math::BigInt etc. based on GMP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathBigIntLite = buildPerlPackage { + # pname = "Math-BigInt-Lite"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PJ/PJACKLAM/Math-BigInt-Lite-0.29.tar.gz"; + # hash = "sha256-R4YN/KYxl4txxKqZkaGynk7LrzYbW7nrOVl1t//Nd/U="; + # }; + # propagatedBuildInputs = [ MathBigInt ]; + # meta = { + # description = "What Math::BigInts are before they become big"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathClipper = buildPerlModule { + # pname = "Math-Clipper"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHELDRAKE/Math-Clipper-1.29.tar.gz"; + # hash = "sha256-UyfE8TOGbenXmzGGV/Zp7LSZhgVQs5aGmNRyiHr4dZM="; + # }; + # nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; + # buildInputs = [ ExtUtilsCppGuess ExtUtilsTypemapsDefault ExtUtilsXSpp ModuleBuildWithXSpp TestDeep ]; + # meta = { + # description = "Polygon clipping in 2D"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathConvexHullMonotoneChain = buildPerlPackage { + # pname = "Math-ConvexHull-MonotoneChain"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Math-ConvexHull-MonotoneChain-0.01.tar.gz"; + # hash = "sha256-KIvEWQgmMkVUj5FIKrEkiGjdne5Ef5yibK15YT47lPU="; + # }; + # meta = { + # description = "Andrew's monotone chain algorithm for finding a convex hull in 2D"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathFibonacci = buildPerlPackage { + # pname = "Math-Fibonacci"; + # version = "1.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VI/VIPUL/Math-Fibonacci-1.5.tar.gz"; + # hash = "sha256-cKgobpRVjfmdyS9S2D4eIKe494UrzDod59njOCYLmbo="; + # }; + # meta = { + # description = "This module provides a few functions related to Fibonacci numbers"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MathGMP = buildPerlPackage { + # pname = "Math-GMP"; + # version = "2.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Math-GMP-2.25.tar.gz"; + # hash = "sha256-OCtx5Udi9jnppCqbBpNBUZh7pX0Ru3DTXjvsiNUEUM4="; + # }; + # buildInputs = [ pkgs.gmp AlienGMP ]; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.gmp.dev}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.gmp.out}/lib -lgmp"; + # meta = { + # description = "High speed arbitrary size integer math"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # MathGMPz = buildPerlPackage { + # pname = "Math-GMPz"; + # version = "0.59"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SI/SISYPHUS/Math-GMPz-0.59.tar.gz"; + # hash = "sha256-mmrN45G0Ff5f7HwUyCTVUf/j+W81rycYRWuJ3jpkEaQ="; + # }; + # buildInputs = [ TestWarn pkgs.gmp ]; + # NIX_CFLAGS_LINK = "-L${pkgs.gmp.out}/lib -lgmp"; + # meta = { + # description = "Perl interface to the GMP integer functions"; + # homepage = "https://github.com/sisyphus/math-gmpz"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # MathGeometryVoronoi = buildPerlPackage { + # pname = "Math-Geometry-Voronoi"; + # version = "1.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAMTREGAR/Math-Geometry-Voronoi-1.3.tar.gz"; + # hash = "sha256-cgdeTpiDzuUURrqVESZMjDKgFagPSlZIo/azgsU0QCw="; + # }; + # propagatedBuildInputs = [ ClassAccessor ParamsValidate ]; + # meta = { + # description = "Compute Voronoi diagrams from sets of points"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathInt128 = buildPerlPackage { + # pname = "Math-Int128"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Math-Int128-0.22.tar.gz"; + # hash = "sha256-pjDKQBdThmlV8Rc4SKtbSsStXKatkIfxHN+R3ehRGbw="; + # }; + # propagatedBuildInputs = [ MathInt64 ]; + # meta = { + # description = "Manipulate 128 bits integers in Perl"; + # homepage = "https://metacpan.org/release/Math-Int128"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.is32bit; # compiler doesn't support a 128-bit integer type + # }; + # }; + + # MathInt64 = buildPerlPackage { + # pname = "Math-Int64"; + # version = "0.54"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Math-Int64-0.54.tar.gz"; + # hash = "sha256-3PxR5phDfqa5zv4CdiFcVs22p/hePiSitrQYnxlg01E="; + # }; + # meta = { + # description = "Manipulate 64 bits integers in Perl"; + # homepage = "https://metacpan.org/release/Math-Int64"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathPari = buildPerlPackage rec { + # pname = "Math-Pari"; + # version = "2.030523"; + # nativeBuildInputs = [ pkgs.unzip ]; + # pariversion = "2.1.7"; + # pari_tgz = fetchurl { + # url = "https://pari.math.u-bordeaux.fr/pub/pari/OLD/2.1/pari-${pariversion}.tgz"; + # hash = "sha256-kULyza8wg8iWLxpcK7Dp/okV99lJDAMxKsI2HH6hVfo="; + # }; + # # Workaround build failure on -fno-common toolchains: + # # ld: libPARI/libPARI.a(compat.o):(.bss+0x8): multiple definition of + # # `overflow'; Pari.o:(.bss+0x80): first defined here + # env.NIX_CFLAGS_COMPILE = "-fcommon"; + # preConfigure = "cp ${pari_tgz} pari-${pariversion}.tgz"; + # makeMakerFlags = [ "pari_tgz=pari-${pariversion}.tgz" ]; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILYAZ/modules/Math-Pari-2.030518.zip"; + # hash = "sha256-3DiVWpaQvmuvqN4lJiEjd8Psn+jaXsAiY6nK+UtYu5E="; + # }; + # meta = { + # description = "Perl interface to PARI"; + # license = with lib.licenses; [ artistic1 gpl1Plus gpl2Only ]; + # }; + # }; + + # MathPlanePath = buildPerlPackage { + # pname = "Math-PlanePath"; + # version = "129"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/Math-PlanePath-129.tar.gz"; + # hash = "sha256-jaFdDk1Qd7bF0gN2WyiFv3KOUJ4y3pJkYFwIYhN+OX4="; + # }; + # propagatedBuildInputs = [ MathLibm constant-defer ]; + # buildInputs = [ DataFloat MathBigIntLite NumberFraction ]; + # meta = { + # description = "Points on a path through the 2-D plane"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # MathPrimeUtil = buildPerlPackage { + # pname = "Math-Prime-Util"; + # version = "0.73"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANAJ/Math-Prime-Util-0.73.tar.gz"; + # hash = "sha256-Svpt2M25dJm9TsppJYYYEsKdn1oPGsJ62dLZybVgKJQ="; + # }; + # propagatedBuildInputs = [ MathPrimeUtilGMP ]; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Utilities related to prime numbers, including fast sieves and factoring"; + # homepage = "https://github.com/danaj/Math-Prime-Util"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MathPrimeUtilGMP = buildPerlPackage { + # pname = "Math-Prime-Util-GMP"; + # version = "0.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANAJ/Math-Prime-Util-GMP-0.52.tar.gz"; + # hash = "sha256-JpfH/Vx+Nf3sf1DtVqZ76Aei8iZXWJ5jfa01knRAA74="; + # }; + # buildInputs = [ pkgs.gmp ]; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.gmp.dev}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.gmp.out}/lib -lgmp"; + # meta = { + # description = "Utilities related to prime numbers, using GMP"; + # homepage = "https://github.com/danaj/Math-Prime-Util-GMP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MathProvablePrime = buildPerlPackage { + # pname = "Math-ProvablePrime"; + # version = "0.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FELIPE/Math-ProvablePrime-0.51.tar.gz"; + # hash = "sha256-D7YWRJ+weorR6KgJxwghthjlPcD/3ayWVnYY3jPEbBE="; + # }; + # buildInputs = [ FileWhich TestClass TestDeep TestException TestFailWarnings ]; + # propagatedBuildInputs = [ BytesRandomSecureTiny ]; + # meta = { + # description = "Generate a provable prime number, in pure Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MathRandom = buildPerlPackage { + # pname = "Math-Random"; + # version = "0.72"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GROMMEL/Math-Random-0.72.tar.gz"; + # hash = "sha256-vgUiMogR2W3lBdnrrD0JY1kCb6jVw497uZmnjsW8JUw="; + # }; + # meta = { + # description = "Random Number Generators"; + # license = with lib.licenses; [ artistic1 gpl1Plus publicDomain ]; + # }; + # }; + + # MathRandomISAAC = buildPerlPackage { + # pname = "Math-Random-ISAAC"; + # version = "1.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JAWNSY/Math-Random-ISAAC-1.004.tar.gz"; + # hash = "sha256-J3PwL78gfpdF52oDffCL9ajMmH7SPFcEDOf3sVYfK3w="; + # }; + # buildInputs = [ TestNoWarnings ]; + # meta = { + # description = "Perl interface to the ISAAC PRNG algorithm"; + # homepage = "https://search.cpan.org/dist/Math-Random-ISAAC"; + # license = with lib.licenses; [ publicDomain mit artistic2 gpl1Plus ]; + # }; + # }; + + # MathRandomMTAuto = buildPerlPackage { + # pname = "Math-Random-MT-Auto"; + # version = "6.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JD/JDHEDDEN/Math-Random-MT-Auto-6.23.tar.gz"; + # hash = "sha256-WLy1rTFilk/1oMTS3LqgICwshdnEcElvO3qZh1d3YxM="; + # }; + # propagatedBuildInputs = [ ObjectInsideOut ]; + # meta = { + # description = "Auto-seeded Mersenne Twister PRNGs"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # MathRandomSecure = buildPerlPackage { + # pname = "Math-Random-Secure"; + # version = "0.080001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/Math-Random-Secure-0.080001.tar.gz"; + # hash = "sha256-v6Sk6BfspyIGfB/z2hKrWrgNbFfapeXnq5NQyixx6zU="; + # }; + # buildInputs = [ ListMoreUtils TestSharedFork TestWarn ]; + # propagatedBuildInputs = [ CryptRandomSource MathRandomISAAC ]; + # meta = { + # description = "Cryptographically-secure, cross-platform replacement for rand()"; + # homepage = "https://github.com/frioux/Math-Random-Secure"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MathRound = buildPerlPackage { + # pname = "Math-Round"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GROMMEL/Math-Round-0.07.tar.gz"; + # hash = "sha256-c6cymoblSlwppEA4LlgDCVtY8zEp5hod8Ak7SCTekyc="; + # }; + # meta = { + # description = "Perl extension for rounding numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MathVecStat = buildPerlPackage { + # pname = "Math-VecStat"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASPINELLI/Math-VecStat-0.08.tar.gz"; + # hash = "sha256-QJqODksQJcjoD2KPZal3iqd6soUWFAbKSmwJexNlbQ0="; + # }; + # meta = { + # description = "Some basic numeric stats on vectors"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MaxMindDBCommon = buildPerlPackage { + # pname = "MaxMind-DB-Common"; + # version = "0.040001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/MaxMind-DB-Common-0.040001.tar.gz"; + # hash = "sha256-a8bfS9NjANB6pKX4GYrmaUyn4xPAOBCciNvDqZeyG9c="; + # }; + # propagatedBuildInputs = [ DataDumperConcise DateTime ListAllUtils MooXStrictConstructor ]; + # meta = { + # description = "Code shared by the MaxMind DB reader and writer modules"; + # homepage = "https://metacpan.org/release/MaxMind-DB-Common"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MaxMindDBReader = buildPerlPackage { + # pname = "MaxMind-DB-Reader"; + # version = "1.000014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/MaxMind-DB-Reader-1.000014.tar.gz"; + # hash = "sha256-OCAHj5yWf5qIch6kDKBeSZnBxTAb68HRGQYPntXOOak="; + # }; + # propagatedBuildInputs = [ DataIEEE754 DataPrinter DataValidateIP MaxMindDBCommon ]; + # buildInputs = [ PathClass TestBits TestFatal TestNumberDelta TestRequires ]; + # meta = { + # description = "Read MaxMind DB files and look up IP addresses"; + # homepage = "https://metacpan.org/release/MaxMind-DB-Reader"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MaxMindDBReaderXS = buildPerlModule { + # pname = "MaxMind-DB-Reader-XS"; + # version = "1.000009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/MaxMind-DB-Reader-XS-1.000009.tar.gz"; + # hash = "sha256-qm+4f+0Z1UnymxNd55l+6SsSJ9Ymyw6JBgCpHK3DBTo="; + # }; + # propagatedBuildInputs = [ pkgs.libmaxminddb MathInt128 MaxMindDBReader ]; + # buildInputs = [ NetWorks PathClass TestFatal TestNumberDelta TestRequires ]; + # meta = { + # description = "Fast XS implementation of MaxMind DB reader"; + # homepage = "https://metacpan.org/release/MaxMind-DB-Reader-XS"; + # license = with lib.licenses; [ artistic2 ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.MaxMindDBReaderXS.x86_64-darwin + # }; + # }; + + # MaxMindDBWriter = buildPerlModule { + # pname = "MaxMind-DB-Writer"; + # version = "0.300003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/MaxMind-DB-Writer-0.300003.tar.gz"; + # hash = "sha256-ulP1upZfekd/ZxZNl7R1oMESCIcv7fI4mIVQ2SvN6z4="; + # }; + # propagatedBuildInputs = [ DigestSHA1 MaxMindDBReader MooseXParamsValidate MooseXStrictConstructor NetWorks SerealDecoder SerealEncoder ]; + # buildInputs = [ DevelRefcount JSON TestBits TestDeep TestFatal TestHexDifferences TestRequires TestWarnings ]; + # hardeningDisable = [ "format" ]; + # meta = { + # description = "Create MaxMind DB database files"; + # homepage = "https://metacpan.org/release/MaxMind-DB-Writer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.MaxMindDBWriter.x86_64-darwin + # }; + # }; + + # Memoize = buildPerlPackage { + # pname = "Memoize"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/Memoize-1.16.tar.gz"; + # hash = "sha256-CRlSvPSS7O41ueW41ykgxYAjRB15IIwduHg3xcV4B74="; + # }; + # meta = { + # description = "Make functions faster by trading space for time"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MemoizeExpireLRU = buildPerlPackage { + # pname = "Memoize-ExpireLRU"; + # version = "0.56"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Memoize-ExpireLRU-0.56.tar.gz"; + # hash = "sha256-7oNjAcu6uaJLBfxlft+pS3/YV42YNuVmoZHQpbAc1/Y="; + # }; + # meta = { + # description = "Expiry plug-in for Memoize that adds LRU cache expiration"; + # homepage = "https://github.com/neilb/Memoize-ExpireLRU"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Menlo = buildPerlPackage { + # pname = "Menlo"; + # version = "1.9019"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Menlo-1.9019.tar.gz"; + # hash = "sha256-O1c/aOezo2qHyGC+JYWZMw+sJItRiFTftWV6xIPcpWU="; + # }; + # propagatedBuildInputs = [ CPANCommonIndex CPANMetaCheck CaptureTiny ExtUtilsHelpers ExtUtilsInstallPaths Filepushd HTTPTinyish ModuleCPANfile ParsePMFile StringShellQuote Win32ShellQuote locallib ]; + # meta = { + # description = "A CPAN client"; + # homepage = "https://github.com/miyagawa/cpanminus"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MenloLegacy = buildPerlPackage { + # pname = "Menlo-Legacy"; + # version = "1.9022"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Menlo-Legacy-1.9022.tar.gz"; + # hash = "sha256-pqysP+4xioBLQ53lSsvHwn8LRM/a2FUbvJzUWYarwgE="; + # }; + # propagatedBuildInputs = [ Menlo ]; + # meta = { + # description = "Legacy internal and client support for Menlo"; + # homepage = "https://github.com/miyagawa/cpanminus"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MetaBuilder = buildPerlModule { + # pname = "Meta-Builder"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Meta-Builder-0.004.tar.gz"; + # hash = "sha256-rLSZqnIG652yHrhTV6dFIb/jva5KZBbVCnx1uTnPVv4="; + # }; + # buildInputs = [ FennecLite TestException ]; + # meta = { + # description = "Tools for creating Meta objects to track custom metrics"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MetaCPANClient = buildPerlPackage { + # pname = "MetaCPAN-Client"; + # version = "2.030000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MICKEY/MetaCPAN-Client-2.030000.tar.gz"; + # hash = "sha256-2bdlxSN3VPFyYmljgqc4XZCy0BmGl5gXhisWZLBt068="; + # }; + + # # Most tests are online, so we only include offline tests + # postPatch = '' + # substituteInPlace Makefile.PL \ + # --replace '"t/*.t t/api/*.t"' \ + # '"t/00-report-prereqs.t t/api/_get.t t/api/_get_or_search.t t/api/_search.t t/entity.t t/request.t t/resultset.t"' + # ''; + + # buildInputs = [ LWPProtocolHttps TestFatal TestNeeds ]; + # propagatedBuildInputs = [ IOSocketSSL JSONMaybeXS Moo RefUtil SafeIsa TypeTiny URI ]; + # meta = { + # description = "A comprehensive, DWIM-featured client to the MetaCPAN API"; + # homepage = "https://github.com/metacpan/metacpan-client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # MethodSignaturesSimple = buildPerlPackage { + # pname = "Method-Signatures-Simple"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RH/RHESA/Method-Signatures-Simple-1.07.tar.gz"; + # hash = "sha256-yM19Rxl3zIh2BEGSq9mKga/d/yomu5oQu+NY76Nx2tw="; + # }; + # propagatedBuildInputs = [ DevelDeclare ]; + # meta = { + # description = "Basic method declarations with signatures, without source filters"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MetricsAny = buildPerlModule { + # pname = "Metrics-Any"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Metrics-Any-0.10.tar.gz"; + # hash = "sha256-qQ6t+civJKUWu5obZwYfZBhT+QuP7p/8JNK7lyDouZs="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Abstract collection of monitoring metrics"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # # TODO: use CPAN version + # MHonArc = buildPerlPackage { + # pname = "MHonArc"; + # version = "2.6.24"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LD/LDIDRY/MHonArc-2.6.24.tar.gz"; + # hash = "sha256-RX3HN07lnLdaBynlHO8vLFK0gYD3Odj9lW6hmIKBXzM="; + # }; + + # outputs = [ "out" "dev" ]; # no "devdoc" + + # installTargets = [ "install" ]; + + # meta = { + # homepage = "https://www.mhonarc.org/"; + # description = "A mail-to-HTML converter"; + # mainProgram = "mhonarc"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # MIMECharset = buildPerlPackage { + # pname = "MIME-Charset"; + # version = "1.013.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEZUMI/MIME-Charset-1.013.1.tar.gz"; + # hash = "sha256-G7em4MDSUfI9bmC/hMmt78W3TuxYR1v+5NORB+YIcPA="; + # }; + # meta = { + # description = "Charset Information for MIME"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # mimeConstruct = buildPerlPackage { + # pname = "mime-construct"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROSCH/mime-construct-1.11.tar.gz"; + # hash = "sha256-TNe7YbUdQRktFJjBBRqmpMzXWusJtx0uxwanCEpKkwM="; + # }; + # outputs = [ "out" ]; + # buildInputs = [ ProcWaitStat ]; + # meta = { + # description = "Construct and optionally mail MIME messages"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # MIMEEncWords = buildPerlPackage { + # pname = "MIME-EncWords"; + # version = "1.014.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEZUMI/MIME-EncWords-1.014.3.tar.gz"; + # hash = "sha256-6a+1SGEdTn5sULfwa70rG7KAjjeoEN7vtTfGevVIUjg="; + # }; + # propagatedBuildInputs = [ MIMECharset ]; + # meta = { + # description = "Deal with RFC 2047 encoded words (improved)"; + # homepage = "https://metacpan.org/pod/MIME::EncWords"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MIMELite = buildPerlPackage { + # pname = "MIME-Lite"; + # version = "3.033"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/MIME-Lite-3.033.tar.gz"; + # hash = "sha256-eKJ58dLiQlUcNH75ehP8Z1dmYCy4TCqAxWlAD082i6s="; + # }; + # propagatedBuildInputs = [ EmailDateFormat ]; + # meta = { + # description = "Low-calorie MIME generator (DEPRECATED)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MIMELiteHTML = buildPerlPackage { + # pname = "MIME-Lite-HTML"; + # version = "1.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALIAN/MIME-Lite-HTML-1.24.tar.gz"; + # hash = "sha256-22A8y/ZlO80oz6gk1y5RHq0Bn8ivufGFTshy2y082No="; + # }; + # doCheck = false; + # propagatedBuildInputs = [ LWP MIMELite ]; + # meta = { + # description = "Provide routine to transform a HTML page in a MIME-Lite mail"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MIMETools = buildPerlPackage { + # pname = "MIME-tools"; + # version = "5.509"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DS/DSKOLL/MIME-tools-5.509.tar.gz"; + # hash = "sha256-ZFefDJI9gdmiGUWG5Hw0dVGeJkbktcECqJIHWfrPaXM="; + # }; + # propagatedBuildInputs = [ MailTools ]; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Tools to manipulate MIME messages"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MIMETypes = buildPerlPackage { + # pname = "MIME-Types"; + # version = "2.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/MIME-Types-2.24.tar.gz"; + # hash = "sha256-Yp42HyKyIL5QwtpzVOI8BFF1dwmgPCWiLzFg7blMtl8="; + # }; + # meta = { + # description = "Definition of MIME types"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Minion = buildPerlPackage { + # pname = "Minion"; + # version = "10.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/Minion-10.25.tar.gz"; + # hash = "sha256-C+CoN1N2iJ2gRgRpY4TAz5iyYh0mUNnrAwf25LlAra0="; + # }; + # propagatedBuildInputs = [ Mojolicious YAMLLibYAML ]; + # meta = { + # description = "A high performance job queue for Perl"; + # homepage = "https://github.com/mojolicious/minion"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MinionBackendRedis = buildPerlModule { + # pname = "Minion-Backend-Redis"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DF/DFUG/Minion-Backend-Redis-0.003.tar.gz"; + # hash = "sha256-zXZRIQbfHKmQF75fObSmXgSCawzZQxe3GsAWGzXzI6A="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ Minion MojoRedis Mojolicious SortVersions ]; + # meta = { + # homepage = "https://github.com/Difegue/Minion-Backend-Redis"; + # description = "Redis backend for Minion job queue"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # MinionBackendSQLite = buildPerlModule { + # pname = "Minion-Backend-SQLite"; + # version = "5.0.7"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Minion-Backend-SQLite-v5.0.7.tar.gz"; + # hash = "sha256-zd49IrGv+n32seErKlLp88G2gci1k6G+TeO+aOTaXHI="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ Minion MojoSQLite ]; + # meta = { + # description = "SQLite backend for Minion job queue"; + # homepage = "https://github.com/Grinnz/Minion-Backend-SQLite"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MinionBackendmysql = buildPerlPackage { + # pname = "Minion-Backend-mysql"; + # version = "1.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PR/PREACTION/Minion-Backend-mysql-1.003.tar.gz"; + # hash = "sha256-aaJcJAyw5NTvTxqjKgTt+Nolt+jTqCDP1kVhWZ7aRUI="; + # }; + # buildInputs = [ Testmysqld ]; + # propagatedBuildInputs = [ Minion Mojomysql ]; + # meta = { + # description = "MySQL backend for the Minion job queue"; + # homepage = "https://github.com/preaction/Minion-Backend-mysql"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MixinLinewise = buildPerlPackage { + # pname = "Mixin-Linewise"; + # version = "0.111"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Mixin-Linewise-0.111.tar.gz"; + # hash = "sha256-0o6IUWzptSlcMWMdzM3A/I8qt9ilzIdrsbIBMQh7Ads="; + # }; + # propagatedBuildInputs = [ PerlIOutf8_strict SubExporter ]; + # meta = { + # description = "Write your linewise code for handles; this does the rest"; + # homepage = "https://github.com/rjbs/Mixin-Linewise"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MLDBM = buildPerlModule { + # pname = "MLDBM"; + # version = "2.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/MLDBM-2.05.tar.gz"; + # hash = "sha256-WGiA7QwggBq79nNHR+E+AgPt7+zm68TyDdtQWfAqF6I="; + # }; + # meta = { + # description = "Store multi-level Perl hash structure in single level tied hash"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MNI-Perllib = callPackage ./perl-modules/MNI {}; + + # Mo = buildPerlPackage { + # pname = "Mo"; + # version = "0.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TINITA/Mo-0.40.tar.gz"; + # hash = "sha256-kdJBUjkfjCeX7jUDkTja6m3j7gO98+G4ck+lx1VAzrk="; + # }; + # meta = { + # description = "Micro Objects. Mo is less"; + # homepage = "https://github.com/ingydotnet/mo-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mo-inline"; + # }; + # }; + + # MockConfig = buildPerlPackage { + # pname = "Mock-Config"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Mock-Config-0.03.tar.gz"; + # hash = "sha256-pbg0V1fKTyuTNfW+FOk+u7UChlIzp1W/U7xxVt7sABs="; + # }; + # meta = { + # description = "Temporarily set Config or XSConfig values"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModernPerl = buildPerlPackage { + # pname = "Modern-Perl"; + # version = "1.20230106"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHROMATIC/Modern-Perl-1.20230106.tar.gz"; + # hash = "sha256-BFncq4DOgrY0Yf2B7pTgbpplFdmPP7wxmDjdHmAoUfc="; + # }; + # meta = { + # description = "Enable all of the features of Modern Perl with one import"; + # homepage = "https://github.com/chromatic/Modern-Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Modulecpmfile = buildPerlModule { + # pname = "Module-cpmfile"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/Module-cpmfile-0.006.tar.gz"; + # hash = "sha256-G8l24pN3JIlsn26unl3KmB4n+YQwuS3icO41FP0ArA8="; + # }; + # buildInputs = [ ModuleBuildTiny ModuleCPANfile Test2Suite ]; + # propagatedBuildInputs = [ YAMLPP ]; + # meta = { + # description = "Parse cpmfile"; + # homepage = "https://github.com/skaji/cpmfile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + ModuleBuild = buildPerlPackage { + pname = "Module-Build"; + version = "0.4234"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEONT/Module-Build-0.4234.tar.gz"; + hash = "sha256-Zq6sYSdBi+XkcerTdEZIx2a9AUgoJcW2ZlJnXyvIao8="; + }; + postConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + # for unknown reason, the first run of Build fails + ./Build || true + ''; + postPatch = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + # remove version check since miniperl uses a stub of File::Temp, which do not provide a version: + # https://github.com/arsv/perl-cross/blob/master/cnf/stub/File/Temp.pm + sed -i '/File::Temp/d' \ + Build.PL + + # fix discover perl function, it can not handle a wrapped perl + sed -i "s,\$self->_discover_perl_interpreter,'$(type -p perl)',g" \ + lib/Module/Build/Base.pm + ''; + meta = { + description = "Build and install Perl modules"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + mainProgram = "config_data"; + }; + }; + + # ModuleBuildDeprecated = buildPerlModule { + # pname = "Module-Build-Deprecated"; + # version = "0.4210"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Module-Build-Deprecated-0.4210.tar.gz"; + # hash = "sha256-vgiTE/wjjuIYNHOsqMhrVfs89EeXMSy+m4ktY2JiFwM="; + # }; + # doCheck = false; + # meta = { + # description = "A collection of modules removed from Module-Build"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleBuildPluggable = buildPerlModule { + # pname = "Module-Build-Pluggable"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/Module-Build-Pluggable-0.10.tar.gz"; + # hash = "sha256-5bsqyxF3ksmEYogSrLD+w3bLlwyu6O3ldTXgTXYrDkA="; + # }; + # propagatedBuildInputs = [ ClassAccessorLite ClassMethodModifiers DataOptList ]; + # buildInputs = [ TestSharedFork ]; + # meta = { + # description = "Module::Build meets plugins"; + # homepage = "https://github.com/tokuhirom/Module-Build-Pluggable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleBuildPluggableCPANfile = buildPerlModule { + # pname = "Module-Build-Pluggable-CPANfile"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/Module-Build-Pluggable-CPANfile-0.05.tar.gz"; + # hash = "sha256-SuxsuiQMtueAFkBrajqHVjTMKuwI/8XxVy2hzcQOHnw="; + # }; + # buildInputs = [ CaptureTiny TestRequires TestSharedFork ]; + # propagatedBuildInputs = [ ModuleBuildPluggable ModuleCPANfile ]; + # meta = { + # description = "Include cpanfile"; + # homepage = "https://github.com/kazeburo/Module-Build-Pluggable-CPANfile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleBuildPluggablePPPort = buildPerlModule { + # pname = "Module-Build-Pluggable-PPPort"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/Module-Build-Pluggable-PPPort-0.04.tar.gz"; + # hash = "sha256-RAhLo9iBXzQ705FYWsXYM5pIB85cDdhMmNuPMQtkwOo="; + # }; + # buildInputs = [ TestRequires TestSharedFork ]; + # propagatedBuildInputs = [ ModuleBuildPluggable ]; + # meta = { + # description = "Generate ppport.h"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ModuleBuildTiny = buildPerlModule { + pname = "Module-Build-Tiny"; + version = "0.047"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LE/LEONT/Module-Build-Tiny-0.047.tar.gz"; + hash = "sha256-cSYOlCG5PDPdGz59DPFfdZwMp8dT+oQCeew75w+PjJ0="; + }; + buildInputs = [ FileShareDir ]; + propagatedBuildInputs = [ ExtUtilsHelpers ExtUtilsInstallPaths ]; + meta = { + description = "A tiny replacement for Module::Build"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ModuleBuildWithXSpp = buildPerlModule { + # pname = "Module-Build-WithXSpp"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Module-Build-WithXSpp-0.14.tar.gz"; + # hash = "sha256-U7PIyP29UPw9rT0Z2iDxtkFO9wZluTEXEMgClp50aTQ="; + # }; + # propagatedBuildInputs = [ ExtUtilsCppGuess ExtUtilsXSpp ]; + # meta = { + # description = "XS++ enhanced flavour of Module::Build"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleBuildXSUtil = buildPerlModule { + # pname = "Module-Build-XSUtil"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HI/HIDEAKIO/Module-Build-XSUtil-0.19.tar.gz"; + # hash = "sha256-kGOzw0bt60IoB//kn/sjA4xPkA1Kd7hFzktT2XvylAA="; + # }; + # buildInputs = [ CaptureTiny CwdGuard FileCopyRecursiveReduced ]; + # propagatedBuildInputs = [ DevelCheckCompiler ]; + # perlPreHook = "export LD=$CC"; + # meta = { + # description = "A Module::Build class for building XS modules"; + # homepage = "https://github.com/hideo55/Module-Build-XSUtil"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleCompile = buildPerlPackage { + # pname = "Module-Compile"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Module-Compile-0.38.tar.gz"; + # hash = "sha256-gJDPu2ESNDfu/sPjvthgBdH3xaUp+2/aLr68ZWS5qhA="; + # }; + # propagatedBuildInputs = [ CaptureTiny DigestSHA1 ]; + # meta = { + # description = "Perl Module Compilation"; + # homepage = "https://github.com/ingydotnet/module-compile-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleCPANTSAnalyse = buildPerlPackage { + # pname = "Module-CPANTS-Analyse"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Module-CPANTS-Analyse-1.02.tar.gz"; + # hash = "sha256-nhFzm5zQi6LXWllzfx+yl/RYA/KJBjxcdZv8eP1Rbns="; + # }; + # propagatedBuildInputs = [ ArchiveAnyLite ArrayDiff ClassAccessor DataBinary FileFindObject ModuleFind ParseDistname PerlPrereqScannerNotQuiteLite SoftwareLicense ]; + # buildInputs = [ ExtUtilsMakeMakerCPANfile TestFailWarnings ]; + # meta = { + # description = "Generate Kwalitee ratings for a distribution"; + # homepage = "https://cpants.cpanauthors.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleCPANfile = buildPerlPackage { + # pname = "Module-CPANfile"; + # version = "1.1004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Module-CPANfile-1.1004.tar.gz"; + # hash = "sha256-iO++LppkLc6qGGQw/t/PmZqvDgb2zO0opxS45WtRSSE="; + # }; + # buildInputs = [ Filepushd ]; + # meta = { + # description = "Parse cpanfile"; + # homepage = "https://github.com/miyagawa/cpanfile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleExtractUse = buildPerlModule { + # pname = "Module-ExtractUse"; + # version = "0.345"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOMM/Module-ExtractUse-0.345.tar.gz"; + # hash = "sha256-juJOh0KrnaeSKL4Yfdoxm01fUKkaHs+H1JQhO1uzDdE="; + # }; + # propagatedBuildInputs = [ ParseRecDescent PodStrip ]; + # buildInputs = [ TestDeep TestNoWarnings ]; + # meta = { + # description = "Find out what modules are used"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleExtractVERSION = buildPerlPackage { + # pname = "Module-Extract-VERSION"; + # version = "1.116"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Module-Extract-VERSION-1.116.tar.gz"; + # hash = "sha256-QZA6BoUXgoU0X12oVdkluUVO5xCpeV48TDJ7ri9Vdpg="; + # }; + # meta = { + # homepage = "https://github.com/briandfoy/module-extract-version"; + # description = "Extract a module version safely"; + # license = lib.licenses.artistic2; + # }; + # }; + + # ModuleFind = buildPerlPackage { + # pname = "Module-Find"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CR/CRENZ/Module-Find-0.16.tar.gz"; + # hash = "sha256-S8qqN2kVAUco1PUzqYxbWdZlBRzTzbr8lg5aZv0TEJI="; + # }; + # meta = { + # description = "Find and use installed modules in a (sub)category"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleImplementation = buildPerlPackage { + # pname = "Module-Implementation"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Module-Implementation-0.09.tar.gz"; + # hash = "sha256-wV8aEvDCEwye//PC4a/liHsIzNAzvRMhhtHn1Qh/1m0="; + # }; + # buildInputs = [ TestFatal TestRequires ]; + # propagatedBuildInputs = [ ModuleRuntime TryTiny ]; + # meta = { + # description = "Loads one of several alternate underlying implementations for a module"; + # homepage = "https://metacpan.org/release/Module-Implementation"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ModuleInfo = buildPerlPackage { + # pname = "Module-Info"; + # version = "0.37"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Module-Info-0.37.tar.gz"; + # hash = "sha256-jqgCUpeQsZwfNzoeR9g4FmT5xMH3ao2LvG221zEcJEg="; + # }; + # buildInputs = [ TestPod TestPodCoverage ]; + # propagatedBuildInputs = [ BUtils ]; + # meta = { + # description = "Information about Perl modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "module_info"; + # }; + # }; + + # ModuleInstall = buildPerlPackage { + # pname = "Module-Install"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Module-Install-1.21.tar.gz"; + # hash = "sha256-+/kQB/MFZfOSDhBgVf0NQoeYHV59rYs1MjzktzPxWns="; + # }; + # propagatedBuildInputs = [ FileRemove ModuleBuild ModuleScanDeps YAMLTiny ]; + # meta = { + # description = "Standalone, extensible Perl module installer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleInstallAuthorRequires = buildPerlPackage { + # pname = "Module-Install-AuthorRequires"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FL/FLORA/Module-Install-AuthorRequires-0.02.tar.gz"; + # hash = "sha256-zGMhU310XSqDqChvhe8zRnRZOcw7NBAgRb7IVg6PTOw="; + # }; + # propagatedBuildInputs = [ ModuleInstall ]; + # meta = { + # description = "Declare author-only dependencies"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleInstallAuthorTests = buildPerlPackage { + # pname = "Module-Install-AuthorTests"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Module-Install-AuthorTests-0.002.tar.gz"; + # hash = "sha256-QCVyLeY1ft9TwoUBsA59qSzS+fxhG6B1N2Gg4d/zLYg="; + # }; + # propagatedBuildInputs = [ ModuleInstall ]; + # meta = { + # description = "Designate tests only run by module authors"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleInstallGithubMeta = buildPerlPackage { + # pname = "Module-Install-GithubMeta"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Module-Install-GithubMeta-0.30.tar.gz"; + # hash = "sha256-Lq1EyXPHSNctnxmeQcRNwYAf6a4GsPrcWUR2k6PJgoE="; + # }; + # buildInputs = [ CaptureTiny ]; + # propagatedBuildInputs = [ ModuleInstall ]; + # meta = { + # description = "A Module::Install extension to include GitHub meta information in META.yml"; + # homepage = "https://github.com/bingos/module-install-githubmeta"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ModuleInstallReadmeFromPod = buildPerlPackage { + # pname = "Module-Install-ReadmeFromPod"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Module-Install-ReadmeFromPod-0.30.tar.gz"; + # hash = "sha256-efbfVTZhn6/72mlr3SXMrRfEab8y5RzT5hM2bUlAAWk="; + # }; + # buildInputs = [ TestInDistDir ]; + # propagatedBuildInputs = [ CaptureTiny IOAll ModuleInstall PodMarkdown ]; + # meta = { + # description = "A Module::Install extension to automatically convert POD to a README"; + # homepage = "https://github.com/bingos/module-install-readmefrompod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ModuleInstallReadmeMarkdownFromPod = buildPerlPackage { + # pname = "Module-Install-ReadmeMarkdownFromPod"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTN/Module-Install-ReadmeMarkdownFromPod-0.04.tar.gz"; + # hash = "sha256-MAsuJE+DuaVKlfhATBzTrwY1tPrpdMplOQ7kKOxmhZE="; + # }; + # buildInputs = [ URI ]; + # propagatedBuildInputs = [ ModuleInstall PodMarkdown ]; + # meta = { + # description = "Create README.mkdn from POD"; + # homepage = "https://search.cpan.org/dist/Module-Install-ReadmeMarkdownFromPod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ModuleInstallRepository = buildPerlPackage { + # pname = "Module-Install-Repository"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Module-Install-Repository-0.06.tar.gz"; + # hash = "sha256-AOJZDQkznMzL2qMo0SrY7HfoMaOMmtZjcF5Z7LsYcis="; + # }; + # buildInputs = [ PathClass ]; + # meta = { + # description = "Automatically sets repository URL from svn/svk/Git checkout"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ModuleInstallXSUtil = buildPerlPackage { + # pname = "Module-Install-XSUtil"; + # version = "0.45"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFUJI/Module-Install-XSUtil-0.45.tar.gz"; + # hash = "sha256-/nHlMyC+4TGXdJoLF2CaomP3H/RuXiwTDpR0Lqar31Y="; + # }; + # buildInputs = [ BHooksOPAnnotation ]; + # propagatedBuildInputs = [ ModuleInstall ]; + # meta = { + # description = "Utility functions for XS modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleManifest = buildPerlPackage { + # pname = "Module-Manifest"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Module-Manifest-1.09.tar.gz"; + # hash = "sha256-o5X4D/FeoOZv1sRThEtnh+1Kh1o82N+ffikoAlC9U5s="; + # }; + # buildInputs = [ TestException TestWarn ]; + # propagatedBuildInputs = [ ParamsUtil ]; + # meta = { + # description = "Parse and examine a Perl distribution MANIFEST file"; + # homepage = "https://github.com/karenetheridge/Module-Manifest"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModulePath = buildPerlPackage { + # pname = "Module-Path"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Module-Path-0.19.tar.gz"; + # hash = "sha256-szF5zk3XPfzefUaAiAS5/7sR2wJF/kVafQAXR1Yv6so="; + # }; + # buildInputs = [ DevelFindPerl ]; + # meta = { + # description = "Get the full path to a locally installed module"; + # homepage = "https://github.com/neilbowers/Module-Path"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mpath"; + # }; + # }; + + # ModulePluggable = buildPerlPackage { + # pname = "Module-Pluggable"; + # version = "5.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SI/SIMONW/Module-Pluggable-5.2.tar.gz"; + # hash = "sha256-s/KtReT9ELP7kNkS142LeVqylUgNtW3GToa5+nXFpt8="; + # }; + # patches = [ + # # !!! merge this patch into Perl itself (which contains Module::Pluggable as well) + # ./perl-modules/module-pluggable.patch + # ]; + # buildInputs = [ AppFatPacker ]; + # meta = { + # description = "Automatically give your module the ability to have plugins"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModulePluggableFast = buildPerlPackage { + # pname = "Module-Pluggable-Fast"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/Module-Pluggable-Fast-0.19.tar.gz"; + # hash = "sha256-CMhXcFjxmTLKG2Zre5EmoYtVajmwi+b7ObBqRTkqB18="; + # }; + # propagatedBuildInputs = [ UNIVERSALrequire ]; + # meta = { + # description = "Fast plugins with instantiation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleRefresh = buildPerlPackage { + # pname = "Module-Refresh"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Module-Refresh-0.18.tar.gz"; + # hash = "sha256-4JTaqQmv32SJqeKzJzP2haLBy1zIh2BhB1SGEJsN71k="; + # }; + # buildInputs = [ PathClass ]; + # meta = { + # description = "Refresh %INC files when updated on disk"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + ModuleRuntime = buildPerlModule { + pname = "Module-Runtime"; + version = "0.016"; + src = fetchurl { + url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Module-Runtime-0.016.tar.gz"; + hash = "sha256-aDAuxkaDNUfUEL4o4JZ223UAb0qlihHzvbRP/pnw8CQ="; + }; + meta = { + description = "Runtime module handling"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # ModuleRuntimeConflicts = buildPerlPackage { + # pname = "Module-Runtime-Conflicts"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Module-Runtime-Conflicts-0.003.tar.gz"; + # hash = "sha256-cHzcdQOMcP6Rd5uIisBQ8ShWXTlnupZoDhscfMlzOHU="; + # }; + # propagatedBuildInputs = [ DistCheckConflicts ]; + # meta = { + # description = "Provide information on conflicts for Module::Runtime"; + # homepage = "https://github.com/karenetheridge/Module-Runtime-Conflicts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleScanDeps = buildPerlPackage { + # pname = "Module-ScanDeps"; + # version = "1.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSCHUPP/Module-ScanDeps-1.34.tar.gz"; + # hash = "sha256-ysUw5c/EE+BneXx9I3xsXNMpFcPZ+u5dlANcjzqFUOs="; + # }; + # buildInputs = [ TestRequires IPCRun3 ]; + # propagatedBuildInputs = [ TextParsewords ]; + # meta = { + # description = "Recursively scan Perl code for dependencies"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "scandeps.pl"; + # }; + # }; + + # ModuleSignature = buildPerlPackage { + # pname = "Module-Signature"; + # version = "0.87"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AU/AUDREYT/Module-Signature-0.87.tar.gz"; + # hash = "sha256-IU6AVcUP7DcalXQ1IP4mlAAE52FpBjsrROyQoNRdaYI="; + # }; + # buildInputs = [ IPCRun ]; + # meta = { + # description = "Module signature file manipulation"; + # license = with lib.licenses; [ cc0 ]; + # mainProgram = "cpansign"; + # }; + # }; + + # ModuleUtil = buildPerlModule { + # pname = "Module-Util"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATTLAW/Module-Util-1.09.tar.gz"; + # hash = "sha256-bPvLakUGREbsiqDuGn3dxCC1RGkwM0QYeu+E0sfz4sY="; + # }; + # meta = { + # description = "Module name tools and transformations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pm_which"; + # }; + # }; + + # ModuleVersions = buildPerlPackage { + # pname = "Module-Versions"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TH/THW/Module-Versions-0.02.zip"; + # hash = "sha256-DTimWxenrFGI1zh8/+f6oSY4Rw3JNxYevz2kh7fR+Dw="; + # }; + # buildInputs = [ pkgs.unzip ]; + # meta = { + # description = "Handle versions of loaded modules with flexible result interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ModuleVersionsReport = buildPerlPackage { + # pname = "Module-Versions-Report"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JESSE/Module-Versions-Report-1.06.tar.gz"; + # hash = "sha256-oyYdDYSxdnjYxP1V6w+JL1FE2BylPqmjjXXRoArZeWo="; + # }; + # meta = { + # description = "Report versions of all modules in memory"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MojoDOM58 = buildPerlPackage { + # pname = "Mojo-DOM58"; + # version = "3.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Mojo-DOM58-3.001.tar.gz"; + # hash = "sha256-GLJtVB5TFEFa3d8xQ2nZQMi6BrESNMpQb9vmzyJPV5Y="; + # }; + # meta = { + # description = "Minimalistic HTML/XML DOM parser with CSS selectors"; + # homepage = "https://github.com/Grinnz/Mojo-DOM58"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # mod_perl2 = buildPerlPackage { + # pname = "mod_perl"; + # version = "2.0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHAY/mod_perl-2.0.12.tar.gz"; + # hash = "sha256-9bghtZsP3JZw5G7Q/PMtiRHyUSYYmotowWUvkiHu4mk="; + # }; + + # makeMakerFlags = [ "MP_AP_DESTDIR=$out" ]; + # buildInputs = [ pkgs.apacheHttpd ]; + # doCheck = false; # would try to start Apache HTTP server + # passthru.tests = nixosTests.mod_perl; + # meta = { + # description = "Embed a Perl interpreter in the Apache/2.x HTTP server"; + # license = with lib.licenses; [ asl20 ]; + # mainProgram = "mp2bug"; + # }; + # }; + + # Mojolicious = buildPerlPackage { + # pname = "Mojolicious"; + # version = "9.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/Mojolicious-9.36.tar.gz"; + # hash = "sha256-UX7Pb9hqC3xhadVRAiOL+YUWGNt2L7ANTPDZTGJSAV8="; + # }; + # meta = { + # description = "Real-time web framework"; + # homepage = "https://mojolicious.org"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ marcusramberg sgo thoughtpolice ]; + # mainProgram = "mojo"; + # }; + # }; + + # MojoliciousPluginAssetPack = buildPerlPackage { + # pname = "Mojolicious-Plugin-AssetPack"; + # version = "2.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/Mojolicious-Plugin-AssetPack-2.14.tar.gz"; + # hash = "sha256-jwWMyIw1mb6/ZjeK7GS91uvNkMljGL3m1ov6551j6qM="; + # }; + # propagatedBuildInputs = [ FileWhich IPCRun3 Mojolicious ]; + # meta = { + # description = "Compress and convert css, less, sass, javascript and coffeescript files"; + # homepage = "https://github.com/jhthorsen/mojolicious-plugin-assetpack"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # MojoliciousPluginGravatar = buildPerlPackage { + # pname = "Mojolicious-Plugin-Gravatar"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KO/KOORCHIK/Mojolicious-Plugin-Gravatar-0.04.tar.gz"; + # hash = "sha256-pJ+XDGxw+ZMLMEp1IWPLlfHZmHEvecsTZAgy5Le2dd0="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "Globally Recognized Avatars for Mojolicious"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # MojoliciousPluginI18N = buildPerlModule { + # pname = "Mojolicious-Plugin-I18N"; + # version = "1.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHARIFULN/Mojolicious-Plugin-I18N-1.6.tar.gz"; + # hash = "sha256-Mvte+AN9lUt+zr71wbKyS0IKvYKXAjEvStQnlPUrUU0="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # homepage = "https://github.com/sharifulin/Mojolicious-Plugin-I18N"; + # description = "Internationalization Plugin for Mojolicious"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MojoliciousPluginMail = buildPerlModule { + # pname = "Mojolicious-Plugin-Mail"; + # version = "1.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHARIFULN/Mojolicious-Plugin-Mail-1.5.tar.gz"; + # hash = "sha256-VvDTQevDp6zzkZ9a3UPpghbqEoWqDYfn+wDAK7Dv8UY="; + # }; + # propagatedBuildInputs = [ MIMEEncWords MIMELite Mojolicious ]; + # meta = { + # description = "Mojolicious Plugin for send mail"; + # homepage = "https://github.com/sharifulin/Mojolicious-Plugin-Mail"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoliciousPluginOpenAPI = buildPerlPackage { + # pname = "Mojolicious-Plugin-OpenAPI"; + # version = "5.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Mojolicious-Plugin-OpenAPI-5.09.tar.gz"; + # hash = "sha256-BIJdfOIe20G80Ujrz6Gu+Ek258QOhKOdvyeGcdSaMQY="; + # }; + # propagatedBuildInputs = [ JSONValidator Mojolicious ]; + # meta = { + # description = "OpenAPI / Swagger plugin for Mojolicious"; + # homepage = "https://github.com/jhthorsen/mojolicious-plugin-openapi"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoliciousPluginRenderFile = buildPerlPackage { + # pname = "Mojolicious-Plugin-RenderFile"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KO/KOORCHIK/Mojolicious-Plugin-RenderFile-0.12.tar.gz"; + # hash = "sha256-AT5CoswGvHBBuxPJ3ziK8kAQ5peTqN8PCrHSQKphFz8="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "\"render_file\" helper for Mojolicious"; + # homepage = "https://github.com/koorchik/Mojolicious-Plugin-RenderFile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # MojoliciousPluginStatus = buildPerlPackage { + # pname = "Mojolicious-Plugin-Status"; + # version = "1.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/Mojolicious-Plugin-Status-1.17.tar.gz"; + # hash = "sha256-TCsfr+PhkSYby0TiDo75rz+YjR25akrgsG7tQSArh7Q="; + # }; + # propagatedBuildInputs = [ BSDResource CpanelJSONXS FileMap Mojolicious Sereal ]; + # meta = { + # description = "Mojolicious server status"; + # homepage = "https://mojolicious.org"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.thoughtpolice ]; + # }; + # }; + + # MojoliciousPluginSyslog = buildPerlPackage { + # pname = "Mojolicious-Plugin-Syslog"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Mojolicious-Plugin-Syslog-0.06.tar.gz"; + # hash = "sha256-IuxL9TYwDseyAYuoV3C9g2ZFDBAwVDZ9srFp9Mh3QRM="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "A plugin for enabling a Mojolicious app to log to syslog"; + # homepage = "https://github.com/jhthorsen/mojolicious-plugin-syslog"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoliciousPluginTemplateToolkit = buildPerlModule { + # pname = "Mojolicious-Plugin-TemplateToolkit"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Mojolicious-Plugin-TemplateToolkit-0.006.tar.gz"; + # hash = "sha256-dBoFAmtTArtrKc+I3KICC3rv0iNHgWELpZNaqPCXNKY="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ ClassMethodModifiers Mojolicious TemplateToolkit ]; + # meta = { + # homepage = "https://github.com/Grinnz/Mojolicious-Plugin-TemplateToolkit"; + # description = "Template Toolkit renderer plugin for Mojolicious"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # MojoliciousPluginTextExceptions = buildPerlPackage { + # pname = "Mojolicious-Plugin-TextExceptions"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/Mojolicious-Plugin-TextExceptions-0.02.tar.gz"; + # hash = "sha256-Oht0BcV4TO5mHP8bARpzlRBN1IS7kbnnWT+ralOb+HQ="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "Render exceptions as text in command line user agents"; + # homepage = "https://github.com/marcusramberg/mojolicious-plugin-textexceptions"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoliciousPluginWebpack = buildPerlPackage { + # pname = "Mojolicious-Plugin-Webpack"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Mojolicious-Plugin-Webpack-1.02.tar.gz"; + # hash = "sha256-REzqioOZquelrWt8iQ/yFgk8WM6uaxyKBl77cBC3zn0="; + # }; + # propagatedBuildInputs = [ Mojolicious Filechdir ]; + # meta = { + # description = "Mojolicious <3 Webpack"; + # homepage = "https://github.com/jhthorsen/mojolicious-plugin-webpack"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoRedis = buildPerlPackage { + # pname = "Mojo-Redis"; + # version = "3.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Mojo-Redis-3.29.tar.gz"; + # hash = "sha256-oDMZpF0uYTpsfS1ZrAD9SwtHiGVi5ish3pG0r4llgII="; + # }; + # propagatedBuildInputs = [ Mojolicious ProtocolRedisFaster ]; + # meta = { + # description = "Redis driver based on Mojo::IOLoop"; + # homepage = "https://github.com/jhthorsen/mojo-redis"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoSAML = buildPerlModule { + # pname = "Mojo-SAML"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JB/JBERGER/Mojo-SAML-0.07.tar.gz"; + # hash = "sha256-csJMrNtvHXp14uqgBDfHFKv1eafSENSqTT8g8e/0cQ0="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ CryptOpenSSLRSA CryptOpenSSLX509 DataGUID Mojolicious XMLCanonicalizeXML ]; + # meta = { + # description = "A SAML2 toolkit using the Mojo toolkit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoSQLite = buildPerlModule { + # pname = "Mojo-SQLite"; + # version = "3.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Mojo-SQLite-3.009.tar.gz"; + # hash = "sha256-Vzmprz/A/BYrOAMt9hCgcANSY7++C+wWrsUvDd3Xtkc="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ DBDSQLite Mojolicious SQLAbstractPg URIdb URI ]; + # meta = { + # description = "A tiny Mojolicious wrapper for SQLite"; + # homepage = "https://github.com/Grinnz/Mojo-SQLite"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # Mojomysql = buildPerlPackage { + # pname = "Mojo-mysql"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/Mojo-mysql-1.26.tar.gz"; + # hash = "sha256-H9LjBlr4Je9N2x2W9g9MVc9NCCD77L0wrHGdTeJx5rw="; + # }; + # propagatedBuildInputs = [ DBDmysql Mojolicious SQLAbstract ]; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Mojolicious and Async MySQL/MariaDB"; + # homepage = "https://github.com/jhthorsen/mojo-mysql"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoIOLoopDelay = buildPerlModule { + # pname = "Mojo-IOLoop-Delay"; + # version = "8.76"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JB/JBERGER/Mojo-IOLoop-Delay-8.76.tar.gz"; + # hash = "sha256-jsvAYUg3IdkgRZQya+zpXM2/vbbRihc8gt1xgXLQqe0="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "(DISCOURAGED) Promises/A+ and flow-control helpers"; + # homepage = "https://github.com/jberger/Mojo-IOLoop-Delay"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # MojoIOLoopForkCall = buildPerlModule { + # pname = "Mojo-IOLoop-ForkCall"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JB/JBERGER/Mojo-IOLoop-ForkCall-0.21.tar.gz"; + # hash = "sha256-8dpdh4RxvdhvAcQjhQgAgE9ttCtUU8IW8Jslt5RYS3g="; + # }; + # propagatedBuildInputs = [ IOPipely Mojolicious MojoIOLoopDelay ]; + # preBuild = '' + # # This module needs the deprecated Mojo::IOLoop::Delay + # substituteInPlace lib/Mojo/IOLoop/ForkCall.pm \ + # --replace "use Mojo::IOLoop;" "use Mojo::IOLoop; use Mojo::IOLoop::Delay;" + # ''; + # meta = { + # description = "(DEPRECATED) run blocking functions asynchronously by forking"; + # homepage = "https://github.com/jberger/Mojo-IOLoop-ForkCall"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # MojoJWT = buildPerlModule { + # pname = "Mojo-JWT"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JB/JBERGER/Mojo-JWT-0.09.tar.gz"; + # hash = "sha256-wE4DmD4MbyvORdCOoucph5yWee+mNLDmjLa4t7SoWIY="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ Mojolicious ]; + # meta = { + # description = "JSON Web Token the Mojo way"; + # homepage = "https://github.com/jberger/Mojo-JWT"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoPg = buildPerlPackage { + # pname = "Mojo-Pg"; + # version = "4.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/Mojo-Pg-4.27.tar.gz"; + # hash = "sha256-oyLI3wDj5WVf300LernXmSiTIOKfZP6ZrHrxJEhO+dg="; + # }; + # propagatedBuildInputs = [ DBDPg Mojolicious SQLAbstractPg ]; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Mojolicious ♥ PostgreSQL"; + # homepage = "https://mojolicious.org"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MojoUserAgentCached = buildPerlPackage { + # pname = "Mojo-UserAgent-Cached"; + # version = "1.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NICOMEN/Mojo-UserAgent-Cached-1.25.tar.gz"; + # hash = "sha256-lZmikTjq/ZKPWF7jDvFm0j/x3FKkBn50hyxR4W3shko="; + # }; + # buildInputs = [ ModuleInstall ]; + # propagatedBuildInputs = [ AlgorithmLCSS CHI DataSerializer DevelStackTrace Mojolicious Readonly StringTruncate ]; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Caching, Non-blocking I/O HTTP, Local file and WebSocket user agent"; + # homepage = "https://github.com/nicomen/mojo-useragent-cached"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # MongoDB = buildPerlPackage { + # pname = "MongoDB"; + # version = "2.2.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MONGODB/MongoDB-v2.2.2.tar.gz"; + # hash = "sha256-IBk1+S2slPOcNd5zZh6LJSQ55JbyKGV9uF/5MlfDJo8="; + # }; + # buildInputs = [ JSONMaybeXS PathTiny TestDeep TestFatal TimeMoment ]; + # propagatedBuildInputs = [ AuthenSASLSASLprep AuthenSCRAM BSON IOSocketSSL NetSSLeay ClassXSAccessor BSONXS TypeTinyXS MozillaCA Moo NetDNS SafeIsa SubQuote TieIxHash TypeTiny UUIDURandom boolean namespaceclean ]; + # meta = { + # description = "Official MongoDB Driver for Perl (EOL)"; + # homepage = "https://github.com/mongodb-labs/mongo-perl-driver"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # MonitoringPlugin = buildPerlPackage { + # pname = "Monitoring-Plugin"; + # version = "0.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NIERLEIN/Monitoring-Plugin-0.40.tar.gz"; + # hash = "sha256-+LprfifSuwpPmjKVWiRC1OQo0cSLgMixIUL/YRvnI28="; + # }; + # propagatedBuildInputs = [ ClassAccessor ConfigTiny MathCalcUnits ParamsValidate ]; + # meta = { + # description = '' + # A family of perl modules to streamline writing Naemon, + # Nagios, Icinga or Shinken (and compatible) plugins + # ''; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # IOPipely = buildPerlPackage { + # pname = "IO-Pipely"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCAPUTO/IO-Pipely-0.006.tar.gz"; + # hash = "sha256-Dj/NhBoyfvtUn6AbIIPcNpXnLqDGMwPlbtUWG/gQQTs="; + # }; + # meta = { + # description = "Portably create pipe() or pipe-like handles, one way or another"; + # homepage = "https://search.cpan.org/dist/IO-Pipely"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + Moo = buildPerlPackage { + pname = "Moo"; + version = "2.005005"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/Moo-2.005005.tar.gz"; + hash = "sha256-+1opUmSfrtBzc/Igt4AEqcaro4dzkTN0DBdw6bH0sQg="; + }; + buildInputs = [ TestFatal ]; + propagatedBuildInputs = [ ClassMethodModifiers ModuleRuntime RoleTiny SubQuote ]; + meta = { + description = "Minimalist Object Orientation (with Moose compatibility)"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # Moose = buildPerlPackage { + # pname = "Moose"; + # version = "2.2206"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Moose-2.2206.tar.gz"; + # hash = "sha256-Z5csTivDn72jhRgXevDme7vrVIVi5OxLdZoaelg+UFs="; + # }; + # buildInputs = [ DistCheckConflicts CPANMetaCheck TestCleanNamespaces TestFatal TestNeeds TestRequires ]; + # propagatedBuildInputs = [ ClassLoadXS DataOptList DevelGlobalDestruction DevelOverloadInfo DevelStackTrace EvalClosure MROCompat ModuleRuntimeConflicts PackageDeprecationManager PackageStashXS ParamsUtil SubExporter TryTiny ]; + # preConfigure = '' + # export LD=$CC + # ''; + # meta = { + # description = "A postmodern object system for Perl 5"; + # homepage = "http://moose.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.eelco ]; + # mainProgram = "moose-outdated"; + # }; + # }; + + # MooXHandlesVia = buildPerlPackage { + # pname = "MooX-HandlesVia"; + # version = "0.001009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBYINK/MooX-HandlesVia-0.001009.tar.gz"; + # hash = "sha256-cWNT44iU7Lfo5MF7yVSD219ZACsDVBtUpywn8qjzbBI="; + # }; + # buildInputs = [ MooXTypesMooseLike TestException TestFatal ]; + # propagatedBuildInputs = [ DataPerl Moo ]; + # meta = { + # description = "NativeTrait-like behavior for Moo"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXLocalePassthrough = buildPerlPackage { + # pname = "MooX-Locale-Passthrough"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/MooX-Locale-Passthrough-0.001.tar.gz"; + # hash = "sha256-egWCflKrWh3eLqXHEpJ7HljI0lFmTZZmJ6353TDsBRI="; + # }; + # propagatedBuildInputs = [ Moo ]; + # meta = { + # description = "Provide API used in translator modules without translating"; + # homepage = "https://metacpan.org/release/MooX-Locale-Passthrough"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXLocaleTextDomainOO = buildPerlPackage { + # pname = "MooX-Locale-TextDomain-OO"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/MooX-Locale-TextDomain-OO-0.001.tar.gz"; + # hash = "sha256-W45Sz/3YSpXTaMoQuUNUG5lqk+DQY5b0/hkzVojkFz0="; + # }; + # propagatedBuildInputs = [ LocaleTextDomainOO MooXLocalePassthrough ]; + # meta = { + # description = "Provide API used in translator modules without translating"; + # homepage = "https://metacpan.org/release/MooX-Locale-TextDomain-OO"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXOptions = buildPerlPackage { + # pname = "MooX-Options"; + # version = "4.103"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/MooX-Options-4.103.tar.gz"; + # hash = "sha256-TfnVdPjybbAivwbBvaRwgolFEJjC4VYzNd840jsHMm0="; + # }; + # propagatedBuildInputs = [ GetoptLongDescriptive MROCompat MooXLocalePassthrough PathClass UnicodeLineBreak strictures ]; + # buildInputs = [ Mo MooXCmd MooXLocaleTextDomainOO Moose TestTrap ]; + # preCheck = "rm t/16-namespace_clean.t"; # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=942275 + # meta = { + # description = "Explicit Options eXtension for Object Class"; + # homepage = "https://metacpan.org/celogeek/MooX-Options"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXSingleton = buildPerlModule { + # pname = "MooX-Singleton"; + # version = "1.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AJ/AJGB/MooX-Singleton-1.20.tar.gz"; + # hash = "sha256-99dib//emPhewSwe4msB8Tmk3d0vRT6lbDQd8ZTjIQ4="; + # }; + # propagatedBuildInputs = [ RoleTiny ]; + # buildInputs = [ Moo ]; + # meta = { + # description = "Turn your Moo class into singleton"; + # homepage = "https://search.cpan.org/dist/MooX-Singleton"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXStrictConstructor = buildPerlPackage { + # pname = "MooX-StrictConstructor"; + # version = "0.011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HARTZELL/MooX-StrictConstructor-0.011.tar.gz"; + # hash = "sha256-2jgvgi/8TiKgOqQZpCVydJmdNtiaThI27PT892vGU+I="; + # }; + # propagatedBuildInputs = [ Moo strictures ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Make your Moo-based object constructors blow up on unknown attributes"; + # homepage = "https://metacpan.org/release/MooX-StrictConstructor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXTypesMooseLike = buildPerlPackage { + # pname = "MooX-Types-MooseLike"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATEU/MooX-Types-MooseLike-0.29.tar.gz"; + # hash = "sha256-HTeAqpvqQwr75lqox25xjxBFzniKrdpBFvWdO3p60rQ="; + # }; + # propagatedBuildInputs = [ ModuleRuntime ]; + # buildInputs = [ Moo TestFatal ]; + # meta = { + # description = "Some Moosish types and a type builder"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXTypesMooseLikeNumeric = buildPerlPackage { + # pname = "MooX-Types-MooseLike-Numeric"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MATEU/MooX-Types-MooseLike-Numeric-1.03.tar.gz"; + # hash = "sha256-Fq3rYXuWPQEBeZIsLk6HYt93x1Iy4XMgtFmGjElwxEs="; + # }; + # buildInputs = [ Moo TestFatal ]; + # propagatedBuildInputs = [ MooXTypesMooseLike ]; + # meta = { + # description = "Moo types for numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXTypeTiny = buildPerlPackage { + # pname = "MooX-TypeTiny"; + # version = "0.002003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/MooX-TypeTiny-0.002003.tar.gz"; + # hash = "sha256-2B4m/2+NsQJh8Ah/ltxUNn3LSanz3o1TI4+DTs4ZYks="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ Moo TypeTiny ]; + # meta = { + # description = "Tiny, yet Moo(se)-compatible type constraint"; + # homepage = "https://typetiny.toby.ink"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseAutobox = buildPerlModule { + # pname = "Moose-Autobox"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Moose-Autobox-0.16.tar.gz"; + # hash = "sha256-kkAdpM9ITrcYjsGWtoGG76eCoQK0UeoVbNi4dy5ocFU="; + # }; + # buildInputs = [ ModuleBuildTiny TestException ]; + # propagatedBuildInputs = [ ListMoreUtils Moose SyntaxKeywordJunction autobox namespaceautoclean ]; + # meta = { + # description = "Autoboxed wrappers for Native Perl datatypes"; + # homepage = "https://github.com/moose/Moose-Autobox"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXABC = buildPerlPackage { + # pname = "MooseX-ABC"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/MooseX-ABC-0.06.tar.gz"; + # hash = "sha256-Tr7suUbkVSssRyH1u/I+9huTJlELVzlr9ZkLEW8Dfuo="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Abstract base classes for Moose"; + # homepage = "https://metacpan.org/release/MooseX-ABC"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXAliases = buildPerlPackage { + # pname = "MooseX-Aliases"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/MooseX-Aliases-0.11.tar.gz"; + # hash = "sha256-xIUPlyQmw0R6ru2Ny0Az6ERgylFwWtPqeLY6+Rn+B0g="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Easy aliasing of methods and attributes in Moose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXAppCmd = buildPerlModule { + # pname = "MooseX-App-Cmd"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-App-Cmd-0.34.tar.gz"; + # hash = "sha256-9eLy7xKcOI8qPjb1PeWYBErxtyLofXEFKdBcwl0jesI="; + # }; + # buildInputs = [ ModuleBuildTiny MooseXConfigFromFile TestOutput YAML ]; + # propagatedBuildInputs = [ AppCmd MooseXGetopt MooseXNonMoose ]; + # meta = { + # description = "Mashes up MooseX::Getopt and App::Cmd"; + # homepage = "https://github.com/moose/MooseX-App-Cmd"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXStorageFormatJSONpm = buildPerlPackage { + # pname = "MooseX-Storage-Format-JSONpm"; + # version = "0.093094"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/MooseX-Storage-Format-JSONpm-0.093094.tar.gz"; + # hash = "sha256-9sgItyC99HI4VaZ4sblQLHSSABXFq8YL2uasYNFGxYQ="; + # }; + # buildInputs = [ Moose TestDeepJSON TestWithoutModule DigestHMAC MooseXTypes ]; + # propagatedBuildInputs = [ JSON MooseXRoleParameterized MooseXStorage namespaceautoclean ]; + # meta = { + # description = "A format role for MooseX::Storage using JSON.pm"; + # homepage = "https://github.com/rjbs/MooseX-Storage-Format-JSONpm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooX = buildPerlPackage { + # pname = "MooX"; + # version = "0.101"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GE/GETTY/MooX-0.101.tar.gz"; + # hash = "sha256-L/kaZW54quCspCKTgp16flrLm/IrBAFjWyq2yHDeMtU="; + # }; + # propagatedBuildInputs = [ DataOptList ImportInto Moo ]; + # meta = { + # description = "Using Moo and MooX:: packages the most lazy way"; + # homepage = "https://github.com/Getty/p5-moox"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXAliases = buildPerlPackage { + # pname = "MooX-Aliases"; + # version = "0.001006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/MooX-Aliases-0.001006.tar.gz"; + # hash = "sha256-AWAxJ4ysYSY9AZUt/lv7XztGtLhCsv/6nyybiKrGOGc="; + # }; + # propagatedBuildInputs = [ Moo strictures ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Easy aliasing of methods and attributes in Moo"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXCmd = buildPerlPackage { + # pname = "MooX-Cmd"; + # version = "0.017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/MooX-Cmd-0.017.tar.gz"; + # hash = "sha256-lD/yjaqAiXMnx8X+xacQDPqsktrw+fl8OOOnfQCucPU="; + # }; + # propagatedBuildInputs = [ ListMoreUtils ModulePluggable Moo PackageStash ParamsUtil RegexpCommon ]; + # buildInputs = [ CaptureTiny ]; + # meta = { + # description = "Giving an easy Moo style way to make command organized CLI apps"; + # homepage = "https://metacpan.org/release/MooX-Cmd"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooXlate = buildPerlPackage { + # pname = "MooX-late"; + # version = "0.100"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBYINK/MooX-late-0.100.tar.gz"; + # hash = "sha256-KuWx49pavA5ABieOy8+o+nwiTqVSmmpoisuyKcCeal8="; + # }; + # buildInputs = [ TestFatal TestRequires ]; + # propagatedBuildInputs = [ Moo SubHandlesVia ]; + # meta = { + # description = "Easily translate Moose code to Moo"; + # homepage = "https://metacpan.org/release/MooX-late"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXSimpleConfig = buildPerlPackage { + # pname = "MouseX-SimpleConfig"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MJ/MJGARDNER/MouseX-SimpleConfig-0.11.tar.gz"; + # hash = "sha256-JX84QJHTPTQDc6YVOUcDnGmNxEnR75iTNWRPw9LaAGk="; + # }; + # propagatedBuildInputs = [ ConfigAny MouseXConfigFromFile ]; + # meta = { + # description = "A Mouse role for setting attributes from a simple configfile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestArchiveLibarchive = buildPerlPackage { + # pname = "Test-Archive-Libarchive"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test-Archive-Libarchive-0.02.tar.gz"; + # hash = "sha256-KxkYZx4F2i2dIiwQx9kXWFpiQYb+r7j4SQhZnDRwJ1E="; + # }; + # propagatedBuildInputs = [ RefUtil Test2Suite ]; + # meta = { + # homepage = "https://metacpan.org/pod/Test::Archive::Libarchive"; + # description = "Testing tools for Archive::Libarchive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # TestPostgreSQL = buildPerlModule { + # pname = "Test-PostgreSQL"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TJ/TJC/Test-PostgreSQL-1.29.tar.gz"; + # hash = "sha256-GKz35YnKTMqc3kdgm1NsnYI8hWLRqlIQwWjl6xuOT54="; + # }; + # buildInputs = [ ModuleBuildTiny TestSharedFork pkgs.postgresql ]; + # propagatedBuildInputs = [ DBDPg DBI FileWhich FunctionParameters Moo TieHashMethod TryTiny TypeTiny ]; + + # makeMakerFlags = [ "POSTGRES_HOME=${pkgs.postgresql}" ]; + + # meta = { + # description = "PostgreSQL runner for tests"; + # homepage = "https://github.com/TJC/Test-postgresql"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestUseAllModules = buildPerlPackage { + # pname = "Test-UseAllModules"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Test-UseAllModules-0.17.tar.gz"; + # hash = "sha256-px8v6LlquL/Cdgqh0xNeoEmlsg3LEFRXt2mhGVx6JQk="; + # }; + # meta = { + # description = "Do use_ok() for all the MANIFESTed modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestValgrind = buildPerlPackage { + # pname = "Test-Valgrind"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VP/VPIT/Test-Valgrind-1.19.tar.gz"; + # hash = "sha256-GDinoV/ueo8Gnk5rRhxeFpBYthW437Q3hLPV2hpggRs="; + # }; + # propagatedBuildInputs = [ EnvSanctify FileHomeDir PerlDestructLevel XMLTwig ]; + # meta = { + # description = "Generate suppressions, analyse and test any command with valgrind"; + # homepage = "https://search.cpan.org/dist/Test-Valgrind"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXTypesPathClass = buildPerlPackage { + # pname = "MouseX-Types-Path-Class"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MASAKI/MouseX-Types-Path-Class-0.07.tar.gz"; + # hash = "sha256-Io1LTz8O2VRyeGkdC3xf5T2Qh0pp33CaSXA8avh8Cd4="; + # }; + # buildInputs = [ TestUseAllModules ]; + # propagatedBuildInputs = [ MouseXTypes PathClass ]; + # meta = { + # description = "Cross-platform path specification manipulation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXTypes = buildPerlPackage { + # pname = "MouseX-Types"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFUJI/MouseX-Types-0.06.tar.gz"; + # hash = "sha256-dyiEQf2t0Vvu7JoIE+zorsFULx2M6q7BR1Wz8xb7z4s="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ AnyMoose ]; + # meta = { + # description = "Organize your Mouse types in libraries"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXConfigFromFile = buildPerlPackage { + # pname = "MouseX-ConfigFromFile"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MASAKI/MouseX-ConfigFromFile-0.05.tar.gz"; + # hash = "sha256-khsxyxP8H5gqYC+OI4Fbet0joiQlfkN5Dih1BM6HlTQ="; + # }; + # buildInputs = [ TestUseAllModules ]; + # propagatedBuildInputs = [ MouseXTypesPathClass ]; + # meta = { + # description = "An abstract Mouse role for setting attributes from a configfile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXGetopt = buildPerlModule { + # pname = "MouseX-Getopt"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFUJI/MouseX-Getopt-0.38.tar.gz"; + # hash = "sha256-3j6o70Ut2VAeqMTtqHRLciRgJgKwRpJgft19YrefA48="; + # }; + # patches = [ + # ./perl-modules/MouseX-Getopt-gld-tests.patch + # ]; + # buildInputs = [ ModuleBuildTiny MouseXConfigFromFile MouseXSimpleConfig TestException TestWarn ]; + # propagatedBuildInputs = [ GetoptLongDescriptive Mouse ]; + # meta = { + # description = "A Mouse role for processing command line options"; + # homepage = "https://github.com/gfx/mousex-getopt"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXAttributeChained = buildPerlModule { + # pname = "MooseX-Attribute-Chained"; + # version = "1.0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOMHUKINS/MooseX-Attribute-Chained-1.0.3.tar.gz"; + # hash = "sha256-5+OKp8O3i1c06dQ892gy/OAHZ+alPV3Xmhci2GdtXk4="; + # }; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Attribute that returns the instance to allow for chaining"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXAttributeHelpers = buildPerlModule { + # pname = "MooseX-AttributeHelpers"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-AttributeHelpers-0.25.tar.gz"; + # hash = "sha256-sMgZ7IOZmyWLJI+CBZ+ll1oM7jZUI6u+4O+spUAcXsY="; + # }; + # buildInputs = [ ModuleBuildTiny TestException ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "(DEPRECATED) Extend your attribute interfaces"; + # homepage = "https://github.com/moose/MooseX-AttributeHelpers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXClone = buildPerlModule { + # pname = "MooseX-Clone"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Clone-0.06.tar.gz"; + # hash = "sha256-y9eCXbnnSwU/UkVEoBTwZv3OKQMW67Vo+HZ5GBs5jac="; + # }; + # propagatedBuildInputs = [ DataVisitor HashUtilFieldHashCompat namespaceautoclean ]; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Fine-grained cloning support for Moose objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXConfigFromFile = buildPerlModule { + # pname = "MooseX-ConfigFromFile"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-ConfigFromFile-0.14.tar.gz"; + # hash = "sha256-mtNDzZ+G1xS+m1S5xopEPYrMZQG2rWsV6coBMLLpbwg="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestFatal TestRequires TestWithoutModule ]; + # propagatedBuildInputs = [ MooseXTypesPathTiny ]; + # meta = { + # description = "An abstract Moose role for setting attributes from a configfile"; + # homepage = "https://github.com/moose/MooseX-ConfigFromFile"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXDaemonize = buildPerlModule { + # pname = "MooseX-Daemonize"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Daemonize-0.22.tar.gz"; + # hash = "sha256-in+5mdypuAKoUTahAUGy0zeKPs3gUnwd9z1V7bKOWbM="; + # }; + # buildInputs = [ DevelCheckOS ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ MooseXGetopt MooseXTypesPathClass ]; + # meta = { + # description = "Role for daemonizing your Moose based application"; + # homepage = "https://github.com/moose/MooseX-Daemonize"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXEmulateClassAccessorFast = buildPerlPackage { + # pname = "MooseX-Emulate-Class-Accessor-Fast"; + # version = "0.009032"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/MooseX-Emulate-Class-Accessor-Fast-0.009032.tar.gz"; + # hash = "sha256-gu637x8NJUGK5AbqJpErJBQo1LKrlRDV6d6z9ywYeZQ="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ Moose namespaceclean ]; + # meta = { + # description = "Emulate Class::Accessor::Fast behavior using Moose attributes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXGetopt = buildPerlModule { + # pname = "MooseX-Getopt"; + # version = "0.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Getopt-0.75.tar.gz"; + # hash = "sha256-Y/O+W7K8OB6eSLW5XAMw8hcYtmVuj/sZyZ0u4KwU68g="; + # }; + # buildInputs = [ ModuleBuildTiny MooseXStrictConstructor PathTiny TestDeep TestFatal TestNeeds TestTrap TestWarnings ]; + # propagatedBuildInputs = [ GetoptLongDescriptive MooseXRoleParameterized ]; + # meta = { + # description = "A Moose role for processing command line options"; + # homepage = "https://github.com/moose/MooseX-Getopt"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXHasOptions = buildPerlPackage { + # pname = "MooseX-Has-Options"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PS/PSHANGOV/MooseX-Has-Options-0.003.tar.gz"; + # hash = "sha256-B8Ic+O1QCycgIP+NoZ8ZRyi7QU4AEqLwzFTvLvYiKmg="; + # }; + # buildInputs = [ Moose TestDeep TestDifferences TestException TestMost TestWarn namespaceautoclean ]; + # propagatedBuildInputs = [ ClassLoad ListMoreUtils StringRewritePrefix ]; + # meta = { + # description = "Succinct options for Moose"; + # homepage = "https://github.com/pshangov/moosex-has-options"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXHasSugar = buildPerlPackage { + # pname = "MooseX-Has-Sugar"; + # version = "1.000006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KE/KENTNL/MooseX-Has-Sugar-1.000006.tar.gz"; + # hash = "sha256-7+7T3bOo6hj0FtSF88KwQnFF0mfmM2jGUdSI6qjCjQk="; + # }; + # buildInputs = [ TestFatal namespaceclean ]; + # propagatedBuildInputs = [ SubExporterProgressive ]; + # meta = { + # description = "Sugar Syntax for moose 'has' fields"; + # homepage = "https://github.com/kentnl/MooseX-Has-Sugar"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXLazyRequire = buildPerlModule { + # pname = "MooseX-LazyRequire"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-LazyRequire-0.11.tar.gz"; + # hash = "sha256-72IMHgGdr5zz8jqUPSWpTJHpOrMSvNY74ul0DsC5Qog="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ Moose aliased namespaceautoclean ]; + # meta = { + # description = "Required attributes which fail only when trying to use them"; + # homepage = "https://github.com/moose/MooseX-LazyRequire"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXMarkAsMethods = buildPerlPackage { + # pname = "MooseX-MarkAsMethods"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSRCHBOY/MooseX-MarkAsMethods-0.15.tar.gz"; + # hash = "sha256-yezBM3bQ/326SBl3M3wz6nTl0makKLavMVUqKRnvfvg="; + # }; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Mark overload code symbols as methods"; + # homepage = "https://metacpan.org/release/MooseX-MarkAsMethods"; + # license = with lib.licenses; [ lgpl21Only ]; + # }; + # }; + + # MooseXMethodAttributes = buildPerlPackage { + # pname = "MooseX-MethodAttributes"; + # version = "0.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-MethodAttributes-0.32.tar.gz"; + # hash = "sha256-yzOIZXS30t05xCwNzccHrNsK7H273pohwEImYDaMGXs="; + # }; + # buildInputs = [ MooseXRoleParameterized TestFatal TestNeeds ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Code attribute introspection"; + # homepage = "https://github.com/moose/MooseX-MethodAttributes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXNonMoose = buildPerlPackage { + # pname = "MooseX-NonMoose"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/MooseX-NonMoose-0.26.tar.gz"; + # hash = "sha256-y75S7PFgOCMfvX8sxrzhZqNWnIyzlq6A7EUXwuCNqn0="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ ListMoreUtils Moose ]; + # meta = { + # description = "Easy subclassing of non-Moose classes"; + # homepage = "https://metacpan.org/release/MooseX-NonMoose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXOneArgNew = buildPerlPackage { + # pname = "MooseX-OneArgNew"; + # version = "0.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/MooseX-OneArgNew-0.007.tar.gz"; + # hash = "sha256-hCgkNfEWnPCddRP6k4fiCReRY1zzWgeLUAuCmu6gYTg="; + # }; + # propagatedBuildInputs = [ MooseXRoleParameterized ]; + # meta = { + # description = "Teach ->new to accept single, non-hashref arguments"; + # homepage = "https://github.com/rjbs/MooseX-OneArgNew"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXRelatedClassRoles = buildPerlPackage { + # pname = "MooseX-RelatedClassRoles"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HD/HDP/MooseX-RelatedClassRoles-0.004.tar.gz"; + # hash = "sha256-MNt6I33SYCIhb/+5cLmFKFNHEws2kjxxGqCVaty0fp8="; + # }; + # propagatedBuildInputs = [ MooseXRoleParameterized ]; + # meta = { description = "Apply roles to a class related to yours"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXParamsValidate = buildPerlPackage { + # pname = "MooseX-Params-Validate"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/MooseX-Params-Validate-0.21.tar.gz"; + # hash = "sha256-iClURqupmcu4+ZjX+5onAdZhc5SlHW1yTHdObZ/xOdk="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ DevelCaller Moose ParamsValidate ]; + # meta = { + # description = "An extension of Params::Validate using Moose's types"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXRoleParameterized = buildPerlModule { + # pname = "MooseX-Role-Parameterized"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Role-Parameterized-1.11.tar.gz"; + # hash = "sha256-HP52bF1/Dsq1f3M9zKQwoqKs1rmVdXFBuUCt42kr7J4="; + # }; + # buildInputs = [ CPANMetaCheck ModuleBuildTiny TestFatal TestNeeds ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Moose roles with composition parameters"; + # homepage = "https://github.com/moose/MooseX-Role-Parameterized"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXRoleWithOverloading = buildPerlPackage { + # pname = "MooseX-Role-WithOverloading"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Role-WithOverloading-0.17.tar.gz"; + # hash = "sha256-krCV1z8SIPnC7S06qlugcutaot4gm3xFXaWocBuYaGU="; + # }; + # propagatedBuildInputs = [ Moose aliased namespaceautoclean ]; + # meta = { + # description = "(DEPRECATED) Roles which support overloading"; + # homepage = "https://github.com/moose/MooseX-Role-WithOverloading"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXRunnable = buildPerlModule { + # pname = "MooseX-Runnable"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Runnable-0.10.tar.gz"; + # hash = "sha256-QNj9G1UkrpZZZaHxRNegoMhQWUxSRAKyMZsk1cSvEZk="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal TestSimple13 TestTableDriven ]; + # propagatedBuildInputs = [ ListSomeUtils MooseXTypesPathTiny ]; + # meta = { + # description = "Tag a class as a runnable application"; + # homepage = "https://github.com/moose/MooseX-Runnable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mx-run"; + # }; + # }; + + # MooseXSemiAffordanceAccessor = buildPerlPackage { + # pname = "MooseX-SemiAffordanceAccessor"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/MooseX-SemiAffordanceAccessor-0.10.tar.gz"; + # hash = "sha256-pbhXdrzd7RaAJ6H/ZktBxfZYhnIc3VQ+OvnVN1misdU="; + # }; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Name your accessors foo() and set_foo()"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MooseXSetOnce = buildPerlPackage { + # pname = "MooseX-SetOnce"; + # version = "0.200002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/MooseX-SetOnce-0.200002.tar.gz"; + # hash = "sha256-y+0Gt/zTU/DZm/gKh8HAtYEWBpcjGzrZpgjaIxuitlk="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Write-once, read-many attributes for Moose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXSingleton = buildPerlModule { + # pname = "MooseX-Singleton"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Singleton-0.30.tar.gz"; + # hash = "sha256-ZYSy8xsdPrbdfiMShzjnP2wBWxUhOLCoFX09DVnQZUE="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal TestRequires TestWarnings ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Turn your Moose class into a singleton"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXStorage = buildPerlPackage { + # pname = "MooseX-Storage"; + # version = "0.53"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Storage-0.53.tar.gz"; + # hash = "sha256-hwS/5QX2azQPYuhcn/MZwZ6WcLJtSwEskfThA7HarOA="; + # }; + # buildInputs = [ TestDeep TestDeepType TestFatal TestNeeds TestDeepJSON TestWithoutModule DigestHMAC MooseXTypes ]; + # propagatedBuildInputs = [ ModuleRuntime Moose MooseXRoleParameterized PodCoverage StringRewritePrefix namespaceautoclean IOStringy JSON JSONXS JSONMaybeXS CpanelJSONXS YAML YAMLOld YAMLTiny YAMLLibYAML YAMLSyck ]; + # meta = { + # description = "A serialization framework for Moose classes"; + # homepage = "https://github.com/moose/MooseX-Storage"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXStrictConstructor = buildPerlPackage { + # pname = "MooseX-StrictConstructor"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/MooseX-StrictConstructor-0.21.tar.gz"; + # hash = "sha256-xypa6Vg3Bszexx1AHcswVAE6dTa3UN8UNmE9hY6ikg0="; + # }; + # buildInputs = [ Moo TestFatal TestNeeds ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Make your object constructors blow up on unknown attributes"; + # homepage = "https://metacpan.org/release/MooseX-StrictConstructor"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # MooseXTraits = buildPerlModule { + # pname = "MooseX-Traits"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Traits-0.13.tar.gz"; + # hash = "sha256-dK/gxPr047l8V/KJQ3yqYL7Mo0zVgh9IndTMnaT74po="; + # }; + # buildInputs = [ ModuleBuildTiny MooseXRoleParameterized TestFatal TestRequires TestSimple13 ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Automatically apply roles at object creation time"; + # homepage = "https://github.com/moose/MooseX-Traits"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTraitsPluggable = buildPerlPackage { + # pname = "MooseX-Traits-Pluggable"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/MooseX-Traits-Pluggable-0.12.tar.gz"; + # hash = "sha256-q5a3lQ7L8puDb9/uu+Cqwiylc+cYO+fLfW0S3yKrWMo="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ ListMoreUtils Moose namespaceautoclean ]; + # meta = { + # description = "Trait loading and resolution for Moose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypes = buildPerlModule { + # pname = "MooseX-Types"; + # version = "0.50"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-0.50.tar.gz"; + # hash = "sha256-nNh7NJLL8L6dLfkxeyrfn8MGY3cOaZBmVL6j9BsXywg="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal TestRequires ]; + # propagatedBuildInputs = [ CarpClan Moose SubExporterForMethods namespaceautoclean ]; + # meta = { + # description = "Organise your Moose types in libraries"; + # homepage = "https://github.com/moose/MooseX-Types"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesCommon = buildPerlModule { + # pname = "MooseX-Types-Common"; + # version = "0.001014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-Common-0.001014.tar.gz"; + # hash = "sha256-75Nxi20vJA1QtcOssadLTCoZGGllFHAAGoK+HzXQ7w8="; + # }; + # buildInputs = [ ModuleBuildTiny TestDeep TestWarnings ]; + # propagatedBuildInputs = [ MooseXTypes ]; + # meta = { + # description = "A library of commonly used type constraints"; + # homepage = "https://github.com/moose/MooseX-Types-Common"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesDateTime = buildPerlModule { + # pname = "MooseX-Types-DateTime"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-DateTime-0.13.tar.gz"; + # hash = "sha256-uJ+iZjb2oX6qOGi0UUNARytou9whYaHXmiKhv1sdOcY="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal TestSimple13 ]; + # propagatedBuildInputs = [ DateTime MooseXTypes ]; + # meta = { + # description = "DateTime related constraints and coercions for Moose"; + # homepage = "https://github.com/moose/MooseX-Types-DateTime"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesDateTimeMoreCoercions = buildPerlModule { + # pname = "MooseX-Types-DateTime-MoreCoercions"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-DateTime-MoreCoercions-0.15.tar.gz"; + # hash = "sha256-Ibs6WXcZiI7bbOqhMkGNXPkuy5KlDM43uUJZpV4ON5Y="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal TestSimple13 ]; + # propagatedBuildInputs = [ DateTimeXEasy MooseXTypesDateTime TimeDurationParse ]; + # meta = { + # description = "Extensions to MooseX::Types::DateTime"; + # homepage = "https://github.com/moose/MooseX-Types-DateTime-MoreCoercions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesLoadableClass = buildPerlModule { + # pname = "MooseX-Types-LoadableClass"; + # version = "0.015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-LoadableClass-0.015.tar.gz"; + # hash = "sha256-4DfTd4JT3PkpRkNXFbraDmRJwKKAj6P/MqllBk1aO/Q="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ MooseXTypes ]; + # meta = { + # description = "ClassName type constraint with coercion to load the class"; + # homepage = "https://github.com/moose/MooseX-Types-LoadableClass"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesPathClass = buildPerlModule { + # pname = "MooseX-Types-Path-Class"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-Path-Class-0.09.tar.gz"; + # hash = "sha256-54S6tTaYrpWnCahmMwYUX/7FVmjfbPMWFTM1I/vn734="; + # }; + # propagatedBuildInputs = [ MooseXTypes PathClass ]; + # buildInputs = [ ModuleBuildTiny TestNeeds ]; + # meta = { + # description = "A Path::Class type library for Moose"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesPathTiny = buildPerlModule { + # pname = "MooseX-Types-Path-Tiny"; + # version = "0.012"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-Path-Tiny-0.012.tar.gz"; + # hash = "sha256-Ge7eAt1lTnD3PjTNevAGN2UXO8rv7v8b2+ITGOz9kVg="; + # }; + # buildInputs = [ Filepushd ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ MooseXGetopt MooseXTypesStringlike PathTiny ]; + # meta = { + # description = "Path::Tiny types and coercions for Moose"; + # homepage = "https://github.com/karenetheridge/moosex-types-path-tiny"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # MooseXTypesPerl = buildPerlPackage { + # pname = "MooseX-Types-Perl"; + # version = "0.101344"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/MooseX-Types-Perl-0.101344.tar.gz"; + # hash = "sha256-h2RDVPdPplI1yyv8pEJ3kwp+q+UazF+B+2MVMKg1XiQ="; + # }; + # propagatedBuildInputs = [ MooseXTypes ]; + # meta = { + # description = "Moose types that check against Perl syntax"; + # homepage = "https://github.com/rjbs/MooseX-Types-Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesStringlike = buildPerlPackage { + # pname = "MooseX-Types-Stringlike"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/MooseX-Types-Stringlike-0.003.tar.gz"; + # hash = "sha256-LuNJ7FxSmm80f0L/ZA5HskVWS5PMowXfY8eCH1tVzxk="; + # }; + # propagatedBuildInputs = [ MooseXTypes ]; + # meta = { + # description = "Moose type constraints for strings or string-like objects"; + # homepage = "https://github.com/dagolden/MooseX-Types-Stringlike"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # MooseXTypesStructured = buildPerlModule { + # pname = "MooseX-Types-Structured"; + # version = "0.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-Structured-0.36.tar.gz"; + # hash = "sha256-Q822UvljhyPjV3yw+LVGhiAkTJY252WYEeW0qAFgPVc="; + # }; + # buildInputs = [ DateTime ModuleBuildTiny MooseXTypesDateTime TestFatal TestNeeds ]; + # propagatedBuildInputs = [ DevelPartialDump MooseXTypes ]; + # meta = { + # description = "Structured Type Constraints for Moose"; + # homepage = "https://github.com/moose/MooseX-Types-Structured"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MooseXTypesURI = buildPerlModule { + # pname = "MooseX-Types-URI"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/MooseX-Types-URI-0.09.tar.gz"; + # hash = "sha256-Jxd1Ta25EIbhHSH+oGy6qaEuYBtB0VRDFQ7dfZUI7+g="; + # }; + # buildInputs = [ ModuleBuildTiny TestNeeds TestWithoutModule ]; + # propagatedBuildInputs = [ MooseXTypes URI URIFromHash namespaceautoclean ]; + # meta = { + # description = "URI related types and coercions for Moose"; + # homepage = "https://github.com/moose/MooseX-Types-URI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MP3CutGapless = buildPerlPackage { + # pname = "MP3-Cut-Gapless"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AG/AGRUNDMA/MP3-Cut-Gapless-0.03.tar.gz"; + # hash = "sha256-PoS3OdHx4902FvhR3GV14WXTKEZ/AySGB5UOWVH+pPM="; + # }; + # propagatedBuildInputs = [ AudioCuefileParser ]; + # meta = { + # description = "Split an MP3 file without gaps (based on pcutmp3)"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # MP3Info = buildPerlPackage { + # pname = "MP3-Info"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMERELO/MP3-Info-1.26.tar.gz"; + # hash = "sha256-V2I0BzJCHyUCp3DWoSblhPLNljNR0rwle9J4w5vOi+c="; + # }; + # meta = { + # description = "Manipulate / fetch info from MP3 audio files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MP3Tag = buildPerlPackage { + # pname = "MP3-Tag"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IL/ILYAZ/modules/MP3-Tag-1.16.zip"; + # hash = "sha256-UDhQk6owAFa8Jiu2pACpbiGVl3wcXh6/FaXgdak3e4Y="; + # }; + # buildInputs = [ pkgs.unzip ]; + + # postPatch = '' + # substituteInPlace Makefile.PL --replace "'PL_FILES'" "#'PL_FILES'" + # ''; + # postFixup = '' + # perl data_pod.PL PERL5LIB:$PERL5LIB + # ''; + # outputs = [ "out" ]; + # meta = { + # description = "Module for reading tags of MP3 audio files"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # MockMonkeyPatch = buildPerlModule { + # pname = "Mock-MonkeyPatch"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JB/JBERGER/Mock-MonkeyPatch-1.02.tar.gz"; + # hash = "sha256-xbaUTKVP6DVXN2cwYO1OnvhyNyZXfXluHK5eVr8bAYE="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Monkey patching with test mocking in mind"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Mouse = buildPerlModule { + # pname = "Mouse"; + # version = "2.5.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/Mouse-v2.5.10.tar.gz"; + # hash = "sha256-zo3COUYVOkZ/8JdlFn7iWQ9cUCEg9IotlEFzPzmqMu4="; + # }; + # buildInputs = [ ModuleBuildXSUtil TestException TestFatal TestLeakTrace TestOutput TestRequires TryTiny ]; + # perlPreHook = "export LD=$CC"; + # env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isi686 "-fno-stack-protector"; + # hardeningDisable = lib.optional stdenv.isi686 "stackprotector"; + # meta = { + # description = "Moose minus the antlers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MouseXNativeTraits = buildPerlPackage { + # pname = "MouseX-NativeTraits"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFUJI/MouseX-NativeTraits-1.09.tar.gz"; + # hash = "sha256-+KW/WihwLfsTyAk75cQcq5xfwcXSR6uR4i591ydky14="; + # }; + # buildInputs = [ AnyMoose TestFatal ]; + # propagatedBuildInputs = [ Mouse ]; + # meta = { + # description = "Extend your attribute interfaces for Mouse"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + MozillaCA = buildPerlPackage { + pname = "Mozilla-CA"; + version = "20230821"; + src = fetchurl { + url = "mirror://cpan/authors/id/L/LW/LWP/Mozilla-CA-20230821.tar.gz"; + hash = "sha256-MuHQBFKZAEBFucTRbC2q5FOiFiCIc97qJED3EmCnzaE="; + }; + + postPatch = '' + ln -s --force ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt lib/Mozilla/CA/cacert.pem + ''; + + meta = { + description = "Mozilla's CA cert bundle in PEM format"; + homepage = "https://github.com/gisle/mozilla-ca"; + license = with lib.licenses; [ mpl20 ]; + }; + }; + + MozillaLdap = callPackage ./perl-modules/Mozilla-LDAP { }; + + MROCompat = buildPerlPackage { + pname = "MRO-Compat"; + version = "0.15"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/MRO-Compat-0.15.tar.gz"; + hash = "sha256-DUU1+I5Dur2Eq2BIZiFfxNBDmL1Nt7IYUtSjGxwV72E="; + }; + meta = { + description = "Mro::* interface compatibility for Perls < 5.9.5"; + homepage = "https://metacpan.org/release/MRO-Compat"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # MsgPackRaw = buildPerlPackage rec { + # pname = "MsgPack-Raw"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JACQUESG/MsgPack-Raw-${version}.tar.gz"; + # hash = "sha256-hVnitkzZjZmrxmbt8qTIckyVNGEmFq8R9OsLvQ1CLaw="; + # }; + # checkInputs = [ TestPod TestPodCoverage ]; + # meta = with lib; { + # description = "Perl bindings to the msgpack C library"; + # homepage = "https://github.com/jacquesg/p5-MsgPack-Raw"; + # license = with licenses; [ gpl1Plus /* or */ artistic1 ]; + # maintainers = with maintainers; [ figsoda ]; + # }; + # }; + + # MusicBrainzDiscID = buildPerlPackage { + # pname = "MusicBrainz-DiscID"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NJ/NJH/MusicBrainz-DiscID-0.06.tar.gz"; + # hash = "sha256-ugtu0JiX/1Y7pZhy7pNxW+83FXUVsZt8bW8obmVI7Ks="; + # }; + # # Makefile.PL in this package uses which to find pkg-config -- make it use envvar instead + # postPatch = '' + # substituteInPlace Makefile.PL \ + # --replace-fail '`which pkg-config`' "'$PKG_CONFIG'" + # ''; + # doCheck = false; # The main test performs network access + # nativeBuildInputs = [ pkgs.pkg-config ]; + # propagatedBuildInputs = [ pkgs.libdiscid ]; + # meta = { + # description = "- Perl interface for the MusicBrainz libdiscid library"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # MusicBrainz = buildPerlModule { + # pname = "WebService-MusicBrainz"; + # version = "1.0.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BF/BFAIST/WebService-MusicBrainz-1.0.6.tar.gz"; + # hash = "sha256-XpH1ZZZ3w5CJv28lO0Eoe7zTVh9qJaB5Zc6DsmKIUuE="; + # }; + # propagatedBuildInputs = [ Mojolicious ]; + # doCheck = false; # Test performs network access. + # meta = { + # description = "API to search the musicbrainz.org database"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MustacheSimple = buildPerlPackage { + # pname = "Mustache-Simple"; + # version = "1.3.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CM/CMS/Mustache-Simple-v1.3.6.tar.gz"; + # hash = "sha256-UdtdUf9LJaZw2L+r45ArbUVDTs94spvB//Ga9uc4MAM="; + # }; + # propagatedBuildInputs = [ YAMLLibYAML ]; + # meta = { + # description = "A simple Mustache Renderer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # MySQLDiff = buildPerlPackage { + # pname = "MySQL-Diff"; + # version = "0.60"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ES/ESTRABD/MySQL-Diff-0.60.tar.gz"; + # hash = "sha256-XXCApL1XFP+e9Taqd0p62zxvDnYCFcpsOdijVFNE+VY="; + # }; + # propagatedBuildInputs = [ pkgs.mariadb.client FileSlurp StringShellQuote ]; + # meta = { + # description = "Generates a database upgrade instruction set"; + # homepage = "https://github.com/estrabd/mysqldiff"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # mainProgram = "mysqldiff"; + # }; + # }; + + # namespaceautoclean = buildPerlPackage { + # pname = "namespace-autoclean"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/namespace-autoclean-0.29.tar.gz"; + # hash = "sha256-RevY5kpUqG+I2OAa5VISlnyKqP7VfoFAhd73YIrGWAQ="; + # }; + # buildInputs = [ TestNeeds ]; + # propagatedBuildInputs = [ SubIdentify namespaceclean ]; + # meta = { + # description = "Keep imports out of your namespace"; + # homepage = "https://github.com/moose/namespace-autoclean"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # namespaceclean = buildPerlPackage { + # pname = "namespace-clean"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RI/RIBASUSHI/namespace-clean-0.27.tar.gz"; + # hash = "sha256-ihCoPD4YPcePnnt6pNCbR8EftOfTozuaEpEv0i4xr50="; + # }; + # propagatedBuildInputs = [ BHooksEndOfScope PackageStash ]; + # meta = { + # description = "Keep imports and functions out of your namespace"; + # homepage = "https://search.cpan.org/dist/namespace-clean"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NeovimExt = buildPerlPackage rec { + # pname = "Neovim-Ext"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JACQUESG/Neovim-Ext-${version}.tar.gz"; + # hash = "sha256-bSzrMGLJZzfbpVbLIEYxMPxABocbJbfE9mzTgZ1FBLg="; + # }; + # propagatedBuildInputs = [ + # ClassAccessor + # EvalSafe + # IOAsync + # MsgPackRaw + # ]; + # checkInputs = [ + # ArchiveZip + # FileSlurper + # FileWhich + # ProcBackground + # TestPod + # TestPodCoverage + # ]; + # # TODO: fix tests + # doCheck = false; + # meta = with lib; { + # description = "Perl bindings for Neovim"; + # homepage = "https://github.com/jacquesg/p5-Neovim-Ext"; + # license = with licenses; [ gpl1Plus /* or */ artistic1 ]; + # maintainers = with maintainers; [ figsoda ]; + # }; + # }; + + # NetDNSNative = buildPerlPackage { + # pname = "Net-DNS-Native"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OL/OLEG/Net-DNS-Native-0.22.tar.gz"; + # hash = "sha256-EI2d7bq5/69qDQFSVSbeGJSITpUL/YM3F+XNOJBcMNU="; + # }; + # meta = { + # description = "Non-blocking system DNS resolver"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # NetIdent = buildPerlPackage { + # pname = "Net-Ident"; + # version = "1.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Net-Ident-1.25.tar.gz"; + # hash = "sha256-LlvViwHCpm6ASaL42ck+G19tzlPg7jpIHOam9BHyyPg="; + # }; + # meta = { + # description = "Lookup the username on the remote end of a TCP/IP connection"; + # homepage = "https://github.com/toddr/Net-Ident"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # NetINET6Glue = buildPerlPackage { + # pname = "Net-INET6Glue"; + # version = "0.604"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SU/SULLR/Net-INET6Glue-0.604.tar.gz"; + # hash = "sha256-kMNjmPlQFBTMzaiynyOn908vK09VLhLevxYhjHNbuxc="; + # }; + # meta = { + # description = "Make common modules IPv6 ready by hotpatching"; + # homepage = "https://github.com/noxxi/p5-net-inet6glue"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAddrIP = buildPerlPackage { + # pname = "NetAddr-IP"; + # version = "4.079"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz"; + # hash = "sha256-7FqC37cCi80ouz1Wn5XYfdQWbMGYZ/IYTtOln21soOc="; + # }; + # meta = { + # description = "Manages IPv4 and IPv6 addresses and subnets"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAmazonAWSSign = buildPerlPackage { + # pname = "Net-Amazon-AWSSign"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NA/NATON/Net-Amazon-AWSSign-0.12.tar.gz"; + # hash = "sha256-HQQMazseorVlkFefnBjgUAtsaiF7WdiDHw2WBMqX7T4="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Perl extension to create signatures for AWS requests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAmazonEC2 = buildPerlPackage { + # pname = "Net-Amazon-EC2"; + # version = "0.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MALLEN/Net-Amazon-EC2-0.36.tar.gz"; + # hash = "sha256-Tig2kufwZsJBjtrpIz47YkAPk1X01SH5lRXlL3t9cvE="; + # }; + # propagatedBuildInputs = [ LWPProtocolHttps Moose ParamsValidate XMLSimple ]; + # buildInputs = [ TestException ]; + # meta = { + # description = "Perl interface to the Amazon Elastic Compute Cloud (EC2) environment"; + # homepage = "https://metacpan.org/dist/Net-Amazon-EC2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAmazonMechanicalTurk = buildPerlModule { + # pname = "Net-Amazon-MechanicalTurk"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MT/MTURK/Net-Amazon-MechanicalTurk-1.02.tar.gz"; + # hash = "sha256-jQlewUjglLJ/TMzHnhyvnDHzzA5t2CzoqORCyNx7D44="; + # }; + # patches = + # [ ./perl-modules/net-amazon-mechanicalturk.patch ]; + # propagatedBuildInputs = [ DigestHMAC LWPProtocolHttps XMLParser ]; + # doCheck = false; /* wants network */ + # meta = { + # description = "Amazon Mechanical Turk SDK for Perl"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # NetAmazonS3 = buildPerlPackage { + # pname = "Net-Amazon-S3"; + # version = "0.991"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BA/BARNEY/Net-Amazon-S3-0.991.tar.gz"; + # hash = "sha256-+3r4umSUjRo/MdgJ13EFImiA8GmYrH8Rn4JITmijI9M="; + # }; + # buildInputs = [ TestDeep TestException TestLWPUserAgent TestMockTime TestWarnings ]; + # propagatedBuildInputs = [ DataStreamBulk DateTimeFormatHTTP DigestHMAC DigestMD5File FileFindRule LWPUserAgentDetermined MIMETypes MooseXRoleParameterized MooseXStrictConstructor MooseXTypesDateTimeMoreCoercions RefUtil RegexpCommon SafeIsa SubOverride TermEncoding TermProgressBarSimple XMLLibXML ]; + # meta = { + # description = "Use the Amazon S3 - Simple Storage Service"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "s3cl"; + # }; + # }; + + # NetAmazonS3Policy = buildPerlModule { + # pname = "Net-Amazon-S3-Policy"; + # version = "0.1.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PO/POLETTIX/Net-Amazon-S3-Policy-0.1.6.tar.gz"; + # hash = "sha256-0rFukwhnSHQ0tHdHhooAP0scyECy15WfiPw2vQ2G2RQ="; + # }; + # propagatedBuildInputs = [ JSON ]; + # meta = { + # description = "Manage Amazon S3 policies for HTTP POST forms"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAsyncHTTP = buildPerlModule { + # pname = "Net-Async-HTTP"; + # version = "0.49"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Net-Async-HTTP-0.49.tar.gz"; + # hash = "sha256-OSBtBpSV0bhq7jeqitPJM0025ZzObPec04asDPN5jNs="; + # }; + # buildInputs = [ HTTPCookies Test2Suite TestMetricsAny ]; + # propagatedBuildInputs = [ Future HTTPMessage IOAsync MetricsAny StructDumb URI ]; + # preCheck = lib.optionalString stdenv.isDarwin '' + # # network tests fail on Darwin/sandbox, so disable these + # rm -f t/20local-connect.t t/22local-connect-pipeline.t t/23local-connect-redir.t + # rm -f t/90rt75615.t t/90rt75616.t t/90rt93232.t + # ''; + # meta = { + # description = "Use HTTP with IO::Async"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # NetAsyncHTTPServer = buildPerlModule { + # pname = "Net-Async-HTTP-Server"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Net-Async-HTTP-Server-0.14.tar.gz"; + # hash = "sha256-6nG3kcEtD6X3JubMA/Zuo20bRhNxj2xb84EzvRinsrY="; + # }; + # buildInputs = [ Test2Suite TestMetricsAny TestRefcount ]; + # propagatedBuildInputs = [ HTTPMessage IOAsync MetricsAny ]; + # meta = { + # description = "Serve HTTP with IO::Async"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.anoa ]; + # }; + # }; + + # NetAsyncPing = buildPerlPackage { + # pname = "Net-Async-Ping"; + # version = "0.004001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABRAXXA/Net-Async-Ping-0.004001.tar.gz"; + # hash = "sha256-kFfoUHYMcT2rB6DBycj4isEfbnTop0gcEObyc12K6Vs="; + # }; + # propagatedBuildInputs = [ IOAsync Moo NetFrameLayerIPv6 namespaceclean ]; + # buildInputs = [ TestFatal ]; + # preCheck = "rm t/icmp_ps.t t/icmpv6_ps.t"; # ping socket tests fail + # meta = { + # description = "Asyncronously check remote host for reachability"; + # homepage = "https://github.com/frioux/Net-Async-Ping"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetAsyncWebSocket = buildPerlModule { + # pname = "Net-Async-WebSocket"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Net-Async-WebSocket-0.13.tar.gz"; + # hash = "sha256-DayDQtPHii/syr1GZxRd1a3U+4zRjRVtKXoead/hFgA="; + # }; + # propagatedBuildInputs = [ IOAsync ProtocolWebSocket URI ]; + # preCheck = lib.optionalString stdenv.isDarwin '' + # # network tests fail on Darwin/sandbox, so disable these + # rm -f t/02server.t t/03cross.t + # ''; + # meta = { + # description = "Use WebSockets with IO::Async"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # NetAMQP = buildPerlModule { + # pname = "Net-AMQP"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHIPS/Net-AMQP-0.06.tar.gz"; + # hash = "sha256-Cyun3izX3dX+ECouKueuuiHqqxB4vzv9PFpyKTclY4A="; + # }; + # doCheck = false; # failures on 32bit + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ ClassAccessor ClassDataInheritable XMLLibXML ]; + # meta = { + # description = "Advanced Message Queue Protocol (de)serialization and representation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetCIDR = buildPerlPackage { + # pname = "Net-CIDR"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRSAM/Net-CIDR-0.21.tar.gz"; + # hash = "sha256-MPMDwHNZSNozNw3sx+h8+mi8QwqkS4HRj42CO20av78="; + # }; + # meta = { + # description = "Manipulate IPv4/IPv6 netblocks in CIDR notation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.bjornfor ]; + # }; + # }; + + # NetCIDRLite = buildPerlPackage { + # pname = "Net-CIDR-Lite"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STIGTSP/Net-CIDR-Lite-0.22.tar.gz"; + # hash = "sha256-QxfYyzQaYXueCIjaQ8Cc3//8sMnt97jJko10KlY7hRc="; + # }; + # meta = { + # description = "Perl extension for merging IPv4 or IPv6 CIDR addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # NetCoverArtArchive = buildPerlPackage { + # pname = "Net-CoverArtArchive"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CY/CYCLES/Net-CoverArtArchive-1.02.tar.gz"; + # hash = "sha256-VyXiCCZDVq1rP6++uXVqz8Kny5WDiMpcCHqsJzNF3dE="; + # }; + # buildInputs = [ FileFindRule ]; + # propagatedBuildInputs = [ JSONAny LWP Moose namespaceautoclean ]; + # meta = { + # description = "Query the coverartarchive.org"; + # homepage = "https://github.com/metabrainz/CoverArtArchive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetCUPS = buildPerlPackage { + # pname = "Net-CUPS"; + # version = "0.64"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NI/NINE/Net-CUPS-0.64.tar.gz"; + # hash = "sha256-17x3/w9iv4dMhDxZDrEqgLvUR0mi+3Tb7URcNdDoWoU="; + # }; + # buildInputs = [ pkgs.cups pkgs.cups-filters ]; + # NIX_CFLAGS_LINK = "-L${lib.getLib pkgs.cups}/lib -lcups"; + # meta = { + # description = "Common Unix Printing System Interface"; + # homepage = "https://github.com/niner/perl-Net-CUPS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetDBus = buildPerlPackage { + # pname = "Net-DBus"; + # version = "1.2.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANBERR/Net-DBus-1.2.0.tar.gz"; + # hash = "sha256-56GsnvShI1s/29WIj4bDRxgjBkZ715q8mwdWpktEHLw="; + # }; + # nativeBuildInputs = [ buildPackages.pkg-config ]; + # buildInputs = [ pkgs.dbus TestPod TestPodCoverage ]; + # propagatedBuildInputs = [ XMLTwig ]; + + # # https://gitlab.com/berrange/perl-net-dbus/-/merge_requests/19 + # patches = fetchpatch { + # url = "https://gitlab.com/berrange/perl-net-dbus/-/commit/6bac8f188fb06e5e5edd27aee672d66b7c28caa4.patch"; + # hash = "sha256-68kyUxM3E7w99rM2AZWZQMpGcaQxfSWaBs3DnmwnzqY="; + # }; + + # postPatch = '' + # substituteInPlace Makefile.PL --replace pkg-config $PKG_CONFIG + # ''; + + # meta = { + # description = "Extension for the DBus bindings"; + # homepage = "https://www.freedesktop.org/wiki/Software/dbus"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetDNS = buildPerlPackage { + # pname = "Net-DNS"; + # version = "1.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NL/NLNETLABS/Net-DNS-1.44.tar.gz"; + # hash = "sha256-E9ftxLjOoBMhR/qsNXH2s8cdHQz9hExTDFoET0o+wx4="; + # }; + # propagatedBuildInputs = [ DigestHMAC ]; + # makeMakerFlags = [ "--noonline-tests" ]; + # meta = { + # description = "Perl Interface to the Domain Name System"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # NetDNSResolverMock = buildPerlPackage { + # pname = "Net-DNS-Resolver-Mock"; + # version = "1.20230216"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MB/MBRADSHAW/Net-DNS-Resolver-Mock-1.20230216.tar.gz"; + # hash = "sha256-7UkwV3/Rop1kNbWHVTPTso9cElijWDP+bKLLaiaFpJs="; + # }; + # propagatedBuildInputs = [ NetDNS ]; + # buildInputs = [ TestException ]; + # meta = { + # description = "Mock a DNS Resolver object for testing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetDomainTLD = buildPerlPackage { + # pname = "Net-Domain-TLD"; + # version = "1.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXP/Net-Domain-TLD-1.75.tar.gz"; + # hash = "sha256-TDf4ERhNaKxBedSMEOoxki3V/KLBv/zc2VxaKjtAAu4="; + # }; + # meta = { + # description = "Work with TLD names"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetFastCGI = buildPerlPackage { + # pname = "Net-FastCGI"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/Net-FastCGI-0.14.tar.gz"; + # hash = "sha256-EZOQCk/V6eupzNBuE4+RCSG3Ugf/i1JLZDqIyD61WWo="; + # }; + # buildInputs = [ TestException TestHexString ]; + # meta = { + # description = "FastCGI Toolkit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetFrame = buildPerlModule { + # pname = "Net-Frame"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GO/GOMOR/Net-Frame-1.21.tar.gz"; + # hash = "sha256-vLNXootjnwyvfWLTPS5g/wv8z4lNAHzmAfY1UTiD1zk="; + # }; + # propagatedBuildInputs = [ BitVector ClassGomor NetIPv6Addr ]; + # preCheck = "rm t/13-gethostsubs.t"; # it performs DNS queries + # meta = { + # description = "The base framework for frame crafting"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # NetFrameLayerIPv6 = buildPerlModule { + # pname = "Net-Frame-Layer-IPv6"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GO/GOMOR/Net-Frame-Layer-IPv6-1.08.tar.gz"; + # hash = "sha256-ui2FK+jzf1iE4wfagriqPNeU4YoVyAdSGsLKKtE599c="; + # }; + # propagatedBuildInputs = [ NetFrame ]; + # meta = { + # description = "Internet Protocol v6 layer object"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # NetFreeDB = buildPerlPackage { + # pname = "Net-FreeDB"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DS/DSHULTZ/Net-FreeDB-0.10.tar.gz"; + # hash = "sha256-90PhIjjrFslIBK+0sxCwJUj3C8rxeRZOrlZ/i0mIroU="; + # }; + # buildInputs = [ TestDeep TestDifferences TestException TestMost TestWarn ]; + # propagatedBuildInputs = [ CDDBFile Moo ]; + # meta = { + # description = "OOP Interface to FreeDB Server(s)"; + # license = with lib.licenses; [ artistic1 ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.NetFreeDB.x86_64-darwin + # }; + # }; + + NetHTTP = buildPerlPackage { + pname = "Net-HTTP"; + version = "6.23"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/Net-HTTP-6.23.tar.gz"; + hash = "sha256-DWXAndbIWJsq4RGBdNPBphcDtuz8FKNEKox0r2XgyU4="; + }; + propagatedBuildInputs = [ URI ]; + __darwinAllowLocalNetworking = true; + doCheck = false; /* wants network */ + meta = { + description = "Low-level HTTP connection (client)"; + homepage = "https://github.com/libwww-perl/Net-HTTP"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # NetHTTPSNB = buildPerlPackage { + # pname = "Net-HTTPS-NB"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OL/OLEG/Net-HTTPS-NB-0.15.tar.gz"; + # hash = "sha256-amnPT6Vfuju70iYu4UKC7YMQc22PWslNGmxZfNEnjE8="; + # }; + # propagatedBuildInputs = [ IOSocketSSL NetHTTP ]; + # meta = { + # description = "Non-blocking HTTPS client"; + # homepage = "https://github.com/olegwtf/p5-Net-HTTPS-NB"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetIDNEncode = buildPerlModule { + # pname = "Net-IDN-Encode"; + # version = "2.500"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFAERBER/Net-IDN-Encode-2.500.tar.gz"; + # hash = "sha256-VUU2M+P/JM4yWzS8LIFXuYWZYqMatc8ov3zMHJs6Pqo="; + # }; + # buildInputs = [ TestNoWarnings ]; + # perlPreHook = "export LD=$CC"; + # meta = { + # description = "Internationalizing Domain Names in Applications (UTS #46)"; + # homepage = "https://metacpan.org/release/Net-IDN-Encode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetIMAPClient = buildPerlPackage { + # pname = "Net-IMAP-Client"; + # version = "0.9507"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GANGLION/Net-IMAP-Client-0.9507.tar.gz"; + # hash = "sha256-QE5vW7xQjPFnxAUqXhRwXv7sb7eTvPm1xCniX0cYNUk="; + # }; + # propagatedBuildInputs = [ IOSocketSSL ListMoreUtils ]; + # meta = { + # description = "Not so simple IMAP client library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetIP = buildPerlPackage { + # pname = "Net-IP"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANU/Net-IP-1.26.tar.gz"; + # hash = "sha256-BA8W8wZmR9dhtySjtwdU0oy9Hm/l6gHGPtHNhXEX1jk="; + # }; + # meta = { + # description = "Perl extension for manipulating IPv4/IPv6 addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetIPLite = buildPerlPackage { + # pname = "Net-IP-Lite"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXKOM/Net-IP-Lite-0.03.tar.gz"; + # hash = "sha256-yZFubPqlO+J1N5zksqVQrhdt36tQ2tQ7Q+1D6CZ4Aqk="; + # }; + # buildInputs = [ TestException ]; + # meta = { + # description = "Perl extension for manipulating IPv4/IPv6 addresses"; + # homepage = "https://metacpan.org/pod/Net::IP::Lite"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # NetIPv4Addr = buildPerlPackage { + # pname = "Net-IPv4Addr"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FRAJULAC/Net-IPv4Addr-0.10.tar.gz"; + # hash = "sha256-OEXeTzCxfIQrGSys6Iedu2IU3paSz6cPCq8JgUIqY/4="; + # }; + # meta = { + # description = "Perl extension for manipulating IPv4 addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "ipv4calc"; + # }; + # }; + + # NetIPv6Addr = buildPerlPackage { + # pname = "Net-IPv6Addr"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BK/BKB/Net-IPv6Addr-1.02.tar.gz"; + # hash = "sha256-sjQBwSJv7o3+Yn9a4OkMVaxUcBDso5gRDcFjH0HJ7H0="; + # }; + # propagatedBuildInputs = [ MathBase85 NetIPv4Addr ]; + # meta = { + # description = "Check and manipulate IPv6 addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetIPXS = buildPerlPackage { + # pname = "Net-IP-XS"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOMHRR/Net-IP-XS-0.22.tar.gz"; + # hash = "sha256-JZe0aDizgur3S6XJnD9gpqC1poHsNqFBchJL9E9LGSA="; + # }; + # propagatedBuildInputs = [ IOCapture TieSimple ]; + # meta = { + # homepage = "https://github.com/tomhrr/p5-Net-IP-XS"; + # description = "IPv4/IPv6 address library"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # NetLDAPServer = buildPerlPackage { + # pname = "Net-LDAP-Server"; + # version = "0.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AA/AAR/Net-LDAP-Server-0.43.tar.gz"; + # hash = "sha256-3WxMtNMLwyEUsHh/qioeK0/t0bkcLvN5Zey6ETMbsGI="; + # }; + # propagatedBuildInputs = [ perlldap ConvertASN1 ]; + # meta = { + # description = "LDAP server side protocol handling"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetLDAPSID = buildPerlPackage { + # pname = "Net-LDAP-SID"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KARMAN/Net-LDAP-SID-0.001.tar.gz"; + # hash = "sha256-qMLNQGeQl/w7hCV24bU+w1/UNIGoalA4PutOJOu81tY="; + # }; + # meta = { + # description = "Active Directory Security Identifier manipulation"; + # homepage = "https://github.com/karpet/net-ldap-sid"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetLDAPServerTest = buildPerlPackage { + # pname = "Net-LDAP-Server-Test"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KARMAN/Net-LDAP-Server-Test-0.22.tar.gz"; + # hash = "sha256-sSBxe18fb2sTsxQ3/dIY7g/GnrASGN4U2SL5Kc+NLY4="; + # }; + # propagatedBuildInputs = [ perlldap NetLDAPServer DataDump NetLDAPSID ]; + # meta = { + # description = "Test Net::LDAP code"; + # homepage = "https://github.com/karpet/net-ldap-server-test"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetLibIDN2 = buildPerlModule { + # pname = "Net-LibIDN2"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TH/THOR/Net-LibIDN2-1.02.tar.gz"; + # hash = "sha256-0fMK/GrPplQbAMCafkx059jkuknjJ3wLvEGuNcE5DQc="; + # }; + # propagatedBuildInputs = [ pkgs.libidn2 ]; + # meta = { + # description = "Perl bindings for GNU Libidn2"; + # homepage = "https://github.com/gnuthor/Net--LibIDN2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetNetmask = buildPerlPackage { + # pname = "Net-Netmask"; + # version = "2.0002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMASLAK/Net-Netmask-2.0002.tar.gz"; + # hash = "sha256-JKmy58a8wTAteXROukwCG/PeR/FJqvrM2U+bBC/dv5Q="; + # }; + # buildInputs = [ Test2Suite TestUseAllModules ]; + # meta = { + # description = "Understand and manipulate IP netmasks"; + # homepage = "https://search.cpan.org/~jmaslak/Net-Netmask"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetMPD = buildPerlModule { + # pname = "Net-MPD"; + # version = "0.07"; + # buildInputs = [ ModuleBuildTiny ]; + # src = fetchurl { + # url = "https://cpan.metacpan.org/authors/id/A/AB/ABERNDT/Net-MPD-0.07.tar.gz"; + # hash = "sha256-M4L7nG9cJd4mKPVhRCn6igB5FSFnjELaBoyZ57KU6VM="; + # }; + # meta = { + # description = "Communicate with an MPD server"; + # homepage = "https://metacpan.org/pod/Net::MPD"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # NetMQTTSimple = buildPerlPackage { + # pname = "Net-MQTT-Simple"; + # version = "1.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JU/JUERD/Net-MQTT-Simple-1.28.tar.gz"; + # hash = "sha256-Sp6hB+a8IuJrUzZ4oKPMbEI7N4TsP8ROjjM5t8Vr7gM="; + # }; + # meta = { + # description = "Minimal MQTT version 3 interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetNVD = buildPerlPackage { + # pname = "Net-NVD"; + # version = "0.0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GARU/Net-NVD-0.0.3.tar.gz"; + # hash = "sha256-uKZXEg+UsO7R2OvbA4i8M2DSj6Xw+CNrnNjNrovv5Bg="; + # }; + # propagatedBuildInputs = [ IOSocketSSL JSON ]; + # meta = { + # description = "Query CVE data from NIST's NVD (National Vulnerability Database)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetOAuth = buildPerlModule { + # pname = "Net-OAuth"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KG/KGRENNAN/Net-OAuth-0.28.tar.gz"; + # hash = "sha256-e/wxnaCsV44Ali81o1DPUREKOjEwFtH9wwciAooikEw="; + # }; + # buildInputs = [ TestWarn ]; + # propagatedBuildInputs = [ ClassAccessor ClassDataInheritable DigestHMAC DigestSHA1 LWP ]; + # meta = { + # description = "An implementation of the OAuth protocol"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetPatricia = buildPerlPackage { + # pname = "Net-Patricia"; + # version = "1.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRUBER/Net-Patricia-1.22.tar.gz"; + # hash = "sha256-cINakm4cWo0DJMcv/+6C7rfsbBQd7gT9RGggtk9xxVI="; + # }; + # propagatedBuildInputs = [ NetCIDRLite Socket6 ]; + # meta = { + # description = "Patricia Trie perl module for fast IP address lookups"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # NetPing = buildPerlPackage { + # pname = "Net-Ping"; + # version = "2.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Net-Ping-2.75.tar.gz"; + # hash = "sha256-tH3zz9lpLM0Aca05/nRxjrwy9ZcBVWpgT9FaCfCeDXQ="; + # }; + # meta = { + # description = "Check a remote host for reachability"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetDNSResolverProgrammable = buildPerlPackage { + # pname = "Net-DNS-Resolver-Programmable"; + # version = "0.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BIGPRESH/Net-DNS-Resolver-Programmable-0.009.tar.gz"; + # hash = "sha256-gICiq3dmKVhZEa8Reb23xNwr6/1LXv13sR0drGJFS/g="; + # }; + # propagatedBuildInputs = [ NetDNS ]; + # meta = { + # description = "Programmable DNS resolver class for offline emulation of DNS"; + # homepage = "https://github.com/bigpresh/Net-DNS-Resolver-Programmable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetPrometheus = buildPerlModule { + # pname = "Net-Prometheus"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Net-Prometheus-0.12.tar.gz"; + # hash = "sha256-rs73NJygSW/yNahKkQ+KBDZtB/WqQfrieixKxbip6SM="; + # }; + # propagatedBuildInputs = [ RefUtil StructDumb URI ]; + # buildInputs = [ HTTPMessage TestFatal ]; + # meta = { + # description = "Export monitoring metrics for prometheus"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetSCP = buildPerlPackage { + # pname = "Net-SCP"; + # version = "0.08.reprise"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IV/IVAN/Net-SCP-0.08.reprise.tar.gz"; + # hash = "sha256-iKmy32nnaeWFWkCLGfYZFbguj+Bwq1z01SXdO4u+McE="; + # }; + # propagatedBuildInputs = [ pkgs.openssl ]; + # patchPhase = '' + # sed -i 's|$scp = "scp";|$scp = "${pkgs.openssh}/bin/scp";|' SCP.pm + # ''; + # buildInputs = [ NetSSH StringShellQuote ]; + # meta = { + # description = "Simple wrappers around ssh and scp commands"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetServer = buildPerlPackage { + # pname = "Net-Server"; + # version = "2.014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RH/RHANDOM/Net-Server-2.014.tar.gz"; + # hash = "sha256-NAa5ylpmKgB17tR/t43hMWtgHJT2Kg7jSlVE25uqNyA="; + # }; + # doCheck = false; # seems to hang waiting for connections + # meta = { + # description = "Extensible Perl internet server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "net-server"; + # }; + # }; + + # NetSFTPForeign = buildPerlPackage { + # pname = "Net-SFTP-Foreign"; + # version = "1.93"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Net-SFTP-Foreign-1.93.tar.gz"; + # hash = "sha256-bH1kJQh2hz2kNIAOUGCovvekZFHYH4F+N+Q8/aUaD3o="; + # }; + # propagatedBuildInputs = [ pkgs.openssl ]; + # patchPhase = '' + # sed -i "s|$ssh_cmd = 'ssh'|$ssh_cmd = '${pkgs.openssh}/bin/ssh'|" lib/Net/SFTP/Foreign/Backend/Unix.pm + # ''; + # meta = { + # description = "Secure File Transfer Protocol client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetServerCoro = buildPerlPackage { + # pname = "Net-Server-Coro"; + # version = "1.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXMV/Net-Server-Coro-1.3.tar.gz"; + # hash = "sha256-HhpwKw3TkMPmKfip6EzKY7eU0eInlX9Cm2dgEHV3+4Y="; + # }; + # propagatedBuildInputs = [ Coro NetServer ]; + # meta = { + # description = "A co-operative multithreaded server using Coro"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # NetServerSSPrefork = buildPerlPackage { + # pname = "Net-Server-SS-PreFork"; + # version = "0.06pre"; + # src = fetchFromGitHub { + # owner = "kazuho"; + # repo = "p5-Net-Server-SS-PreFork"; + # rev = "5fccc0c270e25c65ef634304630af74b48807d21"; + # hash = "sha256-pveVyFdEe/TQCEI83RrQTWr7aoYrgOGaNqc1wJeiAnw="; + # }; + # nativeCheckInputs = [ HTTPMessage LWP TestSharedFork HTTPServerSimple TestTCP TestUNIXSock ]; + # buildInputs = [ ModuleInstall ]; + # propagatedBuildInputs = [ NetServer ServerStarter ]; + # meta = { + # description = "A hot-deployable variant of Net::Server::PreFork"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + NetSMTPSSL = buildPerlPackage { + pname = "Net-SMTP-SSL"; + version = "1.04"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RJ/RJBS/Net-SMTP-SSL-1.04.tar.gz"; + hash = "sha256-eynEWt0Z09UIS3Ufe6iajkBHmkRs4hz9nMdB5VgzKgA="; + }; + propagatedBuildInputs = [ IOSocketSSL ]; + meta = { + description = "SSL support for Net::SMTP"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # NetSMTPTLS = buildPerlPackage { + # pname = "Net-SMTP-TLS"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AW/AWESTHOLM/Net-SMTP-TLS-0.12.tar.gz"; + # hash = "sha256-7+dyZnrDdwK5a221KXzIJ0J6Ozo4GbekMVsIudRE5KU="; + # }; + # propagatedBuildInputs = [ DigestHMAC IOSocketSSL ]; + # meta = { + # description = "An SMTP client supporting TLS and AUTH"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetSMTPTLSButMaintained = buildPerlPackage { + # pname = "Net-SMTP-TLS-ButMaintained"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FA/FAYLAND/Net-SMTP-TLS-ButMaintained-0.24.tar.gz"; + # hash = "sha256-a5XAj3FXnYUcAYP1AqcAyGof7O9XDjzugybF5M5mJW4="; + # }; + # propagatedBuildInputs = [ DigestHMAC IOSocketSSL ]; + # meta = { + # description = "An SMTP client supporting TLS and AUTH (DEPRECATED, use Net::SMTPS instead)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetSNMP = buildPerlModule { + # pname = "Net-SNMP"; + # version = "6.0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz"; + # hash = "sha256-FMN7wcuz883H1sE+DyeoWfFM3P1epUoEZ6iLwlmwt0E="; + # }; + # doCheck = false; # The test suite fails, see https://rt.cpan.org/Public/Bug/Display.html?id=85799 + # meta = { + # description = "Object oriented interface to SNMP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "snmpkey"; + # }; + # }; + + # NetSNPP = buildPerlPackage { + # pname = "Net-SNPP"; + # version = "1.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBEYA/Net-SNPP-1.17.tar.gz"; + # hash = "sha256-BrhR1kWWYl6GY1n7AX3Q0Ilz4OvFDDI/Sh1Q7N2GjnY="; + # }; + + # doCheck = false; + # meta = { + # description = "Simple Network Pager Protocol Client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetSSH = buildPerlPackage { + # pname = "Net-SSH"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IV/IVAN/Net-SSH-0.09.tar.gz"; + # hash = "sha256-fHHHw8vpUyNN/iW8wa1+2w4fWgV4YB9VI7xgcCYqOBc="; + # }; + # propagatedBuildInputs = [ pkgs.openssl ]; + # patchPhase = '' + # sed -i 's|$ssh = "ssh";|$ssh = "${pkgs.openssh}/bin/ssh";|' SSH.pm + # ''; + # meta = { + # description = "Simple wrappers around ssh commands"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetSSHPerl = buildPerlPackage { + # pname = "Net-SSH-Perl"; + # version = "2.142"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Net-SSH-Perl-2.142.tar.gz"; + # hash = "sha256-UAHbPllS/BjYXDF5Uhr2kT0VQ+tP30/ZfcYDpHSMLJY="; + # }; + # propagatedBuildInputs = [ CryptCurve25519 CryptIDEA CryptX FileHomeDir MathGMP StringCRC32 ]; + # preCheck = "export HOME=$TMPDIR"; + # meta = { + # description = "Perl client interface to SSH"; + # homepage = "https://search.cpan.org/dist/Net-SSH-Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + NetSSLeay = buildPerlPackage { + pname = "Net-SSLeay"; + version = "1.92"; + src = fetchurl { + url = "mirror://cpan/authors/id/C/CH/CHRISN/Net-SSLeay-1.92.tar.gz"; + hash = "sha256-R8LyswDy5xYtcdaZ9jPdajWwYloAy9qMUKwBFEqTlqk="; + }; + buildInputs = [ pkgs.openssl pkgs.zlib ]; + doCheck = false; # Test performs network access. + preConfigure = '' + mkdir openssl + ln -s ${lib.getLib pkgs.openssl}/lib openssl + ln -s ${pkgs.openssl.bin}/bin openssl + ln -s ${pkgs.openssl.dev}/include openssl + export OPENSSL_PREFIX=$(realpath openssl) + ''; + meta = { + description = "Perl bindings for OpenSSL and LibreSSL"; + license = with lib.licenses; [ artistic2 ]; + }; + }; + + # NetStatsd = buildPerlPackage { + # pname = "Net-Statsd"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/COSIMO/Net-Statsd-0.12.tar.gz"; + # hash = "sha256-Y+RTYD2hZbxtHEygtV7aPSIE8EDFkwSkd4LFqniGVlw="; + # }; + # meta = { + # description = "Perl client for Etsy's statsd daemon"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "benchmark.pl"; + # }; + # }; + + # NetTelnet = buildPerlPackage { + # pname = "Net-Telnet"; + # version = "3.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JR/JROGERS/Net-Telnet-3.05.tar.gz"; + # hash = "sha256-Z39ouizSqCT64yP6guGDv349A8PEmckdkjvWKDeWp0M="; + # }; + # meta = { + # description = "Interact with TELNET port or other TCP ports"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetTwitterLite = buildPerlModule { + # pname = "Net-Twitter-Lite"; + # version = "0.12008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MM/MMIMS/Net-Twitter-Lite-0.12008.tar.gz"; + # hash = "sha256-suq+Hyo/LGTezWDye8O0buZSVgsCTExWgRVhbI1KRo4="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ JSON LWPProtocolHttps ]; + # doCheck = false; + # meta = { + # description = "A perl API library for the Twitter API"; + # homepage = "https://github.com/semifor/net-twitter-lite"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetWhoisIP = buildPerlPackage { + # pname = "Net-Whois-IP"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BS/BSCHMITZ/Net-Whois-IP-1.19.tar.gz"; + # hash = "sha256-8JvfoPHSZltTSCa186hmI0mTDu0pmO/k2Nv5iBMUciI="; + # }; + # doCheck = false; + + # # https://rt.cpan.org/Public/Bug/Display.html?id=99377 + # postPatch = '' + # substituteInPlace IP.pm --replace " AutoLoader" "" + # ''; + # buildInputs = [ RegexpIPv6 ]; + # meta = { + # description = "Perl extension for looking up the whois information for ip addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetWorks = buildPerlPackage { + # pname = "Net-Works"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAXMIND/Net-Works-0.22.tar.gz"; + # hash = "sha256-CsmyPfvKGE4ocpskU5S8ZpOq22/EUcqplbS3GewO6f8="; + # }; + # propagatedBuildInputs = [ ListAllUtils MathInt128 Moo namespaceautoclean ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Sane APIs for IP addresses and networks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberBytesHuman = buildPerlPackage { + # pname = "Number-Bytes-Human"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FERREIRA/Number-Bytes-Human-0.11.tar.gz"; + # hash = "sha256-X8ecSbC0DfeAR5xDaWOBND4ratH+UoWfYLxltm6+byw="; + # }; + # meta = { + # description = "Convert byte count to human readable format"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberCompare = buildPerlPackage { + # pname = "Number-Compare"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Number-Compare-0.03.tar.gz"; + # hash = "sha256-gyk3N+gDtDESgwRD+1II7FIIoubqUS7VTvjk3SuICCc="; + # }; + # meta = { + # description = "Numeric comparisons"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberFormat = buildPerlPackage { + # pname = "Number-Format"; + # version = "1.76"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Number-Format-1.76.tar.gz"; + # hash = "sha256-DgBg6zY2NaiFcGxqJvX8qv6udZ97Ksrkndpw4ZXdRNY="; + # }; + # meta = { + # description = "Perl extension for formatting numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberFraction = buildPerlModule { + # pname = "Number-Fraction"; + # version = "3.0.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVECROSS/Number-Fraction-v3.0.4.tar.gz"; + # hash = "sha256-xkGcird4/XKbENfmp487ewf8CJV8H3nlZm3Ny01iwIU="; + # }; + # propagatedBuildInputs = [ Moo MooXTypesMooseLike ]; + # meta = { + # description = "Perl extension to model fractions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberMisc = buildPerlModule { + # pname = "Number-Misc"; + # version = "1.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKO/Number-Misc-1.2.tar.gz"; + # hash = "sha256-d7m2jGAKBpzxb02BJuyzIVHmvNNLDtsXt4re5onckdg="; + # }; + # meta = { + # description = "Number::Misc - handy utilities for numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NumberPhone = buildPerlPackage { + # pname = "Number-Phone"; + # version = "4.0000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/Number-Phone-4.0000.tar.gz"; + # hash = "sha256-H0mX/oMJSrDNgUDwvn/cHz+JGQKareajOYH4fLBIZjQ="; + # }; + # buildInputs = [ DevelHide FileShareDirInstall ParallelForkManager TestDifferences TestWarnings ]; + # propagatedBuildInputs = [ DataDumperConcise DataCompactReadonly DevelCheckOS DevelDeprecationsEnvironmental FileFindRule FileShareDir ]; + # preCheck = '' + # # Remove slow memory hungry tests + # rm t/fork.t + # rm t/uk_slurp.t + # ''; + # meta = { + # description = "Large suite of perl modules for parsing and dealing with phone numbers"; + # homepage = "https://github.com/DrHyde/perl-modules-Number-Phone"; + # license = with lib.licenses; [ artistic1 gpl2Only asl20 ]; + # }; + # }; + + # NumberWithError = buildPerlPackage { + # pname = "Number-WithError"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Number-WithError-1.01.tar.gz"; + # hash = "sha256-3/agcn54ROpng3vfrdVSuG9rIW0Y7o7kaEKyLM7w9VQ="; + # }; + # propagatedBuildInputs = [ ParamsUtil prefork ]; + # buildInputs = [ TestLectroTest ]; + # meta = { + # description = "Numbers with error propagation and scientific rounding"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NTLM = buildPerlPackage { + # pname = "NTLM"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NB/NBEBOUT/NTLM-1.09.tar.gz"; + # hash = "sha256-yCPjDNp2vBVjblhDAslg4rXu75UXwkSPdFRJiJMVH4U="; + # }; + # propagatedBuildInputs = [ DigestHMAC ]; + # meta = { + # description = "An NTLM authentication module"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.pSub ]; + # }; + # }; + + # ObjectAccessor = buildPerlPackage { + # pname = "Object-Accessor"; + # version = "0.48"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Object-Accessor-0.48.tar.gz"; + # hash = "sha256-dsuCSie2tOVgQJ/Pb9Wzv7vTi3Lx89N+0LVL2cC66t4="; + # }; + # meta = { + # description = "Per object accessors"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ObjectEvent = buildPerlPackage rec { + # pname = "Object-Event"; + # version = "1.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EL/ELMEX/${pname}-${version}.tar.gz"; + # hash = "sha256-q2u4BQj0/dry1RsgyodqqwOFgqhrUijmQ1QRNIr1PII="; + # }; + # propagatedBuildInputs = [ AnyEvent commonsense ]; + # meta = { + # description = "A class that provides an event callback interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ObjectInsideOut = buildPerlModule { + # pname = "Object-InsideOut"; + # version = "4.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JD/JDHEDDEN/Object-InsideOut-4.05.tar.gz"; + # hash = "sha256-nf1sooInJDR+DrZ1nQBwlCWBRwOtXGa9tiFFeYaLysQ="; + # }; + # propagatedBuildInputs = [ ExceptionClass ]; + # meta = { + # description = "Comprehensive inside-out object support module"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ObjectPad = buildPerlModule { + # pname = "Object-Pad"; + # version = "0.804"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Object-Pad-0.804.tar.gz"; + # hash = "sha256-z4jSquGKKHHX1/MPi6bU7lv5U+IP3KileME8dB0W0a0="; + # }; + # buildInputs = [ Test2Suite TestFatal TestRefcount ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # propagatedBuildInputs = [ XSParseKeyword XSParseSublike ]; + # meta = { + # description = "A simple syntax for lexical field-based objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # ObjectSignature = buildPerlPackage { + # pname = "Object-Signature"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Object-Signature-1.08.tar.gz"; + # hash = "sha256-hCFTyU2pPiucs7VN7lcrUGS79JmjanPDiiN5mgIDaYo="; + # }; + # meta = { + # description = "Generate cryptographic signatures for objects"; + # homepage = "https://github.com/karenetheridge/Object-Signature"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # OggVorbisHeaderPurePerl = buildPerlPackage { + # pname = "Ogg-Vorbis-Header-PurePerl"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVECROSS/Ogg-Vorbis-Header-PurePerl-1.05.tar.gz"; + # hash = "sha256-Uh04CPQtcSKmsGwzpurm18OZR6q1fEyMyvzE9gP9pT4="; + # }; + + # # The testing mechanism is erorrneous upstream. See http://matrix.cpantesters.org/?dist=Ogg-Vorbis-Header-PurePerl+1.0 + # doCheck = false; + # meta = { + # description = "Access Ogg Vorbis info and comment fields"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # OLEStorage_Lite = buildPerlPackage { + # pname = "OLE-Storage_Lite"; + # version = "0.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMCNAMARA/OLE-Storage_Lite-0.22.tar.gz"; + # hash = "sha256-0FZtbCnTl+pzY3ncUVw2hJ9rlxB89wC6glBQXJhM+WU="; + # }; + # meta = { + # description = "Read and write OLE storage files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Opcodes = buildPerlPackage { + # pname = "Opcodes"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Opcodes-0.14.tar.gz"; + # hash = "sha256-f3NlRH5NHFuHtDCRRI8EiOZ8nwNrJsAipUCc1z00OJM="; + # }; + # meta = { + # description = "More Opcodes information from opnames.h and opcode.h"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # OpenAPIClient = buildPerlPackage { + # pname = "OpenAPI-Client"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHTHORSEN/OpenAPI-Client-1.07.tar.gz"; + # hash = "sha256-Ue1kHSg7j0u7wG0BwVZzm9K5qItO+Et7hPlQ+g7hTbM="; + # }; + # propagatedBuildInputs = [ MojoliciousPluginOpenAPI ]; + # meta = { + # description = "A client for talking to an Open API powered server"; + # homepage = "https://github.com/jhthorsen/openapi-client"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # OpenGL = buildPerlPackage rec { + # pname = "OpenGL"; + # version = "0.70"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHM/OpenGL-0.70.tar.gz"; + # hash = "sha256-sg4q9EBLSQGrNbumrV46iqYL/3JBPJkojwEBjEz4dOA="; + # }; + + # # FIXME: try with libGL + libGLU instead of libGLU libGL + # buildInputs = [ pkgs.libGLU pkgs.libGL pkgs.libGLU pkgs.freeglut pkgs.xorg.libX11 pkgs.xorg.libXi pkgs.xorg.libXmu pkgs.xorg.libXext pkgs.xdummy ]; + + # patches = [ ./perl-modules/perl-opengl.patch ]; + + # configurePhase = '' + # substituteInPlace Makefile.PL \ + # --replace "@@libpaths@@" '${lib.concatStringsSep "\n" (map (f: "-L${f}/lib") buildInputs)}' + + # cp -v ${./perl-modules/perl-opengl-gl-extensions.txt} utils/glversion.txt + + # perl Makefile.PL PREFIX=$out INSTALLDIRS=site $makeMakerFlags + # ''; + + # doCheck = false; + # meta = { + # description = "Perl OpenGL bindings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; # taken from EPEL + # }; + # }; + + # OpenOfficeOODoc = buildPerlPackage { + # pname = "OpenOffice-OODoc"; + # version = "2.125"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMGDOC/OpenOffice-OODoc-2.125.tar.gz"; + # hash = "sha256-wRRIlwaTxCqLnpPaSMrJE1Fs4zqdRKZGhAD3rYeR2rY="; + # }; + # propagatedBuildInputs = [ ArchiveZip XMLTwig ]; + # meta = { + # description = "The Perl Open OpenDocument Connector"; + # license = with lib.licenses; [ lgpl21Only ]; + # maintainers = [ maintainers.wentasah ]; + # }; + # }; + + # NetOpenIDCommon = buildPerlPackage { + # pname = "Net-OpenID-Common"; + # version = "1.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WR/WROG/Net-OpenID-Common-1.20.tar.gz"; + # hash = "sha256-q06X10pHcQ4NtKwMgi9/32Iq+GpgpSunIlWoicKdq8k="; + # }; + # propagatedBuildInputs = [ CryptDHGMP XMLSimple ]; + # meta = { + # description = "Libraries shared between Net::OpenID::Consumer and Net::OpenID::Server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetOpenIDConsumer = buildPerlPackage { + # pname = "Net-OpenID-Consumer"; + # version = "1.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WR/WROG/Net-OpenID-Consumer-1.18.tar.gz"; + # hash = "sha256-Dhw4b+fBhDBx3Zlr3KymEJEGZK5LXRJ8lf6u/Zk2Tzg="; + # }; + # propagatedBuildInputs = [ JSON NetOpenIDCommon ]; + # buildInputs = [ CGI ]; + # meta = { + # description = "Library for consumers of OpenID identities"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetOpenSSH = buildPerlPackage { + # pname = "Net-OpenSSH"; + # version = "0.84"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Net-OpenSSH-0.84.tar.gz"; + # hash = "sha256-h4DmLwGxzw20PJy3BclP9JSbAyIzvkvpH8kavHkVOfg="; + # }; + # meta = { + # description = "Perl SSH client package implemented on top of OpenSSH"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # NetZooKeeper = buildPerlPackage { + # pname = "Net-ZooKeeper"; + # version = "0.42pre"; + # src = fetchFromGitHub { + # owner = "mark-5"; + # repo = "p5-net-zookeeper"; + # rev = "66e1a360aff9c39af728c36092b540a4b6045f70"; + # hash = "sha256-NyY97EWtqWFtKJnwX2HDkKcyviKq57yRtWC7lzajiHY="; + # }; + # buildInputs = [ pkgs.zookeeper_mt ]; + # # fix "error: format not a string literal and no format arguments [-Werror=format-security]" + # hardeningDisable = [ "format" ]; + # # Make the async API accessible + # env.NIX_CFLAGS_COMPILE = "-DTHREADED"; + # NIX_CFLAGS_LINK = "-L${pkgs.zookeeper_mt.out}/lib -lzookeeper_mt"; + # # Most tests are skipped as no server is available in the sandbox. + # # `t/35_log.t` seems to suffer from a race condition; remove it. See + # # https://github.com/NixOS/nixpkgs/pull/104889#issuecomment-737144513 + # preCheck = '' + # rm t/35_log.t + # '' + lib.optionalString stdenv.isDarwin '' + # rm t/30_connect.t + # rm t/45_class.t + # ''; + # meta = { + # description = "Perl extension for Apache ZooKeeper"; + # homepage = "https://github.com/mark-5/p5-net-zookeeper"; + # license = with lib.licenses; [ asl20 ]; + # maintainers = teams.deshaw.members ++ [ maintainers.ztzg ]; + # }; + # }; + + # PackageConstants = buildPerlPackage { + # pname = "Package-Constants"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Package-Constants-0.06.tar.gz"; + # hash = "sha256-C1i+eHBszE5L2butQXZ0cEJ/17LPrXSUid4QH4W8XfU="; + # }; + # meta = { + # description = "List constants defined in a package"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PackageDeprecationManager = buildPerlPackage { + # pname = "Package-DeprecationManager"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Package-DeprecationManager-0.18.tar.gz"; + # hash = "sha256-to0/DO1Vt2Ff3btgKbifkqNP4N2Mb9a87/wVfVaDT+g="; + # }; + # buildInputs = [ TestFatal TestWarnings ]; + # propagatedBuildInputs = [ PackageStash ParamsUtil SubInstall SubName ]; + # meta = { + # description = "Manage deprecation warnings for your distribution"; + # homepage = "https://metacpan.org/release/Package-DeprecationManager"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # PatchReader = buildPerlPackage { + # pname = "PatchReader"; + # version = "0.9.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TM/TMANNERM/PatchReader-0.9.6.tar.gz"; + # hash = "sha256-uN43RgNHu1R03AGRbMsx3S/gzZIkLEoy1zDo6wh8Mjw="; + # }; + # meta = { + # description = "Utilities to read and manipulate patches and CVS"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # PackageStash = buildPerlPackage { + # pname = "Package-Stash"; + # version = "0.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Package-Stash-0.40.tar.gz"; + # hash = "sha256-WpcixtnLKe4TPl97CKU2J2KgtWM/9RcGQqWwaG6V4GY="; + # }; + # buildInputs = [ CPANMetaCheck TestFatal TestNeeds TestRequires ]; + # propagatedBuildInputs = [ DistCheckConflicts ModuleImplementation ]; + # meta = { + # description = "Routines for manipulating stashes"; + # homepage = "https://github.com/moose/Package-Stash"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "package-stash-conflicts"; + # }; + # }; + + # PackageStashXS = buildPerlPackage { + # pname = "Package-Stash-XS"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Package-Stash-XS-0.30.tar.gz"; + # hash = "sha256-JrrWXBlZxXN5s+E53HdvvsX3ApBmF+8nzcKT3fEjkjE="; + # }; + # buildInputs = [ TestFatal TestNeeds ]; + # meta = { + # description = "Faster and more correct implementation of the Package::Stash API"; + # homepage = "https://github.com/moose/Package-Stash-XS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Pango = buildPerlPackage { + # pname = "Pango"; + # version = "1.227"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAOC/Pango-1.227.tar.gz"; + # hash = "sha256-NLCkIt8/7NdZdYcEhVJFfUiudkxDu+/SqdYs62yLrHE="; + # }; + # buildInputs = [ pkgs.pango ]; + # propagatedBuildInputs = [ Cairo Glib ]; + # meta = { + # description = "Layout and render international text"; + # homepage = "https://gtk2-perl.sourceforge.net"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # ParallelForkManager = buildPerlPackage { + # pname = "Parallel-ForkManager"; + # version = "2.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YANICK/Parallel-ForkManager-2.02.tar.gz"; + # hash = "sha256-wbKXCou2ZsPefKrEqPTbzAQ6uBm7wzdpLse/J62uRAQ="; + # }; + # buildInputs = [ TestWarn ]; + # propagatedBuildInputs = [ Moo ]; + # meta = { + # description = "A simple parallel processing fork manager"; + # homepage = "https://github.com/dluxhu/perl-parallel-forkmanager"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParallelLoops = buildPerlPackage { + # pname = "Parallel-Loops"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMORCH/Parallel-Loops-0.12.tar.gz"; + # hash = "sha256-tmyP4v1RmHPIp7atHRoE3yAmkSJZteKKQeUdnJsVQVA="; + # }; + # propagatedBuildInputs = [ ParallelForkManager ]; + # meta = { + # description = "Execute loops using parallel forked subprocesses"; + # homepage = "https://github.com/pmorch/perl-Parallel-Loops"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # ParallelPipes = buildPerlModule { + # pname = "Parallel-Pipes"; + # version = "0.200"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/Parallel-Pipes-0.200.tar.gz"; + # hash = "sha256-iLmFDqzJ1hjz6RpRyqOGxKZOgswYc1AzUkTjSbgREQY="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Parallel processing using pipe(2) for communication and synchronization"; + # homepage = "https://github.com/skaji/Parallel-Pipes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # ParallelPrefork = buildPerlPackage { + # pname = "Parallel-Prefork"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/Parallel-Prefork-0.18.tar.gz"; + # hash = "sha256-8cH0jxrhR6WLyI+csvVw1rsV6kwNWJq9TDCE3clhWW4="; + # }; + # buildInputs = [ TestRequires TestSharedFork ]; + # propagatedBuildInputs = [ ClassAccessorLite ListMoreUtils ProcWait3 ScopeGuard SignalMask ]; + # meta = { + # description = "A simple prefork server framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParamsClassify = buildPerlModule { + # pname = "Params-Classify"; + # version = "0.015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Params-Classify-0.015.tar.gz"; + # hash = "sha256-OY7BXNiZ/Ni+89ueoXSL9jHxX2wyviA+R1tn31EKWRQ="; + # }; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Argument type classification"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParamsUtil = buildPerlPackage { + # pname = "Params-Util"; + # version = "1.102"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/Params-Util-1.102.tar.gz"; + # hash = "sha256-SZuxtILbJP2id6UVJVlq0JLCvVHdUI+o/sLp+EkJdAI="; + # }; + # meta = { + # description = "Simple, compact and correct param-checking functions"; + # homepage = "https://metacpan.org/release/Params-Util"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParamsValidate = buildPerlModule { + # pname = "Params-Validate"; + # version = "1.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Params-Validate-1.31.tar.gz"; + # hash = "sha256-G/JRjvLEhp+RWQ4hn1RcjvEu1TzzE+DrVwSt9/Gylh4="; + # }; + # buildInputs = [ TestFatal TestRequires ]; + # propagatedBuildInputs = [ ModuleImplementation ]; + # perlPreHook = "export LD=$CC"; + # meta = { + # description = "Validate method/function parameters"; + # homepage = "https://metacpan.org/release/Params-Validate"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ParamsValidationCompiler = buildPerlPackage { + # pname = "Params-ValidationCompiler"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Params-ValidationCompiler-0.31.tar.gz"; + # hash = "sha256-e2SXFz8batsp9dUdjPnsNtLxIZQStLJBDp13qQHoSm0="; + # }; + # propagatedBuildInputs = [ EvalClosure ExceptionClass ]; + # buildInputs = [ Specio Test2PluginNoWarnings Test2Suite TestWithoutModule ]; + # meta = { + # description = "Build an optimized subroutine parameter validator once, use it forever"; + # homepage = "https://metacpan.org/release/Params-ValidationCompiler"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # Paranoid = buildPerlPackage { + # pname = "Paranoid"; + # version = "2.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORLISS/Paranoid/Paranoid-2.10.tar.gz"; + # hash = "sha256-vvS25l1cmk72C8qjF0hvOg0jm/2rRQqnEgLCl5i4dSk="; + # }; + # patches = [ ./perl-modules/Paranoid-blessed-path.patch ]; + # preConfigure = '' + # # Capture the path used when compiling this module as the "blessed" + # # system path, analogous to the module's own use of '/bin:/sbin'. + # sed -i "s#__BLESSED_PATH__#${pkgs.coreutils}/bin#" lib/Paranoid.pm t/01_init_core.t + # ''; + # meta = { + # description = "General function library for safer, more secure programming"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # PARDist = buildPerlPackage { + # pname = "PAR-Dist"; + # version = "0.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSCHUPP/PAR-Dist-0.52.tar.gz"; + # hash = "sha256-y+ljAJ6nnSRUqF/heU9CW33cHoa3F0nIhNsp1gHqj4g="; + # }; + # meta = { + # description = "Create and manipulate PAR distributions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PAUSEPermissions = buildPerlPackage { + # pname = "PAUSE-Permissions"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/PAUSE-Permissions-0.17.tar.gz"; + # hash = "sha256-ek6SDeODL5CfJV1aMj942M0hXGCMlJbNbJVwEsi0MQg="; + # }; + # propagatedBuildInputs = [ FileHomeDir HTTPDate MooXOptions TimeDurationParse ]; + # buildInputs = [ PathTiny ]; + # meta = { + # description = "Interface to PAUSE's module permissions file (06perms.txt)"; + # homepage = "https://github.com/neilb/PAUSE-Permissions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pause-permissions"; + # }; + # }; + + # Parent = buildPerlPackage { + # pname = "parent"; + # version = "0.241"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORION/parent-0.241.tar.gz"; + # hash = "sha256-sQs5YKs5l9q3Vx/+l1ukYtl50IZFB0Ch4Is5WedRKP4="; + # }; + # meta = { + # description = "Establish an ISA relationship with base classes at compile time"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseWin32Registry = buildPerlPackage { + # pname = "ParseWin32Registry"; + # version = "1.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMACFARLA/Parse-Win32Registry-1.1.tar.gz"; + # hash = "sha256-wWOyAr5q17WPSEZJT/crjJqXloPKmU5DgOmsZWTcBbo="; + # }; + # meta = with lib; { + # description = "Module for parsing Windows Registry files"; + # license = with licenses; [ artistic1 gpl1Only ]; + # }; + # }; + + # ParseEDID = buildPerlPackage { + # pname = "Parse-Edid"; + # version = "1.0.7"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GROUSSE/Parse-EDID-1.0.7.tar.gz"; + # hash = "sha256-GtwPEFoyGYoqK02lsOD5hfBe/tmc42YZCnkOFl1nW/E="; + # }; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Extended display identification data (EDID) parser"; + # license = lib.licenses.gpl3Plus; + # }; + # }; + + # ParseDebControl = buildPerlPackage { + # pname = "Parse-DebControl"; + # version = "2.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JAYBONCI/Parse-DebControl-2.005.tar.gz"; + # hash = "sha256-tkvOH/IS1+PvnUNo57YnSc8ndR+oNgzfU+lpEjNGpyk="; + # }; + # propagatedBuildInputs = [ IOStringy LWP ]; + # meta = { + # description = "Easy OO parsing of debian control-like files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseDistname = buildPerlPackage { + # pname = "Parse-Distname"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Parse-Distname-0.05.tar.gz"; + # hash = "sha256-pfqTvsLat22IPaEtTzRLc7+L6wzEtmwkN28+Dzh67wc="; + # }; + # buildInputs = [ ExtUtilsMakeMakerCPANfile TestDifferences TestUseAllModules ]; + # meta = { + # description = "Parse a distribution name"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseIRC = buildPerlPackage { + # pname = "Parse-IRC"; + # version = "1.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Parse-IRC-1.22.tar.gz"; + # hash = "sha256-RXsJiX8304pwVPlWMkc2VCf+JBAWIu1MfwVHI6RbWNU="; + # }; + # meta = { + # description = "A parser for the IRC protocol"; + # homepage = "https://github.com/bingos/parse-irc"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # ParseLocalDistribution = buildPerlPackage { + # pname = "Parse-LocalDistribution"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Parse-LocalDistribution-0.19.tar.gz"; + # hash = "sha256-awvDLE6NnoHz8qzB0qdMKi+IepHBUisxzkyNSaQV6Z4="; + # }; + # propagatedBuildInputs = [ ParsePMFile ]; + # buildInputs = [ ExtUtilsMakeMakerCPANfile TestUseAllModules ]; + # meta = { + # description = "Parses local .pm files as PAUSE does"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParsePlainConfig = buildPerlPackage { + # pname = "Parse-PlainConfig"; + # version = "3.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORLISS/Parse-PlainConfig/Parse-PlainConfig-3.06.tar.gz"; + # hash = "sha256-8ffT5OWawrbPbJjaDKpBxdTl2GVcIQdRSBlplS/+G4c="; + # }; + # propagatedBuildInputs = [ ClassEHierarchy Paranoid ]; + # meta = { + # description = "Parser/Generator of human-readable conf files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # ParsePMFile = buildPerlPackage { + # pname = "Parse-PMFile"; + # version = "0.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Parse-PMFile-0.44.tar.gz"; + # hash = "sha256-4I8PVkVbOsEtzNjHEWUGErfTzRUPim+K5rQ7LaR9+ZQ="; + # }; + # buildInputs = [ ExtUtilsMakeMakerCPANfile ]; + # meta = { + # description = "Parses .pm file as PAUSE does"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseRecDescent = buildPerlModule { + # pname = "Parse-RecDescent"; + # version = "1.967015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JT/JTBRAUN/Parse-RecDescent-1.967015.tar.gz"; + # hash = "sha256-GUMzaky1TxeIpzPwgnwMVdtDENXq4V5UJjnJ3YVlbjc="; + # }; + # meta = { + # description = "Generate Recursive-Descent Parsers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseSyslog = buildPerlPackage { + # pname = "Parse-Syslog"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DS/DSCHWEI/Parse-Syslog-1.10.tar.gz"; + # hash = "sha256-ZZohRUQe822YNd7K+D2jCPzQP0kTjLPZCSjov8nxOdk="; + # }; + # meta = { + # description = "Parse Unix syslog files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParserMGC = buildPerlModule { + # pname = "Parser-MGC"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Parser-MGC-0.21.tar.gz"; + # hash = "sha256-DmGIpydqn5B1fGIEc98W08mGGRO6viWvIJz0RhWgKk8="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ FeatureCompatTry ]; + # meta = { + # description = "Build simple recursive-descent parsers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ParseYapp = buildPerlPackage { + # pname = "Parse-Yapp"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WB/WBRASWELL/Parse-Yapp-1.21.tar.gz"; + # hash = "sha256-OBDpmDCPui4PTyYEMDUDKwJ85RzlyKUqi440DKZfE+U="; + # }; + # meta = { + # description = "Perl extension for generating and using LALR parsers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "yapp"; + # }; + # }; + + # PathClass = buildPerlModule { + # pname = "Path-Class"; + # version = "0.37"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KW/KWILLIAMS/Path-Class-0.37.tar.gz"; + # hash = "sha256-ZUeBlIYCOG8ssuRHOnOfF9xpU9kqq8JJikyiVhvCSM4="; + # }; + # meta = { + # description = "Cross-platform path specification manipulation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PathDispatcher = buildPerlPackage { + # pname = "Path-Dispatcher"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Path-Dispatcher-1.08.tar.gz"; + # hash = "sha256-ean2HCdAi0/R7SNNrCRpdN3q+n/mNaGP5B7HeDEwrio="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal ]; + # propagatedBuildInputs = [ Moo MooXTypeTiny TryTiny TypeTiny ]; + # meta = { + # description = "Flexible and extensible dispatch"; + # homepage = "https://github.com/karenetheridge/Path-Dispatcher"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PathIteratorRule = buildPerlPackage { + # pname = "Path-Iterator-Rule"; + # version = "1.015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Path-Iterator-Rule-1.015.tar.gz"; + # hash = "sha256-87Bixo4Hx29o3lvDOHfP6eB4tjUaYboWUOM+CfUeyyk="; + # }; + # propagatedBuildInputs = [ NumberCompare TextGlob TryTiny ]; + # buildInputs = [ Filepushd PathTiny TestDeep TestFilename ]; + # meta = { + # description = "Iterative, recursive file finder"; + # homepage = "https://github.com/dagolden/Path-Iterator-Rule"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # PathTiny = buildPerlPackage { + # pname = "Path-Tiny"; + # version = "0.144"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Path-Tiny-0.144.tar.gz"; + # hash = "sha256-9uoJTs6EXJUqAsJ4kzJXk1TejUEKcH+bcEW9JBIGSH0="; + # }; + # preConfigure = + # '' + # substituteInPlace lib/Path/Tiny.pm --replace 'use File::Spec 3.40' \ + # 'use File::Spec 3.39' + # ''; + # # This appears to be currently failing tests, though I don't know why. + # # -- ocharles + # doCheck = false; + # meta = { + # description = "File path utility"; + # homepage = "https://github.com/dagolden/Path-Tiny"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # PathTools = buildPerlPackage { + # pname = "PathTools"; + # version = "3.75"; + # preConfigure = '' + # substituteInPlace Cwd.pm --replace '/usr/bin/pwd' '${pkgs.coreutils}/bin/pwd' + # ''; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XS/XSAWYERX/PathTools-3.75.tar.gz"; + # hash = "sha256-pVhQOqax+McnwAczOQgad4iGBqpwGtoa1i3Z2MP5RaI="; + # }; + # # cwd() and fastgetcwd() does not work with taint due to PATH in nixpkgs + # preCheck = "rm t/taint.t"; + # meta = { + # description = "Get pathname of current working directory"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PBKDF2Tiny = buildPerlPackage { + # pname = "PBKDF2-Tiny"; + # version = "0.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/PBKDF2-Tiny-0.005.tar.gz"; + # hash = "sha256-tOIdxZswJl6qpBtwUIfsA0R9nGVaFKxA/0bk3inqv44="; + # }; + # meta = { + # description = "Minimalist PBKDF2 (RFC 2898) with HMAC-SHA1 or HMAC-SHA2"; + # homepage = "https://github.com/dagolden/PBKDF2-Tiny"; + # license = with lib.licenses; [ asl20 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # PDFAPI2 = buildPerlPackage { + # pname = "PDF-API2"; + # version = "2.045"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SS/SSIMMS/PDF-API2-2.045.tar.gz"; + # hash = "sha256-tr204NDNZSYQP91YwXHgVgw2uEO3/jyk3cm7HkyDJAY="; + # }; + # buildInputs = [ TestException TestMemoryCycle ]; + # propagatedBuildInputs = [ FontTTF ]; + # meta = { + # description = "Create, modify, and examine PDF files"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # PDFBuilder = buildPerlPackage { + # pname = "PDF-Builder"; + # version = "3.025"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PM/PMPERRY/PDF-Builder-3.025.tar.gz"; + # hash = "sha256-qb6076DsKXWpFFzvBSEYsgmPRtnBUQ3WV4agPQ2j49U="; + # }; + # nativeCheckInputs = [ TestException TestMemoryCycle ]; + # propagatedBuildInputs = [ FontTTF ]; + # meta = { + # description = "Facilitates the creation and modification of PDF files"; + # homepage = "https://metacpan.org/pod/PDF::Builder"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # PDL = buildPerlPackage { + # pname = "PDL"; + # version = "2.025"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/PDL-2.025.tar.gz"; + # hash = "sha256-G1oWfq0ndy2V2tJ/jrfQlRnSkVbu1TxvwUQVGUtaitY="; + # }; + # patchPhase = '' + # substituteInPlace perldl.conf \ + # --replace 'POSIX_THREADS_LIBS => undef' 'POSIX_THREADS_LIBS => "-L${pkgs.glibc.dev}/lib"' \ + # --replace 'POSIX_THREADS_INC => undef' 'POSIX_THREADS_INC => "-I${pkgs.glibc.dev}/include"' \ + # --replace 'WITH_MINUIT => undef' 'WITH_MINUIT => 0' \ + # --replace 'WITH_SLATEC => undef' 'WITH_SLATEC => 0' \ + # --replace 'WITH_HDF => undef' 'WITH_HDF => 0' \ + # --replace 'WITH_GD => undef' 'WITH_GD => 0' \ + # --replace 'WITH_PROJ => undef' 'WITH_PROJ => 0' + # ''; + + # nativeBuildInputs = with pkgs; [ autoPatchelfHook libGL.dev glibc.dev mesa_glu.dev ]; + + # buildInputs = [ DevelChecklib TestDeep TestException TestWarn ] ++ + # (with pkgs; [ gsl freeglut xorg.libXmu xorg.libXi ]); + + # propagatedBuildInputs = [ + # AstroFITSHeader + # ConvertUU + # ExtUtilsF77 + # FileMap + # Inline + # InlineC + # ListMoreUtils + # ModuleCompile + # OpenGL + # PodParser + # TermReadKey + # ]; + + # meta = { + # description = "Perl Data Language"; + # homepage = "https://pdl.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pdl2"; + # platforms = lib.platforms.linux; + # }; + # }; + + # Pegex = buildPerlPackage { + # pname = "Pegex"; + # version = "0.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Pegex-0.75.tar.gz"; + # hash = "sha256-TcjTNd6AslJHzbP5RvDRDZugs8NLDtfQAxb9Bo/QXtw="; + # }; + # buildInputs = [ TestPod TieIxHash ]; + # propagatedBuildInputs = [ FileShareDirInstall XXX ]; + # meta = { + # description = "Acmeist PEG Parser Framework"; + # homepage = "https://github.com/ingydotnet/pegex-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerconaToolkit = callPackage ./perl-modules/Percona-Toolkit { }; + + # Perl5lib = buildPerlPackage { + # pname = "perl5lib"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NO/NOBULL/perl5lib-1.02.tar.gz"; + # hash = "sha256-JLlpJYQBU8REJBOYs2/Il24IX9sNh5yRc0cJz5F+zqw="; + # }; + # meta = { + # description = "Honour PERL5LIB even in taint mode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Perlosnames = buildPerlPackage { + # pname = "Perl-osnames"; + # version = "0.122"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/Perl-osnames-0.122.tar.gz"; + # hash = "sha256-cHWTnXR+N1F40ANI0AxS/52yzrsYuudHPcsJ34JRGKA="; + # }; + # meta = { + # description = "List possible $^O ($OSNAME) values, with description"; + # homepage = "https://metacpan.org/release/Perl-osnames"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlCritic = buildPerlModule { + # pname = "Perl-Critic"; + # version = "1.150"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/Perl-Critic-1.150.tar.gz"; + # hash = "sha256-5c2V3j5DvOcHdRdidLqkBfMm/IdA3wBUu4FpdcyNNJs="; + # }; + # buildInputs = [ TestDeep ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # propagatedBuildInputs = [ BKeywords ConfigTiny ExceptionClass FileWhich ListSomeUtils ModulePluggable PPI PPIxQuoteLike PPIxRegexp PPIxUtilities PPIxUtils PerlTidy PodSpell Readonly StringFormat ]; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/perlcritic + # ''; + # meta = { + # description = "Critique Perl source code for best-practices"; + # homepage = "http://perlcritic.com"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perlcritic"; + # }; + # }; + + # PerlCriticCommunity = buildPerlModule { + # pname = "Perl-Critic-Community"; + # version = "1.0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Perl-Critic-Community-v1.0.3.tar.gz"; + # hash = "sha256-Ed3bt5F5/mIp8zPKOS+U/firXNmJzJfZk1IaidXEetU="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ PPI PathTiny PerlCritic PerlCriticPolicyVariablesProhibitLoopOnHash PerlCriticPulp ]; + # meta = { + # description = "Community-inspired Perl::Critic policies"; + # homepage = "https://github.com/Grinnz/Perl-Critic-Community"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # PerlCriticMoose = buildPerlPackage rec { + # pname = "Perl-Critic-Moose"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Perl-Critic-Moose-${version}.tar.gz"; + # hash = "sha256-UuuOIsQmQ/F/4peiFxQBfv254phsJOMzfgMPNlD5IgE="; + # }; + # propagatedBuildInputs = [ PerlCritic Readonly namespaceautoclean ]; + # meta = { + # description = "Policies for Perl::Critic concerned with using Moose"; + # homepage = "https://metacpan.org/release/Perl-Critic-Moose"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # PerlCriticPolicyVariablesProhibitLoopOnHash = buildPerlPackage { + # pname = "Perl-Critic-Policy-Variables-ProhibitLoopOnHash"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XS/XSAWYERX/Perl-Critic-Policy-Variables-ProhibitLoopOnHash-0.008.tar.gz"; + # hash = "sha256-EvXwvpbqG9x4KAWFd70cXGPKI8F/rJw3CUUrPf9bhOA="; + # }; + # propagatedBuildInputs = [ PerlCritic ]; + # meta = { + # description = "Don't write loops on hashes, only on keys and values of hashes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlCriticPulp = buildPerlPackage { + # pname = "Perl-Critic-Pulp"; + # version = "99"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/Perl-Critic-Pulp-99.tar.gz"; + # hash = "sha256-uP2oQvy+100hAlfAooS23HsdBVSkej3l2X59VC4j5/4="; + # }; + # propagatedBuildInputs = [ IOString ListMoreUtils PPI PerlCritic PodMinimumVersion ]; + # meta = { + # description = "Some add-on policies for Perl::Critic"; + # homepage = "https://user42.tuxfamily.org/perl-critic-pulp/index.html"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # PerlDestructLevel = buildPerlPackage { + # pname = "Perl-Destruct-Level"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RG/RGARCIA/Perl-Destruct-Level-0.02.tar.gz"; + # hash = "sha256-QLSsCykrYM47h956o5vC+yWhnRDlyfaYZpYchLP20Ts="; + # }; + # meta = { + # description = "Allow to change perl's destruction level"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOLayers = buildPerlModule { + # pname = "PerlIO-Layers"; + # version = "0.012"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/PerlIO-Layers-0.012.tar.gz"; + # hash = "sha256-VC2lQvo2uz/de4d24jDTzMAqpnRM6bd7Tu9MyufASt8="; + # }; + # perlPreHook = "export LD=$CC"; + # meta = { + # description = "Querying your filehandle's capabilities"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOeol = buildPerlPackage { + # pname = "PerlIO-eol"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/PerlIO-eol-0.19.tar.gz"; + # hash = "sha256-/3O+xgRP2EepbEGZZPNw5Qn9Nv1XH3o7fDUXX1iviFk="; + # }; + # meta = { + # description = "PerlIO layer for normalizing line endings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOgzip = buildPerlPackage { + # pname = "PerlIO-gzip"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NW/NWCLARK/PerlIO-gzip-0.20.tar.gz"; + # hash = "sha256-SEhnmj8gHj87DF9vlSbmAq9Skj/6RxoqNlfbeGvTvcU="; + # }; + # buildInputs = [ pkgs.zlib ]; + # NIX_CFLAGS_LINK = "-L${pkgs.zlib.out}/lib -lz"; + # meta = { + # description = "Perl extension to provide a PerlIO layer to gzip/gunzip"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOutf8_strict = buildPerlPackage { + # pname = "PerlIO-utf8_strict"; + # version = "0.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/PerlIO-utf8_strict-0.010.tar.gz"; + # hash = "sha256-vNKEi3LfKQtemE+uixpsqW9tByADzyIjiajJ6OHFcM0="; + # }; + # buildInputs = [ TestException ]; + # meta = { + # description = "Fast and correct UTF-8 IO"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOviadynamic = buildPerlPackage { + # pname = "PerlIO-via-dynamic"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXMV/PerlIO-via-dynamic-0.14.tar.gz"; + # hash = "sha256-is169NivIdKLnBWuE3/nbNBk2tfSbrqKMLl+vG4fa0k="; + # }; + # meta = { + # description = "Dynamic PerlIO layers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOviasymlink = buildPerlPackage { + # pname = "PerlIO-via-symlink"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CL/CLKAO/PerlIO-via-symlink-0.05.tar.gz"; + # hash = "sha256-QQfUw0pqNilFNEjCVpXZL4JSKv9k4ptxa1alr1hrLVI="; + # }; + + # buildInputs = [ ModuleInstall ]; + + # postPatch = '' + # # remove outdated inc::Module::Install included with module + # # causes build failure for perl5.18+ + # rm -r inc + # ''; + # meta = { + # description = "PerlIO layers for create symlinks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlIOviaTimeout = buildPerlModule { + # pname = "PerlIO-via-Timeout"; + # version = "0.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAMS/PerlIO-via-Timeout-0.32.tar.gz"; + # hash = "sha256-knj572aIUNkT2Y+kwNfn1mfP81AzkfSk6uc6JG8ueRY="; + # }; + # buildInputs = [ ModuleBuildTiny TestSharedFork TestTCP ]; + # meta = { + # description = "A PerlIO layer that adds read & write timeout to a handle"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlLanguageServer = buildPerlPackage { + # pname = "Perl-LanguageServer"; + # version = "2.6.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRICHTER/Perl-LanguageServer-2.6.1.tar.gz"; + # hash = "sha256-IDM0uwsEXMeHAu9DA0CdCB87aN3XRoNEdGOIJ8NMsZg="; + # }; + # propagatedBuildInputs = [ AnyEvent AnyEventAIO ClassRefresh CompilerLexer Coro DataDump HashSafeKeys IOAIO JSON Moose PadWalker ]; + # meta = { + # description = "Language Server and Debug Protocol Adapter for Perl"; + # license = lib.licenses.artistic2; + # }; + # }; + + # perlldap = buildPerlPackage { + # pname = "perl-ldap"; + # version = "0.68"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARSCHAP/perl-ldap-0.68.tar.gz"; + # hash = "sha256-4vOJ/j56nkthSIaSkZrXI7mPO0ebUoj2ENqownmVs1E="; + # }; + # # ldapi socket location should match the one compiled into the openldap package + # postPatch = '' + # for f in lib/Net/LDAPI.pm lib/Net/LDAP/Util.pm lib/Net/LDAP.pod lib/Net/LDAP.pm; do + # sed -i 's:/var/run/ldapi:/run/openldap/ldapi:g' "$f" + # done + # ''; + # buildInputs = [ TextSoundex ]; + # propagatedBuildInputs = [ ConvertASN1 ]; + # meta = { + # description = "LDAP client library"; + # homepage = "https://ldap.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # PerlMagick = ImageMagick; # added 2021-08-02 + # ImageMagick = buildPerlPackage rec { + # pname = "Image-Magick"; + # version = "7.1.1-20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JC/JCRISTY/Image-Magick-${version}.tar.gz"; + # hash = "sha256-oMAwXQBxuV2FgPHBhUi+toNFPVnRLNjZqdP2q+ki6jg="; + # }; + # buildInputs = [ pkgs.imagemagick ]; + # preConfigure = + # '' + # sed -i -e 's|my \$INC_magick = .*|my $INC_magick = "-I${pkgs.imagemagick.dev}/include/ImageMagick";|' Makefile.PL + # ''; + # meta = { + # description = "Objected-oriented Perl interface to ImageMagick. Use it to read, manipulate, or write an image or image sequence from within a Perl script"; + # license = with lib.licenses; [ imagemagick ]; + # }; + # }; + + # PerlTidy = buildPerlPackage { + # pname = "Perl-Tidy"; + # version = "20230912"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHANCOCK/Perl-Tidy-20230912.tar.gz"; + # hash = "sha256-DFeIjyBvmHd34WZA5yV0qgp3eEZxn44+0EE8NTJfVUA="; + # }; + # meta = { + # description = "Indent and reformat perl scripts"; + # license = with lib.licenses; [ gpl2Plus ]; + # mainProgram = "perltidy"; + # }; + # }; + + # PHPSerialization = buildPerlPackage { + # pname = "PHP-Serialization"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/PHP-Serialization-0.34.tar.gz"; + # hash = "sha256-uRLUJumuulSRpeUC58XAOcXapXVCism9yCr/857G8Ho="; + # }; + # meta = { + # description = "Simple flexible means of converting the output of PHP's serialize() into the equivalent Perl memory structure, and vice versa"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PkgConfig = buildPerlPackage rec { + # pname = "PkgConfig"; + # version = "0.25026"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/PkgConfig-0.25026.tar.gz"; + # hash = "sha256-Tbpe08LWpoG5XF6/FLammVzmmRrkcZutfxqvOOmHwqA="; + # }; + # # support cross-compilation by simplifying the way we get version during build + # postPatch = '' + # substituteInPlace Makefile.PL --replace \ + # 'do { require "./lib/PkgConfig.pm"; $PkgConfig::VERSION; }' \ + # '"${version}"' + # ''; + # meta = { + # description = "Pure-Perl Core-Only replacement for pkg-config"; + # homepage = "https://metacpan.org/pod/PkgConfig"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # mainProgram = "ppkg-config"; + # }; + # }; + + # Plack = buildPerlPackage { + # pname = "Plack"; + # version = "1.0050"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-1.0050.tar.gz"; + # hash = "sha256-0mUa3oLrv/er4KOhifyTLa3Ed5GGzolGjlbQGJ6qbtQ="; + # }; + # buildInputs = [ AuthenSimplePasswd CGIEmulatePSGI FileShareDirInstall HTTPRequestAsCGI HTTPServerSimplePSGI IOHandleUtil LWP LWPProtocolhttp10 LogDispatchArray MIMETypes TestMockTimeHiRes TestRequires TestSharedFork TestTCP ]; + # propagatedBuildInputs = [ ApacheLogFormatCompiler CookieBaker DevelStackTraceAsHTML FileShareDir FilesysNotifySimple HTTPEntityParser HTTPHeadersFast HTTPMessage TryTiny ]; + # patches = [ + # ./perl-modules/Plack-test-replace-DES-hash-with-bcrypt.patch + # ]; + # meta = { + # description = "Perl Superglue for Web frameworks and Web Servers (PSGI toolkit)"; + # homepage = "https://github.com/plack/Plack"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "plackup"; + # }; + # }; + + # PlackAppProxy = buildPerlPackage { + # pname = "Plack-App-Proxy"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEEDO/Plack-App-Proxy-0.29.tar.gz"; + # hash = "sha256-BKqanbVKmpAn/nBLyjU/jl6fAr5AhytB0jX86c3ypg8="; + # }; + # propagatedBuildInputs = [ AnyEventHTTP LWP Plack ]; + # buildInputs = [ TestRequires TestSharedFork TestTCP ]; + # meta = { + # description = "Proxy requests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareAuthDigest = buildPerlModule { + # pname = "Plack-Middleware-Auth-Digest"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-Auth-Digest-0.05.tar.gz"; + # hash = "sha256-mr0/kpQ2zV7N+28/DX/foRuUB6OMfWAAYWpQ7eYQFes="; + # }; + # propagatedBuildInputs = [ DigestHMAC Plack ]; + # buildInputs = [ LWP ModuleBuildTiny TestSharedFork TestTCP ]; + # meta = { + # description = "Digest authentication"; + # homepage = "https://github.com/miyagawa/Plack-Middleware-Auth-Digest"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareConsoleLogger = buildPerlModule { + # pname = "Plack-Middleware-ConsoleLogger"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-ConsoleLogger-0.05.tar.gz"; + # hash = "sha256-VWc6ylBN4sw0AWpF8yyPft2k7k0oArctZ4TSxBuH+9k="; + # }; + # propagatedBuildInputs = [ JavaScriptValueEscape Plack ]; + # buildInputs = [ ModuleBuildTiny TestRequires ]; + # meta = { + # description = "Write logs to Firebug or Webkit Inspector"; + # homepage = "https://github.com/miyagawa/Plack-Middleware-ConsoleLogger"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareDebug = buildPerlModule { + # pname = "Plack-Middleware-Debug"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-Debug-0.18.tar.gz"; + # hash = "sha256-GS73nlIckMbv9vQUmtLkv8kR0sld94k1hV6Q1lnprJo="; + # }; + # buildInputs = [ ModuleBuildTiny TestRequires ]; + # propagatedBuildInputs = [ ClassMethodModifiers DataDump DataDumperConcise Plack TextMicroTemplate ]; + # meta = { + # description = "Display information about the current request/response"; + # homepage = "https://github.com/miyagawa/Plack-Middleware-Debug"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareDeflater = buildPerlPackage { + # pname = "Plack-Middleware-Deflater"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/Plack-Middleware-Deflater-0.12.tar.gz"; + # hash = "sha256-KNqV59pMi1WRrEVFCckhds0IQpYM4HT94w+aEHXcwnU="; + # }; + # propagatedBuildInputs = [ Plack ]; + # buildInputs = [ TestRequires TestSharedFork TestTCP ]; + # meta = { + # description = "Compress response body with Gzip or Deflate"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareFixMissingBodyInRedirect = buildPerlPackage { + # pname = "Plack-Middleware-FixMissingBodyInRedirect"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SW/SWEETKID/Plack-Middleware-FixMissingBodyInRedirect-0.12.tar.gz"; + # hash = "sha256-bCLQafWlesIG1GWbKLiGm7knBkC7lV793UUdzFjNs5E="; + # }; + # propagatedBuildInputs = [ HTMLParser Plack ]; + # meta = { + # description = "Plack::Middleware which sets body for redirect response, if it's not already set"; + # homepage = "https://github.com/Sweet-kid/Plack-Middleware-FixMissingBodyInRedirect"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareHeader = buildPerlPackage { + # pname = "Plack-Middleware-Header"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHIBA/Plack-Middleware-Header-0.04.tar.gz"; + # hash = "sha256-Xra5/3Ly09VpUOI+K8AnFQqcXnVg1zo0GhZeGu3qXV4="; + # }; + # propagatedBuildInputs = [ Plack ]; + # meta = { + # description = "Modify HTTP response headers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareMethodOverride = buildPerlPackage { + # pname = "Plack-Middleware-MethodOverride"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-MethodOverride-0.20.tar.gz"; + # hash = "sha256-2/taLvtIv+sByzrh4cZ34VXce/4hDH5/IhuuPLaqtfE="; + # }; + # propagatedBuildInputs = [ Plack ]; + # meta = { + # description = "Override REST methods to Plack apps via POST"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareRemoveRedundantBody = buildPerlPackage { + # pname = "Plack-Middleware-RemoveRedundantBody"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SW/SWEETKID/Plack-Middleware-RemoveRedundantBody-0.09.tar.gz"; + # hash = "sha256-gNRfk9a3KQsL2LPO3YSjf8UBRWzD3sAux6rYHAAYCH4="; + # }; + # propagatedBuildInputs = [ Plack ]; + # meta = { + # description = "Plack::Middleware which removes body for HTTP response if it's not required"; + # homepage = "https://github.com/upasana-me/Plack-Middleware-RemoveRedundantBody"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareReverseProxy = buildPerlPackage { + # pname = "Plack-Middleware-ReverseProxy"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-ReverseProxy-0.16.tar.gz"; + # hash = "sha256-h0kx030HZnug0PN5A7lFEQcfQZH+tz+kV2XaK4wVoSg="; + # }; + # propagatedBuildInputs = [ Plack ]; + # meta = { + # description = "Supports app to run as a reverse proxy backend"; + # homepage = "https://github.com/lopnor/Plack-Middleware-ReverseProxy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackMiddlewareSession = buildPerlModule { + # pname = "Plack-Middleware-Session"; + # version = "0.33"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Plack-Middleware-Session-0.33.tar.gz"; + # hash = "sha256-T/miydGK2ASbRd/ze5vdQSIeLC8eFrr7gb/tyIxRpO4="; + # }; + # propagatedBuildInputs = [ DigestHMAC Plack ]; + # buildInputs = [ HTTPCookies LWP ModuleBuildTiny TestFatal TestRequires TestSharedFork TestTCP ]; + # meta = { + # description = "Middleware for session management"; + # homepage = "https://github.com/plack/Plack-Middleware-Session"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PlackTestExternalServer = buildPerlPackage { + # pname = "Plack-Test-ExternalServer"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Plack-Test-ExternalServer-0.02.tar.gz"; + # hash = "sha256-W69cV/4MBkEt7snFq+eVKrigT4xHtLvY6emYImiQPtA="; + # }; + # buildInputs = [ Plack TestSharedFork TestTCP ]; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "Run HTTP tests on external live servers"; + # homepage = "https://github.com/perl-catalyst/Plack-Test-ExternalServer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PLS = buildPerlPackage { + # pname = "PLS"; + # version = "0.905"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MREISNER/PLS-0.905.tar.gz"; + # hash = "sha256-RVW1J5nBZBXDy/5eMB6gLKDrvDQhTH/lLx19ykUwLik="; + # }; + # propagatedBuildInputs = [ Future FutureQueue IOAsync PPI PPR PathTiny PerlCritic PerlTidy PodMarkdown URI ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/pls + # ''; + # meta = { + # description = "Perl Language Server"; + # homepage = "https://github.com/FractalBoy/perl-language-server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.artturin ]; + # mainProgram = "pls"; + # }; + # }; + + # Po4a = callPackage ./perl-modules/Po4a { }; + + # PodMinimumVersion = buildPerlPackage { + # pname = "Pod-MinimumVersion"; + # version = "50"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/Pod-MinimumVersion-50.tar.gz"; + # hash = "sha256-C9KBLZqsvZm7cfoQOkuxKelVwTi6dZhzQgfcn7Z7Wm8="; + # }; + # propagatedBuildInputs = [ IOString PodParser ]; + # meta = { + # description = "Determine minimum Perl version of POD directives"; + # homepage = "https://user42.tuxfamily.org/pod-minimumversion/index.html"; + # license = with lib.licenses; [ gpl3Plus ]; + # mainProgram = "pod-minimumversion"; + # }; + # }; + + # POE = buildPerlPackage { + # pname = "POE"; + # version = "1.370"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/POE-1.370.tar.gz"; + # hash = "sha256-V94rY1sV+joxqeVd1REiFJ5UFOEVjugiNQYmNO4YppM="; + # }; + # # N.B. removing TestPodLinkCheck from buildInputs because tests requiring + # # this module don't disable themselves when "run_network_tests" is + # # not present (see below). + # propagatedBuildInputs = [ pkgs.cacert IOPipely IOTty POETestLoops ]; + # preCheck = '' + # set -x + + # : Makefile.PL touches the following file as a "marker" to indicate + # : it should perform tests which use the network. Delete this file + # : for sandbox builds. + # rm -f run_network_tests + + # : Certs are required if not running in a sandbox. + # export SSL_CERT_FILE=${pkgs.cacert.out}/etc/ssl/certs/ca-bundle.crt + + # : The following flag enables extra tests not normally performed. + # export RELEASE_TESTING=1 + + # set +x + # ''; + # meta = { + # description = "Portable, event-loop agnostic eventy networking and multitasking"; + # homepage = "http://poe.perl.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # }; + # }; + + # POETestLoops = buildPerlPackage { + # pname = "POE-Test-Loops"; + # version = "1.360"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCAPUTO/POE-Test-Loops-1.360.tar.gz"; + # hash = "sha256-vtDJb+kcmP035utZqASqrJzEqekoRQt21L9VJ6nmpHs="; + # }; + # meta = { + # description = "Reusable tests for POE::Loop authors"; + # homepage = "https://search.cpan.org/dist/POE-Test-Loops"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = teams.deshaw.members; + # mainProgram = "poe-gen-tests"; + # }; + # }; + + # PPI = buildPerlPackage { + # pname = "PPI"; + # version = "1.277"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MITHALDU/PPI-1.277.tar.gz"; + # hash = "sha256-h8efg7aHbiBgUZZdUBnSUHxVH4GahnUAgOx+xDsuCvg="; + # }; + # buildInputs = [ ClassInspector TestDeep TestNoWarnings TestObject TestSubCalls ]; + # propagatedBuildInputs = [ Clone IOString ParamsUtil TaskWeaken ]; + + # # Remove test that fails due to unexpected shebang after + # # patchShebang. + # preCheck = "rm t/03_document.t"; + + # meta = { + # description = "Parse, Analyze and Manipulate Perl (without perl)"; + # homepage = "https://github.com/Perl-Critic/PPI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PPIxQuoteLike = buildPerlModule { + # pname = "PPIx-QuoteLike"; + # version = "0.023"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WY/WYANT/PPIx-QuoteLike-0.023.tar.gz"; + # hash = "sha256-NXajFJ0sU+B+lze3iSvlz7hKSZpu8d8JC3E7BUQjTSE="; + # }; + # propagatedBuildInputs = [ PPI Readonly ]; + # meta = { + # description = "Parse Perl string literals and string-literal-like things"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PPIxRegexp = buildPerlModule { + # pname = "PPIx-Regexp"; + # version = "0.088"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WY/WYANT/PPIx-Regexp-0.088.tar.gz"; + # hash = "sha256-iFQz+bEC+tT9NrIccyC7A2A2ERyvmYExv0FvfNXul2Q="; + # }; + # propagatedBuildInputs = [ PPI ]; + # meta = { + # description = "Parse regular expressions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PPIxUtilities = buildPerlModule { + # pname = "PPIx-Utilities"; + # version = "1.001000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EL/ELLIOTJS/PPIx-Utilities-1.001000.tar.gz"; + # hash = "sha256-A6SDOG/WosgI8Jd41E2wawLDFA+yS6S/EvhR9G07y5s="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ ExceptionClass PPI Readonly ]; + # meta = { + # description = "Extensions to PPI|PPI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PPIxUtils = buildPerlPackage { + # pname = "PPIx-Utils"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/PPIx-Utils-0.003.tar.gz"; + # hash = "sha256-KpvM/I6tA74BtnJI/o4VJSIED3mChvpO9EMrfy79uhE="; + # }; + # propagatedBuildInputs = [ BKeywords PPI ]; + # meta = { + # homepage = "https://github.com/Grinnz/PPIx-Utils"; + # description = "Utility functions for PPI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PPR = buildPerlPackage { + # pname = "PPR"; + # version = "0.001008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCONWAY/PPR-0.001008.tar.gz"; + # hash = "sha256-EQ5xwF8uLJDrAfCgaU5VqdvpHIV+SBJeF0LRflzbHkk="; + # }; + # meta = { + # description = "Pattern-based Perl Recognizer"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.artturin ]; + # }; + # }; + + # ProcBackground = buildPerlPackage { + # pname = "Proc-Background"; + # version = "1.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NERDVANA/Proc-Background-1.32.tar.gz"; + # hash = "sha256-Wxp4DduSnKQnJeuQtRgyFCX/d4tKE3+G+sldn7nNKWc="; + # }; + # meta = { + # description = "Run asynchronous child processes under Unix or Windows"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "timed-process"; + # }; + # }; + + # ProcProcessTable = buildPerlPackage { + # pname = "Proc-ProcessTable"; + # version = "0.636"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JW/JWB/Proc-ProcessTable-0.636.tar.gz"; + # hash = "sha256-lEIk/7APwe81BpYzdwoK/ahiO1x1MtHkq0ip3zlIkP0="; + # }; + # meta = { + # description = "Perl extension to access the unix process table"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ProcDaemon = buildPerlPackage { + # pname = "Proc-Daemon"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AK/AKREAL/Proc-Daemon-0.23.tar.gz"; + # hash = "sha256-NMC4W3lItDHLq8l87lgINeUVzPQ7rb2DOesQlHQIm2k="; + # }; + # buildInputs = [ ProcProcessTable ]; + # meta = { + # description = "Run Perl program(s) as a daemon process"; + # homepage = "https://github.com/akreal/Proc-Daemon"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProcPIDFile = buildPerlPackage { + # pname = "Proc-PID-File"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DM/DMITRI/Proc-PID-File-1.29.tar.gz"; + # hash = "sha256-O87aSd8YLT2BaLcMKlGyBW8v1FlQptBCipmS/TVc1KQ="; + # }; + # meta = { + # description = "Manage process id files"; + # homepage = "https://github.com/dtikhonov/Proc-PID-File"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProcFind = buildPerlPackage { + # pname = "Proc-Find"; + # version = "0.051"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLANCAR/Proc-Find-0.051.tar.gz"; + # hash = "sha256-ZNOQceyU17ZqfKtalQJG8P/wE7WiAKY9EXZDKYfloTU="; + # }; + # propagatedBuildInputs = [ ProcProcessTable ]; + # meta = { + # description = "Find processes by name, PID, or some other attributes"; + # homepage = "https://metacpan.org/release/Proc-Find"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProcSafeExec = buildPerlPackage { + # pname = "Proc-SafeExec"; + # version = "1.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BILBO/Proc-SafeExec-1.5.tar.gz"; + # hash = "sha256-G00JCLysVj00p+W+YcXaPu6Y5KbH+mjCZwzFhEtaLXg="; + # }; + # meta = { + # description = "Convenient utility for executing external commands in various ways"; + # license = with lib.licenses; [ gpl1Only bsd2 ]; + # }; + # }; + + # ProcSimple = buildPerlPackage { + # pname = "Proc-Simple"; + # version = "1.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHILLI/Proc-Simple-1.32.tar.gz"; + # hash = "sha256-TI8KkksZrXihPac/4PswbTKnudEKMyxSMIf8g6IJqMQ="; + # }; + # meta = { + # description = "Launch and control background processes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProcWait3 = buildPerlPackage { + # pname = "Proc-Wait3"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CT/CTILMES/Proc-Wait3-0.05.tar.gz"; + # hash = "sha256-GpB/XbaTPcKTm7/v/hnurn7TnvG5eivJtyPy8l+ByvM="; + # }; + # meta = { + # description = "Perl extension for wait3 system call"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProcWaitStat = buildPerlPackage { + # pname = "Proc-WaitStat"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROSCH/Proc-WaitStat-1.00.tar.gz"; + # hash = "sha256-0HVj9eeHkJ0W5zkCQeh39Jq3ObHenQ4uoaQb0L9EdLw="; + # }; + # propagatedBuildInputs = [ IPCSignal ]; + # meta = { + # description = "Interpret and act on wait() status values"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PrometheusTiny = buildPerlPackage { + # pname = "Prometheus-Tiny"; + # version = "0.011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROBN/Prometheus-Tiny-0.011.tar.gz"; + # hash = "sha256-jbFIDzyJ64bUFM9fR/7tjfMRKzjEY8uPZbTAZOILHhM="; + # }; + # buildInputs = [ HTTPMessage Plack TestException TestWarn ]; + # meta = { + # description = "A tiny Prometheus client"; + # homepage = "https://github.com/robn/Prometheus-Tiny"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PrometheusTinyShared = buildPerlPackage { + # pname = "Prometheus-Tiny-Shared"; + # version = "0.027"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROBN/Prometheus-Tiny-Shared-0.027.tar.gz"; + # hash = "sha256-egULqhjKfA0gsoih1L0nJ3E6lFg/Qmskn5XcjUDty9E="; + # }; + # buildInputs = [ DataRandom HTTPMessage Plack TestDifferences TestException TestWarn ]; + # propagatedBuildInputs = [ HashSharedMem JSONXS PrometheusTiny ]; + # meta = { + # description = "A tiny Prometheus client with a shared database behind it"; + # homepage = "https://github.com/robn/Prometheus-Tiny-Shared"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProtocolRedis = buildPerlPackage { + # pname = "Protocol-Redis"; + # version = "1.0011"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/U/UN/UNDEF/Protocol-Redis-1.0011.tar.gz"; + # hash = "sha256-fOtr2ABnyQRGXU/R8XFXJDiMm9w3xsLAA6IM5Wm39Og="; + # }; + # meta = { + # description = "Redis protocol parser/encoder with asynchronous capabilities"; + # homepage = "https://github.com/und3f/protocol-redis"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ProtocolRedisFaster = buildPerlPackage { + # pname = "Protocol-Redis-Faster"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Protocol-Redis-Faster-0.003.tar.gz"; + # hash = "sha256-a5r7PelOwczX20+eai6rolSld5AwHBe8sTuz7f4YULc="; + # }; + # propagatedBuildInputs = [ ProtocolRedis ]; + # meta = { + # description = "Optimized pure-perl Redis protocol parser/encoder"; + # homepage = "https://github.com/Grinnz/Protocol-Redis-Faster"; + # license = with lib.licenses; [ artistic2 ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # ProtocolWebSocket = buildPerlModule { + # pname = "Protocol-WebSocket"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VT/VTI/Protocol-WebSocket-0.26.tar.gz"; + # hash = "sha256-WDfQNxGnoyVPCv7LfkCeiwk3YGDDiluClejumvdXVSI="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "WebSocket protocol"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ProtocolHTTP2 = buildPerlModule { + # pname = "Protocol-HTTP2"; + # version = "1.10"; + + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CR/CRUX/Protocol-HTTP2-1.10.tar.gz"; + # hash = "sha256-wmoAWPtK+ul+S/DbxkGJ9nEURRXERH89y1l+zQOWpko="; + # }; + # buildInputs = [ AnyEvent ModuleBuildTiny NetSSLeay TestLeakTrace TestSharedFork TestTCP ]; + # meta = { + # description = "HTTP/2 protocol implementation (RFC 7540)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PSGI = buildPerlPackage { + # pname = "PSGI"; + # version = "1.102"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/PSGI-1.102.tar.gz"; + # hash = "sha256-pWxEZ0CRfahpJcKfxmM7nfg5shz5j2onCGWY7ZDuH0c="; + # }; + # meta = { + # description = "Perl Web Server Gateway Interface Specification"; + # license = with lib.licenses; [ cc-by-sa-25 ]; + # }; + # }; + + PadWalker = buildPerlPackage { + pname = "PadWalker"; + version = "2.5"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RO/ROBIN/PadWalker-2.5.tar.gz"; + hash = "sha256-B7Jqu4QRRq8yByqNaMuQF2/7F2/ZJo5vL30Qb4F6DNA="; + }; + meta = { + description = "Play with other peoples' lexical variables"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # Perl6Junction = buildPerlPackage { + # pname = "Perl6-Junction"; + # version = "1.60000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFRANKS/Perl6-Junction-1.60000.tar.gz"; + # hash = "sha256-0CN16FGX6PkbTLLTM0rpqJ9gAi949c1gdtzU7G+ycWQ="; + # }; + # meta = { + # description = "Perl6 style Junction operators in Perl5"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PerlMinimumVersion = buildPerlPackage { + # pname = "Perl-MinimumVersion"; + # version = "1.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DB/DBOOK/Perl-MinimumVersion-1.40.tar.gz"; + # hash = "sha256-dYmleMtg1wykdVw5WzWStECgzWobB05OzqyTsDGhvpA="; + # }; + # buildInputs = [ TestScript ]; + # propagatedBuildInputs = [ FileFindRulePerl PerlCritic ]; + # meta = { + # description = "Find a minimum required version of perl for Perl code"; + # homepage = "https://github.com/neilbowers/Perl-MinimumVersion"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perlver"; + # }; + # }; + + # PerlPrereqScanner = buildPerlPackage { + # pname = "Perl-PrereqScanner"; + # version = "1.100"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Perl-PrereqScanner-1.100.tar.gz"; + # hash = "sha256-ARgdOKLnr/g40mISJWPFBja6SzZS7l0dT471uj9bGGs="; + # }; + # buildInputs = [ TryTiny ]; + # propagatedBuildInputs = [ GetoptLongDescriptive ModulePath Moo ParamsUtil PPI StringRewritePrefix TypeTiny namespaceautoclean ]; + # meta = { + # description = "A tool to scan your Perl code for its prerequisites"; + # homepage = "https://github.com/rjbs/Perl-PrereqScanner"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "scan-perl-prereqs"; + # }; + # }; + + # PerlPrereqScannerNotQuiteLite = buildPerlPackage { + # pname = "Perl-PrereqScanner-NotQuiteLite"; + # version = "0.9917"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Perl-PrereqScanner-NotQuiteLite-0.9917.tar.gz"; + # hash = "sha256-O6fuF9lfDJqNkqLkwYVLZKcH0cAihGIm3Q36Qvfeud0="; + # }; + # propagatedBuildInputs = [ DataDump ModuleCPANfile ModuleFind RegexpTrie URIcpan ]; + # buildInputs = [ ExtUtilsMakeMakerCPANfile ParseDistname TestFailWarnings TestUseAllModules ]; + # meta = { + # description = "A tool to scan your Perl code for its prerequisites"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "scan-perl-prereqs-nqlite"; + # }; + # }; + + # PerlVersion = buildPerlPackage { + # pname = "Perl-Version"; + # version = "1.013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Perl-Version-1.013.tar.gz"; + # hash = "sha256-GIdBTRyGidhkyEARQQHgQ+mdfdW5zKaTaaYOgh460Pc="; + # }; + # propagatedBuildInputs = [ FileSlurpTiny ]; + # meta = { + # description = "Parse and manipulate Perl version strings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perl-reversion"; + # }; + # }; + + # PodAbstract = buildPerlPackage { + # pname = "Pod-Abstract"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BL/BLILBURNE/Pod-Abstract-0.20.tar.gz"; + # hash = "sha256-lW73u4hMVUVuL7bn8in5qH3VCmHXAFAMc4248ronf4c="; + # }; + # propagatedBuildInputs = [ IOString TaskWeaken PodParser ]; + # meta = { + # description = "An abstract, tree-based interface to perl POD documents"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "paf"; + # }; + # }; + + # PodChecker = buildPerlPackage { + # pname = "Pod-Checker"; + # version = "1.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAREKR/Pod-Checker-1.75.tar.gz"; + # hash = "sha256-82O1dOxmCvbtvT5dTJ/8UVodRsvxx8ytmkbO0oh5wiE="; + # }; + # meta = { + # description = "Verifies POD documentation contents for compliance with the POD format specifications"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "podchecker"; + # }; + # }; + + # PodCoverage = buildPerlPackage { + # pname = "Pod-Coverage"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Pod-Coverage-0.23.tar.gz"; + # hash = "sha256-MLegsMlC9Ep1UsDTTpsfLgugtnlVxh47FYnsNpB0sQc="; + # }; + # propagatedBuildInputs = [ DevelSymdump PodParser ]; + # meta = { + # description = "Checks if the documentation of a module is comprehensive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pod_cover"; + # }; + # }; + + # PodCoverageTrustPod = buildPerlPackage { + # pname = "Pod-Coverage-TrustPod"; + # version = "0.100006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Pod-Coverage-TrustPod-0.100006.tar.gz"; + # hash = "sha256-NYrcJQTwOetpCYqpm93mrp3JNTZKjhRPZAXoKTs6fKM="; + # }; + # propagatedBuildInputs = [ PodCoverage PodEventual ]; + # meta = { + # description = "Allow a module's pod to contain Pod::Coverage hints"; + # homepage = "https://github.com/rjbs/Pod-Coverage-TrustPod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodElemental = buildPerlPackage { + # pname = "Pod-Elemental"; + # version = "0.103006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Pod-Elemental-0.103006.tar.gz"; + # hash = "sha256-dQw6edjhgkdYpu99LdB33N3KUDVCuMNOzNWsu3edxCM="; + # }; + # buildInputs = [ TestDeep TestDifferences ]; + # propagatedBuildInputs = [ MooseXTypes PodEventual StringRewritePrefix StringTruncate ]; + # meta = { + # description = "Work with nestable Pod elements"; + # homepage = "https://github.com/rjbs/Pod-Elemental"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodElementalPerlMunger = buildPerlPackage { + # pname = "Pod-Elemental-PerlMunger"; + # version = "0.200007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Pod-Elemental-PerlMunger-0.200007.tar.gz"; + # hash = "sha256-UYleTEGgeere+fJPXcSOMkWlwG40BO15yF+lzv63lak="; + # }; + # buildInputs = [ TestDifferences ]; + # propagatedBuildInputs = [ PPI PodElemental ]; + # meta = { + # description = "A thing that takes a string of Perl and rewrites its documentation"; + # homepage = "https://github.com/rjbs/Pod-Elemental-PerlMunger"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodEventual = buildPerlPackage { + # pname = "Pod-Eventual"; + # version = "0.094003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Pod-Eventual-0.094003.tar.gz"; + # hash = "sha256-fwYMw00RZWzgadsGHj1g7cDKvI+JpKLcfqrpXayFbS0="; + # }; + # propagatedBuildInputs = [ MixinLinewise ]; + # buildInputs = [ TestDeep ]; + # meta = { + # description = "Read a POD document as a series of trivial events"; + # homepage = "https://github.com/rjbs/Pod-Eventual"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodParser = buildPerlPackage { + # pname = "Pod-Parser"; + # version = "1.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAREKR/Pod-Parser-1.66.tar.gz"; + # hash = "sha256-IpKKe//mG0UsBbu7j1IW1LnPn+KoSbd2wlUA0k0g33w="; + # }; + # meta = { + # description = "Modules for parsing/translating POD format documents"; + # license = with lib.licenses; [ artistic1 ]; + # mainProgram = "podselect"; + # }; + # }; + + # PodPOM = buildPerlPackage { + # pname = "Pod-POM"; + # version = "2.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Pod-POM-2.01.tar.gz"; + # hash = "sha256-G1D7qbvd4+rRkr7roOrd0MYU46+xdD+m//gF9XxW9/Q="; + # }; + # buildInputs = [ FileSlurper TestDifferences TextDiff ]; + # meta = { + # description = "POD Object Model"; + # homepage = "https://github.com/neilb/Pod-POM"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pom2"; + # }; + # }; + + # PodPOMViewTOC = buildPerlPackage { + # pname = "Pod-POM-View-TOC"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERLER/Pod-POM-View-TOC-0.02.tar.gz"; + # hash = "sha256-zLQicsdQM3nLETE5RiDuUCdtcoRODoDrSwB6nVj4diM="; + # }; + # propagatedBuildInputs = [ PodPOM ]; + # meta = { + # description = "Generate the TOC of a POD with Pod::POM"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodSection = buildPerlModule { + # pname = "Pod-Section"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KT/KTAT/Pod-Section-0.02.tar.gz"; + # hash = "sha256-ydHXUpLzIYgRhOxWmDwW9Aj9LTEtWnIPj7DSyvpykjg="; + # }; + # propagatedBuildInputs = [ PodAbstract ]; + # meta = { + # description = "Select specified section from Module's POD"; + # homepage = "https://github.com/ktat/Pod-Section"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "podsection"; + # }; + # }; + + # PodLaTeX = buildPerlModule { + # pname = "Pod-LaTeX"; + # version = "0.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TJ/TJENNESS/Pod-LaTeX-0.61.tar.gz"; + # hash = "sha256-FahA6hyKds08hl+78v7DOwNhXA2qUPnIAMVODPBlnUY="; + # }; + # propagatedBuildInputs = [ PodParser ]; + # meta = { + # description = "Convert Pod data to formatted Latex"; + # homepage = "https://github.com/timj/perl-Pod-LaTeX/tree/master"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pod2latex"; + # }; + # }; + + # podlators = buildPerlPackage { + # pname = "podlators"; + # version = "5.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RR/RRA/podlators-5.01.tar.gz"; + # hash = "sha256-zP0d+fGkfwlbzm1xj61a9A94ziSR8scjlibhW3AgvHE="; + # }; + # preCheck = '' + # # remove failing spdx check + # rm t/docs/spdx-license.t + # ''; + # meta = { + # description = "Convert POD data to various other formats"; + # homepage = "https://www.eyrie.org/~eagle/software/podlators"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # podlinkcheck = buildPerlPackage { + # pname = "podlinkcheck"; + # version = "15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/podlinkcheck-15.tar.gz"; + # hash = "sha256-Tjvr7Bv4Lb+FCpSuJqJTZEz1gG7EGvx05D4XEKNzIds="; + # }; + # propagatedBuildInputs = [ FileFindIterator FileHomeDir IPCRun PodParser constant-defer libintl-perl ]; + # meta = { + # description = "Check POD L<> link references"; + # homepage = "https://user42.tuxfamily.org/podlinkcheck/index.html"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + # prefork = buildPerlPackage { + # pname = "prefork"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/prefork-1.05.tar.gz"; + # hash = "sha256-bYe836Y7KM78+ocIA6UZtlkOPqGcMA+YzssOGQuxkwU="; + # }; + # meta = { + # description = "Optimized module loading for forking or non-forking processes"; + # homepage = "https://github.com/karenetheridge/prefork"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodPerldoc = buildPerlPackage { + # pname = "Pod-Perldoc"; + # version = "3.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MALLEN/Pod-Perldoc-3.28.tar.gz"; + # hash = "sha256-zEHmBbjhPECo7mUE/0Y0e1un+9kiA7O7BVQiBRvvxk0="; + # }; + # meta = { + # description = "Look up Perl documentation in Pod format"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perldoc"; + # }; + # }; + + # PodPlainer = buildPerlPackage { + # pname = "Pod-Plainer"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RM/RMBARKER/Pod-Plainer-1.04.tar.gz"; + # hash = "sha256-G7+/fR1IceWoO6shN+ItCJB4IGgVGQ6x1cEmCjSZRW8="; + # }; + # propagatedBuildInputs = [ PodParser ]; + # meta = { + # description = "Perl extension for converting Pod to old-style Pod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodMarkdown = buildPerlPackage { + # pname = "Pod-Markdown"; + # version = "3.300"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RW/RWSTAUNER/Pod-Markdown-3.300.tar.gz"; + # hash = "sha256-7HnpkIo2BXScT+tQVHY+toEt0ztUzoWlEzmqfPmZG3k="; + # }; + # buildInputs = [ TestDifferences ]; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Convert POD to Markdown"; + # homepage = "https://github.com/rwstauner/Pod-Markdown"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pod2markdown"; + # }; + # }; + + # PodMarkdownGithub = buildPerlPackage { + # pname = "Pod-Markdown-Github"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MINIMAL/Pod-Markdown-Github-0.04.tar.gz"; + # hash = "sha256-s34vAJxMzkkk+yPuQxRuUGcilxvqa87S2sFdCAo7xhM="; + # }; + # propagatedBuildInputs = [ PodMarkdown ]; + # buildInputs = [ TestDifferences ]; + # meta = { + # description = "Convert POD to Github's specific markdown"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "pod2github"; + # }; + # }; + + # PodSimple = buildPerlPackage { + # pname = "Pod-Simple"; + # version = "3.45"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KH/KHW/Pod-Simple-3.45.tar.gz"; + # hash = "sha256-hIO7lc0+QwfWbe8JKjd5+EOvdySCv9wCTj4A0MTbDPo="; + # }; + # meta = { + # description = "Framework for parsing Pod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodSpell = buildPerlPackage { + # pname = "Pod-Spell"; + # version = "1.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Pod-Spell-1.26.tar.gz"; + # hash = "sha256-LwW/yc+wS5b8v6LIVE0eaukIWW02lsRuDiZVa3UK+78="; + # }; + # propagatedBuildInputs = [ ClassTiny FileShareDir LinguaENInflect PathTiny PodParser ]; + # buildInputs = [ FileShareDirInstall TestDeep ]; + # meta = { + # description = "A formatter for spellchecking Pod"; + # homepage = "https://github.com/perl-pod/Pod-Spell"; + # license = with lib.licenses; [ artistic2 ]; + # mainProgram = "podspell"; + # }; + # }; + + # PodStrip = buildPerlModule { + # pname = "Pod-Strip"; + # version = "1.100"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOMM/Pod-Strip-1.100.tar.gz"; + # hash = "sha256-Z1BqZh+pyuzv57pPQvC8FbCm8JZ8eWB3QPbLaXSu1M0="; + # }; + # meta = { + # description = "Remove POD from Perl code"; + # homepage = "https://github.com/domm/Pod-Strip"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodTidy = buildPerlModule { + # pname = "Pod-Tidy"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHOBLITT/Pod-Tidy-0.10.tar.gz"; + # hash = "sha256-iG7hQ+p81Tm0O+16KHmJ0Wc211y/ofheLMzq+eiVnb0="; + # }; + # propagatedBuildInputs = [ EncodeNewlines IOString PodWrap TextGlob ]; + # buildInputs = [ TestCmd ]; + # meta = { + # description = "A reformatting Pod Processor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "podtidy"; + # }; + # }; + + # PodWeaver = buildPerlPackage { + # pname = "Pod-Weaver"; + # version = "4.019"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Pod-Weaver-4.019.tar.gz"; + # hash = "sha256-aUatHwTq+aoR8kzFRJTh1Xli9Y4FkS82S3T5WT595/c="; + # }; + # buildInputs = [ PPI SoftwareLicense TestDifferences ]; + # propagatedBuildInputs = [ ConfigMVPReaderINI DateTime ListMoreUtils LogDispatchouli PodElemental ]; + # meta = { + # description = "Weave together a Pod document from an outline"; + # homepage = "https://github.com/rjbs/Pod-Weaver"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # PodWrap = buildPerlModule { + # pname = "Pod-Wrap"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NU/NUFFIN/Pod-Wrap-0.01.tar.gz"; + # hash = "sha256-UMrL4v/7tccNG6XpQn1cit7mGENuxz+W7QU5Iy4si2M="; + # }; + # propagatedBuildInputs = [ PodParser ]; + # meta = { + # description = "Wrap pod paragraphs, leaving verbatim text and code alone"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "podwrap"; + # }; + # }; + + # ProbePerl = buildPerlPackage { + # pname = "Probe-Perl"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KW/KWILLIAMS/Probe-Perl-0.03.tar.gz"; + # hash = "sha256-2eTSHi53Y4VZBF+gkEaxtv/2xAO5SZKdshPjCr6KPDE="; + # }; + # meta = { + # description = "Information about the currently running perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # POSIXAtFork = buildPerlPackage { + # pname = "POSIX-AtFork"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors//id/N/NI/NIKOLAS/POSIX-AtFork-0.04.tar.gz"; + # hash = "sha256-wuIpOobUhxRLyPe6COfEt2sRsOTf3EGAmEXTDvoH5g4="; + # }; + # buildInputs = [ TestSharedFork ]; + # meta = { + # description = "Hook registrations at fork(2)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # POSIXstrftimeCompiler = buildPerlModule { + # pname = "POSIX-strftime-Compiler"; + # version = "0.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/POSIX-strftime-Compiler-0.44.tar.gz"; + # hash = "sha256-39PJc5jc/lHII2uF49woA1Znt2Ux96oKZTXzqlQFs1o="; + # }; + # # We cannot change timezones on the fly. + # prePatch = "rm t/04_tzset.t"; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "GNU C library compatible strftime for loggers and servers"; + # homepage = "https://github.com/kazeburo/POSIX-strftime-Compiler"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.hostPlatform.isMusl; # Broken for Musl at 2023-01-14, reports: + # # Nixpkgs: https://github.com/NixOS/nixpkgs/issues/210749 + # # Upstream: https://github.com/kazeburo/POSIX-strftime-Compiler/issues/8 + # }; + # }; + + # Apprainbarf = buildPerlModule { + # pname = "App-rainbarf"; + # version = "1.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYP/App-rainbarf-1.4.tar.gz"; + # hash = "sha256-TxOa01+q8t4GI9wLsd2J+lpDHlSL/sh97hlM8OJcyX0="; + # }; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/rainbarf + # ''; + # meta = { + # description = "CPU/RAM/battery stats chart bar for tmux (and GNU screen)"; + # homepage = "https://github.com/creaktive/rainbarf"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "rainbarf"; + # }; + # }; + + # Razor2ClientAgent = buildPerlPackage { + # pname = "Razor2-Client-Agent"; + # version = "2.86"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Razor2-Client-Agent-2.86.tar.gz"; + # hash = "sha256-XgYuAuu2XiS3COfu+lMAxD1vZXvyDQj+xMqKCjuUhF8="; + # }; + # propagatedBuildInputs = [ DigestSHA1 URI ]; + # meta = { + # description = "Collaborative, content-based spam filtering network agent"; + # homepage = "https://razor.sourceforge.net/"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + + # Readonly = buildPerlModule { + # pname = "Readonly"; + # version = "2.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SANKO/Readonly-2.05.tar.gz"; + # hash = "sha256-SyNUJJGvAQ1EpcfIYSRHOKzHSrq65riDjTVN+xlGK14="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "Facility for creating read-only scalars, arrays, hashes"; + # homepage = "https://github.com/sanko/readonly"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ReadonlyX = buildPerlModule { + # pname = "ReadonlyX"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SANKO/ReadonlyX-1.04.tar.gz"; + # hash = "sha256-gbuX26k6xrXMvOBKQsNZDrBFV9dQGHc+4Y1aMPz0gYg="; + # }; + # buildInputs = [ ModuleBuildTiny TestFatal ]; + # meta = { + # description = "Faster facility for creating read-only scalars, arrays, hashes"; + # homepage = "https://github.com/sanko/readonly"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # ReadonlyXS = buildPerlPackage { + # pname = "Readonly-XS"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROODE/Readonly-XS-1.05.tar.gz"; + # hash = "sha256-iuXE6FKZ5ci93RsZby7qOPAHCeDcDLYEVNyRFK4//w0="; + # }; + # propagatedBuildInputs = [ Readonly ]; + # meta = { + # description = "Companion module for Readonly.pm, to speed up read-only scalar variables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Redis = buildPerlModule { + # pname = "Redis"; + # version = "2.000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAMS/Redis-2.000.tar.gz"; + # hash = "sha256-FMuJl5chJhW06T+Rbcva+0jQHF6qsgOP5ssXm/lcb+s="; + # }; + # buildInputs = [ IOString ModuleBuildTiny TestDeep TestFatal TestSharedFork TestTCP ]; + # propagatedBuildInputs = [ IOSocketTimeout TryTiny ]; + # meta = { + # description = "Perl binding for Redis database"; + # homepage = "https://github.com/PerlRedis/perl-redis"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # RefUtil = buildPerlPackage { + # pname = "Ref-Util"; + # version = "0.204"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARC/Ref-Util-0.204.tar.gz"; + # hash = "sha256-QV+nPbrPRPPV15wUiIzJlFYnIKtGjm9x+RzR92nxBeE="; + # }; + # meta = { + # description = "Utility functions for checking references"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # RegexpAssemble = buildPerlPackage { + # pname = "Regexp-Assemble"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSAVAGE/Regexp-Assemble-0.38.tgz"; + # hash = "sha256-oGvn+a4bc8m/1bZmKxQcDXBGnpwZu0QTpu5W+Cra5EI="; + # }; + # meta = { + # description = "Assemble multiple Regular Expressions into a single RE"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RegexpCommon = buildPerlPackage { + # pname = "Regexp-Common"; + # version = "2017060201"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABIGAIL/Regexp-Common-2017060201.tar.gz"; + # hash = "sha256-7geFOu4G8xDgQLa/GgGZoY2BiW0yGbmzXJYw0OtpCJs="; + # }; + # meta = { + # description = "Provide commonly requested regular expressions"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # RegexpCommonnetCIDR = buildPerlPackage { + # pname = "Regexp-Common-net-CIDR"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Regexp-Common-net-CIDR-0.03.tar.gz"; + # hash = "sha256-OWBqV6qyDU9EaDAPLsP6KrVX/MnLeIDsfG4H2AFi2jM="; + # }; + # propagatedBuildInputs = [ RegexpCommon ]; + # meta = { + # description = "Provide patterns for CIDR blocks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RegexpCommontime = buildPerlPackage { + # pname = "Regexp-Common-time"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/Regexp-Common-time-0.16.tar.gz"; + # hash = "sha256-HIEHpQq1XHK/ePsRbJGIxM3xYsGGwVhsH5qu5V/xSso="; + # }; + # propagatedBuildInputs = [ RegexpCommon ]; + # meta = { + # description = "Date and time regexps"; + # homepage = "https://github.com/manwar/Regexp-Common-time"; + # license = with lib.licenses; [ artistic2 mit bsd3 ]; + # maintainers = [ maintainers.artturin ]; + # }; + # }; + + # RegexpGrammars = buildPerlModule { + # pname = "Regexp-Grammars"; + # version = "1.058"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCONWAY/Regexp-Grammars-1.058.tar.gz"; + # hash = "sha256-6ojVjiUWdPrjm0n007U0LqzLj8tVhWzTBKoaX/PUHJI="; + # }; + # meta = { + # description = "Add grammatical parsing features to Perl 5.10 regexes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RegexpIPv6 = buildPerlPackage { + # pname = "Regexp-IPv6"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Regexp-IPv6-0.03.tar.gz"; + # hash = "sha256-1ULRfXXOk2Md6LohVtoOC1inVcQJzUoNJ6OHOiZxLOI="; + # }; + # meta = { + # description = "Regular expression for IPv6 addresses"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RegexpParser = buildPerlPackage { + # pname = "Regexp-Parser"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Regexp-Parser-0.23.tar.gz"; + # hash = "sha256-9znauN8rBqrlxI+ZcSUbc3BEZKMtB9jQJfPA+GlUTok="; + # }; + # meta = { + # description = "Base class for parsing regexes"; + # homepage = "https://wiki.github.com/toddr/Regexp-Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RegexpTrie = buildPerlPackage { + # pname = "Regexp-Trie"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANKOGAI/Regexp-Trie-0.02.tar.gz"; + # hash = "sha256-+yv5TtjbwfSpXZ/I9xDLZ7P3lsbvycS7TCz6Prqhxfo="; + # }; + # meta = { + # description = "Builds trie-ized regexp"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RESTClient = buildPerlPackage { + # pname = "REST-Client"; + # version = "281"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AK/AKHUETTEL/REST-Client-281.tar.gz"; + # hash = "sha256-+hDSGgA35oJgHv5mc4p1j/dSEJSqASKek8iIpnmyyPY="; + # }; + # propagatedBuildInputs = [ LWPProtocolHttps ]; + # meta = { + # description = "A simple client for interacting with RESTful http/https resources"; + # homepage = "https://github.com/milescrawford/cpan-rest-client"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RESTUtils = buildPerlModule { + # pname = "REST-Utils"; + # version = "0.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JA/JALDHAR/REST-Utils-0.6.tar.gz"; + # hash = "sha256-1OlK3YetMf71h8RxFceIx88+EiyS85YyWuLmEsZwuf0="; + # }; + # buildInputs = [ TestLongString TestWWWMechanize TestWWWMechanizeCGI ]; + # meta = { + # description = "Utility functions for REST applications"; + # homepage = "https://jaldhar.github.com/REST-Utils"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RpcXML = buildPerlPackage { + # pname = "RPC-XML"; + # version = "0.82"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJRAY/RPC-XML-0.82.tar.gz"; + # hash = "sha256-UnnrDRNsUz/4l/aTTDqtbyBQS5l/smBuUsXbvZJ1jnM="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # doCheck = false; + # meta = { + # description = "Data, client and server classes for XML-RPC"; + # homepage = "https://github.com/rjray/rpc-xml"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "make_method"; + # }; + # }; + + # ReturnValue = buildPerlPackage { + # pname = "Return-Value"; + # version = "1.666005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Return-Value-1.666005.tar.gz"; + # hash = "sha256-jiJgqWUx6TaGIAuciFDr4AXYjONp/2vHD/GnQFt1UKw="; + # }; + # meta = { + # description = "Create context-sensitive return values"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RoleBasic = buildPerlModule { + # pname = "Role-Basic"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/Role-Basic-0.13.tar.gz"; + # hash = "sha256-OKCVnvnxk/925ywyWp6SEbxIaGib0OKwBXePU/i282o="; + # }; + # meta = { + # description = "Just roles. Nothing else"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RoleHasMessage = buildPerlPackage { + # pname = "Role-HasMessage"; + # version = "0.007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Role-HasMessage-0.007.tar.gz"; + # hash = "sha256-XiZ6TXYgs2hIEgTIjqIES4sqWP+LBVd/JxeydUwEFM4="; + # }; + # propagatedBuildInputs = [ MooseXRoleParameterized StringErrf ]; + # meta = { + # description = "A thing with a message method"; + # homepage = "https://github.com/rjbs/Role-HasMessage"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RoleHooks = buildPerlPackage { + # pname = "Role-Hooks"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBYINK/Role-Hooks-0.008.tar.gz"; + # hash = "sha256-KNZuoKjcMGt22oP/CHlJPYCPcxhbz5xO03LzlG+1Q+w="; + # }; + # buildInputs = [ TestRequires ]; + # propagatedBuildInputs = [ ClassMethodModifiers ]; + # meta = { + # homepage = "https://metacpan.org/release/Role-Hooks"; + # description = "Role callbacks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RoleIdentifiable = buildPerlPackage { + # pname = "Role-Identifiable"; + # version = "0.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Role-Identifiable-0.009.tar.gz"; + # hash = "sha256-WnNen3F3+euuBH63uuKbfsKewCCuN2N66lNQ0wwIe3Y="; + # }; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "A thing you can identify somehow"; + # homepage = "https://github.com/rjbs/Role-Identifiable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + RoleTiny = buildPerlPackage { + pname = "Role-Tiny"; + version = "2.002004"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/Role-Tiny-2.002004.tar.gz"; + hash = "sha256-173unhOKT4OqUtCpgWJWRL2of/FmQt+oRdy0TZokK0U="; + }; + meta = { + description = "Roles: a nouvelle cuisine portion size slice of Moose"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # RPCEPCService = buildPerlModule { + # pname = "RPC-EPC-Service"; + # version = "0.0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KI/KIWANAMI/RPC-EPC-Service-v0.0.11.tar.gz"; + # hash = "sha256-l19BNDZSWPtH+pIZGQU1E625EB8r1CD87+NF8gkSi+M="; + # }; + # propagatedBuildInputs = [ AnyEvent DataSExpression ]; + # meta = { + # description = "An Asynchronous Remote Procedure Stack"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RPM2 = buildPerlModule { + # pname = "RPM2"; + # version = "1.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LK/LKUNDRAK/RPM2-1.4.tar.gz"; + # hash = "sha256-XstCqmkyTm9AiKv64HMTkG5aq/L0bxIE8/HeWRVbtjY="; + # }; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.rpm ]; + # doCheck = false; # Tries to open /var/lib/rpm + # meta = { + # description = "Perl bindings for the RPM Package Manager API"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; + # }; + # }; + + # RSSParserLite = buildPerlPackage { + # pname = "RSS-Parser-Lite"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TF/TFPBL/RSS-Parser-Lite-0.12.tar.gz"; + # hash = "sha256-idw0vKixqp/uC8QK7d5eLBYCL8eYssOryH3gczG5lbk="; + # }; + # propagatedBuildInputs = [ locallib ]; + # doCheck = false; /* creates files in HOME */ + # meta = { + # description = "A simple pure perl RSS parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # RTClientREST = buildPerlModule { + # pname = "RT-Client-REST"; + # version = "0.72"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DJ/DJZORT/RT-Client-REST-0.72.tar.gz"; + # hash = "sha256-KPIBWKD3sfNLdM423lvdVimeuUAUBHLISXyVNYIm/bM="; + # }; + # buildInputs = [ CGI HTTPServerSimple TestException ]; + # propagatedBuildInputs = [ DateTimeFormatDateParse Error LWP ParamsValidate ]; + # meta = { + # description = "Client for RT using REST API"; + # homepage = "https://github.com/RT-Client-REST/RT-Client-REST"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SafeIsa = buildPerlPackage { + # pname = "Safe-Isa"; + # version = "1.000010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Safe-Isa-1.000010.tar.gz"; + # hash = "sha256-h/QUiqD/HV5lJyMyLqt9r6OAHJZ9b5GskUejxGe4pmo="; + # }; + # meta = { + # description = "Call isa, can, does and DOES safely on things that may not be objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ScalarListUtils = buildPerlPackage { + # pname = "Scalar-List-Utils"; + # version = "1.63"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Scalar-List-Utils-1.63.tar.gz"; + # hash = "sha256-yvvfIS9oJ9yaDdO1e27lDoYFhtcZgiijMmLVXFWesqk="; + # }; + # meta = { + # description = "Common Scalar and List utility subroutines"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ScalarString = buildPerlModule { + # pname = "Scalar-String"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Scalar-String-0.003.tar.gz"; + # hash = "sha256-9UoXybeHE7AsxDrfrfYLSUZ+djTTExfouenpfCbWi1I="; + # }; + # meta = { + # description = "String aspects of scalars"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ScalarType = buildPerlPackage { + # pname = "Scalar-Type"; + # version = "0.3.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/Scalar-Type-0.3.2.tar.gz"; + # hash = "sha256-WQyv6gz1RZmSoEiFYsDb1vnfdYtfAH8OQ6uhMLRe7oY="; + # }; + # propagatedBuildInputs = [ CaptureTiny TestException ]; + # meta = { + # description = "Figure out what type a scalar is"; + # license = with lib.licenses; [ artistic1 gpl2Only ]; + # }; + # }; + + # SCGI = buildPerlModule { + # pname = "SCGI"; + # version = "0.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VI/VIPERCODE/SCGI-0.6.tar.gz"; + # hash = "sha256-WLeMWvTuReQ38Hro87DZRckf0sAlFW7pFtgRWA+R2aQ="; + # }; + # preConfigure = "export HOME=$(mktemp -d)"; + # meta = { + # description = "This module is for implementing an SCGI interface for an application server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ScopeGuard = buildPerlPackage { + # pname = "Scope-Guard"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHOCOLATE/Scope-Guard-0.21.tar.gz"; + # hash = "sha256-jJsb6lxWRI4sP63GXQW+nkaQo4I6gPOdLxD92Pd30ng="; + # }; + # meta = { + # description = "Lexically-scoped resource management"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ScopeUpper = buildPerlPackage { + # pname = "Scope-Upper"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VP/VPIT/Scope-Upper-0.34.tar.gz"; + # hash = "sha256-WB2LxRDevQxFal/HlSy3E4rmZ78486d+ltdz3DGWpB4="; + # }; + # meta = { + # description = "Act on upper scopes"; + # homepage = "https://search.cpan.org/dist/Scope-Upper"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SDL = buildPerlModule { + # pname = "SDL"; + # version = "2.548"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FROGGS/SDL-2.548.tar.gz"; + # hash = "sha256-JSoZK/qcIHCkiDcH0TnDpF2cRRjM1moeaZtbeVm9T7U="; + # }; + # patches = [ + # # https://github.com/PerlGameDev/SDL/pull/304 + # ./perl-modules/sdl-modern-perl.patch + # ]; + # perlPreHook = "export LD=$CC"; + # preCheck = "rm t/core_audiospec.t"; + # buildInputs = [ pkgs.SDL pkgs.SDL_gfx pkgs.SDL_mixer pkgs.SDL_image pkgs.SDL_ttf pkgs.SDL_Pango pkgs.SDL_net AlienSDL CaptureTiny TestDeep TestDifferences TestException TestMost TestWarn ]; + # propagatedBuildInputs = [ FileShareDir TieSimple ]; + # meta = { + # description = "SDL bindings to Perl"; + # license = with lib.licenses; [ lgpl21Plus ]; + # }; + # }; + + # SearchXapian = buildPerlPackage { + # pname = "Search-Xapian"; + # version = "1.2.25.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OL/OLLY/Search-Xapian-1.2.25.5.tar.gz"; + # hash = "sha256-IE+9xxLWcR/6tmjB9M/AB7Y5qftkrX4ZyyD8EKkQuos="; + # }; + # buildInputs = [ pkgs.xapian DevelLeak ]; + # meta = { + # description = "Perl XS frontend to the Xapian C++ search library"; + # homepage = "https://xapian.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SerealDecoder = buildPerlPackage { + # pname = "Sereal-Decoder"; + # version = "5.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YV/YVES/Sereal-Decoder-5.004.tar.gz"; + # hash = "sha256-aO8DFNh9Gm5guw9m/PQ+ssrN6xdUQy9eJeeE450+Z4Q="; + # }; + # buildInputs = [ TestDeep TestDifferences TestLongString TestWarn ]; + # preBuild = "ls"; + # meta = { + # description = "Fast, compact, powerful binary deserialization"; + # homepage = "https://github.com/Sereal/Sereal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.thoughtpolice ]; + # }; + # }; + + # SerealEncoder = buildPerlPackage { + # pname = "Sereal-Encoder"; + # version = "5.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YV/YVES/Sereal-Encoder-5.004.tar.gz"; + # hash = "sha256-XlqGzNMtrjTtgJMuy+XGjil1K13g6bCnk6t+sspVyxs="; + # }; + # buildInputs = [ SerealDecoder TestDeep TestDifferences TestLongString TestWarn ]; + # meta = { + # description = "Fast, compact, powerful binary serialization"; + # homepage = "https://github.com/Sereal/Sereal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.thoughtpolice ]; + # }; + # }; + + # Sereal = buildPerlPackage { + # pname = "Sereal"; + # version = "5.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YV/YVES/Sereal-5.004.tar.gz"; + # hash = "sha256-nCW7euS9c20ksa0dk9dzlbDGXKh0HiZr/Ay+VCJh128="; + # }; + # buildInputs = [ TestDeep TestLongString TestWarn ]; + # propagatedBuildInputs = [ SerealDecoder SerealEncoder ]; + # meta = { + # description = "Fast, compact, powerful binary (de-)serialization"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.thoughtpolice ]; + # }; + # }; + + # DeviceSerialPort = buildPerlPackage { + # pname = "Device-SerialPort"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/COOK/Device-SerialPort-1.04.tar.gz"; + # hash = "sha256-05JWfLObTqYGwOCsr9jtcjIDEbmVM27OX878+bFQ6dc="; + # }; + # meta = { + # description = "Linux/POSIX emulation of Win32::SerialPort functions."; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "modemtest"; + # }; + # }; + + # ServerStarter = buildPerlModule { + # pname = "Server-Starter"; + # version = "0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/Server-Starter-0.35.tar.gz"; + # hash = "sha256-Z23A1s/0ZIU4Myxjwy+4itCe2GghPqnmLj8Z+tQbnEA="; + # }; + # buildInputs = [ TestRequires TestSharedFork TestTCP ]; + # doCheck = false; # Tests are slow and unstable + # meta = { + # description = "A superdaemon for hot-deploying server programs"; + # homepage = "https://github.com/kazuho/p5-Server-Starter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "start_server"; + # }; + # }; + + # SessionToken = buildPerlPackage { + # pname = "Session-Token"; + # version = "1.503"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FRACTAL/Session-Token-1.503.tar.gz"; + # hash = "sha256-MsPflu9FXHGHA2Os2VDdxPvISMWU9LxVshtEz5efeaE="; + # }; + # patches = [ + # # Add final null-byte to tokens. https://github.com/hoytech/Session-Token/pull/3 + # (fetchpatch { + # url = "https://github.com/hoytech/Session-Token/commit/cd64e7b69986054bb715755290811308159b7959.patch"; + # hash = "sha256-nMQmdvVQW8cQYO0+bLJcdVfSOLVIsongk+71fQ7fQdU="; + # }) + # ]; + # meta = { + # description = "Secure, efficient, simple random session token generation"; + # homepage = "https://github.com/hoytech/Session-Token"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # SetInfinite = buildPerlPackage { + # pname = "Set-Infinite"; + # version = "0.65"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FG/FGLOCK/Set-Infinite-0.65.tar.gz"; + # hash = "sha256-B7yIBzRJLeQLSjqLWjMXYvZOabRikCn9mp01eyW4fh8="; + # }; + # meta = { + # description = "Infinite Sets math"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SetIntSpan = buildPerlPackage { + # pname = "Set-IntSpan"; + # version = "1.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SW/SWMCD/Set-IntSpan-1.19.tar.gz"; + # hash = "sha256-EbdUmxPsXYfMaV3Ux3fNApg91f6YZgEod/tTD0iz39A="; + # }; + + # meta = { + # description = "Manages sets of integers, newsrc style"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SetObject = buildPerlPackage { + # pname = "Set-Object"; + # version = "1.42"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RU/RURBAN/Set-Object-1.42.tar.gz"; + # hash = "sha256-0YxaiiM+q70CBs89pbAPzdezf+vxKpPcw9HAJub97EU="; + # }; + # meta = { + # description = "Unordered collections (sets) of Perl Objects"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # SetScalar = buildPerlPackage { + # pname = "Set-Scalar"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAVIDO/Set-Scalar-1.29.tar.gz"; + # hash = "sha256-o9wVJvPd5y08ZOoAAHuGzmCM3Nk1Z89ubkLcEP3EUR0="; + # }; + # meta = { + # description = "Basic set operations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SmartComments = buildPerlPackage { + # pname = "Smart-Comments"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Smart-Comments-1.06.tar.gz"; + # hash = "sha256-3PijEhNKfGuCkmoBFdk7aSRypmLSjNw6m98omEranuM="; + # }; + # meta = { + # description = "Comments that do more than just sit there"; + # homepage = "https://github.com/neilb/Smart-Comments"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # SGMLSpm = buildPerlModule { + # pname = "SGMLSpm"; + # version = "1.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RA/RAAB/SGMLSpm-1.1.tar.gz"; + # hash = "sha256-VQySRSkcjfIkL36I95IaD2NsfuySxkRBjn2Jz+pwsr0="; + # }; + # meta = { + # description = "Library for parsing the output from SGMLS and NSGMLS parsers"; + # license = with lib.licenses; [ gpl2Plus ]; + # mainProgram = "sgmlspl.pl"; + # }; + # }; + + # SignalMask = buildPerlPackage { + # pname = "Signal-Mask"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Signal-Mask-0.008.tar.gz"; + # hash = "sha256-BD2ZW2sknZ68BMRn2zG7fdwuVfqgjohb2wULHyM2tz8="; + # }; + # propagatedBuildInputs = [ IPCSignal ]; + # meta = { + # description = "Signal masks made easy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SnowballNorwegian = buildPerlModule { + # pname = "Snowball-Norwegian"; + # version = "1.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASKSH/Snowball-Norwegian-1.2.tar.gz"; + # hash = "sha256-Hc+NfyazdSCgENzVGXAU4KWDhe5muDtP3gfqtQrZ5Rg="; + # }; + # meta = { + # description = "Porters stemming algorithm for norwegian"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "stemmer-no.pl"; + # }; + # }; + + # SnowballSwedish = buildPerlModule { + # pname = "Snowball-Swedish"; + # version = "1.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASKSH/Snowball-Swedish-1.2.tar.gz"; + # hash = "sha256-76qSNVhZj06IjZelEtYPvMRIHB+cXn3tUnWWKUVg/Ck="; + # }; + # meta = { + # description = "Porters stemming algorithm for swedish"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "stemmer-se.pl"; + # }; + # }; + + # SOAPLite = buildPerlPackage { + # pname = "SOAP-Lite"; + # version = "1.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/SOAP-Lite-1.27.tar.gz"; + # hash = "sha256-41kQa6saRaFgRKTC+ASfrQNOXe0VF5kLybX42G3d0wE="; + # }; + # propagatedBuildInputs = [ ClassInspector IOSessionData LWPProtocolHttps TaskWeaken XMLParser ]; + # buildInputs = [ TestWarn XMLParserLite ]; + # nativeCheckInputs = [ HTTPDaemon ]; + # meta = { + # description = "Perl's Web Services Toolkit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Socket6 = buildPerlPackage { + # pname = "Socket6"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/U/UM/UMEMOTO/Socket6-0.29.tar.gz"; + # hash = "sha256-RokV+joE3PZXT8lX7/SVkV4kVpQ0lwyR7o5OFFn8kRQ="; + # }; + # setOutputFlags = false; + # buildInputs = [ pkgs.which ]; + # patches = [ ./perl-modules/Socket6-sv_undef.patch ]; + # meta = { + # description = "IPv6 related part of the C socket.h defines and structure manipulators"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # SoftwareLicense = buildPerlPackage { + # pname = "Software-License"; + # version = "0.104004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Software-License-0.104004.tar.gz"; + # hash = "sha256-of2iTsh3UhmAlzgPuTAMFLV0gmJwzFgNr3UONYX8Jww="; + # }; + # buildInputs = [ TryTiny ]; + # propagatedBuildInputs = [ DataSection TextTemplate ]; + # meta = { + # description = "Packages that provide templated software licenses"; + # homepage = "https://github.com/Perl-Toolchain-Gang/Software-License"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SoftwareLicenseCCpack = buildPerlPackage { + # pname = "Software-License-CCpack"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBYRD/Software-License-CCpack-1.11.tar.gz"; + # hash = "sha256-WU9carwhbJXNRYd8Qd7FbSvDDh0DFq04VbCiqo5dU7E="; + # }; + # propagatedBuildInputs = [ SoftwareLicense ]; + # buildInputs = [ TestCheckDeps ]; + # meta = { + # description = "Software::License pack for Creative Commons' licenses"; + # homepage = "https://github.com/SineSwiper/Software-License-CCpack"; + # license = with lib.licenses; [ lgpl3Plus ]; + # }; + # }; + + # SortKey = buildPerlPackage { + # pname = "Sort-Key"; + # version = "1.33"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SALVA/Sort-Key-1.33.tar.gz"; + # hash = "sha256-7WpMz6sJTJzRZPVkAk6YvSHZT0MSzKxNYkbSKzQIGs8="; + # }; + # meta = { + # description = "The fastest way to sort anything in Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SortVersions = buildPerlPackage { + # pname = "Sort-Versions"; + # version = "1.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Sort-Versions-1.62.tar.gz"; + # hash = "sha256-v18zB0BuviWBI38CWYLoyE9vZiXdd05FfAP4mU79Lqo="; + # }; + # meta = { + # description = "A perl 5 module for sorting of revision-like numbers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Specio = buildPerlPackage { + # pname = "Specio"; + # version = "0.48"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Specio-0.48.tar.gz"; + # hash = "sha256-DIV5NYDxJ07wgXMHkTHRAfd7IqzOp6+oJVIC8IEWgrI="; + # }; + # propagatedBuildInputs = [ DevelStackTrace EvalClosure MROCompat ModuleRuntime RoleTiny SubQuote TryTiny ]; + # buildInputs = [ TestFatal TestNeeds ]; + # meta = { + # description = "Type constraints and coercions for Perl"; + # homepage = "https://metacpan.org/release/Specio"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # SpecioLibraryPathTiny = buildPerlPackage { + # pname = "Specio-Library-Path-Tiny"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Specio-Library-Path-Tiny-0.05.tar.gz"; + # hash = "sha256-YN8Lubza6yxmoHi/bfmVTqT5Qz1stoCImULlQsfCelE="; + # }; + # propagatedBuildInputs = [ PathTiny Specio ]; + # buildInputs = [ Filepushd TestFatal ]; + # meta = { + # description = "Path::Tiny types and coercions for Specio"; + # homepage = "https://metacpan.org/release/Specio-Library-Path-Tiny"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # Spiffy = buildPerlPackage { + # pname = "Spiffy"; + # version = "0.46"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Spiffy-0.46.tar.gz"; + # hash = "sha256-j1hiCoQgJVxJtsQ8X/WAK9JeTwkkDFHlvysCKDPUHaM="; + # }; + # meta = { + # description = "Spiffy Perl Interface Framework For You"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SpreadsheetCSV = buildPerlPackage { + # pname = "Spreadsheet-CSV"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DD/DDICK/Spreadsheet-CSV-0.20.tar.gz"; + # hash = "sha256-BwuyUqj+i5OKHOT8kFJfgz1OYZttRnOwrgojQI1RSrY="; + # }; + # nativeBuildInputs = [ CGI ]; + # propagatedBuildInputs = [ ArchiveZip SpreadsheetParseExcel TextCSV_XS XMLParser ]; + # meta = { + # description = "Drop-in replacement for Text::CSV_XS with spreadsheet support"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SpreadsheetParseExcel = buildPerlPackage { + # pname = "Spreadsheet-ParseExcel"; + # version = "0.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMCNAMARA/Spreadsheet-ParseExcel-0.66.tar.gz"; + # hash = "sha256-v9dqz7qYhgHcBRvac7S7JfaDmgBt2WC2p0AcJJJF9ls="; + # }; + # propagatedBuildInputs = [ CryptRC4 DigestPerlMD5 IOStringy OLEStorage_Lite ]; + # meta = { + # description = "Read information from an Excel file"; + # homepage = "https://github.com/runrig/spreadsheet-parseexcel"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SpreadsheetWriteExcel = buildPerlPackage { + # pname = "Spreadsheet-WriteExcel"; + # version = "2.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JM/JMCNAMARA/Spreadsheet-WriteExcel-2.40.tar.gz"; + # hash = "sha256-41aq1oZs8TVzEmjuDpeaGXRDwVoEh46c8+gNAirWwH4="; + # }; + # propagatedBuildInputs = [ OLEStorage_Lite ParseRecDescent ]; + # meta = { + # description = "Write to a cross platform Excel binary file"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "chartex"; + # }; + # }; + + # SpreadsheetXLSX = buildPerlPackage { + # pname = "Spreadsheet-XLSX"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASB/Spreadsheet-XLSX-0.17.tar.gz"; + # hash = "sha256-M7d4knz/FjCQZbdOuMRpawNxZg0szf5FvkYFCSrO6XY="; + # }; + # buildInputs = [ TestNoWarnings TestWarnings ]; + # propagatedBuildInputs = [ ArchiveZip SpreadsheetParseExcel ]; + # meta = { + # homepage = "https://github.com/asb-capfan/Spreadsheet-XLSX"; + # description = "Perl extension for reading MS Excel 2007 files;"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLAbstract = buildPerlPackage { + # pname = "SQL-Abstract"; + # version = "2.000001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/SQL-Abstract-2.000001.tar.gz"; + # hash = "sha256-NaZCZiw0lCDUS+bg732HZep0PrEq0UOZqjojK7lObpo="; + # }; + # buildInputs = [ DataDumperConcise TestDeep TestException TestWarn ]; + # propagatedBuildInputs = [ HashMerge MROCompat Moo ]; + # meta = { + # description = "Generate SQL from Perl data structures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLAbstractClassic = buildPerlPackage { + # pname = "SQL-Abstract-Classic"; + # version = "1.91"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RI/RIBASUSHI/SQL-Abstract-Classic-1.91.tar.gz"; + # hash = "sha256-Tj0d/QlbISMmhYa7BrhpKepXE4jU6UGszL3NoeEI7yg="; + # }; + # buildInputs = [ TestDeep TestException TestWarn ]; + # propagatedBuildInputs = [ SQLAbstract ]; + # meta = { + # description = "Generate SQL from Perl data structures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLAbstractLimit = buildPerlPackage { + # pname = "SQL-Abstract-Limit"; + # version = "0.143"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASB/SQL-Abstract-Limit-0.143.tar.gz"; + # hash = "sha256-0Yr9eIk72DC6JGXArmozQlRgFZADhk3tO1rc9RGJyuk="; + # }; + # propagatedBuildInputs = [ DBI SQLAbstract ]; + # buildInputs = [ TestDeep TestException ]; + # meta = { + # description = "Portable LIMIT emulation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLAbstractPg = buildPerlPackage { + # pname = "SQL-Abstract-Pg"; + # version = "1.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SRI/SQL-Abstract-Pg-1.0.tar.gz"; + # hash = "sha256-Pic2DfN7jYjzxS2smwNJP5vT7v9sjYj5sIbScRVT9Uc="; + # }; + # buildInputs = [ TestDeep ]; + # propagatedBuildInputs = [ SQLAbstract ]; + # meta = { + # description = "PostgreSQL features for SQL::Abstract"; + # homepage = "https://mojolicious.org"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # SQLSplitStatement = buildPerlPackage { + # pname = "SQL-SplitStatement"; + # version = "1.00023"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VE/VEESH/SQL-SplitStatement-1.00023.tar.gz"; + # hash = "sha256-GnSEIM0q00HCUk7xGFt273Fylp8XqeS6tvQ3bw3p814="; + # }; + # buildInputs = [ TestDifferences TestException ]; + # propagatedBuildInputs = [ ClassAccessor ListMoreUtils RegexpCommon ]; + # meta = { + # description = "Split any SQL code into atomic statements"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "sql-split"; + # }; + # }; + + # SQLStatement = buildPerlPackage { + # pname = "SQL-Statement"; + # version = "1.414"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RE/REHSACK/SQL-Statement-1.414.tar.gz"; + # hash = "sha256-3ei9z6ahNu7doGUZug8++uwIXDnbDfnEctwOxs14Gkk="; + # }; + # buildInputs = [ MathBaseConvert TestDeep TextSoundex ]; + # propagatedBuildInputs = [ Clone ModuleRuntime ParamsUtil ]; + # meta = { + # description = "SQL parsing and processing engine"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLTokenizer = buildPerlPackage { + # pname = "SQL-Tokenizer"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IZ/IZUT/SQL-Tokenizer-0.24.tar.gz"; + # hash = "sha256-+qhpvEJlc2QVNqCfU1AuVA1ePjrWp6oaxiXT9pdrQuE="; + # }; + # meta = { + # description = "A simple SQL tokenizer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SQLTranslator = buildPerlPackage { + # pname = "SQL-Translator"; + # version = "1.63"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VE/VEESH/SQL-Translator-1.63.tar.gz"; + # hash = "sha256-WIWwTJNJi+MqGX3JcjlHUdXeYJNBiTqWZW3oikJgMTM="; + # }; + # buildInputs = [ FileShareDirInstall JSONMaybeXS TestDifferences TestException XMLWriter YAML ]; + # propagatedBuildInputs = [ CarpClan DBI FileShareDir Moo PackageVariant ParseRecDescent TryTiny GraphViz GD ]; + + # postPatch = '' + # patchShebangs script + # ''; + + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # postInstall = lib.optionalString stdenv.isDarwin '' + # for file in $out/bin/*; do + # shortenPerlShebang $file + # done + # ''; + + # meta = { + # description = "SQL DDL transformations and more"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "sqlt"; + # }; + # }; + + # PackageVariant = buildPerlPackage { + # pname = "Package-Variant"; + # version = "1.003002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/Package-Variant-1.003002.tar.gz"; + # hash = "sha256-su2EnS9M3WZGdRLao/FDJm1t+BDF+ukXWyUsV7wVNtw="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ ImportInto strictures ]; + # meta = { + # description = "Parameterizable packages"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SortNaturally = buildPerlPackage { + # pname = "Sort-Naturally"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Sort-Naturally-1.03.tar.gz"; + # hash = "sha256-6qscXIdXWngmCJMEqx+P+n8Y5s2LOTdiPpmOhl7B50Y="; + # }; + # meta = { + # description = "Sort lexically, but sort numeral parts numerically"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Starlet = buildPerlPackage { + # pname = "Starlet"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/Starlet-0.31.tar.gz"; + # hash = "sha256-uWA7jmKIDLRYL2p5Oer+xl5u/T2QDyx900Ll9MaNYtg="; + # }; + # buildInputs = [ LWP TestSharedFork TestTCP ]; + # propagatedBuildInputs = [ ParallelPrefork Plack ServerStarter ]; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "A simple, high-performance PSGI/Plack HTTP server"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Starman = buildPerlModule { + # pname = "Starman"; + # version = "0.4017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Starman-0.4017.tar.gz"; + # hash = "sha256-b/q5FfMj9gCJ4+v4Urm5cH1pFyZt+K/XNw+sBL/f7k4="; + # }; + # buildInputs = [ LWP ModuleBuildTiny TestRequires TestTCP ]; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # propagatedBuildInputs = [ DataDump HTTPParserXS NetServer Plack NetServerSSPrefork IOSocketINET6 ]; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/starman + # ''; + + # doCheck = false; # binds to various TCP ports + # meta = { + # description = "High-performance preforking PSGI/Plack web server"; + # homepage = "https://github.com/miyagawa/Starman"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "starman"; + # }; + # }; + + # StatisticsBasic = buildPerlPackage { + # pname = "Statistics-Basic"; + # version = "1.6611"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JETTERO/Statistics-Basic-1.6611.tar.gz"; + # hash = "sha256-aFXOVhX9Phr0z8RRqb9E/ymjFAtOcTADTx8K8lEalPs="; + # }; + # propagatedBuildInputs = [ NumberFormat ]; + # meta = { + # description = "A collection of very basic statistics modules"; + # license = with lib.licenses; [ lgpl2Only ]; + # }; + # }; + + # StatisticsCaseResampling = buildPerlPackage { + # pname = "Statistics-CaseResampling"; + # version = "0.15"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMUELLER/Statistics-CaseResampling-0.15.tar.gz"; + # hash = "sha256-hRxDvW8Q0yKJUipQxqIJw7JGz9PrVmdz5oYe2gSkkIc="; + # }; + # meta = { + # description = "Efficient resampling and calculation of medians with confidence intervals"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StatisticsChiSquare = buildPerlPackage { + # pname = "Statistics-ChiSquare"; + # version = "1.0000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/Statistics-ChiSquare-1.0000.tar.gz"; + # hash = "sha256-JVpaODNtBI3bkHciJpHgAJhOkHquCaTqaVqc/Umh3dA="; + # }; + # meta = { + # description = "Implements the Chi Squared test, using pre-computed tables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StatisticsDescriptive = buildPerlModule { + # pname = "Statistics-Descriptive"; + # version = "3.0801"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Statistics-Descriptive-3.0801.tar.gz"; + # hash = "sha256-BHtwpj/cqpFhaOD/LVjhVeDrvGjtTMvXOnIT3KMCj2U="; + # }; + # propagatedBuildInputs = [ ListMoreUtils ]; + # meta = { + # description = "Module of basic descriptive statistical functions"; + # homepage = "https://metacpan.org/release/Statistics-Descriptive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StatisticsDistributions = buildPerlPackage { + # pname = "Statistics-Distributions"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKEK/Statistics-Distributions-1.02.tar.gz"; + # hash = "sha256-+Z85ar+EyjeqLOoxrUXXOq7kh1LJmRNsS5E4lCjXM8g="; + # }; + # meta = { + # description = "Perl module for calculating critical values and upper probabilities of common statistical distributions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StatisticsTTest = buildPerlPackage { + # pname = "Statistics-TTest"; + # version = "1.1.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YU/YUNFANG/Statistics-TTest-1.1.0.tar.gz"; + # hash = "sha256-stlZ0ljHKEebfYYu4BRuWtjuqYm+JWN8vFdlUv9zcWY="; + # }; + # propagatedBuildInputs = [ StatisticsDescriptive StatisticsDistributions ]; + # meta = { + # description = "Perl module to perform T-test on 2 independent samples Statistics::TTest::Sufficient - Perl module to perfrom T-Test on 2 indepdent samples using sufficient statistics"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StreamBuffered = buildPerlPackage { + # pname = "Stream-Buffered"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DO/DOY/Stream-Buffered-0.03.tar.gz"; + # hash = "sha256-my1DkLXeawz0VY5K0EMXpzxeE90ZrykUnE5Hw3+yQjs="; + # }; + # meta = { + # description = "Temporary buffer to save bytes"; + # homepage = "https://github.com/plack/Stream-Buffered"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # strictures = buildPerlPackage { + # pname = "strictures"; + # version = "2.000006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/strictures-2.000006.tar.gz"; + # hash = "sha256-CdV5dKbRsjgMgChw/tRxEI9RFw2oFFjidRhZ8nFPjVc="; + # }; + # meta = { + # description = "Turn on strict and make most warnings fatal"; + # homepage = "http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/strictures.git"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringApprox = buildPerlPackage { + # pname = "String-Approx"; + # version = "3.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JH/JHI/String-Approx-3.28.tar.gz"; + # hash = "sha256-QyAedi2GmcsKwsB2SlRUvcIwbAdxAU1sj7qCFIBjE0I="; + # }; + # meta = { + # description = "Perl extension for approximate matching (fuzzy matching)"; + # license = with lib.licenses; [ artistic2 gpl2Only ]; + # }; + # }; + + # StringBinaryInterpolation = buildPerlPackage { + # pname = "String-Binary-Interpolation"; + # version = "1.0.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/String-Binary-Interpolation-1.0.0.tar.gz"; + # hash = "sha256-2lXYmCTBrdniqpWP8OpILyaCLkJI7TOo1rT7vXdYivE="; + # }; + # meta = { + # description = "Make it easier to interpolate binary bytes into a string"; + # license = with lib.licenses; [ artistic2 gpl2Only ]; + # }; + # }; + + # StringCamelCase = buildPerlPackage { + # pname = "String-CamelCase"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HI/HIO/String-CamelCase-0.04.tar.gz"; + # hash = "sha256-icPevO7Orodk9F10Aj+Pvu4tiDma9nVB29qgsr8nEak="; + # }; + # meta = { + # description = "Camelcase, de-camelcase"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringCompareConstantTime = buildPerlPackage { + # pname = "String-Compare-ConstantTime"; + # version = "0.321"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FRACTAL/String-Compare-ConstantTime-0.321.tar.gz"; + # hash = "sha256-Cya6KxIdgARCXUSF0dRvWQAcg3Y6omYk3/YiDXc11/c="; + # }; + # meta = { + # description = "Timing side-channel protected string compare"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringCRC32 = buildPerlPackage { + # pname = "String-CRC32"; + # version = "2.100"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEEJO/String-CRC32-2.100.tar.gz"; + # hash = "sha256-lwYJOy0Gi2cV01tMWPUVWON5YAgyAhKfuwClfhmnRxM="; + # }; + # meta = { + # description = "Perl interface for cyclic redundancy check generation"; + # license = with lib.licenses; [ publicDomain ]; + # }; + # }; + + # StringDiff = buildPerlModule { + # pname = "String-Diff"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YA/YAPPO/String-Diff-0.07.tar.gz"; + # hash = "sha256-chW2fLwyJuLQ4Ys47FjJO+C/YJAnhpi++VU0iCbNCvM="; + # }; + # patches = [ + # (fetchpatch { + # url = "https://salsa.debian.org/perl-team/modules/packages/libstring-diff-perl/-/raw/d8120a93f73f4d4aa40d10819b2f0a312608ca9b/debian/patches/0001-Fix-the-test-suite-for-YAML-1.21-compatibility.patch"; + # hash = "sha256-RcYsn0jVa9sSF8iYPuaFTWx00LrF3m7hH9e6fC7j72U="; + # }) + # ]; + # buildInputs = [ TestBase ModuleBuildTiny ModuleInstallGithubMeta ModuleInstallRepository ModuleInstallReadmeFromPod ModuleInstallReadmeMarkdownFromPod YAML ]; + # propagatedBuildInputs = [ AlgorithmDiff ]; + # meta = { + # description = "Simple diff to String"; + # homepage = "https://github.com/yappo/p5-String-Diff"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # StringErrf = buildPerlPackage { + # pname = "String-Errf"; + # version = "0.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/String-Errf-0.009.tar.gz"; + # hash = "sha256-4f7b+bT9ZLZOqBA43bdqTGzYX12xW8IfEGVqKYNJ3B8="; + # }; + # buildInputs = [ JSONMaybeXS TimeDate ]; + # propagatedBuildInputs = [ StringFormatter ]; + # meta = { + # description = "A simple sprintf-like dialect"; + # homepage = "https://github.com/rjbs/String-Errf"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringEscape = buildPerlPackage { + # pname = "String-Escape"; + # version = "2010.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EV/EVO/String-Escape-2010.002.tar.gz"; + # hash = "sha256-/WRfizNiJNIKha5/saOEV26sMp963DkjwyQego47moo="; + # }; + # meta = { + # description = "Backslash escapes, quoted phrase, word elision, etc"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringFlogger = buildPerlPackage { + # pname = "String-Flogger"; + # version = "1.101246"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/String-Flogger-1.101246.tar.gz"; + # hash = "sha256-FfhJHgeBi7PPqfa9Oqv2QwuptOMJ8YEUNYvj2Bv/Og8="; + # }; + # propagatedBuildInputs = [ JSONMaybeXS SubExporter ]; + # meta = { + # description = "String munging for loggers"; + # homepage = "https://github.com/rjbs/String-Flogger"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringFormat = buildPerlPackage { + # pname = "String-Format"; + # version = "1.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SREZIC/String-Format-1.18.tar.gz"; + # hash = "sha256-nkF6j42epiO+6i0TpHwNWmlvyGAsBQm4Js1F+Xt253g="; + # }; + # meta = { + # description = "sprintf-like string formatting capabilities with arbitrary format definitions"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # StringFormatter = buildPerlPackage { + # pname = "String-Formatter"; + # version = "1.235"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/String-Formatter-1.235.tar.gz"; + # hash = "sha256-CCNqkTuRHOZSzwhZjnwH0t8/Np/Ee/QBpIWlBKFmB4M="; + # }; + # propagatedBuildInputs = [ SubExporter ]; + # meta = { + # description = "Build sprintf-like functions of your own"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # StringInterpolate = buildPerlPackage { + # pname = "String-Interpolate"; + # version = "0.33"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/String-Interpolate-0.33.tar.gz"; + # hash = "sha256-qH7Qk4kH0xr32qltc6BjL1xko40d4N6HxLRCWDEpxBM="; + # }; + # meta = { + # # https://metacpan.org/pod/String::Interpolate + # description = "String::Interpolate - Wrapper for builtin the Perl interpolation engine."; + # license = with lib.licenses; [ gpl1Plus ]; + # }; + # propagatedBuildInputs = [ PadWalker SafeHole ]; + # }; + + # StringInterpolateNamed = buildPerlPackage { + # pname = "String-Interpolate-Named"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/String-Interpolate-Named-1.03.tar.gz"; + # hash = "sha256-on13VgcnX2jtkqQT85SsAJLn3hzZPWJHnUf7pwF6Jtw="; + # }; + # meta = { + # description = "Interpolated named arguments in string"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringMkPasswd = buildPerlPackage { + # pname = "String-MkPasswd"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CG/CGRAU/String-MkPasswd-0.05.tar.gz"; + # hash = "sha256-UxD4NGAEVHUHFma1Qj2y8KqC1mhcgC7Hq+bCxBBjm5Y="; + # }; + # meta = { + # description = "Random password generator"; + # homepage = "https://github.com/sirhc/string-mkpasswd"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mkpasswd.pl"; + # }; + # }; + + # StringRandom = buildPerlModule { + # pname = "String-Random"; + # version = "0.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/String-Random-0.32.tar.gz"; + # hash = "sha256-nZPGeaNP+ibTtPoIN8rtHNLmfXZXKBi5HpfepzRwUkY="; + # }; + # meta = { + # description = "Perl module to generate random strings based on a pattern"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringRewritePrefix = buildPerlPackage { + # pname = "String-RewritePrefix"; + # version = "0.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/String-RewritePrefix-0.009.tar.gz"; + # hash = "sha256-RJGL7JalSvjKN8qJfkNnCewoSgeyhRbvPM5GZoaWRtU="; + # }; + # propagatedBuildInputs = [ SubExporter ]; + # meta = { + # description = "Rewrite strings based on a set of known prefixes"; + # homepage = "https://github.com/rjbs/String-RewritePrefix"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringShellQuote = buildPerlPackage { + # pname = "String-ShellQuote"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROSCH/String-ShellQuote-1.04.tar.gz"; + # hash = "sha256-5gY2UDjOINZG0lXIBe/90y+GR18Y1DynVFWwDk2G3TU="; + # }; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Quote strings for passing through the shell"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "shell-quote"; + # }; + # }; + + # StringSimilarity = buildPerlPackage { + # pname = "String-Similarity"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/String-Similarity-1.04.tar.gz"; + # hash = "sha256-H47aIpC7y3Ia7wzhsL/hOwEgHdPaphijN/LwLikcMkU="; + # }; + # doCheck = true; + # meta = { + # description = "Calculate the similarity of two strings"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # ShellCommand = buildPerlPackage { + # pname = "Shell-Command"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FL/FLORA/Shell-Command-0.06.tar.gz"; + # hash = "sha256-8+Te71d5RL5G+nr1rBGKwoKJEXiLAbx2p0SVNVYW7NE="; + # }; + # meta = { + # description = "Cross-platform functions emulating common shell commands"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ShellConfigGenerate = buildPerlPackage { + # pname = "Shell-Config-Generate"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Shell-Config-Generate-0.34.tar.gz"; + # hash = "sha256-hPRR8iIV3WjpwYqj992wOoIAfRZs+toAPQ8Wb1ceBWI="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ ShellGuess ]; + # meta = { + # description = "Portably generate config for any shell"; + # homepage = "https://metacpan.org/pod/Shell::Config::Generate"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ShellGuess = buildPerlPackage { + # pname = "Shell-Guess"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Shell-Guess-0.09.tar.gz"; + # hash = "sha256-QGn6JjfkQxGO2VbXECMdFmgj0jsqZOuHuKRocuhloSs="; + # }; + # meta = { + # description = "Make an educated guess about the shell in use"; + # homepage = "https://metacpan.org/pod/Shell::Guess"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringToIdentifierEN = buildPerlPackage { + # pname = "String-ToIdentifier-EN"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/String-ToIdentifier-EN-0.12.tar.gz"; + # hash = "sha256-OvuEIykwuaxbGto4PI3VkHrk4jrsWrsBb3D56AU83Io="; + # }; + # propagatedBuildInputs = [ LinguaENInflectPhrase TextUnidecode namespaceclean ]; + # meta = { + # description = "Convert Strings to English Program Identifiers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringTruncate = buildPerlPackage { + # pname = "String-Truncate"; + # version = "1.100603"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/String-Truncate-1.100603.tar.gz"; + # hash = "sha256-q0VgLM4t2VFe37sublzeGc3VSY1hojr9jEbB8R+O7GI="; + # }; + # propagatedBuildInputs = [ SubExporter ]; + # meta = { + # description = "A module for when strings are too long to be displayed in..."; + # homepage = "https://github.com/rjbs/String-Truncate"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringTT = buildPerlPackage { + # pname = "String-TT"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/String-TT-0.03.tar.gz"; + # hash = "sha256-92BfCgT5+hI9Ot9PNFeaFMkLfai5O2XS5IkyzNPJUqs="; + # }; + # buildInputs = [ TestException TestSimple13 TestTableDriven ]; + # propagatedBuildInputs = [ PadWalker SubExporter TemplateToolkit ]; + # meta = { + # description = "Use TT to interpolate lexical variables"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # StringUtil = buildPerlModule { + # pname = "String-Util"; + # version = "1.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BA/BAKERSCOT/String-Util-1.34.tar.gz"; + # hash = "sha256-MZzozWZTQeVlIfoVXZYqGTKOkNn3A2dlklzN4mclxGk="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # meta = { + # description = "String processing utility functions"; + # homepage = "https://github.com/scottchiefbaker/String-Util"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # strip-nondeterminism = callPackage ./perl-modules/strip-nondeterminism { }; + + # StructDumb = buildPerlModule { + # pname = "Struct-Dumb"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Struct-Dumb-0.14.tar.gz"; + # hash = "sha256-E8FIU2sQ4oxuC04TLynkym5ptXSQWcRBV6J+hKVFlDY="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Make simple lightweight record-like structures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubExporter = buildPerlPackage { + # pname = "Sub-Exporter"; + # version = "0.990"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Sub-Exporter-0.990.tar.gz"; + # hash = "sha256-vGTsWgaGX5zGdiFcBqlEizoMizl0/7I6JPjirQkFRPw="; + # }; + # propagatedBuildInputs = [ DataOptList ]; + # meta = { + # description = "A sophisticated exporter for custom-built routines"; + # homepage = "https://github.com/rjbs/Sub-Exporter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubExporterForMethods = buildPerlPackage { + # pname = "Sub-Exporter-ForMethods"; + # version = "0.100055"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Sub-Exporter-ForMethods-0.100055.tar.gz"; + # hash = "sha256-eR9CA7p8D32DgLwBvsICFffIvHDX7QPlUu7kRUGr6U4="; + # }; + # buildInputs = [ namespaceautoclean ]; + # propagatedBuildInputs = [ SubExporter SubName ]; + # meta = { + # description = "Helper routines for using Sub::Exporter to build methods"; + # homepage = "https://github.com/rjbs/Sub-Exporter-ForMethods"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubExporterGlobExporter = buildPerlPackage { + # pname = "Sub-Exporter-GlobExporter"; + # version = "0.006"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Sub-Exporter-GlobExporter-0.006.tar.gz"; + # hash = "sha256-3nQ/CAJnAcKmoiKotBxM3CVLGkr+fvmJh806ukzlJpY="; + # }; + # propagatedBuildInputs = [ SubExporter ]; + # meta = { + # description = "Export shared globs with Sub::Exporter collectors"; + # homepage = "https://github.com/rjbs/Sub-Exporter-GlobExporter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubExporterProgressive = buildPerlPackage { + # pname = "Sub-Exporter-Progressive"; + # version = "0.001013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/Sub-Exporter-Progressive-0.001013.tar.gz"; + # hash = "sha256-1TW3lU1k2hrBMFsfrfmCAnaeNZk3aFSyztkMOCvqwFY="; + # }; + # meta = { + # description = "Only use Sub::Exporter if you need it"; + # homepage = "https://github.com/frioux/Sub-Exporter-Progressive"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubHandlesVia = buildPerlPackage { + # pname = "Sub-HandlesVia"; + # version = "0.050000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBYINK/Sub-HandlesVia-0.050000.tar.gz"; + # hash = "sha256-Lfk0k+L56VvleblQtuGf9ST5TIBhOq3AOohhHf91eU8="; + # }; + # propagatedBuildInputs = [ ClassMethodModifiers RoleHooks RoleTiny TypeTiny ]; + # buildInputs = [ TestFatal TestRequires TryTiny ]; + # meta = { + # description = "Alternative handles_via implementation"; + # homepage = "https://metacpan.org/release/Sub-HandlesVia"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubIdentify = buildPerlPackage { + # pname = "Sub-Identify"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RG/RGARCIA/Sub-Identify-0.14.tar.gz"; + # hash = "sha256-Bo0nIIZRTdHoQrakCxvtuv7mOQDlsIiQ72cAA53vrW8="; + # }; + # meta = { + # description = "Retrieve names of code references"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubInfo = buildPerlPackage { + # pname = "Sub-Info"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Sub-Info-0.002.tar.gz"; + # hash = "sha256-6jBW1pa97/IamdNA1VcIh9OajMR7/yOt/ILfZ1jN0Oo="; + # }; + # propagatedBuildInputs = [ Importer ]; + # meta = { + # description = "Tool for inspecting subroutines"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubInstall = buildPerlPackage { + # pname = "Sub-Install"; + # version = "0.929"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Sub-Install-0.929.tar.gz"; + # hash = "sha256-gLHigdjNOysx2scR9cihZXqHzYC75przkkvL605dsHc="; + # }; + # meta = { + # description = "Install subroutines into packages easily"; + # homepage = "https://github.com/rjbs/Sub-Install"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubName = buildPerlPackage { + # pname = "Sub-Name"; + # version = "0.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Sub-Name-0.27.tar.gz"; + # hash = "sha256-7PNvuhxHypPh2qOUlo7TnEGGhnRZ2c0XPEIeK5cgQ+g="; + # }; + # buildInputs = [ BC DevelCheckBin ]; + # meta = { + # description = "(Re)name a sub"; + # homepage = "https://github.com/p5sagit/Sub-Name"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SubOverride = buildPerlPackage { + # pname = "Sub-Override"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/Sub-Override-0.09.tar.gz"; + # hash = "sha256-k5pnwfcplo4MyBt0lY23UOG9t8AgvuGiYzMvQiwuJbU="; + # }; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Perl extension for easily overriding subroutines"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + SubQuote = buildPerlPackage { + pname = "Sub-Quote"; + version = "2.006008"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/Sub-Quote-2.006008.tar.gz"; + hash = "sha256-lL69UAr1V2LoPqLyvFlNh6+CgHI3DHEQxgwjioANFbI="; + }; + buildInputs = [ TestFatal ]; + meta = { + description = "Efficient generation of subroutines via string eval"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # SubStrictDecl = buildPerlModule { + # pname = "Sub-StrictDecl"; + # version = "0.005"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZE/ZEFRAM/Sub-StrictDecl-0.005.tar.gz"; + # hash = "sha256-oSfa52RcGpVwzZopcMbcST1SL/BzGKNKOeQJCY9pESU="; + # }; + # propagatedBuildInputs = [ LexicalSealRequireHints ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Detect undeclared subroutines in compilation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + SubUplevel = buildPerlPackage { + pname = "Sub-Uplevel"; + version = "0.2800"; + src = fetchurl { + url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Sub-Uplevel-0.2800.tar.gz"; + hash = "sha256-tPP2O4D2gKQhMy2IUd2+Wo5y/Kp01dHZjzyMxKPs4pM="; + }; + meta = { + description = "Apparently run a function in a higher stack frame"; + homepage = "https://github.com/Perl-Toolchain-Gang/Sub-Uplevel"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # SVNSimple = buildPerlPackage { + # pname = "SVN-Simple"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CL/CLKAO/SVN-Simple-0.28.tar.gz"; + # hash = "sha256-1jzBaeQ2m+mKU5q+nMFhG/zCs2lmplF+Z2aI/tGIT/s="; + # }; + # propagatedBuildInputs = [ (pkgs.subversionClient.override { inherit perl; }) ]; + # meta = { + # description = "A simple interface to subversion's editor interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SafeHole = buildPerlModule { + # pname = "Safe-Hole"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Safe-Hole-0.14.tar.gz"; + # hash = "sha256-9PVui70GxP5K4G2xIYbeyt+6wep3XqGMbAKJSB0V7AU="; + # }; + # meta = { + # description = "Lib/Safe/Hole.pm"; + # homepage = "https://github.com/toddr/Safe-Hole"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; + # }; + # }; + + # Swim = buildPerlPackage { + # pname = "Swim"; + # version = "0.1.48"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Swim-0.1.48.tar.gz"; + # hash = "sha256-pfcv0vIpF/orSsuy7iw9MpA9l+5bDkSbDzhwGMd/Tww="; + # }; + # propagatedBuildInputs = [ HTMLEscape HashMerge IPCRun Pegex TextAutoformat YAMLLibYAML ]; + # meta = { + # description = "See What I Mean?!"; + # homepage = "https://github.com/ingydotnet/swim-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "swin"; + # }; + # }; + + # Switch = buildPerlPackage { + # pname = "Switch"; + # version = "2.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Switch-2.17.tar.gz"; + # hash = "sha256-MTVJdRQP5iNawTChCUlkka0z3UL5xiGJ4j9J91+TbXU="; + # }; + # doCheck = false; # FIXME: 2/293 test failures + # meta = { + # description = "A switch statement for Perl, do not use if you can use given/when"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SymbolGet = buildPerlPackage { + # pname = "Symbol-Get"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FELIPE/Symbol-Get-0.10.tar.gz"; + # hash = "sha256-DuVWjFrjVzyodOCeTQUkRmz8Gtmiwk0LyR1MewbyHZw="; + # }; + # buildInputs = [ TestDeep TestException ]; + # propagatedBuildInputs = [ CallContext ]; + # meta = { + # description = "Read Perl's symbol table programmatically"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # SymbolGlobalName = buildPerlPackage { + # pname = "Symbol-Global-Name"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXMV/Symbol-Global-Name-0.05.tar.gz"; + # hash = "sha256-D3Yj6dckdgqmQEAiLaHYLxGIWGeRMpJhzGDa0dYNapI="; + # }; + # meta = { + # description = "Finds name and type of a global variable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SymbolUtil = buildPerlModule { + # pname = "Symbol-Util"; + # version = "0.0203"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Symbol-Util-0.0203.tar.gz"; + # hash = "sha256-VbZh3SL5zpub5afgo/UomsAM0lTCHj2GAyiaVlrm3DI="; + # }; + # meta = { + # description = "Additional utils for Perl symbols manipulation"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # syntax = buildPerlPackage { + # pname = "syntax"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHAYLON/syntax-0.004.tar.gz"; + # hash = "sha256-/hm22oqPQ6WqLuVxRBvA4zn7FW0AgcFXoaJOmBLH02U="; + # }; + # propagatedBuildInputs = [ DataOptList namespaceclean ]; + # meta = { + # description = "Activate syntax extensions"; + # homepage = "https://github.com/phaylon/syntax/wiki"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SyntaxKeywordJunction = buildPerlPackage { + # pname = "Syntax-Keyword-Junction"; + # version = "0.003008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FR/FREW/Syntax-Keyword-Junction-0.003008.tar.gz"; + # hash = "sha256-i0l18hsZkqfmwt9dzJKyVMYZJVle3c368LFJhxeqle8="; + # }; + # buildInputs = [ TestRequires ]; + # propagatedBuildInputs = [ syntax ]; + # meta = { + # description = "Perl6 style Junction operators in Perl5"; + # homepage = "https://github.com/frioux/Syntax-Keyword-Junction"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SyntaxKeywordTry = buildPerlModule { + # pname = "Syntax-Keyword-Try"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Syntax-Keyword-Try-0.29.tar.gz"; + # hash = "sha256-zDIHGdNgjaqVFHQ6Q9rCvpnLjM2Ymx/vooUpDLHVnY8="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ XSParseKeyword ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "A try/catch/finally syntax for perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # SysMmap = buildPerlPackage { + # pname = "Sys-Mmap"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Sys-Mmap-0.20.tar.gz"; + # hash = "sha256-GCDOLInxq3NXZE+NsPSfFC9UUmJQ+x4jXbEKqA8V4s8="; + # }; + # meta = { + # description = "Use mmap to map in a file as a Perl variable"; + # maintainers = with maintainers; [ peterhoeg ]; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # SysMemInfo = buildPerlPackage { + # pname = "Sys-MemInfo"; + # version = "0.99"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SC/SCRESTO/Sys-MemInfo-0.99.tar.gz"; + # hash = "sha256-B4YxnTo6i65dcnk5JEvxfhQLcU9Sc01en2JyA+TPPjs="; + # }; + # meta = { + # description = "Memory information"; + # license = with lib.licenses; [ gpl2Plus ]; + # maintainers = [ maintainers.pSub ]; + # }; + # }; + + # SysCPU = buildPerlPackage { + # pname = "Sys-CPU"; + # version = "0.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MZ/MZSANFORD/Sys-CPU-0.61.tar.gz"; + # hash = "sha256-JQqGt5wjEAHErnHS9mQoCSpPuyBwlxrK/UcapJc5yeQ="; + # }; + # patches = [ + # # Bug #95400 for Sys-CPU: Tests fail on ARM and AArch64 Linux + # # https://rt.cpan.org/Public/Bug/Display.html?id=95400 + # (fetchpatch { + # url = "https://rt.cpan.org/Ticket/Attachment/1359669/721669/0001-Add-support-for-cpu_type-on-ARM-and-AArch64-Linux-pl.patch"; + # hash = "sha256-oIJQX+Fz/CPmJNPuJyHVpJxJB2K5IQibnvaT4dv/qmY="; + # }) + # (fetchpatch { + # url = "https://rt.cpan.org/Ticket/Attachment/1388036/737125/0002-cpu_clock-can-be-undefined-on-an-ARM.patch"; + # hash = "sha256-nCypGyi6bZDEXqdb7wlGGzk9cFzmYkWGP1slBpXDfHw="; + # }) + # ]; + # buildInputs = lib.optional stdenv.isDarwin pkgs.darwin.apple_sdk.frameworks.Carbon; + # doCheck = !stdenv.isAarch64; + # meta = { + # description = "Perl extension for getting CPU information. Currently only number of CPU's supported."; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SysCpuAffinity = buildPerlModule { + # pname = "Sys-CpuAffinity"; + # version = "1.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MOB/Sys-CpuAffinity-1.12.tar.gz"; + # hash = "sha256-/jLAXz6wWXCMZH8ruFslBFhZHyupBR2Nhm9Uajh+6Eg="; + # }; + # doCheck = false; # Would run checks for all supported systems + # meta = { + # description = "Set CPU affinity for processes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # SysHostnameLong = buildPerlPackage { + # pname = "Sys-Hostname-Long"; + # version = "1.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SC/SCOTT/Sys-Hostname-Long-1.5.tar.gz"; + # hash = "sha256-6Rht83Bqh379YUnyxxHWz4fdbPcvark1uoEhsiWyZcs="; + # }; + # doCheck = false; # no `hostname' in stdenv + # meta = { + # description = "Try every conceivable way to get full hostname"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SysSigAction = buildPerlPackage { + # pname = "Sys-SigAction"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LB/LBAXTER/Sys-SigAction-0.23.tar.gz"; + # hash = "sha256-xO9sk0VTQDH8u+Ktw0f8cZTUevyUXnpE+sfpVjCV01M="; + # }; + # doCheck = !stdenv.isAarch64; # it hangs on Aarch64 + # meta = { + # description = "Perl extension for Consistent Signal Handling"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SysSyslog = buildPerlPackage { + # pname = "Sys-Syslog"; + # version = "0.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAPER/Sys-Syslog-0.36.tar.gz"; + # hash = "sha256-7UKp5boErUhWzAy1040onDxdN2RUPsBO+vxK9+M3jfg="; + # }; + # meta = { + # description = "Perl interface to the UNIX syslog(3) calls"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SystemCommand = buildPerlPackage { + # pname = "System-Command"; + # version = "1.122"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/System-Command-1.122.tar.gz"; + # hash = "sha256-2bgjsmYZqmn3oGFmUKeBDolajfBi3p0iQNZdvlz+dHo="; + # }; + # propagatedBuildInputs = [ IPCRun ]; + # buildInputs = [ PodCoverageTrustPod TestCPANMeta TestPod TestPodCoverage ]; + # meta = { + # description = "Object for running system commands"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SysVirt = buildPerlModule rec { + # pname = "Sys-Virt"; + # version = "10.0.0"; + # src = fetchFromGitLab { + # owner = "libvirt"; + # repo = "libvirt-perl"; + # rev = "v${version}"; + # hash = "sha256-FK2SaerA/GB0ZAg/QXG9Ig1Cvpg6v9lh1sKPjYU52M8="; + # }; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.libvirt CPANChanges TestPod TestPodCoverage XMLXPath ]; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Libvirt Perl API"; + # homepage = "https://libvirt.org"; + # license = with lib.licenses; [ gpl2Plus artistic1 ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.SysVirt.x86_64-darwin + # }; + # }; + + # TAPParserSourceHandlerpgTAP = buildPerlModule { + # pname = "TAP-Parser-SourceHandler-pgTAP"; + # version = "3.36"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DW/DWHEELER/TAP-Parser-SourceHandler-pgTAP-3.36.tar.gz"; + # hash = "sha256-B75RUy4GPqxu2OWBUFRw7ryB1VBkQa8tzzK8Dr7pjGc="; + # }; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Stream TAP from pgTAP test scripts"; + # homepage = "https://search.cpan.org/dist/Tap-Parser-Sourcehandler-pgTAP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TaskCatalystTutorial = buildPerlPackage { + # pname = "Task-Catalyst-Tutorial"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/Task-Catalyst-Tutorial-0.06.tar.gz"; + # hash = "sha256-dbGy2WFVZHhCWHFGzv0N4wlDuFGV6OPspR4PC4ZC1h4="; + # }; + # propagatedBuildInputs = [ CatalystAuthenticationStoreDBIxClass CatalystControllerHTMLFormFu CatalystDevel CatalystManual CatalystPluginAuthorizationACL CatalystPluginAuthorizationRoles CatalystPluginSessionStateCookie CatalystPluginSessionStoreFastMmap CatalystPluginStackTrace CatalystViewTT ]; + # doCheck = false; /* fails with 'open3: exec of .. perl .. failed: Argument list too long at .../TAP/Parser/Iterator/Process.pm line 165.' */ + # meta = { + # description = "Everything you need to follow the Catalyst Tutorial"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TaskFreecellSolverTesting = buildPerlModule { + # pname = "Task-FreecellSolver-Testing"; + # version = "0.0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Task-FreecellSolver-Testing-0.0.12.tar.gz"; + # hash = "sha256-PRkQt64SVBfG4HeUeOtK8/yc+J4iGVhfiiBBFGP5k6c="; + # }; + # buildInputs = [ CodeTidyAll TestDataSplit TestDifferences TestPerlTidy TestRunPluginTrimDisplayedFilenames TestRunValgrind TestTrailingSpace TestTrap ]; + # propagatedBuildInputs = [ EnvPath FileWhich GamesSolitaireVerify InlineC ListMoreUtils MooX StringShellQuote TaskTestRunAllPlugins TemplateToolkit YAMLLibYAML ]; + # meta = { + # description = "Install the CPAN dependencies of the Freecell Solver test suite"; + # homepage = "https://metacpan.org/release/Task-FreecellSolver-Testing"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TaskPlack = buildPerlModule { + # pname = "Task-Plack"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Task-Plack-0.28.tar.gz"; + # hash = "sha256-edUriAZUjz+Vro1qyRW6Q524SJ/mOxOdCsFym7KfXCo="; + # }; + # propagatedBuildInputs = [ CGICompile CGIEmulatePSGI CGIPSGI Corona FCGI FCGIClient FCGIProcManager HTTPServerSimplePSGI IOHandleUtil NetFastCGI PSGI PlackAppProxy PlackMiddlewareAuthDigest PlackMiddlewareConsoleLogger PlackMiddlewareDebug PlackMiddlewareDeflater PlackMiddlewareHeader PlackMiddlewareReverseProxy PlackMiddlewareSession Starlet Starman Twiggy ]; + # buildInputs = [ ModuleBuildTiny TestSharedFork ]; + # meta = { + # description = "Plack bundle"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TaskTestRunAllPlugins = buildPerlModule { + # pname = "Task-Test-Run-AllPlugins"; + # version = "0.0106"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Task-Test-Run-AllPlugins-0.0106.tar.gz"; + # hash = "sha256-G40L8IhYBmWbwpiBDw1VCq/2gEWtwjepSaymshp9zng="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestRunPluginAlternateInterpreters TestRunPluginBreakOnFailure TestRunPluginColorFileVerdicts TestRunPluginColorSummary TestRunPluginTrimDisplayedFilenames ]; + # meta = { + # description = "Specifications for installing all the Test::Run"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TaskWeaken = buildPerlPackage { + # pname = "Task-Weaken"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Task-Weaken-1.06.tar.gz"; + # hash = "sha256-I4P+252672RkaOqCSvv3yAEHZyDPug3yp6B0cm3NZr4="; + # }; + # meta = { + # description = "Ensure that a platform has weaken support"; + # homepage = "https://github.com/karenetheridge/Task-Weaken"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Tcl = buildPerlPackage { + # pname = "Tcl"; + # version = "1.27"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VK/VKON/Tcl-1.27.tar.gz"; + # hash = "sha256-+DhYd6Sp7Z89OQPS0PfNcPrDzmgyxg9gCmghzuP7WHI="; + # }; + # propagatedBuildInputs = [ + # pkgs.bwidget + # pkgs.tcl + # pkgs.tix + # pkgs.tk + # ] ++ lib.optionals stdenv.isDarwin [ + # darwin.apple_sdk.frameworks.CoreServices ]; + # makeMakerFlags = lib.optionals stdenv.isLinux + # [ "--tclsh=${pkgs.tcl}/bin/tclsh" "--nousestubs" ]; + # meta = { + # description = "Tcl extension module for Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TclpTk = buildPerlPackage { + # pname = "Tcl-pTk"; + # version = "1.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CAC/Tcl-pTk-1.11.tar.gz"; + # hash = "sha256-05PxKxzN7I8ZbN27WJHZSEx5qpQQWmN22f+cRg2CDN0="; + # }; + # propagatedBuildInputs = [ + # ClassISA + # SubName + # Tcl + # TestDeep + # ]; + # buildPhase = '' + # perl Makefile.PL --tclsh "${pkgs.tk.tcl}/bin/tclsh" INSTALL_BASE=$out --no-test-for-tk + # ''; + # postInstall = '' + # mkdir -p $out/lib/perl5/site_perl + # mv $out/lib/perl5/Tcl $out/lib/perl5/site_perl/ + # mv $out/lib/perl5/auto $out/lib/perl5/site_perl/ + # '' + lib.optionalString stdenv.isDarwin '' + # mv $out/lib/perl5/darwin-thread-multi-2level $out/lib/perl5/site_perl/ + # ''; + # meta = { + # description = "Interface to Tcl/Tk with Perl/Tk compatible syntax"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplatePluginAutoformat = buildPerlPackage { + # pname = "Template-Plugin-Autoformat"; + # version = "2.77"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KARMAN/Template-Plugin-Autoformat-2.77.tar.gz"; + # hash = "sha256-vd+0kZ8Kuyor56lmUzPg1OCYAy8OOD268ExNiWx0hu0="; + # }; + # propagatedBuildInputs = [ TemplateToolkit TextAutoformat ]; + # meta = { + # description = "TT plugin for Text::Autoformat"; + # homepage = "https://github.com/karpet/template-plugin-autoformat"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplatePluginClass = buildPerlPackage { + # pname = "Template-Plugin-Class"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Template-Plugin-Class-0.14.tar.gz"; + # hash = "sha256-BgT+iue/OtlnnmTZsa1MnpAUwXeqgOg11SqG942XB8M="; + # }; + # propagatedBuildInputs = [ TemplateToolkit ]; + # meta = { + # description = "Allow calling of class methods on arbitrary classes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplatePluginIOAll = buildPerlPackage { + # pname = "Template-Plugin-IO-All"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XE/XERN/Template-Plugin-IO-All-0.01.tar.gz"; + # hash = "sha256-H3RFQiohky4Ju++TV2bgr2t8zrCI6djgMM16hLzcXuQ="; + # }; + # propagatedBuildInputs = [ IOAll TemplateToolkit ]; + # meta = { + # description = "Perl Template Toolkit Plugin for IO::All"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ eelco ]; + # }; + # }; + + # TemplatePluginJavaScript = buildPerlPackage { + # pname = "Template-Plugin-JavaScript"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Template-Plugin-JavaScript-0.02.tar.gz"; + # hash = "sha256-6iDYBq1lIoLQNTSY4oYN+BJcgLZJFjDCXSY72IDGGNc="; + # }; + # propagatedBuildInputs = [ TemplateToolkit ]; + # meta = { + # description = "Encodes text to be safe in JavaScript"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplatePluginJSONEscape = buildPerlPackage { + # pname = "Template-Plugin-JSON-Escape"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NA/NANTO/Template-Plugin-JSON-Escape-0.02.tar.gz"; + # hash = "sha256-BRqLHTvGAdWPxR4kYGfTZFDP6XAnigRW6KthlA8TzYY="; + # }; + # propagatedBuildInputs = [ JSON TemplateToolkit ]; + # meta = { + # description = "Adds a .json vmethod and a json filter"; + # license = with lib.licenses; [ bsd0 ]; + # }; + # }; + + # TemplateTimer = buildPerlPackage { + # pname = "Template-Timer"; + # version = "1.00"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/Template-Timer-1.00.tar.gz"; + # hash = "sha256-tzFMs2UgnZNVe4BU4DEa6MPLXRydIo0es+P8GTpbd7Q="; + # }; + # propagatedBuildInputs = [ TemplateToolkit ]; + # meta = { + # description = "Rudimentary profiling for Template Toolkit"; + # license = with lib.licenses; [ artistic2 gpl3Only ]; + # }; + # }; + + # TemplateTiny = buildPerlPackage { + # pname = "Template-Tiny"; + # version = "1.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Template-Tiny-1.14.tar.gz"; + # hash = "sha256-gZz6tgREg8/ijOsof938MXaiAlsbbw6YCy3MJtImm0w="; + # }; + # meta = { + # description = "Template Toolkit reimplemented in as little code as possible"; + # homepage = "https://github.com/karenetheridge/Template-Tiny"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplateToolkit = buildPerlPackage { + # pname = "Template-Toolkit"; + # version = "3.101"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABW/Template-Toolkit-3.101.tar.gz"; + # hash = "sha256-0qMt1sIeSzfGqT34CHyp6IDPrmE6Pl766jB7C9yu21g="; + # }; + # doCheck = !stdenv.isDarwin; + # propagatedBuildInputs = [ AppConfig ]; + # buildInputs = [ CGI TestLeakTrace ]; + # meta = { + # description = "Comprehensive template processing system"; + # homepage = "http://www.template-toolkit.org"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TemplateGD = buildPerlPackage { + # pname = "Template-GD"; + # version = "2.66"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABW/Template-GD-2.66.tar.gz"; + # hash = "sha256-mFI8gZLy6BhAQuWi4XK9dnrCid0uSA819oDc4yFgkFs="; + # }; + # propagatedBuildInputs = [ GD TemplateToolkit ]; + # meta = { + # description = "GD plugin(s) for the Template Toolkit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermEncoding = buildPerlPackage { + # pname = "Term-Encoding"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Term-Encoding-0.03.tar.gz"; + # hash = "sha256-lbqWh9c10lo8vmRQjXiU8AnH+ioXJsPnhuniHaIlHQs="; + # }; + # meta = { + # description = "Detect encoding of the current terminal"; + # homepage = "https://github.com/miyagawa/Term-Encoding"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermProgressBar = buildPerlPackage { + # pname = "Term-ProgressBar"; + # version = "2.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/Term-ProgressBar-2.23.tar.gz"; + # hash = "sha256-3vwD+59KwcnfE1nTEr/zwIZd3vvzq6ZM1CppqGIV1J0="; + # }; + # buildInputs = [ CaptureTiny TestException TestWarnings ]; + # propagatedBuildInputs = [ ClassMethodMaker TermReadKey ]; + # meta = { + # description = "Provide a progress meter on a standard terminal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermProgressBarQuiet = buildPerlPackage { + # pname = "Term-ProgressBar-Quiet"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LB/LBROCARD/Term-ProgressBar-Quiet-0.31.tar.gz"; + # hash = "sha256-JWdSkvWIvCnTLnEM82Z9qaKhdR4TmAF3Cp/bGM0hhKY="; + # }; + # propagatedBuildInputs = [ IOInteractive TermProgressBar ]; + # buildInputs = [ TestMockObject ]; + # meta = { + # description = "Provide a progress meter if run interactively"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermProgressBarSimple = buildPerlPackage { + # pname = "Term-ProgressBar-Simple"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EV/EVDB/Term-ProgressBar-Simple-0.03.tar.gz"; + # hash = "sha256-og2zxn1b39DB+rOSxtHCaICn7oQ69gKvT5tTpwQ1eaY="; + # }; + # propagatedBuildInputs = [ TermProgressBarQuiet ]; + # buildInputs = [ TestMockObject ]; + # meta = { + # description = "Simpler progress bars"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TermReadKey = let + cross = stdenv.hostPlatform != stdenv.buildPlatform; + in buildPerlPackage { + pname = "TermReadKey"; + version = "2.38"; + src = fetchurl { + url = "mirror://cpan/authors/id/J/JS/JSTOWE/TermReadKey-2.38.tar.gz"; + hash = "sha256-WmRYeNxXCsM2YVgfuwkP8k684X1D6lP9IuEFqFakcpA="; + }; + + # use native libraries from the host when running build commands + postConfigure = lib.optionalString cross (let + host_perl = perl.perlOnBuild; + host_self = perl.perlOnBuild.pkgs.TermReadKey; + perl_lib = "${host_perl}/lib/perl5/${host_perl.version}"; + self_lib = "${host_self}/lib/perl5/site_perl/${host_perl.version}"; + in '' + sed -ie 's|"-I$(INST_ARCHLIB)"|"-I${perl_lib}" "-I${self_lib}"|g' Makefile + ''); + + # TermReadKey uses itself in the build process + nativeBuildInputs = lib.optionals cross [ + perl.perlOnBuild.pkgs.TermReadKey + ]; + meta = { + description = "A perl module for simple terminal control"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TermReadLineGnu = buildPerlPackage { + # pname = "Term-ReadLine-Gnu"; + # version = "1.46"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAYASHI/Term-ReadLine-Gnu-1.46.tar.gz"; + # hash = "sha256-sTgyEy5QNmw0/qwSzoKDfAqds0ylMK5dJ9uXz5yWTHs="; + # }; + # buildInputs = [ pkgs.readline pkgs.ncurses ]; + # NIX_CFLAGS_LINK = "-lreadline -lncursesw"; + + # # For some crazy reason Makefile.PL doesn't generate a Makefile if + # # AUTOMATED_TESTING is set. + # env.AUTOMATED_TESTING = false; + + # # Makefile.PL looks for ncurses in Glibc's prefix. + # preConfigure = + # '' + # substituteInPlace Makefile.PL --replace '$Config{libpth}' \ + # "'${pkgs.ncurses.out}/lib'" + # ''; + + # # Tests don't work because they require /dev/tty. + # doCheck = false; + + # meta = { + # description = "Perl extension for the GNU Readline/History Library"; + # homepage = "https://github.com/hirooih/perl-trg"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "perlsh"; + # }; + # }; + + # TermReadLineTTYtter = buildPerlPackage { + # pname = "Term-ReadLine-TTYtter"; + # version = "1.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CK/CKAISER/Term-ReadLine-TTYtter-1.4.tar.gz"; + # hash = "sha256-rDcxM87hshIqgnP+e0JEYT0O7O/oi2aL2Y/nHR7ErJM="; + # }; + + # outputs = [ "out" ]; + + # meta = { + # description = "A Term::ReadLine driver based on Term::ReadLine::Perl, with special features for microblogging and the TTYtter client (q.v)"; + # homepage = "https://www.floodgap.com/software/ttytter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermReadPassword = buildPerlPackage rec { + # pname = "Term-ReadPassword"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHOENIX/${pname}-${version}.tar.gz"; + # hash = "sha256-4ahmNFs1+f/vfQA34T1tTLKAMQCJ+YwgcTiAvHD7QyM="; + # }; + + # outputs = [ "out" ]; + + # meta = { + # description = "This module lets you ask the user for a password in the traditional way, from the keyboard, without echoing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermShell = buildPerlModule { + # pname = "Term-Shell"; + # version = "0.13"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Term-Shell-0.13.tar.gz"; + # hash = "sha256-U6C9smVokcUIpHDZPLfhz+qzjuqeWClWCn2LX2APa/I="; + # }; + # propagatedBuildInputs = [ TermReadKey TextAutoformat ]; + # meta = { + # homepage = "https://metacpan.org/release/Term-Shell"; + # description = "A simple command-line shell framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermShellUI = buildPerlPackage { + # pname = "Term-ShellUI"; + # version = "0.92"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BR/BRONSON/Term-ShellUI-0.92.tar.gz"; + # hash = "sha256-MnnAHHYiczXu/wkDKkD0sCsoUVGzV2wEys0VvgWUK9s="; + # }; + # meta = { + # description = "A fully-featured shell-like command line environment"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TermSizeAny = buildPerlPackage { + # pname = "Term-Size-Any"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FERREIRA/Term-Size-Any-0.002.tar.gz"; + # hash = "sha256-ZPpf2xrjqCMTSqqVrsdTVLwXvdnKEroKeuNKflGz3tI="; + # }; + # propagatedBuildInputs = [ DevelHide TermSizePerl ]; + # meta = { + # description = "Retrieve terminal size"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermSizePerl = buildPerlPackage { + # pname = "Term-Size-Perl"; + # version = "0.031"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FE/FERREIRA/Term-Size-Perl-0.031.tar.gz"; + # hash = "sha256-rppnRssbMF3cj42MpGh4VSucESNiiXHhOidRg4IvIJ4="; + # }; + # meta = { + # description = "Perl extension for retrieving terminal size (Perl version)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermTable = buildPerlPackage { + # pname = "Term-Table"; + # version = "0.017"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Term-Table-0.017.tar.gz"; + # hash = "sha256-8R20JorYBE9uGhrJU0ygzTrXecQAb/83+uUA25j6yRo="; + # }; + # propagatedBuildInputs = [ Importer ]; + # meta = { + # description = "Format a header and rows into a table"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermSk = buildPerlPackage { + # pname = "Term-Sk"; + # version = "0.18"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KE/KEICHNER/Term-Sk-0.18.tar.gz"; + # hash = "sha256-8uSReWBhIFsIaIgCsod5LX2AOwiXIzn7EHC6BWEq+IU="; + # }; + # meta = { + # description = "Perl extension for displaying a progress indicator on a terminal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermUI = buildPerlPackage { + # pname = "Term-UI"; + # version = "0.50"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BI/BINGOS/Term-UI-0.50.tar.gz"; + # hash = "sha256-YL/dbUwVi4jTcBM/xlsgSFo2pFsS2QYAC4HHjKUkFj0="; + # }; + # propagatedBuildInputs = [ LogMessageSimple ]; + # meta = { + # description = "User interfaces via Term::ReadLine made easy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermVT102 = buildPerlPackage { + # pname = "Term-VT102"; + # version = "0.91"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AJ/AJWOOD/Term-VT102-0.91.tar.gz"; + # hash = "sha256-+VTgMQlB1FwPw+tKQPXToA1oEZ4nfTA6HmrxHe1vvZQ="; + # }; + # meta = { + # description = "A class to emulate a DEC VT102 terminal"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TermVT102Boundless = buildPerlPackage { + # pname = "Term-VT102-Boundless"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FB/FBARRIOS/Term-VT102-Boundless-0.05.tar.gz"; + # hash = "sha256-4d7YWuPXa1nAO4aX9KbLAa4xvWKpNU9bt9GPnpJ7SF8="; + # }; + # propagatedBuildInputs = [ TermVT102 ]; + # meta = { + # description = "A Term::VT102 that grows automatically to accommodate whatever you print to it"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TermAnimation = buildPerlPackage { + # pname = "Term-Animation"; + # version = "2.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KB/KBAUCOM/Term-Animation-2.6.tar.gz"; + # hash = "sha256-fVw8LU+bZXqLHc5/Xiy74CraLpfHLzoDBL88mdCEsEU="; + # }; + # propagatedBuildInputs = [ Curses ]; + # meta = { + # description = "ASCII sprite animation framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Test2Harness = buildPerlPackage { + # pname = "Test2-Harness"; + # version = "1.000155"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test2-Harness-1.000155.tar.gz"; + # hash = "sha256-Hvi/euDKALaHu24RXzq4yVBI5ICsmuUylzabxpSkc4s="; + # }; + + # checkPhase = '' + # patchShebangs ./t ./scripts/yath + # export AUTOMATED_TESTING=1 + # ./scripts/yath test -j $NIX_BUILD_CORES + # ''; + + # propagatedBuildInputs = [ DataUUID Importer LongJump ScopeGuard TermTable Test2PluginMemUsage Test2PluginUUID Test2Suite YAMLTiny gotofile ]; + # meta = { + # description = "A new and improved test harness with better Test2 integration"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "yath"; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.Test2Harness.x86_64-darwin + # }; + # }; + + # Test2PluginMemUsage = buildPerlPackage { + # pname = "Test2-Plugin-MemUsage"; + # version = "0.002003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test2-Plugin-MemUsage-0.002003.tar.gz"; + # hash = "sha256-XgZi1agjrggWQfXOgoQxEe7BgxzTH4g6bG3lSv34fCU="; + # }; + # buildInputs = [ Test2Suite ]; + # meta = { + # description = "Collect and display memory usage information"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Test2PluginUUID = buildPerlPackage { + # pname = "Test2-Plugin-UUID"; + # version = "0.002001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test2-Plugin-UUID-0.002001.tar.gz"; + # hash = "sha256-TGyNSE1xU9h3ncFVqZKyAwlbXFqhz7Hui87c0GAYeMk="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ DataUUID ]; + # meta = { + # description = "Use REAL UUIDs in Test2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Test2PluginNoWarnings = buildPerlPackage { + # pname = "Test2-Plugin-NoWarnings"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Test2-Plugin-NoWarnings-0.09.tar.gz"; + # hash = "sha256-vj3YAAQu7zYr8X0gVs+ek03ukczOmOTxeLj7V3Ly+3Q="; + # }; + # buildInputs = [ IPCRun3 Test2Suite ]; + # propagatedBuildInputs = [ TestSimple13 ]; + # meta = { + # description = "Fail if tests warn"; + # homepage = "https://metacpan.org/release/Test2-Plugin-NoWarnings"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # Test2Suite = buildPerlPackage { + # pname = "Test2-Suite"; + # version = "0.000156"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test2-Suite-0.000156.tar.gz"; + # hash = "sha256-vzgq5y86k79+02iFEY+uL/qw/xF3Q/WQON8lTv7yyU4="; + # }; + # propagatedBuildInputs = [ ModulePluggable ScopeGuard SubInfo TermTable TestSimple13 ]; + # meta = { + # description = "Distribution with a rich set of tools built upon the Test2 framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Test2ToolsFFI = buildPerlPackage { + # pname = "Test2-Tools-FFI"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test2-Tools-FFI-0.06.tar.gz"; + # hash = "sha256-MA28QKEubG+7y7lv05uQK+bZZXJtrx5qtzuKCv0lLy8="; + # }; + # buildInputs = [ FileShareDirInstall Test2Suite ]; + # propagatedBuildInputs = [ CaptureTiny FFICheckLib FFIPlatypus FileShareDirDist ]; + # meta = { + # homepage = "https://metacpan.org/pod/Test2::Tools::FFI"; + # description = "Tools for testing FFI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # Test2ToolsMemoryCycle = buildPerlPackage { + # pname = "Test2-Tools-MemoryCycle"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test2-Tools-MemoryCycle-0.01.tar.gz"; + # hash = "sha256-U1s9ylQqMyUVEq3ktafb6+PESNg/iA0ZjkPcEnl5aYs="; + # }; + # buildInputs = [ Test2Suite ]; + # propagatedBuildInputs = [ DevelCycle PadWalker ]; + # meta = { + # homepage = "https://metacpan.org/pod/Test2::Tools::MemoryCycle"; + # description = "Check for memory leaks and circular memory references"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ tomasajt ]; + # }; + # }; + + # TestAbortable = buildPerlPackage { + # pname = "Test-Abortable"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Test-Abortable-0.003.tar.gz"; + # hash = "sha256-TVPDXvPLf5wXUrqfEdOpeiETt9hMJg6rj5p8G4Aba40="; + # }; + # propagatedBuildInputs = [ SubExporter ]; + # buildInputs = [ TestNeeds ]; + # meta = { + # description = "Subtests that you can die your way out of ... but survive"; + # homepage = "https://github.com/rjbs/Test-Abortable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestAssert = buildPerlModule { + # pname = "Test-Assert"; + # version = "0.0504"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Test-Assert-0.0504.tar.gz"; + # hash = "sha256-z6NtqWxQQzH/ICZ0e6R9R37+g1z2zyNO4QywX6n7i6Q="; + # }; + # buildInputs = [ ClassInspector TestUnitLite ]; + # propagatedBuildInputs = [ ExceptionBase constantboolean ]; + # meta = { + # description = "Assertion methods for those who like JUnit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestAssertions = buildPerlPackage { + # pname = "Test-Assertions"; + # version = "1.054"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BB/BBC/Test-Assertions-1.054.tar.gz"; + # hash = "sha256-/NzkHVcnOIFYGt9oCiCmrfUaTDt+McP2mGb7kQk3AoA="; + # }; + # propagatedBuildInputs = [ LogTrace ]; + # meta = { + # description = "A simple set of building blocks for both unit and runtime testing"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # TestAggregate = buildPerlModule { + # pname = "Test-Aggregate"; + # version = "0.375"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RW/RWSTAUNER/Test-Aggregate-0.375.tar.gz"; + # hash = "sha256-xswKv9DU/OhTcazKk+wkU4GEHTK0yqLWR15LyBMEJ9E="; + # }; + # buildInputs = [ TestMost TestNoWarnings TestTrap ]; + # meta = { + # description = "Aggregate *.t tests to make them run faster"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = true; # This module only works with Test::More version < 1.3, but you have 1.302133 + # }; + # }; + + + # TestBase = buildPerlPackage { + # pname = "Test-Base"; + # version = "0.89"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/Test-Base-0.89.tar.gz"; + # hash = "sha256-J5Shqq6x06KH3SxyhiWGY3llYvfbnMxrQkvE8d6K0BQ="; + # }; + # propagatedBuildInputs = [ Spiffy ]; + # buildInputs = [ AlgorithmDiff TextDiff ]; + # meta = { + # description = "A Data Driven Testing Framework"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestBits = buildPerlPackage { + # pname = "Test-Bits"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Test-Bits-0.02.tar.gz"; + # hash = "sha256-qYJvVkg6J+LGMVZZDzKKNjPjA3XBDfyJ9mkOOSneC8M="; + # }; + # propagatedBuildInputs = [ ListAllUtils ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Provides a bits_is() subroutine for testing binary data"; + # homepage = "https://metacpan.org/release/Test-Bits"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestCheckDeps = buildPerlPackage { + # pname = "Test-CheckDeps"; + # version = "0.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/Test-CheckDeps-0.010.tar.gz"; + # hash = "sha256-ZvzMpsbzMOfsyJi9alGEbiFFs+AteMSZe6a33iO1Ue4="; + # }; + # propagatedBuildInputs = [ CPANMetaCheck ]; + # meta = { + # description = "Check for presence of dependencies"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestClass = buildPerlPackage { + # pname = "Test-Class"; + # version = "0.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SZ/SZABGAB/Test-Class-0.52.tar.gz"; + # hash = "sha256-QMGx04jwqGdHacJ1KfDMNjTKD9nY9ysZbAUxYRk0vII="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ MROCompat ModuleRuntime TryTiny ]; + # meta = { + # description = "Easily create test classes in an xUnit/JUnit style"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestClassMost = buildPerlModule { + # pname = "Test-Class-Most"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/Test-Class-Most-0.08.tar.gz"; + # hash = "sha256-Y0ze2Gu6Xd4Hztcv+4pGcF/5OqhEuY6WveBVQCNMff8="; + # }; + # buildInputs = [ TestClass TestDeep TestDifferences TestException TestMost TestWarn ]; + # meta = { + # description = "Test Classes the easy way"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestCleanNamespaces = buildPerlPackage { + # pname = "Test-CleanNamespaces"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-CleanNamespaces-0.24.tar.gz"; + # hash = "sha256-M41VaejommVJNfhD7AvISqpIb+jdGJj7nKs+zOzVMno="; + # }; + # buildInputs = [ Filepushd Moo Mouse RoleTiny SubExporter TestDeep TestNeeds TestWarnings namespaceclean ]; + # propagatedBuildInputs = [ PackageStash SubIdentify ]; + # meta = { + # description = "Check for uncleaned imports"; + # homepage = "https://github.com/karenetheridge/Test-CleanNamespaces"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestCmd = buildPerlPackage { + # pname = "Test-Cmd"; + # version = "1.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Test-Cmd-1.09.tar.gz"; + # hash = "sha256-zzMg7N3nkeC4lFogwfbyZdkPHj2rGPHiPLZ3x51yloQ="; + # }; + # doCheck = false; /* test fails */ + # meta = { + # description = "Perl module for portable testing of commands and scripts"; + # homepage = "https://github.com/neilb/Test-Cmd"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestCommand = buildPerlModule { + # pname = "Test-Command"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DANBOO/Test-Command-0.11.tar.gz"; + # hash = "sha256-KKP8b+pzoZ9WPxG9DygYZ1bUx0IHvm3qyq0m0ggblTM="; + # }; + # meta = { + # description = "Test routines for external commands"; + # homepage = "https://metacpan.org/release/Test-Command"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestCompile = buildPerlModule { + # pname = "Test-Compile"; + # version = "3.3.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EG/EGILES/Test-Compile-v3.3.1.tar.gz"; + # hash = "sha256-gIRQ89Ref0GapNZo4pgodonp6jY4hpO/8YDXhwzj5iE="; + # }; + # propagatedBuildInputs = [ UNIVERSALrequire ]; + # meta = { + # description = "Assert that your Perl files compile OK"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestCPANMeta = buildPerlPackage { + # pname = "Test-CPAN-Meta"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BA/BARBIE/Test-CPAN-Meta-0.25.tar.gz"; + # hash = "sha256-9VtPnPa8OW0P6AJyZ2hcsqxK/86JfQlnoxf6xttajbU="; + # }; + # meta = { + # description = "Validate your CPAN META.json files"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestCPANMetaJSON = buildPerlPackage { + # pname = "Test-CPAN-Meta-JSON"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BA/BARBIE/Test-CPAN-Meta-JSON-0.16.tar.gz"; + # hash = "sha256-Z6xQmt/7HSslao+MBSPgB2HZYBZhksYHApj3CIqa6ck="; + # }; + # propagatedBuildInputs = [ JSON ]; + # meta = { + # description = "Validate your CPAN META.json files"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestDataSplit = buildPerlModule { + # pname = "Test-Data-Split"; + # version = "0.2.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Data-Split-0.2.2.tar.gz"; + # hash = "sha256-5Qg4kK2tMNfeUHA1adX1zvF0oZhZNSLqe0bOOHuCgCI="; + # }; + # buildInputs = [ TestDifferences ]; + # propagatedBuildInputs = [ IOAll ListMoreUtils MooX MooXlate ]; + # meta = { + # description = "Split data-driven tests into several test scripts"; + # homepage = "https://metacpan.org/release/Test-Data-Split"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + TestDeep = buildPerlPackage { + pname = "Test-Deep"; + version = "1.204"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RJ/RJBS/Test-Deep-1.204.tar.gz"; + hash = "sha256-tlkfbM3YU8fvyf88V1Y3BAMhHP/kYEfwgrHNFhGoTl8="; + }; + meta = { + description = "Extremely flexible deep comparison"; + homepage = "https://github.com/rjbs/Test-Deep"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestDeepJSON = buildPerlModule { + # pname = "Test-Deep-JSON"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MOTEMEN/Test-Deep-JSON-0.05.tar.gz"; + # hash = "sha256-rshXG54xtzAeJhMsEyxoAJUtwInGRddpVKOtGms1CFg="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ ExporterLite JSONMaybeXS TestDeep ]; + # meta = { + # description = "Compare JSON with Test::Deep"; + # homepage = "https://github.com/motemen/perl5-Test-Deep-JSON"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestDeepType = buildPerlPackage { + # pname = "Test-Deep-Type"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-Deep-Type-0.008.tar.gz"; + # hash = "sha256-bnvqGi8edTGaItHFGZbrrFDKXjZj0bwiMTCIfmLpWfE="; + # }; + # buildInputs = [ TestFatal TestNeeds ]; + # propagatedBuildInputs = [ TestDeep TryTiny ]; + # meta = { + # description = "A Test::Deep plugin for validating type constraints"; + # homepage = "https://github.com/karenetheridge/Test-Deep-Type"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestDiagINC = buildPerlPackage { + # pname = "Test-DiagINC"; + # version = "0.010"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-DiagINC-0.010.tar.gz"; + # hash = "sha256-W8uNNWxQnjWdU9hpwH79qo/uXWz5mJcBi5qRTOshIi4="; + # }; + # buildInputs = [ CaptureTiny ]; + # meta = { + # homepage = "https://github.com/dagolden/Test-DiagINC"; + # description = "List modules and versions loaded if tests fail"; + # license = lib.licenses.asl20; + # }; + # }; + + # TestDir = buildPerlPackage { + # pname = "Test-Dir"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MT/MTHURN/Test-Dir-1.16.tar.gz"; + # hash = "sha256-czKzI5E+tqJoTQlHVRljBLL4YG9w6quRNlTKkfJz6sI="; + # }; + # meta = { + # description = "Test directory attributes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestDifferences = buildPerlPackage { + # pname = "Test-Differences"; + # version = "0.70"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DC/DCANTRELL/Test-Differences-0.70.tar.gz"; + # hash = "sha256-vuG1GGqpuif+0r8bBnRSDQvQzQUdkTOH+QhsH5SlaFQ="; + # }; + # propagatedBuildInputs = [ CaptureTiny TextDiff ]; + # meta = { + # description = "Test strings and data structures and show differences if not ok"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestDistManifest = buildPerlModule { + # pname = "Test-DistManifest"; + # version = "1.014"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-DistManifest-1.014.tar.gz"; + # hash = "sha256-PSbCDfQmKJgcv8+lscoCjGzq2zRMHc+XolrWqItz18U="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ ModuleManifest ]; + # meta = { + # description = "Author test that validates a package MANIFEST"; + # homepage = "https://github.com/jawnsy/Test-DistManifest"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestEOL = buildPerlPackage { + # pname = "Test-EOL"; + # version = "2.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-EOL-2.02.tar.gz"; + # hash = "sha256-KDGZ1/sngH/iImr3sSVxxtwlCNjlwP61BdCJ0xcgr8Q="; + # }; + # meta = { + # description = "Check the correct line endings in your project"; + # homepage = "https://github.com/karenetheridge/Test-EOL"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestException = buildPerlPackage { + # pname = "Test-Exception"; + # version = "0.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test-Exception-0.43.tar.gz"; + # hash = "sha256-FWsT8Hdk92bYtFpDco8kOa+Bo1EmJUON6reDt4g+tTM="; + # }; + # propagatedBuildInputs = [ SubUplevel ]; + # meta = { + # description = "Test exception-based code"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestExpect = buildPerlPackage { + # pname = "Test-Expect"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Test-Expect-0.34.tar.gz"; + # hash = "sha256-Jij87N2l9km9JTI/ZGuWoaB+RVfK3LMnybrU3EG7uZk="; + # }; + # propagatedBuildInputs = [ ClassAccessorChained ExpectSimple ]; + # meta = { + # description = "Automated driving and testing of terminal-based programs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestFailWarnings = buildPerlPackage { + # pname = "Test-FailWarnings"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-FailWarnings-0.008.tar.gz"; + # hash = "sha256-2jTvkCn2hJ1gJiAdSRJ9BU7mrEuXnIIhAxX1chlkqW8="; + # }; + # buildInputs = [ CaptureTiny ]; + # meta = { + # description = "Add test failures if warnings are caught"; + # homepage = "https://github.com/dagolden/Test-FailWarnings"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TestFakeHTTPD = buildPerlModule { + # pname = "Test-Fake-HTTPD"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MASAKI/Test-Fake-HTTPD-0.09.tar.gz"; + # hash = "sha256-FPecsGepCSLpvlVPjks509aXeK5Mj/9E9WD2N/tvLR4="; + # }; + # propagatedBuildInputs = [ HTTPDaemon Plack ]; + # buildInputs = [ LWP ModuleBuildTiny TestException TestSharedFork TestTCP TestUseAllModules ]; + # meta = { + # description = "A fake HTTP server"; + # homepage = "https://github.com/masaki/Test-Fake-HTTPD"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestFatal = buildPerlPackage { + pname = "Test-Fatal"; + version = "0.017"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RJ/RJBS/Test-Fatal-0.017.tar.gz"; + hash = "sha256-N9//2vuEt2Lv6WsC+yqkHzcCbHPmuDWQ23YilpfzxKY="; + }; + propagatedBuildInputs = [ TryTiny ]; + meta = { + description = "Incredibly simple helpers for testing code with exceptions"; + homepage = "https://github.com/rjbs/Test-Fatal"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestFile = buildPerlPackage { + # pname = "Test-File"; + # version = "1.993"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Test-File-1.993.tar.gz"; + # hash = "sha256-7y/+Gq7HtC2HStQR7GR1R7m5vC9fuT5J4zmUiEVq/Ho="; + # }; + # meta = { + # description = "Test file attributes"; + # homepage = "https://github.com/briandfoy/test-file"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestFileContents = buildPerlPackage { + # pname = "Test-File-Contents"; + # version = "0.242"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARISTOTLE/Test-File-Contents-0.242.tar.gz"; + # hash = "sha256-qDisC29uEOiWE7UMphdzzbqbpHh7qC57tl2q9whKpQs="; + # }; + # propagatedBuildInputs = [ TextDiff ]; + # meta = { + # description = "Test routines for examining the contents of files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestFileShareDir = buildPerlPackage { + # pname = "Test-File-ShareDir"; + # version = "1.001002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KE/KENTNL/Test-File-ShareDir-1.001002.tar.gz"; + # hash = "sha256-szZHy7Sy8vz73k+LtDg9CslcL4nExXcOtpHxZDozeq0="; + # }; + # buildInputs = [ TestFatal ]; + # propagatedBuildInputs = [ ClassTiny FileCopyRecursive FileShareDir PathTiny ScopeGuard ]; + # meta = { + # description = "Create a Fake ShareDir for your modules for testing"; + # homepage = "https://github.com/kentnl/Test-File-ShareDir"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestFilename = buildPerlPackage { + # pname = "Test-Filename"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-Filename-0.03.tar.gz"; + # hash = "sha256-akUMxMYoHtESnzKhwHQfIoln/touMqKRX/Yhw2Ul/L4="; + # }; + # propagatedBuildInputs = [ PathTiny ]; + # meta = { + # description = "Portable filename comparison"; + # homepage = "https://metacpan.org/release/Test-Filename"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TestFork = buildPerlModule { + # pname = "Test-Fork"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/Test-Fork-0.02.tar.gz"; + # hash = "sha256-/P77+yT4havoJ8KtB6w9Th/s8hOhRxf8rzw3F1BF0D4="; + # }; + # meta = { + # description = "Test code which forks"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestFutureIOImpl = buildPerlModule { + # pname = "Test-Future-IO-Impl"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-Future-IO-Impl-0.14.tar.gz"; + # hash = "sha256-AH22GdPUljQyXFbvvKDh5Vdt0z95RV8t6llb5u344jU="; + # }; + # propagatedBuildInputs = [ Test2Suite ]; + # meta = { + # description = "Acceptance tests for C implementations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestHarnessStraps = buildPerlModule { + # pname = "Test-Harness-Straps"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/Test-Harness-Straps-0.30.tar.gz"; + # hash = "sha256-iwDvqjVyPBo1yMj1+kapnkvFKN+lIDUrVKxBjvbRz6g="; + # }; + # meta = { + # description = "Detailed analysis of test results"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestHexDifferences = buildPerlPackage { + # pname = "Test-HexDifferences"; + # version = "1.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Test-HexDifferences-1.001.tar.gz"; + # hash = "sha256-pjlF7N1CCvwxEJT5OiIM+zXfIyQt5hnlO6Z0d6E2kKI="; + # }; + # propagatedBuildInputs = [ SubExporter TextDiff ]; + # buildInputs = [ TestDifferences TestNoWarnings ]; + # meta = { + # description = "Test binary as hexadecimal string"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestHexString = buildPerlModule { + # pname = "Test-HexString"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-HexString-0.03.tar.gz"; + # hash = "sha256-fUxM3BkvJZTceP916yz00FYfeUs27g6s7oxKGqigP0A="; + # }; + # meta = { + # description = "Test binary strings with hex dump diagnostics"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestIdentity = buildPerlModule { + # pname = "Test-Identity"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-Identity-0.01.tar.gz"; + # hash = "sha256-LwIFAJrtFSZoGCqvoWNXqx9HtMvAAeiYcbZzh++OXyM="; + # }; + # meta = { + # description = "Assert the referential identity of a reference"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestHTTPServerSimple = buildPerlPackage { + # pname = "Test-HTTP-Server-Simple"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALEXMV/Test-HTTP-Server-Simple-0.11.tar.gz"; + # hash = "sha256-hcl+vU3rgFKRsXJ3Ay2kiAcijyT4mxzi+zwJ96iWu3g="; + # }; + # propagatedBuildInputs = [ HTTPServerSimple ]; + # meta = { + # description = "Test::More functions for HTTP::Server::Simple"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestJSON = buildPerlModule { + # pname = "Test-JSON"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/Test-JSON-0.11.tar.gz"; + # hash = "sha256-B8CKsvzBKFDRrVT89q/prRoloJgxDD5xQq8dPLgh17M="; + # }; + # propagatedBuildInputs = [ JSONAny ]; + # buildInputs = [ TestDifferences ]; + # meta = { + # description = "Test JSON data"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestKwalitee = buildPerlPackage { + # pname = "Test-Kwalitee"; + # version = "1.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-Kwalitee-1.28.tar.gz"; + # hash = "sha256-tFNs3XVbWXciMtQyXae9T7f1vlC0WF27r3WO7DBiQ6M="; + # }; + # propagatedBuildInputs = [ ModuleCPANTSAnalyse ]; + # buildInputs = [ CPANMetaCheck TestDeep TestWarnings ]; + # meta = { + # description = "Test the Kwalitee of a distribution before you release it"; + # homepage = "https://github.com/karenetheridge/Test-Kwalitee"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "kwalitee-metrics"; + # }; + # }; + + # TestLWPUserAgent = buildPerlPackage { + # pname = "Test-LWP-UserAgent"; + # version = "0.036"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-LWP-UserAgent-0.036.tar.gz"; + # hash = "sha256-BTJ1MNNGuAphpulD+9dJmGvcqJIRpOswHAjC0XkxThE="; + # }; + # propagatedBuildInputs = [ LWP SafeIsa namespaceclean ]; + # buildInputs = [ PathTiny Plack TestDeep TestFatal TestNeeds TestRequiresInternet TestWarnings ]; + # meta = { + # description = "A LWP::UserAgent suitable for simulating and testing network calls"; + # homepage = "https://github.com/karenetheridge/Test-LWP-UserAgent"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestLeakTrace = buildPerlPackage { + # pname = "Test-LeakTrace"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEEJO/Test-LeakTrace-0.17.tar.gz"; + # hash = "sha256-d31k0pOPXqWGMA7vl+8D6stD1MGFPJw7EJHrMxFGeXA="; + # }; + # meta = { + # description = "Traces memory leaks"; + # homepage = "https://metacpan.org/release/Test-LeakTrace"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestLectroTest = buildPerlPackage { + # pname = "Test-LectroTest"; + # version = "0.5001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TM/TMOERTEL/Test-LectroTest-0.5001.tar.gz"; + # hash = "sha256-rCtPDZWJmvGhoex4TLdAsrkCVqvuEcg+eykRA+ye1zU="; + # }; + # meta = { + # description = "Easy, automatic, specification-based tests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestLoadAllModules = buildPerlPackage { + # pname = "Test-LoadAllModules"; + # version = "0.022"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KI/KITANO/Test-LoadAllModules-0.022.tar.gz"; + # hash = "sha256-G4YfVVAgZIp0gdStKBqJ5iQYf4lDepizRjVpGyZeXP4="; + # }; + # propagatedBuildInputs = [ ListMoreUtils ModulePluggable ]; + # meta = { + # description = "Do use_ok for modules in search path"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestLongString = buildPerlPackage { + # pname = "Test-LongString"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RG/RGARCIA/Test-LongString-0.17.tar.gz"; + # hash = "sha256-q8Q0nq8E0b7B5GQWajAYWR6oRtjzxcnIr0rEkF0+l08="; + # }; + # meta = { + # description = "Tests strings for equality, with more helpful failures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestMemoryCycle = buildPerlPackage { + pname = "Test-Memory-Cycle"; + version = "1.06"; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PE/PETDANCE/Test-Memory-Cycle-1.06.tar.gz"; + hash = "sha256-nVPd/clkzYRUyw2kxpW2o65HtFg5KRw0y52NHPqrMgI="; + }; + propagatedBuildInputs = [ DevelCycle PadWalker ]; + meta = { + description = "Verifies code hasn't left circular references"; + license = with lib.licenses; [ artistic2 ]; + }; + }; + + # TestMemoryGrowth = buildPerlModule { + # pname = "Test-MemoryGrowth"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-MemoryGrowth-0.04.tar.gz"; + # hash = "sha256-oGWFJ1Kr1J5BFbmPbbRsdSy71ePkjtAUXO45L3k9LtA="; + # }; + # meta = { + # description = "Assert that code does not cause growth in memory usage"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.TestMemoryGrowth.x86_64-darwin + # }; + # }; + + # TestMetricsAny = buildPerlModule { + # pname = "Test-Metrics-Any"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-Metrics-Any-0.01.tar.gz"; + # hash = "sha256-JQbIjU6yGydLEIX4BskY3Ml//2nhbRJJ5uGdlDYl5Gg="; + # }; + # propagatedBuildInputs = [ MetricsAny ]; + # meta = { + # description = "Assert that code produces metrics via Metrics::Any"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMockClass = buildPerlModule { + # pname = "Test-Mock-Class"; + # version = "0.0303"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Test-Mock-Class-0.0303.tar.gz"; + # hash = "sha256-zS5S/inKCrtsLmGvvDP7Qui+tCGzhL5rwGSs8xl28wI="; + # }; + # buildInputs = [ ClassInspector TestAssert TestUnitLite ]; + # propagatedBuildInputs = [ FatalException Moose namespaceclean ]; + # meta = { + # description = "Simulating other classes"; + # license = with lib.licenses; [ lgpl2Plus ]; + # }; + # }; + + # TestMockGuard = buildPerlModule { + # pname = "Test-Mock-Guard"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/X/XA/XAICRON/Test-Mock-Guard-0.10.tar.gz"; + # hash = "sha256-fyKKY/jWzrkqp4QIChPoUHMSGyg17KBteU+XCZUNvT0="; + # }; + # propagatedBuildInputs = [ ClassLoad ]; + # meta = { + # description = "Simple mock test library using RAII"; + # homepage = "https://github.com/zigorou/p5-test-mock-guard"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMockHTTPTiny = buildPerlPackage { + # pname = "Test-Mock-HTTP-Tiny"; + # version = "0.002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OD/ODYNIEC/Test-Mock-HTTP-Tiny-0.002.tar.gz"; + # hash = "sha256-+c+tfYUEZQvtNJO8bSyoLXuRvDcTyGxDXnXriKxb5eY="; + # }; + # propagatedBuildInputs = [ TestDeep URI ]; + # meta = { + # description = "Record and replay HTTP requests/responses with HTTP::Tiny"; + # homepage = "https://github.com/odyniec/p5-Test-Mock-HTTP-Tiny"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMockModule = buildPerlModule { + # pname = "Test-MockModule"; + # version = "0.177.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFRANKS/Test-MockModule-v0.177.0.tar.gz"; + # hash = "sha256-G9p6SdzqdgdtQKe2psPz4V5rGchLYXHfRFNNkROPEEU="; + # }; + # propagatedBuildInputs = [ SUPER ]; + # buildInputs = [ TestWarnings ]; + # meta = { + # description = "Override subroutines in a module for unit testing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # SUPER = buildPerlModule { + # pname = "SUPER"; + # version = "1.20190531"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHROMATIC/SUPER-1.20190531.tar.gz"; + # hash = "sha256-aF0e525/DpAGlCkjv334sRwQcTKZKRdZPc9zl9QX05o="; + # }; + # propagatedBuildInputs = [ SubIdentify ]; + # meta = { + # description = "Control superclass method dispatch"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + + # TestMockObject = buildPerlPackage { + # pname = "Test-MockObject"; + # version = "1.20200122"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHROMATIC/Test-MockObject-1.20200122.tar.gz"; + # hash = "sha256-K3+A2of1pv4DYNnuUhBRBTAXRCw6Juhdto36yfgwdiM="; + # }; + # buildInputs = [ TestException TestWarn ]; + # propagatedBuildInputs = [ UNIVERSALcan UNIVERSALisa ]; + # meta = { + # description = "Perl extension for emulating troublesome interfaces"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMockTime = buildPerlPackage { + # pname = "Test-MockTime"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DD/DDICK/Test-MockTime-0.17.tar.gz"; + # hash = "sha256-M2PhGLJgbx1qvJVvIrDQkQl3K3CGFV+1ycf5gzUGAvk="; + # }; + # meta = { + # description = "Replaces actual time with simulated time"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMockTimeHiRes = buildPerlModule { + # pname = "Test-MockTime-HiRes"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TA/TARAO/Test-MockTime-HiRes-0.08.tar.gz"; + # hash = "sha256-X0n3rviV0yfa/fJ0TznBdsirDkuCJ9LW495omiWb3sE="; + # }; + # buildInputs = [ AnyEvent ModuleBuildTiny TestClass TestRequires ]; + # propagatedBuildInputs = [ TestMockTime ]; + # meta = { + # description = "Replaces actual time with simulated high resolution time"; + # homepage = "https://github.com/tarao/perl5-Test-MockTime-HiRes"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMojibake = buildPerlPackage { + # pname = "Test-Mojibake"; + # version = "1.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYP/Test-Mojibake-1.3.tar.gz"; + # hash = "sha256-j/51/5tpNSSIcn3Kc9uR+KoUtZ8voQTrdxfA1xpfGzM="; + # }; + # meta = { + # description = "Check your source for encoding misbehavior"; + # homepage = "https://github.com/creaktive/Test-Mojibake"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "scan_mojibake"; + # }; + # }; + + # TestMoreUTF8 = buildPerlPackage { + # pname = "Test-More-UTF8"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MO/MONS/Test-More-UTF8-0.05.tar.gz"; + # hash = "sha256-ufHEs2qXzf76pT7REV3Tj0tIMDd3X2VZ7h3xSs/RzgQ="; + # }; + # meta = { + # description = "Enhancing Test::More for UTF8-based projects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMost = buildPerlPackage { + # pname = "Test-Most"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OV/OVID/Test-Most-0.38.tar.gz"; + # hash = "sha256-CJ64lPe6zkw3xjNODikOsgM47hAiOvDILL5ygceDgt8="; + # }; + # propagatedBuildInputs = [ ExceptionClass ]; + # buildInputs = [ TestDeep TestDifferences TestException TestWarn ]; + # meta = { + # description = "Most commonly needed test functions and features"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Testmysqld = buildPerlModule { + # pname = "Test-mysqld"; + # version = "1.0013"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SO/SONGMU/Test-mysqld-1.0013.tar.gz"; + # hash = "sha256-V61BoJBXyWO1gsgaB276UPpW664hd9gwd33oOGBePu8="; + # }; + # buildInputs = [ pkgs.which ModuleBuildTiny TestSharedFork ]; + # propagatedBuildInputs = [ ClassAccessorLite DBDmysql FileCopyRecursive ]; + # meta = { + # description = "Mysqld runner for tests"; + # homepage = "https://github.com/kazuho/p5-test-mysqld"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + TestNeeds = buildPerlPackage { + pname = "Test-Needs"; + version = "0.002010"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/Test-Needs-0.002010.tar.gz"; + hash = "sha256-kj/9x4/LqWYJdT5LriawugGGiT3kpjzVI24BLHyQ4gg="; + }; + meta = { + description = "Skip tests when modules not available"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestNoTabs = buildPerlPackage { + # pname = "Test-NoTabs"; + # version = "2.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-NoTabs-2.02.tar.gz"; + # hash = "sha256-+3XGo4ch8BaeEcHn2+UyntchaIWgsBEj80LdhtM1YDA="; + # }; + # meta = { + # description = "Check the presence of tabs in your project"; + # homepage = "https://github.com/karenetheridge/Test-NoTabs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestNoWarnings = buildPerlPackage { + pname = "Test-NoWarnings"; + version = "1.06"; + src = fetchurl { + url = "mirror://cpan/authors/id/H/HA/HAARG/Test-NoWarnings-1.06.tar.gz"; + hash = "sha256-wtxRFDt+tjIxIQ4n3yDSyDk3cuCjM1R+yLeiBe1i9zc="; + }; + meta = { + description = "Make sure you didn't emit any warnings while testing"; + license = with lib.licenses; [ lgpl21Only ]; + }; + }; + + # TestObject = buildPerlPackage { + # pname = "Test-Object"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-Object-0.08.tar.gz"; + # hash = "sha256-ZSeJZBR4NzE/QQjlW1lnboo2TW7fAbPcGYruiUqx0Ls="; + # }; + # meta = { + # description = "Thoroughly testing objects via registered handlers"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestOutput = buildPerlPackage { + # pname = "Test-Output"; + # version = "1.034"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Test-Output-1.034.tar.gz"; + # hash = "sha256-zULigBwNK0gtGMn7SwbHVwVIGLy7KCTl378zrXo9aaA="; + # }; + # propagatedBuildInputs = [ CaptureTiny ]; + # meta = { + # description = "Utilities to test STDOUT and STDERR messages"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestPAUSEPermissions = buildPerlPackage { + # pname = "Test-PAUSE-Permissions"; + # version = "0.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SK/SKAJI/Test-PAUSE-Permissions-0.07.tar.gz"; + # hash = "sha256-VXDBu/KbxjeoRWcIuaJ0bPT8usE3SF7f82D48I5xBz4="; + # }; + # propagatedBuildInputs = [ ConfigIdentity PAUSEPermissions ParseLocalDistribution ]; + # buildInputs = [ ExtUtilsMakeMakerCPANfile TestUseAllModules ]; + # meta = { + # description = "Tests module permissions in your distribution"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPerlCritic = buildPerlModule { + # pname = "Test-Perl-Critic"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/Test-Perl-Critic-1.04.tar.gz"; + # hash = "sha256-KPgGtUEseQi1bPFnMIS4tEzhy1TJQX14TZFCjhoECW4="; + # }; + # propagatedBuildInputs = [ MCE PerlCritic ]; + # meta = { + # description = "Use Perl::Critic in test programs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPerlTidy = buildPerlModule { + # pname = "Test-PerlTidy"; + # version = "20230226"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-PerlTidy-20230226.tar.gz"; + # hash = "sha256-wOJCEQeVeV1Nu2xEFmzlV09cftuninidG8rnZoXYA8E="; + # }; + # propagatedBuildInputs = [ PathTiny PerlTidy TextDiff ]; + # buildInputs = [ TestPerlCritic ]; + # meta = { + # description = "Check that all your files are tidy"; + # homepage = "https://metacpan.org/release/Test-PerlTidy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPod = buildPerlPackage { + # pname = "Test-Pod"; + # version = "1.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-Pod-1.52.tar.gz"; + # hash = "sha256-YKjbzGAWi/HapcwjUCNt+TQ+mHj0q5gwlwpd3m/o5fw="; + # }; + # meta = { + # description = "Check for POD errors in files"; + # homepage = "https://search.cpan.org/dist/Test-Pod"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPodCoverage = buildPerlPackage { + # pname = "Test-Pod-Coverage"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Test-Pod-Coverage-1.10.tar.gz"; + # hash = "sha256-SMnMqffZnu50EXZEW0Ma3wnAKeGqV8RwPJ9G92AdQNQ="; + # }; + # propagatedBuildInputs = [ PodCoverage ]; + # meta = { + # description = "Check for pod coverage in your distribution"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestPodLinkCheck = buildPerlModule { + # pname = "Test-Pod-LinkCheck"; + # version = "0.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AP/APOCAL/Test-Pod-LinkCheck-0.008.tar.gz"; + # hash = "sha256-K/53EXPDi2nusIlQTj92URuOReap5trD5hbkAOpnvPA="; + # }; + # buildInputs = [ ModuleBuildTiny TestPod ]; + # propagatedBuildInputs = [ CaptureTiny Moose podlinkcheck ]; + # meta = { + # description = "Tests POD for invalid links"; + # homepage = "https://search.cpan.org/dist/Test-Pod-LinkCheck"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPodNo404s = buildPerlModule { + # pname = "Test-Pod-No404s"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AP/APOCAL/Test-Pod-No404s-0.02.tar.gz"; + # hash = "sha256-EcYGBW/WK9ROB5977wbEWapYnuhc3tv6DMMl6jV8jnk="; + # }; + # propagatedBuildInputs = [ LWP URIFind ]; + # buildInputs = [ ModuleBuildTiny TestPod ]; + # meta = { + # description = "Using this test module will check your POD for any http 404 links"; + # homepage = "https://search.cpan.org/dist/Test-Pod-No404s"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestPortabilityFiles = buildPerlPackage { + # pname = "Test-Portability-Files"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AB/ABRAXXA/Test-Portability-Files-0.10.tar.gz"; + # hash = "sha256-COS0MkktwbRLVdXbV5Uut2N5x/Q07o8WrKZNSR9AGhY="; + # }; + # meta = { + # description = "Check file names portability"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestRefcount = buildPerlModule { + # pname = "Test-Refcount"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/Test-Refcount-0.10.tar.gz"; + # hash = "sha256-BFfCCklWRz0VfE+q/4gUFUvJP24rVDwoEqGf+OM3DrI="; + # }; + # meta = { + # description = "Assert reference counts on objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestRequires = buildPerlPackage { + pname = "Test-Requires"; + version = "0.11"; + src = fetchurl { + url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/Test-Requires-0.11.tar.gz"; + hash = "sha256-S4jeVJWX7s3ffDw4pNAgShb1mtgEV3tnGJasBOJOBA8="; + }; + meta = { + description = "Checks to see if the module can be loaded"; + homepage = "https://github.com/tokuhirom/Test-Requires"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestRequiresGit = buildPerlPackage { + # pname = "Test-Requires-Git"; + # version = "1.008"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOOK/Test-Requires-Git-1.008.tar.gz"; + # hash = "sha256-cJFiEJcNhNdJFFEVmri2fhUlHIwNrnw99sjYhULqQqY="; + # }; + # propagatedBuildInputs = [ GitVersionCompare ]; + # meta = { + # description = "Check your test requirements against the available version of Git"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestRequiresInternet = buildPerlPackage { + pname = "Test-RequiresInternet"; + version = "0.05"; + src = fetchurl { + url = "mirror://cpan/authors/id/M/MA/MALLEN/Test-RequiresInternet-0.05.tar.gz"; + hash = "sha256-u6ezKhzA1Yzi7CCyAKc0fGljFkHoyuj/RWetJO8egz4="; + }; + meta = { + description = "Easily test network connectivity"; + homepage = "https://metacpan.org/dist/Test-RequiresInternet"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestRoo = buildPerlPackage { + # pname = "Test-Roo"; + # version = "1.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-Roo-1.004.tar.gz"; + # hash = "sha256-IRKaPOy1B7AJSOFs8V/N5dxNsjWrqEr9f0fSIBOp3tY="; + # }; + + # propagatedBuildInputs = [ Moo MooXTypesMooseLike SubInstall strictures ]; + # buildInputs = [ CaptureTiny ]; + # meta = { + # description = "Composable, reusable tests with roles and Moo"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TestRoutine = buildPerlPackage { + # pname = "Test-Routine"; + # version = "0.031"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Test-Routine-0.031.tar.gz"; + # hash = "sha256-f9kp7TPyVMoJkCJQGSYInHeU71d7uoYHbn2YFlYPXAc="; + # }; + # buildInputs = [ TestAbortable TestFatal ]; + # propagatedBuildInputs = [ Moose namespaceautoclean ]; + # meta = { + # description = "Composable units of assertion"; + # homepage = "https://github.com/rjbs/Test-Routine"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestRun = buildPerlModule { + # pname = "Test-Run"; + # version = "0.0305"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-0.0305.tar.gz"; + # hash = "sha256-+Jpx3WD44qd26OYBd8ntXlkJbUAF1QvSmJuSeeCHwkg="; + # }; + # buildInputs = [ TestTrap ]; + # propagatedBuildInputs = [ IPCSystemSimple ListMoreUtils MooseXStrictConstructor TextSprintfNamed UNIVERSALrequire ]; + # meta = { + # description = "Base class to run standard TAP scripts"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunCmdLine = buildPerlModule { + # pname = "Test-Run-CmdLine"; + # version = "0.0132"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-CmdLine-0.0132.tar.gz"; + # hash = "sha256-ssORzVRjV378dti/so6tKz1OOm+pLbDvNMANyfTPpwc="; + # }; + # buildInputs = [ TestRun TestTrap ]; + # propagatedBuildInputs = [ MooseXGetopt UNIVERSALrequire YAMLLibYAML ]; + # doCheck = !stdenv.isDarwin; + # meta = { + # description = "Analyze tests from the command line using Test::Run"; + # homepage = "http://web-cpan.berlios.de/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # mainProgram = "runprove"; + # }; + # }; + + # TestRunPluginAlternateInterpreters = buildPerlModule { + # pname = "Test-Run-Plugin-AlternateInterpreters"; + # version = "0.0125"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-Plugin-AlternateInterpreters-0.0125.tar.gz"; + # hash = "sha256-UsNomxRdgh8XCj8uXPM6DCkoKE3d6W1sN88VAA8ymbs="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestTrap YAMLLibYAML ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Define different interpreters for different test scripts with Test::Run"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunPluginBreakOnFailure = buildPerlModule { + # pname = "Test-Run-Plugin-BreakOnFailure"; + # version = "0.0.6"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-Plugin-BreakOnFailure-v0.0.6.tar.gz"; + # hash = "sha256-oBgO4+LwwUQSkFXaBeKTFRC59QcXTQ+6yjwMndBNE6k="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestTrap YAMLLibYAML ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Stop processing the entire test suite"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunPluginColorFileVerdicts = buildPerlModule { + # pname = "Test-Run-Plugin-ColorFileVerdicts"; + # version = "0.0125"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-Plugin-ColorFileVerdicts-0.0125.tar.gz"; + # hash = "sha256-HCQaLBSm/WZLRy5Lb2iP1gyHlzsxjITgFIccBn8uHkY="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestTrap ]; + # propagatedBuildInputs = [ Moose ]; + # moreInputs = [ TestTrap ]; # Added because tests were failing without it + # doCheck=true; + # meta = { + # description = "Make the file verdict ('ok', 'NOT OK')"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunPluginColorSummary = buildPerlModule { + # pname = "Test-Run-Plugin-ColorSummary"; + # version = "0.0203"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-Plugin-ColorSummary-0.0203.tar.gz"; + # hash = "sha256-e9l5N5spa1EPxVuxwAuKEM00hQ5OIZf1cBtUYAY/iv0="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestTrap ]; + # moreInputs = [ TestTrap ]; # Added because tests were failing without it + # doCheck=true; + # meta = { + # description = "A Test::Run plugin that"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunPluginTrimDisplayedFilenames = buildPerlModule { + # pname = "Test-Run-Plugin-TrimDisplayedFilenames"; + # version = "0.0126"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-Run-Plugin-TrimDisplayedFilenames-0.0126.tar.gz"; + # hash = "sha256-ioZJw8anmIp3N65KcW1g4MazIXMBtAFT6tNquPTqkCg="; + # }; + # buildInputs = [ TestRun TestRunCmdLine TestTrap YAMLLibYAML ]; + # propagatedBuildInputs = [ Moose ]; + # meta = { + # description = "Trim the first components"; + # homepage = "https://web-cpan.shlomifish.org/modules/Test-Run"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestRunValgrind = buildPerlModule { + # pname = "Test-RunValgrind"; + # version = "0.2.2"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-RunValgrind-0.2.2.tar.gz"; + # hash = "sha256-aRPRTK3CUbI8W3I1+NSsPeKHE41xK3W9lLACrwuPpe4="; + # }; + # buildInputs = [ TestTrap ]; + # propagatedBuildInputs = [ PathTiny ]; + # meta = { + # description = "Tests that an external program is valgrind-clean"; + # homepage = "https://metacpan.org/release/Test-RunValgrind"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestScript = buildPerlPackage { + # pname = "Test-Script"; + # version = "1.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test-Script-1.29.tar.gz"; + # hash = "sha256-iS5+bB6nsWcQkJlCz1wL2rcO7i79SqnBbqlS4rkPiVA="; + # }; + + # buildInputs = [ Test2Suite ]; + + # propagatedBuildInputs = [ CaptureTiny ProbePerl ]; + # meta = { + # description = "Basic cross-platform tests for scripts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestScriptRun = buildPerlPackage { + # pname = "Test-Script-Run"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SU/SUNNAVY/Test-Script-Run-0.08.tar.gz"; + # hash = "sha256-H+8hbnC8QlrOPixDcN/N3bXnmLCZ77omeSRKTVvBqwo="; + # }; + # propagatedBuildInputs = [ IPCRun3 TestException ]; + # meta = { + # description = "Test scripts with run"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestSharedFork = buildPerlPackage { + # pname = "Test-SharedFork"; + # version = "0.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test-SharedFork-0.35.tar.gz"; + # hash = "sha256-KTLoZWEOgHWPdkxYZ1fvjhHbEoTZWOJeS3qFCYQUxZ8="; + # }; + # buildInputs = [ TestRequires ]; + # meta = { + # description = "Fork test"; + # homepage = "https://github.com/tokuhirom/Test-SharedFork"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestSimple13 = buildPerlPackage { + # pname = "Test-Simple"; + # version = "1.302195"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EX/EXODIST/Test-Simple-1.302195.tar.gz"; + # hash = "sha256-s5C7I1kuC5Rsla27PDCxG8Y0ooayhHvmEa2SnFfjmmw="; + # }; + # meta = { + # description = "Basic utilities for writing tests"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestSnapshot = buildPerlPackage { + # pname = "Test-Snapshot"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETJ/Test-Snapshot-0.06.tar.gz"; + # hash = "sha256-9N16mlW6oiR1QK40IQzQWgT50QYb7+yXockO2pW/rkU="; + # }; + # buildInputs = [ CaptureTiny ]; + # propagatedBuildInputs = [ TextDiff ]; + # meta = { + # description = "Test against data stored in automatically-named file"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestSpec = buildPerlPackage { + # pname = "Test-Spec"; + # version = "0.54"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AK/AKZHAN/Test-Spec-0.54.tar.gz"; + # hash = "sha256-CjHPEmXc7pC7xCRWrWC7Njr8f6xml//7D9SbupKhZdI="; + # }; + # propagatedBuildInputs = [ DevelGlobalPhase PackageStash TieIxHash ]; + # buildInputs = [ TestDeep TestTrap ]; + # meta = { + # description = "Write tests in a declarative specification style"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestSubCalls = buildPerlPackage { + # pname = "Test-SubCalls"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Test-SubCalls-1.10.tar.gz"; + # hash = "sha256-y8Hps1oF5x/rwT5e9UejHIJJiZu2AR29ydn/Nm3atsI="; + # }; + # propagatedBuildInputs = [ HookLexWrap ]; + # meta = { + # description = "Track the number of times subs are called"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestSynopsis = buildPerlPackage { + # pname = "Test-Synopsis"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZO/ZOFFIX/Test-Synopsis-0.17.tar.gz"; + # hash = "sha256-0mjJizPS+hTbsisg1lYbq0ie6CWH374ZrSd2IMe4tt4="; + # }; + # meta = { + # description = "Test your SYNOPSIS code"; + # homepage = "https://metacpan.org/release/Test-Synopsis"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestTableDriven = buildPerlPackage { + # pname = "Test-TableDriven"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JR/JROCKWAY/Test-TableDriven-0.02.tar.gz"; + # hash = "sha256-Qlh4r88qFOBHyviRsZFen1/7A2lBYJxDjg370bWxhZo="; + # }; + # meta = { + # description = "Write tests, not scripts that run them"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestTempDirTiny = buildPerlPackage { + # pname = "Test-TempDir-Tiny"; + # version = "0.018"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-TempDir-Tiny-0.018.tar.gz"; + # hash = "sha256-17eh/X/M4BaNRPuIdpGP6KmvSa4OuLCWJbZ7GNcfXoE="; + # }; + # meta = { + # description = "Temporary directories that stick around when tests fail"; + # homepage = "https://github.com/dagolden/Test-TempDir-Tiny"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TestTCP = buildPerlPackage { + # pname = "Test-TCP"; + # version = "2.22"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Test-TCP-2.22.tar.gz"; + # hash = "sha256-PlPDwG1tCYCiv+uRVgK3FOaC7iEa6IwRdIzyzHFOe1c="; + # }; + # buildInputs = [ TestSharedFork ]; + # meta = { + # description = "Testing TCP program"; + # homepage = "https://github.com/tokuhirom/Test-TCP"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestUNIXSock = buildPerlModule rec { + # pname = "Test-UNIXSock"; + # version = "0.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/F/FU/FUJIWARA/${pname}-${version}.tar.gz"; + # hash = "sha256-NzC0zBA0Es+/b+JHvbwwC+l94wnMmxxcvVc3E7hojz8="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ TestSharedFork TestTCP ]; + # meta = { + # description = "Testing UNIX domain socket program"; + # homepage = "https://github.com/fujiwara/Test-UNIXSock"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestTime = buildPerlPackage { + # pname = "Test-Time"; + # version = "0.092"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AN/ANATOFUZ/Test-Time-0.092.tar.gz"; + # hash = "sha256-MNkPVM6ECJPHuiysKk0e7NTJzfgFkQxZXjronf1kRzg="; + # }; + # meta = { + # description = "Overrides the time() and sleep() core functions for testing"; + # homepage = "https://github.com/cho45/Test-Time"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestToolbox = buildPerlModule { + # pname = "Test-Toolbox"; + # version = "0.4"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKO/Test-Toolbox-0.4.tar.gz"; + # hash = "sha256-QCC1x/OhWsmxh9Bd/ZgWuAMOwNSkf/g3P3Yzu2FOvcM="; + # }; + # meta = { + # description = "Test::Toolbox - tools for testing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestTrailingSpace = buildPerlModule { + # pname = "Test-TrailingSpace"; + # version = "0.0601"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Test-TrailingSpace-0.0601.tar.gz"; + # hash = "sha256-q7jOdEg6Y9c/4e9gO3zgptR8mO3nMZVdc1eE+tHcT8w="; + # }; + # buildInputs = [ FileTreeCreate ]; + # propagatedBuildInputs = [ FileFindObjectRule ]; + # meta = { + # description = "Test for trailing space in source files"; + # homepage = "https://metacpan.org/release/Test-TrailingSpace"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TestUnitLite = buildPerlModule { + # pname = "Test-Unit-Lite"; + # version = "0.1202"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DE/DEXTER/Test-Unit-Lite-0.1202.tar.gz"; + # hash = "sha256-NR0l7nExYoqvfjmV/h//uJOuf+bvWM8zcO0yCVP1sqg="; + # }; + # meta = { + # description = "Unit testing without external dependencies"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TestWarn = buildPerlPackage { + pname = "Test-Warn"; + version = "0.37"; + src = fetchurl { + url = "mirror://cpan/authors/id/B/BI/BIGJ/Test-Warn-0.37.tar.gz"; + hash = "sha256-mMoy5/L16om4v7mgYJl389FT4kLi5RcFEmy5VPGga1c="; + }; + propagatedBuildInputs = [ SubUplevel ]; + meta = { + description = "Perl extension to test methods for warnings"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + TestWarnings = buildPerlPackage { + pname = "Test-Warnings"; + version = "0.032"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/ET/ETHER/Test-Warnings-0.032.tar.gz"; + hash = "sha256-Ryfa4kFunwfkHi3DqRQ7pq/8HsV2UhF8mdUAOOMT6dk="; + }; + buildInputs = [ CPANMetaCheck PadWalker ]; + meta = { + description = "Test for warnings and the lack of them"; + homepage = "https://github.com/karenetheridge/Test-Warnings"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TestWeaken = buildPerlPackage { + # pname = "Test-Weaken"; + # version = "3.022000"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/Test-Weaken-3.022000.tar.gz"; + # hash = "sha256-JjGocSExAmLg6WEHpvoO1pSHt3AVIHc77l+prMwpX1s="; + # }; + # propagatedBuildInputs = [ ScalarListUtils ]; + # meta = { + # description = "Test that freed memory objects were, indeed, freed"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestWithoutModule = buildPerlPackage { + # pname = "Test-Without-Module"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CO/CORION/Test-Without-Module-0.21.tar.gz"; + # hash = "sha256-PN6vraxIU+vq/miTRtVV2l36PPqdTITj5ee/7lC+7EY="; + # }; + # meta = { + # description = "Test fallback behaviour in absence of modules"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestWWWMechanize = buildPerlPackage { + # pname = "Test-WWW-Mechanize"; + # version = "1.60"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PETDANCE/Test-WWW-Mechanize-1.60.tar.gz"; + # hash = "sha256-I/1y5+0b553h0CotFfDfCTQV4Oq2/GFf9rtoh0Emhnc="; + # }; + # buildInputs = [ TestLongString ]; + # propagatedBuildInputs = [ CarpAssertMore HTTPServerSimple WWWMechanize ]; + # meta = { + # description = "Testing-specific WWW::Mechanize subclass"; + # homepage = "https://github.com/libwww-perl/WWW-Mechanize"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TestWWWMechanizeCatalyst = buildPerlPackage { + # pname = "Test-WWW-Mechanize-Catalyst"; + # version = "0.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSTROUT/Test-WWW-Mechanize-Catalyst-0.62.tar.gz"; + # hash = "sha256-GDveGuerpw3LPtd3xVSCN/QsPtVR/VvGWM7obQIWrLE="; + # }; + # doCheck = false; # listens on an external port + # propagatedBuildInputs = [ CatalystRuntime WWWMechanize ]; + # buildInputs = [ CatalystPluginSession CatalystPluginSessionStateCookie TestException TestWWWMechanize Testutf8 ]; + # meta = { + # description = "Test::WWW::Mechanize for Catalyst"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestWWWMechanizeCGI = buildPerlPackage { + # pname = "Test-WWW-Mechanize-CGI"; + # version = "0.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/Test-WWW-Mechanize-CGI-0.1.tar.gz"; + # hash = "sha256-pXagsi470a/JJ0/FY7A3ru53cThJyev2pq1EFcFsnC8="; + # }; + # propagatedBuildInputs = [ WWWMechanizeCGI ]; + # buildInputs = [ TestLongString TestWWWMechanize ]; + # meta = { + # description = "Test CGI applications with Test::WWW::Mechanize"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestWWWMechanizePSGI = buildPerlPackage { + # pname = "Test-WWW-Mechanize-PSGI"; + # version = "0.39"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OA/OALDERS/Test-WWW-Mechanize-PSGI-0.39.tar.gz"; + # hash = "sha256-R2s6s7R9U05Nag9JkAIdXTTGnsk3rAcW5mzop7yHmVg="; + # }; + # buildInputs = [ CGI TestLongString TestWWWMechanize ]; + # propagatedBuildInputs = [ Plack ]; + # meta = { + # description = "Test PSGI programs using WWW::Mechanize"; + # homepage = "https://github.com/acme/test-www-mechanize-psgi"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestXPath = buildPerlPackage { + # pname = "Test-XPath"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/Test-XPath-0.20.tar.gz"; + # hash = "sha256-36phHnFGrZyXabW89oiUmXa4Ny3354ekC5M6FI2JIDk="; + # }; + # propagatedBuildInputs = [ XMLLibXML ]; + # meta = { + # description = "Test XML and HTML content and structure with XPath expressions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestYAML = buildPerlPackage { + # pname = "Test-YAML"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TINITA/Test-YAML-1.07.tar.gz"; + # hash = "sha256-HzANA09GKYy5KWCRLMBLrDP7J/BbiFLY8FHhELnNmV8="; + # }; + # buildInputs = [ TestBase ]; + # meta = { + # description = "Testing Module for YAML Implementations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "test-yaml"; + # }; + # }; + + # TextAligner = buildPerlModule { + # pname = "Text-Aligner"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Text-Aligner-0.16.tar.gz"; + # hash = "sha256-XIV9vOWG9X+j18Tr0yACOrOyljsgSUKK4BvTvE8hVyU="; + # }; + # meta = { + # description = "Module to align text"; + # homepage = "https://metacpan.org/release/Text-Aligner"; + # license = with lib.licenses; [ isc ]; + # }; + # }; + + # TextAspell = buildPerlPackage { + # pname = "Text-Aspell"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HANK/Text-Aspell-0.09.tar.gz"; + # hash = "sha256-K+oyCfGOJzsZPjF1pC0mk5GRnkmrEGtuJSOV0nIYL2U="; + # }; + # propagatedBuildInputs = [ pkgs.aspell ]; + # ASPELL_CONF = "dict-dir ${pkgs.aspellDicts.en}/lib/aspell"; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.aspell}/include"; + # NIX_CFLAGS_LINK = "-L${pkgs.aspell}/lib -laspell"; + # meta = { + # description = "Perl interface to the GNU Aspell library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextAutoformat = buildPerlPackage { + # pname = "Text-Autoformat"; + # version = "1.75"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Text-Autoformat-1.75.tar.gz"; + # hash = "sha256-ndT0zj2uxLTb9bWdrEVoqJRq7RLCi05ZiMjoxgLGt3E="; + # }; + # propagatedBuildInputs = [ TextReform ]; + # meta = { + # description = "Automatic text wrapping and reformatting"; + # homepage = "https://github.com/neilb/Text-Autoformat"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextBalanced = buildPerlPackage { + # pname = "Text-Balanced"; + # version = "2.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHAY/Text-Balanced-2.06.tar.gz"; + # hash = "sha256-dz4PDyHAyyz2ZM7muij/cCWbq8yJL5tlD5y9oAvgkq0="; + # }; + # meta = { + # description = "Extract delimited text sequences from strings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextBibTeX = buildPerlModule { + # pname = "Text-BibTeX"; + # version = "0.89"; + # buildInputs = [ CaptureTiny ConfigAutoConf ExtUtilsLibBuilder ]; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AM/AMBS/Text-BibTeX-0.89.tar.gz"; + # hash = "sha256-iKeOvwiOx1AvQBxaKxOMhiz1RYU0t3MiO786r0EiQZY="; + # }; + # # libbtparse.so: cannot open shared object file + # patches = [ ./perl-modules/TextBibTeX-use-lib.patch ]; + # perlPreHook = "export LD=$CC"; + # perlPostHook = lib.optionalString stdenv.isDarwin '' + # oldPath="$(pwd)/btparse/src/libbtparse.dylib" + # newPath="$out/lib/libbtparse.dylib" + + # install_name_tool -id "$newPath" "$newPath" + # install_name_tool -change "$oldPath" "$newPath" "$out/bin/biblex" + # install_name_tool -change "$oldPath" "$newPath" "$out/bin/bibparse" + # install_name_tool -change "$oldPath" "$newPath" "$out/bin/dumpnames" + # install_name_tool -change "$oldPath" "$newPath" "$out/${perl.libPrefix}/${perl.version}/darwin"*"-2level/auto/Text/BibTeX/BibTeX.bundle" + # ''; + # meta = { + # description = "Interface to read and parse BibTeX files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextBrew = buildPerlPackage { + # pname = "Text-Brew"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KC/KCIVEY/Text-Brew-0.02.tar.gz"; + # hash = "sha256-qhuFhBz5/G/jODZrvIcKTpMEonZB5j+Sof2Wvujr9kw="; + # }; + # meta = { + # description = "An implementation of the Brew edit distance"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextCharWidth = buildPerlPackage { + # pname = "Text-CharWidth"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KU/KUBOTA/Text-CharWidth-0.04.tar.gz"; + # hash = "sha256-q97V9P3ZM46J/S8dgnHESYna5b9Qrs5BthedjiMHBPg="; + # }; + # meta = { + # description = "Get number of occupied columns of a string on terminal"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextCSV = buildPerlPackage { + # pname = "Text-CSV"; + # version = "2.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IS/ISHIGAKI/Text-CSV-2.03.tar.gz"; + # hash = "sha256-SLvOnyNJNaiFlWGOBN0UFigkbWUPKnJgJN8cE34LZfs="; + # }; + # meta = { + # description = "Comma-separated values manipulator (using XS or PurePerl)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextCSVEncoded = buildPerlPackage { + # pname = "Text-CSV-Encoded"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZA/ZARQUON/Text-CSV-Encoded-0.25.tar.gz"; + # hash = "sha256-JIpZg6IN1XeGY56I2v3WVPO5OSVJASDW1xLaayvludA="; + # }; + # propagatedBuildInputs = [ TextCSV ]; + # meta = { + # description = "Encoding aware Text::CSV"; + # homepage = "https://github.com/singingfish/Text-CSV-Encoded"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextCSV_XS = buildPerlPackage { + # pname = "Text-CSV_XS"; + # version = "1.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HM/HMBRAND/Text-CSV_XS-1.52.tgz"; + # hash = "sha256-5BWqcFut+Es1ncTA8MmC8b9whIHaoUdW8xNufInA5B0="; + # }; + # meta = { + # description = "Comma-Separated Values manipulation routines"; + # homepage = "https://metacpan.org/pod/Text::CSV_XS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextDiff = buildPerlPackage { + # pname = "Text-Diff"; + # version = "1.45"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Text-Diff-1.45.tar.gz"; + # hash = "sha256-6Lqgexs/U+AK82NomLv3OuyaD/OPlFNu3h2+lu8IbwQ="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff ]; + # meta = { + # description = "Perform diffs on files and record sets"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextFormat = buildPerlModule { + # pname = "Text-Format"; + # version = "0.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Text-Format-0.62.tar.gz"; + # hash = "sha256-fUKQVzGeEjxZC6B2UzTwreSl656o23wOxNOQLeX5BAQ="; + # }; + # meta = { + # description = "Various subroutines to format text"; + # homepage = "https://github.com/shlomif/perl-Module-Format"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ bcdarwin ]; + # }; + # }; + + # TextDiffFormattedHTML = buildPerlPackage { + # pname = "Text-Diff-FormattedHTML"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AM/AMBS/Text-Diff-FormattedHTML-0.08.tar.gz"; + # hash = "sha256-Oat3WlwFZ0Xyq9jMfBy8VJbf735SqfS9itpqpsnHtw0="; + # }; + # propagatedBuildInputs = [ FileSlurp StringDiff ]; + # meta = { + # description = "Generate a colorful HTML diff of strings/files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # TextFuzzy = buildPerlPackage { + # pname = "Text-Fuzzy"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BK/BKB/Text-Fuzzy-0.29.tar.gz"; + # hash = "sha256-PfXP0soaTFyn/3urPMjVOtIGThNMvxEATzz4xLkFW/8="; + # }; + # meta = { + # description = "Partial string matching using edit distances"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextGerman = buildPerlPackage { + # pname = "Text-German"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/U/UL/ULPFR/Text-German-0.06.tar.gz"; + # hash = "sha256-ki1PGQEtl3OxH0pvZCEF6fkT9YZvRGG2BZymdNW7B90="; + # }; + # meta = { + # description = "German grundform reduction"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextGlob = buildPerlPackage { + # pname = "Text-Glob"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Text-Glob-0.11.tar.gz"; + # hash = "sha256-BpzNSdPwot7bEV9L3J+6wHqDWShAlT0fzfw5650wUoc="; + # }; + # meta = { + # description = "Match globbing patterns against text"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextHogan = buildPerlPackage { + # pname = "Text-Hogan"; + # version = "2.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAORU/Text-Hogan-2.03.tar.gz"; + # hash = "sha256-WNkj7eTFmEiI75u7JW2IVMxdIqRwikd0sxPLU4jFYXo="; + # }; + # propagatedBuildInputs = [ Clone RefUtil TextTrim ]; + # buildInputs = [ DataVisitor PathTiny TryTiny YAML ]; + # meta = { + # description = "Text::Hogan - A mustache templating engine statement-for-statement cloned from hogan.js"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextIconv = buildPerlPackage { + # pname = "Text-Iconv"; + # version = "1.7"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MP/MPIOTR/Text-Iconv-1.7.tar.gz"; + # hash = "sha256-W4C31ecJ00OTvLqIlxhkoXtEpb8PnkvO44PQKefS1cM="; + # }; + # meta = { + # description = "Perl interface to iconv() codeset conversion function"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; # taken from el6 + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.TextIconv.x86_64-darwin + # }; + # }; + + # TestInDistDir = buildPerlPackage { + # pname = "Test-InDistDir"; + # version = "1.112071"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MITHALDU/Test-InDistDir-1.112071.tar.gz"; + # hash = "sha256-kixcYzFPQG9MuzXsQjrCFU0sK3GmWt23cyydJAqD/vs="; + # }; + # meta = { + # description = "Test environment setup for development with IDE"; + # homepage = "https://github.com/wchristian/Test-InDistDir"; + # license = with lib.licenses; [ wtfpl ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # TestInter = buildPerlPackage { + # pname = "Test-Inter"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SB/SBECK/Test-Inter-1.10.tar.gz"; + # hash = "sha256-cewRXqwm+2aJGb1mQLQcNzInUuvUjBx222a3O679O10="; + # }; + # buildInputs = [ FileFindRule TestPod TestPodCoverage ]; + # meta = { + # description = "Framework for more readable interactive test scripts"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextLayout = buildPerlPackage { + # pname = "Text-Layout"; + # version = "0.031"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JV/JV/Text-Layout-0.031.tar.gz"; + # hash = "sha256-EQ4ObbzKIFhKcckNpxBYAdRrXXYd+QmsTfYQbDM3B34="; + # }; + # buildInputs = [ IOString PDFAPI2 ]; + # meta = { + # description = "Pango style markup formatting"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextLevenshteinXS = buildPerlPackage { + # pname = "Text-LevenshteinXS"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JG/JGOLDBERG/Text-LevenshteinXS-0.03.tar.gz"; + # hash = "sha256-43T/eyN5Gc5eqSRfNW0ctSzIf9JrOlo4s/Pl/4KgFJE="; + # }; + # meta = { + # description = "Levenshtein edit distance in a XS way"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextLorem = buildPerlPackage { + # pname = "Text-Lorem"; + # version = "0.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AD/ADEOLA/Text-Lorem-0.34.tar.gz"; + # hash = "sha256-DOajwZkXsjI0JKGqdC2YiwY8OUQEJ6MQGkzsbb2EcVc="; + # }; + # meta = { + # description = "Generate random Latin looking text"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # mainProgram = "lorem"; + # }; + # }; + + # TestManifest = buildPerlPackage { + # pname = "Test-Manifest"; + # version = "2.023"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Test-Manifest-2.023.tar.gz"; + # hash = "sha256-0k5SVT58uc2oH5L/6MkrPkNGcY5HEIAaWzW38lGnceI="; + # }; + # meta = { + # description = "Interact with a t/test_manifest file"; + # homepage = "https://github.com/briandfoy/test-manifest"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TextMarkdown = buildPerlPackage { + # pname = "Text-Markdown"; + # version = "1.000031"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BO/BOBTFISH/Text-Markdown-1.000031.tar.gz"; + # hash = "sha256-wZHG1ezrjLdcBWUZI2BmLSAtcWutB6IzxLMppChNxxs="; + # }; + # nativeBuildInputs = [ shortenPerlShebang ]; + # nativeCheckInputs = [ ListMoreUtils TestDifferences TestException ]; + # postInstall = '' + # shortenPerlShebang $out/bin/Markdown.pl + # ''; + # meta = { + # description = "Convert Markdown syntax to (X)HTML"; + # license = with lib.licenses; [ bsd3 ]; + # mainProgram = "Markdown.pl"; + # }; + # }; + + # TextMarkdownHoedown = buildPerlModule { + # pname = "Text-Markdown-Hoedown"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOKUHIROM/Text-Markdown-Hoedown-1.03.tar.gz"; + # hash = "sha256-U6cw/29IgrmavYVW8mqRH1gvZ1tZ8OFnJe0ey8CE7lA="; + # }; + # buildInputs = [ Filepushd ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Hoedown for Perl5"; + # homepage = "https://github.com/tokuhirom/Text-Markdown-Hoedown"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestMinimumVersion = buildPerlPackage { + # pname = "Test-MinimumVersion"; + # version = "0.101083"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Test-MinimumVersion-0.101083.tar.gz"; + # hash = "sha256-MqHrzYA/oQ7vylU7w87dQ1lqdZ3Dl1revSJoiCPDauo="; + # }; + # propagatedBuildInputs = [ PerlMinimumVersion ]; + # meta = { + # description = "Does your code require newer perl than you think?"; + # homepage = "https://github.com/rjbs/Test-MinimumVersion"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextMicroTemplate = buildPerlPackage { + # pname = "Text-MicroTemplate"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZUHO/Text-MicroTemplate-0.24.tar.gz"; + # hash = "sha256-MoAecfNe6Kqg1XbOwSXO5Gs9SRWuZCvGSWISDU+XtMg="; + # }; + # meta = { + # description = "Micro template engine with Perl5 language"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextMultiMarkdown = buildPerlPackage { + # pname = "Text-MultiMarkdown"; + # version = "1.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Text-MultiMarkdown-1.001.tar.gz"; + # hash = "sha256-UB1ErH2lSUSZzqhR6bL7UlOAgLDB6TYjDIwm1n4EhDM="; + # }; + # buildInputs = [ ListMoreUtils TestException ]; + # propagatedBuildInputs = [ HTMLParser TextMarkdown ]; + # meta = { + # description = "Convert MultiMarkdown syntax to (X)HTML"; + # license = with lib.licenses; [ bsd3 ]; + # mainProgram = "MultiMarkdown.pl"; + # }; + # }; + + # TestNumberDelta = buildPerlPackage { + # pname = "Test-Number-Delta"; + # version = "1.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Test-Number-Delta-1.06.tar.gz"; + # hash = "sha256-U1QwkZ5v32zlX/dumJKvzLo7fUFg20XzrEOw+S/80Ek="; + # }; + # meta = { + # description = "Compare the difference between numbers against a given tolerance"; + # homepage = "https://github.com/dagolden/Test-Number-Delta"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TextParsewords = buildPerlPackage { + # pname = "Text-ParseWords"; + # version = "3.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Text-ParseWords-3.31.tar.gz"; + # hash = "sha256-KuVVughNdbK4/u640aAJESdoFa2oa8yxRSI2lk1aL8c="; + # }; + # meta = { + # description = "Parse text into an array of tokens or array of arrays"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextPasswordPronounceable = buildPerlPackage { + # pname = "Text-Password-Pronounceable"; + # version = "0.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TS/TSIBLEY/Text-Password-Pronounceable-0.30.tar.gz"; + # hash = "sha256-wYalAlbgvt+vsX584VfnxS8ZUDu3nhjr8GJVkR9urRo="; + # }; + # meta = { + # description = "Generate pronounceable passwords"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextPatch = buildPerlPackage { + # pname = "Text-Patch"; + # version = "1.8"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CADE/Text-Patch-1.8.tar.gz"; + # hash = "sha256-6vGOYbpqPhQ4RqfMZvCM5YoMT72pKssxrt4lyztcPcw="; + # }; + # propagatedBuildInputs = [ TextDiff ]; + # meta = { + # description = "Patches text with given patch"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # TextPDF = buildPerlPackage { + # pname = "Text-PDF"; + # version = "0.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BH/BHALLISSY/Text-PDF-0.31.tar.gz"; + # hash = "sha256-359RXuFZgEsNWnXVrbk8RYTH7EAdjFnCfp9zkl2NrGg="; + # }; + # meta = { + # description = "Module for manipulating PDF files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextQuoted = buildPerlPackage { + # pname = "Text-Quoted"; + # version = "2.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BP/BPS/Text-Quoted-2.10.tar.gz"; + # hash = "sha256-CBv5XskiCvJs7IkWHmG/c/n7y/7uHZrxUTnl17cI9EU="; + # }; + # propagatedBuildInputs = [ TextAutoformat ]; + # meta = { + # description = "Extract the structure of a quoted mail message"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextRecordParser = buildPerlPackage { + # pname = "Text-RecordParser"; + # version = "1.6.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KC/KCLARK/Text-RecordParser-1.6.5.tar.gz"; + # hash = "sha256-2juBQUxj+NkhjRFnRaiLlIxGyYsYdjT2KYkuVAAbw1o="; + # }; + + # # In a NixOS chroot build, the tests fail because the font configuration + # # at /etc/fonts/font.conf is not available. + # doCheck = false; + + # propagatedBuildInputs = [ ClassAccessor IOStringy ListMoreUtils Readonly TextAutoformat ]; + # buildInputs = [ TestException ]; + # meta = { + # description = "Read record-oriented files"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # TextReflow = buildPerlPackage { + # pname = "Text-Reflow"; + # version = "1.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MW/MWARD/Text-Reflow-1.17.tar.gz"; + # hash = "sha256-S/ITn/YX1uWcwOWc3s18tyPs/SjVrDh6+1U//cBxuGA="; + # }; + # meta = { + # description = "Reflow text files using Knuth's paragraphing algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextReform = buildPerlModule { + # pname = "Text-Reform"; + # version = "1.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Text-Reform-1.20.tar.gz"; + # hash = "sha256-qHkt2MGqyXABAyM3s2o1a+luLXTE8DnvmjY7ZB20rmE="; + # }; + # meta = { + # description = "Manual text wrapping and reformatting"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextRoman = buildPerlPackage { + # pname = "Text-Roman"; + # version = "3.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SY/SYP/Text-Roman-3.5.tar.gz"; + # hash = "sha256-y0oIo7FRgC/7L84yWKQWVCq4HbD3Oe5HSpWD/7c+BGo="; + # }; + # meta = { + # description = "Allows conversion between Roman and Arabic algarisms"; + # homepage = "https://github.com/creaktive/Text-Roman"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextSimpleTable = buildPerlPackage { + # pname = "Text-SimpleTable"; + # version = "2.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/Text-SimpleTable-2.07.tar.gz"; + # hash = "sha256-JW0/OHZOljMxWLFKsYJXuS8xVcYNZYyvuAOJ9y9GGe0="; + # }; + # propagatedBuildInputs = [ UnicodeLineBreak ]; + # meta = { + # description = "Simple eyecandy ASCII tables"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TextSoundex = buildPerlPackage { + # pname = "Text-Soundex"; + # version = "3.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Text-Soundex-3.05.tar.gz"; + # hash = "sha256-9t1VtCgLJd6peCIYOYZDglYAdOHWkzOV+u4lEMLbYO0="; + # }; + # meta = { + # description = "Implementation of the soundex algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextSprintfNamed = buildPerlModule { + # pname = "Text-Sprintf-Named"; + # version = "0.0405"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Text-Sprintf-Named-0.0405.tar.gz"; + # hash = "sha256-m0cNeP/PxAqz+ZgjGzNrnTQXIw+3zlW0fNewVXOnD/w="; + # }; + # buildInputs = [ TestWarn ]; + # meta = { + # description = "Sprintf-like function with named conversions"; + # homepage = "https://metacpan.org/release/Text-Sprintf-Named"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # TextTable = buildPerlModule { + # pname = "Text-Table"; + # version = "1.135"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/Text-Table-1.135.tar.gz"; + # hash = "sha256-/KPBboMSf3xE3ePT9+PHPqUNEJoQVERd6Agv6nlMpdI="; + # }; + # propagatedBuildInputs = [ TextAligner ]; + # meta = { + # description = "Organize Data in Tables"; + # homepage = "https://metacpan.org/release/Text-Table"; + # license = with lib.licenses; [ isc ]; + # }; + # }; + + # TextTabularDisplay = buildPerlPackage { + # pname = "Text-TabularDisplay"; + # version = "1.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DARREN/Text-TabularDisplay-1.38.tar.gz"; + # hash = "sha256-6wmQ+vpWtmfyPbdkvdpaTcX0sd3EsTg6pe7W8i7Rhug="; + # }; + # meta = { + # description = "Display text in formatted table output"; + # license = with lib.licenses; [ gpl2Plus ]; + # }; + # }; + + # TextTemplate = buildPerlPackage { + # pname = "Text-Template"; + # version = "1.61"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHOUT/Text-Template-1.61.tar.gz"; + # hash = "sha256-opXqfR7yQa4mQMH3hktij45vmewU+x2ngbL18haNzwk="; + # }; + # buildInputs = [ TestMoreUTF8 TestWarnings ]; + # meta = { + # description = "Expand template text with embedded Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestTrap = buildPerlModule { + # pname = "Test-Trap"; + # version = "0.3.5"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/EB/EBHANSSEN/Test-Trap-v0.3.5.tar.gz"; + # hash = "sha256-VPmQFlYrWx1yEQEA8fK+Q3F4zfhDdvSV/9A3bx1+y5o="; + # }; + # propagatedBuildInputs = [ DataDump ]; + # meta = { + # description = "Trap exit codes, exceptions, output, etc"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestVars = buildPerlModule { + # pname = "Test-Vars"; + # version = "0.015"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GF/GFUJI/Test-Vars-0.015.tar.gz"; + # hash = "sha256-4Y3RWCcuTsmTnh37M8dDGrTnXGtAsoDDi16AT9pHGlQ="; + # }; + + # buildInputs = [ ModuleBuildTiny ]; + + # meta = { + # description = "Detects unused variables in perl modules"; + # homepage = "https://github.com/houseabsolute/p5-Test-Vars"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TestVersion = buildPerlPackage { + # pname = "Test-Version"; + # version = "2.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test-Version-2.09.tar.gz"; + # hash = "sha256-nOHdKJel8w4bf4lm7Gb1fY2PKA9gXyjHyiIfp5rKOOA="; + # }; + # buildInputs = [ TestException ]; + # propagatedBuildInputs = [ FileFindRulePerl ]; + # meta = { + # description = "Check to see that version's in modules are sane"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TextTrim = buildPerlPackage { + # pname = "Text-Trim"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJT/Text-Trim-1.04.tar.gz"; + # hash = "sha256-1YeKkHnTPNF2bParxEzWJb0AoCE9LOjjFD/mlEq6qhE="; + # }; + # meta = { + # description = "Remove leading and/or trailing whitespace from strings"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextUnaccent = buildPerlPackage { + # pname = "Text-Unaccent"; + # version = "1.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LD/LDACHARY/Text-Unaccent-1.08.tar.gz"; + # hash = "sha256-J45u/Jsk82mclh77NuvmAqNAi1QVcgF97hMdFScocys="; + # }; + # # https://rt.cpan.org/Public/Bug/Display.html?id=124815 + # env.NIX_CFLAGS_COMPILE = "-DHAS_VPRINTF"; + # meta = { + # description = "Remove accents from a string"; + # license = with lib.licenses; [ gpl2Only ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.TextUnaccent.x86_64-darwin + # }; + # }; + + # TextUnidecode = buildPerlPackage { + # pname = "Text-Unidecode"; + # version = "1.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SB/SBURKE/Text-Unidecode-1.30.tar.gz"; + # hash = "sha256-bCTxTdwdIOJhYcIHtzyhhO7S71fwi1+y7hlubi6IscY="; + # }; + # meta = { + # description = "Plain ASCII transliterations of Unicode tex"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Testutf8 = buildPerlPackage { + # pname = "Test-utf8"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKF/Test-utf8-1.02.tar.gz"; + # hash = "sha256-34LwnFlAgwslpJ8cgWL6JNNx5gKIDt742aTUv9Zri9c="; + # }; + # meta = { + # description = "Handy utf8 tests"; + # homepage = "https://github.com/2shortplanks/Test-utf8/tree"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextNSP = buildPerlPackage { + # pname = "Text-NSP"; + # version = "1.31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TP/TPEDERSE/Text-NSP-1.31.tar.gz"; + # hash = "sha256-oBIBvrKWNrPkHs2ips9lIv0mVBa9bZlPrQL1n7Sc9ZU="; + # }; + # meta = { + # description = "Extract collocations and Ngrams from text"; + # license = with lib.licenses; [ gpl2Plus ]; + # maintainers = [ maintainers.bzizou ]; + # }; + # }; + + # TextvFileasData = buildPerlPackage { + # pname = "Text-vFile-asData"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCLAMP/Text-vFile-asData-0.08.tar.gz"; + # hash = "sha256-spGrXg+YfFFyVgppIjRxGnXkWW2DR19y0BJ4NpUy+Co="; + # }; + # propagatedBuildInputs = [ ClassAccessorChained ]; + # meta = { + # description = "Parse vFile formatted files into data structures"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextWikiFormat = buildPerlModule { + # pname = "Text-WikiFormat"; + # version = "0.81"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CY/CYCLES/Text-WikiFormat-0.81.tar.gz"; + # hash = "sha256-5DzZla2RV6foOdmT7ntsTRhUlH5VfQltnVqvdFB/qzM="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Module for translating Wiki formatted text into other formats"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextWordDiff = buildPerlPackage { + # pname = "Text-WordDiff"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TIMK/Text-WordDiff-0.09.tar.gz"; + # hash = "sha256-/uaZynY63KL04Y9KioNv0hArwoIK9wj460M1bVrg1Q4="; + # }; + # propagatedBuildInputs = [ AlgorithmDiff HTMLParser ]; + # meta = { + # description = "Track changes between documents"; + # homepage = "https://metacpan.org/release/Text-WordDiff"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextWrapI18N = buildPerlPackage { + # pname = "Text-WrapI18N"; + # version = "0.06"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KU/KUBOTA/Text-WrapI18N-0.06.tar.gz"; + # hash = "sha256-S9KaF/DCx5LRLBAFs8J28qsPrjnACFmuF0HXlBhGpIg="; + # }; + # buildInputs = lib.optionals (!stdenv.isDarwin) [ pkgs.glibcLocales ]; + # propagatedBuildInputs = [ TextCharWidth ]; + # preConfigure = '' + # substituteInPlace WrapI18N.pm --replace '/usr/bin/locale' '${pkgs.unixtools.locale}/bin/locale' + # ''; + # meta = { + # description = "Line wrapping module with support for multibyte, fullwidth, and combining characters and languages without whitespaces between words"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TextWrapper = buildPerlPackage { + # pname = "Text-Wrapper"; + # version = "1.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CJ/CJM/Text-Wrapper-1.05.tar.gz"; + # hash = "sha256-ZCaOFZg6nfR+HZGZpJHzlOifVC5Ur7M/S3jz8xjgmrk="; + # }; + # buildInputs = [ TestDifferences ]; + # meta = { + # description = "Word wrap text by breaking long lines"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Throwable = buildPerlPackage { + # pname = "Throwable"; + # version = "1.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/Throwable-1.001.tar.gz"; + # hash = "sha256-0MtenX0G1w8sxW7s+FeoOkXqykOFDc3akdP+tN3eTFE="; + # }; + # propagatedBuildInputs = [ DevelStackTrace Moo ]; + # meta = { + # description = "A role for classes that can be thrown"; + # homepage = "https://github.com/rjbs/Throwable"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieCacheLRU = buildPerlPackage { + # pname = "Tie-Cache-LRU"; + # version = "20150301"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/Tie-Cache-LRU-20150301.tar.gz"; + # hash = "sha256-G/dARQ06bXwStIwl99pZZOROfMOLKFcs+3b/IkZPRGk="; + # }; + # propagatedBuildInputs = [ ClassVirtual enum ]; + # meta = { + # description = "A Least-Recently Used cache"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieCacheLRUExpires = buildPerlPackage { + # pname = "Tie-Cache-LRU-Expires"; + # version = "0.55"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/O/OE/OESTERHOL/Tie-Cache-LRU-Expires-0.55.tar.gz"; + # hash = "sha256-sxbYSazSXyQ0bVWplQ0oH+4HRjmHZ8YBI0EiFZVz65o="; + # }; + # propagatedBuildInputs = [ TieCacheLRU ]; + # meta = { + # description = "Extends Tie::Cache::LRU with expiring"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # TieCycle = buildPerlPackage { + # pname = "Tie-Cycle"; + # version = "1.227"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BD/BDFOY/Tie-Cycle-1.227.tar.gz"; + # hash = "sha256-eDgzV5HnGjszuKGd4wUpSeGJCkgj3vY5eCPJkiL6Hdg="; + # }; + # meta = { + # description = "Cycle through a list of values via a scalar"; + # homepage = "https://github.com/briandfoy/tie-cycle"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # TieEncryptedHash = buildPerlPackage { + # pname = "Tie-EncryptedHash"; + # version = "1.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VI/VIPUL/Tie-EncryptedHash-1.24.tar.gz"; + # hash = "sha256-qpoIOiMeQEYXCliUZE48WWecfb0KotEhfchRUN8sHiE="; + # }; + # propagatedBuildInputs = [ CryptBlowfish CryptCBC CryptDES ]; + # meta = { + # description = "Hashes (and objects based on hashes) with encrypting fields"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # TieFile = buildPerlPackage { + # pname = "Tie-File"; + # version = "1.07"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/Tie-File-1.07.tar.gz"; + # hash = "sha256-S1NUpB/pVBvc6lK0/VMBRPMVME0D8F3Q/vwynYHCawg="; + # }; + # meta = { + # description = "Access the lines of a disk file via a Perl array"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieIxHash = buildPerlModule { + # pname = "Tie-IxHash"; + # version = "1.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHORNY/Tie-IxHash-1.23.tar.gz"; + # hash = "sha256-+rsLjJfmfJs0tswY7Wb2xeAcVbJX3PAHVV4LAn1Mr1Y="; + # }; + # meta = { + # description = "Ordered associative arrays for Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieHandleOffset = buildPerlPackage { + # pname = "Tie-Handle-Offset"; + # version = "0.004"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/Tie-Handle-Offset-0.004.tar.gz"; + # hash = "sha256-7p85BV3GlaokSiUvVv/Tf4vgcgmzN604eCRyEgbSqJ4="; + # }; + # meta = { + # description = "Tied handle that hides the beginning of a file"; + # homepage = "https://github.com/dagolden/tie-handle-offset"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # TieHashIndexed = buildPerlPackage { + # pname = "Tie-Hash-Indexed"; + # version = "0.08"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MH/MHX/Tie-Hash-Indexed-0.08.tar.gz"; + # hash = "sha256-N7xigV9ahIrHeRK5v0eIqfJyiE6DpS4gk9q0qDpKexA="; + # }; + # doCheck = false; /* test fails on some machines */ + # meta = { + # description = "Ordered hashes for Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieHashMethod = buildPerlPackage { + # pname = "Tie-Hash-Method"; + # version = "0.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Y/YV/YVES/Tie-Hash-Method-0.02.tar.gz"; + # hash = "sha256-1RP7tRQT98oeZKG9zmGU337GB23qVQZtZ7lQGR7sMqk="; + # }; + # meta = { + # description = "Tied hash with specific methods overriden by callbacks"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # TieRefHash = buildPerlPackage { + # pname = "Tie-RefHash"; + # version = "1.40"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/Tie-RefHash-1.40.tar.gz"; + # hash = "sha256-Ws8fUY0vtfYgyq16Gy/x9vdRb++PQLprdD7si5aSftc="; + # }; + # meta = { + # description = "Use references as hash keys"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieRegexpHash = buildPerlPackage { + # pname = "Tie-RegexpHash"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AL/ALTREUS/Tie-RegexpHash-0.17.tar.gz"; + # hash = "sha256-DCB4UOd++xZhjgqgFVB5JqNCWzSq1apuPkDYOYmghaM="; + # }; + # meta = { + # description = "Use regular expressions as hash keys"; + # license = with lib.licenses; [ artistic1 ]; + # }; + # }; + + # TieSimple = buildPerlPackage { + # pname = "Tie-Simple"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HANENKAMP/Tie-Simple-1.04.tar.gz"; + # hash = "sha256-KeniEzlRBGx48gXxs+jfYskOEU8OCPoGuBd2ag+AixI="; + # }; + # meta = { + # description = "Variable ties made much easier: much, much, much easier.."; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieSub = buildPerlPackage { + # pname = "Tie-Sub"; + # version = "1.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STEFFENW/Tie-Sub-1.001.tar.gz"; + # hash = "sha256-73GgSCbRNisrduyyHOFzw304pHqf7Cg6qYJDWJD08bE="; + # }; + # propagatedBuildInputs = [ ParamsValidate ]; + # buildInputs = [ ModuleBuild TestDifferences TestException TestNoWarnings ]; + # meta = { + # description = "Tie::Sub - Tying a subroutine, function or method to a hash"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TieToObject = buildPerlPackage { + # pname = "Tie-ToObject"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NU/NUFFIN/Tie-ToObject-0.03.tar.gz"; + # hash = "sha256-oxoNRDD+FPWWIvMdt/JbInXa0uxS8QQL6wMNPoOtOvQ="; + # }; + # meta = { + # description = "Tie to an existing object"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TimeDate = buildPerlPackage { + pname = "TimeDate"; + version = "2.33"; + src = fetchurl { + url = "mirror://cpan/authors/id/A/AT/ATOOMIC/TimeDate-2.33.tar.gz"; + hash = "sha256-wLacSwOd5vUBsNnxPsWMhrBAwffpsn7ySWUcFD1gXrI="; + }; + meta = { + description = "Miscellaneous timezone manipulations routines"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TimeDuration = buildPerlPackage { + # pname = "Time-Duration"; + # version = "1.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Time-Duration-1.21.tar.gz"; + # hash = "sha256-/jQOuodl+SY2lGdOXf8UgzRD4Zhl5f9Ce715t7X4qbg="; + # }; + # meta = { + # description = "Rounded or exact English expression of durations"; + # homepage = "https://github.com/neilbowers/Time-Duration"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TimeDurationParse = buildPerlPackage { + # pname = "Time-Duration-Parse"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/Time-Duration-Parse-0.16.tar.gz"; + # hash = "sha256-EISmRj7ieQ+ZIVvXaxNcpFr+K/ppmPpv1UcLaeG6vBI="; + # }; + # buildInputs = [ TimeDuration ]; + # propagatedBuildInputs = [ ExporterLite ]; + # meta = { + # description = "Parse string that represents time duration"; + # homepage = "https://github.com/neilb/Time-Duration-Parse"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TimeLocal = buildPerlPackage { + # pname = "Time-Local"; + # version = "1.35"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Time-Local-1.35.tar.gz"; + # hash = "sha256-HRNrcb0EHL5vZsQxgO555nW3KtWjWWq9akTSEQcq2ik="; + # }; + # meta = { + # description = "Efficiently compute time from local and GMT time"; + # homepage = "https://metacpan.org/release/Time-Local"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TimeMoment = buildPerlPackage { + # pname = "Time-Moment"; + # version = "0.44"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/Time-Moment-0.44.tar.gz"; + # hash = "sha256-ZKz6BC9jT8742t9V5/QrpOqriq631SEuuJgVox949v0="; + # }; + # buildInputs = [ TestFatal TestNumberDelta TestRequires ]; + # meta = { + # description = "Represents a date and time of day with an offset from UTC"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TimeOut = buildPerlPackage { + # pname = "Time-Out"; + # version = "0.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PA/PATL/Time-Out-0.11.tar.gz"; + # hash = "sha256-k5baaY/UUtnOYNZCzaIQjxHyDtdsiWF3muEbiXroFdI="; + # }; + # meta = { + # description = "Easily timeout long running operations"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TimeParseDate = buildPerlPackage { + # pname = "Time-ParseDate"; + # version = "2015.103"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MU/MUIR/modules/Time-ParseDate-2015.103.tar.gz"; + # hash = "sha256-LBoGI1v4EYE8qsnqqdqnGvdYZnzfewgstZhjIg/K7tE="; + # }; + # doCheck = false; + # meta = { + # description = "Parse and format time values"; + # license = with lib.licenses; [ publicDomain ]; + # }; + # }; + + # TimePeriod = buildPerlPackage { + # pname = "Time-Period"; + # version = "1.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PB/PBOYD/Time-Period-1.25.tar.gz"; + # hash = "sha256-0H+lgFKb6sapyCdMa/IgtMOq3mhd9lwWadUzOb9u8eg="; + # }; + # meta = { + # description = "A Perl module to deal with time periods"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.winpat ]; + # }; + # }; + + # TimePiece = buildPerlPackage { + # pname = "Time-Piece"; + # version = "1.3401"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ES/ESAYM/Time-Piece-1.3401.tar.gz"; + # hash = "sha256-S1W3uw6rRc8jmlTf6tJ336BhIaQ+Y7P84IU67P2wTCc="; + # }; + # meta = { + # description = "Object Oriented time objects"; + # homepage = "https://metacpan.org/release/Time-Piece"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # Tirex = callPackage ./perl-modules/Tirex { }; + + # Tk = buildPerlPackage { + # pname = "Tk"; + # version = "804.036"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SR/SREZIC/Tk-804.036.tar.gz"; + # hash = "sha256-Mqpycaa9/twzMBGbOCXa3dCqS1yTb4StdOq7kyogCl4="; + # }; + # patches = [ + # # Fix failing configure test due to implicit int return value of main, which results + # # in an error with clang 16. + # ./perl-modules/tk-configure-implicit-int-fix.patch + # ]; + # makeMakerFlags = [ "X11INC=${pkgs.xorg.libX11.dev}/include" "X11LIB=${pkgs.xorg.libX11.out}/lib" ]; + # buildInputs = [ pkgs.xorg.libX11 pkgs.libpng ]; + # doCheck = false; # Expects working X11. + # meta = { + # description = "Tk - a Graphical User Interface Toolkit"; + # license = with lib.licenses; [ tcltk ]; + # }; + # }; + + # TkToolBar = buildPerlPackage { + # pname = "Tk-ToolBar"; + # version = "0.12"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AS/ASB/Tk-ToolBar-0.12.tar.gz"; + # hash = "sha256-Rj4oTsRxN+fEJclpGwKo3sXOJytY6h9jWa6AQaI53Q8="; + # }; + # makeMakerFlags = [ "X11INC=${pkgs.xorg.libX11.dev}/include" "X11LIB=${pkgs.xorg.libX11.out}/lib" ]; + # buildInputs = [ Tk ]; + # doCheck = false; # Expects working X11. + # meta = { + # description = "A toolbar widget for Perl/Tk"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TreeDAGNode = buildPerlPackage { + # pname = "Tree-DAG_Node"; + # version = "1.32"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSAVAGE/Tree-DAG_Node-1.32.tgz"; + # hash = "sha256-ItnePW5vSv2J5tglxmT5SCh4vUninLgTQqcHr0BULT0="; + # }; + # propagatedBuildInputs = [ FileSlurpTiny ]; + # meta = { + # description = "An N-ary tree"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TreeSimple = buildPerlPackage { + # pname = "Tree-Simple"; + # version = "1.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSAVAGE/Tree-Simple-1.34.tgz"; + # hash = "sha256-t+l5m9Iiu5TP+ZP312WYDL6hts0qql7L6tY1q99H0pw="; + # }; + # buildInputs = [ TestException ]; + # meta = { + # description = "A simple tree object"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TreeSimpleVisitorFactory = buildPerlPackage { + # pname = "Tree-Simple-VisitorFactory"; + # version = "0.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RS/RSAVAGE/Tree-Simple-VisitorFactory-0.16.tgz"; + # hash = "sha256-nPU4+qEsVP+0qRQ5lF5IjxhW9iuJrFByqSIRngGIDaY="; + # }; + # propagatedBuildInputs = [ TreeSimple ]; + # buildInputs = [ TestException ]; + # meta = { + # description = "A factory object for dispensing Visitor objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + TryTiny = buildPerlPackage { + pname = "Try-Tiny"; + version = "0.31"; + src = fetchurl { + url = "mirror://cpan/authors/id/E/ET/ETHER/Try-Tiny-0.31.tar.gz"; + hash = "sha256-MwDTHYpAdbJtj0bOhkodkT4OhGfO66ZlXV0rLiBsEb4="; + }; + buildInputs = [ CPANMetaCheck CaptureTiny ]; + meta = { + description = "Minimal try/catch with proper preservation of $@"; + homepage = "https://github.com/p5sagit/Try-Tiny"; + license = with lib.licenses; [ mit ]; + }; + }; + + # TryTinyByClass = buildPerlPackage { + # pname = "Try-Tiny-ByClass"; + # version = "0.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MAUKE/Try-Tiny-ByClass-0.01.tar.gz"; + # hash = "sha256-A45O9SkpXyacKA/vmZpeTbkVaULwkaw8rXabHkVw8UY="; + # }; + # propagatedBuildInputs = [ DispatchClass TryTiny ]; + # meta = { + # description = "Selectively catch exceptions by class name"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Twiggy = buildPerlPackage { + # pname = "Twiggy"; + # version = "0.1026"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Twiggy-0.1026.tar.gz"; + # hash = "sha256-TZHqbtmumo70MU3Cp89S6wJrNlvmg4azXqaGTfrFf54="; + # }; + # propagatedBuildInputs = [ AnyEvent Plack ]; + # buildInputs = [ TestRequires TestSharedFork TestTCP ]; + # meta = { + # description = "AnyEvent HTTP server for PSGI"; + # homepage = "https://github.com/miyagawa/Twiggy"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "twiggy"; + # }; + # }; + + TypeTiny = buildPerlPackage { + pname = "Type-Tiny"; + version = "2.004000"; + src = fetchurl { + url = "mirror://cpan/authors/id/T/TO/TOBYINK/Type-Tiny-2.004000.tar.gz"; + hash = "sha256-aX5/d17fyF9M8HeS0E/RmwnCUoX5j1k46O/E90UHoSg="; + }; + propagatedBuildInputs = [ ExporterTiny ]; + buildInputs = [ TestMemoryCycle ]; + meta = { + description = "Tiny, yet Moo(se)-compatible type constraint"; + homepage = "https://typetiny.toby.ink"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # TypeTinyXS = buildPerlPackage { + # pname = "Type-Tiny-XS"; + # version = "0.025"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TOBYINK/Type-Tiny-XS-0.025.tar.gz"; + # hash = "sha256-mmFFDdqQKU9gbNej+kTzsaNmvNiKQZkXsFTuXiPRSL0="; + # }; + # meta = { + # description = "Provides an XS boost for some of Type::Tiny's built-in type constraints"; + # homepage = "https://metacpan.org/release/Type-Tiny-XS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # TypesSerialiser = buildPerlPackage { + # pname = "Types-Serialiser"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/ML/MLEHMANN/Types-Serialiser-1.01.tar.gz"; + # hash = "sha256-+McXOwkU0OPZVyggd7Nm8MjHAlZxXq7zKY/zK5I4ioA="; + # }; + # propagatedBuildInputs = [ commonsense ]; + # meta = { + # description = "Simple data types for common serialisation formats"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UNIVERSALcan = buildPerlPackage { + # pname = "UNIVERSAL-can"; + # version = "1.20140328"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHROMATIC/UNIVERSAL-can-1.20140328.tar.gz"; + # hash = "sha256-Ui2p8nR4b+LLqZvHfMHIHSFhlHkD1/rRC9Yt+38RmQ8="; + # }; + # meta = { + # description = "Work around buggy code calling UNIVERSAL::can() as a function"; + # homepage = "https://github.com/chromatic/UNIVERSAL-can"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UNIVERSALisa = buildPerlPackage { + # pname = "UNIVERSAL-isa"; + # version = "1.20171012"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/UNIVERSAL-isa-1.20171012.tar.gz"; + # hash = "sha256-0WlWA2ywHIGd7H0pT274kb4Ltkh2mJYBNUspMWTafys="; + # }; + # meta = { + # description = "Attempt to recover from people calling UNIVERSAL::isa as a function"; + # homepage = "https://github.com/karenetheridge/UNIVERSAL-isa"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UNIVERSALrequire = buildPerlPackage { + # pname = "UNIVERSAL-require"; + # version = "0.19"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEILB/UNIVERSAL-require-0.19.tar.gz"; + # hash = "sha256-1GfNJuBsjDsgP9O8B5aubIN6xeMQCTyCJn/134UPGgM="; + # }; + # meta = { + # description = "Require() modules from a variable [deprecated]"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UnicodeCaseFold = buildPerlModule { + # pname = "Unicode-CaseFold"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AR/ARODLAND/Unicode-CaseFold-1.01.tar.gz"; + # hash = "sha256-QYohKAj50Li7MwrJBQltLdNkl2dT1McVNNq5g2pjGU0="; + # }; + # perlPreHook = lib.optionalString stdenv.isi686 "export LD=$CC"; # fix undefined reference to `__stack_chk_fail_local' + # meta = { + # description = "Unicode case-folding for case-insensitive lookups"; + # homepage = "https://metacpan.org/release/Unicode-CaseFold"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UnicodeCheckUTF8 = buildPerlPackage { + # pname = "Unicode-CheckUTF8"; + # version = "1.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BR/BRADFITZ/Unicode-CheckUTF8-1.03.tar.gz"; + # hash = "sha256-l/hNrwM+ubSc2P4x2yIf7wNaXC7h11fzEiyIz5diQUw="; + # }; + # meta = { + # description = "Checks if scalar is valid UTF-8"; + # license = with lib.licenses; [ ucd /* and */ artistic1 gpl1Plus ]; + # }; + # }; + + # UnicodeLineBreak = buildPerlPackage { + # pname = "Unicode-LineBreak"; + # version = "2019.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/N/NE/NEZUMI/Unicode-LineBreak-2019.001.tar.gz"; + # hash = "sha256-SGdi5MrN3Md7E5ifl5oCn4RjC4F15/7xeYnhV9S2MYo="; + # }; + # propagatedBuildInputs = [ MIMECharset ]; + # meta = { + # description = "UAX #14 Unicode Line Breaking Algorithm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UnicodeString = buildPerlPackage { + # pname = "Unicode-String"; + # version = "2.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/GAAS/Unicode-String-2.10.tar.gz"; + # hash = "sha256-iUoRDs5HlUaviv7Aly7scyDIbE3qTms1Tf88dSa6m2g="; + # }; + # meta = { + # description = "String of Unicode characters (UTF-16BE)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UnicodeStringprep = buildPerlModule { + # pname = "Unicode-Stringprep"; + # version = "1.105"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CF/CFAERBER/Unicode-Stringprep-1.105.tar.gz"; + # hash = "sha256-5r67xYQIIx/RMX25ECRJs+faT6Q3559jc4LTYxPv0BE="; + # }; + # buildInputs = [ TestNoWarnings ]; + # meta = { + # description = "Preparation of Internationalized Strings (RFC 3454)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # UnicodeUTF8 = buildPerlPackage { + # pname = "Unicode-UTF8"; + # version = "0.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CH/CHANSEN/Unicode-UTF8-0.62.tar.gz"; + # hash = "sha256-+oci0LdGluMy/d1EKZRDbqk9O/x5gtS6vc7f3dZX0PY="; + # }; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Encoding and decoding of UTF-8 encoding form"; + # homepage = "https://github.com/chansen/p5-unicode-utf8"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = with maintainers; [ sgo ]; + # }; + # }; + + # UnixGetrusage = buildPerlPackage { + # pname = "Unix-Getrusage"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TA/TAFFY/Unix-Getrusage-0.03.tar.gz"; + # hash = "sha256-ds3hzuJFMmC4WrvdwnzcmHXwHSRX4XbgPcq/BftETRI="; + # }; + # meta = { + # description = "Perl interface to the Unix getrusage system call"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + URI = buildPerlPackage { + pname = "URI"; + version = "5.21"; + src = fetchurl { + url = "mirror://cpan/authors/id/O/OA/OALDERS/URI-5.21.tar.gz"; + hash = "sha256-liZYYM1hveFuhBXc+/EIBW3hYsqgrDf4HraVydLgq3c="; + }; + buildInputs = [ TestFatal TestNeeds TestWarnings ]; + meta = { + description = "Uniform Resource Identifiers (absolute and relative)"; + homepage = "https://github.com/libwww-perl/URI"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # URIdb = buildPerlModule { + # pname = "URI-db"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DW/DWHEELER/URI-db-0.21.tar.gz"; + # hash = "sha256-pkM9wVF6kH4YmRKkx2td/HYzLj/X/Is4oTfkAZx4CzQ="; + # }; + # propagatedBuildInputs = [ URINested ]; + # meta = { + # description = "Database URIs"; + # homepage = "https://search.cpan.org/dist/URI-db"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URIFind = buildPerlModule { + # pname = "URI-Find"; + # version = "20160806"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSCHWERN/URI-Find-20160806.tar.gz"; + # hash = "sha256-4hOkJaUbX1UyQhHzeQnXh0nQus3qJZulGphV0NGWY9Y="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Find URIs in arbitrary text"; + # homepage = "https://metacpan.org/release/URI-Find"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "urifind"; + # }; + # }; + + # URIFromHash = buildPerlPackage { + # pname = "URI-FromHash"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/URI-FromHash-0.05.tar.gz"; + # hash = "sha256-p8rFvM7p8uLYrQ9gVAAWNxLNCsZN8vuDT3YPtJ8vb9A="; + # }; + # propagatedBuildInputs = [ ParamsValidate URI ]; + # buildInputs = [ TestFatal ]; + # meta = { + # description = "Build a URI from a set of named parameters"; + # homepage = "https://metacpan.org/release/URI-FromHash"; + # license = with lib.licenses; [ artistic2 ]; + # }; + # }; + + # UriGoogleChart = buildPerlPackage { + # pname = "URI-GoogleChart"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GA/GAAS/URI-GoogleChart-1.02.tar.gz"; + # hash = "sha256-WoLCLsYBejXQ/IJv7xNBIiaHL8SiPA4sAUqfqS8rGAI="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Generate Google Chart URIs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UserIdentity = buildPerlPackage { + # pname = "User-Identity"; + # version = "1.02"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/User-Identity-1.02.tar.gz"; + # hash = "sha256-OySu5/UnjGXD8EEVsHyG5kaTTpnqQJJANj8wiZE+uJk="; + # }; + # propagatedBuildInputs = [ HashOrdered ]; + # meta = { + # description = "Collect information about a user"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URIIMAP = buildPerlPackage { + # pname = "URI-imap"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CW/CWEST/URI-imap-1.01.tar.gz"; + # hash = "sha256-uxSZiW7ONKe08JFinC5yw2imcwDoVzqyIZjJ2HI1uy0="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Support IMAP URI"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URINested = buildPerlModule { + # pname = "URI-Nested"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DW/DWHEELER/URI-Nested-0.10.tar.gz"; + # hash = "sha256-4ZcTOaZfusY6uHFC1LWdPSWdUUF3U8d8tY6jGoIz768="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Nested URIs"; + # homepage = "https://metacpan.org/release/URI-Nested"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URISmartURI = buildPerlPackage { + # pname = "URI-SmartURI"; + # version = "0.032"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RK/RKITOVER/URI-SmartURI-0.032.tar.gz"; + # hash = "sha256-6xdLeUYi4UK30JT2p+Nqe6T8i7zySF4QPuPaNevMTyw="; + # }; + # propagatedBuildInputs = [ ClassC3Componentised FileFindRule ListMoreUtils Moose URI namespaceclean ]; + # buildInputs = [ TestFatal TestNoWarnings ]; + # meta = { + # description = "Subclassable and hostless URIs"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URITemplate = buildPerlPackage { + # pname = "URI-Template"; + # version = "0.24"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BR/BRICAS/URI-Template-0.24.tar.gz"; + # hash = "sha256-aK4tYbV+FNytD4Kvr/3F7AW1B6HpyN9aphOKqipbEd4="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "Object for handling URI templates (RFC 6570)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URIcpan = buildPerlPackage { + # pname = "URI-cpan"; + # version = "1.009"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RJ/RJBS/URI-cpan-1.009.tar.gz"; + # hash = "sha256-JFV5sCW2P1d8cndDARmEcjhxykDcNezsjq05riSkjhI="; + # }; + # propagatedBuildInputs = [ CPANDistnameInfo URI ]; + # meta = { + # description = "URLs that refer to things on the CPAN"; + # homepage = "https://github.com/rjbs/URI-cpan"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # URIws = buildPerlPackage { + # pname = "URI-ws"; + # version = "0.03"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PL/PLICEASE/URI-ws-0.03.tar.gz"; + # hash = "sha256-bmsOQXKstqU8IiY5wABgjC3WHVCEhkdIKshgDVDlQe8="; + # }; + # propagatedBuildInputs = [ URI ]; + # meta = { + # description = "WebSocket support for URI package"; + # homepage = "http://perl.wdlabs.com/URI-ws"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UUID4Tiny = buildPerlPackage { + # pname = "UUID4-Tiny"; + # version = "0.003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CV/CVLIBRARY/UUID4-Tiny-0.003.tar.gz"; + # hash = "sha256-4S9sgrg1dcORd3O0HA+1HPeDx8bPcuDJkWks4u8Hg2I="; + # }; + # postPatch = lib.optionalString (stdenv.isAarch64) '' + # # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h + # # printf SYS_getrandom | gcc -include sys/syscall.h -E - + # substituteInPlace lib/UUID4/Tiny.pm \ + # --replace "syscall( 318" "syscall( 278" + # ''; + # meta = { + # description = "Cryptographically secure v4 UUIDs for Linux x64"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # platforms = lib.platforms.linux; # configure phase fails with "OS unsupported" + # }; + # }; + + # UUIDTiny = buildPerlPackage { + # pname = "UUID-Tiny"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CA/CAUGUSTIN/UUID-Tiny-1.04.tar.gz"; + # hash = "sha256-bc2SYE1k6WzGwYgZSuFqnTpGVWIk93tvPR0TEraPmj0="; + # }; + # meta = { + # description = "Pure Perl UUID Support With Functional Interface"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # UUIDURandom = buildPerlPackage { + # pname = "UUID-URandom"; + # version = "0.001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DA/DAGOLDEN/UUID-URandom-0.001.tar.gz"; + # hash = "sha256-PxNjGxO5YE+0ieKYlJDJnxA3Q6g3I5va+unWuvVfj0Y="; + # }; + # propagatedBuildInputs = [ CryptURandom ]; + # meta = { + # description = "UUIDs based on /dev/urandom or the Windows Crypto API"; + # homepage = "https://github.com/dagolden/UUID-URandom"; + # license = with lib.licenses; [ asl20 ]; + # }; + # }; + + # VariableMagic = buildPerlPackage { + # pname = "Variable-Magic"; + # version = "0.63"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/V/VP/VPIT/Variable-Magic-0.63.tar.gz"; + # hash = "sha256-ukCDssMf8mlPI3EzPVVMgmqvJLTZjQPki1tKQ6Kg5nk="; + # }; + # meta = { + # description = "Associate user-defined magic to variables from Perl"; + # homepage = "https://search.cpan.org/dist/Variable-Magic"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Version = buildPerlPackage { + # pname = "version"; + # version = "0.9930"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LE/LEONT/version-0.9930.tar.gz"; + # hash = "sha256-YduVX7yzn1kC+myLlXrrJ0HiPUhA+Eq/hGrx9nCu7jA="; + # }; + # meta = { + # description = "Structured version objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # vidir = buildPerlPackage { + # pname = "App-vidir"; + # version = "0.052"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/W/WO/WOLDRICH/App-vidir-0.052.tar.gz"; + # hash = "sha256-GSKQdqXxPvGe1sEbu5Bcrc4iYH+pDoXJrxqqKbWsFQo="; + # }; + # outputs = [ "out" ]; + # meta = { + # description = "File manager USING vim itself"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.chreekat ]; + # mainProgram = "vidir"; + # }; + # }; + + # VMEC2 = buildPerlModule { + # pname = "VM-EC2"; + # version = "1.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/L/LD/LDS/VM-EC2-1.28.tar.gz"; + # hash = "sha256-srazF0XFdDH8oO+5udC48WjWCBdV4Ej9nWxEab0Qis0="; + # }; + # propagatedBuildInputs = [ AnyEventCacheDNS AnyEventHTTP JSON StringApprox XMLSimple ]; + # meta = { + # description = "Perl interface to Amazon EC2, Virtual Private Cloud, Elastic Load Balancing, Autoscaling, and Relational Database services"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # VMEC2SecurityCredentialCache = buildPerlPackage { + # pname = "VM-EC2-Security-CredentialCache"; + # version = "0.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RC/RCONOVER/VM-EC2-Security-CredentialCache-0.25.tar.gz"; + # hash = "sha256-/H6cFS/ytyHMsiGsQAiZNHdc9YNmrttcwWk2CfhAk3s="; + # }; + # propagatedBuildInputs = [ DateTimeFormatISO8601 VMEC2 ]; + # meta = { + # description = "Cache credentials respecting expiration time for IAM roles"; + # homepage = "https://search.cpan.org/dist/VM-EC2-Security-CredentialCache"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # W3CLinkChecker = buildPerlPackage { + # pname = "W3C-LinkChecker"; + # version = "5.0.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DH/DHM/W3C-LinkChecker-5.0.0.tar.gz"; + # hash = "sha256-CvdY0ZUMswTdqvqnoDmHaHTYjC/teL2KYx6zkG5U+6Y="; + # }; + # outputs = [ "out" ]; + # propagatedBuildInputs = [ CGI CSSDOM ConfigGeneral LWP LocaleCodes NetIP TermReadKey ]; + # meta = { + # description = "W3C Link Checker"; + # homepage = "https://validator.w3.org/checklink"; + # license = with lib.licenses; [ w3c ]; + # mainProgram = "checklink"; + # }; + # }; + + # WWWCurl = buildPerlPackage { + # pname = "WWW-Curl"; + # version = "4.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SZ/SZBALINT/WWW-Curl-4.17.tar.gz"; + # hash = "sha256-Uv+rEQ4yNI13XyQclz61b5awju28EQ130lfNsKJKt7o="; + # }; + # patches = [ + # (fetchpatch { + # url = "https://aur.archlinux.org/cgit/aur.git/plain/makefile.patch?h=perl-www-curl&id=7e004bb8c5dc49c903a5d5fa5ff28c30a58e2595"; + # hash = "sha256-8JZbe4IMfRZyLa118AAH/wsXrazOFy79OoH3Nuy57A4="; + # name = "perl-www-curl-makefile.patch"; + # }) + # ]; + # env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-return-type"; + # buildInputs = [ pkgs.curl ]; + # doCheck = false; # performs network access + # meta = { + # description = "Perl extension interface for libcurl"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # WWWFormUrlEncoded = buildPerlModule { + # pname = "WWW-Form-UrlEncoded"; + # version = "0.26"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAZEBURO/WWW-Form-UrlEncoded-0.26.tar.gz"; + # hash = "sha256-wEgLXx8VtxFj7DJ7jnhCKY8Ms6zpfmPXA0rx6UotkPQ="; + # }; + # meta = { + # description = "Parser and builder for application/x-www-form-urlencoded"; + # homepage = "https://github.com/kazeburo/WWW-Form-UrlEncoded"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WWWMechanize = buildPerlPackage { + # pname = "WWW-Mechanize"; + # version = "2.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SI/SIMBABQUE/WWW-Mechanize-2.17.tar.gz"; + # hash = "sha256-nAIAPoRiHeoSyYDEEB555PjK5OOCzT2iOfqovRmPBjo="; + # }; + # propagatedBuildInputs = [ HTMLForm HTMLTree LWP ]; + # doCheck = false; + # buildInputs = [ CGI HTTPServerSimple PathTiny TestDeep TestFatal TestOutput TestWarnings ]; + # meta = { + # description = "Handy web browsing in a Perl object"; + # homepage = "https://github.com/libwww-perl/WWW-Mechanize"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "mech-dump"; + # }; + # }; + + # WWWMechanizeCGI = buildPerlPackage { + # pname = "WWW-Mechanize-CGI"; + # version = "0.3"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MR/MRAMBERG/WWW-Mechanize-CGI-0.3.tar.gz"; + # hash = "sha256-weBNi/Hh8NfP9Rl7I2Z2kyrLgCgJNq7a5PngSFGo0hA="; + # }; + # propagatedBuildInputs = [ HTTPRequestAsCGI WWWMechanize ]; + # preConfigure = '' + # substituteInPlace t/cgi-bin/script.cgi \ + # --replace '#!/usr/bin/perl' '#!${perl}/bin/perl' + # ''; + # meta = { + # description = "Use WWW::Mechanize with CGI applications"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/staging-next/perl534Packages.WWWMechanizeCGI.x86_64-darwin + # }; + # }; + + WWWRobotRules = buildPerlPackage { + pname = "WWW-RobotRules"; + version = "6.02"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GA/GAAS/WWW-RobotRules-6.02.tar.gz"; + hash = "sha256-RrUC56KI1VlCmJHutdl5Rh3T7MalxJHq2F0WW24DpR4="; + }; + propagatedBuildInputs = [ URI ]; + meta = { + description = "Database of robots.txt-derived permissions"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # WWWTwilioAPI = buildPerlPackage { + # pname = "WWW-Twilio-API"; + # version = "0.21"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SC/SCOTTW/WWW-Twilio-API-0.21.tar.gz"; + # hash = "sha256-WC21OgkfjaNnDAN3MzFPJRCvXo7gukKg45Hi8uPKdzQ="; + # }; + # prePatch = "rm examples.pl"; + # propagatedBuildInputs = [ LWPProtocolHttps ]; + # meta = { + # description = "Accessing Twilio's REST API with Perl"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WWWYoutubeViewer = callPackage ./perl-modules/WWW-YoutubeViewer { }; + + # Want = buildPerlPackage { + # pname = "Want"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RO/ROBIN/Want-0.29.tar.gz"; + # hash = "sha256-tOR0C41Mt4NZEnPGNr1oMEiS4o2J6Iq/knOx3hf1Uvc="; + # }; + # meta = { + # description = "A generalisation of wantarray"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Win32ShellQuote = buildPerlPackage { + # pname = "Win32-ShellQuote"; + # version = "0.003001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/H/HA/HAARG/Win32-ShellQuote-0.003001.tar.gz"; + # hash = "sha256-qnSw49wtQc1j9i+FPlIf/Xa42CNHmiYZ4i7bQEm0wNw="; + # }; + # meta = { + # description = "Quote argument lists for Win32"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Workflow = buildPerlPackage { + # pname = "Workflow"; + # version = "1.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JO/JONASBN/Workflow-1.62.tar.gz"; + # hash = "sha256-WNNokAm4j+Gp2DcWfTKaoe4xTzFZeeVik2OGVFs80pU="; + # }; + # buildInputs = [ DBDMock ListMoreUtils MockMonkeyPatch PodCoverageTrustPod TestException TestKwalitee TestPod TestPodCoverage ]; + # propagatedBuildInputs = [ ClassAccessor ClassFactory DateTime DBI DataUUID DateTimeFormatStrptime ExceptionClass FileSlurp LogLog4perl Readonly XMLSimple ]; + # meta = { + # description = "Simple, flexible system to implement workflows"; + # homepage = "https://github.com/jonasbn/perl-workflow"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Wx = buildPerlPackage { + # pname = "Wx"; + # version = "0.9932"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MD/MDOOTSON/Wx-0.9932.tar.gz"; + # hash = "sha256-HP22U1oPRnbm8aqyydjhbVd74+s7fMBMgHTWheZlG3A="; + # }; + # patches = [ + # (fetchpatch { + # url = "https://sources.debian.org/data/main/libw/libwx-perl/1%3A0.9932-8/debian/patches/gtk3.patch"; + # hash = "sha256-CokmRzDTFmEMN/jTKw9ECCPvi0mHt5+h8Ojg4Jgd7D4="; + # }) + # (fetchpatch { + # url = "https://sources.debian.org/data/main/libw/libwx-perl/1%3A0.9932-8/debian/patches/wxWidgets_3.2_MakeMaker.patch"; + # hash = "sha256-kTJiCGv8yxQbgMych9yT2cOt+2bL1G4oJ0gehNcu0Rc="; + # }) + # (fetchpatch { + # url = "https://sources.debian.org/data/main/libw/libwx-perl/1%3A0.9932-8/debian/patches/wxWidgets_3.2_port.patch"; + # hash = "sha256-y9LMpcbm7p8+LZ2Hw3PA2jc7bHAFEu0QRa170XuseKw="; + # }) + # ]; + # # DND.c:453:15: error: incompatible integer to pointer conversion assigning to 'NativeFormat' (aka 'const __CFString *') from 'wxDataFormatId' + # postPatch = '' + # substituteInPlace ext/dnd/XS/DataObject.xs \ + # --replace "#ifdef __WXGTK20__" "#if wxUSE_GUI" + # ''; + # propagatedBuildInputs = [ AlienWxWidgets ]; + # # Testing requires an X server: + # # Error: Unable to initialize GTK, is DISPLAY set properly?" + # doCheck = false; + # buildInputs = [ ExtUtilsXSpp ]; + # meta = { + # description = "Interface to the wxWidgets cross-platform GUI toolkit"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WxGLCanvas = buildPerlPackage { + # pname = "Wx-GLCanvas"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MB/MBARBON/Wx-GLCanvas-0.09.tar.gz"; + # hash = "sha256-atLCn/Bv+Apci0udHWvwrtV0iegxvlnJRJT09ojcj+A="; + # }; + # propagatedBuildInputs = [ pkgs.libGLU Wx ]; + # doCheck = false; + # meta = { + # description = "wxPerl demo helper for Wx::GLCanvas"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # X11IdleTime = buildPerlPackage { + # pname = "X11-IdleTime"; + # version = "0.09"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AW/AWENDT/X11-IdleTime-0.09.tar.gz"; + # hash = "sha256-2P3cB455ge4xt2CMZTZFyyDwFr3dx8VQtNUn79NiR0g="; + # }; + # buildInputs = [ pkgs.xorg.libXext pkgs.xorg.libXScrnSaver pkgs.xorg.libX11 ]; + # propagatedBuildInputs = [ InlineC ]; + # patchPhase = "sed -ie 's,-L/usr/X11R6/lib/,-L${pkgs.xorg.libX11.out}/lib/ -L${pkgs.xorg.libXext.out}/lib/ -L${pkgs.xorg.libXScrnSaver}/lib/,' IdleTime.pm"; + # meta = { + # description = "Get the idle time of X11"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # X11Protocol = buildPerlPackage { + # pname = "X11-Protocol"; + # version = "0.56"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SM/SMCCAM/X11-Protocol-0.56.tar.gz"; + # hash = "sha256-3pbdbHwfJfMoeqevZJAr+ErKqo4MO7dqoWdjZ+BKCLc="; + # }; + # doCheck = false; # requires an X server + # meta = { + # description = "Perl module for the X Window System Protocol, version 11"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # X11ProtocolOther = buildPerlPackage { + # pname = "X11-Protocol-Other"; + # version = "31"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRYDE/X11-Protocol-Other-31.tar.gz"; + # hash = "sha256-PGJZk9x6jrHQLgcQimZjAkWcb8b589J2FfdJUVjcc/Q="; + # }; + # propagatedBuildInputs = [ X11Protocol ]; + # buildInputs = [ EncodeHanExtra ModuleUtil ]; + # meta = { + # description = "Miscellaneous helpers for X11::Protocol connections"; + # homepage = "https://user42.tuxfamily.org/x11-protocol-other/index.html"; + # license = with lib.licenses; [ gpl1Plus gpl3Plus ]; + # }; + # }; + + # X11GUITest = buildPerlPackage { + # pname = "X11-GUITest"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/C/CT/CTRONDLP/X11-GUITest-0.28.tar.gz"; + # hash = "sha256-3O7eU3AGEP/xQtydXE5M0DcMiKTysTcfnL9NjYzm9ks="; + # }; + # buildInputs = [ pkgs.xorg.libX11 pkgs.xorg.libXi pkgs.xorg.libXt pkgs.xorg.libXtst ]; + # NIX_CFLAGS_LINK = "-lX11"; + # doCheck = false; # requires an X server + # meta = { + # description = "Provides GUI testing/interaction routines"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # X11XCB = buildPerlPackage { + # pname = "X11-XCB"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZH/ZHMYLOVE/X11-XCB-0.20.tar.gz"; + # hash = "sha256-rVY5Yd4gIlVOdZHvXLjZY0ngxzdxIYXkeFBViMZ6L9I="; + # }; + # env.AUTOMATED_TESTING = false; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.xorg.libxcb pkgs.xorg.xcbproto pkgs.xorg.xcbutil pkgs.xorg.xcbutilwm ExtUtilsDepends ExtUtilsPkgConfig TestDeep TestException ]; + # propagatedBuildInputs = [ DataDump MouseXNativeTraits XMLDescent XMLSimple XSObjectMagic ]; + # NIX_CFLAGS_LINK = "-lxcb -lxcb-util -lxcb-xinerama -lxcb-icccm -lxcb-randr -lxcb-xkb"; + # doCheck = false; # requires an X server + # meta = { + # description = "Perl bindings for libxcb"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLCanonicalizeXML = buildPerlPackage { + # pname = "XML-CanonicalizeXML"; + # version = "0.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SJ/SJZASADA/XML-CanonicalizeXML-0.10.tar.gz"; + # hash = "sha256-5yhGSIDLtMHz/XceCQOoUmzWV7OUuzchYDUkXPHihu4="; + # }; + # buildInputs = [ pkgs.libxml2 ]; + # meta = { + # description = "Perl extension for inclusive (1.0 and 1.1) and exclusive canonicalization of XML using libxml2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.sgo ]; + # }; + # }; + + # XMLDescent = buildPerlModule { + # pname = "XML-Descent"; + # version = "1.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/A/AN/ANDYA/XML-Descent-1.04.tar.gz"; + # hash = "sha256-pxG4VvjN9eZHpExx+WfUjAlgNbnb0/Hvvb6kBgWvvVA="; + # }; + # buildInputs = [ TestDifferences ]; + # propagatedBuildInputs = [ XMLTokeParser ]; + # meta = { + # description = "Recursive descent XML parsing"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLEncoding = buildPerlPackage { + # pname = "XML-Encoding"; + # version = "2.11"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHAY/XML-Encoding-2.11.tar.gz"; + # hash = "sha256-pQ5Brwp5uILUiBa5VoHzilWvHmqIgo3NljdKi94jBaE="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "A perl module for parsing XML encoding maps"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLEntities = buildPerlPackage { + # pname = "XML-Entities"; + # version = "1.0002"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SI/SIXTEASE/XML-Entities-1.0002.tar.gz"; + # hash = "sha256-wyqk8wlXPXZIqy5Bb2K2sgZS8q2c/T7sgv1REB/nMQ0="; + # }; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # propagatedBuildInputs = [ LWP ]; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/download-entities.pl + # ''; + # meta = { + # description = "Mapping of XML entities to Unicode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLDOM = buildPerlPackage { + # pname = "XML-DOM"; + # version = "1.46"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TJ/TJMATHER/XML-DOM-1.46.tar.gz"; + # hash = "sha256-i6JLC0WbAdbF5bBAiCnH1d/kf/ebNUjIE3WQSAmbF14="; + # }; + # propagatedBuildInputs = [ XMLRegExp libxml_perl ]; + # meta = { + # description = "Interface to XML::DOM toolset"; + # license = with lib.licenses; [ gpl2Only ]; + # }; + # }; + + # XMLFeedPP = buildPerlPackage { + # pname = "XML-FeedPP"; + # version = "0.95"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/XML-FeedPP-0.95.tar.gz"; + # hash = "sha256-kMOVm/GmC3aimnSac5QfOgx7mllUwTZbyB2vyrsBqPQ="; + # }; + # propagatedBuildInputs = [ XMLTreePP ]; + # meta = { + # description = "Parse/write/merge/edit RSS/RDF/Atom syndication feeds"; + # homepage = "http://perl.overmeer.net/CPAN"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLFilterBufferText = buildPerlPackage { + # pname = "XML-Filter-BufferText"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/R/RB/RBERJON/XML-Filter-BufferText-1.01.tar.gz"; + # hash = "sha256-j9ISbTvuxVTfhSkZ9HOeaJICy7pqF1Bum2bqFlhBp1w="; + # }; + # doCheck = false; + # meta = { + # description = "Filter to put all characters() in one event"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLFilterXInclude = buildPerlPackage { + # pname = "XML-Filter-XInclude"; + # version = "1.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MS/MSERGEANT/XML-Filter-XInclude-1.0.tar.gz"; + # hash = "sha256-mHRvPB9vBJSR/sID1FW7j4ycbiUPBBkE3aXXjiEYf5M="; + # }; + # doCheck = false; + # meta = { + # description = "XInclude as a SAX Filter"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLFilterSort = buildPerlPackage { + # pname = "XML-Filter-Sort"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRANTM/XML-Filter-Sort-1.01.tar.gz"; + # hash = "sha256-UQWF85pJFszV+o1UXpYXnJHq9vx8l6QBp1aOhBFi+l8="; + # }; + # nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang; + # propagatedBuildInputs = [ + # XMLSAX + # XMLSAXWriter + # ]; + # postInstall = lib.optionalString stdenv.isDarwin '' + # shortenPerlShebang $out/bin/xmlsort + # ''; + # meta = { + # description = "SAX filter for sorting elements in XML"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "xmlsort"; + # }; + # }; + + # XMLGrove = buildPerlPackage { + # pname = "XML-Grove"; + # version = "0.46alpha"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KM/KMACLEOD/XML-Grove-0.46alpha.tar.gz"; + # hash = "sha256-/LZtffSsKcsO3B6mLBdQcCyqaob8lHkKlPyxo2vQ0Rc="; + # }; + # buildInputs = [ pkgs.libxml2 ]; + # propagatedBuildInputs = [ libxml_perl ]; + + # #patch from https://bugzilla.redhat.com/show_bug.cgi?id=226285 + # patches = [ ./perl-modules/xml-grove-utf8.patch ]; + # meta = { + # description = "Perl-style XML objects"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLHandlerYAWriter = buildPerlPackage { + # pname = "XML-Handler-YAWriter"; + # version = "0.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KR/KRAEHE/XML-Handler-YAWriter-0.23.tar.gz"; + # hash = "sha256-50y7vl41wapyYZC/re8cePN7ThV3+JyT2sKgr4MqpIU="; + # }; + # propagatedBuildInputs = [ libxml_perl ]; + # meta = { + # description = "Yet another Perl SAX XML Writer"; + # license = with lib.licenses; [ gpl1Only ]; + # mainProgram = "xmlpretty"; + # }; + # }; + + # XMLLibXML = buildPerlPackage { + # pname = "XML-LibXML"; + # version = "2.0209"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/XML-LibXML-2.0209.tar.gz"; + # hash = "sha256-tKWrvNaJqi+7yLe0UznpYcSYTkgQhJTrbCgrR0giJCU="; + # }; + # SKIP_SAX_INSTALL = 1; + # buildInputs = [ AlienBuild AlienLibxml2 ] + # ++ lib.optionals stdenv.isDarwin (with pkgs; [ libiconv zlib ]); + # patches = [ + # ./perl-modules/XML-LibXML-clang16.patch + # ]; + # # Remove test that fails after LibXML 2.11 upgrade + # postPatch = '' + # rm t/35huge_mode.t + # ''; + # propagatedBuildInputs = [ XMLSAX ]; + # meta = { + # description = "Perl Binding for libxml2"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLLibXMLSimple = buildPerlPackage { + # pname = "XML-LibXML-Simple"; + # version = "1.01"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MARKOV/XML-LibXML-Simple-1.01.tar.gz"; + # hash = "sha256-zZjIEEtw12cr+ia0UTt4rfK0uSIOWGqovrGlCFADZaY="; + # }; + # propagatedBuildInputs = [ XMLLibXML ]; + # meta = { + # description = "An API for simple XML files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLLibXSLT = buildPerlPackage { + # pname = "XML-LibXSLT"; + # version = "2.002001"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/XML-LibXSLT-2.002001.tar.gz"; + # hash = "sha256-34knxP8ZSfYlgNHB5vAPDNVrU9OpV+5LFxtZv/pjssA="; + # }; + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ pkgs.zlib pkgs.libxml2 pkgs.libxslt ]; + # propagatedBuildInputs = [ XMLLibXML ]; + # meta = { + # description = "Interface to the GNOME libxslt library"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLMini = buildPerlPackage { + # pname = "XML-Mini"; + # version = "1.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PD/PDEEGAN/XML-Mini-1.38.tar.gz"; + # hash = "sha256-r4A9OANqMYThJKaC5UZvG8EH9IqJ7zWwx2R+EaBz/i0="; + # }; + # meta = { + # description = "Perl implementation of the XML::Mini XML create/parse interface"; + # license = with lib.licenses; [ gpl3Plus ]; + # }; + # }; + + XMLNamespaceSupport = buildPerlPackage { + pname = "XML-NamespaceSupport"; + version = "1.12"; + src = fetchurl { + url = "mirror://cpan/authors/id/P/PE/PERIGRIN/XML-NamespaceSupport-1.12.tar.gz"; + hash = "sha256-R+mVhZ+N0EE6o/ItNQxKYtplLoVCZ6oFhq5USuK65e8="; + }; + meta = { + description = "A simple generic namespace processor"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + XMLParser = buildPerlPackage { + pname = "XML-Parser"; + version = "2.46"; + src = fetchurl { + url = "mirror://cpan/authors/id/T/TO/TODDR/XML-Parser-2.46.tar.gz"; + hash = "sha256-0zEzJJHFHMz7TLlP/ET5zXM3jmGEmNSjffngQ2YcUV0="; + }; + patches = [ ./perl-modules/xml-parser-0001-HACK-Assumes-Expat-paths-are-good.patch ]; + postPatch = lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) '' + substituteInPlace Expat/Makefile.PL --replace 'use English;' '#' + '' + lib.optionalString stdenv.isCygwin '' + sed -i"" -e "s@my \$compiler = File::Spec->catfile(\$path, \$cc\[0\]) \. \$Config{_exe};@my \$compiler = File::Spec->catfile(\$path, \$cc\[0\]) \. (\$^O eq 'cygwin' ? \"\" : \$Config{_exe});@" inc/Devel/CheckLib.pm + ''; + makeMakerFlags = [ "EXPATLIBPATH=${pkgs.expat.out}/lib" "EXPATINCPATH=${pkgs.expat.dev}/include" ]; + propagatedBuildInputs = [ LWP ]; + meta = { + description = "A perl module for parsing XML documents"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # XMLParserLite = buildPerlPackage { + # pname = "XML-Parser-Lite"; + # version = "0.722"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/XML-Parser-Lite-0.722.tar.gz"; + # hash = "sha256-b5CgJ+FTGg5UBs8d4Txwm1IWlm349z0Lq5q5GSCXY+4="; + # }; + # buildInputs = [ TestRequires ]; + # meta = { + # description = "Lightweight pure-perl XML Parser (based on regexps)"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLXPath = buildPerlPackage { + # pname = "XML-XPath"; + # version = "1.48"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MA/MANWAR/XML-XPath-1.48.tar.gz"; + # hash = "sha256-e8db42sjnlsucAqVcNK1O0MJPUZ/Kr5qdD+f+Qk3kM0="; + # }; + # buildInputs = [ PathTiny ]; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "Parse and evaluate XPath statements"; + # license = with lib.licenses; [ artistic2 ]; + # mainProgram = "xpath"; + # }; + # }; + + # XMLXPathEngine = buildPerlPackage { + # pname = "XML-XPathEngine"; + # version = "0.14"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIROD/XML-XPathEngine-0.14.tar.gz"; + # hash = "sha256-0v57y70L66FET0pzNAHnuKpSgvrUJm1Cc13XRYKy4mQ="; + # }; + # meta = { + # description = "A re-usable XPath engine for DOM-like trees"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLRegExp = buildPerlPackage { + # pname = "XML-RegExp"; + # version = "0.04"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TJ/TJMATHER/XML-RegExp-0.04.tar.gz"; + # hash = "sha256-3xmQCWA2CFyOLUWQT+GA+Cv+1A8afgUkPzNOoQCQ/FQ="; + # }; + # meta = { + # description = "Regular expressions for XML tokens"; + # license = with lib.licenses; [ gpl2Plus]; + # }; + # }; + + # XMLRPCLite = buildPerlPackage { + # pname = "XMLRPC-Lite"; + # version = "0.717"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PH/PHRED/XMLRPC-Lite-0.717.tar.gz"; + # hash = "sha256-Op+l8ssfr4t8ZrTDhuqzXKxgiK/E28dX1Pd9KE2rRSQ="; + # }; + # propagatedBuildInputs = [ SOAPLite ]; + # # disable tests that require network + # preCheck = "rm t/{26-xmlrpc.t,37-mod_xmlrpc.t}"; + # meta = { + # description = "Client and server implementation of XML-RPC protocol"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLRSS = buildPerlModule { + # pname = "XML-RSS"; + # version = "1.62"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SH/SHLOMIF/XML-RSS-1.62.tar.gz"; + # hash = "sha256-0ycGNELH/3FDmTqgwtFv3lEhSRyXFmHrbLcA0uBDi04="; + # }; + # propagatedBuildInputs = [ DateTimeFormatMail DateTimeFormatW3CDTF XMLParser ]; + # meta = { + # description = "Creates and updates RSS files"; + # homepage = "https://metacpan.org/release/XML-RSS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLRules = buildPerlModule { + # pname = "XML-Rules"; + # version = "1.16"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JE/JENDA/XML-Rules-1.16.tar.gz"; + # hash = "sha256-N4glXAev5BlaDecs4FBlIyDYF1KP8tEMYR9uOSBDhos="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "Parse XML and specify what and how to keep/process for individual tags"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + XMLSAX = buildPerlPackage { + pname = "XML-SAX"; + version = "1.02"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GR/GRANTM/XML-SAX-1.02.tar.gz"; + hash = "sha256-RQbDhwQ6pqd7RV8A9XQJ83IKp+VTSVqyU1JjtO0eoSo="; + }; + propagatedBuildInputs = [ XMLNamespaceSupport XMLSAXBase ]; + postInstall = '' + perl -MXML::SAX -e "XML::SAX->add_parser(q(XML::SAX::PurePerl))->save_parsers()" + ''; + meta = { + description = "Simple API for XML"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + XMLSAXBase = buildPerlPackage { + pname = "XML-SAX-Base"; + version = "1.09"; + src = fetchurl { + url = "mirror://cpan/authors/id/G/GR/GRANTM/XML-SAX-Base-1.09.tar.gz"; + hash = "sha256-Zss1W6TvR8EMpzi9NZmXI2RDhqyFOrvrUTKEH16KKtA="; + }; + meta = { + description = "Base class for SAX Drivers and Filters"; + homepage = "https://github.com/grantm/XML-SAX-Base"; + license = with lib.licenses; [ artistic1 gpl1Plus ]; + }; + }; + + # XMLSAXExpat = buildPerlPackage { + # pname = "XML-SAX-Expat"; + # version = "0.51"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/B/BJ/BJOERN/XML-SAX-Expat-0.51.tar.gz"; + # hash = "sha256-TAFiE9DOfbLElOMAhrWZF7MC24wpLc0h853uvZeAyD8="; + # }; + # propagatedBuildInputs = [ XMLParser XMLSAX ]; + # # Avoid creating perllocal.pod, which contains a timestamp + # installTargets = [ "pure_install" ]; + # meta = { + # description = "SAX Driver for Expat"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLSAXWriter = buildPerlPackage { + # pname = "XML-SAX-Writer"; + # version = "0.57"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERIGRIN/XML-SAX-Writer-0.57.tar.gz"; + # hash = "sha256-PWHQfvQ7ASb1tN5PQVolb6hZ+ojcT9q6rXC3vnxoLPA="; + # }; + # propagatedBuildInputs = [ XMLFilterBufferText XMLNamespaceSupport XMLSAXBase ]; + # meta = { + # description = "SAX2 XML Writer"; + # homepage = "https://github.com/perigrin/xml-sax-writer"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLSemanticDiff = buildPerlModule { + # pname = "XML-SemanticDiff"; + # version = "1.0007"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PERIGRIN/XML-SemanticDiff-1.0007.tar.gz"; + # hash = "sha256-Bf3v77vD9rYvx8m1+rr7a2le1o8KPZWFdyUdHwQCoPU="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "Perl extension for comparing XML documents"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLSimple = buildPerlPackage { + # pname = "XML-Simple"; + # version = "2.25"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/G/GR/GRANTM/XML-Simple-2.25.tar.gz"; + # hash = "sha256-Ux/drr6iQWdD61xP36sCj1AhI9miIEBaQQDmj8SA2/g="; + # }; + # propagatedBuildInputs = [ XMLSAXExpat ]; + # meta = { + # description = "An API for simple XML files"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLTokeParser = buildPerlPackage { + # pname = "XML-TokeParser"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PO/PODMASTER/XML-TokeParser-0.05.tar.gz"; + # hash = "sha256-hTm0+YQ2sabQiDQai0Uwt5IqzWUfPyk3f4sZSMfi18I="; + # }; + # propagatedBuildInputs = [ XMLParser ]; + # meta = { + # description = "Simplified interface to XML::Parser"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLTreePP = buildPerlPackage { + # pname = "XML-TreePP"; + # version = "0.43"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/K/KA/KAWASAKI/XML-TreePP-0.43.tar.gz"; + # hash = "sha256-f74tZDCGAFmJSu7r911MrPG/jXt1KU64fY4VAvgb12A="; + # }; + # propagatedBuildInputs = [ LWP ]; + # meta = { + # description = "Pure Perl implementation for parsing/writing XML documents"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLTwig = buildPerlPackage { + # pname = "XML-Twig"; + # version = "3.52"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIROD/XML-Twig-3.52.tar.gz"; + # hash = "sha256-/vdYJsJPK4d9Cg0mRSEvxPuXVu1NJxFhSsFcSX6GgK0="; + # }; + # postInstall = '' + # mkdir -p $out/bin + # cp tools/xml_grep/xml_grep $out/bin + # ''; + # propagatedBuildInputs = [ XMLParser ]; + # doCheck = false; # requires lots of extra packages + # meta = { + # description = "A Perl module for processing huge XML documents in tree mode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # mainProgram = "xml_grep"; + # }; + # }; + + # XMLValidatorSchema = buildPerlPackage { + # pname = "XML-Validator-Schema"; + # version = "1.10"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/SA/SAMTREGAR/XML-Validator-Schema-1.10.tar.gz"; + # hash = "sha256-YUJnlYAVCokffTIjK14x4rTl5T6Kb6nL7stcI4FPFCI="; + # }; + # propagatedBuildInputs = [ TreeDAGNode XMLFilterBufferText XMLSAX ]; + # meta = { + # description = "Validate XML against a subset of W3C XML Schema"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XMLWriter = buildPerlPackage { + # pname = "XML-Writer"; + # version = "0.900"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/J/JO/JOSEPHW/XML-Writer-0.900.tar.gz"; + # hash = "sha256-c8j1vT7PKzUPStrm1mdtUuCOzC199KnwifpoNg1ADR8="; + # }; + # meta = { + # description = "Module for creating a XML document object oriented with on the fly validating towards the given DTD"; + # license = with lib.licenses; [ gpl1Only ]; + # }; + # }; + + # XSObjectMagic = buildPerlPackage { + # pname = "XS-Object-Magic"; + # version = "0.05"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/XS-Object-Magic-0.05.tar.gz"; + # hash = "sha256-PcnkYM7pLhF0QGJ1RkOjN3jKUqVNIF/K/6SrDzzxXlo="; + # }; + # buildInputs = [ ExtUtilsDepends TestFatal TestSimple13 ]; + # meta = { + # description = "Opaque, extensible XS pointer backed objects using sv_magic"; + # homepage = "https://github.com/karenetheridge/XS-Object-Magic"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # XSParseKeyword = buildPerlModule { + # pname = "XS-Parse-Keyword"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/XS-Parse-Keyword-0.38.tar.gz"; + # hash = "sha256-JQDEeGnPXKjGHdI8Z7rav2a48e+14nkgdlfBzmk+IR4="; + # }; + # buildInputs = [ ExtUtilsCChecker Test2Suite ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "XS functions to assist in parsing keyword syntax"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # XSParseSublike = buildPerlModule { + # pname = "XS-Parse-Sublike"; + # version = "0.20"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PE/PEVANS/XS-Parse-Sublike-0.20.tar.gz"; + # hash = "sha256-Wn0myqMroqQQUZwMJLHYCznvMgdRN224vbef2u/pms0="; + # }; + # buildInputs = [ Test2Suite ]; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "XS functions to assist in parsing sub-like syntax"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # maintainers = [ maintainers.zakame ]; + # }; + # }; + + # XXX = buildPerlPackage { + # pname = "XXX"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/XXX-0.38.tar.gz"; + # hash = "sha256-0QUQ6gD2Gav0erKZ8Ui9WzYM+gfcDtUYE4t87HJpLSo="; + # }; + # propagatedBuildInputs = [ YAMLPP ]; + # meta = { + # description = "See Your Data in the Nude"; + # homepage = "https://github.com/ingydotnet/xxx-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # YAML = buildPerlPackage { + # pname = "YAML"; + # version = "1.30"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TINITA/YAML-1.30.tar.gz"; + # hash = "sha256-UDCm1sv/rxJYMFC/VSqoANRkbKlnjBh63WSSJ/V0ec0="; + # }; + + # buildInputs = [ TestBase TestDeep TestYAML ]; + + # meta = { + # description = "YAML Ain't Markup Language (tm)"; + # homepage = "https://github.com/ingydotnet/yaml-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # YAMLOld = buildPerlPackage { + # pname = "YAML-Old"; + # version = "1.23"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/I/IN/INGY/YAML-Old-1.23.tar.gz"; + # hash = "sha256-+lRvzZrMWjm8iHGQL3/B66UOfceBxc1cCr8a7ObRfs0="; + # }; + # buildInputs = [ TestYAML TestBase ]; + # meta = { + # description = "Old YAML.pm Legacy Code"; + # homepage = "https://github.com/ingydotnet/yaml-old-pm"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # YAMLSyck = buildPerlPackage { + # pname = "YAML-Syck"; + # version = "1.34"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TO/TODDR/YAML-Syck-1.34.tar.gz"; + # hash = "sha256-zJFWzK69p5jr/i8xthnoBld/hg7RcEJi8X/608bjQVk="; + # }; + # perlPreHook = lib.optionalString stdenv.isDarwin "export LD=$CC"; + # meta = { + # description = "Fast, lightweight YAML loader and dumper"; + # homepage = "https://github.com/toddr/YAML-Syck"; + # license = with lib.licenses; [ mit ]; + # }; + # }; + + # YAMLTiny = buildPerlPackage { + # pname = "YAML-Tiny"; + # version = "1.74"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/E/ET/ETHER/YAML-Tiny-1.74.tar.gz"; + # hash = "sha256-ezjKn1084kIwpri9wfR/Wy2zSOf3+WZsJvWVVjbjPWw="; + # }; + # meta = { + # description = "Read/Write YAML files with as little code as possible"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # YAMLLibYAML = buildPerlPackage { + # pname = "YAML-LibYAML"; + # version = "0.89"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TINITA/YAML-LibYAML-0.89.tar.gz"; + # hash = "sha256-FVq4NnU0XFCt0DMRrPndkVlVcH+Qmiq9ixfXeShZsuw="; + # }; + # meta = { + # description = "Perl YAML Serialization using XS and libyaml"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # YAMLPP = buildPerlPackage { + # pname = "YAML-PP"; + # version = "0.036"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/T/TI/TINITA/YAML-PP-0.036.tar.gz"; + # hash = "sha256-yLTlBYSt+S73Vz9rsB1u1Y5iF2MsV0J7cnTPp8pG/Bs="; + # }; + # buildInputs = [ TestDeep TestWarn ]; + # meta = { + # description = "YAML 1.2 Processor"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # Yancy = buildPerlPackage { + # pname = "Yancy"; + # version = "1.088"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/P/PR/PREACTION/Yancy-1.088.tar.gz"; + # hash = "sha256-addqs5ilrGiQc0Paisybr9UZ+0x4WrAU7CagUhA2vSo="; + # }; + # buildInputs = [ FileShareDirInstall ]; + # propagatedBuildInputs = [ ClassMethodModifiers JSONValidator Mojolicious MojoliciousPluginI18N MojoliciousPluginOpenAPI RoleTiny ]; + # meta = { + # homepage = "http://preaction.me/yancy/"; + # description = "The Best Web Framework Deserves the Best CMS"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WebMachine = buildPerlPackage { + # pname = "Web-Machine"; + # version = "0.17"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/D/DR/DROLSKY/Web-Machine-0.17.tar.gz"; + # hash = "sha256-8TnSsxFMVJ6RhH2qq4t1y2meV9r1u/Db0TKT8z/l4io="; + # }; + # buildInputs = [ NetHTTP TestFailWarnings TestFatal ]; + # propagatedBuildInputs = [ HTTPHeadersActionPack HTTPMessage HashMultiValue IOHandleUtil ModuleRuntime Plack SubExporter TryTiny ]; + # meta = { + # description = "A Perl port of Webmachine"; + # homepage = "https://metacpan.org/release/Web-Machine"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WebScraper = buildPerlModule { + # pname = "Web-Scraper"; + # version = "0.38"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIYAGAWA/Web-Scraper-0.38.tar.gz"; + # hash = "sha256-+VtuX41/7r4RbQW/WaK3zxpR7Z0wvKgBI0MOxFZ1Q78="; + # }; + # buildInputs = [ ModuleBuildTiny TestBase TestRequires ]; + # propagatedBuildInputs = [ HTMLParser HTMLSelectorXPath HTMLTagset HTMLTree HTMLTreeBuilderXPath UNIVERSALrequire URI XMLXPathEngine YAML libwwwperl ]; + # meta = { + # homepage = "https://github.com/miyagawa/web-scraper"; + # description = "Web Scraping Toolkit using HTML and CSS Selectors or XPath expressions"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WebServiceLinode = buildPerlModule { + # pname = "WebService-Linode"; + # version = "0.29"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/M/MI/MIKEGRB/WebService-Linode-0.29.tar.gz"; + # hash = "sha256-EDqrJFME8I6eh6x7yITdtEpjDea6wHfckh9xbXEVSSI="; + # }; + # buildInputs = [ ModuleBuildTiny ]; + # propagatedBuildInputs = [ JSON LWPProtocolHttps ]; + # meta = { + # description = "Perl Interface to the Linode.com API"; + # homepage = "https://github.com/mikegrb/WebService-Linode"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # WebServiceValidatorHTMLW3C = buildPerlModule { + # pname = "WebService-Validator-HTML-W3C"; + # version = "0.28"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/S/ST/STRUAN/WebService-Validator-HTML-W3C-0.28.tar.gz"; + # hash = "sha256-zLB60zegOuyBob6gqJzSlUaR/1uzZ9+aMrnZEw8XURA="; + # }; + # buildInputs = [ ClassAccessor LWP ]; + # meta = { + # description = "Access the W3Cs online HTML validator"; + # license = with lib.licenses; [ artistic1 gpl1Plus ]; + # }; + # }; + + # ZonemasterCLI = buildPerlPackage { + # pname = "Zonemaster-CLI"; + # version = "6.000003"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZN/ZNMSTR/Zonemaster-CLI-v6.0.3.tar.gz"; + # hash = "sha256-oYDBYVygvPUZ9vrGX/y5A0MAQ6zgSsrf6AtUdFcZG4Q="; + # }; + # propagatedBuildInputs = [ + # JSONXS + # MooseXGetopt + # TextReflow + # ZonemasterEngine + # ZonemasterLDNS + # libintl-perl + # ]; + + # preConfigure = '' + # patchShebangs script/ + # ''; + + # meta = { + # description = "Run Zonemaster tests from the command line"; + # license = with lib.licenses; [ bsd3 ]; + # maintainers = with lib.maintainers; [ qbit ]; + # }; + # }; + + # ZonemasterEngine = buildPerlPackage { + # pname = "Zonemaster-Engine"; + # version = "4.6.1"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZN/ZNMSTR/Zonemaster-Engine-v4.6.1.tar.gz"; + # hash = "sha256-4AXo3bZTOLnnPjjX5KNb/2O7MRqcAtlqpz5sPwNN9b0="; + # }; + # buildInputs = [ PodCoverage TestDifferences TestException TestFatal TestNoWarnings TestPod ]; + # propagatedBuildInputs = [ ClassAccessor Clone EmailValid FileShareDir FileSlurp IOSocketINET6 ListMoreUtils ModuleFind Moose MooseXSingleton NetIP NetIPXS Readonly TextCSV ZonemasterLDNS libintl-perl ]; + + # meta = { + # description = "A tool to check the quality of a DNS zone"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + + # ZonemasterLDNS = buildPerlPackage { + # pname = "Zonemaster-LDNS"; + # version = "3.2.0"; + # src = fetchurl { + # url = "mirror://cpan/authors/id/Z/ZN/ZNMSTR/Zonemaster-LDNS-3.2.0.tar.gz"; + # hash = "sha256-BpsWQRcpX6gtJSlAocqLMIrYsfPocjvk6CaqqX9wbWw="; + # }; + # env.NIX_CFLAGS_COMPILE = "-I${pkgs.openssl.dev}/include -I${pkgs.libidn2}.dev}/include"; + # NIX_CFLAGS_LINK = "-L${lib.getLib pkgs.openssl}/lib -L${lib.getLib pkgs.libidn2}/lib -lcrypto -lidn2"; + + # makeMakerFlags = [ "--prefix-openssl=${pkgs.openssl.dev}" ]; + + # nativeBuildInputs = [ pkgs.pkg-config ]; + # buildInputs = [ DevelChecklib ModuleInstall ModuleInstallXSUtil TestFatal TestDifferences pkgs.ldns pkgs.libidn2 pkgs.openssl ]; + # meta = { + # description = "Perl wrapper for the ldns DNS library"; + # license = with lib.licenses; [ bsd3 ]; + # }; + # }; + +} +# // lib.optionalAttrs config.allowAliases { +# autodie = null; # part of Perl +# AutoLoader = null; # part of Perl 5.22 +# constant = null; # part of Perl 5.22 +# DevelSelfStubber = null; # part of Perl 5.22 +# Digest = null; # part of Perl 5.22 +# Exporter = null; # part of Perl 5.22 +# I18NCollate = null; # part of Perl 5.22 +# lib_ = null; # part of Perl 5.22 +# LocaleMaketextSimple = null; # part of Perl 5.22 +# MathComplex = null; # part of Perl 5.22 +# MIMEBase64 = null; # part of Perl 5.22 +# PerlIOviaQuotedPrint = null; # part of Perl 5.22 +# PodEscapes = null; # part of Perl 5.22 +# Safe = null; # part of Perl 5.22 +# SearchDict = null; # part of Perl 5.22 +# Test = null; # part of Perl 5.22 +# TextAbbrev = null; # part of Perl 5.22 +# TextTabsWrap = null; # part of Perl 5.22 +# DigestSHA = null; +# "if" = null; +# TestSimple = null; +# AttributeHandlers = null; # part of Perl 5.26 +# base = null; # part of Perl 5.26 +# CPANMeta = null; # part of Perl 5.26 +# CPANMetaRequirements = null; # part of Perl 5.26 +# CPANMetaYAML = null; # part of Perl 5.26 +# DigestMD5 = null; # part of Perl 5.26 +# LocaleMaketext = null; # part of Perl 5.26 +# ModuleLoadConditional = null; # part of Perl 5.26 +# ModuleMetadata = null; # part of Perl 5.26 +# PerlOSType = null; # part of Perl 5.26 +# PodUsage = null; # part of Perl 5.26 +# TermANSIColor = null; # part of Perl 5.26 +# TermCap = null; # part of Perl 5.26 +# ThreadSemaphore = null; # part of Perl 5.26 +# UnicodeNormalize = null; # part of Perl 5.26 +# XSLoader = null; # part of Perl 5.26 + +# Carp = null; # part of Perl 5.28 +# ExtUtilsCBuilder = null; # part of Perl 5.28 +# ExtUtilsParseXS = null; # part of Perl 5.28 +# FilterSimple = null; # part of Perl 5.28 +# IOSocketIP = null; # part of Perl 5.28 +# SelfLoader = null; # part of Perl 5.28 +# Socket = null; # part of Perl 5.28 +# TestHarness = null; # part of Perl 5.28 +# threads = null; # part of Perl 5.28 +# TimeHiRes = null; # part of Perl 5.28 +# UnicodeCollate = null; # part of Perl 5.28 +# ModuleCoreList = null; # part of Perl 5.28.2 + +# bignum = null; # part of Perl 5.30.3 +# DataDumper = null; # part of Perl 5.30.3 +# ExtUtilsManifest = null; # part of Perl 5.30.3 +# FileTemp = null; # part of Perl 5.30.3 +# MathBigRat = null; # part of Perl 5.30.3 +# Storable = null; # part of Perl 5.30.3 +# threadsshared = null; # part of Perl 5.30.3 +# ThreadQueue = null; # part of Perl 5.30.3 + +# ArchiveZip_1_53 = self.ArchiveZip; +# Autobox = self.autobox; +# CommonSense = self.commonsense; # For backwards compatibility. +# if_ = self."if"; # For backwards compatibility. +# Log4Perl = self.LogLog4perl; # For backwards compatibility. +# MouseXGetOpt = self.MouseXGetopt; +# NamespaceAutoclean = self.namespaceautoclean; # Deprecated. +# NamespaceClean = self.namespaceclean; # Deprecated. +# CatalystPluginUnicodeEncoding = self.CatalystRuntime; +# ClassAccessorFast = self.ClassAccessor; +# ClassMOP = self.Moose; +# CompressZlib = self.IOCompress; +# constantdefer = self.constant-defer; +# DigestHMAC_SHA1 = self.DigestHMAC; +# DistZillaPluginNoTabsTests = self.DistZillaPluginTestNoTabs; +# EmailMIMEModifier = self.EmailMIME; +# ExtUtilsCommand = self.ExtUtilsMakeMaker; +# IOSocketInet6 = self.IOSocketINET6; +# IOstringy = self.IOStringy; +# libintl_perl = self.libintl-perl; +# libintlperl = self.libintl-perl; +# LWPProtocolconnect = self.LWPProtocolConnect; +# LWPProtocolhttps = self.LWPProtocolHttps; +# LWPUserAgent = self.LWP; +# MIMEtools = self.MIMETools; +# NetLDAP = self.perlldap; +# NetSMTP = self.libnet; +# OLEStorageLight = self.OLEStorage_Lite; # For backwards compatibility. Please use OLEStorage_Lite instead. +# ParseCPANMeta = self.CPANMeta; +# TestMoose = self.Moose; +# TestMore = self.TestSimple; +# TestTester = self.TestSimple; +# Testuseok = self.TestSimple; +# SubExporterUtil = self.SubExporter; +# version = self.Version; + +# Gtk2GladeXML = throw "Gtk2GladeXML has been removed"; # 2022-01-15 +# pcscperl = throw "'pcscperl' has been renamed to 'ChipcardPCSC'"; # Added 2023-12-07 +# } diff --git a/pkgs/by-name/pe/perl/setup-hook-cross.sh b/pkgs/by-name/pe/perl/setup-hook-cross.sh new file mode 100644 index 0000000..a7aad6f --- /dev/null +++ b/pkgs/by-name/pe/perl/setup-hook-cross.sh @@ -0,0 +1,12 @@ +addPerlLibPath () { + addToSearchPath PERL5LIB $1/lib/perl5/site_perl/@version@ + addToSearchPath PERL5LIB $1/lib/perl5/site_perl/cross_perl/@version@ + # Adding the arch-specific directory is morally incorrect, as + # miniperl can't load the native modules there. However, it can + # (and sometimes needs to) load and run some of the pure perl + # code there, so we add it anyway. When needed, stubs can be put + # into $1/lib/perl5/site_perl/cross_perl/@version@ + addToSearchPath PERL5LIB $1/lib/perl5/site_perl/@version@/@runtimeArch@ +} + +addEnvHooks "$hostOffset" addPerlLibPath diff --git a/pkgs/by-name/pe/perl/setup-hook.sh b/pkgs/by-name/pe/perl/setup-hook.sh new file mode 100644 index 0000000..7909412 --- /dev/null +++ b/pkgs/by-name/pe/perl/setup-hook.sh @@ -0,0 +1,5 @@ +addPerlLibPath () { + addToSearchPath PERL5LIB $1/lib/perl5/site_perl +} + +addEnvHooks "$hostOffset" addPerlLibPath diff --git a/pkgs/by-name/pe/perl/sw_vers.patch b/pkgs/by-name/pe/perl/sw_vers.patch new file mode 100644 index 0000000..2e30dba --- /dev/null +++ b/pkgs/by-name/pe/perl/sw_vers.patch @@ -0,0 +1,13 @@ +diff --git a/hints/darwin.sh b/hints/darwin.sh +index afadf53..80b7533 100644 +--- a/hints/darwin.sh ++++ b/hints/darwin.sh +@@ -329,7 +329,7 @@ EOM + # sw_vers output what we want + # "ProductVersion: 10.10.5" "10.10" + # "ProductVersion: 10.11" "10.11" +- prodvers=`sw_vers|awk '/^ProductVersion:/{print $2}'|awk -F. '{print $1"."$2}'` ++ prodvers="${MACOSX_DEPLOYMENT_TARGET:-10.12}" + case "$prodvers" in + 10.*) + add_macosx_version_min ccflags $prodvers diff --git a/pkgs/by-name/pe/perl/wrapper.nix b/pkgs/by-name/pe/perl/wrapper.nix new file mode 100644 index 0000000..8e4630b --- /dev/null +++ b/pkgs/by-name/pe/perl/wrapper.nix @@ -0,0 +1,52 @@ +{ lib, perl, buildEnv, makeBinaryWrapper +, extraLibs ? [] +, extraOutputsToInstall ? [] +, postBuild ? "" +, ignoreCollisions ? false +, requiredPerlModules +}: + +# Create a perl executable that knows about additional packages. +let + env = let + paths = requiredPerlModules (extraLibs ++ [ perl ] ); + in buildEnv { + name = "${perl.name}-env"; + + inherit paths; + inherit ignoreCollisions; + extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall; + + nativeBuildInputs = [ makeBinaryWrapper ]; + + # we create wrapper for the binaries in the different packages + postBuild = '' + if [ -L "$out/bin" ]; then + unlink "$out/bin" + fi + mkdir -p "$out/bin" + + # take every binary from perl packages and put them into the env + for path in ${lib.concatStringsSep " " paths}; do + if [ -d "$path/bin" ]; then + cd "$path/bin" + for prg in *; do + if [ -f "$prg" ]; then + rm -f "$out/bin/$prg" + if [ -x "$prg" ]; then + makeWrapper "$path/bin/$prg" "$out/bin/$prg" --suffix PERL5LIB ':' "$out/${perl.libPrefix}" + fi + fi + done + fi + done + '' + postBuild; + + meta = perl.meta // { outputsToInstall = ["out"]; }; # remove "man" from meta.outputsToInstall. pkgs.buildEnv produces no "man", it puts everything to "out" + + passthru = perl.passthru // { + interpreter = "${env}/bin/perl"; + inherit perl; + }; + }; +in env diff --git a/pkgs/by-name/pi/pixman/default.nix b/pkgs/by-name/pi/pixman/default.nix new file mode 100644 index 0000000..339d9be --- /dev/null +++ b/pkgs/by-name/pi/pixman/default.nix @@ -0,0 +1,87 @@ +{ lib +, stdenv +, fetchurl +, meson +, ninja +, pkg-config +, libpng +, glib /*just passthru*/ + +# for passthru.tests +# , cairo +# , qemu +# , scribus +# , tigervnc +# , wlroots +# , xwayland + +# , gitUpdater +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "pixman"; + version = "0.43.4"; + + src = fetchurl { + urls = with finalAttrs; [ + "mirror://xorg/individual/lib/${pname}-${version}.tar.gz" + "https://cairographics.org/releases/${pname}-${version}.tar.gz" + ]; + hash = "sha256-oGJNuQGAx923n8epFRCT3DfGRtjDjT8jL3Z89kuFoiY="; + }; + + # Raise test timeout, 120s can be slightly exceeded on slower hardware + postPatch = '' + substituteInPlace test/meson.build \ + --replace-fail 'timeout : 120' 'timeout : 240' + ''; + + separateDebugInfo = !stdenv.hostPlatform.isStatic; + + nativeBuildInputs = [ meson ninja pkg-config ]; + + buildInputs = [ libpng ]; + + # Default "enabled" value attempts to enable CPU features on all + # architectures and requires used to disable them: + # https://gitlab.freedesktop.org/pixman/pixman/-/issues/88 + mesonAutoFeatures = "auto"; + mesonFlags = [ + "-Diwmmxt=disabled" + ] + # Disable until https://gitlab.freedesktop.org/pixman/pixman/-/issues/46 is resolved + ++ lib.optional (stdenv.isAarch64 && !stdenv.cc.isGNU) "-Da64-neon=disabled"; + + preConfigure = '' + # https://gitlab.freedesktop.org/pixman/pixman/-/issues/62 + export OMP_NUM_THREADS=$((NIX_BUILD_CORES > 184 ? 184 : NIX_BUILD_CORES)) + ''; + + enableParallelBuilding = true; + + doCheck = !stdenv.isDarwin; + + postInstall = glib.flattenInclude; + + # passthru = { + # tests = { + # inherit cairo qemu scribus tigervnc wlroots xwayland; + # pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + # updateScript = gitUpdater { + # url = "https://gitlab.freedesktop.org/pixman/pixman.git"; + # rev-prefix = "pixman-"; + # }; + # }; + + meta = with lib; { + homepage = "http://pixman.org"; + description = "A low-level library for pixel manipulation"; + license = licenses.mit; + platforms = platforms.all; + pkgConfigModules = [ "pixman-1" ]; + }; +}) diff --git a/pkgs/by-name/pk/pkg-config/2.36.3-not-win32.patch b/pkgs/by-name/pk/pkg-config/2.36.3-not-win32.patch new file mode 100644 index 0000000..c1dd808 --- /dev/null +++ b/pkgs/by-name/pk/pkg-config/2.36.3-not-win32.patch @@ -0,0 +1,324 @@ +--- a/glib/configure.ac 2013-08-04 20:21:20.808722600 -0500 ++++ b/glib/configure.ac 2013-08-04 18:30:21.852852200 -0500 +@@ -1880,7 +1880,7 @@ dnl ************************************ + + AC_MSG_CHECKING(for platform-dependent source) + case "$host" in +- *-*-cygwin*|*-*-mingw*) ++ *-*-mingw*) + PLATFORMDEP=gwin32.lo + ;; + *) +@@ -2594,9 +2594,6 @@ dnl *** Win32 API libs *** + dnl ********************** + + case $host in +- *-*-cygwin*) +- G_LIBS_EXTRA="-luser32 -lkernel32" +- ;; + *-*-mingw*) + G_LIBS_EXTRA="-lws2_32 -lole32 -lwinmm -lshlwapi" + ;; +--- a/glib/glib/gatomic.c 2013-08-04 20:21:20.907728300 -0500 ++++ b/glib/glib/gatomic.c 2013-08-04 18:11:14.000000000 -0500 +@@ -464,7 +464,7 @@ gsize + return g_atomic_pointer_xor ((volatile gpointer *) atomic, val); + } + +-#elif defined (G_PLATFORM_WIN32) ++#elif defined (G_OS_WIN32) + + #include + #if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) && !(defined _MSC_VER && _MSC_VER <= 1200) +--- a/glib/glib/gcharset.c 2013-08-04 20:21:20.925729300 -0500 ++++ b/glib/glib/gcharset.c 2013-08-04 18:11:14.000000000 -0500 +@@ -496,7 +496,7 @@ guess_category_value (const gchar *categ + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and + * LANG, which we already did above. Oh well. The main point of + * calling g_win32_getlocale() is to get the thread's locale as used +--- a/glib/glib/gconvert.c 2013-08-04 20:21:20.933729800 -0500 ++++ b/glib/glib/gconvert.c 2013-08-04 18:11:14.000000000 -0500 +@@ -33,9 +33,6 @@ + + #ifdef G_OS_WIN32 + #include "win_iconv.c" +-#endif +- +-#ifdef G_PLATFORM_WIN32 + #define STRICT + #include + #undef STRICT +@@ -1258,7 +1255,7 @@ g_locale_from_utf8 (const gchar *utf8str + charset, "UTF-8", bytes_read, bytes_written, error); + } + +-#ifndef G_PLATFORM_WIN32 ++#ifndef G_OS_WIN32 + + typedef struct _GFilenameCharsetCache GFilenameCharsetCache; + +@@ -1374,7 +1371,7 @@ g_get_filename_charsets (const gchar *** + return cache->is_utf8; + } + +-#else /* G_PLATFORM_WIN32 */ ++#else /* G_OS_WIN32 */ + + gboolean + g_get_filename_charsets (const gchar ***filename_charsets) +@@ -1403,7 +1400,7 @@ g_get_filename_charsets (const gchar *** + #endif + } + +-#endif /* G_PLATFORM_WIN32 */ ++#endif /* G_OS_WIN32 */ + + static gboolean + get_filename_charset (const gchar **filename_charset) +--- a/glib/glib/gfileutils.c 2013-08-04 20:21:20.942730300 -0500 ++++ b/glib/glib/gfileutils.c 2013-08-04 18:11:14.000000000 -0500 +@@ -2153,7 +2153,7 @@ g_path_skip_root (const gchar *file_name + { + g_return_val_if_fail (file_name != NULL, NULL); + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + /* Skip \\server\share or //server/share */ + if (G_IS_DIR_SEPARATOR (file_name[0]) && + G_IS_DIR_SEPARATOR (file_name[1]) && +@@ -2163,7 +2163,6 @@ g_path_skip_root (const gchar *file_name + gchar *p; + p = strchr (file_name + 2, G_DIR_SEPARATOR); + +-#ifdef G_OS_WIN32 + { + gchar *q; + +@@ -2171,7 +2170,6 @@ g_path_skip_root (const gchar *file_name + if (p == NULL || (q != NULL && q < p)) + p = q; + } +-#endif + + if (p && p > file_name + 2 && p[1]) + { +--- a/glib/glib/glib.h 2013-08-04 20:21:20.949730700 -0500 ++++ b/glib/glib/glib.h 2013-08-04 18:11:14.000000000 -0500 +@@ -96,7 +96,7 @@ + #include + #include + #include +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + #include + #endif + +--- a/glib/glib/gutf8.c 2013-08-04 20:21:20.984732700 -0500 ++++ b/glib/glib/gutf8.c 2013-08-04 18:11:14.000000000 -0500 +@@ -27,7 +27,7 @@ + #endif + #include + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + #include + #define STRICT + #include +--- a/glib/glib/gutils.c 2013-08-04 20:21:21.015734500 -0500 ++++ b/glib/glib/gutils.c 2013-08-04 18:11:14.000000000 -0500 +@@ -72,7 +72,7 @@ + #include "garray.h" + #include "glibintl.h" + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + #include "gconvert.h" + #include "gwin32.h" + #endif +@@ -86,16 +86,13 @@ + * These are portable utility functions. + */ + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + # include + # ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + # define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 + # define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 + # endif + # include /* For UNLEN */ +-#endif /* G_PLATFORM_WIN32 */ +- +-#ifdef G_OS_WIN32 + # include + # include + /* older SDK (e.g. msvc 5.0) does not have these*/ +@@ -131,7 +128,7 @@ + #include + #endif + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + + gchar * + _glib_get_dll_directory (void) +--- a/glib/glib/gutils.h 2013-08-04 20:21:21.067737500 -0500 ++++ b/glib/glib/gutils.h 2013-08-04 18:11:14.000000000 -0500 +@@ -350,7 +350,7 @@ g_bit_storage (gulong number) + * On non-Windows platforms, expands to nothing. + */ + +-#ifndef G_PLATFORM_WIN32 ++#ifndef G_OS_WIN32 + # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) + #else + # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) \ +@@ -378,7 +378,7 @@ DllMain (HINSTANCE hinstDLL, \ + + #endif /* !G_DISABLE_DEPRECATED */ + +-#endif /* G_PLATFORM_WIN32 */ ++#endif /* G_OS_WIN32 */ + + G_END_DECLS + +--- a/glib/glib/gwin32.h 2013-08-04 20:21:21.081738300 -0500 ++++ b/glib/glib/gwin32.h 2013-08-04 18:11:14.000000000 -0500 +@@ -33,7 +33,7 @@ + + #include + +-#ifdef G_PLATFORM_WIN32 ++#ifdef G_OS_WIN32 + + G_BEGIN_DECLS + +@@ -41,8 +41,6 @@ G_BEGIN_DECLS + #define MAXPATHLEN 1024 + #endif + +-#ifdef G_OS_WIN32 +- + /* + * To get prototypes for the following POSIXish functions, you have to + * include the indicated non-POSIX headers. The functions are defined +@@ -68,7 +66,6 @@ G_BEGIN_DECLS + GLIB_AVAILABLE_IN_ALL + gint g_win32_ftruncate (gint f, + guint size); +-#endif /* G_OS_WIN32 */ + + /* The MS setlocale uses locale names of the form "English_United + * States.1252" etc. We want the Unixish standard form "en", "zh_TW" +@@ -112,7 +109,7 @@ gchar* g_win32_locale_filename_ + + G_END_DECLS + +-#endif /* G_PLATFORM_WIN32 */ ++#endif /* G_OS_WIN32 */ + + #ifdef G_OS_WIN32 + #ifdef _WIN64 +--- a/glib/glib/libcharset/localcharset.c 2013-08-04 20:21:21.095739100 -0500 ++++ b/glib/glib/libcharset/localcharset.c 2013-08-04 18:11:14.000000000 -0500 +@@ -46,10 +46,6 @@ + # include + # endif + # endif +-# ifdef __CYGWIN__ +-# define WIN32_LEAN_AND_MEAN +-# include +-# endif + #elif defined WIN32_NATIVE + # define WIN32_LEAN_AND_MEAN + # include +@@ -111,7 +107,7 @@ _g_locale_get_charset_aliases (void) + cp = charset_aliases; + if (cp == NULL) + { +-#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) ++#if !(defined VMS || defined WIN32_NATIVE) + FILE *fp; + const char *dir; + const char *base = "charset.alias"; +@@ -237,7 +233,7 @@ _g_locale_get_charset_aliases (void) + "DECKOREAN" "\0" "EUC-KR" "\0"; + # endif + +-# if defined WIN32_NATIVE || defined __CYGWIN__ ++# if defined WIN32_NATIVE + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ +@@ -292,53 +288,6 @@ _g_locale_charset_raw (void) + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +-# ifdef __CYGWIN__ +- /* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always +- returns "US-ASCII". As long as this is not fixed, return the suffix +- of the locale name from the environment variables (if present) or +- the codepage as a number. */ +- if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) +- { +- const char *locale; +- static char buf[2 + 10 + 1]; +- +- locale = getenv ("LC_ALL"); +- if (locale == NULL || locale[0] == '\0') +- { +- locale = getenv ("LC_CTYPE"); +- if (locale == NULL || locale[0] == '\0') +- locale = getenv ("LANG"); +- } +- if (locale != NULL && locale[0] != '\0') +- { +- /* If the locale name contains an encoding after the dot, return +- it. */ +- const char *dot = strchr (locale, '.'); +- +- if (dot != NULL) +- { +- const char *modifier; +- +- dot++; +- /* Look for the possible @... trailer and remove it, if any. */ +- modifier = strchr (dot, '@'); +- if (modifier == NULL) +- return dot; +- if (modifier - dot < sizeof (buf)) +- { +- memcpy (buf, dot, modifier - dot); +- buf [modifier - dot] = '\0'; +- return buf; +- } +- } +- } +- +- /* Woe32 has a function returning the locale's codepage as a number. */ +- sprintf (buf, "CP%u", GetACP ()); +- codeset = buf; +- } +-# endif +- + # else + + /* On old systems which lack it, use setlocale or getenv. */ +diff --git a/glib/gtypes.h b/glib/gtypes.h +index c18e0bf..816685a 100644 +--- a/glib/glib/gtypes.h ++++ b/glib/glib/gtypes.h +@@ -462,7 +462,7 @@ G_END_DECLS + * properly get exported in Windows DLLs. + */ + #ifndef GLIB_VAR +-# ifdef G_PLATFORM_WIN32 ++# ifdef G_OS_WIN32 + # ifdef GLIB_STATIC_COMPILATION + # define GLIB_VAR extern + # else /* !GLIB_STATIC_COMPILATION */ diff --git a/pkgs/by-name/pk/pkg-config/default.nix b/pkgs/by-name/pk/pkg-config/default.nix new file mode 100644 index 0000000..663f318 --- /dev/null +++ b/pkgs/by-name/pk/pkg-config/default.nix @@ -0,0 +1,57 @@ +{ lib, stdenv, fetchurl, libiconv, vanilla ? false }: + +stdenv.mkDerivation rec { + pname = "pkg-config"; + version = "0.29.2"; + + src = fetchurl { + url = "https://pkg-config.freedesktop.org/releases/${pname}-${version}.tar.gz"; + sha256 = "14fmwzki1rlz8bs2p810lk6jqdxsk966d8drgsjmi54cd00rrikg"; + }; + + outputs = [ "out" "man" "doc" ]; + strictDeps = true; + + # Process Requires.private properly, see + # http://bugs.freedesktop.org/show_bug.cgi?id=4738, migrated to + # https://gitlab.freedesktop.org/pkg-config/pkg-config/issues/28 + patches = lib.optional (!vanilla) ./requires-private.patch + ++ lib.optional stdenv.isCygwin ./2.36.3-not-win32.patch; + + # These three tests fail due to a (desired) behavior change from our ./requires-private.patch + postPatch = if vanilla then null else '' + rm -f check/check-requires-private check/check-gtk check/missing + ''; + + buildInputs = [ libiconv ]; + + configureFlags = [ "--with-internal-glib" ] + ++ lib.optionals (stdenv.isSunOS) [ "--with-libiconv=gnu" "--with-system-library-path" "--with-system-include-path" "CFLAGS=-DENABLE_NLS" ] + # Can't run these tests while cross-compiling + ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) + [ "glib_cv_stack_grows=no" + "glib_cv_uscore=no" + "ac_cv_func_posix_getpwuid_r=yes" + "ac_cv_func_posix_getgrgid_r=yes" + ]; + + env.NIX_CFLAGS_COMPILE = toString ( + # Silence "incompatible integer to pointer conversion passing 'gsize'" when building with Clang. + lib.optionals stdenv.cc.isClang ["-Wno-int-conversion"] + # Silence fprintf format errors when building for Windows. + ++ lib.optionals stdenv.hostPlatform.isWindows ["-Wno-error=format"] + ); + + enableParallelBuilding = true; + doCheck = true; + + postInstall = ''rm -f "$out"/bin/*-pkg-config''; # clean the duplicate file + + meta = with lib; { + description = "A tool that allows packages to find out information about other packages"; + homepage = "http://pkg-config.freedesktop.org/wiki/"; + platforms = platforms.all; + license = licenses.gpl2Plus; + mainProgram = "pkg-config"; + }; +} diff --git a/pkgs/by-name/pk/pkg-config/packages.nix b/pkgs/by-name/pk/pkg-config/packages.nix new file mode 100644 index 0000000..b4f4847 --- /dev/null +++ b/pkgs/by-name/pk/pkg-config/packages.nix @@ -0,0 +1,17 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + pkg-config-unwrapped = callPackage ./. { }; + + pkg-configUpstream = lowPrio (pkg-config.override (old: { + pkg-config = old.pkg-config.override { + vanilla = true; + }; + })); + + pkg-config = callPackage (path + "/pkgs/build-support/pkg-config-wrapper") { + pkg-config = pkg-config-unwrapped; + }; +} diff --git a/pkgs/by-name/pk/pkg-config/requires-private.patch b/pkgs/by-name/pk/pkg-config/requires-private.patch new file mode 100644 index 0000000..d40aa98 --- /dev/null +++ b/pkgs/by-name/pk/pkg-config/requires-private.patch @@ -0,0 +1,17 @@ +diff --git a/main.c b/main.c +index b61ca34..5a420c2 100644 +--- a/main.c ++++ b/main.c +@@ -602,10 +602,10 @@ main (int argc, char **argv) + else + disable_private_libs(); + +- /* honor Requires.private if any Cflags are requested or any static ++ /* honor Requires.private if any any static + * libs are requested */ + +- if (pkg_flags & CFLAGS_ANY || want_requires_private || want_exists || ++ if (want_requires_private || + (want_static_lib_list && (pkg_flags & LIBS_ANY))) + enable_requires_private(); + diff --git a/pkgs/by-name/po/potrace/default.nix b/pkgs/by-name/po/potrace/default.nix new file mode 100644 index 0000000..b46c206 --- /dev/null +++ b/pkgs/by-name/po/potrace/default.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, fetchurl, zlib }: + +stdenv.mkDerivation rec { + pname = "potrace"; + version = "1.16"; + + src = fetchurl { + url = "https://potrace.sourceforge.net/download/${version}/potrace-${version}.tar.gz"; + sha256 = "1k3sxgjqq0jnpk9xxys05q32sl5hbf1lbk1gmfxcrmpdgnhli0my"; + }; + + configureFlags = [ "--with-libpotrace" ]; + + buildInputs = [ zlib ]; + + enableParallelBuilding = true; + doCheck = true; + + meta = with lib; { + homepage = "https://potrace.sourceforge.net/"; + description = "A tool for tracing a bitmap, which means, transforming a bitmap into a smooth, scalable image"; + platforms = platforms.unix; + maintainers = [ maintainers.pSub ]; + license = licenses.gpl2; + }; +} diff --git a/pkgs/by-name/pr/procps-ng/default.nix b/pkgs/by-name/pr/procps-ng/default.nix new file mode 100644 index 0000000..e4d245f --- /dev/null +++ b/pkgs/by-name/pr/procps-ng/default.nix @@ -0,0 +1,72 @@ +{ lib +, stdenv +, fetchurl +, ncurses +, pkg-config +, fetchpatch + + # `ps` with systemd support is able to properly report different + # attributes like unit name, so we want to have it on linux. +, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd +, systemd + + # procps is mostly Linux-only. Most commands require a running Linux + # system (or very similar like that found in Cygwin). The one + # exception is ‘watch’ which is portable enough to run on pretty much + # any UNIX-compatible system. +, watchOnly ? !(stdenv.isLinux || stdenv.isCygwin) +}: + +stdenv.mkDerivation rec { + pname = "procps"; + version = "3.3.17"; + + # The project's releases are on SF, but git repo on gitlab. + src = fetchurl { + url = "mirror://sourceforge/procps-ng/procps-ng-${version}.tar.xz"; + sha256 = "sha256-RRiz56r9NOwH0AY9JQ/UdJmbILIAIYw65W9dIRPxQbQ="; + }; + + patches = [ + ./v3-CVE-2023-4016.patch + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + # NOTE: Starting from 4.x we will not need a patch anymore, but need to add + # "--disable-w" to configureFlags instead to prevent the utmp errors + (fetchpatch { + name = "musl-fix-includes.patch"; + url = "https://git.alpinelinux.org/aports/plain/main/procps/musl-fixes.patch?id=37cb5b6ef194db66d9ed07c8ecab59bca3b91215"; + sha256 = "sha256-DphAvESmVg1U3bJABU95R++QD34odStCl82EF0vmht0="; + }) + ]; + + buildInputs = [ ncurses ] + ++ lib.optional withSystemd systemd; + nativeBuildInputs = [ pkg-config ]; + + makeFlags = [ "usrbin_execdir=$(out)/bin" ] + ++ lib.optionals watchOnly [ "watch" "PKG_LDFLAGS=" ]; + + enableParallelBuilding = true; + + # Too red; 8bit support for fixing https://github.com/NixOS/nixpkgs/issues/275220 + configureFlags = [ "--disable-modern-top" "--enable-watch8bit" ] + ++ lib.optional withSystemd "--with-systemd" + ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "ac_cv_func_malloc_0_nonnull=yes" + "ac_cv_func_realloc_0_nonnull=yes" + ]; + + installPhase = lib.optionalString watchOnly '' + install -m 0755 -D watch $out/bin/watch + install -m 0644 -D watch.1 $out/share/man/man1/watch.1 + ''; + + meta = with lib; { + homepage = "https://gitlab.com/procps-ng/procps"; + description = "Utilities that give information about processes using the /proc filesystem"; + priority = 11; # less than coreutils, which also provides "kill" and "uptime" + license = licenses.gpl2; + platforms = platforms.unix; + maintainers = [ maintainers.typetetris ]; + }; +} diff --git a/pkgs/by-name/pr/procps-ng/packages.nix b/pkgs/by-name/pr/procps-ng/packages.nix new file mode 100644 index 0000000..3716c19 --- /dev/null +++ b/pkgs/by-name/pr/procps-ng/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + procps = + if stdenv.isLinux + then callPackage ./. { } + else unixtools.procps; +} diff --git a/pkgs/by-name/pr/procps-ng/v3-CVE-2023-4016.patch b/pkgs/by-name/pr/procps-ng/v3-CVE-2023-4016.patch new file mode 100644 index 0000000..2e260ea --- /dev/null +++ b/pkgs/by-name/pr/procps-ng/v3-CVE-2023-4016.patch @@ -0,0 +1,63 @@ +This is https://gitlab.com/procps-ng/procps/-/commit/2c933ecba3bb1d3041a5a7a53a7b4078a6003413.diff +back-ported to procps 3.3.17. That commit changes xmalloc to xcalloc. This patch differs in two ways: + +* We modify it to change malloc (no x-) to xcalloc instead +* We pull in procps-4's definition of xcalloc + +Alternative considered: Also pull in commits that changed malloc to xmalloc and defined xcalloc. +This alternative is rejected because those commits contain many other unrelated changes. + +diff --git a/ps/parser.c b/ps/parser.c +index 4263a1fb..ee9a57d9 100644 +--- a/ps/parser.c ++++ b/ps/parser.c +@@ -36,6 +36,14 @@ + #include "common.h" + #include "c.h" + ++static void *xxcalloc(const size_t nelems, const size_t size) ++{ ++ void *ret = calloc(nelems, size); ++ if (!ret && size && nelems) ++ xerrx(EXIT_FAILURE, "cannot allocate %zu bytes", nelems*size); ++ return ret; ++} ++ + #define ARG_GNU 0 + #define ARG_END 1 + #define ARG_PGRP 2 +@@ -184,7 +192,6 @@ static const char *parse_list(const char *arg, const char *(*parse_fn)(char *, s + const char *err; /* error code that could or did happen */ + /*** prepare to operate ***/ + node = malloc(sizeof(selection_node)); +- node->u = malloc(strlen(arg)*sizeof(sel_union)); /* waste is insignificant */ + node->n = 0; + buf = strdup(arg); + /*** sanity check and count items ***/ +@@ -205,6 +212,7 @@ static const char *parse_list(const char *arg, const char *(*parse_fn)(char *, s + } while (*++walk); + if(need_item) goto parse_error; + node->n = items; ++ node->u = xxcalloc(items, sizeof(sel_union)); + /*** actually parse the list ***/ + walk = buf; + while(items--){ +@@ -1031,15 +1039,15 @@ static const char *parse_trailing_pids(void){ + thisarg = ps_argc - 1; /* we must be at the end now */ + + pidnode = malloc(sizeof(selection_node)); +- pidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */ ++ pidnode->u = xxcalloc(i, sizeof(sel_union)); /* waste is insignificant */ + pidnode->n = 0; + + grpnode = malloc(sizeof(selection_node)); +- grpnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */ ++ grpnode->u = xxcalloc(i, sizeof(sel_union)); /* waste is insignificant */ + grpnode->n = 0; + + sidnode = malloc(sizeof(selection_node)); +- sidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */ ++ sidnode->u = xxcalloc(i, sizeof(sel_union)); /* waste is insignificant */ + sidnode->n = 0; + + while(i--){ diff --git a/pkgs/by-name/ps/psutils/default.nix b/pkgs/by-name/ps/psutils/default.nix new file mode 100644 index 0000000..93c7b9f --- /dev/null +++ b/pkgs/by-name/ps/psutils/default.nix @@ -0,0 +1,35 @@ +{ lib, stdenv, fetchurl, perl }: + +stdenv.mkDerivation rec { + pname = "psutils"; + version = "17"; + + src = fetchurl { + url = "http://knackered.knackered.org/angus/download/${pname}/${pname}-p${version}.tar.gz"; + hash = "sha256-OFPreVhLqPvieoFUJbZan38Vsljg1DoFqFa9t11YiuQ="; + }; + + postPatch = '' + sed -i 's/void main/int main/' *.c + ''; + + configurePhase = '' + sed -e 's,/usr/local/bin/perl,${perl}/bin/perl,' \ + -e "s,/usr/local,$out," \ + -e "s,CFLAGS =,CFLAGS = -std=c89," \ + Makefile.unix > Makefile + ''; + + makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ]; + + preInstall = '' + mkdir -p $out/bin $out/share/man/man1 + ''; + + meta = { + description = "Collection of useful utilities for manipulating PS documents"; + homepage = "http://knackered.knackered.org/angus/psutils/"; + license = lib.licenses.bsd3; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/pu/publicsuffix-list/default.nix b/pkgs/by-name/pu/publicsuffix-list/default.nix new file mode 100644 index 0000000..b2c69df --- /dev/null +++ b/pkgs/by-name/pu/publicsuffix-list/default.nix @@ -0,0 +1,31 @@ +{ lib, stdenvNoCC, fetchFromGitHub }: + +stdenvNoCC.mkDerivation { + pname = "publicsuffix-list"; + version = "0-unstable-2024-01-07"; + + src = fetchFromGitHub { + owner = "publicsuffix"; + repo = "list"; + rev = "5db9b65997e3c9230ac4353b01994c2ae9667cb9"; + hash = "sha256-kIJVS2ETAXQa1MMG8cjRUSFUn+jm9jBWH8go3L+lqHE="; + }; + + dontBuild = true; + + installPhase = '' + runHook preInstall + + install -Dm0444 public_suffix_list.dat tests/test_psl.txt -t $out/share/publicsuffix + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://publicsuffix.org/"; + description = "Cross-vendor public domain suffix database"; + platforms = platforms.all; + license = licenses.mpl20; + maintainers = [ maintainers.c0bw3b ]; + }; +} diff --git a/pkgs/by-name/py/python/catch_conflicts/README.md b/pkgs/by-name/py/python/catch_conflicts/README.md new file mode 100644 index 0000000..d144b80 --- /dev/null +++ b/pkgs/by-name/py/python/catch_conflicts/README.md @@ -0,0 +1,13 @@ + + +catch_conflicts.py +================== + +The file catch_conflicts.py is in a subdirectory because, if it isn't, the +/nix/store/ directory is added to sys.path causing a delay when building. + +Pointers: + +- https://docs.python.org/3/library/sys.html#sys.path + +- https://github.com/NixOS/nixpkgs/pull/23600 diff --git a/pkgs/by-name/py/python/catch_conflicts/catch_conflicts.py b/pkgs/by-name/py/python/catch_conflicts/catch_conflicts.py new file mode 100644 index 0000000..ad679d9 --- /dev/null +++ b/pkgs/by-name/py/python/catch_conflicts/catch_conflicts.py @@ -0,0 +1,84 @@ +from importlib.metadata import PathDistribution +from pathlib import Path +import collections +import sys +import os +from typing import Dict, List, Tuple +do_abort: bool = False +packages: Dict[str, Dict[str, List[Dict[str, List[str]]]]] = collections.defaultdict(list) +out_path: Path = Path(os.getenv("out")) +version: Tuple[int, int] = sys.version_info +site_packages_path: str = f'lib/python{version[0]}.{version[1]}/site-packages' + + +def get_name(dist: PathDistribution) -> str: + return dist.metadata['name'].lower().replace('-', '_') + + +# pretty print a package +def describe_package(dist: PathDistribution) -> str: + return f"{get_name(dist)} {dist.version} ({dist._path})" + + +# pretty print a list of parents (dependency chain) +def describe_parents(parents: List[str]) -> str: + if not parents: + return "" + return \ + f" dependency chain:\n " \ + + str(f"\n ...depending on: ".join(parents)) + + +# inserts an entry into 'packages' +def add_entry(name: str, version: str, store_path: str, parents: List[str]) -> None: + if name not in packages: + packages[name] = {} + if store_path not in packages[name]: + packages[name][store_path] = [] + packages[name][store_path].append(dict( + version=version, + parents=parents, + )) + + +# transitively discover python dependencies and store them in 'packages' +def find_packages(store_path: Path, site_packages_path: str, parents: List[str]) -> None: + site_packages: Path = (store_path / site_packages_path) + propagated_build_inputs: Path = (store_path / "nix-support/propagated-build-inputs") + + # add the current package to the list + if site_packages.exists(): + for dist_info in site_packages.glob("*.dist-info"): + dist: PathDistribution = PathDistribution(dist_info) + add_entry(get_name(dist), dist.version, store_path, parents) + + # recursively add dependencies + if propagated_build_inputs.exists(): + with open(propagated_build_inputs, "r") as f: + build_inputs: List[str] = f.read().strip().split(" ") + for build_input in build_inputs: + if build_input not in parents: + find_packages(Path(build_input), site_packages_path, parents + [build_input]) + + +find_packages(out_path, site_packages_path, [f"this derivation: {out_path}"]) + +# print all duplicates +for name, store_paths in packages.items(): + if len(store_paths) > 1: + do_abort = True + print("Found duplicated packages in closure for dependency '{}': ".format(name)) + for store_path, candidates in store_paths.items(): + for candidate in candidates: + print(f" {name} {candidate['version']} ({store_path})") + print(describe_parents(candidate['parents'])) + +# fail if duplicates were found +if do_abort: + print("") + print( + "Package duplicates found in closure, see above. Usually this " + "happens if two packages depend on different version " + "of the same dependency." + ) + sys.exit(1) diff --git a/pkgs/by-name/py/python/catch_conflicts/catch_conflicts_py2.py b/pkgs/by-name/py/python/catch_conflicts/catch_conflicts_py2.py new file mode 100644 index 0000000..bb82900 --- /dev/null +++ b/pkgs/by-name/py/python/catch_conflicts/catch_conflicts_py2.py @@ -0,0 +1,30 @@ +import pkg_resources +import collections +import sys + +do_abort = False +packages = collections.defaultdict(list) + +for f in sys.path: + for req in pkg_resources.find_distributions(f): + if req not in packages[req.project_name]: + # some exceptions inside buildPythonPackage + if req.project_name in ['setuptools', 'pip', 'wheel']: + continue + packages[req.project_name].append(req) + + +for name, duplicates in packages.items(): + if len(duplicates) > 1: + do_abort = True + print("Found duplicated packages in closure for dependency '{}': ".format(name)) + for dup in duplicates: + print(" " + repr(dup)) + +if do_abort: + print("") + print( + 'Package duplicates found in closure, see above. Usually this ' + 'happens if two packages depend on different version ' + 'of the same dependency.') + sys.exit(1) diff --git a/pkgs/by-name/py/python/conda/default.nix b/pkgs/by-name/py/python/conda/default.nix new file mode 100644 index 0000000..77bda13 --- /dev/null +++ b/pkgs/by-name/py/python/conda/default.nix @@ -0,0 +1,25 @@ +{ pkgs }: { + + # List of libraries that are needed for conda binary packages. + # When installing a conda binary package, just extend + # the `buildInputs` with `condaAutopatchLibs`. + condaPatchelfLibs = builtins.map (p: p.lib or p) ([ + pkgs.alsa-lib + pkgs.cups + pkgs.gcc-unwrapped + pkgs.libGL + ] ++ (with pkgs.xorg; [ + libSM + libICE + libX11 + libXau + libXdamage + libXi + libXrender + libXrandr + libXcomposite + libXcursor + libXtst + libXScrnSaver]) + ); +} diff --git a/pkgs/by-name/py/python/cpython/2.7/2.5.2-ctypes-util-find_library.patch b/pkgs/by-name/py/python/cpython/2.7/2.5.2-ctypes-util-find_library.patch new file mode 100644 index 0000000..22bc0f7 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.5.2-ctypes-util-find_library.patch @@ -0,0 +1,34 @@ +--- origsrc/Lib/ctypes/util.py 2007-09-14 15:05:26.000000000 -0500 ++++ src/Lib/ctypes/util.py 2008-11-25 17:54:47.319296200 -0600 +@@ -41,6 +41,20 @@ + continue + return None + ++elif sys.platform == "cygwin": ++ def find_library(name): ++ for libdir in ['/usr/lib', '/usr/local/lib']: ++ for libext in ['lib%s.dll.a' % name, 'lib%s.a' % name]: ++ implib = os.path.join(libdir, libext) ++ if not os.path.exists(implib): ++ continue ++ cmd = "dlltool -I " + implib + " 2>/dev/null" ++ res = os.popen(cmd).read().replace("\n","") ++ if not res: ++ continue ++ return res ++ return None ++ + elif os.name == "posix": + # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump + import re, tempfile, errno +@@ -157,6 +173,10 @@ + print cdll.LoadLibrary("libcrypto.dylib") + print cdll.LoadLibrary("libSystem.dylib") + print cdll.LoadLibrary("System.framework/System") ++ elif sys.platform == "cygwin": ++ print cdll.LoadLibrary("cygbz2-1.dll") ++ print find_library("crypt") ++ print cdll.LoadLibrary("cygcrypt-0.dll") + else: + print cdll.LoadLibrary("libm.so") + print cdll.LoadLibrary("libcrypt.so") diff --git a/pkgs/by-name/py/python/cpython/2.7/2.5.2-tkinter-x11.patch b/pkgs/by-name/py/python/cpython/2.7/2.5.2-tkinter-x11.patch new file mode 100644 index 0000000..28b6daf --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.5.2-tkinter-x11.patch @@ -0,0 +1,27 @@ +--- origsrc/setup.py 2008-02-04 17:41:02.000000000 -0600 ++++ src/setup.py 2008-07-02 02:11:28.671875000 -0500 +@@ -1277,12 +1279,6 @@ + include_dirs.append('/usr/X11/include') + added_lib_dirs.append('/usr/X11/lib') + +- # If Cygwin, then verify that X is installed before proceeding +- if host_platform == 'cygwin': +- x11_inc = find_file('X11/Xlib.h', [], include_dirs) +- if x11_inc is None: +- return +- + # Check for BLT extension + if self.compiler.find_library_file(lib_dirs + added_lib_dirs, + 'BLT8.0'): +@@ -1300,9 +1296,8 @@ + if host_platform in ['aix3', 'aix4']: + libs.append('ld') + +- # Finally, link with the X11 libraries (not appropriate on cygwin) +- if host_platform != "cygwin": +- libs.append('X11') ++ # Finally, link with the X11 libraries ++ libs.append('X11') + + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)] + defs, diff --git a/pkgs/by-name/py/python/cpython/2.7/2.6.2-ssl-threads.patch b/pkgs/by-name/py/python/cpython/2.7/2.6.2-ssl-threads.patch new file mode 100644 index 0000000..bef137e --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.6.2-ssl-threads.patch @@ -0,0 +1,13 @@ +--- origsrc/Modules/_ssl.c 2009-01-26 10:55:41.000000000 -0600 ++++ src/Modules/_ssl.c 2009-08-20 00:04:59.346816700 -0500 +@@ -15,6 +15,10 @@ + + #include "Python.h" + ++#ifdef __CYGWIN__ ++#undef WITH_THREAD ++#endif ++ + #ifdef WITH_THREAD + #include "pythread.h" + #define PySSL_BEGIN_ALLOW_THREADS { \ diff --git a/pkgs/by-name/py/python/cpython/2.7/2.6.5-FD_SETSIZE.patch b/pkgs/by-name/py/python/cpython/2.7/2.6.5-FD_SETSIZE.patch new file mode 100644 index 0000000..d1dae8c --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.6.5-FD_SETSIZE.patch @@ -0,0 +1,41 @@ +--- Python-2.6.5.orig/Modules/selectmodule.c 2012-02-02 22:35:21.835125000 -0500 ++++ Python-2.6.5/Modules/selectmodule.c 2012-02-02 22:41:41.210125000 -0500 +@@ -6,6 +6,21 @@ + >= 0. + */ + ++/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined. ++ 64 is too small (too many people have bumped into that limit). ++ Here we boost it. ++ ++ Cygwin also defines FD_SETSIZE to 64, so also increase the limit on ++ Cygwin. We must do this before sys/types.h is included, which otherwise ++ sets FD_SETSIZE to the default. ++ ++ Users who want even more than the boosted limit should #define ++ FD_SETSIZE higher before this; e.g., via compiler /D switch. ++*/ ++#if (defined(MS_WINDOWS) || defined(__CYGWIN__)) && !defined(FD_SETSIZE) ++#define FD_SETSIZE 512 ++#endif ++ + #include "Python.h" + #include + +@@ -16,16 +31,6 @@ + #undef HAVE_BROKEN_POLL + #endif + +-/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined. +- 64 is too small (too many people have bumped into that limit). +- Here we boost it. +- Users who want even more than the boosted limit should #define +- FD_SETSIZE higher before this; e.g., via compiler /D switch. +-*/ +-#if defined(MS_WINDOWS) && !defined(FD_SETSIZE) +-#define FD_SETSIZE 512 +-#endif +- + #if defined(HAVE_POLL_H) + #include + #elif defined(HAVE_SYS_POLL_H) diff --git a/pkgs/by-name/py/python/cpython/2.7/2.6.5-export-PySignal_SetWakeupFd.patch b/pkgs/by-name/py/python/cpython/2.7/2.6.5-export-PySignal_SetWakeupFd.patch new file mode 100644 index 0000000..ea69697 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.6.5-export-PySignal_SetWakeupFd.patch @@ -0,0 +1,11 @@ +--- origsrc/Include/pyerrors.h 2008-06-08 23:58:54.000000000 -0500 ++++ src/Include/pyerrors.h 2010-05-12 04:19:31.535297200 -0500 +@@ -232,7 +232,7 @@ PyAPI_FUNC(int) PyErr_CheckSignals(void) + PyAPI_FUNC(void) PyErr_SetInterrupt(void); + + /* In signalmodule.c */ +-int PySignal_SetWakeupFd(int fd); ++PyAPI_FUNC(int) PySignal_SetWakeupFd(int fd); + + /* Support for adding program text to SyntaxErrors */ + PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int); diff --git a/pkgs/by-name/py/python/cpython/2.7/2.6.5-ncurses-abi6.patch b/pkgs/by-name/py/python/cpython/2.7/2.6.5-ncurses-abi6.patch new file mode 100644 index 0000000..e1cf5ad --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.6.5-ncurses-abi6.patch @@ -0,0 +1,16 @@ +--- origsrc/Include/py_curses.h 2009-09-06 16:23:05.000000000 -0500 ++++ src/Include/py_curses.h 2010-04-14 15:21:23.008971400 -0500 +@@ -17,6 +17,13 @@ + #define NCURSES_OPAQUE 0 + #endif /* __APPLE__ */ + ++#ifdef __CYGWIN__ ++/* the following define is necessary for Cygwin; without it, the ++ Cygwin-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python ++ can't get at the WINDOW flags field. */ ++#define NCURSES_INTERNALS ++#endif /* __CYGWIN__ */ ++ + #ifdef __FreeBSD__ + /* + ** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards diff --git a/pkgs/by-name/py/python/cpython/2.7/2.7.3-dbm.patch b/pkgs/by-name/py/python/cpython/2.7/2.7.3-dbm.patch new file mode 100644 index 0000000..bfaeb37 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.7.3-dbm.patch @@ -0,0 +1,27 @@ +--- origsrc/setup.py.orig 2012-11-27 10:20:47.442395900 -0500 ++++ src/setup.py 2012-11-27 10:53:15.583020900 -0500 +@@ -1141,7 +1141,7 @@ + + dbm_order = ['gdbm'] + # The standard Unix dbm module: +- if host_platform not in ['cygwin']: ++ if host_platform not in ['win32']: + config_args = [arg.strip("'") + for arg in sysconfig.get_config_var("CONFIG_ARGS").split()] + dbm_args = [arg for arg in config_args +@@ -1192,6 +1192,15 @@ + ], + libraries = gdbm_libs) + break ++ if find_file("ndbm.h", inc_dirs, []) is not None: ++ print("building dbm using gdbm") ++ dbmext = Extension( ++ 'dbm', ['dbmmodule.c'], ++ define_macros=[ ++ ('HAVE_NDBM_H', None), ++ ], ++ libraries = gdbm_libs) ++ break + elif cand == "bdb": + if db_incs is not None: + print "building dbm using bdb" diff --git a/pkgs/by-name/py/python/cpython/2.7/2.7.3-dylib.patch b/pkgs/by-name/py/python/cpython/2.7/2.7.3-dylib.patch new file mode 100644 index 0000000..6e1fc8b --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.7.3-dylib.patch @@ -0,0 +1,10 @@ +--- origsrc/Lib/distutils/unixccompiler.py.orig 2012-11-27 07:44:15.409993500 -0500 ++++ src/Lib/distutils/unixccompiler.py 2012-11-27 08:09:57.801770900 -0500 +@@ -141,6 +141,7 @@ + static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s" + if sys.platform == "cygwin": + exe_extension = ".exe" ++ dylib_lib_extension = ".dll.a" + + def preprocess(self, source, + output_file=None, macros=None, include_dirs=None, diff --git a/pkgs/by-name/py/python/cpython/2.7/2.7.3-getpath-exe-extension.patch b/pkgs/by-name/py/python/cpython/2.7/2.7.3-getpath-exe-extension.patch new file mode 100644 index 0000000..68f6921 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.7.3-getpath-exe-extension.patch @@ -0,0 +1,31 @@ +--- origsrc/Modules/getpath.c.orig 2012-11-27 12:07:56.098645900 -0500 ++++ src/Modules/getpath.c 2012-11-27 12:10:11.254895900 -0500 +@@ -436,6 +436,28 @@ + if (isxfile(progpath)) + break; + ++#ifdef __CYGWIN__ ++ /* ++ * Cygwin automatically removes the ".exe" extension from argv[0] ++ * to make programs feel like they are in a more Unix-like ++ * environment. Unfortunately, this can make it problemmatic for ++ * Cygwin to distinguish between a directory and an executable with ++ * the same name excluding the ".exe" extension. For example, the ++ * Cygwin Python build directory has a "Python" directory and a ++ * "python.exe" executable. This causes isxfile() to erroneously ++ * return false. If isdir() returns true and there is enough space ++ * to append the ".exe" extension, then we try again with the ++ * extension appended. ++ */ ++#define EXE ".exe" ++ if (isdir(progpath) && strlen(progpath) + strlen(EXE) <= MAXPATHLEN) ++ { ++ strcat(progpath, EXE); ++ if (isxfile(progpath)) ++ break; ++ } ++#endif /* __CYGWIN__ */ ++ + if (!delim) { + progpath[0] = '\0'; + break; diff --git a/pkgs/by-name/py/python/cpython/2.7/2.7.3-no-libm.patch b/pkgs/by-name/py/python/cpython/2.7/2.7.3-no-libm.patch new file mode 100644 index 0000000..55281db --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/2.7.3-no-libm.patch @@ -0,0 +1,11 @@ +--- origsrc/setup.py.orig 2012-11-27 09:28:34.051770900 -0500 ++++ src/setup.py 2012-11-27 09:28:47.239270900 -0500 +@@ -470,7 +470,7 @@ + + # Check for MacOS X, which doesn't need libm.a at all + math_libs = ['m'] +- if host_platform in ['darwin', 'beos']: ++ if host_platform in ['darwin', 'beos', 'cygwin']: + math_libs = [] + + # XXX Omitted modules: gl, pure, dl, SGI-specific modules diff --git a/pkgs/by-name/py/python/cpython/2.7/atomic_pyc.patch b/pkgs/by-name/py/python/cpython/2.7/atomic_pyc.patch new file mode 100644 index 0000000..06d3718 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/atomic_pyc.patch @@ -0,0 +1,116 @@ +diff --git a/Lib/py_compile.py b/Lib/py_compile.py +index 978da73d74..3559eb95ca 100644 +--- a/Lib/py_compile.py ++++ b/Lib/py_compile.py +@@ -120,16 +120,27 @@ def compile(file, cfile=None, dfile=None, doraise=False): + return + if cfile is None: + cfile = file + (__debug__ and 'c' or 'o') +- with open(cfile, 'wb') as fc: +- fc.write('\0\0\0\0') +- if "DETERMINISTIC_BUILD" in os.environ: ++ # Atomically write the pyc/pyo file. Issue #13146. ++ # id() is used to generate a pseudo-random filename. ++ path_tmp = '{}.{}'.format(cfile, id(cfile)) ++ try: ++ with open(path_tmp, 'wb') as fc: + fc.write('\0\0\0\0') +- else: +- wr_long(fc, timestamp) +- marshal.dump(codeobject, fc) +- fc.flush() +- fc.seek(0, 0) +- fc.write(MAGIC) ++ if "DETERMINISTIC_BUILD" in os.environ: ++ fc.write('\0\0\0\0') ++ else: ++ wr_long(fc, timestamp) ++ marshal.dump(codeobject, fc) ++ fc.flush() ++ fc.seek(0, 0) ++ fc.write(MAGIC) ++ os.rename(path_tmp, cfile) ++ except OSError: ++ try: ++ os.unlink(path_tmp) ++ except OSError: ++ pass ++ raise + + def main(args=None): + """Compile several source files. +diff --git a/Python/import.c b/Python/import.c +index 1e31d79279..f78a1efcf0 100644 +--- a/Python/import.c ++++ b/Python/import.c +@@ -951,6 +951,8 @@ static void + write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, time_t mtime) + { + FILE *fp; ++ size_t cpathname_len; ++ char *cpathname_tmp; + #ifdef MS_WINDOWS /* since Windows uses different permissions */ + mode_t mode = srcstat->st_mode & ~S_IEXEC; + /* Issue #6074: We ensure user write access, so we can delete it later +@@ -963,11 +965,28 @@ write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, t + mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; + #endif + ++#ifdef MS_WINDOWS + fp = open_exclusive(cpathname, mode); ++#else ++ /* Under POSIX, we first write to a tmp file and then take advantage ++ of atomic renaming. */ ++ cpathname_len = strlen(cpathname); ++ cpathname_tmp = PyMem_MALLOC(cpathname_len + 5); ++ if (cpathname_tmp == NULL) { ++ PyErr_Clear(); ++ return; ++ } ++ memcpy(cpathname_tmp, cpathname, cpathname_len); ++ memcpy(cpathname_tmp + cpathname_len, ".tmp", 5); ++ fp = open_exclusive(cpathname_tmp, mode); ++#endif + if (fp == NULL) { + if (Py_VerboseFlag) + PySys_WriteStderr( + "# can't create %s\n", cpathname); ++#ifndef MS_WINDOWS ++ PyMem_FREE(cpathname_tmp); ++#endif + return; + } + PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION); +@@ -979,7 +998,12 @@ write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, t + PySys_WriteStderr("# can't write %s\n", cpathname); + /* Don't keep partial file */ + fclose(fp); ++#ifdef MS_WINDOWS + (void) unlink(cpathname); ++#else ++ (void) unlink(cpathname_tmp); ++ PyMem_FREE(cpathname_tmp); ++#endif + return; + } + /* Now write the true mtime (as a 32-bit field) */ +@@ -989,6 +1013,19 @@ write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat, t + PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); + fflush(fp); + } ++ /* Under POSIX, do an atomic rename */ ++#ifndef MS_WINDOWS ++ if (rename(cpathname_tmp, cpathname)) { ++ if (Py_VerboseFlag) ++ PySys_WriteStderr("# can't write %s\n", cpathname); ++ /* Don't keep tmp file */ ++ fclose(fp); ++ (void) unlink(cpathname_tmp); ++ PyMem_FREE(cpathname_tmp); ++ return; ++ } ++ PyMem_FREE(cpathname_tmp); ++#endif + fclose(fp); + if (Py_VerboseFlag) + PySys_WriteStderr("# wrote %s\n", cpathname); diff --git a/pkgs/by-name/py/python/cpython/2.7/cross-compile.patch b/pkgs/by-name/py/python/cpython/2.7/cross-compile.patch new file mode 100644 index 0000000..c83b564 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/cross-compile.patch @@ -0,0 +1,32 @@ +--- ./setup.py.orig 2018-04-29 15:47:33.000000000 -0700 ++++ ./setup.py 2018-11-11 09:41:58.097682221 -0800 +@@ -458,8 +458,6 @@ + if not cross_compiling: + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') +- if cross_compiling: +- self.add_gcc_paths() + self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and +@@ -517,7 +515,10 @@ + # be assumed that no additional -I,-L directives are needed. + inc_dirs = self.compiler.include_dirs[:] + lib_dirs = self.compiler.library_dirs[:] +- if not cross_compiling: ++ if cross_compiling: ++ inc_dirs = [] ++ lib_dirs = [] ++ else: + for d in ( + '/usr/include', + ): +@@ -582,6 +584,8 @@ class PyBuildExt(build_ext): + # Some modules that are normally always on: + #exts.append( Extension('_weakref', ['_weakref.c']) ) + ++ self.compiler.library_dirs = lib_dirs + [ '.' ] ++ + # array objects + exts.append( Extension('array', ['arraymodule.c']) ) + diff --git a/pkgs/by-name/py/python/cpython/2.7/default.nix b/pkgs/by-name/py/python/cpython/2.7/default.nix new file mode 100644 index 0000000..dda254f --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/default.nix @@ -0,0 +1,364 @@ +{ lib, stdenv, fetchFromGitHub, fetchpatch +, bzip2 +, expat +, libffi +, gdbm +, db +, ncurses +, openssl +, readline +, sqlite +, tcl ? null, tk ? null, tix ? null, libX11 ? null, x11Support ? false +, zlib +, self +, configd, coreutils +, autoreconfHook +, python-setup-hook +# Some proprietary libs assume UCS2 unicode, especially on darwin :( +, ucsEncoding ? 4 +# For the Python package set +, packageOverrides ? (self: super: {}) +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsTargetTarget +, sourceVersion +, hash +, passthruFun +, static ? stdenv.hostPlatform.isStatic +, stripBytecode ? reproducibleBuild +, rebuildBytecode ? true +, reproducibleBuild ? false +, enableOptimizations ? false +, strip2to3 ? false +, stripConfig ? false +, stripIdlelib ? false +, stripTests ? false +, pythonAttr ? "python${sourceVersion.major}${sourceVersion.minor}" +}: + +assert x11Support -> tcl != null + && tk != null + && libX11 != null; + +assert lib.assertMsg (enableOptimizations -> (!stdenv.cc.isClang)) + "Optimizations with clang are not supported. configure: error: llvm-profdata is required for a --enable-optimizations build but could not be found."; + +assert lib.assertMsg (reproducibleBuild -> stripBytecode) + "Deterministic builds require stripping bytecode."; + +assert lib.assertMsg (reproducibleBuild -> (!enableOptimizations)) + "Deterministic builds are not achieved when optimizations are enabled."; + +assert lib.assertMsg (reproducibleBuild -> (!rebuildBytecode)) + "Deterministic builds are not achieved when (default unoptimized) bytecode is created."; + +let + buildPackages = pkgsBuildHost; + inherit (passthru) pythonOnBuildForHost; + + pythonOnBuildForHostInterpreter = if stdenv.hostPlatform == stdenv.buildPlatform then + "$out/bin/python" + else pythonOnBuildForHost.interpreter; + + passthru = passthruFun rec { + inherit self sourceVersion packageOverrides; + implementation = "cpython"; + libPrefix = "python${pythonVersion}"; + executable = libPrefix; + pythonVersion = with sourceVersion; "${major}.${minor}"; + sitePackages = "lib/${libPrefix}/site-packages"; + inherit hasDistutilsCxxPatch pythonAttr; + pythonOnBuildForBuild = pkgsBuildBuild.${pythonAttr}; + pythonOnBuildForHost = pkgsBuildHost.${pythonAttr}; + pythonOnBuildForTarget = pkgsBuildTarget.${pythonAttr}; + pythonOnHostForHost = pkgsHostHost.${pythonAttr}; + pythonOnTargetForTarget = pkgsTargetTarget.${pythonAttr} or {}; + } // { + inherit ucsEncoding; + }; + + version = with sourceVersion; "${major}.${minor}.${patch}${suffix}"; + + # ActiveState is a fork of cpython that includes fixes for security + # issues after its EOL + src = fetchFromGitHub { + owner = "ActiveState"; + repo = "cpython"; + rev = "v${version}"; + inherit hash; + }; + + hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false); + patches = + [ # Look in C_INCLUDE_PATH and LIBRARY_PATH for stuff. + ./search-path.patch + + # Python recompiles a Python if the mtime stored *in* the + # pyc/pyo file differs from the mtime of the source file. This + # doesn't work in Nix because Nix changes the mtime of files in + # the Nix store to 1. So treat that as a special case. + ./nix-store-mtime.patch + + # patch python to put zero timestamp into pyc + # if DETERMINISTIC_BUILD env var is set + ./deterministic-build.patch + + # Fix python bug #27177 (https://bugs.python.org/issue27177) + # The issue is that `match.group` only recognizes python integers + # instead of everything that has `__index__`. + # This bug was fixed upstream, but not backported to 2.7 + (fetchpatch { + name = "re_match_index.patch"; + url = "https://bugs.python.org/file43084/re_match_index.patch"; + sha256 = "0l9rw6r5r90iybdkp3hhl2pf0h0s1izc68h5d3ywrm92pq32wz57"; + }) + + # Fix race-condition during pyc creation. Has a slight backwards + # incompatible effect: pyc symlinks will now be overridden + # (https://bugs.python.org/issue17222). Included in python >= 3.4, + # backported in debian since 2013. + # https://bugs.python.org/issue13146 + ./atomic_pyc.patch + + # Backport from CPython 3.8 of a good list of tests to run for PGO. + ./profile-task.patch + + # The workaround is for unittests on Win64, which we don't support. + # It does break aarch64-darwin, which we do support. See: + # * https://bugs.python.org/issue35523 + # * https://github.com/python/cpython/commit/e6b247c8e524 + ../3.7/no-win64-workaround.patch + + # fix openssl detection by reverting irrelevant change for us, to enable hashlib which is required by pip + (fetchpatch { + url = "https://github.com/ActiveState/cpython/pull/35/commits/20ea5b46aaf1e7bdf9d6905ba8bece2cc73b05b0.patch"; + revert = true; + hash = "sha256-Lp5fGlcfJJ6p6vKmcLckJiAA2AZz4prjFE0aMEJxotw="; + }) + ] ++ lib.optionals (x11Support && stdenv.isDarwin) [ + ./use-correct-tcl-tk-on-darwin.patch + + ] ++ lib.optionals stdenv.isDarwin [ + # Fix darwin build https://bugs.python.org/issue34027 + ../3.7/darwin-libutil.patch + + ] ++ lib.optionals stdenv.isLinux [ + + # Disable the use of ldconfig in ctypes.util.find_library (since + # ldconfig doesn't work on NixOS), and don't use + # ctypes.util.find_library during the loading of the uuid module + # (since it will do a futile invocation of gcc (!) to find + # libuuid, slowing down program startup a lot). + ./no-ldconfig.patch + + # Fix ctypes.util.find_library with gcc10. + ./find_library-gcc10.patch + + ] ++ lib.optionals stdenv.hostPlatform.isCygwin [ + ./2.5.2-ctypes-util-find_library.patch + ./2.5.2-tkinter-x11.patch + ./2.6.2-ssl-threads.patch + ./2.6.5-export-PySignal_SetWakeupFd.patch + ./2.6.5-FD_SETSIZE.patch + ./2.6.5-ncurses-abi6.patch + ./2.7.3-dbm.patch + ./2.7.3-dylib.patch + ./2.7.3-getpath-exe-extension.patch + ./2.7.3-no-libm.patch + ] ++ lib.optionals hasDistutilsCxxPatch [ + + # Patch from http://bugs.python.org/issue1222585 adapted to work with + # `patch -p1' and with a last hunk removed + # Upstream distutils is calling C compiler to compile C++ code, which + # only works for GCC and Apple Clang. This makes distutils to call C++ + # compiler when needed. + ./python-2.7-distutils-C++.patch + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + ./cross-compile.patch + ]; + + preConfigure = '' + # Purity. + for i in /usr /sw /opt /pkg; do + substituteInPlace ./setup.py --replace $i /no-such-path + done + '' + lib.optionalString (stdenv ? cc && stdenv.cc.libc != null) '' + for i in Lib/plat-*/regen; do + substituteInPlace $i --replace /usr/include/ ${stdenv.cc.libc}/include/ + done + '' + lib.optionalString stdenv.isDarwin '' + substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"' + substituteInPlace Lib/multiprocessing/__init__.py \ + --replace 'os.popen(comm)' 'os.popen("${coreutils}/bin/nproc")' + ''; + + configureFlags = lib.optionals enableOptimizations [ + "--enable-optimizations" + ] ++ lib.optionals (!static) [ + "--enable-shared" + ] ++ [ + "--with-threads" + "--with-system-ffi" + "--with-system-expat" + "--enable-unicode=ucs${toString ucsEncoding}" + ] ++ lib.optionals stdenv.hostPlatform.isCygwin [ + "ac_cv_func_bind_textdomain_codeset=yes" + ] ++ lib.optionals stdenv.isDarwin [ + "--disable-toolbox-glue" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "PYTHON_FOR_BUILD=${lib.getBin buildPackages.python}/bin/python" + "ac_cv_buggy_getaddrinfo=no" + # Assume little-endian IEEE 754 floating point when cross compiling + "ac_cv_little_endian_double=yes" + "ac_cv_big_endian_double=no" + "ac_cv_mixed_endian_double=no" + "ac_cv_x87_double_rounding=yes" + "ac_cv_tanh_preserves_zero_sign=yes" + # Generally assume that things are present and work + "ac_cv_posix_semaphores_enabled=yes" + "ac_cv_broken_sem_getvalue=no" + "ac_cv_wchar_t_signed=yes" + "ac_cv_rshift_extends_sign=yes" + "ac_cv_broken_nice=no" + "ac_cv_broken_poll=no" + "ac_cv_working_tzset=yes" + "ac_cv_have_long_long_format=yes" + "ac_cv_have_size_t_format=yes" + "ac_cv_computed_gotos=yes" + "ac_cv_file__dev_ptmx=yes" + "ac_cv_file__dev_ptc=yes" + ] + # Never even try to use lchmod on linux, + # don't rely on detecting glibc-isms. + ++ lib.optional stdenv.hostPlatform.isLinux "ac_cv_func_lchmod=no" + ++ lib.optional static "LDFLAGS=-static"; + + strictDeps = true; + buildInputs = + lib.optional (stdenv ? cc && stdenv.cc.libc != null) stdenv.cc.libc ++ + [ bzip2 openssl zlib libffi expat db gdbm ncurses sqlite readline ] + ++ lib.optionals x11Support [ tcl tk libX11 ] + ++ lib.optional (stdenv.isDarwin && configd != null) configd; + nativeBuildInputs = + [ autoreconfHook ] + ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) + [ buildPackages.stdenv.cc buildPackages.python ]; + + mkPaths = paths: { + C_INCLUDE_PATH = lib.makeSearchPathOutput "dev" "include" paths; + LIBRARY_PATH = lib.makeLibraryPath paths; + }; + + # Python 2.7 needs this + crossCompileEnv = lib.optionalAttrs (stdenv.hostPlatform != stdenv.buildPlatform) + { _PYTHON_HOST_PLATFORM = stdenv.hostPlatform.config; }; + + # Build the basic Python interpreter without modules that have + # external dependencies. + +in with passthru; stdenv.mkDerivation ({ + pname = "python"; + inherit version; + + inherit src patches buildInputs nativeBuildInputs preConfigure configureFlags; + + LDFLAGS = lib.optionalString (!stdenv.isDarwin) "-lgcc_s"; + inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH; + + env.NIX_CFLAGS_COMPILE = lib.optionalString (stdenv.targetPlatform.system == "x86_64-darwin") "-msse2" + + lib.optionalString stdenv.hostPlatform.isMusl " -DTHREAD_STACK_SIZE=0x100000"; + DETERMINISTIC_BUILD = 1; + + setupHook = python-setup-hook sitePackages; + + postPatch = lib.optionalString (x11Support && (tix != null)) '' + substituteInPlace "Lib/lib-tk/Tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'" + ''; + + postInstall = + '' + # needed for some packages, especially packages that backport + # functionality to 2.x from 3.x + for item in $out/lib/${libPrefix}/test/*; do + if [[ "$item" != */test_support.py* + && "$item" != */test/support + && "$item" != */test/regrtest.py* ]]; then + rm -rf "$item" + else + echo $item + fi + done + touch $out/lib/${libPrefix}/test/__init__.py + ln -s $out/lib/${libPrefix}/pdb.py $out/bin/pdb + ln -s $out/lib/${libPrefix}/pdb.py $out/bin/pdb${sourceVersion.major}.${sourceVersion.minor} + ln -s $out/share/man/man1/{python2.7.1.gz,python.1.gz} + + rm "$out"/lib/python*/plat-*/regen # refers to glibc.dev + + # Determinism: Windows installers were not deterministic. + # We're also not interested in building Windows installers. + find "$out" -name 'wininst*.exe' | xargs -r rm -f + '' + lib.optionalString stripBytecode '' + # Determinism: deterministic bytecode + # First we delete all old bytecode. + find $out -name "*.pyc" -delete + '' + lib.optionalString rebuildBytecode '' + # We build 3 levels of optimized bytecode. Note the default level, without optimizations, + # is not reproducible yet. https://bugs.python.org/issue29708 + # Not creating bytecode will result in a large performance loss however, so we do build it. + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -m compileall -q -f -x "lib2to3" -i - + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -O -m compileall -q -f -x "lib2to3" -i - + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -OO -m compileall -q -f -x "lib2to3" -i - + '' + lib.optionalString stdenv.hostPlatform.isCygwin '' + cp libpython2.7.dll.a $out/lib + ''; + + inherit passthru; + + postFixup = '' + # Include a sitecustomize.py file. Note it causes an error when it's in postInstall with 2.7. + cp ${../../sitecustomize.py} $out/${sitePackages}/sitecustomize.py + '' + lib.optionalString strip2to3 '' + rm -R $out/bin/2to3 $out/lib/python*/lib2to3 + '' + lib.optionalString stripConfig '' + rm -R $out/bin/python*-config $out/lib/python*/config* + '' + lib.optionalString stripIdlelib '' + # Strip IDLE + rm -R $out/bin/idle* $out/lib/python*/idlelib + '' + lib.optionalString stripTests '' + # Strip tests + rm -R $out/lib/python*/test $out/lib/python*/**/test{,s} + ''; + + enableParallelBuilding = true; + + doCheck = false; # expensive, and fails + + meta = { + homepage = "http://python.org"; + description = "A high-level dynamically-typed programming language"; + longDescription = '' + Python is a remarkably powerful dynamic programming language that + is used in a wide variety of application domains. Some of its key + distinguishing features include: clear, readable syntax; strong + introspection capabilities; intuitive object orientation; natural + expression of procedural code; full modularity, supporting + hierarchical packages; exception-based error handling; and very + high level dynamic data types. + ''; + license = lib.licenses.psfl; + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ fridh ]; + knownVulnerabilities = [ + "Python 2.7 has reached its end of life after 2020-01-01. See https://www.python.org/doc/sunset-python-2/." + # Quote: That means that we will not improve it anymore after that day, + # even if someone finds a security problem in it. You should upgrade to + # Python 3 as soon as you can. [..] So, in 2008, we announced that we + # would sunset Python 2 in 2015, and asked people to upgrade before + # then. Some did, but many did not. So, in 2014, we extended that + # sunset till 2020. + ]; + }; + } // crossCompileEnv) diff --git a/pkgs/by-name/py/python/cpython/2.7/deterministic-build.patch b/pkgs/by-name/py/python/cpython/2.7/deterministic-build.patch new file mode 100644 index 0000000..98d9d33 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/deterministic-build.patch @@ -0,0 +1,36 @@ +diff -ur orig/Lib/py_compile.py new/Lib/py_compile.py +--- orig/Lib/py_compile.py ++++ new/Lib/py_compile.py +@@ -122,7 +122,10 @@ + cfile = file + (__debug__ and 'c' or 'o') + with open(cfile, 'wb') as fc: + fc.write('\0\0\0\0') +- wr_long(fc, timestamp) ++ if "DETERMINISTIC_BUILD" in os.environ: ++ fc.write('\0\0\0\0') ++ else: ++ wr_long(fc, timestamp) + marshal.dump(codeobject, fc) + fc.flush() + fc.seek(0, 0) +diff -ur orig/Python/import.c new/Python/import.c +--- orig/Python/import.c ++++ new/Python/import.c +@@ -939,10 +939,12 @@ + return; + } + /* Now write the true mtime (as a 32-bit field) */ +- fseek(fp, 4L, 0); +- assert(mtime <= 0xFFFFFFFF); +- PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); +- fflush(fp); ++ if (Py_GETENV("DETERMINISTIC_BUILD") == NULL) { ++ fseek(fp, 4L, 0); ++ assert(mtime <= 0xFFFFFFFF); ++ PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); ++ fflush(fp); ++ } + fclose(fp); + if (Py_VerboseFlag) + PySys_WriteStderr("# wrote %s\n", cpathname); + diff --git a/pkgs/by-name/py/python/cpython/2.7/find_library-gcc10.patch b/pkgs/by-name/py/python/cpython/2.7/find_library-gcc10.patch new file mode 100644 index 0000000..4627baf --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/find_library-gcc10.patch @@ -0,0 +1,79 @@ +Backport https://github.com/python/cpython/commit/82df3b3071bb003247c33eac4670775e9883c994 +and https://github.com/python/cpython/commit/27ac19cca2c639caaf6fedf3632fe6beb265f24f + +Fixes the check phase of python2Packages.cffi. + +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -87,6 +87,12 @@ elif os.name == "posix": + # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump + import re, tempfile, errno + ++ def _is_elf(filename): ++ "Return True if the given file is an ELF file" ++ elf_header = b'\x7fELF' ++ with open(filename, 'rb') as thefile: ++ return thefile.read(4) == elf_header ++ + def _findLib_gcc(name): + # Run GCC's linker with the -t (aka --trace) option and examine the + # library name it prints out. The GCC command will fail because we +@@ -110,10 +116,17 @@ elif os.name == "posix": + # the normal behaviour of GCC if linking fails + if e.errno != errno.ENOENT: + raise +- res = re.search(expr, trace) ++ res = re.findall(expr, trace) + if not res: + return None +- return res.group(0) ++ ++ for file in res: ++ # Check if the given file is an elf file: gcc can report ++ # some files that are linker scripts and not actual ++ # shared objects. See bpo-41976 for more details ++ if not _is_elf(file): ++ continue ++ return file + + + if sys.platform == "sunos5": +@@ -237,8 +250,37 @@ elif os.name == "posix": + def _findSoname_ldconfig(name): + return None + ++ def _findLib_ld(name): ++ # See issue #9998 for why this is needed ++ expr = r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) ++ cmd = ['ld', '-t'] ++ libpath = os.environ.get('LD_LIBRARY_PATH') ++ if libpath: ++ for d in libpath.split(':'): ++ cmd.extend(['-L', d]) ++ cmd.extend(['-o', os.devnull, '-l%s' % name]) ++ result = None ++ try: ++ p = subprocess.Popen(cmd, stdout=subprocess.PIPE, ++ stderr=subprocess.PIPE, ++ universal_newlines=True) ++ out, _ = p.communicate() ++ res = re.findall(expr, out) ++ for file in res: ++ # Check if the given file is an elf file: gcc can report ++ # some files that are linker scripts and not actual ++ # shared objects. See bpo-41976 for more details ++ if not _is_elf(file): ++ continue ++ return file ++ except Exception: ++ pass # result will be None ++ return result ++ + def find_library(name): +- return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) ++ # See issue #9998 ++ return _findSoname_ldconfig(name) or \ ++ _get_soname(_findLib_gcc(name)) or _get_soname(_findLib_ld(name)) + + ################################################################ + # test code diff --git a/pkgs/by-name/py/python/cpython/2.7/nix-store-mtime.patch b/pkgs/by-name/py/python/cpython/2.7/nix-store-mtime.patch new file mode 100644 index 0000000..83f3fea --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/nix-store-mtime.patch @@ -0,0 +1,12 @@ +diff -ru -x '*~' Python-2.7.1-orig/Python/import.c Python-2.7.1/Python/import.c +--- Python-2.7.1-orig/Python/import.c 2010-05-20 20:37:55.000000000 +0200 ++++ Python-2.7.1/Python/import.c 2011-01-04 15:55:11.000000000 +0100 +@@ -751,7 +751,7 @@ + return NULL; + } + pyc_mtime = PyMarshal_ReadLongFromFile(fp); +- if (pyc_mtime != mtime) { ++ if (pyc_mtime != mtime && mtime != 1) { + if (Py_VerboseFlag) + PySys_WriteStderr("# %s has bad mtime\n", cpathname); + fclose(fp); diff --git a/pkgs/by-name/py/python/cpython/2.7/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/2.7/no-ldconfig.patch new file mode 100644 index 0000000..2a6b2a2 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/no-ldconfig.patch @@ -0,0 +1,117 @@ +From 6b0f329a9f37110020ca02b35c8125391ef282b7 Mon Sep 17 00:00:00 2001 +From: Frederik Rietdijk +Date: Sat, 24 Dec 2016 15:56:10 +0100 +Subject: [PATCH] no ldconfig + +--- + Lib/ctypes/util.py | 35 +---------------------------------- + Lib/uuid.py | 47 ----------------------------------------------- + 2 files changed, 1 insertion(+), 81 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index ab10ec5..f253e34 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -235,40 +235,7 @@ elif os.name == "posix": + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname()[4] + '-32' +- else: +- machine = os.uname()[4] + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type) +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- null = open(os.devnull, 'wb') +- try: +- with null: +- p = subprocess.Popen(['/sbin/ldconfig', '-p'], +- stderr=null, +- stdout=subprocess.PIPE, +- env=env) +- except OSError: # E.g. command not found +- return None +- [data, _] = p.communicate() +- res = re.search(expr, data) +- if not res: +- return None +- return res.group(1) ++ return None + + def find_library(name): + return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) +diff --git a/Lib/uuid.py b/Lib/uuid.py +index 7432032..05eeee5 100644 +--- a/Lib/uuid.py ++++ b/Lib/uuid.py +@@ -441,53 +441,6 @@ def _netbios_getnode(): + + # If ctypes is available, use it to find system routines for UUID generation. + _uuid_generate_time = _UuidCreate = None +-try: +- import ctypes, ctypes.util +- import sys +- +- # The uuid_generate_* routines are provided by libuuid on at least +- # Linux and FreeBSD, and provided by libc on Mac OS X. +- _libnames = ['uuid'] +- if not sys.platform.startswith('win'): +- _libnames.append('c') +- for libname in _libnames: +- try: +- lib = ctypes.CDLL(ctypes.util.find_library(libname)) +- except: +- continue +- if hasattr(lib, 'uuid_generate_time'): +- _uuid_generate_time = lib.uuid_generate_time +- break +- del _libnames +- +- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted +- # in issue #8621 the function generates the same sequence of values +- # in the parent process and all children created using fork (unless +- # those children use exec as well). +- # +- # Assume that the uuid_generate functions are broken from 10.5 onward, +- # the test can be adjusted when a later version is fixed. +- if sys.platform == 'darwin': +- import os +- if int(os.uname()[2].split('.')[0]) >= 9: +- _uuid_generate_time = None +- +- # On Windows prior to 2000, UuidCreate gives a UUID containing the +- # hardware address. On Windows 2000 and later, UuidCreate makes a +- # random UUID and UuidCreateSequential gives a UUID containing the +- # hardware address. These routines are provided by the RPC runtime. +- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last +- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear +- # to bear any relationship to the MAC address of any network device +- # on the box. +- try: +- lib = ctypes.windll.rpcrt4 +- except: +- lib = None +- _UuidCreate = getattr(lib, 'UuidCreateSequential', +- getattr(lib, 'UuidCreate', None)) +-except: +- pass + + def _unixdll_getnode(): + """Get the hardware address on Unix using ctypes.""" +-- +2.11.0 + diff --git a/pkgs/by-name/py/python/cpython/2.7/profile-task.patch b/pkgs/by-name/py/python/cpython/2.7/profile-task.patch new file mode 100644 index 0000000..9c08565 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/profile-task.patch @@ -0,0 +1,21 @@ +Backport from CPython 3.8 of a good list of tests to run for PGO. + +Upstream commit: + https://github.com/python/cpython/commit/4e16a4a31 + +Upstream discussion: + https://bugs.python.org/issue36044 + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 00fdd21ce..713dc1e53 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -259,7 +259,7 @@ TCLTK_LIBS= + # The task to run while instrumented when building the profile-opt target. + # We exclude unittests with -x that take a rediculious amount of time to + # run in the instrumented training build or do not provide much value. +-PROFILE_TASK=-m test.regrtest --pgo -x test_asyncore test_gdb test_multiprocessing test_subprocess ++PROFILE_TASK=-m test.regrtest --pgo test_array test_base64 test_binascii test_binop test_bisect test_bytes test_bz2 test_cmath test_codecs test_collections test_complex test_dataclasses test_datetime test_decimal test_difflib test_embed test_float test_fstring test_functools test_generators test_hashlib test_heapq test_int test_itertools test_json test_long test_lzma test_math test_memoryview test_operator test_ordered_dict test_pickle test_pprint test_re test_set test_sqlite test_statistics test_struct test_tabnanny test_time test_unicode test_xml_etree test_xml_etree_c + + # report files for gcov / lcov coverage report + COVERAGE_INFO= $(abs_builddir)/coverage.info diff --git a/pkgs/by-name/py/python/cpython/2.7/python-2.7-distutils-C++.patch b/pkgs/by-name/py/python/cpython/2.7/python-2.7-distutils-C++.patch new file mode 100644 index 0000000..78d9272 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/python-2.7-distutils-C++.patch @@ -0,0 +1,259 @@ +--- a/Lib/distutils/cygwinccompiler.py ++++ b/Lib/distutils/cygwinccompiler.py +@@ -117,8 +117,10 @@ + # dllwrap 2.10.90 is buggy + if self.ld_version >= "2.10.90": + self.linker_dll = "gcc" ++ self.linker_dll_cxx = "g++" + else: + self.linker_dll = "dllwrap" ++ self.linker_dll_cxx = "dllwrap" + + # ld_version >= "2.13" support -shared so use it instead of + # -mdll -static +@@ -132,9 +134,13 @@ + self.set_executables(compiler='gcc -mcygwin -O -Wall', + compiler_so='gcc -mcygwin -mdll -O -Wall', + compiler_cxx='g++ -mcygwin -O -Wall', ++ compiler_so_cxx='g++ -mcygwin -mdll -O -Wall', + linker_exe='gcc -mcygwin', + linker_so=('%s -mcygwin %s' % +- (self.linker_dll, shared_option))) ++ (self.linker_dll, shared_option)), ++ linker_exe_cxx='g++ -mcygwin', ++ linker_so_cxx=('%s -mcygwin %s' % ++ (self.linker_dll_cxx, shared_option))) + + # cygwin and mingw32 need different sets of libraries + if self.gcc_version == "2.91.57": +@@ -160,8 +166,12 @@ + raise CompileError, msg + else: # for other files use the C-compiler + try: +- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + +@@ -327,9 +337,14 @@ + self.set_executables(compiler='gcc%s -O -Wall' % no_cygwin, + compiler_so='gcc%s -mdll -O -Wall' % no_cygwin, + compiler_cxx='g++%s -O -Wall' % no_cygwin, ++ compiler_so_cxx='g++%s -mdll -O -Wall' % no_cygwin, + linker_exe='gcc%s' % no_cygwin, + linker_so='%s%s %s %s' + % (self.linker_dll, no_cygwin, ++ shared_option, entry_point), ++ linker_exe_cxx='g++%s' % no_cygwin, ++ linker_so_cxx='%s%s %s %s' ++ % (self.linker_dll_cxx, no_cygwin, + shared_option, entry_point)) + # Maybe we should also append -mthreads, but then the finished + # dlls need another dll (mingwm10.dll see Mingw32 docs) +--- a/Lib/distutils/emxccompiler.py ++++ b/Lib/distutils/emxccompiler.py +@@ -65,8 +65,12 @@ + # XXX optimization, warnings etc. should be customizable. + self.set_executables(compiler='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall', + compiler_so='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall', ++ compiler_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall', ++ compiler_so_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall', + linker_exe='gcc -Zomf -Zmt -Zcrtdll', +- linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll') ++ linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll', ++ linker_exe_cxx='g++ -Zomf -Zmt -Zcrtdll', ++ linker_so_cxx='g++ -Zomf -Zmt -Zcrtdll -Zdll') + + # want the gcc library statically linked (so that we don't have + # to distribute a version dependent on the compiler we have) +@@ -83,8 +87,12 @@ + raise CompileError, msg + else: # for other files use the C-compiler + try: +- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -170,10 +170,12 @@ + _osx_support.customize_compiler(_config_vars) + _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' + +- (cc, cxx, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \ +- get_config_vars('CC', 'CXX', 'CFLAGS', +- 'CCSHARED', 'LDSHARED', 'SO', 'AR', +- 'ARFLAGS') ++ (cc, cxx, ccshared, ldshared, ldcxxshared, so_ext, ar, ar_flags) = \ ++ get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'SO', 'AR', 'ARFLAGS') ++ ++ cflags = '' ++ cxxflags = '' + + if 'CC' in os.environ: + newcc = os.environ['CC'] +@@ -188,19 +190,27 @@ + cxx = os.environ['CXX'] + if 'LDSHARED' in os.environ: + ldshared = os.environ['LDSHARED'] ++ if 'LDCXXSHARED' in os.environ: ++ ldcxxshared = os.environ['LDCXXSHARED'] + if 'CPP' in os.environ: + cpp = os.environ['CPP'] + else: + cpp = cc + " -E" # not always + if 'LDFLAGS' in os.environ: + ldshared = ldshared + ' ' + os.environ['LDFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS'] + if 'CFLAGS' in os.environ: + cflags = cflags + ' ' + os.environ['CFLAGS'] + ldshared = ldshared + ' ' + os.environ['CFLAGS'] ++ if 'CXXFLAGS' in os.environ: ++ cxxflags = os.environ['CXXFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS'] + if 'CPPFLAGS' in os.environ: + cpp = cpp + ' ' + os.environ['CPPFLAGS'] + cflags = cflags + ' ' + os.environ['CPPFLAGS'] ++ cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS'] + ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS'] + if 'AR' in os.environ: + ar = os.environ['AR'] + if 'ARFLAGS' in os.environ: +@@ -209,13 +219,17 @@ + archiver = ar + ' ' + ar_flags + + cc_cmd = cc + ' ' + cflags ++ cxx_cmd = cxx + ' ' + cxxflags + compiler.set_executables( + preprocessor=cpp, + compiler=cc_cmd, + compiler_so=cc_cmd + ' ' + ccshared, +- compiler_cxx=cxx, ++ compiler_cxx=cxx_cmd, ++ compiler_so_cxx=cxx_cmd + ' ' + ccshared, + linker_so=ldshared, + linker_exe=cc, ++ linker_so_cxx=ldcxxshared, ++ linker_exe_cxx=cxx, + archiver=archiver) + + compiler.shared_lib_extension = so_ext +--- a/Lib/distutils/unixccompiler.py ++++ b/Lib/distutils/unixccompiler.py +@@ -55,14 +55,17 @@ + # are pretty generic; they will probably have to be set by an outsider + # (eg. using information discovered by the sysconfig about building + # Python extensions). +- executables = {'preprocessor' : None, +- 'compiler' : ["cc"], +- 'compiler_so' : ["cc"], +- 'compiler_cxx' : ["cc"], +- 'linker_so' : ["cc", "-shared"], +- 'linker_exe' : ["cc"], +- 'archiver' : ["ar", "-cr"], +- 'ranlib' : None, ++ executables = {'preprocessor' : None, ++ 'compiler' : ["cc"], ++ 'compiler_so' : ["cc"], ++ 'compiler_cxx' : ["c++"], ++ 'compiler_so_cxx' : ["c++"], ++ 'linker_so' : ["cc", "-shared"], ++ 'linker_exe' : ["cc"], ++ 'linker_so_cxx' : ["c++", "-shared"], ++ 'linker_exe_cxx' : ["c++"], ++ 'archiver' : ["ar", "-cr"], ++ 'ranlib' : None, + } + + if sys.platform[:6] == "darwin": +@@ -112,12 +115,19 @@ + + def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): + compiler_so = self.compiler_so ++ compiler_so_cxx = self.compiler_so_cxx + if sys.platform == 'darwin': + compiler_so = _osx_support.compiler_fixup(compiler_so, + cc_args + extra_postargs) ++ compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx, ++ cc_args + extra_postargs) + try: +- self.spawn(compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError, msg: + raise CompileError, msg + +@@ -174,23 +184,16 @@ + ld_args.extend(extra_postargs) + self.mkpath(os.path.dirname(output_filename)) + try: +- if target_desc == CCompiler.EXECUTABLE: +- linker = self.linker_exe[:] ++ if target_lang == "c++": ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe_cxx[:] ++ else: ++ linker = self.linker_so_cxx[:] + else: +- linker = self.linker_so[:] +- if target_lang == "c++" and self.compiler_cxx: +- # skip over environment variable settings if /usr/bin/env +- # is used to set up the linker's environment. +- # This is needed on OSX. Note: this assumes that the +- # normal and C++ compiler have the same environment +- # settings. +- i = 0 +- if os.path.basename(linker[0]) == "env": +- i = 1 +- while '=' in linker[i]: +- i = i + 1 +- +- linker[i] = self.compiler_cxx[i] ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe[:] ++ else: ++ linker = self.linker_so[:] + + if sys.platform == 'darwin': + linker = _osx_support.compiler_fixup(linker, ld_args) +--- a/Lib/_osx_support.py ++++ b/Lib/_osx_support.py +@@ -14,13 +14,13 @@ + # configuration variables that may contain universal build flags, + # like "-arch" or "-isdkroot", that may need customization for + # the user environment +-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', +- 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', +- 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', +- 'PY_CORE_CFLAGS') ++_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS', ++ 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', ++ 'PY_CPPFLAGS', 'PY_CORE_CFLAGS') + + # configuration variables that may contain compiler calls +-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX') ++_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX') + + # prefix added to original configuration variable names + _INITPRE = '_OSX_SUPPORT_INITIAL_' \ No newline at end of file diff --git a/pkgs/by-name/py/python/cpython/2.7/search-path.patch b/pkgs/by-name/py/python/cpython/2.7/search-path.patch new file mode 100644 index 0000000..2e7b752 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/search-path.patch @@ -0,0 +1,27 @@ +diff -rc Python-2.4.4-orig/setup.py Python-2.4.4/setup.py +*** Python-2.4.4-orig/setup.py 2006-10-08 19:41:25.000000000 +0200 +--- Python-2.4.4/setup.py 2007-05-27 16:04:54.000000000 +0200 +*************** +*** 279,288 **** + # Check for AtheOS which has libraries in non-standard locations + if platform == 'atheos': + lib_dirs += ['/system/libs', '/atheos/autolnk/lib'] +- lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep) + inc_dirs += ['/system/include', '/atheos/autolnk/include'] +- inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) + + # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) + if platform in ['osf1', 'unixware7', 'openunix8']: + lib_dirs += ['/usr/ccs/lib'] +--- 279,289 ---- + # Check for AtheOS which has libraries in non-standard locations + if platform == 'atheos': + lib_dirs += ['/system/libs', '/atheos/autolnk/lib'] + inc_dirs += ['/system/include', '/atheos/autolnk/include'] + ++ lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep) ++ inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) ++ + # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) + if platform in ['osf1', 'unixware7', 'openunix8']: + lib_dirs += ['/usr/ccs/lib'] diff --git a/pkgs/by-name/py/python/cpython/2.7/use-correct-tcl-tk-on-darwin.patch b/pkgs/by-name/py/python/cpython/2.7/use-correct-tcl-tk-on-darwin.patch new file mode 100644 index 0000000..b73f62b --- /dev/null +++ b/pkgs/by-name/py/python/cpython/2.7/use-correct-tcl-tk-on-darwin.patch @@ -0,0 +1,48 @@ +diff --git a/setup.py b/setup.py +index 2779658..902d0eb 100644 +--- a/setup.py ++++ b/setup.py +@@ -1699,9 +1699,6 @@ class PyBuildExt(build_ext): + # Rather than complicate the code below, detecting and building + # AquaTk is a separate method. Only one Tkinter will be built on + # Darwin - either AquaTk, if it is found, or X11 based Tk. +- if (host_platform == 'darwin' and +- self.detect_tkinter_darwin(inc_dirs, lib_dirs)): +- return + + # Assume we haven't found any of the libraries or include files + # The versions with dots are used on Unix, and the versions without +@@ -1747,22 +1744,6 @@ class PyBuildExt(build_ext): + if dir not in include_dirs: + include_dirs.append(dir) + +- # Check for various platform-specific directories +- if host_platform == 'sunos5': +- include_dirs.append('/usr/openwin/include') +- added_lib_dirs.append('/usr/openwin/lib') +- elif os.path.exists('/usr/X11R6/include'): +- include_dirs.append('/usr/X11R6/include') +- added_lib_dirs.append('/usr/X11R6/lib64') +- added_lib_dirs.append('/usr/X11R6/lib') +- elif os.path.exists('/usr/X11R5/include'): +- include_dirs.append('/usr/X11R5/include') +- added_lib_dirs.append('/usr/X11R5/lib') +- else: +- # Assume default location for X11 +- include_dirs.append('/usr/X11/include') +- added_lib_dirs.append('/usr/X11/lib') +- + # If Cygwin, then verify that X is installed before proceeding + if host_platform == 'cygwin': + x11_inc = find_file('X11/Xlib.h', [], include_dirs) +@@ -1786,10 +1767,6 @@ class PyBuildExt(build_ext): + if host_platform in ['aix3', 'aix4']: + libs.append('ld') + +- # Finally, link with the X11 libraries (not appropriate on cygwin) +- if host_platform != "cygwin": +- libs.append('X11') +- + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)] + defs, + include_dirs = include_dirs, diff --git a/pkgs/by-name/py/python/cpython/3.10/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.10/no-ldconfig.patch new file mode 100644 index 0000000..c259aed --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.10/no-ldconfig.patch @@ -0,0 +1,107 @@ +From 084c6dd6352077e64f10cf7aa168f95d800f3819 Mon Sep 17 00:00:00 2001 +From: Jonathan Ringer +Date: Mon, 9 Nov 2020 10:24:35 -0800 +Subject: [PATCH] CPython: Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e..7fb98af 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ elif os.name == "posix": + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ elif os.name == "posix": + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.28.0 + diff --git a/pkgs/by-name/py/python/cpython/3.11/darwin-libutil.patch b/pkgs/by-name/py/python/cpython/3.11/darwin-libutil.patch new file mode 100644 index 0000000..92b846b --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.11/darwin-libutil.patch @@ -0,0 +1,13 @@ +diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c +index 40229bce0f..3cc604930e 100644 +--- a/Modules/posixmodule.c ++++ b/Modules/posixmodule.c +@@ -7258,7 +7258,7 @@ os_sched_getaffinity_impl(PyObject *module, pid_t pid) + #ifdef HAVE_UTMP_H + #include + #endif /* HAVE_UTMP_H */ +-#elif defined(HAVE_LIBUTIL_H) ++#elif defined(HAVE_LIBUTIL_H) && !defined(__APPLE__) + #include + #elif defined(HAVE_UTIL_H) + #include diff --git a/pkgs/by-name/py/python/cpython/3.11/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.11/no-ldconfig.patch new file mode 100644 index 0000000..ca6a76d --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.11/no-ldconfig.patch @@ -0,0 +1,107 @@ +From 5330b6af9f832af59aa5c61d9ef6971053a8e709 Mon Sep 17 00:00:00 2001 +From: Jonathan Ringer +Date: Mon, 9 Nov 2020 10:24:35 -0800 +Subject: [PATCH] CPython: Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e161..7fb98af308 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ def _is_elf(filename): + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ def find_library(name, is64 = False): + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.33.1 + diff --git a/pkgs/by-name/py/python/cpython/3.11/python-3.x-distutils-C++.patch b/pkgs/by-name/py/python/cpython/3.11/python-3.x-distutils-C++.patch new file mode 100644 index 0000000..335e06b --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.11/python-3.x-distutils-C++.patch @@ -0,0 +1,257 @@ +diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py +index aa66c8b9f4..71e6556bac 100644 +--- a/Lib/_osx_support.py ++++ b/Lib/_osx_support.py +@@ -14,13 +14,13 @@ + # configuration variables that may contain universal build flags, + # like "-arch" or "-isdkroot", that may need customization for + # the user environment +-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', +- 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', +- 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', +- 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS') ++_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS', ++ 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', ++ 'PY_CPPFLAGS', 'PY_CORE_LDFLAGS', 'PY_CORE_CFLAGS') + + # configuration variables that may contain compiler calls +-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX') ++_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX') + + # prefix added to original configuration variable names + _INITPRE = '_OSX_SUPPORT_INITIAL_' +diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py +index 66c12dd358..dddb9fd2d4 100644 +--- a/Lib/distutils/cygwinccompiler.py ++++ b/Lib/distutils/cygwinccompiler.py +@@ -123,8 +123,10 @@ def __init__(self, verbose=0, dry_run=0, force=0): + # dllwrap 2.10.90 is buggy + if self.ld_version >= "2.10.90": + self.linker_dll = "gcc" ++ self.linker_dll_cxx = "g++" + else: + self.linker_dll = "dllwrap" ++ self.linker_dll_cxx = "dllwrap" + + # ld_version >= "2.13" support -shared so use it instead of + # -mdll -static +@@ -138,9 +140,13 @@ def __init__(self, verbose=0, dry_run=0, force=0): + self.set_executables(compiler='gcc -mcygwin -O -Wall', + compiler_so='gcc -mcygwin -mdll -O -Wall', + compiler_cxx='g++ -mcygwin -O -Wall', ++ compiler_so_cxx='g++ -mcygwin -mdll -O -Wall', + linker_exe='gcc -mcygwin', + linker_so=('%s -mcygwin %s' % +- (self.linker_dll, shared_option))) ++ (self.linker_dll, shared_option)), ++ linker_exe_cxx='g++ -mcygwin', ++ linker_so_cxx=('%s -mcygwin %s' % ++ (self.linker_dll_cxx, shared_option))) + + # cygwin and mingw32 need different sets of libraries + if self.gcc_version == "2.91.57": +@@ -164,8 +170,12 @@ def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): + raise CompileError(msg) + else: # for other files use the C-compiler + try: +- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -300,9 +310,14 @@ def __init__(self, verbose=0, dry_run=0, force=0): + self.set_executables(compiler='gcc -O -Wall', + compiler_so='gcc -mdll -O -Wall', + compiler_cxx='g++ -O -Wall', ++ compiler_so_cxx='g++ -mdll -O -Wall', + linker_exe='gcc', + linker_so='%s %s %s' + % (self.linker_dll, shared_option, ++ entry_point), ++ linker_exe_cxx='g++', ++ linker_so_cxx='%s %s %s' ++ % (self.linker_dll_cxx, shared_option, + entry_point)) + # Maybe we should also append -mthreads, but then the finished + # dlls need another dll (mingwm10.dll see Mingw32 docs) +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index 3414a761e7..f1af560cc1 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -216,9 +216,11 @@ def customize_compiler(compiler): + _osx_support.customize_compiler(_config_vars) + _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' + +- (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ +- get_config_vars('CC', 'CXX', 'CFLAGS', +- 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') ++ (cc, cxx, cflags, ccshared, ldshared, ldcxxshared, shlib_suffix, ar, ar_flags) = \ ++ get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') ++ ++ cxxflags = cflags + + if 'CC' in os.environ: + newcc = os.environ['CC'] +@@ -233,19 +235,27 @@ def customize_compiler(compiler): + cxx = os.environ['CXX'] + if 'LDSHARED' in os.environ: + ldshared = os.environ['LDSHARED'] ++ if 'LDCXXSHARED' in os.environ: ++ ldcxxshared = os.environ['LDCXXSHARED'] + if 'CPP' in os.environ: + cpp = os.environ['CPP'] + else: + cpp = cc + " -E" # not always + if 'LDFLAGS' in os.environ: + ldshared = ldshared + ' ' + os.environ['LDFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS'] + if 'CFLAGS' in os.environ: +- cflags = cflags + ' ' + os.environ['CFLAGS'] ++ cflags = os.environ['CFLAGS'] + ldshared = ldshared + ' ' + os.environ['CFLAGS'] ++ if 'CXXFLAGS' in os.environ: ++ cxxflags = os.environ['CXXFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS'] + if 'CPPFLAGS' in os.environ: + cpp = cpp + ' ' + os.environ['CPPFLAGS'] + cflags = cflags + ' ' + os.environ['CPPFLAGS'] ++ cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS'] + ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS'] + if 'AR' in os.environ: + ar = os.environ['AR'] + if 'ARFLAGS' in os.environ: +@@ -254,13 +264,17 @@ def customize_compiler(compiler): + archiver = ar + ' ' + ar_flags + + cc_cmd = cc + ' ' + cflags ++ cxx_cmd = cxx + ' ' + cxxflags + compiler.set_executables( + preprocessor=cpp, + compiler=cc_cmd, + compiler_so=cc_cmd + ' ' + ccshared, +- compiler_cxx=cxx, ++ compiler_cxx=cxx_cmd, ++ compiler_so_cxx=cxx_cmd + ' ' + ccshared, + linker_so=ldshared, + linker_exe=cc, ++ linker_so_cxx=ldcxxshared, ++ linker_exe_cxx=cxx, + archiver=archiver) + + compiler.shared_lib_extension = shlib_suffix +diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py +index d00c48981e..4a3d271fee 100644 +--- a/Lib/distutils/unixccompiler.py ++++ b/Lib/distutils/unixccompiler.py +@@ -52,14 +52,17 @@ class UnixCCompiler(CCompiler): + # are pretty generic; they will probably have to be set by an outsider + # (eg. using information discovered by the sysconfig about building + # Python extensions). +- executables = {'preprocessor' : None, +- 'compiler' : ["cc"], +- 'compiler_so' : ["cc"], +- 'compiler_cxx' : ["cc"], +- 'linker_so' : ["cc", "-shared"], +- 'linker_exe' : ["cc"], +- 'archiver' : ["ar", "-cr"], +- 'ranlib' : None, ++ executables = {'preprocessor' : None, ++ 'compiler' : ["cc"], ++ 'compiler_so' : ["cc"], ++ 'compiler_cxx' : ["c++"], ++ 'compiler_so_cxx' : ["c++"], ++ 'linker_so' : ["cc", "-shared"], ++ 'linker_exe' : ["cc"], ++ 'linker_so_cxx' : ["c++", "-shared"], ++ 'linker_exe_cxx' : ["c++"], ++ 'archiver' : ["ar", "-cr"], ++ 'ranlib' : None, + } + + if sys.platform[:6] == "darwin": +@@ -110,12 +113,19 @@ def preprocess(self, source, output_file=None, macros=None, + + def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): + compiler_so = self.compiler_so ++ compiler_so_cxx = self.compiler_so_cxx + if sys.platform == 'darwin': + compiler_so = _osx_support.compiler_fixup(compiler_so, + cc_args + extra_postargs) ++ compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx, ++ cc_args + extra_postargs) + try: +- self.spawn(compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -173,30 +183,16 @@ def link(self, target_desc, objects, + ld_args.extend(extra_postargs) + self.mkpath(os.path.dirname(output_filename)) + try: +- if target_desc == CCompiler.EXECUTABLE: +- linker = self.linker_exe[:] ++ if target_lang == "c++": ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe_cxx[:] ++ else: ++ linker = self.linker_so_cxx[:] + else: +- linker = self.linker_so[:] +- if target_lang == "c++" and self.compiler_cxx: +- # skip over environment variable settings if /usr/bin/env +- # is used to set up the linker's environment. +- # This is needed on OSX. Note: this assumes that the +- # normal and C++ compiler have the same environment +- # settings. +- i = 0 +- if os.path.basename(linker[0]) == "env": +- i = 1 +- while '=' in linker[i]: +- i += 1 +- +- if os.path.basename(linker[i]) == 'ld_so_aix': +- # AIX platforms prefix the compiler with the ld_so_aix +- # script, so we need to adjust our linker index +- offset = 1 ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe[:] + else: +- offset = 0 +- +- linker[i+offset] = self.compiler_cxx[i] ++ linker = self.linker_so[:] + + if sys.platform == 'darwin': + linker = _osx_support.compiler_fixup(linker, ld_args) +diff --git a/Makefile.pre.in b/Makefile.pre.in +index f803391346..090f14c46c 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -732,9 +732,9 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt @LIBMPDEC_INTERNAL@ @LIBEXPAT_INTERNAL + *\ -s*|s*) quiet="-q";; \ + *) quiet="";; \ + esac; \ +- echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ ++ echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ + $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build"; \ +- $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ ++ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ + $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build + + diff --git a/pkgs/by-name/py/python/cpython/3.12/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.12/no-ldconfig.patch new file mode 100644 index 0000000..ca6a76d --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.12/no-ldconfig.patch @@ -0,0 +1,107 @@ +From 5330b6af9f832af59aa5c61d9ef6971053a8e709 Mon Sep 17 00:00:00 2001 +From: Jonathan Ringer +Date: Mon, 9 Nov 2020 10:24:35 -0800 +Subject: [PATCH] CPython: Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e161..7fb98af308 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ def _is_elf(filename): + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ def find_library(name, is64 = False): + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.33.1 + diff --git a/pkgs/by-name/py/python/cpython/3.13/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.13/no-ldconfig.patch new file mode 100644 index 0000000..ca6a76d --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.13/no-ldconfig.patch @@ -0,0 +1,107 @@ +From 5330b6af9f832af59aa5c61d9ef6971053a8e709 Mon Sep 17 00:00:00 2001 +From: Jonathan Ringer +Date: Mon, 9 Nov 2020 10:24:35 -0800 +Subject: [PATCH] CPython: Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e161..7fb98af308 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ def _is_elf(filename): + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ def find_library(name, is64 = False): + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.33.1 + diff --git a/pkgs/by-name/py/python/cpython/3.13/virtualenv-permissions.patch b/pkgs/by-name/py/python/cpython/3.13/virtualenv-permissions.patch new file mode 100644 index 0000000..8099eef --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.13/virtualenv-permissions.patch @@ -0,0 +1,12 @@ +diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py +index 4856594755..6769ab8026 100644 +--- a/Lib/venv/__init__.py ++++ b/Lib/venv/__init__.py +@@ -522,6 +522,7 @@ def skip_file(f): + with open(dstfile, 'wb') as f: + f.write(new_data) + shutil.copymode(srcfile, dstfile) ++ os.chmod(dstfile, 0o644) + + def upgrade_dependencies(self, context): + logger.debug( diff --git a/pkgs/by-name/py/python/cpython/3.7/darwin-libutil.patch b/pkgs/by-name/py/python/cpython/3.7/darwin-libutil.patch new file mode 100644 index 0000000..51e3cb6 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.7/darwin-libutil.patch @@ -0,0 +1,23 @@ +diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c +index c3682b4..16826c6 100644 +--- a/Modules/posixmodule.c ++++ b/Modules/posixmodule.c +@@ -5880,15 +5880,13 @@ error: + #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) + #ifdef HAVE_PTY_H + #include +-#else ++#endif + #ifdef HAVE_LIBUTIL_H + #include +-#else ++#endif + #ifdef HAVE_UTIL_H + #include +-#endif /* HAVE_UTIL_H */ +-#endif /* HAVE_LIBUTIL_H */ +-#endif /* HAVE_PTY_H */ ++#endif + #ifdef HAVE_STROPTS_H + #include + #endif diff --git a/pkgs/by-name/py/python/cpython/3.7/fix-finding-headers-when-cross-compiling.patch b/pkgs/by-name/py/python/cpython/3.7/fix-finding-headers-when-cross-compiling.patch new file mode 100644 index 0000000..543e267 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.7/fix-finding-headers-when-cross-compiling.patch @@ -0,0 +1,54 @@ +From debccd4be0a8d619770f63622d9de1b451dd02ac Mon Sep 17 00:00:00 2001 +From: Ben Wolsieffer +Date: Fri, 25 Sep 2020 16:49:16 -0400 +Subject: [PATCH] Fix finding headers when cross compiling + +When cross-compiling third-party extensions, get_python_inc() may be called to +return the path to Python's headers. However, it uses the sys.prefix or +sys.exec_prefix of the build Python, which returns incorrect paths when +cross-compiling (paths pointing to build system headers). + +To fix this, we use the INCLUDEPY and CONFINCLUDEPY conf variables, which can +be configured to point at host Python by setting _PYTHON_SYSCONFIGDATA_NAME. +The existing behavior is maintained on non-POSIX platforms or if a prefix is +manually specified. +--- + Lib/distutils/sysconfig.py | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index 37feae5df7..6d4ad06696 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -95,8 +95,6 @@ def get_python_inc(plat_specific=0, prefix=None): + If 'prefix' is supplied, use it instead of sys.base_prefix or + sys.base_exec_prefix -- i.e., ignore 'plat_specific'. + """ +- if prefix is None: +- prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX + if os.name == "posix": + if python_build: + # Assume the executable is in the build directory. The +@@ -109,9 +107,17 @@ def get_python_inc(plat_specific=0, prefix=None): + else: + incdir = os.path.join(get_config_var('srcdir'), 'Include') + return os.path.normpath(incdir) +- python_dir = 'python' + get_python_version() + build_flags +- return os.path.join(prefix, "include", python_dir) ++ if prefix is None: ++ if plat_specific: ++ return get_config_var('CONFINCLUDEPY') ++ else: ++ return get_config_var('INCLUDEPY') ++ else: ++ python_dir = 'python' + get_python_version() + build_flags ++ return os.path.join(prefix, "include", python_dir) + elif os.name == "nt": ++ if prefix is None: ++ prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX + if python_build: + # Include both the include and PC dir to ensure we can find + # pyconfig.h +-- +2.28.0 + diff --git a/pkgs/by-name/py/python/cpython/3.7/no-win64-workaround.patch b/pkgs/by-name/py/python/cpython/3.7/no-win64-workaround.patch new file mode 100644 index 0000000..685b1e8 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.7/no-win64-workaround.patch @@ -0,0 +1,37 @@ +From e6b247c8e524dbe5fc03b3492f628d0d5348bc49 Mon Sep 17 00:00:00 2001 +From: Victor Stinner +Date: Tue, 18 Dec 2018 14:47:21 +0100 +Subject: [PATCH] bpo-35523: Remove ctypes callback workaround (GH-11211) + +Remove ctypes callback workaround: no longer create a callback at startup. +Avoid SELinux alert on "import ctypes" and "import uuid". +--- + Lib/ctypes/__init__.py | 5 ----- + .../next/Library/2018-12-18-13-52-13.bpo-35523.SkoMno.rst | 2 ++ + 2 files changed, 2 insertions(+), 5 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2018-12-18-13-52-13.bpo-35523.SkoMno.rst + +diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py +index 6146773988648..5f78beda5866e 100644 +--- a/Lib/ctypes/__init__.py ++++ b/Lib/ctypes/__init__.py +@@ -266,11 +266,6 @@ def _reset_cache(): + # _SimpleCData.c_char_p_from_param + POINTER(c_char).from_param = c_char_p.from_param + _pointer_type_cache[None] = c_void_p +- # XXX for whatever reasons, creating the first instance of a callback +- # function is needed for the unittests on Win64 to succeed. This MAY +- # be a compiler bug, since the problem occurs only when _ctypes is +- # compiled with the MS SDK compiler. Or an uninitialized variable? +- CFUNCTYPE(c_int)(lambda: None) + + def create_unicode_buffer(init, size=None): + """create_unicode_buffer(aString) -> character array +diff --git a/Misc/NEWS.d/next/Library/2018-12-18-13-52-13.bpo-35523.SkoMno.rst b/Misc/NEWS.d/next/Library/2018-12-18-13-52-13.bpo-35523.SkoMno.rst +new file mode 100644 +index 0000000000000..94a9fd257383e +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2018-12-18-13-52-13.bpo-35523.SkoMno.rst +@@ -0,0 +1,2 @@ ++Remove :mod:`ctypes` callback workaround: no longer create a callback at ++startup. Avoid SELinux alert on ``import ctypes`` and ``import uuid``. diff --git a/pkgs/by-name/py/python/cpython/3.7/python-3.x-distutils-C++.patch b/pkgs/by-name/py/python/cpython/3.7/python-3.x-distutils-C++.patch new file mode 100644 index 0000000..243313f --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.7/python-3.x-distutils-C++.patch @@ -0,0 +1,248 @@ +--- a/Lib/_osx_support.py ++++ b/Lib/_osx_support.py +@@ -14,13 +14,13 @@ __all__ = [ + # configuration variables that may contain universal build flags, + # like "-arch" or "-isdkroot", that may need customization for + # the user environment +-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', +- 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', +- 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', +- 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS') ++_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS', ++ 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', ++ 'PY_CPPFLAGS', 'PY_CORE_LDFLAGS', 'PY_CORE_CFLAGS') + + # configuration variables that may contain compiler calls +-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX') ++_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX') + + # prefix added to original configuration variable names + _INITPRE = '_OSX_SUPPORT_INITIAL_' +--- a/Lib/distutils/cygwinccompiler.py ++++ b/Lib/distutils/cygwinccompiler.py +@@ -125,8 +125,10 @@ class CygwinCCompiler(UnixCCompiler): + # dllwrap 2.10.90 is buggy + if self.ld_version >= "2.10.90": + self.linker_dll = "gcc" ++ self.linker_dll_cxx = "g++" + else: + self.linker_dll = "dllwrap" ++ self.linker_dll_cxx = "dllwrap" + + # ld_version >= "2.13" support -shared so use it instead of + # -mdll -static +@@ -140,9 +142,13 @@ class CygwinCCompiler(UnixCCompiler): + self.set_executables(compiler='gcc -mcygwin -O -Wall', + compiler_so='gcc -mcygwin -mdll -O -Wall', + compiler_cxx='g++ -mcygwin -O -Wall', ++ compiler_so_cxx='g++ -mcygwin -mdll -O -Wall', + linker_exe='gcc -mcygwin', + linker_so=('%s -mcygwin %s' % +- (self.linker_dll, shared_option))) ++ (self.linker_dll, shared_option)), ++ linker_exe_cxx='g++ -mcygwin', ++ linker_so_cxx=('%s -mcygwin %s' % ++ (self.linker_dll_cxx, shared_option))) + + # cygwin and mingw32 need different sets of libraries + if self.gcc_version == "2.91.57": +@@ -166,8 +172,12 @@ class CygwinCCompiler(UnixCCompiler): + raise CompileError(msg) + else: # for other files use the C-compiler + try: +- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -302,9 +312,14 @@ class Mingw32CCompiler(CygwinCCompiler): + self.set_executables(compiler='gcc -O -Wall', + compiler_so='gcc -mdll -O -Wall', + compiler_cxx='g++ -O -Wall', ++ compiler_so_cxx='g++ -mdll -O -Wall', + linker_exe='gcc', + linker_so='%s %s %s' + % (self.linker_dll, shared_option, ++ entry_point), ++ linker_exe_cxx='g++', ++ linker_so_cxx='%s %s %s' ++ % (self.linker_dll_cxx, shared_option, + entry_point)) + # Maybe we should also append -mthreads, but then the finished + # dlls need another dll (mingwm10.dll see Mingw32 docs) +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -170,9 +170,11 @@ def customize_compiler(compiler): + _osx_support.customize_compiler(_config_vars) + _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' + +- (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ +- get_config_vars('CC', 'CXX', 'CFLAGS', +- 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') ++ (cc, cxx, cflags, ccshared, ldshared, ldcxxshared, shlib_suffix, ar, ar_flags) = \ ++ get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED', ++ 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') ++ ++ cxxflags = cflags + + if 'CC' in os.environ: + newcc = os.environ['CC'] +@@ -187,19 +189,27 @@ def customize_compiler(compiler): + cxx = os.environ['CXX'] + if 'LDSHARED' in os.environ: + ldshared = os.environ['LDSHARED'] ++ if 'LDCXXSHARED' in os.environ: ++ ldcxxshared = os.environ['LDCXXSHARED'] + if 'CPP' in os.environ: + cpp = os.environ['CPP'] + else: + cpp = cc + " -E" # not always + if 'LDFLAGS' in os.environ: + ldshared = ldshared + ' ' + os.environ['LDFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS'] + if 'CFLAGS' in os.environ: +- cflags = cflags + ' ' + os.environ['CFLAGS'] ++ cflags = os.environ['CFLAGS'] + ldshared = ldshared + ' ' + os.environ['CFLAGS'] ++ if 'CXXFLAGS' in os.environ: ++ cxxflags = os.environ['CXXFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS'] + if 'CPPFLAGS' in os.environ: + cpp = cpp + ' ' + os.environ['CPPFLAGS'] + cflags = cflags + ' ' + os.environ['CPPFLAGS'] ++ cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS'] + ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS'] + if 'AR' in os.environ: + ar = os.environ['AR'] + if 'ARFLAGS' in os.environ: +@@ -208,13 +218,17 @@ def customize_compiler(compiler): + archiver = ar + ' ' + ar_flags + + cc_cmd = cc + ' ' + cflags ++ cxx_cmd = cxx + ' ' + cxxflags + compiler.set_executables( + preprocessor=cpp, + compiler=cc_cmd, + compiler_so=cc_cmd + ' ' + ccshared, +- compiler_cxx=cxx, ++ compiler_cxx=cxx_cmd, ++ compiler_so_cxx=cxx_cmd + ' ' + ccshared, + linker_so=ldshared, + linker_exe=cc, ++ linker_so_cxx=ldcxxshared, ++ linker_exe_cxx=cxx, + archiver=archiver) + + compiler.shared_lib_extension = shlib_suffix +--- a/Lib/distutils/unixccompiler.py ++++ b/Lib/distutils/unixccompiler.py +@@ -52,14 +52,17 @@ class UnixCCompiler(CCompiler): + # are pretty generic; they will probably have to be set by an outsider + # (eg. using information discovered by the sysconfig about building + # Python extensions). +- executables = {'preprocessor' : None, +- 'compiler' : ["cc"], +- 'compiler_so' : ["cc"], +- 'compiler_cxx' : ["cc"], +- 'linker_so' : ["cc", "-shared"], +- 'linker_exe' : ["cc"], +- 'archiver' : ["ar", "-cr"], +- 'ranlib' : None, ++ executables = {'preprocessor' : None, ++ 'compiler' : ["cc"], ++ 'compiler_so' : ["cc"], ++ 'compiler_cxx' : ["c++"], ++ 'compiler_so_cxx' : ["c++"], ++ 'linker_so' : ["cc", "-shared"], ++ 'linker_exe' : ["cc"], ++ 'linker_so_cxx' : ["c++", "-shared"], ++ 'linker_exe_cxx' : ["c++"], ++ 'archiver' : ["ar", "-cr"], ++ 'ranlib' : None, + } + + if sys.platform[:6] == "darwin": +@@ -110,12 +113,19 @@ class UnixCCompiler(CCompiler): + + def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): + compiler_so = self.compiler_so ++ compiler_so_cxx = self.compiler_so_cxx + if sys.platform == 'darwin': + compiler_so = _osx_support.compiler_fixup(compiler_so, + cc_args + extra_postargs) ++ compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx, ++ cc_args + extra_postargs) + try: +- self.spawn(compiler_so + cc_args + [src, '-o', obj] + +- extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(compiler_so + cc_args + [src, '-o', obj] + ++ extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -173,30 +183,16 @@ class UnixCCompiler(CCompiler): + ld_args.extend(extra_postargs) + self.mkpath(os.path.dirname(output_filename)) + try: +- if target_desc == CCompiler.EXECUTABLE: +- linker = self.linker_exe[:] ++ if target_lang == "c++": ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe_cxx[:] ++ else: ++ linker = self.linker_so_cxx[:] + else: +- linker = self.linker_so[:] +- if target_lang == "c++" and self.compiler_cxx: +- # skip over environment variable settings if /usr/bin/env +- # is used to set up the linker's environment. +- # This is needed on OSX. Note: this assumes that the +- # normal and C++ compiler have the same environment +- # settings. +- i = 0 +- if os.path.basename(linker[0]) == "env": +- i = 1 +- while '=' in linker[i]: +- i += 1 +- +- if os.path.basename(linker[i]) == 'ld_so_aix': +- # AIX platforms prefix the compiler with the ld_so_aix +- # script, so we need to adjust our linker index +- offset = 1 ++ if target_desc == CCompiler.EXECUTABLE: ++ linker = self.linker_exe[:] + else: +- offset = 0 +- +- linker[i+offset] = self.compiler_cxx[i] ++ linker = self.linker_so[:] + + if sys.platform == 'darwin': + linker = _osx_support.compiler_fixup(linker, ld_args) +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -584,10 +584,10 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o + *\ -s*|s*) quiet="-q";; \ + *) quiet="";; \ + esac; \ +- echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ ++ echo "$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ + _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \ + $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build"; \ +- $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ ++ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \ + _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \ + $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build + diff --git a/pkgs/by-name/py/python/cpython/3.8/0001-On-all-posix-systems-not-just-Darwin-set-LDSHARED-if.patch b/pkgs/by-name/py/python/cpython/3.8/0001-On-all-posix-systems-not-just-Darwin-set-LDSHARED-if.patch new file mode 100644 index 0000000..0c26300 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.8/0001-On-all-posix-systems-not-just-Darwin-set-LDSHARED-if.patch @@ -0,0 +1,33 @@ +From 1911995b1a1252d80bf2b9651840e185a1a6baf5 Mon Sep 17 00:00:00 2001 +From: Hong Xu +Date: Thu, 25 Jul 2019 10:25:55 -0700 +Subject: [PATCH] On all posix systems, not just Darwin, set LDSHARED (if not + set) according to CC + +This patch is slightly different from https://bugs.python.org/issue24935 +, except that we now handle LDSHARED according to CC on all posix +systems, not just Darwin or Linux. +--- + Lib/distutils/sysconfig.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index 37feae5df7..9fdce6896d 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -199,10 +199,10 @@ def customize_compiler(compiler): + + if 'CC' in os.environ: + newcc = os.environ['CC'] +- if (sys.platform == 'darwin' ++ if (os.name == 'posix' + and 'LDSHARED' not in os.environ + and ldshared.startswith(cc)): +- # On OS X, if CC is overridden, use that as the default ++ # On POSIX systems, if CC is overridden, use that as the default + # command for LDSHARED as well + ldshared = newcc + ldshared[len(cc):] + cc = newcc +-- +2.25.1 + diff --git a/pkgs/by-name/py/python/cpython/3.8/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.8/no-ldconfig.patch new file mode 100644 index 0000000..41d3ab5 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.8/no-ldconfig.patch @@ -0,0 +1,106 @@ +From 66f492d2eda94bd64db833839a325caf6ba0fed5 Mon Sep 17 00:00:00 2001 +From: Greg Roodt +Date: Wed, 9 Dec 2020 17:59:24 +1100 +Subject: [PATCH] Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e161..7fb98af308 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ elif os.name == "posix": + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ elif os.name == "posix": + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.24.3 (Apple Git-128) diff --git a/pkgs/by-name/py/python/cpython/3.9/darwin-tcl-tk.patch b/pkgs/by-name/py/python/cpython/3.9/darwin-tcl-tk.patch new file mode 100644 index 0000000..a9b0c06 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.9/darwin-tcl-tk.patch @@ -0,0 +1,15 @@ +diff --git a/setup.py b/setup.py +index 04eb6b2..2e1160d 100644 +--- a/setup.py ++++ b/setup.py +@@ -1981,8 +1981,8 @@ class PyBuildExt(build_ext): + # Rather than complicate the code below, detecting and building + # AquaTk is a separate method. Only one Tkinter will be built on + # Darwin - either AquaTk, if it is found, or X11 based Tk. +- if (MACOS and self.detect_tkinter_darwin()): +- return True ++ # if (MACOS and self.detect_tkinter_darwin()): ++ # return True + + # Assume we haven't found any of the libraries or include files + # The versions with dots are used on Unix, and the versions without diff --git a/pkgs/by-name/py/python/cpython/3.9/no-ldconfig.patch b/pkgs/by-name/py/python/cpython/3.9/no-ldconfig.patch new file mode 100644 index 0000000..41d3ab5 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/3.9/no-ldconfig.patch @@ -0,0 +1,106 @@ +From 66f492d2eda94bd64db833839a325caf6ba0fed5 Mon Sep 17 00:00:00 2001 +From: Greg Roodt +Date: Wed, 9 Dec 2020 17:59:24 +1100 +Subject: [PATCH] Don't use ldconfig + +--- + Lib/ctypes/util.py | 77 ++-------------------------------------------- + 1 file changed, 2 insertions(+), 75 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 0c2510e161..7fb98af308 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -100,53 +100,7 @@ elif os.name == "posix": + return thefile.read(4) == elf_header + + def _findLib_gcc(name): +- # Run GCC's linker with the -t (aka --trace) option and examine the +- # library name it prints out. The GCC command will fail because we +- # haven't supplied a proper program with main(), but that does not +- # matter. +- expr = os.fsencode(r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)) +- +- c_compiler = shutil.which('gcc') +- if not c_compiler: +- c_compiler = shutil.which('cc') +- if not c_compiler: +- # No C compiler available, give up +- return None +- +- temp = tempfile.NamedTemporaryFile() +- try: +- args = [c_compiler, '-Wl,-t', '-o', temp.name, '-l' + name] +- +- env = dict(os.environ) +- env['LC_ALL'] = 'C' +- env['LANG'] = 'C' +- try: +- proc = subprocess.Popen(args, +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT, +- env=env) +- except OSError: # E.g. bad executable +- return None +- with proc: +- trace = proc.stdout.read() +- finally: +- try: +- temp.close() +- except FileNotFoundError: +- # Raised if the file was already removed, which is the normal +- # behaviour of GCC if linking fails +- pass +- res = re.findall(expr, trace) +- if not res: +- return None +- +- for file in res: +- # Check if the given file is an elf file: gcc can report +- # some files that are linker scripts and not actual +- # shared objects. See bpo-41976 for more details +- if not _is_elf(file): +- continue +- return os.fsdecode(file) ++ return None + + + if sys.platform == "sunos5": +@@ -268,34 +222,7 @@ elif os.name == "posix": + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = r'\s+(lib%s\.[^\s]+)\s+\(%s' +- regex = os.fsencode(regex % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def _findLib_ld(name): + # See issue #9998 for why this is needed +-- +2.24.3 (Apple Git-128) diff --git a/pkgs/by-name/py/python/cpython/default.nix b/pkgs/by-name/py/python/cpython/default.nix new file mode 100644 index 0000000..301af7a --- /dev/null +++ b/pkgs/by-name/py/python/cpython/default.nix @@ -0,0 +1,668 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, fetchgit + +# build dependencies +, autoconf-archive +, autoreconfHook +, nukeReferences +, pkg-config +, python-setup-hook + +# runtime dependencies +, bzip2 +, expat +, libffi +, libxcrypt +, mpdecimal +, ncurses +, openssl +, sqlite +, xz +, zlib + +# platform-specific dependencies +, bash +, configd +, darwin +, windows + +# optional dependencies +, bluezSupport ? false, bluez +, mimetypesSupport ? true, mailcap +, tzdata +, withGdbm ? !stdenv.hostPlatform.isWindows, gdbm +, withReadline ? !stdenv.hostPlatform.isWindows, readline +, x11Support ? false, tcl, tk, tix, libX11, xorgproto + +# splicing/cross +, pythonAttr ? "python${sourceVersion.major}${sourceVersion.minor}" +, self +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsTargetTarget + +# build customization +, sourceVersion +, hash +, passthruFun +, stripConfig ? false +, stripIdlelib ? false +, stripTests ? false +, stripTkinter ? false +, rebuildBytecode ? true +, stripBytecode ? true +, includeSiteCustomize ? true +, static ? stdenv.hostPlatform.isStatic +, enableFramework ? false +, noldconfigPatch ? ./. + "/${sourceVersion.major}.${sourceVersion.minor}/no-ldconfig.patch" +, enableGIL ? true + +# pgo (not reproducible) + -fno-semantic-interposition +# https://docs.python.org/3/using/configure.html#cmdoption-enable-optimizations +, enableOptimizations ? false + +# improves performance, but remains reproducible +, enableNoSemanticInterposition ? true + +# enabling LTO on 32bit arch causes downstream packages to fail when linking +# enabling LTO on *-darwin causes python3 to fail when linking. +, enableLTO ? stdenv.is64bit && stdenv.isLinux + +# enable asserts to ensure the build remains reproducible +, reproducibleBuild ? false + +# for the Python package set +, packageOverrides ? (self: super: {}) + +# tests +, testers + +} @ inputs: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert x11Support -> tcl != null + && tk != null + && xorgproto != null + && libX11 != null; + +assert bluezSupport -> bluez != null; + +assert lib.assertMsg (enableFramework -> stdenv.isDarwin) + "Framework builds are only supported on Darwin."; + +assert lib.assertMsg (reproducibleBuild -> stripBytecode) + "Deterministic builds require stripping bytecode."; + +assert lib.assertMsg (reproducibleBuild -> (!enableOptimizations)) + "Deterministic builds are not achieved when optimizations are enabled."; + +assert lib.assertMsg (reproducibleBuild -> (!rebuildBytecode)) + "Deterministic builds are not achieved when (default unoptimized) bytecode is created."; + +let + inherit (lib) + concatMapStringsSep + concatStringsSep + enableFeature + getDev + getLib + optionals + optionalString + replaceStrings + versionOlder + ; + + buildPackages = pkgsBuildHost; + inherit (passthru) pythonOnBuildForHost; + + tzdataSupport = tzdata != null && passthru.pythonAtLeast "3.9"; + + passthru = let + # When we override the interpreter we also need to override the spliced versions of the interpreter + inputs' = lib.filterAttrs (n: v: ! lib.isDerivation v && n != "passthruFun") inputs; + override = attr: let python = attr.override (inputs' // { self = python; }); in python; + in passthruFun rec { + inherit self sourceVersion packageOverrides; + implementation = "cpython"; + libPrefix = "python${pythonVersion}"; + executable = libPrefix; + pythonVersion = with sourceVersion; "${major}.${minor}"; + sitePackages = "lib/${libPrefix}/site-packages"; + inherit hasDistutilsCxxPatch pythonAttr; + pythonOnBuildForBuild = override pkgsBuildBuild.${pythonAttr}; + pythonOnBuildForHost = override pkgsBuildHost.${pythonAttr}; + pythonOnBuildForTarget = override pkgsBuildTarget.${pythonAttr}; + pythonOnHostForHost = override pkgsHostHost.${pythonAttr}; + pythonOnTargetForTarget = lib.optionalAttrs (lib.hasAttr pythonAttr pkgsTargetTarget) (override pkgsTargetTarget.${pythonAttr}); + }; + + version = with sourceVersion; "${major}.${minor}.${patch}${suffix}"; + + nativeBuildInputs = [ + nukeReferences + ] ++ optionals (!stdenv.isDarwin) [ + autoconf-archive # needed for AX_CHECK_COMPILE_FLAG + autoreconfHook + pkg-config + ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + buildPackages.stdenv.cc + pythonOnBuildForHost + ] ++ optionals (stdenv.cc.isClang && (!stdenv.hostPlatform.useAndroidPrebuilt or false) && (enableLTO || enableOptimizations)) [ + stdenv.cc.cc.libllvm.out + ]; + + buildInputs = lib.filter (p: p != null) ([ + bzip2 + expat + libffi + libxcrypt + mpdecimal + ncurses + openssl + sqlite + xz + zlib + ] ++ optionals bluezSupport [ + bluez + ] ++ optionals enableFramework [ + darwin.apple_sdk.frameworks.Cocoa + ] ++ optionals stdenv.hostPlatform.isMinGW [ + windows.dlfcn + windows.mingw_w64_pthreads + ] ++ optionals stdenv.isDarwin [ + configd + ] ++ optionals tzdataSupport [ + tzdata + ] ++ optionals withGdbm [ + gdbm + ] ++ optionals withReadline [ + readline + ] ++ optionals x11Support [ + libX11 + tcl + tk + xorgproto + ]); + + hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false); + + pythonOnBuildForHostInterpreter = if stdenv.hostPlatform == stdenv.buildPlatform then + "$out/bin/python" + else pythonOnBuildForHost.interpreter; + + src = fetchurl { + url = with sourceVersion; "https://www.python.org/ftp/python/${major}.${minor}.${patch}/Python-${version}.tar.xz"; + inherit hash; + }; + + # The CPython interpreter contains a _sysconfigdata_ + # module that is imported by the sysconfig and distutils.sysconfig modules. + # The sysconfigdata module is generated at build time and contains settings + # required for building Python extension modules, such as include paths and + # other compiler flags. By default, the sysconfigdata module is loaded from + # the currently running interpreter (ie. the build platform interpreter), but + # when cross-compiling we want to load it from the host platform interpreter. + # This can be done using the _PYTHON_SYSCONFIGDATA_NAME environment variable. + # The _PYTHON_HOST_PLATFORM variable also needs to be set to get the correct + # platform suffix on extension modules. The correct values for these variables + # are not documented, and must be derived from the configure script (see links + # below). + sysconfigdataHook = with stdenv.hostPlatform; with passthru; let + machdep = if isWindows then "win32" else parsed.kernel.name; # win32 is added by Fedora’s patch + + # https://github.com/python/cpython/blob/e488e300f5c01289c10906c2e53a8e43d6de32d8/configure.ac#L428 + # The configure script uses "arm" as the CPU name for all 32-bit ARM + # variants when cross-compiling, but native builds include the version + # suffix, so we do the same. + pythonHostPlatform = let + cpu = { + # According to PEP600, Python's name for the Power PC + # architecture is "ppc", not "powerpc". Without the Rosetta + # Stone below, the PEP600 requirement that "${ARCH} matches + # the return value from distutils.util.get_platform()" fails. + # https://peps.python.org/pep-0600/ + powerpc = "ppc"; + powerpcle = "ppcle"; + powerpc64 = "ppc64"; + powerpc64le = "ppc64le"; + }.${parsed.cpu.name} or parsed.cpu.name; + in "${machdep}-${cpu}"; + + # https://github.com/python/cpython/blob/e488e300f5c01289c10906c2e53a8e43d6de32d8/configure.ac#L724 + multiarchCpu = + if isAarch32 then + if parsed.cpu.significantByte.name == "littleEndian" then "arm" else "armeb" + else if isx86_32 then "i386" + else parsed.cpu.name; + + pythonAbiName = let + # python's build doesn't match the nixpkgs abi in some cases. + # https://github.com/python/cpython/blob/e488e300f5c01289c10906c2e53a8e43d6de32d8/configure.ac#L724 + nixpkgsPythonAbiMappings = { + "gnuabielfv2" = "gnu"; + "muslabielfv2" = "musl"; + }; + pythonAbi = nixpkgsPythonAbiMappings.${parsed.abi.name} or parsed.abi.name; + in + # Python <3.11 doesn't distinguish musl and glibc and always prefixes with "gnu" + if versionOlder version "3.11" then + replaceStrings [ "musl" ] [ "gnu" ] pythonAbi + else + pythonAbi; + + multiarch = + if isDarwin then "darwin" + else if isWindows then "" + else "${multiarchCpu}-${machdep}-${pythonAbiName}"; + + abiFlags = optionalString isPy37 "m"; + + # https://github.com/python/cpython/blob/e488e300f5c01289c10906c2e53a8e43d6de32d8/configure.ac#L78 + pythonSysconfigdataName = "_sysconfigdata_${abiFlags}_${machdep}_${multiarch}"; + in '' + sysconfigdataHook() { + if [ "$1" = '${placeholder "out"}' ]; then + export _PYTHON_HOST_PLATFORM='${pythonHostPlatform}' + export _PYTHON_SYSCONFIGDATA_NAME='${pythonSysconfigdataName}' + fi + } + + addEnvHooks "$hostOffset" sysconfigdataHook + ''; + + execSuffix = stdenv.hostPlatform.extensions.executable; +in with passthru; stdenv.mkDerivation (finalAttrs: { + pname = "python3"; + inherit src version; + + inherit nativeBuildInputs; + buildInputs = lib.optionals (!stdenv.hostPlatform.isWindows) [ + bash # only required for patchShebangs + ] ++ buildInputs; + + prePatch = optionalString stdenv.isDarwin '' + substituteInPlace configure --replace-fail '`/usr/bin/arch`' '"i386"' + '' + optionalString (pythonOlder "3.9" && stdenv.isDarwin && x11Support) '' + # Broken on >= 3.9; replaced with ./3.9/darwin-tcl-tk.patch + substituteInPlace setup.py --replace-fail /Library/Frameworks /no-such-path + ''; + + patches = [ + # Disable the use of ldconfig in ctypes.util.find_library (since + # ldconfig doesn't work on NixOS), and don't use + # ctypes.util.find_library during the loading of the uuid module + # (since it will do a futile invocation of gcc (!) to find + # libuuid, slowing down program startup a lot). + noldconfigPatch + # Make sure that the virtualenv activation scripts are + # owner-writable, so venvs can be recreated without permission + # errors. + ] ++ optionals (pythonOlder "3.13") [ + ./virtualenv-permissions.patch + ] ++ optionals (pythonAtLeast "3.13") [ + ./3.13/virtualenv-permissions.patch + ] ++ optionals mimetypesSupport [ + # Make the mimetypes module refer to the right file + ./mimetypes.patch + ] ++ optionals (pythonAtLeast "3.7" && pythonOlder "3.11") [ + # Fix darwin build https://bugs.python.org/issue34027 + ./3.7/darwin-libutil.patch + ] ++ optionals (pythonAtLeast "3.11") [ + ./3.11/darwin-libutil.patch + ] ++ optionals (pythonAtLeast "3.9" && pythonOlder "3.11" && stdenv.isDarwin) [ + # Stop checking for TCL/TK in global macOS locations + ./3.9/darwin-tcl-tk.patch + ] ++ optionals (hasDistutilsCxxPatch && pythonOlder "3.12") [ + # Fix for http://bugs.python.org/issue1222585 + # Upstream distutils is calling C compiler to compile C++ code, which + # only works for GCC and Apple Clang. This makes distutils to call C++ + # compiler when needed. + ( + if pythonAtLeast "3.7" && pythonOlder "3.11" then + ./3.7/python-3.x-distutils-C++.patch + else if pythonAtLeast "3.11" then + ./3.11/python-3.x-distutils-C++.patch + else + fetchpatch { + url = "https://bugs.python.org/file48016/python-3.x-distutils-C++.patch"; + sha256 = "1h18lnpx539h5lfxyk379dxwr8m2raigcjixkf133l4xy3f4bzi2"; + } + ) + ] ++ optionals (pythonAtLeast "3.7" && pythonOlder "3.12") [ + # LDSHARED now uses $CC instead of gcc. Fixes cross-compilation of extension modules. + ./3.8/0001-On-all-posix-systems-not-just-Darwin-set-LDSHARED-if.patch + # Use sysconfigdata to find headers. Fixes cross-compilation of extension modules. + ./3.7/fix-finding-headers-when-cross-compiling.patch + ] ++ optionals (pythonOlder "3.12") [ + # https://github.com/python/cpython/issues/90656 + ./loongarch-support.patch + ] ++ optionals (pythonAtLeast "3.11" && pythonOlder "3.13") [ + # backport fix for https://github.com/python/cpython/issues/95855 + ./platform-triplet-detection.patch + ] ++ optionals (stdenv.hostPlatform.isMinGW) (let + # https://src.fedoraproject.org/rpms/mingw-python3 + mingw-patch = fetchgit { + name = "mingw-python-patches"; + url = "https://src.fedoraproject.org/rpms/mingw-python3.git"; + rev = "45c45833ab9e5480ad0ae00778a05ebf35812ed4"; # for python 3.11.5 at the time of writing. + sha256 = "sha256-KIyNvO6MlYTrmSy9V/DbzXm5OsIuyT/BEpuo7Umm9DI="; + }; + in [ + "${mingw-patch}/*.patch" + ]); + + postPatch = optionalString (!stdenv.hostPlatform.isWindows) '' + substituteInPlace Lib/subprocess.py \ + --replace-fail "'/bin/sh'" "'${bash}/bin/sh'" + '' + optionalString mimetypesSupport '' + substituteInPlace Lib/mimetypes.py \ + --replace-fail "@mime-types@" "${mailcap}" + '' + optionalString (pythonOlder "3.13" && x11Support && (tix != null)) '' + substituteInPlace "Lib/tkinter/tix.py" --replace-fail \ + "os.environ.get('TIX_LIBRARY')" \ + "os.environ.get('TIX_LIBRARY') or '${tix}/lib'" + ''; + + env = { + CPPFLAGS = concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs); + LDFLAGS = concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs); + LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"}"; + NIX_LDFLAGS = lib.optionalString (stdenv.cc.isGNU && !stdenv.hostPlatform.isStatic) ({ + "glibc" = "-lgcc_s"; + "musl" = "-lgcc_eh"; + }."${stdenv.hostPlatform.libc}" or ""); + # Determinism: We fix the hashes of str, bytes and datetime objects. + PYTHONHASHSEED=0; + }; + + # https://docs.python.org/3/using/configure.html + configureFlags = [ + "--without-ensurepip" + "--with-system-expat" + ] ++ optionals (!(stdenv.isDarwin && pythonAtLeast "3.12")) [ + # ./Modules/_decimal/_decimal.c:4673:6: error: "No valid combination of CONFIG_64, CONFIG_32 and _PyHASH_BITS" + # https://hydra.nixos.org/build/248410479/nixlog/2/tail + "--with-system-libmpdec" + ] ++ optionals (openssl != null) [ + "--with-openssl=${openssl.dev}" + ] ++ optionals tzdataSupport [ + "--with-tzpath=${tzdata}/share/zoneinfo" + ] ++ optionals (execSuffix != "") [ + "--with-suffix=${execSuffix}" + ] ++ optionals enableLTO [ + "--with-lto" + ] ++ optionals (!static && !enableFramework) [ + "--enable-shared" + ] ++ optionals enableFramework [ + "--enable-framework=${placeholder "out"}/Library/Frameworks" + ] ++ optionals (pythonAtLeast "3.13") [ + (enableFeature enableGIL "gil") + ] ++ optionals enableOptimizations [ + "--enable-optimizations" + ] ++ optionals (sqlite != null) [ + "--enable-loadable-sqlite-extensions" + ] ++ optionals (libxcrypt != null) [ + "CFLAGS=-I${libxcrypt}/include" + "LIBS=-L${libxcrypt}/lib" + ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "ac_cv_buggy_getaddrinfo=no" + # Assume little-endian IEEE 754 floating point when cross compiling + "ac_cv_little_endian_double=yes" + "ac_cv_big_endian_double=no" + "ac_cv_mixed_endian_double=no" + "ac_cv_x87_double_rounding=yes" + "ac_cv_tanh_preserves_zero_sign=yes" + # Generally assume that things are present and work + "ac_cv_posix_semaphores_enabled=yes" + "ac_cv_broken_sem_getvalue=no" + "ac_cv_wchar_t_signed=yes" + "ac_cv_rshift_extends_sign=yes" + "ac_cv_broken_nice=no" + "ac_cv_broken_poll=no" + "ac_cv_working_tzset=yes" + "ac_cv_have_long_long_format=yes" + "ac_cv_have_size_t_format=yes" + "ac_cv_computed_gotos=yes" + # Both fail when building for windows, normally configure checks this by itself but on other platforms this is set to yes always. + "ac_cv_file__dev_ptmx=${if stdenv.hostPlatform.isWindows then "no" else "yes"}" + "ac_cv_file__dev_ptc=${if stdenv.hostPlatform.isWindows then "no" else "yes"}" + ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform && pythonAtLeast "3.11") [ + "--with-build-python=${pythonOnBuildForHostInterpreter}" + ] ++ optionals stdenv.hostPlatform.isLinux [ + # Never even try to use lchmod on linux, + # don't rely on detecting glibc-isms. + "ac_cv_func_lchmod=no" + ] ++ optionals static [ + "LDFLAGS=-static" + ]; + + preConfigure = optionalString (pythonOlder "3.12") '' + # Improve purity + for path in /usr /sw /opt /pkg; do + substituteInPlace ./setup.py --replace-warn $path /no-such-path + done + '' + optionalString stdenv.isDarwin '' + # Override the auto-detection in setup.py, which assumes a universal build + export PYTHON_DECIMAL_WITH_MACHINE=${if stdenv.isAarch64 then "uint128" else "x64"} + '' + optionalString (stdenv.isDarwin && x11Support && pythonAtLeast "3.11") '' + export TCLTK_LIBS="-L${tcl}/lib -L${tk}/lib -l${tcl.libPrefix} -l${tk.libPrefix}" + export TCLTK_CFLAGS="-I${tcl}/include -I${tk}/include" + '' + optionalString stdenv.hostPlatform.isMusl '' + export NIX_CFLAGS_COMPILE+=" -DTHREAD_STACK_SIZE=0x100000" + '' + + + # enableNoSemanticInterposition essentially sets that CFLAG -fno-semantic-interposition + # which changes how symbols are looked up. This essentially means we can't override + # libpython symbols via LD_PRELOAD anymore. This is common enough as every build + # that uses --enable-optimizations has the same "issue". + # + # The Fedora wiki has a good article about their journey towards enabling this flag: + # https://fedoraproject.org/wiki/Changes/PythonNoSemanticInterpositionSpeedup + optionalString enableNoSemanticInterposition '' + export CFLAGS_NODIST="-fno-semantic-interposition" + ''; + + setupHook = python-setup-hook sitePackages; + + postInstall = let + # References *not* to nuke from (sys)config files + keep-references = concatMapStringsSep " " (val: "-e ${val}") ([ + (placeholder "out") libxcrypt + ] ++ optionals tzdataSupport [ + tzdata + ]); + in lib.optionalString enableFramework '' + for dir in include lib share; do + ln -s $out/Library/Frameworks/Python.framework/Versions/Current/$dir $out/$dir + done + '' + '' + # needed for some packages, especially packages that backport functionality + # to 2.x from 3.x + for item in $out/lib/${libPrefix}/test/*; do + if [[ "$item" != */test_support.py* + && "$item" != */test/support + && "$item" != */test/libregrtest + && "$item" != */test/regrtest.py* ]]; then + rm -rf "$item" + else + echo $item + fi + done + touch $out/lib/${libPrefix}/test/__init__.py + + # Determinism: Windows installers were not deterministic. + # We're also not interested in building Windows installers. + find "$out" -name 'wininst*.exe' | xargs -r rm -f + + # Use Python3 as default python + ln -s "$out/bin/idle3" "$out/bin/idle" + ln -s "$out/bin/pydoc3" "$out/bin/pydoc" + ln -s "$out/bin/python3${execSuffix}" "$out/bin/python${execSuffix}" + ln -s "$out/bin/python3-config" "$out/bin/python-config" + ln -s "$out/lib/pkgconfig/python3.pc" "$out/lib/pkgconfig/python.pc" + ln -sL "$out/share/man/man1/python3.1.gz" "$out/share/man/man1/python.1.gz" + + # Get rid of retained dependencies on -dev packages, and remove + # some $TMPDIR references to improve binary reproducibility. + # Note that the .pyc file of _sysconfigdata.py should be regenerated! + for i in $out/lib/${libPrefix}/_sysconfigdata*.py $out/lib/${libPrefix}/config-${sourceVersion.major}${sourceVersion.minor}*/Makefile; do + sed -i $i -e "s|$TMPDIR|/no-such-path|g" + done + + # Further get rid of references. https://github.com/NixOS/nixpkgs/issues/51668 + find $out/lib/python*/config-* -type f -print -exec nuke-refs ${keep-references} '{}' + + find $out/lib -name '_sysconfigdata*.py*' -print -exec nuke-refs ${keep-references} '{}' + + + # Make the sysconfigdata module accessible on PYTHONPATH + # This allows build Python to import host Python's sysconfigdata + mkdir -p "$out/${sitePackages}" + ln -s "$out/lib/${libPrefix}/"_sysconfigdata*.py "$out/${sitePackages}/" + '' + optionalString stripConfig '' + rm -R $out/bin/python*-config $out/lib/python*/config-* + '' + optionalString stripIdlelib '' + # Strip IDLE (and turtledemo, which uses it) + rm -R $out/bin/idle* $out/lib/python*/{idlelib,turtledemo} + '' + optionalString stripTkinter '' + rm -R $out/lib/python*/tkinter + '' + optionalString stripTests '' + # Strip tests + rm -R $out/lib/python*/test $out/lib/python*/**/test{,s} + '' + optionalString includeSiteCustomize '' + # Include a sitecustomize.py file + cp ${../sitecustomize.py} $out/${sitePackages}/sitecustomize.py + '' + optionalString stripBytecode '' + # Determinism: deterministic bytecode + # First we delete all old bytecode. + find $out -type d -name __pycache__ -print0 | xargs -0 -I {} rm -rf "{}" + '' + optionalString rebuildBytecode '' + # Python 3.7 implements PEP 552, introducing support for deterministic bytecode. + # compileall uses the therein introduced checked-hash method by default when + # `SOURCE_DATE_EPOCH` is set. + # We exclude lib2to3 because that's Python 2 code which fails + # We build 3 levels of optimized bytecode. Note the default level, without optimizations, + # is not reproducible yet. https://bugs.python.org/issue29708 + # Not creating bytecode will result in a large performance loss however, so we do build it. + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -m compileall -q -f -x "lib2to3" -i - + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -O -m compileall -q -f -x "lib2to3" -i - + find $out -name "*.py" | ${pythonOnBuildForHostInterpreter} -OO -m compileall -q -f -x "lib2to3" -i - + '' + '' + # *strip* shebang from libpython gdb script - it should be dual-syntax and + # interpretable by whatever python the gdb in question is using, which may + # not even match the major version of this python. doing this after the + # bytecode compilations for the same reason - we don't want bytecode generated. + mkdir -p $out/share/gdb + sed '/^#!/d' Tools/gdb/libpython.py > $out/share/gdb/libpython.py + + # Disable system-wide pip installation. See https://peps.python.org/pep-0668/. + cat <<'EXTERNALLY_MANAGED' > $out/lib/${libPrefix}/EXTERNALLY-MANAGED + [externally-managed] + Error=This command has been disabled as it tries to modify the immutable + `/nix/store` filesystem. + + To use Python with Nix and nixpkgs, have a look at the online documentation: + . + EXTERNALLY_MANAGED + '' + optionalString stdenv.hostPlatform.isWindows '' + # Shebang files that link against the build python. Shebang don’t work on windows + rm $out/bin/2to3* + rm $out/bin/idle* + rm $out/bin/pydoc* + + echo linking DLLs for python’s compiled librairies + linkDLLsInfolder $out/lib/python*/lib-dynload/ + ''; + + preFixup = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + # Ensure patch-shebangs uses shebangs of host interpreter. + export PATH=${lib.makeBinPath [ "$out" ]}:$PATH + ''; + + # Add CPython specific setup-hook that configures distutils.sysconfig to + # always load sysconfigdata from host Python. + postFixup = lib.optionalString (!stdenv.hostPlatform.isDarwin) '' + cat << "EOF" >> "$out/nix-support/setup-hook" + ${sysconfigdataHook} + EOF + ''; + + # Enforce that we don't have references to the OpenSSL -dev package, which we + # explicitly specify in our configure flags above. + disallowedReferences = lib.optionals (openssl != null && !static && !enableFramework) [ + openssl.dev + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # Ensure we don't have references to build-time packages. + # These typically end up in shebangs. + pythonOnBuildForHost buildPackages.bash + ]; + + separateDebugInfo = true; + + passthru = passthru // { + doc = stdenv.mkDerivation { + inherit src; + name = "python${pythonVersion}-${version}-doc"; + + patches = optionals (pythonAtLeast "3.9" && pythonOlder "3.10") [ + # https://github.com/python/cpython/issues/98366 + (fetchpatch { + url = "https://github.com/python/cpython/commit/5612471501b05518287ed61c1abcb9ed38c03942.patch"; + hash = "sha256-p41hJwAiyRgyVjCVQokMSpSFg/VDDrqkCSxsodVb6vY="; + }) + ]; + + dontConfigure = true; + + dontBuild = true; + + sphinxRoot = "Doc"; + + postInstallSphinx = '' + mv $out/share/doc/* $out/share/doc/python${pythonVersion}-${version} + ''; + + nativeBuildInputs = with pkgsBuildBuild.python3.pkgs; [ sphinxHook python-docs-theme ]; + }; + + tests = passthru.tests // { + pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; + }; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://www.python.org"; + changelog = let + majorMinor = versions.majorMinor version; + dashedVersion = replaceStrings [ "." "a" ] [ "-" "-alpha-" ] version; + in + if sourceVersion.suffix == "" then + "https://docs.python.org/release/${version}/whatsnew/changelog.html" + else + "https://docs.python.org/${majorMinor}/whatsnew/changelog.html#python-${dashedVersion}"; + description = "A high-level dynamically-typed programming language"; + longDescription = '' + Python is a remarkably powerful dynamic programming language that + is used in a wide variety of application domains. Some of its key + distinguishing features include: clear, readable syntax; strong + introspection capabilities; intuitive object orientation; natural + expression of procedural code; full modularity, supporting + hierarchical packages; exception-based error handling; and very + high level dynamic data types. + ''; + license = licenses.psfl; + pkgConfigModules = [ "python3" ]; + platforms = platforms.linux ++ platforms.darwin ++ platforms.windows; + maintainers = with maintainers; [ fridh ]; + mainProgram = executable; + }; +}) diff --git a/pkgs/by-name/py/python/cpython/docs/2.7-html.nix b/pkgs/by-name/py/python/cpython/docs/2.7-html.nix new file mode 100644 index 0000000..a15bca1 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/2.7-html.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python27-docs-html"; + version = "2.7.18"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/2.7.18/python-2.7.18-docs-html.tar.bz2"; + sha256 = "03igxwpqc2lvzspnj78zz1prnmfwwj00jbvh1wsxvb0wayd5wi10"; + }; + installPhase = '' + mkdir -p $out/share/doc/python27 + cp -R ./ $out/share/doc/python27/html + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/2.7-pdf-a4.nix b/pkgs/by-name/py/python/cpython/docs/2.7-pdf-a4.nix new file mode 100644 index 0000000..54b2899 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/2.7-pdf-a4.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python27-docs-pdf-a4"; + version = "2.7.18"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/2.7.18/python-2.7.18-docs-pdf-a4.tar.bz2"; + sha256 = "0rxb2fpxwivjpk5wi2pl1fqibr4khf9s0yq6a49k9b4awi9nkb6v"; + }; + installPhase = '' + mkdir -p $out/share/doc/python27 + cp -R ./ $out/share/doc/python27/pdf-a4 + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/2.7-pdf-letter.nix b/pkgs/by-name/py/python/cpython/docs/2.7-pdf-letter.nix new file mode 100644 index 0000000..84cf35f --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/2.7-pdf-letter.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python27-docs-pdf-letter"; + version = "2.7.18"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/2.7.18/python-2.7.18-docs-pdf-letter.tar.bz2"; + sha256 = "07hbqvrdlq01cb95r1574bxqqhiqbkj4f92wzlq4d6dq1l272nan"; + }; + installPhase = '' + mkdir -p $out/share/doc/python27 + cp -R ./ $out/share/doc/python27/pdf-letter + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/2.7-text.nix b/pkgs/by-name/py/python/cpython/docs/2.7-text.nix new file mode 100644 index 0000000..5d25344 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/2.7-text.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python27-docs-text"; + version = "2.7.18"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/2.7.18/python-2.7.18-docs-text.tar.bz2"; + sha256 = "1wj7mxs52kp5lmn5mvv574sygkfnk00kbz9ya9c03yfq5dd5nvy8"; + }; + installPhase = '' + mkdir -p $out/share/doc/python27 + cp -R ./ $out/share/doc/python27/text + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/3.10-html.nix b/pkgs/by-name/py/python/cpython/docs/3.10-html.nix new file mode 100644 index 0000000..6efe8d5 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/3.10-html.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python310-docs-html"; + version = "3.10.7"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/3.10.7/python-3.10.7-docs-html.tar.bz2"; + sha256 = "0j86z1vmaghzj5i4frvzyfb9qwsmm09g4f4ssx5w27cm30b8k0v1"; + }; + installPhase = '' + mkdir -p $out/share/doc/python310 + cp -R ./ $out/share/doc/python310/html + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/3.10-pdf-a4.nix b/pkgs/by-name/py/python/cpython/docs/3.10-pdf-a4.nix new file mode 100644 index 0000000..1cbbf17 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/3.10-pdf-a4.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python310-docs-pdf-a4"; + version = "3.10.7"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/3.10.7/python-3.10.7-docs-pdf-a4.tar.bz2"; + sha256 = "1gvi457dsj3ywwvxysp7idkk9ndngnby1dnfh1q8f5gv3kg4093r"; + }; + installPhase = '' + mkdir -p $out/share/doc/python310 + cp -R ./ $out/share/doc/python310/pdf-a4 + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/3.10-pdf-letter.nix b/pkgs/by-name/py/python/cpython/docs/3.10-pdf-letter.nix new file mode 100644 index 0000000..6b24450 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/3.10-pdf-letter.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python310-docs-pdf-letter"; + version = "3.10.7"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/3.10.7/python-3.10.7-docs-pdf-letter.tar.bz2"; + sha256 = "0hzq5n6absqsh21jp6j5iaim9a1wq69d8lc2assldzb2zg4i75hr"; + }; + installPhase = '' + mkdir -p $out/share/doc/python310 + cp -R ./ $out/share/doc/python310/pdf-letter + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/3.10-texinfo.nix b/pkgs/by-name/py/python/cpython/docs/3.10-texinfo.nix new file mode 100644 index 0000000..694ed0e --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/3.10-texinfo.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python310-docs-texinfo"; + version = "3.10.7"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/3.10.7/python-3.10.7-docs-texinfo.tar.bz2"; + sha256 = "0p0fifi84ijz4ng6krw7c1x965jhgysprkijblmlnax7x9rmqrdf"; + }; + installPhase = '' + mkdir -p $out/share/info + cp ./python.info $out/share/info + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/3.10-text.nix b/pkgs/by-name/py/python/cpython/docs/3.10-text.nix new file mode 100644 index 0000000..4ada4e2 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/3.10-text.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "python310-docs-text"; + version = "3.10.7"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/doc/3.10.7/python-3.10.7-docs-text.tar.bz2"; + sha256 = "1zbmm2fvdjnl214y41yffyqw3ywfai5r5npc00n1wkfxsdp7gcc3"; + }; + installPhase = '' + mkdir -p $out/share/doc/python310 + cp -R ./ $out/share/doc/python310/text + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/default.nix b/pkgs/by-name/py/python/cpython/docs/default.nix new file mode 100644 index 0000000..b632478 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/default.nix @@ -0,0 +1,47 @@ +{ stdenv, fetchurl, lib }: + +let +pythonDocs = { + html = { + recurseForDerivations = true; + python27 = import ./2.7-html.nix { + inherit stdenv fetchurl lib; + }; + python310 = import ./3.10-html.nix { + inherit stdenv fetchurl lib; + }; + }; + pdf_a4 = { + recurseForDerivations = true; + python27 = import ./2.7-pdf-a4.nix { + inherit stdenv fetchurl lib; + }; + python310 = import ./3.10-pdf-a4.nix { + inherit stdenv fetchurl lib; + }; + }; + pdf_letter = { + recurseForDerivations = true; + python27 = import ./2.7-pdf-letter.nix { + inherit stdenv fetchurl lib; + }; + python310 = import ./3.10-pdf-letter.nix { + inherit stdenv fetchurl lib; + }; + }; + text = { + recurseForDerivations = true; + python27 = import ./2.7-text.nix { + inherit stdenv fetchurl lib; + }; + python310 = import ./3.10-text.nix { + inherit stdenv fetchurl lib; + }; + }; + texinfo = { + recurseForDerivations = true; + python310 = import ./3.10-texinfo.nix { + inherit stdenv fetchurl lib; + }; + }; +}; in pythonDocs diff --git a/pkgs/by-name/py/python/cpython/docs/generate.sh b/pkgs/by-name/py/python/cpython/docs/generate.sh new file mode 100755 index 0000000..46db4d8 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/generate.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +cd -- "$(dirname -- "${BASH_SOURCE[0]}")" + +TYPES="html pdf-a4 pdf-letter text texinfo" +URL=http://www.python.org/ftp/python/doc/VERSION/python-VERSION-docs-TYPE.tar.bz2 +VERSIONS=$(for major in 2 3; do curl https://docs.python.org/$major/archives/ 2>/dev/null | perl -l -n -e'/default.nix <>default.nix < ${outfile} + + attrname=python${major}${minor} + cat >>default.nix <> default.nix +done + +echo "}; in pythonDocs" >> default.nix diff --git a/pkgs/by-name/py/python/cpython/docs/template-info.nix b/pkgs/by-name/py/python/cpython/docs/template-info.nix new file mode 100644 index 0000000..4f5d4b3 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/template-info.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "pythonMAJORMINOR-docs-TYPE"; + version = "VERSION"; + + src = fetchurl { + url = "URL"; + sha256 = "SHA"; + }; + installPhase = '' + mkdir -p $out/share/info + cp ./python.info $out/share/info + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/docs/template.nix b/pkgs/by-name/py/python/cpython/docs/template.nix new file mode 100644 index 0000000..fff6e0b --- /dev/null +++ b/pkgs/by-name/py/python/cpython/docs/template.nix @@ -0,0 +1,20 @@ +# This file was generated and will be overwritten by ./generate.sh + +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation { + pname = "pythonMAJORMINOR-docs-TYPE"; + version = "VERSION"; + + src = fetchurl { + url = "URL"; + sha256 = "SHA"; + }; + installPhase = '' + mkdir -p $out/share/doc/pythonMAJORMINOR + cp -R ./ $out/share/doc/pythonMAJORMINOR/TYPE + ''; + meta = { + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/cpython/loongarch-support.patch b/pkgs/by-name/py/python/cpython/loongarch-support.patch new file mode 100644 index 0000000..44348c5 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/loongarch-support.patch @@ -0,0 +1,50 @@ +diff --git a/configure b/configure +index 8133d47f61..334c98e208 100755 +--- a/configure ++++ b/configure +@@ -6215,6 +6215,20 @@ cat > conftest.c < conftest.c <=6) && defined(_MIPSEL) diff --git a/pkgs/by-name/py/python/cpython/mimetypes.patch b/pkgs/by-name/py/python/cpython/mimetypes.patch new file mode 100644 index 0000000..4ea700a --- /dev/null +++ b/pkgs/by-name/py/python/cpython/mimetypes.patch @@ -0,0 +1,23 @@ +diff --git i/Lib/mimetypes.py w/Lib/mimetypes.py +index f3343c8..ab5b886 100644 +--- i/Lib/mimetypes.py ++++ w/Lib/mimetypes.py +@@ -40,16 +40,8 @@ + ] + + knownfiles = [ +- "/etc/mime.types", +- "/etc/httpd/mime.types", # Mac OS X +- "/etc/httpd/conf/mime.types", # Apache +- "/etc/apache/mime.types", # Apache 1 +- "/etc/apache2/mime.types", # Apache 2 +- "/usr/local/etc/httpd/conf/mime.types", +- "/usr/local/lib/netscape/mime.types", +- "/usr/local/etc/httpd/conf/mime.types", # Apache 1.2 +- "/usr/local/etc/mime.types", # Apache 1.3 +- ] ++ "@mime-types@/etc/mime.types", ++] + + inited = False + _db = None diff --git a/pkgs/by-name/py/python/cpython/platform-triplet-detection.patch b/pkgs/by-name/py/python/cpython/platform-triplet-detection.patch new file mode 100644 index 0000000..ec76546 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/platform-triplet-detection.patch @@ -0,0 +1,295 @@ +diff --git a/configure.ac b/configure.ac +index ba768aea93..621ac166bd 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -936,125 +936,192 @@ cat > conftest.c < ++# if defined(__UCLIBC__) ++# error uclibc not supported ++# elif defined(__dietlibc__) ++# error dietlibc not supported ++# elif defined(__GLIBC__) ++# define LIBC gnu ++# define LIBC_X32 gnux32 ++# if defined(__ARM_PCS_VFP) ++# define LIBC_ARM gnueabihf ++# else ++# define LIBC_ARM gnueabi ++# endif ++# if defined(__loongarch__) ++# if defined(__loongarch_soft_float) ++# define LIBC_LA gnusf ++# elif defined(__loongarch_single_float) ++# define LIBC_LA gnuf32 ++# elif defined(__loongarch_double_float) ++# define LIBC_LA gnu ++# else ++# error unknown loongarch floating-point base abi ++# endif ++# endif ++# if defined(_MIPS_SIM) ++# if defined(__mips_hard_float) ++# if _MIPS_SIM == _ABIO32 ++# define LIBC_MIPS gnu ++# elif _MIPS_SIM == _ABIN32 ++# define LIBC_MIPS gnuabin32 ++# elif _MIPS_SIM == _ABI64 ++# define LIBC_MIPS gnuabi64 ++# else ++# error unknown mips sim value ++# endif ++# else ++# if _MIPS_SIM == _ABIO32 ++# define LIBC_MIPS gnusf ++# elif _MIPS_SIM == _ABIN32 ++# define LIBC_MIPS gnuabin32sf ++# elif _MIPS_SIM == _ABI64 ++# define LIBC_MIPS gnuabi64sf ++# else ++# error unknown mips sim value ++# endif ++# endif ++# endif ++# if defined(__SPE__) ++# define LIBC_PPC gnuspe ++# else ++# define LIBC_PPC gnu ++# endif ++# else ++# include ++# ifdef __DEFINED_va_list ++# define LIBC musl ++# define LIBC_X32 muslx32 ++# if defined(__ARM_PCS_VFP) ++# define LIBC_ARM musleabihf ++# else ++# define LIBC_ARM musleabi ++# endif ++# if defined(__loongarch__) ++# if defined(__loongarch_soft_float) ++# define LIBC_LA muslsf ++# elif defined(__loongarch_single_float) ++# define LIBC_LA muslf32 ++# elif defined(__loongarch_double_float) ++# define LIBC_LA musl ++# else ++# error unknown loongarch floating-point base abi ++# endif ++# endif ++# if defined(_MIPS_SIM) ++# if defined(__mips_hard_float) ++# if _MIPS_SIM == _ABIO32 ++# define LIBC_MIPS musl ++# elif _MIPS_SIM == _ABIN32 ++# define LIBC_MIPS musln32 ++# elif _MIPS_SIM == _ABI64 ++# define LIBC_MIPS musl ++# else ++# error unknown mips sim value ++# endif ++# else ++# if _MIPS_SIM == _ABIO32 ++# define LIBC_MIPS muslsf ++# elif _MIPS_SIM == _ABIN32 ++# define LIBC_MIPS musln32sf ++# elif _MIPS_SIM == _ABI64 ++# define LIBC_MIPS muslsf ++# else ++# error unknown mips sim value ++# endif ++# endif ++# endif ++# if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) ++# define LIBC_PPC muslsf ++# else ++# define LIBC_PPC musl ++# endif ++# else ++# error unknown libc ++# endif ++# endif + # if defined(__x86_64__) && defined(__LP64__) +- x86_64-linux-gnu ++ x86_64-linux-LIBC + # elif defined(__x86_64__) && defined(__ILP32__) +- x86_64-linux-gnux32 ++ x86_64-linux-LIBC_X32 + # elif defined(__i386__) +- i386-linux-gnu ++ i386-linux-LIBC + # elif defined(__aarch64__) && defined(__AARCH64EL__) + # if defined(__ILP32__) +- aarch64_ilp32-linux-gnu ++ aarch64_ilp32-linux-LIBC + # else +- aarch64-linux-gnu ++ aarch64-linux-LIBC + # endif + # elif defined(__aarch64__) && defined(__AARCH64EB__) + # if defined(__ILP32__) +- aarch64_be_ilp32-linux-gnu ++ aarch64_be_ilp32-linux-LIBC + # else +- aarch64_be-linux-gnu ++ aarch64_be-linux-LIBC + # endif + # elif defined(__alpha__) +- alpha-linux-gnu +-# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP) ++ alpha-linux-LIBC ++# elif defined(__ARM_EABI__) + # if defined(__ARMEL__) +- arm-linux-gnueabihf ++ arm-linux-LIBC_ARM + # else +- armeb-linux-gnueabihf +-# endif +-# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP) +-# if defined(__ARMEL__) +- arm-linux-gnueabi +-# else +- armeb-linux-gnueabi ++ armeb-linux-LIBC_ARM + # endif + # elif defined(__hppa__) +- hppa-linux-gnu ++ hppa-linux-LIBC + # elif defined(__ia64__) +- ia64-linux-gnu +-# elif defined(__loongarch__) +-# if defined(__loongarch_lp64) +-# if defined(__loongarch_soft_float) +- loongarch64-linux-gnusf +-# elif defined(__loongarch_single_float) +- loongarch64-linux-gnuf32 +-# elif defined(__loongarch_double_float) +- loongarch64-linux-gnu ++ ia64-linux-LIBC ++# elif defined(__loongarch__) && defined(__loongarch_lp64) ++ loongarch64-linux-LIBC_LA ++# elif defined(__m68k__) && !defined(__mcoldfire__) ++ m68k-linux-LIBC ++# elif defined(__mips__) ++# if defined(__mips_isa_rev) && (__mips_isa_rev >=6) ++# if defined(_MIPSEL) && defined(__mips64) ++ mipsisa64r6el-linux-LIBC_MIPS ++# elif defined(_MIPSEL) ++ mipsisa32r6el-linux-LIBC_MIPS ++# elif defined(__mips64) ++ mipsisa64r6-linux-LIBC_MIPS + # else +-# error unknown platform triplet ++ mipsisa32r6-linux-LIBC_MIPS + # endif + # else +-# error unknown platform triplet +-# endif +-# elif defined(__m68k__) && !defined(__mcoldfire__) +- m68k-linux-gnu +-# elif defined(__mips_hard_float) && defined(__mips_isa_rev) && (__mips_isa_rev >=6) && defined(_MIPSEL) +-# if _MIPS_SIM == _ABIO32 +- mipsisa32r6el-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mipsisa64r6el-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mipsisa64r6el-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) && defined(__mips_isa_rev) && (__mips_isa_rev >=6) +-# if _MIPS_SIM == _ABIO32 +- mipsisa32r6-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mipsisa64r6-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mipsisa64r6-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) && defined(_MIPSEL) +-# if _MIPS_SIM == _ABIO32 +- mipsel-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mips64el-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mips64el-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) +-# if _MIPS_SIM == _ABIO32 +- mips-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mips64-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mips64-linux-gnuabi64 +-# else +-# error unknown platform triplet ++# if defined(_MIPSEL) && defined(__mips64) ++ mips64el-linux-LIBC_MIPS ++# elif defined(_MIPSEL) ++ mipsel-linux-LIBC_MIPS ++# elif defined(__mips64) ++ mips64-linux-LIBC_MIPS ++# else ++ mips-linux-LIBC_MIPS ++# endif + # endif + # elif defined(__or1k__) +- or1k-linux-gnu +-# elif defined(__powerpc__) && defined(__SPE__) +- powerpc-linux-gnuspe ++ or1k-linux-LIBC + # elif defined(__powerpc64__) + # if defined(__LITTLE_ENDIAN__) +- powerpc64le-linux-gnu ++ powerpc64le-linux-LIBC + # else +- powerpc64-linux-gnu ++ powerpc64-linux-LIBC + # endif + # elif defined(__powerpc__) +- powerpc-linux-gnu ++ powerpc-linux-LIBC_PPC + # elif defined(__s390x__) +- s390x-linux-gnu ++ s390x-linux-LIBC + # elif defined(__s390__) +- s390-linux-gnu ++ s390-linux-LIBC + # elif defined(__sh__) && defined(__LITTLE_ENDIAN__) +- sh4-linux-gnu ++ sh4-linux-LIBC + # elif defined(__sparc__) && defined(__arch64__) +- sparc64-linux-gnu ++ sparc64-linux-LIBC + # elif defined(__sparc__) +- sparc-linux-gnu ++ sparc-linux-LIBC + # elif defined(__riscv) + # if __riscv_xlen == 32 +- riscv32-linux-gnu ++ riscv32-linux-LIBC + # elif __riscv_xlen == 64 +- riscv64-linux-gnu ++ riscv64-linux-LIBC + # else + # error unknown platform triplet + # endif +@@ -1102,12 +1169,7 @@ cat > conftest.c <conftest.out 2>/dev/null; then +- PLATFORM_TRIPLET=`grep -v '^#' conftest.out | grep -v '^ *$' | tr -d ' '` +- case "$build_os" in +- linux-musl*) +- PLATFORM_TRIPLET=`echo "$PLATFORM_TRIPLET" | sed 's/linux-gnu/linux-musl/'` +- ;; +- esac ++ PLATFORM_TRIPLET=`grep -v '^#' conftest.out | grep -v '^ *$' | grep -v typedef | tr -d ' '` + AC_MSG_RESULT([$PLATFORM_TRIPLET]) + else + AC_MSG_RESULT([none]) diff --git a/pkgs/by-name/py/python/cpython/virtualenv-permissions.patch b/pkgs/by-name/py/python/cpython/virtualenv-permissions.patch new file mode 100644 index 0000000..c686f21 --- /dev/null +++ b/pkgs/by-name/py/python/cpython/virtualenv-permissions.patch @@ -0,0 +1,13 @@ +diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py +index caa7285..ad666ac 100644 +--- a/Lib/venv/__init__.py ++++ b/Lib/venv/__init__.py +@@ -379,7 +379,7 @@ class EnvBuilder: + if data is not None: + with open(dstfile, 'wb') as f: + f.write(data) +- shutil.copymode(srcfile, dstfile) ++ os.chmod(dstfile, 0o644) + + + def create(env_dir, system_site_packages=False, clear=False, diff --git a/pkgs/by-name/py/python/default.nix b/pkgs/by-name/py/python/default.nix new file mode 100644 index 0000000..4cc3f6f --- /dev/null +++ b/pkgs/by-name/py/python/default.nix @@ -0,0 +1,213 @@ +{ __splicedPackages +, callPackage +, config +, darwin +, db +, lib +, libffiBoot +, makeScopeWithSplicing' +, pythonPackagesExtensions +, stdenv +}@args: + +(let + + # Common passthru for all Python interpreters. + passthruFun = import ./passthrufun.nix args; + + sources = { + python311 = { + sourceVersion = { + major = "3"; + minor = "11"; + patch = "9"; + suffix = ""; + }; + hash = "sha256-mx6JZSP8UQaREmyGRAbZNgo9Hphqy9pZzaV7Wr2kW4c="; + }; + }; + +in { + + python27 = callPackage ./cpython/2.7 { + self = __splicedPackages.python27; + sourceVersion = { + major = "2"; + minor = "7"; + patch = "18"; + suffix = ".8"; # ActiveState's Python 2 extended support + }; + hash = "sha256-HUOzu3uJbtd+3GbmGD35KOk/CDlwL4S7hi9jJGRFiqI="; + inherit (darwin) configd; + inherit passthruFun; + }; + + python39 = callPackage ./cpython { + self = __splicedPackages.python39; + sourceVersion = { + major = "3"; + minor = "9"; + patch = "19"; + suffix = ""; + }; + hash = "sha256-1Iks0WGPZFjLhRIIwDDfFIJ3lgnQ85OZkb04GE+MZ54="; + inherit (darwin) configd; + inherit passthruFun; + }; + + python310 = callPackage ./cpython { + self = __splicedPackages.python310; + sourceVersion = { + major = "3"; + minor = "10"; + patch = "14"; + suffix = ""; + }; + hash = "sha256-nFBIH6qMKDIym6D8iGjQpgamgPxPYOxI0mzo4HZ1H9o="; + inherit (darwin) configd; + inherit passthruFun; + }; + + python311 = callPackage ./cpython ({ + self = __splicedPackages.python311; + inherit (darwin) configd; + inherit passthruFun; + } // sources.python311); + + python312 = callPackage ./cpython { + self = __splicedPackages.python312; + sourceVersion = { + major = "3"; + minor = "12"; + patch = "3"; + suffix = ""; + }; + hash = "sha256-Vr/vH9/BIhzmcg5DpmHj60F4XdkUzplpjYx4lq9L2qE="; + inherit (darwin) configd; + inherit passthruFun; + }; + + python313 = callPackage ./cpython { + self = __splicedPackages.python313; + sourceVersion = { + major = "3"; + minor = "13"; + patch = "0"; + suffix = "a6"; + }; + hash = "sha256-S+85PXKygaz4HTnXRV8AA26GYZPfohpO05cP0PTLoEg="; + inherit (darwin) configd; + inherit passthruFun; + }; + # Minimal versions of Python (built without optional dependencies) + python3Minimal = (callPackage ./cpython ({ + self = __splicedPackages.python3Minimal; + inherit passthruFun; + pythonAttr = "python3Minimal"; + # strip down that python version as much as possible + openssl = null; + readline = null; + ncurses = null; + gdbm = null; + configd = null; + sqlite = null; + tzdata = null; + libffi = libffiBoot; # without test suite + stripConfig = true; + stripIdlelib = true; + stripTests = true; + stripTkinter = true; + rebuildBytecode = false; + stripBytecode = true; + includeSiteCustomize = false; + enableOptimizations = false; + enableLTO = false; + mimetypesSupport = false; + } // sources.python311)).overrideAttrs(old: { + # TODO(@Artturin): Add this to the main cpython expr + strictDeps = true; + pname = "python3-minimal"; + }); + + pypy27 = callPackage ./pypy { + self = __splicedPackages.pypy27; + sourceVersion = { + major = "7"; + minor = "3"; + patch = "12"; + }; + + hash = "sha256-3WHYjaJ0ws4s7HdmfUo9+aZSvMUOJvkJkdTdCvZrzPQ="; + pythonVersion = "2.7"; + db = db.override { dbmSupport = !stdenv.isDarwin; }; + python = __splicedPackages.pythonInterpreters.pypy27_prebuilt; + inherit passthruFun; + inherit (darwin) libunwind; + inherit (darwin.apple_sdk.frameworks) Security; + }; + + pypy39 = callPackage ./pypy { + self = __splicedPackages.pypy39; + sourceVersion = { + major = "7"; + minor = "3"; + patch = "12"; + }; + + hash = "sha256-56IEbH5sJfw4aru1Ey6Sp8wkkeOTVpmpRstdy7NCwqo="; + pythonVersion = "3.9"; + db = db.override { dbmSupport = !stdenv.isDarwin; }; + python = __splicedPackages.pypy27; + inherit passthruFun; + inherit (darwin) libunwind; + inherit (darwin.apple_sdk.frameworks) Security; + }; + + pypy310 = __splicedPackages.pypy39.override { + self = __splicedPackages.pythonInterpreters.pypy310; + pythonVersion = "3.10"; + hash = "sha256-huTk6sw2BGxhgvQwGHllN/4zpg4dKizGuOf5Gl3LPkI="; + }; + + pypy27_prebuilt = callPackage ./pypy/prebuilt_2_7.nix { + # Not included at top-level + self = __splicedPackages.pythonInterpreters.pypy27_prebuilt; + sourceVersion = { + major = "7"; + minor = "3"; + patch = "12"; + }; + + hash = { + aarch64-linux = "sha256-4E3LYoantHJOw/DlDTzBuoWDMB3RZYwG1/N1meQgHFk="; + x86_64-linux = "sha256-GmGiV0t5Rm9gYBDymZormVvZbNCF+Rp46909XCxA6B0="; + aarch64-darwin = "sha256-a3R6oHauhZfklgPF3sTKWTWhoKEy10BKVZvpaiYNm/c="; + x86_64-darwin = "sha256-bon/3RVTfOT/zjFFtl7lfC6clSiSvZW5NAEtLwCfUDs="; + }.${stdenv.system}; + pythonVersion = "2.7"; + inherit passthruFun; + }; + + pypy39_prebuilt = callPackage ./pypy/prebuilt.nix { + # Not included at top-level + self = __splicedPackages.pythonInterpreters.pypy39_prebuilt; + sourceVersion = { + major = "7"; + minor = "3"; + patch = "12"; + }; + hash = { + aarch64-linux = "sha256-6TJ/ue2vKtkZNdW4Vj7F/yQZO92xdcGsqvdywCWvGCQ="; + x86_64-linux = "sha256-hMiblm+rK1j0UaSC7jDKf+wzUENb0LlhRhXGHcbaI5A="; + aarch64-darwin = "sha256-DooaNGi5eQxzSsaY9bAMwD/BaJnMxs6HZGX6wLg5gOM="; + x86_64-darwin = "sha256-ZPAI/6BwxAfl70bIJWsuAU3nGW6l2Fg4WGElTnlZ9Os="; + }.${stdenv.system}; + pythonVersion = "3.9"; + inherit passthruFun; + }; + + rustpython = darwin.apple_sdk_11_0.callPackage ./rustpython/default.nix { + inherit (darwin.apple_sdk_11_0.frameworks) SystemConfiguration; + }; + +}) diff --git a/pkgs/by-name/py/python/hooks/conda-install-hook.sh b/pkgs/by-name/py/python/hooks/conda-install-hook.sh new file mode 100644 index 0000000..af9ed60 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/conda-install-hook.sh @@ -0,0 +1,27 @@ +# Setup hook to use in case a conda binary package is installed +echo "Sourcing conda install hook" + +condaInstallPhase(){ + echo "Executing condaInstallPhase" + runHook preInstall + + # There are two different formats of conda packages. + # It either contains only a site-packages directory + # or multiple top level directories. + siteDir=@pythonSitePackages@ + if [ -e ./site-packages ]; then + mkdir -p $out/$siteDir + cp -r ./site-packages/* $out/$siteDir + else + cp -r . $out + rm $out/env-vars + fi + + runHook postInstall + echo "Finished executing condaInstallPhase" +} + +if [ -z "${installPhase-}" ]; then + echo "Using condaInstallPhase" + installPhase=condaInstallPhase +fi diff --git a/pkgs/by-name/py/python/hooks/conda-unpack-hook.sh b/pkgs/by-name/py/python/hooks/conda-unpack-hook.sh new file mode 100644 index 0000000..6204c13 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/conda-unpack-hook.sh @@ -0,0 +1,18 @@ +# Setup hook to use in case a conda binary package is fetched +echo "Sourcing conda unpack hook" + +condaUnpackPhase(){ + echo "Executing condaUnpackPhase" + runHook preUnpack + + # use lbzip2 for parallel decompression (bz2 is slow) + lbzip2 -dc -n $NIX_BUILD_CORES $src | tar --exclude='info' -x + + # runHook postUnpack # Calls find...? + echo "Finished executing condaUnpackPhase" +} + +if [ -z "${unpackPhase-}" ]; then + echo "Using condaUnpackPhase" + unpackPhase=condaUnpackPhase +fi diff --git a/pkgs/by-name/py/python/hooks/default.nix b/pkgs/by-name/py/python/hooks/default.nix new file mode 100644 index 0000000..c61cd77 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/default.nix @@ -0,0 +1,259 @@ +self: dontUse: with self; + +let + inherit (python) pythonOnBuildForHost; + inherit (pkgs) runCommand; + pythonInterpreter = pythonOnBuildForHost.interpreter; + pythonSitePackages = python.sitePackages; + pythonCheckInterpreter = python.interpreter; + setuppy = ../run_setup.py; +in { + makePythonHook = let + defaultArgs = { passthru.provides.setupHook = true; }; + in args: pkgs.makeSetupHook (lib.recursiveUpdate defaultArgs args); + + condaInstallHook = callPackage ({ makePythonHook, gnutar, lbzip2 }: + makePythonHook { + name = "conda-install-hook"; + propagatedBuildInputs = [ gnutar lbzip2 ]; + substitutions = { + inherit pythonSitePackages; + }; + } ./conda-install-hook.sh) {}; + + condaUnpackHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "conda-unpack-hook"; + propagatedBuildInputs = []; + } ./conda-unpack-hook.sh) {}; + + eggBuildHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "egg-build-hook.sh"; + propagatedBuildInputs = [ ]; + } ./egg-build-hook.sh) {}; + + eggInstallHook = callPackage ({ makePythonHook, setuptools }: + makePythonHook { + name = "egg-install-hook.sh"; + propagatedBuildInputs = [ setuptools ]; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + }; + } ./egg-install-hook.sh) {}; + + eggUnpackHook = callPackage ({ makePythonHook, }: + makePythonHook { + name = "egg-unpack-hook.sh"; + propagatedBuildInputs = [ ]; + } ./egg-unpack-hook.sh) {}; + + pipBuildHook = callPackage ({ makePythonHook, pip, wheel }: + makePythonHook { + name = "pip-build-hook.sh"; + propagatedBuildInputs = [ pip wheel ]; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + }; + } ./pip-build-hook.sh) {}; + + pypaBuildHook = callPackage ({ makePythonHook, build, wheel }: + makePythonHook { + name = "pypa-build-hook.sh"; + propagatedBuildInputs = [ wheel ]; + substitutions = { + inherit build; + }; + # A test to ensure that this hook never propagates any of its dependencies + # into the build environment. + # This prevents false positive alerts raised by catchConflictsHook. + # Such conflicts don't happen within the standard nixpkgs python package + # set, but in downstream projects that build packages depending on other + # versions of this hook's dependencies. + passthru.tests = callPackage ./pypa-build-hook-test.nix { + inherit pythonOnBuildForHost; + }; + } ./pypa-build-hook.sh) { + inherit (pythonOnBuildForHost.pkgs) build; + }; + + pipInstallHook = callPackage ({ makePythonHook, pip }: + makePythonHook { + name = "pip-install-hook"; + propagatedBuildInputs = [ pip ]; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + }; + } ./pip-install-hook.sh) {}; + + pypaInstallHook = callPackage ({ makePythonHook, installer }: + makePythonHook { + name = "pypa-install-hook"; + propagatedBuildInputs = [ installer ]; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + }; + } ./pypa-install-hook.sh) { + inherit (pythonOnBuildForHost.pkgs) installer; + }; + + pytestCheckHook = callPackage ({ makePythonHook, pytest }: + makePythonHook { + name = "pytest-check-hook"; + propagatedBuildInputs = [ pytest ]; + substitutions = { + inherit pythonCheckInterpreter; + }; + } ./pytest-check-hook.sh) {}; + + pythonCatchConflictsHook = callPackage ({ makePythonHook, setuptools }: + makePythonHook { + name = "python-catch-conflicts-hook"; + substitutions = let + useLegacyHook = lib.versionOlder python.pythonVersion "3"; + in { + inherit pythonInterpreter pythonSitePackages; + catchConflicts = if useLegacyHook then + ../catch_conflicts/catch_conflicts_py2.py + else + ../catch_conflicts/catch_conflicts.py; + } // lib.optionalAttrs useLegacyHook { + inherit setuptools; + }; + passthru.tests = import ./python-catch-conflicts-hook-tests.nix { + inherit pythonOnBuildForHost runCommand; + inherit (pkgs) coreutils gnugrep writeShellScript; + }; + } ./python-catch-conflicts-hook.sh) {}; + + pythonImportsCheckHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "python-imports-check-hook.sh"; + substitutions = { + inherit pythonCheckInterpreter pythonSitePackages; + }; + } ./python-imports-check-hook.sh) {}; + + pythonNamespacesHook = callPackage ({ makePythonHook, buildPackages }: + makePythonHook { + name = "python-namespaces-hook.sh"; + substitutions = { + inherit pythonSitePackages; + inherit (buildPackages) findutils; + }; + } ./python-namespaces-hook.sh) {}; + + pythonOutputDistHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "python-output-dist-hook"; + } ./python-output-dist-hook.sh ) {}; + + pythonRecompileBytecodeHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "python-recompile-bytecode-hook"; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + compileArgs = lib.concatStringsSep " " (["-q" "-f" "-i -"] ++ lib.optionals isPy3k ["-j $NIX_BUILD_CORES"]); + bytecodeName = if isPy3k then "__pycache__" else "*.pyc"; + }; + } ./python-recompile-bytecode-hook.sh ) {}; + + pythonRelaxDepsHook = callPackage ({ makePythonHook, wheel }: + makePythonHook { + name = "python-relax-deps-hook"; + substitutions = { + inherit pythonInterpreter pythonSitePackages wheel; + }; + } ./python-relax-deps-hook.sh) {}; + + pythonRemoveBinBytecodeHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "python-remove-bin-bytecode-hook"; + } ./python-remove-bin-bytecode-hook.sh) {}; + + pythonRemoveTestsDirHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "python-remove-tests-dir-hook"; + substitutions = { + inherit pythonSitePackages; + }; + } ./python-remove-tests-dir-hook.sh) {}; + + pythonRuntimeDepsCheckHook = callPackage ({ makePythonHook, packaging }: + makePythonHook { + name = "python-runtime-deps-check-hook.sh"; + propagatedBuildInputs = [ packaging ]; + substitutions = { + inherit pythonInterpreter pythonSitePackages; + hook = ./python-runtime-deps-check-hook.py; + }; + } ./python-runtime-deps-check-hook.sh) {}; + + setuptoolsBuildHook = callPackage ({ makePythonHook, setuptools, wheel }: + makePythonHook { + name = "setuptools-build-hook"; + propagatedBuildInputs = [ setuptools wheel ]; + substitutions = { + inherit pythonInterpreter setuppy; + # python2.pkgs.setuptools does not support parallelism + setuptools_has_parallel = setuptools != null && lib.versionAtLeast setuptools.version "69"; + }; + } ./setuptools-build-hook.sh) {}; + + setuptoolsCheckHook = callPackage ({ makePythonHook, setuptools }: + makePythonHook { + name = "setuptools-check-hook"; + propagatedBuildInputs = [ setuptools ]; + substitutions = { + inherit pythonCheckInterpreter setuppy; + }; + } ./setuptools-check-hook.sh) {}; + + setuptoolsRustBuildHook = callPackage ({ makePythonHook, setuptools-rust }: + makePythonHook { + name = "setuptools-rust-setup-hook"; + propagatedBuildInputs = [ setuptools-rust ]; + substitutions = { + pyLibDir = "${python}/lib/${python.libPrefix}"; + cargoBuildTarget = stdenv.hostPlatform.rust.rustcTargetSpec; + cargoLinkerVar = stdenv.hostPlatform.rust.cargoEnvVarTarget; + targetLinker = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"; + }; + } ./setuptools-rust-hook.sh) {}; + + unittestCheckHook = callPackage ({ makePythonHook }: + makePythonHook { + name = "unittest-check-hook"; + substitutions = { + inherit pythonCheckInterpreter; + }; + } ./unittest-check-hook.sh) {}; + + venvShellHook = disabledIf (!isPy3k) (callPackage ({ makePythonHook, ensureNewerSourcesForZipFilesHook }: + makePythonHook { + name = "venv-shell-hook"; + propagatedBuildInputs = [ ensureNewerSourcesForZipFilesHook ]; + substitutions = { + inherit pythonInterpreter; + }; + } ./venv-shell-hook.sh) {}); + + wheelUnpackHook = callPackage ({ makePythonHook, wheel }: + makePythonHook { + name = "wheel-unpack-hook.sh"; + propagatedBuildInputs = [ wheel ]; + } ./wheel-unpack-hook.sh) {}; + + wrapPython = callPackage ../wrap-python.nix { + inherit (pkgs.buildPackages) makeWrapper; + }; + + sphinxHook = callPackage ({ makePythonHook, installShellFiles }: + makePythonHook { + name = "python${python.pythonVersion}-sphinx-hook"; + propagatedBuildInputs = [ pythonOnBuildForHost.pkgs.sphinx installShellFiles ]; + substitutions = { + sphinxBuild = "${pythonOnBuildForHost.pkgs.sphinx}/bin/sphinx-build"; + }; + } ./sphinx-hook.sh) {}; +} diff --git a/pkgs/by-name/py/python/hooks/egg-build-hook.sh b/pkgs/by-name/py/python/hooks/egg-build-hook.sh new file mode 100644 index 0000000..d5abc8d --- /dev/null +++ b/pkgs/by-name/py/python/hooks/egg-build-hook.sh @@ -0,0 +1,15 @@ +# Setup hook to use for eggs +echo "Sourcing egg-build-hook" + +eggBuildPhase() { + echo "Executing eggBuildPhase" + runHook preBuild + + runHook postBuild + echo "Finished executing eggBuildPhase" +} + +if [ -z "${dontUseEggBuild-}" ] && [ -z "${buildPhase-}" ]; then + echo "Using eggBuildPhase" + buildPhase=eggBuildPhase +fi diff --git a/pkgs/by-name/py/python/hooks/egg-install-hook.sh b/pkgs/by-name/py/python/hooks/egg-install-hook.sh new file mode 100644 index 0000000..ae894fb --- /dev/null +++ b/pkgs/by-name/py/python/hooks/egg-install-hook.sh @@ -0,0 +1,21 @@ +# Setup hook for eggs +echo "Sourcing egg-install-hook" + +eggInstallPhase() { + echo "Executing eggInstallPhase" + runHook preInstall + + mkdir -p "$out/@pythonSitePackages@" + export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH" + + find + @pythonInterpreter@ -m easy_install --prefix="$out" *.egg + + runHook postInstall + echo "Finished executing eggInstallPhase" +} + +if [ -z "${dontUseEggInstall-}" ] && [ -z "${installPhase-}" ]; then + echo "Using eggInstallPhase" + installPhase=eggInstallPhase +fi diff --git a/pkgs/by-name/py/python/hooks/egg-unpack-hook.sh b/pkgs/by-name/py/python/hooks/egg-unpack-hook.sh new file mode 100644 index 0000000..c8ed3de --- /dev/null +++ b/pkgs/by-name/py/python/hooks/egg-unpack-hook.sh @@ -0,0 +1,17 @@ +# Setup hook to use in case an egg is fetched +echo "Sourcing egg setup hook" + +eggUnpackPhase(){ + echo "Executing eggUnpackPhase" + runHook preUnpack + + cp "$src" "$(stripHash "$src")" + +# runHook postUnpack # Calls find...? + echo "Finished executing eggUnpackPhase" +} + +if [ -z "${dontUseEggUnpack-}" ] && [ -z "${unpackPhase-}" ]; then + echo "Using eggUnpackPhase" + unpackPhase=eggUnpackPhase +fi diff --git a/pkgs/by-name/py/python/hooks/pip-build-hook.sh b/pkgs/by-name/py/python/hooks/pip-build-hook.sh new file mode 100644 index 0000000..9de4c7d --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pip-build-hook.sh @@ -0,0 +1,52 @@ +# Setup hook to use for pip projects +echo "Sourcing pip-build-hook" + +declare -a pipBuildFlags + +pipBuildPhase() { + echo "Executing pipBuildPhase" + runHook preBuild + + mkdir -p dist + echo "Creating a wheel..." + @pythonInterpreter@ -m pip wheel \ + --verbose \ + --no-index \ + --no-deps \ + --no-clean \ + --no-build-isolation \ + --wheel-dir dist \ + $pipBuildFlags . + echo "Finished creating a wheel..." + + runHook postBuild + echo "Finished executing pipBuildPhase" +} + +pipShellHook() { + echo "Executing pipShellHook" + runHook preShellHook + + # Long-term setup.py should be dropped. + if [ -e pyproject.toml ]; then + tmp_path=$(mktemp -d) + export PATH="$tmp_path/bin:$PATH" + export PYTHONPATH="$tmp_path/@pythonSitePackages@:$PYTHONPATH" + mkdir -p "$tmp_path/@pythonSitePackages@" + @pythonInterpreter@ -m pip install -e . --prefix "$tmp_path" \ + --no-build-isolation >&2 + fi + + runHook postShellHook + echo "Finished executing pipShellHook" +} + +if [ -z "${dontUsePipBuild-}" ] && [ -z "${buildPhase-}" ]; then + echo "Using pipBuildPhase" + buildPhase=pipBuildPhase +fi + +if [ -z "${shellHook-}" ]; then + echo "Using pipShellHook" + shellHook=pipShellHook +fi diff --git a/pkgs/by-name/py/python/hooks/pip-install-hook.sh b/pkgs/by-name/py/python/hooks/pip-install-hook.sh new file mode 100644 index 0000000..a4f08b8 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pip-install-hook.sh @@ -0,0 +1,24 @@ +# Setup hook for pip. +echo "Sourcing pip-install-hook" + +declare -a pipInstallFlags + +pipInstallPhase() { + echo "Executing pipInstallPhase" + runHook preInstall + + mkdir -p "$out/@pythonSitePackages@" + export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH" + + pushd dist || return 1 + @pythonInterpreter@ -m pip install ./*.whl --no-index --no-warn-script-location --prefix="$out" --no-cache $pipInstallFlags + popd || return 1 + + runHook postInstall + echo "Finished executing pipInstallPhase" +} + +if [ -z "${dontUsePipInstall-}" ] && [ -z "${installPhase-}" ]; then + echo "Using pipInstallPhase" + installPhase=pipInstallPhase +fi diff --git a/pkgs/by-name/py/python/hooks/pypa-build-hook-test.nix b/pkgs/by-name/py/python/hooks/pypa-build-hook-test.nix new file mode 100644 index 0000000..4153c21 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pypa-build-hook-test.nix @@ -0,0 +1,32 @@ +{ pythonOnBuildForHost, runCommand }: { + dont-propagate-conflicting-deps = let + # customize a package so that its store paths differs + mkConflict = pkg: pkg.overrideAttrs { some_modification = true; }; + # minimal pyproject.toml for the example project + pyprojectToml = builtins.toFile "pyproject.toml" '' + [project] + name = "my-project" + version = "1.0.0" + ''; + # the source of the example project + projectSource = runCommand "my-project-source" {} '' + mkdir -p $out/src + cp ${pyprojectToml} $out/pyproject.toml + touch $out/src/__init__.py + ''; + in + # this build must never triger conflicts + pythonOnBuildForHost.pkgs.buildPythonPackage { + pname = "dont-propagate-conflicting-deps"; + version = "0.0.0"; + src = projectSource; + format = "pyproject"; + propagatedBuildInputs = [ + # At least one dependency of `build` should be included here to + # keep the test meaningful + (mkConflict pythonOnBuildForHost.pkgs.tomli) + # setuptools is also needed to build the example project + pythonOnBuildForHost.pkgs.setuptools + ]; + }; +} diff --git a/pkgs/by-name/py/python/hooks/pypa-build-hook.sh b/pkgs/by-name/py/python/hooks/pypa-build-hook.sh new file mode 100644 index 0000000..dd49d93 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pypa-build-hook.sh @@ -0,0 +1,19 @@ +# Setup hook to use for pypa/build projects +echo "Sourcing pypa-build-hook" + +pypaBuildPhase() { + echo "Executing pypaBuildPhase" + runHook preBuild + + echo "Creating a wheel..." + @build@/bin/pyproject-build --no-isolation --outdir dist/ --wheel $pypaBuildFlags + echo "Finished creating a wheel..." + + runHook postBuild + echo "Finished executing pypaBuildPhase" +} + +if [ -z "${dontUsePypaBuild-}" ] && [ -z "${buildPhase-}" ]; then + echo "Using pypaBuildPhase" + buildPhase=pypaBuildPhase +fi diff --git a/pkgs/by-name/py/python/hooks/pypa-install-hook.sh b/pkgs/by-name/py/python/hooks/pypa-install-hook.sh new file mode 100644 index 0000000..2d92574 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pypa-install-hook.sh @@ -0,0 +1,26 @@ +# Setup hook for PyPA installer. +echo "Sourcing pypa-install-hook" + +pypaInstallPhase() { + echo "Executing pypaInstallPhase" + runHook preInstall + + pushd dist > /dev/null + + for wheel in *.whl; do + @pythonInterpreter@ -m installer --prefix "$out" "$wheel" + echo "Successfully installed $wheel" + done + + popd > /dev/null + + export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH" + + runHook postInstall + echo "Finished executing pypaInstallPhase" +} + +if [ -z "${dontUsePypaInstall-}" ] && [ -z "${installPhase-}" ]; then + echo "Using pypaInstallPhase" + installPhase=pypaInstallPhase +fi diff --git a/pkgs/by-name/py/python/hooks/pytest-check-hook.sh b/pkgs/by-name/py/python/hooks/pytest-check-hook.sh new file mode 100644 index 0000000..0f708f8 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/pytest-check-hook.sh @@ -0,0 +1,74 @@ +# Setup hook for pytest +echo "Sourcing pytest-check-hook" + +declare -ar disabledTests +declare -a disabledTestPaths + +function _concatSep { + local result + local sep="$1" + local -n arr=$2 + for index in ${!arr[*]}; do + if [ $index -eq 0 ]; then + result="${arr[index]}" + else + result+=" $sep ${arr[index]}" + fi + done + echo "$result" +} + +function _pytestComputeDisabledTestsString () { + declare -a tests + local tests=($1) + local prefix="not " + prefixed=( "${tests[@]/#/$prefix}" ) + result=$(_concatSep "and" prefixed) + echo "$result" +} + +function pytestCheckPhase() { + echo "Executing pytestCheckPhase" + runHook preCheck + + # Compose arguments + args=" -m pytest" + if [ -n "$disabledTests" ]; then + disabledTestsString=$(_pytestComputeDisabledTestsString "${disabledTests[@]}") + args+=" -k \""$disabledTestsString"\"" + fi + + if [ -n "${disabledTestPaths-}" ]; then + eval "disabledTestPaths=($disabledTestPaths)" + fi + + for path in ${disabledTestPaths[@]}; do + if [ ! -e "$path" ]; then + echo "Disabled tests path \"$path\" does not exist. Aborting" + exit 1 + fi + args+=" --ignore=\"$path\"" + done + args+=" ${pytestFlagsArray[@]}" + eval "@pythonCheckInterpreter@ $args" + + runHook postCheck + echo "Finished executing pytestCheckPhase" +} + +if [ -z "${dontUsePytestCheck-}" ] && [ -z "${installCheckPhase-}" ]; then + echo "Using pytestCheckPhase" + preDistPhases+=" pytestCheckPhase" + + # It's almost always the case that setuptoolsCheckPhase should not be ran + # when the pytestCheckHook is being ran + if [ -z "${useSetuptoolsCheck-}" ]; then + dontUseSetuptoolsCheck=1 + + # Remove command if already injected into preDistPhases + if [[ "$preDistPhases" =~ "setuptoolsCheckPhase" ]]; then + echo "Removing setuptoolsCheckPhase" + preDistPhases=${preDistPhases/setuptoolsCheckPhase/} + fi + fi +fi diff --git a/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook-tests.nix b/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook-tests.nix new file mode 100644 index 0000000..cba1034 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook-tests.nix @@ -0,0 +1,146 @@ +{ pythonOnBuildForHost, runCommand, writeShellScript, coreutils, gnugrep }: let + + pythonPkgs = pythonOnBuildForHost.pkgs; + + ### UTILITIES + + # customize a package so that its store paths differs + customize = pkg: pkg.overrideAttrs { some_modification = true; }; + + # generates minimal pyproject.toml + pyprojectToml = pname: builtins.toFile "pyproject.toml" '' + [project] + name = "${pname}" + version = "1.0.0" + ''; + + # generates source for a python project + projectSource = pname: runCommand "my-project-source" {} '' + mkdir -p $out/src + cp ${pyprojectToml pname} $out/pyproject.toml + touch $out/src/__init__.py + ''; + + # helper to reduce boilerplate + generatePythonPackage = args: pythonPkgs.buildPythonPackage ( + { + version = "1.0.0"; + src = runCommand "my-project-source" {} '' + mkdir -p $out/src + cp ${pyprojectToml args.pname} $out/pyproject.toml + touch $out/src/__init__.py + ''; + pyproject = true; + catchConflicts = true; + buildInputs = [ pythonPkgs.setuptools ]; + } + // args + ); + + # in order to test for a failing build, wrap it in a shell script + expectFailure = build: errorMsg: build.overrideDerivation (old: { + builder = writeShellScript "test-for-failure" '' + export PATH=${coreutils}/bin:${gnugrep}/bin:$PATH + ${old.builder} "$@" > ./log 2>&1 + status=$? + cat ./log + if [ $status -eq 0 ] || ! grep -q "${errorMsg}" ./log; then + echo "The build should have failed with '${errorMsg}', but it didn't" + exit 1 + else + echo "The build failed as expected with: ${errorMsg}" + mkdir -p $out + fi + ''; + }); +in { + + ### TEST CASES + + # Test case which must not trigger any conflicts. + # This derivation has runtime dependencies on custom versions of multiple build tools. + # This scenario is relevant for lang2nix tools which do not override the nixpkgs fix-point. + # see https://github.com/NixOS/nixpkgs/issues/283695 + ignores-build-time-deps = + generatePythonPackage { + pname = "ignores-build-time-deps"; + buildInputs = [ + pythonPkgs.build + pythonPkgs.packaging + pythonPkgs.setuptools + pythonPkgs.wheel + ]; + propagatedBuildInputs = [ + # Add customized versions of build tools as runtime deps + (customize pythonPkgs.packaging) + (customize pythonPkgs.setuptools) + (customize pythonPkgs.wheel) + ]; + }; + + # multi-output derivation with dependency on itself must not crash + cyclic-dependencies = + generatePythonPackage { + pname = "cyclic-dependencies"; + preFixup = '' + propagatedBuildInputs+=("$out") + ''; + }; + + # Simplest test case that should trigger a conflict + catches-simple-conflict = let + # this build must fail due to conflicts + package = pythonPkgs.buildPythonPackage rec { + pname = "catches-simple-conflict"; + version = "0.0.0"; + src = projectSource pname; + pyproject = true; + catchConflicts = true; + buildInputs = [ + pythonPkgs.setuptools + ]; + # depend on two different versions of packaging + # (an actual runtime dependency conflict) + propagatedBuildInputs = [ + pythonPkgs.packaging + (customize pythonPkgs.packaging) + ]; + }; + in + expectFailure package "Found duplicated packages in closure for dependency 'packaging'"; + + + /* + More complex test case with a transitive conflict + + Test sets up this dependency tree: + + toplevel + ├── dep1 + │ └── leaf + └── dep2 + └── leaf (customized version -> conflicting) + */ + catches-transitive-conflict = let + # package depending on both dependency1 and dependency2 + toplevel = generatePythonPackage { + pname = "catches-transitive-conflict"; + propagatedBuildInputs = [ dep1 dep2 ]; + }; + # dep1 package depending on leaf + dep1 = generatePythonPackage { + pname = "dependency1"; + propagatedBuildInputs = [ leaf ]; + }; + # dep2 package depending on conflicting version of leaf + dep2 = generatePythonPackage { + pname = "dependency2"; + propagatedBuildInputs = [ (customize leaf) ]; + }; + # some leaf package + leaf = generatePythonPackage { + pname = "leaf"; + }; + in + expectFailure toplevel "Found duplicated packages in closure for dependency 'leaf'"; +} diff --git a/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook.sh b/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook.sh new file mode 100644 index 0000000..0abcad3 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-catch-conflicts-hook.sh @@ -0,0 +1,10 @@ +# Setup hook for detecting conflicts in Python packages +echo "Sourcing python-catch-conflicts-hook.sh" + +pythonCatchConflictsPhase() { + PYTHONPATH="@setuptools@/@pythonSitePackages@:$PYTHONPATH" @pythonInterpreter@ @catchConflicts@ +} + +if [ -z "${dontUsePythonCatchConflicts-}" ]; then + preDistPhases+=" pythonCatchConflictsPhase" +fi diff --git a/pkgs/by-name/py/python/hooks/python-imports-check-hook.sh b/pkgs/by-name/py/python/hooks/python-imports-check-hook.sh new file mode 100644 index 0000000..7172ac4 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-imports-check-hook.sh @@ -0,0 +1,17 @@ +# Setup hook for checking whether Python imports succeed +echo "Sourcing python-imports-check-hook.sh" + +pythonImportsCheckPhase () { + echo "Executing pythonImportsCheckPhase" + + if [ -n "$pythonImportsCheck" ]; then + echo "Check whether the following modules can be imported: $pythonImportsCheck" + export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH" + ( cd $out && eval "@pythonCheckInterpreter@ -c 'import os; import importlib; list(map(lambda mod: importlib.import_module(mod), os.environ[\"pythonImportsCheck\"].split()))'" ) + fi +} + +if [ -z "${dontUsePythonImportsCheck-}" ]; then + echo "Using pythonImportsCheckPhase" + preDistPhases+=" pythonImportsCheckPhase" +fi diff --git a/pkgs/by-name/py/python/hooks/python-namespaces-hook.sh b/pkgs/by-name/py/python/hooks/python-namespaces-hook.sh new file mode 100644 index 0000000..37479d9 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-namespaces-hook.sh @@ -0,0 +1,52 @@ +# Clean up __init__.py's found in namespace directories +echo "Sourcing python-namespaces-hook" + +pythonNamespacesHook() { + echo "Executing pythonNamespacesHook" + + for namespace in ${pythonNamespaces[@]}; do + echo "Enforcing PEP420 namespace: ${namespace}" + + # split namespace into segments. "azure.mgmt" -> "azure mgmt" + IFS='.' read -ra pathSegments <<< $namespace + constructedPath=$out/@pythonSitePackages@ + + # Need to remove the __init__.py at each namespace level + # E.g `azure/__init__.py` and `azure/mgmt/__init__.py` + # The __pycache__ entry also needs to be removed + for pathSegment in ${pathSegments[@]}; do + constructedPath=${constructedPath}/${pathSegment} + pathToRemove=${constructedPath}/__init__.py + pycachePath=${constructedPath}/__pycache__/ + + # remove __init__.py + if [ -f "$pathToRemove" ]; then + rm -v "$pathToRemove" + fi + + # remove ${pname}-${version}-${python-interpeter}-nspkg.pth + # + # Still need to check that parent directory exists in the + # event of a "meta-package" package, which will just install + # other packages, but not produce anything in site-packages + # besides meta information + if [ -d "${constructedPath}/../" -a -z ${dontRemovePth-} ]; then + # .pth files are located in the parent directory of a module + @findutils@/bin/find ${constructedPath}/../ -name '*-nspkg.pth' -exec rm -v "{}" + + fi + + # remove __pycache__/ entry, can be interpreter specific. E.g. __init__.cpython-38.pyc + # use null characters to perserve potential whitespace in filepath + if [ -d "$pycachePath" ]; then + @findutils@/bin/find "$pycachePath" -name '__init__*' -exec rm -v "{}" + + fi + done + done + + echo "Finished executing pythonNamespacesHook" +} + +if [ -z "${dontUsePythonNamespacesHook-}" -a -n "${pythonNamespaces-}" ]; then + postFixupHooks+=(pythonNamespacesHook) +fi + diff --git a/pkgs/by-name/py/python/hooks/python-output-dist-hook.sh b/pkgs/by-name/py/python/hooks/python-output-dist-hook.sh new file mode 100644 index 0000000..83b79d0 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-output-dist-hook.sh @@ -0,0 +1,24 @@ +# Setup hook for storing dist folder (wheels/sdists) in a separate output +echo "Sourcing python-catch-conflicts-hook.sh" + +pythonOutputDistPhase() { + echo "Executing pythonOutputDistPhase" + if [[ -d dist ]]; then + mv "dist" "$dist" + else + cat >&2 <1,<=2 -> abc +# pythonRelaxDeps = [ "abc" ]; +# # This will relax all dependencies restrictions instead +# # pythonRelaxDeps = true; +# # This will remove the dependency +# # e.g.: cde>1,<=2 -> +# pythonRemoveDeps = [ "cde" ]; +# # This will remove all dependencies from the project +# # pythonRemoveDeps = true; +# … +# } +# +# IMPLEMENTATION NOTES: +# +# The "Requires-Dist" dependency specification format is described in PEP 508. +# Examples that the regular expressions in this hook needs to support: +# +# Requires-Dist: foo +# -> foo +# Requires-Dist: foo[optional] +# -> foo[optional] +# Requires-Dist: foo[optional]~=1.2.3 +# -> foo[optional] +# Requires-Dist: foo[optional, xyz] (~=1.2.3) +# -> foo[optional, xyz] +# Requires-Dist: foo[optional]~=1.2.3 ; os_name = "posix" +# -> foo[optional] ; os_name = "posix" +# +# Currently unsupported: URL specs (foo @ https://example.com/a.zip). + +_pythonRelaxDeps() { + local -r metadata_file="$1" + + if [[ -z "${pythonRelaxDeps:-}" ]] || [[ "$pythonRelaxDeps" == 0 ]]; then + return + elif [[ "$pythonRelaxDeps" == 1 ]]; then + sed -i "$metadata_file" -r \ + -e 's/(Requires-Dist: [a-zA-Z0-9_.-]+\s*(\[[^]]+\])?)[^;]*(;.*)?/\1\3/' + else + for dep in $pythonRelaxDeps; do + sed -i "$metadata_file" -r \ + -e "s/(Requires-Dist: $dep\s*(\[[^]]+\])?)[^;]*(;.*)?/\1\3/i" + done + fi +} + +_pythonRemoveDeps() { + local -r metadata_file="$1" + + if [[ -z "${pythonRemoveDeps:-}" ]] || [[ "$pythonRemoveDeps" == 0 ]]; then + return + elif [[ "$pythonRemoveDeps" == 1 ]]; then + sed -i "$metadata_file" \ + -e '/Requires-Dist:.*/d' + else + for dep in $pythonRemoveDeps; do + sed -i "$metadata_file" \ + -e "/Requires-Dist: $dep/d" + done + fi + +} + +pythonRelaxDepsHook() { + pushd dist + + local -r unpack_dir="unpacked" + local -r metadata_file="$unpack_dir/*/*.dist-info/METADATA" + + # We generally shouldn't have multiple wheel files, but let's be safer here + for wheel in *".whl"; do + + PYTHONPATH="@wheel@/@pythonSitePackages@:$PYTHONPATH" \ + @pythonInterpreter@ -m wheel unpack --dest "$unpack_dir" "$wheel" + rm -rf "$wheel" + + # Using no quotes on purpose since we need to expand the glob from `$metadata_file` + _pythonRelaxDeps $metadata_file + _pythonRemoveDeps $metadata_file + + if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "pythonRelaxDepsHook: resulting METADATA for '$wheel':" + cat $metadata_file + fi + + PYTHONPATH="@wheel@/@pythonSitePackages@:$PYTHONPATH" \ + @pythonInterpreter@ -m wheel pack "$unpack_dir/"* + done + + # Remove the folder since it will otherwise be in the dist output. + rm -rf "$unpack_dir" + + popd +} + +postBuild+=" pythonRelaxDepsHook" diff --git a/pkgs/by-name/py/python/hooks/python-remove-bin-bytecode-hook.sh b/pkgs/by-name/py/python/hooks/python-remove-bin-bytecode-hook.sh new file mode 100644 index 0000000..1180694 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-remove-bin-bytecode-hook.sh @@ -0,0 +1,17 @@ +# Setup hook for removing bytecode from the bin folder +echo "Sourcing python-remove-bin-bytecode-hook.sh" + +# The bin folder is added to $PATH and should only contain executables. +# It may happen there are executables with a .py extension for which +# bytecode is generated. This hook removes that bytecode. + +pythonRemoveBinBytecodePhase () { + if [ -d "$out/bin" ]; then + rm -rf "$out/bin/__pycache__" # Python 3 + find "$out/bin" -type f -name "*.pyc" -delete # Python 2 + fi +} + +if [ -z "${dontUsePythonRemoveBinBytecode-}" ]; then + preDistPhases+=" pythonRemoveBinBytecodePhase" +fi diff --git a/pkgs/by-name/py/python/hooks/python-remove-tests-dir-hook.sh b/pkgs/by-name/py/python/hooks/python-remove-tests-dir-hook.sh new file mode 100644 index 0000000..ad9e3c0 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-remove-tests-dir-hook.sh @@ -0,0 +1,15 @@ +# Clean up top-level tests directory in site-package installation. +echo "Sourcing python-remove-tests-dir-hook" + +pythonRemoveTestsDir() { + echo "Executing pythonRemoveTestsDir" + + rm -rf $out/@pythonSitePackages@/tests + rm -rf $out/@pythonSitePackages@/test + + echo "Finished executing pythonRemoveTestsDir" +} + +if [ -z "${dontUsePythonRemoveTestsDir-}" ]; then + postFixupHooks+=(pythonRemoveTestsDir) +fi diff --git a/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.py b/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.py new file mode 100644 index 0000000..36ce389 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +""" +The runtimeDependenciesHook validates, that all dependencies specified +in wheel metadata are available in the local environment. + +In case that does not hold, it will print missing dependencies and +violated version constraints. +""" + + +import importlib.metadata +import re +import sys +import tempfile +from argparse import ArgumentParser +from zipfile import ZipFile + +from packaging.metadata import Metadata, parse_email +from packaging.requirements import Requirement + +argparser = ArgumentParser() +argparser.add_argument("wheel", help="Path to the .whl file to test") + + +def error(msg: str) -> None: + print(f" - {msg}", file=sys.stderr) + + +def normalize_name(name: str) -> str: + """ + Normalize package names according to PEP503 + """ + return re.sub(r"[-_.]+", "-", name).lower() + + +def get_manifest_text_from_wheel(wheel: str) -> str: + """ + Given a path to a wheel, this function will try to extract the + METADATA file in the wheels .dist-info directory. + """ + with ZipFile(wheel) as zipfile: + for zipinfo in zipfile.infolist(): + if zipinfo.filename.endswith(".dist-info/METADATA"): + with tempfile.TemporaryDirectory() as tmp: + path = zipfile.extract(zipinfo, path=tmp) + with open(path, encoding="utf-8") as fd: + return fd.read() + + raise RuntimeError("No METADATA file found in wheel") + + +def get_metadata(wheel: str) -> Metadata: + """ + Given a path to a wheel, returns a parsed Metadata object. + """ + text = get_manifest_text_from_wheel(wheel) + raw, _ = parse_email(text) + metadata = Metadata.from_raw(raw) + + return metadata + + +def test_requirement(requirement: Requirement) -> bool: + """ + Given a requirement specification, tests whether the dependency can + be resolved in the local environment, and whether it satisfies the + specified version constraints. + """ + if requirement.marker and not requirement.marker.evaluate(): + # ignore requirements with incompatible markers + return True + + package_name = normalize_name(requirement.name) + + try: + package = importlib.metadata.distribution(requirement.name) + except importlib.metadata.PackageNotFoundError: + error(f"{package_name} not installed") + return False + + if requirement.specifier and package.version not in requirement.specifier: + error( + f"{package_name}{requirement.specifier} not satisfied by version {package.version}" + ) + return False + + return True + + +if __name__ == "__main__": + args = argparser.parse_args() + + metadata = get_metadata(args.wheel) + requirements = metadata.requires_dist + + if not requirements: + sys.exit(0) + + tests = [test_requirement(requirement) for requirement in requirements] + + if not all(tests): + sys.exit(1) diff --git a/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.sh b/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.sh new file mode 100644 index 0000000..43a2f9b --- /dev/null +++ b/pkgs/by-name/py/python/hooks/python-runtime-deps-check-hook.sh @@ -0,0 +1,20 @@ +# Setup hook for PyPA installer. +echo "Sourcing python-runtime-deps-check-hook" + +pythonRuntimeDepsCheckHook() { + echo "Executing pythonRuntimeDepsCheck" + + export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH" + + for wheel in dist/*.whl; do + echo "Checking runtime dependencies for $(basename $wheel)" + @pythonInterpreter@ @hook@ "$wheel" + done + + echo "Finished executing pythonRuntimeDepsCheck" +} + +if [ -z "${dontCheckRuntimeDeps-}" ]; then + echo "Using pythonRuntimeDepsCheckHook" + preInstallPhases+=" pythonRuntimeDepsCheckHook" +fi diff --git a/pkgs/by-name/py/python/hooks/setuptools-build-hook.sh b/pkgs/by-name/py/python/hooks/setuptools-build-hook.sh new file mode 100644 index 0000000..4c63a18 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/setuptools-build-hook.sh @@ -0,0 +1,31 @@ +# Setup hook for setuptools. +echo "Sourcing setuptools-build-hook" + +setuptoolsBuildPhase() { + echo "Executing setuptoolsBuildPhase" + local args setuptools_has_parallel=@setuptools_has_parallel@ + runHook preBuild + + cp -f @setuppy@ nix_run_setup + args="" + if [ -n "$setupPyGlobalFlags" ]; then + args+="$setupPyGlobalFlags" + fi + if [ -n "$enableParallelBuilding" ]; then + if [ -n "$setuptools_has_parallel" ]; then + setupPyBuildFlags+=" --parallel $NIX_BUILD_CORES" + fi + fi + if [ -n "$setupPyBuildFlags" ]; then + args+=" build_ext $setupPyBuildFlags" + fi + eval "@pythonInterpreter@ nix_run_setup $args bdist_wheel" + + runHook postBuild + echo "Finished executing setuptoolsBuildPhase" +} + +if [ -z "${dontUseSetuptoolsBuild-}" ] && [ -z "${buildPhase-}" ]; then + echo "Using setuptoolsBuildPhase" + buildPhase=setuptoolsBuildPhase +fi diff --git a/pkgs/by-name/py/python/hooks/setuptools-check-hook.sh b/pkgs/by-name/py/python/hooks/setuptools-check-hook.sh new file mode 100644 index 0000000..88b7b11 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/setuptools-check-hook.sh @@ -0,0 +1,18 @@ +# Setup hook for setuptools. +echo "Sourcing setuptools-check-hook" + +setuptoolsCheckPhase() { + echo "Executing setuptoolsCheckPhase" + runHook preCheck + + cp -f @setuppy@ nix_run_setup + @pythonCheckInterpreter@ nix_run_setup test + + runHook postCheck + echo "Finished executing setuptoolsCheckPhase" +} + +if [ -z "${dontUseSetuptoolsCheck-}" ] && [ -z "${installCheckPhase-}" ]; then + echo "Using setuptoolsCheckPhase" + preDistPhases+=" setuptoolsCheckPhase" +fi diff --git a/pkgs/by-name/py/python/hooks/setuptools-rust-hook.sh b/pkgs/by-name/py/python/hooks/setuptools-rust-hook.sh new file mode 100644 index 0000000..917c19e --- /dev/null +++ b/pkgs/by-name/py/python/hooks/setuptools-rust-hook.sh @@ -0,0 +1,18 @@ +echo "Sourcing setuptools-rust-hook" + +setuptoolsRustSetup() { + # This can work only if rustPlatform.cargoSetupHook is also included + if ! command -v cargoSetupPostPatchHook >/dev/null; then + echo "ERROR: setuptools-rust has to be used alongside with rustPlatform.cargoSetupHook!" + exit 1 + fi + + export PYO3_CROSS_LIB_DIR="@pyLibDir@" + export CARGO_BUILD_TARGET=@cargoBuildTarget@ + # TODO theoretically setting linker should not be required because it is + # already set in pkgs/build-support/rust/hooks/default.nix but build fails + # on missing linker without this. + export CARGO_TARGET_@cargoLinkerVar@_LINKER=@targetLinker@ +} + +preConfigureHooks+=(setuptoolsRustSetup) diff --git a/pkgs/by-name/py/python/hooks/sphinx-hook.sh b/pkgs/by-name/py/python/hooks/sphinx-hook.sh new file mode 100644 index 0000000..0307e83 --- /dev/null +++ b/pkgs/by-name/py/python/hooks/sphinx-hook.sh @@ -0,0 +1,72 @@ +# shellcheck shell=bash +echo "Sourcing sphinx-hook" + +declare -a __sphinxBuilders + +buildSphinxPhase() { + echo "Executing buildSphinxPhase" + + local __sphinxRoot="" + runHook preBuildSphinx + + if [[ -n "${sphinxRoot:-}" ]] ; then # explicit root + if ! [[ -f "${sphinxRoot}/conf.py" ]] ; then + echo 2>&1 "$sphinxRoot/conf.py: no such file" + exit 1 + fi + __sphinxRoot=$sphinxRoot + else + for candidate in doc docs doc/source docs/source ; do + if [[ -f "$candidate/conf.py" ]] ; then + echo "Sphinx documentation found in $candidate" + __sphinxRoot=$candidate + break + fi + done + fi + + if [[ -z "${__sphinxRoot}" ]] ; then + echo 2>&1 "Sphinx documentation not found, use 'sphinxRoot' variable" + exit 1 + fi + + if [ -n "${sphinxBuilders-}" ]; then + eval "__sphinxBuilders=($sphinxBuilders)" + else + __sphinxBuilders=(html) + fi + + for __builder in "${__sphinxBuilders[@]}"; do + echo "Executing sphinx-build with ${__builder} builder" + @sphinxBuild@ -M "${__builder}" "${__sphinxRoot}" ".sphinx/${__builder}" -v + done + + runHook postBuildSphinx +} + +installSphinxPhase() { + echo "Executing installSphinxPhase" + + local docdir="" + runHook preInstallSphinx + + for __builder in "${__sphinxBuilders[@]}"; do + # divert output for man builder + if [ "$__builder" == "man" ]; then + installManPage .sphinx/man/man/* + + else + # shellcheck disable=2154 + docdir="${doc:-$out}/share/doc/${name}" + + mkdir -p "$docdir" + + cp -r ".sphinx/${__builder}/${__builder}" "$docdir/" + rm -fr "${docdir}/${__builder}/_sources" "${docdir}/${__builder}/.buildinfo" + fi + done + + runHook postInstallSphinx +} + +preDistPhases+=" buildSphinxPhase installSphinxPhase" diff --git a/pkgs/by-name/py/python/hooks/unittest-check-hook.sh b/pkgs/by-name/py/python/hooks/unittest-check-hook.sh new file mode 100644 index 0000000..3485fcc --- /dev/null +++ b/pkgs/by-name/py/python/hooks/unittest-check-hook.sh @@ -0,0 +1,29 @@ +# Setup hook for unittest. +echo "Sourcing unittest-check-hook" + +unittestCheckPhase() { + echo "Executing unittestCheckPhase" + runHook preCheck + + eval "@pythonCheckInterpreter@ -m unittest discover $unittestFlagsArray" + + runHook postCheck + echo "Finished executing unittestCheckPhase" +} + +if [ -z "${dontUseUnittestCheck-}" ] && [ -z "${installCheckPhase-}" ]; then + echo "Using unittestCheckPhase" + preDistPhases+=" unittestCheckPhase" + + # It's almost always the case that setuptoolsCheckPhase should not be ran + # when the unittestCheckHook is being ran + if [ -z "${useSetuptoolsCheck-}" ]; then + dontUseSetuptoolsCheck=1 + + # Remove command if already injected into preDistPhases + if [[ "$preDistPhases" =~ "setuptoolsCheckPhase" ]]; then + echo "Removing setuptoolsCheckPhase" + preDistPhases=${preDistPhases/setuptoolsCheckPhase/} + fi + fi +fi diff --git a/pkgs/by-name/py/python/hooks/venv-shell-hook.sh b/pkgs/by-name/py/python/hooks/venv-shell-hook.sh new file mode 100644 index 0000000..1fcc0bb --- /dev/null +++ b/pkgs/by-name/py/python/hooks/venv-shell-hook.sh @@ -0,0 +1,28 @@ +venvShellHook() { + echo "Executing venvHook" + runHook preShellHook + + if [ -d "${venvDir}" ]; then + echo "Skipping venv creation, '${venvDir}' already exists" + source "${venvDir}/bin/activate" + else + echo "Creating new venv environment in path: '${venvDir}'" + @pythonInterpreter@ -m venv "${venvDir}" + + source "${venvDir}/bin/activate" + runHook postVenvCreation + fi + + runHook postShellHook + echo "Finished executing venvShellHook" +} + +if [ -z "${dontUseVenvShellHook:-}" ] && [ -z "${shellHook-}" ]; then + echo "Using venvShellHook" + if [ -z "${venvDir-}" ]; then + echo "Error: \`venvDir\` should be set when using \`venvShellHook\`." + exit 1 + else + shellHook=venvShellHook + fi +fi diff --git a/pkgs/by-name/py/python/hooks/wheel-unpack-hook.sh b/pkgs/by-name/py/python/hooks/wheel-unpack-hook.sh new file mode 100644 index 0000000..fca808a --- /dev/null +++ b/pkgs/by-name/py/python/hooks/wheel-unpack-hook.sh @@ -0,0 +1,18 @@ +# Setup hook to use in case a wheel is fetched +echo "Sourcing wheel setup hook" + +wheelUnpackPhase(){ + echo "Executing wheelUnpackPhase" + runHook preUnpack + + mkdir -p dist + cp "$src" "dist/$(stripHash "$src")" + +# runHook postUnpack # Calls find...? + echo "Finished executing wheelUnpackPhase" +} + +if [ -z "${dontUseWheelUnpack-}" ] && [ -z "${unpackPhase-}" ]; then + echo "Using wheelUnpackPhase" + unpackPhase=wheelUnpackPhase +fi diff --git a/pkgs/by-name/py/python/manylinux/default.nix b/pkgs/by-name/py/python/manylinux/default.nix new file mode 100644 index 0000000..ba20c0d --- /dev/null +++ b/pkgs/by-name/py/python/manylinux/default.nix @@ -0,0 +1,88 @@ +{ lib, pkgs }: + +let + # Create a derivation that links all desired manylinux libraries + createManyLinuxPackage = name: libs: let + drvs = lib.unique (lib.attrValues libs); + names = lib.attrNames libs; + in pkgs.runCommand name { + buildInputs = drvs; + } '' + mkdir -p $out/lib + num_found=0 + + IFS=: + export DESIRED_LIBRARIES=${lib.concatStringsSep ":" names} + export LIBRARY_PATH=${lib.makeLibraryPath drvs} + for desired in $DESIRED_LIBRARIES; do + for path in $LIBRARY_PATH; do + if [ -e $path/$desired ]; then + echo "FOUND $path/$desired" + ln -s $path/$desired $out/lib/$desired + num_found=$((num_found+1)) + break + fi + done + done + + num_desired=${toString (lib.length names)} + echo "Found $num_found of $num_desired libraries" + if [ "$num_found" -ne "$num_desired" ]; then + echo "Error: not all desired libraries were found" + exit 1 + fi + ''; + + getLibOutputs = lib.mapAttrs (k: v: lib.getLib v); + + # https://www.python.org/dev/peps/pep-0599/ + manylinux2014Libs = getLibOutputs(with pkgs; { + "libgcc_s.so.1" = glibc; + "libstdc++.so.6" = stdenv.cc.cc; + "libm.so.6" = glibc; + "libdl.so.2" = glibc; + "librt.so.1" = glibc; + "libc.so.6" = glibc; + "libnsl.so.1" = glibc; + "libutil.so.1" = glibc; + "libpthread.so.0" = glibc; + "libresolv.so.2" = glibc; + "libX11.so.6" = xorg.libX11; + "libXext.so.6" = xorg.libXext; + "libXrender.so.1" = xorg.libXrender; + "libICE.so.6" = xorg.libICE; + "libSM.so.6" = xorg.libSM; + "libGL.so.1" = libGL; + "libgobject-2.0.so.0" = glib; + "libgthread-2.0.so.0" = glib; + "libglib-2.0.so.0" = glib; + "libz.so.1" = zlib; + "libexpat.so.1" = expat; + }); + + # https://www.python.org/dev/peps/pep-0571/ + manylinux2010Libs = manylinux2014Libs; + + # https://www.python.org/dev/peps/pep-0513/ + manylinux1Libs = getLibOutputs(manylinux2010Libs // (with pkgs; { + "libpanelw.so.5" = ncurses5; + "libncursesw.so.5" = ncurses5; + "libcrypt.so.1" = libxcrypt; + })); + +in { + # List of libraries that are needed for manylinux compatibility. + # When using a wheel that is manylinux1 compatible, just extend + # the `buildInputs` with one of these `manylinux` lists. + # Additionally, add `autoPatchelfHook` to `nativeBuildInputs`. + manylinux1 = lib.unique (lib.attrValues manylinux1Libs); + manylinux2010 = lib.unique (lib.attrValues manylinux2010Libs); + manylinux2014 = lib.unique (lib.attrValues manylinux2014Libs); + + # These are symlink trees to the relevant libs and are typically not needed + # These exist so as to quickly test whether all required libraries are provided + # by the mapped packages. + manylinux1Package = createManyLinuxPackage "manylinux1" manylinux1Libs; + manylinux2010Package = createManyLinuxPackage "manylinux2010" manylinux2010Libs; + manylinux2014Package = createManyLinuxPackage "manylinux2014" manylinux2014Libs; +} diff --git a/pkgs/by-name/py/python/mk-python-derivation.nix b/pkgs/by-name/py/python/mk-python-derivation.nix new file mode 100644 index 0000000..4c45d96 --- /dev/null +++ b/pkgs/by-name/py/python/mk-python-derivation.nix @@ -0,0 +1,349 @@ +# Generic builder. + +{ lib +, config +, python +, wrapPython +, unzip +, ensureNewerSourcesForZipFilesHook +# Whether the derivation provides a Python module or not. +, toPythonModule +, namePrefix +, update-python-libraries +, setuptools +, pypaBuildHook +, pypaInstallHook +, pythonCatchConflictsHook +, pythonImportsCheckHook +, pythonNamespacesHook +, pythonOutputDistHook +, pythonRemoveBinBytecodeHook +, pythonRemoveTestsDirHook +, pythonRuntimeDepsCheckHook +, setuptoolsBuildHook +, setuptoolsCheckHook +, wheelUnpackHook +, eggUnpackHook +, eggBuildHook +, eggInstallHook +}: + +let + inherit (builtins) unsafeGetAttrPos; + inherit (lib) + elem optionalString max stringLength fixedWidthString getName + optional optionals optionalAttrs hasSuffix escapeShellArgs + extendDerivation head splitString isBool; + + leftPadName = name: against: let + len = max (stringLength name) (stringLength against); + in fixedWidthString len " " name; + + isPythonModule = drv: + # all pythonModules have the pythonModule attribute + (drv ? "pythonModule") + # Some pythonModules are turned in to a pythonApplication by setting the field to false + && (!isBool drv.pythonModule); + + isMismatchedPython = drv: drv.pythonModule != python; + + withDistOutput' = lib.flip elem ["pyproject" "setuptools" "wheel"]; + + isBootstrapInstallPackage' = lib.flip elem [ "flit-core" "installer" ]; + + isBootstrapPackage' = lib.flip elem ([ + "build" "packaging" "pyproject-hooks" "wheel" + ] ++ optionals (python.pythonOlder "3.11") [ + "tomli" + ]); + + isSetuptoolsDependency' = lib.flip elem [ "setuptools" "wheel" ]; + + cleanAttrs = lib.flip removeAttrs [ + "disabled" "checkPhase" "checkInputs" "nativeCheckInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts" "pyproject" "format" + "disabledTestPaths" "outputs" "stdenv" + "dependencies" "optional-dependencies" "build-system" + ]; + +in + +{ name ? "${attrs.pname}-${attrs.version}" + +# Build-time dependencies for the package +, nativeBuildInputs ? [] + +# Run-time dependencies for the package +, buildInputs ? [] + +# Dependencies needed for running the checkPhase. +# These are added to buildInputs when doCheck = true. +, checkInputs ? [] +, nativeCheckInputs ? [] + +# propagate build dependencies so in case we have A -> B -> C, +# C can import package A propagated by B +, propagatedBuildInputs ? [] + +# Python module dependencies. +# These are named after PEP-621. +, dependencies ? [] +, optional-dependencies ? {} + +# Python PEP-517 build systems. +, build-system ? [] + +# DEPRECATED: use propagatedBuildInputs +, pythonPath ? [] + +# Enabled to detect some (native)BuildInputs mistakes +, strictDeps ? true + +, outputs ? [ "out" ] + +# used to disable derivation, useful for specific python versions +, disabled ? false + +# Raise an error if two packages are installed with the same name +# TODO: For cross we probably need a different PYTHONPATH, or not +# add the runtime deps until after buildPhase. +, catchConflicts ? (python.stdenv.hostPlatform == python.stdenv.buildPlatform) + +# Additional arguments to pass to the makeWrapper function, which wraps +# generated binaries. +, makeWrapperArgs ? [] + +# Skip wrapping of python programs altogether +, dontWrapPythonPrograms ? false + +# Don't use Pip to install a wheel +# Note this is actually a variable for the pipInstallPhase in pip's setupHook. +# It's included here to prevent an infinite recursion. +, dontUsePipInstall ? false + +# Skip setting the PYTHONNOUSERSITE environment variable in wrapped programs +, permitUserSite ? false + +# Remove bytecode from bin folder. +# When a Python script has the extension `.py`, bytecode is generated +# Typically, executables in bin have no extension, so no bytecode is generated. +# However, some packages do provide executables with extensions, and thus bytecode is generated. +, removeBinBytecode ? true + +# pyproject = true <-> format = "pyproject" +# pyproject = false <-> format = "other" +# https://github.com/NixOS/nixpkgs/issues/253154 +, pyproject ? null + +# Several package formats are supported. +# "setuptools" : Install a common setuptools/distutils based package. This builds a wheel. +# "wheel" : Install from a pre-compiled wheel. +# "pyproject": Install a package using a ``pyproject.toml`` file (PEP517). This builds a wheel. +# "egg": Install a package from an egg. +# "other" : Provide your own buildPhase and installPhase. +, format ? null + +, meta ? {} + +, doCheck ? config.doCheckByDefault or false + +, disabledTestPaths ? [] + +# Allow passing in a custom stdenv to buildPython* +, stdenv ? python.stdenv + +, ... } @ attrs: + +assert (pyproject != null) -> (format == null); + +let + format' = + if pyproject != null then + if pyproject then + "pyproject" + else + "other" + else if format != null then + format + else + "setuptools"; + + withDistOutput = withDistOutput' format'; + + validatePythonMatches = let + throwMismatch = attrName: drv: let + myName = "'${namePrefix}${name}'"; + theirName = "'${drv.name}'"; + optionalLocation = let + pos = unsafeGetAttrPos (if attrs ? "pname" then "pname" else "name") attrs; + in optionalString (pos != null) " at ${pos.file}:${toString pos.line}:${toString pos.column}"; + in throw '' + Python version mismatch in ${myName}: + + The Python derivation ${myName} depends on a Python derivation + named ${theirName}, but the two derivations use different versions + of Python: + + ${leftPadName myName theirName} uses ${python} + ${leftPadName theirName myName} uses ${toString drv.pythonModule} + + Possible solutions: + + * If ${theirName} is a Python library, change the reference to ${theirName} + in the ${attrName} of ${myName} to use a ${theirName} built from the same + version of Python + + * If ${theirName} is used as a tool during the build, move the reference to + ${theirName} in ${myName} from ${attrName} to nativeBuildInputs + + * If ${theirName} provides executables that are called at run time, pass its + bin path to makeWrapperArgs: + + makeWrapperArgs = [ "--prefix PATH : ''${lib.makeBinPath [ ${getName drv } ] }" ]; + + ${optionalLocation} + ''; + + checkDrv = attrName: drv: + if (isPythonModule drv) && (isMismatchedPython drv) then throwMismatch attrName drv + else drv; + + in attrName: inputs: map (checkDrv attrName) inputs; + + isBootstrapInstallPackage = isBootstrapInstallPackage' (attrs.pname or null); + + isBootstrapPackage = isBootstrapInstallPackage || isBootstrapPackage' (attrs.pname or null); + + isSetuptoolsDependency = isSetuptoolsDependency' (attrs.pname or null); + + passthru = + attrs.passthru or { } + // { + updateScript = let + filename = head (splitString ":" self.meta.position); + in attrs.passthru.updateScript or [ update-python-libraries filename ]; + } + // optionalAttrs (dependencies != []) { + inherit dependencies; + } + // optionalAttrs (optional-dependencies != {}) { + inherit optional-dependencies; + } + // optionalAttrs (build-system != []) { + inherit build-system; + }; + + # Keep extra attributes from `attrs`, e.g., `patchPhase', etc. + self = toPythonModule (stdenv.mkDerivation ((cleanAttrs attrs) // { + + name = namePrefix + name; + + nativeBuildInputs = [ + python + wrapPython + ensureNewerSourcesForZipFilesHook # move to wheel installer (pip) or builder (setuptools, flit, ...)? + pythonRemoveTestsDirHook + ] ++ optionals (catchConflicts && !isBootstrapPackage && !isSetuptoolsDependency) [ + # + # 1. When building a package that is also part of the bootstrap chain, we + # must ignore conflicts after installation, because there will be one with + # the package in the bootstrap. + # + # 2. When a package is a dependency of setuptools, we must ignore conflicts + # because the hook that checks for conflicts uses setuptools. + # + pythonCatchConflictsHook + ] ++ optionals removeBinBytecode [ + pythonRemoveBinBytecodeHook + ] ++ optionals (hasSuffix "zip" (attrs.src.name or "")) [ + unzip + ] ++ optionals (format' == "setuptools") [ + setuptoolsBuildHook + ] ++ optionals (format' == "pyproject") [( + if isBootstrapPackage then + pypaBuildHook.override { + inherit (python.pythonOnBuildForHost.pkgs.bootstrap) build; + wheel = null; + } + else + pypaBuildHook + ) ( + if isBootstrapPackage then + pythonRuntimeDepsCheckHook.override { + inherit (python.pythonOnBuildForHost.pkgs.bootstrap) packaging; + } + else + pythonRuntimeDepsCheckHook + )] ++ optionals (format' == "wheel") [ + wheelUnpackHook + ] ++ optionals (format' == "egg") [ + eggUnpackHook eggBuildHook eggInstallHook + ] ++ optionals (format' != "other") [( + if isBootstrapInstallPackage then + pypaInstallHook.override { + inherit (python.pythonOnBuildForHost.pkgs.bootstrap) installer; + } + else + pypaInstallHook + )] ++ optionals (stdenv.buildPlatform == stdenv.hostPlatform) [ + # This is a test, however, it should be ran independent of the checkPhase and checkInputs + pythonImportsCheckHook + ] ++ optionals (python.pythonAtLeast "3.3") [ + # Optionally enforce PEP420 for python3 + pythonNamespacesHook + ] ++ optionals withDistOutput [ + pythonOutputDistHook + ] ++ nativeBuildInputs ++ build-system; + + buildInputs = validatePythonMatches "buildInputs" (buildInputs ++ pythonPath); + + propagatedBuildInputs = validatePythonMatches "propagatedBuildInputs" (propagatedBuildInputs ++ dependencies ++ [ + # we propagate python even for packages transformed with 'toPythonApplication' + # this pollutes the PATH but avoids rebuilds + # see https://github.com/NixOS/nixpkgs/issues/170887 for more context + python + ]); + + inherit strictDeps; + + LANG = "${if python.stdenv.isDarwin then "en_US" else "C"}.UTF-8"; + + # Python packages don't have a checkPhase, only an installCheckPhase + doCheck = false; + doInstallCheck = attrs.doCheck or true; + nativeInstallCheckInputs = [ + ] ++ optionals (format' == "setuptools") [ + # Longer-term we should get rid of this and require + # users of this function to set the `installCheckPhase` or + # pass in a hook that sets it. + setuptoolsCheckHook + ] ++ nativeCheckInputs; + installCheckInputs = checkInputs; + + postFixup = optionalString (!dontWrapPythonPrograms) '' + wrapPythonPrograms + '' + attrs.postFixup or ""; + + # Python packages built through cross-compilation are always for the host platform. + disallowedReferences = optionals (python.stdenv.hostPlatform != python.stdenv.buildPlatform) [ python.pythonOnBuildForHost ]; + + outputs = outputs ++ optional withDistOutput "dist"; + + inherit passthru; + + meta = { + # default to python's platforms + platforms = python.meta.platforms; + isBuildPythonPackage = python.meta.platforms; + } // meta; + } // optionalAttrs (attrs?checkPhase) { + # If given use the specified checkPhase, otherwise use the setup hook. + # Longer-term we should get rid of `checkPhase` and use `installCheckPhase`. + installCheckPhase = attrs.checkPhase; + } // optionalAttrs (disabledTestPaths != []) { + disabledTestPaths = escapeShellArgs disabledTestPaths; + })); + +in extendDerivation + (disabled -> throw "${name} not supported for interpreter ${python.executable}") + passthru + self diff --git a/pkgs/by-name/py/python/packages.nix b/pkgs/by-name/py/python/packages.nix new file mode 100644 index 0000000..c4b3eb1 --- /dev/null +++ b/pkgs/by-name/py/python/packages.nix @@ -0,0 +1,56 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + pythonInterpreters = callPackage ./. { }; + inherit (pythonInterpreters) python27 python39 python310 python311 python312 python313 python3Minimal pypy27 pypy310 pypy39 rustpython; + + # List of extensions with overrides to apply to all Python package sets. + pythonPackagesExtensions = [ ]; + # Python package sets. + python27Packages = python27.pkgs // { __attrsFailEvaluation = true; }; + python39Packages = python39.pkgs // { __attrsFailEvaluation = true; }; + python310Packages = python310.pkgs // { __attrsFailEvaluation = true; }; + python311Packages = recurseIntoAttrs python311.pkgs // { pythonPackages = python311.pkgs // { __attrsFailEvaluation = true; }; }; + python312Packages = recurseIntoAttrs python312.pkgs // { pythonPackages = python312.pkgs // { __attrsFailEvaluation = true; }; }; + python313Packages = python313.pkgs // { __attrsFailEvaluation = true; }; + pypyPackages = pypy.pkgs // { __attrsFailEvaluation = true; }; + pypy2Packages = pypy2.pkgs // { __attrsFailEvaluation = true; }; + pypy27Packages = pypy27.pkgs // { __attrsFailEvaluation = true; }; + pypy3Packages = pypy3.pkgs // { __attrsFailEvaluation = true; }; + pypy39Packages = pypy39.pkgs // { __attrsFailEvaluation = true; }; + pypy310Packages = pypy310.pkgs // { __attrsFailEvaluation = true; }; + + # Python interpreters. All standard library modules are included except for tkinter, which is + # available as `pythonPackages.tkinter` and can be used as any other Python package. + # When switching these sets, please update docs at ../../doc/languages-frameworks/python.md + python2 = python27; + python3 = python311; + + # pythonPackages further below, but assigned here because they need to be in sync + python2Packages = dontRecurseIntoAttrs python27Packages; + python3Packages = dontRecurseIntoAttrs python311Packages; + + + # Should eventually be moved inside Python interpreters. + python-setup-hook = buildPackages.callPackage ./setup-hook.nix { }; + + update-python-libraries = callPackage ./update-python-libraries { }; + + docutils = with python3Packages; toPythonApplication ( + docutils.overridePythonAttrs (attrs: rec { + version = "0.20.1"; + src = attrs.src.override { + inherit version; + hash = "sha256-8IpOJ2w6FYOobc4+NKuj/gTQK7ot1R7RYQYkToqSPjs="; + }; + }) + ); + + actdiag = with python3.pkgs; toPythonApplication actdiag; + blockdiag = with python3Packages; toPythonApplication blockdiag; + nwdiag = with python3Packages; toPythonApplication nwdiag; + buildcatrust = with python3.pkgs; toPythonApplication buildcatrust; + seqdiag = with python3Packages; toPythonApplication seqdiag; +} diff --git a/pkgs/by-name/py/python/passthrufun.nix b/pkgs/by-name/py/python/passthrufun.nix new file mode 100644 index 0000000..8635841 --- /dev/null +++ b/pkgs/by-name/py/python/passthrufun.nix @@ -0,0 +1,105 @@ +{ lib, stdenv, callPackage, pythonPackagesExtensions, config, makeScopeWithSplicing', ... }: + +{ implementation +, libPrefix +, executable +, sourceVersion +, pythonVersion +, packageOverrides +, sitePackages +, hasDistutilsCxxPatch +, pythonOnBuildForBuild +, pythonOnBuildForHost +, pythonOnBuildForTarget +, pythonOnHostForHost +, pythonOnTargetForTarget +, pythonAttr ? null +, self # is pythonOnHostForTarget +}: let + pythonPackages = let + ensurePythonModules = items: let + exceptions = [ + stdenv + ]; + providesSetupHook = lib.attrByPath [ "provides" "setupHook"] false; + valid = value: pythonPackages.hasPythonModule value || providesSetupHook value || lib.elem value exceptions; + func = name: value: + if lib.isDerivation value then + lib.extendDerivation (valid value || throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set.") {} value + else + value; + in lib.mapAttrs func items; + in ensurePythonModules (callPackage + # Function that when called + # - imports python-packages.nix + # - adds spliced package sets to the package set + # - applies overrides from `packageOverrides` and `pythonPackagesOverlays`. + ({ pkgs, stdenv, python, overrides }: let + pythonPackagesFun = import ./python-packages-base.nix { + inherit stdenv pkgs lib; + python = self; + }; + otherSplices = { + selfBuildBuild = pythonOnBuildForBuild.pkgs; + selfBuildHost = pythonOnBuildForHost.pkgs; + selfBuildTarget = pythonOnBuildForTarget.pkgs; + selfHostHost = pythonOnHostForHost.pkgs; + selfTargetTarget = pythonOnTargetForTarget.pkgs or {}; # There is no Python TargetTarget. + }; + hooks = import ./hooks/default.nix; + keep = self: hooks self {}; + optionalExtensions = cond: as: lib.optionals cond as; + pythonExtension = import ./python-packages.nix; + python2Extension = import ./python2-packages.nix; + extensions = lib.composeManyExtensions ([ + hooks + pythonExtension + ] ++ (optionalExtensions (!self.isPy3k) [ + python2Extension + ]) ++ pythonPackagesExtensions ++ [ + overrides + ]); + aliases = self: super: {}; #lib.optionalAttrs config.allowAliases (import ../../../top-level/python-aliases.nix lib self super); + in makeScopeWithSplicing' { + inherit otherSplices keep; + f = lib.extends (lib.composeExtensions aliases extensions) pythonPackagesFun; + }) { + overrides = packageOverrides; + python = self; + }); + pythonOnBuildForHost_overridden = + pythonOnBuildForHost.override { inherit packageOverrides; self = pythonOnBuildForHost_overridden; }; +in rec { + isPy27 = pythonVersion == "2.7"; + isPy37 = pythonVersion == "3.7"; + isPy38 = pythonVersion == "3.8"; + isPy39 = pythonVersion == "3.9"; + isPy310 = pythonVersion == "3.10"; + isPy311 = pythonVersion == "3.11"; + isPy312 = pythonVersion == "3.12"; + isPy2 = lib.strings.substring 0 1 pythonVersion == "2"; + isPy3 = lib.strings.substring 0 1 pythonVersion == "3"; + isPy3k = isPy3; + isPyPy = lib.hasInfix "pypy" interpreter; + + buildEnv = callPackage ./wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; }; + withPackages = import ./with-packages.nix { inherit buildEnv pythonPackages;}; + pkgs = pythonPackages; + interpreter = "${self}/bin/${executable}"; + inherit executable implementation libPrefix pythonVersion sitePackages; + inherit sourceVersion; + pythonAtLeast = lib.versionAtLeast pythonVersion; + pythonOlder = lib.versionOlder pythonVersion; + inherit hasDistutilsCxxPatch; + # Remove after 24.11 is released. + pythonForBuild = + lib.warnIf (lib.isInOldestRelease 2311) "`pythonForBuild` (from `python*`) has been renamed to `pythonOnBuildForHost`" + pythonOnBuildForHost_overridden; + pythonOnBuildForHost = pythonOnBuildForHost_overridden; + + tests = callPackage ./tests.nix { + python = self; + }; + + inherit pythonAttr; +} diff --git a/pkgs/by-name/py/python/pypy/default.nix b/pkgs/by-name/py/python/pypy/default.nix new file mode 100644 index 0000000..9b41494 --- /dev/null +++ b/pkgs/by-name/py/python/pypy/default.nix @@ -0,0 +1,210 @@ +{ lib, stdenv, substituteAll, fetchurl +, zlibSupport ? true, zlib +, bzip2, pkg-config, libffi, libunwind, Security +, sqlite, openssl, ncurses, python, expat, tcl, tk, tix, libX11 +, gdbm, db, xz, python-setup-hook +, optimizationLevel ? "jit", boehmgc +# For the Python package set +, hash +, self +, packageOverrides ? (self: super: {}) +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsTargetTarget +, sourceVersion +, pythonVersion +, passthruFun +, pythonAttr ? "pypy${lib.substring 0 1 pythonVersion}${lib.substring 2 3 pythonVersion}" +}: + +assert zlibSupport -> zlib != null; + +let + isPy3k = (lib.versions.major pythonVersion) == "3"; + isPy38OrNewer = lib.versionAtLeast pythonVersion "3.8"; + isPy39OrNewer = lib.versionAtLeast pythonVersion "3.9"; + passthru = passthruFun rec { + inherit self sourceVersion pythonVersion packageOverrides; + implementation = "pypy"; + libPrefix = "pypy${pythonVersion}"; + executable = "pypy${if isPy39OrNewer then lib.versions.majorMinor pythonVersion else lib.optionalString isPy3k "3"}"; + sitePackages = "${lib.optionalString isPy38OrNewer "lib/${libPrefix}/"}site-packages"; + hasDistutilsCxxPatch = false; + inherit pythonAttr; + + pythonOnBuildForBuild = pkgsBuildBuild.${pythonAttr}; + pythonOnBuildForHost = pkgsBuildHost.${pythonAttr}; + pythonOnBuildForTarget = pkgsBuildTarget.${pythonAttr}; + pythonOnHostForHost = pkgsHostHost.${pythonAttr}; + pythonOnTargetForTarget = pkgsTargetTarget.${pythonAttr} or {}; + }; + pname = passthru.executable; + version = with sourceVersion; "${major}.${minor}.${patch}"; + pythonForPypy = python.withPackages (ppkgs: [ ppkgs.pycparser ]); + +in with passthru; stdenv.mkDerivation rec { + inherit pname version; + + src = fetchurl { + url = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-src.tar.bz2"; + inherit hash; + }; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ + bzip2 openssl pythonForPypy libffi ncurses expat sqlite tk tcl libX11 gdbm db + ] ++ lib.optionals isPy3k [ + xz + ] ++ lib.optionals (stdenv ? cc && stdenv.cc.libc != null) [ + stdenv.cc.libc + ] ++ lib.optionals zlibSupport [ + zlib + ] ++ lib.optionals (lib.any (l: l == optimizationLevel) [ "0" "1" "2" "3"]) [ + boehmgc + ] ++ lib.optionals stdenv.isDarwin [ + libunwind Security + ]; + + # Remove bootstrap python from closure + dontPatchShebangs = true; + disallowedReferences = [ python ]; + + C_INCLUDE_PATH = lib.makeSearchPathOutput "dev" "include" buildInputs; + LIBRARY_PATH = lib.makeLibraryPath buildInputs; + LD_LIBRARY_PATH = lib.makeLibraryPath (builtins.filter (x : x.outPath != stdenv.cc.libc.outPath or "") buildInputs); + + patches = [ + ./dont_fetch_vendored_deps.patch + + (substituteAll { + src = ./tk_tcl_paths.patch; + inherit tk tcl; + tk_dev = tk.dev; + tcl_dev = tcl; + tk_libprefix = tk.libPrefix; + tcl_libprefix = tcl.libPrefix; + }) + + (substituteAll { + src = ./sqlite_paths.patch; + inherit (sqlite) out dev; + }) + ]; + + postPatch = '' + substituteInPlace lib_pypy/pypy_tools/build_cffi_imports.py \ + --replace "multiprocessing.cpu_count()" "$NIX_BUILD_CORES" + + substituteInPlace "lib-python/${if isPy3k then "3/tkinter/tix.py" else "2.7/lib-tk/Tix.py"}" \ + --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'" + ''; + + buildPhase = '' + runHook preBuild + + ${pythonForPypy.interpreter} rpython/bin/rpython \ + --make-jobs="$NIX_BUILD_CORES" \ + -O${optimizationLevel} \ + --batch pypy/goal/targetpypystandalone.py + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/{bin,include,lib,${executable}-c} + + cp -R {include,lib_pypy,lib-python,${executable}-c} $out/${executable}-c + cp lib${executable}-c${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/ + ln -s $out/${executable}-c/${executable}-c $out/bin/${executable} + ${lib.optionalString isPy39OrNewer "ln -s $out/bin/${executable} $out/bin/pypy3"} + + # other packages expect to find stuff according to libPrefix + ln -s $out/${executable}-c/include $out/include/${libPrefix} + ln -s $out/${executable}-c/lib-python/${if isPy3k then "3" else pythonVersion} $out/lib/${libPrefix} + + # Include a sitecustomize.py file + cp ${../sitecustomize.py} $out/${if isPy38OrNewer then sitePackages else "lib/${libPrefix}/${sitePackages}"}/sitecustomize.py + + runHook postInstall + ''; + + preFixup = lib.optionalString (stdenv.isDarwin) '' + install_name_tool -change @rpath/lib${executable}-c.dylib $out/lib/lib${executable}-c.dylib $out/bin/${executable} + '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' + mkdir -p $out/${executable}-c/pypy/bin + mv $out/bin/${executable} $out/${executable}-c/pypy/bin/${executable} + ln -s $out/${executable}-c/pypy/bin/${executable} $out/bin/${executable} + ''; + + setupHook = python-setup-hook sitePackages; + + # TODO: A bunch of tests are failing as of 7.1.1, please feel free to + # fix and re-enable if you have the patience and tenacity. + doCheck = false; + checkPhase = let + disabledTests = [ + # disable shutils because it assumes gid 0 exists + "test_shutil" + # disable socket because it has two actual network tests that fail + "test_socket" + ] ++ lib.optionals (!isPy3k) [ + # disable test_urllib2net, test_urllib2_localnet, and test_urllibnet because they require networking (example.com) + "test_urllib2net" + "test_urllibnet" + "test_urllib2_localnet" + ] ++ lib.optionals isPy3k [ + # disable asyncio due to https://github.com/NixOS/nix/issues/1238 + "test_asyncio" + # disable os due to https://github.com/NixOS/nixpkgs/issues/10496 + "test_os" + # disable pathlib due to https://bitbucket.org/pypy/pypy/pull-requests/594 + "test_pathlib" + # disable tarfile because it assumes gid 0 exists + "test_tarfile" + # disable __all__ because of spurious imp/importlib warning and + # warning-to-error test policy + "test___all__" + ]; + in '' + export TERMINFO="${ncurses.out}/share/terminfo/"; + export TERM="xterm"; + export HOME="$TMPDIR"; + + ${pythonForPypy.interpreter} ./pypy/test_all.py --pypy=./${executable}-c -k 'not (${lib.concatStringsSep " or " disabledTests})' lib-python + ''; + + # verify cffi modules + doInstallCheck = true; + installCheckPhase = let + modules = [ + "curses" + "sqlite3" + ] ++ lib.optionals (!isPy3k) [ + "Tkinter" + ] ++ lib.optionals isPy3k [ + "tkinter" + "lzma" + ]; + imports = lib.concatMapStringsSep "; " (x: "import ${x}") modules; + in '' + echo "Testing whether we can import modules" + $out/bin/${executable} -c '${imports}' + ''; + + inherit passthru; + enableParallelBuilding = true; # almost no parallelization without STM + + meta = with lib; { + homepage = "https://www.pypy.org/"; + description = "Fast, compliant alternative implementation of the Python language (${pythonVersion})"; + mainProgram = "pypy"; + license = licenses.mit; + platforms = [ "aarch64-linux" "x86_64-linux" "aarch64-darwin" "x86_64-darwin" ]; + broken = optimizationLevel == "0"; # generates invalid code + maintainers = with maintainers; [ andersk ]; + }; +} diff --git a/pkgs/by-name/py/python/pypy/dont_fetch_vendored_deps.patch b/pkgs/by-name/py/python/pypy/dont_fetch_vendored_deps.patch new file mode 100644 index 0000000..bc959e1 --- /dev/null +++ b/pkgs/by-name/py/python/pypy/dont_fetch_vendored_deps.patch @@ -0,0 +1,12 @@ +diff -ur a/lib_pypy/pypy_tools/build_cffi_imports.py b/lib_pypy/pypy_tools/build_cffi_imports.py +--- a/lib_pypy/pypy_tools/build_cffi_imports.py 2021-04-12 01:11:48.000000000 -0400 ++++ b/lib_pypy/pypy_tools/build_cffi_imports.py 2021-07-16 06:37:03.000000000 -0400 +@@ -225,6 +225,8 @@ + + print('*', ' '.join(args), file=sys.stderr) + if embed_dependencies and key in cffi_dependencies: ++ print("Nixpkgs: skipping fetching/building dependency", key) ++ elif False: + status, stdout, stderr = _build_dependency(key) + if status != 0: + failures.append((key, module)) diff --git a/pkgs/by-name/py/python/pypy/prebuilt.nix b/pkgs/by-name/py/python/pypy/prebuilt.nix new file mode 100644 index 0000000..4b47c64 --- /dev/null +++ b/pkgs/by-name/py/python/pypy/prebuilt.nix @@ -0,0 +1,165 @@ +{ lib +, stdenv +, fetchurl +, autoPatchelfHook +, python-setup-hook +, self +# Dependencies +, bzip2 +, expat +, gdbm +, ncurses6 +, sqlite +, tcl-8_5 +, tk-8_5 +, tcl-8_6 +, tk-8_6 +, zlib +# For the Python package set +, packageOverrides ? (self: super: {}) +, sourceVersion +, pythonVersion +, hash +, passthruFun +}: + +# This version of PyPy is primarily added to speed-up translation of +# our PyPy source build when developing that expression. + +let + isPy3k = majorVersion == "3"; + passthru = passthruFun rec { + inherit self sourceVersion pythonVersion packageOverrides; + implementation = "pypy"; + libPrefix = "pypy${pythonVersion}"; + executable = "pypy${lib.optionalString isPy3k "3"}"; + sitePackages = "lib/${libPrefix}/site-packages"; + hasDistutilsCxxPatch = false; + + # Not possible to cross-compile with. + pythonOnBuildForBuild = throw "${pname} does not support cross compilation"; + pythonOnBuildForHost = self; + pythonOnBuildForTarget = throw "${pname} does not support cross compilation"; + pythonOnHostForHost = throw "${pname} does not support cross compilation"; + pythonOnTargetForTarget = throw "${pname} does not support cross compilation"; + }; + pname = "${passthru.executable}_prebuilt"; + version = with sourceVersion; "${major}.${minor}.${patch}"; + + majorVersion = lib.versions.major pythonVersion; + + downloadUrls = { + aarch64-linux = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-aarch64.tar.bz2"; + x86_64-linux = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-linux64.tar.bz2"; + aarch64-darwin = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-macos_arm64.tar.bz2"; + x86_64-darwin = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-macos_x86_64.tar.bz2"; + }; + +in with passthru; stdenv.mkDerivation { + inherit pname version; + + src = fetchurl { + url = downloadUrls.${stdenv.system} or (throw "Unsupported system: ${stdenv.system}"); + inherit hash; + }; + + buildInputs = [ + bzip2 + expat + gdbm + ncurses6 + sqlite + zlib + stdenv.cc.cc.libgcc or null + ] ++ lib.optionals stdenv.isLinux [ + tcl-8_5 + tk-8_5 + ] ++ lib.optionals stdenv.isDarwin [ + tcl-8_6 + tk-8_6 + ]; + + nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out + echo "Moving files to $out" + mv -t $out bin include lib + mv $out/bin/libpypy*-c${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/ + ${lib.optionalString stdenv.isLinux '' + rm $out/bin/*.debug + ''} + + echo "Removing bytecode" + find . -name "__pycache__" -type d -depth -delete + + # Include a sitecustomize.py file + cp ${../sitecustomize.py} $out/${sitePackages}/sitecustomize.py + + runHook postInstall + ''; + + preFixup = lib.optionalString stdenv.isLinux '' + find $out/{lib,lib_pypy*} -name "*.so" \ + -exec patchelf \ + --replace-needed libtinfow.so.6 libncursesw.so.6 \ + --replace-needed libgdbm.so.4 libgdbm_compat.so.4 {} \; + '' + lib.optionalString stdenv.isDarwin '' + install_name_tool \ + -change \ + @rpath/lib${libPrefix}-c.dylib \ + $out/lib/lib${libPrefix}-c.dylib \ + $out/bin/${executable} + install_name_tool \ + -change \ + @rpath/lib${libPrefix}-c.dylib \ + $out/lib/lib${libPrefix}-c.dylib \ + $out/bin/${libPrefix} + install_name_tool \ + -change \ + /opt/homebrew${lib.optionalString stdenv.isx86_64 "_x86_64"}/opt/tcl-tk/lib/libtcl8.6.dylib \ + ${tcl-8_6}/lib/libtcl8.6.dylib \ + $out/lib/${libPrefix}/_tkinter/*.so + install_name_tool \ + -change \ + /opt/homebrew${lib.optionalString stdenv.isx86_64 "_x86_64"}/opt/tcl-tk/lib/libtk8.6.dylib \ + ${tk-8_6}/lib/libtk8.6.dylib \ + $out/lib/${libPrefix}/_tkinter/*.so + ''; + + doInstallCheck = true; + + # Check whether importing of (extension) modules functions + installCheckPhase = let + modules = [ + "ssl" + "sys" + "curses" + ] ++ lib.optionals (!isPy3k) [ + "Tkinter" + ] ++ lib.optionals isPy3k [ + "tkinter" + ]; + imports = lib.concatMapStringsSep "; " (x: "import ${x}") modules; + in '' + echo "Testing whether we can import modules" + $out/bin/${executable} -c '${imports}' + ''; + + setupHook = python-setup-hook sitePackages; + + donPatchElf = true; + dontStrip = true; + + inherit passthru; + + meta = with lib; { + homepage = "http://pypy.org/"; + description = "Fast, compliant alternative implementation of the Python language (${pythonVersion})"; + license = licenses.mit; + platforms = lib.mapAttrsToList (arch: _: arch) downloadUrls; + }; + +} diff --git a/pkgs/by-name/py/python/pypy/prebuilt_2_7.nix b/pkgs/by-name/py/python/pypy/prebuilt_2_7.nix new file mode 100644 index 0000000..37a06f9 --- /dev/null +++ b/pkgs/by-name/py/python/pypy/prebuilt_2_7.nix @@ -0,0 +1,161 @@ +{ lib +, stdenv +, fetchurl +, autoPatchelfHook +, python-setup-hook +, self +# Dependencies +, bzip2 +, expat +, gdbm +, ncurses6 +, sqlite +, tcl-8_5 +, tk-8_5 +, tcl-8_6 +, tk-8_6 +, zlib +# For the Python package set +, packageOverrides ? (self: super: {}) +, sourceVersion +, pythonVersion +, hash +, passthruFun +}: + +# This version of PyPy is primarily added to speed-up translation of +# our PyPy source build when developing that expression. + +let + isPy3k = majorVersion == "3"; + passthru = passthruFun { + inherit self sourceVersion pythonVersion packageOverrides; + implementation = "pypy"; + libPrefix = "pypy${pythonVersion}"; + executable = "pypy${lib.optionalString isPy3k "3"}"; + sitePackages = "site-packages"; + hasDistutilsCxxPatch = false; + + # Not possible to cross-compile with. + pythonOnBuildForBuild = throw "${pname} does not support cross compilation"; + pythonOnBuildForHost = self; + pythonOnBuildForTarget = throw "${pname} does not support cross compilation"; + pythonOnHostForHost = throw "${pname} does not support cross compilation"; + pythonOnTargetForTarget = throw "${pname} does not support cross compilation"; + }; + pname = "${passthru.executable}_prebuilt"; + version = with sourceVersion; "${major}.${minor}.${patch}"; + + majorVersion = lib.versions.major pythonVersion; + + downloadUrls = { + aarch64-linux = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-aarch64.tar.bz2"; + x86_64-linux = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-linux64.tar.bz2"; + aarch64-darwin = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-macos_arm64.tar.bz2"; + x86_64-darwin = "https://downloads.python.org/pypy/pypy${pythonVersion}-v${version}-macos_x86_64.tar.bz2"; + }; + +in with passthru; stdenv.mkDerivation { + inherit pname version; + + src = fetchurl { + url = downloadUrls.${stdenv.system} or (throw "Unsupported system: ${stdenv.system}"); + inherit hash; + }; + + buildInputs = [ + bzip2 + expat + gdbm + ncurses6 + sqlite + zlib + stdenv.cc.cc.libgcc or null + ] ++ lib.optionals stdenv.isLinux [ + tcl-8_5 + tk-8_5 + ] ++ lib.optionals stdenv.isDarwin [ + tcl-8_6 + tk-8_6 + ]; + + nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib + echo "Moving files to $out" + mv -t $out bin include lib-python lib_pypy site-packages + mv $out/bin/libpypy*-c${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/ + ${lib.optionalString stdenv.isLinux '' + mv lib/libffi.so.6* $out/lib/ + rm $out/bin/*.debug + ''} + + echo "Removing bytecode" + find . -name "__pycache__" -type d -depth -delete + + # Include a sitecustomize.py file + cp ${../sitecustomize.py} $out/${sitePackages}/sitecustomize.py + + runHook postInstall + ''; + + preFixup = lib.optionalString (stdenv.isLinux) '' + find $out/{lib,lib_pypy*} -name "*.so" \ + -exec patchelf \ + --replace-needed libtinfow.so.6 libncursesw.so.6 \ + --replace-needed libgdbm.so.4 libgdbm_compat.so.4 {} \; + '' + lib.optionalString (stdenv.isDarwin) '' + install_name_tool \ + -change \ + @rpath/lib${executable}-c.dylib \ + $out/lib/lib${executable}-c.dylib \ + $out/bin/${executable} + install_name_tool \ + -change \ + /opt/homebrew${lib.optionalString stdenv.isx86_64 "_x86_64"}/opt/tcl-tk/lib/libtcl8.6.dylib \ + ${tcl-8_6}/lib/libtcl8.6.dylib \ + $out/lib_pypy/_tkinter/*.so + install_name_tool \ + -change \ + /opt/homebrew${lib.optionalString stdenv.isx86_64 "_x86_64"}/opt/tcl-tk/lib/libtk8.6.dylib \ + ${tk-8_6}/lib/libtk8.6.dylib \ + $out/lib_pypy/_tkinter/*.so + ''; + + doInstallCheck = true; + + # Check whether importing of (extension) modules functions + installCheckPhase = let + modules = [ + "ssl" + "sys" + "curses" + ] ++ lib.optionals (!isPy3k) [ + "Tkinter" + ] ++ lib.optionals isPy3k [ + "tkinter" + ]; + imports = lib.concatMapStringsSep "; " (x: "import ${x}") modules; + in '' + echo "Testing whether we can import modules" + $out/bin/${executable} -c '${imports}' + ''; + + setupHook = python-setup-hook sitePackages; + + donPatchElf = true; + dontStrip = true; + + inherit passthru; + + meta = with lib; { + homepage = "http://pypy.org/"; + description = "Fast, compliant alternative implementation of the Python language (${pythonVersion})"; + license = licenses.mit; + platforms = lib.mapAttrsToList (arch: _: arch) downloadUrls; + }; + +} diff --git a/pkgs/by-name/py/python/pypy/sqlite_paths.patch b/pkgs/by-name/py/python/pypy/sqlite_paths.patch new file mode 100644 index 0000000..42de7ef --- /dev/null +++ b/pkgs/by-name/py/python/pypy/sqlite_paths.patch @@ -0,0 +1,12 @@ +diff -ur a/lib_pypy/_sqlite3_build.py b/lib_pypy/_sqlite3_build.py +--- a/lib_pypy/_sqlite3_build.py 2021-04-12 01:11:48.000000000 -0400 ++++ b/lib_pypy/_sqlite3_build.py 2021-07-14 18:08:33.000000000 -0400 +@@ -301,6 +301,8 @@ + else: + extra_args = dict( + libraries=libraries, ++ include_dirs=['@dev@/include'], ++ library_dirs=['@out@/lib'] + ) + + SOURCE = """ diff --git a/pkgs/by-name/py/python/pypy/tk_tcl_paths.patch b/pkgs/by-name/py/python/pypy/tk_tcl_paths.patch new file mode 100644 index 0000000..cf1bcdd --- /dev/null +++ b/pkgs/by-name/py/python/pypy/tk_tcl_paths.patch @@ -0,0 +1,29 @@ +--- a/lib_pypy/_tkinter/tklib_build.py ++++ b/lib_pypy/_tkinter/tklib_build.py +@@ -17,23 +17,14 @@ elif sys.platform == 'win32': + incdirs = [] + linklibs = ['tcl85', 'tk85'] + libdirs = [] +-elif sys.platform == 'darwin': +- # homebrew +- homebrew = os.environ.get('HOMEBREW_PREFIX', '') +- incdirs = ['/usr/local/opt/tcl-tk/include'] +- linklibs = ['tcl8.6', 'tk8.6'] +- libdirs = [] +- if homebrew: +- incdirs.append(homebrew + '/include') +- libdirs.append(homebrew + '/opt/tcl-tk/lib') + else: + # On some Linux distributions, the tcl and tk libraries are + # stored in /usr/include, so we must check this case also +- libdirs = [] ++ libdirs = ["@tcl@/lib", "@tk@/lib"] + found = False + for _ver in ['', '8.6', '8.5']: +- incdirs = ['/usr/include/tcl' + _ver] +- linklibs = ['tcl' + _ver, 'tk' + _ver] ++ incdirs = ['@tcl_dev@/include', '@tk_dev@/include'] ++ linklibs = ['@tcl_libprefix@', '@tk_libprefix@'] + if os.path.isdir(incdirs[0]): + found = True + break diff --git a/pkgs/by-name/py/python/python-modules/aiohttp/default.nix b/pkgs/by-name/py/python/python-modules/aiohttp/default.nix new file mode 100644 index 0000000..e46b598 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/aiohttp/default.nix @@ -0,0 +1,138 @@ +{ lib +, stdenv +, buildPythonPackage +, pythonOlder +, fetchFromGitHub +, substituteAll +, llhttp +# build_requires +, cython +, setuptools +# install_requires +, attrs +, multidict +, async-timeout +, yarl +, frozenlist +, aiosignal +, aiodns +, brotli +# tests_require +, freezegun +, gunicorn +, pytest-mock +, pytest7CheckHook +, python-on-whales +, re-assert +, trustme +}: + +buildPythonPackage rec { + pname = "aiohttp"; + version = "3.9.3"; + pyproject = true; + + disabled = pythonOlder "3.8"; + + src = fetchFromGitHub { + owner = "aio-libs"; + repo = "aiohttp"; + rev = "refs/tags/v${version}"; + hash = "sha256-dEeMHruFJ1o0J6VUJcpUk7LhEC8sV8hUKXoKcd618lE="; + }; + + patches = [ + (substituteAll { + src = ./unvendor-llhttp.patch; + llhttpDev = lib.getDev llhttp; + llhttpLib = lib.getLib llhttp; + }) + ]; + + postPatch = '' + sed -i '/--cov/d' setup.cfg + + rm -r vendor + patchShebangs tools + touch .git # tools/gen.py uses .git to find the project root + ''; + + nativeBuildInputs = [ + cython + setuptools + ]; + + preBuild = '' + make cythonize + ''; + + propagatedBuildInputs = [ + attrs + multidict + async-timeout + yarl + frozenlist + aiosignal + aiodns + brotli + ]; + + # NOTE: pytest-xdist cannot be added because it is flaky. See https://github.com/NixOS/nixpkgs/issues/230597 for more info. + nativeCheckInputs = [ + freezegun + gunicorn + pytest-mock + pytest7CheckHook + python-on-whales + re-assert + ] ++ lib.optionals (!(stdenv.isDarwin && stdenv.isAarch64)) [ + # Optional test dependency. Depends indirectly on pyopenssl, which is + # broken on aarch64-darwin. + trustme + ]; + + disabledTests = [ + # Disable tests that require network access + "test_client_session_timeout_zero" + "test_mark_formdata_as_processed" + "test_requote_redirect_url_default" + # Disable tests that trigger deprecation warnings in pytest + "test_async_with_session" + "test_session_close_awaitable" + "test_close_run_until_complete_not_deprecated" + # https://github.com/aio-libs/aiohttp/issues/7130 + "test_static_file_if_none_match" + "test_static_file_if_match" + "test_static_file_if_modified_since_past_date" + # don't run benchmarks + "test_import_time" + ] ++ lib.optionals stdenv.is32bit [ + "test_cookiejar" + ] ++ lib.optionals stdenv.isDarwin [ + "test_addresses" # https://github.com/aio-libs/aiohttp/issues/3572, remove >= v4.0.0 + "test_close" + ]; + + disabledTestPaths = [ + "tests/test_proxy_functional.py" # FIXME package proxy.py + ]; + + __darwinAllowLocalNetworking = true; + + # aiohttp in current folder shadows installed version + preCheck = '' + rm -r aiohttp + touch tests/data.unknown_mime_type # has to be modified after 1 Jan 1990 + '' + lib.optionalString stdenv.isDarwin '' + # Work around "OSError: AF_UNIX path too long" + export TMPDIR="/tmp" + ''; + + meta = with lib; { + changelog = "https://github.com/aio-libs/aiohttp/blob/v${version}/CHANGES.rst"; + description = "Asynchronous HTTP Client/Server for Python and asyncio"; + license = licenses.asl20; + homepage = "https://github.com/aio-libs/aiohttp"; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/aiohttp/unvendor-llhttp.patch b/pkgs/by-name/py/python/python-modules/aiohttp/unvendor-llhttp.patch new file mode 100644 index 0000000..49b3e91 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/aiohttp/unvendor-llhttp.patch @@ -0,0 +1,60 @@ +diff --git a/Makefile b/Makefile +index 5769d2a1..f505dd81 100644 +--- a/Makefile ++++ b/Makefile +@@ -71,7 +71,7 @@ vendor/llhttp/node_modules: vendor/llhttp/package.json + generate-llhttp: .llhttp-gen + + .PHONY: cythonize +-cythonize: .install-cython $(PYXS:.pyx=.c) ++cythonize: $(PYXS:.pyx=.c) + + .install-deps: .install-cython $(PYXS:.pyx=.c) $(call to-hash,$(CYS) $(REQS)) + @python -m pip install -r requirements/dev.txt -c requirements/constraints.txt +diff --git a/aiohttp/_cparser.pxd b/aiohttp/_cparser.pxd +index 165dd61d..bc6bf86d 100644 +--- a/aiohttp/_cparser.pxd ++++ b/aiohttp/_cparser.pxd +@@ -10,7 +10,7 @@ from libc.stdint cimport ( + ) + + +-cdef extern from "../vendor/llhttp/build/llhttp.h": ++cdef extern from "@llhttpDev@/include/llhttp.h": + + struct llhttp__internal_s: + int32_t _index +diff --git a/setup.py b/setup.py +index 4d59a022..d87d5b69 100644 +--- a/setup.py ++++ b/setup.py +@@ -17,13 +17,6 @@ if sys.implementation.name != "cpython": + NO_EXTENSIONS = True + + +-if IS_GIT_REPO and not (HERE / "vendor/llhttp/README.md").exists(): +- print("Install submodules when building from git clone", file=sys.stderr) +- print("Hint:", file=sys.stderr) +- print(" git submodule update --init", file=sys.stderr) +- sys.exit(2) +- +- + # NOTE: makefile cythonizes all Cython modules + + extensions = [ +@@ -33,12 +26,11 @@ extensions = [ + [ + "aiohttp/_http_parser.c", + "aiohttp/_find_header.c", +- "vendor/llhttp/build/c/llhttp.c", +- "vendor/llhttp/src/native/api.c", +- "vendor/llhttp/src/native/http.c", + ], + define_macros=[("LLHTTP_STRICT_MODE", 0)], +- include_dirs=["vendor/llhttp/build"], ++ include_dirs=["@llhttpDev@/include"], ++ library_dirs=["@llhttpLib@/lib"], ++ libraries=["llhttp"], + ), + Extension("aiohttp._helpers", ["aiohttp/_helpers.c"]), + Extension("aiohttp._http_writer", ["aiohttp/_http_writer.c"]), diff --git a/pkgs/by-name/py/python/python-modules/alabaster/default.nix b/pkgs/by-name/py/python/python-modules/alabaster/default.nix new file mode 100644 index 0000000..b2b77a3 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/alabaster/default.nix @@ -0,0 +1,30 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pygments +}: + +buildPythonPackage rec { + pname = "alabaster"; + version = "0.7.16"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-dai5nCil2tUN1/jM3UR6Eh3bOJLanlPRylzKMQbVjWU="; + }; + + nativeBuildInputs = [ flit-core ]; + + propagatedBuildInputs = [ pygments ]; + + # No tests included + doCheck = false; + + meta = with lib; { + homepage = "https://github.com/bitprophet/alabaster"; + description = "A Sphinx theme"; + license = licenses.bsd3; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/attrs/default.nix b/pkgs/by-name/py/python/python-modules/attrs/default.nix new file mode 100644 index 0000000..8e46432 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/attrs/default.nix @@ -0,0 +1,63 @@ +{ lib +, callPackage +, buildPythonPackage +, fetchPypi +, pythonOlder +, hatchling +}: + +buildPythonPackage rec { + pname = "attrs"; + version = "23.2.0"; + disabled = pythonOlder "3.7"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-k13DtSnCYvbPduUId9NaS9PB3hlP1B9HoreujxmXHzA="; + }; + + patches = [ + # hatch-vcs and hatch-fancy-pypi-readme depend on pytest, which depends on attrs + ./remove-hatch-plugins.patch + ]; + + postPatch = '' + substituteAllInPlace pyproject.toml + ''; + + nativeBuildInputs = [ + hatchling + ]; + + outputs = [ + "out" + "testout" + ]; + + postInstall = '' + # Install tests as the tests output. + mkdir $testout + cp -R conftest.py tests $testout + ''; + + pythonImportsCheck = [ + "attr" + ]; + + # pytest depends on attrs, so we can't do this out-of-the-box. + # Instead, we do this as a passthru.tests test. + doCheck = false; + + passthru.tests = { + pytest = callPackage ./tests.nix { }; + }; + + meta = with lib; { + description = "Python attributes without boilerplate"; + homepage = "https://github.com/python-attrs/attrs"; + changelog = "https://github.com/python-attrs/attrs/releases/tag/${version}"; + license = licenses.mit; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/attrs/remove-hatch-plugins.patch b/pkgs/by-name/py/python/python-modules/attrs/remove-hatch-plugins.patch new file mode 100644 index 0000000..cf743ba --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/attrs/remove-hatch-plugins.patch @@ -0,0 +1,78 @@ +diff --git a/pyproject.toml b/pyproject.toml +index 1c72fc2..ae45740 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: MIT + + [build-system] +-requires = ["hatchling", "hatch-vcs", "hatch-fancy-pypi-readme>=23.2.0"] ++requires = ["hatchling"] + build-backend = "hatchling.build" + + +@@ -26,7 +26,8 @@ classifiers = [ + "Typing :: Typed", + ] + dependencies = ["importlib_metadata;python_version<'3.8'"] +-dynamic = ["version", "readme"] ++dynamic = ["readme"] ++version = "@version@" + + [project.optional-dependencies] + tests-mypy = [ +@@ -70,54 +71,9 @@ Funding = "https://github.com/sponsors/hynek" + Tidelift = "https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi" + + +-[tool.hatch.version] +-source = "vcs" +-raw-options = { local_scheme = "no-local-version" } +- + [tool.hatch.build.targets.wheel] + packages = ["src/attr", "src/attrs"] + +-[tool.hatch.metadata.hooks.fancy-pypi-readme] +-content-type = "text/markdown" +- +-# PyPI doesn't support the tag. +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +-text = """

+- +- attrs +- +-

+-""" +- +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +-path = "README.md" +-start-after = "" +- +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +-text = """ +- +-## Release Information +- +-""" +- +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +-path = "CHANGELOG.md" +-pattern = "\n(###.+?\n)## " +- +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +-text = """ +- +---- +- +-[Full changelog](https://www.attrs.org/en/stable/changelog.html) +-""" +- +-# Point sponsor image URLs to versions. +-[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] +-pattern = '\/latest\/_static/sponsors' +-replacement = '/$HFPR_VERSION/_static/sponsors' +- +- + [tool.pytest.ini_options] + addopts = ["-ra", "--strict-markers", "--strict-config"] + xfail_strict = true diff --git a/pkgs/by-name/py/python/python-modules/attrs/tests.nix b/pkgs/by-name/py/python/python-modules/attrs/tests.nix new file mode 100644 index 0000000..2614716 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/attrs/tests.nix @@ -0,0 +1,22 @@ +{ buildPythonPackage +, pytestCheckHook +, attrs +, hypothesis +}: + +buildPythonPackage { + pname = "attrs-tests"; + inherit (attrs) version; + format = "other"; + + srcs = attrs.testout; + + dontBuild = true; + dontInstall = true; + + nativeCheckInputs = [ + attrs + hypothesis + pytestCheckHook + ]; +} diff --git a/pkgs/by-name/py/python/python-modules/babel/default.nix b/pkgs/by-name/py/python/python-modules/babel/default.nix new file mode 100644 index 0000000..2e2a1a6 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/babel/default.nix @@ -0,0 +1,65 @@ +{ lib +, buildPythonPackage +, fetchPypi +, isPyPy +, pythonAtLeast +, pythonOlder + +# build-system +, setuptools + +# tests +, freezegun +, pytestCheckHook +, pytz +, tzdata +}: + +buildPythonPackage rec { + pname = "babel"; + version = "2.14.0"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + pname = "Babel"; + inherit version; + hash = "sha256-aRmGfbA2OYuiHrXHoPayirjLw656c6ROvjSudKTn02M="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [ + pytz + ]; + + # including backports.zoneinfo for python<3.9 yields infinite recursion + doCheck = pythonAtLeast "3.9"; + + nativeCheckInputs = [ + freezegun + pytestCheckHook + # https://github.com/python-babel/babel/issues/988#issuecomment-1521765563 + pytz + ] ++ lib.optionals isPyPy [ + tzdata + ]; + + disabledTests = [ + # fails on days switching from and to daylight saving time in EST + # https://github.com/python-babel/babel/issues/988 + "test_format_time" + ]; + + meta = with lib; { + homepage = "https://babel.pocoo.org/"; + changelog = "https://github.com/python-babel/babel/releases/tag/v${version}"; + description = "Collection of internationalizing tools"; + mainProgram = "pybabel"; + license = licenses.bsd3; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/backports-zoneinfo/default.nix b/pkgs/by-name/py/python/python-modules/backports-zoneinfo/default.nix new file mode 100644 index 0000000..ff51968 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/backports-zoneinfo/default.nix @@ -0,0 +1,81 @@ +{ lib, buildPythonPackage, fetchFromGitHub +, pythonAtLeast +, pythonOlder +, python +, substituteAll +, importlib-resources +, tzdata +, hypothesis +, pytestCheckHook +, fetchpatch +}: + +buildPythonPackage rec { + pname = "backports-zoneinfo"; + version = "0.2.1"; + format = "setuptools"; + + disabled = pythonAtLeast "3.9"; + + src = fetchFromGitHub { + owner = "pganssle"; + repo = "zoneinfo"; + rev = version; + hash = "sha256-00xdDOVdDanfsjQTd3yjMN2RFGel4cWRrAA3CvSnl24="; + }; + + # Make sure test data update patch applies + prePatch = '' + substituteInPlace tests/data/zoneinfo_data.json --replace \"2020a\" \"2021a\" + ''; + + patches = [ + # Update test suite's test data to zoneinfo 2022a + # https://github.com/pganssle/zoneinfo/pull/115 + (fetchpatch { + name = "backports-zoneinfo-2022a-update-test-data1.patch"; + url = "https://github.com/pganssle/zoneinfo/pull/115/commits/837e2a0f9f1a1332e4233f83e3648fa564a9ec9e.patch"; + sha256 = "196knwa212mr0b7zsh8papzr3f5mii87gcjjjx1r9zzvmk3g3ri0"; + }) + (fetchpatch { + name = "backports-zoneinfo-2022a-update-test-data2.patch"; + url = "https://github.com/pganssle/zoneinfo/pull/115/commits/9fd330265b177916d6182249439bb40d5691eb58.patch"; + sha256 = "1zxa5bkwi8hbnh4c0qv72wv6vdp5jlxqizfjsc05ymzvwa99cf75"; + }) + + (substituteAll { + name = "zoneinfo-path"; + src = ./zoneinfo.patch; + zoneinfo = "${tzdata}/${python.sitePackages}/tzdata/zoneinfo"; + }) + ]; + + propagatedBuildInputs = [ + tzdata + ] ++ lib.optionals (pythonOlder "3.7") [ + importlib-resources + ]; + + pythonImportsCheck = [ "backports.zoneinfo" ]; + + nativeCheckInputs = [ + hypothesis + pytestCheckHook + ]; + + disabledTests = [ + # AssertionError: 'AEDT' != 'AEST' + "test_folds_and_gaps" + # AssertionError: 0 != 1 : (datetime.datetime(1917, 3, 25, 2, 0, 1, tzinfo=backports.zoneinfo.ZoneInfo(key='Australia/Sydney')), datetime.datetime(1917, 3, 24, 15, 0, tzinfo=datetime.timezone.utc)) + "test_folds_from_utc" + # backports.zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Eurasia/Badzone' + "test_bad_keys" + ]; + + meta = with lib; { + description = "Backport of the standard library module zoneinfo"; + homepage = "https://github.com/pganssle/zoneinfo"; + license = licenses.asl20; + maintainers = with maintainers; [ jonringer ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/backports-zoneinfo/zoneinfo.patch b/pkgs/by-name/py/python/python-modules/backports-zoneinfo/zoneinfo.patch new file mode 100644 index 0000000..69dd750 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/backports-zoneinfo/zoneinfo.patch @@ -0,0 +1,17 @@ +diff --git a/src/backports/zoneinfo/_tzpath.py b/src/backports/zoneinfo/_tzpath.py +index 9baaf6b..3f842af 100644 +--- a/src/backports/zoneinfo/_tzpath.py ++++ b/src/backports/zoneinfo/_tzpath.py +@@ -24,10 +24,7 @@ def reset_tzpath(to=None): + base_tzpath = _parse_python_tzpath(env_var) + elif sys.platform != "win32": + base_tzpath = [ +- "/usr/share/zoneinfo", +- "/usr/lib/zoneinfo", +- "/usr/share/lib/zoneinfo", +- "/etc/zoneinfo", ++ "@zoneinfo@" + ] + + base_tzpath.sort(key=lambda x: not os.path.exists(x)) + diff --git a/pkgs/by-name/py/python/python-modules/bootstrap/build/default.nix b/pkgs/by-name/py/python/python-modules/bootstrap/build/default.nix new file mode 100644 index 0000000..f4e49bd --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/bootstrap/build/default.nix @@ -0,0 +1,70 @@ +{ lib +, stdenv +, python +, build +, flit-core +, installer +, packaging +, pyproject-hooks +, tomli +, makeWrapper +}: +let + buildBootstrapPythonModule = basePackage: attrs: stdenv.mkDerivation ({ + pname = "${python.libPrefix}-bootstrap-${basePackage.pname}"; + inherit (basePackage) version src meta; + + nativeBuildInputs = [ makeWrapper ]; + + buildPhase = '' + runHook preBuild + + PYTHONPATH="${flit-core}/${python.sitePackages}" \ + ${python.interpreter} -m flit_core.wheel + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + PYTHONPATH="${installer}/${python.sitePackages}" \ + ${python.interpreter} -m installer \ + --destdir "$out" --prefix "" dist/*.whl + + runHook postInstall + ''; + } // attrs); + + bootstrap-packaging = buildBootstrapPythonModule packaging {}; + + bootstrap-pyproject-hooks = buildBootstrapPythonModule pyproject-hooks {}; + + bootstrap-tomli = buildBootstrapPythonModule tomli {}; + + sitePkgs = python.sitePackages; +in +buildBootstrapPythonModule build { + # like the installPhase above, but wrapping the pyproject-build command + # to set up PYTHONPATH with the correct dependencies. + # This allows using `pyproject-build` without propagating its dependencies + # into the build environment, which is necessary to prevent + # pythonCatchConflicts from raising false positive alerts. + # This would happen whenever the package to build has a dependency on + # another version of a package that is also a dependency of pyproject-build. + installPhase = '' + runHook preInstall + + PYTHONPATH="${installer}/${python.sitePackages}" \ + ${python.interpreter} -m installer \ + --destdir "$out" --prefix "" dist/*.whl + + wrapProgram $out/bin/pyproject-build \ + --prefix PYTHONPATH : "$out/${sitePkgs}" \ + --prefix PYTHONPATH : "${bootstrap-pyproject-hooks}/${sitePkgs}" \ + --prefix PYTHONPATH : "${bootstrap-packaging}/${sitePkgs}" \ + --prefix PYTHONPATH : "${bootstrap-tomli}/${sitePkgs}" + + runHook postInstall + ''; +} diff --git a/pkgs/by-name/py/python/python-modules/bootstrap/flit-core/default.nix b/pkgs/by-name/py/python/python-modules/bootstrap/flit-core/default.nix new file mode 100644 index 0000000..43fec03 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/bootstrap/flit-core/default.nix @@ -0,0 +1,29 @@ +{ lib +, stdenv +, python +, flit-core +}: + +stdenv.mkDerivation rec { + pname = "${python.libPrefix}-bootstrap-${flit-core.pname}"; + inherit (flit-core) version src patches meta; + + sourceRoot = "${src.name}/flit_core"; + + buildPhase = '' + runHook preBuild + + ${python.interpreter} -m flit_core.wheel + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + ${python.interpreter} bootstrap_install.py dist/flit_core-*.whl \ + --install-root "$out" --installdir "/${python.sitePackages}" + + runHook postInstall + ''; +} diff --git a/pkgs/by-name/py/python/python-modules/bootstrap/installer/default.nix b/pkgs/by-name/py/python/python-modules/bootstrap/installer/default.nix new file mode 100644 index 0000000..a3944ba --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/bootstrap/installer/default.nix @@ -0,0 +1,29 @@ +{ lib +, stdenv +, python +, flit-core +, installer +}: + +stdenv.mkDerivation { + pname = "${python.libPrefix}-bootstrap-${installer.pname}"; + inherit (installer) version src patches meta; + + buildPhase = '' + runHook preBuild + + PYTHONPATH="${flit-core}/${python.sitePackages}" \ + ${python.interpreter} -m flit_core.wheel + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + PYTHONPATH=src ${python.interpreter} -m installer \ + --destdir "$out" --prefix "" dist/installer-*.whl + + runHook postInstall + ''; +} diff --git a/pkgs/by-name/py/python/python-modules/bootstrap/packaging/default.nix b/pkgs/by-name/py/python/python-modules/bootstrap/packaging/default.nix new file mode 100644 index 0000000..f8a10d4 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/bootstrap/packaging/default.nix @@ -0,0 +1,30 @@ +{ stdenv +, python +, flit-core +, installer +, packaging +}: + +stdenv.mkDerivation { + pname = "${python.libPrefix}-bootstrap-${packaging.pname}"; + inherit (packaging) version src meta; + + buildPhase = '' + runHook preBuild + + PYTHONPATH="${flit-core}/${python.sitePackages}" \ + ${python.interpreter} -m flit_core.wheel + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + PYTHONPATH="${installer}/${python.sitePackages}" \ + ${python.interpreter} -m installer \ + --destdir "$out" --prefix "" dist/*.whl + + runHook postInstall + ''; +} diff --git a/pkgs/by-name/py/python/python-modules/brotlicffi/default.nix b/pkgs/by-name/py/python/python-modules/brotlicffi/default.nix new file mode 100644 index 0000000..9d246d3 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/brotlicffi/default.nix @@ -0,0 +1,49 @@ +{ lib +, fetchFromGitHub +, buildPythonPackage +, pythonOlder +, cffi +, brotli +}: + +buildPythonPackage rec { + pname = "brotlicffi"; + version = "1.1.0.0"; + format = "setuptools"; + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "python-hyper"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-oW4y1WBJ7+4XwNwwSSR0qUqN03cZYXUYQ6EAwce9dzI="; + }; + + buildInputs = [ + brotli + ]; + + propagatedNativeBuildInputs = [ + cffi + ]; + + propagatedBuildInputs = [ + cffi + ]; + + preBuild = '' + export USE_SHARED_BROTLI=1 + ''; + + # Test data is not available, only when using libbrotli git checkout + doCheck = false; + + pythonImportsCheck = [ "brotlicffi" ]; + + meta = with lib; { + description = "Python CFFI bindings to the Brotli library"; + homepage = "https://github.com/python-hyper/brotlicffi"; + license = licenses.mit; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/build/default.nix b/pkgs/by-name/py/python/python-modules/build/default.nix new file mode 100644 index 0000000..53c9b8c --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/build/default.nix @@ -0,0 +1,113 @@ +{ lib +, stdenv +, buildPythonPackage +, fetchFromGitHub +, flit-core +, packaging +, pythonOlder +, pyproject-hooks +, tomli +# for passthru.tests +# , filelock +# , pytest-mock +# , pytest-rerunfailures +# , pytest-xdist +# , pytestCheckHook +# , setuptools +# , wheel +}: + +buildPythonPackage rec { + pname = "build"; + version = "1.1.1"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "pypa"; + repo = "build"; + rev = "refs/tags/${version}"; + hash = "sha256-SGWpm+AGIfqKMpDfmz2aMYmcs+XVREbHIXSuU4R7U/k="; + }; + + postPatch = '' + # not strictly required, causes circular dependency cycle + sed -i '/importlib-metadata >= 4.6/d' pyproject.toml + ''; + + nativeBuildInputs = [ + flit-core + ]; + + propagatedBuildInputs = [ + packaging + pyproject-hooks + ] ++ lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + # We need to disable tests because this package is part of the bootstrap chain + # and its test dependencies cannot be built yet when this is being built. + doCheck = false; + + # passthru.tests = { + # pytest = buildPythonPackage { + # pname = "${pname}-pytest"; + # inherit src version; + # format = "other"; + + # dontBuild = true; + # dontInstall = true; + + # nativeCheckInputs = [ + # build + # filelock + # pytest-mock + # pytest-rerunfailures + # pytest-xdist + # pytestCheckHook + # setuptools + # wheel + # ]; + + # pytestFlagsArray = [ + # "-W" + # "ignore::DeprecationWarning" + # ]; + + # __darwinAllowLocalNetworking = true; + + # disabledTests = [ + # # Tests often fail with StopIteration + # "test_isolat" + # "test_default_pip_is_never_too_old" + # "test_build" + # "test_with_get_requires" + # "test_init" + # "test_output" + # "test_wheel_metadata" + # ] ++ lib.optionals stdenv.isDarwin [ + # # Expects Apple's Python and its quirks + # "test_can_get_venv_paths_with_conflicting_default_scheme" + # ]; + # }; + # }; + + pythonImportsCheck = [ + "build" + ]; + + meta = with lib; { + mainProgram = "pyproject-build"; + description = "Simple, correct PEP517 package builder"; + longDescription = '' + build will invoke the PEP 517 hooks to build a distribution package. It + is a simple build tool and does not perform any dependency management. + ''; + homepage = "https://github.com/pypa/build"; + changelog = "https://github.com/pypa/build/blob/${version}/CHANGELOG.rst"; + license = licenses.mit; + maintainers = teams.python.members ++ [ maintainers.fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/buildcatrust/default.nix b/pkgs/by-name/py/python/python-modules/buildcatrust/default.nix new file mode 100644 index 0000000..5fc3eab --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/buildcatrust/default.nix @@ -0,0 +1,43 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "buildcatrust"; + version = "0.3.0"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-Ac10CZdihFBmr5LE6xFKx4+zr2n5nyR23px6N4vN05M="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + disabledTestPaths = [ + # Non-hermetic, needs internet access (e.g. attempts to retrieve NSS store). + "buildcatrust/tests/test_nonhermetic.py" + ]; + + pythonImportsCheck = [ + "buildcatrust" + "buildcatrust.cli" + ]; + + meta = with lib; { + description = "Build SSL/TLS trust stores"; + mainProgram = "buildcatrust"; + homepage = "https://github.com/lukegb/buildcatrust"; + license = licenses.mit; + maintainers = with maintainers; [ lukegb ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/calver/default.nix b/pkgs/by-name/py/python/python-modules/calver/default.nix new file mode 100644 index 0000000..4b400f2 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/calver/default.nix @@ -0,0 +1,48 @@ +{ lib +, buildPythonPackage +, pythonOlder +, fetchFromGitHub +, pretend +, pytestCheckHook +}: + +let + self = buildPythonPackage rec { + pname = "calver"; + version = "2022.06.26"; + format = "setuptools"; + + disabled = pythonOlder "3.5"; + + src = fetchFromGitHub { + owner = "di"; + repo = "calver"; + rev = version; + hash = "sha256-YaXTkeUazwzghCX96Wfx39hGvukWKtHMLLeyF9OeiZI="; + }; + + postPatch = '' + substituteInPlace setup.py \ + --replace "version=calver_version(True)" 'version="${version}"' + ''; + + doCheck = false; # avoid infinite recursion with hatchling + + nativeCheckInputs = [ + pretend + pytestCheckHook + ]; + + pythonImportsCheck = [ "calver" ]; + + passthru.tests.calver = self.overridePythonAttrs { doCheck = true; }; + + meta = { + description = "Setuptools extension for CalVer package versions"; + homepage = "https://github.com/di/calver"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ dotlambda ]; + }; + }; +in + self diff --git a/pkgs/by-name/py/python/python-modules/certifi/default.nix b/pkgs/by-name/py/python/python-modules/certifi/default.nix new file mode 100644 index 0000000..73492ba --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/certifi/default.nix @@ -0,0 +1,58 @@ +{ lib +, buildPythonPackage +, cacert +, pythonOlder +, fetchFromGitHub +, setuptools +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "certifi"; + version = "2024.02.02"; + pyproject = true; + + disabled = pythonOlder "3.6"; + + src = fetchFromGitHub { + owner = pname; + repo = "python-certifi"; + rev = version; + hash = "sha256-gnWJjZy5E/0lvAeLftXNtcHH6RHL/dUomXOBgumiWX8="; + }; + + patches = [ + # Add support for NIX_SSL_CERT_FILE + ./env.patch + ]; + + postPatch = '' + # Use our system-wide ca-bundle instead of the bundled one + rm -v "certifi/cacert.pem" + ln -snvf "${cacert}/etc/ssl/certs/ca-bundle.crt" "certifi/cacert.pem" + ''; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedNativeBuildInputs = [ + # propagate cacerts setup-hook to set up `NIX_SSL_CERT_FILE` + cacert + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "certifi" + ]; + + meta = with lib; { + homepage = "https://github.com/certifi/python-certifi"; + description = "Python package for providing Mozilla's CA Bundle"; + license = licenses.isc; + maintainers = with maintainers; [ koral ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/certifi/env.patch b/pkgs/by-name/py/python/python-modules/certifi/env.patch new file mode 100644 index 0000000..97a48b4 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/certifi/env.patch @@ -0,0 +1,87 @@ +diff --git a/certifi/core.py b/certifi/core.py +index 91f538b..1110ce0 100644 +--- a/certifi/core.py ++++ b/certifi/core.py +@@ -4,6 +4,7 @@ certifi.py + + This module returns the installation location of cacert.pem or its contents. + """ ++import os + import sys + import atexit + +@@ -11,12 +12,21 @@ def exit_cacert_ctx() -> None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] + + ++def get_cacert_path_from_environ(): ++ path = os.environ.get("NIX_SSL_CERT_FILE", None) ++ ++ if path == "/no-cert-file.crt": ++ return None ++ ++ return path ++ ++ + if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None +- _CACERT_PATH = None ++ _CACERT_PATH = get_cacert_path_from_environ() + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file +@@ -44,6 +54,8 @@ if sys.version_info >= (3, 11): + return _CACERT_PATH + + def contents() -> str: ++ if _CACERT_PATH is not None: ++ return open(_CACERT_PATH, encoding="utf-8").read() + return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") + + elif sys.version_info >= (3, 7): +@@ -51,7 +63,7 @@ elif sys.version_info >= (3, 7): + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None +- _CACERT_PATH = None ++ _CACERT_PATH = get_cacert_path_from_environ() + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the +@@ -80,7 +92,9 @@ elif sys.version_info >= (3, 7): + return _CACERT_PATH + + def contents() -> str: +- return read_text("certifi", "cacert.pem", encoding="ascii") ++ if _CACERT_PATH is not None: ++ return open(_CACERT_PATH, encoding="utf-8").read() ++ return read_text("certifi", "cacert.pem", encoding="utf-8") + + else: + import os +@@ -90,6 +104,8 @@ else: + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + ++ _CACERT_PATH = get_cacert_path_from_environ() ++ + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set +@@ -108,7 +124,13 @@ else: + def where() -> str: + f = os.path.dirname(__file__) + ++ if _CACERT_PATH is not None: ++ return _CACERT_PATH ++ + return os.path.join(f, "cacert.pem") + + def contents() -> str: ++ if _CACERT_PATH is not None: ++ with open(_CACERT_PATH, encoding="utf-8") as data: ++ return data.read() + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/pkgs/by-name/py/python/python-modules/cffi/clang-pointer-substraction-warning.diff b/pkgs/by-name/py/python/python-modules/cffi/clang-pointer-substraction-warning.diff new file mode 100644 index 0000000..75b2677 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cffi/clang-pointer-substraction-warning.diff @@ -0,0 +1,11 @@ +diff -r c649a735cf82 testing/support.py +--- a/testing/support.py Thu Feb 23 05:42:01 2023 +0100 ++++ b/testing/support.py Sat May 20 21:46:56 2023 -0400 +@@ -112,6 +112,7 @@ + '-Wno-unreachable-code'] + # special things for clang + extra_compile_args.append('-Qunused-arguments') ++ extra_compile_args.append('-Wno-null-pointer-subtraction') + else: + # assume a standard gcc + extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', diff --git a/pkgs/by-name/py/python/python-modules/cffi/darwin-use-libffi-closures.diff b/pkgs/by-name/py/python/python-modules/cffi/darwin-use-libffi-closures.diff new file mode 100644 index 0000000..4ef5127 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cffi/darwin-use-libffi-closures.diff @@ -0,0 +1,29 @@ +diff --git a/src/c/_cffi_backend.c b/src/c/_cffi_backend.c +index 537271f..9c3bf94 100644 +--- a/src/c/_cffi_backend.c ++++ b/src/c/_cffi_backend.c +@@ -103,11 +103,11 @@ + # define CFFI_CHECK_FFI_PREP_CIF_VAR 0 + # define CFFI_CHECK_FFI_PREP_CIF_VAR_MAYBE 0 + +-#elif defined(__APPLE__) && defined(FFI_AVAILABLE_APPLE) ++#elif defined(__APPLE__) + +-# define CFFI_CHECK_FFI_CLOSURE_ALLOC __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) ++# define CFFI_CHECK_FFI_CLOSURE_ALLOC 1 + # define CFFI_CHECK_FFI_CLOSURE_ALLOC_MAYBE 1 +-# define CFFI_CHECK_FFI_PREP_CLOSURE_LOC __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) ++# define CFFI_CHECK_FFI_PREP_CLOSURE_LOC 1 + # define CFFI_CHECK_FFI_PREP_CLOSURE_LOC_MAYBE 1 +-# define CFFI_CHECK_FFI_PREP_CIF_VAR __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) ++# define CFFI_CHECK_FFI_PREP_CIF_VAR 1 + # define CFFI_CHECK_FFI_PREP_CIF_VAR_MAYBE 1 +@@ -6422,7 +6422,7 @@ static PyObject *b_callback(PyObject *self, PyObject *args) + else + #endif + { +-#if defined(__APPLE__) && defined(FFI_AVAILABLE_APPLE) && !FFI_LEGACY_CLOSURE_API ++#if defined(__APPLE__) && !FFI_LEGACY_CLOSURE_API + PyErr_Format(PyExc_SystemError, "ffi_prep_closure_loc() is missing"); + goto error; + #else diff --git a/pkgs/by-name/py/python/python-modules/cffi/default.nix b/pkgs/by-name/py/python/python-modules/cffi/default.nix new file mode 100644 index 0000000..7b2547a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cffi/default.nix @@ -0,0 +1,83 @@ +{ lib +, stdenv +, buildPythonPackage +, isPyPy +, fetchPypi +, setuptools +, pytestCheckHook +, libffi +, pkg-config +, pycparser +, pythonAtLeast +}: + +if isPyPy then null else buildPythonPackage rec { + pname = "cffi"; + version = "1.16.0"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-vLPvQ+WGZbvaL7GYaY/K5ndkg+DEpjGqVkeAbCXgLMA="; + }; + + patches = [ + # + # Trusts the libffi library inside of nixpkgs on Apple devices. + # + # Based on some analysis I did: + # + # https://groups.google.com/g/python-cffi/c/xU0Usa8dvhk + # + # I believe that libffi already contains the code from Apple's fork that is + # deemed safe to trust in cffi. + # + ./darwin-use-libffi-closures.diff + ] ++ lib.optionals (stdenv.cc.isClang && lib.versionAtLeast (lib.getVersion stdenv.cc) "13") [ + # -Wnull-pointer-subtraction is enabled with -Wextra. Suppress it to allow the following tests + # to run and pass when cffi is built with newer versions of clang: + # - testing/cffi1/test_verify1.py::test_enum_usage + # - testing/cffi1/test_verify1.py::test_named_pointer_as_argument + ./clang-pointer-substraction-warning.diff + ]; + + postPatch = lib.optionalString stdenv.isDarwin '' + # Remove setup.py impurities + substituteInPlace setup.py \ + --replace "'-iwithsysroot/usr/include/ffi'" "" \ + --replace "'/usr/include/ffi'," "" \ + --replace '/usr/include/libffi' '${lib.getDev libffi}/include' + ''; + + nativeBuildInputs = [ + pkg-config + setuptools + ]; + + buildInputs = [ + libffi + ]; + + propagatedBuildInputs = [ + pycparser + ]; + + # The tests use -Werror but with python3.6 clang detects some unreachable code. + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang + "-Wno-unused-command-line-argument -Wno-unreachable-code -Wno-c++11-narrowing"; + + doCheck = !stdenv.hostPlatform.isMusl; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + meta = with lib; { + changelog = "https://github.com/python-cffi/cffi/releases/tag/v${version}"; + description = "Foreign Function Interface for Python calling C code"; + downloadPage = "https://github.com/python-cffi/cffi"; + homepage = "https://cffi.readthedocs.org/"; + license = licenses.mit; + maintainers = teams.python.members; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/chardet/default.nix b/pkgs/by-name/py/python/python-modules/chardet/default.nix new file mode 100644 index 0000000..f0170eb --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/chardet/default.nix @@ -0,0 +1,45 @@ +{ lib +, buildPythonPackage +, fetchPypi +, hypothesis +, pythonOlder +, pytestCheckHook +, setuptools +}: + +buildPythonPackage rec { + pname = "chardet"; + version = "5.2.0"; + format = "pyproject"; + disabled = pythonOlder "3.6"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-Gztv9HmoxBS8P6LAhSmVaVxKAm3NbQYzst0JLKOcHPc="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + nativeCheckInputs = [ + hypothesis + pytestCheckHook + ]; + + disabledTests = [ + # flaky; https://github.com/chardet/chardet/issues/256 + "test_detect_all_and_detect_one_should_agree" + ]; + + pythonImportsCheck = [ "chardet" ]; + + meta = with lib; { + changelog = "https://github.com/chardet/chardet/releases/tag/${version}"; + description = "Universal encoding detector"; + mainProgram = "chardetect"; + homepage = "https://github.com/chardet/chardet"; + license = licenses.lgpl21Plus; + maintainers = with maintainers; [ domenkozar ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/charset-normalizer/default.nix b/pkgs/by-name/py/python/python-modules/charset-normalizer/default.nix new file mode 100644 index 0000000..2a6a13d --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/charset-normalizer/default.nix @@ -0,0 +1,47 @@ +{ lib +, aiohttp +, buildPythonPackage +, fetchFromGitHub +, pytestCheckHook +, pythonOlder +, requests +}: + +buildPythonPackage rec { + pname = "charset-normalizer"; + version = "3.3.2"; + format = "setuptools"; + + disabled = pythonOlder "3.5"; + + src = fetchFromGitHub { + owner = "Ousret"; + repo = "charset_normalizer"; + rev = "refs/tags/${version}"; + hash = "sha256-T9lnlS05Ogb2eLLHYWFnjBtRaB/OBqGWHQ/2WLunrNY="; + }; + + postPatch = '' + substituteInPlace setup.cfg \ + --replace " --cov=charset_normalizer --cov-report=term-missing" "" + ''; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "charset_normalizer" + ]; + + passthru.tests = { inherit aiohttp requests; }; + + meta = with lib; { + description = "Python module for encoding and language detection"; + mainProgram = "normalizer"; + homepage = "https://charset-normalizer.readthedocs.io/"; + changelog = "https://github.com/Ousret/charset_normalizer/blob/${version}/CHANGELOG.md"; + license = licenses.mit; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/cython/0.nix b/pkgs/by-name/py/python/python-modules/cython/0.nix new file mode 100644 index 0000000..e0b6c02 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cython/0.nix @@ -0,0 +1,90 @@ +{ lib +, stdenv +, buildPythonPackage +, fetchPypi +, fetchpatch +, setuptools +, python +, pkg-config +, gdb +, numpy +, ncurses +}: + +let + excludedTests = [ "reimport_from_subinterpreter" ] + # cython's testsuite is not working very well with libc++ + # We are however optimistic about things outside of testsuite still working + ++ lib.optionals (stdenv.cc.isClang or false) [ "cpdef_extern_func" "libcpp_algo" ] + # Some tests in the test suite isn't working on aarch64. Disable them for + # now until upstream finds a workaround. + # Upstream issue here: https://github.com/cython/cython/issues/2308 + ++ lib.optionals stdenv.isAarch64 [ "numpy_memoryview" ] + ++ lib.optionals stdenv.isi686 [ "future_division" "overflow_check_longlong" ] + ; + +in buildPythonPackage rec { + pname = "cython"; + version = "0.29.36"; + pyproject = true; + + src = fetchPypi { + pname = "Cython"; + inherit version; + hash = "sha256-QcDP0tdU44PJ7rle/8mqSrhH0Ml0cHfd18Dctow7wB8="; + }; + + nativeBuildInputs = [ + pkg-config + setuptools + ]; + + nativeCheckInputs = [ + gdb numpy ncurses + ]; + + LC_ALL = "en_US.UTF-8"; + + patches = [ + # backport Cython 3.0 trashcan support (https://github.com/cython/cython/pull/2842) to 0.X series. + # it does not affect Python code unless the code explicitly uses the feature. + # trashcan support is needed to avoid stack overflows during object deallocation in sage (https://trac.sagemath.org/ticket/27267) + ./trashcan.patch + # The above commit introduces custom trashcan macros, as well as + # compiler changes to use them in Cython-emitted code. The latter + # change is still useful, but the former has been upstreamed as of + # Python 3.8, and the patch below makes Cython use the upstream + # trashcan macros whenever available. This is needed for Python + # 3.11 support, because the API used in Cython's implementation + # changed: https://github.com/cython/cython/pull/4475 + (fetchpatch { + name = "disable-trashcan.patch"; + url = "https://github.com/cython/cython/commit/e337825cdcf5e94d38ba06a0cb0188e99ce0cc92.patch"; + hash = "sha256-q0f63eetKrDpmP5Z4v8EuGxg26heSyp/62OYqhRoSso="; + }) + ]; + + checkPhase = '' + export HOME="$NIX_BUILD_TOP" + ${python.interpreter} runtests.py -j$NIX_BUILD_CORES \ + --no-code-style \ + ${lib.optionalString (builtins.length excludedTests != 0) + ''--exclude="(${builtins.concatStringsSep "|" excludedTests})"''} + ''; + + # https://github.com/cython/cython/issues/2785 + # Temporary solution + doCheck = false; + # doCheck = !stdenv.isDarwin; + + # force regeneration of generated code in source distributions + # https://github.com/cython/cython/issues/5089 + setupHook = ./setup-hook.sh; + + meta = { + changelog = "https://github.com/cython/cython/blob/${version}/CHANGES.rst"; + description = "An optimising static compiler for both the Python programming language and the extended Cython programming language"; + homepage = "https://cython.org"; + license = lib.licenses.asl20; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/cython/default.nix b/pkgs/by-name/py/python/python-modules/cython/default.nix new file mode 100644 index 0000000..2062ae0 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cython/default.nix @@ -0,0 +1,70 @@ +{ lib +, stdenv +, buildPythonPackage +, fetchPypi +, setuptools +, python +, pkg-config +, gdb +, numpy +, ncurses +}: + +let + excludedTests = [ "reimport_from_subinterpreter" ] + # cython's testsuite is not working very well with libc++ + # We are however optimistic about things outside of testsuite still working + ++ lib.optionals (stdenv.cc.isClang or false) [ "cpdef_extern_func" "libcpp_algo" ] + # Some tests in the test suite isn't working on aarch64. Disable them for + # now until upstream finds a workaround. + # Upstream issue here: https://github.com/cython/cython/issues/2308 + ++ lib.optionals stdenv.isAarch64 [ "numpy_memoryview" ] + ++ lib.optionals stdenv.isi686 [ "future_division" "overflow_check_longlong" ] + ; + +in buildPythonPackage rec { + pname = "cython"; + version = "3.0.9"; + pyproject = true; + + src = fetchPypi { + pname = "Cython"; + inherit version; + hash = "sha256-otNU8FnR8FXTTPqmLFtovHisLOq2QHFI1H+1CM87pPM="; + }; + + build-system = [ + pkg-config + setuptools + ]; + + nativeCheckInputs = [ + gdb numpy ncurses + ]; + + env.LC_ALL = "en_US.UTF-8"; + + checkPhase = '' + export HOME="$NIX_BUILD_TOP" + ${python.interpreter} runtests.py -j$NIX_BUILD_CORES \ + --no-code-style \ + ${lib.optionalString (builtins.length excludedTests != 0) + ''--exclude="(${builtins.concatStringsSep "|" excludedTests})"''} + ''; + + # https://github.com/cython/cython/issues/2785 + # Temporary solution + doCheck = false; + # doCheck = !stdenv.isDarwin; + + # force regeneration of generated code in source distributions + # https://github.com/cython/cython/issues/5089 + setupHook = ./setup-hook.sh; + + meta = { + changelog = "https://github.com/cython/cython/blob/${version}/CHANGES.rst"; + description = "An optimising static compiler for both the Python programming language and the extended Cython programming language"; + homepage = "https://cython.org"; + license = lib.licenses.asl20; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/cython/setup-hook.sh b/pkgs/by-name/py/python/python-modules/cython/setup-hook.sh new file mode 100644 index 0000000..c26330a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cython/setup-hook.sh @@ -0,0 +1,3 @@ +if [ -z "${dontForceRegenCython-}"]; then + export CYTHON_FORCE_REGEN=1 +fi diff --git a/pkgs/by-name/py/python/python-modules/cython/trashcan.patch b/pkgs/by-name/py/python/python-modules/cython/trashcan.patch new file mode 100644 index 0000000..398422e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/cython/trashcan.patch @@ -0,0 +1,354 @@ +From 1b77e35d848340f2c5f4c9b82965c25a0572d48f Mon Sep 17 00:00:00 2001 +From: Jeroen Demeyer +Date: Thu, 14 Feb 2019 10:02:41 +0100 +Subject: [PATCH] @cython.trashcan directive to enable the Python trashcan for + deallocations + +--- + Cython/Compiler/ModuleNode.py | 10 +++ + Cython/Compiler/Options.py | 2 + + Cython/Compiler/PyrexTypes.py | 8 +- + Cython/Compiler/Symtab.py | 18 +++- + Cython/Utility/ExtensionTypes.c | 43 ++++++++++ + tests/run/trashcan.pyx | 148 ++++++++++++++++++++++++++++++++ + 6 files changed, 227 insertions(+), 2 deletions(-) + create mode 100644 tests/run/trashcan.pyx + +diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py +index 56845330d..3a3e8a956 100644 +--- a/Cython/Compiler/ModuleNode.py ++++ b/Cython/Compiler/ModuleNode.py +@@ -1443,6 +1443,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): + + is_final_type = scope.parent_type.is_final_type + needs_gc = scope.needs_gc() ++ needs_trashcan = scope.needs_trashcan() + + weakref_slot = scope.lookup_here("__weakref__") if not scope.is_closure_class_scope else None + if weakref_slot not in scope.var_entries: +@@ -1481,6 +1482,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): + # running this destructor. + code.putln("PyObject_GC_UnTrack(o);") + ++ if needs_trashcan: ++ code.globalstate.use_utility_code( ++ UtilityCode.load_cached("PyTrashcan", "ExtensionTypes.c")) ++ code.putln("__Pyx_TRASHCAN_BEGIN(o, %s)" % slot_func_cname) ++ + # call the user's __dealloc__ + self.generate_usr_dealloc_call(scope, code) + +@@ -1554,6 +1560,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): + code.putln("(*Py_TYPE(o)->tp_free)(o);") + if freelist_size: + code.putln("}") ++ ++ if needs_trashcan: ++ code.putln("__Pyx_TRASHCAN_END") ++ + code.putln( + "}") + +diff --git a/Cython/Compiler/Options.py b/Cython/Compiler/Options.py +index d03119fca..05a728135 100644 +--- a/Cython/Compiler/Options.py ++++ b/Cython/Compiler/Options.py +@@ -319,6 +319,7 @@ directive_types = { + 'freelist': int, + 'c_string_type': one_of('bytes', 'bytearray', 'str', 'unicode'), + 'c_string_encoding': normalise_encoding_name, ++ 'trashcan': bool, + 'cpow': bool + } + +@@ -362,6 +363,7 @@ directive_scopes = { # defaults to available everywhere + 'np_pythran': ('module',), + 'fast_gil': ('module',), + 'iterable_coroutine': ('module', 'function'), ++ 'trashcan' : ('cclass',), + } + + +diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py +index c309bd04b..9231130b5 100644 +--- a/Cython/Compiler/PyrexTypes.py ++++ b/Cython/Compiler/PyrexTypes.py +@@ -1129,6 +1129,7 @@ class PyObjectType(PyrexType): + is_extern = False + is_subclassed = False + is_gc_simple = False ++ builtin_trashcan = False # builtin type using trashcan + + def __str__(self): + return "Python object" +@@ -1183,10 +1184,14 @@ class PyObjectType(PyrexType): + + + builtin_types_that_cannot_create_refcycles = set([ +- 'bool', 'int', 'long', 'float', 'complex', ++ 'object', 'bool', 'int', 'long', 'float', 'complex', + 'bytearray', 'bytes', 'unicode', 'str', 'basestring' + ]) + ++builtin_types_with_trashcan = set([ ++ 'dict', 'list', 'set', 'frozenset', 'tuple', 'type', ++]) ++ + + class BuiltinObjectType(PyObjectType): + # objstruct_cname string Name of PyObject struct +@@ -1211,6 +1216,7 @@ class BuiltinObjectType(PyObjectType): + self.typeptr_cname = "(&%s)" % cname + self.objstruct_cname = objstruct_cname + self.is_gc_simple = name in builtin_types_that_cannot_create_refcycles ++ self.builtin_trashcan = name in builtin_types_with_trashcan + if name == 'type': + # Special case the type type, as many C API calls (and other + # libraries) actually expect a PyTypeObject* for type arguments. +diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py +index 7361a55ae..f0c311ba6 100644 +--- a/Cython/Compiler/Symtab.py ++++ b/Cython/Compiler/Symtab.py +@@ -2043,7 +2043,7 @@ class PyClassScope(ClassScope): + class CClassScope(ClassScope): + # Namespace of an extension type. + # +- # parent_type CClassType ++ # parent_type PyExtensionType + # #typeobj_cname string or None + # #objstruct_cname string + # method_table_cname string +@@ -2087,6 +2087,22 @@ class CClassScope(ClassScope): + return not self.parent_type.is_gc_simple + return False + ++ def needs_trashcan(self): ++ # If the trashcan directive is explicitly set to False, ++ # unconditionally disable the trashcan. ++ directive = self.directives.get('trashcan') ++ if directive is False: ++ return False ++ # If the directive is set to True and the class has Python-valued ++ # C attributes, then it should use the trashcan in tp_dealloc. ++ if directive and self.has_cyclic_pyobject_attrs: ++ return True ++ # Use the trashcan if the base class uses it ++ base_type = self.parent_type.base_type ++ if base_type and base_type.scope is not None: ++ return base_type.scope.needs_trashcan() ++ return self.parent_type.builtin_trashcan ++ + def needs_tp_clear(self): + """ + Do we need to generate an implementation for the tp_clear slot? Can +diff --git a/Cython/Utility/ExtensionTypes.c b/Cython/Utility/ExtensionTypes.c +index dc187ab49..f359165df 100644 +--- a/Cython/Utility/ExtensionTypes.c ++++ b/Cython/Utility/ExtensionTypes.c +@@ -119,6 +119,49 @@ static int __Pyx_PyType_Ready(PyTypeObject *t) { + return r; + } + ++/////////////// PyTrashcan.proto /////////////// ++ ++// These macros are taken from https://github.com/python/cpython/pull/11841 ++// Unlike the Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END macros, they ++// allow dealing correctly with subclasses. ++ ++// This requires CPython version >= 2.7.4 ++// (or >= 3.2.4 but we don't support such old Python 3 versions anyway) ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070400 ++#define __Pyx_TRASHCAN_BEGIN_CONDITION(op, cond) \ ++ do { \ ++ PyThreadState *_tstate = NULL; \ ++ // If "cond" is false, then _tstate remains NULL and the deallocator ++ // is run normally without involving the trashcan ++ if (cond) { \ ++ _tstate = PyThreadState_GET(); \ ++ if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ ++ // Store the object (to be deallocated later) and jump past ++ // Py_TRASHCAN_END, skipping the body of the deallocator ++ _PyTrash_thread_deposit_object((PyObject*)(op)); \ ++ break; \ ++ } \ ++ ++_tstate->trash_delete_nesting; \ ++ } ++ // The body of the deallocator is here. ++#define __Pyx_TRASHCAN_END \ ++ if (_tstate) { \ ++ --_tstate->trash_delete_nesting; \ ++ if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ ++ _PyTrash_thread_destroy_chain(); \ ++ } \ ++ } while (0); ++ ++#define __Pyx_TRASHCAN_BEGIN(op, dealloc) __Pyx_TRASHCAN_BEGIN_CONDITION(op, \ ++ Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) ++ ++#else ++// The trashcan is a no-op on other Python implementations ++// or old CPython versions ++#define __Pyx_TRASHCAN_BEGIN(op, dealloc) ++#define __Pyx_TRASHCAN_END ++#endif ++ + /////////////// CallNextTpDealloc.proto /////////////// + + static void __Pyx_call_next_tp_dealloc(PyObject* obj, destructor current_tp_dealloc); +diff --git a/tests/run/trashcan.pyx b/tests/run/trashcan.pyx +new file mode 100644 +index 000000000..93a501ff8 +--- /dev/null ++++ b/tests/run/trashcan.pyx +@@ -0,0 +1,148 @@ ++# mode: run ++ ++cimport cython ++ ++ ++# Count number of times an object was deallocated twice. This should remain 0. ++cdef int double_deallocations = 0 ++def assert_no_double_deallocations(): ++ global double_deallocations ++ err = double_deallocations ++ double_deallocations = 0 ++ assert not err ++ ++ ++# Compute x = f(f(f(...(None)...))) nested n times and throw away the result. ++# The real test happens when exiting this function: then a big recursive ++# deallocation of x happens. We are testing two things in the tests below: ++# that Python does not crash and that no double deallocation happens. ++# See also https://github.com/python/cpython/pull/11841 ++def recursion_test(f, int n=2**20): ++ x = None ++ cdef int i ++ for i in range(n): ++ x = f(x) ++ ++ ++@cython.trashcan(True) ++cdef class Recurse: ++ """ ++ >>> recursion_test(Recurse) ++ >>> assert_no_double_deallocations() ++ """ ++ cdef public attr ++ cdef int deallocated ++ ++ def __init__(self, x): ++ self.attr = x ++ ++ def __dealloc__(self): ++ # Check that we're not being deallocated twice ++ global double_deallocations ++ double_deallocations += self.deallocated ++ self.deallocated = 1 ++ ++ ++cdef class RecurseSub(Recurse): ++ """ ++ >>> recursion_test(RecurseSub) ++ >>> assert_no_double_deallocations() ++ """ ++ cdef int subdeallocated ++ ++ def __dealloc__(self): ++ # Check that we're not being deallocated twice ++ global double_deallocations ++ double_deallocations += self.subdeallocated ++ self.subdeallocated = 1 ++ ++ ++@cython.freelist(4) ++@cython.trashcan(True) ++cdef class RecurseFreelist: ++ """ ++ >>> recursion_test(RecurseFreelist) ++ >>> recursion_test(RecurseFreelist, 1000) ++ >>> assert_no_double_deallocations() ++ """ ++ cdef public attr ++ cdef int deallocated ++ ++ def __init__(self, x): ++ self.attr = x ++ ++ def __dealloc__(self): ++ # Check that we're not being deallocated twice ++ global double_deallocations ++ double_deallocations += self.deallocated ++ self.deallocated = 1 ++ ++ ++# Subclass of list => uses trashcan by default ++# As long as https://github.com/python/cpython/pull/11841 is not fixed, ++# this does lead to double deallocations, so we skip that check. ++cdef class RecurseList(list): ++ """ ++ >>> RecurseList(42) ++ [42] ++ >>> recursion_test(RecurseList) ++ """ ++ def __init__(self, x): ++ super().__init__((x,)) ++ ++ ++# Some tests where the trashcan is NOT used. When the trashcan is not used ++# in a big recursive deallocation, the __dealloc__s of the base classs are ++# only run after the __dealloc__s of the subclasses. ++# We use this to detect trashcan usage. ++cdef int base_deallocated = 0 ++cdef int trashcan_used = 0 ++def assert_no_trashcan_used(): ++ global base_deallocated, trashcan_used ++ err = trashcan_used ++ trashcan_used = base_deallocated = 0 ++ assert not err ++ ++ ++cdef class Base: ++ def __dealloc__(self): ++ global base_deallocated ++ base_deallocated = 1 ++ ++ ++# Trashcan disabled by default ++cdef class Sub1(Base): ++ """ ++ >>> recursion_test(Sub1, 100) ++ >>> assert_no_trashcan_used() ++ """ ++ cdef public attr ++ ++ def __init__(self, x): ++ self.attr = x ++ ++ def __dealloc__(self): ++ global base_deallocated, trashcan_used ++ trashcan_used += base_deallocated ++ ++ ++@cython.trashcan(True) ++cdef class Middle(Base): ++ cdef public foo ++ ++ ++# Trashcan disabled explicitly ++@cython.trashcan(False) ++cdef class Sub2(Middle): ++ """ ++ >>> recursion_test(Sub2, 1000) ++ >>> assert_no_trashcan_used() ++ """ ++ cdef public attr ++ ++ def __init__(self, x): ++ self.attr = x ++ ++ def __dealloc__(self): ++ global base_deallocated, trashcan_used ++ trashcan_used += base_deallocated +-- +2.39.0 + diff --git a/pkgs/by-name/py/python/python-modules/docutils/default.nix b/pkgs/by-name/py/python/python-modules/docutils/default.nix new file mode 100644 index 0000000..136f679 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/docutils/default.nix @@ -0,0 +1,41 @@ +{ stdenv +, lib +, fetchPypi +, buildPythonPackage +, python +, pythonOlder +}: + +buildPythonPackage rec { + pname = "docutils"; + version = "0.20.1"; + + disabled = pythonOlder "3.7"; + + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-8IpOJ2w6FYOobc4+NKuj/gTQK7ot1R7RYQYkToqSPjs="; + }; + + # Only Darwin needs LANG, but we could set it in general. + # It's done here conditionally to prevent mass-rebuilds. + checkPhase = lib.optionalString stdenv.isDarwin ''LANG="en_US.UTF-8" LC_ALL="en_US.UTF-8" '' + '' + ${python.interpreter} test/alltests.py + ''; + + # Create symlinks lacking a ".py" suffix, many programs depend on these names + postFixup = '' + for f in $out/bin/*.py; do + ln -s $(basename $f) $out/bin/$(basename $f .py) + done + ''; + + meta = with lib; { + description = "Python Documentation Utilities"; + homepage = "http://docutils.sourceforge.net/"; + license = with licenses; [ publicDomain bsd2 psfl gpl3Plus ]; + maintainers = with maintainers; [ AndersonTorres ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/editables/default.nix b/pkgs/by-name/py/python/python-modules/editables/default.nix new file mode 100644 index 0000000..f3db3a9 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/editables/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "editables"; + version = "0.5"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-MJYn2bXErcDmaNjG+nusG6fIxdQVwtJ/YPCB+OgNHeI="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + # Tests not included in archive. + doCheck = false; + + pythonImportsCheck = [ "editables" ]; + + meta = with lib; { + description = "Editable installations"; + maintainers = with maintainers; [ ]; + homepage = "https://github.com/pfmoore/editables"; + license = licenses.mit; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/exceptiongroup/default.nix b/pkgs/by-name/py/python/python-modules/exceptiongroup/default.nix new file mode 100644 index 0000000..2dca56a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/exceptiongroup/default.nix @@ -0,0 +1,51 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, flit-scm +, pytestCheckHook +, pythonOlder +, pythonAtLeast +}: + +buildPythonPackage rec { + pname = "exceptiongroup"; + version = "1.2.0"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "agronholm"; + repo = "exceptiongroup"; + rev = version; + hash = "sha256-iGeaRVJeFAWfJpwr7N4kST7d8YxpX3WgDqQemlR0cLU="; + }; + + nativeBuildInputs = [ + flit-scm + ]; + + doCheck = pythonAtLeast "3.11"; # infinite recursion with pytest + + nativeCheckInputs = [ + pytestCheckHook + ]; + + disabledTests = if pythonAtLeast "3.12" then [ + # https://github.com/agronholm/exceptiongroup/issues/116 + "test_deep_split" + "test_deep_subgroup" + ] else null; + + pythonImportsCheck = [ + "exceptiongroup" + ]; + + meta = with lib; { + description = "Backport of PEP 654 (exception groups)"; + homepage = "https://github.com/agronholm/exceptiongroup"; + changelog = "https://github.com/agronholm/exceptiongroup/blob/${version}/CHANGES.rst"; + license = with licenses; [ mit ]; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/execnet/default.nix b/pkgs/by-name/py/python/python-modules/execnet/default.nix new file mode 100644 index 0000000..eb184c1 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/execnet/default.nix @@ -0,0 +1,66 @@ +{ lib +, buildPythonPackage +, isPyPy +, fetchPypi +, hatchling +, hatch-vcs +, gevent +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "execnet"; + version = "2.0.2"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-zFm8RCN0L9ca0icSLrDdRNtR77PcQJW0WsmgjHcAlq8="; + }; + + postPatch = '' + # remove vbox tests + rm testing/test_termination.py + rm testing/test_channel.py + rm testing/test_xspec.py + rm testing/test_gateway.py + '' + lib.optionalString isPyPy '' + rm testing/test_multi.py + ''; + + nativeBuildInputs = [ + hatchling + hatch-vcs + ]; + + # sometimes crashes with: OSError: [Errno 9] Bad file descriptor + doCheck = !isPyPy; + + nativeCheckInputs = [ + gevent + pytestCheckHook + ]; + + disabledTests = [ + # gets stuck + "test_popen_io" + # OSError: [Errno 9] Bad file descriptor + "test_stdouterrin_setnull" + ]; + + pytestFlagsArray = [ "-vvv" ]; + + pythonImportsCheck = [ + "execnet" + ]; + + __darwinAllowLocalNetworking = true; + + meta = with lib; { + changelog = "https://github.com/pytest-dev/execnet/blob/v${version}/CHANGELOG.rst"; + description = "Distributed Python deployment and communication"; + homepage = "https://execnet.readthedocs.io/"; + license = licenses.mit; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/fb-re2/default.nix b/pkgs/by-name/py/python/python-modules/fb-re2/default.nix new file mode 100644 index 0000000..e5f4100 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/fb-re2/default.nix @@ -0,0 +1,39 @@ +{ lib +, buildPythonPackage +, fetchpatch +, fetchPypi +, re2 +}: + +buildPythonPackage rec { + pname = "fb-re2"; + version = "1.0.7"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "83b2c2cd58d3874e6e3a784cf4cf2f1a57ce1969e50180f92b010eea24ef26cf"; + }; + + patches = [ + # Bump stdlib to c++17 to fix build with recent re2 + # https://github.com/facebook/pyre2/issues/24 + # https://github.com/facebook/pyre2/pull/25 + (fetchpatch { + url = "https://github.com/facebook/pyre2/pull/25/commits/08fb06ec3ccd412ca69483d27234684a04cb91a0.patch"; + hash = "sha256-kzxE2AxpE1tJJK0dJgoFfVka9zy2u0HEqiHoS7DQDQ0="; + }) + ]; + + buildInputs = [ re2 ]; + + # no tests in PyPI tarball + doCheck = false; + + meta = { + description = "Python wrapper for Google's RE2"; + homepage = "https://github.com/facebook/pyre2"; + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ ivan ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/filelock/default.nix b/pkgs/by-name/py/python/python-modules/filelock/default.nix new file mode 100644 index 0000000..b32335b --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/filelock/default.nix @@ -0,0 +1,40 @@ +{ lib +, buildPythonPackage +, fetchPypi +, hatch-vcs +, hatchling +, pytest-mock +, pytestCheckHook +, pythonOlder +}: + +buildPythonPackage rec { + pname = "filelock"; + version = "3.13.1"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-Uh9fVsUPhCb14DrTsoG0kKh+8VvGxSbxaCkPDHFI1E4="; + }; + + nativeBuildInputs = [ + hatch-vcs + hatchling + ]; + + nativeCheckInputs = [ + pytest-mock + pytestCheckHook + ]; + + meta = with lib; { + changelog = "https://github.com/tox-dev/py-filelock/releases/tag/${version}"; + description = "A platform independent file lock for Python"; + homepage = "https://github.com/benediktschmitt/py-filelock"; + license = licenses.unlicense; + maintainers = with maintainers; [ hyphon81 ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/flit-core/default.nix b/pkgs/by-name/py/python/python-modules/flit-core/default.nix new file mode 100644 index 0000000..9f728cf --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/flit-core/default.nix @@ -0,0 +1,29 @@ +{ lib +, buildPythonPackage +, flit +}: + +buildPythonPackage rec { + pname = "flit-core"; + inherit (flit) version; + format = "pyproject"; + + inherit (flit) src patches; + + sourceRoot = "${src.name}/flit_core"; + + # Tests are run in the "flit" package. + doCheck = false; + + # passthru.tests = { + # inherit flit; + # }; + + meta = with lib; { + description = "Distribution-building parts of Flit. See flit package for more information"; + homepage = "https://github.com/pypa/flit"; + changelog = "https://github.com/pypa/flit/blob/${src.rev}/doc/history.rst"; + license = licenses.bsd3; + maintainers = teams.python.members; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/flit/default.nix b/pkgs/by-name/py/python/python-modules/flit/default.nix new file mode 100644 index 0000000..b623d1e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/flit/default.nix @@ -0,0 +1,60 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, docutils +, requests +, pytestCheckHook +, testpath +, responses +, flit-core +, tomli-w +}: + +# Flit is actually an application to build universal wheels. +# It requires Python 3 and should eventually be moved outside of +# python-packages.nix. When it will be used to build wheels, +# care should be taken that there is no mingling of PYTHONPATH. + +buildPythonPackage rec { + pname = "flit"; + version = "3.9.0"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "takluyver"; + repo = "flit"; + rev = version; + hash = "sha256-yl2+PcKr7xRW4oIBWl+gzh/nKhSNu5GH9fWKRGgaNHU="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + propagatedBuildInputs = [ + docutils + requests + flit-core + tomli-w + ]; + + nativeCheckInputs = [ pytestCheckHook testpath responses ]; + + disabledTests = [ + # needs some ini file. + "test_invalid_classifier" + # calls pip directly. disabled for PEP 668 + "test_install_data_dir" + "test_install_module_pep621" + "test_symlink_data_dir" + "test_symlink_module_pep621" + ]; + + meta = with lib; { + changelog = "https://github.com/pypa/flit/blob/${version}/doc/history.rst"; + description = "A simple packaging tool for simple packages"; + mainProgram = "flit"; + homepage = "https://github.com/pypa/flit"; + license = licenses.bsd3; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/freezegun/default.nix b/pkgs/by-name/py/python/python-modules/freezegun/default.nix new file mode 100644 index 0000000..2279e70 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/freezegun/default.nix @@ -0,0 +1,45 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytestCheckHook +, python-dateutil +, pythonOlder +, setuptools +}: + +buildPythonPackage rec { + pname = "freezegun"; + version = "1.4.0"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-EJObC6D/Wtrs87BqXC9zBx2WeOUHxertsjx2HVasd0s="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedBuildInputs = [ + python-dateutil + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "freezegun" + ]; + + meta = with lib; { + description = "Library that allows your Python tests to travel through time"; + homepage = "https://github.com/spulec/freezegun"; + changelog = "https://github.com/spulec/freezegun/blob/${version}/CHANGELOG"; + license = licenses.asl20; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/func-timeout/default.nix b/pkgs/by-name/py/python/python-modules/func-timeout/default.nix new file mode 100644 index 0000000..654b950 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/func-timeout/default.nix @@ -0,0 +1,30 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "func-timeout"; + version = "4.3.5"; + format = "setuptools"; + + src = fetchPypi { + pname = "func_timeout"; + inherit version; + sha256 = "74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"; + }; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ "func_timeout" ]; + + meta = with lib; { + description = "Allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads"; + homepage = "https://github.com/kata198/func_timeout"; + license = licenses.lgpl3Only; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/gevent/default.nix b/pkgs/by-name/py/python/python-modules/gevent/default.nix new file mode 100644 index 0000000..fcc67d9 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/gevent/default.nix @@ -0,0 +1,85 @@ +{ lib +, fetchPypi +, buildPythonPackage +, isPyPy +, python +, libev +, cffi +, cython +, greenlet +, importlib-metadata +, setuptools +, wheel +, zope-event +, zope-interface +, pythonOlder +, c-ares +, libuv + +# for passthru.tests +# , dulwich +# , gunicorn +# , opentracing +# , pika +}: + +buildPythonPackage rec { + pname = "gevent"; + version = "24.2.1"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-Qy/Hb2gKz3zxiMLuD106tztjwfAxFMfNijTOu+WqIFY="; + }; + + nativeBuildInputs = [ + cython + setuptools + wheel + ] ++ lib.optionals (!isPyPy) [ + cffi + ]; + + buildInputs = [ + libev + libuv + c-ares + ]; + + propagatedBuildInputs = [ + importlib-metadata + zope-event + zope-interface + ] ++ lib.optionals (!isPyPy) [ + greenlet + ]; + + # Bunch of failures. + doCheck = false; + + pythonImportsCheck = [ + "gevent" + "gevent.events" + ]; + + # passthru.tests = { + # inherit + # dulwich + # gunicorn + # opentracing + # pika; + # } // lib.filterAttrs (k: v: lib.hasInfix "gevent" k) python.pkgs; + + GEVENTSETUP_EMBED = "0"; + + meta = with lib; { + description = "Coroutine-based networking library"; + homepage = "http://www.gevent.org/"; + license = licenses.mit; + maintainers = with maintainers; [ bjornfor ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/greenlet/default.nix b/pkgs/by-name/py/python/python-modules/greenlet/default.nix new file mode 100644 index 0000000..6839b23 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/greenlet/default.nix @@ -0,0 +1,62 @@ +{ lib +, buildPythonPackage +, fetchPypi + +# build-system +, setuptools + +# tests +, objgraph +, psutil +, python +, unittestCheckHook +}: + +let greenlet = buildPythonPackage rec { + pname = "greenlet"; + version = "3.0.3"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-QzdEQjUyWVVM4zWZ2otpLVqpb4l21WfUut8mM3H75JE="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + # tests in passthru, infinite recursion via objgraph/graphviz + doCheck = false; + + nativeCheckInputs = [ + objgraph + psutil + unittestCheckHook + ]; + + preCheck = '' + pushd ${placeholder "out"}/${python.sitePackages} + ''; + + unittestFlagsArray = [ + "greenlet.tests" + ]; + + postCheck = '' + popd + ''; + + passthru.tests.pytest = greenlet.overridePythonAttrs (_: { doCheck = true; }); + + meta = with lib; { + changelog = "https://github.com/python-greenlet/greenlet/blob/${version}/CHANGES.rst"; + homepage = "https://github.com/python-greenlet/greenlet"; + description = "Module for lightweight in-process concurrent programming"; + license = with licenses; [ + psfl # src/greenlet/slp_platformselect.h & files in src/greenlet/platform/ directory + mit + ]; + }; +}; +in greenlet diff --git a/pkgs/by-name/py/python/python-modules/hatch-vcs/default.nix b/pkgs/by-name/py/python/python-modules/hatch-vcs/default.nix new file mode 100644 index 0000000..2588482 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/hatch-vcs/default.nix @@ -0,0 +1,55 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytestCheckHook +, pythonOlder +, git +, hatchling +, setuptools-scm +}: + +buildPythonPackage rec { + pname = "hatch-vcs"; + version = "0.4.0"; + format = "pyproject"; + + disabled = pythonOlder "3.8"; + + src = fetchPypi { + pname = "hatch_vcs"; + inherit version; + hash = "sha256-CTgQdI/gHbDUUfq88sGsJojK79Iy1O3pZwkLHBsH2fc="; + }; + + nativeBuildInputs = [ + hatchling + ]; + + propagatedBuildInputs = [ + hatchling + setuptools-scm + ]; + + nativeCheckInputs = [ + git + pytestCheckHook + ]; + + disabledTests = [ + # incompatible with setuptools-scm>=7 + # https://github.com/ofek/hatch-vcs/issues/8 + "test_write" + ]; + + pythonImportsCheck = [ + "hatch_vcs" + ]; + + meta = with lib; { + changelog = "https://github.com/ofek/hatch-vcs/releases/tag/v${version}"; + description = "A plugin for Hatch that uses your preferred version control system (like Git) to determine project versions"; + homepage = "https://github.com/ofek/hatch-vcs"; + license = licenses.mit; + maintainers = with maintainers; [ cpcloud ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/hatchling/default.nix b/pkgs/by-name/py/python/python-modules/hatchling/default.nix new file mode 100644 index 0000000..4d5d345 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/hatchling/default.nix @@ -0,0 +1,76 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder + +# runtime +, editables +, packaging +, pathspec +, pluggy +, tomli +, trove-classifiers + +# tests +, build +, python +, requests +, virtualenv +}: + +buildPythonPackage rec { + pname = "hatchling"; + version = "1.22.4"; + format = "pyproject"; + disabled = pythonOlder "3.8"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-ii3OyW1/uEg4LvWEjlrEP9rmQfNaCKP6tRFr1JXzQW4="; + }; + + # listed in backend/pyproject.toml + propagatedBuildInputs = [ + editables + packaging + pathspec + pluggy + trove-classifiers + ] ++ lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + pythonImportsCheck = [ + "hatchling" + "hatchling.build" + ]; + + # tries to fetch packages from the internet + doCheck = false; + + # listed in /backend/tests/downstream/requirements.txt + nativeCheckInputs = [ + build + requests + virtualenv + ]; + + preCheck = '' + export HOME=$TMPDIR + ''; + + checkPhase = '' + runHook preCheck + ${python.interpreter} tests/downstream/integrate.py + runHook postCheck + ''; + + meta = with lib; { + description = "Modern, extensible Python build backend"; + mainProgram = "hatchling"; + homepage = "https://hatch.pypa.io/latest/"; + changelog = "https://github.com/pypa/hatch/releases/tag/hatchling-v${version}"; + license = licenses.mit; + maintainers = with maintainers; [ hexa ofek ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/html5lib/default.nix b/pkgs/by-name/py/python/python-modules/html5lib/default.nix new file mode 100644 index 0000000..b35cfee --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/html5lib/default.nix @@ -0,0 +1,56 @@ +{ lib +, buildPythonPackage +, fetchPypi +, fetchpatch +, six +, webencodings +, mock +, pytest-expect +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "html5lib"; + version = "1.1"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"; + }; + + patches = [ + # Fix compatibility with pytest 6. + # Will be included in the next release after 1.1. + (fetchpatch { + url = "https://github.com/html5lib/html5lib-python/commit/2c19b9899ab3a3e8bd0ca35e5d78544334204169.patch"; + hash = "sha256-VGCeB6o2QO/skeCZs8XLPfgEYVOSRL8cCpG7ajbZWEs="; + }) + ]; + + propagatedBuildInputs = [ + six + webencodings + ]; + + # latest release not compatible with pytest 6 + doCheck = false; + nativeCheckInputs = [ + mock + pytest-expect + pytestCheckHook + ]; + + meta = { + homepage = "https://github.com/html5lib/html5lib-python"; + downloadPage = "https://github.com/html5lib/html5lib-python/releases"; + description = "HTML parser based on WHAT-WG HTML5 specification"; + longDescription = '' + html5lib is a pure-python library for parsing HTML. It is designed to + conform to the WHATWG HTML specification, as is implemented by all + major web browsers. + ''; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ domenkozar prikhi ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/hypothesis/default.nix b/pkgs/by-name/py/python/python-modules/hypothesis/default.nix new file mode 100644 index 0000000..5cf3408 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/hypothesis/default.nix @@ -0,0 +1,126 @@ +{ lib +, buildPythonPackage +, isPyPy +, fetchFromGitHub +, setuptools +, attrs +, exceptiongroup +, pexpect +, doCheck ? true +, pytestCheckHook +, pytest-xdist +, python +, sortedcontainers +, stdenv +, pythonOlder +, sphinxHook +, sphinx-rtd-theme +, sphinx-hoverxref +, sphinx-codeautolink +, tzdata +}: + +buildPythonPackage rec { + pname = "hypothesis"; + version = "6.99.12"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "HypothesisWorks"; + repo = "hypothesis"; + rev = "hypothesis-python-${version}"; + hash = "sha256-0nzjRDv4L3bxxnC0lBY5S7FP9CFhyzHzNchWXoX91Zg="; + }; + + # I tried to package sphinx-selective-exclude, but it throws + # error about "module 'sphinx' has no attribute 'directives'". + # + # It probably has to do with monkey-patching internals of Sphinx. + # On bright side, this extension does not introduces new commands, + # only changes "::only" command, so we probably okay with stock + # implementation. + # + # I wonder how upstream of "hypothesis" builds documentation. + postPatch = '' + sed -i -e '/sphinx_selective_exclude.eager_only/ d' docs/conf.py + ''; + + postUnpack = "sourceRoot=$sourceRoot/hypothesis-python"; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedBuildInputs = [ + attrs + sortedcontainers + ] ++ lib.optionals (pythonOlder "3.11") [ + exceptiongroup + ]; + + nativeCheckInputs = [ + pexpect + pytest-xdist + pytestCheckHook + ] ++ lib.optionals isPyPy [ + tzdata + ]; + + inherit doCheck; + + # This file changes how pytest runs and breaks it + preCheck = '' + rm tox.ini + ''; + + pytestFlagsArray = [ + "tests/cover" + ]; + + disabledTests = if (pythonOlder "3.10") then [ + # not sure why these tests fail with only 3.9 + # FileNotFoundError: [Errno 2] No such file or directory: 'git' + "test_observability" + "test_assume_has_status_reason" + "test_observability_captures_stateful_reprs" + ] else null; + + pythonImportsCheck = [ + "hypothesis" + ]; + + passthru = { + doc = stdenv.mkDerivation { + # Forge look and feel of multi-output derivation as best as we can. + # + # Using 'outputs = [ "doc" ];' breaks a lot of assumptions. + name = "${pname}-${version}-doc"; + inherit src pname version; + + postInstallSphinx = '' + mv $out/share/doc/* $out/share/doc/python$pythonVersion-$pname-$version + ''; + + nativeBuildInputs = [ + sphinxHook + sphinx-rtd-theme + sphinx-hoverxref + sphinx-codeautolink + ]; + + inherit (python) pythonVersion; + inherit meta; + }; + }; + + meta = with lib; { + description = "Library for property based testing"; + mainProgram = "hypothesis"; + homepage = "https://github.com/HypothesisWorks/hypothesis"; + changelog = "https://hypothesis.readthedocs.io/en/latest/changes.html#v${lib.replaceStrings [ "." ] [ "-" ] version}"; + license = licenses.mpl20; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/idna/default.nix b/pkgs/by-name/py/python/python-modules/idna/default.nix new file mode 100644 index 0000000..77aeb44 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/idna/default.nix @@ -0,0 +1,31 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "idna"; + version = "3.6"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-ns270IOwZ5iuHoaty/6KsUec+GTk7jD+TkagA9Ekkco="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + meta = { + homepage = "https://github.com/kjd/idna/"; + description = "Internationalized Domain Names in Applications (IDNA)"; + license = lib.licenses.bsd3; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/imagesize/default.nix b/pkgs/by-name/py/python/python-modules/imagesize/default.nix new file mode 100644 index 0000000..ab41410 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/imagesize/default.nix @@ -0,0 +1,22 @@ +{ lib +, buildPythonPackage +, fetchPypi +}: + +buildPythonPackage rec { + pname = "imagesize"; + version = "1.4.1"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-aRUERK/7nLDVzFqSs2dvCy+3zZrjnpR6XhGja0SXzUo="; + }; + + meta = with lib; { + description = "Getting image size from png/jpeg/jpeg2000/gif file"; + homepage = "https://github.com/shibukawa/imagesize_py"; + license = with licenses; [ mit ]; + }; + +} diff --git a/pkgs/by-name/py/python/python-modules/importlib-metadata/default.nix b/pkgs/by-name/py/python/python-modules/importlib-metadata/default.nix new file mode 100644 index 0000000..995d625 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/importlib-metadata/default.nix @@ -0,0 +1,50 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, setuptools +, setuptools-scm +, typing-extensions +, toml +, zipp +}: + +buildPythonPackage rec { + pname = "importlib-metadata"; + version = "7.0.2"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + pname = "importlib_metadata"; + inherit version; + hash = "sha256-GY9WjzIwh4yxtE+9eXX4eQbCIzbbouSn8FJ4woH715I="; + }; + + nativeBuildInputs = [ + setuptools # otherwise cross build fails + setuptools-scm + ]; + + propagatedBuildInputs = [ + toml + zipp + ] ++ lib.optionals (pythonOlder "3.8") [ + typing-extensions + ]; + + # Cyclic dependencies due to pyflakefs + doCheck = false; + + pythonImportsCheck = [ + "importlib_metadata" + ]; + + meta = with lib; { + description = "Read metadata from Python packages"; + homepage = "https://importlib-metadata.readthedocs.io/"; + license = licenses.asl20; + maintainers = with maintainers; [ fab AndersonTorres ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/iniconfig/default.nix b/pkgs/by-name/py/python/python-modules/iniconfig/default.nix new file mode 100644 index 0000000..2089385 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/iniconfig/default.nix @@ -0,0 +1,45 @@ +{ lib +, buildPythonPackage +, substituteAll +, fetchPypi +# , hatch-vcs +, hatchling +}: + +buildPythonPackage rec { + pname = "iniconfig"; + version = "2.0.0"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-LZHhNb9y0xpBCxfBbaYQqCy1X2sEd9GpAhNLJKRVuLM="; + }; + + nativeBuildInputs = [ + hatchling + ]; + + patches = [ + # Cannot use hatch-vcs, due to an inifinite recursion + (substituteAll { + src = ./version.patch; + inherit version; + }) + ]; + + pythonImportsCheck = [ + "iniconfig" + ]; + + # Requires pytest, which in turn requires this package - causes infinite + # recursion. See also: https://github.com/NixOS/nixpkgs/issues/63168 + doCheck = false; + + meta = with lib; { + description = "brain-dead simple parsing of ini files"; + homepage = "https://github.com/pytest-dev/iniconfig"; + license = licenses.mit; + maintainers = with maintainers; [ jonringer ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/iniconfig/version.patch b/pkgs/by-name/py/python/python-modules/iniconfig/version.patch new file mode 100644 index 0000000..a075464 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/iniconfig/version.patch @@ -0,0 +1,42 @@ +diff --git a/pyproject.toml b/pyproject.toml +index 6eee6ef..263999f 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,12 +1,12 @@ + [build-system] + build-backend = "hatchling.build" + requires = [ +- "hatch-vcs", + "hatchling", + ] + + [project] + name = "iniconfig" ++version = "@version@" + description = "brain-dead simple config-ini parsing" + readme = "README.rst" + license = "MIT" +@@ -15,9 +15,6 @@ authors = [ + { name = "Holger Krekel", email = "holger.krekel@gmail.com" }, + ] + requires-python = ">=3.7" +-dynamic = [ +- "version", +-] + classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", +@@ -38,13 +35,6 @@ classifiers = [ + [project.urls] + Homepage = "https://github.com/pytest-dev/iniconfig" + +- +-[tool.hatch.version] +-source = "vcs" +- +-[tool.hatch.build.hooks.vcs] +-version-file = "src/iniconfig/_version.py" +- + [tool.hatch.build.targets.sdist] + include = [ + "/src", diff --git a/pkgs/by-name/py/python/python-modules/installer/default.nix b/pkgs/by-name/py/python/python-modules/installer/default.nix new file mode 100644 index 0000000..a1d7038 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/installer/default.nix @@ -0,0 +1,60 @@ +{ lib +, buildPythonPackage +, pythonAtLeast +, fetchFromGitHub +, flit-core +# for passthru.tests +# , installer +# , mock +# , pytestCheckHook +}: + +buildPythonPackage rec { + pname = "installer"; + version = "0.7.0"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "pypa"; + repo = pname; + rev = version; + hash = "sha256-thHghU+1Alpay5r9Dc3v7ATRFfYKV8l9qR0nbGOOX/A="; + }; + + patches = lib.optionals (pythonAtLeast "3.13") [ + # Fix compatibility with Python 3.13 + # https://github.com/pypa/installer/pull/201 + ./python313-compat.patch + ]; + + nativeBuildInputs = [ flit-core ]; + + # We need to disable tests because this package is part of the bootstrap chain + # and its test dependencies cannot be built yet when this is being built. + doCheck = false; + + # passthru.tests = { + # pytest = buildPythonPackage { + # pname = "${pname}-pytest"; + # inherit version; + # format = "other"; + + # dontBuild = true; + # dontInstall = true; + + # nativeCheckInputs = [ + # installer + # mock + # pytestCheckHook + # ]; + # }; + # }; + + meta = with lib; { + description = "A low-level library for installing a Python package from a wheel distribution"; + homepage = "https://github.com/pypa/installer"; + changelog = "https://github.com/pypa/installer/blob/${src.rev}/docs/changelog.md"; + license = licenses.mit; + maintainers = teams.python.members ++ [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/installer/python313-compat.patch b/pkgs/by-name/py/python/python-modules/installer/python313-compat.patch new file mode 100644 index 0000000..423a550 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/installer/python313-compat.patch @@ -0,0 +1,55 @@ +From b23f89b10cf5d179bd6b0bad195ee36f43a5fb9e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= + <16805946+edgarrmondragon@users.noreply.github.com> +Date: Tue, 19 Dec 2023 06:09:41 -0600 +Subject: [PATCH] Fix removed `importlib.resources.read_binary` in Python 3.13 + (#201) + +diff --git a/noxfile.py b/noxfile.py +index a690c59..6a69cce 100644 +--- a/noxfile.py ++++ b/noxfile.py +@@ -22,7 +22,7 @@ def lint(session): + session.run("pre-commit", "run", "--all-files", *args) + + +-@nox.session(python=["3.7", "3.8", "3.9", "3.10", "3.11", "pypy3"]) ++@nox.session(python=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "pypy3"]) + def test(session): + session.install(".") + session.install("-r", "tests/requirements.txt") +@@ -42,7 +42,7 @@ def test(session): + ) + + +-@nox.session(python=["3.7", "3.8", "3.9", "3.10", "3.11", "pypy3"]) ++@nox.session(python=["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "pypy3"]) + def doctest(session): + session.install(".") + session.install("-r", "docs/requirements.txt") +diff --git a/src/installer/scripts.py b/src/installer/scripts.py +index d18060b..c9f96b4 100644 +--- a/src/installer/scripts.py ++++ b/src/installer/scripts.py +@@ -3,9 +3,19 @@ + import io + import os + import shlex ++import sys + import zipfile +-from importlib.resources import read_binary +-from typing import TYPE_CHECKING, Mapping, Optional, Tuple ++from types import ModuleType ++from typing import TYPE_CHECKING, Mapping, Optional, Tuple, Union ++ ++if sys.version_info >= (3, 9): # pragma: no cover ++ from importlib.resources import files ++ ++ def read_binary(package: Union[str, ModuleType], file_path: str) -> bytes: ++ return (files(package) / file_path).read_bytes() ++ ++else: # pragma: no cover ++ from importlib.resources import read_binary + + from installer import _scripts + diff --git a/pkgs/by-name/py/python/python-modules/jaraco-itertools/default.nix b/pkgs/by-name/py/python/python-modules/jaraco-itertools/default.nix new file mode 100644 index 0000000..23722cc --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/jaraco-itertools/default.nix @@ -0,0 +1,36 @@ +{ lib, buildPythonPackage, fetchPypi, setuptools-scm +, inflect, more-itertools, six, pytest +}: + +buildPythonPackage rec { + pname = "jaraco-itertools"; + version = "6.4.1"; + format = "pyproject"; + + src = fetchPypi { + pname = "jaraco.itertools"; + inherit version; + hash = "sha256-MU/OVi67RepIIqmLvXsi5f6sfVEY28Gk8ess0Ea/+kc="; + }; + + pythonNamespaces = [ "jaraco" ]; + + nativeBuildInputs = [ setuptools-scm ]; + + propagatedBuildInputs = [ inflect more-itertools six ]; + nativeCheckInputs = [ pytest ]; + + # tests no longer available through pypi + doCheck = false; + checkPhase = '' + pytest + ''; + + pythonImportsCheck = [ "jaraco.itertools" ]; + + meta = with lib; { + description = "Tools for working with iterables"; + homepage = "https://github.com/jaraco/jaraco.itertools"; + license = licenses.mit; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/jinja2/default.nix b/pkgs/by-name/py/python/python-modules/jinja2/default.nix new file mode 100644 index 0000000..1c260e3 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/jinja2/default.nix @@ -0,0 +1,92 @@ +{ lib +, stdenv +, python +, buildPythonPackage +, pythonOlder +, fetchPypi +, babel +, markupsafe +, pytestCheckHook +, sphinxHook +, pallets-sphinx-themes +, setuptools +, sphinxcontrib-log-cabinet +, sphinx-issues +}: + +buildPythonPackage rec { + pname = "jinja2"; + version = "3.1.3"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + pname = "Jinja2"; + inherit version; + hash = "sha256-rIvWVE1Lssl5K/OhWegLuo/afwfoG8Ou1WVDLVklupA="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedBuildInputs = [ + markupsafe + ]; + + passthru.optional-dependencies = { + i18n = [ + babel + ]; + }; + + # Multiple tests run out of stack space on 32bit systems with python2. + # See https://github.com/pallets/jinja/issues/1158 + doCheck = !stdenv.is32bit; + + nativeCheckInputs = [ + pytestCheckHook + ] ++ passthru.optional-dependencies.i18n; + + passthru.doc = stdenv.mkDerivation { + # Forge look and feel of multi-output derivation as best as we can. + # + # Using 'outputs = [ "doc" ];' breaks a lot of assumptions. + name = "${pname}-${version}-doc"; + inherit src pname version; + + patches = [ + # Fix import of "sphinxcontrib-log-cabinet" + ./patches/import-order.patch + ]; + + postInstallSphinx = '' + mv $out/share/doc/* $out/share/doc/python$pythonVersion-$pname-$version + ''; + + nativeBuildInputs = [ + sphinxHook + sphinxcontrib-log-cabinet + pallets-sphinx-themes + sphinx-issues + ]; + + inherit (python) pythonVersion; + inherit meta; + }; + + meta = with lib; { + changelog = "https://github.com/pallets/jinja/blob/${version}/CHANGES.rst"; + description = "Very fast and expressive template engine"; + downloadPage = "https://github.com/pallets/jinja"; + homepage = "https://jinja.palletsprojects.com"; + license = licenses.bsd3; + longDescription = '' + Jinja is a fast, expressive, extensible templating engine. Special + placeholders in the template allow writing code similar to Python + syntax. Then the template is passed data to render the final document. + ''; + maintainers = with maintainers; [ pierron ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/jinja2/patches/import-order.patch b/pkgs/by-name/py/python/python-modules/jinja2/patches/import-order.patch new file mode 100644 index 0000000..38514df --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/jinja2/patches/import-order.patch @@ -0,0 +1,27 @@ +Sphinx changed something between sphinx=4.5.0 and sphinx=5.3 that broke +"sphinxcontrib.log_cabinet" plugin. + +When Sphinx tries to importlib.import_module("sphinxcontrib.log_cabinet"), it +has couple other sphinxcontrib.* libraries in sys.path, and they seem to cause +conflict. So here I purge sys.path from sphixcontrib-related things, import +log_cabinet and put everything back, so when Sphinx will do "import_module", +"sphinxcontrib.log_cabinet" will be already imported and cached. + +All this is quite hacky, but we are talking about merely building documentation +here. If resulting html looks good, what happened in Nix sandbox stays in Nix +sandbox. + +--- a/docs/conf.py 1970-01-01 00:00:00.000000000 -0000 ++++ b/docs/conf.py 1970-01-01 00:00:00.000000000 -0000 +@@ -1,5 +1,12 @@ + from pallets_sphinx_themes import get_version + from pallets_sphinx_themes import ProjectLink ++import importlib ++import sys ++ ++saved_path = sys.path ++sys.path = [x for x in sys.path if "sphinxcontrib" not in x or "cabinet" in x] ++import sphinxcontrib.log_cabinet ++sys.path = saved_path + + # Project -------------------------------------------------------------- diff --git a/pkgs/by-name/py/python/python-modules/lxml/default.nix b/pkgs/by-name/py/python/python-modules/lxml/default.nix new file mode 100644 index 0000000..d1d7036 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/lxml/default.nix @@ -0,0 +1,63 @@ +{ stdenv +, lib +, buildPythonPackage +, fetchFromGitHub + +# build-system +, cython +, setuptools + +# native dependencies +, libxml2 +, libxslt +, zlib +, xcodebuild +}: + +buildPythonPackage rec { + pname = "lxml"; + version = "5.1.0"; + pyproject = true; + + src = fetchFromGitHub { + owner = "lxml"; + repo = "lxml"; + rev = "refs/tags/lxml-${version}"; + hash = "sha256-eWLYzZWatYDmhuBTZynsdytlNFKKmtWQ1XIyzVD8sDY="; + }; + + # setuptoolsBuildPhase needs dependencies to be passed through nativeBuildInputs + nativeBuildInputs = [ + libxml2.dev + libxslt.dev + cython + setuptools + ] ++ lib.optionals stdenv.isDarwin [ + xcodebuild + ]; + buildInputs = [ + libxml2 + libxslt + zlib + ]; + + env = lib.optionalAttrs stdenv.cc.isClang { + NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-function-pointer-types"; + }; + + # tests are meant to be ran "in-place" in the same directory as src + doCheck = false; + + pythonImportsCheck = [ + "lxml" + "lxml.etree" + ]; + + meta = with lib; { + changelog = "https://github.com/lxml/lxml/blob/lxml-${version}/CHANGES.txt"; + description = "Pythonic binding for the libxml2 and libxslt libraries"; + homepage = "https://lxml.de"; + license = licenses.bsd3; + maintainers = with maintainers; [ jonringer ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/lxml/libxml-2.12.patch b/pkgs/by-name/py/python/python-modules/lxml/libxml-2.12.patch new file mode 100644 index 0000000..d0d211c --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/lxml/libxml-2.12.patch @@ -0,0 +1,94 @@ +From 3b8807306d79d2ae2e9fa28c5ecd3b40b32ee65b Mon Sep 17 00:00:00 2001 +From: Stefan Behnel +Date: Wed, 29 Nov 2023 10:28:47 +0100 +Subject: [PATCH] Follow changes in libxml2 2.12 and make xmlError usages + 'const'. This mostly impacts the error callback functions. + +--- + src/lxml/extensions.pxi | 4 ++-- + src/lxml/parser.pxi | 4 ++-- + src/lxml/xmlerror.pxi | 8 ++++---- + 3 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/src/lxml/extensions.pxi b/src/lxml/extensions.pxi +index 35a321b7..42b4c4f6 100644 +--- a/src/lxml/extensions.pxi ++++ b/src/lxml/extensions.pxi +@@ -393,7 +393,7 @@ cdef tuple LIBXML2_XPATH_ERROR_MESSAGES = ( + b"?? Unknown error ??\n", + ) + +-cdef void _forwardXPathError(void* c_ctxt, xmlerror.xmlError* c_error) with gil: ++cdef void _forwardXPathError(void* c_ctxt, const xmlerror.xmlError* c_error) with gil: + cdef xmlerror.xmlError error + cdef int xpath_code + if c_error.message is not NULL: +@@ -414,7 +414,7 @@ cdef void _forwardXPathError(void* c_ctxt, xmlerror.xmlError* c_error) with gil: + + (<_BaseContext>c_ctxt)._error_log._receive(&error) + +-cdef void _receiveXPathError(void* c_context, xmlerror.xmlError* error) nogil: ++cdef void _receiveXPathError(void* c_context, const xmlerror.xmlError* error) nogil: + if not __DEBUG: + return + if c_context is NULL: +diff --git a/src/lxml/parser.pxi b/src/lxml/parser.pxi +index 22463c7d..1566b6df 100644 +--- a/src/lxml/parser.pxi ++++ b/src/lxml/parser.pxi +@@ -626,10 +626,10 @@ cdef _initParserContext(_ParserContext context, + if c_ctxt is not NULL: + context._initParserContext(c_ctxt) + +-cdef void _forwardParserError(xmlparser.xmlParserCtxt* _parser_context, xmlerror.xmlError* error) with gil: ++cdef void _forwardParserError(xmlparser.xmlParserCtxt* _parser_context, const xmlerror.xmlError* error) with gil: + (<_ParserContext>_parser_context._private)._error_log._receive(error) + +-cdef void _receiveParserError(void* c_context, xmlerror.xmlError* error) nogil: ++cdef void _receiveParserError(void* c_context, const xmlerror.xmlError* error) nogil: + if __DEBUG: + if c_context is NULL or (c_context)._private is NULL: + _forwardError(NULL, error) +diff --git a/src/lxml/xmlerror.pxi b/src/lxml/xmlerror.pxi +index 1b50444f..4cd745f9 100644 +--- a/src/lxml/xmlerror.pxi ++++ b/src/lxml/xmlerror.pxi +@@ -66,7 +66,7 @@ cdef class _LogEntry: + tree.xmlFree(self._c_path) + + @cython.final +- cdef _setError(self, xmlerror.xmlError* error): ++ cdef _setError(self, const xmlerror.xmlError* error): + self.domain = error.domain + self.type = error.code + self.level = error.level +@@ -198,7 +198,7 @@ cdef class _BaseErrorLog: + pass + + @cython.final +- cdef void _receive(self, xmlerror.xmlError* error): ++ cdef void _receive(self, const xmlerror.xmlError* error): + cdef bint is_error + cdef _LogEntry entry + cdef _BaseErrorLog global_log +@@ -634,7 +634,7 @@ def use_global_python_log(PyErrorLog log not None): + + + # local log functions: forward error to logger object +-cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error) with gil: ++cdef void _forwardError(void* c_log_handler, const xmlerror.xmlError* error) with gil: + cdef _BaseErrorLog log_handler + if c_log_handler is not NULL: + log_handler = <_BaseErrorLog>c_log_handler +@@ -645,7 +645,7 @@ cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error) with gil: + log_handler._receive(error) + + +-cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error) nogil: ++cdef void _receiveError(void* c_log_handler, const xmlerror.xmlError* error) nogil: + # no Python objects here, may be called without thread context ! + if __DEBUG: + _forwardError(c_log_handler, error) +-- +2.42.0 + diff --git a/pkgs/by-name/py/python/python-modules/markupsafe/default.nix b/pkgs/by-name/py/python/python-modules/markupsafe/default.nix new file mode 100644 index 0000000..60d2257 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/markupsafe/default.nix @@ -0,0 +1,60 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder + +# build-system +, setuptools + +# tests +, pytestCheckHook + +# for passthru.tests +# , jinja2 +# , mkdocs +# , quart +# , werkzeug +}: + +buildPythonPackage rec { + pname = "markupsafe"; + version = "2.1.5"; + pyproject = true; + + disabled = pythonOlder "3.8"; + + src = fetchPypi { + pname = "MarkupSafe"; + inherit version; + hash = "sha256-0oPTeokLpMGuc/+t+ARkNcdue8Ike7tjwAvRpwnGVEs="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "markupsafe" + ]; + + # passthru.tests = { + # inherit + # jinja2 + # mkdocs + # quart + # werkzeug + # ; + # }; + + meta = with lib; { + changelog = "https://markupsafe.palletsprojects.com/en/${versions.majorMinor version}.x/changes/#version-${replaceStrings [ "." ] [ "-" ] version}"; + description = "Implements a XML/HTML/XHTML Markup safe string"; + homepage = "https://palletsprojects.com/p/markupsafe/"; + license = licenses.bsd3; + maintainers = with maintainers; [ domenkozar ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/mkdocs/default.nix b/pkgs/by-name/py/python/python-modules/mkdocs/default.nix new file mode 100644 index 0000000..a20958d --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/mkdocs/default.nix @@ -0,0 +1,105 @@ +{ + # eval time deps + lib +, buildPythonPackage +, fetchFromGitHub +, pythonAtLeast +, pythonOlder + +# buildtime +, hatchling + +# runtime deps +, click +, ghp-import +, importlib-metadata +, jinja2 +, markdown +, markupsafe +, mergedeep +, packaging +, pathspec +, platformdirs +, pyyaml +, pyyaml-env-tag +, watchdog + +# optional-dependencies +, babel +, setuptools + +# testing deps +, mock +, unittestCheckHook +}: + +buildPythonPackage rec { + pname = "mkdocs"; + version = "1.5.3"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = pname; + repo = pname; + rev = "refs/tags/${version}"; + hash = "sha256-axH4AeL+osxoUIVJbW6YjiTfUr6TAXMB4raZ3oO0fyw="; + }; + + nativeBuildInputs = [ + hatchling + ]; + + propagatedBuildInputs = [ + click + ghp-import + jinja2 + markdown + markupsafe + mergedeep + packaging + pathspec + platformdirs + pyyaml + pyyaml-env-tag + watchdog + ] ++ lib.optionals (pythonOlder "3.10") [ + importlib-metadata + ]; + + passthru.optional-dependencies = { + i18n = [ + babel + ] ++ lib.optionals (pythonAtLeast "3.12") [ + setuptools + ]; + }; + + nativeCheckInputs = [ + unittestCheckHook + mock + ] ++ passthru.optional-dependencies.i18n; + + unittestFlagsArray = [ "-v" "-p" "'*tests.py'" "mkdocs" ]; + + pythonImportsCheck = [ "mkdocs" ]; + + meta = with lib; { + changelog = "https://github.com/mkdocs/mkdocs/releases/tag/${version}"; + description = "Project documentation with Markdown / static website generator"; + mainProgram = "mkdocs"; + downloadPage = "https://github.com/mkdocs/mkdocs"; + longDescription = '' + MkDocs is a fast, simple and downright gorgeous static site generator that's + geared towards building project documentation. Documentation source files + are written in Markdown, and configured with a single YAML configuration file. + + MkDocs can also be used to generate general-purpose websites. + ''; + homepage = "http://mkdocs.org/"; + license = licenses.bsd2; + platforms = platforms.unix; + maintainers = with maintainers; [ rkoe ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/mock/default.nix b/pkgs/by-name/py/python/python-modules/mock/default.nix new file mode 100644 index 0000000..7e5a72a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/mock/default.nix @@ -0,0 +1,35 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "mock"; + version = "5.1.0"; + format = "setuptools"; + + disabled = pythonOlder "3.6"; + + src = fetchPypi { + inherit pname version; + sha256 = "sha256-Xpaq1czaRxjgointlLICTfdcwtVVdbpXYtMfV2e4dn0="; + }; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "mock" + ]; + + meta = with lib; { + description = "Rolling backport of unittest.mock for all Pythons"; + homepage = "https://github.com/testing-cabal/mock"; + changelog = "https://github.com/testing-cabal/mock/blob/${version}/CHANGELOG.rst"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/nose/default.nix b/pkgs/by-name/py/python/python-modules/nose/default.nix new file mode 100644 index 0000000..d59dd0d --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/nose/default.nix @@ -0,0 +1,55 @@ +{ lib +, buildPythonPackage +, fetchPypi +, isPy3k +, isPyPy +, python + ,pythonAtLeast +, coverage +}: + +buildPythonPackage rec { + version = "1.3.7"; + format = "setuptools"; + pname = "nose"; + + # unmaintained, relies on the imp module + disabled = pythonAtLeast "3.12"; + + src = fetchPypi { + inherit pname version; + sha256 = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"; + }; + + # 2to3 was removed in setuptools 58 + postPatch = '' + substituteInPlace setup.py \ + --replace "'use_2to3': True," "" + + substituteInPlace setup3lib.py \ + --replace "from setuptools.command.build_py import Mixin2to3" "from distutils.util import Mixin2to3" + ''; + + preBuild = lib.optionalString (isPy3k) '' + ${python.pythonOnBuildForHost}/bin/2to3 -wn nose functional_tests unit_tests + ''; + + propagatedBuildInputs = [ coverage ]; + + doCheck = false; # lot's of transient errors, too much hassle + checkPhase = if isPy3k then '' + ${python.pythonOnBuildForHost.interpreter} setup.py build_tests + '' else "" + '' + rm functional_tests/test_multiprocessing/test_concurrent_shared.py* # see https://github.com/nose-devs/nose/commit/226bc671c73643887b36b8467b34ad485c2df062 + ${python.pythonOnBuildForHost.interpreter} selftest.py + ''; + + meta = with lib; { + broken = isPyPy; # missing 2to3 conversion utility + description = "A unittest-based testing framework for python that makes writing and running tests easier"; + mainProgram = "nosetests"; + homepage = "https://nose.readthedocs.io/"; + license = licenses.lgpl3; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/numpy/0001-BLD-remove-last-usage-of-distutils-in-_core-code_gen.patch b/pkgs/by-name/py/python/python-modules/numpy/0001-BLD-remove-last-usage-of-distutils-in-_core-code_gen.patch new file mode 100644 index 0000000..b9bc53e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/numpy/0001-BLD-remove-last-usage-of-distutils-in-_core-code_gen.patch @@ -0,0 +1,71 @@ +From 0d0476328a1a2e3dd3e96340bd4ddd04d98c067b Mon Sep 17 00:00:00 2001 +From: Ralf Gommers +Date: Thu, 26 Oct 2023 16:57:03 +0200 +Subject: [PATCH] BLD: remove last usage of `distutils` in + `_core/code_generators/` + +--- + numpy/core/code_generators/genapi.py | 9 --------- + numpy/core/code_generators/generate_numpy_api.py | 7 +------ + numpy/core/code_generators/generate_ufunc_api.py | 7 +------ + 3 files changed, 2 insertions(+), 21 deletions(-) + +diff --git a/numpy/core/code_generators/genapi.py b/numpy/core/code_generators/genapi.py +index 2cdaba52d..d9d7862b2 100644 +--- a/numpy/core/code_generators/genapi.py ++++ b/numpy/core/code_generators/genapi.py +@@ -304,15 +304,6 @@ def find_functions(filename, tag='API'): + fo.close() + return functions + +-def should_rebuild(targets, source_files): +- from distutils.dep_util import newer_group +- for t in targets: +- if not os.path.exists(t): +- return True +- sources = API_FILES + list(source_files) + [__file__] +- if newer_group(sources, targets[0], missing='newer'): +- return True +- return False + + def write_file(filename, data): + """ +diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py +index ae38c4efc..640bae9e5 100644 +--- a/numpy/core/code_generators/generate_numpy_api.py ++++ b/numpy/core/code_generators/generate_numpy_api.py +@@ -148,12 +148,7 @@ def generate_api(output_dir, force=False): + targets = (h_file, c_file) + + sources = numpy_api.multiarray_api +- +- if (not force and not genapi.should_rebuild(targets, [numpy_api.__file__, __file__])): +- return targets +- else: +- do_generate_api(targets, sources) +- ++ do_generate_api(targets, sources) + return targets + + def do_generate_api(targets, sources): +diff --git a/numpy/core/code_generators/generate_ufunc_api.py b/numpy/core/code_generators/generate_ufunc_api.py +index e03299a52..3734cbd6a 100644 +--- a/numpy/core/code_generators/generate_ufunc_api.py ++++ b/numpy/core/code_generators/generate_ufunc_api.py +@@ -125,12 +125,7 @@ def generate_api(output_dir, force=False): + targets = (h_file, c_file) + + sources = ['ufunc_api_order.txt'] +- +- if (not force and not genapi.should_rebuild(targets, sources + [__file__])): +- return targets +- else: +- do_generate_api(targets, sources) +- ++ do_generate_api(targets, sources) + return targets + + def do_generate_api(targets, sources): +-- +2.42.0 + diff --git a/pkgs/by-name/py/python/python-modules/numpy/default.nix b/pkgs/by-name/py/python/python-modules/numpy/default.nix new file mode 100644 index 0000000..4299c6d --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/numpy/default.nix @@ -0,0 +1,190 @@ +{ lib +, stdenv +, fetchPypi +, python +, pythonAtLeast +, pythonOlder +, buildPythonPackage +, writeTextFile + +# build-system +, cython +, gfortran +, meson-python +, mesonEmulatorHook +, pkg-config +, xcbuild + +# native dependencies +, blas +, lapack + +# tests +, hypothesis +, pytest-xdist +, pytestCheckHook +, setuptools +, typing-extensions +}: + +assert (!blas.isILP64) && (!lapack.isILP64); + +let + cfg = writeTextFile { + name = "site.cfg"; + text = lib.generators.toINI {} { + ${blas.implementation} = { + include_dirs = "${lib.getDev blas}/include:${lib.getDev lapack}/include"; + library_dirs = "${blas}/lib:${lapack}/lib"; + runtime_library_dirs = "${blas}/lib:${lapack}/lib"; + libraries = "lapack,lapacke,blas,cblas"; + }; + lapack = { + include_dirs = "${lib.getDev lapack}/include"; + library_dirs = "${lapack}/lib"; + runtime_library_dirs = "${lapack}/lib"; + }; + blas = { + include_dirs = "${lib.getDev blas}/include"; + library_dirs = "${blas}/lib"; + runtime_library_dirs = "${blas}/lib"; + }; + }; + }; +in buildPythonPackage rec { + pname = "numpy"; + version = "1.26.4"; + pyproject = true; + disabled = pythonOlder "3.9" || pythonAtLeast "3.13"; + + src = fetchPypi { + inherit pname version; + extension = "tar.gz"; + hash = "sha256-KgKrqe0S5KxOs+qUIcQgMBoMZGDZgw10qd+H76SRIBA="; + }; + + patches = [ + # Disable `numpy/core/tests/test_umath.py::TestComplexFunctions::test_loss_of_precision[complex256]` + # on x86_64-darwin because it fails under Rosetta 2 due to issues with trig functions and + # 80-bit long double complex numbers. + ./disable-failing-long-double-test-Rosetta-2.patch + ] + # We patch cpython/distutils to fix https://bugs.python.org/issue1222585 + # Patching of numpy.distutils is needed to prevent it from undoing the + # patch to distutils. + ++ lib.optionals python.hasDistutilsCxxPatch [ + ./numpy-distutils-C++.patch + ]; + + postPatch = '' + # fails with multiple errors because we are not using the pinned setuptools version + # see https://github.com/numpy/numpy/blob/v1.25.0/pyproject.toml#L7 + # error: option --single-version-externally-managed not recognized + # TypeError: dist must be a Distribution instance + rm numpy/core/tests/test_cython.py + + patchShebangs numpy/_build_utils/*.py + + # remove needless reference to full Python path stored in built wheel + substituteInPlace numpy/meson.build \ + --replace 'py.full_path()' "'python'" + ''; + + nativeBuildInputs = [ + cython + gfortran + meson-python + pkg-config + ] ++ lib.optionals (stdenv.isDarwin) [ + xcbuild.xcrun + ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [ + mesonEmulatorHook + ]; + + buildInputs = [ + blas + lapack + ]; + + # Causes `error: argument unused during compilation: '-fno-strict-overflow'` due to `-Werror`. + hardeningDisable = lib.optionals stdenv.cc.isClang [ "strictoverflow" ]; + + # we default openblas to build with 64 threads + # if a machine has more than 64 threads, it will segfault + # see https://github.com/OpenMathLib/OpenBLAS/issues/2993 + preConfigure = '' + sed -i 's/-faltivec//' numpy/distutils/system_info.py + export OMP_NUM_THREADS=$((NIX_BUILD_CORES > 64 ? 64 : NIX_BUILD_CORES)) + ''; + + # HACK: copy mesonEmulatorHook's flags to the variable used by meson-python + postConfigure = '' + mesonFlags="$mesonFlags ''${mesonFlagsArray[@]}" + ''; + + preBuild = '' + ln -s ${cfg} site.cfg + ''; + + enableParallelBuilding = true; + + nativeCheckInputs = [ + pytest-xdist + pytestCheckHook + hypothesis + setuptools + typing-extensions + ]; + + preCheck = '' + cd "$out" + ''; + + # https://github.com/numpy/numpy/blob/a277f6210739c11028f281b8495faf7da298dbef/numpy/_pytesttester.py#L180 + pytestFlagsArray = [ + "-m" "not\\ slow" # fast test suite + ]; + + # https://github.com/numpy/numpy/issues/24548 + disabledTests = lib.optionals stdenv.isi686 [ + "test_new_policy" # AssertionError: assert False + "test_identityless_reduction_huge_array" # ValueError: Maximum allowed dimension exceeded + "test_float_remainder_overflow" # AssertionError: FloatingPointError not raised by divmod + "test_int" # AssertionError: selectedintkind(19): expected 16 but got -1 + ] ++ lib.optionals stdenv.isAarch32 [ + "test_impossible_feature_enable" # AssertionError: Failed to generate error + "test_features" # AssertionError: Failure Detection + "test_new_policy" # AssertionError: assert False + "test_identityless_reduction_huge_array" # ValueError: Maximum allowed dimension exceeded + "test_unary_spurious_fpexception"# AssertionError: Got warnings: [] + "test_int" # AssertionError: selectedintkind(19): expected 16 but got -1 + "test_real" # AssertionError: selectedrealkind(16): expected 10 but got -1 + "test_quad_precision" # AssertionError: selectedrealkind(32): expected 16 but got -1 + "test_big_arrays" # ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger tha... + "test_multinomial_pvals_float32" # Failed: DID NOT RAISE + ] ++ lib.optionals stdenv.isAarch64 [ + "test_big_arrays" # OOM on a 16G machine + ] ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [ + # can fail on virtualized machines confused over their cpu identity + "test_dispatcher" + ]; + + passthru = { + # just for backwards compatibility + blas = blas.provider; + blasImplementation = blas.implementation; + inherit cfg; + }; + + # Disable test + # - test_large_file_support: takes a long time and can cause the machine to run out of disk space + env.NOSE_EXCLUDE = "test_large_file_support"; + + meta = { + changelog = "https://github.com/numpy/numpy/releases/tag/v${version}"; + description = "Scientific tools for Python"; + mainProgram = "f2py"; + homepage = "https://numpy.org/"; + license = lib.licenses.bsd3; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch b/pkgs/by-name/py/python/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch new file mode 100644 index 0000000..3e44674 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch @@ -0,0 +1,23 @@ +diff --git a/numpy/core/tests/test_umath.py b/numpy/core/tests/test_umath.py +index 6951d41e4..eefe86ad4 100644 +--- a/numpy/core/tests/test_umath.py ++++ b/numpy/core/tests/test_umath.py +@@ -4180,7 +4180,17 @@ def test_against_cmath(self): + ) + @pytest.mark.xfail(IS_MUSL, reason="gh23049") + @pytest.mark.xfail(IS_WASM, reason="doesn't work") +- @pytest.mark.parametrize('dtype', [np.complex64, np.complex_, np.longcomplex]) ++ @pytest.mark.parametrize('dtype', [ ++ np.complex64, ++ np.complex_, ++ pytest.param( ++ np.longcomplex, ++ marks=pytest.mark.skipif( ++ sys.platform == "darwin" and platform.machine() == "x86_64", ++ reason="doesn’t work under Rosetta 2", ++ ), ++ ), ++ ]) + def test_loss_of_precision(self, dtype): + """Check loss of precision in complex arc* functions""" + diff --git a/pkgs/by-name/py/python/python-modules/numpy/numpy-distutils-C++.patch b/pkgs/by-name/py/python/python-modules/numpy/numpy-distutils-C++.patch new file mode 100644 index 0000000..6c75f34 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/numpy/numpy-distutils-C++.patch @@ -0,0 +1,30 @@ +diff --git a/numpy/distutils/unixccompiler.py b/numpy/distutils/unixccompiler.py +--- a/numpy/distutils/unixccompiler.py ++++ b/numpy/distutils/unixccompiler.py +@@ -37,8 +37,6 @@ def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts + if opt not in llink_s: + self.linker_so = llink_s.split() + opt.split() + +- display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src) +- + # gcc style automatic dependencies, outputs a makefile (-MF) that lists + # all headers needed by a c file as a side effect of compilation (-MMD) + if getattr(self, '_auto_depends', False): +@@ -47,8 +45,15 @@ def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts + deps = [] + + try: +- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + deps + +- extra_postargs, display = display) ++ if self.detect_language(src) == 'c++': ++ display = '%s: %s' % (os.path.basename(self.compiler_so_cxx[0]), src) ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + deps + ++ extra_postargs, display = display) ++ else: ++ display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src) ++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + deps + ++ extra_postargs, display = display) ++ + except DistutilsExecError as e: + msg = str(e) + raise CompileError(msg) diff --git a/pkgs/by-name/py/python/python-modules/packaging/default.nix b/pkgs/by-name/py/python/python-modules/packaging/default.nix new file mode 100644 index 0000000..32ce7fd --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/packaging/default.nix @@ -0,0 +1,60 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder + +# build-system +, flit-core + +# tests +, pretend +, pytestCheckHook +}: + +let + packaging = buildPythonPackage rec { + pname = "packaging"; + version = "24.0"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-64LF4+ViCQdHZuaIW7BLjDigwBXQowA26+fs40yZiek="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + nativeCheckInputs = [ + pytestCheckHook + pretend + ]; + + pythonImportsCheck = [ + "packaging" + "packaging.metadata" + "packaging.requirements" + "packaging.specifiers" + "packaging.tags" + "packaging.version" + ]; + + # Prevent circular dependency with pytest + doCheck = false; + + passthru.tests = packaging.overridePythonAttrs (_: { doCheck = true; }); + + meta = with lib; { + changelog = "https://github.com/pypa/packaging/blob/${version}/CHANGELOG.rst"; + description = "Core utilities for Python packages"; + downloadPage = "https://github.com/pypa/packaging"; + homepage = "https://packaging.pypa.io/"; + license = with licenses; [ bsd2 asl20 ]; + maintainers = teams.python.members ++ (with maintainers; [ bennofs ]); + }; + }; +in +packaging diff --git a/pkgs/by-name/py/python/python-modules/pallets-sphinx-themes/default.nix b/pkgs/by-name/py/python/python-modules/pallets-sphinx-themes/default.nix new file mode 100644 index 0000000..9020e45 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pallets-sphinx-themes/default.nix @@ -0,0 +1,27 @@ +{ lib, buildPythonPackage, fetchFromGitHub, sphinx, packaging }: + +buildPythonPackage rec { + pname = "pallets-sphinx-themes"; + version = "2.1.1"; + format = "setuptools"; + + src = fetchFromGitHub { + owner = "pallets"; + repo = "pallets-sphinx-themes"; + rev = "refs/tags/${version}"; + sha256 = "sha256-Z03rsqkwF2rYaqRZflf5qc5EdHPIEcEcB1ftYIm5DQs="; + }; + + propagatedBuildInputs = [ packaging sphinx ]; + + pythonImportsCheck = [ "pallets_sphinx_themes" ]; + + doCheck = false; + + meta = with lib; { + homepage = "https://github.com/pallets/pallets-sphinx-themes"; + description = "Sphinx theme for Pallets projects"; + license = licenses.bsd3; + maintainers = with maintainers; [ kaction ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pathspec/default.nix b/pkgs/by-name/py/python/python-modules/pathspec/default.nix new file mode 100644 index 0000000..b23ed50 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pathspec/default.nix @@ -0,0 +1,48 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +, unittestCheckHook + +# for passthru.tests +# , awsebcli +# , black +# , hatchling +# , yamllint +}: + +buildPythonPackage rec { + pname = "pathspec"; + version = "0.12.1"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-pILVFQOhqzOxxnpsOBOiaVPb3HHDHayu+ag4xOKfVxI="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + pythonImportsCheck = [ + "pathspec" + ]; + + checkInputs = [ + unittestCheckHook + ]; + + # passthru.tests = { + # inherit awsebcli black hatchling yamllint; + # }; + + meta = { + description = "Utility library for gitignore-style pattern matching of file paths"; + homepage = "https://github.com/cpburnz/python-path-specification"; + changelog = "https://github.com/cpburnz/python-pathspec/blob/v${version}/CHANGES.rst"; + license = lib.licenses.mpl20; + maintainers = with lib.maintainers; [ copumpkin ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pluggy/default.nix b/pkgs/by-name/py/python/python-modules/pluggy/default.nix new file mode 100644 index 0000000..a3b7766 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pluggy/default.nix @@ -0,0 +1,40 @@ +{ buildPythonPackage +, lib +, fetchFromGitHub +, setuptools-scm +, pythonOlder +# , importlib-metadata +, callPackage +}: + +buildPythonPackage rec { + pname = "pluggy"; + version = "1.4.0"; + + disabled = pythonOlder "3.8"; + + pyproject = true; + + src = fetchFromGitHub { + owner = "pytest-dev"; + repo = "pluggy"; + rev = "refs/tags/${version}"; + hash = "sha256-1XHJwODmpYQkYZvnZck6RrtT4lOeCf8cr1QFx9DCbzw="; + }; + + nativeBuildInputs = [ setuptools-scm ]; + + # To prevent infinite recursion with pytest + doCheck = false; + passthru.tests = { + pytest = callPackage ./tests.nix { }; + }; + + meta = { + changelog = "https://github.com/pytest-dev/pluggy/blob/${src.rev}/CHANGELOG.rst"; + description = "Plugin and hook calling mechanisms for Python"; + homepage = "https://github.com/pytest-dev/pluggy"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pluggy/tests.nix b/pkgs/by-name/py/python/python-modules/pluggy/tests.nix new file mode 100644 index 0000000..dc6e16e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pluggy/tests.nix @@ -0,0 +1,20 @@ +{ buildPythonPackage +, pluggy +, pytestCheckHook +}: + +buildPythonPackage { + pname = "pluggy-tests"; + inherit (pluggy) version; + format = "other"; + + inherit (pluggy) src; + + dontBuild = true; + dontInstall = true; + + nativeCheckInputs = [ + pluggy + pytestCheckHook + ]; +} diff --git a/pkgs/by-name/py/python/python-modules/pretend/default.nix b/pkgs/by-name/py/python/python-modules/pretend/default.nix new file mode 100644 index 0000000..231b953 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pretend/default.nix @@ -0,0 +1,36 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, pytestCheckHook +, pythonOlder +}: + +buildPythonPackage rec { + pname = "pretend"; + version = "1.0.9"; + format = "setuptools"; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "alex"; + repo = pname; + rev = "v${version}"; + hash = "sha256-OqMfeIMFNBBLq6ejR3uOCIHZ9aA4zew7iefVlAsy1JQ="; + }; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ + "pretend" + ]; + + meta = with lib; { + description = "Module for stubbing"; + homepage = "https://github.com/alex/pretend"; + license = licenses.bsd3; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/psutil/default.nix b/pkgs/by-name/py/python/python-modules/psutil/default.nix new file mode 100644 index 0000000..a27bb42 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/psutil/default.nix @@ -0,0 +1,83 @@ +{ lib +, stdenv +, buildPythonPackage +, CoreFoundation +, fetchPypi +, IOKit +, pytestCheckHook +, python +, pythonOlder +}: + +buildPythonPackage rec { + pname = "psutil"; + version = "5.9.8"; + format = "setuptools"; + + inherit stdenv; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-a+Em4yJUht/yhqj7mgYkalJT9MfFO0depfWsk05kGUw="; + }; + + postPatch = '' + # stick to the old SDK name for now + # https://developer.apple.com/documentation/iokit/kiomasterportdefault/ + # https://developer.apple.com/documentation/iokit/kiomainportdefault/ + substituteInPlace psutil/arch/osx/cpu.c \ + --replace-fail kIOMainPortDefault kIOMasterPortDefault + ''; + + buildInputs = + # workaround for https://github.com/NixOS/nixpkgs/issues/146760 + lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [ + CoreFoundation + ] ++ lib.optionals stdenv.isDarwin [ + IOKit + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + # Segfaults on darwin: + # https://github.com/giampaolo/psutil/issues/1715 + doCheck = !stdenv.isDarwin; + + # In addition to the issues listed above there are some that occure due to + # our sandboxing which we can work around by disabling some tests: + # - cpu_times was flaky on darwin + # - the other disabled tests are likely due to sanboxing (missing specific errors) + pytestFlagsArray = [ + # Note: $out must be referenced as test import paths are relative + "$out/${python.sitePackages}/psutil/tests/test_system.py" + ]; + + disabledTests = [ + # Some of the tests have build-system hardware-based impurities (like + # reading temperature sensor values). Disable them to avoid the failures + # that sometimes result. + "cpu_freq" + "cpu_times" + "disk_io_counters" + "sensors_battery" + "sensors_temperatures" + "user" + "test_disk_partitions" # problematic on Hydra's Linux builders, apparently + ]; + + pythonImportsCheck = [ + "psutil" + ]; + + meta = with lib; { + description = "Process and system utilization information interface"; + homepage = "https://github.com/giampaolo/psutil"; + changelog = "https://github.com/giampaolo/psutil/blob/release-${version}/HISTORY.rst"; + license = licenses.bsd3; + maintainers = with maintainers; [ jonringer ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pycparser/default.nix b/pkgs/by-name/py/python/python-modules/pycparser/default.nix new file mode 100644 index 0000000..fa0622d --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pycparser/default.nix @@ -0,0 +1,23 @@ +{ lib, buildPythonPackage, fetchPypi, unittestCheckHook }: + +buildPythonPackage rec { + pname = "pycparser"; + version = "2.21"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"; + }; + + nativeCheckInputs = [ unittestCheckHook ]; + + unittestFlagsArray = [ "-s" "tests" ]; + + meta = with lib; { + description = "C parser in Python"; + homepage = "https://github.com/eliben/pycparser"; + license = licenses.bsd3; + maintainers = with maintainers; [ domenkozar ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pyelftools/default.nix b/pkgs/by-name/py/python/python-modules/pyelftools/default.nix new file mode 100644 index 0000000..84cdda6 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pyelftools/default.nix @@ -0,0 +1,44 @@ +{ lib +, stdenv +, buildPythonPackage +, fetchFromGitHub +, python +, pythonOlder +}: + +buildPythonPackage rec { + pname = "pyelftools"; + version = "0.30"; + format = "setuptools"; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "eliben"; + repo = pname; + rev = "v${version}"; + hash = "sha256-A9etnN7G24/Gu8YlV/YDpxZV+TG2eVXGx2ZjVnA9ZD4="; + }; + + doCheck = stdenv.hostPlatform.system == "x86_64-linux" && stdenv.hostPlatform.isGnu; + + checkPhase = '' + patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" test/external_tools/readelf + ${python.interpreter} test/run_all_unittests.py + ${python.interpreter} test/run_examples_test.py + ${python.interpreter} test/run_readelf_tests.py --parallel + ''; + + pythonImportsCheck = [ + "elftools" + ]; + + meta = with lib; { + description = "Python library for analyzing ELF files and DWARF debugging information"; + mainProgram = "readelf.py"; + homepage = "https://github.com/eliben/pyelftools"; + changelog = "https://github.com/eliben/pyelftools/blob/v${version}/CHANGES"; + license = licenses.publicDomain; + maintainers = with maintainers; [ igsha pamplemousse ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pygit2/default.nix b/pkgs/by-name/py/python/python-modules/pygit2/default.nix new file mode 100644 index 0000000..1e17f95 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pygit2/default.nix @@ -0,0 +1,77 @@ +{ lib +, stdenv +, buildPythonPackage +, cacert +, cached-property +, cffi +, fetchPypi +, isPyPy +, libgit2 +, pycparser +, pytestCheckHook +, pythonOlder +, setuptools +}: + +buildPythonPackage rec { + pname = "pygit2"; + version = "1.14.1"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-7FlYVxuCpjUXhcpkXlOUwxrkXuxThLL6nE4F3eNZetY="; + }; + + preConfigure = lib.optionalString stdenv.isDarwin '' + export DYLD_LIBRARY_PATH="${libgit2}/lib" + ''; + + nativeBuildInputs = [ + setuptools + ]; + + buildInputs = [ + libgit2 + ]; + + propagatedBuildInputs = [ + cached-property + pycparser + ] ++ lib.optionals (!isPyPy) [ + cffi + ]; + + propagatedNativeBuildInputs = lib.optionals (!isPyPy) [ + cffi + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + disabledTestPaths = [ + # Disable tests that require networking + "test/test_repository.py" + "test/test_credentials.py" + "test/test_submodule.py" + ]; + + # Tests require certificates + # https://github.com/NixOS/nixpkgs/pull/72544#issuecomment-582674047 + SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + pythonImportsCheck = [ + "pygit2" + ]; + + meta = with lib; { + description = "A set of Python bindings to the libgit2 shared library"; + homepage = "https://github.com/libgit2/pygit2"; + changelog = "https://github.com/libgit2/pygit2/blob/v${version}/CHANGELOG.md"; + license = licenses.gpl2Only; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pygments/default.nix b/pkgs/by-name/py/python/python-modules/pygments/default.nix new file mode 100644 index 0000000..4be48e1 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pygments/default.nix @@ -0,0 +1,58 @@ +{ lib +, buildPythonPackage +, fetchPypi + +# build-system +, hatchling + +# tests +, pytestCheckHook +, wcag-contrast-ratio +}: + +let pygments = buildPythonPackage + rec { + pname = "pygments"; + version = "2.17.2"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-2kbOyf0t5b46inhPQ05MSrZwtP9U1gXEwnF+nUnEw2c="; + }; + + nativeBuildInputs = [ + hatchling + ]; + + # circular dependencies if enabled by default + doCheck = false; + + nativeCheckInputs = [ + pytestCheckHook + wcag-contrast-ratio + ]; + + disabledTestPaths = [ + # 5 lines diff, including one nix store path in 20000+ lines + "tests/examplefiles/bash/ltmain.sh" + ]; + + pythonImportsCheck = [ + "pygments" + ]; + + passthru.tests = { + check = pygments.overridePythonAttrs (_: { doCheck = true; }); + }; + + meta = with lib; { + changelog = "https://github.com/pygments/pygments/releases/tag/${version}"; + homepage = "https://pygments.org/"; + description = "A generic syntax highlighter"; + mainProgram = "pygmentize"; + license = licenses.bsd2; + maintainers = with maintainers; [ ]; + }; + }; +in pygments diff --git a/pkgs/by-name/py/python/python-modules/pyproject-hooks/default.nix b/pkgs/by-name/py/python/python-modules/pyproject-hooks/default.nix new file mode 100644 index 0000000..1d98d59 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pyproject-hooks/default.nix @@ -0,0 +1,74 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pythonOlder +, tomli +# for passthru.tests +# , pyproject-hooks +# , pytestCheckHook +# , setuptools +# , testpath +}: + +buildPythonPackage rec { + pname = "pyproject-hooks"; + version = "1.0.0"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi rec { + pname = "pyproject_hooks"; + inherit version; + hash = "sha256-8nGymLl/WVXVP7ErcsH7GUjCLBprcLMVxUztrKAmTvU="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + # We need to disable tests because this package is part of the bootstrap chain + # and its test dependencies cannot be built yet when this is being built. + doCheck = false; + + # passthru.tests = { + # pytest = buildPythonPackage { + # pname = "${pname}-pytest"; + # inherit version; + # format = "other"; + + # dontBuild = true; + # dontInstall = true; + + # nativeCheckInputs = [ + # pyproject-hooks + # pytestCheckHook + # setuptools + # testpath + # ]; + + # disabledTests = [ + # # fail to import setuptools + # "test_setup_py" + # "test_issue_104" + # ]; + # }; + # }; + + pythonImportsCheck = [ + "pyproject_hooks" + ]; + + meta = with lib; { + description = "Low-level library for calling build-backends in `pyproject.toml`-based project "; + homepage = "https://github.com/pypa/pyproject-hooks"; + changelog = "https://github.com/pypa/pyproject-hooks/blob/v${version}/docs/changelog.rst"; + license = licenses.mit; + maintainers = teams.python.members; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pysocks/default.nix b/pkgs/by-name/py/python/python-modules/pysocks/default.nix new file mode 100644 index 0000000..b007ef9 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pysocks/default.nix @@ -0,0 +1,25 @@ +{ lib +, buildPythonPackage +, fetchPypi +}: + +buildPythonPackage rec { + pname = "pysocks"; + version = "1.7.1"; + format = "setuptools"; + + src = fetchPypi { + pname = "PySocks"; + inherit version; + sha256 = "184sg65mbmih6ljblfsxcmq5js5l7dj3gpn618w9q5dy3rbh921z"; + }; + + doCheck = false; + + meta = with lib; { + description = "SOCKS module for Python"; + license = licenses.bsd3; + maintainers = with maintainers; [ thoughtpolice ]; + }; + +} diff --git a/pkgs/by-name/py/python/python-modules/pystemmer/default.nix b/pkgs/by-name/py/python/python-modules/pystemmer/default.nix new file mode 100644 index 0000000..0c29890 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pystemmer/default.nix @@ -0,0 +1,69 @@ +{ lib +, python +, fetchFromGitHub +, fetchpatch2 +, buildPythonPackage +, cython +, setuptools +, libstemmer + }: + +buildPythonPackage rec { + pname = "pystemmer"; + version = "2.2.0.1"; + pyproejct = true; + + src = fetchFromGitHub { + owner = "snowballstem"; + repo = "pystemmer"; + rev = "refs/tags/v${version}"; + hash = "sha256-ngPx95ybgJmndpNPBwCa3BCNsozRg+dlEw+nhlIwI58="; + }; + + patches = [ + (fetchpatch2 { + # relax cython constraint + name = "pystemmer-relax-cython.patch"; + url = "https://github.com/snowballstem/pystemmer/commit/d3d423dc877b4f49e0ab1776f7edaff37feb6799.patch"; + hash = "sha256-9K6gy/cLFPfW82XYHVVPXUbQhf8XyB4NUi4YqNtyWcw="; + }) + ]; + + build-system = [ + cython + setuptools + ]; + + postConfigure = '' + export PYSTEMMER_SYSTEM_LIBSTEMMER="${lib.getDev libstemmer}/include" + ''; + + env.NIX_CFLAGS_COMPILE = toString [ + "-I${lib.getDev libstemmer}/include" + ]; + + NIX_CFLAGS_LINK = [ + "-L${libstemmer}/lib" + ]; + + pythonImportsCheck = [ + "Stemmer" + ]; + + checkPhase = '' + runHook preCheck + ${python.interpreter} runtests.py + runHook postCheck + ''; + + meta = with lib; { + description = "Snowball stemming algorithms, for information retrieval"; + downloadPage = "https://github.com/snowballstem/pystemmer"; + homepage = "http://snowball.tartarus.org/"; + license = with licenses; [ + bsd3 + mit + ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-asyncio/default.nix b/pkgs/by-name/py/python/python-modules/pytest-asyncio/default.nix new file mode 100644 index 0000000..b7762e1 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-asyncio/default.nix @@ -0,0 +1,56 @@ +{ lib +, buildPythonPackage +, callPackage +, fetchFromGitHub +, pytest +, pythonOlder +, setuptools-scm +}: + +buildPythonPackage rec { + pname = "pytest-asyncio"; + version = "0.23.6"; # N.B.: when updating, tests bleak and aioesphomeapi tests + pyproject = true; + + disabled = pythonOlder "3.8"; + + src = fetchFromGitHub { + owner = "pytest-dev"; + repo = "pytest-asyncio"; + rev = "refs/tags/v${version}"; + hash = "sha256-+kyKcVzW05kqtLeC81rk3fJpOtyW3xSYshgl5gqIddE="; + }; + + outputs = [ + "out" + "testout" + ]; + + nativeBuildInputs = [ + setuptools-scm + ]; + + buildInputs = [ + pytest + ]; + + postInstall = '' + mkdir $testout + cp -R tests $testout/tests + ''; + + doCheck = false; + passthru.tests.pytest = callPackage ./tests.nix {}; + + pythonImportsCheck = [ + "pytest_asyncio" + ]; + + meta = with lib; { + description = "Library for testing asyncio code with pytest"; + homepage = "https://github.com/pytest-dev/pytest-asyncio"; + changelog = "https://github.com/pytest-dev/pytest-asyncio/blob/v${version}/docs/source/reference/changelog.rst"; + license = licenses.asl20; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-asyncio/tests.nix b/pkgs/by-name/py/python/python-modules/pytest-asyncio/tests.nix new file mode 100644 index 0000000..7fd26c8 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-asyncio/tests.nix @@ -0,0 +1,30 @@ +{ buildPythonPackage +, flaky +, hypothesis +, pytest-asyncio +, pytest-trio +, pytestCheckHook +}: + +buildPythonPackage { + pname = "pytest-asyncio-tests"; + inherit (pytest-asyncio) version; + + format = "other"; + + src = pytest-asyncio.testout; + + dontBuild = true; + dontInstall = true; + + propagatedBuildInputs = [ + pytest-asyncio + ]; + + nativeCheckInputs = [ + flaky + hypothesis + pytest-trio + pytestCheckHook + ]; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-expect/default.nix b/pkgs/by-name/py/python/python-modules/pytest-expect/default.nix new file mode 100644 index 0000000..df5376e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-expect/default.nix @@ -0,0 +1,30 @@ +{ buildPythonPackage +, lib +, fetchPypi +, pytest +, u-msgpack-python +, six +}: + +buildPythonPackage rec { + pname = "pytest-expect"; + version = "1.1.0"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "36b4462704450798197d090809a05f4e13649d9cba9acdc557ce9517da1fd847"; + }; + + buildInputs = [ pytest ]; + propagatedBuildInputs = [ u-msgpack-python six ]; + + # Tests in neither the archive nor the repo + doCheck = false; + + meta = { + description = "py.test plugin to store test expectations and mark tests based on them"; + homepage = "https://github.com/gsnedders/pytest-expect"; + license = lib.licenses.mit; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-mock/default.nix b/pkgs/by-name/py/python/python-modules/pytest-mock/default.nix new file mode 100644 index 0000000..f956a62 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-mock/default.nix @@ -0,0 +1,54 @@ +{ lib +, buildPythonPackage +, pythonAtLeast +, pythonOlder +, fetchPypi +, pytest +, pytest-asyncio +, pytestCheckHook +, setuptools +, setuptools-scm +}: + +buildPythonPackage rec { + pname = "pytest-mock"; + version = "3.12.0"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-MaQPA4wiytMih7tDkyBURR/1WD/wlLym9nXfL4vBpuk="; + }; + + nativeBuildInputs = [ + setuptools + setuptools-scm + ]; + + buildInputs = [ + pytest + ]; + + nativeCheckInputs = [ + pytest-asyncio + pytestCheckHook + ]; + + disabledTests = lib.optionals (pythonAtLeast "3.11") [ + # Regression in 3.11.7 and 3.12.1; https://github.com/pytest-dev/pytest-mock/issues/401 + "test_failure_message_with_name" + "test_failure_message_with_no_name" + ]; + + pythonImportsCheck = [ "pytest_mock" ]; + + meta = with lib; { + description = "Thin wrapper around the mock package for easier use with pytest"; + homepage = "https://github.com/pytest-dev/pytest-mock"; + changelog = "https://github.com/pytest-dev/pytest-mock/blob/v${version}/CHANGELOG.rst"; + license = licenses.mit; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-rerunfailures/default.nix b/pkgs/by-name/py/python/python-modules/pytest-rerunfailures/default.nix new file mode 100644 index 0000000..59d459a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-rerunfailures/default.nix @@ -0,0 +1,36 @@ +{ lib +, buildPythonPackage +, pythonOlder +, fetchPypi +, setuptools +, packaging +, pytest +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "pytest-rerunfailures"; + version = "13.0"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-4TLb5CC8R29US5bnA27dCmlwdXQgm2Z3JjyVDRmwkZk="; + }; + + nativeBuildInputs = [ setuptools ]; + + buildInputs = [ pytest ]; + propagatedBuildInputs = [ packaging ]; + + nativeCheckInputs = [ pytestCheckHook ]; + + meta = with lib; { + description = "Pytest plugin to re-run tests to eliminate flaky failures"; + homepage = "https://github.com/pytest-dev/pytest-rerunfailures"; + license = licenses.mpl20; + maintainers = with maintainers; [ das-g ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-timeout/default.nix b/pkgs/by-name/py/python/python-modules/pytest-timeout/default.nix new file mode 100644 index 0000000..3ea96b5 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-timeout/default.nix @@ -0,0 +1,49 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytest +, pytestCheckHook +, pexpect +}: + +buildPythonPackage rec { + pname = "pytest-timeout"; + version = "2.3.1"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-Ejl3KRJcbsvaygEDW55SOdTblzUjIK8VWz9d4bpRZdk="; + }; + + buildInputs = [ + pytest + ]; + + nativeCheckInputs = [ + pytestCheckHook + pexpect + ]; + + disabledTests = [ + "test_suppresses_timeout_when_pdb_is_entered" + # Remove until https://github.com/pytest-dev/pytest/pull/7207 or similar + "test_suppresses_timeout_when_debugger_is_entered" + ]; + + pytestFlagsArray = [ + "-ra" + ]; + + pythonImportsCheck = [ + "pytest_timeout" + ]; + + meta = with lib; { + description = "Pytest plugin to abort hanging tests"; + homepage = "https://github.com/pytest-dev/pytest-timeout/"; + changelog = "https://github.com/pytest-dev/pytest-timeout/#changelog"; + license = licenses.mit; + maintainers = with maintainers; [ makefu ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-xdist/default.nix b/pkgs/by-name/py/python/python-modules/pytest-xdist/default.nix new file mode 100644 index 0000000..947040f --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-xdist/default.nix @@ -0,0 +1,76 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, setuptools-scm +, pytestCheckHook +, filelock +, execnet +, pytest +, psutil +, setproctitle +}: + +buildPythonPackage rec { + pname = "pytest-xdist"; + version = "3.5.0"; + disabled = pythonOlder "3.7"; + + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-y7NvPWfgxHi6pX+k7ciEOIfg9s/ELWd1MKNtdHKzLYo="; + }; + + nativeBuildInputs = [ + setuptools-scm + ]; + + buildInputs = [ + pytest + ]; + + propagatedBuildInputs = [ + execnet + ]; + + nativeCheckInputs = [ + filelock + pytestCheckHook + ]; + + passthru.optional-dependencies = { + psutil = [ psutil ]; + setproctitle = [ setproctitle ]; + }; + + pytestFlagsArray = [ + # pytest can already use xdist at this point + "--numprocesses=$NIX_BUILD_CORES" + ]; + + # access file system + disabledTests = [ + "test_distribution_rsyncdirs_example" + "test_rsync_popen_with_path" + "test_popen_rsync_subdir" + "test_rsync_report" + "test_init_rsync_roots" + "test_rsyncignore" + # flakey + "test_internal_errors_propagate_to_controller" + # https://github.com/pytest-dev/pytest-xdist/issues/985 + "test_workqueue_ordered_by_size" + ]; + + setupHook = ./setup-hook.sh; + + meta = with lib; { + changelog = "https://github.com/pytest-dev/pytest-xdist/blob/v${version}/CHANGELOG.rst"; + description = "Pytest xdist plugin for distributed testing and loop-on-failing modes"; + homepage = "https://github.com/pytest-dev/pytest-xdist"; + license = licenses.mit; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest-xdist/setup-hook.sh b/pkgs/by-name/py/python/python-modules/pytest-xdist/setup-hook.sh new file mode 100644 index 0000000..4c6473c --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest-xdist/setup-hook.sh @@ -0,0 +1,17 @@ +pytestXdistHook() { + pytestFlagsArray+=( + "--numprocesses=$NIX_BUILD_CORES" + ) +} + +# the flags should be added before pytestCheckHook runs so +# until we have dependency mechanism in generic builder, we need to use this ugly hack. + +if [ -z "${dontUsePytestXdist-}" ] && [ -z "${dontUsePytestCheck-}" ]; then + if [[ " ${preDistPhases:-} " =~ " pytestCheckPhase " ]]; then + preDistPhases+=" " + preDistPhases="${preDistPhases/ pytestCheckPhase / pytestXdistHook pytestCheckPhase }" + else + preDistPhases+=" pytestXdistHook" + fi +fi diff --git a/pkgs/by-name/py/python/python-modules/pytest/7.nix b/pkgs/by-name/py/python/python-modules/pytest/7.nix new file mode 100644 index 0000000..835e8ff --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest/7.nix @@ -0,0 +1,116 @@ +{ lib +, buildPythonPackage +, callPackage +, pythonOlder +, fetchPypi +, writeText + +# build-system +, setuptools +, setuptools-scm + +# dependencies +, attrs +, exceptiongroup +, iniconfig +, packaging +, pluggy +, tomli + +# optional-dependencies +, argcomplete +, hypothesis +, mock +, nose +, pygments +, requests +, xmlschema +}: + +let self = buildPythonPackage rec { + pname = "pytest"; + version = "7.4.4"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-LPAAWSLGrOSj4uyLQIDrDZdT/ckxB0FTMvUM6eeZQoA="; + }; + + outputs = [ + "out" + "testout" + ]; + + nativeBuildInputs = [ + setuptools + setuptools-scm + ]; + + propagatedBuildInputs = [ + iniconfig + packaging + pluggy + ] ++ lib.optionals (pythonOlder "3.11") [ + exceptiongroup + tomli + ]; + + passthru.optional-dependencies = { + testing = [ + argcomplete + attrs + hypothesis + mock + nose + pygments + requests + setuptools + xmlschema + ]; + }; + + postInstall = '' + mkdir $testout + cp -R testing $testout/testing + ''; + + doCheck = false; + passthru.tests.pytest = callPackage ./tests.nix { + pytest = self; + }; + + # Remove .pytest_cache when using py.test in a Nix build + setupHook = writeText "pytest-hook" '' + pytestcachePhase() { + find $out -name .pytest_cache -type d -exec rm -rf {} + + } + preDistPhases+=" pytestcachePhase" + + # pytest generates it's own bytecode files to improve assertion messages. + # These files similar to cpython's bytecode files but are never laoded + # by python interpreter directly. We remove them for a few reasons: + # - files are non-deterministic: https://github.com/NixOS/nixpkgs/issues/139292 + # (file headers are generatedt by pytest directly and contain timestamps) + # - files are not needed after tests are finished + pytestRemoveBytecodePhase () { + # suffix is defined at: + # https://github.com/pytest-dev/pytest/blob/7.2.1/src/_pytest/assertion/rewrite.py#L51-L53 + find $out -name "*-pytest-*.py[co]" -delete + } + preDistPhases+=" pytestRemoveBytecodePhase" + ''; + + pythonImportsCheck = [ + "pytest" + ]; + + meta = with lib; { + description = "Framework for writing tests"; + homepage = "https://docs.pytest.org"; + changelog = "https://github.com/pytest-dev/pytest/releases/tag/${version}"; + maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ]; + license = licenses.mit; + }; +}; +in self diff --git a/pkgs/by-name/py/python/python-modules/pytest/default.nix b/pkgs/by-name/py/python/python-modules/pytest/default.nix new file mode 100644 index 0000000..9b99112 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest/default.nix @@ -0,0 +1,113 @@ +{ lib +, buildPythonPackage +, callPackage +, pythonOlder +, fetchPypi +, writeText + +# build-system +, setuptools +, setuptools-scm + +# dependencies +, attrs +, exceptiongroup +, iniconfig +, packaging +, pluggy +, tomli + +# optional-dependencies +, argcomplete +, hypothesis +, mock +, nose +, pygments +, requests +, xmlschema +}: + +buildPythonPackage rec { + pname = "pytest"; + version = "8.1.1"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-rJeBQadZSJSIF9NgKXt6rg/LnW/2vJ7G1RS4XVplwEQ="; + }; + + outputs = [ + "out" + "testout" + ]; + + nativeBuildInputs = [ + setuptools + setuptools-scm + ]; + + propagatedBuildInputs = [ + iniconfig + packaging + pluggy + ] ++ lib.optionals (pythonOlder "3.11") [ + exceptiongroup + tomli + ]; + + passthru.optional-dependencies = { + testing = [ + argcomplete + attrs + hypothesis + mock + nose + pygments + requests + setuptools + xmlschema + ]; + }; + + postInstall = '' + mkdir $testout + cp -R testing $testout/testing + ''; + + doCheck = false; + passthru.tests.pytest = callPackage ./tests.nix { }; + + # Remove .pytest_cache when using py.test in a Nix build + setupHook = writeText "pytest-hook" '' + pytestcachePhase() { + find $out -name .pytest_cache -type d -exec rm -rf {} + + } + preDistPhases+=" pytestcachePhase" + + # pytest generates it's own bytecode files to improve assertion messages. + # These files similar to cpython's bytecode files but are never laoded + # by python interpreter directly. We remove them for a few reasons: + # - files are non-deterministic: https://github.com/NixOS/nixpkgs/issues/139292 + # (file headers are generatedt by pytest directly and contain timestamps) + # - files are not needed after tests are finished + pytestRemoveBytecodePhase () { + # suffix is defined at: + # https://github.com/pytest-dev/pytest/blob/7.2.1/src/_pytest/assertion/rewrite.py#L51-L53 + find $out -name "*-pytest-*.py[co]" -delete + } + preDistPhases+=" pytestRemoveBytecodePhase" + ''; + + pythonImportsCheck = [ + "pytest" + ]; + + meta = with lib; { + description = "Framework for writing tests"; + homepage = "https://docs.pytest.org"; + changelog = "https://github.com/pytest-dev/pytest/releases/tag/${version}"; + maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ]; + license = licenses.mit; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytest/tests.nix b/pkgs/by-name/py/python/python-modules/pytest/tests.nix new file mode 100644 index 0000000..8bf8daf --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytest/tests.nix @@ -0,0 +1,36 @@ +{ buildPythonPackage +, isPyPy +, pytest +}: + +buildPythonPackage rec { + pname = "pytest-tests"; + inherit (pytest) version; + format = "other"; + + src = pytest.testout; + + dontBuild = true; + dontInstall = true; + + nativeCheckInputs = pytest.optional-dependencies.testing; + + doCheck = !isPyPy; # https://github.com/pytest-dev/pytest/issues/3460 + + # Ignored file https://github.com/pytest-dev/pytest/pull/5605#issuecomment-522243929 + # test_missing_required_plugins will emit deprecation warning which is treated as error + checkPhase = '' + runHook preCheck + ${pytest.out}/bin/pytest -x testing/ \ + --ignore=testing/test_junitxml.py \ + --ignore=testing/test_argcomplete.py \ + -k "not test_collect_pyargs_with_testpaths and not test_missing_required_plugins" + + # tests leave behind unreproducible pytest binaries in the output directory, remove: + find $out/lib -name "*-pytest-${version}.pyc" -delete + # specifically testing/test_assertion.py and testing/test_assertrewrite.py leave behind those: + find $out/lib -name "*opt-2.pyc" -delete + + runHook postCheck + ''; +} diff --git a/pkgs/by-name/py/python/python-modules/python-dateutil/default.nix b/pkgs/by-name/py/python/python-modules/python-dateutil/default.nix new file mode 100644 index 0000000..dd7cc0f --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/python-dateutil/default.nix @@ -0,0 +1,47 @@ +{ lib +, buildPythonPackage +, fetchPypi +, setuptools-scm +, six +}: + +buildPythonPackage rec { + pname = "python-dateutil"; + version = "2.9.0.post0"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-N91UII2n4c2HU4ghfV4A69QXkkn5D7ckN+kaNUWaCtM="; + }; + + postPatch = '' + substituteInPlace pyproject.toml \ + --replace-fail "setuptools_scm<8.0" "setuptools_scm" + ''; + + nativeBuildInputs = [ setuptools-scm ]; + + propagatedBuildInputs = [ six ]; + + # cyclic dependency: tests need freezegun, which depends on python-dateutil + doCheck = false; + + pythonImportsCheck = [ + "dateutil.easter" + "dateutil.parser" + "dateutil.relativedelta" + "dateutil.rrule" + "dateutil.tz" + "dateutil.utils" + "dateutil.zoneinfo" + ]; + + meta = with lib; { + changelog = "https://github.com/dateutil/dateutil/blob/${version}/NEWS"; + description = "Powerful extensions to the standard datetime module"; + homepage = "https://github.com/dateutil/dateutil/"; + license = with licenses; [ asl20 bsd3 ]; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/pytz/default.nix b/pkgs/by-name/py/python/python-modules/pytz/default.nix new file mode 100644 index 0000000..359c7c1 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/pytz/default.nix @@ -0,0 +1,35 @@ +{ lib +, buildPythonPackage +, fetchPypi +, setuptools +, unittestCheckHook +}: + +buildPythonPackage rec { + pname = "pytz"; + version = "2024.1"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-KilzXqnBi68UtEiEa95aSAMO0mdXhHLYlVzQ50Q6mBI="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + nativeCheckInputs = [ unittestCheckHook ]; + + unittestFlagsArray = [ "-s" "pytz/tests" ]; + + pythonImportsCheck = [ "pytz" ]; + + meta = with lib; { + changelog = "https://launchpad.net/pytz/+announcements"; + description = "World timezone definitions, modern and historical"; + homepage = "https://pythonhosted.org/pytz"; + license = licenses.mit; + maintainers = with maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/requests/default.nix b/pkgs/by-name/py/python/python-modules/requests/default.nix new file mode 100644 index 0000000..33749a9 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/requests/default.nix @@ -0,0 +1,94 @@ +{ lib +, stdenv +, brotlicffi +, buildPythonPackage +, certifi +, chardet +, charset-normalizer +, fetchPypi +, fetchpatch +, idna +, pysocks +, pytest-mock +, pytest-xdist +, pytestCheckHook +, pythonOlder +, urllib3 +}: + +buildPythonPackage rec { + pname = "requests"; + version = "2.31.0"; + format = "setuptools"; + + disabled = pythonOlder "3.7"; + + __darwinAllowLocalNetworking = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-lCxadY+Y15Dq7Ropy27vx/+w0c968Fw9J5Flbb1q0eE="; + }; + + dependencies = [ + brotlicffi + certifi + charset-normalizer + idna + urllib3 + ]; + + optional-dependencies = { + security = []; + socks = [ + pysocks + ]; + use_chardet_on_py3 = [ + chardet + ]; + }; + + nativeCheckInputs = [ + pytest-mock + pytest-xdist + pytestCheckHook + ] + ++ optional-dependencies.socks; + + disabledTests = [ + # Disable tests that require network access and use httpbin + "requests.api.request" + "requests.models.PreparedRequest" + "requests.sessions.Session" + "requests" + "test_redirecting_to_bad_url" + "test_requests_are_updated_each_time" + "test_should_bypass_proxies_pass_only_hostname" + "test_urllib3_pool_connection_closed" + "test_urllib3_retries" + "test_use_proxy_from_environment" + "TestRequests" + "TestTimeout" + ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ + # Fatal Python error: Aborted + "test_basic_response" + "test_text_response" + ]; + + disabledTestPaths = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ + # Fatal Python error: Aborted + "tests/test_lowlevel.py" + ]; + + pythonImportsCheck = [ + "requests" + ]; + + meta = with lib; { + description = "HTTP library for Python"; + homepage = "http://docs.python-requests.org/"; + changelog = "https://github.com/psf/requests/blob/v${version}/HISTORY.md"; + license = licenses.asl20; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/responses/default.nix b/pkgs/by-name/py/python/python-modules/responses/default.nix new file mode 100644 index 0000000..5a9960c --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/responses/default.nix @@ -0,0 +1,75 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, fetchpatch2 +, pytest-asyncio +, pytest-httpserver +, pytestCheckHook +, pythonOlder +, pyyaml +, requests +, setuptools +, tomli +, tomli-w +, types-pyyaml +, types-toml +, urllib3 +}: + +buildPythonPackage rec { + pname = "responses"; + version = "0.25.0"; + pyproject = true; + + disabled = pythonOlder "3.8"; + + __darwinAllowLocalNetworking = true; + + src = fetchFromGitHub { + owner = "getsentry"; + repo = pname; + rev = "refs/tags/${version}"; + hash = "sha256-FHtuZ6NUmCveAJOXEajfTLRMR8W1Jz/pjFKdE6PHW2g="; + }; + + patches = [ + (fetchpatch2 { + # adds missing pytest asyncio markers + url = "https://github.com/getsentry/responses/commit/d5e7402f1782692d04742562370abaca8d54a972.patch"; + hash = "sha256-A/DYSKvuangolkcQX4k/uom//AQ9in7BsTmVtlCqmXQ="; + }) + ]; + + nativeBuildInputs = [ + setuptools + ]; + + propagatedBuildInputs = [ + pyyaml + requests + types-pyyaml + types-toml + urllib3 + ]; + + nativeCheckInputs = [ + pytest-asyncio + pytest-httpserver + pytestCheckHook + tomli-w + ] ++ lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + pythonImportsCheck = [ + "responses" + ]; + + meta = with lib; { + description = "Python module for mocking out the requests Python library"; + homepage = "https://github.com/getsentry/responses"; + changelog = "https://github.com/getsentry/responses/blob/${version}/CHANGES"; + license = licenses.asl20; + maintainers = with maintainers; [ fab ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/setproctitle/default.nix b/pkgs/by-name/py/python/python-modules/setproctitle/default.nix new file mode 100644 index 0000000..dfbee6e --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setproctitle/default.nix @@ -0,0 +1,41 @@ +{ lib +, buildPythonPackage +, pythonOlder +, fetchPypi +, setuptools +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "setproctitle"; + version = "1.3.3"; + pyproject = true; + + disabled = pythonOlder "3.6"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-yRPhUefqAVZ4N/8DeiPKh0AZKIAZi3+7kLFtGBYHyq4="; + }; + + nativeBuildInputs = [ + setuptools + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + # tries to compile programs with dependencies that aren't available + disabledTestPaths = [ + "tests/setproctitle_test.py" + ]; + + meta = with lib; { + description = "Allows a process to change its title (as displayed by system tools such as ps and top)"; + homepage = "https://github.com/dvarrazzo/py-setproctitle"; + license = licenses.bsdOriginal; + maintainers = with maintainers; [ exi ]; + }; + +} diff --git a/pkgs/by-name/py/python/python-modules/setuptools-scm/default.nix b/pkgs/by-name/py/python/python-modules/setuptools-scm/default.nix new file mode 100644 index 0000000..fb4b83f --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools-scm/default.nix @@ -0,0 +1,69 @@ +{ lib +, buildPythonPackage +, callPackage +, fetchPypi +, pythonOlder + +# build-system +, setuptools + +# dependencies +, packaging +, typing-extensions +, tomli + +# optional-dependencies +# , rich +}: + +buildPythonPackage rec { + pname = "setuptools-scm"; + version = "8.0.4"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-tfQ/9oAGaVlRk/0JiRVk7p0dfcsZbKtLJQbVOi4clcc="; + }; + + nativeBuildInputs = [ + setuptools + ] ++ lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + propagatedBuildInputs = [ + packaging + setuptools + typing-extensions + ] ++ lib.optionals (pythonOlder "3.11") [ + tomli + ]; + + # passthru.optional-dependencies = { + # rich = [ + # rich + # ]; + # }; + + pythonImportsCheck = [ + "setuptools_scm" + ]; + + # check in passthru.tests.pytest to escape infinite recursion on pytest + doCheck = false; + + passthru.tests = { + pytest = callPackage ./tests.nix { }; + }; + + setupHook = ./setup-hook.sh; + + meta = with lib; { + changelog = "https://github.com/pypa/setuptools_scm/blob/${version}/CHANGELOG.md"; + homepage = "https://github.com/pypa/setuptools_scm/"; + description = "Handles managing your python package versions in scm metadata"; + license = licenses.mit; + maintainers = with maintainers; [ nickcao ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/setuptools-scm/setup-hook.sh b/pkgs/by-name/py/python/python-modules/setuptools-scm/setup-hook.sh new file mode 100644 index 0000000..f8c30f9 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools-scm/setup-hook.sh @@ -0,0 +1,32 @@ +# Let built package know its version. +# Usually, when a package uses setuptools-scm as a build-time dependency, it +# expects to get the package version from SCM data. However, while doing a nix +# build, the source tree doesn't contain SCM data, so we should almost always +# get the version from the derivation attribute. +version-pretend-hook() { + if [ -z "$dontPretendSetuptoolsSCMVersion" -a -z "$SETUPTOOLS_SCM_PRETEND_VERSION" ]; then + echo Setting SETUPTOOLS_SCM_PRETEND_VERSION to $version + export SETUPTOOLS_SCM_PRETEND_VERSION="$version" + fi +} + +# Include all tracked files. +# When a package uses setuptools-scm as a build-time dependency, it usually +# expects it to include all scm-tracked files in the built package, by default. +# This is the official setuptools-scm behavior, documented in +# https://setuptools-scm.readthedocs.io/en/latest/usage/#file-finders-hook-makes-most-of-manifestin-unnecessary +# and https://setuptools.pypa.io/en/latest/userguide/datafiles.html. +# However, while doing a nix build, the source tree doesn't contain SCM data, +# so it would include only `.py` files by default. +# We generate a MANIFEST.in automatically that includes all tracked files to +# emulate this behavior of setuptools-scm. +include-tracked-files-hook() { + if [ -z "$dontIncludeSetuptoolsSCMTrackedFiles" ]; then + echo Including all tracked files automatically + old_manifest="$(if [ -f MANIFEST.in ]; then cat MANIFEST.in; fi)" + echo 'global-include **' > MANIFEST.in + echo "$old_manifest" >> MANIFEST.in + fi +} + +preBuildHooks+=(version-pretend-hook include-tracked-files-hook) diff --git a/pkgs/by-name/py/python/python-modules/setuptools-scm/tests.nix b/pkgs/by-name/py/python/python-modules/setuptools-scm/tests.nix new file mode 100644 index 0000000..b679a0f --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools-scm/tests.nix @@ -0,0 +1,31 @@ +{ buildPythonPackage +, setuptools-scm +, pytestCheckHook +, git +, mercurial +, pip +, virtualenv +}: + +buildPythonPackage { + pname = "setuptools-scm-tests"; + inherit (setuptools-scm) version src; + format = "other"; + + dontBuild = true; + dontInstall = true; + + nativeCheckInputs = [ + pytestCheckHook + setuptools-scm + pip + virtualenv + git + mercurial + ]; + + disabledTests = [ + # network access + "test_pip_download" + ]; +} diff --git a/pkgs/by-name/py/python/python-modules/setuptools/default.nix b/pkgs/by-name/py/python/python-modules/setuptools/default.nix new file mode 100644 index 0000000..46a2597 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools/default.nix @@ -0,0 +1,45 @@ +{ stdenv +, lib +, buildPythonPackage +, fetchFromGitHub +, python +, wheel +}: + +buildPythonPackage rec { + pname = "setuptools"; + version = "69.2.0"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "pypa"; + repo = "setuptools"; + rev = "refs/tags/v${version}"; + hash = "sha256-kll4zYFQn4g/8Fq0Y5vLvDXtotxYMbiNAgGa0sClFQk="; + }; + + patches = [ + ./tag-date.patch + ./setuptools-distutils-C++.patch + ]; + + nativeBuildInputs = [ + wheel + ]; + + preBuild = lib.optionalString (!stdenv.hostPlatform.isWindows) '' + export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0 + ''; + + # Requires pytest, causing infinite recursion. + doCheck = false; + + meta = with lib; { + description = "Utilities to facilitate the installation of Python packages"; + homepage = "https://github.com/pypa/setuptools"; + changelog = "https://setuptools.pypa.io/en/stable/history.html#v${replaceStrings [ "." ] [ "-" ] version}"; + license = with licenses; [ mit ]; + platforms = python.meta.platforms; + maintainers = teams.python.members; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/setuptools/setuptools-distutils-C++.patch b/pkgs/by-name/py/python/python-modules/setuptools/setuptools-distutils-C++.patch new file mode 100644 index 0000000..399e168 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools/setuptools-distutils-C++.patch @@ -0,0 +1,171 @@ +diff --git a/setuptools/_distutils/cygwinccompiler.py b/setuptools/_distutils/cygwinccompiler.py +index 47efa377..5cdbbe10 100644 +--- a/setuptools/_distutils/cygwinccompiler.py ++++ b/setuptools/_distutils/cygwinccompiler.py +@@ -101,14 +101,19 @@ class CygwinCCompiler(UnixCCompiler): + self.cxx = os.environ.get('CXX', 'g++') + + self.linker_dll = self.cc ++ self.linker_dll_cxx = self.cxx + shared_option = "-shared" + + self.set_executables( + compiler='%s -mcygwin -O -Wall' % self.cc, + compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc, + compiler_cxx='%s -mcygwin -O -Wall' % self.cxx, ++ compiler_so_cxx='%s -mcygwin -mdll -O -Wall' % self.cxx, + linker_exe='%s -mcygwin' % self.cc, + linker_so=('{} -mcygwin {}'.format(self.linker_dll, shared_option)), ++ linker_exe_cxx='%s -mcygwin' % self.cxx, ++ linker_so_cxx=('%s -mcygwin %s' % ++ (self.linker_dll_cxx, shared_option)), + ) + + # Include the appropriate MSVC runtime library if Python was built +@@ -140,9 +145,12 @@ class CygwinCCompiler(UnixCCompiler): + raise CompileError(msg) + else: # for other files use the C-compiler + try: +- self.spawn( +- self.compiler_so + cc_args + [src, '-o', obj] + extra_postargs +- ) ++ if self.detect_language(src) == 'c++': ++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn( ++ self.compiler_so + cc_args + [src, '-o', obj] + extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -278,9 +286,12 @@ class Mingw32CCompiler(CygwinCCompiler): + self.set_executables( + compiler='%s -O -Wall' % self.cc, + compiler_so='%s -mdll -O -Wall' % self.cc, ++ compiler_so_cxx='%s -mdll -O -Wall' % self.cxx, + compiler_cxx='%s -O -Wall' % self.cxx, + linker_exe='%s' % self.cc, + linker_so='{} {}'.format(self.linker_dll, shared_option), ++ linker_exe_cxx='%s' % self.cxx, ++ linker_so_cxx='%s %s' % (self.linker_dll_cxx, shared_option) + ) + + def runtime_library_dir_option(self, dir): +diff --git a/setuptools/_distutils/sysconfig.py b/setuptools/_distutils/sysconfig.py +index a40a7231..e5aad4f4 100644 +--- a/setuptools/_distutils/sysconfig.py ++++ b/setuptools/_distutils/sysconfig.py +@@ -297,6 +297,7 @@ def customize_compiler(compiler): # noqa: C901 + cflags, + ccshared, + ldshared, ++ ldcxxshared, + shlib_suffix, + ar, + ar_flags, +@@ -306,11 +307,14 @@ def customize_compiler(compiler): # noqa: C901 + 'CFLAGS', + 'CCSHARED', + 'LDSHARED', ++ 'LDCXXSHARED', + 'SHLIB_SUFFIX', + 'AR', + 'ARFLAGS', + ) + ++ cxxflags = cflags ++ + if 'CC' in os.environ: + newcc = os.environ['CC'] + if 'LDSHARED' not in os.environ and ldshared.startswith(cc): +@@ -322,19 +326,27 @@ def customize_compiler(compiler): # noqa: C901 + cxx = os.environ['CXX'] + if 'LDSHARED' in os.environ: + ldshared = os.environ['LDSHARED'] ++ if 'LDCXXSHARED' in os.environ: ++ ldcxxshared = os.environ['LDCXXSHARED'] + if 'CPP' in os.environ: + cpp = os.environ['CPP'] + else: + cpp = cc + " -E" # not always + if 'LDFLAGS' in os.environ: + ldshared = ldshared + ' ' + os.environ['LDFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS'] + if 'CFLAGS' in os.environ: +- cflags = cflags + ' ' + os.environ['CFLAGS'] ++ cflags = os.environ['CFLAGS'] + ldshared = ldshared + ' ' + os.environ['CFLAGS'] ++ if 'CXXFLAGS' in os.environ: ++ cxxflags = os.environ['CXXFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS'] + if 'CPPFLAGS' in os.environ: + cpp = cpp + ' ' + os.environ['CPPFLAGS'] + cflags = cflags + ' ' + os.environ['CPPFLAGS'] ++ cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS'] + ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] ++ ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS'] + if 'AR' in os.environ: + ar = os.environ['AR'] + if 'ARFLAGS' in os.environ: +@@ -343,13 +355,17 @@ def customize_compiler(compiler): # noqa: C901 + archiver = ar + ' ' + ar_flags + + cc_cmd = cc + ' ' + cflags ++ cxx_cmd = cxx + ' ' + cxxflags + compiler.set_executables( + preprocessor=cpp, + compiler=cc_cmd, + compiler_so=cc_cmd + ' ' + ccshared, +- compiler_cxx=cxx, ++ compiler_cxx=cxx_cmd, ++ compiler_so_cxx=cxx_cmd + ' ' + ccshared, + linker_so=ldshared, ++ linker_so_cxx=ldcxxshared, + linker_exe=cc, ++ linker_exe_cxx=cxx, + archiver=archiver, + ) + +diff --git a/setuptools/_distutils/unixccompiler.py b/setuptools/_distutils/unixccompiler.py +index 6ca2332a..5ac64128 100644 +--- a/setuptools/_distutils/unixccompiler.py ++++ b/setuptools/_distutils/unixccompiler.py +@@ -115,9 +115,12 @@ class UnixCCompiler(CCompiler): + 'preprocessor': None, + 'compiler': ["cc"], + 'compiler_so': ["cc"], +- 'compiler_cxx': ["cc"], ++ 'compiler_cxx': ["c++"], ++ 'compiler_so_cxx': ["c++"], + 'linker_so': ["cc", "-shared"], ++ 'linker_so_cxx': ["c++", "-shared"], + 'linker_exe': ["cc"], ++ 'linker_exe_cxx': ["c++", "-shared"], + 'archiver': ["ar", "-cr"], + 'ranlib': None, + } +@@ -181,8 +184,13 @@ class UnixCCompiler(CCompiler): + + def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): + compiler_so = compiler_fixup(self.compiler_so, cc_args + extra_postargs) ++ compiler_so_cxx = compiler_fixup(self.compiler_so_cxx, cc_args + extra_postargs) + try: +- self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs) ++ if self.detect_language(src) == 'c++': ++ self.spawn(compiler_so_cxx + cc_args + [ src, '-o', obj] + ++ extra_postargs) ++ else: ++ self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs) + except DistutilsExecError as msg: + raise CompileError(msg) + +@@ -250,7 +258,8 @@ class UnixCCompiler(CCompiler): + # building an executable or linker_so (with shared options) + # when building a shared library. + building_exe = target_desc == CCompiler.EXECUTABLE +- linker = (self.linker_exe if building_exe else self.linker_so)[:] ++ linker = (self.linker_exe if building_exe else (self.linker_so_cxx if ++ target_lang == "c++" else self.linker_so))[:] + + if target_lang == "c++" and self.compiler_cxx: + env, linker_ne = _split_env(linker) diff --git a/pkgs/by-name/py/python/python-modules/setuptools/tag-date.patch b/pkgs/by-name/py/python/python-modules/setuptools/tag-date.patch new file mode 100644 index 0000000..441177a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/setuptools/tag-date.patch @@ -0,0 +1,12 @@ +diff --git a/setup.cfg b/setup.cfg +index f23714b6..8aaeb330 100644 +--- a/setup.cfg ++++ b/setup.cfg +@@ -1,6 +1,6 @@ + [egg_info] + tag_build = .post +-tag_date = 1 ++tag_date = 0 + + [aliases] + clean_egg_info = egg_info -Db '' diff --git a/pkgs/by-name/py/python/python-modules/six/default.nix b/pkgs/by-name/py/python/python-modules/six/default.nix new file mode 100644 index 0000000..afaedae --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/six/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, isPyPy +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "six"; + version = "1.16.0"; + + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"; + }; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pytestFlagsArray = if isPyPy then [ + # uses ctypes to find native library + "--deselect=test_six.py::test_move_items" + ] else null; + + pythonImportsCheck = [ "six" ]; + + meta = { + changelog = "https://github.com/benjaminp/six/blob/${version}/CHANGES"; + description = "Python 2 and 3 compatibility library"; + homepage = "https://github.com/benjaminp/six"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ dotlambda ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/snowballstemmer/default.nix b/pkgs/by-name/py/python/python-modules/snowballstemmer/default.nix new file mode 100644 index 0000000..a1723bd --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/snowballstemmer/default.nix @@ -0,0 +1,24 @@ +{ lib, buildPythonPackage, pystemmer, fetchPypi }: + +buildPythonPackage rec { + pname = "snowballstemmer"; + version = "2.2.0"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"; + }; + + # No tests included + doCheck = false; + + propagatedBuildInputs = [ pystemmer ]; + + meta = with lib; { + description = "16 stemmer algorithms (15 + Poerter English stemmer) generated from Snowball algorithms"; + homepage = "http://sigal.saimon.org/en/latest/index.html"; + license = licenses.bsd3; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinx-issues/default.nix b/pkgs/by-name/py/python/python-modules/sphinx-issues/default.nix new file mode 100644 index 0000000..9cf4b68 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinx-issues/default.nix @@ -0,0 +1,37 @@ +{ lib, buildPythonPackage, sphinx, fetchFromGitHub, pandoc }: + +buildPythonPackage rec { + pname = "sphinx-issues"; + version = "3.0.1"; + format = "setuptools"; + outputs = [ "out" "doc" ]; + + src = fetchFromGitHub { + owner = "sloria"; + repo = "sphinx-issues"; + rev = version; + sha256 = "1lns6isq9kwcw8z4jwgy927f7idx9srvri5adaa5zmypw5x47hha"; + }; + + pythonImportsCheck = [ "sphinx_issues" ]; + + propagatedBuildInputs = [ sphinx ]; + + nativeBuildInputs = [ pandoc ]; + + postBuild = '' + pandoc -f rst -t html --standalone < README.rst > README.html + ''; + + postInstall = '' + mkdir -p $doc/share/doc/$name/html + cp README.html $doc/share/doc/$name/html + ''; + + meta = with lib; { + homepage = "https://github.com/sloria/sphinx-issues"; + description = "Sphinx extension for linking to your project's issue tracker."; + license = licenses.mit; + maintainers = with maintainers; [ kaction ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinx/default.nix b/pkgs/by-name/py/python/python-modules/sphinx/default.nix new file mode 100644 index 0000000..53f58ed --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinx/default.nix @@ -0,0 +1,165 @@ +{ lib +, buildPythonPackage +, pythonAtLeast +, pythonOlder +, fetchFromGitHub +, isPyPy + +# nativeBuildInputs +, flit-core + +# propagatedBuildInputs +, babel +, alabaster +, docutils +, imagesize +, importlib-metadata +, jinja2 +, packaging +, pygments +, requests +, snowballstemmer +, sphinxcontrib-applehelp +, sphinxcontrib-devhelp +, sphinxcontrib-htmlhelp +, sphinxcontrib-jsmath +, sphinxcontrib-qthelp +, sphinxcontrib-serializinghtml +, sphinxcontrib-websupport + +# check phase +, filelock +, html5lib +, pytestCheckHook +, pytest-xdist +}: + +buildPythonPackage rec { + pname = "sphinx"; + version = "7.2.6"; + format = "pyproject"; + disabled = pythonOlder "3.9"; + + src = fetchFromGitHub { + owner = "sphinx-doc"; + repo = "sphinx"; + rev = "refs/tags/v${version}"; + postFetch = '' + # Change ä to æ in file names, since ä can be encoded multiple ways on different + # filesystems, leading to different hashes on different platforms. + cd "$out"; + mv tests/roots/test-images/{testimäge,testimæge}.png + sed -i 's/testimäge/testimæge/g' tests/{test_build*.py,roots/test-images/index.rst} + ''; + hash = "sha256-IjpRGeGpGfzrEvwIKtuu2l1S74w8W+AbqDOGnWwtRck="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + propagatedBuildInputs = [ + alabaster + babel + docutils + imagesize + jinja2 + packaging + pygments + requests + snowballstemmer + sphinxcontrib-applehelp + sphinxcontrib-devhelp + sphinxcontrib-htmlhelp + sphinxcontrib-jsmath + sphinxcontrib-qthelp + sphinxcontrib-serializinghtml + # extra[docs] + sphinxcontrib-websupport + ] ++ lib.optionals (pythonOlder "3.10") [ + importlib-metadata + ]; + + __darwinAllowLocalNetworking = true; + + nativeCheckInputs = [ + filelock + html5lib + pytestCheckHook + pytest-xdist + ]; + + preCheck = '' + export HOME=$TMPDIR + ''; + + disabledTests = [ + # requires network access + "test_latex_images" + # racy + "test_defaults" + "test_check_link_response_only" + "test_anchors_ignored_for_url" + "test_autodoc_default_options" + "test_too_many_requests_retry_after_int_delay" + # racy with pytest-xdist + "test_domain_cpp_build_semicolon" + "test_class_alias" + "test_class_alias_having_doccomment" + "test_class_alias_for_imported_object_having_doccomment" + "test_decorators" + # requires cython_0, but fails miserably on 3.11 + "test_cython" + ] ++ lib.optionals isPyPy [ + # PyPy has not __builtins__ which get asserted + # https://doc.pypy.org/en/latest/cpython_differences.html#miscellaneous + "test_autosummary_generate_content_for_module" + "test_autosummary_generate_content_for_module_skipped" + # internals are asserted which are sightly different in PyPy + "test_autodoc_inherited_members_None" + "test_automethod_for_builtin" + "test_builtin_function" + "test_isattributedescriptor" + "test_methoddescriptor" + "test_partialfunction" + ] ++ lib.optionals (pythonAtLeast "3.12") [ + # https://github.com/sphinx-doc/sphinx/issues/12202 (Fixed in 7.3) + "test_enum_class" + ]; + + meta = { + description = "Python documentation generator"; + longDescription = '' + Sphinx makes it easy to create intelligent and beautiful documentation. + + Here are some of Sphinx’s major features: + - Output formats: HTML (including Windows HTML Help), LaTeX (for printable + PDF versions), ePub, Texinfo, manual pages, plain text + - Extensive cross-references: semantic markup and automatic links for + functions, classes, citations, glossary terms and similar pieces of + information + - Hierarchical structure: easy definition of a document tree, with + automatic links to siblings, parents and children + - Automatic indices: general index as well as a language-specific module + indices + - Code handling: automatic highlighting using the Pygments highlighter + - Extensions: automatic testing of code snippets, inclusion of docstrings + from Python modules (API docs) via built-in extensions, and much more + functionality via third-party extensions. + - Themes: modify the look and feel of outputs via creating themes, and + re-use many third-party themes. + - Contributed extensions: dozens of extensions contributed by users; most + of them installable from PyPI. + + Sphinx uses the reStructuredText markup language by default, and can read + MyST markdown via third-party extensions. Both of these are powerful and + straightforward to use, and have functionality for complex documentation + and publishing workflows. They both build upon Docutils to parse and write + documents. + ''; + homepage = "https://www.sphinx-doc.org"; + changelog = "https://www.sphinx-doc.org/en/master/changes.html"; + license = lib.licenses.bsd3; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-applehelp/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-applehelp/default.nix new file mode 100644 index 0000000..139b206 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-applehelp/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-applehelp"; + version = "1.0.8"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + pname = "sphinxcontrib_applehelp"; + inherit version; + hash = "sha256-xApPlvN3bEOT2TNBIFOWL6wrhPTJmnmCukLglXanBhk="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Check is disabled due to circular dependency of sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-applehelp"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-devhelp/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-devhelp/default.nix new file mode 100644 index 0000000..4d9dede --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-devhelp/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-devhelp"; + version = "1.0.6"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + pname = "sphinxcontrib_devhelp"; + inherit version; + hash = "sha256-mJP9P5BQa8S5e9uXfOuPvYI5ifQxayjDhB7BKFRDctM="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Check is disabled due to circular dependency of sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-devhelp"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-htmlhelp/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-htmlhelp/default.nix new file mode 100644 index 0000000..127c9a0 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-htmlhelp/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-htmlhelp"; + version = "2.0.5"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + pname = "sphinxcontrib_htmlhelp"; + inherit version; + hash = "sha256-Dch2N9XeU91e7DpqAXU7HM+ZSUvXVqr+zXS0+p5ykBU="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Check is disabled due to circular dependency of sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "Sphinx extension which renders HTML help files"; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-htmlhelp"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-jsmath/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-jsmath/default.nix new file mode 100644 index 0000000..4e633fb --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-jsmath/default.nix @@ -0,0 +1,29 @@ +{ lib +, buildPythonPackage +, fetchPypi +, isPy27 +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-jsmath"; + version = "1.0.1"; + format = "setuptools"; + disabled = isPy27; + + src = fetchPypi { + inherit pname version; + sha256 = "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"; + }; + + # Check is disabled due to circular dependency of sphinx + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "sphinxcontrib-jsmath is a sphinx extension which renders display math in HTML via JavaScript."; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-jsmath"; + license = licenses.bsd0; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-log-cabinet/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-log-cabinet/default.nix new file mode 100644 index 0000000..2dfc743 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-log-cabinet/default.nix @@ -0,0 +1,29 @@ +{ lib, buildPythonPackage, fetchFromGitHub, sphinx }: + +buildPythonPackage rec { + pname = "sphinxcontrib-log-cabinet"; + version = "1.0.1"; + format = "setuptools"; + + src = fetchFromGitHub { + owner = "davidism"; + repo = "sphinxcontrib-log-cabinet"; + rev = "refs/tags/${version}"; + sha256 = "03cxspgqsap9q74sqkdx6r6b4gs4hq6dpvx4j58hm50yfhs06wn1"; + }; + + propagatedBuildInputs = [ sphinx ]; + + pythonImportsCheck = [ "sphinxcontrib.log_cabinet" ]; + + doCheck = false; # no tests + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + homepage = "https://github.com/davidism/sphinxcontrib-log-cabinet"; + description = "Sphinx extension to organize changelogs"; + license = licenses.mit; + maintainers = with maintainers; [ kaction ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-qthelp/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-qthelp/default.nix new file mode 100644 index 0000000..8293985 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-qthelp/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-qthelp"; + version = "1.0.7"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + pname = "sphinxcontrib_qthelp"; + inherit version; + hash = "sha256-BT3tw4gjqApyCagIYLFrci6eAgnjL+qYyQ5OZiRYjtY="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Check is disabled due to circular dependency of sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-qthelp"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-serializinghtml/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-serializinghtml/default.nix new file mode 100644 index 0000000..92bbbe3 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-serializinghtml/default.nix @@ -0,0 +1,37 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pythonOlder +, flit-core +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-serializinghtml"; + version = "1.1.10"; + pyproject = true; + + disabled = pythonOlder "3.9"; + + src = fetchPypi { + pname = "sphinxcontrib_serializinghtml"; + inherit version; + hash = "sha256-k/P13EWLkbGS/hDDl+Mk8mLPFj158ygsFY6ENqLEUR8="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Check is disabled due to circular dependency of sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = with lib; { + description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."; + homepage = "https://github.com/sphinx-doc/sphinxcontrib-serializinghtml"; + license = licenses.bsd2; + maintainers = [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/sphinxcontrib-websupport/default.nix b/pkgs/by-name/py/python/python-modules/sphinxcontrib-websupport/default.nix new file mode 100644 index 0000000..7371d8a --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/sphinxcontrib-websupport/default.nix @@ -0,0 +1,40 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, jinja2 +, sphinxcontrib-serializinghtml +}: + +buildPythonPackage rec { + pname = "sphinxcontrib-websupport"; + version = "1.2.7"; + format = "pyproject"; + + src = fetchPypi { + pname = "sphinxcontrib_websupport"; + inherit version; + hash = "sha256-4yKALr/V/nk2jv2GSuuHsGNWauYZEdzLJxTiikXtdWE="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + propagatedBuildInputs = [ + jinja2 + sphinxcontrib-serializinghtml + ]; + + # circular dependency on sphinx + dontCheckRuntimeDeps = true; + doCheck = false; + + pythonNamespaces = [ "sphinxcontrib" ]; + + meta = { + description = "Sphinx API for Web Apps"; + homepage = "http://sphinx-doc.org/"; + license = lib.licenses.bsd2; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/testpath/default.nix b/pkgs/by-name/py/python/python-modules/testpath/default.nix new file mode 100644 index 0000000..eb66bea --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/testpath/default.nix @@ -0,0 +1,44 @@ +{ lib +, stdenv +, buildPythonPackage +, fetchPypi +, flit-core +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "testpath"; + version = "0.6.0"; + format = "pyproject"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-LxuX5kQsAmgevgG9hPUxAop8rqGvOCUAD1I0XDAoXg8="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + # exe are only required when testpath is used on windows + # https://github.com/jupyter/testpath/blob/de8ca59539eb23b9781e55848b7d2646c8c61df9/testpath/commands.py#L128 + preBuild = lib.optionalString (!stdenv.hostPlatform.isWindows) '' + rm testpath/cli-32.exe testpath/cli-64.exe + ''; + + preCheck = lib.optionalString stdenv.isDarwin '' + # Work around https://github.com/jupyter/testpath/issues/24 + export TMPDIR="/tmp" + ''; + + meta = with lib; { + description = "Test utilities for code working with files and commands"; + license = licenses.mit; + homepage = "https://github.com/jupyter/testpath"; + }; + +} diff --git a/pkgs/by-name/py/python/python-modules/toml/default.nix b/pkgs/by-name/py/python/python-modules/toml/default.nix new file mode 100644 index 0000000..aa12d29 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/toml/default.nix @@ -0,0 +1,24 @@ +{ lib, buildPythonPackage, fetchPypi }: + +buildPythonPackage rec { + pname = "toml"; + version = "0.10.2"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"; + }; + + # This package has a test script (built for Travis) that involves a) + # looking in the home directory for a binary test runner and b) using + # git to download a test suite. + doCheck = false; + + meta = with lib; { + description = "a Python library for parsing and creating TOML"; + homepage = "https://github.com/uiri/toml"; + license = licenses.mit; + maintainers = with maintainers; [ twey ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/tomli-w/default.nix b/pkgs/by-name/py/python/python-modules/tomli-w/default.nix new file mode 100644 index 0000000..920063f --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/tomli-w/default.nix @@ -0,0 +1,30 @@ +{ lib +, buildPythonPackage +, callPackage +, fetchFromGitHub +, flit-core +}: + +buildPythonPackage rec { + pname = "tomli-w"; + version = "1.0.0"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "hukkin"; + repo = pname; + rev = version; + hash = "sha256-wZSC5uOi1JUeKXIli1I8/Vo0wGsv9Q1I84dAMQQP95w="; + }; + + nativeBuildInputs = [ flit-core ]; + + pythonImportsCheck = [ "tomli_w" ]; + + meta = with lib; { + description = "A write-only counterpart to Tomli, which is a read-only TOML parser"; + homepage = "https://github.com/hukkin/tomli-w"; + license = licenses.mit; + maintainers = with maintainers; [ lovesegfault ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/tomli/default.nix b/pkgs/by-name/py/python/python-modules/tomli/default.nix new file mode 100644 index 0000000..e1708a7 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/tomli/default.nix @@ -0,0 +1,45 @@ +{ lib +, buildPythonPackage +, callPackage +, fetchFromGitHub +, flit-core +, unittestCheckHook + +# important downstream dependencies +# for passthru.tests +# , flit +# , black +# , mypy +# , setuptools-scm +}: + +buildPythonPackage rec { + pname = "tomli"; + version = "2.0.1"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "hukkin"; + repo = pname; + rev = version; + hash = "sha256-v0ZMrHIIaGeORwD4JiBeLthmnKZODK5odZVL0SY4etA="; + }; + + nativeBuildInputs = [ flit-core ]; + + nativeCheckInputs = [ unittestCheckHook ]; + + pythonImportsCheck = [ "tomli" ]; + + # passthru.tests = { + # # test downstream dependencies + # inherit flit black mypy setuptools-scm; + # }; + + meta = with lib; { + description = "A Python library for parsing TOML, fully compatible with TOML v1.0.0"; + homepage = "https://github.com/hukkin/tomli"; + license = licenses.mit; + maintainers = with maintainers; [ veehaitch ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/tornado/4.nix b/pkgs/by-name/py/python/python-modules/tornado/4.nix new file mode 100644 index 0000000..7476a22 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/tornado/4.nix @@ -0,0 +1,41 @@ +{ lib +, unittestCheckHook +, buildPythonPackage +, fetchPypi +, fetchpatch +, isPy27 +, pythonAtLeast +}: + +buildPythonPackage rec { + pname = "tornado"; + version = "4.5.3"; + disabled = isPy27 || pythonAtLeast "3.10"; + + src = fetchPypi { + inherit pname version; + sha256 = "02jzd23l4r6fswmwxaica9ldlyc2p6q8dk6dyff7j58fmdzf853d"; + }; + + patches = [ + (fetchpatch { + name = "CVE-2023-28370.patch"; + url = "https://github.com/tornadoweb/tornado/commit/32ad07c54e607839273b4e1819c347f5c8976b2f.patch"; + hash = "sha256-2dpPHkNThOaZD8T2g1vb/I5WYZ/vy/t690539uprJyc="; + }) + ]; + + nativeCheckInputs = [ unittestCheckHook ]; + + # We specify the name of the test files to prevent + # https://github.com/NixOS/nixpkgs/issues/14634 + unittestFlagsArray = [ "*_test.py" ]; + + __darwinAllowLocalNetworking = true; + + meta = { + description = "A web framework and asynchronous networking library"; + homepage = "https://www.tornadoweb.org/"; + license = lib.licenses.asl20; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/tornado/5.nix b/pkgs/by-name/py/python/python-modules/tornado/5.nix new file mode 100644 index 0000000..8ba3a8c --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/tornado/5.nix @@ -0,0 +1,41 @@ +{ lib +, unittestCheckHook +, buildPythonPackage +, fetchPypi +, fetchpatch +, isPy27 +, pythonAtLeast +}: + +buildPythonPackage rec { + pname = "tornado"; + version = "5.1.1"; + disabled = isPy27 || pythonAtLeast "3.10"; + + src = fetchPypi { + inherit pname version; + sha256 = "4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409"; + }; + + patches = [ + (fetchpatch { + name = "CVE-2023-28370.patch"; + url = "https://github.com/tornadoweb/tornado/commit/32ad07c54e607839273b4e1819c347f5c8976b2f.patch"; + hash = "sha256-2dpPHkNThOaZD8T2g1vb/I5WYZ/vy/t690539uprJyc="; + }) + ]; + + nativeCheckInputs = [ unittestCheckHook ]; + + # We specify the name of the test files to prevent + # https://github.com/NixOS/nixpkgs/issues/14634 + unittestFlagsArray = [ "*_test.py" ]; + + __darwinAllowLocalNetworking = true; + + meta = { + description = "A web framework and asynchronous networking library"; + homepage = "https://www.tornadoweb.org/"; + license = lib.licenses.asl20; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/tornado/default.nix b/pkgs/by-name/py/python/python-modules/tornado/default.nix new file mode 100644 index 0000000..75187d1 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/tornado/default.nix @@ -0,0 +1,74 @@ +{ lib +, python +, buildPythonPackage +, fetchFromGitHub +, pytestCheckHook + +# for passthru.tests +, distributed +, jupyter-server +, jupyterlab +, matplotlib +, mitmproxy +, pytest-tornado +, pytest-tornasync +, pyzmq +, sockjs-tornado +, urllib3 +}: + +buildPythonPackage rec { + pname = "tornado"; + version = "6.3.3"; + format = "setuptools"; + + src = fetchFromGitHub { + owner = "tornadoweb"; + repo = "tornado"; + rev = "v${version}"; + hash = "sha256-l9Ce/c2wDSmsySr9yXu5Fl/+63QkQay46aDSUTJmetA="; + }; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + disabledTestPaths = [ + # additional tests that have extra dependencies, run slowly, or produce more output than a simple pass/fail + # https://github.com/tornadoweb/tornado/blob/v6.2.0/maint/test/README + "maint/test" + + # AttributeError: 'TestIOStreamWebMixin' object has no attribute 'io_loop' + "tornado/test/iostream_test.py" + ]; + + disabledTests = [ + # Exception: did not get expected log message + "test_unix_socket_bad_request" + ]; + + pythonImportsCheck = [ "tornado" ]; + + __darwinAllowLocalNetworking = true; + + passthru.tests = { + inherit + distributed + jupyter-server + jupyterlab + matplotlib + mitmproxy + pytest-tornado + pytest-tornasync + pyzmq + sockjs-tornado + urllib3; + }; + + meta = with lib; { + description = "A web framework and asynchronous networking library"; + homepage = "https://www.tornadoweb.org/"; + license = licenses.asl20; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/trove-classifiers/default.nix b/pkgs/by-name/py/python/python-modules/trove-classifiers/default.nix new file mode 100644 index 0000000..6482917 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/trove-classifiers/default.nix @@ -0,0 +1,52 @@ +{ lib +, buildPythonPackage +, fetchPypi +, calver +, pytestCheckHook +, pythonOlder +, setuptools +}: + +let + self = buildPythonPackage rec { + pname = "trove-classifiers"; + version = "2024.3.3"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-337f+cZ/+GtzNiiZgzCxgOgdElseCWU22DrA/XlnP9w="; + }; + + postPatch = '' + substituteInPlace setup.py \ + --replace '"calver"' "" + ''; + + nativeBuildInputs = [ + calver + setuptools + ]; + + doCheck = false; # avoid infinite recursion with hatchling + + nativeCheckInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ "trove_classifiers" ]; + + passthru.tests.trove-classifiers = self.overridePythonAttrs { doCheck = true; }; + + meta = { + description = "Canonical source for classifiers on PyPI"; + homepage = "https://github.com/pypa/trove-classifiers"; + changelog = "https://github.com/pypa/trove-classifiers/releases/tag/${version}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ dotlambda ]; + }; + }; +in + self diff --git a/pkgs/by-name/py/python/python-modules/trustme/default.nix b/pkgs/by-name/py/python/python-modules/trustme/default.nix new file mode 100644 index 0000000..4648dd7 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/trustme/default.nix @@ -0,0 +1,49 @@ +{ lib +, buildPythonPackage +, cryptography +, fetchPypi +, idna +, pyopenssl +, pytestCheckHook +, pythonOlder +, service-identity +}: + +buildPythonPackage rec { + pname = "trustme"; + version = "1.1.0"; + format = "setuptools"; + + disabled = pythonOlder "3.8"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-U3Wtf7QnB0vslWWS4NTuKkz02miTThukvPQhcSa8ReY="; + }; + + propagatedBuildInputs = [ + cryptography + idna + ]; + + nativeCheckInputs = [ + pyopenssl + pytestCheckHook + service-identity + ]; + + # Some of the tests use localhost networking. + __darwinAllowLocalNetworking = true; + + pythonImportsCheck = [ + "trustme" + ]; + + meta = with lib; { + description = "High quality TLS certs while you wait, for the discerning tester"; + homepage = "https://github.com/python-trio/trustme"; + changelog = "https://trustme.readthedocs.io/en/latest/#change-history"; + license = with licenses; [ mit asl20 ]; + maintainers = with maintainers; [ catern ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/typing-extensions/default.nix b/pkgs/by-name/py/python/python-modules/typing-extensions/default.nix new file mode 100644 index 0000000..eb1c9c5 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/typing-extensions/default.nix @@ -0,0 +1,40 @@ +{ lib +, buildPythonPackage +, fetchPypi +, flit-core +, pythonOlder +}: + +buildPythonPackage rec { + pname = "typing-extensions"; + version = "4.10.0"; + pyproject = true; + + disabled = pythonOlder "3.8"; + + src = fetchPypi { + pname = "typing_extensions"; + inherit version; + hash = "sha256-sKvXyJ6PuW+Y2xjYYQb/HZCraSAE63Rs9u2iaC+Rs8s="; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # Tests are not part of PyPI releases. GitHub source can't be used + # as it ends with an infinite recursion + doCheck = false; + + pythonImportsCheck = [ + "typing_extensions" + ]; + + meta = with lib; { + description = "Backported and Experimental Type Hints for Python"; + changelog = "https://github.com/python/typing_extensions/blob/${version}/CHANGELOG.md"; + homepage = "https://github.com/python/typing"; + license = licenses.psfl; + maintainers = with maintainers; [ pmiddend ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/urllib3/default.nix b/pkgs/by-name/py/python/python-modules/urllib3/default.nix new file mode 100644 index 0000000..70d8750 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/urllib3/default.nix @@ -0,0 +1,88 @@ +{ lib +, buildPythonPackage +, fetchPypi +, isPyPy + +# build-system +, hatchling + +# optional-dependencies +, brotli +, brotlicffi +, pysocks + +# tests +, backports-zoneinfo +, pytestCheckHook +, pytest-timeout +, pythonOlder +, tornado +, trustme +}: + +let self = buildPythonPackage rec { + pname = "urllib3"; + version = "2.2.1"; + pyproject = true; + + src = fetchPypi { + inherit pname version; + hash = "sha256-0FcIdsYaueUg13bDisu7WwWndtP5/5ilyP1RYqREzxk="; + }; + + nativeBuildInputs = [ + hatchling + ]; + + passthru.optional-dependencies = { + brotli = if isPyPy then [ + brotlicffi + ] else [ + brotli + ]; + socks = [ + pysocks + ]; + }; + + nativeCheckInputs = [ + pytest-timeout + pytestCheckHook + tornado + trustme + ] ++ lib.optionals (pythonOlder "3.9") [ + backports-zoneinfo + ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies); + + # Tests in urllib3 are mostly timeout-based instead of event-based and + # are therefore inherently flaky. On your own machine, the tests will + # typically build fine, but on a loaded cluster such as Hydra random + # timeouts will occur. + # + # The urllib3 test suite has two different timeouts in their test suite + # (see `test/__init__.py`): + # - SHORT_TIMEOUT + # - LONG_TIMEOUT + # When CI is in the env, LONG_TIMEOUT will be significantly increased. + # Still, failures can occur and for that reason tests are disabled. + doCheck = false; + + passthru.tests.pytest = self.overridePythonAttrs (_: { doCheck = true; }); + + preCheck = '' + export CI # Increases LONG_TIMEOUT + ''; + + pythonImportsCheck = [ + "urllib3" + ]; + + meta = with lib; { + description = "Powerful, user-friendly HTTP client for Python"; + homepage = "https://github.com/urllib3/urllib3"; + changelog = "https://github.com/urllib3/urllib3/blob/${version}/CHANGES.rst"; + license = licenses.mit; + maintainers = with maintainers; [ fab ]; + }; +}; +in self diff --git a/pkgs/by-name/py/python/python-modules/virtualenv/default.nix b/pkgs/by-name/py/python/python-modules/virtualenv/default.nix new file mode 100644 index 0000000..44ca0ff --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/virtualenv/default.nix @@ -0,0 +1,97 @@ +{ lib +, buildPythonPackage +, pythonOlder +, isPy27 +, isPyPy +, cython +, distlib +, fetchPypi +, filelock +, flaky +, hatch-vcs +, hatchling +, importlib-metadata +, platformdirs +, pytest-freezegun +, pytest-mock +, pytest-timeout +, pytestCheckHook +, time-machine +}: + +buildPythonPackage rec { + pname = "virtualenv"; + version = "20.25.1"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-4I4T7NynoL1TeY81bVgxQ0r6Wwe5Pwq98Hl7egb/4Zc="; + }; + + nativeBuildInputs = [ + hatch-vcs + hatchling + ]; + + propagatedBuildInputs = [ + distlib + filelock + platformdirs + ] ++ lib.optionals (pythonOlder "3.8") [ + importlib-metadata + ]; + + nativeCheckInputs = [ + cython + flaky + pytest-freezegun + pytest-mock + pytest-timeout + pytestCheckHook + ] ++ lib.optionals (!isPyPy) [ + time-machine + ]; + + preCheck = '' + export HOME=$(mktemp -d) + ''; + + disabledTestPaths = [ + # Ignore tests which require network access + "tests/unit/create/test_creator.py" + "tests/unit/seed/embed/test_bootstrap_link_via_app_data.py" + ]; + + disabledTests = [ + # Network access + "test_create_no_seed" + "test_seed_link_via_app_data" + # Permission Error + "test_bad_exe_py_info_no_raise" + ] ++ lib.optionals (pythonOlder "3.11") [ + "test_help" + ] ++ lib.optionals (isPyPy) [ + # encoding problems + "test_bash" + # permission error + "test_can_build_c_extensions" + # fails to detect pypy version + "test_discover_ok" + ]; + + pythonImportsCheck = [ + "virtualenv" + ]; + + meta = with lib; { + description = "A tool to create isolated Python environments"; + mainProgram = "virtualenv"; + homepage = "http://www.virtualenv.org"; + changelog = "https://github.com/pypa/virtualenv/blob/${version}/docs/changelog.rst"; + license = licenses.mit; + maintainers = with maintainers; [ goibhniu ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/wcag-contrast-ratio/default.nix b/pkgs/by-name/py/python/python-modules/wcag-contrast-ratio/default.nix new file mode 100644 index 0000000..6a047c2 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/wcag-contrast-ratio/default.nix @@ -0,0 +1,35 @@ +{ lib +, buildPythonPackage +, fetchPypi +, hypothesis +, pytestCheckHook +}: + +buildPythonPackage rec { + pname = "wcag-contrast-ratio"; + version = "0.9"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-aRkrjlwKfQ3F/xGH7rPjmBQWM6S95RxpyH9Y/oftNhw="; + }; + + nativeCheckInputs = [ + hypothesis + pytestCheckHook + ]; + + pytestFlagsArray = [ + "test.py" + ]; + + pythonImportsCheck = [ "wcag_contrast_ratio" ]; + + meta = with lib; { + description = "Library for computing contrast ratios, as required by WCAG 2.0"; + homepage = "https://github.com/gsnedders/wcag-contrast-ratio"; + license = licenses.mit; + maintainers = with maintainers; [ ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/webencodings/default.nix b/pkgs/by-name/py/python/python-modules/webencodings/default.nix new file mode 100644 index 0000000..8a80588 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/webencodings/default.nix @@ -0,0 +1,28 @@ +{ buildPythonPackage +, lib +, fetchPypi +, pytest +}: + +buildPythonPackage rec { + pname = "webencodings"; + version = "0.5.1"; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + sha256 = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"; + }; + + nativeCheckInputs = [ pytest ]; + + checkPhase = '' + py.test webencodings/tests.py + ''; + + meta = { + description = "Character encoding aliases for legacy web content"; + homepage = "https://github.com/SimonSapin/python-webencodings"; + license = lib.licenses.bsd3; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch b/pkgs/by-name/py/python/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch new file mode 100644 index 0000000..8e70f00 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch @@ -0,0 +1,34 @@ +From 5879a4bbc34d1eb25e160b15b2f5a4f10eac6bd2 Mon Sep 17 00:00:00 2001 +From: toonn +Date: Mon, 13 Sep 2021 18:07:26 +0200 +Subject: [PATCH] =?UTF-8?q?tests:=20Rename=20a=CC=8Aa=CC=88o=CC=88=5F?= + =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E.py=20=3D>=20=C3=A6=C9=90=C3=B8=5F?= + =?UTF-8?q?=E6=97=A5=E6=9C=AC=E5=83=B9.py?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +`åäö_日本語.py` normalizes differently in NFC and NFD normal forms. This +means a hash generated for the source directory can differ depending on +whether or not the filesystem is normalizing and which normal form it +uses. + +By renaming the file to `æɐø_日本價.py` we avoid this issue by using a +name that has the same encoding in each normal form. +--- + tests/test_bdist_wheel.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/test_bdist_wheel.py b/tests/test_bdist_wheel.py +index 5a6db16..42cf121 100644 +--- a/tests/test_bdist_wheel.py ++++ b/tests/test_bdist_wheel.py +@@ -69,7 +69,7 @@ def test_unicode_record(wheel_paths): + with ZipFile(path) as zf: + record = zf.read("unicode.dist-0.1.dist-info/RECORD") + +- assert "åäö_日本語.py".encode() in record ++ assert "æɐø_日本價.py".encode() in record + + + UTF8_PKG_INFO = """\ diff --git a/pkgs/by-name/py/python/python-modules/wheel/default.nix b/pkgs/by-name/py/python/python-modules/wheel/default.nix new file mode 100644 index 0000000..14339d2 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/wheel/default.nix @@ -0,0 +1,53 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, flit-core +}: + +buildPythonPackage rec { + pname = "wheel"; + version = "0.42.0"; + format = "pyproject"; + + src = fetchFromGitHub { + owner = "pypa"; + repo = pname; + rev = "refs/tags/${version}"; + hash = "sha256-WML3/gAK1R9DEeRVZWeO0VRFuNVKP52i5I5mYV6vQcI="; + postFetch = '' + cd $out + mv tests/testdata/unicode.dist/unicodedist/åäö_日本語.py \ + tests/testdata/unicode.dist/unicodedist/æɐø_日本價.py + patch -p1 < ${./0001-tests-Rename-a-a-o-_-.py-_-.py.patch} + ''; + }; + + nativeBuildInputs = [ + flit-core + ]; + + # No tests in archive + doCheck = false; + + pythonImportsCheck = [ "wheel" ]; + + meta = with lib; { + homepage = "https://github.com/pypa/wheel"; + description = "A built-package format for Python"; + mainProgram = "wheel"; + longDescription = '' + This library is the reference implementation of the Python wheel packaging standard, + as defined in PEP 427. + + It has two different roles: + + - A setuptools extension for building wheels that provides the bdist_wheel setuptools command + - A command line tool for working with wheel files + + It should be noted that wheel is not intended to be used as a library, + and as such there is no stable, public API. + ''; + license = with licenses; [ mit ]; + maintainers = with maintainers; [ siriobalmelli ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/xmlschema/default.nix b/pkgs/by-name/py/python/python-modules/xmlschema/default.nix new file mode 100644 index 0000000..61bdd69 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/xmlschema/default.nix @@ -0,0 +1,46 @@ +{ + lib, + buildPythonPackage, + elementpath, + fetchFromGitHub, + jinja2, + lxml, + pytestCheckHook, + pythonOlder, + setuptools, +}: + +buildPythonPackage rec { + pname = "xmlschema"; + version = "3.3.1"; + pyproject = true; + + disabled = pythonOlder "3.7"; + + src = fetchFromGitHub { + owner = "sissaschool"; + repo = "xmlschema"; + rev = "refs/tags/v${version}"; + hash = "sha256-Sy70OQvKx0H8vxRFTEkg+QV9eVij5C9dlAwJ2HTFOi8="; + }; + + build-system = [ setuptools ]; + + dependencies = [ elementpath ]; + + nativeCheckInputs = [ + jinja2 + lxml + pytestCheckHook + ]; + + pythonImportsCheck = [ "xmlschema" ]; + + meta = with lib; { + description = "XML Schema validator and data conversion library for Python"; + homepage = "https://github.com/sissaschool/xmlschema"; + changelog = "https://github.com/sissaschool/xmlschema/blob/${src.rev}/CHANGELOG.rst"; + license = licenses.mit; + maintainers = with maintainers; [ jonringer ]; + }; +} diff --git a/pkgs/by-name/py/python/python-modules/zipp/default.nix b/pkgs/by-name/py/python/python-modules/zipp/default.nix new file mode 100644 index 0000000..6555d17 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/zipp/default.nix @@ -0,0 +1,48 @@ +{ lib +, buildPythonPackage +, fetchPypi +, func-timeout +, jaraco-itertools +, pythonOlder +, setuptools-scm +}: + +let zipp = buildPythonPackage rec { + pname = "zipp"; + version = "3.17.0"; + format = "pyproject"; + + disabled = pythonOlder "3.7"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-hOZKHCjPfpHtIHi7jMjCWcsZt2lCCWyNe4SUdpDKuvA="; + }; + + nativeBuildInputs = [ + setuptools-scm + ]; + + # Prevent infinite recursion with pytest + doCheck = false; + + nativeCheckInputs = [ + func-timeout + jaraco-itertools + ]; + + pythonImportsCheck = [ + "zipp" + ]; + + passthru.tests = { + check = zipp.overridePythonAttrs (_: { doCheck = true; }); + }; + + meta = with lib; { + description = "Pathlib-compatible object wrapper for zip files"; + homepage = "https://github.com/jaraco/zipp"; + license = licenses.mit; + maintainers = with maintainers; [ ]; + }; +}; in zipp diff --git a/pkgs/by-name/py/python/python-modules/zope-event/default.nix b/pkgs/by-name/py/python/python-modules/zope-event/default.nix new file mode 100644 index 0000000..93cfc74 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/zope-event/default.nix @@ -0,0 +1,22 @@ +{ lib +, buildPythonPackage +, fetchPypi +}: + +buildPythonPackage rec { + pname = "zope.event"; + version = "4.6"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-gdmIEwRvyGzEE242mP7mKKMoL5wyDbGGWMIXSSNfzoA="; + }; + + meta = with lib; { + description = "An event publishing system"; + homepage = "https://pypi.org/project/zope.event/"; + license = licenses.zpl20; + maintainers = with maintainers; [ goibhniu ]; + }; + +} diff --git a/pkgs/by-name/py/python/python-modules/zope-interface/default.nix b/pkgs/by-name/py/python/python-modules/zope-interface/default.nix new file mode 100644 index 0000000..f834301 --- /dev/null +++ b/pkgs/by-name/py/python/python-modules/zope-interface/default.nix @@ -0,0 +1,26 @@ +{ lib +, buildPythonPackage +, fetchPypi +, zope-event +}: + +buildPythonPackage rec { + pname = "zope.interface"; + version = "5.5.2"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-v+4fP/YhQ4GUmeNI9bin86oCWfmspeDdrnOR0Fnc5nE="; + }; + + propagatedBuildInputs = [ zope-event ]; + + doCheck = false; # Circular deps. + + meta = with lib; { + description = "Zope.Interface"; + homepage = "https://zope.org/Products/ZopeInterface"; + license = licenses.zpl20; + maintainers = [ maintainers.goibhniu ]; + }; +} diff --git a/pkgs/by-name/py/python/python-packages-base.nix b/pkgs/by-name/py/python/python-packages-base.nix new file mode 100644 index 0000000..e2bd6cd --- /dev/null +++ b/pkgs/by-name/py/python/python-packages-base.nix @@ -0,0 +1,101 @@ +{ pkgs +, stdenv +, lib +, python +}: + +self: + +let + inherit (self) callPackage; + + namePrefix = python.libPrefix + "-"; + + # Derivations built with `buildPythonPackage` can already be overridden with `override`, `overrideAttrs`, and `overrideDerivation`. + # This function introduces `overridePythonAttrs` and it overrides the call to `buildPythonPackage`. + makeOverridablePythonPackage = f: lib.mirrorFunctionArgs f (origArgs: + let + args = lib.fix (lib.extends + (_: previousAttrs: { + passthru = (previousAttrs.passthru or { }) // { + overridePythonAttrs = newArgs: makeOverridablePythonPackage f (overrideWith newArgs); + }; + }) + (_: origArgs)); + result = f args; + overrideWith = newArgs: args // (if pkgs.lib.isFunction newArgs then newArgs args else newArgs); + in + if builtins.isAttrs result then result + else if builtins.isFunction result then { + overridePythonAttrs = newArgs: makeOverridablePythonPackage f (overrideWith newArgs); + __functor = self: result; + } + else result); + + mkPythonDerivation = if python.isPy3k then + ./mk-python-derivation.nix + else + ./python2/mk-python-derivation.nix; + + buildPythonPackage = makeOverridablePythonPackage (lib.makeOverridable (callPackage mkPythonDerivation { + inherit namePrefix; # We want Python libraries to be named like e.g. "python3.6-${name}" + inherit toPythonModule; # Libraries provide modules + })); + + buildPythonApplication = makeOverridablePythonPackage (lib.makeOverridable (callPackage mkPythonDerivation { + namePrefix = ""; # Python applications should not have any prefix + toPythonModule = x: x; # Application does not provide modules. + })); + + # Check whether a derivation provides a Python module. + hasPythonModule = drv: drv?pythonModule && drv.pythonModule == python; + + # Get list of required Python modules given a list of derivations. + requiredPythonModules = drvs: let + modules = lib.filter hasPythonModule drvs; + in lib.unique ([python] ++ modules ++ lib.concatLists (lib.catAttrs "requiredPythonModules" modules)); + + # Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations + # providing Python modules. + makePythonPath = drvs: lib.makeSearchPath python.sitePackages (requiredPythonModules drvs); + + removePythonPrefix = lib.removePrefix namePrefix; + + # Convert derivation to a Python module. + toPythonModule = drv: + drv.overrideAttrs( oldAttrs: { + # Use passthru in order to prevent rebuilds when possible. + passthru = (oldAttrs.passthru or {})// { + pythonModule = python; + pythonPath = [ ]; # Deprecated, for compatibility. + requiredPythonModules = requiredPythonModules drv.propagatedBuildInputs; + }; + }); + + # Convert a Python library to an application. + toPythonApplication = drv: + drv.overrideAttrs( oldAttrs: { + passthru = (oldAttrs.passthru or {}) // { + # Remove Python prefix from name so we have a "normal" name. + # While the prefix shows up in the store path, it won't be + # used by `nix-env`. + name = removePythonPrefix oldAttrs.name; + pythonModule = false; + }; + }); + + disabled = drv: throw "${removePythonPrefix (drv.pname or drv.name)} not supported for interpreter ${python.executable}"; + + disabledIf = x: drv: if x then disabled drv else drv; + +in { + inherit lib pkgs stdenv; + inherit (python.passthru) isPy27 isPy37 isPy38 isPy39 isPy310 isPy311 isPy3k isPyPy pythonAtLeast pythonOlder; + inherit buildPythonPackage buildPythonApplication; + inherit hasPythonModule requiredPythonModules makePythonPath disabled disabledIf; + inherit toPythonModule toPythonApplication; + + python = toPythonModule python; + # Dont take pythonPackages from "global" pkgs scope to avoid mixing python versions + pythonPackages = self; +} diff --git a/pkgs/by-name/py/python/python-packages.nix b/pkgs/by-name/py/python/python-packages.nix new file mode 100644 index 0000000..286304e --- /dev/null +++ b/pkgs/by-name/py/python/python-packages.nix @@ -0,0 +1,17365 @@ +# This file contains the Python packages set. +# Each attribute is a Python library or a helper function. +# Expressions for Python libraries are supposed to be in `pkgs/development/python-modules//default.nix`. +# Python packages that do not need to be available for each interpreter version do not belong in this packages set. +# Examples are Python-based cli tools. +# +# For more details, please see the Python section in the Nixpkgs manual. + +self: super: with self; { + + bootstrap = lib.recurseIntoAttrs { + flit-core = toPythonModule (callPackage ./python-modules/bootstrap/flit-core { }); + installer = toPythonModule (callPackage ./python-modules/bootstrap/installer { + inherit (bootstrap) flit-core; + }); + build = toPythonModule (callPackage ./python-modules/bootstrap/build { + inherit (bootstrap) flit-core installer; + }); + packaging = toPythonModule (callPackage ./python-modules/bootstrap/packaging { + inherit (bootstrap) flit-core installer; + }); + }; + + setuptools = callPackage ./python-modules/setuptools { }; + +# a2wsgi = callPackage ./python-modules/a2wsgi { }; + +# aadict = callPackage ./python-modules/aadict { }; + +# aafigure = callPackage ./python-modules/aafigure { }; + +# aardwolf = callPackage ./python-modules/aardwolf { }; + +# abjad = callPackage ./python-modules/abjad { }; + +# about-time = callPackage ./python-modules/about-time { }; + +# absl-py = callPackage ./python-modules/absl-py { }; + +# accessible-pygments = callPackage ./python-modules/accessible-pygments { }; + +# accelerate = callPackage ./python-modules/accelerate { }; + +# accuweather = callPackage ./python-modules/accuweather { }; + +# accupy = callPackage ./python-modules/accupy { }; + +# acme = callPackage ./python-modules/acme { }; + +# acme-tiny = callPackage ./python-modules/acme-tiny { }; + +# acoustics = callPackage ./python-modules/acoustics { }; + +# acquire = callPackage ./python-modules/acquire { }; + +# actdiag = callPackage ./python-modules/actdiag { }; + +# acunetix = callPackage ./python-modules/acunetix { }; + +# adafruit-io = callPackage ./python-modules/adafruit-io { }; + +# adafruit-platformdetect = callPackage ./python-modules/adafruit-platformdetect { }; + +# adafruit-pureio = callPackage ./python-modules/adafruit-pureio { }; + +# adal = callPackage ./python-modules/adal { }; + +# adax = callPackage ./python-modules/adax { }; + +# adax-local = callPackage ./python-modules/adax-local { }; + +# adb-enhanced = callPackage ./python-modules/adb-enhanced { }; + +# adb-homeassistant = callPackage ./python-modules/adb-homeassistant { }; + +# adb-shell = callPackage ./python-modules/adb-shell { }; + +# adblock = callPackage ./python-modules/adblock { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreFoundation Security; +# }; + +# add-trailing-comma = callPackage ./python-modules/add-trailing-comma { }; + +# addict = callPackage ./python-modules/addict { }; + +# adext = callPackage ./python-modules/adext { }; + +# adguardhome = callPackage ./python-modules/adguardhome { }; + +# adjusttext = callPackage ./python-modules/adjusttext { }; + +# adlfs = callPackage ./python-modules/adlfs { }; + +# advantage-air = callPackage ./python-modules/advantage-air { }; + +# advocate = callPackage ./python-modules/advocate { }; + +# aemet-opendata = callPackage ./python-modules/aemet-opendata { }; + +# aenum = callPackage ./python-modules/aenum { }; + +# aeppl = callPackage ./python-modules/aeppl { }; + +# aesara = callPackage ./python-modules/aesara { }; + +# aesedb = callPackage ./python-modules/aesedb { }; + +# aetcd = callPackage ./python-modules/aetcd { }; + +# afdko = callPackage ./python-modules/afdko { }; + +# affine = callPackage ./python-modules/affine { }; + +# afsapi = callPackage ./python-modules/afsapi { }; + +# agate = callPackage ./python-modules/agate { }; + +# agate-dbf = callPackage ./python-modules/agate-dbf { }; + +# agate-excel = callPackage ./python-modules/agate-excel { }; + +# agate-sql = callPackage ./python-modules/agate-sql { }; + +# agent-py = callPackage ./python-modules/agent-py { }; + +# ago = callPackage ./python-modules/ago { }; + +# aggdraw = callPackage ./python-modules/aggdraw { }; + +# aigpy = callPackage ./python-modules/aigpy { }; + +# aio-geojson-client = callPackage ./python-modules/aio-geojson-client { }; + +# aio-geojson-generic-client = callPackage ./python-modules/aio-geojson-generic-client { }; + +# aio-geojson-geonetnz-quakes = callPackage ./python-modules/aio-geojson-geonetnz-quakes { }; + +# aio-geojson-geonetnz-volcano = callPackage ./python-modules/aio-geojson-geonetnz-volcano { }; + +# aio-geojson-nsw-rfs-incidents = callPackage ./python-modules/aio-geojson-nsw-rfs-incidents { }; + +# aio-geojson-usgs-earthquakes = callPackage ./python-modules/aio-geojson-usgs-earthquakes { }; + +# aio-georss-client = callPackage ./python-modules/aio-georss-client { }; + +# aio-georss-gdacs = callPackage ./python-modules/aio-georss-gdacs { }; + +# aio-pika = callPackage ./python-modules/aio-pika { }; + +# aioairzone = callPackage ./python-modules/aioairzone { }; + +# aioairzone-cloud = callPackage ./python-modules/aioairzone-cloud { }; + +# aioairq = callPackage ./python-modules/aioairq { }; + +# aioaladdinconnect = callPackage ./python-modules/aioaladdinconnect { }; + +# aioambient = callPackage ./python-modules/aioambient { }; + +# aioapcaccess = callPackage ./python-modules/aioapcaccess { }; + +# aioapns = callPackage ./python-modules/aioapns { }; + +# aiocron = callPackage ./python-modules/aiocron { }; + +# ailment = callPackage ./python-modules/ailment { }; + +# aioamqp = callPackage ./python-modules/aioamqp { }; + +# aioaseko = callPackage ./python-modules/aioaseko { }; + +# aioasuswrt = callPackage ./python-modules/aioasuswrt { }; + +# aioautomower = callPackage ./python-modules/aioautomower { }; + +# aioazuredevops = callPackage ./python-modules/aioazuredevops { }; + +# aiobafi6 = callPackage ./python-modules/aiobafi6 { }; + +# aioboto3 = callPackage ./python-modules/aioboto3 { }; + +# aioblescan = callPackage ./python-modules/aioblescan { }; + +# aiocache = callPackage ./python-modules/aiocache { }; + +# aiocoap = callPackage ./python-modules/aiocoap { }; + +# aiocomelit = callPackage ./python-modules/aiocomelit { }; + +# aioconsole = callPackage ./python-modules/aioconsole { }; + +# aiocontextvars = callPackage ./python-modules/aiocontextvars { }; + +# aiocsv = callPackage ./python-modules/aiocsv { }; + +# aiocurrencylayer = callPackage ./python-modules/aiocurrencylayer { }; + +# aiodhcpwatcher = callPackage ./python-modules/aiodhcpwatcher { }; + +# aiodiscover = callPackage ./python-modules/aiodiscover { }; + +# aiodns = callPackage ./python-modules/aiodns { }; + +# aiodocker = callPackage ./python-modules/aiodocker { }; + +# aioeafm = callPackage ./python-modules/aioeafm { }; + +# aioeagle = callPackage ./python-modules/aioeagle { }; + +# aioecowitt = callPackage ./python-modules/aioecowitt { }; + +# aioelectricitymaps = callPackage ./python-modules/aioelectricitymaps { }; + +# aioemonitor = callPackage ./python-modules/aioemonitor { }; + +# aioesphomeapi = callPackage ./python-modules/aioesphomeapi { }; + +# aioextensions = callPackage ./python-modules/aioextensions { }; + +# aiofile = callPackage ./python-modules/aiofile { }; + +# aiofiles = callPackage ./python-modules/aiofiles { }; + +# aioflo = callPackage ./python-modules/aioflo { }; + +# aioftp = callPackage ./python-modules/aioftp { }; + +# aioguardian = callPackage ./python-modules/aioguardian { }; + +# aiogithubapi = callPackage ./python-modules/aiogithubapi { }; + +# aiogram = callPackage ./python-modules/aiogram { }; + +# aiohappyeyeballs = callPackage ./python-modules/aiohappyeyeballs { }; + +# aioharmony = callPackage ./python-modules/aioharmony { }; + +# aiohomekit = callPackage ./python-modules/aiohomekit { }; + + aiohttp = callPackage ./python-modules/aiohttp { }; + +# aiohttp-apispec = callPackage ./python-modules/aiohttp-apispec { }; + +# aiohttp-basicauth = callPackage ./python-modules/aiohttp-basicauth { }; + +# aiohttp-client-cache = callPackage ./python-modules/aiohttp-client-cache { }; + +# aiohttp-cors = callPackage ./python-modules/aiohttp-cors { }; + +# aiohttp-fast-url-dispatcher = callPackage ./python-modules/aiohttp-fast-url-dispatcher { }; + +# aiohttp-jinja2 = callPackage ./python-modules/aiohttp-jinja2 { }; + +# aiohttp-oauthlib = callPackage ./python-modules/aiohttp-oauthlib { }; + +# aiohttp-openmetrics = callPackage ./python-modules/aiohttp-openmetrics { }; + +# aiohttp-remotes = callPackage ./python-modules/aiohttp-remotes { }; + +# aiohttp-retry = callPackage ./python-modules/aiohttp-retry { }; + +# aiohttp-socks = callPackage ./python-modules/aiohttp-socks { }; + +# aiohttp-swagger = callPackage ./python-modules/aiohttp-swagger { }; + +# aiohttp-wsgi = callPackage ./python-modules/aiohttp-wsgi { }; + +# aiohttp-zlib-ng = callPackage ./python-modules/aiohttp-zlib-ng { }; + +# aioitertools = callPackage ./python-modules/aioitertools { }; + +# aiobiketrax = callPackage ./python-modules/aiobiketrax { }; + +# aiobotocore = callPackage ./python-modules/aiobotocore { }; + +# aiobroadlink = callPackage ./python-modules/aiobroadlink { }; + +# aiohue = callPackage ./python-modules/aiohue { }; + +# aiohwenergy = callPackage ./python-modules/aiohwenergy { }; + +# aioimaplib = callPackage ./python-modules/aioimaplib { }; + +# aioinflux = callPackage ./python-modules/aioinflux { }; + +# aiojobs = callPackage ./python-modules/aiojobs { }; + +# aiokafka = callPackage ./python-modules/aiokafka { }; + +# aiokef = callPackage ./python-modules/aiokef { }; + +# aiolookin = callPackage ./python-modules/aiolookin { }; + +# aiolifx = callPackage ./python-modules/aiolifx { }; + +# aiolifx-connection = callPackage ./python-modules/aiolifx-connection { }; + +# aiolifx-effects = callPackage ./python-modules/aiolifx-effects { }; + +# aiolifx-themes = callPackage ./python-modules/aiolifx-themes { }; + +# aiolimiter = callPackage ./python-modules/aiolimiter { }; + +# aiolip = callPackage ./python-modules/aiolip { }; + +# aiolivisi = callPackage ./python-modules/aiolivisi { }; + +# aiolyric = callPackage ./python-modules/aiolyric { }; + +# aiomisc = callPackage ./python-modules/aiomisc { }; + +# aiomisc-pytest = callPackage ./python-modules/aiomisc-pytest { }; + +# aiomodernforms = callPackage ./python-modules/aiomodernforms { }; + +# aiomqtt = callPackage ./python-modules/aiomqtt { }; + +# aiomultiprocess = callPackage ./python-modules/aiomultiprocess { }; + +# aiomusiccast = callPackage ./python-modules/aiomusiccast { }; + +# aiomysensors = callPackage ./python-modules/aiomysensors { }; + +# aiomysql = callPackage ./python-modules/aiomysql { }; + +# aionanoleaf = callPackage ./python-modules/aionanoleaf { }; + +# aionotion = callPackage ./python-modules/aionotion { }; + +# aionut = callPackage ./python-modules/aionut { }; + +# aiooncue = callPackage ./python-modules/aiooncue { }; + +# aioopenexchangerates = callPackage ./python-modules/aioopenexchangerates { }; + +# aioopenssl = callPackage ./python-modules/aioopenssl { }; + +# aiooss2 = callPackage ./python-modules/aiooss2 { }; + +# aiooui = callPackage ./python-modules/aiooui { }; + +# aiopegelonline = callPackage ./python-modules/aiopegelonline { }; + +# aiopg = callPackage ./python-modules/aiopg { }; + +# aiopinboard = callPackage ./python-modules/aiopinboard { }; + +# aioprocessing = callPackage ./python-modules/aioprocessing { }; + +# aioprometheus = callPackage ./python-modules/aioprometheus { }; + +# aiopulse = callPackage ./python-modules/aiopulse { }; + +# aiopurpleair = callPackage ./python-modules/aiopurpleair { }; + +# aiopvapi = callPackage ./python-modules/aiopvapi { }; + +# aiopvpc = callPackage ./python-modules/aiopvpc { }; + +# aiopyarr = callPackage ./python-modules/aiopyarr { }; + +# aiopylgtv = callPackage ./python-modules/aiopylgtv { }; + +# aioqsw = callPackage ./python-modules/aioqsw { }; + +# aioquic = callPackage ./python-modules/aioquic { }; + +# aioraven = callPackage ./python-modules/aioraven { }; + +# aiorecollect = callPackage ./python-modules/aiorecollect { }; + +# aioredis = callPackage ./python-modules/aioredis { }; + +# aioresponses = callPackage ./python-modules/aioresponses { }; + +# aioridwell = callPackage ./python-modules/aioridwell { }; + +# aiormq = callPackage ./python-modules/aiormq { }; + +# aiorpcx = callPackage ./python-modules/aiorpcx { }; + +# aiortm = callPackage ./python-modules/aiortm { }; + +# aiortsp = callPackage ./python-modules/aiortsp { }; + +# aioruckus = callPackage ./python-modules/aioruckus { }; + +# aiorun = callPackage ./python-modules/aiorun { }; + +# aioruuvigateway = callPackage ./python-modules/aioruuvigateway { }; + +# aiorwlock = callPackage ./python-modules/aiorwlock { }; + +# aiosasl = callPackage ./python-modules/aiosasl { }; + +# aiosql = callPackage ./python-modules/aiosql { }; + +# aiosenz = callPackage ./python-modules/aiosenz { }; + +# aioserial = callPackage ./python-modules/aioserial { }; + +# aioshelly = callPackage ./python-modules/aioshelly { }; + +# aioshutil = callPackage ./python-modules/aioshutil { }; + +# aioskybell = callPackage ./python-modules/aioskybell { }; + +# aiosignal = callPackage ./python-modules/aiosignal { }; + +# aioslimproto = callPackage ./python-modules/aioslimproto { }; + +# aiosmb = callPackage ./python-modules/aiosmb { }; + +# aiosmtpd = callPackage ./python-modules/aiosmtpd { }; + +# aiosmtplib = callPackage ./python-modules/aiosmtplib { }; + +# aiosomecomfort = callPackage ./python-modules/aiosomecomfort { }; + +# aiosqlite = callPackage ./python-modules/aiosqlite { }; + +# aiosteamist = callPackage ./python-modules/aiosteamist { }; + +# aiostream = callPackage ./python-modules/aiostream { }; + +# aioswitcher = callPackage ./python-modules/aioswitcher { }; + +# aiosyncthing = callPackage ./python-modules/aiosyncthing { }; + +# aiotankerkoenig = callPackage ./python-modules/aiotankerkoenig { }; + +# aiotractive = callPackage ./python-modules/aiotractive { }; + +# aiounifi = callPackage ./python-modules/aiounifi { }; + +# aiounittest = callPackage ./python-modules/aiounittest { }; + +# aiovlc = callPackage ./python-modules/aiovlc { }; + +# aiovodafone = callPackage ./python-modules/aiovodafone { }; + +# aiowatttime = callPackage ./python-modules/aiowatttime { }; + +# aiowaqi = callPackage ./python-modules/aiowaqi { }; + +# aioweenect = callPackage ./python-modules/aioweenect { }; + +# aiowebostv = callPackage ./python-modules/aiowebostv { }; + +# aiowinreg = callPackage ./python-modules/aiowinreg { }; + +# aiowithings = callPackage ./python-modules/aiowithings { }; + +# aioxmpp = callPackage ./python-modules/aioxmpp { }; + +# aioymaps = callPackage ./python-modules/aioymaps { }; + +# aiozeroconf = callPackage ./python-modules/aiozeroconf { }; + +# airium = callPackage ./python-modules/airium { }; + +# airly = callPackage ./python-modules/airly { }; + +# airthings-ble = callPackage ./python-modules/airthings-ble { }; + +# airthings-cloud = callPackage ./python-modules/airthings-cloud { }; + +# airtouch4pyapi = callPackage ./python-modules/airtouch4pyapi { }; + +# airtouch5py = callPackage ./python-modules/airtouch5py { }; + +# ajpy = callPackage ./python-modules/ajpy { }; + +# ajsonrpc = callPackage ./python-modules/ajsonrpc { }; + + alabaster = callPackage ./python-modules/alabaster { }; + +# aladdin-connect = callPackage ./python-modules/aladdin-connect { }; + +# alarmdecoder = callPackage ./python-modules/alarmdecoder { }; + +# albumentations = callPackage ./python-modules/albumentations { }; + +# ale-py = callPackage ./python-modules/ale-py { }; + +# alectryon = callPackage ./python-modules/alectryon { }; + +# alembic = callPackage ./python-modules/alembic { }; + +# alexapy = callPackage ./python-modules/alexapy { }; + +# algebraic-data-types = callPackage ./python-modules/algebraic-data-types { }; + +# alive-progress = callPackage ./python-modules/alive-progress { }; + +# aliyun-python-sdk-cdn = callPackage ./python-modules/aliyun-python-sdk-cdn { }; + +# aliyun-python-sdk-config = callPackage ./python-modules/aliyun-python-sdk-config { }; + +# aliyun-python-sdk-core = callPackage ./python-modules/aliyun-python-sdk-core { }; + +# aliyun-python-sdk-dbfs = callPackage ./python-modules/aliyun-python-sdk-dbfs { }; + +# aliyun-python-sdk-iot = callPackage ./python-modules/aliyun-python-sdk-iot { }; + +# aliyun-python-sdk-kms = callPackage ./python-modules/aliyun-python-sdk-kms { }; + +# aliyun-python-sdk-sts = callPackage ./python-modules/aliyun-python-sdk-sts { }; + +# allpairspy = callPackage ./python-modules/allpairspy { }; + +# allure-behave = callPackage ./python-modules/allure-behave { }; + +# allure-python-commons = callPackage ./python-modules/allure-python-commons { }; + +# allure-python-commons-test = callPackage ./python-modules/allure-python-commons-test { }; + +# allure-pytest = callPackage ./python-modules/allure-pytest { }; + +# alpha-vantage = callPackage ./python-modules/alpha-vantage { }; + +# altair = callPackage ./python-modules/altair { }; + +# altgraph = callPackage ./python-modules/altgraph { }; + +# amarna = callPackage ./python-modules/amarna { }; + +# amazon-ion = callPackage ./python-modules/amazon-ion { }; + +# amazon-kclpy = callPackage ./python-modules/amazon-kclpy { }; + +# ambee = callPackage ./python-modules/ambee { }; + +# amberelectric = callPackage ./python-modules/amberelectric { }; + +# ambiclimate = callPackage ./python-modules/ambiclimate { }; + +# amcrest = callPackage ./python-modules/amcrest { }; + +# amiibo-py = callPackage ./python-modules/amiibo-py { }; + +# amply = callPackage ./python-modules/amply { }; + +# amqp = callPackage ./python-modules/amqp { }; + +# amqplib = callPackage ./python-modules/amqplib { }; + +# amqtt = callPackage ./python-modules/amqtt { }; + +# anchor-kr = callPackage ./python-modules/anchor-kr { }; + +# ancp-bids = callPackage ./python-modules/ancp-bids { }; + +# android-backup = callPackage ./python-modules/android-backup { }; + +# androidtv = callPackage ./python-modules/androidtv { }; + +# androidtvremote2 = callPackage ./python-modules/androidtvremote2 { }; + +# androguard = callPackage ./python-modules/androguard { }; + +# anel-pwrctrl-homeassistant = callPackage ./python-modules/anel-pwrctrl-homeassistant { }; + +# angr = callPackage ./python-modules/angr { }; + +# angrcli = callPackage ./python-modules/angrcli { +# inherit (pkgs) coreutils; +# }; + +# angrop = callPackage ./python-modules/angrop { }; + +# aniso8601 = callPackage ./python-modules/aniso8601 { }; + +# anitopy = callPackage ./python-modules/anitopy { }; + +# annexremote = callPackage ./python-modules/annexremote { }; + +# annotated-types = callPackage ./python-modules/annotated-types { }; + +# annoy = callPackage ./python-modules/annoy { }; + +# anonip = callPackage ./python-modules/anonip { }; + +# anova-wifi = callPackage ./python-modules/anova-wifi { }; + +# ansi2html = callPackage ./python-modules/ansi2html { }; + +# ansi2image = callPackage ./python-modules/ansi2image { }; + +# ansible = callPackage ./python-modules/ansible { }; + +# ansible-builder = callPackage ./python-modules/ansible-builder { }; + +# ansible-compat = callPackage ./python-modules/ansible-compat { }; + +# ansible-core = callPackage ./python-modules/ansible/core.nix { }; + +# ansible-kernel = callPackage ./python-modules/ansible-kernel { }; + +# ansible-navigator = callPackage ./python-modules/ansible-navigator { }; + +# ansible-pylibssh = callPackage ./python-modules/ansible-pylibssh { }; + +# ansible-runner = callPackage ./python-modules/ansible-runner { }; + +# ansible-vault-rw = callPackage ./python-modules/ansible-vault-rw { }; + +# ansi = callPackage ./python-modules/ansi { }; + +# ansicolor = callPackage ./python-modules/ansicolor { }; + +# ansicolors = callPackage ./python-modules/ansicolors { }; + +# ansiconv = callPackage ./python-modules/ansiconv { }; + +# ansimarkup = callPackage ./python-modules/ansimarkup { }; + +# ansiwrap = callPackage ./python-modules/ansiwrap { }; + +# anthemav = callPackage ./python-modules/anthemav { }; + +# anthropic = callPackage ./python-modules/anthropic { }; + +# antlr4-python3-runtime = callPackage ./python-modules/antlr4-python3-runtime { +# inherit (pkgs) antlr4; +# }; + +# anyascii = callPackage ./python-modules/anyascii { }; + +# anybadge = callPackage ./python-modules/anybadge { }; + +# anyconfig = callPackage ./python-modules/anyconfig { }; + +# anyio = callPackage ./python-modules/anyio { }; + +# anyqt = callPackage ./python-modules/anyqt { }; + +# anysqlite = callPackage ./python-modules/anysqlite { }; + +# anytree = callPackage ./python-modules/anytree { +# inherit (pkgs) graphviz; +# }; + +# anywidget = callPackage ./python-modules/anywidget { }; + +# aocd = callPackage ./python-modules/aocd { }; + +# aocd-example-parser = callPackage ./python-modules/aocd-example-parser { }; + +# apache-beam = callPackage ./python-modules/apache-beam { }; + +# apcaccess = callPackage ./python-modules/apcaccess { }; + +# apipkg = callPackage ./python-modules/apipkg { }; + +# apischema = callPackage ./python-modules/apischema { }; + +# apispec = callPackage ./python-modules/apispec { }; + +# apispec-webframeworks = callPackage ./python-modules/apispec-webframeworks { }; + +# apkinspector = callPackage ./python-modules/apkinspector { }; + +# apkit = callPackage ./python-modules/apkit { }; + +# aplpy = callPackage ./python-modules/aplpy { }; + +# app-model = callPackage ./python-modules/app-model { }; + +# appdirs = callPackage ./python-modules/appdirs { }; + +# apple-weatherkit = callPackage ./python-modules/apple-weatherkit { }; + +# applicationinsights = callPackage ./python-modules/applicationinsights { }; + +# appnope = callPackage ./python-modules/appnope { }; + +# apprise = callPackage ./python-modules/apprise { }; + +# approval-utilities = callPackage ./python-modules/approval-utilities { }; + +# approvaltests = callPackage ./python-modules/approvaltests { }; + +# apptools = callPackage ./python-modules/apptools { }; + +# appthreat-vulnerability-db = callPackage ./python-modules/appthreat-vulnerability-db { }; + +# apricot-select = callPackage ./python-modules/apricot-select { }; + +# aprslib = callPackage ./python-modules/aprslib { }; + +# apscheduler = callPackage ./python-modules/apscheduler { }; + +# apsw = callPackage ./python-modules/apsw { }; + +# apycula = callPackage ./python-modules/apycula { }; + +# aqipy-atmotech = callPackage ./python-modules/aqipy-atmotech { }; + +# aqualogic = callPackage ./python-modules/aqualogic { }; + +# arabic-reshaper = callPackage ./python-modules/arabic-reshaper { }; + +# aranet4 = callPackage ./python-modules/aranet4 { }; + +# arc4 = callPackage ./python-modules/arc4 { }; + +# arcam-fmj = callPackage ./python-modules/arcam-fmj { }; + +# archinfo = callPackage ./python-modules/archinfo { }; + +# archspec = callPackage ./python-modules/archspec { }; + +# area = callPackage ./python-modules/area { }; + +# arelle = callPackage ./python-modules/arelle { +# gui = true; +# }; + +# arelle-headless = callPackage ./python-modules/arelle { +# gui = false; +# }; + +# aresponses = callPackage ./python-modules/aresponses { }; + + argcomplete = callPackage ./python-modules/argcomplete { }; + +# argh = callPackage ./python-modules/argh { }; + +# argilla = callPackage ./python-modules/argilla { }; + +# argon2-cffi = callPackage ./python-modules/argon2-cffi { }; + +# argon2-cffi-bindings = callPackage ./python-modules/argon2-cffi-bindings { }; + +# argostranslate = callPackage ./python-modules/argostranslate { +# ctranslate2-cpp = pkgs.ctranslate2; +# }; + +# argos-translate-files = callPackage ./python-modules/argos-translate-files { }; + +# argparse-addons = callPackage ./python-modules/argparse-addons { }; + +# argparse-dataclass = callPackage ./python-modules/argparse-dataclass { }; + +# argparse-manpage = callPackage ./python-modules/argparse-manpage { }; + +# args = callPackage ./python-modules/args { }; + +# aria2p = callPackage ./python-modules/aria2p { }; + +# ariadne = callPackage ./python-modules/ariadne { }; + +# arpy = callPackage ./python-modules/arpy { }; + +# arnparse = callPackage ./python-modules/arnparse { }; + +# array-record = callPackage ./python-modules/array-record { }; + +# arrayqueues = callPackage ./python-modules/arrayqueues { }; + +# arris-tg2492lg = callPackage ./python-modules/arris-tg2492lg { }; + +# arrow = callPackage ./python-modules/arrow { }; + +# arsenic = callPackage ./python-modules/arsenic { }; + +# art = callPackage ./python-modules/art { }; + +# arviz = callPackage ./python-modules/arviz { }; + +# arxiv2bib = callPackage ./python-modules/arxiv2bib { }; + +# asana = callPackage ./python-modules/asana { }; + +# ascii-magic = callPackage ./python-modules/ascii-magic { }; + +# asciimatics = callPackage ./python-modules/asciimatics { }; + +# asciitree = callPackage ./python-modules/asciitree { }; + +# asdf = callPackage ./python-modules/asdf { }; + +# asdf-standard = callPackage ./python-modules/asdf-standard { }; + +# asdf-transform-schemas = callPackage ./python-modules/asdf-transform-schemas { }; + +# ase = callPackage ./python-modules/ase { }; + +# asf-search = callPackage ./python-modules/asf-search { }; + +# asgi-csrf = callPackage ./python-modules/asgi-csrf { }; + +# asgi-lifespan = callPackage ./python-modules/asgi-lifespan { }; + +# asgi-logger = callPackage ./python-modules/asgi-logger { }; + +# asgineer = callPackage ./python-modules/asgineer { }; + +# asgiref = callPackage ./python-modules/asgiref { }; + +# asks = callPackage ./python-modules/asks { }; + +# asmog = callPackage ./python-modules/asmog { }; + +# asn1 = callPackage ./python-modules/asn1 { }; + +# asn1ate = callPackage ./python-modules/asn1ate { }; + +# asn1crypto = callPackage ./python-modules/asn1crypto { }; + +# asn1tools = callPackage ./python-modules/asn1tools { }; + +# aspectlib = callPackage ./python-modules/aspectlib { }; + +# aspell-python = callPackage ./python-modules/aspell-python { }; + +# aspy-refactor-imports = callPackage ./python-modules/aspy-refactor-imports { }; + +# aspy-yaml = callPackage ./python-modules/aspy-yaml { }; + +# assay = callPackage ./python-modules/assay { }; + +# assertpy = callPackage ./python-modules/assertpy { }; + +# asterisk-mbox = callPackage ./python-modules/asterisk-mbox { }; + +# asteroid-filterbanks = callPackage ./python-modules/asteroid-filterbanks { }; + +# asteval = callPackage ./python-modules/asteval { }; + +# astor = callPackage ./python-modules/astor { }; + +# astral = callPackage ./python-modules/astral { }; + +# astroid = callPackage ./python-modules/astroid { }; + +# astropy = callPackage ./python-modules/astropy { }; + +# astropy-healpix = callPackage ./python-modules/astropy-healpix { }; + +# astropy-helpers = callPackage ./python-modules/astropy-helpers { }; + +# astropy-iers-data = callPackage ./python-modules/astropy-iers-data { }; + +# astropy-extension-helpers = callPackage ./python-modules/astropy-extension-helpers { }; + +# astroquery = callPackage ./python-modules/astroquery { }; + +# asttokens = callPackage ./python-modules/asttokens { }; + +# astunparse = callPackage ./python-modules/astunparse { }; + +# asyauth = callPackage ./python-modules/asyauth { }; + +# async-dns = callPackage ./python-modules/async-dns { }; + +# async-generator = callPackage ./python-modules/async-generator { }; + +# async-interrupt = callPackage ./python-modules/async-interrupt { }; + +# async-lru = callPackage ./python-modules/async-lru { }; + +# async-modbus = callPackage ./python-modules/async-modbus { }; + +# asyncclick = callPackage ./python-modules/asyncclick { }; + +# asynccmd = callPackage ./python-modules/asynccmd { }; + +# asyncinotify = callPackage ./python-modules/asyncinotify { }; + +# asyncio-dgram = callPackage ./python-modules/asyncio-dgram { }; + +# asyncio-mqtt = callPackage ./python-modules/asyncio-mqtt { }; + +# asyncio-rlock = callPackage ./python-modules/asyncio-rlock { }; + +# asyncmy = callPackage ./python-modules/asyncmy { }; + +# asyncio-throttle = callPackage ./python-modules/asyncio-throttle { }; + +# asyncpg = callPackage ./python-modules/asyncpg { }; + +# asyncserial = callPackage ./python-modules/asyncserial { }; + +# asyncsleepiq = callPackage ./python-modules/asyncsleepiq { }; + +# asyncssh = callPackage ./python-modules/asyncssh { }; + +# asyncstdlib = callPackage ./python-modules/asyncstdlib { }; + +# async-stagger = callPackage ./python-modules/async-stagger { }; + +# asynctest = callPackage ./python-modules/asynctest { }; + +# async-timeout = callPackage ./python-modules/async-timeout { }; + +# async-tkinter-loop = callPackage ./python-modules/async-tkinter-loop { }; + +# asyncua = callPackage ./python-modules/asyncua { }; + +# async-upnp-client = callPackage ./python-modules/async-upnp-client { }; + +# asyncwhois = callPackage ./python-modules/asyncwhois { }; + +# asysocks = callPackage ./python-modules/asysocks { }; + +# atc-ble = callPackage ./python-modules/atc-ble { }; + +# atenpdu = callPackage ./python-modules/atenpdu { }; + +# atlassian-python-api = callPackage ./python-modules/atlassian-python-api { }; + +# atom = callPackage ./python-modules/atom { }; + +# atomiclong = callPackage ./python-modules/atomiclong { }; + +# atomicwrites = callPackage ./python-modules/atomicwrites { }; + +# atomicwrites-homeassistant = callPackage ./python-modules/atomicwrites-homeassistant { }; + +# atomman = callPackage ./python-modules/atomman { }; + +# atpublic = callPackage ./python-modules/atpublic { }; + +# atsim-potentials = callPackage ./python-modules/atsim-potentials { }; + +# attrdict = callPackage ./python-modules/attrdict { }; + + attrs = callPackage ./python-modules/attrs { }; + +# aubio = callPackage ./python-modules/aubio { }; + +# audible = callPackage ./python-modules/audible { }; + +# audio-metadata = callPackage ./python-modules/audio-metadata { }; + +# audioread = callPackage ./python-modules/audioread { }; + +# audiotools = callPackage ./python-modules/audiotools { +# inherit (pkgs.darwin.apple_sdk.frameworks) AudioToolbox AudioUnit CoreServices; +# }; + +# auditok = callPackage ./python-modules/auditok { }; + +# auditwheel = callPackage ./python-modules/auditwheel { +# inherit (pkgs) bzip2 gnutar patchelf unzip; +# }; + +# augeas = callPackage ./python-modules/augeas { +# inherit (pkgs) augeas; +# }; + +# augmax = callPackage ./python-modules/augmax { }; + +# auroranoaa = callPackage ./python-modules/auroranoaa { }; + +# aurorapy = callPackage ./python-modules/aurorapy { }; + +# autarco = callPackage ./python-modules/autarco { }; + +# auth0-python = callPackage ./python-modules/auth0-python { }; + +# authcaptureproxy = callPackage ./python-modules/authcaptureproxy { }; + +# authheaders = callPackage ./python-modules/authheaders { }; + +# authlib = callPackage ./python-modules/authlib { }; + +# authres = callPackage ./python-modules/authres { }; + +# autobahn = callPackage ./python-modules/autobahn { }; + +# autocommand = callPackage ./python-modules/autocommand { }; + +# autofaiss = callPackage ./python-modules/autofaiss { }; + +# autoflake = callPackage ./python-modules/autoflake { }; + +# autograd = callPackage ./python-modules/autograd { }; + +# autograd-gamma = callPackage ./python-modules/autograd-gamma { }; + +# autoit-ripper = callPackage ./python-modules/autoit-ripper { }; + +# autologging = callPackage ./python-modules/autologging { }; + +# automat = callPackage ./python-modules/automat { }; + +# automate-home = callPackage ./python-modules/automate-home { }; + +# automx2 = callPackage ./python-modules/automx2 { }; + +# autopage = callPackage ./python-modules/autopage { }; + +# autopep8 = callPackage ./python-modules/autopep8 { }; + +# autoslot = callPackage ./python-modules/autoslot { }; + +# avahi = toPythonModule (pkgs.avahi.override { +# inherit python; +# withPython = true; +# }); + +# av = callPackage ./python-modules/av { }; + +# avea = callPackage ./python-modules/avea { }; + +# avidtools = callPackage ./python-modules/avidtools { }; + +# avion = callPackage ./python-modules/avion { }; + +# avro3k = callPackage ./python-modules/avro3k { }; + +# avro = callPackage ./python-modules/avro { }; + +# avro-python3 = callPackage ./python-modules/avro-python3 { }; + +# aw-client = callPackage ./python-modules/aw-client { }; + +# aw-core = callPackage ./python-modules/aw-core { }; + +# awacs = callPackage ./python-modules/awacs { }; + +# awesome-slugify = callPackage ./python-modules/awesome-slugify { }; + +# awesomeversion = callPackage ./python-modules/awesomeversion { }; + +# awkward = callPackage ./python-modules/awkward { }; + +# awkward-cpp = callPackage ./python-modules/awkward-cpp { +# inherit (pkgs) cmake ninja; +# }; + +# aws-adfs = callPackage ./python-modules/aws-adfs { }; + +# aws-encryption-sdk = callPackage ./python-modules/aws-encryption-sdk { }; + +# aws-lambda-builders = callPackage ./python-modules/aws-lambda-builders { }; + +# aws-sam-translator = callPackage ./python-modules/aws-sam-translator { }; + +# aws-secretsmanager-caching = callPackage ./python-modules/aws-secretsmanager-caching { }; + +# aws-xray-sdk = callPackage ./python-modules/aws-xray-sdk { }; + +# awscrt = callPackage ./python-modules/awscrt { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreFoundation Security; +# }; + +# awsiotpythonsdk = callPackage ./python-modules/awsiotpythonsdk { }; + +# awsipranges = callPackage ./python-modules/awsipranges { }; + +# awslambdaric = callPackage ./python-modules/awslambdaric { }; + +# awswrangler = callPackage ./python-modules/awswrangler { }; + +# ax = callPackage ./python-modules/ax { }; + +# axis = callPackage ./python-modules/axis { }; + +# axisregistry = callPackage ./python-modules/axisregistry { }; + +# azure-appconfiguration = callPackage ./python-modules/azure-appconfiguration { }; + +# azure-applicationinsights = callPackage ./python-modules/azure-applicationinsights { }; + +# azure-batch = callPackage ./python-modules/azure-batch { }; + +# azure-common = callPackage ./python-modules/azure-common { }; + +# azure-containerregistry = callPackage ./python-modules/azure-containerregistry { }; + +# azure-core = callPackage ./python-modules/azure-core { }; + +# azure-cosmos = callPackage ./python-modules/azure-cosmos { }; + +# azure-cosmosdb-nspkg = callPackage ./python-modules/azure-cosmosdb-nspkg { }; + +# azure-cosmosdb-table = callPackage ./python-modules/azure-cosmosdb-table { }; + +# azure-data-tables = callPackage ./python-modules/azure-data-tables { }; + +# azure-datalake-store = callPackage ./python-modules/azure-datalake-store { }; + +# azure-eventgrid = callPackage ./python-modules/azure-eventgrid { }; + +# azure-eventhub = callPackage ./python-modules/azure-eventhub { }; + +# azure-functions-devops-build = callPackage ./python-modules/azure-functions-devops-build { }; + +# azure-graphrbac = callPackage ./python-modules/azure-graphrbac { }; + +# azure-identity = callPackage ./python-modules/azure-identity { }; + +# azure-keyvault = callPackage ./python-modules/azure-keyvault { }; + +# azure-keyvault-administration = callPackage ./python-modules/azure-keyvault-administration { }; + +# azure-keyvault-certificates = callPackage ./python-modules/azure-keyvault-certificates { }; + +# azure-keyvault-keys = callPackage ./python-modules/azure-keyvault-keys { }; + +# azure-keyvault-nspkg = callPackage ./python-modules/azure-keyvault-nspkg { }; + +# azure-keyvault-secrets = callPackage ./python-modules/azure-keyvault-secrets { }; + +# azure-loganalytics = callPackage ./python-modules/azure-loganalytics { }; + +# azure-mgmt-advisor = callPackage ./python-modules/azure-mgmt-advisor { }; + +# azure-mgmt-apimanagement = callPackage ./python-modules/azure-mgmt-apimanagement { }; + +# azure-mgmt-appconfiguration = callPackage ./python-modules/azure-mgmt-appconfiguration { }; + +# azure-mgmt-appcontainers = callPackage ./python-modules/azure-mgmt-appcontainers { }; + +# azure-mgmt-applicationinsights = callPackage ./python-modules/azure-mgmt-applicationinsights { }; + +# azure-mgmt-authorization = callPackage ./python-modules/azure-mgmt-authorization { }; + +# azure-mgmt-batchai = callPackage ./python-modules/azure-mgmt-batchai { }; + +# azure-mgmt-batch = callPackage ./python-modules/azure-mgmt-batch { }; + +# azure-mgmt-billing = callPackage ./python-modules/azure-mgmt-billing { }; + +# azure-mgmt-botservice = callPackage ./python-modules/azure-mgmt-botservice { }; + +# azure-mgmt-cdn = callPackage ./python-modules/azure-mgmt-cdn { }; + +# azure-mgmt-cognitiveservices = callPackage ./python-modules/azure-mgmt-cognitiveservices { }; + +# azure-mgmt-commerce = callPackage ./python-modules/azure-mgmt-commerce { }; + +# azure-mgmt-common = callPackage ./python-modules/azure-mgmt-common { }; + +# azure-mgmt-compute = callPackage ./python-modules/azure-mgmt-compute { }; + +# azure-mgmt-consumption = callPackage ./python-modules/azure-mgmt-consumption { }; + +# azure-mgmt-containerinstance = callPackage ./python-modules/azure-mgmt-containerinstance { }; + +# azure-mgmt-containerregistry = callPackage ./python-modules/azure-mgmt-containerregistry { }; + +# azure-mgmt-containerservice = callPackage ./python-modules/azure-mgmt-containerservice { }; + +# azure-mgmt-core = callPackage ./python-modules/azure-mgmt-core { }; + +# azure-mgmt-cosmosdb = callPackage ./python-modules/azure-mgmt-cosmosdb { }; + +# azure-mgmt-databoxedge = callPackage ./python-modules/azure-mgmt-databoxedge { }; + +# azure-mgmt-datafactory = callPackage ./python-modules/azure-mgmt-datafactory { }; + +# azure-mgmt-datalake-analytics = callPackage ./python-modules/azure-mgmt-datalake-analytics { }; + +# azure-mgmt-datalake-nspkg = callPackage ./python-modules/azure-mgmt-datalake-nspkg { }; + +# azure-mgmt-datalake-store = callPackage ./python-modules/azure-mgmt-datalake-store { }; + +# azure-mgmt-datamigration = callPackage ./python-modules/azure-mgmt-datamigration { }; + +# azure-mgmt-deploymentmanager = callPackage ./python-modules/azure-mgmt-deploymentmanager { }; + +# azure-mgmt-devspaces = callPackage ./python-modules/azure-mgmt-devspaces { }; + +# azure-mgmt-devtestlabs = callPackage ./python-modules/azure-mgmt-devtestlabs { }; + +# azure-mgmt-dns = callPackage ./python-modules/azure-mgmt-dns { }; + +# azure-mgmt-eventgrid = callPackage ./python-modules/azure-mgmt-eventgrid { }; + +# azure-mgmt-eventhub = callPackage ./python-modules/azure-mgmt-eventhub { }; + +# azure-mgmt-extendedlocation = callPackage ./python-modules/azure-mgmt-extendedlocation { }; + +# azure-mgmt-frontdoor = callPackage ./python-modules/azure-mgmt-frontdoor { }; + +# azure-mgmt-hanaonazure = callPackage ./python-modules/azure-mgmt-hanaonazure { }; + +# azure-mgmt-hdinsight = callPackage ./python-modules/azure-mgmt-hdinsight { }; + +# azure-mgmt-imagebuilder = callPackage ./python-modules/azure-mgmt-imagebuilder { }; + +# azure-mgmt-iotcentral = callPackage ./python-modules/azure-mgmt-iotcentral { }; + +# azure-mgmt-iothub = callPackage ./python-modules/azure-mgmt-iothub { }; + +# azure-mgmt-iothubprovisioningservices = callPackage ./python-modules/azure-mgmt-iothubprovisioningservices { }; + +# azure-mgmt-keyvault = callPackage ./python-modules/azure-mgmt-keyvault { }; + +# azure-mgmt-kusto = callPackage ./python-modules/azure-mgmt-kusto { }; + +# azure-mgmt-loganalytics = callPackage ./python-modules/azure-mgmt-loganalytics { }; + +# azure-mgmt-logic = callPackage ./python-modules/azure-mgmt-logic { }; + +# azure-mgmt-machinelearningcompute = callPackage ./python-modules/azure-mgmt-machinelearningcompute { }; + +# azure-mgmt-managedservices = callPackage ./python-modules/azure-mgmt-managedservices { }; + +# azure-mgmt-managementgroups = callPackage ./python-modules/azure-mgmt-managementgroups { }; + +# azure-mgmt-managementpartner = callPackage ./python-modules/azure-mgmt-managementpartner { }; + +# azure-mgmt-maps = callPackage ./python-modules/azure-mgmt-maps { }; + +# azure-mgmt-marketplaceordering = callPackage ./python-modules/azure-mgmt-marketplaceordering { }; + +# azure-mgmt-media = callPackage ./python-modules/azure-mgmt-media { }; + +# azure-mgmt-monitor = callPackage ./python-modules/azure-mgmt-monitor { }; + +# azure-mgmt-msi = callPackage ./python-modules/azure-mgmt-msi { }; + +# azure-mgmt-netapp = callPackage ./python-modules/azure-mgmt-netapp { }; + +# azure-mgmt-network = callPackage ./python-modules/azure-mgmt-network { }; + +# azure-mgmt-notificationhubs = callPackage ./python-modules/azure-mgmt-notificationhubs { }; + +# azure-mgmt-nspkg = callPackage ./python-modules/azure-mgmt-nspkg { }; + +# azure-mgmt-policyinsights = callPackage ./python-modules/azure-mgmt-policyinsights { }; + +# azure-mgmt-powerbiembedded = callPackage ./python-modules/azure-mgmt-powerbiembedded { }; + +# azure-mgmt-privatedns = callPackage ./python-modules/azure-mgmt-privatedns { }; + +# azure-mgmt-rdbms = callPackage ./python-modules/azure-mgmt-rdbms { }; + +# azure-mgmt-recoveryservicesbackup = callPackage ./python-modules/azure-mgmt-recoveryservicesbackup { }; + +# azure-mgmt-recoveryservices = callPackage ./python-modules/azure-mgmt-recoveryservices { }; + +# azure-mgmt-redhatopenshift = callPackage ./python-modules/azure-mgmt-redhatopenshift { }; + +# azure-mgmt-redis = callPackage ./python-modules/azure-mgmt-redis { }; + +# azure-mgmt-relay = callPackage ./python-modules/azure-mgmt-relay { }; + +# azure-mgmt-reservations = callPackage ./python-modules/azure-mgmt-reservations { }; + +# azure-mgmt-resource = callPackage ./python-modules/azure-mgmt-resource { }; + +# azure-mgmt-scheduler = callPackage ./python-modules/azure-mgmt-scheduler { }; + +# azure-mgmt-search = callPackage ./python-modules/azure-mgmt-search { }; + +# azure-mgmt-security = callPackage ./python-modules/azure-mgmt-security { }; + +# azure-mgmt-servicebus = callPackage ./python-modules/azure-mgmt-servicebus { }; + +# azure-mgmt-servicefabric = callPackage ./python-modules/azure-mgmt-servicefabric { }; + +# azure-mgmt-servicefabricmanagedclusters = callPackage ./python-modules/azure-mgmt-servicefabricmanagedclusters { }; + +# azure-mgmt-servicelinker = callPackage ./python-modules/azure-mgmt-servicelinker { }; + +# azure-mgmt-signalr = callPackage ./python-modules/azure-mgmt-signalr { }; + +# azure-mgmt-sql = callPackage ./python-modules/azure-mgmt-sql { }; + +# azure-mgmt-sqlvirtualmachine = callPackage ./python-modules/azure-mgmt-sqlvirtualmachine { }; + +# azure-mgmt-storage = callPackage ./python-modules/azure-mgmt-storage { }; + +# azure-mgmt-subscription = callPackage ./python-modules/azure-mgmt-subscription { }; + +# azure-mgmt-synapse = callPackage ./python-modules/azure-mgmt-synapse { }; + +# azure-mgmt-trafficmanager = callPackage ./python-modules/azure-mgmt-trafficmanager { }; + +# azure-mgmt-web = callPackage ./python-modules/azure-mgmt-web { }; + +# azure-monitor-ingestion = callPackage ./python-modules/azure-monitor-ingestion { }; + +# azure-multiapi-storage = callPackage ./python-modules/azure-multiapi-storage { }; + +# azure-nspkg = callPackage ./python-modules/azure-nspkg { }; + +# azure-servicebus = callPackage ./python-modules/azure-servicebus { }; + +# azure-servicefabric = callPackage ./python-modules/azure-servicefabric { }; + +# azure-servicemanagement-legacy = callPackage ./python-modules/azure-servicemanagement-legacy { }; + +# azure-storage-blob = callPackage ./python-modules/azure-storage-blob { }; + +# azure-storage-common = callPackage ./python-modules/azure-storage-common { }; + +# azure-storage-file = callPackage ./python-modules/azure-storage-file { }; + +# azure-storage-file-share = callPackage ./python-modules/azure-storage-file-share { }; + +# azure-storage-nspkg = callPackage ./python-modules/azure-storage-nspkg { }; + +# azure-storage-queue = callPackage ./python-modules/azure-storage-queue { }; + +# azure-synapse-accesscontrol = callPackage ./python-modules/azure-synapse-accesscontrol { }; + +# azure-synapse-artifacts = callPackage ./python-modules/azure-synapse-artifacts { }; + +# azure-synapse-managedprivateendpoints = callPackage ./python-modules/azure-synapse-managedprivateendpoints { }; + +# azure-synapse-spark = callPackage ./python-modules/azure-synapse-spark { }; + +# b2sdk = callPackage ./python-modules/b2sdk { }; + + babel = callPackage ./python-modules/babel { }; + +# babelfish = callPackage ./python-modules/babelfish { }; + +# babelfont = callPackage ./python-modules/babelfont { }; + +# babelgladeextractor = callPackage ./python-modules/babelgladeextractor { }; + +# bambi = callPackage ./python-modules/bambi { }; + +# pad4pi = callPackage ./python-modules/pad4pi { }; + +# paddle-bfloat = callPackage ./python-modules/paddle-bfloat { }; + +# paddle2onnx = callPackage ./python-modules/paddle2onnx { }; + +# paddleocr = callPackage ./python-modules/paddleocr { }; + +# paddlepaddle = callPackage ./python-modules/paddlepaddle { }; + +# pueblo = callPackage ./python-modules/pueblo { }; + +# pulumi = callPackage ./python-modules/pulumi { inherit (pkgs) pulumi; }; + +# pulumi-aws = callPackage ./python-modules/pulumi-aws { }; + +# pulumi-aws-native = pkgs.pulumiPackages.pulumi-aws-native.sdks.python; + +# pulumi-azure-native = pkgs.pulumiPackages.pulumi-azure-native.sdks.python; + +# pulumi-command = pkgs.pulumiPackages.pulumi-command.sdks.python; + +# pulumi-random = pkgs.pulumiPackages.pulumi-random.sdks.python; + +# backcall = callPackage ./python-modules/backcall { }; + +# backoff = callPackage ./python-modules/backoff { }; + +# backports-cached-property = callPackage ./python-modules/backports-cached-property { }; + +# backports-datetime-fromisoformat = callPackage ./python-modules/backports-datetime-fromisoformat { }; + +# backports-entry-points-selectable = callPackage ./python-modules/backports-entry-points-selectable { }; + +# backports-shutil-get-terminal-size = callPackage ./python-modules/backports-shutil-get-terminal-size { }; + +# backports-shutil-which = callPackage ./python-modules/backports-shutil-which { }; + +# backports-strenum = callPackage ./python-modules/backports-strenum { }; + + backports-zoneinfo = callPackage ./python-modules/backports-zoneinfo { }; + +# bacpypes = callPackage ./python-modules/bacpypes { }; + +# bagit = callPackage ./python-modules/bagit { }; + +# banal = callPackage ./python-modules/banal { }; + +# bandcamp-api = callPackage ./python-modules/bandcamp-api { }; + +# bandit = callPackage ./python-modules/bandit { }; + +# bangla = callPackage ./python-modules/bangla { }; + +# bap = callPackage ./python-modules/bap { +# inherit (pkgs.ocaml-ng.ocamlPackages_4_14) bap; +# }; + +# barectf = callPackage ./python-modules/barectf { }; + +# baron = callPackage ./python-modules/baron { }; + +# base2048 = callPackage ./python-modules/base2048 { }; + +# base36 = callPackage ./python-modules/base36 { }; + +# base58 = callPackage ./python-modules/base58 { }; + +# base58check = callPackage ./python-modules/base58check { }; + +# base64io = callPackage ./python-modules/base64io { }; + +# baseline = callPackage ./python-modules/baseline { }; + +# baselines = callPackage ./python-modules/baselines { }; + +# basemap = callPackage ./python-modules/basemap { }; + +# basemap-data = callPackage ./python-modules/basemap-data { }; + +# bases = callPackage ./python-modules/bases { }; + +# bash-kernel = callPackage ./python-modules/bash-kernel { }; + +# bashlex = callPackage ./python-modules/bashlex { }; + +# basiciw = callPackage ./python-modules/basiciw { }; + +# batchgenerators = callPackage ./python-modules/batchgenerators { }; + +# batchspawner = callPackage ./python-modules/batchspawner { }; + +# batinfo = callPackage ./python-modules/batinfo { }; + +# baycomp = callPackage ./python-modules/baycomp { }; + +# bayesian-optimization = callPackage ./python-modules/bayesian-optimization { }; + +# bayespy = callPackage ./python-modules/bayespy { }; + +# bbox = callPackage ./python-modules/bbox { }; + +# bc-detect-secrets = callPackage ./python-modules/bc-detect-secrets { }; + +# bc-jsonpath-ng = callPackage ./python-modules/bc-jsonpath-ng { }; + +# bc-python-hcl2 = callPackage ./python-modules/bc-python-hcl2 { }; + +# bcdoc = callPackage ./python-modules/bcdoc { }; + +# bcf = callPackage ./python-modules/bcf { }; + +# bcg = callPackage ./python-modules/bcg { }; + +# bch = callPackage ./python-modules/bch { }; + +# bcrypt = if stdenv.hostPlatform.system == "i686-linux" then +# callPackage ./python-modules/bcrypt/3.nix { } +# else +# callPackage ./python-modules/bcrypt { }; + +# bdffont = callPackage ./python-modules/bdffont { }; + +# beaker = callPackage ./python-modules/beaker { }; + +# before-after = callPackage ./python-modules/before-after { }; + +# beancount = callPackage ./python-modules/beancount { }; + +# beancount-black = callPackage ./python-modules/beancount-black { }; + +# beancount-parser = callPackage ./python-modules/beancount-parser { }; + +# beancount-docverif = callPackage ./python-modules/beancount-docverif { }; + +# beanstalkc = callPackage ./python-modules/beanstalkc { }; + +# beartype = callPackage ./python-modules/beartype { }; + +# beautiful-date = callPackage ./python-modules/beautiful-date { }; + +# beautifulsoup4 = callPackage ./python-modules/beautifulsoup4 { }; + +# beautifultable = callPackage ./python-modules/beautifultable { }; + +# beautysh = callPackage ./python-modules/beautysh { }; + +# bech32 = callPackage ./python-modules/bech32 { }; + +# behave = callPackage ./python-modules/behave { }; + +# bellows = callPackage ./python-modules/bellows { }; + +# bencode-py = callPackage ./python-modules/bencode-py { }; + +# bencoder = callPackage ./python-modules/bencoder { }; + +# beniget = callPackage ./python-modules/beniget { }; + +# bentoml = callPackage ./python-modules/bentoml { }; + +# bespon = callPackage ./python-modules/bespon { }; + +# betacode = callPackage ./python-modules/betacode { }; + +# betamax = callPackage ./python-modules/betamax { }; + +# betamax-matchers = callPackage ./python-modules/betamax-matchers { }; + +# betamax-serializers = callPackage ./python-modules/betamax-serializers { }; + +# betterproto = callPackage ./python-modules/betterproto { }; + +# beziers = callPackage ./python-modules/beziers { }; + +# bibtexparser = callPackage ./python-modules/bibtexparser { }; + +# bidict = callPackage ./python-modules/bidict { }; + +# bids-validator = callPackage ./python-modules/bids-validator { }; + +# biliass = callPackage ./python-modules/biliass { }; + +# billiard = callPackage ./python-modules/billiard { }; + +# bimmer-connected = callPackage ./python-modules/bimmer-connected { }; + +# binary = callPackage ./python-modules/binary { }; + +# binary2strings = callPackage ./python-modules/binary2strings { }; + +# binaryornot = callPackage ./python-modules/binaryornot { }; + +# bincopy = callPackage ./python-modules/bincopy { }; + +# bindep = callPackage ./python-modules/bindep { }; + +# binho-host-adapter = callPackage ./python-modules/binho-host-adapter { }; + +# binwalk = callPackage ./python-modules/binwalk { }; + +# binwalk-full = self.binwalk.override { visualizationSupport = true; }; + +# biopandas = callPackage ./python-modules/biopandas { }; + +# biopython = callPackage ./python-modules/biopython { }; + +# biplist = callPackage ./python-modules/biplist { }; + +# bip-utils = callPackage ./python-modules/bip-utils { }; + +# bip32 = callPackage ./python-modules/bip32 { }; + +# birch = callPackage ./python-modules/birch { }; + +# bitarray = callPackage ./python-modules/bitarray { }; + +# bitbox02 = callPackage ./python-modules/bitbox02 { }; + +# bitcoinlib = callPackage ./python-modules/bitcoinlib { }; + +# bitcoin-utils-fork-minimal = callPackage ./python-modules/bitcoin-utils-fork-minimal { }; + +# bitcoinrpc = callPackage ./python-modules/bitcoinrpc { }; + +# bite-parser = callPackage ./python-modules/bite-parser { }; + +# bitlist = callPackage ./python-modules/bitlist { }; + +# bitmath = callPackage ./python-modules/bitmath { }; + +# bitsandbytes = callPackage ./python-modules/bitsandbytes { }; + +# bitstring = callPackage ./python-modules/bitstring { }; + +# bitstruct = callPackage ./python-modules/bitstruct { }; + +# bitvavo-aio = callPackage ./python-modules/bitvavo-aio { }; + +# bizkaibus = callPackage ./python-modules/bizkaibus { }; + +# bjoern = callPackage ./python-modules/bjoern { }; + +# bkcharts = callPackage ./python-modules/bkcharts { }; + +# black = callPackage ./python-modules/black { }; + +# blackjax = callPackage ./python-modules/blackjax { }; + +# black-macchiato = callPackage ./python-modules/black-macchiato { }; + +# bleach = callPackage ./python-modules/bleach { }; + +# bleach-allowlist = callPackage ./python-modules/bleach-allowlist { }; + +# bleak = callPackage ./python-modules/bleak { }; + +# bleak-esphome = callPackage ./python-modules/bleak-esphome { }; + +# bleak-retry-connector = callPackage ./python-modules/bleak-retry-connector { }; + +# blebox-uniapi = callPackage ./python-modules/blebox-uniapi { }; + +# bless = callPackage ./python-modules/bless { }; + +# blessed = callPackage ./python-modules/blessed { }; + +# blessings = callPackage ./python-modules/blessings { }; + +# blinker = callPackage ./python-modules/blinker { }; + +# blinkpy = callPackage ./python-modules/blinkpy { }; + +# blinkstick = callPackage ./python-modules/blinkstick { }; + +# blis = callPackage ./python-modules/blis { }; + +# blobfile = callPackage ./python-modules/blobfile { }; + +# blockchain = callPackage ./python-modules/blockchain { }; + +# blockdiag = callPackage ./python-modules/blockdiag { }; + +# block-io = callPackage ./python-modules/block-io { }; + +# blockfrost-python = callPackage ./python-modules/blockfrost-python { }; + +# blocksat-cli = callPackage ./python-modules/blocksat-cli { }; + +# bloodhound-py = callPackage ./python-modules/bloodhound-py { }; + +# bloodyad = callPackage ./python-modules/bloodyad { }; + +# blosc2 = callPackage ./python-modules/blosc2 { }; + +# bluecurrent-api = callPackage ./python-modules/bluecurrent-api { }; + +# bluemaestro-ble = callPackage ./python-modules/bluemaestro-ble { }; + +# bluepy = callPackage ./python-modules/bluepy { }; + +# bluepy-devices = callPackage ./python-modules/bluepy-devices { }; + +# bluetooth-adapters = callPackage ./python-modules/bluetooth-adapters { }; + +# bluetooth-auto-recovery = callPackage ./python-modules/bluetooth-auto-recovery { }; + +# bluetooth-data-tools= callPackage ./python-modules/bluetooth-data-tools { }; + +# bluetooth-sensor-state-data = callPackage ./python-modules/bluetooth-sensor-state-data { }; + +# blurhash = callPackage ./python-modules/blurhash { }; + +# blurhash-python = callPackage ./python-modules/blurhash-python { }; + +# bme280spi = callPackage ./python-modules/bme280spi { }; + +# bme680 = callPackage ./python-modules/bme680 { }; + +# bnnumerizer = callPackage ./python-modules/bnnumerizer { }; + +# bnunicodenormalizer = callPackage ./python-modules/bnunicodenormalizer { }; + +# boa-api = callPackage ./python-modules/boa-api { }; + +# boiboite-opener-framework = callPackage ./python-modules/boiboite-opener-framework { }; + +# boilerpy3 = callPackage ./python-modules/boilerpy3 { }; + +# bokeh = callPackage ./python-modules/bokeh { }; + +# boltons = callPackage ./python-modules/boltons { }; + +# boltztrap2 = callPackage ./python-modules/boltztrap2 { }; + +# bond-api = callPackage ./python-modules/bond-api { }; + +# bond-async = callPackage ./python-modules/bond-async { }; + +# bonsai = callPackage ./python-modules/bonsai { }; + +# booleanoperations = callPackage ./python-modules/booleanoperations { }; + +# boolean-py = callPackage ./python-modules/boolean-py { }; + +# # Build boost for this specific Python version +# # TODO: use separate output for libboost_python.so +# boost = toPythonModule (pkgs.boost.override { +# inherit (self) python numpy; +# enablePython = true; +# }); + +# borb = callPackage ./python-modules/borb { }; + +# bork = callPackage ./python-modules/bork { }; + +# boschshcpy = callPackage ./python-modules/boschshcpy { }; + +# bottombar = callPackage ./python-modules/bottombar { }; + +# boost-histogram = callPackage ./python-modules/boost-histogram { +# inherit (pkgs) boost; +# }; + +# boto3 = callPackage ./python-modules/boto3 { }; + +# boto3-stubs = callPackage ./python-modules/boto3-stubs { }; + +# boto = callPackage ./python-modules/boto { }; + +# botocore = callPackage ./python-modules/botocore { }; + +# botocore-stubs = callPackage ./python-modules/botocore-stubs { }; + +# botorch = callPackage ./python-modules/botorch { }; + +# bottle = callPackage ./python-modules/bottle { }; + +# bottleneck = callPackage ./python-modules/bottleneck { }; + +# boxx = callPackage ./python-modules/boxx { }; + +# bpemb = callPackage ./python-modules/bpemb { }; + +# bpycv = callPackage ./python-modules/bpycv {}; + +# bpython = callPackage ./python-modules/bpython { }; + +# bqplot = callPackage ./python-modules/bqplot { }; + +# bqscales = callPackage ./python-modules/bqscales { }; + +# braceexpand = callPackage ./python-modules/braceexpand { }; + +# bracex = callPackage ./python-modules/bracex { }; + +# braintree = callPackage ./python-modules/braintree { }; + +# branca = callPackage ./python-modules/branca { }; + +# bravado-core = callPackage ./python-modules/bravado-core { }; + +# bravia-tv = callPackage ./python-modules/bravia-tv { }; + +# breathe = callPackage ./python-modules/breathe { }; + +# breezy = callPackage ./python-modules/breezy { }; + +# brelpy = callPackage ./python-modules/brelpy { }; + +# brian2 = callPackage ./python-modules/brian2 { }; + +# bring-api = callPackage ./python-modules/bring-api { }; + +# broadbean = callPackage ./python-modules/broadbean { }; + +# broadlink = callPackage ./python-modules/broadlink { }; + +# brother = callPackage ./python-modules/brother { }; + +# brother-ql = callPackage ./python-modules/brother-ql { }; + +# brotli = callPackage ./python-modules/brotli { }; + +# brotli-asgi = callPackage ./python-modules/brotli-asgi { }; + + brotlicffi = callPackage ./python-modules/brotlicffi { + inherit (pkgs) brotli; + }; + +# brotlipy = callPackage ./python-modules/brotlipy { }; + +# brottsplatskartan = callPackage ./python-modules/brottsplatskartan { }; + +# browser-cookie3 = callPackage ./python-modules/browser-cookie3 { }; + +# brunt = callPackage ./python-modules/brunt { }; + +# bsddb3 = callPackage ./python-modules/bsddb3 { }; + +# bsdiff4 = callPackage ./python-modules/bsdiff4 { }; + +# bson = callPackage ./python-modules/bson { }; + +# bsuite = callPackage ./python-modules/bsuite { }; + +# btchip-python = callPackage ./python-modules/btchip-python { }; + +# btest = callPackage ./python-modules/btest { }; + +# bthome-ble = callPackage ./python-modules/bthome-ble { }; + +# bt-proximity = callPackage ./python-modules/bt-proximity { }; + +# btrees = callPackage ./python-modules/btrees { }; + +# btrfs = callPackage ./python-modules/btrfs { }; + +# btrfsutil = callPackage ./python-modules/btrfsutil { }; + +# btsmarthub-devicelist = callPackage ./python-modules/btsmarthub-devicelist { }; + +# btsocket = callPackage ./python-modules/btsocket { }; + +# bubop = callPackage ./python-modules/bubop { }; + +# bucketstore = callPackage ./python-modules/bucketstore { }; + +# bugsnag = callPackage ./python-modules/bugsnag { }; + +# bugwarrior = callPackage ./python-modules/bugwarrior { }; + +# bugz = callPackage ./python-modules/bugz { }; + +# bugzilla = callPackage ./python-modules/bugzilla { }; + +# buienradar = callPackage ./python-modules/buienradar { }; + + build = callPackage ./python-modules/build { }; + + buildcatrust = callPackage ./python-modules/buildcatrust { }; + +# bumps = callPackage ./python-modules/bumps { }; + +# bunch = callPackage ./python-modules/bunch { }; + +# bundlewrap = callPackage ./python-modules/bundlewrap { }; + +# bundlewrap-keepass = callPackage ./python-modules/bundlewrap-keepass { }; + +# bundlewrap-pass = callPackage ./python-modules/bundlewrap-pass { }; + +# bundlewrap-teamvault = callPackage ./python-modules/bundlewrap-teamvault { }; + +# busypie = callPackage ./python-modules/busypie { }; + +# bx-py-utils = callPackage ./python-modules/bx-py-utils { }; + +# bx-python = callPackage ./python-modules/bx-python { }; + +# bwapy = callPackage ./python-modules/bwapy { }; + +# bytecode = callPackage ./python-modules/bytecode { }; + +# bytewax = callPackage ./python-modules/bytewax { }; + +# bz2file = callPackage ./python-modules/bz2file { }; + +# cachecontrol = callPackage ./python-modules/cachecontrol { }; + +# cached-ipaddress = callPackage ./python-modules/cached-ipaddress { }; + +# cached-property = callPackage ./python-modules/cached-property { }; + +# cachelib = callPackage ./python-modules/cachelib { }; + +# cachetools = callPackage ./python-modules/cachetools { }; + +# cachey = callPackage ./python-modules/cachey { }; + +# cachier = callPackage ./python-modules/cachier { }; + +# cachy = callPackage ./python-modules/cachy { }; + +# cadquery = callPackage ./python-modules/cadquery { +# inherit (pkgs.darwin.apple_sdk.frameworks) Cocoa; +# }; + +# caffe = toPythonModule (pkgs.caffe.override { +# pythonSupport = true; +# inherit (self) python numpy boost; +# }); + +# caffeWithCuda = toPythonModule (pkgs.caffeWithCuda.override { +# pythonSupport = true; +# inherit (self) python numpy boost; +# }); + +# caio = callPackage ./python-modules/caio { }; + +# cairocffi = callPackage ./python-modules/cairocffi { }; + +# cairosvg = callPackage ./python-modules/cairosvg { }; + +# caldav = callPackage ./python-modules/caldav { }; + + calver = callPackage ./python-modules/calver { }; + +# callee = callPackage ./python-modules/callee { }; + +# calmjs = callPackage ./python-modules/calmjs { }; + +# calmjs-parse = callPackage ./python-modules/calmjs-parse { }; + +# calmjs-types = callPackage ./python-modules/calmjs-types { }; + +# calysto = callPackage ./python-modules/calysto { }; + +# calysto-scheme = callPackage ./python-modules/calysto-scheme { }; + +# camel-converter = callPackage ./python-modules/camel-converter { }; + +# can = callPackage ./python-modules/can { }; + +# canals = callPackage ./python-modules/canals { }; + +# canmatrix = callPackage ./python-modules/canmatrix { }; + +# canonicaljson = callPackage ./python-modules/canonicaljson { }; + +# canopen = callPackage ./python-modules/canopen { }; + +# cantools = callPackage ./python-modules/cantools { }; + +# camelot = callPackage ./python-modules/camelot { }; + +# capstone = callPackage ./python-modules/capstone { +# inherit (pkgs) capstone; +# }; +# capstone_4 = callPackage ./python-modules/capstone/4.nix { +# inherit (pkgs) capstone_4; +# }; + +# captcha = callPackage ./python-modules/captcha { }; + +# capturer = callPackage ./python-modules/capturer { }; + +# carbon = callPackage ./python-modules/carbon { }; + +# cart = callPackage ./python-modules/cart { }; + +# cartopy = callPackage ./python-modules/cartopy { }; + +# casa-formats-io = callPackage ./python-modules/casa-formats-io { }; + +# casbin = callPackage ./python-modules/casbin { }; + +# case = callPackage ./python-modules/case { }; + +# cashaddress = callPackage ./python-modules/cashaddress { }; + +# cassandra-driver = callPackage ./python-modules/cassandra-driver { }; + +# castepxbin = callPackage ./python-modules/castepxbin { }; + +# casttube = callPackage ./python-modules/casttube { }; + +# catalogue = callPackage ./python-modules/catalogue { }; + +# catboost = callPackage ./python-modules/catboost { +# catboost = pkgs.catboost.override { +# pythonSupport = true; +# python3Packages = self; +# }; +# }; + +# catkin-pkg = callPackage ./python-modules/catkin-pkg { }; + +# catppuccin = callPackage ./python-modules/catppuccin { }; + +# cattrs = callPackage ./python-modules/cattrs { }; + +# cbeams = callPackage ../misc/cbeams { }; + +# cbor2 = callPackage ./python-modules/cbor2 { }; + +# cbor = callPackage ./python-modules/cbor { }; + +# cccolutils = callPackage ./python-modules/cccolutils { }; + +# cdcs = callPackage ./python-modules/cdcs { }; + +# celery = callPackage ./python-modules/celery { }; + +# celery-redbeat = callPackage ./python-modules/celery-redbeat { }; + +# celery-singleton = callPackage ./python-modules/celery-singleton { }; + +# celery-types = callPackage ./python-modules/celery-types { }; + +# cement = callPackage ./python-modules/cement { }; + +# cemm = callPackage ./python-modules/cemm { }; + +# censys = callPackage ./python-modules/censys { }; + +# cexprtk = callPackage ./python-modules/cexprtk { }; + +# coffea = callPackage ./python-modules/coffea { }; + +# cohere = callPackage ./python-modules/cohere { }; + +# coincurve = callPackage ./python-modules/coincurve { +# inherit (pkgs) secp256k1; +# }; + +# comicon = callPackage ./python-modules/comicon { }; + +# command-runner = callPackage ./python-modules/command-runner { }; + +# connect-box = callPackage ./python-modules/connect-box { }; + +# connection-pool = callPackage ./python-modules/connection-pool { }; + +# connio = callPackage ./python-modules/connio { }; + +# conway-polynomials = callPackage ./python-modules/conway-polynomials {}; + +# correctionlib = callPackage ./python-modules/correctionlib { }; + +# coqpit = callPackage ./python-modules/coqpit { }; + +# cepa = callPackage ./python-modules/cepa { }; + +# cerberus = callPackage ./python-modules/cerberus { }; + +# cert-chain-resolver = callPackage ./python-modules/cert-chain-resolver { }; + +# certauth = callPackage ./python-modules/certauth { }; + +# certbot = callPackage ./python-modules/certbot { }; + +# certbot-dns-cloudflare = callPackage ./python-modules/certbot-dns-cloudflare { }; + +# certbot-dns-google = callPackage ./python-modules/certbot-dns-google { }; + +# certbot-dns-inwx = callPackage ./python-modules/certbot-dns-inwx { }; + +# certbot-dns-ovh = callPackage ./python-modules/certbot-dns-ovh { }; + +# certbot-dns-rfc2136 = callPackage ./python-modules/certbot-dns-rfc2136 { }; + +# certbot-dns-route53 = callPackage ./python-modules/certbot-dns-route53 { }; + + certifi = callPackage ./python-modules/certifi { }; + +# certipy = callPackage ./python-modules/certipy { }; + +# certipy-ad = callPackage ./python-modules/certipy-ad { }; + +# certomancer = callPackage ./python-modules/certomancer { }; + +# certvalidator = callPackage ./python-modules/certvalidator { }; + +# cf-xarray = callPackage ./python-modules/cf-xarray { }; + +# cffconvert = callPackage ./python-modules/cffconvert { }; + + cffi = callPackage ./python-modules/cffi { }; + +# cffsubr = callPackage ./python-modules/cffsubr { }; + +# cfgv = callPackage ./python-modules/cfgv { }; + +# cfn-flip = callPackage ./python-modules/cfn-flip { }; + +# cfn-lint = callPackage ./python-modules/cfn-lint { }; + +# cfscrape = callPackage ./python-modules/cfscrape { }; + +# cftime = callPackage ./python-modules/cftime { }; + +# cgen = callPackage ./python-modules/cgen { }; + +# cgroup-utils = callPackage ./python-modules/cgroup-utils { }; + +# chacha20poly1305 = callPackage ./python-modules/chacha20poly1305 { }; + +# chacha20poly1305-reuseable = callPackage ./python-modules/chacha20poly1305-reuseable { }; + +# chai = callPackage ./python-modules/chai { }; + +# chainer = callPackage ./python-modules/chainer { +# inherit (pkgs.config) cudaSupport; +# }; + +# chainmap = callPackage ./python-modules/chainmap { }; + +# chainstream = callPackage ./python-modules/chainstream { }; + +# chalice = callPackage ./python-modules/chalice { }; + +# chameleon = callPackage ./python-modules/chameleon { }; + +# channels = callPackage ./python-modules/channels { }; + +# channels-redis = callPackage ./python-modules/channels-redis { }; + +# characteristic = callPackage ./python-modules/characteristic { }; + +# character-encoding-utils = callPackage ./python-modules/character-encoding-utils { }; + + chardet = callPackage ./python-modules/chardet { }; + + charset-normalizer = callPackage ./python-modules/charset-normalizer { }; + +# chart-studio = callPackage ./python-modules/chart-studio { }; + +# chat-downloader = callPackage ./python-modules/chat-downloader { }; + +# check-manifest = callPackage ./python-modules/check-manifest { }; + +# checkdmarc = callPackage ./python-modules/checkdmarc { }; + +# checksumdir = callPackage ./python-modules/checksumdir { }; + +# cheetah3 = callPackage ./python-modules/cheetah3 { }; + +# cheroot = callPackage ./python-modules/cheroot { }; + +# cherrypy = callPackage ./python-modules/cherrypy { }; + +# cherrypy-cors = callPackage ./python-modules/cherrypy-cors { }; + +# chess = callPackage ./python-modules/chess { }; + +# chevron = callPackage ./python-modules/chevron { }; + +# chex = callPackage ./python-modules/chex { }; + +# chiabip158 = throw "chiabip158 has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# chiapos = throw "chiapos has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# chiavdf = throw "chiavdf has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# chia-rs = throw "chia-rs has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# chirpstack-api = callPackage ./python-modules/chirpstack-api { }; + +# chispa = callPackage ./python-modules/chispa { }; + +# chroma-hnswlib = callPackage ./python-modules/chroma-hnswlib { }; + +# chromadb = callPackage ./python-modules/chromadb { }; + +# chromaprint = callPackage ./python-modules/chromaprint { }; + +# ci-info = callPackage ./python-modules/ci-info { }; + +# ci-py = callPackage ./python-modules/ci-py { }; + +# cinemagoer = callPackage ./python-modules/cinemagoer { }; + +# circuit-webhook = callPackage ./python-modules/circuit-webhook { }; + +# circuitbreaker = callPackage ./python-modules/circuitbreaker { }; + +# circus = callPackage ./python-modules/circus { }; + +# cirq = callPackage ./python-modules/cirq { }; + +# cirq-aqt = callPackage ./python-modules/cirq-aqt { }; + +# cirq-core = callPackage ./python-modules/cirq-core { }; + +# cirq-ft = callPackage ./python-modules/cirq-ft { }; + +# cirq-ionq = callPackage ./python-modules/cirq-ionq { }; + +# cirq-google = callPackage ./python-modules/cirq-google { }; + +# cirq-rigetti = callPackage ./python-modules/cirq-rigetti { }; + +# cirq-pasqal = callPackage ./python-modules/cirq-pasqal { }; + +# cirq-web = callPackage ./python-modules/cirq-web { }; + +# ciscoconfparse = callPackage ./python-modules/ciscoconfparse { }; + +# ciscomobilityexpress = callPackage ./python-modules/ciscomobilityexpress { }; + +# ciso8601 = callPackage ./python-modules/ciso8601 { }; + +# citeproc-py = callPackage ./python-modules/citeproc-py { }; + +# cjkwrap = callPackage ./python-modules/cjkwrap { }; + +# ckcc-protocol = callPackage ./python-modules/ckcc-protocol { }; + +# clarabel = callPackage ./python-modules/clarabel { }; + +# clarifai = callPackage ./python-modules/clarifai { }; + +# clarifai-grpc = callPackage ./python-modules/clarifai-grpc { }; + +# claripy = callPackage ./python-modules/claripy { }; + +# classify-imports = callPackage ./python-modules/classify-imports { }; + +# cld2-cffi = callPackage ./python-modules/cld2-cffi { }; + +# cle = callPackage ./python-modules/cle { }; + +# clean-fid = callPackage ./python-modules/clean-fid { }; + +# cleanlab = callPackage ./python-modules/cleanlab { }; + +# cleo = callPackage ./python-modules/cleo { }; + +# clevercsv = callPackage ./python-modules/clevercsv { }; + +# clf = callPackage ./python-modules/clf { }; + +# clip = callPackage ./python-modules/clip { }; + +# clip-anytorch = callPackage ./python-modules/clip-anytorch { }; + +# clr-loader = callPackage ./python-modules/clr-loader { }; + +# cock = callPackage ./python-modules/cock { }; + +# cobs = callPackage ./python-modules/cobs { }; + +# class-doc = callPackage ./python-modules/class-doc { }; + +# cliche = callPackage ./python-modules/cliche { }; + +# click = callPackage ./python-modules/click { }; + +# clickclick = callPackage ./python-modules/clickclick { }; + +# click-aliases = callPackage ./python-modules/click-aliases { }; + +# click-command-tree = callPackage ./python-modules/click-command-tree { }; + +# click-completion = callPackage ./python-modules/click-completion { }; + +# click-configfile = callPackage ./python-modules/click-configfile { }; + +# click-datetime = callPackage ./python-modules/click-datetime { }; + +# click-default-group = callPackage ./python-modules/click-default-group { }; + +# click-didyoumean = callPackage ./python-modules/click-didyoumean { }; + +# click-help-colors = callPackage ./python-modules/click-help-colors { }; + +# click-log = callPackage ./python-modules/click-log { }; + +# click-odoo = callPackage ./python-modules/click-odoo { }; + +# click-odoo-contrib = callPackage ./python-modules/click-odoo-contrib { }; + +# click-option-group = callPackage ./python-modules/click-option-group { }; + +# click-plugins = callPackage ./python-modules/click-plugins { }; + +# click-shell = callPackage ./python-modules/click-shell { }; + +# click-spinner = callPackage ./python-modules/click-spinner { }; + +# click-repl = callPackage ./python-modules/click-repl { }; + +# click-threading = callPackage ./python-modules/click-threading { }; + +# clickgen = callPackage ./python-modules/clickgen { }; + +# clickhouse-cityhash = callPackage ./python-modules/clickhouse-cityhash { }; + +# clickhouse-cli = callPackage ./python-modules/clickhouse-cli { }; + +# clickhouse-connect = callPackage ./python-modules/clickhouse-connect { }; + +# clickhouse-driver = callPackage ./python-modules/clickhouse-driver { }; + +# cliff = callPackage ./python-modules/cliff { }; + +# clifford = callPackage ./python-modules/clifford { }; + +# cligj = callPackage ./python-modules/cligj { }; + +# cli-helpers = callPackage ./python-modules/cli-helpers { }; + +# clikit = callPackage ./python-modules/clikit { }; + +# clint = callPackage ./python-modules/clint { }; + +# clintermission = callPackage ./python-modules/clintermission { }; + +# clize = callPackage ./python-modules/clize { }; + +# clldutils = callPackage ./python-modules/clldutils { }; + +# cloudevents = callPackage ./python-modules/cloudevents { }; + +# cloudflare = callPackage ./python-modules/cloudflare { }; + +# cloudpathlib = callPackage ./python-modules/cloudpathlib { }; + +# cloudpickle = callPackage ./python-modules/cloudpickle { }; + +# cloudscraper = callPackage ./python-modules/cloudscraper { }; + +# cloudsmith-api = callPackage ./python-modules/cloudsmith-api { }; + +# cloudsplaining = callPackage ./python-modules/cloudsplaining { }; + +# cloup = callPackage ./python-modules/cloup { }; + +# clustershell = callPackage ./python-modules/clustershell { }; + +# clvm = throw "clvm has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# clvm-rs = throw "clvm-rs has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# clvm-tools = throw "clvm-tools has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# clvm-tools-rs = throw "clvm-tools-rs has been removed. see https://github.com/NixOS/nixpkgs/pull/270254"; + +# cma = callPackage ./python-modules/cma { }; + +# cmaes = callPackage ./python-modules/cmaes { }; + +# cmake = callPackage ./python-modules/cmake { inherit (pkgs) cmake; }; + +# cmarkgfm = callPackage ./python-modules/cmarkgfm { }; + +# cmd2 = callPackage ./python-modules/cmd2 { }; + +# cmd2-ext-test = callPackage ./python-modules/cmd2-ext-test { }; + +# cmdline = callPackage ./python-modules/cmdline { }; + +# cmdstanpy = callPackage ./python-modules/cmdstanpy { }; + +# cmigemo = callPackage ./python-modules/cmigemo { +# inherit (pkgs) cmigemo; +# }; + +# cmsis-pack-manager = callPackage ./python-modules/cmsis-pack-manager { }; + +# cmsis-svd = callPackage ./python-modules/cmsis-svd { }; + +# cnvkit = callPackage ./python-modules/cnvkit { }; + +# co2signal = callPackage ./python-modules/co2signal { }; + +# coapthon3 = callPackage ./python-modules/coapthon3 { }; + +# coconut = callPackage ./python-modules/coconut { }; + +# cocotb = callPackage ./python-modules/cocotb { }; + +# cocotb-bus = callPackage ./python-modules/cocotb-bus { }; + +# codecov = callPackage ./python-modules/codecov { }; + +# codepy = callPackage ./python-modules/codepy { }; + +# cogapp = callPackage ./python-modules/cogapp { }; + +# coinmetrics-api-client = callPackage ./python-modules/coinmetrics-api-client { }; + +# colanderalchemy = callPackage ./python-modules/colanderalchemy { }; + +# colander = callPackage ./python-modules/colander { }; + +# collections-extended = callPackage ./python-modules/collections-extended { }; + +# collidoscope = callPackage ./python-modules/collidoscope { }; + +# colorama = callPackage ./python-modules/colorama { }; + +# colorcet = callPackage ./python-modules/colorcet { }; + +# colorclass = callPackage ./python-modules/colorclass { }; + +# colored = callPackage ./python-modules/colored { }; + +# colored-traceback = callPackage ./python-modules/colored-traceback { }; + +# coloredlogs = callPackage ./python-modules/coloredlogs { }; + +# colorful = callPackage ./python-modules/colorful { }; + +# colorlog = callPackage ./python-modules/colorlog { }; + +# colorlover = callPackage ./python-modules/colorlover { }; + +# colormath = callPackage ./python-modules/colormath { }; + +# colorspacious = callPackage ./python-modules/colorspacious { }; + +# colorthief = callPackage ./python-modules/colorthief { }; + +# colorzero = callPackage ./python-modules/colorzero { }; + +# colour = callPackage ./python-modules/colour { }; + +# colout = callPackage ./python-modules/colout { }; + +# cometblue-lite = callPackage ./python-modules/cometblue-lite { }; + +# comm = callPackage ./python-modules/comm { }; + +# commandlines = callPackage ./python-modules/commandlines { }; + +# commandparse = callPackage ./python-modules/commandparse { }; + +# commentjson = callPackage ./python-modules/commentjson { }; + +# commoncode = callPackage ./python-modules/commoncode { }; + +# commonmark = callPackage ./python-modules/commonmark { }; + +# compiledb = callPackage ./python-modules/compiledb { }; + +# complycube = callPackage ./python-modules/complycube { }; + +# compreffor = callPackage ./python-modules/compreffor { }; + +# compressai = callPackage ./python-modules/compressai { }; + +# compressed-rtf = callPackage ./python-modules/compressed-rtf { }; + +# concurrent-log-handler = callPackage ./python-modules/concurrent-log-handler { }; + +# conda = callPackage ./python-modules/conda { }; + +# conda-libmamba-solver = callPackage ./python-modules/conda-libmamba-solver { }; + +# conda-package-handling = callPackage ./python-modules/conda-package-handling { }; + +# conda-package-streaming = callPackage ./python-modules/conda-package-streaming { }; + +# confection = callPackage ./python-modules/confection { }; + +# configargparse = callPackage ./python-modules/configargparse { }; + +# configclass = callPackage ./python-modules/configclass { }; + +# configobj = callPackage ./python-modules/configobj { }; + +# configparser = callPackage ./python-modules/configparser { }; + +# configshell = callPackage ./python-modules/configshell { }; + +# configupdater = callPackage ./python-modules/configupdater { }; + +# confluent-kafka = callPackage ./python-modules/confluent-kafka { }; + +# confuse = callPackage ./python-modules/confuse { }; + +# confight = callPackage ./python-modules/confight { }; + +# connexion = callPackage ./python-modules/connexion { }; + +# cons = callPackage ./python-modules/cons { }; + +# consonance = callPackage ./python-modules/consonance { }; + +# constantly = callPackage ./python-modules/constantly { }; + +# construct = callPackage ./python-modules/construct { }; + +# construct-classes = callPackage ./python-modules/construct-classes { }; + +# consul = callPackage ./python-modules/consul { }; + +# container-inspector = callPackage ./python-modules/container-inspector { }; + +# contexter = callPackage ./python-modules/contexter { }; + +# contextlib2 = callPackage ./python-modules/contextlib2 { }; + +# contexttimer = callPackage ./python-modules/contexttimer { }; + +# contourpy = callPackage ./python-modules/contourpy { }; + +# controku = callPackage ./python-modules/controku { }; + +# convertdate = callPackage ./python-modules/convertdate { }; + +# cookiecutter = callPackage ./python-modules/cookiecutter { }; + +# cookies = callPackage ./python-modules/cookies { }; + +# coordinates = callPackage ./python-modules/coordinates { }; + +# coreapi = callPackage ./python-modules/coreapi { }; + +# coredis = callPackage ./python-modules/coredis { }; + +# coreschema = callPackage ./python-modules/coreschema { }; + +# cornice = callPackage ./python-modules/cornice { }; + +# corsair-scan = callPackage ./python-modules/corsair-scan { }; + +# cose = callPackage ./python-modules/cose { }; + +# cot = callPackage ./python-modules/cot { +# qemu = pkgs.qemu; +# }; + +# courlan = callPackage ./python-modules/courlan { }; + +# cov-core = callPackage ./python-modules/cov-core { }; + +# coverage = callPackage ./python-modules/coverage { }; + +# coveralls = callPackage ./python-modules/coveralls { }; + +# cppe = callPackage ./python-modules/cppe { +# inherit (pkgs) cppe; +# }; + +# cppheaderparser = callPackage ./python-modules/cppheaderparser { }; + +# cppy = callPackage ./python-modules/cppy { }; + +# cpufeature = callPackage ./python-modules/cpufeature { }; + +# cpyparsing = callPackage ./python-modules/cpyparsing { }; + +# craft-application-1 = callPackage ./python-modules/craft-application-1 { }; + +# craft-application = callPackage ./python-modules/craft-application { }; + +# craft-archives = callPackage ./python-modules/craft-archives { }; + +# craft-cli = callPackage ./python-modules/craft-cli { }; + +# craft-grammar = callPackage ./python-modules/craft-grammar { }; + +# craft-parts = callPackage ./python-modules/craft-parts { }; + +# craft-providers = callPackage ./python-modules/craft-providers { }; + +# craft-store = callPackage ./python-modules/craft-store { }; + +# cram = callPackage ./python-modules/cram { }; + +# cramjam = callPackage ./python-modules/cramjam { }; + +# crashtest = callPackage ./python-modules/crashtest { }; + +# crate = callPackage ./python-modules/crate { }; + +# crayons = callPackage ./python-modules/crayons { }; + +# crc = callPackage ./python-modules/crc { }; + +# crc16 = callPackage ./python-modules/crc16 { }; + +# crc32c = callPackage ./python-modules/crc32c { }; + +# crccheck = callPackage ./python-modules/crccheck { }; + +# crcmod = callPackage ./python-modules/crcmod { }; + +# credstash = callPackage ./python-modules/credstash { }; + +# criticality-score = callPackage ./python-modules/criticality-score { }; + +# crocoddyl = toPythonModule (callPackage ../development/libraries/crocoddyl { +# pythonSupport = true; +# python3Packages = self; +# }); + +# cron-descriptor = callPackage ./python-modules/cron-descriptor { }; + +# croniter = callPackage ./python-modules/croniter { }; + +# cronsim = callPackage ./python-modules/cronsim { }; + +# crontab = callPackage ./python-modules/crontab { }; + +# crossplane = callPackage ./python-modules/crossplane { }; + +# crownstone-cloud = callPackage ./python-modules/crownstone-cloud { }; + +# crownstone-core = callPackage ./python-modules/crownstone-core { }; + +# crownstone-sse = callPackage ./python-modules/crownstone-sse { }; + +# crownstone-uart = callPackage ./python-modules/crownstone-uart { }; + +# cryptacular = callPackage ./python-modules/cryptacular { }; + +# cryptg = callPackage ./python-modules/cryptg { }; + +# cryptodatahub = callPackage ./python-modules/cryptodatahub { }; + +# cryptography = callPackage ./python-modules/cryptography { +# inherit (pkgs.darwin) libiconv; +# inherit (pkgs.darwin.apple_sdk.frameworks) Security; +# }; + +# cryptolyzer = callPackage ./python-modules/cryptolyzer { }; + +# cryptoparser = callPackage ./python-modules/cryptoparser { }; + +# crysp = callPackage ./python-modules/crysp { }; + +# crytic-compile = callPackage ./python-modules/crytic-compile { }; + +# cson = callPackage ./python-modules/cson { }; + +# csrmesh = callPackage ./python-modules/csrmesh { }; + +# cssbeautifier = callPackage ./python-modules/cssbeautifier { }; + +# csscompressor = callPackage ./python-modules/csscompressor { }; + +# cssmin = callPackage ./python-modules/cssmin { }; + +# css-html-js-minify = callPackage ./python-modules/css-html-js-minify { }; + +# css-inline = callPackage ./python-modules/css-inline { +# inherit (pkgs.darwin) libiconv; +# inherit (pkgs.darwin.apple_sdk.frameworks) Security SystemConfiguration; +# }; + +# css-parser = callPackage ./python-modules/css-parser { }; + +# cssselect2 = callPackage ./python-modules/cssselect2 { }; + +# cssselect = callPackage ./python-modules/cssselect { }; + +# cssutils = callPackage ./python-modules/cssutils { }; + +# cstruct = callPackage ./python-modules/cstruct { }; + +# csvw = callPackage ./python-modules/csvw { }; + +# ctap-keyring-device = callPackage ./python-modules/ctap-keyring-device { }; + +# ctranslate2 = callPackage ./python-modules/ctranslate2 { +# ctranslate2-cpp = pkgs.ctranslate2; +# }; + +# cu2qu = callPackage ./python-modules/cu2qu { }; + +# cucumber-tag-expressions = callPackage ./python-modules/cucumber-tag-expressions { }; + +# cufflinks = callPackage ./python-modules/cufflinks { }; + +# # cupy 12.2.0 possibly incompatible with cutensor 2.0 that comes with cudaPackages_12 +# cupy = callPackage ./python-modules/cupy { cudaPackages = pkgs.cudaPackages_11; }; + +# curio = callPackage ./python-modules/curio { }; + +# curlify = callPackage ./python-modules/curlify { }; + +# curtsies = callPackage ./python-modules/curtsies { }; + +# curve25519-donna = callPackage ./python-modules/curve25519-donna { }; + +# cvelib = callPackage ./python-modules/cvelib { }; + +# cvss = callPackage ./python-modules/cvss { }; + +# cvxopt = callPackage ./python-modules/cvxopt { }; + +# cvxpy = callPackage ./python-modules/cvxpy { }; + +# cwcwidth = callPackage ./python-modules/cwcwidth { }; + +# cwl-upgrader = callPackage ./python-modules/cwl-upgrader { }; + +# cwl-utils = callPackage ./python-modules/cwl-utils { }; + +# cwlformat = callPackage ./python-modules/cwlformat { }; + +# cx-freeze = callPackage ./python-modules/cx-freeze { }; + +# cx-oracle = callPackage ./python-modules/cx-oracle { }; + +# cxxfilt = callPackage ./python-modules/cxxfilt { }; + +# cycler = callPackage ./python-modules/cycler { }; + +# cyclonedx-python-lib = callPackage ./python-modules/cyclonedx-python-lib { }; + +# cymem = callPackage ./python-modules/cymem { }; + +# cypari2 = callPackage ./python-modules/cypari2 { }; + +# cypherpunkpay = callPackage ./python-modules/cypherpunkpay { }; + +# cysignals = callPackage ./python-modules/cysignals { }; + + cython = callPackage ./python-modules/cython { }; + +# cython_0 = callPackage ./python-modules/cython/0.nix { }; + +# cython-test-exception-raiser = callPackage ./python-modules/cython-test-exception-raiser { }; + +# cytoolz = callPackage ./python-modules/cytoolz { }; + +# dacite = callPackage ./python-modules/dacite { }; + +# daemonize = callPackage ./python-modules/daemonize { }; + +# daemonocle = callPackage ./python-modules/daemonocle { }; + +# daff = callPackage ./python-modules/daff { }; + +# daiquiri = callPackage ./python-modules/daiquiri { }; + +# dalle-mini = callPackage ./python-modules/dalle-mini { }; + +# daphne = callPackage ./python-modules/daphne { }; + +# daqp = callPackage ./python-modules/daqp { }; + +# darkdetect = callPackage ./python-modules/darkdetect { }; + +# dasbus = callPackage ./python-modules/dasbus { }; + +# dash = callPackage ./python-modules/dash { }; + +# dash-core-components = callPackage ./python-modules/dash-core-components { }; + +# dash-html-components = callPackage ./python-modules/dash-html-components { }; + +# dash-renderer = callPackage ./python-modules/dash-renderer { }; + +# dash-table = callPackage ./python-modules/dash-table { }; + +# dashing = callPackage ./python-modules/dashing { }; + +# dask = callPackage ./python-modules/dask { }; + +# dask-awkward = callPackage ./python-modules/dask-awkward { }; + +# dask-expr = callPackage ./python-modules/dask-expr { }; + +# dask-gateway = callPackage ./python-modules/dask-gateway { }; + +# dask-gateway-server = callPackage ./python-modules/dask-gateway-server { }; + +# dask-glm = callPackage ./python-modules/dask-glm { }; + +# dask-histogram = callPackage ./python-modules/dask-histogram { }; + +# dask-image = callPackage ./python-modules/dask-image { }; + +# dask-jobqueue = callPackage ./python-modules/dask-jobqueue { }; + +# dask-ml = callPackage ./python-modules/dask-ml { }; + +# dask-mpi = callPackage ./python-modules/dask-mpi { }; + +# dask-yarn = callPackage ./python-modules/dask-yarn { }; + +# databases = callPackage ./python-modules/databases { }; + +# databricks-cli = callPackage ./python-modules/databricks-cli { }; + +# databricks-connect = callPackage ./python-modules/databricks-connect { }; + +# databricks-sql-connector = callPackage ./python-modules/databricks-sql-connector { }; + +# dataclass-factory = callPackage ./python-modules/dataclass-factory { }; + +# dataclass-wizard = callPackage ./python-modules/dataclass-wizard { }; + +# dataclasses-json = callPackage ./python-modules/dataclasses-json { }; + +# dataclasses-serialization = callPackage ./python-modules/dataclasses-serialization { }; + +# datadiff = callPackage ./python-modules/datadiff { }; + +# datadog = callPackage ./python-modules/datadog { }; + +# datafusion = callPackage ./python-modules/datafusion { +# inherit (pkgs.darwin.apple_sdk.frameworks) Security SystemConfiguration; +# }; + +# datamodeldict = callPackage ./python-modules/datamodeldict { }; + +# datapoint = callPackage ./python-modules/datapoint { }; + +# dataprep-ml = callPackage ./python-modules/dataprep-ml { }; + +# dataproperty = callPackage ./python-modules/dataproperty { }; + +# dataset = callPackage ./python-modules/dataset { }; + +# datasets = callPackage ./python-modules/datasets { }; + +# datasette = callPackage ./python-modules/datasette { }; + +# datasette-publish-fly = callPackage ./python-modules/datasette-publish-fly { }; + +# datasette-template-sql = callPackage ./python-modules/datasette-template-sql { }; + +# datashader = callPackage ./python-modules/datashader { }; + +# datashape = callPackage ./python-modules/datashape { }; + +# datatable = callPackage ./python-modules/datatable { }; + +# datauri = callPackage ./python-modules/datauri { }; + +# datefinder = callPackage ./python-modules/datefinder { }; + +# dateparser = callPackage ./python-modules/dateparser { }; + +# datetime = callPackage ./python-modules/datetime { }; + +# dateutils = callPackage ./python-modules/dateutils { }; + +# datrie = callPackage ./python-modules/datrie { }; + +# dawg-python = callPackage ./python-modules/dawg-python { }; + +# dazl = callPackage ./python-modules/dazl { }; + +# dbf = callPackage ./python-modules/dbf { }; + +# dbfread = callPackage ./python-modules/dbfread { }; + +# dbglib = callPackage ./python-modules/dbglib { }; + +# dbt-bigquery = callPackage ./python-modules/dbt-bigquery { }; + +# dbt-core = callPackage ./python-modules/dbt-core { }; + +# dbt-extractor = callPackage ./python-modules/dbt-extractor { }; + +# dbt-postgres = callPackage ./python-modules/dbt-postgres { }; + +# dbt-redshift = callPackage ./python-modules/dbt-redshift { }; + +# dbt-semantic-interfaces = callPackage ./python-modules/dbt-semantic-interfaces { }; + +# dbt-snowflake = callPackage ./python-modules/dbt-snowflake { }; + +# dbus-client-gen = callPackage ./python-modules/dbus-client-gen { }; + +# dbus-deviation = callPackage ./python-modules/dbus-deviation { }; + +# dbus-fast = callPackage ./python-modules/dbus-fast { }; + +# dbus-next = callPackage ./python-modules/dbus-next { }; + +# dbus-python = callPackage ./python-modules/dbus-python { +# inherit (pkgs) dbus; +# }; + +# dbus-python-client-gen = callPackage ./python-modules/dbus-python-client-gen { }; + +# dbus-signature-pyparsing = callPackage ./python-modules/dbus-signature-pyparsing { }; + +# dbutils = callPackage ./python-modules/dbutils { }; + +# db-dtypes = callPackage ./python-modules/db-dtypes { }; + +# dcmstack = callPackage ./python-modules/dcmstack { }; + +# dctorch = callPackage ./python-modules/dctorch { }; + +# ddt = callPackage ./python-modules/ddt { }; + +# deal = callPackage ./python-modules/deal { }; + +# deal-solver = callPackage ./python-modules/deal-solver { }; + +# deap = callPackage ./python-modules/deap { }; + +# debian = callPackage ./python-modules/debian { }; + +# debianbts = callPackage ./python-modules/debianbts { }; + +# debian-inspector = callPackage ./python-modules/debian-inspector { }; + +# debtcollector = callPackage ./python-modules/debtcollector { }; + +# debts = callPackage ./python-modules/debts { }; + +# debugpy = callPackage ./python-modules/debugpy { }; + +# debuglater = callPackage ./python-modules/debuglater { }; + +# decli = callPackage ./python-modules/decli { }; + +# decorator = callPackage ./python-modules/decorator { }; + +# decopatch = callPackage ./python-modules/decopatch { }; + +# deebot-client = callPackage ./python-modules/deebot-client { }; + +# deemix = callPackage ./python-modules/deemix { }; + +# deep-chainmap = callPackage ./python-modules/deep-chainmap { }; + +# deepdiff = callPackage ./python-modules/deepdiff { }; + +# deepdish = callPackage ./python-modules/deepdish { }; + +# deepl = callPackage ./python-modules/deepl { }; + +# deepmerge = callPackage ./python-modules/deepmerge { }; + +# deeptoolsintervals = callPackage ./python-modules/deeptoolsintervals { }; + +# deepwave = callPackage ./python-modules/deepwave { }; + +# deep-translator = callPackage ./python-modules/deep-translator { }; + +# deezer-py = callPackage ./python-modules/deezer-py { }; + +# deezer-python = callPackage ./python-modules/deezer-python { }; + +# defang = callPackage ./python-modules/defang { }; + +# defcon = callPackage ./python-modules/defcon { }; + +# deform = callPackage ./python-modules/deform { }; + +# defusedcsv = callPackage ./python-modules/defusedcsv { }; + +# defusedxml = callPackage ./python-modules/defusedxml { }; + +# dehinter = callPackage ./python-modules/dehinter { }; + +# deid = callPackage ./python-modules/deid { }; + +# dek = callPackage ./python-modules/dek { }; + +# delegator-py = callPackage ./python-modules/delegator-py { }; + +# delorean = callPackage ./python-modules/delorean { }; + +# deltachat = callPackage ./python-modules/deltachat { }; + +# deluge-client = callPackage ./python-modules/deluge-client { }; + +# demes = callPackage ./python-modules/demes { }; + +# demesdraw = callPackage ./python-modules/demesdraw { }; + +# demetriek = callPackage ./python-modules/demetriek { }; + +# demjson3 = callPackage ./python-modules/demjson3 { }; + +# demoji = callPackage ./python-modules/demoji { }; + +# dendropy = callPackage ./python-modules/dendropy { }; + +# denonavr = callPackage ./python-modules/denonavr { }; + +# dep-logic = callPackage ./python-modules/dep-logic { }; + +# dependency-injector = callPackage ./python-modules/dependency-injector { }; + +# deploykit = callPackage ./python-modules/deploykit { }; + +# deprecat = callPackage ./python-modules/deprecat { }; + +# deprecated = callPackage ./python-modules/deprecated { }; + +# deprecation = callPackage ./python-modules/deprecation { }; + +# derpconf = callPackage ./python-modules/derpconf { }; + +# desktop-entry-lib = callPackage ./python-modules/desktop-entry-lib { }; + +# desktop-notifier = callPackage ./python-modules/desktop-notifier { }; + +# detect-secrets = callPackage ./python-modules/detect-secrets { }; + +# detectron2 = callPackage ./python-modules/detectron2 { }; + +# devialet = callPackage ./python-modules/devialet { }; + +# devito = callPackage ./python-modules/devito { }; + +# devolo-home-control-api = callPackage ./python-modules/devolo-home-control-api { }; + +# devolo-plc-api = callPackage ./python-modules/devolo-plc-api { }; + +# devpi-common = callPackage ./python-modules/devpi-common { }; + +# devtools = callPackage ./python-modules/devtools { }; + +# dfdiskcache = callPackage ./python-modules/dfdiskcache { }; + +# diagrams = callPackage ./python-modules/diagrams { }; + +# diceware = callPackage ./python-modules/diceware { }; + +# dicom2nifti = callPackage ./python-modules/dicom2nifti { }; + +# dicom-numpy = callPackage ./python-modules/dicom-numpy { }; + +# dicomweb-client = callPackage ./python-modules/dicomweb-client { }; + +# dict2xml = callPackage ./python-modules/dict2xml { }; + +# dictdiffer = callPackage ./python-modules/dictdiffer { }; + +# dictionaries = callPackage ./python-modules/dictionaries { }; + +# dicttoxml = callPackage ./python-modules/dicttoxml { }; + +# dicttoxml2 = callPackage ./python-modules/dicttoxml2 { }; + +# diff-cover = callPackage ./python-modules/diff-cover { }; + +# diff-match-patch = callPackage ./python-modules/diff-match-patch { }; + +# diffimg = callPackage ./python-modules/diffimg { }; + +# diffsync = callPackage ./python-modules/diffsync { }; + +# diffusers = callPackage ./python-modules/diffusers { }; + +# digi-xbee = callPackage ./python-modules/digi-xbee { }; + +# dill = callPackage ./python-modules/dill { }; + +# dingz = callPackage ./python-modules/dingz { }; + +# dinghy = callPackage ./python-modules/dinghy { }; + +# diofant = callPackage ./python-modules/diofant { }; + +# dipy = callPackage ./python-modules/dipy { }; + +# directv = callPackage ./python-modules/directv { }; + +# dirigera = callPackage ./python-modules/dirigera { }; + +# dirty-equals = callPackage ./python-modules/dirty-equals { }; + +# dirtyjson = callPackage ./python-modules/dirtyjson { }; + +# discid = callPackage ./python-modules/discid { }; + +# discogs-client = callPackage ./python-modules/discogs-client { }; + +# discordpy = callPackage ./python-modules/discordpy { }; + +# discovery30303 = callPackage ./python-modules/discovery30303 { }; + +# diskcache = callPackage ./python-modules/diskcache { }; + +# dissect = callPackage ./python-modules/dissect { }; + +# dissect-btrfs = callPackage ./python-modules/dissect-btrfs { }; + +# dissect-cim = callPackage ./python-modules/dissect-cim { }; + +# dissect-clfs = callPackage ./python-modules/dissect-clfs { }; + +# dissect-cobaltstrike = callPackage ./python-modules/dissect-cobaltstrike { }; + +# dissect-cstruct = callPackage ./python-modules/dissect-cstruct { }; + +# dissect-fat = callPackage ./python-modules/dissect-fat { }; + +# dissect-ffs = callPackage ./python-modules/dissect-ffs { }; + +# dissect-esedb = callPackage ./python-modules/dissect-esedb { }; + +# dissect-etl = callPackage ./python-modules/dissect-etl { }; + +# dissect-eventlog = callPackage ./python-modules/dissect-eventlog { }; + +# dissect-evidence = callPackage ./python-modules/dissect-evidence { }; + +# dissect-executable = callPackage ./python-modules/dissect-executable { }; + +# dissect-extfs = callPackage ./python-modules/dissect-extfs { }; + +# dissect-hypervisor = callPackage ./python-modules/dissect-hypervisor { }; + +# dissect-jffs = callPackage ./python-modules/dissect-jffs { }; + +# dissect-ntfs = callPackage ./python-modules/dissect-ntfs { }; + +# dissect-ole = callPackage ./python-modules/dissect-ole { }; + +# dissect-regf = callPackage ./python-modules/dissect-regf { }; + +# dissect-shellitem = callPackage ./python-modules/dissect-shellitem { }; + +# dissect-squashfs = callPackage ./python-modules/dissect-squashfs { }; + +# dissect-sql = callPackage ./python-modules/dissect-sql { }; + +# dissect-target = callPackage ./python-modules/dissect-target { }; + +# dissect-thumbcache = callPackage ./python-modules/dissect-thumbcache { }; + +# dissect-util = callPackage ./python-modules/dissect-util { }; + +# dissect-vmfs = callPackage ./python-modules/dissect-vmfs { }; + +# dissect-volume = callPackage ./python-modules/dissect-volume { }; + +# dissect-xfs = callPackage ./python-modules/dissect-xfs { }; + +# dissononce = callPackage ./python-modules/dissononce { }; + +# distlib = callPackage ./python-modules/distlib { }; + +# distorm3 = callPackage ./python-modules/distorm3 { }; + +# distrax = callPackage ./python-modules/distrax { }; + +# distributed = callPackage ./python-modules/distributed { }; + +# distro = callPackage ./python-modules/distro { }; + +# distutils-extra = callPackage ./python-modules/distutils-extra { }; + +# # LTS in extended support phase +# django_3 = callPackage ./python-modules/django/3.nix { }; + +# # LTS with mainsteam support +# django = self.django_4; +# django_4 = callPackage ./python-modules/django/4.nix { }; + +# # Pre-release +# django_5 = callPackage ./python-modules/django/5.nix { }; + +# django-admin-datta = callPackage ./python-modules/django-admin-datta { }; + +# django-admin-sortable2 = callPackage ./python-modules/django-admin-sortable2 { }; + +# django-allauth = callPackage ./python-modules/django-allauth { }; + +# django-allauth-2fa = callPackage ./python-modules/django-allauth-2fa { }; + +# django-anymail = callPackage ./python-modules/django-anymail { }; + +# django-annoying = callPackage ./python-modules/django-annoying { }; + +# django-appconf = callPackage ./python-modules/django-appconf { }; + +# django-auditlog = callPackage ./python-modules/django-auditlog { }; + +# django-auth-ldap = callPackage ./python-modules/django-auth-ldap { }; + +# django-autocomplete-light = callPackage ./python-modules/django-autocomplete-light { }; + +# django-bootstrap3 = callPackage ./python-modules/django-bootstrap3 { }; + +# django-bootstrap4 = callPackage ./python-modules/django-bootstrap4 { }; + +# django-bootstrap5 = callPackage ./python-modules/django-bootstrap5 { }; + +# django-cachalot = callPackage ./python-modules/django-cachalot { }; + +# django-cache-url = callPackage ./python-modules/django-cache-url { }; + +# django-cacheops = callPackage ./python-modules/django-cacheops { }; + +# django-celery-beat = callPackage ./python-modules/django-celery-beat { }; + +# django-celery-email = callPackage ./python-modules/django-celery-email { }; + +# django-celery-results = callPackage ./python-modules/django-celery-results { }; + +# django-ckeditor = callPackage ./python-modules/django-ckeditor { }; + +# django-classy-tags = callPackage ./python-modules/django-classy-tags { }; + +# django-cleanup = callPackage ./python-modules/django-cleanup { }; + +# django-colorful = callPackage ./python-modules/django-colorful { }; + +# django-compressor = callPackage ./python-modules/django-compressor { }; + +# django-compression-middleware = callPackage ./python-modules/django-compression-middleware { }; + +# django-configurations = callPackage ./python-modules/django-configurations { }; + +# django-context-decorator = callPackage ./python-modules/django-context-decorator { }; + +# django-contrib-comments = callPackage ./python-modules/django-contrib-comments { }; + +# django-cors-headers = callPackage ./python-modules/django-cors-headers { }; + +# django-countries = callPackage ./python-modules/django-countries { }; + +# django-crispy-bootstrap4 = callPackage ./python-modules/django-crispy-bootstrap4 { }; + +# django-crispy-bootstrap5 = callPackage ./python-modules/django-crispy-bootstrap5 { }; + +# django-crispy-forms = callPackage ./python-modules/django-crispy-forms { }; + +# django-crontab = callPackage ./python-modules/django-crontab { }; + +# django-cryptography = callPackage ./python-modules/django-cryptography { }; + +# django-csp = callPackage ./python-modules/django-csp { }; + +# django-currentuser = callPackage ./python-modules/django-currentuser { }; + +# django-debug-toolbar = callPackage ./python-modules/django-debug-toolbar { }; + +# django-dynamic-preferences = callPackage ./python-modules/django-dynamic-preferences { }; + +# django-encrypted-model-fields = callPackage ./python-modules/django-encrypted-model-fields { }; + +# django-environ = callPackage ./python-modules/django-environ { }; + +# django-extensions = callPackage ./python-modules/django-extensions { }; + +# django-filter = callPackage ./python-modules/django-filter { }; + +# django-formtools = callPackage ./python-modules/django-formtools { }; + +# django-formset-js-improved = callPackage ./python-modules/django-formset-js-improved { }; + +# django-graphiql-debug-toolbar = callPackage ./python-modules/django-graphiql-debug-toolbar { }; + +# django-gravatar2 = callPackage ./python-modules/django-gravatar2 { }; + +# django-google-analytics-app = callPackage ./python-modules/django-google-analytics-app { }; + +# django-guardian = callPackage ./python-modules/django-guardian { }; + +# django-haystack = callPackage ./python-modules/django-haystack { }; + +# django-hcaptcha = callPackage ./python-modules/django-hcaptcha { }; + +# django-health-check = callPackage ./python-modules/django-health-check { }; + +# django-hierarkey = callPackage ./python-modules/django-hierarkey { }; + +# django-hijack = callPackage ./python-modules/django-hijack { }; + +# django-i18nfield = callPackage ./python-modules/django-i18nfield { }; + +# django-import-export = callPackage ./python-modules/django-import-export { }; + +# django-ipware = callPackage ./python-modules/django-ipware { }; + +# django-jinja = callPackage ./python-modules/django-jinja2 { }; + +# django-jquery-js = callPackage ./python-modules/django-jquery-js { }; + +# django-js-asset = callPackage ./python-modules/django-js-asset { }; + +# django-js-reverse = callPackage ./python-modules/django-js-reverse { }; + +# django-libsass = callPackage ./python-modules/django-libsass { }; + +# django-leaflet = callPackage ./python-modules/django-leaflet { }; + +# django-logentry-admin = callPackage ./python-modules/django-logentry-admin { }; + +# django-login-required-middleware = callPackage ./python-modules/django-login-required-middleware { }; + +# django-localflavor = callPackage ./python-modules/django-localflavor { }; + +# django-mailman3 = callPackage ./python-modules/django-mailman3 { }; + +# django-markup = callPackage ./python-modules/django-markup { }; + +# django-markdownx = callPackage ./python-modules/django-markdownx { }; + +# django-model-utils = callPackage ./python-modules/django-model-utils { }; + +# django-modelcluster = callPackage ./python-modules/django-modelcluster { }; + +# django-modeltranslation = callPackage ./python-modules/django-modeltranslation { }; + +# django-multiselectfield = callPackage ./python-modules/django-multiselectfield { }; + +# django-maintenance-mode = callPackage ./python-modules/django-maintenance-mode { }; + +# django-mdeditor = callPackage ./python-modules/django-mdeditor { }; + +# django-mptt = callPackage ./python-modules/django-mptt { }; + +# django-mysql = callPackage ./python-modules/django-mysql { }; + +# django-ninja = callPackage ./python-modules/django-ninja { }; + +# django-nose = callPackage ./python-modules/django-nose { }; + +# django-oauth-toolkit = callPackage ./python-modules/django-oauth-toolkit { }; + +# django-otp = callPackage ./python-modules/django-otp { }; + +# django-paintstore = callPackage ./python-modules/django-paintstore { }; + +# django-parler = callPackage ./python-modules/django-parler { }; + +# django-pattern-library = callPackage ./python-modules/django-pattern-library { }; + +# django-payments = callPackage ./python-modules/django-payments { }; + +# django-pglocks = callPackage ./python-modules/django-pglocks { }; + +# django-phonenumber-field = callPackage ./python-modules/django-phonenumber-field { }; + +# django-picklefield = callPackage ./python-modules/django-picklefield { }; + +# django-polymorphic = callPackage ./python-modules/django-polymorphic { }; + +# django-postgresql-netfields = callPackage ./python-modules/django-postgresql-netfields { }; + +# django-prometheus = callPackage ./python-modules/django-prometheus { }; + +# django-pwa = callPackage ./python-modules/django-pwa { }; + +# django-q = callPackage ./python-modules/django-q { }; + +# django-scheduler = callPackage ./python-modules/django-scheduler { }; + +# django-scim2 = callPackage ./python-modules/django-scim2 { }; + +# django-shortuuidfield = callPackage ./python-modules/django-shortuuidfield { }; + +# django-scopes = callPackage ./python-modules/django-scopes { }; + +# djangoql = callPackage ./python-modules/djangoql { }; + +# django-ranged-response = callPackage ./python-modules/django-ranged-response { }; + +# django-raster = callPackage ./python-modules/django-raster { }; + +# django-redis = callPackage ./python-modules/django-redis { }; + +# django-rest-auth = callPackage ./python-modules/django-rest-auth { }; + +# django-rest-polymorphic = callPackage ./python-modules/django-rest-polymorphic { }; + +# django-rest-registration = callPackage ./python-modules/django-rest-registration { }; + +# django-rosetta = callPackage ./python-modules/django-rosetta { }; + +# django-rq = callPackage ./python-modules/django-rq { }; + +# djangorestframework = callPackage ./python-modules/djangorestframework { }; + +# djangorestframework-dataclasses = callPackage ./python-modules/djangorestframework-dataclasses { }; + +# djangorestframework-camel-case = callPackage ./python-modules/djangorestframework-camel-case { }; + +# djangorestframework-guardian = callPackage ./python-modules/djangorestframework-guardian { }; + +# djangorestframework-guardian2 = callPackage ./python-modules/djangorestframework-guardian2 { }; + +# djangorestframework-recursive = callPackage ./python-modules/djangorestframework-recursive { }; + +# djangorestframework-simplejwt = callPackage ./python-modules/djangorestframework-simplejwt { }; + +# djangorestframework-stubs = callPackage ./python-modules/djangorestframework-stubs { }; + +# django-reversion = callPackage ./python-modules/django-reversion { }; + +# django-sekizai = callPackage ./python-modules/django-sekizai { }; + +# django-sesame = callPackage ./python-modules/django-sesame { }; + +# django-silk = callPackage ./python-modules/django-silk { }; + +# django-simple-captcha = callPackage ./python-modules/django-simple-captcha { }; + +# django-simple-history = callPackage ./python-modules/django-simple-history { }; + +# django-sites = callPackage ./python-modules/django-sites { }; + +# django-sr = callPackage ./python-modules/django-sr { }; + +# django-statici18n = callPackage ./python-modules/django-statici18n { }; + +# django-storages = callPackage ./python-modules/django-storages { }; + +# django-stubs = callPackage ./python-modules/django-stubs { }; + +# django-stubs-ext = callPackage ./python-modules/django-stubs-ext { }; + +# django-tables2 = callPackage ./python-modules/django-tables2 { }; + +# django-tagging = callPackage ./python-modules/django-tagging { }; + +# django-taggit = callPackage ./python-modules/django-taggit { }; + +# django-tastypie = callPackage ./python-modules/django-tastypie { }; + +# django-timezone-field = callPackage ./python-modules/django-timezone-field { }; + +# django-treebeard = callPackage ./python-modules/django-treebeard { }; + +# django-two-factor-auth = callPackage ./python-modules/django-two-factor-auth { }; + +# django-types = callPackage ./python-modules/django-types { }; + +# django-versatileimagefield = callPackage ./python-modules/django-versatileimagefield { }; + +# django-vite = callPackage ./python-modules/django-vite { }; + +# django-webpack-loader = callPackage ./python-modules/django-webpack-loader { }; + +# django-webpush = callPackage ./python-modules/django-webpush { }; + +# django-widget-tweaks = callPackage ./python-modules/django-widget-tweaks { }; + +# dj-database-url = callPackage ./python-modules/dj-database-url { }; + +# dj-email-url = callPackage ./python-modules/dj-email-url { }; + +# djmail = callPackage ./python-modules/djmail { }; + +# dj-rest-auth = callPackage ./python-modules/dj-rest-auth { }; + +# dj-search-url = callPackage ./python-modules/dj-search-url { }; + +# dj-static = callPackage ./python-modules/dj-static { }; + +# dkimpy = callPackage ./python-modules/dkimpy { }; + +# dlib = callPackage ./python-modules/dlib { +# inherit (pkgs) dlib; +# }; + +# dlinfo = callPackage ./python-modules/dlinfo { }; + +# dllogger = callPackage ./python-modules/dllogger { }; + +# dlms-cosem = callPackage ./python-modules/dlms-cosem { }; + +# dlx = callPackage ./python-modules/dlx { }; + +# dmenu-python = callPackage ./python-modules/dmenu { }; + +# dm-env = callPackage ./python-modules/dm-env { }; + +# dm-haiku = callPackage ./python-modules/dm-haiku { }; + +# dm-sonnet = callPackage ./python-modules/dm-sonnet { }; + +# dm-tree = callPackage ./python-modules/dm-tree { +# abseil-cpp = pkgs.abseil-cpp_202103.override { +# cxxStandard = "14"; +# }; +# }; + +# dnachisel = callPackage ./python-modules/dnachisel { }; + +# dnf-plugins-core = callPackage ./python-modules/dnf-plugins-core { }; + +# dnf4 = callPackage ./python-modules/dnf4 { }; + +# dnfile = callPackage ./python-modules/dnfile { }; + +# dnslib = callPackage ./python-modules/dnslib { }; + +# dnspython = callPackage ./python-modules/dnspython { }; + +# dns-lexicon = callPackage ./python-modules/dns-lexicon { }; + +# doc8 = callPackage ./python-modules/doc8 { }; + +# docformatter = callPackage ./python-modules/docformatter { }; + +# docker = callPackage ./python-modules/docker { }; + +# dockerfile-parse = callPackage ./python-modules/dockerfile-parse { }; + +# dockerpty = callPackage ./python-modules/dockerpty { }; + +# docker-pycreds = callPackage ./python-modules/docker-pycreds { }; + +# docker-py = callPackage ./python-modules/docker-py { }; + +# dockerspawner = callPackage ./python-modules/dockerspawner { }; + +# docloud = callPackage ./python-modules/docloud { }; + +# docstr-coverage = callPackage ./python-modules/docstr-coverage { }; + +# docstring-to-markdown = callPackage ./python-modules/docstring-to-markdown { }; + +# docstring-parser = callPackage ./python-modules/docstring-parser { }; + +# docopt = callPackage ./python-modules/docopt { }; + +# docopt-ng = callPackage ./python-modules/docopt-ng { }; + +# docplex = callPackage ./python-modules/docplex { }; + +# docrep = callPackage ./python-modules/docrep { }; + +# doctest-ignore-unicode = callPackage ./python-modules/doctest-ignore-unicode { }; + + docutils = callPackage ./python-modules/docutils { }; + +# docx2python = callPackage ./python-modules/docx2python { }; + +# docx2txt = callPackage ./python-modules/docx2txt { }; + +# dodgy = callPackage ./python-modules/dodgy { }; + +# dogpile-cache = callPackage ./python-modules/dogpile-cache { }; + +# dogtag-pki = callPackage ./python-modules/dogtag-pki { }; + +# dogtail = callPackage ./python-modules/dogtail { }; + +# doit = callPackage ./python-modules/doit { }; + +# doit-py = callPackage ./python-modules/doit-py { }; + +# dokuwiki = callPackage ./python-modules/dokuwiki { }; + +# domeneshop = callPackage ./python-modules/domeneshop { }; + +# dominate = callPackage ./python-modules/dominate { }; + +# doorbirdpy = callPackage ./python-modules/doorbirdpy { }; + +# dopy = callPackage ./python-modules/dopy { }; + +# dotty-dict = callPackage ./python-modules/dotty-dict { }; + +# dot2tex = callPackage ./python-modules/dot2tex { +# inherit (pkgs) graphviz; +# }; + +# dotwiz = callPackage ./python-modules/dotwiz { }; + +# dotmap = callPackage ./python-modules/dotmap { }; + +# downloader-cli = callPackage ./python-modules/downloader-cli { }; + +# dparse = callPackage ./python-modules/dparse { }; + +# dparse2 = callPackage ./python-modules/dparse2 { }; + +# dpath = callPackage ./python-modules/dpath { }; + +# dpcontracts = callPackage ./python-modules/dpcontracts { }; + +# dpkt = callPackage ./python-modules/dpkt { }; + +# dploot = callPackage ./python-modules/dploot { }; + +# draftjs-exporter = callPackage ./python-modules/draftjs-exporter { }; + +# dragonfly = callPackage ./python-modules/dragonfly { }; + +# dramatiq = callPackage ./python-modules/dramatiq { }; + +# drawille = callPackage ./python-modules/drawille { }; + +# drawilleplot = callPackage ./python-modules/drawilleplot { }; + +# dremel3dpy = callPackage ./python-modules/dremel3dpy { }; + +# drf-jwt = callPackage ./python-modules/drf-jwt { }; + +# drf-nested-routers = callPackage ./python-modules/drf-nested-routers { }; + +# drf-spectacular = callPackage ./python-modules/drf-spectacular { }; + +# drf-spectacular-sidecar = callPackage ./python-modules/drf-spectacular-sidecar { }; + +# drf-ujson2 = callPackage ./python-modules/drf-ujson2 { }; + +# drf-writable-nested = callPackage ./python-modules/drf-writable-nested { }; + +# drf-yasg = callPackage ./python-modules/drf-yasg { }; + +# drivelib = callPackage ./python-modules/drivelib { }; + +# drms = callPackage ./python-modules/drms { }; + +# dronecan = callPackage ./python-modules/dronecan { }; + +# dropbox = callPackage ./python-modules/dropbox { }; + +# dropmqttapi = callPackage ./python-modules/dropmqttapi { }; + +# ds-store = callPackage ./python-modules/ds-store { }; + +# ds4drv = callPackage ./python-modules/ds4drv { }; + +# dsinternals = callPackage ./python-modules/dsinternals { }; + +# dsmr-parser = callPackage ./python-modules/dsmr-parser { }; + +# dsnap = callPackage ./python-modules/dsnap { }; + +# dtlssocket = callPackage ./python-modules/dtlssocket { }; + +# dtschema = callPackage ./python-modules/dtschema { }; + +# dtw-python = callPackage ./python-modules/dtw-python { }; + +# ducc0 = callPackage ./python-modules/ducc0 { }; + +# duckdb = callPackage ./python-modules/duckdb { +# inherit (pkgs) duckdb; +# }; + +# duckdb-engine = callPackage ./python-modules/duckdb-engine { }; + +# duckduckgo-search = callPackage ./python-modules/duckduckgo-search { }; + +# duct-py = callPackage ./python-modules/duct-py { }; + +# duden = callPackage ./python-modules/duden { }; + +# duecredit = callPackage ./python-modules/duecredit { }; + +# duet = callPackage ./python-modules/duet { }; + +# dufte = callPackage ./python-modules/dufte { }; + +# dugong = callPackage ./python-modules/dugong { }; + +# dulwich = callPackage ./python-modules/dulwich { +# inherit (pkgs) gnupg; +# }; + +# dunamai = callPackage ./python-modules/dunamai { }; + +# dungeon-eos = callPackage ./python-modules/dungeon-eos { }; + +# duo-client = callPackage ./python-modules/duo-client { }; + +# durus = callPackage ./python-modules/durus { }; + +# dvc = callPackage ./python-modules/dvc { }; + +# dvc-azure = callPackage ./python-modules/dvc-azure { }; + +# dvc-data = callPackage ./python-modules/dvc-data { }; + +# dvc-gdrive = callPackage ./python-modules/dvc-gdrive { }; + +# dvc-gs = callPackage ./python-modules/dvc-gs { }; + +# dvc-hdfs = callPackage ./python-modules/dvc-hdfs { }; + +# dvc-http = callPackage ./python-modules/dvc-http { }; + +# dvc-objects = callPackage ./python-modules/dvc-objects { }; + +# dvc-render = callPackage ./python-modules/dvc-render { }; + +# dvc-s3 = callPackage ./python-modules/dvc-s3 { }; + +# dvc-ssh = callPackage ./python-modules/dvc-ssh { }; + +# dvc-studio-client = callPackage ./python-modules/dvc-studio-client { }; + +# dvc-task = callPackage ./python-modules/dvc-task { }; + +# dvclive = callPackage ./python-modules/dvclive { }; + +# dwdwfsapi = callPackage ./python-modules/dwdwfsapi { }; + +# dyn = callPackage ./python-modules/dyn { }; + +# dynalite-devices = callPackage ./python-modules/dynalite-devices { }; + +# dynalite-panel = callPackage ./python-modules/dynalite-panel { }; + +# dynd = callPackage ./python-modules/dynd { }; + +# dsl2html = callPackage ./python-modules/dsl2html { }; + +# e3-core = callPackage ./python-modules/e3-core { }; + +# e3-testsuite = callPackage ./python-modules/e3-testsuite { }; + +# eagle100 = callPackage ./python-modules/eagle100 { }; + +# easydict = callPackage ./python-modules/easydict { }; + +# easyenergy = callPackage ./python-modules/easyenergy { }; + +# easygui = callPackage ./python-modules/easygui { }; + +# easyocr = callPackage ./python-modules/easyocr { }; + +# easyprocess = callPackage ./python-modules/easyprocess { }; + +# easy-thumbnails = callPackage ./python-modules/easy-thumbnails { }; + +# easywatch = callPackage ./python-modules/easywatch { }; + +# ebaysdk = callPackage ./python-modules/ebaysdk { }; + +# ebcdic = callPackage ./python-modules/ebcdic { }; + +# ebooklib = callPackage ./python-modules/ebooklib { }; + +# ec2instanceconnectcli = callPackage ../tools/virtualization/ec2instanceconnectcli { }; + +# eccodes = toPythonModule (pkgs.eccodes.override { +# enablePython = true; +# pythonPackages = self; +# }); + +# ecdsa = callPackage ./python-modules/ecdsa { }; + +# echo = callPackage ./python-modules/echo { }; + +# ecoaliface = callPackage ./python-modules/ecoaliface { }; + +# ecos = callPackage ./python-modules/ecos { }; + +# ecpy = callPackage ./python-modules/ecpy { }; + +# ecs-logging = callPackage ./python-modules/ecs-logging { }; + +# ed25519 = callPackage ./python-modules/ed25519 { }; + +# ed25519-blake2b = callPackage ./python-modules/ed25519-blake2b { }; + +# edalize = callPackage ./python-modules/edalize { }; + + editables = callPackage ./python-modules/editables { }; + +# editdistance = callPackage ./python-modules/editdistance { }; + +# editdistance-s = callPackage ./python-modules/editdistance-s { }; + +# editdistpy = callPackage ./python-modules/editdistpy { }; + +# editor = callPackage ./python-modules/editor { }; + +# editorconfig = callPackage ./python-modules/editorconfig { }; + +# edk2-pytool-library = callPackage ./python-modules/edk2-pytool-library { }; + +# edlib = callPackage ./python-modules/edlib { +# inherit (pkgs) edlib; +# }; + +# eduvpn-common = callPackage ./python-modules/eduvpn-common { }; + +# edward = callPackage ./python-modules/edward { }; + +# effdet = callPackage ./python-modules/effdet { }; + +# effect = callPackage ./python-modules/effect { }; + +# eggdeps = callPackage ./python-modules/eggdeps { }; + +# eigenpy = toPythonModule (callPackage ./python-modules/eigenpy { }); + +# einops = callPackage ./python-modules/einops { }; + +# eiswarnung = callPackage ./python-modules/eiswarnung { }; + +# elgato = callPackage ./python-modules/elgato { }; + +# elkm1-lib = callPackage ./python-modules/elkm1-lib { }; + +# elastic-apm = callPackage ./python-modules/elastic-apm { }; + +# elastic-transport = callPackage ./python-modules/elastic-transport { }; + +# elasticsearch = callPackage ./python-modules/elasticsearch { }; + +# elasticsearch8 = callPackage ./python-modules/elasticsearch8 { }; + +# elasticsearch-dsl = callPackage ./python-modules/elasticsearch-dsl { }; + +# elasticsearchdsl = self.elasticsearch-dsl; + +# elegy = callPackage ./python-modules/elegy { }; + +# elementpath = callPackage ./python-modules/elementpath { }; + +# elevate = callPackage ./python-modules/elevate { }; + +# eliot = callPackage ./python-modules/eliot { }; + +# eliqonline = callPackage ./python-modules/eliqonline { }; + +# elmax = callPackage ./python-modules/elmax { }; + +# elmax-api = callPackage ./python-modules/elmax-api { }; + +# emailthreads = callPackage ./python-modules/emailthreads { }; + +# email-validator = callPackage ./python-modules/email-validator { }; + +# embedding-reader = callPackage ./python-modules/embedding-reader { }; + +# embrace = callPackage ./python-modules/embrace { }; + +# emborg = callPackage ./python-modules/emborg { }; + +# emcee = callPackage ./python-modules/emcee { }; + +# emv = callPackage ./python-modules/emv { }; + +# emoji = callPackage ./python-modules/emoji { }; + +# empty-files = callPackage ./python-modules/empty-files { }; + +# empy = callPackage ./python-modules/empy { }; + +# emulated-roku = callPackage ./python-modules/emulated-roku { }; + +# enaml = callPackage ./python-modules/enaml { }; + +# enamlx = callPackage ./python-modules/enamlx { }; + +# encodec = callPackage ./python-modules/encodec { }; + +# energyflip-client = callPackage ./python-modules/energyflip-client { }; + +# energyflow = callPackage ./python-modules/energyflow { }; + +# energyzero = callPackage ./python-modules/energyzero { }; + +# enlighten = callPackage ./python-modules/enlighten { }; + +# enocean = callPackage ./python-modules/enocean { }; + +# enochecker-core = callPackage ./python-modules/enochecker-core { }; + +# enrich = callPackage ./python-modules/enrich { }; + +# enterpriseattack = callPackage ./python-modules/enterpriseattack { }; + +# entrance = callPackage ./python-modules/entrance { +# routerFeatures = false; +# }; + +# entrance-with-router-features = callPackage ./python-modules/entrance { +# routerFeatures = true; +# }; + +# entry-points-txt = callPackage ./python-modules/entry-points-txt { }; + +# entrypoint2 = callPackage ./python-modules/entrypoint2 { }; + +# entrypoints = callPackage ./python-modules/entrypoints { }; + +# enturclient = callPackage ./python-modules/enturclient { }; + +# enum34 = callPackage ./python-modules/enum34 { }; + +# enum-compat = callPackage ./python-modules/enum-compat { }; + +# env-canada = callPackage ./python-modules/env-canada { }; + +# environmental-override = callPackage ./python-modules/environmental-override { }; + +# environs = callPackage ./python-modules/environs { }; + +# envisage = callPackage ./python-modules/envisage { }; + +# envs = callPackage ./python-modules/envs { }; + +# envoy-reader = callPackage ./python-modules/envoy-reader { }; + +# envoy-utils = callPackage ./python-modules/envoy-utils { }; + +# enzyme = callPackage ./python-modules/enzyme { }; + +# epc = callPackage ./python-modules/epc { }; + +# ephem = callPackage ./python-modules/ephem { }; + +# ephemeral-port-reserve = callPackage ./python-modules/ephemeral-port-reserve { }; + +# epion = callPackage ./python-modules/epion { }; + +# epitran = callPackage ./python-modules/epitran { }; + +# epson-projector = callPackage ./python-modules/epson-projector { }; + +# equinox = callPackage ./python-modules/equinox { }; + +# eradicate = callPackage ./python-modules/eradicate { }; + +# es-client = callPackage ./python-modules/es-client { }; + +# esig = callPackage ./python-modules/esig { }; + +# espeak-phonemizer = callPackage ./python-modules/espeak-phonemizer { }; + +# esphome-dashboard-api = callPackage ./python-modules/esphome-dashboard-api { }; + +# esprima = callPackage ./python-modules/esprima { }; + +# escapism = callPackage ./python-modules/escapism { }; + +# essentials = callPackage ./python-modules/essentials { }; + +# essentials-openapi = callPackage ./python-modules/essentials-openapi { }; + +# etcd = callPackage ./python-modules/etcd { }; + +# etcd3 = callPackage ./python-modules/etcd3 { +# inherit (pkgs) etcd; +# }; + +# ete3 = callPackage ./python-modules/ete3 { }; + +# etelemetry = callPackage ./python-modules/etelemetry { }; + +# etebase = callPackage ./python-modules/etebase { +# inherit (pkgs.darwin.apple_sdk.frameworks) Security; +# }; + +# etebase-server = callPackage ../servers/etebase { }; + +# eternalegypt = callPackage ./python-modules/eternalegypt { }; + +# etesync = callPackage ./python-modules/etesync { }; + +# eth-abi = callPackage ./python-modules/eth-abi { }; + +# eth-account = callPackage ./python-modules/eth-account { }; + +# eth-hash = callPackage ./python-modules/eth-hash { }; + +# eth-keyfile = callPackage ./python-modules/eth-keyfile { }; + +# eth-keys = callPackage ./python-modules/eth-keys { }; + +# eth-rlp = callPackage ./python-modules/eth-rlp { }; + +# eth-typing = callPackage ./python-modules/eth-typing { }; + +# eth-utils = callPackage ./python-modules/eth-utils { }; + +# etils = callPackage ./python-modules/etils { }; + +# etuples = callPackage ./python-modules/etuples { }; + +# et-xmlfile = callPackage ./python-modules/et-xmlfile { }; + +# euclid3 = callPackage ./python-modules/euclid3 { }; + +# eufylife-ble-client = callPackage ./python-modules/eufylife-ble-client { }; + +# eval-type-backport = callPackage ./python-modules/eval-type-backport { }; + +# evaluate = callPackage ./python-modules/evaluate { }; + +# evdev = callPackage ./python-modules/evdev { }; + +# eve = callPackage ./python-modules/eve { }; + +# eventkit = callPackage ./python-modules/eventkit { }; + +# eventlet = callPackage ./python-modules/eventlet { }; + +# events = callPackage ./python-modules/events { }; + +# evernote = callPackage ./python-modules/evernote { }; + +# evohome-async = callPackage ./python-modules/evohome-async { }; + +# evtx = callPackage ./python-modules/evtx { }; + +# ewmh = callPackage ./python-modules/ewmh { }; + +# example-robot-data = toPythonModule (pkgs.example-robot-data.override { +# pythonSupport = true; +# python3Packages = self; +# }); + +# exdown = callPackage ./python-modules/exdown { }; + + exceptiongroup = callPackage ./python-modules/exceptiongroup { }; + +# exchangelib = callPackage ./python-modules/exchangelib { }; + +# execnb = callPackage ./python-modules/execnb { }; + + execnet = callPackage ./python-modules/execnet { }; + +# executing = callPackage ./python-modules/executing { }; + +# executor = callPackage ./python-modules/executor { }; + +# exif = callPackage ./python-modules/exif { }; + +# exifread = callPackage ./python-modules/exifread { }; + +# expandvars = callPackage ./python-modules/expandvars { }; + +# expects = callPackage ./python-modules/expects { }; + +# expecttest = callPackage ./python-modules/expecttest { }; + +# experiment-utilities = callPackage ./python-modules/experiment-utilities { }; + +# expiring-dict = callPackage ./python-modules/expiring-dict { }; + +# expiringdict = callPackage ./python-modules/expiringdict { }; + +# explorerscript = callPackage ./python-modules/explorerscript { }; + +# exrex = callPackage ./python-modules/exrex { }; + +# exitcode = callPackage ./python-modules/exitcode { }; + +# extract-msg = callPackage ./python-modules/extract-msg { }; + +# extractcode = callPackage ./python-modules/extractcode { }; + +# extractcode-7z = callPackage ./python-modules/extractcode/7z.nix { +# inherit (pkgs) p7zip; +# }; + +# extractcode-libarchive = callPackage ./python-modules/extractcode/libarchive.nix { +# inherit (pkgs) +# libarchive +# libb2 +# bzip2 +# expat +# lz4 +# xz +# zlib +# zstd; +# }; + +# extras = callPackage ./python-modules/extras { }; + +# extruct = callPackage ./python-modules/extruct { }; + +# eyed3 = callPackage ./python-modules/eyed3 { }; + +# ezdxf = callPackage ./python-modules/ezdxf { }; + +# ezyrb = callPackage ./python-modules/ezyrb { }; + +# f5-icontrol-rest = callPackage ./python-modules/f5-icontrol-rest { }; + +# f5-sdk = callPackage ./python-modules/f5-sdk { }; + +# f90nml = callPackage ./python-modules/f90nml { }; + +# fabric = callPackage ./python-modules/fabric { }; + +# faadelays = callPackage ./python-modules/faadelays { }; + +# fabulous = callPackage ./python-modules/fabulous { }; + +# facebook-sdk = callPackage ./python-modules/facebook-sdk { }; + +# face = callPackage ./python-modules/face { }; + +# facedancer = callPackage ./python-modules/facedancer { }; + +# face-recognition = callPackage ./python-modules/face-recognition { }; + +# facenet-pytorch = callPackage ./python-modules/facenet-pytorch { }; + +# face-recognition-models = callPackage ./python-modules/face-recognition/models.nix { }; + +# factory-boy = callPackage ./python-modules/factory-boy { }; + +# fairscale = callPackage ./python-modules/fairscale { }; + +# fairseq = callPackage ./python-modules/fairseq { }; + +# faiss = toPythonModule (pkgs.faiss.override { +# pythonSupport = true; +# pythonPackages = self; +# }); + +# fake-useragent = callPackage ./python-modules/fake-useragent { }; + +# faker = callPackage ./python-modules/faker { }; + +# fakeredis = callPackage ./python-modules/fakeredis { }; + +# falcon = callPackage ./python-modules/falcon { }; + +# faraday-agent-parameters-types = callPackage ./python-modules/faraday-agent-parameters-types { }; + +# faraday-plugins = callPackage ./python-modules/faraday-plugins { }; + +# farama-notifications = callPackage ./python-modules/farama-notifications { }; + +# farm-haystack = callPackage ./python-modules/farm-haystack { }; + +# fastai = callPackage ./python-modules/fastai { }; + +# fastapi = callPackage ./python-modules/fastapi { }; + +# fastapi-mail = callPackage ./python-modules/fastapi-mail { }; + +# fastapi-sso = callPackage ./python-modules/fastapi-sso { }; + +# fast-histogram = callPackage ./python-modules/fast-histogram { }; + +# fastavro = callPackage ./python-modules/fastavro { }; + +# fastbencode = callPackage ./python-modules/fastbencode { }; + +# fastcache = callPackage ./python-modules/fastcache { }; + +# fastcore = callPackage ./python-modules/fastcore { }; + +# fastdiff = callPackage ./python-modules/fastdiff { }; + +# fastdownload = callPackage ./python-modules/fastdownload { }; + +# fastdtw = callPackage ./python-modules/fastdtw { }; + +# fastecdsa = callPackage ./python-modules/fastecdsa { }; + +# fastembed = callPackage ./python-modules/fastembed { }; + +# fasteners = callPackage ./python-modules/fasteners { }; + +# fastentrypoints = callPackage ./python-modules/fastentrypoints { }; + +# faster-fifo = callPackage ./python-modules/faster-fifo { }; + +# faster-whisper = callPackage ./python-modules/faster-whisper { }; + +# fastimport = callPackage ./python-modules/fastimport { }; + +# fastjet = toPythonModule (pkgs.fastjet.override { +# withPython = true; +# inherit (self) python; +# }); + +# fastjsonschema = callPackage ./python-modules/fastjsonschema { }; + +# fastnlo-toolkit = toPythonModule (pkgs.fastnlo-toolkit.override { +# withPython = true; +# inherit (self) python; +# }); + +# fastnumbers = callPackage ./python-modules/fastnumbers { }; + +# fastpair = callPackage ./python-modules/fastpair { }; + +# fastparquet = callPackage ./python-modules/fastparquet { }; + +# fastpbkdf2 = callPackage ./python-modules/fastpbkdf2 { }; + +# fastprogress = callPackage ./python-modules/fastprogress { }; + +# fastrlock = callPackage ./python-modules/fastrlock { }; + +# fasttext = callPackage ./python-modules/fasttext { }; + +# fasttext-predict = callPackage ./python-modules/fasttext-predict { }; + +# faust-cchardet = callPackage ./python-modules/faust-cchardet { }; + +# favicon = callPackage ./python-modules/favicon { }; + + fb-re2 = callPackage ./python-modules/fb-re2 { }; + +# fe25519 = callPackage ./python-modules/fe25519 { }; + +# feedfinder2 = callPackage ./python-modules/feedfinder2 { }; + +# feedgen = callPackage ./python-modules/feedgen { }; + +# feedgenerator = callPackage ./python-modules/feedgenerator { +# inherit (pkgs) glibcLocales; +# }; + +# feedparser = callPackage ./python-modules/feedparser { }; + +# fenics = callPackage ./python-modules/fenics { +# hdf5 = pkgs.hdf5_1_10; +# }; + +# ffcv = callPackage ./python-modules/ffcv { }; + +# ffmpeg-python = callPackage ./python-modules/ffmpeg-python { }; + +# ffmpeg-progress-yield = callPackage ./python-modules/ffmpeg-progress-yield { }; + +# ffmpy = callPackage ./python-modules/ffmpy { }; + +# fhir-py = callPackage ./python-modules/fhir-py { }; + +# fiblary3-fork = callPackage ./python-modules/fiblary3-fork { }; + +# fido2 = callPackage ./python-modules/fido2 { }; + +# fields = callPackage ./python-modules/fields { }; + +# file-read-backwards = callPackage ./python-modules/file-read-backwards { }; + +# filebrowser-safe = callPackage ./python-modules/filebrowser-safe { }; + +# filebytes = callPackage ./python-modules/filebytes { }; + +# filecheck = callPackage ./python-modules/filecheck { }; + +# filedepot = callPackage ./python-modules/filedepot { }; + + filelock = callPackage ./python-modules/filelock { }; + +# filetype = callPackage ./python-modules/filetype { }; + +# filterpy = callPackage ./python-modules/filterpy { }; + +# finalfusion = callPackage ./python-modules/finalfusion { }; + +# findimports = callPackage ./python-modules/findimports { }; + +# find-libpython = callPackage ./python-modules/find-libpython { }; + +# findpython = callPackage ./python-modules/findpython { }; + +# fingerprints = callPackage ./python-modules/fingerprints { }; + +# finitude = callPackage ./python-modules/finitude { }; + +# fints = callPackage ./python-modules/fints { }; + +# finvizfinance = callPackage ./python-modules/finvizfinance { }; + +# fiona = callPackage ./python-modules/fiona { }; + +# fipy = callPackage ./python-modules/fipy { }; + +# fire = callPackage ./python-modules/fire { }; + +# firebase-messaging = callPackage ./python-modules/firebase-messaging { }; + +# fireflyalgorithm = callPackage ./python-modules/fireflyalgorithm { }; + +# firetv = callPackage ./python-modules/firetv { }; + +# first = callPackage ./python-modules/first { }; + +# fitbit = callPackage ./python-modules/fitbit { }; + +# fivem-api = callPackage ./python-modules/fivem-api { }; + +# fixerio = callPackage ./python-modules/fixerio { }; + +# fixtures = callPackage ./python-modules/fixtures { }; + +# fjaraskupan = callPackage ./python-modules/fjaraskupan { }; + +# flake8-blind-except = callPackage ./python-modules/flake8-blind-except { }; + +# flake8-bugbear = callPackage ./python-modules/flake8-bugbear { }; + +# flake8 = callPackage ./python-modules/flake8 { }; + +# flake8-length = callPackage ./python-modules/flake8-length { }; + +# flake8-debugger = callPackage ./python-modules/flake8-debugger { }; + +# flake8-docstrings = callPackage ./python-modules/flake8-docstrings { }; + +# flake8-future-import = callPackage ./python-modules/flake8-future-import { }; + +# flake8-import-order = callPackage ./python-modules/flake8-import-order { }; + +# flake8-polyfill = callPackage ./python-modules/flake8-polyfill { }; + +# flaky = callPackage ./python-modules/flaky { }; + +# flametree = callPackage ./python-modules/flametree { }; + +# flammkuchen = callPackage ./python-modules/flammkuchen { }; + +# flasgger = callPackage ./python-modules/flasgger { }; + +# flashtext = callPackage ./python-modules/flashtext { }; + +# flask-admin = callPackage ./python-modules/flask-admin { }; + +# flask-api = callPackage ./python-modules/flask-api { }; + +# flask-appbuilder = callPackage ./python-modules/flask-appbuilder { }; + +# flask-assets = callPackage ./python-modules/flask-assets { }; + +# flask-babel = callPackage ./python-modules/flask-babel { }; + +# flask-babelex = callPackage ./python-modules/flask-babelex { }; + +# flask-bcrypt = callPackage ./python-modules/flask-bcrypt { }; + +# flask-bootstrap = callPackage ./python-modules/flask-bootstrap { }; + +# flask-caching = callPackage ./python-modules/flask-caching { }; + +# flask = callPackage ./python-modules/flask { }; + +# flask-common = callPackage ./python-modules/flask-common { }; + +# flask-compress = callPackage ./python-modules/flask-compress { }; + +# flask-cors = callPackage ./python-modules/flask-cors { }; + +# flask-dramatiq = callPackage ./python-modules/flask-dramatiq { }; + +# flask-elastic = callPackage ./python-modules/flask-elastic { }; + +# flask-expects-json = callPackage ./python-modules/flask-expects-json { }; + +# flask-gravatar = callPackage ./python-modules/flask-gravatar { }; + +# flask-httpauth = callPackage ./python-modules/flask-httpauth { }; + +# flask-jwt-extended = callPackage ./python-modules/flask-jwt-extended { }; + +# flask-limiter = callPackage ./python-modules/flask-limiter { }; + +# flask-login = callPackage ./python-modules/flask-login { }; + +# flask-mail = callPackage ./python-modules/flask-mail { }; + +# flask-mailman = callPackage ./python-modules/flask-mailman { }; + +# flask-marshmallow = callPackage ./python-modules/flask-marshmallow { }; + +# flask-migrate = callPackage ./python-modules/flask-migrate { }; + +# flask-mongoengine = callPackage ./python-modules/flask-mongoengine { }; + +# flask-mysqldb = callPackage ./python-modules/flask-mysqldb { }; + +# flask-openid = callPackage ./python-modules/flask-openid { }; + +# flask-paginate = callPackage ./python-modules/flask-paginate { }; + +# flask-paranoid = callPackage ./python-modules/flask-paranoid { }; + +# flask-principal = callPackage ./python-modules/flask-principal { }; + +# flask-pymongo = callPackage ./python-modules/flask-pymongo { }; + +# flask-restful = callPackage ./python-modules/flask-restful { }; + +# flask-restx = callPackage ./python-modules/flask-restx { }; + +# flask-reverse-proxy-fix = callPackage ./python-modules/flask-reverse-proxy-fix { }; + +# flask-script = callPackage ./python-modules/flask-script { }; + +# flask-seasurf = callPackage ./python-modules/flask-seasurf { }; + +# flask-session = callPackage ./python-modules/flask-session { }; + +# flask-session-captcha = callPackage ./python-modules/flask-session-captcha { }; + +# flask-security-too = callPackage ./python-modules/flask-security-too { }; + +# flask-silk = callPackage ./python-modules/flask-silk { }; + +# flask-sock = callPackage ./python-modules/flask-sock { }; + +# flask-socketio = callPackage ./python-modules/flask-socketio { }; + +# flask-sockets = callPackage ./python-modules/flask-sockets { }; + +# flask-sqlalchemy = callPackage ./python-modules/flask-sqlalchemy { }; + +# flask-sslify = callPackage ./python-modules/flask-sslify { }; + +# flask-swagger = callPackage ./python-modules/flask-swagger { }; + +# flask-swagger-ui = callPackage ./python-modules/flask-swagger-ui { }; + +# flask-talisman = callPackage ./python-modules/flask-talisman { }; + +# flask-testing = callPackage ./python-modules/flask-testing { }; + +# flask-themes2 = callPackage ./python-modules/flask-themes2 { }; + +# flask-versioned = callPackage ./python-modules/flask-versioned { }; + +# flask-wtf = callPackage ./python-modules/flask-wtf { }; + +# flatbuffers = callPackage ./python-modules/flatbuffers { +# inherit (pkgs) flatbuffers; +# }; + +# flatdict = callPackage ./python-modules/flatdict { }; + +# flatten-dict = callPackage ./python-modules/flatten-dict { }; + +# flax = callPackage ./python-modules/flax { }; + +# fleep = callPackage ./python-modules/fleep { }; + +# flet = callPackage ./python-modules/flet { }; + +# flet-core = callPackage ./python-modules/flet-core { }; + +# flet-runtime = callPackage ./python-modules/flet-runtime { }; + +# flexmock = callPackage ./python-modules/flexmock { }; + +# flickrapi = callPackage ./python-modules/flickrapi { }; + +# flipr-api = callPackage ./python-modules/flipr-api { }; + + flit = callPackage ./python-modules/flit { }; + + flit-core = callPackage ./python-modules/flit-core { }; + +# flit-scm = callPackage ./python-modules/flit-scm { }; + +# floret = callPackage ./python-modules/floret { }; + +# flow-record = callPackage ./python-modules/flow-record { }; + +# flower = callPackage ./python-modules/flower { }; + +# flowlogs-reader = callPackage ./python-modules/flowlogs-reader { }; + +# fluent-logger = callPackage ./python-modules/fluent-logger { }; + +# flufl-bounce = callPackage ./python-modules/flufl/bounce.nix { }; + +# flufl-i18n = callPackage ./python-modules/flufl/i18n.nix { }; + +# flufl-lock = callPackage ./python-modules/flufl/lock.nix { }; + +# flux-led = callPackage ./python-modules/flux-led { }; + +# flyingsquid = callPackage ./python-modules/flyingsquid { }; + +# flynt = callPackage ./python-modules/flynt { }; + +# fn = callPackage ./python-modules/fn { }; + +# fnv-hash-fast = callPackage ./python-modules/fnv-hash-fast { }; + +# fnvhash = callPackage ./python-modules/fnvhash { }; + +# folium = callPackage ./python-modules/folium { }; + +# fontawesomefree = callPackage ./python-modules/fontawesomefree { }; + +# fontbakery = callPackage ./python-modules/fontbakery { }; + +# fontfeatures = callPackage ./python-modules/fontfeatures { }; + +# fontforge = toPythonModule (pkgs.fontforge.override { +# withPython = true; +# inherit python; +# }); + +# fontmath = callPackage ./python-modules/fontmath { }; + +# fontparts = callPackage ./python-modules/fontparts { }; + +# fontpens = callPackage ./python-modules/fontpens { }; + +# fonttools = callPackage ./python-modules/fonttools { }; + +# fontmake = callPackage ./python-modules/fontmake { }; + +# font-v = callPackage ./python-modules/font-v { }; + +# skia-pathops = callPackage ./python-modules/skia-pathops { +# inherit (pkgs.darwin.apple_sdk.frameworks) ApplicationServices OpenGL; +# }; + +# oelint-parser = callPackage ./python-modules/oelint-parser { }; + +# openllm = callPackage ./python-modules/openllm { +# openai-triton = self.openai-triton-cuda; +# }; + +# openllm-client = callPackage ./python-modules/openllm-client { }; + +# openllm-core = callPackage ./python-modules/openllm-core { }; + +# openstep-plist = callPackage ./python-modules/openstep-plist { }; + +# glyphsets = callPackage ./python-modules/glyphsets { }; + +# glyphslib = callPackage ./python-modules/glyphslib { }; + +# glyphtools = callPackage ./python-modules/glyphtools { }; + +# foobot-async = callPackage ./python-modules/foobot-async { }; + +# foolscap = callPackage ./python-modules/foolscap { }; + +# forbiddenfruit = callPackage ./python-modules/forbiddenfruit { }; + +# fordpass = callPackage ./python-modules/fordpass { }; + +# forecast-solar = callPackage ./python-modules/forecast-solar { }; + +# formbox = callPackage ./python-modules/formbox { }; + +# formulae = callPackage ./python-modules/formulae { }; + +# fortiosapi = callPackage ./python-modules/fortiosapi { }; + +# formencode = callPackage ./python-modules/formencode { }; + +# formulaic = callPackage ./python-modules/formulaic { }; + +# foundationdb71 = callPackage ../servers/foundationdb/python.nix { foundationdb = pkgs.foundationdb71; }; + +# fountains = callPackage ./python-modules/fountains { }; + +# foxdot = callPackage ./python-modules/foxdot { }; + +# fpdf = callPackage ./python-modules/fpdf { }; + +# fpdf2 = callPackage ./python-modules/fpdf2 { }; + +# fpylll = callPackage ./python-modules/fpylll { }; + +# fpyutils = callPackage ./python-modules/fpyutils { }; + +# fqdn = callPackage ./python-modules/fqdn { }; + +# freebox-api = callPackage ./python-modules/freebox-api { }; + +# freetype-py = callPackage ./python-modules/freetype-py { }; + + freezegun = callPackage ./python-modules/freezegun { }; + +# frelatage = callPackage ./python-modules/frelatage { }; + +# frida-python = callPackage ./python-modules/frida-python { }; + +# frigidaire = callPackage ./python-modules/frigidaire { }; + +# frilouz = callPackage ./python-modules/frilouz { }; + +# fritzconnection = callPackage ./python-modules/fritzconnection { }; + +# frozendict = callPackage ./python-modules/frozendict { }; + +# frozenlist = callPackage ./python-modules/frozenlist { }; + +# frozenlist2 = callPackage ./python-modules/frozenlist2 { }; + +# fs = callPackage ./python-modules/fs { }; + +# fs-s3fs = callPackage ./python-modules/fs-s3fs { }; + +# fschat = callPackage ./python-modules/fschat { }; + +# fsspec-xrootd = callPackage ./python-modules/fsspec-xrootd { }; + +# fsspec = callPackage ./python-modules/fsspec { }; + +# fst-pso = callPackage ./python-modules/fst-pso { }; + +# ftfy = callPackage ./python-modules/ftfy { }; + +# ftputil = callPackage ./python-modules/ftputil { }; + +# fugashi = callPackage ./python-modules/fugashi { }; + + func-timeout = callPackage ./python-modules/func-timeout { }; + +# funcparserlib = callPackage ./python-modules/funcparserlib { }; + +# funcsigs = callPackage ./python-modules/funcsigs { }; + +# functiontrace = callPackage ./python-modules/functiontrace { }; + +# functools32 = callPackage ./python-modules/functools32 { }; + +# funcy = callPackage ./python-modules/funcy { }; + +# funsor = callPackage ./python-modules/funsor { }; + +# furl = callPackage ./python-modules/furl { }; + +# furo = callPackage ./python-modules/furo { }; + +# fuse = callPackage ./python-modules/fuse-python { +# inherit (pkgs) fuse; +# }; + +# fusepy = callPackage ./python-modules/fusepy { }; + +# future = callPackage ./python-modules/future { }; + +# future-fstrings = callPackage ./python-modules/future-fstrings { }; + +# future-typing = callPackage ./python-modules/future-typing { }; + +# fuzzyfinder = callPackage ./python-modules/fuzzyfinder { }; + +# fuzzytm = callPackage ./python-modules/fuzzytm { }; + +# fuzzywuzzy = callPackage ./python-modules/fuzzywuzzy { }; + +# fvcore = callPackage ./python-modules/fvcore { }; + +# fvs = callPackage ./python-modules/fvs { }; + +# fx2 = callPackage ./python-modules/fx2 { }; + +# fyta-cli = callPackage ./python-modules/fyta-cli { }; + +# g2pkk = callPackage ./python-modules/g2pkk { }; + +# galario = toPythonModule (pkgs.galario.override { +# enablePython = true; +# pythonPackages = self; +# }); + +# galois = callPackage ./python-modules/galois { }; + +# gamble = callPackage ./python-modules/gamble { }; + +# gaphas = callPackage ./python-modules/gaphas { }; + +# gardena-bluetooth = callPackage ./python-modules/gardena-bluetooth { }; + +# garminconnect-aio = callPackage ./python-modules/garminconnect-aio { }; + +# garminconnect = callPackage ./python-modules/garminconnect { }; + +# garth = callPackage ./python-modules/garth { }; + +# gassist-text = callPackage ./python-modules/gassist-text { }; + +# gast = callPackage ./python-modules/gast { }; + +# gatt = callPackage ./python-modules/gatt { }; + +# gattlib = callPackage ./python-modules/gattlib { +# inherit (pkgs) bluez glib pkg-config; +# }; + +# gawd = callPackage ./python-modules/gawd { }; + +# gb-io = callPackage ./python-modules/gb-io { }; + +# gbinder-python = callPackage ./python-modules/gbinder-python { }; + +# gbulb = callPackage ./python-modules/gbulb { }; + +# gcal-sync = callPackage ./python-modules/gcal-sync { }; + +# gcodepy = callPackage ./python-modules/gcodepy { }; + +# gcovr = callPackage ./python-modules/gcovr { }; + +# gcs-oauth2-boto-plugin = callPackage ./python-modules/gcs-oauth2-boto-plugin { }; + +# gcsa = callPackage ./python-modules/gcsa { }; + +# gcsfs = callPackage ./python-modules/gcsfs { }; + +# gdal = toPythonModule (pkgs.gdal.override { python3 = python; }); + +# gdata = callPackage ./python-modules/gdata { }; + +# gdb-pt-dump = callPackage ./python-modules/gdb-pt-dump { }; + +# gdcm = toPythonModule (pkgs.gdcm.override { +# inherit (self) python; +# enablePython = true; +# }); + +# gdown = callPackage ./python-modules/gdown { }; + +# ge25519 = callPackage ./python-modules/ge25519 { }; + +# geant4 = toPythonModule (pkgs.geant4.override { +# enablePython = true; +# python3 = python; +# }); + +# geeknote = callPackage ./python-modules/geeknote { }; + +# gehomesdk = callPackage ./python-modules/gehomesdk { }; + +# gekitchen = callPackage ./python-modules/gekitchen { }; + +# gekko = callPackage ./python-modules/gekko { }; + +# gemfileparser = callPackage ./python-modules/gemfileparser { }; + +# gemfileparser2 = callPackage ./python-modules/gemfileparser2 { }; + +# genanki = callPackage ./python-modules/genanki { }; + +# generic = callPackage ./python-modules/generic { }; + +# geniushub-client = callPackage ./python-modules/geniushub-client { }; + +# genome-collector = callPackage ./python-modules/genome-collector { }; + +# genpy = callPackage ./python-modules/genpy { }; + +# genshi = callPackage ./python-modules/genshi { }; + +# gensim = callPackage ./python-modules/gensim { }; + +# gentools = callPackage ./python-modules/gentools { }; + +# genzshcomp = callPackage ./python-modules/genzshcomp { }; + +# geoalchemy2 = callPackage ./python-modules/geoalchemy2 { }; + +# geocachingapi = callPackage ./python-modules/geocachingapi { }; + +# geocoder = callPackage ./python-modules/geocoder { }; + +# geographiclib = callPackage ./python-modules/geographiclib { }; + +# geoip2 = callPackage ./python-modules/geoip2 { }; + +# geoip = callPackage ./python-modules/geoip { +# libgeoip = pkgs.geoip; +# }; + +# geojson = callPackage ./python-modules/geojson { }; + +# geojson-client = callPackage ./python-modules/geojson-client { }; + +# geomet = callPackage ./python-modules/geomet { }; + +# geometric = callPackage ./python-modules/geometric { }; + +# geopandas = callPackage ./python-modules/geopandas { }; + +# geopy = callPackage ./python-modules/geopy { }; + +# georss-client = callPackage ./python-modules/georss-client { }; + +# georss-generic-client = callPackage ./python-modules/georss-generic-client { }; + +# georss-ign-sismologia-client = callPackage ./python-modules/georss-ign-sismologia-client { }; + +# georss-ingv-centro-nazionale-terremoti-client = callPackage ./python-modules/georss-ingv-centro-nazionale-terremoti-client { }; + +# georss-nrcan-earthquakes-client = callPackage ./python-modules/georss-nrcan-earthquakes-client { }; + +# georss-qld-bushfire-alert-client = callPackage ./python-modules/georss-qld-bushfire-alert-client { }; + +# georss-tfs-incidents-client = callPackage ./python-modules/georss-tfs-incidents-client { }; + +# georss-wa-dfes-client = callPackage ./python-modules/georss-wa-dfes-client { }; + +# gerbonara = callPackage ./python-modules/gerbonara { }; + +# getjump = callPackage ./python-modules/getjump { }; + +# getmac = callPackage ./python-modules/getmac { }; + +# getkey = callPackage ./python-modules/getkey { }; + +# get-video-properties = callPackage ./python-modules/get-video-properties { }; + + gevent = callPackage ./python-modules/gevent { }; + +# geventhttpclient = callPackage ./python-modules/geventhttpclient { }; + +# gevent-socketio = callPackage ./python-modules/gevent-socketio { }; + +# gevent-websocket = callPackage ./python-modules/gevent-websocket { }; + +# gfal2-python = callPackage ./python-modules/gfal2-python { }; + +# gfal2-util = callPackage ./python-modules/gfal2-util { +# inherit (pkgs) xrootd; +# }; + +# gflags = callPackage ./python-modules/gflags { }; + +# gflanguages = callPackage ./python-modules/gflanguages { }; + +# gfsubsets = callPackage ./python-modules/gfsubsets { }; + +# ghapi = callPackage ./python-modules/ghapi { }; + +# ghdiff = callPackage ./python-modules/ghdiff { }; + +# ghp-import = callPackage ./python-modules/ghp-import { }; + +# ghrepo-stats = callPackage ./python-modules/ghrepo-stats { }; + +# gibberish-detector = callPackage ./python-modules/gibberish-detector { }; + +# gidgethub = callPackage ./python-modules/gidgethub { }; + +# gin-config = callPackage ./python-modules/gin-config { }; + +# gios = callPackage ./python-modules/gios { }; + +# gipc = callPackage ./python-modules/gipc { }; + +# gistyc = callPackage ./python-modules/gistyc { }; + +# git-annex-adapter = +# callPackage ./python-modules/git-annex-adapter { }; + +# git-filter-repo = callPackage ./python-modules/git-filter-repo { }; + +# git-revise = callPackage ./python-modules/git-revise { }; + +# git-sweep = callPackage ./python-modules/git-sweep { }; + +# git-url-parse = callPackage ./python-modules/git-url-parse { }; + +# gitdb = callPackage ./python-modules/gitdb { }; + +# githubkit = callPackage ./python-modules/githubkit { }; + +# github-to-sqlite = callPackage ./python-modules/github-to-sqlite { }; + +# github-webhook = callPackage ./python-modules/github-webhook { }; + +# github3-py = callPackage ./python-modules/github3-py { }; + +# gitignore-parser = callPackage ./python-modules/gitignore-parser { }; + +# gitlike-commands = callPackage ./python-modules/gitlike-commands { }; + +# gitpython = callPackage ./python-modules/gitpython { }; + +# git-versioner = callPackage ./python-modules/git-versioner { }; + +# glad = callPackage ./python-modules/glad { }; + +# glad2 = callPackage ./python-modules/glad2 { }; + +# glances-api = callPackage ./python-modules/glances-api { }; + +# glcontext = callPackage ./python-modules/glcontext { }; + +# glean-parser = callPackage ./python-modules/glean-parser { }; + +# glean-sdk = callPackage ./python-modules/glean-sdk { +# inherit (pkgs) lmdb; +# }; + +# glfw = callPackage ./python-modules/glfw { }; + +# glob2 = callPackage ./python-modules/glob2 { }; + +# globre = callPackage ./python-modules/globre { }; + +# globus-sdk = callPackage ./python-modules/globus-sdk { }; + +# glom = callPackage ./python-modules/glom { }; + +# glueviz = callPackage ./python-modules/glueviz { }; + +# glymur = callPackage ./python-modules/glymur { }; + +# gmpy2 = callPackage ./python-modules/gmpy2 { }; + +# gmpy = callPackage ./python-modules/gmpy { }; + +# gmsh = toPythonModule (callPackage ../applications/science/math/gmsh { +# enablePython = true; +# }); + +# gntp = callPackage ./python-modules/gntp { }; + +# gnureadline = callPackage ./python-modules/gnureadline { }; + +# goalzero = callPackage ./python-modules/goalzero { }; + +# gocardless-pro = callPackage ./python-modules/gocardless-pro { }; + +# goobook = callPackage ./python-modules/goobook { }; + +# goocalendar = callPackage ./python-modules/goocalendar { }; + +# goodwe = callPackage ./python-modules/goodwe { }; + +# google = callPackage ./python-modules/google { }; + +# google-ai-generativelanguage = callPackage ./python-modules/google-ai-generativelanguage { }; + +# google-api-core = callPackage ./python-modules/google-api-core { }; + +# google-api-python-client = callPackage ./python-modules/google-api-python-client { }; + +# googleapis-common-protos = callPackage ./python-modules/googleapis-common-protos { }; + +# google-auth = callPackage ./python-modules/google-auth { }; + +# google-auth-httplib2 = callPackage ./python-modules/google-auth-httplib2 { }; + +# google-auth-oauthlib = callPackage ./python-modules/google-auth-oauthlib { }; + +# google-cloud-access-context-manager = callPackage ./python-modules/google-cloud-access-context-manager { }; + +# google-cloud-appengine-logging = callPackage ./python-modules/google-cloud-appengine-logging { }; + +# google-cloud-artifact-registry = callPackage ./python-modules/google-cloud-artifact-registry { }; + +# google-cloud-asset = callPackage ./python-modules/google-cloud-asset { }; + +# google-cloud-audit-log = callPackage ./python-modules/google-cloud-audit-log { }; + +# google-cloud-automl = callPackage ./python-modules/google-cloud-automl { }; + +# google-cloud-bigquery = callPackage ./python-modules/google-cloud-bigquery { }; + +# google-cloud-bigquery-datatransfer = callPackage ./python-modules/google-cloud-bigquery-datatransfer { }; + +# google-cloud-bigquery-logging = callPackage ./python-modules/google-cloud-bigquery-logging { }; + +# google-cloud-bigquery-storage = callPackage ./python-modules/google-cloud-bigquery-storage { }; + +# google-cloud-bigtable = callPackage ./python-modules/google-cloud-bigtable { }; + +# google-cloud-compute = callPackage ./python-modules/google-cloud-compute { }; + +# google-cloud-container = callPackage ./python-modules/google-cloud-container { }; + +# google-cloud-core = callPackage ./python-modules/google-cloud-core { }; + +# google-cloud-datacatalog = callPackage ./python-modules/google-cloud-datacatalog { }; + +# google-cloud-dataproc = callPackage ./python-modules/google-cloud-dataproc { }; + +# google-cloud-datastore = callPackage ./python-modules/google-cloud-datastore { }; + +# google-cloud-dlp = callPackage ./python-modules/google-cloud-dlp { }; + +# google-cloud-dns = callPackage ./python-modules/google-cloud-dns { }; + +# google-cloud-error-reporting = callPackage ./python-modules/google-cloud-error-reporting { }; + +# google-cloud-firestore = callPackage ./python-modules/google-cloud-firestore { }; + +# google-cloud-iam = callPackage ./python-modules/google-cloud-iam { }; + +# google-cloud-iam-logging = callPackage ./python-modules/google-cloud-iam-logging { }; + +# google-cloud-iot = callPackage ./python-modules/google-cloud-iot { }; + +# google-cloud-kms = callPackage ./python-modules/google-cloud-kms { }; + +# google-cloud-language = callPackage ./python-modules/google-cloud-language { }; + +# google-cloud-logging = callPackage ./python-modules/google-cloud-logging { }; + +# google-cloud-monitoring = callPackage ./python-modules/google-cloud-monitoring { }; + +# google-cloud-netapp = callPackage ./python-modules/google-cloud-netapp { }; + +# google-cloud-org-policy = callPackage ./python-modules/google-cloud-org-policy { }; + +# google-cloud-os-config = callPackage ./python-modules/google-cloud-os-config { }; + +# google-cloud-pubsub = callPackage ./python-modules/google-cloud-pubsub { }; + +# google-cloud-redis = callPackage ./python-modules/google-cloud-redis { }; + +# google-cloud-resource-manager = callPackage ./python-modules/google-cloud-resource-manager { }; + +# google-cloud-runtimeconfig = callPackage ./python-modules/google-cloud-runtimeconfig { }; + +# google-cloud-secret-manager = callPackage ./python-modules/google-cloud-secret-manager { }; + +# google-cloud-securitycenter = callPackage ./python-modules/google-cloud-securitycenter { }; + +# google-cloud-shell = callPackage ./python-modules/google-cloud-shell { }; + +# google-cloud-spanner = callPackage ./python-modules/google-cloud-spanner { }; + +# google-cloud-speech = callPackage ./python-modules/google-cloud-speech { }; + +# google-cloud-storage = callPackage ./python-modules/google-cloud-storage { }; + +# google-cloud-tasks = callPackage ./python-modules/google-cloud-tasks { }; + +# google-cloud-testutils = callPackage ./python-modules/google-cloud-testutils { }; + +# google-cloud-texttospeech = callPackage ./python-modules/google-cloud-texttospeech { }; + +# google-cloud-trace = callPackage ./python-modules/google-cloud-trace { }; + +# google-cloud-translate = callPackage ./python-modules/google-cloud-translate { }; + +# google-cloud-videointelligence = callPackage ./python-modules/google-cloud-videointelligence { }; + +# google-cloud-vision = callPackage ./python-modules/google-cloud-vision { }; + +# google-cloud-vpc-access = callPackage ./python-modules/google-cloud-vpc-access { }; + +# google-cloud-webrisk = callPackage ./python-modules/google-cloud-webrisk { }; + +# google-cloud-websecurityscanner = callPackage ./python-modules/google-cloud-websecurityscanner { }; + +# google-cloud-workflows = callPackage ./python-modules/google-cloud-workflows { }; + +# google-cloud-workstations = callPackage ./python-modules/google-cloud-workstations { }; + +# google-compute-engine = callPackage ../tools/virtualization/google-compute-engine { }; + +# google-crc32c = callPackage ./python-modules/google-crc32c { +# inherit (pkgs) crc32c; +# }; + +# google-generativeai = callPackage ./python-modules/google-generativeai { }; + +# google-i18n-address = callPackage ./python-modules/google-i18n-address { }; + +# google-nest-sdm = callPackage ./python-modules/google-nest-sdm { }; + +# googlemaps = callPackage ./python-modules/googlemaps { }; + +# google-pasta = callPackage ./python-modules/google-pasta { }; + +# google-re2 = callPackage ./python-modules/google-re2 { }; + +# google-reauth = callPackage ./python-modules/google-reauth { }; + +# google-resumable-media = callPackage ./python-modules/google-resumable-media { }; + +# google-search-results = callPackage ./python-modules/google-search-results { }; + +# googletrans = callPackage ./python-modules/googletrans { }; + +# gotailwind = callPackage ./python-modules/gotailwind { }; + +# gotenberg-client = callPackage ./python-modules/gotenberg-client { }; + +# gorilla = callPackage ./python-modules/gorilla { }; + +# govee-ble = callPackage ./python-modules/govee-ble { }; + +# govee-led-wez = callPackage ./python-modules/govee-led-wez { }; + +# govee-local-api = callPackage ./python-modules/govee-local-api { }; + +# goveelights = callPackage ./python-modules/goveelights { }; + +# gpapi = callPackage ./python-modules/gpapi { }; + +# gpaw = callPackage ./python-modules/gpaw { }; + +# gpib-ctypes = callPackage ./python-modules/gpib-ctypes { }; + +# gpiozero = callPackage ./python-modules/gpiozero { }; + +# gplaycli = callPackage ./python-modules/gplaycli { }; + +# gpgme = toPythonModule (pkgs.gpgme.override { +# pythonSupport = true; +# python3 = python; +# }); + +# gphoto2 = callPackage ./python-modules/gphoto2 { }; + +# gprof2dot = callPackage ./python-modules/gprof2dot { +# inherit (pkgs) graphviz; +# }; + +# gps3 = callPackage ./python-modules/gps3 { }; + +# gpsoauth = callPackage ./python-modules/gpsoauth { }; + +# gpuctypes = callPackage ./python-modules/gpuctypes { }; + +# gpustat = callPackage ./python-modules/gpustat { }; + +# gpxpy = callPackage ./python-modules/gpxpy { }; + +# gpy = callPackage ./python-modules/gpy { }; + +# gpytorch = callPackage ./python-modules/gpytorch { }; + +# gpt-2-simple = callPackage ./python-modules/gpt-2-simple { }; + +# gptcache = callPackage ./python-modules/gptcache { }; + +# gql = callPackage ./python-modules/gql { }; + +# grad-cam = callPackage ./python-modules/grad-cam { }; + +# gradient = callPackage ./python-modules/gradient { }; + +# gradient-utils = callPackage ./python-modules/gradient-utils { }; + +# gradient-statsd = callPackage ./python-modules/gradient-statsd { }; + +# gradio = callPackage ./python-modules/gradio { }; + +# gradio-client = callPackage ./python-modules/gradio/client.nix { }; + +# gradio-pdf = callPackage ./python-modules/gradio-pdf { }; + +# grafanalib = callPackage ./python-modules/grafanalib/default.nix { }; + +# grammalecte = callPackage ./python-modules/grammalecte { }; + +# grandalf = callPackage ./python-modules/grandalf { }; + +# grapheme = callPackage ./python-modules/grapheme { }; + +# graphite-web = callPackage ./python-modules/graphite-web { }; + +# graphene = callPackage ./python-modules/graphene { }; + +# graphene-django = callPackage ./python-modules/graphene-django { }; + +# graphlib-backport = callPackage ./python-modules/graphlib-backport { }; + +# graphqlclient= callPackage ./python-modules/graphqlclient { }; + +# graphql-core = callPackage ./python-modules/graphql-core { }; + +# graphql-relay = callPackage ./python-modules/graphql-relay { }; + +# graphql-server-core = callPackage ./python-modules/graphql-server-core { }; + +# graphql-subscription-manager = callPackage ./python-modules/graphql-subscription-manager { }; + +# graph-tool = callPackage ./python-modules/graph-tool { }; + +# graphtage = callPackage ./python-modules/graphtage { }; + +# graphviz = callPackage ./python-modules/graphviz { }; + +# grappelli-safe = callPackage ./python-modules/grappelli-safe { }; + +# graspologic = callPackage ./python-modules/graspologic { }; + +# greatfet = callPackage ./python-modules/greatfet { }; + +# greeclimate = callPackage ./python-modules/greeclimate { }; + +# green = callPackage ./python-modules/green { }; + +# greeneye-monitor = callPackage ./python-modules/greeneye-monitor { }; + +# # built-in for pypi + greenlet = if isPyPy then null else callPackage ./python-modules/greenlet { }; + +# grequests = callPackage ./python-modules/grequests { }; + +# gremlinpython = callPackage ./python-modules/gremlinpython { }; + +# greynoise = callPackage ./python-modules/greynoise { }; + +# growattserver = callPackage ./python-modules/growattserver { }; + +# gridnet = callPackage ./python-modules/gridnet { }; + +# griffe = callPackage ./python-modules/griffe { }; + +# grip = callPackage ./python-modules/grip { }; + +# groestlcoin-hash = callPackage ./python-modules/groestlcoin-hash { }; + +# grpc-google-iam-v1 = callPackage ./python-modules/grpc-google-iam-v1 { }; + +# grpc-interceptor = callPackage ./python-modules/grpc-interceptor { }; + +# grpcio = callPackage ./python-modules/grpcio { }; + +# grpcio-channelz = callPackage ./python-modules/grpcio-channelz { }; + +# grpcio-gcp = callPackage ./python-modules/grpcio-gcp { }; + +# grpcio-health-checking = callPackage ./python-modules/grpcio-health-checking { }; + +# grpcio-reflection = callPackage ./python-modules/grpcio-reflection { }; + +# grpcio-status = callPackage ./python-modules/grpcio-status { }; + +# grpcio-tools = callPackage ./python-modules/grpcio-tools { }; + +# grpcio-testing = callPackage ./python-modules/grpcio-testing { }; + +# grpclib = callPackage ./python-modules/grpclib { }; + +# gruut = callPackage ./python-modules/gruut { }; + +# gruut-ipa = callPackage ./python-modules/gruut-ipa { +# inherit (pkgs) espeak; +# }; + +# gsd = callPackage ./python-modules/gsd { }; + +# gsm0338 = callPackage ./python-modules/gsm0338 { }; + +# gspread = callPackage ./python-modules/gspread { }; + +# gssapi = callPackage ./python-modules/gssapi { +# inherit (pkgs) krb5; +# inherit (pkgs.darwin.apple_sdk.frameworks) GSS; +# }; + +# gst-python = callPackage ./python-modules/gst-python { +# # inherit (pkgs) meson won't work because it won't be spliced +# inherit (pkgs.buildPackages) meson; +# }; + +# gtfs-realtime-bindings = callPackage ./python-modules/gtfs-realtime-bindings { }; + +# gto = callPackage ./python-modules/gto { }; + +# gtts = callPackage ./python-modules/gtts { }; + +# gtts-token = callPackage ./python-modules/gtts-token { }; + +# guessit = callPackage ./python-modules/guessit { }; + +# guestfs = callPackage ./python-modules/guestfs { +# qemu = pkgs.qemu; +# }; + +# gudhi = callPackage ./python-modules/gudhi { }; + +# guidance = callPackage ./python-modules/guidance { }; + +# gumath = callPackage ./python-modules/gumath { }; + +# gunicorn = callPackage ./python-modules/gunicorn { }; + +# guppy3 = callPackage ./python-modules/guppy3 { }; + +# gurobipy = callPackage ./python-modules/gurobipy { }; + +# guzzle-sphinx-theme = callPackage ./python-modules/guzzle-sphinx-theme { }; + +# gvm-tools = callPackage ./python-modules/gvm-tools { }; + +# gviz-api = callPackage ./python-modules/gviz-api { }; + +# gym = callPackage ./python-modules/gym { }; + +# gym-notices = callPackage ./python-modules/gym-notices { }; + +# gymnasium = callPackage ./python-modules/gymnasium { }; + +# gyp = callPackage ./python-modules/gyp { }; + +# h11 = callPackage ./python-modules/h11 { }; + +# h2 = callPackage ./python-modules/h2 { }; + +# h3 = callPackage ./python-modules/h3 { +# inherit (pkgs) h3; +# }; + +# h5io = callPackage ./python-modules/h5io { }; + +# h5netcdf = callPackage ./python-modules/h5netcdf { }; + +# h5py = callPackage ./python-modules/h5py { }; + +# h5py-mpi = self.h5py.override { +# hdf5 = pkgs.hdf5-mpi; +# }; + +# habanero = callPackage ./python-modules/habanero { }; + +# habluetooth = callPackage ./python-modules/habluetooth { }; + +# habitipy = callPackage ./python-modules/habitipy { }; + +# hachoir = callPackage ./python-modules/hachoir { }; + +# hacking = callPackage ./python-modules/hacking { }; + +# hdate = callPackage ./python-modules/hdate { }; + +# hdf5plugin = callPackage ./python-modules/hdf5plugin { }; + +# ha-ffmpeg = callPackage ./python-modules/ha-ffmpeg { }; + +# ha-mqtt-discoverable = callPackage ./python-modules/ha-mqtt-discoverable { }; + +# ha-philipsjs = callPackage ./python-modules/ha-philipsjs{ }; + +# hahomematic = callPackage ./python-modules/hahomematic { }; + +# halo = callPackage ./python-modules/halo { }; + +# halohome = callPackage ./python-modules/halohome { }; + +# handout = callPackage ./python-modules/handout { }; + +# hap-python = callPackage ./python-modules/hap-python { }; + +# hass-nabucasa = callPackage ./python-modules/hass-nabucasa { }; + +# hassil = callPackage ./python-modules/hassil { }; + +# hatasmota = callPackage ./python-modules/hatasmota { }; + + hatchling = callPackage ./python-modules/hatchling { }; + +# hatch-fancy-pypi-readme = callPackage ./python-modules/hatch-fancy-pypi-readme { }; + +# hatch-jupyter-builder = callPackage ./python-modules/hatch-jupyter-builder { }; + + hatch-vcs = callPackage ./python-modules/hatch-vcs { }; + +# hatch-nodejs-version = callPackage ./python-modules/hatch-nodejs-version { }; + +# hatch-requirements-txt = callPackage ./python-modules/hatch-requirements-txt { }; + +# haversine = callPackage ./python-modules/haversine { }; + +# hawkauthlib = callPackage ./python-modules/hawkauthlib { }; + +# hcloud = callPackage ./python-modules/hcloud { }; + +# hcs-utils = callPackage ./python-modules/hcs-utils { }; + +# hdbscan = callPackage ./python-modules/hdbscan { }; + +# hdfs = callPackage ./python-modules/hdfs { }; + +# hdmedians = callPackage ./python-modules/hdmedians { }; + +# headerparser = callPackage ./python-modules/headerparser { }; + +# heapdict = callPackage ./python-modules/heapdict { }; + +# heatshrink2 = callPackage ./python-modules/heatshrink2 { }; + +# heatzypy = callPackage ./python-modules/heatzypy { }; + +# help2man = callPackage ./python-modules/help2man { }; + +# helpdev = callPackage ./python-modules/helpdev { }; + +# helper = callPackage ./python-modules/helper { }; + +# hepmc3 = toPythonModule (pkgs.hepmc3.override { +# inherit python; +# }); + +# hepunits = callPackage ./python-modules/hepunits { }; + +# here-routing = callPackage ./python-modules/here-routing { }; + +# here-transit = callPackage ./python-modules/here-transit { }; + +# herepy = callPackage ./python-modules/herepy { }; + +# hetzner = callPackage ./python-modules/hetzner { }; + +# heudiconv = callPackage ./python-modules/heudiconv { }; + +# hexbytes = callPackage ./python-modules/hexbytes { }; + +# hexdump = callPackage ./python-modules/hexdump { }; + +# hfst = callPackage ./python-modules/hfst { }; + +# hg-commitsigs = callPackage ./python-modules/hg-commitsigs { }; + +# hg-evolve = callPackage ./python-modules/hg-evolve { }; + +# hg-git = callPackage ./python-modules/hg-git { }; + +# hickle = callPackage ./python-modules/hickle { }; + +# highdicom = callPackage ./python-modules/highdicom { }; + +# hid = callPackage ./python-modules/hid { +# inherit (pkgs) hidapi; +# }; + +# hidapi = callPackage ./python-modules/hidapi { +# inherit (pkgs) udev libusb1; +# }; + +# hid-parser = callPackage ./python-modules/hid-parser { }; + +# hieroglyph = callPackage ./python-modules/hieroglyph { }; + +# hijri-converter = callPackage ./python-modules/hijri-converter { }; + +# hikari = callPackage ./python-modules/hikari { }; + +# hikvision = callPackage ./python-modules/hikvision { }; + +# hiredis = callPackage ./python-modules/hiredis { }; + +# hiro = callPackage ./python-modules/hiro { }; + +# hishel = callPackage ./python-modules/hishel { }; + +# hist = callPackage ./python-modules/hist { }; + +# histoprint = callPackage ./python-modules/histoprint { }; + +# hiyapyco = callPackage ./python-modules/hiyapyco { }; + +# hjson = callPackage ./python-modules/hjson { }; + +# hkavr = callPackage ./python-modules/hkavr { }; + +# hkdf = callPackage ./python-modules/hkdf { }; + +# hledger-utils = callPackage ./python-modules/hledger-utils { }; + +# hlk-sw16 = callPackage ./python-modules/hlk-sw16 { }; + +# hnswlib = callPackage ./python-modules/hnswlib { +# inherit (pkgs) hnswlib; +# }; + +# hmmlearn = callPackage ./python-modules/hmmlearn { }; + +# hocr-tools = callPackage ./python-modules/hocr-tools { }; + +# hole = callPackage ./python-modules/hole { }; + +# holidays = callPackage ./python-modules/holidays { }; + +# hologram = callPackage ./python-modules/hologram { }; + +# holoviews = callPackage ./python-modules/holoviews { }; + +# home-assistant-bluetooth = callPackage ./python-modules/home-assistant-bluetooth { }; + +# home-assistant-chip-clusters = callPackage ./python-modules/home-assistant-chip-clusters { }; + +# home-assistant-chip-core = callPackage ./python-modules/home-assistant-chip-core { }; + +# homeassistant-stubs = callPackage ../servers/home-assistant/stubs.nix { }; + +# homeconnect = callPackage ./python-modules/homeconnect { }; + +# homematicip = callPackage ./python-modules/homematicip { }; + +# homepluscontrol = callPackage ./python-modules/homepluscontrol { }; + +# hoomd-blue = toPythonModule (callPackage ./python-modules/hoomd-blue { +# inherit python; +# }); + +# hopcroftkarp = callPackage ./python-modules/hopcroftkarp { }; + +# horizon-eda = callPackage ./python-modules/horizon-eda { +# inherit (pkgs) horizon-eda mesa; +# }; + +# howdoi = callPackage ./python-modules/howdoi { }; + +# hpack = callPackage ./python-modules/hpack { }; + +# hpccm = callPackage ./python-modules/hpccm { }; + +# hpp-fcl = toPythonModule (pkgs.hpp-fcl.override { +# pythonSupport = true; +# python3Packages = self; +# }); + +# hs-dbus-signature = callPackage ./python-modules/hs-dbus-signature { }; + +# hsaudiotag3k = callPackage ./python-modules/hsaudiotag3k { }; + +# hsh = callPackage ./python-modules/hsh { }; + +# hsluv = callPackage ./python-modules/hsluv { }; + +# hstspreload = callPackage ./python-modules/hstspreload { }; + +# html2image = callPackage ./python-modules/html2image { }; + +# html2text = callPackage ./python-modules/html2text { }; + + html5lib = callPackage ./python-modules/html5lib { }; + +# html5tagger = callPackage ./python-modules/html5tagger { }; + +# html5-parser = callPackage ./python-modules/html5-parser { }; + +# htmldate = callPackage ./python-modules/htmldate { }; + +# htmllaundry = callPackage ./python-modules/htmllaundry { }; + +# htmllistparse = callPackage ./python-modules/htmllistparse { }; + +# htmlmin = callPackage ./python-modules/htmlmin { }; + +# html-sanitizer = callPackage ./python-modules/html-sanitizer { }; + +# html-tag-names = callPackage ./python-modules/html-tag-names { }; + +# html-text = callPackage ./python-modules/html-text { }; + +# html-void-elements = callPackage ./python-modules/html-void-elements { }; + +# htseq = callPackage ./python-modules/htseq { }; + +# httmock = callPackage ./python-modules/httmock { }; + +# httpagentparser = callPackage ./python-modules/httpagentparser { }; + +# httpauth = callPackage ./python-modules/httpauth { }; + +# httpbin = callPackage ./python-modules/httpbin { }; + +# httpcore = callPackage ./python-modules/httpcore { }; + +# httpie = callPackage ./python-modules/httpie { }; + +# http-ece = callPackage ./python-modules/http-ece { }; + +# httpie-ntlm = callPackage ./python-modules/httpie-ntlm { }; + +# httplib2 = callPackage ./python-modules/httplib2 { }; + +# http-message-signatures = callPackage ./python-modules/http-message-signatures { }; + +# http-parser = callPackage ./python-modules/http-parser { }; + +# http-sf = callPackage ./python-modules/http-sf { }; + +# http-sfv = callPackage ./python-modules/http-sfv { }; + +# httpretty = callPackage ./python-modules/httpretty { }; + +# httpserver = callPackage ./python-modules/httpserver { }; + +# httpsig = callPackage ./python-modules/httpsig { }; + +# httptools = callPackage ./python-modules/httptools { }; + +# httpx = callPackage ./python-modules/httpx { }; + +# httpx-auth = callPackage ./python-modules/httpx-auth { }; + +# httpx-ntlm = callPackage ./python-modules/httpx-ntlm { }; + +# httpx-socks = callPackage ./python-modules/httpx-socks { }; + +# httpx-sse = callPackage ./python-modules/httpx-sse { }; + +# huawei-lte-api = callPackage ./python-modules/huawei-lte-api { }; + +# huey = callPackage ./python-modules/huey { }; + +# hug = callPackage ./python-modules/hug { }; + +# huggingface-hub = callPackage ./python-modules/huggingface-hub { }; + +# huisbaasje-client = callPackage ./python-modules/huisbaasje-client { }; + +# humanfriendly = callPackage ./python-modules/humanfriendly { }; + +# humanize = callPackage ./python-modules/humanize { }; + +# human-readable = callPackage ./python-modules/human-readable { }; + +# humblewx = callPackage ./python-modules/humblewx { }; + +# hupper = callPackage ./python-modules/hupper { }; + +# hurry-filesize = callPackage ./python-modules/hurry-filesize { }; + +# huum = callPackage ./python-modules/huum { }; + +# hvac = callPackage ./python-modules/hvac { }; + +# hvplot = callPackage ./python-modules/hvplot { }; + +# hwdata = callPackage ./python-modules/hwdata { }; + +# hwi = callPackage ./python-modules/hwi { }; + +# hy = callPackage ./python-modules/hy { }; + +# hydra-core = callPackage ./python-modules/hydra-core { }; + +# hydra-check = callPackage ./python-modules/hydra-check { }; + +# hydrawiser = callPackage ./python-modules/hydrawiser { }; + +# hydrus-api = callPackage ./python-modules/hydrus-api { }; + +# hypchat = callPackage ./python-modules/hypchat { }; + +# hypercorn = callPackage ./python-modules/hypercorn { }; + +# hyperframe = callPackage ./python-modules/hyperframe { }; + +# hyperscan = callPackage ./python-modules/hyperscan { }; + +# hyperion-py = callPackage ./python-modules/hyperion-py { }; + +# hyperlink = callPackage ./python-modules/hyperlink { }; + +# hyperopt = callPackage ./python-modules/hyperopt { }; + +# hyperpyyaml = callPackage ./python-modules/hyperpyyaml { }; + +# hypothesis-auto = callPackage ./python-modules/hypothesis-auto { }; + + hypothesis = callPackage ./python-modules/hypothesis { }; + +# hypothesmith = callPackage ./python-modules/hypothesmith { }; + +# hyppo = callPackage ./python-modules/hyppo { }; + +# hyrule = callPackage ./python-modules/hyrule { }; + +# i2c-tools = callPackage ./python-modules/i2c-tools { +# inherit (pkgs) i2c-tools; +# }; + +# i2csense = callPackage ./python-modules/i2csense { }; + +# i3ipc = callPackage ./python-modules/i3ipc { }; + +# i3-py = callPackage ./python-modules/i3-py { }; + +# iammeter = callPackage ./python-modules/iammeter { }; + +# iapws = callPackage ./python-modules/iapws { }; + +# iaqualink = callPackage ./python-modules/iaqualink { }; + +# ibeacon-ble = callPackage ./python-modules/ibeacon-ble { }; + +# ibis = callPackage ./python-modules/ibis { }; + +# ibis-framework = callPackage ./python-modules/ibis-framework { }; + +# ibm-cloud-sdk-core = callPackage ./python-modules/ibm-cloud-sdk-core { }; + +# ibm-watson = callPackage ./python-modules/ibm-watson { }; + +# ical = callPackage ./python-modules/ical { }; + +# icalendar = callPackage ./python-modules/icalendar { }; + +# icalevents = callPackage ./python-modules/icalevents { }; + +# icecream = callPackage ./python-modules/icecream { }; + +# iceportal = callPackage ./python-modules/iceportal { }; + +# icmplib = callPackage ./python-modules/icmplib { }; + +# icnsutil = callPackage ./python-modules/icnsutil { }; + +# ics = callPackage ./python-modules/ics { }; + +# idasen = callPackage ./python-modules/idasen { }; + +# icoextract = callPackage ./python-modules/icoextract { }; + +# icontract = callPackage ./python-modules/icontract { }; + +# id = callPackage ./python-modules/id { }; + +# identify = callPackage ./python-modules/identify { }; + + idna = callPackage ./python-modules/idna { }; + +# idna-ssl = callPackage ./python-modules/idna-ssl { }; + +# ifaddr = callPackage ./python-modules/ifaddr { }; + +# ifconfig-parser = callPackage ./python-modules/ifconfig-parser { }; + +# ifcopenshell = callPackage ./python-modules/ifcopenshell { }; + +# ignite = callPackage ./python-modules/ignite { }; + +# igraph = callPackage ./python-modules/igraph { +# inherit (pkgs) igraph; +# }; + +# ihm = callPackage ./python-modules/ihm { }; + +# iisignature = callPackage ./python-modules/iisignature { }; + +# ijson = callPackage ./python-modules/ijson { }; + +# ilua = callPackage ./python-modules/ilua { }; + +# imagecodecs-lite = callPackage ./python-modules/imagecodecs-lite { }; + +# imagecorruptions = callPackage ./python-modules/imagecorruptions { }; + +# imagededup = callPackage ./python-modules/imagededup { }; + +# imagehash = callPackage ./python-modules/imagehash { }; + +# imageio = callPackage ./python-modules/imageio { }; + +# imageio-ffmpeg = callPackage ./python-modules/imageio-ffmpeg { }; + +# image-diff = callPackage ./python-modules/image-diff { }; + +# image-go-nord = callPackage ./python-modules/image-go-nord { }; + + imagesize = callPackage ./python-modules/imagesize { }; + +# imantics = callPackage ./python-modules/imantics { }; + +# imapclient = callPackage ./python-modules/imapclient { }; + +# imaplib2 = callPackage ./python-modules/imaplib2 { }; + +# imap-tools = callPackage ./python-modules/imap-tools { }; + +# imbalanced-learn = callPackage ./python-modules/imbalanced-learn { }; + +# img2pdf = callPackage ./python-modules/img2pdf { }; + +# imgcat = callPackage ./python-modules/imgcat { }; + +# imgdiff = callPackage ./python-modules/imgdiff { }; + +# imgsize = callPackage ./python-modules/imgsize { }; + +# imgtool = callPackage ./python-modules/imgtool { }; + +# imia = callPackage ./python-modules/imia { }; + +# iminuit = callPackage ./python-modules/iminuit { }; + +# immutabledict = callPackage ./python-modules/immutabledict { }; + +# immutables = callPackage ./python-modules/immutables { }; + +# impacket = callPackage ./python-modules/impacket { }; + +# import-expression = callPackage ./python-modules/import-expression { }; + +# importlab = callPackage ./python-modules/importlab { }; + + importlib-metadata = callPackage ./python-modules/importlib-metadata { }; + +# importlib-resources = callPackage ./python-modules/importlib-resources { }; + +# importmagic = callPackage ./python-modules/importmagic { }; + +# imread = callPackage ./python-modules/imread { +# inherit (pkgs) libjpeg libpng libtiff libwebp; +# }; + +# imutils = callPackage ./python-modules/imutils { }; + +# in-n-out = callPackage ./python-modules/in-n-out { }; + +# in-place = callPackage ./python-modules/in-place { }; + +# incomfort-client = callPackage ./python-modules/incomfort-client { }; + +# incremental = callPackage ./python-modules/incremental { }; + +# indexed-bzip2 = callPackage ./python-modules/indexed-bzip2 { }; + +# indexed-gzip = callPackage ./python-modules/indexed-gzip { inherit (pkgs) zlib; }; + +# indexed-zstd = callPackage ./python-modules/indexed-zstd { inherit (pkgs) zstd; }; + +# infinity = callPackage ./python-modules/infinity { }; + +# inflect = callPackage ./python-modules/inflect { }; + +# inflection = callPackage ./python-modules/inflection { }; + +# influxdb = callPackage ./python-modules/influxdb { }; + +# influxdb-client = callPackage ./python-modules/influxdb-client { }; + +# influxdb3-python = callPackage ./python-modules/influxdb3-python { }; + +# inform = callPackage ./python-modules/inform { }; + + iniconfig = callPackage ./python-modules/iniconfig { }; + +# inifile = callPackage ./python-modules/inifile { }; + +# iniparse = callPackage ./python-modules/iniparse { }; + +# injector = callPackage ./python-modules/injector { }; + +# inkbird-ble = callPackage ./python-modules/inkbird-ble { }; + +# inkex = callPackage ./python-modules/inkex { }; + +# inlinestyler = callPackage ./python-modules/inlinestyler { }; + +# inotify = callPackage ./python-modules/inotify { }; + +# inotify-simple = callPackage ./python-modules/inotify-simple { }; + +# inotifyrecursive = callPackage ./python-modules/inotifyrecursive { }; + +# inquirer = callPackage ./python-modules/inquirer { }; + +# inquirerpy = callPackage ./python-modules/inquirerpy { }; + +# inscriptis = callPackage ./python-modules/inscriptis { }; + +# insegel = callPackage ./python-modules/insegel { }; + +# insightface = callPackage ./python-modules/insightface { }; + + installer = callPackage ./python-modules/installer { }; + +# insteon-frontend-home-assistant = callPackage ./python-modules/insteon-frontend-home-assistant { }; + +# instructor = callPackage ./python-modules/instructor { }; + +# intake = callPackage ./python-modules/intake { }; + +# intake-parquet = callPackage ./python-modules/intake-parquet { }; + +# intbitset = callPackage ./python-modules/intbitset { }; + +# intelhex = callPackage ./python-modules/intelhex { }; + +# intellifire4py = callPackage ./python-modules/intellifire4py { }; + +# intensity-normalization = callPackage ./python-modules/intensity-normalization { }; + +# interegular = callPackage ./python-modules/interegular { }; + +# interface-meta = callPackage ./python-modules/interface-meta { }; + +# internetarchive = callPackage ./python-modules/internetarchive { }; + +# interruptingcow = callPackage ./python-modules/interruptingcow { }; + +# intervaltree = callPackage ./python-modules/intervaltree { }; + +# into-dbus-python = callPackage ./python-modules/into-dbus-python { }; + +# invisible-watermark = callPackage ./python-modules/invisible-watermark { }; + +# invocations = callPackage ./python-modules/invocations { }; + +# invoke = callPackage ./python-modules/invoke { }; + +# iocsearcher = callPackage ./python-modules/iocsearcher { }; + +# iodata = callPackage ./python-modules/iodata { }; + +# iocapture = callPackage ./python-modules/iocapture { }; + +# iocextract = callPackage ./python-modules/iocextract { }; + +# ionhash = callPackage ./python-modules/ionhash { }; + +# ionoscloud = callPackage ./python-modules/ionoscloud { }; + +# iopath = callPackage ./python-modules/iopath { }; + +# iotawattpy = callPackage ./python-modules/iotawattpy { }; + +# iowait = callPackage ./python-modules/iowait { }; + +# ipadic = callPackage ./python-modules/ipadic { }; + +# ipaddr = callPackage ./python-modules/ipaddr { }; + +# ipdb = callPackage ./python-modules/ipdb { }; + +# ipdbplugin = callPackage ./python-modules/ipdbplugin { }; + +# ipfshttpclient = callPackage ./python-modules/ipfshttpclient { }; + +# i-pi = callPackage ./python-modules/i-pi { }; + +# iptools = callPackage ./python-modules/iptools { }; + +# ipwhl = callPackage ./python-modules/ipwhl { }; + +# ipwhois = callPackage ./python-modules/ipwhois { }; + +# ipy = callPackage ./python-modules/ipy { }; + +# ipycanvas = callPackage ./python-modules/ipycanvas { }; + +# ipydatawidgets = callPackage ./python-modules/ipydatawidgets { }; + +# ipynbname = callPackage ./python-modules/ipynbname { }; + +# ipyniivue = callPackage ./python-modules/ipyniivue { }; + +# ipykernel = callPackage ./python-modules/ipykernel { }; + +# ipymarkup = callPackage ./python-modules/ipymarkup { }; + +# ipympl = callPackage ./python-modules/ipympl { }; + +# ipyparallel = callPackage ./python-modules/ipyparallel { }; + +# ipytablewidgets = callPackage ./python-modules/ipytablewidgets { }; + +# ipython-genutils = callPackage ./python-modules/ipython-genutils { }; + +# ipython = callPackage ./python-modules/ipython { }; + +# ipython-sql = callPackage ./python-modules/ipython-sql { }; + +# ipyvue = callPackage ./python-modules/ipyvue { }; + +# ipyvuetify = callPackage ./python-modules/ipyvuetify { }; + +# ipywidgets = callPackage ./python-modules/ipywidgets { }; + +# ipyxact = callPackage ./python-modules/ipyxact { }; + +# irc = callPackage ./python-modules/irc { }; + +# ircrobots = callPackage ./python-modules/ircrobots { }; + +# ircstates = callPackage ./python-modules/ircstates { }; + +# irctokens = callPackage ./python-modules/irctokens { }; + +# isbnlib = callPackage ./python-modules/isbnlib { }; + +# islpy = callPackage ./python-modules/islpy { }; + +# iso3166 = callPackage ./python-modules/iso3166 { }; + +# ismartgate = callPackage ./python-modules/ismartgate { }; + +# iso-639 = callPackage ./python-modules/iso-639 { }; + +# iso4217 = callPackage ./python-modules/iso4217 { }; + +# iso8601 = callPackage ./python-modules/iso8601 { }; + +# isodate = callPackage ./python-modules/isodate { }; + +# isoduration = callPackage ./python-modules/isoduration { }; + +# isort = callPackage ./python-modules/isort { }; + +# isosurfaces = callPackage ./python-modules/isosurfaces { }; + +# isounidecode = callPackage ./python-modules/isounidecode { }; + +# isoweek = callPackage ./python-modules/isoweek { }; + +# itanium-demangler = callPackage ./python-modules/itanium-demangler { }; + +# item-synchronizer = callPackage ./python-modules/item-synchronizer { }; + +# itemadapter = callPackage ./python-modules/itemadapter { }; + +# itemdb = callPackage ./python-modules/itemdb { }; + +# itemloaders = callPackage ./python-modules/itemloaders { }; + +# iteration-utilities = callPackage ./python-modules/iteration-utilities { }; + +# iterative-telemetry = callPackage ./python-modules/iterative-telemetry { }; + +# iterm2 = callPackage ./python-modules/iterm2 { }; + +# itsdangerous = callPackage ./python-modules/itsdangerous { }; + +# itunespy = callPackage ./python-modules/itunespy { }; + +# itypes = callPackage ./python-modules/itypes { }; + +# iwlib = callPackage ./python-modules/iwlib { }; + +# j2cli = callPackage ./python-modules/j2cli { }; + +# jaconv = callPackage ./python-modules/jaconv { }; + +# jaeger-client = callPackage ./python-modules/jaeger-client { }; + +# jamo = callPackage ./python-modules/jamo { }; + +# janus = callPackage ./python-modules/janus { }; + +# jaraco-abode = callPackage ./python-modules/jaraco-abode { }; + +# jaraco-classes = callPackage ./python-modules/jaraco-classes { }; + +# jaraco-collections = callPackage ./python-modules/jaraco-collections { }; + +# jaraco-email = callPackage ./python-modules/jaraco-email { }; + +# jaraco-context = callPackage ./python-modules/jaraco-context { }; + +# jaraco-functools = callPackage ./python-modules/jaraco-functools { }; + + jaraco-itertools = callPackage ./python-modules/jaraco-itertools { }; + +# jaraco-logging = callPackage ./python-modules/jaraco-logging { }; + +# jaraco-net = callPackage ./python-modules/jaraco-net { }; + +# jaraco-stream = callPackage ./python-modules/jaraco-stream { }; + +# jaraco-test = callPackage ./python-modules/jaraco-test { }; + +# jaraco-text = callPackage ./python-modules/jaraco-text { }; + +# jarowinkler = callPackage ./python-modules/jarowinkler { }; + +# javaobj-py3 = callPackage ./python-modules/javaobj-py3 { }; + +# javaproperties = callPackage ./python-modules/javaproperties { }; + +# jax = callPackage ./python-modules/jax { }; + +# jax-jumpy = callPackage ./python-modules/jax-jumpy { }; + +# jaxlib-bin = callPackage ./python-modules/jaxlib/bin.nix { +# inherit (pkgs.config) cudaSupport; +# }; + +# jaxlib-build = callPackage ./python-modules/jaxlib rec { +# inherit (pkgs.darwin) cctools; +# # Some platforms don't have `cudaSupport` defined, hence the need for 'or false'. +# inherit (pkgs.config) cudaSupport; +# IOKit = pkgs.darwin.apple_sdk_11_0.IOKit; +# }; + +# jaxlib = self.jaxlib-build; + +# jaxlibWithCuda = self.jaxlib-build.override { +# cudaSupport = true; +# }; + +# jaxlibWithoutCuda = self.jaxlib-build.override { +# cudaSupport = false; +# }; + +# jaxopt = callPackage ./python-modules/jaxopt { }; + +# jaxtyping = callPackage ./python-modules/jaxtyping { }; + +# jaydebeapi = callPackage ./python-modules/jaydebeapi { }; + +# jc = callPackage ./python-modules/jc { }; + +# jdatetime = callPackage ./python-modules/jdatetime { }; + +# jdcal = callPackage ./python-modules/jdcal { }; + +# jedi = callPackage ./python-modules/jedi { }; + +# jedi-language-server = callPackage ./python-modules/jedi-language-server { }; + +# jeepney = callPackage ./python-modules/jeepney { }; + +# jello = callPackage ./python-modules/jello { }; + +# jellyfin-apiclient-python = callPackage ./python-modules/jellyfin-apiclient-python { }; + +# jellyfish = callPackage ./python-modules/jellyfish { }; + +# jenkinsapi = callPackage ./python-modules/jenkinsapi { }; + +# jenkins-job-builder = callPackage ./python-modules/jenkins-job-builder { }; + +# jieba = callPackage ./python-modules/jieba { }; + + jinja2 = callPackage ./python-modules/jinja2 { }; + +# jinja2-ansible-filters = callPackage ./python-modules/jinja2-ansible-filters { }; + +# jinja2-git = callPackage ./python-modules/jinja2-git { }; + +# jinja2-pluralize = callPackage ./python-modules/jinja2-pluralize { }; + +# jinja2-time = callPackage ./python-modules/jinja2-time { }; + +# jira = callPackage ./python-modules/jira { }; + +# jishaku = callPackage ./python-modules/jishaku { }; + +# jiwer = callPackage ./python-modules/jiwer { }; + +# jmespath = callPackage ./python-modules/jmespath { }; + +# jmp = callPackage ./python-modules/jmp { }; + +# joblib = callPackage ./python-modules/joblib { }; + +# johnnycanencrypt = callPackage ./python-modules/johnnycanencrypt { +# inherit (pkgs.darwin.apple_sdk.frameworks) PCSC; +# }; + +# josepy = callPackage ./python-modules/josepy { }; + +# joserfc = callPackage ./python-modules/joserfc { }; + +# journalwatch = callPackage ../tools/system/journalwatch { +# inherit (self) systemd pytest; +# }; + +# jplephem = callPackage ./python-modules/jplephem { }; + +# jproperties = callPackage ./python-modules/jproperties { }; + +# jpylyzer = callPackage ./python-modules/jpylyzer { }; + +# jpype1 = callPackage ./python-modules/jpype1 { }; + +# jq = callPackage ./python-modules/jq { +# inherit (pkgs) jq; +# }; + +# js2py = callPackage ./python-modules/js2py { }; + +# jsbeautifier = callPackage ./python-modules/jsbeautifier { }; + +# jschema-to-python = callPackage ./python-modules/jschema-to-python { }; + +# jsmin = callPackage ./python-modules/jsmin { }; + +# json5 = callPackage ./python-modules/json5 { }; + +# jsonargparse = callPackage ./python-modules/jsonargparse { }; + +# jsonconversion = callPackage ./python-modules/jsonconversion { }; + +# jsondate = callPackage ./python-modules/jsondate { }; + +# jsondiff = callPackage ./python-modules/jsondiff { }; + +# jsonfeed = callPackage ./python-modules/jsonfeed { }; + +# jsonfield = callPackage ./python-modules/jsonfield { }; + +# jsonlines = callPackage ./python-modules/jsonlines { }; + +# json-logging = callPackage ./python-modules/json-logging { }; + +# jsonmerge = callPackage ./python-modules/jsonmerge { }; + +# json-home-client = callPackage ./python-modules/json-home-client { }; + +# json-merge-patch = callPackage ./python-modules/json-merge-patch { }; + +# json-schema-for-humans = callPackage ./python-modules/json-schema-for-humans { }; + +# json-stream = callPackage ./python-modules/json-stream { }; + +# json-stream-rs-tokenizer = callPackage ./python-modules/json-stream-rs-tokenizer { }; + +# jsonable = callPackage ./python-modules/jsonable { }; + +# jsonformatter = callPackage ./python-modules/jsonformatter { }; + +# jsonnet = buildPythonPackage { inherit (pkgs.jsonnet) name src; }; + +# jsonpatch = callPackage ./python-modules/jsonpatch { }; + +# jsonpath = callPackage ./python-modules/jsonpath { }; + +# jsonpath-rw = callPackage ./python-modules/jsonpath-rw { }; + +# jsonpath-ng = callPackage ./python-modules/jsonpath-ng { }; + +# jsonpickle = callPackage ./python-modules/jsonpickle { }; + +# jsonpointer = callPackage ./python-modules/jsonpointer { }; + +# jsonref = callPackage ./python-modules/jsonref { }; + +# json-rpc = callPackage ./python-modules/json-rpc { }; + +# jsonrpc-async = callPackage ./python-modules/jsonrpc-async { }; + +# jsonrpc-base = callPackage ./python-modules/jsonrpc-base { }; + +# jsonrpclib-pelix = callPackage ./python-modules/jsonrpclib-pelix { }; + +# jsonrpc-websocket = callPackage ./python-modules/jsonrpc-websocket { }; + +# jsons = callPackage ./python-modules/jsons { }; + +# jsonschema = callPackage ./python-modules/jsonschema { }; + +# jsonschema-path = callPackage ./python-modules/jsonschema-path { }; + +# jsonschema-spec = callPackage ./python-modules/jsonschema-spec { }; + +# jsonschema-specifications = callPackage ./python-modules/jsonschema-specifications { }; + +# jsonslicer = callPackage ./python-modules/jsonslicer { }; + +# jsonstreams = callPackage ./python-modules/jsonstreams { }; + +# json-tricks = callPackage ./python-modules/json-tricks { }; + +# jstyleson = callPackage ./python-modules/jstyleson { }; + +# jug = callPackage ./python-modules/jug { }; + +# julius = callPackage ./python-modules/julius { }; + +# junitparser = callPackage ./python-modules/junitparser { }; + +# junit2html = callPackage ./python-modules/junit2html { }; + +# junit-xml = callPackage ./python-modules/junit-xml { }; + +# junos-eznc = callPackage ./python-modules/junos-eznc { }; + +# jupyter = callPackage ./python-modules/jupyter { }; + +# jupyter-book = callPackage ./python-modules/jupyter-book { }; + +# jupyter-c-kernel = callPackage ./python-modules/jupyter-c-kernel { }; + +# jupyter-cache = callPackage ./python-modules/jupyter-cache { }; + +# jupyter-client = callPackage ./python-modules/jupyter-client { }; + +# jupyter-collaboration = callPackage ./python-modules/jupyter-collaboration { }; + +# jupyter-contrib-core = callPackage ./python-modules/jupyter-contrib-core { }; + +# jupyter-contrib-nbextensions = callPackage ./python-modules/jupyter-contrib-nbextensions { }; + +# jupyter-console = callPackage ./python-modules/jupyter-console { }; + +# jupyter-core = callPackage ./python-modules/jupyter-core { }; + +# jupyter-events = callPackage ./python-modules/jupyter-events { }; + +# jupyter-highlight-selected-word = callPackage ./python-modules/jupyter-highlight-selected-word { }; + +# jupyter-lsp = callPackage ./python-modules/jupyter-lsp { }; + +# jupyter-nbextensions-configurator = callPackage ./python-modules/jupyter-nbextensions-configurator { }; + +# jupyter-server = callPackage ./python-modules/jupyter-server { }; + +# jupyter-server-fileid = callPackage ./python-modules/jupyter-server-fileid { }; + +# jupyter-server-terminals = callPackage ./python-modules/jupyter-server-terminals { }; + +# jupyter-ui-poll = callPackage ./python-modules/jupyter-ui-poll { }; + +# jupyter-ydoc = callPackage ./python-modules/jupyter-ydoc { }; + +# jupyterhub = callPackage ./python-modules/jupyterhub { }; + +# jupyterhub-ldapauthenticator = callPackage ./python-modules/jupyterhub-ldapauthenticator { }; + +# jupyterhub-systemdspawner = callPackage ./python-modules/jupyterhub-systemdspawner { }; + +# jupyterhub-tmpauthenticator = callPackage ./python-modules/jupyterhub-tmpauthenticator { }; + +# jupyterlab = callPackage ./python-modules/jupyterlab { }; + +# jupyterlab-git = callPackage ./python-modules/jupyterlab-git { }; + +# jupyterlab-pygments = callPackage ./python-modules/jupyterlab-pygments { }; + +# jupyterlab-server = callPackage ./python-modules/jupyterlab-server { }; + +# jupyterlab-widgets = callPackage ./python-modules/jupyterlab-widgets { }; + +# jupyterlab-lsp = callPackage ./python-modules/jupyterlab-lsp { }; + +# jupyter-packaging = callPackage ./python-modules/jupyter-packaging { }; + +# jupyter-repo2docker = callPackage ./python-modules/jupyter-repo2docker { +# pkgs-docker = pkgs.docker; +# }; + +# jupyter-server-mathjax = callPackage ./python-modules/jupyter-server-mathjax { }; + +# jupyter-sphinx = callPackage ./python-modules/jupyter-sphinx { }; + +# jupyter-telemetry = callPackage ./python-modules/jupyter-telemetry { }; + +# jupytext = callPackage ./python-modules/jupytext { }; + +# justbackoff = callPackage ./python-modules/justbackoff { }; + +# justbases = callPackage ./python-modules/justbases { }; + +# justbytes = callPackage ./python-modules/justbytes { }; + +# justext = callPackage ./python-modules/justext { }; + +# justnimbus = callPackage ./python-modules/justnimbus { }; + +# jwcrypto = callPackage ./python-modules/jwcrypto { }; + +# jwt = callPackage ./python-modules/jwt { }; + +# jxmlease = callPackage ./python-modules/jxmlease { }; + +# k-diffusion = callPackage ./python-modules/k-diffusion { }; + +# k5test = callPackage ./python-modules/k5test { +# inherit (pkgs) krb5 findutils; +# }; + +# kaa-base = callPackage ./python-modules/kaa-base { }; + +# kaa-metadata = callPackage ./python-modules/kaa-metadata { }; + +# kafka-python = callPackage ./python-modules/kafka-python { }; + +# kaggle = callPackage ./python-modules/kaggle { }; + +# kaitaistruct = callPackage ./python-modules/kaitaistruct { }; + +# kajiki = callPackage ./python-modules/kajiki { }; + +# kaldi-active-grammar = callPackage ./python-modules/kaldi-active-grammar { }; + +# kanidm = callPackage ./python-modules/kanidm { }; + +# kaptan = callPackage ./python-modules/kaptan { }; + +# karton-asciimagic = callPackage ./python-modules/karton-asciimagic { }; + +# karton-autoit-ripper = callPackage ./python-modules/karton-autoit-ripper { }; + +# karton-classifier = callPackage ./python-modules/karton-classifier { }; + +# karton-config-extractor = callPackage ./python-modules/karton-config-extractor { }; + +# karton-core = callPackage ./python-modules/karton-core { }; + +# karton-dashboard = callPackage ./python-modules/karton-dashboard { }; + +# karton-mwdb-reporter = callPackage ./python-modules/karton-mwdb-reporter { }; + +# karton-yaramatcher = callPackage ./python-modules/karton-yaramatcher { }; + +# kasa-crypt = callPackage ./python-modules/kasa-crypt { }; + +# kazoo = callPackage ./python-modules/kazoo { }; + +# kbcstorage = callPackage ./python-modules/kbcstorage { }; + +# kconfiglib = callPackage ./python-modules/kconfiglib { }; + +# keba-kecontact = callPackage ./python-modules/keba-kecontact { }; + +# keep = callPackage ./python-modules/keep { }; + +# keepalive = callPackage ./python-modules/keepalive { }; + +# keepkey-agent = callPackage ./python-modules/keepkey-agent { }; + +# keepkey = callPackage ./python-modules/keepkey { }; + +# kegtron-ble = callPackage ./python-modules/kegtron-ble { }; + +# keras-applications = callPackage ./python-modules/keras-applications { }; + +# keras = callPackage ./python-modules/keras { }; + +# keras-preprocessing = callPackage ./python-modules/keras-preprocessing { }; + +# kerberos = callPackage ./python-modules/kerberos { }; + +# keyboard = callPackage ./python-modules/keyboard { }; + +# keyring = callPackage ./python-modules/keyring { }; + +# keyring-pass = callPackage ./python-modules/keyring-pass { }; + +# keyrings-cryptfile = callPackage ./python-modules/keyrings-cryptfile { }; + +# keyrings-google-artifactregistry-auth = callPackage ./python-modules/keyrings-google-artifactregistry-auth { }; + +# keyrings-alt = callPackage ./python-modules/keyrings-alt { }; + +# keystone-engine = callPackage ./python-modules/keystone-engine { }; + +# keyrings-passwordstore = callPackage ./python-modules/keyrings-passwordstore { }; + +# keystoneauth1 = callPackage ./python-modules/keystoneauth1 { }; + +# keyutils = callPackage ./python-modules/keyutils { +# inherit (pkgs) keyutils; +# }; + +# khanaa = callPackage ./python-modules/khanaa {}; + +# kicad = toPythonModule (pkgs.kicad.override { +# python3 = python; +# }).src; + +# kinparse = callPackage ./python-modules/kinparse { }; + +# kiss-headers = callPackage ./python-modules/kiss-headers { }; + +# kitchen = callPackage ./python-modules/kitchen { }; + +# kivy = callPackage ./python-modules/kivy { +# inherit (pkgs) mesa; +# inherit (pkgs.darwin.apple_sdk.frameworks) Accelerate ApplicationServices AVFoundation; +# }; + +# kivy-garden = callPackage ./python-modules/kivy-garden { }; + +# kiwiki-client = callPackage ./python-modules/kiwiki-client { }; + +# kiwisolver = callPackage ./python-modules/kiwisolver { }; + +# klaus = callPackage ./python-modules/klaus { }; + +# klein = callPackage ./python-modules/klein { }; + +# kmapper = callPackage ./python-modules/kmapper { }; + +# kml2geojson = callPackage ./python-modules/kml2geojson { }; + +# kmsxx = toPythonModule (pkgs.kmsxx.override { +# withPython = true; +# }); + +# knack = callPackage ./python-modules/knack { }; + +# kneed = callPackage ./python-modules/kneed { }; + +# knx-frontend = callPackage ./python-modules/knx-frontend { }; + +# kombu = callPackage ./python-modules/kombu { }; + +# konnected = callPackage ./python-modules/konnected { }; + +# kotsu = callPackage ./python-modules/kotsu { }; + +# korean-lunar-calendar = callPackage ./python-modules/korean-lunar-calendar { }; + +# kornia = callPackage ./python-modules/kornia { }; + +# kornia-rs = callPackage ./python-modules/kornia-rs { }; + +# krakenex = callPackage ./python-modules/krakenex { }; + +# krfzf-py = callPackage ./python-modules/krfzf-py { }; + +# kserve = callPackage ./python-modules/kserve { }; + +# kubernetes = callPackage ./python-modules/kubernetes { }; + +# kurbopy = callPackage ./python-modules/kurbopy { }; + +# l18n = callPackage ./python-modules/l18n { }; + +# labelbox = callPackage ./python-modules/labelbox { }; + +# labgrid = callPackage ./python-modules/labgrid { }; + +# labmath = callPackage ./python-modules/labmath { }; + +# laces = callPackage ./python-modules/laces { }; + +# lacuscore = callPackage ./python-modules/lacuscore { }; + +# lakeside = callPackage ./python-modules/lakeside { }; + +# langchain = callPackage ./python-modules/langchain { }; + +# langchain-community = callPackage ./python-modules/langchain-community { }; + +# langchain-core = callPackage ./python-modules/langchain-core { }; + +# langchain-text-splitters = callPackage ./python-modules/langchain-text-splitters { }; + +# langcodes = callPackage ./python-modules/langcodes { }; + +# langdetect = callPackage ./python-modules/langdetect { }; + +# langid = callPackage ./python-modules/langid { }; + +# langsmith = callPackage ./python-modules/langsmith { }; + +# language-data = callPackage ./python-modules/language-data { }; + +# language-tags = callPackage ./python-modules/language-tags { }; + +# lanms-neo = callPackage ./python-modules/lanms-neo { }; + +# lark = callPackage ./python-modules/lark { }; + +# laspy = callPackage ./python-modules/laspy { }; + +# laszip = callPackage ./python-modules/laszip { +# inherit (pkgs) cmake ninja; +# }; + +# latex2mathml = callPackage ./python-modules/latex2mathml { }; + +# latexcodec = callPackage ./python-modules/latexcodec { }; + +# latexify-py = callPackage ./python-modules/latexify-py { }; + +# launchpadlib = callPackage ./python-modules/launchpadlib { }; + +# laundrify-aio = callPackage ./python-modules/laundrify-aio { }; + +# layoutparser = callPackage ./python-modules/layoutparser { }; + +# lazr-config = callPackage ./python-modules/lazr/config.nix { }; + +# lazr-delegates = callPackage ./python-modules/lazr/delegates.nix { }; + +# lazr-restfulclient = callPackage ./python-modules/lazr-restfulclient { }; + +# lazr-uri = callPackage ./python-modules/lazr-uri { }; + +# lazy = callPackage ./python-modules/lazy { }; + +# lazy-import = callPackage ./python-modules/lazy-import { }; + +# lazy-imports = callPackage ./python-modules/lazy-imports { }; + +# lazy-loader = callPackage ./python-modules/lazy-loader { }; + +# lazy-object-proxy = callPackage ./python-modules/lazy-object-proxy { }; + +# lc7001 = callPackage ./python-modules/lc7001 { }; + +# lcd-i2c = callPackage ./python-modules/lcd-i2c { }; + +# lcgit = callPackage ./python-modules/lcgit { }; + +# lcov-cobertura = callPackage ./python-modules/lcov-cobertura { }; + +# ld2410-ble = callPackage ./python-modules/ld2410-ble { }; + +# ldap3 = callPackage ./python-modules/ldap3 { }; + +# ldapdomaindump = callPackage ./python-modules/ldapdomaindump { }; + +# ldappool = callPackage ./python-modules/ldappool { }; + +# ldaptor = callPackage ./python-modules/ldaptor { }; + +# ldfparser = callPackage ./python-modules/ldfparser { }; + +# leather = callPackage ./python-modules/leather { }; + +# leb128 = callPackage ./python-modules/leb128 { }; + +# led-ble = callPackage ./python-modules/led-ble { }; + +# ledger = (toPythonModule (pkgs.ledger.override { +# usePython = true; +# python3 = python; +# })).py; + +# ledger-agent = callPackage ./python-modules/ledger-agent { }; + +# ledger-bitcoin = callPackage ./python-modules/ledger-bitcoin { }; + +# ledgerblue = callPackage ./python-modules/ledgerblue { }; + +# ledgercomm = callPackage ./python-modules/ledgercomm { }; + +# ledgerwallet = callPackage ./python-modules/ledgerwallet { +# inherit (pkgs.darwin.apple_sdk.frameworks) AppKit; +# }; + +# leidenalg = callPackage ./python-modules/leidenalg { +# igraph-c = pkgs.igraph; +# }; + +# leveldb = callPackage ./python-modules/leveldb { }; + +# levenshtein = callPackage ./python-modules/levenshtein { }; + +# lexid = callPackage ./python-modules/lexid { }; + +# lexilang = callPackage ./python-modules/lexilang { }; + +# lhapdf = toPythonModule (pkgs.lhapdf.override { +# inherit python; +# }); + +# libagent = callPackage ./python-modules/libagent { }; + +# pa-ringbuffer = callPackage ./python-modules/pa-ringbuffer { }; + +# libais = callPackage ./python-modules/libais { }; + +# libarchive-c = callPackage ./python-modules/libarchive-c { +# inherit (pkgs) libarchive; +# }; + +# libarcus = callPackage ./python-modules/libarcus { +# protobuf = pkgs.protobuf_21; +# }; + +# libasyncns = callPackage ./python-modules/libasyncns { +# inherit (pkgs) libasyncns; +# }; + +# libclang = callPackage ./python-modules/libclang { }; + +# libcloud = callPackage ./python-modules/libcloud { }; + +# libcomps = lib.pipe pkgs.libcomps [ +# toPythonModule +# (p: p.overrideAttrs (super: { meta = super.meta // { outputsToInstall = [ "py" ]; }; })) +# (p: p.override { inherit python; }) +# (p: p.py) +# ]; + +# libcst = callPackage ./python-modules/libcst { }; + +# libdnf = lib.pipe pkgs.libdnf [ +# toPythonModule +# (p: p.overrideAttrs (super: { meta = super.meta // { outputsToInstall = [ "py" ]; }; })) +# (p: p.override { inherit python; }) +# (p: p.py) +# ]; + +# libevdev = callPackage ./python-modules/libevdev { }; + +# libfdt = toPythonModule (pkgs.dtc.override { +# inherit python; +# pythonSupport = true; +# }); + +# libfive = toPythonModule (pkgs.libfive.override { +# inherit python; +# }); + +# libgpiod = callPackage ./python-modules/libgpiod { +# inherit (pkgs) libgpiod; +# }; + +# libgpuarray = callPackage ./python-modules/libgpuarray { +# clblas = pkgs.clblas.override { inherit (self) boost; }; +# inherit (pkgs.config) cudaSupport; +# }; + +# libiio = (toPythonModule (pkgs.libiio.override { +# pythonSupport = true; +# inherit python; +# })).python; + +# libkeepass = callPackage ./python-modules/libkeepass { }; + +# libknot = callPackage ./python-modules/libknot { }; + +# liblarch = callPackage ./python-modules/liblarch { }; + +# liblzfse = callPackage ./python-modules/liblzfse { +# inherit (pkgs) lzfse; +# }; + +# libmambapy = callPackage ./python-modules/libmambapy { }; + +# libmodulemd = lib.pipe pkgs.libmodulemd [ +# toPythonModule +# (p: +# p.overrideAttrs (super: { +# meta = super.meta // { +# outputsToInstall = [ "py" ]; # The package always builds python3 bindings +# broken = (super.meta.broken or false) || !isPy3k; +# }; +# })) +# (p: p.override { python3 = python; }) +# (p: p.py) +# ]; + +# libmr = callPackage ./python-modules/libmr { }; + +# libnacl = callPackage ./python-modules/libnacl { +# inherit (pkgs) libsodium; +# }; + +# libpcap = callPackage ./python-modules/libpcap { +# pkgsLibpcap = pkgs.libpcap; # Needs the C library +# }; + +# libpurecool = callPackage ./python-modules/libpurecool { }; + +# libpyfoscam = callPackage ./python-modules/libpyfoscam { }; + +# libpyvivotek = callPackage ./python-modules/libpyvivotek { }; + +# libpwquality = lib.pipe pkgs.libpwquality [ +# toPythonModule +# (p: p.overrideAttrs (super: { meta = super.meta // { outputsToInstall = [ "py" ]; }; })) +# (p: p.override { enablePython = true; inherit python; }) +# (p: p.py) +# ]; + +# libredwg = toPythonModule (pkgs.libredwg.override { +# enablePython = true; +# inherit (self) python libxml2; +# }); + +# librepo = lib.pipe pkgs.librepo [ +# toPythonModule +# (p: p.overrideAttrs (super: { meta = super.meta // { outputsToInstall = [ "py" ]; }; })) +# (p: p.override { inherit python; }) +# (p: p.py) +# ]; + +# librespot = callPackage ./python-modules/librespot { }; + +# libretranslate = callPackage ./python-modules/libretranslate { }; + +# librosa = callPackage ./python-modules/librosa { }; + +# librouteros = callPackage ./python-modules/librouteros { }; + +# libsass = callPackage ./python-modules/libsass { +# inherit (pkgs) libsass; +# }; + +# libsavitar = callPackage ./python-modules/libsavitar { }; + + +# libsixel = callPackage ./python-modules/libsixel { +# inherit (pkgs) libsixel; +# }; + +# libselinux = lib.pipe pkgs.libselinux [ +# toPythonModule +# (p: +# p.overrideAttrs (super: { +# meta = super.meta // { +# outputsToInstall = [ "py" ]; +# broken = super.meta.broken or isPy27; +# }; +# })) +# (p: +# p.override { +# enablePython = true; +# python3 = python; +# }) +# (p: p.py) +# ]; + +# libsoundtouch = callPackage ./python-modules/libsoundtouch { }; + +# libthumbor = callPackage ./python-modules/libthumbor { }; + +# libtmux = callPackage ./python-modules/libtmux { }; + +# libtorrent-rasterbar = (toPythonModule (pkgs.libtorrent-rasterbar.override { inherit python; })).python; + +# libusb1 = callPackage ./python-modules/libusb1 { +# inherit (pkgs) libusb1; +# }; + +# libusbsio = callPackage ./python-modules/libusbsio { +# inherit (pkgs) libusbsio; +# }; + +# libversion = callPackage ./python-modules/libversion { +# inherit (pkgs) libversion; +# }; + +# libvirt = callPackage ./python-modules/libvirt { +# inherit (pkgs) libvirt; +# }; + + libxml2 = (toPythonModule (pkgs.libxml2.override { + pythonSupport = true; + inherit python; + })).py; + +# libxslt = (toPythonModule (pkgs.libxslt.override { +# pythonSupport = true; +# inherit (self) python libxml2; +# })).py; + +# liccheck = callPackage ./python-modules/liccheck { }; + +# license-expression = callPackage ./python-modules/license-expression { }; + +# lief = (toPythonModule (pkgs.lief.override { +# inherit python; +# })).py; + +# life360 = callPackage ./python-modules/life360 { }; + +# lifelines = callPackage ./python-modules/lifelines { }; + +# lightgbm = callPackage ./python-modules/lightgbm { }; + +# lightning-utilities = callPackage ./python-modules/lightning-utilities { }; + +# lightparam = callPackage ./python-modules/lightparam { }; + +# lightwave = callPackage ./python-modules/lightwave { }; + +# lightwave2 = callPackage ./python-modules/lightwave2 { }; + +# lima = callPackage ./python-modules/lima { }; + +# lime = callPackage ./python-modules/lime { }; + +# limiter= callPackage ./python-modules/limiter { }; + +# limitlessled = callPackage ./python-modules/limitlessled { }; + +# limits = callPackage ./python-modules/limits { }; + +# limnoria = callPackage ./python-modules/limnoria { }; + +# linear-garage-door = callPackage ./python-modules/linear-garage-door { }; + +# linear-operator = callPackage ./python-modules/linear-operator { }; + +# linecache2 = callPackage ./python-modules/linecache2 { }; + +# lineedit = callPackage ./python-modules/lineedit { }; + +# line-profiler = callPackage ./python-modules/line-profiler { }; + +# linetable = callPackage ./python-modules/linetable { }; + +# lingua = callPackage ./python-modules/lingua { }; + +# lingva = callPackage ./python-modules/lingva { }; + +# linien-client = callPackage ./python-modules/linien-client { }; + +# linien-common = callPackage ./python-modules/linien-common { }; + +# linkify-it-py = callPackage ./python-modules/linkify-it-py { }; + +# linknlink = callPackage ./python-modules/linknlink { }; + +# linode-api = callPackage ./python-modules/linode-api { }; + +# linode = callPackage ./python-modules/linode { }; + +# linuxfd = callPackage ./python-modules/linuxfd { }; + +# lion-pytorch = callPackage ./python-modules/lion-pytorch { }; + +# liquidctl = callPackage ./python-modules/liquidctl { }; + +# lirc = toPythonModule (pkgs.lirc.override { +# python3 = python; +# }); + +# lit = callPackage ./python-modules/lit { }; + +# litellm = callPackage ./python-modules/litellm { }; + +# litemapy = callPackage ./python-modules/litemapy { }; + +# littleutils = callPackage ./python-modules/littleutils { }; + +# livelossplot = callPackage ./python-modules/livelossplot { }; + +# livereload = callPackage ./python-modules/livereload { }; + +# lizard = callPackage ./python-modules/lizard { }; + +# llama-index = callPackage ./python-modules/llama-index { }; + +# llama-index-agent-openai = callPackage ./python-modules/llama-index-agent-openai { }; + +# llama-index-cli = callPackage ./python-modules/llama-index-cli { }; + +# llama-index-core = callPackage ./python-modules/llama-index-core { }; + +# llama-index-embeddings-gemini = callPackage ./python-modules/llama-index-embeddings-gemini { }; + +# llama-index-embeddings-google = callPackage ./python-modules/llama-index-embeddings-google { }; + +# llama-index-embeddings-huggingface = callPackage ./python-modules/llama-index-embeddings-huggingface { }; + +# llama-index-embeddings-ollama = callPackage ./python-modules/llama-index-embeddings-ollama { }; + +# llama-index-embeddings-openai = callPackage ./python-modules/llama-index-embeddings-openai { }; + +# llama-index-graph-stores-nebula = callPackage ./python-modules/llama-index-graph-stores-nebula { }; + +# llama-index-graph-stores-neo4j = callPackage ./python-modules/llama-index-graph-stores-neo4j { }; + +# llama-index-graph-stores-neptune = callPackage ./python-modules/llama-index-graph-stores-neptune { }; + +# llama-index-indices-managed-llama-cloud = callPackage ./python-modules/llama-index-indices-managed-llama-cloud { }; + +# llama-index-legacy = callPackage ./python-modules/llama-index-legacy { }; + +# llama-index-llms-ollama = callPackage ./python-modules/llama-index-llms-ollama { }; + +# llama-index-llms-openai = callPackage ./python-modules/llama-index-llms-openai { }; + +# llama-index-llms-openai-like = callPackage ./python-modules/llama-index-llms-openai-like { }; + +# llama-index-multi-modal-llms-openai = callPackage ./python-modules/llama-index-multi-modal-llms-openai { }; + +# llama-index-program-openai = callPackage ./python-modules/llama-index-program-openai { }; + +# llama-index-question-gen-openai = callPackage ./python-modules/llama-index-question-gen-openai { }; + +# llama-index-readers-database = callPackage ./python-modules/llama-index-readers-database { }; + +# llama-index-readers-file = callPackage ./python-modules/llama-index-readers-file { }; + +# llama-index-readers-json = callPackage ./python-modules/llama-index-readers-json { }; + +# llama-index-readers-llama-parse = callPackage ./python-modules/llama-index-readers-llama-parse { }; + +# llama-index-readers-s3 = callPackage ./python-modules/llama-index-readers-s3 { }; + +# llama-index-readers-twitter = callPackage ./python-modules/llama-index-readers-twitter { }; + +# llama-index-readers-txtai = callPackage ./python-modules/llama-index-readers-txtai { }; + +# llama-index-readers-weather = callPackage ./python-modules/llama-index-readers-weather { }; + +# llama-index-vector-stores-chroma = callPackage ./python-modules/llama-index-vector-stores-chroma { }; + +# llama-index-vector-stores-google = callPackage ./python-modules/llama-index-vector-stores-google { }; + +# llama-index-vector-stores-postgres = callPackage ./python-modules/llama-index-vector-stores-postgres { }; + +# llama-index-vector-stores-qdrant = callPackage ./python-modules/llama-index-vector-stores-qdrant { }; + +# llama-parse = callPackage ./python-modules/llama-parse { }; + +# llamaindex-py-client = callPackage ./python-modules/llamaindex-py-client { }; + +# llfuse = callPackage ./python-modules/llfuse { +# inherit (pkgs) fuse; +# }; + +# llm = callPackage ./python-modules/llm { }; + +# llvmlite = callPackage ./python-modules/llvmlite { +# # llvmlite always requires a specific version of llvm. +# llvm = pkgs.llvm_14; +# }; + +# lmcloud = callPackage ./python-modules/lmcloud { }; + +# lmdb = callPackage ./python-modules/lmdb { +# inherit (pkgs) lmdb; +# }; + +# lmfit = callPackage ./python-modules/lmfit { }; + +# lml = callPackage ./python-modules/lml { }; + +# lmnotify = callPackage ./python-modules/lmnotify { }; + +# lmtpd = callPackage ./python-modules/lmtpd { }; + +# lnkparse3 = callPackage ./python-modules/lnkparse3 { }; + +# loca = callPackage ./python-modules/loca { }; + +# localimport = callPackage ./python-modules/localimport { }; + +# localstack = callPackage ./python-modules/localstack { }; + +# localstack-client = callPackage ./python-modules/localstack-client { }; + +# localstack-ext = callPackage ./python-modules/localstack-ext { }; + +# localzone = callPackage ./python-modules/localzone { }; + +# locationsharinglib = callPackage ./python-modules/locationsharinglib { }; + +# locket = callPackage ./python-modules/locket { }; + +# lockfile = callPackage ./python-modules/lockfile { }; + +# log-symbols = callPackage ./python-modules/log-symbols { }; + +# logbook = callPackage ./python-modules/logbook { }; + +# logfury = callPackage ./python-modules/logfury { }; + +# logging-journald = callPackage ./python-modules/logging-journald { }; + +# logi-circle = callPackage ./python-modules/logi-circle { }; + +# logical-unification = callPackage ./python-modules/logical-unification { }; + +# logilab-common = callPackage ./python-modules/logilab/common.nix { }; + +# logilab-constraint = callPackage ./python-modules/logilab/constraint.nix { }; + +# logmatic-python = callPackage ./python-modules/logmatic-python { }; + +# logster = callPackage ./python-modules/logster { }; + +# loguru = callPackage ./python-modules/loguru { }; + +# logutils = callPackage ./python-modules/logutils { +# redis-server = pkgs.redis; +# }; + +# logzero = callPackage ./python-modules/logzero { }; + +# lomond = callPackage ./python-modules/lomond { }; + +# loopy = callPackage ./python-modules/loopy { }; + +# looseversion = callPackage ./python-modules/looseversion { }; + +# loqedapi = callPackage ./python-modules/loqedapi { }; + +# losant-rest = callPackage ./python-modules/losant-rest { }; + +# lpc-checksum = callPackage ./python-modules/lpc-checksum { }; + +# lrcalc-python = callPackage ./python-modules/lrcalc-python { }; + +# lru-dict = callPackage ./python-modules/lru-dict { }; + +# lsassy = callPackage ./python-modules/lsassy { }; + +# lsprotocol = callPackage ./python-modules/lsprotocol { }; + +# ltpycld2 = callPackage ./python-modules/ltpycld2 { }; + +# lttng = callPackage ./python-modules/lttng { }; + +# luddite = callPackage ./python-modules/luddite { }; + +# luftdaten = callPackage ./python-modules/luftdaten { }; + +# luhn = callPackage ./python-modules/luhn { }; + +# lunarcalendar = callPackage ./python-modules/lunarcalendar { }; + +# luqum = callPackage ./python-modules/luqum { }; + +# luxor = callPackage ./python-modules/luxor { }; + +# luxtronik = callPackage ./python-modules/luxtronik { }; + +# lupa = callPackage ./python-modules/lupa { }; + +# lupupy = callPackage ./python-modules/lupupy { }; + +# lxmf= callPackage ./python-modules/lxmf { }; + + lxml = callPackage ./python-modules/lxml { + inherit (pkgs) libxml2 libxslt zlib; + }; + +# lxml-html-clean = callPackage ./python-modules/lxml-html-clean { }; + +# lxml-stubs = callPackage ./python-modules/lxml-stubs { }; + +# lyricwikia = callPackage ./python-modules/lyricwikia { }; + +# lz4 = callPackage ./python-modules/lz4 { }; + +# lzallright = callPackage ./python-modules/lzallright { }; + +# lzstring = callPackage ./python-modules/lzstring { }; + +# m2crypto = callPackage ./python-modules/m2crypto { }; + +# m2r = callPackage ./python-modules/m2r { }; + +# m3u8 = callPackage ./python-modules/m3u8 { }; + +# mac-alias = callPackage ./python-modules/mac-alias { }; + +# mac-vendor-lookup = callPackage ./python-modules/mac-vendor-lookup { }; + +# macaddress = callPackage ./python-modules/macaddress{ }; + +# macfsevents = callPackage ./python-modules/macfsevents { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreFoundation CoreServices; +# }; + +# macropy = callPackage ./python-modules/macropy { }; + +# maestral = callPackage ./python-modules/maestral { }; + +# magic = callPackage ./python-modules/magic { }; + +# magicgui = callPackage ./python-modules/magicgui { }; + +# magic-filter = callPackage ./python-modules/magic-filter { }; + +# magic-wormhole = callPackage ./python-modules/magic-wormhole { }; + +# magic-wormhole-mailbox-server = callPackage ./python-modules/magic-wormhole-mailbox-server { }; + +# magic-wormhole-transit-relay = callPackage ./python-modules/magic-wormhole-transit-relay { }; + +# magika = callPackage ./python-modules/magika { }; + +# mahotas = callPackage ./python-modules/mahotas { }; + +# mailcap-fix = callPackage ./python-modules/mailcap-fix { }; + +# mailchecker = callPackage ./python-modules/mailchecker { }; + +# mailchimp = callPackage ./python-modules/mailchimp { }; + +# mailmanclient = callPackage ./python-modules/mailmanclient { }; + +# rtfde = callPackage ./python-modules/rtfde { }; + +# rtfunicode = callPackage ./python-modules/rtfunicode { }; + +# rtmixer = callPackage ./python-modules/rtmixer { }; + +# regress = callPackage ./python-modules/regress { }; + +# macaroonbakery = callPackage ./python-modules/macaroonbakery { }; + +# mail-parser = callPackage ./python-modules/mail-parser { }; + +# makefun = callPackage ./python-modules/makefun { }; + +# mailsuite = callPackage ./python-modules/mailsuite { }; + +# maison = callPackage ./python-modules/maison { }; + +# mako = callPackage ./python-modules/mako { }; + +# malduck = callPackage ./python-modules/malduck { }; + +# managesieve = callPackage ./python-modules/managesieve { }; + +# mando = callPackage ./python-modules/mando { }; + +# mandown = callPackage ./python-modules/mandown { }; + +# manga-ocr = callPackage ./python-modules/manga-ocr { }; + +# manhole = callPackage ./python-modules/manhole { }; + +# manim = callPackage ./python-modules/manim { }; + +# manimpango = callPackage ./python-modules/manimpango { +# inherit (pkgs.darwin.apple_sdk.frameworks) AppKit; +# }; + +# manim-slides = callPackage ./python-modules/manim-slides { }; + +# manifest-ml = callPackage ./python-modules/manifest-ml { }; + +# manifestoo = callPackage ./python-modules/manifestoo { }; + +# manifestoo-core = callPackage ./python-modules/manifestoo-core { }; + +# manifestparser = callPackage ./python-modules/marionette-harness/manifestparser.nix { }; + +# manuel = callPackage ./python-modules/manuel { }; + +# manuf = callPackage ./python-modules/manuf { }; + +# mapbox = callPackage ./python-modules/mapbox { }; + +# mapbox-earcut = callPackage ./python-modules/mapbox-earcut { }; + +# mariadb = callPackage ./python-modules/mariadb { }; + +# marimo = callPackage ./python-modules/marimo { }; + +# marisa = callPackage ./python-modules/marisa { +# inherit (pkgs) marisa; +# }; + +# marisa-trie = callPackage ./python-modules/marisa-trie { }; + +# markdown2 = callPackage ./python-modules/markdown2 { }; + +# markdown = callPackage ./python-modules/markdown { }; + +# markdown-include = callPackage ./python-modules/markdown-include { }; + +# markdown-it-py = callPackage ./python-modules/markdown-it-py { }; + +# markdown-macros = callPackage ./python-modules/markdown-macros { }; + +# markdownify = callPackage ./python-modules/markdownify { }; + + markupsafe = callPackage ./python-modules/markupsafe { }; + +# markuppy = callPackage ./python-modules/markuppy { }; + +# markups = callPackage ./python-modules/markups { }; + +# marshmallow = callPackage ./python-modules/marshmallow { }; + +# marshmallow-dataclass = callPackage ./python-modules/marshmallow-dataclass { }; + +# marshmallow-enum = callPackage ./python-modules/marshmallow-enum { }; + +# marshmallow-oneofschema = callPackage ./python-modules/marshmallow-oneofschema { }; + +# marshmallow-polyfield = callPackage ./python-modules/marshmallow-polyfield { }; + +# marshmallow-sqlalchemy = callPackage ./python-modules/marshmallow-sqlalchemy { }; + +# mashumaro = callPackage ./python-modules/mashumaro { }; + +# masky = callPackage ./python-modules/masky { }; + +# mastodon-py = callPackage ./python-modules/mastodon-py { }; + +# mat2 = callPackage ./python-modules/mat2 { }; + +# material-color-utilities = callPackage ./python-modules/material-color-utilities { }; + +# matchpy = callPackage ./python-modules/matchpy { }; + +# mathlibtools = callPackage ./python-modules/mathlibtools { }; + +# matlink-gpapi = callPackage ./python-modules/matlink-gpapi { }; + +# matplotlib = callPackage ./python-modules/matplotlib { +# stdenv = if stdenv.isDarwin then pkgs.clangStdenv else pkgs.stdenv; +# inherit (pkgs.darwin.apple_sdk.frameworks) Cocoa; +# ghostscript = pkgs.ghostscript_headless; +# }; + +# matplotlib-inline = callPackage ./python-modules/matplotlib-inline { }; + +# matplotlib-sixel = callPackage ./python-modules/matplotlib-sixel { }; + +# matplotx = callPackage ./python-modules/matplotx { }; + +# matrix-api-async = callPackage ./python-modules/matrix-api-async { }; + +# matrix-client = callPackage ./python-modules/matrix-client { }; + +# matrix-common = callPackage ./python-modules/matrix-common { }; + +# matrix-nio = callPackage ./python-modules/matrix-nio { }; + +# mattermostdriver = callPackage ./python-modules/mattermostdriver { }; + +# maubot = callPackage ../tools/networking/maubot { }; + +# mautrix = callPackage ./python-modules/mautrix { }; + +# mautrix-appservice = self.mautrix; # alias 2019-12-28 + +# maxcube-api = callPackage ./python-modules/maxcube-api { }; + +# maxminddb = callPackage ./python-modules/maxminddb { }; + +# maya = callPackage ./python-modules/maya { }; + +# mayavi = pkgs.libsForQt5.callPackage ./python-modules/mayavi { +# inherit (self) buildPythonPackage pythonOlder pythonAtLeast pyface pygments numpy packaging vtk traitsui envisage apptools pyqt5; +# }; + +# mayim = callPackage ./python-modules/mayim { }; + +# mbddns = callPackage ./python-modules/mbddns { }; + +# mbstrdecoder = callPackage ./python-modules/mbstrdecoder { }; + +# mccabe = callPackage ./python-modules/mccabe { }; + +# mcstatus = callPackage ./python-modules/mcstatus { }; + +# mcuuid = callPackage ./python-modules/mcuuid { }; + +# md-toc = callPackage ./python-modules/md-toc { }; + +# mdx-truly-sane-lists = callPackage ./python-modules/mdx-truly-sane-lists { }; + +# md2gemini = callPackage ./python-modules/md2gemini { }; + +# mdformat = callPackage ./python-modules/mdformat { }; +# mdformat-admon = callPackage ./python-modules/mdformat-admon { }; +# mdformat-beautysh = callPackage ./python-modules/mdformat-beautysh { }; +# mdformat-footnote = callPackage ./python-modules/mdformat-footnote { }; +# mdformat-frontmatter = callPackage ./python-modules/mdformat-frontmatter { }; +# mdformat-gfm = callPackage ./python-modules/mdformat-gfm { }; +# mdformat-mkdocs = callPackage ./python-modules/mdformat-mkdocs { }; +# mdformat-nix-alejandra = callPackage ./python-modules/mdformat-nix-alejandra { }; +# mdformat-simple-breaks = callPackage ./python-modules/mdformat-simple-breaks { }; +# mdformat-tables = callPackage ./python-modules/mdformat-tables { }; +# mdformat-toc = callPackage ./python-modules/mdformat-toc { }; + +# mdit-py-plugins = callPackage ./python-modules/mdit-py-plugins { }; + +# mdtraj = callPackage ./python-modules/mdtraj { }; + +# mdurl = callPackage ./python-modules/mdurl { }; + +# mdutils = callPackage ./python-modules/mdutils { }; + +# mdp = callPackage ./python-modules/mdp { }; + +# measurement = callPackage ./python-modules/measurement { }; + +# meater-python = callPackage ./python-modules/meater-python { }; + +# mecab-python3 = callPackage ./python-modules/mecab-python3 { }; + +# mechanicalsoup = callPackage ./python-modules/mechanicalsoup { }; + +# mechanize = callPackage ./python-modules/mechanize { }; + +# mediafile = callPackage ./python-modules/mediafile { }; + +# mediafire-dl = callPackage ./python-modules/mediafire-dl { }; + +# mediapy = callPackage ./python-modules/mediapy { }; + +# medpy = callPackage ./python-modules/medpy { }; + +# meeko = callPackage ./python-modules/meeko { }; + +# meep = callPackage ./python-modules/meep { }; + +# meilisearch = callPackage ./python-modules/meilisearch { }; + +# meinheld = callPackage ./python-modules/meinheld { }; + +# meld3 = callPackage ./python-modules/meld3 { }; + +# memestra = callPackage ./python-modules/memestra { }; + +# memory-allocator = callPackage ./python-modules/memory-allocator { }; + +# memory-profiler = callPackage ./python-modules/memory-profiler { }; + +# meraki = callPackage ./python-modules/meraki { }; + +# mercadopago = callPackage ./python-modules/mercadopago { }; + +# mercantile = callPackage ./python-modules/mercantile { }; + +# mercurial = toPythonModule (pkgs.mercurial.override { +# python3Packages = self; +# }); + +# merge3 = callPackage ./python-modules/merge3 { }; + +# mergedb = callPackage ./python-modules/mergedb { }; + +# mergedeep = callPackage ./python-modules/mergedeep { }; + +# mergedict = callPackage ./python-modules/mergedict { }; + +# merkletools = callPackage ./python-modules/merkletools { }; + +# meross-iot = callPackage ./python-modules/meross-iot { }; + +# mesa = callPackage ./python-modules/mesa { }; + +# meshcat = callPackage ./python-modules/meshcat { }; + +# meshio = callPackage ./python-modules/meshio { }; + +# meshlabxml = callPackage ./python-modules/meshlabxml { }; + +# meshtastic = callPackage ./python-modules/meshtastic { }; + +# meson = toPythonModule ((pkgs.meson.override { python3 = python; }).overridePythonAttrs +# (oldAttrs: { # We do not want the setup hook in Python packages because the build is performed differently. +# setupHook = null; +# })); + +# mesonpep517 = callPackage ./python-modules/mesonpep517 { }; + +# meson-python = callPackage ./python-modules/meson-python { +# inherit (pkgs) ninja; +# }; + +# messagebird = callPackage ./python-modules/messagebird { }; + +# metakernel = callPackage ./python-modules/metakernel { }; + +# metar = callPackage ./python-modules/metar { }; + +# metawear = callPackage ./python-modules/metawear { }; + +# meteoalertapi = callPackage ./python-modules/meteoalertapi { }; + +# meteocalc = callPackage ./python-modules/meteocalc { }; + +# meteofrance-api = callPackage ./python-modules/meteofrance-api { }; + +# mezzanine = callPackage ./python-modules/mezzanine { }; + +# mf2py = callPackage ./python-modules/mf2py { }; + +# mhcflurry = callPackage ./python-modules/mhcflurry { }; + +# mhcgnomes = callPackage ./python-modules/mhcgnomes { }; + +# miauth = callPackage ./python-modules/miauth { }; + +# micawber = callPackage ./python-modules/micawber { }; + +# microdata = callPackage ./python-modules/microdata { }; + +# microsoft-kiota-abstractions = callPackage ./python-modules/microsoft-kiota-abstractions { }; + +# microsoft-kiota-authentication-azure = callPackage ./python-modules/microsoft-kiota-authentication-azure { }; + +# microsoft-kiota-http = callPackage ./python-modules/microsoft-kiota-http { }; + +# microsoft-kiota-serialization-form = callPackage ./python-modules/microsoft-kiota-serialization-form { }; + +# microsoft-kiota-serialization-json = callPackage ./python-modules/microsoft-kiota-serialization-json { }; + +# microsoft-kiota-serialization-multipart = callPackage ./python-modules/microsoft-kiota-serialization-multipart { }; + +# microsoft-kiota-serialization-text = callPackage ./python-modules/microsoft-kiota-serialization-text { }; + +# midea-beautiful-air = callPackage ./python-modules/midea-beautiful-air { }; + +# midiutil = callPackage ./python-modules/midiutil { }; + +# mido = callPackage ./python-modules/mido { }; + +# migen = callPackage ./python-modules/migen { }; + +# mike = callPackage ./python-modules/mike { }; + +# milc = callPackage ./python-modules/milc { }; + +# milksnake = callPackage ./python-modules/milksnake { }; + +# mill-local = callPackage ./python-modules/mill-local { }; + +# millheater = callPackage ./python-modules/millheater { }; + +# mindsdb-evaluator = callPackage ./python-modules/mindsdb-evaluator { }; + +# minexr = callPackage ./python-modules/minexr { }; + +# miniaudio = callPackage ./python-modules/miniaudio { +# inherit (pkgs) miniaudio; +# inherit (pkgs.darwin.apple_sdk.frameworks) AudioToolbox CoreAudio; +# }; + +# minichain = callPackage ./python-modules/minichain { }; + +# minidb = callPackage ./python-modules/minidb { }; + +# minidump = callPackage ./python-modules/minidump { }; + +# miniful = callPackage ./python-modules/miniful { }; + +# minikanren = callPackage ./python-modules/minikanren { }; + +# minikerberos = callPackage ./python-modules/minikerberos { }; + +# minimal-snowplow-tracker = callPackage ./python-modules/minimal-snowplow-tracker { }; + +# minimock = callPackage ./python-modules/minimock { }; + +# mininet-python = (toPythonModule (pkgs.mininet.override { +# python3 = python; +# })).py; + +# minio = callPackage ./python-modules/minio { }; + +# miniupnpc = callPackage ./python-modules/miniupnpc { +# inherit (pkgs.darwin) cctools; +# }; + +# mip = callPackage ./python-modules/mip { }; + +# mir-eval = callPackage ./python-modules/mir-eval { }; + +# mirakuru = callPackage ./python-modules/mirakuru { }; + +# misaka = callPackage ./python-modules/misaka { }; + +# misoc = callPackage ./python-modules/misoc { }; + +# mistletoe = callPackage ./python-modules/mistletoe { }; + +# mistune = callPackage ./python-modules/mistune { }; + +# mitmproxy = callPackage ./python-modules/mitmproxy { }; + +# mitmproxy-macos = callPackage ./python-modules/mitmproxy-macos { }; + +# mitmproxy-rs = callPackage ./python-modules/mitmproxy-rs { }; + +# mitogen = callPackage ./python-modules/mitogen { }; + +# mixins = callPackage ./python-modules/mixins { }; + +# mixpanel = callPackage ./python-modules/mixpanel { }; + +# mizani = callPackage ./python-modules/mizani { }; + + mkdocs = callPackage ./python-modules/mkdocs { }; + +# mkdocs-autolinks-plugin = callPackage ./python-modules/mkdocs-autolinks-plugin { }; + +# mkdocs-autorefs = callPackage ./python-modules/mkdocs-autorefs { }; + +# mkdocs-drawio-exporter = callPackage ./python-modules/mkdocs-drawio-exporter { }; + +# mkdocs-exclude = callPackage ./python-modules/mkdocs-exclude { }; + +# mkdocs-git-authors-plugin = callPackage ./python-modules/mkdocs-git-authors-plugin { }; + +# mkdocs-git-revision-date-localized-plugin = callPackage ./python-modules/mkdocs-git-revision-date-localized-plugin { }; + +# mkdocs-gitlab = callPackage ./python-modules/mkdocs-gitlab-plugin { }; + +# mkdocs-jupyter = callPackage ./python-modules/mkdocs-jupyter { }; + +# mkdocs-linkcheck = callPackage ./python-modules/mkdocs-linkcheck { }; + +# mkdocs-macros = callPackage ./python-modules/mkdocs-macros { }; + +# mkdocs-material = callPackage ./python-modules/mkdocs-material { }; + +# mkdocs-material-extensions = callPackage ./python-modules/mkdocs-material/mkdocs-material-extensions.nix { }; + +# mkdocs-mermaid2-plugin = callPackage ./python-modules/mkdocs-mermaid2-plugin { }; + +# mkdocs-minify-plugin = callPackage ./python-modules/mkdocs-minify-plugin { }; + +# mkdocs-redirects = callPackage ./python-modules/mkdocs-redirects { }; + +# mkdocs-redoc-tag = callPackage ./python-modules/mkdocs-redoc-tag { }; + +# mkdocs-rss-plugin = callPackage ./python-modules/mkdocs-rss-plugin { }; + +# mkdocs-swagger-ui-tag = callPackage ./python-modules/mkdocs-swagger-ui-tag { }; + +# mkdocstrings = callPackage ./python-modules/mkdocstrings { }; + +# mkdocstrings-python = callPackage ./python-modules/mkdocstrings-python { }; + +# mkl-service = callPackage ./python-modules/mkl-service { }; + +# ml-collections = callPackage ./python-modules/ml-collections { }; + +# ml-dtypes = callPackage ./python-modules/ml-dtypes { }; + +# mlflow = callPackage ./python-modules/mlflow { }; + +# mlrose = callPackage ./python-modules/mlrose { }; + +# mlx = callPackage ./python-modules/mlx { }; + +# mlxtend = callPackage ./python-modules/mlxtend { }; + +# mlt = toPythonModule (pkgs.mlt.override { +# python3 = python; +# enablePython = true; +# }); + +# mmcif-pdbx = callPackage ./python-modules/mmcif-pdbx { }; + +# mmcv = callPackage ./python-modules/mmcv { }; + +# mmengine = callPackage ./python-modules/mmengine { }; + +# mmh3 = callPackage ./python-modules/mmh3 { }; + +# mmpython = callPackage ./python-modules/mmpython { }; + +# mmtf-python = callPackage ./python-modules/mmtf-python { }; + +# mnemonic = callPackage ./python-modules/mnemonic { }; + +# mne-python = callPackage ./python-modules/mne-python { }; + +# mnist = callPackage ./python-modules/mnist { }; + +# moat-ble = callPackage ./python-modules/moat-ble { }; + +# mobi = callPackage ./python-modules/mobi { }; + +# mobly = callPackage ./python-modules/mobly { }; + +# mocket = callPackage ./python-modules/mocket { +# redis-server = pkgs.redis; +# }; + + mock = callPackage ./python-modules/mock { }; + +# mockfs = callPackage ./python-modules/mockfs { }; + +# mockito = callPackage ./python-modules/mockito { }; + +# mock-open = callPackage ./python-modules/mock-open { }; + +# mock-services = callPackage ./python-modules/mock-services { }; + +# mock-ssh-server = callPackage ./python-modules/mock-ssh-server { }; + +# mockupdb = callPackage ./python-modules/mockupdb { }; + +# moddb = callPackage ./python-modules/moddb { }; + +# model-bakery = callPackage ./python-modules/model-bakery { }; + +# modelcif = callPackage ./python-modules/modelcif { }; + +# modeled = callPackage ./python-modules/modeled { }; + +# moderngl = callPackage ./python-modules/moderngl { }; + +# moderngl-window = callPackage ./python-modules/moderngl-window { }; + +# modestmaps = callPackage ./python-modules/modestmaps { }; + +# mohawk = callPackage ./python-modules/mohawk { }; + +# molecule = callPackage ./python-modules/molecule { }; + +# molecule-plugins = callPackage ./python-modules/molecule/plugins.nix { }; + +# monai = callPackage ./python-modules/monai { }; + +# monai-deploy = callPackage ./python-modules/monai-deploy { }; + +# monero = callPackage ./python-modules/monero { }; + +# mongomock = callPackage ./python-modules/mongomock { }; + +# mongodict = callPackage ./python-modules/mongodict { }; + +# mongoengine = callPackage ./python-modules/mongoengine { }; + +# mongoquery = callPackage ./python-modules/mongoquery { }; + +# monitorcontrol = callPackage ./python-modules/monitorcontrol { }; + +# monkeyhex = callPackage ./python-modules/monkeyhex { }; + +# monosat = pkgs.monosat.python { +# inherit buildPythonPackage; +# inherit (self) cython pytestCheckHook; +# }; + +# monotonic = callPackage ./python-modules/monotonic { }; + +# monty = callPackage ./python-modules/monty { }; + +# moonraker-api = callPackage ./python-modules/moonraker-api { }; + +# mopeka-iot-ble = callPackage ./python-modules/mopeka-iot-ble { }; + +# more-itertools = callPackage ./python-modules/more-itertools { }; + +# more-properties = callPackage ./python-modules/more-properties { }; + +# moreorless = callPackage ./python-modules/moreorless { }; + +# moretools = callPackage ./python-modules/moretools { }; + +# morfessor = callPackage ./python-modules/morfessor { }; + +# morphys = callPackage ./python-modules/morphys { }; + +# mortgage = callPackage ./python-modules/mortgage { }; + +# motmetrics = callPackage ./python-modules/motmetrics { }; + +# motionblinds = callPackage ./python-modules/motionblinds { }; + +# motioneye-client = callPackage ./python-modules/motioneye-client { }; + +# moto = callPackage ./python-modules/moto { }; + +# motor = callPackage ./python-modules/motor { }; + +# mouseinfo = callPackage ./python-modules/mouseinfo { }; + +# moviepy = callPackage ./python-modules/moviepy { }; + +# mox3 = callPackage ./python-modules/mox3 { }; + +# mpd2 = callPackage ./python-modules/mpd2 { }; + +# mpi4py = callPackage ./python-modules/mpi4py { }; + +# mpldatacursor = callPackage ./python-modules/mpldatacursor { }; + +# mplfinance = callPackage ./python-modules/mplfinance { }; + +# mplhep = callPackage ./python-modules/mplhep { }; + +# mplhep-data = callPackage ./python-modules/mplhep-data { }; + +# mplleaflet = callPackage ./python-modules/mplleaflet { }; + +# mpl-scatter-density = callPackage ./python-modules/mpl-scatter-density { }; + +# mpmath = callPackage ./python-modules/mpmath { }; + +# mpris-server = callPackage ./python-modules/mpris-server { }; + +# mpv = callPackage ./python-modules/mpv { +# inherit (pkgs) mpv; +# }; + +# mpyq = callPackage ./python-modules/mpyq { }; + +# mrjob = callPackage ./python-modules/mrjob { }; + +# mrsqm = callPackage ./python-modules/mrsqm { }; + +# ms-active-directory = callPackage ./python-modules/ms-active-directory { }; + +# ms-cv = callPackage ./python-modules/ms-cv { }; + +# msal = callPackage ./python-modules/msal { }; + +# msal-extensions = callPackage ./python-modules/msal-extensions { }; + +# mscerts = callPackage ./python-modules/mscerts { }; + +# msgpack = callPackage ./python-modules/msgpack { }; + +# msgpack-numpy = callPackage ./python-modules/msgpack-numpy { }; + +# msg-parser = callPackage ./python-modules/msg-parser { }; + +# msgspec = callPackage ./python-modules/msgspec { }; + +# msldap = callPackage ./python-modules/msldap { }; + +# msoffcrypto-tool = callPackage ./python-modules/msoffcrypto-tool { }; + +# msprime = callPackage ./python-modules/msprime { }; + +# mss = callPackage ./python-modules/mss { }; + +# msrestazure = callPackage ./python-modules/msrestazure { }; + +# msrest = callPackage ./python-modules/msrest { }; + +# mt-940 = callPackage ./python-modules/mt-940 { }; + +# mullvad-api = callPackage ./python-modules/mullvad-api { }; + +# mullvad-closest = callPackage ./python-modules/mullvad-closest { }; + +# mulpyplexer = callPackage ./python-modules/mulpyplexer { }; + +# multidict = callPackage ./python-modules/multidict { }; + +# multi-key-dict = callPackage ./python-modules/multi-key-dict { }; + +# multimethod = callPackage ./python-modules/multimethod { }; + +# multipledispatch = callPackage ./python-modules/multipledispatch { }; + +# multiprocess = callPackage ./python-modules/multiprocess { }; + +# multiset = callPackage ./python-modules/multiset { }; + +# multitasking = callPackage ./python-modules/multitasking { }; + +# munch = callPackage ./python-modules/munch { }; + +# mung = callPackage ./python-modules/mung { }; + +# munkres = callPackage ./python-modules/munkres { }; + +# murmurhash = callPackage ./python-modules/murmurhash { }; + +# muscima = callPackage ./python-modules/muscima { }; + +# musicbrainzngs = callPackage ./python-modules/musicbrainzngs { }; + +# music-tag = callPackage ./python-modules/music-tag { }; + +# mutag = callPackage ./python-modules/mutag { }; + +# mutagen = callPackage ./python-modules/mutagen { }; + +# mutatormath = callPackage ./python-modules/mutatormath { }; + +# mutesync = callPackage ./python-modules/mutesync { }; + +# mutf8 = callPackage ./python-modules/mutf8 { }; + +# mujoco = callPackage ./python-modules/mujoco { +# inherit (pkgs) mujoco; +# }; + +# mujson = callPackage ./python-modules/mujson { }; + +# mwcli = callPackage ./python-modules/mwcli { }; + +# mwclient = callPackage ./python-modules/mwclient { }; + +# mwdblib = callPackage ./python-modules/mwdblib { }; + +# mwoauth = callPackage ./python-modules/mwoauth { }; + +# mwparserfromhell = callPackage ./python-modules/mwparserfromhell { }; + +# mwtypes = callPackage ./python-modules/mwtypes { }; + +# mwxml = callPackage ./python-modules/mwxml { }; + +# mxnet = callPackage ./python-modules/mxnet { }; + +# myfitnesspal = callPackage ./python-modules/myfitnesspal { }; + +# mygpoclient = callPackage ./python-modules/mygpoclient { }; + +# myhdl = callPackage ./python-modules/myhdl { +# inherit (pkgs) ghdl verilog; +# }; + +# myhome = callPackage ./python-modules/myhome { }; + +# myjwt = callPackage ./python-modules/myjwt { }; + +# mypy = callPackage ./python-modules/mypy { }; + +# mypy-boto3-builder = callPackage ./python-modules/mypy-boto3-builder { }; + +# inherit (callPackage ./python-modules/mypy-boto3 { }) + +# mypy-boto3-accessanalyzer + +# mypy-boto3-account + +# mypy-boto3-acm + +# mypy-boto3-acm-pca + +# mypy-boto3-alexaforbusiness + +# mypy-boto3-amp + +# mypy-boto3-amplify + +# mypy-boto3-amplifybackend + +# mypy-boto3-amplifyuibuilder + +# mypy-boto3-apigateway + +# mypy-boto3-apigatewaymanagementapi + +# mypy-boto3-apigatewayv2 + +# mypy-boto3-appconfig + +# mypy-boto3-appconfigdata + +# mypy-boto3-appfabric + +# mypy-boto3-appflow + +# mypy-boto3-appintegrations + +# mypy-boto3-application-autoscaling + +# mypy-boto3-application-insights + +# mypy-boto3-applicationcostprofiler + +# mypy-boto3-appmesh + +# mypy-boto3-apprunner + +# mypy-boto3-appstream + +# mypy-boto3-appsync + +# mypy-boto3-arc-zonal-shift + +# mypy-boto3-athena + +# mypy-boto3-auditmanager + +# mypy-boto3-autoscaling + +# mypy-boto3-autoscaling-plans + +# mypy-boto3-backup + +# mypy-boto3-backup-gateway + +# mypy-boto3-backupstorage + +# mypy-boto3-batch + +# mypy-boto3-billingconductor + +# mypy-boto3-braket + +# mypy-boto3-budgets + +# mypy-boto3-ce + +# mypy-boto3-chime + +# mypy-boto3-chime-sdk-identity + +# mypy-boto3-chime-sdk-media-pipelines + +# mypy-boto3-chime-sdk-meetings + +# mypy-boto3-chime-sdk-messaging + +# mypy-boto3-chime-sdk-voice + +# mypy-boto3-cleanrooms + +# mypy-boto3-cloud9 + +# mypy-boto3-cloudcontrol + +# mypy-boto3-clouddirectory + +# mypy-boto3-cloudformation + +# mypy-boto3-cloudfront + +# mypy-boto3-cloudhsm + +# mypy-boto3-cloudhsmv2 + +# mypy-boto3-cloudsearch + +# mypy-boto3-cloudsearchdomain + +# mypy-boto3-cloudtrail + +# mypy-boto3-cloudtrail-data + +# mypy-boto3-cloudwatch + +# mypy-boto3-codeartifact + +# mypy-boto3-codebuild + +# mypy-boto3-codecatalyst + +# mypy-boto3-codecommit + +# mypy-boto3-codedeploy + +# mypy-boto3-codeguru-reviewer + +# mypy-boto3-codeguru-security + +# mypy-boto3-codeguruprofiler + +# mypy-boto3-codepipeline + +# mypy-boto3-codestar + +# mypy-boto3-codestar-connections + +# mypy-boto3-codestar-notifications + +# mypy-boto3-cognito-identity + +# mypy-boto3-cognito-idp + +# mypy-boto3-cognito-sync + +# mypy-boto3-comprehend + +# mypy-boto3-comprehendmedical + +# mypy-boto3-compute-optimizer + +# mypy-boto3-config + +# mypy-boto3-connect + +# mypy-boto3-connect-contact-lens + +# mypy-boto3-connectcampaigns + +# mypy-boto3-connectcases + +# mypy-boto3-connectparticipant + +# mypy-boto3-controltower + +# mypy-boto3-cur + +# mypy-boto3-customer-profiles + +# mypy-boto3-databrew + +# mypy-boto3-dataexchange + +# mypy-boto3-datapipeline + +# mypy-boto3-datasync + +# mypy-boto3-dax + +# mypy-boto3-detective + +# mypy-boto3-devicefarm + +# mypy-boto3-devops-guru + +# mypy-boto3-directconnect + +# mypy-boto3-discovery + +# mypy-boto3-dlm + +# mypy-boto3-dms + +# mypy-boto3-docdb + +# mypy-boto3-docdb-elastic + +# mypy-boto3-drs + +# mypy-boto3-ds + +# mypy-boto3-dynamodb + +# mypy-boto3-dynamodbstreams + +# mypy-boto3-ebs + +# mypy-boto3-ec2 + +# mypy-boto3-ec2-instance-connect + +# mypy-boto3-ecr + +# mypy-boto3-ecr-public + +# mypy-boto3-ecs + +# mypy-boto3-efs + +# mypy-boto3-eks + +# mypy-boto3-elastic-inference + +# mypy-boto3-elasticache + +# mypy-boto3-elasticbeanstalk + +# mypy-boto3-elastictranscoder + +# mypy-boto3-elb + +# mypy-boto3-elbv2 + +# mypy-boto3-emr + +# mypy-boto3-emr-containers + +# mypy-boto3-emr-serverless + +# mypy-boto3-entityresolution + +# mypy-boto3-es + +# mypy-boto3-events + +# mypy-boto3-evidently + +# mypy-boto3-finspace + +# mypy-boto3-finspace-data + +# mypy-boto3-firehose + +# mypy-boto3-fis + +# mypy-boto3-fms + +# mypy-boto3-forecast + +# mypy-boto3-forecastquery + +# mypy-boto3-frauddetector + +# mypy-boto3-fsx + +# mypy-boto3-gamelift + +# mypy-boto3-gamesparks + +# mypy-boto3-glacier + +# mypy-boto3-globalaccelerator + +# mypy-boto3-glue + +# mypy-boto3-grafana + +# mypy-boto3-greengrass + +# mypy-boto3-greengrassv2 + +# mypy-boto3-groundstation + +# mypy-boto3-guardduty + +# mypy-boto3-health + +# mypy-boto3-healthlake + +# mypy-boto3-honeycode + +# mypy-boto3-iam + +# mypy-boto3-identitystore + +# mypy-boto3-imagebuilder + +# mypy-boto3-importexport + +# mypy-boto3-inspector + +# mypy-boto3-inspector2 + +# mypy-boto3-internetmonitor + +# mypy-boto3-iot + +# mypy-boto3-iot-data + +# mypy-boto3-iot-jobs-data + +# mypy-boto3-iot-roborunner + +# mypy-boto3-iot1click-devices + +# mypy-boto3-iot1click-projects + +# mypy-boto3-iotanalytics + +# mypy-boto3-iotdeviceadvisor + +# mypy-boto3-iotevents + +# mypy-boto3-iotevents-data + +# mypy-boto3-iotfleethub + +# mypy-boto3-iotfleetwise + +# mypy-boto3-iotsecuretunneling + +# mypy-boto3-iotsitewise + +# mypy-boto3-iotthingsgraph + +# mypy-boto3-iottwinmaker + +# mypy-boto3-iotwireless + +# mypy-boto3-ivs + +# mypy-boto3-ivs-realtime + +# mypy-boto3-ivschat + +# mypy-boto3-kafka + +# mypy-boto3-kafkaconnect + +# mypy-boto3-kendra + +# mypy-boto3-kendra-ranking + +# mypy-boto3-keyspaces + +# mypy-boto3-kinesis + +# mypy-boto3-kinesis-video-archived-media + +# mypy-boto3-kinesis-video-media + +# mypy-boto3-kinesis-video-signaling + +# mypy-boto3-kinesis-video-webrtc-storage + +# mypy-boto3-kinesisanalytics + +# mypy-boto3-kinesisanalyticsv2 + +# mypy-boto3-kinesisvideo + +# mypy-boto3-kms + +# mypy-boto3-lakeformation + +# mypy-boto3-lambda + +# mypy-boto3-lex-models + +# mypy-boto3-lex-runtime + +# mypy-boto3-lexv2-models + +# mypy-boto3-lexv2-runtime + +# mypy-boto3-license-manager + +# mypy-boto3-license-manager-linux-subscriptions + +# mypy-boto3-license-manager-user-subscriptions + +# mypy-boto3-lightsail + +# mypy-boto3-location + +# mypy-boto3-logs + +# mypy-boto3-lookoutequipment + +# mypy-boto3-lookoutmetrics + +# mypy-boto3-lookoutvision + +# mypy-boto3-m2 + +# mypy-boto3-machinelearning + +# mypy-boto3-macie + +# mypy-boto3-macie2 + +# mypy-boto3-managedblockchain + +# mypy-boto3-managedblockchain-query + +# mypy-boto3-marketplace-catalog + +# mypy-boto3-marketplace-entitlement + +# mypy-boto3-marketplacecommerceanalytics + +# mypy-boto3-mediaconnect + +# mypy-boto3-mediaconvert + +# mypy-boto3-medialive + +# mypy-boto3-mediapackage + +# mypy-boto3-mediapackage-vod + +# mypy-boto3-mediapackagev2 + +# mypy-boto3-mediastore + +# mypy-boto3-mediastore-data + +# mypy-boto3-mediatailor + +# mypy-boto3-medical-imaging + +# mypy-boto3-memorydb + +# mypy-boto3-meteringmarketplace + +# mypy-boto3-mgh + +# mypy-boto3-mgn + +# mypy-boto3-migration-hub-refactor-spaces + +# mypy-boto3-migrationhub-config + +# mypy-boto3-migrationhuborchestrator + +# mypy-boto3-migrationhubstrategy + +# mypy-boto3-mobile + +# mypy-boto3-mq + +# mypy-boto3-mturk + +# mypy-boto3-mwaa + +# mypy-boto3-neptune + +# mypy-boto3-neptunedata + +# mypy-boto3-network-firewall + +# mypy-boto3-networkmanager + +# mypy-boto3-nimble + +# mypy-boto3-oam + +# mypy-boto3-omics + +# mypy-boto3-opensearch + +# mypy-boto3-opensearchserverless + +# mypy-boto3-opsworks + +# mypy-boto3-opsworkscm + +# mypy-boto3-organizations + +# mypy-boto3-osis + +# mypy-boto3-outposts + +# mypy-boto3-panorama + +# mypy-boto3-payment-cryptography + +# mypy-boto3-payment-cryptography-data + +# mypy-boto3-pca-connector-ad + +# mypy-boto3-personalize + +# mypy-boto3-personalize-events + +# mypy-boto3-personalize-runtime + +# mypy-boto3-pi + +# mypy-boto3-pinpoint + +# mypy-boto3-pinpoint-email + +# mypy-boto3-pinpoint-sms-voice + +# mypy-boto3-pinpoint-sms-voice-v2 + +# mypy-boto3-pipes + +# mypy-boto3-polly + +# mypy-boto3-pricing + +# mypy-boto3-privatenetworks + +# mypy-boto3-proton + +# mypy-boto3-qldb + +# mypy-boto3-qldb-session + +# mypy-boto3-quicksight + +# mypy-boto3-ram + +# mypy-boto3-rbin + +# mypy-boto3-rds + +# mypy-boto3-rds-data + +# mypy-boto3-redshift + +# mypy-boto3-redshift-data + +# mypy-boto3-redshift-serverless + +# mypy-boto3-rekognition + +# mypy-boto3-resiliencehub + +# mypy-boto3-resource-explorer-2 + +# mypy-boto3-resource-groups + +# mypy-boto3-resourcegroupstaggingapi + +# mypy-boto3-robomaker + +# mypy-boto3-rolesanywhere + +# mypy-boto3-route53 + +# mypy-boto3-route53-recovery-cluster + +# mypy-boto3-route53-recovery-control-config + +# mypy-boto3-route53-recovery-readiness + +# mypy-boto3-route53domains + +# mypy-boto3-route53resolver + +# mypy-boto3-rum + +# mypy-boto3-s3 + +# mypy-boto3-s3control + +# mypy-boto3-s3outposts + +# mypy-boto3-sagemaker + +# mypy-boto3-sagemaker-a2i-runtime + +# mypy-boto3-sagemaker-edge + +# mypy-boto3-sagemaker-featurestore-runtime + +# mypy-boto3-sagemaker-geospatial + +# mypy-boto3-sagemaker-metrics + +# mypy-boto3-sagemaker-runtime + +# mypy-boto3-savingsplans + +# mypy-boto3-scheduler + +# mypy-boto3-schemas + +# mypy-boto3-sdb + +# mypy-boto3-secretsmanager + +# mypy-boto3-securityhub + +# mypy-boto3-securitylake + +# mypy-boto3-serverlessrepo + +# mypy-boto3-service-quotas + +# mypy-boto3-servicecatalog + +# mypy-boto3-servicecatalog-appregistry + +# mypy-boto3-servicediscovery + +# mypy-boto3-ses + +# mypy-boto3-sesv2 + +# mypy-boto3-shield + +# mypy-boto3-signer + +# mypy-boto3-simspaceweaver + +# mypy-boto3-sms + +# mypy-boto3-sms-voice + +# mypy-boto3-snow-device-management + +# mypy-boto3-snowball + +# mypy-boto3-sns + +# mypy-boto3-sqs + +# mypy-boto3-ssm + +# mypy-boto3-ssm-contacts + +# mypy-boto3-ssm-incidents + +# mypy-boto3-ssm-sap + +# mypy-boto3-sso + +# mypy-boto3-sso-admin + +# mypy-boto3-sso-oidc + +# mypy-boto3-stepfunctions + +# mypy-boto3-storagegateway + +# mypy-boto3-sts + +# mypy-boto3-support + +# mypy-boto3-support-app + +# mypy-boto3-swf + +# mypy-boto3-synthetics + +# mypy-boto3-textract + +# mypy-boto3-timestream-query + +# mypy-boto3-timestream-write + +# mypy-boto3-tnb + +# mypy-boto3-transcribe + +# mypy-boto3-transfer + +# mypy-boto3-translate + +# mypy-boto3-verifiedpermissions + +# mypy-boto3-voice-id + +# mypy-boto3-vpc-lattice + +# mypy-boto3-waf + +# mypy-boto3-waf-regional + +# mypy-boto3-wafv2 + +# mypy-boto3-wellarchitected + +# mypy-boto3-wisdom + +# mypy-boto3-workdocs + +# mypy-boto3-worklink + +# mypy-boto3-workmail + +# mypy-boto3-workmailmessageflow + +# mypy-boto3-workspaces + +# mypy-boto3-workspaces-web + +# mypy-boto3-xray + +# ; + +# mypy-extensions = callPackage ./python-modules/mypy/extensions.nix { }; + +# mypy-protobuf = callPackage ./python-modules/mypy-protobuf { }; + +# mysqlclient = callPackage ./python-modules/mysqlclient { }; + +# mysql-connector = callPackage ./python-modules/mysql-connector { }; + +# myst-docutils = callPackage ./python-modules/myst-docutils { }; + +# myst-nb = callPackage ./python-modules/myst-nb { }; + +# myst-parser = callPackage ./python-modules/myst-parser { }; + +# myuplink = callPackage ./python-modules/myuplink { }; + +# n3fit = callPackage ./python-modules/n3fit { }; + +# nad-receiver = callPackage ./python-modules/nad-receiver { }; + +# nagiosplugin = callPackage ./python-modules/nagiosplugin { }; + +# naked = callPackage ./python-modules/naked { }; + +# namedlist = callPackage ./python-modules/namedlist { }; + +# nameparser = callPackage ./python-modules/nameparser { }; + +# names = callPackage ./python-modules/names { }; + +# name-that-hash = callPackage ./python-modules/name-that-hash { }; + +# nameko = callPackage ./python-modules/nameko { }; + +# nampa = callPackage ./python-modules/nampa { }; + +# nanobind = callPackage ./python-modules/nanobind { }; + +# nanoid = callPackage ./python-modules/nanoid { }; + +# nanoleaf = callPackage ./python-modules/nanoleaf { }; + +# navec = callPackage ./python-modules/navec { }; + +# natasha = callPackage ./python-modules/natasha { }; + +# nomadnet = callPackage ./python-modules/nomadnet { }; + +# nox = callPackage ./python-modules/nox { }; + +# nanomsg-python = callPackage ./python-modules/nanomsg-python { +# inherit (pkgs) nanomsg; +# }; + +# nanotime = callPackage ./python-modules/nanotime { }; + +# napalm = callPackage ./python-modules/napalm { }; + +# napalm-hp-procurve = callPackage ./python-modules/napalm/hp-procurve.nix { }; + +# napari = callPackage ./python-modules/napari { +# inherit (pkgs.libsForQt5) mkDerivationWith wrapQtAppsHook; +# }; + +# napari-console = callPackage ./python-modules/napari-console { }; + +# napari-npe2 = callPackage ./python-modules/napari-npe2 { }; + +# napari-plugin-engine = callPackage ./python-modules/napari-plugin-engine { }; + +# napari-svg = callPackage ./python-modules/napari-svg { }; + +# nasdaq-data-link = callPackage ./python-modules/nasdaq-data-link { }; + +# nats-py = callPackage ./python-modules/nats-py { }; + +# nats-python = callPackage ./python-modules/nats-python { }; + +# natsort = callPackage ./python-modules/natsort { }; + +# naturalsort = callPackage ./python-modules/naturalsort { }; + +# nbclassic = callPackage ./python-modules/nbclassic { }; + +# nbclient = callPackage ./python-modules/nbclient { }; + +# nbconflux = callPackage ./python-modules/nbconflux { }; + +# nbconvert = callPackage ./python-modules/nbconvert { }; + +# nbdev = callPackage ./python-modules/nbdev { }; + +# nbdime = callPackage ./python-modules/nbdime { }; + +# nbexec = callPackage ./python-modules/nbexec { }; + +# nbformat = callPackage ./python-modules/nbformat { }; + +# nbmerge = callPackage ./python-modules/nbmerge { }; + +# nbsmoke = callPackage ./python-modules/nbsmoke { }; + +# nbsphinx = callPackage ./python-modules/nbsphinx { }; + +# nbtlib = callPackage ./python-modules/nbtlib { }; + +# nbval = callPackage ./python-modules/nbval { }; + +# nbxmpp = callPackage ./python-modules/nbxmpp { }; + +# nc-dnsapi = callPackage ./python-modules/nc-dnsapi { }; + +# ncclient = callPackage ./python-modules/ncclient { }; + +# nclib = callPackage ./python-modules/nclib { }; + +# ndeflib = callPackage ./python-modules/ndeflib { }; + +# ndg-httpsclient = callPackage ./python-modules/ndg-httpsclient { }; + +# ndindex = callPackage ./python-modules/ndindex { }; + +# ndjson = callPackage ./python-modules/ndjson { }; + +# ndms2-client = callPackage ./python-modules/ndms2-client { }; + +# ndspy = callPackage ./python-modules/ndspy { }; + +# ndtypes = callPackage ./python-modules/ndtypes { }; + +# nebula3-python = callPackage ./python-modules/nebula3-python { }; + +# nengo = callPackage ./python-modules/nengo { }; + +# neo = callPackage ./python-modules/neo { }; + +# neo4j = callPackage ./python-modules/neo4j { }; + +# neoteroi-mkdocs = callPackage ./python-modules/neoteroi-mkdocs { }; + +# nessclient = callPackage ./python-modules/nessclient { }; + +# nest = toPythonModule(pkgs.nest-mpi.override { withPython = true; python3 = python; }); + +# nest-asyncio = callPackage ./python-modules/nest-asyncio { }; + +# nested-lookup = callPackage ./python-modules/nested-lookup { }; + +# nestedtext = callPackage ./python-modules/nestedtext { }; + +# netaddr = callPackage ./python-modules/netaddr { }; + +# netapp-lib = callPackage ./python-modules/netapp-lib { }; + +# netapp-ontap = callPackage ./python-modules/netapp-ontap { }; + +# netcdf4 = callPackage ./python-modules/netcdf4 { }; + +# netdata = callPackage ./python-modules/netdata { }; + +# netdisco = callPackage ./python-modules/netdisco { }; + +# nethsm = callPackage ./python-modules/nethsm { }; + +# netifaces = callPackage ./python-modules/netifaces { }; + +# netmiko = callPackage ./python-modules/netmiko { }; + +# netio = callPackage ./python-modules/netio { }; + +# nettigo-air-monitor = callPackage ./python-modules/nettigo-air-monitor { }; + +# netutils = callPackage ./python-modules/netutils { }; + +# networkx = callPackage ./python-modules/networkx { }; + +# neuron-full = pkgs.neuron-full.override { python3 = python; }; + +# neuronpy = python.pkgs.toPythonModule neuron-full; + +# nevow = callPackage ./python-modules/nevow { }; + +# newversion = callPackage ./python-modules/newversion { }; + +# newick = callPackage ./python-modules/newick { }; + +# nexia = callPackage ./python-modules/nexia { }; + +# nextcloudmonitor = callPackage ./python-modules/nextcloudmonitor { }; + +# nextcord = callPackage ./python-modules/nextcord { }; + +# nextdns = callPackage ./python-modules/nextdns { }; + +# nfcpy = callPackage ./python-modules/nfcpy { }; + +# nftables = toPythonModule (pkgs.nftables.override { +# python3 = python; +# withPython = true; +# }); + +# nh3 = callPackage ./python-modules/nh3 { }; + +# niaaml = callPackage ./python-modules/niaaml { }; + +# nianet = callPackage ./python-modules/nianet { }; + +# niaarm = callPackage ./python-modules/niaarm { }; + +# niaclass = callPackage ./python-modules/niaclass { }; + +# niapy = callPackage ./python-modules/niapy { }; + +# nibabel = callPackage ./python-modules/nibabel { }; + +# nibe = callPackage ./python-modules/nibe { }; + +# nidaqmx = callPackage ./python-modules/nidaqmx { }; + +# nikola = callPackage ./python-modules/nikola { }; + +# niko-home-control = callPackage ./python-modules/niko-home-control { }; + +# nilearn = callPackage ./python-modules/nilearn { }; + +# niluclient = callPackage ./python-modules/niluclient { }; + +# nimfa = callPackage ./python-modules/nimfa { }; + +# nine = callPackage ./python-modules/nine { }; + +# ninebot-ble = callPackage ./python-modules/ninebot-ble { }; + +# ninja = callPackage ./python-modules/ninja { inherit (pkgs) ninja; }; + +# nipreps-versions = callPackage ./python-modules/nipreps-versions { }; + +# nipy = callPackage ./python-modules/nipy { }; + +# nipype = callPackage ./python-modules/nipype { +# inherit (pkgs) which; +# }; + +# nitime = callPackage ./python-modules/nitime { }; + +# nitpick = callPackage ../applications/version-management/nitpick { }; + +# nitransforms = callPackage ./python-modules/nitransforms { }; + +# niworkflows = callPackage ./python-modules/niworkflows { }; + +# nix-kernel = callPackage ./python-modules/nix-kernel { +# inherit (pkgs) nix; +# }; + +# nixpkgs = callPackage ./python-modules/nixpkgs { }; + +# nixpkgs-pytools = callPackage ./python-modules/nixpkgs-pytools { }; + +# nix-prefetch-github = callPackage ./python-modules/nix-prefetch-github { }; + +# nkdfu = callPackage ./python-modules/nkdfu { }; + +# nlpcloud = callPackage ./python-modules/nlpcloud { }; + +# nltk = callPackage ./python-modules/nltk { }; + +# nnpdf = toPythonModule (pkgs.nnpdf.override { +# python3 = python; +# }); + +# nmapthon2 = callPackage ./python-modules/nmapthon2 { }; + +# amaranth-boards = callPackage ./python-modules/amaranth-boards { }; + +# amaranth = callPackage ./python-modules/amaranth { }; + +# amaranth-soc = callPackage ./python-modules/amaranth-soc { }; + +# nocasedict = callPackage ./python-modules/nocasedict { }; + +# nocaselist = callPackage ./python-modules/nocaselist { }; + +# nocturne = callPackage ./python-modules/nocturne { }; + +# nodeenv = callPackage ./python-modules/nodeenv { }; + +# nodepy-runtime = callPackage ./python-modules/nodepy-runtime { }; + +# node-semver = callPackage ./python-modules/node-semver { }; + +# noise = callPackage ./python-modules/noise { }; + +# noiseprotocol = callPackage ./python-modules/noiseprotocol { }; + +# norfair = callPackage ./python-modules/norfair { }; + +# normality = callPackage ./python-modules/normality { }; + + nose = callPackage ./python-modules/nose { }; + +# nose2 = callPackage ./python-modules/nose2 { }; + +# nose3 = callPackage ./python-modules/nose3 { }; + +# nose-cov = callPackage ./python-modules/nose-cov { }; + +# nose-cprof = callPackage ./python-modules/nose-cprof { }; + +# nose-exclude = callPackage ./python-modules/nose-exclude { }; + +# nose-timer = callPackage ./python-modules/nose-timer { }; + +# nosejs = callPackage ./python-modules/nosejs { }; + +# nose-pattern-exclude = callPackage ./python-modules/nose-pattern-exclude { }; + +# nose-randomly = callPackage ./python-modules/nose-randomly { }; + +# nose-warnings-filters = callPackage ./python-modules/nose-warnings-filters { }; + +# nosexcover = callPackage ./python-modules/nosexcover { }; + +# notebook = callPackage ./python-modules/notebook { }; + +# notebook-shim = callPackage ./python-modules/notebook-shim { }; + +# notedown = callPackage ./python-modules/notedown { }; + +# notifications-android-tv = callPackage ./python-modules/notifications-android-tv { }; + +# notifications-python-client = callPackage ./python-modules/notifications-python-client { }; + +# notify-events = callPackage ./python-modules/notify-events { }; + +# notify-py = callPackage ./python-modules/notify-py { }; + +# notify2 = callPackage ./python-modules/notify2 { }; + +# notion-client = callPackage ./python-modules/notion-client { }; + +# notmuch = callPackage ./python-modules/notmuch { +# inherit (pkgs) notmuch; +# }; + +# notmuch2 = callPackage ./python-modules/notmuch2 { +# inherit (pkgs) notmuch; +# }; + +# nototools = callPackage ./python-modules/nototools { }; + +# notus-scanner = callPackage ./python-modules/notus-scanner { }; + +# nplusone = callPackage ./python-modules/nplusone { }; + +# nptyping = callPackage ./python-modules/nptyping { }; + +# npyscreen = callPackage ./python-modules/npyscreen { }; + +# nsapi = callPackage ./python-modules/nsapi { }; + +# ntc-templates = callPackage ./python-modules/ntc-templates { }; + +# ntplib = callPackage ./python-modules/ntplib { }; + +# nuitka = callPackage ./python-modules/nuitka { }; + +# nuheat = callPackage ./python-modules/nuheat { }; + +# nulltype = callPackage ./python-modules/nulltype { }; + +# num2words = callPackage ./python-modules/num2words { }; + +# numba = callPackage ./python-modules/numba { +# inherit (pkgs.config) cudaSupport; +# }; + +# numbaWithCuda = self.numba.override { +# cudaSupport = true; +# }; + +# numba-scipy = callPackage ./python-modules/numba-scipy { }; + +# numcodecs = callPackage ./python-modules/numcodecs { }; + +# numdifftools = callPackage ./python-modules/numdifftools { }; + +# numericalunits = callPackage ./python-modules/numericalunits { }; + +# numexpr = callPackage ./python-modules/numexpr { }; + +# numpydoc = callPackage ./python-modules/numpydoc { }; + + numpy = callPackage ./python-modules/numpy { }; + +# numpy-stl = callPackage ./python-modules/numpy-stl { }; + +# numpyro = callPackage ./python-modules/numpyro { }; + +# nunavut = callPackage ./python-modules/nunavut { }; + +# nutils = callPackage ./python-modules/nutils { }; + +# nvchecker = callPackage ./python-modules/nvchecker { }; + +# nvdlib = callPackage ./python-modules/nvdlib { }; + +# nvidia-ml-py = callPackage ./python-modules/nvidia-ml-py { }; + +# nsz = callPackage ./python-modules/nsz { }; + +# nxt-python = callPackage ./python-modules/nxt-python { }; + +# python-ndn = callPackage ./python-modules/python-ndn { }; + +# python-nvd3 = callPackage ./python-modules/python-nvd3 { }; + +# python-secp256k1-cardano = callPackage ./python-modules/python-secp256k1-cardano { }; + +# python-tds = callPackage ./python-modules/python-tds { }; + +# python-yate = callPackage ./python-modules/python-yate { }; + +# python-youtube = callPackage ./python-modules/python-youtube { }; + +# py-aosmith = callPackage ./python-modules/py-aosmith { }; + +# py-deprecate = callPackage ./python-modules/py-deprecate { }; + +# py-ecc = callPackage ./python-modules/py-ecc { }; + +# py-eth-sig-utils = callPackage ./python-modules/py-eth-sig-utils { }; + +# py-expression-eval = callPackage ./python-modules/py-expression-eval { }; + +# py-radix-sr = callPackage ./python-modules/py-radix-sr { }; + +# nwdiag = callPackage ./python-modules/nwdiag { }; + +# oasatelematics = callPackage ./python-modules/oasatelematics { }; + +# oath = callPackage ./python-modules/oath { }; + +# oauth2 = callPackage ./python-modules/oauth2 { }; + +# oauth2client = callPackage ./python-modules/oauth2client { }; + +# oauth = callPackage ./python-modules/oauth { }; + +# oauthenticator = callPackage ./python-modules/oauthenticator { }; + +# oauthlib = callPackage ./python-modules/oauthlib { }; + +# obfsproxy = callPackage ./python-modules/obfsproxy { }; + +# objax = callPackage ./python-modules/objax { }; + +# objsize = callPackage ./python-modules/objsize { }; + + objgraph = callPackage ./python-modules/objgraph { + # requires both the graphviz package and python package + graphvizPkgs = pkgs.graphviz; + }; + +# obspy = callPackage ./python-modules/obspy { }; + +# oca-port = callPackage ./python-modules/oca-port { }; + +# ochre = callPackage ./python-modules/ochre { }; + +# oci = callPackage ./python-modules/oci { }; + +# ocifs = callPackage ./python-modules/ocifs { }; + +# ocrmypdf = callPackage ./python-modules/ocrmypdf { +# tesseract = pkgs.tesseract5; +# }; + +# od = callPackage ./python-modules/od { }; + +# odfpy = callPackage ./python-modules/odfpy { }; + +# odp-amsterdam = callPackage ./python-modules/odp-amsterdam { }; + +# offtrac = callPackage ./python-modules/offtrac { }; + +# ofxclient = callPackage ./python-modules/ofxclient { }; + +# ofxhome = callPackage ./python-modules/ofxhome { }; + +# ofxparse = callPackage ./python-modules/ofxparse { }; + +# ofxtools = callPackage ./python-modules/ofxtools { }; + +# oemthermostat = callPackage ./python-modules/oemthermostat { }; + +# okonomiyaki = callPackage ./python-modules/okonomiyaki { }; + +# okta = callPackage ./python-modules/okta { }; + +# oldest-supported-numpy = callPackage ./python-modules/oldest-supported-numpy { }; + +# olefile = callPackage ./python-modules/olefile { }; + +# oletools = callPackage ./python-modules/oletools { }; + +# ollama = callPackage ./python-modules/ollama { }; + +# omegaconf = callPackage ./python-modules/omegaconf { }; + +# omemo-dr = callPackage ./python-modules/omemo-dr { }; + +# ome-zarr = callPackage ./python-modules/ome-zarr { }; + +# omnikinverter = callPackage ./python-modules/omnikinverter { }; + +# omnilogic = callPackage ./python-modules/omnilogic { }; + +# omorfi = callPackage ./python-modules/omorfi { }; + +# omrdatasettools = callPackage ./python-modules/omrdatasettools { }; + +# oncalendar = callPackage ./python-modules/oncalendar { }; + +# ondilo = callPackage ./python-modules/ondilo { }; + +# onetimepass = callPackage ./python-modules/onetimepass { }; + +# onigurumacffi = callPackage ./python-modules/onigurumacffi { }; + +# onkyo-eiscp = callPackage ./python-modules/onkyo-eiscp { }; + +# online-judge-api-client = callPackage ./python-modules/online-judge-api-client { }; + +# online-judge-tools = callPackage ./python-modules/online-judge-tools { }; + +# onlykey-solo-python = callPackage ./python-modules/onlykey-solo-python { }; + +# onnx = callPackage ./python-modules/onnx { +# abseil-cpp = pkgs.abseil-cpp_202301; +# }; + +# onnxconverter-common = callPackage ./python-modules/onnxconverter-common { +# inherit (pkgs) protobuf; +# }; + +# onnxmltools = callPackage ./python-modules/onnxmltools { }; + +# onnxruntime = callPackage ./python-modules/onnxruntime { +# onnxruntime = pkgs.onnxruntime.override { +# python3Packages = self; +# pythonSupport = true; +# }; +# }; + +# onnxruntime-tools = callPackage ./python-modules/onnxruntime-tools { }; + +# onvif-zeep = callPackage ./python-modules/onvif-zeep { }; + +# onvif-zeep-async = callPackage ./python-modules/onvif-zeep-async { }; + +# oocsi = callPackage ./python-modules/oocsi { }; + +# opcua-widgets = callPackage ./python-modules/opcua-widgets { }; + +# open-clip-torch = callPackage ./python-modules/open-clip-torch { }; + +# open-garage = callPackage ./python-modules/open-garage { }; + +# open-interpreter = callPackage ./python-modules/open-interpreter { }; + +# open-meteo = callPackage ./python-modules/open-meteo { }; + +# openai-triton = callPackage ./python-modules/openai-triton { +# llvm = pkgs.openai-triton-llvm; +# cudaPackages = pkgs.cudaPackages_12_1; +# }; + +# openai-triton-cuda = self.openai-triton.override { +# cudaSupport = true; +# }; + +# openai-triton-no-cuda = self.openai-triton.override { +# cudaSupport = false; +# }; + +# openai-triton-bin = callPackage ./python-modules/openai-triton/bin.nix { }; + +# openai-whisper = callPackage ./python-modules/openai-whisper { }; + +# openant = callPackage ./python-modules/openant { }; + +# openapi-schema-validator = callPackage ./python-modules/openapi-schema-validator { }; + +# openapi-spec-validator = callPackage ./python-modules/openapi-spec-validator { }; + +# openapi3 = callPackage ./python-modules/openapi3 { }; + +# openbabel-bindings = callPackage ./python-modules/openbabel-bindings { +# openbabel = callPackage ../development/libraries/openbabel { inherit (self) python; }; +# }; + +# opencensus = callPackage ./python-modules/opencensus { }; + +# opencensus-context = callPackage ./python-modules/opencensus-context { }; + +# opencensus-ext-azure = callPackage ./python-modules/opencensus-ext-azure { }; + +# opencontainers = callPackage ./python-modules/opencontainers { }; + +# opencv4 = toPythonModule (pkgs.opencv4.override { +# enablePython = true; +# pythonPackages = self; +# }); + +# openerz-api = callPackage ./python-modules/openerz-api { }; + +# openevsewifi = callPackage ./python-modules/openevsewifi { }; + +# openhomedevice = callPackage ./python-modules/openhomedevice { }; + +# openidc-client = callPackage ./python-modules/openidc-client { }; + +# openmm = toPythonModule (pkgs.openmm.override { +# python3Packages = self; +# enablePython = true; +# }); + +# openpyxl = callPackage ./python-modules/openpyxl { }; + +# openrazer = callPackage ./python-modules/openrazer/pylib.nix { }; + +# openrazer-daemon = callPackage ./python-modules/openrazer/daemon.nix { }; + +# openrgb-python = callPackage ./python-modules/openrgb-python { }; + +# openrouteservice = callPackage ./python-modules/openrouteservice { }; + +# opensearch-py = callPackage ./python-modules/opensearch-py { }; + +# opensensemap-api = callPackage ./python-modules/opensensemap-api { }; + +# opensfm = callPackage ./python-modules/opensfm { }; + +# openshift = callPackage ./python-modules/openshift { }; + +# opensimplex = callPackage ./python-modules/opensimplex { }; + +# openstackdocstheme = callPackage ./python-modules/openstackdocstheme { }; + +# openstacksdk = callPackage ./python-modules/openstacksdk { }; + +# opentimestamps = callPackage ./python-modules/opentimestamps { }; + +# opentelemetry-api = callPackage ./python-modules/opentelemetry-api { }; + +# opentelemetry-exporter-otlp = callPackage ./python-modules/opentelemetry-exporter-otlp { }; + +# opentelemetry-exporter-otlp-proto-common = callPackage ./python-modules/opentelemetry-exporter-otlp-proto-common { }; + +# opentelemetry-exporter-otlp-proto-grpc = callPackage ./python-modules/opentelemetry-exporter-otlp-proto-grpc { }; + +# opentelemetry-exporter-otlp-proto-http = callPackage ./python-modules/opentelemetry-exporter-otlp-proto-http { }; + +# opentelemetry-exporter-prometheus = callPackage ./python-modules/opentelemetry-exporter-prometheus { }; + +# opentelemetry-instrumentation = callPackage ./python-modules/opentelemetry-instrumentation { }; + +# opentelemetry-instrumentation-aiohttp-client = callPackage ./python-modules/opentelemetry-instrumentation-aiohttp-client { }; + +# opentelemetry-instrumentation-asgi = callPackage ./python-modules/opentelemetry-instrumentation-asgi { }; + +# opentelemetry-instrumentation-django = callPackage ./python-modules/opentelemetry-instrumentation-django { }; + +# opentelemetry-instrumentation-fastapi = callPackage ./python-modules/opentelemetry-instrumentation-fastapi { }; + +# opentelemetry-instrumentation-flask = callPackage ./python-modules/opentelemetry-instrumentation-flask { }; + +# opentelemetry-instrumentation-grpc = callPackage ./python-modules/opentelemetry-instrumentation-grpc { }; + +# opentelemetry-instrumentation-wsgi = callPackage ./python-modules/opentelemetry-instrumentation-wsgi { }; + +# opentelemetry-proto = callPackage ./python-modules/opentelemetry-proto { }; + +# opentelemetry-semantic-conventions = callPackage ./python-modules/opentelemetry-semantic-conventions { }; + +# opentelemetry-sdk = callPackage ./python-modules/opentelemetry-sdk { }; + +# opentelemetry-test-utils = callPackage ./python-modules/opentelemetry-test-utils { }; + +# opentelemetry-util-http = callPackage ./python-modules/opentelemetry-util-http { }; + +# openturns = toPythonModule (pkgs.openturns.override { +# python3Packages = self; +# enablePython = true; +# }); + +# opentracing = callPackage ./python-modules/opentracing { }; + +# opentsne = callPackage ./python-modules/opentsne { }; + +# opentypespec = callPackage ./python-modules/opentypespec { }; + +# openvino = callPackage ./python-modules/openvino { +# openvino-native = pkgs.openvino.override { +# python3Packages = self; +# }; +# }; + +# openwebifpy = callPackage ./python-modules/openwebifpy { }; + +# openwrt-luci-rpc = callPackage ./python-modules/openwrt-luci-rpc { }; + +# openwrt-ubus-rpc = callPackage ./python-modules/openwrt-ubus-rpc { }; + +# opower = callPackage ./python-modules/opower { }; + +# opsdroid-get-image-size = callPackage ./python-modules/opsdroid-get-image-size { }; + +# opt-einsum = callPackage ./python-modules/opt-einsum { }; + +# optax = callPackage ./python-modules/optax { }; + +# optimum = callPackage ./python-modules/optimum { }; + +# optuna = callPackage ./python-modules/optuna { }; + +# opuslib = callPackage ./python-modules/opuslib { }; + +# opytimark = callPackage ./python-modules/opytimark { }; + +# oracledb = callPackage ./python-modules/oracledb { }; + +# oralb-ble = callPackage ./python-modules/oralb-ble { }; + +# orange3 = callPackage ./python-modules/orange3 { }; + +# orange-canvas-core = callPackage ./python-modules/orange-canvas-core { }; + +# orange-widget-base = callPackage ./python-modules/orange-widget-base { }; + +# oras = callPackage ./python-modules/oras { }; + +# orbax-checkpoint = callPackage ./python-modules/orbax-checkpoint { }; + +# orderedmultidict = callPackage ./python-modules/orderedmultidict { }; + +# ordered-set = callPackage ./python-modules/ordered-set { }; + +# orderedset = callPackage ./python-modules/orderedset { }; + +# orgparse = callPackage ./python-modules/orgparse { }; + +# orjson = callPackage ./python-modules/orjson { }; + +# orm = callPackage ./python-modules/orm { }; + +# ormar = callPackage ./python-modules/ormar { }; + +# ortools = (toPythonModule (pkgs.or-tools.override { inherit (self) python; })).python; + +# orvibo = callPackage ./python-modules/orvibo { }; + +# os-service-types = callPackage ./python-modules/os-service-types { }; + +# osc = callPackage ./python-modules/osc { }; + +# osc-diagram = callPackage ./python-modules/osc-diagram { }; + +# osc-lib = callPackage ./python-modules/osc-lib { }; + +# osc-sdk-python = callPackage ./python-modules/osc-sdk-python { }; + +# oscpy = callPackage ./python-modules/oscpy { }; + +# oscrypto = callPackage ./python-modules/oscrypto { }; + +# oscscreen = callPackage ./python-modules/oscscreen { }; + +# oset = callPackage ./python-modules/oset { }; + +# osmnx = callPackage ./python-modules/osmnx { }; + +# osmpythontools = callPackage ./python-modules/osmpythontools { }; + +# oslo-concurrency = callPackage ./python-modules/oslo-concurrency { }; + +# oslo-config = callPackage ./python-modules/oslo-config { }; + +# oslo-context = callPackage ./python-modules/oslo-context { }; + +# oslo-db = callPackage ./python-modules/oslo-db { }; + +# oslo-i18n = callPackage ./python-modules/oslo-i18n { }; + +# oslo-log = callPackage ./python-modules/oslo-log { }; + +# oslo-serialization = callPackage ./python-modules/oslo-serialization { }; + +# oslo-utils = callPackage ./python-modules/oslo-utils { }; + +# oslotest = callPackage ./python-modules/oslotest { }; + +# ospd = callPackage ./python-modules/ospd { }; + +# osqp = callPackage ./python-modules/osqp { }; + +# oss2 = callPackage ./python-modules/oss2 { }; + +# ossfs = callPackage ./python-modules/ossfs { }; + +# ots-python = callPackage ./python-modules/ots-python { }; + +# outcome = callPackage ./python-modules/outcome { }; + +# ovh = callPackage ./python-modules/ovh { }; + +# ovmfvartool = callPackage ./python-modules/ovmfvartool { }; + +# ovoenergy = callPackage ./python-modules/ovoenergy { }; + +# owslib = callPackage ./python-modules/owslib { }; + +# oyaml = callPackage ./python-modules/oyaml { }; + +# p1monitor = callPackage ./python-modules/p1monitor { }; + +# packageurl-python = callPackage ./python-modules/packageurl-python { }; + + packaging = callPackage ./python-modules/packaging { }; + +# packbits = callPackage ./python-modules/packbits { }; + +# packet-python = callPackage ./python-modules/packet-python { }; + +# packvers = callPackage ./python-modules/packvers { }; + +# pagelabels = callPackage ./python-modules/pagelabels { }; + +# paginate = callPackage ./python-modules/paginate { }; + +# paho-mqtt = callPackage ./python-modules/paho-mqtt { }; + +# palace = callPackage ./python-modules/palace { }; + +# palettable = callPackage ./python-modules/palettable { }; + + pallets-sphinx-themes = callPackage ./python-modules/pallets-sphinx-themes { }; + +# python-docs-theme = callPackage ./python-modules/python-docs-theme { }; + +# pamela = callPackage ./python-modules/pamela { }; + +# pamqp = callPackage ./python-modules/pamqp { }; + +# panacotta = callPackage ./python-modules/panacotta { }; + +# panasonic-viera = callPackage ./python-modules/panasonic-viera { }; + +# pandas = callPackage ./python-modules/pandas { +# inherit (pkgs.darwin) adv_cmds; +# }; + +# pandas-datareader = callPackage ./python-modules/pandas-datareader { }; + +# pandoc-attributes = callPackage ./python-modules/pandoc-attributes { }; + +# pandoc-xnos = callPackage ./python-modules/pandoc-xnos { }; + +# pandocfilters = callPackage ./python-modules/pandocfilters { }; + +# panel = callPackage ./python-modules/panel { }; + +# panflute = callPackage ./python-modules/panflute { }; + +# panphon = callPackage ./python-modules/panphon { }; + +# papermill = callPackage ./python-modules/papermill { }; + +# openpaperwork-core = callPackage ../applications/office/paperwork/openpaperwork-core.nix { }; +# openpaperwork-gtk = callPackage ../applications/office/paperwork/openpaperwork-gtk.nix { }; +# paperwork-backend = callPackage ../applications/office/paperwork/paperwork-backend.nix { }; +# paperwork-shell = callPackage ../applications/office/paperwork/paperwork-shell.nix { }; + +# papis = callPackage ./python-modules/papis { }; + +# papis-python-rofi = callPackage ./python-modules/papis-python-rofi { }; + +# para = callPackage ./python-modules/para { }; + +# param = callPackage ./python-modules/param { }; + +# parameter-expansion-patched = callPackage ./python-modules/parameter-expansion-patched { }; + +# parameterized = callPackage ./python-modules/parameterized { }; + +# parametrize-from-file = callPackage ./python-modules/parametrize-from-file { }; + +# paramiko = callPackage ./python-modules/paramiko { }; + +# paramz = callPackage ./python-modules/paramz { }; + +# paranoid-crypto = callPackage ./python-modules/paranoid-crypto { }; + +# parfive = callPackage ./python-modules/parfive { }; + +# parquet = callPackage ./python-modules/parquet { }; + +# parse = callPackage ./python-modules/parse { }; + +# parsedatetime = callPackage ./python-modules/parsedatetime { }; + +# parsedmarc = callPackage ./python-modules/parsedmarc { }; + +# parsel = callPackage ./python-modules/parsel { }; + +# parse-type = callPackage ./python-modules/parse-type { }; + +# parsimonious = callPackage ./python-modules/parsimonious { }; + +# parsley = callPackage ./python-modules/parsley { }; + +# parso = callPackage ./python-modules/parso { }; + +# parsy = callPackage ./python-modules/parsy { }; + +# partd = callPackage ./python-modules/partd { }; + +# parts = callPackage ./python-modules/parts { }; + +# particle = callPackage ./python-modules/particle { }; + +# parver = callPackage ./python-modules/parver { }; +# arpeggio = callPackage ./python-modules/arpeggio { }; + +# pasimple = callPackage ./python-modules/pasimple { }; + +# passlib = callPackage ./python-modules/passlib { }; + +# paste = callPackage ./python-modules/paste { }; + +# pastedeploy = callPackage ./python-modules/pastedeploy { }; + +# pastel = callPackage ./python-modules/pastel { }; + +# pastescript = callPackage ./python-modules/pastescript { }; + +# patator = callPackage ./python-modules/patator { }; + +# patch = callPackage ./python-modules/patch { }; + +# patch-ng = callPackage ./python-modules/patch-ng { }; + +# path = callPackage ./python-modules/path { }; + +# path-and-address = callPackage ./python-modules/path-and-address { }; + +# pathable = callPackage ./python-modules/pathable { }; + +# pathlib2 = callPackage ./python-modules/pathlib2 { }; + +# pathlib = callPackage ./python-modules/pathlib { }; + +# pathlib-abc = callPackage ./python-modules/pathlib-abc { }; + +# pathos = callPackage ./python-modules/pathos { }; + + pathspec = callPackage ./python-modules/pathspec { }; + +# pathtools = callPackage ./python-modules/pathtools { }; + +# pathvalidate = callPackage ./python-modules/pathvalidate { }; + +# pathy = callPackage ./python-modules/pathy { }; + +# patiencediff = callPackage ./python-modules/patiencediff { }; + +# patool = callPackage ./python-modules/patool { }; + +# patsy = callPackage ./python-modules/patsy { }; + +# patrowl4py = callPackage ./python-modules/patrowl4py { }; + +# paver = callPackage ./python-modules/paver { }; + +# paypal-checkout-serversdk = callPackage ./python-modules/paypal-checkout-serversdk { }; + +# paypalhttp = callPackage ./python-modules/paypalhttp { }; + +# paypalrestsdk = callPackage ./python-modules/paypalrestsdk { }; + +# pbkdf2 = callPackage ./python-modules/pbkdf2 { }; + +# pbr = callPackage ./python-modules/pbr { }; + +# pbs-installer = callPackage ./python-modules/pbs-installer { }; + +# pc-ble-driver-py = toPythonModule (callPackage ./python-modules/pc-ble-driver-py { }); + +# pcapy-ng = callPackage ./python-modules/pcapy-ng { +# inherit (pkgs) libpcap; # Avoid confusion with python package of the same name +# }; + +# pcbnewtransition = callPackage ./python-modules/pcbnewtransition { }; + +# pcodedmp = callPackage ./python-modules/pcodedmp { }; + +# pcpp = callPackage ./python-modules/pcpp { }; + +# pdb2pqr = callPackage ./python-modules/pdb2pqr { }; + +# pdbfixer = callPackage ./python-modules/pdbfixer { }; + +# pdf2docx = callPackage ./python-modules/pdf2docx { }; + +# pdf2image = callPackage ./python-modules/pdf2image { }; + +# pdfkit = callPackage ./python-modules/pdfkit { }; + +# pdfminer-six = callPackage ./python-modules/pdfminer-six { }; + +# pdfplumber = callPackage ./python-modules/pdfplumber { }; + +# pdfrw = callPackage ./python-modules/pdfrw { }; + +# pdfrw2 = callPackage ./python-modules/pdfrw2 { }; + +# pdftotext = callPackage ./python-modules/pdftotext { }; + +# pdfx = callPackage ./python-modules/pdfx { }; + +# pdm-backend = callPackage ./python-modules/pdm-backend { }; + +# pdm-pep517 = callPackage ./python-modules/pdm-pep517 { }; + +# pdoc = callPackage ./python-modules/pdoc { }; + +# pdoc-pyo3-sample-library = callPackage ./python-modules/pdoc-pyo3-sample-library { }; + +# pdoc3 = callPackage ./python-modules/pdoc3 { }; + +# peaqevcore = callPackage ./python-modules/peaqevcore { }; + +# pegen = callPackage ./python-modules/pegen { }; + +# pebble = callPackage ./python-modules/pebble { }; + +# pecan = callPackage ./python-modules/pecan { }; + +# peco = callPackage ./python-modules/peco { }; + +# peewee = callPackage ./python-modules/peewee { }; + +# peewee-migrate = callPackage ./python-modules/peewee-migrate { }; + +# pefile = callPackage ./python-modules/pefile { }; + +# peft = callPackage ./python-modules/peft { }; + +# pelican = callPackage ./python-modules/pelican { +# inherit (pkgs) glibcLocales git; +# }; + +# pem = callPackage ./python-modules/pem { }; + +# pendulum = callPackage ./python-modules/pendulum { }; + +# pep440 = callPackage ./python-modules/pep440 { }; + +# pep517 = callPackage ./python-modules/pep517 { }; + +# pep8 = callPackage ./python-modules/pep8 { }; + +# pep8-naming = callPackage ./python-modules/pep8-naming { }; + +# peppercorn = callPackage ./python-modules/peppercorn { }; + +# percol = callPackage ./python-modules/percol { }; + +# perfplot = callPackage ./python-modules/perfplot { }; + +# periodictable = callPackage ./python-modules/periodictable { }; + +# periodiq = callPackage ./python-modules/periodiq { }; + +# permissionedforms = callPackage ./python-modules/permissionedforms { }; + +# persim = callPackage ./python-modules/persim { }; + +# persist-queue = callPackage ./python-modules/persist-queue { }; + +# persistent = callPackage ./python-modules/persistent { }; + +# persisting-theory = callPackage ./python-modules/persisting-theory { }; + +# pescea = callPackage ./python-modules/pescea { }; + +# pex = callPackage ./python-modules/pex { }; + +# pexif = callPackage ./python-modules/pexif { }; + +# pexpect = callPackage ./python-modules/pexpect { }; + +# pfzy = callPackage ./python-modules/pfzy { }; + +# ping3 = callPackage ./python-modules/ping3 { }; + +# pins = callPackage ./python-modules/pins { }; + +# pg8000 = callPackage ./python-modules/pg8000 { }; + +# pgcli = callPackage ./python-modules/pgcli { }; + +# pglast = callPackage ./python-modules/pglast { }; + +# pgpdump = callPackage ./python-modules/pgpdump { }; + +# pgpy = callPackage ./python-modules/pgpy { }; + +# pgsanity = callPackage ./python-modules/pgsanity { }; + +# pgspecial = callPackage ./python-modules/pgspecial { }; + +# pgvector = callPackage ./python-modules/pgvector { }; + +# phe = callPackage ./python-modules/phe { }; + +# phik = callPackage ./python-modules/phik { }; + +# phone-modem = callPackage ./python-modules/phone-modem { }; + +# phonenumbers = callPackage ./python-modules/phonenumbers { }; + +# pkgutil-resolve-name = callPackage ./python-modules/pkgutil-resolve-name { }; + +# pkg-about = callPackage ./python-modules/pkg-about { }; + +# micloud = callPackage ./python-modules/micloud { }; + +# mqtt2influxdb = callPackage ./python-modules/mqtt2influxdb { }; + +# msgraph-core = callPackage ./python-modules/msgraph-core { }; + +# msgraph-sdk = callPackage ./python-modules/msgraph-sdk { }; + +# multipart = callPackage ./python-modules/multipart { }; + +# netmap = callPackage ./python-modules/netmap { }; + +# onetimepad = callPackage ./python-modules/onetimepad { }; + +# openai = callPackage ./python-modules/openai { }; + +# openaiauth = callPackage ./python-modules/openaiauth { }; + +# openapi-core = callPackage ./python-modules/openapi-core { }; + +# openusd = callPackage ./python-modules/openusd { +# alembic = pkgs.alembic; +# }; + +# outlines = callPackage ./python-modules/outlines { }; + +# overly = callPackage ./python-modules/overly { }; + +# overpy = callPackage ./python-modules/overpy { }; + +# overrides = callPackage ./python-modules/overrides { }; + +# pandas-stubs = callPackage ./python-modules/pandas-stubs { }; + +# pdunehd = callPackage ./python-modules/pdunehd { }; + +# pencompy = callPackage ./python-modules/pencompy { }; + +# pgmpy = callPackage ./python-modules/pgmpy { }; + +# phonopy = callPackage ./python-modules/phonopy { }; + +# pixcat = callPackage ./python-modules/pixcat { }; + +# pinecone-client = callPackage ./python-modules/pinecone-client { }; + +# psrpcore = callPackage ./python-modules/psrpcore { }; + +# pybars3 = callPackage ./python-modules/pybars3 { }; + +# pymeta3 = callPackage ./python-modules/pymeta3 { }; + +# pypemicro = callPackage ./python-modules/pypemicro { }; + +# pymeshlab = toPythonModule (pkgs.libsForQt5.callPackage ../applications/graphics/pymeshlab { }); + +# pyprecice = callPackage ./python-modules/pyprecice { }; + +# pyprobables = callPackage ./python-modules/pyprobables { }; + +# pyproject-api = callPackage ./python-modules/pyproject-api { }; + + pyproject-hooks = callPackage ./python-modules/pyproject-hooks { }; + +# pypsrp = callPackage ./python-modules/pypsrp { }; + +# phpserialize = callPackage ./python-modules/phpserialize { }; + +# phx-class-registry = callPackage ./python-modules/phx-class-registry { }; + +# pi1wire = callPackage ./python-modules/pi1wire { }; + +# piano-transcription-inference = callPackage ./python-modules/piano-transcription-inference { }; + +# piccata = callPackage ./python-modules/piccata { }; + +# pick = callPackage ./python-modules/pick { }; + +# pickleshare = callPackage ./python-modules/pickleshare { }; + +# picobox = callPackage ./python-modules/picobox { }; + +# picos = callPackage ./python-modules/picos { }; + +# picosvg = callPackage ./python-modules/picosvg { }; + +# piccolo-theme = callPackage ./python-modules/piccolo-theme { }; + +# pid = callPackage ./python-modules/pid { }; + +# piep = callPackage ./python-modules/piep { }; + +# piexif = callPackage ./python-modules/piexif { }; + +# pijuice = callPackage ./python-modules/pijuice { }; + +# pika = callPackage ./python-modules/pika { }; + +# pika-pool = callPackage ./python-modules/pika-pool { }; + +# pikepdf = callPackage ./python-modules/pikepdf { }; + +# pilkit = callPackage ./python-modules/pilkit { }; + +# pillowfight = callPackage ./python-modules/pillowfight { }; + +# pillow = callPackage ./python-modules/pillow { +# inherit (pkgs) freetype libjpeg zlib libtiff libwebp tcl lcms2 tk; +# inherit (pkgs.xorg) libX11 libxcb; +# }; + +# pillow-heif = callPackage ./python-modules/pillow-heif { }; + +# pillow-jpls = callPackage ./python-modules/pillow-jpls { }; + +# pillow-simd = callPackage ./python-modules/pillow-simd { +# inherit (pkgs) freetype libjpeg zlib libtiff libwebp tcl lcms2 tk; +# inherit (pkgs.xorg) libX11; +# }; + +# pims = callPackage ./python-modules/pims { }; + +# pinboard = callPackage ./python-modules/pinboard { }; + +# pinocchio = toPythonModule (pkgs.pinocchio.override { +# pythonSupport = true; +# python3Packages = self; +# }); + +# pint = callPackage ./python-modules/pint { }; + +# pint-pandas = callPackage ./python-modules/pint-pandas { }; + +# pip = callPackage ./python-modules/pip { }; + +# pipdate = callPackage ./python-modules/pipdate { }; + +# pipdeptree = callPackage ./python-modules/pipdeptree { }; + +# pipe = callPackage ./python-modules/pipe { }; + +# pipenv-poetry-migrate = callPackage ./python-modules/pipenv-poetry-migrate { }; + +# piper-phonemize = callPackage ./python-modules/piper-phonemize { +# onnxruntime-native = pkgs.onnxruntime; +# piper-phonemize-native = pkgs.piper-phonemize; +# }; + +# pip-api = callPackage ./python-modules/pip-api { }; + +# pip-tools = callPackage ./python-modules/pip-tools { }; + +# pip-requirements-parser = callPackage ./python-modules/pip-requirements-parser { }; + +# pip-system-certs = callPackage ./python-modules/pip-system-certs { }; + +# pipx = callPackage ./python-modules/pipx { }; + +# pivy = callPackage ./python-modules/pivy { +# inherit (pkgs.qt5) qtbase qmake; +# inherit (pkgs.libsForQt5) soqt; +# }; + +# pixelmatch = callPackage ./python-modules/pixelmatch { }; + +# pixel-font-builder = callPackage ./python-modules/pixel-font-builder { }; + +# pixel-ring = callPackage ./python-modules/pixel-ring { }; + +# pjsua2 = (toPythonModule (pkgs.pjsip.override { +# pythonSupport = true; +# python3 = self.python; +# })).py; + +# pkce = callPackage ./python-modules/pkce { }; + +# pkgconfig = callPackage ./python-modules/pkgconfig { }; + +# pkginfo = callPackage ./python-modules/pkginfo { }; + +# pkginfo2 = callPackage ./python-modules/pkginfo2 { }; + +# pkuseg = callPackage ./python-modules/pkuseg { }; + +# playwright = callPackage ./python-modules/playwright { }; + +# playwright-stealth = callPackage ./python-modules/playwright-stealth { }; + +# playwrightcapture = callPackage ./python-modules/playwrightcapture { }; + +# pmsensor = callPackage ./python-modules/pmsensor { }; + +# ppdeep = callPackage ./python-modules/ppdeep { }; + +# prodict = callPackage ./python-modules/prodict { }; + +# prometheus-pandas = callPackage ./python-modules/prometheus-pandas { }; + +# prophet = callPackage ./python-modules/prophet { }; + +# propka = callPackage ./python-modules/propka { }; + +# proxy-tools = callPackage ./python-modules/proxy-tools { }; + +# proxy-db = callPackage ./python-modules/proxy-db { }; + +# py-nextbusnext = callPackage ./python-modules/py-nextbusnext { }; + +# py65 = callPackage ./python-modules/py65 { }; + +# pyaehw4a1 = callPackage ./python-modules/pyaehw4a1 { }; + +# pyatag = callPackage ./python-modules/pyatag { }; + +# pyatem = callPackage ./python-modules/pyatem { }; + +# pyatome = callPackage ./python-modules/pyatome { }; + +# pycketcasts = callPackage ./python-modules/pycketcasts { }; + +# pycomposefile = callPackage ./python-modules/pycomposefile { }; +# pycontrol4 = callPackage ./python-modules/pycontrol4 { }; + +# pycookiecheat = callPackage ./python-modules/pycookiecheat { }; + +# pycoolmasternet-async = callPackage ./python-modules/pycoolmasternet-async { }; + +# pycrdt = callPackage ./python-modules/pycrdt { }; + +# pycrdt-websocket = callPackage ./python-modules/pycrdt-websocket { }; + +# pyfibaro = callPackage ./python-modules/pyfibaro { }; + +# pyfireservicerota = callPackage ./python-modules/pyfireservicerota { }; + +# pyflexit = callPackage ./python-modules/pyflexit { }; + +# pyflick = callPackage ./python-modules/pyflick { }; + +# pyfluidsynth = callPackage ./python-modules/pyfluidsynth { }; + +# pyformlang = callPackage ./python-modules/pyformlang { }; + +# pyfreedompro = callPackage ./python-modules/pyfreedompro { }; + +# pygments-style-github = callPackage ./python-modules/pygments-style-github { }; + +# pygnmi = callPackage ./python-modules/pygnmi { }; + +# pygount = callPackage ./python-modules/pygount { }; + +# pygti = callPackage ./python-modules/pygti { }; + +# pyheck = callPackage ./python-modules/pyheck { }; + +# pyheos = callPackage ./python-modules/pyheos { }; + +# pyhepmc = callPackage ./python-modules/pyhepmc { }; + +# pyhiveapi = callPackage ./python-modules/pyhiveapi { }; + +# pyhumps = callPackage ./python-modules/pyhumps { }; + +# pyindego = callPackage ./python-modules/pyindego { }; + +# pyinstaller-versionfile = callPackage ./python-modules/pyinstaller-versionfile { }; + +# pyisemail = callPackage ./python-modules/pyisemail { }; + +# pyisy = callPackage ./python-modules/pyisy { }; + +# pyixapi = callPackage ./python-modules/pyixapi { }; + +# pykrakenapi = callPackage ./python-modules/pykrakenapi { }; + +# pylddwrap = callPackage ./python-modules/pylddwrap { }; + +# pyngo = callPackage ./python-modules/pyngo { }; + +# pyngrok = callPackage ./python-modules/pyngrok { }; + +# pynitrokey = callPackage ./python-modules/pynitrokey { }; + +# pynndescent = callPackage ./python-modules/pynndescent { }; + +# pynobo = callPackage ./python-modules/pynobo { }; + +# pynose = callPackage ./python-modules/pynose { }; + +# pynotifier = callPackage ./python-modules/pynotifier { }; + +# pynuki = callPackage ./python-modules/pynuki { }; + +# pynut2 = callPackage ./python-modules/pynut2 { }; + +# pynws = callPackage ./python-modules/pynws { }; + +# pynx584 = callPackage ./python-modules/pynx584 { }; + +# pyorthanc = callPackage ./python-modules/pyorthanc { }; + +# pyoutbreaksnearme = callPackage ./python-modules/pyoutbreaksnearme { }; + +# pyoverkiz = callPackage ./python-modules/pyoverkiz { }; + +# pyownet = callPackage ./python-modules/pyownet { }; + +# pypoint = callPackage ./python-modules/pypoint { }; + +# pypoolstation = callPackage ./python-modules/pypoolstation { }; + +# pyrdfa3 = callPackage ./python-modules/pyrdfa3 { }; + +# pyre-extensions = callPackage ./python-modules/pyre-extensions { }; + +# pyrender = callPackage ./python-modules/pyrender { }; + +# pyrevolve = callPackage ./python-modules/pyrevolve { }; + +# pyrfxtrx = callPackage ./python-modules/pyrfxtrx { }; + +# pyrogram = callPackage ./python-modules/pyrogram { }; + +# pysabnzbd = callPackage ./python-modules/pysabnzbd { }; + +# pysbd = callPackage ./python-modules/pysbd { }; + +# pysequoia = callPackage ./python-modules/pysequoia { }; + +# pyschemes = callPackage ./python-modules/pyschemes { }; + +# pyschlage = callPackage ./python-modules/pyschlage { }; + +# pyshark = callPackage ./python-modules/pyshark { }; + +# pysiaalarm = callPackage ./python-modules/pysiaalarm { }; + +# pysilero-vad = callPackage ./python-modules/pysilero-vad { }; + +# pysimplesoap = callPackage ./python-modules/pysimplesoap { }; + +# pyskyqhub = callPackage ./python-modules/pyskyqhub { }; + +# pyskyqremote = callPackage ./python-modules/pyskyqremote { }; + +# pysolcast = callPackage ./python-modules/pysolcast { }; + +# pysubs2 = callPackage ./python-modules/pysubs2 { }; + +# pysuez = callPackage ./python-modules/pysuez { }; + +# pysqlitecipher = callPackage ./python-modules/pysqlitecipher { }; + +# pysyncthru = callPackage ./python-modules/pysyncthru { }; + +# pytest-mockito = callPackage ./python-modules/pytest-mockito { }; + +# pytest-pudb = callPackage ./python-modules/pytest-pudb { }; + +# pytlv = callPackage ./python-modules/pytlv { }; + +# python-codon-tables = callPackage ./python-modules/python-codon-tables { }; + +# python-creole = callPackage ./python-modules/python-creole { }; + +# python-crfsuite = callPackage ./python-modules/python-crfsuite { }; + +# python-csxcad = callPackage ./python-modules/python-csxcad { }; + +# python-djvulibre = callPackage ./python-modules/python-djvulibre { }; + +# python-ecobee-api = callPackage ./python-modules/python-ecobee-api { }; + +# python-flirt = callPackage ./python-modules/python-flirt { }; + +# python-fullykiosk = callPackage ./python-modules/python-fullykiosk { }; + +# python-fx = callPackage ./python-modules/python-fx { }; + +# python-glanceclient = callPackage ./python-modules/python-glanceclient { }; + +# python-google-nest = callPackage ./python-modules/python-google-nest { }; + +# python-heatclient = callPackage ./python-modules/python-heatclient { }; + +# python-hl7 = callPackage ./python-modules/python-hl7 { }; + +# python-ipmi = callPackage ./python-modules/python-ipmi { }; + +# python-ipware = callPackage ./python-modules/python-ipware { }; + +# python-ironicclient = callPackage ./python-modules/python-ironicclient { }; + +# python-izone = callPackage ./python-modules/python-izone { }; + +# python-juicenet = callPackage ./python-modules/python-juicenet { }; + +# python-kasa = callPackage ./python-modules/python-kasa { }; + +# python-keycloak = callPackage ./python-modules/python-keycloak { }; + +# python-keystoneclient = callPackage ./python-modules/python-keystoneclient { }; + +# python-lsp-black = callPackage ./python-modules/python-lsp-black { }; + +# python-mbedtls = callPackage ./python-modules/python-mbedtls { }; + +# python-memcached = callPackage ./python-modules/python-memcached { +# inherit (pkgs) memcached; +# }; + +# python-motionmount = callPackage ./python-modules/python-motionmount { }; + +# python-otbr-api = callPackage ./python-modules/python-otbr-api { }; + +# python-openems = callPackage ./python-modules/python-openems { }; + +# python-opensky = callPackage ./python-modules/python-opensky { }; + +# python-owasp-zap-v2-4 = callPackage ./python-modules/python-owasp-zap-v2-4 { }; + +# python-pptx = callPackage ./python-modules/python-pptx { }; + +# python-songpal = callPackage ./python-modules/python-songpal { }; + +# python-swiftclient = callPackage ./python-modules/python-swiftclient { }; + +# python-tado = callPackage ./python-modules/python-tado { }; + +# python-idzip = callPackage ./python-modules/python-idzip { }; + +# pythonfinder = callPackage ./python-modules/pythonfinder { }; + +# pytomorrowio = callPackage ./python-modules/pytomorrowio { }; + +# pyuca = callPackage ./python-modules/pyuca { }; + +# pyunpack = callPackage ./python-modules/pyunpack { }; + +# pyutil = callPackage ./python-modules/pyutil { }; + +# pyzbar = callPackage ./python-modules/pyzbar { }; + +# pyzipper = callPackage ./python-modules/pyzipper { }; + +# pkutils = callPackage ./python-modules/pkutils { }; + +# plac = callPackage ./python-modules/plac { }; + +# plaid-python = callPackage ./python-modules/plaid-python { }; + +# plantuml = callPackage ./python-modules/plantuml { }; + +# plantuml-markdown = callPackage ./python-modules/plantuml-markdown { +# inherit (pkgs) plantuml; +# }; + +# plaster = callPackage ./python-modules/plaster { }; + +# plaster-pastedeploy = callPackage ./python-modules/plaster-pastedeploy { }; + +# platformdirs = callPackage ./python-modules/platformdirs { }; + +# playsound = callPackage ./python-modules/playsound { }; + +# plexapi = callPackage ./python-modules/plexapi { }; + +# plexauth = callPackage ./python-modules/plexauth { }; + +# plexwebsocket = callPackage ./python-modules/plexwebsocket { }; + +# plfit = toPythonModule (pkgs.plfit.override { +# inherit (self) python; +# }); + +# plone-testing = callPackage ./python-modules/plone-testing { }; + +# plotext = callPackage ./python-modules/plotext { }; + +# plotly = callPackage ./python-modules/plotly { }; + +# plotnine = callPackage ./python-modules/plotnine { }; + + pluggy = callPackage ./python-modules/pluggy { }; + +# plugincode = callPackage ./python-modules/plugincode { }; + +# pluginbase = callPackage ./python-modules/pluginbase { }; + +# plugnplay = callPackage ./python-modules/plugnplay { }; + +# plugwise = callPackage ./python-modules/plugwise { }; + +# plum-py = callPackage ./python-modules/plum-py { }; + +# plumbum = callPackage ./python-modules/plumbum { }; + +# pluthon = callPackage ./python-modules/pluthon { }; + +# plux = callPackage ./python-modules/plux { }; + +# ply = callPackage ./python-modules/ply { }; + +# plyer = callPackage ./python-modules/plyer { }; + +# plyfile = callPackage ./python-modules/plyfile { }; + +# plyplus = callPackage ./python-modules/plyplus { }; + +# plyvel = callPackage ./python-modules/plyvel { }; + +# pmw = callPackage ./python-modules/pmw { }; + +# pmdarima = callPackage ./python-modules/pmdarima { }; + +# pmdsky-debug-py = callPackage ./python-modules/pmdsky-debug-py { }; + +# pnglatex = callPackage ./python-modules/pnglatex { }; + +# pocket = callPackage ./python-modules/pocket { }; + +# podcastparser = callPackage ./python-modules/podcastparser { }; + +# podcats = callPackage ./python-modules/podcats { }; + +# podman = callPackage ./python-modules/podman { }; + +# poetry-core = callPackage ./python-modules/poetry-core { }; + +# poetry-dynamic-versioning = callPackage ./python-modules/poetry-dynamic-versioning { }; + +# poetry-semver = callPackage ./python-modules/poetry-semver { }; + +# polars = callPackage ./python-modules/polars { }; + +# polarizationsolver = callPackage ./python-modules/polarizationsolver { }; + +# polling = callPackage ./python-modules/polling { }; + +# polib = callPackage ./python-modules/polib { }; + +# policy-sentry = callPackage ./python-modules/policy-sentry { }; + +# policyuniverse = callPackage ./python-modules/policyuniverse { }; + +# polyline = callPackage ./python-modules/polyline { }; + +# polygon3 = callPackage ./python-modules/polygon3 { }; + +# polyswarm-api = callPackage ./python-modules/polyswarm-api { }; + +# pomegranate = callPackage ./python-modules/pomegranate { }; + +# pontos = callPackage ./python-modules/pontos { }; + +# pony = callPackage ./python-modules/pony { }; + +# ponywhoosh = callPackage ./python-modules/ponywhoosh { }; + +# pooch = callPackage ./python-modules/pooch { }; + +# pook = callPackage ./python-modules/pook { }; + +# poolsense = callPackage ./python-modules/poolsense { }; + +# poppler-qt5 = callPackage ./python-modules/poppler-qt5 { +# inherit (pkgs.qt5) qtbase qmake; +# inherit (pkgs.libsForQt5) poppler; +# }; + +# portalocker = callPackage ./python-modules/portalocker { }; + +# portend = callPackage ./python-modules/portend { }; + +# port-for = callPackage ./python-modules/port-for { }; + +# portpicker = callPackage ./python-modules/portpicker { }; + +# posix-ipc = callPackage ./python-modules/posix-ipc { }; + +# posthog = callPackage ./python-modules/posthog { }; + +# pot = callPackage ./python-modules/pot { }; + +# potentials = callPackage ./python-modules/potentials { }; + +# potr = callPackage ./python-modules/potr { }; + +# power = callPackage ./python-modules/power { }; + +# powerline = callPackage ./python-modules/powerline { }; + +# powerline-mem-segment = callPackage ./python-modules/powerline-mem-segment { }; + +# pox = callPackage ./python-modules/pox { }; + +# poyo = callPackage ./python-modules/poyo { }; + +# ppft = callPackage ./python-modules/ppft { }; + +# pplpy = callPackage ./python-modules/pplpy { }; + +# pprintpp = callPackage ./python-modules/pprintpp { }; + +# pproxy = callPackage ./python-modules/pproxy { }; + +# ppscore = callPackage ./python-modules/ppscore { }; + +# pq = callPackage ./python-modules/pq { }; + +# prance = callPackage ./python-modules/prance { }; + +# prawcore = callPackage ./python-modules/prawcore { }; + +# praw = callPackage ./python-modules/praw { }; + +# prayer-times-calculator = callPackage ./python-modules/prayer-times-calculator { }; + +# precis-i18n = callPackage ./python-modules/precis-i18n { }; + +# prefixed = callPackage ./python-modules/prefixed { }; + +# pre-commit-hooks = callPackage ./python-modules/pre-commit-hooks { }; + +# preggy = callPackage ./python-modules/preggy { }; + +# premailer = callPackage ./python-modules/premailer { }; + +# preprocess-cancellation = callPackage ./python-modules/preprocess-cancellation { }; + +# preshed = callPackage ./python-modules/preshed { }; + + pretend = callPackage ./python-modules/pretend { }; + +# prettytable = callPackage ./python-modules/prettytable { }; + +# primecountpy = callPackage ./python-modules/primecountpy { }; + +# primepy = callPackage ./python-modules/primepy { }; + +# primer3 = callPackage ./python-modules/primer3 { }; + +# priority = callPackage ./python-modules/priority { }; + +# prisma = callPackage ./python-modules/prisma { }; + +# prison = callPackage ./python-modules/prison { }; + +# proboscis = callPackage ./python-modules/proboscis { }; + +# process-tests = callPackage ./python-modules/process-tests { }; + +# procmon-parser = callPackage ./python-modules/procmon-parser { }; + +# proglog = callPackage ./python-modules/proglog { }; + +# progressbar2 = callPackage ./python-modules/progressbar2 { }; + +# progressbar33 = callPackage ./python-modules/progressbar33 { }; + +# progressbar = callPackage ./python-modules/progressbar { }; + +# progress = callPackage ./python-modules/progress { }; + +# prometheus-api-client = callPackage ./python-modules/prometheus-api-client { }; + +# prometheus-client = callPackage ./python-modules/prometheus-client { }; + +# prometheus-flask-exporter = callPackage ./python-modules/prometheus-flask-exporter { }; + +# prometrix = callPackage ./python-modules/prometrix { }; + +# promise = callPackage ./python-modules/promise { }; + +# prompt-toolkit = callPackage ./python-modules/prompt-toolkit { }; + +# prompthub-py = callPackage ./python-modules/prompthub-py { }; + +# property-manager = callPackage ./python-modules/property-manager { }; + +# protego = callPackage ./python-modules/protego { }; + +# proto-plus = callPackage ./python-modules/proto-plus { }; + +# # Protobuf 4.x +# protobuf = callPackage ./python-modules/protobuf { +# # If a protobuf upgrade causes many Python packages to fail, please pin it here to the previous version. +# protobuf = pkgs.protobuf; +# }; + +# # Protobuf 3.x +# protobuf3 = callPackage ./python-modules/protobuf/3.nix { +# protobuf = pkgs.protobuf3_20; +# }; + +# protobuf3-to-dict = callPackage ./python-modules/protobuf3-to-dict { }; + +# proton-client = callPackage ./python-modules/proton-client { }; + +# proton-core = callPackage ./python-modules/proton-core { }; + +# proton-keyring-linux = callPackage ./python-modules/proton-keyring-linux { }; + +# proton-keyring-linux-secretservice = callPackage ./python-modules/proton-keyring-linux-secretservice { }; + +# proton-vpn-api-core = callPackage ./python-modules/proton-vpn-api-core { }; + +# proton-vpn-connection = callPackage ./python-modules/proton-vpn-connection { }; + +# proton-vpn-killswitch = callPackage ./python-modules/proton-vpn-killswitch { }; + +# proton-vpn-killswitch-network-manager = callPackage ./python-modules/proton-vpn-killswitch-network-manager { }; + +# proton-vpn-logger = callPackage ./python-modules/proton-vpn-logger { }; + +# proton-vpn-network-manager = callPackage ./python-modules/proton-vpn-network-manager { }; + +# proton-vpn-network-manager-openvpn = callPackage ./python-modules/proton-vpn-network-manager-openvpn { }; + +# proton-vpn-session = callPackage ./python-modules/proton-vpn-session { }; + +# protonup-ng = callPackage ./python-modules/protonup-ng { }; + +# protonvpn-nm-lib = callPackage ./python-modules/protonvpn-nm-lib { +# pkgs-systemd = pkgs.systemd; +# }; + +# prov = callPackage ./python-modules/prov { }; + +# prox-tv = callPackage ./python-modules/prox-tv { }; + +# proxmoxer = callPackage ./python-modules/proxmoxer { }; + +# proxy-py = callPackage ./python-modules/proxy-py { }; + +# psautohint = callPackage ./python-modules/psautohint { }; + +# pscript = callPackage ./python-modules/pscript { }; + +# psd-tools = callPackage ./python-modules/psd-tools { }; + + psutil = callPackage ./python-modules/psutil { + stdenv = if pkgs.stdenv.isDarwin then pkgs.overrideSDK pkgs.stdenv "11.0" else pkgs.stdenv; + inherit (pkgs.darwin.apple_sdk.frameworks) CoreFoundation IOKit; + }; + +# psutil-home-assistant = callPackage ./python-modules/psutil-home-assistant { }; + +# psychrolib = callPackage ./python-modules/psychrolib { }; + +# psycopg = callPackage ./python-modules/psycopg { }; + +# psycopg2 = callPackage ./python-modules/psycopg2 { }; + +# psycopg2cffi = callPackage ./python-modules/psycopg2cffi { }; + +# psygnal = callPackage ./python-modules/psygnal { }; + +# ptable = callPackage ./python-modules/ptable { }; + +# ptest = callPackage ./python-modules/ptest { }; + +# ptpython = callPackage ./python-modules/ptpython { }; + +# ptyprocess = callPackage ./python-modules/ptyprocess { }; + +# publicsuffix2 = callPackage ./python-modules/publicsuffix2 { }; + +# publicsuffix = callPackage ./python-modules/publicsuffix { }; + +# publicsuffixlist = callPackage ./python-modules/publicsuffixlist { }; + +# pubnub = callPackage ./python-modules/pubnub { }; + +# pubnubsub-handler = callPackage ./python-modules/pubnubsub-handler { }; + +# pudb = callPackage ./python-modules/pudb { }; + +# pulp = callPackage ./python-modules/pulp { }; + +# pulsar-client = callPackage ./python-modules/pulsar-client { }; + +# pulsectl-asyncio = callPackage ./python-modules/pulsectl-asyncio { }; + +# pulsar = callPackage ./python-modules/pulsar { }; + +# pulsectl = callPackage ./python-modules/pulsectl { }; + +# pure-cdb = callPackage ./python-modules/pure-cdb { }; + +# pure-eval = callPackage ./python-modules/pure-eval { }; + +# pure-pcapy3 = callPackage ./python-modules/pure-pcapy3 { }; + +# purepng = callPackage ./python-modules/purepng { }; + +# pure-protobuf = callPackage ./python-modules/pure-protobuf { }; + +# pure-python-adb = callPackage ./python-modules/pure-python-adb { }; + +# pure-python-adb-homeassistant = callPackage ./python-modules/pure-python-adb-homeassistant { }; + +# puremagic = callPackage ./python-modules/puremagic { }; + +# purl = callPackage ./python-modules/purl { }; + +# push-receiver = callPackage ./python-modules/push-receiver { }; + +# pushbullet-py = callPackage ./python-modules/pushbullet-py { }; + +# pushover-complete = callPackage ./python-modules/pushover-complete { }; + +# pvextractor = callPackage ./python-modules/pvextractor { }; + +# pvlib = callPackage ./python-modules/pvlib { }; + +# pvo = callPackage ./python-modules/pvo { }; + +# pweave = callPackage ./python-modules/pweave { }; + +# pwlf = callPackage ./python-modules/pwlf { }; + +# pwndbg = callPackage ./python-modules/pwndbg { }; + +# pwntools = callPackage ./python-modules/pwntools { +# debugger = pkgs.gdb; +# }; + +# pxml = callPackage ./python-modules/pxml { }; + +# py-air-control = callPackage ./python-modules/py-air-control { }; + +# py-air-control-exporter = callPackage ./python-modules/py-air-control-exporter { }; + +# py-bip39-bindings = callPackage ./python-modules/py-bip39-bindings { }; + +# py-dmidecode = callPackage ./python-modules/py-dmidecode { }; + +# py-dormakaba-dkey = callPackage ./python-modules/py-dormakaba-dkey { }; + +# py-nightscout = callPackage ./python-modules/py-nightscout { }; + +# py-partiql-parser = callPackage ./python-modules/py-partiql-parser { }; + +# py-pdf-parser = callPackage ./python-modules/py-pdf-parser { }; + +# py-serializable = callPackage ./python-modules/py-serializable { }; + +# py-synologydsm-api = callPackage ./python-modules/py-synologydsm-api { }; + +# py-sneakers = callPackage ./python-modules/py-sneakers { }; + +# py-sr25519-bindings = callPackage ./python-modules/py-sr25519-bindings { }; + +# py-tes = callPackage ./python-modules/py-tes { }; + +# py-ubjson = callPackage ./python-modules/py-ubjson { }; + +# py-zabbix = callPackage ./python-modules/py-zabbix { }; + +# py17track = callPackage ./python-modules/py17track { }; + +# py2bit = callPackage ./python-modules/py2bit { }; + +# py3buddy = toPythonModule (callPackage ./python-modules/py3buddy { }); + +# py3exiv2 = callPackage ./python-modules/py3exiv2 { }; + +# py3langid = callPackage ./python-modules/py3langid { }; + +# py3nvml = callPackage ./python-modules/py3nvml { }; + +# py3rijndael = callPackage ./python-modules/py3rijndael { }; + +# py3status = callPackage ./python-modules/py3status { }; + +# py3to2 = callPackage ./python-modules/3to2 { }; + +# py4j = callPackage ./python-modules/py4j { }; + +# pyacaia-async = callPackage ./python-modules/pyacaia-async { }; + +# pyacoustid = callPackage ./python-modules/pyacoustid { }; + +# pyads = callPackage ./python-modules/pyads { }; + +# pyaes = callPackage ./python-modules/pyaes { }; + +# pyaftership = callPackage ./python-modules/pyaftership { }; + +# pyahocorasick = callPackage ./python-modules/pyahocorasick { }; + +# pyairnow = callPackage ./python-modules/pyairnow { }; + +# pyairvisual = callPackage ./python-modules/pyairvisual { }; + +# pyalgotrade = callPackage ./python-modules/pyalgotrade { }; + +# pyamg = callPackage ./python-modules/pyamg { }; + +# pyaml = callPackage ./python-modules/pyaml { }; + +# pyannotate = callPackage ./python-modules/pyannotate { }; + +# pyannote-audio = callPackage ./python-modules/pyannote-audio { }; + +# pyannote-pipeline = callPackage ./python-modules/pyannote-pipeline { }; + +# pyannote-metrics = callPackage ./python-modules/pyannote-metrics { }; + +# pyannote-database = callPackage ./python-modules/pyannote-database { }; + +# pyannote-core = callPackage ./python-modules/pyannote-core { }; + +# pyarlo = callPackage ./python-modules/pyarlo { }; + +# pyarr = callPackage ./python-modules/pyarr { }; + +# pyarrow = callPackage ./python-modules/pyarrow { +# inherit (pkgs) arrow-cpp cmake; +# }; + +# pyarrow-hotfix = callPackage ./python-modules/pyarrow-hotfix { }; + +# pyasn = callPackage ./python-modules/pyasn { }; + +# pyasn1 = callPackage ./python-modules/pyasn1 { }; + +# pyasn1-modules = callPackage ./python-modules/pyasn1-modules { }; + +# pyasuswrt = callPackage ./python-modules/pyasuswrt { }; + +# pyasyncore = callPackage ./python-modules/pyasyncore { }; + +# pyathena = callPackage ./python-modules/pyathena { }; + +# pyatmo = callPackage ./python-modules/pyatmo { }; + +# pyatspi = callPackage ./python-modules/pyatspi { }; + +# pyatv = callPackage ./python-modules/pyatv { }; + +# pyaudio = callPackage ./python-modules/pyaudio { }; + +# pyaussiebb = callPackage ./python-modules/pyaussiebb { }; + +# pyautogui = callPackage ./python-modules/pyautogui { }; + +# pyavm = callPackage ./python-modules/pyavm { }; + +# pyaxmlparser = callPackage ./python-modules/pyaxmlparser { }; + +# pybalboa = callPackage ./python-modules/pybalboa { }; + +# pybase64 = callPackage ./python-modules/pybase64 { }; + +# pybids = callPackage ./python-modules/pybids { }; + +# pybigwig = callPackage ./python-modules/pybigwig { }; + +# pybind11 = callPackage ./python-modules/pybind11 { }; + +# pybindgen = callPackage ./python-modules/pybindgen { }; + +# pyblackbird = callPackage ./python-modules/pyblackbird { }; + +# pybloom-live = callPackage ./python-modules/pybloom-live { }; + +# pybluez = callPackage ./python-modules/pybluez { +# inherit (pkgs) bluez; +# }; + +# pybotvac = callPackage ./python-modules/pybotvac { }; + +# pybox2d = callPackage ./python-modules/pybox2d { }; + +# pybravia = callPackage ./python-modules/pybravia { }; + +# pybrowsers = callPackage ./python-modules/pybrowsers { }; + +# pybrowserid = callPackage ./python-modules/pybrowserid { }; + +# pybtex = callPackage ./python-modules/pybtex { }; + +# pybtex-docutils = callPackage ./python-modules/pybtex-docutils { }; + +# pybullet = callPackage ./python-modules/pybullet { }; + +# pycairo = callPackage ./python-modules/pycairo { +# inherit (pkgs.buildPackages) meson; +# }; + +# py = callPackage ./python-modules/py { }; + +# pycangjie = callPackage ./python-modules/pycangjie { }; + +# pycapnp = callPackage ./python-modules/pycapnp { }; + +# pycaption = callPackage ./python-modules/pycaption { }; + +# pycares = callPackage ./python-modules/pycares { }; + +# pycarwings2 = callPackage ./python-modules/pycarwings2 { }; + +# pycatch22 = callPackage ./python-modules/pycatch22 { }; + +# pycategories = callPackage ./python-modules/pycategories { }; + +# pycddl = callPackage ./python-modules/pycddl { }; + +# pycdio = callPackage ./python-modules/pycdio { }; + +# pycec = callPackage ./python-modules/pycec { }; + +# pycep-parser = callPackage ./python-modules/pycep-parser { }; + +# pycfdns = callPackage ./python-modules/pycfdns { }; + +# pycflow2dot = callPackage ./python-modules/pycflow2dot { +# inherit (pkgs) graphviz; +# }; + +# pycfmodel = callPackage ./python-modules/pycfmodel { }; + +# pychannels = callPackage ./python-modules/pychannels { }; + +# pychart = callPackage ./python-modules/pychart { }; + +# pychm = callPackage ./python-modules/pychm { }; + +# pychromecast = callPackage ./python-modules/pychromecast { }; + +# pyclimacell = callPackage ./python-modules/pyclimacell { }; + +# pyclip = callPackage ./python-modules/pyclip { }; + +# pyclipper = callPackage ./python-modules/pyclipper { }; + +# pycm = callPackage ./python-modules/pycm { }; + +# pycmarkgfm = callPackage ./python-modules/pycmarkgfm { }; + +# pycocotools = callPackage ./python-modules/pycocotools { }; + +# pycodestyle = callPackage ./python-modules/pycodestyle { }; + +# pycognito = callPackage ./python-modules/pycognito { }; + +# pycoin = callPackage ./python-modules/pycoin { }; + +# pycollada = callPackage ./python-modules/pycollada { }; + +# pycomfoconnect = callPackage ./python-modules/pycomfoconnect { }; + +# pycontracts = callPackage ./python-modules/pycontracts { }; + +# pycosat = callPackage ./python-modules/pycosat { }; + +# pycotap = callPackage ./python-modules/pycotap { }; + +# pycountry = callPackage ./python-modules/pycountry { }; + + pycparser = callPackage ./python-modules/pycparser { }; + +# py-canary = callPackage ./python-modules/py-canary { }; + +# py-cid = callPackage ./python-modules/py-cid { }; + +# py-cpuinfo = callPackage ./python-modules/py-cpuinfo { }; + +# pycardano = callPackage ./python-modules/pycardano { }; + +# pycrc = callPackage ./python-modules/pycrc { }; + +# pycritty = callPackage ./python-modules/pycritty { }; + +# pycron = callPackage ./python-modules/pycron { }; + +# pycrypto = callPackage ./python-modules/pycrypto { }; + +# pycryptodome = callPackage ./python-modules/pycryptodome { }; + +# pycryptodomex = callPackage ./python-modules/pycryptodomex { }; + +# pycsdr = callPackage ./python-modules/pycsdr { }; + +# pyct = callPackage ./python-modules/pyct { }; + +# pyctr = callPackage ./python-modules/pyctr { }; + +# pycuda = callPackage ./python-modules/pycuda { +# inherit (pkgs.stdenv) mkDerivation; +# }; + +# pycups = callPackage ./python-modules/pycups { }; + +# pycurl = callPackage ./python-modules/pycurl { }; + +# pycxx = callPackage ./python-modules/pycxx { }; + +# pycyphal = callPackage ./python-modules/pycyphal { }; + +# pydaikin = callPackage ./python-modules/pydaikin { }; + +# pydal = callPackage ./python-modules/pydal { }; + +# pydanfossair = callPackage ./python-modules/pydanfossair { }; + +# pydantic = callPackage ./python-modules/pydantic { }; + +# pydantic_1 = callPackage ./python-modules/pydantic/1.nix { }; + +# pydantic-compat = callPackage ./python-modules/pydantic-compat { }; + +# pydantic-core = callPackage ./python-modules/pydantic-core { }; + +# pydantic-extra-types = callPackage ./python-modules/pydantic-extra-types { }; + +# pydantic-scim = callPackage ./python-modules/pydantic-scim { }; + +# pydantic-settings = callPackage ./python-modules/pydantic-settings { }; + +# pydantic-yaml-0 = callPackage ./python-modules/pydantic-yaml-0 { }; + +# pydash = callPackage ./python-modules/pydash { }; + +# pydata-google-auth = callPackage ./python-modules/pydata-google-auth { }; + +# pydata-sphinx-theme = callPackage ./python-modules/pydata-sphinx-theme { }; + +# pydateinfer = callPackage ./python-modules/pydateinfer { }; + +# pydbus = callPackage ./python-modules/pydbus { }; + +# pydeck = callPackage ./python-modules/pydeck { }; + +# pydeconz = callPackage ./python-modules/pydeconz { }; + +# pydelijn = callPackage ./python-modules/pydelijn { }; + +# pydenticon = callPackage ./python-modules/pydenticon { }; + +# pydeps = callPackage ./python-modules/pydeps { +# inherit (pkgs) graphviz; +# }; + +# pydes = callPackage ./python-modules/pydes { }; + +# py-desmume = callPackage ./python-modules/py-desmume { +# inherit (pkgs) libpcap; # Avoid confusion with python package of the same name +# }; + +# pydevccu = callPackage ./python-modules/pydevccu { }; + +# pydevd = callPackage ./python-modules/pydevd { }; + +# pydevtool = callPackage ./python-modules/pydevtool { }; + +# pydexcom = callPackage ./python-modules/pydexcom { }; + +# pydicom = callPackage ./python-modules/pydicom { }; + +# pydicom-seg = callPackage ./python-modules/pydicom-seg { }; + +# pydigiham = callPackage ./python-modules/pydigiham { }; + +# pydiscourse = callPackage ./python-modules/pydiscourse { }; + +# pydiscovergy = callPackage ./python-modules/pydiscovergy { }; + +# pydispatcher = callPackage ./python-modules/pydispatcher { }; + +# pydmd = callPackage ./python-modules/pydmd { }; + +# pydns = callPackage ./python-modules/py3dns { }; + +# pydocstyle = callPackage ./python-modules/pydocstyle { }; + +# pydocumentdb = callPackage ./python-modules/pydocumentdb { }; + +# pydoods = callPackage ./python-modules/pydoods { }; + +# pydoe = callPackage ./python-modules/pydoe { }; + +# pydot = callPackage ./python-modules/pydot { +# inherit (pkgs) graphviz; +# }; + +# pydrawise = callPackage ./python-modules/pydrawise { }; + +# pydrive2 = callPackage ./python-modules/pydrive2 { }; + +# pydroid-ipcam = callPackage ./python-modules/pydroid-ipcam { }; + +# pydruid = callPackage ./python-modules/pydruid { }; + +# pydsdl = callPackage ./python-modules/pydsdl { }; + +# pydub = callPackage ./python-modules/pydub { }; + +# pyduke-energy = callPackage ./python-modules/pyduke-energy { }; + +# pyduotecno = callPackage ./python-modules/pyduotecno { }; + +# pydy = callPackage ./python-modules/pydy { }; + +# pydyf = callPackage ./python-modules/pydyf { }; + +# pyebus = callPackage ./python-modules/pyebus { }; + +# pyechonest = callPackage ./python-modules/pyechonest { }; + +# pyeclib = callPackage ./python-modules/pyeclib { }; + +# pyecoforest = callPackage ./python-modules/pyecoforest { }; + +# pyeconet = callPackage ./python-modules/pyeconet { }; + +# pyecowitt = callPackage ./python-modules/pyecowitt { }; + +# pyedimax = callPackage ./python-modules/pyedimax { }; + +# pyee = callPackage ./python-modules/pyee { }; + +# pyefergy = callPackage ./python-modules/pyefergy { }; + +# pyeight = callPackage ./python-modules/pyeight { }; + + pyelftools = callPackage ./python-modules/pyelftools { }; + +# pyemby = callPackage ./python-modules/pyemby { }; + +# pyemd = callPackage ./python-modules/pyemd { }; + +# pyemvue = callPackage ./python-modules/pyemvue { }; + +# pyenchant = callPackage ./python-modules/pyenchant { +# inherit (pkgs) enchant2; +# }; + +# pyenphase = callPackage ./python-modules/pyenphase { }; + +# pyenvisalink = callPackage ./python-modules/pyenvisalink { }; + +# pyephember = callPackage ./python-modules/pyephember { }; + +# pyepsg = callPackage ./python-modules/pyepsg { }; + +# pyerfa = callPackage ./python-modules/pyerfa { }; + +# pyevmasm = callPackage ./python-modules/pyevmasm { }; + +# pyevilgenius = callPackage ./python-modules/pyevilgenius { }; + +# pyexcel = callPackage ./python-modules/pyexcel { }; + +# pyexcel-io = callPackage ./python-modules/pyexcel-io { }; + +# pyexcel-ods = callPackage ./python-modules/pyexcel-ods { }; + +# pyexcel-xls = callPackage ./python-modules/pyexcel-xls { }; + +# pyexiftool = callPackage ./python-modules/pyexiftool { }; + +# pyexploitdb = callPackage ./python-modules/pyexploitdb { }; + +# pyezviz = callPackage ./python-modules/pyezviz { }; + +# pyface = callPackage ./python-modules/pyface { }; + +# pyfaidx = callPackage ./python-modules/pyfaidx { }; + +# pyfakefs = callPackage ./python-modules/pyfakefs { }; + +# pyfakewebcam = callPackage ./python-modules/pyfakewebcam { }; + +# pyfantom = callPackage ./python-modules/pyfantom { }; + +# pyfcm = callPackage ./python-modules/pyfcm { }; + +# pyfftw = callPackage ./python-modules/pyfftw { }; + +# pyfido = callPackage ./python-modules/pyfido { }; + +# pyfiglet = callPackage ./python-modules/pyfiglet { }; + +# pyfnip = callPackage ./python-modules/pyfnip { }; + +# pyflakes = callPackage ./python-modules/pyflakes { }; + +# pyflic = callPackage ./python-modules/pyflic { }; + +# pyflume = callPackage ./python-modules/pyflume { }; + +# pyfma = callPackage ./python-modules/pyfma { }; + +# pyfribidi = callPackage ./python-modules/pyfribidi { }; + +# pyfritzhome = callPackage ./python-modules/pyfritzhome { }; + +# pyfronius = callPackage ./python-modules/pyfronius { }; + +# pyftdi = callPackage ./python-modules/pyftdi { }; + +# pyftgl = callPackage ./python-modules/pyftgl { }; + +# pyftpdlib = callPackage ./python-modules/pyftpdlib { }; + +# pyfttt = callPackage ./python-modules/pyfttt { }; + +# pyfume = callPackage ./python-modules/pyfume { }; + +# pyfuse3 = callPackage ./python-modules/pyfuse3 { }; + +# pyfxa = callPackage ./python-modules/pyfxa { }; + +# pyfzf = callPackage ./python-modules/pyfzf { +# inherit (pkgs) fzf; +# }; + +# pygal = callPackage ./python-modules/pygal { }; + +# pygame = callPackage ./python-modules/pygame { +# inherit (pkgs.darwin.apple_sdk.frameworks) AppKit; +# SDL2_image = pkgs.SDL2_image_2_0; +# }; + +# pygame-ce = callPackage ./python-modules/pygame-ce { +# inherit (pkgs.darwin.apple_sdk.frameworks) AppKit; +# SDL2_image = pkgs.SDL2_image_2_0; +# SDL2_mixer = pkgs.SDL2_mixer_2_0; +# }; + +# pygame-sdl2 = callPackage ./python-modules/pygame-sdl2 { }; + +# pygame-gui = callPackage ./python-modules/pygame-gui { }; + +# pygatt = callPackage ./python-modules/pygatt { }; + +# pygccxml = callPackage ./python-modules/pygccxml { }; + +# pygdbmi = callPackage ./python-modules/pygdbmi { }; + +# pygeoip = callPackage ./python-modules/pygeoip { }; + +# pygeos = callPackage ./python-modules/pygeos { }; + +# pygetwindow = callPackage ./python-modules/pygetwindow { }; + + pygit2 = callPackage ./python-modules/pygit2 { }; + +# pygitguardian = callPackage ./python-modules/pygitguardian { }; + +# pygithub = callPackage ./python-modules/pygithub { }; + +# pyglet = callPackage ./python-modules/pyglet { }; + +# pyglm = callPackage ./python-modules/pyglm { }; + +# pygls = callPackage ./python-modules/pygls { }; + +# pygltflib = callPackage ./python-modules/pygltflib { }; + +# pygmars = callPackage ./python-modules/pygmars { }; + +# pygments-better-html = callPackage ./python-modules/pygments-better-html { }; + + pygments = callPackage ./python-modules/pygments { }; + +# pygments-markdown-lexer = callPackage ./python-modules/pygments-markdown-lexer { }; + +# pygmo = callPackage ./python-modules/pygmo { }; + +# pygmt = callPackage ./python-modules/pygmt { }; + +# pygobject3 = callPackage ./python-modules/pygobject/3.nix { +# # inherit (pkgs) meson won't work because it won't be spliced +# inherit (pkgs.buildPackages) meson; +# }; + +# pygobject-stubs = callPackage ./python-modules/pygobject-stubs { }; + +# pygogo = callPackage ./python-modules/pygogo { }; + +# pygpgme = callPackage ./python-modules/pygpgme { }; + +# pygraphviz = callPackage ./python-modules/pygraphviz { +# inherit (pkgs) graphviz; +# }; + +# pygreat = callPackage ./python-modules/pygreat { }; + +# pygrok = callPackage ./python-modules/pygrok { }; + +# pygsl = callPackage ./python-modules/pygsl { +# inherit (pkgs) gsl swig; +# }; + +# pygtfs = callPackage ./python-modules/pygtfs { }; + +# pygtail = callPackage ./python-modules/pygtail { }; + +# pygtkspellcheck = callPackage ./python-modules/pygtkspellcheck { }; + +# pygtrie = callPackage ./python-modules/pygtrie { }; + +# pyhamcrest = callPackage ./python-modules/pyhamcrest { }; + +# pyhanko = callPackage ./python-modules/pyhanko { }; + +# pyhanko-certvalidator = callPackage ./python-modules/pyhanko-certvalidator { }; + +# pyhaversion = callPackage ./python-modules/pyhaversion { }; + +# pyhcl = callPackage ./python-modules/pyhcl { }; + +# pyhocon = callPackage ./python-modules/pyhocon { }; + +# pyhomematic = callPackage ./python-modules/pyhomematic { }; + +# pyhomepilot = callPackage ./python-modules/pyhomepilot { }; + +# pyhomeworks = callPackage ./python-modules/pyhomeworks { }; + +# pyheif = callPackage ./python-modules/pyheif { }; + +# pyi2cflash = callPackage ./python-modules/pyi2cflash { }; + +# pyialarm = callPackage ./python-modules/pyialarm { }; + +# pyicloud = callPackage ./python-modules/pyicloud { }; + +# pyicu = callPackage ./python-modules/pyicu { }; + +# pyimpfuzzy = callPackage ./python-modules/pyimpfuzzy { +# inherit (pkgs) ssdeep; +# }; + +# pyinotify = callPackage ./python-modules/pyinotify { }; + +# pyinputevent = callPackage ./python-modules/pyinputevent { }; + +# pyinsteon = callPackage ./python-modules/pyinsteon { }; + +# pyinstrument = callPackage ./python-modules/pyinstrument { }; + +# pyintesishome = callPackage ./python-modules/pyintesishome { }; + +# pyipma = callPackage ./python-modules/pyipma { }; + +# pyipp = callPackage ./python-modules/pyipp { }; + +# pyipv8 = callPackage ./python-modules/pyipv8 { }; + +# pyiqvia = callPackage ./python-modules/pyiqvia { }; + +# pyisbn = callPackage ./python-modules/pyisbn { }; + +# pyjet = callPackage ./python-modules/pyjet { }; + +# pyjks = callPackage ./python-modules/pyjks { }; + +# pyjnius = callPackage ./python-modules/pyjnius { }; + +# pyjsparser = callPackage ./python-modules/pyjsparser { }; + +# pyjwkest = callPackage ./python-modules/pyjwkest { }; + +# pyjwt = callPackage ./python-modules/pyjwt { }; + +# pykakasi = callPackage ./python-modules/pykakasi { }; + +# pykaleidescape = callPackage ./python-modules/pykaleidescape { }; + +# pykalman = callPackage ./python-modules/pykalman { }; + +# pykdl = callPackage ./python-modules/pykdl { }; + +# pykdtree = callPackage ./python-modules/pykdtree { +# inherit (pkgs.llvmPackages) openmp; +# }; + +# pykeepass = callPackage ./python-modules/pykeepass { }; + +# pykerberos = callPackage ./python-modules/pykerberos { }; + +# pykeyatome = callPackage ./python-modules/pykeyatome { }; + +# pykira = callPackage ./python-modules/pykira { }; + +# pykka = callPackage ./python-modules/pykka { }; + +# pykmtronic = callPackage ./python-modules/pykmtronic { }; + +# pykodi = callPackage ./python-modules/pykodi { }; + +# pykoplenti = callPackage ./python-modules/pykoplenti { }; + +# pykostalpiko = callPackage ./python-modules/pykostalpiko { }; + +# pykulersky = callPackage ./python-modules/pykulersky { }; + +# pykwalify = callPackage ./python-modules/pykwalify { }; + +# pykwb = callPackage ./python-modules/pykwb { }; + +# pylacrosse = callPackage ./python-modules/pylacrosse { }; + +# pylacus = callPackage ./python-modules/pylacus { }; + +# pylama = callPackage ./python-modules/pylama { }; + +# pylast = callPackage ./python-modules/pylast { }; + +# pylatex = callPackage ./python-modules/pylatex { }; + +# pylatexenc = callPackage ./python-modules/pylatexenc { }; + +# pylaunches = callPackage ./python-modules/pylaunches { }; + +# pyld = callPackage ./python-modules/pyld { }; + +# pyleri = callPackage ./python-modules/pyleri { }; + +# pylev = callPackage ./python-modules/pylev { }; + +# pylgnetcast = callPackage ./python-modules/pylgnetcast { }; + +# pylibacl = callPackage ./python-modules/pylibacl { }; + +# pylibconfig2 = callPackage ./python-modules/pylibconfig2 { }; + +# pylibdmtx = callPackage ./python-modules/pylibdmtx { }; + +# pylibftdi = callPackage ./python-modules/pylibftdi { +# inherit (pkgs) libusb1; +# }; + +# pylibjpeg = callPackage ./python-modules/pylibjpeg { }; + +# pylibjpeg-libjpeg = callPackage ./python-modules/pylibjpeg-libjpeg { }; + +# pyliblo = callPackage ./python-modules/pyliblo { }; + +# pylibmc = callPackage ./python-modules/pylibmc { }; + +# pylink-square = callPackage ./python-modules/pylink-square { }; + +# pylint = callPackage ./python-modules/pylint { }; + +# pylint-celery = callPackage ./python-modules/pylint-celery { }; + +# pylint-django = callPackage ./python-modules/pylint-django { }; + +# pylint-flask = callPackage ./python-modules/pylint-flask { }; + +# pylint-plugin-utils = callPackage ./python-modules/pylint-plugin-utils { }; + +# pylint-venv = callPackage ./python-modules/pylint-venv { }; + +# pylion = callPackage ./python-modules/pylion { }; + +# pylitterbot = callPackage ./python-modules/pylitterbot { }; + +# py-libzfs = callPackage ./python-modules/py-libzfs { }; + +# py-lru-cache = callPackage ./python-modules/py-lru-cache { }; + +# pylnk3 = callPackage ./python-modules/pylnk3 { }; + +# pylru = callPackage ./python-modules/pylru { }; + +# pylsqpack = callPackage ./python-modules/pylsqpack { }; + +# pyls-flake8 = callPackage ./python-modules/pyls-flake8 { }; + +# pyls-isort = callPackage ./python-modules/pyls-isort { }; + +# pyls-memestra = callPackage ./python-modules/pyls-memestra { }; + +# pyls-spyder = callPackage ./python-modules/pyls-spyder { }; + +# pylsp-mypy = callPackage ./python-modules/pylsp-mypy { }; + +# pylsp-rope = callPackage ./python-modules/pylsp-rope { }; + +# pylpsd = callPackage ./python-modules/pylpsd { }; + +# pylti = callPackage ./python-modules/pylti { }; + +# pylutron = callPackage ./python-modules/pylutron { }; + +# pylutron-caseta = callPackage ./python-modules/pylutron-caseta { }; + +# pylyrics = callPackage ./python-modules/pylyrics { }; + +# pylxd = callPackage ./python-modules/pylxd { }; + +# pylzma = callPackage ./python-modules/pylzma { }; + +# pymacaroons = callPackage ./python-modules/pymacaroons { }; + +# pymailgunner = callPackage ./python-modules/pymailgunner { }; + +# pymanopt = callPackage ./python-modules/pymanopt { }; + +# pymarshal = callPackage ./python-modules/pymarshal { }; + +# pymata-express = callPackage ./python-modules/pymata-express { }; + +# pymatgen = callPackage ./python-modules/pymatgen { }; + +# pymatreader = callPackage ./python-modules/pymatreader { }; + +# pymatting = callPackage ./python-modules/pymatting { }; + +# pymaven-patch = callPackage ./python-modules/pymaven-patch { }; + +# pymavlink = callPackage ./python-modules/pymavlink { }; + +# pymbolic = callPackage ./python-modules/pymbolic { }; + +# pymc = callPackage ./python-modules/pymc { }; + +# pymdstat = callPackage ./python-modules/pymdstat { }; + +# pymdown-extensions = callPackage ./python-modules/pymdown-extensions { }; + +# pymediainfo = callPackage ./python-modules/pymediainfo { }; + +# pymediaroom = callPackage ./python-modules/pymediaroom { }; + +# pymedio = callPackage ./python-modules/pymedio { }; + +# pymeeus = callPackage ./python-modules/pymeeus { }; + +# pymelcloud = callPackage ./python-modules/pymelcloud { }; + +# pymemcache = callPackage ./python-modules/pymemcache { }; + +# pymemoize = callPackage ./python-modules/pymemoize { }; + +# pyment = callPackage ./python-modules/pyment { }; + +# pymetar = callPackage ./python-modules/pymetar { }; + +# pymeteireann = callPackage ./python-modules/pymeteireann { }; + +# pymeteoclimatic = callPackage ./python-modules/pymeteoclimatic { }; + +# pymetno = callPackage ./python-modules/pymetno { }; + +# pymicrobot = callPackage ./python-modules/pymicrobot { }; + +# pymiele = callPackage ./python-modules/pymiele { }; + +# pymilter = callPackage ./python-modules/pymilter { }; + +# pymilvus = callPackage ./python-modules/pymilvus { }; + +# pymitv = callPackage ./python-modules/pymitv { }; + +# pymfy = callPackage ./python-modules/pymfy { }; + +# pymodbus = callPackage ./python-modules/pymodbus { }; + +# pymongo = callPackage ./python-modules/pymongo { }; + +# pymongo-inmemory = callPackage ./python-modules/pymongo-inmemory { }; + +# pymoo = callPackage ./python-modules/pymoo { }; + +# pymorphy2 = callPackage ./python-modules/pymorphy2 { }; + +# pymorphy2-dicts-ru = callPackage ./python-modules/pymorphy2/dicts-ru.nix { }; + +# pymorphy3 = callPackage ./python-modules/pymorphy3 { }; + +# pymorphy3-dicts-ru = callPackage ./python-modules/pymorphy3/dicts-ru.nix { }; + +# pymorphy3-dicts-uk = callPackage ./python-modules/pymorphy3/dicts-uk.nix { }; + +# pympler = callPackage ./python-modules/pympler { }; + +# pymsgbox = callPackage ./python-modules/pymsgbox { }; + +# pymsteams = callPackage ./python-modules/pymsteams { }; + +# py-multiaddr = callPackage ./python-modules/py-multiaddr { }; + +# py-multibase = callPackage ./python-modules/py-multibase { }; + +# py-multicodec = callPackage ./python-modules/py-multicodec { }; + +# py-multihash = callPackage ./python-modules/py-multihash { }; + +# pymumble = callPackage ./python-modules/pymumble { }; + +# pymunk = callPackage ./python-modules/pymunk { +# inherit (pkgs.darwin.apple_sdk.frameworks) ApplicationServices; +# }; + +# pymupdf = callPackage ./python-modules/pymupdf { }; + +# pymvglive = callPackage ./python-modules/pymvglive { }; + +# pymysensors = callPackage ./python-modules/pymysensors { }; + +# pymysql = callPackage ./python-modules/pymysql { }; + +# pymysqlsa = callPackage ./python-modules/pymysqlsa { }; + +# pymystem3 = callPackage ./python-modules/pymystem3 { }; + +# pynac = callPackage ./python-modules/pynac { }; + +# pynacl = callPackage ./python-modules/pynacl { }; + +# pynamecheap = callPackage ./python-modules/pynamecheap { }; + +# pynamodb = callPackage ./python-modules/pynamodb { }; + +# pynanoleaf = callPackage ./python-modules/pynanoleaf { }; + +# pync = callPackage ./python-modules/pync { +# inherit (pkgs) which; +# }; + +# pynello = callPackage ./python-modules/pynello { }; + +# pynest2d = callPackage ./python-modules/pynest2d { }; + +# pynetbox = callPackage ./python-modules/pynetbox { }; + +# pynetdicom = callPackage ./python-modules/pynetdicom { }; + +# pynetgear = callPackage ./python-modules/pynetgear { }; + +# pynina = callPackage ./python-modules/pynina { }; + +# pynisher = callPackage ./python-modules/pynisher { }; + +# pynmea2 = callPackage ./python-modules/pynmea2 { }; + +# pynmeagps = callPackage ./python-modules/pynmeagps { }; + +# pynput = callPackage ./python-modules/pynput { }; + +# pynrrd = callPackage ./python-modules/pynrrd { }; + +# pynvim = callPackage ./python-modules/pynvim { }; + +# pynvim-pp = callPackage ./python-modules/pynvim-pp { }; + +# pynvml = callPackage ./python-modules/pynvml { }; + +# pynzb = callPackage ./python-modules/pynzb { }; + +# pyobihai = callPackage ./python-modules/pyobihai { }; + +# pyocd = callPackage ./python-modules/pyocd { }; + +# pyocd-pemicro = callPackage ./python-modules/pyocd-pemicro { }; + +# pyocr = callPackage ./python-modules/pyocr { +# tesseract = pkgs.tesseract4; +# }; + +# pyoctoprintapi = callPackage ./python-modules/pyoctoprintapi { }; + +# pyodbc = callPackage ./python-modules/pyodbc { }; + +# pyogg = callPackage ./python-modules/pyogg { }; + +# pyombi = callPackage ./python-modules/pyombi { }; + +# pyomo = callPackage ./python-modules/pyomo { }; + +# pypng = callPackage ./python-modules/pypng { }; + +# phonemizer = callPackage ./python-modules/phonemizer { }; + +# pyopencl = callPackage ./python-modules/pyopencl { +# mesa_drivers = pkgs.mesa.drivers; +# }; + +# pyopengl = callPackage ./python-modules/pyopengl { }; + +# pyopengl-accelerate = callPackage ./python-modules/pyopengl-accelerate { }; + +# pyopenssl = callPackage ./python-modules/pyopenssl { }; + +# pyopenuv = callPackage ./python-modules/pyopenuv { }; + +# pyopnsense = callPackage ./python-modules/pyopnsense { }; + +# pyoppleio = callPackage ./python-modules/pyoppleio { }; + +# pyosf = callPackage ./python-modules/pyosf { }; + +# pyosmium = callPackage ./python-modules/pyosmium { +# inherit (pkgs) lz4; +# }; + +# pyosohotwaterapi = callPackage ./python-modules/pyosohotwaterapi { }; + +# pyotgw = callPackage ./python-modules/pyotgw { }; + +# pyotp = callPackage ./python-modules/pyotp { }; + +# pyowm = callPackage ./python-modules/pyowm { }; + +# pypamtest = toPythonModule (pkgs.libpam-wrapper.override { +# enablePython = true; +# inherit python; +# }); + +# pypandoc = callPackage ./python-modules/pypandoc { }; + +# pyparser = callPackage ./python-modules/pyparser { }; + +# pyparsing = callPackage ./python-modules/pyparsing { }; + +# pyparted = callPackage ./python-modules/pyparted { }; + +# pypass = callPackage ./python-modules/pypass { }; + +# pypblib = callPackage ./python-modules/pypblib { }; + +# pypca = callPackage ./python-modules/pypca { }; + +# pypcap = callPackage ./python-modules/pypcap { +# inherit (pkgs) libpcap; # Avoid confusion with python package of the same name +# }; + +# pypck = callPackage ./python-modules/pypck { }; + +# pypdf = callPackage ./python-modules/pypdf { }; + +# pypdf2 = callPackage ./python-modules/pypdf2 { }; + +# pypdf3 = callPackage ./python-modules/pypdf3 { }; + +# pypeg2 = callPackage ./python-modules/pypeg2 { }; + +# pyperclip = callPackage ./python-modules/pyperclip { }; + +# pyperscan = callPackage ./python-modules/pyperscan { }; + +# pyperf = callPackage ./python-modules/pyperf { }; + +# pyphen = callPackage ./python-modules/pyphen { }; + +# pyphotonfile = callPackage ./python-modules/pyphotonfile { }; + +# pypika = callPackage ./python-modules/pypika { }; + +# pypillowfight = callPackage ./python-modules/pypillowfight { }; + +# pypinyin = callPackage ./python-modules/pypinyin { }; + +# pypiserver = callPackage ./python-modules/pypiserver { }; + +# pypitoken = callPackage ./python-modules/pypitoken { }; + +# pyplaato = callPackage ./python-modules/pyplaato { }; + +# pyplatec = callPackage ./python-modules/pyplatec { }; + +# pyppeteer = callPackage ./python-modules/pyppeteer { }; + +# pypresence = callPackage ./python-modules/pypresence { }; + +# pyprind = callPackage ./python-modules/pyprind { }; + +# pyprof2calltree = callPackage ./python-modules/pyprof2calltree { }; + +# pyproj = callPackage ./python-modules/pyproj { }; + +# pyproject-metadata = callPackage ./python-modules/pyproject-metadata { }; + +# pyprosegur = callPackage ./python-modules/pyprosegur { }; + +# pyprusalink = callPackage ./python-modules/pyprusalink { }; + +# pyptlib = callPackage ./python-modules/pyptlib { }; + +# pypubsub = callPackage ./python-modules/pypubsub { }; + +# pypugjs = callPackage ./python-modules/pypugjs { }; + +# pypykatz = callPackage ./python-modules/pypykatz { }; + +# pypytools = callPackage ./python-modules/pypytools { }; + +# pyqldb = callPackage ./python-modules/pyqldb { }; + +# pyqrcode = callPackage ./python-modules/pyqrcode { }; + +# pyqt-builder = callPackage ./python-modules/pyqt-builder { }; + +# pyqt5 = callPackage ./python-modules/pyqt/5.x.nix { }; + +# pyqt5-stubs = callPackage ./python-modules/pyqt5-stubs { }; + +# pyqt5-sip = callPackage ./python-modules/pyqt/sip.nix { }; + +# pyqt5-multimedia = self.pyqt5.override { +# withMultimedia = true; +# }; + +# /* +# `pyqt5-webkit` should not be used by python libraries in +# pkgs/development/python-modules/*. Putting this attribute in +# `propagatedBuildInputs` may cause collisions. +# */ +# pyqt5-webkit = self.pyqt5.override { +# withWebKit = true; +# }; + +# pyqt6 = callPackage ./python-modules/pyqt/6.x.nix { }; + +# pyqt6-charts = callPackage ./python-modules/pyqt6-charts { }; + +# pyqt6-sip = callPackage ./python-modules/pyqt/pyqt6-sip.nix { }; + +# pyqt6-webengine = callPackage ./python-modules/pyqt6-webengine { }; + +# pyqt3d = pkgs.libsForQt5.callPackage ./python-modules/pyqt3d { +# inherit (self) buildPythonPackage pyqt5 pyqt-builder python pythonOlder +# setuptools sip; +# }; + +# pyqtchart = pkgs.libsForQt5.callPackage ./python-modules/pyqtchart { +# inherit (self) buildPythonPackage pyqt5 pyqt-builder python pythonOlder +# setuptools sip; +# }; + +# pyqtdarktheme = callPackage ./python-modules/pyqtdarktheme { }; + +# pyqtdatavisualization = pkgs.libsForQt5.callPackage ./python-modules/pyqtdatavisualization { +# inherit (self) buildPythonPackage pyqt5 pyqt-builder python pythonOlder +# setuptools sip; +# }; + +# pyqtgraph = callPackage ./python-modules/pyqtgraph { }; + +# pyqtwebengine = pkgs.libsForQt5.callPackage ./python-modules/pyqtwebengine { +# pythonPackages = self; +# }; + +# pyquery = callPackage ./python-modules/pyquery { }; + +# pyquaternion = callPackage ./python-modules/pyquaternion { }; + +# pyquil = callPackage ./python-modules/pyquil { }; + +# pyqvrpro = callPackage ./python-modules/pyqvrpro { }; + +# pyqwikswitch = callPackage ./python-modules/pyqwikswitch { }; + +# pyrabbit2 = callPackage ./python-modules/pyrabbit2 { }; + +# pyrad = callPackage ./python-modules/pyrad { }; + +# pyradiomics = callPackage ./python-modules/pyradiomics { }; + +# pyradios = callPackage ./python-modules/pyradios { }; + +# pyrainbird = callPackage ./python-modules/pyrainbird { }; + +# pyramid-beaker = callPackage ./python-modules/pyramid-beaker { }; + +# pyramid = callPackage ./python-modules/pyramid { }; + +# pyramid-chameleon = callPackage ./python-modules/pyramid-chameleon { }; + +# pyramid-exclog = callPackage ./python-modules/pyramid-exclog { }; + +# pyramid-jinja2 = callPackage ./python-modules/pyramid-jinja2 { }; + +# pyramid-mako = callPackage ./python-modules/pyramid-mako { }; + +# pyramid-multiauth = callPackage ./python-modules/pyramid-multiauth { }; + +# pyrate-limiter = callPackage ./python-modules/pyrate-limiter { }; + +# pyreaderwriterlock = callPackage ./python-modules/pyreaderwriterlock { }; + +# pyreadstat = callPackage ./python-modules/pyreadstat { +# inherit (pkgs.darwin) libiconv; +# }; + +# pyrealsense2 = toPythonModule (pkgs.librealsense.override { +# enablePython = true; +# pythonPackages = self; +# }); + +# pyrealsense2WithCuda = toPythonModule (pkgs.librealsenseWithCuda.override { +# cudaSupport = true; +# enablePython = true; +# pythonPackages = self; +# }); + +# pyrealsense2WithoutCuda = toPythonModule (pkgs.librealsenseWithoutCuda.override { +# enablePython = true; +# pythonPackages = self; +# }); + +# pyrect = callPackage ./python-modules/pyrect { }; + +# pyregion = callPackage ./python-modules/pyregion { }; + +# pyric = callPackage ./python-modules/pyric { }; + +# pyring-buffer = callPackage ./python-modules/pyring-buffer { }; + +# pyrisco = callPackage ./python-modules/pyrisco { }; + +# pyrituals = callPackage ./python-modules/pyrituals { }; + +# pyrfc3339 = callPackage ./python-modules/pyrfc3339 { }; + +# pyrmvtransport = callPackage ./python-modules/pyrmvtransport { }; + +# pyro4 = callPackage ./python-modules/pyro4 { }; + +# pyro5 = callPackage ./python-modules/pyro5 { }; + +# pyroma = callPackage ./python-modules/pyroma { }; + +# pyro-api = callPackage ./python-modules/pyro-api { }; + +# pyro-ppl = callPackage ./python-modules/pyro-ppl { }; + +# pyroute2 = callPackage ./python-modules/pyroute2 { }; + +# pyrr = callPackage ./python-modules/pyrr { }; + +# pyrsistent = callPackage ./python-modules/pyrsistent { }; + +# pyrss2gen = callPackage ./python-modules/pyrss2gen { }; + +# pyrtlsdr = callPackage ./python-modules/pyrtlsdr { }; + +# pysaj = callPackage ./python-modules/pysaj { }; + +# pysam = callPackage ./python-modules/pysam { }; + +# pysaml2 = callPackage ./python-modules/pysaml2 { +# inherit (pkgs) xmlsec; +# }; + +# pysatochip = callPackage ./python-modules/pysatochip { }; + +# pysc2 = callPackage ./python-modules/pysc2 { }; + +# pyscard = callPackage ./python-modules/pyscard { +# inherit (pkgs.darwin.apple_sdk.frameworks) PCSC; +# }; + +# pyscaffold = callPackage ./python-modules/pyscaffold { }; + +# pyscaffoldext-cookiecutter = callPackage ./python-modules/pyscaffoldext-cookiecutter { }; + +# pyscaffoldext-custom-extension = callPackage ./python-modules/pyscaffoldext-custom-extension { }; + +# pyscaffoldext-django = callPackage ./python-modules/pyscaffoldext-django { }; + +# pyscaffoldext-dsproject = callPackage ./python-modules/pyscaffoldext-dsproject { }; + +# pyscaffoldext-markdown = callPackage ./python-modules/pyscaffoldext-markdown { }; + +# pyscaffoldext-travis = callPackage ./python-modules/pyscaffoldext-travis { }; + +# pyscf = callPackage ./python-modules/pyscf { }; + +# pyschedule = callPackage ./python-modules/pyschedule { }; + +# pyscreenshot = callPackage ./python-modules/pyscreenshot { }; + +# pyscreeze = callPackage ./python-modules/pyscreeze { }; + +# py-scrypt = callPackage ./python-modules/py-scrypt { }; + +# pyscrypt = callPackage ./python-modules/pyscrypt { }; + +# pyscss = callPackage ./python-modules/pyscss { }; + +# pysdcp = callPackage ./python-modules/pysdcp { }; + +# pysdl2 = callPackage ./python-modules/pysdl2 { }; + +# pysearpc = toPythonModule (pkgs.libsearpc.override { +# python3 = self.python; +# }); + +# pysecuritas = callPackage ./python-modules/pysecuritas { }; + +# pysendfile = callPackage ./python-modules/pysendfile { }; + +# pysensibo = callPackage ./python-modules/pysensibo { }; + +# pysensors = callPackage ./python-modules/pysensors { }; + +# pyserial-asyncio = callPackage ./python-modules/pyserial-asyncio { }; + +# pyserial-asyncio-fast = callPackage ./python-modules/pyserial-asyncio-fast { }; + +# pyserial = callPackage ./python-modules/pyserial { }; + +# pysftp = callPackage ./python-modules/pysftp { }; + +# pyshp = callPackage ./python-modules/pyshp { }; + +# pyside2-tools = toPythonModule (callPackage ./python-modules/pyside2-tools { +# inherit (pkgs) cmake qt5; +# }); + +# pyside2 = toPythonModule (callPackage ./python-modules/pyside2 { +# inherit (pkgs) cmake ninja qt5; +# }); + +# pyside6 = toPythonModule (callPackage ./python-modules/pyside6 { +# inherit (pkgs) cmake ninja; +# }); + +# pysigma = callPackage ./python-modules/pysigma { }; + +# pysigma-backend-elasticsearch = callPackage ./python-modules/pysigma-backend-elasticsearch { }; + +# pysigma-backend-opensearch = callPackage ./python-modules/pysigma-backend-opensearch { }; + +# pysigma-backend-qradar = callPackage ./python-modules/pysigma-backend-qradar { }; + +# pysigma-backend-splunk = callPackage ./python-modules/pysigma-backend-splunk { }; + +# pysigma-backend-sqlite = callPackage ./python-modules/pysigma-backend-sqlite { }; + +# pysigma-backend-insightidr = callPackage ./python-modules/pysigma-backend-insightidr { }; + +# pysigma-pipeline-crowdstrike = callPackage ./python-modules/pysigma-pipeline-crowdstrike { }; + +# pysigma-pipeline-sysmon = callPackage ./python-modules/pysigma-pipeline-sysmon { }; + +# pysigma-pipeline-windows = callPackage ./python-modules/pysigma-pipeline-windows { }; + +# pysignalclirestapi = callPackage ./python-modules/pysignalclirestapi { }; + +# pysigset = callPackage ./python-modules/pysigset { }; + +# pysim = callPackage ./python-modules/pysim { }; + +# pysimplegui = callPackage ./python-modules/pysimplegui { }; + +# pysingleton = callPackage ./python-modules/pysingleton { }; + +# pyslim = callPackage ./python-modules/pyslim { }; + +# pyslurm = callPackage ./python-modules/pyslurm { +# inherit (pkgs) slurm; +# }; + +# pysma = callPackage ./python-modules/pysma { }; + +# pysmappee = callPackage ./python-modules/pysmappee { }; + +# pysmart = callPackage ./python-modules/pysmart { }; + +# pysmartapp = callPackage ./python-modules/pysmartapp { }; + +# pysmartdl = callPackage ./python-modules/pysmartdl { }; + +# pysmartthings = callPackage ./python-modules/pysmartthings { }; + +# pysmb = callPackage ./python-modules/pysmb { }; + +# pysmbc = callPackage ./python-modules/pysmbc { }; + +# pysmf = callPackage ./python-modules/pysmf { }; + +# pysmi = callPackage ./python-modules/pysmi { }; + +# pysmi-lextudio = callPackage ./python-modules/pysmi-lextudio { }; + +# pysml = callPackage ./python-modules/pysml { }; + +# pysmt = callPackage ./python-modules/pysmt { }; + +# pysnmp = callPackage ./python-modules/pysnmp { }; + +# pysnmpcrypto = callPackage ./python-modules/pysnmpcrypto { }; + +# pysnmp-lextudio = callPackage ./python-modules/pysnmp-lextudio { }; + +# pysnmp-pyasn1 = callPackage ./python-modules/pysnmp-pyasn1 { }; + +# pysnmp-pysmi = callPackage ./python-modules/pysnmp-pysmi { }; + +# pysnmplib = callPackage ./python-modules/pysnmplib { }; + +# pysnooper = callPackage ./python-modules/pysnooper { }; + +# pysnooz = callPackage ./python-modules/pysnooz { }; + +# pysnow = callPackage ./python-modules/pysnow { }; + + pysocks = callPackage ./python-modules/pysocks { }; + +# pysol-cards = callPackage ./python-modules/pysol-cards { }; + +# pysolr = callPackage ./python-modules/pysolr { }; + +# pysoma = callPackage ./python-modules/pysoma { }; + +# py-sonic = callPackage ./python-modules/py-sonic { }; + +# pysonos = callPackage ./python-modules/pysonos { }; + +# pysoundfile = self.soundfile; # Alias added 23-06-2019 + +# pyspark = callPackage ./python-modules/pyspark { }; + +# pyspcwebgw = callPackage ./python-modules/pyspcwebgw { }; + +# pyspellchecker = callPackage ./python-modules/pyspellchecker { }; + +# pyspf = callPackage ./python-modules/pyspf { }; + +# pyspice = callPackage ./python-modules/pyspice { }; + +# pyspiflash = callPackage ./python-modules/pyspiflash { }; + +# pyspinel = callPackage ./python-modules/pyspinel { }; + +# pyspnego = callPackage ./python-modules/pyspnego { }; + +# pysptk = callPackage ./python-modules/pysptk { }; + +# pyspx = callPackage ./python-modules/pyspx { }; + +# pysqlcipher3 = callPackage ./python-modules/pysqlcipher3 { +# inherit (pkgs) sqlcipher; +# }; + +# pysqueezebox = callPackage ./python-modules/pysqueezebox { }; + +# pysrim = callPackage ./python-modules/pysrim { }; + +# pysrt = callPackage ./python-modules/pysrt { }; + +# pyssim = callPackage ./python-modules/pyssim { }; + +# pystache = callPackage ./python-modules/pystache { }; + +# pystardict = callPackage ./python-modules/pystardict { }; + +# pystatgrab = callPackage ./python-modules/pystatgrab { }; + +# pystemd = callPackage ./python-modules/pystemd { +# inherit (pkgs) systemd; +# }; + + pystemmer = callPackage ./python-modules/pystemmer { }; + +# pystray = callPackage ./python-modules/pystray { }; + +# py-stringmatching = callPackage ./python-modules/py-stringmatching { }; + +# pysvg-py3 = callPackage ./python-modules/pysvg-py3 { }; + +# pysvn = callPackage ./python-modules/pysvn { +# inherit (pkgs) bash subversion apr aprutil expat neon openssl; +# }; + +# pyswitchbee = callPackage ./python-modules/pyswitchbee { }; + +# pyswitchbot = callPackage ./python-modules/pyswitchbot { }; + +# pysychonaut = callPackage ./python-modules/pysychonaut { }; + +# pysyncobj = callPackage ./python-modules/pysyncobj { }; + +# pytabix = callPackage ./python-modules/pytabix { }; + +# pytablewriter = callPackage ./python-modules/pytablewriter { }; + +# pytado = callPackage ./python-modules/pytado { }; + +# pytaglib = callPackage ./python-modules/pytaglib { }; + +# pytankerkoenig = callPackage ./python-modules/pytankerkoenig { }; + +# pytap2 = callPackage ./python-modules/pytap2 { }; + +# pytapo = callPackage ./python-modules/pytapo { }; + +# pytautulli = callPackage ./python-modules/pytautulli { }; + +# pyte = callPackage ./python-modules/pyte { }; + +# pytedee-async = callPackage ./python-modules/pytedee-async { }; + +# pytenable = callPackage ./python-modules/pytenable { }; + +# pytensor = callPackage ./python-modules/pytensor { }; + +# pytelegrambotapi = callPackage ./python-modules/pyTelegramBotAPI { }; + +# pytesseract = callPackage ./python-modules/pytesseract { }; + + pytest = callPackage ./python-modules/pytest { }; + +# pytest_7 = callPackage ./python-modules/pytest/7.nix { }; + +# pytest7CheckHook = pytestCheckHook.override { pytest = pytest_7; }; + +# pytest-aio = callPackage ./python-modules/pytest-aio { }; + +# pytest-aiohttp = callPackage ./python-modules/pytest-aiohttp { }; + +# pytest-annotate = callPackage ./python-modules/pytest-annotate { }; + +# pytest-ansible = callPackage ./python-modules/pytest-ansible { }; + +# pytest-arraydiff = callPackage ./python-modules/pytest-arraydiff { }; + +# pytest-astropy = callPackage ./python-modules/pytest-astropy { }; + +# pytest-astropy-header = callPackage ./python-modules/pytest-astropy-header { }; + + pytest-asyncio = callPackage ./python-modules/pytest-asyncio { }; + +# pytest-asyncio_0_21 = pytest-asyncio.overridePythonAttrs (old: rec { +# version = "0.21.1"; +# src = pkgs.fetchFromGitHub { +# owner = "pytest-dev"; +# repo = "pytest-asyncio"; +# rev = "refs/tags/v${version}"; +# hash = "sha256-Wpo8MpCPGiXrckT2x5/yBYtGlzso/L2urG7yGc7SPkA="; +# }; +# }); + +# pytest-bdd = callPackage ./python-modules/pytest-bdd { }; + +# pytest-benchmark = callPackage ./python-modules/pytest-benchmark { }; + +# pytest-black = callPackage ./python-modules/pytest-black { }; + +# pytest-cache = self.pytestcache; # added 2021-01-04 +# pytestcache = callPackage ./python-modules/pytestcache { }; + +# pytest-base-url = callPackage ./python-modules/pytest-base-url { }; + +# pytest-cases = callPackage ./python-modules/pytest-cases{ }; + +# pytest-catchlog = callPackage ./python-modules/pytest-catchlog { }; + +# pytest-celery = callPackage ./python-modules/pytest-celery { }; + +# pytest-check = callPackage ./python-modules/pytest-check { }; + +# pytest-cid = callPackage ./python-modules/pytest-cid { }; + +# pytest-click = callPackage ./python-modules/pytest-click { }; + +# pytest-console-scripts = callPackage ./python-modules/pytest-console-scripts { }; + +# pytest-cov = callPackage ./python-modules/pytest-cov { }; + +# pytest-cram = callPackage ./python-modules/pytest-cram { }; + +# pytest-datadir = callPackage ./python-modules/pytest-datadir { }; + +# pytest-datafiles = callPackage ./python-modules/pytest-datafiles { }; + +# pytest-dependency = callPackage ./python-modules/pytest-dependency { }; + +# pytest-describe = callPackage ./python-modules/pytest-describe { }; + +# pytest-django = callPackage ./python-modules/pytest-django { }; + +# pytest-doctestplus = callPackage ./python-modules/pytest-doctestplus { }; + +# pytest-dotenv = callPackage ./python-modules/pytest-dotenv { }; + +# pytest-emoji = callPackage ./python-modules/pytest-emoji { }; + +# pytest-env = callPackage ./python-modules/pytest-env { }; + +# pytest-error-for-skips = callPackage ./python-modules/pytest-error-for-skips { }; + +# pytest-examples = callPackage ./python-modules/pytest-examples { }; + + pytest-expect = callPackage ./python-modules/pytest-expect { }; + +# pytest-factoryboy = callPackage ./python-modules/pytest-factoryboy { }; + +# pytest-filter-subpackage = callPackage ./python-modules/pytest-filter-subpackage { }; + +# pytest-fixture-config = callPackage ./python-modules/pytest-fixture-config { }; + +# pytest-flake8 = callPackage ./python-modules/pytest-flake8 { }; + +# pytest-flakes = callPackage ./python-modules/pytest-flakes { }; + +# pytest-flask = callPackage ./python-modules/pytest-flask { }; + +# pytest-forked = callPackage ./python-modules/pytest-forked { }; + +# pytest-freezegun = callPackage ./python-modules/pytest-freezegun { }; + +# pytest-freezer = callPackage ./python-modules/pytest-freezer { }; + +# pytest-golden = callPackage ./python-modules/pytest-golden { }; + +# pytest-grpc = callPackage ./python-modules/pytest-grpc { }; + +# pytest-harvest = callPackage ./python-modules/pytest-harvest { }; + +# pytest-helpers-namespace = callPackage ./python-modules/pytest-helpers-namespace { }; + +# pytest-html = callPackage ./python-modules/pytest-html { }; + +# pytest-httpbin = callPackage ./python-modules/pytest-httpbin { }; + +# pytest-httpserver = callPackage ./python-modules/pytest-httpserver { }; + +# pytest-httpx = callPackage ./python-modules/pytest-httpx { }; + +# pytest-image-diff = callPackage ./python-modules/pytest-image-diff { }; + +# pytest-instafail = callPackage ./python-modules/pytest-instafail { }; + +# pytest-isort = callPackage ./python-modules/pytest-isort { }; + +# pytest-json-report = callPackage ./python-modules/pytest-json-report { }; + +# pytest-jupyter = callPackage ./python-modules/pytest-jupyter { }; + +# pytest-lazy-fixture = callPackage ./python-modules/pytest-lazy-fixture { }; + +# pytest-localserver = callPackage ./python-modules/pytest-localserver { }; + +# pytest-logdog = callPackage ./python-modules/pytest-logdog { }; + +# pytest-md-report = callPackage ./python-modules/pytest-md-report { }; + +# pytest-metadata = callPackage ./python-modules/pytest-metadata { }; + + pytest-mock = callPackage ./python-modules/pytest-mock { }; + +# pytest-mockservers = callPackage ./python-modules/pytest-mockservers { }; + +# pytest-mpl = callPackage ./python-modules/pytest-mpl { }; + +# pytest-mypy = callPackage ./python-modules/pytest-mypy { }; + +# pytest-mypy-plugins = callPackage ./python-modules/pytest-mypy-plugins { }; + +# pytest-notebook = callPackage ./python-modules/pytest-notebook { }; + +# pytest-openfiles = callPackage ./python-modules/pytest-openfiles { }; + +# pytest-order = callPackage ./python-modules/pytest-order { }; + +# pytest-param-files = callPackage ./python-modules/pytest-param-files { }; + +# pytest-parallel = callPackage ./python-modules/pytest-parallel { }; + +# pytest-playwright = callPackage ./python-modules/pytest-playwright {}; + +# pytest-plt = callPackage ./python-modules/pytest-plt { }; + +# pytest-postgresql = callPackage ./python-modules/pytest-postgresql { }; + +# pytest-pylint = callPackage ./python-modules/pytest-pylint { }; + +# pytest-pytestrail = callPackage ./python-modules/pytest-pytestrail { }; + +# pytest-qt = callPackage ./python-modules/pytest-qt { }; + +# pytest-quickcheck = callPackage ./python-modules/pytest-quickcheck { }; + +# pytest-raises = callPackage ./python-modules/pytest-raises { }; + +# pytest-raisesregexp = callPackage ./python-modules/pytest-raisesregexp { }; + +# pytest-raisin = callPackage ./python-modules/pytest-raisin { }; + +# pytest-randomly = callPackage ./python-modules/pytest-randomly { }; + +# pytest-reverse = callPackage ./python-modules/pytest-reverse { }; + +# pytest-random-order = callPackage ./python-modules/pytest-random-order { }; + +# pytest-recording = callPackage ./python-modules/pytest-recording { }; + +# pytest-regressions = callPackage ./python-modules/pytest-regressions { }; + +# pytest-relaxed = callPackage ./python-modules/pytest-relaxed { }; + +# pytest-remotedata = callPackage ./python-modules/pytest-remotedata { }; + +# pytest-repeat = callPackage ./python-modules/pytest-repeat { }; + + pytest-rerunfailures = callPackage ./python-modules/pytest-rerunfailures { }; + +# pytest-resource-path = callPackage ./python-modules/pytest-resource-path { }; + +# pytest-runner = callPackage ./python-modules/pytest-runner { }; + +# pytest-server-fixtures = callPackage ./python-modules/pytest-server-fixtures { }; + +# pytest-services = callPackage ./python-modules/pytest-services { }; + +# pytest-snapshot = callPackage ./python-modules/pytest-snapshot { }; + +# pytest-shutil = callPackage ./python-modules/pytest-shutil { }; + +# pytest-spec = callPackage ./python-modules/pytest-spec { }; + +# python-status = callPackage ./python-modules/python-status { }; + +# python-string-utils = callPackage ./python-modules/python-string-utils { }; + +# pytest-socket = callPackage ./python-modules/pytest-socket { }; + +# pytest-subprocess = callPackage ./python-modules/pytest-subprocess { }; + +# pytest-subtesthack = callPackage ./python-modules/pytest-subtesthack { }; + +# pytest-subtests = callPackage ./python-modules/pytest-subtests { }; + +# pytest-sugar = callPackage ./python-modules/pytest-sugar { }; + +# pytest-tap = callPackage ./python-modules/pytest-tap { }; + +# pytest-test-utils = callPackage ./python-modules/pytest-test-utils { }; + +# pytest-testinfra = callPackage ./python-modules/pytest-testinfra { }; + +# pytest-testmon = callPackage ./python-modules/pytest-testmon { }; + +# pytest-textual-snapshot = callPackage ./python-modules/pytest-textual-snapshot { }; + + pytest-timeout = callPackage ./python-modules/pytest-timeout { }; + +# pytest-tornado = callPackage ./python-modules/pytest-tornado { }; + +# pytest-tornasync = callPackage ./python-modules/pytest-tornasync { }; + +# pytest-trio = callPackage ./python-modules/pytest-trio { }; + +# pytest-twisted = callPackage ./python-modules/pytest-twisted { }; + +# pytest-unordered = callPackage ./python-modules/pytest-unordered { }; + +# pytest-vcr = callPackage ./python-modules/pytest-vcr { }; + +# pytest-virtualenv = callPackage ./python-modules/pytest-virtualenv { }; + +# pytest-voluptuous = callPackage ./python-modules/pytest-voluptuous { }; + +# pytest-warnings = callPackage ./python-modules/pytest-warnings { }; + +# pytest-watch = callPackage ./python-modules/pytest-watch { }; + + pytest-xdist = callPackage ./python-modules/pytest-xdist { }; + +# pytest-xprocess = callPackage ./python-modules/pytest-xprocess { }; + +# pytest-xvfb = callPackage ./python-modules/pytest-xvfb { }; + +# python3-application = callPackage ./python-modules/python3-application { }; + +# python3-eventlib = callPackage ./python-modules/python3-eventlib { }; + +# python3-gnutls = callPackage ./python-modules/python3-gnutls { }; + +# python3-openid = callPackage ./python-modules/python3-openid { }; + +# python-apt = callPackage ./python-modules/python-apt { }; + +# python-arango = callPackage ./python-modules/python-arango { }; + +# python-awair = callPackage ./python-modules/python-awair { }; + +# python3-saml = callPackage ./python-modules/python3-saml { }; + +# python-axolotl = callPackage ./python-modules/python-axolotl { }; + +# python-axolotl-curve25519 = callPackage ./python-modules/python-axolotl-curve25519 { }; + +# python-barcode = callPackage ./python-modules/python-barcode { }; + +# python-baseconv = callPackage ./python-modules/python-baseconv { }; + +# python-benedict = callPackage ./python-modules/python-benedict { }; + +# python-bidi = callPackage ./python-modules/python-bidi { }; + +# python-binance = callPackage ./python-modules/python-binance { }; + +# python-box = callPackage ./python-modules/python-box { }; + +# python-bring-api = callPackage ./python-modules/python-bring-api { }; + +# python-bsblan = callPackage ./python-modules/python-bsblan { }; + +# python-cinderclient = callPackage ./python-modules/python-cinderclient { }; + +# python-constraint = callPackage ./python-modules/python-constraint { }; + +# python-crontab = callPackage ./python-modules/python-crontab { }; + +# python-ctags3 = callPackage ./python-modules/python-ctags3 { }; + +# python-daemon = callPackage ./python-modules/python-daemon { }; + +# python-datemath = callPackage ./python-modules/python-datemath { }; + + python-dateutil = callPackage ./python-modules/python-dateutil { }; + +# python-dbusmock = callPackage ./python-modules/python-dbusmock { }; + +# python-decouple = callPackage ./python-modules/python-decouple { }; + +# pythondialog = callPackage ./python-modules/pythondialog { }; + +# python-didl-lite = callPackage ./python-modules/python-didl-lite { }; + +# python-digitalocean = callPackage ./python-modules/python-digitalocean { }; + +# python-docx = callPackage ./python-modules/python-docx { }; + +# python-doi = callPackage ./python-modules/python-doi { }; + +# python-dotenv = callPackage ./python-modules/python-dotenv { }; + +# python-editor = callPackage ./python-modules/python-editor { }; + +# python-family-hub-local = callPackage ./python-modules/python-family-hub-local { }; + +# python-fsutil = callPackage ./python-modules/python-fsutil { }; + +# pythonefl = callPackage ./python-modules/python-efl { }; + +# pythonegardia = callPackage ./python-modules/pythonegardia { }; + +# python-engineio = callPackage ./python-modules/python-engineio { }; + +# python-etcd = callPackage ./python-modules/python-etcd { }; + +# python-ethtool = callPackage ./python-modules/python-ethtool { }; + +# python-ev3dev2 = callPackage ./python-modules/python-ev3dev2 { }; + +# python-fedora = callPackage ./python-modules/python-fedora { }; + +# python-fontconfig = callPackage ./python-modules/python-fontconfig { }; + +# python-frontmatter = callPackage ./python-modules/python-frontmatter { }; + +# python-gammu = callPackage ./python-modules/python-gammu { }; + +# python-gitlab = callPackage ./python-modules/python-gitlab { }; + +# python-gnupg = callPackage ./python-modules/python-gnupg { }; + +# python-gvm = callPackage ./python-modules/python-gvm { }; + +# python-hglib = callPackage ./python-modules/python-hglib { }; + +# python-homeassistant-analytics = callPackage ./python-modules/python-homeassistant-analytics { }; + +# python-homewizard-energy = callPackage ./python-modules/python-homewizard-energy { }; + +# python-hosts = callPackage ./python-modules/python-hosts { }; + +# python-hpilo = callPackage ./python-modules/python-hpilo { }; + +# python-http-client = callPackage ./python-modules/python-http-client { }; + +# python-i18n = callPackage ./python-modules/python-i18n { }; + +# pythonix = callPackage ./python-modules/pythonix { +# nix = pkgs.nixVersions.nix_2_3; +# meson = pkgs.meson.override { python3 = self.python; }; +# }; + +# python-jenkins = callPackage ./python-modules/python-jenkins { }; + +# python-jose = callPackage ./python-modules/python-jose { }; + +# python-json-logger = callPackage ./python-modules/python-json-logger { }; + +# python-jsonrpc-server = callPackage ./python-modules/python-jsonrpc-server { }; + +# python-ldap = callPackage ./python-modules/python-ldap { +# inherit (pkgs) openldap cyrus_sasl; +# }; + +# python-ldap-test = callPackage ./python-modules/python-ldap-test { }; + +# python-libnmap = callPackage ./python-modules/python-libnmap { }; + +# python-linux-procfs = callPackage ./python-modules/python-linux-procfs { }; + +# python-logstash = callPackage ./python-modules/python-logstash { }; + +# python-louvain = callPackage ./python-modules/python-louvain { }; + +# python-lsp-jsonrpc = callPackage ./python-modules/python-lsp-jsonrpc { }; + +# python-lsp-ruff = callPackage ./python-modules/python-lsp-ruff { }; + +# python-lsp-server = callPackage ./python-modules/python-lsp-server { }; + +# python-ly = callPackage ./python-modules/python-ly { }; + +# python-lzf = callPackage ./python-modules/python-lzf { }; + +# python-lzo = callPackage ./python-modules/python-lzo { +# inherit (pkgs) lzo; +# }; + +# python-magic = callPackage ./python-modules/python-magic { }; + +# python-manilaclient = callPackage ./python-modules/python-manilaclient { }; + +# python-mapnik = callPackage ./python-modules/python-mapnik rec { +# inherit (pkgs) pkg-config cairo icu libjpeg libpng libtiff libwebp proj zlib; +# boost = pkgs.boost182.override { +# enablePython = true; +# inherit python; +# }; +# harfbuzz = pkgs.harfbuzz.override { +# withIcu = true; +# }; +# mapnik = pkgs.mapnik.override { +# inherit boost harfbuzz; +# }; +# }; + +# python-markdown-math = callPackage ./python-modules/python-markdown-math { }; + +# python-matter-server = callPackage ./python-modules/python-matter-server { }; + +# python-miio = callPackage ./python-modules/python-miio { }; + +# python-mimeparse = callPackage ./python-modules/python-mimeparse { }; + +# python-mnist = callPackage ./python-modules/python-mnist { }; + +# python-mpv-jsonipc = callPackage ./python-modules/python-mpv-jsonipc { }; + +# python-multipart = callPackage ./python-modules/python-multipart { }; + +# python-musicpd = callPackage ./python-modules/python-musicpd { }; + +# python-mystrom = callPackage ./python-modules/python-mystrom { }; + +# python-nest = callPackage ./python-modules/python-nest { }; + +# pythonnet = callPackage ./python-modules/pythonnet { }; + +# python-nmap = callPackage ./python-modules/python-nmap { }; + +# python-nomad = callPackage ./python-modules/python-nomad { }; + +# python-novaclient = callPackage ./python-modules/python-novaclient { }; + +# python-oauth2 = callPackage ./python-modules/python-oauth2 { }; + +# pythonocc-core = toPythonModule (callPackage ./python-modules/pythonocc-core { +# inherit (pkgs) fontconfig rapidjson; +# inherit (pkgs.xorg) libX11 libXi libXmu libXext; +# inherit (pkgs.darwin.apple_sdk.frameworks) Cocoa; +# }); + +# python-olm = callPackage ./python-modules/python-olm { }; + +# python-on-whales = callPackage ./python-modules/python-on-whales { }; + +# python-opendata-transport = callPackage ./python-modules/python-opendata-transport { }; + +# python-openstackclient = callPackage ./python-modules/python-openstackclient { }; + +# python-openzwave = callPackage ./python-modules/python-openzwave { }; + +# python-osc = callPackage ./python-modules/python-osc { }; + +# python-packer = callPackage ./python-modules/python-packer { }; + +# python-pae = callPackage ./python-modules/python-pae { }; + +# python-pam = callPackage ./python-modules/python-pam { +# inherit (pkgs) pam; +# }; + +# python-periphery = callPackage ./python-modules/python-periphery { }; + +# python-picnic-api = callPackage ./python-modules/python-picnic-api { }; + +# python-pidfile = callPackage ./python-modules/python-pidfile { }; + +# python-pipedrive = callPackage ./python-modules/python-pipedrive { }; + +# python-pkcs11 = callPackage ./python-modules/python-pkcs11 { }; + +# python-prctl = callPackage ./python-modules/python-prctl { }; + +# python-ptrace = callPackage ./python-modules/python-ptrace { }; + +# python-rapidjson = callPackage ./python-modules/python-rapidjson { }; + +# python-rabbitair = callPackage ./python-modules/python-rabbitair { }; + +# python-redis-lock = callPackage ./python-modules/python-redis-lock { }; + +# python-registry = callPackage ./python-modules/python-registry { }; + +# python-roborock = callPackage ./python-modules/python-roborock { }; + +# python-rtmidi = callPackage ./python-modules/python-rtmidi { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreAudio CoreMIDI CoreServices Foundation; +# }; + +# python-sat = callPackage ./python-modules/python-sat { }; + +# python-simple-hipchat = callPackage ./python-modules/python-simple-hipchat { }; + +# python-slugify = callPackage ./python-modules/python-slugify { }; + +# python-smarttub = callPackage ./python-modules/python-smarttub { }; + +# python-snap7 = callPackage ./python-modules/python-snap7 { +# inherit (pkgs) snap7; +# }; + +# python-snappy = callPackage ./python-modules/python-snappy { +# inherit (pkgs) snappy; +# }; + +# python-socketio = callPackage ./python-modules/python-socketio { }; + +# python-socks = callPackage ./python-modules/python-socks { }; + +# python-sql = callPackage ./python-modules/python-sql { }; + +# python-stdnum = callPackage ./python-modules/python-stdnum { }; + +# python-technove = callPackage ./python-modules/python-technove { }; + +# python-telegram = callPackage ./python-modules/python-telegram { }; + +# python-telegram-bot = callPackage ./python-modules/python-telegram-bot { }; + +# python-toolbox = callPackage ./python-modules/python-toolbox { }; + +# python-trovo = callPackage ./python-modules/python-trovo { }; + +# python-twitch-client = callPackage ./python-modules/python-twitch-client { }; + +# python-twitter = callPackage ./python-modules/python-twitter { }; + +# python-u2flib-host = callPackage ./python-modules/python-u2flib-host { }; + +# python-u2flib-server = callPackage ./python-modules/python-u2flib-server { }; + +# python-uinput = callPackage ./python-modules/python-uinput { }; + +# python-ulid = callPackage ./python-modules/python-ulid { }; + +# python-unshare = callPackage ./python-modules/python-unshare { }; + +# python-utils = callPackage ./python-modules/python-utils { }; + +# python-vagrant = callPackage ./python-modules/python-vagrant { }; + +# python-velbus = callPackage ./python-modules/python-velbus { }; + +# python-vipaccess = callPackage ./python-modules/python-vipaccess { }; + +# python-vlc = callPackage ./python-modules/python-vlc { }; + +# python-whois = callPackage ./python-modules/python-whois { }; + +# python-wifi = callPackage ./python-modules/python-wifi { }; + +# python-wink = callPackage ./python-modules/python-wink { }; + +# python-xmp-toolkit = callPackage ./python-modules/python-xmp-toolkit { }; + +# python-xz = callPackage ./python-modules/python-xz { }; + +# python-zbar = callPackage ./python-modules/python-zbar { }; + +# pythran = callPackage ./python-modules/pythran { +# inherit (pkgs.llvmPackages) openmp; +# }; + +# pyeapi = callPackage ./python-modules/pyeapi { }; + +# pyeverlights = callPackage ./python-modules/pyeverlights { }; + +# pyinfra = callPackage ./python-modules/pyinfra { }; + +# pytibber = callPackage ./python-modules/pytibber { }; + +# pytile = callPackage ./python-modules/pytile { }; + +# pytimeparse = callPackage ./python-modules/pytimeparse { }; + +# pytimeparse2 = callPackage ./python-modules/pytimeparse2 { }; + +# pytikz-allefeld = callPackage ./python-modules/pytikz-allefeld { }; + +# pytm = callPackage ./python-modules/pytm { }; + +# pytmx = callPackage ./python-modules/pytmx { }; + +# pytomlpp = callPackage ./python-modules/pytomlpp { }; + +# pytoolconfig = callPackage ./python-modules/pytoolconfig { }; + +# pytools = callPackage ./python-modules/pytools { }; + +# pytorch-lightning = callPackage ./python-modules/pytorch-lightning { }; + +# pytorch-metric-learning = callPackage ./python-modules/pytorch-metric-learning { }; + +# pytorch-msssim = callPackage ./python-modules/pytorch-msssim { }; + +# pytorch-pfn-extras = callPackage ./python-modules/pytorch-pfn-extras { }; + +# pytraccar = callPackage ./python-modules/pytraccar { }; + +# pytradfri = callPackage ./python-modules/pytradfri { }; + +# pytrafikverket = callPackage ./python-modules/pytrafikverket { }; + +# pytransportnsw = callPackage ./python-modules/pytransportnsw { }; + +# pytransportnswv2 = callPackage ./python-modules/pytransportnswv2 { }; + +# pytrends = callPackage ./python-modules/pytrends { }; + +# pytricia = callPackage ./python-modules/pytricia { }; + +# pytrydan = callPackage ./python-modules/pytrydan { }; + +# pyttsx3 = callPackage ./python-modules/pyttsx3 { }; + +# pytube = callPackage ./python-modules/pytube { }; + +# pytun = callPackage ./python-modules/pytun { }; + +# pyturbojpeg = callPackage ./python-modules/pyturbojpeg { }; + +# pytweening = callPackage ./python-modules/pytweening { }; + + pytz = callPackage ./python-modules/pytz { }; + +# pytz-deprecation-shim = callPackage ./python-modules/pytz-deprecation-shim { }; + +# pytzdata = callPackage ./python-modules/pytzdata { }; + +# pyu2f = callPackage ./python-modules/pyu2f { }; + +# pyudev = callPackage ./python-modules/pyudev { +# inherit (pkgs) udev; +# }; + +# pyunbound = toPythonModule (callPackage ../tools/networking/unbound/python.nix { }); + +# pyunifi = callPackage ./python-modules/pyunifi { }; + +# pyunifiprotect = callPackage ./python-modules/pyunifiprotect { }; + +# pyupdate = callPackage ./python-modules/pyupdate { }; + +# pyupgrade = callPackage ./python-modules/pyupgrade { }; + +# pyuptimerobot = callPackage ./python-modules/pyuptimerobot { }; + +# pyusb = callPackage ./python-modules/pyusb { +# inherit (pkgs) libusb1; +# }; + +# pyuseragents = callPackage ./python-modules/pyuseragents { }; + +# pyutilib = callPackage ./python-modules/pyutilib { }; + +# pyuv = callPackage ./python-modules/pyuv { }; + +# py-vapid = callPackage ./python-modules/py-vapid { }; + +# pyvcd = callPackage ./python-modules/pyvcd { }; + +# pyvera = callPackage ./python-modules/pyvera { }; + +# pyverilog = callPackage ./python-modules/pyverilog { }; + +# pyversasense = callPackage ./python-modules/pyversasense { }; + +# pyvesync = callPackage ./python-modules/pyvesync { }; + +# pyvex = callPackage ./python-modules/pyvex { }; + +# pyvicare = callPackage ./python-modules/pyvicare { }; + +# pyvirtualdisplay = callPackage ./python-modules/pyvirtualdisplay { }; + +# pyvis = callPackage ./python-modules/pyvis { }; + +# pyvisa = callPackage ./python-modules/pyvisa { }; + +# pyvisa-py = callPackage ./python-modules/pyvisa-py { }; + +# pyvisa-sim = callPackage ./python-modules/pyvisa-sim { }; + +# pyvista = callPackage ./python-modules/pyvista { }; + +# pyviz-comms = callPackage ./python-modules/pyviz-comms { }; + +# pyvizio = callPackage ./python-modules/pyvizio { }; + +# pyvips = callPackage ./python-modules/pyvips { +# inherit (pkgs) vips glib; +# }; + +# pyvlx = callPackage ./python-modules/pyvlx { }; + +# pyvmomi = callPackage ./python-modules/pyvmomi { }; + +# pyvo = callPackage ./python-modules/pyvo { }; + +# pyvolumio = callPackage ./python-modules/pyvolumio { }; + +# pyvoro = callPackage ./python-modules/pyvoro { }; + +# pywal = callPackage ./python-modules/pywal { }; + +# pywatchman = callPackage ./python-modules/pywatchman { }; + +# pywaterkotte = callPackage ./python-modules/pywaterkotte { }; + +# pywavefront = callPackage ./python-modules/pywavefront { }; + +# pywavelets = callPackage ./python-modules/pywavelets { }; + +# pywayland = callPackage ./python-modules/pywayland { }; + +# pywaze = callPackage ./python-modules/pywaze { }; + +# pywbem = callPackage ./python-modules/pywbem { +# inherit (pkgs) libxml2; +# }; + +# pyweatherflowrest = callPackage ./python-modules/pyweatherflowrest { }; + +# pyweatherflowudp = callPackage ./python-modules/pyweatherflowudp { }; + +# pywebpush = callPackage ./python-modules/pywebpush { }; + +# pywebview = callPackage ./python-modules/pywebview { }; + +# pywemo = callPackage ./python-modules/pywemo { }; + +# pywerview = callPackage ./python-modules/pywerview { }; + +# pywfa = callPackage ./python-modules/pywfa { }; + +# pywilight = callPackage ./python-modules/pywilight { }; + +# pywinrm = callPackage ./python-modules/pywinrm { }; + +# pywizlight = callPackage ./python-modules/pywizlight { }; + +# pywlroots = callPackage ./python-modules/pywlroots { +# wlroots = pkgs.wlroots_0_16; +# }; + +# pyws66i = callPackage ./python-modules/pyws66i { }; + +# pyxattr = callPackage ./python-modules/pyxattr { }; + +# pyxlsb = callPackage ./python-modules/pyxlsb { }; + +# pyworld = callPackage ./python-modules/pyworld { }; + +# pyx = callPackage ./python-modules/pyx { }; + +# pyxbe = callPackage ./python-modules/pyxbe { }; + +# pyxdg = callPackage ./python-modules/pyxdg { }; + +# pyxeoma = callPackage ./python-modules/pyxeoma { }; + +# pyxiaomigateway = callPackage ./python-modules/pyxiaomigateway { }; + +# pyxl3 = callPackage ./python-modules/pyxl3 { }; + +# pyxnat = callPackage ./python-modules/pyxnat { }; + +# pyyaml = callPackage ./python-modules/pyyaml { }; + +# pyyaml-env-tag = callPackage ./python-modules/pyyaml-env-tag { }; + +# pyyaml-include = callPackage ./python-modules/pyyaml-include { }; + +# pyyardian = callPackage ./python-modules/pyyardian { }; + +# pyzabbix = callPackage ./python-modules/pyzabbix { }; + +# pyzerproc = callPackage ./python-modules/pyzerproc { }; + +# pyzmq = callPackage ./python-modules/pyzmq { }; + +# pyzufall = callPackage ./python-modules/pyzufall { }; + +# qbittorrent-api = callPackage ./python-modules/qbittorrent-api { }; + +# qasync = callPackage ./python-modules/qasync { }; + +# qcelemental = callPackage ./python-modules/qcelemental { }; + +# qcengine = callPackage ./python-modules/qcengine { }; + +# qcodes = callPackage ./python-modules/qcodes { }; + +# qcodes-contrib-drivers = callPackage ./python-modules/qcodes-contrib-drivers { }; + +# qcs-api-client = callPackage ./python-modules/qcs-api-client { }; + +# qcs-sdk-python = callPackage ./python-modules/qcs-sdk-python { }; + +# qdarkstyle = callPackage ./python-modules/qdarkstyle { }; + +# qdldl = callPackage ./python-modules/qdldl { }; + +# qdrant-client = callPackage ./python-modules/qdrant-client { }; + +# qds-sdk = callPackage ./python-modules/qds-sdk { }; + +# qgrid = callPackage ./python-modules/qgrid { }; + +# qemu = callPackage ./python-modules/qemu { +# qemu = pkgs.qemu; +# }; + +# qiling = callPackage ./python-modules/qiling { }; + +# qimage2ndarray = callPackage ./python-modules/qimage2ndarray { }; + +# qingping-ble = callPackage ./python-modules/qingping-ble { }; + +# qiskit = callPackage ./python-modules/qiskit { }; + +# qiskit-aer = callPackage ./python-modules/qiskit-aer { }; + +# qiskit-finance = callPackage ./python-modules/qiskit-finance { }; + +# qiskit-ibmq-provider = callPackage ./python-modules/qiskit-ibmq-provider { }; + +# qiskit-ignis = callPackage ./python-modules/qiskit-ignis { }; + +# qiskit-machine-learning = callPackage ./python-modules/qiskit-machine-learning { }; + +# qiskit-nature = callPackage ./python-modules/qiskit-nature { }; + +# qiskit-optimization = callPackage ./python-modules/qiskit-optimization { }; + +# qiskit-terra = callPackage ./python-modules/qiskit-terra { }; + +# qnap-qsw = callPackage ./python-modules/qnap-qsw{ }; + +# qnapstats = callPackage ./python-modules/qnapstats { }; + +# qpageview = callPackage ./python-modules/qpageview { }; + +# qpsolvers = callPackage ./python-modules/qpsolvers { }; + +# qrcode = callPackage ./python-modules/qrcode { }; + +# qreactor = callPackage ./python-modules/qreactor { }; + +# qscintilla-qt5 = pkgs.libsForQt5.callPackage ./python-modules/qscintilla-qt5 { +# pythonPackages = self; +# }; + +# qscintilla = self.qscintilla-qt5; + +# qstylizer = callPackage ./python-modules/qstylizer { }; + +# qt-material = callPackage ./python-modules/qt-material { }; + +# qt5reactor = callPackage ./python-modules/qt5reactor { }; + +# qt6 = pkgs.qt6.override { +# python3 = self.python; +# }; + +# qtawesome = callPackage ./python-modules/qtawesome { }; + +# qtconsole = callPackage ./python-modules/qtconsole { }; + +# qtile = callPackage ./python-modules/qtile { +# wlroots = pkgs.wlroots_0_16; +# }; +# qtile-extras = callPackage ./python-modules/qtile-extras { }; + +# qtpy = callPackage ./python-modules/qtpy { }; + +# quadprog = callPackage ./python-modules/quadprog { }; + +# qualysclient = callPackage ./python-modules/qualysclient { }; + +# quamash = callPackage ./python-modules/quamash { }; + +# quandl = callPackage ./python-modules/quandl { }; + +# quantile-forest = callPackage ./python-modules/quantile-forest { }; + +# quantities = callPackage ./python-modules/quantities { }; + +# quantiphy = callPackage ./python-modules/quantiphy { }; + +# quantile-python = callPackage ./python-modules/quantile-python { }; + +# quantiphy-eval = callPackage ./python-modules/quantiphy-eval { }; + +# quantum-gateway = callPackage ./python-modules/quantum-gateway { }; + +# quantulum3 = callPackage ./python-modules/quantulum3 { }; + +# quart = callPackage ./python-modules/quart { }; + +# quart-cors = callPackage ./python-modules/quart-cors { }; + +# quaternion = callPackage ./python-modules/quaternion { }; + +# qudida = callPackage ./python-modules/qudida { }; + +# querystring-parser = callPackage ./python-modules/querystring-parser { }; + +# questionary = callPackage ./python-modules/questionary { }; + +# queuelib = callPackage ./python-modules/queuelib { }; + +# quil = callPackage ./python-modules/quil { }; + +# quixote = callPackage ./python-modules/quixote { }; + +# qutip = callPackage ./python-modules/qutip { }; + +# qmk-dotty-dict = callPackage ./python-modules/qmk-dotty-dict { }; + +# r2pipe = callPackage ./python-modules/r2pipe { }; + +# rachiopy = callPackage ./python-modules/rachiopy { }; + +# radicale-infcloud = callPackage ./python-modules/radicale-infcloud { +# radicale = pkgs.radicale.override { python3 = python; }; +# }; + +# radian = callPackage ./python-modules/radian { }; + +# radio-beam = callPackage ./python-modules/radio-beam { }; + +# radios = callPackage ./python-modules/radios { }; + +# radiotherm = callPackage ./python-modules/radiotherm { }; + +# radish-bdd = callPackage ./python-modules/radish-bdd { }; + +# radon = callPackage ./python-modules/radon { }; + +# railroad-diagrams = callPackage ./python-modules/railroad-diagrams { }; + +# rainbowstream = callPackage ./python-modules/rainbowstream { }; + +# raincloudy = callPackage ./python-modules/raincloudy { }; + +# ramlfications = callPackage ./python-modules/ramlfications { }; + +# random2 = callPackage ./python-modules/random2 { }; + +# randomfiletree = callPackage ./python-modules/randomfiletree { }; + +# range-typed-integers = callPackage ./python-modules/range-typed-integers { }; + +# rangehttpserver = callPackage ./python-modules/rangehttpserver { }; + +# rangeparser = callPackage ./python-modules/rangeparser { }; + +# rank-bm25 = callPackage ./python-modules/rank-bm25 { }; + +# rapidfuzz = callPackage ./python-modules/rapidfuzz { }; + +# rapidfuzz-capi = callPackage ./python-modules/rapidfuzz-capi { }; + +# rapidgzip = callPackage ./python-modules/rapidgzip { inherit (pkgs) nasm; }; + +# rapt-ble = callPackage ./python-modules/rapt-ble { }; + +# rarfile = callPackage ./python-modules/rarfile { +# inherit (pkgs) libarchive; +# }; + +# rasterio = callPackage ./python-modules/rasterio { }; + +# ratarmountcore = callPackage ./python-modules/ratarmountcore { inherit (pkgs) zstd; }; + +# ratarmount = callPackage ./python-modules/ratarmount { }; + +# ratelim = callPackage ./python-modules/ratelim { }; + +# ratelimit = callPackage ./python-modules/ratelimit { }; + +# rauth = callPackage ./python-modules/rauth { }; + +# raven = callPackage ./python-modules/raven { }; + +# rawkit = callPackage ./python-modules/rawkit { }; + +# ray = callPackage ./python-modules/ray { }; + +# razdel = callPackage ./python-modules/razdel { }; + +# rbtools = callPackage ./python-modules/rbtools { }; + +# rchitect = callPackage ./python-modules/rchitect { }; + +# rcssmin = callPackage ./python-modules/rcssmin { }; + +# rdflib = callPackage ./python-modules/rdflib { }; + +# rdkit = callPackage ./python-modules/rdkit { +# boost = pkgs.boost182.override { +# enablePython = true; +# inherit python; +# }; +# }; + +# re-assert = callPackage ./python-modules/re-assert { }; + +# readability-lxml = callPackage ./python-modules/readability-lxml { }; + +# readabilipy = callPackage ./python-modules/readabilipy { }; + +# readchar = callPackage ./python-modules/readchar { }; + +# readlike = callPackage ./python-modules/readlike { }; + +# readmdict = callPackage ./python-modules/readmdict { }; + +# readme = callPackage ./python-modules/readme { }; + +# readme-renderer = callPackage ./python-modules/readme-renderer { }; + +# readthedocs-sphinx-ext = callPackage ./python-modules/readthedocs-sphinx-ext { }; + +# reactivex = callPackage ./python-modules/reactivex { }; + +# rebulk = callPackage ./python-modules/rebulk { }; + +# recipe-scrapers = callPackage ./python-modules/recipe-scrapers { }; + +# recline = callPackage ./python-modules/recline { }; + +# recoll = toPythonModule (pkgs.recoll.override { +# python3Packages = self; +# }); + +# recommonmark = callPackage ./python-modules/recommonmark { }; + +# reconplogger = callPackage ./python-modules/reconplogger { }; + +# recordlinkage = callPackage ./python-modules/recordlinkage { }; + +# recurring-ical-events = callPackage ./python-modules/recurring-ical-events { }; + +# recursive-pth-loader = toPythonModule (callPackage ./python-modules/recursive-pth-loader { }); + +# red-black-tree-mod = callPackage ./python-modules/red-black-tree-mod { }; + +# redbaron = callPackage ./python-modules/redbaron { }; + +# redis = callPackage ./python-modules/redis { }; + +# redis-om = callPackage ./python-modules/redis-om { }; + +# redshift-connector = callPackage ./python-modules/redshift-connector { }; + +# reedsolo = callPackage ./python-modules/reedsolo { }; + +# referencing = callPackage ./python-modules/referencing { }; + +# refery = callPackage ./python-modules/refery { }; + +# reflink = callPackage ./python-modules/reflink { }; + +# regenmaschine = callPackage ./python-modules/regenmaschine { }; + +# regex = callPackage ./python-modules/regex { }; + +# regional = callPackage ./python-modules/regional { }; + +# reikna = callPackage ./python-modules/reikna { }; + +# related = callPackage ./python-modules/related { }; + +# relatorio = callPackage ./python-modules/relatorio { }; + +# releases = callPackage ./python-modules/releases { }; + +# remarshal = callPackage ./python-modules/remarshal { }; + +# remi = callPackage ./python-modules/remi { }; + +# remote-pdb = callPackage ./python-modules/remote-pdb { }; + +# remotezip = callPackage ./python-modules/remotezip { }; + +# renault-api = callPackage ./python-modules/renault-api { }; + +# rencode = callPackage ./python-modules/rencode { }; + +# renson-endura-delta = callPackage ./python-modules/renson-endura-delta { }; + +# reorder-python-imports = callPackage ./python-modules/reorder-python-imports { }; + +# reolink = callPackage ./python-modules/reolink { }; + +# reolink-aio = callPackage ./python-modules/reolink-aio { }; + +# reparser = callPackage ./python-modules/reparser { }; + +# repath = callPackage ./python-modules/repath { }; + +# repeated-test = callPackage ./python-modules/repeated-test { }; + +# repocheck = callPackage ./python-modules/repocheck { }; + +# reportengine = callPackage ./python-modules/reportengine { }; + +# reportlab = callPackage ./python-modules/reportlab { }; + +# repoze-lru = callPackage ./python-modules/repoze-lru { }; + +# repoze-sphinx-autointerface = callPackage ./python-modules/repoze-sphinx-autointerface { }; + +# repoze-who = callPackage ./python-modules/repoze-who { }; + +# reproject = callPackage ./python-modules/reproject { }; + +# reprshed = callPackage ./python-modules/reprshed { }; + +# reptor = callPackage ./python-modules/reptor { }; + +# reqif = callPackage ./python-modules/reqif { }; + +# requests-aws4auth = callPackage ./python-modules/requests-aws4auth { }; + +# requests-cache = callPackage ./python-modules/requests-cache { }; + +# requests-credssp = callPackage ./python-modules/requests-credssp { }; + +# requests-gssapi = callPackage ./python-modules/requests-gssapi { }; + +# requests-hawk = callPackage ./python-modules/requests-hawk { }; + + requests = callPackage ./python-modules/requests { }; + +# requests-download = callPackage ./python-modules/requests-download { }; + +# requestsexceptions = callPackage ./python-modules/requestsexceptions { }; + +# requests-file = callPackage ./python-modules/requests-file { }; + +# requests-futures = callPackage ./python-modules/requests-futures { }; + +# requests-http-signature = callPackage ./python-modules/requests-http-signature { }; + +# requests-kerberos = callPackage ./python-modules/requests-kerberos { }; + +# requests-mock = callPackage ./python-modules/requests-mock { }; + +# requests-ntlm = callPackage ./python-modules/requests-ntlm { }; + +# requests-oauthlib = callPackage ./python-modules/requests-oauthlib { }; + +# requests-pkcs12 = callPackage ./python-modules/requests-pkcs12 { }; + +# requests-ratelimiter = callPackage ./python-modules/requests-ratelimiter { }; + +# requests-toolbelt = callPackage ./python-modules/requests-toolbelt { }; + +# requests-unixsocket = callPackage ./python-modules/requests-unixsocket { }; + +# requests-wsgi-adapter = callPackage ./python-modules/requests-wsgi-adapter { }; + +# requirements-detector = callPackage ./python-modules/requirements-detector { }; + +# requirements-parser = callPackage ./python-modules/requirements-parser { }; + +# reretry = callPackage ./python-modules/reretry { }; + +# rerun-sdk = callPackage ./python-modules/rerun-sdk { }; + +# resampy = callPackage ./python-modules/resampy { }; + +# resend = callPackage ./python-modules/resend { }; + +# resize-right = callPackage ./python-modules/resize-right { }; + +# resolvelib = callPackage ./python-modules/resolvelib { }; + + responses = callPackage ./python-modules/responses { }; + +# respx = callPackage ./python-modules/respx { }; + +# restfly = callPackage ./python-modules/restfly { }; + +# restrictedpython = callPackage ./python-modules/restrictedpython { }; + +# restructuredtext-lint = callPackage ./python-modules/restructuredtext-lint { }; + +# restview = callPackage ./python-modules/restview { }; + +# result = callPackage ./python-modules/result { }; + +# rethinkdb = callPackage ./python-modules/rethinkdb { }; + +# retry = callPackage ./python-modules/retry { }; + +# retry-decorator = callPackage ./python-modules/retry-decorator { }; + +# retrying = callPackage ./python-modules/retrying { }; + +# returns = callPackage ./python-modules/returns { }; + +# reuse = callPackage ./python-modules/reuse { }; + +# rfc3339 = callPackage ./python-modules/rfc3339 { }; + +# rfc3339-validator = callPackage ./python-modules/rfc3339-validator { }; + +# rfc3986 = callPackage ./python-modules/rfc3986 { }; + +# rfc3986-validator = callPackage ./python-modules/rfc3986-validator { }; + +# rfc3987 = callPackage ./python-modules/rfc3987 { }; + +# rfc6555 = callPackage ./python-modules/rfc6555 { }; + +# rfc7464 = callPackage ./python-modules/rfc7464 { }; + +# rfcat = callPackage ./python-modules/rfcat { }; + +# rflink = callPackage ./python-modules/rflink { }; + +# rich = callPackage ./python-modules/rich { }; + +# rich-argparse = callPackage ./python-modules/rich-argparse { }; + +# rich-argparse-plus = callPackage ./python-modules/rich-argparse-plus { }; + +# rich-click = callPackage ./python-modules/rich-click { }; + +# rich-pixels = callPackage ./python-modules/rich-pixels { }; + +# rich-rst = callPackage ./python-modules/rich-rst { }; + +# ring-doorbell = callPackage ./python-modules/ring-doorbell { }; + +# ripe-atlas-cousteau = callPackage ./python-modules/ripe-atlas-cousteau { }; + +# ripe-atlas-sagan = callPackage ./python-modules/ripe-atlas-sagan { }; + +# riprova = callPackage ./python-modules/riprova { }; + +# ripser = callPackage ./python-modules/ripser { }; + +# riscof = callPackage ./python-modules/riscof { }; + +# riscv-config = callPackage ./python-modules/riscv-config { }; + +# riscv-isac = callPackage ./python-modules/riscv-isac { }; + +# rising = callPackage ./python-modules/rising { }; + +# ritassist = callPackage ./python-modules/ritassist { }; + +# rivet = toPythonModule (pkgs.rivet.override { +# python3 = python; +# }); + +# rjpl = callPackage ./python-modules/rjpl { }; + +# rjsmin = callPackage ./python-modules/rjsmin { }; + +# rki-covid-parser = callPackage ./python-modules/rki-covid-parser { }; + +# rkm-codes = callPackage ./python-modules/rkm-codes { }; + +# rlax = callPackage ./python-modules/rlax { }; + +# rlp = callPackage ./python-modules/rlp { }; + +# rmcl = callPackage ./python-modules/rmcl { }; + +# rmrl = callPackage ./python-modules/rmrl { }; + +# rmscene = callPackage ./python-modules/rmscene { }; + +# rmsd = callPackage ./python-modules/rmsd { }; + +# rnc2rng = callPackage ./python-modules/rnc2rng { }; + +# rnginline = callPackage ./python-modules/rnginline { }; + +# rns = callPackage ./python-modules/rns { }; + +# roadlib = callPackage ./python-modules/roadlib { }; + +# roadrecon = callPackage ./python-modules/roadrecon { }; + +# roadtools = callPackage ./python-modules/roadtools { }; + +# roadtx = callPackage ./python-modules/roadtx { }; + +# robomachine = callPackage ./python-modules/robomachine { }; + +# robot-detection = callPackage ./python-modules/robot-detection { }; + +# robotframework = callPackage ./python-modules/robotframework { }; + +# robotframework-databaselibrary = callPackage ./python-modules/robotframework-databaselibrary { }; + +# robotframework-excellib = callPackage ./python-modules/robotframework-excellib { }; + +# robotframework-pythonlibcore = callPackage ./python-modules/robotframework-pythonlibcore { }; + +# robotframework-requests = callPackage ./python-modules/robotframework-requests { }; + +# robotframework-selenium2library = callPackage ./python-modules/robotframework-selenium2library { }; + +# robotframework-seleniumlibrary = callPackage ./python-modules/robotframework-seleniumlibrary { }; + +# robotframework-sshlibrary = callPackage ./python-modules/robotframework-sshlibrary { }; + +# robotframework-tools = callPackage ./python-modules/robotframework-tools { }; + +# robotstatuschecker = callPackage ./python-modules/robotstatuschecker { }; + +# robotsuite = callPackage ./python-modules/robotsuite { }; + +# rocket-errbot = callPackage ./python-modules/rocket-errbot { }; + +# roku = callPackage ./python-modules/roku { }; + +# rokuecp = callPackage ./python-modules/rokuecp { }; + +# rollbar = callPackage ./python-modules/rollbar { }; + +# roman = callPackage ./python-modules/roman { }; + +# romy = callPackage ./python-modules/romy { }; + +# roombapy = callPackage ./python-modules/roombapy { }; + +# roonapi = callPackage ./python-modules/roonapi { }; + +# ronin = callPackage ./python-modules/ronin { }; + +# rope = callPackage ./python-modules/rope { }; + +# ropgadget = callPackage ./python-modules/ropgadget { }; + +# ropper = callPackage ./python-modules/ropper { }; + +# rotary-embedding-torch = callPackage ./python-modules/rotary-embedding-torch { }; + +# rouge-score = callPackage ./python-modules/rouge-score { }; + +# routeros-api = callPackage ./python-modules/routeros-api { }; + +# routes = callPackage ./python-modules/routes { }; + +# rova = callPackage ./python-modules/rova { }; + +# rpcq = callPackage ./python-modules/rpcq { }; + +# rpdb = callPackage ./python-modules/rpdb { }; + +# rpds-py = callPackage ./python-modules/rpds-py { }; + +# rpi-bad-power = callPackage ./python-modules/rpi-bad-power { }; + +# rpi-gpio = callPackage ./python-modules/rpi-gpio { }; + +# rpi-gpio2 = callPackage ./python-modules/rpi-gpio2 { }; + +# rplcd = callPackage ./python-modules/rplcd { }; + +# rply = callPackage ./python-modules/rply { }; + +# rpm = toPythonModule (pkgs.rpm.override { +# inherit python; +# }); + +# rpmfile = callPackage ./python-modules/rpmfile { }; + +# rpmfluff = callPackage ./python-modules/rpmfluff { }; + +# rpy2 = callPackage ./python-modules/rpy2 { }; + +# rpyc = callPackage ./python-modules/rpyc { }; + +# rpyc4 = callPackage ./python-modules/rpyc4 { }; + +# rq = callPackage ./python-modules/rq { +# redis-server = pkgs.redis; +# }; + +# rsa = callPackage ./python-modules/rsa { }; + +# rsskey = callPackage ./python-modules/rsskey { }; + +# rst2ansi = callPackage ./python-modules/rst2ansi { }; + +# rst2pdf = callPackage ./python-modules/rst2pdf { }; + +# rstcheck = callPackage ./python-modules/rstcheck { }; + +# rstcheck-core = callPackage ./python-modules/rstcheck-core { }; + +# rstr = callPackage ./python-modules/rstr { }; + +# rtmidi-python = callPackage ./python-modules/rtmidi-python { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreAudio CoreMIDI CoreServices; +# }; + +# rtoml = callPackage ./python-modules/rtoml { }; + +# rtp = callPackage ./python-modules/rtp { }; + +# rtree = callPackage ./python-modules/rtree { +# inherit (pkgs) libspatialindex; +# }; + +# rtslib = callPackage ./python-modules/rtslib { }; + +# rtsp-to-webrtc = callPackage ./python-modules/rtsp-to-webrtc { }; + +# ruamel-base = callPackage ./python-modules/ruamel-base { }; + +# ruamel-yaml = callPackage ./python-modules/ruamel-yaml { }; + +# ruamel-yaml-clib = callPackage ./python-modules/ruamel-yaml-clib { }; + +# rubicon-objc = callPackage ./python-modules/rubicon-objc { }; + +# rubymarshal = callPackage ./python-modules/rubymarshal { }; + +# ruffus = callPackage ./python-modules/ruffus { }; + +# rules = callPackage ./python-modules/rules { }; + +# runs = callPackage ./python-modules/runs { }; + +# ruuvitag-ble = callPackage ./python-modules/ruuvitag-ble { }; + +# ruyaml = callPackage ./python-modules/ruyaml { }; + +# rx = callPackage ./python-modules/rx { }; + +# rxv = callPackage ./python-modules/rxv { }; + +# rzpipe = callPackage ./python-modules/rzpipe { }; + +# s2clientprotocol = callPackage ./python-modules/s2clientprotocol { }; + +# s3fs = callPackage ./python-modules/s3fs { }; + +# s3transfer = callPackage ./python-modules/s3transfer { }; + +# s3-credentials = callPackage ./python-modules/s3-credentials { }; + +# sabctools = callPackage ./python-modules/sabctools { }; + +# sabyenc3 = callPackage ./python-modules/sabyenc3 { }; + +# sabyenc = callPackage ./python-modules/sabyenc { }; + +# sacn = callPackage ./python-modules/sacn { }; + +# sacrebleu = callPackage ./python-modules/sacrebleu { }; + +# sacremoses = callPackage ./python-modules/sacremoses { }; + +# safe = callPackage ./python-modules/safe { }; + +# safe-pysha3 = callPackage ./python-modules/safe-pysha3 { }; + +# safeio = callPackage ./python-modules/safeio { }; + +# safetensors = callPackage ./python-modules/safetensors { }; + +# safety = callPackage ./python-modules/safety { }; + +# safety-schemas = callPackage ./python-modules/safety-schemas { }; + +# sagemaker = callPackage ./python-modules/sagemaker { }; + +# salmon-mail = callPackage ./python-modules/salmon-mail { }; + +# sane = callPackage ./python-modules/sane { +# inherit (pkgs) sane-backends; +# }; + +# saneyaml = callPackage ./python-modules/saneyaml { }; + +# sampledata = callPackage ./python-modules/sampledata { }; + +# samplerate = callPackage ./python-modules/samplerate { +# inherit (pkgs) libsamplerate; +# }; + +# samsungctl = callPackage ./python-modules/samsungctl { }; + +# samsungtvws = callPackage ./python-modules/samsungtvws { }; + +# sanic = callPackage ./python-modules/sanic { +# # Don't pass any `sanic` to avoid dependency loops. `sanic-testing` +# # has special logic to disable tests when this is the case. +# sanic-testing = self.sanic-testing.override { sanic = null; }; +# }; + +# sanic-auth = callPackage ./python-modules/sanic-auth { }; + +# sanic-routing = callPackage ./python-modules/sanic-routing { }; + +# sanic-testing = callPackage ./python-modules/sanic-testing { }; + +# sanix = callPackage ./python-modules/sanix { }; + +# sansio-multipart = callPackage ./python-modules/sansio-multipart { }; + +# sarif-om = callPackage ./python-modules/sarif-om { }; + +# sarge = callPackage ./python-modules/sarge { }; + +# sasmodels = callPackage ./python-modules/sasmodels { }; + +# scalene = callPackage ./python-modules/scalene { }; + +# scales = callPackage ./python-modules/scales { }; + +# scancode-toolkit = callPackage ./python-modules/scancode-toolkit { }; + +# scapy = callPackage ./python-modules/scapy { +# inherit (pkgs) libpcap; # Avoid confusion with python package of the same name +# }; + +# schedule = callPackage ./python-modules/schedule { }; + +# schema = callPackage ./python-modules/schema { }; + +# schemainspect = callPackage ./python-modules/schemainspect { }; + +# schema-salad = callPackage ./python-modules/schema-salad { }; + +# schemdraw = callPackage ./python-modules/schemdraw { }; + +# schiene = callPackage ./python-modules/schiene { }; + +# schwifty = callPackage ./python-modules/schwifty { }; + +# scim2-filter-parser = callPackage ./python-modules/scim2-filter-parser { }; + +# scikit-bio = callPackage ./python-modules/scikit-bio { }; + +# scikit-build = callPackage ./python-modules/scikit-build { }; + +# scikit-build-core = callPackage ./python-modules/scikit-build-core { }; + +# scikit-fmm = callPackage ./python-modules/scikit-fmm { }; + +# scikit-fuzzy = callPackage ./python-modules/scikit-fuzzy { }; + +# scikit-hep-testdata = callPackage ./python-modules/scikit-hep-testdata { }; + +# scikit-image = callPackage ./python-modules/scikit-image { }; + +# scikit-learn = callPackage ./python-modules/scikit-learn { +# inherit (pkgs) gfortran glibcLocales; +# }; + +# scikit-learn-extra = callPackage ./python-modules/scikit-learn-extra { }; + +# scikit-misc = callPackage ./python-modules/scikit-misc { }; + +# scikit-optimize = callPackage ./python-modules/scikit-optimize { }; + +# scikit-posthocs = callPackage ./python-modules/scikit-posthocs { }; + +# scikit-rf = callPackage ./python-modules/scikit-rf { }; + +# scikits-odes = callPackage ./python-modules/scikits-odes { }; + +# scikits-samplerate = callPackage ./python-modules/scikits-samplerate { +# inherit (pkgs) libsamplerate; +# }; + +# scikit-tda = callPackage ./python-modules/scikit-tda { }; + +# scipy = callPackage ./python-modules/scipy { }; + +# scmrepo = callPackage ./python-modules/scmrepo { }; + +# scour = callPackage ./python-modules/scour { }; + +# scooby = callPackage ./python-modules/scooby { }; + +# scp = callPackage ./python-modules/scp { }; + +# scramp = callPackage ./python-modules/scramp { }; + +# scrap-engine = callPackage ./python-modules/scrap-engine { }; + +# scrapy = callPackage ./python-modules/scrapy { }; + +# scrapy-deltafetch = callPackage ./python-modules/scrapy-deltafetch { }; + +# scrapy-fake-useragent = callPackage ./python-modules/scrapy-fake-useragent { }; + +# scrapy-splash = callPackage ./python-modules/scrapy-splash { }; + +# screed = callPackage ./python-modules/screed { }; + +# screeninfo = callPackage ./python-modules/screeninfo { }; + +# screenlogicpy = callPackage ./python-modules/screenlogicpy { }; + +# scripttest = callPackage ./python-modules/scripttest { }; + +# scikit-survival = callPackage ./python-modules/scikit-survival { }; + +# scs = callPackage ./python-modules/scs { +# inherit (pkgs.darwin.apple_sdk.frameworks) Accelerate; +# }; + +# sdds = callPackage ./python-modules/sdds { }; + +# sdkmanager = callPackage ./python-modules/sdkmanager { }; + +# sdnotify = callPackage ./python-modules/sdnotify { }; + +# seaborn = callPackage ./python-modules/seaborn { }; + +# seabreeze = callPackage ./python-modules/seabreeze { }; + +# seaserv = toPythonModule (pkgs.seafile-server.override { +# python3 = self.python; +# }); + +# seasonal = callPackage ./python-modules/seasonal { }; + +# seatconnect = callPackage ./python-modules/seatconnect { }; + +# seccomp = callPackage ./python-modules/seccomp { }; + +# secp256k1 = callPackage ./python-modules/secp256k1 { +# inherit (pkgs) secp256k1; +# }; + +# secretstorage = callPackage ./python-modules/secretstorage { }; + +# secure = callPackage ./python-modules/secure { }; + +# securesystemslib = callPackage ./python-modules/securesystemslib { }; + +# securetar = callPackage ./python-modules/securetar { }; + +# securityreporter = callPackage ./python-modules/securityreporter { }; + +# sectools = callPackage ./python-modules/sectools { }; + +# seedir = callPackage ./python-modules/seedir { }; + +# seekpath = callPackage ./python-modules/seekpath { }; + +# segments = callPackage ./python-modules/segments { }; + +# segno = callPackage ./python-modules/segno { }; + +# segyio = toPythonModule (callPackage ./python-modules/segyio { +# inherit (pkgs) cmake ninja; +# }); + +# selectors2 = callPackage ./python-modules/selectors2 { }; + +# selenium = callPackage ./python-modules/selenium { }; + +# selenium-wire = callPackage ./python-modules/selenium-wire { }; + +# semantic-version = callPackage ./python-modules/semantic-version { }; + +# semaphore-bot = callPackage ./python-modules/semaphore-bot { }; + +# semver = callPackage ./python-modules/semver { }; + +# send2trash = callPackage ./python-modules/send2trash { }; + +# sendgrid = callPackage ./python-modules/sendgrid { }; + +# sense-energy = callPackage ./python-modules/sense-energy { }; + +# sensirion-ble = callPackage ./python-modules/sensirion-ble { }; + +# sensor-state-data = callPackage ./python-modules/sensor-state-data { }; + +# sensorpro-ble = callPackage ./python-modules/sensorpro-ble { }; + +# sensorpush-ble = callPackage ./python-modules/sensorpush-ble { }; + +# sentencepiece = callPackage ./python-modules/sentencepiece { +# inherit (pkgs) sentencepiece; +# }; + +# sentence-splitter = callPackage ./python-modules/sentence-splitter { }; + +# sentence-transformers = callPackage ./python-modules/sentence-transformers { }; + +# sentinel = callPackage ./python-modules/sentinel { }; + +# sentinels = callPackage ./python-modules/sentinels { }; + +# sentry-sdk = callPackage ./python-modules/sentry-sdk { }; + +# sepaxml = callPackage ./python-modules/sepaxml { }; + +# seqdiag = callPackage ./python-modules/seqdiag { }; + +# seqeval = callPackage ./python-modules/seqeval { }; + +# serialio = callPackage ./python-modules/serialio { }; + +# serializable = callPackage ./python-modules/serializable { }; + +# serpent = callPackage ./python-modules/serpent { }; + +# serpy = callPackage ./python-modules/serpy { }; + +# servefile = callPackage ./python-modules/servefile { }; + +# serverfiles = callPackage ./python-modules/serverfiles { }; + +# serverlessrepo = callPackage ./python-modules/serverlessrepo { }; + +# service-identity = callPackage ./python-modules/service-identity { }; + + setproctitle = callPackage ./python-modules/setproctitle { }; + +# setupmeta = callPackage ./python-modules/setupmeta { }; + +# setuptools-changelog-shortener = callPackage ./python-modules/setuptools-changelog-shortener { }; + +# setuptools-declarative-requirements = callPackage ./python-modules/setuptools-declarative-requirements { }; + +# setuptools-dso = callPackage ./python-modules/setuptools-dso { }; + +# setuptools-generate = callPackage ./python-modules/setuptools-generate { }; + +# setuptools-gettext = callPackage ./python-modules/setuptools-gettext { }; + +# setuptools-git = callPackage ./python-modules/setuptools-git { }; + +# setuptools-git-versioning = callPackage ./python-modules/setuptools-git-versioning { }; + +# setuptools-lint = callPackage ./python-modules/setuptools-lint { }; + +# setuptools-odoo = callPackage ./python-modules/setuptools-odoo { }; + +# setuptools-rust = callPackage ./python-modules/setuptools-rust { }; + + setuptools-scm = callPackage ./python-modules/setuptools-scm { }; + +# setuptools-scm-git-archive = callPackage ./python-modules/setuptools-scm-git-archive { }; + +# setuptools-trial = callPackage ./python-modules/setuptools-trial { }; + +# seventeentrack = callPackage ./python-modules/seventeentrack { }; + +# sev-snp-measure = callPackage ./python-modules/sev-snp-measure { }; + +# sexpdata = callPackage ./python-modules/sexpdata { }; + +# sfepy = callPackage ./python-modules/sfepy { }; + +# sfrbox-api = callPackage ./python-modules/sfrbox-api { }; + +# sgmllib3k = callPackage ./python-modules/sgmllib3k { }; + +# sgp4 = callPackage ./python-modules/sgp4 { }; + +# shamir-mnemonic = callPackage ./python-modules/shamir-mnemonic { }; + +# shap = callPackage ./python-modules/shap { }; + +# shapely = callPackage ./python-modules/shapely { }; + +# shapely_1_8 = callPackage ./python-modules/shapely/1.8.nix { }; + +# shaperglot = callPackage ./python-modules/shaperglot { }; + +# sharedmem = callPackage ./python-modules/sharedmem { }; + +# sharkiq = callPackage ./python-modules/sharkiq { }; + +# sharp-aquos-rc = callPackage ./python-modules/sharp-aquos-rc { }; + +# shazamio = callPackage ./python-modules/shazamio { }; + +# sh = callPackage ./python-modules/sh { }; + +# shlib = callPackage ./python-modules/shlib { }; + +# shellescape = callPackage ./python-modules/shellescape { }; + +# shellingham = callPackage ./python-modules/shellingham { }; + +# shiboken2 = toPythonModule (callPackage ./python-modules/shiboken2 { +# inherit (pkgs) cmake llvmPackages_15 qt5; +# }); + +# shiboken6 = toPythonModule (callPackage ./python-modules/shiboken6 { +# inherit (pkgs) cmake llvmPackages; +# }); + +# shippai = callPackage ./python-modules/shippai { }; + +# shiv = callPackage ./python-modules/shiv { }; + +# shodan = callPackage ./python-modules/shodan { }; + +# shortuuid = callPackage ./python-modules/shortuuid { }; + +# shouldbe = callPackage ./python-modules/shouldbe { }; + +# should-dsl = callPackage ./python-modules/should-dsl { }; + +# show-in-file-manager = callPackage ./python-modules/show-in-file-manager { }; + +# showit = callPackage ./python-modules/showit { }; + +# shtab = callPackage ./python-modules/shtab { }; + +# shutilwhich = callPackage ./python-modules/shutilwhich { }; + +# sievelib = callPackage ./python-modules/sievelib { }; + +# signalslot = callPackage ./python-modules/signalslot { }; + +# signedjson = callPackage ./python-modules/signedjson { }; + +# signxml = callPackage ./python-modules/signxml { }; + +# sigrok = callPackage ./python-modules/sigrok { }; + +# sigstore = callPackage ./python-modules/sigstore { }; + +# sigstore-protobuf-specs = callPackage ./python-modules/sigstore-protobuf-specs { }; + +# sigstore-rekor-types = callPackage ./python-modules/sigstore-rekor-types { }; + +# sigtools = callPackage ./python-modules/sigtools { }; + +# simanneal = callPackage ./python-modules/simanneal { }; + +# simber = callPackage ./python-modules/simber { }; + +# simple-term-menu = callPackage ./python-modules/simple-term-menu { }; + +# simpleaudio = callPackage ./python-modules/simpleaudio { }; + +# simplebayes = callPackage ./python-modules/simplebayes { }; + +# simpleeval = callPackage ./python-modules/simpleeval { }; + +# simplefix = callPackage ./python-modules/simplefix { }; + +# simplegeneric = callPackage ./python-modules/simplegeneric { }; + +# simplehound = callPackage ./python-modules/simplehound { }; + +# simpleitk = callPackage ./python-modules/simpleitk { +# inherit (pkgs) simpleitk; +# }; + +# simplejson = callPackage ./python-modules/simplejson { }; + +# simplekml = callPackage ./python-modules/simplekml { }; + +# simplekv = callPackage ./python-modules/simplekv { }; + +# simplemma = callPackage ./python-modules/simplemma { }; + +# simplenote = callPackage ./python-modules/simplenote { }; + +# simplepush = callPackage ./python-modules/simplepush { }; + +# simplesat = callPackage ./python-modules/simplesat { }; + +# simplesqlite = callPackage ./python-modules/simplesqlite { }; + +# simple-dftd3 = callPackage ../development/libraries/science/chemistry/simple-dftd3/python.nix { +# inherit (pkgs) simple-dftd3; +# }; + +# simple-di = callPackage ./python-modules/simple-di { }; + +# simple-rest-client = callPackage ./python-modules/simple-rest-client { }; + +# simple-rlp = callPackage ./python-modules/simple-rlp { }; + +# simple-salesforce = callPackage ./python-modules/simple-salesforce { }; + +# simple-websocket = callPackage ./python-modules/simple-websocket { }; + +# simple-websocket-server = callPackage ./python-modules/simple-websocket-server { }; + +# simplisafe-python = callPackage ./python-modules/simplisafe-python { }; + +# simpful = callPackage ./python-modules/simpful { }; + +# simpy = callPackage ./python-modules/simpy { }; + +# single-source = callPackage ./python-modules/single-source { }; + +# single-version = callPackage ./python-modules/single-version { }; + +# signify = callPackage ./python-modules/signify { }; + +# siobrultech-protocols = callPackage ./python-modules/siobrultech-protocols { }; + +# siosocks = callPackage ./python-modules/siosocks { }; + +# sip = callPackage ./python-modules/sip { }; + +# sip4 = callPackage ./python-modules/sip/4.x.nix { }; + +# sipyco = callPackage ./python-modules/sipyco { }; + +# sisyphus-control = callPackage ./python-modules/sisyphus-control { }; + +# siuba = callPackage ./python-modules/siuba { }; + + six = callPackage ./python-modules/six { }; + +# sjcl = callPackage ./python-modules/sjcl { }; + +# skein = callPackage ./python-modules/skein { }; + +# skidl = callPackage ./python-modules/skidl { }; + +# skl2onnx = callPackage ./python-modules/skl2onnx { }; + +# sklearn-deap = callPackage ./python-modules/sklearn-deap { }; + +# skodaconnect = callPackage ./python-modules/skodaconnect { }; + +# skorch = callPackage ./python-modules/skorch { }; + +# skrl = callPackage ./python-modules/skrl { }; + +# skybellpy = callPackage ./python-modules/skybellpy { }; + +# skyfield = callPackage ./python-modules/skyfield { }; + +# skytemple-dtef = callPackage ./python-modules/skytemple-dtef { }; + +# skytemple-eventserver = callPackage ./python-modules/skytemple-eventserver { }; + +# skytemple-files = callPackage ./python-modules/skytemple-files { }; + +# skytemple-icons = callPackage ./python-modules/skytemple-icons { }; + +# skytemple-rust = callPackage ./python-modules/skytemple-rust { +# inherit (pkgs.darwin.apple_sdk.frameworks) Foundation; +# }; + +# skytemple-ssb-debugger = callPackage ./python-modules/skytemple-ssb-debugger { }; + +# skytemple-ssb-emulator = callPackage ./python-modules/skytemple-ssb-emulator { }; + +# slack-bolt = callPackage ./python-modules/slack-bolt { }; + +# slack-sdk = callPackage ./python-modules/slack-sdk { }; + +# slackclient = callPackage ./python-modules/slackclient { }; + +# sleekxmpp = callPackage ./python-modules/sleekxmpp { }; + +# sleepyq = callPackage ./python-modules/sleepyq { }; + +# slicedimage = callPackage ./python-modules/slicedimage { }; + +# slicer = callPackage ./python-modules/slicer { }; + +# slicerator = callPackage ./python-modules/slicerator { }; + +# slither-analyzer = callPackage ./python-modules/slither-analyzer { }; + +# slimit = callPackage ./python-modules/slimit { }; + +# slixmpp = callPackage ./python-modules/slixmpp { +# inherit (pkgs) gnupg; +# }; + +# slob = callPackage ./python-modules/slob { }; + +# slovnet = callPackage ./python-modules/slovnet { }; + +# slowapi = callPackage ./python-modules/slowapi { }; + +# slpp = callPackage ./python-modules/slpp { }; + +# slugid = callPackage ./python-modules/slugid { }; + +# sly = callPackage ./python-modules/sly { }; + +# smart-meter-texas = callPackage ./python-modules/smart-meter-texas { }; + +# smart-open = callPackage ./python-modules/smart-open { }; + +# smarthab = callPackage ./python-modules/smarthab { }; + +# smartypants = callPackage ./python-modules/smartypants { }; + +# smbprotocol = callPackage ./python-modules/smbprotocol { }; + +# smbus-cffi = callPackage ./python-modules/smbus-cffi { }; + +# smbus2 = callPackage ./python-modules/smbus2 { }; + +# smdebug-rulesconfig = callPackage ./python-modules/smdebug-rulesconfig { }; + +# smhi-pkg = callPackage ./python-modules/smhi-pkg { }; + +# smmap = callPackage ./python-modules/smmap { }; + +# smpplib = callPackage ./python-modules/smpplib { }; + +# smpp-pdu = callPackage ./python-modules/smpp-pdu { }; + +# smtpdfix = callPackage ./python-modules/smtpdfix { }; + +# snack = toPythonModule (pkgs.newt.override { +# inherit (self) python; +# }); + +# snakemake = toPythonModule (pkgs.snakemake.override { +# python3 = python; +# }); + +# snakemake-executor-plugin-cluster-generic = callPackage ./python-modules/snakemake-executor-plugin-cluster-generic { }; + +# snakemake-interface-common = callPackage ./python-modules/snakemake-interface-common { }; + +# snakemake-interface-executor-plugins = callPackage ./python-modules/snakemake-interface-executor-plugins { }; + +# snakemake-interface-report-plugins = callPackage ./python-modules/snakemake-interface-report-plugins { }; + +# snakemake-interface-storage-plugins = callPackage ./python-modules/snakemake-interface-storage-plugins { }; + +# snakemake-storage-plugin-s3 = callPackage ./python-modules/snakemake-storage-plugin-s3 { }; + +# snakemake-storage-plugin-xrootd = callPackage ./python-modules/snakemake-storage-plugin-xrootd { }; + +# snakebite = callPackage ./python-modules/snakebite { }; + +# snakeviz = callPackage ./python-modules/snakeviz { }; + +# snap-helpers = callPackage ./python-modules/snap-helpers { }; + +# snapcast = callPackage ./python-modules/snapcast { }; + +# snapshottest = callPackage ./python-modules/snapshottest { }; + +# snaptime = callPackage ./python-modules/snaptime { }; + +# sniffio = callPackage ./python-modules/sniffio { }; + +# snitun = callPackage ./python-modules/snitun { }; + +# snorkel = callPackage ./python-modules/snorkel { }; + + snowballstemmer = callPackage ./python-modules/snowballstemmer { }; + +# snowflake-connector-python = callPackage ./python-modules/snowflake-connector-python { }; + +# snowflake-sqlalchemy = callPackage ./python-modules/snowflake-sqlalchemy { }; + +# snscrape = callPackage ./python-modules/snscrape { }; + +# snuggs = callPackage ./python-modules/snuggs { }; + +# soapysdr = toPythonModule (pkgs.soapysdr.override { +# inherit (self) python; +# usePython = true; +# }); + +# soapysdr-with-plugins = toPythonModule (pkgs.soapysdr-with-plugins.override { +# inherit (self) python; +# usePython = true; +# }); + +# socketio-client = callPackage ./python-modules/socketio-client { }; + +# social-auth-app-django = callPackage ./python-modules/social-auth-app-django { }; + +# social-auth-core = callPackage ./python-modules/social-auth-core { }; + +# socialscan = callPackage ./python-modules/socialscan { }; + +# socid-extractor = callPackage ./python-modules/socid-extractor { }; + +# sockio = callPackage ./python-modules/sockio { }; + +# sockjs = callPackage ./python-modules/sockjs { }; + +# sockjs-tornado = callPackage ./python-modules/sockjs-tornado { }; + +# socksio = callPackage ./python-modules/socksio { }; + +# socksipy-branch = callPackage ./python-modules/socksipy-branch { }; + +# soco = callPackage ./python-modules/soco { }; + +# softlayer = callPackage ./python-modules/softlayer { }; + +# solaredge = callPackage ./python-modules/solaredge { }; + +# solax = callPackage ./python-modules/solax { }; + +# solc-select = callPackage ./python-modules/solc-select { }; + +# solo-python = disabledIf (!pythonAtLeast "3.6") (callPackage ./python-modules/solo-python { }); + +# somajo = callPackage ./python-modules/somajo { }; + +# somfy-mylink-synergy = callPackage ./python-modules/somfy-mylink-synergy { }; + +# sonarr = callPackage ./python-modules/sonarr { }; + +# sonos-websocket = callPackage ./python-modules/sonos-websocket { }; + +# sopel = callPackage ./python-modules/sopel { }; + +# sorl-thumbnail = callPackage ./python-modules/sorl-thumbnail { }; + +# sortedcollections = callPackage ./python-modules/sortedcollections { }; + +# sortedcontainers = callPackage ./python-modules/sortedcontainers { }; + +# soundcloud-v2 = callPackage ./python-modules/soundcloud-v2 { }; + +# sounddevice = callPackage ./python-modules/sounddevice { }; + +# soundfile = callPackage ./python-modules/soundfile { }; + +# soupsieve = callPackage ./python-modules/soupsieve { }; + +# sourmash = callPackage ./python-modules/sourmash { }; + +# soxr = callPackage ./python-modules/soxr { +# libsoxr = pkgs.soxr; +# }; + +# spacy = callPackage ./python-modules/spacy { }; + +# spacy-alignments = callPackage ./python-modules/spacy-alignments { }; + +# spacy-legacy = callPackage ./python-modules/spacy/legacy.nix { }; + +# spacy-loggers = callPackage ./python-modules/spacy-loggers { }; + +# spacy-lookups-data = callPackage ./python-modules/spacy/lookups-data.nix { }; + +# spacy-models = callPackage ./python-modules/spacy/models.nix { +# inherit (pkgs) jq; +# }; + +# spacy-pkuseg = callPackage ./python-modules/spacy-pkuseg { }; + +# spacy-transformers = callPackage ./python-modules/spacy-transformers { }; + +# spake2 = callPackage ./python-modules/spake2 { }; + +# spark-parser = callPackage ./python-modules/spark-parser { }; + +# sparklines = callPackage ./python-modules/sparklines { }; + +# sparqlwrapper = callPackage ./python-modules/sparqlwrapper { }; + +# sparse = callPackage ./python-modules/sparse { }; + +# spatial-image = callPackage ./python-modules/spatial-image { }; + +# spdx = callPackage ./python-modules/spdx { }; + +# spdx-lookup = callPackage ./python-modules/spdx-lookup { }; + +# spdx-tools = callPackage ./python-modules/spdx-tools { }; + +# speaklater = callPackage ./python-modules/speaklater { }; + +# speaklater3 = callPackage ./python-modules/speaklater3 { }; + +# spectral-cube = callPackage ./python-modules/spectral-cube { }; + +# speechbrain = callPackage ./python-modules/speechbrain { }; + +# speechrecognition = callPackage ./python-modules/speechrecognition { }; + +# speedtest-cli = callPackage ./python-modules/speedtest-cli { }; + +# speg = callPackage ./python-modules/speg { }; + +# spglib = callPackage ./python-modules/spglib { }; + +# sphfile = callPackage ./python-modules/sphfile { }; + +# spiderpy = callPackage ./python-modules/spiderpy { }; + +# spinners = callPackage ./python-modules/spinners { }; + +# sphinx-automodapi = callPackage ./python-modules/sphinx-automodapi { +# graphviz = pkgs.graphviz; +# }; + +# sphinx-better-theme = callPackage ./python-modules/sphinx-better-theme { }; + +# sphinx-book-theme = callPackage ./python-modules/sphinx-book-theme { }; + +# sphinx-codeautolink = callPackage ./python-modules/sphinx-codeautolink { }; + +# sphinx-comments = callPackage ./python-modules/sphinx-comments { }; + +# sphinx-design = callPackage ./python-modules/sphinx-design { }; + +# sphinx-external-toc = callPackage ./python-modules/sphinx-external-toc { }; + +# sphinx-fortran = callPackage ./python-modules/sphinx-fortran { }; + +# sphinx-hoverxref = callPackage ./python-modules/sphinx-hoverxref { }; + +# sphinx-intl = callPackage ./python-modules/sphinx-intl { }; + +# sphinx-jupyterbook-latex = callPackage ./python-modules/sphinx-jupyterbook-latex { }; + +# sphinx-multitoc-numbering = callPackage ./python-modules/sphinx-multitoc-numbering { }; + +# sphinx-notfound-page = callPackage ./python-modules/sphinx-notfound-page { }; + +# sphinx-pytest = callPackage ./python-modules/sphinx-pytest { }; + +# sphinx-prompt = callPackage ./python-modules/sphinx-prompt { }; + +# sphinx-sitemap = callPackage ./python-modules/sphinx-sitemap { }; + +# sphinx-thebe = callPackage ./python-modules/sphinx-thebe { }; + +# sphinx-tabs = callPackage ./python-modules/sphinx-tabs { }; + +# sphinx-togglebutton = callPackage ./python-modules/sphinx-togglebutton { }; + +# sphinxcontrib-actdiag = callPackage ./python-modules/sphinxcontrib-actdiag { }; + +# sphinxcontrib-apidoc = callPackage ./python-modules/sphinxcontrib-apidoc { }; + + sphinxcontrib-applehelp = callPackage ./python-modules/sphinxcontrib-applehelp { }; + +# sphinxcontrib-asyncio = callPackage ./python-modules/sphinxcontrib-asyncio { }; + +# sphinx-autoapi = callPackage ./python-modules/sphinx-autoapi { }; + +# sphinxcontrib-bayesnet = callPackage ./python-modules/sphinxcontrib-bayesnet { }; + +# sphinxcontrib-bibtex = callPackage ./python-modules/sphinxcontrib-bibtex { }; + +# sphinxcontrib-blockdiag = callPackage ./python-modules/sphinxcontrib-blockdiag { }; + +# sphinxcontrib-confluencebuilder = callPackage ./python-modules/sphinxcontrib-confluencebuilder { }; + + sphinxcontrib-devhelp = callPackage ./python-modules/sphinxcontrib-devhelp { }; + +# sphinxcontrib-excel-table = callPackage ./python-modules/sphinxcontrib-excel-table { }; + +# sphinxcontrib-fulltoc = callPackage ./python-modules/sphinxcontrib-fulltoc { }; + + sphinxcontrib-htmlhelp = callPackage ./python-modules/sphinxcontrib-htmlhelp { }; + +# sphinxcontrib-httpdomain = callPackage ./python-modules/sphinxcontrib-httpdomain { }; + +# sphinxcontrib-jquery = callPackage ./python-modules/sphinxcontrib-jquery { }; + + sphinxcontrib-jsmath = callPackage ./python-modules/sphinxcontrib-jsmath { }; + +# sphinxcontrib-katex = callPackage ./python-modules/sphinxcontrib-katex { }; + +# sphinxcontrib-mscgen = callPackage ./python-modules/sphinxcontrib-mscgen { +# inherit (pkgs) mscgen; +# }; + + sphinxcontrib-log-cabinet = callPackage ./python-modules/sphinxcontrib-log-cabinet { }; + +# sphinxcontrib-nwdiag = callPackage ./python-modules/sphinxcontrib-nwdiag { }; + +# sphinxcontrib-newsfeed = callPackage ./python-modules/sphinxcontrib-newsfeed { }; + +# sphinxcontrib-openapi = callPackage ./python-modules/sphinxcontrib-openapi { }; + +# sphinxcontrib-plantuml = callPackage ./python-modules/sphinxcontrib-plantuml { +# inherit (pkgs) plantuml; +# }; + +# sphinxcontrib-programoutput = callPackage ./python-modules/sphinxcontrib-programoutput { }; + + sphinxcontrib-qthelp = callPackage ./python-modules/sphinxcontrib-qthelp { }; + + sphinxcontrib-serializinghtml = callPackage ./python-modules/sphinxcontrib-serializinghtml { }; + +# sphinxcontrib-seqdiag = callPackage ./python-modules/sphinxcontrib-seqdiag { }; + +# sphinxcontrib-spelling = callPackage ./python-modules/sphinxcontrib-spelling { }; + +# sphinxcontrib-tikz = callPackage ./python-modules/sphinxcontrib-tikz { }; + +# sphinxcontrib-wavedrom = callPackage ./python-modules/sphinxcontrib-wavedrom { }; + + sphinxcontrib-websupport = callPackage ./python-modules/sphinxcontrib-websupport { }; + +# sphinxcontrib-youtube = callPackage ./python-modules/sphinxcontrib-youtube { }; + + sphinx = callPackage ./python-modules/sphinx { }; + +# sphinx-argparse = callPackage ./python-modules/sphinx-argparse { }; + +# sphinx-autobuild = callPackage ./python-modules/sphinx-autobuild { }; + +# sphinx-autodoc-typehints = callPackage ./python-modules/sphinx-autodoc-typehints { }; + +# sphinx-basic-ng = callPackage ./python-modules/sphinx-basic-ng { }; + +# sphinx-copybutton = callPackage ./python-modules/sphinx-copybutton { }; + +# sphinxemoji = callPackage ./python-modules/sphinxemoji { }; + +# sphinx-inline-tabs = callPackage ./python-modules/sphinx-inline-tabs { }; + + sphinx-issues = callPackage ./python-modules/sphinx-issues { }; + +# sphinx-jinja = callPackage ./python-modules/sphinx-jinja { }; + +# sphinx-markdown-parser = callPackage ./python-modules/sphinx-markdown-parser { }; + +# sphinx-markdown-tables = callPackage ./python-modules/sphinx-markdown-tables { }; + +# sphinx-material = callPackage ./python-modules/sphinx-material { }; + +# sphinx-mdinclude = callPackage ./python-modules/sphinx-mdinclude { }; + +# sphinx-rtd-dark-mode = callPackage ./python-modules/sphinx-rtd-dark-mode { }; + +# sphinx-rtd-theme = callPackage ./python-modules/sphinx-rtd-theme { }; + +# sphinx-serve = callPackage ./python-modules/sphinx-serve { }; + +# sphinx-testing = callPackage ./python-modules/sphinx-testing { }; + +# sphinx-version-warning = callPackage ./python-modules/sphinx-version-warning { }; + +# sphinxext-opengraph = callPackage ./python-modules/sphinxext-opengraph { }; + +# spidev = callPackage ./python-modules/spidev { }; + +# splinter = callPackage ./python-modules/splinter { }; + +# spotipy = callPackage ./python-modules/spotipy { }; + +# spsdk = callPackage ./python-modules/spsdk { }; + +# spur = callPackage ./python-modules/spur { }; + +# spyder = callPackage ./python-modules/spyder { }; + +# spyder-kernels = callPackage ./python-modules/spyder-kernels { }; + +# spylls = callPackage ./python-modules/spylls { }; + +# spyse-python = callPackage ./python-modules/spyse-python { }; + +# spython = callPackage ./python-modules/spython { }; + +# sqids = callPackage ./python-modules/sqids { }; + +# sqlalchemy = callPackage ./python-modules/sqlalchemy { }; + +# sqlalchemy_1_4 = callPackage ./python-modules/sqlalchemy/1_4.nix { }; + +# sqlalchemy-citext = callPackage ./python-modules/sqlalchemy-citext { }; + +# sqlalchemy-continuum = callPackage ./python-modules/sqlalchemy-continuum { }; + +# sqlalchemy-i18n = callPackage ./python-modules/sqlalchemy-i18n { }; + +# sqlalchemy-jsonfield = callPackage ./python-modules/sqlalchemy-jsonfield { }; + +# sqlalchemy-migrate = callPackage ./python-modules/sqlalchemy-migrate { }; + +# sqlalchemy-mixins = callPackage ./python-modules/sqlalchemy-mixins { }; + +# sqlalchemy-utils = callPackage ./python-modules/sqlalchemy-utils { }; + +# sqlalchemy-views = callPackage ./python-modules/sqlalchemy-views { }; + +# sqlbag = callPackage ./python-modules/sqlbag { }; + +# sqlglot = callPackage ./python-modules/sqlglot { }; + +# sqlitedict = callPackage ./python-modules/sqlitedict { }; + +# sqlite-migrate = callPackage ./python-modules/sqlite-migrate { }; + +# sqlite-fts4 = callPackage ./python-modules/sqlite-fts4 { }; + +# sqlite-utils = callPackage ./python-modules/sqlite-utils { }; + +# sqliteschema = callPackage ./python-modules/sqliteschema { }; + +# sqlmap = callPackage ./python-modules/sqlmap { }; + +# sqlmodel = callPackage ./python-modules/sqlmodel { }; + +# sqlobject = callPackage ./python-modules/sqlobject { }; + +# sqlparse = callPackage ./python-modules/sqlparse { }; + +# sqlsoup = callPackage ./python-modules/sqlsoup { }; + +# sqltrie = callPackage ./python-modules/sqltrie { }; + +# squarify = callPackage ./python-modules/squarify { }; + +# sre-yield = callPackage ./python-modules/sre-yield { }; + +# srp = callPackage ./python-modules/srp { }; + +# srpenergy = callPackage ./python-modules/srpenergy { }; + +# srptools = callPackage ./python-modules/srptools { }; + +# srsly = callPackage ./python-modules/srsly { }; + +# srt = callPackage ./python-modules/srt { }; + +# srvlookup = callPackage ./python-modules/srvlookup { }; + +# ssdeep = callPackage ./python-modules/ssdeep { +# inherit (pkgs) ssdeep; +# }; + +# ssdp = callPackage ./python-modules/ssdp { }; + +# ssdpy = callPackage ./python-modules/ssdpy { }; + +# sseclient = callPackage ./python-modules/sseclient { }; + +# sseclient-py = callPackage ./python-modules/sseclient-py { }; + +# sse-starlette = callPackage ./python-modules/sse-starlette { }; + +# sshfs = callPackage ./python-modules/sshfs { }; + +# sshpubkeys = callPackage ./python-modules/sshpubkeys { }; + +# sshtunnel = callPackage ./python-modules/sshtunnel { }; + +# sslib = callPackage ./python-modules/sslib { }; + +# ssg = callPackage ./python-modules/ssg { }; + +# stack-data = callPackage ./python-modules/stack-data { }; + +# stanio = callPackage ./python-modules/stanio { }; + +# stanza = callPackage ./python-modules/stanza { }; + +# starlette = callPackage ./python-modules/starlette { }; + +# starlette-context = callPackage ./python-modules/starlette-context { }; + +# starlette-wtf = callPackage ./python-modules/starlette-wtf { }; + +# starkbank-ecdsa = callPackage ./python-modules/starkbank-ecdsa { }; + +# starline = callPackage ./python-modules/starline { }; + +# stashy = callPackage ./python-modules/stashy { }; + +# static3 = callPackage ./python-modules/static3 { }; + +# staticmap = callPackage ./python-modules/staticmap { }; + +# staticjinja = callPackage ./python-modules/staticjinja { }; + +# statistics = callPackage ./python-modules/statistics { }; + +# statmake = callPackage ./python-modules/statmake { }; + +# statsd = callPackage ./python-modules/statsd { }; + +# statsmodels = callPackage ./python-modules/statsmodels { }; + +# std-uritemplate = callPackage ./python-modules/std-uritemplate { }; + +# std2 = callPackage ./python-modules/std2 { }; + +# stdiomask = callPackage ./python-modules/stdiomask { }; + +# stdlib-list = callPackage ./python-modules/stdlib-list { }; + +# stdlibs = callPackage ./python-modules/stdlibs { }; + +# steamodd = callPackage ./python-modules/steamodd { }; + +# steamship = callPackage ./python-modules/steamship { }; + +# stem = callPackage ./python-modules/stem { }; + +# stemming = callPackage ./python-modules/stemming { }; + +# stestr = callPackage ./python-modules/stestr { }; + +# stevedore = callPackage ./python-modules/stevedore { }; + +# stickytape = callPackage ./python-modules/stickytape { }; + +# stim = callPackage ./python-modules/stim { }; + +# stix2-patterns = callPackage ./python-modules/stix2-patterns { }; + +# stm32loader = callPackage ./python-modules/stm32loader { }; + +# stone = callPackage ./python-modules/stone { }; + +# stookalert = callPackage ./python-modules/stookalert { }; + +# stopit = callPackage ./python-modules/stopit { }; + +# stransi = callPackage ./python-modules/stransi { }; + +# strategies = callPackage ./python-modules/strategies { }; + +# stravalib = callPackage ./python-modules/stravalib { }; + +# strawberry-graphql = callPackage ./python-modules/strawberry-graphql { }; + +# strct = callPackage ./python-modules/strct { }; + +# streamdeck = callPackage ./python-modules/streamdeck { }; + +# streaming-form-data = callPackage ./python-modules/streaming-form-data { }; + +# streamlabswater = callPackage ./python-modules/streamlabswater { }; + +# streamlit = callPackage ./python-modules/streamlit { }; + +# streamz = callPackage ./python-modules/streamz { }; + +# strenum = callPackage ./python-modules/strenum { }; + +# strict-rfc3339 = callPackage ./python-modules/strict-rfc3339 { }; + +# strictyaml = callPackage ./python-modules/strictyaml { }; + +# stringbrewer = callPackage ./python-modules/stringbrewer { }; + +# stringcase = callPackage ./python-modules/stringcase { }; + +# stringly = callPackage ./python-modules/stringly { }; + +# stringparser = callPackage ./python-modules/stringparser { }; + +# stripe = callPackage ./python-modules/stripe { }; + +# striprtf = callPackage ./python-modules/striprtf { }; + +# structlog = callPackage ./python-modules/structlog { }; + +# stubserver = callPackage ./python-modules/stubserver { }; + +# stumpy = callPackage ./python-modules/stumpy { }; + +# stupidartnet = callPackage ./python-modules/stupidartnet { }; + +# stups-cli-support = callPackage ./python-modules/stups-cli-support { }; + +# stups-fullstop = callPackage ./python-modules/stups-fullstop { }; + +# stups-pierone = callPackage ./python-modules/stups-pierone { }; + +# stups-tokens = callPackage ./python-modules/stups-tokens { }; + +# stups-zign = callPackage ./python-modules/stups-zign { }; + +# stytra = callPackage ./python-modules/stytra { }; + +# subarulink = callPackage ./python-modules/subarulink { }; + +# subliminal = callPackage ./python-modules/subliminal { }; + +# subprocess-tee = callPackage ./python-modules/subprocess-tee { }; + +# subunit = callPackage ./python-modules/subunit { +# inherit (pkgs) subunit cppunit check; +# }; + +# subunit2sql = callPackage ./python-modules/subunit2sql { }; + +# subzerod = callPackage ./python-modules/subzerod { }; + +# succulent = callPackage ./python-modules/succulent { }; + +# sudachidict-core = callPackage ./python-modules/sudachidict { }; + +# sudachidict-full = callPackage ./python-modules/sudachidict { +# sudachidict = pkgs.sudachidict.override { dict-type = "full"; }; +# }; + +# sudachidict-small = callPackage ./python-modules/sudachidict { +# sudachidict = pkgs.sudachidict.override { dict-type = "small"; }; +# }; + +# sudachipy = callPackage ./python-modules/sudachipy { }; + +# sumo = callPackage ./python-modules/sumo { }; + +# sumtypes = callPackage ./python-modules/sumtypes { }; + +# summarytools = callPackage ./python-modules/summarytools { }; + +# sunpy = callPackage ./python-modules/sunpy { }; + +# sunwatcher = callPackage ./python-modules/sunwatcher { }; + +# sunweg = callPackage ./python-modules/sunweg { }; + +# supervise-api = callPackage ./python-modules/supervise-api { }; + +# supervisor = callPackage ./python-modules/supervisor { }; + +# superqt = callPackage ./python-modules/superqt { }; + +# sure = callPackage ./python-modules/sure { }; + +# surepy = callPackage ./python-modules/surepy { }; + +# surt = callPackage ./python-modules/surt { }; + +# survey = callPackage ./python-modules/survey { }; + +# svg2tikz = callPackage ./python-modules/svg2tikz { }; + +# svglib = callPackage ./python-modules/svglib { }; + +# svg-path = callPackage ./python-modules/svg-path { }; + +# svg-py = callPackage ./python-modules/svg-py { }; + +# svgelements = callPackage ./python-modules/svgelements { }; + +# svgutils = callPackage ./python-modules/svgutils { }; + +# svgwrite = callPackage ./python-modules/svgwrite { }; + +# sv-ttk = callPackage ./python-modules/sv-ttk { }; + +# swagger-spec-validator = callPackage ./python-modules/swagger-spec-validator { }; + +# swagger-ui-bundle = callPackage ./python-modules/swagger-ui-bundle { }; + +# switchbot-api = callPackage ./python-modules/switchbot-api { }; + +# swift = callPackage ./python-modules/swift { }; + +# swisshydrodata = callPackage ./python-modules/swisshydrodata { }; + +# swspotify = callPackage ./python-modules/swspotify { }; + +# sybil = callPackage ./python-modules/sybil { }; + +# symengine = callPackage ./python-modules/symengine { +# inherit (pkgs) symengine; +# }; + +# sympy = callPackage ./python-modules/sympy { }; + +# symspellpy = callPackage ./python-modules/symspellpy { }; + +# syncedlyrics = callPackage ./python-modules/syncedlyrics { }; + +# syncer = callPackage ./python-modules/syncer { }; + +# synergy = callPackage ./python-modules/synergy { }; + +# synologydsm-api = callPackage ./python-modules/synologydsm-api { }; + +# syslog-rfc5424-formatter = callPackage ./python-modules/syslog-rfc5424-formatter { }; + +# systembridge = callPackage ./python-modules/systembridge { }; + +# systembridgeconnector = callPackage ./python-modules/systembridgeconnector { }; + +# systembridgemodels = callPackage ./python-modules/systembridgemodels { }; + +# systemd = callPackage ./python-modules/systemd { +# inherit (pkgs) systemd; +# }; + +# sysv-ipc = callPackage ./python-modules/sysv-ipc { }; + +# syrupy = callPackage ./python-modules/syrupy { }; + +# tabcmd = callPackage ./python-modules/tabcmd { }; + +# tableaudocumentapi = callPackage ./python-modules/tableaudocumentapi { }; + +# tableauserverclient = callPackage ./python-modules/tableauserverclient { }; + +# tabledata = callPackage ./python-modules/tabledata { }; + +# tables = callPackage ./python-modules/tables { }; + +# tablib = callPackage ./python-modules/tablib { }; + +# tabula-py = callPackage ./python-modules/tabula-py { }; + +# tabulate = callPackage ./python-modules/tabulate { }; + +# tabview = callPackage ./python-modules/tabview { }; + +# taco = toPythonModule (pkgs.taco.override { +# inherit (self) python; +# enablePython = true; +# }); + +# tadasets = callPackage ./python-modules/tadasets { }; + +# tag-expressions = callPackage ./python-modules/tag-expressions { }; + +# tago = callPackage ./python-modules/tago { }; + +# tagoio-sdk = callPackage ./python-modules/tagoio-sdk { }; + +# tahoma-api = callPackage ./python-modules/tahoma-api { }; + +# tailer = callPackage ./python-modules/tailer { }; + +# tailscale = callPackage ./python-modules/tailscale { }; + +# takethetime = callPackage ./python-modules/takethetime { }; + +# tank-utility = callPackage ./python-modules/tank-utility { }; + +# tappy = callPackage ./python-modules/tappy { }; + +# tasklib = callPackage ./python-modules/tasklib { }; + +# taskw = callPackage ./python-modules/taskw { }; + +# taskw-ng = callPackage ./python-modules/taskw-ng { }; + +# tatsu = callPackage ./python-modules/tatsu { }; + +# taxi = callPackage ./python-modules/taxi { }; + +# tbats = callPackage ./python-modules/tbats { }; + +# tblib = callPackage ./python-modules/tblib { }; + +# tblite = callPackage ../development/libraries/science/chemistry/tblite/python.nix { +# inherit (pkgs) tblite meson simple-dftd3; +# }; + +# tbm-utils = callPackage ./python-modules/tbm-utils { }; + +# tcolorpy = callPackage ./python-modules/tcolorpy { }; + +# tcxparser = callPackage ./python-modules/tcxparser { }; + +# tcxreader = callPackage ./python-modules/tcxreader { }; + +# tdir = callPackage ./python-modules/tdir { }; + +# teamcity-messages = callPackage ./python-modules/teamcity-messages { }; + +# telegram = callPackage ./python-modules/telegram { }; + +# telegraph = callPackage ./python-modules/telegraph { }; + +# telepath = callPackage ./python-modules/telepath { }; + +# telethon = callPackage ./python-modules/telethon { +# inherit (pkgs) openssl; +# }; + +# telethon-session-sqlalchemy = callPackage ./python-modules/telethon-session-sqlalchemy { }; + +# teletype = callPackage ./python-modules/teletype { }; + +# telfhash = callPackage ./python-modules/telfhash { }; + +# telegram-text = callPackage ./python-modules/telegram-text { }; + +# temescal = callPackage ./python-modules/temescal { }; + +# temperusb = callPackage ./python-modules/temperusb { }; + +# tempest = callPackage ./python-modules/tempest { }; + +# tempita = callPackage ./python-modules/tempita { }; + +# templateflow = callPackage ./python-modules/templateflow { }; + +# tempora = callPackage ./python-modules/tempora { }; + +# tenacity = callPackage ./python-modules/tenacity { }; + +# tencentcloud-sdk-python = callPackage ./python-modules/tencentcloud-sdk-python { }; + +# tendo = callPackage ./python-modules/tendo { }; + +# tensorboard-data-server = callPackage ./python-modules/tensorboard-data-server { }; + +# tensorboard-plugin-profile = callPackage ./python-modules/tensorboard-plugin-profile { }; + +# tensorboard-plugin-wit = callPackage ./python-modules/tensorboard-plugin-wit { }; + +# tensorboard = callPackage ./python-modules/tensorboard { }; + +# tensorboardx = callPackage ./python-modules/tensorboardx { }; + +# tensordict = callPackage ./python-modules/tensordict { }; + +# tensorflow-bin = callPackage ./python-modules/tensorflow/bin.nix { +# inherit (pkgs.config) cudaSupport; +# }; + +# tensorflow-build = let +# compat = rec { +# protobufTF = pkgs.protobuf_21.override { +# abseil-cpp = pkgs.abseil-cpp_202301; +# }; +# grpcTF = (pkgs.grpc.overrideAttrs ( +# oldAttrs: rec { +# # nvcc fails on recent grpc versions, so we use the latest patch level +# # of the grpc version bundled by upstream tensorflow to allow CUDA +# # support +# version = "1.27.3"; +# src = pkgs.fetchFromGitHub { +# owner = "grpc"; +# repo = "grpc"; +# rev = "v${version}"; +# hash = "sha256-PpiOT4ZJe1uMp5j+ReQulC9jpT0xoR2sAl6vRYKA0AA="; +# fetchSubmodules = true; +# }; +# patches = [ ]; +# postPatch = '' +# sed -i "s/-std=c++11/-std=c++17/" CMakeLists.txt +# echo "set(CMAKE_CXX_STANDARD 17)" >> CMakeLists.txt +# ''; +# }) +# ).override { +# protobuf = protobufTF; +# }; +# protobuf-pythonTF = self.protobuf.override { +# protobuf = protobufTF; +# }; +# grpcioTF = self.grpcio.override { +# protobuf = protobufTF; +# grpc = grpcTF; +# }; +# tensorboard-plugin-profileTF = self.tensorboard-plugin-profile.override { +# protobuf = protobuf-pythonTF; +# }; +# tensorboardTF = self.tensorboard.override { +# grpcio = grpcioTF; +# protobuf = protobuf-pythonTF; +# tensorboard-plugin-profile = tensorboard-plugin-profileTF; +# }; +# }; +# in +# callPackage ./python-modules/tensorflow { +# inherit (pkgs.darwin) cctools; +# inherit (pkgs.config) cudaSupport; +# inherit (pkgs.darwin.apple_sdk.frameworks) Foundation Security; +# flatbuffers-core = pkgs.flatbuffers; +# flatbuffers-python = self.flatbuffers; +# protobuf-core = compat.protobufTF; +# protobuf-python = compat.protobuf-pythonTF; +# grpc = compat.grpcTF; +# grpcio = compat.grpcioTF; +# tensorboard = compat.tensorboardTF; +# abseil-cpp = pkgs.abseil-cpp_202301; + +# # Tensorflow 2.13 doesn't support gcc13: +# # https://github.com/tensorflow/tensorflow/issues/61289 +# # +# # We use the nixpkgs' default libstdc++ to stay compatible with other +# # python modules +# stdenv = pkgs.stdenvAdapters.useLibsFrom stdenv pkgs.gcc12Stdenv; +# }; + +# tensorflow-datasets = callPackage ./python-modules/tensorflow-datasets { }; + +# tensorflow-estimator-bin = callPackage ./python-modules/tensorflow-estimator/bin.nix { }; + +# tensorflow-metadata = callPackage ./python-modules/tensorflow-metadata { }; + +# tensorflow-probability = callPackage ./python-modules/tensorflow-probability { +# inherit (pkgs.darwin) cctools; +# }; + +# tensorflow = self.tensorflow-build; + +# tensorflowWithCuda = self.tensorflow.override { +# cudaSupport = true; +# }; + +# tensorflowWithoutCuda = self.tensorflow.override { +# cudaSupport = false; +# }; + +# tensorly = callPackage ./python-modules/tensorly { }; + +# tensorrt = callPackage ./python-modules/tensorrt { cudaPackages = pkgs.cudaPackages_11; }; + +# tensorstore = callPackage ./python-modules/tensorstore { }; + +# tellduslive = callPackage ./python-modules/tellduslive { }; + +# termcolor = callPackage ./python-modules/termcolor { }; + +# termgraph = callPackage ./python-modules/termgraph { }; + +# terminado = callPackage ./python-modules/terminado { }; + +# terminaltables = callPackage ./python-modules/terminaltables { }; + +# termplotlib = callPackage ./python-modules/termplotlib { }; + +# termstyle = callPackage ./python-modules/termstyle { }; + +# tern = callPackage ./python-modules/tern { }; + +# tesla-fleet-api = callPackage ./python-modules/tesla-fleet-api { }; + +# tesla-powerwall = callPackage ./python-modules/tesla-powerwall { }; + +# tesla-wall-connector = callPackage ./python-modules/tesla-wall-connector { }; + +# teslajsonpy = callPackage ./python-modules/teslajsonpy { }; + +# tess = callPackage ./python-modules/tess { }; + +# tesserocr = callPackage ./python-modules/tesserocr { }; + +# testcontainers = callPackage ./python-modules/testcontainers { }; + +# testfixtures = callPackage ./python-modules/testfixtures { }; + +# texsoup = callPackage ./python-modules/texsoup { }; + +# textfsm = callPackage ./python-modules/textfsm { }; + +# textile = callPackage ./python-modules/textile { }; + +# textparser = callPackage ./python-modules/textparser { }; + +# textual = callPackage ./python-modules/textual { }; + +# textual-dev = callPackage ./python-modules/textual-dev { }; + +# textual-universal-directorytree = callPackage ./python-modules/textual-universal-directorytree { }; + +# testbook = callPackage ./python-modules/testbook { }; + +# testing-common-database = callPackage ./python-modules/testing-common-database { }; + +# testing-postgresql = callPackage ./python-modules/testing-postgresql { }; + + testpath = callPackage ./python-modules/testpath { }; + +# testrail-api = callPackage ./python-modules/testrail-api { }; + +# testrepository = callPackage ./python-modules/testrepository { }; + +# testresources = callPackage ./python-modules/testresources { }; + +# testscenarios = callPackage ./python-modules/testscenarios { }; + +# testtools = callPackage ./python-modules/testtools { }; + +# test-tube = callPackage ./python-modules/test-tube { }; + +# textdistance = callPackage ./python-modules/textdistance { }; + +# textacy = callPackage ./python-modules/textacy { }; + +# textnets = callPackage ./python-modules/textnets { +# en_core_web_sm = spacy-models.en_core_web_sm; +# }; + +# texttable = callPackage ./python-modules/texttable { }; + +# text-unidecode = callPackage ./python-modules/text-unidecode { }; + +# textwrap3 = callPackage ./python-modules/textwrap3 { }; + +# textx = callPackage ./python-modules/textx { }; + +# tf2onnx = callPackage ./python-modules/tf2onnx { }; + +# tflearn = callPackage ./python-modules/tflearn { }; + +# tftpy = callPackage ./python-modules/tftpy { }; + +# tgcrypto = callPackage ./python-modules/tgcrypto { }; + +# theano-pymc = callPackage ./python-modules/theano-pymc { }; + +# theano = callPackage ./python-modules/theano rec { +# inherit (pkgs.config) cudaSupport; +# cudnnSupport = cudaSupport; +# }; + +# theanoWithCuda = self.theano.override { +# cudaSupport = true; +# cudnnSupport = true; +# }; + +# theanoWithoutCuda = self.theano.override { +# cudaSupport = false; +# cudnnSupport = false; +# }; + +# thefuzz = callPackage ./python-modules/thefuzz { }; + +# thelogrus = callPackage ./python-modules/thelogrus { }; + +# thermobeacon-ble = callPackage ./python-modules/thermobeacon-ble { }; + +# thermopro-ble = callPackage ./python-modules/thermopro-ble { }; + +# thespian = callPackage ./python-modules/thespian { }; + +# thinc = callPackage ./python-modules/thinc { +# inherit (pkgs.darwin.apple_sdk.frameworks) Accelerate CoreFoundation CoreGraphics CoreVideo; +# }; + +# thorlabspm100 = callPackage ./python-modules/thorlabspm100 { }; + +# threadloop = callPackage ./python-modules/threadloop { }; + +# threadpool = callPackage ./python-modules/threadpool { }; + +# threadpoolctl = callPackage ./python-modules/threadpoolctl { }; + +# threat9-test-bed = callPackage ./python-modules/threat9-test-bed { }; + +# three-merge = callPackage ./python-modules/three-merge { }; + +# thrift = callPackage ./python-modules/thrift { }; + +# thriftpy2 = callPackage ./python-modules/thriftpy2 { }; + +# throttler = callPackage ./python-modules/throttler { }; + +# thttp = callPackage ./python-modules/thttp { }; + +# tkinter = callPackage ./python-modules/tkinter { +# py = python.override { x11Support=true; }; +# }; + +# tidalapi = callPackage ./python-modules/tidalapi { }; + +# tidyexc = callPackage ./python-modules/tidyexc { }; + +# tidylib = callPackage ./python-modules/pytidylib { }; + +# tifffile = callPackage ./python-modules/tifffile { }; + +# tika = callPackage ./python-modules/tika { }; + +# tika-client = callPackage ./python-modules/tika-client { }; + +# tiktoken = callPackage ./python-modules/tiktoken { }; + +# tikzplotlib = callPackage ./python-modules/tikzplotlib { }; + +# tiledb = callPackage ./python-modules/tiledb { +# inherit (pkgs) tiledb; +# }; + +# tilequant = callPackage ./python-modules/tilequant { }; + +# tiler = callPackage ./python-modules/tiler { }; + +# tilestache = callPackage ./python-modules/tilestache { }; + +# tilt-ble = callPackage ./python-modules/tilt-ble { }; + +# timeago = callPackage ./python-modules/timeago { }; + +# timecop = callPackage ./python-modules/timecop { }; + +# timelib = callPackage ./python-modules/timelib { }; + +# time-machine = callPackage ./python-modules/time-machine { }; + +# timeout-decorator = callPackage ./python-modules/timeout-decorator { }; + +# timeslot = callPackage ./python-modules/timeslot { }; + +# timetagger = callPackage ./python-modules/timetagger { }; + +# timezonefinder = callPackage ./python-modules/timezonefinder { }; + +# timing-asgi = callPackage ./python-modules/timing-asgi { }; + +# timm = callPackage ./python-modules/timm { }; + +# tiny-cuda-nn = toPythonModule (pkgs.tiny-cuda-nn.override { +# cudaPackages = self.torch.cudaPackages; +# python3Packages = self; +# pythonSupport = true; +# }); + +# tiny-proxy = callPackage ./python-modules/tiny-proxy { }; + +# tinycss2 = callPackage ./python-modules/tinycss2 { }; + +# tinycss = callPackage ./python-modules/tinycss { }; + +# tinydb = callPackage ./python-modules/tinydb { }; + +# tinygrad = callPackage ./python-modules/tinygrad { }; + +# tinyobjloader-py = callPackage ./python-modules/tinyobjloader-py { }; + +# tinyrecord = callPackage ./python-modules/tinyrecord { }; + +# tinysegmenter = callPackage ./python-modules/tinysegmenter { }; + +# tissue = callPackage ./python-modules/tissue { }; + +# titlecase = callPackage ./python-modules/titlecase { }; + +# tld = callPackage ./python-modules/tld { }; + +# tlds = callPackage ./python-modules/tlds { }; + +# tldextract = callPackage ./python-modules/tldextract { }; + +# tlsh = callPackage ./python-modules/tlsh { }; + +# tlslite-ng = callPackage ./python-modules/tlslite-ng { }; + +# tls-client = callPackage ./python-modules/tls-client { }; + +# tls-parser = callPackage ./python-modules/tls-parser { }; + +# tlv8 = callPackage ./python-modules/tlv8 { }; + +# tmb = callPackage ./python-modules/tmb { }; + +# todoist = callPackage ./python-modules/todoist { }; + +# todoist-api-python = callPackage ./python-modules/todoist-api-python { }; + +# toggl-cli = callPackage ./python-modules/toggl-cli { }; + +# token-bucket = callPackage ./python-modules/token-bucket { }; + +# tokenizers = callPackage ./python-modules/tokenizers { +# inherit (pkgs.darwin.apple_sdk.frameworks) Security; +# }; + +# tokenize-rt = toPythonModule (callPackage ./python-modules/tokenize-rt { }); + +# tokenlib = callPackage ./python-modules/tokenlib { }; + +# tokentrim = callPackage ./python-modules/tokentrim { }; + +# tololib = callPackage ./python-modules/tololib { }; + + toml = callPackage ./python-modules/toml { }; + +# toml-adapt = callPackage ./python-modules/toml-adapt { }; + + tomli = callPackage ./python-modules/tomli { }; + + tomli-w = callPackage ./python-modules/tomli-w { }; + +# tomlkit = callPackage ./python-modules/tomlkit { }; + +# toolz = callPackage ./python-modules/toolz { }; + +# toonapi = callPackage ./python-modules/toonapi { }; + +# toposort = callPackage ./python-modules/toposort { }; + +# torch = callPackage ./python-modules/torch { +# inherit (pkgs.darwin.apple_sdk.frameworks) Accelerate CoreServices; +# inherit (pkgs.darwin) libobjc; +# }; + +# torch-audiomentations = callPackage ./python-modules/torch-audiomentations { }; + +# torch-pitch-shift = callPackage ./python-modules/torch-pitch-shift { }; + +# torch-bin = callPackage ./python-modules/torch/bin.nix { +# openai-triton = self.openai-triton-bin; +# }; + +# torchWithCuda = self.torch.override { +# openai-triton = self.openai-triton-cuda; +# cudaSupport = true; +# rocmSupport = false; +# }; + +# torchWithoutCuda = self.torch.override { +# cudaSupport = false; +# }; + +# torchWithRocm = self.torch.override { +# openai-triton = self.openai-triton-no-cuda; +# rocmSupport = true; +# cudaSupport = false; +# }; + +# torchWithoutRocm = self.torch.override { +# rocmSupport = false; +# }; + +# torch-tb-profiler = callPackage ./python-modules/torch-tb-profiler/default.nix { }; + +# torchaudio = callPackage ./python-modules/torchaudio { }; + +# torchaudio-bin = callPackage ./python-modules/torchaudio/bin.nix { +# cudaPackages = pkgs.cudaPackages_12; +# }; + +# torchdiffeq = callPackage ./python-modules/torchdiffeq { }; + +# torchgpipe = callPackage ./python-modules/torchgpipe { }; + +# torchmetrics = callPackage ./python-modules/torchmetrics { }; + +# torchio = callPackage ./python-modules/torchio { }; + +# torchinfo = callPackage ./python-modules/torchinfo { }; + +# torchlibrosa = callPackage ./python-modules/torchlibrosa { }; + +# torchrl = callPackage ./python-modules/torchrl { }; + +# torchsde = callPackage ./python-modules/torchsde { }; + +# torchvision = callPackage ./python-modules/torchvision { }; + +# torchvision-bin = callPackage ./python-modules/torchvision/bin.nix { +# cudaPackages = pkgs.cudaPackages_12; +# }; + + tornado = callPackage ./python-modules/tornado { }; + +# # Used by circus and grab-site, 2020-08-29 +# tornado_4 = callPackage ./python-modules/tornado/4.nix { }; + +# # Used by streamlit, 2021-01-29 +# tornado_5 = callPackage ./python-modules/tornado/5.nix { }; + +# torpy = callPackage ./python-modules/torpy { }; + +# torrent-parser = callPackage ./python-modules/torrent-parser { }; + +# torrequest = callPackage ./python-modules/torrequest { }; + +# total-connect-client = callPackage ./python-modules/total-connect-client { }; + +# towncrier = callPackage ./python-modules/towncrier { +# inherit (pkgs) git; +# }; + +# tox = callPackage ./python-modules/tox { }; + +# tplink-omada-client = callPackage ./python-modules/tplink-omada-client { }; + +# tpm2-pytss = callPackage ./python-modules/tpm2-pytss { }; + +# tqdm = callPackage ./python-modules/tqdm { }; + +# traceback2 = callPackage ./python-modules/traceback2 { }; + +# tracerite = callPackage ./python-modules/tracerite { }; + +# tracing = callPackage ./python-modules/tracing { }; + +# trackpy = callPackage ./python-modules/trackpy { }; + +# trafilatura = callPackage ./python-modules/trafilatura { }; + +# trailrunner = callPackage ./python-modules/trailrunner {}; + +# trainer = callPackage ./python-modules/trainer {}; + +# traitlets = callPackage ./python-modules/traitlets { }; + +# traits = callPackage ./python-modules/traits { }; + +# traitsui = callPackage ./python-modules/traitsui { }; + +# traittypes = callPackage ./python-modules/traittypes { }; + +# trampoline = callPackage ./python-modules/trampoline { }; + +# transaction = callPackage ./python-modules/transaction { }; + +# transformers = callPackage ./python-modules/transformers { }; + +# transforms3d = callPackage ./python-modules/transforms3d { }; + +# transitions = callPackage ./python-modules/transitions { }; + +# translatehtml = callPackage ./python-modules/translatehtml { }; + +# translatepy = callPackage ./python-modules/translatepy { }; + +# translationstring = callPackage ./python-modules/translationstring { }; + +# translitcodec = callPackage ./python-modules/translitcodec { }; + +# transmission-rpc = callPackage ./python-modules/transmission-rpc { }; + +# transmissionrpc = callPackage ./python-modules/transmissionrpc { }; + +# trectools = callPackage ./python-modules/trectools { }; + +# tree-sitter = callPackage ./python-modules/tree-sitter { }; + +# treelib = callPackage ./python-modules/treelib { }; + +# treelog = callPackage ./python-modules/treelog { }; + +# treeo = callPackage ./python-modules/treeo { }; + +# treex = callPackage ./python-modules/treex { }; + +# treq = callPackage ./python-modules/treq { }; + +# trezor-agent = callPackage ./python-modules/trezor-agent { +# pinentry = pkgs.pinentry-curses; +# }; + +# trezor = callPackage ./python-modules/trezor { }; + +# trfl = callPackage ./python-modules/trfl { }; + +# trimesh = callPackage ./python-modules/trimesh { }; + +# trino-python-client = callPackage ./python-modules/trino-python-client { }; + +# trio = callPackage ./python-modules/trio { +# inherit (pkgs) coreutils; +# }; + +# trio-asyncio = callPackage ./python-modules/trio-asyncio { }; + +# trio-websocket = callPackage ./python-modules/trio-websocket { }; + +# tritonclient = callPackage ./python-modules/tritonclient { }; + +# troposphere = callPackage ./python-modules/troposphere { }; + + trove-classifiers = callPackage ./python-modules/trove-classifiers { }; + +# trueskill = callPackage ./python-modules/trueskill { }; + + trustme = callPackage ./python-modules/trustme { }; + +# truststore = callPackage ./python-modules/truststore { }; + +# trytond = callPackage ./python-modules/trytond { }; + +# tsfresh = callPackage ./python-modules/tsfresh { }; + +# tskit = callPackage ./python-modules/tskit { }; + +# ttach = callPackage ./python-modules/ttach { }; + +# ttls = callPackage ./python-modules/ttls { }; + +# ttn-client = callPackage ./python-modules/ttn-client { }; + +# ttp = callPackage ./python-modules/ttp { }; + +# ttp-templates = callPackage ./python-modules/ttp-templates { }; + +# ttstokenizer = callPackage ./python-modules/ttstokenizer { }; + +# tubes = callPackage ./python-modules/tubes { }; + +# tuf = callPackage ./python-modules/tuf { }; + +# tunigo = callPackage ./python-modules/tunigo { }; + +# tubeup = callPackage ./python-modules/tubeup { }; + +# turnt = callPackage ./python-modules/turnt { }; + +# tuya-device-sharing-sdk = callPackage ./python-modules/tuya-device-sharing-sdk { }; + +# tuya-iot-py-sdk = callPackage ./python-modules/tuya-iot-py-sdk { }; + +# tuyaha = callPackage ./python-modules/tuyaha { }; + +# tvdb-api = callPackage ./python-modules/tvdb-api { }; + +# tweedledum = callPackage ./python-modules/tweedledum { }; + +# tweepy = callPackage ./python-modules/tweepy { }; + +# twentemilieu = callPackage ./python-modules/twentemilieu { }; + +# twiggy = callPackage ./python-modules/twiggy { }; + +# twilio = callPackage ./python-modules/twilio { }; + +# twill = callPackage ./python-modules/twill { }; + +# twine = callPackage ./python-modules/twine { }; + +# twinkly-client = callPackage ./python-modules/twinkly-client { }; + +# twisted = callPackage ./python-modules/twisted { }; + +# twitch-python = callPackage ./python-modules/twitch-python { }; + +# twitchapi = callPackage ./python-modules/twitchapi { }; + +# twitter = callPackage ./python-modules/twitter { }; + +# twitter-common-collections = callPackage ./python-modules/twitter-common-collections { }; + +# twitter-common-confluence = callPackage ./python-modules/twitter-common-confluence { }; + +# twitter-common-dirutil = callPackage ./python-modules/twitter-common-dirutil { }; + +# twitter-common-lang = callPackage ./python-modules/twitter-common-lang { }; + +# twitter-common-log = callPackage ./python-modules/twitter-common-log { }; + +# twitter-common-options = callPackage ./python-modules/twitter-common-options { }; + +# twitterapi = callPackage ./python-modules/twitterapi { }; + +# twofish = callPackage ./python-modules/twofish { }; + +# txaio = callPackage ./python-modules/txaio { }; + +# txamqp = callPackage ./python-modules/txamqp { }; + +# txdbus = callPackage ./python-modules/txdbus { }; + +# txgithub = callPackage ./python-modules/txgithub { }; + +# txi2p-tahoe = callPackage ./python-modules/txi2p-tahoe { }; + +# txredisapi = callPackage ./python-modules/txredisapi { }; + +# txrequests = callPackage ./python-modules/txrequests { }; + +# txtai = callPackage ./python-modules/txtai { }; + +# txtorcon = callPackage ./python-modules/txtorcon { }; + +# txzmq = callPackage ./python-modules/txzmq { }; + +# typechecks = callPackage ./python-modules/typechecks { }; + +# typecode = callPackage ./python-modules/typecode { }; + +# typecode-libmagic = callPackage ./python-modules/typecode/libmagic.nix { +# inherit (pkgs) file zlib; +# }; + +# typed-ast = callPackage ./python-modules/typed-ast { }; + +# typed-settings = callPackage ./python-modules/typed-settings { }; + +# typeguard = callPackage ./python-modules/typeguard { }; + +# typepy = callPackage ./python-modules/typepy { }; + +# typer = callPackage ./python-modules/typer { }; + +# type-infer = callPackage ./python-modules/type-infer { }; + +# types-aiobotocore = callPackage ./python-modules/types-aiobotocore { }; + +# inherit (callPackage ./python-modules/types-aiobotocore-packages { }) + +# types-aiobotocore-accessanalyzer + +# types-aiobotocore-account + +# types-aiobotocore-acm + +# types-aiobotocore-acm-pca + +# types-aiobotocore-alexaforbusiness + +# types-aiobotocore-amp + +# types-aiobotocore-amplify + +# types-aiobotocore-amplifybackend + +# types-aiobotocore-amplifyuibuilder + +# types-aiobotocore-apigateway + +# types-aiobotocore-apigatewaymanagementapi + +# types-aiobotocore-apigatewayv2 + +# types-aiobotocore-appconfig + +# types-aiobotocore-appconfigdata + +# types-aiobotocore-appfabric + +# types-aiobotocore-appflow + +# types-aiobotocore-appintegrations + +# types-aiobotocore-application-autoscaling + +# types-aiobotocore-application-insights + +# types-aiobotocore-applicationcostprofiler + +# types-aiobotocore-appmesh + +# types-aiobotocore-apprunner + +# types-aiobotocore-appstream + +# types-aiobotocore-appsync + +# types-aiobotocore-arc-zonal-shift + +# types-aiobotocore-athena + +# types-aiobotocore-auditmanager + +# types-aiobotocore-autoscaling + +# types-aiobotocore-autoscaling-plans + +# types-aiobotocore-backup + +# types-aiobotocore-backup-gateway + +# types-aiobotocore-backupstorage + +# types-aiobotocore-batch + +# types-aiobotocore-billingconductor + +# types-aiobotocore-braket + +# types-aiobotocore-budgets + +# types-aiobotocore-ce + +# types-aiobotocore-chime + +# types-aiobotocore-chime-sdk-identity + +# types-aiobotocore-chime-sdk-media-pipelines + +# types-aiobotocore-chime-sdk-meetings + +# types-aiobotocore-chime-sdk-messaging + +# types-aiobotocore-chime-sdk-voice + +# types-aiobotocore-cleanrooms + +# types-aiobotocore-cloud9 + +# types-aiobotocore-cloudcontrol + +# types-aiobotocore-clouddirectory + +# types-aiobotocore-cloudformation + +# types-aiobotocore-cloudfront + +# types-aiobotocore-cloudhsm + +# types-aiobotocore-cloudhsmv2 + +# types-aiobotocore-cloudsearch + +# types-aiobotocore-cloudsearchdomain + +# types-aiobotocore-cloudtrail + +# types-aiobotocore-cloudtrail-data + +# types-aiobotocore-cloudwatch + +# types-aiobotocore-codeartifact + +# types-aiobotocore-codebuild + +# types-aiobotocore-codecatalyst + +# types-aiobotocore-codecommit + +# types-aiobotocore-codedeploy + +# types-aiobotocore-codeguru-reviewer + +# types-aiobotocore-codeguru-security + +# types-aiobotocore-codeguruprofiler + +# types-aiobotocore-codepipeline + +# types-aiobotocore-codestar + +# types-aiobotocore-codestar-connections + +# types-aiobotocore-codestar-notifications + +# types-aiobotocore-cognito-identity + +# types-aiobotocore-cognito-idp + +# types-aiobotocore-cognito-sync + +# types-aiobotocore-comprehend + +# types-aiobotocore-comprehendmedical + +# types-aiobotocore-compute-optimizer + +# types-aiobotocore-config + +# types-aiobotocore-connect + +# types-aiobotocore-connect-contact-lens + +# types-aiobotocore-connectcampaigns + +# types-aiobotocore-connectcases + +# types-aiobotocore-connectparticipant + +# types-aiobotocore-controltower + +# types-aiobotocore-cur + +# types-aiobotocore-customer-profiles + +# types-aiobotocore-databrew + +# types-aiobotocore-dataexchange + +# types-aiobotocore-datapipeline + +# types-aiobotocore-datasync + +# types-aiobotocore-dax + +# types-aiobotocore-detective + +# types-aiobotocore-devicefarm + +# types-aiobotocore-devops-guru + +# types-aiobotocore-directconnect + +# types-aiobotocore-discovery + +# types-aiobotocore-dlm + +# types-aiobotocore-dms + +# types-aiobotocore-docdb + +# types-aiobotocore-docdb-elastic + +# types-aiobotocore-drs + +# types-aiobotocore-ds + +# types-aiobotocore-dynamodb + +# types-aiobotocore-dynamodbstreams + +# types-aiobotocore-ebs + +# types-aiobotocore-ec2 + +# types-aiobotocore-ec2-instance-connect + +# types-aiobotocore-ecr + +# types-aiobotocore-ecr-public + +# types-aiobotocore-ecs + +# types-aiobotocore-efs + +# types-aiobotocore-eks + +# types-aiobotocore-elastic-inference + +# types-aiobotocore-elasticache + +# types-aiobotocore-elasticbeanstalk + +# types-aiobotocore-elastictranscoder + +# types-aiobotocore-elb + +# types-aiobotocore-elbv2 + +# types-aiobotocore-emr + +# types-aiobotocore-emr-containers + +# types-aiobotocore-emr-serverless + +# types-aiobotocore-entityresolution + +# types-aiobotocore-es + +# types-aiobotocore-events + +# types-aiobotocore-evidently + +# types-aiobotocore-finspace + +# types-aiobotocore-finspace-data + +# types-aiobotocore-firehose + +# types-aiobotocore-fis + +# types-aiobotocore-fms + +# types-aiobotocore-forecast + +# types-aiobotocore-forecastquery + +# types-aiobotocore-frauddetector + +# types-aiobotocore-fsx + +# types-aiobotocore-gamelift + +# types-aiobotocore-gamesparks + +# types-aiobotocore-glacier + +# types-aiobotocore-globalaccelerator + +# types-aiobotocore-glue + +# types-aiobotocore-grafana + +# types-aiobotocore-greengrass + +# types-aiobotocore-greengrassv2 + +# types-aiobotocore-groundstation + +# types-aiobotocore-guardduty + +# types-aiobotocore-health + +# types-aiobotocore-healthlake + +# types-aiobotocore-honeycode + +# types-aiobotocore-iam + +# types-aiobotocore-identitystore + +# types-aiobotocore-imagebuilder + +# types-aiobotocore-importexport + +# types-aiobotocore-inspector + +# types-aiobotocore-inspector2 + +# types-aiobotocore-internetmonitor + +# types-aiobotocore-iot + +# types-aiobotocore-iot-data + +# types-aiobotocore-iot-jobs-data + +# types-aiobotocore-iot-roborunner + +# types-aiobotocore-iot1click-devices + +# types-aiobotocore-iot1click-projects + +# types-aiobotocore-iotanalytics + +# types-aiobotocore-iotdeviceadvisor + +# types-aiobotocore-iotevents + +# types-aiobotocore-iotevents-data + +# types-aiobotocore-iotfleethub + +# types-aiobotocore-iotfleetwise + +# types-aiobotocore-iotsecuretunneling + +# types-aiobotocore-iotsitewise + +# types-aiobotocore-iotthingsgraph + +# types-aiobotocore-iottwinmaker + +# types-aiobotocore-iotwireless + +# types-aiobotocore-ivs + +# types-aiobotocore-ivs-realtime + +# types-aiobotocore-ivschat + +# types-aiobotocore-kafka + +# types-aiobotocore-kafkaconnect + +# types-aiobotocore-kendra + +# types-aiobotocore-kendra-ranking + +# types-aiobotocore-keyspaces + +# types-aiobotocore-kinesis + +# types-aiobotocore-kinesis-video-archived-media + +# types-aiobotocore-kinesis-video-media + +# types-aiobotocore-kinesis-video-signaling + +# types-aiobotocore-kinesis-video-webrtc-storage + +# types-aiobotocore-kinesisanalytics + +# types-aiobotocore-kinesisanalyticsv2 + +# types-aiobotocore-kinesisvideo + +# types-aiobotocore-kms + +# types-aiobotocore-lakeformation + +# types-aiobotocore-lambda + +# types-aiobotocore-lex-models + +# types-aiobotocore-lex-runtime + +# types-aiobotocore-lexv2-models + +# types-aiobotocore-lexv2-runtime + +# types-aiobotocore-license-manager + +# types-aiobotocore-license-manager-linux-subscriptions + +# types-aiobotocore-license-manager-user-subscriptions + +# types-aiobotocore-lightsail + +# types-aiobotocore-location + +# types-aiobotocore-logs + +# types-aiobotocore-lookoutequipment + +# types-aiobotocore-lookoutmetrics + +# types-aiobotocore-lookoutvision + +# types-aiobotocore-m2 + +# types-aiobotocore-machinelearning + +# types-aiobotocore-macie + +# types-aiobotocore-macie2 + +# types-aiobotocore-managedblockchain + +# types-aiobotocore-managedblockchain-query + +# types-aiobotocore-marketplace-catalog + +# types-aiobotocore-marketplace-entitlement + +# types-aiobotocore-marketplacecommerceanalytics + +# types-aiobotocore-mediaconnect + +# types-aiobotocore-mediaconvert + +# types-aiobotocore-medialive + +# types-aiobotocore-mediapackage + +# types-aiobotocore-mediapackage-vod + +# types-aiobotocore-mediapackagev2 + +# types-aiobotocore-mediastore + +# types-aiobotocore-mediastore-data + +# types-aiobotocore-mediatailor + +# types-aiobotocore-medical-imaging + +# types-aiobotocore-memorydb + +# types-aiobotocore-meteringmarketplace + +# types-aiobotocore-mgh + +# types-aiobotocore-mgn + +# types-aiobotocore-migration-hub-refactor-spaces + +# types-aiobotocore-migrationhub-config + +# types-aiobotocore-migrationhuborchestrator + +# types-aiobotocore-migrationhubstrategy + +# types-aiobotocore-mobile + +# types-aiobotocore-mq + +# types-aiobotocore-mturk + +# types-aiobotocore-mwaa + +# types-aiobotocore-neptune + +# types-aiobotocore-network-firewall + +# types-aiobotocore-networkmanager + +# types-aiobotocore-nimble + +# types-aiobotocore-oam + +# types-aiobotocore-omics + +# types-aiobotocore-opensearch + +# types-aiobotocore-opensearchserverless + +# types-aiobotocore-opsworks + +# types-aiobotocore-opsworkscm + +# types-aiobotocore-organizations + +# types-aiobotocore-osis + +# types-aiobotocore-outposts + +# types-aiobotocore-panorama + +# types-aiobotocore-payment-cryptography + +# types-aiobotocore-payment-cryptography-data + +# types-aiobotocore-personalize + +# types-aiobotocore-personalize-events + +# types-aiobotocore-personalize-runtime + +# types-aiobotocore-pi + +# types-aiobotocore-pinpoint + +# types-aiobotocore-pinpoint-email + +# types-aiobotocore-pinpoint-sms-voice + +# types-aiobotocore-pinpoint-sms-voice-v2 + +# types-aiobotocore-pipes + +# types-aiobotocore-polly + +# types-aiobotocore-pricing + +# types-aiobotocore-privatenetworks + +# types-aiobotocore-proton + +# types-aiobotocore-qldb + +# types-aiobotocore-qldb-session + +# types-aiobotocore-quicksight + +# types-aiobotocore-ram + +# types-aiobotocore-rbin + +# types-aiobotocore-rds + +# types-aiobotocore-rds-data + +# types-aiobotocore-redshift + +# types-aiobotocore-redshift-data + +# types-aiobotocore-redshift-serverless + +# types-aiobotocore-rekognition + +# types-aiobotocore-resiliencehub + +# types-aiobotocore-resource-explorer-2 + +# types-aiobotocore-resource-groups + +# types-aiobotocore-resourcegroupstaggingapi + +# types-aiobotocore-robomaker + +# types-aiobotocore-rolesanywhere + +# types-aiobotocore-route53 + +# types-aiobotocore-route53-recovery-cluster + +# types-aiobotocore-route53-recovery-control-config + +# types-aiobotocore-route53-recovery-readiness + +# types-aiobotocore-route53domains + +# types-aiobotocore-route53resolver + +# types-aiobotocore-rum + +# types-aiobotocore-s3 + +# types-aiobotocore-s3control + +# types-aiobotocore-s3outposts + +# types-aiobotocore-sagemaker + +# types-aiobotocore-sagemaker-a2i-runtime + +# types-aiobotocore-sagemaker-edge + +# types-aiobotocore-sagemaker-featurestore-runtime + +# types-aiobotocore-sagemaker-geospatial + +# types-aiobotocore-sagemaker-metrics + +# types-aiobotocore-sagemaker-runtime + +# types-aiobotocore-savingsplans + +# types-aiobotocore-scheduler + +# types-aiobotocore-schemas + +# types-aiobotocore-sdb + +# types-aiobotocore-secretsmanager + +# types-aiobotocore-securityhub + +# types-aiobotocore-securitylake + +# types-aiobotocore-serverlessrepo + +# types-aiobotocore-service-quotas + +# types-aiobotocore-servicecatalog + +# types-aiobotocore-servicecatalog-appregistry + +# types-aiobotocore-servicediscovery + +# types-aiobotocore-ses + +# types-aiobotocore-sesv2 + +# types-aiobotocore-shield + +# types-aiobotocore-signer + +# types-aiobotocore-simspaceweaver + +# types-aiobotocore-sms + +# types-aiobotocore-sms-voice + +# types-aiobotocore-snow-device-management + +# types-aiobotocore-snowball + +# types-aiobotocore-sns + +# types-aiobotocore-sqs + +# types-aiobotocore-ssm + +# types-aiobotocore-ssm-contacts + +# types-aiobotocore-ssm-incidents + +# types-aiobotocore-ssm-sap + +# types-aiobotocore-sso + +# types-aiobotocore-sso-admin + +# types-aiobotocore-sso-oidc + +# types-aiobotocore-stepfunctions + +# types-aiobotocore-storagegateway + +# types-aiobotocore-sts + +# types-aiobotocore-support + +# types-aiobotocore-support-app + +# types-aiobotocore-swf + +# types-aiobotocore-synthetics + +# types-aiobotocore-textract + +# types-aiobotocore-timestream-query + +# types-aiobotocore-timestream-write + +# types-aiobotocore-tnb + +# types-aiobotocore-transcribe + +# types-aiobotocore-transfer + +# types-aiobotocore-translate + +# types-aiobotocore-verifiedpermissions + +# types-aiobotocore-voice-id + +# types-aiobotocore-vpc-lattice + +# types-aiobotocore-waf + +# types-aiobotocore-waf-regional + +# types-aiobotocore-wafv2 + +# types-aiobotocore-wellarchitected + +# types-aiobotocore-wisdom + +# types-aiobotocore-workdocs + +# types-aiobotocore-worklink + +# types-aiobotocore-workmail + +# types-aiobotocore-workmailmessageflow + +# types-aiobotocore-workspaces + +# types-aiobotocore-workspaces-web + +# types-aiobotocore-xray + +# ; + +# types-appdirs = callPackage ./python-modules/types-appdirs { }; + +# types-awscrt = callPackage ./python-modules/types-awscrt { }; + +# types-beautifulsoup4 = callPackage ./python-modules/types-beautifulsoup4 { }; + +# types-click = callPackage ./python-modules/types-click { }; + +# types-colorama = callPackage ./python-modules/types-colorama { }; + +# types-dataclasses = callPackage ./python-modules/types-dataclasses { }; + +# types-dateutil = callPackage ./python-modules/types-dateutil { }; + +# types-decorator = callPackage ./python-modules/types-decorator { }; + +# types-deprecated = callPackage ./python-modules/types-deprecated { }; + +# types-docopt = callPackage ./python-modules/types-docopt { }; + +# types-docutils = callPackage ./python-modules/types-docutils { }; + +# types-enum34 = callPackage ./python-modules/types-enum34 { }; + +# types-freezegun = callPackage ./python-modules/types-freezegun { }; + +# types-futures = callPackage ./python-modules/types-futures { }; + +# types-html5lib = callPackage ./python-modules/types-html5lib { }; + +# types-ipaddress = callPackage ./python-modules/types-ipaddress { }; + +# types-lxml = callPackage ./python-modules/types-lxml { }; + +# types-markdown = callPackage ./python-modules/types-markdown { }; + +# types-mock = callPackage ./python-modules/types-mock { }; + +# types-pillow = callPackage ./python-modules/types-pillow { }; + +# types-protobuf = callPackage ./python-modules/types-protobuf { }; + +# types-psutil = callPackage ./python-modules/types-psutil { }; + +# types-psycopg2 = callPackage ./python-modules/types-psycopg2 { }; + +# types-pyopenssl = callPackage ./python-modules/types-pyopenssl { }; + +# types-python-dateutil = callPackage ./python-modules/types-python-dateutil { }; + +# types-pytz = callPackage ./python-modules/types-pytz { }; + +# types-pyyaml = callPackage ./python-modules/types-pyyaml { }; + +# types-redis = callPackage ./python-modules/types-redis { }; + +# types-retry = callPackage ./python-modules/types-retry { }; + +# types-requests = callPackage ./python-modules/types-requests { }; + +# types-s3transfer = callPackage ./python-modules/types-s3transfer { }; + +# types-setuptools = callPackage ./python-modules/types-setuptools { }; + +# types-tabulate = callPackage ./python-modules/types-tabulate { }; + +# types-toml = callPackage ./python-modules/types-toml { }; + +# types-tqdm = callPackage ./python-modules/types-tqdm { }; + +# types-typed-ast = callPackage ./python-modules/types-typed-ast { }; + +# types-ujson = callPackage ./python-modules/types-ujson { }; + +# types-urllib3 = callPackage ./python-modules/types-urllib3 { }; + +# typesentry = callPackage ./python-modules/typesentry { }; + +# typeshed-client = callPackage ./python-modules/typeshed-client { }; + +# typesystem = callPackage ./python-modules/typesystem { }; + +# typical = callPackage ./python-modules/typical { }; + +# typing = null; + + typing-extensions = callPackage ./python-modules/typing-extensions { }; + +# typing-inspect = callPackage ./python-modules/typing-inspect { }; + +# typing-validation = callPackage ./python-modules/typing-validation { }; + +# typish = callPackage ./python-modules/typish { }; + +# typogrify = callPackage ./python-modules/typogrify { }; + +# tzdata = callPackage ./python-modules/tzdata { }; + +# tzlocal = callPackage ./python-modules/tzlocal { }; + +# rustworkx = callPackage ./python-modules/rustworkx { }; + +# uamqp = callPackage ./python-modules/uamqp { +# inherit (pkgs.darwin.apple_sdk.frameworks) CFNetwork CoreFoundation Security; +# }; + +# ua-parser = callPackage ./python-modules/ua-parser { }; + +# uarray = callPackage ./python-modules/uarray { }; + +# uart-devices = callPackage ./python-modules/uart-devices { }; + +# uasiren = callPackage ./python-modules/uasiren { }; + +# ubelt = callPackage ./python-modules/ubelt { }; + +# uc-micro-py = callPackage ./python-modules/uc-micro-py { }; + +# ucsmsdk = callPackage ./python-modules/ucsmsdk { }; + +# udatetime = callPackage ./python-modules/udatetime { }; + +# ueberzug = callPackage ./python-modules/ueberzug { +# inherit (pkgs.xorg) libX11 libXext; +# }; + +# ufmt = callPackage ./python-modules/ufmt { }; + +# ufo2ft = callPackage ./python-modules/ufo2ft { }; + +# ufolib2 = callPackage ./python-modules/ufolib2 { }; + +# ufolint = callPackage ./python-modules/ufolint { }; + +# ufonormalizer = callPackage ./python-modules/ufonormalizer { }; + +# ufoprocessor = callPackage ./python-modules/ufoprocessor { }; + +# ueagle = callPackage ./python-modules/ueagle { }; + +# uharfbuzz = callPackage ./python-modules/uharfbuzz { +# inherit (pkgs.darwin.apple_sdk.frameworks) ApplicationServices; +# }; + +# uhi = callPackage ./python-modules/uhi { }; + +# ujson = callPackage ./python-modules/ujson { }; + +# ukkonen = callPackage ./python-modules/ukkonen { }; + +# ukpostcodeparser = callPackage ./python-modules/ukpostcodeparser { }; + +# ulid-transform = callPackage ./python-modules/ulid-transform { }; + +# ultraheat-api = callPackage ./python-modules/ultraheat-api { }; + +# umalqurra = callPackage ./python-modules/umalqurra { }; + +# umap-learn = callPackage ./python-modules/umap-learn { }; + +# umodbus = callPackage ./python-modules/umodbus { }; + +# u-msgpack-python = callPackage ./python-modules/u-msgpack-python { }; + +# unasync = callPackage ./python-modules/unasync { }; + +# uncertainties = callPackage ./python-modules/uncertainties { }; + +# uncompyle6 = callPackage ./python-modules/uncompyle6 { }; + +# undefined = callPackage ./python-modules/undefined { }; + +# unearth = callPackage ./python-modules/unearth { }; + +# unicodecsv = callPackage ./python-modules/unicodecsv { }; + +# unicodedata2 = callPackage ./python-modules/unicodedata2 { }; + +# unicode-rbnf = callPackage ./python-modules/unicode-rbnf { }; + +# unicode-slugify = callPackage ./python-modules/unicode-slugify { }; + +# unicorn = callPackage ./python-modules/unicorn { +# unicorn-emu = pkgs.unicorn; +# }; + +# unicurses = callPackage ./python-modules/unicurses { }; + +# unicrypto = callPackage ./python-modules/unicrypto { }; + +# unidata-blocks = callPackage ./python-modules/unidata-blocks { }; + +# unidecode = callPackage ./python-modules/unidecode { }; + +# unidic = callPackage ./python-modules/unidic { }; + +# unidic-lite = callPackage ./python-modules/unidic-lite { }; + +# unidiff = callPackage ./python-modules/unidiff { }; + +# unifi = callPackage ./python-modules/unifi { }; + +# unifi-discovery = callPackage ./python-modules/unifi-discovery { }; + +# unify = callPackage ./python-modules/unify { }; + +# unifiled = callPackage ./python-modules/unifiled { }; + +# unique-log-filter = callPackage ./python-modules/unique-log-filter { }; + +# unittest-data-provider = callPackage ./python-modules/unittest-data-provider { }; + +# unittest-xml-reporting = callPackage ./python-modules/unittest-xml-reporting { }; + +# univers = callPackage ./python-modules/univers { }; + +# universal-pathlib = callPackage ./python-modules/universal-pathlib { }; + +# universal-silabs-flasher = callPackage ./python-modules/universal-silabs-flasher { }; + +# unix-ar = callPackage ./python-modules/unix-ar { }; + +# unpaddedbase64 = callPackage ./python-modules/unpaddedbase64 { }; + +# unrardll = callPackage ./python-modules/unrardll { }; + +# unrpa = callPackage ./python-modules/unrpa { }; + +# unstructured = callPackage ./python-modules/unstructured { }; + +# unstructured-api-tools = callPackage ./python-modules/unstructured-api-tools { }; + +# unstructured-inference = callPackage ./python-modules/unstructured-inference { }; + +# untangle = callPackage ./python-modules/untangle { }; + +# untokenize = callPackage ./python-modules/untokenize { }; + +# uonet-request-signer-hebe = callPackage ./python-modules/uonet-request-signer-hebe { }; + +# upass = callPackage ./python-modules/upass { }; + +# upb-lib = callPackage ./python-modules/upb-lib { }; + +# upcloud-api = callPackage ./python-modules/upcloud-api { }; + +# update-checker = callPackage ./python-modules/update-checker { }; + +# update-copyright = callPackage ./python-modules/update-copyright { }; + +# update-dotdee = callPackage ./python-modules/update-dotdee { }; + +# uplc = callPackage ./python-modules/uplc { }; + +# upnpy = callPackage ./python-modules/upnpy { }; + +# uproot = callPackage ./python-modules/uproot { }; + +# uptime = callPackage ./python-modules/uptime { }; + +# uptime-kuma-api = callPackage ./python-modules/uptime-kuma-api { }; + +# uptime-kuma-monitor = callPackage ./python-modules/uptime-kuma-monitor { }; + +# uqbar = callPackage ./python-modules/uqbar { }; + +# uranium = callPackage ./python-modules/uranium { }; + +# uritemplate = callPackage ./python-modules/uritemplate { }; + +# uri-template = callPackage ./python-modules/uri-template { }; + +# uritools = callPackage ./python-modules/uritools { }; + +# url-normalize = callPackage ./python-modules/url-normalize { }; + +# urlextract = callPackage ./python-modules/urlextract { }; + +# urlgrabber = callPackage ./python-modules/urlgrabber { }; + + urllib3 = callPackage ./python-modules/urllib3 { }; + +# urlman = callPackage ./python-modules/urlman { }; + +# urlpy = callPackage ./python-modules/urlpy { }; + +# urwid = callPackage ./python-modules/urwid { }; + +# urwidgets = callPackage ./python-modules/urwidgets { }; + +# urwidtrees = callPackage ./python-modules/urwidtrees { }; + +# urwid-readline = callPackage ./python-modules/urwid-readline { }; + +# urwid-mitmproxy = callPackage ./python-modules/urwid-mitmproxy { }; + +# usb-devices = callPackage ./python-modules/usb-devices { }; + +# usbrelay-py = callPackage ../os-specific/linux/usbrelay/python.nix { }; + +# usbtmc = callPackage ./python-modules/usbtmc { }; + +# us = callPackage ./python-modules/us { }; + +# user-agents = callPackage ./python-modules/user-agents { }; + +# userpath = callPackage ./python-modules/userpath { }; + +# ush = callPackage ./python-modules/ush { }; + +# usort = callPackage ./python-modules/usort { }; + +# utils = callPackage ./python-modules/utils { }; + +# uvcclient = callPackage ./python-modules/uvcclient { }; + +# uvicorn = callPackage ./python-modules/uvicorn { }; + +# uvloop = callPackage ./python-modules/uvloop { +# inherit (pkgs.darwin.apple_sdk.frameworks) ApplicationServices CoreServices; +# }; + +# vaa = callPackage ./python-modules/vaa { }; + +# vacuum-map-parser-base = callPackage ./python-modules/vacuum-map-parser-base { }; + +# vacuum-map-parser-roborock = callPackage ./python-modules/vacuum-map-parser-roborock { }; + +# validate-email = callPackage ./python-modules/validate-email { }; + +# validator-collection = callPackage ./python-modules/validator-collection { }; + +# validators = callPackage ./python-modules/validators { }; + +# validobj = callPackage ./python-modules/validobj { }; + +# validphys2 = callPackage ./python-modules/validphys2 { }; + +# vallox-websocket-api = callPackage ./python-modules/vallox-websocket-api { }; + +# vapoursynth = callPackage ./python-modules/vapoursynth { +# inherit (pkgs) vapoursynth; +# }; + +# variants = callPackage ./python-modules/variants { }; + +# varint = callPackage ./python-modules/varint { }; + +# vat-moss = callPackage ./python-modules/vat-moss { }; + +# vcard = callPackage ./python-modules/vcard { }; + +# vcrpy = callPackage ./python-modules/vcrpy { }; + +# vcver = callPackage ./python-modules/vcver { }; + +# vcversioner = callPackage ./python-modules/vcversioner { }; + +# vdf = callPackage ./python-modules/vdf { }; + +# vdirsyncer = callPackage ./python-modules/vdirsyncer { }; + +# vector = callPackage ./python-modules/vector { }; + +# vehicle = callPackage ./python-modules/vehicle { }; + +# vega = callPackage ./python-modules/vega { }; + +# vega-datasets = callPackage ./python-modules/vega-datasets { }; + +# venstarcolortouch = callPackage ./python-modules/venstarcolortouch { }; + +# venusian = callPackage ./python-modules/venusian { }; + +# velbus-aio = callPackage ./python-modules/velbus-aio { }; + +# verboselogs = callPackage ./python-modules/verboselogs { }; + +# verlib2 = callPackage ./python-modules/verlib2 { }; + +# versioneer = callPackage ./python-modules/versioneer { }; + +# versionfinder = callPackage ./python-modules/versionfinder { }; + +# versioningit = callPackage ./python-modules/versioningit { }; + +# versiontag = callPackage ./python-modules/versiontag { }; + +# versiontools = callPackage ./python-modules/versiontools { }; + +# verspec = callPackage ./python-modules/verspec { }; + +# vertica-python = callPackage ./python-modules/vertica-python { }; + +# veryprettytable = callPackage ./python-modules/veryprettytable { }; + +# vg = callPackage ./python-modules/vg { }; + +# vharfbuzz = callPackage ./python-modules/vharfbuzz { }; + +# videocr = callPackage ./python-modules/videocr { }; + +# vidstab = callPackage ./python-modules/vidstab { }; + +# viennarna = toPythonModule pkgs.viennarna; + +# viewstate = callPackage ./python-modules/viewstate { }; + +# vilfo-api-client = callPackage ./python-modules/vilfo-api-client { }; + +# vina = callPackage ../applications/science/chemistry/autodock-vina/python-bindings.nix { }; + +# vincenty = callPackage ./python-modules/vincenty { }; + +# vine = callPackage ./python-modules/vine { }; + +# virt-firmware = callPackage ./python-modules/virt-firmware { }; + +# virtkey = callPackage ./python-modules/virtkey { }; + + virtualenv = callPackage ./python-modules/virtualenv { }; + +# virtualenv-clone = callPackage ./python-modules/virtualenv-clone { }; + +# virtualenvwrapper = callPackage ./python-modules/virtualenvwrapper { }; + +# visitor = callPackage ./python-modules/visitor { }; + +# vispy = callPackage ./python-modules/vispy { }; + +# vivisect = callPackage ./python-modules/vivisect { +# inherit (pkgs.libsForQt5) wrapQtAppsHook; +# }; + +# viv-utils = callPackage ./python-modules/viv-utils { }; + +# vllm = callPackage ./python-modules/vllm { }; + +# vmprof = callPackage ./python-modules/vmprof { }; + +# vncdo = callPackage ./python-modules/vncdo { }; + +# vobject = callPackage ./python-modules/vobject { }; + +# volatile = callPackage ./python-modules/volatile { }; + +# volkszaehler = callPackage ./python-modules/volkszaehler { }; + +# voluptuous = callPackage ./python-modules/voluptuous { }; + +# voluptuous-serialize = callPackage ./python-modules/voluptuous-serialize { }; + +# voluptuous-stubs = callPackage ./python-modules/voluptuous-stubs { }; + +# volvooncall = callPackage ./python-modules/volvooncall { }; + +# vowpalwabbit = callPackage ./python-modules/vowpalwabbit { }; + +# vpk = callPackage ./python-modules/vpk { }; + +# vprof = callPackage ./python-modules/vprof { }; + +# vqgan-jax = callPackage ./python-modules/vqgan-jax { }; + +# vsts = callPackage ./python-modules/vsts { }; + +# vsts-cd-manager = callPackage ./python-modules/vsts-cd-manager { }; + +# vsure = callPackage ./python-modules/vsure { }; + +# vt-py = callPackage ./python-modules/vt-py { }; + +# vtjp = callPackage ./python-modules/vtjp { }; + +# vtk = toPythonModule (pkgs.vtk_9.override { +# inherit python; +# enablePython = true; +# }); + +# vulcan-api = callPackage ./python-modules/vulcan-api { }; + +# vultr = callPackage ./python-modules/vultr { }; + +# vulture = callPackage ./python-modules/vulture { }; + +# vxi11 = callPackage ./python-modules/vxi11 { }; + +# vyper = callPackage ../development/compilers/vyper { }; + +# w1thermsensor = callPackage ./python-modules/w1thermsensor { }; + +# w3lib = callPackage ./python-modules/w3lib { }; + +# wadllib = callPackage ./python-modules/wadllib { }; + +# wagtail = callPackage ./python-modules/wagtail { }; + +# wagtail-factories = callPackage ./python-modules/wagtail-factories { }; + +# wagtail-localize = callPackage ./python-modules/wagtail-localize { }; + +# wagtail-modeladmin = callPackage ./python-modules/wagtail-modeladmin { }; + +# waitress = callPackage ./python-modules/waitress { }; + +# waitress-django = callPackage ./python-modules/waitress-django { }; + +# wakeonlan = callPackage ./python-modules/wakeonlan { }; + +# wallbox = callPackage ./python-modules/wallbox { }; + +# wallet-py3k = callPackage ./python-modules/wallet-py3k { }; + +# walrus = callPackage ./python-modules/walrus { }; + +# wand = callPackage ./python-modules/wand { }; + +# wandb = callPackage ./python-modules/wandb { }; + +# warble = callPackage ./python-modules/warble { }; + +# warcio = callPackage ./python-modules/warcio { }; + +# ward = callPackage ./python-modules/ward { }; + +# warlock = callPackage ./python-modules/warlock { }; + +# warrant = callPackage ./python-modules/warrant { }; + +# warrant-lite = callPackage ./python-modules/warrant-lite { }; + +# waqiasync = callPackage ./python-modules/waqiasync { }; + +# wasabi = callPackage ./python-modules/wasabi { }; + +# wasserstein = callPackage ./python-modules/wasserstein { }; + +# wasmerPackages = pkgs.recurseIntoAttrs (callPackage ./python-modules/wasmer { }); +# inherit (self.wasmerPackages) wasmer wasmer-compiler-cranelift wasmer-compiler-llvm wasmer-compiler-singlepass; + +# watchdog = callPackage ./python-modules/watchdog { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreServices; +# }; + +# watchdog-gevent = callPackage ./python-modules/watchdog-gevent { }; + +# watchfiles = callPackage ./python-modules/watchfiles { +# inherit (pkgs.darwin.apple_sdk.frameworks) CoreServices; +# }; + +# watchgod = callPackage ./python-modules/watchgod { }; + +# waterfurnace = callPackage ./python-modules/waterfurnace { }; + +# watermark = callPackage ./python-modules/watermark { }; + +# wavedrom = callPackage ./python-modules/wavedrom { }; + +# wavefile = callPackage ./python-modules/wavefile { }; + +# wavinsentio = callPackage ./python-modules/wavinsentio { }; + +# wazeroutecalculator = callPackage ./python-modules/wazeroutecalculator { }; + + wcag-contrast-ratio = callPackage ./python-modules/wcag-contrast-ratio { }; + +# wcmatch = callPackage ./python-modules/wcmatch { }; + +# wcwidth = callPackage ./python-modules/wcwidth { }; + +# weasel = callPackage ./python-modules/weasel { }; + +# weasyprint = callPackage ./python-modules/weasyprint { }; + +# weaviate-client = callPackage ./python-modules/weaviate-client { }; + +# web3 = callPackage ./python-modules/web3 { }; + +# webargs = callPackage ./python-modules/webargs { }; + +# webassets = callPackage ./python-modules/webassets { }; + +# webauthn = callPackage ./python-modules/webauthn { }; + +# web = callPackage ./python-modules/web { }; + +# web-cache = callPackage ./python-modules/web-cache { }; + +# webcolors = callPackage ./python-modules/webcolors { }; + +# webdataset = callPackage ./python-modules/webdataset { }; + +# webdav4 = callPackage ./python-modules/webdav4 { }; + +# webdavclient3 = callPackage ./python-modules/webdavclient3 { }; + +# webdriver-manager = callPackage ./python-modules/webdriver-manager { }; + + webencodings = callPackage ./python-modules/webencodings { }; + +# webexteamssdk = callPackage ./python-modules/webexteamssdk { }; + +# webhelpers = callPackage ./python-modules/webhelpers { }; + +# webob = callPackage ./python-modules/webob { }; + +# weboob = callPackage ./python-modules/weboob { }; + +# webrtc-noise-gain = callPackage ./python-modules/webrtc-noise-gain { }; + +# webrtcvad = callPackage ./python-modules/webrtcvad { }; + +# websocket-client = callPackage ./python-modules/websocket-client { }; + +# websockets = callPackage ./python-modules/websockets { }; + +# websockify = callPackage ./python-modules/websockify { }; + +# webssh = callPackage ./python-modules/webssh { }; + +# webtest = callPackage ./python-modules/webtest { }; + +# webtest-aiohttp = callPackage ./python-modules/webtest-aiohttp { }; + +# webthing = callPackage ./python-modules/webthing { }; + +# webthing-ws = callPackage ./python-modules/webthing-ws { }; + +# weconnect = callPackage ./python-modules/weconnect { }; + +# weconnect-mqtt = callPackage ./python-modules/weconnect-mqtt { }; + +# werkzeug = callPackage ./python-modules/werkzeug { }; + +# west = callPackage ./python-modules/west { }; + +# wfuzz = callPackage ./python-modules/wfuzz { }; + +# wget = callPackage ./python-modules/wget { }; + +# whatthepatch = callPackage ./python-modules/whatthepatch { }; + + wheel = callPackage ./python-modules/wheel { }; + +# wheel-filename = callPackage ./python-modules/wheel-filename { }; + +# wheel-inspect = callPackage ./python-modules/wheel-inspect { }; + +# wheezy-captcha = callPackage ./python-modules/wheezy-captcha { }; + +# wheezy-template = callPackage ./python-modules/wheezy-template { }; + +# whenever = callPackage ./python-modules/whenever { }; + +# whichcraft = callPackage ./python-modules/whichcraft { }; + +# whirlpool-sixth-sense = callPackage ./python-modules/whirlpool-sixth-sense { }; + +# whisper = callPackage ./python-modules/whisper { }; + +# whispers = callPackage ./python-modules/whispers { }; + +# whitenoise = callPackage ./python-modules/whitenoise { }; + +# whodap = callPackage ./python-modules/whodap { }; + +# whois = callPackage ./python-modules/whois { }; + +# whois-api = callPackage ./python-modules/whois-api { }; + +# whoisdomain = callPackage ./python-modules/whoisdomain { }; + +# whoosh = callPackage ./python-modules/whoosh { }; + +# widgetsnbextension = callPackage ./python-modules/widgetsnbextension { }; + +# widlparser = callPackage ./python-modules/widlparser { }; + +# wiffi = callPackage ./python-modules/wiffi { }; + +# wifi = callPackage ./python-modules/wifi { }; + +# wikipedia = callPackage ./python-modules/wikipedia { }; + +# wikipedia2vec = callPackage ./python-modules/wikipedia2vec { }; + +# wikipedia-api = callPackage ./python-modules/wikipedia-api { }; + +# wikitextparser = callPackage ./python-modules/wikitextparser { }; + +# willow = callPackage ./python-modules/willow { }; + +# winacl = callPackage ./python-modules/winacl { }; + +# winsspi = callPackage ./python-modules/winsspi { }; + +# withings-api = callPackage ./python-modules/withings-api { }; + +# withings-sync = callPackage ./python-modules/withings-sync { }; + +# wktutils = callPackage ./python-modules/wktutils { }; + +# wled = callPackage ./python-modules/wled { }; + +# wn = callPackage ./python-modules/wn { }; + +# woob = callPackage ./python-modules/woob { }; + +# woodblock = callPackage ./python-modules/woodblock { }; + +# wordcloud = callPackage ./python-modules/wordcloud { }; + +# wordfreq = callPackage ./python-modules/wordfreq { }; + +# worldengine = callPackage ./python-modules/worldengine { }; + +# wrapio = callPackage ./python-modules/wrapio { }; + +# wrapt = callPackage ./python-modules/wrapt { }; + +# wrf-python = callPackage ./python-modules/wrf-python { }; + +# ws4py = callPackage ./python-modules/ws4py { }; + +# wsdiscovery = callPackage ./python-modules/wsdiscovery { }; + +# wsgi-intercept = callPackage ./python-modules/wsgi-intercept { }; + +# wsgidav = callPackage ./python-modules/wsgidav { }; + +# wsgiprox = callPackage ./python-modules/wsgiprox { }; + +# wsgiproxy2 = callPackage ./python-modules/wsgiproxy2 { }; + +# wsgitools = callPackage ./python-modules/wsgitools { }; + +# wsme = callPackage ./python-modules/wsme { }; + +# wsnsimpy = callPackage ./python-modules/wsnsimpy { }; + +# wsproto = callPackage ./python-modules/wsproto { }; + +# wtforms = callPackage ./python-modules/wtforms { }; + +# wtforms-bootstrap5 = callPackage ./python-modules/wtforms-bootstrap5 { }; + +# wunsen = callPackage ./python-modules/wunsen { }; + +# wtf-peewee = callPackage ./python-modules/wtf-peewee { }; + +# wurlitzer = callPackage ./python-modules/wurlitzer { }; + +# wxpython = callPackage ./python-modules/wxpython/4.2.nix { +# wxGTK = pkgs.wxGTK32.override { +# withWebKit = true; +# }; +# inherit (pkgs) mesa; +# }; + +# wyoming = callPackage ./python-modules/wyoming { }; + +# x-wr-timezone = callPackage ./python-modules/x-wr-timezone { }; + +# x11-hash = callPackage ./python-modules/x11-hash { }; + +# x256 = callPackage ./python-modules/x256 { }; + +# xapian = callPackage ./python-modules/xapian { +# inherit (pkgs) xapian; +# }; + +# xapp = callPackage ./python-modules/xapp { +# inherit (pkgs.buildPackages) meson; +# inherit (pkgs) gtk3 gobject-introspection polkit; +# inherit (pkgs.cinnamon) xapp; +# }; + +# xarray = callPackage ./python-modules/xarray { }; + +# xarray-dataclasses = callPackage ./python-modules/xarray-dataclasses { }; + +# xarray-einstats = callPackage ./python-modules/xarray-einstats { }; + +# xattr = callPackage ./python-modules/xattr { }; + +# xbox-webapi = callPackage ./python-modules/xbox-webapi { }; + +# xboxapi = callPackage ./python-modules/xboxapi { }; + +# xcffib = callPackage ./python-modules/xcffib { }; + +# xdg = callPackage ./python-modules/xdg { }; + +# xdg-base-dirs = callPackage ./python-modules/xdg-base-dirs { }; + +# xdis = callPackage ./python-modules/xdis { }; + +# xdoctest = callPackage ./python-modules/xdoctest { }; + +# xdot = callPackage ./python-modules/xdot { +# inherit (pkgs) graphviz; +# }; + +# xformers = callPackage ./python-modules/xformers { }; + +# xgboost = callPackage ./python-modules/xgboost { +# inherit (pkgs) xgboost; +# }; + +# xhtml2pdf = callPackage ./python-modules/xhtml2pdf { }; + +# xiaomi-ble = callPackage ./python-modules/xiaomi-ble { }; + +# xkbcommon = callPackage ./python-modules/xkbcommon { }; + +# xkcdpass = callPackage ./python-modules/xkcdpass { }; + +# xknx = callPackage ./python-modules/xknx { }; + +# xknxproject = callPackage ./python-modules/xknxproject { }; + +# xlib = callPackage ./python-modules/xlib { }; + +# xlrd = callPackage ./python-modules/xlrd { }; + +# xlsx2csv = callPackage ./python-modules/xlsx2csv { }; + +# xlsxwriter = callPackage ./python-modules/xlsxwriter { }; + +# xlwt = callPackage ./python-modules/xlwt { }; + +# xmind = callPackage ./python-modules/xmind { }; + +# xml2rfc = callPackage ./python-modules/xml2rfc { }; + +# xmldiff = callPackage ./python-modules/xmldiff { }; + +# xmljson = callPackage ./python-modules/xmljson { }; + + xmlschema = callPackage ./python-modules/xmlschema { }; + +# xmlsec = callPackage ./python-modules/xmlsec { +# inherit (pkgs) libxslt libxml2 libtool pkg-config xmlsec; +# }; + +# xmltodict = callPackage ./python-modules/xmltodict { }; + +# xml-marshaller = callPackage ./python-modules/xml-marshaller { }; + +# xmod = callPackage ./python-modules/xmod { }; + +# xmodem = callPackage ./python-modules/xmodem { }; + +# xnatpy = callPackage ./python-modules/xnatpy { }; + +# xnd = callPackage ./python-modules/xnd { }; + +# xpath-expressions = callPackage ./python-modules/xpath-expressions { }; + +# xpybutil = callPackage ./python-modules/xpybutil { }; + +# xrootd = callPackage ./python-modules/xrootd { +# inherit (pkgs) xrootd; +# }; + +# xsdata = callPackage ./python-modules/xsdata { }; + +# xstatic-asciinema-player = callPackage ./python-modules/xstatic-asciinema-player { }; + +# xstatic-bootbox = callPackage ./python-modules/xstatic-bootbox { }; + +# xstatic-bootstrap = callPackage ./python-modules/xstatic-bootstrap { }; + +# xstatic = callPackage ./python-modules/xstatic { }; + +# xstatic-font-awesome = callPackage ./python-modules/xstatic-font-awesome { }; + +# xstatic-jquery = callPackage ./python-modules/xstatic-jquery { }; + +# xstatic-jquery-file-upload = callPackage ./python-modules/xstatic-jquery-file-upload { }; + +# xstatic-jquery-ui = callPackage ./python-modules/xstatic-jquery-ui { }; + +# xstatic-pygments = callPackage ./python-modules/xstatic-pygments { }; + +# xtensor-python = callPackage ./python-modules/xtensor-python { }; + +# xvfbwrapper = callPackage ./python-modules/xvfbwrapper { +# inherit (pkgs.xorg) xorgserver; +# }; + +# xxhash = callPackage ./python-modules/xxhash { }; + +# xdxf2html = callPackage ./python-modules/xdxf2html { }; + +# xyzservices = callPackage ./python-modules/xyzservices { }; + +# y-py = callPackage ./python-modules/y-py { }; + +# yabadaba = callPackage ./python-modules/yabadaba { }; + +# yahooweather = callPackage ./python-modules/yahooweather { }; + +# yalesmartalarmclient = callPackage ./python-modules/yalesmartalarmclient { }; + +# yalexs = callPackage ./python-modules/yalexs { }; + +# yalexs-ble = callPackage ./python-modules/yalexs-ble { }; + +# yamale = callPackage ./python-modules/yamale { }; + +# yamlfix = callPackage ./python-modules/yamlfix { }; + +# yamllint = callPackage ./python-modules/yamllint { }; + +# yamlloader = callPackage ./python-modules/yamlloader { }; + +# yamlordereddictloader = callPackage ./python-modules/yamlordereddictloader { }; + +# yanc = callPackage ./python-modules/yanc { }; + +# yangson = callPackage ./python-modules/yangson { }; + +# yapf = callPackage ./python-modules/yapf { }; + +# yappi = callPackage ./python-modules/yappi { }; + +# yapsy = callPackage ./python-modules/yapsy { }; + +# yara-python = callPackage ./python-modules/yara-python { }; + +# yaramod = callPackage ./python-modules/yaramod { }; + +# yarg = callPackage ./python-modules/yarg { }; + +# yargy = callPackage ./python-modules/yargy { }; + +# yark = callPackage ./python-modules/yark { }; + +# yarl = callPackage ./python-modules/yarl { }; + +# yasi = callPackage ./python-modules/yasi { }; + +# yaspin = callPackage ./python-modules/yaspin { }; + +# yaswfp = callPackage ./python-modules/yaswfp { }; + +# yattag = callPackage ./python-modules/yattag { }; + +# yacs = callPackage ./python-modules/yacs { }; + +# ydiff = callPackage ./python-modules/ydiff { }; + +# yeelight = callPackage ./python-modules/yeelight { }; + +# yfinance = callPackage ./python-modules/yfinance { }; + +# yoda = toPythonModule (pkgs.yoda.override { inherit python; }); + +# yolink-api = callPackage ./python-modules/yolink-api { }; + +# yosys = toPythonModule (pkgs.yosys.override { +# python3 = python; +# }); + +# youless-api = callPackage ./python-modules/youless-api { }; + +# youseedee = callPackage ./python-modules/youseedee { }; + +# youtokentome = callPackage ./python-modules/youtokentome { }; + +# youtube-dl = callPackage ../tools/misc/youtube-dl { }; + +# youtube-dl-light = callPackage ../tools/misc/youtube-dl { +# ffmpegSupport = false; +# }; + +# youtubeaio = callPackage ./python-modules/youtubeaio { }; + +# yoyo-migrations = callPackage ./python-modules/yoyo-migrations { }; + +# yt-dlp = callPackage ../tools/misc/yt-dlp { +# ffmpeg = pkgs.ffmpeg-headless; +# }; + +# yt-dlp-light = callPackage ../tools/misc/yt-dlp { +# atomicparsleySupport = false; +# ffmpegSupport = false; +# rtmpSupport = false; +# }; + +# youtube-search = callPackage ./python-modules/youtube-search { }; + +# youtube-search-python = callPackage ./python-modules/youtube-search-python { }; + +# youtube-transcript-api = callPackage ./python-modules/youtube-transcript-api { }; + +# yowsup = callPackage ./python-modules/yowsup { }; + +# ypy-websocket = callPackage ./python-modules/ypy-websocket { }; + +# yq = callPackage ./python-modules/yq { +# inherit (pkgs) jq; +# }; + +# yte = callPackage ./python-modules/yte { }; + +# ytmusicapi = callPackage ./python-modules/ytmusicapi { }; + +# yubico = callPackage ./python-modules/yubico { }; + +# yubico-client = callPackage ./python-modules/yubico-client { }; + +# z3c-checkversions = callPackage ./python-modules/z3c-checkversions { }; + +# z3-solver = (toPythonModule ((pkgs.z3.override { +# inherit python; +# }).overrideAttrs (_: { +# pname = "z3-solver"; +# }))).python; + +# zadnegoale = callPackage ./python-modules/zadnegoale { }; + +# zamg = callPackage ./python-modules/zamg { }; + +# zarr = callPackage ./python-modules/zarr { }; + +# zc-buildout = callPackage ./python-modules/buildout { }; + +# zc-lockfile = callPackage ./python-modules/zc-lockfile { }; + +# zcbor = callPackage ./python-modules/zcbor { }; + +# zconfig = callPackage ./python-modules/zconfig { }; + +# zcs = callPackage ./python-modules/zcs { }; + +# zdaemon = callPackage ./python-modules/zdaemon { }; + +# zeek = (toPythonModule (pkgs.zeek.broker.override { +# python3 = python; +# })).py; + +# zeep = callPackage ./python-modules/zeep { }; + +# zeitgeist = (toPythonModule (pkgs.zeitgeist.override { +# python3 = python; +# })).py; + +# zephyr-python-api = callPackage ./python-modules/zephyr-python-api { }; + +# zeroc-ice = callPackage ./python-modules/zeroc-ice { }; + +# zeroconf = callPackage ./python-modules/zeroconf { }; + +# zerorpc = callPackage ./python-modules/zerorpc { }; + +# zetup = callPackage ./python-modules/zetup { }; + +# zeversolarlocal = callPackage ./python-modules/zeversolarlocal { }; + +# zfec = callPackage ./python-modules/zfec { }; + +# zha = callPackage ./python-modules/zha { }; + +# zha-quirks = callPackage ./python-modules/zha-quirks { }; + +# ziafont = callPackage ./python-modules/ziafont { }; + +# ziamath = callPackage ./python-modules/ziamath { }; + +# zict = callPackage ./python-modules/zict { }; + +# zigpy = callPackage ./python-modules/zigpy { }; + +# zigpy-cc = callPackage ./python-modules/zigpy-cc { }; + +# zigpy-deconz = callPackage ./python-modules/zigpy-deconz { }; + +# zigpy-xbee = callPackage ./python-modules/zigpy-xbee { }; + +# zigpy-zigate = callPackage ./python-modules/zigpy-zigate { }; + +# zigpy-znp = callPackage ./python-modules/zigpy-znp { }; + +# zimports = callPackage ./python-modules/zimports { }; + +# zipfile2 = callPackage ./python-modules/zipfile2 { }; + + zipp = callPackage ./python-modules/zipp { }; + +# zipstream = callPackage ./python-modules/zipstream { }; + +# zipstream-ng = callPackage ./python-modules/zipstream-ng { }; + +# zlib-ng = callPackage ./python-modules/zlib-ng { +# inherit (pkgs) zlib-ng; +# }; + +# zm-py = callPackage ./python-modules/zm-py { }; + +# zodb = callPackage ./python-modules/zodb { }; + +# zodbpickle = callPackage ./python-modules/zodbpickle { }; + +# zope-cachedescriptors = callPackage ./python-modules/zope-cachedescriptors { }; + +# zope-component = callPackage ./python-modules/zope-component { }; + +# zope-configuration = callPackage ./python-modules/zope-configuration { }; + +# zope-contenttype = callPackage ./python-modules/zope-contenttype { }; + +# zope-copy = callPackage ./python-modules/zope-copy { }; + +# zope-deferredimport = callPackage ./python-modules/zope-deferredimport { }; + +# zope-deprecation = callPackage ./python-modules/zope-deprecation { }; + +# zope-dottedname = callPackage ./python-modules/zope-dottedname { }; + + zope-event = callPackage ./python-modules/zope-event { }; + +# zope-exceptions = callPackage ./python-modules/zope-exceptions { }; + +# zope-filerepresentation = callPackage ./python-modules/zope-filerepresentation { }; + +# zope-hookable = callPackage ./python-modules/zope-hookable { }; + +# zope-i18nmessageid = callPackage ./python-modules/zope-i18nmessageid { }; + + zope-interface = callPackage ./python-modules/zope-interface { }; + +# zope-lifecycleevent = callPackage ./python-modules/zope-lifecycleevent { }; + +# zope-location = callPackage ./python-modules/zope-location { }; + +# zope-proxy = callPackage ./python-modules/zope-proxy { }; + +# zope-schema = callPackage ./python-modules/zope-schema { }; + +# zope-size = callPackage ./python-modules/zope-size { }; + +# zope-testbrowser = callPackage ./python-modules/zope-testbrowser { }; + +# zope-testing = callPackage ./python-modules/zope-testing { }; + +# zope-testrunner = callPackage ./python-modules/zope-testrunner { }; + +# zopfli = callPackage ./python-modules/zopfli { +# inherit (pkgs) zopfli; +# }; + +# zstandard = callPackage ./python-modules/zstandard { }; + +# zstd = callPackage ./python-modules/zstd { +# inherit (pkgs) zstd; +# }; + +# zulip = callPackage ./python-modules/zulip { }; + +# zwave-me-ws = callPackage ./python-modules/zwave-me-ws { }; + +# zwave-js-server-python = callPackage ./python-modules/zwave-js-server-python { }; + +# zxcvbn = callPackage ./python-modules/zxcvbn { }; + +# zxing-cpp = callPackage ./python-modules/zxing-cpp { +# libzxing-cpp = pkgs.zxing-cpp; +# }; +} diff --git a/pkgs/by-name/py/python/python2-packages.nix b/pkgs/by-name/py/python/python2-packages.nix new file mode 100644 index 0000000..fbf63a3 --- /dev/null +++ b/pkgs/by-name/py/python/python2-packages.nix @@ -0,0 +1,99 @@ +# Extension with Python 2 packages that is overlayed on top +# of the Python 3 packages set. This way, Python 2+3 compatible +# packages can still be used. + +self: super: + +with self; with super; { + # attrs = callPackage ./python2-modules/attrs { }; + + # backports-functools-lru-cache = callPackage ./python2-modules/backports-functools-lru-cache { }; + + # bootstrapped-pip = toPythonModule (callPackage ./python2-modules/bootstrapped-pip { }); + + # cffi = callPackage ./python2-modules/cffi { inherit cffi; }; + + # configparser = callPackage ./python2-modules/configparser { }; + + # contextlib2 = callPackage ./python2-modules/contextlib2 { }; + + # coverage = callPackage ./python2-modules/coverage { }; + + # enum = callPackage ./python2-modules/enum { }; + + # filelock = callPackage ./python2-modules/filelock { }; + + # futures = callPackage ./python2-modules/futures { }; + + # hypothesis = callPackage ./python2-modules/hypothesis { }; + + # importlib-metadata = callPackage ./python2-modules/importlib-metadata { }; + + # jinja2 = callPackage ./python2-modules/jinja2 { }; + + # markupsafe = callPackage ./python2-modules/markupsafe { }; + + # mock = callPackage ./python2-modules/mock { }; + + # more-itertools = callPackage ./python2-modules/more-itertools { }; + + # # ninja python stub was created to help simplify python builds using PyPA's + # # build tool in Python 3, but it does not yet support Python 2 + # ninja = pkgs.buildPackages.ninja; + + # packaging = callPackage ./python2-modules/packaging { }; + + # pip = callPackage ./python2-modules/pip { }; + + # pluggy = callPackage ./python2-modules/pluggy { }; + + # pycairo = callPackage ./python2-modules/pycairo { + # inherit (pkgs.buildPackages) meson; + # }; + + # pygobject2 = callPackage ./python2-modules/pygobject { }; + + # pygtk = callPackage ./python2-modules/pygtk { }; + + # pyparsing = callPackage ./python2-modules/pyparsing { }; + + # pytest = pytest_4; + + # pytest_4 = callPackage + # ./python2-modules/pytest { + # # hypothesis tests require pytest that causes dependency cycle + # hypothesis = self.hypothesis.override { + # doCheck = false; + # }; + # }; + + # pytest-xdist = callPackage ./python2-modules/pytest-xdist { }; + + # recoll = disabled super.recoll; + + # rivet = disabled super.rivet; + + # rpm = disabled super.rpm; + + # scandir = callPackage ./python2-modules/scandir { }; + + # setuptools = callPackage ./python2-modules/setuptools { }; + + # setuptools-scm = callPackage ./python2-modules/setuptools-scm { }; + + # typing = callPackage ./python2-modules/typing { }; + + # six = super.six.overridePythonAttrs (_: { + # doCheck = false; # circular dependency with pytest + # }); + + # wcwidth = callPackage ./python2-modules/wcwidth { + # inherit wcwidth; + # }; + + # wheel = callPackage ./python2-modules/wheel { }; + + # zeek = disabled super.zeek; + + # zipp = callPackage ./python2-modules/zipp { }; +} diff --git a/pkgs/by-name/py/python/python2/mk-python-derivation.nix b/pkgs/by-name/py/python/python2/mk-python-derivation.nix new file mode 100644 index 0000000..1a6f9c7 --- /dev/null +++ b/pkgs/by-name/py/python/python2/mk-python-derivation.nix @@ -0,0 +1,250 @@ +# Generic builder only used for EOL and deprecated Python 2. + +{ lib +, config +, python +, wrapPython +, unzip +, ensureNewerSourcesForZipFilesHook +# Whether the derivation provides a Python module or not. +, toPythonModule +, namePrefix +, update-python-libraries +, setuptools +, pipBuildHook +, pipInstallHook +, pythonCatchConflictsHook +, pythonImportsCheckHook +, pythonOutputDistHook +, pythonRemoveBinBytecodeHook +, pythonRemoveTestsDirHook +, setuptoolsBuildHook +, setuptoolsCheckHook +, wheelUnpackHook +, eggUnpackHook +, eggBuildHook +, eggInstallHook +}: + +{ name ? "${attrs.pname}-${attrs.version}" + +# Build-time dependencies for the package +, nativeBuildInputs ? [] + +# Run-time dependencies for the package +, buildInputs ? [] + +# Dependencies needed for running the checkPhase. +# These are added to buildInputs when doCheck = true. +, checkInputs ? [] +, nativeCheckInputs ? [] + +# propagate build dependencies so in case we have A -> B -> C, +# C can import package A propagated by B +, propagatedBuildInputs ? [] + +# DEPRECATED: use propagatedBuildInputs +, pythonPath ? [] + +# Enabled to detect some (native)BuildInputs mistakes +, strictDeps ? true + +, outputs ? [ "out" ] + +# used to disable derivation, useful for specific python versions +, disabled ? false + +# Raise an error if two packages are installed with the same name +# TODO: For cross we probably need a different PYTHONPATH, or not +# add the runtime deps until after buildPhase. +, catchConflicts ? (python.stdenv.hostPlatform == python.stdenv.buildPlatform) + +# Additional arguments to pass to the makeWrapper function, which wraps +# generated binaries. +, makeWrapperArgs ? [] + +# Skip wrapping of python programs altogether +, dontWrapPythonPrograms ? false + +# Don't use Pip to install a wheel +# Note this is actually a variable for the pipInstallPhase in pip's setupHook. +# It's included here to prevent an infinite recursion. +, dontUsePipInstall ? false + +# Skip setting the PYTHONNOUSERSITE environment variable in wrapped programs +, permitUserSite ? false + +# Remove bytecode from bin folder. +# When a Python script has the extension `.py`, bytecode is generated +# Typically, executables in bin have no extension, so no bytecode is generated. +# However, some packages do provide executables with extensions, and thus bytecode is generated. +, removeBinBytecode ? true + +# Several package formats are supported. +# "setuptools" : Install a common setuptools/distutils based package. This builds a wheel. +# "wheel" : Install from a pre-compiled wheel. +# "pyproject": Install a package using a ``pyproject.toml`` file (PEP517). This builds a wheel. +# "egg": Install a package from an egg. +# "other" : Provide your own buildPhase and installPhase. +, format ? "setuptools" + +, meta ? {} + +, passthru ? {} + +, doCheck ? config.doCheckByDefault or false + +, disabledTestPaths ? [] + +, ... } @ attrs: + +let + inherit (python) stdenv; + + withDistOutput = lib.elem format ["pyproject" "setuptools" "wheel"]; + + name_ = name; + + validatePythonMatches = attrName: let + isPythonModule = drv: + # all pythonModules have the pythonModule attribute + (drv ? "pythonModule") + # Some pythonModules are turned in to a pythonApplication by setting the field to false + && (!builtins.isBool drv.pythonModule); + isMismatchedPython = drv: drv.pythonModule != python; + + optionalLocation = let + pos = builtins.unsafeGetAttrPos (if attrs ? "pname" then "pname" else "name") attrs; + in lib.optionalString (pos != null) " at ${pos.file}:${toString pos.line}:${toString pos.column}"; + + leftPadName = name: against: let + len = lib.max (lib.stringLength name) (lib.stringLength against); + in lib.strings.fixedWidthString len " " name; + + throwMismatch = drv: let + myName = "'${namePrefix}${name}'"; + theirName = "'${drv.name}'"; + in throw '' + Python version mismatch in ${myName}: + + The Python derivation ${myName} depends on a Python derivation + named ${theirName}, but the two derivations use different versions + of Python: + + ${leftPadName myName theirName} uses ${python} + ${leftPadName theirName myName} uses ${toString drv.pythonModule} + + Possible solutions: + + * If ${theirName} is a Python library, change the reference to ${theirName} + in the ${attrName} of ${myName} to use a ${theirName} built from the same + version of Python + + * If ${theirName} is used as a tool during the build, move the reference to + ${theirName} in ${myName} from ${attrName} to nativeBuildInputs + + * If ${theirName} provides executables that are called at run time, pass its + bin path to makeWrapperArgs: + + makeWrapperArgs = [ "--prefix PATH : ''${lib.makeBinPath [ ${lib.getName drv } ] }" ]; + + ${optionalLocation} + ''; + + checkDrv = drv: + if (isPythonModule drv) && (isMismatchedPython drv) + then throwMismatch drv + else drv; + + in inputs: builtins.map (checkDrv) inputs; + + # Keep extra attributes from `attrs`, e.g., `patchPhase', etc. + self = toPythonModule (stdenv.mkDerivation ((builtins.removeAttrs attrs [ + "disabled" "checkPhase" "checkInputs" "nativeCheckInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts" "format" + "disabledTestPaths" "outputs" + ]) // { + + name = namePrefix + name_; + + nativeBuildInputs = [ + python + wrapPython + ensureNewerSourcesForZipFilesHook # move to wheel installer (pip) or builder (setuptools, ...)? + pythonRemoveTestsDirHook + ] ++ lib.optionals catchConflicts [ + pythonCatchConflictsHook + ] ++ lib.optionals removeBinBytecode [ + pythonRemoveBinBytecodeHook + ] ++ lib.optionals (lib.hasSuffix "zip" (attrs.src.name or "")) [ + unzip + ] ++ lib.optionals (format == "setuptools") [ + setuptoolsBuildHook + ] ++ lib.optionals (format == "pyproject") [( + pipBuildHook + )] ++ lib.optionals (format == "wheel") [ + wheelUnpackHook + ] ++ lib.optionals (format == "egg") [ + eggUnpackHook eggBuildHook eggInstallHook + ] ++ lib.optionals (format != "other") [( + pipInstallHook + )] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [ + # This is a test, however, it should be ran independent of the checkPhase and checkInputs + pythonImportsCheckHook + ] ++ lib.optionals withDistOutput [ + pythonOutputDistHook + ] ++ nativeBuildInputs; + + buildInputs = validatePythonMatches "buildInputs" (buildInputs ++ pythonPath); + + propagatedBuildInputs = validatePythonMatches "propagatedBuildInputs" (propagatedBuildInputs ++ [ + # we propagate python even for packages transformed with 'toPythonApplication' + # this pollutes the PATH but avoids rebuilds + # see https://github.com/NixOS/nixpkgs/issues/170887 for more context + python + ]); + + inherit strictDeps; + + LANG = "${if python.stdenv.isDarwin then "en_US" else "C"}.UTF-8"; + + # Python packages don't have a checkPhase, only an installCheckPhase + doCheck = false; + doInstallCheck = attrs.doCheck or true; + nativeInstallCheckInputs = [ + ] ++ lib.optionals (format == "setuptools") [ + # Longer-term we should get rid of this and require + # users of this function to set the `installCheckPhase` or + # pass in a hook that sets it. + setuptoolsCheckHook + ] ++ nativeCheckInputs; + installCheckInputs = checkInputs; + + postFixup = lib.optionalString (!dontWrapPythonPrograms) '' + wrapPythonPrograms + '' + attrs.postFixup or ""; + + # Python packages built through cross-compilation are always for the host platform. + disallowedReferences = lib.optionals (python.stdenv.hostPlatform != python.stdenv.buildPlatform) [ python.pythonOnBuildForHost ]; + + outputs = outputs ++ lib.optional withDistOutput "dist"; + + meta = { + # default to python's platforms + platforms = python.meta.platforms; + isBuildPythonPackage = python.meta.platforms; + } // meta; + } // lib.optionalAttrs (attrs?checkPhase) { + # If given use the specified checkPhase, otherwise use the setup hook. + # Longer-term we should get rid of `checkPhase` and use `installCheckPhase`. + installCheckPhase = attrs.checkPhase; + } // lib.optionalAttrs (disabledTestPaths != []) { + disabledTestPaths = lib.escapeShellArgs disabledTestPaths; + })); + + passthru.updateScript = let + filename = builtins.head (lib.splitString ":" self.meta.position); + in attrs.passthru.updateScript or [ update-python-libraries filename ]; +in lib.extendDerivation + (disabled -> throw "${name} not supported for interpreter ${python.executable}") + passthru + self diff --git a/pkgs/by-name/py/python/run_setup.py b/pkgs/by-name/py/python/run_setup.py new file mode 100644 index 0000000..e3a530e --- /dev/null +++ b/pkgs/by-name/py/python/run_setup.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +import setuptools +import tokenize + +__file__='setup.py'; + +exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec')) diff --git a/pkgs/by-name/py/python/rustpython/Cargo.lock b/pkgs/by-name/py/python/rustpython/Cargo.lock new file mode 100644 index 0000000..36335bb --- /dev/null +++ b/pkgs/by-name/py/python/rustpython/Cargo.lock @@ -0,0 +1,3467 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.8", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "atomic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static 1.4.0", + "memchr", + "regex-automata", +] + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "caseless" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808dab3318747be122cb31d36de18d4d1c81277a76f8332a02b81a3d73463d7f" +dependencies = [ + "regex", + "unicode-normalization", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "console" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +dependencies = [ + "encode_unicode", + "lazy_static 1.4.0", + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "cpython" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3052106c29da7390237bc2310c1928335733b286287754ea85e6093d2495280e" +dependencies = [ + "libc", + "num-traits", + "paste", + "python3-sys", +] + +[[package]] +name = "cranelift" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea1b0c164043c16a8ece6813eef609ac2262a32a0bb0f5ed6eecf5d7bfb79ba8" +dependencies = [ + "cranelift-codegen", + "cranelift-frontend", +] + +[[package]] +name = "cranelift-bforest" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52056f6d0584484b57fa6c1a65c1fcb15f3780d8b6a758426d9e3084169b2ddd" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fed94c8770dc25d01154c3ffa64ed0b3ba9d583736f305fed7beebe5d9cf74" +dependencies = [ + "arrayvec", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c451b81faf237d11c7e4f3165eeb6bac61112762c5cfe7b4c0fb7241474358f" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c940133198426d26128f08be2b40b0bd117b84771fd36798969c4d712d81fc" + +[[package]] +name = "cranelift-entity" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87a0f1b2fdc18776956370cf8d9b009ded3f855350c480c1c52142510961f352" + +[[package]] +name = "cranelift-frontend" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34897538b36b216cc8dd324e73263596d51b8cf610da6498322838b2546baf8a" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b2629a569fae540f16a76b70afcc87ad7decb38dc28fa6c648ac73b51e78470" + +[[package]] +name = "cranelift-jit" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625be33ce54cf906c408f5ad9d08caa6e2a09e52d05fd0bd1bd95b132bfbba73" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-module", + "cranelift-native", + "libc", + "log", + "region", + "target-lexicon", + "windows-sys 0.36.1", +] + +[[package]] +name = "cranelift-module" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883f8d42e07fd6b283941688f6c41a9e3b97fbf2b4ddcfb2756e675b86dc5edb" +dependencies = [ + "anyhow", + "cranelift-codegen", +] + +[[package]] +name = "cranelift-native" +version = "0.88.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20937dab4e14d3e225c5adfc9c7106bafd4ac669bdb43027b911ff794c6fb318" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools 0.10.5", + "lazy_static 1.4.0", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.7.1", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f40b7355f82b0a891f50e70399475945bb0b0da4f1700ce60761c9d3e359" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "cxx" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d3488e7665a7a483b57e25bdd90d0aeb2bc7608c8d0346acf2ad3f1caf1d62" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fcaf066a053a41a81dfb14d57d99738b767febb8b735c3016e469fac5da690" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ef98b8b717a829ca5603af80e1f9e2e48013ab227b68ef37872ef84ee479bf" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dns-lookup" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53ecafc952c4528d9b51a458d1a8904b81783feff9fde08ab6ed2545ff396872" +dependencies = [ + "cfg-if", + "libc", + "socket2", + "winapi", +] + +[[package]] +name = "dyn-clone" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9b0705efd4599c15a38151f4721f7bc388306f61084d3bfd50bd07fbca5cb60" + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "embed-doc-image" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af36f591236d9d822425cb6896595658fa558fcebf5ee8accac1d4b92c47166e" +dependencies = [ + "base64", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "log", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + +[[package]] +name = "exitcode" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193" + +[[package]] +name = "fd-lock" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ae6b3d9530211fb3b12a95374b8b0823be812f53d09e18c5675c0146b09642" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "flame" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc2706461e1ee94f55cab2ed2e3d34ae9536cfa830358ef80acff1a3dacab30" +dependencies = [ + "lazy_static 0.2.11", + "serde", + "serde_derive", + "serde_json", + "thread-id", +] + +[[package]] +name = "flamer" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36b732da54fd4ea34452f2431cf464ac7be94ca4b339c9cd3d3d12eb06fe7aab" +dependencies = [ + "flame", + "quote", + "syn", +] + +[[package]] +name = "flamescope" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3cc29a6c0dfa26d3a0e80021edda5671eeed79381130897737cdd273ea18909" +dependencies = [ + "flame", + "indexmap", + "serde", + "serde_json", +] + +[[package]] +name = "flate2" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "iana-time-zone" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "insta" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea5b3894afe466b4bcf0388630fc15e11938a6074af0cd637c825ba2ec8a099" +dependencies = [ + "console", + "lazy_static 1.4.0", + "linked-hash-map", + "similar", + "yaml-rust", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-macro" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7d079e129b77477a49c5c4f1cfe9ce6c2c909ef52520693e8e811a714c7b20" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" + +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "libffi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb06d5b4c428f3cd682943741c39ed4157ae989fffe1094a08eaf7c4014cf60" +dependencies = [ + "libc", + "libffi-sys", +] + +[[package]] +name = "libffi-sys" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c6f11e063a27ffe040a9d15f0b661bf41edc2383b7ae0e0ad5a7e7d53d9da3" +dependencies = [ + "cc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "lz4_flex" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8cbbb2831780bc3b9c15a41f5b49222ef756b6730a95f3decfdd15903eb5a3" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "mac_address" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b238e3235c8382b7653c6408ed1b08dd379bdb9fdf990fb0bbae3db2cc0ae963" +dependencies = [ + "nix 0.23.2", + "winapi", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "malachite" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6cf7f4730c30071ba374fac86ad35b1cb7a0716f774737768667ea3fa1828e3" +dependencies = [ + "malachite-base", + "malachite-nz", + "malachite-q", +] + +[[package]] +name = "malachite-base" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b06bfa98a4b4802af5a4263b4ad4660e28e51e8490f6354eb9336c70767e1c5" +dependencies = [ + "itertools 0.9.0", + "rand 0.7.3", + "rand_chacha 0.2.2", + "ryu", + "sha3 0.9.1", +] + +[[package]] +name = "malachite-bigint" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5110aee54537b0cef214efbebdd7df79b7408db8eef4f6a4b6db9d0d8fc01b" +dependencies = [ + "derive_more", + "malachite", + "num-integer", + "num-traits", + "paste", +] + +[[package]] +name = "malachite-nz" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e21c64b7af5be3dc8cef16f786243faf59459fe4ba93b44efdeb264e5ade4" +dependencies = [ + "embed-doc-image", + "itertools 0.9.0", + "malachite-base", +] + +[[package]] +name = "malachite-q" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3755e541d5134b5016594c9043094172c4dda9259b3ce824a7b8101941850360" +dependencies = [ + "itertools 0.9.0", + "malachite-base", + "malachite-nz", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mt19937" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ca7f22ed370d5991a9caec16a83187e865bc8a532f889670337d5a5689e3a1" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", + "static_assertions", +] + +[[package]] +name = "nom8" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" +dependencies = [ + "memchr", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "111.25.0+1.1.1t" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3173cd3626c43e3854b1b727422a276e568d9ec5fe8cec197822cf52cfb743d6" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "optional" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" + +[[package]] +name = "page_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "phf" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "plotters" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" + +[[package]] +name = "plotters-svg" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "pmutil" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "puruspe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7e158a385023d209d6d5f2585c4b468f6dcb3dd5aca9b75c4f1678c05bb375" + +[[package]] +name = "python3-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f8b50d72fb3015735aa403eebf19bbd72c093bfeeae24ee798be5f2f1aab52" +dependencies = [ + "libc", + "regex", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rayon" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.8", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regalloc2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43a209257d978ef079f3d446331d0f1794f5e0fc19b306a199983857833a779" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "region" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "result-like" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b80fe0296795a96913be20558326b797a187bb3986ce84ed82dee0fb7414428" +dependencies = [ + "result-like-derive", +] + +[[package]] +name = "result-like-derive" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a29c8a4ac7839f1dcb8b899263b501e0d6932f210300c8a0d271323727b35c1" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", + "syn-ext", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustpython" +version = "0.3.0" +dependencies = [ + "atty", + "cfg-if", + "clap", + "cpython", + "criterion", + "dirs-next", + "env_logger", + "flame", + "flamescope", + "libc", + "log", + "python3-sys", + "rustpython-compiler", + "rustpython-parser", + "rustpython-pylib", + "rustpython-stdlib", + "rustpython-vm", + "rustyline", +] + +[[package]] +name = "rustpython-ast" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "is-macro", + "malachite-bigint", + "rustpython-literal", + "rustpython-parser-core", + "static_assertions", +] + +[[package]] +name = "rustpython-codegen" +version = "0.3.0" +dependencies = [ + "ahash", + "bitflags 2.3.1", + "indexmap", + "insta", + "itertools 0.10.5", + "log", + "num-complex", + "num-traits", + "rustpython-ast", + "rustpython-compiler-core", + "rustpython-parser", + "rustpython-parser-core", +] + +[[package]] +name = "rustpython-common" +version = "0.3.0" +dependencies = [ + "ascii", + "bitflags 2.3.1", + "bstr", + "cfg-if", + "itertools 0.10.5", + "libc", + "lock_api", + "malachite-base", + "malachite-bigint", + "malachite-q", + "num-complex", + "num-traits", + "once_cell", + "parking_lot", + "radium", + "rand 0.8.5", + "rustpython-format", + "siphasher", + "volatile", + "widestring", +] + +[[package]] +name = "rustpython-compiler" +version = "0.3.0" +dependencies = [ + "rustpython-codegen", + "rustpython-compiler-core", + "rustpython-parser", +] + +[[package]] +name = "rustpython-compiler-core" +version = "0.3.0" +dependencies = [ + "bitflags 2.3.1", + "itertools 0.10.5", + "lz4_flex", + "malachite-bigint", + "num-complex", + "rustpython-parser-core", + "serde", +] + +[[package]] +name = "rustpython-derive" +version = "0.3.0" +dependencies = [ + "rustpython-compiler", + "rustpython-derive-impl", + "syn", +] + +[[package]] +name = "rustpython-derive-impl" +version = "0.3.0" +dependencies = [ + "itertools 0.10.5", + "maplit", + "once_cell", + "proc-macro2", + "quote", + "rustpython-compiler-core", + "rustpython-doc", + "rustpython-parser-core", + "syn", + "syn-ext", + "textwrap 0.15.2", +] + +[[package]] +name = "rustpython-doc" +version = "0.3.0" +source = "git+https://github.com/RustPython/__doc__?tag=0.3.0#8b62ce5d796d68a091969c9fa5406276cb483f79" +dependencies = [ + "once_cell", +] + +[[package]] +name = "rustpython-format" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "bitflags 2.3.1", + "itertools 0.10.5", + "malachite-bigint", + "num-traits", + "rustpython-literal", +] + +[[package]] +name = "rustpython-jit" +version = "0.3.0" +dependencies = [ + "approx", + "cranelift", + "cranelift-jit", + "cranelift-module", + "libffi", + "num-traits", + "rustpython-compiler-core", + "rustpython-derive", + "thiserror", +] + +[[package]] +name = "rustpython-literal" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "hexf-parse", + "is-macro", + "lexical-parse-float", + "num-traits", + "unic-ucd-category", +] + +[[package]] +name = "rustpython-parser" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "anyhow", + "is-macro", + "itertools 0.10.5", + "lalrpop-util", + "log", + "malachite-bigint", + "num-traits", + "phf", + "phf_codegen", + "rustc-hash", + "rustpython-ast", + "rustpython-parser-core", + "tiny-keccak", + "unic-emoji-char", + "unic-ucd-ident", + "unicode_names2", +] + +[[package]] +name = "rustpython-parser-core" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "is-macro", + "memchr", + "rustpython-parser-vendored", +] + +[[package]] +name = "rustpython-parser-vendored" +version = "0.3.0" +source = "git+https://github.com/RustPython/Parser.git?tag=0.3.0#a1e4336f7043807eda8a5ecb15d4115172cc4a7e" +dependencies = [ + "memchr", + "once_cell", +] + +[[package]] +name = "rustpython-pylib" +version = "0.3.0" +dependencies = [ + "glob", + "rustpython-compiler-core", + "rustpython-derive", +] + +[[package]] +name = "rustpython-stdlib" +version = "0.3.0" +dependencies = [ + "adler32", + "ahash", + "ascii", + "base64", + "blake2", + "bzip2", + "cfg-if", + "crc32fast", + "crossbeam-utils", + "csv-core", + "digest 0.10.6", + "dns-lookup", + "dyn-clone", + "flate2", + "foreign-types-shared", + "gethostname", + "hex", + "itertools 0.10.5", + "libc", + "libsqlite3-sys", + "libz-sys", + "mac_address", + "malachite-bigint", + "md-5", + "memchr", + "memmap2", + "mt19937", + "nix 0.26.2", + "num-complex", + "num-integer", + "num-traits", + "num_enum", + "once_cell", + "openssl", + "openssl-probe", + "openssl-sys", + "page_size", + "parking_lot", + "paste", + "puruspe", + "rand 0.8.5", + "rand_core 0.6.4", + "rustpython-common", + "rustpython-derive", + "rustpython-vm", + "schannel", + "sha-1", + "sha2", + "sha3 0.10.6", + "socket2", + "system-configuration", + "termios", + "ucd", + "unic-char-property", + "unic-normal", + "unic-ucd-age", + "unic-ucd-bidi", + "unic-ucd-category", + "unic-ucd-ident", + "unicode-casing", + "unicode_names2", + "uuid", + "widestring", + "winapi", + "xml-rs", +] + +[[package]] +name = "rustpython-vm" +version = "0.3.0" +dependencies = [ + "ahash", + "ascii", + "atty", + "bitflags 2.3.1", + "bstr", + "caseless", + "cfg-if", + "chrono", + "crossbeam-utils", + "exitcode", + "flame", + "flamer", + "getrandom 0.2.8", + "glob", + "half", + "hex", + "indexmap", + "is-macro", + "itertools 0.10.5", + "libc", + "log", + "malachite-bigint", + "memchr", + "memoffset 0.6.5", + "nix 0.26.2", + "num-complex", + "num-integer", + "num-traits", + "num_cpus", + "num_enum", + "once_cell", + "optional", + "parking_lot", + "paste", + "rand 0.8.5", + "result-like", + "rustc_version", + "rustpython-ast", + "rustpython-codegen", + "rustpython-common", + "rustpython-compiler", + "rustpython-compiler-core", + "rustpython-derive", + "rustpython-format", + "rustpython-jit", + "rustpython-literal", + "rustpython-parser", + "rustpython-parser-core", + "rustyline", + "schannel", + "serde", + "sre-engine", + "static_assertions", + "strum", + "strum_macros", + "thiserror", + "thread_local", + "timsort", + "uname", + "unic-ucd-bidi", + "unic-ucd-category", + "unic-ucd-ident", + "unicode-casing", + "unicode_names2", + "wasm-bindgen", + "which", + "widestring", + "winapi", + "windows", + "winreg", +] + +[[package]] +name = "rustpython_wasm" +version = "0.3.0" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "rustpython-common", + "rustpython-parser", + "rustpython-pylib", + "rustpython-stdlib", + "rustpython-vm", + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" + +[[package]] +name = "rustyline" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfc8644681285d1fb67a467fb3021bfea306b99b4146b166a1fe3ada965eece" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "clipboard-win", + "dirs-next", + "fd-lock", + "libc", + "log", + "memchr", + "nix 0.26.2", + "radix_trie", + "scopeguard", + "unicode-segmentation", + "unicode-width", + "utf8parse", + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scratch" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" + +[[package]] +name = "semver" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" + +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "618365e8e586c22123d692b72a7d791d5ee697817b65a218cdf12a98870af0f7" +dependencies = [ + "fnv", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +dependencies = [ + "digest 0.10.6", + "keccak", +] + +[[package]] +name = "similar" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "sre-engine" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a490c5c46c35dba9a6f5e7ee8e4d67e775eb2d2da0f115750b8d10e1c1ac2d28" +dependencies = [ + "bitflags 1.3.2", + "num_enum", + "optional", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-ext" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b86cb2b68c5b3c078cac02588bc23f3c04bb828c5d3aedd17980876ec6a7be6" +dependencies = [ + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "target-lexicon" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5" + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread-id" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" +dependencies = [ + "libc", + "redox_syscall 0.1.57", + "winapi", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "timsort" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb4fa83bb73adf1c7219f4fe4bf3c0ac5635e4e51e070fad5df745a41bedfb8" + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" + +[[package]] +name = "toml_edit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" +dependencies = [ + "indexmap", + "nom8", + "toml_datetime", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ucd" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4fa6e588762366f1eb4991ce59ad1b93651d0b769dfb4e4d1c5c4b943d1159" + +[[package]] +name = "uname" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" +dependencies = [ + "libc", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-emoji-char" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b07221e68897210270a38bde4babb655869637af0f69407f96053a34f76494d" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-normal" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09d64d33589a94628bc2aeb037f35c2e25f3f049c7348b5aa5580b48e6bba62" +dependencies = [ + "unic-ucd-normal", +] + +[[package]] +name = "unic-ucd-age" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8cfdfe71af46b871dc6af2c24fcd360e2f3392ee4c5111877f2947f311671c" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-bidi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1d568b51222484e1f8209ce48caa6b430bf352962b877d592c29ab31fb53d8c" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-category" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8d4591f5fcfe1bd4453baaf803c40e1b1e69ff8455c47620440b46efef91c0" +dependencies = [ + "matches", + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-hangul" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1dc690e19010e1523edb9713224cba5ef55b54894fe33424439ec9a40c0054" +dependencies = [ + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-normal" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86aed873b8202d22b13859dda5fe7c001d271412c31d411fd9b827e030569410" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-hangul", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-casing" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623f59e6af2a98bdafeb93fa277ac8e1e40440973001ca15cf4ae1541cd16d56" + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode_names2" +version = "0.6.0" +source = "git+https://github.com/youknowone/unicode_names2.git?rev=4ce16aa85cbcdd9cc830410f1a72ef9a235f2fde#4ce16aa85cbcdd9cc830410f1a72ef9a235f2fde" +dependencies = [ + "phf", +] + +[[package]] +name = "utf8parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" + +[[package]] +name = "uuid" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +dependencies = [ + "atomic", + "getrandom 0.2.8", + "rand 0.8.5", + "uuid-macro-internal", +] + +[[package]] +name = "uuid-macro-internal" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b300a878652a387d2a0de915bdae8f1a548f0c6d45e072fe2688794b656cc9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "volatile" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8e76fae08f03f96e166d2dfda232190638c10e0383841252416f9cfe2ae60e6" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "xml-rs" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52839dc911083a8ef63efa4d039d1f58b5e409f923e44c80828f206f66e5541c" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/pkgs/by-name/py/python/rustpython/default.nix b/pkgs/by-name/py/python/rustpython/default.nix new file mode 100644 index 0000000..3d10ab3 --- /dev/null +++ b/pkgs/by-name/py/python/rustpython/default.nix @@ -0,0 +1,47 @@ +{ lib +, stdenv +, rustPlatform +, fetchFromGitHub +, SystemConfiguration +, python3 +}: + +rustPlatform.buildRustPackage rec { + pname = "rustpython"; + version = "0.3.0"; + + src = fetchFromGitHub { + owner = "RustPython"; + repo = "RustPython"; + rev = "refs/tags/${version}"; + hash = "sha256-8tDzgsmKLjsfMT5j5HqrQ93LsGHxmC2DJu5KbR3FNXc="; + }; + + cargoLock = { + lockFile = ./Cargo.lock; + outputHashes = { + "rustpython-ast-0.3.0" = "sha256-5IR/G6Y9OE0+gTvU1iTob0TxfiV3O9elA/0BUy2GA8g="; + "rustpython-doc-0.3.0" = "sha256-34ERuLFKzUD9Xmf1zlafe42GLWZfUlw17ejf/NN6yH4="; + "unicode_names2-0.6.0" = "sha256-eWg9+ISm/vztB0KIdjhq5il2ZnwGJQCleCYfznCI3Wg="; + }; + }; + + # freeze the stdlib into the rustpython binary + cargoBuildFlags = [ "--features=freeze-stdlib" ]; + + buildInputs = lib.optionals stdenv.isDarwin [ SystemConfiguration ]; + + nativeCheckInputs = [ python3 ]; + + meta = with lib; { + description = "Python 3 interpreter in written Rust"; + homepage = "https://rustpython.github.io"; + license = licenses.mit; + maintainers = with maintainers; [ prusnak ]; + # = note: Undefined symbols for architecture x86_64: + # "_utimensat", referenced from: + # rustpython_vm::function::builtin::IntoPyNativeFn::into_func::... in + # rustpython-10386d81555652a7.rustpython_vm-f0b5bedfcf056d0b.rustpython_vm.7926b68e665728ca-cgu.08.rcgu.o.rcgu.o + broken = stdenv.isDarwin && stdenv.isx86_64; + }; +} diff --git a/pkgs/by-name/py/python/setup-hook.nix b/pkgs/by-name/py/python/setup-hook.nix new file mode 100644 index 0000000..8cfb9dd --- /dev/null +++ b/pkgs/by-name/py/python/setup-hook.nix @@ -0,0 +1,16 @@ +{ runCommand }: + +sitePackages: + +let + hook = ./setup-hook.sh; +in runCommand "python-setup-hook.sh" { + strictDeps = true; + env = { + inherit sitePackages; + }; +} '' + cp ${hook} hook.sh + substituteAllInPlace hook.sh + mv hook.sh $out +'' diff --git a/pkgs/by-name/py/python/setup-hook.sh b/pkgs/by-name/py/python/setup-hook.sh new file mode 100644 index 0000000..523df57 --- /dev/null +++ b/pkgs/by-name/py/python/setup-hook.sh @@ -0,0 +1,26 @@ +addPythonPath() { + addToSearchPathWithCustomDelimiter : PYTHONPATH $1/@sitePackages@ +} + +toPythonPath() { + local paths="$1" + local result= + for i in $paths; do + p="$i/@sitePackages@" + result="${result}${result:+:}$p" + done + echo $result +} + +if [ -z "${dontAddPythonPath:-}" ]; then + addEnvHooks "$hostOffset" addPythonPath +fi + +# Determinism: The interpreter is patched to write null timestamps when compiling python files. +# This way python doesn't try to update them when we freeze timestamps in nix store. +export DETERMINISTIC_BUILD=1; +# Determinism: We fix the hashes of str, bytes and datetime objects. +export PYTHONHASHSEED=0; +# Determinism. Whenever Python is included, it should not check user site-packages. +# This option is only relevant when the sandbox is disabled. +export PYTHONNOUSERSITE=1; diff --git a/pkgs/by-name/py/python/sitecustomize.py b/pkgs/by-name/py/python/sitecustomize.py new file mode 100644 index 0000000..c6924a8 --- /dev/null +++ b/pkgs/by-name/py/python/sitecustomize.py @@ -0,0 +1,39 @@ +""" +This is a Nix-specific module for discovering modules built with Nix. + +The module recursively adds paths that are on `NIX_PYTHONPATH` to `sys.path`. In +order to process possible `.pth` files `site.addsitedir` is used. + +The paths listed in `PYTHONPATH` are added to `sys.path` afterwards, but they +will be added before the entries we add here and thus take precedence. + +Note the `NIX_PYTHONPATH` environment variable is unset in order to prevent leakage. + +Similarly, this module listens to the environment variable `NIX_PYTHONEXECUTABLE` +and sets `sys.executable` to its value. +""" +import site +import sys +import os +import functools + +paths = os.environ.pop('NIX_PYTHONPATH', None) +if paths: + functools.reduce(lambda k, p: site.addsitedir(p, k), paths.split(':'), site._init_pathinfo()) + +# Check whether we are in a venv or virtualenv. +# For Python 3 we check whether our `base_prefix` is different from our current `prefix`. +# For Python 2 we check whether the non-standard `real_prefix` is set. +# https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv +in_venv = (sys.version_info.major == 3 and sys.prefix != sys.base_prefix) or (sys.version_info.major == 2 and hasattr(sys, "real_prefix")) + +if not in_venv: + executable = os.environ.pop('NIX_PYTHONEXECUTABLE', None) + prefix = os.environ.pop('NIX_PYTHONPREFIX', None) + + if 'PYTHONEXECUTABLE' not in os.environ and executable is not None: + sys.executable = executable + if prefix is not None: + # Sysconfig does not like it when sys.prefix is set to None + sys.prefix = sys.exec_prefix = prefix + site.PREFIXES.insert(0, prefix) diff --git a/pkgs/by-name/py/python/tests.nix b/pkgs/by-name/py/python/tests.nix new file mode 100644 index 0000000..2cd29ca --- /dev/null +++ b/pkgs/by-name/py/python/tests.nix @@ -0,0 +1,195 @@ +# Tests for the Python interpreters, package sets and environments. +# +# Each Python interpreter has a `passthru.tests` which is the attribute set +# returned by this function. For example, for Python 3 the tests are run with +# +# $ nix-build -A python3.tests +# +{ stdenv +, python +, runCommand +, lib +, callPackage +, pkgs +}: + +let + # Test whether the interpreter behaves in the different types of environments + # we aim to support. + environmentTests = let + envs = let + inherit python; + pythonEnv = python.withPackages(ps: with ps; [ ]); + pythonVirtualEnv = if python.isPy3k + then + python.withPackages(ps: with ps; [ virtualenv ]) + else + python.buildEnv.override { + extraLibs = with python.pkgs; [ virtualenv ]; + # Collisions because of namespaces __init__.py + ignoreCollisions = true; + }; + in { + # Plain Python interpreter + plain = rec { + env = python; + interpreter = env.interpreter; + is_venv = "False"; + is_nixenv = "False"; + is_virtualenv = "False"; + }; + } // lib.optionalAttrs (!python.isPyPy && !stdenv.isDarwin) { + # Use virtualenv from a Nix env. + # Fails on darwin with + # virtualenv: error: argument dest: the destination . is not write-able at /nix/store + nixenv-virtualenv = rec { + env = runCommand "${python.name}-virtualenv" {} '' + ${pythonVirtualEnv.interpreter} -m virtualenv venv + mv venv $out + ''; + interpreter = "${env}/bin/${python.executable}"; + is_venv = "False"; + is_nixenv = "True"; + is_virtualenv = "True"; + }; + } // lib.optionalAttrs (python.implementation != "graal") { + # Python Nix environment (python.buildEnv) + nixenv = rec { + env = pythonEnv; + interpreter = env.interpreter; + is_venv = "False"; + is_nixenv = "True"; + is_virtualenv = "False"; + }; + } // lib.optionalAttrs (python.isPy3k && (!python.isPyPy)) { + # Venv built using plain Python + # Python 2 does not support venv + # TODO: PyPy executable name is incorrect, it should be pypy-c or pypy-3c instead of pypy and pypy3. + plain-venv = rec { + env = runCommand "${python.name}-venv" {} '' + ${python.interpreter} -m venv $out + ''; + interpreter = "${env}/bin/${python.executable}"; + is_venv = "True"; + is_nixenv = "False"; + is_virtualenv = "False"; + }; + + } // lib.optionalAttrs (python.pythonAtLeast "3.8") { + # Venv built using Python Nix environment (python.buildEnv) + # TODO: Cannot create venv from a nix env + # Error: Command '['/nix/store/ddc8nqx73pda86ibvhzdmvdsqmwnbjf7-python3-3.7.6-venv/bin/python3.7', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1. + nixenv-venv = rec { + env = runCommand "${python.name}-venv" {} '' + ${pythonEnv.interpreter} -m venv $out + ''; + interpreter = "${env}/bin/${pythonEnv.executable}"; + is_venv = "True"; + is_nixenv = "True"; + is_virtualenv = "False"; + }; + }; + + testfun = name: attrs: runCommand "${python.name}-tests-${name}" ({ + inherit (python) pythonVersion; + } // attrs) '' + cp -r ${./tests/test_environments} tests + chmod -R +w tests + substituteAllInPlace tests/test_python.py + ${attrs.interpreter} -m unittest discover --verbose tests #/test_python.py + mkdir $out + touch $out/success + ''; + + in lib.mapAttrs testfun envs; + + # Integration tests involving the package set. + # All PyPy package builds are broken at the moment + integrationTests = lib.optionalAttrs (!python.isPyPy) ( + lib.optionalAttrs (python.isPy3k && !stdenv.isDarwin) { # darwin has no split-debug + cpython-gdb = callPackage ./tests/test_cpython_gdb { + interpreter = python; + }; + } // lib.optionalAttrs (python.pythonAtLeast "3.7") { + # Before the addition of NIX_PYTHONPREFIX mypy was broken with typed packages + nix-pythonprefix-mypy = callPackage ./tests/test_nix_pythonprefix { + interpreter = python; + }; + # Make sure tkinter is importable. See https://github.com/NixOS/nixpkgs/issues/238990 + tkinter = callPackage ./tests/test_tkinter { + interpreter = python; + }; + } + ); + + # Tests to ensure overriding works as expected. + overrideTests = let + extension = self: super: { + foobar = super.numpy; + }; + # `pythonInterpreters.pypy39_prebuilt` does not expose an attribute + # name (is not present in top-level `pkgs`). + is_prebuilt = python: python.pythonAttr == null; + in lib.optionalAttrs (python.isPy3k) ({ + test-packageOverrides = let + myPython = let + self = python.override { + packageOverrides = extension; + inherit self; + }; + in self; + in assert myPython.pkgs.foobar == myPython.pkgs.numpy; myPython.withPackages(ps: with ps; [ foobar ]); + # overrideScope is broken currently + # test-overrideScope = let + # myPackages = python.pkgs.overrideScope extension; + # in assert myPackages.foobar == myPackages.numpy; myPackages.python.withPackages(ps: with ps; [ foobar ]); + # + # Have to skip prebuilt python as it's not present in top-level + # `pkgs` as an attribute. + } // lib.optionalAttrs (python ? pythonAttr && !is_prebuilt python) { + # Test applying overrides using pythonPackagesOverlays. + test-pythonPackagesExtensions = let + pkgs_ = pkgs.extend(final: prev: { + pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [ + (python-final: python-prev: { + foo = python-prev.setuptools; + }) + ]; + }); + in pkgs_.${python.pythonAttr}.pkgs.foo; + }); + + condaTests = let + requests = callPackage ({ + autoPatchelfHook, + fetchurl, + pythonCondaPackages, + }: + python.pkgs.buildPythonPackage { + pname = "requests"; + version = "2.24.0"; + format = "other"; + src = fetchurl { + url = "https://repo.anaconda.com/pkgs/main/noarch/requests-2.24.0-py_0.tar.bz2"; + sha256 = "02qzaf6gwsqbcs69pix1fnjxzgnngwzvrsy65h1d521g750mjvvp"; + }; + nativeBuildInputs = [ autoPatchelfHook ] ++ (with python.pkgs; [ + condaUnpackHook condaInstallHook + ]); + buildInputs = [ + pythonCondaPackages.condaPatchelfLibs + ]; + propagatedBuildInputs = with python.pkgs; [ + chardet idna urllib3 certifi + ]; + } + ) {}; + pythonWithRequests = requests.pythonModule.withPackages (ps: [ requests ]); + in lib.optionalAttrs (python.isPy3k && stdenv.isLinux) + { + condaExamplePackage = runCommand "import-requests" {} '' + ${pythonWithRequests.interpreter} -c "import requests" > $out + ''; + }; + +in lib.optionalAttrs (stdenv.hostPlatform == stdenv.buildPlatform ) (environmentTests // integrationTests // overrideTests // condaTests) diff --git a/pkgs/by-name/py/python/tests/test_cpython_gdb/default.nix b/pkgs/by-name/py/python/tests/test_cpython_gdb/default.nix new file mode 100644 index 0000000..0254d84 --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_cpython_gdb/default.nix @@ -0,0 +1,22 @@ +{ interpreter, lib, gdb, writeText, runCommand }: + +let + crashme-py = writeText "crashme.py" '' + import ctypes + + def sentinel_foo_bar(): + ctypes.memset(0, 1, 1) + + sentinel_foo_bar() + ''; +in runCommand "python-gdb" {} '' + # test that gdb is able to recover the python stack frame of this segfault + ${gdb}/bin/gdb -batch -ex 'set debug-file-directory ${interpreter.debug}/lib/debug' \ + -ex 'source ${interpreter}/share/gdb/libpython.py' \ + -ex r \ + -ex py-bt \ + --args ${interpreter}/bin/python ${crashme-py} | grep 'in sentinel_foo_bar' > /dev/null + + # success. + touch $out +'' diff --git a/pkgs/by-name/py/python/tests/test_environments/test_python.py b/pkgs/by-name/py/python/tests/test_environments/test_python.py new file mode 100644 index 0000000..0fc4b8a --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_environments/test_python.py @@ -0,0 +1,55 @@ +""" +Python interpreter and environment tests. + +These need to be executed with the standard library unittest. +Third party test runners such as pytest cannot be used because +that would interfere with the tests. +""" + +import platform +import sys +import unittest +import site + + +ENV = "@env@" +INTERPRETER = "@interpreter@" +PYTHON_VERSION = "@pythonVersion@" + +IS_VIRTUALENV = @is_virtualenv@ +IS_VENV = @is_venv@ +IS_NIXENV = @is_nixenv@ +IS_PYPY = platform.python_implementation() == "PyPy" + + +class TestCasePython(unittest.TestCase): + + @unittest.skipIf(IS_PYPY, "Executable is incorrect and needs to be fixed.") + def test_interpreter(self): + self.assertEqual(sys.executable, INTERPRETER) + + @unittest.skipIf(IS_PYPY, "Prefix is incorrect and needs to be fixed.") + def test_prefix(self): + self.assertEqual(sys.prefix, ENV) + self.assertEqual(sys.prefix, sys.exec_prefix) + + def test_site_prefix(self): + self.assertTrue(sys.prefix in site.PREFIXES) + + @unittest.skipIf(IS_PYPY or sys.version_info.major==2, "Python 2 does not have base_prefix") + def test_base_prefix(self): + if IS_VENV or IS_NIXENV or IS_VIRTUALENV: + self.assertNotEqual(sys.prefix, sys.base_prefix) + else: + self.assertEqual(sys.prefix, sys.base_prefix) + + @unittest.skipIf(sys.version_info.major==3, "sys.real_prefix is only set by virtualenv in case of Python 2.") + def test_real_prefix(self): + self.assertTrue(hasattr(sys, "real_prefix") == IS_VIRTUALENV) + + def test_python_version(self): + self.assertTrue(platform.python_version().startswith(PYTHON_VERSION)) + + +if __name__ == "__main__": + unittest.main() diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/default.nix b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/default.nix new file mode 100644 index 0000000..2030fab --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/default.nix @@ -0,0 +1,25 @@ +{ interpreter, writeText, runCommand }: + +let + + python = let + packageOverrides = self: super: { + typeddep = self.callPackage ./typeddep {}; + }; + in interpreter.override {inherit packageOverrides; self = python;}; + + pythonEnv = python.withPackages(ps: [ + ps.typeddep + ps.mypy + ]); + + pythonScript = writeText "myscript.py" '' + from typeddep import util + s: str = util.echo("hello") + print(s) + ''; + +in runCommand "${interpreter.name}-site-prefix-mypy-test" {} '' + ${pythonEnv}/bin/mypy ${pythonScript} + touch $out +'' diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/default.nix b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/default.nix new file mode 100644 index 0000000..8d330fc --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/default.nix @@ -0,0 +1,13 @@ +{ buildPythonPackage, pythonOlder }: + + +buildPythonPackage { + + pname = "typeddep"; + version = "1.3.3.7"; + + src = ./.; + + disabled = pythonOlder "3.7"; + +} diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/setup.py b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/setup.py new file mode 100644 index 0000000..25bac69 --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/setup.py @@ -0,0 +1,18 @@ +from setuptools import setup + +setup(**{ + 'name': 'typeddep', + 'version': '1.3.3.7', + 'description': 'Minimal repro to test mypy and site prefixes with Nix', + 'long_description': None, + 'author': 'adisbladis', + 'author_email': 'adisbladis@gmail.com', + 'maintainer': None, + 'maintainer_email': None, + 'url': None, + 'packages': ['typeddep'], + 'package_data': {'': ['*']}, + 'install_requires': [], + 'entry_points': {}, + 'python_requires': '>=3.7,<4.0', +}) diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/__init__.py b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/py.typed b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/util.py b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/util.py new file mode 100644 index 0000000..c1c3ffe --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_nix_pythonprefix/typeddep/typeddep/util.py @@ -0,0 +1,2 @@ +def echo(s: str) -> str: + return s diff --git a/pkgs/by-name/py/python/tests/test_tkinter/default.nix b/pkgs/by-name/py/python/tests/test_tkinter/default.nix new file mode 100644 index 0000000..67e67d2 --- /dev/null +++ b/pkgs/by-name/py/python/tests/test_tkinter/default.nix @@ -0,0 +1,17 @@ +{ interpreter, writeText, runCommand }: + +let + + pythonEnv = interpreter.withPackages(ps: [ + ps.tkinter + ]); + + pythonScript = writeText "myscript.py" '' + import tkinter + print(tkinter) + ''; + +in runCommand "${interpreter.name}-tkinter-test" {} '' + ${pythonEnv}/bin/python ${pythonScript} + touch $out +'' diff --git a/pkgs/by-name/py/python/update-python-libraries/default.nix b/pkgs/by-name/py/python/update-python-libraries/default.nix new file mode 100644 index 0000000..f7dfdf0 --- /dev/null +++ b/pkgs/by-name/py/python/update-python-libraries/default.nix @@ -0,0 +1,14 @@ +{ python3, runCommand, git, nix, nix-prefetch-git }: + +runCommand "update-python-libraries" { + buildInputs = [ + nix + nix-prefetch-git + (python3.withPackages(ps: with ps; [ packaging requests toolz ])) + git + ]; +} '' + cp ${./update-python-libraries.py} $out + patchShebangs $out + substituteInPlace $out --replace 'GIT = "git"' 'GIT = "${git}/bin/git"' +'' diff --git a/pkgs/by-name/py/python/update-python-libraries/update-python-libraries.py b/pkgs/by-name/py/python/update-python-libraries/update-python-libraries.py new file mode 100755 index 0000000..3430c58 --- /dev/null +++ b/pkgs/by-name/py/python/update-python-libraries/update-python-libraries.py @@ -0,0 +1,600 @@ +#!/usr/bin/env python3 + +""" +Update a Python package expression by passing in the `.nix` file, or the directory containing it. +You can pass in multiple files or paths. + +You'll likely want to use +`` + $ ./update-python-libraries ../../pkgs/development/python-modules/**/default.nix +`` +to update all non-pinned libraries in that folder. +""" + +import argparse +import collections +import json +import logging +import os +import re +import subprocess +from concurrent.futures import ThreadPoolExecutor as Pool +from typing import Any, Optional + +import requests +from packaging.specifiers import SpecifierSet +from packaging.version import InvalidVersion +from packaging.version import Version as _Version + +INDEX = "https://pypi.io/pypi" +"""url of PyPI""" + +EXTENSIONS = ["tar.gz", "tar.bz2", "tar", "zip", ".whl"] +"""Permitted file extensions. These are evaluated from left to right and the first occurance is returned.""" + +PRERELEASES = False + +BULK_UPDATE = False + +GIT = "git" + +NIXPKGS_ROOT = ( + subprocess.check_output(["git", "rev-parse", "--show-toplevel"]) + .decode("utf-8") + .strip() +) + +logging.basicConfig(level=logging.INFO) + + +class Version(_Version, collections.abc.Sequence): + def __init__(self, version): + super().__init__(version) + # We cannot use `str(Version(0.04.21))` because that becomes `0.4.21` + # https://github.com/avian2/unidecode/issues/13#issuecomment-354538882 + self.raw_version = version + + def __getitem__(self, i): + return self._version.release[i] + + def __len__(self): + return len(self._version.release) + + def __iter__(self): + yield from self._version.release + + +def _get_values(attribute, text): + """Match attribute in text and return all matches. + + :returns: List of matches. + """ + regex = rf'{re.escape(attribute)}\s+=\s+"(.*)";' + regex = re.compile(regex) + values = regex.findall(text) + return values + + +def _get_attr_value(attr_path: str) -> Optional[Any]: + try: + response = subprocess.check_output( + [ + "nix", + "--extra-experimental-features", + "nix-command", + "eval", + "-f", + f"{NIXPKGS_ROOT}/default.nix", + "--json", + f"{attr_path}", + ], + stderr=subprocess.DEVNULL, + ) + return json.loads(response.decode()) + except (subprocess.CalledProcessError, ValueError): + return None + + +def _get_unique_value(attribute, text): + """Match attribute in text and return unique match. + + :returns: Single match. + """ + values = _get_values(attribute, text) + n = len(values) + if n > 1: + raise ValueError("found too many values for {}".format(attribute)) + elif n == 1: + return values[0] + else: + raise ValueError("no value found for {}".format(attribute)) + + +def _get_line_and_value(attribute, text, value=None): + """Match attribute in text. Return the line and the value of the attribute.""" + if value is None: + regex = rf"({re.escape(attribute)}\s+=\s+\"(.*)\";)" + else: + regex = rf"({re.escape(attribute)}\s+=\s+\"({re.escape(value)})\";)" + regex = re.compile(regex) + results = regex.findall(text) + n = len(results) + if n > 1: + raise ValueError("found too many values for {}".format(attribute)) + elif n == 1: + return results[0] + else: + raise ValueError("no value found for {}".format(attribute)) + + +def _replace_value(attribute, value, text, oldvalue=None): + """Search and replace value of attribute in text.""" + if oldvalue is None: + old_line, old_value = _get_line_and_value(attribute, text) + else: + old_line, old_value = _get_line_and_value(attribute, text, oldvalue) + new_line = old_line.replace(old_value, value) + new_text = text.replace(old_line, new_line) + return new_text + + +def _fetch_page(url): + r = requests.get(url) + if r.status_code == requests.codes.ok: + return r.json() + else: + raise ValueError("request for {} failed".format(url)) + + +def _fetch_github(url): + headers = {} + token = os.environ.get("GITHUB_API_TOKEN") + if token: + headers["Authorization"] = f"token {token}" + r = requests.get(url, headers=headers) + + if r.status_code == requests.codes.ok: + return r.json() + else: + raise ValueError("request for {} failed".format(url)) + + +def _hash_to_sri(algorithm, value): + """Convert a hash to its SRI representation""" + return ( + subprocess.check_output(["nix", "hash", "to-sri", "--type", algorithm, value]) + .decode() + .strip() + ) + + +def _skip_bulk_update(attr_name: str) -> bool: + return bool(_get_attr_value(f"{attr_name}.skipBulkUpdate")) + + +SEMVER = { + "major": 0, + "minor": 1, + "patch": 2, +} + + +def _determine_latest_version(current_version, target, versions): + """Determine latest version, given `target`.""" + current_version = Version(current_version) + + def _parse_versions(versions): + for v in versions: + try: + yield Version(v) + except InvalidVersion: + pass + + versions = _parse_versions(versions) + + index = SEMVER[target] + + ceiling = list(current_version[0:index]) + if len(ceiling) == 0: + ceiling = None + else: + ceiling[-1] += 1 + ceiling = Version(".".join(map(str, ceiling))) + + # We do not want prereleases + versions = SpecifierSet(prereleases=PRERELEASES).filter(versions) + + if ceiling is not None: + versions = SpecifierSet(f"<{ceiling}").filter(versions) + + return (max(sorted(versions))).raw_version + + +def _get_latest_version_pypi(attr_path, package, extension, current_version, target): + """Get latest version and hash from PyPI.""" + url = "{}/{}/json".format(INDEX, package) + json = _fetch_page(url) + + versions = { + version + for version, releases in json["releases"].items() + if not all(release["yanked"] for release in releases) + } + version = _determine_latest_version(current_version, target, versions) + + try: + releases = json["releases"][version] + except KeyError as e: + raise KeyError( + "Could not find version {} for {}".format(version, package) + ) from e + for release in releases: + if release["filename"].endswith(extension): + # TODO: In case of wheel we need to do further checks! + sha256 = release["digests"]["sha256"] + break + else: + sha256 = None + return version, sha256, None + + +def _get_latest_version_github(attr_path, package, extension, current_version, target): + def strip_prefix(tag): + return re.sub("^[^0-9]*", "", tag) + + def get_prefix(string): + matches = re.findall(r"^([^0-9]*)", string) + return next(iter(matches), "") + + try: + homepage = subprocess.check_output( + [ + "nix", + "eval", + "-f", + f"{NIXPKGS_ROOT}/default.nix", + "--raw", + f"{attr_path}.src.meta.homepage", + ] + ).decode("utf-8") + except Exception as e: + raise ValueError(f"Unable to determine homepage: {e}") + owner_repo = homepage[len("https://github.com/") :] # remove prefix + owner, repo = owner_repo.split("/") + + url = f"https://api.github.com/repos/{owner}/{repo}/releases" + all_releases = _fetch_github(url) + releases = list(filter(lambda x: not x["prerelease"], all_releases)) + + if len(releases) == 0: + raise ValueError(f"{homepage} does not contain any stable releases") + + versions = map(lambda x: strip_prefix(x["tag_name"]), releases) + version = _determine_latest_version(current_version, target, versions) + + release = next(filter(lambda x: strip_prefix(x["tag_name"]) == version, releases)) + prefix = get_prefix(release["tag_name"]) + + # some attributes require using the fetchgit + git_fetcher_args = [] + if _get_attr_value(f"{attr_path}.src.fetchSubmodules"): + git_fetcher_args.append("--fetch-submodules") + if _get_attr_value(f"{attr_path}.src.fetchLFS"): + git_fetcher_args.append("--fetch-lfs") + if _get_attr_value(f"{attr_path}.src.leaveDotGit"): + git_fetcher_args.append("--leave-dotGit") + + if git_fetcher_args: + algorithm = "sha256" + cmd = [ + "nix-prefetch-git", + f"https://github.com/{owner}/{repo}.git", + "--hash", + algorithm, + "--rev", + f"refs/tags/{release['tag_name']}", + ] + cmd.extend(git_fetcher_args) + response = subprocess.check_output(cmd) + document = json.loads(response.decode()) + hash = _hash_to_sri(algorithm, document[algorithm]) + else: + try: + hash = ( + subprocess.check_output( + [ + "nix-prefetch-url", + "--type", + "sha256", + "--unpack", + f"{release['tarball_url']}", + ], + stderr=subprocess.DEVNULL, + ) + .decode("utf-8") + .strip() + ) + except (subprocess.CalledProcessError, UnicodeError): + # this may fail if they have both a branch and a tag of the same name, attempt tag name + tag_url = str(release["tarball_url"]).replace( + "tarball", "tarball/refs/tags" + ) + hash = ( + subprocess.check_output( + ["nix-prefetch-url", "--type", "sha256", "--unpack", tag_url], + stderr=subprocess.DEVNULL, + ) + .decode("utf-8") + .strip() + ) + + return version, hash, prefix + + +FETCHERS = { + "fetchFromGitHub": _get_latest_version_github, + "fetchPypi": _get_latest_version_pypi, + "fetchurl": _get_latest_version_pypi, +} + + +DEFAULT_SETUPTOOLS_EXTENSION = "tar.gz" + + +FORMATS = { + "setuptools": DEFAULT_SETUPTOOLS_EXTENSION, + "wheel": "whl", + "pyproject": "tar.gz", + "flit": "tar.gz", +} + + +def _determine_fetcher(text): + # Count occurrences of fetchers. + nfetchers = sum( + text.count("src = {}".format(fetcher)) for fetcher in FETCHERS.keys() + ) + if nfetchers == 0: + raise ValueError("no fetcher.") + elif nfetchers > 1: + raise ValueError("multiple fetchers.") + else: + # Then we check which fetcher to use. + for fetcher in FETCHERS.keys(): + if "src = {}".format(fetcher) in text: + return fetcher + + +def _determine_extension(text, fetcher): + """Determine what extension is used in the expression. + + If we use: + - fetchPypi, we check if format is specified. + - fetchurl, we determine the extension from the url. + - fetchFromGitHub we simply use `.tar.gz`. + """ + if fetcher == "fetchPypi": + try: + src_format = _get_unique_value("format", text) + except ValueError: + src_format = None # format was not given + + try: + extension = _get_unique_value("extension", text) + except ValueError: + extension = None # extension was not given + + if extension is None: + if src_format is None: + src_format = "setuptools" + elif src_format == "other": + raise ValueError("Don't know how to update a format='other' package.") + extension = FORMATS[src_format] + + elif fetcher == "fetchurl": + url = _get_unique_value("url", text) + extension = os.path.splitext(url)[1] + if "pypi" not in url: + raise ValueError("url does not point to PyPI.") + + elif fetcher == "fetchFromGitHub": + extension = "tar.gz" + + return extension + + +def _update_package(path, target): + # Read the expression + with open(path, "r") as f: + text = f.read() + + # Determine pname. Many files have more than one pname + pnames = _get_values("pname", text) + + # Determine version. + version = _get_unique_value("version", text) + + # First we check how many fetchers are mentioned. + fetcher = _determine_fetcher(text) + + extension = _determine_extension(text, fetcher) + + # Attempt a fetch using each pname, e.g. backports-zoneinfo vs backports.zoneinfo + successful_fetch = False + for pname in pnames: + # when invoked as an updateScript, UPDATE_NIX_ATTR_PATH will be set + # this allows us to work with packages which live outside of python-modules + attr_path = os.environ.get("UPDATE_NIX_ATTR_PATH", f"python3Packages.{pname}") + + if BULK_UPDATE and _skip_bulk_update(attr_path): + raise ValueError(f"Bulk update skipped for {pname}") + elif _get_attr_value(f"{attr_path}.cargoDeps") is not None: + raise ValueError(f"Cargo dependencies are unsupported, skipping {pname}") + try: + new_version, new_sha256, prefix = FETCHERS[fetcher]( + attr_path, pname, extension, version, target + ) + successful_fetch = True + break + except ValueError: + continue + + if not successful_fetch: + raise ValueError(f"Unable to find correct package using these pnames: {pnames}") + + if new_version == version: + logging.info("Path {}: no update available for {}.".format(path, pname)) + return False + elif Version(new_version) <= Version(version): + raise ValueError("downgrade for {}.".format(pname)) + if not new_sha256: + raise ValueError("no file available for {}.".format(pname)) + + text = _replace_value("version", new_version, text) + + # hashes from pypi are 16-bit encoded sha256's, normalize it to sri to avoid merge conflicts + # sri hashes have been the default format since nix 2.4+ + sri_hash = _hash_to_sri("sha256", new_sha256) + + # retrieve the old output hash for a more precise match + if old_hash := _get_attr_value(f"{attr_path}.src.outputHash"): + # fetchers can specify a sha256, or a sri hash + try: + text = _replace_value("hash", sri_hash, text, old_hash) + except ValueError: + text = _replace_value("sha256", sri_hash, text, old_hash) + else: + raise ValueError(f"Unable to retrieve old hash for {pname}") + + if fetcher == "fetchFromGitHub": + # in the case of fetchFromGitHub, it's common to see `rev = version;` or `rev = "v${version}";` + # in which no string value is meant to be substituted. However, we can just overwrite the previous value. + regex = r"(rev\s+=\s+[^;]*;)" + regex = re.compile(regex) + matches = regex.findall(text) + n = len(matches) + + if n == 0: + raise ValueError("Unable to find rev value for {}.".format(pname)) + else: + # forcefully rewrite rev, incase tagging conventions changed for a release + match = matches[0] + text = text.replace(match, f'rev = "refs/tags/{prefix}${{version}}";') + # incase there's no prefix, just rewrite without interpolation + text = text.replace('"${version}";', "version;") + + with open(path, "w") as f: + f.write(text) + + logging.info( + "Path {}: updated {} from {} to {}".format( + path, pname, version, new_version + ) + ) + + result = { + "path": path, + "target": target, + "pname": pname, + "old_version": version, + "new_version": new_version, + #'fetcher' : fetcher, + } + + return result + + +def _update(path, target): + # We need to read and modify a Nix expression. + if os.path.isdir(path): + path = os.path.join(path, "default.nix") + + # If a default.nix does not exist, we quit. + if not os.path.isfile(path): + logging.info("Path {}: does not exist.".format(path)) + return False + + # If file is not a Nix expression, we quit. + if not path.endswith(".nix"): + logging.info("Path {}: does not end with `.nix`.".format(path)) + return False + + try: + return _update_package(path, target) + except ValueError as e: + logging.warning("Path {}: {}".format(path, e)) + return False + + +def _commit(path, pname, old_version, new_version, pkgs_prefix="python: ", **kwargs): + """Commit result.""" + + msg = f"{pkgs_prefix}{pname}: {old_version} -> {new_version}" + + if changelog := _get_attr_value(f"{pkgs_prefix}{pname}.meta.changelog"): + msg += f"\n\n{changelog}" + + try: + subprocess.check_call([GIT, "add", path]) + subprocess.check_call([GIT, "commit", "-m", msg]) + except subprocess.CalledProcessError as e: + subprocess.check_call([GIT, "checkout", path]) + raise subprocess.CalledProcessError(f"Could not commit {path}") from e + + return True + + +def main(): + epilog = """ +environment variables: + GITHUB_API_TOKEN\tGitHub API token used when updating github packages + """ + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, epilog=epilog + ) + parser.add_argument("package", type=str, nargs="+") + parser.add_argument("--target", type=str, choices=SEMVER.keys(), default="major") + parser.add_argument( + "--commit", action="store_true", help="Create a commit for each package update" + ) + parser.add_argument( + "--use-pkgs-prefix", + action="store_true", + help="Use python3Packages.${pname}: instead of python: ${pname}: when making commits", + ) + + args = parser.parse_args() + target = args.target + + packages = list(map(os.path.abspath, args.package)) + + if len(packages) > 1: + global BULK_UPDATE + BULK_UPDATE = True + + logging.info("Updating packages...") + + # Use threads to update packages concurrently + with Pool() as p: + results = list(filter(bool, p.map(lambda pkg: _update(pkg, target), packages))) + + logging.info("Finished updating packages.") + + commit_options = {} + if args.use_pkgs_prefix: + logging.info("Using python3Packages. prefix for commits") + commit_options["pkgs_prefix"] = "python3Packages." + + # Commits are created sequentially. + if args.commit: + logging.info("Committing updates...") + # list forces evaluation + list(map(lambda x: _commit(**x, **commit_options), results)) + logging.info("Finished committing updates") + + count = len(results) + logging.info("{} package(s) updated".format(count)) + + +if __name__ == "__main__": + main() diff --git a/pkgs/by-name/py/python/with-packages.nix b/pkgs/by-name/py/python/with-packages.nix new file mode 100644 index 0000000..e1de0b2 --- /dev/null +++ b/pkgs/by-name/py/python/with-packages.nix @@ -0,0 +1,3 @@ +{ buildEnv, pythonPackages }: + +f: let packages = f pythonPackages; in buildEnv.override { extraLibs = packages; } diff --git a/pkgs/by-name/py/python/wrap-python.nix b/pkgs/by-name/py/python/wrap-python.nix new file mode 100644 index 0000000..8817d09 --- /dev/null +++ b/pkgs/by-name/py/python/wrap-python.nix @@ -0,0 +1,51 @@ +{ lib +, python +, makePythonHook +, makeWrapper }: + +makePythonHook { + name = "wrap-python-hook"; + propagatedBuildInputs = [ makeWrapper ]; + substitutions.sitePackages = python.sitePackages; + substitutions.executable = python.interpreter; + substitutions.python = python.pythonOnBuildForHost; + substitutions.pythonHost = python; + substitutions.magicalSedExpression = let + # Looks weird? Of course, it's between single quoted shell strings. + # NOTE: Order DOES matter here, so single character quotes need to be + # at the last position. + quoteVariants = [ "'\"'''\"'" "\"\"\"" "\"" "'\"'\"'" ]; # hey Vim: '' + + mkStringSkipper = labelNum: quote: let + label = "q${toString labelNum}"; + isSingle = lib.elem quote [ "\"" "'\"'\"'" ]; + endQuote = if isSingle then "[^\\\\]${quote}" else quote; + in '' + /^[a-z]?${quote}/ { + /${quote}${quote}|${quote}.*${endQuote}/{n;br} + :${label}; n; /^${quote}/{n;br}; /${endQuote}/{n;br}; b${label} + } + ''; + + # This preamble does two things: + # * Sets argv[0] to the original application's name; otherwise it would be .foo-wrapped. + # Python doesn't support `exec -a`. + # * Adds all required libraries to sys.path via `site.addsitedir`. It also handles *.pth files. + preamble = '' + import sys + import site + import functools + sys.argv[0] = '"'$(readlink -f "$f")'"' + functools.reduce(lambda k, p: site.addsitedir(p, k), ['"$([ -n "$program_PYTHONPATH" ] && (echo "'$program_PYTHONPATH'" | sed "s|:|','|g") || true)"'], site._init_pathinfo()) + ''; + + in '' + 1 { + :r + /\\$|,$/{N;br} + /__future__|^ |^ *(#.*)?$/{n;br} + ${lib.concatImapStrings mkStringSkipper quoteVariants} + /^[^# ]/i ${lib.replaceStrings ["\n"] [";"] preamble} + } + ''; +} ./wrap.sh diff --git a/pkgs/by-name/py/python/wrap.sh b/pkgs/by-name/py/python/wrap.sh new file mode 100644 index 0000000..f10ba00 --- /dev/null +++ b/pkgs/by-name/py/python/wrap.sh @@ -0,0 +1,139 @@ +# Wrapper around wrapPythonProgramsIn, below. The $pythonPath +# variable is passed in from the buildPythonPackage function. +wrapPythonPrograms() { + wrapPythonProgramsIn "$out/bin" "$out $pythonPath" +} + +# Builds environment variables like PYTHONPATH and PATH walking through closure +# of dependencies. +buildPythonPath() { + local pythonPath="$1" + local path + + # Create an empty table of python paths (see doc on _addToPythonPath + # for how this is used). Build up the program_PATH and program_PYTHONPATH + # variables. + declare -A pythonPathsSeen=() + program_PYTHONPATH= + program_PATH= + pythonPathsSeen["@pythonHost@"]=1 + addToSearchPath program_PATH @pythonHost@/bin + for path in $pythonPath; do + _addToPythonPath $path + done +} + +# Patches a Python script so that it has correct libraries path and executable +# name. +patchPythonScript() { + local f="$1" + + # The magicalSedExpression will invoke a "$(basename "$f")", so + # if you change $f to something else, be sure to also change it + # in pkgs/top-level/python-packages.nix! + # It also uses $program_PYTHONPATH. + sed -i "$f" -re '@magicalSedExpression@' +} + +# Transforms any binaries generated by the setup.py script, replacing them +# with an executable shell script which will set some environment variables +# and then call into the original binary (which has been given a .wrapped +# suffix). +wrapPythonProgramsIn() { + local dir="$1" + local pythonPath="$2" + local f + + buildPythonPath "$pythonPath" + + # Find all regular files in the output directory that are executable. + if [ -d "$dir" ]; then + find "$dir" -type f -perm -0100 -print0 | while read -d "" f; do + # Rewrite "#! .../env python" to "#! /nix/store/.../python". + # Strip suffix, like "3" or "2.7m" -- we don't have any choice on which + # Python to use besides one with this hook anyway. + if head -n1 "$f" | grep -q '#!.*/env.*\(python\|pypy\)'; then + sed -i "$f" -e "1 s^.*/env[ ]*\(python\|pypy\)[^ ]*^#!@executable@^" + fi + + if head -n1 "$f" | grep -q '#!.*'; then + # Cross-compilation hack: ensure shebangs are for the host + echo "Rewriting $(head -n 1 $f) to #!@pythonHost@" + sed -i "$f" -e "1 s^#!@python@^#!@pythonHost@^" + fi + + # catch /python and /.python-wrapped + if head -n1 "$f" | grep -q '/\.\?\(python\|pypy\)'; then + # dont wrap EGG-INFO scripts since they are called from python + if echo "$f" | grep -qv EGG-INFO/scripts; then + echo "wrapping \`$f'..." + patchPythonScript "$f" + # wrapProgram creates the executable shell script described + # above. The script will set PYTHONPATH and PATH variables.! + # (see pkgs/build-support/setup-hooks/make-wrapper.sh) + local -a wrap_args=("$f" + --prefix PATH ':' "$program_PATH" + ) + + if [ -z "$permitUserSite" ]; then + wrap_args+=(--set PYTHONNOUSERSITE "true") + fi + + # Add any additional arguments provided by makeWrapperArgs + # argument to buildPythonPackage. + # We need to support both the case when makeWrapperArgs + # is an array and a IFS-separated string. + # TODO: remove the string branch when __structuredAttrs are used. + if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then + local -a user_args=("${makeWrapperArgs[@]}") + else + local -a user_args="(${makeWrapperArgs:-})" + fi + + local -a wrapProgramArgs=("${wrap_args[@]}" "${user_args[@]}") + wrapProgram "${wrapProgramArgs[@]}" + fi + fi + done + fi +} + +# Adds the lib and bin directories to the PYTHONPATH and PATH variables, +# respectively. Recurses on any paths declared in +# `propagated-build-inputs`, while avoiding duplicating paths by +# flagging the directories it has visited in `pythonPathsSeen`. +_addToPythonPath() { + local dir="$1" + # Stop if we've already visited here. + if [ -n "${pythonPathsSeen[$dir]}" ]; then return; fi + pythonPathsSeen[$dir]=1 + # addToSearchPath is defined in stdenv/generic/setup.sh. It will have + # the effect of calling `export program_X=$dir/...:$program_X`. + addToSearchPath program_PYTHONPATH $dir/@sitePackages@ + addToSearchPath program_PATH $dir/bin + + # Inspect the propagated inputs (if they exist) and recur on them. + local prop="$dir/nix-support/propagated-build-inputs" + if [ -e $prop ]; then + local new_path + for new_path in $(cat $prop); do + _addToPythonPath $new_path + done + fi +} + +createBuildInputsPth() { + local category="$1" + local inputs="$2" + if [ foo"$inputs" != foo ]; then + for x in $inputs; do + if $(echo -n $x |grep -q python-recursive-pth-loader); then + continue + fi + if test -d "$x"/@sitePackages@; then + echo $x/@sitePackages@ \ + >> "$out"/@sitePackages@/${name}-nix-python-$category.pth + fi + done + fi +} diff --git a/pkgs/by-name/py/python/wrapper.nix b/pkgs/by-name/py/python/wrapper.nix new file mode 100644 index 0000000..f5f9b03 --- /dev/null +++ b/pkgs/by-name/py/python/wrapper.nix @@ -0,0 +1,71 @@ +{ lib, stdenv, buildEnv, makeBinaryWrapper + +# manually pased +, python +, requiredPythonModules + +# extra opts +, extraLibs ? [] +, extraOutputsToInstall ? [] +, postBuild ? "" +, ignoreCollisions ? false +, permitUserSite ? false +# Wrap executables with the given argument. +, makeWrapperArgs ? [] +, }: + +# Create a python executable that knows about additional packages. +let + env = let + paths = requiredPythonModules (extraLibs ++ [ python ] ) ; + pythonPath = "${placeholder "out"}/${python.sitePackages}"; + pythonExecutable = "${placeholder "out"}/bin/${python.executable}"; + in buildEnv { + name = "${python.name}-env"; + + inherit paths; + inherit ignoreCollisions; + extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall; + + nativeBuildInputs = [ makeBinaryWrapper ]; + + postBuild = '' + if [ -L "$out/bin" ]; then + unlink "$out/bin" + fi + mkdir -p "$out/bin" + + for path in ${lib.concatStringsSep " " paths}; do + if [ -d "$path/bin" ]; then + cd "$path/bin" + for prg in *; do + if [ -f "$prg" ]; then + rm -f "$out/bin/$prg" + if [ -x "$prg" ]; then + makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set NIX_PYTHONPREFIX "$out" --set NIX_PYTHONEXECUTABLE ${pythonExecutable} --set NIX_PYTHONPATH ${pythonPath} ${lib.optionalString (!permitUserSite) ''--set PYTHONNOUSERSITE "true"''} ${lib.concatStringsSep " " makeWrapperArgs} + fi + fi + done + fi + done + '' + postBuild; + + inherit (python) meta; + + passthru = python.passthru // { + interpreter = "${env}/bin/${python.executable}"; + inherit python; + env = stdenv.mkDerivation { + name = "interactive-${python.name}-environment"; + nativeBuildInputs = [ env ]; + + buildCommand = '' + echo >&2 "" + echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***" + echo >&2 "" + exit 1 + ''; + }; + }; + }; +in env diff --git a/pkgs/by-name/qr/qrencode/default.nix b/pkgs/by-name/qr/qrencode/default.nix new file mode 100644 index 0000000..83c20fc --- /dev/null +++ b/pkgs/by-name/qr/qrencode/default.nix @@ -0,0 +1,51 @@ +{ lib, stdenv, fetchurl, pkg-config, SDL2, libpng, libiconv, libobjc }: + +stdenv.mkDerivation (finalAttrs: rec { + pname = "qrencode"; + version = "4.1.1"; + + outputs = [ "bin" "out" "man" "dev" ]; + + src = fetchurl { + url = "https://fukuchi.org/works/qrencode/qrencode-${version}.tar.gz"; + sha256 = "sha256-2kSO1PUqumvLDNSMrA3VG4aSvMxM0SdDFAL8pvgXHo4="; + }; + + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ libiconv libpng ] + ++ lib.optionals stdenv.isDarwin [ libobjc ]; + + nativeCheckInputs = [ SDL2 ]; + + doCheck = false; + + checkPhase = '' + runHook preCheck + + pushd tests + ./test_basic.sh + popd + + runHook postCheck + ''; + + passthru.tests = finalAttrs.finalPackage.overrideAttrs (_: { + configureFlags = [ "--with-tests" ]; + doCheck = true; + }); + + meta = with lib; { + homepage = "https://fukuchi.org/works/qrencode/"; + description = "C library for encoding data in a QR Code symbol"; + longDescription = '' + Libqrencode is a C library for encoding data in a QR Code symbol, + a kind of 2D symbology that can be scanned by handy terminals + such as a mobile phone with CCD. + ''; + license = licenses.lgpl21Plus; + maintainers = with maintainers; [ adolfogc yana ]; + platforms = platforms.all; + mainProgram = "qrencode"; + }; +}) diff --git a/pkgs/by-name/qr/qrencode/packages.nix b/pkgs/by-name/qr/qrencode/packages.nix new file mode 100644 index 0000000..d0483a6 --- /dev/null +++ b/pkgs/by-name/qr/qrencode/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + qrencode = callPackage ./. { + inherit (darwin) libobjc; + }; +} diff --git a/pkgs/by-name/qu/quictls/default.nix b/pkgs/by-name/qu/quictls/default.nix new file mode 100644 index 0000000..49dfc94 --- /dev/null +++ b/pkgs/by-name/qu/quictls/default.nix @@ -0,0 +1,186 @@ +{ + buildPackages +, cryptodev +, enableSSL2 ? false +, enableSSL3 ? false +, fetchFromGitHub +, lib +, makeWrapper +, perl +, removeReferencesTo +, static ? stdenv.hostPlatform.isStatic +, stdenv +, withCryptodev ? false +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "quictls"; + version = "3.1.5-quic1"; + + src = fetchFromGitHub { + owner = "quictls"; + repo = "openssl"; + rev = "cb6841b741544bfd8868c1641ce96a934985509e"; + hash = "sha256-oR46jefarUGmBYjjpEvtKFzIOgSXSy58cLdX+P5ocA8="; + }; + + patches = [ + ../openssl/3.0/nix-ssl-cert-file.patch + + # openssl will only compile in KTLS if the current kernel supports it. + # This patch disables build-time detection. + ../openssl/3.0/openssl-disable-kernel-detection.patch + + (if stdenv.hostPlatform.isDarwin + then ../openssl/use-etc-ssl-certs-darwin.patch + else ../openssl/use-etc-ssl-certs.patch) + ]; + + postPatch = '' + patchShebangs Configure + '' + # config is a configure script which is not installed. + + '' + substituteInPlace config --replace '/usr/bin/env' '${buildPackages.coreutils}/bin/env' + '' + lib.optionalString stdenv.hostPlatform.isMusl '' + substituteInPlace crypto/async/arch/async_posix.h \ + --replace '!defined(__ANDROID__) && !defined(__OpenBSD__)' \ + '!defined(__ANDROID__) && !defined(__OpenBSD__) && 0' + ''; + + nativeBuildInputs = [ + makeWrapper + perl + removeReferencesTo + ]; + + buildInputs = lib.optionals withCryptodev [ + cryptodev + ]; + + outputs = [ "bin" "dev" "out" "man" "doc" ]; + + setOutputFlags = false; + + separateDebugInfo = + !stdenv.hostPlatform.isDarwin && + !(stdenv.hostPlatform.useLLVM or false) && + stdenv.cc.isGNU; + + # TODO(@Ericson2314): Improve with mass rebuild + configurePlatforms = [ ]; + configureScript = { + armv5tel-linux = "./Configure linux-armv4 -march=armv5te"; + armv6l-linux = "./Configure linux-armv4 -march=armv6"; + armv7l-linux = "./Configure linux-armv4 -march=armv7-a"; + x86_64-darwin = "./Configure darwin64-x86_64-cc"; + aarch64-darwin = "./Configure darwin64-arm64-cc"; + x86_64-linux = "./Configure linux-x86_64"; + x86_64-solaris = "./Configure solaris64-x86_64-gcc"; + riscv64-linux = "./Configure linux64-riscv64"; + mips64el-linux = + if stdenv.hostPlatform.isMips64n64 + then "./Configure linux64-mips64" + else if stdenv.hostPlatform.isMips64n32 + then "./Configure linux-mips64" + else throw "unsupported ABI for ${stdenv.hostPlatform.system}"; + }.${stdenv.hostPlatform.system} or ( + if stdenv.hostPlatform == stdenv.buildPlatform + then "./config" + else if stdenv.hostPlatform.isBSD && stdenv.hostPlatform.isx86_64 + then "./Configure BSD-x86_64" + else if stdenv.hostPlatform.isBSD && stdenv.hostPlatform.isx86_32 + then "./Configure BSD-x86" + lib.optionalString stdenv.hostPlatform.isElf "-elf" + else if stdenv.hostPlatform.isBSD + then "./Configure BSD-generic${toString stdenv.hostPlatform.parsed.cpu.bits}" + else if stdenv.hostPlatform.isMinGW + then "./Configure mingw${lib.optionalString + (stdenv.hostPlatform.parsed.cpu.bits != 32) + (toString stdenv.hostPlatform.parsed.cpu.bits)}" + else if stdenv.hostPlatform.isLinux + then "./Configure linux-generic${toString stdenv.hostPlatform.parsed.cpu.bits}" + else if stdenv.hostPlatform.isiOS + then "./Configure ios${toString stdenv.hostPlatform.parsed.cpu.bits}-cross" + else + throw "Not sure what configuration to use for ${stdenv.hostPlatform.config}" + ); + + # OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags. + dontAddStaticConfigureFlags = true; + + configureFlags = [ + "shared" # "shared" builds both shared and static libraries + "--libdir=lib" + "--openssldir=etc/ssl" + ] ++ lib.optionals withCryptodev [ + "-DHAVE_CRYPTODEV" + "-DUSE_CRYPTODEV_DIGESTS" + ] ++ lib.optional enableSSL2 "enable-ssl2" + ++ lib.optional enableSSL3 "enable-ssl3" + # We select KTLS here instead of the configure-time detection (which we patch out). + # KTLS should work on FreeBSD 13+ as well, so we could enable it if someone tests it. + ++ lib.optional (stdenv.isLinux && lib.versionAtLeast finalAttrs.version "3.0.0") "enable-ktls" + ++ lib.optional stdenv.hostPlatform.isAarch64 "no-afalgeng" + # OpenSSL needs a specific `no-shared` configure flag. + # See https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_Options + # for a comprehensive list of configuration options. + ++ lib.optional static "no-shared" + # This introduces a reference to the CTLOG_FILE which is undesired when + # trying to build binaries statically. + ++ lib.optional static "no-ct"; + + makeFlags = [ + "MANDIR=$(man)/share/man" + # This avoids conflicts between man pages of openssl subcommands (for + # example 'ts' and 'err') man pages and their equivalent top-level + # command in other packages (respectively man-pages and moreutils). + # This is done in ubuntu and archlinux, and possiibly many other distros. + "MANSUFFIX=ssl" + ]; + + enableParallelBuilding = true; + + postInstall = (if static then '' + # OPENSSLDIR has a reference to self + ${removeReferencesTo}/bin/remove-references-to -t $out $out/lib/*.a + '' else '' + # If we're building dynamic libraries, then don't install static + # libraries. + if [ -n "$(echo $out/lib/*.so $out/lib/*.dylib $out/lib/*.dll)" ]; then + rm "$out/lib/"*.a + fi + '') + '' + mkdir -p $bin + mv $out/bin $bin/bin + + # c_rehash is a legacy perl script with the same functionality + # as `openssl rehash` + # this wrapper script is created to maintain backwards compatibility without + # depending on perl + makeWrapper $bin/bin/openssl $bin/bin/c_rehash \ + --add-flags "rehash" + + mkdir $dev + mv $out/include $dev/ + # remove dependency on Perl at runtime + rm -r $out/etc/ssl/misc + rmdir $out/etc/ssl/{certs,private} + ''; + + postFixup = lib.optionalString (!stdenv.hostPlatform.isWindows) '' + # Check to make sure the main output doesn't depend on perl + if grep -r '${buildPackages.perl}' $out; then + echo "Found an erroneous dependency on perl ^^^" >&2 + exit 1 + fi + ''; + + meta = { + changelog = "https://github.com/quictls/openssl/blob/${finalAttrs.src.rev}/CHANGES.md"; + description = "TLS/SSL and crypto library with QUIC APIs"; + homepage = "https://quictls.github.io"; + license = lib.licenses.openssl; + maintainers = with lib.maintainers; [ izorkin ]; + platforms = lib.platforms.all; + }; +}) diff --git a/pkgs/by-name/ra/rapidcheck/default.nix b/pkgs/by-name/ra/rapidcheck/default.nix new file mode 100644 index 0000000..68f2e5e --- /dev/null +++ b/pkgs/by-name/ra/rapidcheck/default.nix @@ -0,0 +1,50 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, unstableGitUpdater +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "rapidcheck"; + version = "unstable-2023-12-14"; + + src = fetchFromGitHub { + owner = "emil-e"; + repo = "rapidcheck"; + rev = "ff6af6fc683159deb51c543b065eba14dfcf329b"; + hash = "sha256-Ixz5RpY0n8Un/Pv4XoTfbs40+70iyMbkQUjDqoLaWOg="; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ cmake ]; + + cmakeFlags = [ + (lib.cmakeBool "BUILD_SHARED_LIBS" (!stdenv.hostPlatform.isStatic)) + (lib.cmakeBool "RC_INSTALL_ALL_EXTRAS" true) + ]; + + passthru = { + updateScript = unstableGitUpdater { }; + tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; + + meta = with lib; { + description = "A C++ framework for property based testing inspired by QuickCheck"; + inherit (finalAttrs.src.meta) homepage; + maintainers = with maintainers; [ ]; + license = licenses.bsd2; + pkgConfigModules = [ + "rapidcheck" + # Extras + "rapidcheck_boost" + "rapidcheck_boost_test" + "rapidcheck_catch" + "rapidcheck_doctest" + "rapidcheck_gtest" + ]; + platforms = platforms.all; + }; +}) diff --git a/pkgs/by-name/re/re2/default.nix b/pkgs/by-name/re/re2/default.nix new file mode 100644 index 0000000..bfed016 --- /dev/null +++ b/pkgs/by-name/re/re2/default.nix @@ -0,0 +1,75 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, ninja +, abseil-cpp +# for passthru.tests +# , chromium +# , grpc +# , haskellPackages +# , mercurial +# , python3Packages +}: + +stdenv.mkDerivation rec { + pname = "re2"; + version = "2024-03-01"; + + src = fetchFromGitHub { + owner = "google"; + repo = "re2"; + rev = version; + hash = "sha256-VuI9OsfGTdVywdyVfBrSzXSjbSfevne+YQ2oOz4R3DM="; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ cmake ninja ]; + + propagatedBuildInputs = [ abseil-cpp ]; + + postPatch = '' + substituteInPlace re2Config.cmake.in \ + --replace "\''${PACKAGE_PREFIX_DIR}/" "" + ''; + + # Needed for case-insensitive filesystems (i.e. MacOS) because a file named + # BUILD already exists. + cmakeBuildDir = "build_dir"; + + cmakeFlags = lib.optional (!stdenv.hostPlatform.isStatic) "-DBUILD_SHARED_LIBS:BOOL=ON"; + + # This installs a pkg-config definition. + postInstall = '' + pushd "$src" + make common-install prefix="$dev" SED_INPLACE="sed -i" + popd + ''; + + doCheck = true; + + # passthru.tests = { + # inherit + # chromium + # grpc + # mercurial; + # inherit (python3Packages) + # fb-re2 + # google-re2; + # haskell-re2 = haskellPackages.re2; + # }; + + meta = with lib; { + description = "A regular expression library"; + longDescription = '' + RE2 is a fast, safe, thread-friendly alternative to backtracking regular + expression engines like those used in PCRE, Perl, and Python. It is a C++ + library. + ''; + license = licenses.bsd3; + homepage = "https://github.com/google/re2"; + maintainers = with maintainers; [ azahi networkexception ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/re/re2c/default.nix b/pkgs/by-name/re/re2c/default.nix new file mode 100644 index 0000000..759a734 --- /dev/null +++ b/pkgs/by-name/re/re2c/default.nix @@ -0,0 +1,51 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook +, nix-update-script +, python3 + +# for passthru.tests +# , ninja +# , php +# , spamassassin +}: + +stdenv.mkDerivation rec { + pname = "re2c"; + version = "3.1"; + + src = fetchFromGitHub { + owner = "skvadrik"; + repo = "re2c"; + rev = version; + sha256 = "sha256-7zZdLby7HdNoURgdkg+xnlp6VDCACcyGCTtjM43OLd4="; + }; + + nativeBuildInputs = [ + autoreconfHook + python3 + ]; + + doCheck = true; + enableParallelBuilding = true; + + preCheck = '' + patchShebangs run_tests.py + ''; + + # passthru = { + # updateScript = nix-update-script { }; + # tests = { + # inherit ninja php spamassassin; + # }; + # }; + + meta = with lib; { + description = "Tool for writing very fast and very flexible scanners"; + homepage = "https://re2c.org"; + license = licenses.publicDomain; + platforms = platforms.all; + maintainers = with maintainers; [ thoughtpolice ]; + }; +} diff --git a/pkgs/by-name/re/readline/7.0.nix b/pkgs/by-name/re/readline/7.0.nix new file mode 100644 index 0000000..3b643a9 --- /dev/null +++ b/pkgs/by-name/re/readline/7.0.nix @@ -0,0 +1,63 @@ +{ fetchurl, lib, stdenv, ncurses +}: + +stdenv.mkDerivation rec { + pname = "readline"; + version = "7.0p${toString (builtins.length upstreamPatches)}"; + + src = fetchurl { + url = "mirror://gnu/readline/readline-${meta.branch}.tar.gz"; + sha256 = "0d13sg9ksf982rrrmv5mb6a2p4ys9rvg9r71d6il0vr8hmql63bm"; + }; + + outputs = [ "out" "dev" "man" "doc" "info" ]; + + strictDeps = true; + propagatedBuildInputs = [ ncurses ]; + + patchFlags = [ "-p0" ]; + + upstreamPatches = + (let + patch = nr: sha256: + fetchurl { + url = "mirror://gnu/readline/readline-${meta.branch}-patches/readline70-${nr}"; + inherit sha256; + }; + in + import ./readline-7.0-patches.nix patch); + + patches = + [ ./link-against-ncurses.patch + ./no-arch_only-6.3.patch + ] + ++ upstreamPatches; + + meta = with lib; { + description = "Library for interactive line editing"; + + longDescription = '' + The GNU Readline library provides a set of functions for use by + applications that allow users to edit command lines as they are + typed in. Both Emacs and vi editing modes are available. The + Readline library includes additional functions to maintain a + list of previously-entered command lines, to recall and perhaps + reedit those lines, and perform csh-like history expansion on + previous commands. + + The history facilities are also placed into a separate library, + the History library, as part of the build process. The History + library may be used without Readline in applications which + desire its capabilities. + ''; + + homepage = "https://savannah.gnu.org/projects/readline/"; + + license = licenses.gpl3Plus; + + maintainers = [ ]; + + platforms = platforms.unix; + branch = "7.0"; + }; +} diff --git a/pkgs/by-name/re/readline/8.2.nix b/pkgs/by-name/re/readline/8.2.nix new file mode 100644 index 0000000..72e3370 --- /dev/null +++ b/pkgs/by-name/re/readline/8.2.nix @@ -0,0 +1,96 @@ +{ lib, stdenv +, fetchpatch, fetchurl +, ncurses, termcap +, curses-library ? + if stdenv.hostPlatform.isWindows + then termcap + else ncurses +}: + +stdenv.mkDerivation rec { + pname = "readline"; + version = "8.2p${toString (builtins.length upstreamPatches)}"; + + src = fetchurl { + url = "mirror://gnu/readline/readline-${meta.branch}.tar.gz"; + sha256 = "sha256-P+txcfFqhO6CyhijbXub4QmlLAT0kqBTMx19EJUAfDU="; + }; + + outputs = [ "out" "dev" "man" "doc" "info" ]; + + strictDeps = true; + propagatedBuildInputs = [ curses-library ]; + + patchFlags = [ "-p0" ]; + + upstreamPatches = + (let + patch = nr: sha256: + fetchurl { + url = "mirror://gnu/readline/readline-${meta.branch}-patches/readline82-${nr}"; + inherit sha256; + }; + in + import ./readline-8.2-patches.nix patch); + + patches = lib.optionals (curses-library.pname == "ncurses") [ + ./link-against-ncurses.patch + ] ++ [ + ./no-arch_only-8.2.patch + ] + ++ upstreamPatches + ++ lib.optionals stdenv.hostPlatform.isWindows [ + (fetchpatch { + name = "0001-sigwinch.patch"; + url = "https://github.com/msys2/MINGW-packages/raw/90e7536e3b9c3af55c336d929cfcc32468b2f135/mingw-w64-readline/0001-sigwinch.patch"; + stripLen = 1; + hash = "sha256-sFK6EJrSNl0KLWqFv5zBXaQRuiQoYIZVoZfa8BZqfKA="; + }) + (fetchpatch { + name = "0002-event-hook.patch"; + url = "https://github.com/msys2/MINGW-packages/raw/3476319d2751a676b911f3de9e1ec675081c03b8/mingw-w64-readline/0002-event-hook.patch"; + stripLen = 1; + hash = "sha256-F8ytYuIjBtH83ZCJdf622qjwSw+wZEVyu53E/mPsoAo="; + }) + (fetchpatch { + name = "0003-fd_set.patch"; + url = "https://github.com/msys2/MINGW-packages/raw/35830ab27e5ed35c2a8d486961ab607109f5af50/mingw-w64-readline/0003-fd_set.patch"; + stripLen = 1; + hash = "sha256-UiaXZRPjKecpSaflBMCphI2kqOlcz1JkymlCrtpMng4="; + }) + (fetchpatch { + name = "0004-locale.patch"; + url = "https://github.com/msys2/MINGW-packages/raw/f768c4b74708bb397a77e3374cc1e9e6ef647f20/mingw-w64-readline/0004-locale.patch"; + stripLen = 1; + hash = "sha256-dk4343KP4EWXdRRCs8GRQlBgJFgu1rd79RfjwFD/nJc="; + }) + ]; + + meta = with lib; { + description = "Library for interactive line editing"; + + longDescription = '' + The GNU Readline library provides a set of functions for use by + applications that allow users to edit command lines as they are + typed in. Both Emacs and vi editing modes are available. The + Readline library includes additional functions to maintain a + list of previously-entered command lines, to recall and perhaps + reedit those lines, and perform csh-like history expansion on + previous commands. + + The history facilities are also placed into a separate library, + the History library, as part of the build process. The History + library may be used without Readline in applications which + desire its capabilities. + ''; + + homepage = "https://savannah.gnu.org/projects/readline/"; + + license = licenses.gpl3Plus; + + maintainers = with maintainers; [ dtzWill ]; + + platforms = platforms.unix ++ platforms.windows; + branch = "8.2"; + }; +} diff --git a/pkgs/by-name/re/readline/link-against-ncurses.patch b/pkgs/by-name/re/readline/link-against-ncurses.patch new file mode 100644 index 0000000..0fd0598 --- /dev/null +++ b/pkgs/by-name/re/readline/link-against-ncurses.patch @@ -0,0 +1,18 @@ +This patch is to make sure that `libncurses' is among the `NEEDED' +dependencies of `libreadline.so' and `libhistory.so'. + +Failing to do that, applications linking against Readline are +forced to explicitly link against libncurses as well; in addition, +this trick doesn't work when using GNU ld's `--as-needed'. + +--- shlib/Makefile.in 2009-01-06 18:03:22.000000000 +0100 ++++ shlib/Makefile.in 2009-07-27 14:43:25.000000000 +0200 +@@ -84,7 +84,7 @@ SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@ + SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@ + SHOBJ_LIBS = @SHOBJ_LIBS@ + +-SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ ++SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ -lncurses + SHLIB_LIBS = @SHLIB_LIBS@ + + SHLIB_DOT = @SHLIB_DOT@ diff --git a/pkgs/by-name/re/readline/no-arch_only-6.3.patch b/pkgs/by-name/re/readline/no-arch_only-6.3.patch new file mode 100644 index 0000000..7c46dba --- /dev/null +++ b/pkgs/by-name/re/readline/no-arch_only-6.3.patch @@ -0,0 +1,13 @@ +diff -ru -x '*~' readline-6.3-orig/support/shobj-conf readline-6.3/support/shobj-conf +--- support/shobj-conf 2014-02-24 03:06:29.000000000 +0100 ++++ support/shobj-conf 2014-07-22 11:18:52.000000000 +0200 +@@ -194,9 +194,6 @@ + # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4 + *) + case "${host_os}" in +- darwin[89]*|darwin1[012]*) +- SHOBJ_ARCHFLAGS='-arch_only `/usr/bin/arch`' +- ;; + *) # Mac OS X 10.9 (Mavericks) and later + SHOBJ_ARCHFLAGS= + # for 32 and 64bit universal library diff --git a/pkgs/by-name/re/readline/no-arch_only-8.2.patch b/pkgs/by-name/re/readline/no-arch_only-8.2.patch new file mode 100644 index 0000000..06f01ec --- /dev/null +++ b/pkgs/by-name/re/readline/no-arch_only-8.2.patch @@ -0,0 +1,13 @@ +diff -ru -x '*~' readline-6.3-orig/support/shobj-conf readline-6.3/support/shobj-conf +--- support/shobj-conf 2014-02-24 03:06:29.000000000 +0100 ++++ support/shobj-conf 2014-07-22 11:18:52.000000000 +0200 +@@ -159,9 +159,6 @@ + # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4 + *) + case "${host_os}" in +- darwin[89]*|darwin1[012]*) +- SHOBJ_ARCHFLAGS= +- ;; + *) # Mac OS X 10.9 (Mavericks) and later + SHOBJ_ARCHFLAGS= + # for 32 and 64bit universal library diff --git a/pkgs/by-name/re/readline/packages.nix b/pkgs/by-name/re/readline/packages.nix new file mode 100644 index 0000000..df19280 --- /dev/null +++ b/pkgs/by-name/re/readline/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + readline = readline82; + readline70 = callPackage ./7.0.nix { }; + readline82 = callPackage ./8.2.nix { }; +} diff --git a/pkgs/by-name/re/readline/readline-7.0-patches.nix b/pkgs/by-name/re/readline/readline-7.0-patches.nix new file mode 100644 index 0000000..c34ef2b --- /dev/null +++ b/pkgs/by-name/re/readline/readline-7.0-patches.nix @@ -0,0 +1,9 @@ +# Automatically generated by `update-patch-set.sh'; do not edit. + +patch: [ +(patch "001" "0xm3sxvwmss7ddyfb11n6pgcqd1aglnpy15g143vzcf75snb7hcs") +(patch "002" "0n1dxmqsbjgrfxb1hgk5c6lsraw4ncbnzxlsx7m35nym6lncjiw7") +(patch "003" "1027kmymniizcy0zbdlrczxfx3clxcdln5yq05q9yzlc6y9slhwy") +(patch "004" "0r3bbaf12iz8m02z6p3fzww2m365fhn71xmzab2p62gj54s6h9gr") +(patch "005" "0lxpa4f72y2nsgj6fgrhjk2nmmxvccys6aciwfxwchb5f21rq5fa") +] diff --git a/pkgs/by-name/re/readline/readline-8.2-patches.nix b/pkgs/by-name/re/readline/readline-8.2-patches.nix new file mode 100644 index 0000000..77d5c49 --- /dev/null +++ b/pkgs/by-name/re/readline/readline-8.2-patches.nix @@ -0,0 +1,14 @@ +# Automatically generated by `update-patch-set.sh'; do not edit. + +patch: [ +(patch "001" "1xxgfgr6hn3ads8m8xsrdi1kbx1f3s69k0danpd9x4haqhg7zydv") +(patch "002" "0ly0siy6qy3l7hv12847adpfa34yq1w4qz9qkw6vrxv25j106rg0") +(patch "003" "1c5cwvvkx9mfmpaapymq9cavmzh4fnagkjlchsqx4vml8sx8gx94") +(patch "004" "1b15sndx9v5vj3x1f3h73099nlagknx4rbfpd5ldrbw2xgm2wmvr") +(patch "005" "16ac25jz1a1mgkpfp1sydqf6qpsfh0s0dcmrnjpqbhg5va3s6av2") +(patch "006" "18gmh6y3klh0vv28cyqz4is3rlb32pl7f1kf5r482kfjq3w5zd67") +(patch "007" "1xmnpahs983n4w0gn3j0wr8nh1dpva33yj7fvfmhm46ph2wsa4ar") +(patch "008" "0smjjzhwxi2ibpdisnk53lh1pzgka6rhlqyh3662xy69v34ysxx1") +(patch "009" "05m1fwbs7mbs3pz3pg87gbbayandrrcgaqawzliqb6g1jbk8b61x") +(patch "010" "0k3vyrjs2g6y2cfs03l2gp37fhxgqpiwvxb1c7z4q88cbb32x3km") +] diff --git a/pkgs/by-name/re/readline/update-patch-set.sh b/pkgs/by-name/re/readline/update-patch-set.sh new file mode 120000 index 0000000..d4f5cd2 --- /dev/null +++ b/pkgs/by-name/re/readline/update-patch-set.sh @@ -0,0 +1 @@ +../../../shells/bash/update-patch-set.sh \ No newline at end of file diff --git a/pkgs/by-name/rh/rhash/default.nix b/pkgs/by-name/rh/rhash/default.nix new file mode 100644 index 0000000..e789eeb --- /dev/null +++ b/pkgs/by-name/rh/rhash/default.nix @@ -0,0 +1,51 @@ +{ lib +, stdenv +, fetchFromGitHub +, which +, enableStatic ? stdenv.hostPlatform.isStatic +}: + +stdenv.mkDerivation rec { + version = "1.4.4"; + pname = "rhash"; + + src = fetchFromGitHub { + owner = "rhash"; + repo = "RHash"; + rev = "v${version}"; + sha256 = "sha256-3CW41ULdXoID4cOgrcG2j85tgIJ/sz5hU7A83qpuxf4="; + }; + + nativeBuildInputs = [ which ]; + + # configure script is not autotools-based, doesn't support these options + dontAddStaticConfigureFlags = true; + + configurePlatforms = [ ]; + + configureFlags = [ + "--ar=${stdenv.cc.targetPrefix}ar" + "--target=${stdenv.hostPlatform.config}" + (lib.enableFeature enableStatic "static") + (lib.enableFeature enableStatic "lib-static") + ]; + + doCheck = true; + + checkTarget = "test-full"; + + installTargets = [ + "install" + "install-lib-headers" + ] ++ lib.optionals (!enableStatic) [ + "install-lib-so-link" + ]; + + meta = with lib; { + homepage = "https://rhash.sourceforge.net/"; + description = "Console utility and library for computing and verifying hash sums of files"; + license = licenses.bsd0; + platforms = platforms.all; + maintainers = with maintainers; [ andrewrk ]; + }; +} diff --git a/pkgs/by-name/rs/rsync/configure.ac-fix-failing-IPv6-check.patch b/pkgs/by-name/rs/rsync/configure.ac-fix-failing-IPv6-check.patch new file mode 100644 index 0000000..3305653 --- /dev/null +++ b/pkgs/by-name/rs/rsync/configure.ac-fix-failing-IPv6-check.patch @@ -0,0 +1,12 @@ +diff -rup rsync-3.2.7/configure.sh rsync-3.2.7-fixed/configure.sh +--- rsync-3.2.7/configure.sh 2022-10-20 17:57:22 ++++ rsync-3.2.7-fixed/configure.sh 2024-01-01 19:51:58 +@@ -7706,7 +7706,7 @@ else $as_nop + #include + #include + #include +-main() ++int main() + { + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); diff --git a/pkgs/by-name/rs/rsync/default.nix b/pkgs/by-name/rs/rsync/default.nix new file mode 100644 index 0000000..f2d59c9 --- /dev/null +++ b/pkgs/by-name/rs/rsync/default.nix @@ -0,0 +1,76 @@ +{ lib +, stdenv +, fetchurl +, perl +, libiconv +, zlib +, popt +, enableACLs ? lib.meta.availableOn stdenv.hostPlatform acl +, acl +, enableLZ4 ? true +, lz4 +, enableOpenSSL ? true +, openssl +, enableXXHash ? true +, xxHash +, enableZstd ? true +, zstd +# for passthru.tests +# , nixosTests +}: + +stdenv.mkDerivation rec { + pname = "rsync"; + version = "3.2.7"; + + src = fetchurl { + # signed with key 0048 C8B0 26D4 C96F 0E58 9C2F 6C85 9FB1 4B96 A8C5 + url = "mirror://samba/rsync/src/rsync-${version}.tar.gz"; + sha256 = "sha256-Tn2dP27RCHjFjF+3JKZ9rPS2qsc0CxPkiPstxBNG8rs="; + }; + + nativeBuildInputs = [ perl ]; + + patches = [ + # https://github.com/WayneD/rsync/issues/511#issuecomment-1774612577 + # original source: https://build.opensuse.org/package/view_file/network/rsync/rsync-fortified-strlcpy-fix.patch?expand=1&rev=3f8dd2f4a404c96c0f69176e60893714 + ./rsync-fortified-strlcpy-fix.patch + # https://github.com/WayneD/rsync/pull/558 + ./configure.ac-fix-failing-IPv6-check.patch + ]; + + buildInputs = [ libiconv zlib popt ] + ++ lib.optional enableACLs acl + ++ lib.optional enableZstd zstd + ++ lib.optional enableLZ4 lz4 + ++ lib.optional enableOpenSSL openssl + ++ lib.optional enableXXHash xxHash; + + configureFlags = [ + "--with-nobody-group=nogroup" + + # disable the included zlib explicitly as it otherwise still compiles and + # links them even. + "--with-included-zlib=no" + ] ++ lib.optionals (stdenv.hostPlatform.isMusl && stdenv.hostPlatform.isx86_64) [ + # fix `multiversioning needs 'ifunc' which is not supported on this target` error + "--disable-roll-simd" + ] ++ lib.optionals (!enableZstd) [ + "--disable-zstd" + ] ++ lib.optionals (!enableXXHash) [ + "--disable-xxhash" + ]; + + enableParallelBuilding = true; + + # passthru.tests = { inherit (nixosTests) rsyncd; }; + + meta = with lib; { + description = "Fast incremental file transfer utility"; + homepage = "https://rsync.samba.org/"; + license = licenses.gpl3Plus; + mainProgram = "rsync"; + maintainers = with lib.maintainers; [ ehmry kampfschlaefer ivan ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/rs/rsync/packages.nix b/pkgs/by-name/rs/rsync/packages.nix new file mode 100644 index 0000000..895efbe --- /dev/null +++ b/pkgs/by-name/rs/rsync/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + rsync = callPackage ./. (config.rsync or { }); + rrsync = callPackage ./rrsync.nix { }; +} diff --git a/pkgs/by-name/rs/rsync/rrsync.nix b/pkgs/by-name/rs/rsync/rrsync.nix new file mode 100644 index 0000000..09f9ab2 --- /dev/null +++ b/pkgs/by-name/rs/rsync/rrsync.nix @@ -0,0 +1,31 @@ +{ stdenv, python3, rsync }: + +stdenv.mkDerivation { + pname = "rrsync"; + inherit (rsync) version src; + + buildInputs = [ + rsync + (python3.withPackages (pythonPackages: with pythonPackages; [ braceexpand ])) + ]; + # Skip configure and build phases. + # We just want something from the support directory + dontConfigure = true; + dontBuild = true; + + inherit (rsync) patches; + + postPatch = '' + substituteInPlace support/rrsync --replace /usr/bin/rsync ${rsync}/bin/rsync + ''; + + installPhase = '' + mkdir -p $out/bin + cp support/rrsync $out/bin + chmod a+x $out/bin/rrsync + ''; + + meta = rsync.meta // { + description = "A helper to run rsync-only environments from ssh-logins"; + }; +} diff --git a/pkgs/by-name/rs/rsync/rsync-fortified-strlcpy-fix.patch b/pkgs/by-name/rs/rsync/rsync-fortified-strlcpy-fix.patch new file mode 100644 index 0000000..296445b --- /dev/null +++ b/pkgs/by-name/rs/rsync/rsync-fortified-strlcpy-fix.patch @@ -0,0 +1,49 @@ +From 1f83963f59960150e8c46112daa8411324c1f209 Mon Sep 17 00:00:00 2001 +From: Jiri Slaby +Date: Fri, 18 Aug 2023 08:26:20 +0200 +Subject: [PATCH] exclude: fix crashes with fortified strlcpy() + +Fortified (-D_FORTIFY_SOURCE=2 for gcc) builds make strlcpy() crash when +its third parameter (size) is larger than the buffer: + $ rsync -FFXHav '--filter=merge global-rsync-filter' Align-37-43/ xxx + sending incremental file list + *** buffer overflow detected ***: terminated + +It's in the exclude code in setup_merge_file(): + strlcpy(y, save, MAXPATHLEN); + +Note the 'y' pointer was incremented, so it no longer points to memory +with MAXPATHLEN "owned" bytes. + +Fix it by remembering the number of copied bytes into the 'save' buffer +and use that instead of MAXPATHLEN which is clearly incorrect. + +Fixes #511. +--- + exclude.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/exclude.c b/exclude.c +index ffe55b167..1a5de3b9e 100644 +--- a/exclude.c ++++ b/exclude.c +@@ -720,7 +720,8 @@ static BOOL setup_merge_file(int mergelist_num, filter_rule *ex, + parent_dirscan = True; + while (*y) { + char save[MAXPATHLEN]; +- strlcpy(save, y, MAXPATHLEN); ++ /* copylen is strlen(y) which is < MAXPATHLEN. +1 for \0 */ ++ size_t copylen = strlcpy(save, y, MAXPATHLEN) + 1; + *y = '\0'; + dirbuf_len = y - dirbuf; + strlcpy(x, ex->pattern, MAXPATHLEN - (x - buf)); +@@ -734,7 +735,7 @@ static BOOL setup_merge_file(int mergelist_num, filter_rule *ex, + lp->head = NULL; + } + lp->tail = NULL; +- strlcpy(y, save, MAXPATHLEN); ++ strlcpy(y, save, copylen); + while ((*x++ = *y++) != '/') {} + } + parent_dirscan = False; + diff --git a/pkgs/by-name/rt/rtmpdump/default.nix b/pkgs/by-name/rt/rtmpdump/default.nix new file mode 100644 index 0000000..b6293ff --- /dev/null +++ b/pkgs/by-name/rt/rtmpdump/default.nix @@ -0,0 +1,58 @@ +{ lib +, stdenv +, fetchgit +, fetchpatch +, zlib +, gnutlsSupport ? false +, gnutls +, nettle +, opensslSupport ? true +, openssl +}: + +assert (gnutlsSupport || opensslSupport); + +stdenv.mkDerivation { + pname = "rtmpdump"; + version = "unstable-2021-02-19"; + + src = fetchgit { + url = "git://git.ffmpeg.org/rtmpdump"; + # Currently the latest commit is used (a release has not been made since 2011, i.e. '2.4') + rev = "f1b83c10d8beb43fcc70a6e88cf4325499f25857"; + sha256 = "0vchr0f0d5fi0zaa16jywva5db3x9dyws7clqaq32gwh5drbkvs0"; + }; + + patches = [ + # Fix build with OpenSSL 1.1 + (fetchpatch { + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/media-video/rtmpdump/files/rtmpdump-openssl-1.1.patch?id=1e7bef484f96e7647f5f0911d3c8caa48131c33b"; + sha256 = "1wds98pk8qr7shkfl8k49iirxiwd972h18w84bamiqln29wv6ql1"; + }) + ]; + + makeFlags = [ + "prefix=$(out)" + "CROSS_COMPILE=${stdenv.cc.targetPrefix}" + ] + ++ lib.optional gnutlsSupport "CRYPTO=GNUTLS" + ++ lib.optional opensslSupport "CRYPTO=OPENSSL" + ++ lib.optional stdenv.isDarwin "SYS=darwin" + ++ lib.optional stdenv.cc.isClang "CC=clang"; + + propagatedBuildInputs = [ zlib ] + ++ lib.optionals gnutlsSupport [ gnutls nettle ] + ++ lib.optional opensslSupport openssl; + + outputs = [ "out" "dev" ]; + + separateDebugInfo = true; + + meta = with lib; { + description = "Toolkit for RTMP streams"; + homepage = "https://rtmpdump.mplayerhq.hu/"; + license = licenses.gpl2; + platforms = platforms.unix; + maintainers = with maintainers; [ codyopel ]; + }; +} diff --git a/pkgs/by-name/rt/rtmpdump/packages.nix b/pkgs/by-name/rt/rtmpdump/packages.nix new file mode 100644 index 0000000..4a568bc --- /dev/null +++ b/pkgs/by-name/rt/rtmpdump/packages.nix @@ -0,0 +1,8 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + rtmpdump = callPackage ./. { }; + rtmpdump_gnutls = rtmpdump.override { gnutlsSupport = true; opensslSupport = false; }; +} diff --git a/pkgs/by-name/ru/rust-audit-info/default.nix b/pkgs/by-name/ru/rust-audit-info/default.nix new file mode 100644 index 0000000..afd53df --- /dev/null +++ b/pkgs/by-name/ru/rust-audit-info/default.nix @@ -0,0 +1,21 @@ +{ lib, rustPlatform, fetchCrate }: + +rustPlatform.buildRustPackage rec { + pname = "rust-audit-info"; + version = "0.5.2"; + + src = fetchCrate { + inherit pname version; + sha256 = "sha256-g7ElNehBAVSRRlqsxkNm20C0KOMkf310bXNs3EN+/NQ="; + }; + + cargoSha256 = "sha256-bKrdgz6dyv/PF5JXMq7uvsh7SsK/qEd2W7tm6+YYlxg="; + + meta = with lib; { + description = "A command-line tool to extract the dependency trees embedded in binaries by cargo-auditable"; + mainProgram = "rust-audit-info"; + homepage = "https://github.com/rust-secure-code/cargo-auditable/tree/master/rust-audit-info"; + license = with licenses; [ mit /* or */ asl20 ]; + maintainers = with maintainers; [ figsoda ]; + }; +} diff --git a/pkgs/by-name/ru/rust/1_77.nix b/pkgs/by-name/ru/rust/1_77.nix new file mode 100644 index 0000000..ec65c85 --- /dev/null +++ b/pkgs/by-name/ru/rust/1_77.nix @@ -0,0 +1,60 @@ +# New rust versions should first go to staging. +# Things to check after updating: +# 1. Rustc should produce rust binaries on x86_64-linux, aarch64-linux and x86_64-darwin: +# i.e. nix-shell -p fd or @GrahamcOfBorg build fd on github +# This testing can be also done by other volunteers as part of the pull +# request review, in case platforms cannot be covered. +# 2. The LLVM version used for building should match with rust upstream. +# Check the version number in the src/llvm-project git submodule in: +# https://github.com/rust-lang/rust/blob//.gitmodules +# 3. Firefox and Thunderbird should still build on x86_64-linux. + +{ stdenv, lib +, newScope, callPackage +, CoreFoundation, Security, SystemConfiguration +, pkgsBuildTarget, pkgsBuildBuild, pkgsBuildHost, pkgsTargetTarget +, makeRustPlatform +, wrapRustcWith +, llvmPackages_17, llvm_17 +, path +} @ args: + +import ./default.nix { + rustcVersion = "1.77.1"; + rustcSha256 = "7hBuTFafUtujtbKCsQWCD4a9j2s9CcBrjc6C+xuzpKE="; + + llvmSharedForBuild = pkgsBuildBuild.llvmPackages_17.libllvm.override { enableSharedLibraries = true; }; + llvmSharedForHost = pkgsBuildHost.llvmPackages_17.libllvm.override { enableSharedLibraries = true; }; + llvmSharedForTarget = pkgsBuildTarget.llvmPackages_17.libllvm.override { enableSharedLibraries = true; }; + + # For use at runtime + llvmShared = llvm_17.override { enableSharedLibraries = true; }; + + # Expose llvmPackages used for rustc from rustc via passthru for LTO in Firefox + llvmPackages = llvmPackages_17; + + # Note: the version MUST be one version prior to the version we're + # building + bootstrapVersion = "1.76.0"; + + # fetch hashes by running `print-hashes.sh ${bootstrapVersion}` + bootstrapHashes = { + i686-unknown-linux-gnu = "4c3eefc9341b8809235e6c4fbcbc19ab52a5cbe771292c400df068c12984fa3e"; + x86_64-unknown-linux-gnu = "9d589d2036b503cc45ecc94992d616fb3deec074deb36cacc2f5c212408f7399"; + x86_64-unknown-linux-musl = "aa8568f4d262468aaf4f622bd421c5435b24454d8fbcdae48da1162962205384"; + arm-unknown-linux-gnueabihf = "7d1da067362fc64bcad198d90a61e024d5712aed76e17b28e1cd7e8ba263cc6f"; + armv7-unknown-linux-gnueabihf = "c03346d56d4a860cd3a8d2d2a7ea75c510b68204e3ad97b3770076595261c913"; + aarch64-unknown-linux-gnu = "2e8313421e8fb673efdf356cdfdd4bc16516f2610d4f6faa01327983104c05a0"; + aarch64-unknown-linux-musl = "a1d1c8ccb8ea00cfa2b79d80411b8eb22b2bef5214f86536825361e98d7c617a"; + x86_64-apple-darwin = "7bdbe085695df8e46389115e99eda7beed37a9494f6b961b45554c658e53b8e7"; + aarch64-apple-darwin = "17496f15c3cb6ff73d5c36f5b54cc110f1ac31fa09521a7991c0d7ddd890dceb"; + powerpc64le-unknown-linux-gnu = "44b3494675284d26b04747a824dc974e32fd8fd46fc0aa06a7c8ebe851332d2c"; + riscv64gc-unknown-linux-gnu = "4a9db321874fc441235b71eb8aa295fc50251305e461540b25b4eef89fb56255"; + }; + + selectRustPackage = pkgs: pkgs.rust_1_77; + + rustcPatches = [ ]; +} + +(builtins.removeAttrs args [ "llvmPackages_17" "llvm_17"]) diff --git a/pkgs/by-name/ru/rust/binary.nix b/pkgs/by-name/ru/rust/binary.nix new file mode 100644 index 0000000..c546e27 --- /dev/null +++ b/pkgs/by-name/ru/rust/binary.nix @@ -0,0 +1,100 @@ +{ lib, stdenv, makeWrapper, wrapRustc, bash, curl, darwin, zlib +, autoPatchelfHook, gcc +, version +, src +, platform +, versionType +}: + +let + inherit (lib) optionalString; + inherit (darwin.apple_sdk.frameworks) Security; + + bootstrapping = versionType == "bootstrap"; + + installComponents + = "rustc,rust-std-${platform}" + + (optionalString bootstrapping ",cargo") + ; +in + +rec { + rustc-unwrapped = stdenv.mkDerivation { + pname = "rustc-${versionType}"; + + inherit version; + inherit src; + + meta = with lib; { + homepage = "https://www.rust-lang.org/"; + sourceProvenance = with sourceTypes; [ binaryNativeCode ]; + description = "A safe, concurrent, practical language"; + maintainers = with maintainers; [ qknight ]; + license = [ licenses.mit licenses.asl20 ]; + }; + + nativeBuildInputs = lib.optional (!stdenv.isDarwin) autoPatchelfHook; + buildInputs = [ bash ] + ++ lib.optionals (!stdenv.isDarwin) [ gcc.cc.lib zlib ] + ++ lib.optional stdenv.isDarwin Security; + + postPatch = '' + patchShebangs . + ''; + + installPhase = '' + ./install.sh --prefix=$out \ + --components=${installComponents} + + # Do NOT, I repeat, DO NOT use `wrapProgram` on $out/bin/rustc + # (or similar) here. It causes strange effects where rustc loads + # the wrong libraries in a bootstrap-build causing failures that + # are very hard to track down. For details, see + # https://github.com/rust-lang/rust/issues/34722#issuecomment-232164943 + ''; + + # The strip tool in cctools 973.0.1 and up appears to break rlibs in the + # binaries. The lib.rmeta object inside the ar archive should contain an + # .rmeta section, but it is removed. Luckily, this doesn't appear to be an + # issue for Rust builds produced by Nix. + dontStrip = true; + + setupHooks = ./setup-hook.sh; + }; + + rustc = wrapRustc rustc-unwrapped; + + cargo = stdenv.mkDerivation { + pname = "cargo-${versionType}"; + + inherit version; + inherit src; + + meta = with lib; { + homepage = "https://doc.rust-lang.org/cargo/"; + sourceProvenance = with sourceTypes; [ binaryNativeCode ]; + description = "The Rust package manager"; + maintainers = with maintainers; [ qknight ]; + license = [ licenses.mit licenses.asl20 ]; + }; + + nativeBuildInputs = [ makeWrapper ] + ++ lib.optional (!stdenv.isDarwin) autoPatchelfHook; + buildInputs = [ bash ] + ++ lib.optional (!stdenv.isDarwin) gcc.cc.lib + ++ lib.optional stdenv.isDarwin Security; + + postPatch = '' + patchShebangs . + ''; + + installPhase = '' + patchShebangs ./install.sh + ./install.sh --prefix=$out \ + --components=cargo + + wrapProgram "$out/bin/cargo" \ + --suffix PATH : "${rustc}/bin" + ''; + }; +} diff --git a/pkgs/by-name/ru/rust/bootstrap.nix b/pkgs/by-name/ru/rust/bootstrap.nix new file mode 100644 index 0000000..97ac692 --- /dev/null +++ b/pkgs/by-name/ru/rust/bootstrap.nix @@ -0,0 +1,14 @@ +{ stdenv, fetchurl, callPackage, version, hashes }: + +let + platform = stdenv.hostPlatform.rust.rustcTarget; + + src = fetchurl { + url = "https://static.rust-lang.org/dist/rust-${version}-${platform}.tar.gz"; + sha256 = hashes.${platform} or (throw "missing bootstrap url for platform ${platform}"); + }; + +in callPackage ./binary.nix + { inherit version src platform; + versionType = "bootstrap"; + } diff --git a/pkgs/by-name/ru/rust/cargo-auditable-cargo-wrapper.nix b/pkgs/by-name/ru/rust/cargo-auditable-cargo-wrapper.nix new file mode 100644 index 0000000..6e982ae --- /dev/null +++ b/pkgs/by-name/ru/rust/cargo-auditable-cargo-wrapper.nix @@ -0,0 +1,24 @@ +{ lib, runCommand, makeBinaryWrapper, rust-audit-info, cargo, cargo-auditable }: + +if cargo-auditable.meta.broken then + cargo +else +runCommand "auditable-${cargo.name}" { + nativeBuildInputs = [ makeBinaryWrapper ]; + + passthru.tests = runCommand "rust-audit-info-test" { + nativeBuildInputs = [ rust-audit-info ]; + } '' + rust-audit-info ${lib.getBin rust-audit-info}/bin/rust-audit-info > $out + ''; + + meta = cargo-auditable.meta // { + mainProgram = "cargo"; + }; +} '' + mkdir -p $out/bin + makeWrapper ${cargo}/bin/cargo $out/bin/cargo \ + --set CARGO_AUDITABLE_IGNORE_UNSUPPORTED 1 \ + --prefix PATH : ${lib.makeBinPath [ cargo cargo-auditable ]} \ + --add-flags auditable +'' diff --git a/pkgs/by-name/ru/rust/cargo-auditable.nix b/pkgs/by-name/ru/rust/cargo-auditable.nix new file mode 100644 index 0000000..1cf765b --- /dev/null +++ b/pkgs/by-name/ru/rust/cargo-auditable.nix @@ -0,0 +1,65 @@ +{ lib, buildPackages, fetchFromGitHub, fetchpatch, makeRustPlatform, installShellFiles, stdenv }: + +let + args = rec { + pname = "cargo-auditable"; + version = "0.6.2"; + + src = fetchFromGitHub { + owner = "rust-secure-code"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-ERIzx9Fveanq7/aWcB2sviTxIahvSu0sTwgpGf/aYE8="; + }; + + patches = [ + (fetchpatch { + name = "rust-1.77-tests.patch"; + url = "https://github.com/rust-secure-code/cargo-auditable/commit/5317a27244fc428335c4e7a1d066ae0f65f0d496.patch"; + hash = "sha256-UblGseiSC/2eE4rcnTgYzxAMrutHFSdxKTHqKj1mX5o="; + }) + ]; + + cargoHash = "sha256-4o3ctun/8VcBRuj+j0Yaawdkyn6Z6LPp+FTyhPxQWU8="; + + # Cargo.lock is outdated + preConfigure = '' + cargo update --offline + ''; + + meta = with lib; { + description = "A tool to make production Rust binaries auditable"; + mainProgram = "cargo-auditable"; + homepage = "https://github.com/rust-secure-code/cargo-auditable"; + changelog = "https://github.com/rust-secure-code/cargo-auditable/blob/v${version}/cargo-auditable/CHANGELOG.md"; + license = with licenses; [ mit /* or */ asl20 ]; + maintainers = with maintainers; [ figsoda ]; + broken = stdenv.hostPlatform != stdenv.buildPlatform; + }; + }; + + rustPlatform = makeRustPlatform { + inherit (buildPackages) rustc; + cargo = buildPackages.cargo.override { + auditable = false; + }; + }; + + bootstrap = rustPlatform.buildRustPackage (args // { + auditable = false; + }); +in + +rustPlatform.buildRustPackage.override { cargo-auditable = bootstrap; } (args // { + nativeBuildInputs = [ + installShellFiles + ]; + + postInstall = '' + installManPage cargo-auditable/cargo-auditable.1 + ''; + + passthru = { + inherit bootstrap; + }; +}) diff --git a/pkgs/by-name/ru/rust/cargo.nix b/pkgs/by-name/ru/rust/cargo.nix new file mode 100644 index 0000000..b0c40c5 --- /dev/null +++ b/pkgs/by-name/ru/rust/cargo.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, pkgsBuildHost, pkgsHostHost +, file, curl, pkg-config, python3, openssl, cmake, zlib +, installShellFiles, makeWrapper, rustPlatform, rustc +, CoreFoundation, Security +, auditable ? !cargo-auditable.meta.broken +, cargo-auditable +, pkgsBuildBuild +}: + +rustPlatform.buildRustPackage.override { + cargo-auditable = cargo-auditable.bootstrap; +} ({ + pname = "cargo"; + inherit (rustc.unwrapped) version src; + + # the rust source tarball already has all the dependencies vendored, no need to fetch them again + cargoVendorDir = "vendor"; + buildAndTestSubdir = "src/tools/cargo"; + + inherit auditable; + + passthru = { + rustc = rustc; + inherit (rustc.unwrapped) tests; + }; + + # changes hash of vendor directory otherwise + dontUpdateAutotoolsGnuConfigScripts = true; + + nativeBuildInputs = [ + pkg-config cmake installShellFiles makeWrapper + (lib.getDev pkgsHostHost.curl) + zlib + ]; + buildInputs = [ file curl python3 openssl zlib ] + ++ lib.optionals stdenv.isDarwin [ CoreFoundation Security ]; + + # cargo uses git-rs which is made for a version of libgit2 from recent master that + # is not compatible with the current version in nixpkgs. + #LIBGIT2_SYS_USE_PKG_CONFIG = 1; + + # fixes: the cargo feature `edition` requires a nightly version of Cargo, but this is the `stable` channel + RUSTC_BOOTSTRAP = 1; + + postInstall = '' + wrapProgram "$out/bin/cargo" --suffix PATH : "${rustc}/bin" + + installManPage src/tools/cargo/src/etc/man/* + + installShellCompletion --bash --name cargo \ + src/tools/cargo/src/etc/cargo.bashcomp.sh + + installShellCompletion --zsh src/tools/cargo/src/etc/_cargo + ''; + + checkPhase = '' + # Disable cross compilation tests + export CFG_DISABLE_CROSS_TESTS=1 + cargo test + ''; + + # Disable check phase as there are failures (4 tests fail) + doCheck = false; + + doInstallCheck = !stdenv.hostPlatform.isStatic && stdenv.hostPlatform.isElf; + installCheckPhase = '' + runHook preInstallCheck + readelf -a $out/bin/.cargo-wrapped | grep -F 'Shared library: [libcurl.so' + runHook postInstallCheck + ''; + + meta = with lib; { + homepage = "https://crates.io"; + description = "Downloads your Rust project's dependencies and builds your project"; + mainProgram = "cargo"; + maintainers = teams.rust.members; + license = [ licenses.mit licenses.asl20 ]; + platforms = platforms.unix; + # https://github.com/alexcrichton/nghttp2-rs/issues/2 + broken = stdenv.hostPlatform.isx86 && stdenv.buildPlatform != stdenv.hostPlatform; + }; +} +// lib.optionalAttrs (stdenv.buildPlatform.rust.rustcTarget != stdenv.hostPlatform.rust.rustcTarget) { + HOST_PKG_CONFIG_PATH="${pkgsBuildBuild.pkg-config}/bin/pkg-config"; +}) diff --git a/pkgs/by-name/ru/rust/cargo_cross.nix b/pkgs/by-name/ru/rust/cargo_cross.nix new file mode 100644 index 0000000..ba7651e --- /dev/null +++ b/pkgs/by-name/ru/rust/cargo_cross.nix @@ -0,0 +1,14 @@ +{ runCommand, stdenv, lib, pkgsBuildBuild, makeShellWrapper, rustc, ... }: + +runCommand "${stdenv.targetPlatform.config}-cargo-${lib.getVersion pkgsBuildBuild.cargo}" { + # Use depsBuildBuild or it tries to use target-runtimeShell + depsBuildBuild = [ makeShellWrapper ]; + + inherit (pkgsBuildBuild.cargo) meta; +} '' + mkdir -p $out/bin + ln -s ${pkgsBuildBuild.cargo}/share $out/share + + makeWrapper "${pkgsBuildBuild.cargo}/bin/cargo" "$out/bin/cargo" \ + --prefix PATH : "${rustc}/bin" + '' diff --git a/pkgs/by-name/ru/rust/clippy.nix b/pkgs/by-name/ru/rust/clippy.nix new file mode 100644 index 0000000..d9506a4 --- /dev/null +++ b/pkgs/by-name/ru/rust/clippy.nix @@ -0,0 +1,46 @@ +{ stdenv, lib, rustPlatform, rustc, Security, patchelf }: + +rustPlatform.buildRustPackage { + pname = "clippy"; + inherit (rustc) version src; + + separateDebugInfo = true; + + # the rust source tarball already has all the dependencies vendored, no need to fetch them again + cargoVendorDir = "vendor"; + buildAndTestSubdir = "src/tools/clippy"; + + # changes hash of vendor directory otherwise + dontUpdateAutotoolsGnuConfigScripts = true; + + buildInputs = [ rustc.llvm ] + ++ lib.optionals stdenv.isDarwin [ Security ]; + + # fixes: error: the option `Z` is only accepted on the nightly compiler + RUSTC_BOOTSTRAP = 1; + + # Without disabling the test the build fails with: + # error: failed to run custom build command for `rustc_llvm v0.0.0 + # (/private/tmp/nix-build-clippy-1.36.0.drv-0/rustc-1.36.0-src/src/librustc_llvm) + doCheck = false; + + # Clippy uses the rustc_driver and std private libraries, and Rust's build process forces them to have + # an install name of `@rpath/...` [0] [1] instead of the standard on macOS, which is an absolute path + # to itself. + # + # [0]: https://github.com/rust-lang/rust/blob/f77f4d55bdf9d8955d3292f709bd9830c2fdeca5/src/bootstrap/builder.rs#L1543 + # [1]: https://github.com/rust-lang/rust/blob/f77f4d55bdf9d8955d3292f709bd9830c2fdeca5/compiler/rustc_codegen_ssa/src/back/linker.rs#L323-L331 + preFixup = lib.optionalString stdenv.isDarwin '' + install_name_tool -add_rpath "${rustc.unwrapped}/lib" "$out/bin/clippy-driver" + install_name_tool -add_rpath "${rustc.unwrapped}/lib" "$out/bin/cargo-clippy" + ''; + + meta = with lib; { + homepage = "https://rust-lang.github.io/rust-clippy/"; + description = "A bunch of lints to catch common mistakes and improve your Rust code"; + mainProgram = "cargo-clippy"; + maintainers = with maintainers; [ basvandijk ] ++ teams.rust.members; + license = with licenses; [ mit asl20 ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/by-name/ru/rust/default.nix b/pkgs/by-name/ru/rust/default.nix new file mode 100644 index 0000000..77f1cd9 --- /dev/null +++ b/pkgs/by-name/ru/rust/default.nix @@ -0,0 +1,107 @@ +{ rustcVersion +, rustcSha256 +, enableRustcDev ? true +, bootstrapVersion +, bootstrapHashes +, selectRustPackage +, rustcPatches ? [] +, llvmShared +, llvmSharedForBuild +, llvmSharedForHost +, llvmSharedForTarget +, llvmPackages # Exposed through rustc for LTO in Firefox +}: +{ stdenv, lib +, newScope, callPackage +, CoreFoundation, Security, SystemConfiguration +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsTargetTarget +, makeRustPlatform +, wrapRustcWith +, path +}: + +let + # Use `import` to make sure no packages sneak in here. + lib' = import (path + /pkgs/build-support/rust/lib) { + inherit lib stdenv pkgsBuildHost pkgsBuildTarget pkgsTargetTarget; + }; + # Allow faster cross compiler generation by reusing Build artifacts + fastCross = (stdenv.buildPlatform == stdenv.hostPlatform) && (stdenv.hostPlatform != stdenv.targetPlatform); +in +{ + lib = lib'; + + # Backwards compat before `lib` was factored out. + inherit (lib') toTargetArch toTargetOs toRustTarget toRustTargetSpec IsNoStdTarget toRustTargetForUseInEnvVars envVars; + + # This just contains tools for now. But it would conceivably contain + # libraries too, say if we picked some default/recommended versions to build + # by Hydra. + # + # In the end game, rustc, the rust standard library (`core`, `std`, etc.), + # and cargo would themselves be built with `buildRustCreate` like + # everything else. Tools and `build.rs` and procedural macro dependencies + # would be taken from `buildRustPackages` (and `bootstrapRustPackages` for + # anything provided prebuilt or their build-time dependencies to break + # cycles / purify builds). In this way, nixpkgs would be in control of all + # bootstrapping. + packages = { + prebuilt = callPackage ./bootstrap.nix { + version = bootstrapVersion; + hashes = bootstrapHashes; + }; + stable = lib.makeScope newScope (self: let + # Like `buildRustPackages`, but may also contain prebuilt binaries to + # break cycle. Just like `bootstrapTools` for nixpkgs as a whole, + # nothing in the final package set should refer to this. + bootstrapRustPackages = if fastCross + then pkgsBuildBuild.rustPackages + else + self.buildRustPackages.overrideScope (_: _: + lib.optionalAttrs (stdenv.buildPlatform == stdenv.hostPlatform) + (selectRustPackage pkgsBuildHost).packages.prebuilt); + bootRustPlatform = makeRustPlatform bootstrapRustPackages; + in { + # Packages suitable for build-time, e.g. `build.rs`-type stuff. + buildRustPackages = (selectRustPackage pkgsBuildHost).packages.stable // { __attrsFailEvaluation = true; }; + # Analogous to stdenv + rustPlatform = makeRustPlatform self.buildRustPackages; + rustc-unwrapped = self.callPackage ./rustc.nix ({ + version = rustcVersion; + sha256 = rustcSha256; + inherit enableRustcDev; + inherit llvmShared llvmSharedForBuild llvmSharedForHost llvmSharedForTarget llvmPackages fastCross; + + patches = rustcPatches; + + # Use boot package set to break cycle + inherit (bootstrapRustPackages) cargo rustc rustfmt; + }); + rustc = wrapRustcWith { + inherit (self) rustc-unwrapped; + sysroot = if fastCross then self.rustc-unwrapped else null; + }; + rustfmt = self.callPackage ./rustfmt.nix { + inherit Security; + inherit (self.buildRustPackages) rustc; + }; + cargo = if (!fastCross) then self.callPackage ./cargo.nix { + # Use boot package set to break cycle + rustPlatform = bootRustPlatform; + inherit CoreFoundation Security; + } else self.callPackage ./cargo_cross.nix {}; + cargo-auditable = self.callPackage ./cargo-auditable.nix { }; + cargo-auditable-cargo-wrapper = self.callPackage ./cargo-auditable-cargo-wrapper.nix { }; + clippy = self.callPackage ./clippy.nix { + # We want to use self, not buildRustPackages, so that + # buildPackages.clippy uses the cross compiler and supports + # linting for the target platform. + rustPlatform = makeRustPlatform self; + inherit Security; + }; + }); + }; +} diff --git a/pkgs/by-name/ru/rust/make-rust-platform.nix b/pkgs/by-name/ru/rust/make-rust-platform.nix new file mode 100644 index 0000000..3e5dfbd --- /dev/null +++ b/pkgs/by-name/ru/rust/make-rust-platform.nix @@ -0,0 +1,40 @@ +{ lib, buildPackages, callPackage, callPackages, cargo-auditable, stdenv, runCommand, path }@prev: + +{ rustc +, cargo +, cargo-auditable ? prev.cargo-auditable +, stdenv ? prev.stdenv +, ... +}: + +rec { + rust = { + rustc = lib.warn "rustPlatform.rust.rustc is deprecated. Use rustc instead." rustc; + cargo = lib.warn "rustPlatform.rust.cargo is deprecated. Use cargo instead." cargo; + }; + + fetchCargoTarball = buildPackages.callPackage (path + "/pkgs/build-support/rust/fetch-cargo-tarball") { + git = buildPackages.gitMinimal; + inherit cargo; + }; + + buildRustPackage = callPackage (path + "/pkgs/build-support/rust/build-rust-package") { + inherit stdenv cargoBuildHook cargoCheckHook cargoInstallHook cargoNextestHook cargoSetupHook + fetchCargoTarball importCargoLock rustc cargo cargo-auditable; + }; + + importCargoLock = buildPackages.callPackage (path + "/pkgs/build-support/rust/import-cargo-lock.nix") { inherit cargo; }; + + rustcSrc = callPackage ./rust-src.nix { + inherit runCommand rustc; + }; + + rustLibSrc = callPackage ./rust-lib-src.nix { + inherit runCommand rustc; + }; + + # Hooks + inherit (callPackages (path + "/pkgs/build-support/rust/hooks") { + inherit stdenv cargo rustc; + }) cargoBuildHook cargoCheckHook cargoInstallHook cargoNextestHook cargoSetupHook maturinBuildHook bindgenHook; +} diff --git a/pkgs/by-name/ru/rust/packages.nix b/pkgs/by-name/ru/rust/packages.nix new file mode 100644 index 0000000..1f27823 --- /dev/null +++ b/pkgs/by-name/ru/rust/packages.nix @@ -0,0 +1,18 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + rust_1_77 = callPackage ./1_77.nix { + inherit (darwin.apple_sdk.frameworks) CoreFoundation Security SystemConfiguration; + llvm_17 = llvmPackages_17.libllvm; + }; + rust = rust_1_77; + + rustPackages_1_77 = rust_1_77.packages.stable; + rustPackages = rustPackages_1_77; + + inherit (rustPackages) cargo cargo-auditable cargo-auditable-cargo-wrapper clippy rustc rustPlatform; + + makeRustPlatform = callPackage ./make-rust-platform.nix { }; +} diff --git a/pkgs/by-name/ru/rust/print-hashes.sh b/pkgs/by-name/ru/rust/print-hashes.sh new file mode 100755 index 0000000..ebf8d90 --- /dev/null +++ b/pkgs/by-name/ru/rust/print-hashes.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +# All rust-related downloads can be found at +# https://static.rust-lang.org/dist/index.html. To find the date on +# which a particular thing was last updated, look for the *-date.txt +# file, e.g. +# https://static.rust-lang.org/dist/channel-rust-beta-date.txt + +PLATFORMS=( + i686-unknown-linux-gnu + x86_64-unknown-linux-gnu + x86_64-unknown-linux-musl + arm-unknown-linux-gnueabihf + armv7-unknown-linux-gnueabihf + aarch64-unknown-linux-gnu + aarch64-unknown-linux-musl + x86_64-apple-darwin + aarch64-apple-darwin + powerpc64le-unknown-linux-gnu + riscv64gc-unknown-linux-gnu +) +BASEURL=https://static.rust-lang.org/dist +VERSION=${1:-} +DATE=${2:-} + +if [[ -z $VERSION ]] +then + echo "No version supplied" + exit -1 +fi + +if [[ -n $DATE ]] +then + BASEURL=$BASEURL/$DATE +fi + +for PLATFORM in "${PLATFORMS[@]}" +do + URL="$BASEURL/rust-$VERSION-$PLATFORM.tar.gz.sha256" + SHA256=$(curl -sSfL $URL | cut -d ' ' -f 1) + echo "$PLATFORM = \"$SHA256\";" +done diff --git a/pkgs/by-name/ru/rust/rust-lib-src.nix b/pkgs/by-name/ru/rust/rust-lib-src.nix new file mode 100644 index 0000000..aa91433 --- /dev/null +++ b/pkgs/by-name/ru/rust/rust-lib-src.nix @@ -0,0 +1,6 @@ +{ runCommand, rustc }: + +runCommand "rust-lib-src" { } '' + tar --strip-components=1 -xzf ${rustc.src} + mv library $out +'' diff --git a/pkgs/by-name/ru/rust/rust-src.nix b/pkgs/by-name/ru/rust/rust-src.nix new file mode 100644 index 0000000..69bdb37 --- /dev/null +++ b/pkgs/by-name/ru/rust/rust-src.nix @@ -0,0 +1,21 @@ +{ lib, runCommand, rustc, minimalContent ? true }: + +runCommand "rust-src" { } '' + tar -xzf ${rustc.src} + mv rustc-${rustc.version}-src $out + rm -rf $out/{${lib.concatStringsSep "," ([ + "ci" + "doc" + "etc" + "grammar" + "llvm-project" + "llvm-emscripten" + "rtstartup" + "rustllvm" + "test" + "vendor" + ] ++ lib.optionals minimalContent [ + "tools" + "stdarch" + ])}} +'' diff --git a/pkgs/by-name/ru/rust/rustc.nix b/pkgs/by-name/ru/rust/rustc.nix new file mode 100644 index 0000000..6c84dde --- /dev/null +++ b/pkgs/by-name/ru/rust/rustc.nix @@ -0,0 +1,288 @@ +{ lib, stdenv, removeReferencesTo, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, targetPackages +, llvmShared, llvmSharedForBuild, llvmSharedForHost, llvmSharedForTarget, llvmPackages +, fetchurl, file, python3 +, darwin, cargo, cmake, rustc, rustfmt +, pkg-config, openssl, xz +, libiconv +, which, libffi +, withBundledLLVM ? false +, enableRustcDev ? true +, version +, sha256 +, patches ? [] +# , fd +# , ripgrep +# , wezterm +# , firefox +# , thunderbird +# This only builds std for target and reuses the rustc from build. +, fastCross +, lndir +, makeWrapper +}: + +let + inherit (lib) optionals optional optionalString concatStringsSep; + inherit (darwin.apple_sdk.frameworks) Security; +in stdenv.mkDerivation (finalAttrs: { + pname = "${targetPackages.stdenv.cc.targetPrefix}rustc"; + inherit version; + + src = fetchurl { + url = "https://static.rust-lang.org/dist/rustc-${version}-src.tar.gz"; + inherit sha256; + # See https://nixos.org/manual/nixpkgs/stable/#using-git-bisect-on-the-rust-compiler + passthru.isReleaseTarball = true; + }; + + __darwinAllowLocalNetworking = true; + + # rustc complains about modified source files otherwise + dontUpdateAutotoolsGnuConfigScripts = true; + + # Running the default `strip -S` command on Darwin corrupts the + # .rlib files in "lib/". + # + # See https://github.com/NixOS/nixpkgs/pull/34227 + # + # Running `strip -S` when cross compiling can harm the cross rlibs. + # See: https://github.com/NixOS/nixpkgs/pull/56540#issuecomment-471624656 + stripDebugList = [ "bin" ]; + + # The Rust pkg-config crate does not support prefixed pkg-config executables[1], + # but it does support checking these idiosyncratic PKG_CONFIG_${TRIPLE} + # environment variables. + # [1]: https://github.com/rust-lang/pkg-config-rs/issues/53 + "PKG_CONFIG_${builtins.replaceStrings ["-"] ["_"] stdenv.buildPlatform.rust.rustcTarget}" = + "${pkgsBuildHost.stdenv.cc.targetPrefix}pkg-config"; + + NIX_LDFLAGS = toString ( + # when linking stage1 libstd: cc: undefined reference to `__cxa_begin_catch' + optional (stdenv.isLinux && !withBundledLLVM) "--push-state --as-needed -lstdc++ --pop-state" + ++ optional (stdenv.isDarwin && !withBundledLLVM) "-lc++ -lc++abi" + ++ optional stdenv.isDarwin "-rpath ${llvmSharedForHost}/lib"); + + # Increase codegen units to introduce parallelism within the compiler. + RUSTFLAGS = "-Ccodegen-units=10"; + + RUSTDOCFLAGS = "-A rustdoc::broken-intra-doc-links"; + + # We need rust to build rust. If we don't provide it, configure will try to download it. + # Reference: https://github.com/rust-lang/rust/blob/master/src/bootstrap/configure.py + configureFlags = let + prefixForStdenv = stdenv: "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}"; + ccPrefixForStdenv = stdenv: "${prefixForStdenv stdenv}${if (stdenv.cc.isClang or false) then "clang" else "cc"}"; + cxxPrefixForStdenv = stdenv: "${prefixForStdenv stdenv}${if (stdenv.cc.isClang or false) then "clang++" else "c++"}"; + setBuild = "--set=target.${stdenv.buildPlatform.rust.rustcTarget}"; + setHost = "--set=target.${stdenv.hostPlatform.rust.rustcTarget}"; + setTarget = "--set=target.${stdenv.targetPlatform.rust.rustcTarget}"; + ccForBuild = ccPrefixForStdenv pkgsBuildBuild.targetPackages.stdenv; + cxxForBuild = cxxPrefixForStdenv pkgsBuildBuild.targetPackages.stdenv; + ccForHost = ccPrefixForStdenv pkgsBuildHost.targetPackages.stdenv; + cxxForHost = cxxPrefixForStdenv pkgsBuildHost.targetPackages.stdenv; + ccForTarget = ccPrefixForStdenv pkgsBuildTarget.targetPackages.stdenv; + cxxForTarget = cxxPrefixForStdenv pkgsBuildTarget.targetPackages.stdenv; + in [ + "--sysconfdir=${placeholder "out"}/etc" + "--release-channel=stable" + "--set=build.rustc=${rustc}/bin/rustc" + "--set=build.cargo=${cargo}/bin/cargo" + ] ++ lib.optionals (!(finalAttrs.src.passthru.isReleaseTarball or false)) [ + # release tarballs vendor the rustfmt source; when + # git-bisect'ing from upstream's git repo we must prevent + # attempts to download the missing source tarball + "--set=build.rustfmt=${rustfmt}/bin/rustfmt" + ] ++ [ + "--tools=rustc,rustdoc,rust-analyzer-proc-macro-srv" + "--enable-rpath" + "--enable-vendor" + "--build=${stdenv.buildPlatform.rust.rustcTargetSpec}" + "--host=${stdenv.hostPlatform.rust.rustcTargetSpec}" + # std is built for all platforms in --target. + "--target=${concatStringsSep "," ([ + stdenv.targetPlatform.rust.rustcTargetSpec + + # Other targets that don't need any extra dependencies to build. + ] ++ optionals (!fastCross) [ + "wasm32-unknown-unknown" + + # (build!=target): When cross-building a compiler we need to add + # the build platform as well so rustc can compile build.rs + # scripts. + ] ++ optionals (stdenv.buildPlatform != stdenv.targetPlatform && !fastCross) [ + stdenv.buildPlatform.rust.rustcTargetSpec + + # (host!=target): When building a cross-targeting compiler we + # need to add the host platform as well so rustc can compile + # build.rs scripts. + ] ++ optionals (stdenv.hostPlatform != stdenv.targetPlatform && !fastCross) [ + stdenv.hostPlatform.rust.rustcTargetSpec + ])}" + + "${setBuild}.cc=${ccForBuild}" + "${setHost}.cc=${ccForHost}" + "${setTarget}.cc=${ccForTarget}" + + "${setBuild}.linker=${ccForBuild}" + "${setHost}.linker=${ccForHost}" + "${setTarget}.linker=${ccForTarget}" + + "${setBuild}.cxx=${cxxForBuild}" + "${setHost}.cxx=${cxxForHost}" + "${setTarget}.cxx=${cxxForTarget}" + + "${setBuild}.crt-static=${lib.boolToString stdenv.buildPlatform.isStatic}" + "${setHost}.crt-static=${lib.boolToString stdenv.hostPlatform.isStatic}" + "${setTarget}.crt-static=${lib.boolToString stdenv.targetPlatform.isStatic}" + ] ++ optionals (!withBundledLLVM) [ + "--enable-llvm-link-shared" + "${setBuild}.llvm-config=${llvmSharedForBuild.dev}/bin/llvm-config" + "${setHost}.llvm-config=${llvmSharedForHost.dev}/bin/llvm-config" + "${setTarget}.llvm-config=${llvmSharedForTarget.dev}/bin/llvm-config" + ] ++ optionals (stdenv.isLinux && !stdenv.targetPlatform.isRedox) [ + "--enable-profiler" # build libprofiler_builtins + ] ++ optionals stdenv.buildPlatform.isMusl [ + "${setBuild}.musl-root=${pkgsBuildBuild.targetPackages.stdenv.cc.libc}" + ] ++ optionals stdenv.hostPlatform.isMusl [ + "${setHost}.musl-root=${pkgsBuildHost.targetPackages.stdenv.cc.libc}" + ] ++ optionals stdenv.targetPlatform.isMusl [ + "${setTarget}.musl-root=${pkgsBuildTarget.targetPackages.stdenv.cc.libc}" + ] ++ optionals stdenv.targetPlatform.rust.isNoStdTarget [ + "--disable-docs" + ] ++ optionals (stdenv.isDarwin && stdenv.isx86_64) [ + # https://github.com/rust-lang/rust/issues/92173 + "--set rust.jemalloc" + ]; + + # if we already have a rust compiler for build just compile the target std + # library and reuse compiler + buildPhase = if fastCross then " + runHook preBuild + + mkdir -p build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-{std,rustc}/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/ + ln -s ${rustc.unwrapped}/lib/rustlib/${stdenv.hostPlatform.rust.rustcTargetSpec}/libstd-*.so build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-std/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/libstd.so + ln -s ${rustc.unwrapped}/lib/rustlib/${stdenv.hostPlatform.rust.rustcTargetSpec}/librustc_driver-*.so build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-rustc/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/librustc.so + ln -s ${rustc.unwrapped}/bin/rustc build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-rustc/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/rustc-main + touch build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-std/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/.libstd.stamp + touch build/${stdenv.hostPlatform.rust.rustcTargetSpec}/stage0-rustc/${stdenv.hostPlatform.rust.rustcTargetSpec}/release/.librustc.stamp + python ./x.py --keep-stage=0 --stage=1 build library + + runHook postBuild + " else null; + + installPhase = if fastCross then '' + runHook preInstall + + python ./x.py --keep-stage=0 --stage=1 install library/std + mkdir -v $out/bin $doc $man + ln -s ${rustc.unwrapped}/bin/{rustc,rustdoc} $out/bin + ln -s ${rustc.unwrapped}/lib/rustlib/{manifest-rust-std-,}${stdenv.hostPlatform.rust.rustcTargetSpec} $out/lib/rustlib/ + echo rust-std-${stdenv.hostPlatform.rust.rustcTargetSpec} >> $out/lib/rustlib/components + lndir ${rustc.doc} $doc + lndir ${rustc.man} $man + + runHook postInstall + '' else null; + + # the rust build system complains that nix alters the checksums + dontFixLibtool = true; + + inherit patches; + + postPatch = '' + patchShebangs src/etc + + ${optionalString (!withBundledLLVM) "rm -rf src/llvm"} + + # Useful debugging parameter + # export VERBOSE=1 + '' + lib.optionalString (stdenv.isDarwin && stdenv.isx86_64) '' + # See https://github.com/jemalloc/jemalloc/issues/1997 + # Using a value of 48 should work on both emulated and native x86_64-darwin. + export JEMALLOC_SYS_WITH_LG_VADDR=48 + '' + lib.optionalString (!(finalAttrs.src.passthru.isReleaseTarball or false)) '' + mkdir .cargo + cat > .cargo/config <<\EOF + [source.crates-io] + replace-with = "vendored-sources" + [source.vendored-sources] + directory = "vendor" + EOF + ''; + + # rustc unfortunately needs cmake to compile llvm-rt but doesn't + # use it for the normal build. This disables cmake in Nix. + dontUseCmakeConfigure = true; + + depsBuildBuild = [ pkgsBuildHost.stdenv.cc pkg-config ]; + + nativeBuildInputs = [ + file python3 rustc cmake + which libffi removeReferencesTo pkg-config xz + ] + ++ optionals fastCross [ lndir makeWrapper ]; + + buildInputs = [ openssl ] + ++ optionals stdenv.isDarwin [ libiconv Security ] + ++ optional (!withBundledLLVM) llvmShared; + + outputs = [ "out" "man" "doc" ]; + setOutputFlags = false; + + postInstall = lib.optionalString (enableRustcDev && !fastCross) '' + # install rustc-dev components. Necessary to build rls, clippy... + python x.py dist rustc-dev + tar xf build/dist/rustc-dev*tar.gz + cp -r rustc-dev*/rustc-dev*/lib/* $out/lib/ + rm $out/lib/rustlib/install.log + for m in $out/lib/rustlib/manifest-rust* + do + sort --output=$m < $m + done + + '' + '' + # remove references to llvm-config in lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/librustc_codegen_llvm-llvm.so + # and thus a transitive dependency on ncurses + find $out/lib -name "*.so" -type f -exec remove-references-to -t ${llvmShared} '{}' '+' + + # remove uninstall script that doesn't really make sense for Nix. + rm $out/lib/rustlib/uninstall.sh + ''; + + configurePlatforms = []; + + enableParallelBuilding = true; + + setupHooks = ./setup-hook.sh; + + requiredSystemFeatures = [ "big-parallel" ]; + + passthru = { + llvm = llvmShared; + inherit llvmPackages; + # tests = { + # inherit fd ripgrep wezterm; + # } // lib.optionalAttrs stdenv.hostPlatform.isLinux { inherit firefox thunderbird; }; + }; + + meta = with lib; { + homepage = "https://www.rust-lang.org/"; + description = "A safe, concurrent, practical language"; + maintainers = with maintainers; [ havvy ] ++ teams.rust.members; + license = [ licenses.mit licenses.asl20 ]; + platforms = [ + # Platforms with host tools from + # https://doc.rust-lang.org/nightly/rustc/platform-support.html + "x86_64-darwin" "i686-darwin" "aarch64-darwin" + "i686-freebsd" "x86_64-freebsd" + "x86_64-solaris" + "aarch64-linux" "armv6l-linux" "armv7l-linux" "i686-linux" + "loongarch64-linux" "powerpc64-linux" "powerpc64le-linux" + "riscv64-linux" "s390x-linux" "x86_64-linux" + "aarch64-netbsd" "armv7l-netbsd" "i686-netbsd" "powerpc-netbsd" + "x86_64-netbsd" + "i686-openbsd" "x86_64-openbsd" + "i686-windows" "x86_64-windows" + ]; + }; +}) diff --git a/pkgs/by-name/ru/rust/rustfmt.nix b/pkgs/by-name/ru/rust/rustfmt.nix new file mode 100644 index 0000000..9cc8df5 --- /dev/null +++ b/pkgs/by-name/ru/rust/rustfmt.nix @@ -0,0 +1,44 @@ +{ lib, stdenv, rustPlatform, rustc, Security, asNightly ? false }: + +rustPlatform.buildRustPackage rec { + pname = "rustfmt" + lib.optionalString asNightly "-nightly"; + inherit (rustc) version src; + + # the rust source tarball already has all the dependencies vendored, no need to fetch them again + cargoVendorDir = "vendor"; + buildAndTestSubdir = "src/tools/rustfmt"; + + # changes hash of vendor directory otherwise + dontUpdateAutotoolsGnuConfigScripts = true; + + buildInputs = [ + rustc.llvm + ] ++ lib.optional stdenv.isDarwin Security; + + # rustfmt uses the rustc_driver and std private libraries, and Rust's build process forces them to have + # an install name of `@rpath/...` [0] [1] instead of the standard on macOS, which is an absolute path + # to itself. + # + # [0]: https://github.com/rust-lang/rust/blob/f77f4d55bdf9d8955d3292f709bd9830c2fdeca5/src/bootstrap/builder.rs#L1543 + # [1]: https://github.com/rust-lang/rust/blob/f77f4d55bdf9d8955d3292f709bd9830c2fdeca5/compiler/rustc_codegen_ssa/src/back/linker.rs#L323-L331 + preFixup = lib.optionalString stdenv.isDarwin '' + install_name_tool -add_rpath "${rustc.unwrapped}/lib" "$out/bin/rustfmt" + install_name_tool -add_rpath "${rustc.unwrapped}/lib" "$out/bin/git-rustfmt" + ''; + + # As of 1.0.0 and rustc 1.30 rustfmt requires a nightly compiler + RUSTC_BOOTSTRAP = 1; + + # As of rustc 1.45.0, these env vars are required to build rustfmt (due to + # https://github.com/rust-lang/rust/pull/72001) + CFG_RELEASE = rustc.version; + CFG_RELEASE_CHANNEL = if asNightly then "nightly" else "stable"; + + meta = with lib; { + description = "A tool for formatting Rust code according to style guidelines"; + homepage = "https://github.com/rust-lang-nursery/rustfmt"; + license = with licenses; [ mit asl20 ]; + mainProgram = "rustfmt"; + maintainers = with maintainers; [ globin basvandijk ]; + }; +} diff --git a/pkgs/by-name/ru/rust/setup-hook.sh b/pkgs/by-name/ru/rust/setup-hook.sh new file mode 100644 index 0000000..5d4eb64 --- /dev/null +++ b/pkgs/by-name/ru/rust/setup-hook.sh @@ -0,0 +1,4 @@ +# Fix 'failed to open: /homeless-shelter/.cargo/.package-cache' in rust 1.36. +if [[ -z ${IN_NIX_SHELL-} && -z ${CARGO_HOME-} ]]; then + export CARGO_HOME=$TMPDIR +fi diff --git a/pkgs/by-name/ru/rustls-ffi/Cargo.lock b/pkgs/by-name/ru/rustls-ffi/Cargo.lock new file mode 100644 index 0000000..6cf2c53 --- /dev/null +++ b/pkgs/by-name/ru/rustls-ffi/Cargo.lock @@ -0,0 +1,369 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustls" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07180898a28ed6a7f7ba2311594308f595e3dd2e3c3812fa0a80a47b45f17e5d" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "rustversion", + "sct", +] + +[[package]] +name = "rustls-ffi" +version = "0.10.0" +dependencies = [ + "libc", + "log", + "num_enum", + "rustls", + "rustls-pemfile", + "sct", + "webpki", +] + +[[package]] +name = "rustls-pemfile" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.25", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.25", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winnow" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a2094c43cc94775293eaa0e499fbc30048a6d824ac82c0351a8c0bf9112529" +dependencies = [ + "memchr", +] diff --git a/pkgs/by-name/ru/rustls-ffi/default.nix b/pkgs/by-name/ru/rustls-ffi/default.nix new file mode 100644 index 0000000..9949620 --- /dev/null +++ b/pkgs/by-name/ru/rustls-ffi/default.nix @@ -0,0 +1,49 @@ +{ lib +, stdenv +, fetchFromGitHub +, rustPlatform +, Security +# for passthru.tests +, apacheHttpd +, curl +}: + +rustPlatform.buildRustPackage rec { + pname = "rustls-ffi"; + version = "0.10.0"; + + src = fetchFromGitHub { + owner = "rustls"; + repo = pname; + rev = "v${version}"; + hash = "sha256-IDIWN5g1aaE6SDdXSm4WYK6n+BpuypPYQITuDj1WJEc="; + }; + + propagatedBuildInputs = lib.optionals stdenv.isDarwin [ Security ]; + + cargoLock.lockFile = ./Cargo.lock; + postPatch = '' + cp ${./Cargo.lock} Cargo.lock + ''; + + installPhase = '' + runHook preInstall + + make install DESTDIR=${placeholder "out"} + + runHook postInstall + ''; + + # passthru.tests = { + # apacheHttpd = apacheHttpd.override { modTlsSupport = true; }; + # # Currently broken notably because of https://github.com/curl/curl/issues/13248 + # # curl = curl.override { opensslSupport = false; rustlsSupport = true; }; + # }; + + meta = with lib; { + description = "C-to-rustls bindings"; + homepage = "https://github.com/rustls/rustls-ffi/"; + license = with lib.licenses; [ mit asl20 isc ]; + maintainers = [ maintainers.lesuisse ]; + }; +} diff --git a/pkgs/by-name/ru/rustls-ffi/packages.nix b/pkgs/by-name/ru/rustls-ffi/packages.nix new file mode 100644 index 0000000..c0ef5c5 --- /dev/null +++ b/pkgs/by-name/ru/rustls-ffi/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + rustls-ffi = callPackage ./. { + inherit (darwin.apple_sdk.frameworks) Security; + }; +} diff --git a/pkgs/by-name/s2/s2n-tls/default.nix b/pkgs/by-name/s2/s2n-tls/default.nix new file mode 100644 index 0000000..8ef3df4 --- /dev/null +++ b/pkgs/by-name/s2/s2n-tls/default.nix @@ -0,0 +1,55 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, openssl +, nix +}: + +stdenv.mkDerivation rec { + pname = "s2n-tls"; + version = "1.4.9"; + + src = fetchFromGitHub { + owner = "aws"; + repo = pname; + rev = "v${version}"; + hash = "sha256-YH35+kCvPjeBYMMJi7YdAGk/ds3YPm5SSKpoWfbCI3M="; + }; + + nativeBuildInputs = [ cmake ]; + + outputs = [ "out" "dev" ]; + + buildInputs = [ openssl ]; # s2n-config has find_dependency(LibCrypto). + + cmakeFlags = [ + "-DBUILD_SHARED_LIBS=ON" + "-DUNSAFE_TREAT_WARNINGS_AS_ERRORS=OFF" # disable -Werror + ] ++ lib.optionals stdenv.hostPlatform.isMips64 [ + # See https://github.com/aws/s2n-tls/issues/1592 and https://github.com/aws/s2n-tls/pull/1609 + "-DS2N_NO_PQ=ON" + ]; + + propagatedBuildInputs = [ openssl ]; # s2n-config has find_dependency(LibCrypto). + + postInstall = '' + # Glob for 'shared' or 'static' subdir + for f in $out/lib/s2n/cmake/*/s2n-targets.cmake; do + substituteInPlace "$f" \ + --replace 'INTERFACE_INCLUDE_DIRECTORIES "''${_IMPORT_PREFIX}/include"' 'INTERFACE_INCLUDE_DIRECTORIES ""' + done + ''; + + passthru.tests = { + inherit nix; + }; + + meta = with lib; { + description = "C99 implementation of the TLS/SSL protocols"; + homepage = "https://github.com/aws/s2n-tls"; + license = licenses.asl20; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej ]; + }; +} diff --git a/pkgs/by-name/sc/scons/3.1.2.nix b/pkgs/by-name/sc/scons/3.1.2.nix new file mode 100644 index 0000000..0bac068 --- /dev/null +++ b/pkgs/by-name/sc/scons/3.1.2.nix @@ -0,0 +1,48 @@ +{ lib, fetchFromGitHub, python3 }: + +let + pname = "scons"; + version = "3.1.2"; + src = fetchFromGitHub { + owner = "Scons"; + repo = "scons"; + rev = version; + hash = "sha256-C3U4N7+9vplzoJoevQe5Zeuz0TDmB6/miMwBJLzA3WA="; + }; +in +python3.pkgs.buildPythonApplication { + inherit pname version src; + + outputs = [ "out" "man" ]; + + preConfigure = '' + python bootstrap.py + cd build/scons + ''; + + setupHook = ./setup-hook.sh; + + doCheck = true; + + passthru = { + # expose the used python version so tools using this (and extensing scos + # with other python modules) can use the exact same python version. + inherit python3; + python = python3; + }; + + meta = { + description = "An improved, cross-platform substitute for Make"; + longDescription = '' + SCons is an Open Source software construction tool. Think of SCons as an + improved, cross-platform substitute for the classic Make utility with + integrated functionality similar to autoconf/automake and compiler caches + such as ccache. In short, SCons is an easier, more reliable and faster way + to build software. + ''; + homepage = "https://scons.org/"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ AndersonTorres ]; + }; +} +# TODO: patch to get rid of distutils and other deprecations diff --git a/pkgs/by-name/sc/scons/4.1.0.nix b/pkgs/by-name/sc/scons/4.1.0.nix new file mode 100644 index 0000000..f2edf51 --- /dev/null +++ b/pkgs/by-name/sc/scons/4.1.0.nix @@ -0,0 +1,57 @@ +{ lib, fetchFromGitHub, python3 }: + +let + pname = "scons"; + version = "4.1.0"; + src = fetchFromGitHub { + owner = "Scons"; + repo = "scons"; + rev = version; + hash = "sha256-ldus/9ghqAMB7A+NrHiCQm7saCdIpqzufGCLxWRhYKU="; + }; +in +python3.pkgs.buildPythonApplication { + inherit pname version src; + + outputs = [ "out" "man" ]; + + postPatch = '' + substituteInPlace setup.cfg \ + --replace "build/dist" "dist" + ''; + + preConfigure = '' + python scripts/scons.py + ''; + + postInstall = '' + mkdir -pv "$man/share/man/man1" + mv -v "$out/"*.1 "$man/share/man/man1/" + ''; + + setupHook = ./setup-hook.sh; + + # The release tarballs don't contain any tests (runtest.py and test/*): + doCheck = false; + + passthru = { + # expose the used python version so tools using this (and extensing scos + # with other python modules) can use the exact same python version. + inherit python3; + python = python3; + }; + + meta = { + description = "An improved, cross-platform substitute for Make"; + longDescription = '' + SCons is an Open Source software construction tool. Think of SCons as an + improved, cross-platform substitute for the classic Make utility with + integrated functionality similar to autoconf/automake and compiler caches + such as ccache. In short, SCons is an easier, more reliable and faster way + to build software. + ''; + homepage = "https://scons.org/"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ AndersonTorres ]; + }; +} diff --git a/pkgs/by-name/sc/scons/4.5.2.nix b/pkgs/by-name/sc/scons/4.5.2.nix new file mode 100644 index 0000000..f63702c --- /dev/null +++ b/pkgs/by-name/sc/scons/4.5.2.nix @@ -0,0 +1,62 @@ +{ lib, fetchFromGitHub, python3 }: + +let + pname = "scons"; + version = "4.5.2"; + src = fetchFromGitHub { + owner = "Scons"; + repo = "scons"; + rev = version; + hash = "sha256-vxJsz24jDsPcttwPXq9+ztc/N7W4Gkydgykk/FLgZLo="; + }; +in +python3.pkgs.buildPythonApplication { + inherit pname version src; + + outputs = [ "out" "man" ]; + + patches = [ + ./env.patch + ]; + + postPatch = '' + substituteInPlace setup.cfg \ + --replace "build/dist" "dist" \ + --replace "build/doc/man/" "" + ''; + + preConfigure = '' + python scripts/scons.py + ''; + + postInstall = '' + mkdir -p "$man/share/man/man1" + mv "$out/"*.1 "$man/share/man/man1/" + ''; + + setupHook = ./setup-hook.sh; + + # The release tarballs don't contain any tests (runtest.py and test/*): + doCheck = false; + + passthru = { + # expose the used python version so tools using this (and extensing scos + # with other python modules) can use the exact same python version. + inherit python3; + python = python3; + }; + + meta = { + description = "An improved, cross-platform substitute for Make"; + longDescription = '' + SCons is an Open Source software construction tool. Think of SCons as an + improved, cross-platform substitute for the classic Make utility with + integrated functionality similar to autoconf/automake and compiler caches + such as ccache. In short, SCons is an easier, more reliable and faster way + to build software. + ''; + homepage = "https://scons.org/"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ AndersonTorres ]; + }; +} diff --git a/pkgs/by-name/sc/scons/env.patch b/pkgs/by-name/sc/scons/env.patch new file mode 100644 index 0000000..9561501 --- /dev/null +++ b/pkgs/by-name/sc/scons/env.patch @@ -0,0 +1,9 @@ +diff --git a/SCons/Platform/posix.py b/SCons/Platform/posix.py +index 4c9f8f9ba..d68da1b08 100644 +--- a/SCons/Platform/posix.py ++++ b/SCons/Platform/posix.py +@@ -30,0 +31 @@ selection method. ++import os +@@ -87 +88 @@ def generate(env): +- env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin:/snap/bin' ++ env['ENV']['PATH'] = os.environ["PATH"] diff --git a/pkgs/by-name/sc/scons/packages.nix b/pkgs/by-name/sc/scons/packages.nix new file mode 100644 index 0000000..76cf482 --- /dev/null +++ b/pkgs/by-name/sc/scons/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + scons = scons_4_5_2; + scons_3_1_2 = callPackage ./3.1.2.nix { }; + scons_4_1_0 = callPackage ./4.1.0.nix { }; + scons_4_5_2 = callPackage ./4.5.2.nix { }; +} diff --git a/pkgs/by-name/sc/scons/setup-hook.sh b/pkgs/by-name/sc/scons/setup-hook.sh new file mode 100644 index 0000000..bfd8f3c --- /dev/null +++ b/pkgs/by-name/sc/scons/setup-hook.sh @@ -0,0 +1,87 @@ +# shellcheck shell=bash disable=SC2206 + +sconsBuildPhase() { + runHook preBuild + + if [ -n "$prefix" ]; then + mkdir -p "$prefix" + fi + + if [ -z "${dontAddPrefix:-}" ] && [ -n "$prefix" ]; then + buildFlags="${prefixKey:-prefix=}$prefix $buildFlags" + fi + + local flagsArray=( + ${enableParallelBuilding:+-j${NIX_BUILD_CORES}} + $sconsFlags ${sconsFlagsArray[@]} + $buildFlags ${buildFlagsArray[@]} + ) + + echoCmd 'scons build flags' "${flagsArray[@]}" + scons "${flagsArray[@]}" + + runHook postBuild +} + +sconsInstallPhase() { + runHook preInstall + + if [ -n "$prefix" ]; then + mkdir -p "$prefix" + fi + + if [ -z "${dontAddPrefix:-}" ] && [ -n "$prefix" ]; then + installFlags="${prefixKey:-prefix=}$prefix $installFlags" + fi + + local flagsArray=( + ${enableParallelInstalling:+-j${NIX_BUILD_CORES}} + $sconsFlags ${sconsFlagsArray[@]} + $installFlags ${installFlagsArray[@]} + ${installTargets:-install} + ) + + echoCmd 'scons install flags' "${flagsArray[@]}" + scons "${flagsArray[@]}" + + runHook postInstall +} + +sconsCheckPhase() { + runHook preCheck + + if [ -z "${checkTarget:-}" ]; then + if scons -n check >/dev/null 2>&1; then + checkTarget="check" + elif scons -n test >/dev/null 2>&1; then + checkTarget="test" + fi + fi + + if [ -z "${checkTarget:-}" ]; then + echo "no check/test target found, doing nothing" + else + local flagsArray=( + ${enableParallelChecking:+-j${NIX_BUILD_CORES}} + $sconsFlags ${sconsFlagsArray[@]} + ${checkFlagsArray[@]} + ) + + echoCmd 'scons check flags' "${flagsArray[@]}" + scons "${flagsArray[@]}" + fi + + runHook postCheck +} + +if [ -z "${dontUseSconsBuild-}" ] && [ -z "${buildPhase-}" ]; then + buildPhase=sconsBuildPhase +fi + +if [ -z "${dontUseSconsCheck-}" ] && [ -z "${checkPhase-}" ]; then + checkPhase=sconsCheckPhase +fi + +if [ -z "${dontUseSconsInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=sconsInstallPhase +fi diff --git a/pkgs/by-name/se/serf/default.nix b/pkgs/by-name/se/serf/default.nix new file mode 100644 index 0000000..1a2f407 --- /dev/null +++ b/pkgs/by-name/se/serf/default.nix @@ -0,0 +1,58 @@ +{ lib +, stdenv +, fetchurl +, apr +, scons +, openssl +, aprutil +, zlib +, libkrb5 +, pkg-config +, libiconv +, fetchpatch +}: + +stdenv.mkDerivation rec { + pname = "serf"; + version = "1.3.10"; + + src = fetchurl { + url = "mirror://apache/serf/${pname}-${version}.tar.bz2"; + hash = "sha256-voHvCLqiUW7Np2p3rffe97wyJ+61eLmjO0X3tB3AZOY="; + }; + + nativeBuildInputs = [ pkg-config scons ]; + buildInputs = [ apr openssl aprutil zlib libiconv ] + ++ lib.optional (!stdenv.isCygwin) libkrb5; + + patches = [ + ./scons.patch + + (fetchpatch { + url = "https://src.fedoraproject.org/rpms/libserf/raw/rawhide/f/libserf-1.3.9-errgetfunc.patch"; + hash = "sha256-FQJvXOIZ0iItvbbcu4kR88j74M7fOi7C/0NN3o1/ub4="; + }) + ]; + + prefixKey = "PREFIX="; + + preConfigure = '' + sconsFlags+=" APR=$(echo ${apr.dev}/bin/*-config)" + sconsFlags+=" APU=$(echo ${aprutil.dev}/bin/*-config)" + sconsFlags+=" CC=$CC" + sconsFlags+=" OPENSSL=${openssl}" + sconsFlags+=" ZLIB=${zlib}" + '' + lib.optionalString (!stdenv.isCygwin) '' + sconsFlags+=" GSSAPI=${libkrb5.dev}" + ''; + + enableParallelBuilding = true; + + meta = with lib; { + description = "HTTP client library based on APR"; + homepage = "https://serf.apache.org/"; + license = licenses.asl20; + maintainers = with maintainers; [ orivej raskin ]; + platforms = platforms.linux ++ platforms.darwin; + }; +} diff --git a/pkgs/by-name/se/serf/scons.patch b/pkgs/by-name/se/serf/scons.patch new file mode 100644 index 0000000..7be5e4d --- /dev/null +++ b/pkgs/by-name/se/serf/scons.patch @@ -0,0 +1,13 @@ +diff --git a/SConstruct b/SConstruct +index 4358a23..6ce7776 100644 +--- a/SConstruct ++++ b/SConstruct +@@ -155,6 +155,8 @@ if sys.platform == 'win32': + env = Environment(variables=opts, + tools=('default', 'textfile',), + CPPPATH=['.', ], ++ AR=os.environ['AR'], ++ ENV=os.environ, + ) + + env.Append(BUILDERS = { diff --git a/pkgs/by-name/sh/shadow/default.nix b/pkgs/by-name/sh/shadow/default.nix new file mode 100644 index 0000000..604f4fb --- /dev/null +++ b/pkgs/by-name/sh/shadow/default.nix @@ -0,0 +1,110 @@ +{ lib, stdenv, fetchFromGitHub, fetchpatch +, runtimeShell +, autoreconfHook, bison, flex +, docbook_xml_dtd_45, docbook_xsl +, itstool, libbsd, libxml2, libxslt +, libxcrypt, pkg-config +, glibcCross ? null +, pam ? null +, withTcb ? lib.meta.availableOn stdenv.hostPlatform tcb, tcb +# for passthru.tests +# , nixosTests +}: +let + glibc = + if stdenv.hostPlatform != stdenv.buildPlatform then glibcCross + else assert stdenv.hostPlatform.libc == "glibc"; stdenv.cc.libc; + +in + +stdenv.mkDerivation rec { + pname = "shadow"; + version = "4.14.6"; + + src = fetchFromGitHub { + owner = "shadow-maint"; + repo = pname; + rev = version; + hash = "sha256-+klU1a0cSgHPwZkDnbCSjKnBUKIm2Z3OGUvR/zrqQxo="; + }; + + outputs = [ "out" "su" "dev" "man" ]; + + RUNTIME_SHELL = runtimeShell; + + nativeBuildInputs = [ + autoreconfHook bison flex + docbook_xml_dtd_45 docbook_xsl + itstool libxml2 libxslt + pkg-config + ]; + + buildInputs = [ libbsd libxcrypt ] + ++ lib.optional (pam != null && stdenv.isLinux) pam + ++ lib.optional withTcb tcb; + + patches = [ + ./keep-path.patch + # Obtain XML resources from XML catalog (patch adapted from gtk-doc) + ./respect-xml-catalog-files-var.patch + ./runtime-shell.patch + ./fix-install-with-tcb.patch + # Fix build against `clang-16` and upcoming `gcc-14`: + # https://github.com/shadow-maint/shadow/pull/857 + (fetchpatch { + name = "fix-implicit-getdef_bool.patch"; + url = "https://github.com/shadow-maint/shadow/commit/5abe0811b880208600f646356549b7e5cad89060.patch"; + hash = "sha256-XqvVv8mYY58uXJBKRwncHQRSI45PUkp3dQNn44gzezU="; + }) + ]; + + # The nix daemon often forbids even creating set[ug]id files. + postPatch = '' + sed 's/^\(s[ug]idperms\) = [0-9]755/\1 = 0755/' -i src/Makefile.am + ''; + + # Assume System V `setpgrp (void)', which is the default on GNU variants + # (`AC_FUNC_SETPGRP' is not cross-compilation capable.) + preConfigure = '' + export ac_cv_func_setpgrp_void=yes + export shadow_cv_logdir=/var/log + ''; + + configureFlags = [ + "--enable-man" + "--with-group-name-max-length=32" + "--with-bcrypt" + "--with-yescrypt" + ] ++ lib.optional (stdenv.hostPlatform.libc != "glibc") "--disable-nscd" + ++ lib.optional withTcb "--with-tcb"; + + preBuild = lib.optionalString (stdenv.hostPlatform.libc == "glibc") '' + substituteInPlace lib/nscd.c --replace /usr/sbin/nscd ${glibc.bin}/bin/nscd + ''; + + postInstall = '' + # Don't install ‘groups’, since coreutils already provides it. + rm $out/bin/groups + rm $man/share/man/man1/groups.* + + # Move the su binary into the su package + mkdir -p $su/bin + mv $out/bin/su $su/bin + ''; + + enableParallelBuilding = true; + + disallowedReferences = lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) stdenv.shellPackage; + + meta = with lib; { + homepage = "https://github.com/shadow-maint"; + description = "Suite containing authentication-related tools such as passwd and su"; + license = licenses.bsd3; + platforms = platforms.linux; + }; + + passthru = { + shellPath = "/bin/nologin"; + # tests = { inherit (nixosTests) shadow; }; + }; +} diff --git a/pkgs/by-name/sh/shadow/fix-install-with-tcb.patch b/pkgs/by-name/sh/shadow/fix-install-with-tcb.patch new file mode 100644 index 0000000..ff6166b --- /dev/null +++ b/pkgs/by-name/sh/shadow/fix-install-with-tcb.patch @@ -0,0 +1,28 @@ +diff --git a/src/Makefile.am b/src/Makefile.am +index a1a2e4e..fa17f9d 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -74,10 +74,6 @@ suidubins += newgidmap newuidmap + endif + endif + +-if WITH_TCB +-shadowsgidubins = passwd +-endif +- + LDADD = $(INTLLIBS) \ + $(top_builddir)/libmisc/libmisc.la \ + $(top_builddir)/lib/libshadow.la \ +@@ -146,12 +142,6 @@ install-am: all-am + set -e; for i in $(suidusbins); do \ + chmod $(suidperms) $(DESTDIR)$(usbindir)/$$i; \ + done +-if WITH_TCB +- set -e; for i in $(shadowsgidubins); do \ +- chown root:shadow $(DESTDIR)$(ubindir)/$$i; \ +- chmod $(sgidperms) $(DESTDIR)$(ubindir)/$$i; \ +- done +-endif + if ENABLE_SUBIDS + if FCAPS + setcap cap_setuid+ep $(DESTDIR)$(ubindir)/newuidmap diff --git a/pkgs/by-name/sh/shadow/keep-path.patch b/pkgs/by-name/sh/shadow/keep-path.patch new file mode 100644 index 0000000..99fd17c --- /dev/null +++ b/pkgs/by-name/sh/shadow/keep-path.patch @@ -0,0 +1,19 @@ +diff -ru shadow-4.1.5.1-orig/src/su.c shadow-4.1.5.1/src/su.c +--- shadow-4.1.5.1-orig/src/su.c 2012-05-25 07:51:55.000000000 -0400 ++++ shadow-4.1.5.1/src/su.c 2012-07-25 17:22:57.013547930 -0400 +@@ -879,6 +879,7 @@ + } + } + ++#if 0 + cp = getdef_str ((pw->pw_uid == 0) ? "ENV_SUPATH" : "ENV_PATH"); + if (NULL == cp) { + addenv ((pw->pw_uid == 0) ? "PATH=/sbin:/bin:/usr/sbin:/usr/bin" : "PATH=/bin:/usr/bin", NULL); +@@ -887,6 +888,7 @@ + } else { + addenv ("PATH", cp); + } ++#endif + + if (getenv ("IFS") != NULL) { /* don't export user IFS ... */ + addenv ("IFS= \t\n", NULL); /* ... instead, set a safe IFS */ diff --git a/pkgs/by-name/sh/shadow/respect-xml-catalog-files-var.patch b/pkgs/by-name/sh/shadow/respect-xml-catalog-files-var.patch new file mode 100644 index 0000000..7d922ea --- /dev/null +++ b/pkgs/by-name/sh/shadow/respect-xml-catalog-files-var.patch @@ -0,0 +1,30 @@ +diff --git a/acinclude.m4 b/acinclude.m4 +index dd01f165..e23160ee 100644 +--- a/acinclude.m4 ++++ b/acinclude.m4 +@@ -46,9 +46,21 @@ AC_DEFUN([JH_CHECK_XML_CATALOG], + ifelse([$3],,,[$3 + ])dnl + else +- AC_MSG_RESULT([not found]) +- ifelse([$4],, +- [AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])], +- [$4]) ++ jh_check_xml_catalog_saved_ifs="$IFS" ++ IFS=' ' ++ for f in $XML_CATALOG_FILES; do ++ if [[ -f "$f" ]] && \ ++ AC_RUN_LOG([$XMLCATALOG --noout "$f" "$1" >&2]); then ++ jh_found_xmlcatalog=true ++ AC_MSG_RESULT([found]) ++ ifelse([$3],,,[$3]) ++ break ++ fi ++ done ++ IFS="$jh_check_xml_catalog_saved_ifs" ++ if ! $jh_found_xmlcatalog; then ++ AC_MSG_RESULT([not found]) ++ ifelse([$4],,[AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])],[$4]) ++ fi + fi + ]) diff --git a/pkgs/by-name/sh/shadow/runtime-shell.patch b/pkgs/by-name/sh/shadow/runtime-shell.patch new file mode 100644 index 0000000..0b2e68e --- /dev/null +++ b/pkgs/by-name/sh/shadow/runtime-shell.patch @@ -0,0 +1,13 @@ +diff --git a/configure.ac b/configure.ac +index e4c6aaec..03883ad7 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -682,7 +682,7 @@ if test "$enable_utmpx" = "yes"; then + [Define if utmpx should be used]) + fi + +-AC_DEFINE_UNQUOTED(SHELL, ["$SHELL"], [The default shell.]) ++AC_DEFINE_UNQUOTED(SHELL, ["$RUNTIME_SHELL"], [The runtime shell.]) + + AM_GNU_GETTEXT_VERSION(0.16) + AM_GNU_GETTEXT([external], [need-ngettext]) diff --git a/pkgs/by-name/sh/sharutils/default.nix b/pkgs/by-name/sh/sharutils/default.nix new file mode 100644 index 0000000..5c84e59 --- /dev/null +++ b/pkgs/by-name/sh/sharutils/default.nix @@ -0,0 +1,89 @@ +{ lib, stdenv, fetchurl, fetchpatch, gettext, coreutils }: + +stdenv.mkDerivation rec { + pname = "sharutils"; + version = "4.15.2"; + + src = fetchurl { + url = "mirror://gnu/sharutils/sharutils-${version}.tar.xz"; + sha256 = "16isapn8f39lnffc3dp4dan05b7x6mnc76v6q5nn8ysxvvvwy19b"; + }; + + hardeningDisable = [ "format" ]; + + # GNU Gettext is needed on non-GNU platforms. + buildInputs = [ coreutils gettext ]; + + # These tests try to hit /etc/passwd to find out your username if pass in a submitter + # name on the command line. Since we block access to /etc/passwd on the Darwin sandbox + # that cause shar to just segfault. It isn't a problem on Linux because their sandbox + # remaps /etc/passwd to a trivial file, but we can't do that on Darwin so I do this + # instead. In this case, I pass in the very imaginative "submitter" as the submitter name + + patches = [ + # CVE-2018-1000097 + (fetchurl { + url = "https://sources.debian.org/data/main/s/sharutils/1:4.15.2-2+deb9u1/debian/patches/01-fix-heap-buffer-overflow-cve-2018-1000097.patch"; + sha256 = "19g0sxc8g79aj5gd5idz5409311253jf2q8wqkasf0handdvsbxx"; + }) + (fetchurl { + url = "https://sources.debian.org/data/main/s/sharutils/1:4.15.2-4/debian/patches/02-fix-ftbfs-with-glibc-2.28.patch"; + sha256 = "15kpjqnfs98n6irmkh8pw7masr08xala7gx024agv7zv14722vkc"; + }) + + # pending upstream build fix against -fno-common compilers like >=gcc-10 + # Taken from https://lists.gnu.org/archive/html/bug-gnu-utils/2020-01/msg00002.html + (fetchpatch { + name = "sharutils-4.15.2-Fix-building-with-GCC-10.patch"; + url = "https://lists.gnu.org/archive/html/bug-gnu-utils/2020-01/txtDL8i6V6mUU.txt"; + sha256 = "0kfch1vm45lg237hr6fdv4b2lh5b1933k0fn8yj91gqm58svskvl"; + }) + (fetchpatch { + name = "sharutils-4.15.2-Do-not-include-lib-md5.c-into-src-shar.c.patch"; + url = "https://lists.gnu.org/archive/html/bug-gnu-utils/2020-01/txt5Z_KZup0yN.txt"; + sha256 = "0an8vfy3qj6sss9w0i4j8ilf7g5mbc7y13l644jy5bcm9przcjbd"; + }) + ]; + + postPatch = let + # This evaluates to a string containing: + # + # substituteInPlace tests/shar-2 --replace '${SHAR}' '${SHAR} -s submitter' + # substituteInPlace tests/shar-2 --replace '${SHAR}' '${SHAR} -s submitter' + shar_sub = "\${SHAR}"; + in '' + substituteInPlace tests/shar-1 --replace '${shar_sub}' '${shar_sub} -s submitter' + substituteInPlace tests/shar-2 --replace '${shar_sub}' '${shar_sub} -s submitter' + + substituteInPlace intl/Makefile.in --replace "AR = ar" "" + ''; + + # Workaround to fix the static build on macOS. + env.NIX_CFLAGS_COMPILE = "-Wno-implicit-function-declaration"; + + doCheck = true; + + meta = with lib; { + description = "Tools for remote synchronization and `shell archives'"; + longDescription = + '' GNU shar makes so-called shell archives out of many files, preparing + them for transmission by electronic mail services. A shell archive + is a collection of files that can be unpacked by /bin/sh. A wide + range of features provide extensive flexibility in manufacturing + shars and in specifying shar smartness. For example, shar may + compress files, uuencode binary files, split long files and + construct multi-part mailings, ensure correct unsharing order, and + provide simplistic checksums. + + GNU unshar scans a set of mail messages looking for the start of + shell archives. It will automatically strip off the mail headers + and other introductory text. The archive bodies are then unpacked + by a copy of the shell. unshar may also process files containing + concatenated shell archives. + ''; + homepage = "https://www.gnu.org/software/sharutils/"; + license = licenses.gpl3Plus; + maintainers = []; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/so/sourceHighlight/default.nix b/pkgs/by-name/so/sourceHighlight/default.nix new file mode 100644 index 0000000..d20b369 --- /dev/null +++ b/pkgs/by-name/so/sourceHighlight/default.nix @@ -0,0 +1,71 @@ +{ lib, stdenv, fetchpatch, fetchurl, boost }: + +stdenv.mkDerivation rec { + pname = "source-highlight"; + version = "3.1.9"; + + outputs = [ "out" "doc" "dev" ]; + + src = fetchurl { + url = "mirror://gnu/src-highlite/${pname}-${version}.tar.gz"; + sha256 = "148w47k3zswbxvhg83z38ifi85f9dqcpg7icvvw1cm6bg21x4zrs"; + }; + + patches = [ + # gcc-11 compat upstream patch + (fetchpatch { + url = "https://git.savannah.gnu.org/cgit/src-highlite.git/patch/?id=904949c9026cb772dc93fbe0947a252ef47127f4"; + hash = "sha256-h9DyD+pmlQT5dmKjWI9t0gCIYHe7pYkP55LnOqsE0vI="; + excludes = [ "ChangeLog" ]; + }) + + # Upstream fix for clang-13 and gcc-12 test support + (fetchpatch { + name = "gcc-12.patch"; + url = "https://git.savannah.gnu.org/cgit/src-highlite.git/patch/?id=ab9fe5cb9b85c5afab94f2a7f4b6d7d473c14ee9"; + hash = "sha256-wmSLgLnLuFE+IC6AjxzZp/HEnaOCS1VfY2cac0T7Y+w="; + }) + ] ++ lib.optionals stdenv.cc.isClang [ + # Adds compatibility with C++17 by removing the `register` storage class specifier. + (fetchpatch { + name = "remove-register-keyword"; + url = "https://git.savannah.gnu.org/cgit/src-highlite.git/patch/?id=416b39758dba2c74515584514a959ad1b0ad50d1"; + hash = "sha256-R5A7IGHhU82EqceMCsuNBanhRz4dFVqiaH8637dr7jw="; + includes = [ "lib/*" ]; + }) + ]; + + # source-highlight uses it's own binary to generate documentation. + # During cross-compilation, that binary was built for the target + # platform architecture, so it can't run on the build host. + postPatch = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + substituteInPlace Makefile.in --replace "src doc tests" "src tests" + ''; + + strictDeps = true; + buildInputs = [ boost ]; + + configureFlags = [ + "--with-boost=${boost.out}" + "--with-bash-completion=${placeholder "out"}/share/bash-completion/completions" + ]; + + doCheck = true; + + enableParallelBuilding = true; + # Upstream uses the same intermediate files in multiple tests, running + # them in parallel by make will eventually break one or more tests. + enableParallelChecking = false; + + meta = with lib; { + description = "Source code renderer with syntax highlighting"; + longDescription = '' + GNU Source-highlight, given a source file, produces a document + with syntax highlighting. + ''; + homepage = "https://www.gnu.org/software/src-highlite/"; + license = licenses.gpl3Plus; + platforms = platforms.unix; + maintainers = with maintainers; [ SuperSandro2000 ]; + }; +} diff --git a/pkgs/by-name/sp/spdlog/default.nix b/pkgs/by-name/sp/spdlog/default.nix new file mode 100644 index 0000000..51691a7 --- /dev/null +++ b/pkgs/by-name/sp/spdlog/default.nix @@ -0,0 +1,59 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +, fmt +, catch2_3 +, staticBuild ? stdenv.hostPlatform.isStatic + +# for passthru.tests +# , bear +# , tiledb +}: + +stdenv.mkDerivation rec { + pname = "spdlog"; + version = "1.13.0"; + + src = fetchFromGitHub { + owner = "gabime"; + repo = "spdlog"; + rev = "v${version}"; + hash = "sha256-3n8BnjZ7uMH8quoiT60yTU7poyOtoEmzNMOLa1+r7X0="; + }; + + nativeBuildInputs = [ cmake ]; + # Required to build tests, even if they aren't executed + buildInputs = [ catch2_3 ]; + propagatedBuildInputs = [ fmt ]; + + cmakeFlags = [ + "-DSPDLOG_BUILD_SHARED=${if staticBuild then "OFF" else "ON"}" + "-DSPDLOG_BUILD_STATIC=${if staticBuild then "ON" else "OFF"}" + "-DSPDLOG_BUILD_EXAMPLE=OFF" + "-DSPDLOG_BUILD_BENCH=OFF" + "-DSPDLOG_BUILD_TESTS=ON" + "-DSPDLOG_FMT_EXTERNAL=ON" + ]; + + outputs = [ "out" "doc" "dev" ] ; + + postInstall = '' + mkdir -p $out/share/doc/spdlog + cp -rv ../example $out/share/doc/spdlog + ''; + + doCheck = true; + + # passthru.tests = { + # inherit bear tiledb; + # }; + + meta = with lib; { + description = "Very fast, header only, C++ logging library"; + homepage = "https://github.com/gabime/spdlog"; + license = licenses.mit; + maintainers = with maintainers; [ obadz ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/sp/sphinx/packages.nix b/pkgs/by-name/sp/sphinx/packages.nix new file mode 100644 index 0000000..795d4c0 --- /dev/null +++ b/pkgs/by-name/sp/sphinx/packages.nix @@ -0,0 +1,13 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + sphinx = with python3Packages; toPythonApplication sphinx; + + sphinx-autobuild = with python3Packages; toPythonApplication sphinx-autobuild; + + sphinx-serve = with python3Packages; toPythonApplication sphinx-serve; + + inherit (python3Packages) sphinxHook; +} diff --git a/pkgs/by-name/sp/spice-protocol/default.nix b/pkgs/by-name/sp/spice-protocol/default.nix new file mode 100644 index 0000000..d780085 --- /dev/null +++ b/pkgs/by-name/sp/spice-protocol/default.nix @@ -0,0 +1,26 @@ +{ lib, stdenv, fetchurl, meson, ninja }: + +stdenv.mkDerivation rec { + pname = "spice-protocol"; + version = "0.14.4"; + + src = fetchurl { + url = "https://www.spice-space.org/download/releases/${pname}-${version}.tar.xz"; + sha256 = "sha256-BP+6YQ2f1EHPxH36oTXXAJbmCxBG0hGdjbL46g0X2RI="; + }; + + nativeBuildInputs = [ meson ninja ]; + + postInstall = '' + mkdir -p $out/lib + ln -sv ../share/pkgconfig $out/lib/pkgconfig + ''; + + meta = with lib; { + description = "Protocol headers for the SPICE protocol"; + homepage = "https://www.spice-space.org/"; + license = licenses.bsd3; + maintainers = with maintainers; [ bluescreen303 ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/by-name/sq/sqlite/archive-version.nix b/pkgs/by-name/sq/sqlite/archive-version.nix new file mode 100644 index 0000000..601bb6a --- /dev/null +++ b/pkgs/by-name/sq/sqlite/archive-version.nix @@ -0,0 +1,9 @@ +lib: version: + +let + fragments = lib.splitVersion version; + major = lib.head fragments; + minor = lib.concatMapStrings (lib.fixedWidthNumber 2) (lib.tail fragments); +in + +major + minor + "00" diff --git a/pkgs/by-name/sq/sqlite/default.nix b/pkgs/by-name/sq/sqlite/default.nix new file mode 100644 index 0000000..d172d75 --- /dev/null +++ b/pkgs/by-name/sq/sqlite/default.nix @@ -0,0 +1,112 @@ +{ lib, stdenv, fetchurl, zlib, readline, ncurses + +# for tests +, python3Packages, sqldiff, sqlite-analyzer, tracker + +# uses readline & ncurses for a better interactive experience if set to true +, interactive ? false + +, gitUpdater +}: + +let + archiveVersion = import ./archive-version.nix lib; +in + +stdenv.mkDerivation rec { + pname = "sqlite${lib.optionalString interactive "-interactive"}"; + version = "3.45.2"; + + # nixpkgs-update: no auto update + # NB! Make sure to update ./tools.nix src (in the same directory). + src = fetchurl { + url = "https://sqlite.org/2024/sqlite-autoconf-${archiveVersion version}.tar.gz"; + hash = "sha256-vJBnRC7t8905mJtcXPv/83rmbMnJknTgwwUtxNSo9q4="; + }; + + outputs = [ "bin" "dev" "out" ]; + separateDebugInfo = stdenv.isLinux; + + buildInputs = [ zlib ] ++ lib.optionals interactive [ readline ncurses ]; + + # required for aarch64 but applied for all arches for simplicity + preConfigure = '' + patchShebangs configure + ''; + + configureFlags = [ "--enable-threadsafe" ] ++ lib.optional interactive "--enable-readline"; + + env.NIX_CFLAGS_COMPILE = toString ([ + "-DSQLITE_ENABLE_COLUMN_METADATA" + "-DSQLITE_ENABLE_DBSTAT_VTAB" + "-DSQLITE_ENABLE_JSON1" + "-DSQLITE_ENABLE_FTS3" + "-DSQLITE_ENABLE_FTS3_PARENTHESIS" + "-DSQLITE_ENABLE_FTS3_TOKENIZER" + "-DSQLITE_ENABLE_FTS4" + "-DSQLITE_ENABLE_FTS5" + "-DSQLITE_ENABLE_RTREE" + "-DSQLITE_ENABLE_STMT_SCANSTATUS" + "-DSQLITE_ENABLE_UNLOCK_NOTIFY" + "-DSQLITE_SOUNDEX" + "-DSQLITE_SECURE_DELETE" + "-DSQLITE_MAX_VARIABLE_NUMBER=250000" + "-DSQLITE_MAX_EXPR_DEPTH=10000" + ]); + + # Test for features which may not be available at compile time + preBuild = '' + # Use pread(), pread64(), pwrite(), pwrite64() functions for better performance if they are available. + if cc -Werror=implicit-function-declaration -x c - -o "$TMPDIR/pread_pwrite_test" <<< \ + ''$'#include \nint main()\n{\n pread(0, NULL, 0, 0);\n pwrite(0, NULL, 0, 0);\n return 0;\n}'; then + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -DUSE_PREAD" + fi + if cc -Werror=implicit-function-declaration -x c - -o "$TMPDIR/pread64_pwrite64_test" <<< \ + ''$'#include \nint main()\n{\n pread64(0, NULL, 0, 0);\n pwrite64(0, NULL, 0, 0);\n return 0;\n}'; then + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -DUSE_PREAD64" + elif cc -D_LARGEFILE64_SOURCE -Werror=implicit-function-declaration -x c - -o "$TMPDIR/pread64_pwrite64_test" <<< \ + ''$'#include \nint main()\n{\n pread64(0, NULL, 0, 0);\n pwrite64(0, NULL, 0, 0);\n return 0;\n}'; then + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -DUSE_PREAD64 -D_LARGEFILE64_SOURCE" + fi + + # Necessary for FTS5 on Linux + export NIX_LDFLAGS="$NIX_LDFLAGS -lm" + + echo "" + echo "NIX_CFLAGS_COMPILE = $NIX_CFLAGS_COMPILE" + echo "" + ''; + + postInstall = '' + # Do not contaminate dependent libtool-based projects with sqlite dependencies. + sed -i $out/lib/libsqlite3.la -e "s/dependency_libs=.*/dependency_libs='''/" + ''; + + doCheck = false; # fails to link against tcl + + passthru = { + tests = { + inherit (python3Packages) sqlalchemy; + inherit sqldiff sqlite-analyzer tracker; + }; + + updateScript = gitUpdater { + # No nicer place to look for patest version. + url = "https://github.com/sqlite/sqlite.git"; + # Expect tags like "version-3.43.0". + rev-prefix = "version-"; + }; + }; + + meta = with lib; { + changelog = "https://www.sqlite.org/releaselog/${lib.replaceStrings [ "." ] [ "_" ] version}.html"; + description = "A self-contained, serverless, zero-configuration, transactional SQL database engine"; + downloadPage = "https://sqlite.org/download.html"; + homepage = "https://www.sqlite.org/"; + license = licenses.publicDomain; + mainProgram = "sqlite3"; + maintainers = with maintainers; [ eelco np ]; + platforms = platforms.unix ++ platforms.windows; + pkgConfigModules = [ "sqlite3" ]; + }; +} diff --git a/pkgs/by-name/sq/sqlite/packages.nix b/pkgs/by-name/sq/sqlite/packages.nix new file mode 100644 index 0000000..e6b8877 --- /dev/null +++ b/pkgs/by-name/sq/sqlite/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + sqlite = lowPrio (callPackage ./. { }); + + inherit (callPackage ./tools.nix { + inherit (darwin.apple_sdk.frameworks) Foundation; + }) sqlite-analyzer sqldiff; + + sqlar = callPackage ./sqlar.nix { }; + + sqlite-interactive = (sqlite.override { interactive = true; }).bin; +} diff --git a/pkgs/by-name/sq/sqlite/sqlar.nix b/pkgs/by-name/sq/sqlite/sqlar.nix new file mode 100644 index 0000000..9063879 --- /dev/null +++ b/pkgs/by-name/sq/sqlite/sqlar.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchurl, fuse, zlib +, withFuse ? true }: + +stdenv.mkDerivation { + pname = "sqlar"; + version = "2018-01-07"; + + src = fetchurl { + url = "https://www.sqlite.org/sqlar/tarball/4824e73896/sqlar-src-4824e73896.tar.gz"; + sha256 = "09pikkbp93gqypn3da9zi0dzc47jyypkwc9vnmfzhmw7kpyv8nm9"; + }; + + postPatch = '' + substituteInPlace Makefile \ + --replace 'gcc' '${stdenv.cc.targetPrefix}cc' + ''; + + buildInputs = [ zlib ] + ++ lib.optional withFuse fuse; + + buildFlags = [ "CFLAGS=-Wno-error" "sqlar" ] + ++ lib.optional withFuse "sqlarfs"; + + installPhase = '' + install -D -t $out/bin sqlar + '' + lib.optionalString withFuse '' + install -D -t $out/bin sqlarfs + ''; + + meta = with lib; { + homepage = "https://sqlite.org/sqlar"; + description = "SQLite Archive utilities"; + license = licenses.bsd2; + platforms = platforms.all; + maintainers = with maintainers; [ dtzWill ]; + }; +} diff --git a/pkgs/by-name/sq/sqlite/tools.nix b/pkgs/by-name/sq/sqlite/tools.nix new file mode 100644 index 0000000..94ac07d --- /dev/null +++ b/pkgs/by-name/sq/sqlite/tools.nix @@ -0,0 +1,46 @@ +{ lib, stdenv, fetchurl, unzip, sqlite, tcl, Foundation }: + +let + archiveVersion = import ./archive-version.nix lib; + mkTool = { pname, makeTarget, description, homepage, mainProgram }: stdenv.mkDerivation rec { + inherit pname; + version = "3.45.2"; + + # nixpkgs-update: no auto update + src = assert version == sqlite.version; fetchurl { + url = "https://sqlite.org/2024/sqlite-src-${archiveVersion version}.zip"; + hash = "sha256-SkWjV3zIr2g8S9TG6Bp8eCxbfV2qBhdeosuXHKcWkbE="; + }; + + nativeBuildInputs = [ unzip ]; + buildInputs = [ tcl ] ++ lib.optional stdenv.isDarwin Foundation; + + makeFlags = [ makeTarget ]; + + installPhase = "install -Dt $out/bin ${makeTarget}"; + + meta = with lib; { + inherit description homepage mainProgram; + downloadPage = "http://sqlite.org/download.html"; + license = licenses.publicDomain; + maintainers = with maintainers; [ johnazoidberg ]; + platforms = platforms.unix; + }; + }; +in +{ + sqldiff = mkTool { + pname = "sqldiff"; + makeTarget = "sqldiff"; + description = "A tool that displays the differences between SQLite databases"; + homepage = "https://www.sqlite.org/sqldiff.html"; + mainProgram = "sqldiff"; + }; + sqlite-analyzer = mkTool { + pname = "sqlite-analyzer"; + makeTarget = "sqlite3_analyzer"; + description = "A tool that shows statistics about SQLite databases"; + homepage = "https://www.sqlite.org/sqlanalyze.html"; + mainProgram = "sqlite3_analyzer"; + }; +} diff --git a/pkgs/by-name/su/subversion/apr-1.patch b/pkgs/by-name/su/subversion/apr-1.patch new file mode 100644 index 0000000..240d94f --- /dev/null +++ b/pkgs/by-name/su/subversion/apr-1.patch @@ -0,0 +1,11 @@ +--- a/subversion/bindings/swig/perl/native/Makefile.PL.in ++++ b/subversion/bindings/swig/perl/native/Makefile.PL.in +@@ -72,7 +72,7 @@ + # According to the log of r7937, the flags guarded by the conditional break + # the build on FreeBSD if not conditionalized. + my $apr_ldflags = '@SVN_APR_LIBS@' +- if $^O eq 'darwin' or $^O eq 'cygwin'; ++ if $^O eq 'darwin' or $^O eq 'cygwin' or $^O eq 'linux'; + + chomp $apr_shlib_path_var; + diff --git a/pkgs/by-name/su/subversion/default.nix b/pkgs/by-name/su/subversion/default.nix new file mode 100644 index 0000000..0c83d08 --- /dev/null +++ b/pkgs/by-name/su/subversion/default.nix @@ -0,0 +1,134 @@ +{ bdbSupport ? true # build support for Berkeley DB repositories +, httpServer ? false # build Apache DAV module +, httpSupport ? true # client must support http +, pythonBindings ? false +, perlBindings ? false +, javahlBindings ? false +, saslSupport ? false +, lib, stdenv, fetchurl, apr, aprutil, zlib, sqlite, openssl, lz4, utf8proc +, CoreServices, Security +, autoconf, libtool +, apacheHttpd ? null, expat, swig ? null, jdk ? null, python3 ? null, py3c ? null, perl ? null +, sasl ? null, serf ? null +}: + +assert bdbSupport -> aprutil.bdbSupport; +assert httpServer -> apacheHttpd != null; +assert pythonBindings -> swig != null && python3 != null && py3c != null; +assert javahlBindings -> jdk != null && perl != null; + +let + # Update libtool for macOS 11 support + needsAutogen = stdenv.hostPlatform.isDarwin && lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11"; + + common = { version, sha256, extraPatches ? [ ] }: stdenv.mkDerivation (rec { + inherit version; + pname = "subversion${lib.optionalString (!bdbSupport && perlBindings && pythonBindings) "-client"}"; + + src = fetchurl { + url = "mirror://apache/subversion/subversion-${version}.tar.bz2"; + inherit sha256; + }; + + # Can't do separate $lib and $bin, as libs reference bins + outputs = [ "out" "dev" "man" ]; + + nativeBuildInputs = lib.optionals needsAutogen [ autoconf libtool python3 ]; + + buildInputs = [ zlib apr aprutil sqlite openssl lz4 utf8proc ] + ++ lib.optional httpSupport serf + ++ lib.optionals pythonBindings [ python3 py3c ] + ++ lib.optional perlBindings perl + ++ lib.optional saslSupport sasl + ++ lib.optionals stdenv.hostPlatform.isDarwin [ CoreServices Security ]; + + patches = [ ./apr-1.patch ] ++ extraPatches; + + # We are hitting the following issue even with APR 1.6.x + # -> https://issues.apache.org/jira/browse/SVN-4813 + # "-P" CPPFLAG is needed to build Python bindings and subversionClient + CPPFLAGS = [ "-P" ]; + + preConfigure = lib.optionalString needsAutogen '' + ./autogen.sh + ''; + + configureFlags = [ + (lib.withFeature bdbSupport "berkeley-db") + (lib.withFeatureAs httpServer "apxs" "${apacheHttpd.dev}/bin/apxs") + (lib.withFeatureAs (pythonBindings || perlBindings) "swig" swig) + (lib.withFeatureAs saslSupport "sasl" sasl) + (lib.withFeatureAs httpSupport "serf" serf) + "--with-zlib=${zlib.dev}" + "--with-sqlite=${sqlite.dev}" + "--with-apr=${apr.dev}" + "--with-apr-util=${aprutil.dev}" + ] ++ lib.optionals javahlBindings [ + "--enable-javahl" + "--with-jdk=${jdk}" + ]; + + preBuild = '' + makeFlagsArray=(APACHE_LIBEXECDIR=$out/modules) + ''; + + postInstall = '' + if test -n "$pythonBindings"; then + make swig-py swig_pydir=$(toPythonPath $out)/libsvn swig_pydir_extra=$(toPythonPath $out)/svn + make install-swig-py swig_pydir=$(toPythonPath $out)/libsvn swig_pydir_extra=$(toPythonPath $out)/svn + fi + + if test -n "$perlBindings"; then + make swig-pl-lib + make install-swig-pl-lib + cd subversion/bindings/swig/perl/native + perl Makefile.PL PREFIX=$out + make install + cd - + fi + + mkdir -p $out/share/bash-completion/completions + cp tools/client-side/bash_completion $out/share/bash-completion/completions/subversion + + for f in $out/lib/*.la $out/lib/python*/site-packages/*/*.la; do + substituteInPlace $f \ + --replace "${expat.dev}/lib" "${expat.out}/lib" \ + --replace "${zlib.dev}/lib" "${zlib.out}/lib" \ + --replace "${sqlite.dev}/lib" "${sqlite.out}/lib" \ + --replace "${openssl.dev}/lib" "${lib.getLib openssl}/lib" + done + ''; + + inherit perlBindings pythonBindings; + + enableParallelBuilding = true; + # Missing install dependencies: + # libtool: error: error: relink 'libsvn_ra_serf-1.la' with the above command before installing it + # make: *** [build-outputs.mk:1316: install-serf-lib] Error 1 + enableParallelInstalling = false; + + nativeCheckInputs = [ python3 ]; + doCheck = false; # fails 10 out of ~2300 tests + + meta = with lib; { + description = "A version control system intended to be a compelling replacement for CVS in the open source community"; + license = licenses.asl20; + homepage = "https://subversion.apache.org/"; + mainProgram = "svn"; + maintainers = with maintainers; [ eelco lovek323 ]; + platforms = platforms.linux ++ platforms.darwin; + }; + + } // lib.optionalAttrs stdenv.isDarwin { + CXX = "clang++"; + CC = "clang"; + CPP = "clang -E"; + CXXCPP = "clang++ -E"; + }); + +in { + subversion = common { + version = "1.14.3"; + sha256 = "sha256-lJ79RRoJQ19+hXNXTHHHtxsZTYRIkPpJzWHSJi6hpEA="; + }; +} diff --git a/pkgs/by-name/su/subversion/packages.nix b/pkgs/by-name/su/subversion/packages.nix new file mode 100644 index 0000000..5c7df2f --- /dev/null +++ b/pkgs/by-name/su/subversion/packages.nix @@ -0,0 +1,16 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + inherit (callPackages ./. { + sasl = cyrus_sasl; + inherit (darwin.apple_sdk.frameworks) CoreServices Security; + }) subversion; + + subversionClient = subversion.override { + bdbSupport = false; + perlBindings = true; + pythonBindings = true; + }; +} diff --git a/pkgs/by-name/sw/swig/2.x.nix b/pkgs/by-name/sw/swig/2.x.nix new file mode 100644 index 0000000..ac03372 --- /dev/null +++ b/pkgs/by-name/sw/swig/2.x.nix @@ -0,0 +1,35 @@ +{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, bison, pcre }: + +stdenv.mkDerivation rec { + pname = "swig"; + version = "2.0.12"; + + src = fetchFromGitHub { + owner = "swig"; + repo = "swig"; + rev = "rel-${version}"; + sha256 = "0khm9gh5pczfcihr0pbicaicc4v9kjm5ip2alvkhmbb3ga6njkcm"; + }; + + nativeBuildInputs = [ autoconf automake libtool bison ]; + buildInputs = [ pcre ]; + + configureFlags = [ "--without-tcl" ]; + + # Disable ccache documentation as it needs yodl + postPatch = '' + sed -i '/man1/d' CCache/Makefile.in + ''; + + preConfigure = '' + ./autogen.sh + ''; + + meta = with lib; { + description = "SWIG, an interface compiler that connects C/C++ code to higher-level languages"; + homepage = "https://swig.org/"; + # Different types of licenses available: http://www.swig.org/Release/LICENSE . + license = licenses.gpl3Plus; + platforms = with platforms; linux ++ darwin; + }; +} diff --git a/pkgs/by-name/sw/swig/3.x.nix b/pkgs/by-name/sw/swig/3.x.nix new file mode 100644 index 0000000..f50c02d --- /dev/null +++ b/pkgs/by-name/sw/swig/3.x.nix @@ -0,0 +1,36 @@ +{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, bison, pcre }: + +stdenv.mkDerivation rec { + pname = "swig"; + version = "3.0.12"; + + src = fetchFromGitHub { + owner = "swig"; + repo = "swig"; + rev = "rel-${version}"; + sha256 = "1wyffskbkzj5zyhjnnpip80xzsjcr3p0q5486z3wdwabnysnhn8n"; + }; + + PCRE_CONFIG = "${pcre.dev}/bin/pcre-config"; + nativeBuildInputs = [ autoconf automake libtool bison ]; + buildInputs = [ pcre ]; + + configureFlags = [ "--without-tcl" ]; + + # Disable ccache documentation as it needs yodl + postPatch = '' + sed -i '/man1/d' CCache/Makefile.in + ''; + + preConfigure = '' + ./autogen.sh + ''; + + meta = with lib; { + description = "An interface compiler that connects C/C++ code to higher-level languages"; + homepage = "https://swig.org/"; + # Different types of licenses available: http://www.swig.org/Release/LICENSE . + license = licenses.gpl3Plus; + platforms = with platforms; linux ++ darwin; + }; +} diff --git a/pkgs/by-name/sw/swig/4.nix b/pkgs/by-name/sw/swig/4.nix new file mode 100644 index 0000000..6b6d1bc --- /dev/null +++ b/pkgs/by-name/sw/swig/4.nix @@ -0,0 +1,37 @@ +{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, bison, pcre }: + +stdenv.mkDerivation rec { + pname = "swig"; + version = "4.0.2"; + + src = fetchFromGitHub { + owner = "swig"; + repo = "swig"; + rev = "rel-${version}"; + sha256 = "12vlps766xvwck8q0i280s8yx21qm2dxl34710ybpmz3c1cfdjsc"; + }; + + PCRE_CONFIG = "${pcre.dev}/bin/pcre-config"; + nativeBuildInputs = [ autoconf automake libtool bison ]; + buildInputs = [ pcre ]; + + configureFlags = [ "--without-tcl" ]; + + # Disable ccache documentation as it needs yodl + postPatch = '' + sed -i '/man1/d' CCache/Makefile.in + ''; + + preConfigure = '' + ./autogen.sh + ''; + + meta = with lib; { + description = "SWIG, an interface compiler that connects C/C++ code to higher-level languages"; + homepage = "https://swig.org/"; + # Different types of licenses available: http://www.swig.org/Release/LICENSE . + license = licenses.gpl3Plus; + maintainers = with maintainers; [ orivej ]; + platforms = with platforms; linux ++ darwin; + }; +} diff --git a/pkgs/by-name/sw/swig/default.nix b/pkgs/by-name/sw/swig/default.nix new file mode 100644 index 0000000..ad7b64c --- /dev/null +++ b/pkgs/by-name/sw/swig/default.nix @@ -0,0 +1,27 @@ +{ lib, stdenv, fetchurl, boost, tcl }: + +stdenv.mkDerivation rec { + pname = "swig"; + version = "1.3.40"; + + src = fetchurl { + url = "mirror://sourceforge/swig/${pname}-${version}.tar.gz"; + sha256 = "02dc8g8wy75nd2is1974rl24c6mdl0ai1vszs1xpg9nd7dlv6i8r"; + }; + + doCheck = !stdenv.isCygwin; + # 'make check' uses boost and tcl + buildInputs = lib.optionals doCheck [ boost tcl ]; + + configureFlags = [ "--disable-ccache" ]; + + + meta = with lib; { + description = "SWIG, an interface compiler that connects C/C++ code to higher-level languages"; + mainProgram = "swig"; + homepage = "https://swig.org/"; + # Different types of licenses available: http://www.swig.org/Release/LICENSE . + license = licenses.gpl3Plus; + platforms = with platforms; linux ++ darwin; + }; +} diff --git a/pkgs/by-name/sw/swig/packages.nix b/pkgs/by-name/sw/swig/packages.nix new file mode 100644 index 0000000..4467e7c --- /dev/null +++ b/pkgs/by-name/sw/swig/packages.nix @@ -0,0 +1,12 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + swig1 = callPackage ./. { }; + swig2 = callPackage ./2.x.nix { }; + swig3 = callPackage ./3.x.nix { }; + swig4 = callPackage ./4.nix { }; + swig = swig3; + swigWithJava = swig; +} diff --git a/pkgs/by-name/sy/systemd/0001-Start-device-units-for-uninitialised-encrypted-devic.patch b/pkgs/by-name/sy/systemd/0001-Start-device-units-for-uninitialised-encrypted-devic.patch new file mode 100644 index 0000000..b080262 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0001-Start-device-units-for-uninitialised-encrypted-devic.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Eelco Dolstra +Date: Tue, 8 Jan 2013 15:46:30 +0100 +Subject: [PATCH] Start device units for uninitialised encrypted devices + +This is necessary because the NixOS service that initialises the +filesystem depends on the appearance of the device unit. Also, this +makes more sense to me: the device is ready; it's the filesystem +that's not, but taking care of that is the responsibility of the mount +unit. (However, this ignores the fsck unit, so it's not perfect...) +--- + rules.d/99-systemd.rules.in | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/rules.d/99-systemd.rules.in b/rules.d/99-systemd.rules.in +index 0d68f31d36..6b52f7ed4b 100644 +--- a/rules.d/99-systemd.rules.in ++++ b/rules.d/99-systemd.rules.in +@@ -22,10 +22,6 @@ SUBSYSTEM=="block", TAG+="systemd" + SUBSYSTEM=="block", ENV{DM_SUSPENDED}=="1", IMPORT{db}="SYSTEMD_READY", GOTO="systemd_end" + SUBSYSTEM=="block", ACTION=="add", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0" + +-# Ignore encrypted devices with no identified superblock on it, since +-# we are probably still calling mke2fs or mkswap on it. +-SUBSYSTEM=="block", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0" +- + # Explicitly set SYSTEMD_READY=1 for DM devices that don't have it set yet, so that we always have something to import above + SUBSYSTEM=="block", ENV{DM_UUID}=="?*", ENV{SYSTEMD_READY}=="", ENV{SYSTEMD_READY}="1" + diff --git a/pkgs/by-name/sy/systemd/0002-Don-t-try-to-unmount-nix-or-nix-store.patch b/pkgs/by-name/sy/systemd/0002-Don-t-try-to-unmount-nix-or-nix-store.patch new file mode 100644 index 0000000..8507bb5 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0002-Don-t-try-to-unmount-nix-or-nix-store.patch @@ -0,0 +1,45 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Raito Bezarius +Date: Mon, 19 Jun 2023 02:11:35 +0200 +Subject: [PATCH] Don't try to unmount /nix or /nix/store + +They'll still be remounted read-only. + +https://github.com/NixOS/nixos/issues/126 + +Original-Author: Eelco Dolstra +--- + src/shared/fstab-util.c | 2 ++ + src/shutdown/umount.c | 6 ++++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/shared/fstab-util.c b/src/shared/fstab-util.c +index 55e76b6e16..015a608035 100644 +--- a/src/shared/fstab-util.c ++++ b/src/shared/fstab-util.c +@@ -66,6 +66,8 @@ bool fstab_is_extrinsic(const char *mount, const char *opts) { + /* Don't bother with the OS data itself */ + if (PATH_IN_SET(mount, + "/", ++ "/nix", ++ "/nix/store", + "/usr", + "/etc")) + return true; +diff --git a/src/shutdown/umount.c b/src/shutdown/umount.c +index 1a9b99d761..04ef9af1ea 100644 +--- a/src/shutdown/umount.c ++++ b/src/shutdown/umount.c +@@ -170,8 +170,10 @@ int mount_points_list_get(const char *mountinfo, MountPoint **head) { + static bool nonunmountable_path(const char *path) { + assert(path); + +- return PATH_IN_SET(path, "/", "/usr") || +- path_startswith(path, "/run/initramfs"); ++ return PATH_IN_SET(path, "/", "/usr") ++ || path_equal(path, "/nix") ++ || path_equal(path, "/nix/store") ++ || path_startswith(path, "/run/initramfs"); + } + + static void log_umount_blockers(const char *mnt) { diff --git a/pkgs/by-name/sy/systemd/0003-Fix-NixOS-containers.patch b/pkgs/by-name/sy/systemd/0003-Fix-NixOS-containers.patch new file mode 100644 index 0000000..535ca3d --- /dev/null +++ b/pkgs/by-name/sy/systemd/0003-Fix-NixOS-containers.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Eelco Dolstra +Date: Wed, 16 Apr 2014 10:59:28 +0200 +Subject: [PATCH] Fix NixOS containers + +In NixOS containers, the init script is bind-mounted into the +container, so checking early whether it exists will fail. +--- + src/nspawn/nspawn.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c +index 38196ef3d6..57d1750b00 100644 +--- a/src/nspawn/nspawn.c ++++ b/src/nspawn/nspawn.c +@@ -5602,6 +5602,7 @@ static int run(int argc, char *argv[]) { + goto finish; + } + } else { ++#if 0 + _cleanup_free_ char *p = NULL; + + if (arg_pivot_root_new) +@@ -5618,6 +5619,7 @@ static int run(int argc, char *argv[]) { + "Directory %s doesn't look like it has an OS tree (/usr/ directory is missing). Refusing.", arg_directory); + goto finish; + } ++#endif + } + + } else { diff --git a/pkgs/by-name/sy/systemd/0004-Add-some-NixOS-specific-unit-directories.patch b/pkgs/by-name/sy/systemd/0004-Add-some-NixOS-specific-unit-directories.patch new file mode 100644 index 0000000..d223276 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0004-Add-some-NixOS-specific-unit-directories.patch @@ -0,0 +1,128 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Raito Bezarius +Date: Mon, 19 Jun 2023 02:13:42 +0200 +Subject: [PATCH] Add some NixOS-specific unit directories + +Look in `/nix/var/nix/profiles/default/lib/systemd/{system,user}` for +units provided by packages installed into the default profile via +`nix-env -iA nixos.$package`. + +Also, remove /usr and /lib as these don't exist on NixOS. + +Original-Author: Eelco Dolstra +--- + src/basic/path-lookup.c | 18 ++---------------- + src/core/systemd.pc.in | 8 ++++---- + 2 files changed, 6 insertions(+), 20 deletions(-) + +diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c +index 4e3d59fc56..0d18b9a2d0 100644 +--- a/src/basic/path-lookup.c ++++ b/src/basic/path-lookup.c +@@ -92,11 +92,7 @@ int xdg_user_data_dir(char **ret, const char *suffix) { + } + + static const char* const user_data_unit_paths[] = { +- "/usr/local/lib/systemd/user", +- "/usr/local/share/systemd/user", + USER_DATA_UNIT_DIR, +- "/usr/lib/systemd/user", +- "/usr/share/systemd/user", + NULL + }; + +@@ -613,16 +609,13 @@ int lookup_paths_init( + persistent_config, + SYSTEM_CONFIG_UNIT_DIR, + "/etc/systemd/system", ++ "/nix/var/nix/profiles/default/lib/systemd/system", + STRV_IFNOTNULL(persistent_attached), + runtime_config, + "/run/systemd/system", + STRV_IFNOTNULL(runtime_attached), + STRV_IFNOTNULL(generator), +- "/usr/local/lib/systemd/system", + SYSTEM_DATA_UNIT_DIR, +- "/usr/lib/systemd/system", +- /* To be used ONLY for images which might be legacy split-usr */ +- STRV_IFNOTNULL(flags & LOOKUP_PATHS_SPLIT_USR ? "/lib/systemd/system" : NULL), + STRV_IFNOTNULL(generator_late)); + break; + +@@ -638,14 +631,11 @@ int lookup_paths_init( + persistent_config, + USER_CONFIG_UNIT_DIR, + "/etc/systemd/user", ++ "/nix/var/nix/profiles/default/lib/systemd/user", + runtime_config, + "/run/systemd/user", + STRV_IFNOTNULL(generator), +- "/usr/local/share/systemd/user", +- "/usr/share/systemd/user", +- "/usr/local/lib/systemd/user", + USER_DATA_UNIT_DIR, +- "/usr/lib/systemd/user", + STRV_IFNOTNULL(generator_late)); + break; + +@@ -805,7 +795,6 @@ char **generator_binary_paths(RuntimeScope scope) { + case RUNTIME_SCOPE_SYSTEM: + add = strv_new("/run/systemd/system-generators", + "/etc/systemd/system-generators", +- "/usr/local/lib/systemd/system-generators", + SYSTEM_GENERATOR_DIR); + break; + +@@ -813,7 +802,6 @@ char **generator_binary_paths(RuntimeScope scope) { + case RUNTIME_SCOPE_USER: + add = strv_new("/run/systemd/user-generators", + "/etc/systemd/user-generators", +- "/usr/local/lib/systemd/user-generators", + USER_GENERATOR_DIR); + break; + +@@ -852,14 +840,12 @@ char **env_generator_binary_paths(RuntimeScope runtime_scope) { + case RUNTIME_SCOPE_SYSTEM: + add = strv_new("/run/systemd/system-environment-generators", + "/etc/systemd/system-environment-generators", +- "/usr/local/lib/systemd/system-environment-generators", + SYSTEM_ENV_GENERATOR_DIR); + break; + + case RUNTIME_SCOPE_USER: + add = strv_new("/run/systemd/user-environment-generators", + "/etc/systemd/user-environment-generators", +- "/usr/local/lib/systemd/user-environment-generators", + USER_ENV_GENERATOR_DIR); + break; + +diff --git a/src/core/systemd.pc.in b/src/core/systemd.pc.in +index f3b85b0190..8ae544b495 100644 +--- a/src/core/systemd.pc.in ++++ b/src/core/systemd.pc.in +@@ -43,10 +43,10 @@ systemdsystemconfdir=${systemd_system_conf_dir} + systemd_user_conf_dir=${sysconfdir}/systemd/user + systemduserconfdir=${systemd_user_conf_dir} + +-systemd_system_unit_path=${systemd_system_conf_dir}:/etc/systemd/system:/run/systemd/system:/usr/local/lib/systemd/system:${systemd_system_unit_dir}:/usr/lib/systemd/system:/lib/systemd/system ++systemd_system_unit_path=${systemd_system_conf_dir}:/etc/systemd/system:/nix/var/nix/profiles/default/lib/systemd/system:/run/systemd/system:${systemdsystemunitdir} + systemdsystemunitpath=${systemd_system_unit_path} + +-systemd_user_unit_path=${systemd_user_conf_dir}:/etc/systemd/user:/run/systemd/user:/usr/local/lib/systemd/user:/usr/local/share/systemd/user:${systemd_user_unit_dir}:/usr/lib/systemd/user:/usr/share/systemd/user ++systemd_user_unit_path=${systemd_user_conf_dir}:/etc/systemd/user:/nix/var/nix/profiles/default/lib/systemd/user:/run/systemd/user:${systemduserunitdir} + systemduserunitpath=${systemd_user_unit_path} + + systemd_system_generator_dir=${prefix}/lib/systemd/system-generators +@@ -55,10 +55,10 @@ systemdsystemgeneratordir=${systemd_system_generator_dir} + systemd_user_generator_dir=${prefix}/lib/systemd/user-generators + systemdusergeneratordir=${systemd_user_generator_dir} + +-systemd_system_generator_path=/run/systemd/system-generators:/etc/systemd/system-generators:/usr/local/lib/systemd/system-generators:${systemd_system_generator_dir} ++systemd_system_generator_path=/run/systemd/system-generators:/etc/systemd/system-generators:${systemd_system_generator_dir} + systemdsystemgeneratorpath=${systemd_system_generator_path} + +-systemd_user_generator_path=/run/systemd/user-generators:/etc/systemd/user-generators:/usr/local/lib/systemd/user-generators:${systemd_user_generator_dir} ++systemd_user_generator_path=/run/systemd/user-generators:/etc/systemd/user-generators:${systemd_user_generator_dir} + systemdusergeneratorpath=${systemd_user_generator_path} + + systemd_sleep_dir=${prefix}/lib/systemd/system-sleep diff --git a/pkgs/by-name/sy/systemd/0005-Get-rid-of-a-useless-message-in-user-sessions.patch b/pkgs/by-name/sy/systemd/0005-Get-rid-of-a-useless-message-in-user-sessions.patch new file mode 100644 index 0000000..a0bcc6a --- /dev/null +++ b/pkgs/by-name/sy/systemd/0005-Get-rid-of-a-useless-message-in-user-sessions.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Eelco Dolstra +Date: Mon, 11 May 2015 15:39:38 +0200 +Subject: [PATCH] Get rid of a useless message in user sessions + +Namely lots of variants of + + Unit nix-var-nix-db.mount is bound to inactive unit dev-disk-by\x2dlabel-nixos.device. Stopping, too. + +in containers. +--- + src/core/manager.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/core/manager.c b/src/core/manager.c +index e61ebee253..22cc5cc843 100644 +--- a/src/core/manager.c ++++ b/src/core/manager.c +@@ -1562,7 +1562,8 @@ static unsigned manager_dispatch_stop_when_bound_queue(Manager *m) { + if (!unit_is_bound_by_inactive(u, &culprit)) + continue; + +- log_unit_debug(u, "Unit is stopped because bound to inactive unit %s.", culprit->id); ++ if (u->type != UNIT_MOUNT || detect_container() <= 0) ++ log_unit_debug(u, "Unit is stopped because bound to inactive unit %s.", culprit->id); + + /* If stopping a unit fails continuously we might enter a stop loop here, hence stop acting on the + * service being unnecessary after a while. */ diff --git a/pkgs/by-name/sy/systemd/0006-hostnamed-localed-timedated-disable-methods-that-cha.patch b/pkgs/by-name/sy/systemd/0006-hostnamed-localed-timedated-disable-methods-that-cha.patch new file mode 100644 index 0000000..b350e36 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0006-hostnamed-localed-timedated-disable-methods-that-cha.patch @@ -0,0 +1,105 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Gabriel Ebner +Date: Sun, 6 Dec 2015 14:26:36 +0100 +Subject: [PATCH] hostnamed, localed, timedated: disable methods that change + system settings. + +--- + src/hostname/hostnamed.c | 6 ++++++ + src/locale/localed.c | 9 +++++++++ + src/timedate/timedated.c | 10 ++++++++++ + 3 files changed, 25 insertions(+) + +diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c +index e1d53f2395..a224e6dadc 100644 +--- a/src/hostname/hostnamed.c ++++ b/src/hostname/hostnamed.c +@@ -1053,6 +1053,9 @@ static int method_set_static_hostname(sd_bus_message *m, void *userdata, sd_bus_ + if (r < 0) + return r; + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + name = empty_to_null(name); + + context_read_etc_hostname(c); +@@ -1116,6 +1119,9 @@ static int set_machine_info(Context *c, sd_bus_message *m, int prop, sd_bus_mess + if (r < 0) + return r; + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + name = empty_to_null(name); + + context_read_machine_info(c); +diff --git a/src/locale/localed.c b/src/locale/localed.c +index 5d96237fae..9af35cd29c 100644 +--- a/src/locale/localed.c ++++ b/src/locale/localed.c +@@ -229,6 +229,9 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er + + use_localegen = locale_gen_check_available(); + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + /* If single locale without variable name is provided, then we assume it is LANG=. */ + if (strv_length(l) == 1 && !strchr(l[0], '=')) { + if (!locale_is_valid(l[0])) +@@ -347,6 +350,9 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro + if (r < 0) + return bus_log_parse_error(r); + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + vc_context_empty_to_null(&in); + + r = vc_context_verify_and_warn(&in, LOG_ERR, error); +@@ -465,6 +471,9 @@ static int method_set_x11_keyboard(sd_bus_message *m, void *userdata, sd_bus_err + if (r < 0) + return bus_log_parse_error(r); + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + x11_context_empty_to_null(&in); + + r = x11_context_verify_and_warn(&in, LOG_ERR, error); +diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c +index c7be30f563..50f8aa8675 100644 +--- a/src/timedate/timedated.c ++++ b/src/timedate/timedated.c +@@ -659,6 +659,10 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error * + if (r < 0) + return r; + ++ if (getenv("NIXOS_STATIC_TIMEZONE")) ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing timezone via systemd is not supported when it is set in NixOS configuration."); ++ + if (!timezone_is_valid(z, LOG_DEBUG)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid or not installed time zone '%s'", z); + +@@ -737,6 +741,9 @@ static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error + if (r < 0) + return r; + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + if (lrtc == c->local_rtc && !fix_system) + return sd_bus_reply_method_return(m, NULL); + +@@ -917,6 +924,9 @@ static int method_set_ntp(sd_bus_message *m, void *userdata, sd_bus_error *error + if (r < 0) + return r; + ++ return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, ++ "Changing system settings via systemd is not supported on NixOS."); ++ + r = context_update_ntp_status(c, bus, m); + if (r < 0) + return r; diff --git a/pkgs/by-name/sy/systemd/0007-Change-usr-share-zoneinfo-to-etc-zoneinfo.patch b/pkgs/by-name/sy/systemd/0007-Change-usr-share-zoneinfo-to-etc-zoneinfo.patch new file mode 100644 index 0000000..3017867 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0007-Change-usr-share-zoneinfo-to-etc-zoneinfo.patch @@ -0,0 +1,138 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Nikolay Amiantov +Date: Tue, 11 Oct 2016 13:12:08 +0300 +Subject: [PATCH] Change /usr/share/zoneinfo to /etc/zoneinfo + +NixOS uses this path. +--- + man/localtime.xml | 4 ++-- + src/basic/time-util.c | 8 ++++---- + src/firstboot/firstboot.c | 2 +- + src/nspawn/nspawn.c | 4 ++-- + src/timedate/timedated.c | 8 ++++---- + 5 files changed, 13 insertions(+), 13 deletions(-) + +diff --git a/man/localtime.xml b/man/localtime.xml +index e486474c44..5f373d0723 100644 +--- a/man/localtime.xml ++++ b/man/localtime.xml +@@ -20,7 +20,7 @@ + + + +- /etc/localtime -> ../usr/share/zoneinfo/… ++ /etc/localtime -> zoneinfo/… + + + +@@ -30,7 +30,7 @@ + system-wide timezone of the local system that is used by + applications for presentation to the user. It should be an + absolute or relative symbolic link pointing to +- /usr/share/zoneinfo/, followed by a timezone ++ /etc/zoneinfo/, followed by a timezone + identifier such as Europe/Berlin or + Etc/UTC. The resulting link should lead to the + corresponding binary +diff --git a/src/basic/time-util.c b/src/basic/time-util.c +index f9014dc560..3ee0363369 100644 +--- a/src/basic/time-util.c ++++ b/src/basic/time-util.c +@@ -1412,7 +1412,7 @@ static int get_timezones_from_zone1970_tab(char ***ret) { + + assert(ret); + +- f = fopen("/usr/share/zoneinfo/zone1970.tab", "re"); ++ f = fopen("/etc/zoneinfo/zone1970.tab", "re"); + if (!f) + return -errno; + +@@ -1453,7 +1453,7 @@ static int get_timezones_from_tzdata_zi(char ***ret) { + + assert(ret); + +- f = fopen("/usr/share/zoneinfo/tzdata.zi", "re"); ++ f = fopen("/etc/zoneinfo/tzdata.zi", "re"); + if (!f) + return -errno; + +@@ -1565,7 +1565,7 @@ int verify_timezone(const char *name, int log_level) { + if (p - name >= PATH_MAX) + return -ENAMETOOLONG; + +- t = strjoina("/usr/share/zoneinfo/", name); ++ t = strjoina("/etc/zoneinfo/", name); + + fd = open(t, O_RDONLY|O_CLOEXEC); + if (fd < 0) +@@ -1625,7 +1625,7 @@ int get_timezone(char **ret) { + if (r < 0) + return r; /* returns EINVAL if not a symlink */ + +- e = PATH_STARTSWITH_SET(t, "/usr/share/zoneinfo/", "../usr/share/zoneinfo/"); ++ e = PATH_STARTSWITH_SET(t, "/etc/zoneinfo/", "../etc/zoneinfo/"); + if (!e) + return -EINVAL; + +diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c +index f77a5f6266..63bac85b29 100644 +--- a/src/firstboot/firstboot.c ++++ b/src/firstboot/firstboot.c +@@ -632,7 +632,7 @@ static int process_timezone(int rfd) { + if (isempty(arg_timezone)) + return 0; + +- e = strjoina("../usr/share/zoneinfo/", arg_timezone); ++ e = strjoina("zoneinfo/", arg_timezone); + + r = symlinkat_atomic_full(e, pfd, f, /* make_relative= */ false); + if (r < 0) +diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c +index e48ebe8342..41796f3358 100644 +--- a/src/nspawn/nspawn.c ++++ b/src/nspawn/nspawn.c +@@ -1845,8 +1845,8 @@ int userns_mkdir(const char *root, const char *path, mode_t mode, uid_t uid, gid + static const char *timezone_from_path(const char *path) { + return PATH_STARTSWITH_SET( + path, +- "../usr/share/zoneinfo/", +- "/usr/share/zoneinfo/"); ++ "../etc/zoneinfo/", ++ "/etc/zoneinfo/"); + } + + static bool etc_writable(void) { +diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c +index 50f8aa8675..aff156ab42 100644 +--- a/src/timedate/timedated.c ++++ b/src/timedate/timedated.c +@@ -276,7 +276,7 @@ static int context_read_data(Context *c) { + + r = get_timezone(&t); + if (r == -EINVAL) +- log_warning_errno(r, "/etc/localtime should be a symbolic link to a time zone data file in /usr/share/zoneinfo/."); ++ log_warning_errno(r, "/etc/localtime should be a symbolic link to a time zone data file in /etc/zoneinfo/."); + else if (r < 0) + log_warning_errno(r, "Failed to get target of /etc/localtime: %m"); + +@@ -300,7 +300,7 @@ static int context_write_data_timezone(Context *c) { + + if (isempty(c->zone) || streq(c->zone, "UTC")) { + +- if (access("/usr/share/zoneinfo/UTC", F_OK) < 0) { ++ if (access("/etc/zoneinfo/UTC", F_OK) < 0) { + + if (unlink("/etc/localtime") < 0 && errno != ENOENT) + return -errno; +@@ -308,9 +308,9 @@ static int context_write_data_timezone(Context *c) { + return 0; + } + +- source = "../usr/share/zoneinfo/UTC"; ++ source = "../etc/zoneinfo/UTC"; + } else { +- p = path_join("../usr/share/zoneinfo", c->zone); ++ p = path_join("../etc/zoneinfo", c->zone); + if (!p) + return -ENOMEM; + diff --git a/pkgs/by-name/sy/systemd/0008-localectl-use-etc-X11-xkb-for-list-x11.patch b/pkgs/by-name/sy/systemd/0008-localectl-use-etc-X11-xkb-for-list-x11.patch new file mode 100644 index 0000000..fe0dca1 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0008-localectl-use-etc-X11-xkb-for-list-x11.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Imuli +Date: Wed, 19 Oct 2016 08:46:47 -0400 +Subject: [PATCH] localectl: use /etc/X11/xkb for list-x11-* + +NixOS has an option to link the xkb data files to /etc/X11, but not to +/usr/share/X11. +--- + src/locale/localectl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/locale/localectl.c b/src/locale/localectl.c +index 32354027f1..1d231f1afc 100644 +--- a/src/locale/localectl.c ++++ b/src/locale/localectl.c +@@ -297,7 +297,7 @@ static int list_x11_keymaps(int argc, char **argv, void *userdata) { + } state = NONE, look_for; + int r; + +- f = fopen("/usr/share/X11/xkb/rules/base.lst", "re"); ++ f = fopen("/etc/X11/xkb/rules/base.lst", "re"); + if (!f) + return log_error_errno(errno, "Failed to open keyboard mapping list. %m"); + diff --git a/pkgs/by-name/sy/systemd/0009-add-rootprefix-to-lookup-dir-paths.patch b/pkgs/by-name/sy/systemd/0009-add-rootprefix-to-lookup-dir-paths.patch new file mode 100644 index 0000000..15fe403 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0009-add-rootprefix-to-lookup-dir-paths.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Andreas Rammhold +Date: Thu, 9 May 2019 11:15:22 +0200 +Subject: [PATCH] add rootprefix to lookup dir paths + +systemd does not longer use the UDEVLIBEXEC directory as root for +discovery default udev rules. By adding `$out/lib` to the lookup paths +we should again be able to discover the udev rules amongst other default +files that I might have missed. +--- + src/basic/constants.h | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/basic/constants.h b/src/basic/constants.h +index 6bb5f3c281..678d13737d 100644 +--- a/src/basic/constants.h ++++ b/src/basic/constants.h +@@ -65,13 +65,15 @@ + "/etc/" n "\0" \ + "/run/" n "\0" \ + "/usr/local/lib/" n "\0" \ +- "/usr/lib/" n "\0" ++ "/usr/lib/" n "\0" \ ++ PREFIX "/lib/" n "\0" + + #define CONF_PATHS_USR(n) \ + "/etc/" n, \ + "/run/" n, \ + "/usr/local/lib/" n, \ +- "/usr/lib/" n ++ "/usr/lib/" n, \ ++ PREFIX "/lib/" n + + #define CONF_PATHS(n) \ + CONF_PATHS_USR(n) diff --git a/pkgs/by-name/sy/systemd/0010-systemd-shutdown-execute-scripts-in-etc-systemd-syst.patch b/pkgs/by-name/sy/systemd/0010-systemd-shutdown-execute-scripts-in-etc-systemd-syst.patch new file mode 100644 index 0000000..6f0b81a --- /dev/null +++ b/pkgs/by-name/sy/systemd/0010-systemd-shutdown-execute-scripts-in-etc-systemd-syst.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Nikolay Amiantov +Date: Thu, 25 Jul 2019 20:45:55 +0300 +Subject: [PATCH] systemd-shutdown: execute scripts in + /etc/systemd/system-shutdown + +This is needed for NixOS to use such scripts as systemd directory is immutable. +--- + src/shutdown/shutdown.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c +index b976b7d8cf..b1c02df6fd 100644 +--- a/src/shutdown/shutdown.c ++++ b/src/shutdown/shutdown.c +@@ -336,6 +336,7 @@ static void init_watchdog(void) { + int main(int argc, char *argv[]) { + static const char* const dirs[] = { + SYSTEM_SHUTDOWN_PATH, ++ "/etc/systemd/system-shutdown", + NULL + }; + _cleanup_free_ char *cgroup = NULL; diff --git a/pkgs/by-name/sy/systemd/0011-systemd-sleep-execute-scripts-in-etc-systemd-system-.patch b/pkgs/by-name/sy/systemd/0011-systemd-sleep-execute-scripts-in-etc-systemd-system-.patch new file mode 100644 index 0000000..a5ed574 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0011-systemd-sleep-execute-scripts-in-etc-systemd-system-.patch @@ -0,0 +1,22 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Nikolay Amiantov +Date: Thu, 25 Jul 2019 20:46:58 +0300 +Subject: [PATCH] systemd-sleep: execute scripts in /etc/systemd/system-sleep + +This is needed for NixOS to use such scripts as systemd directory is immutable. +--- + src/sleep/sleep.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c +index 21af3e9e52..6d096e3c78 100644 +--- a/src/sleep/sleep.c ++++ b/src/sleep/sleep.c +@@ -215,6 +215,7 @@ static int execute( + }; + static const char* const dirs[] = { + SYSTEM_SLEEP_PATH, ++ "/etc/systemd/system-sleep", + NULL + }; + diff --git a/pkgs/by-name/sy/systemd/0012-path-util.h-add-placeholder-for-DEFAULT_PATH_NORMAL.patch b/pkgs/by-name/sy/systemd/0012-path-util.h-add-placeholder-for-DEFAULT_PATH_NORMAL.patch new file mode 100644 index 0000000..55e5562 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0012-path-util.h-add-placeholder-for-DEFAULT_PATH_NORMAL.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Florian Klink +Date: Sun, 8 Mar 2020 01:05:54 +0100 +Subject: [PATCH] path-util.h: add placeholder for DEFAULT_PATH_NORMAL + +This will be the $PATH used to lookup ExecStart= etc. options, which +systemd itself uses extensively. +--- + src/basic/path-util.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/basic/path-util.h b/src/basic/path-util.h +index 6d943e967f..d4380aa7e3 100644 +--- a/src/basic/path-util.h ++++ b/src/basic/path-util.h +@@ -25,9 +25,9 @@ + # define PATH_SBIN_BIN_NULSTR(x) PATH_NORMAL_SBIN_BIN_NULSTR(x) + #endif + +-#define DEFAULT_PATH PATH_SBIN_BIN("/usr/local/") ":" PATH_SBIN_BIN("/usr/") +-#define DEFAULT_PATH_NULSTR PATH_SBIN_BIN_NULSTR("/usr/local/") PATH_SBIN_BIN_NULSTR("/usr/") +-#define DEFAULT_PATH_COMPAT PATH_SPLIT_SBIN_BIN("/usr/local/") ":" PATH_SPLIT_SBIN_BIN("/usr/") ":" PATH_SPLIT_SBIN_BIN("/") ++#define DEFAULT_PATH "@defaultPathNormal@" ++#define DEFAULT_PATH_NULSTR "@defaultPathNormal@\0" ++#define DEFAULT_PATH_COMPAT DEFAULT_PATH + + #ifndef DEFAULT_USER_PATH + # define DEFAULT_USER_PATH DEFAULT_PATH diff --git a/pkgs/by-name/sy/systemd/0013-inherit-systemd-environment-when-calling-generators.patch b/pkgs/by-name/sy/systemd/0013-inherit-systemd-environment-when-calling-generators.patch new file mode 100644 index 0000000..8bccf55 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0013-inherit-systemd-environment-when-calling-generators.patch @@ -0,0 +1,39 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Yuriy Taraday +Date: Fri, 17 Jun 2022 12:45:10 +0000 +Subject: [PATCH] inherit systemd environment when calling generators. + +Systemd generators need access to the environment configured in +stage-2-init.sh since it schedules fsck and mkfs executions based on +being able to find an appropriate binary for the target filesystem. + +With this commit I am altering the systemd behaviour since upstream +tries to gather environments with that they call +"environment-generators" and then seems to pass that on to all the other +executables that are being called from managers. +--- + src/core/manager.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/core/manager.c b/src/core/manager.c +index 22cc5cc843..5dc7d4504f 100644 +--- a/src/core/manager.c ++++ b/src/core/manager.c +@@ -3914,9 +3914,17 @@ static int build_generator_environment(Manager *m, char ***ret) { + * adjust generated units to that. Let's pass down some bits of information that are easy for us to + * determine (but a bit harder for generator scripts to determine), as environment variables. */ + ++ // On NixOS we must propagate PATH to generators so they are ++ // able to find binaries such as `fsck.${fstype}` and ++ // `mkfs.${fstype}`. That is why we ignore transient_environment that ++ // overrides the PATH variable. This propagates systemd's ++ // environment (e.g. PATH) that was setup ++ // before calling systemd from stage-2-init.sh. ++#if 0 + nl = strv_copy(m->transient_environment); + if (!nl) + return -ENOMEM; ++#endif + + r = strv_env_assign(&nl, "SYSTEMD_SCOPE", runtime_scope_to_string(m->runtime_scope)); + if (r < 0) diff --git a/pkgs/by-name/sy/systemd/0014-core-don-t-taint-on-unmerged-usr.patch b/pkgs/by-name/sy/systemd/0014-core-don-t-taint-on-unmerged-usr.patch new file mode 100644 index 0000000..8b86291 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0014-core-don-t-taint-on-unmerged-usr.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: oxalica +Date: Tue, 4 Oct 2022 09:18:07 +0800 +Subject: [PATCH] core: don't taint on unmerged /usr + +NixOS has very different approach towards /bin and /sbin - they don't +really exist (except for /bin/sh and /usr/bin/env, because these are used +heavily in shebangs around the world). The concept of merged or unmerged +usr doesn't really apply here at all, it's neither of the two. +Users don't execute things from /bin or /sbin, there's nothing else in +there. In all cases, systemd doesn't look things up from /usr/bin or /bin, +so showing the taint isn't really helpful. + +See also: https://github.com/systemd/systemd/issues/24191 +--- + src/core/manager.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/core/manager.c b/src/core/manager.c +index 5dc7d4504f..6208c9aa31 100644 +--- a/src/core/manager.c ++++ b/src/core/manager.c +@@ -4800,9 +4800,6 @@ char* manager_taint_string(const Manager *m) { + const char* stage[12] = {}; + size_t n = 0; + +- _cleanup_free_ char *usrbin = NULL; +- if (readlink_malloc("/bin", &usrbin) < 0 || !PATH_IN_SET(usrbin, "usr/bin", "/usr/bin")) +- stage[n++] = "unmerged-usr"; + + if (access("/proc/cgroups", F_OK) < 0) + stage[n++] = "cgroups-missing"; diff --git a/pkgs/by-name/sy/systemd/0015-tpm2_context_init-fix-driver-name-checking.patch b/pkgs/by-name/sy/systemd/0015-tpm2_context_init-fix-driver-name-checking.patch new file mode 100644 index 0000000..768f57e --- /dev/null +++ b/pkgs/by-name/sy/systemd/0015-tpm2_context_init-fix-driver-name-checking.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Nick Cao +Date: Sun, 15 Jan 2023 20:15:55 +0800 +Subject: [PATCH] tpm2_context_init: fix driver name checking + +https://github.com/systemd/systemd/commit/542dbc623e introduced +additional checks for tpm2 driver names, namely ensuring the driver +name, when concated with "libtss2-tcti-" and ".so.0", generates a valid +filename (with no '/' inside). + +For example, if the driver is name "device", the line + fn = strjoina("libtss2-tcti-", driver, ".so.0") +would yield "libtss2-tcti-device.so.0", passing the check. And the +filename is then passed to dlopen for loading the driver. + +Our current approach for systemd to correctly locate these dynamically +loaded libraries is to patch the filenames to include their absolute +path. Thus the line mentioned above is patched into + fn = strjoina("/nix/store/xxxxxxx-tpm2-tss-3.2.0/lib/libtss2-tcti-", driver, ".so.0") +yielding "/nix/store/xxxxxxx-tpm2-tss-3.2.0/lib/libtss2-tcti-device.so.0", +tripping the check. + +This patch relaxes the check to also accept absolute paths, by replacing +filename_is_valid with path_is_valid. +--- + src/shared/tpm2-util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/shared/tpm2-util.c b/src/shared/tpm2-util.c +index 5e07b88a89..8dd7315009 100644 +--- a/src/shared/tpm2-util.c ++++ b/src/shared/tpm2-util.c +@@ -654,7 +654,7 @@ int tpm2_context_new(const char *device, Tpm2Context **ret_context) { + fn = strjoina("libtss2-tcti-", driver, ".so.0"); + + /* Better safe than sorry, let's refuse strings that cannot possibly be valid driver early, before going to disk. */ +- if (!filename_is_valid(fn)) ++ if (!path_is_valid(fn)) + return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "TPM2 driver name '%s' not valid, refusing.", driver); + + context->tcti_dl = dlopen(fn, RTLD_NOW); diff --git a/pkgs/by-name/sy/systemd/0016-systemctl-edit-suggest-systemdctl-edit-runtime-on-sy.patch b/pkgs/by-name/sy/systemd/0016-systemctl-edit-suggest-systemdctl-edit-runtime-on-sy.patch new file mode 100644 index 0000000..96cd420 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0016-systemctl-edit-suggest-systemdctl-edit-runtime-on-sy.patch @@ -0,0 +1,45 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Maximilian Bosch +Date: Fri, 1 Sep 2023 09:57:02 +0200 +Subject: [PATCH] systemctl-edit: suggest `systemdctl edit --runtime` on system + scope + +This is a NixOS-specific change. When trying to modify a unit with +`systemctl edit` on NixOS, it'll fail with "Read-only file system": + + $ systemctl edit libvirtd + Failed to open "/etc/systemd/system/libvirtd.service.d/.#override.conffa9825a0c9a249eb": Read-only file system + +This is because `/etc/systemd/system` is a symlink into the store. In +fact, I'd consider this a feature rather than a bug since this ensures I +don't introduce state imperatively. + +However, people wrongly assume that it's not possible to edit units +ad-hoc and re-deploy their system for quick&dirty debugging where this +would be absolutely fine (and doable with `--runtime` which adds a +transient and non-persistent unit override in `/run`). + +To make sure that people learn about it quicker, this patch +throws an error which suggests using `--runtime` when running +`systemctl edit` on the system scope. + +For the user scope this isn't needed because user-level unit overrides +are written into `$XDG_CONFIG_HOME/systemd/user`. +--- + src/systemctl/systemctl-edit.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/systemctl/systemctl-edit.c b/src/systemctl/systemctl-edit.c +index 367afa20f7..5777154d01 100644 +--- a/src/systemctl/systemctl-edit.c ++++ b/src/systemctl/systemctl-edit.c +@@ -322,6 +322,9 @@ int verb_edit(int argc, char *argv[], void *userdata) { + sd_bus *bus; + int r; + ++ if (!arg_runtime && arg_runtime_scope == RUNTIME_SCOPE_SYSTEM) ++ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "The unit-directory '/etc/systemd/system' is read-only on NixOS, so it's not possible to edit system-units directly. Use 'systemctl edit --runtime' instead."); ++ + if (!on_tty()) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Cannot edit units if not on a tty."); + diff --git a/pkgs/by-name/sy/systemd/0017-meson.build-do-not-create-systemdstatedir.patch b/pkgs/by-name/sy/systemd/0017-meson.build-do-not-create-systemdstatedir.patch new file mode 100644 index 0000000..fd38aa9 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0017-meson.build-do-not-create-systemdstatedir.patch @@ -0,0 +1,21 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: nikstur +Date: Mon, 6 Nov 2023 22:51:38 +0100 +Subject: [PATCH] meson.build: do not create systemdstatedir + +--- + meson.build | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/meson.build b/meson.build +index 7419e2b0b0..c82a527976 100644 +--- a/meson.build ++++ b/meson.build +@@ -2497,7 +2497,6 @@ install_data('LICENSE.GPL2', + install_subdir('LICENSES', + install_dir : docdir) + +-install_emptydir(systemdstatedir) + + ############################################################ + diff --git a/pkgs/by-name/sy/systemd/0018-timesyncd-disable-NSCD-when-DNSSEC-validation-is-dis.patch b/pkgs/by-name/sy/systemd/0018-timesyncd-disable-NSCD-when-DNSSEC-validation-is-dis.patch new file mode 100644 index 0000000..68ae226 --- /dev/null +++ b/pkgs/by-name/sy/systemd/0018-timesyncd-disable-NSCD-when-DNSSEC-validation-is-dis.patch @@ -0,0 +1,46 @@ +From 7a27556920fe1feefd17096841c8f3ca1294a1b3 Mon Sep 17 00:00:00 2001 +From: Yuri Nesterov +Date: Wed, 21 Jun 2023 17:17:38 +0300 +Subject: [PATCH] timesyncd: disable NSCD when DNSSEC validation is disabled + +Systemd-timesyncd sets SYSTEMD_NSS_RESOLVE_VALIDATE=0 in the unit file +to disable DNSSEC validation but it doesn't work when NSCD is used in +the system. This patch disabes NSCD in systemd-timesyncd when +SYSTEMD_NSS_RESOLVE_VALIDATE is set to 0 so that it uses NSS libraries +directly. +--- + src/timesync/timesyncd.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c +index 1d8ebecc91..2b0ae361ff 100644 +--- a/src/timesync/timesyncd.c ++++ b/src/timesync/timesyncd.c +@@ -21,6 +21,11 @@ + #include "timesyncd-conf.h" + #include "timesyncd-manager.h" + #include "user-util.h" ++#include "env-util.h" ++ ++struct traced_file; ++extern void __nss_disable_nscd(void (*)(size_t, struct traced_file *)); ++static void register_traced_file(size_t dbidx, struct traced_file *finfo) {} + + static int advance_tstamp(int fd, const struct stat *st) { + assert_se(fd >= 0); +@@ -198,6 +203,12 @@ static int run(int argc, char *argv[]) { + if (r < 0) + return log_error_errno(r, "Failed to parse fallback server strings: %m"); + ++ r = getenv_bool_secure("SYSTEMD_NSS_RESOLVE_VALIDATE"); ++ if (r == 0) { ++ log_info("Disabling NSCD because DNSSEC validation is turned off"); ++ __nss_disable_nscd(register_traced_file); ++ } ++ + log_debug("systemd-timesyncd running as pid " PID_FMT, getpid_cached()); + + notify_message = notify_start("READY=1\n" +-- +2.34.1 + diff --git a/pkgs/by-name/sy/systemd/default.nix b/pkgs/by-name/sy/systemd/default.nix new file mode 100644 index 0000000..9cdc5dc --- /dev/null +++ b/pkgs/by-name/sy/systemd/default.nix @@ -0,0 +1,932 @@ +# NOTE: Make sure to (re-)format this file on changes with `nixpkgs-fmt`! + +{ stdenv +, lib +, nixosTests +, pkgsCross +, fetchFromGitHub +, fetchpatch +, fetchzip +, buildPackages +, makeBinaryWrapper +, ninja +, meson +, m4 +, pkg-config +, coreutils +, gperf +, getent +, glibcLocales + + # glib is only used during tests (test-bus-gvariant, test-bus-marshal) +, glib +, gettext +, python3Packages + + # Mandatory dependencies +, libcap +, util-linux +, kbd +, kmod +, libxcrypt + + # Optional dependencies +, pam +, cryptsetup +, audit +, acl +, lz4 +, libgcrypt +, libgpg-error +, libidn2 +, curl +, gnutar +, gnupg +, zlib +, xz +, zstd +, tpm2-tss +, libuuid +, libapparmor +, intltool +, bzip2 +, pcre2 +, elfutils +, linuxHeaders ? stdenv.cc.libc.linuxHeaders +, gnutls +, iptables +, withSelinux ? false +, libselinux +, withLibseccomp ? lib.meta.availableOn stdenv.hostPlatform libseccomp +, libseccomp +, withKexectools ? lib.meta.availableOn stdenv.hostPlatform kexec-tools +, kexec-tools +, bashInteractive +, bash +, libmicrohttpd +, libfido2 +, p11-kit +, libpwquality +, qrencode + + # the (optional) BPF feature requires bpftool, libbpf, clang and llvm-strip to + # be available during build time. + # Only libbpf should be a runtime dependency. + # Note: llvmPackages is explicitly taken from buildPackages instead of relying + # on splicing. Splicing will evaluate the adjacent (pkgsHostTarget) llvmPackages + # which is sometimes problematic: llvmPackages.clang looks at targetPackages.stdenv.cc + # which, in the unfortunate case of pkgsCross.ghcjs, `throw`s. If we + # explicitly take buildPackages.llvmPackages, this is no problem because + # `buildPackages.targetPackages.stdenv.cc == stdenv.cc` relative to + # us. Working around this is important, because systemd is in the dependency + # closure of GHC via emscripten and jdk. +, bpftools +, libbpf + + # Needed to produce a ukify that works for cross compiling UKIs. +, targetPackages + +, withAcl ? true +, withAnalyze ? true +, withApparmor ? true +, withAudit ? true + # compiles systemd-boot, assumes EFI is available. +, withBootloader ? withEfi + && !stdenv.hostPlatform.isMusl + # "Unknown 64-bit data model" + && !stdenv.hostPlatform.isRiscV32 + # adds bzip2, lz4, xz and zstd +, withCompression ? true +, withCoredump ? true +, withCryptsetup ? true +, withRepart ? true +, withDocumentation ? true +, withEfi ? stdenv.hostPlatform.isEfi +, withFido2 ? true + # conflicts with the NixOS /etc management +, withFirstboot ? false +, withHomed ? !stdenv.hostPlatform.isMusl +, withHostnamed ? true +, withHwdb ? true +, withImportd ? !stdenv.hostPlatform.isMusl +, withIptables ? true +, withKmod ? true +, withLibBPF ? lib.versionAtLeast buildPackages.llvmPackages.clang.version "10.0" + # assumes hard floats + && (stdenv.hostPlatform.isAarch -> lib.versionAtLeast stdenv.hostPlatform.parsed.cpu.version "6") + # see https://github.com/NixOS/nixpkgs/pull/194149#issuecomment-1266642211 + && !stdenv.hostPlatform.isMips64 + # can't find gnu/stubs-32.h + && (stdenv.hostPlatform.isPower64 -> stdenv.hostPlatform.isBigEndian) + # https://reviews.llvm.org/D43106#1019077 + && (stdenv.hostPlatform.isRiscV32 -> stdenv.cc.isClang) + # buildPackages.targetPackages.llvmPackages is the same as llvmPackages, + # but we do it this way to avoid taking llvmPackages as an input, and + # risking making it too easy to ignore the above comment about llvmPackages. + && lib.meta.availableOn stdenv.hostPlatform buildPackages.targetPackages.llvmPackages.compiler-rt +, withLibidn2 ? true +, withLocaled ? true +, withLogind ? true +, withMachined ? true +, withNetworkd ? true +, withNss ? !stdenv.hostPlatform.isMusl +, withOomd ? true +, withPam ? true +, withPasswordQuality ? true +, withPCRE2 ? true +, withPolkit ? true +, withPortabled ? !stdenv.hostPlatform.isMusl +, withQrencode ? true +, withRemote ? !stdenv.hostPlatform.isMusl +, withResolved ? true +, withShellCompletions ? true +, withSysusers ? true +, withSysupdate ? true +, withTimedated ? true +, withTimesyncd ? true +, withTpm2Tss ? true + # adds python to closure which is too much by default +, withUkify ? false +, withUserDb ? true +, withUtmp ? !stdenv.hostPlatform.isMusl +, withVmspawn ? true + # kernel-install shouldn't usually be used on NixOS, but can be useful, e.g. for + # building disk images for non-NixOS systems. To save users from trying to use it + # on their live NixOS system, we disable it by default. +, withKernelInstall ? false + # tests assume too much system access for them to be feasible for us right now +, withTests ? false + # build only libudev and libsystemd +, buildLibsOnly ? false + + # yes, pname is an argument here +, pname ? "systemd" + +, libxslt +, docbook_xsl +, docbook_xml_dtd_42 +, docbook_xml_dtd_45 +, withLogTrace ? false +}: + +assert withImportd -> withCompression; +assert withCoredump -> withCompression; +assert withHomed -> withCryptsetup; +assert withHomed -> withPam; +assert withUkify -> (withEfi && withBootloader); +assert withRepart -> withCryptsetup; +assert withBootloader -> withEfi; + +let + wantCurl = withRemote || withImportd; + wantGcrypt = withResolved || withImportd; + version = "255.4"; + + # Use the command below to update `releaseTimestamp` on every (major) version + # change. More details in the commentary at mesonFlags. + # command: + # $ curl -s https://api.github.com/repos/systemd/systemd/releases/latest | \ + # jq '.created_at|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime' + releaseTimestamp = "1701895110"; +in +stdenv.mkDerivation (finalAttrs: { + inherit pname version; + + # We use systemd/systemd-stable for src, and ship NixOS-specific patches inside nixpkgs directly + # This has proven to be less error-prone than the previous systemd fork. + src = fetchFromGitHub { + owner = "systemd"; + repo = "systemd-stable"; + rev = "v${version}"; + hash = "sha256-P1mKq+ythrv8MU7y2CuNtEx6qCDacugzfsPRZL+NPys="; + }; + + # On major changes, or when otherwise required, you *must* : + # 1. reformat the patches, + # 2. `git am path/to/00*.patch` them into a systemd worktree, + # 3. rebase to the more recent systemd version, + # 4. and export the patches again via + # `git -c format.signoff=false format-patch v${version} --no-numbered --zero-commit --no-signature`. + # Use `find . -name "*.patch" | sort` to get an up-to-date listing of all + # patches + patches = [ + ./0001-Start-device-units-for-uninitialised-encrypted-devic.patch + ./0002-Don-t-try-to-unmount-nix-or-nix-store.patch + ./0003-Fix-NixOS-containers.patch + ./0004-Add-some-NixOS-specific-unit-directories.patch + ./0005-Get-rid-of-a-useless-message-in-user-sessions.patch + ./0006-hostnamed-localed-timedated-disable-methods-that-cha.patch + ./0007-Change-usr-share-zoneinfo-to-etc-zoneinfo.patch + ./0008-localectl-use-etc-X11-xkb-for-list-x11.patch + ./0009-add-rootprefix-to-lookup-dir-paths.patch + ./0010-systemd-shutdown-execute-scripts-in-etc-systemd-syst.patch + ./0011-systemd-sleep-execute-scripts-in-etc-systemd-system-.patch + ./0012-path-util.h-add-placeholder-for-DEFAULT_PATH_NORMAL.patch + ./0013-inherit-systemd-environment-when-calling-generators.patch + ./0014-core-don-t-taint-on-unmerged-usr.patch + ./0015-tpm2_context_init-fix-driver-name-checking.patch + ./0016-systemctl-edit-suggest-systemdctl-edit-runtime-on-sy.patch + ./0017-meson.build-do-not-create-systemdstatedir.patch + ] ++ lib.optional (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isGnu) [ + ./0018-timesyncd-disable-NSCD-when-DNSSEC-validation-is-dis.patch + ] ++ lib.optional (stdenv.hostPlatform.isPower || stdenv.hostPlatform.isRiscV || stdenv.hostPlatform.isMips) [ + # Fixed upstream and included in the main and stable branches. Can be dropped + # when bumping to >= v255.5. + # https://github.com/systemd/systemd/issues/30448 + # https://github.com/NixOS/nixpkgs/pull/282607 + (fetchpatch { + url = "https://github.com/systemd/systemd/commit/8040fa55a1cbc34dede3205a902095ecd26c21e3.patch"; + sha256 = "0c6z7bsndbkb8m130jnjpsl138sfv3q171726n5vkyl2n9ihnavk"; + }) + ] ++ lib.optional stdenv.hostPlatform.isMusl ( + let + oe-core = fetchzip { + url = "https://git.openembedded.org/openembedded-core/snapshot/openembedded-core-6fdf03bd950e55ef7881041606f6e76141033716.tar.gz"; + sha256 = "/+9aJdOxBY8Y4vJPftOCxmyK8L2nvR82KmJxil1a2aY="; + }; + musl-patches = oe-core + "/meta/recipes-core/systemd/systemd"; + in + [ + (musl-patches + "/0017-Adjust-for-musl-headers.patch") + (musl-patches + "/0016-pass-correct-parameters-to-getdents64.patch") + (musl-patches + "/0018-test-bus-error-strerror-is-assumed-to-be-GNU-specifi.patch") + (musl-patches + "/0001-missing_type.h-add-comparison_fn_t.patch") + (musl-patches + "/0002-add-fallback-parse_printf_format-implementation.patch") + (musl-patches + "/0003-src-basic-missing.h-check-for-missing-strndupa.patch") + (musl-patches + "/0004-don-t-fail-if-GLOB_BRACE-and-GLOB_ALTDIRFUNC-is-not-.patch") + (musl-patches + "/0005-add-missing-FTW_-macros-for-musl.patch") + (musl-patches + "/0006-Use-uintmax_t-for-handling-rlim_t.patch") + (musl-patches + "/0007-don-t-pass-AT_SYMLINK_NOFOLLOW-flag-to-faccessat.patch") + (musl-patches + "/0008-Define-glibc-compatible-basename-for-non-glibc-syste.patch") + (musl-patches + "/0009-Do-not-disable-buffering-when-writing-to-oom_score_a.patch") + (musl-patches + "/0010-distinguish-XSI-compliant-strerror_r-from-GNU-specif.patch") + (musl-patches + "/0011-avoid-redefinition-of-prctl_mm_map-structure.patch") + (musl-patches + "/0012-do-not-disable-buffer-in-writing-files.patch") + (musl-patches + "/0013-Handle-__cpu_mask-usage.patch") + (musl-patches + "/0014-Handle-missing-gshadow.patch") + (musl-patches + "/0015-missing_syscall.h-Define-MIPS-ABI-defines-for-musl.patch") + (musl-patches + "/0020-sd-event-Make-malloc_trim-conditional-on-glibc.patch") + (musl-patches + "/0021-shared-Do-not-use-malloc_info-on-musl.patch") + (musl-patches + "/0022-avoid-missing-LOCK_EX-declaration.patch") + ] + ); + + postPatch = '' + substituteInPlace src/basic/path-util.h --replace "@defaultPathNormal@" "${placeholder "out"}/bin/" + '' + lib.optionalString withLibBPF '' + substituteInPlace meson.build \ + --replace "find_program('clang'" "find_program('${stdenv.cc.targetPrefix}clang'" + '' + lib.optionalString withUkify '' + substituteInPlace src/ukify/ukify.py \ + --replace \ + "'readelf'" \ + "'${targetPackages.stdenv.cc.bintools.targetPrefix}readelf'" \ + --replace \ + "/usr/lib/systemd/boot/efi" \ + "$out/lib/systemd/boot/efi" + '' + ( + let + # The following patches references to dynamic libraries to ensure that all + # the features that are implemented via dlopen(3) are available (or + # explicitly deactivated) by pointing dlopen to the absolute store path + # instead of relying on the linkers runtime lookup code. + # + # All of the shared library references have to be handled. When new ones + # are introduced by upstream (or one of our patches) they must be + # explicitly declared, otherwise the build will fail. + # + # As of systemd version 247 we've seen a few errors like `libpcre2.… not + # found` when using e.g. --grep with journalctl. Those errors should + # become less unexpected now. + # + # There are generally two classes of dlopen(3) calls. Those that we want + # to support and those that should be deactivated / unsupported. This + # change enforces that we handle all dlopen calls explicitly. Meaning: + # There is not a single dlopen call in the source code tree that we did + # not explicitly handle. + # + # In order to do this we introduced a list of attributes that maps from + # shared object name to the package that contains them. The package can be + # null meaning the reference should be nuked and the shared object will + # never be loadable during runtime (because it points at an invalid store + # path location). + # + # To get a list of dynamically loaded libraries issue something like + # `grep -ri '"lib[a-zA-Z0-9-]*\.so[\.0-9a-zA-z]*"'' $src` + # and update the list below. + dlopenLibs = + let + opt = condition: pkg: if condition then pkg else null; + in + [ + # bpf compilation support. We use libbpf 1 now. + { name = "libbpf.so.1"; pkg = opt withLibBPF libbpf; } + { name = "libbpf.so.0"; pkg = null; } + + # We did never provide support for libxkbcommon + { name = "libxkbcommon.so.0"; pkg = null; } + + # qrencode + { name = "libqrencode.so.4"; pkg = opt withQrencode qrencode; } + { name = "libqrencode.so.3"; pkg = null; } + + # Password quality + # We currently do not package passwdqc, only libpwquality. + { name = "libpwquality.so.1"; pkg = opt withPasswordQuality libpwquality; } + { name = "libpasswdqc.so.1"; pkg = null; } + + # Only include cryptsetup if it is enabled. We might not be able to + # provide it during "bootstrap" in e.g. the minimal systemd build as + # cryptsetup has udev (aka systemd) in it's dependencies. + { name = "libcryptsetup.so.12"; pkg = opt withCryptsetup cryptsetup; } + + # We are using libidn2 so we only provide that and ignore the others. + # Systemd does this decision during configure time and uses ifdef's to + # enable specific branches. We can safely ignore (nuke) the libidn "v1" + # libraries. + { name = "libidn2.so.0"; pkg = opt withLibidn2 libidn2; } + { name = "libidn.so.12"; pkg = null; } + { name = "libidn.so.11"; pkg = null; } + + # journalctl --grep requires libpcre so let's provide it + { name = "libpcre2-8.so.0"; pkg = pcre2; } + + # Support for TPM2 in systemd-cryptsetup, systemd-repart and systemd-cryptenroll + { name = "libtss2-esys.so.0"; pkg = opt withTpm2Tss tpm2-tss; } + { name = "libtss2-rc.so.0"; pkg = opt withTpm2Tss tpm2-tss; } + { name = "libtss2-mu.so.0"; pkg = opt withTpm2Tss tpm2-tss; } + { name = "libtss2-tcti-"; pkg = opt withTpm2Tss tpm2-tss; } + { name = "libfido2.so.1"; pkg = opt withFido2 libfido2; } + + # inspect-elf support + { name = "libelf.so.1"; pkg = opt withCoredump elfutils; } + { name = "libdw.so.1"; pkg = opt withCoredump elfutils; } + + # Support for PKCS#11 in systemd-cryptsetup, systemd-cryptenroll and systemd-homed + { name = "libp11-kit.so.0"; pkg = opt (withHomed || withCryptsetup) p11-kit; } + + { name = "libip4tc.so.2"; pkg = opt withIptables iptables; } + ]; + + patchDlOpen = dl: + let + library = "${lib.makeLibraryPath [ dl.pkg ]}/${dl.name}"; + in + if dl.pkg == null then '' + # remove the dependency on the library by replacing it with an invalid path + for file in $(grep -lr '"${dl.name}"' src); do + echo "patching dlopen(\"${dl.name}\", …) in $file to an invalid store path ("${builtins.storeDir}/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-not-implemented/${dl.name}")…" + substituteInPlace "$file" --replace '"${dl.name}"' '"${builtins.storeDir}/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-not-implemented/${dl.name}"' + done + '' else '' + # ensure that the library we provide actually exists + if ! [ -e ${library} ]; then + # exceptional case, details: + # https://github.com/systemd/systemd-stable/blob/v249-stable/src/shared/tpm2-util.c#L157 + if ! [[ "${library}" =~ .*libtss2-tcti-$ ]]; then + echo 'The shared library `${library}` does not exist but was given as substitute for `${dl.name}`' + exit 1 + fi + fi + # make the path to the dependency explicit + for file in $(grep -lr '"${dl.name}"' src); do + echo "patching dlopen(\"${dl.name}\", …) in $file to ${library}…" + substituteInPlace "$file" --replace '"${dl.name}"' '"${library}"' + done + + ''; + in + # patch all the dlopen calls to contain absolute paths to the libraries + lib.concatMapStringsSep "\n" patchDlOpen dlopenLibs + ) + # finally ensure that there are no left-over dlopen calls (or rather strings + # pointing to shared libraries) that we didn't handle + + '' + if grep -qr '"lib[a-zA-Z0-9-]*\.so[\.0-9a-zA-z]*"' src; then + echo "Found unhandled dynamic library calls: " + grep -r '"lib[a-zA-Z0-9-]*\.so[\.0-9a-zA-z]*"' src + exit 1 + fi + '' + # Finally, patch shebangs in scripts used at build time. This must not patch + # scripts that will end up in the output, to avoid build platform references + # when cross-compiling. + + '' + shopt -s extglob + patchShebangs tools test src/!(rpm|kernel-install|ukify) src/kernel-install/test-kernel-install.sh + ''; + + outputs = [ "out" "dev" ] ++ (lib.optional (!buildLibsOnly) "man"); + + hardeningDisable = [ + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111523 + "trivialautovarinit" + ]; + + nativeBuildInputs = + [ + pkg-config + makeBinaryWrapper + gperf + ninja + meson + glibcLocales + getent + m4 + + intltool + gettext + + libxslt + docbook_xsl + docbook_xml_dtd_42 + docbook_xml_dtd_45 + bash + (buildPackages.python3Packages.python.withPackages (ps: with ps; [ lxml jinja2 ] ++ lib.optional withEfi ps.pyelftools)) + ] + ++ lib.optionals withLibBPF [ + bpftools + buildPackages.llvmPackages.clang + buildPackages.llvmPackages.libllvm + ] + ; + + buildInputs = + [ + libxcrypt + libcap + libuuid + linuxHeaders + bashInteractive # for patch shebangs + ] + + ++ lib.optionals wantGcrypt [ libgcrypt libgpg-error ] + ++ lib.optional withTests glib + ++ lib.optional withAcl acl + ++ lib.optional withApparmor libapparmor + ++ lib.optional withAudit audit + ++ lib.optional wantCurl (lib.getDev curl) + ++ lib.optionals withCompression [ zlib bzip2 lz4 xz zstd ] + ++ lib.optional withCoredump elfutils + ++ lib.optional withCryptsetup (lib.getDev cryptsetup.dev) + ++ lib.optional withKexectools kexec-tools + ++ lib.optional withKmod kmod + ++ lib.optional withLibidn2 libidn2 + ++ lib.optional withLibseccomp libseccomp + ++ lib.optional withIptables iptables + ++ lib.optional withPam pam + ++ lib.optional withPCRE2 pcre2 + ++ lib.optional withSelinux libselinux + ++ lib.optionals withRemote [ libmicrohttpd gnutls ] + ++ lib.optionals (withHomed || withCryptsetup) [ p11-kit ] + ++ lib.optionals (withHomed || withCryptsetup) [ libfido2 ] + ++ lib.optionals withLibBPF [ libbpf ] + ++ lib.optional withTpm2Tss tpm2-tss + ++ lib.optional withUkify (python3Packages.python.withPackages (ps: with ps; [ pefile ])) + ++ lib.optionals withPasswordQuality [ libpwquality ] + ++ lib.optionals withQrencode [ qrencode ] + ; + + mesonBuildType = "release"; + + mesonFlags = [ + # Options + + # We bump this attribute on every (major) version change to ensure that we + # have known-good value for a timestamp that is in the (not so distant) + # past. This serves as a lower bound for valid system timestamps during + # startup. Systemd will reset the system timestamp if this date is +- 15 + # years from the system time. + # See the systemd v250 release notes for further details: + # https://github.com/systemd/systemd/blob/60e930fc3e6eb8a36fbc184773119eb8d2f30364/NEWS#L258-L266 + (lib.mesonOption "time-epoch" releaseTimestamp) + + (lib.mesonOption "version-tag" version) + (lib.mesonOption "mode" "release") + (lib.mesonOption "tty-gid" "3") # tty in NixOS has gid 3 + (lib.mesonOption "debug-shell" "${bashInteractive}/bin/bash") + (lib.mesonOption "pamconfdir" "${placeholder "out"}/etc/pam.d") + # Use cgroupsv2. This is already the upstream default, but better be explicit. + (lib.mesonOption "default-hierarchy" "unified") + (lib.mesonOption "kmod-path" "${kmod}/bin/kmod") + + # D-Bus + (lib.mesonOption "dbuspolicydir" "${placeholder "out"}/share/dbus-1/system.d") + (lib.mesonOption "dbussessionservicedir" "${placeholder "out"}/share/dbus-1/services") + (lib.mesonOption "dbussystemservicedir" "${placeholder "out"}/share/dbus-1/system-services") + + # pkgconfig + (lib.mesonOption "pkgconfiglibdir" "${placeholder "dev"}/lib/pkgconfig") + (lib.mesonOption "pkgconfigdatadir" "${placeholder "dev"}/share/pkgconfig") + + # Keyboard + (lib.mesonOption "loadkeys-path" "${kbd}/bin/loadkeys") + (lib.mesonOption "setfont-path" "${kbd}/bin/setfont") + + # SBAT + (lib.mesonOption "sbat-distro" "nixos") + (lib.mesonOption "sbat-distro-summary" "NixOS") + (lib.mesonOption "sbat-distro-url" "https://nixos.org/") + (lib.mesonOption "sbat-distro-pkgname" pname) + (lib.mesonOption "sbat-distro-version" version) + + # Users + (lib.mesonOption "system-uid-max" "999") + (lib.mesonOption "system-gid-max" "999") + + # SysVinit + (lib.mesonOption "sysvinit-path" "") + (lib.mesonOption "sysvrcnd-path" "") + + # Login + (lib.mesonOption "sulogin-path" "${util-linux.login}/bin/sulogin") + (lib.mesonOption "nologin-path" "${util-linux.login}/bin/nologin") + + # Mount + (lib.mesonOption "mount-path" "${lib.getOutput "mount" util-linux}/bin/mount") + (lib.mesonOption "umount-path" "${lib.getOutput "mount" util-linux}/bin/umount") + + + # Features + + # Tests + (lib.mesonBool "tests" withTests) + (lib.mesonEnable "glib" withTests) + (lib.mesonEnable "dbus" withTests) + + # Compression + (lib.mesonEnable "bzip2" withCompression) + (lib.mesonEnable "lz4" withCompression) + (lib.mesonEnable "xz" withCompression) + (lib.mesonEnable "zstd" withCompression) + (lib.mesonEnable "zlib" withCompression) + + # NSS + (lib.mesonEnable "nss-mymachines" withNss) + (lib.mesonEnable "nss-resolve" withNss) + (lib.mesonBool "nss-myhostname" withNss) + (lib.mesonBool "nss-systemd" withNss) + + # Cryptsetup + (lib.mesonEnable "libcryptsetup" withCryptsetup) + (lib.mesonEnable "libcryptsetup-plugins" withCryptsetup) + (lib.mesonEnable "p11kit" (withHomed || withCryptsetup)) + + # FIDO2 + (lib.mesonEnable "libfido2" withFido2) + (lib.mesonEnable "openssl" withFido2) + + # Password Quality + (lib.mesonEnable "pwquality" withPasswordQuality) + (lib.mesonEnable "passwdqc" false) + + # Remote + (lib.mesonEnable "remote" withRemote) + (lib.mesonEnable "microhttpd" withRemote) + + (lib.mesonEnable "pam" withPam) + (lib.mesonEnable "acl" withAcl) + (lib.mesonEnable "audit" withAudit) + (lib.mesonEnable "apparmor" withApparmor) + (lib.mesonEnable "gcrypt" wantGcrypt) + (lib.mesonEnable "importd" withImportd) + (lib.mesonEnable "homed" withHomed) + (lib.mesonEnable "polkit" withPolkit) + (lib.mesonEnable "elfutils" withCoredump) + (lib.mesonEnable "libcurl" wantCurl) + (lib.mesonEnable "libidn" false) + (lib.mesonEnable "libidn2" withLibidn2) + (lib.mesonEnable "libiptc" withIptables) + (lib.mesonEnable "repart" withRepart) + (lib.mesonEnable "sysupdate" withSysupdate) + (lib.mesonEnable "selinux" withSelinux) + (lib.mesonEnable "tpm2" withTpm2Tss) + (lib.mesonEnable "pcre2" withPCRE2) + (lib.mesonEnable "bpf-framework" withLibBPF) + (lib.mesonEnable "bootloader" withBootloader) + (lib.mesonEnable "ukify" withUkify) + (lib.mesonEnable "kmod" withKmod) + (lib.mesonEnable "qrencode" withQrencode) + (lib.mesonEnable "vmspawn" withVmspawn) + (lib.mesonEnable "xenctrl" false) + (lib.mesonEnable "gnutls" false) + (lib.mesonEnable "xkbcommon" false) + (lib.mesonEnable "man" true) + + (lib.mesonBool "analyze" withAnalyze) + (lib.mesonBool "logind" withLogind) + (lib.mesonBool "localed" withLocaled) + (lib.mesonBool "hostnamed" withHostnamed) + (lib.mesonBool "machined" withMachined) + (lib.mesonBool "networkd" withNetworkd) + (lib.mesonBool "oomd" withOomd) + (lib.mesonBool "portabled" withPortabled) + (lib.mesonBool "hwdb" withHwdb) + (lib.mesonBool "timedated" withTimedated) + (lib.mesonBool "timesyncd" withTimesyncd) + (lib.mesonBool "userdb" withUserDb) + (lib.mesonBool "coredump" withCoredump) + (lib.mesonBool "firstboot" withFirstboot) + (lib.mesonBool "resolve" withResolved) + (lib.mesonBool "sysusers" withSysusers) + (lib.mesonBool "efi" withEfi) + (lib.mesonBool "utmp" withUtmp) + (lib.mesonBool "log-trace" withLogTrace) + (lib.mesonBool "kernel-install" withKernelInstall) + (lib.mesonBool "quotacheck" false) + (lib.mesonBool "ldconfig" false) + (lib.mesonBool "install-sysconfdir" false) + (lib.mesonBool "create-log-dirs" false) + (lib.mesonBool "smack" true) + (lib.mesonBool "b_pie" true) + + ] ++ lib.optionals (withShellCompletions == false) [ + (lib.mesonOption "bashcompletiondir" "no") + (lib.mesonOption "zshcompletiondir" "no") + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + (lib.mesonBool "gshadow" false) + (lib.mesonBool "idn" false) + ]; + preConfigure = + let + # A list of all the runtime binaries referenced by the source code (plus + # scripts and unit files) of systemd executables, tests and libraries. + # As soon as a dependency is lo longer required we should remove it from + # the list. + # The `where` attribute for each of the replacement patterns must be + # exhaustive. If another (unhandled) case is found in the source code the + # build fails with an error message. + binaryReplacements = [ + { + search = "/usr/bin/getent"; + replacement = "${getent}/bin/getent"; + where = [ "src/nspawn/nspawn-setuid.c" ]; + } + { + search = "/sbin/mkswap"; + replacement = "${lib.getBin util-linux}/sbin/mkswap"; + where = [ + "man/systemd-makefs@.service.xml" + ]; + } + { + search = "/sbin/swapon"; + replacement = "${lib.getOutput "swap" util-linux}/sbin/swapon"; + where = [ + "src/core/swap.c" + "src/basic/unit-def.h" + ]; + } + { + search = "/sbin/swapoff"; + replacement = "${lib.getOutput "swap" util-linux}/sbin/swapoff"; + where = [ "src/core/swap.c" ]; + } + { + search = "/bin/echo"; + replacement = "${coreutils}/bin/echo"; + where = [ + "man/systemd-analyze.xml" + "man/systemd.service.xml" + "man/systemd-run.xml" + "src/analyze/test-verify.c" + "src/test/test-env-file.c" + "src/test/test-fileio.c" + "src/test/test-load-fragment.c" + ]; + } + { + search = "/bin/cat"; + replacement = "${coreutils}/bin/cat"; + where = [ + "test/test-execute/exec-noexecpaths-simple.service" + "src/journal/cat.c" + ]; + } + { + search = "/usr/lib/systemd/systemd-fsck"; + replacement = "$out/lib/systemd/systemd-fsck"; + where = [ "man/systemd-fsck@.service.xml" ]; + } + ] ++ lib.optionals withImportd [ + { + search = "\"gpg\""; + replacement = "\\\"${gnupg}/bin/gpg\\\""; + where = [ "src/import/pull-common.c" ]; + } + { + search = "\"tar\""; + replacement = "\\\"${gnutar}/bin/tar\\\""; + where = [ + "src/import/export-tar.c" + "src/import/import-common.c" + "src/import/import-tar.c" + ]; + ignore = [ + # occurrences here refer to the tar sub command + "src/sysupdate/sysupdate-resource.c" + "src/sysupdate/sysupdate-transfer.c" + "src/import/pull.c" + "src/import/export.c" + "src/import/import.c" + "src/import/importd.c" + # runs `tar` but also also creates a temporary directory with the string + "src/import/pull-tar.c" + ]; + } + ] ++ lib.optionals withKmod [ + { + search = "/sbin/modprobe"; + replacement = "${lib.getBin kmod}/sbin/modprobe"; + where = [ "units/modprobe@.service" ]; + } + ]; + + # { replacement, search, where, ignore } -> List[str] + mkSubstitute = { replacement, search, where, ignore ? [ ] }: + map (path: "substituteInPlace ${path} --replace '${search}' \"${replacement}\"") where; + mkEnsureSubstituted = { replacement, search, where, ignore ? [ ] }: + let + ignore' = lib.concatStringsSep "|" (ignore ++ [ "^test" "NEWS" ]); + in + '' + set +e + search=$(grep '${search}' -r | grep -v "${replacement}" | grep -Ev "${ignore'}") + set -e + if [[ -n "$search" ]]; then + echo "Not all references to '${search}' have been replaced. Found the following matches:" + echo "$search" + exit 1 + fi + ''; + in + '' + mesonFlagsArray+=(-Dntp-servers="0.nixos.pool.ntp.org 1.nixos.pool.ntp.org 2.nixos.pool.ntp.org 3.nixos.pool.ntp.org") + export LC_ALL="en_US.UTF-8"; + + ${lib.concatStringsSep "\n" (lib.flatten (map mkSubstitute binaryReplacements))} + ${lib.concatMapStringsSep "\n" mkEnsureSubstituted binaryReplacements} + + substituteInPlace src/libsystemd/sd-journal/catalog.c \ + --replace /usr/lib/systemd/catalog/ $out/lib/systemd/catalog/ + + substituteInPlace src/import/pull-tar.c \ + --replace 'wait_for_terminate_and_check("tar"' 'wait_for_terminate_and_check("${gnutar}/bin/tar"' + ''; + + # These defines are overridden by CFLAGS and would trigger annoying + # warning messages + postConfigure = '' + substituteInPlace config.h \ + --replace "POLKIT_AGENT_BINARY_PATH" "_POLKIT_AGENT_BINARY_PATH" \ + --replace "SYSTEMD_BINARY_PATH" "_SYSTEMD_BINARY_PATH" \ + --replace "SYSTEMD_CGROUP_AGENTS_PATH" "_SYSTEMD_CGROUP_AGENT_PATH" + ''; + + env.NIX_CFLAGS_COMPILE = toString ([ + # Can't say ${polkit.bin}/bin/pkttyagent here because that would + # lead to a cyclic dependency. + "-UPOLKIT_AGENT_BINARY_PATH" + "-DPOLKIT_AGENT_BINARY_PATH=\"/run/current-system/sw/bin/pkttyagent\"" + + # Set the release_agent on /sys/fs/cgroup/systemd to the + # currently running systemd (/run/current-system/systemd) so + # that we don't use an obsolete/garbage-collected release agent. + "-USYSTEMD_CGROUP_AGENTS_PATH" + "-DSYSTEMD_CGROUP_AGENTS_PATH=\"/run/current-system/systemd/lib/systemd/systemd-cgroups-agent\"" + + "-USYSTEMD_BINARY_PATH" + "-DSYSTEMD_BINARY_PATH=\"/run/current-system/systemd/lib/systemd/systemd\"" + + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + "-D__UAPI_DEF_ETHHDR=0" + ]); + + doCheck = false; # fails a bunch of tests + + # trigger the test -n "$DESTDIR" || mutate in upstreams build system + preInstall = '' + export DESTDIR=/ + ''; + + mesonInstallTags = lib.optionals buildLibsOnly [ "devel" "libudev" "libsystemd" ]; + + postInstall = lib.optionalString (!buildLibsOnly) '' + mkdir -p $out/example/systemd + mv $out/lib/{binfmt.d,sysctl.d,tmpfiles.d} $out/example + mv $out/lib/systemd/{system,user} $out/example/systemd + + rm -rf $out/etc/systemd/system + + # Fix reference to /bin/false in the D-Bus services. + for i in $out/share/dbus-1/system-services/*.service; do + substituteInPlace $i --replace /bin/false ${coreutils}/bin/false + done + + rm -rf $out/etc/rpm + '' + lib.optionalString (!withKernelInstall) '' + # "kernel-install" shouldn't be used on NixOS. + find $out -name "*kernel-install*" -exec rm {} \; + '' + lib.optionalString (!withDocumentation) '' + rm -rf $out/share/doc + '' + lib.optionalString (withKmod && !buildLibsOnly) '' + mv $out/lib/modules-load.d $out/example + '' + lib.optionalString withSysusers '' + mv $out/lib/sysusers.d $out/example + ''; + + # Avoid *.EFI binary stripping. + # At least on aarch64-linux strip removes too much from PE32+ files: + # https://github.com/NixOS/nixpkgs/issues/169693 + # The hack is to move EFI file out of lib/ before doStrip run and return it + # after doStrip run. + preFixup = lib.optionalString withBootloader '' + mv $out/lib/systemd/boot/efi $out/dont-strip-me + ''; + + # Wrap in the correct path for LUKS2 tokens. + postFixup = lib.optionalString withCryptsetup '' + for f in bin/systemd-cryptsetup bin/systemd-cryptenroll; do + # This needs to be in LD_LIBRARY_PATH because rpath on a binary is not propagated to libraries using dlopen, in this case `libcryptsetup.so` + wrapProgram $out/$f --prefix LD_LIBRARY_PATH : ${placeholder "out"}/lib/cryptsetup + done + '' + lib.optionalString withBootloader '' + mv $out/dont-strip-me $out/lib/systemd/boot/efi + '' + lib.optionalString withUkify '' + # To cross compile a derivation that builds a UKI with ukify, we need to wrap + # ukify with the correct binutils. When wrapping, no splicing happens so we + # have to explicitly pull binutils from targetPackages. + wrapProgram $out/bin/ukify --prefix PATH : ${lib.makeBinPath [ targetPackages.stdenv.cc.bintools ] }:${placeholder "out"}/lib/systemd + ''; + + disallowedReferences = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) + # 'or p' is for manually specified buildPackages as they dont have __spliced + (builtins.map (p: p.__spliced.buildHost or p) finalAttrs.nativeBuildInputs); + + passthru = { + # The `interfaceVersion` attribute below points out the incompatibilities + # between systemd versions. When the new systemd build is + # backwards-compatible with the previous one, then they can be switched at + # runtime (the reboot being optional in this case); otherwise, a reboot is + # needed - and therefore `interfaceVersion` should be incremented. + interfaceVersion = 2; + + inherit withBootloader withCryptsetup withEfi withHostnamed withImportd withKmod + withLocaled withMachined withPortabled withTimedated withUtmp util-linux kmod kbd; + + tests = { + inherit (nixosTests) + switchTest + systemd-journal + systemd-journal-gateway + systemd-journal-upload; + cross = + let + systemString = + if stdenv.buildPlatform.isAarch64 + then "gnu64" + else "aarch64-multiplatform"; + in + pkgsCross.${systemString}.systemd; + }; + }; + + meta = { + homepage = "https://www.freedesktop.org/wiki/Software/systemd/"; + description = "A system and service manager for Linux"; + longDescription = '' + systemd is a suite of basic building blocks for a Linux system. It + provides a system and service manager that runs as PID 1 and starts the + rest of the system. systemd provides aggressive parallelization + capabilities, uses socket and D-Bus activation for starting services, + offers on-demand starting of daemons, keeps track of processes using Linux + control groups, maintains mount and automount points, and implements an + elaborate transactional dependency-based service control logic. systemd + supports SysV and LSB init scripts and works as a replacement for + sysvinit. Other parts include a logging daemon, utilities to control basic + system configuration like the hostname, date, locale, maintain a list of + logged-in users and running containers and virtual machines, system + accounts, runtime directories and settings, and daemons to manage simple + network configuration, network time synchronization, log forwarding, and + name resolution. + ''; + license = with lib.licenses; [ + # Taken from https://raw.githubusercontent.com/systemd/systemd-stable/${finalAttrs.src.rev}/LICENSES/README.md + bsd2 + bsd3 + cc0 + lgpl21Plus + lgpl2Plus + mit + mit0 + ofl + publicDomain + ]; + maintainers = with lib.maintainers; [ flokli kloenk ]; + platforms = lib.platforms.linux; + priority = 10; + badPlatforms = [ lib.systems.inspect.platformPatterns.isStatic ]; + # https://github.com/systemd/systemd/issues/20600#issuecomment-912338965 + broken = stdenv.hostPlatform.isStatic; + }; +}) diff --git a/pkgs/by-name/sy/systemd/packages.nix b/pkgs/by-name/sy/systemd/packages.nix new file mode 100644 index 0000000..a8fc6ca --- /dev/null +++ b/pkgs/by-name/sy/systemd/packages.nix @@ -0,0 +1,73 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + systemd = callPackage ./. { + # break some cyclic dependencies + util-linux = util-linuxMinimal; + # provide a super minimal gnupg used for systemd-machined + gnupg = gnupg.override { + enableMinimal = true; + guiSupport = false; + }; + }; + systemdMinimal = systemd.override { + pname = "systemd-minimal"; + withAcl = false; + withAnalyze = false; + withApparmor = false; + withAudit = false; + withCompression = false; + withCoredump = false; + withCryptsetup = false; + withRepart = false; + withDocumentation = false; + withEfi = false; + withFido2 = false; + withHostnamed = false; + withHomed = false; + withHwdb = false; + withImportd = false; + withIptables = false; + withLibBPF = false; + withLibidn2 = false; + withLocaled = false; + withLogind = false; + withMachined = false; + withNetworkd = false; + withNss = false; + withOomd = false; + withPCRE2 = false; + withPam = false; + withPolkit = false; + withPortabled = false; + withRemote = false; + withResolved = false; + withShellCompletions = false; + withSysupdate = false; + withSysusers = false; + withTimedated = false; + withTimesyncd = false; + withTpm2Tss = false; + withUserDb = false; + withUkify = false; + withBootloader = false; + withPasswordQuality = false; + withVmspawn = false; + withQrencode = false; + }; + systemdLibs = systemdMinimal.override { + pname = "systemd-minimal-libs"; + buildLibsOnly = true; + }; + # We do not want to include ukify in the normal systemd attribute as it + # relies on Python at runtime. + systemdUkify = systemd.override { + withUkify = true; + }; + + udev = + if (with stdenv.hostPlatform; isLinux && isStatic) then libudev-zero + else systemdLibs; +} diff --git a/pkgs/by-name/tc/tcb/default.nix b/pkgs/by-name/tc/tcb/default.nix new file mode 100644 index 0000000..6a1f5b5 --- /dev/null +++ b/pkgs/by-name/tc/tcb/default.nix @@ -0,0 +1,54 @@ +{ lib, stdenv, fetchFromGitHub, pkg-config +, linux-pam, libxcrypt +}: + +stdenv.mkDerivation rec { + pname = "tcb"; + version = "1.2"; + + src = fetchFromGitHub { + owner = "openwall"; + repo = pname; + rev = "070cf4aa784de13c52788ac22ff611d7cbca0854"; + sha256 = "sha256-Sp5u7iTEZZnAqKQXoPO8eWpSkZeBzQqZI82wRQmgU9A="; + }; + + outputs = [ "out" "bin" "dev" "man" ]; + + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ linux-pam libxcrypt ]; + + patches = [ ./fix-makefiles.patch ]; + + postPatch = '' + substituteInPlace Make.defs \ + --replace "PREFIX = /usr" "PREFIX = $out" \ + --replace "SBINDIR = /sbin" "SBINDIR = $bin/bin" \ + --replace "INCLUDEDIR = \$(PREFIX)/include" "INCLUDEDIR = $dev/include" + + # Override default 'CC=gcc' + makeFlagsArray+=("CC=$CC") + ''; + + meta = with lib; { + description = "Alternative password shadowing scheme"; + longDescription = '' + The tcb package contains core components of our tcb suite implementing the alternative + password shadowing scheme on Openwall GNU Linux (Owl). It is being made available + separately from Owl primarily for use by other distributions. + + The package consists of three components: pam_tcb, libnss_tcb, and libtcb. + + pam_tcb is a PAM module which supersedes pam_unix. It also implements the tcb password + shadowing scheme. The tcb scheme allows many core system utilities (passwd(1) being + the primary example) to operate with little privilege. libnss_tcb is the accompanying + NSS module. libtcb contains code shared by the PAM and NSS modules and is also used + by user management tools on Owl due to our shadow suite patches. + ''; + homepage = "https://www.openwall.com/tcb/"; + license = licenses.bsd3; + platforms = systems.inspect.patterns.isGnu; + maintainers = with maintainers; [ izorkin ]; + }; +} diff --git a/pkgs/by-name/tc/tcb/fix-makefiles.patch b/pkgs/by-name/tc/tcb/fix-makefiles.patch new file mode 100644 index 0000000..9ea8260 --- /dev/null +++ b/pkgs/by-name/tc/tcb/fix-makefiles.patch @@ -0,0 +1,52 @@ +diff --git a/Make.defs b/Make.defs +index a961f7d..9e8d59b 100644 +--- a/Make.defs ++++ b/Make.defs +@@ -19,7 +19,7 @@ LDFLAGS += $(DBGFLAG) -L../libs + + PREFIX = /usr + SBINDIR = /sbin +-SLIBDIR = /lib ++SLIBDIR = $(PREFIX)/lib + INCLUDEDIR = $(PREFIX)/include + LIBDIR = $(PREFIX)/lib + LIBEXECDIR = $(PREFIX)/libexec +diff --git a/libs/Makefile b/libs/Makefile +index 0083b13..27238f6 100644 +--- a/libs/Makefile ++++ b/libs/Makefile +@@ -7,7 +7,7 @@ LIBTCB_A = libtcb.a + LIB_MAP = libtcb.map + NSS_MAP = libnss_tcb.map + +-all: $(LIBTCB_LONG) $(LIBNSS) $(LIBTCB_A) ++all: $(LIBTCB_LONG) $(LIBNSS) + + $(LIBTCB_A): libtcb_a.o + ar -cr $@ $< +@@ -36,9 +36,8 @@ install: + $(MKDIR) -p -m 755 $(DESTDIR)$(LIBDIR) + $(INSTALL) -m $(SHLIBMODE) $(LIBTCB_LONG) $(DESTDIR)$(SLIBDIR)/ + ln -sf $(LIBTCB_LONG) $(DESTDIR)$(SLIBDIR)/$(LIBTCB) +- ln -sf ../..$(SLIBDIR)/$(LIBTCB) $(DESTDIR)$(LIBDIR)/libtcb.so ++ ln -sf $(LIBTCB) $(DESTDIR)$(LIBDIR)/libtcb.so + $(INSTALL) -m $(SHLIBMODE) $(LIBNSS) $(DESTDIR)$(SLIBDIR)/ +- $(INSTALL) -m 644 $(LIBTCB_A) $(DESTDIR)$(LIBDIR)/ + + clean: + rm -f *.o *~ $(LIBTCB)* libtcb.so $(LIBNSS) *.a +diff --git a/progs/Makefile b/progs/Makefile +index c3a6879..e24f74b 100644 +--- a/progs/Makefile ++++ b/progs/Makefile +@@ -23,8 +23,8 @@ install-non-root: install-common + $(INSTALL) -m 700 $(CHKPWD) $(DESTDIR)$(LIBEXECDIR)/chkpwd/ + + install: install-common +- $(INSTALL) -d -o root -g chkpwd -m 710 $(DESTDIR)$(LIBEXECDIR)/chkpwd +- $(INSTALL) -m 2711 -o root -g shadow $(CHKPWD) \ ++ $(INSTALL) -d $(DESTDIR)$(LIBEXECDIR)/chkpwd ++ $(INSTALL) $(CHKPWD) \ + $(DESTDIR)$(LIBEXECDIR)/chkpwd/ + + install-common: diff --git a/pkgs/by-name/tc/tcl/8.5.nix b/pkgs/by-name/tc/tcl/8.5.nix new file mode 100644 index 0000000..7676fbf --- /dev/null +++ b/pkgs/by-name/tc/tcl/8.5.nix @@ -0,0 +1,13 @@ +{ callPackage, fetchurl, ... } @ args: + +callPackage ./generic.nix (args // rec { + release = "8.5"; + version = "${release}.19"; + + # Note: when updating, the hash in pkgs/development/libraries/tk/8.5.nix must also be updated! + + src = fetchurl { + url = "mirror://sourceforge/tcl/tcl${version}-src.tar.gz"; + sha256 = "066vlr9k5f44w9gl9382hlxnryq00d5p6c7w5vq1fgc7v9b49w6k"; + }; +}) diff --git a/pkgs/by-name/tc/tcl/8.6.nix b/pkgs/by-name/tc/tcl/8.6.nix new file mode 100644 index 0000000..0edd47e --- /dev/null +++ b/pkgs/by-name/tc/tcl/8.6.nix @@ -0,0 +1,13 @@ +{ callPackage, fetchurl, ... } @ args: + +callPackage ./generic.nix (args // rec { + release = "8.6"; + version = "${release}.13"; + + # Note: when updating, the hash in pkgs/development/libraries/tk/8.6.nix must also be updated! + + src = fetchurl { + url = "mirror://sourceforge/tcl/tcl${version}-src.tar.gz"; + sha256 = "sha256-Q6H650EvYf8R3iz9BdKM/Dpzdi81SkF8YjcKVOLK8GY="; + }; +}) diff --git a/pkgs/by-name/tc/tcl/generic.nix b/pkgs/by-name/tc/tcl/generic.nix new file mode 100644 index 0000000..5ee9671 --- /dev/null +++ b/pkgs/by-name/tc/tcl/generic.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, callPackage, makeSetupHook, runCommand +, tzdata + +# Version specific stuff +, release, version, src +, ... +}: + +let + baseInterp = + stdenv.mkDerivation rec { + pname = "tcl"; + inherit version src; + + outputs = [ "out" "man" ]; + + setOutputFlags = false; + + postPatch = '' + substituteInPlace library/clock.tcl \ + --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo" \ + --replace "/usr/share/lib/zoneinfo" "" \ + --replace "/usr/lib/zoneinfo" "" \ + --replace "/usr/local/etc/zoneinfo" "" + ''; + + preConfigure = '' + cd unix + ''; + + configureFlags = [ + "--enable-threads" + # Note: using $out instead of $man to prevent a runtime dependency on $man. + "--mandir=${placeholder "out"}/share/man" + "--enable-man-symlinks" + # Don't install tzdata because NixOS already has a more up-to-date copy. + "--with-tzdata=no" + "tcl_cv_strtod_unbroken=ok" + ] ++ lib.optional stdenv.is64bit "--enable-64bit"; + + enableParallelBuilding = true; + + postInstall = let + dllExtension = stdenv.hostPlatform.extensions.sharedLibrary; + in '' + make install-private-headers + ln -s $out/bin/tclsh${release} $out/bin/tclsh + ln -s $out/lib/libtcl${release}${dllExtension} $out/lib/libtcl${dllExtension} + ''; + + meta = with lib; { + description = "The Tcl scripting language"; + homepage = "https://www.tcl.tk/"; + license = licenses.tcltk; + platforms = platforms.all; + maintainers = with maintainers; [ agbrooks ]; + }; + + passthru = rec { + inherit release version; + libPrefix = "tcl${release}"; + libdir = "lib/${libPrefix}"; + tclPackageHook = callPackage ({ buildPackages }: makeSetupHook { + name = "tcl-package-hook"; + propagatedBuildInputs = [ buildPackages.makeBinaryWrapper ]; + meta = { + inherit (meta) maintainers platforms; + }; + } ./tcl-package-hook.sh) {}; + # verify that Tcl's clock library can access tzdata + tests.tzdata = runCommand "${pname}-test-tzdata" {} '' + ${baseInterp}/bin/tclsh <(echo "set t [clock scan {2004-10-30 05:00:00} \ + -format {%Y-%m-%d %H:%M:%S} \ + -timezone :America/New_York]") > $out + ''; + }; + }; + + mkTclDerivation = callPackage ./mk-tcl-derivation.nix { tcl = baseInterp; }; + +in baseInterp.overrideAttrs (self: { + passthru = self.passthru // { + inherit mkTclDerivation; + }; +}) diff --git a/pkgs/by-name/tc/tcl/mk-tcl-derivation.nix b/pkgs/by-name/tc/tcl/mk-tcl-derivation.nix new file mode 100644 index 0000000..57d60f0 --- /dev/null +++ b/pkgs/by-name/tc/tcl/mk-tcl-derivation.nix @@ -0,0 +1,71 @@ +# Generic builder for tcl packages/applications, generally based on mk-python-derivation.nix +{ tcl +, lib +, makeWrapper +, runCommand +, writeScript +}: + +{ buildInputs ? [] +, nativeBuildInputs ? [] +, propagatedBuildInputs ? [] +, checkInputs ? [] +, nativeCheckInputs ? [] + +# true if we should skip the configuration phase altogether +, dontConfigure ? false + +# Extra flags passed to configure step +, configureFlags ? [] + +# Whether or not we should add common Tcl-related configure flags +, addTclConfigureFlags ? true + +, meta ? {} +, passthru ? {} +, doCheck ? true +, ... } @ attrs: + +let + inherit (tcl) stdenv; + inherit (lib) getBin optionalAttrs; + + defaultTclPkgConfigureFlags = [ + "--with-tcl=${tcl}/lib" + "--with-tclinclude=${tcl}/include" + "--exec-prefix=${placeholder "out"}" + ]; + + self = (stdenv.mkDerivation ((builtins.removeAttrs attrs [ + "addTclConfigureFlags" "checkPhase" "checkInputs" "nativeCheckInputs" "doCheck" + ]) // { + + buildInputs = buildInputs ++ [ tcl.tclPackageHook ]; + nativeBuildInputs = nativeBuildInputs ++ [ makeWrapper tcl ]; + propagatedBuildInputs = propagatedBuildInputs ++ [ tcl ]; + + TCLSH = "${getBin tcl}/bin/tclsh"; + + # Run tests after install, at which point we've done all TCLLIBPATH setup + doCheck = false; + doInstallCheck = attrs.doCheck or (attrs.doInstallCheck or false); + installCheckInputs = checkInputs ++ (attrs.installCheckInputs or []); + nativeInstallCheckInputs = nativeCheckInputs ++ (attrs.nativeInstallCheckInputs or []); + + # Add typical values expected by TEA for configureFlags + configureFlags = + if (!dontConfigure && addTclConfigureFlags) + then (configureFlags ++ defaultTclPkgConfigureFlags) + else configureFlags; + + meta = { + platforms = tcl.meta.platforms; + } // meta; + + + } // optionalAttrs (attrs?checkPhase) { + installCheckPhase = attrs.checkPhase; + } + )); + +in lib.extendDerivation true passthru self diff --git a/pkgs/by-name/tc/tcl/packages.nix b/pkgs/by-name/tc/tcl/packages.nix new file mode 100644 index 0000000..58598c7 --- /dev/null +++ b/pkgs/by-name/tc/tcl/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + tcl = tcl-8_6; + tcl-8_5 = callPackage ./8.5.nix { }; + tcl-8_6 = callPackage ./8.6.nix { }; +} diff --git a/pkgs/by-name/tc/tcl/tcl-package-hook.sh b/pkgs/by-name/tc/tcl/tcl-package-hook.sh new file mode 100644 index 0000000..8548ac6 --- /dev/null +++ b/pkgs/by-name/tc/tcl/tcl-package-hook.sh @@ -0,0 +1,80 @@ +# This hook ensures that we do the following in post-fixup: +# * wrap any installed executables with a wrapper that configures TCLLIBPATH +# * write a setup hook that extends the TCLLIBPATH of any anti-dependencies + +tclWrapperArgs=( ${tclWrapperArgs-} ) + +# Add a directory to TCLLIBPATH, provided that it exists +_addToTclLibPath() { + local tclPkg="$1" + if [[ -z "$tclPkg" ]]; then + return + fi + + if [[ ! -d "$tclPkg" ]]; then + >&2 echo "can't add $tclPkg to TCLLIBPATH; that directory doesn't exist" + exit 1 + fi + + if [[ "$tclPkg" == *" "* ]]; then + tclPkg="{$tclPkg}" + fi + + if [[ -z "${TCLLIBPATH-}" ]]; then + export TCLLIBPATH="$tclPkg" + else + if [[ "$TCLLIBPATH" != *"$tclPkg "* && "$TCLLIBPATH" != *"$tclPkg" ]]; then + export TCLLIBPATH="${TCLLIBPATH} $tclPkg" + fi + fi +} + +# Locate any directory containing an installed pkgIndex file +findInstalledTclPkgs() { + local -r newLibDir="${!outputLib}/lib" + if [[ ! -d "$newLibDir" ]]; then + >&2 echo "Assuming no loadable tcl packages installed ($newLibDir does not exist)" + return + fi + echo "$(find "$newLibDir" -name pkgIndex.tcl -exec dirname {} \;)" +} + +# Wrap any freshly-installed binaries and set up their TCLLIBPATH +wrapTclBins() { + if [ "$dontWrapTclBinaries" ]; then return; fi + + if [[ -z "${TCLLIBPATH-}" ]]; then + echo "skipping automatic Tcl binary wrapping (nothing to do)" + return + fi + + local -r tclBinsDir="${!outputBin}/bin" + if [[ ! -d "$tclBinsDir" ]]; then + echo "No outputBin found, not using any TCLLIBPATH wrapper" + return + fi + + tclWrapperArgs+=(--prefix TCLLIBPATH ' ' "$TCLLIBPATH") + + find "$tclBinsDir" -type f -executable -print | + while read -r someBin; do + echo "Adding TCLLIBPATH wrapper for $someBin" + wrapProgram "$someBin" "${tclWrapperArgs[@]}" + done +} + +# Generate hook to adjust TCLLIBPATH in anti-dependencies +writeTclLibPathHook() { + local -r hookPath="${!outputLib}/nix-support/setup-hook" + mkdir -p "$(dirname "$hookPath")" + + typeset -f _addToTclLibPath >> "$hookPath" + local -r tclPkgs=$(findInstalledTclPkgs) + while IFS= read -r tclPkg; do + echo "_addToTclLibPath \"$tclPkg\"" >> "$hookPath" + _addToTclLibPath "$tclPkg" true + done <<< "$tclPkgs" +} + +postFixupHooks+=(writeTclLibPathHook) +postFixupHooks+=(wrapTclBins) diff --git a/pkgs/by-name/te/termcap/default.nix b/pkgs/by-name/te/termcap/default.nix new file mode 100644 index 0000000..6382ade --- /dev/null +++ b/pkgs/by-name/te/termcap/default.nix @@ -0,0 +1,67 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, autoreconfHook +, enableStatic ? stdenv.hostPlatform.isStatic +, enableShared ? !stdenv.hostPlatform.isStatic +}: + +stdenv.mkDerivation rec { + pname = "termcap"; + version = "1.3.1"; + + src = fetchurl { + url = "mirror://gnu/termcap/termcap-${version}.tar.gz"; + hash = "sha256-kaDiLlOHykRntbyxjt8cUbkwJi/UZtX9o5bdnSZxkQA="; + }; + + patches = [ + (fetchpatch { + name = "0001-tparam-replace-write-with-fprintf.patch"; + url = "https://github.com/msys2/MINGW-packages/raw/c6691ad1bd9d4c6823a18068ca0683c3e32ea005/mingw-w64-termcap/0001-tparam-replace-write-with-fprintf.patch"; + hash = "sha256-R9XaLfa8fzQBt+M+uA1AFTvKYCeOWLUD/7GViazXwto="; + }) + ]; + + outputs = [ "out" "dev" ]; + + enableParallelBuilding = true; + + strictDeps = true; + + nativeBuildInputs = [ autoreconfHook ]; + + makeFlags = [ + "AR=${stdenv.cc.targetPrefix}ar" + ]; + + env.NIX_CFLAGS_COMPILE = toString ([ + "-DSTDC_HEADERS" + ] ++ lib.optionals stdenv.cc.isClang [ + "-Wno-implicit-function-declaration" + ]); + + # Library only statically links by default + postInstall = lib.optionalString (!enableStatic) '' + rm $out/lib/libtermcap.a + '' + lib.optionalString enableShared (let + libName = "lib${pname}${stdenv.hostPlatform.extensions.sharedLibrary}"; + impLibName = "lib${pname}.dll.a"; + winImpLib = lib.optionalString stdenv.hostPlatform.isWindows + "-Wl,--out-implib,${impLibName}"; + in '' + ${stdenv.cc.targetPrefix}cc -shared -o ${libName} termcap.o tparam.o version.o ${winImpLib} + install -Dm644 ${libName} $out/lib + '' + lib.optionalString stdenv.hostPlatform.isWindows '' + install -Dm644 ${impLibName} $out/lib + ''); + + meta = { + description = "Terminal feature database"; + homepage = "https://www.gnu.org/software/termutils/"; + license = lib.licenses.gpl2Plus; + maintainers = with lib.maintainers; [ wegank ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/te/texinfo/4.13a.nix b/pkgs/by-name/te/texinfo/4.13a.nix new file mode 100644 index 0000000..b8da38a --- /dev/null +++ b/pkgs/by-name/te/texinfo/4.13a.nix @@ -0,0 +1,19 @@ +{ stdenv, fetchurl, texinfo, ncurses, xz }: + +stdenv.mkDerivation rec { + pname = "texinfo"; + version = "4.13a"; + + src = fetchurl { + url = "mirror://gnu/texinfo/${pname}-${version}.tar.lzma"; + sha256 = "1rf9ckpqwixj65bw469i634897xwlgkm5i9g2hv3avl6mv7b0a3d"; + }; + + buildInputs = [ ncurses ]; + nativeBuildInputs = [ xz ]; + + # Disabled because we don't have zdiff in the stdenv bootstrap. + #doCheck = true; + + meta = texinfo.meta // { branch = version; }; +} diff --git a/pkgs/by-name/te/texinfo/5.2.nix b/pkgs/by-name/te/texinfo/5.2.nix new file mode 100644 index 0000000..d395494 --- /dev/null +++ b/pkgs/by-name/te/texinfo/5.2.nix @@ -0,0 +1,4 @@ +import ./common.nix { + version = "5.2"; + sha256 = "1njfwh2z34r2c4r0iqa7v24wmjzvsfyz4vplzry8ln3479lfywal"; +} diff --git a/pkgs/by-name/te/texinfo/6.5.nix b/pkgs/by-name/te/texinfo/6.5.nix new file mode 100644 index 0000000..34596f3 --- /dev/null +++ b/pkgs/by-name/te/texinfo/6.5.nix @@ -0,0 +1,4 @@ +import ./common.nix { + version = "6.5"; + sha256 = "0qjzvbvnv9003xdrcpi3jp7y68j4hq2ciw9frh2hghh698zlnxvp"; +} diff --git a/pkgs/by-name/te/texinfo/6.7.nix b/pkgs/by-name/te/texinfo/6.7.nix new file mode 100644 index 0000000..7915d6e --- /dev/null +++ b/pkgs/by-name/te/texinfo/6.7.nix @@ -0,0 +1,4 @@ +import ./common.nix { + version = "6.7"; + sha256 = "1aicn1v3czqii08wc91jw089n1x3gfchkf808q2as59dak0h714q"; +} diff --git a/pkgs/by-name/te/texinfo/6.8.nix b/pkgs/by-name/te/texinfo/6.8.nix new file mode 100644 index 0000000..992f695 --- /dev/null +++ b/pkgs/by-name/te/texinfo/6.8.nix @@ -0,0 +1,8 @@ +import ./common.nix { + version = "6.8"; + sha256 = "1i7yb7mrp3inz25zbzv2pllr4y7d58v818f1as7iz8mw53nm7dwf"; + patches = [ + # glibc 2.34 compat + ./fix-glibc-2.34.patch + ]; +} diff --git a/pkgs/by-name/te/texinfo/7.0.nix b/pkgs/by-name/te/texinfo/7.0.nix new file mode 100644 index 0000000..01788f4 --- /dev/null +++ b/pkgs/by-name/te/texinfo/7.0.nix @@ -0,0 +1,4 @@ +import ./common.nix { + version = "7.0.3"; + sha256 = "sha256-dLQg0J1/Uo6E+XqjMPDdaamKYFPnpOAXZ+7RFQOIB78="; +} diff --git a/pkgs/by-name/te/texinfo/common.nix b/pkgs/by-name/te/texinfo/common.nix new file mode 100644 index 0000000..d8d6308 --- /dev/null +++ b/pkgs/by-name/te/texinfo/common.nix @@ -0,0 +1,113 @@ +{ version, sha256, patches ? [] }: + +{ lib, stdenv, buildPackages, fetchurl, perl, xz, libintl, bash +, gnulib, gawk + +# we are a dependency of gcc, this simplifies bootstraping +, interactive ? false, ncurses, procps +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +let + crossBuildTools = stdenv.hostPlatform != stdenv.buildPlatform; +in + +with lib; + +stdenv.mkDerivation { + pname = "texinfo${optionalString interactive "-interactive"}"; + inherit version; + + src = fetchurl { + url = "mirror://gnu/texinfo/texinfo-${version}.tar.xz"; + inherit sha256; + }; + + patches = patches ++ optional crossBuildTools ./cross-tools-flags.patch; + + postPatch = '' + patchShebangs tp/maintain + '' + # This patch is needed for IEEE-standard long doubles on + # powerpc64; it does not apply cleanly to texinfo 5.x or + # earlier. It is merged upstream in texinfo 6.8. + + lib.optionalString (version == "6.7") '' + patch -p1 -d gnulib < ${gnulib.passthru.longdouble-redirect-patch} + ''; + + # ncurses is required to build `makedoc' + # this feature is introduced by the ./cross-tools-flags.patch + NATIVE_TOOLS_CFLAGS = if crossBuildTools then "-I${getDev buildPackages.ncurses}/include" else null; + NATIVE_TOOLS_LDFLAGS = if crossBuildTools then "-L${getLib buildPackages.ncurses}/lib" else null; + + strictDeps = true; + enableParallelBuilding = true; + + # A native compiler is needed to build tools needed at build time + depsBuildBuild = [ buildPackages.stdenv.cc perl ]; + + buildInputs = [ xz.bin bash libintl ] + ++ optionals stdenv.isSunOS [ libiconv gawk ] + ++ optional interactive ncurses; + + configureFlags = [ "PERL=${buildPackages.perl}/bin/perl" ] + # Perl XS modules are difficult to cross-compile and texinfo has pure Perl + # fallbacks. + # Also prevent the buildPlatform's awk being used in the texindex script + ++ optionals crossBuildTools [ "--enable-perl-xs=no" "TI_AWK=${gawk}/bin/awk" ] + ++ lib.optional stdenv.isSunOS "AWK=${gawk}/bin/awk"; + + installFlags = [ "TEXMF=$(out)/texmf-dist" ]; + installTargets = [ "install" "install-tex" ]; + + nativeCheckInputs = [ procps ]; + + doCheck = interactive + && !stdenv.isDarwin + && !stdenv.isSunOS; # flaky + + checkFlags = lib.optionals (!stdenv.hostPlatform.isMusl && lib.versionOlder version "7") [ + # Test is known to fail on various locales on texinfo-6.8: + # https://lists.gnu.org/r/bug-texinfo/2021-07/msg00012.html + "XFAIL_TESTS=test_scripts/layout_formatting_fr_icons.sh" + ]; + + postFixup = optionalString crossBuildTools '' + for f in "$out"/bin/{pod2texi,texi2any}; do + substituteInPlace "$f" \ + --replace ${buildPackages.perl}/bin/perl ${perl}/bin/perl + done + ''; + + meta = { + description = "The GNU documentation system"; + homepage = "https://www.gnu.org/software/texinfo/"; + changelog = "https://git.savannah.gnu.org/cgit/texinfo.git/plain/NEWS"; + license = licenses.gpl3Plus; + platforms = platforms.all; + maintainers = with maintainers; [ vrthra oxij ]; + # see comment above in patches section + broken = stdenv.hostPlatform.isPower64 && lib.strings.versionOlder version "6.0"; + + longDescription = '' + Texinfo is the official documentation format of the GNU project. + It was invented by Richard Stallman and Bob Chassell many years + ago, loosely based on Brian Reid's Scribe and other formatting + languages of the time. It is used by many non-GNU projects as + well. + + Texinfo uses a single source file to produce output in a number + of formats, both online and printed (dvi, html, info, pdf, xml, + etc.). This means that instead of writing different documents + for online information and another for a printed manual, you + need write only one document. And when the work is revised, you + need revise only that one document. The Texinfo system is + well-integrated with GNU Emacs. + ''; + branch = version; + }; +} diff --git a/pkgs/by-name/te/texinfo/cross-tools-flags.patch b/pkgs/by-name/te/texinfo/cross-tools-flags.patch new file mode 100644 index 0000000..f0a8c4d --- /dev/null +++ b/pkgs/by-name/te/texinfo/cross-tools-flags.patch @@ -0,0 +1,13 @@ +diff -ur texinfo-6.5/configure texinfo-6.5-patched/configure +--- texinfo-6.5/configure 2017-09-13 03:50:18.000000000 +0900 ++++ texinfo-6.5-patched/configure 2019-12-28 17:39:06.692818866 +0900 +@@ -23281,7 +23281,7 @@ + # env -i gives this build host configure a clean environment; + # consequently, we have to re-initialize $PATH. +- env -i CC="$BUILD_CC" AR="$BUILD_AR" RANLIB="$BUILD_RANLIB" \ +- PATH="$PATH" \ ++ env -i CC="$CC_FOR_BUILD" AR="$AR_FOR_BUILD" RANLIB="$RANLIB_FOR_BUILD" \ ++ PATH="$PATH" CFLAGS="$NATIVE_TOOLS_CFLAGS" LDFLAGS="$NATIVE_TOOLS_LDFLAGS" \ + tools_only=1 \ + ${confdir}/configure --build=${build} --host=${build} \ + --disable-rpath --disable-nls diff --git a/pkgs/by-name/te/texinfo/fix-glibc-2.34.patch b/pkgs/by-name/te/texinfo/fix-glibc-2.34.patch new file mode 100644 index 0000000..60f2e63 --- /dev/null +++ b/pkgs/by-name/te/texinfo/fix-glibc-2.34.patch @@ -0,0 +1,186 @@ + +Patch by Vitezslav Crhonek +Source: https://src.fedoraproject.org/rpms/texinfo/c/9b2cca4817fa4bd8d520fed05e9560fc7183dcdf?branch=rawhide + +diff -up texinfo-6.8/gnulib/lib/cdefs.h.orig texinfo-6.8/gnulib/lib/cdefs.h +--- texinfo-6.8/gnulib/lib/cdefs.h.orig 2021-03-11 19:57:53.000000000 +0100 ++++ texinfo-6.8/gnulib/lib/cdefs.h 2021-07-19 12:26:46.985176475 +0200 +@@ -321,15 +321,15 @@ + + /* The nonnull function attribute marks pointer parameters that + must not be NULL. */ +-#ifndef __attribute_nonnull__ ++#ifndef __nonnull + # if __GNUC_PREREQ (3,3) || __glibc_has_attribute (__nonnull__) +-# define __attribute_nonnull__(params) __attribute__ ((__nonnull__ params)) ++# define __nonnull(params) __attribute__ ((__nonnull__ params)) + # else +-# define __attribute_nonnull__(params) ++# define __nonnull(params) + # endif +-#endif +-#ifndef __nonnull +-# define __nonnull(params) __attribute_nonnull__ (params) ++#elif !defined __GLIBC__ ++# undef __nonnull ++# define __nonnull(params) _GL_ATTRIBUTE_NONNULL (params) + #endif + + /* If fortification mode, we warn about unused results of certain +diff -up texinfo-6.8/gnulib/lib/libc-config.h.orig texinfo-6.8/gnulib/lib/libc-config.h +--- texinfo-6.8/gnulib/lib/libc-config.h.orig 2021-03-11 19:57:54.000000000 +0100 ++++ texinfo-6.8/gnulib/lib/libc-config.h 2021-07-19 12:27:58.810590975 +0200 +@@ -33,9 +33,9 @@ + #include + + /* On glibc this includes and and #defines +- _FEATURES_H, __WORDSIZE, and __set_errno. On FreeBSD 11 and +- DragonFlyBSD 5.9 it includes which defines __nonnull. +- Elsewhere it is harmless. */ ++ _FEATURES_H, __WORDSIZE, and __set_errno. On FreeBSD 11 it ++ includes which defines __nonnull. Elsewhere it ++ is harmless. */ + #include + + /* From glibc . */ +diff -up texinfo-6.8/gnulib/lib/malloc/dynarray-skeleton.c.orig texinfo-6.8/gnulib/lib/malloc/dynarray-skeleton.c +--- texinfo-6.8/gnulib/lib/malloc/dynarray-skeleton.c.orig 2021-03-11 19:57:54.000000000 +0100 ++++ texinfo-6.8/gnulib/lib/malloc/dynarray-skeleton.c 2021-07-19 12:24:46.878419397 +0200 +@@ -192,7 +192,7 @@ DYNARRAY_NAME (free__array__) (struct DY + + /* Initialize a dynamic array object. This must be called before any + use of the object. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static void + DYNARRAY_NAME (init) (struct DYNARRAY_STRUCT *list) + { +@@ -202,7 +202,7 @@ DYNARRAY_NAME (init) (struct DYNARRAY_ST + } + + /* Deallocate the dynamic array and its elements. */ +-__attribute_maybe_unused__ __attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __nonnull ((1)) + static void + DYNARRAY_FREE (struct DYNARRAY_STRUCT *list) + { +@@ -213,7 +213,7 @@ DYNARRAY_FREE (struct DYNARRAY_STRUCT *l + } + + /* Return true if the dynamic array is in an error state. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline bool + DYNARRAY_NAME (has_failed) (const struct DYNARRAY_STRUCT *list) + { +@@ -222,7 +222,7 @@ DYNARRAY_NAME (has_failed) (const struct + + /* Mark the dynamic array as failed. All elements are deallocated as + a side effect. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static void + DYNARRAY_NAME (mark_failed) (struct DYNARRAY_STRUCT *list) + { +@@ -236,7 +236,7 @@ DYNARRAY_NAME (mark_failed) (struct DYNA + + /* Return the number of elements which have been added to the dynamic + array. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline size_t + DYNARRAY_NAME (size) (const struct DYNARRAY_STRUCT *list) + { +@@ -245,7 +245,7 @@ DYNARRAY_NAME (size) (const struct DYNAR + + /* Return a pointer to the array element at INDEX. Terminate the + process if INDEX is out of bounds. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline DYNARRAY_ELEMENT * + DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index) + { +@@ -257,7 +257,7 @@ DYNARRAY_NAME (at) (struct DYNARRAY_STRU + /* Return a pointer to the first array element, if any. For a + zero-length array, the pointer can be NULL even though the dynamic + array has not entered the failure state. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline DYNARRAY_ELEMENT * + DYNARRAY_NAME (begin) (struct DYNARRAY_STRUCT *list) + { +@@ -267,7 +267,7 @@ DYNARRAY_NAME (begin) (struct DYNARRAY_S + /* Return a pointer one element past the last array element. For a + zero-length array, the pointer can be NULL even though the dynamic + array has not entered the failure state. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline DYNARRAY_ELEMENT * + DYNARRAY_NAME (end) (struct DYNARRAY_STRUCT *list) + { +@@ -294,7 +294,7 @@ DYNARRAY_NAME (add__) (struct DYNARRAY_S + /* Add ITEM at the end of the array, enlarging it by one element. + Mark *LIST as failed if the dynamic array allocation size cannot be + increased. */ +-__attribute_nonnull__ ((1)) ++__nonnull ((1)) + static inline void + DYNARRAY_NAME (add) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item) + { +@@ -348,8 +348,7 @@ DYNARRAY_NAME (emplace__) (struct DYNARR + /* Allocate a place for a new element in *LIST and return a pointer to + it. The pointer can be NULL if the dynamic array cannot be + enlarged due to a memory allocation failure. */ +-__attribute_maybe_unused__ __attribute_warn_unused_result__ +-__attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __attribute_warn_unused_result__ __nonnull ((1)) + static + /* Avoid inlining with the larger initialization code. */ + #if !(defined (DYNARRAY_ELEMENT_INIT) || defined (DYNARRAY_ELEMENT_FREE)) +@@ -373,7 +372,7 @@ DYNARRAY_NAME (emplace) (struct DYNARRAY + existing size, new elements are added (which can be initialized). + Otherwise, the list is truncated, and elements are freed. Return + false on memory allocation failure (and mark *LIST as failed). */ +-__attribute_maybe_unused__ __attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __nonnull ((1)) + static bool + DYNARRAY_NAME (resize) (struct DYNARRAY_STRUCT *list, size_t size) + { +@@ -418,7 +417,7 @@ DYNARRAY_NAME (resize) (struct DYNARRAY_ + } + + /* Remove the last element of LIST if it is present. */ +-__attribute_maybe_unused__ __attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __nonnull ((1)) + static void + DYNARRAY_NAME (remove_last) (struct DYNARRAY_STRUCT *list) + { +@@ -435,7 +434,7 @@ DYNARRAY_NAME (remove_last) (struct DYNA + + /* Remove all elements from the list. The elements are freed, but the + list itself is not. */ +-__attribute_maybe_unused__ __attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __nonnull ((1)) + static void + DYNARRAY_NAME (clear) (struct DYNARRAY_STRUCT *list) + { +@@ -453,8 +452,7 @@ DYNARRAY_NAME (clear) (struct DYNARRAY_S + stored in *RESULT if LIST refers to an empty list. On success, the + pointer in *RESULT is heap-allocated and must be deallocated using + free. */ +-__attribute_maybe_unused__ __attribute_warn_unused_result__ +-__attribute_nonnull__ ((1, 2)) ++__attribute_maybe_unused__ __attribute_warn_unused_result__ __nonnull ((1, 2)) + static bool + DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, + DYNARRAY_FINAL_TYPE *result) +@@ -485,8 +483,7 @@ DYNARRAY_NAME (finalize) (struct DYNARRA + have a sentinel at the end). If LENGTHP is not NULL, the array + length is written to *LENGTHP. *LIST is re-initialized and can be + reused. */ +-__attribute_maybe_unused__ __attribute_warn_unused_result__ +-__attribute_nonnull__ ((1)) ++__attribute_maybe_unused__ __attribute_warn_unused_result__ __nonnull ((1)) + static DYNARRAY_ELEMENT * + DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, size_t *lengthp) + { diff --git a/pkgs/by-name/te/texinfo/packages.nix b/pkgs/by-name/te/texinfo/packages.nix new file mode 100644 index 0000000..2017044 --- /dev/null +++ b/pkgs/by-name/te/texinfo/packages.nix @@ -0,0 +1,15 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + texinfo413 = callPackage ./4.13a.nix { }; + texinfo4 = texinfo413; + texinfo5 = callPackage ./5.2.nix { }; + texinfo6_5 = callPackage ./6.5.nix { }; # needed for allegro + texinfo6_7 = callPackage ./6.7.nix { }; # needed for gpm, iksemel and fwknop + texinfo6 = callPackage ./6.8.nix { }; + texinfo7 = callPackage ./7.0.nix { }; + texinfo = texinfo7; + texinfoInteractive = texinfo.override { interactive = true; }; +} diff --git a/pkgs/by-name/te/texlive/UPGRADING.md b/pkgs/by-name/te/texlive/UPGRADING.md new file mode 100644 index 0000000..91bc1c6 --- /dev/null +++ b/pkgs/by-name/te/texlive/UPGRADING.md @@ -0,0 +1,138 @@ +# Notes on maintaining/upgrading + +## Upgrading `texlive.bin` + +`texlive` contains a few binaries, defined in `bin.nix` and released once a year. + +In order to reduce closure size for users who just need a few of them, we split it into +packages such as `core`, `core-big`, `xdvi`, etc. This requires making assumptions +about dependencies between the projects that may change between releases; if +you upgrade you may have to do some work here. + +## Updating the package set + +`texlive` contains several thousand packages from CTAN, defined in `tlpdb.nix`. + +The CTAN mirrors are not version-controlled and continuously moving, +with more than 100 updates per month. + +To create a consistent and reproducible package set in nixpkgs, we generate nix +expressions for all packages in TeX Live at a certain day. + +To upgrade the package snapshot, follow this process. + +### Upgrade package information from texlive package database + +Update `version` in `default.nix` with the day of the new snapshot, the new TeX +Live year, and the final status of the snapshot. Then update +`texlive.tlpdbxz.hash` to match the new hash of `texlive.tlpdb.xz` and run + +```bash +nix-build ../../../../.. -A texlive.tlpdb.nix --no-out-link +``` + +This will download either the daily or the final snapshot of the TeX Live +package database `texlive.tlpdb.xz` and extract the relevant package info +(including version numbers and sha512 hashes) for the selected upstream +distribution. + +Finally, replace `tlpdb.nix` with the generated file. Note that if the +`version` info does not match the metadata of `tlpdb.nix` (as found in the +`00texlive.config` package), TeX Live packages will not evaluate. + +The test `pkgs.tests.texlive.tlpdbNix` verifies that the file `tlpdb.nix` +in Nixpkgs matches the one that generated from `texlive.tlpdb.xz`. + +### Build packages locally and generate fix hashes + +To prevent unnecessary rebuilds, texlive packages are built as fixed-output +derivations whose hashes are contained in `fixed-hashes.nix`. + +Updating the list of fixed hashes requires a local build of all new packages, +which is a resource-intensive process. First build the hashes for the new +packages. Consider tweaking the `-j` option to maximise core usage. + +```bash +nix-build generate-fixed-hashes.nix -A newHashes -j 8 +``` + +Then build the Nix expression containing all the hashes, old and new. This step +cannot be parallelized because it relies on 'import from derivation'. + +```bash +nix-build generate-fixed-hashes.nix -A fixedHashesNix +``` + +Finally, copy the result to `fixed-hashes.nix`. + +**Warning.** The expression `fixedHashesNix` reuses the *previous* fixed hashes +when possible. This is based on two assumptions: that `.tar.xz` archives with +the same names remain identical in time (which is the intended behaviour of +CTAN and the various mirrors) and that the build recipe continues to produce +the same output. Should those assumptions not hold, remove the previous fixed +hashes for the relevant package, or for all packages. + +### Upgrading the ConTeXt binaries + +The LuaMetaTeX sources required for ConTeXt are distributed separately from the +TeX Live tarballs and must be updated manually (see `texlive.bin.context`). You +must use the latest tarball at https://tug.org/svn/texlive/trunk/Master/source/ +whose revision number is less than or equal to that of the package `context`. + +### Updating the licensing information + +The license of each package in texlive is automatically extracted from texlive's +texlive.tlpdb into tlpdb.nix. The combined licenses of the schemes is stored +separately in `default.nix` and must be kept in sync with the licenses of the +actual contents of these schemes. Whether this is the case can be verified with the +`pkgs.tests.texlive.licenses` test. In case of a mismatch, copy the “correct” +license lists reported by the test into `default.nix`. + +### Running the testsuite + +There are a some other useful tests that haven't been mentioned before. Build them with +``` +nix-build ../../../../.. -A tests.texlive --no-out-link +``` + + +### Commit changes + +Commit the updated `tlpdb.nix` and `fixed-hashes.nix` to the repository with +a message like + +> texlive: 2022-final -> 2023.20230401 + +Please make sure to follow the [CONTRIBUTING](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md) +guidelines. + +## Reviewing the bin containers + +Most `tlType == "bin"` containers consist of links to scripts distributed in +`$TEXMFDIST/scripts` with a number of patches applied within `default.nix`. + +At each upgrade, please run the tests `tests.texlive.shebangs` to verify that +all shebangs have been patched and in case add the relevant interpreters, and +use `tests.texlive.binaries` to check if basic execution of all binaries works. + +Please review manually all binaries in the `broken` and `ignored` lists of +`tests.texlive.binaries` at least once for major TeX Live release. + +Since the tests cannot catch all runtime dependencies, you should grep the +`$TEXMFDIST/scripts` folder for common cases, for instance (where `$scripts` +points to the relevant folder of `scheme-full`): +- Calls to `exec $interpreter` + ``` + grep -IRS 'exec ' "$TEXMFDIST/scripts" | cut -d: -f2 | sort -u | less -S + ``` +- Calls to Ghostscripts (see `needsGhostscript` in `combine.nix`) + ``` + grep -IR '\([^a-zA-Z]\|^\)gs\( \|$\|"\)' "$TEXMFDIST"/scripts + grep -IR 'rungs' "$TEXMFDIST" + ``` + +As a general rule, if a runtime dependency as above is essential for the core +functionality of the package, then it should be made available in the bin +containers (by patching `PATH`), or in `texlive.combine` (as we do for +Ghostscript). Non-essential runtime dependencies should be ignored if they +increase the closure substantially. diff --git a/pkgs/by-name/te/texlive/bin.nix b/pkgs/by-name/te/texlive/bin.nix new file mode 100644 index 0000000..ece8a36 --- /dev/null +++ b/pkgs/by-name/te/texlive/bin.nix @@ -0,0 +1,543 @@ +{ lib, stdenv, fetchurl, fetchpatch, buildPackages +, texlive +, zlib, libiconv, libpng, libX11 +, freetype, gd, libXaw, icu, ghostscript, libXpm, libXmu, libXext +, perl, perlPackages, python3Packages, pkg-config, cmake, ninja +, libpaper, graphite2, zziplib, harfbuzz, potrace, gmp, mpfr, mupdf-headless +, brotli, cairo, pixman, xorg, clisp, biber, woff2, xxHash +, makeWrapper, shortenPerlShebang, useFixedHashes, asymptote +, biber-ms +, tlpdb +}@args: + +# Useful resource covering build options: +# http://tug.org/texlive/doc/tlbuild.html + +let + withSystemLibs = map (libname: "--with-system-${libname}"); + + year = toString ((import ./tlpdb.nix)."00texlive.config").year; + version = year; # keep names simple for now + + # detect and stop redundant rebuilds that may occur when building new fixed hashes + assertFixedHash = name: src: + if ! useFixedHashes || src ? outputHash then src else throw "The TeX Live package '${src.pname}' must have a fixed hash before building '${name}'."; + + # list of packages whose binaries are built in core, core-big + # generated manually by inspecting ${core}/bin + corePackages = [ "afm2pl" "aleph" "autosp" "axodraw2" "bibtex" "cjkutils" + "ctie" "cweb" "detex" "dtl" "dvi2tty" "dvicopy" "dvidvi" "dviljk" + "dviout-util" "dvipdfmx" "dvipos" "dvips" "fontware" "gregoriotex" + "gsftopk" "hitex" "kpathsea" "lacheck" "lcdftypetools" "m-tx" "makeindex" + "mfware" "musixtnt" "omegaware" "patgen" "pdftex" "pdftosrc" "pmx" + "ps2eps" "ps2pk" "psutils" "ptex" "seetexk" "synctex" "t1utils" "tex" + "tex4ht" "texlive-scripts-extra" "texware" "tie" "tpic2pdftex" "ttfutils" + "uptex" "velthuis" "vlna" "web" "xml2pmx" ]; + coreBigPackages = [ "metafont" "mflua" "metapost" "luatex" "luahbtex" + "upmendex" "xetex" ] ++ lib.optional withLuaJIT "luajittex"; + binPackages = lib.getAttrs (corePackages ++ coreBigPackages) tlpdb; + + common = { + src = fetchurl { + urls = [ + "http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/${year}/texlive-${year}0313-source.tar.xz" + "ftp://tug.ctan.org/pub/tex/historic/systems/texlive/${year}/texlive-${year}0313-source.tar.xz" + ]; + hash = "sha256-OHiqDh7QMBwFOw4u5OmtmZxEE0X0iC55vdHI9M6eebk="; + }; + + prePatch = '' + for i in texk/kpathsea/mktex*; do + sed -i '/^mydir=/d' "$i" + done + + # ST_NLINK_TRICK causes kpathsea to treat folders with no real subfolders + # as leaves, even if they contain symlinks to other folders; must be + # disabled to work correctly with the nix store", see section 5.3.6 + # “Subdirectory expansion” of the kpathsea manual + # http://mirrors.ctan.org/systems/doc/kpathsea/kpathsea.pdf for more + # details + sed -i '/^#define ST_NLINK_TRICK/d' texk/kpathsea/config.h + '' + + # when cross compiling, we must use himktables from PATH + # (i.e. from buildPackages.texlive.bin.core.dev) + lib.optionalString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' + sed -i 's|\./himktables|himktables|' texk/web2c/Makefile.in + '' +; + + configureFlags = [ + "--with-banner-add=/nixos.org" + "--disable-missing" # terminate if a requested program or feature must be + # disabled, e.g., due to missing libraries + "--disable-native-texlive-build" # do not build for the TeX Live binary distribution + "--enable-shared" # "--enable-cxx-runtime-hack" # static runtime + "--enable-tex-synctex" + "--disable-texlive" # do not build the texlive (TeX Live scripts) package + "--disable-linked-scripts" # do not install the linked scripts + "-C" # use configure cache to speed up + ] + ++ withSystemLibs [ + # see "from TL tree" vs. "Using installed" in configure output + "zziplib" "mpfr" "gmp" + "pixman" "potrace" "gd" "freetype2" "libpng" "libpaper" "zlib" + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + "BUILDCC=${buildPackages.stdenv.cc.targetPrefix}cc"; + + # move binaries to corresponding split outputs, based on content of texlive.tlpdb + binToOutput = lib.listToAttrs + (lib.concatMap + (n: map (v: { name = v; value = builtins.replaceStrings [ "-" ] [ "_" ] n; }) binPackages.${n}.binfiles or [ ]) + (builtins.attrNames binPackages)); + + moveBins = '' + for bin in "$out/bin"/* ; do + bin="''${bin##*/}" + package="''${binToOutput[$bin]}" + if [[ -n "$package" ]] ; then + if [[ -z "''${!package}" ]] ; then + echo "WARNING: missing output '$package' for binary '$bin', leaving in 'out'" + else + mkdir -p "''${!package}"/bin + mv "$out/bin/$bin" "''${!package}"/bin/ + fi + else + echo "WARNING: no output known for binary '$bin', leaving in 'out'" + fi + done + ''; + }; + + # RISC-V: https://github.com/LuaJIT/LuaJIT/issues/628 + withLuaJIT = !(stdenv.hostPlatform.isPower && stdenv.hostPlatform.is64bit) && !stdenv.hostPlatform.isRiscV; +in rec { # un-indented + +texliveYear = year; + + +core = stdenv.mkDerivation rec { + pname = "texlive-bin"; + inherit version; + + __structuredAttrs = true; + + inherit (common) binToOutput src prePatch; + + patches = [ + (fetchpatch { + name = "ttfdump-CVE-2024-25262.patch"; + url = "https://tug.org/svn/texlive/trunk/Build/source/texk/ttfdump/libttf/hdmx.c?r1=57915&r2=69520&view=patch"; + stripLen = 2; + hash = "sha256-WH2kioqFAs3jaFmu4DdEUdrTf6eiymtiWTZi3vWwU7k="; + }) + ]; + + outputs = [ "out" "dev" "man" "info" ] + ++ (builtins.map (builtins.replaceStrings [ "-" ] [ "_" ]) corePackages); + + nativeBuildInputs = [ + pkg-config + ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) (with texlive.bin.core; [ + # configure: error: tangle was not found but is required when cross-compiling. + # dev (himktables) is used when building hitex to generate the additional source file hitables.c + web/*tangle*/ cweb/*ctangle*/ omegaware/*otangle*/ tie/*tie*/ # see "Building TeX Live" 6.4.2 Cross problems + dev/*himktables*/ + ]); + + buildInputs = [ + /*teckit*/ zziplib mpfr gmp + pixman gd freetype libpng libpaper zlib + perl + ]; + + hardeningDisable = [ "format" ]; + + preConfigure = '' + rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \ + libs/{lua53,luajit,mpfr,pixman,pplib,teckit,zlib,zziplib} \ + texk/{bibtex-x,chktex,dvipng,dvisvgm,upmendex,xdvik} \ + utils/{asymptote,texdoctk,xindy,xpdfopen} + mkdir WorkDir + cd WorkDir + ''; + configureScript = "../configure"; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + configureFlags = common.configureFlags + ++ [ "--without-x" ] # disable xdvik and xpdfopen + ++ map (what: "--disable-${what}") [ + "chktex" + "dvisvgm" "dvipng" # ghostscript dependency + "luatex" "luajittex" "luahbtex" "luajithbtex" + "mp" "pmp" "upmp" "mf" "mflua" "mfluajit" # cairo would bring in X and more + "xetex" "bibtexu" "bibtex8" "bibtex-x" "upmendex" # ICU isn't small + ]; + + enableParallelBuilding = true; + + doCheck = false; # triptest fails, likely due to missing TEXMF tree + preCheck = "patchShebangs ../texk/web2c"; + + installTargets = [ "install" ]; + + # TODO: perhaps improve texmf.cnf search locations + postInstall = + /* remove redundant texmf-dist (content provided by TeX Live packages) */ + '' + rm -fr "$out"/share/texmf-dist + '' + /* install himktables in separate output for use in cross compilation */ '' + mkdir -p $dev/bin + cp texk/web2c/.libs/himktables $dev/bin/himktables + '' + common.moveBins; + + passthru = { inherit version buildInputs; }; + + meta = with lib; { + description = "Basic binaries for TeX Live"; + homepage = "http://www.tug.org/texlive"; + license = lib.licenses.gpl2Plus; + maintainers = with maintainers; [ veprbl lovek323 raskin jwiegley ]; + platforms = platforms.all; + }; +}; + + +inherit (core-big) metafont mflua metapost luatex luahbtex xetex; +luajittex = core.big.luajittex or null; +core-big = stdenv.mkDerivation { + pname = "texlive-bin-big"; + inherit version; + + __structuredAttrs = true; + + inherit (common) binToOutput src prePatch; + + patches = [ + # improves reproducibility of fmt files + # see discussion at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1009196 + (fetchpatch { + name = "lua_fixed_hash.patch"; + url = "https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=1009196;filename=lua_fixed_hash.patch;msg=45"; + sha256 = "sha256-FTu1eRd3AUU7IRs2/7e7uwHuvZsrzTBPypbcEZkU7y4="; + }) + # update to LuaTeX 1.16.1 to prepare for 1.17.0 below + (fetchpatch { + name = "luatex-1.16.1.patch"; + url = "https://github.com/TeX-Live/texlive-source/commit/ad8702a45e317fa9d396ef4d50467c37964a9543.patch"; + hash = "sha256-qfzUfkJUfW285w+fnbpO8JLArM7/uj3yb9PONgZrJLE="; + }) + # fixes security issues in luatex that allows arbitrary code execution even with shell-escape disabled and network requests, see https://tug.org/~mseven/luatex.html + # fixed in LuaTeX 1.17.0, shipped as a rare binary update in TL 2023 + (fetchpatch { + name = "luatex-1.17.0.patch"; + url = "https://github.com/TeX-Live/texlive-source/commit/6ace460233115bd42b36e63c7ddce11cc92a1ebd.patch"; + hash = "sha256-2fbIdwnw/XQXci9OqRrb6B5tHiSR0co08NyFgMyXCvc="; + }) + # Fixes texluajitc crashes on aarch64, backport of the upstream fix + # https://github.com/LuaJIT/LuaJIT/commit/e9af1abec542e6f9851ff2368e7f196b6382a44c + # to the version vendored by texlive (2.1.0-beta3) + (fetchpatch { + name = "luajit-fix-aarch64-linux.patch"; + url = "https://raw.githubusercontent.com/void-linux/void-packages/master/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch"; + hash = "sha256-ysSZmfpfCFMukfHmIqwofAZux1e2kEq/37lfqp7HoWo="; + stripLen = 1; + extraPrefix = "libs/luajit/LuaJIT-src/"; + }) + ]; + + hardeningDisable = [ "format" ]; + + inherit (core) nativeBuildInputs depsBuildBuild; + buildInputs = core.buildInputs ++ [ core cairo harfbuzz icu graphite2 libX11 potrace ]; + + /* deleting the unused packages speeds up configure by a considerable margin + and ensures we do not rebuild existing libraries by mistake */ + preConfigure = '' + rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \ + libs/{mpfr,pixman,xpdf,zlib,zziplib} \ + texk/{afm2pl,bibtex-x,chktex,cjkutils,detex,dtl,dvi2tty,dvidvi,dviljk,dviout-util} \ + texk/{dvipdfm-x,dvipng,dvipos,dvipsk,dvisvgm,gregorio,gsftopk,kpathsea} \ + texk/{lcdf-typetools,makeindexk,makejvf,mendexk,musixtnt,ps2pk,psutils,ptexenc} \ + texk/{seetexk,tex4htk,texlive,ttf2pk2,ttfdump,xdvik} \ + utils/{asymptote,autosp,axodraw2,devnag,lacheck,m-tx,pmx,ps2eps,t1utils,texdoctk} \ + utils/{tpic2pdftex,vlna,xindy,xml2pmx,xpdfopen} + mkdir WorkDir + cd WorkDir + ''; + + configureFlags = common.configureFlags + ++ withSystemLibs [ "kpathsea" "ptexenc" "cairo" "harfbuzz" "icu" "graphite2" ] + ++ map (prog: "--disable-${prog}") # don't build things we already have + # list from texk/web2c/configure + ([ "tex" "ptex" "eptex" "uptex" "euptex" "aleph" "hitex" "pdftex" + "web-progs" "synctex" + ] ++ lib.optionals (!withLuaJIT) [ "luajittex" "luajithbtex" "mfluajit" ]) + /* disable all packages, re-enable upmendex, web2c packages */ + ++ [ "--disable-all-pkgs" "--enable-upmendex" "--enable-web2c" ] + /* kpathsea requires specifying the kpathsea location manually */ + ++ [ "--with-kpathsea-includes=${core.dev}/include" ]; + + configureScript = "../configure"; + + enableParallelBuilding = true; + + doCheck = false; # fails + + outputs = [ "out" "dev" "man" "info" ] + ++ (builtins.map (builtins.replaceStrings [ "-" ] [ "_" ]) coreBigPackages) + # some outputs of metapost, omegaware are for ptex/uptex + ++ [ "ptex" "uptex" ] + # unavoidable duplicates from core + ++ [ "ctie" "cweb" "omegaware" "texlive_scripts_extra" "tie" "web" ]; + postInstall = common.moveBins; +}; + + +chktex = stdenv.mkDerivation { + pname = "chktex"; + inherit (texlive.pkgs.chktex) version; + + inherit (common) src; + + nativeBuildInputs = [ pkg-config ]; + # perl used in shebang of script bin/deweb + buildInputs = [ core/*kpathsea*/ perl ]; + + preConfigure = "cd texk/chktex"; + + configureFlags = common.configureFlags + ++ [ "--with-system-kpathsea" ]; + + enableParallelBuilding = true; +}; + +# the LuaMetaTeX engine (distributed since TeX Live 2023) must be built separately +# the sources used by TL are stored in the source TL repo +# for details see https://wiki.contextgarden.net/Building_LuaMetaTeX_for_TeX_Live +context = stdenv.mkDerivation rec { + pname = "luametatex"; + version = "2.10.08"; + + src = fetchurl { + url = "https://tug.org/svn/texlive/trunk/Master/source/luametatex-${version}.tar.xz?revision=67034&view=co"; + hash = "sha256-3JeOUQ63jJOZWTxFCoyWjfcrspmdmC/yqgS1JaLfTWk="; + }; + + enableParallelBuilding = true; + nativeBuildInputs = [ cmake ninja ]; + + meta = with lib; { + description = "The LUAMETATEX engine is a follow up on LUATEX and is again part of CONTEXT development"; + homepage = "https://www.pragma-ade.nl/luametatex-1.htm"; + license = licenses.gpl2Plus; + maintainers = with lib.maintainers; [ apfelkuchen6 xworld21 ]; + }; +}; + +dvisvgm = stdenv.mkDerivation rec { + pname = "dvisvgm"; + version = "3.2.2"; + + src = assert lib.assertMsg (version == texlive.pkgs.dvisvgm.version) "dvisvgm: TeX Live version (${texlive.pkgs.dvisvgm.version}) different from source (${version}), please update dvisvgm"; fetchurl { + url = "https://github.com/mgieseki/dvisvgm/releases/download/${version}/dvisvgm-${version}.tar.gz"; + hash = "sha256-8GKL6lqjMUXXWwpqbdGPrYibdSc4y8AcGUGPNUc6HQA="; + }; + + configureFlags = [ + "--disable-manpage" # man pages are provided by the doc container + ]; + + # PDF handling requires mutool (from mupdf) since Ghostscript 10.01 + postPatch = '' + substituteInPlace src/PDFHandler.cpp \ + --replace-fail 'Process("mutool"' "Process(\"$(PATH="$HOST_PATH" command -v mutool)\"" + ''; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ core brotli ghostscript zlib freetype woff2 potrace xxHash mupdf-headless ]; + + enableParallelBuilding = true; +}; + + +dvipng = stdenv.mkDerivation { + pname = "dvipng"; + inherit (texlive.pkgs.dvipng) version; + + inherit (common) src; + + nativeBuildInputs = [ perl pkg-config makeWrapper ]; + buildInputs = [ core/*kpathsea*/ zlib libpng freetype gd ghostscript ]; + + preConfigure = '' + cd texk/dvipng + patchShebangs doc/texi2pod.pl + ''; + + configureFlags = common.configureFlags + ++ [ "--with-system-kpathsea" "--with-gs=yes" "--disable-debug" ]; + + GS="${ghostscript}/bin/gs"; + + enableParallelBuilding = true; +}; + +pygmentex = python3Packages.buildPythonApplication rec { + pname = "pygmentex"; + inherit (src) version; + format = "other"; + + src = assertFixedHash pname texlive.pkgs.pygmentex.tex; + + propagatedBuildInputs = with python3Packages; [ pygments chardet ]; + + dontBuild = true; + + doCheck = false; + + installPhase = '' + runHook preInstall + + install -D ./scripts/pygmentex/pygmentex.py "$out"/bin/pygmentex + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://www.ctan.org/pkg/pygmentex"; + description = "Auxiliary tool for typesetting code listings in LaTeX documents using Pygments"; + longDescription = '' + PygmenTeX is a Python-based LaTeX package that can be used for + typesetting code listings in a LaTeX document using Pygments. + + Pygments is a generic syntax highlighter for general use in all kinds of + software such as forum systems, wikis or other applications that need to + prettify source code. + ''; + license = licenses.lppl13c; + maintainers = with maintainers; [ romildo ]; + }; +}; + +asymptote = args.asymptote.overrideAttrs (finalAttrs: prevAttrs: { + version = texlive.pkgs.asymptote.version; + + # keep local src and patches even if duplicated in the top level asymptote + # so that top level updates do not break texlive + src = fetchurl { + url = "mirror://sourceforge/asymptote/${finalAttrs.version}/asymptote-${finalAttrs.version}.src.tgz"; + hash = "sha256-DecadD+m7pORuH3Sdcs/5M3vUbN6rhSkFoNN0Soq9bs="; + }; + + texContainer = texlive.pkgs.asymptote.tex; + texdocContainer = texlive.pkgs.asymptote.texdoc; + + patches = [ + (fetchpatch { + # partial fix for macOS XDR/V3D support (LDFLAGS change seems like an unrelated bugfix) + name = "restore-LDFLAGS-dont-look-for-tirpc-under-MacOS.patch"; + url = "https://github.com/vectorgraphics/asymptote/commit/7e17096b22d18d133d1bc5916b6e32c0cb24ad10.patch"; + hash = "sha256-olCFzqfZwWOAjqlB5lDPXYRHU9i3VQNgoR0cO5TmW98="; + }) + ]; +}); + +inherit biber; +inherit biber-ms; +bibtexu = bibtex8; +bibtex8 = stdenv.mkDerivation { + pname = "bibtex-x"; + inherit (texlive.pkgs.bibtexu) version; + + inherit (common) src; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ core/*kpathsea*/ icu ]; + + preConfigure = "cd texk/bibtex-x"; + + configureFlags = common.configureFlags + ++ [ "--with-system-kpathsea" "--with-system-icu" ]; + + enableParallelBuilding = true; +}; + + +xdvi = stdenv.mkDerivation { + pname = "xdvi"; + inherit (texlive.pkgs.xdvi) version; + + inherit (common) src; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ core/*kpathsea*/ freetype ghostscript ] + ++ (with xorg; [ libX11 libXaw libXi libXpm libXmu libXaw libXext libXfixes ]); + + preConfigure = "cd texk/xdvik"; + + configureFlags = common.configureFlags + ++ [ "--with-system-kpathsea" "--with-system-libgs" ]; + + enableParallelBuilding = true; + + postInstall = '' + substituteInPlace "$out/bin/xdvi" \ + --replace-fail "exec xdvi-xaw" "exec '$out/bin/xdvi-xaw'" + ''; + # TODO: it's suspicious that mktexpk generates fonts into ~/.texlive2014 +}; + +xpdfopen = stdenv.mkDerivation { + pname = "xpdfopen"; + inherit (texlive.pkgs.xpdfopen) version; + + inherit (common) src; + + buildInputs = [ libX11 ]; + + preConfigure = "cd utils/xpdfopen"; + + enableParallelBuilding = true; +}; + +} # un-indented + +// lib.optionalAttrs (!clisp.meta.broken) # broken on aarch64 and darwin (#20062) +{ + +xindy = stdenv.mkDerivation { + pname = "xindy"; + inherit (texlive.pkgs.xindy) version; + + inherit (common) src; + + # If unset, xindy will try to mkdir /homeless-shelter + HOME = "."; + + prePatch = "cd utils/xindy"; + # hardcode clisp location + postPatch = '' + substituteInPlace xindy-*/user-commands/xindy.in \ + --replace-fail "our \$clisp = ( \$is_windows ? 'clisp.exe' : 'clisp' ) ;" \ + "our \$clisp = '$(type -P clisp)';" \ + --replace-fail 'die "$cmd: Cannot locate xindy modules directory";' \ + '$modules_dir = "${texlive.pkgs.xindy.tex}/xindy/modules"; die "$cmd: Cannot locate xindy modules directory" unless -d $modules_dir;' + ''; + + nativeBuildInputs = [ + pkg-config perl + ]; + buildInputs = [ clisp libiconv perl ]; + + configureFlags = [ "--with-clisp-runtime=system" "--disable-xindy-docs" "--disable-xindy-rules" ]; + + preInstall = ''mkdir -p "$out/bin" ''; + # fixup various file-location errors of: lib/xindy/{xindy.mem,modules/} + postInstall = '' + mkdir -p "$out/lib/xindy" + mv "$out"/{bin/xindy.mem,lib/xindy/} + ''; +}; + +} diff --git a/pkgs/by-name/te/texlive/build-tex-env.nix b/pkgs/by-name/te/texlive/build-tex-env.nix new file mode 100644 index 0000000..5497e6b --- /dev/null +++ b/pkgs/by-name/te/texlive/build-tex-env.nix @@ -0,0 +1,309 @@ +{ + # texlive package set + tl +, bin + +, lib +, buildEnv +, libfaketime +, makeFontsConf +, makeWrapper +, runCommand +, writeShellScript +, writeText +, toTLPkgSets +, bash +, perl + + # common runtime dependencies +, coreutils +, gawk +, gnugrep +, gnused +, ghostscript +}: + +lib.fix (self: { + withDocs ? false +, withSources ? false +, requiredTeXPackages ? ps: [ ps.scheme-infraonly ] + +### texlive.combine backward compatibility +, __extraName ? "combined" +, __extraVersion ? "" +# emulate the old texlive.combine (e.g. add man pages to main output) +, __combine ? false +# adjust behavior further if called from the texlive.combine wrapper +, __fromCombineWrapper ? false +}@args: + +let + ### buildEnv with custom attributes + buildEnv' = args: (buildEnv + ({ inherit (args) name paths; }) + // lib.optionalAttrs (args ? extraOutputsToInstall) { inherit (args) extraOutputsToInstall; }) + .overrideAttrs (removeAttrs args [ "extraOutputsToInstall" "name" "paths" "pkgs" ]); + + ### texlive.combine backward compatibility + # if necessary, convert old style { pkgs = [ ... ]; } packages to attribute sets + isOldPkgList = p: ! p.outputSpecified or false && p ? pkgs && builtins.all (p: p ? tlType) p.pkgs; + ensurePkgSets = ps: if ! __fromCombineWrapper && builtins.any isOldPkgList ps + then let oldPkgLists = builtins.partition isOldPkgList ps; + in oldPkgLists.wrong ++ lib.concatMap toTLPkgSets oldPkgLists.right + else ps; + + pkgList = rec { + # resolve dependencies of the packages that affect the runtime + all = + let + # order of packages is irrelevant + packages = builtins.sort (a: b: a.pname < b.pname) (ensurePkgSets (requiredTeXPackages tl)); + runtime = builtins.partition + (p: p.outputSpecified or false -> builtins.elem (p.tlOutputName or p.outputName) [ "out" "tex" "tlpkg" ]) + packages; + keySet = p: { + key = ((p.name or "${p.pname}-${p.version}") + "-" + p.tlOutputName or p.outputName or ""); + inherit p; + tlDeps = if p ? tlDeps then ensurePkgSets p.tlDeps else (p.requiredTeXPackages or (_: [ ]) tl); + }; + in + # texlive.combine: the wrapper already resolves all dependencies + if __fromCombineWrapper then requiredTeXPackages null else + builtins.catAttrs "p" (builtins.genericClosure { + startSet = map keySet runtime.right; + operator = p: map keySet p.tlDeps; + }) ++ runtime.wrong; + + # group the specified outputs + specified = builtins.partition (p: p.outputSpecified or false) all; + specifiedOutputs = lib.groupBy (p: p.tlOutputName or p.outputName) specified.right; + otherOutputNames = builtins.catAttrs "key" (builtins.genericClosure { + startSet = map (key: { inherit key; }) (lib.concatLists (builtins.catAttrs "outputs" specified.wrong)); + operator = _: [ ]; + }); + otherOutputs = lib.genAttrs otherOutputNames (n: builtins.catAttrs n specified.wrong); + outputsToInstall = builtins.catAttrs "key" (builtins.genericClosure { + startSet = map (key: { inherit key; }) + ([ "out" ] ++ lib.optional (otherOutputs ? man) "man" + ++ lib.concatLists (builtins.catAttrs "outputsToInstall" (builtins.catAttrs "meta" specified.wrong))); + operator = _: [ ]; + }); + + # split binary and tlpkg from tex, texdoc, texsource + bin = if __fromCombineWrapper + then builtins.filter (p: p.tlType == "bin") all # texlive.combine: legacy filter + else otherOutputs.out or [ ] ++ specifiedOutputs.out or [ ]; + tlpkg = if __fromCombineWrapper + then builtins.filter (p: p.tlType == "tlpkg") all # texlive.combine: legacy filter + else otherOutputs.tlpkg or [ ] ++ specifiedOutputs.tlpkg or [ ]; + + nonbin = if __fromCombineWrapper then builtins.filter (p: p.tlType != "bin" && p.tlType != "tlpkg") all # texlive.combine: legacy filter + else (if __combine then # texlive.combine: emulate old input ordering to avoid rebuilds + lib.concatMap (p: lib.optional (p ? tex) p.tex + ++ lib.optional ((withDocs || p ? man) && p ? texdoc) p.texdoc + ++ lib.optional (withSources && p ? texsource) p.texsource) specified.wrong + else otherOutputs.tex or [ ] + ++ lib.optionals withDocs (otherOutputs.texdoc or [ ]) + ++ lib.optionals withSources (otherOutputs.texsource or [ ])) + ++ specifiedOutputs.tex or [ ] ++ specifiedOutputs.texdoc or [ ] ++ specifiedOutputs.texsource or [ ]; + + # outputs that do not become part of the environment + nonEnvOutputs = lib.subtractLists [ "out" "tex" "texdoc" "texsource" "tlpkg" ] otherOutputNames; + + # packages that contribute to config files and formats + fontMaps = lib.filter (p: p ? fontMaps && (p.tlOutputName or p.outputName == "tex")) nonbin; + sortedFontMaps = builtins.sort (a: b: a.pname < b.pname) fontMaps; + hyphenPatterns = lib.filter (p: p ? hyphenPatterns && (p.tlOutputName or p.outputName == "tex")) nonbin; + sortedHyphenPatterns = builtins.sort (a: b: a.pname < b.pname) hyphenPatterns; + formatPkgs = lib.filter (p: p ? formats && (p.outputSpecified or false -> p.tlOutputName or p.outputName == "tex") && builtins.any (f: f.enabled or true) p.formats) all; + sortedFormatPkgs = builtins.sort (a: b: a.pname < b.pname) formatPkgs; + }; + + # list generated by inspecting `grep -IR '\([^a-zA-Z]\|^\)gs\( \|$\|"\)' "$TEXMFDIST"/scripts` + # and `grep -IR rungs "$TEXMFDIST"` + # and ignoring luatex, perl, and shell scripts (those must be patched using postFixup) + needsGhostscript = lib.any (p: lib.elem p.pname [ "context" "dvipdfmx" "latex-papersize" "lyluatex" ]) pkgList.bin; + + name = if __combine then "texlive-${__extraName}-${bin.texliveYear}${__extraVersion}" # texlive.combine: old name name + else "texlive-${bin.texliveYear}-env"; + + texmfdist = buildEnv' { + name = "${name}-texmfdist"; + + # remove fake derivations (without 'outPath') to avoid undesired build dependencies + paths = builtins.catAttrs "outPath" pkgList.nonbin; + + # mktexlsr + nativeBuildInputs = [ tl."texlive.infra" ]; + + postBuild = # generate ls-R database + '' + mktexlsr "$out" + ''; + }; + + tlpkg = buildEnv { + name = "${name}-tlpkg"; + + # remove fake derivations (without 'outPath') to avoid undesired build dependencies + paths = builtins.catAttrs "outPath" pkgList.tlpkg; + }; + + # the 'non-relocated' packages must live in $TEXMFROOT/texmf-dist + # and sometimes look into $TEXMFROOT/tlpkg (notably fmtutil, updmap look for perl modules in both) + texmfroot = runCommand "${name}-texmfroot" { + inherit texmfdist tlpkg; + } '' + mkdir -p "$out" + ln -s "$texmfdist" "$out"/texmf-dist + ln -s "$tlpkg" "$out"/tlpkg + ''; + + # texlive.combine: expose info and man pages in usual /share/{info,man} location + doc = buildEnv { + name = "${name}-doc"; + + paths = [ (texmfdist.outPath + "/doc") ]; + extraPrefix = "/share"; + + pathsToLink = [ + "/info" + "/man" + ]; + }; + + meta = { + description = "TeX Live environment" + + lib.optionalString withDocs " with documentation" + + lib.optionalString (withDocs && withSources) " and" + + lib.optionalString withSources " with sources"; + platforms = lib.platforms.all; + longDescription = "Contains the following packages and their transitive dependencies:\n - " + + lib.concatMapStringsSep "\n - " + (p: p.pname + (lib.optionalString (p.outputSpecified or false) " (${p.tlOutputName or p.outputName})")) + (requiredTeXPackages tl); + }; + + # other outputs + nonEnvOutputs = lib.genAttrs pkgList.nonEnvOutputs (outName: buildEnv' { + inherit name; + outputs = [ outName ]; + paths = builtins.catAttrs "outPath" + (pkgList.otherOutputs.${outName} or [ ] ++ pkgList.specifiedOutputs.${outName} or [ ]); + # force the output to be ${outName} or nix-env will not work + nativeBuildInputs = [ (writeShellScript "force-output.sh" '' + export out="''${${outName}-}" + '') ]; + inherit meta passthru; + }); + + passthru = { + # This is set primarily to help find-tarballs.nix to do its job + requiredTeXPackages = builtins.filter lib.isDerivation (pkgList.bin ++ pkgList.nonbin + ++ lib.optionals (! __fromCombineWrapper) + (lib.concatMap (n: (pkgList.otherOutputs.${n} or [ ] ++ pkgList.specifiedOutputs.${n} or [ ]))) pkgList.nonEnvOutputs); + # useful for inclusion in the `fonts.packages` nixos option or for use in devshells + fonts = "${texmfroot}/texmf-dist/fonts"; + # support variants attrs, (prev: attrs) + __overrideTeXConfig = newArgs: + let appliedArgs = if builtins.isFunction newArgs then newArgs args else newArgs; in + self (args // { __fromCombineWrapper = false; } // appliedArgs); + withPackages = reqs: self (args // { requiredTeXPackages = ps: requiredTeXPackages ps ++ reqs ps; __fromCombineWrapper = false; }); + }; + + # TeXLive::TLOBJ::fmtutil_cnf_lines + fmtutilLine = { name, engine, enabled ? true, patterns ? [ "-" ], options ? "", ... }: + lib.optionalString (! enabled) "#! " + "${name} ${engine} ${lib.concatStringsSep "," patterns} ${options}"; + fmtutilLines = { pname, formats, ...}: + [ "#" "# from ${pname}:" ] ++ map fmtutilLine formats; + + # TeXLive::TLOBJ::language_dat_lines + langDatLine = { name, file, synonyms ? [ ], ... }: + [ "${name} ${file}" ] ++ map (s: "=" + s) synonyms; + langDatLines = { pname, hyphenPatterns, ... }: + [ "% from ${pname}:" ] ++ builtins.concatMap langDatLine hyphenPatterns; + + # TeXLive::TLOBJ::language_def_lines + # see TeXLive::TLUtils::parse_AddHyphen_line for default values + langDefLine = { name, file, lefthyphenmin ? "", righthyphenmin ? "", synonyms ? [ ], ... }: + map (n: "\\addlanguage{${n}}{${file}}{}{${if lefthyphenmin == "" then "2" else lefthyphenmin}}{${if righthyphenmin == "" then "3" else righthyphenmin}}") + ([ name ] ++ synonyms); + langDefLines = { pname, hyphenPatterns, ... }: + [ "% from ${pname}:" ] ++ builtins.concatMap langDefLine hyphenPatterns; + + # TeXLive::TLOBJ::language_lua_lines + # see TeXLive::TLUtils::parse_AddHyphen_line for default values + langLuaLine = { name, file, lefthyphenmin ? "", righthyphenmin ? "", synonyms ? [ ], ... }@args: '' + ''\t['${name}'] = { + ''\t''\tloader = '${file}', + ''\t''\tlefthyphenmin = ${if lefthyphenmin == "" then "2" else lefthyphenmin}, + ''\t''\trighthyphenmin = ${if righthyphenmin == "" then "3" else righthyphenmin}, + ''\t''\tsynonyms = { ${lib.concatStringsSep ", " (map (s: "'${s}'") synonyms)} }, + '' + + lib.optionalString (args ? file_patterns) "\t\tpatterns = '${args.file_patterns}',\n" + + lib.optionalString (args ? file_exceptions) "\t\thyphenation = '${args.file_exceptions}',\n" + + lib.optionalString (args ? luaspecial) "\t\tspecial = '${args.luaspecial}',\n" + + "\t},"; + langLuaLines = { pname, hyphenPatterns, ... }: + [ "-- from ${pname}:" ] ++ map langLuaLine hyphenPatterns; + + assembleConfigLines = f: packages: + builtins.concatStringsSep "\n" (builtins.concatMap f packages); + + updmapLines = { pname, fontMaps, ...}: + [ "# from ${pname}:" ] ++ fontMaps; + + out = +# no indent for git diff purposes +buildEnv' { + + inherit name; + + # use attrNames, attrValues to ensure the two lists are sorted in the same way + outputs = [ "out" ] ++ lib.optionals (! __combine) (builtins.attrNames nonEnvOutputs); + otherOutputs = lib.optionals (! __combine) (builtins.attrValues nonEnvOutputs); + + # remove fake derivations (without 'outPath') to avoid undesired build dependencies + paths = builtins.catAttrs "outPath" pkgList.bin + ++ lib.optional __combine doc; + pathsToLink = [ + "/" + "/share/texmf-var/scripts" + "/share/texmf-var/tex/generic/config" + "/share/texmf-var/web2c" + "/share/texmf-config" + "/bin" # ensure these are writeable directories + ]; + + nativeBuildInputs = [ + makeWrapper + libfaketime + tl."texlive.infra" # mktexlsr + tl.texlive-scripts # fmtutil, updmap + tl.texlive-scripts-extra # texlinks + perl + ]; + + buildInputs = [ coreutils gawk gnugrep gnused ] ++ lib.optional needsGhostscript ghostscript; + + inherit meta passthru; + + inherit texmfdist texmfroot; + + fontconfigFile = makeFontsConf { fontDirectories = [ "${texmfroot}/texmf-dist/fonts" ]; }; + + fmtutilCnf = assembleConfigLines fmtutilLines pkgList.sortedFormatPkgs; + updmapCfg = assembleConfigLines updmapLines pkgList.sortedFontMaps; + + languageDat = assembleConfigLines langDatLines pkgList.sortedHyphenPatterns; + languageDef = assembleConfigLines langDefLines pkgList.sortedHyphenPatterns; + languageLua = assembleConfigLines langLuaLines pkgList.sortedHyphenPatterns; + + postactionScripts = builtins.catAttrs "postactionScript" pkgList.tlpkg; + + postBuild = '' + . "${./build-tex-env.sh}" + ''; +}; + # outputsToInstall must be set *after* overrideAttrs (used in buildEnv') or it fails the checkMeta tests +in if __combine then out else lib.addMetaAttrs { inherit (pkgList) outputsToInstall; } out) diff --git a/pkgs/by-name/te/texlive/build-tex-env.sh b/pkgs/by-name/te/texlive/build-tex-env.sh new file mode 100644 index 0000000..834b2e0 --- /dev/null +++ b/pkgs/by-name/te/texlive/build-tex-env.sh @@ -0,0 +1,328 @@ +# shellcheck shell=bash + +# Replicate the post install phase of the upstream TeX Live installer. +# +# This script is based on the install-tl script and the TeXLive::TLUtils perl +# module, down to using the same (prefixed) function names and log messages. +# +# When updating to the next TeX Live release, review install-tl for changes and +# update this script accordingly. + +### install-tl + +# adjust texmf.cnf and texmfcnf.lua +installtl_do_texmf_cnf () { + # unlike install-tl, we make a copy of the entire texmf.cnf + # and point the binaries at $TEXMFCNF/texmf.cnf via wrappers + + mkdir -p "$TEXMFCNF" + if [[ -e $texmfdist/web2c/texmfcnf.lua ]]; then + tlutils_info "writing texmfcnf.lua to $TEXMFCNF/texmfcnf.lua" + sed -e "s,\(TEXMFOS[ ]*=[ ]*\)[^\,]*,\1\"$texmfroot\",g" \ + -e "s,\(TEXMFDIST[ ]*=[ ]*\)[^\,]*,\1\"$texmfdist\",g" \ + -e "s,\(TEXMFSYSVAR[ ]*=[ ]*\)[^\,]*,\1\"$TEXMFSYSVAR\",g" \ + -e "s,\(TEXMFSYSCONFIG[ ]*=[ ]*\)[^\,]*,\1\"$TEXMFSYSCONFIG\",g" \ + -e "s,\(TEXMFLOCAL[ ]*=[ ]*\)[^\,]*,\1\"$out/share/texmf-local\",g" \ + -e "s,\$SELFAUTOLOC,$out,g" \ + -e "s,selfautodir:/,$out/share/,g" \ + -e "s,selfautodir:,$out/share/,g" \ + -e "s,selfautoparent:/,$out/share/,g" \ + -e "s,selfautoparent:,$out/share/,g" \ + "$texmfdist/web2c/texmfcnf.lua" > "$TEXMFCNF/texmfcnf.lua" + fi + + tlutils_info "writing texmf.cnf to $TEXMFCNF/texmf.cnf" + sed -e "s,\(TEXMFROOT[ ]*=[ ]*\)[^\,]*,\1$texmfroot,g" \ + -e "s,\(TEXMFDIST[ ]*=[ ]*\)[^\,]*,\1$texmfdist,g" \ + -e "s,\(TEXMFSYSVAR[ ]*=[ ]*\)[^\,]*,\1$TEXMFSYSVAR,g" \ + -e "s,\(TEXMFSYSCONFIG[ ]*=[ ]*\)[^\,]*,\1$TEXMFSYSCONFIG,g" \ + -e "s,\$SELFAUTOLOC,$out,g" \ + -e "s,\$SELFAUTODIR,$out/share,g" \ + -e "s,\$SELFAUTOPARENT,$out/share,g" \ + -e "s,\$SELFAUTOGRANDPARENT,$out/share,g" \ + "$texmfdist/web2c/texmf.cnf" > "$TEXMFCNF/texmf.cnf" +} + +# run postaction scripts from texlive.tlpdb +# note that the other postactions (fileassoc, ...) are Windows only +installtl_do_tlpdb_postactions () { + local postaction postInterp + if [[ -n $postactionScripts ]] ; then + tlutils_info "running package-specific postactions" + for postaction in $postactionScripts ; do + # see TeXLive::TLUtils::_installtl_do_postaction_script + case "$postaction" in + *.pl) + postInterp=perl ;; + *.texlua) + postInterp=texlua ;; + *) + postInterp= ;; + esac + tlutils_info "${postInterp:+$postInterp }$postaction install $texmfroot" + FORCE_SOURCE_DATE=1 $postInterp "$texmfroot/$postaction" install "$texmfroot" >>"$TEXMFSYSVAR/postaction-${postaction##*/}.log" + done + tlutils_info "finished with package-specific postactions" + fi +} + +installtl_do_path_adjustments () { + # here install-tl would add a system symlink to the man pages + # instead we run other nixpkgs related adjustments + + # generate wrappers + tlutils_info "wrapping binaries" + + local bash cmd extraPaths link path target wrapCount + bash="$(command -v bash)" + enable -f "${bash%/bin/bash}"/lib/bash/realpath realpath + + # common runtime dependencies + for cmd in cat awk sed grep gs ; do + # do not fail if gs is absent + path="$(PATH="$HOST_PATH" command -v "$cmd" || :)" + if [[ -n $path ]] ; then + extraPaths="${extraPaths:+$extraPaths:}${path%/"$cmd"}" + fi + done + + declare -i wrapCount=0 + for link in "$out"/bin/* ; do + target="$(realpath "$link")" + + # skip non-executable files (such as context.lua) + if [[ ! -x $target ]] ; then + continue + fi + + if [[ ${target##*/} != "${link##*/}" ]] ; then + # detected alias with different basename, use immediate target of $link to preserve $0 + # relevant for mktexfmt, repstopdf, ... + target="$(readlink "$link")" + fi + + rm "$link" + makeWrapper "$target" "$link" \ + --inherit-argv0 \ + --prefix PATH : "$extraPaths:$out/bin" \ + --set-default TEXMFCNF "$TEXMFCNF" \ + --set-default FONTCONFIG_FILE "$fontconfigFile" + wrapCount=$((wrapCount + 1)) + done + + tlutils_info "wrapped $wrapCount binaries and scripts" + + # generate format symlinks (using fmtutil.cnf) + tlutils_info "generating format symlinks" + texlinks --quiet "$out/bin" + + # remove *-sys scripts since /nix/store is readonly + rm "$out"/bin/*-sys + + # link TEXMFDIST in $out/share for backward compatibility + ln -s "$texmfdist" "$out"/share/texmf + + # generate other outputs + local otherOutput otherOutputName + local otherOutputs="$otherOutputs" + for otherOutputName in $outputs ; do + if [[ $otherOutputName == out ]] ; then + continue + fi + otherOutput="${otherOutputs%% *}" + otherOutputs="${otherOutputs#* }" + ln -s "$otherOutput" "${!otherOutputName}" + done +} + +# run all post install parts +installtl_do_postinst_stuff () { + installtl_do_texmf_cnf + + # create various config files + # in principle, we could use writeText and share them across different + # environments, but the eval & build overhead is not worth the savings + tlutils_create_fmtutil + tlutils_create_updmap + tlutils_create_language_dat + tlutils_create_language_def + tlutils_create_language_lua + + # make new files available + tlutils_info "running mktexlsr $TEXMFSYSVAR $TEXMFSYSCONFIG" + mktexlsr "$TEXMFSYSVAR" "$TEXMFSYSCONFIG" + + # update font maps + tlutils_info "generating font maps" + updmap-sys --quiet --force --nohash 2>&1 + # configure the paper size + # tlmgr --no-execute-actions paper letter + # install-tl: "rerun mktexlsr for updmap-sys and tlmgr paper updates" + tlutils_info "re-running mktexlsr $TEXMFSYSVAR $TEXMFSYSCONFIG" + mktexlsr "$TEXMFSYSVAR" "$TEXMFSYSCONFIG" + + tlutils_update_context_cache + + # generate formats + # install-tl would run fmtutil-sys $common_fmtutil_args --no-strict --all + # instead, we want fmtutil to exit with error on failure + if [[ -n $fmtutilCnf ]] ; then + tlutils_info "pre-generating all format files, be patient..." + # many formats still ignore SOURCE_DATE_EPOCH even when FORCE_SOURCE_DATE=1 + # libfaketime fixes non-determinism related to timestamps ignoring FORCE_SOURCE_DATE + # we cannot fix further randomness caused by luatex; for further details, see + # https://salsa.debian.org/live-team/live-build/-/blob/master/examples/hooks/reproducible/2006-reproducible-texlive-binaries-fmt-files.hook.chroot#L52 + # note that calling faketime and fmtutil is fragile (faketime uses LD_PRELOAD, fmtutil calls /bin/sh, causing potential glibc issues on non-NixOS) + # so we patch fmtutil to use faketime, rather than calling faketime fmtutil + substitute "$texmfdist"/scripts/texlive/fmtutil.pl fmtutil \ + --replace-fail "my \$cmdline = \"\$eng -ini " "my \$cmdline = \"faketime -f '\@$(date +'%F %T' --date=@"$SOURCE_DATE_EPOCH") x0.001' \$eng -ini " + FORCE_SOURCE_DATE=1 perl fmtutil --quiet --strict --sys --all 2>&1 | grep '^fmtutil' # too verbose + fi + + installtl_do_path_adjustments + + installtl_do_tlpdb_postactions + + # remove log files to improve reproducibility + find "$TEXMFSYSVAR" -name '*.log' -delete +} + +### TeXLive::TLUtils + +tlutils_info () { + printf '%s\n' "texlive: $*" +} + +tlutils_create_fmtutil () { + # fmtutil.cnf created by install-tl already exists readonly in $texmfdist + # so here we need to *disable* the entries that are not in $fmtutilCnf + # and write the output in the writeable $TEXMFSYSVAR + + local engine fmt line outFile sedExpr + outFile="$TEXMFSYSVAR"/web2c/fmtutil.cnf + + tlutils_info "writing fmtutil.cnf to $outFile" + + while IFS= read -r line ; do + # a line is 'fmt engine ...' or '#! fmt engine ...' + # (see fmtutil.pl::read_fmtutil_file) + line="${line#\#! }" + read -r fmt engine _ <<<"$line" + # if a line for the ($fmt,$engine) pair exists, remove it to avoid + # pointless warnings from fmtutil + sedExpr="$sedExpr /^(#! )?$fmt $engine /d;" + done <<<"$fmtutilCnf" + + # disable all the remaining formats + sedExpr="$sedExpr /^[^#]/{ s/^/#! /p };" + + { + echo "# Generated by nixpkgs" + sed -E -n -e "$sedExpr" "$texmfdist"/web2c/fmtutil.cnf + [[ -z $fmtutilCnf ]] || printf '%s' "$fmtutilCnf" + } >"$outFile" +} + +tlutils_create_updmap () { + # updmap.cfg created by install-tl already exists readonly in $texmfdist + # so here we need to *disable* the entries that are not in $updmapCfg + # and write the output in the writeable $TEXMFSYSVAR + + local line map outFile sedExpr + outFile="$TEXMFSYSVAR"/web2c/updmap.cfg + + tlutils_info "writing updmap.cfg to $outFile" + + while IFS= read -r line ; do + # a line is 'type map' or '#! type map' + # (see fmtutil.pl::read_updmap_file) + read -r _ map <<<"$line" + # if a line for $map exists, remove it to avoid + # pointless warnings from updmap + sedExpr="$sedExpr /^(#! )?[^ ]*Map $map$/d;" + done <<<"$updmapCfg" + + # disable all the remaining font maps + sedExpr="$sedExpr /^[^ ]*Map/{ s/^/#! /p };" + + { + echo "# Generated by nixpkgs" + sed -E -n -e "$sedExpr" "$texmfdist"/web2c/updmap.cfg + [[ -z $updmapCfg ]] || printf '%s' "$updmapCfg" + } >"$outFile" +} + +tlutils__create_config_files () { + # simplified arguments + local header="$1" + local dest="$2" + local prefix="$3" + local lines="$4" + local suffix="$5" + if [[ -z "$header" || -e "$header" ]] ; then + tlutils_info "writing ${dest##*/} to $dest" + { + [[ -z $prefix ]] || printf '%s\n' "$prefix" + [[ ! -e $header ]] || cat "$header" + [[ -z $lines ]] || printf '%s\n' "$lines" + [[ -z $suffix ]] || printf '%s\n' "$suffix" + } >"$dest" + fi +} + +tlutils_create_language_dat () { + tlutils__create_config_files \ + "$texmfdist"/tex/generic/config/language.us \ + "$TEXMFSYSVAR"/tex/generic/config/language.dat \ + '% Generated by nixpkgs' \ + "$languageDat" \ + '' +} + +tlutils_create_language_def () { + tlutils__create_config_files \ + "$texmfdist"/tex/generic/config/language.us.def \ + "$TEXMFSYSVAR"/tex/generic/config/language.def \ + '' \ + "$languageDef" \ + '%%% No changes may be made beyond this point. + +\uselanguage {USenglish} %%% This MUST be the last line of the file.' +} + +tlutils_create_language_lua () { + tlutils__create_config_files \ + "$texmfdist"/tex/generic/config/language.us.lua \ + "$TEXMFSYSVAR"/tex/generic/config/language.dat.lua \ + '-- Generated by nixpkgs' \ + "$languageLua" \ + '}' +} + +tlutils_update_context_cache () { + if [[ -x $out/bin/mtxrun ]] ; then + tlutils_info "setting up ConTeXt cache" + + # temporarily patch mtxrun.lua to generate uuid's deterministically from SOURCE_DATE_EPOCH + mv "$out"/bin/mtxrun.lua{,.orig} + substitute "$out"/bin/mtxrun.lua.orig "$out"/bin/mtxrun.lua \ + --replace-fail 'randomseed(math.initialseed)' "randomseed($SOURCE_DATE_EPOCH)" + + # this is very verbose, save the output for debugging purposes + { + mtxrun --generate + context --luatex --generate + [[ ! -x $out/bin/luajittex ]] || context --luajittex --generate + } >"$TEXMFSYSVAR"/context-cache.log + + mv "$out"/bin/mtxrun.lua{.orig,} + fi +} + +# init variables (export only the ones that are used in the wrappers) +export PATH="$out/bin:$PATH" +TEXMFSYSCONFIG="$out/share/texmf-config" +TEXMFSYSVAR="$out/share/texmf-var" +export TEXMFCNF="$TEXMFSYSVAR/web2c" + +installtl_do_postinst_stuff diff --git a/pkgs/by-name/te/texlive/build-texlive-package.nix b/pkgs/by-name/te/texlive/build-texlive-package.nix new file mode 100644 index 0000000..c5a55cf --- /dev/null +++ b/pkgs/by-name/te/texlive/build-texlive-package.nix @@ -0,0 +1,235 @@ +{ lib +, fetchurl +, runCommand +, writeShellScript + + # script interpreters +, bash +, jdk +, perl +, python3 +, ruby +, snobol4 +, tk + + # TeX Live prerequisites +, texliveBinaries +}: + +/* Convert an attribute set extracted from tlpdb.nix (with the deps attribute + already processed) to a fake multi-output derivation with possible outputs + [ "tex" "texdoc" "texsource" "tlpkg" "out" "man" "info" ] + + The multi-output is emulated as follows: + - the main derivation is a multi-output derivation that builds links to the + containers (tex, texdoc, ...) + - the output attributes are replaced with the actual containers with the + outputSpecified attribute set to true + + In this way, when texlive.withPackages picks an output such as drv.tex, it + receives the actual container, avoiding superfluous dependencies on the other + containers (for instance doc containers). +*/ + +# TODO stabilise a generic interface decoupled from the finer details of the +# translation from texlive.tlpdb to tlpdb.nix +{ pname +, revision +, version ? toString revision +, extraRevision ? "" +, extraVersion ? "" +, sha512 +, mirrors +, fixedHashes ? { } +, postUnpack ? "" +, postFixup ? "" +, stripPrefix ? 1 +, license ? [ ] +, hasHyphens ? false +, hasInfo ? false +, hasManpages ? false +, hasRunfiles ? false +, hasTlpkg ? false +, extraNativeBuildInputs ? [ ] +, ... +}@args: + +let + # common metadata + name = "${pname}-${version}${extraVersion}"; + meta = { + license = map (x: lib.licenses.${x}) license; + # TeX Live packages should not be installed directly into the user profile + outputsToInstall = [ ]; + longDescription = '' + This package cannot be installed directly. Please use `texlive.withPackages`. + ''; + # discourage nix-env from matching this package + priority = 10; + } // lib.optionalAttrs (args ? shortdesc) { + description = args.shortdesc; + }; + + hasBinfiles = args ? binfiles && args.binfiles != [ ]; + hasDocfiles = sha512 ? doc; + hasSource = sha512 ? source; + + # containers that will be built by Hydra + outputs = lib.optional hasBinfiles "out" ++ + lib.optional hasRunfiles "tex" ++ + lib.optional hasDocfiles "texdoc" ++ + # omit building sources, since as far as we know, installing them is not common + # the sources will still be available under drv.texsource + # lib.optional hasSource "texsource" ++ + lib.optional hasTlpkg "tlpkg" ++ + lib.optional hasManpages "man" ++ + lib.optional hasInfo "info"; + outputDrvs = lib.getAttrs outputs containers; + + passthru = { + # metadata + inherit pname; + revision = toString revision + extraRevision; + version = version + extraVersion; + # containers behave like specified outputs + outputSpecified = true; + } // lib.optionalAttrs (args ? deps) { tlDeps = args.deps; } + // lib.optionalAttrs (args ? fontMaps) { inherit (args) fontMaps; } + // lib.optionalAttrs (args ? formats) { inherit (args) formats; } + // lib.optionalAttrs (args ? hyphenPatterns) { inherit (args) hyphenPatterns; } + // lib.optionalAttrs (args ? postactionScript) { inherit (args) postactionScript; } + // lib.optionalAttrs hasSource { inherit (containers) texsource; } + // lib.optionalAttrs (! hasRunfiles) { tex = fakeTeX; }; + + # build run, doc, source, tlpkg containers + mkContainer = tlType: tlOutputName: sha512: + let + fixedHash = fixedHashes.${tlType} or null; # be graceful about missing hashes + # the basename used by upstream (without ".tar.xz" suffix) + # tlpkg is not a true container but a subfolder of the run container + urlName = pname + (lib.optionalString (tlType != "run" && tlType != "tlpkg") ".${tlType}"); + urls = map (up: "${up}/archive/${urlName}.r${toString revision}.tar.xz") mirrors; + container = runCommand "${name}-${tlOutputName}" + ({ + src = fetchurl { inherit urls sha512; }; + inherit passthru; + # save outputName, since fixed output derivations cannot change nor override outputName + inherit meta stripPrefix tlOutputName; + } // lib.optionalAttrs (fixedHash != null) { + outputHash = fixedHash; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }) + ('' + mkdir "$out" + if [[ "$tlOutputName" == "tlpkg" ]]; then + tar -xf "$src" \ + --strip-components=1 \ + -C "$out" --anchored --exclude=tlpkg/tlpobj --keep-old-files \ + tlpkg + else + tar -xf "$src" \ + --strip-components="$stripPrefix" \ + -C "$out" --anchored --exclude=tlpkg --keep-old-files + fi + '' + postUnpack); + in + # remove drv.out to avoid confusing texlive.withPackages + removeAttrs container [ "out" ] + // outputDrvs; + + # find interpreters for the script extensions found in tlpdb + extToInput = { + jar = jdk; + lua = texliveBinaries.luatex; + py = python3; + rb = ruby; + sno = snobol4; + tcl = tk; + texlua = texliveBinaries.luatex; + tlu = texliveBinaries.luatex; + }; + + # fake derivation for resolving dependencies in the absence of a "tex" containers + fakeTeX = passthru + // { inherit meta; tlOutputName = "tex"; } + // outputDrvs; + + containers = rec { + tex = mkContainer "run" "tex" sha512.run; + texdoc = mkContainer "doc" "texdoc" sha512.doc; + texsource = mkContainer "source" "texsource" sha512.source; + tlpkg = mkContainer "tlpkg" "tlpkg" sha512.run; + + # bin container + out = runCommand "${name}" + { + inherit meta; + passthru = passthru // { tlOutputName = "out"; }; + # shebang interpreters + buildInputs = let outName = builtins.replaceStrings [ "-" ] [ "_" ] pname; in + [ + texliveBinaries.core.${outName} or null + texliveBinaries.${pname} or null + texliveBinaries.core-big.${outName} or null + ] + ++ (args.extraBuildInputs or [ ]) ++ [ bash perl ] + ++ (lib.attrVals (args.scriptExts or [ ]) extToInput); + nativeBuildInputs = extraNativeBuildInputs; + # absolute scripts folder + scriptsFolder = lib.optionals (hasRunfiles && tex ? outPath) (map (f: tex.outPath + "/scripts/" + f) (lib.toList args.scriptsFolder or pname)); + # binaries info + inherit (args) binfiles; + binlinks = builtins.attrNames (args.binlinks or { }); + bintargets = builtins.attrValues (args.binlinks or { }); + # build scripts + patchScripts = ./patch-scripts.sed; + makeBinContainers = ./make-bin-containers.sh; + } + '' + . "$makeBinContainers" + ${args.postFixup or ""} + '' // outputDrvs; + + # build man, info containers + man = removeAttrs + (runCommand "${name}-man" + { + inherit meta texdoc; + passthru = passthru // { tlOutputName = "man"; }; + } + '' + mkdir -p "$out"/share + ln -s {"$texdoc"/doc,"$out"/share}/man + '') [ "out" ] // outputDrvs; + + info = removeAttrs + (runCommand "${name}-info" + { + inherit meta texdoc; + passthru = passthru // { tlOutputName = "info"; }; + } + '' + mkdir -p "$out"/share + ln -s {"$texdoc"/doc,"$out"/share}/info + '') [ "out" ] // outputDrvs; + }; +in +if outputs == [ ] then removeAttrs fakeTeX [ "outputSpecified" ] else +runCommand name + { + __structuredAttrs = true; + inherit meta outputDrvs outputs; + passthru = removeAttrs passthru [ "outputSpecified" ]; + + # force output name in case "out" is missing + nativeBuildInputs = lib.optional (! hasBinfiles) + (writeShellScript "force-output.sh" '' + export out="''${${builtins.head outputs}-}" + ''); + } + '' + for outputName in ''${!outputs[@]} ; do + ln -s "''${outputDrvs[$outputName]}" "''${outputs[$outputName]}" + done + '' // outputDrvs diff --git a/pkgs/by-name/te/texlive/combine-wrapper.nix b/pkgs/by-name/te/texlive/combine-wrapper.nix new file mode 100644 index 0000000..165e7a2 --- /dev/null +++ b/pkgs/by-name/te/texlive/combine-wrapper.nix @@ -0,0 +1,42 @@ +# legacy texlive.combine wrapper +{ lib, toTLPkgList, toTLPkgSets, buildTeXEnv }: +args@{ + pkgFilter ? (pkg: pkg.tlType == "run" || pkg.tlType == "bin" || pkg.pname == "core" + || pkg.hasManpages or false) +, extraName ? "combined" +, extraVersion ? "" +, ... +}: +let + pkgSet = removeAttrs args [ "pkgFilter" "extraName" "extraVersion" ]; + + # combine a set of TL packages into a single TL meta-package + combinePkgs = pkgList: lib.catAttrs "pkg" ( + let + # a TeX package used to be an attribute set { pkgs = [ ... ]; ... } where pkgs is a list of derivations + # the derivations make up the TeX package and optionally (for backward compatibility) its dependencies + tlPkgToSets = drv: map ({ tlType, version ? "", outputName ? "", ... }@pkg: { + # outputName required to distinguish among bin.core-big outputs + key = "${pkg.pname or pkg.name}.${tlType}-${version}-${outputName}"; + inherit pkg; + }) (drv.pkgs or (toTLPkgList drv)); + pkgListToSets = lib.concatMap tlPkgToSets; in + builtins.genericClosure { + startSet = pkgListToSets pkgList; + operator = { pkg, ... }: pkgListToSets (pkg.tlDeps or []); + }); + combined = combinePkgs (lib.attrValues pkgSet); + + # convert to specified outputs + tlTypeToOut = { run = "tex"; doc = "texdoc"; source = "texsource"; bin = "out"; tlpkg = "tlpkg"; }; + toSpecified = { tlType, ... }@drv: drv // { outputSpecified = true; tlOutputName = tlTypeToOut.${tlType}; }; + all = lib.filter pkgFilter combined ++ lib.filter (pkg: pkg.tlType == "tlpkg") combined; + converted = builtins.map toSpecified all; +in +buildTeXEnv { + __extraName = extraName; + __extraVersion = extraVersion; + requiredTeXPackages = _: converted; + __combine = true; + __fromCombineWrapper = true; +} diff --git a/pkgs/by-name/te/texlive/default.nix b/pkgs/by-name/te/texlive/default.nix new file mode 100644 index 0000000..e84f89c --- /dev/null +++ b/pkgs/by-name/te/texlive/default.nix @@ -0,0 +1,235 @@ +/* TeX Live user docs + - source: ../../../../../doc/languages-frameworks/texlive.xml + - current html: https://nixos.org/nixpkgs/manual/#sec-language-texlive +*/ +{ lib +#, stdenv +, gcc12Stdenv +, fetchurl, runCommand, writeShellScript, writeText, buildEnv +, callPackage, ghostscript_headless, harfbuzz +, makeWrapper, installShellFiles +, python3, ruby, perl, tk, jdk, bash, snobol4 +, coreutils, findutils, gawk, getopt, gnugrep, gnumake, gnupg, gnused, gzip, html-tidy, ncurses, zip +, libfaketime, asymptote, biber-ms, makeFontsConf +, useFixedHashes ? true +, recurseIntoAttrs +}: +let stdenv = gcc12Stdenv; in +let + # various binaries (compiled) + bin = callPackage ./bin.nix { + ghostscript = ghostscript_headless; + harfbuzz = harfbuzz.override { + withIcu = true; withGraphite2 = true; + }; + inherit useFixedHashes; + tlpdb = overriddenTlpdb; + }; + + tlpdb = import ./tlpdb.nix; + + tlpdbVersion = tlpdb."00texlive.config"; + + # the set of TeX Live packages, collections, and schemes; using upstream naming + overriddenTlpdb = let + overrides = import ./tlpdb-overrides.nix { + inherit + stdenv lib bin tlpdb tlpdbxz tl + installShellFiles + coreutils findutils gawk getopt ghostscript_headless gnugrep + gnumake gnupg gnused gzip html-tidy ncurses perl python3 ruby zip; + }; + in overrides tlpdb; + + version = { + # day of the snapshot being taken + year = "2024"; + month = "03"; + day = "16"; + # TeX Live version + texliveYear = 2023; + # final (historic) release or snapshot + final = true; + }; + + # The tarballs on CTAN mirrors for the current release are constantly + # receiving updates, so we can't use those directly. Stable snapshots + # need to be used instead. Ideally, for the release branches of NixOS we + # should be switching to the tlnet-final versions + # (https://tug.org/historic/). + mirrors = with version; lib.optionals final [ + # tlnet-final snapshot; used when texlive.tlpdb is frozen + # the TeX Live yearly freeze typically happens in mid-March + "http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/${toString texliveYear}/tlnet-final" + "ftp://tug.org/texlive/historic/${toString texliveYear}/tlnet-final" + ] ++ [ + # CTAN mirrors + "https://mirror.ctan.org/systems/texlive/tlnet" + # daily snapshots hosted by one of the texlive release managers; + # used for packages that in the meanwhile have been updated or removed from CTAN + # and for packages that have not reached yet the historic mirrors + # please note that this server is not meant for large scale deployment + # https://tug.org/pipermail/tex-live/2019-November/044456.html + # https://texlive.info/ MUST appear last (see tlpdbxz) + "https://texlive.info/tlnet-archive/${year}/${month}/${day}/tlnet" + ]; + + tlpdbxz = fetchurl { + urls = map (up: "${up}/tlpkg/texlive.tlpdb.xz") + # use last mirror for daily snapshots as texlive.tlpdb.xz changes every day + # TODO make this less hacky + (if version.final then mirrors else [ (lib.last mirrors) ]); + hash = "sha256-w+04GBFDk/P/XvW7T9PotGD0nQslMkV9codca2urNK4="; + }; + + tlpdbNix = runCommand "tlpdb.nix" { + inherit tlpdbxz; + tl2nix = ./tl2nix.sed; + } + '' + xzcat "$tlpdbxz" | sed -rn -f "$tl2nix" | uniq > "$out" + ''; + + # map: name -> fixed-output hash + fixedHashes = lib.optionalAttrs useFixedHashes (import ./fixed-hashes.nix); + + buildTeXLivePackage = import ./build-texlive-package.nix { + inherit lib fetchurl runCommand writeShellScript bash jdk perl python3 ruby snobol4 tk; + texliveBinaries = bin; + }; + + tl = lib.mapAttrs (pname: { revision, extraRevision ? "", ... }@args: + buildTeXLivePackage (args + # NOTE: the fixed naming scheme must match generate-fixed-hashes.nix + // { inherit mirrors pname; fixedHashes = fixedHashes."${pname}-${toString revision}${extraRevision}" or { }; } + // lib.optionalAttrs (args ? deps) { deps = map (n: tl.${n}) (args.deps or [ ]); }) + ) overriddenTlpdb; + + # function for creating a working environment + buildTeXEnv = import ./build-tex-env.nix { + inherit bin tl; + ghostscript = ghostscript_headless; + inherit lib buildEnv libfaketime makeFontsConf makeWrapper runCommand + writeShellScript writeText toTLPkgSets bash perl coreutils gawk gnugrep gnused; + }; + + ### texlive.combine compatibility layer: + # convert TeX packages to { pkgs = [ ... ]; } lists + # respecting specified outputs + toTLPkgList = drv: if drv.outputSpecified or false + then let tlType = drv.tlType or tlOutToType.${drv.tlOutputName or drv.outputName} or null; in + lib.optional (tlType != null) (drv // { inherit tlType; }) + else [ (drv.tex // { tlType = "run"; }) ] ++ + lib.optional (drv ? texdoc) (drv.texdoc // { tlType = "doc"; } // lib.optionalAttrs (drv ? man) { hasManpages = true; }) ++ + lib.optional (drv ? texsource) (drv.texsource // { tlType = "source"; }) ++ + lib.optional (drv ? tlpkg) (drv.tlpkg // { tlType = "tlpkg"; }) ++ + lib.optional (drv ? out) (drv.out // { tlType = "bin"; }); + tlOutToType = { out = "bin"; tex = "run"; texsource = "source"; texdoc = "doc"; tlpkg = "tlpkg"; }; + + # convert { pkgs = [ ... ]; } lists to TeX packages + # possibly more than one, if pkgs is also used to specify dependencies + tlTypeToOut = { run = "tex"; doc = "texdoc"; source = "texsource"; bin = "out"; tlpkg = "tlpkg"; }; + toSpecifiedNV = p: rec { + name = value.tlOutputName; + value = builtins.removeAttrs p [ "pkgs" ] + // { outputSpecified = true; tlOutputName = tlTypeToOut.${p.tlType}; }; + }; + toTLPkgSet = pname: drvs: + let set = lib.listToAttrs (builtins.map toSpecifiedNV drvs); + mainDrv = set.out or set.tex or set.tlpkg or set.texdoc or set.texsource; in + builtins.removeAttrs mainDrv [ "outputSpecified" ]; + toTLPkgSets = { pkgs, ... }: lib.mapAttrsToList toTLPkgSet + (builtins.groupBy (p: p.pname) pkgs); + + # export TeX packages as { pkgs = [ ... ]; } in the top attribute set + allPkgLists = lib.mapAttrs (n: drv: { pkgs = toTLPkgList drv; }) tl; + + # function for creating a working environment from a set of TL packages + # now a legacy wrapper around buildTeXEnv + combine = import ./combine-wrapper.nix { inherit buildTeXEnv lib toTLPkgList toTLPkgSets; }; + + assertions = with lib; + assertMsg (tlpdbVersion.year == version.texliveYear) "TeX Live year in texlive does not match tlpdb.nix, refusing to evaluate" && + assertMsg (tlpdbVersion.frozen == version.final) "TeX Live final status in texlive does not match tlpdb.nix, refusing to evaluate"; + + # Pre-defined evironment packages for TeX Live schemes, + # to make nix-env usage more comfortable and build selected on Hydra. + + # these license lists should be the sorted union of the licenses of the packages the schemes contain. + # The correctness of this collation is tested by tests.texlive.licenses + licenses = with lib.licenses; { + scheme-basic = [ free gfl gpl1Only gpl2Only gpl2Plus knuth lgpl21 lppl1 lppl13c mit ofl publicDomain ]; + scheme-bookpub = [ artistic2 asl20 bsd3 fdl13Only free gfl gpl1Only gpl2Only gpl2Plus knuth lgpl21 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain ]; + scheme-context = [ bsd2 bsd3 cc-by-sa-40 free gfl gfsl gpl1Only gpl2Only gpl2Plus gpl3Only gpl3Plus knuth lgpl2 lgpl21 + lppl1 lppl13c mit ofl publicDomain x11 ]; + scheme-full = [ artistic1-cl8 artistic2 asl20 bsd2 bsd3 bsdOriginal cc-by-10 cc-by-20 cc-by-30 cc-by-40 cc-by-sa-10 cc-by-sa-20 cc-by-sa-30 + cc-by-sa-40 cc0 fdl13Only free gfl gfsl gpl1Only gpl2Only gpl2Plus gpl3Only gpl3Plus isc knuth lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a lppl13c mit + ofl publicDomain x11 ]; + scheme-gust = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-40 cc-by-sa-40 cc0 fdl13Only free gfl gfsl gpl1Only gpl2Only + gpl2Plus gpl3Only gpl3Plus knuth lgpl2 lgpl21 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ]; + scheme-infraonly = [ gpl2Plus lgpl21 ]; + scheme-medium = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-40 cc-by-sa-20 cc-by-sa-30 cc-by-sa-40 cc0 fdl13Only + free gfl gpl1Only gpl2Only gpl2Plus gpl3Only gpl3Plus isc knuth lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a lppl13c mit ofl + publicDomain x11 ]; + scheme-minimal = [ free gpl1Only gpl2Plus knuth lgpl21 lppl1 lppl13c mit ofl publicDomain ]; + scheme-small = [ asl20 cc-by-40 cc-by-sa-40 cc0 fdl13Only free gfl gpl1Only gpl2Only gpl2Plus gpl3Only gpl3Plus knuth + lgpl2 lgpl21 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ]; + scheme-tetex = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-30 cc-by-40 cc-by-sa-10 cc-by-sa-20 cc-by-sa-30 cc-by-sa-40 cc0 fdl13Only free gfl gpl1Only + gpl2Only gpl2Plus gpl3Only gpl3Plus isc knuth lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ]; + }; + + meta = { + description = "TeX Live environment"; + platforms = lib.platforms.all; + maintainers = with lib.maintainers; [ veprbl ]; + license = licenses.scheme-infraonly; + }; + + combined = recurseIntoAttrs ( + lib.genAttrs [ "scheme-basic" "scheme-bookpub" "scheme-context" "scheme-full" "scheme-gust" "scheme-infraonly" + "scheme-medium" "scheme-minimal" "scheme-small" "scheme-tetex" ] + (pname: + (buildTeXEnv { + __extraName = "combined" + lib.removePrefix "scheme" pname; + __extraVersion = with version; if final then "-final" else ".${year}${month}${day}"; + requiredTeXPackages = ps: [ ps.${pname} ]; + # to maintain full backward compatibility, enable texlive.combine behavior + __combine = true; + }).overrideAttrs { + meta = meta // { + description = "TeX Live environment for ${pname}"; + license = licenses.${pname}; + }; + } + ) + ); + + schemes = lib.listToAttrs (map (s: { + name = "texlive" + s; + value = lib.addMetaAttrs { license = licenses.${"scheme-" + (lib.toLower s)}; } (buildTeXEnv { requiredTeXPackages = ps: [ ps.${"scheme-" + (lib.toLower s)} ]; }); + }) [ "Basic" "BookPub" "ConTeXt" "Full" "GUST" "InfraOnly" "Medium" "Minimal" "Small" "TeTeX" ]); + +in + allPkgLists // { + pkgs = tl; + + tlpdb = { + # nested in an attribute set to prevent them from appearing in search + nix = tlpdbNix; + xz = tlpdbxz; + }; + + bin = assert assertions; bin // { + # for backward compatibility + latexindent = tl.latexindent; + }; + + combine = assert assertions; combine; + + combined = assert assertions; combined; + + inherit schemes; + + # convenience alias + withPackages = (buildTeXEnv { }).withPackages; + } diff --git a/pkgs/by-name/te/texlive/fixed-hashes.nix b/pkgs/by-name/te/texlive/fixed-hashes.nix new file mode 100644 index 0000000..33f4bf9 --- /dev/null +++ b/pkgs/by-name/te/texlive/fixed-hashes.nix @@ -0,0 +1,4395 @@ +{ +"12many-15878"={run="1lh034gihn9gmpzf5sz9anrxqlb7qifaasa98dira5vccizs4axd";doc="10f5f3xf2bmrf794ipj5xjsv73j7gqmhgg2fjrdmmsvqij7ljjk4";source="01nldk50shy8ynkcjz0176rzkrjhxssi7x37bd7x1gbw6pd32m3a";}; +"2up-55076"={run="1phamhfskhhyg5s3ab00mv3wsz3wg18j1dskq3x1mpkc5ys9a022";doc="0ijr2gsi7ywp72ydpyj0cyxwv06vc612cpm1inkx8rhnn6hjxbw6";}; +a0poster-54071={run="026ia95qflhgfbd9c32yagm1f08lnr9iyh1l2sd2b0hf5z27z4g8";doc="029mw747qln0xcnwalw2mw8iz5zzarv9qghcwsx9jzhqijmcspg5";}; +a2ping-52964={run="1h9i49m7v83ppifkcr4cncjfkrpx0hs8b11qyjn9s9y4mi8ra0w0";doc="0yxs2va1v4s6picfqkq2k9l7295np46lc35yx1dcmddy2667k3kl";}; +a4wide-20943={run="0jw1d021vrr4f2sv94mw1jk7ma72m84idmq62imwqy23x8nfccy1";doc="03g0vwfdcczgkpbrri3wfhfbrq6r6iljpz5j9rllr2z5svlrjf4d";}; +a5comb-17020={run="00801lhrnv2qkg6ly949csp4ign89cpsbd70fcyb7r7zkd8lxczi";doc="0bz9x4297mpvv082d0qjfvynflrcgj6rn9jikwikpvq8wlhz0fph";}; +aaai-named-52470={run="1xs2iki0v1mh0kbqjxnv9r24bcfmgj6myfw7h368h8g0s1n8d5v6";}; +aalok-61719={run="0mvfl7llr57ykdv81y4c4h0fflig2msvxka08axsjwp91yn8dpmp";doc="1sz26qrydb5dl3z0g3p824f6yzs473p2a50q1kpk4zqgh4ghwigk";source="1crpql5mypbyycxzkckfy4nwn7shq1dkzlbn44lhnj7jyi4qkg3p";}; +aastex-58057={run="0w077r2lsir646ix8n40wy5vy0lnw8vdlw1nmc6fvw2hmrf3w4vi";doc="1rdpiv6rlcbd06flc3rk7a1y3xi899h53r6binbjd0krvrss48s3";}; +abbr-15878={run="1irhcs2zkam6sdl92wk07v5ckg56r6n10hgcjn5im2jpsinsad5k";doc="1z45fraywqqnc0v28jxk3bzv9cndwgs7nmlgbf3b8frr4x18mza6";}; +abc-41157={run="0fxnxavk76gayahflpa8f61j63x9y6aym7gqnmn6xfgggyab4qmd";doc="0ipxihm9jkb5dvlrk217275p7r6amnkbh352k07s7k7i7rjg9pmd";source="0461ci1zg2wq3f9qypwkxmyi0rciv8p2zk9rcajs0591fwz3drj5";}; +abnt-55471={run="0zw8vdmqcb5qddc0rf8qd67fwprwjagzy8s9ildgisb7arqmbj5w";doc="00m174q9gxsm23j3fla7m7lj5fbr7iqfw02dz9s6481nfsjh1wgy";}; +abntex2-49248={run="1q7r2j7c5p1f0gbrc3sjd5gjq2mhljf1nj5n5760snhwj3qblr66";doc="1id5yj5kh0qgjywbiajaf5hf9ix9jq8178fv2kvp1yslra7r20s2";}; +abntexto-68837={run="1yzmq0rkpmg946zpbcmphn70fpjv8a6n29n66q4x164ay3im089w";doc="03n3b9mk9nyxplaj8vhb43i9fnxvcqr4q30jfbgax50qji7lghdy";}; +aboensis-62977={run="171586kjnfg1qb4wi50mrc9jd8h2ybg6r68kwyhgc5y0gyhyg08c";doc="0qc74wvq6ibxgil36wp0b5s66d7m7axbn0y1qpzy9hyrh8v8jpav";}; +abraces-64967={run="0s1aclk85fcda4nf4i8pl3gvr65vghgcmphpwyi8n7im7kia25y2";doc="0h7nyss6gy8r79ny9klpskbh6bf10rp5f67p1x5wklvpmyaz270i";}; +abspos-64465={run="0qzx59dz7x8pn9jr8g15jsmf4hs27v8qc30phi1g5h39i9c6pmg6";doc="1a3li91yvvw2r62dvp87zzzxni3xllrzp38zg6qxfsn6xbwry9zf";source="10dx92msh53z7sn603vsg740wvbhz8hr6bcn1sjs60snl47f4yf5";}; +abstract-15878={run="173bimxd0923191xfjjk7x29j8xs5kxy7ih55l1k6dbj0iwlb9g7";doc="166lhh2vi36qbhc5gm3xx96sigksslzb17bpzncycf0zgkh7j0gi";source="14f2s393nd8q5kb909rj8r15apf48rg6na8yc45z2hl9ksfwx172";}; +abstyles-15878={run="0v4wwf9w542scqx298gcvvngl0ncal0wds5m8h96x9cz7p9wjlph";doc="0zxygi2wfrwlgv9dj69m3v5ily0av65f3qiy9vfpbjlradak48yy";}; +academicons-62622={run="1x8aahfd4ai0a9wgqz1wrj4casmda07xryci0gnmyspha5r8x151";doc="1a3vlc8cxh35vka08q8qz1hc1l2hfk4lkmkrdlnd040im2h6v3wk";}; +accanthis-64844={run="05194iwavl83dqivxahrsb4a952knr7ih0rbzd4d34a6qqf20w62";doc="0jibkv1gv94xzciidm5h7hrslj8qfikjihw3rfzzk6n42a6xbp5a";}; +accents-51497={run="1xl7fkm5gc36mm0bhx7rm9v4g2d9j22gr5fjxjbzmr6byjfgw71k";doc="0il1ccxa2ndnfxn2caz9d4mv39y21rh360lynra7q2v5j1cyqrw5";}; +accessibility-55777={run="0d7xrsdanx7wnnmc983rfy00r4290rigwx5ils6pfm0br2g5kfsr";doc="17gxz1lm39wh2a235wk0s03jc7jxd4bl0iqj04v02m994gz43y3x";source="14av24zcjqxq8v92yni6aj66cblnfzb1f07hbcd3ljbycw14ii44";}; +accfonts-18835={run="10z7c7cgwm62dyzxfnj0jiy328zj3wccqjick37lz641vqifrd4v";doc="17mbr2ydbkc4md6zd34km3d4s2vjmqzfwb2l01n4y30vjz2lzsn1";}; +accsupp-53052={run="156yax2q84naj394xzr8m7hfyl1j7pziw8d6rzkrjjgxs9p9az1j";doc="1ak7xv0hhghgbwmcviirhh1x5y9pb4is8h0a32kdd4hdxjdm7c92";source="0spz8640bdzmirlnc3rwynzvgy5fi58vfs802jzbqxb0ypdg14s7";}; +achemso-69638={run="16si3krcn64nz383y2cpv77fka9xlc5bb568inr3xi0sckwnvd6f";doc="1n7kznrriac60pn7wnlnpm82fxj07gbnrxf7zfv4f8b9vj2x706v";source="1h07bjmbnkk0sr60qd5ml6j78g5hbzvw0pwin2npsd2fxx8q8hfa";}; +acmart-69721={run="1b47751cahm4cphlxa0vnvax69zrxcj1c5i8bmx61s183l7gvw18";doc="0757g2yzqikgfb997m8wd0w9rcqaar872qi7gz3j3sp0dayg6c3w";source="09ly6vm7kjqqqqqk00n843h6pns8bv57za7g95yz0x9s4jqdk774";}; +acmconf-15878={run="17l1kcwv6wk5p752lmanlx0bmh2py4hfxranapgbdrhjpis4jm9i";doc="1vyhkwqg0v3pxjnlwzwnmiffh6b3d9nrwnpaqjm24j9d2sc6cxcx";source="1n8cf6n2fdb88xmnj2m5r3cjz3jlp9n7bn1yr717fsp2ks81pr3f";}; +acro-62925={run="1hzavaicandq6sqz3sy8hj5n3kvkbic34p8id2mslizcw3rmlhhz";doc="05iwf21y45l61fsask04pphxzzjn7h1al8n2wv59jkxyh8vy8dbv";}; +acronym-54758={run="1gq7j83gjzlfbnrnz1cl0lihpdalsn6ww6hqxdfxikm28vynk88g";doc="0zscjwg22s81awq27lhqs14davwbhf5y4zsl9dsq2135rppmmyvv";source="16dds23mj3ha1b64fxz2dnxk7wsrcmhpmpz0zgqda46vaab9qiw9";}; +acroterm-61719={run="0snnpamdf0qqqf3nabl2f4pnabpjxjn949s44lb8wb4lifndyj8d";doc="1ybgfy3x0a3dz5p2gac2w4ai2yc84i28vi6x0bq61ff3v74iqdhc";source="1gja9j0a0v22qqdqy5f3ivrwablrz550gp7nf20054cirjzgr6f2";}; +active-conf-15878={run="1chi30gbr7xjcs7y3p2y8vfg6hany4wbacdm4drha9pa9m5sxqgw";doc="1css89hbdg8zgl7zf2x7vfgbl90x7bjvf0c0m0akjk8fzx936g7k";source="0anxqifjlf96z4vvr031v26s73d1a1sgjp8xv9xxv0kia4l7048n";}; +actuarialangle-67201={run="1cb333pky7vq83gfriza8afy17ag9lm81zr2f3nbjz4vrk7sidqd";doc="0bwyj15r2bf3bqc7y0dbz03bwccwlh9ygcv1frnq6bc758rfksb1";source="169m5msyy0braf61jz721isba94fx5wxinzfsr2yz9hs6ic62dg7";}; +actuarialsymbol-67201={run="0g8vm5wynrlj0764w7l9wfx2zw6ir0hik8nv8djlc96qlp8cm80r";doc="1kqfn2c7rws75yk01962nx2ra94vfh2j8rnfqk7qkip45x7ya172";source="02s6fiv0i0a1jzx4jkbv18rbmnld4gzhv2dfa1gijvzwzr1rpvp2";}; +addfont-58559={run="05a413mb0ksviwbl0y1a14j8y3np5ra5sgjcnbrslrvavf4q2spw";doc="069vk1d1ig38r6a5a87fblq4m429crp79xqccrsk48ixswxafj95";}; +addliga-50912={run="1w9wv0wbv8acc7qvcc5pb5kjxmy2nz95cb990mmgc2lxvvsaw2rl";doc="0q41i3cd16ahpklr1ddmzmfs741x5k30vaz7gz7k8jrf0579nv7w";}; +addlines-49326={run="1rkcpk1c8in0g6dgyc1m6pyz01jbx19gv98jmaiybxgvsa3z11jc";doc="1gaf9ljzkdhwjg460hl79hlwdwi0mrvgs51si8k8gvialng8b1fv";source="1m3l2s1l671n9j7jdsxfljjhrsvh81bayw40v81dm0f68g5hslnf";}; +addtoluatexpath-67821={run="1wzryl229yq1irxpj58qn32l5adhp9sc132y6m46ps283qq6wrin";doc="0xw2bvqdcr761b1i3gh5gg8gfj67sx539hv8jpcdf2scln8zx9bl";}; +adfathesis-26048={run="0j60iq9nzk5kbs12dqx5jk84n14kdlx93mcypwi9b2gn7kyqzn5i";doc="0c6k4xsy0jg95qg45bqk9527kb3k3azyxwpl2zrkw0ld6k47sswz";source="17irbcz9wjnc6rj9f736i2hw4qrjwa1gz5z6w7gvq26b68pkxrw4";}; +adforn-54512={run="1cb6w50xb9wkl6x384dhldrhpjbk5l73x5gzpbm8za4gmh1pc94v";doc="0a1f1rrii1zvd58h2slk2zj032vjqpi480d38rgi2k2j9wlbbyyg";}; +adfsymbols-54512={run="19rr3zdgqlmnrvd61g9bjiqiyn2gpn82fhj4219gqb1l06nqa0ka";doc="059fjvdmd1jgr1flv5181ac3wvby93hyykfshcmr1j06zs8j9kyx";}; +adhocfilelist-29349={run="08fnrvnbrp7534b56hn8w0nm8pbgjli62v34mkalp4qkfb559kh7";doc="1n7nah8vr691k56z0jkgyav4lc8w45rlg8k9shhqhnnpqi8zxv1m";source="1xl0f33yhmbsrnmy9pby092js83vxcdaq2gfny08pjlq57arphr4";}; +adigraph-70427={run="19wzsa84y7a5jbgbyj69frfqd0ahi9ha7sszppsr5bmh88gbnfby";doc="0rr6sbb34d9nd1ni86s5mll5bjx0hinwm52gqiqrwqwkr068djcn";}; +adjmulticol-63320={run="0wjqjg46gbf44f2x0xf58b3f9bxfkrh21m85mh1xsd5pxdy116fl";doc="01r00mf8skd54xgzqjicl4djjzgnf5fdw5hcbf9p5ixx1zw1jq7l";source="1zyq1r0y3amkqch1lif0dygif0sgwhypscqdsqml6ik2ziv2alzi";}; +adjustbox-64967={run="03fqxxhpc41zkj8g7dwd4p3vs9c0qg95c6bdwwgvn3xkaqn6amjm";doc="11mldsmmp1mcd5kya8bh2zmkgl01ysswcia1lips3vjfiqjp8vp8";source="0qzjxslq3bni6iancxix471sl6455syp1pglnn7xa5lxlfl43ccs";}; +adobemapping-66552={run="1yvf74mlmxmnq9m0wvda9xcna8xnn382bbrzizzjm5w7bk8c4g98";}; +adrconv-46817={run="1wx9a00jky9v8xmjhrjlhbl3kcdxh1n9yybpsr74g2vw4bwdyr70";doc="1ny594a3dvx3jba0lf72kjny60ix6hnnw8gj479ccfj3gw2wv0mp";source="1cndbrbw5hss1qi7z9mgymqrcmvlhj8hxw16qjjzch85xw1nrwzg";}; +adtrees-51618={run="1j38apxxk3klabxrm9kpdf6zbmiqb17is5yqgg1a4576n8paqg4y";doc="1851rqb9gs1wf8wl8f7pqbnxgpikzxzw1n5mg5w0kcwd889g17yc";}; +advdate-20538={run="0wgr84y3k10g6622sm11c4m4wxj73vpklf5i5gnp14yamwi19cn8";doc="0hyq7kn10ajqabmz2r363wfpdi71a9zkv6yr30s9lda0vy5vz4k8";}; +advice-69283={run="0p76w2fj14908vfajmsjjv4kh7d77vyd7x24zylgil07p2s1i86d";doc="13hngcgkihzmam4fc4clkb49a4mzy0ip6vxx06b4gykzq8pdvkkh";source="06bfcx1pv400zk5lyz9i8pg4i8kax370jby6s9p10p91wym2p67d";}; +ae-15878={run="1nbhlv1qp7z8j9bhfrljmpjlcrl346z1r7f4hdxijdql0wxs6a8z";doc="1qgq32xw5micjri99zmznmq8gsli6y9fqdi2l7sv530ri9i7kgxk";source="1ljkgb4qj0wa6yxddx4w8w15z0nw5vnyh0cpzc4vwkc0m03xbrm4";}; +aeguill-15878={run="1klri7b3isxwa9lpc2j857y8r9n9x1av865jm93ha6nrwlzqk7a3";doc="09lcp9in9v7vxck9kaql008qmcvba3g8glbm6rr5iag7nn2vbvj6";}; +aesupp-58253={run="10yd16v85zbkzkxb17gr4kf4li28ims33i1zrkpygbdf10nclxcm";doc="1dydcjdz57kn3gwb3pfm4yp6hr69pyqhy5lhm9pnlcrycvqsn8qr";source="1s41gd7ansh80z6mmwwha7pypaxwxxvrz3sdfj24pa5b2agprq68";}; +affilauthor-68996={run="0xrnjg386xpa34l3n26myqkx2cjk06hmj4wnm2yz29kyj4n8fjsh";doc="1d0fss9fniwwn1d8cmvwyjj6fvl5s9jvmgclh6da7pywdw5xgi3q";}; +afm2pl-66186={run="1nbb9lcxqxj2aary7a65fai3hgj4nwzm690iy0xv62v580krdbck";doc="0akl6by43kha3rr9dwnr3hhnnfqg4lqnxv5pqf64cnp17ih47wx0";}; +afparticle-35900={run="0516hjm1v88vk70ggagkj0s00n465y08fr2ys3f2gychrax425a5";doc="1ajpc55z02q8wgriwzzm4f96dmn5bpi9n81zad6kay7c7vwfa9g5";source="03cx2ak956rdwdd5ya49fh81vdwrzq9y813r1h8qcp618sr3h14n";}; +afthesis-15878={run="16jyz1skb9l78dwphggq23jm14zwhycmkx3kn0sm13dcfifrkxpd";doc="091f4flclyahjlxwa640l7vmrfiyb4wqgkh19caq8fld96zkbjir";}; +aguplus-17156={run="0z7mgsm9pa33gykhwzlmpa3shg7ragrz3jdp8qfakp5ck2mbjysh";doc="1105vsng0yramk84pfcg9pvzjbm3cbyp84m6sxr9wadw02z5kj8j";}; +aiaa-15878={run="1z91l7lhi5pnh2ignmskd24asaalhyhdywkl9j6a7dp6cplswhy5";doc="1sz6inilvyaqhnj1z88rws7xwkhhpw35il4ppxw9kn9pwvnrn0vf";source="1lsbfp2zvhpyf1vb1ia9hdz1i796dbfqpndcfy8lay48f89n3njg";}; +aichej-15878={run="1pr92pq3yjsrbax6ah01cqg7131fp2rkqqjnxwcrm4119z2ic0gf";}; +ajl-34016={run="1xkrvy06lw4ngj94zybs14ysal2pg7g71h864gq9bjw0zwq2yjzs";}; +akktex-26055={run="1npcfjjg9nwrb392g8pa4yq6i76aq4ys67zil4qgkf4jyzrixln9";doc="10ma4ic5bazlmizxvwks6w3qqxbbir0rrhzj1yw2j68p0600nmvn";}; +akletter-15878={run="0gigzlxkqmiqz4nwpxj98rcrxmi6yfipf5bifg1mywchnw7a1f2h";doc="0ngj7d4vdnvh99inw2vggqdgx6h2hv5z77glxjcpx8kmxf8h47sv";}; +akshar-56277={run="0g1pbihbpl3b7k7c19qiq7lcgx3zrfn15065dyan85bs8h85c2cw";doc="11a18b7a592sx3wha1lpy659hgh1wnka16zf8m0cbc99f867xfln";source="0g8j0015dm3mhphg06ma9dkgc28ywlihr6pcbi254qaxgk7kdn9g";}; +albatross-69879={run="1qmhrbw7vq1gwd0xg50v384r3bkic4xy32i7sqv1lwrs4fw8aj8x";doc="10wamhwcfh0smmw6q8yf0fh6xms52ckrd45axb56dc4jchdhnpdy";source="11winakpjawrifjxkyfsxa9i1d0k0h4jcchnp61isvl7hy2n2fw5";}; +alchemist-66924={run="14gd0gb86p247bz2x2kcqqj2b0r2lz12gpssfz84kgvrwx5nxkvr";doc="0d8kirmkd1shkbckv32i8yxdrpwzss7qgdn2i06b6mwakisy93v1";}; +alegreya-64384={run="06hrvi0dssva2r253k9ma1vd6ij3bi2d0wsrk2n6fnxvxbl5xc02";doc="04wx39xdvhq0rfl4mz8k70kfv74w6kpyhja5879g0hp3pjfzxbcl";}; +aleph-66203={doc="0b7dihilh2v8qcp4m8fblyc10jc5i4fhpj3pspzinag0pk66b7nb";}; +alertmessage-38055={run="1mj3wiz4fff3ry5q4dk3k0kcx4bcqfwdvgaa9x3vczs746q57dcg";doc="1ga46r20zyb1bq7pvhq4348d2prdshy5m3yx6d00v5zzis1dmx1r";source="0n36cfjgh1byik8zn997lmyz2w4wmz48f5bzqrhcps7bg3kmp4zz";}; +alfaslabone-57452={run="11va28ww6qk97wx8fh0iqbm8b5s14vf923ydpglx4gann4w9bkiz";doc="0wfhd5pi1p5xnkq8lgpp3fhqn8y76h5jp3h5qhlaqygal70fw9kw";}; +alg-15878={run="0lrzrij15s989hy2j9wi1fzkpzvqjfhmgj6ryry0gy7nk3azhhrq";doc="1lgi63jx57arpz688i22razcrzarl96id8xf45vznh8iraba3sja";source="0mjrh4mnx8q9x40vr4csj3h3w7wh3hs8hidbklym29d0scd5rkx6";}; +algobox-67201={run="0xplb7wlbizzy95s4pk1nhl2w1b3g80frkd8p4na2rv7awp0da3d";doc="1bp5b0zr6shhaifkqdliw9qa18ym4s68xfk6k2njjnwdqyrxyd01";source="13cwnl7nxxrs0jsvfrvcy7a5pg8a92qnhxjsbarcx3jmg43d4zp5";}; +algolrevived-56864={run="0qsxy2az8d0sr07mz7yxca17gl1y3kaqmvlckjdckvwq1idh7h0v";doc="10m3rgczhnkalf2f945jwrpwvv9szxh3v4wggl1rdxj12ng0svlq";}; +algorithm2e-44846={run="1iw3yhdk9nk1y41hw1qcpqiqaxadjc0nf6cgb23kd75ah2cpd53n";doc="19xsi1dgxfi06wxls70pvnys20i2na2y7m2hq8y6v947pc5kbb1b";}; +algorithmicx-15878={run="111iyi2j8qnzha97r1grxpcbnfkpvcwndczx043c4gw5wqmrknbj";doc="1rb46zi4islfbykhr68rnrkj4q966papin0c5m752gh6kzx5r57p";}; +algorithms-42428={run="1va2ic75nf0dfh0dr576lpgqhzqv5203frr37079q648871zqav5";doc="0fqif0nb9ypd4sw2i9qsxl81h3g4h0gm0yqq67d5n9wrpic8dnjg";source="14jgc7vnww5xhnd76cwix5c599sfdjil2i916cfpmsd5yn5qqdx3";}; +algpseudocodex-66924={run="0mpnwm97q1i40phy61wiisf4pn71hn0hwc0x0gscn0jalvfx9g5l";doc="112p7zg5rdf0y7iqs74xwblfwxfflg22nb87bdgkbizmsmy2gg2f";}; +algxpar-67495={run="16pbjpr8nnm4s2fz2sdnrlx7mn3bnzhwrijk721gzx81qbq27cw3";doc="0l69rr17b7njp3ywf5xcrnxvixmkswgaydj2bwrvkrazam1gnkdk";}; +aligned-overset-47290={run="04gjl08y9wbv5qls9z2plxx5n4abi4nzd8qik88via4xghhqiy7i";doc="0il97kycqgqqimqjvjhnhc2mxy2nja20vlspsqrl9zaah71p1b3d";source="0zbaa3m06kfkj7kkv6iy71d20n0kqq1dwy63dwfj4l49wv427z08";}; +alkalami-44497={run="1llldpmc485zxlw1k996g3gfffb0ixx72afz3zkj83i78dpx180j";doc="1315idl4yricb06bh689hhdf9jkc0ckmdygacsx3ywzxj1zcrcch";}; +allrunes-42221={run="0xgh3y7h57lkzxrhddn5wll339b4zih4nb6a36ymx38a6md7b8ph";doc="0dki14g1607a432549kly1wcy1p6j63lrxfd3m5nyz868kg3hjmc";source="1d49w7lybkn7sfig7i27mfwaccr9vjs7ab2ds27jmhp5wjl7w02w";}; +almendra-64539={run="1zij84q0ml0zf0dig3hqlmznwygcp8vbmwl3xc5qii7hs94hnjr5";doc="19j6vi1z04j2zbab39934mflx5qnqdjl4gz9n8hbjwlhiq0wb82y";}; +almfixed-35065={run="0qrai75pdkf4py7nhggvwzaarv4jlh04dqsy1b593jabq7ngaap1";doc="0arhvv7z8yf8kcikzybhbsgsj6m9zy4is5ryr6hcf6a6incnkp1d";}; +alnumsec-15878={run="08i891g4b3k1qqicbsgd3h3sy98cpk6g1cfn17g9ysws8k20a0sy";doc="0fanq66cm0r2dgpdrblrhqkchxpy2dxykq1g8zrk5ddx27v6r9pd";source="1ssw0pi7hn3s7pqcqkm36jjgmd5g2x5rqyf2khhdscfwrsjh07a7";}; +alpha-persian-66115={run="0673i0l6vq1h37g9jqcp7am5kl4dfbcrfqp42c7cr6a10zhvfqyr";doc="0cfl47cqpwxn1k87h19a0ggayf6c52sl60sdrmpa7sfydhg9w4qg";}; +alphalph-53087={run="10gkh6nnhsrlqx8b6k3dylings3q97ky4qsv03nk7hn41zkqsyq0";doc="0v36l765s4lc5r2xfi8a3i7vxf79yxy29xy52cbhx4ps0av4dxpi";source="08yagdxgqvhvq50cc7rvb2629g4n2qjga86dpa43x2vjnmmz08vm";}; +alterqcm-59265={run="1mffpja47m40875i3vk3ha4vdgkxha6zh7q7fic7jfddxcdmlf11";doc="0nh7861513mpdspnkd6k6kaydplmimkzh0a19svbblqwxwga78c9";}; +altfont-15878={run="1nrcjmf59r672gmqks8spqwz3vn4jrwc272zvx7ncylphsjmip70";doc="0c5hz0zjcar69w489zz2a04rbnc3j2lp8yccw9zv41ninzl94ifv";source="144m2ph835fl9x3ypc7wfc444719rv4clfdar3bk73gvf53rmjr6";}; +altsubsup-62738={run="00yva44w281zlba1c1m1jz0c1j5bwynfxf37k4sw5am7asxzizvs";doc="0nzc10vbf16bk8v60d97nw02ryl7bd5b6dv26g6rjwfpfdic08pn";source="0kdsv62j78ypa6z9098d60rilk9p0n72628cwihzyp8kv1g05049";}; +amiri-65191={run="1r5zic8x2iny7g2qam8wv640hmxdjyb8694zck5xv65mg1aq2ckx";doc="0sfxafi6qvihr70vspyfqqcdzpfjb8i0m43rlfkgnwfwcgschpxc";}; +amiweb2c-guide-56878={doc="0cxwsx49p3c162ysv0ydyxdncfg8ij9sx2x7c4pvzb0yidvad01c";}; +amnestyreport-69439={run="0hfjwmhhs1whc9i7vr8i1nxqdxvh6bqsylq9sd3cvk4jbbqzbgdr";doc="0p0jmg2mdkc5ada3wsnkbm15an20lgfh27g205q2acr08c0d2zwz";source="0plydqkmzdjyjid35az71baym73zhkyj14514p7n1jh3hmpkvbif";}; +amsaddr-64357={run="1mbbs7r8yf7fnaaizccff12k8valncym1plwik07ajj78vhgfy5h";doc="15abzspjcy683xgmplnr5yxl20phr6176i5hcz0lmnk8d9i5fmza";source="1rcid86j4vjmm54bn6yj09kjyz3v6kfaxv27w0ajndrl60fm826q";}; +amscdx-51532={run="0ncbf7ss4iwyjzp6lgzgzn3azy5iasl03565kgsm1pcbgprqibgy";doc="0nfpbma3cawyy7gw6v0w81maz1jgicb2r4cm5gmlipzxwzl747if";source="0jg2qk0a9y15hl4w753yhjff28w9wc2vbmd564lkikvg60b9yiqi";}; +amscls-55378={run="0k3di45cn0g6v5j7ccgl0nys6ni1h17dkhmkz5b5lsz4zzbi05fi";doc="1lb1q967zwgqn21ix4gxbzw8a8649p9hky4ckd61l0bxxil3mhjd";source="0g1i4nj0y32sihf7hnb8jwyh3d3qmff394xgw8v8x5jp8q0rh2bh";}; +amscls-doc-46110={doc="0allim05cp20zhn480df2mivd3p9gnc069d7hbjlzv660bw7mapx";}; +amsfonts-61937={run="0l3ypclhv5qdpcpy29xwda2m3cjfn5l996agas6yhpdr2m58q211";doc="1v7chx5rvvqmcf7j35qi55wxwxkbfkbv34b15yrgn6bflniziicm";source="064gndy9lnmsq2srw5hh97sbdk8gk0qv9zzki00ms3c6rzhd9sjl";}; +amslatex-primer-28980={doc="1kzayyh1bycmq43s2xn81jf05r18azidbk3gv6igf2vaq37fmxil";}; +amsldoc-it-45662={doc="0d4hwb7hywy56d6934448lcr6fdx7qchkfzs806dr7wfzfy36yix";}; +amsldoc-vn-21855={doc="1iz0zjn1v7izwbsq0zb6cvpnkbvk0nxw1b24j7dzqwk3m9j43i6x";}; +amsmath-68720={run="1igdsg0i32hi2db8ymdgvyd3fk4iiihspvcc5azw11fak9wvh7mi";doc="1kv670h72jl64cjfidk0h82whf24xhcl8vsrpppw6w5rx252zzfz";source="1k3lwg72h4z0gyj9azr2b7b78x1q5h85675mfam2qdl3iljnaryh";}; +amsmath-it-22930={doc="0xcwsk8q9q3nsz8wbklgpbw0vzjw7iw0chffzcbp2zsk6rypqf7w";}; +amsrefs-61937={run="015spycf9ycxav8r046yn7lrc892nhkkrf1say1yy9karsji6dnw";doc="11fc87kbdm440v4qyhxnv654mh0m6rpz42zji38qspcqj19rck71";source="02q2x8zpwxkyrh9v7xqw35vdjx0b4fzz95xcv6vfjmynm8cpklxf";}; +amstex-67930={run="0l078b9fkaai7kn2szn5hblqp3amlafr7ha0hjcn48657wsjq4jb";doc="0j6gfbkx8vfalsxq3c4fyjs0fj43a2n8biwainfdmxrhixapwc0w";}; +amsthdoc-it-45662={doc="0ic88gs89m3d9ys40c4k7sgx6wy82c8isg2qkmd4snw5yms6fpaz";}; +andika-64540={run="1bbqdw8r2l53q9870mnsyaiq0gfy1ac808qqmyrzqqz4ai41zzgg";doc="0ajjaqdfxlvsmpr9bjmdkzwbdbz6ahxfw1sj1sw26r33npy0c5bs";}; +animate-67401={run="19rq0pca3q8kv1f3qf02n75326ngjxjhk4hcllzsl5p1ngh4vw8b";doc="0x991qbaf5n8bv95yc1k67rjas896ci0iki62yl7icfbmcbz5hd2";source="04bblj8wxx9xg8zr6b8jzll5v69vdiz3yzxcdcm93j6zsxvw7bai";}; +annee-scolaire-55988={run="0lwc36v09a4ji5fz3pq9939jm39729k0k7hha4kkk20jc3j4jnds";doc="1f0qc5qvsrnjddp1kyrcigd8is2y9nsxc9x8a215p5xds2z5gc30";source="01mga2nif61mpkf7ifzhsj5pq7wzm2imlljap4c6wcrzb9zlhfx1";}; +annotate-52824={run="12q3xk08ycz57vsrcr2glk7y48w8sbc4n8lrqaicd46cxfd4jdqm";}; +annotate-equations-67044={run="0lqi4b3fkx9bijs2ddq479bkdf147rr7j4zwinygs2k1fh07yjma";doc="10b54pcdjl4ca36wrqc1pcxa7vp02f1v5i05a40iawfc884wpcvq";}; +anonchap-17049={run="0nz53v74sigvlb4dhgk5qcalw7nrc1vafbjx754j3gfyp2ilaf1j";doc="06khbq6p3drxsbjwgkm1sd163f7nl8hc52pjsm55g2vknib5caa9";}; +anonymous-acm-55121={run="0blyv8pj41qa3fvhwsk9kq8qwp8x0b1iz7vyc3lxcpcv626aqr2h";doc="1j0fhwv26ziw6rvg1s2x0ry5yq2sfa8a55xvpyrzl6pjmzrj3czm";}; +anonymouspro-51631={run="1qk10w52722yzlyvk2k733sp1h2vic3rjcswkhx8j21a2g9xgmjh";doc="0ijsn9cbkg1f29x0pj6a4p5d4q14rqrh2mjid57cb9qjhvgvqrm8";source="0fl9sd9adhjx49hja3k4iy9pcx3hal0wjzxg10kjmi4j6qvz829s";}; +answers-35032={run="18s0c7hdk5qnj3svni93m9lpj81dhla9v7nsmcgh0jabhwy8n3v2";doc="02pfg28dz10w21ap4pi2csvy32pcvmp0baiciavp354ky4avjbdd";source="0mcczai8da24jvmakc7glr2c56yhq2jv58y1xqv6ny9hg4ph8v61";}; +antanilipsum-55250={run="0xz42icnw36dvkxlh31g8hvy37mrbafgihm7l3ivh1z4hg6gabrh";doc="1rfx3aqdvl4gvcrpsqzjh9dglk34ll6qc1a889yz0np93psnwmkh";source="02qpjks29b4fmma6qm43p3w1k8h28wv1blpwjnnsfq4ii6xrkn5s";}; +antiqua-24266={run="16pb6v297iqx09lb6w6zfcyzhwidd1cln14rqc3fblbmdaggpays";doc="0pwyp1j02zh51crp46rlhbdnwc2m0blcrg0yk43yfc687q3jx91y";}; +antique-spanish-units-69568={doc="09w95jv60qy5fc8b121f69b2bj8gj9cqz77x4rgp68xpnm125y0z";}; +antomega-21933={run="08if5plzpj7g8m1afhq8ci6m4yba4nnsgglngq94ka3ga8czfk6g";doc="1mrr1vqkyic5nyzyxkw7zq67yz4njx9x68cqr3vjd9d77qv85i00";source="0s0dzmb00hqbp71nhl94w0ns1dqj5fmfqw63z789iihqznyxkii0";}; +antt-18651={run="1clzmvpglsirsvm8nsc3m4dkz2va90877gmsrm7jfkhm62xv9mpi";doc="0kpiba7awkrjr2rdgxilni1yi8p4ycmqyy09c1p9j1ld82idsjcm";}; +anufinalexam-26053={doc="1v1k74vxidgxn5zzqz6v9zga468kcf7hwdrnvw44cd318221y396";}; +anyfontsize-17050={run="08dnpzjajn0k6hrf12l1p3ncsqjiwafzssa205k2zgsz61m3sis6";doc="0zmiklc2adbx5klyyjdivicd5j19i35b51ddm3nhfrcqrfvjrxwg";}; +anysize-15878={run="0kkjzsk03bvnap54gdf0i797zqq6bdz39yh4dn810l5hyfqxbhwc";doc="15z3sa1zj1hbi7cy9q9wn4mcrf0pb3n39q2lhkx0ijhzaxn0rmvy";}; +aobs-tikz-32662={run="0fiq64szq6243gy7vg99gi9zhz5c0svrwjwj92qnv131zj71lcg8";doc="0yy2nlq6d6q5cijdswkn3b1f2a3j5sbl3fdv599vxna5pgywsw6s";source="1dj665gs9cbx3mf3nqr0944kg59gwg43ll1dz9ci3jra0nsr8w5q";}; +aomart-63442={run="1x69rs1k0zxkqwqsyjmzkwrxiy1hdsd32dvx7ha668l9wbq7582q";doc="0nhj05cm7fsi6fpp2wq2p119y0wyk2ag070lnjj3ri1zjahx5yj2";source="1d6mpqd07fayx5g8kz8937jyj6c6rbw1g8w1amq5sb32215c7q2r";}; +apa-54080={run="0g7y5l9908l4aikm0mqgwfcdg19dbllcgdp94cl1aha7h4jq0971";doc="0bzicm0x6sf78jbrqp66mgfjmcd7kw0rgkv0c6ah9945b9lh4ly5";}; +apa6-67848={run="1zhm599xqx1j8yqjp20xgafm5xdnsjdh8pz1xndjhlqdxnv60044";doc="01iv078nfv3ilh8yjkf2r9c9kyn7lxxad8vl0lb4gvi706p3npnr";source="1g987ikxqvl0b1zkf5kvwg9dzy7c4k1rv9cl4r8ssdfm9bq7fvwl";}; +apa6e-23350={run="1da46dhvpwmjvm3ma4zbnfgsc2yiqg9d6rdrw3bd5h2ibs3vnlmg";doc="17m97m9v0pcs58i3k7sdj9h1vifv3f0cxxyn4fzi8pxvzljwl5qm";source="1155ic0k6f6gw6zmqq8pv74hcn45skjzyarf9vpkcksj96qr07ba";}; +apa7-63974={run="1y286f7vyvgnyspp0vzagf8xc81b02029zn40ggh5bhhysq06wzf";doc="0z8jfr76r9rvqanljhq0fnx5z2w59lxk2mc9if6z7kkid1m8qx8m";source="0xx3yvjknqsk36mb336hlvvsldhmp21vblgzl2zccp347g5530z1";}; +apacite-54080={run="013769hi9alyizx08a0v1hbl03h5vkwi6a6ar3ghw8m6l445xb8m";doc="0d49bmdiiriklmh99kavvm48zh29bgiw7zr5jbcwk5bw42qarlqa";source="0hsrhw50sb8lphxib4jmjgplfrmy95m56a1phiac4kwxphlj9di2";}; +apalike-ejor-59667={run="1498dg6dcb5d5vndc794427740i6n1s68kwj9vzcpfpgb67khpfz";doc="0x6gm4djf2bfs92zsjzmj41dvv7pa2lawycjlmazsr55dd3assdd";}; +apalike-german-65403={run="0cv9dqn4nrsdx2cl7r6xrg3j8h16ni938q6xdl7s80cpff79m7vg";doc="0pbx2ghz7f67c3cbpk5c11nv9pkx9paq2hgadnlz1j68g71b07fv";}; +apalike2-54080={run="0mn84ahwjg8gvw5lifvcrnch11q79d4bgw3nmhrh4v8slwgip5l7";}; +apnum-47510={run="0qqm8np0jr2q3dyxapd49g35vk6ch3k9ar43yq740cfa7gs23ss7";doc="1jjk8a2aif4f7gmbj5laph0q60xpb0yv26j22z4ay2p6yf6a4fy5";}; +appendix-53718={run="1xcnin7414mb1jvgs7f1x27zkl73sabmqb31i79n88gi245bp5lz";doc="144hblxkrfp8g040yiw1k7nr3anqb80pd9c2g15m88gbb1xzyay7";source="10gnkpwvm08zqwi83s4xiqshp93v5ai0qg22n7zcwgaq86mzs44w";}; +appendixnumberbeamer-46317={run="198sc0fmnx7b31j2mgzjbjyjjfsn0imw2j8pkg8m0r2rlphqx72x";doc="1b1rwcxrs8cm3zfadi9jpxgzcgai36rlnfragc9l5wcbdsaw1qp2";}; +apprendre-a-programmer-en-tex-57179={doc="05779lk9v849k712wfjv0mhyzahwpl4n892ydamfdc5yg05bsnyv";}; +apprends-latex-19306={doc="1xzy7svb2xz6bdfg0f1r3whwda118pl7qdwygx1l7h4d1vqm2rcq";}; +apptools-28400={run="0b6yzpk2d79qg2irgfhns0w05i54z5z22ik5yyx4w6wg45v0j389";doc="1n8ak9cw66780zkk384vpjkxm9j8f9dzlqzshy48q7hhprsg4p9a";source="1ba08rixibjcpi420blw8a0v4c4zi2byll7dqlvwb7azqr6dz720";}; +apxproof-64715={run="1v42g8hr93afz1lr1hbvycgws92vg6pzig1qqjmrpff11irwfa0h";doc="1043sl948r89fzgzxwn6n4sjs1jl7mxr12hq9y4ljgm6264kw0d9";source="0wr9vjn9vmljsx5gyccjzcqwx86hza7idrq84f7b9jl1miwgddbn";}; +arabi-44662={run="0jmx0xsb3hz5i25mmqnxgg3bikyr1w26i3364cqrp50x9sqvkgfm";doc="1yipdaiai9fbmrxkacqwnbibdiaa5vskzj40d1hxv6wnkxvj2qkw";}; +arabi-add-67573={run="1ylvj2w98dly6blpk2aicz206rfg5xzqbcjx00j3jnmw7g847kxh";doc="1d1wngc0179p7ij7ibnyvq3cxb954sqywxyv5k7a3dg5np9zlg7j";}; +arabic-book-59594={run="0s7hnmz67hzfmfzc0mniiqfi6i8c8qzslbm92z1wc3a2hr38ihk2";doc="1j5h788vsmrcag9bighp6kz6zx40ppjzwfa070ic140lqzz2b024";}; +arabicfront-51474={run="16426cyvrk461z9jb728w6glfm0ahss82kkq6fqkhajjc0cflhwi";doc="0ck7nl7v6kvibiahh3szf3nbibwajg2pjwrbcz06frpfwhizsnp4";}; +arabluatex-67201={run="1s66v0qns84vhpwvb9if07b9s7957jmxxd643g1mddg36z6pkqfj";doc="1rfwl55la33ag9plqwssjvgq47mab2h7ljrw5w6l96vq965c2csa";source="1g84xxm5fvp6dzdrkyxcjn4wlih0iydrdyxn93dffx1a9n1c3yyg";}; +arabtex-64260={run="0xd2apd35zn1c4narj2gyla154nzd9ghhgc3fkk6y06d8dzgawv3";doc="1zyyk778384mhma5q7ra75fwykk23i63q4jzamq4zard0y7gp4k0";}; +arabxetex-38299={run="15c8nmmv87x87dbjwm1q0acf7pbbh8w9gpiw77fs2i51gab592xy";doc="1ns1y2lf87gspaablh4lm3kj33ggpfp7hcxbdv4vxf8hhfc4pp7d";source="077r71723zlzfjmc471a8hbxs1v2g6j2xpiim3g2klxsj589bxfn";}; +aramaic-serto-30042={run="0j1i5snrgj579zx3cn7z7dhi9rrq0ssl392r2vxykcxalcc8cmg2";doc="025nkiqh91laaj3yx2qkl5z0jcm2w0qwgqm545dd98i5y1a78lfx";}; +arara-69878={run="1vcvhpb6wd8k9fzyq2pxxyd23p15w6n57rmw09f745l0kg9gcd48";doc="1ln5z77slqmlks5507n5cg5d6pw1vnghapjwagw1bsc8cirw9z3a";source="0109zb2h6r00d9849sdm1k138j2a6z81s4bcap0llz7qq7qs8swd";}; +archaeologie-68476={run="0r2j9n7vbdj7virnmasqi9md81wbc5b53h0xwf4d6azh0isy0505";doc="1xhlp6x1ixqn5xj0k9xz5149jwf9zgp3nlv0ncyjn5nzqkky0jyr";source="13wmghwrc89g8kmsdsqjfcklbindkrc63by2zlgig29rvidzn4lj";}; +archaic-38005={run="030a281kl48ixl4vh378bf0341lrrpvh73ws5pjxyhvs6cvyxp7i";doc="0m64lsmx3sryzdmbsmz7biwmndpn66x9is8apqn7w64y4b1jjcpk";source="1231mqascj96yi4jj11p4zcxgkpzxi3p0zxnjq8x5fpajz386kq5";}; +archivo-57283={run="19hr6vc7x9csjjd3i6mz9z27cyq4pz1qvhmiwbql2xhvmbcd871q";doc="00cs206zp27vpw06wqg7adwj73124zbp8zwfvgqsh9n544npvfmg";}; +arcs-15878={run="0qahab6a041wn6s6isnjn93yrs6zk82g90x5aqpv742b2y8cj5ix";doc="05wgq5pkzxg3vj9anlzjq1jvwj7b6wvsp7a02syca6n4qvy1v5a7";source="0jnvkhhcqv7qgs4knwx1kz38x305a19kh13wn47zqlqn65991bpp";}; +arev-15878={run="1nx33blp0nfqfmv2akj7w79qg1rhds40k7b58v5yvyrkx0hpn0hm";doc="1vscwahxzdcb6879pbrxdlfpgapc0bia2fl3jwilrm1has0ffjz3";source="1k524nfr5zb0nmhhq8dfaha4kv9f2ika192scllnn1bywhbpn2x5";}; +argumentation-69023={run="0pnr7z8by62zi1d8qbjmmddlykrkhhisqx4n8lhwbvi3qcrj48gi";doc="0mms537p669wa0v301g51sgigzxdg49rj3kg8i3rva22hm3b7fj1";}; +arimo-68950={run="0idfg33qcggv0cmh1hzpvzz690yikpmi76xpfh19py168my01mnm";doc="1yx6lp3w6s6zz31cd8hvhk4vdg2whzh62cdlhyglnb90a8hjyis4";}; +armtex-69418={run="0cj112jisym4zyrjb1g4y9ryyiaj6smsglmmq8zj9xkr2hfpw46g";doc="1xdl1alazbmma8sddkfl1vcm1qpk0agg1dbkimnbniiw2xdx5swp";}; +around-the-bend-15878={doc="00nc6kx4ylz9g6vmjlgyjvmy1ls86pjblbcpm5z40wh5xl7l184f";}; +arphic-15878={run="04a15kip51zp4bhrbpiv4m5pm587xbia792ckj17gj281ysd4817";doc="1z1z7nnncp4dpb91bajxf3li47k011jn5jbxzgdaspa5mjvw32k8";}; +arphic-ttf-42675={run="1z8fa90baasp8j8539a4kzilah602lik012az7i3pc0dnm4m2w1h";doc="0nfbjnprd71dwp2dxmkmdggfipa36w4qbps82czn506xpzh07lav";}; +arraycols-68277={run="1dgqrznjh5irbcic6dscq1xl3gyfvg3dnrps0ki1ypq24cm2cqyx";doc="122iwnlyci7mkvzglzrbl5xycm8rl9zp8yrhb3ky92hqqv1ywi88";source="18kzw3c2gja12808d4k7vr55p39rjs960fv9mmmpld4azw2f7c0q";}; +arrayjobx-18125={run="1ry1gix4nz11kyrfpbhy160c8dir2y68jbmnds64qcdafhfv4b9m";doc="1hqjhkjh5ryhjpi98hyi92raffmish9n9193ry75mgfx1p2b2w0g";}; +arraysort-31576={run="00wbmciwdnafwknxxrnprxj4xvs24xxwdwmn5y5xh1c8c3q8rn09";doc="1yn9kbq8icd5gxix4kzp0qszhg1xy59s4m8p66a88h3cwcs7fjba";source="08gbn5s8c7a8klg605kalr2mdpijy73pxvfsndaw9jdnr9ipc5my";}; +arsclassica-45656={run="13fql9q89zkdhid841hwxyrdbj6bd692lnc52d0yiibrd9gd9f4a";doc="13cqb49296wzph7msrhpzswlyknvhrjaa81509l4j4mx1snxyk4b";}; +arsenal-68191={run="1pc8k3zslxla2ngz29389l4n9ahcbp2m4blydpg2bz0qhs0zqapb";doc="1y86inslxi4y33qc5p7x3gbx3n4d99n3dpzq0ap9ikrdcxgwd0ds";source="07i8ynjbr0w8kp1f3pm65hnx766kxp2bqdps1ln0qyzhk2iidppg";}; +articleingud-38741={run="1ydj9dysf2qgk36ssp8pdr4c6dh5iw27kcw4ykzkx22ih5an0n01";doc="0mkv9fq0hixkjf40la5na4dh0yqi3adgr8fyi1x74sbyi78gmfhn";source="1h1w0fxa1cyw5d943mg8na7hxwyq2ki40gql9y0f7fdx31faiavv";}; +arvo-57213={run="0i9x668hjr2b6brdysl35rxgjji1zdsn6wbf21ql0xmn53frk4ic";doc="0g4lpx8mra2qk9c1qwijilscq48n5n252m6s0hxfraj5rshrhc1j";}; +arydshln-50084={run="1f2y02l7fkhrc005ib1s94z0yxgql2m515zy3mlx6ba4mqadh9c8";doc="0xw13bdw67n2nsahi85bvh5p1xrd8fpb1aj79vss9zgdslzb6j4s";source="1xhnh7jw0sxy6vkw31gcxyxg06dm7bgw0njsfkailbxgndwcp6zs";}; +asaetr-15878={run="05ff3l9qhk7bc2k2kk0acpyy4fxdfh3crngj7lgnvwbxa5wh8dn2";doc="0whp9d9pas44j775i4vn7zh5ss0yr4q5vbx51kz768zwgs5x8222";}; +asana-math-59629={run="1776yxdxk83540gwr0qxk3qs7yfv4vysxyvcwx1djhd1vrwhkzh6";doc="17bb9m4fsmrhbk1hbqyynkvlzgcq45lkg68kf56zs2c00dxcdhp1";}; +asapsym-40201={run="1m4ky7x5pavf8kpyqrjqa5ara2iwzqc3aglvbsjblny7n2az3dr4";doc="07n000aa7yjvx74vspqq1rrqw444z3f9pkwk3hdmmqm3p1rrw912";source="0cacvd85rh2j0j6d1zjrisffwyzh0pphzsgb5bxfq3dzycsww0iw";}; +ascelike-29129={run="039w1lm3bpfrrb5inrmzklmr9yic7x1fs0lpjl8z49mijvqsv1df";doc="1hb732idc36m86qgss7wwsyqj6zgirh9qvf7ybpmqz6arwsml46j";}; +ascii-chart-20536={doc="1m2x7iwz80plq6hbhp9xia6bp8wbi03iifs0pkr7ji3gn8hqgh1r";}; +ascii-font-29989={run="190ma5qhshn71vhsjzjb2gxb54qjabili5m9v98vwj173sdj9cjv";doc="0nrnfvrcgwmv46x8f9ybk1gv6vgv8jgzhc8480fl7y17dii3jl9a";source="0xcv04inym8230k2ljb16g4ajj73gggg13w6zkxxq8a1fa9lwrw7";}; +asciilist-49060={run="0ni7182xwr3ns1dk8i75kf1cw9wpfagrf1y7w20hk8fpfymx2669";doc="11gyi8mcqvfpn07f4cypv05f77vhzr44zn6y1idlbz4mgzjw3kp6";source="07k13s9y5nvbp7w1ylyj3mlpn80682yhxgf27hz9aayk3hs77d58";}; +ascmac-53411={run="18hw5yyqbr8ji39y39293z7a70czipzw00fzfsqcrhgdlid79sc0";doc="0xzwc7kw7hqpcmisw5wm3n508n4zr4s207pizdhfm2q9mjij0jvr";source="1rd5qmy9miximwv1n96h6djjmd3mdgn4b0955marf2k457bb71d2";}; +askinclude-54725={run="0s1938harm9sgna3cggllpa1g85yl9jv2wy4b4c5v6fksiivxzs1";doc="0gkbk6j2wv05kgfbjd4mqx5k7rc22bmqn47vk7pvr5z60dr4nay5";source="067dpl3v0ipspfm5f2fmcmg5cb6lhqg6n8216id9j1blir1ys3mg";}; +askmaps-56730={run="1r6lk9szs7jm57b4hl9w4ngb9dqcsi6pvp37rcnwnznj5m2daj50";doc="1ryw8yy59mfi13rrwgrfg5y5dy3cafz2a3f8zmq5fbl7zhbylq6p";}; +asmeconf-69742={run="155l5aw8lg2krmpvhb0vl7y8lf7n1mgd2x4vpbx8dhji5laxdxl8";doc="16dwxl3ay2p1vnqh9z946aypapb2r984p5g861rhxm511wm3h2hk";}; +asmejour-69722={run="0km4df99jkm270frhsf11zwrsv2h0c7sbfkyikfvjvr5pxvsdhga";doc="1br007g5m7wsrrk6xn2b03kfpmlcxzazyijghsnqx1sfn4hxf84l";}; +aspectratio-25243={run="17y22131b9nzzq1skfdyr7cfcq823nqn3ssqrbc3bglggdfibf2p";doc="0mw7v1m9afyk462rjcimvwwikdpj0f4gjw5pbw2g9c60vbjhz61j";}; +assignment-20431={run="1nxgpadadzf3d30ydc9rndwm4v53s4v10a6sbqf6yfqds7ry13vz";doc="1wyyvay22r68hfspaqv0a43s9icg8a3pj8wii3snn90svbsjfajn";}; +assoccnt-38497={run="0im3x8im6kkjmvibh57hkn8nljcfc4mzp0hpimiqn29ys1yrhj98";doc="11p081b0b6mcigqsmvgf6kc9ik2480c74madjli19rw9i5nzf0vf";}; +association-matrix-64845={run="0pa2js62lrqvh9ghhv5gylaz7jxbh6qwkfymr3z99w1isl2iazlz";doc="00va77pg2xzf59757sdq7ql7lkik3ifhf1l74lljmimqvql6zj0i";}; +asternote-63838={run="0a3a5jjhsbvi7kdkp98kwa0q8j9chrq5azfg9vbb4m9kfkbafafh";doc="1xz9p6g5bl3qa957icsyjknni7bvglfhvxfvxg83x8bd7hvh7ylh";}; +astro-15878={run="0cjf53gbin9z10g63x2kingsclgnwr6idc4x0m473hf4fvakk34x";doc="07kad1fzv7p6inh7nkrq6b34c1792h4v49rxaaxqyldmf4pwjr84";}; +asyfig-17512={run="0zy0vxxmzg7nzwzw8z84sym5wdfbs7kyf06r6vnn05ga06wwn603";doc="03nby6d7cjczj3irqql5wpxs4fx9z77bb03lys5j1kg63ccq5msp";source="1rzicq0w7byrxqvv8pympxkwq575zqs01s02z205azaqdgrzdhss";}; +asymptote-70583={run="0x9zb9jgxc31xj5a5gb3s2ba7348zni3p1pwwd1lp7ldilq76lca";doc="0hcv17l67pv91fc3nrhx06s7z2g0imrljx0lxi4k6lgnj47dmnhg";}; +asymptote-by-example-zh-cn-15878={doc="0854pbh3rm21rzzbhai7xijzw26qawffj4wd3mrwbva1406106ff";}; +asymptote-faq-zh-cn-15878={doc="0z09f5as68dz66dlj370xfx593bv50ihxx10zxmm9lk27ymr52hb";}; +asymptote-manual-zh-cn-15878={doc="047l3bh8vvk185wkazyfw4dm6893xpa2ksn5vfc57r5rv4x16wmb";}; +asypictureb-33490={run="1ls5ryz8c68liyyyqkjvmzyyblh9m8c5b62igz8frrj4m5vhi3aa";doc="03d4l74m9qwjvl71xfkhspf0d2xaafl9d2kcqhmil5yg85hsq069";source="1jzpagmnv21k761r52m2f708275k4pwa9sqlp88l6pgv6s6p4pab";}; +atbegshi-53051={run="00r3ayn5qa2p2j4hyxbp2mm1aqhbkjpwk15gan1b4szmm2wk54h5";doc="1pjfmnrssaw20sdq801x9jb9qh7s8l2mnhcvla4bxglckgwz2na9";source="0b0sxs3jpc6a9pw1z44iv2bwvyxm02yfl8j0mc5qw0asdp773vrg";}; +atenddvi-56922={run="1lw42kgkviwh5gl0fnc4kp8x578bss6fj4d3jqp3jh0iqj53wwf4";doc="1f4210s4llsbgnnf6s91j7gpdajclscnqlkrmrsmiphhvgjihcws";source="11sxy0c5vmbf17w1h46dc033lisp4aa8sjqfi1zdzlp7ha4c6rr3";}; +atendofenv-62164={run="0r5y45wzyhynl6f1bsk11ha50rhzidjgqynpz0qqx55pwj1lvqg8";doc="15s783gvnj5vd7vhgvzvvxpszsy065x20ag5i3kmhd20rdm8sy6y";source="1j1z580b9v2w8b1zqjan8fi5smnyyagnhak262cx5fi212dzivnl";}; +atkinson-64385={run="1gcvnnj9f7vrf96lb6yyv8036xjd52099h4sbs3lhprbdb8gznrf";doc="1k994x0xmc4kl69qabrwh3x5rwipz77c730834bnv98annnbjrwq";}; +attachfile-42099={run="0akvm9al5rz67b81bsl0k92gjqwxjrd6dwxj9qmwrb9c6pd311n8";doc="169kh9zrf5ykal633zn8n3i41dqbyv7jdrm905a7q47icvd4ar03";source="1b9s69vvclpvdm02gi9x7zv5mf77q68xv7zd784cldns8h1a553l";}; +attachfile2-69505={run="0gljjngawrnb2825490clcvj84gx0vlxk3g7i6qxnrafbzx4b8g3";doc="0kcn77x16pa0kchcygviy3if7qqzqx5w6qq3p91b3zz39cxcxn09";source="0rhh83mjva074c3q2rqjc67r6z1any4ffxkd1y0mbhx879j9wn78";}; +atveryend-53108={run="06q5b28q5m9i29yqqx1l1y0vjc20i0n6p2k47z66jf3s6abrqnrj";doc="1nn08cfh3n63xd45rkmzvdmf5580lm7kfd08z9gawgaibh6nii80";source="0fgzxwc6jlijf0mzjh7pm2afd85np1rwy4xziz26s0gi6i5pdmvp";}; +aucklandthesis-51323={run="1zlsa80vbby0jp46jicygq2fn64f1mgppbw6bq4qm9ncsapdz92j";doc="09n2pdviw6xvh9ymka32pyscn16vgcxbij79nq0hxn6b6msxnlq1";}; +augie-61719={run="08m2n7wqqj1pvvrw6q8j514mgr1168brckm1dl44yp78afgm6vra";doc="0ygmvlk1h6n071lq8jnlpdqaxhcxvwrzf1kgvacj78kijaqd0lix";}; +auncial-new-62977={run="0nqz71wdm0w34xdg5p34ph6na12jlvxz7v1bfigjm2v87pbn5lwz";doc="1dw0gbhk3hwfapdzysf12kz5g3dfsr5pxpnga9s1ksqicck26b5w";source="1gyilj1ldx6c5lfn8vrzsbss4gl77grr2mw4v6xhimv2vsyp29a1";}; +aurical-15878={run="1ffl7fji5r74k80hl3d62qj7f0h439jb7zmsv4f21w7b6cfyj74i";doc="0l19hfh5g2dc3digkbjvrh90h3vwx6zsbadjl7zzzlnhsaq44nlf";}; +aurl-41853={run="0dxsldgnijrjrm97a0k33cliqpl09b70xf2dccigyzyyps82h0d9";doc="0rw2vhp4r9sb6pliqc3xxjc5hsznz4j7i2w3qk227ibg92qx4a8z";}; +authoraftertitle-55889={run="1gikfjhxkz21qb32hrhyrdymkn29x7bjcsml5clsw4cgi4b67fcq";doc="105sk016n6sh7llhk3fjcz63hbwms50l7906qxdddjq67qpgrvgn";}; +authorarchive-65777={run="0f9x0nx0n3k3hj33089np465jpikrxn689zgp0rdq54gh9cr5wvm";doc="0w54vg8rfpb8c9cc5aaq0zgz6vs7qahzjfq495bw551b3rm7cia5";}; +authordate-52564={run="0caz9s2ra7qqlzdnahhv50z050iyp62ypyrfpbj1p9ih7zmcdg23";doc="14wxjyrighkhg51m9jpdyjdwz2ipz4zr1rfgmdnxbpg31rbg2x7s";}; +authorindex-51757={run="0dhdd84hdf4iz67acyarzf0asb7c8dmp09s286rq0ylgn7lb9xx6";doc="0hhffkmldhhm46xi8d1bvjp5v15cg5kid383g7s1dbjxqyd9vbvd";}; +auto-pst-pdf-56596={run="0f212m856rdfzflq1bw3vfpy38d8qylaa3vqnfs595h3x5r0dsx3";doc="1f7kj4rga7x14w8v3cjn7lh95inliy2ms0q9vnfnv95jvp5a7kh8";source="10l3ld4jvpg1982f2a80ssl4hkdzi9szxv3y8l1i13pdfdhirv91";}; +auto-pst-pdf-lua-66637={run="0h17431shl7g0hza9vf20v86vfpy7w9wdyc09ir3s0mi5izhh4hq";doc="07bpl01v2f14csvqqvyvjja79z3x34q6mkb6qck44s66ii5dld0h";}; +autoaligne-66655={run="1y4xlxgcj82g3cvy23wyacm91kx1fnc8b9y0r8vhf6pwvj4fk6h1";doc="0srhzzycrh9awp39cgfqzc3z12vxj33qgbnpprx06y6bx94956wv";}; +autoarea-59552={run="07fi6gdnl9srrhmj5v28kfvjs3skf8g693hbdrfzjkyw76iji46x";doc="1nyrgpvkj2bplf0psd66mcrhz5j4bggvdmr93p77ix4vb2fgh239";}; +autobreak-43337={run="0dzr4wbwy018f97kzmfvza9i7m9mbpn97mjzi336sgq440v01hrd";doc="099vqvdh2djk7fm6y4x5m7cma71b2anpqkc3lfzjazpv15kpnlq6";source="03kqdrwznx3k65nf5z3p2z6d80rki7w4v5lhdfk8rin3112gn68r";}; +autofancyhdr-54049={run="091dwnql2fy1zfkr92ww01hjylx6in8ay56gq7ywjlwb84r6sbm2";doc="04fjrbsa9nqf5rj0gqgm96c8wg3dl8cpfzyilqrfqmim26rviskp";}; +automata-19717={run="0jqsvxn561fwz44gd0rwxyjwh1nanpmfsvd3kslw87h54hzlizf0";doc="1w428b0wyxf0v7bf1yr9dfm4x8q3xas9fgv1q9sxbhgri8daj8px";}; +autonum-36084={run="0y1x4j7fyssmhlqf9974yprqxvplxihbs879qiwa13x0zmwhnp55";doc="1a73xg2csfq051lnjnxkplnpfvl9vhfm05qvgxz4i79qmgs7a3b6";source="1q58d514bdm0mbqkmyngxh0nzzg7kxxc0z7bllnlkqb99h3x3xb4";}; +autopdf-32377={run="0fd1dw6h409ffn2prcsmq4rsgjshhs9if0igsz3ibxb6wkngbphv";doc="1rf0l15pp475f41si7qkx9rw7n6938jj2k1wybx4ck7pf6hs7i9l";source="1vw58d9g41ra5j2av1vdkzqhh7g5nrprr27qgdrn8nlirvwzbx9m";}; +autopuncitems-63045={run="0wqvm6yyja51j7yjyavjn0p9i8y2a8aqrywpvrlaybw2g5s2k3gc";doc="16hk972a108wh8qsk9lg3ai4cimwlfadmxy0xi2aa2wq8darhsqn";}; +autosp-58211={doc="16szmbffp9pwzv7zq3l4yvnsfk4m7w57wib7pqpgv1v5fzhlaahs";}; +autotype-69309={run="1mvy4szbj2bms7wsbxk5abaw41zi97lk21k8j59z1dkrrbzzq69z";doc="1s3c3zpl88rlcxrlmbmpgl4f6dyyryfs7gy9pkm3q2ayva3d4bwr";}; +auxhook-53173={run="0c92za082vzi47m5dlwq8bss4jjgfzmbbaaz5j1yb4ngli9qj08y";doc="0l6xga3hr1lvhgli259ma78rq394jplnkn5j8fgrfapvzrhsh2kp";source="18q0lawz00fbv9mgcbp21zk6fm1hsprmrkvhnl34ac1qj1rx6x3p";}; +avantgar-61983={run="1200x40k7wprm4n7srxvgrax2l52vn6d5ri2x0q7zbzzsfxfzkym";}; +avremu-35373={run="1j7mg5in2jhpb07jpky76qriyb4m0qq0rlkacs6amrhh57299prx";doc="1p7z2vj25fnx23rl6m76h82q8kli8nfl2vail4mpkx0brimn4j7l";source="1zz9b5d08i3sjj74q609k5kyi9nr7yyczk00i3dqfz5x3rlyljsm";}; +awesomebox-57349={run="0bjnvgqj4g1i6djzzzdjdrnlvli3dm1v2w2mi59s5s8pyc5pag60";doc="1m1cjic1dqf2zvym1ma83xy66b5irqma2fb6fy0qnl31f9bfg6x2";}; +axessibility-57105={run="001z3ra1zgsrvhlnvg9lmvc56s72b3kip71c1cnpl6qzqcc2y6s1";doc="0s77mr42dli8vfc9h6gslq5g103rp5vk94hx9cw3w3shxazib73r";source="1bh92wig3grw2bkkdd3fxwlky7rrfabzis1rwwdzgk3bmmrl9554";}; +axodraw2-58155={run="0dcls4qqm7pl0iyg7mkflqa2rd86wsafshx41xlg62din6fmybwa";doc="1l1kwxd8zq5xxhw7zyig0b8nna4fwr6615h4jjwpywcaqsnms6if";source="00nq53ahf63lazavijry572yii3jix1df9c604xnqpga9z22bbq2";}; +b1encoding-21271={run="104n1g3qnx2dj91zylj5byz7yaai6dw6v0pl9240mgk1h8i0xr2p";doc="0sdr25vv9svm3r6yqyalqza4awr8k26g7fmh8078bbxkddycchkm";source="0mbzrasvppl17965dmkp2f9cbi03539p83989d40kl5p11ih6dgy";}; +babel-69742={run="140xr7w35pgsd7sgj3sg7ar2dpdn2nsqg0idkz30psxp1j6h4k71";doc="0z6798rpjhxnxzh4756flb50m1q5431gl26q94szmav83pipgn61";source="04cqlnixmvnhz22lsn7f5jfpr2r1vhw1m27sda02q3nswhzxvxxw";}; +babel-albanian-57005={run="170mxpwnnsc1g9s7qnlhjcryw79cy72d8c4m8bhr36i5c78my0zg";doc="0x5z4gfi6m9h5gml6wxq3531i1k0sfqrd4hxrzbz68ijzyjnzk5j";source="1w8bassqn35bxyhpw6cg65ya64x1dn9h35p4fxclcjjhmv53xgg8";}; +babel-azerbaijani-44197={run="15siklcjg7wmpzgy059d8r6ivg6cib5by9a4l6n31c9pxncj7xka";doc="0dncpgvjqqa41rk80n6wif8nzdqw7vkxp2056l6sblzxgh87fvz0";source="176r483598gd2dfmfc2qhmknj913n3k6rk58mpfq69af72jq5rjw";}; +babel-basque-30256={run="11a26db60bwfhbx6zj42yrzzvf8nn8a96nq5mpw29xhxlpbhrcp0";doc="04jf1brw3ljipdyxv3d001slc0iggjmq6hkr4b5jsa3z8gcivzvw";source="17mz3bqi50ayia4nb2ikf60vgpnwl3i90gfbaq4692y354yvlnfy";}; +babel-belarusian-49022={run="1jad77cas2x8nlkh72rkxi3bqdlqzichqkxd3bdxk9bsqfhvj80s";doc="08lb1909wm2r4psppcbn1sf3zg4a8qp5y4i0b6kksfp0n7v1nckn";source="018jayyq2mzb89l60h7f9vzx2zgy2skklbqqx9zs3krg23xy2i6g";}; +babel-bosnian-38174={run="1q9nplgxfyv877y5q5hm4g6i5dla5c3a9s5cax27pr1riccgh5dh";doc="127g44ww87gaizsak6lbmbr9yhjhy8k32zkah3189yi21w7ncs4q";source="0mlllv7k35vyqpa9r4yz6y23cgfarqbyk47blfc5b3dill1imx6b";}; +babel-breton-30257={run="1qqayklpx89qmva8j6l6rhwinr0jik9lq1sgr6av9w0qzy9y1ifd";doc="1q5xlc5cm91wa5lpg5wysqyhiq71ghf6sb8b3syxsqzxdicqwqrl";source="19rafbvhd4fp6vb1pbgvaxrmiw1miw4j2n0dsi8fnmn1554zb25f";}; +babel-bulgarian-31902={run="1lflnrgn8si78aj9ms8lh9lb07maghvqlnrc7i3lmgn1qjrlvzqx";doc="1lb0kxx7bxrllyb7sqs1gjkqv7414jvs2kl06cnrdwsrfbr1g0kz";source="1wck40na2vczwni0kk1a8c1naczrcwx8sql7j0la1b4c5dcikgxd";}; +babel-catalan-30259={run="0brmmav2iwsw46p9bhbq5nc09w8wxfbsnpb6nrbx7zx76h599fwl";doc="06lb6gkmidlps7vs7ihqg94jqnpxyih2dkypbr0j46whs5nb80cv";source="0l4c6wxszawd0a7dd7fpljkngmmh1p7i7imyhgfsjyli6fpxmah0";}; +babel-croatian-35198={run="1d6xi12v3qr7gsknkfcb77q0wx5hyqpp0cyqq1spq44yf507nnlk";doc="1h15dzgmm5230ypaznk44607naj611n0mrhp9mjabjdqbsb71qdb";source="05zhbrvq0iwg7vbccq59rx2yfbaznixgr5nfh37k3584iwaqipwi";}; +babel-czech-30261={run="1qk6k4y1rkay2fcn39i99pxsip4k68xac4axznl07pbgx46v3h64";doc="1hvp785ly718fd1f0ig092rldcqglpb3mrygarww5bnl6fpp2ffm";source="1274pzgdya7gkvxjmdm3v5rb7hc0sj6mqn9pd8y9418yx5449spg";}; +babel-danish-57642={run="1q5gl9dxl5qky0g263yfa4gwb992ngd7vwsb24cw9fd513j50b9h";doc="1xmp93khcz4my2i1wrnzcb13bnxd9mnjm50s2jhbh8qaiywls7m7";source="00dryb078fqckqjnxa2riq478j6d5i28j5cclv4bw7dn5naa3lz7";}; +babel-dutch-60362={run="195d71rs9raadkqb0c1v3i5pm8aw37gxfnk7c6ic59ib0fvgs9j0";doc="193gln8qydvjwsj8pwayfv87zyg3wja99izbf4l7gvhh3b54jwjg";source="1mvmis59s94j1p98nqp07paxzviq6sgnqjwda7w63j4fnhhsqc3k";}; +babel-english-44495={run="1nb3c0yikcfhlpfsqgx2c6549ra7wcbcjs614d7gvk5fyh0cds8y";doc="0jfjdsiqkg0sfy326nz6rncq9sk1ssjzb0w2frybkp348gif3rv4";source="1q9bgs6mdgjlg3pv2ddrwbnfb628dr6rhdsgkf7rnwm5m6ncxkxh";}; +babel-esperanto-30265={run="0p11qa0d496xb6hpj6qc2lisr3xk3k1rbnj7b88wcivfjwf5ypmp";doc="0ra2iyai9vyjksfsdcv5b9ifvqmhlc4aikyzf3wq073sh9crhxh7";source="0i1hzj701rii0hbp05h25633vs2cbmqgyc113m3g78i24vh2rkbx";}; +babel-estonian-38064={run="0j7z04mcvjk72cad5l3np0x862nvgh7jxha8mll55cf18k9aj64j";doc="1nmjvvms0zijpc15rs0fkzli3pmidc4v4kzfp9sswvh43622p1b1";source="0x2a379m1b1ll16dr62dg5ai353p362dw9js4n0dn3x2wjbndmzg";}; +babel-finnish-57643={run="1z49ix8w96walkq5p915amii7n73ahzhy4ijxa1b2bb0wzz4b1l7";doc="00aij1bdybgcg69995mjrdddzlr3hqbhmg8q9nq86cd29y1gx029";source="1930zxk4l6k5q4wcbvpvijv4s0gxp2mkxvblczn4gcbar10vfd4x";}; +babel-french-70261={run="0pqcsbcndlvjvgzafnbcf01qk4vs2yj01lz18wj54g6bv2wfkpkb";doc="1by7z9c91zisvznivmsw1n5xiqm4373kjzjhvg8jyf6w4ispx0xh";source="042nk3n8pjbinp3i167zdqjf623ln6pnyafn8czyg9xyman90c74";}; +babel-friulan-39861={run="0gfq4gyi720kp45vcbial0yrn9i2jyx1lzh39lci0ga77y01j3mp";doc="0hnj5scfsvisf9k6iwh4awzqccm96apxrbwzlknpxn7x3zv93l0k";source="09bzwmc1jnal4ikxciwas8y342rix0xksd7qcp39nwajyg8njdmc";}; +babel-galician-30270={run="0mk67w9lhp4nfbhrzyb1ngm3rmdknvv8nlqb8601hrglj4hzmrda";doc="0pzpk8d8hhvgsjssy67hpgvjb6sh3lfbn6f5cbpqbhxrgllhpgva";source="1awy39dlr086hc807zc57l7xk6zqbkwrayvzfv8ch1mqnl0d3a6c";}; +babel-georgian-45864={run="1mdsi9mq6ka6ahrgnasik0sxkhq97qa223q5iy4fkfccan30kb07";doc="1iw1hbn5i0c7xhvcmap4hgiaar9rznr76h2mrgya8xj0czppxwv0";}; +babel-german-69506={run="0k82lr91vdc5kfq7wbhl9sw5sl78mg4kpql81ga048rwf5plhj4b";doc="08ghl1hgndjh6pj2c0j78ypd055hjn0mkqdw29727qmbxs14irwq";source="1l0qqnmajg4v1zkmc3gvyhbpvzcmwbx6lr8j8pbmhh6g9fdnmbli";}; +babel-greek-68532={run="1gii2nbgnixdysn2li0xw5acsvimq2r04rpkyhy16hnz50cm4shz";doc="07l23ycdm79ci76zkfijpdz5mlcgd8qcbq5s4rl041c8d4nnfi5n";source="17n58ldkgsqadbd1agsaf0bwv0pg73ybfql5bkw3ky9k9ck9z24c";}; +babel-hebrew-68016={run="112c7lk1xihspknd146hgp9nbc7wfxz36d3b887f6q0mq6hf03qq";doc="0w80r70w90szg4rlzzj2132yfx8wbhxranq8zk49far863sn658i";source="1srid6v4s1r5w02148wgfzhs9jmmwzj23fhx9zn606rxxkgakajf";}; +babel-hungarian-49701={run="18hc7z7gki6jyglywmljlf37aff3cndszywa32kmprbn2qlfc87k";doc="1imn8zlk18fcs2nsy4ml20xzkhpmv5lzzh28i2c2zv6klm1kmfba";}; +babel-icelandic-51551={run="12v78k2l9vmc07mx0wy8g0mjwryp1jf6ij06502h7jr55my6y5s5";doc="1mbgan8gv7hld0jym7qks13yph9lz0clkgpb199x3cdxmbvawpb7";source="09wz6pfk3vb4c0az1lgq35vmzf8v49iz9cd1ys7rhdssbcz6flv3";}; +babel-indonesian-43235={run="1nmz2vl80cs7d58hl22y9m2hlf4xzdw2brl2z9k56w2mk6rg510k";doc="1bd7v0wrp85bchni7sbn4b7manybq1by8sb4bhzcmbw4b9dnc3yz";source="0p89lrfyqfhmnvijf9mdhmjsr8wzb4hxr40rf33wn50ak3m8gm7l";}; +babel-interlingua-30276={run="0zbyfhfs222i1wdsfbik33m1asdaa71rg700s9vfbvfdvjcikciv";doc="1z7j47zmp5y3406da831kwxqq30mgxh2wwxsrkdjycnsswsywgv7";source="1y3xsscz9zxaih3752sk6jhh77ljnllmikiwgqb3xsvzj7b5fs8v";}; +babel-irish-30277={run="0ih96jfa66jn1s8c3dpr0631pa17r9sch1lv1qqwpmsridp8dl8q";doc="19k6gps25d8i28vcpbp59k47mxdzjn9d89amccr5si5hvg1c2qnp";source="043ias6pyv22g8ywv5krlzj5ma98wpi0r44lmi4gfpqllkay5g1a";}; +babel-italian-69298={run="1vwps1b50swsx1ww2znwzjizc6gn26j6mx470dws76w1njjfgp83";doc="0d21yk97jakmq0pan6q0cx53bl6945y5mxckzqch285fy8w3s0ba";source="0b15934yvmk7r94c9cqjhlsdpd8c9jp2gyc51cxksh26sw81w5xf";}; +babel-japanese-57733={run="079bhnmpcgaml555dgrmiigack6qfqx20fy85c75p4fsn2c93bmw";doc="0a479m8rq8l02q1w73d6lpfpi0gs5qdqfbl132483f2wwzznvnrl";source="0kjv78h69422dj1jh7s74pkdr3qrdxxbzk3czzfsc5rax71x9jhm";}; +babel-kurmanji-30279={run="0jp1aivn0pzn8yq1q79gvzwdlcz871apjg6yxx9x4wf8yqr8q1g8";doc="054b2pj4iv2mnaffw1a6zqihp18765rdx6d56k6vj9kxf2gqrz1n";source="0v6nh14816ai72rqc7nxd8k16bi75dvx2kbvnaavknxyr53pjwb3";}; +babel-latin-59800={run="0k092q6cdpd5qp7kl0qcaf4idbsfrbyb12flq61k4xk8yyp6ip1f";doc="1p0xrbmknfffm95zmnldcwrrpc3ngrlvlnfzppjql1va8vk04s3i";source="1sa59mvbjspmdc5sc3cdix59y575nx6pgc878lvlcrfl70a7hvw5";}; +babel-latvian-46681={run="127649mzw9jp35mq1yqpavlvkvcvxvp61sn0yl4nvhn30d0dws68";doc="1dvcwyqvx5xw4fl58accykkmd9ksbg5a3yqalb6x86hdv2fgsnq8";source="1w8w1ayk1ixwsixlsar5nmhv70fqahx06ydraiyz543gm3vrk6br";}; +babel-lithuanian-66513={run="1akp69n8i19kyx0x247i4nw66wmlj3d3lkm0pmqz6c4zv34r9fii";doc="1fr3m5b0dcrnrqdb0sm184czgkya8xbx0zbj9wlsnlh5y2pnvyds";source="1dchvyy3zwa18x2dsz4ww9hjnkhca0cg65q85jw09l5cz5v005jy";}; +babel-macedonian-39587={run="11wiv5aw0k77rvqwcgh4xdiwcr67q42rwq0mq5vcpfz2hb0v8i6n";doc="0nsvnmjx8397xb02h2l00nd7ynz11f9qiqrpim2f18r55qmr0hb3";source="08z4ca7kja5kb2azf3whgh0w7fabxs3jcijihm0vnzhb1809napi";}; +babel-malay-43234={run="1h4n9m38s560iw86cr88xzflizkd37nhgyl51xvniyvkz6nkhrxr";doc="0c0jriwwkrll6sknd1c90bhipcjr3inc7vdn6cd2szlbx72ir12a";source="0r1gzyi40yx8ikxkrdqa1hg33vciz1qbvibd8dv3qbia7mm11hqv";}; +babel-norsk-69603={run="0v660l9s3nc6h2mc8mlhz6jhvzf85s3qva7nldmnv9fw90f64s10";doc="0i4938n2ax9p78glxrsam2fbqfgsxk87ywhs9kci51ph6n70irds";source="0rz3rvib2rbbmwar474f0n20ywpn6hl50h2w4np0djx2kyn5hlls";}; +babel-occitan-39608={run="0s13mw7w48zq91kcx3pk5rzfg7d9dcjr8n8bvqsk5dvs0k4hk1dk";doc="132kk66ya2j6d7cwzd3p21qvjqm96dvb83ny4yj5q7vjqiflkn0z";source="1slny81jf77g32nxkvbwr429yi51gfpia6d1qllni978ivc9lagx";}; +babel-piedmontese-30282={run="0kcb4h1xsm8qcgqmqpgkqqxii5xvzpa2dvx6l41g3025ybbp558w";doc="0c6ql4g2i43zxx2ffnvg2rwac5hshvwngj7999g371fndhfzs31n";source="1xqfd8s659plyijsc13014zjhd9ndpi82jwgd597lw5d9jzwxf6a";}; +babel-polish-62680={run="1n1cz0jixlyw2zbcgz2ik03s5qarsh4bl12krsqjk2knqk1r456n";doc="1yydj18aiaa90n7g7c6widczi5kpslhcy3l1bxnq1dpx0g8wi94p";source="0wjkcbs2ghwg8x6mp6blihfrygc4ssy7nb1adj4vz3wx63li5j04";}; +babel-portuges-59883={run="0n4sz1mdwrwq5864dca367w15mzln7my995sm57pps1b0r8l21jb";doc="1is448ri7d5qgypmphqvvnrgf1q17cqa81j0qqbyqy3zdfqlzi7v";source="0279qlf36ji8qyagkmbrisfw7fz519ybgh2di42iqv2mwkwzrdad";}; +babel-romanian-58776={run="0pmjpy2p30299a10njvnpl954kdazir149b3aggcljaq0j4zdnzz";doc="1wgimmy2vwg66kjm0kx0lcx3zvvhdczxc19nnwqfbwchbpfhflyb";source="1qq1j0hb6vp8cdiigc425m6k8wpf7rxzdcgq14p064xlxnmqrbp1";}; +babel-romansh-30286={run="1hh4ashx2fban828gj37y46rm0q7w2j18785in1fwpir3cjcab8b";doc="0w4x7c9vws6k799ilw2w1p5d4qv2z9wb3bkaixb0p4gxmp6khamb";source="08v3db9g43pviw7fi87gcgj5xb5b2f07sll1slcvy94ffnmwlpww";}; +babel-russian-57376={run="02zvg65m1g15a1fbin635gvx2mxw2ljv4srd0wjjfcpdyfg53sl6";doc="1bs2q9xxqyjvpqxr3zfbmk0lkf58jg1ksi5a9mp07vznzplz01i2";source="12ik2dwkih2g0gqpbg83j0kcfwsb5grccx27grgi0wjazk0nicq6";}; +babel-samin-69604={run="0sm3288n25a5fvz05h5n39vvbpfp3kzwsw23qc3ijxj68y6xfbyq";doc="15v9732002svqd2s63wxf00wsn390xh683v0kzi7fyw5xnh8s9yv";source="16i3icn2kbkpyhij67mqdnqrx64jcjg75gkyrjgqj8kdg9kysx6q";}; +babel-scottish-69610={run="17xqq3526a7f0xkzdyp8phvf3a39b0pxzsxvxjm84b4yh28yfhyg";doc="07krdfp181jhc7vn3w15qny38vnhhbkkmygdkh0kv6xdycd9096d";source="0i26k9qlpv0qgzkxjs87k9ph91gbkqnm2w2wiyqaai77adp15dlp";}; +babel-serbian-64571={run="18vr5230h0x8hz9zizpsnaj56v6aciaa34p2jb2ykp59r709iwiz";doc="0daab33jd26smid0m38fh1m5yarl1vnc7qi64am6x3rl9zy55a2h";source="0jqj3bjip522w7swsqnpqls1mgrx304xrz91kz4dlqzvqw72f2l7";}; +babel-serbianc-64588={run="0pqy5s7pgbanlgcw9sgbig57mcs4i2yfydlbwz8xrrd6ysc160by";doc="0pw76idmc004nbzb2ax3shv35fzy44fiw7j1jp4cgaw64adr1a5k";source="1b4yc7y7d6asrx7lsmgg7wsdx6wfw1kvfdnc2xls7q6naja8xcws";}; +babel-slovak-30292={run="0724h8hnc4z0l0kkafjczzc69rh6h825wn0srfpy1zmqimybvaff";doc="15v2hdmpbivcdwrm3mlyb3bb3p1298swq7vwxqb9b5ylv8907sd9";source="1k4w34wq8n06ck9z81wa490fy52a1dcgi98pcvdmfggkalwr7ml2";}; +babel-slovenian-69742={run="1zpw0zp4f5wggaqb5wb9r3hjsxx8b4f892z5w7wirazqwgmxzn2j";doc="1lmjr0cs0j48d0l2qflg8hxcaqfbqfxlqsl5fj4g5icpha4nji96";source="1brwg8sr19048wgn0fdbi2y1rn5ls99kij8i71i789qf32hb1jvh";}; +babel-sorbian-60975={run="1g2m2ydy6rlb6bv1p3myfwnyr8kk1l7jpq60m655x8hqk32119fv";doc="010v5sxqjx15nvgsycacx0lwf4py7frqppr897a89wzmj0fv4svd";source="06vyg6dh3yxqmvy02ps4b5kgxlcg1225llc6mqbrnwm54548xwrr";}; +babel-spanish-59367={run="1d38lmr5wiv03w6hzpfzyq2pdl845mcx0db5wcvwm6132vmnh6dp";doc="1wphssp001lg7blrv6wh11ppv5c18pan2kb49s8s94w2jh4jmwy6";source="0vgyqldgji8fraj5c7na6zplip4c6bc41x346rvzjj3l76q6xzvd";}; +babel-swedish-57647={run="0h6p32rjvsqzy8kdhr0f1zi301xnrsvb8l9k7g6gfwv26fpdcnzr";doc="11kshqcqn2187q8h1hc7ifjnf8cz774wdnd9m2ncfvhf52h2l6mj";source="03rp4n9wkqyckman765r8v8j2pg5fg9frbfxsnhq0i2mr0yhbr6v";}; +babel-thai-30564={run="02n0zl8xa4y7r2n8zb1870b95inclcdmwq0llcspl54vjgds2yig";doc="157r19z20gn3fy9si8mn0c4zhgf1kpkz6jv8ag6y26qjp1c5g4kc";source="04x6d8q4glkb4w8ic5qcywxi009zy0f7dcczp2fibs0prhw1kmi4";}; +babel-turkish-51560={run="013k4sv2xj0ky344frgbkl2h836dzjl72hacgb6rcdlkzwyh5sqa";doc="0qdcg64lykk0g0gr3y4sc9zml58spq2y4yvlhc3md20mp6l3ji8b";source="0xk8c1l61vs547x7586m60x2hfqil8zq3ikpsj9733ykayfclifl";}; +babel-ukrainian-56674={run="0fm0sbr6i1lx2zg90w3mlwlyg0j0f11ya6as2n1w4gbm1inmc62w";doc="1h3ag9pybhzysb65xg3m217jll1h02ks04icrlhkp97sx3gs9wqn";source="1v7w99b86iclp16qxdjfqsxnh2p9zg669pwdlman1467y2z13p8s";}; +babel-vietnamese-39246={run="0xb8w1dm525xrvpsxy6y4n6m8rr6g895hysxbjcvv5x8bjvl2vx6";doc="12cj6335qj5igap6hff1qrfz4ms4s94xv7vlwdcv1hs5gabqylaw";source="1xdkjigwmmkbihczgd0hawszzmnn3j7fypsv3sx634ham8j02zzx";}; +babel-welsh-38372={run="1778pckqmd6fwd3xh3yk1dzhxbaqnffbk9arhm9qy9qxass1nnf4";doc="1p27zrk4dacj67lfim236mpv2s08j1n5w1wdpyziz60hxv5phmaw";source="1gkryz7dng4919w9wn73bvc5cfcly4g7dcwh1ilci0pbr55k1x4b";}; +babelbib-57349={run="1ka976ag8w02yrbbgldzlqa5852ag04i39w9wv9bhprn84xy5cl8";doc="16iznzd8hk1hxxp08zcifn9v5bvh3dy70nyas804z8av306s1h0z";}; +background-42428={run="0rxb5vdfgxxadgd3isbghsmycdh4ia9yjx66mc48n396b4psbrcy";doc="0a1zxpw8wjq1mc87glp7kwdvkrg618ybwyagdkg7xnp8r7wisnjr";source="1mb6radqhhaw7k0ay4i0mrj4bm4n0v4lj6dwbk8h898ypnmdirx1";}; +backnaur-54080={run="1sj9a62s7mqms6i2gv52dls1jncc478ki51wlnp6j5hq34g8sw8s";doc="0mzpammz9ic3d56ylxl40b3m8rc0s0ilhzx25h1y781kya0n6wb5";source="06aw2vvmkl1jprdznc5cwmyaw890csjsbkqmy814ddx6py7pxni8";}; +baekmuk-56915={run="0gfj79zhyg7p300bw27akxzgimvqmagk7y6b4nd7jq5wvrv4g5y0";doc="00y0iglv170b8pz79xjc0kz3yjphbb6a9alk5gg6hsdwvc6gf1by";}; +bagpipe-34393={run="0i3f9f7a38vcsypmf0yv2cdsb1c8n3qin4n8ac73gwdknhhibxjd";doc="0fagwknqzl3k6vc2x9axng5zljhc4jhlqd1x59cjkbrwp8xvf8kf";}; +bangla-65786={run="1fl4ljyh4ypqwvkhq7df1m85hp0vmy0xmdy2km4wwgxva55h0d1i";doc="13iprzx8j84ac6ink12arqw5c5jy82wlc2nymlfr8d226s37nac8";}; +bangorcsthesis-61770={run="1814fspfg988qg7ihx3rwfxk7c79avd2fxwyxcs8pp0pk38lg15f";doc="0lv6iq40wcd9zanvs51c7k251qnxz59470pidr0gy3swwpa8aqwq";source="1q0kdk6m143d9niwa59lcihifgfhl4j603x53dzwaj68hil5h3g2";}; +bangorexam-65140={run="1w44hvqiaibma89s72svgcb48sh2afhycfffj6dynnfzfps2an3i";doc="1xmjcf27x3qaqzavfcaa3b2731zbimq3zl74sbfgp9z93x5xb8m6";source="074136x5ybszfwfsd92cmxbli3b9f62rv6vdf1qb3yb2qnxhqlb5";}; +bangtex-55475={run="0gbjmkkidm8xk6hpkd0i0b778my5xf7hfwq3fdq2v7ca39bii0d5";doc="1xizgjqmwafjvcf0j25xh2gzcqzcipymhmhh0r56lwv02fd34b4b";}; +bankstatement-38857={run="0r9yfjq0m55bd973gqvjpy3qfdhwglwm8zki37ppj1dvca7rzrbc";doc="1qyrb00m7rlqkn77hw6sb3r9b8aap2qj13ni3bwy4qv2s12sfmyy";}; +barcodes-15878={run="12gzzkj2nkkzw4q6jw0nvzil67f83myhwas37s71dnpqm5n1yqdp";doc="0yzqllbvdmymqv61mc740hwjz76m7sncw4mkvpld1i9kv48f0nvn";source="1m9mifdmxc07rmlg9pav8mx856jg1g2jk48hyxkd1zs6b8za6ani";}; +bardiag-22013={run="1lwa55zrl4pqyvl754j4wz076gn9rbl0kfchad5pzhckm27vvp6n";doc="1q3ng4j9g4bp3vvbs9d4md4296vi2xhzxji8nbvq1ibkzbplgd01";}; +barr-38479={run="09pzipw0qmsh0p5y7m63gwvca92g09r8pq6zhq25k62x3s8y6a4z";doc="0w4kvjv2zbsg5jppqky6yx0wr7xq61xj2gk5yqi1mbbagnra72rh";}; +barracuda-63708={run="0qil0n2f1qcz2yrnb6g6w0g6ankwpb76hjybsn12ij75ihbiy9m7";doc="0sknnb78wbiysvz537i8cay2la499y6xnvn5q5xb5my5pxadjwdq";}; +bartel-chess-fonts-20619={run="0xd51ighrn01kwb4n20dsvrjhh7a0y31py2mfl1dq34v8l6yvn9l";doc="1sjwli00iffizzwaiszwyd42aya7c4vz5as8k21lmk054x9afjpc";}; +bashful-25597={run="0cp0lvqb88myspsbp7s3xd0rrkr1jlqcqq846mk8p7r6r4apl1ca";doc="19dbyg9njh2lwckmqnmy52gllsdwv2nvcp20marsjv5hps80946r";}; +basicarith-35460={run="10cjfm3v6b7rkzc0wngg635xbyfmrnzs5y6f3sn0akdfxj0d3x28";doc="0qm4qnxp3n42zvkxyzanl4psiph9z9dxz5b2i32fpn7p3jhn2qh4";source="1my6sp0mvbmpn2bakr93qwasqh7rwmzy8lhl608lssnxk33h8x8j";}; +baskervald-19490={run="1wvdsq2qngbrm2nibvmssk62kqvjkk50cxi2d7lx3nb6jgmj33c0";doc="0zj9xj7y1srb58lr9brmi2m7nw63n798m7mmzibjvn50kfw3qc8i";source="185jgbk6rg6vkdwhwb8i0inb32qr3rgsdi3xhgj4vj0iah9mdkbn";}; +baskervaldx-69273={run="1iwqw0d6wx9zl5p9f92gw6zqshflshw4isk35542wncwm1w8fbzx";doc="1xzprri9n8rmnyj5cxbhix05cs3bfgvia34h5qkql8ykfrfxpk1z";}; +baskervillef-55475={run="108yndp9v2awi5vw29zbin82bcvx2fzkkhypg7f4dcl9lziwdbg1";doc="0divl9d4bgpjvc6yy2yawcrigkvv7pwdnxy1gvf8mypwhkp17anc";}; +basque-book-32924={run="03jh24rrjczpgj9d4w5fy9fv8w29wbqylx5s9n14jwdsf6f588ip";doc="0sza7d2qx89saj6rx591ys15b8gvrnalrbrkk2wcjln1x2cb95jn";source="15lgh24zyqlmqkw7wdigwvvkv6qwlpv4zrm2zqwgxj93bffa4fs6";}; +basque-date-26477={run="1hikrfz1z6y294zg00arnnc6any1iyn0gkhmv9j9wsnlvylcbnxk";doc="0gifh2wlhxl5s2p816w06w5h51pg6gn2mdskhpgkq16shaj4xqcq";source="1vjq5pqkan433wisv0d437m6hbmfqyds27dzwkyd233zq73fpjxb";}; +bath-bst-63398={run="1i3mmivvw3wdqphw14dfhscjrximi8wi0n9q1cqxkf89saqml070";doc="0yn148yhz3as5xzgyhk6j3wckxpzn7vw6r2mzv10ncsf8a7knycw";source="1md11iz13bbbn2i2p0s9pmqkimc8wb6k7d8wz2sgwj48c2rdsd80";}; +bbcard-19440={run="0snfsyslxnz84a6lgwi21rg0f5vbs6h8yfyywih18vmlbjpba3zx";doc="0rbx7mpns7pgidx3g5pi0r7d638lwykjw0inpldb5g3dz1ipnpvc";}; +bbding-17186={run="17na9lw0yaqn7i5dnlvbfg2yn74j8kr4w526z10bzp4kpynnpnlp";doc="0pg135sdbs1zbsyv1cp69akk7kazr5937ysik38dyhhc8f7vj49d";source="1kgz94yy0gm19x59vh24f9zv95gy53ayc1906r28s067mknmc46q";}; +bbm-15878={run="1l1yyiqy3izbzbrpz55dgd46szkj55g8wkjr5xh7g3jc59y5kq13";doc="053jc17hvq8vphm6jqr929hf45xkb3rk7yplq4i55x57vkf8bvdq";}; +bbm-macros-17224={run="0h1qqr82ihqn7i8r6pk2mrxkpf4cnil1dj1a0y4y3ydph174v4l9";doc="0pxrzpbwpfzk9jhb544zmya41vzdzyn0s5dcyynajnf8lii3kivr";source="0wc6wf1qi6kxbd5a30n926gkagyjsk7mji9g9nzv3jwrshqihspw";}; +bbold-17187={run="14dz70qh8kawzlb1h8lrm0a4dpqkn9b03czd51s74z01a3cdmn7z";doc="0pfrhps4yirpg244lcpf10ilz53714ic1fvpk3nkp2ihjbaxbzy1";source="0qhfqg6kynfq6jzx93mili9kpgikq39wmlhgiav3bdzqhp6v0q3a";}; +bbold-type1-33143={run="0zvkzp43awkf5vbnrvhibkw185zg7h1rcfqav38z720cls2vgd7w";doc="1dj0vqnhmk8n383y426ma1y89r8y69y1lc2vkg58gaffjfrpxwxs";}; +bboldx-65424={run="0r6ds8wkf1qrv4mank08pzkwz4qk2pfyb6pvqazbf4jn4a46bjcl";doc="1b79xnpss9s1c7lmqlpznk4vvxzgp7dd248ipkq6n4dlpv0s2y4n";}; +bchart-43928={run="0knv4byfxfalyhmsqiq4wjcin0q0hyj9gs7f167cddjyzcg4z23i";doc="0zyiw3f37i3shf8ihhzxagvzwnsdaymbkpcizdm2ryziglahh1jy";}; +bclogo-69578={run="1rx0z4f23l22vs9lk246kff3cqznp7rzc2k6xn0nwphqxfap6965";doc="0xcq3ypmsjzbkxivak1j48mzmiixxfgf6v5fnwk22z09c5x67j6i";}; +beamer-69316={run="1igp0jcs2w20k94fr84s1af5q8mw0mrvraslaxsxcnxmh65dk9kz";doc="0y07zc3zvawaph7pwk8z9429463i99y9b6lzv9v8cacnhqk48426";}; +beamer-fuberlin-63161={run="0w4asfzmjrzqqc8dsan461fvmkjn21181lij46rhissz273d9vph";doc="0hw0cp32k2gqv9y1ai733sj8f08hdn3pj60qh2ykmcqg818q4clv";}; +beamer-rl-69254={run="0dq7p1zpgv3sdbncric180slinfxk1vdskzvfzsivxzhh2z1adkz";doc="0qq209gc6ssz3kz180dnd6kl2zv3qj9iwq5nzcbd50ypmm483dg9";}; +beamer-tut-pt-15878={doc="0ayh3kbh11l4nyyzp2kcwzn0phqhzawppy044iyl1wwwc2v3zx5b";}; +beamer-verona-39180={run="018ckad1q7ffkixvf6q9a5d4fzgpkpf9qv06cfv0rjwp80k7psyg";doc="11vv18n971pcmn8lf2cya7jf55x8zw1d9s4sg2l3q76rdj7l53ra";}; +beamer2thesis-27539={run="1rz02mxmvrq0x06xbrdqvfgs21nhkcislcnpdwx9gvrdmwpcyccq";doc="1ialsnm6qc9bwry5575b8l9ifgymidrsvy2dc786ixndc0fzn84h";}; +beamerappendixnote-55732={run="1mqx0wwb38h1aaxc4xzzq6430xhrxb70qcdqs5yj1sa7k9638ags";doc="0nvf6m7d6v8mbpnpz8bdam9bz4h9d84nsf17s1k13zv846rsp34w";source="01lkwbk5vpnpbrmjdarnz137n5sbaxw0xaich2jvcjlin46vfly0";}; +beameraudience-23427={run="1p3bpgkdbm3dlh7pj5w6yvgr0iqjshn6kchdpx86zicywwd2hqpg";doc="1qs882ypjg9cp19mrpr3nl54h1zry3pawjfwx8si2b6bsngz3wk9";}; +beamerauxtheme-56087={run="1a8q3a0z2wckyr3694nnkry0waqzqsgp3cmaf8ijcrfs42khxjcf";doc="19r7vjma15p3vw0nr3w51ghy7hq4pv6x92iway5rxmlx97dw4piw";}; +beamercolorthemeowl-40105={run="0kb2pvj9caszn40njgq99779ynp5kdq8ynqa0q6vhrh9l0r7d1i0";doc="1crml0lvdyk56zf1ylk8d4441237kfpnn7v9sah98w8s7rlk37r1";source="0l171ahdzizwpq8lq4rai2naj0h66q16p69nwhlwabynjkmfhhzv";}; +beamerdarkthemes-55117={run="07zg346brdpckcfr1vnmvqcahjmp87cb2sizvyx4jvxv19qqwpkb";doc="08zkfvjvrjh8wffv7qjqmv6p0997kriz6lxz06dnsp7l5j3p675j";}; +beamerposter-54512={run="19h0zh583chawpzm59xv7243vzkz597df68yy0zmn3r6ha8k0qz7";doc="0xspyywk813ndrd5xps7fxwggkmdl078fmn1cvxfx3cxpnmdf822";}; +beamersubframe-23510={run="06csqdbh272jbh3zpi0f8zblbmi0sp5iiz1r1qa9qc0lw81mdh7m";doc="1g29xay21yr8aap2fzklkg8q3ybz0xmz22xx5cd9md93c8k9kg7l";source="1zb42dsisab4234s79xvva74rlicd1gg4pbh867rxd15ajgy14k5";}; +beamerswitch-64182={run="0hl3c2ircmxp8bywx871w9b7rdblzn28f0mqfr0pdaz3gijbw7ms";doc="00gxw3mdrpdziixnjam8swq1gm01nw5hg6yzs4ijdpxh5d911c49";source="1pnr2hrvz58c5i0848hcdjw85jybz4q7lpb3xwfkmx84wjx99945";}; +beamertheme-arguelles-70209={run="147ldkcd2iyf9xs6g5vcbgdj7dh4iib6d8r2k5mmb8bgcgj0fg9f";doc="0p8bg89v8spv6lzlp4wl29jw2k6jxjbc65sxml8bzvlqba0asq9j";}; +beamertheme-cuerna-42161={run="1r6c3ar29s06b0yfn85wssxccayxn2706y9jxdx2pxsr85ndc4js";doc="0a8mmg184chg2lljv1k7ffydg4sgcjpjbnfjzqcg43cqd01v5dmx";source="1avywir51zks1hygqypsfi6lkrba9ld6x5mkr8lln7b2s4ijnysw";}; +beamertheme-detlevcm-39048={run="149ya5raar4xfkb910lk85pqpm6mrc5n5ghh6350knbmaa6bdwg3";doc="1wfq3wc7b3516s81sbp6md6mx9szbzq5ycqvsr50y3s2wfvvj2lv";}; +beamertheme-epyt-41404={run="07pjgzgkjmr4hdf16m7kx2cf1448253jwgc522akfvvnmx9fi26p";doc="1a987h1cg48bw05zjh79ga23qb37s82dkqhhgvp7gsnwz10pax2j";}; +beamertheme-focus-69742={run="0jsjj0rq8267yj70398bcn4yziyi6kmm406q1wjklydnclj8pi7r";doc="19qn37248i97z2pdxksm4z9a1zdkqi5p3fn8rk52y6v35w2xkgyr";}; +beamertheme-light-49867={run="133mvm4cayp49l8xvh33q0jp4qzhmvd3q2kq2aij3sh6i0bzh5aj";doc="15s2s3b10w0czq513mm2y7qrczm7y91qhghd0zsfvmy129mwfarv";}; +beamertheme-metropolis-43031={run="1pmvcyjn04pgcmvanj369hxqjha0s7lh1z4b6fbhaj2aj32l52r7";doc="195jhmhzr4gbi04zmss5nl0lm9rkg8spynwz5vqlgbci1xc2cw15";source="1smxiqwdvz4bj5rk9cmsqmy3kwa722ab5fhns67jllvzrkzy8zcd";}; +beamertheme-npbt-54512={run="0m1mpavq8p4pswibgfhsbnvg59kn4sxz0m4p2w6zjkmy80s3naq2";doc="15kc24d21d1r34hd07zr65rp1k55fwrxr59h0ayiiwgc9fkjjsd9";}; +beamertheme-phnompenh-39100={run="1smqwy1f7jz012x5hmsknvarykalz58iysnwf3px7kwg83fr8mb3";doc="1pg8242n3z6x1n4kp8my2nfllriijxwmwfn7d9hccfnsvjj25gdl";}; +beamertheme-pure-minimalistic-56934={run="1z283v6ipp7c7h1qhm043g0sdfcq2dwzk9l0lyy5951y1kj965bc";doc="1chzf3lgd4sx26nbmacb7dadpk1m1rm913dj01648vbd2bz9y4zb";}; +beamertheme-rainbow-67542={run="1zv8vrifblbhw6zfbx9mrfk1vklr83rwd6gly42jyg7fh5awag73";doc="0wy5cc1ca6byjw39rhj3xhynifg06ijqab5l1pavpcahyq6abq7w";}; +beamertheme-saintpetersburg-45877={run="1d48158ladllzj6a1np20irl0r0syksb3wnisxbbwv3kwzr7fgj3";doc="1qkzpbc29587lmckjkl3lx08f2j0q3aaidqz22r6bg896j8q8pr4";source="1r4cw99zffqsvppc9l7z9k8l93sfk1nk8pzj50nm2bmkrdbfk32x";}; +beamertheme-simpledarkblue-60061={run="11m8p3n45qf697sjzszjpkdwqfgy92pzxh9k7dx72ikpdah7ba9h";doc="1ifbh5r0sxk8nsf8cd1g0d1w26ypb5hhsylc7pni6wn9n70799jy";}; +beamertheme-simpleplus-64770={run="0ip3imjc2gz4d04k8lx9vpd4an9sqmw3gbb25rmfpyy0qfxbj0ax";doc="00lj81r295zh9lrbffq0ja1skpg8l8l3waj3d34sq6i9sf8rbg40";}; +beamertheme-tcolorbox-67000={run="06yri18aw8bb6l69njavl3mj38rmiy9aabjyfvy3nam2mc7ivhk0";doc="0v1h8smnlfic4r5j8dlixn03ihxy8ciwgc839zy739908g8wix58";}; +beamertheme-trigon-65985={run="1fdray7kncwsb166awwr4jwnk27jxnp3824yf298pp4ikg7iw6b0";doc="1l8iqyq8ib1v0d4k7bd35hb9lpdmpzplnv0fqb1ngzdn0jfx6c6q";source="1s3da6z3sshhndpaxmi3rh7zphh7g1qn4b3cxbzkifx2xqmz8xvv";}; +beamertheme-upenn-bc-29937={run="09a7da5ghgf5q4qp0djp3pya35zsm45wkiy5srz8p9q8pwg04bdx";doc="1m1bc9mxdwfdm0v2lb0i3pfxgf5as1lpm8a05icrm7bdvii0vsiv";}; +beamerthemeamurmaple-69742={run="1ghhmr1b5riskhqyr7x8kqjg76kqshmykw4iji95ibhnz2ywj43w";doc="1s4zb71fp3lss2wj72f92w1gzj4wlb1161cp7s1cc76nzacl00ya";}; +beamerthemeconcrete-69528={run="0661r339w4473i6d1dj1wyg2pc6b0539pqpq5zwqq7sk2c1y5dmi";doc="0g8xbg6ln71im7a6yp3hg8xpa1k0wy813zwvyha9yxj2fbqfrys4";}; +beamerthemejltree-21977={run="02ccd8qqyjkvqqyxr94p1gc6qjryl83vpa72wcm5ywr8gmxci0pi";}; +beamerthemelalic-58777={run="10wv3820avgviic0mcxn38yycyxqfvmf7qhb5ybz1x84jrw8k9hm";doc="1wz984il1z42ck69xn6rnxww3x4xx127syyx37wdy246i1ji75vw";}; +beamerthemenirma-20765={run="0ivhbhybc99hacnrfw1fb9412f6614an1955rglkcbwxwkji6nyn";doc="04155wbw6ix7an8sblw4a8q9hbn7vzwffady4vc23vzccc2i2f4a";}; +beamerthemenord-56180={run="1kb3485dv7kcj04bkgz8cv15kv7jmdjy0jcilvi5zc1vn690cyba";doc="0ls5ivdcgayz9pqm6j1wd5f45s063kfknzxf594rdipz1jnmvj4q";}; +bearwear-54826={run="1xaq0bmv8jv1zss6lwx2ccx8inrmyw1r9bjv3sbqfhp2x4d5xjrl";doc="0vm9lm6389jnmcgzx0ffmay2bw4d0h1wfmsfbj3x1s1vrfl62r8j";source="0dzmlcrc4izb63862dcafshzsaglq5m88z3cxmwivmwpikhh0gb5";}; +beaulivre-70050={run="1246j8vf4s1sa718g5y1rqigkh06j589f5sgkg3qvascsbacv9n4";doc="15dzb9slhisin5mm020jvaj02dz4hw2frm9zywv74lyx31akra50";}; +beautybook-68438={run="1s0snxw87d8f1chj6ghbl2x8byq11piw5s95v5pla9k60559qnvh";doc="1ddqd3k2mdj0psqlbgkjpdy0ayjcxh54bqgih71lwsw73hc6gd6i";}; +beautynote-70166={run="1xg2y2x69ghz8dy5mr1wqpdbjv7hsg2801ln9yr17zd7wgcip5lz";doc="13b2bblzg7bfyxv7agc31ijgaifjxn1hx2jhfg9gzg8d2qk5h1pm";}; +beebe-70064={run="1w6n6112mq82gz8mmyfjs1wgqfpy1dln2s49r8dmxzqjakws1486";}; +begingreek-63255={run="0dl4ap6r3xdwi0kypp6mq171jp4hl9hrjlhfrw9i6pd31qh2bp85";doc="1lmrl3iqgspi6hd86mwssr2bjqg59dykgwl4kzjfrbqa1637df9s";source="0nyd2kqsmkz6rvsfcymbbl2kvs220rk2fi2wajv46w0px81bxch7";}; +begriff-15878={run="1hl6jb8gg3acsj6rs1z0w5v0i6ivvas87hij4n64jdwgf1lf02ja";doc="0bd8gwf3ifqkjpr8wnrp0xx78169b8yc1ppdnyg9v6n4l1b0x0s9";}; +beilstein-56193={run="1xh2955zfnss2n9g8rsa0m1kad4b4xpsdrjj891kj97hhgd9hpdf";doc="0k78mwjqqib6hx7c6lcxkzrbg3gfw64a68fj32g0wpvdyj406ssf";source="120gcmpz53l2pzagh40nsji9g86fq4xvahzhwqqw7p01r03wc0cl";}; +belleek-66115={run="16vq207gnh24axsmh2nnh8lgy1lz2dn2kfn1sx51cbl28qv3wy2b";doc="064l5x679az55jb808yq36n28qhf0gv0xm21iz8rnz4qxymwsx0f";source="1w1jbq0l49qd2wwc0xmravrid4rfba52yw29z5ki7p46j51dw7i8";}; +bengali-55475={run="1rqwjn1vim77r30nmdmw5v50phpsfzdcx8nlxhxlvqsca3yqzsvz";doc="1zxczyil1izzj9pnz9c6my76mggg8maxdign07qn4kzf8c0fq8jp";source="0b4v7jrngga8znbfiafazxq6z333wa98prp7hwzzhpv3nxj6kbl8";}; +bera-20031={run="1i3mahkkb858i6a3wyrilcbswdp8mhclvixdxgc0wpkqvxa6qwya";doc="0llhr464l0akf2dx1avnm3d7adzcz7ml3x95glafpk0nfgb98qgd";}; +berenisadf-32215={run="05ibwmiklbdkffb1d85w9097sv215afgbr63fka2iqzcnm5lzbk4";doc="18awb9xgra9qmrsrm9l090c5lsx14xp7dh034k1fq1g1767w68ms";}; +besjournals-45662={run="1jpp3ayblhwwqzndss91rcns3axr60b8zzxdd6f4qqifhaqczk3l";doc="02s7qd7vvdr6wf00cm7026984s6vphp88iaqhnhk0iiafpr3lk3i";}; +bestpapers-38708={run="00ig29wqb4fn6qw7szmwmv92s19nc2wpapv4pgv8nwsby8nplyrm";doc="08yv29s2cx89nq0lvykx8z6szs72d2ph97g75bqni3l7b4n0wng7";}; +betababel-15878={run="0m2m3m59a2ma30zkyqjc3h076dp74m4igks0dvrlpgx4sfqg90zb";doc="1zi2yxvxhyazjncfjv6dv8c733hb0g5sxr9x7wqqrkxlxgp549wz";}; +beton-15878={run="1rjj64wnd9xvh940rl9scidhv9ridqz38n8ndzs35hyjm8n2lx5f";doc="0i8lg2iyjkzpxjzz9ym61v4zkqczkhvs6qjb7zf5xw557l2i55gw";source="1l82y1fz86qsnv58gjq9rm58zf3ki80xmcqkwlmgfp334j9jqz8y";}; +beuron-46374={run="0zfkx9iiiz7h501ls3z1fxk2ga8kjhi21vpmlng6vvw4v3dd1xhy";doc="0d0mll620s40695kikaykj4w3ngm6rcb4xzrgk3apl43pcf7mss5";}; +bewerbung-61632={run="1grnipw9vjrqy657wkrg656wmh1553wzd1x84jc6zf9gp3v1440p";doc="0ny8ps46wxkbsd5g5yxyrh2jd74b204r35lggy9r7ckk4jab2wj9";source="0y79pmsbjzpykldic1a41l188wmkmn9izhvg5p77i7phx35s9qjz";}; +bez123-15878={run="13l8qvnhfq575pg1nvcpbrwyv5wvq3bhpkmh2306mds784hvcib2";doc="0qrskibmq7sv07g60gzd5cp34p21ragr6yn9g6384gib8vx60nqf";source="0ab153h8i8nmc6v5g9xwvpymjvpp605mbj9dmxdyl3ic49cpnl08";}; +bezierplot-51398={run="0iz8zsifxrwbv35jlgq3qb4hdf2sqgj7smcc3bfll655zq0hqmab";doc="070nxd9n0i9r7h195lkm45zfpdbaqz4lf0k69qg6qj5adwrdqbvr";}; +bfh-ci-68828={run="0z8ymg5d5ifmhp28nm9cn9ascfl8m59bdhjgwq4wp3i4a05c8ais";doc="17pr0ydkh13h7wx15wi9xzmqpg3xdi2m34z6cb6ql1g5fi0dbgqs";}; +bgteubner-54080={run="0a8zhnl1nxzg5r525sn8sz44crjdm5fmy09glp8cjj7nic5xj32g";doc="04nh6c3q2w984x7kmgj023dbpjq9mqciyg4xrypgc4zv8wvcgv1w";source="11g65q55cv4s72cpraxw7yj4qskkhqhc0mz0sfy6c8jrq7255ils";}; +bguq-27401={run="1spl6qnixrb6vcdgaaxx0fk740kkxv7y73xamlkprdnrsmqrswwm";doc="10za9hbwigcbxyjwyy5cd760hqabyyj3g74w355akhfpyd20m55v";source="1vaw8sa12c94ia6fknnpbj7xxng3q3lj3h61akm590riffklw2kv";}; +bhcexam-64093={run="13r8z9wj4v07zjfv7fxy4kq26jflywbvj8p61g7r6rgj5v4pqay4";doc="0gvf2hr60iyymwq8alkyyya4vilsczqc5zhg3j7ydsz9hpvbkdp7";}; +bib-fr-15878={run="0csd9a4j3hvgyczgnfnhp8n49j4baym7nw8sck38m86r3kn8n7ar";doc="1inpqvmf6c5zb091q5fxg0r2w87kacvg1yy1lyai7wq3ll0axvp7";}; +bib2gls-69635={run="0aakzv28qlygmn39xs1r432m1yx6rpwgqdpfw4yi8b3c1gyr1592";doc="0v1q2xx6i5fpfcbqqy905n6mab55f6nicgfkkc89dgyqb1pdfgds";source="0apw4dajid7cpgnnsa8c96370mrra73vm0pzb1kk9h49d3zcb2g1";}; +bibarts-67407={run="0yqpdj8fnh5lafc9amvmnam50sgxhwsaw6fr49k2bzxcz5bx1qv6";doc="0di7fqxkaddpq3iqxf9nplz0vy4qzspala5hyh6l8zc9wdcjr0db";source="07664c9cgf85k2c096r2aahkl1ddawhcdqgf7wfrr806qi67mbz1";}; +bibcop-69467={run="0scvb7s5j4if7vviyvgr3sqkbksq7k62n4sri837jnri2d27cdhr";doc="15jszlsxckl9mfzhvjghipkirv9fa2fa81am8hla0g5b5k0b3kwh";source="0y87681xvr8a3m3l7a16qaxir2s3afm4lhy5rw9yvn3bdr96nfrr";}; +biber-68188={doc="1kwhxk6kzfjg62ygsyvxqj12pgw4bippxq7qdlgi2961n61jaj32";source="12jl5fyb802yrfj0fdajksrli1yyi2apf5kckgh6k0cri265bmxa";}; +biber-ms-66478={doc="0h0hxs4a7r8sr5w573d6m002zdpzgs0gghwbasdi9j2hfb2wv6b4";source="1mw39ra48y7gqhh8860544wvzxpciaka5c38873vvnbdnng44mh7";}; +bibexport-50677={run="1zbsilzaz68zvmbf2xw7jqw4l66clcplz3l46ggxw95gns8mgqlg";doc="17a5w095vkpp7j54h8m7f74l7vycsqbv6zzschdb3dd34scq1s5w";source="1pqs7j4xdhx3pqsc8i0wqnz9jkyg891dzl7g3cv19a6wv82k0xjv";}; +bibhtml-31607={run="1sg9x0jrgh2jng9b1pd08i0f8kzhy94sq0mf33as91gr43dzws88";doc="0is3q2m1xg52h5s9n9403c85yfmpjaqqbh8lgyfqfwhl5qqmgrf9";}; +biblatex-66403={run="0zzyi1sclgnrfqvi6bbcymwg8g076br964f40x25l5bvn6r5hx1v";doc="130p4vbg7c86ac7kyb2briwy4v82qbfhpxhplzlxhd4xa2p3j72g";}; +biblatex-abnt-49179={run="1dn2929wlyzwb96iq5lj8x9zr2fi1c4qk1rldc0vrr5s3cxfn3x7";doc="000akwyh992yxzn51jlvnc20g12ypq2zmffvnbwxjy3cyq0aggq8";}; +biblatex-ajc2020unofficial-54401={run="1csx7vad5svflb76ssdkvd8y3r2n9agqqynw88wvzhzj61fkd2cr";doc="03wzlpr5v6y67syy0bx87z123ark524fm6kqjw83v0sa4y4kwq7l";}; +biblatex-anonymous-48548={run="02fssl0l50s94y6x7rv2rm0227ivgr7kfnim435j4k1l0av4gb3n";doc="0dffdxp04shrh7fsl4dilqcsnnxbjpbayy9r87hxmq3yk605lvki";}; +biblatex-apa-66605={run="1hlh14lg9cay5962z9pwzslqs3mbqfd70i055r3xbgd19a8hw5fb";doc="0mqg66qiiqnffiarwi6fs3cmyyssiifv5kbjg9579lsh3f4dag4m";}; +biblatex-apa6-56209={run="1a1kynyy1gdmsfnwlnxws74hwyqc6sq29wv6ybalpipdzn7dg73i";doc="1qvn9bnzvx88qbmbdgds53q08v7ml42mbqbcn7bzzq6mnz9ra2mx";}; +biblatex-archaeology-53281={run="1kf5aqc8mv28k0aiipwm6yc1vkgzyikp0bsmpmgdhy5acz3whfxc";doc="022l37hplzmvkcpnr06n4fz509w8wm24py0c05qljs6jz7smyhh6";source="0shn0bacflcaayajxpdiv9ik994aizpdmlc010shm3fzjdlay79c";}; +biblatex-arthistory-bonn-46637={run="1j0wy272dkzcb96i74qh54ap2hs5wdhmln8akh749fyydsazr43h";doc="094s5c55lfc7ssmz3mzj61zkxpnn1haj2vh582apzffppgd3fd0m";}; +biblatex-bath-63401={run="1v5hbvaxcqc8ccg3ydpzj5979nf7aqm6r6ax82b9v27sf9zmr2cw";doc="1h0ws1gmi9qf5kj4czkva3kqa6fbgq88dw3lrv6rn31fxyjjalcx";source="1haww89x8x5rwb77g7qfdxr9gaw08067pm45nfgpai8kgr9p92a1";}; +biblatex-bookinarticle-40323={run="1gas58hi5ycchbpamm0z9mn5jc2hbry682i4wmba242wm55digyq";doc="1s39gixpryiqf44riq5bk3hnp6nc8pdqbdylh594k9xk3770p77z";}; +biblatex-bookinother-54015={run="1vb9m88z3cck9gi8d41lsv4ckqli4wjdgwkklfds2z189vbncc4k";doc="0zzmlsikzv5zxvd5xh12fzynmkl0bzzvl2s2y2r4kfn6s08xncja";}; +biblatex-bwl-26556={run="1ii8jacddlj15sm45g5rnk7yqbsd7i8c6a1pxy34vpb6bgsfb69m";doc="11cspr9i8q1da0x23bplsy88nfmn1x87zvrqdc28gbk4ybi6fc4s";}; +biblatex-caspervector-70496={run="0y7ad07hs9ywkaz4i7m9vkka9c16sm6fgzjjlpk7hx7j2dvlifrj";doc="01cdlyq8an235qrvqazni1rgxw6dsgpnc8xnj4mwdlb5ajwcnphk";}; +biblatex-cheatsheet-44685={doc="0y2ry2q1kvpy8dqglqdfq3rc849hmbni0k78wr1xnjbpd102l3k9";}; +biblatex-chem-57904={run="0kv44yng5wff1xkgw8nya64jizfcf1ipxrgnf46pd1dak5vlsiq0";doc="0amx09qlk78kw6iam8b83xx0kw12k5p7q6wn267imr2rsibbs3l7";}; +biblatex-chicago-65037={run="1ik86b38bc59qyj68fajcbskbmlz6vsg6nzwv6pm1fxnmhnnfd0l";doc="19sy3fi70kmvqknbfa0wxvn563l4s3m59f3jx75n29vxrdljscp4";}; +biblatex-claves-43723={run="0saj8s7q9lzjnydjh3x2hcnhj0wfm2p4rvxk5n6hi2ccfw78d3c1";doc="0g4x5jblj664ngppqpbks3d0ahn818ck871q2aqir6jgkrd13cpw";}; +biblatex-cv-59433={run="0k3bbbjvykc52y4557nm7kqna89mjq6g5j5hpblrcdlmvd5anq2l";doc="1xbd71vpm6vfyjaszn7jlxr084mqxw558rqyqr8x848hbyh6f888";}; +biblatex-dw-66579={run="1kjvqx9yqqzhwin4zwkp9qcgh6nk7bad5nlhx63mkwp37izwlcrc";doc="0a91cra76s2134anv2jinwcpp0jkd0pn7vybbin3pgyamhr469lk";}; +biblatex-enc-44627={run="0kvya1xzxpcmvwgacb726jqzmgr944y9ljai45f0gdkw855ylmb8";doc="0mmc5sd1jjnj42aa2q1g1zaps1hla6yayl769i4bya6i1w9r99yf";}; +biblatex-ext-66641={run="15fq6q1rxx8ca8p8g84m21v0l5pnibzsvlrw7abl8v3zs9bbncqv";doc="1pl04di1qmkf03i3l7ccszf1xab5bjpg6vjrfxj4n5gaw71k3jmz";}; +biblatex-fiwi-45876={run="16grb6hqmrhvzryijg6p4q4vf47a0lxa8bw59avlib5j7mqpg0wc";doc="10skq20bmpqymbgxs47z8ac0q5nckyph7s4xwqmpfd7pi2sksb4a";}; +biblatex-gb7714-2015-69775={run="12rpbsjr66wjxi8ncng5wir59j7mmc2j905ikgi3p81ld11401r1";doc="1j3phn1l9xi4xawd964w2828i2jwapn7qc53a0r4lrkw5r830vsd";}; +biblatex-german-legal-66461={run="05wf0z91b7yhw73xz70nfznic6x4iy0ir5savldd1ai67iv6h569";doc="04xrqwnsai24xh1apw4vl5gqhjd06vri33cxp0z96sp806s6hb4z";}; +biblatex-gost-66935={run="0d7fcvjv4100ws9p14qvp4dvv5wzp6xc8qhaqrxnrzkrzd6w7x81";doc="1zzxb2hqi4gc42jcf21pw79h56yxwq0c0wv7z45lq0m6vc45lzic";}; +biblatex-historian-19787={run="14p27qb8rdx479pj7zdvl00ir1zg8f0bzp107zfwv61ypq8zrvbl";doc="0hcghqxbjah4lyjzlrkixs6iqbkjx4d8r3hv16lgnddkndbgq663";}; +biblatex-ieee-61243={run="0iwj8jp5q16g0waci3wqc7hb1qmn35b6gw0x0c2v7444rs2id242";doc="0mnpgdamgf0f3nr0lbzkhl0ncnf5qvd3g3q4qnw45h30y69cpmsq";}; +biblatex-ijsra-41634={run="0gnm3h0918lvbqwnzk9wkdcafpzz5q3cln2z1sjaylr3mgypykdw";doc="0jl8mr3ai1ybc3lmp7x477znv59az94hlbzaqmvix54rxf6k8f4k";}; +biblatex-iso690-62866={run="1nkq6fa443dpxxm1w7fkj04169a50d61zwsvijg2z80ivlfqpn8m";doc="0y139zpq2xzdwj7ak46wdii3jsnjdywdxvnw5qwh58vvwwliz2cc";}; +biblatex-jura2-64762={run="0lq0dllah3drjijlscwy3nvzmimh9zc0in10vld516lmd88i7vdq";doc="14l5sf5xmfi27izkds3cv933397s4fn1ah4k7jgkj7vw424bwh55";}; +biblatex-juradiss-56502={run="0zi9b67y0p9zdz2n4j1lr5qgd54p3l13c132wjz749mlrv6njfx3";doc="0a6d7awx49cy86ndwfkfq280dwh846ssjkkkrgbq4vxlbmbh2zpx";}; +biblatex-license-58437={run="1fg16xc32kbg493y91sjxjnxpi6jb7kki7yvy3d796w7vy86ljfn";doc="0iy8ad7k9j5x5wnnk196dwsyc5hhz8fl88wq56x80cgfdkg20jrh";}; +biblatex-lncs-67053={run="021b8002cdb3h8yvqdfvidmzbdjqpybbgq14vya746hnnnas501a";doc="0fvy4ailfz2pqg09j6cqydsl9s5x36y0cdhhpvvyjfbvzbz2cc19";}; +biblatex-lni-68755={run="1z6zpq15kx0dsq035yqwal9p3q6ph6fvrax9ckjz28c31x668agq";doc="1pkjza70w9lzcn7r3kn8l5pg89dasj66c8wm8ixvahzvwgjfx9ax";}; +biblatex-luh-ipw-32180={run="13hh4x8p8hxnyz6cr22lb3djl5advrl5c9dyx6f491d2mjz7vibs";doc="0xb2wmg5psd0wi21j1vmn1y8sy8gw78350fqbmpgd6l4xw7bb4gn";}; +biblatex-manuscripts-philology-66977={run="1095qakmlkx81frnzanzdszk7isp92k4cgpqlgvwz9r5gk34mx2d";doc="06vg1il1cp3j525jxisdzbbd4v3504h4yyp733prh9s0q5s39yai";}; +biblatex-mla-62138={run="1fdznq1hvym9wgrxd2gsxdi534n5pbx95i8hzkz95zbxfvjpf4rk";doc="0i4716ascvd17l0nlf1wn4vddkjkzc85545wgb4cdzj847azm1yj";}; +biblatex-morenames-43049={run="1imryzaywyvdr67qcspys9r3mhl5k94vhqjsl16pmz86klq1bs1w";doc="03p7154s44ga7rlf8ya69qvbwkb6gsiwz8j2wycgzljj0z3plnjh";}; +biblatex-ms-66480={run="06adhhqd36ahjax1hn0ahpzmdnj5rxrs3yj6h7iyxc46s6d5cx49";doc="1slizjqc40mqai0686q8jghnsbvdy78kc5kpk5v71pc484dk5hg1";}; +biblatex-multiple-dm-37081={run="11rl82yv0bfy69cmij15np3wc15jss82ghf965r0b1py37vsj0s4";doc="1jypgpaid18g09xxryriaj4n1ql0759jfv4jshjbkbk5fgf4c2yi";}; +biblatex-musuos-24097={run="0zs2dwsid3xhcl01a2hqrr0mdfr1q9j0zga4rjlarfzkgznkqrwc";doc="172kvn0rpmk331yvpf3zbyisv1qlykz8icxgr1xkq5z9bxn9qmkc";}; +biblatex-nature-57262={run="0pfpm5am4dwj04fwdjrw30dx8qrmfx56s7gkl9h9qyj2qadsx533";doc="1mga7yx3radxwqhfmxzh2hmsyvx9qmal394cv31mlb3yd5ww1sv4";}; +biblatex-nejm-49839={run="02v8bfdxslcgilfsnw0g516zl2rfqx0d87hjb0dbm4md5qbry0km";doc="1znfnxizc22dgpp3bkl1iim2ksi3w9klw4jam84103bpbl3vwxgr";source="02q97wss9bm6xj9lvr8vx8jvp8bszkxgk4ayxk5zc4lrnjzw2i51";}; +biblatex-nottsclassic-41596={run="00valazq56srfggfw1mq8h7285lrx8iyk44kb8bhqr1q7nhl6pzi";doc="1c5634p7knwv8zrpqh39zlpglbdbx9a5y5gw54gj37x3r1ij769x";}; +biblatex-opcit-booktitle-48983={run="1xciw0zxkp2034lccvhr6irkr333s0qqqacxqx20v51vjjg8ywkg";doc="1rbswdipirzv68ckh69cc29k908ifpkzp3vxgd2j0bjl3qvbwcyq";}; +biblatex-oxref-68950={run="0c5ijpv8r0wwk8pnd8q0zg3xmkfdn1dkqncdzqjzqql8vm0hh8x7";doc="054anh0z6z0yvxxqd4gsy2sk8yqwvsxgclazgpmqvfhr7xvjjl1r";source="083wrmqr3j28756z4f235kjyq739hnkg0qnjnxs9vdw3hzwijry1";}; +biblatex-philosophy-64414={run="1fdqbfia3k8zldsyy7bf6rhkscf97v84m5c0xjnk0s0xb134d7hc";doc="11pxds41wzdsfgikcyx84d98pp3sz5625kzim7bxp58vn5rkrd95";source="0fhp5lh4g7m07cfpr03ca0vrn12lks8lsq3w4vbvkhh2in5w7z43";}; +biblatex-phys-55643={run="1vj1rrhzh7ncvi2dap2cjk88vdj0dmlpakjiz953rvb7szx0h40r";doc="0z3y7gmcmp2p5g25jha6kwkd7ma4pzgqybxra4402p6aid823fws";}; +biblatex-publist-70515={run="0l6kwaqkj94ycmk2nb9vq61cv471ibrifhpv099x9qg4cx8g68n8";doc="18x8yxillm7kjpwy7v16lwy1fz3m50ypwr756an83bv9ppay4ymm";}; +biblatex-readbbl-61549={run="0byz95nahaassfx1gpl80p4vgc2bhs9wfw9w7xxwan6b1kkkz9p2";doc="1cp3r5j8b7zrl0k7zzhyjcrw9nypmr6gd7mn1q5whn7n1dn5js5c";}; +biblatex-realauthor-45865={run="1xv65ic8ywf18fdb246sr8pvq60hv4wmg7ris1glr5104g5yhg7p";doc="06nvybm142cd1shgpcabddbrfyvzcc3yxk9zyq9hr3rfhzcqf05q";}; +biblatex-sbl-63639={run="0947b4lszjbhs0k2p6a31mzc4bci9pvh4awq6k6d4qzvpr51yz9g";doc="06rqhkxpmlql5hvw31yx0mwkdjwnrh9jk4xazqq9bxilgx4y7q85";}; +biblatex-science-48945={run="0llhz0jmncjp8c2r255mxh09rvff1s0kx1lacxvy7svwj7fl6qgq";doc="0daq39wcjryhcapsx7n216yr591scjcwg7z4cihpb10igx15kbkb";}; +biblatex-shortfields-45858={run="1766zipaps96ks920y5zggc0zhk8vkclqh2c3zc2y8x7jdbah1vj";doc="1fs56vf86wwpaz1ik846r83zd9bpidrzzwv4l6jhxss8hgww6y0w";}; +biblatex-socialscienceshuberlin-47839={run="0fj2l2wxawps79v81s74jr4d8wz4pf45mmpry1pflm2zcica3ajd";doc="09sf6k9qghwll84bj6m7v0xw6zm040y6n878x0ywiq64jc33h0np";}; +biblatex-software-64030={run="0d2g21gn89dnl6ldxdssg7aj9jigmlh66z8s2q8qvn7jg26gxv6y";doc="1z3izka82kncwx3hqq2rh6482faw7rs11j1pfnj7lncacab2b41m";source="0rzqm6csbmk3xrqnncd58ajhwiv7v881idzvcv5z48169s737j7b";}; +biblatex-source-division-45379={run="09wsi1nj7hcf5nswkd6syn63xhk2ghaxikz5xb5sfyci0lmnqgxc";doc="1mfz2bxfwx24a2652n4jrdw1mhrm1y7i5vq54rs7sp5a1xfg2d9q";}; +biblatex-spbasic-61439={run="1pw2925wakr0wgcm33vbmqgfqnglzn8g04fapnzrd6s0h5155zc1";doc="1p0fbxqyxiw3ihiw69z6zbv2g8pbrpdiad98iwxx5j12sm6g5v1m";}; +biblatex-subseries-43330={run="1c92azsgrp1cmq82ga3cvnca5s4j902hcncp64g9psgl9fm74nwx";doc="0ri6vvzcpcm2hz73dkam0fgbnfm7i650x983qcngkr0jqa43xr41";}; +biblatex-swiss-legal-64491={run="1sqskc93a3vdxvycmdz494kddxvzpf6rgw6l184lizwnrz9mr8v0";doc="1k0xgd5gi421zvh8bvyvq5naapb6v7216k2sn5aqhca93sifgvqm";}; +biblatex-trad-58169={run="1000rdnm9jqk89snffsf4ldl47wry8k5akm75aqhd9r7qbn73car";doc="1m32xykdgms8i4aqny35w0happr6vbkkra9m4nasxp1vzykf0n63";}; +biblatex-true-citepages-omit-44653={run="1lqs1swmdmnhard0589k0r8gz3hp9bd88dz5z0kd0586vl7z2l82";doc="0madnjxwjlz9hs6jzgaady4sv0878v7fyjs3sn1bcnzyw4krfxgx";}; +biblatex-unified-64975={run="06pq753prhncs0sk87dqlapm455jlyfvnx16q2c850cdipi33rdb";doc="1rshsmqfjl3ajaxvcdiqr01hbm4dh5qxpbyp5k0a233s254j4ypa";}; +biblatex-vancouver-55339={run="19ymkk94c4l5sav1lb66f2lxjyfzzi1s78qd2a8drjp9q1c6i0j8";doc="0wn26kl4nli220lfs663rdqmv49xgi76kjgnlwh99yljx7v47n09";}; +biblatex2bibitem-67201={run="1l3j9v225f9g2zmishkfvimd08di89p39g0sqffdwx0psj99dw5k";doc="0bpbsaasi6kq5ggs3cpkmwlakdlymd99rfr028q5xj42ir8cba3h";}; +bibleref-55626={run="0ds1a91dm11y93dy46gflzgdx5rgzzm8j50q2aghbhfiqmb4vx83";doc="18zif1ciynp47z8hbhc2p6r8jiqisj46as052scb5q6p49fc1ibb";source="11brqv3pgzzk3j09z6ps6ggwsqm89y82s3cl6xldnyvx2ngc5ym8";}; +bibleref-french-53138={run="1r12767ayfh073559p6pdrfs9fs9g2dxcliyx06j7r8lyfab8d83";doc="0kiijl5jhd024znr80g3xqdhz3jyg4vm4kyf1rcpa7dis4ffazpn";source="17xih976gi8my8mdr8n1nfvq6hacicdk8a01s23a0sarj4qwxz0q";}; +bibleref-german-21923={run="1vki9hg39xhn8xzbd4wq6vn6zk3x9gl9bm9n3wr214c5n5mpxkq2";doc="0q69vfak1yrv564qcw3nrklhq4sf62hi6l7z8w2hcj3c325kii56";}; +bibleref-lds-25526={run="18x44jyar9dnfmw4a5ijhfipscydqj2hybl79ngw1b88k9iq2wxb";doc="0yr2kwzbfbak1c5x202w8jpgr3y6fq63vkjngb0k2y5ivmjs636p";source="008hvab2f0xw9bg4ry74g19bfsrhp5ync4ilpya2h79smrwp5xra";}; +bibleref-mouth-25527={run="11x3ldyg77xzpx8yl27sxn6x5gb3jdngd5hgm42p8ac0x57x7ymz";doc="0vrpyl0s13sw0hi9s14qamzk69c2vxwjy0zzafzmlfd0pzxhmx28";source="1mdhq4qchr8gvdalf3rgns43b2lhniyp9d5lm3c9dnnlaim59hsv";}; +bibleref-parse-22054={run="0xa6nkbydiczmhphdi3rpipiva94x2pwmqgqcwmr6a66y1gk0d1x";doc="1mn4hyfyialzmzm0syizq1vps07z4zxd853v3aljn6zwqcwfpkxs";}; +bibletext-45196={run="1p2cz95815vkvvc9fsa1qm3sc5grkxzdsyw30qkilff1nivb3cd9";doc="0czz3l0m314a25i242kixy9f9spcj72h3bibfdib55gg05iw102c";}; +biblist-17116={run="0z69a5x3czy0hb59c93jrkmmg6i66vc7rw6szvchsbsj1c6gwjfb";doc="0wp7x8qj7bh1pgcy01jmq35r2i1f8yvrv6bcr8p68d70sr1jqspn";}; +bibtex-66186={run="1w7vpf0kw6vi3hgmlmk0dpzk82kns7a77appx8yg76xcip2xid51";doc="1zsqknlbs7d1zzp1gld8wd2sh0iccwq9vqb15xka9gs9wh30gc6d";}; +bibtex8-66186={run="1hi24b8mmpnz17cfj0p40ipyvzqhgkkhhgh7qkcgr1bz9k82q7sk";doc="0l50jqs0dljlaspb5q6arvimvraf9iv6sch1hr5w5yw1m22qdqs2";}; +bibtexperllibs-68910={run="0wm7lrg1rdhl0b6i8blfs1vkslvsdjksjdhc9bafqrrz3wx9yx27";doc="1r4bwlsggd4wyadclw06sj2akd04cy1v8j41g8wqp2j0x8j1jq7q";source="1i1cavfmgd8kiz0mr1sh75p7rhnrma0gg0b6xypzkxzkgwp1kb8c";}; +bibtexu-66186={doc="19bp8wn0ssz7gczxp0imbpgi1zwz9x3ya67f072rjzg2zmfpphqg";}; +bibtools-67386={run="0s0mz84w97854gwsz843gvlqlgk4bs5bpd195m8xv8g9qljpwfvc";source="0s69lggqnppqlyfc5r2k9jix7zpjy0nvljjimqhks250rjbgg0hi";}; +bibtopic-15878={run="0rzz1c1c6vgjm2r0gv65rwvbcv0asc5049agv75yyvqihvn51018";doc="0hzy6353n1rzirfdjd8dgjhnp496i14b0z0n2x7gnisf3qksr0wx";source="0abpdz3ir7l9dvc6vy5zi9ay103ga7i92vg3z69agd758xnz0v3y";}; +bibtopicprefix-15878={run="0vy9cah5mmr1vf4sm16212h36wz4623s07cagjqnmyprgm44sz66";doc="070shh1cg3hdk097v9jr37f06q0qaaxji3vjdv8v24a1rg3rrpdr";source="1v35hawmsgm12sv80wq2ld0rzz5l4shvky44l8wkxxh7i7vy43sx";}; +bibunits-15878={run="0znv09kqrwvmsjsw3lx9d3mp6fm8444zbn317q5yn5hzg2dyj61f";doc="1zgj4jpl0fpmsrcp3h4qlkilflmy8zqhjamghidwzkkg1i9jsfz1";source="04lswyalfivh01hp1wj3fq1q8960dmsvnbi8k856v3dhz0pv0whz";}; +bidi-67798={run="0iisr0ac3l2hrfja1vmihrf08fnly01dcfg0665x7yfck54qyjxq";doc="11x4y6rkk5g9ah7gmbwhppwk7i6q3j7wydjvbhfdz27wz4azcv1z";source="0nhkwk2r4fj5x94w9fq5db9nh051hxzb1j88q2bfhlf9zfwgiirj";}; +bidi-atbegshi-62009={run="0wpwp2fr233f0pac6llb5gmhz2ca41yjcmkqdil6qhpxscfpqizg";doc="1nzg4cgdhjjsalwml50xl7ac25w0qfd5q18cs8viicj7bbjp13wr";}; +bidicontour-34631={run="1yj7vl5z4xh8i420y1ycz21rw0yy83z0v9nlvi8k3ph2qis7lp8m";doc="085xfi5w350vbp4vnq8kgbilnz3jxwf4g0incvziy5hxh4isqirz";}; +bidihl-37795={run="09wrzqlldxy3lcxp21rdqi9bnjzza9wvdgssqynynjdmfggahd34";doc="1k67d2zd16ash4krnkwvmwx4wl668r0pdg720vr9xq6q3b139y9d";}; +bidipagegrid-34632={run="1nh14lla3xv9zikqqpnw7nb26kshjd186ijlz9snz19nkgddq28x";doc="0jgd9mfwar486gl7imm1m87a167c06cdhxg9qqp8m8nk6xdys8f9";}; +bidipresentation-35267={run="0kpwhs3dvmjhpv2n6kjly5cpj56gnwv3iyhiiwffd4bphzyrnyjb";doc="0hp0zbr5mpwsrd4rh3rc8qmy4srp93838k38phmsm6dwgqkda2z3";}; +bidishadowtext-34633={run="0jpz5a5q9c9c569ssyzk48y77msvfkd5csdvv0cd0r62ivrai5jh";doc="1bcbz6fiydj6dx8xzkrdsrm2vgcvn1jj4fk2jh1333la6rygvvav";}; +bigfoot-38248={run="1md91jivqvgf5kvwizc30wns9y9krk5pzvaihxkn9qs41j907wx8";doc="1lj6lv7iizbsaj00hvrcrdk9w0iak3wmx6mdpfb77jkzgp9dgg1d";source="112kj1669xl7qd2vrpgbi19cw00rkhj64ik6rrr885qr7bq5w79v";}; +bigintcalc-53172={run="01vz3qrhxb28v86np3a0spq9yxxc7faav32m136nax2vkm5ff8f3";doc="1wa6750qyggvx7nlwq9n7s1rfdm1h6i5hv91y1aq6mn26sw68l1s";source="00gnanfnw66bfrd5gk072z9rn6nhmqnjwf2dwnamvy3dpxgg86jn";}; +bigints-29803={run="10lsfqfzg0klg59s9zkrrxv4qjhnk74x90rkk2w5pi8zn83k6xac";doc="0xj6vnqfd5rb8ahxbjaqz7jd5kpvihr4dx88avrfvdfr0qhg3zlm";}; +bilingualpages-59643={run="1yawm29kn5ghjcncvfllv7iaj6a105xg52r3bz1m74xhnxif5z1j";doc="1bha7ixvvw04a3gj5lhpyw4pcarxzf16vkkl0d378bypa3lq5212";}; +binarytree-41777={run="04q8h54dl0fmczrv6fqvvisim1mz9lnvkdmij6b3jcn60z722k84";doc="0j8gn6mqaf1zfi9y5ahfzmywa64kzl9jxpdcdz1fl98ailbzywf3";source="17nc2whi2nh2r17gi9jn0qya8nyfjnn6d5r10klkp42b75jff993";}; +binomexp-15878={run="1mx2g0s4y5y9abmj2b7smz0xc2nzyvnx4x3f4h5v3w1x1kp5y0hz";doc="1yi68q48p39v20rzny1603j20n8k6ddpjqi773955wmh1p4mqsb7";source="00rmdk466a4kc1492b947q1f97d7cwd2svvc9wr6w1agzz8w890r";}; +biochemistry-colors-54512={run="0d4bbm1p3j6q28ckkl7ilkywrjx6iqvmx0qb27rpldw3jabf1lp4";doc="10pa8jwpxr37hs0wcywzsq14x1jgjx1cqg94lpghi505mlrikcg1";}; +biocon-15878={run="0g6r8rh12pbnbhddcv6sz9h8wnv31q6jqs2xbj5fjj7vcb46z694";doc="15wd9arkdxsh8aral3zgl83627yl4f0wdx2r8b6xb5ivvrbwaslj";}; +biolett-bst-66115={run="1ap5arz0s65bqqfllzwxisp3wa327kgivw1jh1gkc4wljq7v4jq1";doc="03hj647j6b7y43djqvb28rkjixpr0y7i02420piskp3cg90hn5dj";}; +bitelist-25779={run="1vbz2c27jjc94i23s1dzl9j0zf0n2935sgxgc5hq3bpaz1qxvm7h";doc="19p9f9bzn60nf5163rdlw166zpk7qlfwhnc51bpkppb0w4rni2ai";source="0r3lccpampra8dardrr7sb0swbx72aasaras43q4nx4jv6z2561k";}; +bithesis-70136={run="1jj98myh3x52w6r7wyv605r97jybid91yyx5ix5p9iycrqhq61x8";doc="09c7jsipdrl7jv6jx55s750la39gwdj8fcprphvbxaf2bx16600w";source="043bw2harjb5cddrkd7rcw66xg7lmiyhwpwdmh8i7jnjh0nf2b64";}; +bitpattern-39073={run="1j01vh1jy41714k3hms4nkk8j5c5d4nizgrm5syi20n8pcn3l9pi";doc="0a9120z9rsq8pqi33iv7f4j79gimjgxfqf5jhnrnmz0hgqdpl2mi";source="16bjmxm11kh0ww6ymk82qs947zgavm100nsfnjl60hxwjl3yknzn";}; +bitset-53837={run="0ynyw8fyb5cidlz00f42cf21gakm2ir9ilddaaz12s7qq99lhj65";doc="135dcx0b51br6lf9dxd66jq2xa21bpb1mi4y4kk5z6ngsd1imdag";source="0yds3rhgq52sxvwn5kc32iizapbs5g21cw6avbppiip0s5x0b538";}; +bitter-67598={run="0x3xnz8fvhwhixabr05rmxw8j0l03v2j5ylj7jq4gni519n3g60q";doc="1x8zzl2890c44jqk69ncsgj7xhchysbwkf66nnw0dsk2qfahc6xx";}; +bizcard-15878={run="0s6c3s99hid9pkilskd8ssc4hv5d5yg5lvw6kqz9szyii4rb6a18";doc="0ic6c43nng4lxsznkpj7w86ampdzjrqqcsdsm1f758rfds7wbnf3";source="0ywip83r43a721yfzrfnkfms0saly4p2ihagyp6259h2kji3vdjs";}; +bjfuthesis-59809={run="1gmd1fjwl49h98mh1bqhlxw63bcpy3p6ri33642p49aypj9iyk80";doc="056iczn516aqi3n04qn4q86w06q5xb3cz07sdb9lr4yp35gxmfzh";}; +blacklettert1-15878={run="1gvdw5gwjzgxa332ih2rp4whdcx1rdn5mig5q9cyiy28zvm1zrp2";doc="1m6qp3bkwl77khvanw498bfrydmyvf1qx5a9sp66x7l7xgjnndlc";source="1c38hmva1ffzani4mjg7zad0mr6lphncspn57m55n28hwfq7x8i5";}; +blindtext-25039={run="0nwxq33ffivn2ywxwx2w4y7ny5nv4af9p5cwn6c21jadrdj1rysp";doc="0gg45ayj3bibxvlghnz3vs0yj29zyr50bf6la0m26ma8ff0pw40c";source="09ppqs9mdkmax1s20m43hdi6yfcnpy0ylwdi9h9lw676gr65cn0m";}; +blkarray-36406={run="096mlldfyi6hxsnp3flkr1gfqhvhxm2vzk81zw6dl64xihkvl6aa";doc="1km35jnmh1iwya05s3ilhikzvz5yspxf18jh3f4v6iv5g8rxf9gd";}; +blochsphere-38388={run="0lifkhwl8rigg1w2k915yv1r9xylsj0qnj48cx58likwanvl8s2k";doc="0dbh11c3fjrdypam15gjlqwf3n9wxwhjqdd1h01f2f8yams42xfl";source="17bkqf64qvjhbids04bm3qhghqrrwf4m2bsl3gjxxc4h6sfih259";}; +block-17209={run="146ava8k2z6mlr2aq5vydax1i2sy6spn4avshcblgr5ph49iirp4";doc="1nwb1z6df3y0anzrl6b45fs2k069i42bcmx0i4p9z9fsbgqqfw1j";}; +blockdraw_mp-15878={run="11977c2f4100xfbrs5vcwz3vbijdvybq80zmfansdmxc0w3w6sq6";doc="1qb23f08wxmw3miys4sn89h48imzcqz720xfs3ihnbk2v75q3rd0";}; +blopentype-69080={run="1c87lxkmscs3v89s2pfy4r0cymgcbrdjg0vyhhcjh2ip29dv4kj3";doc="0v0yijfjyf1l2lxpmkg4w1ij7gj0mdmxd51y33qnwgh02g18yrjm";}; +bloques-22490={run="1gr3521mxmabcwvkqxn7f0wcpcmzy5jdpypyafyklmnhc2ij6zqj";doc="1jmvan6ja2zf01lm0dmh3dg4rf1cagfniqjfrmzpxc062khf97w3";}; +blowup-67640={run="0ijgwims5gklp37j8zlc0vdr6y2l0gf3nv2jnjhbbc49yv4n8gim";doc="01an3fbg94bg3wspadjil9npbx108g5x7kg8ga7c1nza0wygsdd9";source="1b53khyhzjy9mww925crpjmfgk9cjsmcz5hxjpl8wghrc4qqahjl";}; +blox-57949={run="0p3ci3xf1vndbdf147r9l1s68x72g7r2np6znizj3qqxd22h3wxx";doc="0hskpi2wnlrrqmv0s8i4g4bh03ka18w3czvnjjvhvmf7im9wq2ha";source="06zimj2liix2y0f6a35kb8q9d9asp48c58mhc3pssa185bcc7bv4";}; +bmstu-65897={run="1x89sc4grkk3b9mhi4y1gkxm9pcbhg54j8v11mq2bx4nyl0bgrll";doc="00950rlqysn7faapvg9z3knb61f8l5hyy9kjxisbs80z99mxh5rn";}; +bmstu-iu8-61937={run="0xvxli6na2nc03qwn4x68sq4jdr2x830yvfb507j1990pni1y01v";doc="0kimc29vl79ib5xmrlb1ipfslq2y4i3hnabxcaisrb54z0y3rp1p";}; +bnumexpr-59244={run="06achk9z1waxr6ndcfplnvhvd7k4z1l9mw9plh92qpj1dn48ncbj";doc="1abhn0hyps7azg4fipnyxihhzmk5fdnklb4gxxsjvnnr1grka38y";source="0arhv81y8993498qkrnlnsa8fiw88s389q6ybvndrmf85js5nwlb";}; +bodegraph-68785={run="11y62cwwjkxpr7xnpc20aw37lwcs83177w2gnxz7f3lr8192b28z";doc="1k428jlknm973v64wj1ljw470q3939kxns7xkxcfn5r3hjnqhmry";}; +bodeplot-69742={run="0fril19wxykb3mqq26mzmbqhdsh81qfnprkx7dyd4d2s3alf8fm9";doc="0czy2qkj6ss5m5flz3bj6j9b5k5gaxgz64xaq93al446sjr5cymq";source="1r1glsjb3kpi95lprz3d8vqlbhx6l22nf7arczqh169rz3v8y5xb";}; +bohr-62977={run="1fbrgfp1xnxa5cf5yqk9735wp0qwkjkpf8sv8gdjg6a06mpixn6m";doc="1jbmck8ld3rg0nw5rs9lbnr0i34gi2sxncri2fmcdpl8pp3xnw55";}; +boisik-15878={run="0xqr3sgmzklqsvd26f2800ifs674lf0a4kgr44na2l0lf5msww2c";doc="0l0hi4n5cfm1zdkr68c6ks3gxkda5bgwlnf62y7x96q5jkscdyxg";}; +boites-32235={run="1176j9ikh36s0cgvsflayik1xp0zycbp8m9hg0c7jmzkm5haqw41";doc="0visqy0qg18sa4mxszdl601yy0ilfgglv872dhzy8bnqqs8x7zzp";source="1zirqghkw8kk8fa3xahd27dh60phxg3blp98iavh6bdhj0rm7iar";}; +bold-extra-17076={run="0samckbdgi91y5ay98h6jcaywcqfbmzcdb90kksjxv160nsvf5ca";doc="1101922s78y5d9rjf5immfir46vf0i1ig20wp360zcal571csgjl";}; +boldtensors-15878={run="0nywpj03fzn31fffyfy9plxgq9008hhs2v1d3nsy3ggas5kvrm5c";doc="1vdj6217qwal5005zsmj0jm32s7scii7nmawljqi1j1a7lzlv86b";}; +bondgraph-21670={run="0ryp004w9bbphqwddprw8c3v1vndl0r34gx7ag36hlqipl6r79pm";doc="1hk7lp72x6skzvknhndz6f4lppamd3frl2f4dbs4hlvi4wfwjgc0";}; +bondgraphs-36605={run="0dhm5g508wi8r8hsk753bqflc4rvm4zi8iv0564pfsfz40fh3xnn";doc="1wnjhyr6r7jkmxzry9my2mw8i7q2nwq26zqyfi9mh6cv3x2p8siy";source="0qqs868saap9zsl70bwzfpmq8rnyvq2k45nc31ddzq3563djhfi7";}; +book-of-common-prayer-62240={run="1i6dk9ibp6al8jxhk6f6a8vsgpy40cr7m5k8zl1wq8fnm4wp13nr";doc="0ija5x2rgs8qxz3p4i81c3b9sznj749hasznxnlgn7anlv3s84rq";}; +bookcover-65394={run="0mg4zvi6wc2g80pszcf6a9ahqp2aphw46i59xjda5rjhq1xrnk7p";doc="1gppgwjs303i6f0zl23xa35w6ycfif8f081azbmak19f3vafzqbd";source="1xfn03hcrkidd4nbki6qqvk29gdh1kkd1idjqsdwfx7bb3ydgi7m";}; +bookdb-37536={run="1qky1ccqyni9x3dgjn6s36qyqdqzkj65m2glzzqdc4qs2h1hqr0q";doc="00fr2fid8yg3ww2gmgadxx90y032vrgicjh23ia41r159clg7fqp";}; +bookest-15878={run="1n6n322vb157fz11djcnfz07ykarin7n8mdr7v04wlsj2gfvv5hi";doc="1n94n8pv5s0w12w7yiws7sv8vwg06r245b7lka3g1j74p3xyc5g0";}; +bookhands-46480={run="08nsfgwhlyv9whaipx74hr4w6dhpdlvwcd6kxzcznxc66mlrnpk5";doc="1z0rir98r4fm8vhx26hw7l22p2z7swj5b2i3jdfy3c6cj0pi4g0g";source="17clfn8g2f48v944jlvwl3jsz9ixkw7x1xjxqkpaqnng0wsm6fyj";}; +booklet-15878={run="093kp4ryfp8q1hg8ddmvaxxsw75wplgz4rrmmwmzcj3hcgyynr1f";doc="0cd1mvkv29r2aqdy4bs02m3ck90rdv0nz01cq2x5xvqk0i8j5dhx";source="1c67lj35yh0w9bfgiba9ank6wk9zqq3l3vvgwn8f3v6kygyqha63";}; +bookman-61719={run="12wkjwpzxn1a1k3bb41gpnky1jjsh7gzj4xahsjd087fpmrsj9p9";}; +bookmark-69084={run="0wax84d0wyy1z4a78j62nnmkgn7f9ww6703qmnhyj9x9206dlh31";doc="0adm4hcf92xqxsb4cl01mnf5f6mvpblr3b8phxaz02xwxx3203vk";source="1w48rx66n77l7fpqpqcn8337qylp09v2pnxphhnl36sws5yw6nqq";}; +bookshelf-55475={run="10sjmi94cc4ix3a2c0qpavs1sc0mqfqfbbw4qygf9w1wdivrijfz";doc="0j0lqi7bjlivivvrvswlw89vav6fx8wg95bn18amlwy5l8d7kyiw";source="0jx8dfl4j4k2av1syngad6narkdjksqcr71q92h3090rf58njgj3";}; +booktabs-53402={run="04bfbj0v47hiww6z8xlzphm2yh4vidf9gcp3rvh81j66s7wybffj";doc="1hp3fbvg2v2hk1bns9b28hdjb2bcvn5d83apkr503ahln6rigf8a";source="0p0hym0xn4zcmq8q5v93z1zi8n7hxz9kg58fq53y96hf6isigdb5";}; +booktabs-de-21907={doc="1ld7zdr88xjhnnl2x734rxr7h0fz84awapmv50p1kzn6fczrwyam";}; +booktabs-fr-21948={doc="1xkqh6r2q835xaa92b24fzf61jsm85280570hivvwnch96i4fnh3";}; +boolexpr-17830={run="1jd298qazp3q0r9dwn7m35yrzvkl988c41l0r0vdq4g3nv4ppv79";doc="1cwj9473nazkz0acz4x7j1xp50139xs1ifqck40f2vb1gvhasly1";source="03kaz41353m40rbmars31pkbrrj6zwiajbv6fkabq0gsd9gy7bq0";}; +boondox-54512={run="1x8xd0q0yg1w1y06gx9fq25jakf7s3nz5lf2vryh5zlan2fz0ic9";doc="1sc5bwpvgz28q2ym65vccyr5pdg8fn680kd83zgcbcwd85n8nhrf";}; +bophook-17062={run="02wgw8462aaqknrnfsv1y8l6q7b9qvscnarysg2hw51l9g349idb";doc="1j5xyh11h3wsidfjnpw2wr8pc5xazf5wbbzi04r3wkw3v0haar2p";source="0mansjz0a6g02k9n7ijyami0gppkha80mnyaf9sqqzl6ppqygvn0";}; +borceux-21047={run="0hx755ghdd697fdc48hlvr21la4s9wvsn4v9c0n6sirlansba8ca";doc="0fcsjy8yi8zhrl75zb2wb17v1ilpgipdr85vhi4dsjmw18whp03h";}; +bosisio-16989={run="10dbj6gzv7z1na2bynrdz9971k5fr2vr4njcnsm16nlhyjzypfhh";doc="1a0vyxnhbbdm2hi8gydz0vyasvzzh3k2scyv2kxx4qbwvv4liyk4";source="12f99cgcf4mphvbqi2ffh7nwj627c5cxc9v8xrcg8nwfxr81h7hv";}; +boxedminipage-54827={run="1sn8liypm113jvmxsb0bl07cprrvdgq4rhbnp85lb5671djr63gr";doc="06wan6b11z6g2nbw73z5l27mb42cd417bq2vmmmxla2fyksjqqa3";source="17lk6ns0zl83nhdi8g6sgij4ajghksblqx2aac1gx6fmq60p7pn6";}; +boxhandler-28031={run="0ab7kp5xpsvn0i796xbsvnz8lc1ka1wqayva54sfbsv9bg9n0xg9";doc="0wsl8ivnyxf38rj2xv11jzyiqd5pgcpjnb3nnabl8a3ijdynzsci";source="1l875jplpql2bq0h55nl9ddmia31069chxc4w86pzh4acqn2c60k";}; +bpchem-45120={run="13l29qi6w99d47cv0ky9hsm6356vk7n88xkxjx5v5pb6vrg8zblw";doc="0n8w0dvfqal6k8syw9inaykdj2ndmkjqgg0fi7himam2q5qa36y6";source="1fbbs8lfzr3nih6m623r1wxdm8vgzfli2q97kp5jl998pz0ipwin";}; +bpolynomial-15878={run="16rzvfjwc5lrr6fvxjwp383ayi4pwhqk4x6k9blqzn0c0cakqmvc";doc="08d7was7ly4wgy04np72f9pn4kz20hgfsprvzlpyp2rfxvixphfc";}; +br-lex-44939={run="0pdhzadajg5vx5da6ildn9k2nfvf1ks4pxjgm32ajpcpfxbjpwk3";doc="001822zh0f18zvf6b51qdh4ykkv6ywqa5pm8q2vsmjv8rayjralg";}; +bracketkey-17129={run="03mq7rfgkgv06m25hkvlhaw1mqw3xr0ghfjj2jb4nlpkwn6945nq";doc="0kr9il6ac79kvqdds4rn4g98qxy7nvas62364sv75zv0hb6wl0kw";}; +braids-69398={run="0q4zrqx1ynlv8br0my5cm3j61wrizzq4s2wal010yx0lxlzm1gjg";doc="1yzazlfb6f5xr0s21yavcgw48x011rq1783n1cnhqcl9y7c2qirw";source="0f7a18z19z09jkrxcqr30rvnp7179fcsmc5n8fyp77y0j48kf06q";}; +braille-20655={run="0cy4bxpg284blfpmpgh1v9vyh5bczdyz9zdsc1almc51nv6c6zgf";doc="1ygyzvyz4am70n57hs8xhrkdd8hpn2mvg7hg3rdr5b6dvis2ibj7";}; +braket-17127={run="1ml5xz6pyj66kc2jby0bg02m79vfv9z3r91da808n1zb22mmnjkf";doc="09vqvl0v1qkrhv65bh9ym1zm254iigl21d4c98df8ayvffjf6bx8";}; +brandeis-dissertation-67935={run="0wz3k1yyxi9qdfqkj7h0bag1d1dj2yg63h0p30ydaxid9qbg4viy";doc="1vqzl7fkphkk6rqpg2rjdmd2a88x0dc96ff7hqrmcr085x7vyy7b";source="1rw5qxzc9ksy4v1z8r0xh5sa0s63l1dvr5lh83vjs6qgw7sc2yz4";}; +brandeis-problemset-50991={run="155al8iph3949h9859w32q6v885f0p6wd18m53rkliqvzc6d9f71";doc="168ywrm0cnk1l5fmqzpk9mxf4732mjb488gnqiz128dbsshh37yr";}; +brandeis-thesis-68092={run="0ng8xi2cn146fzafk4p8n651v4n7pqjhmq1y3dl52xphbh03syrc";doc="19acaxmg5r46kjk54z6gm59rf3pcbc7wlgqr7j5rbbp390c7kchj";source="0j85pasvrblbvsi9npnfmx9mc6gnxj9128d3zc6iym9fx3vfcqra";}; +breakcites-21014={run="0f3zhwrk0wapckz83304anlp2ssii7nvzjdakbxfdj51cd6schpg";doc="1f8x16qy5v27asch2jhbgh080vmv7mza4z5w63h31gdglbkwdp11";}; +breakurl-29901={run="0a3np519c1knm8i60z1d6rmmzdhfl340gkf6c4m1yss68didq0cn";doc="0dk4hgl3411q0k9dz9f9p5f7r5a59rpjcicz9h7ynpc4g3nhn019";source="1hx73iw3n5wgvaz2niqargiw36p068pjl8x65cajn081831syzfc";}; +bredzenie-44371={run="1mcl52mlbbw0yxbs53x9a7kh3xlaka9c7nszfajlhpvj4s3jr1pd";doc="1zgmhhyqf2bwlf0mi509nrnzqqa5g4qxr3zj46rsa8jz0giaig44";}; +breqn-60881={run="0dm9r7zjdwcdv8hq0l08k49lq4pvvf78hrlib16rk9s03rz2v4g6";doc="131y7g7hia9dgzf890xd5g4wfw23zr753kk78ajrdyn0jq1ipshs";source="1hja619zcayr2gxsxhsfpv3gp9x0bx8y56mjcpb9ykwlxax4zfpz";}; +bropd-35383={run="0l7ifzaqvqhk2dr31757ias4w4vzpdz15kma0bj2fm7k4sjx7d5y";doc="080g65q0v34rbfl67mpvqfcwfvr5znwv0rys8m3fys1s9d4yyryw";source="1kk38an662s7blxrnk4nhfvr49aymanj3qcm288ca6kfabg84w8a";}; +brushscr-28363={run="04vpb4yvbazm9lb7k2rbv4wr372k3l6brx37fx5283fpzj3wvhxv";doc="0dv19f5hfzwnw6fd32glqc71rbjwi1y66p5fl1r17pxsj16nlyc4";}; +bubblesort-56070={run="1qs3y6vs5z5m988cj6dl9n74m0j5d4hsmnrz6xfbpw2cs9g86jj5";doc="0pcbzg1p1wpw00h7h1va4j6iivz1ky31k8aq1jw4z9s5rwz64p9h";source="11g2brc46977w61sk0q9j2wmn5q9x9s3mv6fcgj8ywql3g4r85pv";}; +buctthesis-67818={run="1z7svjpf73ziy7iyd03x4g17k4y8cbqqdzi2ar0rpg48n2sxpmfa";doc="0lqvvf1bma1r5n8pawqqjb78jjgknf19j0810dmxzzzrl7mvxscw";source="1wspjl3bjpv3dgxakrb78w1kmb8i4hivq3wj2mkrwh84ahzj4hby";}; +bullcntr-15878={run="0djfn002j12nb84svd414zng3rnjp79ssrdhfb6j62mx0p9j2hk7";doc="0c88in90fy65pd9shbf09bl5dm6yd3z7g535ni5js251bqa9wijh";source="00pdz4i2pkn1fbihaz16vbhsnwaybpcavvmndg7nj47jlcfplhfq";}; +bundledoc-64620={run="06haydgwqfhzpwir9qbcc72y0x1xl0jhvyfh4gx37cpfvxz514qq";doc="1yqsh1kz5hm6rfh4vrl658y50ncypwb1mdw2p4qfffvp0w5yk2kq";}; +burmese-25185={run="109492p6k58bdgs4y0nb1hfnk63pdpf0x4b7az8frfff4wg2jvb1";doc="1lwgifmixkyxscy6ichwmc8lv26dwmcvy2nm68z2wq0cz7cihjli";source="1iwnsjnacafq1w3n6asj93n7nfxxyslf69jj0rfrl05fai0iq458";}; +businesscard-qrcode-61719={run="0xv56yqqj8y4270955srbiw7qy8bm9r3ih0zazlkrxnrxyh82jlk";doc="0nfvak5730q4ci88dyqln97ljhjbwxn3gk34rq2b5rk5cy2inabi";}; +bussproofs-54080={run="0d783i6srwanhm806hk0y5igbw99rf5x9anl7ib29pijrqvg8kjx";doc="10mn4g6dap1rksl5jnsp8pv3n0hhfrb9imldjyrmiika2d0prfp9";}; +bussproofs-extra-51299={run="0ndqiz033c8dxkdknf7hy1d42y0g2hgdb091wxrvpla7ryawcb8v";doc="1bg3sh0r7kqkb0hljc5m3x9gn3wkfyjr9b0d8myjwwyf4g9hzi0d";source="0p1imkwz82zwzp0p49a2vj7gdywv7mxr3b6nbmvkpz1n2qxs2hsg";}; +bxbase-66115={run="1ijrq63y54ahv7r5f75ssx2xjb2mfbgxk9pq53sfjk8cww1m9k0l";doc="0b6k87rxc8sxdqgbr61qmkrfdrzllc54svbm5qdxvknimgsbaiv7";}; +bxcalc-56431={run="1lgk3zfraip1jx7hpkkxwzril5sqc1hn00km3ybicsvi53z1q19f";doc="09x2b2cdxgf7lil1vlw4bmmjn2kl84cgxd75w2js2y1znsfgsivz";}; +bxcjkjatype-67705={run="1awhcn56jiwym35gxlhw4m32y4va9qh1skjjhk455plfmbydk71p";doc="1d9v4al9hyimw0bbndd7d8jjc8pngj5xrds1a8j7mgcjhkyyjin7";}; +bxdpx-beamer-41813={run="05zpcwq6syy612w8jw10fqym4w4b4qxrd2i4n4hqwxv2sqgsw4n2";doc="0g0ld901kdq3558ngzy6mf2f2vgjjcngiig2pbjb8xakcq933jj6";}; +bxdvidriver-43219={run="06rw5wwp5ky30s31f23gl4hpyzakn5b3vvgna8iw2iyy6rw5cl7a";doc="1qwxy88fnfsx9na6c8r56n6zhs13d8apkjq7hhydsfs7qy54q4vn";}; +bxeepic-30559={run="18by54j2rg04n19whsb2zjkksrdh6f6i54fq257i2mvcp0qpxwr5";doc="0117dzkqs1sy8si4dbal9p5p6csskcby2swmf2911c0vbpdl51zm";}; +bxenclose-40213={run="1mii9n7x232y5398zl9xysg81hflamrj3dflrngs94mm4akmcv2d";doc="19nmr2ripjifpjw8xrr5dhll392llqbfqjd2vj2zdgkvqj4bar4j";}; +bxghost-66147={run="1dydfivb39ly87sprrqc42s5rmwgpqx10chmxa7p3x3r25dmrnzf";doc="1gi4jj5xrs4wp194r4w8ycjvk3m18a499lckzpqgmb9r2n5ab8a8";}; +bxjaholiday-60636={run="0qxc2s07rqnyi0a8a050h2qri4kaqfcwc26c2dz0x8ypg18s6nhq";doc="09a5q2cra7by0q4zxl9nfa672ryz0cdv3xkw730cq3qyyxgc06ls";}; +bxjalipsum-67620={run="11gg3r67rs7j3f4by1irz3sfnwlz88i8w3kzf0bdxb52sfrh57hr";doc="0wxw7dlm8rwgz321cdfpx14vcx3hf2skg61ngr5bbmcmc389apk3";}; +bxjaprnind-59641={run="16rdpkqlsx301zvrr2nyykpjqf0wj1xhqqk72a5jajyjpcqsvki4";doc="1x3wh73nga2l8f7l24pyabpz0b8g2k6hkszwl5dijrppicl875ym";}; +bxjatoucs-52509={run="19n1wr7i1mfrabmrsgnmvk5wgdqhbc9lfpz3s5qhnsqsz69rzi00";doc="0icd5zj0cabkvwjgncsjmqwx79d2rqsm7ddp54ahczfl6mfg7fwj";}; +bxjscls-69637={run="1dzcq6mx0agsflkbpmhna8yz8r0qkzvxsav2l8syk5v0dfr7jzih";doc="16v08rhy39bf4p8r23va2xsfyvjwqzjf0v711hbg558nyxgdjaxv";source="101larbrpv6lgynlj28amqv7wlk0m5ydzkbwq7cxgcqqnmrlwviv";}; +bxnewfont-44173={run="0mc8akfajlyl6vfh620h8rcyfv02gdg4ycqx18lhb9vfivi3j4py";doc="18na6f8nqlagfszk9miy5bbx2bylgspck3pgglbkqb9cgkdf4qq7";}; +bxorigcapt-64072={run="12bc2pv884wi9z97ih1sm5r8x67vrlqhd19f6m1naz9rs7jcdxxv";doc="13gp6632pn7kvl12rpbz99n5imcsnwf43xx4iq9wq6xj4qnlf7cw";}; +bxpapersize-63174={run="01gv55dv9676m7rkfrmz31aql5xb69drl1wvwh7k1s3xrywik35j";doc="1xsg1nvr7i1smrg94110pz4my0vvi1imqkhksc9daki52iv1jyx2";}; +bxpdfver-63185={run="1hhl848f4m77abkwa3wz7zm3slnp2k9qbmaj2sfdr0hvyx05jwpl";doc="16919nxavpplbzwxl10rsbhhqcx7pdydcmf1v5z7hmkmw29a1d4v";}; +bxtexlogo-63231={run="1g8iy5a2cnfsxggzl49vbjw2fzk16jcy17vx10qp8qdzdzw29gs3";doc="19zq1rssw0sin3gz6a689g2khfc6rxhyckqxg0k0kj3gr32058kd";}; +bxwareki-67594={run="1ax779x1zf3b68a46pa3d65wdna3c3vhbz0r8kj8kavak044p1qv";doc="09q919sqr675q3iklh3yid7z6hn0d6pvk2a2zchi8rd3xdqpv06y";}; +byo-twemojis-58917={run="1c43vgcnkdvag1wdhivl49qm3c9pf29w89xgy0m02jrxryrjy6i5";doc="0bva1q3zxzkkrz2cc2zrin955p4r251hlb0w0gyfm156dss0iqrb";source="1msy8ja579nysqd0rmbw1xsh6hksm44ddi5q3x0i5p68k2pk1i8x";}; +byrne-61943={run="1bzlyhysyiwfxgjzdsz0ax8mkdvf3ln9fnwb33px92p167s1mdx1";doc="1wn4gqvaym5gjdnxa1pjbvnk77xzk6dzvpjil59nagibp0ap48pg";}; +bytefield-68366={run="0ygrxp4il760rrm6zakij3h6v6a61bgwjjbsy2nd816yv5a325ga";doc="0gdz5scdzh64p4pbw8f2vmwvs7hl012d9m3k492718shcfzs1y79";source="034azk9zmy6zpwi7a5jchwnigg2vzcbh998a1izgb79fdlw5hpyb";}; +c-pascal-18337={run="1gbijcvhkfc9jhdjs07l1mz4p8lchrhnrl1yj2gmzkskp4v2pkbw";doc="17ddnb3k2q279xrrsy3y5n8qyk7r8hlrw8vd446a11qiwypjvxy7";}; +c90-60830={run="0h4y0ydp0vx0hk5s46lj4j0vji6yslc0gn02rmpbpgs6ic34cm50";doc="0bwbqi9kg39rm63vzngrswsg7vnibrfxlz8fhsqb947j20mrj6l5";source="1pif2g8ihgxf3qznhhc52gi9bih5ai8a986c6l1zxlmgrh678wxh";}; +cabin-68373={run="0wlhsfhi6f5wvnvi0k0h9j8xiqy5dp7fxks2ipw2ap9yv3r34pfr";doc="0h57p06mh7drx3klgkgj6w6k7x4kc8h2yi0sya1ygi94kwp5x1lr";}; +cachepic-26313={run="1j93lljbpwca363sjk5qmljrfq4f671kg4qrnfyv9zqcxcpyfmmg";doc="00j7j75zq3wa6z1liy0y6wzxjv96sq5r4dh7kp9f9icmxzs0x8xy";}; +cahierprof-68148={run="15cimc5inid5zyb221k75dc42gdkvzdvxzh2n6wdw0gj12m9y2di";doc="0qd8mlngn6p5pzwkhkfhk8p26d9dgac2mn2har0pwvkrppg7vsj0";}; +caladea-64549={run="1xvpf4ly47vn8askincn7wl8k5skhn5ir2wj1nba6mgf84z106v9";doc="13j961b3q42vpa7xlyzlsrl6f7ndnlw1m1zqi39j5qsb7nhpy7cw";}; +calcage-27725={run="18rp330i29cw8pkfv4gzlr4lz5rlcvc4k0l8mvsvs0xa767fd3h3";doc="01xp6i814bnzgbcghdpyzb9f0zx3fwmqd3p97rk4qlf3g378l8y8";source="05lcg7mix6z6cw85bpzcqgxlgb1vzb3irhljlfcvq08lrdfjy71x";}; +calcfrac-68684={run="1rvsgszxg0dj2j3p58m26rqwl2qfinkvfiw54nq6zzzqxqqi03l0";doc="0r4in3rrzhs001bgck0y0h484ziqs90026fmyxnnfv9dhcxdp11c";}; +calctab-15878={run="0rs028w20fcg5jmmnhwhvasb701j763pk4bwv09lj3g78769k25l";doc="07fxrnpnzn23lb3lrlvil6a8624vcvam1lq6sf8nrgs52fzl2grh";}; +calculation-35973={run="0v7f5qx319zrwhy85lvk354a7x2vcainiq90y1jkm5cscs23xqjx";doc="1bk9yqx607vp65ifdawaldcsxm065hmyrgzwyy90wkn4kmyq1snq";source="1y5a2n2asfhwm8jylfg5zm5dy4v5s8gjl5ndizwk1ywwl0am2dxx";}; +calculator-64424={run="0ha62j2mdg6f0h9rc03xaniq3kgfccihwjh8lbf6r6v609kqncwd";doc="0ilnsnlzxh8zd51h7lj0rr6c4fz9yb8dff87yjnm73ndkvia0ky7";source="1k5vbywm427cx1xvvh2fv2g79nikspwrp7sk9qcvaf69g8acs93h";}; +calligra-15878={run="0x3wvp6crh6rg2sxzwil3jr13h73sjgbf7ar4y35na5ksgz1z2j7";doc="0pp4i750ga99x72kzy818062jvldylyfanjaf8nxgkglbyiw3l7r";}; +calligra-type1-24302={run="0liaz2jv1ad3xvmaxdp3vd2b3wvyg0wm1jlrrhxljzazsxzs5d3p";doc="085bcvvz7269v68r8a153cgwgs18bgpqrd40k5xy7k7f5wy7d0c5";}; +callouts-44899={run="19khsdal0siv0vvj56bxgkrj7bk1yyd3lw8iz6zijchp0by6gbbr";doc="18zy2yzjlgn9g2wzlc9i52x8g3dv32hvbybjkm9fmklsgnw8fang";}; +calrsfs-17125={run="12b13dhwdxr5dc37l7imlhn4sparyrnz0d3vagjxlsiinm7hakf9";doc="1295qb7s41y2abs2ip87ipcvq15pzza0bwvj6pwpwxkxq5yrr83q";}; +cals-43003={run="03100nskddcxi7z48iwm7vnwlrdkxj7xh8wgbb8bx3vfcrz731jr";doc="08y10p0i7y0jndknkwrwdws6ja78sz1qf8vxvhhhcpivxc7a5gl5";source="19sh899dbk4z728h9v72xrf54cij8jhnb4k4a035xfb7ijc0jcrq";}; +calxxxx-yyyy-69266={run="0hv01h4j0jc34z42x0j13bd80vkvaqdyp59jds1jf0yv2mshiwpy";doc="037nh1j9q4gspazcmlagqmxjfi45xbmh0pifbpmv9iflyvnzj6hp";}; +cancel-32508={run="18bkqkdf888nd6j187kd39g0vgfhfh118bky8r5wwzy2aq843061";doc="1x6dhr2xyx66i8qwk98li3vp40rlalfrf5lk8ah4gq03ndhmygfk";}; +canoniclayout-64889={run="0x9r0xjdv3vfbm68w0cydnjgfiaydlyg71cil2l3rf1p4awk1kkp";doc="03vn4k8yp4l195k2716a110b8lad3zympsphp3cp8xx0cbfb86ab";source="134arh3nmd39zr1b0ybmz3y0jfyvwzwcrzd59iik6bzbp601nk8k";}; +cantarell-54512={run="1p5idl8vqp84g7vw3q6ybwnddv8q7a0ijy6vny8jfd6583bjx6pb";doc="1r6mlr4qq61cclliz4h86bc86zkb5kr5r9bixwnj88pbvbalayff";}; +capt-of-29803={run="1b89cznanql6vmcn1jyr1nqkva40i61lsgjswsqjgdqnlbmvsm43";doc="091qchrgwikiissyrbb5i14634130vn08rkj2v7cnqzsb9c44f2k";source="0dlgrkl1vcvf8qck0pn20ic7cmsvxqkmvgp04f9hn3dmk0yrzc3r";}; +captcont-15878={run="00zp59ypp753b17wcn9212gxk0w11g2a7rn9gi2mn4k5c3djc10w";doc="02n200ziiq4lbfa3mc8yk7icayl7l5ci3kpl8mlkdyg9r0a14j1d";source="04wilkx7vd5bn05cww36lywb10xq6b2nbhlxnjq5xbmdrdf9ckyv";}; +captdef-17353={run="0gjbxdn70qskb3xl6gmags3gjq4pks44k8c48lxljx3avpvxnfp5";doc="1wl56hjc0204d6xrpvypgra7md18db4bz7657m49893m2pmc2x7x";}; +caption-68425={run="0d7z8vb5d26n6n8yan37820qsq46capr41vasvi4pcb2g2smkzlm";doc="1zkscfajy1biv61vcgh7gka33dm7z6zqf0ypps49kpgx4q01ppwg";source="1k8llr5bm3pi7bd6224a0nzc7d6d63wrwabm8wygdxj2slcixw5p";}; +carbohydrates-39000={run="08fsn3xp2bmkkhhqq0l8808j92vibkc27mi8frhzb7g253fnmbwc";doc="1ygfgsik471prmbnv7cwak72w8daj7zgvdw50hjn4c6mqsi6g3xa";}; +carlisle-59577={run="149m5a5mb0c2r3rk87yvsiw50mp3armc0mw3jfrca8p82cyjwkaj";doc="04l137nyh94qrli4qzsan6i1ag4j5j1s0qp8mb1m8a8aj0bw0i7i";source="1b1ikyj585mpg7wkijlb2ppai4shcz6xad9ks52lnkdjd0h7r9lm";}; +carlito-64624={run="1xcq8y0psxyh2dw9wqybb67q9ihqp2p0klf98rni24x0xn7c2l8q";doc="0sv5kmnkvpj60xnrldkp3gnhhslk9ksf6qpnzj12v00gcyxfs7gi";}; +carolmin-ps-15878={run="1wq22k55696jbawhlcqxj839vx1kla2xsik32pv5i2371dsn7211";doc="1kai31i0pvrvp44y06hl3mj20hwjzj2mav6zs36afz81b491aw79";}; +cartonaugh-59938={run="1s10sc37kg3m9hvjcicgc9i3wkk40wxi4ncswspn9a599kkhf829";doc="1y287gshxvdy4chshpwa328gfh36i3cs1g0giwga12afmkaif63h";source="16clmcddxp9a7ybvgpx7w6mf45lcqq1vzjb4r4ndggbpwawkhvlh";}; +cascade-65757={run="13xf7135hjf363d9n1gx41m7awbr62pp6y1j77qmc7x6xi7vg85g";doc="0d2fkdrrbh5lj6jmvixgj7v4g3adg6s6rrrj8wxilr65vd1d8p6k";source="1vh912sp0ngr4mq391m8cdggxwpjdm42d2qwv5m4mlqhsadald7w";}; +cascadia-code-68485={run="1gdy5rx4dk2722xhnl1f8p0y5xhvpscfaycks217g1j7k4yyk41p";doc="0yadwjksqxia4k6f8w0ng7rxzp1lggqxk8q6n1gmnwqqph08y4i7";}; +cascadilla-25144={run="013x6his54n8q3qp2xx12c0s2fbjca1ffmcb1kjy0yr0qy0y698z";doc="1l8xpfmdp2sc54qxx0ywh7im342nd3kbmgkx2pfzwmqz3xhpybfd";}; +cases-54682={run="15f3mngrmvd0h6yy3jiifyzfrgi014g4dsqz9c5g1mw65yyssl8s";doc="1vq4x3lc7zrxsh3b7dy6w53aikx5vfzx26fi288b44g99f3h37jy";}; +casyl-15878={run="1cmz40n2h7nckjw9x8wjrj0kkig4xhjslqjachsdgidd151m65c8";doc="1y1gc2a1fw8fmrs4milnqvn0i099khhjq8pmsycj4bxpbsbpwqva";}; +catchfile-53084={run="0dx2smqpw2jmzbsfl1g1zpa790qaxas4cz1xb5r905pvpca4q9h7";doc="1xhzw6ahzn8fgv2rxn30xszzpdjqgr97njvx7fz9bs9z7xr8f3si";source="1gbcl7bfr1zdvn69zzhsbfa808qdfq10c11qc3qgihpzz8s99fr9";}; +catchfilebetweentags-21476={run="0xvk581zl6wk04amq4q6s4mhpb4d3f239ihk16m9fglabhq34xwx";doc="1bd9dgjp2rvsv6mn40m7i2s5s84wj7hbk8rka2a5djb00fv4fgzq";source="0lvxhx6id5ka9r3zp8h0xgrs05jax4r5rcyqcs1f77zfc2s6s8iy";}; +catcodes-38859={run="0sqwy110bqmy1npqqp6m7x4m632zmg4n52snrbzzz87jp59k6kwm";doc="19drsfj7f4lfmjhpmivyyzaps3yhxsy5xppgbm67vk4368sgsmpg";source="1c9269586s85v3swr33s28wb74xxaxy3mzp4153by2y5hpj250xs";}; +catechis-59998={run="0i0bhpal6yjhama3l9q9w8ljviiljqjcxixlcx39h6qq2dh5a4sx";doc="1c11g2nbf5nk7pfmg3dqyidm83xwbcqnshpwhbbnz3vi8lb2ycw1";source="1vq6nbis9cgrsch7w0yfm1s7y8ymydhbhzvllpx2ml6qks6vhy7i";}; +catoptions-68982={run="1zixqpgln7yqpdg37l4dilbqsf86bbl64z0rqg9mjcs150vp0vcp";doc="04k68w710rvkx7zp10w9a1imwxv0qvanj1x3kjbyk0d7jvh3w20f";}; +causets-66359={run="1m2gjhs1v7kaagqqzppdf9frhlfshy74j39n8r4phhpxjpjflar1";doc="0zw9imm84dph6dnajj8ap50kr5h18j6sd12xfd1d2asb35h5lvac";}; +cbcoptic-16666={run="0y4y76b69ila35ak85wkakk6w1idjy92jhbnj01i82xpjnq9qrss";doc="08c3v6rppp3qfmg4nz0abwn2ka60wc6zrdx6qh1b591xgfwcm4jr";}; +cbfonts-54080={run="06641hiw3yahh28yq3bnz3dc6d25als1d8kbjh1ldab55gb3vz6i";doc="1vlhqfx3y85ym7xaqzr7bxkzm3am8806s6bkp50mv58r914xmlz3";}; +cbfonts-fd-54080={run="0gaw2v82im1k7addx320xhwwq28mcm2xkz4z90pw09r848s9fsyx";doc="1arnjpk1n9mkva1f9gsh5834kjb7m9rd49kgn3jf6acmdac67rv7";source="056b2x1fv2gvy7ldi9v1kgsla7jzhvl3lsd5wl1v0sb2rqr2jngv";}; +cc-pl-58602={run="0cvyi72p74qx82qqw6cwn6kdrrsfw83ngwwkjrgywqr08q65v1an";doc="07s3lnrl1n7pjbm81bqg6n6q6lnv5r04df0xjc6v6dqbdq08s51d";}; +ccaption-23443={run="06xbcnwyh6s417dc5kdf9h2qhi557fp0w5ikjdwkzsdq8q3ybd00";doc="1319qx3dz57f9hs21lxicwr8ql8131yk97zdps9rpnr5c6b0pgdy";source="0is0wzbqijcyi703k3va7icjxmf3v2rmrlhdlbhs1wzfyz1cmd2h";}; +ccfonts-61431={run="1rwzpbv0vaf4p77k4hf9ac14l9sw8hsvvqx5diq9dirsfq2js0rb";doc="1pbc945s3xjhccjm83y721xx1zrpqjbrirbf469anq9r892g33av";source="0avnik79dw3p1wvrg5rlqcaxr3w06mr5jvyms54ha18l2d63yw7q";}; +ccicons-54512={run="0xqq8dk5czaazzjlf601fs4d2z81yn02ama07js7wrxb21vvjz2r";doc="15hlqk9rir37m45ajfwfpw2w2ngsc6nfyh8g76vmbc6j48zmc4mg";source="091ayhgprp5w5g59c0zfy51lhas4gf3spya77k9fbr9gxp3phl4c";}; +cclicenses-15878={run="1rsj1gknw2ib42h1jn5zdhwv1n5hg2fdny08wpkwyyn14r5n52r7";doc="0vdr7nw2w4mqh3hiinywmrcszav7b0nc6jgrky1l3pgja9h78cj7";source="090smmkqiaam8k5jfk30xk6jrzdz6y75bcawm94x5l4sc8mqihir";}; +ccool-60600={run="1snafp7x6mvnmnkc2k2sp8kkj3lxm13x1nkwvyvbmylrh7zvjw6i";doc="11lkm79n0d713dmg4l4fwb0vk8k3pyf9icdyvbaj2v7zy6w028gg";source="1iy0jm88hvhprn70b9cg5bbh21z9mziyqcil6arq67r9a389npx8";}; +cd-34452={run="1h6x7mm7bvvd9za8vsr0dnbll2m404hbp7g3bwh6z5dr15y0hw8q";doc="1ws4qpknk8zz7cm0mfi9g9viy1f6r14y8hfi7dw2fl1lzi56j4d9";source="00mi6aazb16bq9b68n0jh2vs9n5kv7mizgp61n7r9mpk90hcaws8";}; +cd-cover-17121={run="1x1z64h0473bf4dvyiraym65h15n0jkqbc24kr0xw4i0fk0q4l2i";doc="0lsxmkaldpc89sm9pq4zi8j3fd2aszglx06mqn3y81qjil9h7xvp";source="1060k65sxs323zkjv8pvx6b98v6bq3h51r84dmn960v9xaw8pp3y";}; +cdcmd-60742={run="1vs7lxaz2pnc93926245p6sylv6z38a10flrsfzp317qpkvvrqyb";doc="17xflbkibs98pdgs79yxwasr2xfwh1i54y5b53314n9nsr0w539d";source="10c1rjy2y5f772qn69lmx9wknzj0mydj80jywklckp4g4xif2hqz";}; +cdpbundl-61719={run="1f3375jl826gm4arxsv0saigl8230d35dmkzvqyg2kldz5ig24s0";doc="1yhc82i1n44fp375vqyzrq47qdzwxc3x3zg10a791s4p25frzcn8";source="14aw67ah211c1simgsz0i3j6jxmnsj4arjfy5g20i05l892sb2xw";}; +cell-42428={run="1y2bxxx73r1h9rhsyar81r4s9nhgqjlvs5rwnkpk148rwwar7l56";doc="1ri21dk1wgfaay1hblmn8akmq8ccxpbp5lrfnprkqqrvkxnmaylg";}; +cellprops-67201={run="05gr1jgr9m7yfrl1d8pgnh0z8xm7rk8522vl5wck2s2slmk8schy";doc="15f1mbagh41qvzkqf1bdzlvchfn4dibsa2qj7zwaqszc6smscl1c";source="0yb9gjglaqfivifxi6n1al6w1nm0ah3r4d9y8bc7xnfxikhx3sym";}; +cellspace-61501={run="0s0f11xrs670zhynqq43sbrx9b290jph8r6fp6s7damrp9wnz9fx";doc="14znyc212pydxgnyzqwxd6vlvd72b64qjllmsjpcsxqi0f7am0ak";}; +celtic-39797={run="1vg75zj6p9bhp9qg4c7nvgncs7iiki5jizx27ld26yni9m2cd0sb";doc="1llinw15fnpjshks9yzlmbi04pkn6s87jfwgpnh5vb9hfws1ira5";source="1w3wm5ci6kzpnvlaxbpqndclhxlbs4xiwq90iig98wf97b85lfi9";}; +censor-67293={run="0nili9g4i8dly7gri3b1k4z1n5gnlrkj1dz4si3gf2b6gpll993i";doc="1kzi4glg1gpwx37ck2gys2dz072n43af5awa8x1a2036hpz6s5az";}; +centeredline-64672={run="1xrh8r00wrr29wiijpal0n6k48zzl5493zbfzfgwq115lxsvhp37";doc="07jvl42qmwlm2qv895f66cin58xzin21czdd0xpa13lgmpsccv2f";}; +centerlastline-56644={run="0wc1pwppiwycm5w3hp5ysnv3wgsw9s8m9p9ra3xbmlkqxd6zjwnz";doc="0f1x3wzxvgjxsgqparyjq4x32zbqjm88v5xdxm5qkiasai68r7q3";source="0ngxhlawj8igq7d2mhijpfcybfr6lv1jl82vs9kk7j8xrdf2nyr2";}; +cesenaexam-44960={run="15n0abwviaz213q00nv6faxc67fyqz44mvp28zcyysrhmrcxw159";doc="0vqxkqgyg79kzfcxh40knxh5a3d2j6q3f778k2npfz70d2kaizj9";source="069n1sk2g5n9cqq9rchk9w5y40igh620a1j5miscgykcczv2y0jw";}; +cfr-initials-61719={run="1wf5lcqh3jysn0fbzpmh429gmicqhh1kvz26jfl37f1z53g07shs";doc="1akblgsix6a59as4z5z6hhsncnsfxqh78s8gw0m3xqv6wrbv417k";}; +cfr-lm-36195={run="1inzb3q94b42n1g3hchqld687qhs33m2zxvxvgyciwqnwfn3h968";doc="1ska7y1xg6qq86kccplwxjd70bdbiw492d9y9n17d7hryg2nxw66";source="10layppddcanvyzjbgn6grgba9ff47kn7fqdxmwfkwnpw0qlw5k4";}; +changebar-69367={run="0q3z0187y2fynbp9zkhvfvcqrxyn8l03xrj4wm6zrzkz70yq0z3h";doc="0yvkcx0gws3m0jq15qnqbxm169f36qfr2wpbl4hp963z1az2dqnq";source="1zdljd9j7xdly3wlaqhic8v1d2j3mr7mz10vp03navlysd6b0ycw";}; +changelayout-16094={run="08bapli8zvv8p15bv3sj7l646fagzbj44dbq81apb8lhqanvlf0i";doc="1s304gpjg30kpygvg4r8r2j4bk9fg8vlb331lypd3dfd6slphm60";}; +changelog-65861={run="0zd7i9kh2rybh0d3zv7pxkjk3iddm03vkizpdxyy3sjblqa2kz3g";doc="1m65zxnlazb9jdqp4y0n4lzj6mcyhv4ng7nfg63zj7zpsx0kcvgv";}; +changepage-15878={run="070rd3drhaaw6z386v9z5rs7dmf15ci05lmlxsaay3s1ry1425bc";doc="1149csn0iphkxj7p1bhkza8v6xj39k49rylp84d1ilckf1q4imng";source="1slacsdfrjyy7hmhj4ssjkh0ln846b2ds11g446hmdvckyvz4363";}; +changes-67201={run="1cqdis0b9k20nvfc912xm99h6l36jzssszqrgcshl6m2kd722if1";doc="1r03j3g11nh23misg9prjrbl3jvf45761jzbxjjn4pajynfdpm63";source="1dzmdnwh8bbg3ysfxqq9x9nw44bz55f4gl79nn2z2c80f99sqvx1";}; +chappg-15878={run="1lx2yw7xyvbhvmcaj5qk2bjfmgyr4dn7q0v8q3xfkrnbzbzmcajm";doc="1c9qkc2m4rcixnif8y1zvcc0mzwjhzsbrbmy1cqv598cysc2yaig";source="0fzy53whj61n52k1ashphabpa076244dqjy1v7icrb27gd1y86mg";}; +chapterfolder-15878={run="1lphi7j367ga43j95vlph7ywzj93lppnn4n83xhbvwp56azryqm1";doc="1ns01x1y3dq3r37q783ha7xsnlg50vfw5knh2saw1rv40wf9vf1j";source="0zc9fa6xgs0s6g3rfzq3p32dlr3ay4k6y443z4zslkpmnv0hprjc";}; +charissil-64998={run="05ysp0l1v2azbr1gjjkh8mh1qmd7rq2znns60p2ic7dsfvfr9kpp";doc="14pq31xhrwa9v57dlwayysx16sw1kabwh4m9wjlpq9xdgbq9d38y";}; +charter-15878={run="1z9145ri2g732bs4fb8i74gc0ymak33k7sclahln2bhdpxi286fm";doc="0gm9pwanxvzv0zmxq6pf54ygxaxvg56kh1ym6f5ij9akwvhf6nwb";}; +chbibref-17120={run="01gyfwsfrjy7fs160zxvzhr517wwbsgh381hk626kvf87wssz2nv";doc="0h5vlzfw5lfg7chqfmbisqydmjn513rjrvw8pax4xlm75c0p6drv";}; +cheatsheet-45069={run="1cqv885i4crrramly68wamd9fcx0lj96vzys39aplars3pjv0glz";doc="1ykadvnpwkyj701xwfpnlnqr313d33r0yigmsscshgr1dd52jjf0";source="01hd52i399c9nsk68ymr8hmllxq1vl6v01fvs1gpm90pgvgdc9gy";}; +checkcites-70398={run="1yysb7nhlkk260jsbslcqjxax78q3lwjkqrh8spfz2sjp97256m3";doc="10hy8ib9y7adld85w62nyi6im15frvi3ym9alk7bpqrm7853wazh";}; +checkend-51475={run="1g4kx83kkpdd4fbd70b29hv82gbf19avd04b3bcxy8d0r7zyyyad";doc="1hzllxf7pnp7kg2623i5yhl2xq6phifc4jc57f2zfgfvvw0hqihy";}; +checklistings-38300={run="0hs740rpar4jckxc2p8wwd8x39v8bghgc2jjrbca9m5zbr0prvpg";doc="1riyj6x57jb28sjswnnfyqf80jnkvyr2cvckav29j9ni8l970qp5";source="1ghb0pv2zmznyg12zqgljwd2pc5lbajgdnzr6zf2rrmvlrsgr38w";}; +chem-journal-15878={run="01s4sbmc4g96cmnbhx9a6bqjskkrr6saq91cly2pfy5gr256vmnq";}; +chemarrow-17146={run="0vy1y1f8czyp36ssicmn1w2px76x47afrfqjfn024jmbs54fwfxq";doc="059c8r7vhs6765h0x0ycqhkd65nxb6sqq7xhi7y8jyb7i6q3rbbw";source="1ds3yx6mbwjvhzj6ximgglgccndqjbimprf7iszhkz3w5vxq6qz6";}; +chembst-15878={run="1dg8dasw0r96rnv4pnmm2k96rxmsdfhvkbxc5m358x3i5i4pcpm0";doc="1zmqlm8vr2f1mga0b33wikv1wn9lx3lpx4y7pjhgdqk84lhfqyh2";source="11qxmd7b1h7fwam9sclazzjhmzf5fiw5ykw6ry553xm1jp7vhvhb";}; +chemcompounds-15878={run="05rqpsyf12yrhpnzip0ywzflrvsjfdqhpi74iwpwb98d3q82ckai";doc="11264rxfhbf36jfkqdfyl2dyqal86bhjbm1zsy9ps8w4fsgdw94a";source="044gavw3i9xsa073bwpg11xy75dip172ih6h2p1mbpp8i7bzsrg0";}; +chemcono-17119={run="08cch2gr35wclm1l0j05lfbjskqw43jzz3aj4wi1dhpm31b855q4";doc="1kcgfx2clh4x59h4scw5mg035wqr2cp5kidn7f6p2aaf5607xid5";}; +chemexec-21632={run="0yj6sygdzs247fpajjl8gk3c6yhk52npbjahgngchqmblhmhlkc0";doc="0pqksv69yk7vf622x2p2ah735p0a93agfnfyg8hm2jadwjmhzikj";}; +chemfig-69227={run="06jp9cd9x404pz3fss77vhal0d3rlnwx1q6bnz6l5zcr7dg3n19q";doc="0g85rqfahdvb6xp56qgh8b9la2xjhsi1cv3q85dabxgbsqwq4m0i";}; +chemformula-61719={run="0q0vrz2agxw3g7cy5clya5hfsdv8s8qf18szhway3inzg5mfr895";doc="0h1nbyhj463zxj4d15cx88h9pwb2wxpq3r9dsbzdi63fb1mnr4bz";}; +chemformula-ru-70357={run="05b8rv1prv5fmwp0hssbr127vgxm02vm5d7s2x61yq0bl018x9jq";doc="1ia37z188y0i8dnah2fzg5pzgwd1an16zzmdfjaq4d1kf7qbsjjv";}; +chemgreek-53437={run="0di3w4yqnjs49im28g2a2qk31d6cqhrbwpq1jcxykk8am7g2sn1c";doc="065mwb7ah9h4qwqp36n0sdlkjv435bwrljz3yzsgym7a4xqvhfwh";}; +chemmacros-62655={run="1phw4kgp7h5mcrr66vb4kazzi3kw6abmxqhybn3amd4ishgbzd8q";doc="1rz1a7nc2c0cf78axch98zsaxah84hzr7h8rpvz3zz1vfa4bmk5s";}; +chemnum-57490={run="05z6i3cva4cq45z280ls3y5hrqk9m3a1v5yq51rdj1ilk3yh1a4g";doc="0g0q6a845xgpfwkhi31dg6w2rrza8cgxj925rm5m6mg026rd7v03";}; +chemobabel-64778={run="1s5pjj815ppa2glr9k7fzmmfcjpkz7a8fha66rfwkzf4rad3474g";doc="1p3a14q4qjpn1sr4j00x7x5pfp00h58riknbjjw0mcld0a1fiaki";source="1z904ymdpdynx4gplryxlqhras8l6zddfvrvh8iyiraydb8z470q";}; +chemplants-60606={run="1q7pvkkr4i4a1v8519a2ysrhya7zgri84is4c4hljqiqqv8sx4ir";doc="14gpajgpclgs3xzxd9mmyi1y3ciyxngqvxyzn651yn9i08h91f9w";}; +chemschemex-46723={run="1xs0vmk03pmlw7hcnm0llgq7gpg1wlack2k3cry0fnw8jqi6ls8r";doc="1gz7sdykvl3s6c5l1vhx2zyjljqrcs2h02s15nly8kjfcmvcncq0";source="0wkrpfipgl4yx3d5a5pvfrsxbp3dh9wwm0i34z2y6cra8xd4m58v";}; +chemsec-46972={run="0rl9aqh35pr0pr82vaq605ii09cxk73mjf3qs1dwcb51hjz51f35";doc="1fh5fplxlkzcly15kwzji7ym1ri8q33rs9k6wpbszyr2przn52sy";source="053j5riyl07jxzm2l44ns7wyck2y0680p9p73054szd859q86v8h";}; +chemstyle-31096={run="0a0sd2sv9g68alicfvm28b13kdipyrlck9ipdb3ybjjsi8fn99fg";doc="0gdvvkfjbzf0kdbl5f4j30cvddfbwiashz520g7kpkv460swvz0x";source="06ws8xqy1y609hzfc90l9zn2i1h3a6yq2hxcg1bfsbsqagh11rnz";}; +cherokee-21046={run="1h8q9ysfnwdc29kfc6yj4545xk8cyncl9ns5a465kh6li01zw5i0";doc="0ijq61im5wsv64qibwcllc2mi69d72915c5qjk0dcnsn7k823si5";}; +chess-20582={run="0r1danvrc979bbpcka5fdbnmxwiv54inxyd4rcsjkz6z03srbwvg";doc="0h6zcs8g6gg4fq0sp2s6gihbyrs9kkvrbqr6pdpb7j3fkb2jr9m2";}; +chess-problem-diagrams-63708={run="1hlbyxnx8cpsxv4zy9rb3f9z5c84szf1szxr6qm312p4vr7r0mjx";doc="148l2hjlifq04wc0cn04cx819gfi2zjmw8k03i98k6y1rbgi8bkm";source="0ma0nqvgkn7a9hvzqv1i03m2m02b1gdhy534jdsa6l7mqlbzw70x";}; +chessboard-56833={run="119dsa2mjv5kjw15349bjjz2xacnd82szwdb4m1hjqb3pkc8053c";doc="0gny7vq5cm7ibvw8fjnpbysqs81bf2s8nvjhs56qq3j7yg7ljapk";source="05wcy7c9arj8w9zsflr3byy31p0nl8g6i78bbkvw38rl9azpj20l";}; +chessfss-19440={run="1bi0lzxr3lr8nbrxj8189ycadm16l66isgslqjh1mfqyggz65gkz";doc="1xrdlw5z6dal81pdkhx8lwg18fzyfy1v4agq93bw09i94045cvih";source="0ryd536x30rv71pqvji805f9fm8ix6g6b5jravshrrksk9q8qw9j";}; +chet-45081={run="1ngh07j5kjp5v1pmymckqnj9knjadqzs8ia4h4vdyxp4zprgyqv3";doc="0l628j4b4m7a5p3vvzz8rwc236wqqs7vrf698gfj8gjdbbv0c9cz";}; +chextras-27118={run="0jb9dl29m57hby3hi2cfwks99xhrnf74d3fpan64852gvk0shb4j";doc="1ijm0ymdd4hh8sh4m5kxmny9nfn704prawr1c8x7445k9j1m2d82";source="0kkbsx2rqakaxq00nkvws7lpilzysxkmsijfxp1vyh73fz9cb8jk";}; +chhaya-61719={run="13x83hzrqriwcsc1q1yl93jpmgy83fq44jq890q2vfqjl22afmbm";doc="032qz2d0zflyj8aslhpq4n7mzr7rpl8kpdzrp9ahl3dxqzcrnwj5";source="0ld5zwwzznvc8a8n9l01i0236a9zw9n5jbiinxkhf8fk0gis1kb2";}; +chicago-15878={run="0mwrphf2g7v5yc0qij76dkzalgm3fhcm8zs7akgaypyk98cvxw8k";}; +chicago-annote-15878={run="1fz95s0d48qb1pzmwy7cdnccvadwsqj3pyvx02bkip5l0mg54kgg";doc="1lwrlb5axxqzrj1azyw6bsy9f3lq2n5acwnzmx8z7aw5sj19ls07";}; +chicagoa-52567={run="1za4fqlpirbr3qs894abnlwmrhsqbahniyyimy1dxal0cp61cfil";}; +chicagolinks-70566={run="1c7jy4z231rz2b2p76kp3v127vxdkv110ah06cn59mcwyjx8ncad";doc="0za32nk2wgj3x2vyx762wkq5yscbbjydi6iwdmx2gqybpcr10b7b";}; +chickenize-57325={run="08qxlyxghdzsbrqk9zhj6wr2ffbzd3nq7299z3q7s39z9azrr1z7";doc="1k4pqd8paq4zqygws1ihpsklxrmsxlqvi3y60zvaghq0r3iiqqqs";source="1j4sgh23sai4qzhpxibz2zl4a82nfiq7asgcz42ab5qdlz5vnh8n";}; +chifoot-57312={run="05p6x3l0vpzgxqw4pkl5b8hhkfg4jqv83435z8db140gsk2sz2p0";doc="02x1z9dbnzvbvwfyqk8axkqhzchd1dfjdqsf4xkajxvjc13dhcwy";}; +childdoc-49543={run="0vvf825w9081qcibwgyjdm57rs6083axqnr3lz9g8hd5s1h26s78";doc="0hh51g80vlr0malbfqbfb0m5nln84bvnqa2d847khncxh0azlr2f";source="1gaisc49xfpk37nrnm33wazihv61b61yhi40wwyblmhvwimmx6qy";}; +chinese-jfm-57758={run="0lgpg27qnc59i1lkbis5jr3z4fy2cl86x1dm320q5kfjm6z06vla";doc="0bpl9vkjvn3bq1dmrgm4f0kgmbvxrxxhd1alfd4yw30xib24aq31";}; +chinesechess-63276={run="09ylm4dnn4ag7yd0ck66wbibm8m782fb4bmfmf34wyrnif66sbzv";doc="0m1q0bw1a4kf2jdm8kcp3xg0y448d407awwaf5r0lazycy64ycqk";}; +chivo-65029={run="0vb828v2pi72zxxpjqcnij3a9900kdshp6xf1aah4s62ws82razw";doc="127l1ll89b61yczjkm36jly09y72xli8lybfjf8fq5pm621hzsj3";source="1b9gval665vsjghj9yy0lb15v4h0ysjc3l47jln55qxfd56vxiir";}; +chkfloat-27473={run="1bv0gfqa1bhrwq7vmjn0ih49lzb5g3sxv1fdnp25lxp5fxck31k5";doc="02s4m1ngjcw8w0ywyqislxs6cb5vj5zgczg3dnfpqsypvxg2xr12";}; +chklref-52649={run="1045jsyhp39js54xmyr1wxh7qp3z5hzasyqi33nvrc4g7rb9126j";doc="0pmgdkdn930lzyn8j3diwwam8c7ikm4fga3fh1vpigqddykj7hqy";}; +chktex-64797={run="0ij96wg5j3grphp71f3casa8nlkfia7hz34njvi007pzy00kgvr8";doc="0ln3in6f2j0bbk1n2lha7s6mv31cqjchbg1ck0cq10aabhvx9fz9";}; +chletter-20060={run="01gvs00kjr313a09y65hif15vqvxidi6ri11ypsbnsc0man6dhwd";doc="0mc8nlph24bh90l4x5bfc9dyldd4jjn46y08xgf194482dz2q8gy";source="03s40qmlbnlslcv8na5vwz67fad1chagal1pjq6lk0glhn5211dq";}; +chngcntr-47577={run="1a61sdmfbbryqd2gj87bm4qsva0xjmf9mkxhxnjixpqmr4gixq8r";doc="1rrkyvwbgfxxrnsdjybjqxqg15xyzr4s7qydx1ky2k7d2yxhiy41";}; +chordbars-70402={run="1l8m2yxqrscsnwp6cgny978l4qz4gg08bicfs386rgsfyz43qhcv";doc="1y0zr4hxcqbdm1r6yrsnkx2gsbcjagacpp119gg98h9y80y5ipp5";}; +chordbox-51000={run="09sghgyq6mv3w0m1vlcf82vjbdkb00gpiqr6iwlimpqjrv09bp3l";doc="1fykwcz8d0ja7f5px60qf7pfzfcw447mrfpbq8awymr1ilwgmz05";}; +chronology-67973={run="0jbczd5y58a6bjlk812ncb1ckcsq1d7j8ghmivx4pr5pfcx5lsqk";doc="0g5r3by58srdydm0gps4ybsmihayir3qf2lra569ywgxy06hqpn4";}; +chronosys-26700={run="0ii3r31dii1252bg0xfh4818az1snrzfx7h4ibr6rd5q3a83yisx";doc="1c120hcadb7xpkspmixhfrdlcmhl79jrf1wc0vsjqbq3wxjq1p55";}; +chs-physics-report-54512={run="19ci498mf3yy0xhmq4ghy8yh138dzs8953ki2mqn9hj6jjx71yfm";doc="1nfmbhp3gqmf2pdallpnrx9hqlb8cwkndfri8i0mh411hrh72jp1";}; +chscite-28552={run="0db7nrmm5r4b2cvcyjfra1fmskjaspbgymjsl4vvif9j3kwaa0ba";doc="1q5s4qj508nqy74cdcg8380vjbhs4v70a4jkr9wdirqcxjxs6yfn";source="009a8y3lxpxjhkd05fcf308k3fihl95pcn7r2bgy57jr4nalmixx";}; +churchslavonic-67474={run="1x3b3l8b0gbariw3c48pfr6ywfxh304vfbsi10f99i3rhl8janac";doc="0pjb7dpxp0nnvh47vrqydd5gs4ld11lgf9m45nrzs1x8qzlx53ah";}; +cidarticle-68976={run="17a2cqb6d3n5g3jhk1l5hybmpjhqpf7w0cr8f0w8kqwm2h7ciknc";doc="01r547l09fjhzrm19gi7xwrvhfglf9a0cl2v1ikncfhciy6dvjcs";source="1v9qsmqhb96b8p27bim3s71ybarygksifanwgl55vha0408s3zd0";}; +cinzel-64550={run="1v29lilvh6l5iynf1810p67qx2znxbm04wavj31w5q7rvnar81xs";doc="1j7i2bdbrfadw25ajkgkygkii3prybhp4qh5k8azbn7zpxl78q5s";}; +circ-62977={run="1m6siikjprch991sqbchbrmhvh2knjh3895w48wjp9par050cbgr";doc="1zmyxc0iz7ljrkklqdmpiax9alk56pf1i4dm6ljpyisd95blcys2";source="1vdj8qzym1ihkhm628zz99w6xwzhav8ci0vlckqpz3y91nkkpxaz";}; +circledsteps-67889={run="0ybaz7hl9v8g0kx8v7j8llgxvvhaj40afk5fi9733iv8m0w3mz47";doc="03426fkcxcjszpm852qv1y4kb581gdkk109cyfy7bjyx8ihrxq0g";}; +circledtext-63166={run="0c4gas41ddivlam1hsfzxlyqzicclfd91arpa0s8kinlnz27bnq5";doc="0ia4m8ss2idvzhgp88cbaybrzld0cg5gijl7nzd9fc5xsmybdjsi";}; +circuit-macros-69263={run="07cbpxyawy44ds1vy6kpp9cxgv2mlh78i1wakzw30q0bj4rksw7b";doc="183785rmygpffw0gb7mddjvswy3dbgp5yimd5ckxn193429il7p3";}; +circuitikz-69757={run="0k28z89mdl40q9q4x07p9m9w744yfbc3ylpj5khbz7w9l8s232p5";doc="03fsxa3q22mhwzdz5sh06l5glhvfql9304c9pm7kzwah6xryj9r4";}; +circularglyphs-68476={run="0d8hr1lns0973y61qmmz1hg9pc99j3w4x3iaqi0f0jlyzxc5j1m8";doc="12s7fkjlbbiica7svrha74zh3va390ay87bajjs0lgx6smqfx85n";}; +citation-style-language-70583={run="0baaznwvbml9ymvibfdmzwcyaf0rjkfa5zp0nyr7fr9zc7gvdig7";doc="1lpjflagpgbilcljcwwnbkq0xw56vjblnnlznsaprdiqivlfqhbm";}; +cite-36428={run="07nw7axvgir19ayi3zy0b2sp8bb9pq1nl36x0wv3nrqjilvgrwr5";doc="0pg5fc41iwqc1y9m9b47nh48fqp5dpnjbx14ny7ch9irxblg5d31";}; +citeall-45975={run="05nb6pywcrhqi1c9xfzkv46j2fq9y1lqmqawi75v3z56h2v6c136";doc="1p54cr0khq72z396r3vl0p9qqn2k82pmx4pjaszlzhni5v54hbdr";}; +citeref-47407={run="05bxlkylmilyzvbl99nsw16saqjsqb4bcaa68qkz8m59wz1ji4rj";doc="064c9zg2rhnym0wy2kxj0617mwb3mxpc1rr13lqpwb1f1qhghm6f";}; +cje-68656={run="0v0pya3nyj3phrgy0vrh9psbgawp823li0gvhw84pp9jg0lss6vc";doc="0w5lrlwzff9vcb0l44f5cj5763x8qb17j11kmbxy5p7zxz0j3i9a";}; +cjhebrew-43444={run="0my3jp6pi5lbbhn24jn07gx95laq2p7fqk88pwic7wwyji097vxw";doc="09ldma056ipsamrd558z24k63p187ziw2bh8qgy4na20pp22wj0g";}; +cjk-60865={run="0qdvr0sq8v0vi1vy8aybhrk7fnvlyxz9x9m63npa3nfcffypdv0n";doc="0liy56875383hjdada5bc1ni6w6ikmzkf5k8qg91l0hbkxxnqfiz";source="02bnfl8hydbb8wn2d54nrd6v4p9yrr4f6hkinyil5jnfkq9mryyc";}; +cjk-gs-integrate-59705={run="0w396gn4s8jlaz95cc3dzh9xsjiywsxjf87qwaniyaihssssl4pn";doc="0a4m7r52czkxp7j2zd389f5illw18dngdj3rkd8b9qlp9c4bq907";source="1h788aq405c44alpj85lyhmlnvdslc21n6h89vx5dggdfypbq18r";}; +cjk-ko-70332={run="15rl516bdcr5b60564f5sz3ab77hvx7yb1m56fkz5ap17j02d2ra";doc="03kirb8bdh693r6r421psa580an6hwdmf8lkvascgf2iwd6rayn9";}; +cjkpunct-41119={run="0wvqmf60gjm5m7fcc2qqz14lfzxcrqci3lrla96hxkqnqraiyb84";doc="1ja16xaqfg5158155flfvayr39k7grij13r1r89g59va53mpsgrk";source="1pn85n7n4fp2p5pq3w66kb5zlnjk1bdz7fz4xsa6z31d5216j39b";}; +cjkutils-60833={run="0wl33vh7pcrbyvxy6bfcjfv0xnawp4gb76cmq2304n9mp2w8dg2h";doc="1kkb1lkni0d7mb5hcnwkpwbyz7y9w5iy0z6rgm38lnkkm2wjhf7b";}; +cjs-rcs-article-69006={run="0lg0d2igpd1dbm2cd9irrb5702mvpscqf12bmxn68y778wym6gnr";doc="1vvm9nzrw9gidvzg1ab7riyxs98nxwm50kd0ih2zls8q6xxzy6bf";source="06wqrj29gf376mxpknzb6j7aqnnx9b9gacdq1bgd462spz7p8za0";}; +clara-54512={run="19g2vpxwjjc3y88ghw8yv0abkm69x6lnjj4p1cqbdjiyy4n83677";doc="0dkqqps72wws7dhynan243wf86gxn4chn1v5iiishkar33xvvlzp";}; +classics-53671={run="1l5p09agmrik9dkhwghjg8qh407bjw5q9hviykq7kf3y006dpzky";doc="0xp87xj7328ipwq0l8xgxn2baqm9zmp8dqyhv1iy68k9wgqr2f5w";}; +classicthesis-48041={run="181s8s8yk6y9haxz66ks1v6wwhpff2vs7lxrc8kshg1mn26bya4q";doc="1nxj2qflzs40mwnpd02bnbnh0ndm8rx12mr1vyyy6v3sc6g28yn2";}; +classpack-55218={run="045fl18pbqs3rxjp05mcmzhrqs94xgqnim96g8mij5v82fc7c99r";doc="1875ak0yjxlvsn1gs97np1vhy2jr2yymjxgr72p25g548sgi64q4";source="06r1kpanvp3y43jc8vrskba6qrsi115akw7yjal528fxn1lypq8n";}; +cleanthesis-51472={run="0wsib3c130m19r4z3ghipvgqvmfhi1cx86670ad3ama3rdmc3zpn";doc="0hhvak1l5zc4bj874rd0i6v15v70i3aq2dlv736csvd2b764g6y8";}; +clearsans-64400={run="0wd2lhl02svzxl099zfflqk94nhs84qb3b7wzb8adh2b8z9489c3";doc="1nrlrx6chgk1ysxcpvd1hb1qpagl3n7x9h0gzfjf0431bc3fxc83";}; +clefval-55985={run="1wdxl93z0svgg6h7vdhzqp74clcldxqh95yimqb190cbm6v5ll05";doc="1d1pw87hszspsfrl5c14q3c2iy1fkbh77dzldhajx71iqjfza634";source="1x7dvg6q0hy6pg05qpi2qaxw7y7a2dcfa4khddvbfcngp1dirrzi";}; +cleveref-61719={run="1d4qp3jl9mgv4afgdgcns5rr7agn5smiwqkmrasqchj4hqzwxhwd";doc="10wy2zndm51fy3d80cqnwsjxyczqjjffx61ir6ky3nkmiikiyypn";source="1qyyvn226dj4yq25cf5f7yzc3gx9qmxmnlnjijydgmmwam71s3xl";}; +cleveref-forward-70181={run="1wphc3dm1kbn9fw5svsxggplg9bf22qfjcf7k08r39fwk6s50pfk";doc="1548hwvsbwyhb9sx2xj4kqali3sfb6imr5c9dp9n4lvw8p395ksy";}; +cleveref-usedon-70496={run="0j2i293c13knmpv82g2b85a1y9003dxvizk073617qf312jb8bpa";doc="0kprww9mxfr45y311zky7gfhxvg5lrkxfg0mdkfgway0j2ljyw9x";source="093ydvc1mzkz0dds9fl107bj5mghdfjwb9kcfx8hw9ss9yg6bv9y";}; +clicks-64602={run="15v0yjrsnf4hqvmriffdq7x24cxk9l54a5s967nl4pqn1iavsqd7";doc="1givgqvm29fa1kvj556hfda3z1hhfzba2b7jfj46f8zsifi17s3q";source="18dpkhvhc2i7m2r5q0sp5m0zhzn1706zlknybcv3zxsnpcs1rar9";}; +clipboard-47747={run="1i9facsdigll3rzl8xv1i85cqyvlc54xhia69cv5cv0gly00p1dl";doc="1b6wvadihwglj0653bn8fnnq18whx2hymigvyknw00fyn3xjgvgk";}; +clistmap-61811={run="0xl0310x3wrk9lhwhbqnzi3gsvmbvk5smd4wq50wj691vmag9ivh";doc="116n1w0zfc6ad3nnq2wvjibpl4ywcfbgffax43vml5aixkpdlcq7";source="1cr6hbvln8mvrs6g8831153l62b4h1k5731s2d0xdm46wwmq4m3q";}; +clock-15878={run="0w5z1ffi25nabsaqh91glby7ifn40c9rhzxlz2kbyvbrdg6a3and";doc="1wp9hglx1vw8zfa182m2103xb0rhg9hmp51rc7bzm6fh3iyz52is";}; +clojure-pamphlet-67201={run="15q1hx198bxr5ip9ssfyf9wbccqrgwknijcbnqsm9mp082d0vc1x";doc="1fi2yxxnqlwsq3m66b75a16hpx4vs3imij175dwvjq1nvfg5y8cn";source="096whv58b2g15m6mzg689d0mp6p9yvj8z83w431zbg204h0kx0w5";}; +cloze-55763={run="1w0wydk9kimnihll4r8nx1kp6fccgmhybxl3qzrqxk58x4imp3sk";doc="1pprx0mdxfn8gwdsi03ifscinnvj7p3w8nwir20z5q5121clss95";source="1ijnnfq0xrcnysc9sf54nc9a2xg42jqfiqawb8a5jnc62dx9zwyf";}; +clrdblpg-47511={run="0p38c8p426dn4i40wwhi5hisx3yc8bqdi7vwxdbya02smixkpp5f";doc="1l0avfhvabq1mm9yqrpr29ps9iks84j7mbfgrbrd6kfgpdpqqhx1";source="0iphx9hbs4ld49d24f2i8dcyjxaqgvxznq3i34ik2ywampr2a5k1";}; +clrscode-51136={run="0kk8hsrd8rr5vadvh58fdlzpz29cnpr5nhcl5il8fj466dw0igv0";doc="08wps3rkrx4isg7abr6icfj9pcnhpnpylnk3wvwb42pqah8975xd";}; +clrscode3e-51137={run="1f7p04gaccyynqm0wzfz8jinsrrwn6i4amc51s835gxkjv2d8gwv";doc="1kryc0ay3bx1maydfha6wm4qw2l9xprnhs3901qbz904l21yawhg";}; +clrstrip-60363={run="18ln2mlc8bhhf96kqawba5dqi38f5j5s23qmp5dmpgdm7fdanlqn";doc="1mf6bcc17ivcdvy36ash33bmhh9fcry0w30bfi96swjq17740cla";source="1dc29n1m6bq5rbpf66q07nss8iw9mcav8s1gzc56j12ik1r2sa9y";}; +cluttex-68912={run="0kzc9xs7rn8x4zh3z4fh45d370k5526mr81sxb95jabsry82vn7x";doc="1ii7hmn88h4s0va8f4xsndvhkl03csz13nrnn6jlzl8rj02lz45j";}; +cm-57963={run="1i70pxbx7bp7lzpd4skdymv1a7h8njsr42v8l8jvh4bs3gkmlbgi";doc="1s5jagrajx29zmpdbqc6qpbcpwgp7g4c3d59ilg4sgcqgd9n5v1j";}; +cm-lgc-28250={run="126k3nr39xvgbzjws9x9xs01rj738lvgpy9r2wjvalxqvd2sahw5";doc="1xffcgb60kvbg07hsw3dc6kzjqh907fj97qrrj2586b66asna5il";}; +cm-mf-extra-bold-54512={run="1l1cm32z8wcpj0cl7czqkhnwil3ail7a2bbzn70dnswpj0ka8k9n";}; +cm-super-15878={run="0vpxkin8zvanasm0n6zzgmy7wssca6bm5yia2mjdi7nxzqyawlwr";doc="1ygbv3gwijyaaj8yzwxzsjqsfjdf52m3lm3f7rp1503d2wvq2qzx";}; +cm-unicode-58661={run="1y71gdk369hs2yzbfnj5i6yy2xjzv4n65vcfb8z7x596kpjm5jz7";doc="0zc7fv9p1m7dgi3vwkra2d8x18c4gkqzkd06gp9c18jgf0m6ahm5";}; +cmap-57640={run="11ki3gqlk6hjbpffmi2zdlj0rg5z5drcx8zw9nc480mxz931h273";doc="1ykxc5bg6s1c2p52fyl2dkmkg25ylngsfrhsw05yzskj1l8v32yh";}; +cmarrows-24378={run="19r3r86vdlkjgx98dsf8c3crq14p8ljdfq6cijqqsvj6p4p6nfy6";doc="0svllk1cvjn1mw68yfhbd1na6grp4hlqbybqnmw7igw8ilpshl1b";}; +cmathbb-56414={run="03da7ak8q3qyvwnk52mn2a79q2mfbfk0bfrkvmjpqnlagw35qmbi";doc="1i54xpnvygfmwbvdnj5wwd2fwfl1y4f99afvs283lz1ki2857aj0";}; +cmbright-21107={run="1ypjv6wfj1nm6wj6laniv304zri75q9gaik95sxbz0wh5cxzwgr8";doc="05cwyxmh6mqj0xf4awhif1vvms0j1lmadd1fgil7b14l46mcd99c";source="1y5is2678czhhkw4y5nrg05qqfi3n7fbric9m6pszfkh4iw0ml6c";}; +cmcyr-68681={run="1fdsd6ks48rvbvg44ac01z89rbd4w887lg2f9wqca1byx142jg3h";doc="0f2i6yzqy4lfh42y47mwqb9r4ni67bwgrrb7i7mfajnkcb6mi7rm";}; +cmdstring-15878={run="08wyaqfyjp482gwkwfq2xw3skazfzlv0nn59qri9728rmgykd3wn";doc="0236d4ngq70xrgsaxg0b0yqgcnq55blkq7d4hgw3sx6s6hkxfkn5";}; +cmdtrack-28910={run="0ygl30hj8rczxj8sxis9cfq419rscvndj5fwyrls3c1d2mnscizd";doc="03gp5n28lg10h6amf4vxamvnsr7hvrkhmscfcdf4jyp3kkkvnv4w";source="1m8kfxys9nh3xml6inyn4qyhqmw3h572lvlbh7g4z0zzqgiah3qx";}; +cmexb-54074={run="1hfslkscqr01dkgnckfcr8c04s053s6f8z5xk35lcgbqj1l7ygag";doc="1f6nrlnnq3c8mwsxz58pk05ginjkdjpgpnnw2alky20s78cc5kyq";}; +cmextra-57866={run="00my52lh3cn8bn211fpn7373b7khaylx4fgkrd2m72xgaymil308";}; +cmll-17964={run="1mv2npq85fmm8ff3n2czs1mfjqcqpy5rx6dwy9c5ra1nybx0a5ak";doc="0ps62xbzac6k9hk0s7wlk14iq70h922sxgagy5m8an9vqp94mjzi";source="1vhh0ds96n1yy3nby8np7v4i747cana8acvcnik1zz9h4xnf4brj";}; +cmpica-15878={run="1j8jsl3g76wxdpzsj8w68ln2i386cjzclcvvj1nl7z9k5bxf4s34";doc="1rj4g0kzy0ci440bjkh7b7lyh52xx6v737chzhps9w8q1b07wvca";}; +cmpj-58506={run="0hn69a35zkfrgy2gndhqlrclhx13c7515wqw28j4fk6ffpmn6arh";doc="06yhinxa4s8hswzzh7d9x8v768fzk171fgi6kxgm76hfi4ydlw9w";}; +cmsd-18787={run="0zykh9s50cgsxsv2958qyvwck5lw9s2a6fdx7yb14b95wkryqssd";doc="1mp1lxxhb489appwqsbg2g3lym4xvffg047lg7rpyw4msw3m87ak";}; +cmsrb-54706={run="077f185vcrklhnchlw694113fpgaxy8paxms37rp2br8mbhczy00";doc="13nd3vhxim71kcl2n02fcrm5vwakkrn0f5nfw8irl9i9r9bgy6ll";}; +cmtiup-39728={run="16wg8nw15f1pfcrm49xnna6finbvl0jr0wyapqg9i2jh39c1gizw";doc="0rr69cqg5pblx5h8xyw1zkap1fj3pmdznycplxx0kd4wqzbdd47z";}; +cmupint-54735={run="0y3pf2mbhxhn67skzy89850fhn17xr0b0ghcxn1ayq19qr66yrj7";doc="0v180y0j3md4iyx54fvjr7g00mavmkw6b99bsm07nncfq0anajms";}; +cnbwp-69931={run="02anv8g5zcsvxi3yqf5jl8061awszqh3gv7br7gjg4c9c8brj8y3";doc="035zm4hk84vn98fgxji8vrmpq7qih5771j6l54ij7ff4gxdal0nq";}; +cnltx-55265={run="09czgnx6jqn856sr0hg5j9azaxc4i22yp1dz95nn4s331khl3z2a";doc="1ly2cl3srazzynhikk6myzsfhffz3k63ddw2x9sbnvw6j7syd545";}; +cns-45677={run="1b9hs7svh6zm22vw5zv6nqmdnmw453xv15gl5bgm4n3f1pz757wv";doc="0zdjgg2njgcf35jvbhkfgiv3b9cccf7ds8d50ga3v1ia9i4h9xq3";}; +cntformats-34668={run="0mx4rgzk4av74s906andw0h9ga5zl2c3ip0vi4q9349yj643k2q1";doc="0015ynn7mw1y8v14qckbqkvb1fn5xqaz7rcs6gid1n19f1qsbh6f";}; +cntperchap-37572={run="0g7211nljimm9a5fvry89ch4nf49xhad9ka7prdmlpj87h9ygas4";doc="1fmq2r8ssvp99ykil3aak8w301qvh4nldsph389m7qar2pviy1sk";}; +cochineal-70537={run="09bhgl11ps6zw62y0jvh2pfddxcgdc92scv9irpxf2nvjlyy3wg4";doc="1lg1z4nlw3w5hw1ivhbbk44qg42m8s9470d64pgzgbgfsalyx4fp";}; +codeanatomy-65648={run="0pi4w20k4qcm3sbzpd2dsdpq6r0nblgjm2s3m2gclpmsybzmflp2";doc="1z9w6llgjnlmiwkz6ghv1cf2ilrfvj0r1k2c6kilsz4jcc457y3z";source="1vag4qaphfw0xrdl7b082iwj4z89x77sh62y05xs0f2bib9qlcn7";}; +codebox-61771={run="0s0145rdpqbbagc2klx2w5h6mlx4ns0qlllws31qbvy6byh65ngk";doc="1pj5qnzfa7725v6cixkznrs7yybc2v0ik9q2pxa4d25rpfxap524";}; +codedescribe-69944={run="06pvhd7v4p58hdi9x0ipmwjy84x70c65phvcbayfr0d5n0hrjvi9";doc="1ybanfz0zrbflrwdpzrpxk61g2j4zwimfvjlkkh2xrjvsmb95x6r";}; +codedoc-17630={run="1zz70vp8ssblnacrqdsq9nwvf1lw69mlk9d94cfjc818szcgi9v6";doc="1f3i3vw1cmdvgp05xckr748kzbairhvdpfvr844y7wnmxzr4rfzg";}; +codehigh-65787={run="0nls47d5md0b46xi1nxydzwf79xrqh6ijj06h5n5mb4sw7w5qylp";doc="08d7vyn1s4gqhnbz7f935n96ay9hk7k41w8msg8j9s937qh7fb64";}; +codepage-51502={run="0kxf5zr3mhn5pd8pzmzslgnngk8gms27ax6cqn1z0n35zvh0p17h";doc="1sd01q8lzrzgk9v1dyhf4m7a4fspjll3w8wwkbzp7gc693xg3lm6";source="0b38lcswx2x1jl6ydmvs6yr1y0kiv6gdicnbrx5qs8xhwd93bcag";}; +codesection-34481={run="0qp4k2z442idg0mjnancfskj0j0k75w327fixjgdq1kl9q6jm9p5";doc="1fs5qhcm1cil5cqi8dh04zxcnv2imq4m77287amq0mbh3j5h9i77";source="1qfnls0g4z3xsmh89wjcw31gm09c7yh1g99ksf0x9ml6yx1j8f3l";}; +codicefiscaleitaliano-29803={run="0im75yz3sw89ky5lcrcjhg6k6j4sgkjfn6v4srmqzcfdmn2qyx7m";doc="068234c0shvblzkcgl67a9s9whcbyjy3mjw60i8ljhs5z5wjrnc2";source="1vsb7dk4mlaacl9ls17lm4xdw27xzdgvng02gkfjvja1ja3cq4zr";}; +coelacanth-64558={run="07y3hgw3apkkncch9qcl71l5xaff8zqpgcwf8is7wz1wx173hafs";doc="0ylnvl6ya87aivb10z8sq2rw02q3kljdiddjfarx70mr1jzr2hma";}; +coffeestains-59703={run="1sfxi8zimkp76nc3fg7r3qyf628sh9p8rh2b8l0wq5aga20951n5";doc="097c2xgrgy95w7v5xb9lkgih65ji5jlxzdm6szdyqnf659bmibm6";}; +collargs-69284={run="1hiqc0gwligaalxacv7si4g7qnn06aq7c4kqf2gma01xw8mi61gk";doc="141glrca5d5dsi6azni6valbgvkdywh6isian3av7gm2wridi3js";source="0qxdlmf1yvjlisizpcpmxclbs1wxap1zqivvsxnycyf4vwf2wxj9";}; +collcell-64967={run="0f0dzdnmmi4cpyg2qfdxkdl83qrcsddpqm7z9g9mxfnx4lf86y3i";doc="0wyvhcw36arrgnwq7zc8vck3m37qrn7my4r6959p4i7zhpvsazzz";source="1k7s9rkbp829wlby7h1hwlv48bzxwwghcsnmlxrs7qnh374dwb02";}; +collectbox-64967={run="17bz2nh141yw4cffv1w6cdnxkgi6ilsr5fkzkp6h5glfibmzhi62";doc="0j9hs1q8bzm4p7rwiikc805khkar23722ylf00yb7mp5mvky8996";source="12llsyfksri5hlncmj3bba779jhwxxdr9zcck02jmrvx61d1znvh";}; +collref-46358={run="0q1g0x0bm0qjh568fp45b1ljy3w3jgy6s09ji1d1m5yrbs4dm7qn";doc="0vcfrdg9mqrfv2jlxh88g0nhpsrfwgdg9wjdn0l9b4c5h8zq030c";source="156gdfrd09kyxjiplcm38s3zj8v6bygwlpr9g952m0r72q7cq54v";}; +colophon-47913={run="0v8q22qxjrbc1mpsmfvdp13iwkjxp11cxs86h2b7b9rjs0cjxy6s";doc="0s2kz7q6nkwc19jyl32rzcbbcm7ykhkglanx010xfz08vgirk1pz";source="1z2dihgwd4vbk87n0hzpipm2359fwl1z13fjs4g9r5ys7iv36wsq";}; +color-edits-56707={run="0p465bc127rlm53xngrynmrxswzmp1xsivkfy3mj22h4ij6db03c";doc="04zfa0jryyw79rz9s1c0yzr1i8zla7ivvfw701f8la1rab7z6q94";source="0279n81xyiz4ipjbr1jdl0wipfy1lkl18jx8mbqcbwczw8k4fbn1";}; +colordoc-18270={run="1hay7bb0xh2n2j9clvbn5ayz3jq0yjaixi35isdsf9ysvj81rx0m";doc="14bw1g3dna2ykyv4fl32gvqjs0n75vlfpc9icdk09l7zhdspsvfn";source="1bssn8rjrp34nm6qhmzcrcn6a0ah9lv5n94d1jxqhhaj4pmimd2j";}; +coloredbelts-68747={run="1y4ds4n6b6avqaqbnj5yh369bnp1f0w4mhnzkjvibhipis7n11sg";doc="0svl3fr6df2mvqpf8gfcb2byj16hbf2szdnbi8scbvrww68jmldr";}; +colorframed-64551={run="1kys1kcq1j3c4d8mv22fgdw5l2c9ar3il8cc65w0lx4avbldw28r";doc="1xg0gbyh0ay38yk00in78q7mysnmlr4maxzv5lw3s88l0adykr8h";}; +colorinfo-15878={run="0ip7py03xrsrn40cgkl4dnj3q9g0f9fbw71c9rsg9j7vl82fdn46";doc="1185m34382n9rk6w81ppb414vl77kikkhwvn78aahlyli4il51l8";}; +coloring-41042={run="1ld6gknb8a59pkz50wlil5p11mnv6ss0zsjbajbw63dg0zlwaglb";doc="18y8apbkh7yqzxrzpraqhd76k93xnvgq5rana8lq4xh5z3f7skjq";}; +colorist-70101={run="1j4fpnxpi081ar0732dqgg2lyn7dic1lfs7nxhfg1xbhkxnv2ms4";doc="1zrx4vlp4w4k58rrnpvi7m4l0llwmml844yvj26wzap7l7zj2pn5";}; +colorprofiles-49086={run="05nf7y425f8ric57c3afq7ymc7ndxcdahbx9n32jnaz9j3qq2ypl";doc="152vrbm5km4ymj5h41x8cjyypj06g4xq3vyvmgakai9qz270dvyz";}; +colorsep-13293={run="0nf72pf2bjn8pcps45sn5dcjf1dkrww9wlpp1xbzl1h9i68p3h3h";}; +colorspace-50585={run="17pahq2wh9vqwpkaqkzc3ypcz90i9qpmw7867qz4k8a87sp7wgji";doc="0g766c50w7xpfvqpp6lxjc6lm2cyr8yl28g7n357j1d1lxgnv0x7";}; +colortab-22155={run="0hiq8wgqiwxnw1gsrymshkldspdnizcci56ihn22h0hcwz76hgzv";doc="1cj84k7cl6cww25yy2lynjrbicn0qy4y09rh6dx2zq19972fggi3";}; +colortbl-70034={run="1dv46n3r700khx38d9xxx0i4fj07zgvf5lkhr6jfihw9sjxda4jy";doc="1gmbqf9mignz5qprv94qh9rn4ywqx0kpwi1aagqp4h1wdvqr0h7d";source="01w0n3hl5m7gymcvf0w5ph2vla2k9b8z7y9k9xfnchc1xn4kid4k";}; +colorwav-67012={run="1dlh3ipf98nq5m34rj7naafnw9hhrbljij721mw57rbhbpcyazgr";doc="05f91rmf1kpdkfl0dgjag5cq5xvcflihfi9xj5y49nh65mq01w99";source="0rxiqp1q49l1dlr2npbb45jygp487zhhzjx850f68bw5vq8wz9j9";}; +colorweb-31490={run="1rz9ay86z5bf8m4j5w5prvvk1nmlaakj3g0qfsrl0cdqk7hwsfsf";doc="0vzcwhbq1a6pczvrv21z0q3y1akfwm45fclf0857c8jvpikkzb1m";source="1z0h3l9gdxsg6lbw7j6nqhafxq8b8smcn4nmq7ywdzryp8b6fbw2";}; +colourchange-21741={run="0y8r7789xaj16cdmsz4q0zyq9l09ihgzzgk4alnggsyx1ny45ybv";doc="0zj9b8xcnjlvadams6a2z3pvnzjci5l10kran8mg79ncvzq386cj";}; +combelow-18462={run="0s14rmmv44js6vc2l8h7gb9f8h5w4as71qgxbadaxw641xfs0ys3";doc="0pwrqhd8m7c2444czsllk4sqai3i2scll94y6qy7m51jvjycyf26";}; +combine-19361={run="0rk76f508pwhq4crcimw6mvqw40j31g2nsrxj17pld7ygxf9a5ah";doc="1kbvk5wdpjxw9slhz63pgz65kkxcn0lkr6i5gv8gcjh2w61xizq7";source="13z1yd5mb4jdsa3kjl49412zj2g0nkprmmv8d6ibnjg6zdf9s0xn";}; +combinedgraphics-27198={run="12569y2i0q2lbmnwlwjfc02x0drpa3vcy58wbch4j2xzv1cih69s";doc="1jn4vdnlz0mwjv09ry0phbisf5zv5valwd3779cqbh1dzpnpl7lq";source="0xacdk2xsdlzgrxh0sa8sgjkwhwasvahgdgjjxa9p82bfjhr1f4d";}; +combofont-51348={run="051xpkjszw281gcpacc5s6wpbvwx66hkbr5fpg72205raa454bjf";doc="076niz8w1i6zwq1938iplhcv41qfasqhw8darlr84fr08d3hjwl9";}; +comfortaa-54512={run="1kfxl806y2g6axx8csnd7njyd0skxx1gpw7fm3paz8yrzvyyw89g";doc="0irfhf9qw81m9x03nybk7br1nrsk4gx1dccd8ay7wd3sgw00kg0a";}; +comicneue-54891={run="0w2jbwfzfhbm5375852zv9rqih3p7grvi0s79sxr6gpzh7iyvlxr";doc="0wr71zjk337h9p38nm67ga8js60vqyqfslwn7dqvzg06p0741bfk";}; +comma-18259={run="1xaq59fm295wwnpls4qfw364qf9iyg97xhsvglgnnx8w7ydhr68a";doc="0g8jpwf1ilkbk59p4l372is00qwhfbsf8f3db1mxysmlxyf0m535";}; +commado-38875={run="00by3sskyr1hfc9wqazn2rii739bhl2fhlwwp83h6wx98h51rfx3";doc="0mk7k9gyv2xxd3l7m58dsirk32cn7wbmdy9c0nc6i1jyfpsfhmq4";source="0719a7bp07vf5jgx00cjdgvzfnv7wbxrxna2bdjjsfyvipyr4z8a";}; +commath-15878={run="0k3s00r4l8bypv1166p8jkdj1wrx4ar4w0y1fggmpzivqicc02g3";doc="1n2929g5jhkrrp7fs237h80571m31dd9x0n2dhnqfgynnc9vasrd";}; +commedit-50116={run="00anqgix8vydq5ssblg5w5i8pziy8fvlva2kpwy5cjjiqgpprcd3";doc="0vvnkp8r0xbsyvzps4a20fr43cj2559cs6mq7jhja6jzvqqc6mic";source="1kzc8i6nmvw7xwz9fbfanabypissbm7hnmmgp2m8r462ywzpa79c";}; +comment-41927={run="14k4y4abv5mlhn1i8f90bxfymp9vz0aha4p2gql148wj2hh7h96m";doc="1589g0dah13lw4p18cqprhfnh1184m79ddrgvc2l22bq6vb1dsb6";}; +commonunicode-62901={run="0mx8nsyiy7jbdqsjc19sghifigg06is99sys3xg0rr451rxa1kyv";doc="1c3xabrgpmff2b3yfrxj7sbdwn9jq71xi2s0v6329rwjd6vifwd3";}; +commutative-diagrams-68044={run="0vkcb6gbzfa42kxdz3g77phqi6j614zpdp0aiyxqxvxs2jk7ncpi";doc="0hbb7xcki43274s3ssjqw976cv8lmyn1gd4rlx5gnvc347r2clrv";}; +compactbib-15878={run="077l73vb0rcxy1n51r3wmcb7gma6nn3xrl543a67n96lpp5xvnnk";}; +compare-54265={run="0isr7gmskv55cr4f1fa7s478v6fh65q9ijxkmbpxj0448g9817w4";}; +competences-47573={run="0hijar81j2jpwk5j2hrgaxb1fnbk6qh2qb0qbbmhsqrdrfcl6xdl";doc="0ywq9f2a1fb584kpvzwg8b16qc7bpcn3dzsscs6ndqbgcy0zc2yf";source="01dccp2wqdy52kp79n099v9lh1vfambg0b63amq37ac68pwn3qp9";}; +complexity-45322={run="062xi5wlg3axhrzc9a6nj068z7nskb7qwwk2wr0fzvsflqa9cp0i";doc="0yzdyn9j1jk0nsw0l4r06cr4brhz1f3lfxc918zalx6h9wnkxi2b";}; +components-63184={doc="04yg9hq0wcyi1ag9y9m2fnf5h3n4fdykiwljgpw0kyc73bfyhq1m";}; +comprehensive-69619={doc="0cmw36bn6pjb6ajlrg2yz5imkrxihzzdkh56xwdk2abwzaqn09q6";}; +computational-complexity-44847={run="10as8msnqa06dp3hp945m42rgbaqsja8z4sc79x7n77z6qzmznvl";doc="0dq56zzw1xzzpm1rdjkqwhr6v93xiv00c1g2rmlmfj5dnbzng7wq";source="02mapvsz8j1979gy7pmwkdr6wq55v0al71ffl9bi2bl7f5nsz0vc";}; +concepts-29020={run="18vjncdrbp7m7m08dnfmk6sgv79jx83bc4yvvcqb0j9mn9niy1f0";doc="1bq82dgsl6gqnrs88dzg07dn4rmc4y5by8122zqaqpdrpjxhnvax";}; +concmath-17219={run="0m98kyji3v4gg1a30phmn7fwssnnbdvyjxvfpl36lnljnicpg28l";doc="1392wq35zidk71vxybrwjq79p2gf4spcv0qqb07dsgapbhr2g0aw";source="1zn35da4jlplqg7fb5ibzaah2yh1cwjqvzmx45jxg0hnsc7xmlfd";}; +concmath-fonts-17218={run="061kfzds7clbxyq62ilxwcrdkfghi2lx8afik7vi9gg0hysbki7y";doc="1x6wb92k4da01sv8b35p3bly9hj46hh8k9wr22m7lj3rxnndnpcq";}; +concmath-otf-70337={run="0qb0j7rxb0h8ym7iflmdhlnncbjkck2b13h2zwanik593npgjgg6";doc="0sysisasrln5lx9783bp0aa8vq5b3crlr40lpnm4hgvcwrr0007p";}; +concprog-18791={run="08yr8yk9gp35d0nvh54ysgv61s062vj446fyb87n8jipfm49mj2x";doc="197p2bdn1rqmxva56sagvb1z7kc8gwxr9zf612r6g8yb07xg5riq";}; +concrete-57963={run="06m8d6z5z3dpj9i0nvp50g6pn9j0m4n0n1j3w94nml137qghawyg";doc="06z5hh9ksr9jpkfchyh2zp8b827klb4v282ipizrm1dvlv2r1603";}; +conditext-55387={run="0g6clck3v75yvg7gv42w24zv18vi5jcg1q9k663cxldix77lkgbc";doc="1qc7w7xfpxarb82hf66f3i63v7ypdybqwg5g3j8qswj1a39cy1wm";}; +confproc-29349={run="1s4mv0g2x5mfxnkp0i29wa3ncbx9fa05qqf734fjppdzsgic079i";doc="021kbis3c73gnavrjhqa34fsbq5c94lmjym2d4ny2wpk9xagh994";source="0dpghxh9mq2sr7aqgcj15h6b4xh7x5hvdzph6606izpff8ac7h8c";}; +constants-15878={run="11naj0z8ppb6h07r7cff0lcmr8zgc29kp3x7spi60zi6cq2546gk";doc="1wgvq0x1kjgd0bs0024fkh7wis9aw9qryd7y0igrbgdgc722pjnp";source="01skagh044v62vw12kmibgd6y42z5r1glrsvi9y0h76vs52jz7hr";}; +conteq-37868={run="1h7b98qw9hl73gh4zidy59z4rly9afnvmah75jgvh0k1v1hm09df";doc="0kgdggc8gpd1h7kdbh3ala5kz8rs56bgmwgv9wvxsqx4sn19q2fy";source="1y0g7sj696d6qhcw8vrpxr8gwik54slp7lijbxz64ksqbw5xjqv8";}; +context-69665={run="1r8gkrrrq1ps1cp058m1jv8922zsx3hw6c5vsmxpbwckrp5sirwh";doc="1nh2yf7vb800cnnmzic5hmy4w5kxd38y1py1xjg7madphb9zdc60";}; +context-calendar-examples-66947={run="0asc49mn24ql4fk73089viy3s6wff865xk8af7h67ffsb5qjnld8";doc="0wza057wz18yf2zl1j77hddzimwnraw5wg1579ncksywvhnmx3rp";}; +context-collating-marks-68696={run="12vqvbp7ns9r5nc7p7nrlsll3jp3hc4xi9wjyjq8lrmd8ly3v26w";doc="0nawd3x4rl73s4mhpq2wd1sqa8i6k2n0a39sqcaf21zx99mpiqp0";}; +context-cyrillicnumbers-47085={run="1gk4ncbfzilj98s7k7s43k6vb3il511k434aj34fsvqh5x9x4aw2";doc="0f7r9qgfc8h92jprjqa24q4vpz4bqrrns3glhmwh3qmk1f2gyw73";}; +context-filter-62070={run="1vj8kimqsmn9xhkh22pywqbn4sal5gxpxjbcbv8xmxcrby02gsfn";doc="1f6phdqxgvdg9c6f37m654ha6i226d88i81147h9x6sh01i7qd0b";}; +context-gnuplot-47085={run="1pahxhbliz6fsj2va5pgwcs55b3rhsmfnjb9qjxkz3gqzrzdkfdp";doc="0l0qp9c0yvdrf8398wyac98ghrdc86lxgzr5l327gmgnk8572gxn";}; +context-handlecsv-70074={run="17sn4nq1fn3868xwnlg71fqx8cjfq92dsiar091635cl72f4fra7";doc="1fgi9sg2392syill14msv8hib1k349pcvbldiq1a8g72giqkf5w8";}; +context-legacy-69173={run="0j18agzfhwwzbdnqavphvrp0lpji2bv21qh28kcvzl269mgjgbc2";doc="17wsgg5zfx0s96wm2l9zca060z6p3mj88hcrw07vy44imxv3gyiy";}; +context-letter-60787={run="0bnd56v120h3c235n9v2h6mzvmd6fy1g837gjim5fkkqd7jyzp2q";doc="0l4vgrpha5kx2990kdk4pdfljznlczlji0fxqsxs292yb3yy5a4m";}; +context-mathsets-47085={run="11r30c6lpcvkx7awgm70cb5darl90fvpnf37hj2mb7h69d281hv6";doc="16qckniq5v52m36m05bpnqypfz2jn4430n5x5zazx54j8makv827";}; +context-notes-zh-cn-66725={doc="0pdizaybvxvzh19451x90mj81ql98q91f6cj8mfxwxa0mci1b9p4";}; +context-pocketdiary-66953={run="1pm8zaypfm575ryq0jzpnwf5p9zjg7hzb6lnc636cf16y97a1vkw";doc="1yy38pa4m7bqfb0r1wxj1g3zdmwzgdil35g2lw63ww15y03k7w0j";}; +context-simpleslides-67070={run="0dgmix9w576vxmffbm4digcp00vvdgmdxmxwjzrrkici4rq31w79";doc="17djxi04rhg61fjcmsz4yjp7mnc7g1fbfb9mmkcf7gk8dwzrvigf";}; +context-squares-70141={run="0l56p7zf7f9ywb66v6cppnqh4k6zlsvwj37vxcwshwjwl9z3cfmj";doc="1qxcy1qhk77p63h97qad3jvvfcmsgjm6b81cn10aakvl3sniy7g3";}; +context-sudoku-67289={run="0fnzvzpn2d24hdi5g18f1mpaqkyrcf8kvkprqdz1jvlkqld82kd7";doc="0dqzxcljl1mn7qs7hk2pahvc5791m4c911j5dv85fwaladhjv9xb";}; +context-texlive-66924={run="1fg95ihx4wbm38j4rm4p6vdaiib6n7lcf43m444r4nb5flbrbv8q";}; +context-transliterator-61127={run="137wjy0whfbwp95h4grypwxld7kxlx9h6l3bkd5bpfnqhg70j05d";doc="1snnrk0h6pwg83qzsv6mk3n5fmirk6rxjih43rcs290amkx8i49z";}; +context-typescripts-60422={run="1vvhd18qd6vka9rg048arpwn61rqw3za116k2yqfy4lnp2rypk0g";doc="0pll9scpcsxzwgsy77mbpw4s0yv432h5p0av70kr81zzskfxabxd";}; +context-vim-62071={run="1jinagfnv3aghjn8gsack6zl9d3rcycwqmxir5jdjhbw4r66yp0y";doc="0gc1m894ad0y8l1vis5bc9n6avg8npzlqa4xr20z401nxhxmbv6h";}; +context-visualcounter-47085={run="0n20r8315py52ghivwy9kh7g7yj4ixakmkn97phw1fxgz21jk6qg";doc="18ncq5d4chmnmxmhazbjh9ypsm4c3577vgcmnx0y1pmzgb2g8pn9";source="18yyv9974cxzpw45rzw6ia2jamrb07bzw6gqchdprdjs0xmhz308";}; +continue-49449={run="0vwz01gmbid6b2aj32qnz1xrlk9h0nicjv9ix1rvqdad20m1i4wa";doc="1mzsj70v9f6srmc8ja62pph9j67p644hl54fx6nyahvr2h9vdik2";source="1q835904qai3r49yi8hrfxkh4bjf6913qs5fd2dv7myp1w93j5ir";}; +contour-18950={run="0xb8a0y3jazrq5gxfnxjl7qkyaqjnmyhjshgngqcsrw2sq4j4li5";doc="03rxkl9vhhqa7gpigar8w2h78qvx4k68chhf0881ws3bm6lg15sy";source="17sfl4npipzgc7jwqx740nny7fnd8bv8k4vav9ds765ky1xcs521";}; +contracard-67201={run="1qvpz8ybjc7yx8zx4kzcpjchvxrb949rqb3905rhl61shpqv22hm";doc="1jg8kgp9wvxksjz9kxyh3qqxhgjmalkpj8y004qvrxna2r2idj50";source="1v6ffg84czajnl6p6a1j8khnfmzssjkhbndz5ajkww64iiw060i4";}; +contract-69759={run="1z0rp9xb9xpxjrdq2ww4ggai4lvfag28s3cmsk1c5w2kb5jqdjc2";doc="1piy96g4vplzqrsvczhm7fp4wmq7wb15l4hplqlgnis3k9a4aj6j";source="1dg8zqbbpdaawwa1dh3vbh1q0qlgid6ib13cbynan4sxf4h8f386";}; +conv-xkv-43558={run="13clac7dhg2p69ccv2yjzdh64yjx02y0fb0imx9lsd0knnb1j3aa";doc="12dln1r2qyadxr4cy3xbwn18s5y8yxgxid22wpb2i42n5qc8j1fy";source="02hz64vbcy7vg363vb86vydaa29g5cgji2mfpn640dgmqq0s91vb";}; +convbkmk-49252={run="1hb4ahbgihnzqmcszxlq67bsiqprrxa9vf25q8yz31j70sg7s18r";doc="1h1iqcc1rjcvwg9p7xg5zq6sj5bi68s2cknsbwr6dbkx25ihwi4i";}; +cooking-15878={run="053wbmf3xrhwjxp77f1myfvz3f474kpk626p8gds939yx50jqzvs";doc="1db5wxixparr81vanwkvg097ll58fqpp3qkh0wz7mbqjkansp6km";source="1gka18njp7ipa0jp1527mhig43hhvz5bcdpvs95c61cvjrmwcdm3";}; +cooking-units-65241={run="1ainyz58nk9zyfg4isfgjk3g8gjw08ri8d1x9kqnymdyplxqankj";doc="1r21szkygn46i5263k6qryb1fhg9va71f3dcqxw1dh3f8f2bpcpw";source="0cvfhbr7zjcc8d5r453wkgmvnqwmx3qj0gl606sgrz87zhzra842";}; +cookingsymbols-35929={run="0kz8aaf7bp0y2ph0iia5lkrxnxch9r63iy7y4zpqcawh1ajl10ji";doc="0dws0sdcg13jpz23zvkw6vfnc34qc1s464nm2nbdybhjwc9gdbdl";source="1l1jkd6mcxdldvjyk9myig4jsi89mg6n4ab6ymq5lqf25d260h0j";}; +cool-67013={run="0sz3n82js8fq7fiffyb53ib1y49k0pg6bkbzgnzsk698y5w34v13";doc="1gpa5im88apgfqyv1l9g4mcmw6fmryksbx4nbldwlwxdvkwfwdf5";source="0ds25c0k113w365f0nylliiq1h76i753lfkccbbibs41rp2kg4p7";}; +coolfn-69007={run="0y25dmrbax6wxzlrqmp1j3h6xnvvk0ls4f4rl5a4a3hi167yqrkn";doc="07xjbc9bj6chvjqv03p1c37bbqr1fjpkq468sx6cp0q6p45z17n9";}; +coollist-67048={run="174l3x19lajwfghixzxjizxwqj8z2q9rys9wcly79gs8r3pmbxwv";doc="11p2s7wjrjdpzpgyhn4jnx4d98nbmbccbn6q1b8g3gr8h4mqvdnx";source="08196xxbx6fvhic3a9p8bwrr3ir4v9ikl2vj8z97m9zryrzjv1i3";}; +coolstr-67015={run="1ky8l5g09cj6731i1x7fc8chp7qhpc35xcinjrajjbzfjr637pk3";doc="1aj48ym4rykbz4z5rhfch5cfkyj14x8wngsvwrhzw0m58hpfpn4a";source="0sxdiic0xcr148841ngzdmda4bgk9ningsf91ar517r2hfh1178s";}; +coolthms-29062={run="1z62gl39f9cvmwap70q05jml1657jxg7lvq81rgqh878z63d0rzi";doc="0zqpx1c0lcrkp1zpwl776hd8gln7i5f5m5k5kjhcwxwngd8w8df0";source="1bir9kbsvayk3xkchg7kjbwqkhda81vay9d70hmqxgwpa0l38j6x";}; +cooltooltips-60201={run="1apf2qvfs606nqnnps2rny9ly6y0hs7yv8injrbbk64x3nxk86xr";doc="11qjqqicakybmnqz4vx5jb0cqsj8gw86rywj7ycvg96s93zkh12i";source="1spsydk6mn3qzclav2g2al20sdnaabz9b0f01gq95w2qygl26hy6";}; +coop-writing-61607={run="123rbingcrgjg5dyafciwz8wm2bpl9bz9w54pi2jim87lgibnf92";doc="0jqrf8pnpsq8d432s7b3qva93ydf8gng18fn3drfbzsvb4sqaf97";source="0yhynaxvvhfhnx97p5p12xf66zng989kddlfw9pp6sv5alxfnvaf";}; +cooperhewitt-64967={run="1a9jq9mfw37qavbqynyqpsc1i0hnbxwy9z58ipqqaffblqfj5xvd";doc="1i3wmhs3y0qr8g5srknbhk2fwbw4lxa732f1fch4qpsqqp20hy7y";}; +coordsys-15878={run="12vpxh6ll7q2jpsv85j68ij0m3b0335hflpqahk40dagybjkp426";doc="1jcjvd577886q8sqzcsqil81b2lm31vjxhbdrgs38fw8n6q9g0sq";source="0npd3qqigvp0i5zdgizm68sr1g5xcplgwfahrkak0kq4g882qmdd";}; +copyedit-37928={run="1rl23bq3fbn4rajc744ra2prvm4rmh0wvhc7jjsiw7sw2hzv467a";doc="1ihvynh96vgl8ik237pf2pdfzclslrn0i7lc64skx3q7pmyv11in";source="0i2pwjj4bdfsykwv6bchp2p7x0gpdbnyx37ri1d27vl72yi72pw8";}; +copyrightbox-24829={run="0n9z6dngf0z98bnzn6nl8yvy7dh1jmcdbqfxnzxarxzqq16f99ch";doc="1clg6jq9cja76j5x9laykndfqp0i5a4bfmqrxaa8rp6y2gnvpign";}; +cormorantgaramond-64411={run="1jdqzw1jd0r0qc4wnhm85kg0nb92dgvwnjyqlxz67lb9wgwddlk1";doc="0j6gq9xk9p2m8kwqvzjsh0s5z9x4q6v8klxygdahwgahvd0n8dl3";}; +correctmathalign-44131={run="0dvgaqy8pkk3plhqlxgkxkiwyhfzwcyn391grbqv764mvh4iar69";doc="1fd32yzxj3l4sp5cp9rnwv3175jz5m5hxwlfm10x282g44l7mjid";}; +coseoul-23862={run="0wqxvh5mnrl59ry0qahxzlfajgpp0yj27h0falxnr4m5iygv7699";doc="0l3z0fxsdlln0hjwkxf9ka9hw8zmmixml9lfy4kbrn88xq6z62yw";}; +couleurs-fr-67901={run="1479gy549yj0xla35f7ryvh7vkxppisvi4kz7ji9v2219hx4vkg6";doc="09fh8d9bgh0gmabiq0d9l7flkk46w8yzqksnfygmbprib15b65ck";}; +counterz-67335={run="1rad8irarp20xah97ppzipns4i2v3smd44sbfi2jy5dc0qibw0y9";doc="102axl32lgrdlav3fyzsahkcikmapivydbfwm3wkib624i1f1h95";source="0f8gspf0m2b78fr0jq7n4s3y0f80l1pc3qr1rzjfs6xdrg1nv633";}; +countriesofeurope-54512={run="0387czqiyawxcjqh22czyd8f7y55kcrscxmp28rcm8wqqdh2ra0z";doc="0h06f5rpizsdqddqdvvvh5p3nhm4y5aixjnxl8s0b90wpcldwrpg";}; +counttexruns-27576={run="0qmm8902apb9ks1ik1dxmzb3ivkivpj7a8f8mkn5xdyxbnqvm5pq";doc="0kpasflvbal7x4r1ni3jf30fh7w6wi68109m5ajcjqrjzxkpgmdm";source="0840fyw71mw3l5k5g01wd6hn41a079f83wmbyg64f4yhgjdjxjnf";}; +courier-61719={run="08g6lm12b0k6333pxcaqdf67v87fz5mrqp3jgal8qhrls5ym8q6r";}; +courier-scaled-24940={run="0gfqc90fq1nk7w5rvy3fqd5799aaxh48ia4wxcf01bhs4l7nrl1i";doc="17zr8bdv5dv8hybbjfvkrn1skn6xpl41yfrb4q1nq491nwbppb14";}; +courierten-55436={run="1maxj7wsjqh2ni75pjpzsbwh1f9abndka1ilaiwik1c21kgb44g6";doc="1lq4clwd38f8l4722khgnldjfk11mn1m4m82ppb1qk04qyh1v8sp";}; +courseoutline-15878={run="0mwv6bslzgm5ys4gl32mxcw42gkpzwkzrvxk6934682v85qi6f4k";doc="1k135zma8aacd0mf6l5v4zac2blqzf6z5xa40094by61455x48ha";}; +coursepaper-15878={run="0n8gikcli14inz5q85n6k63yg6dczlpi837mbxrv5552hqzpivwv";doc="1d8k6yj45x0wx790y46b46nhjb3zvv2ncbkhlzckq71fsi5ayp32";}; +coverpage-63509={run="1739rmdrj07q8s9xpxarwwds13hciyv3q41p18cm7md8qrdd74xk";doc="19hw1mx7ghigybh23b8v65y0zx28p9armynkw9s7mgpbsq0wld32";source="0spllq6j5rxqc6a96x0dx3n7skm4gqpp6fgas9vflywiw6i5vk75";}; +covington-69091={run="0imdahq466zkhjnxgnygyq8s3g2k8qanm8v9k2z2fcp0hjwz2rkx";doc="1qlxm07hw1fbch6acl9rslqsl1vh1h5sf41qpmnfkwy654h3iqv4";}; +cprotect-21209={run="016z5zz8njkk2cra768jlh2s9l3r4wmn50nk3psmk3v0i0cy0197";doc="1wjyrb0z85yighkw9a1pxxwilp31c5fjra7y07y0v1z20q6g3rlm";source="0lrf75hvlp6jpwfppkj0dwv7a9q51n897bwrf3gzwswb7icvqnf2";}; +cprotectinside-63833={run="021581zdl2c4j6crp9cnrnvxpwdx0jhhx5ab2ax7016hzsxff8la";doc="0m7hhy2wlagymkq0ckr6yhiav02y7b623gd47wkk75f48rm0lbdc";}; +cqubeamer-54512={run="1r63ahd6m6ll0phqaxc02hnbrf3f6xjdghrhn7wdqxnf8n9k34ff";doc="0rgfjw69is9i06blv1dr2ki6d8lgfwg3w57r3620r7yffj7z9hpy";}; +cquthesis-55643={run="143w42d3xw31dy8wdpqx01r8q9vs2an1ixnyil8n0q0af29j49bs";doc="1b7k2s3ils5s5yb3fdd6h0is494pss7s76awfn3dj6yxiaps5zvn";source="05gypg8zsdpfhp11rk7nii2vdw4rand5lw6ijkm23lbq2b5nwvwj";}; +crbox-29803={run="0ni16ldwni2gyzlivd5ii2fdq15h6np4mv73raa5g76i5rw42sbb";doc="1yk96bajna3ihvyhx482jrwiccbmqdr9852w11x00xkcvvc6azfp";}; +create-theorem-70180={run="0lrky9yb0y301w5m2qc67x8adrkd6p9l5wwjamwdslb59cy8qn05";doc="0p3xkfxnvmn4l6fwp1nmzix5vvqjwbskpdncd19s1grymhyxay2x";}; +creationboites-68087={run="1mmj4xavpaqrim5w3cqs0nkrfvg23578nas2ndnfvy3zgjywwxxw";doc="0xsr0nvs95awhdjbhfd9baj7cchf3fx83f4cv5r6sb0l4lcwg14p";}; +crefthe-70165={run="1kwl01gnfr8xwk2zra14faqq4in4wijc03g5sdvgh2c7a9j3zm00";doc="02ddnb2399bps1qm8m63laixbrx6jmjnw7x2ivnjwlm2jg7zvhj1";}; +crimson-64559={run="1k6ff9fb5isv2mfm7zvnqziw1rlbs8qmqrlbixq33nrab24kb1zi";doc="1fmfghyxbihw6ggf4x2scx2g7464bwqy0yql38m4r0vmmjmzi34s";}; +crimsonpro-64565={run="16jz8i749gk7s87h2b78nz6cclmgvfn35kh3869rsf299y4dbkx2";doc="1y8qngb1v6paqr643kh8sdipnp57lkbqwbk62r8nrxps2cvw06g0";}; +crop-55424={run="1hnf65q6mg5fq75l4g81zvp4qqdb092zb41m6nl3zw2cvp8gal23";doc="1w6ql3bnghj633ar1zwbv580py4f1fmdm4vk7pa3q7vpnrwrgh5n";source="15fxivp8d1xww6j5nbfkmsb0b2c2ldmkdy3ikw3m6jjk269nwy4h";}; +crossrefenum-66014={run="04zx8gwgzc76fsq6kmqy08gak2fqjl5h7d0d80lr5yvmq6aj5a4f";doc="1lsymlry86jnzjifjsnwz0swmksbv9hfdvjhy2i476i2ayvpdv7k";}; +crossreference-15878={run="0xc8d3g8j86dzpfxzfcildiyk8zi2apc9af88v2zg6zjra6vra1x";doc="1iahzjwns9zapa5y7z6yy2wjdcy6qiqrqvp9q9v4ky2zgsf7n5pi";source="0yajk2dxnsfy74r6a50zs4lc064aha0lzfqp26gpgnsx2h0bvpix";}; +crossreftools-55879={run="0pdhi9yij4n6bwcwbk077sdvwi1v8ww51g2r9ssfnmvmxs4zjw27";doc="0q80k648b967q9gcy7c3lb8ywk257zbsw04kc2gazlc61scviy49";}; +crossrefware-69700={run="1gjqw69rlyk85qi3hj9gdd94gx7vfb307i4bjkp1p3mqlx17vkas";doc="0iq9cjlv29990vjwgravv7bw28fxs5sz0krpa3ffwh2hmk76yh63";}; +crossword-64375={run="1jx01w062yn2bpnpmq29rwgxll00x05rb2i0prz7gnhfv7g4iwj6";doc="012h0rf49rlx7kjjv5i86jz5v36ln437ifmzv0hh1ww6lg60phpz";source="02sbn4clwrccqkr41azpzng7ck4q74lhbqzcd75zdv59gll9z3r9";}; +crosswrd-16896={run="1c85733q3x56s1fvag4kw39r6lnx4hr1wmhsrjs0jnyf5j6lf38w";doc="1abqbdfk7c7cx1ij56q8dhz87bc8ppb3hkfmc2z5r6zv94l34n2i";source="16didvmnjfbd103skc6i9qbim4kav9vw76954yfqijz1q74c880s";}; +crumbs-64602={run="0cka3j6aaxbgxvv3z7010myr7kdiva7jv7m1l4b7svq6j4md38vi";doc="0rxkzcmgvbm4mk26fwiw1wzng5bkf7byh43zdp4dh0mx82zn8qq6";source="0z88phhr4a0gdd3i4b5mvhcfxc1cy5sqpx7nvf1plmz34amiwcz4";}; +cryptocode-60249={run="09jivxl23sxqpa16m6mla6zb584607ssr46vfg97c828s25n4rz2";doc="1ksjx6zcksrsligx58vg3pihylj22qqwan4r4bk7zqdwxwww88l1";source="072cqf7dhjyhgw31l8im95h2m601j1bhm4zfl0f2q7yzznk4jr54";}; +cryst-15878={run="1jd8ny0a0mlhjdbigkkkkz1xn51s3l8w3dpcx5kwg10m29b3vwc6";doc="1rdclk91d2hps0xiqj4p0i4najjz9llq0nr9qvlj57h7ipyrahcj";}; +cs-41553={run="0nzzcg1yvbslhqm5lsfcpqh6sbzkmnmmgyakg9l8855qpa8g9bf3";}; +csassignments-63992={run="1mwaaf1ap05mp0lalyk89lyhqs26x4w1sx91vfsjxf697lndadda";doc="1w2mhq1yg24xz9a5ar92sky0b9j51nbb8k2k2ql114wafrkzzrnh";source="1k1iynw5nnnffx26ba5ydaay2qcz492yppcl8ws98xwhrqpjhx66";}; +csbulletin-65250={run="1fw2v0z3a9lskwgbh1kcwv9jnmaz6pf3w2hg2b93zd8mz7wifvab";doc="13zdp3fqbmqil5scgdcy0ngd6gxvdxs3k8ngm6xq1bnq7wy1284k";}; +cslatex-67494={run="1qdcnf755fak3kppl02yi2q9ghb17kxr2cyxc2y80idaafqgr9sf";source="0ig4a8nksmsm7pb1hxfy6gksfv27bgayqx60ygiaphcz0ir73546";}; +csplain-67934={run="14z479gkiwgw17pdghrxh5q0rlxnij7ccj49kgf3macwgmh5lm0r";}; +csquotes-64389={run="1zsh8z36capzkg695h2h7h8359fiyyafqa6p5m916pmz3vv7sfaw";doc="02f0l0w8k33sgqi6ml47vpqxlpssi9md0z2dm25y0q1ghhyyl86p";}; +csquotes-de-23371={doc="087c08c44811vd8p00l1xrkg5w6fsl8as64jq83m6gf1hfan9w4c";}; +css-colors-54512={run="1q3vmcppk86v2y72g47ifp129fj4rgdq3rvzgkzdzwhs1q06ipfr";doc="0rjqim8zdmgrz5dff8bjkz9kk456l699k5nplhc8bxa6dn7yrfdx";}; +cstex-64149={doc="1vsbq9a31ymvrj0bx48n93chyqmma3q7b49k7dmhb0hkic6h73aj";}; +cstypo-41986={run="0lfg2c985h1xlnx1fa3kx1jjrhw7kmgwvalqh5127w20r0lrh8c5";doc="18yx6l49qk1ayaz13qqw72r8l8z348d20yqdm305nalhqyksv1bb";}; +csvmerge-51857={run="0fyrqx85mklws5zny7gmmyscnsivjfvwmgwi52k3jk2c97nvsy8z";doc="18pmc5h44jmlh583cg0hjr24k2pj369l6ya4hqm9kwka0bhg29nm";source="0mggp5xankhif93firc5g01c6b160bkwqwbhc04wcm4ndlamvip1";}; +csvsimple-69494={run="0yc6lr52yhrha4f70g6g4dmx0gb9hb6xrnj971xms29rbs2azpdg";doc="0l6k9r646qs87ps0fd6hpy3xj4kv1442gmm50b1sqcg5w1hm0sbx";}; +ctable-38672={run="1xqhq2ww64h8vpqqzg3zbhh0z7xpjbcqcvxxm4a6kyasyhc9iyr2";doc="1nfdrjjb3j1n8w3x4v92v9l1k0smnygwj47ry717qgf2sq7f2b8n";source="0smcvvlq8n9ahx0z1kmf37p8zi5bjsh5q4x5mk7npay96s87z9s8";}; +ctablestack-38514={run="0b739h1ndkisr49d8y4q0vnbl9j3diqwl9r1ah8wk2za1ww2mi54";doc="0qmshnvbyfjhi8bb989hbffwn3447r91jp46z1yhhmcbjpr7clk9";source="0133xxb7470lyfssi1kp81yr1zsz4d8ai3qjy72wki0p7ijkypw9";}; +ctan-o-mat-51578={run="1iya9r04n18i8jdzqkn2i1rxfxxmpzcpga03rp0i6ykjj65v4q4r";doc="1j053gvvcznrk0fhg21ddyx1b1m1xj743b3w8z01lpjihihzq0l8";}; +ctan_chk-36304={doc="09ngqgs08q8bld334jrzhnd558lv7fajfppmfrkp4kv9hc5iyz9a";}; +ctanbib-68650={run="02iany03amlszi53svfv1mj6iwjv5lak7drgxcccai2bdvc8lazg";doc="0p9w2w064i5ykydkayv5wbdxziws998y8algms6gyz38rbmphv2c";}; +ctanify-44129={run="159jchim2b5idpzj5fxxc9hvrbddm6n00rpqsqffzdiijvp9jbif";doc="0wnyp4rl4cg2wgaq83xwm0vzm1b5xlgbrjchg4s3glh2zzl4mpg5";}; +ctanupload-26313={run="1dvqr96ir3gakxrf4fk0dka80inl6aj3kydcf0128vlq168zgvsg";doc="1gzfib72lfbgzcp5r8130k1n2d00v2kds0x8zdkqnikn22fq4jxm";}; +ctex-66115={run="0mk0iix0wygznqhzqd1wzi7hiabr751i0q5xrr3k1nmns68y98vd";doc="19z979xk8mylch56d2gxvln0w7vrwfizcf4apy4kpbm1nhb90gaq";source="09y03idznj0qw2ik0hq3xy1v87sl3xzgqfln1cnvk3c6mmfz9j7v";}; +ctex-faq-15878={doc="15c0g0x8w7vm3hyn6lk60jf66akyfcq6x8jc2lnbjx8ydwgb26br";}; +ctib-15878={run="0vm3aw2havsabkrr8sx4m6px9hi189vgsmqy0s922dlm479d8bcy";doc="0q7jss1ai1jjr66yk5927psyvvmp1dwbr54llvwyc4z131g7qrnb";source="1im0zhrw1lvzp9j26d9nh4m1mjhs5by6nai0dh2mrmdjw1i2222k";}; +ctie-66186={doc="1avhvyv70jds5xzwp7p1km6d8yha84ckqdw1r1vkgfb959wd3yi1";}; +cuisine-34453={run="16kvfkx5sj6xp5dz0gqlbp5079vh6snkpixmphvz2gzyaqnmafi0";doc="1mbsgn7mvy39pwq5gn7l3h6l3lc53vjyqyvc50xj8h9gs1gpdrb3";source="1r14f44bjdry108f6iy7byzms4dybc0wi936dwkg5ahwyq07pmck";}; +culmus-68495={run="0pj51p0pf4lr9997ilrb8hkz4ncdpml0k7zg9lmw4phdy2bh86ns";doc="18a8h3lgdldazj4mslszmqzpglf0vqpa617pfqa1ga1yf7qnh1fh";source="1mzijc30dcymm2lnzzfci1f99rsxwb8a50p6fd2qnynm3ixrvw6s";}; +cuprum-49909={run="0gqrwdh2gpxgc74zq97zm728ykadkrl066v77hjllmw7x6cjxrng";doc="1126yz6ks0rk92jcsbg2m3ibvv64xznrii9kxf6ss36hm1qwkgbi";}; +currency-48990={run="0673ji0kw0j0a764kjvla157mf5lcxa02wd0ypj82gfz617sn0r9";doc="0v8sfvj7g65r7iyjijimbg855rbbg5d1zdkp7vc58q14y8f34a8c";source="00p52nbdv0x1v71fb0ln63wb9mxdhy7zgagbpmcn2ca3xb83m16k";}; +currfile-64673={run="1mh6dcnzhfsd12ail2wjd5gm79rzz8kcr26x8wya4lvjmdzbw2sa";doc="17bfg4h6pvwhr589pq7j21yawxv7c04q06gw1yf1xsi94gg1mwv0";source="14sk7mh2p25zjl6sxinly5zhj882y035h662vf3qxs7garijqsfk";}; +curriculum-vitae-68211={run="0khwnk2mddfrvmn41y2d7p8704iidyaqzk7zri9gxkrhhhpqb4fk";doc="1zdlq51qv0vds2l9011bmwyvcb1a2lxjffai3vsjhrqvxj6aljj8";}; +currvita-15878={run="0xrcc3pash4g8mkmnzqi0llhix63hqk12vlwn98ipww68qnhfbky";doc="16v8r2vhvb9ssmnyj4zzgv2b2m10d3zg7wm2v6cn0p65hn5i76f1";source="0xrsqmaan5h60970d12bwm7k9nlf7h0flzmqhl0j3kbnclm0x8w0";}; +cursolatex-24139={doc="048s5fg8c19s3zbl2dkmh8ffkicb8fd9n46m0iqrc39i0wrh7p12";}; +curve-20745={run="1h1mfx67i3d2jr6l8qlfys9m6bqzn4x1wb74cjbrkdclyqn3lmd7";doc="1jv8f3izp9pvzh5qs3sh33c95v0z3wn88f278qxi0f1bc1k8990m";source="0l9cq8aji7z8qh0p45af8rnz0iw9m1hgc118482x699iqrvg96y2";}; +curve2e-67599={run="0cd0w4gkcaqswhwz8w011pn2g0yl96h8wm5m92jp646xsbq4a1r8";doc="18gcvpdckrsx42286xcdjlpmlq9s0541xkc8gx9f7s2gvjia8lr0";source="0wdqd75fsrihrdyg0h8hl99xlxgphwn723zx1rm73vzh4c5mhrqc";}; +curves-45255={run="150iv654y4x5lb3njd7dfjf8i0axlpf7zz6gx4wqgq06kddjr7w7";doc="1ddgy7gzw2871qsh99m0k90lgh8kf5883skcqxww0bl7b335qc8y";source="1r9c0rpi7q6ishzaaw7qnil0lzqgdvc0ybmr3j083af17snkq0v6";}; +custom-bib-24729={run="1m25bdq11g8jin9qfib12h77sg8lb87p5680d5dkqzsf5y3iq7vl";doc="1ydbi1r0jvl936ziypnjqw4fsr7gvc1gksaqr05wj1bchh28cyaj";source="0sjpwz9zhr0kd4qn454nm1s4rw4a6n4qnackkrq4qkriwzv9asha";}; +customdice-64089={run="11c6gzpmwh7q8dy334i2mz4g42ly0iqz6vh3zal4hi005js8n0i8";doc="1pq06p85kcki6rb5pvijly7h135mh0kwaxq8zz23l9c3lssjpj45";source="1ah7iacvkvf9hmkdysyfm83fzypi4j6myg2a215hajda1fxir3np";}; +customenvs-68637={run="0z3rgjsw4qdpr028yv4y0yscci9611c32rl3y7y6v0n0jvv43lvg";doc="1cg551725icls2x4in84g1zr8ydbyz2g5al4w17dk225k2f8vgfc";}; +cutwin-60901={run="0camjay52m2fbg4df7rrswfn30an4s40bvyvssdcmhmqlbvsh46f";doc="16wmnp2p3hnl8aanm29sxflqcz03qc5vlk9ziq38qxsksisxkl5d";source="0lqjiqlfndqmjmhj5p4flhly69cyg175s8wg2gah1fcfv0dayrn9";}; +cv-15878={run="1w9gx9mhg9wp47rhb6kf1w03mypydp01rxmypv6yvcrk551b5jm0";doc="1b16zaypfphbn9x2fwh2v0i212jx3pn84vj513lkxzzfh0if78iz";}; +cv4tw-34577={run="0nli9s73cns9x44vr2npb7zgfinnywgwajlr1k2hf9jldzm09dm0";doc="1b9zd0ky6h8mlcigfwj49c4chsznvbycsphs9lkpdhxv8mx9wgyq";}; +cvss-65169={run="1ja7j01vbzm16ms6hj0013q9f4wymzmn5fwdmly2mipgnfir79dg";doc="0a664wp1c11sdyhjgz5l561ngsnws5bgr78smswf2akj89637lnw";source="0ig8igf03vsi6mqb9a6cikqqipm7ja3ipm30c1gfinqvkmdsz0jh";}; +cweb-69586={run="1frjx2vsa7sdz6kvczkq6wkpvq8i59l66i3s8w2b3ikp76cmqnkx";doc="1bqzd57l1kw91dwl2l85760578jqpynicx2qly92a8xp92w5y9vm";}; +cweb-latex-28878={run="0cd2rgn25s02p2ga3509pnbc70iad936qznr2yl5q6wnlvd78lbr";doc="0vc5f0h9mq7p9040ksql4clcb9y1dxq7s1a4gzgpsjyla05ps3qd";}; +cweb-old-49271={run="0vx235zpflqpnrfa9kqq7wmc1rylg5bw1r26knfzvh3w1swbp4ai";}; +cyber-46776={run="0vlx0r57ay6jpybs6wlc1w1qpbd62cjq3snaqplaj6dkah98kcbq";doc="007g12qa9v04z3b11cdrd9z7pc7iba0aa2g7z460i0hi2fg4gv3l";source="1kivc83wjpm2rf2myk4079f1l8pyw1pm9a2j0iqbwshic2qfm86q";}; +cybercic-37659={run="1g7iv7xyl0a30kjmrwvcz2kg6y7q3r51344nf53r6ln1asagm68r";doc="1nman70rpgd0wqhgw84qg8acm243y45nhxd32dmh9y8ywabynvc1";source="12pbrk2bmgv25fa0llpk6pfgmz5jljmy1w5b6j0md0ni46ldjxpb";}; +cyklop-18651={run="1krjgk4a920bpgb7c6qw6jx5b7gv97raxpaby1vx1lh5zvbybfn0";doc="1fnsd0p8wp58imrn22zbswk8bdjgp0w9v4hcv8f7x5ks1czcas8x";}; +cyrillic-63613={run="1bbmw2lcr5ndbpkdy78y6fd30c52g4md6j5n6kq23fxxxisgyw3f";doc="1822d2kbik1h0ma6vignick4b4vwihbk153rwwgik82h57nhbr74";source="0h65281fcjzx3avppwxhr2y8w5kbnrqp9mmyijq1jdlbmnn7jwzp";}; +cyrillic-bin-62517={run="1m8ci739229igk1mgx2n5dqywijfs2dxafjxsmlpdyafj2vbryaw";doc="1nz4mvic87h8iarm83lckj7hx44ywq556y01apx9biq7632mfpjh";}; +cyrplain-45692={run="1wdcibxs0g53warxs6vz39s3chldzh05p7v1ksskppghg5qzgh8z";}; +dad-54191={run="1sj53bp0fp8d2d3qnwvl0lm7c6pzbvv8ds9ww3x6qhrna630iwaw";doc="1yykrywq662s311l9daq9wpxdcr8l6qifi5bzbnv0vx2372hhhw9";}; +dancers-13293={run="0nni21f6y9gynx1lsymb3pmh6w761q21idq60fib90hvv9jjd85q";}; +dantelogo-38599={run="03a5l0hdlr69knnp6q464x9610mwjkcl3cw3i2q10nfm5ywr7nsx";doc="19y2vbi5wwia1lg16rbwzkfd2chi9vw3m3xig48h0bsyy5y9pgbh";}; +darkmode-64271={run="0pdfdc1mf1mircrydvjlanb61mlwpv8l256g4yr4jix83373hzzn";doc="0as8lm21znzpfdhf7880fsvna1ivprd5q7jc5mlyva6gny6zf3vq";source="0yy8i2qxk7ms53mw05lk8lq1wal1rx3431wqfw4w2v74xy3jpmcx";}; +dashbox-23425={run="034nwqqbd4q99mzdd6958w6a3jcvvpvamdycda5blh7in1gwm1b5";doc="01zb6bc407282xhfc6ccrm38jjz2vyl96h552435b6cap68jv48m";source="1lgpiyfizg0vgfgz51wk3mhhc344gwra79k1xp95c2p6w32bgf5y";}; +dashrule-29579={run="050scy57rjz5pvwd8bbl4h32w1paigyyy7dazr33v28061yap9b2";doc="1ryclmf2l90n20qf516p4qz02znnp5rgjx6pfw4p3wrkamnh6xwr";source="1f05m420qbbk25pc5snh3nb4dx7bd38nwfix1p8ndngn7l9dfkcs";}; +dashundergaps-58150={run="000fzv5a00nap8ybzyijz7kx1ky4qx418jmkmyz5nm2rpnz8ckg9";doc="0zj18ikjshyd9jdrn4a8h1l8d9kypr38kx2cfsd9gllppp27m4c4";source="0n43mz7bnf05j31p99dmxr26rl6xzkc4maxra1aavg8s19x9pmd8";}; +dataref-62942={run="1jcbplf8f5952gzd0p1nq9bsi9iw5ix2mzrn4z3xjaazggm9im0g";doc="1pczh1h8k8apmi1kfdj03i5yhhpncg1v9w0wb3dhzfx81fi29xc7";}; +datatool-52663={run="0c4f0byqwfkldxc1430qixy52xsidzw8s78igrxxrqhvvls4ywh1";doc="07gg85s1sv5zq1n766av958fc1qqlc9ifmyz8kd99b27yf9im4l1";source="1w5rdaqnx1mrf0vagxq5gvpxskwm5m4mbj2h4xhz78p3varn2i6i";}; +datax-61772={run="0sqyx1waaw57v6qfh9q5mcf5bwz3j4v4c52x7dcnh7zh37cq6dmj";doc="1kd6qjkvdi3bnkibihzfhcabs3f6ik2bsqhg609qnk6c5cyz08i4";source="19va3a8b7f1l93b6ky1b3li4y6fhxiycg6gjpv9i3vyjhc0cr0sg";}; +dateiliste-27974={run="0vzq9y9ilc6pnhg60psvwsand6sd4w5238rq3xhwnj2nq80yi38s";doc="1gxjc45zim6vykmskmhrhnkviw9i7la56d2zfyi89c5nyjbry5a2";source="0ks8aka4km6z6xcn6sihsff935z8kg74cyf3czk31wmr9qay4yq0";}; +datenumber-61761={run="0jcpzz01g8n8gxl12pahhbl0wi91in08vmpwf3lnwz9cdsm2n53s";doc="1h7nm009as764cwkdxy64zh27qwwsqlchzfd2qd4wx9gpvg3dg20";source="0qsbqqh4lm075gfv9bjmb795z2awf78nr66lrsj72p6z8wa01scv";}; +datestamp-61719={run="0gwmg94562bfc3apjqkf4bb2g0diczdc9ik0dp2i7ha5kqxvczpr";doc="03a24ssl9x33jw5vqg2as0cvrjq9llpdr0qncyxl7i03mfpiwyy4";source="1byhi7ka2qkzcph85ba5kzqfqakqpw8abxzvf50cddppfcr2gc52";}; +datetime-36650={run="0xwh0sl6x8fqvaxahh8356dfwqkzk8g9dkxyaax5gz8ar9p3xb6b";doc="1j8zlxbyqpdrwm3z4pgdv3gz2firffk8wwr3ih1vcgn7nqxkcd78";source="0f644wc3c6zx6dgdam4wh6ap4gzzf5qn02krp90hkqmbrg080zxz";}; +datetime2-63102={run="12854by3m3pr6j7s6zm8inj2panr7c9h3ngm19gzybwy7cdb34nq";doc="1pk1k3rsd9h5csnmnhlwi73i6dbwhlpqmf5z7kxgy9czmarbfg56";source="1n60n0i9iwh8qyhv78z4d2afsfk04k912ixjciblgnik1gnd4xjh";}; +datetime2-bahasai-46287={run="13xslpv73cvxfs9m010qnnqsrz9ncgci65ha89y1zsi87fld4xfw";doc="080zpliqc8wb85gqx86klrq9rj7p73m5vnka5qmxzj60kvicwlk3";source="1jhxyrxl2f7qnld898b1hhga80wl6b6xfhi9vd9ka3w373qgqfjg";}; +datetime2-basque-47064={run="0m9sf0ghni3c2qmr6byjjy88f6bjj4hhpiy9c5bgisc0ccb11jn2";doc="0krgk4krb8yglk1a0fvzhgrj6b2n38gn8kxin23p98b9928wmcl3";source="1q9h4jli6fcsd0vqlh88khv10gd6gz0vxd4gx9ikbrvgsx9wx25y";}; +datetime2-breton-52647={run="11hd7fq61g7j7nxsgrw94hdrrn54dnjvh10rfwcn0x6ck1vxawfg";doc="1h50bi7q6gvv3c2qchrx81ybly1svzyirhdcyy2swzqda2w1x7xs";source="03ppqjw69xbkvqnjfkqj0zlxsg4m5q0cx2magq88f3wmjp7kw2l4";}; +datetime2-bulgarian-47031={run="1vx3n6n46kzcspc10fwysq7xij5dnlrv2wn6b7pkfbl4yh1001yz";doc="1yfgdcr1l6qji2x0i9gs17zb5scc9p91cgyk1w6brhy5sk4syns4";source="00za8skfwr1mhjpizgslppnlg05rwab3nbak4kbsqglcv0nivm93";}; +datetime2-catalan-47032={run="1lj6407mzspkhh18yxxmvk3srgdpf8c5r06sycy128dqjkix4ma8";doc="103nx5macgfrj8hkvyyra24378g5n1x4vnxi30pjkawapwjwk982";source="0pc165ql0aa2wdwkz8wyk4yafxr0j3vnp98vxybq1x3fwfqvipv5";}; +datetime2-croatian-36682={run="1h8nxr5n9k278pngb36sswi6655p0vq442x6ixlw8h4mirlrq9jk";doc="1lma00vhrjkvldgc6iq5p9k2ky4cfjywxdzy897308yxrbahm0rv";source="1xcdaz38mm09i8zc8jpfxpbs3l2n5hhv8nk5xxw108x5k8vb8fnw";}; +datetime2-czech-47033={run="0q8f1ksl8lhkfxb2si8l84l94w4nfgav1ybfryd596kmcbpf6iga";doc="1wz7sznkpk9rik6612vibk2zc832qxrq4yq09rqwp6y2nar0p3vj";source="1bism4aqd05cjjrxmsqxxpq10sw72855fk5v2wjkij62yawklp15";}; +datetime2-danish-47034={run="18shs9bi583590a50jszym2pwcwgbz39p75j4nj5g32bwap262hd";doc="0dr9jv99c51na0b4ds6ac4rc26na0v0rbjybna25fiy4b0k7dgli";source="1h71ibvmhsxi1j5h2sq1zs29d466hylm7w9pl5xb491d091nxfl9";}; +datetime2-dutch-47355={run="1s5ff3wc9lgvz8md4kwwlqc792s4dqr2mcf0sif0dv0z8ssi079p";doc="1562fdf0c1w556mwr5gfbc5qqnrbw0f8i7dc4lwh8gfnp7skirc8";source="0i1kv624yr4zc184vy2y42qnycsqq57349d49glxc9lh0bpc9fgd";}; +datetime2-en-fulltext-36705={run="1bnmzpll7s2pv62hafbwxcj9i0c4s7vk1090xg2zvf80d0k0biyi";doc="1szzn4jcgchf1h8bg507lmb4mzdqx60k94v84z2g8h2pv7d5ip9z";source="1vrhcgsjhb6vfh44lqh2hx22zaw5qiwiwms7lnzwism5zghdkaxs";}; +datetime2-english-52479={run="1xjjv46vk4s3drlzvs7iprw3zhn1zk30bwi2dgczjqzk0fxyiql9";doc="0iyq0385pj2lqmd5rwyanry6brbwrii4zg2jjnhp2ib404jwjqf7";source="00sjzcpsp9jjfn9fnc1fmq19448qm0p0ggi2yy7qmz426mqb3g7x";}; +datetime2-esperanto-47356={run="05691xa25qp015w0cm5mzi3qrb88hlaq5jxjrxqgid1ni9rpgwh8";doc="1c0dhq8ll04pl3ics7d3p8r73mdawnyridapfr9540cs2a1xjjbb";source="11xg3v8dk7aiv9ms4nggsm1xs898m0zzi7lszi7jx8pcmxqnz851";}; +datetime2-estonian-47565={run="0vdnvfswgm92ncrkh11p523s6vczz1vdxyjqjl9cpm1nfj7wp14j";doc="010i5rcy8pc5y16rwhpzzywlyna031g6s9xsdpgg0avci1yvw20h";source="0xsgj8l6hipdb0f75ckqw1h2lmdkjxxgz0mw38pc1kg6sr4r3sdf";}; +datetime2-finnish-47047={run="01hjh5lmd2461n0g2a67z31h80wcfj14b9y9amxkx4k01b1268li";doc="1cihjhhm37f38rknm45ndli3kmgrb1waxfncl1fg9l95hn929cnh";source="0zi9ydsj0zjrg3c7618fxxabas6zhvdimbsd42n8fc5acvddhi36";}; +datetime2-french-56393={run="0iznh6qv41xcaryyh70lk26rmrk2j0j3239hib8g924zqgyi83p7";doc="0f1j72g2xqaq64wi1jkllhkpxbjm1j3d7wraq42x13giv72g95w8";source="018a641mqcpj1maqhpcrp09msf9rbr8a5nd16hk8c375sh2lqpap";}; +datetime2-galician-47631={run="1g5qmiy094yrid6jh3xvy783kq331bzk0lqzci7jsb2izymz0lqm";doc="0im51qyxg5dbc6p1w3k4vs63d7nyyipd2ad7z9czlfid0n4ywksf";source="0j4i3b3mp1bpqir7imsfw2y1098ak0j8zs7gjhm16xdrb4n1xhcl";}; +datetime2-german-67201={run="1n7s5fj27rlz61r63s1mwbkxm62ddb2izz7ip4fb165d0bbba8xr";doc="057p9xgdbxq31ff43qi7lr4wy17nk625dnpczrinfd80xn92dhsd";source="07dv92w3rfg0xi6d8n6ykp0rn4pj6k8knp9sx8an9bhzmwqw2yw1";}; +datetime2-greek-47533={run="13a1lpvg680881xpgphzni3hcdymvph56mhgy0jbsri14fw0mdyi";doc="1kkl386rd0h5psr1z4aw32r7m55in62hql8x9c8njzajm5frhf44";source="0kmwn8mawmxvrgx5d39j92p3r1nlk1z378z1h2lx129yz4qbsv56";}; +datetime2-hebrew-47534={run="1b04g9lm0g5128phix3mnx9yphg07ig7p9d149rw0b1imly7f6mv";doc="1lslls4q5j1l9a5m0gzv351jfc93ii0zzcb62p3icq2qjig3rz37";source="11q13hms2mnqyxg6hc3279a8hs88j2d7v7wl90v5avwgh8923q55";}; +datetime2-icelandic-65213={run="1ws2mn3gf57b8gc1q7fp32li36mvmcxf5i8p3ikap2swvd9y3a39";doc="1dm4vg1jvsq94sn9nxxcasxmrs5i878z9bbrcf88yzfx5bm6wbfs";source="0vss8vq4kzzj243ha6gdvd9g5r85ar09v7y2yff2vj41gwp5zmjb";}; +datetime2-irish-47632={run="0k40sibvdqhg333l0iyhg3zs0fkhfbkqhs64ch9hs0kpw1mah48g";doc="18yd4icn0vmmizims17lsailn0gjqnhx4c7yy5jgrycammbjns03";source="1hs18kcmzgif8jcfp3v87h6rvrhskcvi5jzzspp7zgpq73izb1nj";}; +datetime2-it-fulltext-54779={run="03nr1l5gzwzdg4simif6wrwzg9716vfy1nbp8xfl98hs3sznhdhi";doc="1rqkdp81zg5sq5klz10v00c9xzb162dsmqgic2y3v4mxi482iy89";source="0y50s2mnyyx5kxb0bjbbr4pr7ywnfq3aqhqybqhd5x6rqpwagnd9";}; +datetime2-italian-37146={run="1if93khnpiwn2qpk66i431aw55y43qr603kdfdfq76v4sq4zrcys";doc="1r7gbm3ik84ny6nk3fb36g337imfq7w53cmk47qg1cpmff6c800c";source="1ckrmbv22dm7998r9p3b730zyk7ldzzbf1ds8ac5syqibh8wh0dl";}; +datetime2-latin-47748={run="1xgjcby4kyr6pb7zmwvwyhcq5y468vvja64l8bfivhv0n1s6q2cs";doc="07lvgcnpi7z36l21dwbs1s19f3afg55i18wdjcc9d02566g2fjv3";source="1gi5n1sf6v965hd4p0c6d8v92myhh218ql6bgaarsba1axp2c1as";}; +datetime2-lsorbian-47749={run="0vpqvd3fcmd8kqs2cj6ix5g3ci9zjr7i9ym31whryras2cm6r24m";doc="1ysrjnw655p1jplcxajrjgd48sndqssm8j7gv869nf0ngx4mx1rc";source="0875nzp676qv8vi3f37k2cbf7vszsrws6clyldqqayxkr7gnin63";}; +datetime2-magyar-48266={run="06y57br6g9clfscqma0lqp38fzp6rrxja3sz5x6jgi0acyljxzxx";doc="1mcw5rzb573qav00jz611576lvy8nkfl3g92wj02szb6fxq66g60";source="1697h8jh2gx1ybcfhz8cqzvk70h83qa3028hqi3c1rhkcbxbrabb";}; +datetime2-norsk-48267={run="1kcdkppmc5h3w09bwcrvlsxcbcawksmdam0x5w6zbqibvhlhvh78";doc="1vrip0mq47w2qn8i14ckazpzhzrl79dpyj7zv01b43xw5zkyqg4q";source="0rkjhbqppncaw67pfiihy2grzlcsaszi8jnxhhvb2sf4i3dpqlr9";}; +datetime2-polish-48456={run="1mndpf6vnb7lbziaj64aa3q796bv17mh4r9s3p0y2k8yjrllql3m";doc="1cn5qrcl4jxcnn90llhn6x7rd5zdnzz9h5szv4hhzbn9i4k1ci0f";source="1c42vallyqmpjzivcfvaxidhi2rs05sw6xbkb319dznl1jmdby6c";}; +datetime2-portuges-48457={run="0ikj36y2n7zlxgvwxd8z8vmkm4gwdan3si8bz98ajc1z5yncb7ha";doc="1m4ij8xjshi23hrm723m6vsbijd9cbd49b29fr2466sbxmnkyv22";source="1r0nw953bwgdz3w150s78s0rpd9c88djygwc68sr3dkfd6iih05k";}; +datetime2-romanian-56394={run="04jypimj3pcvnalkgzwzxvgav8s0g6c7br1w5hk769k7aqjf7qx7";doc="0nv47vpf5gcnj86f1m24xbmlvhf7iciyjaz2kxbbsn4yz55zmbmv";source="14324lrmh75g4jigcbcgx9zyxn0318k6my6ndvymamldwln7gmmv";}; +datetime2-russian-49345={run="0m3cmm2ikili85z44mmsnaxhv3x2s6xyk6kkfr3kaczn3w8srqim";doc="01rfdj3wf69j976mkv2yxw0ns4pzf852miykknni4zw7lbcki00g";source="1x931h6rnzm11ipfa747x306iwn3381ahcf7bfzhg75p8707glgs";}; +datetime2-samin-49346={run="0wqnsvx33d68j18lm0fmvjrdg8g5hv0xwzv6wqnb8wwz1l5zmqvj";doc="1wfij9j00pqs8bapbjpmg8xzah9509vrsb9h8sqc2abdjnqgkmdc";source="037gm3s8rxk4chj2q9yilbkvg46dxnd2jpr886ibydfp1ndnqcp1";}; +datetime2-scottish-52101={run="18c3y6968css1zm1pryn3cfbdqfn9px0n62bq6mapmgbd7fi2plh";doc="04dy9syy4qmn36mfy1agxjzd41prwqzlx5f8vpyq3148w51kpp1j";source="0nhfk8b19dqa08lb10sbfwp3c2f4rn493dgp4sm254bk00nil1gh";}; +datetime2-serbian-67201={run="1akyl3r70rwdyjjqvpsmh5m9g7xsdmdmx7l9qyh54x8c7gir7wd7";doc="1kgkpfgfqj99m0262zcc6b7fnik83vr45973720dbf9f5gvyin95";source="0hn4w3rw6mqzcj14a55m2hch3ra1ax0kb3l254pfgk4x9l3x028v";}; +datetime2-slovak-52281={run="004s60h3zi0a947ayc7kk2slxwl6bmpba8lxm8000f6yaf00wyk8";doc="1wblf0fd2lb6b05vvb31a33lz7dxakd5k6y5pcvs6iwjjb755n52";source="17hwr9yzpdkcvqvm1fa4qvacgica9mm29npmcl7xc3c503h4z6wi";}; +datetime2-slovene-52282={run="1lcpx7nz5lqb6pdw2j0dybkilavp535pxijs13nfl043xizh4brq";doc="0i6p83lixs6maiww4fdsm09nql3xx8xvs2qz38r5md4r5zzikyb0";source="0grv3gcm8wjdcx9smsq3dzd916pg8kcvgmh6s47xh83wz00qqi36";}; +datetime2-spanish-45785={run="0ggb24w3sljmmydnjdkbg34n9mszjwrqny8vl70fcin1dj69njcj";doc="1iglnacrcwwmc43shhsaamwajlb3mzj9dgqnd5qg3v7ynlp5zblq";source="0fjkhxqgw1yb1nzfiymwv8bsv6zlnwvdjl7crd78n3yx1fgv9wd8";}; +datetime2-swedish-36700={run="1srl9lm3hbsg3bwdkdw4bz7rhhnkkl6pihjky5p2h0jr9mribczm";doc="15ya3082by696ysi8gj7d0x5n5g93przna74r0g8yv3qpqkv52j6";source="0yswvrgh6xg34iryy0anhb4jac8q0iyvdfw9bsbhaz1xbldn7xw9";}; +datetime2-turkish-52331={run="158prpx4ma56qvq6ivq7ffwp0llll5x34af194qygxs0ldsgjlwy";doc="0n47wgnw5kvcn85s1983dg3fbixh7i4p3lxrfnd7qvaxyrph6lw5";source="1hnwws0y43d9hpdgb63y5pxr6d0ahis2q40z705b199051lg2qfw";}; +datetime2-ukrainian-47552={run="08ba6xbivl8gv2a3g0p4ch969zq1lid4zq3vqqvgzkhkdsvc2zkg";doc="0biih09p6a90qbjck5w0qs4k8lnqdha0xd3f6kdjmlljqxk24g5j";source="0mrysl74pfbs533h08jv5wld57s30nsq6mar2n07668nmplqj0ss";}; +datetime2-usorbian-52375={run="1dynq4qqi7mpckzcmwvfc17hvnfjlv3n93dwypp2sxl1596vili4";doc="0pvf7lx3g09jy5nxlzvgsixmaz9bkcq0zlhq8r3ijd743sq4y048";source="0888x4b0wjqwfrg96rcpxfj6mycdpwwyk9fjavj3j535nxb5hjxr";}; +datetime2-welsh-52553={run="01p4mxn78ynyan6pb9598qmi000alyaiw3bh83w0l5682v2fi7ip";doc="0rkibaqirq4xgy6r7a1aws6awyamllg5z5zixb3imapj3x6c8p1h";source="0d21jimjq8sipg1qh4fxwb9cmq3sga0wjlrcqapjpy559bnfgmrx";}; +dblfloatfix-28983={run="1r8s36il4bmqvvvlrsdbhdp4nanbyd1lh71dac4f774bf5pkhzi3";doc="0znp5j2v20q7bsic5j7cjqxmbi1dannffl0b14g2w0jp3p6hpfxn";}; +dbshow-61634={run="0cfp89n7r5jn6rsg8qrjmwfzi1i9qrvxh4aiz4r33sgi8qy5iljx";doc="00nksa78l2hi8dwp72wcz7b4sx1z5p88c9pyha975xr4l5lbli4q";source="0pgyjb07flhfr0dy1rqk4j237wjskxfsldrl58hzdanipqn0jyyi";}; +dccpaper-67890={run="0pihvkqcb9qpkq5c8n1n1wlfip87zql1dzxrai1dlln0rrrxhycp";doc="1762lsfk6jg13rkkiwr1y8kc6xlf5y714jjfiz74zlv9w8ixgxln";source="1pjjhcbbx609rgrbaqdp1xkn7cafwax93jpn8m7wlzy3acl31lng";}; +dcpic-30206={run="0yfjhpn8hr3yk4dyjfzbc8g7cki64039lb96naacyv8mjhqdpgyd";doc="0vxqvnkxm00k0xqpllcnq01si33wyg2mkhpb7l8jxxxizn3wf5vi";}; +ddphonism-52009={run="09s324nj6g8nlib9wilpy01prixrw1ilwlvl638hgv5rxsspza5y";doc="0iirifr55s86nm5512ii0qm8lm4zy3jbrbk333hw27y8m4v9qd4i";}; +de-macro-66746={run="0pw8b3v4yy4frxa8q3xbljx7m1vd3952w01ra77g2x8b02msd9xl";doc="02zxl4xpbyjs5vwg5cskgfh3w2ls2bxlyn50smh0kcqas46vn9a4";}; +debate-64846={run="1v3wapccyxk2fnhm93padrmrarzdxljlqznw96h735086pgsni94";doc="1kivk2f6k1ifmh9w8qg698wvsbb21rfwwmr10bbvlsbl8xw22p7f";source="1yia0rhkwq65a9ggn6pkmr20vrvlcjkai30j1hm0jav7rdq9pqbi";}; +decimal-23374={run="00byxbhi2pqccd1vd6hsh4ri0vzvq1mwjnvqmqqlrbr3qfv05zla";doc="15v078s3d3aawihdmd0l1ndqinlsqz11xxbvbw0dyh0arw6d1rc3";source="1k88s0r82livblqfb140npf2p7lvmsqkpasbr93ihwjj9vp54xb5";}; +decimalcomma-69251={run="1gsmjqw7sws2r5vzm1vdp3mbwvxpally5vb7pn64d28bcmkvs28m";doc="197pqxv9sny07vfznzx55skwl3gj36wsqi89j24jvj7gfrm2a0kf";source="0bgiq61d31rzzkcib6z1lszydzcjwh3waxwhhfxf5mbwinlmwwga";}; +decision-table-60673={run="0v1654g69lsvcvky0yh977kz7s1b5bjihh6bfc4lqrzbpg92qijn";doc="1gpz0g8s61aryz5y8f2v35v0p8cbwpvsq1x4f45hrhd3hpk96hbj";source="1d40h7vcyaxdf8yrvbx2lns0hg3d0xy9mv9rmqpy8hkqxavzd389";}; +decorule-55230={run="0r5pxcpx29l8x1bw4hj4xp66zgkjgm0qn2ryvxy1d30dyjgp34zb";doc="0a3qvnknhcx0jx8x9gk7bh4sbnzv1mnqvdr8l03nzjcbmysvc3hy";source="1lj47s4k44pjnr0n06xdcb37625hkjclrsj4ccmkgcr61d85vkwk";}; +defoldfonts-68234={run="00h2hk4vhqn54sczns7nlgsiymccwikdpl702y9m9hvhdw2misak";doc="1xl8nw3p9jhb530m7sxkrsg3qpd497q4678al524b3gz85ps1m0w";source="0ssc58p013kjdh0p56jhw7cx734ngnkm9mvf1cslcar5pyh6s88r";}; +dehyph-48599={run="0fkqlsknrlxk8zazcqy4q3nisxr3a4x21aiwqhz8s237rdf3w39g";}; +dehyph-exptl-70496={run="1lk9jl0h46xi2bg724j8jg6i54jqdch7ncz1a3yk6xwfpjgmj9ig";doc="160z9xiqdi9x3wmmipnlarrhlj8r6885541vl23hlj61xd17y9xz";}; +dejavu-31771={run="1pxcrv98xgy9hkqhclyp0q5dgpgc80bvjzs378f0dqzc1037lghn";doc="1f42z94n6dpdq481n5wmsx5hx000klmbklghz77x8pc9shgvlka8";}; +dejavu-otf-45991={run="06cdqjqj0vcxrr2nlqs2qszssiibzr0pbimhvqjpqfdv2hhdxd0d";doc="0x9j42zm6dagn4wv8hz34x7cgybi6bb86whxvmmwx5slsbb6yqfy";}; +delim-23974={run="0k5h5wk4fn4qzhjcgraqjzf6ggq7rvr8d4c1j2vwxi37fa83642b";doc="167hklrsm9dh68nvl6inqck07zfg8w4gr9p5c2n8i6y6v9xlj3q5";source="1xh63b78kxngcc3qgzmcfrf4pw2saipw054pzq47vp2ajppp1sq3";}; +delimseasy-39589={run="013r0cgz7ivrjfhmpcf5rdfl2573q35qmw0bhprnamij2jpvggzr";doc="02s406bh59qy6g8ckpxhgl0b4xxyr4zf91a6prhzlmbbhf96xbp1";}; +delimset-49544={run="126ax3z4c36z83479zk56jcvdj5r95y182rv42wkm4lm6sy8v24j";doc="1mb85h29fp7nxrkfylfg59jbvjva7lmr7vvgd8nz7k09w1gf4x0b";source="00hp5f5pfad36n4lkmra8mc2n0ynnq9ynnspqfb9378cx3m81cxq";}; +delimtxt-16549={run="0s2bbxhbfvq0jm4i90sh6krcik8yk2nl0c39lzr1nrakal0k5lkh";doc="1wswrw94n5l1azs2aczv6vf56ksbagniry4rwq9b16bmvdy7slyz";source="0sfwmd0mj359qkchqgm8zc80ayqp0p8ppdgfn3cmayhf2pml6gyj";}; +democodetools-64314={run="0ih11kxlvnskrdbvxrakbljh1n08n1mb6hbmf08475557bp0nchg";doc="0kcn368yzx0jf04srh2lzbxj9n76ph0idfjcqs2am3cjp2mjis17";}; +denisbdoc-70611={run="04y9dwkap94nyfn4cfcpm9jk2y0891dg7jg21c0ca9b3kckrcgjg";doc="11m50x8lc0694wjx06p9raj871gr9hmssblm3gnx3phl0vfrmyd7";source="0gipwjskg2p78r2z4j839yxfar227mvv294bjnl0j16w33d8k4cy";}; +derivative-69746={run="0n29fjh59wkpigk1759b0m231zcmli6rcsplj0zhhaf4jwxk2apj";doc="09mv84hz56l3ihccl5cln8avw4137c8kwykh9s0j3y1r19iw7x1v";}; +detex-66186={doc="08d017wn7a67pmp9b5yhnfg1x2q6f48qaa5ma4bplz9a782icwjy";}; +dhua-24035={run="16gq48zlsfk9llafs8379797v908khv954q8lw2dvzk0v69d0qki";doc="16l76rvba4fz3vfw8mzkmks7b7206h2dva5dgw3m0j30ds8d6vm2";source="06vws91qfar1h87d57c9f9cw04isjk0szhg2aiw7sc8ligs0v907";}; +diabetes-logbook-54810={run="0rmahxnjnjd677z42ra1mcp86na41sz9ir4chkpmaikhdvnbi4qa";doc="0qb2nyjc7fpc7yc632bblbjryxdx39xr64c4kxncdisi34am82z9";}; +diadia-37656={run="0gygfg9vs4gbp3r0h9v6dqc18np331c0hjfmc5rbh29i74jcm8jh";doc="0bm0sb3fjj73mcdmrsvan9pdla2ki7j1wwpjpc4kpfc116a9lzy2";}; +diagbox-54080={run="1p7wfkhdcgdc1gifr4im390w039609j6mg99sixgpq8f0mqqnlsf";doc="04i03qdy9gfzf14w1vz8nqqgw4hn191w423jf2ck5ibljwlwa214";source="1x1ixmmixi2sal1iajwnf0wvg97kj08hi5vv4swdiwqpd14g1i53";}; +diagmac2-15878={run="00jzm6pdzxbg33fbj19ih813j9wvb1g9hr01g9xjc0d6nprq9mcs";doc="0vpm9lc33x5xyip25kay38fhld0a0z4l6g3nvhbdh65apb4j4wfs";}; +diagnose-19387={run="16pikxgaf40vm6l5r0wk5jxbfyzy1jgpq2qhpl859srxrygdar4q";doc="0k6vxzd3biyrfwnfr3p2zvj5j10r4xsda65qf6ppdrjr8cvmjx6l";}; +dialogl-28946={run="0vdx7qnpp5s6j5c96207px2fdhylj2kv3ph9mr3jcb6jyrsiyi0q";doc="15082p9pi47vdwrdqz4kdcl59ymsgnanrrnil9p97c1wbmc9saqb";source="1g9c68a7pqpk5vfcnr95zi11km3bhjll06zminw2knk2naxlykhh";}; +dice-28501={run="12j86mgn8zph5w1gd1lmmz0dcka36b187vld6r2srnj9f398h7ac";doc="068pzhi6a4mnq8bj5xvg4pdgqb4kvdggybs16hpk8jla03ny18zp";}; +dichokey-17192={run="0bvv3893jxpblddqi75hppb9s0rxaiqbq70jns2x7d79afl7xkwj";doc="0m5zc521shp00wld4kyhp9xipsqfq00q1dqd3qp9ki1b2kmr5w7j";}; +dickimaw-32925={doc="1mxjqn4lblnpbmad3jk453lyx1qzcmrddis59j3jsgc5sp929w4k";}; +dictsym-69720={run="1n55cpkm687y6p6fs98d81ivvryr06fahh9nf5bvg3vvmd3rq0v7";doc="00l1ivnslfhlvyyd070d4vk2s7h9qn3vp6z49rm6g05zrx52954q";}; +didec-70237={run="1fqcc7jb45w4x13689llhm2rcqfjclrw5inp770q4sj2xsdgfsnb";doc="1vldv0j555zyk27n37y8p8n9l4xzp0fv060xbnq1hjsy8sjjwm57";}; +diffcoeff-68838={run="19rrh9zzjxyd7hxfawi65y0cnr1ps5vzypk60jfki8s1bbk8l2jv";doc="1ximrhl7m5in95mxlmk7dpvja39sjvxz4awzr3vwn9w11qkhw0p9";}; +digestif-65223={run="01hym4d6vqja4hwnjyvs0zs0l2fzhdap0pir7cz7wxqnlcip6hl2";doc="0220wkv0w6zp4ggnqkcfcq388f42scywzn2ah0h9yhccgdikd52h";}; +digiconfigs-15878={run="1irv3jc87bpnc289r5zh7pgfdgk4bvfwbyv6666kyq8f8yl7m1kh";doc="0fnibq45xgwrha5vfav8lylnb6p2i0brd2k1yp8jm8id6xdsxmq8";}; +dijkstra-64580={run="134qfpb0sqyazfjyc7mid1rydyszc6gpqms787vq2fd2157zksz9";doc="0qmzrdzh0704s97wqwxj3wyg33rbbpq0mmq7hdqf8fy0vq2v8hh4";}; +dimnum-58774={run="0mrcnz3s214a4yxljlbrzpqyrsjlh8gd0llj96wsirlc1kpsb3jq";doc="13j2pbbpsnd70gmn3ap4sad4bvbwg3r00ix9s1m2kvx4k7j3zwii";source="0sx3y3g7jn0dbbfw3a8sga2fs9pz9710jlckmc464a5zlxmcyldh";}; +din1505-19441={run="1ki5xzdxgvy34pg345f1577cj93ps4mgcakjgqra8jshnnfrfqs6";doc="0wh1zkzzm3d9s5gvff6j847jsqpr436sw7ysvrlv0r5s3fb10xl9";}; +dinat-15878={run="0m040ib86lk9ccd4m2r33k8rgdi7dgga80skv2qif43ssws330r2";doc="1hvc4f56mi0drmdqr7qlab68b9dqkmczhj28d3lpyn2l2hx4dncx";}; +dinbrief-15878={run="1msbw91lljb18c10bia4zclgb1klhmnck6kf23dgpv5ihpdmzla0";doc="1m3dvm2d0s7xbnvywwwcnjcl3hr8sczp1lmpcdx8m6gyjspllbfn";source="13dcia7rzw0djajb71b9gq2isgys63zs6g89rnwxfvn41a0nkgh3";}; +dingbat-27918={run="18yzigyd9s0c7qs34x1km0am9ii7xywvyd9miicbdr6s4bjrjdz2";doc="0fxbmx6nz2ib6qfka1qsb9ky9r3xw5hvss532hn89yx40gb6qx5r";source="130qj3fs12j3sj93xlnqxch9lgywgwk3qchlil72dgmh24kg6ij8";}; +directory-15878={run="0z2kczyvd4h3751ndfywzfvxl16xrjl3alvqxpscjsplrrrq53l4";doc="0w5rhczldn9p28dys7pjn3lgs0a6dq4yr59n1969qbffbcyv2m5q";}; +dirtree-42428={run="1j91nhdnf4zvqpn6a3jqrcvfpfb0ml18n2g474n5d2k1017mdz4n";doc="05yd1fkkgyspqxi2ddmq3s0nwnyh1xk55lbzzk6pwxjx1s1cd5k5";source="1pl4s67bwf5vbf0ccfhd05yrmfss59kng0ys871yq74rxm4abing";}; +dirtytalk-20520={run="10msaqhpb66l95vk8l172mpglilhdrqc4qcvmq3v58ssj19kksjp";doc="13yv6x3v4is4l0z5b7a83r173jq7mkyqc8nn52sfdkr168saxylz";source="1jw485pgqr0l60rnd39jfn4gmac5n9k67q8ykn2fk3s38nklyzib";}; +disser-43417={run="0kksdx0m0lgb7f45g21yzfh90id3pzq17bhff8x7az0djb6n7zk1";doc="1pb4gzw1yx3kx6yxabm4wj99gmnwmx9vw30m3l21304axdxgk7w4";source="02awlfmhyi2cahd0dkhxkfiqqg6jwmkksv6134lyms798j0akv0z";}; +ditaa-48932={run="00ym9qcrzq9g72r5dkvqwsxig9gryizzznjfzarq9x9dvd7x1r48";doc="13cw5a4wvv5fyknckvm6qzhl2lvaqvqvlwi711ix6zq6db3ghfsw";}; +dithesis-34295={run="0spbmfqf2i12sp0qvh6875vp2zrgpkrhvbmjzwyxj6mjn1yr7r9b";doc="0w9xgl8y2w1f7ns2nn9j5rs7hd39w6as2drcjmw4dc0vdbklkayd";}; +dk-bib-15878={run="0b0ypkq5c3bvbz6633csljj2zqibcm0nqj4dkskikzv0dzqkilh7";doc="034zpjn14wia2zl5flgndr1p89b8jg0w91wzqhw5zfzmdh4k3pn5";source="1aj8d2r3myp74x71jkgi8ckzcr6ngsqfqqpv5id43awrffxicsjw";}; +dlfltxb-17337={run="0yql8krlb6cbi5vhds9s8qwy4010vlsi3szbiqlzrby82bnfpxnz";doc="0c4nvwlf5k1q34gsn3z0pb00b0yhprhp3a1mcrg9i53yw7chwsy3";}; +dnaseq-17194={run="0vsifiirz1mwmjnav8k6m27mm5qsn3iw01a9c056p4g4ji8w2v2y";doc="1n05sb0yvq1hm2wa5vdnkhr54fgdkxv2s4kd8dhzk2zqx6sdv4jb";source="07vdyylb7j94sphfz6c2szxhx7l5swvyzly3afky69lm356988zd";}; +dnp-54074={run="0jlvb0nps1ij4sgbg3clgbk34p80la1fhh9zihn9fhl9nrqk637r";}; +doc-pictex-24927={doc="0fdvqhkgi5j33rx0r4fifj69f4smn5w0n99vx90a3fw15qzxsg5y";}; +docbytex-34294={run="19f8kxa8pb7ai7npxxavcw8hbsskmnchi7vynzkbd0imcjvay476";doc="0q3by29jmymrf4pirwmfqxr6bdglh936yb1phficxlpm07ibp8mz";}; +doclicense-68441={run="1qb8r4lwjqzwv46fsqjff8l5zb1scjkq34pwnsxbymz1sl3iw1ls";doc="0isk98wcs93labxiygbf6hg2794l7m2wr8ck71jafd6by8x7l1mb";source="04sq9wrsfgg3s51k853yy7vn5yp292d2ii0ww3msrqnlpknvim7j";}; +docmfp-15878={run="13cxjhbafm0xvnng6gc9g03p4j79sia7jvygxmphgnf7wfndv4sz";doc="1j2b530wcpr8252lcpmy0c5w83kqbi9xzsrfbdngi1jmkfy4nlgv";source="1w8g6m2whza3w62ngsaslv7h2x7asijznwb9glx6g2vjv456sgf8";}; +docmute-25741={run="15ad8274dwgzk7fzs7i5g3ss02ld8in8f86339rb314zmraj5kv3";doc="1mrwispvif8nwjbq12jgzpwjn9xf7mr91pwg5bfdcnpwwy8l1bh3";source="1nfv31h23mp7alrm9saz5abakjsvs7rqva3q9zvxlczix7yn63qw";}; +docshots-69676={run="02wcsd0ccyh9lmv6mi5g7igk42xcdmzwvp0j10128yw71znmwr29";doc="0ff6hklr8g0497p81bir02z837y3iiicd7g3cjws75sm88isxxj7";source="0qjcc0vkz7vpylh7cqlkyxh8fx2gyjjkm1w6q62bi97j0mnnb58g";}; +docsurvey-70449={doc="1pf5h9fy9akgc2cznvx32nzhxfx5c22dzr4ki23h4w7v7iivsw68";}; +doctools-34474={run="1rdwmdah8rb2yiicd9mbqz0mmf56rpgnp5vwyjhax7m0zqjgqkgm";doc="02jrr4wbkdx8r44dpfn4g83j03n6yrska79ljnwigs77p5jqlyl8";source="03y13bijva11hqil84l2p4cap7fcm8wk6ds53nx1qizh66h8g9vr";}; +documentation-34521={run="088imchmqchi1ilwfzlhk8d4am2xjjgacnyw5w4mb6sirbckhi3d";doc="103rpywyl1h30c7jamp3cfi1rg89y48krdjbxc0calz8iq5n0460";source="1fzk62clv9ij07cfjcrwn94cqvz2piysij09y2wlkcs06lgk2m69";}; +docutils-56594={run="1pxswkjs901clnd8l3n13ghqypv6l8gxr3pnwn9i0zakvxz6gdh3";doc="11fzx9kyxgxr20hnyqy9nvl5rczdfyb43j1bjwxnim68kmy5bjyz";}; +doi-48634={run="0rxsgmqmkpabw1qw7k0ssxjmzkia323dl0p73zw7qbwdpgs4xx5v";doc="0h6k3bg9wg4wa4shyijr0xsx935s8s8igad0zzyk57q5g7lhhka4";}; +doipubmed-15878={run="05zcv1db1bbxp6qnw4ni3qjx6yhflad1syqabqbdccrfk5xim20n";doc="07pd08qaggy6q58as1aqfnbk77mc2b4kavbzqk4v11f5vp5v0bdq";source="1hzv0iaj8rxblqxiak3n855yw8gqmxz7l8jwf98qnbpb9cm01f0i";}; +domitian-55286={run="0rcyfp46ar0qd2jiir3vmwqmkcj8zrhnrivr0xsi7nf9xbl0xj1v";doc="0q7lbpc0lh2i6jw6dwr26d9kxpwqxcrv6szsqfk73h8bpv123ghz";}; +dosepsbin-29752={run="0qknrackr7m0s431vrygphzrk99wkrgdp6kl04q7f4lsffq12k9r";doc="1lhrlgyn9sg88052ib0jkwd88zvjpzqnz0ac5whl5gpr5zw2y2c3";source="0lqmcndd5m4hxslvpq4r9g1bal12vfdsncfcii71glv45c2hl2x2";}; +dot2texi-26237={run="0hb9mv8ai85smn9viig88f5hprj3dyj574amy9nzdr8f52lrbg2z";doc="0wa63gs8h9a5d94chiq1gr4lam8p0338lyqbw3bmf3ix3v1bzyvm";}; +dotarrow-15878={run="0wjan8m1171m5bl5x6pygfn0lm3pyq87vmjjgzl1zd337l3wz45w";doc="18d9y7mzfwsmy9c14ihj2blmikiwcwp2y462wjnmm8hb6gm58cpc";source="0f8dmgsrd2wbcmxipj0p40d09sgcl8i5indbzsmkfz7fxvnpr15d";}; +dotlessi-51476={run="1ii8ilc2hqdwck9z1lpbyjsgh47pkfh62r1yv6kdkafqqrxzpxxb";doc="1vc8bpzzad2k222ghdcqmkbd7541b88wccc108avzj9v85wfpjbk";}; +dotseqn-17195={run="0n0hgp5saipf42kwx4hxxgx66irmy91pdzcznc8vmnnlayly8s61";doc="1an4s3v47f08z7v5gmz49g4bbz26xcvadn74052nhrbmj8xm8fav";source="05zxrzpm7mcms2skh9mpv4nga9ysqwin8qjc7yy9prcaban00y33";}; +dottex-15878={run="1ykjw55qzv5vk1wk90qddswvj3ai1s5xx674vkf5r07nw07dca76";doc="0vk0qgwvmny4fpa9d0gwg4s8z68aaiw1bn135d5msgikbkhbbmw7";source="1ph52wyv7fqri6pxsi289s7svy4p4zap1bdzbwqpbsrp6v4ngjqa";}; +doublestroke-15878={run="1nfbbh7kid345jkcqdhh72q3fg2fh39fzchcbhfkvisvqmqs3cgp";doc="1vs6gkv9bzya3hnclqbwx44nf5s8vir0hs499dsya2q64qrmcp2p";}; +doulossil-63255={run="1lajwxs0i5971bvc2jmdi1ljpp3545hq9ckyrr93lrk0ghdv65qy";doc="1wv1718k51wpbzrlxy8qm169q7brbx0gy7x0mil18a8ik53r7c6c";}; +dowith-38860={run="1ffadlm7fzm72svbpln7lms9dl5pbrv6xjzhwbcsjbwy4smx8s6x";doc="12sis4raxlfwzdl5jqg6x7fa7wsd9phaawm9ydf91wf7d8md6z2j";source="1qm2v2lw05jk4nnfns9l1hldamjka6plg2zyly6vi0jlns741hpx";}; +download-52257={run="0dwivfcjvg12gsf4zikyvlyb0p1pks6a2fxdqgji2x79ashxsm24";doc="00p9cjzqqh95nlda8193111aa5kjagszbf65wfm3jfy4dahqxfwz";source="15shcpxz2h0i34pnm2nz47h37gy4xdws87p8yrxbfi4j10qr8c62";}; +dox-46011={run="1vv1arqah132cns24s99s18ixcrjqfkbq551d94pjs8di7fiik2p";doc="08x3h0750nbh20wsnlkfz59na5kvi9jsm63l8dh3l7b0szzq88cb";source="1p5xmacd5phv5ig0ga1wj32fqpji9fl21lbygb39qdjr6v3g7vs2";}; +dozenal-47680={run="10ghknq4nnyvly55mwcisb64cadb0afmsqjh8z026izs684rbsjr";doc="01m1ljwbzmzq0hcj6p95rl4rrgnjrxlxnf72f49f725xhfsn57pb";source="016lxqwf1cm7a7ny5znkgibpna1r13zw0cmzs3wk49zhqhkqmzvp";}; +dpcircling-54994={run="11qhxh5pgjyc98hnlbq8hfsb77bavs0z3yjx4809z6aypah5cd92";doc="1qrx0pnk1p046mx6nzjwgrfxaq1hmdgalqsp3cr6d6zgqwzsnms1";}; +dpfloat-17196={run="00agcljhzafzhbcfk1jbxaxyc3znwxd1j1sdhr982m3s1nd8733g";doc="1nydmlbk1p4gywq0hh7jnvd9hs9lxl73khbpi4zn5j4blzkb31x9";}; +dprogress-15878={run="1sz7msvh7wyf5k8ag857lr11dqwf12p1wzi6kdkwma05i8wwni88";doc="1s356ffii215bybc5cqg91gril5am5zzh5w4s1nf875yl4yjxbji";source="1f7ym5lr0gn24jaca509hbhg9xr5mhbr5wgncvvf937jmq6w2jxp";}; +drac-15878={run="0p8li8cln7674zd40w8x6izn2kf63wsxpwg3dpbjnp5jccifvsnr";doc="1lhibs5s6h0a97ggjkp1i8j02ry9p0zdq6pzjxm4ijx3fqj1p3rq";source="1478yizwfvzrpi50k3fxbs9vq7g39170jdh7l3ynkbq0fkbssxhd";}; +draftcopy-15878={run="0fxh7h37akz0s33vjmnzxjp04m7ynb0z6650p5wd399lfg5bi11k";doc="1z7cjzk75d3gwcb4dgvg7a8jl9bvzqnc7zn0ginqcl0aih37yg5j";source="11gswnpz0azxb2d1clmpk9bis9cijsd1hajll7jxm5fhnk6vigfn";}; +draftfigure-44854={run="0dhjlykc6p6jm6p0s0h0d74097ny29w84ns1pxbb7f8iwr8hhkvf";doc="0gnazf3bmbgnygn3pv0lzrlrcic3j2yfqxq1kaijkkhsr9w57jy9";}; +draftwatermark-70401={run="1v0100dlj6y6kbcyvnslsi7a688jdm813w6752bxbv6xsxrgrvkg";doc="040xj41s6xgbxz1gnd11m58dv7q30qdki4sn88vjg00n2i0afxqj";source="10lm27jk24p2d5pg964l9mwj4gkn1xfqxw301lyyibq6wz921qcx";}; +dramatist-35866={run="0zrkdhvx7f1261r5b2d08bd6a3pzldvpi69iym5k6f79ziz0602q";doc="0vwk6zfvf89773bwcxnpsd8crbkmq4lr6hksp4dn0hn6rf4smyyf";source="1xy8fm9h9qgjna6z5gz28rj0cq65wpxpxcs4vsfr4vr1p3vmig05";}; +dratex-15878={run="02nyg30awmpp2yi4m6r9gbgz04irjzpbjhpp72j0qxzly8c8frqn";doc="1a5knp5hylpb1i7hkd9160bah7pps9b0hm00zgn9fk33g5xrvhbz";}; +drawing-with-metapost-66846={doc="0r1fqikx9iix0xm2w78s80knfwc7w0kf2k7fb3k25l1cj3ym14mq";}; +drawmatrix-44471={run="1806y5cdgnj61fy0lilm424x936dz2q5f2j2s3w71kzl5ivyf569";doc="16pql717cz27sic494xvmsw2mw9jxn71xka0k8fjys8j52pklqnk";source="1x8lc07xccf73vcvywmrqk8ivg5xb1g75gqhff12zgrp2vqzh6g7";}; +drawstack-28582={run="1lirkdnsp35l4dwsir1xyf4a2s608ymfc3r0hmgg9phiy9i1664z";doc="127c98z547disxksvhabrpnddrp5ax5dwbgy7nmyja2dg65yax9i";}; +drm-38157={run="0j0r5b2b6js88gy04d12w8wp14g7z9xcgc43y0ysn2xglcsja3fj";doc="04i8mw2lsirvzf3n8xgddd2jr2s45fbg6m6wiwjdz4d2i1pi98cs";source="0l3j52ypvsc8ma06a2z2dkqsa3vd7afqkmyrd6b3z6w3dgjlnz3v";}; +droid-54512={run="1fmm1k3sxdn2h6v56hqdn0l84rz1cgxmj586wd4ff41vfzbdnn5z";doc="14inm79ljwnr36dz97356iz4257vbvkwmbbaq7wdza1yf07gijs6";}; +droit-fr-39802={run="1wz883z4a7g4na18z50vd0156gj6zpkkl49h4k0dhxwgqibh13mk";doc="1ss2j5jsr4h96rqcqmm89mprnr6w98zbsxy87jlmqavjjc8k8jq8";}; +drs-19232={run="17jp9fvj86sp4ywgc6j1dp3pnvgllilbq75298qamnnj3f403vlr";doc="158wkgnrgwfg2ikbj98hmcaaymrwpmnmaxillksv1b7gxmdrphk5";}; +drv-29349={run="10dqig3wmp340m9h3n4yl6scg1p2a7ccazsqp7p8a4fkfw0cziiz";doc="04kgfqhilxpcc0h6rhpw55s1j14wsb5v8b6ykq7ajmacrpmyi50h";}; +dsptricks-68753={run="13hvyb7qapfby45z2cikqwaj4bcf6lvhaf3b6gq7d9831gxfwjhk";doc="0jjwa6rh39qp2659ijb3fg3cqz0lbpjpwmvj6zpxv0xhnjzrnidm";}; +dsserif-60898={run="0w1kihzrmk48hpl36a20fkz4nwp9z27in9xsi0fc3d6mhgdx35db";doc="0bwnnxypyc97jfcam0vdvpyxphd1zn31mc6lvl661jy10cpqf6b4";source="00hf5icf1n0rwxr2ms34z7r62g98dqkx5v26m3k7w1wd1jfnjzi6";}; +dtk-70117={run="0mzd39bczl4xllw2asnwrzjp0jnvldd5ldh940qcrkp9rgj9nrg0";doc="0bm35iwckkx93shilww367pr34h4wdkr1zwb3c9xsnjz66nj1iig";}; +dtk-bibliography-70517={run="1j395ffwbmps5al16rqfn4r1mm3m4pm21jy74czr26cmfd75d6jy";doc="0zcc3mr1p5c1nd1dl4hqdr8m6d6lccgx6zyxjf2569x805qs4mrd";}; +dtl-62387={doc="0kvnsr8nxrys99rp74wlxnisfripx6jpjjkqy38d3d4gw13cvb5g";}; +dtxdescribe-69507={run="1k73gikms6ymcjprphzzrw6nlhm8sdg62w5ngb2g38p0hyxi0r86";doc="0fsl1kp8ls9dkzqjs5gd3s4f6cvi3dqd5mcz46dns3v6qfsn39my";source="1vdvvgf7knmqhz1qbqgs17a0m0dljnx2lwz4d9j5q8dds2i48jk5";}; +dtxgallery-49504={doc="07c403zbx7sxkhhrwrfw3np20xlqhdk893b4bd6r8lqb0zipp5b5";}; +dtxgen-51663={run="19c9w97wjyrq6g1j8n8qgaclx141lv2j6z6l5h13gmkmyw08vwhh";doc="04z9dy0aada8zsp8ckz3agqcsm29dnlx770xyl51rsvk2qwsxgka";}; +dtxtut-69587={doc="0zk09qdz661g1lnn2qr1s23h3x4mi7q8mdcl13p19k7qmnlc8v5d";}; +ducksay-64655={run="17ihjvzz7rx5zra8lwb72vyq5i27psvmlg22sihy2lxkxzy3krx0";doc="0ydhgp11hc7hl3ikwf9pgfwf5p7q5g6m1rmfcy2h6svv398zcg67";source="124lwhv0bfc6h34q93hjxpa5ypdiibmibx1ksn9x8892blg7dxnp";}; +duckuments-52271={run="17fz5mkr812ig337m2q40dcsj98qpczw53vjrsqk1skmknk0q4g8";doc="1pbq66k699v3b6c02qx89dvzsh45knr4y9s6a45gkm4a7mkk5nkx";source="0xcdlvm247d3hl7bvb981fv07nb5g24c0n0171vsk3hacxpshcsk";}; +duerer-20741={run="1v6ja2q8bi0w0jkyl3j960gkvv2m5b7n9lg6ql9rxz7sfjcxa3ih";doc="020q5ln31smf228xx27gbbw0xdcx9f5zh6qjriakxa9mhixksjjb";}; +duerer-latex-15878={run="1f23mz3nd7icknkz4dircn38y1k2k0pwq3r79ja4h85si6i13ynx";doc="1arjf6dzzkvql0jhxg09f4yq9vgx7ag9l69csrindj8sksvj18f2";}; +duotenzor-18728={run="0p9gq8i6xcfg4pxdnqfswjcnc17x7pzsp4iya9b3fjq4kplqv28s";doc="1bc1pycds7r45c2bzmjhxs2wv0f2wqyxbycfrl6g4fycr341h8gi";}; +dutchcal-54080={run="0j49mha6lif07hnfn2wdfl949kfal4hbmzg6zal4w5rgw366szrm";doc="110rbvidl53naa31ndgh6nx19i3rkawbipz9rpxyasqk61kvv6mi";}; +dvdcoll-15878={run="1b07xplza4b3ngh50czq8vwmhpr2qvkl5xbgd93a9acvsf5pyg6b";doc="0fhkdwyvlizlb66bd24pfncbg58a31ygnfg0f9dw5z9ccfrf50hd";}; +dvgloss-29103={run="0fgc0i7cn0kd4f682xny0968l220ypam3z33mwac6ifqaaqbiy9d";doc="0l467jcanablvj95l0sbdib6dblc6ns2jcbg41kv0nxpah2i5ms8";source="0b106p2a8xr3c0vxwx3j0qmxh2z842h5x1z22509jabry3sf1y98";}; +dvi2tty-66186={doc="108y0qxh13x0iivgsvkk4370f471p03nyl4x9nn7lng1wrsafp6h";}; +dviasm-68043={run="02dxk56b63kqiin2ad80hh4xrvbhbkidyi0pxi8c2n5zqdiq81sd";doc="1hp4vrd6aj2qy9mzb9cr8l641cvxx4aw1ra0v6yr16lkzcls7s4a";}; +dvicopy-66186={doc="010bs4iyaja7mq5wy9mz6fzxlxf9472c2zdm93x9i474dzgnh2vl";}; +dvidvi-65952={doc="1w153rqm7nlmcf6162glxz282nbb6b6hjf5h0p7mbzr0j1357sxj";}; +dviincl-29349={run="1qb2cl5jbgzjfgwqnvnfbbrbzxi4m64lajvz6pyybnrwv4bax0km";doc="046c2cl9azgfg7y2022lj8x7yw8kg2pgjdixxk5989ai850k2j9n";}; +dviinfox-59216={run="0bcq55p894m5hw3zdjz7q7ns21vpzjyihg5x19lkn9k05nxrs2d8";doc="0v2sy294w0m3kniwky24lpi4ic5d8qrm5722gd7vw6ddwkwc1x61";}; +dviljk-66186={doc="03pi78c8ghy2gghzk1ffrvf5x7h8c1r0pv5pcspwxz365x2rsbjw";}; +dviout-util-66186={doc="098pksgf2iamq96rmzg5fw7i9dlpvdksficsz1bf8k8z4djnbk8n";}; +dvipdfmx-69127={run="0i83g2476bp3zfgdvg11kmls969ip36z1d4w592946547ar2akmv";doc="0wid2ydcjf5jq34k8hsg62ndgishbg6f14p728dnyrbh6k4iqvwv";tlpkg="0mlhxv77q5nanqg2dcbd51wpbcrys9xhr22bvx3hpfzwykb5lh69";}; +dvipng-66203={doc="0r001q4p5569dagayds1c56y10ls6f6v7mmywiw81l995q16apxi";}; +dvipos-66186={doc="0dmaas4m9y4px53vlg0jr73xviki338fm2n176l8ldwqj0vvq1b8";}; +dvips-66203={run="0k89qqz9zx5zh13azpjndfzszgl85hq4513kaayf4k3spy9fn5yw";doc="0acfsqbpnws8m5y66fkgcgxf4sdr9sjha067735scn75wmwi9y01";}; +dvipsconfig-13293={run="02vgk91y80ch4pkj83vbiz1b2ccigf152hm83p607y4n4qn2xzsf";}; +dvisvgm-70496={doc="1fz3sa7p9wk2g1v0bpy87vz7nxwrh5bsfl4m734n6lhsh1bkj6fb";}; +dynamicnumber-38726={run="0y779azvla68n692x0gybg74cp3dk32219v67qfamfzz389nbs7s";doc="1appm3ddbv9ll0mbnid4xa459w9q89swmdlvdzy1fxdps4y0vpz9";source="0ydmlz697c46fx0xpnvcdcfm9sm0j3jmk47xz8znd2ghzg395fgk";}; +dynblocks-35193={run="1zb7vk34k3z0cvw6kz74s7831fz17mg3j9hw60diabc0q47pwyr0";doc="1m69hys2b7fvwn9h6q3whkpcnvi04hnhx7811s5fqhdfi76v4zk4";}; +dynkin-diagrams-67267={run="0iprylvg36fs9rk44a4yj6xn2q5vy6jy2104m3j9jkyfafy2qsy4";doc="1f54q909b3qgbgqgbxpi4xr4f06dkq7z0wh49q29b1gh2zvvdxms";}; +dyntree-67016={run="19kzb4j7q7dz993znni7pixv2qljzydag3jywcsgdpqvlnk1aq0y";doc="0fa2imzfskl72fvdm1pbhsr33qpwm41dzsfdipdlgww6116rlwjc";source="0hlx970ym3zxln15pm4c2qxliaj4yhv7cnak03hhbb0dx916k3mw";}; +e-french-52027={run="1pm1k7qb1a3h2b8kay9jwby382jxp3866b9m890rj9gfqdmwbfd2";doc="14719qp1qjcx4wjwcarirj7iz6qmjgwb95b308zqdr197y1cvymc";}; +ean-20851={run="19w54ch23s75mhn94hxf4nphl5dcz2w1jx138kr0phfzpc6fri36";doc="1rylr9m7jrv0qq6pzigpm73z34p9n80fg5rf7andmvv0fcpmggk7";}; +ean13isbn-57514={run="0bzvkzpi10d9sjlsc4df5v3y7qycbz1qkn7ngy97prq58wg047gc";doc="1gf076ybmni0wzhh0fsf5w4sj4pv3c3w7g7m09k9607y4havv20a";}; +easing-59975={run="0zdyvkqydl713p61izpcp2yz6n2rfsf853pblh6xgsjj1vlhrr0b";doc="1f8151jb5nzd8hj3sii4ca274iaxscv5w8fxp758ncshr3bv0avy";source="1hha1qs4wy6s2162w61gpik2hrx73r83gja1llbq80gyvyfgdssj";}; +easy-19440={run="0jrza9lf3yf4d1wm6nzwv5iyfia6625fjvflfmxsscbmwqickjhx";doc="0f72bawmxrxqk60xb61y079bqpxj8kmvn167plbq5whq5b1fsxfl";}; +easy-todo-32677={run="0fkwlzgx20lj44cvwv8hqv79v528k1gghx30lvqhg44wqirkmy86";doc="1yj3c25mhkp16n49riza4qchr2pqycqmb2k80syn5w3dzrj021s2";}; +easybook-70236={run="1kdx1wkmcpwyyrgrhjadwnncal469b2i5f3drh78i2gk9b6ajy97";doc="1cal6qmb16xpq16gs9xnprf8yaa6xhhqvd9n40gbwv28nz1wdh8n";source="1w9bhy6rzn0yfb4xi3mprzggm1fm0x0l5pc4c9ajnncnix1vzly7";}; +easydtx-68514={run="0pfd66n156hw6g2s2p8v35gjykacci9kpyx75zcl1sw95ry9407g";doc="01qw09bkafjmkmhg3wqqgw8javrar7zxrf9hr3c8xy14rc36qkyx";}; +easyfig-64967={run="164ncaq1l6hdrjp0zinynf825hwsky1xam2yqxphhk90438n5hzk";doc="0hc63z5456f00a2x70ckvf3r54zld4d3r63a8d4ra7502kk8s9n6";source="18f4bb9yf3f7q96w79rhx8h4svlxnv0xc6xwcawav63zsk40mk7q";}; +easyfloats-57204={run="0vbg5dz6wxzk20rn51xv7v526qg8m0ih3wikabdf1bfb4n093k2k";doc="1ncmmmf2w313cpsc9s4w0c3gzvx09r26gwlxhr9rszksvd4y7fay";source="1ih161wrkxf8sfm0zyl2m9xgmff4qs6qvsz7mzxbjl1j2zxzhhf3";}; +easyformat-44543={run="181x0sycxhwcfna2wblvijjs32zvqs6xl2am4hz8204mk321rjsb";doc="0fg7y02717rk6ikw32qxn6iw7l59h5vc22aif6hs9xjnbm3nhhfr";}; +easylist-32661={run="1ghjps30fa1jvfkxrzaxqvy5ilacdyms6dl8bf2qg6195w2sgm33";doc="13wgq2pz9jw761p2yipf23k6lrx66bp25l50446rp1xz47yk386g";}; +easyreview-38352={run="10wl0aihr4c55b08mxafr0jd1xaz640p2kj7n63w3wqxzxlpq42i";doc="0nnnr4l1b6qhp75n646pd446s7c3pc4fxsxw84gvfqgankfsx3zz";source="0p7xrqivvb685d0xcljyi4whh5vr6yahskdl63ynw836bmin1b3z";}; +ebezier-15878={run="1zmsrs7dpw5gwh6h0707gxcpsnbb8qklsqnyr0q30mziz1wqhdvb";doc="03afnc0nw7yzv03n4gq38js3y6x5v0kaxi5psmnzpf2lj0kfa7l5";source="0492q2l7yrv1h51x4swqzfp74k9kb989m0lxbgvgffh4gl7zhi5w";}; +ebgaramond-66604={run="067amcvp0bifrxyxsbkwj98g1j4m4mis3dyfm5faa6k53fpwzrgg";doc="1sbi8vm5c1hlf65kh30r21vmy817y8i8i9l3h17ys7dfwi0d4f85";}; +ebgaramond-maths-52168={run="1n8xfa9qmxsrpy78h98x95wks24fck3mykq5n8x0qasi4fabclnx";doc="1x4l9mi2cc1fx3qbis2ibshh5wlfn3sypxcrbcr9cwwhpkg07sqb";}; +ebong-67933={run="1skwh2sly6bckgc05b44cvl2pvn42y3970rvmnlh9xm2x5ql015g";doc="0fa0kdipnn5hgfpjh8rz3l9zz97i94v45xmsxjgjn40xqnai3v27";}; +ebook-29466={run="1jy79jrf8cd1rljg9f3g0hzkihxkpybvbgjnkzd5y6cfz7zaynp4";doc="13cj8a88qqgi6kl1d7kb0cizl4i2pjm51hqnz9q03249av3z377q";}; +ebproof-57544={run="12dqzyi84jlzm75d77crxbwv2nzyw8raypdj60bjrn6kifav7v0m";doc="1d6g3v3hskgd9wrddkhf7qxg160n6qrfgzxfswajswk0kg2w3675";source="130d3af0n0gjvnm0ad3g6pm8dy1w8zp0q7im3gv1kqbm7k5h0hny";}; +ebsthesis-15878={run="0vg8n4xrlxyjx88yzlsr82drlrigdnb870p0rxd1nv2ik2i1jzri";doc="0gqh1zxb1w050a9dqnc5vhx1jgmk9kqk9k591s05xckidhnpp2v2";source="0rg2bs23051ravdqv14k6yrrc993xpxf61zi8b94f0rjm3mg8f89";}; +ec-25033={run="0l9zf4zs8yw84x5rnyzaggz4idl4kmvj40c03jyxbsxsx6bi8jks";doc="013w8hdsln91k13c3ilv36p4vp1263knkxf4m3hh6vaaqcr55aw9";}; +ecc-15878={run="0sa6f5dbq3p0nskxwy8namy7hckd9ihz4j440v06fyfk6wd2dxn8";doc="0v95nvyv5ygfrwwr2mnaja7vxng3d5byglikkirympgqpkc59rv4";}; +ecclesiastic-38172={run="008agcka4wj694snynfgak1ycm49rbkwn3z58470adc4rwi99klf";doc="1xmbxkmia5pcr2l5m3rd12qzpq92f75rcbipgpvck6sqpp7psc8j";source="0c32d6fzzn090hi9nxdj3qbbhp4q11siziwr7m6lp2l285n91wj6";}; +ecgdraw-41617={run="09affkfqlsrjgn546h6fkbzi4y7dy9zgf4i5a8kw6lbgl631gvid";doc="1m42ngbia5ilcx6hjd0xid07vdvxmrb2vd4qmzr8bzzflj2janhf";source="0825jfxsmicfqv1amnjx69wmfw893pcdqihqx7vv6yd9xs4bqciy";}; +ecltree-15878={run="170bf0i0g2fnmmv9qh0jrdv7xn2xd5xmsw8dpvw8rbxfmn94l52b";doc="016hlxjhfzn2pgcpxi7hw0wnfd25idp70jvig7p8614pvkv3bsby";}; +eco-29349={run="0vp39dva31kjs4ckqdy49smhicq4599mqly7y9d9xfz6gly6z9zh";doc="1wb866ilp8hmxndqys1lpw6zb3l1nyl583z06vh8nfys1hp0x0m7";source="1j3ik11vjxc1dahd0p7jdcjjqq9i89fnd9514s1lq5499h8jg159";}; +ecobiblatex-39233={run="0mrrb3bm54d6rpwg8i534wmwkh7v6qzysvd020pi5pph967lqp54";doc="0mhwspy6k7ixjjxk5frwklasm0xzwbwk2lx684ikv195nrpb6y8b";}; +econ-bst-68761={run="1jhvw59f913d35dx6zxr42bcms0i0d12kxd832km50kqi08wb50m";doc="1akyhlnd9g3rnw6kqi6cm4h0mrr1f3rbjii36z4qydl4gri4rvp0";}; +econlipsum-58390={run="0xca6dhbz49zxn58g5bc2yis2zci9v5iypfh3h53rxhlkbfbcqln";doc="1pb6z051r40wp8rv5makhaxbf23aq5j5gm6pw1khvhk806rdig4w";source="0j26l888qx5q5j39875iab4106fkn3ign9fmbcmcvf42yzx7mav9";}; +econometrics-39396={run="09zlc6943vf9r2n096x6s0xwbyl4lnpcv8a1hmn81s5czawkrqbs";doc="1bv3m38gp92cdwhvpwrhs4p34hrmr8800js6myif4r52gnd1q4mb";}; +economic-32639={run="0jyw807d23b22md2ib7xkgi2jh4mr50pczjbsylh2gdgsplxgaw9";doc="18jn833w1chbi0qamdxbrrp39945drslxd2jkzi2g8wcca7l5b71";}; +ecothesis-48007={doc="1avnq2y5l2bc2lkf2g16p2vh77dabv52jr6jrm4jfm1wdapc6fmq";}; +ecv-24928={run="1rvj3rf5vrjhqsz070id4i3l9svwsgclfhkjzxlb42va1bqxkcdk";doc="0cp3h8pagsxpr0i28v8x9dh9j6imbprd2hxrl6ln2m75c9ki2wmk";source="149jwhqpmfn6gwzkcqpilxp7hqnidjlvhi1khqxnvq3k947x33js";}; +eczar-57716={run="1hpwjxsr5n7f6zdc3ap00d9l4346yvavsy4wjicj41b1g7wl46v5";doc="1hvw36i6szhia91xq2y2jzkngy0aawxw5azpa77026byqm8mrs2i";}; +ed-25231={run="0wb34cch7jfgvfql5jy6vvfalj9bv6pjyd9dg2i9msq1azvrjjv4";doc="09kn8cykfsyk14g428v72l2ppwffcdrrycnyl65kixv8hj0vsdy6";source="0ldjyl7gpa5fswzabzmklkwmz94z8al7pm97hh0yjzdqgjxfsdbx";}; +edfnotes-21540={run="0aljhm0wiks5v2s9qkwbp0ma8p6230ahsyr38w9akwy4j9ziiq75";doc="1260dir3aba5wv12a4xidx6ld0vizl7n9m7agwrkmbanpzcqscf4";source="0wm2hynpa4xk464rl5ikxdh5p71mp2cwzac2xl582q8fik7vjx0s";}; +edichokey-56223={run="0c4hwpvassgrlycrjygwywp6ws91vhhb2wq1jwdla8x3sk7hkdr4";doc="1b79022plz2a6gbf1grrcg4j6794fd0a45lmq68lci64mz33b66n";}; +edmac-61719={run="0cvxirrcf7qxa1a6r4fzklqrmala7pdj9i8wywapy0anak8lpd9d";doc="1s33bml7f2lsfrj3fprpazjgjiyiblfcjr554fwq8aadsvgz2xxy";source="0hywrvvxaqb52hd29r0dkixj9fcczhr8b1rj6wxj3wcgdcbfhlm0";}; +edmargin-27599={run="19dmfw76l03v87igfhmh81kbfsp5zbznk62vqpanpppspchlx7p8";doc="0v9lbfynw840xampn4sgxmq413357wjwjr5slzrlpv9mh1f8z0jr";source="00b7b5c4n7baw4c973d0b3d4gzkr5k7m4xj258sw2bhfgaqnrjd0";}; +eemeir-15878={run="0hxnd2rxrm56vblrkvg01c1pf5gccbmvd9lvrwlch89flxp3fiyd";doc="1s576bk99sw867ywkq1qhk31yycc19zqr34ry2zix25cs3hk4pia";source="01z6p0ndp3nc3pbbwchchfn9nlk86kp35qvb5hkqb3ha59wlfyzs";}; +eepic-15878={run="07hg546cp5ab7x4zq25m7z184mvg7hyql7dsbwvgpq6hyz5pqzyq";doc="13v8n27iw1b7qvs3baqqyls9cp2mqbycrbax7jnr8mfvp83jmpkz";}; +efbox-33236={run="1jss3bkgyl365rkgzil7xp4pab8k00w57p60s2sh8wrdy10qjsda";doc="051s9yc05ai0yipwm5f5kdqxgiyiyzmzyxf8rbfwl9ir90k84fq8";source="0fcrnrfk6yrdhj25xmchlaimc5qqyhri287b9pwdwsxlr58wgx9c";}; +egameps-15878={run="0y6naagmi9qii1k4qcp4svczxy5vbramd9wg1ixr8xckp806kn58";doc="0i36znlwls01ch6kns5ikw90nbq68pn71gpvfizf0x9ipymqwisl";}; +egpeirce-66924={run="1ld3k182k7m17pixv2acn4dzlcrkj973y2xjbw653xhs2g3mr1va";doc="1mldpazfnldk4q0r0ddd9rdg9ar6fvabqfb3r2g5c0aff5v2p30h";}; +egplot-20617={run="06i2jh1srww8111c2axcwn2lcs7lwdgp7npn2qpi2x7g38i2kkzv";doc="1silqbylbkxfyzacmyvc3kf8g3md8931ax1s877p5x5zi0vpwbz5";source="0qsyqhmx0gcl13hlhbia9rq82kkkhc6mhmzp56g9b62qy2wl1ss8";}; +ehhline-54676={run="11db4dh948g744bynf1ydlg6jk562picrzfbh5pszxvfdag91kar";doc="18jr25hnp8hg3dbjgf16cskdhm6kx9nxliiggqixb7c1ii6mmn2v";}; +eiad-15878={run="15l4wi5hfbx8lp91jddxwg073z0r42qf93kvrqv7bwhqisk36x2g";doc="074iirkf7fzdxik5yq4jjk2p8c5k9jj8a6n178aw767j18h4n2n1";}; +eiad-ltx-15878={run="1ifiigww9nk6hw342qj1rxzl2b94f54cm4vvrpffxy9qggwkd2zx";doc="1h4cm5b0mllqflsgfcjdh97zn3nn3d9gwa55w5kyimmxgz516mng";source="1bpy6f6d81n95x81rgpz2r1vzg9gw04309shnx8a9jsx17fnm4nk";}; +eijkhout-15878={run="00y3y01jpgzww1x6zjh748hpvizlrbgrv04p8aq3cm2pzs0g17qk";}; +einfart-70318={run="0nkp5ixkdcl46mnr4kny7cnwrpy3zi1hmiaqymcgxgg368dx88cd";doc="0bvfhvxy4jlx2f4nzy5a7civ8qkbk57h3fskhnczyyxq4ricvhin";}; +ejpecp-60950={run="111sr2lnp3b8hh0hyvdf3zv6nr3m2ghl8j2zklq0fdimm7ndmqcw";doc="14ww6ilq1l8f8i4fcafl4v0im39gajkr5189180lbrim6wk8gys9";source="14223kfrwhi1hby3lqadp70pn9ykagf1cwgqhapm5856iai4ravi";}; +ekaia-49594={run="009wk5qyv26rdi9gjbaqxcpsyzz6l5w8b0wrg9avspq81hrjkg9h";doc="1rbcnilarzap8kdsvypjwin1d13xskqq33wg6p0p02b8gaxzf3a8";source="15fl2jhhv01vl7ggwmddpldkmwdj6gj99851aczv47lj24w093bc";}; +ekdosis-69568={run="0drs97iqw8018m15hls6kg222r0jiyqg4n9ksrgrl9g2sd25h65d";doc="1x177sag8ki0pqsbvs6vjk07zf45wg8fmq9s50v8y4qc0pn5xa4v";source="1l6d4a4smjmily8mf6rlx4j5354jrpax15iggzqm1ncspygj0mfd";}; +ektype-tanka-63255={run="0qnkc2i6zxhx0i5mqx57qf7792ffg246yxcm14g1fa1nlryhdqwd";doc="1cmsd75pzv0bfr9y868cbpxx39ixs64pc2i8dsi6k90wfzq2bq55";}; +elbioimp-21758={run="1vfg29q8b20zi9lhn9nsr55hgx710ysk0dvfqpipqjf53fjsp0gs";doc="066g7g84fna6wy1slyh2sp9hmwjhp57hc3qf59gj5mwqvaaym8bc";source="1ysvjlmik0kclmcdf738vhl7xigsq8c6lqpgl3z2daarlqx6b8c1";}; +electrum-19705={run="0ckfb8xq10bx44zfdjy1p1hfcw18mlfli8zgjks81kfsgv7hzfxj";doc="12mq0mn56xi4h8dwnfnlhg0bn7qn6b6wxx20nqd73qgm0p1h945s";source="12ys4fdn1kyml62rcwpb424l86kspnzb5xq850ppbb82ng4146js";}; +eledform-38114={run="04sd6m6ay9iav3scf72i6id726gn12qgv19hbaav7dvbkx73s10c";doc="0f8inf12l7f8cg51adr269qs9zc0imsk9g08zh793aarvrpfh4gm";source="13phf594kj5a9ql14wvd7pzi3vcrwg61lmc4fb7079j2xpx7drmk";}; +eledmac-45418={run="01is22hyay4xl1bp58g08kn99478fz5l22xdlbaqyr5yg0k4rgmc";doc="0x2h38mlixff4yacqrvz7k4q57cwigal3x10f3k4qdr91q9frd24";source="00pkybywz4j1qcki9gv9mfxqvm6q3m60b4lj2ms44c4mric77wk7";}; +elements-61792={run="0a3dzg3d1wz1zni57k8gibrxczjg0k16vqqkbwcd509blwxgps4r";doc="174467pvz1q4d72z215pni50084ywddfvf8c36ibagijpdvrym08";}; +ellipse-39025={run="0hp6gm0na1gjxdjivxgakbkrq48mp9zblbfxxw68l2aa4jm1x1a6";doc="0invkczwak9b89n6w8ny9bh1mg7amk418cf6b0552pb5rpkbby8m";source="0143mncfyss0cyzq0aim8lvzxhq5q8a0cpsh92llqjl19s30d3fd";}; +ellipsis-55418={run="1zbasvm792cghiji6gkg27ixjx7ms46rgqbi3wphpm9dix9296ap";doc="1w9hp2k4qvhg5275iq5kq79ws5z6i7jb1536h0qrznm0lkw33c4y";source="1z8f3x734nc364gybhslxzvvv4502a29dmb4nlz39hm0kzgqq3h9";}; +elmath-15878={run="04vacr9c71nmrbq6hnhpcgk8g75jzdvwf6z513mqabr9d0gf84l5";doc="1da0lrbzy598yy9jisjq0yk2qfjfiqpj32l1v63l3x7dff6yi4dn";source="19q44k909mkxrwsqx4zvraa8cv8jbq8z46xnm53agk0jr94bpiqk";}; +elocalloc-42712={run="0jj85nyrq2y7w7pm9pq8qdj3xszg5s3a1j8zx2dvsy6a1s7mzd8i";doc="0rgf8vijb0dl48x4rwbzg7gd1apjs7vwl8rj7zyv60vx53zzkp5i";source="100hs4drnz5jy657crs8g62281sbgza7k78pvk1qfds2y8la2968";}; +elpres-60209={run="0k8jcp6bgzphlg6kh0krlm95d2rq9z90hscsncq1m236hrzfad3b";doc="0k6ygcd10q78h9f28y091l171bmaw7ibk9npi3kpx33vmass118a";}; +els-cas-templates-62931={run="0lk027m6s6z877lilqv8sq3s5xcmmqqhlhrh8p1kaalw01g53hy2";doc="080sa0kls4w4p8lgvahk5an8p6lmkf5kywbzj1wx4n5mqsj5mpcn";}; +elsarticle-56999={run="1jjayypcaczxw69dk3v69fj31apics2356l934kmag49rwfzxail";doc="0z7iywirs24112fmdl8fm818320s3ilqlgc7xi6nl4idjakhfmi7";source="03pw09cw4hd0ixfa88mj7bijj9r3b6a6kg53q4hzzzl97bf6v5yc";}; +elteiktdk-66821={run="010vxx6ddmbcj004a9f17wq6a9myx7hfvnmas1b6qsch6ln99wdn";doc="0d9fq58svc80kx557kmqa7dfz787zbzhpaifswkh2f0a327f47is";}; +elteikthesis-66820={run="1xrilac7n04s28ww54pdl6zn2dwnwl1lqc7xzhqkrinbfxgchg03";doc="1pkkwbb4ialcmjbcyv82psq6g5qyzxg8hgvgp2n0xybvvxh4z7mn";}; +eltex-15878={run="0k782lxa85dsmqbcw5q8gdny1lygfsv5h2d1d70f6y0df17r57ad";doc="1hshzr96sn318b7ssv6f5md23v997xahm2232c3kns3rzpfssy21";}; +elvish-15878={run="0hz3cfydpm0sq6s2xp8q44k81xxhqm5mmrx5aqn5wzm0kr52pmsy";doc="1zzzqgs30gbhy8ja13zq9b2s6mf1m47ms5rp33jc5xp70w5cjp45";}; +elzcards-51894={run="14vd8vnnss12flbszsg8357831r986pk7hhpcwqln53r6x5kd543";doc="084zcf7dqig379cqc6ahiqkm8f5jwqgiizd6h5ki28pcbshi49rr";source="1ipavy4km50d8larywyb63dldmawawzfw3x6m5nzvi70zkx1f6rw";}; +emarks-24504={run="1qf1qrbw2fsxc137g8dfsx1c202ylvg2ijdwcmxq1fv1pd2zjjwz";doc="00fkdarm7i16vlmjzvjpkyp5v4mbdc6isv12g07shx3nz5v4zgp5";source="1lznlfqhcwd3r8dp4cix5jav3dq63v4wspr1ks3pm0bkycy8wr5a";}; +embedall-51177={run="1078qszq99jdcy2vsaxmg1fbnr9fdbd32y5lyxl4bwl0ja62m459";doc="1c17d4bpzxws6j9z5p7x97zfggyzyadfjygbhi7ykfiy55qywhdd";source="02vdmjb6vqvqmfq7fhn5gb09x2lzpmrfhx6dspv33wmwzv99kzr0";}; +embedfile-65528={run="179a168b71h8zkdcfr7krcm2addbin9chckaczj8a8ayy6xr294l";doc="0iqg1lbr1fb6ckdqbzyml5qwpdnr606fmhfgvxvzb71kn239cg8i";source="1kc65i68h4nd9q1fj2sl094n6q0js47h6bh00677a89kgjxvpzr3";}; +embrac-57814={run="0n2ll7mxgw228qb3j0x111yyiaa4ikq4797g5k8xyakjmv0w3sv0";doc="1lqapcz7iv8z7df7cyddg6ylh2b61ndgbfhnfa8abzgsqz1h8sjy";}; +emf-42023={run="1w7whsff28cf3p0i8hii1lklb8i541di3g4z5iv2rfm4xa5m6i2s";doc="04qq6ljidaqs2i4lxp3m1varm232rhd026qirvr8q10vpkd6grad";}; +emisa-60068={run="120aa7a4m1psqx3wclwzghq0fcyxs8djlf79mp2ds56y0mpsqx5m";doc="132h5m80s24w51px615di388r7wkkqp8ihwapdz770p5pywk3c2r";source="1pspisyb3pxj2nfkpzzxc7pghackbl1p9dwbr5iqzwwv37bxjgli";}; +emo-66944={run="07df21ziq1ajpmff74w5vcsvh0kd2dx7vc7q61syqr2yqvj635cq";doc="130zqvzv94hi0h5m742kn7vc8110cwjd3b59dxdpihm76gqpa9zh";source="0hy6pvyxg0k478lpdfirb92mx28w27dxzms5al3pjq1mhr04bmf7";}; +emoji-59961={run="1pzx221zrczj26pdw6ijai6m73zgbz6z14d5wlhv7albrh4ppxgs";doc="1531y2a3dfmv2y2xa7xi0dpdkh61skk5makiyzs8mz3zl19n8nkg";}; +emojicite-55131={run="08y8qg37m8b3qf2wkbg802kmx359i6ki445ljjnxybs7apvxjpn5";doc="1iwlxc5ygq7l4qag7yxxas0rpcywmjcv5pcayrk5mz34xr06x5f8";}; +emotion-69881={run="14rnlr65ilyf9mirbddf9vkm30333yyyyd53fjynpq9h0hqrlgxy";doc="026yggkjkkvsq04k232a6p31wvj2zxravn13l5ijxs5z66hh3svp";}; +emp-23483={run="13iaipg8n1njzbnd8s622irizd4cc1cbkyc735mplvwq10q2jxqq";doc="148l1xq42avnf5gz1sqjcdprnkcbgsii3fm1jiamx18175zygsdc";source="023jc6v2l580x2d480x11z6rlknjjvx8g3qkcrvdi778h5m5bb94";}; +emptypage-18064={run="10h1mlhk0841wgc70hp51jnah14si7rf2mwpkp8lfc1xr7jwwvi8";doc="00l43lhrr246hiwa717b72rc4ignqd3kljkw6ka3l8z1nzbcbni6";source="16nzgkvl9gqsnhx38dp71c3cz5rrgm73n99g2vg7rapg0vb623xi";}; +emulateapj-28469={run="11yv57sv6ys3g8h2ix5xjnjrbnyfvcma4i7vzdsj160rzi12n06v";doc="15zm7jqpk917l1r2qfkqdkbsxa2q7w4640h9115v4jis0zwgj0s9";}; +enctex-34957={run="02a26lzlkkw3dabxci7w77117n2bagsdk5rlcn4cps45xdbjqikj";doc="068qh474lirr3yzh8ggpavqsmzdv5yvlc1i93f5cx49cd9j7dm0w";}; +encxvlna-34087={run="165xjggnbpc9baj9xbdkxzxsb9gdsxffmakffw0gzp82acxgfwsv";doc="0jc0wlhmc7f1vrabzk6ql62iian2n8s32r2crq34w2cjglmf69xj";}; +endfloat-57090={run="1vqy4ii3dz79ffpjc5n234z9v0lqpkq93vla0lbq0791h71gv53d";doc="0y3hkihs6pc0g835nk21qj8v3g27f6rrvadwmvqkhchvgh02bwnl";source="0mdr1ga2p1ikbcs0zzznb1c89n8shrha87qm49sgzbj4d0f2gdbx";}; +endheads-43750={run="15dkd3ky14phrc9cndisa88vbmcp48wly8l27k4wvbbd0221rxwr";doc="0yp1rm4ly2005mw488yscrgc0y8awsis83wwcfh3qh8rcgm8jzhy";source="0578fyav3h5wz40c12r3rqzbsba7vqvk0r5jlw6wymk2m9n9n5np";}; +endiagram-34486={run="0vgyl6rbgrq0jslb5k1796hlnzxjpavl5ab6vj6zizinr2rvh0dc";doc="1gz8ri82sx9nn2adb7sv434im46cb0ld9r4j9fz07kqn6gxzzr2j";}; +endnotes-53319={run="0hm5mwxdvxhj9v51y88g6mm5fs9p2kaksmhps032cbc1inn5asj6";doc="0354v4klgz5yn1v9hkk3zpvv3x1l4b6jzla7iwxpnk9qb0bvfh4g";}; +endnotes-hy-54758={run="194n7n7xcjpsxijzsjpgsxrpshilki0ixkwlbn6hxd92jjq7amz7";doc="1mj4lfvn86676s3sv0v3hx07cjb4mm3j3i3swwzxg0i48acpch52";source="1qhf4zzhk7kf0wcpacl82przkcf7g8z6jwirrzlwd39876jmhbwk";}; +endnotesj-47703={run="1rjraz5m7zqyj1j7c640ngxv7i73d03xh5wsmcaakc10h36n3pyr";doc="1sss0shcnz2knzghjqw41s17v0bs7dfcmg6x566fdwdm4mdg4dkv";}; +endofproofwd-55643={run="1dz3kfsjalq9419l9sdjws5bjisy8pmy93my8m8acdf3d4ryr11x";doc="1m5wq64v14cz4i29smnw742ak6sraxq9rzwcqkg40vgzsss73lxc";}; +engpron-16558={run="1jxk1j23v2c2ffqp9x948gkjkqvifp9lhd1wlp2nhmr4k0k3pgmq";doc="1j580xz1jgw088xah57zv8mrn3wgm6xipj1jf3c0rxyd3fkkk29v";source="0gg46lfqprs6jr2dgpa1c882wz9k8jjzrs281npy8hk4hhqgrg0y";}; +engrec-15878={run="18qzqg4i4f2dcpqdw4zs9lk8cxlxxn01wbh8a275wiaqj5fi7hzn";doc="038a925h1047a8wnwm54mmyq12332waxx8nbrg9m3pacr45hwmgy";source="0x32a3cgh7pidln750qbwxl7bkzcjwj4brxbqmhyfydnhzw1xzar";}; +engtlc-28571={run="14lz7dw8wgksbihdvga2yyqa3qxbs382s5pzrfycx9z7503dfy0w";doc="04lv0x4psfpivxfx5asf40pn0d80cwfwc1pwl21jxihdvc6jhihf";}; +enigma-29802={run="0cl7a0xh9y1lg55wdkj03n3ayyb0853nad04fpgjla6z9c9l1lrm";doc="1cnbi0n8pw2m8xvxk51j4rlyvj112cdz5zjhc9n8znj25iva8in1";}; +enotez-61490={run="1nxn52jbgxp2r1zlyp3hmr0k5kwilmf8fkr46scnh9w1ijxxmmp8";doc="1jw2mbyz3xnshrb031b6xzycqckpn422rc1ddrdj7r2j5lzy7l2n";}; +enumitem-51423={run="0hp6sk3i0a1jwwvlr0lk4w75fc57c2fvqw9x5ir8db049380ixyp";doc="1byxv6d9g38fhd83f4g23yqha8nvr5iv6lv97w40jn58i492dyrq";}; +enumitem-zref-21472={run="1isvqbp7wvib81r0yn7sngxa2dygkfm4jn4rdvw0kp8rknam91qh";doc="12ffsw4mzwg8gnw264kvc9gpxcmrhda5pwfyml2ih50g1dj6fwv0";source="02y3rlxcsdmafy4n4iiaz2j3syg5x7bzwzfvfk87xxg0n3bvahl6";}; +envbig-15878={run="1szn3ngy2iwzbc9y5fpchr5vpx5alr908q8bfg94lylmb8lx2kb2";doc="1y778gc6wl11afjjv2szypc8jf1g7gg2s0lvhv2skl1n3wpb3x7a";}; +environ-56615={run="0in2a7ar0c6ji7qhrbgp4bglcr2cmb9imxch8fcrwkims4g3vjp3";doc="1pb6nmprhz3j9dx2h7sw0y66y1qlvhkjl3ip28bxa133fgqab148";source="1jkbi2g2s13rngwqvr435i9n94ycnzp9xa8szik0nnmj482ah2hn";}; +envlab-61937={run="0q84vy7zbjqrrvy0r2j2hpbg9b5vwbwk860q24azms2zxy50a8vd";doc="16fnyfvvixp6lfgvz32w92q35s21c92556qxbgpcd94fd1pw2bki";source="1fygp7wpyzhzh070sa61qk17h05rqr4m1wqp78vpp0awgkmdji56";}; +eolang-69868={run="0hwp6yq1zw4hilh8zygcm8dc74mnr5hhn2x4gi6q2b6p43pqkip1";doc="193rv7lfnmfhbfpaw8ayz0di2iq83i5479wgca12zdcin54hhi97";source="1gqsl2b3aw485d2g7sblr9wi28sfq7by3y0kcj0pf9rpzzw6m7nn";}; +epigrafica-17210={run="1kawqgy9kbr535q1v84kk29q2fwhg6yzmgjd5i7dyg06cy0g6rci";doc="06ichmfivx1v2y67f5nxx02v75wzci6m3hhg87kc4qik61yp8lgw";}; +epigram-20513={run="1zps5067mgi7xq3fpjvjln8i0rz53j7qn660khraq8ribv4glnpf";}; +epigraph-54857={run="1lb4wzjcag59dcfvizvng9s47v3x2af6v62hc1x3ck3fqzx9haa4";doc="1h13sgi2bxknx2m5kxxlv9p4fxf1pxh1zdwm98h3kamzb4a4gm81";source="0kqfrmx732m0a6k21iiq1ar47ff50ri3f5wy8ib6ssbbvd9agx4l";}; +epigraph-keys-61719={run="0p4m2z9v0ckjncy5mpfs85nzpzzi9lx30a4dh6rjkhgmnk574n6m";doc="0gd3mcw13r3245dmd3fsgyww30f4anwff6vj14xsy75zcs9k0ywy";}; +epiolmec-15878={run="0wn2pi3n9ls945i4v3x36kgg34sqhi1x4az5gq6lbvviin4lnrvf";doc="1j9n7g9z2wbbq04wh2x0cxx7m4zggh1scblwrx9g69sd8r0b7582";source="0qairwq1jfl5jrkrwlblmsc9gb34wpanz61zmsawz94yf3plwxxs";}; +eplain-64721={run="1nix31pjj4licp1145dk4vpbz5zsfiwabmj5jzgxvx883wbkwrnm";doc="1b9w6gj4656bj0q622w75ar7a40qf6s8bsr4nfjb6a53nh8ga6n3";source="1kncsw127i87d7cq1wz3nhsghq9nf0h3dwxhmdbki96wskgw8bgl";}; +epsdice-15878={run="02i2fv7c0kxg9d96k8gwcvm56vd4rjkndc68k1x2wa19f1ymsmi4";doc="1cxrwbnrfg161ddc707msjya678fvvmvgsrrigdzmqrngpi7vh61";source="0nj3d8nqc8x41lmqmicqf67wc4wirg0q0djzi0nbk77g2m1qjs0l";}; +epsf-21461={run="1i973a2hp5ms1lzgf3g2b73j34xymak9f8wz88fqczcvdfnnag2g";doc="0d6jhhvw882kq9l2a4vrfrnxxvkidfjkmp3zm7kj1ir8mk9qvva2";}; +epsf-dvipdfmx-35575={run="1p0syahj7liknn447lb83p2rdv8xazpgabk39rjxga05pfn3csh5";doc="192x6cg0dh0j9dknwb320g73hid9px635p79idr33x2zq3gaaw4r";}; +epsincl-29349={run="0cmjwns5hnlqi1rk6py4s07kbgflm046pycpr1lr5c1dacmiycxj";doc="06cyyhnphdxigpq4bkg28rx8h9kgmb3ywpbdak6v6ivvlksxgnaa";}; +epslatex-fr-19440={doc="1xs9977g9g3i6sipkf7i9jdl8sdm69ci3161a4p7k66qbizi7zvb";}; +epspdf-66115={run="1yjga00imbdfjqdqnfl9k4dhyacqq7c3i814pn5a5fz5bbyv66qm";doc="038fw9ycr0wpaq2z2cwid80lizl6vvj5q0i4bnx4lgxkfa82i92z";}; +epspdfconversion-18703={run="0arf6kmziarh1sgani0bnp2jm8psxj937hrkaslfj8fm2s46gcmz";doc="1xpj5lymdh9w2ary36sx66ib0hwbjfbbhhcipdq4nkikq7a8zmpg";}; +epstopdf-68301={run="0rqfnd8x45m923lr4fwysxk3icgnpmzrdj2w0gif0dg4m1d8sggs";doc="1kjqzi001nxbrikxvc9l3fpc0pz7zhmknqghwd8423flym610vv9";}; +epstopdf-pkg-53546={run="1bd7bkkk5hbp0bfzrvjpmfrrvil9i2pzmzl7aaa324q7w4f1w67k";doc="1lwv6av0b4v4vzzk3i27diw42hcdqzgvis1fk4fclkyqz7w0ai4d";source="1qmvc299bzgfrf31sa4027rgkq3yjg57318mbx4gl4cwznxr7zh0";}; +eq-pin2corr-59477={run="10wrhqr55r45azk4z840wphwsfcm6mamzafijqgldi2g90cp0hsf";doc="0ii5dnaw1lplccp18gjkixxsygacz44r834r0vaxfkjmcbx858yw";source="0l6p9bwaszyzj794vvyw3xq8nfaypxb04ixf25wniyg3kr54a9nv";}; +eqell-22931={run="0i0n1vb43vq2axghik3sbs2cja2fi78jl0q5xcrkbn5gr6vi49md";doc="044bm3jyll74jrxh8va8g38shjn3b7wzchjq39n4rjp3238wirsm";}; +eqexpl-63629={run="0d97dysvgyk2cr2w9xaq5ipgkx3i33jq5x4mak8pq65bgbpl5dhx";doc="1nkg2qp7lg282rpf1ds5gm43gnnylwf4df3ziikssjf9pnamp7pw";}; +eqlist-32257={run="1cxas8g683y4i22rdakgji1r282mivmnap2l0b80rv3adg3ccvrl";doc="11lbz2s5v35w13vvcf2bs4y59hsdd0haai1244jqswyfxgamybgg";source="1lw20i1iqb0lxqpv2g7dw62ff4xd8w8k4y2ccpqmsb987sk223d0";}; +eqnalign-43278={run="0214pwf689rj7ycjzrafkhpj1rrn74h043vryihyscci03lf46fs";doc="128yh629nnxn2ca799s9zxbvbp0zam1lrz8nciinfbb10m8igwv9";source="0pdzvs4hyyxr229jlcw7766qd4npasc676hf74nx0msxwm5iq2yr";}; +eqname-20678={run="1qryjgmn2cw2indmmybgzrcrakqi6a3crvdcyvj769mciz8lsdwy";}; +eqnarray-20641={run="13vm2xqfm36a1fpljchnmjnl6m4fia8x5bia0h0yxh7yw740vbzv";doc="05vh8d0yyqhn7d45ykrql4dbn07f8yh4jmr6qmx1mkhyiz44c9x6";source="109ds6zn3nl17kb4z6m1xpa5ds2iwqaxqbf5jmw54547wv34havy";}; +eqnnumwarn-45511={run="1mv50r9g43si8kmdmf3kgcjmw10kzipq67ssd3vllja4pn9yzmz6";doc="1ypvd357npccz8vbbq8ss92cmxphq16isvw4ax0ppgxp2bh7cr4g";}; +eqparbox-45215={run="1bg49m7nzw20g2g51g07d7sgq0sjiisrbaq4ca31qbybr2rxcp12";doc="0z86nwj06zn55gk32wwlxbqfb12a1fcgqizrpagm7yp0xr99b8wm";source="1ny9mcnb76yds4l7q35wdm0x2vzia80aaqr12idybkzi75a7b2yp";}; +erdc-15878={run="02sf80cadhv7if8arbjcsgqkb0hhdrlpq6izqgcai6vb7xsc6niy";doc="0nv1yqxjmp4mfksmxm373pmy3zzbfcfvi683dalpslzq2qyz20yv";source="1vpghcpm9a2pvi3plh7pjki7sna3hkzvq2xj9gzmhqxcpw3jskwx";}; +erewhon-63312={run="1nw8y88z39wm0f312a8r0hwmdy85nynrpq8k78l1iabq9i03316h";doc="0wp19ficxpgay4bbs1hg3yrxmy2hlslgyawa03naaxpy1jysx8pw";}; +erewhon-math-70336={run="15yd3rjhv52kplikvmp6fax8im2250lb15s9hh61c4f4a7i79pia";doc="1yxzf17irczchn6chiyp0hkllq849ivlb7b7g17g61b6gwz0jd1j";}; +errata-42428={run="0hp8pls350swslim7m3cpnw23v94vnqj9avfvx9hq0bgl99szc5c";doc="0h30iip57km31074cya5fyhlmyamix8anpk19rqbsfb43h3988g8";source="00bdq20dwwmq0nw3c271ah0bclzkzkwbr5ak4y9asnab1g6fl5yw";}; +erw-l3-61799={run="0klwkq6x58bhqgc849yv68vg7w8ivvzib8rl84ipf3gl1hk42761";doc="0qkg31gi4jhgvc3i42cbj00ccavwrxfmygngn8qxfgmsphx3a41z";source="08lh56xzj3wjh1dp72ky8ckga8k73d3alf0vxjkwb6b6krzz4gm9";}; +es-tex-faq-15878={doc="0wp5jx1qs4yp3y4qpwqhpw7rnilw3vb2z5xb4lzwph6zw27jf6sd";}; +esami-67707={run="143pdgx8lscxhpbh87pwg57m01pcmax0h46g6f3cqixcdvfh0qp9";doc="146jgm694cvw7wn15q1p2ghzspb1hlr5hxv1ddb89mgkgviqx3iy";}; +esdiff-21385={run="0p5d89r6pzsf0hzaky89843pa4z2n4dgq3yg8li4gb5m2b4fjfkg";doc="0jw4rhkshni47zdk18b3gd4amyhh6v9a1mgja58wmp2vrwv1nn2f";source="0iwkbkmkl31wmdrd1wapd94p70mwd45lqld3b7pfb0j287nzkzl6";}; +esieecv-59638={run="19vmccxpv3dp1ysicrj5sr6xrsqgaaz9109q3gf79gdvcfp0g7lm";doc="0ji6pf8b2c3ka17n4qgnykfwhy7nh3zp87cg913j3rah0zk6fqzw";source="0r10sipb7hd5dpzsh97qiqb5adx5j6iw2aly49f1w0l8pxi0fyyn";}; +esindex-52342={run="1vxdlbqc3j33gdvy04pifd0cdfvnjwmpqbmz305g79733hvlbw55";doc="059y8wnnzqn1kfy5jhbpk8zi4lgx7r5s6xg6b7x3iih1ccdyhwma";}; +esint-52240={run="1i9bmx7sk3fzzdb1ny4a9b3sq9mjjk2x78gk18y77rxq16d2bjnr";doc="1sdklwvw46yj8xbli4yl6qqp5jdm9a32fkspk72p5186swwkwnc9";source="0j4ms51a3qzk7mrc9vh5psk83jxnlh5xa8vq36y9iihha0d6rz6x";}; +esint-type1-15878={run="0nfvka430084h72w0gdlvbxxlay9lp5z76bckmr5vd1vqi4jz8kn";doc="0lp2hc76adxdl44nn4g8hb19cflndzg9ir004di3wggh6s2yx40a";}; +esk-18115={run="007jcqvxp41h0ky25mgn2k3qdvyiyr3vj9mn6ml1zsvy1ymxq4dj";doc="075wb7q7z5idhqh39isvkacpgacfcv966af904yk9ralin5fwbr0";source="022n8rh8rwn9y4yx1rqpdynw2lpm8npwd45y88r2q29qcd9f62qb";}; +eskd-15878={run="0cpaix3x3qw5mgaim5574pc39hypi42kmk7yvnbvf3qj5bv7jkyz";doc="1zwpxmr721b3ij4b4zvkncddy85d9s9ma7llajp36qh4vl0bc0cf";source="1kfyrzs1swin4ph70ifm1mnsm77dprd96rsw228liq1cybn5bgii";}; +eskdx-29235={run="0h11378qh1y4c4ac3vd9pcl93a09kpsh0vyqcg7mfn01dgmqfam1";doc="19bcl4szagigbd2jrlz60vhhphm86667chciwlk05k6hkflg595w";}; +eso-pic-67001={run="1j340mj5ccfb5z28dcgs76jv05yv2vkfqxszzkd2xg4jkzpy0479";doc="11qlj80gnfqw496r5xa6fg34cmp6sf33k1drg4cpq23y9slrwd24";source="1gh64sql402fcg5k6w19pkx4n3g1aviw006yp1zdaa3wqnl1skly";}; +esrelation-37236={run="1gjwrnd63bb66vy7f74alxshcr5pqz8g8q178wkgyrm37xql6kni";doc="1nnwpgjy0mzc2h7sp2igqwain2nz6374qn4mjvj6g8x02lkc1hsa";source="0aqb63mzvx5hl178kmy6aawyv5ri8favficfjjmkpq3d4hgnrwl8";}; +esstix-22426={run="1qqs88wpabdx0y92md1w8klmk7ncbpm2jqmi0j5sj1c2cn82mp1a";doc="1zzbwvv8lbd27cxafj6qc5sml4r44ymrdvaqn2h966alzga9ify2";}; +estcpmm-17335={run="1v027r6j4vxxvdccq83irjdj1gf6kzy5i9jb1bhsv7c2gdf3ihyx";doc="03q3z9if5hswrr086zi907xmjaijh266l5g9a140q0fivjai4hcx";source="1qb1v30ijky1xhh5dahgprp3fhxfm6kvlxgb059429idvm5ap90g";}; +esvect-32098={run="0fgcy91ypllj3i706znwwzri36ja2ca2inx838q08zbs8gqq4zah";doc="00xpfzzhyrh5p563faa7ks0vrrc08ndcpn72a72jmlhk8y8bn7sb";source="1han75c642d3qmr47ppn11f7q1lnz8lcwj3q39nh1f81vi2w6li8";}; +etaremune-15878={run="1l3xz9zh5f3wj3v3mvq9xk4q6vc7k01pq3ivsvm0qlkni4bffyja";doc="16v4vsd7dzihnx72bdz99994kpw6r5im659hm51w5wyh8gf8mp29";source="18rcvjpyks01d6qkq61rmngmwwyxksh4i5dmnvq8ihx4vj3zlgqx";}; +etbb-69098={run="14rrzb8c1i58iypi7f1wsj9xp2x93s37s030zbl7xj8aw9j5w4mf";doc="0vqrl9i8mr02qb12czy09x9vrch6nbng04618h9ampxs1m40sha3";}; +etdipa-36354={doc="1jp35apalaa1lh44dbn1zayavv1n3wkm0v69hgy8vdz73yp5yvhz";}; +etex-70496={run="1zk4dp55r1yjwy1bpigyzbfm9nh3np544hfmzzfhdg4i4yps87k8";doc="1377j3czf6s21f7dr4qswzqvsh7xzzqcyjw771cswzgg7z8k66nn";}; +etex-pkg-41784={run="01aa6bn8d46ql8aw8kg9k2c3x611jpd5hx3h6g2fqb2lvjqnr1zp";doc="1hcir648vyypvqa8r710mj9qldir9yp2lq7biv3s9w1vl2ssw18d";}; +etexcmds-53171={run="0m0kf57wcmy50qcca2v5jb8z4h7z82pja82igmf6gsm7fksm3wrb";doc="0grl3svqzjh5bdg4jwzmqaxz7chkqka0vn0hnjwpyvm52ngmckyk";source="1s7avnnlr4g8xjdfmkm82aanz0k0cnhv2dyar30439x2indyw68c";}; +etextools-20694={run="04x0a0wy3avac8cgjgq7npiy06b0vrkxa0hizpn4vkzv7xbq79yd";doc="0z04a5f4c1xygqsgkss4bh0s41aqv0i61sh6x9h0isrqlhbvrzs5";source="1f0jr38lbsrdjxhihxks57y6xw37ghgmydcq48ll14nywx07qa2l";}; +ethiop-15878={run="0h1h286nq6f2bplxxkpdg8mr70ip92c7mkj9lakxzcwacsj849xy";doc="1aqgl8hvapg3p0f3knpirlgnifpkpw4jb22zncp1s26jqjc9wdcr";source="1cc66b7ad2kfs4whzbnqdzfswn32y8h19bj3ad20ia24dggir5mv";}; +ethiop-t1-15878={run="1xbkh7xx71d19ghwfq8bhjnf7jmapm13hp2gr6ggzavcmzf12ffz";doc="1lafizx606kv455bhf125hl2xqhndd5mblkd0zyvqgyir9bawcd9";}; +etl-60998={run="0cg7ppbc7nlgmcnri2iz2is8c5kj03jn0crw4m5wmxvqkkcg2217";doc="0jqpybirslqyk7g9g27qbbvz3k02m2k352fxl2w1p0h7hhgk12a2";source="1z244p46j7hkzry4n1xdbzcszjgwrlxd2jmjblbrldj2ba9sq9nd";}; +etoc-69343={run="1kvwyy0wxwwfkbmsh7v5kdvcb9sx7ywzcv5cx5nmv0sh92ah5dgh";doc="1lh8pfcj2iixm9r31cawfs7vpg8gd4kgjcj9yyqx0i2fksd1gs0g";source="0clv4cllb4nfchvc4zb8k25wzlhl4k5hnijl3071sq8aldiaqj7b";}; +etoolbox-56554={run="1g944zizyl05qz6lq1k13hv9952r97gc1i7is9s5fckz664075jl";doc="05c3kvfwvbg4bxf3wza5rdvh98mnxadf818rsklxa5g2lz44jm76";}; +etoolbox-de-21906={doc="1vchha7ymvj51jfnvl76rxv466lzfpxr6xcvwafxhi78w4bk9yry";}; +etoolbox-generic-68513={run="0w0mmw2f2lry84jfx617saj29nkc620vkrkg1kmnnxvvxqi7jd9a";doc="0l7kbicibm8c6p5yspyr1y8aqh5d3bswa9h58787r4hcj4pr2hc1";}; +etsvthor-48186={run="19iza3bimr7xxbajmq50iqd6cc1h82kz2lixwphn9568d5k5vjm1";doc="13cijd5cx7sks5jdy67hp1a08f4y223l0hxd3w7ljnvd5azzyc1f";}; +euclideangeometry-67608={run="1pa69p2p6a4v8wz3m32xd7vy1km9zksszj7zjyqw36gfcpk5sxlb";doc="1d6340xmamzrcsi31i0vifjxhy42ml7v3s6r1r9v6vzimh1iz5bi";source="1l8xc044kcac6344v21dfysc6la90vv822mvik984zcnkbhxy4jc";}; +euenc-19795={run="0lh0k5g6icbbzl1xzzcj4sw7vjhqpn59y9xbc6cn58klpww8ywdh";doc="0likhzn8afsq302aiyjk6adhjimz0naqffjrj2s06c6681z2inh1";source="0bwr4cabh3w4jbx476ygxv6afxj6sblszr47awr2nixx0m018ndj";}; +euflag-55265={run="168c6y6rivahj6cw377l54jsykpxaxvv3nbmr80w19d90h4sqa5l";doc="1a65rasxx88bkz3bg51bmzdbq67yphljaa8mgkp2b69fjsifm229";source="09g2gn9ci11dca9s8bgdrjaprzb66vb47ssfnj6n061glz9a244z";}; +eukdate-15878={run="17r61096angayvbdi9r3d7ljb1a5z9q9r093kpgdsi11ahcgsr26";doc="0071bi5m6v5ak6g5pxjxzq5y5353mpdjx4f2dbznkmfd23wp8j7d";source="1p6vg8nj8qipj59jwvp4izf2dv0l8490773h6j87wlclnnnlh2gq";}; +euler-42428={run="0f63sy9zs0myb76wqgzww48g7clq6ni9kwnrfjkyyc4lacvd36in";doc="1rl4bxzlmw95pgcf7va9gsrgz89602a9pqvhiym15b5hdwc5cb07";source="0fy3dx3bf8idddxsj29yqd7bsv7cyyg8q9njmb3p0mw7laqrkjxl";}; +euler-math-70335={run="0iyn5pmk031v5z21l2mmrl2c6fs4g2dcp5zrs5h3cv285jrpa1dn";doc="12w9inmaxw5skyw2jmhhxqfxvzsf6z7dfajifj5lj9388890pdgk";}; +eulerpx-63967={run="1ls9b076rc73cbc160ms7df3w5m0x840y7s2mg3wk22vgc461ail";doc="0qwhb6wxm8fviqi5kdy1lcplarijhca0ymrqnxfnrz38z3v4xycs";}; +eulervm-15878={run="1x0zgqw15r5z9mf4pcpnf1bdbwbpwbc49ij7gjrhf9jzzlkwraf8";doc="1bbd7f4dz3xp7ylgpi2wh9jf8nz4z6i2cvphfx53xvg555ln5v1m";source="1if22m5h8ma3bvrlp4jzzhjm410r5r7r2ij17prycj3cpj4r2nl7";}; +euro-22191={run="02kkwf4psrmp7n5mqyrc3745kj82p3nxswad9x8rw1hd7a278y3n";doc="1ajqx7axgqpmbq4kl2gmk97ibwbijqsq6z8ln71qla61j0mkgj32";source="1hkzjy4vmvh06pk8bhkpz09ln5jygvyhwzyznqkrzffay3i89cll";}; +euro-ce-25714={run="00ypq57ri9vkmc85c5l5qzq098has90qllm9lnv4jd73l1my7pmc";doc="03pcwrjrjp74s2xl7pahpr76dls17x76xvhck9izgsr29j6kny4d";}; +europasscv-56829={run="06vqrnfzcq04mjk38q75n1k1dw3ap7z5xnzpjmgss8rl6mjn4v3d";doc="032298ir415l36gakqalg5n1nk70c47xbm2svvg1ygb32sgn4afp";}; +europecv-69661={run="1d6p38swfpphw04zzf6a0rdr6xmz3rrc2gsy2gbd06hjmcymc7jb";doc="0s133vzwnp6jxbpmk0mdiaycr4q8x0xh6ismm38qhfb2zy62pp9a";}; +eurosym-17265={run="1bf4vwygyakr999k95ki53fykknizakz9npz2i1h3r5ci805l7z4";doc="0vmh23f3ksc3b3hym7iv7m8rsddk8vdbqr5ib49bjqylppvxrsnz";}; +euxm-54074={run="10dqknqlqrga9m2lgd74zx5hk4qcbkfvlzjgr304p94w3k7pclqc";}; +evangelion-jfm-69751={run="1gp0j3ysa05fhlfblaf1fznmirfvkbzdy9wc158vs1lsbs0dc1lc";doc="050bczdbp45i4qv0wp1qjvl53q10zwdz6av2v518mmg2qxrcvmwq";source="1fdq93a124am4l6bl35zb8804fhi7p263fwsd73lpyfvvh95rz7y";}; +everyhook-35675={run="11r4932kly5zmksmicapqxndqw4cdq1sg2x9hgffms6v8m5cwkfs";doc="1g9p36ki26vqdfiwnr77jxk1bna7733dml5k4s8nxq1drsklwqwn";source="0hv04cn2j7sf6032jxv18py368zbpp4ya15wv18qymbk6yv5najs";}; +everypage-56694={run="1i8fjcbk3flywzd55y0cbsdmzymvkynvgc5cvv6yh5y6nr514rjd";doc="13drphjv7gzgdzzwd6fxlngm2rprhls60gj4lz1v69sqifymnn4h";source="0vdi8yd0r33ajnym0f3j42ajkc2xs8b5yn3kmklmgx19kpc93ln5";}; +everysel-57489={run="090nizak865w2mgrflmz91kc0b2zmc6fq0xxrlpz68xwb214lzwx";doc="0bhqpzw5dpgq3842jbba9y21yj1808nxrg50339lx7b8vc5d2i8y";source="0aibvqmg2n26dici3adi849a5k20ck68v25vx1bz2f15q4gggd6g";}; +everyshi-57001={run="0y738zcqy85ww3mhwgrj1qh0vgpwfh2ib676wlr514xglvmp9l3n";doc="0ynjq4ibx6rr0qh5lajb5n9skqa3j4zyi533mxc10axp5zpxsjkx";source="0iqxf73n3l1jf32x571rw5wqwvz7nj3bvyqzgizvfpbnavqhrxfb";}; +exam-67600={run="027v4pscys8rmrrrz7m2plc9blf0bif3rjykfhw597rmnmgmhxcz";doc="1cwcz5c0lcil552ryqnwsm9p278nd172p7d8s4jwg3xdzbbgmni6";}; +exam-lite-65754={run="092wb5wjk452i252g4chnjzxysmbhy30q4cxir32mx54z41yf0dj";doc="197mlnayyzgr9v4yf3w6m72k8fqavdy4k2q1c0v7slsvqad320f6";}; +exam-n-64674={run="0j4bi7j167fkaz57wfav9ybv5b5f18ql0gscvdxyf9vh1czk83n9";doc="17jj5s75fs0sxpak8ywd6lmss3iq290316mr5gyxm3v7r26ji8ii";source="1lvcxbdwy7xxjwzbxzrykym96j1qa7caqkdqhhx4qxdry9czpl43";}; +exam-randomizechoices-61719={run="13dqgkh1isrg0z97z7bfd2b952sc2xr7w7ykllhvmzicr9gcml1y";doc="078cryxhlnwk0k01pwypmdkkjlna0fn70kj1xia17jq2xvc2fpcd";}; +exam-zh-69920={run="0a2w0swarm2lav45w9v72bv7gakqnz2h5fp8895sg7jmbm53bzvr";doc="1ia5nrldj26rcjhypvyqmqqz9fs9bni3birx24qdng652s11k48l";}; +examdesign-15878={run="0y9kqiihidv24553zlijr6fspbayvram1mqgy9kmd1wwskvbza3w";doc="0ddgn0f086qdsyssg4gm6ynlcnnsd16qpvn2g3wzija7ai5sqkig";source="0z5539hv1li9vw0d3jx7q9s844f29wi9xr5z30hvzl3721rnkvzg";}; +example-33398={run="06ld0b9gi8s7y6igijylfvj2qvj3d45z2ml9wd1zfzkpf32pghmy";}; +examplep-55265={run="1a3pdaqzc9jx2yf66vmjg9r4w07b8afyqijl21np6sf7rrsn7zg8";doc="06jqa848zzswd5pbfrvr9lh3i4l5h8wf3v9g179g3q2yb4dmvjwv";}; +examz-67303={run="1vhk3kvmlsj2kcz0ccf3g3a9z5h6ds41dpwhjd1k3iyy6mrb69r5";doc="0vqm75k7xqi40gy116h3rjhlyjybzsmrpnlgmsx8qykll04y4vql";source="0lnr2s33z95gzyw4vjz6jgyhqcgbwyq1lz8rz5wzafbf87mdkigx";}; +exceltex-26313={run="1075b0wm708wj537pgki1hvj58l0pfrdiglalbjnk3gmf18rk22d";doc="1s48mcj49j9jm8vs5nhvljb972vhfng09xvd6kiw01a7i4zpw3h1";}; +excludeonly-17262={run="0zfml40br991mijcmplxlff2lzkn8fdgwgxcam7vnr23kag7lzxm";doc="0argzz7nwadm11qp642r454w8p0swyhvscic71fhwi47n69cfbgz";}; +exercise-35417={run="18f7mgc2lmm1lg13dm858nqsqzga52sw0r6zlz7f0pv5hpc0mgak";doc="1y50izz1z2s52knqn9a1jianq36isyafviv0yxqqx6zdfckqca0p";source="0lpslsk9a7dx5xzr5iif1prvrn399j70wfcqhgbypz970zzpril7";}; +exercisebank-50448={run="1algypm3nhkbccd9k1w5qr6y75hqiinw5dj1h4fbmripmhdwircs";doc="0szpxkmx8qi3zpcrjzd1nzn7jcp30wf9nv8rp77x7rd2yd0sw0dy";}; +exercisepoints-49590={run="0vr2yxqx2ng1f9qybapz61146lvsniv6mjwl1yfxk10qyvdw3pnv";doc="17kz9fyd7cc4pa4j6dsm8h5zpwfr68wg3ndbswgh2pgwwvf63777";}; +exercises-55188={run="1yvdj03hr40732swfsg2br9f4wx9855n7a3whlqjdnczp6545lvi";doc="137g1gvwfxm3gid5xvikrqk0iw75csrkqgrwmh0hda28dd4zbdwg";source="1lryxm36phhp7p269zzf9a200k9k0v8zw8qyqvyk784vmvyilv7z";}; +exesheet-69885={run="1fsavlg9j9xi2j81djhg77k10a1ag7aq8k3ykv53v8yn4s8n2gym";doc="0awa3sb3wxspvd3mvyvva92iwgrsb1qydh3sdafmnd5b4m0nncys";source="09zhns0ndza7jgmjgzmr4a3h3rrh5wshi2ssb8sfkr10bf1xl2v1";}; +exframe-53911={run="0sc11jk94l0nmjjd69k6nl7j68szdkihim194pdxlyiybwqf9bbh";doc="02s61k5lpjw121cyxkkhlbm5d6wv0gl009abkjbidpgxbnd5yl4z";source="19y20l5g814cvn9z0axpkynxp0vwkay782dmn05g6a6qzjb49i0j";}; +exp-testopt-15878={run="0g7q4ccfamsd7sr7wb0qsw74dnwiyz0rjrniaxm5jvgaadiinc7q";doc="18i2ym0da8vp3xxy5q2gaykvja3dga4l64q9zjxknkm50vj6dj23";source="1xfp15q94icdq773ivdvk4n47i2k3g3y9smdvmxw5m9f35nayypl";}; +expdlist-15878={run="09yhcdbx3n7gj3g2v2yh4navgdf5ik4x281h51kd1lzdzbbnf3aa";doc="1qgwn2ignri6wh67wwjsqpbk28jch01m8fn0nw6lpc6kfa4a9g6v";source="1m8dww4i5w0hivs904v8ls1dhs35vp3qpbb44ihwha0zsbvghabk";}; +expex-44499={run="1vdbsxn85gkg24rx3qhkwcc658zjyhkymfspysxkxmmb8rn42y8n";doc="1mgq1knfx1lf0vr32wa2r6v0sr49m0xjnsdy0y42zngfi1mizp20";}; +expex-acro-68046={run="0hdbjdkqsi6nw99g3rqvpd242mag8k7ggl6bb0wj99nzfq9f43sl";doc="0ilsi8ddsn7crc19qf22vwff2xc4lhpqhxpk6mb7id5fd7xpp0pm";source="03addcn3axfzl3i502clngi1bc5b4l5ndq335xh6x5h2566kjclc";}; +expex-glossonly-69923={run="1505m6spzvhxmyg5hv7wncd1izl1qzkn5sysfjpdykwwg2prjp4s";doc="138yihm7vp0m25l00i9q9gn85cpssnfn2n53v876bvlkss7kz765";}; +expkv-bundle-65623={run="1mw1cdl4phkm29yxb747whkkd81g9a3sbbnkhzgskbna2zcjj0l4";doc="0cwydrq8k5z6j62wizgg6n1n8r0h0vi4ijky59vvz8f7b95j2xz0";source="0cv1r3daz5lscdqyjgmy6xj00b4i280bg1c93b2kd9x3svv179mg";}; +export-27206={run="0la9v2m3n15hgds8mmp1c56dz0a7iqygjk2qnd99n5924n187wyd";doc="0ipbs7rdwjp6jrr4drgcs73mc8fy6bav24qfda1an7byglgcf2nm";source="1q3xbj3zicbizadihwb6b75c4d95b6wq0adi45wbqf6hzj05bd5x";}; +expose-expl3-dunkerque-2019-54451={doc="0xij1ycxnc3hfzkl0bfs03s0zzzv6xsj3myvykb6n836j1g66g2y";}; +expressg-29349={run="1hcrzh5xhvzhf7d9gfqfxj7bi89ds5rxa8m6al12mdr5qpffzzkb";doc="0kla1swvhd43xcvns17wlcvq33wvjidhkqnd4i587x9mdn69s8bv";source="07w45g2nbldwnbrbrmdq9pwi3xbi6cl2mqxaiyk78jfgr033rmqf";}; +exsheets-67300={run="1ymcfy9i2ll048sc0gyljcbwa06m9q0g6nxp3csvk4a367wv9cxa";doc="1l3ln3xkniyfgmhrs37rixszacsvalwq78fyh72v8ca61krxd35q";}; +exsol-69343={run="0w51rxp4lw5v1xmhp26bqalarp05x1ynpskbgb2ci7b3g1xcnm0g";doc="1hjvmd9rjd5vb4d7794iii26yl394plf3ajihp7mpmwbzjz14w6b";source="1837xcdlwxnw8944c787b4yqlb2bi2sijx0nnr3vfvidpwsa7ys4";}; +extarrows-54400={run="151qmfsqqj516ky9j4wbzh1618r769b1bqn4rc5fh51p1s28k8f7";doc="1iw3750iikf6dc6kyid86r7kdzkpi1z4la4zlj63z26fczivif91";}; +exteps-19859={run="1pmipr1444l1yai8d9hhrncvimzb5scn80pqij2g90lz160962r0";doc="0ymkwhbl6r64pxhr95wdw10dvn6q95mkz1pwa1nb42sdcljizrsg";}; +extpfeil-16243={run="0n2j976a2607zsgf2cda5vljl497c1562rn7cih11h6vpx76jx9k";doc="0irjpxz1zk30myk0h1wjhzcxdpyqjfzxj0lx1nz56v4f157myn50";source="1yf2kcx73zp24wrjb59zd1f35809k52cdwym9xlf5fy32rh69y08";}; +extract-52117={run="0yfxyzmicqczvn6pc7ykakpm2hjsrsb243n1bs0crjsvacw29hb2";doc="0lkljkwf22vq88nj21ca023ysa0hmgcsh7a0xhk210ba01a9433f";source="1h06ji378l32a18nbf2plhk4q3vzihc541d0wkw80ik53m0frn0k";}; +extsizes-17263={run="1249x8lklry9ibil9crfvy2x3hk5afnc3g3khixqf54jcb29zpg8";doc="06a01bmilk7hqr2k9237i6x53f6wz4z4vhr8n0qc0i3j09n5i0ps";}; +facsimile-21328={run="0mfzqrn76b2nhz60rqjdr55s6i9fzw96ya74nncvdjjcvaqpjrjk";doc="1i3vv6a8r1mmkmpjwr66r0isha7s5ksp5cwgx3rj9sl3wfnywsfz";source="0icxnmiwmrjsp1lhhdkcgsjif1s396lkdxp73vz59afzhwdm6l0b";}; +factura-61697={run="18p09q5r4n04r3pr636zxbq2jp027knlzphd4zpns3d2szgw2j05";doc="19d5nsjxzghmk56l1v9ppr237ykdrgk7bql4cdr4d2rdvqbk4r19";source="0l77127yc8r4n0iyv4q3ilcs9hrfjn0y56rc805av4gdrgil9xgq";}; +facture-67538={run="1vfaj6hsjnd1cmgwrlj08bn9zr52zc1z9h1dpjq742gf8n2f9qfb";doc="1my5nlwdik253073yhcjbvqkgwcw5kvmg2fm2wladlgcq8qav96d";source="11nr4df4dywqaq1bk3vzjc6s9gd5kxdksicij2fmiqx4a5309ijc";}; +facture-belge-simple-sans-tva-67573={run="0n8wwl82w7hn11l3c3fg7nr088v2mv4s2d3ynwahgy18k6953pxm";doc="10yh7528nms60ypc2zh9viamk9cihi0a67jcvwzb2i8f88sx4cfq";}; +fadingimage-70610={run="0hyprvgg3f1bdm747v2c9aa7j1vcaxvawazs4srvmxqabyi05jbs";doc="1x8bgam221vspx8ikdmnx5qvfwv0jgfda05b5r16jajxirhbnvxq";}; +fail-fast-67543={run="069rv6yv525b9f0igkaax17kr3qyy1n82v018yidc57ig75h4vlh";doc="15qydfbhbdvkzrys4x3g3k2zpzjzah8yx7q1xxnc9p90rmlj6ch8";source="0ybn1365n7mkaf73sc667pw826n1pndrizn5svnx89ckzhni6s3h";}; +faktor-15878={run="078fxihxiy9bnszy2nj5ca8ys9hhhazkawwi7x2hzwfh3n4dyqz0";doc="1hj13l2g7za8n3bkxmg04npi5fnp4jv8viyym1076wify7hrwc73";source="1r8wksjr0q1nm118fzkn527lak31j3sjrbsahpdmvxfir7936njx";}; +familytree-63739={run="1a6hvncnjzrjb3bpikkjlmamnrsas5221hhxmlvfb8x05qxjxx7x";doc="05m6n4lzz0fc2hm011kyvnxnv93gl39jd1lx404xz0kjs0l94cp8";source="0g6i47agywjpqi2if893jpm045kwda3bhlm2afd6gpjynybpmhmp";}; +fancybox-18304={run="077xd75n1lpy5a4gdgk88p0ai2is5aj4lf2cfxn7nsyhdvc1y6gv";doc="1giimlw8zfksar2hwarpnhy2sd0jsdlxzfw6gz1lmdb8xmwkx2nz";}; +fancyhandout-46411={run="0fgyvrww1h79bvwf77h83p2lwff5b564gk8cjjnkp26zjpphah22";doc="0r5wzyw7z8gsm2k1y06h9gj5cfxnclawicxdjpq50dnb6233ac08";}; +fancyhdr-64977={run="0sh8j11p8za9rsskamad5av81827n8x1bdknfq2xzza5k15x8r1d";doc="034gij44l188s6cvmjn3gl6y7bz83ifqyz6cwyhd7pms6pajr41h";source="0mwa9c6a1rq84j522q18c1hg7j8x1h14aaqrjx7c92aw8r15c5r8";}; +fancyhdr-it-21912={doc="117826hd9zl15i8qf6d1pz2qz57l68a9nxqldxyk21acc29ifalr";}; +fancylabel-46736={run="0fyrhiknwb658rg4lkdkfb221yrvzfs5g2rmxfas69p6aambyv36";doc="0fpxag39xa2piybkb19fldg3ykwb26sg700jp8hy6kgb8afp4hrw";source="13hx2k4i8ji3a9kxd8j2j177l4d5asz79r9v707d8i8vkxcm1ild";}; +fancynum-15878={run="0vfis38yawys70hv4vrrnyy820dj89dqp38jbg199pbb8y0qf1kc";doc="01f7d3him9gcm7p8567ljamwrg2jl25xs7w6jm05l89dkcb34fdh";source="0cfm5da0gk4y8plad5khzhf9gjyayxmca67qpvdj296p86xxdi32";}; +fancypar-58895={run="1znfj0zw15g4n7rf3za61ixfy7k8vyv9nikkran9bvd0jmx6v4js";doc="1qdqw4283qv1i8njlvnds87pd1ssx239ycd985rbkkxyd0brrqa8";source="1y35cm7q0qa2szmkldv46203gagzxwz4cam7yzm13s78wyig6mcd";}; +fancyqr-64182={run="0r5f2cq5p2x2nrhgamcl4h7jc01z8lr0kpbvkalgnp4bkr2js42a";doc="0gl8kkf5bvls46hmcwpm3klnzc0rp7mp6cgn4fv33l60yi4vpwxk";}; +fancyref-15878={run="1ns9b3viqg45w3pmnh69fdrjc9p39pfnqwwsfl9nnx04pf8b0p8i";doc="07g7ynr4qjv5l8v71ymbhx3vf000g5qq63c4i8q0iq35gird9yac";source="1p5xd5a6lwv71hp1sx490qwqbjn720gc1fpkk2inmmq6h6vwgpdy";}; +fancyslides-36263={run="0hfa5jklvybgx9rji032rdmyh2qr63fkyanvvs0jmg1bkpqw7s03";doc="0nqqvkv9gsl3jp22rjkxrzklpz6dfmm3wy3mc9f15jv9iy2zlrr9";}; +fancytabs-41549={run="0yxr24fnjabfzhyvfj7nhn26cc7hi08byw7zzmky3nnynxnxc2p6";doc="0f9b7rvnz5syq5dghj426k9ypppjg4q9wzs8v3jl8af94xy7zrig";source="10p8hb18qrwp2dxsjybrawnlryl97k854l11c0327r39qiya61ns";}; +fancytooltips-68931={run="03b31bifjnl75hscp908x58r90zrp9hy8r4kf3lkygqvikh8f5bm";doc="1l6mp725xjmy6azgx2zwcqlp3vfvk7gvyhr0wwrnnklfcscyr1rz";source="0nhmjrivw8a2xhblhxnjbyvmz4hp68sjxnnfzmqyrf1agjgwz8m0";}; +fancyvrb-69536={run="1xsazrr8rw8rwxq2bra6ypsv217r5rrzxhqrblncm5g2blp8x815";doc="025sy2x32w7h2dih36iza9v0lrbwpr9q2idiifdxjhs1clwx01rm";}; +fandol-37889={run="1l6h2brl2d6bnam6p6j0p1d2s13jnva5zkr1xr4sarzzxj6zlz2r";doc="01ax7za7wcr644ncpv3rpfvl2ndqlppqnjzbjp8y2d0hawc3k5m0";}; +fascicules-54080={run="0zlkjn8kg6vb58xp2xh7jwjk6dmk6knzqh8v7lrdbmzhw9j28vwb";doc="1jkhj04gpwcckp9zqanaa9zhplgs2a5xqnn2xf6ir6qifiv3403y";source="0d7crimrdcxlh8hd24qfwqnadxfjsfrfnjr4hx5rrj75mm946zmj";}; +fast-diagram-29264={run="13c2r5prb7dg05j0r4lkdz36v51zj6v5p2c7q22gfkbz1lj1s6s2";doc="1f3ghs0l6mj2q3iw74rjjb12y8151cccvhww13h4kzc30vacr3r2";}; +fbb-55728={run="101yfs3np0mlwgfhiz74jh2jngxnb395wkcm9fvpmrs4rp7wxx4l";doc="0b48vqwyhmygv70gsbiknmmysd8pz8m27pfj52zqzzb0kphibynl";}; +fbithesis-21340={run="0qzf6ch5b25qrhzflh8rwrljhlj87i6xaldnpj8j9iq83y1xh4jr";doc="0wvnm716qi0y54h95zlqr7m1q9dgmjnl9f0ghvjgm886hljq752z";source="02zmk6yx4v47ngd6ba6mjn1rnhm2w6p330rfz6nkq8shcky7sy72";}; +fbox-69041={run="1v7ycqbqlk80lbf5wag8vmyhwr1v4jjs8j7bzni4pm8yp4m0yjis";doc="075mws8pivd2nc045przgf5lmf5mpaw8gdyjlj3haqvpq0rf5mk9";}; +fbs-15878={run="18h6n8azrnk2qabv30kpa8gmj2ljkvx0nqs8qb9r8dxxnhng78ch";}; +fc-32796={run="0bw8ifh6sxgii5s3vx9d87m4rdfmifdvw70wmj2kwqzrij1ri568";doc="19p5r28fzw0i7kmvvv93hiw7cm3lkcsn2hdn90k8m7jwy758qrdd";}; +fcavtex-38074={run="1rnfrvbm4baslmmakf3s1n37razfzbc6d11b5yfhhdhskq2aci5c";doc="05ixrg17jwd315q5c52c4b8smcihj4rzrxjparrgfimivd85i3h6";}; +fcltxdoc-24500={run="0bnz5b9ibr3lh5qazdanlvvpp8d1h2apzkw61qxr6kg9ymmk2w68";doc="0dvr57jz38v5wflcjjp19rwjbisbzkdc91fji9s1yrv27drawijp";source="0k54q30f7qp40fh3clxyaa40xhsa28qyavn13km65s1hwvg4hg9g";}; +fcolumn-67729={run="11bqaca189j79cszypwmijw166v3j9pkm60y2c2wyraj4ss4d1k0";doc="034crw2fxf9m7a7zvsi2c7fafkqkhn8vfxc97dc7k74wrd5g3kwl";source="0dqcm83g989lkgjkb5q9s4d4284g5c2y36y75iyq4jhdh2ca972z";}; +fdsymbol-61719={run="19kqkmjsi5kw5s6kkgf4y7nrwjhyd9pgq02y3f43wfdml9jwlvx1";doc="0ddy5d074fjmkvl3pm4akqfq7d3f57y09cfmrs5wfgvvb51gfcvp";source="18hiwralhdsp8sj8yr0c5pj4xmjaiyyha1y36sgca2xlacpw8ah3";}; +fduthesis-67231={run="1cysdwj1gl9zpxqqcb563x7ssvc4y6g96cn3afbjk5hhw8381h1x";doc="0w1dyxcyxjpdbmxrv23xlrhg21kq2wf1r85dkdaw3hs76800baqb";source="0spm9cz58xa2fi86zcbs4qp4zxcdvaq1ll41bmp7mkykr369j2k7";}; +featpost-35346={run="1p8xb6kmfhhqvxcmgf4bkw60p1py2s1pyn54700zs8vlkbxlqy6f";doc="1hy7n0jfdidj3an25j0m5bbv2ks40iviwzwijlk6qqdll0k26z33";}; +fei-65352={run="02zypphy3s8z531zmvrdz2df0c6viyfnzfmn5hgc8js557z8iw3f";doc="1nimda4g0gsf7521ibmqmh5a9hfyyhdp28dpiqs0wq50ysl8phc8";source="0k5y72pwziakribc9m9yzm860pg1q222qarvrqxyjqchhlikcrhd";}; +fenetrecas-68779={run="1fx9kfgiiqkkfgj12x3yph2218az86h99r9idg7q5rkx9h04lzg0";doc="1qcg04kcvfmrgsza06fd2aam27ixwydis86f430cfli4x3c4c7ap";}; +fenixpar-24730={run="1l79py58dih05c4kjb8cngzs3bzpbhc72f4hnz2r7nfwmjp86c56";doc="0fbx9wms2n0ff1cdpfavqhjg56przd7hr515vh81g8jgnz68s24l";}; +fetamont-43812={run="08c8xjgam1fx3aa4ikx62jfh3f4bws0ngk428bqzbrd8q445c3jz";doc="1zlhg0wgchgkk6j8v23wd29hklpzb8q4p690pfswg3zakc0dcbgp";source="024bwgb36iz2ylwsfzz4wfgsyr9djdd0p23phadzmc8qzxqsslph";}; +fetchcls-45245={run="1pccfz68chmnbfi9qnrmdnyq5kvkq6ir5dl09jqbjlcw7hw82ka0";doc="0if19dgb2k75qhyka4jiijnl3msk8y8kj0fzhriarsicivwd47ds";source="1qb9ymkvbxmxlpcs3drcyk02bc372s0vhw6wwpig2bchb1hwdl44";}; +feupphdteses-30962={run="0sgg5wi5iylsz0y2495cajqdp8nzlsps3x7lzalx0qpjid91lij3";doc="0ish03jv00i0crfzhjh2l32cspk2r5ifysz5prd6fwhdrmwmvm93";}; +fewerfloatpages-58058={run="04903zr0lk50i88vywpbzpg908zkmy0w8vcfks55cmbfb2ja37qd";doc="16hb3xm2aszwlagzq9w3bi2hyanbss3s4f09sypg07dkilifdnv8";source="17rcaydy16vqnlgn76ijhjlv2jcnw962wrsssca8z8y6dfvy0aqs";}; +feyn-63945={run="1pd608v8wl7007rjmsykwabr1h8jjk1s78nbmq4a0541rj06yd0p";doc="1dkfi17i6lz464bwmr5r5295y1avvsn5rpdw4cv80rd20lvhnyyp";source="1vh6kz22gpmch2rdlvhplvqqd03vd0mn5m0a123i3xfbka1myza7";}; +feynmf-17259={run="14bl9c8yz1z596281kysyyjbf727pi6mdnwag6gfqs1nsinq0a2i";doc="1ql099wrlddb4fyfrsirx0vnhcbh0wgwp9yixhvgxfk5pbah8v8n";source="0f9ghmp0hcmzadsfljfq7pinn69251dwhcdk4n62jrd07qdgqsyl";}; +feynmp-auto-30223={run="1yhvcxiq6ajjmlsvnznzvp35sap1qsnj54zv70dwpl29rkrgrmsp";doc="1y1pwlplkz2z7lqz84ay7ch1lw4plh4n69isqzsvhilnr31fkf0a";source="0ja5yqs9szyk4s2mk9cbjf6p98dagwk7pycma84y48kinkl96s0s";}; +ffcode-69706={run="1i06si85nn49yj64nkcja4r2zfnli29wi3z6rm4cd2j6zaljj41m";doc="1rcjnxrzmg3vpdwg3fxf7r6w8cagh2v7ll49r0y3i0jxaiyyv10r";source="1cxg43iaaz6czqf4wmfxh3hdbpl8v2v94c2wggbfx993v6awil7r";}; +ffslides-38895={run="1mpfpawdhh16rl6pnvxnkj95gf9hjs49gj7cwfyngmqkjc2idi8j";doc="0z5kpim798zxj20p70dpcgmwg4vx9mb0zrmq620sprxxdr2gd059";}; +fge-68353={run="1f6ibw87kbhpf3qxjh17jr1lsh9kk9ynf1rngzyjwbq2rk2id94f";doc="1c8nnpdvkxcm6218mrs18ipjf9mrl1cqyvv3p31x41ii8wxkvjm3";source="119d70668gw3za0mksr93wcq9gpzjn4gyv8vmizlabi0ip1ycgy8";}; +fgruler-63721={run="1x0pqrwwbwf7qi64wlcg8d73sf5r59jcqhhm3l30qk1ymfwirzvm";doc="0mva3jv63prks2la2g9sqza2ng59bg9g5xkgg4flamk0409bmd4p";source="1if9sbrln3jsc965xn9njllnn56dl5y4v2krn76hyxsk1vyza45k";}; +fifinddo-info-29349={doc="15zp4xvszy07cy1b5r3k5x256lbalr5acrrdj1gx33llfmvm469a";source="02pmj7a9hx4xnfjbhwg273a3wx4449542rs7rxkii4hk78xs5lwr";}; +fifo-stack-33288={run="14d714q6mzpag5rcn2b2454pad3mpvdz6ii8k7jdvx74ay24zphv";doc="0pgvcyss7h1mynawdhpm8xid0albf5cajhz423ygz3ifi2dfrasx";source="03hkqd4s9dm2h10i8pw3a6qgrjskiyhnkp4wh9r55l60wnqm80bc";}; +fig4latex-26313={run="1bq3hj1gnc1g70jvrrvxsg1lkxrdnj81h08qr7hqwlwll37qlha6";doc="0ddaikx7qphb98xc3nswyv01d0xh5g4vf95fqsnbhg811c83jpk4";}; +figbas-28943={run="1bgpchwgj10609ld6i4my2b6ynzlhqrfqi10g7pbqjaypyzbjs6h";doc="0ncmqsdvhssd1v77m0jhx48fk6ssxq5yggd29dd7k3jrypaf3bck";}; +figbib-19388={run="1lxg05j9c56rrinl5gc4y7sc4r9gc5gyq59d3yxq4ggmq9q9l3dw";doc="16qbipciqc6vv5hg1fm9rda4kk7x827nlmzha8c9i3dz7gy0cnan";}; +figchild-62945={run="0k72116mhd9z9psbnrncmn8x4svhyaf8b4738qxb808i81ba97kv";doc="02xr6kq4mrs9cacn2sczf6ys2mhwy5lpzz3lbklx1na3fbkm6aaz";}; +figflow-21462={run="1w2wccxfjbas2yyp8sscxfb875kz3mwqjlma46v4328sd9vw4pwc";doc="0nkdz047vypv0b47wbin7nz3cbcriv89w05d6yn26wvq5svlxgw9";}; +figput-63957={run="1hvxp65c2y7852fj2v5b4m3bq4197m564y6gzin2hddbd1w003vf";doc="129jyybg92ddy5i6gg0f28ij0qxx59p8h2l4y9gb154rdmqa2bld";}; +figsize-18784={run="1hb2fck0pz1gz6vm0ffpzn3vcm7lclagsi599bi2f2bc9ly2372p";doc="1zdncnl8nmkazvqjyamzgj1x1f5fm3kyw5m5fi669rk9dqhsiq69";}; +filecontents-66740={run="051s23ymbjkv8z2d7sv8jsjljy5w2sh1mgvynlbkib390gpgybh3";doc="13fwkv2fvdfl1jgyfg4pn9il6w6pn3islc9zsaqs3bwzj25y16rs";source="1x5ahz0fsmnjx7bvbr83316r6w80gnp83yznnhxnj0zg42s2gfxa";}; +filecontentsdef-52208={run="0lrdmz5fnmrlzga1w2hr3ksydnz52lmqlnnmix7xrcp81qv9xmx0";doc="1nxb4wm4wd223f9wn7x8j805ybximrk0v6n1l56xysz4k30jxcba";source="0n7zq8plqn1yki6azmncgdlg2lxcprfpdq5dv0qnxvpvw5dawdvp";}; +filedate-29529={run="03fwpi529pp6bqwr37ns8nas236nhh7nm592rpjyrvlyv1w30ifp";doc="1dywknjhl2p9590nvcpg1vi8r0iaj52dv7sn8c2y8337w37c6ny9";source="0fwqs6wqw93ih2icg9b5zxgya1zbaj2sn0jd3dc8b8dm59cwggk1";}; +filehook-64822={run="0h0k0fgdwzm50jz0ibj7zsv1sk355q13x1djc3pk4fg1f3czhfh2";doc="00l8hx1sn4sn1mqpyiz9isl5a25a4a64nifq6q2jlw09df9gmf9m";source="0bd6fhrzy6bh42yb44y4bh01zpx92crca8zia4lyjmc95rlv6gfa";}; +fileinfo-28421={run="0x922migfx9y1nqqs9lv4ygk3cvqj88a92cj1kb9xkgykp8c6cqx";doc="0rw1pdrqghgdwzyfrc0y44cj1989lrvpab4n42qxbbb9srhmary4";source="0kssla41sryd278w12syrhsi5aalld94vjcmddldcc0l8l71sz5f";}; +filemod-64967={run="05lipahmxgd7cy76rz1j3p2z4k31gj4q7ihvb0zbi44g4n26hz6v";doc="138481q84a436a9ns587qcmmsv7p9fb5wzz1gwla25jigx8fb4fr";}; +finbib-15878={run="1dr1ivhfb83ky3q82dzzv5vvc8bl84iq7am0p1rc8fjlbj95i4wm";}; +findhyph-47444={run="0b7qqz0p0l70r6dl4jhx086dxywb0vlln3r166pj0yl5jfjzhpna";doc="0n7cpjxz3adj4bcmc1vd548lggcchhqfahdcvn4w9invw296hhlc";}; +fink-24329={run="1pk9qp2cbc1yagrgnjz6rnldn6zgcb6bw3vi452ks4fwic4pgwz8";doc="19fnaw32vgjpj991n5nlb0hwac92kmny3zc483wffbhbca1nkdck";source="1dm06hhp311xjfjjjpw66hmm52yivjhgkpwpif25cvq1z8dfgw2h";}; +finstrut-21719={run="148pca47nggxv9dyg5n0p40ri1mqz5chj4ir49472w62c8zh83fk";doc="1jrxyksw0bldvf5faykbpcngjfx06y83q81rs3k3m6vldm3rw23d";source="179640qn5swml0wrc1glvbf94ia5y6s1qlyf3hf2vmr3vih7k2mh";}; +fira-64422={run="182wpm6dkhs41y6kr4bjc4rpy0b62d17r0j60a23znfgglpriy3f";doc="07wm5kca97r39shhymnwiarsxn0i5ykycyd28shqyqmmmk6f2j33";}; +firamath-56672={run="1d9l5nsx0qswn1hcalzsrxkvc7mvpdqk3h72bfk50h91lfm2i567";doc="1w6zlskvs54x192nyxa83qnlqhvq98g64k5fv6ch406nkivifmgz";}; +firamath-otf-68233={run="0680qh4drixmrvhv3klkflz0jml06x8k9inl2c8ym6a8adqx43nj";doc="10ynw2ckqc7vsv5hq9kv78cvn6yd23qfbyv5060sjxl91w6qxs63";}; +first-latex-doc-15878={doc="13ngk5pia5vbrbb4jrrlq1lmyja08m7cy4ydcjasxha8kns001ss";}; +firstaid-70324={run="0sfar5v1pflaazw7yl9i43f6cd9bz8manmgynlww5wnw2chh2yxj";doc="0fmigcz19xazkxkqii0lghfy8clp8m880gg7lgm6bv6kfn5hsz4q";source="0kaf6555c3f9cy1fb5clm1ziw0kwgjqcysxnbmbzfhq23j41c370";}; +fistrum-66461={run="1ypzwh9a7lkb5b6d9796hwzarlsm06nyndl4clk5ss7nh9jdia3f";doc="1zyyrvm4vmd1fy35clf4aizb810mhr2xzsyzwmpcgsbm3nf7i2ng";source="048g8x5q882668lbzz0ji1hndfkd2bd777s2zyyq59bcw0gmavbl";}; +fitbox-50088={run="0jk46rrq01bbqkwfqf1rdrzwv475mdmz4hqvbffkivnbwj1vz18g";doc="0gb5gpdrdagilxsklq1aijr5zfl5n82nwal1h9qls0iqzjvgizka";source="039q5as7939zc5nby6m6piz5h0zphm19hqjkdyrgzw1q4r9ypzc6";}; +fitch-69160={run="1c6myhpv9ix6cr6snn5f9ky2z5caam1sqjgg0bq1bj8df3acdv80";doc="1gdgmviy8pqqwwsvinrb8qsgsd4gw6bx6xci56w4nmfal729r6g4";}; +fithesis-70536={run="0giyqhz2r2dnxxnvliwcj2mlm53ll452zqg18hisyq8z9yv7v0as";doc="10i2mp1ijf8q3dzgpva0b6b3h8025i2h5hl0vv6rmvv4yn7hnpay";source="1bazgc6p24ahsiv68g104qglahivx5s42gva0xhqnzcmimnazk7b";}; +fix2col-38770={run="14n020dmfn2s54h5xvc9lrynijcwnj3d2w4kg2w52v0kf037hmln";doc="089pdfpk0bi23yb7grjv4w1agkssfczwvv2vhk3piy43qpk9h09v";source="0wi711gb3bc5pc2kb7q2hz8y09g4phjxggrqjbl6i432z42fc061";}; +fixcmex-51825={run="063a2mwh75mdbh8syvrdldb7cj4iyvqkbkda4jm6cq3nwbq9kly0";doc="1c9q5srhfil0wnk84k072ridssgwbmzpskk6pwpaq8id36dydvlm";source="1h3xrdz9anb2cxr8p175rrcjvaawv80cj3bp9l6bcpli6yb6fdfr";}; +fixdif-66606={run="1gxz7bv0h2485pwrs7b0zhjcafkgzd1r0ikpjjw0gh4iqc3bcqd0";doc="06f5mkpp6aar6c569pwd9952xgzjdy3zx8n8y6y9a6wfflyh3cis";source="166zj8nmapwqkd06ksvjbjajq649amjrfji9z9j9mbcg865pgwa2";}; +fixfoot-17131={run="1zszczpwcggczq428ha84g71rvgml2zrx2v74nmk1damcp35pzlv";doc="07zdbq43l9yddc9gi4i2qqpvz0xxmkhxgg3wl329j25p4h58amra";}; +fixjfm-63967={run="1v4gn6bwlb294sxrqgy6j9vx2dp7plbagkvmw7vbvp6wk8dkza72";doc="0wiihlpjzvmh8dynf0nbhmn8raxflqxmzpk97s1qv7kkvpc79sy9";}; +fixlatvian-21631={run="1qm1jj803a7zgqbjn4q4sg4mn3pvd600pfkqabjvp0ck24r1pw1p";doc="160bb2khxfhl4g48a5cbj8xdxslgxvav1c0wiq3w1ajla278qj28";source="1zfdr8kahxgkhxzg925lgls50prcgyp6hz1vhis1241f9rd6r3qs";}; +fixltxhyph-25832={run="1lvr7r5adw566q0hbvmmvmh7igcm8asl0ispd3lflik886ycmmlr";doc="0yfa6a6dvzx2jjy1jcw7phps4wxz3ysfhk5mxc65qss9kmc94mwq";source="0ksb42pc0bm64pgszgph6g0rnksd9fhb48z97bnd9jcsg5rhzi12";}; +fixmath-64648={run="1513gzvwpddwhbaiaw2jw4qs0c4bbiym0dmcc88vzypqsbnjs13l";doc="17y6wwiq3b8l2p3nsfwm50g7lzip8aqls5ysgr4gvz1l8aydl26z";source="0pzyg8k41rlj5gvqq86i9jnys9plqbxb3qvas8fv7k5kvqc43riq";}; +fixme-63708={run="167003w7a4xhy35fj6xm7mx1hvqn1bh1b563sih3adrwyrdnqjbd";doc="03qddrr56q77h8qhrx9kryx1d0cab6lzcngsbmyzaj1g81hvwsxl";source="01rpq9xd8rhy4fz8g1l6354pyibjsl90h591w7l7cz7v0yxldy17";}; +fixmetodonotes-30168={run="1pca7qpkqfd8506jcjgr1kwcymbcljzvsq47xlvvly3qzac374vv";doc="0icin53y7xj0dddsi90n3hkd2wrcpymlyhfllyqfz7ac8y4xn8r2";source="0aphhsamc6x1k891ybxhnqmhiwh0my9sj90x3w22gp7zhavgrww1";}; +fixpdfmag-15878={run="0s5ilsmnhvi57x9cqwp7nwpagfribmgkbl0z1ci55aw2a6bff9hn";}; +fiziko-61944={run="16r25wagw155fnz5lngc3jqxaf5sy1f2mbyzdklnizaazh2vbfdf";doc="0pdnd0h3hkdw32m4yjmqj14ijg3qix8ajjxkhvi88h3pbwd0wjiy";}; +fjodor-53207={run="0gnmdc2i49529hniklcyqrfyrkfh83wbv9zmiqngw8hqmdw3zv68";doc="0dag2ial9cx9hnrhxc40nb31jvkv618jklwahgj6ckqfl89410i8";}; +flabels-17272={run="1aawdjmk8rinhjwnkjz67bq7rcp15i15dsbb9xll59nij849ppjg";doc="1yzlhd6c5b9y1r1gy7kvbrxygrkia0cz98p496nj1kdg1wr1xzbl";source="1vyjgbn2kihvzf85fg4fdg0v46nh0flic1amk7k3sdcxirn0fzvb";}; +flacards-19440={run="1k1h06a22jc8wdcxf1066rn4sfgy4m3wh479f4by1zrp773gykzl";doc="11hadqdf0s7zaidaxfhd6lqhl3qf7zkalf9wimi3j3plp8ln5499";}; +flagderiv-15878={run="1rnnj84vl29061hnbayz5sxp6h1civl9c9w2n3b0s56i9kxv3dd6";doc="0djwrp2rjyyd0wk0sg55w2l75fwj3gabd6bim1smpvjwsps0fcd0";source="1q0g5127vyhkjb1g0v20kd0x3p0b67a9haich1a6yp71iikl1s8p";}; +flashcards-62104={run="1xih8g4znfwgd5cim1z63q4syg9jk8nz99q7fgc9mahzq7xym2mf";doc="17as1mkgllva5q92qddwzffl7dsirx22wlnxn12yvv6a0h8hx57l";source="162r74jij0b8yf22xyvrakbrzfh7vjpfl1800ahljas7n8g3h1wi";}; +flashmovie-25768={run="01rmqf1rg5vbxzs9wap7m8d19fw73mh3k7min4msbipvg1vqhgi5";doc="1lza6mv55da69v8jwjlcd08v5y2gs2s87z5h1hrsp3p3mx3chya1";}; +flexipage-66614={run="1296cbg5kszwrq6ixkpzz4w4x0a7k77kf641v292awpf9sd0mzl3";doc="11s6ldawl1w8vpv6cvw05d9krjxv9921ilryh9ffwrrpzf4vgjmv";source="14ajajbl0xhjxl5zggjpip1b4grszdc2g63csgdy79bpiffpkl51";}; +flipbook-25584={run="15b2nzhpgj6018769ggajya6qmhq9rnyzha0sic9fff24jwdq62x";doc="0lf04giwsgjq0fsk6wrms4c3dg53v1lq3n0q1ij5pw4390llsqd3";}; +flippdf-56782={run="114xvv7sv9fhqxgfz5ckydn95mrg4049ml3kg6vjjiwbilmszr2h";doc="1fgk3g74arazrmw6swfyq38s5gdw8knnwwf5ij0dl566cwmcfvmj";source="0hbw3wgdva8vkic4sz0349mdyx8dpz3k5kk0fn80m0yqpldwgkid";}; +float-15878={run="08jb0v6lsyff09hid3whah0i0fk5znsik5rigl4l7vflnvc6km8y";doc="0pqj9qq5yprg0xfxga8ck1s2wyjzz4ymhpqgzhzbxbdslh475vg4";source="0774d7gmb8c7fc3f8yzarlx1m8nld1vg4gpd3dfyw5b39ra4aq4h";}; +floatbytocbasic-67945={run="0vykm4w2a4gjhjhrxr2x3vaan81yhnylpjx3z48cwspxixlnmf67";doc="12yyyc456v4i5dj7g3cnv03zgvwvsv6c24vfz7wn9jk5gv90vrwf";source="1gkq5v8z77cncqqz5cvzi78jf66v1kcni3yphzhykvd2mgpb917v";}; +floatflt-25540={run="15v2m2mchki2gcz0fcp3myyr806fqyy77nv9g6rqm11aqp6212bw";doc="1d7v1m23p47rl9lln02c6bsi5mkqi7c03dhmnjhg8bqp6xfkfmaj";source="1j53lkr1j3fp5wlb41x2vimncv2l1pc8qm7qy74i0r1xf7kfibzz";}; +floatrow-15878={run="177knmgpv583xajihdd5q5spaainn8h35kgydq2sfi6ch6cadirh";doc="0py5a36gdbsd91679k4chfxy6ykj2wkjqlg4zkp5xsww6fxglskx";source="1mpskdqhghmgh7i3425xb985pwrcqcbfw3hlfhbyx3bhwwx5pnqx";}; +floatrowbytocbasic-67946={run="1bxvfl7qk36znp2i8a704r5jsm2kljaiqyff6nsfji6v69wfgwwg";doc="01qaaddanpvl7v41v499r61m7b739qjjkwj5k9d08h28v5lrny0l";source="1jy49cv9kvcmhkyv8pi45fr1991dxfn7jqvq1i06v0adyprvw01m";}; +flowchart-36572={run="1b6gwbnd9xjcvjxgnl6xjq6lja1a0p2xnrdlbrhs6ka6f6pnrbl2";doc="06i32gmsqgvqgy0l0qbdjybnp4rmz2cn1c7zw76w3mhd9z220d77";source="14ikpr9fga193y2vgr5sisvzc5scf04b1xc9hcv6zmkcph8dvnnk";}; +flowfram-35291={run="1ccmry6f8danw6jqdsck7pzwjsrh5vcfy99f8kzyqcbbrzl5rn8h";doc="19rrav68s3wlwgaa4mhgqsdlr1syfpvp4jzc80cygi0fhv2hn7yi";source="1hrs58xhwawxqd96jb5hjywbfra6az2qkap0p5zap9zkck8ixz81";}; +fltpoint-56594={run="13zin0r1hcfihji2h33q039mpcf86lw2q017ss8848xpqs41fb0p";doc="1yr5d1hs3bdd20df25c1jyb0hcizwq7bxjbcn804b97sjk2fk8gp";source="19qy8da4ppsd1agh1c3xs9fxsl6z8c60lcyw4dd88mymk7yk4ysd";}; +fmp-15878={run="07ml6i8lqcz737fm33g95nx1hz1p0z251h7pgxvvvdmn5dml1l94";doc="13i7axi1s8qqgdvdky20dckmsa95q2q54z7cf6zgd0znzjy6d4mp";source="1fd8h6dndrc7hphs87y1lfplmkrwgn1pxgmvf00gfhgkg1zf127b";}; +fmtcount-53912={run="11d9pq2cqd1qv20wr5789bzmk0a82j4rf8y9xh4l6nf2nk9p5c3g";doc="09ikawga4sg27ch8rvdf9ni0k8b3nk3k84mgydlv4lrg5gb2hv12";source="0ijsl21nsx2kkgbcc00bzs637rq3x92ax0xbrdagkfvnrna0bg69";}; +fn2end-15878={run="0cj26s7555q49fi382pbvy65xa0yp0wbihk3y0magblyxjn72wdx";doc="1kafhgr4c9d4pjpydd27ha1pdbxk364qv8dmcr7k3l7xlv31jv4f";}; +fnbreak-66615={run="143wpqpcqaamjvg466cwpggcayxfqnf2vjvfvy7xwgky9sfql05q";doc="07h1xr1xgih5j8mmqvv6v5kavnb9yzrh94g0m42rjqdzg5c25fb6";source="0rxbjgb758x82gvjrmap30q4jsfq0424r3xszbm1f9b4wb48xqxd";}; +fncychap-20710={run="0x3sjslvz1gsrr8607q9r6k8683p9zcz7p0kxvr92j9ls1prl5c4";doc="0is37brbbdqb1szx3rwgmaqbl8vlqr82sy8svam39yrbnzd9v1k3";}; +fncylab-52090={run="13l9jmcwabifc7m9klgwl2gqypwlizy1mb7glsvp3jslpkhfj267";doc="11w7z5q433lnzfm4c72697f82yb7rljk9zq41dl5bdb7l9wd7325";}; +fnpara-25607={run="0rn4yk1zd4h2r5xhghv7v0ph0raspq4r6mw812hn80bn8rhjjrlq";doc="1w0pkqqgkq379nnqk0wx419z961l3g81ldkh8ivfhn9q5vk04p0s";}; +fnpct-62248={run="127n7966vy4rdwypbsczi1aksrf6pxl8xdywssviivkk3npmhwvs";doc="0qixawqmjn2b1yy0fs140a5wfq0py5bi58gpz8c8564vx29yva5q";}; +fnspe-45360={run="1w5ibha9cxychlvqrbj2v49kizc7hg14lhn1smky2m9ijqrrdwyn";doc="1ix8midc7hy8443fh3vkrl875h1v9hqfwmgjw750gdy9x7y06fmv";}; +fntproof-20638={run="1gq483namx453zg5yv7acvhy9hb93z68fyfb54ayqkka2n35q80h";doc="1qzxky8jjvnlznm11rjzgxmhib0psv7lfk3nfb8ys2wl0zjcrg2w";}; +fnumprint-29173={run="1i04c2j1jnw9qkbv92nd4rr0zzvwwdwwk0ya5f4g4rarvw9h4z5q";doc="1cwc4jv9jxxinradairp45rlr97h52vxghfxin6dwszw51ac8p7n";source="15d3jpxs8zgsj40xipg3mfgir41p46c3ppwh4629a1dv4skxg2nj";}; +foekfont-15878={run="1vb2j10j6ra47gyp5a7fpv3868b1rgk2w54w0cd8iczvshbzva88";doc="0yr9xzq9pxgaw14r6494162acj4yavyd7r123fabwf4dgj1xf46c";}; +foilhtml-61937={run="1qnh70h01ys26spbjcq71zdhq8j7lszinv26v6ikpccsaaxnfdl8";doc="09b3lmxzhfa1h7nwjvidq2pd11dkz4aq3l4ciz0xh7gyslfdwvgd";source="0zhva600hf43h01n9ycjcjair84y0wzpn00z6ihyh8s6g199g428";}; +foliono-58877={run="1k91x2yyxp7n1akm8wm4kgynl977gq7z6pf439aaij9r0zzic2pm";doc="0f92kpv6jvvmr9fh24c7iki37y8ph53n3ixi3qjk8bb55yldyz46";}; +fonetika-21326={run="0fmhazwrjh427g0hz8br5b05ccxv523n1ar5ib9hp3ndqh6svpgs";doc="06mbkp04rwpb2jg6kbq2bxdsagbwl3vajzh0nbq5bfg9lgdv14l0";}; +font-change-40403={run="0955bj8r9jzzyyzn3shs3y7iyaxjzs9m3b9l2b33hpd4qxzzp03r";doc="0khs319ifwl7gfkmv7y27ysqkadz04l7zvcjxn08qzmhsxhjpz6w";}; +font-change-xetex-40404={run="1xjxrpqfxll7wfkgm5ksjfavk7zr5a36qfjm5aw5a92wgqzpmbrp";doc="00ikhz2nafa2ck1j6vb564ij61lnqa64l9xnl4h7v12g11j0h2k1";}; +fontawesome-48145={run="1s1lkmpmb9fj4qmdhll2mn1hz8xk89z9rwga5zqpjb9was4vrg1y";doc="19xjkzn9vgx2sgv5sypwcmwyx9f7rg4q58f913rjwrh8gvncv07m";}; +fontawesome5-63207={run="02ip5czslh9120nrby3k9qn0niy8bryr4190yyhibnwkr9yaqj4k";doc="0mbqzjfdm9hpds1fragbhds1zzyk91xzfy4azzn8bmb6xr3ix3ai";}; +fontaxes-55920={run="1xm9a33imgfsj1r6ky6c02ir857ccv5llqgjyfh2rlvk9xprmcjx";doc="135xhw9vda8l3cc76ja8akfj33wfmmys9wf2f1j5n1p742zj0g3s";source="0mq9rmi02p8lnkg0a8s1bi7rn34dg82n9cqr14sjrhqfvpl3hzr3";}; +fontbook-23608={run="12dcha7gkyl4ycizd2469i628l8qvh1xzacg7bv7b55q0dip2hlb";doc="1ywxxp2ygc6xjrjsmq1ax4p9v0z3hpmbcgsnqm3vdnnda1c0gn33";source="04ny0n1wgs27ky6fpf0i8ivhkj6ypad537mlx7rz39kkjpl6mz96";}; +fontch-17859={run="09jpw4fc3kk2w1rxs0lm5sfvl8v12y9gch4viy6hva3sh3w8yzin";doc="18si3pz2crkyx075cfnz3ddwbgyccgvyxfzqd70njxqspz8xwf23";}; +fontinst-62517={run="1jqhfib1ml33wq292x9ff03shyjrn2b3grw44cxzxndg4vq7mn1l";doc="1138mrjd4lbwn05kksw1249ffjkdpxi88m8551wdmh6q2bnqmw6h";source="133myqzr4xlp4a3pw8ld815mpl7l9y6rhz620ja77sv4fmci76v0";}; +fontinstallationguide-59755={doc="1i6im0nckcr9fzs0kc54dvcj3jvjz2j8jd55xgjm0r569qjj1hi5";}; +fontmfizz-43546={run="1ccfywcywrrim1hk7g0kg0bljq034fh27qrr8w8ypcyjdnafkhxg";doc="1fcsrwbn8kiyw4032kkjg2668ax0kfcb6g4kzgp6bjcmqzy6q1zc";}; +fontname-64477={run="0ylpryn5wnjnf6acjl6kp67i0vl1dz59xk2xbxb0fqhx5ib1gdgy";doc="08vfa7n2bzjsay7b7zaigkq7imlfmq92f4firwc3rx9hfm7hjbn6";}; +fontools-69241={run="0smka2cr5al8f00hfcwpbwkddl7g2zcgg2jrak2j8p2ycibvfgaa";doc="1avxm73plf2p0xk0gh11311bfqbwlxdyvgx9hpg623ngyw90wkaq";}; +fonts-churchslavonic-67473={run="1s8y5kri1sjhsbz2mdszwy12vz8k0b5ad0rp383jrgcd710n3949";doc="05kgbvjj4w3sblsjprgq1gg0inrgrx0hpim8pmbgqj6w8xc1n9kq";}; +fonts-tlwg-60817={run="03fs5l62fbkz9rinnraz9zfz1byjd74xwvlfqcv4cvbxg02dpgmm";doc="0l4p30am56bblp120lcs81idahw3wrgmbrvi0jzfnvzsyd7xh068";source="06zw6amxdkmb9cdjvkvwgah5x33ksa9iigb4dcw6b9d3a0q8c8ya";}; +fontscale-70541={run="1cq9xb7gpg43cjcz4cnwg7ggj08rnfrkbz8w3gfsg4ayp6rjasgz";doc="1vbsymgcvq8qhf1dhk864zwaszv3ai1hqmyiwfcl832m86cd2w5z";}; +fontsetup-70135={run="0f9173hyb427v4dvimfs450rav3383c6s5v4gr3jfkmz9l5nxla9";doc="1lkw61hfd435dqcv44rczacci3fmmwbvkg99lhihbxjx51y4pbrn";}; +fontsize-60161={run="0614lcl1cxc7a6irrjinp5x1rx2cbzns0al7d9f3njyyayp13qhq";doc="1c6p4yz000rdcmjkn7pgz3ckw3p42xkz4clk5dz01fnxifmmlf1l";source="0lvywzrc56rfkkwipwhqahkm8a70cnff0r01rpl92d6n6znl278d";}; +fontspec-69880={run="175j2zf33y5lh44x87mgp2hhpw609131k99df4fqzq9qn2zxfmr9";doc="1qysx336dixj5m4wvjdjn196jmdp6ll1r2hp2kc7jfqwzi4qpjkl";source="0b5yambwga3fqlhbfjv6jk3lkxxj9c9fyxm3hxm8nzywhwlrncd8";}; +fonttable-44799={run="1vz99pfw4akid9hjf7dcqf1fx5h30sr25i1f9q6a9frk0wpwff72";doc="1inb0ai6q8rjsrcwgv8ns6as60ifdidqzqb8x9ygaw3j5ykzr02q";source="1qjilvy77072jpbdc4p4qfy5d4n2ww2wcm5drwvai6p2aclqf29x";}; +fontware-66186={doc="0ng27m6cz92aa52z99gnw5i8s8fbkxq4354mygwnchchgxndcba0";}; +fontwrap-15878={run="185mzghp8xckdq7z6cdwznrg1pswflvfy61bhsnpaxx8wagny1zk";doc="01knmxqj88g87ljvxmf8rr72i2gh9qdmx7zsbwyjmibiw71l6pcm";}; +footbib-17115={run="1vr72sl8q1ccql2p42v3a9qw01a50v1c1rxpgmz39pp65w4z8s1n";doc="1xyq88jcg6p7lc44n2ky7538r23d4n0nhfkq25q7xg0dh8whbm34";source="0ps56l6ah0i398f38bxy4yg2i1p0ajcwczxq222hl5176g2z28jb";}; +footmisc-69729={run="1xyx6fj56vj49m9848i83jbq7k3hycx9pd5nvc3cd6md99bmx9pn";doc="0ik4rl9nmad0f9zjx600sxvlig6j3v0gw2lhxmkbs37v18p0xqy1";source="193ki23hrlnw0vkh2r54m3y2h54kzh989pk6iwjnfgf91d8nijzf";}; +footmisx-42621={run="0f6csxzkwbf4nlw6z9rfyys1f7fc0vpdi2m36g7y3k9l3j6wb3mq";doc="1962sivh4jipsxd0z0cpzpd0jdw8v4afbpzfinklivnla2c9hp4g";source="09w5bfx94533q36z3k0a1sf9jx6acz85qgqypgn6b0b5mkhjsmar";}; +footnotebackref-27034={run="12vxch1i8x0k8d760vgq61i7j3kkylgbcxj6ggdv8wzd20h4izyc";doc="09dvvnjvika3617zx438ca8z3fmdkqbxx9y73pdhn6gaggfmzr72";}; +footnotehyper-60374={run="088mh736125609bliars0scv7v7bx315ajk801yj28vskg0ki5d0";doc="1dj6kpqar8bh0qk0qma2ckp68cll2ncllqfda4ffmc5ljmjp98m9";source="11dg59x87a8yjq8j413gk4p0bmpq8awwh50c6vs9rrcgv67mbycs";}; +footnoterange-66149={run="0z2v5diab3xpq7x63n0w71r9yalnypyv70syh5n4nr79ahyxcmmx";doc="0gg1sc5dv9kpxavrdkc2865fcwkyc9j24bvk34l06fr7ib43bja2";source="09qa9gp6pv37kcck55c9zv3ky79xdw2ivkwf94nzbw475ryw0zv3";}; +footnpag-15878={run="1qdl7lpfy5nn6qx026b9aqz8nfs958grh443lkqyxnrnws0n2nww";doc="006w2w6aga9zazlk8sv8maqi4s1rdzqyphp0lpa8qv5q23vcdhl6";source="1hh2754as2yrmfz4hiyyl8nlshsfdhpgpg3ifhs6h5s0xz947rw0";}; +forarray-15878={run="0cn062f805lgy5m45q6flxj5w6gjfa4w1ip7zmhxd2z09s962jf8";doc="1d6m425lfg1g8arjyz4j3q9253rdmfaabaasbpd2ynhjr1abfh3c";source="0dpqr0hff33ddfw6vs0pnk8yhaa4gxkxgn43qgx06mx1srv6rz1i";}; +foreign-27819={run="1hqmhy3l2hsjf2hkxhrsdc3z1mn3zx8718w90g8152x9k84bf7jw";doc="1gnaazl1ds76sqdpbj773k80isyf5hmjxh22p3hs9zxcpnvdhng7";source="1ziafjxcncsba0gbn1qjf2w2gn2g9z55bpcff71hr9axhp8xgpgf";}; +forest-57398={run="0q1xd07z1ccqrrfl3x0fg35sdv2kcyl6vgps7f6gpk5yp8j7d392";doc="1s9i1kxd5zhdqv5xx29kh8i5fis642hcw76ya5bh94qffhwwg7j3";source="1i6r6i8zh70zxz6sk0c9b07345vcfr9aapw8q5kzd3k76fzcqfdl";}; +forest-quickstart-55688={doc="1bjy0bfkb90nv2dbdw8hdrm3dvm1v0r0m7a0l44ckw48vnc6amvk";}; +forloop-67017={run="0mqlc65g0khj1izxpgm7yya2klazsqggz2xx61ni38z7kqhqs58s";doc="11y7afy69dkp9rabj1186aw1d8vfwk3vp9raj0brknka6wlgcijc";source="0k0skv10m7z44d20v17yfdvg6vpn6m9ajn973d6da9cshxvszyiz";}; +formal-grammar-61955={run="044fz33qawb2s81c8walxiz0qjam7vsvsnsvqchmf4izd0svw998";doc="11rj5pbampim79ffipm7asn8q7nf8yy7l96j0j8xjyfxcqqld6ca";source="0xy21vgswxjr80q1qcx633g09qivgkd3i9gf0fwjmykva23q603z";}; +formation-latex-ul-70516={doc="1jpw01lsl5lialhk0n46v47ddb66wn6h8s3crrp06m0fldaaq84x";source="1vcchlg0dv2cmkjx16hbbzkvppva3mqxn03h6m38gg7q9w092bc9";}; +formlett-21480={run="1gjdgl26ma0sh15yrgi8kpy4sq268jkz9jmyw66iy3d4k9ybggsm";doc="1mm2m4qgiz0aplbyf3rwzhpfzhyg3mfmzc00z35kv6s5phcmlnf1";}; +forms16be-51305={run="140xh5578cpjn6mfwnghy38alz4av25gha09gl7c7qxljgpc2a7i";doc="0wa6pyn8l8d14d47kqvwvsnkv2s9mxfhmzan7jgzfrmkb74h7xlx";source="1l3ci86wl6an48a68vfh4ynajq6j3br8wbafm8w8c0x810hb141w";}; +formular-15878={run="16h5hf50ngqarcxk4gjs9x9mcycmj5cqwy5pb6ffpj9xbsxn4r8i";doc="19aq7sbghvrif72x7vzvabrhwj7lgsddsbdqbkv9vhmp82452vyy";source="1s8ngbw6s163dzj9mi629yd4fisxr1gl8w8i618my426szc1vrcx";}; +forum-64566={run="1jvw5w58v5npajvhs7dq0srgdqha9yqs6xy56fbk3lm8y0cgsx22";doc="0cihnv5c2if9dr5mz9iw12g1bfh118ib2an0sgigqcq6f4zp4nxh";}; +fouridx-32214={run="033f2yhslmm70byg4pkw64g976vgssc6yiizmh2f1chlfhsz1qhz";doc="1k6zirff9bqbz7assfrlq0r83bjqgzblgxix7697lmp6ww2rj4l8";source="0il905sqxqvqk0fgsns3yb9hjh740h69imykxd84p92fndaha5mn";}; +fourier-61937={run="183dsh8z5dh1q45qrpkas40ga2m4mbrgl727v0khqsxxim5vlzi8";doc="1zcr023w2hdk6y3x1d69nrwzsv3qd8ip63rwcksh69k4q35r9xkz";}; +fouriernc-29646={run="1vv4whd3axfacbmm8nksdc37d5zras4gwa6ykgw1svplqgg3zjk3";doc="128n1cnv9h1hr4s6bp3xs1v9p7skhxlfy8afslpay2bm0ixf0cs3";}; +fp-49719={run="07qzdfrk2y499cz9jbpnj024r43japqdngbxg4mbapw9cp8066d3";doc="1y1xwqf6mskg10h31ws2pvn5y6g9asflc7l9r24fp2fi4254mvhq";}; +fpl-54512={run="1jpbgs674zkjayx5xbg4ymnmygxcc15ysvr4cpz3abp333cqzjb4";doc="1860bzvxbajy3r5gpz6hwy0vib632fkdig2zcb51yy2qgg3vbal8";source="1fr7ydvn8ql0jhplkwxzrl5cppxbklg97nqb2rjigvmqqidjk0i3";}; +fragmaster-26313={run="1d59sjzlvygwq9b02gbrfra4cnvmygza80b5rkghhhpa0n3xnx9p";doc="0j1a2d4ssj3y42f0rsyhd7yl3pak9cz12fy16k2h8v02cvc96529";}; +fragments-15878={run="02m23bx1p090m6w1frb2k6m0cv6jk8d9fdbmjscwa7c9c55qh5gd";doc="11kj5gczbhb0imfsf30hc74s50iwq4zfs79j6kv62ib6v3p32mm5";}; +frame-18312={run="17r35x914f3h72drsszy74ir5phcxmkrcvwlrfd11li0lsmiyj62";doc="0888jcccsnlpzkynpg8mvxy2mnb2d3xz41bi341q9fdbbzs5lmnn";}; +framed-26789={run="0fp0zbq3bjfqx87zb01m5ffn8kw8044vkz8b9cfndz1ki64d9x4r";doc="1pjnqy8zl5zkadpkvwa35khwjk1nxg9pq0h1wqwgrdvqk6gj0cbi";}; +francais-bst-69866={run="13zc3d8ppb9p53gfdssqcswz5bp3pfacxdk0w3jznfznkwpz40pi";doc="07ya7r02x7vj1n7q5d9z520vdnlrq2384p0rk826g3mhi9372jna";source="0zbk98667mz8lpv89c31q8cblsqs54cjn8i3kg49pi9avb92848f";}; +frankenstein-15878={run="0zj1gcl4gab78qcs2rv5i9y4q234iz731x2hnab169ygql4d95i8";doc="0x1fp5xc2qlx0pac2vqm8567fdh8i97k25ixr28w7fzwl9xnm91x";source="0ag37z3klcy0jvcvvj7v14clx2dvv6q43lh6gw83rpsx51v9wza4";}; +frcursive-24559={run="063909r7iga0cirxq8qx538407qly4p2a440xq7c603fmgcb8n6k";doc="147sa2wcixanwrhdh3ns8fg447zh5f42z8x0aw41xhk7pxncqrml";}; +frederika2016-42157={run="1pi2bhbxw9xg78w6d6k4l6p1qnm4nh6m8k3bn76kv4ascydc9hfg";doc="1vyy278j376swl2sjwxygqm6mi6s51aa6qypgpw3w2g5kpsqqxqb";}; +freealign-69267={run="0b1b3laxjjjr45cagwakv8c50c3cmw5iycd76k94d9nxhgm346vf";doc="0pz47rbacyyqyh075fz6pfvjpi32fl859mckpi4v0kwr9yk6k5aa";}; +frege-27417={run="1n0qak8xsi8wlg7r2daszdvi3hv9gmp7i04phcnx4hnlr68842d9";doc="0hb7a6c0i0jk8cvv2vfr743ysqn2vh1y6amy7arc4zafi097nwly";}; +frenchmath-70163={run="03a7mq7qb0sv27ly8qaxm1fjmrc1z646las5f85rzp3hdzam6vvs";doc="1d1j2wq15kv8bsjbm5p4im6ixbdj3f24vh1a3b3a8419bsqq60hc";source="0vdh3g4dm3za19wjfbgy84pz3i33k3h17028nwa1wsgpnlnxn8i7";}; +frimurer-56704={run="0d2534172sqpzg4zj2fz0k1qa2m627jzqdnpgcak4fxighvx1733";doc="15g0293xz99w400l3rj99849va3swi2j8hcj522qiyzfcx5j7k74";source="0qxpdybwz0rp748rqfs026jvps026sffq3c7zi7bdy8a34mqmgsb";}; +frletter-15878={run="11gxmdwwzwwdlrmycdxi0y123hfikhp9jv1jjmhgsmsmmxsx13ly";doc="1pzpz0q1hplni18m6wkwrhknw15h555qfdxfnnfrnrmsa7n2q2bl";}; +frontespizio-24054={run="1rdgh6wvxk0rhkadcrb1f3ymgxn81vbx489z16k88wkk1p0r4749";doc="0mwdqry0h2f65vrki3kvqpjnf1nm5n9v3ljmn77nlvkarqp2kb57";source="1p2c8sdrm0ay9nz0dqrcjigzsjki15fry6mmhqcm3gqrcscsk5x2";}; +froufrou-67201={run="0pincrfmb51qwn9bcfyqb6rdc0n08lwxf2gr8l74kfmqh2mg5mxs";doc="1jl6glh4pjm870wlb4in3v5vph55fnvykjziqnq702gx5va52jmh";source="0wng7skd5zyk0s2vgnilndi8p9b3h672pk00mwv97h2qb4lk848i";}; +frpseudocode-56088={run="0ypiw6sfap27hpflbk0drnd412ylv9r307jbkkbhnm5lsmwaax2l";doc="1cf6424l655rykyfvca2yl0lwdifgj5kgvl0fvw9ikayf02wh3qg";}; +ftc-notebook-50043={run="07ng7dgbr1swsx0zwm831wijqjq4x6hnr02354jdy9z59k6d4lyg";doc="0w9jxcfvkpif1fyd4xgwbfba9b2sf77mqr9symwby31lxqwrbys6";}; +ftcap-17275={run="0dbrhynslppw5nrdvikzdkfvilzr909ypc9v8nxpa3yh4zln182d";doc="0iq7lq25gzyc85wpmr93a8ivgc9038rs80mvhm46zdrrixh5ry21";}; +ftnxtra-29652={run="07fazshsyqng62sfbnjhxglscw707jmn5lz1ws6avq8c5chs70pb";doc="0a100iy3imy2x6rgv8pgkid75ah21684ddm6vda58gv8yzfz9fyd";source="1ips0zm2cka9wh4474sc283102s6r9hvr4if7lhd04c92f40r3my";}; +fullblck-25434={run="1bxnzkidpszq5l2kfilrn8ny1gw680gcx9gz9975vylh5kissrmh";doc="0zj229qkv3zdf2gz6qkgblj33zdhf8zixy59gqm4v69ld491wvh1";source="0arshfc79aljbpfnnq5rhi7gc9sqhlx002xqg46wrq125cgdj13q";}; +fullminipage-34545={run="0zy9vk5a0bljq3my17fw4jl8rhd7vdzcmw550ps8zbjbhxphssrc";doc="1n9lzacq920lmc18rhavz17xnm92lm964pglf6j8i7yyj5aib61c";source="16q6f9nss1jx3pw1xq0j82y4gn70hdjaj9m7pq3947m6bkyz92vd";}; +fullwidth-24684={run="1kis1p158phkwxdfhpb4ihfs2w7wywj1lighc44sfkpima9c4nmx";doc="056k7w66rh0z1kxf1m91sbjhg8kdy9jvfkwm3jmi5mkclil5ihi9";}; +functan-15878={run="0vxwabhbnw3dlxzlqz4yi4l4iw17a0w7lj3gh2q4l3p9lhzr9qmp";doc="1jxx1inlzrbzm784zwkz55ykdqhn9ncz6cixs2wqh2sx1dih7cwn";source="1a2x71qhjdr2ayii65qivjmwmxzw6id3vljd8nv3l04xnp6p5dnq";}; +functional-69929={run="08j53y7lbrimnydmh5svmd3v4qs4sh7ir9ng8g7rzpl0rakzy2bd";doc="1wsqln5346ivbcpwzjhfilsgc90la1is2r159bqipg51jnlicg1b";}; +fundus-calligra-26018={run="1rnrqblg06qkwcy7f460pd1hnh4bwl47zyswa1iv4iknx00rd8a2";doc="0jvbvalqyj0kyf6cwr6zf18ylckh3fwpshwhmnv7ldg5r1ylia9j";source="14a0d7d8mlsw7qwpspqc2rmcdyhnfy6l7f57bk9v9jc8pg9fxb6m";}; +fundus-cyr-26019={run="02zz37h71nqq0f4sf00fiw80pq1q3yadnhqm2j3niz13gms9ydl2";}; +fundus-sueterlin-26030={run="1zpcss3lzhc9zkh8b91138ycwj8pihch318zr9pc6bl3ifq37wq1";doc="1pjka7j1378bqa32h0b2dcinf6ayjmzcbm4c1sdw6dsvrzbnda3f";source="1y4bg8r2hmpa38hdgkrk99v87cphikdb7sq5x9aczbmwwgmgw8fp";}; +fvextra-69001={run="1dxzwabx3zifcidp1hv56h0kd234jixjnblym2r4sqfw7lsdyjv6";doc="1wwpl4y3qcgg1k6ahg0w4rwxzr3qw0nv505dric5qpsvi1944fj5";source="1jh9y4w5c05vsqv1yvrbra9pkcz2j3bxqnqqxlnyv5m825k738bm";}; +fwlw-29803={run="1qwlknaljj8f1cpnln328az913cdwypr7w8m8iqbqiqhsl49siap";doc="1cib3id21xblai43gkn78ypz6n99vwzhzmpdifdm8wv001x7wb82";}; +g-brief-50415={run="0w0i9mqc5wg9za3n99i3fkn4bw78l8kf6glh0k6rvrzss0sg79cj";doc="1ikasv5w1xr5ms6836q1bnk7b87s24m15mnwsbdyf7cnsh267x6k";source="01j6zxs8vpiiimc10hhl93xcixwlzsih5k56n7v9a1a3czgymad6";}; +gaceta-15878={run="1yimj3mxyjj36ib4lfdh65sz5w71rlp41hhnzz84kgb5y103wpaj";doc="0vvadcqjj3hvjll9nqn3mam9ycas0zs810qi2jnq6smpm300c3l9";}; +galois-15878={run="1knks42bg72lj8nqdy2iyaqkq5a76yf4zxql24mwxq5fq5xv1vmx";doc="1nqhf3si1kljbr0s1sb22kq6nfrp9ycvm6smiyxbw5lyl3spqkxv";source="1rlgf9bv4rjkyifz3xvvkv6xnqxl0pl973mq0zqxaiqfkh0i5xwk";}; +gamebook-24714={run="0ccsyi63paf40lxphmb60k5xciw8v7vd1hqllgq84mry7igzb9np";doc="1c2m4009fralq8ahhczwfxhh1cmsdh0c5072yrirda46khd5wy91";source="1dk3fpg5038jv5bs7c2f82vll0bdd7c1jrajwhlfk1v16p2f5i1c";}; +gamebooklib-67772={run="1qk51f0a4z1frby7bv553rxrhg8xgfkxfnr4dbq3dg7mydzrl444";doc="1cix1yzasbqpghvp5smban4l16fc48zc8a8d9jjqgpb10l21a2rl";source="137a2hgcvmkgsd8kyzxlprr3d6v08xvdv3s049cg9lxazizm5g7k";}; +gammas-56403={run="1wcvzihv3xh52s3ydni4gs3lcp9icmxinqj6znwyy680izmw67ba";doc="1al5rvpfavkc1p7ayknxnrs4r7jzx7f7dbm3hayqwg0d7jdanp8r";}; +garamond-libre-64412={run="0cj6sla634vcp3ih7x4fg4iirckiizdggw8y5ddxyhszf1ygkz5q";doc="1q1iy0xifacs7w76x4pgcjx13hvj0wc5l42xzac2srbmx6x2n4sc";}; +garamond-math-61481={run="1bjskvaqq4glba1vmcksfx69p6r025sl8aynlbk46kh7x5fa6vj8";doc="1jb0kcy715fmxhbzg95qwilwnmp45znh37iisiny1dzy8919nlbh";}; +garrigues-15878={run="0qr2ak20416p5zlavcbihxkjvifzwj3cf03ipsnxlp4a0r3m0hgy";doc="03cx077kcvny07dkg9dpgvdb5vh4z7v0c80rn82vqj1l3i0qrxkn";}; +garuda-c90-60832={run="1yz7zpwdvvhzcsfcz4dc40nnaagwrsxvskc5bymmdxv1zf6m3npf";source="0palvrkdf8c8xhx9d2sxvch0lgycvn10bfszzwlbxw6qrbnpspr3";}; +gastex-69877={run="02mz7znvwjsxf6n1q1lfx1wgqvl0zlfq32a4xkcad7gjr87v16bl";doc="02ihbradpmzz8h7mm21nqvmma0qqsa4sp3yzf4ll09pp19i9zhh6";}; +gates-29803={run="1vxn3j957za9j6ryf3nhy5r744gr63m78xzvlh0z10sr0bpw46v9";doc="0igxfdxyiz280ryivffq6c7y84c16ip1av8wn11j6x62dcsrm58x";}; +gatherenum-67201={run="1b5j4106mjdswm519nb9sswnpnna5v6wcy4p8xbccv01044iqlk1";doc="0afd1c352075ix46y0jrhfwlbsaibchvz3xs916qi3hd8a90hbpx";source="05dri0sgr8h29q3zxcsyhplhrkj1wllfb42d8scy6hp4mkmbsr06";}; +gauss-32934={run="0jsbvm7sh7bhs5yfl17fj1gbdqgpm7qchf07y3p7k0rxxg0f482z";doc="1f6ycdq3lpylkdwja4f89plz7wpnz73wzgjz74far6r9wr026443";}; +gb4e-19216={run="1mi8nwxa418wqp9w64ya1i0ag0pdm4cx08fkmaa302bkhym92bal";doc="0nzmhjqdhl0x29c70iqb8b96pjnx2vm94nk3xgid942pmx44skxb";}; +gbt7714-64633={run="1i9a732px7rrgq69czdqrvnchwwxzl7cmxm1pdnbkv6s2yaakgdl";doc="1ay59q9s8vq7bqvif314xjr34k9b9g4gk30w3wsy7k44ijs481k2";source="00qbmnsyv87q81m01lgflnypwvff7xbqfkf750pfdyd18g2r0x2d";}; +gcard-15878={run="1pcxw9mg6hadr5c6m4z3pdzs0b9jw22injdlk46xxhqy5gsafa7v";doc="03686fg2fw1k1j5rrskxpb0yjn2n5l697l66gww90jysq9546iag";}; +gchords-29803={run="130b2svqilpj14jl5slw11b9dqhq1nvdph6y3qcq71pgng5lhjjy";doc="10mbr14bjxcl4p42r0zsqag5sg8yzp1mpi0s7fq7i9197kg8i77b";}; +gcite-15878={run="0dl1plmbn4i5hzmjz48hyfl5wj819pg6k1kjsdycx4wi0d9ff2pr";doc="175151qpcykxsf1a6g9v6mkhr6m9cm5miw3ys6j5csrqm3vsl604";source="08h5kxah5q9105n1awlrmiy0zrl3rafb8v3nwp4qfakr83q3vf3k";}; +gckanbun-61719={run="0bf42j8ismm450431pqvqgwzd04xsr7qlhb9di867qdyiy6hbrpv";doc="1rpgm6jclifxzs4k5ybkn9pxsl60vl167jjhffg6d319g3miy7al";}; +gelasio-66805={run="05rr0vdiw9jd2qzasq22zfpg901l9jvighlhsgcpl2n3cfwa96i9";doc="1n8jyjs056m85h2n602h4gys6556k4h2lwyhck5wp4g7a27ri189";}; +gender-36464={run="0skwbiclrpl1n55dr3lkw86dvqy3f1n0b271ygsz6rr3qa43478r";doc="1gamaakkqqf37cwwzxjbyfhz25gdzayzdkqk60xls9flp7227hbr";source="1l5p8ib5lbvq2b8pizpwpbcv8aslmi8dd554win7ssd6vhgb68j1";}; +gene-logic-15878={run="0fxddiswkvfzbmcckl6mhyipxjlr0yf0579i792c6rvrqs5avyak";doc="1nd4bxrq1g1gxcrs9lvnakaivla37p218pa4ns6jyjmimfl31gxi";}; +genealogy-25112={run="0w15jrd6aycdjh8qznvm549kzwl15v2zvs7awgk96380nzcsmhqf";doc="08fxhib7wydjbd3bf24kw6zbbz2sv6fhgmg4q2c1lgxddmm8mpzy";}; +genealogy-profiles-69580={run="13371cbcx7lg3lkzzybp7vdlrkw5nd9v052d749jygsplqby8f9m";doc="1pvh2s76kpxs98l4yv59clijinjg5agmniaibl8srpwpgcdx5ni8";}; +genealogytree-66513={run="0947fmawi8xzmv9c4k4355fkgjivkkjrjglklk6ar7jky2xsg62b";doc="0wvqkdhk1lmvk79qla34l14hvcjmw318vddz1dhl21g0cri7fl60";}; +genmpage-15878={run="0fr4m2y3vfymlwk7ik7rymifyam2jhbxn3qr2sj40zbcr9wbah6n";doc="12fxwrz5gpswyf523wm1pg99zilkgrpq8z3ls5gw9j7bdb71nj1l";source="0q7acjs7g1xh5kcmrg20k9jayaf5vxz5p5amjjd4xj4rnb1wdlj1";}; +gensymb-64740={run="0rsck4ysx86d4gfr5a1w9kam98zzclb78v5hgdmhag74a0qs1n0l";doc="0826rq87q35knzmwkhz6ipigx3s3hkzcypy977qa0r3ibcbdr7ap";source="1na3aqqjfp9p9zb7hyzz6wdd0biiigih9fq6bxygcwflbwbhks6z";}; +gentium-tug-63470={run="05m3qcb12n143sxy12zm0bvj9zvkdi4sqsriprfkkfg6xlvk396r";doc="1yw6xs5dpmvk1brwry30ak368xddbmz5z2k79fpnyrx9a9z57j37";source="062g0b8bn41aynm3sk02ciapiiwl55whynvnz3gfzvlja3fn3xxp";}; +gentle-15878={doc="1l5fyfdbkpqlgpgi1hrnn2sz8hchlnp7z5s5584czafvs10jg6vx";}; +gentombow-64333={run="0r3aziqnq1pm2pfangv4238rpihaarndi3xhvpvfj7mc31b3mygr";doc="0vqfamrsy4r1wqly1196cq2w69wydzzw09y3jg5llvyh95a6dp0i";}; +geometry-61719={run="0wv4c77fvaz8qg1ffjg3y06r3q4xjfxkh3m7a5s9ynwmfchcirgi";doc="1npbvp9g9b4mp8w768gzx1vxsdsi9zlrlfgc65xmb0rqx7z19zvy";source="0dm5zakrp71rxfa8xgj7ks0gfvmrm93sqi6f8m4hw7ls7yqm3y9f";}; +geradwp-63134={run="0dkn2p0hbsx7f6nzyvvg55qcy6n3c48m7cf88r68hw4l5kcm2fk4";doc="04hj6j7zpbhsc4gzs6lb7vnmsqzbhfwirp8pzlsrjp8m7388y3ii";source="1xxmhqiivybsk9kqmmjzcxdx6iqcpbwiq5dph1l4jkgkpyfkmmpa";}; +german-42428={run="0w1s582hpvmri7im4jsi75xjz8iij7yxs3n6nad2png1xaxxq3ic";doc="0hclzvfgrc4ii80ywgjb8z1byn2ccqckvgk26fzdvcgg5j7v9x9a";source="1a5svzkxqqnqzva8nb1r3z1rfhjyl5w4sgkfwj7by83df7fwgnhh";}; +germbib-15878={run="1nrmmmq9j52yjasjjsxx40gjdbz617j66kwsiv7qzpkh9p2jy9sc";doc="1sbvvjxls934s1rxk0aq46glzvrn46cdznh26mhpa3i28c8xv3hy";}; +germkorr-15878={run="1bqzh9zklr0y1fj7lh6izbzsswsx00wlwgkg9wl8dxvxmzhrj6y2";doc="0fx39c00hmwv2wvngf3agz3gl1qs5jhcbfc377nxd0v44kbl6wga";}; +geschichtsfrkl-42121={run="0vnxskd0vlslm3jhvpvb4ihzlssdrz5bywrxxysk6c391vyq3w0q";doc="182m0m7lfz5wz017kb6kk2jn5vkmsll3js0sd4pqmr6gb8av44m9";source="0hdq1lkgmcpjk7f8pl2q3c6rin97hdzwhfwacc43m1l3c8zbmqfr";}; +getfiledate-16189={run="1bhqqsvykrmqlgd8whfwxm8bkcqdfzm182ryngq8s6yl9vx39ck5";doc="1jdsnf020iyiyxaabyaxp0nzf02s4kqmm8qf02vaclmbqhciicf2";}; +getitems-39365={run="1n02xiwch25vv9qk3rqddsm54nhp4fkwi3i5a7r3285md2b4vsiw";doc="1m2wfxyqkbfk7zk1czmqp8wwmqd091zijqxvanjxf7azxfmlnvwz";source="0njzl590bsmdnvm1gfqfjf5xpj9mj5ijjxjjxiya0741ylhwv6p1";}; +getmap-50589={run="158fwravmqda1zwzw6qzvq7lrd1xsjm9cdw3qgif2jjq6zsrnjqd";doc="0s9djdlchnp6w7wr7w2b4jj6iq3v6f8r1ri5kbp5q3hfshjgah22";}; +getoptk-23567={run="0rh7b66fn37nkcy2y6q8h3j7i8njwdmizn68iy1bg2l080ns1nw4";doc="0dmjwgv0qghhs7fa0a9jvk2mqbg4m3br1dk2x7q5mxyjzk9878da";}; +gettitlestring-53170={run="0kg2p7ys50ms0li3vnrabywnrjjgllpyr8sf9cz3rnv8zsab4b68";doc="0xkk16ncsyv2s3klv316fprld0d5aqaldh3g10p5gcicmccd9061";source="153bkg899ikkg5zhfw1nc48nzk3c0x5iycxspxcrrj52dpgq22kx";}; +gfdl-65415={run="0mdvjf5xgjk0gbz5x32pgavxw7s8inf5ahmg25zs3ffj1s5nmand";doc="1ybyixpc8k73jv7dl6gmanc7k2n4j09z85a9sx1a2fmfmijngspr";source="0wz586ljmff9j1irwqzvb6lqadzr6q382j2wxahnlymm7a4q4k6r";}; +gfnotation-37156={run="0n2g1kjig7rg9bkry1hyq9jap95jb9crzxh4yd9jylgrygva6wr4";doc="0lfdm66xrvkphqnzmymym0s79bwap5x4h57q6ndb7h97p5pxhfby";}; +gfsartemisia-19469={run="0b200snkvdkrywgn3j613zxyx16prqczw106hfh7pzpr7w717lyr";doc="03gi2v0vfcdar6qsp7xff9s5pd023i3kh4b8asxh9lah998qm3z7";}; +gfsbaskerville-19440={run="0n68mfx7026ymxlyhdyg9ppylh5g4bkwj95c9bfmp5bmym0q6dfi";doc="0v0widjs2w65ppvzm04wzinrcyp8hcicgxp6brydjmx9d32yrzcq";}; +gfsbodoni-28484={run="00r9b46m6h4vac788vfz6jixrd4wbmscblhqi1pxhg76id33xdgd";doc="1s0lq3ac01zcaqyvswn12fxhvqarq2b3lni1xza3yyk2p6y95g1s";}; +gfscomplutum-19469={run="02c0zs2xl2hy5wrrj25w22q1fj6q8w4qjbvlpx05pzzh3y63n3ip";doc="0h9i4v3sag4fmvlnkk0wjxmgsq4kbiikzv0rzfrhzfwaifpznkcf";}; +gfsdidot-69112={run="0m75xf0x7y3mxhhnvs22f1fz4gr8m86g8z9nfqxvwijjzm6xgm1l";doc="1jaxayp4z0ih0cr795as9bmp87h24z41ijhrfwwrbpbmjkkm77qx";}; +gfsdidotclassic-52778={run="03p2w06s9kca35jdby74q4x8if5gs39gb387rjgqbv3vdn7zxi4s";doc="0qnkxqr8r9spg3xl2ifr2sb32hbvmka979c4f8aw4z1i810bs0kx";}; +gfsneohellenic-63944={run="0ycqh6fn1y4czslajdwnj8fga6f2riw0pd4az10qmrxayi5hil23";doc="0zp7rba0mhbhjsnjwm3ldy1frz75grxgnkfl1gvzm4psxm3c9yjy";}; +gfsneohellenicmath-63928={run="1caa8w1jzwk77djhycahr3dd6n8823vc513gl7sgx2jid4gidz6j";doc="1fk5rn7jxqlwhzv7v9fvpadhlr07fr4pfjlqh7zx5wl720xb3yif";}; +gfsporson-18651={run="0h2zy85jalpx2vyjszw0kkrav82zv549c82qik9iylgfwfk1amx8";doc="1zy50pqr9bzfncs03fg98ws41v0v5c9y36rnjm5d9i7q2zljapy9";}; +gfssolomos-18651={run="1hn8k9majggqcis32nw2krnqpqdgy3y0dk777i8fqn28517ygxcx";doc="01cw6sq180cjjzwgi7p2qr9pf6rq0r5zmnb39bch2g0n0rjxqwgl";}; +ghab-29803={run="0skiyyxr8l6a6n34lic42lf0rnv4jm5rpmzm08gv0qqq4ha67zki";doc="15vpkpbpnj1w3nlc5wzy2k4fh8jw1a21asc24lj0j6dpb4mzja1n";}; +ghsystem-53822={run="02hvpf3idwmm4hjkbvcz0w9n6sb6iy1xcj0iiqa51fzg8kimpkzj";doc="1lld29kqvfgl4fmj70z52l1b5sqcb3fr8d2aim5l88grnypn9gb5";}; +gillcm-19878={run="11aph8kbrsjl4ax5hbpirsgc4aznj0nkk76v1ax6d52f8bxjsgjx";doc="1qbhq72bip77lsa5pk05g676c08wc0y1ix3c2iw1h5g5fk20i5y9";}; +gillius-64865={run="1z49x03rvpdgx7k3ry6wkz4vm707ms7mf0c120gr5dl0ggk16x8z";doc="01vidppjs8nwsf0pnj5b6g7ky95ayjiklkr2fybi4arvc4lhswgp";}; +gincltex-64967={run="0w1pk80idhws2yva3zvlbnwy2xbrqa0dckhwj8d9sdqxn5j2va4a";doc="0zdv33r7r6x39p80jwjxk4k2yi4rqyv9w3nzkn7si5ckw223gz4a";source="0m1yd9b6qlbmrxqnyk7kgxx7227zy6v10sf1vw856gpx1r6xbc22";}; +gindex-52311={run="0llk0aaa43n4in5am3ziqvkl1c35q27am5xk1naszwlqxcn4lx42";doc="0fpy0kvkj84vg1jz80jaz26k73rijrldy4m1p1xl3ccc7dxvr299";}; +ginpenc-24980={run="1brakvxxrm1gahl609psp4na8ylkggfs534nysnrijq6vf4r1ryc";doc="0d4q0n0wh45ndqgd2zk254791lcvzrxz4alr2bnm9akcfbv03jz2";source="0jw7qa8wrb20wf8dsaxinkrvfyjdsndd9izxs549dj19whf1jmfy";}; +git-latexdiff-54732={run="0b7hafll82widr8vibaqqavwwzi7m488ypm5wx14y6jncfl8py9y";doc="1cbny4qkr8dg8vnxjnjawq9cjb0h3816ad66q8b5652rpxn3zqcl";}; +gitfile-info-51928={run="0qk6r9fiv44hamlqvsgpm75nd68sgj81sgy93zsylypp15283z2b";doc="053x23sq6657lddjyk9bzadwydfh4zxl78gxl1payxmbl9pj925i";source="0fnrwcjfji5pbkh4kdsishfy85gqcvcmfqxwr5s1n3bm3prgfc8b";}; +gitinfo-34049={run="1n8mm4g7bmiawd7l7xhx9fcxv7z3l629bj21i6j9s0rfd6c7mzz2";doc="1ip59qxlqzrn8y211691cv4bg8d0yxkyvbpxw8xpzg99fpp3isqx";}; +gitinfo-lua-70117={run="1qn7f0fnbgawhm037x1lrc36mgmq43mlcsx9rb3nl9ga4jlk0mqg";doc="02my81hc89i32gsvxp9zfqs2gzbkjqn2cbijwjwa578p45cz6a4z";}; +gitinfo2-38913={run="0k3vw12yh13q1v21bz7i3m32s1w49pk13rg3c0d0l1pcx0wwz20i";doc="0586h9c1kp5cg7gk67xhy5fbshpskrmfb81m4xncaxg6ajaljk7n";}; +gitlog-38932={run="1v0zpfry2rz6xvm92gzhabc9sa157kylvp6jg298kdsbr2limn3k";doc="0pd1f42qmka0wh9b8m15nk69p6isqp74b5qkjg6ymwbabqxbcbl0";}; +gitstatus-64662={run="0kn4q6c6379qs34hmvzixvwkzhwbn3bnrn1pjwsp8lp66fv1wpv2";doc="192g75hfxg3nkaf0x8b142jzgmjzv97mpiravxfwpgfv25fayz0f";source="03kz49szcrpa6ij859a44ham0gbr1w2bd7z7p68vhwg2pcg8gq5r";}; +gitver-63920={run="10ji9cimi9plka0gk5f1yk9kybdfkld470x75204dnk82pcsad91";doc="0gywkwrlgv8wnj4y1qmwk4k09s06h56r7qvcnk194ix5srvbyr4b";}; +globalvals-49962={run="1kgzrymfd5lzvb9dqlb4cgxfszpzhvad859r7sl0dl282596apgl";doc="0c2qf5fqn4n8lhifvi4731r3vifwxp7h9sfd4c26d2nm1w42hv7d";}; +glosmathtools-55920={run="07s9jh24m9d9y01kk6z5lw9acri8g8vjmfw0mgdw3mwpffmba5mx";doc="1ya15q1nb7xzjxq7cgnl9q8pwfr1xbih6shd89krijr2l3rrycws";}; +gloss-15878={run="09d8r16dwl26a76a2gky152bafjip3r3hf41bxxcb60sjvnz2qva";doc="10vgsm0cvcbfxwi7ly38lsvvg139y6abmdsv91qxq3s1pn1qxg6d";}; +gloss-occitan-52593={doc="1q00j5r6d2y3gf8rbh7f7rdfjg3mg1c3rrfqd69rxyam9n92h41r";source="1cb92fpzv7cqqxxa0img0la6hrgxw6azb6j2rslszk9hjghbcjdg";}; +glossaries-68437={run="1d85ifx1q3cx9y1mx1qlv434l3858mk8xl6g8azh806258ks2lp5";doc="139jcnfcqqdsq5wvbj83dkrhjgs1fwslbgp16nfnkdnibv6p3rl7";source="1kly0q8gvlgr8fd933dyfkqribrpx51zaf10v0ii1d7s8rp4a07l";}; +glossaries-danish-35665={run="0qdyvkx33a9jgfa7y1pbm1lg5v1ba4xrxxg0hyfqi0pmpkajqb87";doc="0gvpcl8881g9xfcxhpa3h3c5zc3467ak8mhmr4szgjrsi4nsrnv6";source="1823i0b0firwzz9038wag2qg2h39az1xsj8484w36kbij8q7ygld";}; +glossaries-dutch-35685={run="1ipxgp919h2jh5jajq72dwaf6v5qi7xjplcihjy8j88zakd9iacs";doc="10k1xh64rzgcddzaz7qawb2qd353j79xn3754byhn4d1kz6nihxw";source="0g2kfnxmnnqz8y095b125d7ira54s5dpb5shfqld7m52cranscy8";}; +glossaries-english-35665={run="15nm7bz90ijx674p16d596jssi5915iy43wc1qb6gbbk4s8y9h3c";doc="1dckvl8g0visp5j8ip9kvmis7qw1n81xpjw136bnbm28y7a5m4sn";source="0x2iw6g9a6dzw22p05n3v7vbif8svhnw9sjqfmxn020jqnajza0d";}; +glossaries-estonian-49928={run="1p2d21rx6vs8gcsalbf5kjyhmz71gbbn10c4j4lsy7rqcb97zi99";doc="0q8rsf08snd2p4nkfz2ry7rmsbdpixgn14n1mk4wkjclrbnjszgs";source="15xi0xl53jxfqsz7dwbmcrnlshvs2zbdq38v3izlyz47aaf6ajdx";}; +glossaries-extra-68409={run="1k23qj3hmimg9yc25chxlg2bkznb730c897ly9hy9bm1cvwgbfwc";doc="0fx3jqn01nxn6slb78ilwkgwn2na2snihynjmirp4r17xx858dqp";source="1gg4341smvw2qd6wglywpaa7kziz92mj2x9vwmz28h6pnsvr0x7f";}; +glossaries-finnish-54080={run="18la9s6gblpqdqa1vcvsddzfxadssnd1mrg6iwl4aarq57605cql";doc="0zjwasnxi1fzc3xq8xjmgyrfcxpf3sbfgh6nzz60zdxd8sz1wvfz";source="0jfvjka4i94vh88jfpyysm6r1q9wwg7q29s5ik8d3da9g3n1bhyj";}; +glossaries-french-42873={run="03i8xx80d740c5yv3i83zbxpm9kckzj2kbdsakxa3sp9b0j0jk0b";doc="1k5gkdj5madigzvs138r360nrg6d3fn145xf8g708bk43r92100r";source="0fhi17x6kk73mismll255b9nsr8hm147zd0n3rcndbih9ray6c6a";}; +glossaries-german-35665={run="0h30icsisgk45ghhmngda0nqsjzsm23hay0sxch00ix5qcd19s27";doc="0jmkcq9h2kfjzfwysfps7nqjl7f0zmh5s60ww9kll8ypdd4a1n0s";source="085xarcnj5cvkljz70m27c7390jpj8kwndpyb762pr26dxvgspqh";}; +glossaries-irish-35665={run="0xyijjl1mffhmwlx7b7rprzl4rvhb2h8jdsx2jq86qg5gxd6c4r6";doc="0kic0jhmwiik3y2gipncii6j4348qkxbvkzs3sp9678xjl6j5zl8";source="12qdj6wfgrw6j4vdlkv0bcknnamb09vsyxdmyd094hwgi4cs7wi1";}; +glossaries-italian-35665={run="1dwvjb91jn93jbvh0idvn3nxm6s7frxyvc5a7yszyisfbaxx917v";doc="0sb6kzw87nh2vznwhky087017c6338jhqahgh4ljmzan9h3imk84";source="0hj3wdzdrjv9aciqgj68ihaalvarimi85vff0hf6isnmja5pwg28";}; +glossaries-magyar-35665={run="0y1540a4f531mc8fqpxv50d25a78waipkhhjvgnilbh7p1l3cf04";doc="1sgndhgxlbhfjg22hpqazyd4zrqmkiahjfwhhwv1nk4dnn1rflcp";source="08m0srsv9nspqfzab0g276rimzw64hg9i6dddi7fy9pc55iikfky";}; +glossaries-norsk-67141={run="1qa56xzfnhbb9m5aaz2sxqqj21dbsdmm6yhkskdb45j5ac8b0nyc";doc="15z45ib96inz7y68rfghas87zbjw9g2mv9r4a63xkf371d4g6xsy";source="1jgwc8x3xia56g5xqplasjr2c1cll1fdizfhzszrz1fc1jfjvyzw";}; +glossaries-nynorsk-67201={run="19di0liyrqgi4vb0aiw3p507klaszwbdmsxjh09snp7jyri2rd43";doc="18l362siz2p65qhb2vfgqdnczqwcgcd33qq8c0c1h3vqmsmcjfvb";source="1diq7h06jw2s26jrbb44amniqyipdndzidf2z122xyc9cgcwzcwm";}; +glossaries-polish-35665={run="1pm5c1i0zfzj32p75cj014n2kdlfhfp6zlh09y5y8a7cfdsbcjdj";doc="1r0igixgkwcp7h3aslj7kmchxz32qp09vdan6w2garkgj1nspnv8";source="0zg3pfjg03kcrqm4b3s2bb9z3jhlga85hzd1n83pbrvf7fph4ld2";}; +glossaries-portuges-36064={run="1gjadmklh6lsx5drjqgph31z3x0g4xy11g074hm4y2zgziidkbyd";doc="1cbzpx932chvxrf4myhy6bg4jrj05nkr2l2g893k6k7xgm2i1m7y";source="0cz40x5s9whyr7r7w8gmw9gm119xmbb1qkhz19zfijg6nnq2yig2";}; +glossaries-serbian-35665={run="1nbpnq50kki9i2i2dlj2x9ldy6g0in0mz54ii107m8fc66g90vi8";doc="1cx33aqm3qcj94rl6n71wm0sq2kc29r1wny3bwwpqg5mp3bw2g8g";source="1vgihxf778vvf86rka345qmnbv5s2ma1b5h47s2f15x8bjx4xy9r";}; +glossaries-slovene-51211={run="0i74cn88m4llskd371z5xakw0s1gdgfmc01i55xqmc3j1n5cayh6";doc="1bfw6dnj6vcz0v6i8dhy2ffd6vbjqihqshkzhnwrrc858rzgahiv";source="02c4gvv1qvhbznxlxff6kx976whcv80c15k2jxsgd6bira50414r";}; +glossaries-spanish-35665={run="1wg894gdkqkm2mpzixgpnsd5hzbvvviba7izbshiihhldsijs60d";doc="0zkfg3zk204q8a4xj00ibixqi0j3ll4531vrbavafm8b9qjl93xr";source="01hnx7zkqlb4r549252y3nsqrj8ywi30ci27r5n1p846jv366lxc";}; +glyphlist-54074={run="12nmmyh77vr2622lzi11nm1z1k2bxs7jz018yl4rwjlpg0sxg1ja";}; +gmdoc-21292={run="07hf9413bmj1iv1g13wnngfb07fjb11162pz1769dz5si4av5nmm";doc="1p3zpf3rmmmvaam534vyw2n8r3klfxlk36jk19pk5akqwxwv754r";}; +gmdoc-enhance-15878={run="15c1bah1lxa4ap43287qm24nmcml5g8a62plq0wsdhbd07w51h34";doc="1fy3y1f53frsv09vz74n7v8gv1wscga6h4di9wfspwan1x3kdp76";source="067ind9qmah7w93bhwg9vfj8nyps60gsvbxmx7qhkr6c1cxqa8wr";}; +gmiflink-15878={run="1b7gbvkhscb2p4yhcwd8mlh3fsvgfq8g6876s1brygnp9lsz7cxn";doc="189srmaykk4pmm3p65p0i00ycisr2bdvb51r6ddn4rjbliv6i9gd";}; +gmp-21691={run="1c98y5fhnq5w9b6kkpnrag364269s90kccgbqwr33bn9ixhsf0dq";doc="0wir24czbym76b9fcbzd29m0749lbh26n44yfl48k5pxy6pkqjcb";source="1qg01aaf4s939ixzl7wdariaxxg1d5z4s76cz50rpw0p7rgdqbay";}; +gmutils-24287={run="1yf7r1bqv7kid7v65bv56w4an5nx22fhxzh67fh7r9y8msrz86lh";doc="1xplwkdjdcz76rmmmnv8zfp3fj104b1vag6rzrxj7ap9k8zzc40f";}; +gmverb-24288={run="1mqmi97imyr63ff0qyv797sipncqizbx9cvlg49wxnf3bjyk2ki2";doc="0r9sygczigi52piyk4zgw807zjr0jl4babj3qmnnsg0qclhvaqnq";}; +gmverse-29803={run="06v5fxz15byps13vm1afrpx365nfmq57200gspqpdch2sji2n4k2";doc="1f8hccasv9f1wbjn7cjkwa2z9rwn8lwkv657i8n533ccjk6s5xvy";}; +gnu-freefont-68624={run="1gq5dcbc92cxvlqddspc9m8v5biyafgvjc1k7fy8z31vll6wnfzi";doc="0czpqlipbwnqsh5hp6yaq4ypqzipm0xfsvrfc36pri0d2hb77clb";source="1cmd2p7krwhkg1f8xf0y4z2ik9g0pjc0qgi3c5van9zva0bn84k2";}; +gnuplottex-54758={run="1ck4r4inr8ac82p0r8062z3hwf9187sv43ym9586sk3ip6kqb3yj";doc="198g23i6k5f353w2aa9f9cw6cj8b4f93nsk7iq2hvhvk6ia876vx";source="0iz43zdvzfs7spc6zvgclyh0vjnzkwcixgk5mg2a3wrig8r4q6fq";}; +go-28628={run="0lqgz9r0vxjbq1nyg77zjfsglwbd44zdpwz56smalb6lp2ra3r5z";doc="1mf49wywa32chr8q4c0s4fdkmzd88a1fj3hxcf3zx7bnsi5r4gl9";source="0vslzmpj94qlh5g2jirwj8b4w93vx33j8xdadyc32s6b9rrdwnyl";}; +gobble-64967={run="0f4dk6xg7b5ij3w2za5mspv96xrlksyi8gy5h2ri29khb58cw5h2";doc="0a2rd4m38mgyfpjaf9na75w5cmn32lxbbqhqyfr145hf2nf08c1x";source="0k42x8ni36gq51aw55ywy36jl89brhsc0177kn56zpvv2zmghqiw";}; +gofonts-64358={run="1283jyz641bxsq6vxgaaa3hjrjw101p84nqv2jb7vixpd0yw6qwx";doc="1bq0db6xak2mj6m5q2z85f7j7iw29hh2ch4767lyi5s496csbysp";}; +gost-57616={run="0b495h3wwvwzn7dilj2am4h934y7b4fm3g3j85bb6i8fpqxbpikp";doc="1as0a9pc9bv0aya47ir77vlwv2hqaapl1ks70gslfqj57082whwa";source="07jn8ji4fa68mlq381lcmvk5qcamiczain2jlmpqcc9cfxd31s3z";}; +gothic-49869={run="0kgzx9qh17hcm33bx8r6wh3c9j6d8v0xs4fhi3w5vwmmlmyv9dni";doc="111pz7iz7zckzsdjaxz6p7chp98144727vh9b3y8v2yqfz06vzid";source="1r61rnird0n9iz9kg5ky4b602wmvsyg1y94h6az314ax7zdccm23";}; +gotoh-44764={run="1k3z1b1nyyk4jr2aj60d9p3fvx9ijpi21780wbbzmn5gydmivvm2";doc="0kcx815006v0azrn7vvbldplg7z4bgsibz921k20pdz2fqy88lnw";source="04frszj42vxnn5mf0mi5izwqw7mh57w0npp6n77kciyk84qjca7b";}; +grabbox-65223={run="1w9gmzwzy8dmk5rymwhn75rlciszk2wyx9yiiqn3npz872b55sf2";doc="1h4fzi0199gfzdsx3f4pz76q14lv90sgad8ixfixn4kq6zywg4cs";source="0sg5ahgxmm6vwa2ng0w8dmgxb4d3x14929i8apkm21bainhaxg4d";}; +gradient-text-65567={run="16ry27061szxa7krcpi739r57vj00ryv94ja3xa7j1dcvj6fn5sl";doc="1fdf06z2n7jcbj1rby47ylrxq516nwa4qa67iphxhdn5maf1d884";}; +gradientframe-21387={run="0c77ymahnfqix4h3i5q8fyzra5vr1fc2rygycwsz9zrf332ca5qw";doc="15lf5hlw760cqwqjf91wjzfbplp5npv586k967bpzm17pkmw6pqq";source="022x1whvyd9gqw2kj3m8pncn0m0c839bdwysw4sq5xx9nw6ixib2";}; +grading-scheme-62505={run="1cbprwzwz019nscz0j3j0cdxkrmkqs9r220qvfms1vfmjs1j9dg4";doc="1fc3i5h4xs40z3ndcipyjl7vz36vbaqd9zcw8nlvw746whf4g2lw";source="0kidqf4l7gy9qg1i01ghvb9rqm9ygjk0ii22sff3n1jpbc2vdvh2";}; +gradstudentresume-38832={run="1i3rbv9ixnr60yrjzbj31aaq758638k5xvlarkaqsjvacc3wx88f";doc="0nvih6lkbgc7jkkj303119fyxnajl4iha2baz2yhy62h4mq8lhd0";}; +grafcet-22509={run="0yz1f2p8dn3a1ws5skmznbd4ih9bri6r7vr6rx3zcspmad1fjg4d";doc="0inzw5cw5759c4l3ikzgn0zx47b0l575yjpz2613fh9l5ys800nl";}; +grant-56852={run="1whd5f3fc72balvgifnb37583v0882xq51qa0fbb92b0a0c71nid";doc="0zfz8gj8di6sx9k48zdn5hv5x2fj5rd8dm7x4h2k6xssrj4aw7bx";source="0pmg6kjzy6wahhz3lk742qzx8m5afz8lqsl05zpkcmi7ris9m9ah";}; +graph35-66772={run="1bjdw1kvds8iahl1chrzmzaxm5ad7bb5c99yyw3rd390pqbh8y92";doc="02kx45b2c9d3f0f5h8xw2mnqn1mrp7v8975y2gqx1ln2x61xmjpm";source="1lm6531f5s5j1l2fasz0fk0adask83b2w1plkqmk3zxrn4rcchw8";}; +graphbox-46360={run="1hvhadbpd988nvrlcppvv3bnm5lzmlnxgwmfp6r4mgsr1q7xgg6j";doc="1gls7j4753s16q6lgdsaa3yg8fc4vzxh74z7qr2ykz9b8ij0sdr5";source="0nfmfn7y1qqbm4yifqxfpxn9yw2xb9yj4smv9fmxrs57ism8d9dp";}; +graphics-66204={run="0cb099m8387zmn58aws7q6nn2wlxnz3hhghhlfn6aagwp1i064gy";doc="0q1b8gbssjvrga4nbjsxk8mplingbjs7x4385pa4bg2r29r09znl";source="11jmacik80m12vycw3yr8waszi280f6raiqcws4px4w6zan71qhz";}; +graphics-cfg-41448={run="09yifx2ww4jjjhl5k8b5vz78711289755mw0r1rcshk596qvn9r5";doc="0rfjgc83ryg3s5q01xnkk8bzw7rx7m96hfxq85xjjn5qxsgy8yqy";}; +graphics-def-64487={run="1jicdjf7bd30khgfkn6ilm7y7rnkqvms909wqj3ixc3mr3fz8j16";doc="0k6fapbyi9bidgwr67m4l2qfqyg0rjwnyznfi4fy9q9f6w61fmv6";}; +graphics-pln-68760={run="1z2vgvlf3xpxidfs0g4hmq990lpxvird2pc6a59l2cm1s9nvsz10";doc="0zjm566qqqk8blsdri7jxbhynlf98fk7w93fdxf5wvq4lzkwks38";}; +graphicscache-65318={run="0gmp7wldnc7l3768fs3wximhnc02ijlsajsfbg1iypihak6m2ym1";doc="006yyxyga6n3hissz8i8nmydwyin4ag00j9b3g7dg4263hl8yakw";source="1nk212cwla2y2dv6cysvk1vzk6kjyfgs03ngh3ry4gyz6ql844qi";}; +graphicx-psmin-56931={run="1sz53s8j6rn37xz1kkw0zr85625qki05zfvj6zpyw1yxay86r89w";doc="1fjg0pwh8qxk79mmrpgnwps50r8hvw6hqsjd2cp021wkqcyk5zb1";source="1rjl35jhy6dwja782xwh0qp3bxyw6ziha6fw5qbaq16jfy8hs95q";}; +graphicxbox-32630={run="1pl1x7n7yv7grkplpx7fflfi4cwzmkmh8nnd77i2n5wdlylyabxd";doc="0f1w22m5r1xz6n70yb1p21qq3fi2rfj9mdcyqq8s40km1i40yxkd";source="163isaz9zh1jr5wbhsw3ppicxsq4v92d6516dqgiwjhf6hdgay94";}; +graphicxpsd-57341={run="1fganh87hpkac141i4c8f5bw06sfhy3qs14blx466h1nmc6308az";doc="12d820bdrnlq0v6rzd72icvac73vq7b7sq2kq0nab05xsdi2418c";}; +graphpaper-63116={run="1bba2x75pd679qd6jcm5dd2br5d3gr7s3r8fwwid8mmq30vy72lg";doc="0a8l3wz3xrxnwp5s7gjr8qgmdbkrnwc0gki6i9xymvys385c6q87";source="1343djcm9sh6g5v8yfbrrwzg8x68rjgwpicq79md4f4gnsmz6lvv";}; +graphviz-31517={run="1gpl57lb4wkysxdhvqajzxjb4w0m5nxdxi841dzg0sg2igchfab6";doc="09aa9yl3zmcc5vlvjvgaxfmhj83qk4wgp4fx90bgn28kxnzhicxx";source="1w878b21va1y0mz08wr7mgdxl09hmbmxbzfnpv2mdqyy01lwpzks";}; +grayhints-49052={run="0p65f12y0v9s13gkmd0limdcsz36lnbf0975c4pxcsc42i8smvqk";doc="07qpkj60rrl1pc651qa8kpym3bzcc0qkfwaggcyin9a65a5snnhf";source="1g32xq2f1ncq124j2j8xm3vdkhv4sxynxc3wzx7x6s9i91p5l59y";}; +greek-fontenc-68877={run="1lsyx2g792b2m7rjlihqj26dkz9kaskbrbwzvkjd0x0rzvf9g3a8";doc="1qrn41ly963nnpwchs1s1l3mfsi49af1x0q9vk4zms4wcd9w34wh";}; +greek-inputenc-66634={run="0bg3frdqlja36j7l4y1m41nslqy7bisbyqyax581arrl9hv9p0yh";doc="02wghx50h2x7p9kl6j7kkg185jra9pijcjrf3bkx6c7d1spvszcv";}; +greekdates-15878={run="0g8cgyrw6lacr9cjig3q1g7rvjdwb0p40b41rsqg6lj6y7m25ya8";doc="1sh4dgxfn55gg9vp163qj9nd6kbp03cb3nkg3hqlf6b1az486nh5";source="0k8vyyxvi1i6kqnanfm1nfhbwllgn22ik57r2p357y69hfj3bs4f";}; +greektex-28327={run="1v39z550xynw4kkqjqcj7izj2cghkk1g2swsy9x9c71sz95r2bw6";doc="0g4m7sb6ppjj0nxgv7pwwvc5p07jdkablcqasdmj8p44ikg9vp59";}; +greektonoi-39419={run="1dhbslqclyk5d8a9v9s4af4gxdy39b35zbbr3k5m53gsd0kcs5w9";doc="0hmxx4pcirm2v5xpl3zyij8r1zm45f373dv18vxj4xr3sn6b7p14";}; +greenpoint-15878={run="0l27vvxzyiar7y1x1a3hk0sswfazi356wsbnx86dp8l766qcc3d6";doc="0zlrfv2y5ixhyqyr5hxycalg6bygvw1f6bfaxqdpakwiz7k3zabd";}; +gregoriotex-58331={run="1z3az5in2izkai2bf627zj5966ypv1z9z9510ynallfi5q6yah49";doc="15qh7jfz42bj450zngw556z57dzq99cfsna5008yymgqsyvy5jxl";source="0p6xm22hr6ka4jm9zrg4yifsc4125g22n4x9zjvmarbxixj04573";}; +grfext-53024={run="03ff5n3yc3fxrayhyapm9qhd665r15v57vri6ajb5xb4m18rkfqw";doc="1f5kvnnv604qllqim8qv40cfpx0xaxanigqnqwmjfwf0n44akcfp";source="0i5pkqrc4jm3cgwzyhw1r3kh6b0b7sb352bnzid7h8msiwx32y8k";}; +grffile-52756={run="02cmm9q14h87dv5h5ci7ny7v4plrry54mz15jddx1zkfx4myykww";doc="119xqz1n57mghhp7db19ffrv1cdk1fgpznlyrn3qgvg2926mx104";source="0pmg9140plqv27mp936ca0193ihggd243mmprj3l0d6rf5dajm8j";}; +grfpaste-17354={run="0y1zw0l245chmlgmi7cmg2yp7s30z8055wnrbm6f45aizcvgdya9";doc="152b029w1203lgfmxdmhq3nh9h2hcdx4xanklv59rih9ha5l8j5v";}; +grid-61719={run="17yxgnwlxi16vkhhy0mij2f07cib589305iz3kzf0gfha2x1fnxg";doc="0h3pfv1hilyn9c9mlqm9nbfd0l0s1n8w7hgaa6cab43y8n60z8gy";source="1ah419141p76qjl1q82l2v6i5z34mj19rvsbwldp8fawfkl093k1";}; +grid-system-32981={run="11l07viwfi88i7c05yjb39wxzdgvg6xvxlcgbmqpvc4fbwmr45bi";doc="1a72i4af612w28wkbsvqvss5462ar8g27y83w2h7y65nqv42wi9d";}; +gridpapers-58723={run="1nshsbv4qf8vxsvrqidwr4rqny5lp0cxijx018bcskhh3xra7r6n";doc="0z3vns6jk1ihiqf12i46n8yhfyjmnkb4l5wyc18phbh9l6879b7q";source="1bnb38mgi6pzm6gvxf0k60z1dal3kgi2rjgwfrcg2h5vmb5rpdk0";}; +gridset-53762={run="1hg92rhf2jl3yp9y85pm0hrbc2a43ysxkhdakfv51a3bynd7ym51";doc="19aq6g6dnbmgz6a4pgxm2c2vbwc0m3hicg7qcbjpchahj8278w5y";source="1gmgaql1wyd6kbhhv0ssyhg5dz9jls0y895h7yg8pyjqg4d0i2rh";}; +gridslides-54512={run="1y5bngrqi46yii7807nw2y6vr7xavmbnk7x3bpfj5fjm8vpnw4aj";doc="0ringj34cl8lqdfa3qwfcq4jdfzsghw4haw7c9dq9acqnpc6sh3f";}; +grotesq-35859={run="0f3nmf0flj20xaxz8g73zp0qcm78yvqx1idyawrarpz3q7zdvqfq";doc="05fy8hg21wq7z2zfsbyjszamif7ixk8aj5bbjsjinyxzfkdack3m";}; +grundgesetze-58997={run="06zf794hhf5w79d3i5wh4lw97i0j98kfkrnn8nppy3p4yrij864b";doc="0rjb4lbc541w8lfy3504j40fvynq49dbaa7bpn7wk77k4m8f9nsr";source="0khbksa9yy82zqd71ls8gh9xcl0h12h7542bi10hwf7zp4nhqs7b";}; +gs1-59620={run="0j8hsdifd75wm4viqwxxk7s654bb7yxs5ccqwl0hxw7kxrxybxmr";doc="03yw4cfa1ixhf34ak42qjwnb1pbw1lzljxg371v1gcwbba9x9svb";source="1my4p6xgpghz0fqq1i5wmqx0nx27xn0vbpl4gbczwi1xnakmvv4v";}; +gsemthesis-56291={run="1y9wj43qpcgp82sfi5s7izyf284hzkn5py0v145jx03l2kxhv90c";doc="0fyadx4x8d64h75fq3xgmfxympcbfjhwwmwg4bpj20d3dbf0rh32";source="1i5w77zwb9c4qc90hxz7sna8g2c11mkf3vnkkm3scm6pkbg9z0av";}; +gsftopk-52851={run="0n6nnfn3fwi5dz9vdqk4mv97hwnyybj3wsv3bipqfsxl31yjp51j";doc="0xdb0h557sgi56gik24izsr5xlbmlfya1w93yih61a5422rv198c";}; +gtl-69297={run="07d5wf242l52y43ranq4l147755gl8r83429706yjj01a71mjlh9";doc="16qpbiy2q9bmnj545ni2pv0w63djsqyjba32irmhq61xc04fkym8";source="11nnmbgr3b9nww4w337320rjkyc6l007s97l3kh2m2xaw6danmdk";}; +gtrcrd-32484={run="095v007lhv0yyni3cqvc14iv9jqi0aqfmlr0zgxh45xfpqbsglnv";doc="1ivw62rpgfyxmlrzvjvmhf4hxfrlgskzq3qr0p6g48ilv3is7sb5";}; +gtrlib-largetrees-49062={run="0l0fqpw6sd1gg3da8s7wz324q5bdd9l80zxg835gfw0vvrn912im";doc="1mq4pbmsfvm4y7g4ar3a438469yy6x4ciksrns05dnkk54adyyj8";source="02x48sgx6vfwbdvgj0f5b9sc0kmkwcl6jyqzv0ascc77av9w41na";}; +gu-15878={run="0h37ilpkqlb6z4fdjldnbwpz2j15izz0wb70n4zmmp2162qqbjni";doc="1gx36ngw3mbbw9i2xdi2glx80xfvj6pv5frh6fmsqlnvhgni13nf";}; +gudea-57359={run="00565sv65b64h18cib0hbxh73ylg07lk7wxl9l9gvdczdz7a4xk6";doc="0rk9g6kcb8wjhf6is5wcbrr95hv7ahwl9xa9vqnfq6m1yy1bah13";}; +guide-to-latex-45712={doc="1wc5pclv27af2zr6kjjahjzxxlab31d8970jvxr9lxiqllvkxyab";}; +guitar-32258={run="1cjrmz39cpwj6kfq3r9868prd5bx0ppsxdydc7327247n4f270qg";doc="0gqck2vifa7r4wb9q63kw7mp8b33hza1jjyn3kighk2rrjbrg3ah";source="1pfcf4r1vwv80zc1p8fjvf8nqadiijsl8fjaxjanjgzl3zyy25i1";}; +guitarchordschemes-54512={run="0jhqamb3lmpzplvxwy7aydg6sv81b4xl81ss5q1nk66lxki714a1";doc="0939llps22ir6bfxqjcbr22kvb6qxid7dzfqjxigl86y8amvv7lf";}; +guitartabs-48102={run="1akm3sbrwnbg9mzlm98zpgh187w61g74zdyq6lb21w7bw30jkxbk";doc="1mrifbwkv0vh4cl1jg92v7006bh3rfrgy7gqpz0byd5nc0vfrm5n";}; +guitlogo-55741={run="1zjlfd49hkq9qc1l3g974wxzw200qyiy9vbiai0v9gs627hxckwj";doc="0awpik3x75rky5w6rk9zg3cy83dgxs2l57wfg8sq9h35zmni875w";source="1hi4rb31mc3820fafyhk2158y67b90xp5wl6xxd0b5fqz2z28qnj";}; +gustlib-54074={run="1kqlqxwlx12hyyhsxyn470rgpzg6xw25ix1v5j4sski6nwspvn9c";doc="13yx3bzmbm1b1p5rbjdfsdlwxdpzdhhmm2xd05hi79wdfxbbby7p";}; +gustprog-54074={doc="07qx4xvyqb4p0cx0macjgyg0pcxgcmdxmzfsx9ah5s0dqvminwrc";}; +gzt-70535={run="0z5n3ybgd2bwz3d0i6bl20bgyzjhfsfpl5b72y4g3mbap2d7yk41";doc="0jahxyvmgzzpxqr6lil6ll47biyipw402scn8agppqsyqrbjm3lz";source="0rkk1i5kx75gjrqsdrxljkv9bs7kc1wadl2kpr9krrmyz4wbq5l5";}; +h2020proposal-38428={run="1yz8bz4nmccv0v700zz7x11fjdqhs4hgkz8cd6bnqr3v0n8k4xrf";doc="0yd0iffrvahaci04bmnd20bszgshx28apsij1i35l1wjr1hlnfcz";}; +ha-prosper-59651={run="030zapbv83x0x1vh9px6klqnivygjhzi48fz40jb2cl17b38xnx1";doc="0i9714nqgv3ywxfybg3m9lcrng6v7ydxgfvxva7zpjpmsm3mjfvl";source="0ljl3szba1p1jj7fyw6qzm5h673d63hqwpsn1jzapk013rnxsfmp";}; +hackthefootline-46494={run="1l2iq2k1bil4l5nzxrfi4pg831kxn22ld7402y285hlhv7cj6qfc";doc="0w10yipva3ixyp91iy2y15n312gk5fw90960p3adla2w1p4qhs4c";}; +hacm-27671={run="05layzjb8ngwmqvg49abdi55j9gl1l74sm5baipm0yi0k1kr8xy0";doc="1d1znq8r384b4xpc9f81023asq6yrkbvyif70wjn7h64x1wpnnn0";}; +hagenberg-thesis-65819={run="1sz41ng6wpr0zk0bdhfp6iqnsis2bpnr4k27hw5c94384vxa1w9f";doc="0czc359n4h5v83idvvn7nzl7azzwcdndbinssdvh35ygy68v04jy";}; +halloweenmath-52602={run="0sfcggpqhai8xzpnbyz1vlvh7cfl3n2m7z0av4drd7wqzas0mcw2";doc="0k7qfv036aa691902chj1rgcf3z2xd58xfb2r0b5z80g6944xjrk";source="0ir0xr3aiyjiashy6jl39f401ccgx3dhlyiqx4h2myiwq45ay2ka";}; +hamnosys-61941={run="126amkwf4aapxk26n1h7vyv08hgyj6gac4sz6v76qilwpp6m6sga";doc="1n2bk2yp8c4bvqcjq0hahfs14zlrgrgj9jwvrp903c46zb83lfc0";source="1jxdiqbvbkmhv5p3fs3vl728wb6izfx9wbjqyylzxc9fr7b4qpmf";}; +handin-48255={run="0xcsmfa4jjhrl3xkglqwbgvi844q1f9zjgpyix5akx058qjvwl7g";doc="1k3ar5yzyndnfqkv3bhl7q8aczfbaaghv9mkhzpfri4za5ks6fnn";}; +handout-43962={run="1563x16fgw29vzw9bzjrc8maj1r8337p288y7v066qjaq886x3xz";doc="1y1wpkpjwhq7aya9b98ym4xsv15zavmv8k1i6q0vx302awi2r5yr";}; +handoutwithnotes-62140={run="1wxy2a01jvxhw1pna1bfljigabfw9i66m346n0yshhk6rf3zabgd";doc="0i1viv2wkn2afvkcm1z7vxz98aj2yyn63cilnhm5kzn7ngdrkxcj";source="1jiz406v43khg1p9kpaz96bwd7iscl078315xjfsirlbk33c4y2c";}; +hands-13293={run="0x0vdn7hq6k7wr7yxn8pnkvjhjq3mfl781ijrs2mpvjqygqffzag";}; +hang-43280={run="097qbqwbib8gj53qlydflff7sqp5ghcg5812hjnav9a0rgklpw8y";doc="19falj7rm7diwr24q5rpab3rp39awnyg0hdxfhhalkpdmjwqk2iy";}; +hanging-15878={run="0s86yaxyfv9zxf4svwg9s13by9vrw38apfg0hsfchsimsdd6gsbb";doc="086lzvx4g6bj04xdqnadmb8832klmq362k9lqh4pz7ym34mzh5c7";source="0wwfnkb66m7r77723kkkdp7yxkl789g310m5lhllwx33fbhm8vhj";}; +hanoi-25019={run="09a7cv76naxzdach5507wdqnjp12amvlia7kw0jh224ydmkzfx9x";}; +hanzibox-63062={run="0pww3xzi9r52cr0bggpw7wlddm6gzf5vs5xi7v03ynlpn45wz3x2";doc="0x18yvhnywhdl68jz4v5llkqqpiz1l48nv77g0x2x2svzwrxrw3w";source="0dblzzg2gkg1blx8rh3rs3jb5pq1qjcn9nq0n0rz7a7dph5f10j9";}; +happy4th-25020={doc="1x950scxbvcgwycpakflpklc775pknjab620g099dnsfrpb76f4a";}; +har2nat-54080={run="0zaqsnvg46pdf98gzlxa8l6z8v9l3fd7jmf60nbrfba7jrzpy1bh";doc="00n5qcljlpw2rq8x921vhsk7xvz8z43gxiq41qfzin696ysn7xj5";}; +haranoaji-68501={run="0lpghfxqr1kh4s6vk5zjqkzm4ryz47qa3dkrxfiyclv4crsqlf16";doc="0v31a7kz4bxp4ay7bh63w5hn53iljq62vkkq0nad7jf0cyhdm5sv";tlpkg="0s4wnm8lh0sbblz47j7q48rlndqxjiyn332061iadd5gh1x9ialh";}; +haranoaji-extra-68500={run="17j0nf9f0l2202d0b6yba9dbkwp7y97kxh4lnv4chvx7f07l5grr";doc="14w5x12q0d4z5h0skp4lvicwrcksl9wfc8lrsv8lc3dmhijv0f48";}; +hardwrap-21396={run="1kwsns5vg5pkplcl5nhmvpm2ccdv0f9431qxjxq1k6zfsknpy60v";doc="0h1n80c9l34isgyzl36hf4nigxcsykfgqv6i9jjdf6dqpp23bpw9";source="0hiqsj0vpfkmi8z048ymlnxrxaam8raq2f48wlyk67x4w2gv72k8";}; +harmony-15878={run="11vh6dy95n049bfr46yyb6a5ziawmh3n8dr8l7cqhj4pqmkpgad8";doc="00kf7kbrfr2cqv7izx1v90mpa81ncsn0r9jkxkhz8df8fsizaigl";}; +harnon-cv-26543={run="125885fg7frl37pmxxj51i7d22xydj5wsva9i27126903y3qdm8m";doc="07i4qv95fcfnlfj18qljwbkv1cm5r00mzmq570ra3bgjc301gk9a";}; +harpoon-21327={run="18p0xqjxix4ka9a9ja513il0wrpqrqh8v9v13cc89kh8qfjlf9m7";doc="0l2y9l8wn55dg06fbxjnv16bkhgbg9rpfclawfh4p7m2cf2h1k44";}; +harvard-15878={run="0jpxqyrw9skg7jpw2d46f8nrh7jaa3r9lviv848nfnn6h35vs61n";doc="10vxj1cna040i520wj7c0flbk0d4hr22jyxqrv88616xqqkg3b6g";source="1j754jjwdil45pr032xjmwhf1i2phspv2swnjbyxgnssl6i370r7";}; +harveyballs-32003={run="0d3wc82qamnc2pivkr23njai42vbn7xip2rlsj4kc8p75zh9da3h";doc="1792wp7zx6a9f19lplca1b7pdyf8zjvqndl26s84sfv3w4fmbr8z";}; +harvmac-15878={run="1ky0vc92z3i7l64hkdm4jrlaz3acna747lfd2w3b0ybdsz8514wl";doc="19sfcgshwcvn4z3cih6ha2kgdbb5282zgf244678rl1gkmqjblj3";}; +hatching-23818={run="11sdpa2fbxqz8diiwyjvx5fwfycby0rdav6941pgfbzsbqd3ys62";doc="1fq1wkq7q5f8jbhx7p49jnpnfprb4z2wmawyjbvcnrnmr8jbrdny";}; +hausarbeit-jura-56070={run="09nf6pz7xqhzs0n7nafmmkpsy5ksvqvnwha80yv6rxasnazd940b";doc="1na417f6avcar3dmgk5wrggj99mpskc1j7fj4qkh33rii7yw6f4g";source="05f4qr5cz06k7hnjranx6sbqniv4h77dy0rrm6bg4dd6hrk474q6";}; +havannah-36348={run="0zdbwl36d8a374yhaqfb4f3561ncch10v0vh7nxj22f267lgl2n3";doc="1pkkslz2f66j606j44rq32dp9qhfqcr959wrp8j9xgkw76i9lprh";source="0gyndaw2g2j2j22njn32839mihqx3pl7sij35vhsyahyamnipk2h";}; +hc-15878={run="04qricj1nmmmhxwsam901cr43h96ymc7qdb1m52byniv51i8g0yn";doc="06q64drrpgm7lzp45hrl33cs2dj4mx1mjpsd3paqgsn2xxqls2yj";source="0knqx9smbx7lyr1r6vn50x3x9zldv14gb3484jqk28jvm92njnij";}; +he-she-41359={run="1rr8pdpizasdcb1sfg74nsqs67xh2lcwd8w2rjaf719bpx9372yb";doc="1lmahrp33iv7bbnkbiwpkagy3rm7j0wric7m1fbzdvkgkzv274na";}; +hebrew-fonts-68038={run="0024bhlbj59gq22gafanns4gi8mii8fcd6xkwaa85czgm5yqmazc";doc="1kv46s1x86gs2b7h9934hqlpp4siidnarb1shj427vijfg68asnp";source="1m4kd4r1i3sj4x0liyrpxckdp4v6xvy79xwmkf3glzrmzq79vdz3";}; +hecthese-68584={run="121l6nj57aivlyw2gzmyqyi90ql3bsrdjw0qa6gy7i7ifhw81s8v";doc="10pl8k15r835rac4ihng85ayp2k4w7idlf3ss1ywb3appayf8r9g";source="1cnnif8c2n34hlpm26bpdvbrvzil09rdfbqcyn5nbfxd66k83vah";}; +helmholtz-ellis-ji-notation-55213={run="19szfdy3r6i0ayfr4qjv99dy6h97pqcfr08xhy3v9kzqm4d2b5nb";doc="15d4dil3r44v5xds0n1lnqml7cyncpyr92prb56rfaav669hflbr";source="01zdhy1p6idpksjh1ak1lyw9j536bzr130bjgay471k9d76n38dr";}; +helvetic-61719={run="0c3f1ly7y6404z0akbfbbfql13sz717v0n0g69qjpr69hi4n0nsl";}; +hep-15878={run="016jjvmmc679sk23dy0g09a0s0n176a5pyq18snvi9xajh2c4xw5";doc="0czpwbhpgpbij9b97dlb3qq0aa9vyh12p81sdm0hwkj3i16yawav";}; +hep-acronym-67632={run="1y2s0fmrm4z5laq55xyhs1h85pjk48y92g0rzl1hmrdhqk6l0ikg";doc="0mbhbyv9bbm0k856nbi6f46fn5a7z2s2ixq435gvka8r713ns5s8";source="1nqv1qvqrxz6fd5lxrfsmxmgkkz005hymxk8s3xdwhla982nx56c";}; +hep-bibliography-67632={run="1qqidgnyi30zgmcfp0jj361l5sga8ds1b9wqhxad3hfzysa8bacx";doc="1x1bgw7sqgnlqzqxx2zbvcxdpl304vbn8wx26rdjf389r0rw3yzy";source="14wng879zmwzmacx2w8m2v1l4ha169xaaalmzmwc0lbj5rxhy44v";}; +hep-float-67632={run="1fv5bga9nf341iij2s8llh6rwvxf85h8hnilhlk0jc5s105whj1i";doc="0y69ymqj9lxwr4v3lxsvz17lms045k2wdvc9dszvlrjg2q3ac81y";source="1xmfqk8q0q0xmwsc4hgmvvajij88vszqimcfw0ddf7bylxchxjjs";}; +hep-font-67632={run="0z92gscinj92pypc6hnvdlyd0n1hdkh1kbnlgliv6cv2swyddmv8";doc="18nn2rxq07xxv14ds95q5rwlqfskd6gl96gya02s4fi2lz6ys55b";source="1fzx346kva3lxk4hx9pkxnj7j7jmx287gylpddb2pdpwkkc8spci";}; +hep-graphic-67641={run="0dwnbl9xm12v3hdpki7nzbq53l29rhy762rxbxvq7hjbjdm5zni0";doc="13f1g76vqqm5c3ivdy41gix2bzmd6z73bqlj9cyij15jzwix9dan";source="0y9d01kwnnlgx0cbr4ifi97la7cz56l30z65spbq2ilm4xlx7yqp";}; +hep-math-67632={run="155by362r43igwgyyq6fqd4j0r3qs12fx3gfrlcdpqlxnjg9j20j";doc="0xhkrd51y4br7qsldynnfhvy38ilngb3l022hpddid9yg5s49k5s";source="1zdrlvia3yyibmbypz519bx764jy62f7sia9qk6pb0wvwxbqmc0c";}; +hep-math-font-67632={run="096y39y8fkqhd7p43kv8fairn6q85bapca1ir8v2mvspr9h2c752";doc="12inm8vwlwnwzr6hngjpixzf6b2ckcy5l4a9dgqgvrh543vwvzjr";source="0p3365139k77y4kmwg09x67n67vyfzzvy43s1jn8yda91xnn02sv";}; +hep-paper-67632={run="1zgyzl3pyb0ygfxgn6pb9wcg75iysxqbpr6awa57aiah0hmynmm9";doc="10fwbgz97cifhx1pr0li91h312ni0g130jg97d2vfpxrn2drq697";source="061dap6lcrbif2rlkk7206aha72h31af4ab6wif5xriz9bj11cjn";}; +hep-reference-67632={run="046vf4p8nn661w3ag3l0z55zv4nw42n2376b1ab2p6sb6sb7l86m";doc="0ahdg40hpb17lask2bswsc0qqh1fdalvjgc64scqb1ppfiq62sif";source="1z80z7sr8ipsc15rns83141m3rw01s0pmc3da8d2vl7ymf4v8wwn";}; +hep-text-67632={run="0kmjlzjq8qwhka31nyyvdgvycyb4nlxrdp1fnwf1kgarr656rpky";doc="1fsjsx0h1wws4z1vbhc4ynaznbf0lwxnw34i98n3cyqx805fg1dg";source="0wa27j0xyi76nagz2yh240yhghd72gq2b4078yvnfs1bkjf00127";}; +hep-title-67632={run="1mihii4ndrrk9wxvwh6kzg1dh55xfgcww26plsnn390yqqfan8fy";doc="0iranpsi295spbqpm8r9zv4gq3gn2231pjksp6qkmkwma9xl4af9";source="0ldf8yjqqxdkpyxxm51q40y5w2zhpwv19s0770nmazzchv7hs23y";}; +hepnames-35722={run="0almnyzzdf0q50r6qi7i6c4pp9aakyzdzj2jxkj1y0h5smi602ii";doc="144wikhsm6mm6f459r4paf0chas0crzvd2rylpynhsmkp9sk3fck";}; +hepparticles-35723={run="076w3wmdywai4pc02k8nk0qyc4vmvn9x6lvidmp4z6as0jir7ydh";doc="027pgn4i7n6b2zk8ikyqj4wlkkw1njq4qcfkmy0bgqz3al08zr0b";}; +hepthesis-46054={run="165n2pwn04vsln5xy6lkg61c1bp65zyqsd37fmmd3xs7yhv7xc2d";doc="1cql3rp42bb5c33sdfip69g9rd06107zg6wmsmzkv8c019xwg4y7";}; +hepunits-54758={run="11szf1jiralk8jdp45bzksgd76bxcf8xgdk707spbyqf6fzafrz9";doc="071xs04zgnw5ir33qzfn0wxxfsk75d9di0ssl394ksmrm14ny3vi";}; +here-16135={run="1l6xh4jl2nipnswdn78378vhr41ikj7qk07j7iaqkyigk5ndl0vx";doc="0i454862gik3jy1g3v21laf8qag2cadvapqz0mn68hl9ymly4b13";}; +hereapplies-68638={run="0h43apcwi4mdag2kpv9js9g8a6x83chskli7lxqzr8zqcwj97905";doc="08v044j2h3w5yyzh330q5bfsip55zx9s0ywpn2f0b8x3nd5vgk5w";}; +heria-69058={run="0kqvcx9b3bg661i3mqdjxf8m8wx5cz223ifdniwkclr6h7nwrx9x";doc="0rn3ng7c8jyg438yl8i4l2zl1cwf62izfyis889py9axz4kc4i66";source="0dwcnmnlh5xp6rlhhgc70p8p6saz59chh2k7w0hvnr2p7768hfdq";}; +heros-otf-64695={run="10q1g30vma4fnqyga8279hqy2aq5wq6fv8d8nw22i9mm8ms2wwga";doc="07k4k2rrkj4wx8i018jfccs4gf2pvx8grcmz88lmw52im9ga002q";}; +hershey-mp-64878={run="1mnqsqsc99by1r80b6y4rfb3kzb0r10jsfpfgy7yragr8rr9xzjj";doc="0xh4a41lfds3yrj1am613c4629kvgvd9dfdfzmss9li3j5pa6jwp";}; +heuristica-69649={run="0k2ii054dq1hh8xj3n28mn0lg54r3xxcyzq7s3g782c11dg9l5kg";doc="1ccivk54m07h744dzl2162x82bbvz0vjvrnbxmmvrc3sk26fh2s5";}; +hexboard-62102={run="1rbyaspfnvcms41rakzrchjrkggd0m5nshpzyhcf36gv6vxcz8ix";doc="18fmqz39xwns749klira00vlm779gxja0i8g0rrpy6f1pfch93by";source="0c6a9q1yj2dam3892m6105r737fn9ygiksd4fhmbmqpz9rxlm5zg";}; +hexgame-15878={run="0s68961p0dsaila2a3symqswvgdhh4ah08aphqjfs7licn50yy4d";doc="1bfrm8mz98l8nrxgnvp8q54pr09ixm81wy1ds1ww4syczpw7jypm";}; +hf-tikz-34733={run="13232m6hybqv16f6v0bmgiyfqdfj407mn0h4m9wgh9pzwy3g1rmz";doc="070h5rdgfffjs8sb2gaximsqjzby2vcf9ffvpljkd3jzc8rznlbm";source="1df36m347jl9640jig0qrk445s0gxyk6rl74i19xxv567bxh9n69";}; +hfbright-29349={run="0qwwr02q170q29rlq7fw61888k1pm867vgj70ijckivibl0j2snp";doc="19zdznha8bfwqfyrhq18ad7ri8nd240hjs9kslswg70xfrync877";}; +hfoldsty-29349={run="0ar4swzfczqafanfzhwyw7kx765w743r1davbypc7lglcxwjw5y4";doc="0f9gcdi8wqq5g3camccbdzfyjppyqbvvv0z10grazq463lv83jq7";source="1prpbq8833njsmqanxzf25136g46i2yb4bqpvlps52294pjh0l0s";}; +hfutexam-68829={run="0v74nqzv0v03rxkfk8iyvj93rnrjj3dmwj6kmbihnvc55qbn20xb";doc="1nq3c4r083hdhgi99n35p691b2djys238dylwva6zw9j80i6vvnz";}; +hfutthesis-64025={run="1wr9qa2zhx1py23q9r7wigiwy2ik4gicaqb30mc6m095flk5ms6i";doc="00fvnydr7bcyf9ij674whpgxizcn2fpwizqdnh0srxm03znw8cfi";}; +hhtensor-54080={run="13mx7mg5jqrlyxnx19n0rs2crpxx2gp6m7l41m6l2ig5vlgc0x1r";doc="0k5fg9ad5avnsg84xwlcbzffrzf6y8l8a2m0dqw3clg7zjmq4prp";source="1pay0c1z6avkb44h0iibfn6xskiglym0fckfqrdv0bablk3cghjn";}; +hideanswer-63852={run="18v4sis4yn8b1zwcvrjadj7qzjya52wljvxhajxsnl4pgslkjcqv";doc="1rr5sy7l21r4ffdcm7bmlcs1al5bn4gsy6p2ig92f921f21gar4y";}; +highlightlatex-58392={run="1pmhvjxp5038nnxd9bnk3s30wgzxvbzq6z8cfmvz0k8h1nzkc1a1";doc="0q4v0dvr50wd0qbk8xvn7bayyq00kj8b8wwyn6axia3mpjmr7a41";}; +highlightx-68756={run="0vrcvnr23qg3ma2wllqyy1xbl3j7ggril4ah27ilwgad1i6nwjci";doc="00a5y0xlcdrw1x2gkrhcr44dyrmc2gnd7gv34r3vig8pfbrgwdwr";}; +hindawi-latex-template-57757={doc="0q35drybrlcfcrhrd5691m66nd17b0m6hkcsqazpb1ck227zih61";}; +hindmadurai-57360={run="1z3590pi02n90hwsjmihxk957hcqgc3kry3cdwpwaci43hxcvp2m";doc="0zws4bzz6fkhxnpsjxj15wwnvbd6rhxqilabzzvm43lv0y21hvlx";}; +histogr-15878={run="11zbm3d05j6nrzwb3hpahli54lf06aly60arh4fi9k52qcbsylv3";doc="046gw7h51w5s8p3rh6kwwi22xxj8bspbh7anf2cdzg4w88dardl4";source="153lhmgh0n224xkg7dmcajj7bydnv21spihh371hj5a461d4h9k7";}; +historische-zeitschrift-42635={run="1zh8jhsmn4klaqn18zxbk3ajxvr99djavz4cww5wjm8lh5sv473g";doc="1gfymz7b2khfnn94qkd3dawb7ppqll9qg7nsx3qac8pqba539pv8";}; +hitec-15878={run="1rzv2baizqa6fj063knxhac39slaaxk5lbgpl6zwk60nbp1lxq3l";doc="1p6vcgy1l1avz05h6r7bqwr7hl3jrnyryl3vn1i0qad25jryf7qn";}; +hitex-66924={run="0agmnskf8hjvkjbkj5m05q30v020m5vaj5nqwj8cpnxzjhq1hf7v";doc="1d1mnnq733c8ihhb490inch97r71vwrvsj8n61dqmalj89yn2n84";}; +hithesis-64005={run="0j0fsblj5k3jpxqgjxh7abynjqiz09hgvywrvqi0b4vv2fm8ccpa";doc="0rf5bffmz4158yqa05l4vi08nf1cl115y0ff9rkvdzjn249n3mgv";source="0mix1q6wf5723c54dsc7xx7kcwi0qz1kvmzs9yfx39295cvg9hzh";}; +hitreport-58357={run="01xxw91175ffcix6s7ji2600j966dbm6zl8fbnfwabb1rvn39nq5";doc="1wpscl97hpc3s1s34bskz088ph3x83qq7m6qgjj0xa2hbm2g77ci";source="1hxcw8n5aa4jfpd8r8f3442diww9zhnywd6kbbqjs7928bb51vk4";}; +hitszbeamer-54381={run="0nw7ch41rjp0wz0k508x2kkg4yqfpy6yfcl7n3rb88ps8fiqd786";doc="15kkzvgn1n09i7nnfd9mll1l6xqwrbpc252k54gi791nc30acaip";source="1ysr0z079l5k61v5r77hy2r150did3a1a29k1xppxrjr5ry3f4nk";}; +hitszthesis-61073={run="0dr4ifga9v5w7kdx2iban28ajvw24b9ayzs9rqa3hkkir460hhhf";doc="1v839wq8vrswximiabnz3vzfirq7q34zzqvxxyi8791x1z7a4hph";source="1w1b1cml2k1fvvq00lrga4k5sbifycxf0g1hb33wm05wwz0wihaj";}; +hletter-30002={run="02v906vgbidc2s1mgz1k3666riwb27vsl7dp24rd8q2m167xjd29";doc="1x8q4jkrbw6ddkqqlaz6mxj4q105vjs8k8ifphvkvhawl9iikki3";}; +hlist-44983={run="0ac4n38nnimrs14k1s2yizbqvqky905qcv0kgs0aq043kkmpi0v4";doc="1fnqm6kxr79y6bpymafr2s3m8sx5mviys06hcs8sfn2gzagg88bl";}; +hmtrump-54512={run="13pq5h9pwnp8hynsc35ib8wzblh3y4gx2lmrrvd0big80wwsdhsm";doc="1bzgqgrjlpskqydqdj26lsn55pkznmbbiq0w4ybr9r0djdmqbn1a";}; +hobby-68137={run="0ndhwgldn1na83jzdk1ab03asbbp090a2czyxipm5s82zmfa7bm7";doc="1yz23fn3zdixc5xxprl0jrly8pqm1n0dzrv4032802l4bysxj7sy";source="1nmgzxkxsq78q35zf2xpzwp3lw7s3i2gya18y4xkdq78673s11pg";}; +hobete-27036={run="0825ng1xcpdmjihiffzjrvcvx2fqdz9mryq2bwffas22kf0zlx46";doc="0il6kl26r8wmm6jzii7gmr61af84bl9dn4szlnw34dgsdg0an5hh";}; +hobsub-52810={run="11j0fxsxmyd93px9j5fdarz1231nczdkfpf1qf33kcdpyb44jrs3";doc="0hdidvz42acsgy021c1dzlvshcmw6fz3pkqrwpk66qk2nnh30dal";}; +hologo-61719={run="1jhzw2bxl0nvspr0blkglm6zbmrab13fs601h54gnrhcw10mxqwi";doc="1af7406hbdvb2fb735i6y7wi4bhnq7x7sijf63zl0klpf9pii8l3";source="04d83z1pw6scg4cd1616ix291zi9dz5nnvw9xc8hd4lfxf15nx1c";}; +homework-70050={run="1iqf2x1sl8cd58174gr6ksj2p7nj1pw5478j5aaszwsc3lg5kbm8";doc="0bc5yqhd1qj0jn17ciz44xxihwkp7xh6qjjq133y7ijmik1blli6";}; +hook-pre-commit-pkg-41378={doc="0mikg4p9wxb28vgwh1acgdhwa2fqnc8rw3jg355d6s137m40awc6";}; +hopatch-65491={run="0r294p098z0qykrh9r4yxmc0w72mz1nmxqbv418pmbn15wgj031v";doc="0qxa6maigbzx7hc3nss3wmvcpyc9wvhq0pbzni7j0hqyzzsz3vv9";source="1kbk80432fpq30zgix8waxq87kjd2bpcv72idaly8yjbj4pa1l1x";}; +horoscop-56021={run="02kazmk5sa40x0a4zb30gk9lkky0ak825gczbr5z8wchwpy4i1ac";doc="0w9sgk2j1fzkcfzn76zpygrlyi9fnimp92mygsq2z6rpblzd1qyv";source="0c6zkcb2057y9x7mz4q3nwin8h8ax71yaam21m91gk6ad9k8l4ij";}; +hpsdiss-15878={run="1l7mbnhds4c6y1w5vylsx8j7b4syl2j785l3xzvk89nc5g6ck2qh";doc="1cxdd1340b1gkn915id7xcdac2zp79r1yi5g3wjwmj4kbn7z6sbp";source="1dar4y0ajqz93znww0fkf36li50b82hbxixi30hi8fm8y2hc3j2j";}; +href-ul-69359={run="1gf2kcqh60ilzkd2i1fc782db4nxqgrizz6h2p0i2lvc4qplj95i";doc="092gjbvcda2xacj0a3b8y6zlizkkyzqcbr6qfhdsqyds1sdrzpjj";source="06paqsz9is5ksj8lnny4d4g7z3wkfgv8lnyl3nzckj8ap0f80g34";}; +hrefhide-66189={run="1lbfx61xyvnm1r24h6vrp3pnmci4j5abxlaanhni19j8gvqkri3c";doc="1sf697hjryz1l82ag8h2kpxgmwa4fzmwb6ki1wsnl0y1qkl9m1k0";source="0p4vqr3cjnbdsrkv049jdd6yr54xz40lvgdyx6z2wf79k5fj4z1q";}; +hrlatex-18020={run="0klc0pb2b2dcixaqhgxinhy18rp0lwck7129zi5qnpygzfslpdws";doc="1dlxj4rv9gaxd6i4ns4zmhykhxwsacw6m3m2jmk2lkc3sw68hsyh";source="14cw35brx8mqv05zbgrvfmmjhxyryx7dmj8dk0fkimqbyvhvv9sj";}; +hu-berlin-bundle-67128={run="109hjfg6p3g54pz7n6i64ggqjmvjqzmjp6ipddji0mnhkhjfww6b";doc="1j2vjhk6rnsj86a59cd081vfcqnb93lz6szis05cs53k8pa7yh52";source="05x8cwvh5xkjjw069lpw7pbsnb5swvf9k2c6l2s1v0w1wrpwg7b9";}; +huawei-69871={run="129xaknawlcr97mfw5dz0ipy7hnhgifl6xkb0fcf558s7gbpaxpp";doc="0cy8wfqpbl4cryndsah2l6bp50l5qzgvgwh8fm3543q1v9s4z0rg";source="04k4an9bsf58jkwzwis4blc4dmphgqb9fg9mx5pj4hj8y5gaijhy";}; +huaz-64723={run="1vjfx3c2hdv2jzqz09v3ki59dlmgnw0ff6m394nq6gx0qqk7xl6m";doc="05xsh7jvy9y5v9vl25br8ixxbyfd754p0hihflrymkv97f1b0nlf";}; +huffman-67071={run="17pgzpbhah5m0gljhkqymv5lxpl5bxxgif9m7rnad20x4nmyzz68";doc="1r6a1i3j8s4843gdvii740dl5rbilgahcrs2xw1zcqpq8z4xbfnp";}; +hulipsum-56848={run="1wfcsaff7rja3n0151ddzbfl9b3gkfkwq0vp35zcrd80xsqlw935";doc="0994kin6fvbk4j9rp53vjp6ci050zxsf6z3qi7zdfxifd269fhx5";source="1a5mkkl36dk60baffj3an2sa382p39j2sdrgadczj5r9pm9q0am2";}; +hustthesis-42547={run="0c5akc97v3fh3skxpgmffywca8kyswmaypkyxdzwrqb1k2z4xknp";doc="1llsyhbgdz9k6swry84q539yjsvcxj6hgirqcw4vbvsdxxxsbyn1";source="0nqs1ifkhhzspdwg5nbqgpd2309aw9r65cav51vxpn2abss1q6a1";}; +hvarabic-59423={run="1cagm9zxkhrck5svckh7i0c3zx48vy0h6f2nhishm40g9q9r5qay";doc="06g6wmxqgfj9zz2ph7gwgndgkm2kzpd4ci7pkwl5qm41ik96l7a3";}; +hvextern-69651={run="03wma227maj0j0f38l03vnm9hvqavs70i17nczsi1bj9kyfbm7a7";doc="1qh92gavgygisd02hvbnp675mpv75mb3w98zhb67q37dy80v7s4c";}; +hvfloat-70400={run="1xs6y5cryvsqbwc1cv43lk5jslmi03xi4z24658w09yxbi99lzhq";doc="1ahmy559jzha5jack3h1hnafq27lp7zl5wsd67m9vj1gny7zcsqb";}; +hvindex-46051={run="1wk4q29iyqrk83kafwhah5gvvj2ywpnqzvnza6cwrkb85fd1q2i8";doc="0vcdmn3xc4cm3rkdkzi0qvqakgkc3hrgy8nycr5c8vcb6xaiw0gr";}; +hvlogos-69581={run="0g53pwri6xrqa4a1x277iqivhy7gsb2khj87b3r3vgxkbrpn5aqj";doc="17iph0xsl5snqp9xmnylwr3cp5z0f1f9bh6m91scw79p5nl6rlyb";}; +hvpygmentex-62405={run="1rnra0v65wmz8yqwfa6zqqswx0m7j54z6wpzvbrp2d5gx8azsdv8";doc="16r1sqsaw8ij5jxf0ygm2kgdhxpzsq5g61jhj9rq0zhpjma7fhdx";}; +hvqrurl-69723={run="0kyzp9m2spgzyz5swrrm8xizim2mbjpi8w8xax0c1llj34k1m7vp";doc="14939z9p5f3h54n0kn34p29fz2smbqdchxakqx7g52gf7gqmx25d";}; +hwemoji-65001={run="1vkflwxx8c0ckx7kz9mkh2qkpyxjjx9zmp940p9w93x4c09bs6l2";doc="0i18fcfbvyv4k578bn00w7ngk5lxp29n1j1i52vjwc4cp25lfgys";}; +hycolor-53584={run="1dfd149g2k8cq3lw95z6r4knyq1mgirdqnk9c4lmd7ip4rcs0vi5";doc="1pc12vbn1yak6l6c1fgpnj0s88fg94nagj4b95mvclad6b546g71";source="1f5jv91vsib5vk4byr0481a8j5pvbwmhfqz2qd14ck2vw8laz4ap";}; +hypdestopt-56253={run="1753c7vjx3smnhl1iylg4x0sdcqfg6gb0wdbwqmlass4qdn494w1";doc="07a2dpvvyj2r2691v8izjnqjksna1nm00za4sva1npcrhkc2qq1q";}; +hypdoc-68661={run="0xbsmzlj9hf5y349r4mvvnzc4k183fzr8lp1f07r1dc0nbff1qvq";doc="03bcsfydm4yzm1g9ijz1r2r0f5llc0i3pf318aa5rfy6j896nvvw";source="10yvzay1g3nk2kpv2l41vd2dqxqh5x03dd23xcpd4lk09rbddcpx";}; +hypdvips-53197={run="0ax6n7ki47jyzp5g8781c7rv54hwrl0fg7d1bwzbj9bmqi39df4v";doc="15vnypyl6g50d4mycz3s41h8ccpmknr0vh9bwacr6nxbzlyyykrk";}; +hyper-17357={run="12737gd2nmnalkgl4d2sh45r4d621zl6g2zcih98m7dw8qr38w2v";doc="0hzl3fzgmn6kyl6p4d98l9ycisfhb9v50a1m6n8q1k6jpvr10z9f";source="09m0kdcs4kqksqwxf29yq4l52kb2mj5pxkry010ibwqw64cs5p74";}; +hyperbar-48147={run="1bj0v54k85isn3p48vmiygcvd3n06r4mqcp75hf96mmp0wvmczg5";doc="0fmrz4hlzd8clxx150fk4zbkdgbnhg3b7ck10225b0n1lqgnlh0h";source="19x81f6bki5mnx1nblrl0ji663q0pzkacy5lbjsqyr7krdc33fyh";}; +hypernat-17358={run="09lnsw7ycwkk71fyjk8zwgzdjv8ff3k028q7hr27dqsiyg4hjg7a";doc="150ayv12ym9h68a09h1xakdfzccpix1pff9blkzjq6iz5imzzpr1";}; +hyperref-69523={run="05yj1g5g4dr53i1v95x95pk6q70p7nr92k4iqcm948km567q2ar4";doc="1kbcilml3wbw2rpmvn85hmr3wss907n0h521d20kgbjvpancg0p0";source="0vm5ma9xz5bi59g92dxwn7aahwdkcprx0kb346s3l15pw9qhm1i0";}; +hyperxmp-68251={run="1bgizrwr5wpr8qprjwyf9z3f8jw0m1sq8qzw886j6lwxlfg6fp9k";doc="0srwvld1grn4smw2pnr0fp2082vvz3x2bj4lycvx036991mmnr6h";source="10ll53lhsqz20cp80mvwy1z9qna1sswappy2ifz71m6v304a1q9v";}; +hyph-utf8-61719={run="14jj24fr6v74vj8wi2a9k9zk9vnrvmy1ni4zn24dl5fdfw75n5ik";doc="11n1blnx9i7q2dlhyhf1dxs2vnldc9r8f3k6diix0i1np8hpz05q";source="1cff5ijmpxc752n6cmpfzn1a10ihrkz7n9l55gz2k2q0a00m2ssh";}; +hyphen-afrikaans-58609={run="1kn57mzrbk0qhz69b1ysdqjv8xirsb40yz61jx146kqc4p1y96lf";}; +hyphen-ancientgreek-58652={run="0lhy1zrg27748mrx8yz5qxpxl3nl460l5l6impiz3lbrgnld487n";}; +hyphen-armenian-58652={run="02x9p12zc78w1x7k2kz019as42d5kn6gxfl4s72rd6dyrqii7bc1";source="0z666y580w1kpxssdanz67ykq257lf11a1mnp1jrn08zijvfrw9c";}; +hyphen-base-68321={run="1xganah7l607qg0hyridxx08sfjc8qakykbc0c97pad677mr4zw5";}; +hyphen-basque-58652={run="1dy9fgbh4i3d9ar8wazwjvhhwzyhbys68icz3zjvk7gk9nvbm9aj";source="1yhsbzf1g9dm70jfixsz51hsfvn26cwfkfxvhg7xv2piynr4v51l";}; +hyphen-belarusian-58652={run="1n5md9kf7iiwqm236bkdsl4fb4vd6a03b6q1arvfa4l4yh8jvr13";}; +hyphen-bulgarian-58685={run="19h61n6ip8ja8kn8p1fb79lfv15pfzdhhzih0hg15cp1891nzlql";}; +hyphen-catalan-58609={run="1aqn66448bbiycmjyhbxikr4l5pvjvl5vm8gpzjinngiw82v9j98";}; +hyphen-chinese-58652={run="08sbasjp9b4wl15zmx0diayqfa9i7pf65nnsa98lbc9rpyydvhn3";}; +hyphen-churchslavonic-58609={run="0yh63znzx0bqqqr6x70c7laikxx82ph85jw48i0jh9ziv0n5gq8s";}; +hyphen-coptic-58652={run="1ry5srs6qr7z1xj1km0jsc3z278iylrfq79ji31kxmf1qs7rwpnd";}; +hyphen-croatian-58652={run="0fqwf7val8hfdcqww828cfq3706wi0w0ypmvwkkllsx1nv2mqiia";}; +hyphen-czech-58609={run="050b4vmp8n9nwqzagpw7mq1ciin9rwgdicmbk1ajl9gvci7q1q8b";}; +hyphen-danish-58652={run="142jxvssj44xh1p8d0b298l0ri33blvac5syvqgx71cvsbwpc6lb";}; +hyphen-dutch-58609={run="1hxwpb67c2hzzfk6jchhzbj2mfxzywz4zqm3z1hz9r2ywahram59";}; +hyphen-english-58609={run="13h2gli0pfjg797i4i86dihmnrpp52fjr1apj71fgjiq2453zsdq";}; +hyphen-esperanto-58652={run="1vfrf4wby1gmw5gm8h4qkyqa3hsx00nwj2qs05m1kn119k0sg70m";}; +hyphen-estonian-58652={run="1x8by00sb45acj1rkd5az408i0i2wjdabd992p4d599sf8b9dk05";}; +hyphen-ethiopic-58652={run="08dyf72ygqh24h15na2ssl2f4w9jlffh4vhy6lvrw2y6kss1xr8r";source="0j55k0sh4dc53wbngadz4wy86k046bsi4l5a329044hk24v4ydm0";}; +hyphen-finnish-58652={run="06c9r6dfihycr4vb4bvnf08d3p94h5n5g0ayjpha6gl08ab6wmv6";}; +hyphen-french-58652={run="0j41s8jl6449lys7zvjy9psynxlxlbcf23qh9sxf81rk5srzwkdq";}; +hyphen-friulan-58652={run="102sxp8901hln47nj7wng556bmrn0hqsljlf0v0ll8lsngf85h33";}; +hyphen-galician-58652={run="1l0z14m9j9w1c9kkm61r1s4q9fvbblhdbrqhg8gcddfh0b85qllq";source="1979y5x7b1x8j9v4ifc7k24zb6pxd00z0c6j9knndcaj428mf135";}; +hyphen-georgian-58652={run="1ja7skdhwwdy3idgjf508dbhbpyl3a7cj9mx8x1rswywy924liqf";}; +hyphen-german-59807={run="12x6z459lmns56s7h15lhz0fvz4dw1v51l1a4akynlbs3wh1adiv";}; +hyphen-greek-58652={run="0yknyhys5j5d34hlzw5wqdm1gw74p6bvx4dfx5kylvwjahj6ys5x";doc="16ikyzvd161hn95mi1swg0a390liwz1cq9534i5nvzh1vkyy4wrx";}; +hyphen-hungarian-58652={run="0d0bg0h78ij9b9anmdlwrlddd1xg09c2k5ganwnydbpj81c4z425";doc="1r10gjxyk8bkqjiiz7pij7zy4cvspvhnimkszl2sv0zgrkgayw68";}; +hyphen-icelandic-58652={run="00lnbm193g0zv7c1m47yz90gik1bd80718y8cmz5jhxz9ny1l271";}; +hyphen-indic-58652={run="02xnj4lrkvy7gs4vlnsvili90p6p6byh659mzci1ad4x36z4362k";}; +hyphen-indonesian-58609={run="047j1835ny6l0ris6j5haw41m9id38r854mx384kfm48sa70bs9x";}; +hyphen-interlingua-58609={run="1gc3c86zbjv6j1kw353xwhzrqrmq41rbw2ah1xrl7rxvksmzmsnr";}; +hyphen-irish-58609={run="0kaf1as4jrs8kc7rr2jg3cjkxr0x4fxn88gqjxdjdac6xhlvg0w1";}; +hyphen-italian-58652={run="0xxlpfvcy4frkvxjgx85nz86z0n9cwhgsdfmhgzi66w8c9c2r9fs";}; +hyphen-kurmanji-58652={run="164q51fkcfslh1vdz19ilwjbrs0v96a4pn45d6n0cvv9vw6gi791";}; +hyphen-latin-58652={run="0l7lsp9igylrk4cvjff8lx8jk5biisss3wkcil26cca4hb1612aj";}; +hyphen-latvian-58652={run="1p5kaf7pb5qxj6h3bglgnsqx9rys35i02piswwvayf4bdmv9sqx7";}; +hyphen-lithuanian-58652={run="09a4636b77fc2rmgc2b4jxl174bjc4ji69xply0yls4b69727i1x";}; +hyphen-macedonian-58652={run="006fg0snc4h98fzdzwdhk6ibhyrvqhs502wn2c1dnizlry05fdv6";}; +hyphen-mongolian-58652={run="1mdgs6gcvzly6y2i5rlxajk2qxjac0m91ayqb079mz8yxwvmq6xp";}; +hyphen-norwegian-58609={run="1sp47h5syhcb12nik26iy6xs5dyxrj5a53vzr0scbc0s746qi4gw";}; +hyphen-occitan-58652={run="0v0yivzx0xl48isjlnxfzvlrx9gslg6srids1aywfqmybffmfw95";}; +hyphen-piedmontese-58652={run="04sva2d6dxaick0j30izd7z71vpw8q7xx0xvihcvcgb62gb5bc7a";}; +hyphen-polish-58609={run="121aayyqidlz8kprwkb4ydzqakw1m7a5ysz9zvw7clb65z5yd69i";}; +hyphen-portuguese-58609={run="06dxp3qddbh26wv1wpwml41vpbm4y6386vgd4xn2107shhbvhqpy";}; +hyphen-romanian-58652={run="1720vcpvmm086k0ndlbp0rkzmz7f7mnmb4wn67jm53357iamkchr";}; +hyphen-romansh-58652={run="0dxcw56bkl7ddqj9fahmghwsdkmi7ncr5j319hgcgnlbp1717rkc";}; +hyphen-russian-58609={run="0vlnw1xn92ncl31yh6i7k386n0hp6vx90lgb1kxs0a3zrxcds0wa";}; +hyphen-sanskrit-58652={run="1svx84qj9vr2s6pyxn8zz587ph37g615hi3g1m4q6glw9hgzsmkr";doc="1k6vsa9xakzwmjma4f2vm685cyb28rjjj5qmpb7l0fpqpmvndp1d";}; +hyphen-serbian-58609={run="1v0v281ws9dyivqd1nrb5ms106vlvmsrvka5jmnzl1wnpw34z92c";}; +hyphen-slovak-58609={run="1vn6i784fdz35dcbxdcv85886mbg8vbjvx0w6sx230gjjxs1s571";}; +hyphen-slovenian-58652={run="0fyzw8r6v07p04m44ky3n4vkkq1dmfkl58xyx65pcpj9399bdjy3";}; +hyphen-spanish-58652={run="17gq675kb397kqd87qg4x03wj2b5zkjy8ynzpq2h1flh1lf2zfwp";doc="13kmgf0lwxm54gs39lm8vgg2hhajvqwviql1chhv2l7d66mxrcrm";source="05r3c2m5xfs6yl52ms6kc95v3x82zbs4py9ip6xznshfs5xakb85";}; +hyphen-swedish-58652={run="19rdzs7w80gf7q2xdkp1z2zc2hgq7mklfkrfdwzch2i50zzfxy6l";}; +hyphen-thai-58652={run="0k35mjibmsrahiv71dbl82r9v978gwkm42xjnp3zb4kgc0h79kc8";}; +hyphen-turkish-58652={run="0zqizvrri9r9bldqds768bslyipqrs06hx96b0nn9k6wm1y8pvsf";source="0rjwv5b0jwnwhlp6ifzd6p8iid59zylp2wbfk5crfjnknrl48qn9";}; +hyphen-turkmen-58652={run="17bhr58r8sl4fw8w3gqsb8lvpw48vdijr16bdk7n6ma0183vd1bv";source="1wlqx8wb0wsqhdv823brc3i8w1vf4m4bkb2vg917j5dq8p8p71aw";}; +hyphen-ukrainian-58652={run="1jpi7argypmrx4yvc23dx777r157c7kxgwpsix7cjjihakmx1s6k";}; +hyphen-uppersorbian-58609={run="0rvb1k16rs9hvb9xgf3yv79mh2gkndvk85blmjjsq49awwgkd8y5";}; +hyphen-welsh-58652={run="1klj6ir4b918cx96jd772ps9fl2fljh8kwkakdwaqqi8szzr65d5";}; +hyphenat-15878={run="0ckfvjxdv4rb8156x2vmwl15mk9057i2lyg9xhqkmvqh1ani4lc4";doc="1lzpdz05dw5m8ljxf5f846m1x4nv5yrqbg3sixf7dgyhsmpfxnls";source="1ddwv26nfl4jwz8vxs4fwc9qw8gds1sg275g2bg9ci8dfflk16k7";}; +hyphenex-57387={run="08f915yqpx6qhc2dzbicbv9cijzpgcl4jpifydqcc0x68y51qrzi";source="0lqn354bskaa6g0bn9g1r3lbb1hj9si5n1ki38awayzp1yj8a3q0";}; +hyplain-15878={run="1kpaxdya6m7x4dmrxqzrs6k6agxsg8lcg5yqqdlips887lf609cl";doc="1q5dh42gpv4n9ps0yqyhcscjn47qz4zf35jlg56xgq2w5229k742";}; +ibarra-66892={run="1ichmsdkjs71f5yx5cphh08dk07gmr7mg7n0v2p4sg4fh3dbxjv9";doc="168k2sx4shkx8h4l5jp3i940sp2bd9f4if2pjk6ilmc832dbh25v";}; +ibrackets-67736={run="1cd32hk5wl2xzahk9xsrnmv8l5r05hqi9gz64d6k0lzard4p494c";doc="06ifqb5k7z08mzd8kkrkj3r37yfwgy5fw4zygd0an5470pk13zam";source="1axxyjfhkany1k2c6rzsyqilrq15809fd73r9hv0qmpbgca7m3m3";}; +ibycus-babel-15878={run="0az75laq5fxnvn12348c3985148isz4n7nv6hd0d8amanm80h779";doc="1256n1qa6zpq509rk02llcixw3qh3sgi9f649pv1hjk6xdy7nxfl";source="08x3knpkwifgi2zxv78bnfn10ix7l6rf5nhfqi6w5xck09l7fiaj";}; +ibygrk-15878={run="0krpzjn96r70z8rwsq52j0v1x7ppd766ngvf6xhny2kd7mshl9ka";doc="0prn5b6cjc9ljxdnd1ckfgzqwlc5vv4w435zvyz75r3f1dvbhh9m";}; +icite-67201={run="1aszs6kbmwx7k322a2yzk4l8d2gdb84aq7f9sk4bpiljgi9gpclr";doc="0bc1r733c6g8y8r2kam7in3p3cb9y8frph85s26kcgdxqw7j069i";source="0l3gx6sm1inyzyb6z2rb1zrhrnyg0i3xim0dn80360fkxxsz7739";}; +icsv-15878={run="0gv7wrghqivfm8yb3nkm6r8jnvx7klbhr1nbp27cjaliz70aapa4";doc="0dlsqkdmx4nhgs15hhn0nw6vk6h3q3hhhwdymy8nnxraph2mvyl4";source="1fh1znhlacpci7v23aj9zdczhc87sg3l0s1gsvrbgznpadgbzbim";}; +identkey-61719={run="1vs6sr25ybmrfkg5v3m021hlhw9x3gpynh89q12a5pl2ka094hn1";doc="0r33gzfwrj4j8a2i8kdddbhgljf3hz1b7cjfxgmv5gdqmmjywnx2";}; +idxcmds-54554={run="179mvb95a1cxkn7ncgs7xwhh04d36s9nb5jjxvaszcfkp9rnlkcg";doc="1ym6yi4cpw9flz4si6blg5bfj85sf0p3y6nipc886ixkwiyvsgm7";}; +idxlayout-25821={run="1y1vzyb1l5b8q3qqs62zfiw7vfd9c1pdha9z4nm5xpsar1nk69qx";doc="11qiyzcj4zi8kd9h2k2jhg8i8rzfwdam9rhr7cmvbxqsqirf0fp2";source="0fkpj4gn06wkq3saprsb3gm7myj04yll4spz3j7yi28yniv4cr5c";}; +ieeeconf-59665={run="1qmpb96jx5zxql57bh5ppzfzfrgamnxn1nsqpq1bsr0xf21zr6xl";doc="1jhsfs770lhq34xxdx6ak9mbpmamfz696kxy6dhvfadzkn3v1ls5";source="1r7a5wd0hqhjh7dkbvm0z1fiih4f9pxbx6y7qmcy1qdvlm819jmd";}; +ieeepes-17359={run="0nipchw9hdlc7am3n052bszilwj192pfcnc9p5alqnffrd8c4rdj";doc="0ff8xa7w5dmp356klm3lfr9dnfplxjqpq7aiczp6xj092vmjrhdi";}; +ieeetran-59672={run="09j24j6kpgjx58yghh902bdpkns025v9av6ym2xwslmv1ya31pka";doc="0y3bw20f1sa7dacqwrwc43masap5sz23vna8bbkf4p74rdgl3bkn";}; +ieejtran-65641={run="07y254kl5wanv7d2jyzhwlf5z6n542217f5n7gdyrm4jryzhb0ly";doc="1l5cyqlsamkn3yjdia1zbv7lianq8jcjl83pkywimxnybw0kvdbl";}; +ietfbibs-41332={doc="18ypa96z1gclq4amka28sv26pm7lycak68zf4b3sf1bx4ldnzmxq";}; +iexec-69420={run="1fn85bszr8ryaykafms3y0yfgm469vmikfg2mpajyn5bc7pmhnb8";doc="11j9lf6akvgsqjb9h9i69qxxkwa8h2092v4znf8yjrdcasd4fwbs";source="0254awws0vimn7vlx4gjxn03dfahdzwzvmxrj6x5mmmw32xvfhhh";}; +ifallfalse-60027={run="0pn37mzlkpswyykciwgfkw981098gccqmp7wllffr39qxhcj6gdl";doc="1583p9f3lv7kkjygqv368ag70jq2b184j47v32aqpgnwlmyn55jr";source="11636chvmy2icfq6f7mvdq0fpcn36yl15g9ffpp0flqdq7c8nd14";}; +iffont-38823={run="1a4zx0mysk6i7awvcjv2y1yid1k160icrkqkvw34qsgs35qnqbbq";doc="1iqchl5nra5ldmv5ddpwjcm84whpsxym34vphj2zxvzl0hqwrc2n";source="1x187pafzgg7h2vvy5dfc44y37q45lkzqfkxh8b52pysxxl23014";}; +ifmslide-20727={run="1n4dmmslpsx9fv9wqiipcg04lasym2fbgsqkvvffqmx5rszgdpha";doc="0n7hsymjs1zfjc5gbn26z2wdl5qicc7pd251s0h4qnfigq3nhr08";}; +ifmtarg-47544={run="0wxhdmd2h7rs3fck9yq1g48kyd33m7xzz3g7ixg046azai8f90m0";doc="0h8li5c5lxccf2a325p4vg7xgalzwryk8czdzcf637sbbkfhd53d";source="1yh0c42glrw5cgqk22h8lrc12lriz436wz9vrc4145gjcxm6p09s";}; +ifnextok-23379={run="0sf9dmz303pbxfi24z6fb1wxia89qaf4svgp4sbpi1yl3gkxwrmj";doc="11r5zrs467h3rv5j8c7b5iav19v9hbcxbspgfdbd061g871xxd5y";source="047pc422qhh9d80rjgmjgmn5xsapf9azvqrl0cjn28qw4m5ccs12";}; +ifoddpage-64967={run="14gi24l4m9zmyhckjq3j1svr9858rm2idr1wwjwmp561wp7vr6yz";doc="0gv1j0swzc4imahk9s96nga1l42qzc0xkznas0jzkbi27s2lik4x";source="0wz7iaxf26qz1v8sc0kbrz1wy0kzd4zbd0qiscdhmhmw2xr077zf";}; +ifplatform-45533={run="0abhpfw3w1mvpg52xaw3cngl55sszk5ji9a38yab8vhknh3d3jby";doc="1b41nzn666askfc1kkm1lwf05ggf2ml8gz3rrki4yw6ch52sl2sc";source="0g0qvbvv4j87rxps9yypair00z6il5hfjczkrmf4fkycw714sdqa";}; +ifptex-66803={run="0yw0dphc2pdx2jrm5khzrnp6rg3fbcfc8z6ppwmyid8iqxszpdg3";doc="1mbdhxl2fgbwjbsk8jqk3709bv8k3whqagls1vqm5386lbcycvkv";}; +ifsym-24868={run="1bs3974l1jdv0b2wwa94861hnb05kb69bsyhvsgh6k9xgmgwfrla";doc="11k9jfqrfmshwpmni6bm0324zj7c939k6shvi2l69k4w0kx6phlb";}; +iftex-61910={run="0dzpfyc2ld4kbdwj457fzmf733792gz1z7n7hpbn6z7npnkg6i8s";doc="07wvwfxwv641lmk0p1gplv7rsvab87v9fgzamizqvihf2ys506q2";}; +ifthenx-25819={run="0bp087nfq5hb3a60ayprbz621nmk0acisizkw5i25n4kryi6vc63";doc="1hzz8s2xlz2pij81cfgjad8yaamv8l4iaripj7bbifkq7gy38afj";}; +ifxptex-46153={run="1wb1laq1nn02klvjgwvjgansi4anmjaik04fl0lylr7x5996qa9k";doc="0bh8bqly3zzzzgs21cb51a06023l9xfig5qjfzrlyvfqms7wj19z";}; +iitem-29613={run="1sdsc28fw1lrr72s4wwgwk0zxk9720ll5xbvap2na4i3lp4vjghf";doc="0grgh5bslsl67ygvz2cd3xb9adn3w4amhpkkxnh035vkld91fxh8";source="1fk3c5rc8ylf9jg5id4jnm1gjnrvafiivhr0lpfws4ddr2pmir06";}; +ijmart-30958={run="1j4i7f745nk80nghnpajkib2y6ddrzg16h0gn5cd215pibjaml6c";doc="01ds6p3byc9j5sgjhh7yhbpv36idlp5g9afsqryvhfrwy3r9900g";source="18saabw9v60rly8qp8vcgj84rjz88gbz4g2sda4i15lsjpmz4dis";}; +ijqc-15878={run="0h67131gbqr971hln3imf3dljh5jaqmdp23hb60zxnlxllf6msjs";doc="0l0pvaiqgyxk5fv2carjhvp6f45clrnah5sla7rdslf134d8ciza";}; +ijsra-44886={run="09dszs5ha929aws50zq2k7kia529bxfczs6j8bi0fvjnmf6kx3yy";doc="0lb3rlqsscmnqn65l1aq5x5ismsplgbm1ks1pn6cs2sxdjy2s0ly";}; +imac-17347={run="1v7zpbzgxz42b6zv0y3d2cmzzsal5mmzd3lb1nk779i82dhs6pi1";doc="0s64w9wkfmrbvkd8mij3y0asrkzcg2k58xjl36vfvcf07aw5wcr6";}; +image-gallery-15878={run="097brbh3xf2xi4s151iy8g6abnf0ba4yar78jz607f9dfni95i8c";doc="0f8a7jzj6w25al9c13mxd04bg2c701s0ynsd1rvnqdik6d98s0l0";}; +imakeidx-42287={run="0w0q18bxpbsqrj97309b9lyfcf4has5ldjvs0dwn45lciav8a7rr";doc="0h2wqdg6navbpzjq38ks2b9lz3hkmgi7v1y8ihbbv3aisyvp5r93";source="0l7q94z5a3lsy4kh7vxyr6mmywc43p681p1vjry1f9vi0s6ljwpy";}; +imfellenglish-64568={run="0rvdfcyy2f4w5dnxp396gr5516q76lyq5vshwlai26pf8f9ffd9v";doc="0mycayxx0yi5xrkgp48dfcd0vp8cw5jhqgdhwm4kkbpqckbq6kpy";}; +impatient-54080={doc="03cjl3lg7k7p4h8drw7vcbw6ymgmm2clv6sgfs3hdixs8dmab1b2";}; +impatient-cn-54080={doc="1pc20pb0las3slam1d9hmqigipmr6r98wwif12m33mm750vmq65i";}; +impatient-fr-54080={doc="1qwdllmi0ci304smf4yl6g8ah083jrch9clkyav7r5qsxnhwxbxh";}; +impnattypo-50227={run="0kmyjdasybcvr77jrirp3s1i8jwvhk7j04wz6blawihidz55myvq";doc="1cgk3wk3flpmlw3wa4sg1s9ry6bz9vjanzw8kpyhj3d8yl7cnzbn";source="0qc5wz5a4rgvrzv361gq3i6h4hp3v176klgn6fhiwshk84zqccn4";}; +import-54683={run="0if5vrbx6456ydarw57p1jpkcj2d7csmiffgll6fgxf2kllqga6v";doc="11hi1yk9xhqks4i3rhc4s8bbaakxbbmddb7j5sym780y45qm79c3";}; +imsproc-29803={run="0pkhmc596xrmfwp90w7brrzbjn5rzn70kdpnjlxbyf2j85dr7gz3";doc="04qasn12qqg69k6isnv2qjpcnfs1nd27vvdpqqdb23z97k38x2xn";}; +imtekda-17667={run="1hhxwaykslzmf70lvmrmpnn2kq3xa114lyvazgfg9sccc990gnlf";doc="0lzkiirxgvl2m0vnqpspr25qk1wyq1bs2sl3zi6704q3fvp6sqbq";source="19h57cyxs47awil222i5svqgwdmw9mrm16wja9f1j980nzzaq7wn";}; +incgraph-60810={run="04kzj381v6lj9a2hjgkrsjvs4h5hw6mn80cfmcp6y8d753ibaail";doc="0vi27zvbw8pwh9krr8zwh90m1fsx6wqsqkch8c9ggjy03518b5zs";}; +includernw-47557={run="1w51v1v8x7wzibcy40ss7ldra83wbil8w1p978yvs5kzbky3vw2f";doc="1zl5fsgzb7nm1wi6ddc3cngqj3apmjwn1wkmsz785nss56vk9f7w";}; +inconsolata-54512={run="1mbf4m3ll3r4nhxnmd3ridq7kdqlcjcm3g2q2s6qxgn4b6j9ikvn";doc="1rh7kisvs33v91r19lnqgma705dc3gari0g153ws8bd1px3ivsdm";}; +inconsolata-nerd-font-69061={run="1778fg0vpaf7ccqs38x9k8d4fsnawqvqpchcjb5bqjzg8mk0mvs0";doc="0ydzsljbbajpi08dy4lyqld82sqpyv17vh1pp1nwp6hrn6cml3q7";source="1jndmhsr8y15b630wi7qshn1kjq9q2nfkvrn9gk0awqzjwl56m6d";}; +index-24099={run="0lx5jl7nckbn0brsijlq78mm0gjshf8m1dqjhgl0l59qi56x5f4x";doc="117h2g30zbw5g6x3xlmpgq0k4fqixh0l8ah7350q1sxvddxfcc24";source="06acw1yb5z4f887p44l9afk78kpnjv9djmbwj55bac23ml2k3ddr";}; +indextools-68555={run="1f1r8k0psa7g9pk6kkgvyi9dnywsc4n34svfq2pj8b1gmp9918kr";doc="1xrlfkg43x4g66ip24spnq7vr915z0q7zdkqmi8g5zls8y81jg1c";source="056vrs54jnjnn3c2kvxfhhxf5ms8cpb004bhd8f9whb6c1hdjqpy";}; +infwarerr-53023={run="19nlrbfmqbkjrrx9x75s9nd6crg1lzimb2fr3hfblaivj6lx8p4r";doc="0p1s0v6p7ygkvz5f3vgarcrl85clfrj3ivzrka62djqyzn4bb3yb";source="1x2mkqyx7gz0bz31na6mcdyrlj11mxpjlzc6gb9pk51sdqjj0bbv";}; +initials-54080={run="13d5pvc2q6xc0i8nbjpifn5xyn7wzln7gng98nnpjxhk5y67bcz9";doc="0676gq5dx4pqs6c0z7i48gi53mlapplmms8s66qwpdq1aksswdcq";}; +inkpaper-54080={run="10989ja1vy9ca451gc0v0mrkqi25dwv4fdvw9y4k6z26g7902hap";doc="1dmvkq44kyxd5y4l2kc9wvgrhgk4kkfw0qfqzi2faf9xd6jssrhk";}; +inline-images-61719={run="1nq64ymrmfiw19bcbb25gmll36xbv58ynzvv140089pw7xn5x7bm";doc="1rjppia3m0kvf433ansxhmwvii70i4k53iqk9jphhk2xv2gfd16v";}; +inlinebib-22018={run="0v37ifnjpvsrcbrjd57yk3qqq195jqvr1cgvfz2fsrjrd2ima822";doc="0w4j64dxh11fysqpkldksv2qg816shz0dj16jqgbksxkjsig1i16";}; +inlinedef-15878={run="0k6190v8lv2l96qpmh3pkblhwn6camcq83w75rz09517bnysm4yz";doc="0gz9m7fwcdxs6q5a33v7n32x5jr4hbxsy4j2shwv39j1j2amr1vl";source="007648wrb4ar04g0851yw663cvlmdyifidp854y87yzh536hfwi1";}; +inlinelabel-63853={run="05qv0j8gvdqsdc0bg51n7mskbx88gv2yny1zffr409x8pvccnhlj";doc="09jnbnyc5sy1grvyjxnlrr3pg91ispqd18mfdk9zj8m6lwy4gh1l";}; +innerscript-68776={run="074xa8nfa50sdz3hqvvlrmambjnfg9yai73xx9bmzc7mrxsdkxc3";doc="11nli4g0q319k4whryc4g9mzqjsqz43ryx796kvhb3kw8v7z0rcc";source="1zam1pw4jjx2kcps4rdvi0rdrwz37xb29wjcbm5ir4z0lx4qq4fa";}; +inputenx-52986={run="0jjf29lj8ha99r2x0vz85swkr2aq6v2jwis27irsi79syfq8bpbc";doc="1kkblvi4dhfxsij5lmbdvmnapskvd5yahha5im2nlllh8crypwv5";source="1681djxj8c43i93ip864bi1p1fpn2dngkvh18zs0234ls0gkwiy1";}; +inputnormalization-59850={run="017dxyy2lykvcsigpq5vfklb2gqg1aprk0xk21sxa8bdsn3hd2gg";doc="13yvyh5g4a1k6bcqwgmgspp8gkgzvgcx5f0wy5ajp577cxsk5ir5";source="0wz9hw5qs3i3iah63fqhkdcijhv30k828a2a19268am4803m1pxh";}; +inputtrc-28019={run="1qy90zwai5ciajsiph6sgmzmfi16qgvx389hvxsfi28wccpm5bh3";doc="0fcxac4jsvhnc85p9nwpp44ij0yq4q1lxlw42dzhg88fdkl57srg";source="0b6kl9a6ilv0i5xnlcfjgia40ynl28dbz1rvcvak3637fva07ghk";}; +inriafonts-54512={run="0kbf9rvrml10qk5pckz21ag217wimqhdxjfk35ll0a17hc9yzj68";doc="1hbhfhmnjya1cmj1wzhvbny7maw9m2dr7sv74g2ka6gnl1n4rx1x";}; +insbox-34299={run="0ylnp3l21zx4y1bwrr33v8d79vlgz5frna9dkg62gz1bhjbw7f7i";doc="07iw7py0p0jfq5np89dx9fdvia3yk5mi0py77xrgb8v4gx7k5g3k";}; +install-latex-guide-zh-cn-69264={doc="0hs9pqhbf5pkdk3a29xnicj7i8zxgf3vazf2mmm4z6fc4b0kfpjk";}; +installfont-31205={run="0lszqj128c3f4wbcrvzzlvj25jl5rm0n5qfj8rsn65ycxvymbf91";doc="15x8jzcd7bwvbjid0hr56h7dw39n2rg6wbfz4b02y7shp1pn7hgp";}; +intcalc-53168={run="0llrnayqwdqxi91yh7panbbiljina3bynv2hxhi6sssaw3pyd92l";doc="1vav25plm639410p59bi7bsihsyys9yaddz0bcawxn72zi9b96r4";source="059pqs3f821javya7brxvl9v2mifdyw1vg18hr1zgzhj7bmlxh14";}; +inter-68966={run="0f7s4mfj1phliv0dddkhsf4gpzi6xmyxhwv26bsvgvs8saf7qsha";doc="1i12ppl2fmjv4nxvslqqrn4ygrvmf9aa1lf5wlsrwn238343nkps";}; +interactiveworkbook-15878={run="0dibc16gdam4yxil37y2zsz4cnfiq2grm6qqj512nng4zqnwcdj0";doc="0nh4zm37xipvmv5h6yxy1ir2gkjy23h22j8dnz7m04w021sgx7i2";}; +interchar-36312={run="040zhi6rq7l8s04zcq2vfxricbvakkxnx0bzihbj1ss21pmyrv82";doc="18lpyq26zc9b2ypcb98k578wyg2fp1fllsfyrp67b4v9lnz1m7q6";}; +interfaces-21474={run="1d2sg377lxrwv0w0zdhxdjsnb8sbkzadpp29h4jcm7v6qpirs1wj";doc="00dmb0jq7vvf7xfppwmw1pps6453rv438qkpv5qhlamqlvx2b28h";source="0s5gfwv1izv3y3z3lmfbxdw06830lzy85f7vza4i8zcdwf775pl3";}; +interpreter-27232={run="1an61a9gdja2h19m13i4024d4x4f741x4yxk983phl97nfadv900";doc="1vgdgriiwv3lbdwp72pdc7yz5f702xxykqdp4ih1ssx1sl9pcw05";}; +interval-50265={run="04rj730lnkgj4xfm3mldyyf6bb6rr1f3dhms0rnaiq2pzv77cqyw";doc="01ngbaw0lbh4dn8kk1vnv49isd7wk8gjh2qvzw6x9yk9nl46gzla";}; +intopdf-63987={run="0nfjwarkzi972vqn20wz5ava3hq87bpl2kvfig91ybz3chd1111c";doc="1sjlbdrn9ajbkl18lqx8lmxdlb0dyh7cjvj0vizhnsjgpwp5f0dp";source="1cz2y4x17smkjp6b7g6r3qg3whdgcj4cla315wfp2z9nzpgmy7fs";}; +intro-scientific-15878={doc="0bzgi3zg0lm6zwjnac90ihaqwcvhindfdphjijv7mh11ii0qxlmf";}; +inversepath-15878={run="08xivnvbyhaihb24w14b908927fr73kbk66x82nv9j332lpmfgmd";doc="097fyhn6dj9d8hq26xads2s7vz7hvixwl27psqrqqvhdlq3bvj7n";source="09d3dzckxrg9vdxh84nx3xzwj3rfarvf0bpda4qib179bgnqrf7d";}; +invoice-48359={run="0z2ixjxicphaya7244mi0gdnxnv3qawyxpa1kwv6s0r8li4604k0";doc="0ki54z1rlb9xwvsgd2bxv2sb135cc6zh44kpww0mx76vcky4az1r";}; +invoice-class-49749={run="05vbh1iclf9gj6nzradfvnqa7yp7r5c3ccahg3j7qrdkkb0xj8ig";doc="0myl8pvvfzd5jrlva1cxkps9g6jr0lpfw79wr3ghv2idz8ba85x0";}; +invoice2-67327={run="0646sb8da53x6aybbfijk35cibay4pnryq1xq2nzikdsf8i5x0x1";doc="057a73iw33rpsgpxcg13jlpcfmcmsq68jdz0fa3dhz964nf2xkpz";source="1z4lilb3h8gp64lgw7xbcnqfjf0lmzv760ggdjhmh5ibdc4ic58l";}; +iodhbwm-57773={run="1d18fjqgingshxvsawkz9idybfz5fdzcd41qxk5hpqms7zcjymi1";doc="0iqw7insxma8pmj5v12zjgs72j60z99g7w5kfkb1h6biwlx33s5c";}; +ionumbers-33457={run="0pfs5064cya5i6h3bcypsm8fy1bas542kpy742gmbd4rdw8cbxgr";doc="1sks9qdrl5kivcgn9mgrv3f2gfifmp3icc4wjha4n1va1fqcqcma";source="1nimrr8b242h11nfxi9si1pg0wc6c0aaa0dl23hjjci89n8y89aq";}; +iopart-num-15878={run="1fx5sw6xzsamlrnm7nl965xrgmgffq85kkxr7ayka1w578p6f8jz";doc="06hrw0c3arhssabm3l6fhb1kh8bg4vp5hpafqlbyz064a60m1p9y";}; +ipaex-61719={run="12rd8b6kbnn2hvsimmfirfq3nj436h2ckg5129qxnfnqfqr9pkl6";doc="1g2z2ichh3wdjmn9jjd48jic1b2xw5sb8sksqv0hm043hk5makaw";}; +ipaex-type1-47700={run="094z08ygcklbk7nzklfmdz3lfmicrr40i0wzxmia93v1vpsjb4gh";doc="0946rj1bh2hi0779ss6d003wi4xcb79i9p432jkry07xkr3fpy7d";}; +ipsum-68861={run="02df1xdzvxv5g83bw493kh01vqbq1nf2ls5f1z6j53f116k8k154";doc="0dsq0h7hgm90lf5a2mmqgf9m002vng1cgfz6y21c85ld70ds0vpk";}; +iran-bibtex-69347={run="0b6janv0n9shyg7plykvb1dncxkfynrq6hzn6bgai2n1565c10dv";doc="0pwf352y5yz01y21w2vgz2z3j1k9jkssmk88gf4mcji8hkj8xrkn";}; +is-bst-52623={run="1acvwcg568iv9lskld9hjnyvqvlsmgnbg2akrd59kmh8mmbkydk9";doc="1hlprbjkamq1w3f1n2dzayy9v14kxj8f1nr6d3z99c7v7kg19m75";}; +iscram-45801={run="0h6pciksfrabg7wgxsgzciw22cp6gmz9cb3ifdsqb4n4qk9fga6m";doc="1p0p4w7pkyc9xp5af1afmsibbbrylcfrdcbn16adscw8y6wmds05";}; +iso-15878={run="04ifwh4vn074cnibyafzq59zjlnlmdfyq03mqwk44r1mgmizizdi";doc="1bnh34708psjpbhcddv87axjhxiyfjic0mamlpn3z58qcm0jb2pz";source="0gaxih730r70xgy84vbqz1fqbdr1w9fg9d1hszp0kqvqaypfmcyg";}; +iso10303-15878={run="14wjjp2iwb7l8m01cinmpm3g9hk1rpjx4a0rc41y614ah5bmi4ry";doc="12m0rri6l538iyphsh2abcvllckg566aj1487sa9jc4m56armvj7";source="1nnfz5r5hk0rf1gvwrgp4m7jb5lln1cf9pnb46x9l9hyiagq5din";}; +isodate-16613={run="0xw8356im72iqi67nspwkhafrwl46gb3i41yapnj0hqb672gk4lj";doc="06m8ic0nsiy5bsymzfhpia9i47kbpwqmnbrvmsp44mw5g2ccjk41";source="14b1ymqd6qbcksnim642py5qs5n6g2sy207apkx9mnhhbqa15an8";}; +isodoc-59709={run="17fqpqlh12khnxyknah5dqc1xhbz2bk3m6jw8jwhpxxzb20njd4m";doc="1x6k1rs9k27x9xsb9i5a9m1cpx3xfwiyf4iq8wxybvgr5pli7f63";source="0wmwfqhrn2nsj5r9n0bvb2cl863777g7dsqf0ciyqq8l5lngx8wl";}; +isomath-27654={run="1bzw4l364z6avihhihiprbaslnn49v1rrllf5cj0cg35r3jppz3c";doc="1d77wksfk5pidb24cjgak0mv1k09dqmszksrv4q997iwxkwckkna";}; +isonums-17362={run="0nqzapahfvqg59zxrgjiyywkh8zb8mz9gdc2733r78rxnz81m1ba";doc="1axq0acxk6qhq42ayr0zjs3356ww3ryidvj2wii2c00isw0qip1w";}; +isopt-45509={run="03skmw4hmib197p3cfbhf3mbhq5hrjavwinwc22drqmca370v305";doc="0jxwzfysw4qsfd1694grnzs2jfqcbhm40w1xlgcsrq2ylgcjhr8q";}; +isorot-15878={run="19x89d5fvjpn66y8ma1h24dwapw2x6a4nxbw4ixp7xqkycyhy0wg";doc="0jrglpxxks1fbwgvmx0w3fjcnsfbf805jv95kawvgz1ix3mm71v3";source="0rfc2jdd4f5yds516lr9m28izg3lbf6wwvpsh9hrl466dakgdayz";}; +isosafety-68801={run="01csapgs6danbh1lr2k1pbz2sbmnj5fwllvb17jnddsjnv6xs4nw";doc="0li7197m1pqgv309fv6nii6sl4ppkcnxqnzgghrv1vkvb5ps4n41";source="05sc88xg477z50rcvg4pjh2p4jnfi4zkjkyv1w6phk7jjqh0hvpx";}; +isotope-23711={run="066b5jw98ynyc15jigxc1idp79i89hwrq19rdizzx90s6xfnxlgn";doc="00w5bxh4dkph9d4z0x8h6akcv1i2a3b5vfr4xbvq1n8k4i8ss7jb";source="0x8vrmprpgpgbxp3n886yajdd9mv27r9shkyz9mp1bd4zakdgc8f";}; +isphysicalmath-69343={run="0550hx1ybxh8196q51zc1966jpdbrb0zprrzg4ss8x9yxkan13j9";doc="039miqrgiymmsc561mnycda229l8r3g4cz629xkndv0rxz3civb5";source="00l19fbwvpv0xrzjh0chqp73k6cvgj2bidalr3c1n1g21zai6c22";}; +issuulinks-25742={run="07rpm9kcfj3dxsax8kp5r5mvrgg1c5yrpbiirsk44ybjjkhhjscy";doc="0qlz8y0sszp1jsnbbgaj9h2zcz1yqk827pwzccfi4wdj4rcpvvam";source="051b05k40zs5amjxnqav6ibdvj64wfhcf16a2hlkaf5kpmpkmh54";}; +istgame-62946={run="0ym2l6nf8prgwg6sqfjlr6mmhv53q3aksfznvgy7ypiggg18rq5m";doc="0ggkbzc4xnmx5h18af4h7zhzp1kcgfiqdl28qhrhhcm1d6vc1x2z";}; +itnumpar-15878={run="09cv6x74vs8m10fhk5ka6i1c6gzbs5qaqbk7i7mf2zsdg5w447r4";doc="14273y8zl42gkqm915271n15pc6srsjvfbnc3jhp5xcjcqnq3yfk";source="1wg714a0ipv9g81wgmjdrm4l4yar0z2nqxr5khiwihk9nrg26yc2";}; +iwona-19611={run="1gf8kmpmp2cjz5sg0lx8j0kr67a5xshjkghpiy70jnaz7k8fbrgb";doc="1skk4p2pblh8h37rz2pjx18h8pgbagvr9w8h9d83299byvjggpi3";}; +iwonamath-68144={run="10nr9phqmjvbg9hg7fz11dap8ncnxx0pbpbz56pna5kj37znmh7a";doc="0550vjbv8b0z4v0zwgkiw68fg02aj8nznfsf0qpf3isqyl9d94cy";source="11f6m9969lcvp3cw2gbdv4gg4ggisb3c9p090v7nzzyadx4i2kcy";}; +jablantile-16364={run="07f298cfha42q2d12xihaqkga2iv1id2wa5ph8a61z6ckhchzz69";doc="1lp90rbrji8nld0wzry2nn0m2zb2nrqnqyy85p9sh9rmrplhj8f5";}; +jacow-63060={run="1gqjsdzfspnpps2p5qmxbgrkc8bxihmag0w2xrvm26afmh376djf";doc="0p6xpz5n961hyfzjf7crgciig5rl95wkylikmr6gb95bskdcybkg";}; +jadetex-69742={run="0gsmhql8p421dyyv1b021sv0hsnl2y4m8wj3vkcabhpiql76yfyf";doc="18ljn0p607hm9655v6z6xs2apkai20l2mlxwyb2asqa72s6x79yb";source="0vrqpjn64qlyszf7d2vwkbd1y2lj5lld6w9zz1jqz1f0arhq33lj";}; +jamtimes-20408={run="1sn588j6v6gxfgk31r861s7cpfk2ir7ip75hm31rxi8s8hv8s7s7";doc="1n91f0b0bjwbkm1rq5w2vwy6wlaizlp7qb8pxm2wn08b5a825hvs";}; +japanese-mathformulas-64678={run="0x9k23g95j4wqf02ibj4zpfgxa3vlhgckax80lwm5flvr34bbgdv";doc="1iy8q3906bl7j2ciw8l3162pjw067qkbkdadj9v727x3lg29aay2";}; +japanese-otf-68492={run="1zwjissgwzkjrmh82xixax57wf1ycz239yl9wmcsnn3wcz04jg89";doc="1xzwpyzw3f13ij6xnhdhmxxafiwqmbjbyvv6c6cfbzdw5cpkvayy";source="1cs0daf9dyx5z397lak5qmanwvkbh49nflfaq6ikiqhm22hg3w1r";}; +jbact-52717={run="0z0x6jrxaayp3w441r1zwlqirvv23g0b8h9xgy6r3ppi71glzqvp";}; +jeuxcartes-68266={run="1d7izhik03gs35xl4vran8adv5xr4vasc7nh55h9ya559v59xm2v";doc="02jvs63xi0qhcdnrm1m93cjj29i0cp07hw52m3143iadvargpmv6";}; +jfmutil-60987={run="0ygrcnm9d0dkrcz5cx86j80rdqwi1j9zs28b1bjnfb4vkd5r0fs0";doc="1vz9wav5ggsz9gkkyflywsnzjsw0p5paiw9wfx7x3ha2lgwv7agk";}; +jieeetran-65642={run="07b126wich0dkvc7f581566rpn17qbnzx02hfgbw1rjkqnq3svsd";doc="0r8fsqx2nqi1jw9r30h6w3dqafl8mwhih9vxpibgfnp2lfy01a5m";}; +jigsaw-66009={run="0h5g4vrbwpbxbw9dwscw2bqg7sanh0a30bbhw48ff9ic94bs2407";doc="0a36l6s7wp30h5xy64sj3gj716dc43mlbyy3px5wv7n973f5km51";}; +jkmath-47109={run="00nh8cf002lysvn6qiyy5mcs2n2z5ppr0x5vp1akbz0wwhkhw9h8";doc="07n2xxfwk0krbiaphfkkfnc8mgc8iqmmmdiz0cj6s7688rlwij0h";}; +jknapltx-19440={run="1jw24izfsw3l8bn27qci3mblmhpkal9wcldhjll7h84fgjb9q396";doc="0m3blfj4ninra6zn501x17q6b2qzckzcavgihgqmk9q51yibd5aw";}; +jlabels-24858={run="03fpym9q84g1b0pns6sdsb4jx78aq7sclr5fkm05ckvkk4v3wmsj";doc="09qa8y6axg9pvma507b9w63dwd2jrxnmd64f5rfd7wpznamhbc0w";}; +jlreq-69932={run="1inm5smaynfsdqbcv8xiva8krsz7q37g832qmj93pqfpm1yjxw4y";doc="0m4mf81dd38l6lxff46lxjizlif1lhs8pxr30r67f27drvyb5r89";source="1hv7xsrkikimbcmd9qbhs963fbl3xi0syw6mr82mg1hnl72fkps8";}; +jlreq-deluxe-69971={run="0sshiy8iqhmsjp9srg24lkqpzyy49wglacy1qjg1czq7al27p8hp";doc="0bp2yh9996dr289azjhyj16syjp3h1p47cb57qdgqmig0s4xiwyj";}; +jmb-52718={run="1a5nz825jppq3pl1263w2sbm0a48kmmndppfpp7vi69n5j2248dy";}; +jmlr-61957={run="1vliagbbyy5nzfs8pkl71gy0zvjzgqibrh7c480aampwf5qi1gq8";doc="0mv7yxa1rn0qaz3qkzxh705ia27gqrjzpcqi5gpp340hvi8hm09g";source="15p4dsbn25gpsm7avswx8vw3ljfvwmwbp91qlzm4cabsb54kbnhs";}; +jmn-45751={run="0iq5ky3llx50smw80lpylv11jmqc51m5yrhlslz3sakmgdqgg1yi";}; +jmsdelim-62630={run="1087jag55rnf02r9s5v7brfqhqncibq1xr0xjq680lvb62f65ln1";doc="12k6m7i81d6sblgqijpizssnpkghq5snf6bq44lkxv1l39flzjrr";source="06kp4zsdzi2m26h9m99x6kqc0lfic96cidzb63mvmdfqcf2plba9";}; +jneurosci-17346={run="0ywl1nlysc5fk7v5cdmy5g5hylz4ll20nnqxsvymsxnayjm4civ7";doc="0a8almw0x4b7v3dsdi9cjv8vzg518fl90zyyxn24p614w3zr01sj";}; +jnuexam-70117={run="0w1jrrfbaa7wiffic6r2s6kr79zva1l9lkl5dyq9lmwsrkh1mn8j";doc="0x33wpwxriiirmsqk0a6jd8lm73vybcz1wn3lg29bywpa5h7hgl2";}; +jobname-suffix-64797={run="095881x3s3hyj6kzhymnzp8xcw89c94qrz5654kzs9mqc2iy28ss";doc="0ng9dzmx53p525c0kppl33i13xwdsamv0d6k1j8plfvjy86z3ay3";}; +joinbox-68003={run="0xbbbpw0yvm0hrll0yxcg46bd8gl77nb63lljk1pfak64b055clw";doc="1mr5h8ydiv0rh3a9s61ksmbvq9kd3wjaa4zx2hbg501dwmyx42li";}; +josefin-64569={run="1f93l4f6gvsnnzr0f3gpvl9y9i034rhxcdz8c282bn5jdzg93j7r";doc="04sva62hzfphzcmk4jhmp4yiahg7kzjcskviq31lhy83d3600aa2";}; +jourcl-65290={run="0skrm2rsr2y7q3mgzy8wcia8n0r2ixhdd222i0vc2figi9ynbd99";doc="0x6jxx8ckf9rmg6qidypqjy7kpi0l30npb96py62imyx4cfypr8x";}; +jourrr-68556={run="1gbbnv6x903hibi2gw17armhvdg9kg884wip6a64nbvsr6g4rgn4";doc="0385yzr1rrq5rv0rm6wz4ik7f9s8zkkfdhxq8yibnkil5k1psrfr";}; +jpneduenumerate-63893={run="0an70r9y0vklglyms7n2n40qz8jd2ig9m5i48xa81z615403bf90";doc="1kb6g5hbsdi4qxcqd7ginmkg4q1flqjbi1v2d8ss6vjsamd360q4";}; +jpnedumathsymbols-63864={run="1x9jdzl2hljcm8ia7w6b2rb8zbb41y7vyi88rvlvy3y6i5v3wkcr";doc="1i9f6llx61c9lcy1lidgmidn7k870pbl2m27yvdi40kcqs39zkbd";}; +jpsj-66115={run="0yv7lkv7sr7qhqv0rmyislf0a5rcd125kqwbnfj3696cwhm5aqf4";doc="1bmms10hgyl4gs91i2kpds2mn9x41ks8fjrislj2zl8y3vqdkc81";}; +js-misc-16211={run="1b26v330702mbd9bviq6sr7pg0338hddzc84z55fsqjd85fp7zcz";doc="0bs30a1m8cbv2824xhj6k3jiv6dmdp6jjzsinhfdwiizc2kzriwv";}; +jsclasses-66093={run="0g59rxplv04jkjzy4x62lldf62glsr9dwgr550cpw91ws2izcx16";doc="0r3a8z11g2ngk97bd79610l6wnjy4rdgqv2prn3xcmqhrzg3xf00";source="0x8laaf3rw2z1587qx6ghvcmga3gykvahrjma7x9m8mg6ljh3jpj";}; +jslectureplanner-70448={run="1wz5kd7q9735qc47ga89f47f4c2g5lf34pm05ck4y1yqlazzl11b";doc="0gbd35lgbv4z4s64sxqnwfk09c1pf69qh1839lwn4j5nayd5aavs";}; +jumplines-37553={run="1d5w5nh0pkmhjjjq9x2n4r72ygjh2mrbdr23vsrh8cyvj3xym4w1";doc="1q0mzjyfj8vfp42f8m11g6fyx60mb33g5n4i7pw9r0dfx8y4jvpd";}; +junicode-69355={run="1vxnwzvcikwrvx9wpvrvwn4k7jh3ndamri0y5a4wjc8m74l30f7h";doc="14w0dcn43s9mdgpcz0vhwh2w56n90saljnvkg4wad7aq7pxvnbln";}; +junicodevf-69374={run="0cch871h5l90pfjfqw6x27dslwh60yg95y2g1hyi9q8y36cjrs73";doc="14xl1837jbawj2lj16ym7yi4z8mp8zvzdz6rbkcyd1rbsfkbvfm3";}; +jupynotex-56715={run="0dir4hbh5sviw5spsh80cms12rppv3wfqp8cyg5fxkj65mr3akni";doc="0xar0qf1czdpzbjn13x2hwrby18qh6s1909nv2q24rl3nrrpzpcc";}; +jura-15878={run="1mmdx5zjrsrvh90kkdgigddvb4ih3cflygv70al0jy0mpm6iwha5";doc="0zy4rafc7lhdb4gig1y53fsmk6faa2zh3s7b1la7z7qdw7s2gyai";source="036ac5chvg67hdj8g82nra7p5jickwq041jixbprf080i0mywvdp";}; +juraabbrev-15878={run="1rla1p46nb04flc2grrh1j0wvwk84cd2h1v767xzg2rdsinaxw68";doc="1708lfrryhlj2d3in4gvhfl8c6yvhhgi0lb3yz63h0n7flsb4a6m";source="0i5xhmx4j6ry4plcgdn8sc9vvbai9vzk9jr0mc54dhqaby2slyxa";}; +jurabib-15878={run="18s5jsi5wp0cac968ysqajwrway4sv1scf6m1g2l86jkp8gl6jm8";doc="0klv7f8rbcw9qlqgpylyh64ir0zayf5ralpjd26g85w1pyi1c8m6";source="07s3z6lxhkizgv0wrz0iiv1443dfyz29x9wssxa6y5lg72w279fj";}; +juramisc-15878={run="00dkagnyz7xrkn1kdzb7612qsdc00h2mkkhfv2xnw1fhrcsy11gf";doc="02prrfg5vvy5d9y45hjx877438r8syymjj9q8465c3y3jn4ka9fc";}; +jurarsp-15878={run="0ylww99b12splqpkci2hps4zzi4myfy0agxzz4m3s8q74h4bqj32";doc="08bvr93ax4p00lmjkhy09bfm403lmzhq729gjjw6skla4wbvkmci";source="0fdxnj42qk4cywsxj8x40bfrkp0yqm7qh54jp3qf79gkj4hj6yp7";}; +jvlisting-24638={run="0ry7gnzgl2d6id7xgpbdhg8pj920105fd9qyx1a0riagp0pgyryb";doc="16z6amx6czmipal3sbqmdsc1v5x1p4nyy5wxalicy1dki1f4zpyn";source="13al33s01bw43sa2ffz5zlxgaqvhj8lrcz8y7x9xx43wvvxjmdz9";}; +jwjournal-69162={run="12lsm5r6a7gqpi48ddf5p3ifisq38j5xb6jsbfpj1zbwhx7820y1";doc="0v9x97k1cw3xca3na737nbf6g37diqs10p084013ab5j83n8wgsg";}; +kalendarium-48744={run="11f8zkjfxbk5w4y49vy712ivfqx66m86jdddygfjskp47gxcxby2";doc="0rbac32h90cnp318a0chj1wfzfrvz2y140siqv5slld90f7d5546";source="0virfajl7xr8yiksxzmr68dm11m4240drg7xn72gxbs7jfh48wqy";}; +kanaparser-48052={run="1cwik91vx5bzq5jn8xjgr4ffz7n9d2qpx9v9xr298afmadg65h0x";doc="0y7j8qp9j33hw80dypc10nr28x2zn174sq1rbbbr8gc7vsvz5pyw";}; +kanbun-62026={run="046zvhsmw56a30s01pr50bv1m3s4q1fnv8hbays3v56xbj8rk7ka";doc="1qsz9krhmgav37k0386il90h91c0sxk1q2zvma272fnpbw5rbq75";}; +kantlipsum-68983={run="0aa0nz2a357fggcd44wkh1fkc6cwx6kqhm7aj4jhb8p4j2ch5mhx";doc="04nlyjfmqrvm0q64hdrrx81jc0f17p3l25v22q6kgsm29nlgxi22";source="0akpmgj54cipxl3yg4afq0bdws3m3100i1hm9nc4xrzipw8cdvx5";}; +karnaugh-21338={run="0a8bbdd8khib2bfk4n6527d5ggx31gva1fkqbfw2jwc5194rk360";doc="0n9jqsfn3v78flgqc6ir3w0lymh1j2kl2pcjxq4wnhzgjy8blbq7";}; +karnaugh-map-61614={run="1q4xrsxjmzvfhivg2xycfpfsbcb51nq1cq255slpc06q4ycyxbnm";doc="1mnwkmkf4lx3cd11rzgqq2rlfc42728zi6xj67x38wqqpi9ak15x";source="0vphzrj1y5r6zmlqg4wxykqqww0ihgh6rw3z59c23f1v3j83jj4r";}; +karnaughmap-36989={run="01b0ndcd6vcg4y6v4zbi6cymfprv0s4vhh20hwlghh3wy5aknwvl";doc="1xk80qqqpxagvwp1vfh9vgrqihakp7bkd89alb3j9bqaikgdiqdf";source="11b5bjdccy4p3w65268c8im3c6bam9ql60mik8pifwfbn36bhpqd";}; +kastrup-15878={run="139ynj6jr5iniwg4ry57b61bpalchwmk2lvxpzi6rzhp42ifv1j1";doc="1bzjky4plcl24fg5rwbjizixwfn7nkbzb6wwydxd7s2053zba07a";source="1c4ijjifc4lwimzrhp7ym5804fz5afmccn4bnfayypmjqpc8x6jw";}; +kaytannollista-latexia-69876={doc="0w45gqrvbjfzqsx84flyf150zj8jw1wcd1zfhd361nzazqz7b0xw";}; +kblocks-57617={run="001mn33pf532iwp3d8likhbc5a4nsgq72dirbilbdgaxqxndmx12";doc="14qyg0sqrr5b04j2ramw9zcfhbgmc9qfyy5im9la4id4b4zxrk25";}; +kdgdocs-24498={run="1p1rcb0lzcsmgyqz5750pl2r73fd18k76gry45zfsr7750kwx7x9";doc="0b2j3mw8z0f3d4pffqw2r9zxpmyvykd36sskkhfg7wa4q521nf3d";source="0sipsvbi9254zpg0bmcfin60szx9q0vnx07a9bdm9ma11qb1djpb";}; +kdpcover-65150={run="1a4w58r6krjg4aqpkg9r0pk7553nd6fqx22jqk37vd08scgh72ls";doc="0lvzbr63skkx12d6nwci537zvqcpp563qlf29id2mki80gqsx29w";source="0crbr3xrv0yfd64qjx72yz55py9h7by4rkl09l06sfwpn5ysdzgk";}; +kerkis-56271={run="0hcaw35viqpsbpy82knib5lbf3ngvmmkga96d48v5s1zd6m7fwdk";doc="079i5x6liqgnkc3ii65ka44r9pfpf7k2gxhkbklsb3hm51zs06ld";}; +kerntest-15878={run="15695a4q6ikdy6f9149rblfc4fx25hmpyczgr1z1q8x4s5ar7dr4";doc="1fmpngs3q7pwf4z284gg9b4cfw55afdsnzg6qpanlryk6czbch16";source="0gwz65xgxii7vriw5sf1zi4r97prf2c3dwawr3ghhgchmblimf8l";}; +ketcindy-58661={run="0v3sz01qwd2pnnqbf4v8g0xwhs3zqxc9qihfa13df43rw644m65v";doc="0ch1zjmg04pdz96dhyl2iy380hyjqcscxn0kafj94aldin20256w";}; +keycommand-18042={run="062i4fr9h2sc1zy3ybyqrq5hw4g3g54gx708rrznkl4zmpf93ppr";doc="0ls9fbm0815aar19hg40p91n1iyyfhn68ndhvapmwfsxhi6f2d9j";source="11blfbqdn1a00bfdv3nwd7501pd5qrkk7pqn2ffir1461xivz26f";}; +keyfloat-69399={run="0qwdi5gvv3fmhp2j9mwgbfrbr8awf6bj3fpajhrznfk8fy5zflnp";doc="02cv38dpq0jh1iyp67ybd8kxq0aiy6sxkz2jg9jy7vs1ksjkx74q";source="1dq8w5vsnl7kcv6q62ik2d0vy5bkbxaqn679ifbffgxiqihbpb3g";}; +keyindex-50828={run="0fsszjcw1r3kws565pgc5j7chifbkf3dh1hnlclwwsjpxbji4n6c";doc="02n7lxz8pd49q9nf6pavhs01410zj9pbszqqbmk5c1ld077276x7";source="0k3img6kb6v853wzmhsrrhx7lrh275ssx57b83vk3yx9m831qwmb";}; +keyparse-60277={run="1jfxrymww3qh4bwgc74dn6v5xwsqc29y835k4rpwglkb14ncibxd";doc="1i1sklid586igkcbhx1mjljxpq2yl7sd8rqagygqgqsxjzg91jm7";source="180fkwkm01cspp48a8msmws9bq1pif3i80yzjxs7md9k01hqzniv";}; +keyreader-28195={run="17cfxcn374q0pgf7bbqwc0yrk6r15d79h39hzbvf7yrgj4r3880y";doc="0fp2hv3azi287gz129gqlsirw4dr1d5lqhzxliyzfy8dd9b2cqb7";}; +keystroke-17992={run="0h0ci8pslybspsnpmv73qml22592vp5lr50qqppyhw8qkng22gsg";doc="1ig565mxjnji3ng8vsc2wa3jyp6mrhma4hnb3shwnrj9g2kvj84w";}; +keyval2e-23698={run="05ssgrl08d55in1wkam99bfdfkjhjrda6j96b6nmj61sp97yg3ig";doc="02ajr27zgfjk5hwmqm05gdapkg3d3rk1k9k3nqm4nbvwhx5sahg5";}; +keyvaltable-65416={run="0r8y69sbis65hdalck66n5hxww7nk5z2psb5qzx13dx6qhnqknz8";doc="1lhk840aj1sxj6pwybrpg9gd3lm9gs06q1dhz399my6cds1b9bk9";source="1k749a0smf6wdcsb6cswm0adq98ylg7cq9yir410wkxyxdfwj413";}; +kfupm-math-exam-63977={run="0r5zqf6qxzbgyhg13xrr8qwqb5cjrik670fclh089qsz2kihqb6n";doc="1lxab23k08wrnpgjc68lcn1r41c793cncxfd8mnqxml4lyylfcwc";source="0c4fpj08y2ixf9c8kqzyl0j4hrjg9mrim4fg6y4s7mb4kcw0138a";}; +khatalmaqala-68280={run="10hkgjbi16d8y7wz3l4z0xzi112f124vzwq1g4kri7xlarcha0d4";doc="1jfqkbmj6lvfg0a3dnznlldb9aslmj1g2cc2yni0ramz4kpf0jf0";}; +kinematikz-61392={run="12h8j42d7m2z1sms9gl3jj0qclvqnximmbj9fnmr270lk59xlc8y";doc="13qa25hh33jqaxscc464j1xd778x36f4d2wvb6b318iq21s2qhh9";}; +kix-21606={run="0w5qaq50wki5b3s3j7p11akx7mb8z1khchhy6093pzzrny0hd5c0";doc="1jblprmz9vfriqdmi9ihh3ihi7pc9wf9cp8qfli89iir2xy7lv3d";}; +kixfont-18488={run="02zwdm6zja38n41pvzay09f38cam28rr9ag6yy1m5kmw8421xp11";doc="1dvv4hdgkzmdn7waq4djsgdd8p1cwq3j0bddgxq2y94pq64maq0q";}; +kluwer-54074={run="15av38sb3pzffxvrxlbwxzgvhnxhsjhkr3qwrlqswwq1sy4a2ssc";doc="1cx0xya0s27mybl37gw3yx1rmcyvrxnrp8c4012gvmqiyqyx4sjx";source="17w0ybfzs9x8yixzl8cfldqi42sq2jpkyap8i08mvp8krqgviz1n";}; +knitting-50782={run="10x5yxlrnj67gzd5kz7fvnz0nykvvi26sdm7i3n3d0si1vjzvczs";doc="1zm6s0rd3zkir9vxvbc37big9ygnyhcqpr4p306vqavvmf5g7p57";}; +knittingpattern-17205={run="1ydq16bmviqkbf9zkrlxsh33bfn8nmyzbbi1xwfd7nsg1bhdf6d1";doc="1x1bswn2sd1w19g1szc573zayk43zi3718a9yqfzqnxa0qxvxsqd";}; +knowledge-70609={run="1s4flnxixjw6z9w7sdhpfnpfj7lvzmjycnpzb2j3rxfafvzw8029";doc="151gvwqzkl2yxdzx2b2mcvfwb7w13s9m3c2y5vv4yrfy7wfkx0py";source="0r95p5vqxd6x9hbcflfq8d00kjvwk41r9harslzh9i3i5lfimalp";}; +knuth-errata-58682={doc="0rcyw7dqcwlnf9q421k017hrx5c0d9rra6rcr3n6wqmhxmdy5mn9";}; +knuth-hint-67373={doc="1fl3nyzsf9jifccw75grhdgyh5qhj4akkkyaa7mp6kpfznipqbmc";}; +knuth-lib-57963={run="0dl8z340n6m6xn7wari4hir0syxqi0kl2fhnf0bvnmkqhqwyzpca";}; +knuth-local-57963={run="02cf32f57fr6bngiv9xiw8bh4sq53p9br034ap74s80h3bgcmn1f";}; +knuth-pdf-67332={doc="0ig3ml88gqks5j9ly73qsx0kdii5m2i46f9d9bnh7nr9bjbpmd38";}; +koma-moderncvclassic-25025={run="0kgsbg4is158j1ssjwabicw38mh2cd4n1ggxinflb8i18xsmlgh0";doc="0f070dxww75g36il70gmrx9bn0f0d3mmh26fmzqb5zmf93hyhcsf";}; +koma-script-69755={run="1r2li64g7fk7qg4gb215z2q86by2f2ah9hjlqf0wcv8985qshnif";}; +koma-script-examples-63833={doc="1s95a3vgjxrn34cpcinkyr1yw2rj8s2973np71yxrwzi9dqdjpn1";}; +koma-script-sfs-26137={run="14qhq2h6pfjy878nkglbif7yjc12g6q32kl4xfc7kk3kf9syp0kf";doc="1cjraqcc13bcq451a36i5x2sbwj97zy4srrpaxybmlisvnza7vz9";}; +komacv-57721={run="06df0hx1rm87vgsb1g8b00ak77n6zs34c7mb76k22fis41qmm3a2";doc="07sxwgrrik3vadlp9a4lk3jmcqnvfzz5ir8l33zi7sjrapr7mxxa";source="0vd6ha60dz9ddmf3rkbbw5h602fkch3zifcjip9nyfs7wgnkg3r2";}; +komacv-rg-49064={run="0hcf3aw9r3hr01f9109rid9c1c36gmg9z0258zlqgq9l8qs0bryz";doc="1g985pnkhlhyf1285w9g1zx86vldyg45r4dyp1dq02pka5nf33fs";source="15v5y47jj0393vkikpv5mqdrrygs66b20gsmp03j6v6iih52w7fk";}; +korigamik-68204={run="0napq587a4j4z0fw0ddhal0h02aymjj92cbxmqrrw19j8k8g0b2f";doc="1lxkyaqcan6jxbvi1zavbavlycp8amz6qmah258y87yl08m8c475";}; +kotex-oblivoir-70496={run="16fs5k3n326amyf1i1bnk6bai8m9nhg8n22ij3rbpa69q0639r0b";doc="0nphzrlnya0mcqx878v8zmqaq0cw9ky2qi8ci37nx3rrzmxlv0qr";}; +kotex-plain-63689={run="0nri3fagwj6mgkcx97750khsyqf94dx5kxkf5ny0jiswnv192v0j";doc="16376wpncchxpsl57g7rgzl96w9hl3qyn3i4qw901y00smr450hk";}; +kotex-utf-63690={run="0gpdg9c7dqcg0jfq05i5gkvycskipzyk4cmfrncd8mm7axv9qd23";doc="0x0y67bn28fy32awnjyq2zy4gqnafyvbjkhs7hipghxf87p6snrz";}; +kotex-utils-38727={run="021hgi7iw47b3c637mk0g4v52h5ygx5w1060bpcknjlbg0qb09aw";doc="0l7dby446xxjwk7vl1h3w4xsid4dqd8zdspj1f457jy4qwjaqf88";}; +kpathsea-69121={run="15dldviayvv84gmc25nwnpc99d7z28yarzzwcbrqm9w9w7v68v24";doc="0gfnyniykcdvyn20fbwfvkx7i7lwf7kdn6117rkcjsw9qrspfc3q";}; +kpfonts-65583={run="0i8c7agc9zs1vzjq8w0ghkwk81hrc2qghzn7hs1wq3vdbc3wk4r5";doc="1q8h8208z0k19nw7idq45hmzhvsrnf7g3708ch3kjwaj7r9y5lij";}; +kpfonts-otf-69636={run="017zn7m936190pyzqnpwjzp3miw53ksrncdj4ib2d8czxi15491a";doc="1rmhcdb26i2nsbsj3r2v75ispg9w6hkfcnbvkg946d5wjy1x46jn";}; +ksfh_nat-24825={run="1qzn0n19lslf2qg8fvm844xx5k7s8a275a77z2ynbb0vs1w4prpw";}; +ksp-thesis-39080={run="0hcsni8p92pm3l7mi56jj7mlcv5rvdpzwbv1jv5f1hb6xyx2pn4i";doc="01pbmmwwjzd5cq4xxmx3fknk8d4q3fda3680g344g5s6ra5i45nj";}; +ktv-texdata-27369={run="1md2iv0csmr5f2mcdlb3lacccwifd6iv7yp6123gra5xcp06k4y0";doc="14sk7x2va8ja65a65fpksj2nd16v6rc1f0828gmm8j81d13cci6y";source="1ws256l59plnhmw1rycfznwpndni5i47liqhazddwbg2hragfahh";}; +ku-template-45935={run="1f45rknbzb3d3h72vznfzspg7vx9im59w5s5lwv4z0b4sk7n1d18";doc="04gpy6a0mpjhbl9h2rnflvhxsj5b7x7fwll8z211fl10cnvalcxv";}; +kurdishlipsum-47518={run="0b5x438l4m396pmd427zcnl7jyy5ag5c004gyn0n1zzwbz5lcnfk";doc="0kw9664fm4gzv7cspj2psczyn7m09qz95agn4j953q39l0qyz6ls";}; +kurier-19612={run="0x9270xgsk28i5dxp29r0awf72l5p0786mbx7gb5d4vppkf0v9gx";doc="1d3lfxixhcrkk94m7ljfcb90yvdwjbp2axjnpr2bbh32xv9zzsnk";}; +kvdefinekeys-53193={run="12nn74skhwiszbdhawqds31caz6d59a5pjmwar0r8lmk4f1jr3xh";doc="0x3h28xqgsmngs51m666mvxb8jg9vwk0wyhijcw84v1szyd0m7d6";source="13cb0xvqhz5w1hv6hamr7rh1q1cp6abqfsdqzd0xw0my9mxvwk97";}; +kvmap-67201={run="0ph45hs3x468lhrhsdwikqrw681y9zd3q0b5r088lrb8wsc5pd40";doc="0n0ls3c5w662f95yam6q6rh9gv0vdyzf7rmnkd6dgz5gl1z99q1a";source="0y6mcxixqyqmkk1iq0ys2i174ki4ygss62fx435lwm56xff7mvp3";}; +kvoptions-63622={run="19sj7pds5km2y284vhsvdddvchr2zcnzkki0h48ymd258afcvswk";doc="0yym68kqbmhkw15rvmz6bc96h17yiabx3lip4lq2qjq254j7ql0w";source="0ngbpkryyjf8l2gq0p750z96id32hl8gir9cxz7hybzk2vnpyxln";}; +kvsetkeys-64632={run="1gnc2b1fiapk6fjmgh1rfrwd04k6s30qgdfn2ppyf6fw440sx4b8";doc="0qhncqjx310clasz23bx9mq8p3kdmpz5cicx84a3afh008qylgsj";source="0l0g3v7n7sqfhpbf3289k9nh98cfz4w5xn0hbkr4i056yqj8dcmw";}; +l2picfaq-19601={doc="0mk8d082gcqlxw2x7d2w85sm6i51928pijybzbsh9fy2rfcv99xz";}; +l2tabu-63708={doc="1jl0n43bqbys0c9v0xb4sjql0gvk4r14ldzp2rbwzjsk8a39q8v8";}; +l2tabu-english-15878={doc="0dqmdr3lffhiaq7pg5pn6ia46miwq4nh5vimhd0qbf936amiv1mm";}; +l2tabu-french-31315={doc="0c6fbmgwv2adlxbhl1shvpa1w6xd36gmrwvkjgdp9xc3q999l4dj";}; +l2tabu-italian-25218={doc="0bgfmn5v80rdhs9wmjj6mki29p28ip1d29rmgbw4jh4z6gd4sf22";}; +l2tabu-spanish-15878={doc="1p83xflgv8x7nq9mylh468zn3hz5pv3zxprc63q51fwx0ylxfdbk";}; +l3backend-70027={run="0nbamj2m9ahk3y1j1a8p4n153fzczi82cw8i9kg45ki9gnmq91xp";doc="19s2pdih2pn41hrq51g6dhsds25w4vpynjr3bb4gb1ay2gp7c0hd";source="0cm1n5xqv2rlvr74fhnim8q70sfwqx8r930w3i8nrpaiivgnq38w";}; +l3build-69748={run="13sx0gjgdrnznd8h3gr3r28rmhvwgrmzpfl821p68sw91jphqdp9";doc="0miw9dxmd9d6j1w267ibxsf8k954aq8qsbfmyay1434s36aydgql";source="012grp1nkysm6i87y31zl2m0w01j85hb9c12059phjdrmmnp9x5x";}; +l3experimental-70027={run="1bh5xj7fxb89nizm2j1bb924p0ki7dsp3kx8h8wfzsdp1xr2b5k5";doc="110vv5yflnh873rcm75fbz3cy3p2arq162665h0vm07any65xwsq";source="183n75j6hk8kvj1xs0dy9br8ysvg457q1pxlhwvwjswykmf3arj5";}; +l3kernel-70027={run="1z4l5yvl59m3jpjgnpfn8vg7phpv49wy8mfy3z0jaq7la3c920ng";doc="0mzhz15fpdn7li11fpvyjxqi16kp07f5slmj6anpf0qrzp910zq1";source="1f02ay226bivygx4l01r8xz8ws2cn84fnlmgk2gf9l4irhd5dhg1";}; +l3packages-69992={run="045z2abw3333gcr4kxdg65s3fg4dyazc3spfhwbgsif8kzgzcl40";doc="11nkrl9iafxlwz9jriq16z75rwbhpyd69gmx5j8b79vc5vy0w6pm";source="0xirdyjf3cl30mr4kizxd9sl80cdfjrqww420hc4c5qaamcdq7dg";}; +labbook-15878={run="1qh16jjmpyqdfndfs91nmbfhwxif5ygk35zlsailngpgnp1r2x7s";doc="0za4mp2zq9s1z90sgqcvf6zac7w0wqbf8y5w1qrwmlv6r6kg3s1s";source="0w7nff8c2ffrn2ywz1dahd8n4cb959b6zf3ka0s913nv04ifdkgi";}; +labels-15878={run="1d1lxzif4f3qxkall0qzsn4lh55ljr45zba0xwzyvfbwighp1vvm";doc="0fl3as2lwdga814fdlg2pwyw600cvrii9hd0f4vscfzq7lmw01k9";source="0y6mkg18jqsbqj14h52317d1vvzvn3mv89q2gl4i3i89ka3dfajh";}; +labels4easylist-51124={run="10pfzxw0d856ki2krsdpidnfsk27mg4k0vj3jx7pry5cfirx6m0m";doc="145n7vy3d0vk3cq3qd44l3a6hjmazipm7wmr4aa2knxvs4nyvw2l";}; +labelschanged-69400={run="1fhmxc85w0jgcvbf3kbn6hpkyfl70q6kx7d06laxzafizga069pr";doc="1fbkiz4rqch0sa7xpw0i3x9dwm7vpvfyax9jvp520xh66sn46wh5";source="0ppwzy9p9zh0hyzh9kgvjav9h7pk3c7dp44aqj87vaq33bwkss38";}; +labyrinth-33454={run="1r5za0nrvcpmx7bbnvvxf4l78pv4ciq83ck9k9qh32pawv5jn8sp";doc="14405x5dcm2k4m74jjhwd3f1836d79qz3w9m1zfj3gnvzx2kij9w";}; +lacheck-66186={doc="1hhx65yd800bl3y2sq20lix60wd2b2j3k7n9s788mlsn8b0p7yq3";}; +ladder-44394={run="0a2sxy3rvc4w4a625wa000g4mjm00d8fpjff49v08kw1ddadv6fh";doc="16dg0nz4k3491mj7ccvw32r71vyjz2hdgdh4xgs7p3n9jg4jdp95";}; +lambda-45756={run="1ajx5g5cd5s9jqr4b196689k7zmlxmhhksly88qps31s7lzaprvn";}; +lambda-lists-31402={run="17srvv0v10mczvvmxr6sfhlr8zks589c86v472g4rnmf4bl4my88";doc="1yq4kn0nfcgy0qh33qakv7c12lcdzbj4x9xj357yn8c0ijqkx789";}; +lambdax-60278={run="0sr5im1ag7lzz0rkvnj0biik9z5ww6yr03ykn2w64dg1nf42chf4";doc="07fgh2x639fj8wb21rygj7yc0c7bcq4sm1bhdrsxzgrwjxn9rbw0";source="0sarj3dsqm18zx176p6hq3xv717fzdpvipvdlv8l5y5pcvasz73x";}; +langcode-27764={run="1hj7zyjxh64fax5rv32558sp2ss986fxx0fqd5xb9c07s189cs3d";doc="06bygnvh4sdv7mp17c94wx9v1lj4zgih1db6mknc3wiifi5jcx8m";source="1bi25gqx2yi8f6g8hpnqp9f52qnfpyafi0r16scap8w0sbnwrib1";}; +langnames-69101={run="1rg0hn4addzi72qgrx303skf35c03lslrlf8ry790kwr27i7lna4";doc="0ix2gk1gzvsk1w0r1whr2imdml3a6f9avw6yfkf54n5hnaxm7i6n";source="002rmwkvm5b4ay1cbxc51ibcb27sg571l2r5czfilbavh0000piz";}; +langsci-70028={run="1va10za9qfhdmb9c652rh2n3qyp1v6pyjc8aia7hndik3j3p22f5";doc="1imd2wlkd8k4wfjangq43mvr4m3xj295vrwmqjya4p0jhilh13ya";}; +langsci-avm-66016={run="0xnprm5fcy8knxhldl54c5vhir4klgsmmy8l9306hmlykmphwifx";doc="1s5bjwhdz1fwnkvnrx7f4789cy0f2l0qkixdd6va6zjvylihzl4l";source="0ifsjndp9lf06anqcl79kp7rhx9gc56yw5xsr4lb4fshzzg6jwnr";}; +lapdf-23806={run="1lfmn6axzbfk03j6f12yqa0vy3gzvw1ylpq7k2ki4prb3zwhx9sx";doc="0h9wy3amir9wdqv0b8678mfmcd172zll9p5v7sf1l0w3zlbw5msy";}; +lastbib-70377={run="0ml8h5s22lp4bbf9prjjdgrvsahwaksv1kpnln696gj1g3hqh63q";doc="125h4563c5rny3rbizb6imdp1r8mc1203jkdzzw0p9113lmwliq6";}; +lastpackage-34481={run="0wjpjd3b48fj4mqqdx38sqalbaa9ab3c6rywyjqhvrd1pxfap2g0";doc="1123lz0ki4kww93952wqrhrw9l2cnk4wrrwyi0dxc5w1yfn2gg87";source="176fk84mbb6w5ql94381kz05lh8q8im7ri6rfjff7f4ymfjnh2jk";}; +lastpage-68557={run="0xds81j9i3dqbsfw9084f0cqmscyapcndd6ssk0njgj2isjxb43s";doc="1agaxsy82b8nq5kn6kpjc4g59xzvalxpim6rqzl8j13ywvxv6vhr";source="17zk90069n9nc2j4jhqwzkm9kfhvp7wlq7akvwsny9fk9vrgp62v";}; +latex-69443={run="0l26rd0xasdx0lyzzkigpzv9i786fk2xysa1y9jv3k62lv7g7xy0";doc="1hylcd91igvaf4h9z9djlmfy87r8mkgs75slh3clay0fhhyjdmyx";source="1jb6is6qh5q3pd0shizizn0czk48ggrw7n27ddpakxcmi1s73aa4";}; +latex-amsmath-dev-68730={run="173gm8vkn4dgwys9h7yq3zv0pcazxvgrj40ax8msmmffq2r8cgzc";doc="1ch147w7ak3al37ivkq46capg7zpc5c10inwkcmqxhk1bqa0cgis";source="1ffzh866cdx9r8b5z8vyiccxvramahskv7an1jpi6flg0b9vv4i9";}; +latex-base-dev-69872={run="1sflchwpbx8g410b4jpb5i8x7ca0x5kgsa9h910ljfaivwwxs82y";doc="1l0sam4iqndyycsbim6lii8cj9mx465vk4f0jc698c5lrb9y57vi";source="1h579yskldcwyxp0r4xdh8k3s99qhy141gblrw1lracfyj8f44rm";}; +latex-bin-66186={doc="1mhdc8a37b9j64kc8c8171s8p7ixklbf1ijr4vfh7af2k416qf8d";}; +latex-bin-dev-66186={doc="0dwjlwaf8pxfjgby6dwr8ijnhm85rvprapm8m85avq7mnfmrp4kr";}; +latex-brochure-40612={doc="0xba20sy8q10ac9hxwnz9axh853hrj06vp7mfn12ajax31miznmy";}; +latex-context-ppchtex-66687={run="0ai8w4r3lagkgval65hxnb8fqg8lq0j5kailyb4dzv2fjs9x0sl1";doc="1wbgxydjicb10mnzjixnz1hhqy4xzxv6k92wf7fb2w486mh89k5s";}; +latex-course-68681={doc="00s521wrc5gqqs5jvd1ljl04nighy8q79r0ama783ic27a3k0qhi";}; +latex-doc-ptr-57311={doc="0mamlfnxzi4lwh5cpss8zcfr64jdnf6vnj9fp48accrqdj2rpfs2";}; +latex-firstaid-dev-68730={run="04rcdqd7461r54qhn3v13517clirbim4lnghli6yn31zzyf83zif";doc="0m4jx0qiscxszpk3c6i4r7pcr9x8xdq30q1ixj4b3l2jn88mvhlx";source="0m7xdjy67arisi0l2wgjvc9i89g2xdp5gk5cjqshb8hwxjw21mg0";}; +latex-fonts-28888={run="0dh4kgy4mfarlsrgqw4dm5zgfhcfg9qzh8s2wjk6w2g0jfc8rf3v";doc="0243qbrs2w7qh17nh8m4ivj35gfgxsnqxza281cvhh7g2fv47f5l";}; +latex-for-undergraduates-70210={doc="03s686vbzpjv71vlp5931vxyx8lckvl5819agh4688h9m98w54s9";}; +latex-git-log-54010={run="015f1jrfnwr7i7jn6g0cfl3zs73xw30h14fr2pyjhn9pr8kd3mgi";doc="0pj2834ax404f0nnlfbg75f2h80wvnz23s8nr9vxr24vr745xpf6";}; +latex-graphics-companion-29235={doc="01zs32gck1sl9zlbhghyjmjwxyvw0jha5vl2hd10knyrb3z4dhxc";}; +latex-graphics-dev-68730={run="0gh26h6lpv14ywhpcbw9zkzn00jqrxbfwsq61cpvb6in1f7q95bh";doc="1cyx9l48nc60qdaqny9mi076cch9cc4f3qpnp9hxr1rm7x712vp2";source="0ng5gd50c7rg7pv09ry62j8plpn4vigc0rjy0xg4bzfyqhpax86d";}; +latex-lab-68720={run="0hdzvh1affhjy4r80x53gbhi1pqsjikvyxrr985pl1slzfrlhjbg";doc="1aqwxllsrwijw6rc98cplkxw46s61dj8gz2q07djjmx137irvkcm";source="0zj723bpg0ik95sjm97kmvjp3ygsf29lshpzgljyqnzz6z8ppb0l";}; +latex-lab-dev-69872={run="0pqamivil6qcl3sxp7zr4h2m4sdk92mwri5jvz5ab0l8w89i6xjl";doc="0vrfpsm359zfmqini6s4m9cj97d30xl5vnj63nkzxk6nz3pzgk9s";source="11fdf8f71mdwx1lrj8j5vj2ha4xjmi8mpw0aa2ii0rad5iwr8wyr";}; +latex-make-60874={run="1dgw31znxh3ch6xyg7y0ngnkjmpny7fbq9nhapd3am4l6qb0598j";doc="0jmms953klgv8z4k5d8rj2l5barwxx02pmzk6ihpp1wdggfjxrfy";source="0a5jqry52x11iga5ky89b57l1ww0hbl8z0mkkv6nvvc7bg5gg6w4";}; +latex-mr-55475={doc="1zd948d9y63js7980g2bvxpf67hshh2xa3n2ihbzwhpw6l9cbh1w";}; +latex-notes-zh-cn-15878={doc="0w9rmd7b5fnfvix653n9vbnn1k8yxlaaak79ipvm8p53dx75xfxd";}; +latex-papersize-53131={run="0axx2lkwi1xq3qdaazhb6i7dssx8q2k0nm5vf4b9p5ldl1ky0dzl";doc="1dkra9b0wv8s4f7xn36j1x1p849ziwlm4chf5mrayp0wmx8qshc0";}; +latex-refsheet-45076={doc="169h1syday30qiw032k14fhxikdwszggvqz8b9ga4i9wwxf1vh4m";}; +latex-tools-dev-69872={run="14jwblfzdf6wp3gncild8qxw6nfdx5a44nb7ngbwnkxr43kq2cx4";doc="05gwzix6l3mgwm9qwjkk8slrjbvnbzpllv75kxbnrf768jjy35px";source="0s2bh7shlafm3fq608gggfxm9ma48bkcq6kamqfii7iizw3wsyb2";}; +latex-uni8-49729={run="1sv4n2v0m3lck7x320cwbay23k7r9fh4wm1vxg9m4grphc72n2b0";doc="1y3p08mni1ng6dyp0g98in7hh3mbzqq42249idy90vjhc177rjc1";}; +latex-veryshortguide-55228={doc="17i8zmr7mjfrx911psdy9cbn05c5inn4ixqmnjkpr9sbgsninyc4";}; +latex-via-exemplos-68627={doc="11nhv72ixwr0g19nr7dir5awgdapxq0l295hm1pcggr62wqh67l1";}; +latex-web-companion-29349={doc="0v018lwf88z3qmzyqpyvfql7dbwk5a9r0wj3jfjc9cp2ksl8zf8f";}; +latex2e-help-texinfo-65552={doc="0rk69n89hl67qfbi5mmb4msaibychsk9a83dx593170ayiir6s6g";}; +latex2e-help-texinfo-fr-64228={doc="13s0zjwk3m95kbx4qrz2xwp8kifzc2zmasp1ks9l2acf1nqfac9p";}; +latex2e-help-texinfo-spanish-65614={doc="1v3wa99phdmsiajbq0ad4h939cpwjwzpq88h6s0796h5fr34hrvq";}; +latex2man-64477={run="04m5ccx6z8nvp6z8dm7dqhqyf8h9snmaz4cvd8i8fcwfba9znf9c";doc="11nl9ldkw3f90iz8r23jbgxaa6yq5p61f1db344nfhy0wimx15si";}; +latex2nemeth-65269={run="16fd74x6bz4zfj2zlvbfw160684ff1fn1rkpx4y34avkp0ivs9bq";doc="0f50qxbwcas2gpazlq0ja4m6lcbwkkwlp19qb2v1lflfgian39c6";}; +latex2pydata-68919={run="1zn2qmivr0daldqnrrkh8jcb0gncg3cnikkrrn609jp5sb1xd1hp";doc="04rp8hycz6r4gl1llvxq5z4ks9iy4j47wxg6lkx39hdphh2q561v";source="19nsm6sn099cm2g8bvks0d14fdqfvs43cmphgl48rhzgaxb6l408";}; +latex4musicians-49759={doc="1zvy2pa93kyn056d5n0irzdq5xmzki6d35zxacxfy19r0g9rwq6f";}; +latex4wp-68096={doc="1a569y6vss3glz1il4hg2f6718mj24spp4ahdj6v7k6y7ppa1zii";}; +latex4wp-it-36000={doc="14r86fwhb9zafmyv05pqfi9962dpxj7wq94acm43gv8m2rsjp52k";}; +latexbangla-55475={run="0jh2x97r6j8lrl5kq5m4bvk139229fwf7r8g8xq7n0qywnfdr9zh";doc="0hgcqd8vqq67zzdn7mq4bps3q56ad3nmaq71mkcyricgrkn5xxmb";}; +latexbug-63596={run="1rv43swr1nqnf50y7rxbqw2w6402rlksddk5prcl7618vs4yiag0";doc="1sdmjzl81f0hkmj9k0m57fiw7529ym3430k5sd1q6sbz096wwdph";source="0a9012p4c07g15ysgf2hfqzcll6h5riajylxga326p65k2zv062m";}; +latexcheat-15878={doc="1383rsi21ma0291asi779bjr33m7fii019di8gv8kxwgci692fz0";}; +latexcheat-de-35702={doc="1cpqcvqkkyb2bf87yjvc2migxawnacx5mva8dapma7hmwx0z7rhm";}; +latexcheat-esmx-36866={doc="1d6nk9p9adlhgr28mnnizrxzzqlk20zw2clcddqlaa8pn73dqhcm";}; +latexcheat-ptbr-15878={doc="0m636j9gdfpm4j1b679z5qw5ygbm6jp8xl9dzy6v5zzy695fcgaf";}; +latexcolors-49888={run="1wpa7vw8vphdghdv1ap5ilcgzj5n6vyvn4a6lfvswg2d47s5y1a9";doc="10bbk7bs1km97hpzqzzfasxzp0w202y8w7pwyd465ygr4y19wj6l";source="1j7vfvyj2k4q9drmkmh3mfk1g3vs7czn1x16fx9jyinbdxnwblnh";}; +latexconfig-68923={run="1lq89ycfsv3bl6kb1lq4s4808pvld02qmjmyz3npaqkwjrxhyy3g";}; +latexcourse-rug-39026={doc="027siznmshk60flxgra7dgzvwbmgwvckwb6r257b91x3rm77anv5";}; +latexdemo-67201={run="1w95ji58dylfa3j2crcxswx058brjx31x6n76wlj9hjv5dkarqj8";doc="1jsszarq2lydblwkwgachhhr2fqmabw870w3msgrllyardp7ycrw";source="0vi6b642k5qjnwa3igll67w0h4r3p7bxxjlajfiqwp06pxzjl7in";}; +latexdiff-64980={run="1z0x59j9g2cmbfwfmc87fpbjy4hp827ic7y9z8q3j7kfh2s3j8dp";doc="1r461j9m6rs38kim7isvi66z176fv1nnd1q8p1zza9b1j1qhfr97";}; +latexfileinfo-pkgs-26760={run="0lf6pkxjqdilg10i3fwmlb1nvvag6c5bm6pbcd50jjbd1q39iih0";doc="0qh84r86pszscg96gri652y6p5xx245lfzvx50qvzw77xn4iv6ra";source="1x1sj91sd5bb0jihvp0qg52q8ybak4flvijj5hdq84jf0bw3gryi";}; +latexfileversion-29349={run="1yy159skv29hp0qxpghmq5zmay9yi0ndkgz7lbllj1ymkgxs5138";doc="0k20c2kw0xarjlkdhjyx9h9kvjm2f3rd98lz097xj8xvk0fs0zp6";}; +latexgit-54811={run="1kg9cbz6h70496snqqa2h9xfknm70qf96xyvnc829k5v34jskmi1";doc="09rlc9nprx6590snfg7gakycsam37wmmscybvm48vdn271vvla9l";source="1pn4gv4prwsnnr377xg2x3kf3kmi8pxgczbi9knzavkd53653akx";}; +latexindent-69472={run="0s5idc6p7agbmhm3qq86lb4p357vacp4js6fbqszyfwd1wqp86sf";doc="0y102g945jyr2cg145wkpmz68m62cjdpv8r7356lr2pvmp4pbqky";}; +latexmk-69657={run="0dcbl9bay800kvbp3jl88d6y6w0cxlqrvx0y8qq8dqznd082dh3d";doc="1aljwadz6jhi42axj5ma467pihz5xdp1w3s86r2wdqc1n8l0rm6x";}; +latexmp-55643={run="03rgabck8mcxnbg1avl638nhxdk6smvyd21v2ns61hx3jn09cpv5";doc="1ad9axqv8h2s2xckrdxcnl8kazpgijrgpxmbwsb3h0hqb3liznsg";}; +latexpand-66226={run="1ky0z3k9lwd2815kn3hxpdhcc92spp4wadc5s4hhjdjah50b6zpk";doc="1za2s4qvkfpqg2s86z33y85lw4vbi5ll52if58dndbg47mf26939";}; +latino-sine-flexione-69568={run="1k8inj0rl7mhsjyzc39w789jlafqshh9sgy99szxqbs0jilgfb78";doc="1wccb0ksrrysqjp68l3wnf6l4n3s64ny3cvxiqgalrf0mlfipxmi";}; +lato-54512={run="1w70dgmvcwm9jff2ap7s78qgqs9ip4a6dx5wz8iyd7hn2mwf1v80";doc="1fj4n1y16x7hxyd63myk902iwm6lr074rkdybv03qwxl12p9ykxs";}; +layaureo-19087={run="0ggab1drpspvqwkijlj2d7k1iwacd8bihgrj9qvrmsvdlswdjsd1";doc="0vxa87pk0fq67zlnbzbpnig221isp1fy6qp30fphk7igvnjw8v70";source="0mdibdz7hawfmc6bzvk3qfhs22pnmsnvkvvag31p3b4n25zshmry";}; +layouts-42428={run="1ab9azs06k1p0s3n5zjhrykpqac9fi3kr3w31xmh698zpsg3jq4c";doc="0ydpj4mbjyg6qy2wmj90rqfpkcq30pws5d11kdr1gcwbzqqkgbbh";source="10mfwi1wv5v0qdwqj1mh5q8izgavlhclnz2aj8h02ijy4kzgfg5w";}; +lazylist-17691={run="06p4r8q0a0m7pmbbcddxn5xc22f9zhvl2a9q0iv7ibkvgyy6pqja";doc="04x6ai73z7cqs7k9vgicxfcnvslr5812dlzqrspafy8w8qfx37jy";}; +lccaps-46432={run="1iy7ijsfpxcfr3d824j66ahcvmc3p21nl0k94x8bhfrq98qzxmrp";doc="168yq8y5c31d9h31x081wh7aifsq0bs66cvk464wciy91sxyf34y";source="0q3jn7h2b1dhdshdj3gxwwdg3gfrz6n5c5sflacgpzc16pn9gbca";}; +lcd-16549={run="1r911gvxiwwh7vvjhgi034j3x49n2dxxvf38zsldmqaj4sccfky9";doc="08id9jhafkmhypjy72d79v2yr2jgm6pjf4yhaw5279a4063a4f1r";source="0vkgnhkc1774d3g7r6sv7km81dvdrbvzdlk7jca6q40nnqw4zbw6";}; +lcdftypetools-52851={doc="0yjbc6rsf8c62qa1lyi9kjyjy2p0xlps19llnvly3xyhla08j76f";}; +lcg-31474={run="1zgpbj9zim5dcc5c2lf6hy33hzzk8cmirqh8kv60bsvha4hwvzi6";doc="0fnpj3mdxd0v1lrkp2ywb184bay0j6vc5m50jlnipjfjhry68n15";source="1al9wmw475g30jw8lwx709r0p4lq6p2p9n1ky69ncyy42zp79ld7";}; +lcyw-15878={run="1c0js52z8mgfbr3lgbvnhc646ggvsvgr7w1mq83lyx0pvnlqm3aq";doc="02h21pl11ax04q5psazgxpm6xpb8lljm4b08bbmivpwbm0z1namn";source="0zf06l74fzlici5dzm3ggvz3h66dx3yjxmb7qz8xlsk5fppyhcb4";}; +leading-15878={run="1ky6c51dcx0gsj8f6zrwb242d940cjml0gb258ags5xi5iaq40yk";doc="1l31zpglr1bz0gif3w7kqzhd37zpcgjig2ly84fcyk805sf7nncd";source="0f4ayaz2m0y87ifddl4622rpf858zmh13xafp53nh96b8pyvcip0";}; +leadsheets-61504={run="07w8h1wv322dy0b69d13b9k59m6iid53rlpn20ps5ss2j20b62z3";doc="17xbqxhmxc39gxd5ckvzsmhiabsi2afh2r2jv91im8inqfqi8j1l";}; +leaflet-56878={run="04fvi31wwpsnkpsni3r6f9m3vr8b6h71f2znb79aban9g1qvnyh6";doc="0f82hm37i7w547jpmxkl8a2k4f92bw29vdzq4ywwllk2hdcq3sv6";source="0igkl1rjl14raf3xv631c7sn0mc1smyc44mldwgzgnzxxkv5kzzf";}; +lebhart-70050={run="0y9lrkscmfjsg3rbcwbfvzj3g40nyb6a297myyzmm2n0lpq11j6b";doc="0nypg814pxlcpkd0y3vdhjk6vpj4j1ka08kkkk00nmdyyy714f3q";}; +lecturer-23916={run="0alcmds4ds3m0rpq6r46ff56x78kv0nbdnfn80s9q638pf1vvnvb";doc="0ksqm6ibcakjf2dir19hr066gg2dxa5blfiikr1j8x966lfdjb09";}; +lectures-53642={run="0qdhkf7z1rnxm2ql0ywfk11y3aqp8yr1p9202d4ha6729n5pyima";doc="1xakcm4mmhl4ahnvcpn7k748v4j2m8p6d4p455claqhf7xg4jz15";}; +lectureslides-62292={run="1x61bpgp5ddgld0v05qb5sg2lwb7lzqn6r65imshvcjz1xbwpvdb";doc="1awy6zgj393q0lm195hh8ky51fczm5s19d46fc7mivxyh03w3wk6";}; +ledmac-41811={run="0ipf7h58bylrfwg8yzarqvpkl0kr4k3z9hl6cjzxwlh16s5fs76i";doc="0pgkv08nsq0rmcpck9vq1hfb4gnfqh274hclq4grk182fpn4ggiv";source="07fl3lypnxz7sa4kjf3xllwqakhrwgx8z8r7l6x8id96n48zri9n";}; +leftidx-15878={run="05fi4rp3s0s9ank7pphdwxnlnanc2r88dxhyxbz64fb26sja25gy";doc="047a5clwf0r43r1j87k2zfv0pa3nrii213y0zhv5r3zkmwvm1qky";source="0a8rzkycppx8qayqw3s7ndzz2xp4zqgx3qd8dp9s5ynlm10020nv";}; +leftindex-69660={run="1hc88b88fs7247n9q36idpdsh1jb39d92sp5qr2dky27fgvnz2mr";doc="13lfzvsai75nyb1xykvd8bd0q7dpwb5na4afb7bikqw6iz3dyhwa";}; +leipzig-52450={run="0wml5k749fgx3vq10v4vc970h6nqm6qflg2z4jajph1h38kj2ryf";doc="0znm18pkrf592jfgshmr0d7vk4d4yq4wvj9hqsfg9nrjd4l6a66x";source="1sxqsgahdr0srk52iqdacsqn7sc73iv0n70nsnpvgfsczmxa2djj";}; +lengthconvert-55064={run="0zjyynjlq48sywr5gyi6nhryrp8hcl41q1djjp73ingi2h2svz47";doc="1id32l1ipcilhkk4w9w2q8rfjlk99f5jphvq1hjvqdnhz4q1rk69";source="1zy9bnibswz834k24fk5srl0ahx4i4hlrqv6vnvwb3h8z71izc3b";}; +letgut-70496={run="1xf5ac4vmmfrqgla5ap33fr24f38wiyppi3388zwzbn0rlky7s1r";doc="15z5g69vwdlk77hbkh8vsk07zazapjr17dicmz2wkhgrlcs5r296";source="003213728r08bl0nh5yplm02sp6671zb7l54al8bqqq7hyjybnlv";}; +letltxmacro-53022={run="0p16zmxngzzp9hbg7bxrh087gxj7hg4avf4a9akjkg56834hna5h";doc="1gxldiflxvhy6ca87f8z3a3zzisrwz6f9vrx2r9gsfw72jyfa99y";source="00ykjx412119jxwf1zaz5bismfr0i52psf5fagdiybbshs5ac88x";}; +letterspacing-54266={run="0ry7rri76dgbrkzr6na2kkh7bn0jpwkhh9b5qw0cl5xwyp81rddg";}; +letterswitharrows-59993={run="1b7d512g9gma07n7np7f92qqxijxs2df4h0izq5xffd5jf438m56";doc="04hrchgbm25b8g8d6ywchyijngk42lh7z5gq2g2hnddl7wp79kv3";source="1jabbydsy0xn79p2c9dg605kfrc6g3c25jz72hnq1ilpny9zbihv";}; +lettre-54722={run="13h1jsgjp5k82cq4rpx8gd114l49m1pzplksrwjylx0bzimlzgwn";doc="1w82fhhcdgsxwsnprx2p61ygsyh525im8j1zalcw0bji3i6pm06i";}; +lettrine-69508={run="0lmnac32n8ip27yvwxk072k1wk9v768gsm6v06bfjhr2kdpd52v8";doc="04369v85mznfrfqv6mkcfa7vp9s4m2953qb6zdv5flfp8paj3fx8";source="0zr1csklrxxs26641g5jnhshj10igxyf79qrq5qky7cvlli8v6xq";}; +levy-21750={run="184jkjwm17ms75j86njpkr17ipcamca3r5l1fcg8vfv00ffj9fp0";doc="1wbxdyfxm80w3h8bq8z5yavdwdbgccvhf4hm697ss5yshp7l8gfs";}; +lewis-15878={run="0ws9vk38j3m0sprl9lak2sjlq13nalcysk95gv68h90x04jj5zdl";doc="043kmzddal693kl6fds0xl2wwmyzvd9cqs8dmy1jzp0mdi6qw6vn";}; +lexend-57564={run="1lqqn007dpp24jcgpn9fdf7ysb99lgrz9zxjw27qm2439wrzhc1w";doc="1h7s17x7grhdb1hxxg6wql3pwy1w08iywpynymrqn8748s93yy4m";}; +lexikon-17364={run="0ql4hzzf94v0pxr0jma4bnkgh73napz4np2zd1jhfsf55sm3axzd";doc="0fbz7v6a5pw20p22vyx1mjdr4z39wgf902ph9f9nwawxwsl24v9a";}; +lexref-36026={run="1whic6s54279zypip228xyw7da5iq8p7lw090z71d8nywjsgllqm";doc="1vqygg7hqn64d3dxj1sj4nj37k3w7y8r23d8l8x0lb909y285jpl";}; +lfb-15878={run="080305sym5mppkmgvpxw3ddn51c7gh07b5b9vs2qsikv616077ml";doc="1a5y79xx9fw1mcinbkj7wv4gmvb2gmlm7sbnxc07603dc0lrhjww";}; +lgreek-21818={run="0ry70b47s9bn8ixcjzsj0qvyvlbava2dn2jpmp5nrqqycihb6jvp";doc="0r86kjbayji1cha84dg37ajn1hnlidyw3cf4byq3x63vyvx0ag3c";}; +lgrmath-65038={run="0i1mag3077fs18xyznbgh3mc87sz35ihz4n5yp243h3c2qg9kyax";doc="1w9y3pqfm8df2a20n6n5421hhjavg14y60lq97bib2py6drprcpm";source="1d3ssx38hjg7376fi34rllpzkj8mr54nw8p5ss0la8fc2j1ac4ra";}; +lh-15878={run="1k2nn4zpxdgj3b10xdqzldcdbw56ws9735wp0yajkhxl72ms0705";doc="0zvcl1zfbn7qv9069hff2a2r2d33xmqr31l4di24y4p33y3ylprf";source="040n2hbkaypam4fhyb82ncy1sfyvg7fdhykw9fnvy42mlzxv1p3y";}; +lhcyr-31795={run="0civwbn156gky4k51189s9lpqcs06wjr32pviwb1gzsfr6rc7vws";source="1pwlcsilza9f2f73qsvbr2xxxbs2dcms08jxjlnpk8fxcpiy8j6z";}; +lhelp-23638={run="0j55ilp7wn1w8vs60k6iangc9h637f2jrnpshh9glryxj9jjgxqn";doc="1is5s8iqyb41fr2hr1kxf68xrlb8hqw3v1fifl8645dcgp8lac33";source="0iyp664cy3n04nn4499ryzx00sr1iip1qmdlpvjx010r7hq4dyb7";}; +libertine-68981={run="19f8pki8i0g10z2sbwahyixcmwixcri3i5wrq3bx1zwbc28fwih6";doc="1mz4lgajz9ij54sgn0x9w2y1ng49hdc9v967ybgjivdidjsfqkhh";}; +libertinegc-44616={run="14fdpxgsmq9dhgl2065rdsp0fnh9h0xcr0jzg4k5gka9irazxrzx";doc="0isvl0ghjji427p1fd1w0yy04c6zjmp058k5gkpsa3xkhq3ijvv0";}; +libertinus-61719={run="00f4wjqqz4hqh2ic8g162mnn95s0p2v1qshbm0zrnzjy2gr51hi6";doc="0zkv3fgkirq6jcz7ywb1sjnnw8vfwfgd3y41lm4ds547ra8zp2q6";}; +libertinus-fonts-57948={run="0izp1qihx1arqkgbdp18ks0xz7jlyd5cc4r3d5nhdnpph1nry9r7";doc="1zn6nlpr95syxmijr7w0cljq21qfv09b2rp8j6n0rvyzm50gc4fg";}; +libertinus-otf-68333={run="1gxgz9lgiyw9n00ss64bb5zghzb5hzli6s8znkaq6fcgnvaf5ra5";doc="08xig7pz9322x5kz8l4dgqc74hsdzrhnxp8kz577gbkg8mi5rsf9";}; +libertinus-type1-67450={run="1brcmv3j109909q5975zaaf7slnzqcflfqzfmxvbaxychwm56nds";doc="0v352ny2961inklzfc2jn797f443dmp7hk0wn7s9dzqnim8rsr60";}; +libertinust1math-69440={run="1hq3fidq0yl8ahr80alj0r66zw1ampgxs3j963jmhcdh1jby7ih8";doc="1vlpfnmv0d8bafmh0b4szmrcyrcjdx527ik6n0lvqvqh768jwlxh";}; +libgreek-65004={run="1wazhir2i0bwh8744867akraid5cz629yjj6aiipxm6gjj913gy3";doc="19wbh1vjycvplflzkb79dr3ha2115jc8lf0vjrxx7qvnjprygs8q";source="0d8x32jq6fcni0g5qa0hcd3vyxj5fcqa9yg3m2bfb049p5ms7s40";}; +librarian-19880={run="1rri0fb9ssj413w1g8c7p79hn72gqzncihhhg3ws3ldl9s3nm54d";doc="1i4m0gp38f64y59zcsyg2j7bb6zycyf9z5yr5wf86l6kh40cc2fq";}; +librebaskerville-64421={run="1d98h5gyymci1vny8877pdq7nr0vvv8878kcbahvkijyn5gwwdx3";doc="08rds9g231kqmka2dzv03sj9dwnrh89rhsbfqffpzrwsfc4fqld8";}; +librebodoni-64431={run="0w630a8xgw6qs0d8gw8g13slxcslyizi0mmk3phyvhiiw9km40jp";doc="16ncr4c7w0hjkrss4y23qd2rmd9c1zv1pyqgqqc1rdi7w1kjhinq";}; +librecaslon-64432={run="0jwxqjic9p2k55g7f8j75s78rf5bfpcgbjsmg36qk7m9zig2v9im";doc="0rj21fkpajmc4gyr5bixf4v644kiw2iq1fzxs6fn91fcfkwdd2dh";}; +librefranklin-64441={run="0g6vlivwlwb56mm9a509xfssp11ir60cvrd9cp2hv9ym93yqkcgs";doc="1gvsanhdlbn3wnx2yq7brvzh7wj4nwyvdjybkmazlb6ih8ribab3";}; +libris-19409={run="0nprmwx67zbq7xhjbb4xiw5da3i0k958zvb3z32s71jdd6psnphr";doc="1vg5jgllfxh3rdqjvgmzn6ak887ar7a4kc1k5cwwwgmgdsfam1zl";source="1dfm4q73p8q8bgn33z025sgna1jq428d5dvmfagjjwc7sjd93ncb";}; +lie-hasse-61719={run="1bqc4gpk1f5b7afsqii6ny1xyh4zpc5347v0xv618svjh7dpyzpx";doc="1jfrig40w3ac4j6y8aiwjyvsv9q8lvgvn1977f2yg12lsjdzcpyg";}; +liftarm-62981={run="1g1v61iahjd67fjdgr6d6lag9yjqvix0b7m2aw1gc9bjzlcvpd8d";doc="1pxhbcg880vnnmaz53ifpiv17jsr66i81nzhnb80d4cn5jlxklwn";}; +light-latex-make-66473={run="1rjnvx04hcmiwzqg9gh1l2w0vnj0qfm22snjzm9hi7i3sj1kx2ja";doc="1mjmsg5mgz3fyn6v65iy75jz9jvdv4bxy8lqsgiifv1c5660lgzb";}; +ligtype-67601={run="1xsdzgcbmn1djpvsjak0bav7vvaa94rc5byhvhajfb5npqrz2rn2";doc="1yjsbj3m44cj1lzzgxkzl1wsapqfcjh6dfyaqi971k79zh9420vk";}; +lilyglyphs-56473={run="11mb49rcsi051k7yd7s02k9ca5g4mmifdjx1nqkvs6rl922wcyki";doc="1wl5ppgazb27s3wxgmz1xw8cwwmnnn0s582k5swx8qy91qdl08r0";source="0657barhxkzh3jj3b8rk5rl9i47k2h0p1wa2vxj00fdfqfdjn161";}; +limap-44863={run="1hdv2rlvxbqm2wnn3x2xrmwxpwbs03qnlfj7k1s8mfpp5smmhd2i";doc="1qj9ddllgvm9zqjvfdgg2sfdyfzpp8raf8n1l0zrg9vpiy2imdn3";source="0l41pd8xl969ax257lrcnkxs0pzb3q1fmiy8ijz9jfrval3rqqbw";}; +limecv-61199={run="1j1j3n86gvvv8jc8wycmjmnx9ci9w41w38fkxjsmx2mvc8frsi2z";doc="0d9gg2gf16pynh395sfqyr1bzj664snv54x9bb5a3zck3b9kbga1";source="0m0li0wa9pk2p5m3gqzr7n78qglz68akw7f5nq69iddqwh5r827b";}; +lineara-63169={run="05g4pmwnwmlh9zlcn3g2v5cpxr0pa07xr5kqnx0gb3ij32348kz7";doc="10bl6r0sa41hnyf8c6hgwgji33jvj9zy1k39lk168xv2wzkarml8";source="1fgdbxkgph3x16axccx29llckvankl51izxk825jswbgsxgj52j4";}; +linebreaker-66639={run="1v23krvl4nf8pz1p2hl7d9pj23c6c8zw7hgcacyjvzd8sc22jsi4";doc="0prq9r6acl95w8cjrmzxlg3hxiq1qmivl0sgdcva6992smmls68p";}; +linegoal-21523={run="1arnfkijq4324jzyq2sn681rk9ncbgv6zqfrvlbs3vic8wxj5c20";doc="0mjpbkf6vw0n4ddd9abrah7rxf51gmgayspy6jpnai1wrzv0aby5";source="18v5r4hj2jpqay98njcyijwvrbc067c49jrhja6i52ddj6h9q4wz";}; +lineno-67171={run="0qgm0wlsq04w8cq435px8fxp6p9k064i7j42dgi9xx40fzar0k7c";doc="0clfrg91m97ija67d7ykd3yp8r2zng0rl8hrhdi5hay3b0wfcs4z";}; +ling-macros-42268={run="1qr7bpa2wcp1hqx3ckid8h41lp8idhqqnnbdv42j2nhcy6f409wf";doc="0lk4whkamzsf9mriiz06ynpp962w5473ppf4n36q3bb13amyp5vk";}; +linguex-30815={run="16rqzqipzng4xd7yz3i6416231cfphqbwq8n6pfal83awzd660jk";doc="1l0m6k9adq0zr88zbqrj4jl286mwarr6fiy4181bwxm9w9kkxs04";}; +linguisticspro-64858={run="1aq5sz202hipjbimm2n8krb78q54ybjyxbymmv1nxdpjxk0hixz7";doc="08pbwqz6rqqmw814c54g124h6ni6bpb39gpd2ibp5gxn21agqa2y";}; +linop-41304={run="1dff205vbsayq2jfyk0vvbz5yks6gy2bm4ylwwk28wmi55fqjycp";doc="134jxv5bqklpdhd3wfbqibsp21jspmq9iv3fik2igwsbn20dzw4c";}; +lion-msc-55415={run="02xxyl35xl6c48x0fdlfkcv4bfhz4hghp1v3ff6pf9yl3cvqlh15";doc="0nycprcfi6769r47llwma71hzdb9a6sprdkkk6p898pmk367wbnf";}; +lipsum-60561={run="1rfz9f6gaha6ccx1s5kij2zkwdkm6i2laxv5r9jyjvsawqwr0lam";doc="07wwbyj7i8cdnq8g364c8pjfkc0l739932n3jcmkj6vs7qbmkikq";source="0349nqaglq7cnwi54p35anv7ycsd7a92jd86l6l2n9pmvh7z6py6";}; +lisp-on-tex-38722={run="0g33w5hwgpw7hd62lij0h5n89n9r9ynlxswb34j0aqf3x7nsdh8m";doc="0rgjcldb2rg330cp8m5vxbi380xla73jb36nn94b2awl4g34bpvd";}; +listbib-29349={run="09rs3zkymlnn9fgsclnfpn1mrmxnqy8kd5pmdiphlga1iwfj5z11";doc="1nz6p8z4yvh91hvk02y184xl6fd8pyjlpjmlv5zpmcjillv176yj";source="14jrkykx2myp5fghh9qj66i5g291azm6cihi12c53bv1ijcyl1ik";}; +listing-17373={run="0kpf5svycd71r8p61y83wx1k99fwxm95qz5fbnqkfrq3c0113h3p";doc="1zd0mxh0gxlvqrwxvycqr5yzs5fns0hrkn6g6b4m1v6njv2f9lna";}; +listings-70052={run="1khzz7im183pyynl8mhk8by91p06p1xy7nrlpq2g457zp02svxx3";doc="13aw7xcra3r9p35iwhjh6wbkf7n615bz0wffxi0sjxcqcsrcqvc8";source="0l0s0i1kvb37n1wgahz1q2261npbs112f6jxc031r41rhyzmgqfh";}; +listings-ext-29349={run="1r5nq62k8rwllcpxwpkh2z0gcb1rlydp9nry8wx7r0h93hbmm2z7";doc="0jyk8z0nsdx2yljly8nd4g8wnw7ggi6mdjw0wb7y0mb5wq47sbpp";source="0hd117168f5s1cb2iim6y198lnh05ph4ib7p666yxvv48wr0mfpc";}; +listingsutf8-53097={run="0scs9dnkl2hj95zgjiggn2ikq2nf62q97nnml3hbvmwdargassmh";doc="1s7k2gr69xlxln2yi5wyvd69l2qa8v33d92b6ahgxxpid3437prz";source="1bq197100f74sal26w0r4iv6ys2qa1ylbwbyw3hm9dlpb6kmdmgq";}; +listlbls-67215={run="0r5ns594dxmq7r9pkk2hk482caapfdar1gwbdi6fw396pcnpw8p7";doc="0gnc00jv99rvf892q0sncr7l5pxpndrmw6qsxfbnyb38yr675fk7";source="0s77rh3480i9w06a0nnc7l8gm3w1s6bik4nl15idb27h5a5fq302";}; +listliketab-15878={run="088f2lm5lfbns7hd1m06f3zn1cjcbaw427z7zl5n47ahrvcz9p94";doc="1llrdgxp9mghs51sz4jjhbdllzlr1xgnfskask532zwn1cm6f4vd";source="04xfgaqpcskx5m8byysvd2rji31km9c6cbkfzf3ybj4a5bmbnq58";}; +listofitems-70583={run="0kpq0ac0v5yk4gvwrzdkp262npralqbdvsx0ln3zqgis025z4kzb";doc="0dgmc69d5wxj5dx7liq08vkw58fm3vg41j261xxw49hlacjl43z0";}; +listofsymbols-16134={run="1qp5y4rbnlpaa3nghlxjn5yzhskvan9rg0g45wqmg6yk9sdll5b2";doc="15sr2n0bsvwz6jqgyspj6kxg511jy3fr18705pyp815hg4maxizp";source="1sjg64imcxxqq8bsqm98954g47nfambr6vsyizkz8zqzmnr5vd80";}; +litebook-70583={run="0xz899hy8yhwsphzz8kz6h41ck1p649lqhzcjsag839j9fwflvpd";doc="00cqvwhvl2r884j0nm1gb02agsz8yss2shn8bjkm3gpb1gic4wy1";}; +litesolution-70608={run="1bc1wd867a88axcf2ydm8alxw9pkd3ycwqgvwy7fbs70v5wzccz2";doc="0yrqa5qs4zh6vscb5xagmich4hgjsfm8xj9f7wzklb5vaphcgm3m";}; +litetable-70355={run="1m8c9gp8lsbf4i0ng62fvc1f490dg2fhhlm7gyh3b6bpfysxcdlb";doc="17gm57g2n5i0s2apldjs2z9xib8cdwz7zmlyr6g763d5aibs7bz1";}; +lithuanian-66461={run="1jjbj39d4idfsx86lmpj0w1k6gr6mwr7sxvcm8wag47rgd05czcf";doc="01r1wraa7jgvblc3wrdvkhccp4ba8ps112ip1v31vn4wbnlvdyax";}; +liturg-15878={run="11l8ccpq2mcnpsfxry6zzjihj3s7s76p9plh7afprd7j2nnq1a79";doc="0rhyz3162nzh43nrxwkynr45i4w5pqb5ip53x5j2k2a4cb4k1z86";source="1hn89rf3xi66bfc3kzwbvllfzrxr62gx60ywbh8gkrw813n18lll";}; +lkproof-20021={run="12bj60lfqlqvyk020lv1l6iinvqx4cvd6lfz4vhblfx3gs3xmcqf";doc="05sppy6q0c2iangbzmxv5qxla8slc2k0fx62f6n2fg1ncgvfl7qh";}; +llncs-69629={run="0x86jmqa7rni1bj43vg6rjr6vnffwz8l0pyrq571s0506jf10y3k";doc="09dg7g9mk7fhp7l81572xxa5b12fb27bbsmvmrj48j7jic9qxvnh";}; +llncsconf-63136={run="17x1sjs86vl03dxcz3qbwm7r21hmzvsvsr9qa0xii8fvp1yb5pxz";doc="1dq0v5wczbhk1ir8fl97c53sinpqnvv9v1hff1hzc3rhbwh5smh2";}; +lm-67718={run="1b4lc6ipij5iws4rgpv3sjjwrdbaxnwiqdbyyj62jzc3yk999m4y";doc="0wdnpnsbg4gvahqq8lv8ny36xwxgph04sjn64pl34srn2pk1jsxd";}; +lm-math-67718={run="0vsmzr71d5iqhr9bwjnp7khzlg939mvfnbg846854cxk8wfm9hzn";doc="1j6jcki1hxdr17njy8sfpb82mxh6bpllccf3hnjvylvpjf45nxm3";}; +lmake-25552={run="1fk98049965cqqyzdl3yl9iblk87gwwrfccr5jqpdm5v6m8mcwrj";doc="19yqngjn320sng4pg835rffk6d2g3c5wyma46x1jr0bccv8s1990";source="1p002ywz3pxip5v4cd346nmpg0gi7wamlcl7bc6f4zvzqp0cg41g";}; +lni-69361={run="1slm6l0jjv9ps8qzs5ld774iibsqm4bi916pyypi668vpf03dp1m";doc="15125l53k3v5g8gg4x8i7izx2y060r2mpqs9k60jxn4ljlmh0cpd";source="1wlvrxfj254ap9vh0wnzana3i1wryqiqxwff2gh8lrh4nh3yiq01";}; +lobster2-64442={run="11kx0xhhklgrj3rhc5q3c5hi61444vr4936fpq1nma1yxn7mbyfz";doc="0l51mwqiq34v22pa4rjj4c6q7w2x9acdfy02hb8gmn80i91fijpw";}; +locality-20422={run="1b6xi8zzc9x8bc54bs2s6ryn7g2zfpy1zsdddlx3j8kvmbmgv6j9";doc="0z0vrx1dy5qqgb2kx08qc2r06ljqnfsgiz58hpy6ylnlyay39ipl";source="16xp8pc62jzgcmdhqpmfi54y5aaf7mx6bqgwslpwixgwym0i69qy";}; +localloc-56496={run="0ynzcib8hsflpjhykfl348pmc508g4i3ig38wjsb3gfm97mlhq24";doc="08aiqc04rwinqr510r1wkzz43qq4nks1varmxyjbnw9acndn94ak";source="1wcl06i82xkp6m5m311pn1ax42avlp6n54ad1j450apgygdszmik";}; +logbox-24499={run="17qbkfkbz35c1a2v3agrpbkk1bxifacj4ccn3mh2w4kv8z8zvww3";doc="0kc0gldcfy4bshfkl7vprg80ywwsqhac4f81f2f0i6ql4jmlqwsj";source="1cj2gb5apapmhxc9vkypnq17w5fhnwdpp0qhi595gm5j5q1wqcq0";}; +logical-markup-utils-15878={run="0nc8kgyplffng9429h0g4hynlwwxpcvnirxg7rj62zcjcg5ijqvv";doc="0x3j3fy8zd2vydzfa47ra9w8bqvklr2im8aq725nwpxbyyg3m8v5";}; +logicproof-33254={run="10b55lwrrq1aqmp9njiabqg59xdrd5g8skbcrlhs621s1999dq2g";doc="119zgxwx0q6c4ghpb30mvpdwrpr0xvk54hmj6qfpih0kxj0zp1az";source="19j00a28pz5dp29sx61dnrpqyl24sx9apf2ck334ap5sw7awnc70";}; +logicpuzzle-34491={run="0zsg11lw5x28sik6ifj2v1zjvm3pcv4vf7w2pfxcr395vmw33qm9";doc="08vgi2s2cy09dhqdmvmq1ijlw83dgjd7xjfdhj28vm9ny16zmydz";}; +logix-63688={run="0syvhp2zn6rpmg1v92k9df0q4kv79flvj93m7761675fb8jcki0h";doc="1l7kyw1pjr4bpj33sy2dvkb1fvl39pb1mbvwz29w6k4038hg50hx";}; +logoetalab-68916={run="1qmw240mqsh2s7l2r8nvw9xh3zwa99g01szjaxn94d92hnqmb4r0";doc="0rkj5gcp01xcw6d3vascvp3nw2ng5gxi9znj81yasgw09w2qyb43";}; +logpap-15878={run="0xrv4x46m54b4gfa805naab6fgpd72fwqnyjjxw0idy9kb3s3x5v";doc="1zb6qyxrqy07m65i18dcli30gb42y6c3ffr22cpxa7r8xmaprcg4";source="07cm2gcnv6d7pzc9d2v3bdvsmykqf00bbw177mqyjaq1chc0xpna";}; +logreq-53003={run="1zj1vn0yfklngvfvcr0p8hchar220lwfrznsq73jbw9zzjx47v4f";doc="143b5bb1jkc9j1gd46c28q4zq8jlh9wrngjw8q4prw5dkfnf1s8m";}; +lollipop-69742={run="170q59wqy0x5zhziaycmfglv1wnc5kf252ni1r4vgrrs3rlwiirr";doc="1wj858kqp27amx3jpndsqma152r40agfymh9ah8s42pn6kfl4dkq";}; +longdivision-68609={run="1rnbw3y9vzs0nqyjw1qdj7mbiy1mk9l3ccygnn65495smgg7h7b2";doc="091b1v1hwbifv426w1gglg273c9ck0n3bzj3xl9hhl27x1qzxjcy";}; +longfbox-39028={run="1cm2zp8sina312n72bd1xza75yi38n1s2ach2f9sjxdx0m5c3ywx";doc="1wd6hdarh4nm6x4qn789flnq69gq5p2r2pgybsynbna7ywar0l5x";}; +longfigure-34302={run="09pnqp0jfhsg7i8z241ggnx04j452zsg1zqmwy0i40fp2s36a61c";doc="08y2a2922zk61iirlw24kdsf473sx0b44pjzxihmpcrf19vg2c12";source="1p10y4nwz9wj321mf36avl3w6zwvspnb9cc92h9jf4iawnqyp8p8";}; +longnamefilelist-27889={run="1nz5n1g65fs7xxd4l0c9xdr2z46mxhb0fkmf5id4hrifrbl3jxbw";doc="1v8i6ax2qwz7d7mi0bnpyllbqyksdd749s8pr95jfw1fhi07i5fj";source="1615gzf3rjfr1nlmpgcrvmlzhif13g3kn210xq8p0vsv20irnqa3";}; +loops-30704={run="0hml4j8l5gdz1c2qfpsqdpha5dqjqx545am8x4vzs57ga7j2va4h";doc="1jf63snh8bnyi1j16mjs14nyqr4bj4rjbwd3bs1xd30i54d5584s";}; +lparse-65693={run="19zvsmv6p650qrblallq9krwajdabwrkhl45723226nvrszsw0r1";doc="19j769yldcx498ycy0q8vkgpmaj8zyn9inhix6cpsrg42fz3ijjx";}; +lpform-36918={run="033w5cd8z7r02h4r2p8lha6z81qqvky69a7aiahjpd15smss4wjp";doc="0vnz4simqdsznciymkqyy0cpbnxfpkd54wdrcn5ra257a37x1f4z";}; +lpic-20843={run="0axszk7cpnc58rs7w7pwy3vpj39l6zc27g8lfxjzkzlnc8hbnycd";doc="0hyg9v30h6n38j8a4pbqfjxkqfc9ls3hcp1cf8n8dwr3ajyhvins";}; +lplfitch-31077={run="1qjj043c943pj0pvzyhs152795zyskcrxkkmp49jxxm0hi8ww51g";doc="1nq554c0vjmcdb9xyprjvvvcwrkbbh8s1x0ypkzi0gqds4m4a38p";source="0cc04s2ndbs8j2xg4afxxyi2l8mmnxvgfaflak64v6i92n9icfg1";}; +lps-21322={run="146a42clkjyrg046bz43b2rpvz3i2dvhcsd132bzc76d3x0sqps6";doc="1nwn4dff3szxlvw7ydqp1ylw818maj0ij1g08zlz2i1gclizwpa1";source="0hzmjvgd9y746d9983y73jnc7pl4y85lk37h5d6j3jznnrdgk7b8";}; +lroundrect-39804={run="0s44pbvm6iwl2jyffnxriqlmpp6zs1y70z4aix8wwfasx86gq131";doc="01ncbhr1x995763d1dnarhy56d7mq3r8k1b56whqs6kq55115w2w";source="1sh8ypnfq4pwaqd934vdh77svs9d3a4114vghg6m4sz5fxh11i39";}; +lsc-15878={run="129vlr2gnirf47vs1drcsml3w4jcwg78hmya4r3nspaqm00b17gd";doc="09faqnv9k96nwjcvgmml9f02vdj5hadbmb1lp59xk6jikvybv436";}; +lshort-bulgarian-15878={doc="0qg23asq2i5mqhp9xblv5hm3qxmd5886d5x0gq1fkdbyy9gsawi3";}; +lshort-chinese-67025={doc="05b9fq4jhh9xifn2lj58fs17fc0prx915gwfz47s92spvv9fwbi6";}; +lshort-czech-55643={doc="0ar9qa0cg0mjv6ydgx1phaa1qpiy25s3jciznbylgi5xprvnnfa9";}; +lshort-dutch-15878={doc="160r060gmw6f6lgbnyvfxafjpqvyr4jwd56ddkjfm3ir2bfl973d";}; +lshort-english-58309={doc="0pzqdbzynlwvpamd69cmfpa8jdcvq96qjr9k1fy3dxpzi2mapvhd";}; +lshort-estonian-39323={doc="0dfwp7kkynpskb345i3yz7h5pvc8iljqg3q6l546vrwla0bmb95c";}; +lshort-finnish-15878={doc="06madlm869kmwxprmy2c78ma4s8zk8mclzmd4xdl0r4mlhk4vdsl";}; +lshort-french-23332={doc="1hdl0w7b1ablx7qfcvgniz7dcbgazb49b8wfw7c08hlb38gxfqh7";}; +lshort-german-55643={doc="073v7zvk8xri0f05mr0ad770p81akl9b9cnia1q4hcma9fk89k10";}; +lshort-italian-57038={doc="085ydria5q7s648r7frl54sa1y4kyr569zvqjjkancfd83h873cg";}; +lshort-japanese-36207={doc="0mfxig980jyzhay1i83d69p294hgbr92v3kk2a4z8ca3fwzy8w74";}; +lshort-korean-58468={doc="07660lrss97hswmis7rgc419h05mgrvsfrrwmnrwk5yn97flhhqd";}; +lshort-mongol-15878={doc="153k4dzia30fpx847wli7i5p407a808gmj3p7jifq5bpx479qg1g";}; +lshort-persian-31296={doc="0b1b45nh2d3d3zv735dymgyllj6m8i57icbihjkl1im0nghrzklk";}; +lshort-polish-63289={doc="121y638k4f4pbjpa4q0n9qj2w57624q2d1v4jz09qh399fl5yk81";}; +lshort-portuguese-55643={doc="0wg51rjcayiizkz0vvjkirrx19q8fbnfrwilgh13prlbpams1hsh";}; +lshort-russian-55643={doc="02abh69xl43p56fcciyan4j0z4mqq2j7ynwazq1nywhz37d6zn7y";}; +lshort-slovak-15878={doc="0b5gn95i32dyn8r7v2cdcz759fllp3b0zwx17adjs282n06vfymq";}; +lshort-slovenian-68204={doc="0cwjg0z5vr4x93bz1khwl27rk8k7kpjm978iyzn6w7gx3wi87zr0";}; +lshort-spanish-35050={doc="0ls50syrg3dl5dl5a3fi33cr9j990l2xr6pribn1vqglsqrh191l";}; +lshort-thai-55643={doc="16r9gx902a342q2mj570y269yw97yaj6hrbqrk4h49ihm695z30i";}; +lshort-turkish-15878={doc="00r6pv4z4933jw072djdasd2wp5j05wghln62ga4g6y6jblf6zks";}; +lshort-ukr-55643={doc="1nsah1h3z3sy96a9x0mfdwby7pvvjwq7zxfv2s8nvsbvnn1al17s";}; +lshort-vietnamese-55643={doc="094lfry6cqvpk02c3acss6581mgb7j30fnja1b3qwzxmyxjdblwa";}; +lstaddons-64967={run="1yyfgn2bdlb5gjb2qicx837wl03djpi2cwxzds3bp3n37h52k48c";doc="1lxcah5zmmgv25hm6a3yfls7ysgg9dfzdbc3whdvw11mh3pwkiw4";source="0bbppx159q28sak5i6hj6zm1kqdgcn61a6kw4gcvhj536vnd947h";}; +lstbayes-48160={run="1kpkr8xd1k1iinrp1ljj1wjphn0c58l8f6hci0axvxdklr02s3h3";doc="0x288aij80j9vy6bscj3w257nj0y3z1hf0rf9yncs13jsxr8rz05";source="1hcgcvnki1xkh4ni6jqcazl0rjbhfmm6gbgsp9n5qavdgnv7qzmk";}; +lstfiracode-49503={run="07fdzwb4k0dv2mf6yl31h58i61hmw0gfpgrjdnz3v2rnw1ip8kgq";doc="17a8sg0srw7096r3h7qa23msi6pq0dagap3a0rcpclp73z3gh3wh";}; +lt3graph-45913={run="1w5n9y7pqy5zmn6w9bx58nnawvhp5467d150qxnj3c92gh0qbj5i";doc="157y7a7gpgm6dc7hawdhxr0v3ns5kibykhkg3wfb5r5fay47jj4n";}; +lt3luabridge-69867={run="10ip1css2g1qn9p26xzc9gkdjicd35m6jzdyxd7675zl0h9prvbm";doc="12gch4b6x7mfia5mgglld7zaad2f7w1bybxl689vjc0gfb46v55x";source="0n54m4pawnmpqrbb7m7182d8wbjs150rad4kqqx9h8w9ymwwjrc7";}; +lt3rawobjects-66619={run="1k65hvwwqqw26mqm248fd23xk4bgm864bqnyc759faya84ib8n0q";doc="00l496344la7q8jz0nr895cxir6zn5pcjsn16mc3cd7lpiclxs69";source="005iwxrraxmirspq3881mc2pb8iikc71p4g0dwxbqp38c8v8djb0";}; +ltablex-34923={run="11gazci0c064iav6124v4szdbj38anqwnfgh8pfpdq9zff0h9g5n";doc="0jjd5f3r67lrbl4vyxjakm8l8pdrw9vm1dzhl5305ga8vvwb7gn2";}; +ltabptch-17533={run="06ww90fh24s6lmzyvmqjh5gcr7vp3lq6cg9q6k6194g4kay6yx5i";doc="0yb41cgqpgcxk27259gfz14v9bpndjg51i9nmwr1qwyvaqd6jvjw";}; +ltb2bib-43746={run="0glj7g6zyvm08paszjk45kp65aac6i3f8spf6zn12idf1h0b76j2";doc="0j1p6bcwwgz00n3wyv3vm02z295sj9xf93v946k1xrv5jc6pg6lf";source="0g05r6b662jx2s2kal26b3lv0dd6r54fb8m09yv5d021y1fm2nqg";}; +ltxcmds-69032={run="05wvxr5bsrfgyy5aa0mrxqw0vi8m1ks5ma6fzlf8ngnbpihr2ggh";doc="0jnqvpc40mazy5ka1451w5rdcsl5q6rza3dqkhqpf79lgiswxgc5";source="1p7gzrhyiaiid1mpqfqlm6jfamdd8bvxx149lsnvhnxh3mbxlydm";}; +ltxdockit-21869={run="1krcr5qlz0648ibj5c1jd0y4rf6rg33r0clyvdjm70kq26y1lqww";doc="19jc49p978z0hrx7p19h33nc65a7vjhlrfszwvr6mln01la3ivmq";}; +ltxfileinfo-38663={run="0f11qjq1a3s5nxd7z9k19yhbl5219nn4fr1vfcqq1zs8pwnsgqzx";doc="1qjs959a28cqjigdml0jgyhllyxd5kj276akz93hdbcd6gzs9ss5";}; +ltxguidex-50992={run="0qv1p01y18ia4w53dvlfhdrgy1xsicaigcas33xs6yqipr8cwgkp";doc="0j4h20bblkwgdjvr2ihfy32mzyb9parbjgiijqf9sfg2k2p7xpib";}; +ltximg-59335={run="0w53yx4bsj5c9djqp82fy3yvfaf7sl08d2698bq1bzl13rlnvlxc";doc="1rni1hl6i91dw0fdynkajr27gir1a7qyagmpmypnpcdbqv0rq0hw";}; +ltxkeys-28332={run="0yc0c6hh8aiqm695by6229qqhv7ym1ssz6gpysy6hb10qrqbywkx";doc="10v6gw41aa4ndw2x4rwyq9x66hsdl4l4j0682dcfm4cpc903caga";}; +ltxmisc-21927={run="14llkpla8gpx7q6a53sd8a0a42wgk93fg4mbl6pc0v7v1kjblr5m";}; +ltxnew-21586={run="1sidvpbqn5b8szbgysi1afbw5lw1cm8ivhq12sig0z4z4ljp3qf5";doc="1f69xq5753iszfa2yr6dfmz1agic26j4qx7kkw9j23nhm7f0lvva";source="000dh3d8i57vsa46np49ml0sb4j1n3gnpcfi1ghj7pz5bn9br8w5";}; +ltxtools-24897={run="0ldvvkvyw1khfvg80ana7wj20917sjzf0lsp4699hf4jvw71w6x9";doc="1j51wpw06jz7xb6qf6nc52r5fl31q6zhsdm3v2ngc1hd03dcxpic";}; +lua-alt-getopt-56414={run="17czrz46xlbj3xkh4jwdq269mqaq7165kpkhhqa498hrkcgdgaak";doc="1zfwvs979c7s16vpv2k9l81mcmm9y4qdjk46l8ik3123dalchv6f";}; +lua-check-hyphen-47527={run="01q4j9bb19lf838pd7l26rkz1xr7mxcx4fsgf5xd4sdif18h56qk";doc="0iaihbrppn1ap7bqvn37rk8b6m4lwdi8w4zkshiqya1mphhsfjg2";}; +lua-physical-59138={run="1rkf3cgzw6lyld82p8crv8h3swk4acq7b0i9c20q5dksrxcr7vmh";doc="10kzyj9k5fqi0jjkah3xx2cgn1ssvc3byihvs66qpavd2gz25vg3";}; +lua-placeholders-70055={run="1i2x0vv8xaadh7klx1airmfshk49a2ldyknn1xzn7iz882lwwrh6";doc="15qvirq2kidifkgd5pi6cdpaafj8z76qjx7n3x6v9bvpp3ybwqi5";}; +lua-tinyyaml-66776={run="0wm23v7rm1mr2l10cariiyzv8f64aq0ms154md2ww9ad4qmsf3km";doc="16990nj13x5452c5mb8ha4hy6n1iyv2xsjqgipv27dhz2g176qy6";}; +lua-typo-69403={run="11g42k7431rh9ih81sl6q331k09l8cy1qw2w5n687736hvv65wak";doc="14rs9ds0mw796rawi4vwq73apyswvy6zlml36866pzy2w8mdcfv5";source="0kcjlddqjvfpjqrj690dwkzjf6b2qqjc7ccix96hzhb37sxmm2qf";}; +lua-uca-61023={run="1klxyb2iw6mccm2dlnpk947kim6ysvkykz69z7crf6lyzcy6lmvb";doc="1605lw450b64xx1a6lxjh9w4jda0n3d0b3sfvxl4wngd5y2jckzg";source="0z7fgyp7dh4zkz48mkh49pngaiyd58ckm0ipd3z626alz4k2jspq";}; +lua-ul-70206={run="1w4prgdq4xmx85gq3hgklxhsxq69spvsqnl4g51wxs2l1pi3dk4w";doc="08kjlrjicm93cp32kssvcjp2j23k0wgcly88xxpkzl6x67nw8qw4";source="1hfld2d2qppvbk0w7cjj9ng888jwi3jqlak4cbnngcijvwaw3hj4";}; +lua-uni-algos-62204={run="0msiywf33b5jpdzc66wyvnklvmvs4cpfq3f6bsplgi22x8nvdrvp";doc="1sfswdkhbjrjd4cjj95lbc1sq30j9y5xi35lg3mjfpdinq43wfr9";}; +lua-visual-debug-65464={run="1yby9rmhq63md8cb58qvi4dzlvw7hnfqicmkrap0c4qamva1aal7";doc="1g48dm1is12zj2ncp5lxf9cv9anq31wm3n99kjw9m1fsygjfsz1k";}; +lua-widow-control-70602={run="1qagxphvc273asxvg77sxrcfv51kzcc6dkz1bszbzzy9sv2f3xs6";doc="1zr31yn7xrxgzj2lnvw8f3sb784xcis63ggd1wylxfnar62mawr7";source="0w7b34afjik8ka9njdh7lfjn565gs8ns9n90phgyj8xpafy09jdk";}; +luaaddplot-62842={run="024k6k9iyqiw29l614n0rj0k32y50fgisd2g1abfis7lihc1nlv0";doc="044yp2522hns6hshlph91c990lh43bwvf40cgkfid47mi4zr79l8";source="0x09ac3qlz7p27nm478lcawdrj98622527ba4rz7004b5p2d8w8v";}; +luabibentry-55777={run="19rvhs12gw5vdq2vvcdzbz4qd3y87qjvl9x4bcqbncqcvwg82cyk";doc="1raq564ad633c0xbwx6r9hhwmx1r7vis283rfh67lixq3prl0nfl";source="0gqbmg1c4wm57ga8gx9g00dfbczfvhqsyl13q0ba451d3kmh6klg";}; +luabidi-68432={run="1kfyazn8v1ks5yvac4x5cvd42i8li0sgv00plj92c2m31hfxw2gl";doc="02387g70qsxs7km8dlgibyx080jwwjg668j0w12v3hz67jvg5ymk";}; +luacas-67247={run="04507iwzcyc2xgy6sfawzj6l4zrjq4iaqnb4946hdfc4nbx177mn";doc="16h9v145l1kv00ipghfdjdqyh8giq7y418664806h6gv812af7yy";}; +luacensor-62167={run="1n1dgnamm5l3hqpbrm4dwgsayqmr99m41iy4038s7mfzz6dkf0g7";doc="038838s5p5ynvxycdhassvkq1vhpv823bfr5ppir00zd7mv8c7b5";}; +luacode-25193={run="0qk8vadwymhcm7yw3sffdh9i171hl8vg07j1b5gbsl1sa70cpam1";doc="11d6ak1dvdx64k0i12k4c5kh24f5vqy0ihvj9a5lxa9gqypflrga";source="1fafh2nq66cz01jsbkb0mk907sppahlswsbb35pa3q5j7iqjzyav";}; +luacolor-67987={run="1mbiwswai0sq8wi4vmyrracygdd3a1g45m3qanpams683ik1syal";doc="0aqwjckc7cq8z80bjyl6fz2gqzrwwdvrlilpcf710wlrqc5c023r";source="07dwvksaxidr4b7z7fx68q2kcclhmpilvy1xk1xjjp07s5vgqkkh";}; +luacomplex-68883={run="0hd7g5fg9dbacbkk94zpjk7yjwx3jp70l2ia6wnzx8zqajs4hc7v";doc="1hsr4308z3b2g3g94hcn2cwin3awhhxb1hzy2c0nx77d0byx5kkc";}; +luafindfont-67468={run="0aajmgjbh77mj4qv6d1765bn66qjfk3m1b0bg286lp77c0vsjrpy";doc="0bhr19q4j9fqy7y8mjiz49vjd13s1wpdg91bqfdyx674l5sp72zw";}; +luagcd-68893={run="17nh27fkwjrfpvf0fpfbqcqi00bgchw0zf3iznp3iqmjyvrdwn8j";doc="0lihscgrlrjrc3djqr3v0zwdzwhmlk7r33rg0agasdhcndw5hb3q";}; +luahbtex-66186={doc="1hfawh7vig7jsmd1y0qlbn80x6770q56sqd9rx638js4p5a4di3l";}; +luahttp-67348={run="0nrk066mdzlw8z55qy8w3clpfdiy411mqni3kmn17adp5iswc9sn";doc="1xinhsfcl4xz3xziv0ch0rhgrqqzmrr3hs5h23hdyadayxk4wxhl";}; +luahyphenrules-56200={run="0msfn7s35xhpacx745w0zbr6g5pbhhm4pccd5cmqdhq6dh0fjw2w";doc="0y2rxs5mqyw6cyrmgsqqibsw45qjlzsrcwpd74m9l9d4731nyn37";}; +luaimageembed-50788={run="14xmb1cjqvpqwl33qx7376ndsbkql48v6094r66ksr7vlyap5hgp";doc="0r0w2lzxf4avfsv5s6fx64bw300vnmympfdfzz1k05c5c2kjy9x9";}; +luaindex-25882={run="08kckg0129ksr8pdm0a2yawwb3fa5js3mkp6jd8f90y0w7acrvis";doc="02w8s71qdkxznkmqv7c62dhar2x6ia9zsiwd29qxjf51dpwj3mg2";source="1v09zszin9f4k3gczrfs86zv019l42d6khacjdb3qjp2gg8w9qn6";}; +luainputenc-20491={run="1wsz8aw4dyhiw5p7gyf26lcixk1a8czr06akd1h6dwj6s5vq4vka";doc="0h6wjb0kjdqfrmzikvbddq4w31d55mxlcl5n3phr56fa9i49qmgm";source="1yps04v6fvqspq3rip0c6pw5a5y3annwfaij7w27i53419h83lbd";}; +luajittex-66186={doc="1qfbg0r6gsncgymh00yc83kcayd4m7bvryap8f63sm9s9bzfl6yv";}; +luakeys-65533={run="1p4hysck00vgpdnba5jnhaslcbq5cpyw89f1mdn2201dr0nj46sc";doc="1s46w0knvc5k7d5nqvycqschsf60p0qdgswwf3bs987m5vi7jmzi";}; +lualatex-doc-de-30474={doc="0vnmgs475bzbqi14m9sm45cwjfsbvbk45wkb8m73j1bnk7wg7hh4";}; +lualatex-math-61464={run="18m4jab4yy3fvwkn6fyb1qajsq4nl45v06l1kdjimcws5vj0wbv4";doc="0di41c5rk5raf88hpz59syhg330can3gb5s25n2y5c47qj0aph1w";source="0v470ky6shgcfy44b6a1b987cylqiz6rk0dk9qfhiqd6b93p3axd";}; +lualatex-truncate-67201={run="02plqfp0xi406wya3c6cdgj0777m11fzkbk9nbharima6zhsc1nb";doc="0gkgbliv8bzpdk27mkff02v1d03vggyq4nk50yawrimz0k7q64bn";source="159wcqiyb5rs9a7wfm5mj5vcqh4kr9gv4pv6w0d7vfylkrlh76nf";}; +lualibs-67994={run="0h9v05ax34iir2i1qjzqi27qqnw4szch42mfa8mfxvxcmgcjyqpf";doc="1wn6j8fhprq0i1k301p5k1rw5dyavwn1lwvrydf461nwfvahavfl";source="0rchl8c2dn0f5bq94h56ncy4rp2iisr3j9wmp78c1bm22k9xa1f0";}; +lualinalg-68918={run="0ma2na0ms6k07aavahnpfz1wddrjw2zqq0znxfmib50m3nqh3r5y";doc="05lpj7b9bg6w6d3hc20cnqd50m4g0lfbgj65lywnk52klkggiyd8";}; +luamathalign-63226={run="00j2vngg8sqbagyhmjv8lr8kzfsllllmm2gijhxbm8xgf8r7f01y";doc="0b2zkyzy0rq2cfbk205nixvflqcxgc1sfxiqbiqhz2yhai5y87i7";source="1svawaz0lj4zilykjg46av8sky18pwzqfnyli8qldpby4zmnqgvi";}; +luamaths-68883={run="0gcri65p0y9rmq19rgf79jw98i855cl30al9cpq3znp3jjyikfrr";doc="1sv4ygd6ypf0hhcbhydcr1ap7ig26z476i8z0gs5mzfs08rdq5mm";}; +luamesh-63875={run="09ldwjfa0dfhgqv2clyqzd8nzq596h9fz72b1jh7vqjwkn5774y7";doc="0xnk2mcw24v6002v523m7amj6qc4w3h655l1ss4rpwvv6virp3kj";}; +luamodulartables-68893={run="1f250s8836j4kgdzii56c0248j5sp64f5wbqkpd6p69wjz7pbrmx";doc="0pdk7x09gmdv0lnwkvdv3scmbgfgpyv069fa4s5hbyvwskbj7fmy";}; +luamplib-70583={run="014y8nq1za0f0x0hv0cf1s3dq8937a3vv277p66spaa6qaj813hz";doc="13z4pdlydnxswna8qh6ywbqi6k7c2bgxspwgghz3n6xc5nr9g95x";source="11fbzlvs6ra67ywpbq1qxlk26wk0fncphcl1nrdw6f3l8v9m4dml";}; +luanumint-68918={run="14z8vvxxivi2i61r1ydq1csbxlm3621y4j9hx3p0m9s1ngcy4ryv";doc="1iss948y9rhg7j6am6vyc5y0s1cmn43k1g8vgcjlzbp8x88mwlwx";}; +luaoptions-64870={run="1lkx7ynl6xci7klgi2h7qbyxny65nca74xz2bhnhch6zm38rgsa5";doc="02w3623ix7g67bz21262i95gn1m4gzvlvn08f7v0x0q5lm7x1f3x";}; +luaotfload-70234={run="0zkj8hshfxxs9yq5gjmznafr88gz4vd551lh3pz8xskw0s1qh2cr";doc="15z1anhc699fb0k7v14s9xl9bgv0w0114zzz3ibwr37nj8hy6xdq";source="1jmvglj1mv766cxzj6bnagrlby2z7w3gkpqls19ic2g9a154i62c";}; +luapackageloader-54779={run="1ynqy88drl04ld2lycrpvjj3cxddmbycznfamhl1bmn01c1q9784";doc="1fn9kqab5hyvscjqmd34vxjkdcr7bapgw7w3ckwvlsslxrv22rfs";}; +luaplot-68918={run="1lsc02qnqw6p2qamx2754ywk95yilq8jvn3vzra425iy675gl7kg";doc="11xl1j11p52zxncgcmg1b8x7isixz4vissfxzppc6ndv5dvqk3aa";}; +luaprogtable-56113={run="16jmy3cvn7rmzf5i03x51yp5l90kmrdy0iqg8ji4z3xwrf0iq79x";doc="1d0k83dyiml9abnfc3b9l4n6w18lgm37bijr8xj3chyv04v85392";}; +luapstricks-67207={run="1pzhv15ins6km9kmlmfn6qwypncjdsnvrv0qfqnp4zkbdy0hjxmy";doc="0kpnnpq7njva8lrk9wdj0l27iwkq4vhg2w3crxvnfymnq094gklz";}; +luaquotes-65652={run="0cjikz6739jiqadp28zll72i58s20dm1i0q9kbd3q2y69l3l727r";doc="19597kvgz6ggjfzbdkg9f5rg9qag9mrq83v0xk2w6f2k0n179d5f";}; +luarandom-68847={run="1qg41y50fmqq623wdc7rj17az8k2x0fwgjynq0f6213swx3nz3hd";doc="0lzrcg3vywprj6jksnwr2abd9qj1vcqqqk0fz9nrsrg3hphn6v0x";}; +luaset-68883={run="1cnc3pdysh2xa8jrjn6kx7lx1avpr6x11kcgyhbbzizraara656z";doc="0ynaizxiqh3lj1nnp8wcvd88z5jwpym2zcfvcp28nzwzhvvagccf";}; +luasseq-65511={run="1cxp3x3d346k7j6kh1bch4d83xb5ihb6h9jv8l98jcg0fp6zvy74";doc="1pxx09mvdn6pymsv7959bs5xm4568nzx78g8ikyj6hm00zqphaph";source="0h5zqaz5cvqgy5nghvazncwdxg6cmbv6sjlvp6f6mkgy2plpvbxg";}; +luatex-69182={run="0z08r0hjkcp51qzffqgf80df9445xiagi08cs3lyjfjn578z813b";doc="0cgml9jqd905jnwml4bwaqawplqp9ga0qnc4swkcvjmq3fkij8nf";}; +luatex85-41456={run="0ss7c5x0x7sx6lsn1iq6lyyp6w0xb1iy01s1f7zf7mlb9n1yzffi";doc="126y3priwz6anp8sj0296bnxd53lz20nchpxw74zphfpwrv4hzih";source="15bc8g0pgrkqpb8q2dhb6zml2d4jwrripih9898mmalsjixy62x7";}; +luatexbase-52663={run="1zrwz661gilr4iizcfsxwmfr9dgx7v28lypaslmvp3zaf52zl2q1";doc="118azb2x20gyaj42r5w0749dx8rzhhri1nz3szy9vv64h0fig603";source="0vsg8q5k8l66sy3d0bskr6cv1f95lnhap3b9yl754x7ynv272xcd";}; +luatexja-69988={run="1d61fqb07flldrnzmdcbnqd6nia163qajahbmhcxqshcj86da4ah";doc="1xp8xnqxm7mw6zcqkzjhrad255bsql92q665b0nmhw03h5xvyy25";source="0y7vqwj3rpbhrr9z3if1p81k789sjgm5df973jsnbwd7mz4n53s9";}; +luatexko-68243={run="0kr9i78a3dw18rfws0xxc7kjd4n61xgzjkdlzb83yls4fyxncz1h";doc="0k69i41pjfqifqjcjw4962yvvgwb07a46igvwb70xsrm8cxgkm20";}; +luatextra-20747={run="1dx2hc1md8csvb37lckxj4987zaldfd73c86y0ni8fzd4zg55s7z";doc="02dl0skcr30hh9wgm7bkdv5zvx3czcdkxv3zdqnasdk0b7r7mqh7";source="1yq5i4v2dxayhfzn1yw987i3zjm6gy4fqckx5kybzh8f6jr9167b";}; +luatodonotes-53825={run="15syf4k00shgi159j6ja182k24xhfw71zk167wwmy57y7kwm5cam";doc="1jcybpcd500lzkwa33zdmsq3svb9hrh8f56j4qgwm9cq4wb721f3";source="01km6y8ajgaaab9j1bdp4s8gj3iw5b7cfdl1yngp41ph22888aw2";}; +luatruthtable-68893={run="0pkw1q5jw8id57mcz2sr1mb1lwafara5kzvq3yrkmqp8s9ml5ns4";doc="1i6nplzr640dik1rg668pai86vip0qgsfgizgbd7v4v7sjs24s76";}; +luavlna-67442={run="1hwbf0l2ydi2a5x05gcffw3p9yw8gvk4srihz7rsp6g7yf6qhzds";doc="0wirwf96b50m5wnhfiami8xiw9rr12mx20kp4wqc1bnihxg8l2si";}; +luaxml-70117={run="1cdrh3mhnclxb140x6xlggvwwzd5rwvdr7655zkvrbdq8byp3wxp";doc="1zv85256la5d98wklpgc27djazd4zpv5b7drd3zrf3a0l4mslvp1";}; +lutabulartools-67714={run="1vly69bgzq9pxapl7w1f7cppkx5yr5yyi1gxv0488m2z75522i8k";doc="0iyg0vqm675ak5j1ax46zwq9gcl58vr2r861085zzxicw4a1fh5i";}; +lwarp-70072={run="0bfvsw734380l5g7y0m6phyd99x28ib4s26mim5smwlx13sgzvh6";doc="00ix9xb95k3qqdaf5mcvkj99vz2p5mj76fg83hiw5pwbdv6p83j3";source="009jifl4fkx89157h5dmfa658wj0pvzhgxff4krpj16mlik3xarv";}; +lxfonts-32354={run="1hl703cxwldq4ams7044m02bmnvm8vkym7xyz9cb8xkaqfyqp8cp";doc="1lfrcfpn9a260bx47nw6msvksjzqjqms5d31nprc800wk2vb8sf6";source="17j1kys5hrvkymba91kp8f1kq5vshc8blv5pm0m6yk6p4kdnfkyh";}; +ly1-63565={run="04g9labqzn9c10asy6nn5s6clqq2cnbhps9jf683qx5di1pabgp1";doc="0l2dqyxd005y9k8xpca04vyzbjxx6vzr7by1yz4qm1dkccnjprh1";}; +lyluatex-66880={run="0zj0n5bgawhkw0c04crlkb2m8yabb0r49bysphgzabyl3rvd3i2s";doc="01x3xkqv2f8gvrsl0qj3d2y6bkzmzbphzxcqy6s0f4rp5yj3dw35";}; +m-tx-64182={run="1znv3xc5462jmm3ydrcnfj1nj7dld9f617xw3fl2gdwn083ivawh";doc="0svgf4a6rgisj614py6l9hm4ij7b4x75jn84s2ydbxzyv61bmmrd";}; +macrolist-60139={run="0yrgy9q7bjclww9crxzh3zhnbsmkjwncvvdm9nld2qfmg4spsis8";doc="1161aanidazgapb9vl3mm9j0j0jfiny9fx6il3gbyprw6j7k61ad";source="0b3hc75lwzk9l5nq804qbpmaxd9zlrybqdfyg9cavsvyjrjh87i8";}; +macros2e-64967={run="186qfgd6p825fjnwivvzvvpx1ydiiw4k4lkvs9gqvm5gmas7kcv1";doc="0faj1gxhrc1fsqniy56c35jjzmxbpgyc27ai6xipbdp8sjdqm6pa";}; +macroswap-31498={run="0p35inib3yiblfhiy1cpvwahiqrr309fks7r515s21ybmw409v05";doc="0w03lydl6vwslr17h4px8ddjld0dqs5zd15sysv0hvqajw2fs0kh";source="02zfswma4h70swyy6znvhr54a38wq1px3f5ypz7zy1k26nqi25r7";}; +mafr-15878={run="117qd3a06lpiqimizj12lxd0vba82lsc211b46ags0mwgrqhcyz9";doc="1m6y9mpsp4w9cnbln8pv1pn86vqj9piki4kg2q2rq5m9q0g57vsd";}; +magaz-24694={run="0ah5blj8qfjqgnmygn35r38nj20sjyi6yjci4j9b90d8pz9w7d6n";doc="041cb5rqk5ldvbcqr8w7jnfi4krlc7g72ygq5j7pi9gy04d98mm0";}; +magicnum-52983={run="1bl7lhjk9glvbcn4lqanb3zprqigvxj07f5nm8zn9vpja90fyn6n";doc="1as8l73v9bamajin552xb4xqs08ik8sq22kqdc3psisv4f874kk6";source="1kp0d8wgphbh4mkv1qf9h2c1f2nkzqn9q8fln4v35yx2cay679qs";}; +magicwatermark-63656={run="0g5m44fcrx7c2c009wx3zzqyzdlygsj5mnznw2wmmkvqk13zy0n4";doc="118zaz7brzg0jswbn0bcxd9w5rngqdj2qg46w5ac7c7m6fsi4izg";source="0073lah6madc8cm5dmz2lgc11bnyfsmrhfz8wis7zlck9y9hk6as";}; +magra-57373={run="02zwkxc94lzi5wf29wws8ia863ljq9bq9swkh8k8318v5z4dv5ig";doc="0q6ss5ff86ckqyv8l2iy6mrrigzz7yavizqcy3w5s6jhjadz5v69";}; +mahjong-58896={run="02dkqs06dgp74963awkyj7w3in66h91hx5rycix61d0qz4qwrvqw";doc="0cxzzcngiz7796xzf0k1njchhw2p2m47kpw2fhrf1cqijwhw3jxb";source="0ygvmg8c6yp2mwlffr52jf5shl0qh26p0xlfkj39zzabd8jv2ay3";}; +mailing-15878={run="0x2mgcmfmppzqlwkg5jd1zfyvfdjnrvnk8glby93s5nvp6i6g8c1";doc="1aif16654381jcczmfn44k8v8x60clq94z4hcwjsqhai6s441hbr";source="1cx0pq1qmkn6k09x1r8mx7dmpwvdvprmvwj45p1k7mmfcvq2834d";}; +mailmerge-15878={run="06z9cb353sl9q6a7jbvwwdd0zk3kw5xmww0r3sjiqampxib19i9j";doc="1dk2a71x04nbc0rcmd3axhz8yikzlw9ab1nd5k1ki7pmclwkscdr";source="1qkmlfc2dvjhrh2xcypnp9wansxrb9wzvniwfb7sll2bxjcfbs8c";}; +make4ht-70117={run="1akzga489x8acbb8hrjmc1i6v9wmbmi30rqjmgj32pcqqlgkp9r3";doc="18kqpslbz18hbai5rl6nbwhgf7mb39nhhmpdzfnmi9nc3k5ff51b";}; +makebarcode-15878={run="1ixhl4k89mng2dqfc0wa0fq52xpafp15gghnyx28d9j1163wxr7d";doc="088wkffs4b8y0clgcx1impzbxck8klm32dbf6p1jyc2vpi848irk";}; +makebase-41012={run="1nmlgv76zy1ajfzbdv7hizby3hhciw41s10hbnlbrfdl27w14dpp";doc="1vxwgjk3dj853qbvy2fyqzni2qkkjhslf17xvxskq97w8fcqr13j";source="1f8aliax01b9ir5wzk0bjhqzicl26xa63khx84s9haplh183qk2m";}; +makebox-15878={run="1v2xpiabjcgyi1d0ifpvzcll8y01lzs48bs19nalv37jw7hkrr4m";doc="078bz2pism9harcyb9lq8kkrkq984zx2ya47yhpqxnrd85kgcxfb";source="11gjpqmc6dzccv3yc539ki64hzpn8ns0zzjvanw7afbn5bkyrs91";}; +makecell-15878={run="0238il37zzshzl3qn50hav3wa6rd25k7rp5l93lb9g7r476sgvrj";doc="0mf4jc9rv66qjnm3ldrpx5lbfw1yfqy0jsvg8d3wdcwvlxpcrvwf";source="1vkfkfgjnhx5byipkrzb202w9jvmnjc2z3zjih6y61yizccwm543";}; +makecirc-15878={run="17y2hm6p280azgjvskyig34jyj90zngswcgxc7xa2h8pljh1fqka";doc="035l3s20mvy61rnmsxy62k6iid8lxzwhbkyxa1hblfnmya7rs0xf";}; +makecmds-15878={run="1z4m1kg7zy5q8l0a5d0fr7jl46wrw0rbwkxq1d0lm2s13xdn71dm";doc="1hqwvilvx61w47schnchlbgrj5snlp0lahsq5a1g2c1grmzpirnc";source="17c66isk18ch47syhsihj96yzi1jpr84946gck7r8ivpmk3cmmza";}; +makecookbook-49311={doc="1abzwzsm2jh11qj2qr31bznfc344ynjrdagqayrcgifg4725fa0f";}; +makedtx-46702={run="0yir2j268vdaa44flps15l739ngv97lws6n6yk3w4pz4jn5gylyd";doc="02ir7wf6v6znly9c36z8k0djrzpkd74ssphkggmp8fj338fk41cj";source="0jwdsfx2l8sz8y90bz3gfi51vswyzmwdvfmnlaa2gplhcjjbv4yy";}; +makeglos-15878={run="0jp0207q1p0znw1w86g6m8ifkpgh3hi1yhkzq117kwl5ybswq8w9";doc="18zl45jdpsvvldxvfx79ijldh3g03acw254m6i8a3dxgxj2p76hb";}; +makeindex-62517={run="0lpqnw6nr19p08pf52rcx1xvvsywkpf1rqrkjdsgrv55d1afsd36";doc="0ixvak7xisfnfqsgr3j5idzja5bynrx747g2w0my9fl85bjfjbj0";}; +makelabels-60255={run="18gjnhjvhaa6bdsangr8fb9yms3kq27wa7n0pb1rnqd8l00kp0aa";doc="113dyl3k5c32r9k13bm9kndmbvq0pm9v7k94d9y1ba7xiljh0aph";source="16dcm1mrjxdxby7szqf4h534w9g7z5klx15jyx9s568c4arnvfyj";}; +makeplot-15878={run="0qp0qgcli40hd2dxgbd8fv9s03r81dlhh48pb8la9sh28qrb9i51";doc="112chsx5wxrc7k4w3qzf23pjgr0np1ip1ylqs2igdcihchz6syyd";source="1zksg7iqb9g6my9zyyrmwkhx04qy0118lxf60cm00njwmsi8w1pq";}; +maker-44823={run="1fymg22y0w2kghmqh5pgxkrncdcbbmhhxappc72g5q337hcky0xa";doc="1yz72c1ghqjs06nagngpp2q62gh67c3klwm73bcbc090vdfkw7mf";}; +makerobust-52811={run="0nm751w11p7cqg8ihckn338i6908kcn513644c6a1qc9rg847hlp";doc="0bidk4f0q6486vgwqvifzchkn0xi1l9j65yqwgcdnl3yg6vamqzw";}; +makeshape-28973={run="1fy1ccz3707f8wxilh95k8sc3a93gl93qcpvpxl833mbkamkx3kj";doc="17dnkldg0v2qp3hdy4bw1k48p8xx3v566pm088g8qb0df6kx4217";source="1yd3ssh3cpy54gm0nkp2ah0nqarbnk9hqw2kkwdf96dj8vjlsgwd";}; +mandi-70235={run="1v4npbn35qw9rs404d6s8ajyc9fn3blypr45bbp282wlgfdmg0vc";doc="0cvk0sx0dy4pnyh8r8rz83v95jkjx141kxmspkdyy9nxf9jixn6c";source="0nz6nmlrgwj99qsshcblx4rjb64gwdn4anjp85gvk5hc07vf2q9b";}; +manfnt-54684={run="1fzfcvifh013xs6dm6xq2gpvmf3v0qn8scrbjj3yak2ba98bcy18";doc="15rs74sfnyq2k27bs3dvjiachwamima3q4vp0dp0ic95as2n61gp";source="1v3j47xa7k66dadz8dyy9gm3k4s6465zgqpzb320isjpb77p7r48";}; +manfnt-font-45777={run="1cdd2a3xj00bwsby9z5iz5f2iy2iwsjl35gcack9q83hacbf3ssb";}; +manuscript-36110={run="12r1b0hqs1kqdxvyg8lv8yrsdycfxs03j0lwfmlhbg6lmgz32pss";doc="10dczs60ncdk5z76w5jxgis9m9qilxp8xi53gixki4i82yd4l9va";source="08fpv1i9vz6fbf9vy48k6y45xz67kbqb5f30c8pxbvyzlicixdjk";}; +manyind-49874={run="0c5badlrh2321958z75wi4ggb289hnyy0i17bpf4qw9sjym08pz4";doc="1x65nnkmqp2x04n9rg2n8yh324vdbcsbv68xfbb3ppx2462wrls3";}; +marathi-61719={run="04nf43i9z0s8hndjwhfdyysjxz8k1jargsrx03k19i9lihdjfjs4";doc="0ybafny55hvpv4kia7jybybjn4vq8f2g7h770xzq2b1mimyn7dkc";source="1ja8kbhsbhkcm0ig6954l6k5absdfppikzwawifp33dwpjkk6w0h";}; +marcellus-64451={run="13blr2k1vk0kwac3chplddaplsjacablkky68yq0wccdrxhbxvdr";doc="0sgcjmkgailx7nvav1gs370ywi61ysmm1snz1f976ppdbmhh1v3s";}; +margbib-15878={run="114ifix2wa74ix9zz1ml9bpyd0pqzj2983h29n3h425yq98aiqs8";doc="01zam8vg63igvhdzf3gwgm3gjrnd23i8ra2cwdj4w44lcvapdlss";source="0qjpbhs7g4qdhna3kmlv4pg5fk0b3xwpwagyvnl91gn3q4aml4s6";}; +marginfit-48281={run="0x8ias8bv1zaavin929782cjvp7aw94r18lqvv10v3vgq20n7kjw";doc="1cj1fidjvvhhzn9fxbvyh75dfb78wxi83bdxnwbpc6rf3ax5bl03";source="0rrn2lrqg3a1yz6l88qkh8sljr18p1wx1vxyrzg04pzj21lw8kkh";}; +marginfix-55064={run="0arldbc20d1sncwanx3szam53yv1d5wxgihj8lm4jmda1858bmgy";doc="0kk9cghi0y1zfk6ya3pfs08npdy7v95i4db5a89v2177cd6z7a78";source="1k1384nxhiywlvyndnvhj6a35q433ddc019ckf8al2b1ngg13y0w";}; +marginnote-68204={run="1jg3f25jhdywqaxy4qimxr7x0kxjs279m7a3kf9lvyj6igcijml3";doc="1n1kswzhxdx7b47l4gf4cbihvzy54z24gg0sz4syvpy6nq23fs0b";source="15cl27n5q30i70ad91ajflrrcqb5wya1cb400jh82b9k7a6y8ych";}; +markdown-70583={run="1y6gqhcbp9z6wc39704x6mi69wlq3b9zkpbjf898545qi6l08s3a";doc="1y8l6y1wp72kjq4cymckyfywz8nz44rbyrw2bj81rp07i1vl3r3x";source="18s9206jpgwsg9b0k5gfnr9ighm882qcyc67ymardgb2v5hzpszz";}; +marvosym-29349={run="14i2alqxpz0imgdlx03gyg2nn56wrhlc0rziyx93h4ya9nz6xzbl";doc="0qyfyz8qfcchnf78r71fp5p16hmsrq6xf54g5mnwjb4p5ipbd9np";source="0vbiq807pazw2c1ck799w8sy3q8wcpb6smmq5qqw4nqcxzwsxk78";}; +matapli-62632={run="0r6xibqz726d68cli8izl20r4x2ncvrmlrjb711jz82qxbgs9kvg";doc="1cmyrnrijghjm15lhi2isza0dishbll3k4hpzq84jjjbcbs4gvyp";}; +matc3-29845={run="1mp6k50lm020xqrq2vwl9xyzr5jwp9p85c6ng3k22g4rqsxhrb3c";doc="17xh063gahp5m83vj6x8waqwvf4hrvg3wi80z70r94bag0nqqf2v";source="0pq4l1ays56ry5v3ig76h49kn7hdk1gi0wqx9b29vkdvzmzrmq02";}; +matc3mem-35773={run="1asybbjj93wpbcn577cqkbfi2bkiq2hzv5b2lqs31igawaa0vdhg";doc="1fgngv22falzvrsynzzj51jaf4gfcw88jwbljywixqb9xcg9igcm";source="03x6cm78yhgfljhcfrvn49favgf6h11w96s9agr96xmngzh4z40m";}; +match_parens-66681={run="1cp1qidfxnrhq5hia9z3nm4ij2g0v1rxs4g5fb8srmjpik10ss16";doc="0c5lcbkp4f7c8dx2nan6bv6cwicgk1520grbxs5k3r21sa2m9p8i";}; +math-into-latex-4-44131={doc="0k11j92h9hpxnyciczknhl83b05avc0rqdnwn82ssqi1k3qixibd";}; +mathabx-15878={run="0x0amwdxr6mh6j1m1q6wawljzjf1683xp1fxfqyxmsk0spx032mn";doc="107fimmxvfmdjdi1rlk0h0m88q1dbc9q1qwqhx1fwfjwdn62kvsi";}; +mathabx-type1-21129={run="026pnrn2y7zrl8qfhjv504bjk114z6kd6ich2ic97l5f3lhl9nj2";doc="172dhvsqql6fk2hfqcw19bxsqwqjfd7376a5wwzcvdgvx44s294v";}; +mathalpha-61089={run="12fsn6wsgixbpnay1szkmv16a2wfsl60nkcbyjksy1j06gr0yf5p";doc="0ryvikvngpgnqbcf5mp4g99cg0r72x53p7q6h333vd3s2qjah7x2";}; +mathastext-69237={run="02zjad6562mfi1lvdv6ha0var1p4shgfq325c8x7dsrnl12v788m";doc="0r7f9m237crb9lw5yg5gq1d20113fq8zpcf0lpr9s4dix84lyvf4";source="1ghh502n227kwap1ij89xj0i6jc518dvdg2cbsi5zmqwz7m1snxk";}; +mathcommand-59512={run="1mp9g6q271ymx59rq9lkdaadi7dwz3p1d0qi1495rrn5d9fpccgy";doc="1bjky5x3bgrfmfripn3dmabg0bg02h6xpl3s6qncqgxs0bnfz2vs";source="08l3gbrxw3aa028820iv2l1r5alnvzd2wjx5fylxs9lhrwhbmq2b";}; +mathcomp-15878={run="0ciipbbi89n9aakg86czfmasfnx0k6rq7f8v0wkxk3zk2m441cb9";doc="16q0b81y748qnyc2gycrb3jhw1i5yphmf6rpivwikzpk2nrg3ndv";source="0xdivrbkhn1fh75ws54i2vxgx3xqaqkpfjir5q84vwxgmxfv4cja";}; +mathdesign-31639={run="0jd7xfwavfn4dsss35splcxrqj6qwk18jw7qgkwshpifp7m79l2v";doc="02fsi2hinjfcf4pb0r1d0r82s50734srpkk0i9c566zx3m52v2vf";}; +mathdots-34301={run="1wbxvraw5lp77chgzslrrz022zgqn2fhmzk85cn7ggafip1hr9s1";doc="1ldl9l92y893dg2ksqn6n82w43a2l8pylz3iq4glcphalhggydcb";source="0dkpj8cychzl7gg4bp41qqi3y50x0dyz2pxanfli4a2anh2dy06q";}; +mathexam-15878={run="11rn665k5vg9w9rfgcp602v6cg659d4c22gikkgjpslc7bzrlrkh";doc="1lv8zdp1fajq1nms16v3nk7f0bc8az525nnjjjzags4rpl8wkzh8";source="1p0lalc0ny1zb8gc4bbg7z9pm6airbg63l1k0qqmwg10wvxpsjn9";}; +mathfam256-53519={run="0s97k46ysqvgs6a8aq5q8iwab390s90drd3g0ixd8zmv9a4hy1z2";doc="1zk42fsknkbzyx4m7xn3yjw9lrdvf6m7crnqsp1q7qb2nv3hn1br";}; +mathfixs-49547={run="1vvyka8kilv92hfsx8ahb200cl50kp1r4qdiaqgzkjag5kfxy1ka";doc="0gbh6yicv1mf0llfipqymy930zpq9jqc2ix2gfbjdh909l1y34rw";source="1k49pdi4kivk707i7fb2banj0qaqc5qx8zl2l8b41i6q2ir90a4i";}; +mathfont-68241={run="1yh9rlhg8lk4a4haaxlyaa76ij0i6rb4zbk6kryp71ks6hyq7vny";doc="0wsmsimscrkxbyx1mkjlhkiv3xj66q8r2fiwk8bspx6zbdr7fwyq";source="1z7k0x9gcyls65mfgn30dhipqwfhn78hwx51gxvrn7z45w4h52di";}; +mathlig-54244={run="0pyaqwr2h9knxf1axi55vm6wr9xj15d5j5pagb2011k3b830f91b";}; +mathpartir-39864={run="1a934cglbiahnmqxjg2695rmp8fxlg3m19zka8ayc743ckv92prd";doc="1aw9sbhgca7hnshkd2vyzf5lrq2xql25mwp9qyishkzq9ayv7p13";source="0bn3zragwja3hh32fbrsdsswlf07a8i6qrpnv2c1c47m86xk3764";}; +mathpazo-52663={run="05j5qgq8fralghp5wkx6bha1cm59vha29ppq96nllq2k2nqhpi3d";doc="1z76cb473nb6r0vjjxjwiymnk9wsf7pnycc3ad3ba4vd3yl1827g";source="0lmyc1q7jswlhlzz4fd6ia407jj4pzi7wvmrcgfyw20j2nghfcgp";}; +mathpunctspace-46754={run="1vlbw77bqi0qlm6i6hk0kz1syjzjk41mmj9nhnsbm3l8f5fy44bp";doc="09m2w7pzcahncazlw16c0bh6v3xgnm7rqf71lpvl8p33krasaj9z";}; +maths-symbols-37763={doc="0z83qf1rz84cr0b1zvwlacf24pc5r8dn1cxiiyl0xrqncl3279ka";}; +mathsemantics-63241={run="0vw14g42f9jhnb4k75qlighsngdl9kkwp921iblafs39zlx0fh7w";doc="1lkm8gysyim4kjggwm1dqc9158agxng3nd9kdksyxlna89xrgq96";}; +mathspec-42773={run="0gspy6kjnx7bs5dxap8ym8s0k9i8hczi6s4s97y7av7vc8j1fb5w";doc="07mmfcd0fvhrhafsfk4sb4dvs5x8x1rjk1a2xl20kwpfpp8l1rb6";}; +mathspic-31957={run="104vf0cbxhfbgabxjpypyx16fbpyi05k14dhw5ynmlh4rv3ck7li";doc="10j7z7yb5fjqlldf8w5sm5kic6v842dijd7f4v0b2q5h1gbhwyim";}; +mathtools-70607={run="0qkjy4a44z63igdp5gvnb7y3kb22l1x6v70frcbiwmhyagyqa5ns";doc="1q4bnkpyhf050cwla2ns0scwxjnbfxdf5jy5z8l5s2dxm5qrhg99";source="1lrxhggn7k6hma49rpq8zkfqvd86m1c45mdh1n3cn5nk8b76lg7i";}; +matlab-prettifier-34323={run="1q7i44n15pvpc65k41nw6z8gxj0nwk39mhafnmsibxh41yyxz9ns";doc="15x6lbj54597f8wm0vgf0yy0iwh7g7xv7cnllnay651zwg3z7h9l";source="0vr8cll1v3hgikrng1rilqb5d3kbggcmdy92hsdnip7dr0hxc39y";}; +matrix-skeleton-65013={run="1ihjvzsxaj5282xc15a4fw6cqj159m9hpj4hblfmjgjra5p597gs";doc="0109ify7qqbdrgrw0a8svdaqk1amm0njvawgh1ch8z7qszlpg4c4";}; +mattens-62326={run="1az5ld75djha5949bl1wiqbm5mzff77cvcyyk11qjvg7pjwa3h1z";doc="0mqsr5a2bhgrllvcqp03aacvsp7wymqnvsk1zswwscsrjl9dh5ka";source="15ww1gl01yfaw7gcm66z8zd2yhhnj15pw53crj6ma6j94akn1zff";}; +maybemath-15878={run="0qb9nr6m819axi9qn8i32fynlmkjvyvc45gyp6pckwj54kxzx06q";doc="078s9v2bly2q802wdidzpvwaqfdkz00wkgyhn6867bkbq89g4aa8";}; +maze-65508={run="139hjw2asv21p0m7qrpi5liikgf68kmk9v214njh107gi3cjl59w";doc="0h1lcq6xipzsw15cycraqjf4vckzqprv7kccls640y4jd38g3g4d";}; +mcaption-15878={run="0bfcl1swwgz83y4f80a1kydmxhdyqxld0d5cjfgxfhnn9dxp3wc9";doc="1afldwg6dghvkwd8gik8dmag4g2pb6ag3aks26qi0ygph05j9cwz";source="0i6sd9vm1pn9h570am4lkr2br81bhmqqwwvymb8r37xpmmp9yvsk";}; +mceinleger-15878={run="1a16g83g9wd5vdx70bq8zbr4hwm8fk46dpsna97r9fgh44n85pv9";doc="09z7srskh57mz055ywyxwg4zcx07vq36jdy8z9w6w74af4icpll9";}; +mcexam-60481={run="0ixgrxw0fzaqbkif05lvd3z6zlwhdlyhfb372b98ypyfp7f7v1mf";doc="0wi7zjiw93hv74scwz4w4prmy00x6n3ncwfrxjyxn2p7i2hkws6x";}; +mcf2graph-70167={doc="15pcw5zy9ghrpw1q9b6sck9zvjdr6py8j822zvdq4ca9qg05rlml";}; +mcite-18173={run="18did9achsp32k7wq4q75a9q43jxdm8k40q41j242gndnkn8axw1";doc="1gdsa91a4snk3f22mh06mr811b1kb0vpi30ss84d3mrnsvd1p0ha";source="0q1bv5nx9xf6r1fvgnxb1x720dm0xqrqg3kya0504q8qb0kgxqfj";}; +mciteplus-31648={run="0xbk5zrd9mbk4xid03j7a0c96s311rb1vjawhvk5waqw9y6dn476";doc="15aldir7viryb2f8vi0a83vgbdwbp5gcdg0slhp6j6ka6xv7ayhs";}; +mcmthesis-69538={run="1pz460nrypf05knd6lbk6sggpwsn6cssv71x7mpaz4557na9xg1j";doc="1mzfhkpahw0gc1q3b9yr4p4ya82y0y57ij3n12i1sqk7h4m3m1vq";source="1g7i751plyf1v4561z827xkk586zn8f364xapcfvky54lyw7v9ny";}; +mdframed-31075={run="073gcxy2s8mskf4mvvs1jr8fkijci1ayg0b5r5xzcjw0s5azny1m";doc="0m8k7h5c0h1fdrpdf2a4vhgr8saqspk81c0cdjm2cmbsfm8zlc3s";source="0p96sl69p5342yy9fgw5cnkfi2xabdwb74mw7i1gbxvj0vx1f2q6";}; +mdputu-20298={run="1ihwhdcmk3gd081yn4wimg7yadvxkygybr3bypqrvllwa92lay3j";doc="1hsd74svpxxmjps3fng679hq7dm35mz9glcwwhk1carzafmm2ppm";}; +mdsymbol-28399={run="1rckczggrdd977n7dr223zfvp7dl683p7d6wfija8ln4d1ll3lz8";doc="0v8d92kpka138yzy4a8hg5yf6zrz267hhsakpm2f0bamdzqkp4kc";source="0xh9d4xpdyacmb3kxmqh71qfx0b5qbrgxrw3fj2nh2rzh35smsy8";}; +mdwtools-15878={run="0l40ydzljgydp8qfq1lm9v8nz0mrz4zxpjxicypn2hx7bxs2b9rq";doc="09d2ahrpksnjd4x7gqfx7yw51ivfpv4pwi6ms5c394c3v30xak94";source="1w3sjwa0n3pyn33k4lwnzcswm86zj9givshk0raq2qdb4znvxsk4";}; +mecaso-60346={run="1hsgs52844fv3yfzhylb47hpgjdfkx5wvgx1ihslkg9xm432z18c";doc="066zg20m9hnm2h0bdbzfbxcjsgpbm52l6xwrszbl2ycinqf4rwdx";}; +media4svg-64686={run="1l8ncn14k3khzq4pvy0var7j7nr78vll42bfz1m3cxi5i144ygn9";doc="1ws9j415nkj68ypgmvsc3384dqzjrfab0bb8khz2rqq98sv6129l";}; +media9-64047={run="0891l6dfz89fqy35svnk1rl6vjwhza86km8vk85n9wp322vqnrha";doc="1v0fxv93qc6nj7rskf7gd8ra8i7sll2aznrgs7q2bml9xnggvq39";source="1h3p9v4p4kr35ixpwwv7g8fwgy3ky3haa2ypjlpzbci7jcb0ix5f";}; +medmath-69510={run="17i7sanjgagb303q608b86a77k1p6zc393mrvkcyrr8cjwviy9wx";doc="1306k93xy0sky7lkysikiz2zvd7a4lkpv99spifyi31y4jxzlqrp";}; +medstarbeamer-38828={run="1cndcpdvkdvjx07rfan5dd7yg6sv532b6vvd97cm7ag2g1aqcilq";doc="0i995yaqv91h4iv3h7r5m73vb7xvpjkzrh6nddcjjcsv2gvpjcxi";}; +meetingmins-31878={run="0za2aqj7gbmxxdm3hqkq2sqkhl3c1q8a3s778hw164dfpi8jx85r";doc="13kqp3561k9pcz7lmh7izmxw8iqq0s1jlhvq12dh00wvr7vwr8dr";source="0fkgaqldjdry08wl8al8d0kppbsqqhig83mgwfk20rzpji298b5x";}; +membranecomputing-64627={run="0k8kgr6rlrgpmmylf3vjjjiyis49lm1r1hnvb2m2k3481gfj7zfz";doc="14hk6rw8fj040vwpqhqajlbzlp7g3c7szprssxx148j816fgi95c";}; +memdesign-48664={doc="0aij1b7l1kb2x44qn33m39k0kbhdrclmr25nmvzfn6yw42lh9fz7";}; +memexsupp-15878={run="0h3n1bnvyxr0ylg05fm819lzhzd7kbip5p5mr9kc5af8pd6yci9k";doc="04zwmw6varldbg5cxzk4bv8mbh80i9gdysfxpn1i4xb1la38b0bf";}; +memoir-69600={run="0zfab6dc435zy8cad1zi3f6d29vv02ns9cpgl3z14cx7qcm62c3g";doc="1bz0x9ph9l665rsmbhdwzgvfm1y1nxwm2mqbxlz4gjaqz7wf2k0l";source="09c78l1akvc3x98v47hwsky52wrx81y3dd6v765s14jjr1qahsx3";}; +memoirchapterstyles-59766={doc="0jxd7sbh5vc3j5d5jd3zmyg58kwhy550l5z8q14b4msm00fp6z0a";}; +memoize-69522={run="1qdq26cms38kjzws2712skwdxajc3qa9sw3zin0h5776lbbz6q7x";doc="192jsgypxlhldfn5if2zjs4gp2a4b4p3hwg80c0hpz3qlvxvi05q";source="0xw8207wn9h7yr6q378631695c5m2qars2adw23n6v0fxcm95izx";}; +memory-30452={run="1zgfjz995jbji8hycizbp614dn0g13rimh9csgrga86f1ivgcpmx";doc="164nnsi25jk25p3kh54w2l8zk0rri50p0s9g4r5f50c3wzxi1g4h";source="0mhxxhiqq5miqskb6c4hmjdjki280yyin2dh0md59ai1aprgd4p7";}; +memorygraphs-49631={run="1ph43wp3h3pz5hh6dp3n6dzmmbn0fw11w3v2fjf6d07a73jqh97j";doc="1k8gppgv5kkx7i799mwc9iclp2rv9hgdk2bwnqcyc3j3rmnpyiwa";}; +mendex-doc-62914={run="0ab3hrln124gwvgsszd4l4jjrc705x3wbnmrrf27rx8p6fcwwrmw";doc="00m35j5wkcsyrgp0h8mf6cx30bjlhv23szmclpls70af2shcmzba";source="0sqp5s98lzdjnvpvw3hkvclrz98xzx6v7zrlag9m1im7k2ljlcvy";}; +mensa-tex-45997={run="0gg38ls6fil67d0ln2yfjbpi2r6cbrnavfl926jbpxjfh4qxvqcq";doc="05krm8b1ylr8wjr0xy361whm0kn6mj4y6yrycjj47927xnij5qfz";}; +mentis-15878={run="1pjpgn0lmyd7y7qbri8f7s01a1akgdif0s9v56ia2rsimn5fgbzr";doc="1r6799zz3y0iw020wwwl8a7az2j5b894i7w0pqqvsq05g4g00fcs";source="1ajy89hkvcika3aybpz93myylwlgfilg1d432my0jvmsa40ikcdc";}; +menu-15878={run="09mnnssvb83l1jhjbb4rb6lbzhwf4y4y0mq5h36dj4h2hp4qfi55";doc="1g0ihkjlnf9v90x39mm2jn2ziijildyiqfda5bkm441pjh40x0pc";source="091a0akja0y153lhhplb4v0n4z77qvxh9nchlr0v5sm9bbpvpiyd";}; +menucard-55643={run="13dirr45ysvi196wgsrdrcxspynzvrk88rdacrfq84l4imbsh683";doc="0sbgrk1l2b9mdhiymwvp6zci4nb86rn2r06chdbhgy9lzija4wdv";source="1pg4c26pij7p218a0r6mcwbmnsgdj7i63z8z7gq71i8jqpfcmlrg";}; +menukeys-64314={run="0039xx0qilmji8ch0i488hx5rnhf1brk6n5k0c7vg7jjs4xylq7v";doc="0a6fnclh6gd1n0f11dg23gykhsr399qmplq3a43wqqgichsn2k2l";source="1na3y08blykp1bs4bqrjx1lmmbiykfly00n5in8x6h0282q031i6";}; +mercatormap-56060={run="1gw28rgsdllh8h9cg70nayj12aqw356svv34lhvfj5b52y7ykabs";doc="0v9v54qz9m9hnfid2k9xl7fwgwhjxnk0g7wndxypd73b63mvfhpi";}; +merriweather-64452={run="00sy3iyqigbmjz7v6lf47f88mpjwgkbhrnp59x9xpaqwming9fp7";doc="0z3k1w905vlawv5lrmc55q637bfz17cjndlk4gh868gqv5j288v5";}; +messagepassing-69123={run="0r8qfwyip83mbvmfgvwrlypms90g4da0qf2ka26pki9r3cn9syvj";doc="0vicxdrd51gmk8627k7a1n83ldj0kgrzaxmwmg5y99n619pagxr3";source="1im9h7n2dpqdc8hlwf65m4ss8y9k28iaw29nf0pnlh6qabzqgl7x";}; +metafont-66186={run="1kw37drhnk7qajmivvjwdrh5awns571wclv8b354zk71axf6cr35";doc="14fwpwp4kf7x7amhxwjng2b5qgqarhrg1dhd7zds2xxmbipcnxga";}; +metafont-beginners-29803={doc="12hhvlnvh8dj1396242m6yi0341cina7sxrv7pwzqxzzahwdvmgm";}; +metago-15878={run="0km18bf69rf3rs42b0azc7i8bypy14201vk13yf5ahsypcjcgqns";doc="1bx240q75pq9v23gz82i26vrp7z4cb00f9nb3cvvknbndk8y7hy2";}; +metalogo-18611={run="03crm3sswv7mz5akghqvkq1zpiy9jdpy32ivwwmf14sfrrri2cz7";doc="08vgbmjhynb4ramaj68i27hpgijg51j80lm0qf1jrfpapz7lrzij";source="1ak8qbcbqgirljfwhq7ylxk1w2frxfkjvadjq00cclj007idr3x8";}; +metalogox-70496={run="11q1i8cmfjw521xzqgw27vn8bds5var36nacik8ffflgb3f6j36g";doc="0d5zsshzj575y5ry0zvm39dhigcjf8mfh4ficj084ss5xgmf2qyr";source="0pkbi2f6zsx4c0wv501kkia2mz6cgbcnln9zbvlnrq9lk21jsd1d";}; +metanorma-55010={run="17vg55m4yj3xcfgvmm2kw8a81fblwykgnbcn65drll10b89wx6xp";doc="0z3mr4aw6gqdj4621dlghb4bsc5i44mlg81w81by98783fn4xdyl";}; +metaobj-15878={run="07p2r8975ps1ricqralyw2qz1zq5lmaaf50xqd68qwxmgrs3541z";doc="17kqa3h13p9vba6sa5s29v29gkm0zbm5wngb0zx1lxwkpkgqaqv5";}; +metaplot-15878={run="01blkf01b89a2f1c7fw6dbp49iw9qw94krv1hiqg7ckkj8j06sp8";doc="1fm27sy0zz3ppzz95bngipkq4m498g409igx4xcbkmqaghci1pin";}; +metapost-66815={run="03ryd794cm4srjmq6x0vly4jav0w0j5p4yhvlqvsnkk1qil74nrv";doc="1ihf0m9p73k247mj90hns4afdqxz25yvfbmpxrbzi4w08q5rdxxk";}; +metapost-colorbrewer-48753={run="154yj9pmwlmdq91kw5xllqah7pkccayv8r1zgvlqgk472x66zrzf";doc="1y0ml5ldridhcg8k811dqq2dh4xsx48cwfkliygq0q1kkl34vdag";}; +metapost-examples-15878={doc="1rslyjnw27b5br17cbf6mjjkcgyr49yav4kw12spm3vdwyzb7gxr";}; +metastr-56246={run="0ci2qs1iyyn55zl6n12yn20xsff42dim744sjkxml7xad38vpnkz";doc="1jhvf4xngi5mjycbrbijn72p8anx15r1n6vh5hrjai95xp9jn88a";source="12rv9fayml2kjy7rmdh6d7g4xr2yg3r5ngky467y663p893nxk0w";}; +metatex-15878={run="14s2my2zs3sx3hy0vapi8zvxb6d15fl7wqsnis58w11a3kni4f1d";doc="0z0s4ys1zsa2s2m4slpjdikzbkw8k8m780gb5mh2j2azc7yxlsdq";}; +metatype1-37105={source="1nhbsn33w6zbzbvi3a32ng6ib5dbh0vll9g2c5ssiv1ysxqrg6yq";}; +metauml-49923={run="064cyc53izb7fqc6xfk7pygr2k7wqivx29rkxzrb7sakafwmnkq4";doc="10n2xhjfysqihmkrzgcg96vsh0mh76h1jjcxx2nghydihjdggzjr";}; +method-17485={run="1aafzyca2l34p8jxgdhwm54yw16znd1085lx58wrm2fjw727946k";doc="18sjh2kvy1f3c72w6k2m60jf60zbz7bz91xgq20wjigfagdmsqkd";source="0ckvvf1h80mlzyqbd12yagfl8hph9l7k35mghr1ri4k317sm3ls1";}; +metre-18489={run="0vfb01vwb6x5wf4sq5j1rrl3jpzw0mwfqy1jkkirxkhbim5gln25";doc="0zkr3wymlzxnk2n9h6nz65a1gsg0k4pfabdrkc15wfdn0yczicj1";source="15cvprv3zg5nfsd5l5sj2s2hgx5gljn1jqzgcr4lpadpans14pkx";}; +metrix-52323={run="11hcw66f3r4rvxy8h0znwgrdvlfvibc6j73pcdb3bvyywb3774gz";doc="0hx74wi8vf57ly8yrzdq6x5qm8l5gi9km4v0ma66i5v40i9jwgcf";source="0i0xzmhqbs91qpznbanlhrnqvgxc45llk0wwb4mfcvmj622d47bp";}; +metsymb-68175={run="0b306z77z64wzk5smm506xsv6jbr3y6ajwia12i06fdynx4jajp9";doc="01x1qms8mh1523vpc8ky87x2zc05m0gr31qwni60k3byx9zi9blw";source="1g4kviik4qg9scjp7mxaf3n6kzdm7z666iqpbyz6dmkgsrsph99n";}; +mex-58661={run="1azsp6n01qhph2my75r05sby7r3lsafydsxv8f5532dkb9r86p5a";doc="1nkr92d761c7yfb9aysni3ihidzw334w4180d6r15k1iwinrn2al";source="1nd7p7ssh79rrpv5i0z4246cv4wmjgy3by66bbrv7w2xhmh5819k";}; +mf2pt1-61217={run="17kjgjbjvwnh3cn4cky3qj4kaskiis4h2zxd0mmq5h87qs24zj9y";doc="0iwnr02wbh36q9nfj8jxc5d5kfc1wzap5gspix8n5rl3yzi9xgk4";}; +mfirstuc-64743={run="0bxy961jghqcyf4pkd3pvgri2dq56s0nnk42ar3vyha4lj0pp5cl";doc="03nfbjsk5yvjzn5p58rq2s8bn4a982vq7riqdj9glr480cmzbkq4";source="0i8wfvdjw1vmvngfj7mqpahx1c8gjigr4y51yhz2xsrxhlpih5jh";}; +mflogo-42428={run="0swy70pm0pyqzy1i5wf5hc6cbzn91ihw8hwh9kavdfawb4qzjxxw";doc="1xqk3nwpi3drkzrnr172i660yx541lxxw3wps0jqbqficqn4fiw4";source="145hmbxr5x5pj2whra9yify9lyx0ak1az31gvwr3gp5klcmna8p0";}; +mflogo-font-54512={run="1dx834zwbrwgp2v61fagf5m4zmxf2qkhib4mkpw6iadcgfqv6x7f";doc="03b3qg42axqhs1lvm3pz69m4jmhd1385gzg1sw8bqyajlrdnydyh";}; +mflua-62774={run="0ngbhdh8hgpjfqnrjlnp27x3qziks3yf2zp1qq7r4bjfa5jx9gr6";}; +mfnfss-46036={run="1m0yza8nw5r3ph8k5nihgf93vf54cb0cnw4c5gkqy0rsd23hk4dd";doc="1ppjjma5dc5i9ly5y7h91647nw9c2y9w65k0dn1ks92xsvnzf1mv";source="0qjz8dz76abwqspab89z3a50nndh6gflanr8hn31z5fra3kzfp90";}; +mfpic-28444={run="1r8xq6npgnlvcyimi0xlqmqa140p94m5x832x0nfm9d550l1zrgi";doc="07h8j6afl5sd7hz4gw0rkix1c39vdkg8376jgi7ypwvk1xr0wgp0";source="0ynnc1p2xihrwzfyg46dljbc2f28l152la8f2z2y5zfvd08ir49k";}; +mfpic4ode-17745={run="0jdqbdi2gqb1v4cqahwss1rj44iw0753cq262j8zmaarski351a0";doc="0sbsb9lysz6hysrpf9dfgm2zn5qcsv7aaf5llmy9kan0m4h84afm";source="0iya4y3msmyq468zj2msq93xpa01044kmnv4dspz1fmh0324iklm";}; +mftinc-15878={run="0yhw7zpmbc3780qm46p5sc2qq71s2vhmfmi3kqscck876h4935fy";doc="0yxpbp501d6vwsxpm83zjhypvz3xz51f91q414zxjvsy1cvvprr1";source="1zamx3658d8vaik5w30hvia5y0hp119vhvqhj4h5kkwnwmz8hs45";}; +mfware-66186={run="0kcz1gy17819w77sf0l9m5f6rw8dcapkdbvwaknnrmy50v0jfs1n";doc="0z3djvzs8l0w1j7h22hc19r2i49panw7m2lpp22lshxybsibr47y";}; +mgltex-63255={run="11xl6nw76hana2mdcq7m4h6kx6zx91apxcqkgjczcw9f7ip6m3cl";doc="1939pnggbc2vcvavilcssf6i9j36ysv8k93f0bz1rgn2krja2d22";source="1pdlxf2qfyzm3pjjpl0wir4sr255lqnspbsvxfy7wz78aii2ik5y";}; +mhchem-69639={run="1mvml2z30q09rw24laybbkacf57jav8459nb6qfj4z068r9bpifq";doc="1f4nmg09mg2nykrrynaaijkn7xjlk3szccw375kam6b7ps37srgv";}; +mhequ-64978={run="0zyp8x8qxjq3z6b8dm3pgls4z9cr03qiqxlf6d55ylnqmdd68w68";doc="081mavy3495k4ciqvxd3hzkb2bs7m0s5jm8lx01z85p568bw5268";}; +mi-solns-49651={run="1bv7gr2wa11cbsznz414x35n5yy5jw7q9kngnb2h5y73v8bnzvc6";doc="1byfb723572whq315zwybwm1bcvcn49km80gn5bi081gy81r75hw";source="12xrddxlrngjnk0yk35spk886yd9p3nnz6jrp51dfzw1xz6pkivr";}; +miama-54512={run="0138r1yrv1880nmcpgcgb80nzd29xchm09s8wxb53j71q0vvdswh";doc="0dd32q8clxgkd7cdk0699fzplnib4waydx9y9i33lxxwjkfnfsbl";source="14d7ryxz6q17jn94wlj5vf2hzif6i08yjbxh5z7pdcgrnl035gxj";}; +microtype-66587={run="0hwwx5qzp55pvnb1c2h0ia8wp7gm4pniagb2wvg6dz5l4hja3fj5";doc="1bqr4ggi96wbmrd75mfnymkplnbwscizmf7kkfhd29jz5hl5x2x8";source="17gdym7f8851w06y0h4hdz7s9967i6x9awhqgw0i4fi0fafmyiz0";}; +microtype-de-54080={doc="069d2f0jcg9m4fv8dli2dr9ags9gz6mkwy6fzz37ns4jzrqfsvwi";}; +midnight-15878={run="05hzxlzr19snz16sddzpyh5f7vvs6jcdsqyqvqga17rr8y04sdwz";doc="1ky8k2ys88n6hn2q9v9gr71g772gm5zvxlbzmibvajq0hhqm41l8";}; +midpage-17484={run="0hh4r2sgdgzm0nryzqymd66a7hr74rvcsn58y7dc7di6mhikrysn";doc="0jfw5wd6qbxhf90mpi8fmv0nbazkbg9h65z91613j1ynqqf0087y";}; +miller-18789={run="1nk31l9g231c3dk70fqph444z9x5rdjy6g7wazy4ygl3q4gfh6fj";doc="1vvxnbbjn325y9s5h7qp6v2z1xy6wwppwqv6iwdak7mf47gww2gf";source="0jpyvjpaqz1x5avqy1dzf22qwss7ksbp917ncmgjdxhj82jhy2d7";}; +milog-41610={run="0v5rxsa182n28dzd3l3y4qdsz6rinv3r6p94iy73r26j7jgsqd5d";doc="04z8ya5gba7f5q86ch57zqbiz81s62hpdbn7b8jmkyy953g5l8vb";}; +milsymb-66697={run="0m2rgn3am1idrpmjply52v2s8frxgbdr80gxiy69fdk2psqh6lcf";doc="0cvy530713p15r8kd8rb34rvmryk5mkz7f519b9jzgl2i5kcsadx";}; +mindflow-65236={run="1i5a3jnyi07sp6zz3cyyyyp8gbimy7ypvxsg9220cyws2z65d7zm";doc="13qpcy8bwywvn0yv8qsi1wmwzlhw3yawg5dnb97mkj607cj7bzhz";source="02amv0fn4jk7k4x7ammi1n5y8c7b18hjs93mm6zs1pxsvxzc0j6f";}; +minibox-30914={run="0r94l5sy4n97p895xk33ir3dli1ngy3p67w2d3i7f6hi6czvykm2";doc="0bzd55wkdxw8spw4706nj0sk478zbnvq9cnkpid638cwb6csb21c";source="1dm8p6rjivm0xxa7px5dvsnrqs48zwn2kiq3vr6gdqmiy0ld1v93";}; +minidocument-43752={run="1mrzcxa59kpmrkhnnv08z7h48bj74gk2b0q3bvhmvddd6047yxwy";doc="0dl4l8skhz7fm23mpmgmy593f34w78mm5qwab5bc41sg0xc0lyy3";source="1n0qf2r1mjp8vx3s750fw5h2q51pp3qxf90gds8bzq2cv6mi61sv";}; +minifp-32559={run="1vpq8mh443hhmnf5cgj37jm362m90zdhm55jzqh1x84dadqpmivf";doc="08f3hp3knyc37a2fy87i11q62dlb35ri197gxm3ghl5h28zvzpfb";source="1l837v8c70s8x1xn4xhag6nkfpayamgzk95fb23qw23xpf6zp2wv";}; +minim-70320={run="0219g17q9nd7ga9lbg96wk5jqhw3i3cfxjv44b116gbnkrf57z9s";doc="082yk82nlcjq2cp5v692g4ph1q4p9ry51sfcdjpjx7874g03wvax";}; +minim-hatching-62395={run="0raih3zsaxpas4myf4m0bmdxqm1av62cldjs4z768nndkv6xl1iw";doc="0bngn9d24w77dxi1s7ad87gi27m48d4jr2j51cpmmagfdvlqnfsi";}; +minim-math-69352={run="1fa8a3jq51wm23ivmb5n6hrcbyxcmhb95x08n4lmhw6x6qsr0hj7";doc="1dpilbyr9hdik1lp5lm860hjk7ni9adwn3dw82pasiipqvy8qzcf";}; +minim-mp-70322={run="0qjrp9xj5cra1v0j98ibsi0icr5if6267ipw43ff56q1haf774x6";doc="0rqf8mdhbz4yrka98n3swz3p3q96czjmndj4n3n68klzlpl45v1c";}; +minim-pdf-70321={run="14zl2sxajxs3qgb5bv7lrraww3ci4kdvnflhlnmgi4dca5vnfh61";doc="11wd9vir4ph5hlj2hfr49qf3w77piv7dccwnqm6w7c5w661b9i7z";}; +minim-xmp-69352={run="1pyf6qisnkh1600ha6605if690715qprhwrakygq71gl0ak9xl00";doc="0vyhvy71ajr2d4dii4kp2inyihra85xvmqjs1fzz1am5hbqqmc7l";}; +minimalist-70329={run="15zd2zj5v97mpsczk7qw8nnk7fbnxscjwii1bf2ry0f7707n8if5";doc="0870smwh2sqs7qfkxpmwrbl2ahq916kq3cl0qfmjqlcsjmy2plmd";}; +minipage-marginpar-15878={run="1qpymibkrwdbyf2rlvfjj0g8agxisd2ym3xi7lzx3g953g5whg5r";doc="06rivjd4x8mdpzv9h1yzkjbs317jvxa78zbv1kzyia7fps74wi1b";source="13k27b7avz3v2jadjh84w74rsyh4gz2x22b8j5lv6yvrjnwv09f6";}; +miniplot-17483={run="1hl5nd6p9c1xhm1kpw9sh1s81ymdy8lxfn7wh1sdvildcvclvd4q";doc="068s76gnva6rsnd7gfwswxfam56dbiw9s9ymqr2hcqx7i4dl87x4";}; +minitoc-61719={run="0v80ga66rg4cgifmyfa5vq52v5wz48lj4js0ym9197x2w98ra6ry";doc="07dah8lz54ccvrgigrvgcmbj76ppxaismbllfwyxcgkrkvqzxqkj";}; +minorrevision-32165={run="1mcgql832xmgpcwha6l0d282mhyva6xmyf75gbb6inwbgg6qkv9m";doc="0x9lw8xzmnn015n9hyzajnl9gicafj06gr2msk6vxwk136ayqfiy";}; +minted-69163={run="0ksd9lcaqvpncs236vczpsxq1ymx7xxhwpqix4n7yidzyypxnbix";doc="03305wk872gh9c3pish93spfxnvpawcbfjb1gbpbrnjvnkcq92jq";source="177whv7b60pmz0a2r178dw76s4bqixn0zpmr8g3c91gd3q07amdc";}; +mintspirit-64461={run="19jvqcydiwwq3kv5bq6524wsynj52b8mqm3j3wn108z7rhnampg5";doc="0mwrnf6q3h82qnxk9gy9ns12k9lr61z92vmlyx2x745i8ra7b551";}; +minutes-42186={run="0yc7dkvbn0g7gm07h9r62ma3aagbgparrlamh462a9ckdc7jzivp";doc="1m8blswmxhcm2ya966ajknx9arz3yh1sn62wnyxls220af3401ss";source="12qvfyiscs3y1wk3r2mdq7vgkmz1ldsbg3wz4agib97lc30qqmif";}; +mismath-70260={run="0as70q31730lzyhwvmlk3g8rdri3lv17vhqk4sc1g035yi18xxpc";doc="1f6qnin00xqlx4q85n7r9sq75w3d1q9q8p7kgvxpcvis3b3w1q1i";source="0fjmmpcr76fcwdf5g2pbg72hjf42cx64pdkw6gj0ncs461llpify";}; +missaali-61719={run="13y2dm6phd9c77j3rajvz4qma2h2k4nwhb520j3mm98bgmbkphf7";doc="16487s0ijkk6va22rhhyhxdqik863n1i25p0f67gcb8xp1s5l1wk";}; +mitthesis-68732={run="15z072l5qzmnn09awr9gazikc60h9f3z061qh0fy3j15gr3sw81d";doc="02b0bi0kycfm5x7z2xnbphamzm0xrlfvqsk0c01ni0gjf65j9f9m";}; +mkgrkindex-26313={run="01db35xmg9583hkr9bpflr6rj8bmvidaqahpvkr38bks21466sxz";doc="04p2xaycwszq5dp8s2h6gdm36l800ipvigblkm8m58bgycm553fw";}; +mkjobtexmf-29725={run="19nxq3k9jf4bypk2al38n6igpca369lxqcn3da8cm8c3m511nsmm";doc="042a29h6sq9mpy6chfkl6893zcpb3gd3gsl60xfwglivib706qwz";source="0q2i2xgpnjcx8qdkk47q7v0lmjdv88jjvl7zcybnhcaa9km8f9na";}; +mkpattern-15878={run="061y05sa0a12x23f68g7rinllkggjfghgmrq2qnan34f1ind1g36";doc="0b3ahrhxmm6lwijc7kgvn0k17fm9rkp7i754zrhfj7w4xgq6i50f";}; +mkpic-33700={run="0sib2pckayb4i7lxga35rkxvy05ix6idifcqrlcbmddfix3djrzp";doc="11pj8q1zvblsc2dyd68a0nri9zpqzrp9a6lha5dk91a2aygzaf87";}; +mla-paper-54080={run="0yzfqb3x58qzw5lcyw3f6c3xyd98zx7zmz9j2rmv42r5wj1g668p";doc="0kzi1gnla04shaiysrgyz4ak3l96h11shkrxcj0hbav43ndj2xhl";}; +mlacls-67201={run="1i6zkzy0xp0zpi6drq512pil4gxyw96sgsfx9vz45rzc7jvpbbh6";doc="1wsysqqv00fdcd7v26i5840g1hlrxdnnzznh1yz7yj3pwz40b0f8";source="03m5mqpn7bq0dzynwdmhxs207617aplvbc5ra1da7wifnaradlsa";}; +mlawriter-67558={run="188kwakrn0ca1njpkgyq6z1x97ky8imxqgpyy9axcsm2wmzhmf4v";doc="0h1302wyl24ilvba68f8pjwhndmqn9n0h3nxr5ifhk01m8359nr1";}; +mleftright-53021={run="14lvlhhjj50v31lgf7ywk5dx7d5gbnivssl15qzpa6s619q2h6l7";doc="13vvfx4wxvf5liv641lwdm3hdba31rfrwsmirl36qwbrqsrl8xic";source="004ficd5chakwcklbdx83qp3985s1imlz5knc7f3m51zxgr4lmw5";}; +mlist-15878={run="044pjvbyabzqashbzag37ymqa9mr0c1qg3p7rb1j91r0y5s8ra8d";doc="1vlxzzg6f3jmcmp8fjn58gciywc2qgw9v1kxpm7qr3vlv40pdb13";source="0jim2g5qc9cdks4r3yi67hhszx3kkh26hhc0zgm2kx9syhdjv057";}; +mlmodern-57458={run="16f5cpczawzx4p44svpzy205l9m9g06w8r0554cgdpqdbwr139fx";doc="1rqb0g16wj7jg65xm0rk68cfz9r00zwy4r73wbkn0fqrchg08yn8";}; +mltex-62145={run="0j5282big4df396xvk2xaasl7cwnjn2sa14xj22xgzvrz3hr4dvj";doc="13c7a99jl0y75nkciir5zqdiz8dgjl8znbyrb485xrwlkzm6ygq2";}; +mluexercise-56927={run="1yhgp5cidpkh4ihz20d1p445q370bh25jwc8ikqdq6g1qnf8sdv8";doc="0xcifm779nln96bmx0kvkmnzc9yk2314yc6nn98wm7gqdw2bf21s";source="0mq8fa0vd762q2h981mj6is4d5vry2qgggbbmffvmfb4h76z5gh2";}; +mmap-15878={run="19hnkczxhxcr7pa7880mfgjfhjwiyl2yxhfz67dsrljqsfpi19nl";doc="1f861w6clfn3k8gc6piil6bq6admbyr4kxqnkw8hh29s63rdn76j";}; +mnhyphn-69727={run="16bwf5x7kzzqk7b8jm5p1pfsimgqk30drp918pnhpa6v2y2ssls4";doc="1ymja8ffh9310m41ibgahll7ry9jx6c1aqin0frxks43a0sqf1bv";}; +mnotes-63406={run="1jmkh3bpgqc1lw4q7s57n9p10wjhflck0lqrjxjni4qaqxhg02d0";doc="05kgkxjhizwpnz60r9kjlwqzv66lxc4fj1wh0199fkn1pyyjdrcg";source="1xpdyv0l87mb3af5iw06823iajk2dgv2dg0298nvzm8jj3ip6851";}; +mnras-68878={run="003pbz6wg81ymv082vxd7dzf37c08ym2s63c91yxvldn93p795n6";doc="19mgjg8yisia0jdgvwq0jdg0hj8qpzl393x0w0vkls8s82j2jc7y";}; +mnsymbol-18651={run="08b0ypa29zkbch5isk39bbakg76yp5g7w4caahphdljkqy4k27zd";doc="0pv7717qcjd5ps6vnlmxk1bqvkhi9lx6j92i6ggnak8i1izd75fw";source="15ksx2lxxyklg4dcckm82hysin9r2v7pa3v8gjns4wabj4hx7v4m";}; +modeles-factures-belges-assocs-67840={run="06n2871v6jx29r8qjgcpg4h3qbnc6kw24kfk2f08wbc2rg2xdkxn";doc="1509xrny3xvy7nii0v1rga8ip18g8bv3d6vf8a3qn0cayfa9p248";}; +moderncv-62128={run="1icns5fym56yp1wymsf50cl1wh1vc9vdix7lxapp18prx3y3kf0s";doc="1sj75g51dx8yd13ywyyhs8r135pgg5jv1h0zshxsdpj7b7hbdxf1";}; +modernposter-47269={run="1qc422hbqiyy6b539r7kyrshcja58mifdvs3bva1ikdxanxhnaq1";doc="1z9b3fanm97c3ik1q6v06qfwrgqcqwyi79h5dlhcnpwsm5dxqj0s";}; +moderntimeline-55518={run="10alhs944akmqfslqzi09436mmnjz8nm85r8jpjwpfcx28vfdwnh";doc="1bnz01q5rib9gr724gq6saxvzpg3lfmimh14rw5fn0fcn9bxlwsl";source="0y2kfxcpacslpn1ly6anv0hlil2x6wlsi37w9b8hj7xfx95qh51r";}; +modes-69113={run="05xf7g14jgs8whl3jirb2aww93mq7l64vddx68kl8wqc43j87v89";doc="0xpl3y1na7ldb3yjp808nywpg7fqf0v2mwc8rlv3jzpq6lnqyjb6";}; +modiagram-56886={run="1d3sz2yxc1n3xk6haja2yz14jgcl15pp21y985h7dflk2yjflabx";doc="1a42ylnkigyvvkk0yrxcpypz1qlki9r4jzpy6lpky0fa6bfbl4yc";}; +modref-15878={run="0pd0qd9yjhvdl3icrgl40lgyjsgahjw1jgc2ah75bfcwj02qm4v1";doc="0caqpnyg5gbv3b6336w59nn0w9ic4p12f5ig2n7r6kg8ydhp53d8";source="0n28d6x8w9rh3hah7p1imairyyywssajg7zwssp03dla0xlgxrql";}; +modroman-29803={run="17ijrx7f87pbkwbyjwigz3jr85fwzq6rr0pz1591fk9i36jhjaal";doc="044v0nkz0h1c7xsb66kmpqvr5gg4lg1qkx1x2qm9ijdpsbc4zsng";source="15xy8jpp2ac07qq0nl3nskpv62c59xb8qkl51irvpb0m01d97y39";}; +modular-44142={run="0khqcm28cq8cr51wmyv954zy85k9dxvmiszz5w4izxvyk14d56sq";doc="08qhmna1mbra9395gvaqbaqi3rmyhhckx781x4zw5439z2bpmg39";}; +modulus-47599={run="03sssw7yg7pa7i3l29l049qavwxphih5jvc86nysdzzng4a4dd7n";doc="1ylrs9705mgb8ijj9fq5w1yyd2fi4ykx8gpf4ckdr78h6rvzkr1h";source="0gm8vwidnls0z31zxcd348xyc4rrvcffncnwmazi9p1zplhg9ggk";}; +moloch-70496={run="13fgpqq3l0qazx8mz2rdagz9mbz9q2rnllw6zcv4v582m7g3lyb4";doc="0jma5jbzz6zw3pzyp0p45m45i2y1b0cmxyk0k9pasma0ic0x8y1i";source="05wdka0qqp6g4n8r5f94m6yffx8pzvn5j272ybpzknvkqfscbzmh";}; +mongolian-babel-15878={run="0qv413sx05pz5ri4p9znb020nhb8m2ybapcdgnxvkdamgbfvi17s";doc="1zprq4x55rbd667ll7a1rcscbqvg3i4wafmxnv4bksdm8p512w5z";source="0qf83v7iphfavxh7kh1zav95r6q3k0aiilzwnc0mm607bkjzc2x5";}; +monofill-28140={run="0kpzszxph3bx34flvhz746xkdpcc9mj0srifki9y8fa6vgsk2rz1";doc="0czdlvrwav8n3p9afa40icddh37md6g39kmy02vcnwmn9k3izp4p";source="1x5raychfhcjibln59x01fay8r25fwxba4lwi0bnd51drvzs76pn";}; +montex-29349={run="0rgf1rflrf98jayyhj1gxz0mkw74qhd88b4i2ccf3mm0kzwlvw0a";doc="0w9izkjmb90d4x5j1azhlskhgfmxh67jq1awsdv2s52psgscpfm9";}; +montserrat-54512={run="1blgdkfjjjhzk41myfp7bb7x5wf3arwapas4mm1770d46nab1wwr";doc="0blk6jxz1xrascrdalssqd9pdrvpai3k9bqbvgkyngqhp4rzndv9";}; +moodle-65672={run="1yr7laz12x1z76aik10dsl6rpqgwbfvy65k5yhbik5iq9z7wrv1q";doc="166489dmj7ysl0z7f6whnkk8ndv5bmb9hh7pjmp6lprvr9vvqxm6";source="00n02k6hskbj8rb6krcv7b681lx24sfyxy8i28rf4c78x4ds0420";}; +moreenum-24479={run="0cjq1a222c813l93yzf9757dcai55vh24r17cv6awv0d1xf6jggf";doc="1g71dcnbcjb2x8ilhyfbkbb55x8740pz6n9gzdd8h6kyxm879zvl";}; +morefloats-37927={run="0zdlkd53zl0y69d3manicnd8ch8qls6jxgr4mncqg5r57lqp10kd";doc="09xmhl2zaxzyvys63n6r71g6qp281f6y69gy4zbkjwb1n68js1i1";source="109wx7axxf1pgpxq34pz9i1cg357il0rbz8h0xqacn2yykh9q565";}; +morehype-38815={run="1yssb0c3l0sqyv775mjnbba3wv1h6497x125li68q8iwjc529wdr";doc="14s0bvxj2fjrkcrdp576c0ka1appg9g4ri4mc2isfb73yc6bmgh0";source="1sljhzy05akipng9lfajapvdm8jf2jf50v1awl38ld0wfkdqvcdq";}; +moresize-17513={run="07vq0wf250ixhrg70vdvaz7zh33zaq5sm32ka8qh1ab590c8w7h8";doc="1qa9y7q1wi7f9klziwgj6dw9c7bh453srljsx9m106nbyd1cvnpr";source="1gzj5bh16afgl8dg5z44h7d4m79i5naj4wl09m17x6snvfz7ifah";}; +moreverb-22126={run="14srw73gbfr0c3miizzs1rml2ms504hkv970p4dhp1wpk8ywc5f3";doc="0bp2lmzbd3zxqhijfqc7im10476xc50yc8amh0vf017ll7prcmjh";source="1snpyn7bc4qbmamxybv1j1h407fp597m26v2jq6yzijszfanh3rq";}; +morewrites-69679={run="18r8ja3xw77kn4jhhyyrcrfqhqwa7bzbsvmkllvlfpmrfziaxq3j";doc="08syrckx97a9y4ybmk85pn98ign1smqifj1p348s8rlam52r9sin";source="1vdnzzvxg13m1kpz08l3npsp68b0rjjy8w4y1d7laj1qxq69ph88";}; +morisawa-46946={run="19b8nzkwdnqk61p1fc7yygjlrdimawmbam18akphcm70qx2h01dj";doc="1y218bablhn06njs5zqmsl6jvvsgyihm4il1x9722pqvvyxxf9q0";source="1flrf2c2jxpq33g26i0m2h63yd5jfy9bdh80idpx1m6bi6hhq7ac";}; +movement-arrows-67270={run="01kbaxy2wyzxla01gbxlwj5i28ahak3xgm7f8myv5d6p0s6by0cz";doc="00v14fnh2crcmnnkdj7dxjidlxl16iq3nfygx8igas1nbyni7xfj";}; +movie15-26473={run="1x48h56mw1pzllzz5b8fx5ikhp08gx9jybdn7qk3jvfy13a4r5yr";doc="0bhyfgsjwmvvl7lnam0k254w2rzn01wf5gzn38ymmlcbw4ajkkxl";}; +mp3d-29349={run="18wgwwvh2vj1adbvbl1q6lh0wy0cynfvrx6cgq0m5nqps7b3idra";doc="032ywwjrv21ypnlidvn95dcnq179pdiail86s4nxxllkjrryc2db";}; +mparhack-59066={run="068wp9vk6ablq8mhj165k2r6lg1llk1i8gyj71ha2kcsq62v4a0x";doc="1cs2ypwz4wkb3rs71wichmd8zc89vj4r58srqzmriwkjplhaw3p3";source="17c1pq9mqn0gaffawg66wwd2n9cd31gghlvmrpn9m9z6xcdm0ipa";}; +mparrows-39729={run="1hmbpfw1wn13zp8dksnlc86vb19zs0dbwx9hy0sbiyfmb7hidznc";doc="0ly0sw1c6i3k5nh26a260qw27x6rmv5p2zs11yh5076ziwdxnnlj";}; +mpattern-15878={run="045sji1qqwalvmiinqkfm3x4rk2jc7m9nya48brcc0rc5icq7xqn";doc="05b9pr86yy3hl14jymk4g4mf6f5v85b4nv2bc68m02dflvm4wnsj";}; +mpchess-67704={run="16wykynx5m3xdjnr9mfdqhq4yn4rw8cf7314cd05hf87i4r5vzwh";doc="08c4kwznib00895wwsv8npfjxvwhxv7hk58vh189b49jjbcddds6";}; +mpcolornames-23252={run="0bg59x762rfsl3whzqdpajakjnnx5jbh55m73dw23id1g7cs5rsx";doc="1n78abrsj5xj1gd2psgph7x4dm8nscvwmlp6ijz5p6xgphgqs5bf";source="0q74zsx3ni8bzl0k1iwrr19k7f9vkwqfm0bp24m91wlzvh4vlk7r";}; +mpfonts-54512={run="1z5ws1kr5s07xwcs39w049yvhfwadybjxb32kf9qd8818pgd4zkc";doc="1hjy2jqm8mlrwiipl4f1rp10nya3zcy2vsyibhs7f280h4zhdwxz";}; +mpgraphics-29776={run="0ymwcn16n44y47ngdsyb0vvfp9vjnwixhxk67z6ni5d19f23jqli";doc="0q04yj9j9f9j9rndqn9k95jwjm41g1rf5raqlrr1cn14bax0lr4p";source="1hacfhb2dbflvmg0c1lif1hmhxkj3g6j1mdlb3wm43zczgaavnmm";}; +mpman-ru-15878={doc="1x3drpi21zcmkhkscvl4l7805wskqa4zskydb33i0asss5p62396";}; +mpostinl-49559={run="01p16dzg5izjgd64l4qgrhx0dm99hp5lrn9v2rlghs8m249fwmv8";doc="1a1rhz5q1i69bi1blvwzz404h7mgjkjcp9c07dd8w6xri304gi1s";source="18rfna80lz3zrf7wynr8zdbiv36k2n6a8wd430r81ybr9233dhxp";}; +mptopdf-69363={run="1l2182idlbzci9kjpii0zg3c7fpmzf02dz5kg2zcv529mjwwv91f";doc="0q9jlvall8mf9j2zky41bhpz09yi061rfpkpd0arj346ah5w9nni";}; +mptrees-70117={run="1lrhpf67d0y42mh127ifv9z8xkfjhxn4mfzm5j4gbzz068864rkf";doc="1rjykadxwyqa78kpivdzncr9p156d01w79ygp095wwi7w0a3ll2c";}; +ms-57473={run="0km07va23z5vzx87ndrv9mj0fq4yw0kv7qygd59smhm4q71yspkl";doc="122xwapvjzv9qyh3p1884bzdpalvqzzkmzd18gqr3q3r4cmk2q20";source="1myxaybppzkdl14h4g12xcp57zqjzkzijryv9nd6hy6ggl9y8i99";}; +msc-67718={run="08rw5drivv1frf7c3r0pfy3slp1sz3hzw4gl55vcjyh2b58v9qz1";doc="1qwrg7gwmigwpf9mhmrv25r3785z3nf7i5fh2q4y2pyn2x8l3bp5";}; +msg-49578={run="1g418z3slb3cjf0wzgwgv0zkq0jnj647zqh6iqvlv42r7bil9001";doc="0miycfpf7s74jz831kqbh6qlkkzq31l1x0fkf9d04b8zp26mzilp";source="18djwd3g50ys4ckgzc3dp0y344qy86ni327jmyz3lpnqai8w1c8w";}; +mslapa-54080={run="0ayfh1yv1a8wsq9qldgcmvq9d12sxwaa7df5p3bhsp0klbqf7pzz";doc="1hiag2x2br0c0qpmm347cyxmi58mwg2x0lyqfakm87f68lbbxdq5";}; +msu-thesis-68480={run="1g6xxc39rvqbypd1njgcx0zxzrncsvrfnk3jqlbcaqxkym9qdvhi";doc="0b2dbp162hg610jcag8cg88ykckl4xj9gsmpzsrxxh8hmqv36g7p";}; +mtgreek-17967={run="17k0lvghiw4milj4cnf6wjhsj7c1banw550dvlw9spv60lccvqqz";doc="1qkl09lkdl9z6lm5hkn5c2xry7xd0f0ijx6xnyq3l6q99cnbafzq";source="13h8knsfbl91g20gxjw3c0m6j33wh4zkmm32ybfvzlm8q7nf2lhh";}; +mucproc-43445={run="06x3hqdp6d6nm3n296wnj4j4w93cwgjpz0nlw5qj0z44zlghs483";doc="0y33jak5lzhjp4v5d4pzfj7jlrr87dl6wdnkqcc0p9fr4fd2h1z1";source="0xzv1m01rj74gg188snznshir510lj5myckfjx7am6sxwlfni63i";}; +mugsthesis-64259={run="19bsplm3qclalplvsybvrgyk9wikr06cgr9zv1av6dp8djmz60mg";doc="0md9p75r8m677pgfiqm30y7nkixa77a244l58fcmj87i3j8jhx3r";source="0zx4npm8qzw4vxxi2fr7ylazga1mmsaq5r0kj9v614iybjg31733";}; +muling-66741={run="05bhyl75w3qmji5s8n6mv85yjhq5nrgncnqshdv9fbzbgcnk7a97";doc="1fpsblzyxy0kf5vs4lnxdq11nkj7d9vw6a3vzyas6dqrlb370vzx";source="1m1yawp0wm3zafjwlpv6m010ih0gb24q8v2h94d5l2w2ymkyx2sb";}; +multenum-21775={run="1jn6xqrc31zzaj9yk244g3sbi8fj2klswbg24fkclgj0cjr1xi5j";doc="1pnjjbfwgy6ksdl76n9iiqla2wl0qa4370n49h4xy3rmrnbjmdqs";}; +multiaudience-60688={run="1pc03jhvlq35zzjsx6sq6bgzsp2mh861wqbazrgp7ilni1bqhqsx";doc="1ja9zphh154n7wwhqgl4xj4as17ag8mnr65k0wf2npjrir7rfqgf";source="04hpd3zsf24vwas726jq231p462dlb9fq01gx4z8wg3zcczn0agd";}; +multibbl-15878={run="1aj6j8rp94mh210pdwd9d4a5s5z9v5f36wpylwjv4v2ghmyrgyap";doc="0r4hnp4sgpx9x0hmrl3qlw55xlchav3r8sym2vnv4sqjnx4dc740";source="1c7cvjabssssy8wq6x6lr909zq4f0bkhdzx1x37n3rxm2ngdqpbs";}; +multibib-15878={run="0ma2fwy3p9b6ijf727iw2xqsadk1jvh1g27snqvyrzhz7702b6xd";doc="1mwl9yziadzflq29nwv7bnbdb07d8bsxl16agj7ydmiw59ykv1xg";source="1g4d3hf8s1df57yhpw04j6bgc8n7hc16dc6qz8jcyj264vfv6fgp";}; +multibibliography-30939={run="1pmvlk1rvr98ig2zj2mgq91a61l0hib9aaly2irfzl28m092r3fg";doc="067wp2cmmrcgwkaxy2ngmhkfbiykr1lr0zii3i6xyyd6z2aidrfg";source="1p25yixvajkyksrbl8zax1jrb292prpjm97b6vh74v478bk21kgv";}; +multicap-15878={run="0ky6hrdsc7wl65zk9krv5bf5z5lbiv1xfn4g9q8b3pp6ri874hzc";doc="15zkw0sh0lf5vdi219h32nw0icq88cj0vnz9g9j7zb7xqq31f5g9";source="0d3gyjr7kwx25gzsl4j5z887c952zxrsh3qk2j0cbs6yahzscxim";}; +multicolrule-56366={run="01k425dsahhikw9n03dfarnlqc1irz33rm9am6w3gx8pd2d2q6zx";doc="0h5is5lmqqybyp9c8kr0d12x27lgm761dcjhi63i7pv37hk0kylj";source="0blj75rh7vqy8s8c87dqpbz7d279hngzl99272cyskmj8m4y6jpa";}; +multidef-40637={run="13rv808x0bz97cm45r2rjxy0yhmjycswcf89pl7z182acrbs30zq";doc="1jcm11pjx3d8105k12r120nqjjyk0ncmbry8pvkcpwf8kpxcqgp7";source="14y2vk3y8f35wxka65fmj1i235hbb4sviq8g0j300d24nlp32xsz";}; +multido-18302={run="0rb320bxzg83nq66dx4d2jy3cmz83zdmv7xfw5n1chcswpi6l39p";doc="1s8jhzznsqq8kjw19l6gdr12x1p63v3fyzfdrgmd9z66a45d6hsa";source="1ypcg93f9n9cv3y6rj92l46b61zaj8wm9cfps1c86w675xs76zaf";}; +multienv-64967={run="0j0s86c6xqpww1x46l2vn66l0wflqjsl5q4jqa4089xhzaxzhdy0";doc="02j3gripplimgh9qj3mjy9nlifdi6frj6cawxnjsm35r19m9ia5q";source="1s28zxxvbi5yg6iigdixc5kmn5w7h4hss3xrv04hr2838xpma3wc";}; +multiexpand-45943={run="04v8qz91w4fayy3llr20dqwvdx835wl9fmxpcg45sd3yrik2s4nf";doc="0pw7kqc1r0mvnb03fp5l3gpy5m5zvrynaqkg4xsdrhw4gqxlpfy9";source="1n1bngipr1sjjqnzsdgyyy08hnk53f81j0fqffjlr5siy4by1p6b";}; +multifootnote-63456={run="0a3xwpcyg1kkdbvfinpq15p2v2mnynvk08p8b393px051ags017h";doc="08j63v16pdpiwbcy2hv63frhpc6i3lw5lmnizqn3bpj43qkyig7x";}; +multilang-49065={run="0zkkfvkybq5hxbdwkwy5n7gal1ir7ixg8342wynk3ga9z6lb9shw";doc="026d5yxli87f2svfyqmfzbhydwd4c929n2v11wk5prg4zc3vp08k";source="1v4ql5jxlmpc6458qcqvbsrb9pf3dss60z3i3ylmyp6mx0kjmchr";}; +multiobjective-15878={run="072zpfc1achwj0b1dv8yskdcbg92a2imnmn9z492l7xxyz889n5x";doc="161nkl1q2kc91is8y6h2j71hnbly6hv1fjfmlhb50xypjgrv1ibs";source="1nps6rl8di10mr5r1hd71svlj0dxd51bk0plszk094a3r3l6z4z4";}; +multiple-choice-63722={run="17w8sc4gki7zlwkg1vqrmqrd9id6hdjf3kcvyavbmnrisri95hl5";doc="1cjvs2zwcgj7w34p3w9cvv4dln0q0468cz0j4vdchqjdmhqkwxhp";}; +multirow-58396={run="0bsn4xzliq9gllmac4wqqsnws9slywc0d94abh81awpzv6vy8jwj";doc="070q5s39pfdq5wiq7crhdqhcyjalpd8kydig4djgji975b0xn0bk";source="08q074bixnkvn7hsi1n8vx0r6pqwwkdjsjnxz0n3lam30x4j1jib";}; +munich-15878={run="1dns8n2xybkf1m3j82adid2nr8ngvg5nnlxr5ky8ha706bmz1lra";doc="0dzwmrv636nca34b39mpxyhh99sr3s5k2rkj7jwms2knlfn81djm";}; +musical-54758={run="0rn4b1m1c58phyj9zzvyxdxbilma1bnncscwmxc8sdgb9iiwmlzm";doc="022s1z7d5ins4gpklg9hadlp1gqxpr6862i1g4wp036db0457l78";}; +musicography-68220={run="04vwhhd6mlk79bk5nblrdb6vlv2n2r1s9dfx752p3vj584w2mdmr";doc="1144kbjzybzfcxqbwlcfnk4wvqm7kw01slf9pzpb5jqagwrq12sv";}; +musikui-47472={run="0z2ya761bf0n7l45dqkc626s9d66qwr810fnwf34lr1876y3sfyi";doc="09sdb98m3j5wkl4p7hdpdrnrr0l25ni46nlhkhg1g54hdggcpjb9";}; +musixguit-21649={run="02cz225x5s3spj0wf9c51ka0i1ysmcrvlpa2b8vxd59f4pwz36am";doc="1g8hay5rdkpa4pjj0lj5gfs7xmqwzmzxnc8k023ahlz38gdczgnz";}; +musixtex-69742={run="06anc6izks564xxia4l67qazr25whyxq897762f7hk0a1pvfw9ha";doc="1xmnf612wfgxbf7rgm020jcvavqpnahad1sx4bnjcm1kapbxh19r";source="0ari7nwxlyj0lnqhzcpq4vh9xn0kdzqn9c1a5ih5hp1q2zwx2m7l";}; +musixtex-fonts-65517={run="1bq3nw6zig0grmmgnz7n84cvxasq61h2mmvm1j6mnyv69yhssm2s";doc="1pqr7h0r7cr2clzn5x74r2z78rlbczxmdwc7bkpb5a0k002cc9ga";}; +musixtnt-69742={run="0g2y52s0151br5vr7hjv5dfcyr96cjxp4n9ya3s1jj81q6q01jjq";doc="1y933975hv5vzwrgjizq315bkgnhlky21blv9kbnzf6kadic8ys7";}; +musuos-24857={run="0hfrgx3lk7mf9kzf6n8hswzh116pmllx0k3djbfinvvvhnqy972s";doc="0zxdnzd8x42z5fpvkarhsvdw3x4bz6qppn0iyjff1fjzwl8q8dzh";source="0igksc3i5ydqps0g172i2hkb854bnkf7xh4jqvwlimrlnhs7nnkk";}; +muthesis-23861={run="0bbv49nnngkpnzq7kq15spn4x67yigpyfk8ymcgv647z0bvbladf";doc="1nx1qbgp67n73k54ppyi4li4flnsyi8jmy1lil0gaza38m5y8aak";}; +mversion-29370={run="12mvnkij2q08j50ka3nngmcz0p07lmvqg3jl8fxrfdzyy0h7zhdd";doc="1z9d4bcylv4sk79hfzgy36bza0r9lkzw93mis2m6ypgdbsaa3n2a";source="01dbma0p4lhygs64aym66j3vp3c0hpbci4x42mpr0yvjnglymbj6";}; +mwcls-44352={run="13a1vldimwdjq9lna63gy6gcc9gnwirb2zrm8m4g170q9r2b01rw";doc="10nc7ai9brm36hqhf1czs1vvhp9nqvbk4h8r9l02jsdjbf4rrml3";source="1fdg5j1jrsdaavg20sai9ffrq4qyffkkpkij5czab5zkbmiz8kv9";}; +mwe-64967={run="1rk5530j3cnmf46i3gb6wc198ay99pwlbb80ynj33dypfiwsvhcb";doc="0bnw57l8bb6x4k8i4icc8g215bxrccmn39vyhj888ijygdw2hgmv";source="1fl2xlmqdas5rijzrail9yqlqz1s75z9fzkip5zjb8s0gfnbg3qa";}; +mweights-53520={run="1i4jp9yy9yy1miyzcq25nwm4zqd3936v4mi2acv4g1rgzvai86vs";doc="11114i98f0qscg9796df1vwkf2m6ycbaimk4qfwv47mrxhvwq5qg";}; +mxedruli-30021={run="0xyp3zxzd55h0m201a189rj9h7js6ky3vzikb4yaa7z8hwsad7hz";doc="0ydh0292i72lb9vcglwq0pl734qgrh9sqdy7qvdds6a84jwc5w7a";}; +mycv-26807={run="1nnm6ns6qx6ny4xb7z61pajysfb0nfl7gs5dw292bwi7daxs98xx";doc="1d3rra14k69l5pfmcw4fwbkn257935zdiyd2p9gzx0bc28ivsajm";source="02ailkp9jr5r70aphfzp6kjm83ni6gigyqn2nr0zlsa098frpxg9";}; +mylatex-56751={run="1zihhgy4xaj04qr6rfv73050rvb8a77zglaqgjby5b4a1j5vyw7x";doc="1bdigldcdk3rz4p58w7g4qssbx13jbhqxbavf3x38r71r1pys5x9";}; +mylatexformat-21392={run="0nns88lk6wdq053aljg9k17d3g9fvi75n82swglq3jxmxx2k7r89";doc="09dnsxwdhdnpwf0y7cfj6xh8gws32xn12fc1rh1xiy3ivlynj8c4";source="14rd6zn88zaaznnqh577zgbbmmdmbkzn03201i459v3jzcvijfp7";}; +mynsfc-60280={run="1zc7lgr1i0g5rszh9gzcv7fs98mk06ms5flb3iv2zww0w9r7iy0i";doc="01ig210x2wrdkp5k7mzshhm26958zmvvlclyk81i5wb0i11z9p77";source="0qsacpapa5vhpcwhm44dj13zpx9a3kv2j3hp3848zhq6rpc4981f";}; +na-box-45130={run="08xixk2hl5w876x6hmp6h044spi0qw1qbgrqklwrmkxkgpa27i3s";doc="0i1p5f2nchl9hyrkc6s3hsqcvmyxsi4dbwyr0mph8slhw2rzl711";}; +na-position-55559={run="1amvifgadhq73avh1dq9mj2v4s5r3hlr6a3z4wcbhw32jd31ncbx";doc="0pcn0r0p0z7lxyfsvcnl9skm5aa5xi6362vydpx9kv8m11gl7pjb";}; +nag-24741={run="1l31y7mr00s6md7a68cz51yv0qfd26xaj04ax1ph6dqc97r3fv1w";doc="0gc56zgva7kziny3ridswnp8rscqi1mg51d8x580pidb11mp7dw2";source="1fh9nfjbkvw907ra1crqfhm7hl4k703g80w3c8qvd18r86wmn2i4";}; +naive-ebnf-67892={run="0hw3ra8cmmr79ii1l57z68kqxqjfwq1szl4fg1wykrh9cnca1bn3";doc="1i3h4328sczm3hv5claypc0qfymdmbygr4w6zankb3x0nzrgk9sm";source="0z2df8frslvvaqjsl6js5pwwnhjqkj52dnrvgbygvdhnkpkp5yix";}; +nameauth-69758={run="18p1ca2g164942p15znda23kgxsbfqpvwh8yb8g13m2sv2jr3nwh";doc="141c0575mm1hdik8xw9gzwswv4agj97rwvinpck9a9x2g6kxbwr8";source="1xq9hh74485ck93ifsyg3ci62j5cw89if3wqcd4bcvx2qqxw9lbd";}; +namedef-55881={run="06nr8bwymbc3ps7whpxnsnbnl1fayz36hlgcy5isg0gcx8bdspfh";doc="080m0d24cish4an6p4q7rcrqpr2r1yvwvzk431nszhm39h7d8z80";source="03kg4zv07ch01n0nc7qwk99n32ifwf89z2976wg5k12yq51prplh";}; +namedtensor-65346={run="0jvcqdqnvnjm9z1jcdsa86cvv4f4hq94yi6r688j2sny2700q7a4";doc="0cjbz9g2b8cg2wm97vdgwpqby0jbc5l2d7j2cwx0j571hchlijim";}; +namespc-15878={run="10sbvwc0r3lm90qdxds13iyfcddq1vjx2p8vvs4g3sav4fk8p02k";doc="1z34xb5s5fgl4rag0fmc5i5j3jb810f543096mxpq46j98rcp5mz";source="0xjcnrrrrw4032sd6wscxvar9y3kd4547rsd79dpkbb0ksmqbqrx";}; +nanicolle-56224={run="1sk2frvlsxzrl5cv1c1azqpxbpfr4b06ssli54j0p5aikf0rls1f";doc="14zsfxcyw2ckdsi3fg5qwxfy6d0yja310ycxsi3xrdyxyia9nrd5";}; +nanumtype1-29558={run="1izx9cjsd46ydhrl0ixsjz23nbk7mfv3swfk5ada0d4adcm7b73h";doc="1sxap924dzf17vslp3n71r4mj4f98m9cmchq603c7ara1cyjk2mp";}; +nar-38100={run="1nwk71qirapkg3h6jwlv53fm6zwb2vq0fvmc4xcanf19sm3331mk";}; +natbib-20668={run="1wxpcyr1b6k1rzizbz2g452klrmr6xh98csqr6pawlnx2zy3sx5x";doc="1hai95c7ah61rqrsvzvn0ppvr7pn10830dp7wn7fc0j678z9r3js";source="1qaxwivq95pf014w39igh070cnbs7n0k5am4waxvdwkzql1fafpy";}; +natded-32693={run="1vxqyyfrmrkwyzil0a3xvlrmfzyfxdkfl10rlfzgwdwd63bb99kk";doc="1anh6k76h573yci4lcw5wyf552zfqdrf75vpg19vrr3nijhj9k8v";}; +nath-15878={run="13j02zq77fv4c5f45qn3hgb7v20xi0d0dpj0m2pfdc7fj74k8ib3";doc="1ppyrz9y2hkv6pq18w4chm90f9x9d3qscw679281si2phmnkl1mn";}; +nature-21819={run="0b1ra8babjwpn7v22rjc22pjrjczh1wflhq9ihbj5ag3d10sil6s";doc="053m69fwgcfpa5gcp3dnf7k37175jcsclfkh87lb0zwcymjghlw5";}; +navigator-41413={run="0ank98y3a7b5dpc6gxqpgshi5qvkbys4nyx41gf6hkinmi094097";doc="15370abnfjvql6gkcamgq8q3p4kycgzlgdla57w2swzwn1bd6x2h";}; +navydocs-41643={run="0isw46fzvk85i3mimwsc3x7wg8g7ifbi23i0d4v676nd92j1i72n";doc="1aiyz3z489bdsx4rh79gxbdb986hff75qik97fq0xrpk3w6x6cjq";source="0x1n44brcy38fnfp03j9xl1awfawwa8d0c5cg739yr404qbq8dp4";}; +ncclatex-15878={run="00w3g79rn2xa33al7cma09b8l9na6xd5b7w40j8z9day31i2p89p";doc="14fvmjnnw8n22c3j2mc44bqrdlsxn28dasfk9zmajvmxgic4w12m";}; +ncctools-51810={run="14wam15z6jdl97dxibf789ji0mk59mn96fn5x0vns63d8y65fh6y";doc="1j5j6zsawp9i62kwb8xxzxsvh0qczx6qd1ppq38nlha3cj8k2rfw";source="15anl5wwds08h2msz7m0a11xlcqdqgqpihvcrmy41kdzgnzgc56b";}; +nchairx-60196={run="0nv33zq3gyda9cxf4q7ixw0q73aabjm47mjxqipl9cyp1wv3r0kz";doc="1pjnazl84w4bz7lydhy6lklh3kjxri12gswwffw18a92jff88acl";source="1gva51szjww2qr33mizyxsgd262xcw4116nn1dm9z0dg278hwy8l";}; +ncntrsbk-61719={run="0i6a48zbn9lg4pwbw8ya2wjjgppwac816fnbpmahm67kknx4d7ij";}; +nddiss-45107={run="0d1maznv4yqpjzxm90vdl68h6h7zr7m0k24dirq2nc1cky6l0j1z";doc="1apqd332kj67rpa09md0gb025kx4d7arvqj7f4l8krgsizxfxcck";source="0x2abanmpp7sv4qbwl6in3yp9k99fx453f2fn8xw9b0z053ivvp3";}; +ndsu-thesis-46639={run="1bjrvsdmv68zlm2xd9v4jpkg39zvjhcrd7435r0jh0sffai4pdlc";doc="01jfadx1dcmm3q8pdwpxmxfmmp94xm9y0r77220ffrlf1iczadkg";}; +ndsu-thesis-2022-63881={run="0zirxqals86gkjm4429m672a7k9n9nl2hx264javqhmhngcybhcx";doc="0jf3gdjfm1ycbnkp775b7hzr4rqd0alciqjaignrfqhwgdr96gh1";}; +needspace-29601={run="0abcqdcykpq4wa5a95c8w1bn6cz90zlsy146186v0s54njc5g3mb";doc="1r9mn0flqdnaca1w2g4lsy0pk5a9l2sjnkpzzg72qgll9dsqqkmq";source="02j2f9wl2ljyi82dxk7qk71dmjvgl17vp1d3hgvlc54gl5qcwqi0";}; +nestquot-27323={run="0l2glc6aykd492rspxphgscx0ykc8cakvqkm8z99jq7xxi80l1x8";}; +neuralnetwork-31500={run="0rhvhk46z3wgz5w7xrbmlmgk2px8mvajbrrj4ygpqa58g37wl0v7";doc="1apv7bhss9ilqcm5fxwg83gxm9i8563671jcsmhkl13gcii1lpv8";}; +nevelok-39029={run="0c4zij8ihx3mz615jr4z150d61mj4ln88zrdbsjx9hlnandqkij1";doc="1x7jwmp32f1wph9k03q6ly9nbmdpsrkhyvn5j83n1fj6nj6hmzqf";source="15di74y4h7qgjh7gmmaingbg71jrlaiz1qxf960589k2xshslbi4";}; +newcastle-bst-62856={run="1qzr66mjmdkvrgy5lcv0yv82vx4vygxwa7m8lj6crsffwyaxaxkw";doc="0crwyc9r5zqz412j45c7qh43wkdj2z7rfrmmc510746b9nm31l13";}; +newcommand-18704={doc="1vlxm26393psl4kjfh533q03sb4klnfq84nld9ggs8l5x08dks58";}; +newcomputermodern-69379={run="1p35sffk1hnffhqfpb13n0qam0f002yp2g987vqm9p4970fzgs0y";doc="1n2hamvbjgjnqw03vrml6k5rw2njf31fz219h20j82k29k42mmsb";}; +newenviron-29331={run="0vij59qibxvl81r367yxfl4mgp8fjzd99x3aq008hwh3g1d8ciaq";doc="1nvra7lh4zvxy70hf4ndj4nl3ij3ar8g2fxrc0951qvixz9jx7mm";}; +newfile-15878={run="0gah9qbkpib651rjfrakzldi4wd7gv74y8j455n1yi6wnr0yq570";doc="0vqlij71kfjzbl08sh38rzs9k714xigjc1cdvvpj2m6bhimazp76";source="0sw9cqids994lscbjif8h7npp4cmzrhrcvccspag2aa78gsvz04i";}; +newfloat-68434={run="1jhaccf7ppi5m5jycz77s5nldbmscydzbd2db8bmb0qx3z858m48";doc="11712zqy292xs7i4xvrrv948i6l1bwjxsgax7hph9hjfqs086rmq";source="018msda5vgamyn1lmq63rwv58h9z49q4rd09l7slij14djxwgdb6";}; +newlfm-15878={run="12mryj5w7dpn0mdv91grkrd24n2pn68p54bl70bg3pddvz5ab6gy";doc="0afpxw78vijnhx2rwv94ar6x4ivcrgz7873vdc5n4dafgg18z78s";source="0z081mn0zf92ana2v99sdyyqjz4lqnm2ymndp76xwih9p1z8233s";}; +newpax-68762={run="0dn36fqqwwa6jzcpznrjd7fk2mkzd37mpvyicif0dc7g125whndc";doc="0jcx3lvc1ay9b2dmj9f1kd7kxmyql95dn4xw4syp45ivqsag3p0a";source="0i7ilsx73lcifvzcffjp3n1swwv1af6l3qwn46mykxyv8c1ygjsr";}; +newpx-69777={run="1n7374jxqmrhnjzbmqlx18l6yazn3n9b9phndfg40va5ig9q6fwl";doc="1ihz42aasyx306kwkfmidi0yhr8cxmfaz3sl42b1g36fyabp5h99";source="0larcp5lk303p8bryaihfdvzacbkzmx4kldira7k42sg31p5hlbj";}; +newsletr-15878={run="0hl73l6cv94g9k4qnldxad6nl56n9c1r9rkwh2c38sr31d6fn8z5";doc="15bd97zlny5p212naaig42li7ki3f9bfr9b5pqk0vhbf17pik9za";}; +newspaper-15878={run="1afj267dlvgcw8028b4c0v9rdj77w47zjgpk0grbapy7wjgpyjb2";doc="12hlji06sd7bvw7r664cg8ijxabc2q1rb7z516ph18ayjl5vca82";source="1h8abnmiai3c66cjndm6xawz00z1pfmgwlp6w43amjrk1rm4r5vm";}; +newtx-70496={run="1kqzr0z7vd930x3jyna531jp8qkbsvfjsgh8429ams8qqqjidah7";doc="0hdn9l5dl5jlqgylk7wxpdk200agvdmkl8yyj16ngvi6ljsgh6x1";}; +newtxsf-69597={run="0nwsbpmw7c96797bxvlmfrqibgnjsy9m8b8mzrbvasj3nlhfdxwf";doc="0zxkhsf5r9kffk2vz1n1nklk48i6x445dzs4swdz9hv6xkhrbmnq";}; +newtxtt-70403={run="1adxrl214c7gbqnpqx58j3myddf9qx2dm6kfzh83k2zs3h2wbv7z";doc="01s3qcqygqn941frsfyrkh2bs9ghz9db08khbg5gl9imkrjcmh6j";}; +newunicodechar-47382={run="1zr5w047xqg9bi6drl2rw414m9bzpa5r7n5270zr8k8jj74xcv7x";doc="11vk77c83xy40i9vclw4v1h5wnr03mb77fa8s2lhi0p4sq0c3vgr";source="060kbd07al8cwns5877ap7irpf3r3bkw0w62cwvl67y03gcmgr70";}; +newvbtm-23996={run="0d9q6mvczacdxykp381181mnra49qa0y0mngr0dnqp24hfw9j9l6";doc="0k6j4xpvjwwvz8cipgrqvrs2dj66n7yzlr9mcfsgd5w6rm1p1h4i";source="1p3g9qyq4x0ffv68501zlpf1w0ffm816pa0wqjpqf8pz2jmgcg5y";}; +newverbs-64833={run="06m58n02lx0cw6f9689863yqvlmzpaiarzhpslnywhvgfnks7aks";doc="1wny3zhid4981rlxm684p4pn315jdjmkwc002dbj9aq7lhax0dg7";source="15qivriqxgk1cfff6li172lxghcpgy9i1vjskki96pn68q2p0nw9";}; +nextpage-15878={run="1p9dvw7fqspkg6hk6rdmsb5k5m9mkj0kz5a47wg5dgfqgrqpixf8";}; +nfssext-cfr-43640={run="1qp85vnmzsn967iqvzsf7yzsq1a4zxvyim7r0xb8pncak805fs61";doc="1jac2k7nldxq11rcf53glb5y3haqdsxzzxmgmvyzhbrzmnx0bsms";}; +nicefilelist-65842={run="1pjpffkhwfrayh6a5l57j0szaz63cn83mw53v17ibxk8dj4ls0d4";doc="0dqpx0kkgj4vcfvlyl96mllpn3kqz8qh2476kpfw0imrp8klsq7b";source="0q740bd8igcdy11nmpn61sb1yy1kfypvif2s62ym80p89qf8v74c";}; +niceframe-36086={run="047y9dh0p51lyrrq5fkvp4dpiszvf2nmx53hccl8hzgr2bs3kbwi";doc="14fapa38pffkj1hs58b7r1zkjn3dql9d98jzh13cybyfynd5crjp";source="095frb90nryk4m2iia4sq3kfrcfg2k3nq079770xlp720zqy07rc";}; +niceframe-type1-68091={run="0p219ccyqcpf51q71185manybxsxc89d1crxxwqs96n9ppn7xb0z";doc="0a3xh5akhxcrk440wa6zwm7cf4yd1smis4pf4gd3cjv3rlkli79s";}; +nicematrix-69991={run="0639lzcv4xjhrc0y8a31v5q5apb1vqhmvasmrsq6cb41iwpg0zfk";doc="0ang6dibjjf0j6jnhnk9hqczhv8dyjva5fds3rkansndxbvh9viz";source="09sjwlnavchysygfm2c9ds349q42ybhydd7hcf9hbsgm2bn7jjmn";}; +nicetext-38914={run="0aqfg8phvhlgvyy71flqsaqwmmc6lsl9vsxpxd61v69hp2qhvggh";doc="0c078pfiw1nz11krcgwbdlp2brdy2xmq6rda9yahfjjg54xgdbg5";source="112ji0zwy54nqswil8lvvcrq0ai7jsmdagvf2786zg9n14h5kr75";}; +nidanfloat-48295={run="15l4rdj7bk1279xjjkgh9a7scfmm6w88civ48shh7gwx8gsvcscb";doc="06ccf5yhrqvshj3d8ic3pbnvmdpjxq54i57y3141wgqcj5h062dp";source="04q480lddynb2gqz8azmyik8170vl056fhfjsnq8ydqj0rchnnqi";}; +nih-15878={run="1rlhnhdz58qqjv563wjpp11ppyqa5smjpzjdzfcra0wd6cxv9384";doc="16klyjxzxj4mipql71admicnzlnasnv9hb5pl52wyk4ic8ggdgwh";}; +nihbiosketch-54191={run="17gggbkag8y4fjvj248wc8kqiklsqmilcyisx9lwcf5irngql646";doc="17lfnfkgjdhj8i5zv08v6lgxrrjg8hzbbq9ihnpcbhj2scn96g7s";}; +nimbus15-58839={run="06bir9vnihawgmc8v4cxjfcgk2fahhh9c603b7d9wzl7mi40prl9";doc="1fr7k4vh7726xh03qz5116winps1dkalnskdywvcvbwk18a2m07q";}; +nimsticks-64118={run="0h87j3i80slsi5nc5299jvslhr1m3hb8hvs9mwz400b76k4x3ig0";doc="0s2v4941bmgxcsmcwz7x3mybzaydj9qshcxwj42fd855sf1rmis6";source="0lkfhdq9iq9lr3aw5dxs21j5vl9w8xjjjxph79imdx6lcs9cbs9n";}; +ninecolors-62006={run="0qvjykxzl9154wbiybwpv4j9da5vyvw2r14hkg9cvyqqd0fn7g3p";doc="14dmp0cm8hbjrd14szkcvkrff3l7shk4k9zlzx6hzkpmjc9qkl0w";}; +njurepo-50492={run="070jmqsm9caidgc0n1cmcj2v0x8dlxxwv54hcqkrisaf4nlkyyk1";doc="04hg7gxg0nplqpmmagqynnddxv12qadamjy3rj1sxhwxgjma9c5f";source="08fan5igmdc43s82s1adq7ymxpvahnp08f90p3p4qlqanj41yh65";}; +njustthesis-62451={run="1ar359ssgan8pk72bbvd4lp2yg63ww6g2ymbjlxbv63qh6czvqrr";doc="0s7dwmmhpb4qr2nnzr7jjh1zfk5fcvk51nxrf7i7ikq8jss0ic7s";source="12lq39rhj0z6msdpshagqylknn31dd2pl6ymk1lfagm2bq8mvx30";}; +njuthesis-69051={run="07lvgl75ynq4fljq8h1pkd3jq4v6zaigqga3mwrhnd880igzk961";doc="02npr4q5ywrvzp8a20mvligfpd0w5wb5w24lx64i9qviid1vrdi3";source="10ggn8dvk6ldsbjqvvixslrzlhg95hfmqjd9ybb890xq3zmc7zca";}; +njuvisual-65261={run="0qgifkahh13dkc07dx32i3hn03rd14pkajg0yw7wx8l0la6nxsy1";doc="15nyzfqsrsvmqg39vidycw3agdy9yhgj7wlfjw649lykbwbqqlif";source="03ywgbapxldv05azn0s5xh9c7a7imq9qwxg90969as3fy5cjbl98";}; +nkarta-16437={run="0mhi640hsr7dy7jbvkqq2yl224i9ialf01jkcma0cq527nvrnm3f";doc="0bqix170zf7lgiv11v4mqyq3iva707zv91z154bi71cvnlknbkns";source="0f6m2wz1cd99s4nxppzdq9jm1hg02xzswgm85dmi18jffgrd2chp";}; +nl-interval-58328={run="1lrj178yhmd4ajwvpdlbsr97sg39k39b8n30wib0ww2lagyw6rgq";doc="0b439r5r8zzhgd5k0n1bzag3naxs2bjd6hlm3sw60viq8fs5wgy0";}; +nlctdoc-68448={run="0rqlbsfwhan0hnxvadw5m77ny65fn0i12mrhwmvr83fm9ybp9q7p";doc="1yh4il6lq6hawxy00v3bfz6piryawsf7aia101knls0nb1ifrjan";}; +nmbib-37984={run="0kmrgd4w63x0f5j5l624j53mhivc7wllzi346c3ny7by6h7mh8in";doc="0fzg9jm7hd3zx5naf487xxfyg2yg0w9wmc60265av5v97qkghirx";source="1m3pnml7wdk0p6vqiyxssqi7rz0vkcvbd2z63wqy28r78w9js34x";}; +nndraw-59674={run="0gffz4kfyz81yg1cv7sgs5zr5a5kaay1pmac5q6v7v89w0bf8089";doc="12yj7gym7kzacwxjx5df3ssf97wrrnsm75z2c1j20srr30sz1cwg";source="1y29n03z9gxwy0gjzm6b5da0cqwg0bzm26cxlrz9551qk8nis9sb";}; +nnext-56575={run="0vf53wnrjday1q3hrplqklfp5kg57ibyjiijqw0jc074gzhyw0z7";doc="1rxxrnm8vb274c9l6lki1bxd6pij92klryigd40wwwwxzh8fc10r";source="1w3p9ig1jivwyy9rlbzfgcy82h3wlj2ig3rdlaq9k9fx8vd6znah";}; +noconflict-30140={run="1flkwyz36xycq4aidj9v6ga29ghbww8ss5dkz4lzsr96nv38q78r";doc="1v3q7xbss5ra1dizg2mz66zq97cfsv5lgnd136xqbbmn5vphl0dj";}; +nodetree-68244={run="1d02cgh8vy6nq90ndx6yy907x8kispwxjcxy1smdjd35308hhxjw";doc="173jz2ihpnwp7bdhq2j6nxkmsabrg9mib185pyz5v55cyh45whlw";source="150iq6m7yvb94qzgj9c290s5wkc0sp06zbmc8kn42wdqz2b5wqh8";}; +noindentafter-59195={run="1gp4zyqwq07f85qp703iwsa0351yp49zyjrzrhfidw456whhl3a7";doc="0is88wpryqdd179fvhjkvq6qy4inz0sp8a7j1i90iziadkf4rchx";source="145bfg8qz8m64x6p2kzkz6skzkdi9jc82q77zr50xms9565bhf4l";}; +noitcrul-15878={run="1whs120vlg4cdjmb1x363g92ira9nc8j2h65qnvwv8qrmh2hrwnp";doc="0y3j12rb8ks8sjs1ikw3sccq7p7zmixc10nhdy9yg9rzwcgmicva";source="1dsjxs73xf79sjq9xynnv78jws1j39l240lvcvpir1k8vnzwfa13";}; +nolbreaks-26786={run="15qa4nf5c9gl3ha4prajqxl2p1ks6fpql03d52prm9vqkwphzgyy";doc="1h9n7ki3iznbzq519cliw03fcn2k40f2rldjkhnp5vlzma81inh3";}; +nomencl-61029={run="14225s3b27dmdgkjqyh4fqcwyyaahva0sk3k6nvffl6jjqdwsgkp";doc="0vqxxjlvgaa31mjfl6jv0azfh7qv0g341i27s6k9zz35a7dwqaq3";source="0fxfan0s0y1i30rg2mwxl21ymfknh4cnw8za13mx34wvaxmc4l9l";}; +nomentbl-16549={run="08jvfyn4vd8qwlnbsqhlxnwnl4qv5b8r32slcbfwshc4kyi2hn9a";doc="0g48qyrrj6npsjcnnzn3mgsmd5fq4v5vzzsgxvvx9x15446987cm";source="10b41ax3ynpdbn9bawkp43whqjkygh8f2p6qdjiwa47w1acca8zh";}; +non-decimal-units-69742={run="133cvqh4vxdsx35dr6vi0sqil75zv3dlrf977dwy5r1fvf14br2k";doc="0qwqzl7p6j9mynlqj2zvwdqrcr75ms4bn3v58jikvywqc0y61aib";}; +nonfloat-17598={run="1ay9s9xrf27sgan2gan86g68i91rwa8spmmj2l13pb3zl5qikw66";doc="0jjil5rbxzcpkyid8y5dahab2ca9r77sw2scgrc4mf2h4nhrjfyz";source="0vyvpxyrqjqmlw2fj4b9avy7sn79m4q8gcbgzdkzzp8d0rng5i8s";}; +nonumonpart-22114={run="0dyf0nl16j7vp955g64rbvvjyqq31x5iv7dbkh8cikwvgn9g85s5";doc="06j6sc8q18mnnnpbj57ykays69n78z0iz1r3vink7qaw4a8fbyba";source="0p3gicf0fzmk0f7lblydf31pi9x0f6x0k5rvdd2ia8hrjdaqv1dz";}; +nopageno-18128={run="098q0visa9g5lh3vp6bp484fglrq8g21v4cb71cnc30f7avkg1v7";doc="0n7p2f039vmd060ncc81yi2hnn7qyk6b7z2hpxh9pp78dwklgx98";}; +norasi-c90-60831={run="1bsx31al77ci58p1zavp5q9dl8msdjqilb19fglnkhgg8bjbqh7d";source="1bsivm5im913x336v6qrv31b926lfr8821pzqshq600k4fgk3rj3";}; +normalcolor-40125={run="1yvbqc6px76phjgy9cwpqwy035nb61nvcxy32v9xa9wfcp36nw7g";doc="0919aan1qxp5lfqm902ijn6sflkzv1dgxi12hjfixd8d1d7rlfgs";source="13lqp3zjnhm1wmf5id1bbr86l5qi13xgij455l38l55is468sv8j";}; +nostarch-67683={run="10gkz055a6j0hnpya1a49ysqqsnf9f85fdnxm1aacjnng5wpshzv";doc="0s06svy9gjvvpjqni59qfzzlwplx12dbgcvpkdi4zj7r9wyh4v3v";source="1vd8r7viglzi00vfxq4wnjdciamhl9yprham3mg0mmrvmp30l52f";}; +notebeamer-68871={run="1glrwrk760xh657ipslz8vp41qwp1qhmb7cwq2p3kgzczprkj8zk";doc="1yb2ml5mc1mr19di0zc168v63n0vl7hb6vq3fggiw9ppl0rzsasz";}; +notes-42428={run="058316ialcra7m56ww7imzqqhk318abwscw5g60hr73x3x7d9dgq";doc="1zq11rygqkbx85cf79ixwcv1w971w4hx8zfsv7z16am4mlxcdz5j";source="1ycxa3m2l13z6a3a4a88wpznvwdb78qyxkh879cvg85apb11rffq";}; +notes2bib-52231={run="02iwnpiq918izkssa8j7fiz2jbfjn87xdjh9spwys98q2cvvxd53";doc="1md7zvcnlb2sf8zw0vlnsnia1l22gr69jgksy5yg30jis3zm2gjp";source="1fb70w9y6gj1a0y4w3zd7yfmk5gygx10y8xjmdj06ky7k0r87qlx";}; +notespages-41906={run="1zn3ygkiyqax88azc7vcrkfw5hfzbbq3jkacnv50c8z5xllk2nwz";doc="0556azchy0yc8757wcy687vn82q0jmyf7n38vyx3admpawyk1pxk";source="052p17fbdpbdpzaai5xn8r0v6lamv7ps78svd27216p71djsfr66";}; +notestex-45396={run="08b59wvl0n718vbzj6azwmj5cn4jk57yzzzzgxkgkjj3kq2926ig";doc="1n7qdz9sf7jdvrrcvixbvk1yjjqdwsr8c4vlw0glwabjyzj9hi3v";}; +notex-bst-42361={run="14r3q4z35k5n0rl2igjs4lj5ic4yd14xksg1qam5klb6raaf1jkh";}; +noto-64351={run="1bq1ysvd9bxcbfql6lwcbx2878n3bjwb3akawm7z025igi7hnml8";doc="1pz1flyv3js1wfw9p57cz9qb10dd64i978z76ngmfg5k1hp0w7l2";}; +noto-emoji-62950={run="1d1mxl32brfyn3a8jpkby0kwv69gimj9wcl8y61jd2qdlfd0mx9z";doc="05rch3ybas6gds53g35gda10gia61v49kgxi3gzcxvn92595zv9a";}; +notoccite-18129={run="0cbvwvgh3rkms6akamnrmzwm6796ly5fa93qsb30bqafgmx56il9";doc="1h14fkdn5kvxagkjx8h6f6a06v7y9z48s87x52cblwykgfm70qxz";}; +notomath-68014={run="04ik99znmf5a97q474p8fj4rhmggzggn9kbdyxhpwxcd1s15w629";doc="0bwcf8s46i3gb79yns1y7crfhjsv32np496rhqq197cjd1c4lml9";}; +novel-69945={run="0q600v03yrs5by11c63idvsmfiaz3jpwkz778b7xydbnqbshvxzl";doc="0z0j6q4ssxfxlgdfs3vva5ahr93bbnryaqrbqn1p137pp6lamsw7";}; +nowidow-24066={run="1w18i36ynsyldb9gs0yhv6plyrjs4762y7bglncv7bhqjmyy7y3g";doc="1l2zq2ain8nhkaa8aagpm22nvg8p1vk2cdgs6pmrydk0hhmjh01h";source="01qjfpps7ahmrwvg142mspj8gsyx21l3nr75g0v7qsqxbfjjy6gk";}; +nox-30991={run="06036p9059x0lzliq9b2pqahnbp8jlkd1gnq300rq0syj37mjk5f";doc="1qfjlzczcnmf3pgqf4qr5v9c6ws6qba9hm28h3xwf2s3099drxjd";}; +nrc-29027={run="01pczvyzfc2vnrfsab180fg0nz13cmry0dvdxmq3lxzp75ji5aqj";doc="0l6lpvddg25k8dynqr26gj7fnaq7k6zbzp5p62684sz9351pvz6c";source="0lzfw45m3mw7yd9sx6lya6cvan696p74wrxgvmqa73prc2lhmbv8";}; +ntgclass-65522={run="0dlm313f7m0cj0fsqv884xi16kq9imrkkiaxg8lszy8idp9vvmhf";doc="1c8kc3q9xqxl28xdyzlnlzwdfixbfra6vi32p6iy353mdhvhx2r5";source="0fhs6v9zkfxfxp2g17h4cxa4k9dm4dfgk2dl76w61ad41wd629d8";}; +nth-54252={run="0716sd99xjdkplm7jdmg4lx8lpfnnx6mxjp1l1sp2bfqcg73p4hm";}; +ntheorem-27609={run="1mbrpw822ibb7wpzbl3fhnxg4djwy32knn9hqcvw1kpahgfbks66";doc="1f1cridxgv2rwv3f305hsd5pm59im1ik8qmpqhq4rpvwph8ny140";source="1pkrhkl9iq0giyvk6lqjxx5x681rjl9zmc0kmcypwgbqww59hp0i";}; +ntheorem-vn-15878={doc="13lkgb4qjiblbfm4jcxgkxsf08zk90lqz02bxrmim1n8gvyihwcc";}; +nuc-22256={run="1918fk7bh6pz1grm1655fag16i0ir67ywcx28jsggsly6641nkm9";doc="0r4345bpjdb9f5gmcdjf6zav64gab5f9i4nfql01yg7b7mhk487x";}; +nucleardata-47307={run="0rrxpz66rf6g9cp6ix4rrbjqj9s357qsbv87dhri62iy3alw5bv9";doc="0kfi9c6isdlf188zsk2yx38z43zjzxf8fhvl3hm2y87di2kihdax";source="1lai682rycff3hm954x482hzn1mq1lrik3g1fwkbm73s99nljyj1";}; +numberedblock-33109={run="11v5n8s9glczglmqm4bfykg5v0qdqr2wfnymb15aichqqvbfcgsd";doc="0rh954i5167pmwmisn3v26zqqgdrk5bcn2pc16m3wyrdgvq02kzw";}; +numberpt-51640={run="1f4hmqlkfzqm8c4q9cbcqsh9pkchnylfv6gfzafgn9v3rdksg2dj";doc="04hdl6zrzw4zm8cihvfidlnjirfj7zlmh9mb7nzzq68cyxn30256";source="0ha3v5lgn8sycfxs6hlbdf7n0b8mcl2mny2kx37s1bib0h8i0bxg";}; +numerica-68021={run="0x4nx06ppb1blp4012pb6l3fkp3ikw94xy9g3653cam3p6pwlviv";doc="0dhsfbysxrm91hxhgs842yv6cxx0agsj486sibzwsxajbmwxc36g";}; +numerica-plus-68019={run="1x4dmzxb4m11kdscmp8n7jd1ihd21h0nh6dx3gx8nmxghzq20160";doc="0h3y8nxw4zdbxzwkfkffkc8p0pjmxd0lh8zcn5cisdjzk2dsjjyq";}; +numerica-tables-68193={run="16zsxbdydwzh460qc69zs54w666qmim5rn0lgf5b9kx2l0x8mvbm";doc="0b1v2a44lzys1qq2c98c22v0i920j07k2ayi8l4kb0z95gzq4y29";}; +numericplots-31729={run="1c127aalh7jcx9rxhsyhi2k1qdz6fg8d6qj0kvf564s9c0npgar6";doc="045z6l4dmn3bzfsn7gi6bdhwvp3cbf9nj8fcs6q07vi4by71bk98";}; +numname-18130={run="0sj8plvx36i2azwnk9zhxd16x7dxk2419rdzc93pl3f68kxdmy5y";doc="18iarxgxxi5dj0cj1bf0il74ndn5lng3axf7zz0jwqpl5d84pz6b";}; +numnameru-44895={run="151c13r8arj094jw3zaymz6i7invgpyqr95p0qnwhj22z418pj1m";doc="1rrargznsmgq1h6a2ixxr9bg57zcrs9zwhxgz0ssbscdyvjqik8n";}; +numprint-27498={run="0wkijyxl1zzay8vqvsyhk6kf5247qr8k55rz91dn1ph7b597d952";doc="1jra448iyyvc8qgc9z49brb6j9c89fzf5zhgz48k9959bv8izs8r";source="1svwh456nbswkrmj98s91vr2x05fvs58chkr5d5slq14wg1cpa0q";}; +numspell-61132={run="10rqraqmnd3pybpih3fhk0068g448252hwcckxzd9vd33n7gfw1a";doc="1hlfb7b3hq9ps7l6z0qzymc8mg67kdipcshb1bpkindasx6dnkl3";}; +nunito-57429={run="08hnxivx7ixmvp7l6kxfr0vxy7c78i9jqkam0xxg5mkxs9ip481k";doc="0xhv3rws4kp5s4q4c10ykkf3yyl9i9ndxjavjx9xxxwm1iap9m3f";}; +nwafuthesis-66895={run="0vicfc3gnxf7cvj7lqa8sd5maxlkfqazc3wi8il553fw88dxvkcq";doc="10sln765phsv6rpxjhn6z431nwwkch3qbq0s3wjk0mc34302qykx";source="1xk78d8zaqbn82lsw0fi428ac9ybs0xnnva2lkb9k8zyijz5w04r";}; +nwejm-70606={run="1x96p32bb8xpcjr4831fc3217cr0is3lm81fpyhjp23kcdzjk56r";doc="02ii5nrj00mv7wvkn2bgzy9w2f5l11bxs9cllxz0wvbz17xflb6i";source="0rwm5c34ycklp031w42kbwjf75nibv7y1wa0vcl9av1xwi017nnq";}; +oberdiek-69038={run="1gp308z3xisg8qmg6bggddmmjdpcg074vv15jwhb6z8xfwyj3jvp";doc="1cxl8d26mclv7054s92c11s301gk9kv11zicx8ikv7mpa605ylrf";source="0xcdyy5v1a28zqyip8n8j8szj0bdircciww0a98w5wfxgl1d0dym";}; +objectz-61719={run="0s93jjwcmyjd126wmf2rw3776jgq0ldk40f269cp29968q00sfn3";doc="1qxqphnsgh412lizx6jij6qhnlx1d558bzd3klqf950bp2hy3cm6";source="1l8afdawrrcnbpqdhjls28ncksg8lzs7g59viqygwixwplha0fb9";}; +obnov-33355={run="14cz2rqp4sf4f880d49yhvqjkzm5aw91cdijmqwf283cqgzhdmlf";doc="0k20zh42vcm449dh662frdmspmycx0mi81ml8qkvnncy8h40jxr8";}; +ocg-p-28803={run="1cfg5253i7rb0ng65fwm6v0yhs2l91gv0a3d8bra1bkwz2f1mfmj";doc="185fgw41dbw1hsbv5lr84spv1qcfglm0xhrgwk92g0dgh20d0kfd";}; +ocgx-54512={run="0a1mvlgn1vql9w8ziks677ysir9fc904ihxhn2hy5qsk9j8wc5w9";doc="06d3hdgvwymvxq7vv7ccjiyay6vf2v6c8wznqxyjjb8sv64mzlgd";source="0z2jgksb5pccxs2bf94vbzb04b1k6a2ssrx3fxc3fwl3z8afqq9q";}; +ocgx2-65292={run="050cz13qibfz6q92qah8l1ji1c5g8r3p1bvd6wbl8lqwhzfkc203";doc="0jkzkssihk8gsk90liydqpk3rr10mlja376p4rd7kpyswdc6j7q0";}; +ocherokee-25689={run="1xhb9y2m6sahkqlng98f9rqi94hrj66594zqdd2sv82902vfgl9p";doc="1fqjs1zwf9rgdzzc0wk39y3jcn150ssh6yvda4jfyqg3sv17wwgg";}; +ocr-b-20852={run="0y62xmxbw7573fwvfr69r7bhfcywvhcb4mg7am5c3j96ipq5vqzh";doc="13r2chskacbnfawlc9xwskrl8lqj3dx8gzzpyjjk09rx1g5q9gc1";}; +ocr-b-outline-20969={run="11lv3dba2g8mrnfh1y6agg8ipivhnppd3s7gqljlpdbdbk40zbyn";doc="0017l87j9g42cjy1ki2xksh6xq0hl3rsxcrdyrddvvxp520p02x4";source="0yn2mcwj73mazk503f13qmfy2bqkq0gz264ckr33bc88f1i1518b";}; +ocr-latex-15878={run="1l5s8wlqk4fc9i3fizhbm3c7nafq36w39693xm1x07giqqw8q8cl";doc="0ai4kr65ls66ywxncb63jr6gy6lcw6zjvlgsbp4wd6kfjxs27bh7";}; +octave-66115={run="0sw5r5gqvpmrn96rfz8y8hdbrwasv751p7ga5dary1v1kp4brcr0";doc="1r9wywnqhgrg2jjlzyafhdnyxd3fa17zjbbw1bj2a3r2jzd201h5";}; +octavo-15878={run="16pwz513a39630p51n84761asli9kba5z3pmbgfkcz7yfk9iiq22";doc="0rdb58jnyyp12i7ndd6qibs2jc1f0zcw42jh9j48aid6nwslvrbr";source="1f13rhvd2l3v7fdivk1ybw0gnacv9y2pzwnbw8ykmaq3x7m3x2j6";}; +odesandpdes-69485={run="0015ldwqcn6vwayrdljikhcrwif0dsfpj3hbkk47j3pbz38i42xz";doc="0l5fbi2r9g0nbs36bgh3c8fnc54qa24xy44yyw1bzdsnxgq80glk";source="17ffq9wg976f5dmny63zxzic58sldmnv2hvf4zm33lb3jgf67crc";}; +odsfile-68204={run="1k1rhixcwaqyzawpajbi3ljnmawc5l582vb0vzsnmq5dkry7ccsd";doc="1jrq1mp70vj3cncv1l4f8km7yrn2lbhjlcrk0qa716r5isqhawfq";}; +ofs-16991={run="0g2rxji8g1nafyg1nzpy18vzk20p4p6r754m89naygs1qn5n4h01";doc="1v1z08m2ha071kb8zia1wlgkflkzj4hjws8rqnq7asvhi1s2p1rj";}; +ogham-24876={run="0hl3xjmd2bagcn2wnmr2rs1hzmgvm421rkdaimplzdnwj0r64j49";doc="0phm6xdxl1a6nh6g17nyz6p7f2ymll39k42588dzw45z7zwan40i";}; +oinuit-28668={run="1wr3r06hbxrc0v9cwyp7ad6jimw05x3yn6vqpnzchk5l0ixnlkaf";doc="1919kmp5sxd9q49m6dd8zrnjx0cqgav1i87gag1rffd5hz9w4fys";source="1mymvxv4721nhmfdlbl9bgc76dainzykggf93jx6xfwlld0krgis";}; +old-arrows-42872={run="1immbai327l7vkq67nz6mcnyqmx3ajg3blrhbmffkbl92482bv4d";doc="01kdfgiqp5n74lipiviv2alzallba37gyzfp1sqrvwwvrp3a3z63";}; +oldlatin-17932={run="0cxpm5qvbn0a643x2h4dc0pf00kqqk1z540j6dp7mbiwv48qqzdb";doc="1my5h8wq241dm3d6czb1spznrxmrclwgn8i391pwmc11z2ijqgjk";}; +oldstandard-70428={run="0zpj2g8skx2c4k4qwp45dv995zn2qf738jvwwa62zmlknpwm8laq";doc="0fqa1g80ipsbpbj77n9g1djs0prikfs4xi0f1m1vw1cp12bcbiv5";}; +oldstyle-15878={run="14lm3ghfgfqafqivam1dqf3gqgkchnbnc84z5i0whg2p18x9zns5";doc="1qj8nbcx1krpha49k4yzyix13vs9s41g96r7kpdmv52vlpfgs4lx";source="13c4dxvikdxx7qv7y9rfpgj4fgzp21q71xpmq1jzx7phwrsn6wcw";}; +olsak-misc-65631={run="1gm01jvlj8vcl9a3v53bcmg604dzf4immd39dj6n6c692r38hhzr";doc="1afxiazmp8pvgfym1i2bj8k5slfqi81d915d7lax59ib0p05w4mi";}; +omega-33046={run="047w29bij6g9k9fl7ymap4arhdmm9kvjfsikvjkf9nd7shd6k4kl";doc="0r686ck7z6vxcajrjihp4a4mh3z23xr8ic34dv9yp039dh0kbm71";}; +omegaware-66186={doc="06kzz0342h6vvc32ydrzgpqsdqv5l0jbd5finr43fmzqi5jnswil";}; +onedown-69067={run="1hzj2cyyp3zqa2wnw576cjqg6nqziahdn3vijg9y7jr0gc3372ch";doc="0a4hvgsy9i6a26k6n51dv1pdx92d4vk6p3vdrbx8mqwigwa3rijq";source="0kbilw165090a925g1p6z6ayfynv0z7zjzw2c8sca3v0ncyy3cdj";}; +onlyamsmath-42927={run="158p92zgnmicfwibiyr5qbkwwkxhvfpvngkbpbw6grbdhlwsn63g";doc="1d2znlhbz509rqzlwqnbz9b64mpbhckh8pv23fqr8058xlbazkh6";source="08znvq2bzapn0dfa7f4sd08gm5k7m3sh6hkwy17zwkc0987wx487";}; +onrannual-17474={run="0bj29lk2nlsmky82ablxl0r6k6wl627zrsv9g97hydgdmi5nxasz";doc="08c3xmyiz91623lnps3iahi5ga9941nc6bvxmdihadxhm2lk769z";}; +opbible-68465={run="0njr5kkp6a0xfd010w3n8g65bv88zx26yd4nslajsip2nzad14n9";doc="0lyghd30v6wx5cmv7sidyy39qjkng3xlazgg50s6iaydld8hk608";}; +opcit-15878={run="1g54f5sv05rg1xxpydsakjrlckmh1wq0p15w4q0935iw0aq7rn8g";doc="1rx3ap93f4570d006qci6j6qi88zwxc8504gg554aak1lffazw5m";source="0242ajp415h3y20dyvi2lrp38saq10dgb6hpnmadzs7wrwxhma55";}; +opencolor-66363={run="18a6vha0n4mwgx9lnm3d4j4rkf72qx88fbzgs164arzpx4gp0ypy";doc="0n7myxbkijvqgxsvf9c2llkwhqj06i80sv81vgkxvx16974z0mg3";}; +opensans-54512={run="0xj7v9lv1ni7mq175l29a039a2ifmdsy1wnv1h0gfni5c34knm1w";doc="178pa2kjvp15la857iblh9qc195z3byd1wxxyn7c5bzmndvypgxn";}; +oplotsymbl-44951={run="1x5wqngjdmc4751ci5qaivzgqynmmg00kg2clngxjqf48n4fakdd";doc="0bj6w6h4g991rfddmrxgc02090vay2h2qjx36cb0hfx55gwkmh3b";}; +opteng-27331={run="07a6dja6s7c1759i9afgacx4v0fli98s6mcq5zig689hpkw841fg";doc="1125aj55p7n6b03mn6p6845yvx2jbjkwwldgwiixypklndqsf6cm";}; +optex-69864={run="0p4gx46w18n6zkpligmd0ya9mam67rqkpdny8spiqfz423jdsnmf";doc="1wa2ypz7xza926fzc8lczrvqzx3b1kr1idxiqb5fakxwd0zyc7c3";}; +optexcount-59817={run="15i48ly8mbhhk0mq4gxwpwbvhpgvk1pb8bfbmfk83sp1liq7xijc";doc="1cvhzkl2lbz939y417ipi22n9alh9j7f06d2r1s0h294692m7bpv";source="0s51426ib070x23d92rgpj247qni42hzaw569z64i7zr3nyx16dh";}; +optidef-50941={run="1jvalzi2gid20wn253swvhil05m273x6685n0b5wbrz5kbvzk212";doc="0sdd6rsdfx1fcw1493b12ww5llww6mv0rij3f1ik290c6qbmyr3w";}; +optional-18131={run="1mv65cqcrjhykpl565z96s57z05635q513qr440crbh61rp93chs";doc="1ks001q2b1yw87q0frhqq6yv77mskng6v1sm6kd8r22cv5g49xbx";}; +options-39030={run="1v2j59zcv5cplh3czd6r7cs4n79yvw3448492bxk446j4lx2mfcx";doc="1za038prpjb3s74ryr25q7hmz881gr8abmf68h7xdjq6bdk73da5";}; +orcidlink-69253={run="0gjgjwgc05iavwwx6s3zrmb3ac4nv5y533bgap14wwx6x50i2hf6";doc="1ajspvsx9ginyh1j0k1q88081dh0jxrsyr0c249wlnkbdkpcf6gx";source="0nlhscyjkg5lgi0y7sddwkdr5v5wcs4ilxxcpap75a9hdk4ckiph";}; +ordinalpt-15878={run="0nia32ms50727kn080xm2v0kjzws5sj6jdy7kglp8wkipvc6nw82";doc="1nwfz0q6csg7rg3hqgddjbiz8f1nfcgghiqvj2wxqf0cfjh8zb95";source="0rzlbngvszl1sjrigpn55i7a8rwnj9sy76c7gwb43d4im1ybd14d";}; +orientation-57390={run="0qcqyr76wiks50i1zr3skp7bsnjzi6snsyvsm2za3l08kbdi3ixx";doc="02cmfz42sdd1gr4yaha603rppdh4c4wjj0jbcrmwlfgl9a47rj11";}; +orkhun-15878={run="0x78b5d70cxy7binl5iq2jwgsjh9rzs87wc8ib18jxscqick5jgk";doc="0q9hwwf80hq6wffyvd26kq2053vs5czly9zlsclh93hsmzg3vj9g";}; +oscola-54328={run="06jgk12q9hmbqcmwb837n8l96f3bafc7mgnv4v9amnh4ajlg6i5x";doc="0qzn7d70vl0lxyql152pzzhi72ivdslmxvfwr70186lh6fjxr4nb";}; +oststud-67217={run="1yzsibisphck9a6dlbvcs84qz3lhnj6amj6vfzh8rgy40s7vvz3x";doc="1sj2lk6fhx9bdgpxnmw6m25yrjmka6m2ygiapj42jp81n51pvyzn";source="0phykgmzds9bvsblfazg82arwdhzssjc6b9faazi5h57jcmvbss8";}; +oswald-60784={run="1dkv4javwj8zfk987grjx00p0p3hnzajm4mgddm1g4z1zfjfdd4n";doc="16pgbws7vf93dwaw8cm4laz09hywp1xigrbdbaq9ngg9g97sn0l0";}; +ot-tableau-67813={run="0wrxkvi28a19kdgsms38wgxgygib0iypz0y830gizq339vj72v2l";doc="143rx32hnxnbw61n8w6skcqs8ix411dwcwgn43xzw238almmhidx";}; +othello-15878={run="17y68qzxifgnh8k1q6qfn97ka7703ac8nqk62ridn1wbxc6fb80r";doc="022pv02lvlphl8168rrcdzk6w7d9wd52riybfvvy537ifwp7kqr9";}; +othelloboard-23714={run="00cybd6dg10bwl2k87i2lj9jq1nmq4jc9v4qhjwqij5zv0l5yz4v";doc="0g5k2q33r726xyj1mp08qmyb4xdihiyzsm52mgbdn95iz08b2989";}; +otibet-45777={run="0fg3gc7614r1b304g78ipq6d84bml2q4mvl2yc49jjnz13nr05js";doc="07l6475b8z98pkmn5labv4i4q6g92lh5bdsdqcwd28v5y1jizhmy";source="0lfwadx3a1ni2k91dpzsdh297j3viq5dazaz78acb879lgz61ik5";}; +oubraces-21833={run="1rhavggv1c50krafvh7lwnvarh7lh59x7lwkipw24qakq7l2a6mg";doc="1bw3b54cn5dk0j4diq8qxfba0w3p0f78h4kycb2bqd2gq7258vyq";}; +oup-authoring-template-64491={run="0cqhrwpylpj0z5gcgx9lyhsh85vam3nfbzzsz9x9laf2rdi0v1qa";doc="118916mwp8zbjdqdwmxzwaf09a16rc2zrll9qmig33q48xszdf1r";}; +outerhbox-54254={run="1867xhxlbskiysifmwlr10lay8khragzi36fm552cwc4vjz2ybcz";}; +outilsgeomtikz-69124={run="0a0g6fnvxzh942n5lg71y2ry39ra9b01y8ngjb05sdvka9a9vwmv";doc="12msajfyvrqawq4j9d9pcqfsirsyiw57pna9zadkj8mizikfdv75";}; +outline-18360={run="1q5dr9xlsn3fz7bcv08biv5cv71qf8brzgg4468mksh8lc8r2kli";doc="103sijg9ib5qfwaxkdgf11zsdg2c46dv00hn08sspl56a08j54sl";}; +outliner-21095={run="03j0mshhrchrgpa2z7j7q6n783va5v0w16gp401rzbvvdn0l2qni";doc="0vi80qhq10yy051sfzh6pmn34laghhvx6plnggrwvcmpp4fcw14h";}; +outlines-25192={run="0wzrf2fkf9kh0d3jjbc3kxvsmkynwzg622ghwcabaps097r9z45i";doc="1avkpx77sis4hrrs9dqizq2sz4vjzvn19ks8q7l32qyz6lnxwk2b";}; +outlining-45601={run="0kc3x4zq24f2dzwzypdi4ysgsfi40l54zxpaxdfgd662wxangrsp";doc="177xwyzq3mha4061dxxshszsyysmb6nl5b2grg4m55mn19qlw2f0";source="029wnd1px0wdgffblxcbs33r1ffv761sgma7bap9g2d1n3dwja2c";}; +overarrows-65853={run="176w37bvjjc8hi2a48138gj77sj1ibfnc71355lpk3vh2whhrx4y";doc="06v0v79kcqakhkyjnp6c9rvqryiy8rrim82p0d9m98dib48h7h3h";source="0nmh0rrsbbcl842lc1zl2dhj5r403phamfbfxmn0qs0f1kqd2awn";}; +overlays-57866={run="1xfbb4953ab25dbccfsp9ban67vrq79j443mlglnzqmg1njrckk9";doc="1nm0d47vclan46q0zvigxri5zqmfpv0qkk0arsg836vnv7l53q0g";}; +overlock-64495={run="01h1fcgplfbfbkb1wp0gnf6xrqn8l8y1hxrd8gxpjqbg53wr278p";doc="0gl3n6h41fbzi4lcsdra5z3vafh7drm6g04ilmbb5cbkpnsyl3nz";}; +overpic-69343={run="17bbk29v6pkrk9igzx4by586jfc997mj07srhgy401mnmxls2jyk";doc="067rq6plcan44h87adj9jlhnnlkk2f4slsid4v6x80423q4gfqll";source="1wi69kgglry5r8wg944x87scqsqx49ynj372y0qfa7n4dajxgzwz";}; +pacioli-24947={run="1fc15ygzkdbv5mykgrmzb6filkl3aipk7i9k1syh2ssr37ldxcjz";doc="0pknnd02q244pxyc2vapdx04adz7gwf41swda2xi3039x82pm8fd";source="0zl6l5yc7v5w1xjd83prvfmy8jf3jyblallphyglgb4vkqq6mxxr";}; +padauk-42617={run="1yjqxzqsvk2mdsk837bgwqf3nfm9gh873bnir19wj5kj622zfh4d";doc="0331w1z1b5x15yb3xyxv008l95idv5yq9xb87da5r9p5fzfh1z0y";}; +padcount-47621={run="15p8g5hjwlm80xnm9py3ss6afl6c8rdq8f92z7518hp0yp7d3zfw";doc="1crpv27a9rfmh4dcliqvi7aa4h4lvkv48k5zk0kx6ahhxa2zkzaa";source="0vkk0c7gvzihlmw3f8ni4awj9r6xrysj9rrsbqk6dkngrg02x4xz";}; +pagecolor-66885={run="0ycmswy7jghmnpkdv6b519yx7ga56aw7yxq6671nlg1iq1k045kx";doc="18xnh0588b95h7fmqwqzb0p2n9fclqy0hxv3a1cci8anpcr6xz0q";source="0qc662yig96f53wdbawgvsg4wx0dikcnf85b2cffwlkr8qzrwlsg";}; +pagecont-15878={run="1fh6bplg468dandbyvmwf13sh27r6x4dmrwslldlc9580h8jv02k";doc="1vrcr5l1facyyf9p8977q0i5m7cn7y40dbmiv99314iyawa3rr1g";source="1qc105f5v0jiahk8gpgr77lqfaladba4hmqnfizbblzbjhhgg05p";}; +pagegrid-64470={run="054yaxr2q8x82dii8bpy3y1nhc1drvwm98cd3asaddh4lzrpl9vl";doc="10rsrkdl9bp04kxxl2g3rfscf0hcw122py25x2jbq6lgz76780jm";source="0fbzd20z106cgzknj98ryzmwiixmbpvnx5p8v3ns6yjrwrcng3lj";}; +pagelayout-69486={run="15k0gbynhgg56h48lwm14mchksj1hs1jd9l70g9b47sl8w8qv1w4";doc="0bxr4apcms8bjmz4zk7y0r7yqnvd5kx8wmg32fypds07hs7075vv";}; +pagella-otf-64705={run="1vrzz63la6i270bjqb1nd4rsqqgl13nrqrbmr0l58bmjj7qh95d1";doc="1dffy7z3cfyq2kzyvbarlqivfv4rs70qa7drii2arv2m1609ylz4";}; +pagenote-63708={run="0jd80dz0jl2gmfr74lw6jy1x2hj6zlji9az956gkj8bxxc6zir54";doc="1s7imj4fi08487xmcsicsa4cknpsgd10dbcyn6vkggm95qn6119w";source="07ngnfinv2mki203in54l4gx7r4qx9rm8k4x7856gr7jy1wkw16f";}; +pagerange-16915={run="1nixc1dn9cbdi3pa5yxajii6c9ljgc2jrnknsa7wb66kj5j1lqch";doc="1vy3c498j95miksm254a1sh7d8bp3g5p7lvncc1xad4g388q6hak";}; +pagesel-56105={run="1j6rg25mhaiamlff4j4lw8pbp6x3mcg00biqz2apsbi6kmbiljw8";doc="09s7r6dzv95689ysdw442gyqsd2jpdyr8hkrigmn9c4sx32alq5n";source="177j2s6chsdhhw63q9g6ryc06vn6rsi29n4prrn2w14fgr3wnhcc";}; +pageslts-39164={run="1lm8707bl8a9kxrbbr6sap3p66zwjklqv13invm4gcsg92yf7yhi";doc="163h2h9n4cvap2c369f2yxv3idij6wzjqwf0wd7w5024h1vvj683";source="01nwizj0vlnwzbqyl5dn02vg5xl2aw60wyvp4plm0agg8kxmsi3a";}; +palatino-61719={run="12jc0av7v99857jigmva47qaxyllhpzsnqis10n0qya2kz44xf22";}; +palette-60119={run="0wabk4pw6gr9y309dsh11w6gygayzglh0jabqi0zsvy0ikr7wri0";doc="1dp867fydnxdw82z4gxp1sbz5w5q9jfnls6r9izylrzy242rd52l";source="0iic125v6j1ljgnm7d0qicckxwmgdg7cz568556257js942ldyxx";}; +pangram-66300={run="1x8jdn8j3dgzkm7zv23529gr1jdmh15wkwkljzsc1dnviz0ppacg";doc="1y7lakwbh58y7mvwfqp6m4r9ad0kblsls53n7ciq994hfa6gx07z";source="0xq10764gznwqf7nfaqjjqd6s73a9h13970bcrds7jiyq1s8l382";}; +panneauxroute-67951={run="015w3jivsfxcb0gjrlpz796p50wchmb34w3ad0dk73qhn2jrx6p2";doc="17c6bnyxs6szybqb1ihv0q8pn3wb950s64z639vhdwhaqvppd2f4";}; +paper-34521={run="1d8w8aicx5drrgqdcrsb7vdy39xh6xmnnpympy1db5i2mc2nkjca";doc="1r03wy4harxplfhqp0dsqfpp0s4j5gn6k2p43fpw7wndna8lnhyc";source="0c1iv6aynpfi37bg30q235zdpbyhj83rkir4kdg4vl8q27c8gpwg";}; +papercdcase-15878={run="0gfkn87avjnfjx2k6hz5k2s9iy2lxwx9x4r0cp1lcwjgjsavf2y3";doc="1hm0i4vvxhxn0wvsrbxd2lkqspqkq7ik3sxxm1nd575p5l3zgl69";source="0mkadgjk395z280220zndpbbks331d5hcsxqnarpjmh00mkhdj7f";}; +papermas-66835={run="19i4m31q8jji3chanrbqqxni9x2c4mk0qp1scf0brjaznrcv4dvv";doc="1an36yvg7z1yhb6gn9ppxp24qgdjmpndwy8nwn87cyr4fqmrmgr7";source="1r3cw66snl1dspbr9i6pz8v83x15ylhm2k5nbksrf7f24jrvvxn9";}; +papertex-19230={run="144zirbvdpq1q8an6i5rngycmlrgicf9skh6mnwyz45n4zyyzyg1";doc="1aip8lhazpmmvdib6yqivbgjagyyhmava29q9hrlx833385vvnhj";source="0bfkh8vwqh6jx34fmqfqf2qz5wjpmq9bpzbppf0cphs5frbwg10b";}; +papiergurvan-68239={run="1gyf1liq3lv8dbfdpv2ilbwks4k88m2ywnv3qxpbrg3v2l010c75";doc="1mw0sc6svi8rci96wl2273bgn2f3w44gdczaldfflxc7az4mhmvb";}; +paracol-49560={run="0lbdk9wbs6c6kq0iyf6amc72m1njdf3h8yvcnka9dkhjp228ldf0";doc="0fnby29nnrasv32p9xwwwax57ijzscpnsv43rwajlqwcdhi3s2nj";source="0q9izjw8lrwcbx0cpq66pr33cn02wl4daxsjvlkrjzw8zzrijl64";}; +parades-40042={run="1vmjda4cvajsqai47wvl0byi552gdcy0j4m36p58gjn3d9bc8818";doc="1lz9dsy94x5cvv55nk975fw7dlg4bm6d8ls0p6gy5b58sjd6vcp8";}; +paralist-43021={run="19m0ddw80vjzm8p0z5rrd3jf9kqzq653h3jdqlnjw4g81r0z730p";doc="03kv1n9m1b6r0r5drp81hv2i8dgnlcsz81rhi4h6a3xyxnyhw6bj";source="069mn3mk34rxxhl1c1878zs61pk7asa21iwwk6r2v88yziczkhlm";}; +parallel-15878={run="0hja3k53n8v8qzj1vym1j2b4pj7hqszda82s83kw1v5av6kcy4da";doc="1i0ls71ib0l3igd52cgn5z0cjz0j17hsj0qc5y4sqg2nvivvw7gy";source="1slmdxldvxrvf61aa1b7m09cxpv6jsaw5lvbgqsby6jvgfp4r4g8";}; +paratype-68624={run="1cwcw13xdarisjslsp8aayb984fk4qhx1ihg887fzli0wn7kpvvr";doc="0kz4nzz3v6a4qk2svgqyx02j0pni92qpm5agb6k0vwylmvx6yyzi";}; +paresse-59228={run="0mbxnc8c7iiwcmh17n4yhl1imvsq2q7wng98k6h9r15nqf5ivk1x";doc="1qmqki6fm316bixxjispq92dc1b3zhrnh4ad64wdlsr3fpja6g1q";source="0dc0hblq764q23xnz7yj1nawdr5m55526l0dw7b49p5rdb0zhcg3";}; +parnotes-51720={run="0d8600ssj90rwl9rxd27i23f58lmxyf5r1sn8yrl8fjnq42q447b";doc="089i9fwzjcv98pnqmhca26wpvn71zcgb79y3jg5w8szagli38839";}; +parrun-15878={run="08cbzlfy5cfkxpgr4igv3282k1dx9bsvsjfdi8b5dhl2gacg4i7a";doc="0wvbmjzi8jwx5gdg8zgb4p3gz8v8rfp2hw67q0rm5f9rkza1a3ds";source="0d79vvc4j1sysbpy1qdqwd27fai14820z0hqkkd6hrxzq39x6xza";}; +parsa-54840={run="1n2yh9v3d8s32ylicq5vn76m91s6648zgvys6vg8m63pafzl8rlm";doc="0i3d87kajjcw9mallswncp113jz9jn35jkj2y10dmx6z5sv3x3qx";}; +parselines-21475={run="0ymcapxlfyb6xi4k0z1y42cyzan67yg5v4nnc2f1ac35yw4z57pz";doc="0396j4dscv2pqk9vxmz0p4xm4l3v9ln98cwv32r615l1k68vafsg";source="0cg77iddyvl6p818j74ci2zg4zdddp82wddhxqh57qg8vcvi9g5c";}; +parsimatn-69090={run="0dd3jhkv5vqijlkzwf4fd6sb1b8shjzkfydxx6ddbx6a0digxrpn";doc="00aa6asx9banp3v7mjp1axicfnfs1g3l6pf3ifq3n0vwjaxrpaw5";}; +parsinevis-68395={run="0g9ypx3ai49sfcr09q2q231p77z0glwwd0zwwfzxlhkyx4vp6vsp";doc="1mqhdyz9jlipjl74k5blpdizk79f5m876mgn6z39n1p0b4pc8724";}; +parskip-58358={run="037404fa7flsznyidn6vpp5r5rw6wpzrg6sc8zppj9hqciqlbd52";doc="1pw9mgg04lxmrin7vplqyfhxa2bb73yf7qj8l3bwc9yiw78v5h4m";source="1ysz2jfdi49qjyrfkx5k1vjcykk4774i581d7kynw7q9r25lyq9g";}; +pas-cours-55859={run="0gyw81drxs56dwqh6v1gqgs4xcwq78v9isgg38djxq17km075y3g";doc="1zn71815y5pkp24l0cd4283zb3i85mqqzbxmhxj19v5s4jx3ywsn";}; +pas-crosswords-32313={run="0nq8wqxrsgpdnmi2yqcs45mb93gp2lad6p0b6ifqr744hycq4njm";doc="154ifvbrx2z4ig8k00agjsgpsplrjlf8glcxipbgai9wqf82i2k5";}; +pas-cv-32263={run="01aqcqyw0h459xq18gc0y00z2j13zwdn72qpfmajps7ppadlcbxw";doc="0mwgvj4hbq9b6ih6l6hg6gl5qrxyyf0mimwv50vpy1z7bhdq2l6a";}; +pas-tableur-66860={run="0i91nszaymzzwijjlw0f865qx6j7x7rzrxbrc51i02qlfgpaq9zm";doc="0199rpla518gv3rdbchfinfan826z5qs8zxfkgh7rgd7i0cid29s";}; +pascaltriangle-61774={run="06gbr5jgfbms6p7ghdkq2cs9d6p8yr3mvhb0h811y5rphrfzh36g";doc="0fch8y78vd7ykwn9qdgl6m787m89ff3h1fpj0vvzj5vbxmvw6cli";}; +passivetex-69742={run="1h49v6sqbm27isfwwcql9dzxn4vmcn2algkqh7f1pzj860xw3ygn";}; +patch-42428={source="02xfy1fs30nha0l03lqwl8xrpd81855kb5nb660ks83aj187dghy";}; +patchcmd-41379={run="0v0033zpp4w75lbxk8w2byhgy3s6qvm9281xc2c75bryp0ar5pfq";doc="0vw698r5q5ai4lx4vrb24x8j9dc7iwaml8scsh9c22cpqn2sn26s";source="1cb90y0i5k9s4jj3f9vnj6rhxphjc14p5nm6hllibww3h1khnrxr";}; +patgen-66186={doc="03y05mv0n04hyj0lcq54grx7w5wv95h61j6xlx2jc9v0ib9akq4y";}; +patgen2-tutorial-58841={doc="016bx1rp8kpvlywg0yafhbbhlzw4zxdcbdrd5525vffn6fyp9fi3";}; +path-22045={run="14k9dqvcc2nazjysff0s1jrass14d2r9i9cgfx46ss09cw53h71s";doc="0kacibdjhmz39klvxr244n42c5vlaz1z71a8vnssmwmdzzwfzs5x";}; +pauldoc-16005={run="14p0lnn5hvn6szhgr0ngdc31dbjrfk7r8m8n2jn5n8nirsrdzjxf";doc="16ls36m6c8v4x46bz26ysl0ndi9jmby2gl8b9wglw9ba2gf97xjw";source="17440237dyqhxpszm6rcpdhb8dib6l9qfqj5ls2m0bk3vqm7xv8q";}; +pawpict-21629={run="0sx3lwgm3d3cm4s5408x5dhf45kngls8izzkqjrqjy074736968d";doc="17zf7acasv8h9crzg6jw3d2grmhi689476z9x6872h7kzkn3whj1";source="1vxmq9s2q6sq6qza6lhkd6lmj6pg4bw8qvcpqr8zr12nqcfy4z3g";}; +pax-63509={run="07mgly5jbvxav3k5z6li0z7vwq7fqrj6cq0ky41v7alddjpa4bg7";doc="0pii0k53c0np8d4yc61axasnr8aknknfm36px3xh9sl1a475bwmn";source="07jzn5k45pxslamrak05iykqng5rg1b4kh8p6zbadgxb8gxrqx3m";}; +pb-diagram-15878={run="07l8172hqnv9dq6qg1ipbjjbmkpv7s589gci6q82zb8a0y6kyqvy";doc="05h5i0b1y03j5y0nf8iv8hb5qnq1lh5a55nn8xggx2rknnq0d1b9";}; +pbalance-67201={run="1lknxyk8fprbrbvc38kyxwnl4q2pvfvlpyznbp50qil5v78qld7c";doc="1s7rz3zf51vlb7v98ah4ylcr2s17gmmwayv0jpv03yz65iwkjmcv";source="1v2ljik0rsn5zjmxygrzjinrnyx5b14l4qkl1xa7vlb4gxb8ld9f";}; +pbibtex-base-66085={run="046k2l3v0vzxa73n15999lamllkz18is3di7gh8k4jd7y61gv51d";doc="099z6wqv969yw705dwyykfshx025vdbb2azzmdwp7vdsrfjhzir2";}; +pbibtex-manual-66181={doc="030rhhb4xcijvjc0x1ylyk6xz5mn90wrlp5ss4yr6qlpzmq21b50";}; +pbox-24807={run="1b6xli52wbqlhxf2sk4ryighd6jaj6znvpfv6n9s1iq40ag943dc";doc="1qa0h3ahh8q990wbwyrp4glwhdhbcgzz9yp436083w8c9ang0lg4";source="15gqbvrsigqqyzcf8rda0z0kcw5h6cnk1l9pxjh7apz7i3k00i5c";}; +pbsheet-24830={run="04z9iszj9hx7la9zqqqxrsfq3b6asld4zxvrszyjqw7z3fj7pyz3";doc="02an134idar5ndk2kk2d446bxawv0xkrwg8xvgxgpp8s1pqdzai5";source="0ad7zs28d47p3swvl6kz2v1p2nskrcf8fjwy0igwy8d8qalk0dix";}; +pdf-trans-32809={run="0dr8d6szds3hlrnrw0rb7il23rxw5haz37dg3iacgcdkffnglkis";doc="1dcmcd57zv90jafx3whd0nn9hm5x7aynb5npassjqbglb9lfml87";}; +pdf14-17583={run="0gpbf1jxfjl56pn3sj50b6x0z3fqhb7d1dl8dhf31vgcj8sn9n08";doc="15rgv0fw23c4zbwlx149hhbq711hq39v1nka52mjpl7lgvvzny98";source="1wm9nlqws9g02zkk3rgrpaic293vfskfrxsn3s2jb3iz0f12bp2w";}; +pdfannotations-68958={run="1j63vhy9iwbcfd00i6gsgvrn0q2r25az38221m4758a5x0mggf9m";doc="1l8ddc4vwqnr65b81z8yr0al50p1pjdk3zq4yacqi6qf6kmwibf7";}; +pdfarticle-51127={run="123b9f0nl8wyyxfnbs5krr5ayrgl02hg9z8w87lj6g0lxch7dfhf";doc="1pg4iix7i0m3smy27xk5p03x8m6rq737kyhpf5qzckm276n88fzf";}; +pdfbook2-53521={run="027mgmbd3gnnc6gqk8vjnz8j52cvx71z5y6flrc4zd7g0syivdad";doc="0al7sc4rxwd7g1cmyh8v4qhmlngz19f0f08x8n3wbfnvk2f8n33x";}; +pdfcol-64469={run="1b5rzfx5lf0v3k1kb75j364jfdv4wg910qhv0218dp4mxwn985z3";doc="1qrd28c9z0x2jcvcp5041s6qbkcvham8m06xmjsd31kwnpr4f4df";source="1bgpg70150ifvrviwwbhzr1fa03fhnfa4agnhyfyp6y393i6dcc6";}; +pdfcolfoot-65512={run="0i99z6niw3ryb7akzxxwhh0nkrajlfig6a2ixwsr8k5l4ga037cs";doc="06y6bcm8kfvfkrnvwn0s14hvp6ad3785fs9cc70w85v2lnk5qfm7";source="0ws6hwnfybvl0g7kpb7qj0akpnwsq9s5ddq27l9c05564lmgxcph";}; +pdfcolmk-52912={run="09rqw5csr4c63w5z5c019rm8h4plqzwy0icxbzgap048a7x02kqh";doc="1nslm2frwxqcrm3spr601p2r6ga2b91d7v1v0rbi7h06h14mvxa6";}; +pdfcomment-49047={run="13cknk58kksg605m2jjkvmkfm47sdk56irj8xa3p0alx8c4cn67m";doc="011l19b3lhc8zn3dn071gnlg2300174xaqkdn83r631zz45yriv7";}; +pdfcprot-18735={run="0m4lf1rb2j81ry7v2g9lfqs42rizifd64q7xw9dzhnixp900ldfk";doc="0b9ac68snrs7fs8g8nqrs62h8jjfyjsa07psk8qc20nvpya3hjq9";source="00nmdx6l66w895fjir6r2pwrnh0vpn706i9wi5qxx143h75rgifl";}; +pdfcrop-66862={run="099j54qmjd40q9mws11sadhzdmi70y27mjy8rpkw2ijhqgfhbiml";doc="1wnx4ci4p77cz7l6yihdbx62w65zd18smqqkb3vniqwr11232nqx";}; +pdfescape-53082={run="1vbdjmm9bi9ngzz2z1b8jnf6nzf9xsaj5pvyswg13y4dr00mnz6n";doc="1v81nw121acyv6mvpykgrcdvsgqmby8acpby5lj75ih4zya9gs4d";source="0jk7rnf3z1hlrqlrcx0bzic46v57d8vpm4w5fn4c37q1f4v5zmpi";}; +pdfextra-65184={run="11r5ifc28fhngzj6ygzfjk4j03xwri683498gf6zhwq0j3km70jf";doc="1cam2f5byw6l7rk8hb1zsw2l7qk52sv83wkx6qzgkhmzqbsh6wck";}; +pdfjam-68597={run="1bjq9nax4i940y43b2iw2i7xjzd1q87h58sp4y1dh1x1n5a7fw8k";doc="1kh8xlzcbhnkrwz3yryg8ai7m315yw52k1ydapy218zbvjzrai5r";}; +pdflatexpicscale-46617={run="1z19y34c0x05yp49jqn0z8i3ghv0sz8zm0arb576rz7mskpivjqz";doc="0d1zzym0mgsbicp92qf60fq8l2sdbdx47517k9pj3v8g91svxlpw";}; +pdflscape-64851={run="07bmajz9ggwkq7pz49qipy3nmaqd6ypwhpxilsj9qw4bk5asxclw";doc="0s7bv2v7hcs90fvgk12ff3q89nhxp0v8zjv38wc5inhvhk77jvbd";source="1cx870l68mch1hg0va4g3vdjw4d508bw1kw9f3x9b4wfi7dqfwrh";}; +pdfmanagement-testphase-70328={run="0qmdvdick06p7p8g9w40vwkgz7ls4kywq3paw362h86z0xz4adpb";doc="0vicksagmf2h5l2rz28wwwzny9wiirnqavwg16apycfcwayfays6";source="16rsxnrbs26q9s2qh7m3aapwxhjv122swhv2lmv5w4zgz275mjqc";}; +pdfmarginpar-23492={run="0mhf21dcz4ndhbh1g0h3kcqza4ni6iigrkif0iryyzg1zcx60d19";doc="0arfch7gb07grg0n8ij0wfzbfzc8bv5izvhp3vjz8hl8ha3wyzgd";}; +pdfmsym-66618={run="056w6dq5ymm0x71bcya5nq4iiflcmgw4fh6zv3yb8ihpjj3h00y5";doc="1vrgfpg21bzg8xcw6cf43bjc3gh0m3r0s0y8lqh2nmdl00pmybad";}; +pdfoverlay-64210={run="03cc0088b0iwjmx5wkcs48nnmygsg7w1xlvbi0pawgmhfvfivis9";doc="0702k1ckh9akj21xvbvn5s18x8s4nwk0m7jybkcl8f481qyhhv26";source="1z8n2a0kwp13iyja45l014jyl8aaw1hhnxgxfib6q8i0qd97xw73";}; +pdfpagediff-37946={run="1a4qmaypz1indb2pw4vz0hv8ihanhf9z0azs3zkv2ya6qkc0kphp";doc="12di5a3976bkilcyfg0imx3w8771ky0acgrag7xp9rpcggbi3r08";}; +pdfpages-69524={run="02c11a7bvw5g9gq2xvgjk0i7mrfl14c7d7490nh1lajxhll81f4p";doc="1vwxmhffq7zlgmvh2x3pbg68x0dw3zwmqsa642r7kp57wc4ldad3";source="18p9wm6wnw6qjzxn77ibh33zwcpqhbz3zc2l4gwza1gpdsirqlcz";}; +pdfpc-68610={run="00zab5xlcqqvvwfxf1py7m6gslgv4drx8d419wl3zjmc6ww8156a";doc="1fm43d3q5gl8fg9p9n3z1nvcp6cykm271waphnjdkj29nbg7n9wv";}; +pdfpc-movie-67201={run="07d7d7h8zfap39dd3nks1bnpnfpgs8nrzzdsmchy6isqfmfrypgn";doc="1la9fvzrlik4ar3fdaxla5gbwpa2v49xrrwc4wy60i7h80vqv80d";source="07lw20wp5cqr0pvjsw3ds75n3hggxgcp9rbvw026lj5k54wik1bv";}; +pdfprivacy-45985={run="1l1nqf4ihwfycnb1x44l1dl2h9f3iy1ppvr0l4zb8qcjqhl4j63y";doc="15w8jwhksfiv0h2iixk07xvvmk1g2j322xqid753bcyks48xffjz";source="1nqjj51h0pcrjnybj3cqb8zwi0r1ipzzw8ic2clnf3in88pjzjhs";}; +pdfrender-69058={run="02zipdaymsrrryfn1cqmj5hmcg9r62mzrjil6fm8d4jgk8ihykm6";doc="0m1cdx7gh5w5a5g9n27a2amlkmy0ixi06w2a4b145sxy41acai50";source="11y3vy8709m5cz5r6zh3lnw451mn6l0674p63fcgqlircs0j7vr6";}; +pdfreview-50100={run="0saxaxhma5gdn150l934y0q8x0nigbcn9r7ixr8rwz4d85g05m9a";doc="1kdyc7h2dpr4gjzf9g0rx66gsxaiwran9k7vj8942pr3x2d2jbaa";}; +pdfscreen-42428={run="0kkdnwgwc9z1rqsz8cjsmfjdi3ycwi7n7pl2929yvvwixp10rr6f";doc="1zhg4vqfjjmg4z4blrr2zl6jp7m2c24m5diifgn5j3m8nwxp6m2j";}; +pdfslide-15878={run="1za0jp9dbrv0c875zddgcvddlk7gm47crmn97k4zx2s7glx24wj7";doc="1rv7wbzrlgj55n7r6i9bm1vxjvjr38v67lizmbdcxz1lfqbv0rw1";}; +pdfsync-20373={run="1wwndjn0058hflw73y8xfsmnspvaz61r55k96fmsdfb7xfncv1vn";doc="1dz826gclpf2knrgks0lhvm6rs1xjxqpzgbz4nkv1f8li7379y2q";}; +pdftex-66243={run="048dw9m8gk1rmx5v5ylymfcssbchpj9s5csjpip7dz0wa23yc19g";doc="0mszix35nlx7ba9plfdb26wclh33qzv11qd3b243ys0rkv9lbklf";}; +pdftex-quiet-49169={run="00df842vapzylgavkk2c0j8yg562n2jawwznvyf3qq6dznwf1chn";doc="0sa2gs440h3jd5i51hhbfvpqjpfwvzz5m32x3ld5q9k6zi88b395";}; +pdftexcmds-55777={run="1fpijk36lx5czl6bpbawlm8f34zp264l1fli095wha41fil25hks";doc="00xzyvl66fds400dm5zryrv3m5s42mv6658zx7fnx2wbd0jxs738";source="11516wkglckyrz41pz9cqj0xa2bd6v2l234k28ynnmfjsg56vph9";}; +pdftosrc-66186={doc="0mnz5id6fywhlay6r38nvii0a2ks5gdb15i7s7wkq1ay9k5k6fq3";}; +pdftricks-15878={run="0vji4gmlg9b67yj8gb3aj2291ll1xg9p5vq2kvclj3xpy1vnna8k";doc="1hzd05l4yyz5giw9kqxaw410na7k85wj0cyw0bbwzxynpzxqllfa";}; +pdftricks2-31016={run="1dlzm7ivhxvz404nm61kxjn5arqgfw5z184qaxwn28yk6ri07s8a";doc="0k0zr8mv3xq6ibc7s016qnk78b1d22jgyq35jwimj3rm2aykdmww";}; +pdfwin-68667={run="1mxfvchz2h9wrybvb0ri4iygwn1ljs2jzsr9hi7j7ych0sjq1c3j";doc="14i9y2p683d9rgw599yjllgyy5gdb5z560pbb4l5hlfj0mxzj2ja";}; +pdfx-50338={run="1pim1kiilydijs57zcsd1cnhzvcq5y621fb15hwg9y69s624wjwk";doc="1rb38sw6lyvy24hkdyw7xrbm99bplvcp4cfcdr80pdwf51g10faq";source="1y55s7h2cc39vp36ickpkc8dl42rmq77l1d47h1dxximyihl96x9";}; +pdfxup-59001={run="1vvddbdg2l1s2m47w9whvjd1pfp28l6mnyk1m52wnspm3mi476fx";doc="0mbqq0rx1k1hrwbazfkxf72n1wrkngp45gssgb9z2pfw6k3sv3vm";}; +pecha-15878={run="1ia3q7gygbg4scgja2qf5p7wbgd429cj78b8ffjcz68vgdg86jjy";doc="07b7kmf1if59nrqnsws5hklv0idjjxwp37a16dbjpcfdirb4s2m0";}; +pedigree-perl-64227={run="0a99nbm95pagcnww7wyxqwdycl1ags7arjnd9spahj1zn7xg1413";doc="0d13qx3al4qa7v9i4frii3vv3n52bln12d2dhp7wyjla3jz6673a";source="1xb778agh5vqbm6r14aff42wvipykjsw9yk3i0hj7ibz4ipcslr2";}; +penlight-67716={run="10lzsbz2ia477khfm43sx2qli46isf2z8pvsz23yvip32lmqznrb";doc="1hxj4i1zfbwbyl633wn9m4xvbagv7ljjjgil3cjfmdapxgr06n1m";}; +penlightplus-70319={run="0na807958mkb1if5s5yfw5ml8gqb7ss1mi0r6dpm543ndypnhj2m";doc="094gn0avaaphzkrn6i6c8xdwkhr47bld57vgrpc2mvcp6pnr6jns";}; +perception-48861={run="1dqr68wkf70aj11g4ywr56si8g82bxi2xc9zdnw0nm0wbimy5zv3";doc="00g96wswsnpd0smv1s23hqiq4lg407m80nybmig4ibcrafjkrqrf";}; +perfectcut-67201={run="1hjppa3dv8a5740nr5jya445y5nb0nb2z1jlkqh386bnvgby8393";doc="1ly3zrrrfb3jihf02p2j5ym3m2gnr18pf2v5qg8rsj2l258xlark";}; +perltex-52162={run="09vc7pbfjl0zjmbra41p5lmr6l6r4gh2x5h9h5hg1i76n4mfkd8d";doc="0sndaglhb92b4jvp0jzpvdiwzc49ijh309aysahrw0pwkdl2lv5d";source="14rv37h9qwgba7dqq8zzvm0dc9y4hmyr6yvvkfbh2il5zs7m8nrn";}; +permute-15878={run="17ky79fz5pb9xr4gwrfpnpxj16mzj6f3wnh9dfhddzlmbllw1djs";doc="0m83nafyxbixsyg37ia535h3axvf2vp6ky0yg1xcv8ppsl72fd8m";source="0k1h40himliydiqssvmzl18g28w0hfsxc6kv7wn1q41sm54knhay";}; +persian-bib-37297={run="1yzbap8fwmlz46ngqcy6hwjw98z1cxlprpzk6vg2qw7wvs57b143";doc="1rn6p3zbfx6vxdjzxavvbf9405cxk1kv56971n6i2bysb5h22w0y";}; +petiteannonce-25915={run="0xvpw8lh1zlkc89chbyjsfszr7ix06afh1fajp5iiqiyxb021v7y";doc="0nnf9bw4jdm3w28957bdfsl9z94a3dxz5kvmjrg0jkrp3r3cyrgv";}; +petri-nets-39165={run="1hi46pzd5cjvpakya2bl52w7m84xm8h03m01jfrry3vnp9hqbc11";doc="0ixpads25k51rlb2kapxgv75w5igbnv5isn61c29qpm51dpaq012";}; +pfarrei-68950={run="0zp4msdpi4w1fhmp7n2s6cdzxss5a87k0dw7z9iw6csnnwaa40z9";doc="0v54c02fmsxzwc8i3050mlll9z1qgmk6vvkdgjmph735q2bmlfsj";source="0inlfabzb1q94bq2zw2416vaxbgwr4nw2yfax491dg5hqpglyl6x";}; +pfdicons-60089={run="1pxw1mhm2lmggs67ql176f6csajabhylmlxaxp47irk6mlihiavk";doc="1czd4z8rfnfp241lq3v6ri4hnij4b8pg2h9lcs3qa31r7zmx4hkk";}; +pgf-65553={run="1xai2x91jf241w03lndpa478dijfm52kyin1ci4s3pwvvqvwvcib";doc="059fvzbpq3nggjc3yddzgj1ci4xs5qrwkqvqshcnk0agn80zpcx2";}; +pgf-blur-54512={run="1w9p9l2nw9bf0rhn70y70h6lqqqx3qravgarmmz1z86ara26k49w";doc="0fq1w85wqqrml9jzi7s2n888165pg4ds8ysvgh56kbkd2zzahnw3";source="1pc8x23l6qcq356s843si16yc6yfrvdxg7v821271dndkg7d2vvh";}; +pgf-interference-61562={run="1l3gryb96av9zwxn4naxz5vy0y2245fv5zlm1dg31p88lflh2s5d";doc="09vvbnmcv8d6y75hxdln9gqspm35fada4g66w6z4kv1bg7z3vrlj";}; +pgf-periodictable-69924={run="0kicajyb144r2srizm2zmsf5a7bv8zx67xbgs3bjpiwpazz3pj3s";doc="18cxvb1prlcd398h3wvfd79iccb1sxv1j05llp17jas5q52y1is2";}; +pgf-pie-63603={run="0wr3r2997p8as08d172sr2hxspmi5bgsgvgwvkm27hg6kpi74zsi";doc="13xvia0zbgsrsy50rp3fr07hb1zfj7jfs95ai6cvy9522cw1zb0a";}; +pgf-soroban-32269={run="1y1c70a9v9zy8i58j19g5c8nc7f00zcdrdjmdcbm19r8vi2r09fr";doc="1r1rgd313fijmjqy468j25d55p76vxmcrgkp968riknych16y1pl";}; +pgf-spectra-66961={run="1zl4cmkd153yk99sm6cki1a0g5z1pfv5c1d8jskcxzrfxzzrd75b";doc="1iyny475v6h54crlfjm32lq37f2dg8mirgghs57cqrrcl2nv4qdg";}; +pgf-umlcd-63386={run="1qsnmhb0jdn5qnq81zx7gr1a1l93a3f2z12lfz9i2c0cqbjnpxl5";doc="1v2p1xq7y5a0mpd067ragvnw21hsvl9irwaszc6sdb9sqgqf2qh6";}; +pgf-umlsd-55342={run="0rs0iskzhmlgydk4i9idql66sk9dyiqrglp429b2sjaw0mbjyxvz";doc="0vl7wjrgnfz0y0pfp4izqi1528i81fssak85w1sl2n97lhyq8mkk";}; +pgfgantt-52662={run="18snhw1hvff64xq6jaq6wjdxcrkjwjv39hif31zj2r0ghsajqaqs";doc="1xhls9kyhf314rrmd8r3065qaffbm48mc746lwhsrh6vmq548baq";source="0hgjiy1gs8nx0211ar38qr3ql5yx32mcdvms0yibpglr2ncv4x39";}; +pgfkeysearch-69385={run="1map2bxnwlj2v6w4h36jfszz858a1zgdlamdjj0jc21xjsfsjvbk";doc="0h5zhzh4k0hbz9gnh6ygzsr8jm5lrhdx0qsm5z55xm18q7gp2ri7";}; +pgfkeyx-26093={run="0gh229dsrbxw6brfz5m2zz6x3zfsa03iqps5bgcr4bz0qfjl0a2s";doc="1cbldr5x9n649sk9dfcp143jrzxh6l4ibzndx4yr8f7id5nx3nag";}; +pgfmath-xfp-59268={run="1lfnqkws7gjjbzh0p5i0l94p1fjjsybwf7mzl5d7xzcap9db4x71";doc="07d6kybw6q6igfpn1cgjxdi3n5zz6ic2gazy71gb2mjqbzmhzp88";source="0jvy1qy47r0p3fx5329wqg4fnqlwlqsqs49j58qvz6k7l0n6i82g";}; +pgfmolbio-35152={run="1arhxgwpsw9ifj3yy36mv52r8843bm3v1lrda17r44zjf4fhimfk";doc="0kxp1gqd09q5h4ixjlfmda9jm25wd3s7dsxcqc32sw3qay4d84cp";source="0lxbszlky3q27cyzfnnvglmzim4lfjh14p62j43sj5w2arv9w3v7";}; +pgfmorepages-54770={run="0xarflkdk2xvfmmsafv1hhpdrfyddjxlqjjwps9yzzcwblpjnali";doc="1wsa6iqyrcjq7zyanjgaq6a1i5d7lm1bk9y07mz0bjwc2yv359zi";}; +pgfopts-56615={run="0g7a22d0ppdzcazrif8yjic19lvz143p6vwflz16p6zh88yhcdm7";doc="17q1mlaql7f510pz86n64sm4m97nii72jghf75qs5yr9h9lqrq6v";source="1mz5nzbhmbgzjkpkglz2w3s9s8kzrigg3wrd91dmdhjsm4d4kczi";}; +pgfornament-55326={run="0hvr6cbp4mzajmqz6fyd3x7qr9b2vlwdhkpc62axgm2sww8igp70";doc="0i1fncv9saflkvib43jp02mh94cv0nnq6k8psrf4l1yx95sdxnky";}; +pgfornament-han-68704={run="17ldl3a7gp2pi010hp1fh15haddjgni6f7bkgqyl1xk4yx0gjcck";doc="0v37qkx8j0ijgr22bya5m6ka0mvnymkyqsdg3q4bzhcfydspsvwy";}; +pgfplots-61719={run="1g3q8yr4i5h5jqj8w5yh1jix2ia37la59y0dcmrj5bnsr8zbmbx5";doc="0fd0azswmcghgpajgvxh82752j4mp5avslaicp2x7hjddh54j357";source="1h9js7l4vygn230svbmby09k966gkbgjxykk5vig45qdr7mqg3fr";}; +phaistos-18651={run="064gh7pwrsp37dxvjfiar9bl1i30a1kngirgywndss8xmrvqin9m";doc="01wd0636h2xs465rypc5q7saxhind14krmk9dp9rqc9129k7rc0q";source="0l6nmd3v9x3j8if5aryak2kh42zza0g73plwv6im6hpxkhhb21jf";}; +phfcc-60731={run="1w2la7mmj0a3sbd3k938bnq8fbl6sdy1w6bxmdfgiywj6wiib6ca";doc="1y4y0gx858gida7hnfngar6damk1gfvpzx70zbjsl2v7x6qkvkm1";source="0n7l6q9f2i4n6lc05ky9vgm0ms2hdwxwynfcqz216pshd1k0b2m5";}; +phfextendedabstract-60732={run="159s3ncwdb79chlffvp9awiyd9gx9sxacsa8596bgdq02i46q3ck";doc="1851hbjavdxlan8c480in5j4wyxrl4kmgqgc86f9xwd9k7f1gp3r";source="1psff7l4917izgx0id3ccl4fk0zb3s090db4a8dcm56lrrpxzq3d";}; +phffullpagefigure-41857={run="10vdd225whr0y166xbfc8qbm39vmw3ksvcjm7ylkafyp670ckc3a";doc="008q8mf85s4dfbjxbc0k9zpwazbvhbfcc0hqvn679v23kxgfphnx";source="1xwiygkhf3ggmgl21dsqmpq6238whn20wzhwn8znhh9sxwa58pyl";}; +phfnote-60733={run="101mhf3pwshakfnl298yl6fsyaa7xqw44j2g5z4vjvvvl53i7ksj";doc="1y5vnm9y3lxkl58gzhphscffzirxv608qg6bjk6xf82hz8835nac";source="1vjb4irvrh1nn4gc858zsbjybshr9ky7h1var6yr1ys2p7fdyy6c";}; +phfparen-41859={run="00is93n463f5iv4gxd18sc3w338h6a38xahrd1r5j8mv2d419wq2";doc="10ninpjl9ij19kw8y8pvbma34b1y462qdigpslid2g3gyagkrs8v";source="00bd1j7zn84d0lfkw08mc93q2ayg7j7bq9klcvvcd5m189spj30h";}; +phfqit-60734={run="1mabnz0dz0m098dxinlmx0whkw2ph2rbjc52iy1xj64aiik9v737";doc="0882ddy6cpg6ca1y6csxw19j7ipm482mfqlp2ldsiwpcgnzx8vkz";source="1ac8wpm1mmpwc50cyswv7hkkpi9b2fnhhjkzvsxx2arvdpz07k9w";}; +phfquotetext-41869={run="01na6w8kspl4i0i1s4cgnl4r5fdcybqxx7mzdd6mwbd24mh971a2";doc="091rcqssy0snh6m0z2pwpflfvvf7fsrriyb9lq0f5pnpqqhya8ds";source="07q96xkawcsiipr87nbwfawkcqmgch8h695gg8wlq091q2wrp452";}; +phfsvnwatermark-41870={run="1jmq6l0hb895bfqh2qycxpimwdgp44c64cyxs3vnfzxsb4ii4sz8";doc="0bcj2m5x107sswwg54zhyfdfdhxn14klnxkvb1hc56qi4wc4vkwy";source="1q2l9w8lll3i4bjna6csx4kdpai58i25gn1yn0z4p0pbzqvi08xp";}; +phfthm-60735={run="1hk4wxxw7l7snclkwikk0n90y6h8g1y05ikkz0dwpzxwswn9fjnd";doc="025hl2lz0avbrbv341cgvq5jar40vrgr2rsrp817mxrbwlc53qfn";source="0gajcnby3vwmgsgyginhi7fcjssayfc73mhg6mhhdkxi0n2gfnxi";}; +philex-36396={run="01m80gaawlxnga76rkqwwrg9bg0szyd3qi0d3zyvk1n41h6inijx";doc="12s81zvlsddzscvlwqm080y6iv1wm5vrffp9aqdlkpcf0fwlriva";}; +philokalia-45356={run="08z5hrp8a0551s0qfj02l79cpkdnsll5k60di132addymsl2p0lw";doc="0pgy5y3b6ramrkr8r7bvw5byviy50fprjsj4cj5h3l888inj8kkx";source="168r0ygbvwbwxlqvjqqma0q3w4172jpif1sr8p54h70crqx2310j";}; +philosophersimprint-56954={run="1cdnlyf9cf591bqp1dqdxl10i3im014vhxv77m8mviklayjyq1lw";doc="17j2zh4p8xhf619slqpm6bzycwd9zpr8qj066c4wm63la6fy7lyx";source="1zdcwyknfjxw3vmlipklrvfadw5ahh4i4ns95kyqs1x57c7wgamp";}; +phonenumbers-63774={run="11f7cnv7kh2pry242nxgq72kcjcaxg45714i5rg5w7q5nri4fkf6";doc="08hzmb5m515ri5l27gr0mi8i1kwz6sf5f1rzhdif433knyhfm34j";}; +phonetic-56468={run="1cd8x4qajx3896a1bzyhnrhkg8j73lffri0fzks5h8s27jlnl6al";doc="01hnb97dwbd7g4lflb9kz3w0vhnk5nzni31sfiqbg35lypa0pbwl";}; +phonrule-43963={run="0xv49vfvlfjad65gngbk5022vcdi0w86mzqk60nbz3i8npvncplf";doc="15bgpzfxjm22f4vqq9nbjhldvxzflrpayv51g383nr41j3k4m3xx";}; +photo-18739={run="0d9mkavi2x4wha1c9zi2fswv7vsi4hr0588gj82vwmwlrb6v8gsa";doc="0xnxkv1rkz4c7wh7dm8rna2g2zf9i97aaajlfqsr6ls1d9by4zn2";source="0vxja102ajrygarqfg0y7bmmhx2my66dlnfp7rsc4kldi1g2fs3j";}; +photobook-68313={run="19538cm7z4sw742y03ih5avr6bhxwnpymmppp8w8ah2p4ixrwqsx";doc="0bwb0mw20iz32cw6rcagpdc247n00pnql4nby8vrkjhbyj8l3hp2";}; +physconst-58727={run="0078ggfyyr2vh5ni05la8jaxnyxaz2jn0rlahwkw05ng1h5nwl0s";doc="0d10kzi278b6yf7dvm3j2nsks43jm6jfjql5jyv51l8bq5grkmr8";source="1qvhif2amxfqvwj6vd82f9mjgrk79crnz4sw5v19v02xzxv66fsj";}; +physics-28590={run="06nwz84201w9vky4s877fsiw4pk1kf6iq9yp1jcap7j57nb4l23j";doc="09zmpxkrrv9j2ip034vqwblazl4kyprvp24k0f2k0xgc4fja2pqn";}; +physics2-69369={run="17br2lisl7qyqvjsgyaa7c2fx3hvblj9cx27zfax7v32aly423af";doc="0lwn61jdpzljwlgy1yzllflziwqchq3fwanj6c2yy02rfyi0lxp9";source="1g1psidas3yjknj8nlhrvgjiy6b1b6z42d8260szq8wmmmybi13c";}; +physunits-58728={run="0fzx8c7sgd6incgwdbzyd3pb9dmdajb3qdfd3mj8sascilr0c2h4";doc="0ha1zp0lzx2q10m0wp492sf45pw5cfd98s9pnzn2wxx3k970agf8";source="00p7p4hh49i9xwnfd8y7nsgxajjcpdlxw1asyxb8q20x1w1wy2cs";}; +piano-21574={run="10gfxklfwf60p54wcbs4l1jpwasxvvbnkjhjpiygnk6mvzjx7dyl";doc="0czqrjlfx1i6k02aa1r1crvkw7k2fl17vzqzrkc97msprrymxwgk";}; +picinpar-65097={run="162119bh7hx30742k0f6ygaa0w9hssl2nmp63rmvdnpjlazfiizp";doc="11v1aynkvc6m7484h2pmcm24405v5pdgkvmjg4jabgfkz5q71g7h";}; +pict2e-56504={run="02rhm6a26vgpscasrbz25vjimlnkh9s18pq6a9025k65iwp5f08z";doc="15k5w2l4c9mxay416bgj745g45pqyaw749mn69dchg2pqh77yz1j";source="007yb70j4ay0qdls8kqb4wxf1g3672yasjjlqc10zsywc005f0nw";}; +pictex-59551={run="0yz4dfnmakv78bc7rlabh8582knr131mrx0rxjai640bdax8as2a";doc="037ljjsnmllkxgp800dj1k9pvabwg4gjsqci84jdmayjcwsjibl1";}; +pictex2-15878={run="1qqf08yharknq6csk01jdff62mg011bryqlq5mbmjwqwh7wxs0wy";}; +pictexsum-24965={doc="00yd0945qiss5jizkxncg8a9bdsld7mkhaipi92bbn1ghqicsw5a";}; +pictochrono-69865={run="136apjhvd031j0a1jaxwkdm6lhg4vi173wgcdkd61phahc4xzss1";doc="0sybhyczmjjhi47fxqz88y98qq7w8nibxij6ai6k3wzkhg9iy9hp";}; +picture-54867={run="1i2775x39n5vxspy555rwn86384yyapl70kcfir96prp1846rfjd";doc="09gid4bb2wbmaqday94qj4r44cpk57rxpzg6grdcjg4y1dkjph0b";source="150wv3jb6hspwhkjnbxff5izskvqfvhvqxbw773qikjjxsaidqgb";}; +piechartmp-19440={run="1sl8mz26cglbsqmpd8qz0l9yycxgcimi0yhkgnc04n2iik1xc6b3";doc="0g8sh91ki495mqv7zxxz2q40bk9dl150a9hi7yv0kbpiy45h3af4";}; +piff-21894={run="1q0xdl6ip1706wxprpd85vycyksbnn1ws091gvmpdhn6as4fxg9i";doc="1sa2l82yndb9pl8bfmnna20ackv9rxp7y6ljjyix3bpksqp20rwq";}; +pigpen-69687={run="1mij57v2cfj9v1mfhxlpb857ipydzffbdbzfw00qmh6iqc36cfn3";doc="0db3m9vv02d261kinx2hj70cqw7gpywr662amrmxznhhq3990wwk";}; +pinlabel-24769={run="0dlg15b6cjykp481xn03kg3p1zqwccwnm2la710xdwf87p1k4bp6";doc="0jw94fl3awpyla0flmw9f72j3ssrqh1scfrbx34mxlbmnl4z3pfc";}; +pinoutikz-55966={run="1kj24i32ql4jfhzfxyrcj0nmyyhf4ipic7zdzcz71za6njqv3gql";doc="15farzmd27gp8ms5vck6xcjs0cx7rp47nww0shs6r0b0l99946m1";}; +pitex-24731={run="1g91l1z71481hlwz8vmdac0g4vm5d6940gy1ly44qny626k9j079";doc="070qn9b6bq4szqa9wqfmb3qbfxcgif79dzbb3qqhvs7fh9bivqdv";}; +piton-70446={run="09dcrv4ss2zw3vnpqrpbx5v6gizw0zg05qbc6f1rk4l0vk5m5zad";doc="1gaxv75wbv8j1nxpg2gp30gnzk6vp7226nchs7hi1686xqngaa0v";source="1nf5lq7mcycj3nqc1bxbfc3gsk95f0k6xnyh4dsxma1kx3y2s0c6";}; +pittetd-15878={run="1s8865g4fv04ha7vls9frkkmx8dyn0l7z1rqvh3dkyy7fdgq4vff";doc="1jkdny3kqljfjnf9ywpz7xqvfka8kwi33jy3z2yiq1fvp8k60ar5";source="07k0ilmwkg3wvgfpqyqc60hn5mlsj8z5lsx8mq8h3igwm4j8krzi";}; +pixelart-66012={run="0d41qzn2gsqbgvgaxk9a7cj5r285ayn8amplzv57j5c5azyi6qlz";doc="05mcmy25mdl42wfdd3l64bkkxrvmcj6lw9zb9jypaf2rrdfnpq6l";}; +pixelarttikz-68520={run="1zn0cpmmdfvydizw1q9lhxdj185gyq2hpzl6rpjfxvx5wsm9piag";doc="1p5aa3mjv4g5qa3vi988v583d8h6237lq9bncnjaa5c1sd1l727l";}; +pkfix-26032={run="1sgss755cf1zrpv3x74x5qnqc6w81cvr1x0w7875ijh4c1xxkn9v";doc="0bxijxbbj9v4c5p1rg4gkqnm75rq516vxln6s6174ph7abqrhvys";}; +pkfix-helper-56061={run="0hf9hnjw7ws0mx9w5s6ik17zlq27fyc3p9bgya1wxbh8lcvrygn2";doc="0fh59nzzl58fgpkkfzvi603sfsfnqrj8s39k4nn97567gpv4a22a";}; +pkgloader-47486={run="1vmpxv6x2dq9b4ddj3xxqzkxz213bvz7qn24jlx04svdrq0cnpjn";doc="064qsri65nyy25sz8y9avpxyg3rzcspjr1cfc5jp0vfd07905zix";}; +pkuthss-70496={run="06xj3isz2c7pgw4czi5yj8i1v8ydwwvfwrrszvdfd9wrcpkds7qs";doc="07k7xssd23as7ck2068wv7gxcrvijq459fr5sya8g040pv65cq1k";}; +pl-58661={run="1j2a3vz3wabv3ai0k9xvf8brwljr5r2bi57nk0bba476vkvxbrbd";doc="08qkn286bx6akfrxrlbj52xylbvv00bvmmpin1sbpy342ij57lrq";}; +placeat-45145={run="0vmvw0k1s023siwsrl4hr32wyla5xmkvz449p7vlfv1n63383c1g";doc="0j9xm75xv0lqkqzm4g8aqxy6cs8vxydmm50vsjj4g4aah7n8jygk";source="0118s2p8vfam65fwynf3vabqj4kz0kkw9kbq49k7akwwj1wpyd7f";}; +placeins-19848={run="1mlx2wlm5j7qhhz8q1fvxd4zvjmjpzhk2aajql3wqvamrawba6k4";doc="0libqvl13md069fjbx3gl17fyzpn6v4jk4vk5086szbi93dr692m";}; +placeins-plain-15878={run="1lhc72zdm2cjynx6lf6kafmf00nw17z3mnfhagh41h76cnm338g9";}; +plain-57963={run="1mn5cfiaj7wrjij4y0g2mipc6v8dk7l7nc25s1gmgvvyfqwd3byv";}; +plain-doc-28424={doc="062d6hg4npy57307avvyd2sdxnmyrh5ia2rdb17p6cx555k8zxwq";}; +plainpkg-27765={run="0dq20a8nyyyy1342s8sc1z1i1gdfz49dmv2w9fl5dbnligzxgdfl";doc="145249b9w3jpf9swgc4293r05p7r5ylmxvx1a5qlv3fgni945vms";source="040m08y54xr4966f8b6z38spdhjh197l56am3wpza5qff4nbcj6a";}; +plainyr-52783={run="09py8psdqqnxmq2nkczxz092668zscvf9hbr6fcvrnj0blvz3wxy";}; +plantslabels-29803={run="16hzr9zavc26mqddsq4yzb2y60r2lh1yjlna1qyaxqrq7fr76g1z";doc="0pvy9gaarrwr4f0bzdhj3xgisfmpd73rfcv9mlw87k3l9y2vly0f";}; +plantuml-67097={run="00n393r717v82g1g70qs1b5isw4x5bwvlmajy1ahqrapwxrh7jfx";doc="00gihdh9lvs2y95imsmsjx4qqmqr9maavbvv974s2k82bg24bkkl";}; +plari-15878={run="0jybi5dvl6ksjpgfqfrdnx5q25gl5xgqhwax4dk1shf6rbafkgyg";doc="1js29imppwx2jny1hcvjbkz7cc9qrafgniy9qd11bvjyp3n1vly8";source="0br0vm2ncrdyqgazdr2p1kvgl6lq124b8h82245jc8yz7mnrz2nw";}; +plates-15878={run="1238w5267spw6liidzxd550hjdjxsg3d1231l9vf5fmcifllsnmg";doc="0w1jn22gd938zqifhbiikgggbly2fjhiwjdh2jq66yax7p76pjc3";}; +platex-67315={run="1qddfffw7w3l0zgf1dq4376fx5m76jys8c95wwibxdh20vydf0bk";doc="055pc891zbkjxdzl1wbkxrxs3flw79zms9ghnqjz2jhw6axh2khn";source="1pa7yg6369fh72y1wxj635kv63ba3c0bdhlg3ws202r6zl7ffmab";}; +platex-tools-66185={run="1yrgp92fk1ci0skh2lqw2pcbnrmsys7gai0my1ijp65zahdscx0p";doc="0v34yg2wv8jy7dj6vszx8p4rqpg0mnb574axqmp2irl2givf6wsj";}; +platexcheat-49557={doc="04hvm19x4z7vq2md3p3r2wwa7iqkgkxnvvj1xx3s9145m6fjib5a";}; +plautopatch-64072={run="16m2dsqws4z0i04wfman4m7d5p9y5dij8rl6bs0vphq4n0hcqhh1";doc="04npb7xbhibvjjxh32m1g2c0r3q5j5jhjgc7hn1nyzj2hzz415sr";}; +play-15878={run="0gs6iibb9jkmynhvwldwrh8rvalayv8vk8ziyx9qyqsdsgh53bz1";doc="1dvi29x0fdnb83bkqfsv6l2jp9rvvnqpf1paznx9pli8gvgwa1rz";source="0nlyi6ra8v3pgk5lhhvar848mcd5zqbnc6mbqnbxsj409jczd0rw";}; +playcards-67342={run="1bqk76g9mg86rkhjl12g41dph95zrdby9pddp7lac6bjwvyjg6rg";doc="0m9yvn6bxz3w6l0vfn9ycllj50az3631v5xabk3cjrnlhdq97qcz";}; +playfair-64857={run="1yy8c8aks9c37a18ynilrag254ffcx8fj1xydsi1a58gnifmhi0f";doc="18axmajlbgll8cdjw7v13n0rq9dsbpnm4sa13mf46dq4fhy1i8s0";}; +plex-69154={run="0q8x2358prmrlh3zyqymiyq7i2rpzdhv2gw7zvnzjzx7s3kwdjq5";doc="1bpj5qh46d4n6ymfx500p44vj0qn5bqkz8379x3pn5dcy7ia8kja";}; +plex-otf-68238={run="1vzscj27j18km0cjjbfjnls4ylr1b067cynxi71f7wv99s29fw0b";doc="1nyhqvwax36xkcvwd68yb7y5mlainwdw0czyyvl2yd0f0r7m15g0";}; +plimsoll-56605={run="0x39p7fhfyxnz95g44ci8xdiwiq0w2n7z3vq2vm26l9ia9q9m6d6";doc="0rjjk5l0zvqmj32m1xcyrawzzllbs11bzb4i4cvzmnakzlwkwcrr";source="1b703r0ssg8q021z9dc8n7p1w7hk5b548icc269gjrpad622acmk";}; +plipsum-30353={run="1byjqmx68gb2xcb4nw429z7wnagv5l0pi3v13dlwp57sgfkxrz0j";doc="0gmq7rc2r3r50b7w5kqglaqmrqnxv6wav8gz09a2skkir6v1mpgl";}; +plnfss-15878={run="0l4kjidsxzp14ii850m23q3yz1z8my9svqrpd5hi6v7qnv73vdnw";doc="0iw938rnvcfly3z5v5gikd3svx4mxwfhw0gsyv26m37l5slqvf1w";}; +plstmary-31088={run="0cda8irxd0gxa18x47v6d1wiwwwh6w30fl9ipxdz112h67l342k0";doc="02ql0pxjkp5a803f9ayvr9splfchzk6yhzjfrmh2nxzwgczy9s50";}; +plweb-15878={run="0yimmz965gsb0ddvq3ck28x73p9fn08c42f4331088130l43dkx5";doc="0ad3z41r1a3wkwr7lr9hf7n4bcas10fdjky7f9ykam0244r5q4pw";source="1zpnyzxf125qqz6j3m2182yn71nkrlaan1qfwl98v020iia6vyv1";}; +pm-isomath-60368={run="0kl56njrcs2qklkr49bnkx17qd8csa5bcanc4ypxxv883895qg66";doc="0glkk1l2gkqzkjg4vwi9qd3yfv3xsm4ssi03jizy9dxrxbgl60z7";source="1ly3bh0b1xl5wf3gxvzrwwg2kglvqmaj3mb7alq5x8q2wn1sxyrz";}; +pmboxdraw-53046={run="0a1mp38f2562yq3nzv39ffwhnzwpamy74pvqnigg7hv2v7blkijh";doc="07f1n2wpfqrd62agh0ddw67fnl5qczw16640h3v5x7yw31dx4n29";source="0mqg8xkhqy18m2sbp2i2sv58n2hxf05qr215kbmh0b53lbp16pzc";}; +pmdraw-69366={run="0mxjnrrbmwy6bs8jnm6zk568kx07shz4m3zccp7ppxcrr4b0y3fy";doc="01cxqlfnbqzn6cd3jcm01bxnmas86lpipcihaxk13w0zwaqvyxzw";}; +pmgraph-15878={run="0mrvf2r4bv4qa9pzv90ardy5ncq2kgy3y89pgr1acsm5cspgryr5";doc="1pizlqyb0n20apwb6rvh6yfncyxnh6vfhnvc10il9j4894rii6mw";}; +pmhanguljamo-66361={run="0jhibwvph19i7hmd81b8c83g8n2dd45hj0q1l2y59lx5a21zisrf";doc="0bk405rl1vs6dv1dwn5aibld2rpa5cwd06p9s3pa6n7s8aj8frvz";}; +pmx-65926={run="0brg4xinn6sg8c9jvh3cvznqhlg0l8hfqv5whsh3yaajc5pn40rc";doc="0pd78a36zwhbn7054fgknpa56jli5hqssbhz0qh8fmqxn6kvs8r7";}; +pmxchords-39249={run="0yv1c0s3zjy5w65cpv9gmdr13wkfg04jc0g7b1f0mh8ychhdab1a";doc="0n6g5f4szxsr6zqqp2czi29m1dncfgib1pd90mbrjprvwh0filf2";}; +pnas2009-16287={run="0yl475rlfhlnd9d0pyzm1gj2gixrdzyn6858j1ndvkhr8vc055ns";}; +poemscol-56082={run="1k1vq2hki8jq70d0lmw9sbzwhp7mi5sx735wkrz9046xd0qmhq7w";doc="1cdbv1ls20p764vkllgw710fm4v8nbkw8ryw2546lqa21v9ki4sx";source="1l6zsi6x6akb4z37iyllg99schd90bny8r3pz8vddqjyacnf1j7q";}; +poetry-53129={run="1z36zzm75zidsb8zixmsdgngvg1gyasxdz4lcw4ikdwvjmswqzqr";doc="03cal4780m1r6i1g86d2gil5h6n0h8dkiv8phfjcp890y9vdw2y3";source="0y93c9fvjhfs70qvnk9ff7hwq7zyq8hw8h65bwgr3f26b6skfxyj";}; +poetrytex-68353={run="06h9aqwryssmzkagr5af598ic2rr5j0m5h5mwaw3ssrxwry86mxz";doc="07jkb5z8sdc8gp3j2fls8hcqrh5g67wimb0nfmmz5287why1br3w";source="02x9gadfnianaq3hjrhllrql20p1aa81jv8lc033qj47wml9fajd";}; +poiretone-64856={run="0dc8ll3xk7yrf3irrgl5bh4dwvi6mvgp3iqvzfi26jv12m3fwr8f";doc="0l1ndiwxpva5r7zdgcmn4hghi31w2v6vd0bvmvmywhx82ra8spsx";}; +polexpr-63337={run="1dml5b7zb2w4cawqgvqld63wlny45vnz7p8y2pc7b5h86p51a0cr";doc="198dhv2wlclrs5sqdiqk26llyhjk4l4zr0hlcr1cw56dnhdh2j75";}; +polski-60322={run="0y66zqxb87i8wymryd19hjws7y9snks73030r287lbifb77kyx4c";doc="169z3y419d3afhmhk22d0h045pysdrkhyvsgrs951ah3vgf8n5cv";source="1m8pysaiynxb64n81b8zj3cly6g81w2fa1nrknqnxm27bjzn2jrf";}; +poltawski-67718={run="018iqwz4apkj8pwc3ws7k00zldnz4k02h1hv0ry9d83z34xswfsn";doc="1kx83mgwkxd0sv2xjzvn6wdsbdng6skw71z2xc3xk16lk356q8hc";}; +polyglossia-70496={run="0rwdpn2q7h2kcdnal03zj2km1rw5pvj08qvw90y27m3ps1bj6w0h";doc="0wycqg4g2xyakabgsd5a44p693g96r551nrzfb1v49m9hb9qswji";source="03s1is2254s34xipffbriiyd6gfwwqib83msbrwj5z95vv3ibazj";}; +polyhedra-68770={run="034zv3j4ga0xqkqn504fdwrcbzjh63v8zzfchjwcsbb2qn1x2rix";doc="1a01r85nliax7zll3qz212pkz2yix2xzh15hlbpqgqslh564fkxr";}; +polynom-44832={run="0vn9k3vci15lq0f6r2354ag4bs55jcq6571wvz3k4daym5ka57s1";doc="1cxsw0b5vxy191xy5clf15hb2cpyyqj5ipvgcw9n0hm8ka3g9l1i";source="0qh4w6q9qch3r41ps38yzlv850wcqvf6b0b6vqirk9lq978k387i";}; +polynomial-15878={run="10w1vq7101hnp2ifaa0j9mfccg9y4s3cyms4m63sx54lbpj6rc1r";doc="1vn0i77hzr72xkj6ka4r8n0g0nbz382z729v269x6p5j9qqmiz21";source="0hsb8yyk6ssih7fpc6qiwaf40cwn8xx4jgwqgpmfgkc0x1qkpri2";}; +polytable-55837={run="02gsan2wakxsw1niq6l82ag2rkkasi1nclf5yad2kl6c5654gp47";doc="03k3qz08bfqjyw4ymmibabbaciqz3srd2hll9np7xdphjhf4d2i2";source="1sh5wsb5i1f60sqdych0b3zjcli2h4g46znb0q6n68r4ma7xqixm";}; +poormanlog-63400={run="134qh7xsn7yxa9zx98gpd2hqx3lkd6sqc4rzcandvzi6prsjkip8";doc="0gsd83g26cafmd2alc2acqxcd79zyxkmpyiq2bw3qsasndkyfrl5";}; +postage-55920={run="10s3lcypskq2qmlyqcgldkg4i4a4qbbqn27v6cr6h3j4z93zir3x";doc="1zy7hrrwmdlr3vib8i8vliznri4p8dhfgkz0fx5qgc3ji15ks095";source="0h89r91diqwc1z9wzvbsynazv5k9spg2rfvg39kzb83lipxiqwjf";}; +postcards-21641={run="1glfwj94drccwmmsx6icc9vyzq7w8kvq6flkkbg1bp0rrkjf448j";doc="0cvhgz34mplpjzzdpy2bxblmz6qxxlshadj8in810g3y22v39khl";}; +poster-mac-18305={run="1b1zq9ay8fxqn9593f8n10zlkirw2b0piic71b9fx6s9a7x82w7a";doc="0wc0194ixbrl722a0djm704fmbf49p7vxk5fyv6d3gyznja54fxz";}; +postit-67344={run="032zhdciqwyfng7ll8bpnyl0wndwpm3q4alh7qmsgj978ga97q4s";doc="13j5ygc86v2nkcv5g18j4nacpckciyr641qknpb9mw3i4k39rly4";}; +postnotes-69102={run="0m9izldvlngj81c6nx9ig5civvvxkf9mh3cjj8xh0r70pf3i35yq";doc="1qs6z2rj9k9dmz14r0g1n2iz7hfssr5ysvk7k33y35c6pwc3vvx0";source="137f66097fqzqbzwfwzyqgmdax8z2a835y8ixrna1490zvakbriv";}; +powerdot-59272={run="18ii2qxz7c0wal5xqddyzd2j933lg4z7xglxsxn3vgp8ffq5kr3n";doc="0zpwjmvlckp46ycdldf049s7qvgbpx8cx5zlvzh81qhgdlgximhl";source="1v7pxr134kndndk542f7bs34c5kj85xy0cwvwlhnav89ff2mh5hg";}; +powerdot-fuberlin-52922={run="1gx04y9ysvwzghy38k6izhs9gm1hzssnb5zh8qjjh8v99mk6cqwa";doc="03ci0lcgw777kfmnzas13q75n03z8v2im1wzrd8hpbcwq18mmn2v";}; +powerdot-tuliplab-47963={run="08f25qa5fdacsd8i0bs8y0p3k0zjgja0qp4ak0x3bixz7yivg5nx";doc="04b546i32k1cs6armmnvr8aqbfvs0ysarlsjmsci9xdrz3clm5w5";}; +ppmcheckpdf-69527={run="04xr6c4niy53s63d7dw7fvd00j9i6k0fjfg19knai2l9bnqji5nf";doc="0l0q4qswcijs94pk8qgb74b96df1l8l980bvrrqhp8d071b19xdw";}; +ppr-prv-15878={run="05xs41xfm5hjpx9dzrngaj824rr8cpwcpvzxsyp1xpzlsv3gk1m4";doc="0rfrxzfm34kn4sgj1dzvdyjx7s7nkyjc785j7pgb609svld6jvyk";source="0miijdgcsn709kpp0zjyqxyxfgk0f798v748brmqshb6mfxbryzn";}; +ppt-slides-69568={run="1zbfmwmzq53dm8pr8kzhhgrx0i83s67vgkyb2krlssjsrmycyrjw";doc="058pg4005wb84iv6rr3pjyqfrabl29110rkq8vgq42dqcyr66c99";source="04b7ysvrxyg5x7m7x87gw6fn06h582xqk6gab69mwn24za9286ay";}; +pracjourn-61719={run="1idcncspb2dcmrfsr8bf1ar413mc51lliq9xgpv0ybsiv91yd4lj";doc="1hks8p9vksn88daqyn7rnsaza4i05dgfb3ngd5yrvvw0v40s3acj";source="1jbicfqvvyi4nnmpqafzlzlx459v5cyv62wmq67c2692am8a04v8";}; +practicalreports-52312={run="0rv5rsba1xdwcv89fl640yyqqk8c8vf2w647yqz8xawm358la42n";doc="1a7p22pkmb365haizgg3ainxlr2626mg6p9962cy0933hb59llcv";}; +precattl-63967={run="1lq5f5fx93a79q144980balnmnkvcn92gi85df14iyj96c1zpiij";doc="12gmnd4fafkgrffh9smd8grv2bsq1dajajh3s6rqnf2l8xr1wqkx";}; +prelim2e-57000={run="0fws0ssw09yzmzlvkz4sl571yi6yvynnr91s76vsfxk9xrzvkb98";doc="0madkchnll3aymjfk002ika9awnxqwglwa30mrvbdd3rvghqnm53";source="1bbcnrlhvqldvacxms4jclk5khh618wqkkyyib1fz2c93maxmz6g";}; +preprint-30447={run="0qs03jsxjp1cl48lxnvzh7p3pnpxfv8143979pknr06r24g25csd";doc="0zkaw9x3ziwddsv03acbmc02isp74ikpdva2azzsl1nzk0c3qs3d";source="0y0mk3118yrm95bn22hdwn9qay3j7j1ijkr30hpysf9l11z5ck2c";}; +prerex-54512={run="0nri97arzym6z3pjzidlr6svyk1dpr4yrlgqzh2jcsrqhwliifwl";doc="1wcf96nc4zvmydn9d628s9bffq3lnhnllci0v9pci03cs5p1zscz";}; +present-50048={run="0irxkzfg19h5pn0drgl5dlpz34j1p5jpyii05b2xjz4810gnl79h";doc="0c7pmcjhc3p4ilx3fr6pxc4708kl7iw1lds5ngh8mlrwz0hhsd96";}; +pressrelease-35147={run="0hrx80i1nfwyhhda415v67qxkgj6fqbg4bicirdn749bwc0anhar";doc="05spvrh6dfq16z9jlswzqrwnscnywp482cv3bhak4vavbxs8bf35";source="1c7nhvaxs4xlycsx2n6bkyy6rhnzc9ddcnw6cccpgilds546ns4v";}; +prettyref-15878={run="0akbp6wsxn4swk0kwxw27x3lpf5anwk49bb8pvssaj4xy68hyq1h";doc="1wmvvsz7y0idwfki553qkfhg8j7k5h79nlhmaz6ln448x8gym8y8";source="1w9qckaw403a8nyqyx8qyqdn3zfkxzgfzj1hdw5vwi2805bbfy1f";}; +prettytok-66884={run="09lrfza86v4haac2h4pg68vqjdx60h79f3p7my59mwdk67sgbxwj";doc="0n6w3d8fbm7pidh7iga8vmlvx8qvql90k14hahy4q0i2b8dpg2bv";}; +preview-69470={run="026s7kb0adrr1nf6lvy5l511xb47j51pf1vgpm7gvn4sk9hnm3fs";doc="1hcvagf9gv18695d3pxh4a3dyb7ykv2ib7jaicmvr9whzvhlqx46";source="0fhn4fprb3w34kvbwymxdjj8arqchalg90idzzgarika4mlpxa4h";}; +prftree-54080={run="1sdb56cvlfrys3f884hg6qpv1nwd6ywfyiq8168bs78g4q2ah4by";doc="137f5nbcm6p428an3v20j5cx5djvdri12ph07czj13877pjy9ccf";}; +principia-66625={run="17vkriwbkwjb2ksxbv9glz11i3dczj8hh4a4mfb3signj2dwyaf8";doc="1d7fbkmjbi6ym7kik631219fa4c1cs80k7f3kzzzsrwkmnhrq6qv";}; +printlen-19847={run="1h6q95dvpldmrfbpdv9v19p34iwq3jzz7vs0z7b6fnijyybjxnpm";doc="08p9zwkgjpkh7ip3i54qjdazgnwq79v15hvz4j4y2dvh294nmrgn";}; +proba-15878={run="15d8n2ik6m5sc4vlp3k2w3h5h8h5s4agijgcnlkmklw3qv172vii";doc="1m2mbbn1fa616dfxkb7x8azqsvczyifygjmbblsyfkd5kl6f8dwp";source="0wbnfa1i6vbpbq2a4yhsvpyifiw1pirz72qasxm1nwmgfg5dndx7";}; +probsoln-44783={run="15zsh16v5rs0baqvy9jwn59d95qj6glvc5h054ldb8sy5nwkl3sk";doc="1l5mq047bpdg21mjdjwfs6ghdh1cb19bf9y5939nlw1wyy1flcfk";source="1lzai2ynjnfinf38jdqb0bdccrh58jbhnwnpm9ikskxpzy7v262d";}; +prociagssymp-63242={run="1vs5xs701gkm4zl6x1qkzbqssffdhg4i3cabqx3s8hp07nw8h7fb";doc="009kqv5n4m5ci39bck5s3h5kwcim5dfjpa6y0xad46syj9mgjgvq";}; +prodint-21893={run="06s9qbfy0rkfby9ff3dylykl81yb3fxpwxrwa8hn1aa2gd9bj2n9";doc="0z8ibz668zjjjypcn0kiy488wzgwzxqackz5z996r3sq5x5zzgh5";}; +productbox-20886={run="1idarj7sxqkqzlnwaqv9f192r228fclilz01fjy444ly765k0cbk";doc="1pzba2ymna70gflrnw6hs35dgkv17qfjs8gh4g6van44wjykhfvg";source="1fnqp2sx0wmyd9130j5zbqw2dk1nkajp4qs46qm47b90wga8pkkj";}; +profcollege-69539={run="0xkbjg54jkxplz5jgrhs2vdxb6rn9idwzzknjw4wgf0ps5c8b4zh";doc="0h52b9p6gag9ss7h9jr8c0b0hjym7jlan1n28s10lhhf3l6rdpwz";}; +proflabo-63147={run="0rj7x6s9afn5yid3pqd2vz9qn21z6n6m5cahq92ygn1ix5xbw3dg";doc="0z56g41bw3lwi32z0imja6a4nls406ck3ic4pibyi5ajcb8317w4";}; +proflycee-70513={run="0qcl9dh1433kgkamvr08mdxpfzs56jbppll784fyzhlpfbbqay1v";doc="10vyp8jqi7mwmvk71x3jnkl9nrxajip9cmsqb62v56ry00jy8cc1";}; +profmaquette-70496={run="0jz4cpln3lh5mv23igg9rk837kd53ms7s7mvy4m51y35hal27dmv";doc="1kpjw4vm8wlq2d35wfy3cs08gvhadgl2lxq6z4qhwzkpdp24dar9";}; +profsio-70211={run="1gqjdmsigddwmv3vfafabxqfnbcb437q9glsy6fa6a5f7kmia060";doc="1wyw0lvpggp0ryhzvi3z7ygjlfpb0kp0fi92yfq8ww6sjjr06x3a";}; +program-44214={run="0ay2z8ga10zr5p453ss0w5qqqyknsgqd2hifa7lq0gih4rml14pa";doc="102c9fir3hn0m7y3lkj9j0vwf0srbv6inq87lcxwfkvc7yw0rr2m";}; +progress-19519={run="0wgkyvyf24666kg79h7wq1piq6yq2nkw6k5g0ydk3y4gwzzkfhlz";doc="0r303dr6yf1r5kk38c1njjra7vgvp9qrblxj7zd8fw1vlq2sc7fg";}; +progressbar-33822={run="1d0d6dy9ssiij19s259d2ns2k5v2ccc45anhz1qm7iqli12ij0m3";doc="0bxsgvql8hqv4qw1pv18vdxcshphdpbb29mqp3pbbsd4crp4qb5z";}; +projlib-70327={run="0ld45nn6sal1fyrfdahadvsb3jyrb5ylglva3rh5fcxr6fl1ywih";doc="1l2dbwqhpc18nq8xkwg5f8l9mcg59f9isvqd53kx3avr903wggf7";source="1667xlm00573al2aqrfmfhlksw4hvdcfzr5qa0mz17ci5fcy47rm";}; +proof-at-the-end-69602={run="0nxba2ck41yhjl5cfjhjj34l5srkh1y47h0byx61wqzphdr2y9zg";doc="0k1zfg59sdknh6az19821n5qvpcxvlr1wr4qz0wrghah8h6zjggg";source="0y5r6vzzvi7my8qs90kg8pvb267z6ly3nf4ski14yxa2fgr6ab1l";}; +proofread-61719={run="0gnn7zkzrszglcqcwz8c4i13apildg7s93rkp1z3h5m2gr9w9v42";doc="05g3k77vczdqk19gigs9b6w8rccvcr0d382ysqn0yg6cgd70bi43";source="1mggrm4cfji364ylra3ffdhwbx6phcxwfzw2mwls00msk7jdzpsg";}; +prooftrees-67399={run="0sk49q7vavqlcn6rgpzzjjwldss4rlqkvds78jyfm79ky9vdgiz0";doc="0jajcbq3mv8lmixygc7i4nhwiywq5qp9w8hbiqxi16kpqql37n52";}; +properties-15878={run="1pxl101mc318ivzszyycwb79rqghx4x8xr9fvq216ambs7gq4sji";doc="1arkdafwmhg0hm11as4mb75pjz2mnah1l5msy5xnlk4asbwfc4sb";}; +proposal-40538={run="1y5i7xl1z706fcv82s5dyx1ksfvp9dq2m0shwy3an2r94qszcwmg";doc="1haa55hhz11j9m3lxp84yzlpyalrc3hlb7wxvmngqhn2j2mi0b3c";source="1n3z0rvhnc76grih3jy5h5ax7rffxjwmafd92fnp10jinr9riapx";}; +prosper-33033={run="1vsjb2r4xnlwwdjbnkpvl42c86rkzs2imsq762n2w6x41i591ics";doc="1f5w1vb4d7z990mz6iicjakqhszcwirphwv966c66j2jc3yvalfn";}; +protex-41633={run="0i3dvmvyxfwjrp6fy5bl1kx2c9vapj19vs97jg3rkfrkdbk0mhdc";doc="0wpkhhp2asi3761nvl5gp53j3vr4iakfy4rhciv5l1z4gw7d4j29";}; +protocol-25562={run="0kv4ndgdfmwah88sspp4maca6z1l39fg41bf803kapp34nfxqggr";doc="0mz77awxgv9jk97xnl16rs34b1zdqldfi3m2qgdi9y3synrn25x7";source="0q0vxm79xpxkgr7yf12mqkpj69b75smyr9kl5jw2c1j1wqxzxh16";}; +prtec-51919={run="09izjx2g6gyckmgzrvg9bzlwz1yvwr0nc40s6wsbb898wa6cswxx";doc="1cv2knhl8xrsyzcywypr6dqgdxqss0r9mxl6wv4clpzpsyvmfzbg";}; +przechlewski-book-23552={run="0qn5agid0s57a8bdlha8y9m99xpcvlqknq473r6995qkdsrrdxl6";doc="1bp9yqs9y28nbzwb183yf8h5862pm3iw1jsi8c6qzhsrcwr2b2jn";}; +ps2eps-62856={run="08zr0qc8p22wr40vgwd9idp75x6cwbb3acnqcqafh73a66vdvbzn";doc="1jmygd0cbja55sdfynfqr73f54lg3vkmc9hylyw0zj1sdw20wmz5";}; +ps2pk-66186={doc="14xq9x5rf15ibzr41cm5rm4v3rpmj50rfsqp4zzvyhmpmyw4dsx3";}; +psbao-55013={run="0il4qhmc00ny1syfhid0mvmcz42sqp58zi8gf5hm6p3dsf5jy0z9";doc="0zrmprbhrbj3m0q0swlnk581ka3mws13dsha60izi7bfqxc6crqc";}; +pseudo-66638={run="0h59v2akfr00vax3hr90ph8p7znbi0n0lnzl99f65pg3k46xpgg6";doc="165i1gg6pfg1bcwxqlg2nx2crn8vblnqm0zxb9kl6jd820wjd9ix";}; +pseudocode-54080={run="0x2p2bq7cqajrn8s03dgikxg2nb94hk7mzmi7l911xdgdprlg6qb";doc="1qzvdp0qmmlljahg6hqn7c67sszvjvp3v8zvg7nwam58by39l3k1";}; +psfrag-15878={run="0m5dlnjf7gmikg4nyxzzfz999gphkg41qm2sksq9ly2rspbdcs8s";doc="135c7sr4i8617vwr4nnz8vcy5qv8icr0r0cmqsj6r1hpkm67zqhk";source="0d68rzpxax5n0da8sg1nh50li7rc0m7syz0kvpsgzqbdp1clbcjn";}; +psfrag-italian-15878={doc="0ssx8rw7fwln02zzscywivnhizgrb6w05awscvv9gf9n1qj6avsf";}; +psfragx-26243={run="1kb769ai57d7zg3bp0r0mspz0a2l87qiyg04a87iqk7vxrwv0bd7";doc="110n7a7jgfmzps5ng4gibxigmm3dpkqlz6jpbnphrw1pnlskwjsv";source="180yrq0rnsb9cd8j70jym06k543q211fzzswzg0dq8fzn3hk2wwh";}; +psgo-15878={run="18h614dasdg19jnwwl5swih2dxp4wis66fkscq8jjmpvjnckpck2";doc="0naza2kxcgm9wdcyibs36qnwwgwpsbj2m9qkk3l9d54kml3wiznp";}; +psizzl-69742={run="0pzbip08246id09mm0chi0gjjgdc7yzj0bd7q8qh5yfdbhjn8yc8";doc="03slfkyrb0pil00n55n6yp5vxxxl8adjbxxmg1c2zl261lci107v";source="1h2hrjxc3ck75cigh82rmi3558dmpliwxzzsaabb178bh76m2n3a";}; +pslatex-67469={run="1wfk27qb4x8aafph0lgnkq3bkz5fy4cmaiivd924mk92l1wfg6dp";source="11gykawqw4fi453s1bp2r0pfm0az2k8gr3rcrygzfqqzgrhxvi8f";}; +psnfss-54694={run="0ng5pkk6m2l8yqd58wggbakbs4hp4400r4ihyi9akf8j4kmq2s5y";doc="0vfv9x1qsivwi6c6hi23vw0jcjz9dclx0vxnifslyzlrh7592dzc";source="0cqpzra8jwdn9d6w4mhmfrfw2zia2nbpyxjfrcz8m1disd10lhsf";}; +pspicture-15878={run="0i41lg0nw9xya0gfiwjd3xgbk0w723g90gnsvnfg764s2dl371b8";doc="1p27zx0svlcm4p12xjq35g2lgj1j485c3x363gciqb4aswmlsl65";source="1f8lhyhfcywn5y78354r37bgalyq57bm1fill5vzny3l7cyqxxn4";}; +pst-2dplot-15878={run="00y967mflrd0y38mqyv8r7h489jrl38rgaiq871wf9k3cbmf0f1g";doc="0j1c2kxc63nf33gi1f146pa6hw7fm5x9h4yc30dqg8hsd2v0bni6";}; +pst-3d-17257={run="0mh6xbrvwxx7nxp4yqm71hhpqjb41g4kinxkj2vmspw9wrwclbj4";doc="1dp9l6vwhb306j998hydb07c6ig10ibn7h0wwiaisgabn0s69xqh";source="0m9lvgmjzzc2lmp63vnly30j9886qabgbhqwpbbyl035cy6k684n";}; +pst-3dplot-68727={run="0pdzz4gqvq0h0d13f6464ldz78x4gzn24bxb76lcjj73xpjsxir4";doc="0agrpqkm3zs497b4rrday4cbxy0l1l3rqpiindx7v57fzqh0i34w";}; +pst-abspos-15878={run="0pjh72cjpim4v0ri92b7nbjdmilpfa7d49vsvhfqddq68k02m0yc";doc="1nwjynxlpxgqld6slhhrzlsalp9296nbnj2kzr6a9c9b4sjxxbp1";source="1p9i5bg4jx8s6bb6ilbaa702l2mn911g09pjdmk6mnb405d908fy";}; +pst-am-19591={run="1vk1dpvm5bcnxc6k7kpqq5xb6a227bwhlrwd6mdbdapk58jh876f";doc="10acmb6wm7z9bpgh76hlsjks9v2rzp0qqbcklrjx3iw0jqdk53vf";source="06xvv8fh818ldzqccf911hw4wr6nyzxdmghynlsg4hjn54ff3x0l";}; +pst-antiprism-46643={run="1b8yxfyc4cac5992a3cc4xkj0ip35z63rqxdw2jx748qs7c3gyxf";doc="0d4v65fsk28hyiljr6fpk6yw7sac7n9jmx4bmdfgpkagspb7ygpf";}; +pst-arrow-61069={run="1x1b083p4k1qz178zr06rfjirn7l2sh37qxyjd8n5z849cp17rqc";doc="0643rfi4b4jhmzs0zy6pkrf36m9zc4dilp33mx3lis2yrra3if9d";}; +pst-asr-22138={run="0sk8hchv1p7vrpyjslpc45mhjg7l2r66mlmmvhc0s89q1khm08rf";doc="1a6d4g9gqjslnfr8fp0dpw72pp7c14qzq5l5i80kv36w5axks7pd";}; +pst-bar-64331={run="0w3h9xpikkl4ilvgp398m78f7k5b0j0w8z1zsmv57mkwf8fisk6x";doc="0v7cqj05haz0gfjrvy0ppcfphwizxavznbqakkr7b51krh2c9grv";}; +pst-barcode-64182={run="0lmdhzcfqg3cxjpj0f80r8dfd2qp0nq125rgxf5d1rjp1xl82psc";doc="1mm04sndnrqcm1z5axhydyfvnd2i49hz55gnrs17v022y2vfwwml";}; +pst-bezier-41981={run="13w3hqzfim53nrh5bn82fb4gxx32gfayiaqjk5dx49xc4l3rvq6z";doc="0xjs89hfkf7ak8izf59sl5gh5lawv04nxlajn7sskh187qwbqkgw";}; +pst-blur-15878={run="09fl784hqyvbvs2w9ymd4rda1dfykc1l8g5dpac00da1788ypzim";doc="1x881z1z4ra5bcms1yn2p7svs82h5ckwwvlw30jfdwxp4bgs5y28";source="17f9k4vqqk6mrh3dny6qfhb6b45g6sg7w50i3c7d9k0djz2wi5jk";}; +pst-bspline-40685={run="05ys29amaikrm31avlz0kcra9j48nwvqwr5fwl75ljydjf6drdaw";doc="1czq6932fmx76c82ylrbh92qs2nnipll8piah0c7f35xl9y5xgls";}; +pst-calculate-49817={run="1knbqbysc6f3csy1y2vf413cw2jpf722l0hhs20yzm8mi8x279yw";doc="1jyxfqc18whihn8jkp041bvpp1b4f7jwi2zdj8abnmx45d16i6jc";}; +pst-calendar-60480={run="13f9hgbldy8cn7si1p52lcv58d6c8slsly5k6ykm4c7vh3461ckk";doc="0zly3qhwv20da2g3asbpmgjps7zjidd3hclq6znpyh58a5cdbiyf";}; +pst-cie-60959={run="0rqn44hmz4gdi0n1pcb4gq7yv1mg9r8gzfqbz8za76jpsbkybi28";doc="19fib4p6zcgrkbml49vwd833lxj1a0brw9wabqlsj0jnh9g5gk78";}; +pst-circ-60464={run="12hsni412nfjk0b5blbi7slc4pa0c1lnkkbrdhkd84yqm12gwf0s";doc="1p21a1qwn8zhx8nqzr2brxq53xh2scmr7gb8jcdfjgw8rx998s5x";}; +pst-coil-62977={run="019hda59xplvwvc2jrk6zjlvx26y2m8l7j42sr8w6ydgs49y1m7x";doc="1rlp43hi4fs3gkfaic8r49774g7rgg97mkyxzqmi8qak8fz1v3v8";}; +pst-contourplot-48230={run="1cav44hw38rnyi1yjj5z0yqw2ilbrq328xrj4fdipkfd0km0bf1i";doc="15p3znj8z0s3d336ib264c3w0m200igsq1aq2bbcj92v43rzffrz";}; +pst-cox-15878={run="07662sjbviwbplb7mjvvb18v8lf67v997hn78q6gz262z41daf3n";doc="0iwvk4db5girx2fn6fhgx6irx288jw2jnd28j4zh8x3f5hf3xfg9";}; +pst-dart-60476={run="0q1ck6pz7f84mcv6hrjh82h1hpy7f8l08810iwmp9551djf4pz7z";doc="1ccwpmicgsv3lpg2kgbgmvy0mwyjcn6gvwrhmzlxhabxxaafrvp6";}; +pst-dbicons-17556={run="1mq523ngyxlds1jaq1cnwkp6hynlz72imc1sh1f2fch0v91a3kc1";doc="0j4p340dxlyj53s18xqp81cqwy6awpnw6k4q68yk4zx915v24l0p";source="1c071qx2ira6hd9mkh07k4kaqhy0a3cbhr6k1b4wkmlfswjynppd";}; +pst-diffraction-62977={run="0ccy05jagh7kpra07bai1j8drwn2701qdfgki925mcifsa74r3y4";doc="12xx19vaygrby5475la4nzygcbf6cf1mq3g14sxyhg997x9q4ha9";source="0wf4kpdn7vyaf9cy7dq6qf3lq37fgkcg91njfbqy9n9v8k87fv1x";}; +pst-electricfield-29803={run="0kk0jjlcfyvz5dws08wnm3qlhvgifrby88idssjhgvqgg8zpz3yq";doc="0zx7x15p6vxj1f9v8id7ba49878xjmbqzh762v1sy1bxygj9yb21";source="0n1rxq6jx331b0qlnpjy7mh84m9vdlrs8ckr2b3slwcwp63cs0sz";}; +pst-eps-15878={run="14grlhaxxhwmpw3xi3xv7n3bq3zx3qwd9rh707wfgz87iaj7jzvw";doc="0dz6543q5g4wsqcwcwablr7w7w5l6dk19m9qpgrhb1w8sg7hgc31";source="1cn9yl1prwzjvxwgyzs5jdywyirg9hy8g76cnl62gkk9ndmcpryq";}; +pst-eucl-66924={run="0fr742cx9fcllwzmh4w9690h2yq2ch6zkf8m39iksdsfx82x6sah";doc="0jxn56qsma852nvb3m9qipxyhl39r3wslwwbiggax0jwqzrnbbia";}; +pst-eucl-translation-bg-19296={doc="06c9ajnfl01sl81z5r8a5lzmaygq9rdmgym2v40y7xp7z033gwwv";}; +pst-exa-45289={run="1s94fbqpgv58zks5jfq3dbzhpw4p3gchhm32498m6bsp52kzzl7w";doc="1m7gwxbhnii3s7aqi8v09sq49010yasx6k4p7bx43rhir08v1zjv";}; +pst-feyn-48781={run="0qi5zll29rfc7jkmz4hs0y22if5qjn13whaf7a62rdfvbdp1l87x";doc="184d371rhqn549a9vgvdh92ikzphmdsbskny0dnh0pcgxzwdabzz";}; +pst-fill-60671={run="0h748amhh9mhpg1m3l5maq75k22jhk2xnml0ncm2dl2fay06mlin";doc="0p3c86vmlx8h504vb603yg321dcf1lwfyfvlc7qmlzmh1c2flqvl";}; +pst-fit-45109={run="1sqdysxpzdlaph42725hvdgy672mzdmhz7scizb0jr5wnq3rn9x6";doc="0lvvy353s1py998a7vr01pgvkl29qp60w2gyrxxwjig7j7ihn5lw";}; +pst-flags-65501={run="0p89whiwccbsx15jv7krji6fz8br7d4k3ag788dv2cyjids8v25g";doc="082hffz14vjvrz3pgc6pb4xj8ljyj1igvwlk9q1gw48sd0rgrib0";}; +pst-fr3d-15878={run="1m0zz9bqdqw1hzwp06s4hma68wwm5mmswrp9jj3xc9r5xjyq7fk8";doc="1gpijw1iv0pg30kws1vclsy5yjd7rk0j3qspcjlmkj1bhq3fjrgh";source="1zvssd11fg4hf53rz4c6imsgi77kfcc7l9hh0ni8jnznlgmdjkf9";}; +pst-fractal-64714={run="142i9wf39v31wzvalh41v5bjf1l91x6kib1rpk6fqyhfxx44ibn0";doc="0hkvmraf88w54kgqax7q6lg9zmcliqczyrw4prlivgjkmshy64nx";}; +pst-fun-17909={run="1r1zvnyg5m16fifi5xbzn5iypr4n4d9vbnqi42h6a4m4y1wb3qdh";doc="1gb9rz3kz13xzflr7r00dalqri10lbn830v3xcpmb4n29a2bf0qv";source="07kpm9irvp7dn0hd1wh08p7lfbgn78jj63yqzzxn1jb4wrb4qkx3";}; +pst-func-66845={run="05c7166sms46md8nzkm9gzp5s373vqgpkr7c146ywxanix66b0cb";doc="0wlikp18sc8lq2jn7zxh619r2d54p425a5k0cgm669apz7c0vws2";}; +pst-gantt-35832={run="1hkrmdwg7kc4xiif4fvhjwbj2ryxlrbyqb7h2n3rk2jmmky4hv7p";doc="1fqkwzsliv1mg3lyidgcsy652l5d2qy7x1rjix9swvk4vblx4fjs";}; +pst-geo-60387={run="09br33z2vdr2dlsfyqf8rya3qj7bila8r2xwqbc6g96yhn1c3r19";doc="1xxyazg51s4nj8hz8adzv3lvpr2dc1ji0sfm46xr763srwxpjjd8";}; +pst-geometrictools-61430={run="0i80r2n3vsnf4sczqkh9ri4dfb7dfxg9jcyhrrx2az552q1mr33h";doc="1ff7302f5ik2a367c81hgk3d88kkapm1jp5nd2mlybywa2nj5s0f";}; +pst-gr3d-15878={run="10jn2wdc908z2imnpcv03ffm83228fam0cqgmgmcss1774r2nc18";doc="0985ydi7jfsvlynjs5ddjhyhbh11nficfphy6qnvbv0jj367rabq";source="1z981d54aclpbq9ggy28qgnsspgwkavalm0j68pj69jxbcfxrpby";}; +pst-grad-15878={run="0bzq77vj333dsgilfw9k7lslhpmk67id6p1z14aw7nfrhyc80082";doc="03v585i28dc65xrydsp5jj9nd6kfpmhrjkwm3w89dv0p32xyzh11";}; +pst-graphicx-21717={run="1d7zvrnhch7vj1l9xscg4ynj5alml7pb38zwqns403wvcdnmb1an";doc="1mly0nr5yc5rdghy04sarhrwlxiwnndk644s4czf862n92ammh5d";}; +pst-hsb-66739={run="0x0yzrsp6pwr5yk4s9rjkdgmxs5g93gmli5k50g8lwfgcz1kyfky";doc="13z67asnaj83yzn6qa9c6q4313klc1aln84hwsb8qjf3qg6w2556";}; +pst-infixplot-15878={run="133806cabfd6c44b0sdhchcmqjqswy2q2j2ry5kr78dzdna40y23";doc="1cd3i5ishy7pawv3ah6486kb63351p1g2d7iwx9zh5vwywi1ymqm";}; +pst-intersect-33210={run="1wbipiav79g5cal64bny5ba872rr4848i32w64bhrl7awsddyq0f";doc="1y45r9pdddh4pbb3bfp6mzss7whapf4bv7zbkrx7wmyjaal73s5y";source="09pbicmzmx0nraf5s8b19grra8p2vvdl903kc582dwn7xvqrk3rn";}; +pst-jtree-20946={run="0082prldszninnbksndf6y5mklvp4zgdyk31v78axp5fl3mq437n";doc="1hgy8iavrhzw6w8r0avf3h9x52fdl3lqshf6mxqpffaq1b0s6xqc";}; +pst-knot-16033={run="1m1bzq66jan3miyp6r9j1pkk7mim9xjn28ldd1nni06v65hdcz48";doc="0gfxyryyf75p89y2l1ar5yfy5c6qawbz503bnpnw7n575rhsz36d";}; +pst-labo-67147={run="0wyvxb8xs4qvibgz2nz9fayp9fv6r2jlqxrr7svr43gnzjdsq28m";doc="1ayqgrs4y8cpws9bla26s7b82xg04p4f1y86p1gcl5f6816whq4g";}; +pst-layout-29803={run="0199jrw7b58x6qby4k48n8sd2rffxlkhrp334q2dmalqsi701l89";doc="1346ww24d9c64h03zgz7m7xdsnvkjy27cq4nbjn56bqcrl88982d";}; +pst-lens-15878={run="0220idbrzzslcmlyxxzj52mj9iai0p2ya10ykgkssyd8nfbl2jin";doc="02hbbhdnaz6cc5zkp2zmm92kbk0ppzwljivr1grx4g0jqqw8c2h4";source="1pwn8wx5w65xdz46qf5mzjkg74q296bkmzwsxw2aml406iksy890";}; +pst-light3d-15878={run="0glqibq1h8ynfkgn9r2p0yvgplydsigg5chj5gl2vq2hsb38sqg3";doc="1njiml3v4vb7jxpnai69b08pdikasjk30g3xp31vixqrzr56i4am";source="0rrgfxsbvfbyc1g1xsakmiiy7f8skmv2bkgq6vbji9y1f5s3b4zl";}; +pst-lsystem-49556={run="02m2g6kjs8fxifsdxld6ivjxch7vj137828xpax8s7abr9f4dyiq";doc="1apcp1ms40xhypxr4fq6xrh91ff15gplzllh3zs5b1w153xq3w8l";}; +pst-magneticfield-69493={run="0zpzn1ci4bkisy4v5mng3ywl0601ppfmky8il3ji1fw3l6g6i183";doc="0pbhh33238l79zk2fz2a87yhxk8ax81kgk2xh60rdq5vb8md3z0k";}; +pst-marble-50925={run="0d7xlygws5f1hipyc2ba7spr2y8h3rprigbrryny3mw2ycdh1yqv";doc="18jzc9fpjcrhya1knqsxxmaix8sglfbcsiszxc949pf4zdpm50ym";}; +pst-math-67535={run="070vvvcynfaa7mmfmqkkn7va3jvpmwxphm2w8j4k74indii282ry";doc="1w5rhcaggrjn9hmkx4h2h31470fpj8d3v3gk4w8ph35zhds5vl9c";}; +pst-mirror-60506={run="06qvndipn0i69b5jk8fxhp465sqjz79vlwr0j01ria3m91vygyqc";doc="0bfzs55sj49y3lznll477bag80yf06pcv0hh0xfg3zzvhmpcpiky";}; +pst-moire-60411={run="16zhb6gqrpdn56cggm80q67yp175dkbvyj5iy6zr5bxwj6qj8px3";doc="05g9hsxfcm5yl6afrlpba7hc7hd1kr0k00m9zj0jcqp1ggsqnb6a";}; +pst-node-61838={run="0a8bijpghvf5zx9zsd5m4bcwzl526f4r9vqa4dbqdxww0zxwk6gr";doc="0w0wr8xc237qjsz14yf4aq56d6jm8a4gmzp790rsphqaavab677a";}; +pst-ob3d-54514={run="0pglxl2prdi347qqrjpyk6hr3arhfc4rrcz1mnyz7q5jyamlskp5";doc="0s0jyb1s21pkmdnz4wdz793lbvidl9qdfh9cfqa0bwx9mmjvhpnb";source="0v9kih4gxk7aqwynihipm1595iswwkv5y6qj262aikhr6bz8v0sa";}; +pst-ode-69296={run="1ga14sfia3w8pr8shxwf5231l0s2wd91yzn8lqvb6k9i5g5qcc5r";doc="15pyk4ahpccaxkwrg2kygnlsxryw7x9y74d0hgq234618jdc9fib";}; +pst-optexp-62977={run="194g5i604i33bvnprfyjab50smag094lv4gx2skd2h16zfzmg9lg";doc="1dgcb3fax1n15hz15fr0pzihyn3yyzvidw6nacysc4qxq2l6b56d";source="1cw69vk791rr15dc3z6ivv5lbcziab0bwiar8cr767fpm0w4rrfb";}; +pst-optic-67052={run="0f3ml0lw1yl9c9hvvx648m0psq9xd912z325mj2a5vqih5vxssyz";doc="1wznc3x2cmysbj67dc6pd8rxjp9hdh7gpkjxmq1vdc2n85vgznv9";}; +pst-osci-68781={run="1frp9pmwngklkwyicr04aph29ljjpgcgagnk5r6dxb0c8bp3209k";doc="1669300lfawksl65nx7x7g3kzzhf8qpj08isxcba40ac6lwkfkp8";}; +pst-ovl-54963={run="0p4yyrvagfjamwd1f81qyfhz6wwjpqi6nfazyl8ml1fd7qjv1g18";doc="0pqh9sz0l0j0bzvsva6kba6gm7cssy36i17px2zrr3lc9k6yajf4";}; +pst-pad-15878={run="09z2dkb2h8hmf46b0h1b235d1yjv42dgx55pj5s4dbpxzgam7ljz";doc="1c597riwdggb0fli4w4ay2iwkqhaiwxy3mcl9diz8lijy0h4fpk8";source="0b2w0pgp8njbndx6x3hq0rwxsr1gwf848l6gk3vrkksq419j2506";}; +pst-pdf-56622={run="1klgwqpc3m5k5ciiqb070h48r9mp4hmssp4s82k79n6kq45ar33m";doc="06b1kpazsfn7gv2npfrnrmxlky5mhw6dfyzip2lwd243m08jdagq";source="04b0kpxmzi42116pxmkdjl87bm6j22wr62w7bka9qww2ifj18na8";}; +pst-pdgr-45875={run="0k7i88srnysbkk62mr3w0fgv3dz8hlz96nlxbrfm4arhxs6ah2pb";doc="08lj4bd028bzwi25j21h98ma5zw72hiarpcn0nbxwhbbqz865q2m";source="0q2cadndr14x2sjjdsc07xizrb9cv8i5q8w14lrwr4xkamagav19";}; +pst-perspective-39585={run="0g88w41dpz9607g286ahba11af2a1x9zya4saxhjd75j9il0h4k7";doc="04gim8i8fmy3ysyl1y237cn0xfdsiii2pwkl6y79abz1gscn0pfj";}; +pst-platon-16538={run="1crl7q5r89vl99jj5f6ki8vnz5f5i15x631ra811033xmi32z4yh";doc="08d0g6mwkqrc81g5dhk016bi2dvr3jz389f32kx89w6n11iw5pqr";source="1c4pmwrfk9yxg8jshhy5y4bwvlwwm6xn39lgr3xdvsl9bn5pfz2b";}; +pst-plot-65346={run="1xq4l3psjh3vb5ilhjwrwyjil0i4bdy4pc0k0kqkpbab76p9i0wi";doc="1h016y4gfy9kpd33ahwlqvi93c3z5gsxg1b2jayiazzd6fi376gb";}; +pst-poker-65818={run="1h7piafybws9clj0gn4cbsm5z9gxcmcv07xswx1njfkl319yj0hi";doc="05gbabajcli6p3k5m4hkq2dxl6lf8wij96dczxalisrr3p9ddkhr";}; +pst-poly-35062={run="168ydw08wgqsy642w7nf8nyzlmxccpcbdvyc5h8vqc6i8xwrlzyz";doc="0ls2nf4h4p1dc00mmplc73bv5vanddvxkmxv5kix9b471xx0y696";}; +pst-pulley-62977={run="12w7rcb0z564xlf17258dx1q290i3p79bv4vhqpq5pp3wxf46c5p";doc="1x3c2n8js6kvnmdrhnm5ng6amkwxmdlbnz4wsh807q5agqmq8q6k";}; +pst-qtree-15878={run="1bv3xxysk2jw5n41i0c0zm2kx2r6qpyfqmpaf6dqzm08rn7ax1lw";doc="1kkcrdm930lr128ffzcqd3qvh11mrikiar3kqszzscpyfkhi8vc1";}; +pst-rputover-44724={run="0ahx2fjnwgamdb4r6v6q3bg72xpgvpfan3ivvbi0gvvnah98l4zv";doc="18gaman0znqzxdqw0r2czb30l18wh5740skvsclvn28b5wfa0i2k";}; +pst-rubans-23464={run="09lmil6ishwjaybj5nqabxm20xwx8nw1l9dj9bbjxg42h1wz26mi";doc="0l6w0hssg5qmi93inh3n7wk7hps44l8w5xvj4x4rblh3fdlrrb26";source="0phh3kkxrr74y6fim8ak28sdxd5fn11c1nyn3pksd7ddq0qy5gva";}; +pst-shell-56070={run="1j97kcw8w52q1ispkpbwblxza7q8v25288pzxkyc4yf7802a3zj1";doc="1i5dbbnzadhc47mg7bdv6vas7ynkx2c4qpz0khcvrz393kszjkdm";source="0rc6j6cy5kwh9sq2gp5scxpb58ycjqdycnmnqpy67xha62fnhcsp";}; +pst-sigsys-21667={run="1v3yz2vhazp04xjd0bp4pyyiz0v4yq7hbr9mq0m2s8pg3hisfbwr";doc="08m72w1jxrafcbr19fp0yvii9aama1rfl9czys6gr3sii9ks6qxa";}; +pst-slpe-24391={run="18f99ravk128r2cg84yxv3cjx2df8fgzq1f054z5g5ig1s5ginws";doc="0g8dhw27n2vf73289y8rah5xakb60cy23993vl3ygz1cgrn356i5";source="1mxninpgycpbakvmc9qc6032mncz890k5ggsfm507jzyfxrdp5lg";}; +pst-solarsystem-69675={run="0wyascz2z4ydqpmgmy23l95b388qp6z4p589dy3f0sz7v5cbjxx1";doc="1z8kbqvi0c0pk3hc85xd03alqwghgnqqn11k5f2wqhgv6vbrif5h";}; +pst-solides3d-68786={run="0miw5r3sp58x5q9rdcaa2qp7kvsv6f8pnkjklljm8gy171ddvvav";doc="09ymz8vb5hinmcnnc8x92qkaq6zjhy3gyj0m5rgljrs15ks38vx4";}; +pst-soroban-15878={run="0fygllzq9gp37nkffgk3am2vygl5d5dwyr4avf1gvh0s698jj8by";doc="16a1w9ci7ivqf30hvr23fv6j6clqjb4y7nmjgcbfz20xzxk3aa1c";source="1h6srvvl3s1prswlj608y7pj5l4zzn13yqrhdv41956ikd1wbb14";}; +pst-spectra-15878={run="0nd87bnxf8giakadg457p10idbnn0m982l0pgyx23495qfxywax5";doc="1y40d08nwnpkmrm0jdj69drpip1gwkd8n9hqmairl1wccs6r6dhk";}; +pst-spinner-66115={run="1nkmvjy19cpxqs3ii3djmrr6yj8naf54a97jbprs37afml3zql2d";doc="1sff7bhnxjj7cmixl9qbfvglya79187gx28swxr7mby9ybf941j0";}; +pst-stru-38613={run="16i39r6vivs0z1l5l48c3vky9bac22n5k7gddfj7vlllfg6llgzs";doc="1cl5sq39pfvwhww488kq0cgnlihf63jkhqdd4rciaa8vf55mc6wm";}; +pst-support-15878={doc="1470n03zanpw35dnfzyjqm7d5lgddrimypz28x0zsk9nqpamnqnv";}; +pst-text-49542={run="1s0dqi2mpzlk8069piv4z7jg370navi4r5z8aysy9vx8n0vm27zf";doc="0ia6h49lfi9394sfr29wmafbhvgdm5zj7q13zll4d1agakn48j27";}; +pst-thick-16369={run="107cprs3hg9jmkdq00w9wc6bbkqmrdi91zm7bjhih461jmqax88c";doc="1irf2v4yg0w5v40m2przdcbhr51qjcrbj0s0i53rq4w4v3gl03hm";source="1qwxccyqzhl6mikl6jp9s2asz1aj96l86yq9s8nfacjg14vk5n4c";}; +pst-tools-60621={run="1ip2cm5wa8m9b7mb44lphkdjbqascchw8c1s7yxd5zc81xnapjwk";doc="1c5z1jxs720aczn7mjn9lz8kw37k32qrngaa9d8338ls2q47g88p";}; +pst-tree-60421={run="1hvjna16bncizkja6hac8q4snirlrkm0c5ybi9c8b8zjb4i6gynd";doc="1fp2wx2xwhrmimq5axmpswnw62f39q4rqqi8zxklhkr75ccnxrfp";}; +pst-turtle-52261={run="1b5948sqlh4yaf4j3id2zq9r43v6s3azhbjkww7vmxc53rfcqfpa";doc="1wfka7rwysdd4pyb4nhp1fy4f1lnqg32l6rjmqfd17fzpkmb3035";}; +pst-tvz-23451={run="0ly1mqlv7fx1xjivacx5dwwb1fjhqfplps9n0wzypvbwyd4nbaia";doc="18pcvx7rlvad0a6hp0q8sq5pf1y1rfydyqd11bqn94d56nqw6api";source="00i2akla1ibrk6hc0rby5q9n3ji4zlrs52d77y9iyazj0v3fab5i";}; +pst-uml-15878={run="06bll6q06szfsaib7jf09915qvz0rzf0gp5c9crwb139gbpzvxwq";doc="1c0pna78alfhi8i7bqr9zwcxx7sksi3idin5wyqa9dr95a2pwd80";source="0q5x7m84qdv8sy7x2nqfbhwp1lryr5vkji4hf74a0ialc617nfvd";}; +pst-vectorian-60488={run="0q4yzrn6rk488awv2g7qlba08w6807p12dlk1pydp42sba3a3sll";doc="0wws88bwd9zmlhqv4xw6v31cl5dj64hzvqgw944gpjcgxpz19215";}; +pst-vehicle-61438={run="0a8809rs553n79zvpi8vcg92lly643n1ss53pfkvk2jki5nszzwl";doc="0adwpcxnmn8nabc2nsw1d5rj6p0rxhdidcpyhmkdw0rxf17604s2";}; +pst-venn-49316={run="1i9frqc6b4wg3pb0ks4v0xxsfzs348ddhncr31mhfs39nbj6029d";doc="1y2pz45hlm2gd1lvj8p40ldnl04pzccgbsa3asnbpcifkx3gj4s7";}; +pst-vowel-25228={run="1p1adlrg62jsqzkjkl8avb79w26kkd5jdssmkcsd65dg5qfa9x50";doc="0wyl0mvx2d0zd8q0sdmyrqgr72i2igv0669ajv0gz8miv04vr41k";}; +pst2pdf-56172={run="1rm0frzi52i3irfy5703kw38d3f1grby27nryjpb4ziiw6n5yizb";doc="1sll10kps82b47npv2g2r1l3kkm5y75mp2p2pzqsnxxivgl5kp2l";}; +pstool-46393={run="1g8pmd13f73v8bsrcpf4a6hh00pww6isz00gj8cxnj0xnd4p9xwf";doc="0vwxrcm29w8fiw4mmr5jcxrlc122k4s1wg1sqvmzqypwpvyls59c";}; +pstricks-69674={run="10ihzmpabwnc8y6h391ic8hcijb7nlwcay73z17d11pdy5c0wl3k";doc="0hss51yw2ahaicyv0xdbqyxqqhc74hd2f28pj2sgn6c4yr00v6xw";}; +pstricks-add-66887={run="1h1y2r0y3vypygcczkqi8xpxc0mdcgqm1xfscspqw9ifndx0rwrm";doc="0bd3rwcdmxnazq86c6wwbjkajzd75knja1fc7s3svhn0hxy4jcza";}; +pstricks_calcnotes-34363={doc="00vgcdf73p4143dfjcvs4b5v4phvisv76ink3iiijl6s6f9zbmy3";}; +pstring-42857={run="1f7a26xxxzwfgprhzxq4ay597sln18hjk8cmlzjy342jy45g6dpj";doc="0ngxd95s8lzpsgirgrq4dg0p1dwh4l0gs99nhich12v6l19jd29b";}; +psutils-61719={run="04xwjilc64d5zpbngcsr6c6gvm3857wf2hsyag32v8bk1pjag97f";doc="0hb0bjnk53i2q5wkkcn4rkjbpvyv90d41ynxbgsk8hp2gli8b0zj";}; +ptex-66186={doc="1dk8rvadr1q00bjizj567lzjp5l47pr7miyk0ghkajbiiwbqi0kn";}; +ptex-base-64072={run="1h14n8hj9xh97y2g8fnz7q3vrzmm7nkk1yj9194v0y6kjggf732h";doc="12nxgvrinkd95hiwczd8nykiyldjyvh8sk49m2j8hl9g4g6slkg6";}; +ptex-fontmaps-65953={run="0f6cijbr26jjnba7g5ffyh8pb0aihdfv094yyxhrp2wlf93ca4jg";doc="00lx6cv5sb039k3wzjsq92q9x6a2q6l96khmj6rc0l06xva4j6am";source="046jbs402n7g7dyd1akqwx382rkn9m7cs6qr6nz1cpd7c56kfb9n";tlpkg="02z3c5jkwmrr61b6ivw0dx45jjgg7larkrhjzg4mr2dha2667hmg";}; +ptex-fonts-64330={run="1qp1linlsyyx2v4v5l2vjvynw9gpvd4c1klszamp2fcy1wpkgw49";doc="0iqy6k6x96qqg2c8p9cn58jpkqq8hhnb20852a39whgvcnk8awhp";}; +ptex-manual-68147={doc="0kvq5wx7rz6lz9a5f2fjk1y3l8sbqm10jc80s9irbkhv8rhkg8ar";}; +ptex2pdf-65953={run="0s4b60gc0wg4wgxczzr2h1xlic0rk23a9wvfy76vysqzlsfmh0xl";doc="0ky2zh6a5d6w2aq8k9wg7p3cvp8l4wihfjlz3sir3ggj1rx2x6j4";tlpkg="1rikx19qn1av7hrihjviqi1jgla1ncw3fyv7mjav490813nk92ah";}; +ptext-30171={run="137amhihk598rhaf0qmbahd9spqivzqrmi53y6q3mlzhlrxg0p1r";doc="12crg85znvmpr5yhvr4yr6riw037zwcpwpavp1vb1nnd9zy99ya5";}; +ptlatexcommands-67125={run="0srsgh0a8hzy23xd4a3fa168qx81fixakjpryd3db55ygrvqlvcs";doc="02k3c7nzrsgb86zkhc8mxl06wdalw9cdrp5grm0kaw0q5yzifp9f";source="1wd4k71xrlgdxbix3m2dr5isj0am8skdr1di00bji1vj8fvmdczp";}; +ptolemaicastronomy-50810={run="13zs1n17jsiaavw98g2ggfrmb4pbd48qscqb918shai2ffkpx8lw";doc="1r0c5rixwam85wchqhf405h7mwim88616ycy1i4zv03hby18156a";source="1aacl5pvqww0j2kvk7k5ikn43qhj2pqsxh47kid443g56hclkzwf";}; +ptptex-19440={run="1p3bahmdkxbdgczvx52qhyn2w0wmdzr8061idf0kpbwvl0nkw75p";doc="1ldg6ljwf0iivd0cxb22sld2q2afwfb83ac5r6jxjcfr5ac7dv0q";}; +punk-27388={run="0jywh76pckajz8m9c9li6vvybjwljyzhk7hsn437mswbfdd5f2yz";doc="0lbly72hl8a5996dkjr5ssnzklbshbypxymp4zgdvb0i033pd0r0";}; +punk-latex-27389={run="1wfs3li3h0fv6dmpvfjvf0bhq72iy82gpjbxhp3ssm7sj41y07cf";doc="1agngq3shcszz054gmikza54ny6zki30rsww8mp7h9ab5nmm6wsf";}; +punknova-24649={run="19qc4ypax7jlr0hw7aim6p0afy9a2qz1ifasx9dh5rnqhjf0q5hl";doc="1x432js1hj43nrxg2bvp4wrrmgpi6p44ckrfic1gk7ki8wzcx4s4";}; +purifyeps-29725={run="125dn66xsrnv4acvk2mbwfl26sy42jw7fngm3p8qmzya93sp0vwl";doc="0lzw7ajxkx78v5dhlsddb0ahq6a9975f4mzmsgp23qczmz28878w";}; +puyotikz-57254={run="04s6878wblhz3m7xc7zgqv0ziwx76r22c4sa974ismfqjbdh6xdc";doc="0wikdmv19kj62vc5bd0n2dl91cqg44lwlfs41nw808hnk96a02q3";}; +pwebmac-69027={run="1162s28w7mlmp724a72blvphq21vrzydh5fv5hr38a7dgfi9ydyf";doc="1sbri1kw2hgdgw59ahadbysv481zz79lh67z3mvq6frx566vcb2m";}; +pxbase-66187={run="0nlnlzpbd2dd397lxxg97pgaagfyb00ygrd6dz0v3gkmpwllnkvf";doc="1kjkqsbrsiwzz6szjm2irz6ijy9q5xnjimdhhv52xk0j46hyiphf";}; +pxchfon-68103={run="1n78m5685q0w9k2v0iyxra2cj57gh11wnsifkvb04z956r1xvxik";doc="1jm9f934a360jw3v1yr9ca9a4qyrifqa05x5m1a19klf53rn3ghx";}; +pxcjkcat-63967={run="0pg6rh8yf6mnd047br0rwiyjyzb7g8qknwzx7v9r77rxgpvy4baq";doc="0jfm9ln4k0iwvk1ddxma3yjvfrzkhxv63nn76d6xi8gqj1vm1kl8";}; +pxfonts-15878={run="0vkhx82ywv17rflmq119jxs3ib08rfw6lkjgr3mp9vf6vplgqzki";doc="1afcy7c1n63zi5czbpnajrrgwfp9xdymkgwf5h9865adjbb3lm82";}; +pxgreeks-21838={run="1j93gwgk66k3fwkhraapis7ddj8a4bliqh783psdv1054j5fspqi";doc="1md7q2q0b2lhffjm39cxzxf86rw8759zxwj5sbgavzdhyc70ssli";source="04vdi4wf7lw15v05jqycm66j1iiy6g13qrc1ynrnq0df8b0zfs1g";}; +pxjahyper-66272={run="1hcnwp8m1rjpc987bg7nwam6lbc0wyv7anrw7avf8dfljklvnxbp";doc="05jv160jmxhqwl9rl40yj0y2853r04pxnbhd40zn54jdnqz10aw6";}; +pxjodel-64072={run="0gywpypmv9c6bqyygyz336v7dn6bnx5ibz2p6f38paamk6bqbyf4";doc="16nf7za81mq77irbdqkxw2iwxgi3jpy5vh1fijp67bq3lx0az7is";}; +pxpgfmark-30212={run="0mkcc99fwi8n63fghw3mz2alhgpakc3hqyd40s2fpwisvh15rbbr";doc="16sapygswd6mr0pr04c86jzngw6gdf62bgv2xlrfzfpq7cnjafxb";}; +pxpic-67955={run="0zy1f7584bmmn00nwzl8w17hwrc4c5i798763p81sl784hm2vpw4";doc="0yw22zb82scd1c4n0niyc69n7xhjgadabxgbh7jjkxrjbzp6j18y";source="053yqnrc5xfj2gifnn94lxhawbnlfw3dhlzz3jnn4pvry7vnqhvc";}; +pxrubrica-66298={run="1w74syyn707qwyckizmyh78ycs6ic0mmhliz2wbamz35s1z9l2sd";doc="0cbx00q2bwnrhjwfgwdj4q09ix208037774az77cg6i2qz9xmagb";source="0x592j0vbp8pw0r1wd2mmplksyyl6wnwns8smf0b8s4y3k96n71l";}; +pxtatescale-63967={run="15swkjxfxznb101hvlqcxpplxngfaf0nbpkw7j2fgccyqjs5fhfn";doc="1j6yrpyfhn75qkv03bnwj9i3s4lmsh47sw696y13cflvdmsgs8n6";}; +pxtxalfa-60847={run="0fanfh1gb1fmp7binmhks4l90s6925pki6gwyzlaa7vy7za1l3ck";doc="0jc51zsbqbjnp7zqbbl1cpqjf7rwvsxvfzfzm9wsbkfzd16c9817";}; +pxufont-67573={run="0vvnhghcdlyqhl8244c76wd411cd9cjmjsrhic47rjs9sis1ilci";doc="088a02dfk2n6lgyfri74p2lnbp7mp4vn96qqkby0qjfnj6956hb7";}; +pygmentex-64131={run="1kd9jqmbxhkd7gijghd8wi0q5sxqf5dpf22z96wwr29kvv7jxm64";doc="1ppayblsdpmrd9sxfpf0kqhbsxfd1fgq69g48zj9jzbhncwx0lhp";}; +pyluatex-69372={run="171ahvh5ii2gimcx0a2g0dn7s87a58yff7g2dwbw5hi8vyqksfi5";doc="14sxmfsk3lrzcv0k8rkrq7d5dirxmy58i3km6bkahigk5iryq38p";}; +pynotebook-69990={run="1k0sazzzab5a12lf7dl25f8a2fbqjyz56l0pcjwplki53f9x3isr";doc="117lnmjqnw23j187sdyyxcb6422ilbkxrv3axq66apf1ip4jrp2a";}; +python-60162={run="0brs0hydf9vqwlvxipfrfxqjblazgb8ziy4brp2bi16bnsz59ykm";doc="0x1nfbv7fmyhzhgy6xsndhd9nja8xbip436kg7ygscjxml6gibgh";}; +pythonhighlight-43191={run="1bf3jf05zyggcbz5c6hr06wd8dhf0q5m1i4i7p026s1b7dxxq1qk";doc="0qw1rnyg5pawmp7hd3b0dyjzmbrlxa0hzg7bxnmvrz1akn1cas3q";}; +pythonimmediate-69487={run="0qml1nlmkqq4gj4cmhx2bpy3105wv56r5z4an1dvxkh6xpi8xbz9";doc="184lkbmyfm3rw0zhl79pk62sdnaashihvbhkar1pbnjv5jsl7646";}; +pythontex-59514={run="0hgbhdrzxvkc8szvkq2vi8v4xxn9k05zpa95vrmdlgw76ms33wvi";doc="0pxafbrr7mclvn2zdwirqbfa0b03cm4l4wbcgh1ag75skghmh745";source="03a3qj72hzczf4dz282vqq6w263zk1zhgm69h1rk5ibdyasmv8xh";}; +q-and-a-69164={run="15gmr65sq78id1l8nljgppbv85q3pjswwfgylc2msa7pk7vyiwzp";doc="0c8wbw0ia433sg8j9py7ivd1libjx43ys2fqi14m0m766sfrdigp";}; +qcircuit-48400={run="0vxsppwbmhh03mq9k3zb2hgl3628q4i51dz98j2s73z19693266a";doc="0571vlvpvmpjhjbbrd1ybzckhfy7ymralr017d09kf9p5gk0y677";}; +qcm-63833={run="17pryjm0r6w559lgkf03aws720zsap95azfbixm7p8lr1gy5nwlq";doc="0wx14xsj4sy6xpcs87bji6xfarfhlzqdzgyyx2p8439m6ay3cpx1";source="1gsfa9bby33a5qgi4p2awr91gn8p4d2qylz32xmzhp0x6fpqhig3";}; +qobitree-15878={run="0irdc2w96ad7mkgm6jqwia7lk1x4557fm60l98mc6kpd3a9djzgc";doc="001w9a4kxbrx11298gnvjamx8c6plag1gp5b7x9vq35s25kdy0i8";}; +qpxqtx-45797={run="123dfaqzpl8h5ia08swjmj4h05ncz3ishsh6rbcm5px35ccrgjld";doc="0ng1h0yhclki35v1w08r2di3dvf9rp78r43dfa752zr8agrfd713";}; +qrbill-67724={run="19wl8p36crfgyzad9v20n3j8ad33r7yww9gn3z3yvvggdqpsda0k";doc="14hfgxl7rl026cmbh2cxnj51fslm1zzfnc5pv33gqzd3nzmbs1mr";source="0g3aii3fdjp3ps788b108jj7ggks4ndzhg071jqca0q5xhydnvph";}; +qrcode-36065={run="0vs5sg5hch0c2rxy27yiy1c543l2fnqinr8nvsyr288fja0pfrig";doc="1rmwz89yxlgrypmki8xanqc3xxm10m9zc2shh5r0fzwmsfssri9r";source="115wlgvpxx0vkb9d4gfwbqamk7sfmcfd11hxbfr8khd5hv8asvpi";}; +qsharp-49722={run="1lrnzvlalznyxmkwrn9nh3x2zz74bakiq09dg374js5yni36igf5";doc="091kiiicfinn5cxpfhhb66j3hkmv80gsqd1b66xcz4ghxan43ywk";source="13923qlhbx52x7h3v0iv6y8q0dz8g2ikvfz9m0lh9zwjcwv4mpxy";}; +qstest-15878={run="1xk4vqqics2iwzxck416za70cksx836qrsm4v8idyg9kscvjr1jp";doc="19ddnrz4wjd51h8g0z40db53wh0zlr6m1nfczghc5b26vvcj14y0";source="198xvadvk9fb36kxzv1wpis5qb38dqaxsqva6l7l23kz3sb6k849";}; +qsymbols-15878={run="11jlwr2pwrxck0xcw2szql0rdynjr2pk4jgzlqkpcardibfr385x";doc="078qxbmv1zgg73a923sbfqnwmdwg1qkfxra5r8dzi8wlq1cv29ii";source="01lmlclv9rlkga19mw4ikngdpkxhmhq77kylln8kjhcpa1cylk5c";}; +qtree-15878={run="10a9v90yspc1pq3ja9bzixdq6wxl6q4jxz5na7x9yw9g44z3xaf3";doc="0ja3xpng871h96q220nrlq2iypk2spjs4qr5vpmri89b5nvngf6m";}; +qualitype-54512={run="1r59cbk6rmdy0zhljcfqxksf101rkzib8ll20ak0sshc3f1jj64y";doc="1jxcqd48v11b74drv0lh2gv65aqsjv5zziph2s9g5ldd1733fgl5";}; +quantikz-67206={run="0g7zjkgfw814wn1ddsw2yxvcv5y8ca66cz13hmfa61p4kd8y0x2q";doc="1rla8zwpmvf5wwd6bp74dimm49aa6m8xw6ix0ahcnvx03vs1yibi";}; +quantumarticle-65242={run="01w948cabqlnwyv0n1wzs97hhfknspx2596w79ipjy1aka4w6304";doc="1k2xwacvm6sks0qj1psskcfm002haa734fqysr4cggckwhf6n7wk";}; +quattrocento-64372={run="1jn29sl616p97vf81krg8g94zqsgvw40p1mh664i3sfkglxlag2v";doc="1v63bbn4yd799cy55w7j6isl53ngzngq9jlzi63nd5bmk4lqcq3m";}; +quickreaction-66867={run="1jcqsgvsa886hw3ldf2xx915jll8glfdd7vmc04plgvvvfavghjj";doc="1xgwv5d2wpp5jan4c347kxmjqfa9qk9396vpz1djsa27h0naj4f9";}; +quicktype-42183={run="16qy6rxxkdkkli1knibhbm28jg80l0qjsn9lsb36b7z5xwxj9f21";doc="0ic0lkhj3rdpwfsrysm5qidw0gby11kmfnzbh5k2fpkfarwfhxxb";}; +quiver-67779={run="1nakig6vyj6fmzpxr7xv79wx75f2dq42k5q80fg90krxm65bmbn0";doc="1jbxdisyxla5s8qkn19ayj0iyqdym7n6xlspr0vjmbz0nmh0nxd7";}; +quiz2socrative-52276={run="1s6g0svlkg503r5mqn3iw90qyw5lwpv7dj92yck7ymziv9p59qkz";doc="0v9x0jxrgiscblh8w9wip07di78glgzd0rn2fp1hpzabi8x94dvc";}; +quizztex-68823={run="1yrari2lhzd6rmkqzhng49vmcbglnb8zn1mw5f4a0np4mw5dhmdw";doc="1qii1rajgh8fba2ck8l1p5dzviiji2i4nppivmgllrvs78cnfk60";}; +quotchap-56926={run="1284ldj6pfqq6mz2a62pi81k1jca8xkc6wa1wbrv3kqwfdcc8cwa";doc="1bnhvp91adi4bhzwddzl16qw6d74in94jq2h16lk06aakcwr72hd";source="1g2cfb5j1qjqads2m9ad9a8n0j7ihrvd55q9b56jd141a23layb6";}; +quoting-32818={run="1sghajwgfdc1p0gifii8wz1rvzsiy38f4jpfmh5pys9w6nr9a8bj";doc="0aknicilv5rn3claf77l5br5mr21yg1dhdc1j1yxigz9k8pljzm6";source="1h01p11ahr4ykqnhgl0kwc5i68mw9wznswrxy9ab5rpma1agjkzp";}; +quotmark-15878={run="1v48482b57w6f1cx0b5av9cq26zhgcqkwi8yllnl9p8pnrjngc9x";doc="1jmdv5i67hsbmybjr8j2sv7f7z8bm3a30yy0ycyp6b5c3ycqx04n";source="02bg50nj945gycxf8kb7s9c87xwszprq3zynrxxpzixrxqd06pf3";}; +quran-67791={run="0gp028w9q30wx5vfjvj53b6brrac6wdkybai4fij2kk2vz0ck9lh";doc="12wphp5nz23svjj06s8xdrfghfqqx85hmyqd4rg7kxyky009i6kk";}; +quran-bn-68345={run="0rfg0vi7297gdilra0lg6z40hxp22y3rk3fxw82j0hh5dj0f5gl7";doc="0lk1xjf1n42v5mkg2sr3mykvgrhi9m53gxndifc7pmm8anivfklh";}; +quran-de-54191={run="1a9dqgrdh6vw6zpygslfq9d9z8qws9n614b5adr7pkjcdwm8zsaf";doc="0fq3yd3grj31wyjvac4qkvs38hjjnlsygiihrxw22ddhsa4cl2jv";}; +quran-en-68790={run="193b22vcvbrhy12rjzxzgjhlfiyzp0fq97g2sbna45s7358r4n2b";doc="0jgqpcl84dgf0bc5zlzsbif5nqw5kyhi4ngdd4kcj6z5lpafj6k0";}; +quran-id-68747={run="1pc6hnvi1xdfislik6rq2f121q9r8mjy48prmfj51zv061f367bs";doc="1zsf40xn4xfy8wiyqznsa2y7b2rzffak995yrkllkbcny5q20ilw";}; +quran-ur-68314={run="1l2hsql1q8yhicqxdz3jnhhc9cjlwq4951xsyfz5ayzrcckw83n1";doc="05xcidnphnidr1pa4rhiimqlqnfjqkwx4hsl6ppmpiywws904g3j";}; +qyxf-book-56319={run="08v4n8lc3qcxjzfvwqypnky9zhia7ylwq5f31arxgdf0wq4gyhia";doc="0i6g7v0xdy26rdy1kap0b4pnsz8xjm1h90dwby8y0bqlxjhd509w";}; +r_und_s-15878={run="04icw2n2vz98bk48kbqybb6x3wgzz8fr045133vinybx49nk8xxa";doc="16ksw9wid0sr9gjhjkxk3696fcy19gky3cp9ia6rsfh20f9f2yw2";}; +ragged2e-67441={run="0wvvlhbmj1j4gp66l9p1hq526r3izywyf8ddggj316q2pg4db53d";doc="048f04kd8rzi3cnqwa8gw4cvx2q5k5qpnph2idvkvjy3lw3jr9nj";source="0zj8nphii46xwc4gp6h6l65zz9lx3s0741x9gkz9ghq2x8m7qphz";}; +raleway-42629={run="1d8zv0x1j2c996ql8g7zc38s7fpc61ibk5zdixhj7kbfrz5cbc1b";doc="1i8hja5817kzy894j25hy5cjnw31y4kcahcymx5hrbi0aplhizx0";}; +ran_toks-59515={run="1k31qcvbdfx5xknykv9zlsijgzxcw53amb03avwbqm3kly5d30r4";doc="1jri3cb862m8984awdshlqc9wwcq0hbjw6cf2yqgb9wn186gjfyd";source="04ix834glql0yprygm5s2354q62cwsz39lfk871n8s9mxjd2f1c2";}; +randbild-15878={run="07ix44c2zm185byn868bmm6fcbwq9q37h31brfa4839hpklg41pp";doc="1cpyzrmswxawxk6x2vfjy7y8qj3mjrxgmr9lgjvz11f5fvvdb0i0";source="0yzz5awhhw52zg877nl76410a4q6gy7mrri0hccicj529kk0d1x5";}; +randexam-69965={run="179wji9ss598rx7hsagj76jsm57v9cqladxjc4r690mzvadv1irm";doc="023y72ya8b6vcnkizsnx83d9d3z5y7lgmkbbn6saffj3ln671xdx";}; +random-54723={run="1y4dn1i3kmd99b5br7a2j6ppf0ikzp744si5p6m5rmvg4vh1jh69";doc="1gfcswp2krrfswyjbyhck4pb0lq03jh2mfwzm2iwvd3zlndvccbz";}; +randomlist-45281={run="1kwbg73d8hk4wh69fajl1zqyvkfyfxzyv5xykknpa5s67pxkh9c5";doc="0r8i0ywq21c1h317b3yx5ixr4b1fllgwams4yy5z13alda4wxqdx";source="1s86m5hcncfqkwlr8mwdyh3fsnyzisiw5dlg52r499wr77r5z56j";}; +randomwalk-49513={run="10ivivbyrxm50svqdhv9lm623pvmnifpwpnbhpmx2nvf4crxxbcm";doc="1lvff00h8c2fxyf7if1d2xqkk87lb6396w6mb4yfxwsk0j8j2jhf";source="169x0wy0k91kmfbisqh4ciz8n4knhkxmz2d227gzwbf80sr2a80y";}; +randtext-15878={run="11a4j40zaixjklf4rkzb17cxnfmm6lp9kph3kkp2kalz41qamc0k";doc="1g8nwiz06w4a1sdvdfch5yavar11mj5xpk631n5ym2d5g7hp0dm9";}; +rank-2-roots-68161={run="132sfajpxnl82pz9g76h4xv7fpirqgxrivz2g3mccgvb5ykiv0cd";doc="0y1rva3xz08xkw8s46xxhn6kl58dh1v9i190ffqjd1g2xxix10f2";}; +rbt-mathnotes-61193={run="0mrk5p7h2y1kaaj45fcr56smzi7ny6808k53s5442gf538id9jmb";doc="1ysaqvli3gy777a5g1d7q5brc245qqfr1fhzj0a4dwrj1gcnw4x1";}; +rccol-15878={run="04nw4h7z4k4rnvqh5s602l8h05n85iri3p3cpic4ss71ccn8c2dw";doc="0q3qb0sbhnbqwgc0i9bw27s317rbz05k6pmvhad3m8mvlsbgh285";source="0ss2436k5fbd25cynhw13lq4ns4payl8fi8lc96vi0kvn6jmkwrq";}; +rcs-15878={run="1kri1q5b36d00k1pmpkpa0dmbv7qqprycxzmlmqvp7fx82s5awwk";doc="1x6m7v28p3lslral4wk595clg3kjf2nwk2mi1sva2fl56mny7mzx";source="176fvqs3r8wysrqlqwjdnm0xqgqdyjq7wfwnfb2iv3c3rmpr7ab0";}; +rcs-multi-64967={run="1n60pzx6qrbabksj2aqqf1j4i1b298ldsyjg8z6pmhladq2r3ia2";doc="06lqyy8igbiyl86b8fsl968sv94xcnl1amppyf8hmr52dhdqcysc";source="1pdds0kh3p3rkdn2nrpyfrw224q3rfnahypif8n0aijkcxdlw3w0";}; +rcsinfo-15878={run="04j1sq20960w5yyf37pnzvwaknl8f18mx6rmj2s2vch8bcncdzjh";doc="02zyrgcd0m77xp5p95v63b58mv0h0miqlziagwv1rz3ywvmgwhk7";source="1fgmppgp0n4arrilxmrjn7h7pf5jq7gm6drdz6njq8w1l1qxlxg7";}; +readablecv-67986={run="0z8shn1l3hghkxrmaiyxsv25n9ar59j0nscj1331yf9dwh9cd31d";doc="02zjf16y49lyi9wy3w7k2q1sl3j37k3575nm1hi77bmj4i57rp4z";}; +readarray-60540={run="1hx39j04h7y14qrp75q9f5x3nnii62pvi43ww48nk02glxs9y5kq";doc="1v0f93nhylqs5rz2bxrkfpzlvwajsz6znlyvdnc0gxcbwg330j1q";}; +realboxes-64967={run="0xyp6w8kbycaqmrkkrl8701c7shvd9i16vvgs28cvr61nkv3mv4s";doc="0xd95j7wgv3yzrzq9lvdxpzvvvki2an8kg0zm29yz01m397vmys1";source="0r0phiq8v15ra9a429j63kyjv3w2p96myr8czijfcb9g4920jvmm";}; +realhats-66924={run="0v8pc4b8ls0xyfbji9m7dw728dni8bsggq2pjf9bi2vzmq8825m6";doc="085nfwsfvmbwv7zlfg849ywyqswi011278gmws01sv3q5y6ypfxq";source="0rp15pryn8zyq668pxapwg0imbn76m9fclwh6qd2jj48bqrlsq06";}; +realscripts-56594={run="0ph678nf5k03xl63z66gkmg5f8agxy201y6bvabhdnb1zhvfrfmm";doc="1kmlaym3vxb9mx0jp7wvmsk13i30wyyazhny5zzk14bwx8rk3kf4";source="1qzqr2q2bkq4pchin1xivg8gwx5qkgip4kq74rswfz5a5iimyh0n";}; +realtranspose-56623={run="1m3gmj9bay3a1b7fidjs6rs2077m7csaszz11g6y5i2sjpjyx2aa";doc="08w4ad33pycaaiwhrnmx3sfx2c6kv417ijhqgxdsja1mrhcp0nxw";source="0s4lbg2jg5fa4x8f9cnp5zcb4yi92g4981dwdksqsilcd0in4ksh";}; +rec-thy-63982={run="0pr0k26k66dqaq4rppgqx27f6km6a7r4zk6cj4yjl5l2ac19vvim";doc="0rljkcq2vgppc1lhc8mms0qxbqiq7yxhp19xbshscga86hxd0l5q";}; +recipe-54080={run="1pnyia45nx32r1ng711k2l3g2h4r6n67nfxvg193z4mz1i20hq85";doc="0hhm5l89naj8vzjnvf2ambpawq7scp9bgpfjzszgb6069c486bvp";}; +recipebook-37026={run="0ianmda3ji60acckagmlsmrsvi4sxp3prznvzqkkkvv88w1xbm8n";doc="0fmc59fddgfs4v6lsba04g334xlkhsl1liph7v3yx4qj6l9dxlkp";}; +recipecard-15878={run="195lg2kvww7amwls014s21l2pnyp24c8cfyb3glrxphcvcdhhr6q";doc="1h13vn2zw880gvzi1pc8j41wa21ygja43hrjmyav4zxziiisrnwq";source="0fkwvjxjhaywk61j750a05x0s5fgb96q5n3afcq056yf01jbvsxi";}; +recorder-fingering-68595={run="02wxkvcwh8j3iv6dm9ms3nn09kb8lz97xx0jq7p0w2i95is472bc";doc="0nh52w97xi8p2wgqrpz4svipi8fcam815a340zlsphxsx31c8lg5";}; +rectopma-19980={run="1ivjyfhl4g3j1j0xnq31rcnl66z3xwaixyzs8wwmbf1y18lgzyb9";doc="0gfvsjszqrn2r1cm7blk0xnrnv94l1a7ialwhvf733vm1m699lja";}; +recycle-15878={run="0pj6xvdd30b4y1fa01vmhczinw48d6psfd8iy0rpzpaq89rbjrvq";doc="0sylgv7viy4qgl0krhsf8q1gkxiz91wpn0l5jyq5y1zg92x8jk1b";}; +refcheck-29128={run="0v82jjddvis01n2ngw7yngv4kh2impw77s1yq360sxqjym2m34ng";doc="0ckmd4wnjl0zbyqr5q18whb927sjbz1xgdg1hg5w4ih0g36sra63";}; +refcount-53164={run="1r4lv6yhybqb8wkqyaysimb79kbdgvv393kn7dkjqr46b5w4fzcf";doc="10vn481rkdwv63z4n67gch55w8x44v125kf3v7299j92fm8fdznk";source="1rf8yk9xc1qhiiq30jhvjqmg5773g5d33fpcpih4i9c1l7kad3sy";}; +refenums-44131={run="1dlfd5dx3mqfhn73y04lafcbiprqicv9kfz2ylnd4fhhm62svb7a";doc="03d3p9d1f0pr6gk918qiq7p5p6k0cf1zh209akl6a35042a6nms9";}; +reflectgraphics-40612={run="11kcq0dijnwwxf6d3s0fhk7nfhvn3v36lly2wf21vgsl387dkkaf";doc="0iwcljjlk1741kw6cayrbjhqalv74apppw612gh3nhh242nn9bwi";source="0hy76c57w4lw0v77qaf064j7xz327fprdijljd7myy02idlszbmv";}; +refman-15878={run="1adim1622bngp214hsdzjgjkjcv7b24a6aaqzihlms76vfq0hklj";doc="1jpx3yka29lpssvhjl12h1bxj0k996x7a7rf1742wph6w1n5ymmy";source="134hq9c9kdr7rgzmp5jkjccqgfw10zwv33zmj25b91xljn5afc6w";}; +refstyle-69680={run="1jfnb5vcsdj5wxbl8cpiv0bym8n62pqhqz96vy6hd7cnib85k3c5";doc="077h83hngpdv7bk5cvbw9w351dfkiwbbinalp7xgw2x0p240d9lh";source="0c4ip2pri9y5hziwr3p7xlrv6dnj6g2h7cjnlff77zq1bvyzj70y";}; +regcount-19979={run="19n0gwvh87pb2fanw52rc5j540v9yw10h2r8svczim9sdginy56r";doc="0qnxcyh2vhkylaav056lc2vg24y5h11svzy6hrk6rr3sza9k6z2k";source="1xfk7qs4x302lfi93a1n8nzpsmzmypyb34d8hd7h8y6nm7q2g4y3";}; +regexpatch-58668={run="0i8dfsr32f4w3lfh88z45sdhvwzqgh52xqfqgj53fvynblpz9msw";doc="0qh2g9sdj971a75dv3jfxi3ga3mf6fmb4azphkdgxmm690dblx35";source="1iq45q093v1n421r37w42815yxjb7iby426a48mvgzyc1c82rd37";}; +register-54485={run="0i084dij80m292c9f57hb0y3gs870520l8awl3wb21ss76vs5501";doc="0zi950xii9qbscbv5030aw02arc77c8inwxmzkslcmapdqxq5wr4";source="1jz02c2c5xpinxninb1a2bkgan21gijs48rks4xv17y7k6z9h00v";}; +regstats-66795={run="022l63bc3g31479byh1350fl4wpfw9pq9jbqy3xzhrrl35psvqpm";doc="1l54lb8g97gib5al38k98gnahrpl4sc0kr6wrabagq70cbbpnc50";source="1px681bkciakl41cyblk72v5kh83hyqf7bn3s0hjax9alszk29pa";}; +regulatory-69611={run="0daspgycq6ghpv0kr75ww3axijfy21694pn1alic75fn61nhpxcw";doc="1z6hh4rgkzh01yprsc2a2xshbayy5qfdh7198jwwkbn6kvhcxmf5";}; +reledmac-70207={run="0xxzyrsrk3bq9pjx4iv0bh1k3li0rbwbdz1g3gdyir15kz9dwz3d";doc="10lzmpibqa3l8wh4hhl306ry6wi39a6y0hzzj9xanr9iaz2c2gbr";source="0m29yfjvi4x7klhr4p9rx8f4i8h250gzrwb3iy6ykrx7qhffwgrg";}; +relenc-22050={run="13ym795q37rmxhmr0d8834y272si11f0qh7lmhffrpsf4d3bhf74";doc="1hb2sdm9lgzfkj2kkbrlb3alnfjq4rw3islgdzkqbcgqp9s06f67";source="1gk7nbczw9b897idmsgqx6i8xdmi7wizhb3dyc0hir7qmivaqv6s";}; +relsize-30707={run="06sy6v0jscrj2qs7axm770xv8fkiivvj5lwb8mkf58gd5jwc5bgb";doc="1sgv3x3dky3i7xivh6pzqh3lrqjhb62g0ji0hdgmy9blfrdf3api";}; +reotex-34924={run="113nfw6md0v4522n54q63smd2g2iwm89qsqld237f32r3rdkbcl0";doc="0lapzgfp019a7qihfhf1cp2szwq98j8kmcy80c3gf1fa1x0c3x1q";}; +repeatindex-24305={run="1z4z6bpfjmgn8mkpcl1rsd9m1jxdx6lx2kz83r43d1ks5zjc6wn7";doc="1vcq9vbfw4dwif9q5ki0bq378yd4sg5g2yxr24bjav97shd9iaxk";}; +repere-66998={run="0kjpf1ywcphgmkxsr70mzqlx3mid4af7699hz3fqgs307iswj0di";doc="1fhx74lsy7wsh84p2g9chdqy94vh6sq4wi1rny9pr9cmnfxb09m8";}; +repltext-56433={run="19h9qfzz9idywv1bi4qpl8yqv73lwj6s6aqxqhb8jlh3b2scp4y7";doc="0nhr1lpbb5nvi7mfzrjxfq7ii2kib8klzcsqg99b4pj3hcwhv93v";source="1phbwgyvdm6a616wzvlc24jm40k4hbyjsnim5g5jr15phlsa6r2f";}; +rerunfilecheck-63869={run="0i06ypv9hgdgmsv2idx8bfpi9xfrl1m17ly6cg8a1x0v6ns50fwr";doc="16ryk4k490pxdli58j36bgrbmfi4gfc5jm8y0pnv9fcj07da7wpy";source="17m0dig8vddgga28j5raavq8aysy3kdgzapyrciajj0j90q14sss";}; +rescansync-63856={run="1qdcw7zi965khz3n3xrwg9x84hi58iv8sg9b3dwn36cjdrxvvx83";doc="0szxkc0bpj0in2mlms1m381hhrajvwhp4yk17daihnyyxx6m78i9";}; +resmes-65375={run="1g0gqmx21s3y5h8ll5ymgd2k78mdhw3nrzc3xnpihdvh4gjqg9zv";doc="1qpmlhw6rxc8jmp44349x428f7mrs6dr07l5q20v2qj3xnnicjzx";source="0s5w0cf3a3106v029yndv5hmx5nrdk27dwbw18wb5q8m49gn6pz2";}; +resolsysteme-66192={run="179casx77warx76rzmfa8h2rvb8z77g7dp3scs6kbyc3s8j9x7gj";doc="0q4adkm495rn91aq96baxf365ygaq286cds25wr6hjfg9yj5bhgb";}; +resphilosophica-50935={run="00qqwp5n5a8hpz4zpcmh3avbm0wh2csdwdf450hmqnhpv2hn2z18";doc="1s5r4s8ja16vsz3ssqk0klfm1vfxrxbcj45mlszq5r3k5gsa1y5b";source="0nkxh1yc6nnjlh5bmf9w5k6hzg62f4i7x7nbf2019vlwvqn7r4yp";}; +responsive-69147={run="1ymdbw5gq79i5gd75dcnc484cjgrp7ckh8163a9n8rlghpn0pqqq";doc="1kzw8r28invf2p4xcqfws50w5i38rr7wwzf7jx2x147n8b91zr7v";}; +rest-api-57068={run="04y8xai39hlhj6y78cxq2fqy7fis7mbpwzyk4jmgqd3365738615";doc="1w33inmwr66p81g66zxqiqccks965060034sx8rmjnjfgwqqgcgn";source="06c06pbqa8m58r0lcr2xc6zahf6gjdc1r2zfgs3q1b6czy6rns34";}; +resumecls-54815={run="19cw19c4a3zn5gvsngcxj6xvh2qq5n5am0sdmg9zajy9lqqp5nnf";doc="17z14r8yj33mjjkydzaad1bm5nhvrv5154n5n6snjszd13vgdyh5";source="1mm53893g9nqp3wdks6qa22k4pk71v09rg98nm1i1bz5ppn6kj18";}; +resumemac-15878={run="0nixlk46dpyay8zsxrfkcng23rdyx48mnq8s84xs5whlrg369s3d";doc="1yln2mz6awzafpmrlzi3s12zj9m7qfj4laqgjpy4783rxdxy8w57";}; +returntogrid-48485={run="0cfik8imjgrhgilc7005cgy31h1azjk15jrcvd4vpf3g5ml1hpsg";doc="1plnz793nhiq9y89x7i51bgp9d18kbi0bpwslg982hf65yklmiwr";}; +reverxii-63753={run="140f6n41kdkbg6fivz7rjlc86fvcxv2nizzfb511s21waj3lljdd";doc="0n67pqjal4nv02viyshdznqwd5xzc3s8v3w1zxykrphccic73nlh";source="1asb5s8xvns7l54cdp6gshcirdj0wcwhkl791jxb4c93qmb3pyx1";}; +revquantum-43505={run="00mcqs4zd33larynscqza6p18a8payrgarwbgdsnnvaqf3c2rjnf";doc="1nbs15bl80yl7hrav0awm43q4brdfqm83bpyf2zg00yz5pjm1497";source="0dqxvcd5yinnsal4wydb5ybsldsax18zp016p2yzk212rk61rikd";}; +revtex-67271={run="1l5kvnpz3ravhdlzshhgjw19mwm6jggpsplgmdwzbn6pmwnk0wzw";doc="03pyr8hd55dl40wf50f7vaxkwbqcsmajl9hqaxwq878pgbxb1zmr";source="19ij6z0zal8321q616pk62mcyj12cwb12lw6cgpbqf70g61jgfwl";}; +revtex4-56589={run="1v1km5grdg72mqf7sha1laprwhhwplrklax9mabhg13q4c9k8dlk";doc="1709bsjlka0d8x405fyac8vpmklf92qhw0qgmzvbhynhq4sc85b7";source="031vqkbg38iwi92yhvd5xdmmkbjhrr9lm7ncmlwgizf1y0ib7wpa";}; +revtex4-1-56590={run="13azycwjj9ihirfkcgmjrpvjha4wngmgkm6irh3388zwjs2sh7sj";doc="057yf32dsx1j3b89wl9jqrafvib8p0x6l3w3zk1c98p9vp8c0lm8";source="03dy16s50bkgj2l2zkm3z6mzf9qwhrax7cxll2p0rxxwfgvpgh8a";}; +rgltxdoc-53858={run="10wpra4vdjvjsq8n6iz33mnl69b13jbslp6ccf5b61va4v66z78l";doc="0xsz70p88ij6djhlf7n1718fxqcngfxnyl60h3ia0xi1gjzrbk1c";source="1vzldzdqyiqfaims3a8w378k4bfwxyznmw6028xvwrk7abq1nr4f";}; +ribbonproofs-31137={run="1f7j2v5233fvjzlrlfliy18gy890mlr2n2fbqfhh88f2w3z4nw2b";doc="0gqbakw5jdamy0q4rx8y19xkdnb7v5arpkjmmsxhvv12pk2kb3d3";}; +rit-fonts-67659={run="0gsghvmn1va4idw2p62r0a4vr5pdy67kk75f73xpkhsg4i716w49";doc="047lhzb7h0sq1bwrh0a04ank09apii7rh9cdrx77ngrnrk2fz1a6";}; +rjlparshap-15878={run="1af2a5fmzx1mmk0vprx8w18rqgab0dcm1c7sfvnh7v59lgvkh6rv";doc="1is0ny6a5ndhgl441vrv7ik4i0br90nlcddiabgmshwyn87kiciz";source="19kvfg03r3nr99a9ylk3yr6nnq8r7cvfp3rsi2vi10m19jz60ssl";}; +rlepsf-19082={run="0ycf0md4d2bz8003s0q4xi6qdjspi8z1dp5040cm3qm25p7jsrf4";doc="1asi443gvl34m648ap9j5an6fx5x94s3v4dp8bqvygn615jhd0na";}; +rmathbr-57173={run="1jlafpdjryj0sic2zpn5f90754ydnfbb74x8b3q19klm3n20bsr2";doc="1nfcd9ypyscqv3ghlaljrnj4rm2md5h5k6yl173n15zrr56sxkfd";source="08mzgxkwk6frzgd2hq8fz30dliwrkrk23xmqy9p0qjmq9vi7vbf9";}; +rmpage-54080={run="0y292gcfkj0nk8090iqnlrx9mhvh545im2xms080kz0l1847frpc";doc="0rq7xjizq8nwg9zk60gjd9vcjvxyc0xaldc4304nyihfjxfyd00b";}; +robotarm-63116={run="10xlswn7bkad45fyv9j70pd77319mynldwk530y23lc2874s3yn2";doc="00qwsv5vxidjzkm31v21sbzd6rp1pvz2vrs66gmlm1xbfsv4kd0p";source="18zffnyyhc3mp8xpw7bc52q29z3skqfxg6h6x4b18mi9jpyd2x6q";}; +roboto-64350={run="05ynyzlrnhn7q95ld1midxdccc7kv209p4x53bi2n8rsjmp9sp39";doc="13aqrvxs9vhy8bpm42fx1i47m0q80pc4zm5gh2bllrpgpqn9hbry";}; +robust-externalize-70605={run="0qyx3acc98kwwff531xf0d763zc41x1r716cnf9j3h8mcbm0wvmb";doc="1qgxnwfjfm18ss4lf3lhsvg1yql6mgvcjlzmdyq7nr8cgzp3mkxn";}; +robustcommand-15878={run="1vxsxdg6122psbplm22l7f193fv7rd3dadcg6ys4ngzy957acvig";doc="13d5rsj95yx81bfbansh964dig4hjp5raxagzws58f24l8imvfzn";source="1zgnyglhz8i6hgzxlj19kdw31z9kx44zj2vziwkhcpr9clxl8as8";}; +robustindex-49877={run="1fl9vr5mynjg8w74sk2jh8vgj5yjpmyhyr107iblmcicgwv1sd9y";doc="0xf592xvmh6xmw08zwwcsn9xyadd9637vicnz95fbfpp03p9qjnq";}; +roex-45818={run="06mry55hqrakkc7yb7b174cx45n0frk3isxw96p4v77n9pyvlffk";source="0fwcb1fgz4kxbgcqm34s5glswj43wzg5j56ak5an39lsw0wirs94";}; +rojud-56895={run="1cmpg4w2pqwvr624kc4rv7kvnf45c2ffqrryh0i7kbqgc22xly08";doc="12y4cph62b8rag4dxajpzy7y29kvnb3n0z99s2vcq1hfscyijn12";}; +romanbar-25005={run="0p4a1g1s22s7jq4ahvpqspx5gkd6nhwifbf1shjp53f38myy0bm5";doc="157glkgzh4c5zv15akrlvfl2m03i99hfrm952x919137jkvjbpkd";source="0w70p08k9k1bwf9ls4wgnclp4iqj4hzn132ny4s11lzcaj4v8p5l";}; +romanbarpagenumber-36236={run="0m2772qfl5862l6m81rrx4xcbj1s7vhk9x0ywsqnr8qxl1kmv3h3";doc="0mj7kh8jvhscc4clf2199594994xdx557q0nnsk95srwmncq8f50";source="0hq151qq6wb0q1xhbq6jqzxfh3zss9iyya5wxv883a8pd79rancj";}; +romande-19537={run="1bmqvxmlv2065ifn6bdy8i3mj1g6pkg44dhjrfr4sj5g8dihhqq0";doc="0fgbq36nzkvfw56rvqajvz8krfd84msx8iykkjizn1m5zkqb4iv5";source="1v8360kqvxidzkq8sgcg8k2cqhl59q7bmrk3gvf9vg0shrbvdr39";}; +romanneg-20087={run="0y9nlxbjyiwivw9jkc0vz0lj3b0nvj9dcd4sj0gxgxa1dg853rlp";doc="0bi3b9991x1pvh8s8yrw5031jkvvwkrwah78qfd5rlywh2ylnrr4";}; +romannum-15878={run="15zjf8wbjif83vnib3y6vqxc138aplb93nfkh95wl2rmahaigmw5";doc="0a8zsbh28jl761ir6is1l05n9jyvzr31y86qwaa714yxwpzak0s4";source="1gnvnj1l88l66mrhvd50cx44wws4a45708jmrncb5mnf0i6v7ci5";}; +rorlink-67461={run="16w0lixzj403qgj8yjwn7v5dg8114h91kbyad27y26z7c6q31dq0";doc="13z72aidbrlgyplr8zhjwhsyk4q1hja60jcw8d2l6275j03ykls6";source="18r6gjh78qfjqp1bczcrsdpzddhyfyj152z2r2i5pjcmdjp1806r";}; +rosario-51688={run="1jqgz4cxiq3md1dldlil6pslxxrp7brr9hl28qcf6akymnfxx37f";doc="050yna9vb9cz026cyi44f1qc596svxvf6fgyxlby2isl1jqy89zx";source="1bzcpxygwsmcg91nxx8lxc9skm5cr8hbz47qmydwznkkzldkdbh6";}; +rotfloat-18292={run="01ycgag2ip0kxdsaymfcndmbhfcc95ppkmwhm3imryibm9112bv3";doc="17x7jdnrnm333cq706cdkgzcyscq1k162l0rg3qgvknig6991v64";source="0ymb6xbsqqj91b9vkfzdab1ip0xqqj72zm1kd812gjgkpgxc3jfv";}; +rotpages-18740={run="1pqfkyqs8ymfqsvq35cpv438g8a3az6sajh2bszxncl7m3rqa10d";doc="069jlj27xa7vnl83bx5m4k79lky0ayvcl13gqxlk8an5kdwmdr3j";}; +rouequestions-67670={run="15265sdg56vrc9i7jl55rqwmhjzg27x46qinmzr51jws1wls9l5v";doc="0gj9w2yv7nvjjr50jwaagp6ccqr537h268sakms9fvd3hx8awmd2";}; +roundbox-29675={run="0607rknc69dnzwajmgaq1n8ixv884bqp5n9m1g6n2d9frmmh057i";doc="1vyna8wndg79vman54sv24hbdlv2jnrdkiwyxgzcwc2zv29asxs9";}; +roundrect-39796={run="1xjfigxkgcszkcja58jd2w1rhhnccsl665p0k20lssb97wmdzjxg";doc="0sg1ck97k8pbg2fjf99mhpvd251plphr5pk1dywmjniy9vmhv1ih";source="02kk3h77drvkqanc04bjlfzg0scprcs78z3m2zf8gs6q8w95k7pv";}; +rrgtrees-27322={run="0jihs23929pzbgpgnb2v9i16fcil9kxkggdv1dvg6xq9f2fh21md";doc="1skw79hvvh0xkjff4bfl0nqdd8znwhhwpdx33v8ns43xxamzmnwy";source="1q7y5mbvnrykrp87kljcxw7zdglh08cqz92iahdsaac4xffnz6bc";}; +rsc-41923={run="1ljdc1qyy9ziqsq2z6p13jlspjpalbkk9i5xmqrjwhbqz88fa1d9";doc="0ckvfgw88jhfr91ii6zahrziigwsxfaz4f9rmc7ca2a5vk5yqc90";source="01v5zc947vqa8xpsam5pyg8vxm4yygphyv5hji0r5dmplak0q5gx";}; +rsfs-15878={run="0q1iqlkq6swy905jh73y42ya9zb55xvg9w991x7lsmdxc0bzdf8z";doc="069cpd747d6bk7jmmn1im7jvfb00bd597l34p87vdjcwbk3bzfvh";}; +rsfso-60849={run="1h1hzsf74jll793qs51pq03b2l9szbqagn2p03bcg0f3lgx0cxx2";doc="11vjx0l2dx6cflvypgv4vnaavnmkgznkkw9zizic879vihdzrzf2";}; +rterface-30084={run="0wlscg6lhqar791sz1d63mnprxvaqvjx0mfk1pi1c2zsk0lnpghs";doc="1ghwg489y801j2c1s5c7qpv9yyh4g6higapzjw95nmmyf32aka0h";}; +rtkinenc-20003={run="0q024qcai2slxd0ral92pzzl4apqn5gr8gj3vw7whz7432m4z7gj";doc="0kr27a2294bj80f3qria15bjpsvgifgaj27zv9wj11rqr5g4zm7g";source="1kwg3qbk2ldq5mirpvg0cmhd3nyz79jfdbw7y37s2c86g3c5j0i1";}; +rtklage-15878={run="0wrvj1d1dmdff3kqph59jbyg22gvz3bhpnyvjd7ih7vzfi4b8861";doc="0nc926q2arbszwsq88dd96spaj5xzkrfng34m84x0l8wbiidbvlh";}; +rubik-46791={run="03qnnbqas5qrf6jmj90kgdn9kkliq8ap70z2b9jyr4rzq8m19ryw";doc="16jzhkbh8m8v8cb0jyifhz6dcdn0sxzi898dcyjrvf245zfwk618";source="1cnkay6vn88p5l5jzhf5lzzfd39p7pbmz9psc814jvlpqlzx90fy";}; +ruhyphen-21081={run="0pizl8szphgyq12sbpgsw25x88svj6vmf8j7ry23hvc9bvjibck7";source="1s0wscvjg6hj9f8arjsp7b9m7nqszqxh2wyjrx9i2qb60n2kaaac";}; +ruler-54251={run="1ikap9dkdw9lzpda0f2krizqbfkyjxvyddils7clim9nhg77aq71";}; +rulerbox-50984={run="0srxrij0sxvm04n6zk4vq4qqmxbjz3v425nx191z96fpjcssx2cn";doc="030wrw1ry800yixlgb11xbm5834njv3ad9gl4jv08x1pxkj29vcp";}; +rulercompass-32392={run="0ky611n65rvaii9b5ic498p7divfm71h843bv9h70v363mki9a0q";doc="0wqgnb9czbmymzmv7j48lgdv8s280id5sh8mwv6p0jqn69zcpdd8";source="19943zfp2rm3gdm6w5db01w6r1nl0kn4zkrnnxg4ic4n3gvv76px";}; +runcode-69471={run="14kg5vn2a3p75fqdz0qm1xjg1nyvhmyab6zp0dw57qxxnzbpf1sx";doc="1s421jdwwvpbi7qkgdv7y6y697d7wfg8d95y78113z2p2582zhrd";}; +runtexshebang-68882={run="0c4rsadkk9vxcax1r0c0mz30krw387da9ildvjnh88ll7zgxv7xx";doc="1j72plplkdlazbqhpnykwl5fbszr3lil3zg9a91aih9nzr662vrk";}; +russ-25209={run="0jr0x81xc1zi9vhgvqy0hcga48nhkj9z2n4rd5303b8h68n92yfd";doc="02dl5mh45z9n2b59clcqnaj9fsv79jw46ph3303mlx7plyvdqj8z";}; +rutitlepage-62143={run="0gslb7lkinbhlqdgp8pb60h9x6ajypb5991z17p4d0jwifz063jk";doc="11h7ppnimbf6znqla0r1vq8six0ri5ihzd82dj66hhh6ic5pq9bx";source="10k8l66sjzdfrg6cbslx19a8nrvw7w5xaicn78rkkf095pyh1qpy";}; +rviewport-23739={run="06nc81iapfymbp0kxfk0srpxilfhk94xwhslv6az8n5a3bvp2mq5";doc="1m4xvkafdf2skhclg60fjgvyd6vd5y9jrn3186q0hdi66pa7dl66";source="1hijca49b0cvh3w8dqwng6wdssmg2fjjj7ga9ifmziznb2k4qng6";}; +rvwrite-19614={run="0gb5j3hn1s28ar9d30g158xfc2vaavhm8cbmivr1ba32njdmmqcq";doc="09n9p9q4pjil70ydk9cjh2gqxdslnhrg9avfhj0vvfacknbmh312";}; +ryersonsgsthesis-50119={run="0zn3hp9ipjq3624h1kdz1r55wxhawylxkmh6fi7v6cz37cnn36wx";doc="08bylz7p9ygmzy6m8h7w33l4lch9iqnaqnb3nxw30d5gp0rsb3j9";}; +ryethesis-33945={run="18d9lw5inr4fxxk4x4xjxnnvbp2agz25c9h328gi1c3afsmi4lsr";doc="1jy3vsin13lpd8q5piia1klc08nfmhnx0hp9hl8gnz86h53mc5xa";source="0chmpps2q20bkwf7p0yxwp1y6mak5hga459vpji5sl754nzbvxb6";}; +sa-tikz-32815={run="1hmxifd6zkq4scfwybz0j4za911r76v56pczgym1shx8lqadsjcx";doc="16yjn7zpfwsnwg0mpqzwqrlz6v2bf1gf7qd9hhj28kzp0qgdnka6";}; +sacsymb-65768={run="0s1w8975ihjffw4mi44x91m8z5cmv7vpwvbai0n5sm9f21mwgvmq";doc="14mnvqqpac30qwjld1vsa6ky1qni968a9kxlvi8nqhn2n12ng3bf";}; +sageep-15878={run="0yavixnkhy1y69l38xj6pbihzm83ncvnsl6pyr3l310hif6r0wcg";doc="0z2n1511lr2m39vn4bdamw8xbxlw92p5hrsxzrnjlrg39ysymsyd";source="19547avrh6yv2v86w8f7b0pbvh8xvwa5z8q69bxcvhwj0jqjicps";}; +sanitize-umlaut-67126={run="1hif269aigbfg3j1f579c6ipvlqqgs0swlzamxdmplbdxc55i9b9";doc="0nh23n1yhjyf21l9sr8y6yw7v1mil403idqa08prvrmnqhp1d215";}; +sankey-61874={run="0njrbv0wghzsyhhxlahy6gc4jbgyz4q43qzqc3jb8lln6s6yn6bj";doc="0v7pfxj823fxl8w8v8khgnd64g0wr7198071ai7s6bpd9byq3pkj";source="1qr7nfgh8zigjj2hhwsvhnd3dl6933dfaqjidbraid3l93af8ynz";}; +sanskrit-64502={run="1w2qni1pgzj2mafglzyvwfk11csfwz83gbcq1ihqabxsy3wqvpqw";doc="1ss9shgz8q2mdhs2q5128pjgcl9ldw0bz97xwf74346625n4wgxf";source="1sg4dzb24q477cp83wn3wb0w5srj373llhx3fnqc9cmxfb0rs7ag";}; +sanskrit-t1-55475={run="17mqm0iapkf04z5wlj3qpk9qlz8nnq50bfbibikacdanv3852m8i";doc="14g53969gw2azpn7z81kdwc1m1hz8mafrz15kzrfiw9w6hh7s6jk";}; +sansmath-17997={run="09zi9xps6pv6pjwp8pjiz6w4zqa9d3rwqn38167k2dlwnc3ij6g8";doc="103h78a075lh094slfwlh2yk4dbl0wryzmsksvbp80gbv8w7llpv";}; +sansmathaccent-53628={run="0653qd7c2lb63lbgjrbac7kwl2lzygz694li1clwxlkrf0bnv1q7";doc="1r7dqwn7vxgg51jlsgx82kv79fxskcdz6cyhkdbwgd2f3rmkcm5x";}; +sansmathfonts-68777={run="0bs5n1j7gm87a3dcczjmkld4h4ql9q0kbaa07l62vdvsv0zhfb1x";doc="1lnkknp1axxj0aighhj3cmv2y1bcka9f2a0678g1wqc87kh796j1";}; +sapthesis-63810={run="18dfh9msd4w3gml1h187sdzirm8g44dzvdgsnh4d21nnvbbxzhnk";doc="0cy0rhr5lc4k9jz744jy4s9pf8508vqj25xx16qabfi28rqqps3d";}; +sasnrdisplay-63255={run="0qhvx1nc7v6l2gq8c3av4sqsjlzm1raw6cmrf2lls7dg4dpz60pm";doc="10f3cr5vfdgb7g0yw3pjqdfiaciwb81m2gssn0in1hv8izy09krn";}; +sauerj-15878={run="1bd9cvx40skqlx71hnfrnc87b2p1wrw3587fjxlp6a22yhzghhvq";doc="1swlcqm2z289ijbxnv7aib0v0aisqdn4l2bfymvn268siz58l4cg";source="0l5p9c0fl1p7gy815l5064x93msfgb6z2lnvm2x24mwfnfpykrqg";}; +sauter-13293={run="037skfr46198y0vczwcy6dzq9ry8w5imj1ih9nfy9mrb0hmj8caq";}; +sauterfonts-15878={run="0x2j4rz8n2v5qw1j71h2yasjv2yh5g503svjrcy70n27njcic2dy";doc="0r3xc4128x9nz9wqqs9y7a45lfgll99l7n6k87cb2zkyckr0kk6f";source="1k5fix44afwcx3rihmipji2zalc2zhz8m0rcpybpz76mzqsrc1fi";}; +saveenv-65346={run="0j100cr2w7qii9q1inmmsyf5xbk729qypnyrin0kwf12cvbj2b3x";doc="1j5zi0qvkwx4a1099ydx0hwb93cdmf7y2q6sa28p3gpsh0fph8wq";}; +savefnmark-15878={run="09i4rxdm2agj06fwggg9jznjwdgvqlafhmf8krncc6vsj8h4ih8n";doc="07w3im9nz2s72p502gzryyrccj4g980axvihrk5b5b3w0qzlpn4b";source="0wdb9xsrfddi3sw3g4gppv7vn70f3czjplgbr7pj1hna8grig5p8";}; +savesym-31565={run="18z0xwarbkb6cm7n29wasa04d92g2pirlzsr0icnzfip2f4j7524";}; +savetrees-40525={run="0bzr06y314xa1r105vrc9nd37akqcsq58j0qxzlyhc8jvbji9ajc";doc="0c00z409by0qp0if8ccrah81601w8njlsdylj42achqr1f9q8rvg";source="101p1q1in7qp2nrkz48c7wqfdrg6mj7iqxwg44aqaib1wb27g5ak";}; +scale-15878={run="0al9axcipchrzc9a3dscmv3yvzwz2388w8knr4vw51mn72ws12jj";doc="1fbbdksmcrd91sixwkkgljnbk08i9jfhc751vzggrj87l38ym67c";source="19nfy1dcq5bd23dnl9aa8jimyif5sil9lf8b4hspyq7cvzcjcplm";}; +scalebar-15878={run="1q9jqf46j12f9rav2j4ngr52pqfyrc4h9xj66cgb3mcc7nqgmc4w";doc="042xgbjlibp1273400sg7p6fzdzbnv344dgnrs3y93gk6g7vf8k6";source="088k5a86279b7iwci0wzxv5wnqifqiwc5kc85701987x5qiaajhm";}; +scalerel-42809={run="0b4ppffs7zcg3y6i3c6dnjb2rl1xm5rz7k5mxm08qj4dpdhyjfpi";doc="1js1z2fkxy7ixh069hmg5cxm33xjwwg002y64m32wj4ldb7shfk8";}; +scanpages-42633={run="15q22kfwbw6scnx8q9dj3p0hr0m86lj2asy9fp9s0a15xsbhq1is";doc="03lpz3836rwk5nk2sbbyv9s0kvjbw5ld9cvw1n40b5hggivc2sgf";}; +schedule-51805={run="1p36glmixr7qadjj91j9rlzph03rp8hfrrfdqcg1ayyzkinr9a6i";doc="198yxgq4255q9bqjj141d5rvzjxq4rw1363gcwy40yagqs4xhxs1";source="1gc4zpw7ylnnv9k9kbqjf8r83srxbiqmqyy10xnp8gx7xrnbmnyx";}; +schemabloc-68445={run="0vc9hfg5gn0xs9gjv3c4dlrxpsqwp370y1b9v9iqlncglmjcglfy";doc="1l9hqsa743lanyxp4y2p6ifgwrdaxycwnmvdjzdl6ylzv3n4qm6c";}; +schemata-58020={run="1idrxgfzwcy31cdw07f1axv9qxiy2m2j039rj7m6gqqjwnzpdyfw";doc="0wc4vcn0gbwwgf5c7cxcb66w66yl4s815d6m1cj3dv2mcm83cjyd";source="1qblgn5msrnnaap7w1r6szdzphf7dgij48g0h7cyj12dxy8gm9a3";}; +schola-otf-64734={run="01i19k0xhha76zz34ccpq83lgnjw4x7p511ssrbdqmfgrx5q0gbq";doc="1znflqa3myy4x0m7ayg3sk4z7pja5df1jm7lkashrcrr1gjqcdbf";}; +scholax-61836={run="0is3py7zig7whp0hzga4d4a7kfs4h32w1irw4gmrjb3cqndg8w8s";doc="0m73qqh86cpgrrxw8v2nz5al0x850danniqyw8359bl26r8cj6wl";}; +schooldocs-69659={run="0b5cr9r7wsd00xih7ldgif98qxgw73swis6m4k8a7mx7xa94qll9";doc="0qk4iv7jd5ww6dk2n4wnwp7jg9s1ka0xfi3g9qc6y52f9h4blnkd";source="00w72nbz74plnbfkmhw08xwfxnkdxazr5vdrp61phh5vrk9lg9gw";}; +schule-68483={run="0ki63lqw2m5f4q5aal8qz6v8ldvlpbgc72pzw2rb58l56m1lc66i";doc="0xm09ndnhf93vyp3mwgns973dd4pff0jrkffjm2sfqfasc0lvk9y";}; +schulmathematik-69244={run="1dw6six3530vyb4ym05yzx1f7mh14kk9pd7187rlqzn9n28vzqy6";doc="04y8fyn8plnq1q01qg3l2i5hw1rdycsfhr6i170kxdishq7zavy1";}; +schulschriften-59388={run="08dsnba3p8nz3hnzh1sd5cd09ngg73vl8yq1h5l8qcnynwwbrcdc";doc="0vaqj4m0yxbbmqf51s107k28l2wms68w3km801lph4nfz8khaybs";}; +schwalbe-chess-63708={run="08aym55g3r9nn20xrc4m576q03lgdfxdwhgaac6j29b9jzac5wxz";doc="1s36x2mnj4ijn2785jvgk7mby9xpamh5ar5kz4ghpw64czsx85a7";source="0ls4xpj78311d2q1vacg4h5257wdf11as6x4k83g3m4dx30hxcvx";}; +scientific-thesis-cover-47923={run="1ggghh7w9grb1l1r7xg1igdw79jswcanyn49rpnwiq5rj4a09r2j";doc="1slsn30sbhxlvr73fk9infwjkw66p5sgv0ydkmarkp1ncybqzr6s";source="1qlxpsy3rdb10xxv1nsn817srdfywq6z1zgb4vb0hy3qnbd2rjwv";}; +scikgtex-66764={run="1hxldpgmp0k6ygry8pni0sz1bkz2mpcifnr7zrsabsx899np0rps";doc="0x73pwz3mwa7gpq9gmmdw6j7mksyknwbaihqfar5hidcg7n45k4b";}; +sciposter-15878={run="1pihppjlynvdlsin8brrhl2mg2jif3fa1mvsard686m4ar6id25f";doc="0cpyz5n70hsp5hjdja3pl1lal1i2akn7xawwcp983mqfgnp8jm7c";}; +sclang-prettifier-35087={run="164sdqd7msilg6jk1ivjzvv49amji4hb5r6wg51vcxmg069apcr5";doc="07s0y5dfmp26j0ayz2bhksdybpqb4cn439cvyifxillkq277dqk2";source="1y67y73f2whg663hw56fwrn6jhhpdpm81w32kzwc7r6sk79bnq3a";}; +scontents-62902={run="0hl8sr63b1z8slq47z4spl0sikxdyr0im7zf0vllspaxqfb4nh6a";doc="1gapcq60n48byiv81czq8h93jhhmhx41iddynl1mq5j2icq5g6wr";source="09n4i1jqp8pjdr9qrk956vr335cc54kr5fjlcdavxxkrwdbzclhr";}; +scrabble-69599={run="1r5nb64rsc0fp0l0x813f5d1b88f3jm2n8mf0f5scxpgmqg5d5qr";doc="1ixmz4z7h2lin80yr2f8kdq3c7y40amflwbydy8459yk25m70pxj";}; +scrambledenvs-60615={run="1r6a2k4n1h8n8svp40yraxjxy8xbrrj8d5srgz081n2fb7g6qdqx";doc="0ql4avpcccx92n4mqb6cn8g6zbq73238c4ilr4jj5x18afsg5f98";source="04xrips1nk27apwgfgr0qzn29h5nzs1810q66vlfk1qlmka2gszy";}; +scratch-66655={run="1gd2yq2w2v7n3kfsid71qv2v5q1rvpfm49rsk4815pk4k16kxhg9";doc="0jhy08h2v2qf3p8dvh8mz5yqqrdzxnzlx1p50ng7xn88d9ihpqdb";}; +scratch3-61921={run="1in71jxpq9mljn7gvaslsnaji21d43yj6ckzim42fyd9zk48waz5";doc="0yr18cyzdfrdz6vs0slbgzgp82gklrmxh34k1p135g7255gw8k0w";}; +scratchx-44906={run="1rhqiix6dmdf9i8wan5xh0sw9ynawzb080b4izlp06d8vkfzx6rb";doc="1p263dcjk8mjfxzgppkbkh7l2p89kavdk6llkffkj0z8gvg8xaiy";}; +screenplay-27223={run="14p99gph5jvm0h9x8irh0c4mxb7q4208j5q0d8pd1dpmlvxvzsh8";doc="18i460n3p05mx325nh7br1fl3i1lfviy7jgl24yc5hwqyx3wwdpk";source="1fdw0bpf4q294yqnc4svbpyiza9bq7x2m0x5rc0x709c1wylqsyr";}; +screenplay-pkg-44965={run="1xzwvnf16djzsif7ff8b51dq98h2844nzkj2f9y6c75g6rhnyls1";doc="0hkxa7gz3sammjdvglvafwczn54m6vcywz6rwqng8qa2hlvb2c3k";}; +scripture-69232={run="098jk1s4xdvyh5pr90rysmxjhvk26135xfaxq985sazaz6lhm5yh";doc="02q96z886ijc0ipz2gi3dxnr14a67lhffajiqxq1s203m5rbrard";source="1pbdxbmar62z4drqyr31d703lg9yv5rscg2sw493bkym3lw1v2cf";}; +scrjrnl-27810={run="1p858dfbqas8x4ddpw81mf59p47iqj30yban2g70rims1wqy4f45";doc="1rfx2x3kir9qxp74halcwrn9zg8c4lm72jljspw040gpvjpiydm0";source="0b48zv36kn7bg2n94yl2dzwh9ba1fx7phpzljqpn44ybj1ng966w";}; +scrlayer-fancyhdr-63844={run="04cq94rm8jkkncb4g3dy5d0b7c3h8bahby4rsd028i0iiimaqnf6";doc="15xy198pn5illwsphn7x2hdh2x3d3ydqa3rqkiwjj4srq5japbw3";source="1b60i58229yc8mv07fls6an4br8p897sdg18lz6b4a56z73020x6";}; +scrlttr2copy-56733={run="1as8ipxhssfx4hqa4s246gfim09nl35dx1wanfc6p0yk79nm5lz1";doc="0hsyiicb359blk6m4kj5gddlzwphxr12hbrwbp34cjfzkbh5ib5m";}; +scrwfile-66872={run="0mvrg5vqhswmvnpf74ifld6fk2dyczknjf21hwmy7lyca6vn9fak";doc="0jhagc6ab9rfnb3shkn17dhfgklwmz6lg2ln77vskngxia5g9wzr";source="08dv79i1cm699rxpv2h2acnq53ghngc3cf98r7rcgmxvszgqlm8f";}; +scsnowman-66115={run="0xzi49kpfq3n37ryn8p0z8h86x1328az401pmv6iviyw3l4ri0ap";doc="1h472n0ajfc9my3y6ggnihd0kjpiqhw65c7442aidmkwmxqi5lln";}; +sdaps-65345={run="1s9vs9ffjl5i8lax4i5ij7zjv28d75sm7z8frssm1cj0fb0wdq01";doc="18096xagndh28fkiy4sd6nw23vik781w4pybqnwjfy9hfm3h6c9l";source="1l3m01pggyxpnr2nvqnvzwl12lsv7m3lqh7h27l77wnwip7sjhz4";}; +sdrt-15878={run="15p0i40aa82f9lgdiy7wn5vbkbb4z5hzmmr4g52w6jisx8c1w45v";doc="0y1gxcyms3wprp47y2mlfcc68gijyvyc6h10ivif1yydmxq1b2ki";}; +sduthesis-41401={run="1i8rdk8m8bc5lk35p7qd4pqddi3knpq1ylbxv67ij7g8sgrl9xwg";doc="0i7f9zjxs297hx3hd6cm70hkkc50wb1pcr83xk54cy72yqiq119p";source="1j6asblirf0x4f5zp8zbmpm7ak5nsilqf4ksxr4bgrca70vfava3";}; +se2thesis-70117={run="0qzdj8j9x2gplxjjdn6pwhrn0rrgxnr53pfmnjif76sfpcvb89x0";doc="0kzbyfaplwkbfnbizw2frsnpalkhzch2pm8m89d56fm4pgdxmrch";source="0jnfsjnhp0mf7q4w47ndr27qf9hn4v0djc7yy01vs6vybq9gjzag";}; +secdot-20208={run="0pnimi0vfgp5zsp0iwak0r0j562w59cl1fn3pnp1gwjz65q2229i";doc="1v8j3l2bh055b18zxl3287ardn0ns5qjgbqkj08qxz5ls912y2br";}; +secnum-61813={run="1zpxz6j5is9f2iaj53bqq2m73040lmzn60h9rwp9kzvlafciss7x";doc="0dabcwh85mvq73sqyi9zkbslzbhhns1sqrmvddvy1yjww0lf2q3k";source="1f8dfi9vrlh71bfb1mi2ll0gqcd6jbv5k96jpmvrpqy0pv1i2ckx";}; +section-20180={run="0rqlczfl443z7mjmnmndclbjy6qnqvla89s8yqwngzyms4z1h3v8";doc="14d7576idcbpxlw7hy3hsdd41gpiyksb9ajwnn0jm1mk2snzb51b";}; +sectionbox-37749={run="178z63iys35al6g5lavqgdd1lcadha9rp25bzm41gyg84f2hpljk";doc="0mk0ijbrvmvky4awh03y2q14ks4x9hr2pa84ia0380xfx56849kp";}; +sectionbreak-50339={run="097mwp2iqg6rk1xxlppqnks0j1k45b0hlrg84x12y0cgrkd7cdbn";doc="0kmfpgcga24kpzm9kwc066a6m4kzw2sfkhr815yc0y2a1agj3zfw";}; +sectsty-15878={run="03ixlxxs2ss5lrmkcwilrzi7r46krh21rli07y2j79p8l23n7vrh";doc="12xkczxiw3spyljn1ay9z0xrxdg9ziidnyryri4pkmsh5k60wxw8";source="0h94wh43pf8bphafhcmpsjzj26592c30pih0x3p7csv8dwbv6js4";}; +seealso-43595={run="1mqy9br1fz73q2l6czmhly8j6dnw51d50dkfh9622793z0a2cl71";doc="13sg11r8d8bd9gmscprqai5lbjwfvr17ida17836zagz83b6y16k";source="1yv4zwq6aic2wb5wiz2564mh531i34r9sl87y07yk1ad89kgjbv0";}; +seetexk-57972={doc="1bhv5xgv8jpam5apdybd0cggnvcizk2r6zs7lim1hmhzafpqqlcx";}; +selectp-20185={run="16kcbpvjsdc1ndhhflfmnz0igjyjc5k62gcfly447w7d13qsg2s6";doc="1frpv5dbxfg708xp03hs4vkgqsxjihn3yk3qvcpns6awjlfi2n9d";}; +selinput-53098={run="13pxqr1mzkblniv9rcrr5aslx887xjahjj9f27h7hpx6r4g7hk17";doc="0pbqch586hfwfjbm68g7i56d0jcgg6w26k6g2qlfdbk8mjpc4r4v";source="0na8byym8s2y2jyi1691cnw46izri0y6ybf3g0pmil2hpxy544ry";}; +selnolig-68747={run="1xrndff5if1jbk5vzycj2alj72r123xjwmyr1lrsjkpkp6jqjg0y";doc="14ppr67fbhsqi6d5x0f40awac7j3i90kk7mwrjm1ch1572im5dhc";}; +semantex-65679={run="0hzp5i2zdnw30s5kn797bwz0hi8ldz6x10x6bgp157n9hvipqaj3";doc="1kd48bj4w4rjk8zswgxgjxj470zxnicr7mbq9lb7crra6ldprp15";}; +semantic-15878={run="1vf341vlmgc00d6srdwjm0a2spad674439ml9k6ir24pll39ia73";doc="0rr5kbn1yzil4h0j42v48m4mkqk8rzwcn05rkn8vs2s13az6djna";source="0x2qal3q0m886lw5xd9w200fkq4hn34qs2kqsr7i7dcq9xwl57qp";}; +semantic-markup-53607={run="10ahkdiwm4h5mwigkzgjiq2xmy1lzgjdif11zajwckv2xng5ckgc";doc="14gv3pgdyjjjj8l8vfa2pgzafyqlq0666hbk0cz6497g99z4ga15";}; +semaphor-18651={run="1fk3qdnkpv28zc8q172w9yn1aq8ff9ag6ql2ghh8aa64j9gygdsc";doc="1bq53xa67jshwlynsbqhf73jgy6pcd8hhdc5dbh83cgma804fyyh";}; +semesterplanner-56841={run="1d69y3s4hhv0lpf4ljxg7r5zg0g1fhjw9b30hhpkxvsbfdbl030p";doc="1a7a927gwspc21drqqb72rymyncip4b15w4q9cy654zdp16b5i10";source="0v66xizbjvlzvxdwamny8rggwb0ivwmhlzpjkmm7p26s5l9kd5m1";}; +seminar-59801={run="0a9sg439ahhhbyb3gp83hvnj4ap0f67xhnfj3p2i3k5ch7chkdd2";doc="1jlrrqasp1rf1kb2bjqlhs61l81h89y7bhi7x2liiwa0vyfva7s7";}; +semioneside-15878={run="0lmr3fxahcln1sf6fg4mkrg8dl3k3670wmz14kpyzd131g73l1iv";doc="1n7iy5qvd0f1hxp025w9x51llx8cwly4lc107iq5yz9njdwn1g30";source="0vshjv6nzbp29yza2vj4g8hfx0sbbgnd1s7ck8ms68zcv23534j6";}; +semproc-37568={run="0yvs0kqk3jwq5yw7b8wwycfrg1v5q47mdq3bprx7rb1yh83ip53s";doc="1ycq0qdrhxk9x9gbhigz3vpldc0dfhb3nwmz5v9i45v0l2m5l3bc";source="19v3w2y9406r5bhjchc6rsfb2brrw7f7sb8ikmr8586gdsnwykk4";}; +semtex-56530={run="151sfla597g5n0nv676sbv5m4kfpmjli7ddhd1yzsiqa3axw7vhm";doc="1mm9ya9ls0ryfxzkss3lfmslw9wrbcq9d5abf022ifbs5184rgnr";}; +sepfootnotes-41732={run="028x18s5c1jxsw97idpj8fmlzs6h46nsgd8zg0awikhdmypl9ac0";doc="0mb7fidrjns48c06pk7yfq3csac74a13i3d2cgfdvn7lxz6lp419";}; +sepnum-20186={run="1gawca8sqgvkgc92hrv0mjhdhh9nqiafxg2ssk7m1r5dqc091qg7";doc="19skfqlaz82ji5fzqzgnfaz642ms71hqhv2pavm6a8ifish8wcj6";}; +seqsplit-15878={run="0m1vlslfac4n7fwhrmcl0swx1rf80ks2p3psrszwd8rz79q6xlc8";doc="1wbmr7hayx3kzwmbr1w1hlhyyzz84skbahd03bw0akbgk0qziz1p";source="1ibiys9lfj92mklzf4lvdzn192wv843zxkv91grjjba8cvn12w5d";}; +serbian-apostrophe-23799={run="0anhf0xj3pm516sxiby2j3pbh0cp50ipch2s5dh037h8bfmjgsbv";doc="1r7fsgsggbr8gf973a8nzpq4rjjpmzbcqnwc8qrlynfiscwc2mjf";}; +serbian-date-lat-23446={run="1766dw6c8skacjbbcd0d2lvy1s57vjl84c12xf1w2q8kh6p4lqk2";doc="1k8lnnhb010rq872yc9d4m8s3vd1my93qydv7x8l80xyp64sq203";}; +serbian-def-cyr-23734={run="1zxl15y1j964sp4iys1rl4gyaqs13hi5ms9rhc7944p36rdf32p4";doc="0nwfxr85nf19ddk9b7hhin84jpimsx2hm45nzh136qr5jnr1g3hz";}; +serbian-lig-53127={run="004bfyajczp11w6bpb7zfyjwfpqwlwzian0m68qhmb3j95vrs3nv";doc="1yrwmr8mjhqnizsgvar8s4xaaw1f70x6zij5z394a86ygx1gx06r";}; +sesamanuel-36613={run="1a6673xpr0q8v7wr1rrq3n6acydsfsc3q6kmj0qg6hm7lzqc1f2r";doc="164hkrwdgpq5azhr9z2ganiwhzqxfaljm89igzprgcg23cy0l3vh";source="0n1akz8757l5k2rv188rnqd90dkmy3xppzcfwahiy22p4bzaw2aq";}; +sesstime-49750={run="0nrwgky0rh7lazd41h3jxlb0kgpk5q7hhbgkfdab41zrawjp9y86";doc="1a353bn7z135bnk2a8q57x4z8d03aimyjfqx3w9x0r81rwzns605";source="0vrwbbmfwfqpvsfz31yid9rxzdc19749fwhlpimx30arqpd88jhg";}; +setdeck-40613={run="149m9s33isx98vkl3498ywjy6f9q31jkw8schc16hxxm1z0jadnh";doc="1rp64i0nrrxn7l2g6dlcmfvwbq3rg62h2ifxrzfp3k5ifnlkhpz1";}; +setspace-65206={run="1h2cwbh7kb2hf3s399x78ij2mxj4b9pjyxrc7jjsr4ldx8hvf2by";doc="01v5nwbkap93zf90vx4a2whwxa0hbnscqqgcd8r865xfnzgc8a49";}; +setspaceenhanced-68493={run="0jqlpgv868qvcl5v3kgzi9dl2r99fx7k8frbzd3fj1yfmjvzb1vh";doc="15ln2969hhaic7zk6g7j66b5iqpw1css0qgwnppwfvydyx1ln6yj";source="068z20knb02jccvh3qm9a3rzpaki5r41is38v6ax9a2mxmv36y4y";}; +seu-ml-assign-62933={run="1cz01iy83gvgg3mk54vkc373smz4r47i8084jgcnr24c0gwr4h3v";doc="0f780ydm3ww7q2rar32lxadzda4mz8bccgman9j5ibwfsdnc1jch";}; +seuthesis-33042={run="0yfan3cpx7h7hrnqncn152ccawlrsaccj0c53kzza0wnkr3hc9rc";doc="1hnrl455lz61y9ybhmrvxjb66y5816sq3yqb76zszrscxh5a8h5f";source="0dw7ipk6l0mwgrwrj9sxg8vidwmmy22vmpwm6j2ksnznz0238yf7";}; +seuthesix-40088={run="07vjbiycd00r1daqg8m0b6g9k97ja0wn3s4zx7774av6p2hdhllj";doc="0j1vphdi9z6anvw7d3a20nasrdfgg8vrn9jh9wi787f9vy2xzdlz";source="09qpilk53k37c8dzc3q3pgvm6yf7i7a09ln0yn586wslvm2dmmhr";}; +sexam-46628={run="007lxpvam03cvldnq9q8l2p60iymfijs2yc30cgj7i1lx44630va";doc="17rn2wf68f16zsr8p1dk3klqapw251zpqc2a7z3b7lgl4164q57w";}; +sf298-41653={run="05px7n24nn9rlrc02mgsndzxc5a397m6c0n3sbsihq0qy9zl6nqg";doc="0d3fh5dglipskc7cjcdg2n836qnhfcdfkzpalkck7b85kgq0zrbg";source="0afcavg1zs5ldi9fjhsnvsph4xqwy8jkhil8jlcqcqbq39z73pq6";}; +sffms-15878={run="0av956vbxjwf0pywp4hrxag1ypaj59314i3xqinq7xhwwxlr7g6b";doc="1aq8bs7bsbrzzl2bp7mg2ckccazk107ckjl7118m5d2rk0mf09pi";source="0fl3z3f3pm7060cfxn218ycnf1y7id8kcll960h9jvpqkq3dhx26";}; +sfg-20209={run="0ldw6c8aqqd7m4ahziqv857zkjk3ap12xnnl5k43dcg8n7apb3ix";doc="1d627ks3av63b142f8kd7g0fi1f4xzq0yg219fj8qxja4mm5jrv6";}; +sfmath-15878={run="05m3whw5xkml48yx93j9h46qmspnr5hwsfszb59l4wy4jfj66zk4";}; +sgame-30959={run="1axbv7ss7nh6nj6dzs4v0g6lqccm8vyvpc4qfv2aqij37qlyv23y";doc="0nj8n049lmin4j90an75p9bqillwx7wgpvxdm0jb1janfip4r5qj";}; +shade-22212={run="1dcpvvk5216znr2i0nn302da6vjixkih5nwix9m3hlmrd69z6hcm";doc="0xs86yjd9f6wlgz0dlc89iryh4rba3752blz07zrxzrm89fdq22c";}; +shadethm-53350={run="1miq7szfh1nya53vcn9kv3m8jb1sx8p1v7z5m3829ynbyiwr7z9v";doc="1gbjisy9miqp0mrciz793vvhj0a04vaai1ixi6vzplhlx9gknv6i";}; +shadow-20312={run="1avy8291hmmvbrqdn4yza9w8w7a7hbwlh38sl7288c6gh1hkyibr";doc="0rjfdi2hm07j418q3fvrf5pxflh1nfkhrk58nsa23fixxzaw5nlk";}; +shadowtext-26522={run="1pnnskcw1nq6m3rlvsa69dxq828dx0bgggg8n2p2bxnr9gmnba3c";doc="0lfvn68d48yh8smf4w8c1is67chsfnipxc82fx6mal1czlyn73hf";}; +shapepar-69343={run="0siq7d3d5gr91s3bc5873540b1ia73ggkf1y1bs47zb3mh4z9g0b";doc="08bwm9a4rq70swqibj9s0i4042fnribqz93jx02xd0638wa51pph";}; +shapes-42428={run="0ww9akd1cf6nr9jk00qrjc8j0d9ryf7f8hc5ywmnz1q1z6mk1fqd";doc="0qh721vhyny3xmkwiaif3gdmk2bhy67mvyfkc4hxrba8lddnkfqm";source="0g3xfni1lmwdkl2jmprnhl3yxdrmilr6nb59kvznwph10h1c7iqd";}; +shdoc-41991={run="0casdf6vn89la2vgqy5zcc04nlsrqpiz0zj7mwlf6w2zqcpmr1x6";doc="1vzz7q88xq2dg3r1xf4idgvdqs4q4w5lplg9rvi867qa8qcf3ly2";source="0wxd21fs45f9d5y2ml3w50d7z8ig25gv34iy3mldarnqi2v64p7z";}; +shipunov-52334={run="01mckfm6ikchmld5r8mdy5x472avh473bfc7lk4rqan8p4wivjrl";doc="0k6x9nxsqcg74z9i462qix58qycf3wjii5ld13xajn04g52bwvpy";}; +shobhika-50555={run="128p64d6bc0m65nwdrjr35b7rxlx21c025vj8bk6n1frfg4k4lzx";doc="1zxg9rxsdf15jn0hn81p20j0dbq1095vqrmh7d5mzhlhnybkr1kg";}; +short-math-guide-46126={doc="1wjcjgw0xk4zx57f364cpl57qpxj3lq4lahlkbk6iiin1h9v2prf";}; +shortmathj-67201={run="19rscnl84f9x6r7kajj6wjh80di5y1mc4g4nybafnisap76r3c06";doc="1kzzbkv36hj2wc9kz1wjr5dlgx3r21vlyj7sy8m8i72yfnmajgbx";}; +shorttoc-15878={run="0y1sa1l5g19arc5wdnqp0jzvqn51m4gb07acpcp3ajqq7n7yaf3y";doc="13nlpmb1asrx8vi08kb6kcqg6szhnzb6667crj9xchbk3zm9iyil";source="0a3hl98rl5qadx1mqqla9hw6i1s3324i4la2kwdazhxhvi6nxm0q";}; +show2e-15878={run="0mhpxhvgfnzwwzd9ahyzdhqxzqz9sj6vldrnbjy4n0r4fv6c67pi";doc="0zfir9yzh3mgpkldcak7hzal0mwls90h1m5vxiax6h2izfkrixfm";source="1lnhqxazyz2gfgkgbj7l2140x81bgsxb71y8dagcqazjzdmqgcdl";}; +showcharinbox-29803={run="013an5sq2kxrfs04k51ldc9vkixag1lbicl614sbj3n3ixgk15db";doc="1zdxvlj1jspgkws4xmwa8yy7aaxqwr33lmzkicg6ayy465jmfk9b";source="0b8hq68lbd0xjyd1cj3qsw1rd4rvjsihd6s9ab5v3a0q1sm5kaw3";}; +showdim-28918={run="1pb5qddnvv4kl79fcp20zkcfgxm8p4zix82g9431db3bbavvmkri";doc="1hc208xi8c4ihxb9nsk6y5p6p43yyylqh7jgy8lai2a526xm2hgw";}; +showexpl-57414={run="0gg8bp3pddkp3z79z8wkh9263gnxhcn6vxhgp2mq7w8i166rrsyc";doc="0dv60pc2p19bzr1fj2hqkgyjry9j8ykcgsi0v3xpvzh91ic9v5q9";source="002v6m0gzzx4kr8vnw75czn58cmzjnyyfyzi2hvfx9ykh7nmibng";}; +showhyphenation-67602={run="1qbgbs9jc2i2r572187p925wjyw6zi1h3pgpyr1ixz84ykdjc2n1";doc="0qrvpapyby3bbaxh84529fvhgpsvsd8xv1020q832ad5fay6rm10";}; +showkerning-67603={run="05jfqr88hcx4mq1fq9hv47921d54947qqa3jdgvk529d0487lcqf";doc="0ggkfgf7zb4jn6icnn43w4jzlklkdw7f0pqyksf00mgxcx041fh6";}; +showlabels-63940={run="0v3azvk9minc28bs6n7g75c0bimnf2ilw1379fd8hic59h1vgqja";doc="1l46xsay07ysg4d63x7mxkavvd9cnjwmfcmgnsh1pg4icpyhs055";source="0vmh36ia7s85bx51hddga0mxb4lcfrmxk31zidqk4kkpqmf20mj9";}; +showtags-20336={run="04m7f6i3992p93xz9rlfa0vnil6h9dyk7gy1v7ih47f1m2awjak8";doc="0i0iaz4hlgf52g68znl5a3q366hd8ygad2khjs3y7hk1fwqpz45h";}; +shtthesis-62441={run="09g79h7dwc0v06h06svj3h43q1xf31fli33xxlqnckz28i1a4y95";doc="14fqspd33n3r642mvmiamswjl4qjda2g7p62amxs69s64cqfliv2";}; +shuffle-15878={run="0laiw8v6izp53c8y0jf4k1nb8brvs36gd937nz2i2cvnpghz98if";doc="1wd46l86h8vlxpasvhnvjimsfrhrbs56i767v2h7bdl8yp751ycl";source="13qz2jc0f084acxdsf99fj22kbsjkr6i3y7pqzh1g2jd4d8bbw8m";}; +sidecap-65618={run="0g6j4mh0nxvdvqyaz0b0756y1xx55zxwrn761xz39mmw3sca3yzz";doc="0yynp2qmq6df47fzns8jq5hkbhkj8p3il3prq4l7pg1129278my0";source="0h0s7hpmx4ha318zkz6caxq2ckvwxxv2fbkjy7a3pfs7q2x9fal4";}; +sidenotes-54524={run="1ip6ybhfihbbzflafcqfhspr1d1x44285msahf7f9ilmhd4536x5";doc="0f4nqbw2y36ymgcj7ywy9gf94pcg09aqk4kjpankksgwmvyjbsxg";source="15kz5d5038vi03siq6lbbf97nng1024hx8zzgrasm304sf2c0ggl";}; +sidenotesplus-69176={run="147si778pbc8vj4jmclsp1qkjn68qli97b2jz8c5ij3znjaxk42v";doc="0vb5r7bxj9xn1nkzmqnxh32ar87fy385rf2zpggahld9v6l7phbg";source="056mv9jqp9lgysgk89hh9wwbnwi4q477zc3cw6c7hkm5wn0xcx7w";}; +sides-15878={run="11anl2mfkzkdv5qb0rfw7940z7hy5i43d8hh9nsvzgwfsw0x1qkr";doc="0gsqb1hzhy1qk29lhq57arzivkwxw1achz08ms1q8q9vxwcsf0sz";}; +signchart-39707={run="1qg1r76v1llj68iqk5imp7f63774ky68sv64xa6j4w52jkkswn1v";doc="0scpaw7l26fcqylcqspd0g5va331yf88a8wc69diw78haywwgp4f";source="1lx77qldn3d23dvs11giircs2pafm54094h6ipxlc4g39g7xc0zl";}; +silence-27028={run="1zixww8d87jymdvxjzjhvhjjr5f8fxhbjwqyzivki2rhw6dpsp2v";doc="01qb2z62da0ji751i3wbhq10rfin23q20r7wr0fzvqv163niy93v";source="1m5xiy5j8l0xy9731mf0jvk4f6bh7d22vbsgpjpvy5r0vxafgxwv";}; +sillypage-66349={run="11r22wb3701sbkdwcz1bhmiaw5xv0bajzhfky1yld05w5phzh21x";doc="1cdahbjw4p317iyr0drpvqw317cjlmzkpjw9s61hv95297156cl6";source="0ya6g5jgpip7b18av75ifia998z5pz3r1sixa44f5f1vjmbxvy4w";}; +sim-os-menus-68843={run="02gnf1js2x3l3y01hj10yy1b1ymkmpf2x8pl9qrhsx63v55chm3k";doc="16bgnhiqxmk5z1ifgci7pp0lm9sg3xh18irvrgbwmdvd088cxm4a";}; +simple-resume-cv-43057={run="09xsryzpnq33wja6fkrxy4ajrci6xcn0bx0mbsw37h0q0h65rp9z";doc="0gbf0rg3v1ivw631yl133iamh7kadclr089rby72al50xwnbi559";}; +simple-thesis-dissertation-43058={run="16byfnhfd1j14911xs1448yampvvplxy8l54by4qwq01wp7pjjmf";doc="1wrxjkgbvps1wyicwlhkx59xwb3vcy1n0wf7r7dllw11r7hdg6f4";}; +simplebnf-68959={run="1bcg213dww4ngpafy873ralbhp901c6xrsnvryzpgk5jrqw2d2bj";doc="1450ri57ci113csq9z54zj6284s8bn8rsl5y2xidl76rz9hdidgv";}; +simplecd-29260={run="0d6gw59xd1mqc991yy6k5jva88j66pd69k5sl5jrysl4rw1mxxng";doc="11fzk8p911v1myphghzpmkj7k62vk4sdicirys1jh8rd2cpnnwcl";source="16g6fcsr0nw7isqimjq29g0zyf72z11qx9xz36zq8z4khxsl09ln";}; +simplecv-35537={run="0b7p6d8y7xa8xs9i2qyljk2s992gprsr3a5pjalkkssa5kiz3371";doc="02x3nwmxdk9spx5crlaw1xdqlwah04m88zrrw4wdg0qjnhvv4mvr";source="05ikxmvflqz5m3qallwgyncda49dzq4fibllgc1j77pdh99cy3vq";}; +simpleicons-70519={run="0cb898rxxv36nlycmc5njnkpf98mk05vimnhiq69bc30k43jjap0";doc="1z2alswv6c1qykmgbnbz5754sv99q7kf17i2m4z3djmf9mqb9j48";}; +simpleinvoice-45673={run="1mdc6aij1id1jxlbkwfdvdv87yh55v5qyazfciffpbf91qm87z0s";doc="0lvk87l3xafl4s303rhmksfajnw77qd90yvzhdk126dp1prh7i6p";}; +simplekv-68439={run="0cw7n0skxgxgar8ks5nlcn70pyi60zi7n2crdbamfw3kgzdqhqsl";doc="1hqyfflwjdxmq289ngc25gbjm2mcvwxzm9sbfp06xszk2vhbjd4i";}; +simplenodes-62888={run="0rdmcmj583i81349m2hwdf0wl4glsfkg5vkmhlvzndh0n55ivj3a";doc="0sg5xs96agly3r917fvbs8mxii7b3l9hsqf2cpfpx5gwdlmwf0d3";}; +simpleoptics-62977={run="051635sr8yp7n44hw9wza6hw0b4av87yp42wkxwq0rshxldqgsq6";doc="1lwk3qq1rgkgi7qd8qxdjjfrnk44c1gj4vl01m1jl181dxjs7lp2";}; +simpler-wick-39074={run="0lm22wdxiwasv4igfsyjfi338qc7m985da7a9a6q8cm63hks2alm";doc="18hmx8b6zpsc98mmjvimdayqpkffwjjch4sjajbz4csjpza7nl98";}; +simples-matrices-63802={run="09kmqq2si98yg3ddnlkddn5gjlvmwd8w78r9d2xvd7g28wm1hjbj";doc="0zbg9ppqj6af49braf4hd9b0fklxjmsr7yjgbla6ckbkwihkqssc";source="059wa3qyaxx7ha1xw98rwa9w7v5nyhq5rfmajhba1crnp155x73p";}; +simplewick-15878={run="07rzphj6ffla4qz9pa31xnn25d420lvsnmgj7l78ryxai5amdfvw";doc="1ch7yqh3bv2y6282cgvqzm4pf5hgpfvlmpg66zcp44wnkq1sw67d";source="070f0zrnrf2sh0dx5dlbz6072b76f8iw03pvywhyryfgghfdfv7d";}; +simplified-latex-20620={doc="1cgf1p7p2ikda1nb0c2vhhx7ai6rd973pz6a00pr9yanxsvghp6d";}; +simplivre-70317={run="0wqzc5ab1pcv7vvs7n3ch5bcbpmgi791hr11axc94daglmjbprgw";doc="0isjnr5xqf5phv9ysqnr4mxc983k4vhgikb7gl1c6084b7kcnbc1";}; +simurgh-31719={run="1nhdmdi6qbvx1nd92hxl8vkly82a9nxi7ghj0zpm31c15z5pb7rq";doc="1cw434sxnbgq5dbaidn3zn8i9az4q35blcx9lr6yf3m0yy2rl8by";}; +sistyle-59682={run="146493bgh2ghbscq69bxsngjfkl3k8g68cy5j28v07lxi3ywr6n0";doc="05hs1wd3wj8szj16wnmjfiy0g0hxgy2cc9ai7q6ys77kgjb0dpfp";source="0sb6vbhnqlixrfy9484d8im3vmgk58y7nqad9hm2gkd4p560cxj9";}; +sitem-22136={run="19z6zmwriwrlcpgdgn5yl2bzbz0fkn3p8g5hrwd368bq7wyfc8mi";doc="1wwnqhl3ffqnp5qxddicqwsr7515g6j53rx1rgi9b5z3cv42f5qj";source="0y249krv2h241wy8xbi5xjrxypa56zipi8fbmqbziw9cjjnz993v";}; +siunits-59702={run="06x797504p5lzb3xlkri1sc9whyjjz6a95gk8kvpympglm8fmpxz";doc="06saapj9rh5gbrj0npb9rm60xrww8rl1y5brvx97gj4qvc3i2pic";source="1clhfsmydg2xjajak0ssa9v5sd3id957si5zvyq3njgl9cpjwi9r";}; +siunitx-69922={run="0mv6ysgfhbjsn7zghm742jxxpc29q3zq6j1wnziq8mv6zgzcgyl7";doc="1wyw34vvbxmp4b54ld50kxhcgvs3my0j478kajr1x9swyr852s67";source="0y91wm6lykalibx10jcn4zm112f815ma3pxm8dz53mgrd8gbnb81";}; +sjtutex-69967={run="1l72xn9ylbv0syxbn53ymifb6m7h7bifh1s5bq654knxpqhql9dh";doc="1wbf0akvfzz8xi8g96bpf17b7xyjlbr61dwiwh5q127885gwlq03";source="12fw7j3h3fpn5x9cbr9aivldlgizqhkvwm2r995wlw6gsh8way66";}; +skak-61719={run="1lh97kc1hmz3ybb67zr7vr74z1zngwl2cppkhmp9cagm48j24am1";doc="0abiardppn7hx6l5h4zh92b9m2yf3w16y15rcvsspv1cb9sf4lfw";}; +skaknew-20031={run="14j42hifh60p6glfp24c2f5k9k34vcm0l3alqfqhvv68l31i05rx";doc="0i144akq7sgs6kwayl8c2yir0kc7czjs49vj6l5lwdcwbyryhh21";}; +skb-22781={run="0k441znw2bn13aiyc6b5hskl76hbhcpilc1xg4jw837dbj2v6qiv";doc="0qi7l9ky0y65cmcp32j93lhwlvflvz8didq9c77faq7ffgzz51s8";source="1rnraidwhkxlhk09ppa5k0ndqhrra4asbpjwv2j5dgf70wfm5vmh";}; +skdoc-56950={run="1bqgnqqv5806f375xjny7vjd831ymdnhra2rbgh5hwls7v9hwp4j";doc="08g7qrmasrl302pxq94dk13y2bdbg6ipxg4f774kzbp8zwqa2xwv";source="1qnyh8gqbk6dhkga2v9gg97q0cbbv8hpcc7nwjskwckc4jxplqwy";}; +skeldoc-57922={run="0fnkq85bidvd6m14m90w428ndx54fj2855sxsajfzyid63jrfa9h";doc="1jgg6h4cdz6ir7ks61lyq9ixczmhdcs34mi4llh767baffvb8340";}; +skeycommand-24652={run="0z5jpznmx09vc5klsvp4hldmlgyp4bwz25gp775kbmad8azad1x2";doc="09gmmakvxhvrh7k06vjh6ly1hmax1z5x7vqxyqdwi90ajh2zkmgc";}; +skeyval-30560={run="1an6ghhsq5nibwas1csypz9vmrmsj7jviamig1r9zzjrb5kzs65a";doc="107higin87d7kca6753f8f61yk3ypk5hkidrbckm1vzn2ci515w9";}; +skills-56734={run="15ra36iiz7i9qb4669j32b26hzmjyx0hann3kd12769f2khb3ial";doc="03j6cj9xg2fhab2a048hb2cs2ddqac6x7zfcf7p9s8zgzyqqi8s5";}; +skmath-52411={run="144iwn9hv4d71420878y7dzygmyyyr2l12gsqrbb44mdal68q58p";doc="0an8w64z7dvbxgagga33zar0m2l44327q4lpz59n75g7c6qswnv5";source="0finxgy2sj5wpzmjh5zfcq9l3dzka1mlffbgmhzp7yk57rrz9lr4";}; +skrapport-52412={run="03y0arbbj95jnicmz9d89vsyw178hw1410vy3ydvf8j88j8z57sy";doc="03b3zp8w0m5kffx10j7qnikdfy6yznvvzlg5hj30nxam4za51n91";source="0vwhckxi676ygxc18rhcsfnr5kp1j5697zyn7ir5qxhm8vdmqf33";}; +skull-51907={run="0v3kvrk5aqsfna30z920k237jql1byy12qkb5i8zlr73z4cy1ll3";source="17iby2rcnqakykglv9k1q5zmcj0h4gj4h2vadihvyyz6m6bvcx0c";}; +slantsc-25007={run="1a05zrd8bqiqgh2bwlll2wspmd4xnvl7p8mz3g4j7nkvx8bp4844";doc="196sqfqgxc7pfyi75d0nqy151if55k3wlvpq8ai7647rmapn17np";source="1jw70y8052qvjkr796sz9w0c6kdyammi3gy5v8iq0wwmf38jl8qf";}; +slideshow-15878={run="1v39pb9qdivrj26hpjbysg3hbdxfd247a346s5gdffraymiy9lcl";doc="1s40c102kkaa24w05lmlg1kw8fwlfnd5vwbfqlrf4y8807izbj4s";}; +smalltableof-20333={run="1g0kh262h9xv5zr2yix9as4ghfsrqnhj8y9gzb66xk90i82pri0j";doc="1q96blk44d3nv5bihz81a25a43vbf9b86d9w00cl9kkin1zzkf6w";}; +smart-eqn-61719={run="0bjkvgyd67v876dgzp6zwifal9dy6mlhqvjn2rzrigrddvvn3j87";doc="0m3ilj749zh2apxr0748dhhm6bfs0a6gnc02azjsv8wqj32bdz11";source="0jxbyx3fsgqmydrzjymqa3zi21xigqpnid46y1izam8vc1m78w23";}; +smartdiagram-42781={run="0b9rq06c0xm9dpd6yljvgay0p7xpglpddw10vlf5c50wma4xqjda";doc="1gkgpgnsyxv9nmhnpalshf23g0iz7bcp4agkh7l368j2h48d5xmm";source="0chpnchdqvljj7h44ybpkln3b7kjzr7b18cj2qhj66ng9cwpywwd";}; +smartref-20311={run="0g8dy72b8q65pw2zmcs2yipclpx3g445v9snjnyxbb3q82asqy5v";doc="1nwl85jj0d97djdqkczdw3544vhazy57fx8psdcvfdncbvpk84jy";}; +smartunits-39592={run="0jiz4mhyf4zaikq0fi4jvan27ngksrv7z5gmch88qj7fapg4xhna";doc="1cw6k8bvj5xakh909jq3x527jnmma8wa7dwp1za8hsajwmmfzxgp";}; +smflatex-58910={run="1w55jqw3m1a3s28hkv68vmqmbh14c7wnsv88z5qhmyqav1nbb13z";doc="17pffyp6d7blwz0a2yjdwa84lim9b7jbg54q5gknmwi02sqdqsb0";source="0xd02c6zzvx9av0xjmv8navff8ik9ibanmid9kls10jancp47waz";}; +snapshot-56735={run="0598yminjxp01imxrbzydqjli0i2ws1f9hw6f3qhs7xykfacbaml";doc="0j614bp2fydpzr2lx9xamn36fn4x0wwi5a58013ds2a8iiha6k1l";source="0bh7gy9inl30h8y9v072fh2malc07cjwizgxc6wvm07n2x3vidfh";}; +snaptodo-61155={run="0wxnac52wv3aknjs8vsw17ghxn77xiqffn6badyp0scyr7gvmkbc";doc="0036gs7ybs2ilhp4lhzc489r5ai6ffx0ha7fn674qzk3qn5j7zkl";}; +snotez-61992={run="1nq3ggbdpkpydaqzpfawvvny8azgbmnbwpl00wsl4rhi7jbqsfwc";doc="1v82nn2y2kk8h34j8gidrzlx8nwah5wmdk3qigw8aa1q7vrkj5h6";}; +songbook-18136={run="1qknajn3s4vpw68hwn0mjf9zllhba035gjgiwj807nifhgm2bvpv";doc="08p61v1jgw0s2bdfwgmb1zw5pyldfsy61d09n6qq93wclgaim7lk";source="1xzx3jxp4791imxw6h7gs1ach94k1w33f4p8pd4rvlcnwglnv9s4";}; +songproj-66704={run="04jnj92nva8agg4k8qgfqcd7rvwhvhwx3836464z66fdv6v4q92x";doc="1qyw11czqdhkpyf190asx8yi4wmcyxc71n052f5481p3xbblz1bd";source="16qcb0k59kkxmqavywdmxy373ck923xn8pjfzp6qssgjvssnbnar";}; +songs-51494={run="1q2fddi3z3d6f03y110ah1lc5j64cgg16w4hcxdd1q6sc6ccc61r";doc="06y36cnx42yms6b3mnpkvbwrl1rrpjy1jlafycy33ijx0sbpizql";source="0airs4wvpv2wmm2398sfy5sh40q0r2skha33999fkk2s9jc99jbb";}; +sort-by-letters-27128={run="0gjmbx6bk2c3nygcbvwn3wfsdj1lscpnqzfl6w8li26hws1ravii";doc="1p0dfvh0l4z4bd86wcvph1fcjip2rvsm22j890y607lfbqhc72kv";}; +soton-16215={run="03vldli7z2bsvznmqw5y6gi81ln5v54jbiqm53z464v76kp9w29f";doc="1i7b5i8vv88cjxvcm1adlxikqwvbzpzkiiksdn36in8msj23vjkm";}; +soul-67365={run="0hkxhwqmss7lsh600ggs8q7qx0dlgw63q482m8piwx0jmh4p29xy";doc="146ji413205b7igjscv9wfybs60wyn47d9q6gkzn8l23wamrzxwm";source="0lplpmk05y85r2rjzjh24p6slmq8319kn7ixxb3zjbzjp1lc44j7";}; +soulpos-60772={run="033c0arpqhrypwy5grpc8c6dnlc7k86iq5wglm6r02bdk4mcw7hk";doc="1g99lgnl1m7nffwdfhmmb4zgjwpaiq3pggbgmi19p24z7qc1sjlz";}; +soup-50815={run="00glliinyi7m5m6gkr0szzsp5drgnqww4k50yfb6p3qv1mlkqgvi";doc="0470i396sk8a6lnx189zcazns280qgyw3yvwiyxc1gs2wd812qr1";source="09db050wsnmpqxmba7w23h3g92xyzg0sqv57yhns5nwxb2cmbr2g";}; +sourcecodepro-54512={run="0vzs79a6bhvxap9xw9nm4csqm8x6m83nmsxffqckihkrbcbwnkz5";doc="04g53xmi3afzv76dn4pg9vjsd903rl0hbzqw32gr7hhgh60xwb8d";}; +sourcesanspro-54892={run="0j0qgb04yvwf265hwiiv581fy39cpr6i9f21k38xdgdi0dl7ghzl";doc="1lg7jxxcymnvbrhgdf6ddj0nahbr6g5vnz7ahav8v8zfyfw87z6z";}; +sourceserifpro-54512={run="1zwvz4yqvs5pcqwsig4sjkp4chsc089j0dl9mn8ah047nhr2d7z1";doc="11q4ppkw8m56bpn8s08w0zkiilfz6s5jv0rkqjnqbzn47nm3dqij";}; +spacekern-67604={run="0jf5rv2kqzfr2ji8w4x3cgli028rhnndz5xm7l54q5m5rqczb1ag";doc="0z9dyms40vh95wslx7xack5qys02hdwxr451d19k3jvx4jyxsl7f";}; +spacingtricks-69048={run="0ahyb2skb6bl3m37ppzb569y539bi0njkq26wkvf0qw1g51irvz6";doc="122xkp4s2wqqza5nxlibxyfsxs21n20xn3y5i9lym0hakpj7112m";source="1mbb835yyrzpk1qlqci0zbvwd64amxqav0z3vnwaxxi14hqr9laf";}; +spalign-42225={run="0wy2kliv3mrcqvandk3qbbqjbri6xq69d5jsi80l7qdiij86z3g2";doc="0jp34h19q4588rli6k0v5kg47j6i1gjpjgk772fkb7l0f5wln7k3";source="02qzd21qzb8s2jsip2fr1jgf11xd7xmiyi7fv0s9ylyfr259c5b1";}; +spark-otf-62481={run="1z9k0dnahkq2nfqs3plpyb3fdj48x8vcav0ahykd554fygv5h4x3";doc="07pq90xx911rdjdyr0sxg4zqfg1yb5kn43xc5l6hn0y81m9j151d";}; +sparklines-42821={run="1mb6c3mial9ashhvmjhynczjpb462j18qyy2an4ckgwgc46pwhp3";doc="03j6xdkvsv5p71bifmggf69w3s1n7758yii1caz9p9bcqmqbnrk9";}; +spath3-64818={run="1w91n8mq9bzf7fwfwwhpqn8j5w7plc4366a5pw56x2212n75pzh5";doc="1gy8n6rhxbqf64gh4xbjvy0dz484vm53ld3i6graly3qzdrwkhdq";source="1gy5p59n76lh0k961cysc3qpnnhppbcd7dmspjijca4fx2v3ckkl";}; +spbmark-69927={run="1izn0xfdc8gc3apn2z3f0593p036mrpcdq7vb53ygavx9qdyzfaj";doc="0mx9ggr9zirkb0ddqsb9xak32vyg987ddhkbkzhk7xjg2q62v0lf";}; +spectral-64528={run="1qjvxyjxm81j3cyajki6jv59k6y2m8nv9kzhj45d7i56za9klkf2";doc="1x6sixvjk4sk5r6x3pgppynsgp139jm3cc7bv83bk55757jjd8j5";}; +spectralsequences-65667={run="06v0sb1xa28biv5ak6nprdcjzjdm0106rmlgm4if0jgmax0hiqpb";doc="10limf15cp1bv933m45s3vdvxwzbpd5hard4lqff2x8ay1h0n1wd";}; +spelling-30715={run="08zkbw4fdfmfz1pxcr96xjhrs8lfbf6sydp8crp8110fikksjv9i";doc="1wm6r4rhkmxmc66zx9nvvdmjaarx789c33vzm26mbd6ylv5qs1is";}; +sphack-20842={run="18vav5d5846hzn6ry7ypnbj9vmxxxxjxm8wpxah9mlml6kjy5hc0";doc="0caz10cwphajhni7rq8klh7x9m46hynbrgyr0c7fjqs8jfdva4k7";}; +sphdthesis-34374={run="1a0a4mwf14f4076gwiqhgdq436l5fxw588rigif0mcpnmmmlkxwz";doc="0b6cgkwb4v4v78nvwg2n1zgc3ww9fnkh43s4qb3g3pdjc399dj3s";}; +spie-15878={run="11s8phbfna7wwx1gji1mpl93arvxlgfpxif4c46xia5spn4i44ji";doc="05myxi72wcagb55fk8p8461vag4yl79ilyhfri8il4i72419ip22";}; +spix-65050={run="16cw2sv43nh6qsrc1681cw1035gj78fvgpwj79jb91sph80wd4kf";doc="0z5b25wv1pcyjc97w1qd1lx1l1rj471nm9yxx0rkd7qyabqflyj7";}; +splines-15878={run="1dynq4y6crzmnn7wcana8klczvzzd2gkya41qpy9w6nxwa2b6kk5";doc="0lyg56rnhrq620f083bayssdm36h6wl05d8wld67lf42056kxy8j";source="05b9dwykc91q4d7xmvq5hg6vznsy4axpi4w6awr6l6qrrqh6wz71";}; +splitbib-15878={run="0z2vnb51ksqp3i11903mvgaknvxl1azwqsch5aaq14y7fp9kcrah";doc="1vb7snjy518hcv3x0cvr40bzlxr0nqb1ssqagqncyzzpg55nv9gl";source="1sgl95vwqrp6k4y355d9mwkqm6zpw0g69p87hnsmdbd9bqkjvsv4";}; +splitindex-39766={run="03x58nb9bqd1fn3k9fqq5rdafsna9rbxjhp44dwzig8kp81f0g0i";doc="1v2wwls8fgb1rhk91hrjsabxj6plx2bq7h07fyqxvl3982am9wm5";source="06ksmac3dxacfq7j4ad7vy9kls2rnay1hww3kgbp2sgadqvwmz0z";}; +spot-22408={run="18ich1w6d68xa2p65lh22yfwdkvgbl9zz9qmd4yx84ljzby49zhg";doc="1flizmkafy77g30ffsispr2m4yaqyfw5hvynf7ppph1q07jqdy0v";source="01sx1j1sxr1bgi5h48ij02nwawg2wgg1c7mx22q9r4sbn9mprlbr";}; +spotcolor-15878={run="19xicma97v309pbwgdyizrjwwnlas95wq0d2qlyw7m9wrq295lpb";doc="1qsdgagx45z4gha0y7z37687jxrc121pr592b1xcy8bhf86nimhm";}; +spreadtab-68256={run="1jkc9h4a3cn5k7p87hdib2jk8kkmcn98cx7b8p7p9fm3pjac807r";doc="1xgy9b81am6pl835sf04hf0srpdpd7bwvxdl5cd4pr784xgfvdb8";}; +spverbatim-15878={run="0s7042ln9l7jvb0vyrmg4h4fdgzy6vaabr62n7zlkr8pf7zd8nvh";doc="1rb6gyq7j5m14d8707gkqv1n5ifk1y497mwflhigqgyi9lgcvgxc";source="0f3spbpb6icwm84v4lq0skkx53nw3i0b90ik0svd9dhg31y24c43";}; +sr-vorl-59333={run="0a87b640qdc7bysxlgr0y63znls4ryjgibi3ablnw9q3rhzbbr7c";doc="05zpxq3qjhziidiq8i30hj295yh2qa3g79lx9ywlldbkyhq928cy";source="1ddwga4af9k70c05v2a8frn3q779d2pw43h5bpfks5w889ss6rr2";}; +srbook-mem-45818={run="0znvycl1land17f2c9cq09hhhg4b677rixzjc0hsq34c91s3xdq5";doc="1nf53sq2ic8y70z0n28kz27lji35slwkxrn8rz0dsaas73ga5k2y";}; +srbtiks-63308={run="0bghfl9fix95nxb8zvsylb8040msfwk0vazqkwvc75v08idigijx";doc="1z9fyz7kjqis1rblrdb2hmj2507bifg07yrigqkn2cgm4wsg0cfg";}; +srcltx-15878={run="054b8g0vvhbzazxs8913dzir7qb6x5q5pfsiwdp1z1awkpafwkmv";doc="0fidv12pgqck21fffgrrz2a0pfsb01fsyld8qhf5r00915aai6h3";source="1sj23lc6k8kwd11q3sq6wbslwl4fsc3wzp45w4by3mw5k1q5xqcf";}; +srcredact-38710={run="1rqmgpxcvvcmzxdj6k15v8z4i4iq4wv95whddpi93l3n0zv2ihmq";doc="082ff60lfnapb570ps3g6vjy2xn0gjjih6y4nm3ry9i0k1isbk0w";}; +srdp-mathematik-69288={run="09pxklmnmdwiaf0dgi94aq33v5v3ml7ap0xs9s422wswhxx8378d";doc="1143sfcqclgsqkcd0ypcyp37hna4apbg16kvi2146xkz3gh3agqy";}; +sseq-31585={run="01vqjmi5vpd2s00sqqj6nlwgqvz9c43igg09w282khlca471253l";doc="08xq5fjn951hdpbrvzx6p09a173radfh8a4wzhmifd5rca9l7asy";source="0a1rh7s1fjxn3bblqz4lzhd9812d9p71wwww5hg9nnpn3gjvdr6n";}; +sslides-32293={run="12vg8fdv0di8vgnw8wj1y6rad6izmczfqzy5pr6gpflzmn14fbq4";doc="1dssqc7f6260hl527hhqq8zbiyszb13z3bny3rwjblscl9ia29yf";}; +stack-15878={run="1wadfhja3yji011aawrp3jgiqdxil7lzvkd1pzy9c9y63lzknfg5";source="1qv2bvjs01lk9b86rzb7n0lk2a4gr870qsnahyrd9dqdnvvz4n9n";}; +stackengine-60019={run="0m0c3sgajlzb7y598y0rpm29mrlsxmks6a0hi1b56vpafsi906n4";doc="1ga71wrnd8ykhw9x3a3yxqicqaarzxncass1lmyrh1kndim79pyi";}; +stage-62929={run="1wdvq1izp0y8b7mzbqql3fc9q8j7jkrmm4ynnk3h2zlg24lgi3gv";doc="1jamw0i9nwmk50j5xiq4pznyjiqc2px2s5993gyjs6hwxb28c423";source="18mw8338ls16klvx7zbdr1qc0z64xgnilr79zfldvsw10fp73apg";}; +standalone-64677={run="13bp2iyfnpyflps370mzrxk1vkrybamam1f47ws4cafpz99nvvyr";doc="0waw4vqxh6nclh6kp17nhb4i1hpckwraf5clksxvzgiv25cxkada";source="0a4k7lx74w035fvj5q6mnzpx18jzlghz3lavhsl9ssqjb3zqmar2";}; +stanli-54512={run="05mq6zhs6x5qjqk58gwws9lw3p876bd1f8a5c2jvb2azjl7d9r4f";doc="091knxhx7jsjiv4ip0z2jbazvv3xmbvandbraxbipp4zqqakb8bj";}; +starfont-19982={run="1bf89j0qqyzih5w9ban03k85v8ih0d16sil1sf7smzmqk3nhmrz8";doc="0rjx4wj021ri26zxdlhkh71q3d0ygf3hvcqghq9fwkbi0gnig1r1";}; +starray-70604={run="1gkqrf8k701pin6si2lmri0a0jml7hmkh2fhnpkn9vq54wkyjbwl";doc="10xza2ljipqp5cq8nv26dg5y5xw9g56s9r51ljpsxk0yxpi2pxwr";}; +startex-69742={run="1d6c54hm9jdi882srj87drkcxm7lldb4g60lbic9wwzn9kpa0ynk";doc="0ikmb30ndmj0yhzxy9mba3kqxdc5f8i66sji51ihjcrlplj3jk73";source="0304dzv4nzlcqi5k1gbfnx823xaxq84ja4gwh7qg941q152y7w9n";}; +statex-20306={run="11qpdrcszbsrasbasmk6h9wg5r2a11pm116i16h7mvw73vjaq76f";doc="0dkb7c7wavn3qgndl0g8jpkx1qr00c3iwp6d0r72znggl4cznhsd";}; +statex2-23961={run="1949zszdv000dw1dx1jjznbd79q73fjiqnkq2axdbxffh47ls1dp";doc="0fkzbs76yfyygscazn4dgphs8g1byzg9n3fbdg6pizzncirbgh6c";}; +statistics-67201={run="11szmc6f380si38il9vw78n30yyfmmvgxpp8f8p8kzb373d3hs9f";doc="0z8mx2gar2fn97n3x01dw23l7r4ckqwgfksgmfdj7vhgs51wsv16";source="1dkz9vdcnadd1xd4k9i37a3mpn1bwm4zf3c6bg6rvzxaarrrci4m";}; +statistik-20334={run="1c0469cxfvyg5jl9q1pyzras6fk3f6zbgigaby0iav34imhg7zy6";doc="0fih9k7mpzg25h56x6zzdbdnhybd25b7hlv0pdbnlfb73s7h4mcv";source="0i68y5ynymx339zgxc9r8dgcflm5468gd6cwn9ngpnjvqqbas3kf";}; +statmath-46925={run="0imcx9nx9h5fi53nwg82n2d9s21vlngdab7znyg1z5pdll0df043";doc="10mxwgvjjnk2ci05ikml35q64c82c7dv7rjwajhk03gq8ljq939j";source="1himjc8cn3j5jr073qpp4mfyi2cpr0czf7iykr0w6b7722kkqdh1";}; +staves-15878={run="0pb7cghd2p1f7y5x19x3zyvaz63k3nmrwd04g0yqrl3774fvnh1r";doc="11i1rcc30lnm8fqmnpmk1hgz2fmm54hgf23ich279aqfsk2pm8iq";source="1y87sw1qrmvgvayzwz2i6qjzvx952h68123fhhv67ga0kpxf9fwi";}; +stdclsdv-15878={run="1130sj024qfsszjx4adr3bmmr6594d21bcv3ixmw75y85djha1iz";doc="01li1x0cc820y0m6dmivjabnbhz6v1j696cwx3d08fiw4x7n4jiz";source="1ypihjm5r0v2isrrv8152fp59ynjn9wmhp0ffx508n7kih9yisbn";}; +stdpage-15878={run="13q3jc6snrscq7bl22myd8rb04q9q5b0a3xvr609j1lxczbs1xnc";doc="1kr7851lc6lp4aq78xc61nw495qnhnrbsz0w2yyldwfh07h4byzb";source="0ygk73pk79wgn4qpg0niv3d0a4l8bdhrdvv1a9s8g6ayngfr0nsd";}; +stealcaps-64967={run="1n6922kmdf5ahc8i3jyps6w5r5k1yhnp2x1p2bd259mjd5ivplyx";doc="0djb508nm3l88p33736kwv7z309nalblb1zfijib7ksqq03515di";source="12krgi4wm37q2jcag29mflql1fpry8zhzxn3bfbmwh6cna8i6042";}; +steinmetz-15878={run="0g9ll1hsf82wll1ng5lc2v6il3l6pdy3dppz7k7piqqmifzc8ifz";doc="0gyyqmllgp6dg2g4nh5q5ycnixlyzc6xfmi3szypmr1rai1dvx2s";source="07fj431nraf7f9qcmm5bvk03cblmj15xcsbnhgish4rxqbf7clsj";}; +stellenbosch-68039={run="07j555jrcg91nk6rgr6c9dq8y9b3i0677j339hlcb6mk7949nz3m";doc="0xrpmbzaa4y3v86zzdws9al13v723k5yjbxgnd9l985fgq5w21bz";source="16mmz7pq4y9blxskrxjq8w15zq9vrbcr6nj8ynfy13b7wxvqqrcn";}; +stellenbosch-2-68183={run="1mp3sskmlxmr5jc00rh5i1vyikipmgvc266djbx8f47adkgqxfl0";doc="1v7drgjgiyjp4q714lanybp34pkxjn73w4s20lch49mpq0qfnfqn";source="1ha1ps4cdf6kr6dix9wnhf2672ic31n04vhzqjal12lcrf00pzi3";}; +step-57307={run="1r2mf2qlcksllpaakrycmcrpxfq9c4g7n18ip13ykp92fmrbcz4h";doc="0f0hph5cjwhwdn2yyfzvn1jbkh8xm71jw10zagbncapfqfgx5h62";}; +stepgreek-57074={run="04xldk3dzcr1vg1xld4hhwx5xzi2pr0v7gn526xr8ca3m3x5mwnd";doc="179zz295nxpp21p6xhrn1r9ka68i3l9l8bphrb2833a2x6qgmil3";}; +stex-68569={run="0qpc9nqi6gkkwc8rg00rkvli3kgdfvxn2h23paxmsf8jsf74c4lv";doc="1b855d0n3m2glxf22j7ifn8sf7yi9z4s55jnb1dk0pfy3i8a5zf7";source="0xm55wcxd47z57pmmls2nx6f310nbjzmn05crynfj4rw4310vq00";}; +stickstoo-60793={run="1vil4pran5vkgzrks8wp2nnwddily3pkfw9vap1l72c5rcxsvii8";doc="02h21jbb19cl24ds2r1gz3js8fgxhi4dq4acw6fvq5kv8izqr9mz";}; +stix-54512={run="1jqrvkx444hvfh7246g22k02jm00m2cnc6ffj36k8qdi1s5m9dkj";doc="0vmiariam5zd37zq2ni9560kjgia89p52cm1phxqp6gp7avfyl7q";source="0jjxifyrkdwgbv6xvgpk9ji6qwn4wr91lkdprcdjpmw9b2mwflj2";}; +stix2-otf-58735={run="03ilzmkskp2fj3jwyvlwz8b2ryvb1rfj08ciqhkhi9ddygzjk8xx";doc="18cqnpabka16kfq09rspzgwmyh0fva77i8676myf4wg805953zgh";}; +stix2-type1-57448={run="0xrpb3y7wbpxdc627gn9h6s3sjymczbhxqqi0dbicrcrd4065kp7";doc="0kqh52jkqgsfdwj83wks80h9v326hxz1zqh2ls346kc6gz0r2p9n";source="0ajs9ri4v4jw3hp64hflxwqd9sw75sk2a56lv57qjzzjzkc51243";}; +stmaryrd-22027={run="1vvnhyk7fq6kh1jb2zd19r6qq1j8zzp14gyrqvw7yqm5amjff7fp";doc="0dvcn4yw7qlb7gh3b3z9vk4rx12b1086glkk0x21cks87kphdxib";source="1wmn7bwahn28lwipkpsla74wn3a018808rmh7yvxdkbxfbzcwqcz";}; +storebox-64967={run="0vy7iavq6qqxpmwhm9cz4gxp67nriq230kcf1mr1gq2w0ncy7kjc";doc="1crb1bkra0y2gjzf9wndr5c3nvc83v57lkdglxb8v1pzpy7halmx";source="1ybpjfrria57fwvr9kriiw6y76ivwvsyb6ayp0bi750smsv8k5n1";}; +storecmd-24431={run="00xk8l8l99qpsmkdxcpccf8g7av2asa26qrh3bi0kkmapm7agk8x";doc="1n5vw689y9y2kakhkyqv47d5cin7f3xqfz8bc3yncdrmgh4kq82j";}; +strands-59906={run="0i2k3b3kb570k5h7yag83gchk9ss971v8w1xqr2kb448f1yqkjr3";doc="1clpm1i4a0477zbrixscwpg6qyli0y5vp61lblgn4iqgw0sndhlz";source="0ckf9ipirn8m795df5za2qd5w96cxzxmmv1kcn0gl4aj3ypia6b9";}; +stricttex-56320={run="0igsjl8gsdld0way8nry9r50ibvm0aj8g46ki547c1jhdgmw67fn";doc="11pyyvsxi2d4dfzv4pmapa2ffyp5fky32823fklcffd2i6jnvsbh";}; +string-diagrams-67363={run="1r1xww9h5vvvhar2nvkmjlkv1s57qv53cz582mh6vwg6v6w41nj8";doc="1nccy5d95ada03lh1sfk7rv2r3qba8rd2g61wavw1p9cq40r97lx";source="02mzpys2xw7hd7mfn4z5z7cdlcafkwhiibxnkwya9h578g20ji1a";}; +stringenc-52982={run="01xnfg0mcp94dh33rfzphk50kjb68bw76kf7jnbsnjwlqf2cr5pq";doc="00hbmjwhas4fpcx1yg016ggqv324hdc2aklr2nx5m5x0i68xq6qa";source="1ir6041286fiz8c5zpsbl4cq62gzdrdpj50aqv5p6b1lqd8bsfp6";}; +stringstrings-57097={run="178qqf3ii5kaw5rpjazvf78mjb0aw4vnqzxpsv9ahbqfxpa16894";doc="0x6hcdp3hlfnd0vn3inq92nja4hirvhg9m37zmsh9ilnnz7dk8lp";source="1aryr9b5d4jrj6mc9cmbpc11l2mqxlxsc16c5h68ql0i6z0bpsz1";}; +structmech-66724={run="1l28ljkgzxirg31ai7gb3m71kcdzn3gif8w9ssiawaifrz15wi50";doc="1rnmrjpmzzidykm3al7sqb2q7m435lpjppv7xyl9a8zlkjgvwnlc";}; +struktex-47931={run="0qkfh53rhy29zapn4zr6n14nmximfyv8rbgxm16qq3l6mid5jnyc";doc="1nbbqh3g42qvrk478q2v6snl1lbmfjnb07jhx6z53yk87pna8gmb";source="0j3bprncnkp7iar2dh46bqr3v9zdvkk9c2w9kgj523bcyzw48zyx";}; +sttools-60736={run="1sxdf55j0g6gm2h486i023axk2m5ik37ndayjs5zxxkj6i3sh4vw";doc="1l1js9bpslrqih0c5cjdw3d5nkcx96d4idfxw861yx4lhxwzdq08";source="1c74wjq7r3jqq10mf1d87v6fi14b37i90qavwcx6s5bhhrpl871z";}; +stubs-69128={run="1p454rfdp2v4zq3vx1716x2w1cr1a6dkcwnj2hx7w2jn8118vqkb";doc="03la45gxcy1l1qik7kgcb518n3yvzwgdi5x3ffzfpj4yp2rq994a";}; +studenthandouts-43516={run="1007rr5m0lbfib30bkb21nvpq1h7didqijg6jsbprmkgsz1xfdkm";doc="0sqfqxypkrcyp8fc60xsb1v9nbw7h1xrdai626dlpknhnm00kzmj";}; +sty2dtx-64967={run="1nrn2xv4r39qa2glfw4kalzdh5w2zlx4vaw0hplnrnxj8lwmpb9m";doc="16jpjskvsk51sz0j503z4dljwzd1ymi2b06z9lag8ab5iiyhm80j";}; +styledcmd-70496={run="1a3k6nxxdq1k2y5q60rq34iys8yf64c112gr9knl1yd7rza24cpm";doc="12z3l8psjbyraz0phjylnjl9ghdngnbid7427nffm9har6ppg0hr";source="1gwrrwfs80ssi9r2b39js9fnfy0kqsi1xs1mjjx7rj94zj014bb1";}; +suanpan-15878={run="18nzb8qbs7q233f68983q6988inwc0fm79clnpfpr37z2p7im95v";doc="0xria0g6qzx528dgwb2q23l5iqjzj8xix1215ciz5kmrp2h4fh7n";}; +subdepth-15878={run="1l79nf05yrvpzsbsjyrvyhsc4kx7dfbvx57qc1ymzk2zphnfw4fl";doc="0g8apcawmna380iwys0dvshrdi51k50gavh8wgwybcvfjib82h4w";source="0ac0l63sisx6ry7m3qlf0f98dn7gml3pfxlyiab8664cv43df2s7";}; +subdocs-51480={run="1mc1zqvqpw5ln494c6afx88gigkby4zlb5i4gbizs75irgyrs01y";doc="05m9pcg8dhk8rayald2mnzl0wa7z3w8znwzw2b9ifbxz3cp5k4d8";}; +subeqn-15878={run="17jhiyzv75q79mdkpn6vj60j61wr8yf8qxz63g16dl4xf1xvlqpv";doc="107jnszs764j7zr9hywn7dhjdyqd9mb6mwyqcilhgyz8ggpqpz68";source="1gwz9pp8jzb7fsj4dg797rsqynjbk8q69m8xjzz4pbmsysi01ijq";}; +subeqnarray-15878={run="1bj51jrpvid2k3pd8sgrg85aq4iqachah22izpn949zvjvhrk81s";doc="08aaqv3ca0b6pnj3f6h7c0l2z7spg0hmzaflxrgxbnndn1zh0yhj";source="1slm6rfgf599d1mkww44kcd3lj88z43dr8i15imamxr0dz05jiav";}; +subfig-15878={run="16fs6ax4rjnv446x56jydx59ahw9ylkpq22a1dfnnyf8s4jm7a08";doc="0jm594akhy2b1w8i7ccv23z4z94lbd6rwpmr62mg1h80af806biq";source="1aprv7xqcwnl6076w71x5x8kspa1sb5hlpbcdrws3slfzm40skcw";}; +subfigmat-20308={run="1vx7qh6na1il98gla65c42j8r00ihy277l3s79jab917b3xmrr85";doc="09n91ami9skfmrrrl6j7p7wy62ds64zrr0m66c2wn0pnm6lanmxc";}; +subfigure-15878={run="02b2y8isk2irxdm7bcmx22v5lbkbhc15jqpx0dhs61dnzb5x7ag6";doc="0lhpw3ayq5p15blz7pwkg2z44g300fd2k42lvyf7zii67x2rgjh9";source="1mvp7i150kxin5819cvyfwwzgwmiq1r89m2ywjhv87rgg1v31kx3";}; +subfiles-56977={run="10nslhm56kp5bmzr2nlbm40rlp3i02zj4z6vxj8w6cj1vv7jrd9j";doc="08r52aci5ab4cv70kbrqq1ak4ny627ks43nhqk6kn649pcahjqlw";source="1hmli1qvgpnn2bmllf1w53wjh63zk92dv2wvvi6fzjpq0q6lqhwg";}; +subfloat-29349={run="1ibpaj98ibx67x4kff1p0cnzpxmhs4yyqs2y4vj6as5jx43qnwj9";doc="18ps2xbqdf7pgyhj848zw1sbk36drwkpa0g1s9mw882ynz16gl9g";source="01c11mbfyynpa1yi0arlqcaklikr4sr83j69piznabj5jhb45nci";}; +substances-40989={run="13nl4xc0spsg4bq3ld0fv0612kac2z017zp8hwck2d8413jwkj8y";doc="0xbrs7qpbs5314j79nzcv408ghhayqxj2n0nfify6isxh85r1ks5";}; +substr-16117={run="1qialx52sccay00z85z001xsm62ajvbfxqxc9ps0bpmjkcvvgad4";doc="0zfcggj17bf26dxihkmqwn80pdir4n216x0nhkb3v17q889q903n";}; +subsupscripts-16080={run="14v5a89iwm2ykjsm3jxgbqsm5nba444yh8mzqf23s23z7fmcmsqb";doc="10swcywyb0jdsjhm0cybvmyc9g2ksxq60bqaqnp23kfxp39g9rq2";}; +subtext-51273={run="030f7sq37qjn99l1z6nx7qbivhczpzhjm7drxhhhsssw4n3mci7k";doc="1m6zyy09a3193w0p91y8g66n8bnm80awzg2g8l195n4p41l8vnkw";}; +sudoku-67189={run="1nyh5rv8fgs0lgmsjgkfx24s3lh8pph6jcp7dx8nb8q2ij8ia4pi";doc="0hdvzb1vcrlbis4xsgzdnbidapqp7kdaqdskdha5szjw53xz77ys";source="1rwwqpqvmwvq26ycj2glk0k4m1vlbjrxjp0l20qnh5vad98a1x7p";}; +sudokubundle-15878={run="18y4x1g050ircqh3nd95m45scb8zgjzi03cj3n7whn207dvapsdw";doc="17mdxysiwjp3ii1qhknrxw07dcds57qbm986583xh69bhq08c4sr";source="17g96rhis66gvgbm1857ck4ri8nz3isdlqshfx9rdbpgs8x58i0h";}; +suftesi-68204={run="12cis5ynr5ddhqis0i5501sbxznpcv7i4rh172c7jm5dww2vank8";doc="1bmnzdnmzn4j3fpbfax4m9xd8gpk2vd1xqf5z3ypza46vh7nggxw";source="1x001l06wnfkky2vng3vpkj0cwv0z9f29h09jpf4yc5i1nn2s9rh";}; +sugconf-58752={run="1x2nrvqnl65jk3amclgwrk2x1dscncxajdf074a2d410w1vikrck";doc="16w8nfyixsr7l2dn1lbwcscbs6m4mczql9gmg9wi16nr8d7pm8si";}; +superiors-69387={run="1kj12xhd0psdz08mx7k2kz2maaaam29s3lway19gcawr156jp60m";doc="0vg6sk9ad181y4g53shj1j0mdrcqny4hjdfv3kdn5csm7h5kqq72";}; +supertabular-53658={run="10r18kzg7p8s2wp1nydvn5f5vfbailcypqb7hkhxyjzpkdfrp12w";doc="0cw3vfh4mxd39n2w1yk0nxjq67pb8s0kzv6syr2s4x3p3nrml822";source="06r03i93j8rxw6ddiwmshb88q3h1dc3srlh4djwwycjbgp66xx87";}; +suppose-59281={run="1157v4laxbdllf5vqlnsf4cyk535xdq968q33gla769r1vv4yyhx";doc="1cigx59dypmjyv11lbf9fyfh4krl9gyp8jiwirhb9hrr9jzy7263";}; +susy-19440={run="06q7nw6bh9dkknj1jzvy1wljh9vn49z7mbhr5d0ydv10mp9y9zlv";doc="0dsr3yd5v6i240f7fgpbdlp0dig4dl0376ssd7nbg86scl63k9iy";}; +svg-57010={run="0h7ciy6qc3awr2317npp2xi958s4rz8kfr137s2rwpabmkriypsg";doc="0c2ibjsnjffp6rr4fk6b74j1vm6vfi0awvhbpz4yc5cvgjw733nc";source="1dh1857r254hiyi0sjdm3271h26wah74b67fvhmkwwr0wxz7w7vr";}; +svg-inkscape-32199={doc="1gw3jp7wph0ys6372z2rgjwlpmmawdax7xpgrp4hzg5hxz748pn5";}; +svgcolor-15878={run="1jjsjh5qsra0pi57k4430j5fcjdsdb9gwrzgf9bhkfrwr1gfsmvs";doc="12q998m0irshvh46ndv4zzpxamg6jwaxx8c054av5zgpvb9g5x1d";}; +svn-15878={run="1yvgad3kgly04sm9cwjmp1g1sbnsa8rqqb6wvsip285x9kc6lfjz";doc="06qfqmcdgdaf9ghlpc2x8w43w2f0sbaylyzcwyb3krw1d8p0zixl";source="1f37y92ikznxblq6nyy2nkhl88d818z6wbkf901cpw8sjf79a35j";}; +svn-multi-64967={run="1c1gq7li7p3m16xv5ad3s08k5wvzjij72yl8gdpjxlc8z3hxxarw";doc="1fwagcrmfhz8qwajrpj3bh4r64hm1637kxsqrwfxjnxfrk95v9d9";source="1799jhirlv8gvnnfdh4mwsclcsrr8919wl7wn8y88xwdamiib282";}; +svn-prov-64967={run="0r4s76i89wh1fjrmf9imf6y2sf96xznznyjfcivi3sp8dvf5ln5v";doc="1al7qiwd5ajjpvs2f90p7frlkd389p1ama019yl0nnxc1l45m067";source="0cg7qwgv20jvvw6bibkskj3p8jc5l2mhgzwq6x0wzy1ds7x1f6b7";}; +svninfo-62157={run="1npqdiwj6lnwgfnzb4iiyjl6bl55pjc8mml3gyrvd36j2f6cl1z2";doc="0728psfyzblwp3nciax4hncbf7sw4ww4rmrlz4jyrpmnv80qjp37";source="18rcrh0kkqfz1k84my8adn2a8y7ppjprcy77pfqayix4lyzw6syn";}; +svrsymbols-50019={run="00wr6lyncnpvw806ff8s49w239sqpc8c5zg1776qyhjcpypkfgym";doc="03jdqja9hm58w65vp6mf2q4dd2i1n6gq7yr9p2qrzjm33dxycjx8";source="1dsw2z368hj4sixfy733r19yvnx0mi2qzff8647i6faj70lrj6ry";}; +swebib-15878={run="1y5rrhrhcvjzz17lsl2y9h5qz0zl9gn34xwwprnns7503d1d2nfy";doc="1w3fl5qg5hng8gsnykb9q86ddz48jdbyghizf5x31rjwiim53q6l";}; +swfigure-63255={run="1i21rks6l9vb71hxv5ysn2q9qdz7hy8h8ljjxia64qsxjd4p5k7r";doc="14d47ga8bacw373w7myvrw92rs5jbpzdqcsbm834bv26av4vqyfn";source="1fbqwdasg56sbhs6hlw95x7zw6annykddc6cc7scm8267z83r1jg";}; +swimgraf-25446={run="065y4xxg85kdcv3gwp4xiqd1xdxjkng9xkdyvlk61zfjv5pks03r";doc="17qxnzimwb828pby8mx2xlmjd2lnnpd60rdn45455x8zfxdll3s1";}; +swrule-54267={run="075mshpyi9gxbi3n0hbh3ygidzw1daxy697lhc7cc99i39y8scpi";}; +swungdash-64204={run="1mr1x0g86qdh5nw39b56da3pyw7p4cq1x783rcqqw2rmvszp6zqd";doc="0g11z4zjm10yfpbs5876xsxh2xhlid6c45r5bzn58h2zn1d7fnmi";}; +syllogism-15878={run="01x5kjyfm5ksqig5h2b8sgmn05ws0a65idv1xh5l709yp2i35120";doc="1zqljwv03f755lzc9fhps5xh2dy6r0jdsvp6a21ka11kqq696vjw";}; +symbats3-63833={run="1rkc00q12f8ysw3vcn15hk626wzmy5j6gisvyzss924482pp54dv";doc="1cs9vdddpv7ymgicx005r50ilwjharqvszykf35lram9d2n7f40v";}; +symbol-61719={run="1pdkpr86bhia5hcmf7q3nhvklnsga4mqqrrirgl8a7al7x6q3ivs";}; +sympycalc-67087={run="0nr281r9f5d68kqsg2psvhdzgy24sdghyd9h395q666mp05z787f";doc="1ik7h5bwvnbv8zqq4pppprqwkrb2fjd68l5fhj10yznx38hh5x47";}; +sympytexpackage-57090={run="0d77xd1xl9wc6qbd335kvhq8gbvvqzgqxblhcmyd5khhg3azk6sk";doc="1y743lffzk65wl5nwi490wnmf4xaxcnkpicmhadcvjcadvhrnlxn";source="0q3cl06b2mcpn5an1m7c68c4c0swmgacj3afqb38984dcvap5abv";}; +synctex-66203={doc="1a2nlmbib8723jjhf6xxh5rpmnd5jv3cd69br4ihchbq5ipzircp";}; +synproof-15878={run="01bx52ckyg4abigyzfcxi83jqdkczvsj9b80rznqz8vm9yrbv951";doc="1kvd3vvj6yx1bfqbi858qglc31dx03ish49q0lai0mp1814n6fqh";}; +syntax-15878={run="1gd38myk5lf5fxlx1j8cvjv6pcpcr15r0370ikxf7fczv8s4ab2l";doc="0l6rkyidqvvhkrjxs8y316rssayihqimbyqwvmdzqpnfd16rdxpv";}; +syntaxdi-56685={run="11l8609xj9gz2zkd6b0ah41lgw4qhrvdjj47vwpzb4sb1sirsfgw";doc="04hnwc8hc4z88wxrp81balza27xjj56ymv4wb8lvl7kg0087ldw2";}; +syntrace-15878={run="19vx1iz2zxv49znddhcsl7aw4i267fmxhxpszzg2i9z0klm9b3nq";doc="1dzy8pazcp3lfc009g0n1h0a6q3v99ii43pza3m2gkjvbrb5sk00";source="0hb5iklz2c7zqrl8zrhkn8k7dj1zgk5gvf4wpr7h32sa83ajqrdr";}; +synttree-16252={run="1n2n1q2pwx3fi0dhh3h5dj7s5wrz2r5zpx77fmxjk0c3d45c8wan";doc="0rnghg1459nlliwbcy8r60rc9si3ya35c7sl5zqh67sfwla2ixps";source="022b2sn42mfdnska1cvqjsafakah9a908rvyw0d326d7lxx8wrx3";}; +systeme-66655={run="0agy0h2zq8n6723w27psm3azigf2bsw4s80701xr0zz6kmlyrfg2";doc="1xxycz86kxljxg1np3zd6jzwanvp3f67la1k267z3w39f5i63x1z";}; +t-angles-15878={run="1p1h0gz1k4lr7rmadhdgb7l3gp55w12m3p88hy9d4d0ryzld299q";doc="1n01pg82p0yz0b7ph82k5ha7a9j0a4hc0489xq9pf4kbizh7ap4d";}; +t1utils-57972={doc="0hdk57179nn57wnmvr3jasjavkvmrn6ryph6jvjhsfqprn7bhf1y";}; +t2-47870={run="0s6zn41dp7vzilfyk92yy5mbb74lcrpnmhrwl9xcj1dbadi97nm6";doc="0wfm1gy3dyhfv2xzjfsky2fvdhki5r2ndgvzliq2n0kvfxf1sgna";}; +tabbing-59715={run="19w1lnal4dw6aw6f27z7zf97f78s23z87s1d3hx845mm3j77xyhq";doc="1fl0schhxy4njd70dssi0bprd2p3hzpq4m5v9zmm0mbi4jlh653d";source="0d50zs145vd9rjqv0mljg50q1bb6j3hsixr9x3r6b2yf39jjyraz";}; +tabfigures-25202={run="0fgdwqd2qqqg8k077p6cjdv2ag5z0953jh0d69gjxfn0bc11yyjq";doc="1j1klsqcig3gdb4jvcqvm4kzb5zj3fm0mkliflkgm7sla99zw564";source="1zkisnxdfdvx7gwgqjddp27sgj3a2qy6mc9vzfx75qf4c6y3q7za";}; +table-fct-41849={run="1kpmd1qynxq29aanvaanq35ihiv0d55k6wamxdz3lssicrn3f2vr";doc="06jr9wmjppzd9m0d8hgmchnf78k8r7cxiqlyf3i6apdhjf6hcxiz";}; +tableaux-42413={run="09pi8sm17m1v4h362al448ayhj1h5n0krdaa7zsys00l0w55qm3h";doc="06173sm4yx2a3mfadax16nqj6ggn6yak85l63jiaqdczwyb09kxi";}; +tablefootnote-32804={run="0i1mj9bq2hj4d7y7za2zj64p5dfdvsfi51147as5kfb6ci90rc56";doc="071xk16ck9r0jip847ikb2qjyv3ghf1m73w4s619zilvm752c0ak";source="14vrh8c322skk3rpjpr03fgzbm03khmhf3ifh2fm72yb5cqgbbqr";}; +tableof-59837={run="1n9faa8pcnls7n1ghqywvzri484j37nwmhhday1wa0rzxqhs5vl1";doc="1aa9frbqj6676w0v4s2n3h9nz922qsiafh7rxnmw83bmv93sdydz";source="0as1hwba4vski9vby84j48s88ha76vl2h3yqvn6qkrzyh6cg7g3p";}; +tablists-15878={run="02sffbb22hirw8mdijf7scxbivipmqw828qzdbc49vaxq7ggmzib";doc="1fwhps6a0j8r5zqcksdqw8gwa55rh2r2la3iz7wc451zk3ddbxpr";source="1wpir71xwq7xhg41l6sigp55n93v94lashgi6lgr0g9ad8hh3y4j";}; +tablor-31855={run="15xinskbqjj1dmi1fpvb6slg8kk3g66dm70z9f7dx8bzb1v65zwz";doc="0lmi8mn5k7b5i0n7bqhagjkkzs2niy9852r8r0vv2c8qfbpm4hpm";}; +tabls-17255={run="17bg083653km6v92hifll78vs0p9zwfnj5rbw1pcl2siizf3pfj6";doc="1gnk4blwfikqshqjv4zd4cykp1k6k025h7vnbjrvia11l6kcnavn";}; +tablvar-69212={run="11xcbpdcl39r8lacnvqyd8j3qzbpzd6q15ivjwh9ndrznkxbpjpz";doc="06gh6a1qsbgbncl13jybpprmdbyfddwyyfwz1m9fs5b6y5dr2sck";source="09ixxr26sw9507my98p6dmnqgk0xw14h1gfbav6f02yxk3f6glp3";}; +tabriz-thesis-51729={run="1jrxxmd38369qrhg2a8w4j9m3ldp08wrblbpmc08f35zwlrackbs";doc="1rzl7y6p7n46r7ljcycr4k40qxbih06bli90mdjwn96vn60m1jym";}; +tabstackengine-46848={run="0zd7gp1k40wg6b5aln30qxbk84ks3ys0d31vlw3wijvh31qbw6xz";doc="1n26fdj1lxwwx1abslxl3vkcvhk6lbnbi0wqi5mhx2n6g6ir8b89";}; +tabto-generic-15878={run="0i65jflbnhqpqf1w7pkagicic1s39gcl319z7g9zr1g80f9532dv";}; +tabto-ltx-54080={run="1ayysa2dfm6q6wli0ldk45mfw9jvj79mdx5kcpiay69xjl96j89v";doc="0rgk0znx33lk2gafzjbwwvl61xl4kw36h9f66kay0y91cy9ra9n8";}; +tabu-61719={run="1x22myjp1rpg0in3jgjj4wy0xyva8xd5hsy5c1rqqpy67wy83k0a";doc="076ivdvaac2snb4dgkf4hzpnbjqli28hll6s4r6z609c5v34mf1j";source="1pb4kibjcmwn8snfhcm49jjp38i979dac06p471w9bjnsp0khs85";}; +tabularborder-17885={run="1p7iwpalamif71mrznbmsig5g9lxs3l16dcpwj2kzhiixsh78vfv";doc="0rd6k4b00aj398hy247x84jj9c3d0dm00xnaw69p7wvlprzricwc";source="1lrvp6128j70fzwqr61nnwiivgllbbkw7pd53l11sqzqwzxppgi5";}; +tabularcalc-15878={run="057720z8l7ss0kpkg7l16fc2v82xr0wqlxzxbcak5m3hl5k03g7a";doc="0539rar83mprammyilmclcbjxr657z6q2xmmwmlik990imf78lqc";}; +tabularew-15878={run="0g9pbr0vhhjj2lz9bbgwvm49wl8bdwvv1jjggq2dnwwqbr4vc4p8";doc="1ff62dxvnhi4q1gy8f7qhc0zz1jiayl6f8j96dp0rz38l2is7m86";source="0sfpx5w61xrmmgip0c746mghhj06r2mn2jmj56zingymm2djiad1";}; +tabularray-69926={run="1mh0f8klal4i4wcj2gq4zg7kfq61q3hhnd6myw1wfm4ig5gmx4sd";doc="1xz171qjrsb4dld25haa8l8phxv9rxfjplr8gbdi2ypch8v86g58";}; +tabulary-34368={run="0z57030pg4pfvghjii8bgqba589cabnj8qsr9w1abpwp3pfy4zbs";doc="08r21q2h7sjrk875x84lngcqgiy5ijik56ly7g7wyzhq3jyxds0f";source="0lsdypidawyhzj73c3yjs8k4xy2sds7gz8gazxfy460zndsz675m";}; +tabvar-63921={run="09pbsqa0a492j6ijvi25zdv4ic69wc8ngdxll2gr7wgh6m9hsrq8";doc="0iv8w8jvq05f6a1z7n29c9cldk499fd9igryv3c93g6bgq2hkzks";source="0bw2a9rgij2xvz3lhz6gya4vfsjn41cn7mg9mkg728q4vbhg19ms";}; +tagging-52064={run="0sws4x1h52cd313apfzydqpj6c8xrb8x5881cfhwir000n48crb6";doc="1pv7savkzm6jhaliw5ilb7qmhlj3iyiz2w6kxchanwrg4pnqabx7";}; +tagpair-42138={run="08qjcwyjs90sg8agmpmm3122h20898hy6dwkm0lk3dba1j3w5drj";doc="1dkn4gq6zxfqw9h64h7ggkbyrk9vzyax8gmnk9qk8dccdvf5n2sv";}; +tagpdf-70259={run="1zf0py07f5zi85k9i5l2ac6j5igqzg304byvskcvx5qsmnz0xrjy";doc="0j0yvyp7djxiscq9x1kvlapgw399lcq17c45r3rpqy9xna2x3rxf";source="0xr5jjr7r650fvf4rahibr83h0ylnnmx04gpjq8z3xwk312cpqz8";}; +talk-42428={run="0i9whk49bahsm2kbj53pjdh3fpg1ixfyxmfvcp563ylr8j2ibimb";doc="0rgil00i39p2agz9fybg0h3xmpq0wxcpjcqpbpzjw5lcf4mpcni5";source="0kdrknwwivyxiyn8xqappf3k5l1brkwkkhjqa0l5n0abzafkjcy9";}; +talos-61820={run="0pffvqdkhmc0adl7g1sfckgwwjsfgbnf03jfry3yfq6za6mk05d0";doc="1narnqgf3221fpf66w2vlw95cr17swbap35lvb7dzviyad0ailcf";}; +tamefloats-27345={run="0mhiz5lxz0szi8ygmajjmldz1bjf6f1lpyxj3b9zb17h9aw8gr4x";doc="0s5cy9m8jpxh81c10fgdvn8wy7pnv7sa25hy8wbv6qkr1qwz8dss";}; +tamethebeast-15878={doc="13shw7hcimckn7pp8pj0cr1zsi1wq6r400x1v6akpmwwjxkw09g5";}; +tangocolors-66733={run="1i0a42sdqgm7sraxaq246fk1w8ql4hn00y2r1rndyd9v3828x8yq";doc="16x99xbhwnibsbw364kb9yxzfcws3d65n0sdj2wflz2v7qbyk986";source="03kpykm57favngm16669ylkh7jh1q92c2zhb9sx1qy1wd5li7ix2";}; +tangramtikz-66183={run="1c9in9zdw7ixanhj7kgrdsrv6iwvjy02b12lgq0k3wwllnaakv24";doc="15979bzhc22d2pzc8v8ml9220b0sqz4f2nh0nkxibm8hg9pq3prr";}; +tap-31731={run="1ci65i2k6n0h9lklgk41sdq4acp5655mps77j9gcb65yk4mdl6c5";doc="0r8y4jzri83qypvnmgchnhrd0yi7j0k753zmnwhzxqg4bvki10gp";}; +tapir-20484={run="0ad1qkbvvswq7msx9889sz8n7wf8iszigd0vmk2yycykbf0axzii";doc="1m5g6bsijqris8r7z2dw3cj74ajcny2wjysq8ql26531z61hj9ss";}; +tasks-61541={run="1gwl8g4a2x3sbvqg91ry577hmpxdc4dgcj9ixhsla25h23jl414b";doc="1pavbpzm6z6najh72z52j089mdg6gqzsa8sb9qyfsql7mndnxznz";}; +tblr-extras-69776={run="0b7vfyzbgzgq961grf1gklpi5jdl24nzmnccvhryjg7jqm8pyyiq";doc="12gzcs7scxb3dg86nq38an5h86hhv9k5bbv65ixp5kkxl7rbjdn7";}; +tcldoc-22018={run="0gz5v5hi7r6wr8qas79lakwr7gnf8d5kypf7cp62qvrybp0ljgqs";doc="1vy7k0f6ri4kbjrhby0napsas9wwlq5by2q1dakbz7r80zr7dc3k";source="150p69vd9465icda6p0wp37gg9vl8y3c2ys3b8f9ij9a88x5775j";}; +tcolorbox-69370={run="16k26jwbhk466h8a09syzskljyg0x2h5fm5f6fmy65bcjgc8ai51";doc="0dal9wv4aryz1l20hbbg6njgy534540vqmyd2q9366a9ydgx1km1";}; +tdclock-33043={run="05w49l1kvs73sxchbwrlfs9n6mn7qshx102gkjk4jslhnw9lc48z";doc="1n0ir0l10p9fai1cssri11bpzpjabpsrpfji6w826l8i3xlqkdkg";}; +tds-64477={doc="04lhavbayyisxxqfm1vpfq38xx1xwkn136hdnjaa3szky2xyn3yh";}; +tdsfrmath-15878={run="18qqjmdh4hgzar37imn811i7nbk93zx5w7f7agwnzbxgy1kx2plb";doc="1vvbsq5aql1f5q0q6v5z1xm16bmb20w2jnn0d0rc64dw4dxnwpxw";source="03r9f335gb31zb2frpv6hk50c01sz6rwlqw9vdxf4ch2np90fd9z";}; +technics-29349={run="1fr932788zvxhvkvmq4m9kzc834w4xzdjq4p80kda3fsk7a7iv2v";doc="172pqpm2i2wfv3qgvz9hvg8wqz8q7kqy5afmms4xvxhrd0xyaf2l";}; +technion-thesis-template-49889={run="1w004bdgaag02kqhsdksw7qy93lyjihhlbxiccavp7m2aj1h9xly";doc="1fa280wcainx6z15w199fbvzn8ya3zplgfw41mmvp8cv3y2njnq6";}; +ted-15878={run="0m9dv66nl6q4kq8jq08ayx4hrkh9r2i7hmr290s5d7bkyicdkgpw";doc="08yjlfrblhralk4b9ji4g47cr9r1zj8dp6sjha0169395wn4820l";source="1cifrswbfk6714m63kvmrsyvz3q29wd1bgl48f5d9ay7pz07wjyq";}; +templates-fenn-15878={doc="1s91swqsysva49cjrb9khgik5mvhxcb3wr2wz4l2683gdgxlbgkf";}; +templates-sommer-15878={doc="0z75xhawsmcxv4f24cqcvfi0r22gavjpg4si6nwrgc8sg82x24m6";}; +templatetools-67201={run="1hbpn6aqp5zq2dm8dd2cm0zmnib6rasrn8a8rpjphvhfkr1ydmck";doc="0irpqbcf51dx4rcsa0y3r4x00y7p0fanspyhia6vhk2wsipbgk0x";source="0z1nm6jp8za0dlrj8s7zfcy099c7zr6lsxa48v7gppabh7i96gqq";}; +tempora-39596={run="025smp68d941hqdxqsd4qpaxvk4z8ybg14xwc47i36k04244rarh";doc="14k350dyiqjcfg5fx09i2i9cqsdw4mh1qcrv8cglf1gf2d0b3jl8";}; +tengwarscript-34594={run="0v6mpqkyp7fr1nb5myjs4alz8f7y56rnd1vlsgvp0m2shvnvhy2f";doc="0225gpdqbbmcpgxmpjcj2blbpzxcnr7vmm38jkkpyan3gfw52n2w";source="0jzzn01c5gwkc8n6naaddm793sm8vs67vsjd30lj4ls7djpnixkc";}; +tensind-51481={run="05vgqn5wcynyp8gy80icnkrdrgb0wsr3h0db033yx4yk3c8lhwaf";doc="1vns4k813ffccps5vrrpfmb7rm4fmfs8zgs7cnw2hqg08dmzijfn";}; +tensor-67667={run="0712frfli31jnxndk2fac6fln2538pmb7k16jlvskkifgzwrsf99";doc="0cgwilixdvg1ak90m1bv50rvzhlyd17d3h28mw5bj1myqxr8ybbj";source="1g03dgvnj7j8n7z482fyxpa40daj6rllvz4vnli78i8kyp2b3m3v";}; +termcal-22514={run="1sxzpnrgc7f325w0ww0b92y8ih6jrzpvgp6b5ilvcpyriym89j8d";doc="0nv2s95n2h67j4zd5i2iiz5ygkc1s0xp5wjnnvbb27cxqw1h4sic";source="078bs0l7615z66h5fr1fcd1ydyjbc3lddl1z7j80dngnx5j0vf28";}; +termcal-de-47111={run="13a79lp2lp0r1r1j5nc94adbir463rhprdlc9p6rk3qa7lh445pf";doc="0krnv111d82razivjks8ip9m6z1bllqhx47yzjw6b5af9ps1k6a5";source="0nn9vgxv5awzqx1zndl7zvgd5nhllw7kp8zj7snd1nqvz3wgc5n6";}; +termes-otf-64733={run="0vwm8qrbp9r3bbz2a5sbkkpmkmhb4zh4hbxd37hngx1pd576lasj";doc="0pxck3jbnw7wk7j0p18as2i7cffwj2bf4zjx258dqxg2yjg82i7y";}; +termlist-18923={run="00dw7p9623kxpsvqs1yqk6n95hfl0b166l09djibybxx43fbk6dw";doc="05rbr62rvl0shhdxvscsgqci6b6n60pfzbsmikan6v2bh31d8mbn";source="0dl6bl28wvg9fcdlfqhchcxg98s3d668pm0sp7rmxzz97nf4fi9k";}; +termmenu-37700={run="0rw7a9ydsckjv6lc8q8yc5c4lq45bwczy98c6g6mzdcdl2dnhh81";doc="1r4901slsjhg0kzcy07qkm730g1bax1p2410mhh9ly8cix0hcxr4";source="0fvv10j1s49swvif5prjiqvk699l82js29n09scv0x1ixcy40h14";}; +termsim-61414={run="1b263hwbplgxw8ca03dx11vp3ar4dh1avf5r1r02qa8b1zax4b20";doc="0qzqwdc7wiwir2lzrsig76v0j8766hszzsh2y51bk2b7vns4psgm";source="0jidnimy5imwzcz0wl45v2p0wpi0xijqzsy94j517q00sgpnz0pp";}; +testhyphens-38928={run="1sqq2rf8amsn6zdp8l1vg5v5jxcn7ipp78qbzzkikiamlxv89nkv";doc="1nzimg7bz6h9dm7hb9r9fzs130dw5y7cjzmb4rc5dp5a5xhiliv5";source="0s92imbkb4p70fd629bbg2cma72ys853qby1nwk6rvdw8gp47pgg";}; +testidx-60966={run="02zkg2kffwh95nxn602ara915jihj59af4hrgv6cb6916m9fv0r1";doc="1pz2p3fdzdv4n1dabh81yl3b3iaywmbjvgxi6zklli6jbbx5h708";source="0h88x6mmid6nmhl4pw9p4p9nlh90p86g1k44a6bbcyzdlxc8n6ac";}; +tetragonos-49732={run="0l8b3kjk0jk70mmmv37zrdb16id6yrjvgsgsmji7pzdqiixy7jh5";doc="1g2zcx3b1pfc9dh76p5iprdgsxp0yndp7rn5ksbq4s9k4m7ikpzp";}; +teubner-68074={run="06xxypkdzmxs0m6bl99p9hggic3zaxqgfxg8ljq2wad0k7mwn0i6";doc="05vj8877g8ndya6p2kvhipxa61504sa6p80j1zwjdr732n7bg218";source="1nqs8cxfi1rgiab8kvzdi9fcwbpgaw51fjy1kzzpszydf6qxgqjg";}; +tex-66186={doc="1n4jybv4qghg74anpj7n7kj4l908f476q597vyvvq59fd9k5m7mm";}; +tex-ewd-15878={run="1pmf17bxw6i4a9pfi32fjk0hd3p44kw2scwmr7p38320r6dv7srk";doc="0ss7nljpn8k3cz3av5qanc966q90v3qj9qy0akmdzbiy7q8ml7na";}; +tex-font-errors-cheatsheet-18314={doc="0pfd5qphmizhxb2p4gg6809xcx1rlfkwqa6vs4f74457chcwljwn";}; +tex-gyre-68624={run="08578kyph2grc2ca9bdg6271iqpjyjg1qcrivfk5r27sq5c8cwf0";doc="115gb3afrys7ww3p29lm9bkwvkqk9gjdfcj457yazbk53ah2yff8";source="0f9gzhlawkpn4cg284n2sad05aary5pwyczi1qdgnvk9v8sbjax3";}; +tex-gyre-math-41264={run="0vqg04im4s6k1sjfclrn855liilgayh5kca774aicifzjgsigs1d";doc="0s6s2bs6q2ar4y53fyckz104y8rbvz3msjvyb4sv2p4j6x0kwz4g";source="0vl9ggi62bn1cpnjmqanx62b6an5294375jg68gskg8fwi8j6gir";}; +tex-ini-files-68920={run="1dzfn0v8v8pdg6lmgfs0q2c0695zndkf4rpl6dckn51gp2i1bgl5";doc="1l1yizfq9srfjxirdwb3hvlj31a72mnw4spwyjk58xwcsjxx3y00";}; +tex-label-16372={run="0flvmmh0lzkwvwksmnb8m4ix6pzw6f18flybkgidkyf9mf0gg8xc";doc="1ppvdq0cj62zk3b0i76lc35r9pizzli7mm4j2zvdabysn0prlyyb";source="0ysjsk73ksninqk2dyrw06arl692x66rsrr8vb4l2ri3m0lyivlf";}; +tex-locale-48500={run="05l4frsxpdmsrbn50q87db878bwpi076wagj5r8kdnmdwmcanr6l";doc="0j9m67n83f4h5yhfh3a51s9yhqh6kpjz8y5vlxhyabyf7rcpybd3";source="1x0wmqsrbgdgy67gln4jd0518cbd2cxp36gqrjrqgn574qsl5cx9";}; +tex-nutshell-70378={doc="01nmw2lj7dvylfypgyr7lsw1i2b4vlmhd56jyy1grv8hx1rfl0yh";}; +tex-overview-41403={doc="1agfya9rwvyjvip0alvibimz75jivpf19hp4jvlv7z0n9m26m9jd";}; +tex-ps-15878={run="0i35b4pp38d1l5rac059znlkazrcqa62qm8brhdmx7zzkbhyysi7";doc="0kgf7y3nxkw8x42wpc1g5mmmbz28n73vgwd9d6rf6fjpzrycc2zx";}; +tex-refs-57349={doc="1w7hcd3qsdhmb2siakjg2hm3h6kxa90ncsaif9spr4xkxs03ib6l";}; +tex-virtual-academy-pl-67718={doc="1kb86nn5vp1b0sy21aw9wlla1dwlaijppzq7728bmfs5nk1dnbjv";}; +tex-vpat-66758={doc="1y7f87prympxg8av128npsa43cri71jjl9gxq1p04pjlpdjjm0fv";}; +tex4ebook-70117={run="1c6bynhvlhil4a9kfqx1rwhh42rdcphi0jl8f6qj0k98xk5g6sjz";doc="0q3la7n6jmry2aw9a5hpi00f40r0i235zgk90qyw66h8qd1pnsf4";}; +tex4ht-69739={run="1al3sj190rcijhkvmrizrac5wy67v3n3fwjkq6lhm64nfc8j255m";doc="04z1bsgy3lisx7ifskxzna5jcbjkbwwjlqfwbfppnmjp5rwphxdv";source="1hvbqk1q6b0qvqvwr5fbvcfh5fklyjgw1yl0nmgar3ysrzz443h1";}; +texaccents-64447={run="0xai85qn9isnrvijw9shhljlkcnvmygni18kw02gsmij0dp9c1jp";doc="02185jla4hffra1wf3mgiaq8lyxh4gxgcjrb5dv3mkrw709iidcz";source="1wqbdmfly54sb8q1y6ms2wg8n62w34xpbfvxvwmg5i4as4a1ycmy";}; +texapi-54080={run="09cnhqn4gxf0alkx0276jkpcsd0myypbn94jzsavnjq8jknp6850";doc="0529cncxbw53km02pymj57iphgziri3d9cj54pqmjqjx9qmgwfmm";}; +texblend-68961={run="12lfkp9qykcvmrafwilyz2vj0yk0ghvkxmmnkhlac57q3hjy12k2";doc="1sahpz1bh883crlr4qicgmx96ncij5zz1dqrm23q4qlg88yn8y3k";}; +texbytopic-68950={doc="0pnh1hsd6k434c8i1xdjq3ywrwylmryrsl86d6h7i1cnmzz4pwlx";}; +texcount-49013={run="1bi484kbrcfx3hyflr4f2w0plhz58p2206rz4r1wjllhhhwzc7pl";doc="12a3j0sk7nysd3bd7mwnbifyrcvjjkfjy3b8f1caf6k0pf1mz8b0";}; +texdate-49362={run="06bqyfl1vnj4gadqsx94lj8cm1ia3w3bmlsfjwwfaad0al3ncxdp";doc="0kks8hswbwhp8dpjdbwr4nm55md4wgabl5ypzpx5arj41x8halhl";source="0mbcap5nfj5ap8gxn4pyv8w37hcfnq4bm5m6jx43cwkzf2hiwar5";}; +texdef-64967={run="0wi60appvgs0h5690h8qqvcmsq2r6fcxais2jqps92ryy41s2v68";doc="124azfh1332lq18g40d291gczx2agh2b1cxq07ldmizi8pmvjaza";source="0hanvqdj2dgpgl3wa6sz3qa542882h3mv9709spl8q2glmyip5b1";}; +texdiff-29752={run="1jjzd4grr3ip6gd8xmhlawhdcjfj1sqfsa06rxrpziklwirw6bq4";doc="0f7q7cszy6ca6fmwzi7fn6p72szgzyj9fldvzz1rk3ywkhsnpakr";}; +texdimens-61070={run="0fny36zd88qkcz7k3hdxq2qr41dmk9j88skihls4vwf350fy8j98";doc="1qls1hqs6ypmsg4rqa26dp98m6h7zq18wdg9n6g6895jrmj10qdz";}; +texdirflatten-55064={run="0q2m138gpk9cvfp19jvsw746mkxa613c2204qfxw1bxw8b454d7m";doc="19iiznql82a34d2yhzqcp339zszbhfz9fh0h4mb11696mj8rx3v7";}; +texdoc-70583-tlpdb70616={run="1fjaccq12gsax9ka0bkisrbwnflf91lrjfkw7l0j46gwwy5cfabn";doc="1xrh0kcwfflhbq206acljpcbla04pps01igdvqmzzfl6dyybgjgq";}; +texdoctk-62186={run="13j0c5m12if8jx8sp7hlirz33y6l2jk8lvnms7dalz52mxz8kq4h";doc="1k41z2lbfjsar5rl47xnk1adbcnnb4w97bzbgf2rnjhimd1gn9hq";}; +texdraw-64477={run="14vg45kci5pffvwdqnnb0dv3fznfaay3rg0fjiwfill24ifms14s";doc="0lw37yi82ir8zn2ii2x88f871843y2was3xwp7p06wjanr1jwc6h";}; +texfindpkg-67027={run="04igpv1y8gw945z4abb0wi959wq9y0xwzk7ymlr09qs8zcm0xv6q";doc="0gddmzndg4cc69173ssp4ncz0mmcw575fffanmdxp7y5w7ggrxb7";source="1vjbmin6jqv4k7qc0l8gd27z8gk6p87pw35rgqp0f3h0pf3r62b5";}; +texfot-68110={run="1yk59iwj4wylhagrlpasy5s8x24lvfab9xg8xz2hz8d3khai1qzd";doc="0rqhyyp6da4fkdfqa1c81jaryy29mdgm2rzml2hklp1mkxkw7k19";}; +texilikechaps-28553={run="1z9nvv2y2nzpkpxyf18p426wcl0g6gbg7qppq70b285kdbczbijd";}; +texilikecover-15878={run="04bljvhvmrxh1a4sfqw57yysaw03c5ldi1bq63mlqqvd9p3hmyck";}; +texinfo-69818={run="1ds5vf98gzfqxafil4gsfqwyrxaha0cd1fx5mg76bw9y9xjzpzsl";}; +texlive-common-68510={doc="0l4yicbx7n787xczpg0lwsxlq2cavhswb0w469gc21va59lki3z5";}; +texlive-cz-62854={doc="0wkf0g47wj7yqngxmy5cvjic2gcgy31pry4810cgklljn7pqffxp";}; +texlive-de-67108={doc="13k76mqf535l8y0pk5vvzirnicxajnq5kpgywp2f35vks362a8pl";}; +texlive-en-67184={doc="17fqvsdnil7chg6a33sy7sxmdh23jyy944qznlfllbnzdpqc9cxx";}; +texlive-es-66059={doc="0crlg0madfm3gp54rh4jm0q1x1l7mvn3l82swhdxab3pl7zwmq34";}; +texlive-fr-66571={doc="1d48jxvrz3dxrbfzj5pygi2gd9bzjvrch8728pbc7fk7xbimkafx";}; +texlive-it-58653={doc="0vmwn6n8bxpzcfrzic5qg5k2vklbm6rhl9861zxsli0rd9396qn6";}; +texlive-ja-66482={doc="1sbv761vh7a25lpk1h4b2ar6w7cqjmafv1kbl8dwd47hnsjd7xk0";}; +texlive-msg-translations-69796={tlpkg="1v4s3zgxs1k0qsip474vv16vwcmqn5d99iw94jc5rf4cm6av2j81";}; +texlive-pl-66576={doc="1id4kngpwqs53zn3pqj0hp85yf6rvha17dyb4s0m8l66cj2rzyn0";}; +texlive-ru-58426={doc="0c77yyfj87fajran8jppj0x8krk6b5195iscpn8z2n94spz2fcc9";}; +texlive-scripts-70585={run="0mgdiqqw47ydvyj47s4mb3bg5drm1x6ax47dk7hdc3ykgs1vz911";doc="12all49r6n1yc3jxpkc96gx17g5zfbimwfmb5d7s55vl1c88zmxp";tlpkg="16gyyx868k5qa2ymiyvb2gf94wxpnswymfbn1jd6y6wngwqfr3wx";}; +texlive-scripts-extra-62517={run="193v0r4i3p4psn5b4q0ggpgaazwn6jadjlzh5gjm3igg9k73i1wj";doc="1izzy295pmxrg0sf2szxxahxm6s8bfi960mbs9z6vy7m5j1szxwl";}; +texlive-sr-54594={doc="0icavs9jkcr5b5cx5kv202k95j0ydgby9lqrw8wm9h936mbn9bkj";}; +texlive-zh-cn-54490={doc="1r8n9k1cy7798g1rg1hyj6g945j9649c5hhqf8hm7a7abzx7w6ll";}; +"texlive.infra-69740.tlpdb70616"={run="1kg4k7g1gq51yv9h93jgpdlckfw4qgrxq9xgv4cwzjrf5sj58awp";doc="1w71146z54i79bhgz02m7z3gjg5zyrqhc1hmz9pvk5mynqpjwrji";tlpkg="1azilfqqz4wq82yjx8aqah1fvgmksw1v3v9pgbya2gqgdnr5i1c5";}; +texliveonfly-55777={run="03i9pzqv2dz4z9nlq60kzwiyfvzhhaalhczqa9146jp4wvcib9l3";doc="1fsabzkbcrk42rsp8ssx0kvap31y1rqnkq582129946q3njvmylx";}; +texloganalyser-54526={run="0icav63nll0lj85cqlbg1lx1r6ysjf1lyv5bydxr3flr1c7yqx2r";doc="1s7952n2brrz3s1qca9r5qk8fnjlmrmrn8b06dhjxdb7wdqis6g0";}; +texlogfilter-69919={run="0qyhmdvzly2y1xbgmi8i9fl50djv3apqmc2wiqgh5q8cn44z3gnb";doc="0khv1pcz0h75inldnmg91qx0pxmkfcz9dbdxljrvmw5b8ql8nv6v";}; +texlogos-19083={run="0rp4l8da3dn6djdjajavxqr5mmi3fsyadcqrpmd9cfggdvb9i8qz";}; +texlogsieve-69436={run="0sn9p9l89867mvwc5n9z4i3rxybm3dy5xws47q99563j1hvc1bnk";doc="0a87y350dxx22ll41i7y7wsdgabvdf0f6pgs08vr583jhzd6ks7r";}; +texmate-15878={run="06hnwj11ify60gx92zqky28spdhppgai5v08l73kiabrryzdn8w5";doc="13d6rlazx3qx9zwbb60z1f6dk64n6rph610s97hha5kpc0v2vkm9";source="0faabcm8lyfvzn5jb7vbpkpa31gjb1czkr0g391vbdmx9lrllxar";}; +texments-15878={run="0vhwraxncqx74akzmjcww4akisn3zjgi5b6ac8c350flhl0nsh5p";doc="0xn17gjnb7n3ryc28p8vg2hshcwa660482pzm9byq8k6s3a78yny";source="1kq5zw31sv0i87h30ahyasqy1qh4m36f0j37f8532s20n5llcq0z";}; +texnegar-57692={run="0qrnysss751vsbgd794gwh8lwrq6gq09p55qkkfngc5ly29icx9c";doc="0jidhqlklr8yd48san5iyy3i5pxg8lygf4xi0gcp3ps7xcb0m5g1";source="1bayaa5vffnkmvdmg64q5rsnh69grr8qirwd41mlfi9symh9gm2j";}; +texonly-50985={doc="0h40f8hj03ha0ilpj2fx5kzzvdv0yplmr4528s2rmmy62l9kgdkd";}; +texosquery-53676={run="0jszy2f076hrc29kk8qcr9616hyk2cvys3kg2qfhvblxf07ziw62";doc="11rz21m720pp97vb457pxaq5yxf3j4v8vfcd77w0bjpc632lh1xx";source="1q7spgr1xk2lnx2xqksjh979n7r2v1n1441fkrc479zyi69ncn33";}; +texplate-67201={run="0bh1yhs28wzagh7i3sraki8ygd1kikcmalqvksilmb7j4s5c0hhl";doc="0zvrsllhb8fkk1wzg9mylnjyvb7pjl5wvd3m899j7w9cp5zl5yvp";source="02wc2aiqcrrgc514pn1m7yn1b5k6vg1p8d92kk99pkiz46vxnfj8";}; +texpower-29349={run="1w1yn4is019rjnj137ckmkas48xblmhpn0gvp8dac2hmsvqfl06f";doc="16j3xy98k9hb3p7bg9inzqmsl07csa6lx1lgym4h6rcjh247llqn";source="0nkbapkzq4knxhs63fiqg0rcxyp72vmd35jz46dha87s2v5w2km5";}; +texproposal-43151={doc="1yxb3yagljsdp4s07fzd6498889i7cscch68fb77jbfc2z4srvsy";}; +texshade-69371={run="0d5panq1z0fpi7rvwp9p2pahd7vlb3skgsw9zq4rhb9pirawv3v7";doc="0bvxfpc2v8hph04kn8a8rf5995awp8c3zc5r3ddnghcidn83xsny";source="0ib9fs5391pjxh8p0c6bzvxmgv03y73qgdpjdzyadbhkqj4kkdxw";}; +texsis-69742={run="08sn35x8wab41mdv67ra3hahrsf4v4brp9n5z0l4bk3k27rl4q0m";doc="1bgngwqj3kkr196sp8i59yrkqpambijr4a54jfrgxb6595hiadsj";}; +texsurgery-59885={run="1f2m8b4xjq38j6q86pfa4m8f7z4sqyfblxpkkljppiz66cq9gnpy";doc="1zpilg11flz7z6pk7zhpm5ck39avh24na2jpl4asnnznaf5bzfjz";}; +textcase-67755={run="0rkhw4rai08n52ak4acix224cwj9fzpl1m4qcxzql9cq0h51rn2f";doc="0hw7q77pn8nx80qqvfz333sn1dpx4srf5xsv8vpl6q1akhrk5f84";source="1bxkagbkl6pnlnf9ibs0ics3p5nm9dghyfq97bn32fv38jywlswl";}; +textcsc-67193={run="1zx7890vdwghxl7g9rm9fcj0v4h06sdbhsscwyp7wjmf35k6awm6";doc="04gh3w1a7pnw1zja7gg01xda0f15s1918v5m289ax22j4x9g472a";}; +textfit-20591={run="0vmffs1a9zspg3hcnd7p0mffa0cw4nnbx8s4vari3n8npmdxrf26";doc="0dcb63v0yhlhvjmcbsfnw3px6qizmq95rq67i64dgks85d4dhi6m";source="1h2yql1gy6hvwv0rirm9v996j3clrywsg9dzgnvrkrvnkf1b6dqi";}; +textglos-30788={run="08932gszahdc5q6pckg9q8bdxs39gacjw9cljjlvghs8vn7jjwjj";doc="1c88my4j07b7ihn07bcii9xxckdv04g3c6jycm0ffhjffw4p7609";source="19hc7lalmbr85pbz3pd3dm696fsbdl7y8v9g1c4l2k7b0i5mc8zf";}; +textgreek-44192={run="0r7jcv38749xndr6sigy8zw96kwqw63k4m33c09hikawf2728jzd";doc="12pwr5b8269hrwgpr9g4chw273wv81cfa52wvp3nhkd2cvbhfcp4";source="0wq69l55462snrkpbpnlg03mrn2yxvibw38lkplgfc65gzaa07sw";}; +textmerg-20677={run="1bwlcaggagg811sbsi2wrfsz31rd6x92m47aszikmkzfzx4ina7k";doc="00p7r1y0npb8xfq1mcw5apccb6xznww3ya8q0qgg5irqyxs7d9fc";source="1972gkv933fmy32ys96qg6p1yp7551mc4cilvnaasnrwyr776f8p";}; +textopo-23796={run="10g5i5mg9898q091w9svm7gk4hgd6dja3dwy5dwc7s78pv0qcd68";doc="0r94ivbqmvs9lyw1ipwzcb4f0v9npvyfll7r8c9g627ikk9fmpa4";source="19p7sgz34dkvjqkld38x8li539kx140w1nj9l3ai5chilxz4lvy1";}; +textpath-15878={run="12f8qn2ncw0drx5r48ddb0xcc6fdm7jpmv5i1n0ihfcqaqa1l8xb";doc="0qhyflskr978qp01apai5r3qjhsj5q4mrvwck60jr79yasxa109k";}; +textpos-63967={run="1mhbsyil3ldw4xq40739pm7995d7fcv050ra4xjnaqdf93cqr2gm";doc="06ya6i8qkp823pnh1jzq30wi3pnww00jw48lbk6rzvxzyhwxrzdh";source="0vhyr1ljhi5dxyj90zhpr8x7h8rjn84pddaa09al69awlgkihclf";}; +textualicomma-67201={run="06myfm4l1k1ms5bmgswbqikg3kkrz6qah97ncjv0s32inkqjcicc";doc="157m953qh08i0a8lhrk3228ir2clyk32zd6x9ar2fgbkggjll9ch";source="1zp5qj4b8fn5y8a7aylz7bpkg6jnmqifral9l3h5g8ka1727ng9h";}; +texvc-46844={run="12knhsx5y5n6wlzlmzvym6bza5dry1z8qlszka0f93wx8hpvk7cg";doc="1852x7zd684h6jjhq3f465z4q7d75871hh5gc8abvdk9p6srnwsz";source="05532lckvznsv4slyvsn4jrv93y4gxbcy3q3r8c7g0lgya255s9q";}; +texware-66186={doc="122r0aq02vwx6irsnapnfbvhgy5d09x90rc8zc7a0bi7b25bxnd1";}; +texworks-65952={doc="0n0ydn8v42q3wcxmhjv5nwmmzf5yfg77qlc1v5bmkpb04dn4055y";}; +tfrupee-20770={run="1q0z0as8gd9qb3p10rf5kwzljg5z790cgmxi5dbz1piy0lcnj4hn";doc="04zmcfp1xqq53wl41rw199yj47nf7l396qcnsp8dsrvf7d0n0pfc";source="19bgxgg9cdgfdvdr4kzmp4na0n6p28dq0iq4nqi849j4ij5lwmnj";}; +thaienum-44140={run="16awnv395nhgm8s3n7w1x7x0h32033258bb0jp81v5nrnmn344wi";doc="0jvggbnxinc81bn8glmyli746asqcpclgmvyl8gzbdarrnabij3b";}; +thaispec-58019={run="1inic6cpbf1kf1hi6brhq5fj3fkwn95cvgjqwh7bxk9dxk1rzsh8";doc="0ki2jl9spv70f5hkzr762nkcylplb9z70c8gdp97whqg9l9mb8bs";source="0j69dwrn3qk82xgnwabq30ab1pf4xs3sfnxgnrksgmhd0ly4lpjv";}; +thalie-65249={run="03lb6fscsbisqa8r4wyqdlsfsf0g53k3zavgqbhih0rn1w588dzx";doc="1wl6h539d9ygkix1d4fbz04q20262811glpy7mjbbhr9wzacbdjv";}; +theanodidot-64518={run="1f1ixiqb6mn875rahrcl157y3bc6dv2i7vks7vbnchppjbfgk757";doc="04n1cp79d229rqks9vkj1byz9r1zi323v4r68g6srcbr4v7n3nhj";}; +theanomodern-64520={run="0w1ybshhj3y22ysymxg27apmblqxwwp193q81vkykxjrf4qn357p";doc="1a99wqmfr3adqm7rhq58kjg10q9bvf0gj44ly21nvmdl7wa0qjjl";}; +theanooldstyle-64519={run="1v5hkpspzjizpbcgbr5wjikwpvslq02fahqbdjpycrpl2q3zlc4m";doc="1wfqvav0k9vz7bs7wdh6fppijq904r76r6cwg8x5ffcv029l75ir";}; +theatre-45363={doc="1nhm56spqvryhmhwmzly939mzv5yv3398lh2lyfhf40rr02mzgi5";}; +thematicpuzzle-69356={run="0cxgvzld08bmyl89qvnkqf285qfgyhdmkq6aq8sk19acr9lljrzj";doc="1c693zjh4n4gjpkbrvw5s29r55b350mchby88l7pakhzzk81xxfx";}; +theoremref-54512={run="1dfv3pz7pjkazp0czzpzhga9j201gwvx785v3qvqasrvpa0vwyyq";doc="0zs8q0xzinp2ih68c75yj9mbjh1pmpqc77xg9hmj8n3gpf1kmmi5";}; +thermodynamics-69086={run="1m7lhcbn6ynxm34y44j4hwb0y644n2vlm0r1yc08j1p9h27s6zym";doc="0knza3s977z4vs2cdp7ykk80104k487gbs2f7aa3qsbxqfln3jrr";source="1c1xs99a599l8km9x0ckcif32gg78j8pgva2axdrllws36wpn2j1";}; +thesis-ekf-60228={run="1r2fgq9ralrcm00gz0lrxm1f413pik1hill8x8nqfm9wzif2dd9s";doc="122vzng8dhsrpixwn40r9ddczqk9igmzi300hmbymy2b4ydhzc3a";source="1nizsqbj6nbf5qk54vvldhb6flppyn29i058jngldqp43r3xq8hy";}; +thesis-gwu-54287={run="16vb94z3svvnsxmv43d3xy6rz8ki3dmk01iz553q949f4dfig1l7";doc="0xfl7s0i4ni5lwxlsmlldl96jnhfxjyay99w3qc3vc4az9vdqfmc";}; +thesis-qom-63524={run="0lsi7xy3grxmwcj55s2m0cnkqr6544qn40k5jrj6himi7l1p82b9";doc="1sppdlgr859hnfjhjlsdv8shwzi5gkgmv10s8f9vh646cnqp50rx";}; +thesis-titlepage-fhac-15878={run="1s9g6h020ahv404mxsfvqic2im68qnvb425cyvz0bj2rwn1fwnc8";doc="0pjvm3d2l9715q50nbbza5l6vzhj6zaf9payimk1lr6k94357v1s";source="0bhf68pc8c41ih92sajva48m9fq7a05x4y9qqanbidvmb6jmvhbn";}; +thinsp-39669={run="19d23nm17nybk0dda4l05dsbs1695fk0kl86vc713l19mzw4l7fw";doc="139v4dmnbhsd3nqlp9qknml0glfmh1f9dg0nnixggf19lsayn27p";}; +thmbox-15878={run="16c6p3n4zc2726adj8z131h03gbzyhmh5bj8hzc286p96131swdw";doc="15mkfzmy0141k5wgspngbwnnldf0i1rvbmq2bkzcpb72v9vcj8fd";source="0lv5mr23wwhig6r9fyy7rlv2cqxlr35y3g89i938w35s9q25xx08";}; +thmtools-67018={run="0msngnpdpqpw0skchd629v72wnd9pn8s1jijcyvqzwy88k8i8f2m";doc="1lyc17i46x1v7xhxl7qf8hpjn3y9r7da4lycpsfijmlscp9q3c3y";source="13zd5sx1nh9f61jwr2raxkli2y42w2dr23j5yjjfwfk65pd8bfq9";}; +threadcol-28754={run="1whvgb3901wciijafawy5pgnr4adpix2a6ph2v52kwglg68s2ixa";doc="0dky94vqbqrba5hsvgs1sllwy6cxmr6mlr6zv6qgn1yrrmjxs0by";source="1qd96xl0h8bnp5mqbh8mprdfbw1bhvp60dhj46hqyl4w7f61jj20";}; +threeddice-20675={run="1r5cssaj6qxv17n04pgvib12a7b7fnxfk3qbf87mhs1xpxsh6v1s";doc="0w7f2dfy6sbircp8dbw8s28s4bxbqnmz469c71v3qcaw6hgw3y2y";}; +threeparttable-17383={run="043vgdllz4k8fcclyw49515rcwl03albnmszbqi7sbsskmxnzck4";doc="1mlhxgv9q1gnkp383vinybzh95fd49dgz4x14jnjilhjabvhgyid";}; +threeparttablex-34206={run="0ipmhy0jpx38sy1jyyw3ab953cyh95ix4qwrz1ywhi54dn6ahygs";doc="19mk0y6nn6bn7gmn7vvlbijqdcjp2br0s632lmhnyhwz0d4xz6mi";}; +thuaslogos-51347={run="0p5xs731fjvd413rg4lcp289ijk1lxa5f0c9arj949f6s0pgdqfj";doc="03a24gn5zzr6ma9q391s0vsg7qqn53kbmpw86a3wlyycsrz9ipl7";}; +thubeamer-61071={run="1y0qangc89pla53dkhxx1xm9n3bk4ngslns6lzdgygyqk6cslfdg";doc="166kd79lyqb7vbgwf1aqhv9jxmjspdfx7malgdq1nizari9lndc9";source="18p9zh00g56kxxj38djjiwhy4a6mfgmjhak962ph9d6k34gfxa6n";}; +thucoursework-56435={run="18f3gbydg1z6hiaidqw3j9yqybzvcp9ykq5a7frbd3ww051rz9xq";doc="0pq5i3kd19ng122nf1gd97xsc8gd58l5gplg7iswfjykdk5zv562";source="016r76nsk9lnr2zkkwz27r2i35j154rlnk5izd11rlmsyw3ix7l0";}; +thumb-16549={run="1khi4j0as028c7fhzkdc6dmbgdyj45lbasbv4ksnxmf2kylmbhxz";doc="1h4b21mmp2bx1vp8n3556lxm16x7acy3srs9khgq24nrfkagwrp9";source="0f2z9w9mxfj0b3s9mvch95cv49bkyv6mxmdzmkyc1zr8bwwqdahy";}; +thumbpdf-62518={run="1zj2733wnq4zydf22qhza9j0nywh6fmn8xd3dc6nwfzm68pdn9ic";doc="1fpbfz855cgs9gdvwqbg9pb3i3yl2xagmxbf25mra08ii17v3pf3";}; +thumbs-33134={run="15k7rn5fygvsrjln614jndldmq47zq75zqlv71f2gvr8nqgil93n";doc="0c70k96v2m6nbx9b8qx09pky9g0s0ipqsxy3fsn8spjjrqkwk0v9";source="1ns05c3ji4svj4x9y2qy9hn0f2bvlllbvg98xsr2xv7gylr2pkmw";}; +thumby-16736={run="0q3h6cwbw90adw3c8ggyb707l23qvsfl3dl8zrzhg78dm9l8q3gi";doc="1v1934z064ar7zgjpnpxvmc7bkaq080h0hka0snkj7kwqm6sfry7";}; +thuthesis-67127={run="1wnnl59l063ykjlzl2ln781w56w6s5wwz6nxs3wsx9inzn4dn966";doc="13a5vrnfnhhwl9kdjry50rs67kmcpdz7yh0qvfvwddv5kndjr0py";source="06ys99v2865pyc5xfrszvj1jc6l4kxgi37nih3v5s2a4k0sp3hnw";}; +ticket-42280={run="0qpqzff2hj01g2k8nq9vc91l4zvg7kx4p7nf0gd6ji9lf0q5caaw";doc="07xa7nf2qgvjq5pzaj7k75wzg2ldcpxb47ypx53swssz277ixvp7";}; +ticollege-36306={run="1mivwaf3ngmdr1zdkl9xif1rl4fy0b062r43064645idpkk4120d";doc="0xy35cggk34ziagi1m60ymckknls2wwil0wdzlswn0aw2zca9lc7";}; +tidyres-67738={run="1lnymwa3hbfabxigxfqkhmczigswqn84wdw8jdzj7khsv4zm47rk";doc="0gb1aayki8i14i9zl450jmy4ybbcdnv54l5s1b34ma7vw9nbng5g";}; +tie-66186={doc="17z5ik7bbf0v5ylq2v1rda6z64iz386vp56z7yrr6h1dl488kr93";}; +tikz-3dplot-25087={run="06ij3bk1aham4iv0wm14z9dhcq1v60qiv9n6idfcmjqz6m05cdf8";doc="1mq9drqg2z9khxfylsgpz32binla5abq88938jcjk9y21d46r31h";}; +tikz-among-us-60880={run="047mfp3z4m63wc4f7psrsi77qpc55drl1wdrk2dlzfykkh4mna3p";doc="1f817bi1m745c7cgl7r0yx5jx22qi6h2xwg8kb246lkfsvwlynnz";}; +tikz-bagua-64103={run="14cycyq0lshr61n83jdzdyjhr20b26fsrp1ximyh1phk958yxmbj";doc="167pi758hdi7chys2rbs1v1lqd5gi2nb1fq244igjr77v1775ifb";}; +tikz-bayesnet-38295={run="1sdal5mq1s3xkklj09hy0j41xymprmh78z3923f55bg0kzdc2i0v";doc="0kwlqx1bys43hzwpwj8snrn5693grfih18fcw3d74a6x7s5k0h8m";}; +tikz-bbox-57444={run="023xrf65s1c4g63ggpmsdyckp6zspgjz1ad7pk7jf56zdnhqaxb1";doc="0ilj988mh0w1ws8ancnxsz0ig4s5k0yi3ywihn6vsk3z94k51yfm";}; +tikz-cd-59133={run="0xv75gvwlhax08mp1nlyy2kgi0br7wy7aahbaf9rfbj0idpcl5ip";doc="0dxsixn2n0irfqrgcp63h74fss1ldqlcvfv6d9v61asxsjdrzf0v";}; +tikz-dependency-54512={run="0v471rprwnqlhwvx0lqxvpsgh8ph16lbvrpcrynx2hx71n9daqla";doc="0h3mnxwcb1k1ilw9pi1xcwmryjpci0kwlaqfxx2i8lcggsdrxfxi";}; +tikz-dimline-35805={run="0mp6xg317m0dkrw73609xdn7r9hbf8bdmyp0bdj2xzpynpvxisxd";doc="05rikgrm1f0f0rx7ir1nn4cy3a93bwrck2xqnms26dg4dqddnrbk";}; +tikz-ext-66737={run="04ar5xpvxsihcv50n8z49dd76s4vlw401y106yi37x3fsbgfzshl";doc="0aigvf2a0b9lh6gj66gp75iag3ipd1kjf6wv5safpn2v1jfhadcg";}; +tikz-feynhand-51915={run="16bb4h6wbmyv9mz68sywgw18h2dcyxkmkcyjjshkbagimf3ikb58";doc="15h182ywc8ihahv76khphah6awpahbsrdi0hin578jmg1582rzp4";}; +tikz-feynman-56615={run="1kh3riwk5iksldsg6ljk27lhh6fka473k958q9781m65isdzhwa9";doc="0cjl1zvn2q39khh4afzvh6nh8dlhrkd6vn3i8n2ywv4xldpb2k0b";}; +tikz-imagelabels-51490={run="1xg2malb3ybgcvmr1gksgg93i4d8fvr7pqjky1b98n0abfxybxv9";doc="1fqkzfbbm4ckbjpgjrg5fa9ggam2lcy5gzvnhc4njyjxwx1hjcsd";source="0cqcbwccfq65zsbnkcdjfqwj9h8ndjhan1ghnzp9by8z41qj2fvv";}; +tikz-inet-15878={run="02xbywhzzkiica13d2dzingz9qm2v1w3fjrj9kbjn9q9fmw2xw64";doc="15mvq4gpd22nah4p84dazld4ncdshygmffz7sx42s2zqyjwrm6wi";}; +tikz-kalender-52890={run="0lkvvwzfilmhcamy00jdfrwhxr75d3jzppyhvvb26ymnzm6v1inv";doc="1pxc1wii1hqmhr42yskil16ahjslkn7y6q8qj8hbq85y7ymm3lxi";}; +tikz-karnaugh-62040={run="0bhnh37ydzfrkvjwfyzih59sadfzw9y02y337wym3gqaa0m6w7gh";doc="1p7rrg2jrpg4hqlvnzbniiwpcfxyfxbqq29izbsijlwlwfhm2zaq";}; +tikz-ladder-62992={run="0b39723rfs3d8npxnkk96x3fcsk51w5vnh3mfmn9dnh07xclr92b";doc="1j5v3vj0w8yzydf1qxl2smcf5llwzq4zj86rjgrcqirp86z0jgqj";}; +tikz-lake-fig-55288={run="0miw1aws614ffb4q8szr6zh5rb0216hz1scl50ambx1qv97azsgm";doc="14yb48ylr5rv4n6ikqh704vvzxx8k68l8ww2vnv9lx5nl2nhybp7";}; +tikz-layers-46660={run="1ym859l9bzzd2rack9kcbckzbpmqxyglaa0jggpf3hlbsgzy33h6";doc="1lnlfl8k4czvxz1vyfmnqk3k1arc7jpw7cbgrnh5xbanhvyjfzl0";}; +tikz-mirror-lens-65500={run="0lpb87kidq5lrl79hzjss78qy5hvag2maddvwkh8idnccr06awbi";doc="0q4rp929pq600xi78yp0siagzxbrhx0cksqplr0h7xgn74yldrs3";}; +tikz-nef-55920={run="1i1l0rk7k6kc9vyx9jbpj25bkl77ml5ay1wvwff7a51rr8c87s99";doc="1nsbycqfai72xbrzy6vz7lzpywdavbcyz7x3h1kfhby10s2h136k";}; +tikz-network-51884={run="1mf196mmkg097slc5aslpjlpih2kdq5wkmcpznsyhg7s20mf11yy";doc="05dzfw2x5j1i3534qmhp6wcymba5mwilv2vf7vrw5fmrgd4h1gy2";}; +tikz-nfold-67718={run="03q6hj8p7p4f5sa6ipsw456q5g3326kidkmsiil0sjprklsm3w9i";doc="0xpc9nik5m90kqrpmg254mcpa7qca0fl4n4832pax0j59g9f9z1f";}; +tikz-opm-32769={run="04ch55a4jvvif7c74s8bbsq0bkw3v3zjh6wdlmij30cfyxn114jg";doc="0ajrvamsj1is4lh0xf25wjylnjg8kd02b7kwj40nq1kawnp0hlxb";}; +tikz-optics-62977={run="0r5z7vp05s92hk87m01vcxfa0kkvfmzxyzfx397b3lwmlavzws8q";doc="1zjlpblczvr9390fmz0vh8zf0pbf1zc4d01l4ykhdpvljf7ndrmd";}; +tikz-osci-68636={run="1rxkdljz3lq6lnmpr56wyb7zkxrcjzkg6pi3qwrgqcz0njd5d7xl";doc="0sn7qhv2kdkiivigbkhqqpgj2kki8xydnkagmrbk47s3bnvzmhqz";}; +tikz-page-42039={run="0971kcdlavr24lkf9wdzgwb97cf952iw1d5ls6zz7fsfj6pigqjn";doc="19g4b944wzahnabpw2kighd1vr63c7im3xgcjz3l53yrz89nhjmk";source="10v67pn2zvpxl3817h1rvn0y4wb7dj07p4nv6wf1jhchgvmb8bdz";}; +tikz-palattice-43442={run="0pfp30l373li523l0skr52fa397h2wkizvggsls3kv3p087j16an";doc="0krdfwivibibgpxsjnlsl11yppmsynanj2lgf892izxj2m3hld7d";}; +tikz-planets-55002={run="0gjkapcls19839jrjimshd3cqdl9x0ld27i2d51s7k8f0rcakkmh";doc="0xx18gdj4r9jj7qvwlrd237nhcbazprhqgzn6m6cy8m36xy6yc09";}; +tikz-qtree-26108={run="1x638b7a71mwlcrn50w86j649qlzjm121ap6jgccr5vck6q9wcms";doc="0khnzjc78v1p8ahyii5rsqx29797jv3ycdan2d55bvw87p4iyrra";}; +tikz-relay-64072={run="0rwpsh2y902b93p1kjb8hwhxjvfiglfkzma5alghcdw0r538r4fx";doc="0h5pkr67anks09f8fii186sfwhh3l137k7kp2xdwk1sz4zfcqw66";}; +tikz-sfc-49424={run="0kkfds07qskfbd7yxfyc6spylnd0nnhjyfa8s7i44y4d2x1skik5";doc="0b5cf8kcchp8h33x5ih1wvwdrgdhbkz589d55454i1470b3h4f79";}; +tikz-swigs-59889={run="0cpmk783m9qf4wq1qsw4hy3azjlx0r47ya5ijw4ss3l4nr8i710x";doc="02carafyvhv0nv29n9x0k8ij8adiwf2xqr8bw43k4imj690360li";}; +tikz-timing-64967={run="145r878hxqfx1sdn4hdagmcnfx8xqcihfz775zabn5sbzki87ywq";doc="0na0rjgnala2lyww8chnkqyp26c1y2siaj7gqh6h8fjpi5bpamdf";source="17wzwm58194p5jlwb74z30864q7nzg9fi4q4dbcp26b3p6kn5cxs";}; +tikz-trackschematic-63480={run="1jbji8zkqjwpf1bn25p415n7cwz0a5q2606imyj8bbxdzp0r8y23";doc="1pvp3a9pgszgb2013gkh1z1fm8hpxa4z6ssmr1hwvwj7y48399bv";}; +tikz-truchet-50020={run="00yf9044lpsazd8wnmcz39lnazrxpqd7lpyr8ss24gk9gm33b563";doc="1vlsyyh7xj1fn6wkafh7ps4ys439n1lmvmgk63pya18laxkphxxk";source="1zbp1xb9sbbnr4iiqgg352ymn9ybfmkwmwd49r1ws3w7iy3qdvrz";}; +tikz2d-fr-67239={run="13mzq1azxi34lrkm4rycsfhbcm8cap8pzam8gwc3vfa5sygkczhd";doc="10lv2v9j65bq9fj3yin86hbbj4bvlygqc1b2sszjabsdnmzbw0yd";}; +tikz3d-fr-67774={run="19js2ypl2xlzqb2rspvrx1a73w6wl9jcf6pcm2b0i19rwfp93d39";doc="0kbil2rvy07rdva18kb7krd49mqcrrsbmh2mbflqxagycpy3vf7a";}; +tikzbricks-63952={run="0k15zgfckasxf9zbnh3m4bhwa22pc1rmx930in2k9qskqx41rlrz";doc="1dmnx38k0b1ivs8ay74yhh3pmqi3m9s12cxakfhnw57ipkpp6af3";}; +tikzcodeblocks-54758={run="0q10q8gfbdw20ysv40pj9c1ks4mnb4dqvvz39fvyji3f4s4xd60n";doc="1imd5qf95ykqs89zqb32yg7p61in242vkjx5wv6r2xh2dkjpvv9h";}; +tikzdotncross-69382={run="0vwxdha9gpmdv4l61wdfk5j3mi2facrv3a3azkgrfn5s2pyf4m5k";doc="14xwxm1ckicip2dwc7925sfdnlxdwry7h12fixs1g4l0vmh4bcim";}; +tikzducks-66773={run="1mlj8h6wk80pi8vi8ggj30mg1gcdwdfncif53p0mkyvmvjfin3px";doc="17c88srkb48y49icbqv85kih5qd2r222559a6g6xgbqvwa3yx1gq";}; +tikzfill-67847={run="1igbzzpx6rwqklhnalzpsb1rpj7l4mkrhwblp8k732nfqvj1fn0x";doc="1dl033xf2waf0j40c4whci5qsyxk4346353j43vsrqy7lgsh557b";}; +tikzinclude-28715={run="0s0mhfshfzl28z6lgwn7f540pbmdxl51gqf7nw1s88738mx3m4z1";doc="11jj75nnzw9m3i6nndbfscllfxzn5bd636s85q17gds03jbqkhfc";source="1v1bvpfqhvn3hp3zjx3sqv4kg288aviy1b9zl3s8r64zmai86bfy";}; +tikzlings-63628={run="17wgali1pawsb6kz2w41a27i7gj1sm4h8ay8i8q967s8s07kxv5p";doc="043sia2hyynbwpgh10dfca9gyih97z8hlxpi1390a28wnmyvcbwb";}; +tikzmark-64819={run="1p73c3ivn3aamrzzzw5y4fmkfy7s9qnvw4q64jn01qxzzs1vbhdl";doc="10fwszi7wsqrh6kql40s6w4y0jji8v0q41bd684cravhgg0yjc1p";source="0mbk2xvqjpn44skvdgjq43s1j4814sfn57xc1ishcwrrmidy5pra";}; +tikzmarmots-54080={run="1m33y48cs82f2z19gwhr89qyaa9n5qlrps9ash5ijjgra9dkfj8q";doc="1jp10kd7vpx68z9i1j1pk904yjb078yr60hkfk0vxhwhnpychlgz";}; +tikzorbital-36439={run="17g4bd556kkhrxir4c2q6f7qxa8rigkf41dj979nb5k3a7w4k3b4";doc="0h1s5dnyv8n4hv608c5rspdgy2h10ilqknddai779h9biwhfzh3m";}; +tikzpackets-55827={run="1kidqyd1d7wvs1f3cp6ixp397ipaj7jd19djhy3q4dvbnzq1xm4b";doc="0rlpz3m4vsyin6ckyjkxjp9a40gxhhi44z18hrw2blmp0mg011v5";}; +tikzpagenodes-64967={run="197sijaabaa3sf5syasf4ciwz8hkgy2pyr7lp78gzhlv950drghh";doc="0y9ik1r203inp74hx4xznkypw0p88zhg9fq6b9205i053vvla239";source="01bjvk944nlld4zbrld35n45dzljqf1rng83y14ipn3wcdxa0plx";}; +tikzpeople-67840={run="12i0m8jilbl8ldji9xmxm5hgsl0bd5vkjly1ykmj6w2rzgmjfbbp";doc="1a3cjadvnrv9hslwgihxv8z16awkikinv44zcj4fd5drnqjsvcrq";}; +tikzpfeile-25777={run="1rwv1i6yb0jd5gw16db3kqar4ykzbwcyw51hv781iz358hgww5mc";doc="1530vkp14lpv0hnv8qcxalibsi1pkcj9xp1pa87lisrillxs7kwb";source="180cp8vp26shmnjxg9qs9n28v4xy0qhqgm1bvbkqrpagykzzhsrf";}; +tikzpingus-68310={run="058v2b6scnz31p0jzk4i1i8v6a1vb10fd4kgi0izd4pw58cjj31f";doc="08fi2mlzwvdx8i4r2hf8l2lx7j6b4phpm8ihwklfi49ha5i0z2n8";}; +tikzposter-32732={run="1r6pia3sjl9xcixnsr5pk8cma4f18mvpn60dxmpzpn2nn1sk4p26";doc="06vy5vmzrqhl6zk6z9a4kyqfvjqc4s9pslvl9zfl17cdqsfvbdf6";source="1idiz8izn9m9h7kyiavw836v9x1vzg58vap42wpj7yd74izwvf1d";}; +tikzquads-69409={run="1a55w1apikxg33n35wwi3ffafnlhgsnl5w6fxq9qin77qi5rq8l5";doc="090fyhby42m0zlx28vm9ix5pjgkmv7ml0ja6w1kgn0vd63q02i4c";}; +tikzquests-69388={run="1l1d23ky7pvcj6j1g52p5qsdy060qbjws4fp4i7j38k6dvyrw2pl";doc="1bvjy5ghc0arx48gxc3sz7z1fz02vigg5cxc1g75b6pcn1l5x9lf";}; +tikzscale-30637={run="0h8hpk0nv712vydxrzyhvqxrrqb34hw5qjgq9baagqj42ka06qfg";doc="02sz63v9zxr58417jn00ypm3myga7x29q31xbnz7p7mmq5q1r94h";source="0rf6rsrcpapmhz3q5wkgcivhvswy1kb3mql94xs372qc08bxsi3h";}; +tikzsymbols-61300={run="05a3szm1xgsqj766cwwf8ssg1s2jd0kbvgzv6m0hlkvnpig13y7k";doc="06wkvldkiym2xlz47rr4f0nhlbygdqisczn66d41lsf59v8036lx";source="19jcl91qn62hr4j6fcw6a6dc0qhpqqfpzqb1d8mwibn91dzad00z";}; +tikztosvg-60289={run="1gpkypg9j6iz0i0f77drk0p373x2vx8z5v6j9wsb3bggnf00f0yi";doc="03f324pxiwyxgnsvw83wi8sh5ya633a1d6833kq2zl8z1f51vvfd";}; +tikzviolinplots-66659={run="185hmygifmnydjfsg01mwshzjx6d80r92j7bh3djpkslxwp8pdyz";doc="0asisvkbf7gfwqn6wzyjl574kysjz4z088ph4pqggy4znd0yqljr";}; +tile-graphic-55325={run="1l87pqfzgyr8apcs9f2gssf5rh1mvknkr5jim98zj5f93ca5mjpq";doc="0rq35cpk9l7rc30l1hk55r7x07f96ishr3dzdi7x4d50gv7675ah";source="01xqc704g5pqwmlfifzvv61nypgvnabxv6xw7ljgv9vvpyvfh0ni";}; +tilings-67292={run="124gj42waa50pv8qm4zkal8xxr5d0kvi9wf9qlrz0chhm1xk4v15";doc="02bz0wpvzwf4f97g14rkv25x0ifxxfwdkgi3nbv6x2djbm79xjd0";source="03zb3sfygc8bbdl5z4hz7gy7wfnl54sbka9b8w7ywkx9wgymvkz9";}; +timbreicmc-49740={run="0inffnb824kv9lswj46b8p0zb36f4s3pfix4m7x7v0d216xa75pw";doc="05x699cyrkfnygbwfifzz4ih0g5nm7pzlj6ygkh6pysyzxkb5w94";source="0hznll8725wbjmayxilg0hvjw2vf63wj4cxmznvfly9lk8z5zh5m";}; +times-61719={run="13g41a7vbkvsf7ki9dgl7qm100w382mnlqkcngwgl3axp6s5s8l0";}; +timetable-15878={run="1lnl8gi2rrzcy688qb8b1ff9yivwxdqmbcfx2ph49aymkxfym97b";}; +timing-diagrams-31491={run="04yal5fdbwwdq5i7frmvxm0z7zy379gpwbc5383xn0nfdyzrq91b";doc="1w3qzl1j3viaj6qi50qcyx51w2ms23j27p17h526iz11x39w0gw7";}; +tinos-68950={run="0czfddyibqn7g62j3kqqvswwfdm1z6xwv0k0m43g30n8r61a0qa5";doc="0mg2rjy5kk7gd05lp00zh41sxapmm0bvl950r404wy1snl17d23d";}; +tipa-29349={run="1vax0padc42ks1b4rvl0ikfqmb5i04ii27k1711vfdbzmg87j217";doc="0wwnbarpvjcq8ibbn8sr0zqrlg3clplc9nyh46r5gsr06qgd1prf";}; +tipa-de-22005={doc="16gwc0dpdls6s2vdl3hmd6307d88gfzsa3kbw3vhl0z5iawvwj4h";}; +tipauni-65817={run="0qzwx1rd5wqrqwlqrgd7c8czsvr9hy5bb2dljf2xqnm0c1c05496";doc="19azyp11a949kqkwph7b47128fdh7k80lf9ia34ik7a9qw1gri73";source="0m5kfcjk6c0mm40mqbsfnp1ddha617d4sl44dv62nj3rkj3shqvl";}; +tipfr-38646={run="1a9vj3r5b15chzyrpfd7rn0f19qkq9lqklzxvzm4xc5b5n802zbw";doc="02x8fikl1vnirfcrw42xq2cbkf6wpciary55xyk6xwnnhh3abbgb";}; +tiscreen-62602={run="143c2w00f4s24qli3wbnhps6b5pbrvrhaddpgpgn52pmy20f5z85";doc="0l0qs27bm0hy835zljyapyhs7iwvkpn85vnd0z02wy8l0nb11ly8";}; +titlecaps-63020={run="08cy0cmrp27iqa081q1y3ibif6lv2c83lmvn9d7r920f13dpmy7k";doc="0gmajngp9cgi10b9kgc4ra020drmm58f00vh1yv5qj3x8bx5hihf";}; +titlefoot-15878={run="0c0nhhxhb3hmvg3a64lr5npbqsmrmprqqj9pic91j007k4s1in4y";}; +titlepages-19457={doc="17ib7rpb2dhb2m724x66fdzddv8cqd808wxy5kkvx0vb3rl27hyh";}; +titlepic-43497={run="1pj4mavc06r5ghcvyjjhvn7x2xrccgdfjr3961al7420ymaqb726";doc="06s1r8xy54129y7fvzaym2vkfbyw2x31r91i8cyxyra0chzh8ngl";}; +titleref-18729={run="1y2aw2m7jg7l9vcr35nd2qpbafyff1bc8acy2cm9k7fcjm4rcr17";doc="0rv9hsx5p460pa3ry50fnrcb0kf08rzdl7bq47n5nhm8frpmczad";}; +titlesec-68677={run="0y27npwraxaryl2z7mv0fzkdci8whq8jz7b2xlk2n31slbfvksb8";doc="1yz5s63bbpkiziwggqcal266444nm03fnr7kwan14gswmqqbkav5";}; +titling-15878={run="15iw3giwxg658pzb6basjkp4v92m3qvzk1fcarnzikc649bjcbch";doc="1r75nwakbkwf32qva6icp3pq3y8bgfl6cqw304lcw8p6bih74y5j";source="1jdgyn9zyf5rwbaz004g85rr2jpd5gi5iyn111s0r22ml41ci3hk";}; +tkz-base-69460={run="0zp2020wa30yqk0b5iyzyjpm09kndnw7ng3lr547qcfgqr2q6iym";doc="0218bq4ma7dxshk4mvh3i40qdhh4b3i0i9yp034jjnn366wxk039";}; +tkz-berge-57485={run="1c9kgzsagh5ww0zlwywpddwn3mx0wrf8yc627gjap3f7nyyvixn4";doc="07bsfmh9qyn8q9z4brd4si1clmw7sn2vh2nr8idqnm1z1jqdnq40";}; +tkz-bernoulli-68780={run="0ifjig10clmd3402y9kdpyw1vlwk9vjakanjzkzablm5zzdr0qgs";doc="1iv94xglrk07kg3jkdci5nixrz96gwasgg5h0fl345ph9rdalwx1";}; +tkz-doc-68665={run="0gf3zjnqng90kn9341xdchm1diav93qlv2910mrl1cc7vqfp47wf";doc="10p4i3xnbpyhzj32j3mi59pzaisjhj066m9np4ankzizgwv9x5in";}; +tkz-elements-69715={run="1aas8q4kjf26ch0wpf1vvml8dawnwpw1gl6p9wy32f6jim3pckmh";doc="17jard6dv6qagrziafv29339ira4w53zd6p5gvl6mdpylj96bhab";}; +tkz-euclide-69702={run="0yfnc4zqf9nznim015qw335h8l8p8chhyl3ir85zaa2hblwc9ma4";doc="1xlyzr8sd86zrp48v1q54j8y9iw77wx13qf2rxlkjcklwn6zvs0q";}; +tkz-fct-61949={run="0hlcxnllmkhmxl5dwap1sb2jg822bz4glllqcv59dx7jqab5bv8k";doc="1bjkya9ssr6m4aw6rd64nniwffgz57ikz16ciba2x149f39pkcx3";}; +tkz-graph-57484={run="08kfjaniwrlw23vmz24yq9gbdks9fwcf0g4jyy98ikfqh9phhhs9";doc="1drk9va3bgq62qfkcvp5z30gvnscl7mbjz66m27wmgagb2ki2f0q";}; +tkz-orm-61719={run="020bi7dgjipd2ancqji6fa1zcf9lh9d8n4zbacy5l5nclxfiphcl";doc="1zgmsl11cf4fgkfilflw8c4wrcfwnvk1f88l90hwgclfj5q0ashr";}; +tkz-tab-66115={run="142fjk2kdv02b7whr2m5a53z6b7rhh2zfv2fi55q1sy4xaa1wia1";doc="1p0h1l1jca83j27wa79ncjarczissgp1jh9f9ylqhbi7y5mk8abw";}; +tkzexample-63908={run="1cs6x5v0f4dbwrsmdq6wjcggc87hc132bp0faxd1fqfhgapd00mc";doc="03cn9q2qq04ni6f6kvrcyy0js718bpc3di37znr47vhh419vpc5h";}; +tlc-article-51431={run="1kzizgzmi7swzhjq9dasz392wga0w1qdb4x3x812lbshzg235vyh";doc="0w07p4rv12ila4ix4pymysbig3yl1apb6cxmb2cp9ziwv9c2184j";}; +tlc2-26096={doc="1ysb233rjb8gpl9s35qql1dny5rj6fn8ssy2dqdqsn5xj9pdasyy";}; +tlc3-examples-65496={doc="01ny6r3ycji0af0cdywn2fmxd0fyz3y7afdnn983a5gy1j9rza7v";}; +tlcockpit-54857={run="0sm882jxczx8q4dvqaxnyb2wzlpxd249ayv77gj9vgq4lx9v0l27";doc="0zd8hx3f6jhm5rklhr5dxb84y17p4rbgwa7wh95ab5f6n8i5pgwb";source="0kldzbbyjvj0n60jgff8y6y27nxnzihjyq10gnx2gi62qn9bia7i";}; +tlmgr-intro-zh-cn-59100={doc="127fad3aq66rnn4jkccyw7qc8pdcwapyjb6lj9kn49nqcy3jm6nk";}; +tlmgrbasics-68999={doc="0yz7d8dw071nawgn2s38da6sp8zbrd03zzsgisfx7yx9jp0zzbpz";}; +tlshell-66771={run="17nrf6cwxapdkdccqr2sp5v7fayd00qcdczzznl7ppm98rsz9p36";doc="1h5mk09sakbmgsppl9fnry28xnzqya3bmp3r1nkzg44cv7kl98vz";tlpkg="1dvb7jjnmdh0k4dfkm4f89zapkjb31z2364m0vapmvfq4z84vpyq";}; +to-be-determined-64882={run="0yrs04ik67wj1wyn4cl3wfabczvz3ga3h7sfbhni9x4438br48gh";doc="1acxz8nala57gnc78r5aswiwhfvdckmvkv4xiwgcznb0c217wpl3";source="1fizh0inczp818vdwlvyawzvw8s0i48mkpgjydfcmwpsbf8rdm8c";}; +tocbibind-20085={run="1swxyai6gqlz8zjah2qnz9c5dkd1smpk163b56rba0kx7zcmvzc5";doc="189qi2qyp1nasg9w902ydk7rlzxl2qww9w3p5s3p9ywchvm1l9cf";source="08sr335sgs7hrhd6cbdc4dh3f8m9fpplv72fk54y57rx59l8wxbs";}; +tocdata-69512={run="0vj012pdzwbss6h96l8a539vdwihm9f58d6yazsfc74ia4k0x3yk";doc="14hy1z419gb6n4zw27xv1qi3gc3krg83xpnr5lw40yd92i99i8q2";source="0wg9d1nay4cr52g4ird3cgb7lndlyvmx6hcf6d29j5hfdaafkdg2";}; +tocloft-53364={run="1vp3s7q0fcyfj2ksk61gxdjjnwhd62dzfd94yp7y3qfy7x8hyqxq";doc="0zjs0ldib6hm3b9msb5x7r64ddknqwf6kkc9cc82hbla9wshq4qq";source="1764cq3d9ad5gy3qag6f6wxgnna0dhk3rx186jqjpqyqli8b4lgh";}; +tocvsec2-33146={run="157m17r777cfqjn5p4j1rbj10ysbyms87jrhk0wjkahag9rgny1b";doc="0dvzcynpfn9fvfkks5idncgbdqbhxj0vp1d3mfzymhiw4sds31xk";source="0gjpdjkl73ip3jkhr9sx94mwxz3rvxaacn553xwa9gvk3xh5rav9";}; +todo-17746={run="0chmi45gcs8y2zh24072y37g3z62ixpv8cg7ck7knmkzwfzv5i13";doc="0n6dy738cj08laf4cg4y0sadzzzrz9wa9m87hwkya6c95znl0091";source="06xpbraybhf1wbl979653waznvgq697jq61xcpz29gn159li0pdb";}; +todonotes-69319={run="130szqdm8xx7bqqqlx01wgrj6x2wfqzynmf7pjsn953rvyd2da4d";doc="0920zvilbcjsl707vyvvdcw27qg1hjlrmjfbr3229rv9n4zd4fqy";source="1xx14nww9nh8iv0nxvnj2iwj1wm70iqfclgg39q7jlywdzpp7h0y";}; +tokcycle-60320={run="0cl2m00pl40pi6ycw1c1kndaqinrqml5gl88kh5d00dr7g9p50rd";doc="0yy8m10q7pzwqbf371w7r2x1x872idjlrh842vkxk51ijb1441a7";}; +tokenizer-15878={run="04b3jy76qdvbq9c6yc0lmq99jqcprmcfd602zm6xsr0lwmxrp1cd";doc="0lpbfdvmib9ykdcwrcd5inpibgkm99avqyn94zadbasr54k62gna";}; +tonevalue-60058={run="12jvvfppr9zqaqkqm1g1nqvxikqqg493a1p10z0k123cw11877xq";doc="04gvjaxqhqixs13x9y805dgsxr62zb4i1xmcgwr42n2a5qa4dv2y";}; +toolbox-32260={run="1qpbidjji1rj056700iyrbhgmqvw8is5kp2mmm5r9f455dmgm390";doc="17n7dxi0j8razw5s12s4drz22wd63xffx1x6w0a4jhiq87na4jq0";source="0l9w43kp3h1mbas4pab9qk6b18ny5r1k8vmm9nq2j95gm7z5p77f";}; +tools-68941={run="0hhib64h3l94c98v7x505gvc0rd1z8cqawypkbnvlycmw57804jw";doc="0r1c6gr5qcrxyy3xnxj1rrwnzfsqna9qzs45gka09i23r6x7ip8y";source="15an5rw7ciq2lji49afy28z0dyjid3sbf66pc0lfs1dxrln2ijrz";}; +topfloat-19084={run="0md1db8a7ifx2vg269y2dhcf4l07qa35jg57x4q9nsn8ac9gy4v0";doc="1q7fssdrg5r2i51b722mw6wydd17qd8b41iv9rqa7s8r9brf8f8i";}; +topiclongtable-54758={run="1p71kg4882rjzlbq9rfgvppz532s227xs2jmg8zbgplfd3j96mnj";doc="1q12jsaxs9d15qc19wjca7xhq6qajdp7573lv9dc6y9il84r1izs";}; +topletter-48182={run="13ggrw7s7k476sp8fzbj5if20wa1x75m68ip17f1srihnfks3903";doc="0f45rz9n6fsg2c429n3hmzqx4cqv9jvrhwgmbfhznn6zrlip3qy8";source="0p6gvk4xj7bsazb7ipfgp6by60br9lyha53lj0z7rz16f7f2ar0w";}; +toptesi-56276={run="00qd8ap3dgrj16g831458m2kp0jivvbvmya2xzcyp560njsvqqca";doc="09hnbj0g7x76m9lnn47z3cjjnlbbfmapmln3hi6ykb6lh534c4wa";source="1nr54n7hsij9rjn54wgnij16xgay0dda2h6vl2qc44s8yz892jc2";}; +totalcount-67201={run="0zd8h2sanc98qzhgkzgaxjyzfh969lb2935778c80n0w8g53ipn7";doc="1cwk1dnpin4zz0zc4rbf7a1spz5wzvza3nc9d4jrpxqbzgs36nb9";source="1cp1fkvs1gbif9brdwxd1dyx81ylshayq6gad4fw6npzqynppk6f";}; +totcount-21178={run="1mj04hqxi81i1pwjrn10ipm6b0xwv2081paa4kvq7yma8g2kmi9p";doc="1c1941vfi2pf0wsbfhhzpahyxjzb4jx4lr85k7g6r8vk64qahy9i";source="1f6r2ci4dqri4fxd5mwmfmqmw2k5jfr5vzf2mazynixxp809mjwq";}; +totpages-15878={run="1z6brrn4kb6w6an8iz6das0yykwj2cbaswa9wy2p3rfc0w95x0ms";doc="0nm7x3rv5rxg40k0xls5d3s5dqrpc8vw9g93sa3jkdn18xkxh2zs";source="1b0glns220jsmn1607d5f44k2lijjp95cd0dkxabdc3p576ipmmv";}; +tpic2pdftex-52851={doc="02nf2fg4xzh8lbbddvm44qyvcvfn5b7kzcyg729a58l29gd88pbs";}; +tpslifonts-42428={run="14cpw6n2j16mq1742lyjb09zynyjhq1wcljhpbb4c6brwnqvb05q";doc="1wwmxwb2y6zyp1h5hskl7b6bb58ydasv3gq2bj0jcnqhdphgii9l";source="158innbi79r298sj1r4qk9c0g4gv1wzdkcmxf511sdb8ipar6xk5";}; +tqft-44455={run="0v14gsk9nwyppdyvcd4ngx6mavd4sa1y8zzmjbb8gcf5dlnz2vg9";doc="1wwvklsd7aqn36vym38m3q6gqf8fgf16axy627vdfqgg30jsml3m";source="155kv0h90zkymc6b3r1iambxsfx3y3rci6nrk01yd185ml21dvdy";}; +tracklang-65263={run="125bpgp39bvp1g3601y3lbwzvq7s64c6zghva1m7yqv2jfkx2rmc";doc="0qncvbpqc693iy5id0fa175jqwyyfvj4bjpn6zwsy5njlh4dixzn";source="1gpp2kpj9lckbc33ldv91svq9snsyk92praghhfn7lhjn897mv5n";}; +trajan-15878={run="1hnk1qb46hihc3ga6klxghqf7yvn6zschp6w36a08mz1hfsdb8sj";doc="017v3bmngyh8wydjl7hmxqh2rz61dg2imcl0gabsfs98l8fnwsfb";source="01qgax96y0sklbbb8mdfv5yc0i2k90i23yg75vhjmb7xlwx60q7k";}; +tram-29803={run="1bk233y9pin9r76vsbkg5j2wadp3c6p2x3mgqchnmlz2ip54x336";doc="17b0vw6r2ijgxs3dix1ff9r342vkz1gsa603mxixxxik62j5crk5";}; +tramlines-65692={run="1x4mgl4rpfijka8bww4qhv3ascqn4plm0qlzpyhz43frmnfwip6s";doc="13zwximglba27mr2cxs2srcb6hwh9jcz3na1jgqh6z6wf2s5x7m8";}; +translation-array-fr-24344={doc="128k8isyn4s0v496sykn22fqn0gfwyyk19kcrmxnc6clgxxfbdy6";}; +translation-arsclassica-de-23803={doc="1ix5lafy3ay2bc9zkkbqw2rrw6ng3izb8d9p6rki6h2j7n0qj47s";}; +translation-biblatex-de-59382={doc="1ygbz7prjg6pdiqm7lknnk8a9ar05xvpdam38piivif3d3yk5bg1";}; +translation-chemsym-de-23804={doc="01liazqafs3lh9ppipw6i6sljcjzr31nq70r83qgknqmb9j0yfl0";}; +translation-dcolumn-fr-24345={doc="0xakssrkxb2wc6xyy1yvx4mm398x3yq032b7vapqxl82h992fjll";}; +translation-ecv-de-24754={doc="06b4vhsgdphi6kdh5x4a2kl74b64z3y5qzxcpkn0hj40038z1av7";}; +translation-enumitem-de-24196={doc="121raikamd33gabvbgwygrc8hyi3qhvx4hhv4h8wq2chrglj37dq";}; +translation-europecv-de-23840={doc="0n3x8g6k3qq3f4drkhzygz4khxyw6isgxmz963xqp91s0y667gws";}; +translation-filecontents-de-24010={doc="0d2ds8kc98yd1can0gzcngm7gsn2gwhriaxnnds5kz3z3al71gkc";}; +translation-moreverb-de-23957={doc="1jbpmvcm9q73kh09mhrbsb2wlycwwm4n8il342hz4jd15gwhmy8f";}; +translation-natbib-fr-25105={doc="0f0r1n8q3jkxsdcddabsgz9h9ndq4yffdpxdqxvqjmhfafhzwgkg";}; +translation-tabbing-fr-24228={doc="1cih442gp6zf8nwb2lbgjn7a64aglyrcw3aciqy5pkdw09pwn0an";}; +translations-61896={run="0cs8wvvcgmzsnx2bv1qhmcmcswpj6kbk79573yr9vmiws43djng2";doc="02z9ggyi83hiqmvc53wgvkxw7q3jn8sb5vd1pzxmw5kvhdgkzy2p";}; +translator-59412={run="1cpr6znw0nkavqxr6bv8fkb72ygnjhl1ap0wbim75f1gmwn7k4ki";doc="0yk617bp6c4wcr6mqmyfsh9lirjjzlg6fiay3fp3g9146p567w4s";}; +transparent-64852={run="0rq67j8rxjcxp8kwzfzb3ppxbb74sybl58yzq318b8663g65jws5";doc="19gpcw9z3jn9mfmb4ixijyh4xv420is978s7d15crmn3vsk6cygn";source="161qwg68f5nslk49sdibmxvgbsn8qmq0ivmyknq2ghhffr7g40pb";}; +transparent-io-64113={doc="04zfmk25qw2cnja1zqhafabsy26zalxiawf6pm5zqx4x1jl47i6j";}; +tree-dvips-21751={run="1l7vgcgbh31hdaaqb9kqi9jmvbyr5429wchyjg5pjjgpffj599qv";doc="17l7mmvb03zi7am3nnp60ychx224kn5i3bdl2yv2v1dywbsnl7yw";}; +treetex-28176={run="1gl79r8h5brqmkw5paf26vm6s5ipa0f7g7cxxh3v68qg5cm2dink";doc="1prh07qqn92il09fbam3c66czcgi3ssa6kd02mb62mczzf5k594f";}; +trfsigns-15878={run="0g1xdyhin39sqbgi7x5m5r5786x2822sf49271arhnv58md7ns76";doc="1nr4pypsglxi17kpxh6y9xh0b1ky0w41f2i6h5fi7y63h9gjl87z";source="0v1yc2zq5kqcbx8dp12nzfipw2cd7f6z2p9wxxydgjd4xp6s8cny";}; +trigonometry-43006={run="1z4sk50nzdplwarbv7ha3gi5v6g2sh2nf85ipdz2rbj3cnz0j53n";doc="12pm2720vyk1c79qbgk935nridg3z48cbzmzbx9ak66araz9y901";}; +trimspaces-15878={run="10rx6pcvwn1lzyivn312j76lsrw3lb40jgzyj861gl3r3pcls0nw";doc="13zf5bz4pp0lwp44kxdj1zw44h978bdpaiskbma752603jlznaqs";source="0nfwqm4a7c1ks5sqypkwmffqasjaw008pxjb5spr49h3sv7sp04w";}; +trivfloat-15878={run="0s74sisq1bg9n593az435chspj55ysx9b0vqywl30mk60hray6zm";doc="09szjgdcy2fc4ddkw09vsa2am5m98mgm606i6s2nrkjgldm0x4ap";source="067ab9d2vc3m950587iqcfismjnl8fp0jxw0ssdsz3gqxys6vgz8";}; +trivialpursuit-68971={run="0rs7bf0wba9i85sgnxms4sng83y1ckpz89ibs93wqh3fappy4w0i";doc="1zci9nn24r51fcbz6sqd81zk8zad5v45xyi6mminq0h3c9c6lysz";}; +trsym-18732={run="0crl9ik3bd9jwvy6x9sl102bvp5pgj2rq9mywlrcpbxrvvffw1ab";doc="1pd0r5j26xj63qvj7mrifcxjrzazdi702ang8k6npq0cc8v29iar";source="06aavqqczg63yc0s1mwry4nd2ml94424a2qxswcz60y57m68yq61";}; +truncate-18921={run="13hzrndx2myazl7f30i736zs8vk12203hv9rskwncl77hxrqqqpm";doc="0l5hgx3207h54s4n5193zc6ssj6l49xwx2hd9jfpqh1f73kpn6hf";}; +truthtable-68300={run="0cas4lh1n7y9z7b0bvi3yv6xhm3klp4bqdmqz42gh0n2vz9clrvd";doc="1s3ff2pjyls5z1ll8m3x5m0h6gf2is4pnlagiv3y87nbs9sx359d";}; +tsemlines-23440={run="1c7sjdrgqbjw6f2s3185k5rlkig643pkkahjisx16h0akbbdm4k3";}; +tsvtemplate-65333={run="02v9b1jvkynz0gl4czzizs3kj68bkwx7m5xfh5abffcy74f9b96r";doc="06ph8853hvm6xmn6zcycim7qrmr2a4vk702sicg6bh1bzcw14cvj";}; +ttfutils-66186={run="188gcwglfgl7yi4026n9l3zkpgwx034vfr4damxpfr6n630rixw1";doc="0yabxx9pq8rj2ibzqa19ix7vz5haydbdp3ylinanzqgafrjd5pfq";}; +tucv-20680={run="08m364pqd2imqfi5jalxjrwbjnphjihnmlpnpqg8vaz2rsmddlh7";doc="0rfpmrlh7wbpmpqp5j6iai3g9x1zkhqvwfnwjfskknx5an1ad79c";source="1s0shpwhb7q4zhn6kq2010a4d3jwck3liir5jn5h0gzqbsafai11";}; +tuda-ci-69351={run="0cblzjymh2012wrkxyh09wwax25cysiz5ph6k2pg5qjspx1a98cm";doc="0q4lj07kd9h1cqsyvb4y1amdyrabck16a9r0pwi4mkl1qnlv8dmg";}; +tudscr-64085={run="0l7m9n8n6ikd9f47jc1xp8b1ik2vq58samd3g1v0m7f48jvf36f9";doc="06g1h7l2bbabg87y97zifxn6401hf0j7ia86scgjkpjbx7p2dj2w";source="1s4y8cvn1iw77b2qklbbnpm1jkjc0sjnkvsa3savvcb7zhw4asa0";}; +tufte-latex-37649={run="1azsqa3qa1w2k0r4sp83xp9b7g1xjw47wv9l0sk065zq0bdjr9yy";doc="10h41jbfmjg7p8k3m98l2jyhl7365qym844y8f38g0f9sr1pyxvn";}; +tugboat-68694={run="0yj3a32shn70svaq3pjmilw9ah55rg4z3ffd47dz263qqrp5kxm3";doc="1skr54zc5z1vmmv6c9yx1c7q69z5y6a956m917ckb67shqrvsgiv";source="0af24yivq0dym98zzpz1y2xy1l4k59j627fiiz4ny3lzmgwjszg1";}; +tugboat-plain-68695={run="0nk6ycvi05lfbmr2grhdfrgp3d3w8d5di1alc7gpsqfimxh8d89k";doc="0bzv0zl27vjz4fk3nl117jjvcj7ay9dpwnvlwblq27mhj0b3z3j3";}; +tui-27253={run="0liczx2jcdks6r5040r7dqcyrcj225xq0035ccdb9kjmp0rmc90b";doc="1m73fc2nj7qsy144fmbqhld3hx431ry64jv5p7h0r4p0giadwxgc";}; +turabian-36298={run="0fjqr88a51699p57d9mpkpf2hn9rrmdchsxhpjng8hkx3yjl647g";doc="193qbhcgh63kfnrivzjyyk8vp66wb5k4791qdii7brp59xsy6l7a";}; +turabian-formatting-58561={run="0bfl9fgj0adpcm405a9b1819463nrzqplzzdlvwy6yanyqfqcp3i";doc="1dam5fm94hdyzi4ai0wq03pkarb6lbrykych3ixcsz8r2z04g7nx";}; +turkmen-17748={run="0jhg6nd47y8igsn10m3bcsn61zydlwk3g1qfqpy8snz80rkyn9d7";doc="1rs4jmqy5zrgk2awvvw8lsvdkzjwbfq65bm3m9c02158q63bw2i9";source="1kz5qhyjax82mv74qxhsiwj83jijnfhgijdl2w8ic8lwc31q5ihl";}; +turnstile-64967={run="1br0ny72qsv5fpfw4x0v7q3dqy2jgicyd97ibzpxc04mp967njjr";doc="1iv8ysamcqzc7lavhskf8kwi29jn9xcda0am0ak9s1c7nz7pb3ly";source="0aadq0w193hl3rlb1d8xv60yy0fam4aprz4j96dphnanbb9g27ll";}; +turnthepage-29803={run="0zsgmi4akjkhwqas45r7ppbx5c8i5fyvpmk6a8wmpk99ib58pipq";doc="0jkv2zs1m6bggjhf3g71g9cyvrnmgmr549fqsvc4lf8fp9kp3ayn";}; +tutodoc-69343={run="1a2q792dv19y03sv7fcdlb60vkld9z6vkkv4ad10w9frgq3ghhwg";doc="0i9h32l6smr7k1ra54ds8gh2fjaiwpgnqvgwq9m890l9f9f322cn";}; +twemoji-colr-64854={run="10k7gl7jp9l41mj6jamz26wndf3casx1qyy1dz1rscgqyvgjgh9w";doc="1d0kaq2k3svm7609x3nfm8lcd1d41rzp8vcr3wxwrl1dadjv180c";}; +twemojis-62930={run="1k58rnl12pj54g5r9rc7dcf1n33p0hw233wckrpn0dh287gf5ffy";doc="022i152bp2r8fnkwb0mpz1nhs54qxpy57f51j1mkb5rc1dqgcxqh";source="08jxkcjb95yb7pc7jlf2rcz9b2yibpi5ygi48d2ni79i5382mizh";}; +twoinone-17024={run="02na16ki3n7gcbzi45dk6nwna3dqzgxwc73aha1zncm05bnj3n4q";doc="15ldj27nb6pp90abilsybzg7hn0z8xfv7mmwrmwdq20qw8ss75ay";}; +twoup-15878={run="11zxz1wlnqia071kg3d70glp167k2c210gc4r2755sh6m23wp8p7";doc="02zg1rq2ylm9qvgwh530d5l0pq9a377z943s66apyf3jz8z55sj6";source="0lmqla1wrsrzq900c4fhjzbvg7iwbd3y05g40j0lmfrj8w8lqvng";}; +twoxtwogame-70426={run="1gr6wgvpzb9d07a416fngf499hk4pxvqpnq040jspnz9lsfnyd7v";doc="0d55npjzwpjm2bgsm6dc44n2mkycqglqy4nvkd9jqfajddk6l9nx";}; +txfonts-15878={run="1dfrd8dzrzj9y5qnz9c554xn2g9931slhj9ylan2i71k5asxmkiv";doc="13v5hhk0nzj38nfgyz9ijmz9gb9703izrgb617z274d744qwqx73";}; +txfontsb-54512={run="0g2hjxcqhgynzmvj44q9d1wpxwpwy52a6rbl3nhnq06w2v1lh637";doc="1yls8kb1bglfqa7yiqidanyjgj3xb1isc7z99ybw2j2kbmvvcjbn";source="07bapd1i9rwf3946pj54s0m0841ximmj60ic266mcmj5gipw2q1q";}; +txgreeks-21839={run="1872zrdb80wfkjh2bdblv31k6cm83cmsnqns8f3hwf3vr0ymvb62";doc="1gswhcdlf8n4wpnzy0fx4maxvy3n4dcbag9r0igrcvcbqnp9sfcm";source="0n4r3zn19z62qkd2njxqj74k60jr59704mnhrlvmmxi9x3b5g5sv";}; +txuprcal-43327={run="1l1khap1kpgjsjrbsa3d9hgd61lw4x7pi771mchszkaklqx8qarn";doc="1j2y6scl5pa25yk00zf64nqgngrvvb4hbig3qi50rzf5kpq56pxp";}; +type1cm-21820={run="0xdbj0yivyb7advckx6k2iwbn8xqkxrlapjrqrx51jcqhzqshknp";doc="1zw172nb8jym439sz8fb2nnfxmazbnr5mjpmffwkfnasi2f7b4in";source="114wlrzzvlnd1la16mgdp88f7a6h6v8l5ddq72is0hcddw80g2g8";}; +typed-checklist-63445={run="0yrl1vlsly2k71svaziblbnd3jl9jpnpvpg942gg31dsj9vvsb2q";doc="165h7yh2w6n64g2165wbxhpyghwgxww7lasy1qi2qmzkxyf3zi4n";source="0f942k6pjy821851sxhff7idp8w9n8wgf8v9dfrx7mgyb2yqwwqb";}; +typeface-27046={run="06i3zhnc42zbzb5lk0pqgiwq0y7wgds4hs27jybizw9y3yhv9nf6";doc="0z9q8q87iybb4b6g1xnnryr5aihic0vdsjq5xv55i3gbgrd15kr2";source="15igfb6xy0g7jykb50086as2drjr76jcprj3kafcf347427026dv";}; +typehtml-17134={run="1lv5bl9bq1413bbbsjvh8gz1p3qd075y7asi9x0nja36rmcags11";doc="1cgx2prk9ggw3wkbabrm0sbsfb4ablglzh2ckvg5s0chgkilcnyf";source="1ihc1dq38rklrmw8h4k4i6pq3qy9dlwn7nwzmjblpsghszfivxqb";}; +typeoutfileinfo-67526={run="1006mxdn6gdmm0ssmnqnw1ay8wi0549qs7a6vyv1nrvis4v7nys7";doc="0dvglz9jw5ig3xy61syy6yghf3xjnynvkxnwqdmkfz7fgy74hb15";}; +typewriter-46641={run="1cgyi8q0w8j6xywby39g4nprg7p7p2dpgfdb58qr5nsppa2i31m8";doc="0lz81r7jv8frdgb1aglxlr98cngacacjvsa4wjzwr9cvahc1q5r0";}; +typicons-37623={run="0acmp2zpg1734c6719jpmcccyq4325h2023bc87xmj7jxqq0xlp6";doc="1r9wabmkqvzdj6dcxl9syymp0rzz8kj0lfmqn9j4njghclndkfdf";}; +typoaid-44238={run="0m7nvdni7nsmbmlbpf51cb3s4s5qaszbn7mw62dfvvawgd2d1y0j";doc="1b24irgw2779j43pc15cwpazx0mdjy2zla9n6lqvmwyhl5xnaswz";}; +typogrid-24994={run="1p3if64qmyhflwlf4gy59wl3xajaza5xpllxy5f3a7n1pzca46rx";doc="1v9az7ln7z1w3d2bcfn02kxqcwwl4kg4zjri2pmvicc7skzkplr9";source="147flz7xlwjxbq7wkaw83mxr8qbcqvjknr27a0aaq5zs81jcyy8f";}; +tzplot-64537={run="166wxyqcd55y55ql1p7wvrb2x4mhavz7byax2sq43bqsz2h6689y";doc="027pg77h4p7vavy1s25awa355id6i2ngsb9spmj3bapr6bknsajw";}; +uaclasses-15878={run="015wxmrjfykv7j2bvmb42491i137h513q826f5czmcf1c8gk8bl9";doc="0x6krd94wrdwc1zkyvqzznwvnvxx4agwinr5fhshav6r8jfsn4rg";source="06nsdpmp8qqsrcbbcdpm82gcc3z8y5dlhv2lgwr4i01srwkd91r6";}; +uafthesis-57349={run="0fj2rfdzldav8m1ac7wv8n1k8pcgj4yy4zxx0g8sg1mb5i7if0k6";doc="0g096y6dvxfzbjrvvwpb92z4hrxp1p9jvbgkap5gra61msacqawq";}; +uantwerpendocs-66819={run="1dx140fk30ppk96h4n751mds1m6d521d3br94ixbqybya5bc1y64";doc="1f57n9v9pbwgw7j0i0gvv3y976a58lrf4w55gd7pqgwi88fdwy9a";source="0sq29h4il7zmxksqhdnxyszmz4d5rgd8qyzhi1y7bjp8c4sny2dk";}; +uassign-38459={run="1xwinmh3a8scfgxm40505zn85r0052pcykcs0lcvazn91007dl8i";doc="1b89rvsspkgs60rkmqjad7n2pwwmviiizpqr2si02kwnsqfspqdw";}; +ucalgmthesis-66602={run="1n8g3blw71qrrkrjjq867qimn58w5a2l4lnfyqdw77wa67qzxb08";doc="0jkxxfnc9npmvvxyqk3zw5csapmhgfqhzm0rssijw4d46b7w1lcp";}; +ucbthesis-51690={run="19g7wv3iypbkcxhlybizkis6yivgn6z0mvz4rgsi72zaahpxmg7y";doc="0nlpc0vm12h7pni3lw3jqq7fsh273nc63abw8yzw69crh3fspyqg";}; +ucdavisthesis-40772={run="0kdrwdk7mg3yd7hm2xmq63kgikr2p2izibfgw1whai921za4wlm4";doc="1chajx1i2zmfh4ypnf8jspwr8kjwbfv7z07qrfasrf73r775yxnh";source="08525i86hrv1387jn9ayz3mpwnh4z8kvjvb590y7gqv3cdvrsa2b";}; +ucharcat-38907={run="0xiryrx3pjx2nq01f4f0x3anx3zvkdarp87103z9zvpf6aa27slw";doc="0k1aqic1ljafdk8xralygdyjapkqa0qiainrbf982233kjqclpvd";source="08xxmm2rrpyi9a601bzxka226fnhmyqfv8cfbc1qdivn8658785y";}; +ucharclasses-64782={run="0d5rr5w322pr4bsmcp09vsldydxxm69mcpvpaf9j7z5rwhic9biv";doc="1l6pv743lzdhnxpd8bv1y40xhfg82421jyri2c5h7j4ahlcnnvic";}; +ucph-revy-69750={run="1pp8cqrvhwqc16nd60bd6kb76xxnsn671icsph6byx8xr7fc3hl8";doc="0rqj0b2a73wil9iy4sd83831nvbd0x3lqi5480ig2i01rq3lkpvs";source="0kr0k411gpnzvgjgiqnkbdw8nq3djp8107886igcw26s46ipwics";}; +ucs-68759={run="07xgqkjhks344r0d9c8rvw2gvy0kwhx5kvyzkf2ymw1hiix8w48s";doc="0icaq9irpb67mipfpv55kfbdy5m7dw83h5qqq98f5d1x14h3gxbn";source="07pasmgx62jjdq8wgqgk10wkykzljj7v52xhl1ncma4idmd7l97q";}; +ucsmonograph-52698={run="1jkcyhrh5zf8p205xgs10azhp69vrz613ln9ssrb4485b7a25b3d";doc="1hhr0z3sy8vn6cv2i7g8nfpnsdpyrsbqrclc8j8g6qidh83x2y5q";source="0x465kyz3chdcj705v9gc8s0w3pmawaza93pcm8nxy3k7dwx920j";}; +ucthesis-15878={run="1mqj65aps995issvi1vgn7f7pvxq39pwxaqqwh7pxnki26k8czrv";doc="1hv02nxak4laz9az2kr5lvd97l4mcnixdmpysiz6xqvc13ivkjl7";}; +udepcolor-69701={run="1i8vmd208l17r0w6lpzjymi73n6ci3p5izqqhbl2wgyxsq4090zr";doc="1zm3znyvkjpz5ilbbmkk0lq6qaavk9p55g5b67mqm9z1qh423gjd";}; +udes-genie-these-68141={run="1fj7qy5cbcs03pkpcv8ii539val5ps57pk0836srwgmgh418csiw";doc="0ikgr4zdxfi06ply66kp8v8h1p51m8fmzv87hlg490qaj8wmng5i";source="1rz05n7bvf0c8h8b278m9q4pj8vdc29i5xncr2374lyhkcx4r3xp";}; +udesoftec-57866={run="1lq0n05v6q0p78jnq1wf67pgzh214lllcas4jxlpz8hrwk9n9v1h";doc="1gd4qhdr4wxgjalxgqp0d404w65x7r3ipdkdq82lfcyclqyab8fh";source="16fgvdzlxrcaxbbk9m9yxviv8v3qhki2s5kq8j065xx88zd181aw";}; +uebungsblatt-15878={run="198bz1875qhh366ddvdxj72jpcdinfxsrb2mzirr17fq6liwbwhq";doc="0814xqw1iglvwn5y29fsvgbrm5clhgiz6ivbh8a8rayscbjwixmj";}; +uestcthesis-36371={run="0dsdzhf9pp2x4xbprii9rvl0h0jwwwd03va8mg7c3cjgr2nvy1dl";doc="11z3ac2pnxg8qqy4shmdks7h33257nbkgj4h1rq49gc2ssqmp8pc";}; +ufrgscca-70603={run="0vnibzq6ib2kdf3kdgk72aznshsnj1izq648l8f8l7sdzw9v0pm8";doc="13mil74klrh23af2as7s077ly4nc6v31qcxyp3v8rppff3jxml9m";}; +uhc-16791={run="1xvkp384p0xcba1lbi3b2najk6d2w1s78yi6vgppmcjrd5limif2";doc="0q1wxcn2zclpj4bsn47jgd78xmp82a6x8w068j4ihza9pfvbqacm";}; +uhhassignment-44026={run="0pb7hw9krpri3ky7hfshjkkbk36cilf31iv00l5iynsnrw70lwyy";doc="1106wbx02mbnkgzwwiypfz7fg1a3rmwyhlgnsxf4z081q891p3fm";source="1ck8c7jx3qkxnm0a82qfql92s05bg5p352fw1yv3y7v86z2kh6ad";}; +uhrzeit-39570={run="11ysijqpnm3b4z7pnyg7m7kpzp6fiw42dc36gxk1aq55wsv7kk7g";doc="0rln5amx6vkny0pm4yhgvnmmr9akwcrd93db7bifxdp07hjbvj83";}; +uiucredborder-29974={run="1zklnahb3inyf5qnavccqvkc02iwqw8mz7w1iam0lz2jmzgc1c41";doc="1lxyssdc3sxsfhizm3f74lxcgpkaskljqpybwl1zw8m347p1qf85";source="1rbxxliaaggn4rk6093lhmndas1xy111z9bjrgjrhjhxw19lc0ib";}; +uiucthesis-15878={run="19fif7a2xb3qrmkg8yfjg1hpisif4znc64765d6jrqgb9fqqzlnz";doc="1w20kjwdgppl39axgwks373j3dsnidamhvqy1wn3yilzfb9vjjxj";source="185mzcsh598dxnf2sb4mmvc3qy4pi43qrlim5jhn3n90qvwp62cw";}; +ukbill-69362={run="0k3wwd9snv9w8mif0snbxbgaykmrj2d25kakllqc9f3gdpjfqy7h";doc="0c54c4zaznbpskycspfihpla4928w5g9w095lr6djnqb0spk8138";}; +ukrhyph-21081={run="1fnh98jcbn9l09mi952qrdw0dq0pjykwgwi35zz2lz8h8r750ihw";doc="0bbj125zb494g9x160n3lsivims28w0drhfmp0c2920cwhk4m0xh";}; +ulem-53365={run="0v6p4hj3hij0qvq7vpsbnk11rhwwlx80p3g575jy4sn2vfw5zzsm";doc="18ny9kfv3w2ag97czcj2gaqqy1gj2f7rd8r72vd7wsdihgqd5wzb";}; +ulqda-26313={run="1mpjwq43dj2am9llszy1yzz2jbhdskf14ki881j6q6h5zfwwacdv";doc="0kkxa9sv2xg6d31bj00wszkchkk6raj2pvqji930098jray3zdc7";source="1gb2r4zzr3q2kfigrb4j528jmr5paj38swhnp1dlb2dqr8y1szfc";}; +ulthese-60217={run="158n0yiqrb8x387b76c181ps3m66f8rvl8paanqnfbb257jn3hjl";doc="1sasf73ax5nrk89a9ry87w8yf4czr7r7jwbg4cpwxry4rffkz636";source="0rli542fgz8hbjcl4ag3vgkj2s44b6w3is62ai2zj1h38jm4ybh6";}; +umbclegislation-41348={run="1lsvsxjhjlfxlqvlmy4pqbgsr2jv3imzgv7zfa2p3gj382hj1qlb";doc="1a3cjb20ycjs1nsghc9fsiz4kc8f6awah0bksqyh2ik4fnkydxb2";}; +umich-thesis-15878={run="0k1jl1v6nqyg4ld1f470x96pjm68hs5fnl3kab383363mly5ypy0";doc="182vclnb9yja2jgh6j2b2f7421w0xi567s0jrzaqvbnaik5sk5x6";}; +uml-17476={run="0gl1063pjxrif7qpq9wxwajpsp32idmnlsq27y668lwpkpm0vmzn";doc="0n3flbps3s8lhr9pimdw41kmyrfvn51pddm4d3yc08v96sgg65bn";source="0ylzxyl44p0574qvga9arjl84ip8nsafpgabbwjrk2kcbs47jsi2";}; +umlaute-15878={run="0k1pjakg7x49lyvpabjaspwa73z659gj4qvgysm3rd1smkar6vy5";doc="1x9l84zk5jnfasgqc4d35g10a5la79z5q6q55f364chc7bibyzis";source="0ajdnhbdw7b0d8qxnbalv3867p5lrk4mk6xl9skmvmkzpbf4s9an";}; +umoline-19085={run="0xx4v6w2sw43nqrzdpww561511dcaigsz5blywqg72giw0x2v3la";doc="0zpn7ii50w0bfh3cr84w6nk5zj0g8y55r577wnkdmzpm51qxznxc";source="00nb73pq0s7xychc84438aa9472mp1h7drafg27wm916f10832cs";}; +umthesis-15878={run="0iby3d7f8mm4p5z4jgnxzqnfmwhsws6hg3yb2l0mrknlj98ww4yx";doc="0vf8ikxi8706hc0sv1h53wzpd4mfiz607hzbhwq607k4hc71iz8f";}; +umtypewriter-64443={run="1xn06vz5lxr58xi6y2qv5wa5h2r0g1xnba43x5qh5ag6bz5ym1wh";doc="1sgsj3d153nyylqz5q1mvjfh2mnll783863wsmh9n6zajkfxhv0c";}; +unam-thesis-51207={run="05lb63wclgxqr7jn7c38plhg3r806b7888zyifcivv85q143j191";doc="0kxdr723xvg0lzhmzwpyik9vxy584y41pmwy8bi7197gz1hgdlzz";}; +unamth-template-68681={doc="1ydaxzcwxq1rjkawlapnfipjzlyzvbvijrx98pi9yd4zk2nnqjfv";}; +unamthesis-43639={run="0wqi46mdjsl06q7hyvy4wpihvrr040f5g23bgc6lm6lq11jadj6l";doc="1l71n80psc2hzjs1lnfgpfpg13355sk9ld86104dkyrl645qx07r";}; +unbtex-70325={run="1djrj3ywcp9r9w3gj037vz2rw502j9vdz4pnb10zzsfc6v9wy55d";doc="1r202y3fh8bg9r39vfa0b565jlpxqfilwwfjh5w60ywh32ps5pqa";}; +undar-digitacion-69742={run="1bvfr0zb2jh0q75sr6lrkyxqkh15r15lrdsapy73vxcm1s34i96x";doc="100h0pzwawnv2c2f2q9f2incb8arl3jxrhaj5vra700c6i6lva1z";source="0z40wjd915w64zyazfj2bpykq6x6sq6c3xmfh4wc5m91qp45wd25";}; +undergradmath-57286={doc="1z8my3fwqc8rfc1843j7lcmfka2023z9k0js4ygh1m8kilc2nrr7";}; +underlin-15878={run="0gm9cikysz83sdkhhwd6x9zbs278gwfw8mxh7z22l3c0nvfkxbfa";doc="1rvryx13hyif7hw2wgb88n95qycip95xh92jdy1jm2l6pl3c5q3i";source="1mczvxrhlipisffdi9jv5m3d2i7h34jpm6vi4dbl58cg9sasc4a4";}; +underoverlap-29019={run="14cknh021b4qsymflf0mnv8q2vvhgsf2088s1g6pm8ckpx7diq0r";doc="1h1qvk9m04sp0nm4acj7kfib5cfpch1mkpvs55mnqqsgasgnymjn";}; +underscore-18261={run="0a93sgddm7xy8iby50yficparkr6hnzj46w70madbwpjkpnfya78";doc="1lqg7j0hnnhqnfzdv0zzgpnmbysypdind3fmr6axkw0czix1pz5n";}; +undolabl-65846={run="0arfny56vh389m89jz17mr0xbdlmf3mf0wiilmkdia4sbnbv3g7z";doc="0802sqkxir6gdkxkaxh867wjc12m8apvlhycl19fmlbivg6pfla6";source="16ymhmx7by5pi36z6l4l27z1x8pkpz314jfibpc5azjmcphqhjq5";}; +unfonts-core-56291={run="0pyrnydswlqhxacwqpbc1m3bzm8v4gcl3ka7w2mppp77l8a70drl";doc="0225vsqaj8l0g1igc4h8m94cfk6wv17vlnappdgxwws1fknz0x5m";}; +unfonts-extra-56291={run="1i7skyjqlprf6m1pnz5l2hn67f1cix4n3pai6v1a8adrrx7vcfdx";doc="0d3cxfm110lg12n3c9hc88lqmx77rcsil1s6yph384scxadlg3bn";}; +uni-titlepage-68917={run="18s5vidaarmpppdw12ynb6fjc52sn5i5zr5lglvgfqmxnwx5i3d7";doc="0djb52kfbp3nn4prj7x613g58qqjf1lnmcxg1rq2y3kam4g63r37";source="1jhvh4aj2z3qzf85wq3isfvkwlf5cghrkhqq82q371zxaks2fd0c";}; +uni-wtal-ger-31541={run="1jyba7g6qmngn4lx7mrmk0j190zkjv8lw775w13hxr2yky31cf1z";doc="0kncfbrs663qcpc0nsfhf0asjri8103laj9zpaayk3by612lfgj4";}; +uni-wtal-lin-31409={run="1rc0dc1g1fwhz8qa550ykc8azzc4i748jh37a8ppgrf4x2lgxzjq";doc="1ja9a6fjrlh1lbjkcsal7ahw24w1gs1mzma6jiiw5p5kbmc4zpz1";}; +unicode-alphabets-66225={run="10zmjmbrlxsvq7snzm3p89afj4xy4ad0ni06fi9dkqjmi9l5nph4";doc="18l3zd0q5ixwpvbcx2glldp75anqkgm3ifnf3lha2iqapk03jsm8";}; +unicode-bidi-42482={run="1prl0i2a9dg5yc2yl1x1k0zmz9lww051w1zwy8cbyvk3rd765a72";doc="0ab0gym9sjllmqdclkjfbc4fh9n20999mv7z2gylfybirm0n7i7c";}; +unicode-data-68311={run="1ra75819cglkd1gdv96wzflx65bc73v46k2hmn1bxjachz3cd7fr";doc="1b8zpwd0vr238may4wv68xj77w7fiq757jv3i45yz0gir1as9piz";}; +unicode-math-67919={run="12xc969s6x742a3aay28354cpvam2x9ack1396q2hk1wdhg846fl";doc="0y0sacc4rd4ilzjfw10v058wv626wlva1kzrbrbqxsclq3xcm2fy";source="1wr1hrxd63z5iisdw6k95qjknl3i917y2dmnrflyn0afvl2pxjg8";}; +unicode-math-input-69591={run="1bz4f905r178kkdbbx9c56d0l63a3gzaqia20qj0q0zhqvakln18";doc="1lh4qx0lz50j2j69m62330snq5wsg7vw5847z3jk4kpliqa9ybm9";}; +unicodefonttable-70354={run="0yvn44xyf0lh8p7r2kmdw15gwyjc9zcv46bc7bai5623shbk5xkf";doc="09al70k7rigadasi2i0rhza88wxnasd6j4b8mlyaz9pzyqc1dxsg";source="0wagy5wdim81c8yp9ssgbx8hgf5322hc2jwg3zwd5jsffvlv5jab";}; +unifith-60698={run="0plwq53cp9rsdsjd6db1g8b39k5czzdsmmrfki7ckbgiw317k7w4";doc="17q97073nni7x2d1zlplrwfvnxw9pkjgk79jwcvbgfjq09cq374z";}; +unifront-67054={run="04rm3pia1x68qm5kabay70fr1szrzvg4bzk674din4babl3nblal";doc="1d2kmwfa7cz009wfc713my93v3pgh1jcqz13jcy65f7py86qf2xp";}; +unigrazpub-64797={run="1rg5b9f3679qn8jaaqn29bfw3qgyxgx3p3zxi7vsr6kn6ada3j82";doc="0hpjzkdhrl64g00x7jb55wf5mz57gab432vxq3hd4igffrxvk88m";source="0mdcp3f8by29abbclsy9ndydgslpybcs5wqbiz5aiy5blp8d8abx";}; +unimath-plain-xetex-66394={run="0h81w9pzy11mnq63401m6a8nbmz11xxvjfawqmnyzzgpx0v0n7r5";doc="178slwilm2klrln2q7zm42xf6hanc16ksvrn6hzfzsda46f5mrsn";}; +uninormalize-57257={run="0ai1w8n010sq2fmwvp7625dfmmlvzx9d67ji34zwxdl2cyjlgsw3";doc="1dksyk07zjmwbzgc7c2d5lz7fkvrllbj1nrpb34vd54yxl4azgip";}; +uniquecounter-53162={run="1g7ix0pnd52dsykq5na5d4kfi49zm8gmampf5yn281mn901p3wjc";doc="099clvqs76hiwl8i2gqj2hdmj2m77v03pc82sls2xpwvrs1dqd4s";source="0cgpfgv4yybrq1ryhjrzwfwf97805dw6if2s1qivhry94lb96vn2";}; +unisc-63178={run="16drn07j24q41a99w7cgf69d9j21if2csf4lplbkrvjnv5rnpdda";doc="1s0xqq03ccx4rrmds2l9sz7qphnh9wsimxmghmy7d1slmfwg2g1a";source="1mxjq2s5ns2lhrrqy3xwxlnn3fcb206gvbdvr75kagzqb61rz5mq";}; +unisugar-22357={run="1dx088b21apj2rpij4pxa9srx29irzsfmlp9vn8fjpm1ag60md98";doc="1mnpbd68i0112hhcgiwc2j5jkwffrfdqlrdl896ybd0cpwq5d8sp";}; +unitconv-55060={run="07nmxxclxvx28w8w7gmgfs5vqgbkxxavw8c31nk54dvskd6l6zlk";doc="0yfcqw1fx38kbc4kcw1620h6mydzzxi1y67x1yr6wa0aiwsd6il0";}; +unitn-bimrep-45581={run="0vv9vc9cvw3bjfndlfyr69kpziymlgalyvc11av9kq2x5b4jlc5b";doc="1wyiar6xjhsjcfnxhlz8y1l9xvlcpgmkh360am85llfqlnar5w5f";}; +units-42428={run="0rblvdf1cgsm4fda44vvldy6my58dnars88wv2blgnzny8s00jhn";doc="0nn5y3w25sjxq0bxq07d6453awgm4m4gih5678lfxf9yvnmvigq8";source="0mmqp3vhly9v02fv4q4d3bq7zzx8nmm33nlvbn7137jgc7p5vlbd";}; +unitsdef-15878={run="1ck9awf9mzjhq0x4c3cpan79imh7ijpffii90955jc78h3bhcwkg";doc="15svjszg72axskaa3yg91gvh9y01s1nh5x6nhwqbr9mz3bn3npck";source="07v6xpwkag6fp8p331gcfbb0p1ca36rvrs9kbkayc986k6nds688";}; +universa-51984={run="1r8rh4jbx3lxciszf93klg3zwv06qqgnzikhp11c2qmrjrk9gznh";doc="0acfyvdbqagda11730d5bmr5qlfq7hiqw7dajq143i54k9ln8mvi";source="1ydba7wjiqnjc8drv5j8skv5q8hjrliwd38s6xj2jd12i0zp3gyc";}; +universalis-64505={run="19v4kl6xbqj5lpxlpjghnnhs2dnljzzr71pvw90z71n6wncza5gh";doc="0nw6c17jvpyp5lvarj2hf1ir2hwc54ns9nflw4zpgz2ifr5kr1ci";}; +univie-ling-66728={run="1aqh4gpxg8ryx6lvqwiz1m82hsjf1g1206vqfl3kml3vbkylv21i";doc="1p9i4gy6wimgfwcwffqf5hkpxhj2knn7ljfdx818rscrjrrf592m";}; +unizgklasa-51647={run="0clwxzngdy6n7iwk9zrn21i1frmahdf0s9qq2nqlhk4h6rxwb8jb";doc="1q7q2fpgpjdsmbfj9zijccqpl2m6n0dch72wl05a64hxg117jbl4";}; +unravel-69308={run="0n440qrni1qnbhjajj2kd7zwgv8sk73bv4arasha05xfic0g3arf";doc="1smf996jz3iy82p34b0qjmjnpipxdakp0b9yk5qxv0rbkiwkhymc";source="0hb343svdnjx8czl4x1wlhpmzhrzsslykpnx9aywpsgn2xabncnd";}; +unswcover-66115={run="05nkk3xgpjcdlsk8xrj0mn5r3kwzi15awish2hd205v1rnbjiaz6";doc="1jsxc55wrfczcc9mnf5yl2yqbbzbk10jcdly5z5nyfvg51427adw";}; +uol-physics-report-65761={run="008iix41i3zxghxmxiyky0cyfn2rzy8q64f49dsj6nvixp6zlf9d";doc="0pbl7vx7xvmvi7fx7l0mn98hff9d838n19zx7izg3xgrqalygpgp";source="05rd3ss59gcfa9i3lpzfb6f8rhnmx50868si3hys13pqhwb7xkn0";}; +uothesis-25355={run="1wgs3fxg01cxcpnhk43ik12sjdip77fkxdaik6w4w926i8z0np7s";doc="1zmpx6biaxlm7fys5a3qahglpbqgn6ml07z6q8vplyqgn213hd6d";source="137c9av6i6b6hg97wmqd2iwqzd1dq6lvg2992wnbm2bp2m9r20zl";}; +uowthesis-19700={run="0iv9s5dfmbrhxbx4kqbhxjf23rln4ymcx4kkk5fmc67qi51i8jnq";doc="1xcqs2h6qs2lca74mg1jvqza77xrph53bk9dwkk0bprhkxn1all1";}; +uowthesistitlepage-54512={run="17xh2myc3xj2zwbc7jjdmnfqhmhzkqj3dwwn2q04hcyr4bm7vnfz";doc="1gm1clfvd0g45fpgf6h4nmyy2vrc0d9lqfy9h3nn2pnh0ki2z0ir";}; +upca-22511={run="1px88kyvr7jkzzcbd32pi7zlak9wwzf3b55yhnh9bi03pk0il33s";doc="07gsza0vhs52qjj8im4i1fg2v2lch9iwk424ik9c1xak1v7s9d23";}; +updatemarks-69989={run="10shcyaanjg9dm3pb08li46q6hbksfd4kkkmj83fivqrm3f69l88";doc="1k4gkav2afnrwhg1469xhyypmrzkdq1zhvvwa4zmavky9lvwzghq";}; +uplatex-66186={run="0kmw51xvg44jrzn6r1w2biz2d0m3j533qadi4bfjhf2dzi4jdg61";doc="15b338kzdd0xbglihc5hf92mv3jwmyxp2pf1nb9l75cxnqfglzjl";source="01gpwxp81hz8824y1hffq6b035l0pxa8wyfkjm9kh5m58j52s50w";}; +upmendex-66381={doc="0mj8nmqr3z7b802kvjmnkckq89l694an7s639yghf3b9b5v7xihx";}; +upmethodology-64613={run="0r7k223ypavdbywq5fwffyysn68pg12dgp842jd22b866ffm13pj";doc="1vw9azpz8vwanfg60vr1a9bbx39k8v6jhvn505pvmf8fqgkqd9ch";}; +uppunctlm-42334={run="1a71nsc5dnaa8gb4xmnlhvdsvid2h9gwmxr0xa8blh4xd0vwi2d9";doc="0d1qs7krblmnf9r2afvzx5ir94aqgxv8p2d9sf9p18nlz9f5h06q";}; +upquote-26059={run="1zglh6pb1fq0ipsivhj0knhcwcg04mjkxca5s2adbbfk2xs1iqgy";doc="125756iaikya3v0wk9a712klp39ndw7i68bybnrif2klm4c695lm";source="137lbzacpmkm1fdmp548m6r83mnhclsrcyqk1s0rkp558fpnqpp1";}; +uptex-66381={doc="14hn2n6jbibbqbdr72j74z5bz003jnlabi3kja0f0waxhas680gd";}; +uptex-base-68298={run="0g1ihpqi9im0k7zg8vmwzz8mz3qpy2nfgsq5r7kidsar4yrqcj1m";doc="0sadkwyprlv4i2mh0mxcf2paslskqg400xzwnndycx99yi9bvrvk";}; +uptex-fonts-68297={run="1306b0nq975iskifmbj0ah66dh969sbwydblhv2gywy0yddkg8x9";doc="14m7l415n7ywh0k4k6pnq1kf9iw7x0xv11qvi2n1azs5r9nyw302";}; +upzhkinsoku-47354={run="13fm9r3s01003n8ykbq8plx3xzj7p9bz958ylkl9f10kd9favr57";doc="0hd55x231kpcl1rmds601a2k1yzvhvfks7sg0424gzw7wirhns75";}; +urcls-49903={run="15hnqy2fxqblr9db4h2r38v1h4iwhk5kcm8qm9war1c1pgwg2a6l";doc="0axb3cpbqbksrixhksdhbjyqyic0176lyxxk5di268jbr58203xp";}; +uri-48602={run="1mmxhxm4y7qsvq4kgdnq2vhid360gcgq0yxbcgw46k56hxd61kln";doc="1zadcddyfrgfbrsyl4461zwz8g3rjwypixvmi5ny8f80z4igal6a";source="1w5hbpzc5xka2z834hnzx16ky0kdx3x4y0xxs61l9gx0ygqkzbpa";}; +url-32528={run="189lixyamvrcpds2i7nlh4w83mk5lnk73158kcw3qjanpncnnn1f";doc="1xragd7gak0vzj14f7dcx5hxg8plh47ncqdb1m5liaibrdlhgpql";}; +urlbst-65694={run="0kq36hv6hmj82784c1cf815xgvpcdzgrv5ppniy921yxqxdxn4yv";doc="0c7i74iybjra6mmra82ny1bs09j3qrvqri485p4h1cz6195v3wln";source="14v0wynzshm4qcical4q1vnvmx34ds00fq1733ivl6hr0sj833mb";}; +urwchancal-21701={run="0hlaimb12imiv0h7khcaar4xi5dma11bqcrb2b6imd4srgg9b50g";doc="1mzfmfwny5mzag8wf1h3k4xbmbzphwqv6r74sql8wyqw53s337jf";}; +usebib-25969={run="1q38qzz87nh2hbmml3b0a4919dgk6d5rn0z5bhrc4ip27dscvw07";doc="0byl3xhiz3b4hqqmq2wi5fdbshh5prvqfnhjcgjk619bn99cijxm";source="0asby43xsd35aazh2sncg639x91f91shs25f6f1127rskx5fd7vp";}; +useclass-70447={run="0cdxhh52643g3p5rszasqrkmvbbvjj211qkhlhmb5xdq4jsvkmry";doc="017x003x7cqq2bmhwp426l5lqm1bp95sl9mz6l4izk94y5jsyi97";source="1cr238jqdamc4pyq4jrmsdzbihqkdgzlb5k8g12d72hywk1brlid";}; +ushort-32261={run="0235a399vqry1vdyfyva9anav8axs1pxwf9v4hhhazsf85m23qqn";doc="0r0jib3fclxjaczcbzkb8ywmnz0xkrj02blg0f5i065h2s1qa10b";source="1sp8z5jnb5qlihv2hz0j2gs4rfqpy0ka3npph1dvvjvi5520c94c";}; +uspace-63123={run="11kmx5y9kdklgpfwzzh8mq3r9ycn5zv0a1pkl6yxy2vsyg6wkfjz";doc="1bxvpm8j88cawv0cxl8h65q33bnid5sqv8gqia9z13h00jcgkjcg";}; +uspatent-27744={run="043az1c7bs194w7frr768pwaliiaikfibxh6zqiznc85ax6q3d94";doc="1q04i3q9693ykpgsx1fl11w0y0kxffqyljns1qy04935s5b8vskv";}; +ut-thesis-65767={run="157rirfa3bi7pg1x6641r0j22ycb4vq1pv6b1pf0cadcfflh07dy";doc="06pkxz4kyyxm6pf34jdwm21z72l4ry7891508yc0hic89fgjlcl5";source="12xprwfmjxwcf4mpghcg0hsxsa8bd5jkg7pvp485da3k4pgslx0m";}; +utexasthesis-48648={run="0j8jjy8i5i9lgy7m9wnvj36ms597amnvb9a0ac2a2wh7vqf3dxgd";doc="0131pn2531bwmsv3ak1kf9nc4v86icxjg19d28sqfmlnfvl73v4y";}; +utf8add-61074={run="1xgp93wcvb2jiaggidznmbp173w0kfhwcw2bg7829hl60vhqnsjh";doc="1wy2h2a7a36b41i5ya268bhb6fiq9q7wqvzv3ncl1ll6wvvg0c3q";}; +utf8mex-15878={run="0inwvyrizq3mr4c78l036ib15d6v2bnrakm08hvxx6ck753kn1hj";doc="1nj94nn4s662jh2wykvrwkiiv2xzg6v8q4iax18d20p75yfcn3v6";}; +utfsym-63076={run="0w72bcx656rdkbgndmshzd6ackh1r6x6m2f6bjrc3rxkmhvf2awc";doc="17m89pxzhfrcg8b3pai9bpivypmzfm0ck0pbcp38nabbnwk7bmbl";}; +utopia-15878={run="1hsvl3la37nbb0b2q9995w1hlgvrc0gkyjkgqbsp99rk0ry392v6";doc="0yyxzyg38z6kip43gxlj3j55rdabqjrzl33yp1z043rblfw5b9mc";}; +uvaletter-66712={run="0qp48wng88fqkp1x0c3brzkr9f7p08pvbfws46dzrddxg5w4nwvm";doc="00g32zdkyv5x3hzhdph754f5mcqicgzqvcwigxf2dz9shb0phgk8";}; +uwa-colours-60443={run="0j3yywmr4rb011062gwaz4q56jcizblah0a4s3xi2gh0jycdfd1v";doc="0pa7a1ic7am0w1chl6cx778gv86pf38m12s0xdpz3hp2krkrjxwx";source="0h59r1sxqsgsl79jvm8q015mck28z89c595lkpilymahfn3aqi88";}; +uwa-letterhead-64491={run="0y59djz26f6br8gpdaxbzx0sm6p4gjyvfdi3g5w2rhvzv92w81is";doc="1kj991b6w3f6svzf130g4zb58k1n1fq18jvvradrqygvgrj8lg0w";source="1ysgg1idxm0h3rslw94ih10jmb85n445rr2cfzx9x1fhl2zclj3n";}; +uwa-pcf-64491={run="0bgg42n0sbp1hslwrrc8xclxpj87sggicxhmcijiijfdb88g5cl8";doc="0r8cmhy9laq7j40vkgp9v35xsq27xn5akkj97qysi844n4dia9kb";source="0sm6zx16yyi4p3wwfsyzgp4w7p53mqi5gbl4qcjj7iz373mmy3lj";}; +uwa-pif-64491={run="1ia1yv0mfxqrd61jy5qqf8cgpk3jxq7simpd74m7zy27sx2ywyg7";doc="1kl9scqzc4yyvi4b1rghr6lvpvq5587bfjl207675jps4gwcqhny";source="04zs8241iaslw7a43d9pk6scb9gd65dcjmv2cd29jf98ybimy1m2";}; +uwmslide-27354={run="1kpbdd8q3q0qkz6alvlnl24jjx6shc8z8p36d9grd3idyx0h18r6";doc="1m41j80x7cj8h87fkyw4mwhvqhxvxx5dql596s7xay8lcwlxq5i6";}; +uwthesis-15878={run="0x6j9savd25v7s1nxzs0yqv10i1bbd89pnb0ldjmwilrfr78yw9c";doc="1plbn6dkqwl4bdvsyskzylww9j8akxh120yrnkfamk56ij9dd0py";}; +vak-23431={run="122crp1ipxwmxp6pd0x04dxnaf3hb822znbx8v9gh93x8db4khf2";doc="1jxbijc1kn7mx1p167zd5rdczayz5xxxfdd2pwbsmav8zql32aqp";}; +vancouver-59192={run="0rlxr8q68lrv4zshsbzdwzh70kfmqxzcn0siy2x770riyfj3f3z3";doc="07jwrms24pa30bspmaljs447cphp1jaqjpdnm1j3qvi0svjr112h";}; +variablelm-60014={run="0apdyspg0q8x1j6ryzbibij9hn0gfqdlhjj6nz9q8w45bfywclvf";doc="0bcz4sbq33iwpg9r2vq5g3zpxb90xljjqbis9srk83z4rj7jyp22";}; +variations-15878={run="0cij0zdvlv3icymqxsfn6mfzdmb3jrxnfa3lz2kz0xx3x8yn0sx7";doc="0dwsw8j2bhk5cdw61xlcvlg152z6k6306zpbap2gjlfhf0z57syj";}; +varindex-32262={run="1s3ff9i7w7dga61hrkd7m2rfjq7wrkx1b7alx68kxkjcnl92rb9p";doc="1567hz8fpjbjsra7fxg8dlqkd39d0p0a6lj9kpglv31chws6w2sl";source="0gdrsb0n4sr7a4n4wxrvnxh34a6b1wzpqcp2m39rvw9my3h07vhy";}; +varisize-15878={run="0sd1znd4c2254fsj6i2snj3ys1h5vss2wzylqcp2pv31kbgpfh0r";doc="19w6h5w08iyc2kg61h5q4j4djwwm2x0bhhp6k60kfxnk4glccrmy";}; +varsfromjobname-44154={run="19j2avb7jqb9ndnfskwqfm508maqa6kd9qmqydflcb9hgjkz47xc";doc="0mcv48nbly7ihd8q8652v2gm6drvpjv42h0jrw9dpzraljzvpgff";}; +varwidth-24104={run="032izb0vpcwiydg7lli6hnawij95s5ygkwdp4bfk1c9j17d749cr";doc="1ysrbpv2mmi8fcyhdabvs2jiqj2mkajapjvsf10c8rw6i3yaplnx";}; +vaucanson-g-15878={run="10dk1ff3swbnx6l6c30s1ryn2dbyx9harmrcg7whmqdys1mahsbq";doc="1dlf50f0hpislqkcbr685y5xg7iz2y6zvlzjdkjq3af4qv7ncf5n";}; +vcell-59039={run="0m9r0wldir0g8y32aikm2il8qsygsc3zyv2zkg4wn7jqlidk6f2i";doc="1zrhf70s70zxm5ck22vbi88vpdjn6ba6iay88f41x21f11l536q5";}; +vdmlisting-56905={run="10fzab1jn6hk6ah7h9kyv9cyrv2l0gvlmask1c90njhvgqi2526s";doc="0b0vrxv5mlf721mfdvw46ixidgzh0bq88sgrvxb10y05wjcjqiwc";}; +vectorlogos-69010={run="1sibmv30czwrvp850d6zgw30daxjlz95wm3ck0rb4bshjy92rg9a";doc="08hkajc2hffhkn7zg7sqqcjc3gisqmkx3fgy43vf7vn33wa42n28";}; +velthuis-66186={run="1ki27wimj82h2dgw6c1f6hs93yg794j711x1w3vmgiwz3mdqkzdf";doc="0af9p3rq7d6g0549sj74vl3scww6ia88vwzfv84fmkysa6ph9n2g";}; +venn-15878={run="0kfq2wnjsbvk0ciwrm4923fpr7whmzyv240r4zps41vzpc4mykiy";doc="0izj8qsnxj9jgslwzz37xwr9n812y3cxmfs52yd7p4638qid50im";}; +venndiagram-47952={run="1v4hbkc214fjh5wc2myqxa6jcvr6sa31c7nz9avzj2kf40kp3ip0";doc="0as35w7fd9xjqhrr3v3nzld9bnhz6xg7rqgs2hyzx150xndy6cb9";source="0ci3ajx316b6iin315z1xkdfmxbbflnj8sf2ww7gkxf853qakwlc";}; +venturisadf-19444={run="0a80pz2ng6grjj97hgk277d25ijgc7swjjsr4rjbd1ljnfjdvf51";doc="1b50h04xl2nwlpclfxl7m1wnyl1ysf9d7p8jbahglnxaxxn8ib3r";source="07isrwhzw538w4asc5baw6wbfydzdrflrp3pk1qilq3a5wcj1n00";}; +verbasef-21922={run="1bb1ddwlix4v6knmz68yy7i2jsismqdz189p1664q78h12rxcpx3";doc="1rd4mhi7w3nsvvx0zxv43nd4ldw7if1zadh0xxbzbjaljypmshi4";}; +verbatimbox-67865={run="0pgim93ifd9mnrx7fkl9fprgf33wp7m5anms8qgzny0lxsm1fafz";doc="1v32x3j5zc8yl7rgxn3j40p53x4f1y8abr9w5fj0bwhs8qawv2xh";}; +verbatimcopy-15878={run="07syldn58zwnwxwdsmq63qgr2nb0bkl9di09knska9jk0c50ql1j";doc="06awpisb1y773xsijrifh0121pq6fdzp2ai0snxny5vrpmyp412n";}; +verbdef-17177={run="1dy1h0vcknnizm2f3zggga85slga5p77aw3ll5ca3kx5qxp1xqhl";doc="06zh9v72ywrg84wlb96p0y28sn9919pn2xjgqhaii6irdf3hmlma";}; +verbments-23670={run="1iv716hb41cy7bc7bk2420lwdykpccyg6wxvbxb8vk904fsgdk2a";doc="0hzrzb6m8iakip93in80x6k15b08z9xwjrbki12d28xdadqkpqcc";}; +verifica-56625={run="0i5bh8j5yjvql6mywfs617mh3pywnqd7z1m6158r3jpwyn6ki25g";doc="0sinc5ha8k3nk307q0piqwj56r2bh4pbxxyww29ygalfqjr755bb";source="1zn10fr9kv131w4id0djycy7492ch7gis27gbr5r02ydwm7nny1c";}; +verifiche-69726={run="0c706gskzpr0a379a3liwad2d1bavpj2zpacdkdm5vw6vxnb2y4s";doc="0rahx5d5gkfq8vyshhknvfb410wc8kbmphmnm0h7b46c0f1r8x8h";source="0sgxdki79pm9933gp8zd8gbklfqa4574g1if48b3y4jh2ayb03g7";}; +verifycommand-69389={run="125r3ncvllap1vmnj1wz11ir10223fvbgsy233qmg0kdclnh4v54";doc="12j8v0r2jay5f1w20f7yi1kl4jdfqrv2ga5748xksds7jj0x7im3";source="179642vhwmgrmlvavl5naxnj1a3279clgjyc090gqw8vg8hbnccq";}; +verse-69882={run="108qi1600f5q9im9vdbhnh0yalpjcx7qy90x7xqxnjyqh7116c3m";doc="0zqw1zrpm3hzv21gmscm9b3bfyxadw9svd6hxp0gf1virb5nlyhv";source="09rj2vkc7l4l79w97iycyw31lqwr946rdcrvwzv8nargpp0ynw8m";}; +version-21920={run="19b4h22lqvgzqqm0pivjjhmpxmijrr5rfy0xc9g9y7czsrp810hb";doc="17bsgyjvnna790nz3x94wbwslxkkz3958vj2l3jbyphm5vv92fxz";}; +versions-21921={run="07bxhbpsqgdbpwph2w7gam699605m181xmj8jhpcsf4rwcpnjik7";doc="0pjz8nk7dnf2jp6yixhi55zbrlmhv477qsx6p52dwkf74vxgv5ki";}; +versonotes-69249={run="0kcfa9j99jpw521sz1q0w9qfjs76138l1rdy9ha4gb61m5r95008";doc="0z0mpqrz3n8lp3wf1kfzfmm39n7rwv2xxfvy4x76a67qdjg2glbk";source="1h0qkcpps65a8qcbzskbghsdnqvhgg62yk7ihmv487a8lid68js0";}; +vertbars-49429={run="0a5fc0a4z482fcxx27wrn20fsdvx9xclsy36623h80pxnfw49aji";doc="0y8vfa23ld199r45pqd56rv7b0iskskpaqc08lix2zss6a082iy1";}; +vgrid-32457={run="0yb2hr83xvy19j43kmjrx9kf2cadyairjr45vg5a0pbr9nwpzdsr";doc="0ymfdbqws78n3mm9cbf7zrcdbn4hb9pzzjsw77hlg023h4hkddh0";source="0rwsi6lmd4yhgpa6605631ld2bn8pzij7radk8vhwsa1sn19326g";}; +vhistory-61719={run="1m3k7qhrkxa52hky57jp1p23sa2binjfkywv51hjfkz5cyhcqi3r";doc="0f8agd4p659ncqx66yam1q30jaxx20qcmg649w3vy7fwf6crjiyp";}; +visualfaq-61719={doc="0fjx5y95n8bhsnwsw34sazbgygznvw76z01rrxmn1bp8za7751n0";}; +visualfaq-fr-67718={doc="0xk0qly49dqkrw1qjhnyp4r7y5jykghlp1y26hipghlaqqhdynga";}; +visualpstricks-39799={doc="1wfri908smlw1ngqq1mjll2b80b29piicqmv67x0xs1v3kc2sz3s";}; +visualtikz-54080={doc="1q0a1mhc330z8cnhghp2p46bxsmzz8cdba8hcvssglz0gsq5z5fc";}; +vlna-66186={doc="0nfb7mj6y9d4n89z59ppi96grfylwky97mxcv9rjflr5kpqlpga2";}; +vmargin-15878={run="0k0qp68wnfr13i2prx64n463g9xa4cf6y656m2bc735pvsa5ln78";doc="0l1lv0szznc9l5jz261nkcpq6dq28869s6h616rama40kqpdm0bh";source="1vwydnpsd5ha4g86dg2q5s012d6l3yrksc580m41q3i67npb8chb";}; +vntex-62837={run="1857xywsc16rgarwhj30jk9mfdw62483g31gsir9rgibpxdjchsh";doc="040364kv9mizvb2bw22in4z6smzplx7jg9wac7h3wl7739qcfwgl";source="0f7il38l3yp8v6yxgg5mszgiki9z0as1s1i99ky50bvvb049x8zg";}; +vocaltract-25629={run="0af79zsabml28hwhf2nq19s1sf7p6kljyvz6c2zlbx96a5k9mjs6";doc="1sjvklf54r6znggylk2wyf1fw806v8msc2g24ibv4p1ia3da2giq";}; +volumes-15878={run="0jl7n29bdwi7m74zb6alp0c4aamic3776n5bd9xcnf5ihfmh9ssv";doc="0052j7zhnbi20x6hsxv68ls2byqci2n4crssb243diid8yc763ac";source="1lvc7fhdblb5ys2blbm0fdib5y311nz4l6xll1zzpsvbwpcc8imp";}; +voss-mathcol-32954={doc="1c7kzk2m2i8f6vqywnzfvcmv11ckanhcjxf72p4rgivw8f0lbwjm";}; +vpe-26039={run="1w2pxz5dg3q42cdydj10fzf9hmwbc1xy8655s7ngzhnj0vljrj1l";doc="00n8almyx5g71gwxcn05vpfvvisqpr4k1lp123ys810p5n25s31z";}; +vruler-21598={run="1di4a3czay9gj5dbps78iik9r5p0n5vxk9dagc2ak6gdbc3rz1ls";doc="1885iaxgfbc08ldwrzv50jpmczhnjjvhq460vspdp33f3z5i7ifq";}; +vtable-51126={run="1bdf5h2nsw76y2w4gw1ap0ncg9ibydaqdhlpynj4qyy2c9qkb55q";doc="1w144as1s1kfd9a8z92kl8v2qm6il09k5myz9siq5dqxdfs3k9hk";}; +vwcol-36254={run="1wfqcin8xmxrby5mxn9s5j32zmr4ka4k0h9ps4kdddpq238db89n";doc="1zyndap37lq6jk9pafpzd3q5bib2x7yrnz6wk7wlgmgiyb6smj1b";source="17apnly4vihdn7dzh6hibgairrnvzadxlv724cgb5lqaci74gnqh";}; +wadalab-42428={run="01lf8nlga2nycr23xpzl6xas2nlgajjmia4lk4zvjdgcxqnipfrq";doc="0m8x6plkry0p3jabvhgkccb2rvlsz941di4ihfc8schkq7iyjlxq";}; +wallcalendar-45568={run="04rck2mzvzpm2f934iz4nni9s5w9g7a0qcp3kvp3bsqa6nhhcf6v";doc="1b2nn4cwsb6vi29a49cnnazpzffwbpyw48wffklv11frbmk74dnj";}; +wallpaper-15878={run="00cixdnwr4vpfpqfdcbra4gwz0i36kddak8ywv8l4q4d4yd567c9";doc="0ngsn8an7gqzkw96sdxb4q24h7bvbjw0gsqk6dzrdphclvsjy8w4";}; +wargame-69692={run="0v7mc3hfzjissd16f4l5fmv0gx5dsba9rmgmbsmn5ny0y0b5jkgl";doc="10nh98h13fip08k15wc1105cw7zi0ihb614nz12aynhligi667c2";source="0n6gg94s02c026ca13lmg36f5djdnn88xnf8yvv9k4h4v73qaxl3";}; +warning-66616={run="1rsqy10fghs5n2zb3g378csxykrlympd40g74wsz9v4aqb5a9xf1";doc="1fsqznifd2fj3czhhhii1j1z79f3vdkjhf46sdhc67y2izqmg8rj";}; +warpcol-15878={run="1dr0ic0pskvw6397q1yy1ibbpl1c1kndqaw5y72zzzy52x4l4j71";doc="1jc7rilhf61irh8kgc437mp45ryz0yr63z11r9ixbsj04dmfk2xr";source="1lnd9b42xyzfnrz94x10vxrmfy6r2l4wlxbfc1c02fmnchj2wq6c";}; +was-64691={run="18yszyvcv57im6qk8kyck21mzyzwmlzn4s64jlzz0pdzpjhn7sxa";doc="1dv6d27zlvpb1kc8qlj1jxbq08czxqrfq9l0ahqdcrl3fawdgiv2";source="0ylf9h95ig7vy64hai9skl7dxvkf0rj85syhcpf9a2p301hchs35";}; +wasy-53533={run="1gvk9gdx32sm4q2f2k4i6yj45c6zyf0hjkq7r6ysygmd2zsvf9lh";doc="1ah93bb5gr4di1jbq316cm4d5iaijj4f06vcjj4x44jajirlaq6m";}; +wasy-type1-53534={run="1zkhqyh72q1w6lr94a7164myp5qfmj119qim58cal1h48n3wypcw";doc="0rhkbkmn7xg044aw1cm44vbwiqfpcixpdpcdvz8yq6in8kmgs0lv";}; +wasysym-54080={run="1i8pvf5yfw5j0rkcpy6v8czvr85p1yk18c8h18iljgsdvfj786h7";doc="07lhw9ss609gjlhv9f0bbyv3z327v3jqblfwhcspwg2sjvazzx8l";source="1i7y0si6mbd6kxbbyvcfak46hrcf95xv8x6nc29nc6adqjbygkiw";}; +web-66186={doc="0iiyzzrgwakw7ipdnwmjwcrqayzq4yn4786zlr9zirmmj34hpamz";}; +webguide-25813={doc="0wid2sxrif3mm3lrs0s6pil949byviq4d7924yzvmf9hkrs5f03v";}; +webquiz-58808={run="1bl334im0jvsyx78g6jq9m8623xyr4xz0avzfaymhs39dv17wsyr";doc="0lwc3r3w2d7lzz39ilncbckmvx536z3wvz84jlnv3flm2dll2z7s";}; +weiqi-70179={run="0rwysz41acvsw8hjsxa5rb3nhq9cd096kgc05rf3zk6rdiy0smhr";doc="0s3g2ymfqz8acrqgb1d375bvxmb21sxw16j9a25xaap7wz27xry4";source="0fzj1cyxj505vf82kzjg7jy6ifk3m5pwsvmh5m6jvr2s7d2m079d";}; +wheelchart-70518={run="0z59dvngsyabg6ycmvj73nj23xaf2zkailm9p718mj8sp8nr72rj";doc="08zncid0bxyh5i1xigdk5kdnaplpa0jf90wlnd6srxfrshy4b7rw";}; +widetable-53409={run="1k1jnl3jbrbcc55cl34wj3znfay2wnf8k8sgdslicvnan2j717zm";doc="1giy0gvhngsmfwc87j9k2p820j6bm2mc2r1kbcl4ci0c3383mify";source="0krkcnxzjrn7lqd0qh8lgjixfpd3c5glvj1ilqhak9ifd3lq8r4s";}; +widows-and-orphans-66753={run="189ch6wprsw4xsyk79pm03kkn19h5rkqpfs0g0p6kj5jg39x78xv";doc="0vzcyzcf8fh83llravv0iz739ilr15qpjkgyjmb95r0a9zwx044i";source="0sf8picg17x58baw36s0z41p7ck26439wjra4mbc6kl6gh11jqmz";}; +williams-15878={run="0pbij6hwk82pmddl199sxin34fk22wzvgfj0dpjsg0i5qrsg0qcl";doc="0vvz6fsh4vlhwirz27gyni6xnqinhl6iymgmfhlcc808y7fawcvq";}; +willowtreebook-60638={run="1g8v5am9pzabiq5l5306q0s3a9zmyrdx5s7pjbpph08bhqfhxvvj";doc="1368jr8d6444bnalx4p0by1133liv7fl4zpvafdm0a6gz8b5n5pa";}; +windycity-67011={run="1r395672jacizgwyk2jlf1af1np4p8i54vf4g6lii5yv0yhx6pmb";doc="0f6c5pnm31bdanbcjn5p7icq9qbk7j07sam6g7daj670z385lx5f";}; +withargs-52641={run="1b49fag0ivb5srlsxcbmy8ssqsrcbgadkvcxd6xn9l9bk28wpfwr";doc="12n87c9181kskqvx7bzvqjimg7agcm8n2z7rxnh1g4kh9bjr57ms";}; +witharrows-69996={run="1mjy1hjy0piy7j3px4gnkvh0hfky837njlnsgr92f6nfp2fx8w6r";doc="1fjlnw4z9g9mkf3086nnh1jycclxb3xfhrnd1dyg03ncrwvx9wwc";source="1vhdm893g8zk7aqqpx7wsy35phaffpfhd2cj359z6k3r4km548bz";}; +wnri-22459={run="16hcapjdb5dx48gbcvk2bkpnp1w9knswni2vs8v1l9shxz03nnxa";doc="0wpf06is1vkaw4ivhrz4hfii3qrgs71cawgn1fnm8fdzalgb2frc";}; +wnri-latex-22338={run="06m6xwvm1pxz2bjf2xa7k3x6m70p1f5866wn5imipmhw4wjs2jp2";doc="15d9mcvdhs1jd574gm6a9ppxyy7avclvq54ikcmlf4vn20lygidx";source="02x8fdavhkxfnxhvr891adpn93yhqccs31w05h8f9hyg34jlnb30";}; +wordcloud-68209={run="1s3fpbd182zqi94kg59mpssdp51rh7gw5371xrp235g8ih50054a";doc="187ap98yaffx8nf935chvvgjalx0g8xk4gnaqbblxkz26qi8z3f0";}; +wordcount-46165={run="16vxb87jyj7006akcd7fdvnqihz9rjyw2pl43mdvr5lxp22fpxdx";doc="1yv9lj7k7m446knp2ghsj0dj95splsc6071w2iarh8cq1xlbj3kz";}; +wordle-68170={run="1kz3xxwls671vv1czi7fy6k0cpzrw39afqmakq8apnxazi96lp3l";doc="1jjfsviijxk6n3qymsa7v7rn7slfq30k2arsz3xrgvri2c22z3yl";}; +wordlike-15878={run="1mdgcdiwnqcsrqrzbl27v56xpnzvxb7gg7a8vass31srk8n10ssq";doc="0i9k22hwjkq3pb6z8hiff6zz8l3yjp4vh8x89z5mcbg8iw5gjacd";source="1azirdir33aixw7zh9ps9npxy1v8ckgsdjb96ri1ma0cy2z5d1ij";}; +worksheet-48423={run="1rsh38fx4ayai0mlakqgpzxpnwp6ckzjcpiwy7aqlpia0504jgpc";doc="1hagdjrf472ip4jjkrjv6mgycwjlhbggval7kkk449i0xd9kiz39";}; +worldflags-68827={run="170wypqn7mmfj4s8gbm363l4hqmmjhsziv22z9hyfhrdh0lprip6";doc="165ny43vh389qqi7rzw7mhfyn04awr397i67kkc20jiqxl6v64r9";}; +wrapfig-61719={run="1axad52pzzsx9d32rivasl5d49dj51adk5kcnb1rr8mz59421rk3";doc="1c3xd0ja4063qzag0v07mxkk52yczlcwdbwn84gsfp5hdmd5cibr";}; +wrapfig2-69513={run="0b34ppncrnrm4pd75l7gjpc1ci0q8r2667fwyfqggskkvlwmnm0s";doc="0v08c237ydmg9ss7vrwsb9sbzbp3acqv4ldfzrk63zc1mbp8qs7j";source="0avc8afvv3mmmxfkz3kq9lxgl5frny5z7w7zi9c9wblx2qagqb6x";}; +wrapstuff-64058={run="1w5bnl5w2shar2qg2lm7768n8h4qvgzhxaacphjhqbx9zb1r20w3";doc="14npfsqr8wp1bgq9az4x23rmkkgpn37w4cr6c43wyqs7cvizz0yl";source="1x34kkbv8n8c89x21ikv2lyzlk24qbwcpcxwgv13lqqlcqxfz2ix";}; +writeongrid-68863={run="0vkm3hfgc8a3a6x5sxyszbmhprqckpxy0ibz75g6dhf8wr30jrf6";doc="1dvxx2gqvip9wf80m67hb6w76bbwcy2nzk5rm4m8dj9fvpzfv2jr";}; +wsemclassic-31532={run="0zpqx8gi2yf8cm5rmvchz0jprfwcc0gjkwcrygrvlqhqqn7qmc07";doc="0h7vz6pza8bv8y8ihfplbsq8ip9ds2z63s7j7qh84vf325ci5chm";source="1522cvwkw0ryvhgdqqd7k8lrbrayrmm3h31c77v7x8a81cry2bj9";}; +wsuipa-25469={run="1grz4s0zi7dlgbks7rx0h0rkjvchilhjabs59h81f92f835lafm4";doc="1zw7ibbqc75k4hplbvqpdmnqg5ks9bw75mrwcg14q1rb1807sp8w";}; +wtref-69214={run="05zfj6b59m0ic977w31fi4i86l7214xixws7yidvnr35fa7wm75z";doc="0g4fsbhhsvszvpnf1vn701c8kr8lpq01lcd2g8nnmknvrpd56v5z";}; +xargs-15878={run="1r4giz5gp4pcnxw12lr8hnsa45yv1lm1ddq6g33rkgs1qjzkhv02";doc="06kfclbfr2kc95c431hn54g0c6vcv7vscsskg9myrp94ilq1qglk";source="0k58hqv0jmk3v2jmx212idnfrs9rxqz93zq34f5kqx8dwhnss9pp";}; +xassoccnt-61112={run="1z25b0dps2qf1lsvmbq462ljyyakkicg92d3l1pz254n2mqzvwjb";doc="0057kfclqs5n04ghsz6ad0pvgzwp4hlpk21c66922nscyl4qrfnv";}; +xbmks-53448={run="0pv35b38frgwbi4ijn1x8w5mx48fcy709adlrkzhy641bw4isv86";doc="1nr1m8mhqwkjl9l9pw72ls8xrvg8w2gi8rar4chk3xmh6kphi7ra";source="0waizijqrvg7qigh317vr56bi2b795p5k3h779p0kbl53k3f9f6i";}; +xcharter-67742={run="07c71gkxryhr6a1yjqyqypsmr4ns986g00nqi0ij823bz6q34hk2";doc="0mkgx4daalf59qrh0afd025r0p8nq2908f4fs1am0sy6svc1m16x";}; +xcharter-math-70333={run="0gf3qz3wk6fg6p27wdkspg7saq8b8ji2dh0r66pjffkvj7vmj178";doc="1h9dsdyl225syhihzwkcj3v7lb55m4fhlbxwv5jq14wa46hsrafw";}; +xcite-53486={run="0zsfyaxs0w2xy6fa1s6hlrcnzw1q9n4n676bv6j80cwp5cw7nnhg";doc="1sfziwn05dii3gviiahvmg67kb04hzhz4cd1cwjsrrvnjii0dqb5";source="0j5blcycs86vgmi54z0b06il06zzyjp4v15lmdwfnx0amb9y8jr9";}; +xcjk2uni-54958={run="1x77gmg738r2zbyd0mc7q079hz5wbvabyszmwizfdj6vflm86w3y";doc="0xig1w251dsn2qd9iywcdc20plibadiw8hl1iwygpzfa3187djjf";source="12hbjjdypk0s5k5iaac80n2n4z1zlkg5lp59y58dwnn4y1dx6m6z";}; +xcntperchap-54080={run="0hqagjlxphvfqmslg91fpxngbm15i3kmawglszj8z585i0j570di";doc="0yf5ak4xr07jzlh8s087c7g8rfa71isziy1z13qy8ifv2882p9qa";}; +xcolor-68864={run="1s4iv57w90ckapbaplzj5p837k7a0gvx8k33cici0sqi115iqvxc";doc="194q54ls577n7cv6hwz6b5al98lh3v8za989cmrqg7gn1ahr5pqr";source="12lki4jl45c4jiwncfkcbypghqq8i61m0ams9jljfpgs66421kkn";}; +xcolor-material-42289={run="0sa38kjyy4iywgd9lwhd1aqw48laqj9h2crcarvjd8hr4xwhrbcw";doc="00jfvs4r7hsclvy49r6waanq1q9vszdi5fhlnbg5arhkf53lzii6";source="1jiyl9vry12fl3y2c6l8z5ic8jaahshbvaha8c98h1h2d8mqk6vx";}; +xcolor-solarized-61719={run="0ggm9s8vqw80jfsmw5jn143xcbrx226rwkarjkfqhnlzx85k2d36";doc="1vmr5y6c5mi7hgkb33daamag2y4j6vpiyxnh0cpya824l6miichq";source="06f2x0w9k87wd75vm6gjxg2pdrcv3g6406nraq2mnlf9sial9mnh";}; +xcomment-20031={run="0hxbf6hid76d1gm7ngjbrrcb0x7faxsqa44560f93n6arhj1nmwm";doc="11zcprsby27n8dh78658r6xmmkpqzmx28f6sqc7jhg403jq0j27f";}; +xcookybooky-36435={run="0hx5n7rz2aw460m9cqk2f2p4d3v7fhr02cjf8wk471fp8jwn5bx9";doc="0x9aa92w7b43n49d6m0rlac86f3hsgsrhvq82g3zixvffypyvm1i";source="1z951i4sad1i8bjmw7bgbkanzg04icjj0qfjrshr3m8a67wlxgjz";}; +xcpdftips-50449={run="02g4rm81gf314ds6yzrgasj1ighbyvka7p0vb8mrl78m1ybqjab0";doc="0wcbx6qx288448h2rffv87xgzfj8i30z1v2j6qcp8nlqq21lmw38";source="1h60va01gkm2m9jz521wx93libahh9fi3a8pyb67l6zgjd8dllxi";}; +xdoc-15878={run="18nqhig2kiwa1yzk06v65hzriq6la8c31j6f7caxzjrhjkzx0rvm";doc="09i5zcp7qisgf5rj6ys4rqvj8v8lxcxr16ddmzzvibgdc8kpc3za";source="0vxkqg2jl0qfnahfs82764z7npvsyc0ys3qlz6xk61ylhyqvycns";}; +xduthesis-63116={run="08cxhw5lhklv7vxl30fhwmlgq4kmv53a8qppcmsap1v8jc8vjrdk";doc="1j8pqz4l85qiziry85w7a23i6s577nb2cpbq4v5jgvp5l8x8lhzk";source="0zdlq46z2l3y5zydal9nsawv7nhhp113hdia15d9fd23j8gq4jdp";}; +xduts-66661={run="0l0p1xmnphgsfqq0q4si38zbrzxgmwzw3mqq7lyd48vwq8m8sqad";doc="0l1v9a1c6bhd3k9r272y64lyqpgn1vi6hflz8cg90ybxqxwrgb3d";source="0zaxm3rv20ijh6pmcas69hc3m2x3355gn8g1z06ihn8fnz77wl68";}; +xdvi-62387={run="10aldzxy02d9phqr9qwpxxwci7vf5q9z7sgxcz50kf44asa28fcm";doc="0n4v45wnzba23qpv5nmx87rdd09wl74jjfgpy6z66xp9jsdlja4w";}; +xebaposter-63513={run="1kdrjvdzsn9jwb6awcj2g2cr5csrhzds4w0anb8wm9q3532hcw58";doc="1k2cv0b1l4bn229rjvwcfjivkvgdifjgs5mlp5s27jpq9m5jvpph";}; +xechangebar-54080={run="03d1wmvldpfk6y52sd2pvw3ipglbl8cc851rqlz5jgk82c2frxg0";doc="0cnc62nff1vljwkk6gb6r0cwxq17b2yl4v9ilb7kxapaa6apbp14";}; +xecjk-64059={run="0m93s5m9m9xy8wjjm03wajcwi05as0y5bv305dzryh5qcfv1ncri";doc="0ghbgk2a89davasn3si5jbszafknrg4gpvkgnq9hmndsfzfaihsx";source="120zadcyidw8cbybb8gz9qbf7r1h8m5cadqxnn8xs5a84czgriry";}; +xecolor-29660={run="0ws34zr158nkpghiwlvigb44zzi5qymfqxzsnayw78i6zpqal55x";doc="0hz9kk36ap7szbsd0jp6a59lnaxgnmwl0jg8gmz8s1pjf77jf5ww";}; +xecyr-54308={run="1qqfdi6pxlkx6pxi2q61i0diwmsy9n95x4bvj9r3pgaf851p7cjx";doc="08b2xahg1agfczvqpdkvi3641g3pd2w2yc245bnyk0nccfcnf3k1";}; +xecyrmongolian-53160={run="1m20p5x1s92cwhsixaz3s0y00r8n0j6172bi8vpyzcpf8mc886br";doc="0kiyjcqlajmpj80n8wkk0ziri83811ivl380i3cyz7rxmsh1hqhg";source="0dj2191iqcm9qpi45h45r3cp4nz5gdviw6xf9iz261b3pn515prp";}; +xeindex-35756={run="06ipq7m9mnal497j3awdspqim3fs7v695pf2x7v4l92vqz3hh1sa";doc="1pa1fa8vjgbzmgphx3fmm93dd5wr3adxrrld5xibk2qrp7fgkbsr";}; +xellipsis-47546={run="1slakkdjh4c88caxcdznir5gkw0v7aahfpqksp4l9as9bsl52980";doc="1jlndanic0xc16ba1hg1lswcxa2b20hibd25bs65wyag04rbh8lb";source="0768vqhmxgra190g0k3k4hhzgkhkxwwnvwmdpymphsqm9lvxbl95";}; +xepersian-68117={run="1i461pl3hdqd2p02d1xnmzpxfc8bxcip3c61bfjf30cnsa184zvc";doc="0b04na4c83ly2r8jv5d1mpjvhnc7i46kzhbgkh5kxzvjrpmqwnws";source="1409w2mfp50mihwn7vg3krhg7mrijxjc09sgqhxa1fgv1c3yqisq";}; +xepersian-hm-56272={run="0qj98xrbnh9bam0a6c6vy7ffaia3iqsx5s71bjlmbnyl6y2h8lwp";doc="16f5x8jv8mqf5a32gvrzqwh1xz4s5nxwqsq4q8sg1za6micqniyg";source="0zcq75xzkr0bgpf1xdsphrkcv70q17vs8jkhzxvjrfzilh9h3iqr";}; +xesearch-51908={run="1rszh3svj87vw5lskxv8bvnkzzj6k9rbikl6rr87ry9apmymsklg";doc="0cb73d981aa0s0hg2ynrg3zybsaw28f5b29zmqgvzqidi8vxfbhl";}; +xespotcolor-58212={run="0w7nns136gfz1dvq6iplk0jbza85lpzlpvsxf1bzjhqw5sk6v4p9";doc="1fai2v8x4g9cmda5m6nvf6g8w6qg64qfdq1rvjlz1qiqmy71c8jy";source="14yachqawnmpldkwc3f3q4krj2sr1kad7wzy1lfxwqggvpbdcjkh";}; +xetex-66203={run="09124rd2k40dihk4c1pidkd44rvhv1b0ain1bfk5ry1032ky7wly";doc="10x15yqxsfb6xsl8z75i1hnh6dcff6ivl036945cfqsycyi9sq72";tlpkg="1ai1pw2hqv01z24x9s7vjva5v487rrr6al7rqpa001k7in2ijff4";}; +xetex-devanagari-34296={run="0i6hkzl2jbiixzrw2gvngnyzqkz0lfdilj1zz5xi6ypffi4vyihx";doc="0ahcawr9872lipz33jrv870lj2601j593fwfqcn5x0jhas93ch6c";}; +xetex-itrans-55475={run="17476frf0r4w50bfbk6g6ic40kv3x3i6qpl642glb3vyzyjd5dbg";doc="0bs67djfa9pi1k2900y2ybnv6lgjd031cyczks0jjzfnav2g4df6";}; +xetex-pstricks-17055={run="0i37r4lk1l36cch6kjz12mfzgpg6hd7n903fzbj9h7mwmjwnrylk";doc="17kiv64h94hf83ailbw29wf15r7gv9yq06h3l53c38rn0n20vdz9";}; +xetex-tibetan-28847={run="0r8xgnagsqrkxr0ij0mcv30vhf7c3amyf9lk895lgwsvz6cysmma";doc="0p5l36zb8l3h4x8sjk8cwxj5psvfa4j0kg6jb93sj1ln3yfrwfr2";}; +xetexconfig-45845={run="1253njshiwdayzq0xir9cmbi8syhjb3sc4pyrw9p6kzyqvckkcxm";}; +xetexfontinfo-15878={run="1sc0lm5w94320f5abv2hw2bzqprhk73fjv2lkv380fgkpdfi7pdv";doc="14mc9snykdwzcmq013bs8vzn5w80lblpg05jk57g7fl2z9x6xl38";}; +xetexko-70316={run="0h689k5qdggf82pm3ccwpypgh25q7nk74m40h4cl3iywlqnixvy7";doc="1x5wc5sgf56j3cm825avjr2bwp54ncingq7qxc95x4w0qpxwwwvw";}; +xetexref-68072={doc="1gq31fz879pjzn1r0ksy9prhvh70wil785p5nsj2n5pa67hd1h5g";}; +xevlna-43864={run="16ayk70kxk2s23r6nxva1hkb1z7aw7zz1zhmcis1bsijx657kw25";doc="09aaf3mpbh07mix5xvr20zybbbrbgbwcmkd5q0rfsd0ac8cm72fh";}; +xfakebold-68929={run="1xmw5mm5r2r0bvqga95lvcyf5y0jf7hc40sgzdnc2dx9n8sizwgf";doc="06a3znvv53c3ymfh53f37anlgj8878n5mzcw0mdjszlg8q4bl914";}; +xfor-15878={run="0m4y0caa22fps0r6735kb9pr2f89z5a8wflzrvpbms4nh3a61zgc";doc="0c0qg60h631d3m9rqr0nwj9772zjv3ch0d2p1ksnqnjf30idydl1";source="16xp7hziirlnd507g9bjvszm90wk9iv6ankq8bx27qkyk1shhjfq";}; +xfrac-69888={run="0pijfl77dmcxcjr52h3zg31qz4b7w43js0ydqp8glfakp27z7ibs";doc="1n2d59iii4in5nzayizcsj00f65jqla1v88sx4zxh0fba1fhwrpy";source="15gwlijdlsk85harpy40vd31zz613cd20rcx54xrkq5c15rm3pdd";}; +xgreek-69652={run="0gbhvh3rk466d81g9zw984bfx6mflzgd1wai8i0j2rgkghzm611g";doc="1507kgwd7509m5lyd9mzaj94rk6fcbi6cnngcndwynbrdmkd9l3p";source="1cpkh63qfk4m8766x8p6rq0bkc9nz7d7rldwynf8wzd6lkzyn9hl";}; +xhfill-22575={run="00lb01b27h1bg8h37rcm7wmqh5pc3gz7rkw0l6xrfai0mb8ypq2k";doc="0alaqaiz2dfk4sh4xgrxfrwxgisv2p0bfdz7ppiqmli10al1h2gd";}; +xifthen-38929={run="0ys8yq13vhval5jg9a4n4pv7b3v11w1yh63ssvyx3pnr767ay5r8";doc="1miqc1bfwi2ssl6yp9aqw7ygnars27vks0grpyfns494yimy8nc0";}; +xii-45804={doc="19jhzv5hqzj59wrfcr1dsj6z56qfckax694idgf8arri5lnbkdd8";}; +xii-lat-45805={doc="1nn54xv71kcmn9jbkcslz6a64cvjcay9x96rrxnakdj9qcqd27r5";}; +xindex-67771={run="1scp2bj9jlp71wji8fa90m9jmjm2075cjand9schs8551and42r4";doc="0yddkhqk43d7hnaxfh3afqqcfqadgcx26f77gj2bs4xl9qa0c755";}; +xindy-65958={run="1jm8gi2pq4rw60p8bh7hp5xw1kyhy9r02zy5s2p2xyqh5c6di7jn";doc="119lq9mqczsh1np0876fz4gdfyq1rxmc0ghaqyriwl4fzj6lka1n";}; +xindy-persian-59013={doc="04w3h65215slnakk5w19m94xmj9cjx01izbk9xijifv5l6dqh447";}; +xint-63562={run="1nhf2g00742yzjzl6hnc52cbp1y97l60grgjhjc7j80w91g7vv35";doc="1340cagm5hxif3qmfwvhy6izkhg1awazg971a9ww8xlnxk70gmp9";source="183llw3pmalq4ylndhnvbfc74h57xl9q6pcbr9bnrazlxkjmfpq8";}; +xintsession-60926={run="0p28r81qa93r9hwsaib9jbg252q76xz1hxlaf6q0r2bs3i8a4hbr";doc="1fzyqf14fdk6mjvgfxg43mx2gncj1c7m0h4fid88z7ffsa6rq1g5";}; +xistercian-61366={run="1bkwcw3n5kkygz0d5ihikxp5hx2mcj3hvbqpggfv8wz8y820fkjv";doc="18q40xjmzd51hnh4ga6g7yx3ra8lmcysavf5r2wv8chqfa6jcxji";source="1vzkm5p56h4rbsj36nnc2c45p6fchqdmym1hh8fblxdy311vjrhh";}; +xits-55730={run="0hnjyncrb0r9ssp6aj9lih23b0z031fjhc7fjjsjc89igbxb8v58";doc="0iv1bs2i1fn0pr3gkz07xaqsdfw9idcyfdd6bzqjryynas25aia2";}; +xkcdcolors-67895={run="0nhg0b4zv1xszx2sl61nyhfc5z5caw5bhi16ia119j3kb2lwr26h";doc="0sqv3kwbhh8ay0igpfal2gx22sbgay3wkwd2kzbs6rgsp6xyvj0k";}; +xkeymask-69223={run="14ll2mzc3sa1271yvq417a03g4ky4fvmb8zhmb9bqvw15vz7v53l";doc="0a9n4l2ffd358cvyc2xqvvmrd3zjq6nz7d99b490ap2734y21q1k";}; +xkeyval-63616={run="03m4skbhpv0l8cg3v50650k3h75x8rzk873hnqry0frb3qphjycs";doc="00xayhdwcwb6nq093v65pp1vzx2icn1xpkrbl7vllls4viq861s9";source="00ljf3z3017jdyifxhvls0j4l4jvdg8wi7sh56ij9qlx5jmjjzdm";}; +xlop-56910={run="1clpl22vxgqjpzs0ypgak0d6z0sr6hw3gj18r7sgs2q0jf5m6715";doc="1acnr4yfcakpnr8pb8g26qh7z9xr4dms4nfy50ig7r7azmdpz9py";}; +xltabular-56855={run="12skn3ld5cjd8jvh32l1h86mcqmx03v2w04189rkxh2q90kyjmfw";doc="1lps5w6p2j0c1bszyrbwdfn9r7mii9k9k6ap9s2ssb2rrfzf291f";}; +xltxtra-56594={run="0zpvlsdsrn6pnlfd3aa23hcrjfnnrjivi7r61g25j9sqcx7cmkym";doc="12wp6zwqa5mi5i5ridd2amnr48xrkqmi92xdhh95ydijpzyslhli";source="0vwlj6f7z7fh1vx257v0gnxj29rp3xqjpxlnn156xp9i8i29v0hn";}; +xml2pmx-57972={doc="1d3ralqh0b71scd59b4hmm707yfrz1rj28ni2lzkhbb1ql73bvah";}; +xmltex-69742={run="06rhg0mgxsv4061w8k6parag7fkhrja81aj900mi65bdwmxqxxql";doc="0zjaf8nvsid88nrvzgprwjcm6nirs6glyy25xws57fa9yhza8di2";}; +xmpincl-60593={run="17p97mqcmy10hql3fvdkkjbmlnylhz852ckai0s45birpk6bvi8p";doc="1k532g5b8fm6ly9whah5133g6yngadb9w6cvf2apwm9hwx1pmnxj";source="14xwxsxfa8m8p2idzbkcjznh46np2fikn511bqw54k4k6991vmx1";}; +xmuthesis-56614={run="05z3pbc9gqfnzp4y4a5p6bmprsr1r63w9l442hgk3pshswc2dflp";doc="0dqmbdz0ydlq1hkz0s3lr12sia1qj7p912carwq4pjg9rrw98z7s";source="1c3a90gpb2siww65yc2l3kf91bf5xvxk9iq1s9cnx1ngxjbs7835";}; +xnewcommand-15878={run="1hqpc8p8bl56gzcmar6m670l6yq5arlh382s3m649lya35yydmms";doc="1r4wlg8368ax3p492qyh0nzxkfgkgvm5bzrbm0jhh9ayk9sp7ryf";}; +xoptarg-15878={run="1ykc3mdg45hhyk5x8lv06zggfv88kyrr1zqnv8s9j8cb5c4r71jj";doc="1g42s8mgr7yqdziwza1g241vjgygzddk6ly8md6c22kj8g0sq9jg";}; +xpatch-54563={run="1almf1wif49mi3yqr4qsdffd6m3q8xcma8x9v737ffczsffhs923";doc="1lxsqxzajkcfw4b9i89bk0gmhrsprkmgqqbj5v34bgvkvh0n5pm0";source="1cf161h6g6m3q8bq38imvmja7ral7lpyb26byb8nn26lgixkprad";}; +xpdfopen-65952={doc="130wvaypfrg9sav0pdcdy1g10fll8pqcsqsy70fxlzzr937glsh1";}; +xpeek-61719={run="185jan9h82hrc8bai9h0k09dj2q8p2klqvz042h7xrh2napk060m";doc="0sag912jjxpiwbsgmp0l4p0kw4jfhp1j3sy0lb4kdxcqrzf3m1aj";source="144glnmckvjm24smk4d2xmnkfz8n3r4k7zjmsd0iwa004n28il5h";}; +xpiano-61719={run="11vk7k3n3np2wxx7gv9rvlgfmipmh1x0bjq5b2yvgsfxii65kwz3";doc="0hq4v45nacdxygxpjby6s8smlfkkp63yg83zfmwcl3dgxzayb2s3";source="00xnkxm6ijk1i0h3q0yadklc7f2np19bx3yzq4dzrfavdkxjz8f0";}; +xpicture-28770={run="1z3hbmqlamcm9wgwan834hggks2b73s73h3r2pppp00a1sz3g343";doc="0ymdwdspdhrhgyxw7h7f8nal6h0kjw6i8zicmll5vj8vbmi44dv6";source="1yjvqrpp7a0d3nldqidqrk2xk1lp5vbla865l3lxw1xd5b08y40r";}; +xpinyin-66115={run="1bavg69s0hin8phlgpmz53vkjlh039mancih71amw8bbvh077ynh";doc="0rnqq2hy7wzip9nij6bv0jvahrnsyqdmkvr23fvm7f90s07d1ay3";source="0yj7qh7qp3c1n17vplwywcsjwwy982gp5smxqq110syk6w2hppj5";}; +xprintlen-35928={run="0ywzhbp0b40cq395x5bv348f5dbbv29cqvlh6gkznr6qkjm6ai3b";doc="0dslr7n1mfbclyxic7pl1i425hbcb925jfbag0sfaal03pbczq7z";}; +xpunctuate-67918={run="06lcrbk2q0vy6myjc1qs94p6746acawj7z38ldp3vvc4xynrarnw";doc="02vzwbrqj1dzd46xj49mldkw6rqppvq917bj8216argr5dc4dfk4";source="0lrgdnfv9zlnlyyyybr76a458sp8bayrbl0vw6jzzs0psy1lskq0";}; +xq-35211={run="165zyviwxybpgfx9ycngv9nml482faz766q1skgmligx05qzkhyl";doc="01yhk07lrcbl7ppkqvks5j7wjpwyy0zc69q46wh42gbp65vp24a4";}; +xsavebox-64049={run="1zsv2yf8hp3yfdz2hwlqdzhk40xbcm8bhxwq0dzzkdqi73pfay6d";doc="0ad4gm6mxayrsvbc38nmn20jiv72g177r8vdnv04f8z8i02h7im5";source="1x3rm695vs3nh01nal4qyk164kfjx7pjx3sfmv90cj2jkyi4clwf";}; +xsim-61988={run="1ajmvlrmx97f94k7aci6bni5bhhlrf07c7vb8vnjgyq2iik12ys7";doc="0ppqjy9sgkrwcycfj5z1igi6w56rvcb5a12p22spa56fpsh94910";}; +xskak-51432={run="1hirv11b76xl7jx4swpa7imhjncfn81i9qc118qfrn26n890dgr4";doc="0hzyv8gy91avmpf2fgjwpqfkkbi8255gy86xzn5cz3y948l3m5vl";source="1gw6xqbpcsgdi5s7d239j0ds18w674z4zfibsvbgqjb70lixnyv6";}; +xstring-68015={run="131y1vly79iga9yi9lva4bizxs00p4gyx44f7gcgqnd35biqpy00";doc="0sn9djwkb06n917f1zly6gy81j1gixvp0w28a0f4i3whk3va0yac";}; +xtab-23347={run="1cpcs7k8liapv68cghfwj5fw80rz71qrld7l9lsnli50h7ph42sz";doc="1z3wp3hqy98a4l34kgm604zajdyv0b2vq0jipywmdc12115cw63f";source="1im5cv88g6n88rxzx8lqcxfmhkihywrv2h9gclmv0jx2mmwvwafv";}; +xtuthesis-47049={run="1d68hx38gwwscshdm07rcg75zjbsvk5kyliy5rx6z5jp75k0fra4";doc="1fdr5k60zxjb75vv4m6mj1kalka1kg7cw3k5j9a53n01m2w7q6r5";}; +xunicode-30466={run="1h8ixz9zy9izv5j7555094jiwfp5js5y8mp4bh993gn9xn1rb6b2";doc="0jrxnpas07np9a30cybk6jqv4ng96vjqpyyadbl55szkiylzwwfi";}; +xurl-61553={run="1qbys9b3zd3rlabdmbpndf65fzmvkz24d6v3k7cml2bmdzzqv2cc";doc="1q6npbv8iy1bgl2fjs3ngjw6wb78y51nmjbc2pndas7klbvdixc1";}; +xwatermark-61719={run="013zwh6gz8npgyvdj8daa6y9pb8554lqvbskchsc366k0m6xrwd8";doc="01x4rkl6h9afsbfis3ixbqi9inb1sgvavd0wld9jbwcrmv4qxc76";}; +xyling-15878={run="0gixafnkq15xgkqm2y8qxljfpy1n5nq4ll0lq19sb9635czak427";doc="0s38yqc0xfhf6ap8jc60s24vvmsqhn6f4dsslsdk8i4nq1dmsw92";}; +xymtex-32182={run="01432q9vnzbxzli9bdkdsd7ccvw3ksc76cs3568lsr35bkq1yy1n";doc="0bx00qsgnndw8kq59nbihlzlnwvdf6gncdl3ljckcdn07i4mhl7i";source="0gxi985kgkfyybg90f14y2w068ysy5vk4irc8lfvdgil3y8jwi4l";}; +xypic-61719={run="1srvrq5biqczvyi7k0ilbray7ilzi6gsmvk3b2hmf5qmv8hk0cs1";doc="1js0fkhn60fnxgbgviri58c4q63a0ycq37r4hynxhyix17h51kff";}; +xypic-tut-pt-15878={doc="0d9ivdz5jnhnh3pg8qb2jn7qfxad06hxff65scyhdd6wbsfaizi9";}; +xytree-15878={run="14f3vxkfmv2s944qpdhxpvbrpxq2p259bnk5sxlcv8lbsk2fvvcx";doc="1aq5lbx0x5v2f4fmhp0bcvasy5569mrbf75xk6m6vjpnls49zjfv";}; +yafoot-48568={run="05b2niwqs6c43gl4ag811ljdd0nasmbdinz6dx2d488nl4jiifaj";doc="0mbg6y7qsdsq5nwgdh32kd9x3ghvf8qlbrm84rg6269ff0b5achv";source="1p3zwyg1pf3ad35w25ahlk1r4c18k6vvllcv8ccm952mjg79mj83";}; +yagusylo-29803={run="12p2kxrqa4479wrwcbbxsn5hknr1ai9rf1x76psfs43k9fh1pnn7";doc="0g0vx5zjrfxrf595c0kz378n2h9hrlaf9sx1ypw3iv90zns1sp35";source="1js0slg00sr0bc0gysxvlp3jwlfa57lldi6q7a8fvqjfg9bkclvm";}; +yaletter-42830={run="13xizdiq8dj7iyjw7a9srhr24c1z6g50r44a7hjz0909z3b58j65";doc="1jgv50mssx6g94fh5fcysi884w1iah2qdwb0vrkg6952266gdkvw";source="0byfxy8h76m0jwgd4q0s1ar08sr9ys9jhvsz2l44id321w5276dj";}; +yamlvars-69071={run="05fjkphk70cqkgkd0gg3abnxdnnr4yyr6sd2pbkyh8jkc1pwadfx";doc="04cjg932c22v40fmka7baj17bs99awilgvmakdbcz4mqiaw9zmzb";}; +yannisgr-22613={run="0h61qn97l6k97zbgk0ghqgr4bf8fhbrb037gdskg2sgxb7zsl5wl";doc="1vw8p9xk3aj3lfsq8a2qv7qd00aqx22fs3427j31wnl1iymwycag";}; +yathesis-70512={run="010vlialskv4wsjx76d0z9d36g3qj185zs6raw0j8mgh3npqbr6n";doc="0hgs94kzl83h0c5971ga2iw30gkr6jhnv4p92lmcz7lp8wvjd12b";source="1zl69x9gy36ac5b73vrrdp084v7m3j8dqs8018grxq3jha6m03nz";}; +yax-54080={run="058i478l85ilq0asix6mkdn1kfzh2abqn9ngar6s339db4h81lxy";doc="06i376649jszpwgvb0bq8wxchjmhwjfvc78pl5q6q1ic2jpkq5pj";}; +yazd-thesis-61719={run="1bhjqd6k4lqk4sypssmrsjl9lqrbha9d0n42qbaq1mg5whpl2b8x";doc="0krsm9s3ym6f3d323scvxn8cf1wjqppglhmzbxwn0cpjq5nl01pg";}; +yb-book-67188={run="01ha50044ph7f19jrpkdlfa4idk71k21l28hwm67l4y1q6fyzrll";doc="0ckn24i29cqnlmvml5w77ws9rx9k380c470kv2b2d88709yzzqgf";source="1j29rgbdnlmi4a2px1y3xmq2lsdrwlmi9l3dqsac1lx45hpqmhby";}; +ycbook-46201={run="1ajhl8vkd94yajib69s3jw6v2jbbn7h6g92m0yc86gfri3qcff2r";doc="0zf71gmxj1hwywlw5h8klgyrn9mww12hc4bic0l0gmwixvn6k56k";}; +ydoc-64887={run="19njcgsdhz094w6c7hxp20kcj8b9kvcx4y6zg0rzsxs3h4fr2f21";doc="1dpjwv7m10413dxvhqgxsw2rp9n2gw8s0jghshgmbfm6x46a4db6";source="0y7cc2sl9yia5ldp2la1wy4d53jgxgcpi0v5wkc4m554jl9am4z9";}; +yet-another-guide-latex2e-68564={doc="1a4z4ni7327jd1r4n0w2lh7bb8ag7dfdgr6xwl4q5hf2jbdv8mmy";}; +yfonts-50755={run="1k7b78fr6x8kp6354viqfni3k77d96qmx9r76249m5j140hi6fk1";doc="0a7fy4z790fr6q4z5qnzv578x48kqs128wl5znd5bn3mbg0n0cq0";source="1ph8vc09vg0zxc9x1xydrm9wn6q5vml2bc3wln15v69p8nm52d7z";}; +yfonts-otf-65030={run="0rhym2lw9jk2aj73ndyvr32ryz58krmmfbm28cpgaia06crjl4jp";doc="02ghwiqnws03wfhg3sim6xm1ifdpmi4x5yz5azssxnxfwbndp62n";}; +yfonts-t1-36013={run="08fbdd97n2h649kvks6q03zrsjvb1f7qwys3955g6iznf4y8pyv6";doc="0h0gi1j5fcn1nkvf0abf2aimj2q3h6bw4rx7kzg5xra735fqpl4n";}; +yhmath-54377={run="02p5rzh9n92pjznrqia9b6jnlwmn14189m7fiabvinjakaxmwxwn";doc="024p61b5i55m6n8fmk4j9r3q7dprp3lcyzkhag0wch6vgjkrajzq";source="0y74zwc1pkw3dp56jnzzy4zx1ilw5qx9msm1bf55mvdfc045a17s";}; +yinit-otf-40207={run="1yjz72nixv6di0ifsimbnc34wlw6s8nqkwflkag2p75q0jw52qrg";doc="15yjqa1s4zrpz8cj199ak9dgriys76q8iccspw3909g2ci4xyyfv";}; +york-thesis-23348={run="04c8g1wkl795caadm8kqfy6kdqqgwlk46lijpmyiiykbb8z54wq7";doc="0zp6pfr3giqm4nbsidg06q0c3x9gr4bk3g8qq7wxl9a2pgk3z45p";source="0105amrybkm78pwb9hrd7n8r69sj6lkh1zm7c9sskibb13lqrk9p";}; +youngtab-56500={run="18h6a4b4psbm0hjxq2xnk4bkmsa1wd2fvarrzfkhcj01hgn8bz17";doc="00jkdw02iary6s5szh7hf4qjlr7r8y9lfmvlnrpqkhh6pdhsy3jh";source="1hjqkj12jx9imfqm7y1mqdvp1knhf69kbixr88varbh09d6r9p66";}; +yplan-34398={run="1f2kxbb32hxwgin5bn7b78r8sqdj4v1q80sh1c87425zw8jyd73z";doc="1ls02mng1jwihz8s505brmaqcjn4abqys6bwl22dy855bw5rgr5k";}; +yquant-68997={run="0xlwjgc0lwls7zpgbd0v85cij3a66vsv2vwlr6a73s0bjyjy9akh";doc="043yq765f23rdhn3pmdwzy0q3x91hwaawfwakq93acwbx4mqjz8h";}; +ysabeau-69663={run="0gvy4jpi6p62fqa6hdqci7lwghv6a0lm0min20g9jp9h28kmlcwk";doc="04zmbl5vwgjq7w2189yxnad6cfnb5b6z2pkddd3bx8blg8g954vh";}; +ytableau-59580={run="0gfpxbvar3m21pj74j19qnj8qakbknhvssyvfyw61jwdd8ygdxkd";doc="00k10759qihk3330bwfpzmrm9bfb8513w3sak9jlfy5inay59rbd";source="05pxlbj3rdgr15cqfdxviyp2698b7l44rzgssx18yv2a8qnaxylh";}; +zapfchan-61719={run="1753lvv2bq29g43s4chc884n742695agvgal0b99gsrvlkyfp8gn";}; +zapfding-61719={run="17mls8wilz9api9ivsbcczpiqp1f39qy8wa6ajssi8zhnc5lq7zn";}; +zbmath-review-template-59693={run="1zyll0lpd3d2cjizq6f2zxnb1pmdl2qkhd1fcm9f9l6i5fqmjk15";doc="0ymvngll5znvw0i4y65imidy21fzfzsdcz22i2i8369k1n15x6yh";}; +zebra-goodies-66630={run="03m5npbrbcmxw9csl2hg1jgzjg96rr2r3yix3sajkxzmf2bcm3my";doc="107wr1pjqc9yswd52gflan10007p7i072gysnwdpcxk880f1n29l";source="15sw808cqfjvwmdnnkds9n1m29c7dzdm3id4hkm2cl92jxiygb0f";}; +zed-csp-17258={run="0wr6dxb5ks34x8rzr7s2cnanxc5jawqcq0zhkmxrh8cjqcfkk1w9";doc="05gm4s4svqa4wds0ichfm6lk39i0y54y33b96bnycrabggqfw77g";}; +zennote-65549={run="0sawds55l9cc15b3lvr5zswg5ybsj8v22kx8h5gn65g4j0zj79aq";doc="0qwl9f1c777iim45xcl00b3zidzs4192hyv6vv14a8c57h28j7zr";}; +zhlineskip-51142={run="1j3wkvd57kdwhhny0dzw0hqqnv2ghx1mdjgyzrhfj8gf3fifdaym";doc="0hy14njxpzffcnyciyc4zbil6372b640bshfw9jq4wyskwk3i45h";}; +zhlipsum-54994={run="0rvwbnqzgbdihdavscn8mcc7hy6yjdzj2fc2h3xs3i77lfa5140d";doc="177l81c3zbgdvjgr861jn917ps174zg8bab824f7dx2gj5mhdzgf";source="098fqbcr9fdv6f6hjaczm3q28dpx0g8xqjykg5hyx7nfp7nh6yjk";}; +zhmetrics-22207={run="094afdf0mwb6f5jvg7z7cs5xinia71cnlaixcihliai37kdn1qss";doc="0achyp4i8dfhrkr9jddp7qzdifcqsf28qaqdnyb76525mvgkip5y";source="0hic8n6kq4sx2dc8vb34fhyjrbbxp50lllyj5sh2ld9s5fwgm3yk";}; +zhmetrics-uptex-40728={run="06g61qm3ryy6mvvaq4whk7084hjp544dig57mwcxlgp6cfs0fq8l";doc="0ybijj2hjm4byli3yh8q9lgb40bdpq16d9273nrmiyy8szxa20qc";}; +zhnumber-66115={run="1iryx2mdk0fkvwnvw8z71bscy0kk41nx85flw88kwmsv5bd3aqxz";doc="07hkrlf3gycv0clmr13c6xxp36yy5wrcmzr39ms3ql205qz94qcq";source="01b6l05j6mkx2c8lbj2kmkl7cr5l9cwj2z26v85mmki1z3fkqmrw";}; +zhspacing-41145={run="0h588z408lggk7370l9kcssz2hn9lz19bnakadygrklsyhqh9pzh";doc="0s5qyrsi5nw0vppgx90lzz3ra121jgm9hgzg3z791imlxgjn8pzr";}; +ziffer-32279={run="0nalr6i8yqd1iq713gigafnh1k0h8kgiml1zwpk8rjyya606capw";doc="1cr63lkqi9kpkbpnrwmbppipsmw6wy732wsaha0y9y5ia2934nck";}; +zitie-60676={run="131kiycj7q9javr3xs7maa2qjczmva7vj98bw36pv7znwchspcca";doc="00daf6p699y5204lrdg7hfcnmqh3ah764fpjymblvm8hy5f1w5g2";}; +zlmtt-64076={run="1krv8frabpvnx00xwdx058f9y2mip3bblpix05yxpfspx6aarhcw";doc="1xiirzbgh1x34zih8xbf7whl5f994lx9bc4qrirc58rlccnqgbgr";}; +zootaxa-bst-50619={run="0lwin7dfd3nk0r3drznmhkqd7fhfvizxqy3z2xv616spg1jh9sgj";doc="1s4v9azi1pvvh1fizp2azkbwh35xvqh8qcnnn1xwi0g1xhcp38pa";}; +zref-68278={run="1292p3hmhlngwnhl9lnppbvn4fqblphxmpmbh1vij23v64acv3lk";doc="1xnyvhrhcnganvdzilljdn6x5yh7srijhdd63fc0p5d7zn5hccc1";source="1dbzxl0rc3xwcn2bwaghywsry8q2q34npax5zrv9xak24gplv72y";}; +zref-check-68846={run="13syzhmzvd537gdvwkzvlnbrf9as2yl0id3z7fmj35vjwf9z12al";doc="17f344gzq68c9v2glz24pwxal72aa7mmyi5lvgqx9dkkpzlmghfc";source="1lnnx5fb23pkkzwdl82j765canbm9bbnmmpwwxh9yg9dcz4gwhkp";}; +zref-clever-68846={run="0dgpx323gw46qi45wqvlyhsyw5d60i18bg7vk9ndkb6isvs9pdx4";doc="19dfpz5185m5gi4828vc1hg6njc4jkb2n6hah1hvyg10izbxamgr";source="0bk2irrrbmyh7w6p9z5b2bmfcmnb8sb97zszsq54hg2rc7r1h1vx";}; +zref-vario-68846={run="0p7b9pqldlliwshm2xfm6c69is878nj52dgchx26dqhi8lx8l8dy";doc="0ck4h0wdm7rkhcb7bp0cksy2krpziyjykp15p0l02180c79mnp3z";source="12qsz4fn6d3gpxhi5ppfvzqcj04r9f88a5hj9691kqjwh0507zn4";}; +zwgetfdate-15878={run="1fgz3z1f9ifcbrwiq166hnff23gmlgp5vn0djm2znci26bcip4s9";doc="0gda7xd1sbiaaspb253xgl47jm6bcn8hj101m6ih69mxrka6sz60";}; +zwpagelayout-63074={run="0xl2qyq9037fjxwc6v9hz9gbb5fggqb2x93bibvhdb0bik6iw5md";doc="010120lcnx9d9jj116y6vskch3025jfi4v7xh6nyqlvirsjr4hk1";}; +zx-calculus-70612={run="18yzx4q26yavj68j3v3iws35byqmsbc42w4awb0dbsg7cgdg5mk5";doc="1vc1sydsvn5vfra7d26c51kv81kkaqdgrk4fbq32gl5vj6ap2w0n";}; +zxjafbfont-28539={run="1zcyvwsqn2w9x9w79lvi736r2zwrsk2xdk6nrrmkiaq3cakd81p9";doc="0dfh592niw8s6zxmxj1sf8h02s2vz8s2ywd291946bb72xidb4gq";}; +zxjafont-62864={run="0p1zmf0bwd5fpyyz8cwdwc8pnxcqk31570p4722lzwqiplm0azfc";doc="16w7iqlb5zwz8qqyyscmyd0zdzb55n38gf10qd5cra6c161fi7b3";}; +zxjatype-53500={run="1ap4f0yq4cmkz5djy7mpgp32l24jr7xbxd9zc0nv1fvnywxpxfcq";doc="005rr69f433bllggj997rhbwlbmsglaywi55az5j02x0036aj2dd";}; +zztex-55862={run="0qh6a0jgrf1b2363dw66m8v8r0yq2sab2qm3wk008pvvlajdj45w";doc="1agivqj1mqnhv3w70a292pypm2w5xcbf67wwfz3ywaaaq5amjbwq";}; +} diff --git a/pkgs/by-name/te/texlive/generate-fixed-hashes.nix b/pkgs/by-name/te/texlive/generate-fixed-hashes.nix new file mode 100644 index 0000000..0cff459 --- /dev/null +++ b/pkgs/by-name/te/texlive/generate-fixed-hashes.nix @@ -0,0 +1,54 @@ +{ pkgs ? (import ../../../../.. { }) }: + +let + inherit (pkgs) runCommand writeText texlive nix; + inherit (pkgs.lib) + attrValues + concatMap + concatMapStrings + isDerivation + filter + optional + optionalString + sort + strings + ; + + getFods = drv: optional (isDerivation drv.tex) (drv.tex // { tlType = "run"; }) + ++ optional (drv ? texdoc) (drv.texdoc // { tlType = "doc"; }) + ++ optional (drv ? texsource) (drv.texsource // { tlType = "source"; }) + ++ optional (drv ? tlpkg) (drv.tlpkg // { tlType = "tlpkg"; }); + + sorted = sort (a: b: a.pname < b.pname) (attrValues texlive.pkgs); + fods = concatMap getFods sorted; + + computeHash = fod: runCommand "${fod.pname}-${fod.tlType}-fixed-hash" + { buildInputs = [ nix ]; inherit fod; } + ''echo -n "$(nix-hash --base32 --type sha256 "$fod")" >"$out"''; + + hash = fod: fod.outputHash or (builtins.readFile (computeHash fod)); + + hashes = fods: + concatMapStrings ({ tlType, ... }@p: ''${tlType}="${hash p}";'') fods; + + hashLine = { pname, revision, extraRevision ? "", ... }@drv: + let + fods = getFods drv; + # NOTE: the fixed naming scheme must match default.nix + fixedName = "${pname}-${toString revision}${extraRevision}"; + in + optionalString (fods != [ ]) '' + ${strings.escapeNixIdentifier fixedName}={${hashes fods}}; + ''; +in +{ + # fixedHashesNix uses 'import from derivation' which does not parallelize well + # you should build newHashes first, before evaluating (and building) fixedHashesNix + newHashes = map computeHash (filter (fod: ! fod ? outputHash) fods); + + fixedHashesNix = writeText "fixed-hashes.nix" + '' + { + ${concatMapStrings hashLine sorted}} + ''; +} diff --git a/pkgs/by-name/te/texlive/make-bin-containers.sh b/pkgs/by-name/te/texlive/make-bin-containers.sh new file mode 100644 index 0000000..1d8cbbd --- /dev/null +++ b/pkgs/by-name/te/texlive/make-bin-containers.sh @@ -0,0 +1,60 @@ +# load realpath +loadables="$(command -v bash)" +loadables="${loadables%/bin/bash}/lib/bash" +enable -f "$loadables/realpath" realpath +mkdir -p "$out/bin" + +# find interpreters +export interpPerl="$(PATH="$HOST_PATH" command -v perl)" +export interpJava="$(PATH="$HOST_PATH" command -v java || :)" +export interpWish="$(PATH="$HOST_PATH" command -v wish || :)" + +# prepare sed script +substituteAll "$patchScripts" patch-scripts.sed + +for binname in $binfiles ; do + # binlinks to be created last, after the other binaries are in place + if [[ " $binlinks " == *" $binname "* ]] ; then + continue + fi + + output="$out/bin/$binname" + + # look for existing binary from bin.* + target="$(PATH="$HOST_PATH" command -v "$binname" || :)" + if [[ -n "$target" && -x "$target" ]] ; then + ln -s "$(realpath "$target")" "$output" + continue + fi + + # look for scripts + # the explicit list of extensions avoid non-scripts such as $binname.cmd, $binname.jar, $binname.pm + # the order is relevant: $binname.sh is preferred to other $binname.* + for folder in $scriptsFolder ; do + for script in "$folder/$binname"{,.sh,.lua,.pl,.py,.rb,.sno,.tcl,.texlua,.tlu}; do + if [[ -f "$script" ]] ; then + sed -f patch-scripts.sed \ + -e 's/^scriptname=`basename "\$0"`$/'"scriptname='$(basename "$binname")'/" \ + -e 's/^scriptname=`basename "\$0" .sh`$'"/scriptname='$(basename "$binname" .sh)'/" \ + "$script" > "$output" + chmod +x "$output" + continue 3 + fi + done + done + + echo "error: could not find source for 'bin/$binname'" >&2 + exit 1 +done + +# patch shebangs +patchShebangs "$out/bin" + +# generate links +# we canonicalise the source to avoid symlink chains, and to check that it exists +cd "$out"/bin +for alias in $binlinks ; do + target="${bintargets%% *}" + bintargets="${bintargets#* }" + ln -s "$(realpath "$target")" "$out/bin/$alias" +done diff --git a/pkgs/by-name/te/texlive/packages.nix b/pkgs/by-name/te/texlive/packages.nix new file mode 100644 index 0000000..2e93418 --- /dev/null +++ b/pkgs/by-name/te/texlive/packages.nix @@ -0,0 +1,10 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # TeX Live; see https://nixos.org/nixpkgs/manual/#sec-language-texlive + texlive = callPackage ./. { }; + inherit (texlive.schemes) texliveBasic texliveBookPub texliveConTeXt texliveFull texliveGUST texliveInfraOnly texliveMedium texliveMinimal texliveSmall texliveTeTeX; + texlivePackages = recurseIntoAttrs (lib.filterAttrs (_: lib.isDerivation) texlive.pkgs); +} diff --git a/pkgs/by-name/te/texlive/patch-scripts.sed b/pkgs/by-name/te/texlive/patch-scripts.sed new file mode 100644 index 0000000..c08d765 --- /dev/null +++ b/pkgs/by-name/te/texlive/patch-scripts.sed @@ -0,0 +1,57 @@ +1{ + /python/{ + N; + # add script folder to path, unless we interfere with a docstring + /\nr"""/b skip-python-path-patch + s!\n!\nimport sys; sys.path.insert(0,'@scriptsFolder@')\n! + :skip-python-path-patch + } + + /^#!.*perl/{ + # add script folder to @INC + s!$! -I@scriptsFolder@! + } + + /^eval/{ + # most likely the weird perl shebang + N + /^eval '(exit \$?0)' && eval 'exec perl -S \$0 \${1+"\$@"}' && eval 'exec perl -S \$0 \$argv:q'\n *if 0;$/{ + x; s/.*/patching weird perl shebang/; w /dev/stderr + x; s|^.*$|#!@interpPerl@ -I@scriptsFolder@| + } + } +} + +# patch 'exec interpreter' +/exec java /{ + x; s/.*/patching exec java/; w /dev/stderr + x; s|exec java |exec '@interpJava@' |g + /exec ''/{ + x; s/^.*$/error: java missing from PATH/; w /dev/stderr + q 1 + } +} + +/exec perl /{ + x; s/.*/patching exec perl/; w /dev/stderr + x; s|exec perl |exec @interpPerl@ -I@scriptsFolder@ |g + /exec ''/{ + x; s/^.*$/error: perl missing from PATH/; w /dev/stderr + q 1 + } +} + +/exec wish /{ + x; s/.*/patching exec wish/; w /dev/stderr + x; s|exec wish |exec '@interpWish@' |g + /exec ''/{ + x; s/^.*$/error: wish missing from PATH/; w /dev/stderr + q 1 + } +} + +# make jar wrappers work without kpsewhich +s!^jarpath=`kpsewhich --progname=[^ ]* --format=texmfscripts \([^ ]*\)`$!jarpath=@scriptsFolder@/\1!g + +# replace CYGWIN grep test with bash builtin +s!echo "$kernel" | grep CYGWIN >/dev/null;![[ "$kernel" == *CYGWIN* ]]!g diff --git a/pkgs/by-name/te/texlive/texlinks.diff b/pkgs/by-name/te/texlive/texlinks.diff new file mode 100644 index 0000000..97770cc --- /dev/null +++ b/pkgs/by-name/te/texlive/texlinks.diff @@ -0,0 +1,9 @@ +@@ -157,7 +157,7 @@ + verbose_echo "skipped ConTeXtish symlink $src -> $dest (special case)" + ;; + *) +- test ! -f "$src" && ++ test "x$src" != "x`(ls -ld $src | awk '{print $NF}') 2>/dev/null`" && + rm -f "$src" + + if test -f "$src"; then diff --git a/pkgs/by-name/te/texlive/tl2nix.sed b/pkgs/by-name/te/texlive/tl2nix.sed new file mode 100644 index 0000000..6848c40 --- /dev/null +++ b/pkgs/by-name/te/texlive/tl2nix.sed @@ -0,0 +1,231 @@ +# wrap whole file into an attrset +1i{ # no indentation +$a} + +# extract repository metadata +/^name 00texlive\.config$/,/^$/{ + s/^name (.*)$/"\1" = {/p + /^$/,1i}; + + s!^depend frozen/0$! frozen = false;!p + s!^depend frozen/1$! frozen = true;!p + s!^depend release/(.*)$! year = \1;!p + s!^depend revision/(.*)$! revision = \1;!p +} + +# form an attrmap per package +# ignore packages whose name contains "." (such as binaries) except for texlive.infra +/^name ([^.]+|texlive\.infra)$/,/^$/{ + # quote invalid names + s/^name ([0-9].*|texlive\.infra)$/"\1" = {/p + s/^name (.*)$/\1 = {/p + + # extract revision + s/^revision ([0-9]*)$/ revision = \1;/p + + # extract short description + /^shortdesc (.+)$/{ + s/"/\\"/g # escape quotes + s/^shortdesc (.+)/ shortdesc = "\1";/p + } + + # extract hashes of *.tar.xz + s/^containerchecksum (.*)/ sha512.run = "\1";/p + s/^doccontainerchecksum (.*)/ sha512.doc = "\1";/p + s/^srccontainerchecksum (.*)/ sha512.source = "\1";/p + + # number of path components to strip, defaulting to 1 ("texmf-dist/") + /^relocated 1/i\ stripPrefix = 0; + + # extract version and clean unwanted chars from it + /^catalogue-version/y/ \/~/_--/ + /^catalogue-version/s/[\#,:\(\)]//g + s/^catalogue-version_(.*)/ version = "\1";/p + + /^catalogue-license/{ + # wrap licenses in quotes + s/ ([^ ]+)/ "\1"/g + # adjust naming as in nixpkgs, the full texts of the licenses are available at https://www.ctan.org/license/${licenseName} + s/"(cc-by(-sa)?-[1-4])"/"\10"/g + s/"apache2"/"asl20"/g + s/"artistic"/"artistic1-cl8"/g + s/"bsd"/"bsd3"/g # license text does not match exactly, but is pretty close + s/"bsd4"/"bsdOriginal"/g + s/"collection"/"free"/g # used for collections of individual packages with distinct licenses. As TeXlive only contains free software, we can use "free" as a catchall + s/"fdl"/"fdl13Only"/g + s/"gpl"/"gpl1Only"/g + s/"gpl([1-3])"/"gpl\1Only"/g + s/"gpl2\+"/"gpl2Plus"/g + s/"gpl3\+"/"gpl3Plus"/g + s/"lgpl"/"lgpl2"/g + s/"lgpl2\.1"/"lgpl21"/g + s/"lppl"/"lppl13c"/g # not used consistently, sometimes "lppl" refers to an older version of the license + s/"lppl1\.2"/"lppl12"/g + s/"lppl1\.3"/"lppl13c"/g # If a work refers to LPPL 1.3 as its license, this is interpreted as the latest version of the 1.3 license (https://www.latex-project.org/lppl/) + s/"lppl1\.3a"/"lppl13a"/g + s/"lppl1\.3c"/"lppl13c"/g + s/"other-free"/"free"/g + s/"opl"/"opubl"/g + s/"pd"/"publicDomain"/g + + s/^catalogue-license (.*)/ license = [ \1 ];/p + } + + # extract deps + /^depend ([^.]+|texlive\.infra)$/{ + # open a list + i\ deps = [ + + # loop through following depend lines + :next-dep + s/^\n?depend ([^.]+|texlive\.infra)$/ "\1"/p # print dep + s/^.*$// # clear pattern space + N; /^\ndepend /b next-dep + + # close the list + i\ ]; + D # restart cycle from the current line + } + + # extract font maps + /^execute add.*Map /{ + # open a list + i\ fontMaps = [ + + # loop through following map lines + :next-map + s/^\n?execute add(.*Map .*)$/ "\1"/p # print map + s/^.*$// # clear pattern space + N; /^\nexecute add.*Map /b next-map + + # close the string + i\ ]; + D # restart cycle from the current line + } + + # detect presence of notable files + /^docfiles /{ + s/^.*$// # ignore the first line + + # read all files + :next-doc + N + s/\n / / # remove newline + t next-doc # loop if the previous lines matched + + / (texmf-dist|RELOC)\/doc\/man\//i\ hasManpages = true; + / (texmf-dist|RELOC)\/doc\/info\//i\ hasInfo = true; + + D # restart cycle + } + + /^runfiles /{ + s/^.*$// # ignore the first line + + # read all files + :next-file + N + s/\n / / # remove newline + t next-file # loop if previous line matched + s/\n/ \n/ # add space before last newline for accurate matching below + + / (RELOC|texmf-dist)\//i\ hasRunfiles = true; + / tlpkg\//i\ hasTlpkg = true; + + # extract script extensions + / texmf-dist\/scripts\/.*\.(jar|lua|py|rb|sno|tcl|texlua|tlu) /{ + i\ scriptExts = [ + / texmf-dist\/scripts\/.*\.jar /i\ "jar" + / texmf-dist\/scripts\/.*\.lua /i\ "lua" + / texmf-dist\/scripts\/.*\.py /i\ "py" + / texmf-dist\/scripts\/.*\.rb /i\ "rb" + / texmf-dist\/scripts\/.*\.sno /i\ "sno" + / texmf-dist\/scripts\/.*\.tcl /i\ "tcl" + / texmf-dist\/scripts\/.*\.texlua /i\ "texlua" + / texmf-dist\/scripts\/.*\.tlu /i\ "tlu" + i\ ]; + } + + D # restart cycle from the current line + } + + # extract postaction scripts (right now, at most one per package, so a string suffices) + s/^postaction script file=(.*)$/ postactionScript = "\1";/p + + # extract hyphenation patterns + /^execute\sAddHyphen\s/{ + # open a list + i\ hyphenPatterns = [ + + # create one attribute set per hyphenation pattern + + # plain keys: name, lefthyphenmin, righthyphenmin, file, file_patterns, file_exceptions, comment + # optionally double quoted key: luaspecial, comment + # comma-separated lists: databases, synonyms + :next-hyphen + s/(^|\n)execute\sAddHyphen/ {/ + s/\s+luaspecial="([^"]+)"/\n luaspecial = "\1";/ + s/\s+(name|lefthyphenmin|righthyphenmin|file|file_patterns|file_exceptions|luaspecial|comment)=([^ \t\n]*)/\n \1 = "\2";/g + s/\s+(databases|synonyms)=([^ \t\n]+)/\n \1 = [ "\2" ];/g + s/$/\n }/ + + :split-hyphens + s/"([^,]+),([^"]+)" ]/"\1" "\2" ]/; + t split-hyphens # repeat until there are no commas + + p + s/^.*$// # clear pattern space + N + /^\nexecute\sAddHyphen\s/b next-hyphen + + # close the list + i\ ]; + D # restart cycle from the current line + } + + # extract format details + /^execute\sAddFormat\s/{ + # open a list + i\ formats = [ + + # create one attribute set per format + # note that format names are not unique + + # plain keys: name, engine, patterns + # optionally double quoted key: options + # boolean key: mode (enabled/disabled) + # comma-separated lists: fmttriggers, patterns + :next-fmt + s/(^|\n)execute\sAddFormat/ {/ + s/\s+options="([^"]+)"/\n options = "\1";/ + s/\s+(name|engine|options)=([^ \t\n]+)/\n \1 = "\2";/g + s/\s+mode=enabled// + s/\s+mode=disabled/\n enabled = false;/ + s/\s+(fmttriggers|patterns)=([^ \t\n]+)/\n \1 = [ "\2" ];/g + s/$/\n }/ + + :split-triggers + s/"([^,]+),([^"]+)" ]/"\1" "\2" ]/; + t split-triggers # repeat until there are no commas + + p + s/^.*$// # clear pattern space + N + /^\nexecute\sAddFormat\s/b next-fmt + + # close the list + i\ ]; + D # restart cycle from the current line + } + + # close attrmap + /^$/i}; +} + +# add list of binaries from one of the architecture-specific packages +/^name ([^.]+|texlive\.infra)\.x86_64-linux$/,/^$/{ + s/^name ([0-9].*|texlive\.infra)\.x86_64-linux$/"\1".binfiles = [/p + s/^name (.*)\.x86_64-linux$/\1.binfiles = [/p + s!^ bin/x86_64-linux/(.+)$! "\1"!p + /^$/i]; +} diff --git a/pkgs/by-name/te/texlive/tlpdb-overrides.nix b/pkgs/by-name/te/texlive/tlpdb-overrides.nix new file mode 100644 index 0000000..7ec6eee --- /dev/null +++ b/pkgs/by-name/te/texlive/tlpdb-overrides.nix @@ -0,0 +1,420 @@ +{ stdenv, lib, tlpdb, bin, tlpdbxz, tl +, installShellFiles +, coreutils, findutils, gawk, getopt, ghostscript_headless, gnugrep +, gnumake, gnupg, gnused, gzip, html-tidy, ncurses, perl, python3, ruby, zip +}: + +oldTlpdb: + +let + tlpdbVersion = tlpdb."00texlive.config"; + + # most format -> engine links are generated by texlinks according to fmtutil.cnf at combine time + # so we remove them from binfiles, and add back the ones texlinks purposefully ignore (e.g. mptopdf) + removeFormatLinks = lib.mapAttrs (_: attrs: + if (attrs ? formats && attrs ? binfiles) + # TLPDB reports erroneously that various metafont binaries like "mf" are format links to engines + # like "mf-nowin"; core-big provides both binaries and links so we simply skip them here + then let formatLinks = lib.catAttrs "name" (lib.filter (f: f.name != f.engine && ! lib.hasSuffix "-nowin" f.engine) attrs.formats); + binNotFormats = lib.subtractLists formatLinks attrs.binfiles; + in if binNotFormats != [] then attrs // { binfiles = binNotFormats; } else removeAttrs attrs [ "binfiles" ] + else attrs); + + orig = removeFormatLinks (removeAttrs oldTlpdb [ "00texlive.config" ]); + +in lib.recursiveUpdate orig rec { + #### overrides of texlive.tlpdb + + #### nonstandard script folders + context.scriptsFolder = "context/stubs-mkiv/unix"; + context-legacy.scriptsFolder = "context/stubs/unix"; + cyrillic-bin.scriptsFolder = "texlive-extra"; + fontinst.scriptsFolder = "texlive-extra"; + mptopdf.scriptsFolder = "context/perl"; + pdftex.scriptsFolder = "simpdftex"; + texlive-scripts.scriptsFolder = "texlive"; + texlive-scripts-extra.scriptsFolder = "texlive-extra"; + xetex.scriptsFolder = "texlive-extra"; + + #### interpreters not detected by looking at the script extensions + ctanbib.extraBuildInputs = [ bin.luatex ]; + de-macro.extraBuildInputs = [ python3 ]; + match_parens.extraBuildInputs = [ ruby ]; + optexcount.extraBuildInputs = [ python3 ]; + pdfbook2.extraBuildInputs = [ python3 ]; + texlogsieve.extraBuildInputs = [ bin.luatex ]; + + #### perl packages + crossrefware.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ LWP URI ])) ]; + ctan-o-mat.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ LWP LWPProtocolHttps ])) ]; + ctanify.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileCopyRecursive ])) ]; + ctanupload.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ HTMLFormatter WWWMechanize ])) ]; + exceltex.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ SpreadsheetParseExcel ])) ]; + latex-git-log.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ IPCSystemSimple ])) ]; + latexindent.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileHomeDir LogDispatch LogLog4perl UnicodeLineBreak YAMLTiny ])) ]; + pax.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileWhich ])) ]; + ptex-fontmaps.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ Tk ])) ]; + purifyeps.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileWhich ])) ]; + svn-multi.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ TimeDate ])) ]; + texdoctk.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ Tk ])) ]; + ulqda.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ DigestSHA1 ])) ]; + + #### python packages + pythontex.extraBuildInputs = [ (python3.withPackages (ps: with ps; [ pygments ])) ]; + + #### other runtime PATH dependencies + a2ping.extraBuildInputs = [ ghostscript_headless ]; + bibexport.extraBuildInputs = [ gnugrep ]; + checklistings.extraBuildInputs = [ coreutils ]; + cjk-gs-integrate.extraBuildInputs = [ ghostscript_headless ]; + context.extraBuildInputs = [ coreutils ]; + context-legacy.extraBuildInputs = [ ruby ]; + cyrillic-bin.extraBuildInputs = [ coreutils gnused ]; + dtxgen.extraBuildInputs = [ coreutils getopt gnumake zip ]; + dviljk.extraBuildInputs = [ coreutils ]; + epspdf.extraBuildInputs = [ ghostscript_headless ]; + epstopdf.extraBuildInputs = [ ghostscript_headless ]; + fragmaster.extraBuildInputs = [ ghostscript_headless ]; + installfont.extraBuildInputs = [ coreutils getopt gnused ]; + latexfileversion.extraBuildInputs = [ coreutils gnugrep gnused ]; + listings-ext.extraBuildInputs = [ coreutils getopt ]; + ltxfileinfo.extraBuildInputs = [ coreutils getopt gnused ]; + ltximg.extraBuildInputs = [ ghostscript_headless ]; + luaotfload.extraBuildInputs = [ ncurses ]; + makeindex.extraBuildInputs = [ coreutils gnused ]; + pagelayout.extraBuildInputs = [ gnused ncurses ]; + pdfcrop.extraBuildInputs = [ ghostscript_headless ]; + pdftex.extraBuildInputs = [ coreutils ghostscript_headless gnused ]; + pdftex-quiet.extraBuildInputs = [ coreutils ]; + pdfxup.extraBuildInputs = [ coreutils ghostscript_headless ]; + pkfix-helper.extraBuildInputs = [ ghostscript_headless ]; + ps2eps.extraBuildInputs = [ ghostscript_headless ]; + pst2pdf.extraBuildInputs = [ ghostscript_headless ]; + tex4ebook.extraBuildInputs = [ html-tidy ]; + texlive-scripts.extraBuildInputs = [ gnused ]; + texlive-scripts-extra.extraBuildInputs = [ coreutils findutils ghostscript_headless gnused ]; + thumbpdf.extraBuildInputs = [ ghostscript_headless ]; + tpic2pdftex.extraBuildInputs = [ gawk ]; + wordcount.extraBuildInputs = [ coreutils gnugrep ]; + xdvi.extraBuildInputs = [ coreutils gnugrep ]; + xindy.extraBuildInputs = [ gzip ]; + + #### adjustments to binaries + # TODO patch the scripts from bin.* directly in bin.* instead of here + + # mptopdf is a format link, but not generated by texlinks + # so we add it back to binfiles to generate it from mkPkgBin + mptopdf.binfiles = (orig.mptopdf.binfiles or []) ++ [ "mptopdf" ]; + + # remove man + texlive-scripts.binfiles = lib.remove "man" orig.texlive-scripts.binfiles; + # xindy is broken on some platforms unfortunately + xindy.binfiles = if bin ? xindy + then lib.subtractLists [ "xindy.mem" "xindy.run" ] orig.xindy.binfiles + else []; + + #### additional symlinks + cluttex.binlinks = { + cllualatex = "cluttex"; + clxelatex = "cluttex"; + }; + + context.binlinks = { + context = "luametatex"; + "context.lua" = tl.context.tex + "/scripts/context/lua/context.lua"; + mtxrun = "luametatex"; + "mtxrun.lua" = tl.context.tex + "/scripts/context/lua/mtxrun.lua"; + }; + + epstopdf.binlinks.repstopdf = "epstopdf"; + pdfcrop.binlinks.rpdfcrop = "pdfcrop"; + + # TODO: handle symlinks in bin.core + ptex.binlinks = { + pbibtex = tl.uptex.out + "/bin/upbibtex"; + pdvitype = tl.uptex.out + "/bin/updvitype"; + ppltotf = tl.uptex.out + "/bin/uppltotf"; + ptftopl = tl.uptex.out + "/bin/uptftopl"; + }; + + texdef.binlinks = { + latexdef = "texdef"; + }; + + texlive-scripts.binlinks = { + mktexfmt = "fmtutil"; + texhash = tl."texlive.infra".out + "/bin/mktexlsr"; + }; + + texlive-scripts-extra.binlinks = { + allec = "allcm"; + kpsepath = "kpsetool"; + kpsexpand = "kpsetool"; + }; + + #### add PATH dependencies without wrappers + # TODO deduplicate this code + a2ping.postFixup = '' + sed -i '6i$ENV{PATH}='"'"'${lib.makeBinPath a2ping.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/a2ping + ''; + + bibexport.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath bibexport.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/bibexport + ''; + + checklistings.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath checklistings.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/checklistings + ''; + + cjk-gs-integrate.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath cjk-gs-integrate.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/cjk-gs-integrate + ''; + + context.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath context.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/{contextjit,mtxrunjit} + ''; + + context-legacy.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath context-legacy.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/texexec + ''; + + cyrillic-bin.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath cyrillic-bin.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/rumakeindex + ''; + + dtxgen.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath dtxgen.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/dtxgen + ''; + + dviljk.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath dviljk.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/dvihp + ''; + + epstopdf.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath epstopdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/epstopdf + ''; + + fragmaster.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath fragmaster.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/fragmaster + ''; + + installfont.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath installfont.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/installfont-tl + ''; + + latexfileversion.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath latexfileversion.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/latexfileversion + ''; + + listings-ext.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath listings-ext.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/listings-ext.sh + ''; + + ltxfileinfo.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath ltxfileinfo.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/ltxfileinfo + ''; + + ltximg.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath ltximg.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/ltximg + ''; + + luaotfload.postFixup = '' + sed -i '2ios.setenv("PATH","${lib.makeBinPath luaotfload.extraBuildInputs}" .. (os.getenv("PATH") and ":" .. os.getenv("PATH") or ""))' "$out"/bin/luaotfload-tool + ''; + + makeindex.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath makeindex.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/mkindex + ''; + + pagelayout.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath [ gnused ]}''${PATH:+:$PATH}"' "$out"/bin/pagelayoutapi + sed -i '2iPATH="${lib.makeBinPath [ ncurses ]}''${PATH:+:$PATH}"' "$out"/bin/textestvis + ''; + + pdfcrop.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pdfcrop.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pdfcrop + ''; + + pdftex.postFixup = '' + sed -i -e '2iPATH="${lib.makeBinPath [ coreutils gnused ]}''${PATH:+:$PATH}"' \ + -e 's!^distillerpath="/usr/local/bin"$!distillerpath="${lib.makeBinPath [ ghostscript_headless ]}"!' \ + "$out"/bin/simpdftex + ''; + + pdftex-quiet.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath pdftex-quiet.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/pdftex-quiet + ''; + + pdfxup.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath pdfxup.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/pdfxup + ''; + + pkfix-helper.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pkfix-helper.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pkfix-helper + ''; + + ps2eps.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath ps2eps.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/ps2eps + ''; + + pst2pdf.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pst2pdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pst2pdf + ''; + + tex4ebook.postFixup = '' + sed -i '2ios.setenv("PATH","${lib.makeBinPath tex4ebook.extraBuildInputs}" .. (os.getenv("PATH") and ":" .. os.getenv("PATH") or ""))' "$out"/bin/tex4ebook + ''; + + texlive-scripts.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath texlive-scripts.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/{fmtutil-user,mktexmf,mktexpk,mktextfm,updmap-user} + ''; + + thumbpdf.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath thumbpdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/thumbpdf + ''; + + tpic2pdftex.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath tpic2pdftex.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/tpic2pdftex + ''; + + wordcount.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath wordcount.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/wordcount + ''; + + # TODO patch in bin.xdvi + xdvi.postFixup = '' + sed -i '2iPATH="${lib.makeBinPath xdvi.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/xdvi + ''; + + xindy.postFixup = '' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath xindy.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/{texindy,xindy} + ''; + + #### other script fixes + # misc tab and python3 fixes + ebong.postFixup = '' + sed -Ei 's/import sre/import re/; s/file\(/open(/g; s/\t/ /g; s/print +(.*)$/print(\1)/g' "$out"/bin/ebong + ''; + + # find files in script directory, not binary directory + # add runtime dependencies to PATH + epspdf.postFixup = '' + sed -i '2ios.setenv("PATH","${lib.makeBinPath epspdf.extraBuildInputs}" .. (os.getenv("PATH") and ":" .. os.getenv("PATH") or ""))' "$out"/bin/epspdf + substituteInPlace "$out"/bin/epspdftk --replace-fail '[info script]' "\"$scriptsFolder/epspdftk.tcl\"" + ''; + + # find files in script directory, not in binary directory + latexindent.postFixup = '' + substituteInPlace "$out"/bin/latexindent --replace-fail 'use FindBin;' "BEGIN { \$0 = '$scriptsFolder' . '/latexindent.pl'; }; use FindBin;" + ''; + + # flag lua dependency + texblend.scriptExts = [ "lua" ]; + + # Patch texlinks.sh back to 2015 version; + # otherwise some bin/ links break, e.g. xe(la)tex. + # add runtime dependencies to PATH + texlive-scripts-extra.postFixup = '' + patch -R "$out"/bin/texlinks < '${./texlinks.diff}' + sed -i '2iPATH="${lib.makeBinPath [ coreutils ]}''${PATH:+:$PATH}"' "$out"/bin/{allcm,dvired,mkocp,ps2frag} + sed -i '2iPATH="${lib.makeBinPath [ coreutils findutils ]}''${PATH:+:$PATH}"' "$out"/bin/allneeded + sed -i '2iPATH="${lib.makeBinPath [ coreutils ghostscript_headless ]}''${PATH:+:$PATH}"' "$out"/bin/dvi2fax + sed -i '2iPATH="${lib.makeBinPath [ gnused ]}''${PATH:+:$PATH}"' "$out"/bin/{kpsetool,texconfig,texconfig-sys} + sed -i '2iPATH="${lib.makeBinPath [ coreutils gnused ]}''${PATH:+:$PATH}"' "$out"/bin/texconfig-dialog + ''; + + # patch interpreter + texosquery.postFixup = '' + substituteInPlace "$out"/bin/* --replace-fail java "$interpJava" + ''; + + # hardcode revision numbers (since texlive.infra, tlshell are not in either system or user texlive.tlpdb) + tlshell.postFixup = '' + substituteInPlace "$out"/bin/tlshell \ + --replace-fail '[dict get $::pkgs texlive.infra localrev]' '${toString orig."texlive.infra".revision}' \ + --replace-fail '[dict get $::pkgs tlshell localrev]' '${toString orig.tlshell.revision}' + ''; + + #### dependency changes + # it seems to need it to transform fonts + xdvi.deps = (orig.xdvi.deps or []) ++ [ "metafont" ]; + + # remove dependency-heavy packages from the basic collections + collection-basic.deps = lib.subtractLists [ "metafont" "xdvi" ] orig.collection-basic.deps; + + # add them elsewhere so that collections cover all packages + collection-metapost.deps = orig.collection-metapost.deps ++ [ "metafont" ]; + collection-plaingeneric.deps = orig.collection-plaingeneric.deps ++ [ "xdvi" ]; + + #### misc + + # RISC-V: https://github.com/LuaJIT/LuaJIT/issues/628 + luajittex.binfiles = lib.optionals + (!(stdenv.hostPlatform.isPower && stdenv.hostPlatform.is64bit) && !stdenv.hostPlatform.isRiscV) + orig.luajittex.binfiles; + + # tlpdb lists license as "unknown", but the README says lppl13: http://mirrors.ctan.org/language/arabic/arabi-add/README + arabi-add.license = [ "lppl13c" ]; + + texdoc = { + extraRevision = "-tlpdb${toString tlpdbVersion.revision}"; + extraVersion = "-tlpdb-${toString tlpdbVersion.revision}"; + + extraNativeBuildInputs = [ installShellFiles ]; + + # build Data.tlpdb.lua (part of the 'tlType == "run"' package) + postUnpack = '' + if [[ -f "$out"/scripts/texdoc/texdoc.tlu ]]; then + unxz --stdout "${tlpdbxz}" > texlive.tlpdb + + # create dummy doc file to ensure that texdoc does not return an error + mkdir -p support/texdoc + touch support/texdoc/NEWS + + TEXMFCNF="${tl.kpathsea.tex}/web2c" TEXMF="$out" TEXDOCS=. TEXMFVAR=. \ + "${bin.luatex}"/bin/texlua "$out"/scripts/texdoc/texdoc.tlu \ + -c texlive_tlpdb=texlive.tlpdb -lM texdoc + + cp texdoc/cache-tlpdb.lua "$out"/scripts/texdoc/Data.tlpdb.lua + fi + ''; + + # install zsh completion + postFixup = '' + TEXMFCNF="${tl.kpathsea.tex}"/web2c TEXMF="$scriptsFolder/../.." \ + texlua "$out"/bin/texdoc --print-completion zsh > "$TMPDIR"/_texdoc + substituteInPlace "$TMPDIR"/_texdoc \ + --replace-fail 'compdef __texdoc texdoc' '#compdef texdoc' \ + --replace-fail '$(kpsewhich -var-value TEXMFROOT)/tlpkg/texlive.tlpdb' '$(kpsewhich Data.tlpdb.lua)' \ + --replace-fail '/^name[^.]*$/ {print $2}' '/^ \["[^"]*"\] = {$/ { print substr($1,3,length($1)-4) }' + echo '__texdoc' >> "$TMPDIR"/_texdoc + installShellCompletion --zsh "$TMPDIR"/_texdoc + ''; + }; + + "texlive.infra" = { + extraRevision = ".tlpdb${toString tlpdbVersion.revision}"; + extraVersion = "-tlpdb-${toString tlpdbVersion.revision}"; + + # add license of tlmgr and TeXLive::* perl packages and of bin.core + license = [ "gpl2Plus" ] ++ lib.toList bin.core.meta.license.shortName ++ orig."texlive.infra".license or [ ]; + + scriptsFolder = "texlive"; + extraBuildInputs = [ coreutils gnused gnupg tl.kpathsea (perl.withPackages (ps: with ps; [ Tk ])) ]; + + # make tlmgr believe it can use kpsewhich to evaluate TEXMFROOT + postFixup = '' + substituteInPlace "$out"/bin/tlmgr \ + --replace-fail 'if (-r "$bindir/$kpsewhichname")' 'if (1)' + sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath [ gnupg ]}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/tlmgr + sed -i '2iPATH="${lib.makeBinPath [ coreutils gnused tl.kpathsea ]}''${PATH:+:$PATH}"' "$out"/bin/mktexlsr + ''; + + # add minimal texlive.tlpdb + postUnpack = '' + if [[ -d "$out"/TeXLive ]] ; then + xzcat "${tlpdbxz}" | sed -n -e '/^name \(00texlive.config\|00texlive.installation\)$/,/^$/p' > "$out"/texlive.tlpdb + fi + ''; + }; +} diff --git a/pkgs/by-name/te/texlive/tlpdb.nix b/pkgs/by-name/te/texlive/tlpdb.nix new file mode 100644 index 0000000..c778234 --- /dev/null +++ b/pkgs/by-name/te/texlive/tlpdb.nix @@ -0,0 +1,54489 @@ +{ # no indentation +"00texlive.config" = { + frozen = true; + year = 2023; + revision = 70616; +}; +"12many" = { + revision = 15878; + shortdesc = "Generalising mathematical index sets"; + stripPrefix = 0; + sha512.run = "57a177b65450718631f36bfd8db0f2d1bff788f3bf147137b6412714cc945c7e08832f14f9e7e659adf7e072a91f13a2ea27fe3161cd9b60313bc956f1f543c6"; + sha512.doc = "9ce7fdae151a116ef6b22943bcbd1e94b90862baa5d50f54a00105d1f2d623f75a2e1440c3c49c560e2e6c5baddb8a6772753f400165b63a90a84f540e3fa381"; + sha512.source = "f007dcaccb364964a73da6a09db5e6a25ee401d8108b19021b67023af273f486392cef6a0b01e951e9fa885304d0e157b919cbd6abc472a96dfbbb0f432b8530"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +"2up" = { + revision = 55076; + shortdesc = "Macros to print two-up"; + stripPrefix = 0; + sha512.run = "6408d1d99a97df71640bcdde4133edc2e5861bbcdc8c5e1be98d5704f7ecf9c043c5538ea19ac4952d811e3677ee0698bdd477eadbd1068725bdb210787d9dbc"; + sha512.doc = "3375cfbd95412f2fde2bdb9171b1c081890a52168d0c6d0f0dfb0ad914117c79291a56bc97602627a698509635765fd5e6e95387a006039178e440a8bea24837"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +a0poster = { + revision = 54071; + shortdesc = "Support for designing posters on large paper"; + stripPrefix = 0; + sha512.run = "038623ef39540340a9c9de228ff0787512fb34916ee5a250dbc6d9327b9249d51c633b8ed0dd725c90db462ed7c96290ea7d6fd60e299e787d0e5cf585efb5f5"; + sha512.doc = "51e01cf36d4ec625bdc68e586d276e09973dcfe30cd9ba2aa7dbeed73337bea03a222d66a6903e5203e1530d88433d326d38ff66896c52ac33587a3d147cc2e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.22b"; +}; +a2ping = { + revision = 52964; + shortdesc = "Advanced PS, PDF, EPS converter"; + sha512.run = "4008c18f93a7d378c8da20bad7c1fdf19c3e6befccdcc804326168854fcd35bb89fe414b30a26dbddeaf81a11c0d404bf5b5459bd3d8adce49dc30279e3bd420"; + sha512.doc = "7a7b6474819b2715c131485472963b463163378d4ae4ac586f17a130b3327c6dda1f4132f4f2379388a8a493fb2374abfff6b7ad87513cbe9d04993572692aeb"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.84p"; +}; +a2ping.binfiles = [ + "a2ping" +]; +a4wide = { + revision = 20943; + shortdesc = "\"Wide\" a4 layout"; + stripPrefix = 0; + sha512.run = "e0f1f95bf660760683d6c5a917d75e537a0347837eb4388eded8194c6ca5371b2ad9be9829fcaaff1e24b7d8baefd287db6add752c19a57a6cf0737017e311e3"; + sha512.doc = "bf059462ec7e28ba782d5842d090c93f4e911bdf44eb3d4f184a7324b454105295460a52414ffcb9fc71dceeba902b1d78ba208d0998f71727ad41299eb1138f"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +a5comb = { + revision = 17020; + shortdesc = "Support for a5 paper sizes"; + stripPrefix = 0; + sha512.run = "443548964eb48ec458942e97f0d6ceb698050a5d4dc83ad17a71db0f1d5085a2c8e73c3e8d9bdbb7ab7e6328d12e42a6ec05c4c7dd4247717f295fcd5da66423"; + sha512.doc = "ee845d8b6a21271d2f0e4e6fd24c79a1235d24ba15cc2d037eb41761b05ad3e69dcb5379c223c07b81c62df5f89190c84ff977390e149566710ce7175e4c2823"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "4"; +}; +aaai-named = { + revision = 52470; + shortdesc = "BibTeX style for AAAI"; + stripPrefix = 0; + sha512.run = "bb851e6bb3d9c2efd8d9abd32056d0853e320ee7f495b3c595d6a112d5e66bdbcb24107f741249fdfde350dead6763484cc412d380188d29155649b4076c4e77"; + hasRunfiles = true; + license = [ "free" ]; +}; +aalok = { + revision = 61719; + shortdesc = "LaTeX class file for the Marathi journal 'Aalok'"; + stripPrefix = 0; + sha512.run = "03d1585e9b92e26044066d1f5b8d2dec0ad298627cc94fc1ab11e45307f62c573934f1a2cae6c5318a9cb377834d4f5a490144cc07bdebd9dc22cf298315630b"; + sha512.doc = "702145c708edf984d24153822036acc0b563038c50423af0cd3cc6b008b7eb3bc8d67eddaac350ac6557650177218260e5adfaf0ca5807130b0e23ec7127470d"; + sha512.source = "b452ccf38dfb3436aa8a6907798101621fb2f5a66077cc24b316760013b0e665ef26d69b444c27cc8521dd6c06828be8a832e061df74bdcc70577f262ae987c3"; + hasRunfiles = true; + license = [ "gpl3Plus" "free" "fdl13Only" ]; + version = "0.6"; +}; +aastex = { + revision = 58057; + shortdesc = "Macros for Manuscript Preparation for AAS Journals"; + stripPrefix = 0; + sha512.run = "9ae52d4142c12621839945213d1f20531350b27f0b1d124d5d5c1bae81d50fbe83ab116d0c65c25852952415eb860eaaf008c119cc10cdb149b964f0b06ad6d0"; + sha512.doc = "bce30656a98d3598312ff399b5e5eb229b89e7e62521748418be718c38c6749a8e9737f6c933f6f32ec948e3ebe1ef339ba9037908741c3b902d33a8fda9b027"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.3.1"; +}; +abbr = { + revision = 15878; + shortdesc = "Simple macros supporting abreviations for Plain and LaTeX"; + stripPrefix = 0; + sha512.run = "4b5d504cc9438ceb97a6935e66a6eaeb494eb76eb313bed275b1f1a829690569972feec048132e12b5849f398d0a4b291bc5f9ce8462031846ec46bc88ebab3c"; + sha512.doc = "7080dea132581fdb0803b4ecfdcf4fd5ed5a689bd7e0c7b7b699ef5b3faeab908042f1704cb553ce38e7f37d9facf7d22a74ac71e2cbd269298f35666367f41a"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +abc = { + revision = 41157; + shortdesc = "Support ABC music notation in LaTeX"; + stripPrefix = 0; + sha512.run = "8b1ccd152ed2ad90810551a36f0fa7f114625784fa967f70b67559f9f1e8eb32d7edd08efc9e55dd92723df4039d1bdcc212200d712e99f27de84a153c2a3777"; + sha512.doc = "5f127f8e1ec104b40ac4d5e9bb22965e9376033892362073cdea9f65f1f10a4152f237b4f27bf52dbbe1389f59d3da673434c39a2b3f43d6f17aa60caabd5584"; + sha512.source = "e47ba563a1018edfad97fb0556e4f74c7f3054a56c38304d9a188a92b51554628430332b4e66ebf1d12eb4ec6719cc13d7ea62c23157e70a3c0d40e172b9a04c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.0b"; +}; +abnt = { + revision = 55471; + shortdesc = "Typesetting academic works according to ABNT rules"; + stripPrefix = 0; + sha512.run = "66931af2a5ab583914ea5abe6bb9668d04442c23ab654691e3864ecfaeecf65e3eda47b3d279abb9fdacb385ef9922d6caab808273f87f3bf323a33b441b7bd1"; + sha512.doc = "0a46414ec99e14a60a167ec7ca09d074c802f4232cbd4204e52e9d489edb3b1657c7f33f0a3fd0bbaa09f624cb52903b8a18db43f54c7a1b0aef8c804b53b1b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +abntex2 = { + revision = 49248; + shortdesc = "Typeset technical and scientific Brazilian documents based on ABNT rules"; + stripPrefix = 0; + sha512.run = "951c039cf0c97a6bd3974bd01ed9323876f1ee74b8250037dce3e92e00d598ab1cb2cfd0bbf4ea6d37b5f8c3e1095e531aa245ad1a91ee49262e6f99c5c84e59"; + sha512.doc = "b6a5871cc33d94c1294a62aeb809f9d29ccf021cff510497c02edbaef2f155a55847dc521a0f698367692e556b2c588a95066bd3097482b0477a67d4a78b7489"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.7"; +}; +abntexto = { + revision = 68837; + shortdesc = "LaTeX class for formatting academic papers in ABNT standards"; + stripPrefix = 0; + sha512.run = "9fb1177d1e97995fa8c7038e38fb827e491c2658af6844f62edb547f281120a9df873a98e509d3e67c577d46472c887ca96ce2e2436f748cba9086c6160f2986"; + sha512.doc = "3d3d58d077f3072e9bfd9bc11e68e17e4885af88864ef80de1010c331c429895c5e03df438d3a0652a8d31623dde5b1cb40daf0a709af6c3a2e90658d13c596c"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "3.1.0-beta"; +}; +aboensis = { + revision = 62977; + shortdesc = "A late medieval OpenType cursive font"; + stripPrefix = 0; + sha512.run = "74f569d7f8b942087285964f350e97b15de05a69a09b1aa21d3bee09a017381d4b18b449a55aafcd0009a5941f0bea198b04947a81b331541af6617d5a58ad73"; + sha512.doc = "84317ef83e712296819b25926adb7522531482b9d17d807cdfd3897f712aae8a8f161a242bffdbe7511478a3e5ec2c1e76fcf51c14661b3465aabbc6b95bbaf2"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" "cc-by-40" "publicDomain" ]; +}; +abraces = { + revision = 64967; + shortdesc = "Asymmetric over-/underbraces in maths"; + stripPrefix = 0; + sha512.run = "ca6061935e6be1089592f77612de222313e41b8f78f0f14bfc06a8823da052543cf6ef0cb95c585698a8a07b5d3c2954909d85ee2ed300c8602574d34ede2892"; + sha512.doc = "84c9a8585ec4cd16dd8e07140f10e545f99622dd90ff3ed28a7eeaa070ce18cfc9ed64e2bbc9efd0dbd4ebe1c27b68aee66eb091ffd6c8debad1cb502edb6f4e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +abspos = { + revision = 64465; + shortdesc = "Absolute placement with coffins"; + stripPrefix = 0; + sha512.run = "87400db8c388db7d7105007ea853d2254451b98daba9a8c61822fb56d143e2dfb75918d40bfe519dfe18b401f944db1569ee41ac768ccac8449e78ae59fb11c0"; + sha512.doc = "90cb62134a36e1cb1589fbc8a6b993c777562eb1eb309dc0cb4f6835ec7174df262957cc9b34631aab4cff5b6aa6818770e26034f5eab29d35ad5d7c4a155cd5"; + sha512.source = "7cf57d88b340d57277e16594e66c076aadba3d505d6f7c66cd1e9407db5d21432d121c3b798d0f86704f12732080a9043c6c843afd16886533065ab70e61b8db"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1"; +}; +abstract = { + revision = 15878; + shortdesc = "Control the typesetting of the abstract environment"; + stripPrefix = 0; + sha512.run = "2d805c2cc322cd802d612213ce525765d49d06bfb371a4ac5d1434a3c752af0ba0182093b0b6e4ee28a80ab926ad0f3a0403c03f871d3e003f6eb5a60ae39c34"; + sha512.doc = "4feae7e22d9f8c6866a9b873359a3060ff75ebcd833e1ea5f82e833933b5beb36260833675775cdeb83f1cfde4dbae3421434890aa9f0f7539c999acd2e0405b"; + sha512.source = "e68a030e56dc15481335dfb1ba566f9b68e92933f27d296d72e20b4d3541790b739b945fc1b39415baadf045164158618da98b63be567c1aa263336579986e8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +abstyles = { + revision = 15878; + shortdesc = "Adaptable BibTeX styles"; + stripPrefix = 0; + sha512.run = "de7e7a5c7e56ae4fb478c9a072c6b2dc8716ea34ee17be577cf4a485c5506f16cc5b79293cfbc80b245ab350c2e2059dd5fb37a2e28818f492edf7c0416d52e3"; + sha512.doc = "d12304eeb2cf797153d7e17beb25c462b3fdf75f5b7b1b24e1ff89d52ce8fe5b2a0fbf88d083ba51301afc45f51871e376253aede36bef21becc1a4350da8259"; + hasRunfiles = true; + license = [ "free" ]; +}; +academicons = { + revision = 62622; + shortdesc = "Font containing high quality icons of online academic profiles"; + stripPrefix = 0; + sha512.run = "10fed2cdb2533a7291626eee2f3d46e79fe972eadd83cf7177f22228dcd13422549819dc5e1cf0b03e8397e23badc02a965857aca886ba004a3279efeb49b288"; + sha512.doc = "beeb30c90b668edbd135a0067165232efd0919c4e42f9e968a8e0e3250a88ba9d1a4489fc8e8f10c69c27794b1e00c63151877e119ceb33da50b12c42c4fc80d"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; + version = "1.9.1-2"; +}; +accanthis = { + revision = 64844; + shortdesc = "Accanthis fonts, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map accanthis.map" + ]; + sha512.run = "5727125c85e06501f009267bab8c1eff674a76db618c6155fd9c6b41bb2407a3a201a008c7f5aa6d73ecf100a3fc917961d20f547c2f6040fe72760a4dcd9a44"; + sha512.doc = "6789c3c330d1e6a0d20364e4e98ef72fd1c6294655f704366b0e6c1fd081d1aea312dc9e6767fb3e076b3cd91ea5a67606e8bf62f7f92af097ba766c99ab0cff"; + hasRunfiles = true; + license = [ "gpl2Plus" "lppl13c" ]; +}; +accents = { + revision = 51497; + shortdesc = "Multiple mathematical accents"; + stripPrefix = 0; + sha512.run = "738e8299148365c0441495664cd97b408b181d192adb718adeacc93d4c63b7e81c12541746777571f3fd0da37348905269b5d7ecfc2d58f88174cd53edbe56b3"; + sha512.doc = "50e5cd01da80113ef3247c4a7c7da703d4a9c3df68822b31ff734da2d755f5fd2bf9f5f8982d84e3628e96905276dfe6cc6699bb625ff1dadbe810b11bf5a35b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.4"; +}; +accessibility = { + revision = 55777; + shortdesc = "Create tagged and structured PDF files"; + stripPrefix = 0; + sha512.run = "6cbc455f40a6aeb5862bbed64e6ec111d497f1948fa6eb83d26fc04c85c1145437005aa046e20eae70f177ff04c7084f03c2d4b3234be6c6ece822d6f366520f"; + sha512.doc = "261d13857558973edb692ed320745173a5006d0cd23418e926be5398b4f3a2da0a670e3a08a26083381e830f4bd327eaa4451822ef096612a7a3c3492833c328"; + sha512.source = "a7218b14ca307c9e02f6c562db3bb381a8a57ff758fecfc36f758bb70a151ca83e3401c7e2254ad2f75fe62d762cedec0746b07f5f5f6b82982675f42faa4e31"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.3"; +}; +accfonts = { + revision = 18835; + shortdesc = "Utilities to derive new fonts from existing ones"; + sha512.run = "f70105569c5b8ed83c103e423d29367702a5330d57f743a640ef68fc6a290b246e8f514907d63d6c7f203c12ab3eeb0cc64a45fe5c0379f10ccf1c8002007a47"; + sha512.doc = "24b19688008b875890a397e2250277f81be1b77c00f95a9a2d40a257c0dc6f4c8adfc07e594f3873e60e1bfbcfeba786e45e9e63eb632ca92b7c935f74b3049e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.25"; +}; +accfonts.binfiles = [ + "mkt1font" + "vpl2ovp" + "vpl2vpl" +]; +accsupp = { + revision = 53052; + shortdesc = "Better accessibility support for PDF files"; + stripPrefix = 0; + sha512.run = "0b6e474617333ca00c2503e99f60a290b930d7e7534de7223be511404aa6c7ba9a8dd69b94f3433b347146bba7b8dbbd4b6d45ed8b2c6b0880c0177842ba8b45"; + sha512.doc = "650909f5212a92659d18ba3ef5209ed12c9b9ddff2b3157ea17cdbc8955536f41e43dafcd715e5ec26c1d0c839ffb7b26081ea36150b2f0f50c952c5231a1a20"; + sha512.source = "e867fabe08188b8fe68c1d9ac6688fb99f69422db26b4cd611028cb8880ce90a8981efb7eb7c49f4fd3d1182d3b99cd90f171959751d7e1ecc1f7880d5a8b5a8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +achemso = { + revision = 69638; + shortdesc = "Support for American Chemical Society journal submissions"; + stripPrefix = 0; + sha512.run = "1a073188cef886e2eb5c6090a2f887d5c58c04d535981d1926a1b389130092bccb614c22b8b5b675d6d2d49208e4d05ae560966db39443cd822c59bc41e6af8e"; + sha512.doc = "b26169bc393110b3805c4dfdd0fbb1838a469b6dd9664914a55eb7f1c031a4cfbca7e96cdbdaaf67329a48e3225e104f5d6a46b0b52384b77835a049151f6cf1"; + sha512.source = "94cab70cfba8492f44a09a3b94e411cbd5b32f3dd5b9a17ca8ae1ff5bb6c5ac6c8a882f4fc94278bb267556ccb43bc981f24e4b6b47b5c9df90c81cb44005029"; + hasRunfiles = true; + license = [ "lppl13c" "free" ]; + version = "3.13g"; +}; +acmart = { + revision = 69721; + shortdesc = "Class for typesetting publications of ACM"; + stripPrefix = 0; + sha512.run = "e40a361687d217e3dd3bbf1998c4c478e14cc758d3ae3d96ca19433b5cca576dfb93a53324253a2a282935d4b2802a103d36bd8b6f507f151187493c4be0e56d"; + sha512.doc = "1b6dd7a2c478a4476286ca897b13b4ac005af6eb6201e53a173dbbd11fbd23a95d7f3b33ec28a373ead62ecf8a45c351fd8521376b803e321ec02e7da1ac7f58"; + sha512.source = "f24476dc2ef09aaba2ec078e0895f9e6f1411c9c19d9703ab318eccb16ee04ca7e97a60c1fdfad13e89d61899d2fbd4d06108651512ea75d060448c4e7064e61"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.03"; +}; +acmconf = { + revision = 15878; + shortdesc = "Class for ACM conference proceedings"; + stripPrefix = 0; + sha512.run = "9363127ba5d59bee9d41e800a0e11d12bc4493e5a79a94be8efe23a44278ea097a58fb53cd334fef0f2ab32c9350196c46ee1aec8347a4aa5554b317c15249ba"; + sha512.doc = "a8a971df6a94a9548b71c1463b9ab143525127774daf5aab227a805c302ee0732d3578c361c5346b123983a32e6d6c8afbd543bca4dc7ac7ad4d5919aba63099"; + sha512.source = "bd9ffcd848571f2a4ffaa7f324835c74abd59ad1d2816b6dbad5fcac7fb06b98c38059dab7261b4bf7d811d56d0ad48d23ac81525cf95a2e6a190a25a6de9d82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +acro = { + revision = 62925; + shortdesc = "Typeset acronyms"; + stripPrefix = 0; + deps = [ + "etoolbox" + "l3kernel" + "l3packages" + ]; + sha512.run = "25c0dc9cda98db7ead55613aea92946cd90e7edfa1213d59966eb8fdd93ae1bc7b532f7849c43fb8fa77291b23dc5d8dc80cba4584c991a7b38e55564bd59ea3"; + sha512.doc = "c827f8dc5fa88b67e84e48d0cfb6d47aa5bfa98fbceed86e6262d98111a956d425d0a2f3cf54b18cba7593dfac17accc2cbe71cc04f1ea2157c511d670c41daa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.8"; +}; +acronym = { + revision = 54758; + shortdesc = "Expand acronyms at least once"; + stripPrefix = 0; + sha512.run = "be68e32baacdb8708d1a31c4a585fcd282d0def7a76a1e284b908532118aec04505271790a99ab0a36e7c035695b84f8ae1e2146c31ca8c4fcfb76be4f11db26"; + sha512.doc = "72b77e66b4db0c3b42252020fa56be3e4b1a848ad7314037d6ada3eb449fad0b35371835ccc6018bc71ef991ade0720f7febeb52fecd71b3ccc9a5b839bf66b2"; + sha512.source = "8fd7e9f374e08f69fc33df24be50a9842fb62a18232d2631d85ecf7e6ce702bad1d21989dc01b3513a69e7a39eb343763690cba027df984dfc7777f047ed45d7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.47"; +}; +acroterm = { + revision = 61719; + shortdesc = "Manage and index acronyms and terms"; + stripPrefix = 0; + sha512.run = "f8ce516ba2de1367bf414061e14c260be31304ce93693a95e6b9ed29d5cf170bb041248eafb76546cfb1547e687d07ec51333177405ffa8a5c9ea76070394832"; + sha512.doc = "66610cbd2e77d8f9b0eda3c61382dc1a8436169017d363a5716e0ad1991849824a1958552af4a14545dcac37191302c0907b505884f7cf1c7d83f8087d888b6a"; + sha512.source = "531b5768a7312bd40797b6cc67abc58050481ef97455219698018a635a298f542506669956211dab32d51dce2c86f3d3d6a2e913c4a0f81f072035a63470e5c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +active-conf = { + revision = 15878; + shortdesc = "Class for typesetting ACTIVE conference papers"; + stripPrefix = 0; + sha512.run = "afd71b77d016c6f2b36ff045176929409f1fc104d9f3530c1a70fad4fd1c71ac327a3b58dbf4a14b93cc691d88bf6b7d3add07196921876360280ee4e5915134"; + sha512.doc = "e1b990ceab6820376c18068bf5ac15e984150fe7ad66929496cb77665f0ae334cb28026e0000e788f0580eab549fe2f70e802ca67d0f968961f4582290646758"; + sha512.source = "06d82683cb44e35a07e2907e00f2f80b247a3ca2cc0e9b230e7417aafc21a73c9ef788c4e88cdf7fe7f812c471c3b34273adcb4d5e272888fc481d9d18a88b68"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +actuarialangle = { + revision = 67201; + shortdesc = "Angle symbol denoting a duration in actuarial and financial notation"; + stripPrefix = 0; + sha512.run = "23878ac98706c08b1fed8f4fdbe7d403f4f0b668ce069837ddd1d433bd3bd3e50e9b041ebec4c8256df56f1649962b7ba2421795f9adc3207a825562633a2b4c"; + sha512.doc = "f28274449a2c9558a22e1b3a3d648ed2a456d6ee179168d06ab4a6cf339f2e0ae7e43c8b0d2ecd8697ffb8cf5308f0497a13012f4b481ec68e02248036a8cf96"; + sha512.source = "9364093cb942abdca6062b66d35f1a0e9088c7bf653baca6bd2ecadb8aa2e743c311caed3ea52f42121511b9b66232d5ef0ed554a29a3253c8e52eadd83d0dd0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +actuarialsymbol = { + revision = 67201; + shortdesc = "Actuarial symbols of life contingencies and financial mathematics"; + stripPrefix = 0; + sha512.run = "a36df9659b33223efb54d050f12676e3aa0555c83911a901c5cfe137e8e7b27d68b47534cdd2064724f20a37715b46fbf6863a5935c9fb93f56e4e7ca26bf004"; + sha512.doc = "ab15ff459aa82dc46a011a7601128dc7e6da720676390167ca856c0942f6a70e0d698a1624b443d3779446f3ac01d4af6bcf5bb5e1e0a17e0e5fefd3deef657c"; + sha512.source = "3b587f3621cbf4d4446664c253a9cd27a6b69da3ed8d1bc09f6054bcdd450e40f8b38be336ce48e0ec251f1d8dbe45b17b6055251aa76bdf4c36b97ed8e4f077"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +addfont = { + revision = 58559; + shortdesc = "Easier use of fonts without LaTeX support"; + stripPrefix = 0; + sha512.run = "36e16da02daf6b93b53f1458ca5eee2243310846b8ea05e6b8b00a3120e7686fbe42d6e34d602d84171fcf7cc5428135aca36eb5402e778facb1882e7e7831a3"; + sha512.doc = "583f7cd7b46173ff57cfa4505d14cd3d88ddef7ebc2adb8fd2705fb8011711bd65d22ef38cfa6b5224191af1841f22ee27332f832029cff762b7b7e49246b179"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.1"; +}; +addliga = { + revision = 50912; + shortdesc = "Access basic ligatures in legacy TrueType fonts"; + stripPrefix = 0; + sha512.run = "b54db5b075c2ba2f632e40a1ae2d840b0a61cc940512027effa2b2b3cadfd6dfa2407e2580a462b98f48cafed94281d39613397ed34ad76f54d6a7e8b614ecb8"; + sha512.doc = "572d9aa1396ac80be2cd9ab0bd317759805a6541b656e19ae36915a6277f9a4ff2987c84dbf903133e0a5027f382b0ed48fc882ce7a79df7a27cfe3082d2a666"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +addlines = { + revision = 49326; + shortdesc = "A user-friendly wrapper around \enlargethispage"; + stripPrefix = 0; + sha512.run = "5d0a438fceef1481633f37824b686422e5000cf232b7dd24bba0f30c8d62b583daf01a67242283f2e4fe971438c061acad2860f50ce1438ca32677d497db8b2a"; + sha512.doc = "2993c6caae1d2f230d144c9f93f7694adcb2e17d9bcd60eb3aa3144806a522258fd4c44a314d40cc767b3b069c4c929b8e458e74bebc746771b975b77bba34d2"; + sha512.source = "6de10a1ddcb65be76594e7389d47316e066aec3a747ef7a61e15fa0e670d914dae3d2ef777c9574e8b85c5d9628784df7f4dc61f589917dbae571f31416bad08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +addtoluatexpath = { + revision = 67821; + shortdesc = "Add paths to Lua packages and input TeX files"; + stripPrefix = 0; + sha512.run = "91d4f85e45181674b6ab2bda5ff3632aaab4abc0066c5026478d41c0205e021f12c3cb833c8c339c02e4e033aed351a5891f8527b95cc33f26ba534aeeaa785b"; + sha512.doc = "ccc8ca7fc9423192a68260b6f441fa7be8a1144bdff8e0eee478f01e2c09d0e54f2a25d7a7fb935f76803003842f16e41916861d9a69e3ea2bca5724b1be5411"; + hasRunfiles = true; + license = [ "mit" ]; +}; +adfathesis = { + revision = 26048; + shortdesc = "Australian Defence Force Academy thesis format"; + stripPrefix = 0; + sha512.run = "4eb7fda01fa1961d213eadd2f0bc9b1cf102de664dae1f37588e161af22d043319e12ca704c3223e78e963411c3f0533c845b17f7d0744b020ef2dca35b2c7b0"; + sha512.doc = "86d89f4f139c9ddfe6babb84558f7d89f57b75e28d37f659d9893ef703cef7199272e60f1233d51351b5bd8a4565393dd6f09ba69796d2ab555423c2ba23c2b8"; + sha512.source = "3d9a376183e2cb22dfd210eb6d453324d035289173c6750d67ee90379d794a50393c49f8fc40e5c51484127632f2489468b215dc510b0db0313372816fc77927"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.42"; +}; +adforn = { + revision = 54512; + shortdesc = "OrnementsADF font with TeX/LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map OrnementsADF.map" + ]; + sha512.run = "7a4a4da6c72ff2f8ab4b2a9a5e92887306a8e2aee4bcc5a93c18bf41d1bf9c05bd23fd6401bda054994aafa8d6002dbc16d8483b951acb705cd46fda08aaf060"; + sha512.doc = "2a287f8685154359c914b13e8e153aa64bb19708a9f5b122180cead53ee31ab829dc934dcab43f09ded4fe5d2a81ee32528855f1a4a1bd07b795eaabcb204f48"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; + version = "1.1b"; +}; +adfsymbols = { + revision = 54512; + shortdesc = "SymbolsADF with TeX/LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map ArrowsADF.map" + "Map BulletsADF.map" + ]; + sha512.run = "7100648956a68719d1a449a3aee0a4acb3788aea7f082a6e7e38c8d8dfa2c712a4b896a9b036e8ae8b2732b11414ab71a49e2f513e7d689f4b0ad9e44c052019"; + sha512.doc = "fbdd78030826918a3599a1f843db692390ebdcf4ca9a853d8c2e78706cfafe83ae79d23d09fb097339d8c726608a27436b3bf22725935c55060f1e8579ea1eaf"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; + version = "1.2b"; +}; +adhocfilelist = { + revision = 29349; + shortdesc = "'\listfiles' entries from the command line"; + sha512.run = "57436dae1489c0f614c4b002f83d34a711398a762ac532b44b1d91a51d068462aaedb5b034923629f7630f039988452eb833d1e98af389c788091517bbee8954"; + sha512.doc = "14bde143bf3ffa3f2b972f93544089e4c0314c7696e1d711719549b7e831278c66fee0676665fe6eaaac744689d613dce159e4eee2e3f9c24dbbe602794fc62e"; + sha512.source = "15e7f652408c5975ba47131109e0d18bcb1d270e0ea630a9a3ff385e499cf3607a366e708a5ec9559d7ccc2a5e0b2d3d0f5f615142978a918b0bd1bd0218a30d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +adhocfilelist.binfiles = [ + "adhocfilelist" +]; +adigraph = { + revision = 70427; + shortdesc = "Augmenting directed graphs"; + stripPrefix = 0; + sha512.run = "38a89fee26ed097a2395e43a86ddeb8d9b652e758f72413ae0f3a35b3130a1a742a94c65324708112f3d27b7317e01c8da2cf0ff86fe56d7221b92a60e7ff809"; + sha512.doc = "c154996a4370d31e2f596a0a463189ae64c7f1b829b5269b8bb6c229ebbea888e6153d43f12577df7ad9feca4af2d3dddb23af7e03a63e44dcb88693873f546b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.7.2"; +}; +adjmulticol = { + revision = 63320; + shortdesc = "Adjusting margins for multicolumn and single column output"; + stripPrefix = 0; + sha512.run = "aa3a350cc284bb52e5dd519155d9e74dcf96171e12acfd092ab3be502f09100a37cfb98c4ea99c6db7f7efc4b1edadfea86b29460dcdae212fd38cbb0b0062e0"; + sha512.doc = "393cd068816ef77104ccf294921d6e9213497ce52e8507044783b05859c54ceea208fad8a7af2efcc6b42ac74abac142f883eacd455b0e3f6227c3222d2a5db0"; + sha512.source = "400b8e4a5a65c49094a127c43d002b93ce38f04eaad154e5edaa1418d9186abc8b14c74570da79953fc44863de2f98748c23d66abfb9b4d03b5024aef9e2082c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +adjustbox = { + revision = 64967; + shortdesc = "Graphics package-alike macros for \"general\" boxes"; + stripPrefix = 0; + deps = [ + "collectbox" + "graphics" + "xkeyval" + ]; + sha512.run = "ac12b052b2112d5bcd942888ab69fa20aca6e2b392bf868959b8573ee8611d93042de3f90eace1519a89d0da64d2dcb3046e26fb0f86f46ea3e673e2a2aee2c8"; + sha512.doc = "d48b405a472df491b3ac6db23b126a70acda26e4dc2baf8e60569f110af2c4c740708c84fad9b70f689022e8747013198c98ea0bb3c6798f1dd8065a431d1ba5"; + sha512.source = "08da88fe2a344716e7184ac2cadf564a90def84c03af8270a2f5e906ae720a7794dcb2707af5e41ab41406b01021029f4272c3e2844e9e36cd913ab56f049ba3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +adobemapping = { + revision = 66552; + shortdesc = "Adobe cmap and pdfmapping files"; + stripPrefix = 0; + sha512.run = "363f7fd337e5a34737608a2bc37521bb526ce726f5c9b5b4d08416e534448306002bc7af1be3f5e6fefcaba16ffc2260c4dea8a486d44dbccad577fb04d6da5b"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +adrconv = { + revision = 46817; + shortdesc = "BibTeX styles to implement an address database"; + stripPrefix = 0; + sha512.run = "ec4300075ae2fbb0b29fa8126263d8852a405a84df8cdb6f484c989ebe948257ba3d1f3ddf9204ea7d6d50129c294a0130afabb053bc63022928ca748bb4ce14"; + sha512.doc = "93ec47833fee152b098477f838858a259f5842264d3a7e9a959d60fd35f46d680eba61c9f4b5efa08ab2878da4aec78d19cf83880e33aeabde9854aa88491c78"; + sha512.source = "25233e23bd1c6aec13609b5d17587747a5840e21637e3d11a478941f98f5f74a77eed31f806b51d07b79f8cc4ebb8c6b8fa419f72927045e3695ca4ada8af388"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +adtrees = { + revision = 51618; + shortdesc = "Macros for drawing adpositional trees"; + stripPrefix = 0; + sha512.run = "1e06f07576666fb7b54c78d930f66fef78571469bffc3ef448687c8bbb0d23d41761e17c8ec1293bb6527e31fc70413df1b7de5c9a06514e6aa8242ed90deb09"; + sha512.doc = "ad8f2e42a4a31368000909c5841fddc189bc2331b47f2c64b16ec509bd662a1b82df3ea8b712f0bdf1c40f123ac28221179b4352e20631d9fb776c0b2939bc4c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +advdate = { + revision = 20538; + shortdesc = "Print a date relative to \"today\""; + stripPrefix = 0; + sha512.run = "80075aa6efb4125bdce79e9b2ec6951caf1a753c8915201767de230acdd1adc2eef31400574effadf6287be159236422840751bf5ea24cd3cab8a01e82a0185c"; + sha512.doc = "acfcbd6a40630da2cf9024cbf3ed378c1f7f8a16c8f8395b69c12f9693e903ba54b9b051c364c5cb4de957876bbd41f0b480c4f4b320e22f2c6df7b08502873a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +advice = { + revision = 69283; + shortdesc = "Extend commands and environments"; + stripPrefix = 0; + sha512.run = "fab7716603412d29daf4710ec6c04742f1d2f898d818f1f012932c99ab51bb8c9746bd3ab5b18752218fd37dd09d4550f3d2b8ef59e9aa852a68a132366b1900"; + sha512.doc = "145aad6269324b04cbe79c159734ae30f3b13cd361250260ba374fba07c39af8a00974d0e47195dc4a1390a881936c443c671b1e09e8f905267baec3a60bc2f3"; + sha512.source = "49e25acd701cd657f41c5dc611b9fcf7342918f29f276eccbc584a88aaa0e0b777c5838e84f067924943bab3b22002fc94f4a5d8b977d2c64a09567ccbca0fbf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +ae = { + revision = 15878; + shortdesc = "Virtual fonts for T1 encoded CMR-fonts"; + stripPrefix = 0; + sha512.run = "6b1c57d5bd3f0959e611659f979ed42b81e397a182d09b3482e98865196077334a9796777aa112ff367b97c232859d4f9637730dcd2654e6232c577d2f59c39a"; + sha512.doc = "927521fb6b6a5787d0e94ad724cf19825b2cf2ce23333e60e13625a36390eaa4cbaa1bbe50dbc718efae97036d5d815860919f536601bb97224b489d20082953"; + sha512.source = "d82fc85014bb32147c9562482ac1d0ab1d1fbff8140441dafff032e24c3ee9e406c9872a93a66ef96a2f67a75f47c01e53565372a14d1bdece588f312c8f00fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +aeguill = { + revision = 15878; + shortdesc = "Add several kinds of guillemets to the ae fonts"; + stripPrefix = 0; + sha512.run = "b75f41c1d179b63d1807ebfa81e9e656bb43433a3291b9e29d5f0f76667868d26840dc6ce7f61f0f959cef724f0b5738b96af2a371f949daefc4179de1f861e8"; + sha512.doc = "8361fc02999b080f19beb793fb0d1d802203114c1e1581c312a21e3a682191470b93e373fc269f8aea0e2643a69c8caf80855597ff6a71aadb6bfc869f4370da"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +aesupp = { + revision = 58253; + shortdesc = "Special support for the ae character"; + stripPrefix = 0; + fontMaps = [ + "Map aesupp.map" + ]; + sha512.run = "7a42831624c30db319a81420e1142bf827f21daeb4719e1a179a63632586b1fb43709c17faef073eb67f27f1303b4f7db92a40425506f4d8e0bc6b456e4f6114"; + sha512.doc = "ece447f4c12da8509be155f2743ca52988f32ce62edb361a85fdcd7733bb401cf8ecbbc0fa6bbd7d1662593f1084aa89a29b2f1b822a765bc6f7e581b46bc153"; + sha512.source = "cb628c51f7f4d972f81b2e23495e7ac6e82e422c7e85ffcdd7c3cbb753b055178adb9ea386bb4b1f1f1c4d2cdc561eba27cd82c7ef33830db0cde9af99e7730f"; + hasRunfiles = true; + license = [ "gfl" "gpl3Plus" ]; + version = "1"; +}; +affilauthor = { + revision = 68996; + shortdesc = "Tag author and affiliation information in a key-value style"; + stripPrefix = 0; + sha512.run = "4aaae3ef6ba9dcfcafff4214c3c425a40518687fd01600266feb3ac1f836f6d1795fd1c2903f57cc3010b7bf5fb153876a4bbb83ac81576e6423589baeeeeaf8"; + sha512.doc = "24c28a1c6879c2a292a96fb10dace8d1dcfa2a1a71e07570a232ac70b70e4e9f10f7af823fb2b8d619dbf587e1f5cd9bc38e1a4e2fc6e22714e5deb27a0edbe1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +afm2pl = { + revision = 66186; + shortdesc = "convert AFM to TeX property list (.pl) metrics"; + sha512.run = "9ec87ccaff69c7467f803e4ce3f3408f8195cb93f571a7c7aa5f195d3de80b480b182831d239d8b2144dc72a5c26f9da58973075b6a939d23a51de0acdb1d199"; + sha512.doc = "e18ef6478d02676a3edc048ec1f8bc37e7cca97e62164632dbf02595a051e6d09d19ba8422c4a617523dccfe1a6ed55fc9be34d1c0ffc147bbfa4e5d8f2daf40"; + hasManpages = true; + hasRunfiles = true; +}; +afm2pl.binfiles = [ + "afm2pl" +]; +afparticle = { + revision = 35900; + shortdesc = "Typesetting articles for Archives of Forensic Psychology"; + stripPrefix = 0; + sha512.run = "958ed5cbce1dc7bfb5d01befe74de6236a09b3ae5246aa3f2e80225bc353abf21b622f4128641c54a27197560557738d4c224e160c0be87010517c3a30a729ae"; + sha512.doc = "d8185772e114a891ff5ce0f2a2e12b827420f8c486813d87bbb6fafc662ca1db710178e8cfa260d7d650c3432909b9f7a8521648f6aebd5f90daf1aec4e28d7d"; + sha512.source = "f12b5a10b929d78c728331704ee83e726bc28562b8179adc2d9e7324b6b742100319078f5ebe8371a34927ae1fecac4779b9442076a95cae1d66e015f235d440"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +afthesis = { + revision = 15878; + shortdesc = "Air Force Institute of Technology thesis class"; + stripPrefix = 0; + sha512.run = "0ed83c0a98bdade60c49b3408053e020c6deba1b96d74b47aa2404c778a96ce2898af1d76892704524c0c069128e59c0bee5af73de6ff9237624600b991ed6b5"; + sha512.doc = "c221f77700f974f0cedeb4f8ecca5280c04203e9cd89042d414eb54037db71cceed450477fe9498a15d9f09b8a0cffa177cc897958594fa7e3952adbd85225a8"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.7"; +}; +aguplus = { + revision = 17156; + shortdesc = "Styles for American Geophysical Union"; + stripPrefix = 0; + sha512.run = "73bd9b7f01a4911fb25aa7d388c5827c62a01a786ece4317f5b702de4c281bd05f82568780f4396bf289fcbb348abd2a3eca6620fd8e3f801d23aff7a05e104e"; + sha512.doc = "48b9c010f746b8a85bbf1093b3dd39c2a853d74b20feb71bfebf2ded8d6f4c44538e6e20b24c65849e8adea9d34ff15498e847b1521bfca11d18fc23d18e10f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6b"; +}; +aiaa = { + revision = 15878; + shortdesc = "Typeset AIAA conference papers"; + stripPrefix = 0; + sha512.run = "9a5c04cc0b24e2b11e4b6953ceed9e506ad9f44922b3407c3aed1f5fd1fda1e86b1a5d6613a059065c1026f69830a8f5af0ed21ad8e1856ab44d22985768f24a"; + sha512.doc = "cd69337eb21eaeff910696f153bc97fca94afa0b147e3360477f72c5d90afa5d54d375b5eb7801df1b988c8f11d8fd23848a07f013a4e06c28a013248e00599b"; + sha512.source = "e9542fb3cb5a16a565bb5c349f15b453ccb4c81570425a5825f0f952816ec27edad65ee670bed9069dd0c1c8762b5becf6300ad551b15bc5adff960f73354588"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +aichej = { + revision = 15878; + shortdesc = "Bibliography style file for the AIChE Journal"; + stripPrefix = 0; + sha512.run = "7edc0ca36209f18dcca0b794c7ee712f0eba82e3e69b09fd46fdc7ede6bd33e93d4936d7bfcff88fe4f699acd04493053a7c76cabb87670215efaae12aaabc83"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ajl = { + revision = 34016; + shortdesc = "BibTeX style for AJL"; + stripPrefix = 0; + sha512.run = "083a549d425336eceee0ab8e85ef592aa15983e9a4dcf2264d835b5242933fed8719b81b427fcf7784b38b8e0b3dac2e2a7f8b9ffd10cf2690b96bf8b586ff3d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +akktex = { + revision = 26055; + shortdesc = "A collection of packages and classes"; + stripPrefix = 0; + sha512.run = "481502410094aedb36f00dc93ff3cad9479e756b00c60abdd7da98713f273cf45a314ccb55ef2436dc54cf7e8f84e2bf9fc5f00974c9978aebacee177380c9a5"; + sha512.doc = "4378f1e2c96bab5f5926b22863580dc2ae555400d770f5875eff09b8f915da4c83e99679fa7487f788970d17537123d854400e31bfca868d693b3d950c33051b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.2"; +}; +akletter = { + revision = 15878; + shortdesc = "Comprehensive letter support"; + stripPrefix = 0; + sha512.run = "fc0702fce74b32b04ce2b1e03960a7617c84a89d4581f16bbbe1b16fc01d45300c0a46682460d78cc572b6e20cc42ec7701c5067adf5e4960ed1bdfd5a69e910"; + sha512.doc = "6a951bf2ad4a7af4a6c87b24e8f4c3b4ff520430024a6abe6b54cf56269a903d78e591def71ce7cac832a4d3f822e8baa14f8decc960b455688801f406d01e74"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5i"; +}; +akshar = { + revision = 56277; + shortdesc = "Support for syllables in the Devanagari script"; + stripPrefix = 0; + sha512.run = "d626d6e3a72fb8319f07c56d200566fc351be15acbbdc0ded7c3abb9765ce257741458109203882e8fa6131ba182539fd04e1ccffa0a25cbdcbe6f7630d3bfb4"; + sha512.doc = "2dc5f4de3807a8e2c7a81046fb5d9dd92a651ef86aa22bd47c68d7b9a75943537284faa2d95d89b013573dfaca2d8d96e53524cb916152e46fac067532b108dd"; + sha512.source = "9095a3c6889eb8de55c5956157a5dfc3e885e93b70ee6285b2ac14d4fcb244e65a11bea2476ad2d35b6add316423897bf8fa15e30e99b6d8d3d3d3cc65b20f31"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +albatross = { + revision = 69879; + shortdesc = "Find fonts that contain a given glyph"; + sha512.run = "6bb925eff84c6d3fc3ab1b81ae50cf5fcafbc8dcadd5ae6076bc1280c427ed03896e8dcc5ccefe05e911b513a5da470312128c488a694c602a2cd9b3a94148b2"; + sha512.doc = "d78c18b44d3eb60d6e991df864aeafd97366023aac7a732bbf7c67d0d677a76e0a89fadfba515cdfae1f1f7705323413bfd27100a3c09dbefa41918c3e29fd57"; + hasManpages = true; + sha512.source = "49ef73f529b8484def315efb0f9bef230697f532fd8138b42404ab5e98a880ea3d7e4ab660a9b3e83be73690f0a762ca09b1b9c964f9d461a0022853006d76be"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "bsd3" ]; + version = "0.5.1"; +}; +albatross.binfiles = [ + "albatross" +]; +alchemist = { + revision = 66924; + shortdesc = "Typeset alchemist and astrological symbols"; + stripPrefix = 0; + sha512.run = "3e4c4902c70deb8f380d3ff5e1a621f595ea1dc47cde3579bcfc12bd0a066d5d1d6773ffb1d1f98aef336c8cfdbe7770e1d48f5b89fabb98308f54df5dc75fcf"; + sha512.doc = "cb978dd26bb9b95a29f6ced2ed4891f27fd0646daf560316dc1b20827a7af454fca1b6500bd4bd5c723c4fc6a24b77d6d7c7a6eafb3edc99e2098b11e4f53029"; + hasRunfiles = true; + license = [ "gpl1Only" "lppl13c" ]; + version = "1.00"; +}; +alegreya = { + revision = 64384; + shortdesc = "Alegreya fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map Alegreya.map" + ]; + sha512.run = "2bd5aa12890cecfa42b119f456ea63bf8b8f64edc4e2c55ed738cd24a80527245b0219330e1dc89e0a10e8ca17bb17ba928056ebf69955f2481d468a5cf97104"; + sha512.doc = "dcff5d4a47c3649155a79659012aa07123e5108b85804da9c1697d1f93d7b336ef7e37e1272c8e2e8f283971bfbfebc2e0cd2ebae3ff8ee69531629635ed7d74"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +aleph = { + revision = 66203; + shortdesc = "Extended TeX"; + deps = [ + "cm" + "hyphen-base" + "knuth-lib" + "lambda" + "latex" + "plain" + ]; + formats = [ + { + name = "aleph"; + engine = "aleph"; + options = "*aleph.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "326c0c2327ec391a2e6caa5b7bed74af44be58df05b58dd2d2ed68ac96151282f63cc51dcfad7b84f3fa716b9df1d9fe97e27e4ebefe81d40a1e0ddf06be48e4"; + sha512.doc = "33dbdb3fc2ed1cb698b1b3a1826771475b27e33c19ab102b5f0f403f670abd10330dbdb4223d9f5b96cff001a14dc8d25ecc9a084a612b9db8a1cc6a70bec090"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +aleph.binfiles = [ + "aleph" +]; +alertmessage = { + revision = 38055; + shortdesc = "Alert messages for LaTeX"; + stripPrefix = 0; + sha512.run = "df06377244dbd962326646fcd0aad535733d275ff6a86bed3739e8b77c6d1231290c4628a98be50d92e9006f25be68c20d5fc5e92c82a6cf841c0af5670f7ca9"; + sha512.doc = "412cecb146790ed0b7fae601d9ef0eb14381cf75ed20ff1bab3190c249750fb693708c2dce26e76da370a265f99dd312dc6747b6c9e7de62ef51a709accf7e60"; + sha512.source = "c670adb01cc2e1dfa0997f6faef9a0d0b31ad2c6329174597b781580f02ba5dfffa7afb4538e0e740271d7f9f70b48a1caab91cadf8282d89a3f9a35c8ae8897"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +alfaslabone = { + revision = 57452; + shortdesc = "The Alfa Slab One font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map AlphaSlabOne.map" + ]; + sha512.run = "b958ac7987363fcefa3d8b7016f13851b91446a2a252e9561fd1a15df78b867b928f3e45a6fa1556abffa0de03b2b70543266ef9627b7474167c5672ac98d9ed"; + sha512.doc = "375ca21d23599fe365f53f461264351982340d151ebdd2ce143189d8fd3c22d191501520d571f207a1f956f433ae6491e171c7ebb3c9c5421e30b358cc79f9fa"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.0.1"; +}; +alg = { + revision = 15878; + shortdesc = "LaTeX environments for typesetting algorithms"; + stripPrefix = 0; + sha512.run = "923f36ab03aa10cf3da008f4b3d7ba5919f3e4a512c82fd1c42386df22019ca70c4c1700b7596750a00ea7c50586bdb803db3fee22edfbc402ebb9e249668e99"; + sha512.doc = "d94795e7513612f3eb102b85b9fdcc792b175411fd67edd6779037b1e0dc101378159f58c6c6feb82ca6b73ea2a6fd415a36e4a4ea67913a0d1110582a41e38d"; + sha512.source = "a8231edf9c10855b312bb00f2bf37b68ada65b876ab621f459b3ee12da5bc5b90080ab6eff5c3a48c0821753a02576aac0100b3a577cfb7c5dc2cd4b47c8a026"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +algobox = { + revision = 67201; + shortdesc = "Typeset Algobox programs"; + stripPrefix = 0; + sha512.run = "42192835e3dd2aedf96ae3602b3009af09512425cad0ee3dc859a972ea5b8ec46bbed35456b17f0ff7a31faead6df06c01734211bb0f206eba80fb05e66d2663"; + sha512.doc = "5d5de2d91d0a5cbc63774259934fcb8b772eec36e9841d8f9e5d813e5f40cdce3171409b131ca788fb2b6eee651caa311128fa075eb22c969d2456b1e54708b3"; + sha512.source = "019badab6a259e9e41ad21d81b53231fc9fd12f87c8b980610dc5a4d60fd7c1201d9f45d71d46dd3b583df1ae8725fe0b183c4ed0b4a35e849bb5d0281a6d31f"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.3"; +}; +algolrevived = { + revision = 56864; + shortdesc = "A revival of Frutiger's Algol alphabet"; + stripPrefix = 0; + fontMaps = [ + "Map AlgolRevived.map" + ]; + sha512.run = "bb038512d7ade0cf90217150d276d8ed7fb4279b8a3088bcb38dfe8f48373e8957909f5fdfdd2f6247682623414f04e732262a393cc0042279705ceb345cd608"; + sha512.doc = "c42976e8fe3d53240de84845a0c4428363868629b5137a57863b5fc922ed8f557e2e4451446277cead1dba0dff036e843e5ead35e6e591a04f2edeb640c7932c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.052"; +}; +algorithm2e = { + revision = 44846; + shortdesc = "Floating algorithm environment with algorithmic keywords"; + stripPrefix = 0; + sha512.run = "0203f337518811a04f255a1ea65045f487dbb4813fb848e0ba1b52d3e5fba96b784852d7e900a82f4c047c2943098e3b37cbca27322d115c341fef6d262c60cf"; + sha512.doc = "ae737056adb53f943ae8c92d8e7bfffe52a107cca4a7a3151932a581744f1396f43e134a55e9894de0ae1fb5418983ba4643e1e07487b690478a6979555d8768"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.2"; +}; +algorithmicx = { + revision = 15878; + shortdesc = "The algorithmic style you always wanted"; + stripPrefix = 0; + sha512.run = "b6cccb7bc391ad11a8996d3e6a3a48f79e50e3e685a4b7670a3399d5d400435616794100b38e73d32633fc16cdd1795c2dcd57bc79279266dc6509bb14d08804"; + sha512.doc = "cda9c4082faeaaf504194d75c014fda9cda20fe85ab9dd8c4f5a3c9e39fc2c8c8428ef20b921790f36c8abae2ecd8ea089353db540477909039575bc65ed5228"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +algorithms = { + revision = 42428; + shortdesc = "A suite of tools for typesetting algorithms in pseudo-code"; + stripPrefix = 0; + sha512.run = "ba02581f18b74ef97f37b7c1052bb7577b256ef94232b045a43c841fc4705f8d7ebcb2b286d95dd70943d309080b05d36dbf847ecd6e661038d6e375d514a787"; + sha512.doc = "3658a5a31162acf5ea1dc318503a2f9e74944cb998494083de76e2e31119bbc22094bfd41e048f5628730df359d2359943cec3cebd07b364a81703b92520dd01"; + sha512.source = "d83acd2275e83d37b5bb9a24d9cb0efbf711a2fb76a9a5a18d7299c95d6e1e0ac8fb41990b795a21b23b5e4fd8de5ef08fa480c6b2eaa7d1f7644e0d44c2f1fa"; + hasRunfiles = true; + license = [ "lgpl21" ]; + version = "0.1"; +}; +algpseudocodex = { + revision = 66924; + shortdesc = "Package for typesetting pseudocode"; + stripPrefix = 0; + sha512.run = "0a8b2e49f389066575d403eced31e57cba4af96619bb2ad09bfe51054193d3033705736ea23233b8da3e5e9e0714aa26c4132c2227fa36cdbdeb7df50035aec4"; + sha512.doc = "5ebf9cb1c66d4e4987387958758aa5d174002409759a38075f6c32e2418f0db670445d2b9d61442c5fe719154d137e3156c6871063eae7e5c4b50593022af623"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +algxpar = { + revision = 67495; + shortdesc = "Support multiple lines of pseudocode"; + stripPrefix = 0; + sha512.run = "3ea0ccb08a088e16c3fd47f5455ec1c3980d242c4f9db838ad07dad089326bead01c03708fe25fe3a14ab3abfdee93c864d1c633f5e0fe043b31962ca1dfe462"; + sha512.doc = "196b2539e23d96f2f7967272d59243af9eabfd588c8ad4cf69174493084f5f3af0c088e3e5ee51df96a6a5de02a7d3a84f7f4f7b3f0cfec0fa4463fb929055ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.99"; +}; +aligned-overset = { + revision = 47290; + shortdesc = "Fix alignment at \overset or \underset"; + stripPrefix = 0; + sha512.run = "3998cd5515ad43e559da91bd1f25b835743299ec13fcf22ee9cb3aadc44c285f428ee701f5b27141c4d03c97b31a31e8620a2911854a1781ee5543a99073fed4"; + sha512.doc = "d44ff38fe36352e1498e12eb56652e935cfeeb9ce6af5711bebe7844b1b7ba16864c8dac3c3b5f2e2bd6fee86de38c7555d5796940b834ce1ad396f5d2cb536e"; + sha512.source = "56584744fe5700505608c6ced57fed83fa189c9e755b63521f466f40e1080a35032b007831316e4b080cf93ef36958873924246a4cdfe2b0f129effda75380b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +alkalami = { + revision = 44497; + shortdesc = "A font for Arabic-based writing systems in Nigeria and Niger"; + stripPrefix = 0; + sha512.run = "57d8a09d5643536cb2341cfd7bd84f24f101ebd73ef1456a39fa8557fc81bb6bddfb58990c38d4da229da5c6ccba0b4d956d82f7d07d65c57a87c749ba3ef841"; + sha512.doc = "c9ebe4fc7bbcb254e0fa0f027e93680be2d1690cded2d9b18f3da091544b05f5dcf38b87400f8c5b8d4dd9ec320379c752615fea99d010a118bf35f4693c704a"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.000"; +}; +allrunes = { + revision = 42221; + shortdesc = "Fonts and LaTeX package for almost all runes"; + stripPrefix = 0; + fontMaps = [ + "MixedMap allrunes.map" + ]; + sha512.run = "d05513d484f11a9fcb5d202d02e7ea586cc82c44abe0488294e58c6f31185b083026bad3f17186ff03456481200e05e2ec4a7a7348f6b8fa4e952702b15274eb"; + sha512.doc = "569f61370178f2517ea4d4625209a1359cd56913073344816f4fa8aa19edc8bc63c073de4373adb0a0a8c8d45fe392da9869bd16bd7477da65d5b0decfe6de61"; + sha512.source = "9765fe328824806dd96ca1a0e9678ba385eb61acf95d8447213492843f908de65209022d76303be816ee1c500e95aeb35280f3377369315a87752a0c4478feb5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.1"; +}; +almendra = { + revision = 64539; + shortdesc = "Almendra fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map almendra.map" + ]; + sha512.run = "9bfdffc9a634df297dc9b5c406c0681ad78b81619900126110b978bc5a7a2ec0f91a1e351100281c794972d87f33c7088725f55928e120a743001080887ad4b3"; + sha512.doc = "477d5d068353d06e591af13e7e970cccd3d5229765f89150e4d9bb5f1de2b0283e4212bc475fdd6771f4e33f046a3e64dd4ca794c3691af95f7e36f77c7eed76"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +almfixed = { + revision = 35065; + shortdesc = "Arabic-Latin Modern Fixed extends TeX-Gyre Latin Modern Mono 10 Regular to full Arabic Unicode support"; + stripPrefix = 0; + sha512.run = "1a5e41cac48a33c4336fe03576c49165b47a0bec606b0a15a3563922b964a9a3c2de735cd88cf10423b054b5131193441fbcd64fb2edc47d4944ff33cf6367ef"; + sha512.doc = "f51af6e63070fbf94a3f8ed756d544dc7d9460f37b016fcded0d2c56a6cf672d2e60c7b2cb8be9f9942f43e46b5ff2bfb59c6ae301a5d88a8858d6e60a3fbaa9"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "0.92"; +}; +alnumsec = { + revision = 15878; + shortdesc = "Alphanumeric section numbering"; + stripPrefix = 0; + sha512.run = "d61adf9c03ef9f0b5d68325b435d5145297d85fa04a5bf106de50f58c04c9507eb63fb17070e955e7f476158419a802f0f18d2cd97ca93baa7997c2d57def479"; + sha512.doc = "ab07f751332fa0ad974e6ea84b10a0249e5bbb69e591d1319a8c5d743f88d63ad9a7c72fc08fbac95e3cf950d090313dd758ed8f604e209206f873c5f0f70880"; + sha512.source = "2c978d1dc9dc7f6a0f91d90102a37a2c8bdb78a19d7211d179b04ea448bb56baa451e09f945daaf3f219187d39f5938a7c003988fbc905b692931c9cffe465ee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +alpha-persian = { + revision = 66115; + shortdesc = "Persian version of alpha.bst"; + stripPrefix = 0; + sha512.run = "dc0344deccdbdac04c5a798a52785e913d6da3997b907a07894f86b1b3ed12640a870eabec3bf5916f9835a8a405ae4c692bfb70a63022cf8b52db0c2c3e1382"; + sha512.doc = "a5881df317b723fff5e00a89706584d05d650971a4bd88d3e3f71df1e7dc021289f9737d1d5239d6196be29307599c3bc1ff782c190032dbea9bea0140547866"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +alphalph = { + revision = 53087; + shortdesc = "Convert numbers to letters"; + stripPrefix = 0; + sha512.run = "de17ab4278afc9fb308abc23c19d4d1ce117ef3b66a21b748c102b95722d3395016682e9508e135e2b01bf4ff274964df0fb723ba2f92c81873dd58d73a3a733"; + sha512.doc = "a098159842a9bd47e6da930af94cf365629c72f539fc3d045fb33b4bbe2004468fc690564850b67549b3eeb2265134c92aecef65b47d16da732bcc5aa93d26dd"; + sha512.source = "34e3c847a63de5a6e6dbea406e79fe0715a46c746f7113a5e8651838499c1d8b0a636c0bf138a1030c957e2e7cd17f848bf2285109642686f56ef95d18354717"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6"; +}; +alterqcm = { + revision = 59265; + shortdesc = "Multiple choice questionnaires in two column tables"; + stripPrefix = 0; + sha512.run = "6af82517cdbc64453b7e546afe4886ba6816d44492ca4fce9cec98035166b45bc432503db0c09c44e2e41f3bf8cf18c33a37199025a6f09dce6fdd2849973fcd"; + sha512.doc = "f16c2591c79aa8d9f98f36c613617b3068495f814db73bc330d11f6a52b4a6b394a663040de328e6251f16d21acf683adb6cc80a5ce6524c09fac8397439f8b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.42c"; +}; +altfont = { + revision = 15878; + shortdesc = "Alternative font handling in LaTeX"; + stripPrefix = 0; + sha512.run = "18212e7107ed2bb6718a7c763d881dff7859e55e5bb33c42e1acfb5ea21228d1ebbdc6e13cb95f041bac99f871306bd3227326953229e69ac6b8ea774434cbd6"; + sha512.doc = "4d181a21f732b0265d4251d3775fdd8a4305c99c0dc1610adc9af583f73e376cce249b2ef237d8027aa32a269512db71260aebe78e5e1619f506f23d1105dc65"; + sha512.source = "f6982a69cb4264c633f8174fd8d487896db88e7d849c074c90645a84e7bc4abb1c1e6adf28500d300a74cdd26dc20b62efc013ff9e080df2bbe9a823ad0112f1"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +altsubsup = { + revision = 62738; + shortdesc = "Subscripts and superscripts with square brackets"; + stripPrefix = 0; + sha512.run = "a3e168d93d3d7c2343a539329f8c7ace39f376e0008726affc77630e3d4032cdadc5c301cc15f94d92be4b98cf00bc2c95f29225fcd1def7bb66fd91c0db9c65"; + sha512.doc = "e96020ae0cf52a851885326068d10210bc18d68df8047ecb84e40659015734c352c08a8d4f202aa3970b699131c032e36350a9c2ec4254e0f000e49b0029f3d4"; + sha512.source = "eb79caa298cd000f6cb9e1c272b2abf788d7e5469bbcbba22bcb48e8b7e7c1f7774ceb9478aeb3588ec69280c5069f1b0c8c207918d44c772f32b558abcae35e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +amiri = { + revision = 65191; + shortdesc = "A classical Arabic typeface, Naskh style"; + stripPrefix = 0; + sha512.run = "ee2a1598a4040a069cfdaa275793b34bd8c899f65e888f41bec55fef53fae6312e3b9ad1a3dc024aaff1df22f735e0e633a1524b54d7ead9ff482ccc829e8aba"; + sha512.doc = "8f50fd9ff492cec24fba7a321a4fdc25d5b427eac31609adbc9fba6a0bcaae8ed895aa6cc860a66106e22ae21dbe9984f9e37f4bc2451f77f5d89ea10d0f5e0a"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.000"; +}; +amiweb2c-guide = { + revision = 56878; + shortdesc = "How to install AmiWeb2c"; + stripPrefix = 0; + sha512.run = "1ffd4d1691abe2543585fa950d9b18ebb10e48c5c7d97e2f05828f04620bfd730894cd92f0df507627ddd9451a253ed8bbe89c07306b6db27ba84bd6c24910ea"; + sha512.doc = "d8f6ab658d8d8f2e05876ce27b5220eb2e10a58775cde91f975cdd106708ddef86781cc1c004b4381176fa7ee8ee6630a34bf7cacec374bf21ffe5e06c8d4d68"; + license = [ "lppl13c" ]; + version = "1.0"; +}; +amnestyreport = { + revision = 69439; + shortdesc = "A LaTeX class for Amnesty International"; + stripPrefix = 0; + sha512.run = "9fb76037c976d48259609295b876a256e5b72e611c7ece52cbc39b7df607d58a90ce2b0a0ff33d816c08f869e911a2cf979b8635a044697af8331d8769382be5"; + sha512.doc = "e3a3989cd630e3776bfc103d5ebd7fcdd39464e49338b638b165e1c486a7afb58ebc907e2fcaaf008be5463f3496e66aa36b0bebea87d1d945a0497469f36eb5"; + sha512.source = "bacce1f1ab7f2c6220c1fb59ecd63a4dc93405e57654390f377c5b6b511a5f732198e869b955211a752e94aa8c1601c4ea13d3d0aea7324a3ae38e035ff3e43e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +amsaddr = { + revision = 64357; + shortdesc = "Alter the position of affiliations in amsart"; + stripPrefix = 0; + sha512.run = "9452effac79a430126a8060827c603c8ce9ce441b187d2fff740a7e8f013727ac4187fa1c148d430ee17fbc1709b8e8f89465b2403ed070d0517304dd7f8aaad"; + sha512.doc = "2d501a1adb6fff4f16f0d3f44e6911ccef824cbdfb9e9a61582a00d61d1e92d03fe93f7fe6d4f87eb2575422407e634dc7e543c1ab05a744014f4d3bdd68e3c8"; + sha512.source = "473c8d5289ff0f780956d298cc1527d5abc157a442191f3a321c30ca0d8cc11808c609c71fa50c996d5354534e5b5a16c154cf870a2fbae8120b026d5c8713dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +amscdx = { + revision = 51532; + shortdesc = "Enhanced commutative diagrams"; + stripPrefix = 0; + sha512.run = "6bdebfbe4985eea23ce24db5e0e14162310d81efab18a7a820fe819bd51f839b9deca35b94740f038ae80084f355e5e800fd6e681d859cb7bc9bb8886993c33e"; + sha512.doc = "65d6ea09c1bec56e5082d3521e1eabdd513013b0606f6cfbd0f7c7566795b8963dab6e9f3a46cbb6d008311e7ee3701efa345ef5dc780a3b18f6f4842d97594e"; + sha512.source = "94751d2c3f617710b50807de584cf4c4d7c8f1ff82a1ab14a5bbd8b41fb5828b0a208e20c131a0aa023a1c8afcdc3d4b5e36b2df99f76b260ec2d9509a941f76"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2x"; +}; +amscls = { + revision = 55378; + shortdesc = "AMS document classes for LaTeX"; + stripPrefix = 0; + sha512.run = "eb39dc97a860047d764884663a1f541aa95a2d559dd55cb25f6b7c6c46617e6c33fe55a9fdc37b211c613333911df6e260768f43ae9630a208ecc7fb774891e5"; + sha512.doc = "c2e563bd239f36b0db3bdbfe1ccb4a0adec0c22af25b557ed748897a99672f05f36f2bba6e51827c6fdd60b351079809b15c0367d075566c5e48682c23108fe2"; + sha512.source = "7a96a464f9826a515191174b6e33016c7161c7547ed70ca78cac256cac68b4340a2b3bd9608f79df106c3eb2383b8d6895012a2cc6dee0c76d53d116679f4c6b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.20.6"; +}; +amscls-doc = { + revision = 46110; + shortdesc = "User documentation for AMS document classes"; + stripPrefix = 0; + sha512.run = "132432f34812f009233392ea29d6c4145717a80ea305632687da30de6969dcef8af9c2aa88cbf1809dd34b0c3dfca0f40a52b6216a7370f2a225b2602d0bbaf3"; + sha512.doc = "8c08813abf65f00b68441d1e5cad3eb4a16fc1a77b30e10d96e22f34d6af547804af4d47b62ef0dfc895e2bc7cc5ecf7bc08d912448fefefbf716430c4502a64"; + license = [ "lppl13c" ]; +}; +amsfonts = { + revision = 61937; + shortdesc = "TeX fonts from the American Mathematical Society"; + stripPrefix = 0; + fontMaps = [ + "Map euler.map" + "MixedMap cm.map" + "MixedMap cmextra.map" + "MixedMap cyrillic.map" + "MixedMap latxfont.map" + "MixedMap symbols.map" + ]; + sha512.run = "6a9f80bc8b6b2afc3ff6ad151a290743d37e10ddeaf7efa969f3fec40cab0492860496c7bf0abeb410124aeaaa15a53640017c8d12b630e68c59dfe186519e52"; + sha512.doc = "fe0917bf9d65d15155f287626edb17d692db7ef2e888fce30b867bb0c873b0166949b3b5f3965f70b6b237d7b874a7fd3411e53b87368acc7447dc0e8bda55f1"; + sha512.source = "4145ce58620f84133e8d7a7639fe376631c92398161283c69c9d1119c14e4d404ed067f2aff2fab7cc0c2249d1fcdea81591b45a1cc72bc08835b99ac8a5a6f7"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "3.04"; +}; +amslatex-primer = { + revision = 28980; + shortdesc = "Getting up and running with AMS-LaTeX"; + stripPrefix = 0; + sha512.run = "05c7c19430a85986db770d1ff8686993edcde35171e3653ddfb7db4a09422c80e53632f583371079fe14d3c6fd9ff4eb3f0c37cbecea7ca2d9a5aefb04cabdb0"; + sha512.doc = "85faf2a9c03f7d7d1e23d72b7041c9b322d5f8bd8cb309a60f7256416249ceb7582c112d25f8953ee67dd2b79a3697e29cf6250d7b199a9eb73a9682f123354f"; + license = [ "lppl13c" ]; + version = "2.3"; +}; +amsldoc-it = { + revision = 45662; + shortdesc = "Italian translation of amsldoc"; + stripPrefix = 0; + sha512.run = "9178b17bedc53957118083a78ead56f9fdaf9fd6a60ea0ebdbeee6c87254e7567b47b61bad1f9bda2554f471f79c28f3df7c3d2b9858faad65c3d110664ec4c8"; + sha512.doc = "eb23cb624c4cf6283b8f777911d102953d31dc8da04392d7023694fed02ee1b8a8a49365fe0f1cba9682e911405f04afc982b6cc9cf9699a4d76ec8dca6a471c"; +}; +amsldoc-vn = { + revision = 21855; + shortdesc = "Vietnamese translation of AMSLaTeX documentation"; + stripPrefix = 0; + sha512.run = "5b0c2cc1afcc4060249be20271af92c71c866db47d2551a176b5685c58182a6ca17da9540dd9a7c7abd33de75b0335a625aa921fdbd77329bc91d16718fb346a"; + sha512.doc = "827c294eb1cedd51a3924796b461ec3d6c858e7875254e0fdb6cb496fecbb6d2ec541e930327c54cc446b15dd69ed795470ae6cbf1cf1e51c0f3ae90f3f6c12f"; + license = [ "lppl13c" ]; + version = "2.0"; +}; +amsmath = { + revision = 68720; + shortdesc = "AMS mathematical facilities for LaTeX"; + stripPrefix = 0; + sha512.run = "39e87ac8255c577fa8b1c0cd155d4fa21bd0c0f789141e6d1e75cad1c34a78bf5fa44277342ae9d93d80f4f88f31ca9f88dba9c592ceba04961e601e3e8e9650"; + sha512.doc = "b1dff0cb1c09a184dfe9dd890ccb6e9e5bd5d2b109ce0b98336ca4cc1a45d4f398eb7822d02e9210c611c98a49fe41884b103e1b1e4f7c6b3b29b4de5be2ebf0"; + sha512.source = "c1d052395b6f6291a269d610f713ce01383940685af91b1c2dd711b73f5d765e801524a538687d7f8cde055bb1dda9ca11900e4e8b58182b3cd792fdfbaca6be"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +amsmath-it = { + revision = 22930; + shortdesc = "Italian translations of some old amsmath documents"; + stripPrefix = 0; + sha512.run = "6bc869e3cf11a9521ff883e9b8cd227a267d28291124c0f268556ea576bc0af8ea4eaa145e45d1de84709df08182fc83946d80fd0f116a8656a35d75ca83eef5"; + sha512.doc = "814539a2a82601c930097113a9baca5166fcf68d1b0c4dcf25d8afa8991e667619517879bc415ff114b9e86664b9ff5e25a7bcf1bb04160b9297cbfabb4a639d"; + license = [ "lppl13c" ]; +}; +amsrefs = { + revision = 61937; + shortdesc = "A LaTeX-based replacement for BibTeX"; + stripPrefix = 0; + sha512.run = "01416fea668e3717b14086199280582d7547cc7c555e19d2f88b7ee94dfb6863719375a140feaa5ecf7461c6d6c6f0ef52bffb544ff132b34771f11556ecdf09"; + sha512.doc = "b704ccb7bf8a49c141277b240e08ed7d22c71bdb91d625997a726b25ffb2e8f494637cd9ac7cee031f9b45476006441190ba95331e32c4ad3af4e25ecdcc6f6e"; + sha512.source = "81b8aa65cc79f08133a6390915ed7753db3439448b608ce04330e23c849f876ff2242403b9bb3e08b9642cb0362732adbcefcab9640e75260548dce3938baa25"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +amstex = { + revision = 67930; + shortdesc = "American Mathematical Society plain TeX macros"; + deps = [ + "amsfonts" + "cm" + "hyphen-base" + "knuth-lib" + "pdftex" + "plain" + "tex" + ]; + formats = [ + { + name = "amstex"; + engine = "pdftex"; + options = "-translate-file=cp227.tcx *amstex.ini"; + fmttriggers = [ "amsfonts" "cm" "hyphen-base" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "4f380f6c67b3c92d4be1b3a9ddec3b464e91ccc632762d6bf28f47dabf6e2e096471dd64804deb370349fe14ddffc3b4d37be195cb63f87e47a2345ebbdbd7fb"; + sha512.doc = "94b3f6ac9f2314cf5e3335ea517bd23e0c08ef10e5edcc032bc5907fb69b04525ad434eb896ef8d5b149033148da55703039d5481242c2f5bf791c1b32c85388"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01"; +}; +amstex.binfiles = [ + "amstex" +]; +amsthdoc-it = { + revision = 45662; + shortdesc = "Italian translation of amsthdoc: Using the amsthm package"; + stripPrefix = 0; + sha512.run = "17631e2d6306887236f11eed586454a784f256c36c14955be1eb30377f1f73b189686b37ba6c95188fda2e0b0aac9a1f40469a32bc7787b5d4c244de9a01ccdf"; + sha512.doc = "2d35f87da43f957d7ec3d1e61d052d14b4dc207207fc2e6dc4de08b699e5211db17a84f0305888294ae163691e4dee2d067fb1c3a29fadcc34214033fe8e22eb"; +}; +andika = { + revision = 64540; + shortdesc = "andika fonts with support for all LaTeX engines"; + stripPrefix = 0; + fontMaps = [ + "Map andika.map" + ]; + sha512.run = "4da9904459345033aa87deeb0019c8c4a39fbafcd59d973717ed2c4a410ece528944c69669b6a5ecf6ef8bb790f60bba909468e001485c405e7cf8775b7533e5"; + sha512.doc = "50684857dc25ad942aff18eedec04c9e27e4e408f748c208f8527c5096e600d26769ec6f82e2f02e72ab472dfb662f12bb009156293a12daa2dc0676d63ed446"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "6.101"; +}; +animate = { + revision = 67401; + shortdesc = "Create PDF and SVG animations from graphics files and inline graphics"; + stripPrefix = 0; + sha512.run = "dabe8762a0329d46ca8987621a59c38183e713c1c257e2cfcd2bbe36bd49bb7cf23b3e75e421f4bf023db2558bb9503d550efa882d77b229114649a15ffcafbc"; + sha512.doc = "857f611cfccc96ed1ae63f47128e9b7b4240428f86ebfdb6f2b79c5f0c76858e7a917321330d841059be02c3d7ef45036f0a2ed441e27abfe68ccbaa61568607"; + sha512.source = "d0b799be895882ba64d200f4c77d8794212fecce55b8c65e874b77587ed4bc186930f9abf1f662d0c7c7e8383f34afc3679f11679d22c035539d93b8dcd19e7b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +annee-scolaire = { + revision = 55988; + shortdesc = "Automatically typeset the academic year (French way)"; + stripPrefix = 0; + sha512.run = "73158727d9c5da0b28fe71661c72a8d1faa705034be8cd10ae36abc266240958cdf0dac962926a96ce445be187016d8440b7aded3129de6fff814ceb6366beb6"; + sha512.doc = "3e02616de1f5d55837511eb2b1edaa571b6686192433941e1412d812588fede1eb8a8d160b724d1fb8ef8f369cbecd401d1bcd09d4692a79b182ce5bccfb6021"; + sha512.source = "2e0e2a08820a7826fc6e58dc97ee9587818bdd62d0eb046982dd1f8a676df705e5bb87cfaabf7e260089d71ede1f597b0afd92b69616c0047d64983d919da50c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +annotate = { + revision = 52824; + shortdesc = "A bibliography style with annotations"; + stripPrefix = 0; + sha512.run = "bd31306b72bec73d4a2367fda6804e648ade536181d7a5c34d196591bb5fbd483f13a1e4aa2c28d3a4f29d0c74d37d5f1a77046b15d321c29176d9f742e91a72"; + hasRunfiles = true; + license = [ "free" ]; +}; +annotate-equations = { + revision = 67044; + shortdesc = "Easily annotate math equations using TikZ"; + stripPrefix = 0; + sha512.run = "4d4f64f6346eaee14dfe509857d2a592da825eed9ccaaa1a9c2cbf3a4d4f750441392d703c9c9665c88316125bc37192c0d6869f3e2f5274e7f80699f8c553c6"; + sha512.doc = "9f958eafc15d7de177a3ea66c0e381ec76480845647af0969e34b7429f3543c51de33dff58d2a4faf10bba82eb8f3de097d3324955b1842806fc69e8cc6b200f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2.2"; +}; +anonchap = { + revision = 17049; + shortdesc = "Make chapters be typeset like sections"; + stripPrefix = 0; + sha512.run = "4b84d5260c0986191fb4f2b560c386a806c8f93c76360a8d93aa7f9b55dcf089d7d03ca946143b52923130ee751fd47f1ff59908314297fd752ff5fbb17ec0cf"; + sha512.doc = "087db509e1d9649176614296f84fefe9b726dceb3ac8cb6eeecdd8a6fdb03dc97433c31478638eeb6f5f7cde85b8a8a693fce55ed0b3f5aae35a075a43e5652c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +anonymous-acm = { + revision = 55121; + shortdesc = "Typeset anonymous versions for ACM articles"; + stripPrefix = 0; + sha512.run = "6899f18cd8422c1671b74a0ea3f9e8eb47d7ef62e0809d12e71de6ad6a7634c8cc7af22f701c710c9b2b5ee3867acde491bec8d3e2690e2532de3488aed1bec9"; + sha512.doc = "f7a91677338dff848150dd1beac5645c157550f3463795d2d67493f35a81a09d33ee6cb39f2d921f535c12f26bb60ac17e4208298bd8bd7ba0dea8da4e1b41e1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +anonymouspro = { + revision = 51631; + shortdesc = "Use AnonymousPro fonts with LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map AnonymousPro.map" + ]; + sha512.run = "105334748bce7fa8a78edd599d6a8466729937f0008c479213a4d3d4b6b3e24b91bd1e124d0e3c1354fd68f99fdf621538696ba9b32ecbf09f5c7202b0b34997"; + sha512.doc = "ced94c5fd0be106433e99cbe66305b60ac6ddee82d3a1c8046d1467b11fe9ca10c2ba3b4ceba56a0ff439e7fa82d09c303f29200fdcec1600145fe7623773e47"; + sha512.source = "75d70833e574ab7847208d76d1012105f42712fc1558b9fbb35349871068bd60099d4ffe189eb28f5276807e6d1e48969283c7ea5a48f991cdb959077c1444dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +answers = { + revision = 35032; + shortdesc = "Setting questions (or exercises) and answers"; + stripPrefix = 0; + sha512.run = "89f7fa19dad8e94b57a66b53b72578c277037c0c3a9fe008d0802dcdedaea03f01c6554f4c6b80fd038ebc4f18e21bad3fc176f4c4acedae07d9acad2a90700e"; + sha512.doc = "616569a8d972150c0a1da86625b580baaca642bfad773e9e2240f74d33ddfea203b4c7349660b996adbf8208a92b11861d3f1a42ff88c68f39efba0af97ffa19"; + sha512.source = "ab865ba5abd9be86d4056cc33ec9436c14cbc0c308cc68d9a6768c094b84dc1bf785bc78c84e1f286e9371c2118ae3c21b8f57d0b4406ba6c2130f633ee6ef09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.16"; +}; +antanilipsum = { + revision = 55250; + shortdesc = "Generate sentences in the style of \"Amici miei\""; + stripPrefix = 0; + sha512.run = "d0a31d489cbb68ba258d78c14d294dd3ceecad43d746a43fb87d6c129d2b97145187d8f0207d320be91168a3e8d0612c79bd861d327572517479831a52d290fb"; + sha512.doc = "e7b4caa710d671e8474df9e449112033be38da1465ac475ff77748646b8c24c5589cb2fc3fccaa19642ec68960be1cda4fc4bb427e53ce19ca5c99a45f74ab44"; + sha512.source = "bd2860412e363d97f50a0055036b283c10b475832c6acd1da617a76cc05391b7cb15ea2b080c2658b8e0eb7d455a5ddac80ed25f7cb0f271c0172008b7af323e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.1"; +}; +antiqua = { + revision = 24266; + shortdesc = "URW Antiqua condensed font, for use with TeX"; + stripPrefix = 0; + fontMaps = [ + "Map uaq.map" + ]; + sha512.run = "0318b6f81d365cbb4b320642ddb6d8f909b5b136daf952da01c22508c392c58c9f8a25b33e4dd0e5afe777bb0b366633afd6567c3992df2a2e286cc9f41e6211"; + sha512.doc = "4158160d42fc776891f974cf8de13631aed17578ad2e5a67225442b7e783a36e2a0d3be640d92dce0fa66097dc617ad54b2779a3a3ef9878b46d900c5dc2ed7d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "001.003"; +}; +antique-spanish-units = { + revision = 69568; + shortdesc = "A short document about antique spanish units"; + stripPrefix = 0; + sha512.run = "a1203a09f77e3753fc28d632abc1c7d686085cd016acbab38a767b85a815d0dd05006e49b11524deb85bb8a20a3a8f413917529842f850d4efbe80b38c216ee2"; + sha512.doc = "4c4cd96889c2f1db9766099de6d149963579d27256f44d555023e205ca09617b570237e7eec2b5523c61af4d1124683ade9eeed4a5fb96f140423176ef163cad"; + license = [ "cc-by-40" ]; + version = "1.6"; +}; +antomega = { + revision = 21933; + shortdesc = "Alternative language support for Omega/Lambda"; + stripPrefix = 0; + deps = [ + "omega" + ]; + sha512.run = "af2cbe945ac3495e94fbf69797c05d9a7cd8c3874148c54c602a4a152c669638cf7a861949a3cc2d08aa21f378b57beffddf2d13e3afc1157c74472c348f5405"; + sha512.doc = "298b2e796736f7598a83a2d4fee53f48e78d0c8b255cc09c686371a3a05a4d36736cef96d812281cfd3fe1024af433f32e117c1c60d7559809220ed8dd5e56a9"; + sha512.source = "7ee92461e60834af1f736f387823788a44d680171d9a7acbfd71c858885e190f724b5db11074efb74faf63b471af5c34688af1be5b765de67b170dbcf123fe2f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +antt = { + revision = 18651; + shortdesc = "Antykwa Torunska: a Type 1 family of a Polish traditional type"; + stripPrefix = 0; + fontMaps = [ + "Map antt.map" + ]; + sha512.run = "c31e92701d14e0559ca1807389d3f1d95a166e9dee918fc7218ee671227381e3c37a991756e9c19c7e7d3681597c3c012037a74249c7c8eaaefc7c8a3bc2fc36"; + sha512.doc = "00533390612e68b48dbbe9c1ba11e46a0e48f8b87cea8f6623267d53795ee9170daa1f34adc8cde12356ef779990fcd7fe7a10b601bfc11c9a0f590b5a25f3b2"; + hasRunfiles = true; + license = [ "gfsl" ]; + version = "2.08"; +}; +anufinalexam = { + revision = 26053; + shortdesc = "LaTeX document shell for ANU final exam"; + stripPrefix = 0; + sha512.run = "0f7deb262a96bf55eba167475ca7c55887c1cdfbe60f9a32debb6926d855764eb595acb693ce9ab74a2af89efd98114f6694255580b5d594915cb2470d84b485"; + sha512.doc = "0821831108f81bc8d23dfb7d26f2201057a897a2dc783959b9e298b8e59b79a12453db072b824397a9625b8a63e7fb19ad8ba6d4500436bb0f7b9a23f96d1c3d"; + license = [ "gpl1Only" ]; +}; +anyfontsize = { + revision = 17050; + shortdesc = "Select any font size in LaTeX"; + stripPrefix = 0; + sha512.run = "31d1c235d011998043663bc1f5729bd40c5b90996627038be612115daef2b3526c9e616b16c251d6b653d5bad82beee62a7dcfc3b8c10feec0850729afb294ea"; + sha512.doc = "9003fdbf712448de70c858eba74f7de79e0cb83e8f9fe72d9c1b71869161d5a63099473c4f9ec670b28b356ceccd9b56110a1724dcde3062ae209a678f5b0e16"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +anysize = { + revision = 15878; + shortdesc = "A simple package to set up document margins"; + stripPrefix = 0; + sha512.run = "4439be91f8dd82cdc051c519b5bc36fdfb632cf09941f4e6ec92fa77c2b5f4d767c162018fc9451d48ece17e9cbd5d7d4c574eacea78b8f92b6e07d40d7b590b"; + sha512.doc = "96591bba808fc91a876dd49a6e1ede3b679c18952244f14b07e992b40d20f6c4a0f4b4dad00a409c766c5f2e883fc4923c501e65b06ad93193719001c2629f08"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +aobs-tikz = { + revision = 32662; + shortdesc = "TikZ styles for creating overlaid pictures in beamer"; + stripPrefix = 0; + sha512.run = "76e3f9748c704efafda74e6184aa3c0199f8dae3a9f433615fb87ac5fd7c81d5dd604e91ed7648b68f05919425f82fd19ca0b66f4f590f55e55634a5cc4b7f9a"; + sha512.doc = "3732ca200dcb7d3d4b99cbb0edbe13ef7c9293e8424457c2493c330b4ea810bca21851161b83740bf3b7b53899941e906b0b2e4b46ba715e7b5bbe19844d2070"; + sha512.source = "2cc8953d5e03bb1e6fc35d323a35d434aef291b165f1ac4fa0b005689af3d7988770d0a86fb4b4c3dd3ef6ea876f962dac5653e695533e089a7a50653358f40a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +aomart = { + revision = 63442; + shortdesc = "Typeset articles for the Annals of Mathematics"; + stripPrefix = 0; + sha512.run = "26216ce5a5069aeab93234a02063961d4895e45d35129a4888107dfa670e319d7d1f1947920700033b31f68bbc3a59fd189feea33305e2893581e8f6d89ab553"; + sha512.doc = "414142b801b286e4064ebd8a73cd40ba07c5d5cc6441e19f7657f94c2fb97665828d2c664908b8efa91af10d17d7bbf1b1b887de393d3752cbf0213b800e0c15"; + sha512.source = "79fbbac627d55cc394fbbec70c4550c2e889d88483b4e7c2bc19ddfc660be93072a7ffcfae92804b75e2fab47ea91c137c98ab7161e84399d586496940bf14b8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.27"; +}; +apa = { + revision = 54080; + shortdesc = "American Psychological Association format"; + stripPrefix = 0; + sha512.run = "dd825c533b29f8cd005b238877763ecc299f1a6d23be870bb7b899401f0aa73c4377bbed640e220faf4a1fe204dba0d94671c67ad83cb31d99eecb76e658f352"; + sha512.doc = "5e5224f11e811511b965e6f79adbab67bda5c809fdb4fadd5913ce570e34a933d139e8f418cdf7beff6e24e79443e4f4e4acd81837f24a5783915e169099e720"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.4"; +}; +apa6 = { + revision = 67848; + shortdesc = "Format documents in APA style (6th edition)"; + stripPrefix = 0; + sha512.run = "17ca4d98885f30c42c6e5338e838ea2556a2f9dcaaaaa82a4cdc0d82c9a208388f66fec45a87211720b12da193d758d662fefaa8d95fd3246f3403091b4082ef"; + sha512.doc = "244f143bdb9209482eba9c644a21b65af3a6990b5896ef079aaaac2aa57bfd4c0ae26878cf1f87d3f1744b3dece2aaebfccae4e0ebaa846944b614b76a12a673"; + sha512.source = "fae9f67a6f34bbb7ebbe06d125a45b6b2fcbb2d631f7b9731bacf2e87c87493b4e0804b9381609147000e412d2ce55e5b0e582de242ef027e0d3ac08dc3ed05b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.35"; +}; +apa6e = { + revision = 23350; + shortdesc = "Format manuscripts to APA 6th edition guidelines"; + stripPrefix = 0; + sha512.run = "155bd30654ec3a2bf3930bdad98235baa6bf7aa8109ad449aa1a7b6f2dbda37851f43978266e1c273cbd2155ed274003dcd91f9f452f2dffe268750fd0d9293b"; + sha512.doc = "d78ed178d1fbd07668bdeef74cf6f9f3674837a4f83eb5dce590762f7c02fae1017ee2eed6625a85a7b3e251ebff103e37da84af589125bdb60b73c9459cb748"; + sha512.source = "6a6502eb1a60d2b67d373fd1cb4aea0737d0eba9ed2846c07ff5849c4bfddb9ab3b6369ec0958536e831c79e63beece92393c874d9463bc7e3cc1a56f4c4ecb4"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.3"; +}; +apa7 = { + revision = 63974; + shortdesc = "Format documents in APA style (7th edition)"; + stripPrefix = 0; + sha512.run = "48765b391fc91c657666a94c4e903b3e3f93f0620ab561e6e7a29ce1c03ec52674f33dc314136a0ed35e2cec427e94b6365cfe64b1d50625f443dab6f20eddaf"; + sha512.doc = "3d55da4666c2babd231db031e6d72d4bd03b99fc89a581a3f351124956ce61b6275b2c7ced590d4407c1124636b6b2fff0a5cd5766e87ea51e4422db32288805"; + sha512.source = "f3190097ab50699cf44da16478b36953da636d15ec79ec45471b94a29de91feae603aee65fbcdcb32dadbec1e3981f3b39b7c6c483c77fb0da1922b20e056b56"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.16"; +}; +apacite = { + revision = 54080; + shortdesc = "Citation style following the rules of the APA"; + stripPrefix = 0; + sha512.run = "6f69733b58f0e791422269f48b56a52ad6b131afc4ab5c7c5ad1d9e0a5ec0d84ba48b8e43340f8e1a563a0c4b10aeb131f1999f836e89f311f067ded8464f91b"; + sha512.doc = "ba7720239a221d343cc58d28a9611f731a6db21f1e7852b0cdfe0c4f0cd97d475efd83c863b14d197f2206cb2bb0d314266797376b548de250842aa008ff3732"; + sha512.source = "bfcd5139e68c54b6c35dc8afc46022ffb56101de5dac3e6ea24df372483c2ecc2e3d2d0a486ea284f2fb6b0aba4ca622080910821a27447239ec527db941a2f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.03"; +}; +apalike-ejor = { + revision = 59667; + shortdesc = "A BibTeX style file for the European Journal of Operational Research"; + stripPrefix = 0; + sha512.run = "b04f10bb77365327f326f2bb6c67347802fe6f9628644711d72b85576f59e06ec9fec168ba382a187f51cb7bc2d619b2d971d55024e4ba82d7f5e3c73f556bc8"; + sha512.doc = "a9e091123eaa359ef7ca22d47ce3e069ebdd9e74835e54dc2abbe92073edbb9989d408d5f52f5e83b52f7137b4cbc50fc38e56606f72541ee46aaabbdafb3a40"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +apalike-german = { + revision = 65403; + shortdesc = "A copy of apalike.bst with German localization"; + stripPrefix = 0; + sha512.run = "2d9094953893182276e88db622b68750a5f70a9314ae5b88ca33c8b04a3e4dbb68fa01de9e3f44cc13b41b7bd7ef9c9b618af7c1cabe58045dc03b15277da5bd"; + sha512.doc = "eae2fa13afb28c51926a1fc4aa8e8e39da35d9a6b3297eb2a1b42bd39580daaf45a782c4cbba16dba6c7a4c315873d6ad1a7b6dd61b4de06cf5628f8d381c63a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +apalike2 = { + revision = 54080; + shortdesc = "Bibliography style that approaches APA requirements"; + stripPrefix = 0; + sha512.run = "cb837c6299628a58189f33570de7717d53d83d9de456255b489ae4ef73693b51bffc2dd12c9496265ebc8cda64d8da8b1c71d46f9d96a4bc13c07c9a6e021a2f"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +apnum = { + revision = 47510; + shortdesc = "Arbitrary precision numbers implemented by TeX macros"; + stripPrefix = 0; + sha512.run = "2e155193dfdd3c88cf336cece23bc6b393a81529c31ac2535840a7c4f4a97530d35d0f4ae964e8f92856eea0d54c356e8bc15427918ba0891730827a3ba561c6"; + sha512.doc = "4e1a6ff31d9836dbb04fbd90911083a9ff70c7526ef099d437e21c11766314cc29e8071dbc21976af7a23fe99b673bbee82dfd265041b9ecd015070c58b4ce14"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.7"; +}; +appendix = { + revision = 53718; + shortdesc = "Extra control of appendices"; + stripPrefix = 0; + sha512.run = "efaf48867a45f8365755224123b9259f80f49417c409698420d67670baa969d5d354df1429fe7abbd87c29a8e89a9e084cd75384310a44d61e1f2fb7a2650977"; + sha512.doc = "f4e90fc9fa5ca89a9a20ceb56cce788984f3ce5e55f92c99de966a54afca7145d9e3602c4e514ee6b7887b3ae9f8facc9b3191ada19514aae7c7886ae2984b0c"; + sha512.source = "7e7222abea6401b749f2019fb205956c99bc3ce48134138862caead25aadce25410ac4fdf9ce10e34dbb802c07e5fadf8e4facaf846047ea654f2605b4f3743d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2c"; +}; +appendixnumberbeamer = { + revision = 46317; + shortdesc = "Manage frame numbering in appendixes in beamer"; + stripPrefix = 0; + sha512.run = "d5f4573a0f6c31be7e910512d86ee0443e713abea11e71694b58f1d1d65f4249f967aa5b873941e1d8b7686d408f411aad1a76009a3bbcb528693ae14dc60e63"; + sha512.doc = "58b32eacfbcd8e024a4cf3dcea0c1d057010dd454c1e54b6752b970a3fa1a9e10eb15d8cee9dbb9ae032aaa8b6c070079b112f5a91b1c9617df40877a4a3454b"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.2"; +}; +apprendre-a-programmer-en-tex = { + revision = 57179; + shortdesc = "The book \"Apprendre a programmer en TeX\""; + stripPrefix = 0; + sha512.run = "2008619320d2b7e906c2511609e76894dd065f8e56dd1800cfac0e13af4415dc76c437cdadcf15cfea85d7862996e99ba3240aa30d36fa70d9c1d950b7c97e96"; + sha512.doc = "34c86cf9f0a296846a85f896f31da102013dd7b78ddc11d20aca93770671f2ab05930167160d3bf6282b7740fd9d5eb5238ec70bdf405658c1688d3bbd769d7e"; + license = [ "lppl12" ]; +}; +apprends-latex = { + revision = 19306; + shortdesc = "Apprends LaTeX!"; + stripPrefix = 0; + sha512.run = "fe9c7ee4cc8cac1ed932388ff75066e4166e582f92bc23da4a4f6049f3cfd8c100d6ab6c0b3c661dd76038a9683eb3207f94f54ea338dd172027815d6945ad94"; + sha512.doc = "d65d5f56e055ac4628e8198b718689631edca80abb3593480948ee8ba3336d7baccc091cac9f95b4dff745d84d409488d3a2032a1587f1f1a5db186af4da1413"; + license = [ "lppl13c" ]; + version = "4.02"; +}; +apptools = { + revision = 28400; + shortdesc = "Tools for customising appendices"; + stripPrefix = 0; + sha512.run = "05d243100c9fc575b7828e0084822fdb2c655f5d2d7c51b42aa3c5ee4d127f62f714affd1fa8e94b7c0c322b57a9fe1728d1829ed7f18d75b5287a673d580cc4"; + sha512.doc = "74ce416ef14978e0418754e3d2e2874ed07a8fbc6be90a1bf7dc492f191546407d7a967efb1306481d1b88ad296faa1194dc4da8975f7ac0c4e4053ccaa1444a"; + sha512.source = "ffbce0419baaf512bbf8aafae3a8bdae5456f9ea1699cb48b6ce215fd8c4d84dbee84399e8799fa5ca161a1e98375acd16d196c9ca6c505c7923aa7fab49e0e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +apxproof = { + revision = 64715; + shortdesc = "Proofs in appendix"; + stripPrefix = 0; + sha512.run = "69d21b2d0770baf8d29583e383dfa1714d8ba4d87d65c2f6590ac6d2f5df2304d002490cfededb38eae043ab1cb2b23d7c67fa7880c4e48654f2a34aa9f853bf"; + sha512.doc = "2ba3258ee71a0776ee27bf4249288b12d92b7cabecf1601efd9f1855f5a058b9c030a0d4107c026d8362324de9240350e65f8fca1e76ab5e4ebfe718b37ed27e"; + sha512.source = "32995f9080055dac2fe74e1c9d65baea4dd824098d1dc1e62232c13c4d67226e0c9cb880f5dc801215a97b2db7a6c665cc7188f42265416c8fc136384c3fa34f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.4"; +}; +arabi = { + revision = 44662; + shortdesc = "(La)TeX support for Arabic and Farsi, compliant with Babel"; + stripPrefix = 0; + fontMaps = [ + "Map arabi.map" + ]; + sha512.run = "6f59ea8c986078f388f4c8f067b12863422728cb1a56464ece4d793189bf0e6dcded476a3b86317c2bd5f9b4b3cbc475fd748c2ab9bbf60b3d8c8cd4c162ea62"; + sha512.doc = "c851b0cca46b11d7297a03488cc72adafb6409e0406de809a1a18d4993068702f03e17cbeda1399914005c9885108d747c844719764145c746b2a0ae45d9121f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +arabi-add = { + revision = 67573; + shortdesc = "Using hyperref and bookmark packages with arabic and farsi languages"; + stripPrefix = 0; + sha512.run = "8a9742a1499082ec9ecf5082f34b194e572cb94a0d0b6a3b1d6b8a01edfb9b3b53d42e3720b85fc2dc654d06b3641b95d506eac8cb393bb9ef21dc68c70e5adb"; + sha512.doc = "c11ac1fa2b8dfd619060efa36f81ed0ae6d0e1b976c08894f7115d960458a812496d5ce4f8270350ead90a5a1614a8a61cfb98568a1e28d414fc0c5b370690ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +arabic-book = { + revision = 59594; + shortdesc = "An Arabic book class"; + stripPrefix = 0; + sha512.run = "ac60431be9ebb42e2329c954805ecaef988bb6724eba7638ace659a973de3de9dbffc9ee85b2847531c3fca44e97e7099b1d9412ec754d9d27bde1432480f133"; + sha512.doc = "5ed647dc625397baf5db5cd05c87b2ce5dd44b4acf67ff6337b96989aaf210775f3870b5f1f376219cbbce96e486eed5dd24dc893684aeb7d3490ae62df15f14"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +arabicfront = { + revision = 51474; + shortdesc = "Frontmatter with arabic page numbers"; + stripPrefix = 0; + sha512.run = "efdd3769bedf8ececd7f71f6a918ed19f66caa78b348238b34e554698a5af6ae5616bad5cc494c970cd8e12073f1c27ccd1cfb7ab19ea263b5cf98061c42ccf6"; + sha512.doc = "64eb067784cdb56915b45e80f1666347bcdde06e3711a18cef16ae92450377aed236cc32c8c10d467d50e77de31a3f599abe900f411a510574378e63eb923862"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +arabluatex = { + revision = 67201; + shortdesc = "ArabTeX for LuaLaTeX"; + stripPrefix = 0; + sha512.run = "c235430d724495035832ca32fe838ab5d75d48d2d68c6c84965f5fb7e5c65098356513241c82e95b6c6d806328c0272b775c1aca963df02ce2540052d62b312e"; + sha512.doc = "d625d9d23d73a4c261c2099b77831dd1b60f38211a4802a3651e31f65c5d278c3cc3db8469cacede81c1a105cc6d4f605a5a9ef764b6171e4fcacf515a1080e7"; + sha512.source = "260d4eda4b79f727bf33327953fd0effe33f12272d293a2fcf6d8a5da8ef918d42220effedf20a29e5d4f39449b461398f15b08dd1b73522666cd7a009ece904"; + hasRunfiles = true; + license = [ "gpl3Plus" "cc-by-sa-40" ]; + version = "1.20"; +}; +arabtex = { + revision = 64260; + shortdesc = "Macros and fonts for typesetting Arabic"; + stripPrefix = 0; + fontMaps = [ + "MixedMap arabtex.map" + ]; + sha512.run = "df47df09eaf935bd8921d8ad475190fe6651f1cbf198473ee82099242b6f4cd63ae5873a2b2fbd7a75a4f9ae77f5ce3f56ffec0e668fdd649c4d3fe051b2ac68"; + sha512.doc = "a73aed53cc1cf4f5600312f58e0ae8a29c57fb04ebc87b91f13526c780567a5ba076a0b63b0abed791880efccffcfc52bb0f43131da4b8e2a60b48184d2f66de"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.17"; +}; +arabxetex = { + revision = 38299; + shortdesc = "An ArabTeX-like interface for XeLaTeX"; + stripPrefix = 0; + sha512.run = "7c58bd94b780abc5bc17b4218229d289797a155a8e98cae8e22825dc7d9b12c5514de01b12bf2f645047dafb13b4d519d463f4ced60f7ac53a65c6aa38cbec86"; + sha512.doc = "0dff3162a710b458b367bb4ca587d525b68ac79d2d3182e8b9d2ca90ff72f89bf69153960400c344511449c52346c329b8a34eb788e11ed9a5319bb6bca89418"; + sha512.source = "fb29b38d69d39f4c7ed04a3ebb114e49512abbf444f36fcd02dcccfdda22aa3800521c9819696c2828c46983f8266fc00aa59cafb35e26574a3403319d364d64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.1"; +}; +aramaic-serto = { + revision = 30042; + shortdesc = "Fonts and LaTeX for Syriac written in Serto"; + stripPrefix = 0; + fontMaps = [ + "Map syriac.map" + ]; + sha512.run = "6731d62d8a24c9f0d26061b8b2574a880df30df333fbe16408d0830657ea36f04f50c56b574de5eb081f490a4c5782595fe17bdb9208b6602c1a0ac81a1f10f5"; + sha512.doc = "433018891123aebb201d6c4f2b00dd15a558344b758899f85b9bdc21556ad4fc4845ce72084863b243e42beba643c5ae4dd210b74e2588af4825e3c83d6d7997"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +arara = { + revision = 69878; + shortdesc = "Automation of LaTeX compilation"; + sha512.run = "c18444518e8cb66b44e49cdcd944895b0667d934460d0146940c87813e0c9a372fb273882ea1de78d4fc869d69ffb2ec1a41d863cd977891ce7937134464df73"; + sha512.doc = "372e1053717395e960e2447622d262ee2b07594823f39fb845f5640d730a3590441aa5dd509e1f61be00abaa6df3ad20e953c66b7c27829d25b9ac68d0aa4423"; + hasManpages = true; + sha512.source = "0cd47d01d950c9ab685264027ae92c978a5539dc67b937d25e36a60e2a1ae50760f1da73be7e39132d74e5e4ea751c0a7ad9e9e00097bdfe270d235d87b64502"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "bsd3" ]; + version = "7.1.3"; +}; +arara.binfiles = [ + "arara" +]; +archaeologie = { + revision = 68476; + shortdesc = "A citation-style which covers rules of the German Archaeological Institute"; + stripPrefix = 0; + sha512.run = "02768eb18bd866522380974e675eae530afaa9f0c0baf4e4dd6e5c0bcfef3755a54e79d9be2697b4e29cc633ec87c65179561d662cd99406556d3a66940b9199"; + sha512.doc = "60136a2704265de25c0097e766fb50d89019b01524edebf6986db2c465d8dd2230f5d48ed5fa7b2d0c6f1ba5bc11dff4d2a171667d7743ad3d883e068c318864"; + sha512.source = "0625c3bb08909e367a908f5f12f9f2e064e6beb251e7e79ccf0ff7fd15639e89040b4a3ee45cf28cd11b14559c1f1660812b78cca6d8dfa02796f9af85290be0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5.0"; +}; +archaic = { + revision = 38005; + shortdesc = "A collection of archaic fonts"; + stripPrefix = 0; + fontMaps = [ + "Map archaicprw.map" + ]; + sha512.run = "5e841f4a8e5df375fd660c998d3d54221e6c8e383fe4a69fb082c98d62b44a1fab2e9ec88db37964e015abbc20cd0f2af5aa26cffd4fd92fece5e24661c0efa5"; + sha512.doc = "457eedb06a3a09a73a2ce0b20c18b643530aa2659d7b1b98be14238b9d40e8a6bdc39085654e8589fb134921f40d211d93f553cab25d7901e40286b3075f268a"; + sha512.source = "5a39568546651ef10937849550c3305bde9379737b21e24b2adbec532dee8192ddbdaaa77f2e6bc135d518f354c1b20d7c43bc03f65ccf47d423f4af1e75d620"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +archivo = { + revision = 57283; + shortdesc = "The Archivo font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map ArchivZero.map" + ]; + sha512.run = "0f6b7985d73ba3e62874bee7a05c215cea0008bdfd1b0c3df6795a2d6363ee2a209df956b4f9698ec93ee8d9c6bd62ab5bf3bf19cff78c968a97da58a80b5f40"; + sha512.doc = "88cf002d557401730c035727251e228effdd25d52e9d76edc950d0f3ee639e2eb5bf623c77a4e80dd902b7095076030b32aa017c8adea9f57912ca9de51ab7b0"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.2"; +}; +arcs = { + revision = 15878; + shortdesc = "Draw arcs over and under text"; + stripPrefix = 0; + sha512.run = "65737905ba0a6ede74d8cb211b46a2e62b640d1b655f895095ad4bdecefde496368707142143e2f2e48849faa89d86a9e90a0bde64fe84b3c828e14462f30406"; + sha512.doc = "2cf72d4ec304cfa08c1b3cc8df3bd9a6cb92a633a2ab783ac4efbb5edd6290ba256c86bc4a3bbc09d923a58a10e5f21f5d8e3e2b41b0ddce14406d29405523e0"; + sha512.source = "ce6599f074d59530d85960b2a313421400f1cbc26b488e900a5b49d75f6b715a859b36de2d2e25c880407950f1170512cc3573b0256d69ceafab40e29566de78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +arev = { + revision = 15878; + shortdesc = "Fonts and LaTeX support files for Arev Sans"; + stripPrefix = 0; + fontMaps = [ + "Map arev.map" + ]; + sha512.run = "8b6e88a41052740831fdfa03299f665fad9eaa0e45d1d235392aa0b849bd6ca03f1e18892c879d3a5289430a5d236b9544d617ea2c3af62a59b38b4d7ff8ce90"; + sha512.doc = "a8dcb8bf0fff3be9c99550623f12651df09b151d6e28bee03d7aa80c7b0eb8c86603b4d8037232e4998bc5603ab3dd368ff7a262b7c7f62f2903338774a9b8aa"; + sha512.source = "6c92c2f3ef59dcb93207ea90643d11aa8cf81850e2696414f489c40cef97737d00ee4444893669f12d4592c6573a71cb229c232b62f10db38195aabbe83fe523"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +argumentation = { + revision = 69023; + shortdesc = "Create abstract argumentation frameworks via TikZ"; + stripPrefix = 0; + sha512.run = "d18f62c0c6c5cef4f85b854342671ebbc9224475d41488058543e682e41230f61cea4ecb68db767742c30d92ae2af1270ef47624608a3fb93aa6f8031b12648e"; + sha512.doc = "bd6e12905e35d15064a357a248f4f5dbf5d91e37d0e742be0cd360e7d6079122090f29341acf11584ab563355481aad7edbbdfe1fa6b2455aee2b67e263dbb6a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +arimo = { + revision = 68950; + shortdesc = "Arimo sans serif fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map arimo.map" + ]; + sha512.run = "3c84fc274ebd29dfa65a8db214ef2ea74bb22da21827844be3b5648b7f10cba81a73772ccffe758b19ac16e58a75b1eb578a0ec8e85957f9693858065665a085"; + sha512.doc = "dc70491f5b2b5a900f3d6f9bd543974b81976907a7c3dd53fd7530e3d0a6d83fc44a61607b27d9644eeca6f6228faa171916e67fc7517c35d466d9c50a186808"; + hasRunfiles = true; + license = [ "asl20" ]; +}; +armtex = { + revision = 69418; + shortdesc = "A system for writing in Armenian with TeX and LaTeX"; + stripPrefix = 0; + fontMaps = [ + "MixedMap arss.map" + "MixedMap artm.map" + ]; + sha512.run = "7acac8416e424db754f1e02844e175dc76c694d46efa30e1e29d855cbe3ffff1a50b95c38e2de2e88944bb11920cdf2295254b3855b5d6e13bfb930665cda8c2"; + sha512.doc = "83b050d9bcfd2d4b7ff54458a559401ecf5abfb020c39b7b7c29f3fe9cc656980a63354df549ff4b93ec4ffb382e60578d5657c268ffb7282dfa5e45fc66539f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0-beta5"; +}; +around-the-bend = { + revision = 15878; + shortdesc = "Typeset exercises in TeX, with answers"; + stripPrefix = 0; + sha512.run = "8fdfb83017cafe87778ea8a9e7147d6b73ead7019dfc9dc8b620858a67a2a02991e291d622aefc77723f6faa8a66b132313a100d298a2f6327473df4e0fb17f1"; + sha512.doc = "acec7325203a96ab3937cb687e3265b5cdf6d77af5740e1e187f993fcdcbb9db743835e9ab579b6c8b0534311ba94f3d1591330bedf1c2f9eb9e6955ad070f9c"; + license = [ "lppl13c" ]; +}; +arphic = { + revision = 15878; + shortdesc = "Arphic (Chinese) font packages"; + stripPrefix = 0; + fontMaps = [ + "Map bkaiu.map" + "Map bsmiu.map" + "Map gbsnu.map" + "Map gkaiu.map" + ]; + sha512.run = "2d4c0f91dd483df95bf91056e4d7cbc28b681fc9f42704cdbff297ceb4f8110affbed879cc8b15061c309764e1fdcce01fd47c2d742df441ed191f83a065538b"; + sha512.doc = "327dbc2cc7b4bad5e410dbb07dd2a2d5052dcb54c98310ffc3596c1e5b4121c1a12e3067b7074f209a3972cb51280f057cfe718eb963869bf05a76e17c528dee"; + hasRunfiles = true; + license = [ "free" ]; +}; +arphic-ttf = { + revision = 42675; + shortdesc = "TrueType version of Chinese Arphic fonts"; + stripPrefix = 0; + sha512.run = "f0559968e2659a4e899bb0ee1e6236f4bf7f4133c96c146a189b42fe0ce7f375ffc5c62efd8acffa68b36c92159c28eb54167a7625b606cf7644c0a072d7f8e9"; + sha512.doc = "000030c21bf1ccd74ebc1c6bf8e46dc5d9f884480b2c31407353a3ff45a4d1072f759e9e31abbe5c9de7dfc68820fa359d42c5e980bfb7e9d408f015f8944aab"; + hasRunfiles = true; + license = [ "free" ]; +}; +arraycols = { + revision = 68277; + shortdesc = "New column types for array and tabular environments"; + stripPrefix = 0; + sha512.run = "faf429613ee1987b92b369dc357f376c1465531cec8f7f78c37099366fa80954930afd62c553760b71a2226b0d245d9ad9664f4e5383803471bcf4f63f419f7a"; + sha512.doc = "6bff5add83a6eb8f0c697bdfc5da076c5a833e856abf0b023002a50a85dd1a7cc24e0cd042a2fd28c18a37a88ac91f4f09a5c4f2911cbba30026fbc03df06c71"; + sha512.source = "9fe04362a179851b135af96b0eed0d229d19f2d4623acbbc39dfcef375be7dc682ef08af3fcbe146d7ce738cbe8e7e00e9f72d549966efa674433e3024738ab0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +arrayjobx = { + revision = 18125; + shortdesc = "Array data structures for (La)TeX"; + stripPrefix = 0; + sha512.run = "5cf6573de2bf55c1b75c2a0f38515ecde848dafcc0e5f0e77185ac039d0bcc4049bf6fdef62134ea5e4839570fc20cc6928bc9357bee0c4396f08d714eca8d13"; + sha512.doc = "495f7f8f3265e349e16ad170eeda10296926864084ace743df54f5a4b304da6bc344bce901edc0fca8d835bd0f90943b192b0e16e3a8f5bc81e0f269f2b480a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +arraysort = { + revision = 31576; + shortdesc = "Sort arrays (or portions of them)"; + stripPrefix = 0; + sha512.run = "6dd3c6a79c7b7e1f9a0fa29f2d7f4fda8c3aceb0b900c4e42773c81f8a49e84dd62ae24027065cf19cdff93d4addff11d0b25cde62f2d4854b84fec26eb98c61"; + sha512.doc = "1070b880c7bfb6101fa9294ee8d1ab4c61b21af41316ab711c3226173b73249944533cf0594571f90215a46322b1ef07322daf7230d95e7c23bf21650e1d6047"; + sha512.source = "a8a5d1506a5cc9a33f5393ad6dcfa7ee84af9de69d0760d90fc633391cd21f6d274995e372d91f47929b098d64ab5464d7d7cc2454266bc52972b8708e3bec98"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +arsclassica = { + revision = 45656; + shortdesc = "A different view of the ClassicThesis package"; + stripPrefix = 0; + sha512.run = "9c6b32e43ff86bd6f28d23b9aab5dd90a423610b2f3c842462e88985c2ee88eec2e78e05cf3e0b91397009bdd370880df6db642816d7de3bb10a96faf4fa34b2"; + sha512.doc = "84cd0583c074af45837f38c21815019613753890e056109abab3c79c774a7ebe966c35875264998398b18d7a7fc92ac6762dd72726e708193f699e321f296535"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +arsenal = { + revision = 68191; + shortdesc = "Open Type font by Andrij Shevchenko"; + stripPrefix = 0; + sha512.run = "f103fff41a3e21594134b9902064001bb18e0c85985ebc99486378c0929d11eb3c12f00e7e23ed254029bca78adb2061575c48e9406fda890eb732b3cb90f096"; + sha512.doc = "72295197eca81954e733409239b4cc13ff9ae87f5cf5c402a8d2904edf2e3fb6686fe2a0ea8bbd4d0e2bc0498507c47870ae1ac3cc2d722713ea4b952613a345"; + sha512.source = "214ebf080bbe11aa5c3fd088b6329746202ae1c46867fc6f1ac23d56ca22b44b147a8e929eb895c86834d6d3117bfc1e447e3759db9b73f4ba14b824a952b00f"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.2"; +}; +articleingud = { + revision = 38741; + shortdesc = "LaTeX class for articles published in INGENIERIA review"; + stripPrefix = 0; + sha512.run = "30a34052cd9586d4b49d687035ae8bed040cc5bc2d9ebc0d96a035c4c7cc06625877a501e02eda9be5eb79643f009ffa9e8d2bf9d7affecca016ef3c6310a6de"; + sha512.doc = "a7961a7ce16613d26d714d39bc441400cb37d7013d03684146ee9113d05dd821a23a1eda9f7e89601680959f3b473e31155f24003b5deaf60e069385c0681646"; + sha512.source = "1217fbf4951d4e6a11378154cc030b4fa18e7ca6384bd1593e9a8adfb4a4d2a3161bace28c22bd4aa4ba81ff56d1e2d1252d9678ded0c53f8dee6294e8dc1032"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.3"; +}; +arvo = { + revision = 57213; + shortdesc = "The Arvo font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Arvo.map" + ]; + sha512.run = "3a6236c3f5e07f3ad709c6a5e0f7d2c90574cc897f6f5d470aa1523b537370587b5942e1a8c581fd96e43e80189fb1c7c4a2475823077feeb929ec594a90ffa9"; + sha512.doc = "3d3c6a92159b47e8dd5ae7360c06c8d5db8ccab609dd5f3db47db2ddc9d62badc3e6bd7c881ec5955003ac2b460c550ce56154cb2323ebd2bdb8205318a709ce"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +arydshln = { + revision = 50084; + shortdesc = "Draw dash-lines in array/tabular"; + stripPrefix = 0; + sha512.run = "fd676917ccedc39b90b48b531ea4ec5098b70ca854583a3266d4080dc78f59e37a743e63b738be370cb0ca650594d0878ab1f807eb6f55daec17ecead73aa4dd"; + sha512.doc = "a809e2abfd26b11edaf8a5b23ddf01901f84bbd63b8fed7b6050a4947654ffada95bb697e13250038c6fb93db80dee4faad6d4493f05bb7f4ebb86dc7e9b9698"; + sha512.source = "0be560bb0dac65951b177a34ba45c8199cbe75b64958b71649f09e5e7be73fe091bef6097a9502be80e26bd415f193e00579925b0be0d12bf43adfc0e3963578"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.76"; +}; +asaetr = { + revision = 15878; + shortdesc = "Transactions of the ASAE"; + stripPrefix = 0; + sha512.run = "b44fbf1bb916eb9fb01c70a7302ef4028d04c84dc6a89a51c0feaca762da9cc95cc03cce6497e96dd64ad73e812fe59a12adb515ff4f561401131476e7df6214"; + sha512.doc = "be0cd70f1b3035477a9b455328a8e167a5042e07634913c0d9efb995286165a1f41c1b86a505b3f23d19ec2f43712328f70085747d692bb97ea968c40ed109b6"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0a"; +}; +asana-math = { + revision = 59629; + shortdesc = "A font to typeset maths in Xe(La)TeX and Lua(La)TeX"; + stripPrefix = 0; + sha512.run = "2bbf3e139418db06578af5fc8d3925d96bbe1bd9d472a82d428a059b1a206db131734f1b0e762ca49c896f403faf279b2e47465061dc5bcf0eaa8058474017a3"; + sha512.doc = "86b064ede8b8d77b9722d967de612e4a0e8758a29a6a3909b625fe2fa8ebe9551359a442376e8ee8a9dadf5d295d197328914411144c6f94e0b0fe16692eb128"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "000.958"; +}; +asapsym = { + revision = 40201; + shortdesc = "Using the free ASAP Symbol font with LaTeX and Plain TeX"; + stripPrefix = 0; + sha512.run = "9a683044f23fdec0547199afbc0f0c6c9de8faf01f09df38de324f53e91f446de867e951e187ec77bd63cc65bb92ba2fd7bc290d54650ce24e02b682cd10a941"; + sha512.doc = "4462b37c6575ba0f3e95c29e1d84eafaadc562da19ec58a604bb6ef677fb9b9d35fa68a6f2c81d8dafc35dec9f904cee9d3fdfe0c2031de928862324e83d8663"; + sha512.source = "54325810653a14ba0ebe67b92341fa151e5bade3ba23e97c67c2bada6bf43ab16d5e0d11eb4c59075c48bddd9eebe44ddbca5accc331e6b26081abbdb95e3e86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ascelike = { + revision = 29129; + shortdesc = "Bibliography style for the ASCE"; + stripPrefix = 0; + sha512.run = "d8c9d69ac49e632b7b303c0fcff53762f6d40a490aa1655f58525e192481b65b50912867b1cb16c9aba1d93483a6a2bd31e586683819a7f2b3db7439d46deadc"; + sha512.doc = "0283fa497b53dc3a0d60960bd45945dd9b363c53a563139e911b8bb017a6f0ea7f46a95811812a679fe1ac5327c52e73f4aba35d26160041c61a1cb5597c880d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +ascii-chart = { + revision = 20536; + shortdesc = "An ASCII wall chart"; + stripPrefix = 0; + sha512.run = "ffc1634e3e5313eb0cf04caaa227d6477cf81ba9b6eb887b2897b6740999f1f338b2dc53e6da735876f9c3b130394be59b0a285309d61909a73fdb0d6f28a8cc"; + sha512.doc = "51b11a22dd963336fd93a87e2948d05f291b4191253a474b9d6f70ec31a2645801fb5f6fb6238f6a9b2979dbaba4a6ec8ac15a41c4e8867645dfa54408f18373"; + license = [ "lppl13c" ]; +}; +ascii-font = { + revision = 29989; + shortdesc = "Use the ASCII \"font\" in LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map ascii.map" + ]; + sha512.run = "e92e312e38432a7294c71a76604e5a3c2aa6b65937d39933fcbc9fc9b61e00a1e2f35ba739f64c29a3ebf6d2e388cd29da384a2a6456f71576101a1f12e36f0d"; + sha512.doc = "2d681a41d213fe260e3491a3b410239fa2e025ba19894d133a27e47b417ccf27648aa13ae431b4c42549c1692cbe517f2595c2de675b14d9ea0460d469e4f036"; + sha512.source = "1bbadf44599ad29f843ef17d1b437f951f5b167e9bf84a73600a0a9dc5633d94d76c91ec23493250ac894d9114c1b2d1d1f182690aef5dea92c9ec51c96e69a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +asciilist = { + revision = 49060; + shortdesc = "Environments AsciiList and AsciiDocList for prototyping nested lists in LaTeX"; + stripPrefix = 0; + sha512.run = "5c2e7938a9d2df31477cc976cfb549103c8f378a8d38a3624d3449229861fd834d462163df6e2e1f1fec686f513c6a194ccae9fcd0991820b357e12a1c32af28"; + sha512.doc = "8602a9f8e5dc04a6d4a914f603e04ced8f5cef55c5a335087b8f0953d19d4641d43ef732ce299ea18590de89e2360a8dddb44f8ae76be6498ccfd29e4a680746"; + sha512.source = "562efdf7665916bc124f8d2ada2d7087ffebb23885df6c3baa652ef24b8fb7ba7e2f4a5880922066b9f5c44bdb9c70ea67537c79676c9fb7004d2ce1f6c0d6b9"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.2b"; +}; +ascmac = { + revision = 53411; + shortdesc = "Boxes and picture macros with Japanese vertical writing support"; + stripPrefix = 0; + fontMaps = [ + "Map ascmac.map" + ]; + sha512.run = "f03ff628aced70ac2406863aa4b23eac26cf47fa09ee377ba78a8df3af633ac1f3fad8d005022c1555d957ec9d84f98eebf2dc97b296713a2edf5f0060d4180e"; + sha512.doc = "e35257d0992717350e78e611f31f864651a1762dcefb76ba60510180de177fab02f634423b0f3c78c03394fe0eeb6191db0d534190d4f168922263526a85b1b9"; + sha512.source = "3613b89f600ca51f1234f711816d041c4a3c58f72217b299505d90d0b7316606b3015c43edf3546fe93625dc628f232179ddcb0dce7a2f26375b93af7e6e7171"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "2.1"; +}; +askinclude = { + revision = 54725; + shortdesc = "Interactive use of \includeonly"; + stripPrefix = 0; + sha512.run = "828a18ff7c2d997f25b46b9ce8626a749ce1a18989a292f7f44e9eff0c28d5819e6e017398e76a6872da6498a4ff8306d8f8e701b87b80f57f455d28389f7aa8"; + sha512.doc = "a06a9170ad1637c35a25c9a0d89f3721ec350a0053cb5b85374fdb5cc67e7d4653e75c2a5f9b47d19700e3e9ab2d70e5c0c419f68715e664185bd30759dc0291"; + sha512.source = "909effe3b7569cdd4a4a1fd7db12cfafab6c1ddc0987709199a051696b447f9b57ea0bece52efc28f41f49e2b81611e14e975cf93a2d5e4b1c202f84b9702569"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +askmaps = { + revision = 56730; + shortdesc = "Typeset American style Karnaugh maps"; + stripPrefix = 0; + sha512.run = "0f4d91a15053d40d329744c429540075c33e2098f6d9d07eccc5ad16c5696233dd01de89c61a7090dc127c3730ef04e24f8d56845919cd268ec8c0bc68d9c09f"; + sha512.doc = "268915d685c8bea4388055487ca0d30418557babd01547457449085e58d639bb17787b6b5c97fa99301555afa9d9d11754196cd2b1dbf48b642b05a835b383b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +asmeconf = { + revision = 69742; + shortdesc = "A LaTeX template for ASME conference papers"; + stripPrefix = 0; + sha512.run = "93b55a406a9b7b1e652babc788f9674ba27f29036aa16c25a3e531ff63077588807914d23c865eba55f73fbec04c3254eae837976591481534f773d72412833d"; + sha512.doc = "2c70973dd40e2afab5bc777c6a7b64d3c86a09e15c62b2f719410de6d05925534071e91ebdc482928382602d49d54b3ca342a7886234a15ed3b54ae761f51208"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.37"; +}; +asmejour = { + revision = 69722; + shortdesc = "A template for ASME journal papers"; + stripPrefix = 0; + sha512.run = "11e65ea5fa72880c52c63de1a7214de9322c26133722eed08bd54fba00f58f309f4d1a7fcb4a0112c1d66ca6be5fa3868f6779de8c47b660a143bc61855a47c6"; + sha512.doc = "3af8026c3e0a77ca0f4ba99901577d253ac139fe049363994f56480cd6177524cb7a7dd5a4c59f436620a089ea08f2faf048957a2d2290800b71bf8a43d964bb"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.22"; +}; +aspectratio = { + revision = 25243; + shortdesc = "Capital A and capital R ligature for Aspect Ratio"; + stripPrefix = 0; + fontMaps = [ + "Map aspectratio.map" + ]; + sha512.run = "1447c3037f5477aeadfe3e5fe18a004ffa1b8c5c18b7c68295b8065e32c5a3e6a044e7f9868bafe3d8b81e391b2c614e2153302ef34e1e4aabe84c92ada2f129"; + sha512.doc = "5ee4918a3d90e9e4b51a2985352133331b77a8a87bdd8d41fab9348e5c548670ab56b5f0afc63756b65fdb6e45aa7594335995ac0d146d542b571eefbaa84d78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +assignment = { + revision = 20431; + shortdesc = "A class file for typesetting homework and lab assignments"; + stripPrefix = 0; + sha512.run = "5b8ceaa313eccffff8930b4e1896c7aa069664244623baae2aa1eb3555786dfeb8af8245e56ca149754093f6d74d6b86c891cb9e52e67c7b76e2501ac206658e"; + sha512.doc = "49198297494adbb538385029d41681e55bf64c89fc9cee7d923b7ba9849c039a7e5aa2c1fbfc15f06c1a93a3b694899ffd8988d1833fd88c6f5dd51379289a14"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +assoccnt = { + revision = 38497; + shortdesc = "Associate counters, making them step when a master steps"; + stripPrefix = 0; + sha512.run = "24dd03f444ff4dd627a97840837cb14288e9021117f93fbbdc4f79cbac9cab46d43fb93769d2f05970eeef3fafd39692eefe5d1b7bec8ae04f6078d7a4b48824"; + sha512.doc = "195f1f017fe187a224bde969f45b6494007e4d05ab2e8618b62e8d40055b4ef401f5ef069c3bd1af25f8a9f5e1ad1cba22923e4d615d4f075e13a78a06752e9c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +association-matrix = { + revision = 64845; + shortdesc = "LaTeX support for creating association matrices"; + stripPrefix = 0; + sha512.run = "6b87d01d5559669f6e2d63fc14427d950eba9d790070625cc6acaaf6e308282b7434bce90da78a41858b068121b75a1e1c0ec4453d287aaed94c9e6308a1b5ce"; + sha512.doc = "e56de37acf6d8c2b53aff0aa78999dd400b18b3bb44ea40f21a7638e463405ce4f48d2041236897f7a281099c1c5d879ffcbda9d6b08d2b0d5fb83193803d157"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +asternote = { + revision = 63838; + shortdesc = "Annotation symbols enclosed in square brackets and marked with an asterisk"; + stripPrefix = 0; + sha512.run = "bb1939b53b892744c323bd28f84cbe07d94c30c3f824e9d611f8b044fe8b9b07990fe7709607e7212ac8252d6eaef9a989447f270e26f16e074af0b9bd92cfd4"; + sha512.doc = "31b443d1ad05880fa5c6878fed144a2b1cf20fe855188ca8d879c5d18b7285f16dceb76b2ab7dd6be2f401b898752a674f810af6d3b9ff906a6cd75a80cf51c0"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +astro = { + revision = 15878; + shortdesc = "Astronomical (planetary) symbols"; + stripPrefix = 0; + sha512.run = "8cf59f7de3ea5add30166fcd4284279582cbe6199bcb1ebd540688d03c03ccf03aa740602cfad11af9380d970ed7009e6bfb4e96c56d26036f872e82c02739b6"; + sha512.doc = "df4a06e10e9a438393c7e22f746618c5d760a6095e285acd0b2918f58e234a1eeca9b49597d381a113cdcbff0f13e4c7108b9b400afc81e81757f4400ea484f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.20"; +}; +asyfig = { + revision = 17512; + shortdesc = "Commands for using Asymptote figures"; + stripPrefix = 0; + sha512.run = "f067e6aa1f3cb481e07f59781fb7d4c671a0b21a392ca7830d7fa19ed7a198fefd5ad5104ed3644eed484100871f9a8d36d1ae6e31d55487e4ff2846df618e9b"; + sha512.doc = "d798066b8c545ef385a75c81d431c169668bd10ad072bc3e0ef1db7c0df903d51e9dd9ac2d482d109b421a868e9cbff577c18f52a7b4520b32985fafcddb66ec"; + sha512.source = "0a62a885334ec00b04e47ce4df391d170f286cd90e7d68d940d0f3ec09018ef87f49ca793508592cc92268c1346ae48a54be65ee601f2dad7dca82778c9f7e39"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +asymptote = { + revision = 70583; + shortdesc = "2D and 3D TeX-Aware Vector Graphics Language"; + sha512.run = "8c147b714c3e57c569d9d93815ab6ebbabbd9be3a24b0dab724c32075d51e42f49f326de2babdfa6894056948e5904ed1b86cef88742d000e8b4e6244be868f9"; + sha512.doc = "a81d20288e4c7b30c50fc32e5e28a30b5fa81ad01564c5935489c2b8e4749bc13871d7551927345452315d18f81102232ba35dc3de2a7415bbfb14d7fff12d83"; + hasManpages = true; + hasInfo = true; + hasRunfiles = true; + license = [ "lgpl3" ]; + version = "2.88"; +}; +asymptote-by-example-zh-cn = { + revision = 15878; + shortdesc = "Asymptote by example"; + stripPrefix = 0; + sha512.run = "34608d6412d7936a15bf649555683ff03c5021e1688c99285a6b7ecdfc3a43eac4ed32108626243d6e9b07c23c557f07762897a96501a27412c7c5d039747553"; + sha512.doc = "a0087e5be69962c671e1972d9e7be12f76be64582182afe042693cbad92cf3fd027422c605dcf7860cd2e61f0b925860a50e94523b9ae2d1af7a8aa6d356c3a7"; + license = [ "gpl1Only" ]; +}; +asymptote-faq-zh-cn = { + revision = 15878; + shortdesc = "Asymptote FAQ (Chinese translation)"; + stripPrefix = 0; + sha512.run = "1efc7098392ac5cad5eeaa0dcf527bd158e3f7497ff1992603b833ff63d5cfa61fe5e7bc33c5cc0c441c13fc03dfe1e18a334411be6ad2f5acc94c902e9ccf2c"; + sha512.doc = "b7dbcf256cffae9cc8f5027934946929b4be7a8794fb8364892802eeff4e7cf970ca8549ef442a35f173ada61533b51c2da301bf2ce931107a7ce0c564ce0c60"; + license = [ "lppl13c" ]; +}; +asymptote-manual-zh-cn = { + revision = 15878; + shortdesc = "A Chinese translation of the asymptote manual"; + stripPrefix = 0; + sha512.run = "c04fc953a0a9035c238b9f80873d9fc605b23b322e898ae55b8eda7537f0172076e512022b163e3cd397ce2e4e721afa2e981454db53511c1a7347a017185df5"; + sha512.doc = "0f82e25773a14b0f81b34354f16931834d0496b2c6636c498c6af686f46e7ff93a274739a1a4c189433c9df1ae91ca010f0887081c81f2ac9006a105c7fd4ac9"; + license = [ "lgpl2" ]; +}; +asymptote.binfiles = [ + "asy" + "xasy" +]; +asypictureb = { + revision = 33490; + shortdesc = "User-friendly integration of Asymptote into LaTeX"; + stripPrefix = 0; + sha512.run = "a1ab37814223b13bf49d23c527543cb537e2224335e727e07e1f645a7f76a2f3ba1a275073c775463880b0e258e716b6b00d0df29ca944f1f22b3ac70aef4378"; + sha512.doc = "68b060950fdad080061b8d2c1a91726d0eabee9aaebe322e983e0dab81df30c65d9d7d0cf32fb2847f504ede155f2c43f3ba8c00073fa425bddcfe7d47a6f000"; + sha512.source = "883968dc538186507f4e81a466dd980b8a8a3ec088e25e7973c62e949871c79baeb909ef64815720004d503cad33d7f9de6c7ca0950cc0618ad2111e92870b73"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +atbegshi = { + revision = 53051; + shortdesc = "Execute stuff at \shipout time"; + stripPrefix = 0; + sha512.run = "7e03a9a73d8790f6603d53c11aacd01fb7108546e2d3b6ddbd5fce1e42d68ed9c23dfe41794b943eeea67ce0c598851132dd23faa95289789911cd059a8caad8"; + sha512.doc = "8f6402dd0f36d4cc4a4674c0d0b37f012a7d6e557174ca3b58a7a2b33d89475d1e47028cc39d2b77c496bfae0751275369c5f4f49cf53b8c36fb60fce47a6bd3"; + sha512.source = "8eee629abbe71332a00a7ffd41f8def262baef4bdfe9e314a4afa90015b30c77e291634f3e83d904646cdbe4820e3c6e0e6398383892ea26f62ad348ac2f3409"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.19"; +}; +atenddvi = { + revision = 56922; + shortdesc = "Provides the \AtEndDvi command"; + stripPrefix = 0; + sha512.run = "49b0a69eb308e19e3ed97406fc1ded6e80f15d7787031e2b71cc41ca2e1c74c19d3f3832ae13c5f1af70abf9f2f201c9a7ef669ed2e58349a584ddc767059c54"; + sha512.doc = "d60dae681800be4495c2690f78513475d98a4480364306eb26c16c551b0e984f135aefccdcff549e6702b2b62bb185ccbdacd85dd3c12e5b20c128d9397c0e8c"; + sha512.source = "a2c6321e825629a75d745f0bd03cab168fb51b5c33d5d256a621847f27ec2010f0331c37644e95b2ee40604d68cf34772a3dde59b6c6fe340713c0e593fc318c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +atendofenv = { + revision = 62164; + shortdesc = "Add a custom symbol at the end of an environment"; + stripPrefix = 0; + sha512.run = "04a6c644b9235dce6495c46e2bcc093c03dfadf279d354c8b43b81a0b4a14daae71e7105642bcc95025c55ce92094c01292be2fc379e6c0c720aaa9b5a21ca9b"; + sha512.doc = "22249061d4340939e597d50a5ae4c09f8b4514ddcb0862003ec7fff7006bebb207b5926ffcc0d723190b409435279c815a5880c6fc989294f26098c3db15d1d4"; + sha512.source = "7b457f3643595f98138aeb25090e7cfc98f2d613689428559aae60898f81d586d509b7124ad3fd77383f9524f8611ac8bfcd361391670cd689f1025cf0078859"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.2"; +}; +atkinson = { + revision = 64385; + shortdesc = "Support for the Atkinson Hyperlegible family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map atkinson.map" + ]; + sha512.run = "8b763a29fbd529b91d586e00f13176c1cff3777541816a02913e57e8f8586357331615ba4d16549b9a98a0e049a42b2f49af39b3f950fc4845a46e37435dce2b"; + sha512.doc = "f5bcfd015fc4292f4568e9d960e921739a9ebcd8f198f648323d475f6ae5d803d3f0ef77d368fa9fe36f53947908e4bcf1cfbdbd621e780221c5e8432ca9db05"; + hasRunfiles = true; + license = [ "lppl13c" "free" ]; +}; +attachfile = { + revision = 42099; + shortdesc = "Attach arbitrary files to a PDF document"; + stripPrefix = 0; + sha512.run = "526a279f3fcb309cb117327f4206e7dce8c49d39b85a846799bdfea5bf453d2f00e14e854a74d544e49fa92ce056cd8ccc7e03f56856a8e8562b7105d5fd19fa"; + sha512.doc = "9f9e6572e70d348e1db71254a0c6a80cfe76b767801a3c18ad4517577b793b5388367b24f311f491f0dde8df38684b3de4a2ec7e6db67f1fc1ca7b4a9ce5ce78"; + sha512.source = "a4bf69ed370f495f190abaaed8616b4a3ca14184987c6c4882451ec4dd6961b827d3c38d8c049ebe73954f5fe205f727124e447d2e3cf17abe1d95336371b9a1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +attachfile2 = { + revision = 69505; + shortdesc = "Attach files into PDF"; + sha512.run = "d741265618d75ab69a28983338276abb51382d797664bb9aae5876e054307e438b854b1981245a49b3b00052dfe6144993a465e56f1e9e1abc142d9dc78512de"; + sha512.doc = "423718fc61b589d83da1cc0188667c8253b19d9a255f867a8c8a56e812d2fd04046aa5859657a0af88d5c377dc0b0f0fcb2ae8058e7e69ad9ef2099d0c8a7d5a"; + hasManpages = true; + sha512.source = "72f0f9292fe0588d4bb9577e42002576442d3ab19b3ba8eadadb6c874dbace9065a3e74a7818af1055bfa09bc9cd74d734152c95710e3951166eec385414aebf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.12"; +}; +attachfile2.binfiles = [ + "pdfatfi" +]; +atveryend = { + revision = 53108; + shortdesc = "Hooks at the very end of a document"; + stripPrefix = 0; + sha512.run = "2a546be6d2109de9db60e94bea3a63a3c7af8ae892c8540a1513fbe4bfa505dcbdde9913b7a4449727df0ccf6957f8010c5b76abd8d6310c118b269bdc7334e4"; + sha512.doc = "5c5948ab7f0ca213bb5fe3ae056cddd392461911e2af7dfff133253f6aae970d525fc752f154921de2186c8a443fa4f90b18d23896a016ebc9ea177d6826613b"; + sha512.source = "1ec0c4752df403e47c4f8d4186167ccb59d2269012d904e9de1ec54acacbdb84b571f5bd1e6b645f7f86972178db2793853701cfa180b66ae7edc1d1488958b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.11"; +}; +aucklandthesis = { + revision = 51323; + shortdesc = "Memoir-based class for formatting University of Auckland masters' and doctors' theses"; + stripPrefix = 0; + sha512.run = "54c6708b343c2605d7779561fb086b914f1a7a825f5556b4a36faee0c8ad29b1c8ed67eaffae223c5e5d47bb6e6a9aaae4c0c658debb7bfd196d9362ae7b8796"; + sha512.doc = "ae73abe45b0aecd033df666f3095486fb29252449e840e9a978cf916a2eeec4a126be8c3ec60379408bd6f7322c8794ba1fa3bd77e45f1723affa18ec109d93e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +augie = { + revision = 61719; + shortdesc = "Calligraphic font for typesetting handwriting"; + stripPrefix = 0; + fontMaps = [ + "Map augie.map" + ]; + sha512.run = "a862fc140ee85e9f48908e7251dca78f6f328bb194bc1031ce7b521feabc62bb148764e7574341b9ba39a1bc76bb4a718c3cfa45bba7480aff168eb17661d74a"; + sha512.doc = "434c1d88522ae41e8a41fbeda6685a059fafb8f6cdec26d8737b5f6a6ddcf1e4f2a443ffdffa6b62a74f4abd2ed2e947176f59e64bf5691debeb62d9d54e719b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +auncial-new = { + revision = 62977; + shortdesc = "Artificial Uncial font and LaTeX support macros"; + stripPrefix = 0; + fontMaps = [ + "Map auncial.map" + ]; + sha512.run = "625ddb6342c2ed4e5491e63ae13619b18892bc5d2cc005aac489cf1b6d193a28acdff9404f51b4cc76e8950ac182a4f8d5845bad85fd4c4afbdf33e7b8c225b3"; + sha512.doc = "4d3880a12e8dab72fa5278e4507bdc03786cfe94bfa43e81068629327d1e70a251ca58c7cbf6c58560c03b9e1e4d79257a674370e89c780f5c81589d54084270"; + sha512.source = "bb35718db33f7c4cb6889570def1b4f8a47e05896a14c8867ff7dba362028017d4e64d66b31e2f2cef45b749784704ea6cf9c1731543c3277496fc6c128b08fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +aurical = { + revision = 15878; + shortdesc = "Calligraphic fonts for use with LaTeX in T1 encoding"; + stripPrefix = 0; + fontMaps = [ + "Map aurical.map" + ]; + sha512.run = "1c48c36d6121005c123018cfe1266783288572c0ce8a9ea4b9b47ac28f46206de61b7a73804121f9a57c056c871c547c97ff10a529fedaca57bcb3ab78f3bea0"; + sha512.doc = "89de4991373a50d673f569e72f4727bd66a2b40b385006c3c7e4605812e7f8d3d346e3b08be55241f9926a58b40126d123d6ecea912d09db3973985d0cf9e90c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +aurl = { + revision = 41853; + shortdesc = "Extends the hyperref package with a mechanism for hyperlinked URLs abbreviated with prefixes"; + stripPrefix = 0; + sha512.run = "4688987b83ae65e15a74cb7960dc990710930186ec94e376cc3a74dfec9f6d75a51babd99438ff87a5f6f8e05cee483b569fabe627ef00fb892126f74749649d"; + sha512.doc = "a58f7cbbae262c7650bc5147b400f25f0c666effdcf37e565f665092d1cff820d2d98652947d36f6940b8d16027336b970ff88ecd9f3500d9a39a45eb4a19acf"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +authoraftertitle = { + revision = 55889; + shortdesc = "Make author, etc., available after \maketitle"; + stripPrefix = 0; + sha512.run = "b7496b1ff5dc7544afa6e2181b9c86814671d42603c1f9aa08cc6d45e02dc402e225c44fe554649251b8cdb3dfd81f1b0fb245cc8ed56204d2bcad16e5e9f9bc"; + sha512.doc = "a1cda29730615ec8b81082f14462c5864033e1b4cbe0b071e5cdc6d9b5393b2e701ba6e6665963170bb99408f03c8fae38fc17aeb2de83fe9c8fbdad8273482d"; + hasRunfiles = true; + license = [ "cc0" ]; + version = "1.0"; +}; +authorarchive = { + revision = 65777; + shortdesc = "Adds self-archiving information to scientific papers"; + stripPrefix = 0; + sha512.run = "d5695336d18c4b84ef2b611b9ebcf502a974ed884625a2296666fdcf54a757f6682c0f9689713d134c033b1a9cf743218c02b05c0b2217c5c2ad5eb5d29f21bc"; + sha512.doc = "e8ca021be201da6cdb5ec980f3724d38d3cf4c5fa4be8fd08b286ed9f0ccf2db1f0b8e3f14e3cf6a591afa4c71ca4cf3f962d7a09466000377d51745b6600501"; + hasRunfiles = true; + license = [ "lppl13c" "bsd2" ]; + version = "1.3.0"; +}; +authordate = { + revision = 52564; + shortdesc = "Author/date style citation styles"; + stripPrefix = 0; + sha512.run = "c67f75eb92a937755ef0a1ef0896ae3cc1c256008d864572503d3e9d3be1321d25be59e76d4d3ae443398612233a328b1d6e2da9c103f41b30eb088208701308"; + sha512.doc = "156fec304fa95388fdbb386153482016a4d78d4862943bcd6124466b12df920498d5b42446465fc0f70da6353f58c329a27a822efb5cca8f0c4d7fdcb3239a02"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +authorindex = { + revision = 51757; + shortdesc = "Index citations by author names"; + sha512.run = "75e35298e4839f3975824624c7367504a26dafdf4b8e1d5238e2575c821f652282cd9a6e58fb4296b2c0345ff104dbd2281135776718fe4d2ecb76110946ab9f"; + sha512.doc = "a6c48d89cfd854d8acae47e318bc3951f8e81434d9a81901c8a7b7f1c25188afb013b94780ceb201e81b5d10efb7f5c24f5b5e4c8d8379aba390431707bc4d55"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +authorindex.binfiles = [ + "authorindex" +]; +auto-pst-pdf = { + revision = 56596; + shortdesc = "Wrapper for pst-pdf (with some psfrag features)"; + stripPrefix = 0; + deps = [ + "ifplatform" + "iftex" + "xkeyval" + ]; + sha512.run = "5c1f85a0ec5aa4173181b087a1f5f8e30be6d8c21c3461999a85b42032d45292aa6f8aae4922a5e97d073fff5b2c9d114cd30f5d5bb73ef523718e891ce59473"; + sha512.doc = "73d6f4b2e298eedc537a46c1e69bce9e160eb28e6bc2f631596a4fd3aa658d8b51d6dfddb6748b7e629fe564a2ced5e55bcd766650616d936a4197e368b2fcd7"; + sha512.source = "199e9fefcb2f96f1ad9e33abeecedcff9c72f20614c48951197703ff65901763ef88f425af08021b1843f30c3ee8e3a9756095ad4b165772b829a29c6e5515f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +auto-pst-pdf-lua = { + revision = 66637; + shortdesc = "Using LuaLaTeX together with PostScript code"; + stripPrefix = 0; + deps = [ + "iftex" + ]; + sha512.run = "7d9882f2c80021409602f343e99dca9613f060056614f2fa8445b4f427f53287c4eb95af0a252ee3cddb2d6b47e1ecbc0ee3032dd55c209eb946b686f8037023"; + sha512.doc = "ab6cc1b954ff26f5d7b44f12cffc7aa2d5ac1aa64e37a68a5952616debeecab0e34dd2bcb6e06a3f49e90d45e9b5f60955d8b62cb8d124ae35625b398e97fd44"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03a"; +}; +autoaligne = { + revision = 66655; + shortdesc = "Align terms and members in math expressions"; + stripPrefix = 0; + sha512.run = "b590b6f43bf17d54595c3adcc6de0e5c6780efd8ee68efaa5c2990f3e9e79ad6844397d6c7695d3ab66d72d4eb592c1455e4234f7a40efdbf4c788bc45216442"; + sha512.doc = "d043ed183b3e30d35f7d4e6a5b5f094ae5bddb4e2265294c02c0888cf2e78fceb16b14cabb5b5d759b5397f58da1111d5fa590aab89a59ce13e3e13fb2e3dc91"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +autoarea = { + revision = 59552; + shortdesc = "Automatic computation of bounding boxes with PiCTeX"; + stripPrefix = 0; + sha512.run = "dadd69326335b6fe6e425a867e2e62a0b1df2f3179801bcc726c6ceebc15c24e3a7c9ecb3034209e25e503be47a9ad8639addfb628f720bd0c0d64c15177043d"; + sha512.doc = "1b0f6ab0c7b1c69b7a802e9685db50e6b54361acf68ce2c2803419b165be1dd01f52a5b3fa9ccbe273e859509f7b7faa0c7c6b88bfec8f51f0bb66adf7b94e90"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +autobreak = { + revision = 43337; + shortdesc = "Simple line breaking of long formulae"; + stripPrefix = 0; + sha512.run = "91cc17692654270bba9536ea9186ffea2e7e9a6e9dbf0ffcd9821c8b3ec470ea3222af2a1df05d85e47d65fc1737cf2dbeba150641355bf826e5ad2da90db059"; + sha512.doc = "0d06f75e6f4fb254463ee2a075d106c14a06c5f7fc25b5047fbeec0e48ca9faf6e136f098312811329db1da5f9fffb6dfd45abe6eea9ecf682f4fe99f0384178"; + sha512.source = "7120382c7974acccf1a49548ad8e654b945ae2ecfb858b37ca871fb7b5b054d8554c971a86c511d03e2ffa91e5cbc6d61cc743da51b0a9de705f74c0b9c2c7c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +autofancyhdr = { + revision = 54049; + shortdesc = "Automatically compute headlength for fancyhdr package"; + stripPrefix = 0; + sha512.run = "3ee2452c80ba671414a1669e0c47c7069189dcc0dde97bb33f94e77251b2ac8511b7cb79fd5866c2d3acfbe7768e20f715e61a6303a847ab82564743fb8d2a2f"; + sha512.doc = "1fc9ac9d47d65eecb1a6736aa5fb148a6309fa64cd18053b038483d484f974f3f1aafe8afb03b88921ab5a990b78a2aa9dc6d7149884a550c57340218f72159a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +automata = { + revision = 19717; + shortdesc = "Finite state machines, graphs and trees in MetaPost"; + stripPrefix = 0; + sha512.run = "09026f967084d5f1804a32166e854ac410a768f6b4654d9ea9bb69dd29acb8a3199919daa1fd6dd48963ea5d6454b9b9d8263939e5af81a8f07f66f08b5f4835"; + sha512.doc = "49c6515e979a87ce270d32b367c5800acffa4b638a8bed3e20f3e74387c2e7ee4ae0c2ea8b232e2ae57d0d0a730424d18911835581c0c274732f3d36f650693b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +autonum = { + revision = 36084; + shortdesc = "Automatic equation references"; + stripPrefix = 0; + sha512.run = "3a663a53b4b4b53515978460dae1ac275cc4e3e6981b008c78b875e3e47af8abd950cb35f6e416ab02507e498bd75d6f4a775e2b429d668d02ebaa4bfdd03f25"; + sha512.doc = "2d0c515fac8afb219aaa1ee270b30bac09bcc310afcad71ff6ad2a3448187733718c03c304c09a0d631595d36043dc3eb0b6849fce0e4c3bf7f5d249b15c99c2"; + sha512.source = "5c20017e3008ea726979ca70272923d9c62a5c36367fdcdf9d62e141f4822201e2cd36a9b4c58a6591568669daca65d17cbb78e5382c01ad4d624da7074f4010"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.11"; +}; +autopdf = { + revision = 32377; + shortdesc = "Conversion of graphics to pdfLaTeX-compatible formats"; + stripPrefix = 0; + sha512.run = "f855fbe477986356d34360876a4a6613638255e234ad0210cb035a1f3a9b9b827ea140654e2001aa29ac09d7b8addf8f872d34bdb4d1700ead2f6e6f083cb2a6"; + sha512.doc = "d2c2ecf193f03f4f568d2304128e50f5cb5964a6c0a2ca8b739c59b9d3e80637134b5ca91e1b5c1971db11eb54a086b3eb888b6984050dbffa22a166c6757e39"; + sha512.source = "fdec2bf2079746f67f3ffb790eb2e10a7dc884fbf68b2c1a6ec9c67ad0ed411d9ff87baa89fc11dfbf9172bfcd81b411d8aa223c209def4fda6c91a4a9d32ed6"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +autopuncitems = { + revision = 63045; + shortdesc = "Automatically punctuate lists"; + stripPrefix = 0; + sha512.run = "d41c5054417b511487beedd379f480f3869e67b747339837df5bf029b58171791ac8cb1c7bcaf5301822ba9585138d68af5ca080672d4ed1026086519fea1aec"; + sha512.doc = "9c88cdb757a53e89bf7625fad0623154ea6101ee8c9cff2679698d0f6144d98a6099a68ef3fb1a31e99e7dee92572e34654321e44496e863f1444feab8a6cb1d"; + hasRunfiles = true; + license = [ "mit" ]; +}; +autosp = { + revision = 58211; + shortdesc = "A Preprocessor that generates note-spacing commands for MusiXTeX scores"; + sha512.run = "67587e8b456257be9b924a5bb8c8f4def22fa9aa9678663975ef74e346dc186ae7848a9dc043733cf1244f254750ef4f34204575f62195d4b966ed8336781bce"; + sha512.doc = "2905669b9e2b61749cb7b1eaa02be889c4e8d8adbd78b126e7ee6d894f24f623c888a24abac1d163f3332c5cfa9cd1f64d0de95200350b88a7f47faeacb841a6"; + hasManpages = true; + license = [ "gpl2Plus" ]; +}; +autosp.binfiles = [ + "autosp" + "tex2aspc" +]; +autotype = { + revision = 69309; + shortdesc = "A LuaLaTeX package for automatic language-specific typography"; + stripPrefix = 0; + sha512.run = "f7bbb705f28bd5f546125118c48fcb2e02043ddec76ace5866206a3b047448740db06537d969584197de375bc195a8ac5712eda8bc00633befc102eee7c4e538"; + sha512.doc = "a64c7184ae642968af2ff85a08634b04d526051f798c16a2d3ac1c42f7a948de11fe5b83ec9d208733a7e2fedb190c5175bd253d811c9a6838a5a3ee45768317"; + hasRunfiles = true; + license = [ "lppl13c" "mit" "free" ]; + version = "0.5"; +}; +auxhook = { + revision = 53173; + shortdesc = "Hooks for auxiliary files"; + stripPrefix = 0; + sha512.run = "8ea845a19818df2df7939031e7b251b4b4d99a17c0d1b8177a592275bed6efdc660266964e0639222b86cfdd897bcf13302f1477b997ea1a06179cdd44aff0d1"; + sha512.doc = "7c4f850d93f8a6d25a35e762bdb2df26384c75ba1cbaba06806964737badb2f7c8ba3192c62df7e7f3de12c6fa117ebc525c735e696a9cafdad943a8cfeedabd"; + sha512.source = "f378f365c8fdee267224d092b35cd2bde971302cba003edd24b3f0a06bbd59e077096580e65480cb66adc6488aefb688ea423d74334976dfc92168688514e0b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +avantgar = { + revision = 61983; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map uag.map" + ]; + sha512.run = "c08c987c385bf9eeca0f4f5b7edcd41570c81f18751593824da8eea770c29d63725bed100fa2ff37a80a5c70086533ddc1e91848d5ddeedec3c5c669907ed20b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +avremu = { + revision = 35373; + shortdesc = "An 8-Bit Microcontroller Simulator written in LaTeX"; + stripPrefix = 0; + sha512.run = "2541e80c0dd798675164cace381730c75268d5385883163b67230d49022f16c9ec72a77d602e8b5094db31b1d3aef2f0f71da91ed2f7eb7fe1039117f7488cf3"; + sha512.doc = "12c97e23dc853a971b27258a7666753d019620e832a06b10a49a26f0f30d7c6fde83c0e328e1579b62376f2e9cd10b0b3950fd6c4ca89041a988fedd4c604acb"; + sha512.source = "1d6a7f16cacd937490ae5e7416f43f4f9eafbf053f6e35d498a26b8d4092ffe79740a12d96503ee5636c4d1d8b3bd02653b4839b957cb91cca672914bbe98899"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +awesomebox = { + revision = 57349; + shortdesc = "Draw admonition blocks in your documents, illustrated with FontAwesome icons"; + stripPrefix = 0; + sha512.run = "4984d58669576137746518b68988fd9837b5ef133eb8da948f67bb0d5f775ad961055871bb46084e420ef0564b6a4796ba81a093be93f667f959a45ffc0c6174"; + sha512.doc = "eec717fa5bb5a0f0d15cfc39d2172f8818718f6c7037fe962a0e811c131cbc91d3f3167077ec413d565e6b0b782f5b3f77b38257caa6529a6f5db7da8e163c3d"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.6"; +}; +axessibility = { + revision = 57105; + shortdesc = "Access to formulas in PDF files by assistive technologies"; + stripPrefix = 0; + sha512.run = "9b42a40556f3432e045ef35b23fb7fcb6ff295064645e5b9331d0ce99a8f2bd232d0926b46eacb5598da112dfcf3673225efd655573523dd504767a06a42686c"; + sha512.doc = "f3255c9d6b1eb75a501e5c36cece49cb72767e467c0853465d2b8a39f011138d7154eab2fa5287f9223b4f535aad5c2db25d2f76c286376499c71d0ffd120699"; + sha512.source = "c5ef10d286eccf16b270c8b487e91270cafb09ba10a88a8e0c925485a380c18002d399857f7dd42978aee72f7b1889c5dcde7ffdf2f5626424f31fd99a452ff0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +axodraw2 = { + revision = 58155; + shortdesc = "Feynman diagrams in a LaTeX document"; + sha512.run = "bc9923a9614ef9d7bece20e682729347dc942470a927b40736d6868f02867408b5fba51b117edd8745f96df23b9c1e93792d321291db13b7fdfdae0ee32bb7fd"; + sha512.doc = "927e42358d543f46ccabb8184e35b6f0a5848783ce9eea09e6c780fc83955d5f37b998254153b1954cf1a59be6cfe573a6c79c2c328ab2a22a6e5f6764a50fa1"; + hasManpages = true; + sha512.source = "3c2fbbff234836ffe40edb7f38c77c5986cca7fc68b3dd7672bb4f1ce9327a12fa8c51d38461d914cd6466bac8b2b578a151d09d4e84dd903530f7a545d707d9"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.1.1c"; +}; +axodraw2.binfiles = [ + "axohelp" +]; +b1encoding = { + revision = 21271; + shortdesc = "LaTeX encoding tools for Bookhands fonts"; + stripPrefix = 0; + sha512.run = "b33280f64e37f300c92f9bad4372c13dd34e3dbe5fe47f2dc9fe0e270f33eaf5bedf9485293a74a6e0eb87b65f44fb66a286fb279a3d2c390c463e6aecfacb57"; + sha512.doc = "4bfac8bf2a00dc61a007c10654cb7fe539c111170127934cd3a64ecea9ceed3fd04ac249cbd645d89400bef6f4a3527d1db04baa88eab88eceee2edd48e64393"; + sha512.source = "7368dec012e7dd9fd948856aa0b901be48a5800dec417a1511510e184e7543ae9d76acf46a12ea956b1b27367b41309923ce5ed3bdb320399572f5dde737543c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +babel = { + revision = 69742; + shortdesc = "Multilingual support for LaTeX, LuaLaTeX, XeLaTeX, and Plain TeX"; + stripPrefix = 0; + sha512.run = "31b2c697f13df80472f5a209bb3b23ab7458e99c7329728ce767c1c116b7706465928541bb5b2f749b6e6d1ced4f43b92dd432e42c03660d18271a1bb243b2e9"; + sha512.doc = "fbe053f25e6db1df9856c03813070842dac62bb9e4e541a8ee29e990ea52017824cb260d8fac4f8a9002d8d07b3dc0726795659b73e7c58db3c9f6b8b84c8b05"; + sha512.source = "f71762c2f2062e92e74ad661bd3088b8e1102320c5e54e68be419b8f96561a1e93399204bb639e3416a081c651cd5cc198995d42556655772831766eca484da9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "24.2"; +}; +babel-albanian = { + revision = 57005; + shortdesc = "Support for Albanian within babel"; + stripPrefix = 0; + sha512.run = "8a98ba1dc08bc2bdbba0793bda2a07a6c248543fdee56cbb047229d1cfe77cdf616c0ef023b0a74f877d9863768065f0e256ba35a1071e0dd3f2bbf2b47b7ebe"; + sha512.doc = "d26b9d933bbf0225f79bd8180f9dcc2961ea481fef7b535267034296062f8879b53ca47ed6b512fc724b261276be6d92ce045ba0c8bbdba0149cca6f117be8ea"; + sha512.source = "74212f36288599d730fafd00dc50839cf0f12283ed8653303471d2cb64a57217b4792f1000cb44411c7d5031e4597db67368964ad318e896987103af8e21f838"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0d"; +}; +babel-azerbaijani = { + revision = 44197; + shortdesc = "Support for Azerbaijani within babel"; + stripPrefix = 0; + sha512.run = "3f20954607195d4804b4bd90d7fe5baa209d5ffac6dfbe5f758306bb7c8aedd1c4c92675f5dce7f634e7ceb2b65e9c3ead0ebfef730bfe2dbd8c0ba17d3079b0"; + sha512.doc = "bfd4434720b9676e253f69144aac9a07d6bd19e3a4418ae74269df70085391444ac46556928f131a14e85b87211fd76521b67a457e7319eedd3781a215efd962"; + sha512.source = "b3eb9fdbc08643706a2dfa50daaf27a687c593900a972f89029aeebe08e2a1c4fbea08a848224b198ba447d3ad3a62459aeb9db2c00a0f3f039a16c863ebaf0d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +babel-basque = { + revision = 30256; + shortdesc = "Babel contributed support for Basque"; + stripPrefix = 0; + sha512.run = "40079f02225f81c8838aee6179548f3fcb773fa8e031e07f30df761f298b9980e3a4357a8013bd7802c688a192cd9ef2102be1b6e8e1f3efcd68769a9e5a5a2a"; + sha512.doc = "e6342328d62cb0232d38e10b3b38cd4d75c55a5d31d702c167099a2bd4122e40c5e3cac8a9c2940a9f9893d7aa2594b8322cf469924b97e903cab970dee81c6c"; + sha512.source = "1c924232920a969fa48e6d61bcdfc5150cd1afcef6d98cdd27fbe2e0acb5b7749d2b2dea77db88125128b380f2b4ccca4d49d1d140f2e96880e0daf2d09c2d50"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0f"; +}; +babel-belarusian = { + revision = 49022; + shortdesc = "Babel support for Belarusian"; + stripPrefix = 0; + sha512.run = "5856582f8bf6a98a4fbd560bfca82ccb226267e249f0caf8afc775875d50ec204ea613320534a63062dffd0e050905adb24763a95fec2ef4e8faed70a400d976"; + sha512.doc = "247d5a3b99cd5a377534a94fedf47f6710d32d875d3208b1516fdc9acafee70a14ef1dc37600f9da53f806323d0519ebb2c4e288e471363756b7b819751373c8"; + sha512.source = "82262f7775c22a908161a7a2d65caa8662c62ad759db792a6718dba043804b7aac523a8f3eab2dbdc3882a88c55bb641b862f3f19e9c4d3ba1a0f4298db9833e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +babel-bosnian = { + revision = 38174; + shortdesc = "Babel contrib support for Bosnian"; + stripPrefix = 0; + sha512.run = "bef1defaacf5232bf9cce6c1a9956c9a42d35a2c2b6ddccbcca3938386f4f4a61a0cbcba74b930dfad18ed211374c3667120c6706ebf097c56ec3c5915ccdff2"; + sha512.doc = "84238e6b38021582de93e9fe934bf608e647c9b4cc0a066b4fbdd2ba98c8e6531b653907f9bcfb79e6afc9074b4a079b5e419db25625d40a76a8ca8e55e81ab1"; + sha512.source = "dfc18e55b30620e27cb8809259a6b4790b94cb98b334a69cd48f66c25696e2df8d38dc5a1d402ae8464ced727752d96d8b5abf18522c8bbde4ce1f6f8ad73c92"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +babel-breton = { + revision = 30257; + shortdesc = "Babel contributed support for Breton"; + stripPrefix = 0; + sha512.run = "bbcfa22674ca1d4a8e23f179480f9e94a50d5b460b8b0d27365c9166adc02a191253ef2d61d6f5eaf5bc61e73faf5d307378898f1d6b1b748448bbd8a36ea141"; + sha512.doc = "3b47653b26901dd4aba1395c61c9dc01d43ed490c70ca04ba7d1cc67ba7b23b658db32b7a5fef085b236a68bcd009dc5cc5687e3dc2dc8d246ab2ccb8d391b42"; + sha512.source = "8f381a3955780617f9738b008e6f4490632a67c70f16d4855f15ca59981dadaf72f7f15cebe10a121bcbb894006c738ca1872fbe33bb256c8145b22254236b67"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0h"; +}; +babel-bulgarian = { + revision = 31902; + shortdesc = "Babel contributed support for Bulgarian"; + stripPrefix = 0; + sha512.run = "0c838e5c5cd010fddaec385376f9eb5fb10730e918dd28f58987f855a444d91ed2e66c0de46c74637d134d72f7e348e538836df33f6255a14ed51d0e8d5e8a3e"; + sha512.doc = "4dcd92a2088e737972f0663fe5161883cae901dc82aafd1bd33f2d80a852fb51d6229c95cc655826bd17599a7152b8a7bf0031eb046530a135e8bc5c9c74b2dd"; + sha512.source = "047f69cbdedea9070a002782e8d1b893aae71adaa2e637df560ab8a176308faf8d1b8b52afda8f38f264783077a227176eacace9484ccc0af2a4a7615460c7a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2g"; +}; +babel-catalan = { + revision = 30259; + shortdesc = "Babel contributed support for Catalan"; + stripPrefix = 0; + sha512.run = "728d847331f1a00766cfc2818691516234b153182f31ad2da024ec3194cc384a41ca89cc67ce66447191188dfe088d1dc4c8af3b2e6952931ec7eb58737c4bca"; + sha512.doc = "3184373d85b1e9bd76588318372ced328d2ce7f6d4f45bc5634671a88314d1ed18cedd968e59dd5203b4d77e6d3576f36a654b1a8bbdaa106d47cbdfb825e452"; + sha512.source = "ef15d0aca46af936141fa2d47c6b794ce85f2c3fc9adf18b5ca4b0267292f24d1c02121d5189f7cc9db98e0ab22a5d4ec2febc32b2bec5c3c5923598e869878c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2p"; +}; +babel-croatian = { + revision = 35198; + shortdesc = "Babel contributed support for Croatian"; + stripPrefix = 0; + sha512.run = "b5724a84cd180e9de79136ced8bd38717dcb4e932dbba4e20fc071ba9f50fb35cebe83d4a95ec6e8ef0e09a02732cbdc8b1a71715c8a5967393f54087ba4a807"; + sha512.doc = "d5e40e95037c3035589b093037c563b3737e061369f27ff5c51d620e0655dd075f413b91434591e2130849d641c1ac59469db46be1d8b0761075424c468668d2"; + sha512.source = "fdd4efb6d24bc9560e14f9e02d231ac636f2f69249d7dea9c07b337f0d5617c754bbc9087bda5cf1f2da6178807e46f015658b3fc2d04ddd5749dc2643ef4ed0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3l"; +}; +babel-czech = { + revision = 30261; + shortdesc = "Babel support for Czech"; + stripPrefix = 0; + sha512.run = "0cc0f07fafefa6d7ea1ae1b2ce143dbec124fe96b36221f1b5a847fd0b789d1974b5990ebd93b8ac0607f63956948bede25c7e690784ca7e9638f48139585a32"; + sha512.doc = "1575fbe0d70725e975cdb0c1c5ca685985d91f23e4a997af4a0db21905ac34962f69653ffe4084065bda70cfbba0f0a1f0885d3afc19e98d0045ebb68cb545c3"; + sha512.source = "1cbc5de700e32ac2600a50a85f6437b7bada601734753a8ea62b845f7500880195625e827be41e277d76137ca3dac05b230e64e0edcf1807cae2079feceff8a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1a"; +}; +babel-danish = { + revision = 57642; + shortdesc = "Babel contributed support for Danish"; + stripPrefix = 0; + sha512.run = "201afcbdb9b8d9128cece15ac8876e8d9bc261ab6c90745e52a95bb58fefea0b478a623027b097875d831fe5671f8f1f16a2370dc0dfd92ec3e603436e366e1e"; + sha512.doc = "5ed050c01207e110c475abe825e5299df0f7927476141d81cb31fcc8c6dae1076e855d3590aea0812bc2a15949231163c24f0039620f3a8f41cd43bd6a8a0840"; + sha512.source = "5c9bc598da8e782acf3a4e3ae5e93acafdad34fd68962436ee7a5acfcd7c234863db5faf9a3c2e2b87814d235883e3e85688fd0b3f514a7d57977d1872896884"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3s"; +}; +babel-dutch = { + revision = 60362; + shortdesc = "Babel contributed support for Dutch"; + stripPrefix = 0; + sha512.run = "bef13adf26cbbd16604af041fc7af866c82e88cd9d7d05318abd10f7d6f0ae718e1186f5527b4b38f1f099ba5da3d85b5e2f6d1ac0dfe8fe64ea52fcf6f06df1"; + sha512.doc = "a78535f95bbbf6228014471a473a7e38b2cfa2da0160adb906b8f75c803b3e9396ca52322100102bebc179ec1e863a78c1b102ae932ea324ea58fd57bf9e9b06"; + sha512.source = "724746e2e05c5de5184125068b2637c14c58c83f86fc92d75521089298a26290ecebbb6f0c61f7452da659dbcbfa1c36789e428aba500fa2211e354747fb017c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.8l"; +}; +babel-english = { + revision = 44495; + shortdesc = "Babel support for English"; + stripPrefix = 0; + sha512.run = "f570d2aae8a97ba0762fc1eab75dad1f17c4ac582a351ffeb8e56a136b789a38b7a6519247ba5981385f1a093101542942b3bd073a5097336392929ed40c9e39"; + sha512.doc = "77d6b482407ff24095b1076673316744374e66bdbdd7ebb767ec66ccdccd6ed5bb27ecfd0796eee210f1a888c82ad2eb4b9d2142c427bff137bd139c4cc53ec3"; + sha512.source = "ce636f5cca9aa33ad7414432fcc46fbf1873c4b1576cae8c04b8cf15381f4b6ea54e0621f297114f302ae172752282daedc0b59c15393e1071f8542ad3baf628"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3r"; +}; +babel-esperanto = { + revision = 30265; + shortdesc = "Babel support for Esperanto"; + stripPrefix = 0; + sha512.run = "0c3be27d02d4c3157f2b0df0950e0814db3ffbdb2553d2c0f176893f3669123a9130874e93edcfd86480b785bbbfda35f9246dac3b4a0779da51387b0bf12ee8"; + sha512.doc = "166c1b59511b5a01cac11b5cd76c84cfa485c2674b390a167ff165bec1326709437ee843f664fd4ac9e61338481df9e7f3026189f7c29c71778dbd1df98cd35f"; + sha512.source = "f2fcef5841400c521415c870ae1641549eb702944ebd404b96ff9d5b52ee9c2d484662a50d9b410f62e74580f37fdbd269b3650cee0572b3096e4b0365787d4b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4t"; +}; +babel-estonian = { + revision = 38064; + shortdesc = "Babel support for Estonian"; + stripPrefix = 0; + sha512.run = "03357f8b0c101e5e186fa4211a971e625f6970a3129a2594a611c74b77b36a27a288d2da518d21e6e2e5d98bb82802b2115d47e31e6258f01c003be854090baf"; + sha512.doc = "ca732f4b6ccb9ae27f99aaabc99037d9f3d04bc170b9a8bb189a81b6bc9f55fd757c5755bf51ff423850f6b45c88a5645f75a462fc9d9e9b989fa04c1a2cc7c1"; + sha512.source = "47e8d53d379ec383400e618873d800bbb6dcd8eea7807e31173110d5d7492f52cd4808a288e53534a2de578c43a5ee4eceef690bfcd56cc11e863919f86ee8af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +babel-finnish = { + revision = 57643; + shortdesc = "Babel support for Finnish"; + stripPrefix = 0; + sha512.run = "ed0dc79fbf6cd992bb5ff3df46f93203ffcb3ade34c6a613b5b22bf5effb98f78fa85d9b915130b304df71629c5a8bd68a4bab23ee772a1068f7184fa27051e3"; + sha512.doc = "c96212780651c9c0c831e295c26f678c80724e5b923d69fc73bc1be39e369a19243b42e5252dd4c0a049fa0c4d25dd611bd470b12a4b55dec4520d016c21a5f1"; + sha512.source = "11bb4bd731c27af0e11718a55793f7a22957b65e2ddc988e6e3ddb5cb6def8fb1d9ea9f235bf400beeb026f220a628effd612d04d416abeec2e1c39a001281f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3s"; +}; +babel-french = { + revision = 70261; + shortdesc = "Babel contributed support for French"; + stripPrefix = 0; + sha512.run = "5a0ad21862209980813cf8b6a89884ca977bbd2036b3e9c6217d2ae0f69f4c0e9567bf07afa4c9e75cdc6959b3169f270de38c9307c531a44b5ba07707c2e1e0"; + sha512.doc = "2af045bb96ec288d4c314da7a3ffe82c3bb3e82ca0919a272fc43cfd5946a379f951c4a019c93f0af07da647c852f25af2f026310a435a82c0888f96c84cc263"; + sha512.source = "a03e25b8f02430e117584880e2ca29802459a98dde97b380b71ffd4d2eb4c6db92cff33aea9c2bced5823fb5ec4d06b5ea428c99da85fadf9f16f3a3e5793c8c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.5s"; +}; +babel-friulan = { + revision = 39861; + shortdesc = "Babel/Polyglossia support for Friulan(Furlan)"; + stripPrefix = 0; + sha512.run = "e6210dc473c3d71759f2faf1558df2d6a7c646485d85cf0113074fb68eaef23b2e44eb88c9fd35a7a7929b408d6574f7230852643366bccd29afee744e0b2d07"; + sha512.doc = "0ce539cb0b6cc7af830c7413545f411e1291491fb26ad0451e7caf1346da9ab188a457e3292efe9724070e77f67e46e06293dbfb40b78a1328112b04d4a1fd77"; + sha512.source = "1e7e241350d499bd0bf28b1c190b3c73e20d02be12612905305ad53cead422e8ea1b6b0dd633190170d7ab2ac2802559693597a8c6ae8527a7fe83af7cc61463"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +babel-galician = { + revision = 30270; + shortdesc = "Babel/Polyglossia support for Galician"; + stripPrefix = 0; + sha512.run = "1c8aef52e0eaba8a55e6c0bdaca4ef47012012a85d38ed268207227063d042f2f0b2cbafa3d1e4d71432e3ea6effd2a781ab0aefc536276de36a95d0dc834b68"; + sha512.doc = "a60ed8ffc43cb56aeafab8d09e8235eea9482ff8cdabc00da68938d980b20a7067da3286fa8ce19eddf9276b51e78dd944545cb8bb891bc13c31cffbab39544e"; + sha512.source = "aef01bd2587b5a452874e67c52bb4adbd89c5203bbe9a338e85449831434cbcd58415afd3d31d6e315eb91dff955750753bdc9cd38e87e3aded5350a350df547"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.3c"; +}; +babel-georgian = { + revision = 45864; + shortdesc = "Babel support for Georgian"; + stripPrefix = 0; + sha512.run = "07adf0a76fb15951db5dd01a0a1595aa9c8119d6e39e94eb36ac340932f763975abe284d738a52a1fa2a938a14f87fe7ede10758529c3f68c6d573dbccbcbc82"; + sha512.doc = "b2f45e828e32fef5e4ac130230050f035ec69607c97562a835ef2157ccc6673d4ae452624d2d1aded3552eb71d85d971a7e35d9774ad7b6e4ca7a8e0a71e48c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +babel-german = { + revision = 69506; + shortdesc = "Babel support for documents written in German"; + stripPrefix = 0; + sha512.run = "372ba15d67ae4a5299a8d193d4fbe1c01a89db686c4d152ce2fef05088be63e7d85a7cf4fb712629d1ec8b21517bf3881ad3de947e03e127af940714a6d059ec"; + sha512.doc = "e4ca225a4fcb681c0b59d833fcc8a3781f1315adaf26e7db62f85aca145028f9f5f3bc7a19b7909220ebbbcbd25d2fdf2136d0f1ff5a5823e63c3362a24d9750"; + sha512.source = "786bf7b892f48e09496c99b998c692f8cbcd40c2727700291fe1cc35518c3acd1caaeb0841bf3b1d05c3ed931aaa0d7ee6cd564f40b41e30fbec0f42eac48da1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +babel-greek = { + revision = 68532; + shortdesc = "Babel support for the Greek language and script"; + stripPrefix = 0; + sha512.run = "f81c220447f77f207dee02a5611edb3dfe68fb775abe932efc560de9a268570e688b3abe4eb3dcc094ac0c967360d52be02bc85c82daedcf173bcda269065938"; + sha512.doc = "deb5a889b55a93101ee4c8571dabf00f8f971a6a27c2531c9e71a74e4b972ac1fe3efc6a336a6f0a38bb746316ba38881fcb2b4a90b64fdb5fa1fed51a7d90a0"; + sha512.source = "aa891867efbcd19359dc6fa93334e43858ec9c4f7b0ae2d26c5d770fa2210fbfa16afe2ee8ca49fa3db1cd6b8680c8f06dc1069d760b65ebfbdcef0e54fc7da8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.15"; +}; +babel-hebrew = { + revision = 68016; + shortdesc = "Babel support for Hebrew"; + stripPrefix = 0; + sha512.run = "7feecb0fecb5ba203e494c9ca8810c7e58df692617c7ef1e15128bc3d2c947fda90267c21b0dcb2743b18fbcc120da2a0f1ca0ba76cb74cb2e53b3039dfb1c5d"; + sha512.doc = "849c598ce07421613bb7dbdcb1893efe5facd807e5ad54a507d62054119113f349e60186258b7a60bdc695d7fae757ae65d64e7bec68710046a4247e52510523"; + sha512.source = "cbe6c2798fcd9edf4f98520172cc56725081158d2968f961a6ad59436455bead4553070ba5ff52aee705464d261d0880c032850e51ff1514e631362f64ba0dab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4a"; +}; +babel-hungarian = { + revision = 49701; + shortdesc = "Babel support for Hungarian (Magyar)"; + stripPrefix = 0; + sha512.run = "5b05fe625155df3a958eaf44dc55190fff60ef356d40e681870ff27adbeaef1dd2b27402d9058d27dec665dbe9127d43a2e07ad02ef5a546c2e77479453678b2"; + sha512.doc = "696cff23cc5e2c32034729385c251c8dbeb5f78d11c0f8a0515af480f7a9b5fc5fa6c07d216c5078d5f1c4e71cabe093f023f294dbebb6b203337da9423a438c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5c"; +}; +babel-icelandic = { + revision = 51551; + shortdesc = "Babel support for Icelandic"; + stripPrefix = 0; + sha512.run = "46aca093e061948272d2a54ff9f95b94b101582f0ec9d795668983c37b518be3c3d76d2c8e6901126d3dd7342db003589bacce9a40cfd573263a953bbedbfc48"; + sha512.doc = "bc859f01f52ad51da7df9d458e507b62eb69e40e1dc39362ff32ea8ee8890acce8ce49120fce967f321c9d674f4334c62c9bf2b3f8017288b724ecfe3943d667"; + sha512.source = "cff6e1ef260bd61b6b098b449fc5dcfe5c708a36d9e5df679d21e5d84a62fbe298fd6581d9c6a79829df55809b2b12f6bdefe4367df05ac50830fa01d8c73dff"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +babel-indonesian = { + revision = 43235; + shortdesc = "Support for Indonesian within babel"; + stripPrefix = 0; + sha512.run = "9e42cb144d53dc0a076afffdbcd2adb7bb55cbc58feb77916e02beebfd1833fa308a0c78d0c26e1d187386b60572381c881da083c73ac8fcc651e77af17e2093"; + sha512.doc = "c4f86b646d67ce4b29e96771ea5657e352ee7633c344f24552a2fde4c387aea41f9694d77114a1454b106646d12d30b277fc9de589d3d4b666b00208978f5bb9"; + sha512.source = "30a1b987fee18a002316bb51e3497d22696e83ed48cb4a6e40da2f82876cd2ffc5b4ab95a0c1cef8a62f3d0a610401bf6552d5080dad3a9d0c45d4fca53dfe7b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0m"; +}; +babel-interlingua = { + revision = 30276; + shortdesc = "Babel support for Interlingua"; + stripPrefix = 0; + sha512.run = "e562cdb5b7cc35d14f4696cd3b85c6578a4daaf7899bf684026e50ade2113ee2314405756dd5f6ab91b6faea4da59a3546e30a18ba77037eab581ae3c98b044d"; + sha512.doc = "f2f86fcb4a132a9c1f5c65007c8f1662a8498a53f265cc778ad3ba33120a97317aac890c1ff72cc6b94727d215937352ae268cf51344053bec6e0ee5687d0f69"; + sha512.source = "260b2b01ec451d2a37e00e83c79a09f359a3e4a7c34b1396892259442a3f9d2df683e74e6f14a5cbb9b797f8cdc24d0bfdc7f9c3dbe124eb901f43d393f5e1bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +babel-irish = { + revision = 30277; + shortdesc = "Babel support for Irish"; + stripPrefix = 0; + sha512.run = "d9b1486da57f9685e136e14adc61773ec0b3a58ade370da8383476862ad798f26609329d445ee6dd0c6419c98342b720a6880939324d19f67e1528fe99ea3692"; + sha512.doc = "f5dd55c6a527cf19eebe492271d1404be3c995cac004d41160522c6c71e4a4636c32547fd64b93beae41b60d8a48184ff9b498f82ca0453bc72b601de3d66cee"; + sha512.source = "df023dd1a4b04e022f46f7202b616e6329b4673084876c1afaadd41faf4414e908411deda1ab909246ea7e1922c46b0a70b5e3e3fbc6c4855e060d47e45ca21e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0h"; +}; +babel-italian = { + revision = 69298; + shortdesc = "Babel support for Italian text"; + stripPrefix = 0; + sha512.run = "39c9a5b40215874e74a86d3f994900e1dc3f5c1d0067b5bec224b5ca997a2bb254b914c9a15888e896e73908be5cba309a8da82fa12d797c12a93037c245256c"; + sha512.doc = "ef2f87cfb66fff50fccc3ba4eec0f1c778765d49ac2976561f4963d9e12f1b2c486459827a44e66fbb42278fce72111d9aee373c1395f0532fcc42ab5efc5ad2"; + sha512.source = "8436a5fe438a56e27efc22d979e56dd8f55971c598cf40702b485172448c0e5c959a1d9971f201c9e5e14df1d37815a39d9572c9dadbf6c6c9b0969f3529a3c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.00"; +}; +babel-japanese = { + revision = 57733; + shortdesc = "Babel support for Japanese"; + stripPrefix = 0; + sha512.run = "dae227c586eea1b56fc88937f8a99803994622c07cf54290ca1b5ef6cbfe53ade8aec7064820044284cfd70fb6ee2ba908bbb74dedb54bf3c2f0085815c7eb43"; + sha512.doc = "cbcda3267222cbf5c38d8e7e8ea5440b94c3d7d0ca70b4f635b0751e824c690a4d495f0906b0d646de5f1ee08c74f72482020baf99d39ad0089002d5e523ccb5"; + sha512.source = "956aa7cc75bb2a007fbbf4ba4e7209251d3232f585976dc0002429372062e9c1933241bf05c34aefc481a82032594b922df3851d6f88bdbdfd7c181b9a44d6e8"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +babel-kurmanji = { + revision = 30279; + shortdesc = "Babel support for Kurmanji"; + stripPrefix = 0; + sha512.run = "bbdd05e7106494f23892f3455ad224d3deb1881f5a73720e2c73e7401514fed324484416def64e2e8fd7c2416b521fb2d4527585d2302a220330925c296afecb"; + sha512.doc = "c31f7efd7415f3439635b293c9aad2cfc2632352534e579c0f8d3e74443fb7aa88a95e19735a7b65137d81899ad9d2ad8bbdb28c5da2ff05a2be9dbad552b0f8"; + sha512.source = "88f600cac9509695c36969ee2bb2041142dee729381a1ffa49489f32454e4c53b4d1795407436df9c31da040cc1d0c7e38077fc786e5cd6832ab9ccd14453d2c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +babel-latin = { + revision = 59800; + shortdesc = "Babel support for Latin"; + stripPrefix = 0; + sha512.run = "09a08dd3f90f83490867b786870b9591cdb3fc8d83c0e68446e2c97ba665a70f45c8b2553cfd6d965d31e6b2c435876ca569f4c24a8ddad4188ebd8b27b261b9"; + sha512.doc = "5a57f5b070cc86950002c40c5dc35407b0ace14ebe8ce64662260615bf5ae069237f5b0b6ae0fc795e72d9d1d3d9bbf7b30fd9cb762e56595058bebe436e5b92"; + sha512.source = "e7444e7c98837fc989a5db187a5769bffa993487c47f56ac5a686a92fc1b25f084966b411340de869a8325dc13fb6f85ce22e65c43debb63a2dfab2568d36cdd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +babel-latvian = { + revision = 46681; + shortdesc = "Babel support for Latvian"; + stripPrefix = 0; + sha512.run = "0e19f04d81195b77ae200946e5502fccfaedca5a6da8080a0e7351b684c7d1802a1d9d05794006561109dc8f9a0c04f45266e74068157caa9c470899cbec5230"; + sha512.doc = "e7c4f93db73431708eb902af924672727a6dc6d1cc9d17ca92436cea51310a10538f32825c13144ac35ec8633fc146d1788492f9c6ecf7b11ed72893ab6393fb"; + sha512.source = "ce0c59467b4cf94857bd0713283f46aa5c64987f5a4c68536566b98693b93e61ead42049a2ca323eab3b2b9842623f1318f2c27ab4a28d3e4660b8edffd988c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +babel-lithuanian = { + revision = 66513; + shortdesc = "Babel support for documents written in Lithuanian"; + stripPrefix = 0; + sha512.run = "83e8aa3c7e8e018f79c848ebd884f0d0a07c87953611342b5a9f25df1241ddd931ede31a03b1670922049948a6f9ebc88676de0a4be9e144a3f99e22fb857fd7"; + sha512.doc = "76dac9c2b95699a42018ad370afc1236668a37a71707a6c1a8fff1921df9edf30730f71337c1128f64b7448a0bd3f99e432ddbc1219534884e8476a8c7fdf338"; + sha512.source = "1ad90b302e3e7d415fcf0534642a22fbced05f0cb3ff9218c73175b3bda74d0a7c96b27dd1401e12885233e2236e7be479d651829dcc04906f94f27012a5ee8e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +babel-macedonian = { + revision = 39587; + shortdesc = "Babel module to support Macedonian Cyrillic"; + stripPrefix = 0; + sha512.run = "c061ca1ec358e4d8df05e0adadd5d87695cf3b9f86cab52eaa0e08b1f5b1fedb66febe32107e74c1926fa4d697b056d7d3f119db525b90ff7e7bde30fd015508"; + sha512.doc = "7284141fbecedad06cfef78f50b4c13ebb3af76ced474c456a364c97943b51b9a233ecf6797e561ab0936ef7d082adc80daea0de4e961baab60e494bd72f7061"; + sha512.source = "c5866f925540742391981848fb5a76908863fba8a7c77da97b6e6bc634a8425c2d39459f789749cd1ccc4e7888e6d0f5b40d3d9a0a76611f4b1ff2db80866c72"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +babel-malay = { + revision = 43234; + shortdesc = "Support for Malay within babel"; + stripPrefix = 0; + sha512.run = "6e2f95eb95a7ffe0b21789a65e74936139d92381867e507ce56bd8eb39b4061b177c10fed0a0226e9091b963370d3c001115473625910f03b699d5517350f2da"; + sha512.doc = "b06395639e743571870dee10e029e4622c55683d7a9d728fff381bcabe4bf694511230795c79da4080299938acf66d03cc55fd45cb8426b484e19e0fb0f73b10"; + sha512.source = "4e7e47a29802a7369f7bdcf29ac0fec13afd69f42c9b01060ffadb2cd8d1f1656f7f6ae8fe5ced67d9ce6438c26a07743a18bd38c561fbe8357e8ea3c685a5dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0m"; +}; +babel-norsk = { + revision = 69603; + shortdesc = "Babel support for Norwegian"; + stripPrefix = 0; + sha512.run = "cd5511b9ffa7a009cc9b330fadda4edbd431083a3301bd4722d19d9c9331cd160fbf79d0e246feb2d4bc69c6e2800931c4e697b9a052f92a424f5f59841840ee"; + sha512.doc = "764700736d45202ac46553014d8382a26ac962d964bac3fbe9d1c90f341b99fb1dbd6a44348267d55f75228bd155aa70cd0080870b627910ebf0df0bf344e0cd"; + sha512.source = "50e6bd75290194441785e04a4940c682f69896fb5e6d0e96492e0565f413bd6f306ce90b228f1a3abc9a88a2288e8db80a87c443a6fa1cae38f5b896c6fd7ad3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0j"; +}; +babel-occitan = { + revision = 39608; + shortdesc = "Babel support for Occitan"; + stripPrefix = 0; + sha512.run = "f1f2f26b5466d10e995d76f7003c202650e3976b82b431d2bae768a582bc0c5662fc120739c49fcfd1226da3595c8a6b2e8c952a491718c45e69770c09d542a9"; + sha512.doc = "86433fa646eb6b2f7ee0ba54f1dafa73b81bd98012859c59408883cc76ec876720ef526cb2f526bd4a8385c0371f9bb01ae6d604661deabb4ec920172986adf0"; + sha512.source = "95bd15481ed6d20f1b9b71fad9661e5a12e4f29cda61dc8910a1601fb0f97cb4797d5ecf8137c9465a623288dc05e58c84740ee5b663b1f30f1c984d4dde9b03"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +babel-piedmontese = { + revision = 30282; + shortdesc = "Babel support for Piedmontese"; + stripPrefix = 0; + sha512.run = "72fe6338ef6f172a23790402a632881906689117e7227b6f2f2fb6129fca9a7d44c42ddd48e8286252f3b5fce9dc34439594882c1f80f33557ef5ef70afe4993"; + sha512.doc = "a2fa0cc72a205fcc25c2baeb7717a573bf8f2db5438e49c9de8a90e8da37d4f267ff30f08f8bb79f08756f5d227acddba8c069c8a5c257adf95c3afac271927f"; + sha512.source = "6020ade081108365e4b23d9b3c9ef789e95764748d06a647a071e8ad77c945593a680c7669c57e989e71104a8bdfbf857eec9599327560e4453e0a81b9d309e8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +babel-polish = { + revision = 62680; + shortdesc = "Babel support for Polish"; + stripPrefix = 0; + sha512.run = "0088388d0dd6459e5ac3062cbd5eeac7ae0d858b93ff278b6bc7a95e8fc4846d8c12530eb41ed972f5009ab745857a5599d9ce25860efa06a3a1dddbf396b4dd"; + sha512.doc = "536b3ea736a9e876f2e7e942e56841c97de27b94d00e58656e9d7ed3b27aaa43947deed1d04fc54530c082095ce46737f05969afa85fd5de57baecf5718815bf"; + sha512.source = "21d9f5a3f4a6e9f7595b8e38af5758f0eb06d8f390448a39c164b5c4e7a83089e3a254931a1c23e8dc088eaa6874d5f1451b78f14b7b8dee863daec62f78a490"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +babel-portuges = { + revision = 59883; + shortdesc = "Babel support for Portuges"; + stripPrefix = 0; + sha512.run = "8b63140bf59669873f55ed65925eff65cab3bd6bb404b7dec962b7072243c2b2be8d2918e379ba02b557f7e07d1d490b3cd0bcf3756bbfc3f4e63ff540e73c28"; + sha512.doc = "1fd6cdd08c2c00340b04ddaf078d1e9f0b1c51dee22f805f00bb46e63c46c4461fe4d9df174c2844a6ed01f7b52333a6290cd0c8aff3820a1659839668308b91"; + sha512.source = "863f5c222f11288cb4f041a04cf543494409bc69df67a65b71ccd79411e4a292653a6bc48644d3b7700c0a01d1a456fa56c0ce867d6177983a8b7c98b5e66aab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2t"; +}; +babel-romanian = { + revision = 58776; + shortdesc = "Babel support for Romanian"; + stripPrefix = 0; + sha512.run = "ca6318ca8453dae2286b305766c6ced299f18f390c0d0f44e77ddf8eb4b05c31c7a2b01ed52e271f68acd6b127650b370d15ea9bcb3b591fd01e5d3a50b17db5"; + sha512.doc = "73ff361e7e03499427529824b83ea584a5ca190aae3d1ef9a5f4a5adf52cc8ab02f5652c92c1464a702f581e29626fa9cd14d4ee84f6cdde69b38af9d10b20ee"; + sha512.source = "0e4aef9bf20e6602dd946e2ad2856c7ee7849b492d4b66334450b450faed146eef83d2b7f13506eac6f34507bfec4ae735ae9845d3a21c36d98105bb353166c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2m"; +}; +babel-romansh = { + revision = 30286; + shortdesc = "Babel/Polyglossia support for the Romansh language"; + stripPrefix = 0; + sha512.run = "db28e78ce4e028ead2f31fc84d0e7d8997a18dff3bf6aed0301b79bfc7bdc52a8741f9975766d36ca9ca2af9908e7e0bda9e454abf268a1eebf4693c30f5a5e8"; + sha512.doc = "42f9b63d92e522b596839d10c1b90ee9052cac86cdd54ac408063c24456b2a7b5adbfc8208a0a388fcffbb19b98ae0810f7da9d6bc517ddeeab78c8389bdd5a7"; + sha512.source = "e26e9ec260d7f01550799f90c6bb76c0c29cd200896c4634085627599f5c3d7438159ea9f72df416e334200a7e1aa3f063dfe9bac5817f55c8f6cc83fe906a63"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +babel-russian = { + revision = 57376; + shortdesc = "Russian language module for Babel"; + stripPrefix = 0; + sha512.run = "5acec3460294e71e6def384a7863a849e8a5d431dde49c77a4a7803af5373b56fcd376f6e73b237dd230728ab5b536f903b6a1bb19fc478dd5e742293a6e6ca8"; + sha512.doc = "387919d8bc226b00492f9924486a2591d15083a5a8e2293889f6532ef28fdd6409e2a777e728bee7f7b9796a304f440d8cc5fca246588d2b3ef0c84c79b701ce"; + sha512.source = "71ca4e9bef2fe88c8dc41def4facd4c33145692cc0ac2cf05eb1d455ea83bd93b3cd29907772a5ce84168986db0fde8f5748622a4dc9b6857682c4c0aaf04f34"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3m"; +}; +babel-samin = { + revision = 69604; + shortdesc = "Babel support for Samin"; + stripPrefix = 0; + sha512.run = "bee2cb83522430ff8bc8e65513d2268a529a041b85b10315c4902749d840ee1716db45df56f259a7db726a94147fdebfa573e99b9e654c7ed4df87f5d574877e"; + sha512.doc = "cf8a3c56fdc0474fbb3080743fa852dc22ea4f1c791f7d9b4779faa232442a22b46662c92e61bf84953c8312ae9fbea859282799b393701b0c176e4d23edfec9"; + sha512.source = "85b57da2d3bf5dba4c9f02d10dedd4400696ba1827793e81f83343fbecc15e5d2fe507138c3c309c5c8b02f0e868606e344c05db9dc9c84b032e4132c65996b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0d"; +}; +babel-scottish = { + revision = 69610; + shortdesc = "Babel support for Scottish Gaelic"; + stripPrefix = 0; + sha512.run = "16632367173512a1ff0d678334071893efc91d9ca16279075a63b84acabaeaa8cd35263f56e6e3251cd57a77bdc9f0613c34e60f0acc8de14f4e0fafde751d81"; + sha512.doc = "725a988893fa1cd3064136376de3475fc8da63993a40c0c63165b5c13fb4ae15a1ab856e2075e05d3a4e492d95d1aa12288b808ac3a1a15ce539a35edb289aed"; + sha512.source = "cb640792dbfbe7733238aa67283b9ba954456246ad7ebfe0ba65bab08060e06a5dba7441fb2e6cb7c421584f8377273469477a5d1b6dbbe2c593f844aca80ae1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0h"; +}; +babel-serbian = { + revision = 64571; + shortdesc = "Babel/Polyglossia support for Serbian"; + stripPrefix = 0; + sha512.run = "0067de0fddd73a7c68cd2b3a12b4eb620c6b95886c4c34ec1766ff9b3c174ed2a8cbb1dae72cd8adcfe55bf01e4d24e47668e76babdc57ca9eb59704a5ee7cd5"; + sha512.doc = "e83a8db6c60853dea918d226fe643fd06c1cd65bd3b9e29fac962c029a263e75821dcf6a5a3b33ba44b12321d5e19633f704885e77017cb43e9555a4e060394b"; + sha512.source = "016a726438759e5959938ee6bcf3735386047581eb166c244116f0032ee0cef5345c851e6d90a5790b132c2f98812da14f97fe2e96c23aa4dd48d7f50595b88a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2a"; +}; +babel-serbianc = { + revision = 64588; + shortdesc = "Babel module to support Serbian Cyrillic"; + stripPrefix = 0; + sha512.run = "c4c4bf91fb22d0766bbab6a9980b0faa19f4031cabd044a309478f9ee700bc26247a10051f10d36c8cd88425820d2f800d3947d005fa9fb8b54429efdeb3c8c8"; + sha512.doc = "a173daa03c9da413b4f200a0427e5293676ff3bc64dfd21d945977fc78fa9172ebcd73bad2c7ebd8976ee252cebe3c78d03ac9aa10b2be9984bc34b66ac5ac66"; + sha512.source = "13a4981f6ff19cc1664bb2da360479814723651379c445e3fd272167df761dd07c3cc5b19072fe99de8b08b2b41485d08aca6fc1c16325fbbf7ce1ff1fab77ee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2a"; +}; +babel-slovak = { + revision = 30292; + shortdesc = "Babel support for typesetting Slovak"; + stripPrefix = 0; + sha512.run = "b14b98d2cb66a3f8f5d8a313d9208a700d1c3664a5bd23f5baf0d9aa2e3acf3891a0536871988e7579020570999ea05a9dcd60a404cd6670e3c1cf8110d9094e"; + sha512.doc = "da1d663125b913e3480ad147ac1f5c1befa00110e71bbd2d42384db03fe0f0db3133b49e26d1a336b49c10018990763d42ef49b64440c9138d9d938057ac90e0"; + sha512.source = "1668ed3f373e58ee9a507637ed4c17638fc429a30ad6087c7f153f8fa23103c0a93c0c0beec73380d41925ef1ebf25ac214f1afc95793edad65545256e6ce5d8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1a"; +}; +babel-slovenian = { + revision = 69742; + shortdesc = "Babel support for typesetting Slovenian"; + stripPrefix = 0; + sha512.run = "b17956aa2afda17c6ece09f372ed1777bfdecf358fee13260da6f73f971eecd5d315770d01e83def27edd2b06828065ba1f488bc3ee879539691424256c39ad1"; + sha512.doc = "d50461bfd4b57dca583f53fb1afb1ac97382cfee1651d55538017d2990b331cbb471a060ad26fb86965f9d6b00f15da39011368bc9162120b188ad505d7620e1"; + sha512.source = "e7ee24b9f25668e55a539bca4157b373303f36d4c79100e120e7f991f2cbd42efbd8d6c3c5be7a69f7468eee5c30330028175fce4efc06f779900da6ac3085cd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2o"; +}; +babel-sorbian = { + revision = 60975; + shortdesc = "Babel support for Upper and Lower Sorbian"; + stripPrefix = 0; + sha512.run = "629a4f09de7ba1a444af0fc4e6db9f53635b0e000d375296697096c2debd782496d7b36f7745af42a8a19f6cc24c6a832595bc6c89ae20d79701c7181d1a5d68"; + sha512.doc = "ebb371730cafbd37a4c54dd0ccfe9d6e187aae747d1b6de9202fd09a85b5b38f8814e0bd27cd86e51c5aa62e6816ac725e28eff9117d6dc474a9e32f3b6fdaa3"; + sha512.source = "57d29eb253398abf3210acf390cc80e97b444c370718bda75108fd1d70c1c7d2fbfb43f6387751cfc90b9cb9020eb4222fca0821d10c4d52750bfde05a2557e1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0j"; +}; +babel-spanish = { + revision = 59367; + shortdesc = "Babel support for Spanish"; + stripPrefix = 0; + sha512.run = "2da1b62772f462c8e058edac7d305804be6234a720446288fbcbe2e574a1cd9f905e4220b4008dad64c0e59b15194e2627cd1e295003c1bcbdd523c8498fa26b"; + sha512.doc = "9c3e87e7de6fa46b0c6b9da65d4c23e31640628fd6fce844b53d896ad85813e9b804fe4a36c7c2c1cf26550a51551b39150a12467e26fad4f9bb9094dc0af817"; + sha512.source = "48e4293f6c7aafed829e273e0e5ac2709a082e648988bb40e5bd0b36aba6d84aa036d07108a2bc76c65b4ca029a9652ab38268b7e7a87abddc03f00ad55a7fec"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.0q"; +}; +babel-swedish = { + revision = 57647; + shortdesc = "Babel support for typesetting Swedish"; + stripPrefix = 0; + sha512.run = "d3ccb281b9a5405866b0a4621cf0ea4fb75a085041de5d52ef0eb6db370cafacab05d1eebfef21f9558f4110e19b739e6c5cc424709e06640e8290a9c01722d6"; + sha512.doc = "33a59fb66617ee8ff66643e57b0146940060d04bb7bf2764bce97a062a955ddfd80338072434f86d86c414a22d5ce6f120be4f21523a3d81e6e88947e9c2e57f"; + sha512.source = "fe6e091f5cf7b0946a6be154af2907288dbc5ca58a003e7009740b2c85ed22075afb424f805427a5838e3729a35cbdfcd8934f860a32eda0523f141f3c9a9952"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3e"; +}; +babel-thai = { + revision = 30564; + shortdesc = "Support for Thai within babel"; + stripPrefix = 0; + sha512.run = "4e3e5c6d8944040177a21f04e63bd40e85c24e9327eeddfe98072da38590c58523f676fd7532e4e00d0e3cc88121a2885788d606d2dc9ca02fd91c7f04a6ef57"; + sha512.doc = "791539a57534c4870a81ec2318298b29e9e9ad925161b0a4cf52c49086a865d5b58b60da10829a5fb37e66f0d161b396beb127e586457c556875f1205fac9360"; + sha512.source = "db43b9422d95579f9bec645671e5c0ba654ce2d7ca89c3e98b6d910f6546a30b29656aa7061d03b767aca6eb2a01b001613a8b619d597bb9053a8a0df3376b6f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +babel-turkish = { + revision = 51560; + shortdesc = "Babel support for Turkish documents"; + stripPrefix = 0; + sha512.run = "02916936992e00e7aa884b46b6f786dd0fe5a0aaa6e2c6c4e28fe72de7fe5260fca7cdd37efc4a775a8d172e3993c98df7cec3d1ad08f01487f7cb0c8f2d179a"; + sha512.doc = "06931a6b9987a7affd4632ea5cc79028a2a88c584523c03ce79c2a15268947fb1103137da158886c7957e0a7c938ca69c1c5c7d88104c892cae611c914f6fb93"; + sha512.source = "54f3c4bf5063c571be3ae2ecd7c86882cfac940ab942e66fbb18346a4ab1e266b716d276294dc6c622b3ffb0b86cdecd70411314b334be491d0ff56604d0ead0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +babel-ukrainian = { + revision = 56674; + shortdesc = "Babel support for Ukrainian"; + stripPrefix = 0; + sha512.run = "10476b0dda4e80472aa8d3b3628d372da10f8badd37df6beca434e3bf1b9e135972acd5decb63eb6f706b700ef969136117b96ae5a6d6209fd75b9c13d06567c"; + sha512.doc = "7dd3c5d02024cdd4e0c06b57d3aef0a723aba718760efd4b1214b7da2dca8877293bdfff2d3893e531eb734d5551dd93afc03dc4f3413822a3df0b40b4bec43b"; + sha512.source = "0fec3b7b65f3e2a5c0b426d4c55e55ec0551fb38a786cd36db52cdfd6c87909ff82ca21328ea33c7089b39aa2694d4d62ddcd1d59255ae929d4ec85a44abdd62"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4e"; +}; +babel-vietnamese = { + revision = 39246; + shortdesc = "Babel support for typesetting Vietnamese"; + stripPrefix = 0; + sha512.run = "ddb75c37017c1b0b6af2cfbdf574526cdfdce2099d599a23cc8ac819f6ebe5ea7a2eda4bd743af93d78835ca5dccb3d7fa55db22b3154862aa4affe83c28185f"; + sha512.doc = "b078464ce848b24d692d4dded7c9827f37fdb4141b719c71e28b5ef0a827f9ea5c2137745f9689fcb89a486d4a88a94a043a62348e86b5736a68ea48c7f33e16"; + sha512.source = "ffdf9a552fd79b1b51c0064ffef8f9dca1e618b41b0abebd2a22152e8f2bde04a9e35964250e8bd42912929d3e6d8dab6fa430ce302a1f28f27676015667d489"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +babel-welsh = { + revision = 38372; + shortdesc = "Babel support for Welsh"; + stripPrefix = 0; + sha512.run = "89526156517773131b5452f2cf5bf773f34b97b2e35e786f2bcd4dad512519766eded269539ada9d5c34d4b1f02d65bf55a0da0053e6bd7b7a3c66c606cfb60b"; + sha512.doc = "cb0ff59d9c02bce3028f0025c07963d42856eb4e68f322b839ed1ea5f51abf372ea17fc695e7be4bf87f75b3d2b163f801102f469773a4474bd0d0a72a47376d"; + sha512.source = "42c52ecdbb0b1de295800bece99804a481afffa2848a2146429b318f964e3a88dadfca9c020e9dec6bb3db1548ccfa79db3e66edf366a32fa83a1b6ba91e7fc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +babelbib = { + revision = 57349; + shortdesc = "Multilingual bibliographies"; + stripPrefix = 0; + sha512.run = "90e78ff6086c80e0102ce7aae74070d3b1444208f3957e354f2c940ea4d279f87ed59e6c3310c6d9fc1464c227fb0eb4c3813ca679a6e94295e0b824cb527376"; + sha512.doc = "cd5785a17242a523f23093f8389f1d4c5e3d49c0656ac3f168a8627fb153b217b5a14e5c990c7afd1c5ea7324b5aad2e3dd40e8c2ca0f9ba9064f91f7214bf90"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.34"; +}; +background = { + revision = 42428; + shortdesc = "Placement of background material on pages of a document"; + stripPrefix = 0; + sha512.run = "e9fd9b5e680082aa3e9f0482ebe41a753088a1e61b85876a9685942172cb9d5b6c9819ac2d61e0274f988b46d4f962222ce0afeac2827630edc728125761f214"; + sha512.doc = "518b0785e562fc6f01d6bba6cf7157c847faab151bcfe7840d5f2c9d8fc3ca54689beaa8698c92f24c196393fdbf90b027165be80e6cf07e9ee79ad8073d8533"; + sha512.source = "36bddbbaf17dc15e72773400e75dac754a2eb60c106c7a6861226b6dd2a1955fc016810a10d5c90ff56b690be922affc0427c1cf3b5e5c1f334231bc8df69872"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +backnaur = { + revision = 54080; + shortdesc = "Typeset Backus Naur Form definitions"; + stripPrefix = 0; + sha512.run = "adf008822e18c19a7e9e0ef4eb54230ff267ba287e3ef6c0686552ce6b51c8b13fce10cc4533a733f2f6ac09739fec4c2a5878423db1c65a993c5bc16cafc643"; + sha512.doc = "cdf5a269f4055e8c5685da95b18501f7b69ca8b236fde8e60d39760a562bac9bca5da3afc06caf18bc4092a97f76754a48950881a0e0aecba90c40904e699637"; + sha512.source = "45142a281a29b1f9e24e128f05825ef2b8e8549ab5de03607cb018dcde6e98b751598e01f6795b14c81c190a275162eb8e30402006f4e7d2a07c2effa4a949ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +baekmuk = { + revision = 56915; + shortdesc = "Baekmuk Korean TrueType fonts"; + stripPrefix = 0; + sha512.run = "f9270a17459444e128b5fc5d12b943043fa4ec2f87ee5996808f9dfad1c4c4146787db3ecd267767a375d1fdbd56e15850b25cd7c9c71ab270e3517b5863054a"; + sha512.doc = "3a3819f892bdf69afeb66b9fdfbfe1ffe06e2a488425e814cb3a1e223ec9659a71f0571dc25136e0f7afcdb616f717dcb3823b89e640b0894313683e4f79b197"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.2.1"; +}; +bagpipe = { + revision = 34393; + shortdesc = "Support for typesetting bagpipe music"; + stripPrefix = 0; + sha512.run = "7d815e23e9b5d686e0df54c4a0ad51c85360c7b3879695977fb9be2b69cb343e1c9043c2595ac5554e87e0a568b2441bd16a43b334af4b43e5302eba19bc33d8"; + sha512.doc = "696047cc4965a06388a61232af9336f2010fdb0b869914cf66ac9b052d1efd85ff05119a277aa127cf05f56e03b63060956c7c284df78e93b0f0beabd691d33a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.02"; +}; +bangla = { + revision = 65786; + shortdesc = "A comprehensive Bangla LaTeX package"; + stripPrefix = 0; + deps = [ + "charissil" + "doulossil" + ]; + sha512.run = "1559fc1599e2586c660ab544a5d7e279240a966da677fb658162e8497e17b574308f90f51823ed861d52c2d0f4c0b836316866b2d5cc1b0c3ebfa82caa9334d0"; + sha512.doc = "dfa23cced9bc203d87f4ad344f3f4448b1950418d6a01c72a9b56e64cc7b5e959ba6845e55c592628f11bf677b93aa68218023e32116efa8580938b503639f50"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; + version = "2.1"; +}; +bangorcsthesis = { + revision = 61770; + shortdesc = "Typeset a thesis at Bangor University"; + stripPrefix = 0; + sha512.run = "3d297ec59cff75977addc7320f90a68a6fdd87bcf5aee4947c14e122dc7741e443582075eec4a9b327c3e988da500934fb5426d5e9fc17c7decab4a4872cce8e"; + sha512.doc = "be5e7eb308d2678c3cb7464e234bd63f551a560677e67bb6b5c9dec5ab59b29bd6f8a66db300065cb472b9772420e443a3fc7a4d31ebd2557868b3a6b2fcfe2a"; + sha512.source = "3141fdd4bde1e82edf0677625c3b599516ff8b1f71b19c4a486cf5d68361135983f4fcefbdbb390bbf324d78eafe4bb6ad9ffdca8f7b257fa98faf590ff23c06"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.5"; +}; +bangorexam = { + revision = 65140; + shortdesc = "Typeset an examination at Bangor University"; + stripPrefix = 0; + sha512.run = "df88d8051803726d508906be7dace3ef15f455fd00c1603aa16e9298af75e9f38d306ef6fb319b713e21dcb337eb93fa44a2baba2aa15f79076e6ef55d38100f"; + sha512.doc = "b8db60eec0ef7a57e0d0991f70ae7d1d7f87391797521e03baa916848a8be827a97496de8af8f2f95194ccedd923288f471116e677371b99f75f0309283ff50f"; + sha512.source = "639dffd548f6937a01b24e5946e58cfce47609257e6964bd51d441d2ae3435f16d86015f50003b2c3757b8101a50375d02ce68be19e85c6f8adc7c35338aba18"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.0"; +}; +bangtex = { + revision = 55475; + shortdesc = "Writing Bangla and Assamese with LaTeX"; + stripPrefix = 0; + sha512.run = "84d2b5b85f423e171bb90821f9e4518d06a640c02b03638295322e0ea6aedfdb831b6a4e62d3c25259b7b70aa0fe68ffe3081f6de0b0c71fe03c10616c74347e"; + sha512.doc = "05ca923b97240a766d3ff448c6b16a33613a16e3307509ed7c369da6ec889e7e19d57e5f542b829c788ac4e87bd7025a62af9f7127e2eebe7fdd3eba4aeeb7ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bankstatement = { + revision = 38857; + shortdesc = "A LaTeX class for bank statements based on csv data"; + stripPrefix = 0; + sha512.run = "c388a06b1527fe131dd56813303ca727c035f2023b25426e8aae7387867afa0425e4f739c2698b30af97737557c068b94741dce51f8df573c29c14e4cc4f02c0"; + sha512.doc = "5290904ce0aab9e4e098fb4625c8a0cb5c728769faef312267131eedbee937e1d964a561b2c001c38131ff93c9083db46275d693431b2447267edaae19c296f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.2"; +}; +barcodes = { + revision = 15878; + shortdesc = "Fonts for making barcodes"; + stripPrefix = 0; + sha512.run = "e4b9f432d4464da19d279d8e7a5c2ccbd6dbba27fd175bbe7385c0f34199955c16427fc7bf6b487cad1da0b2e28b94d44267a0042e811fc73a88661f3d312b91"; + sha512.doc = "2054d8b87084bbdccdea4a2c05c43b427249d597880b3870fffb98bcf0bf88adf64c9110e3ff98d1755596d559ab548a464a2d681eb1adbaf57cc748424e0d98"; + sha512.source = "9b72c54e083622b95df17e643a6466125a22fb62e3ebc64c3b0f5304253ba5625f0ce2e0071dfc4e06643259b4d7b575a1bae5bc6beb213e5bdd3e83074ba9d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bardiag = { + revision = 22013; + shortdesc = "LaTeX package for drawing bar diagrams"; + stripPrefix = 0; + sha512.run = "dad9b5a50e5a82ed0285fb36c609c4302f7b22daf71c159848788d8c7c91c19dd44398e98357dd58366cd97140e943540d05b6e1c9937124a40c4b4070065a1a"; + sha512.doc = "54fcfb2473c6ece46ec2b01853c89046c7f5396e97f62b9175cedaf4b1e783285c7c417700c827a7b9fefe5055b10723ce278e5fff0e864434f84020472c1cd8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4a"; +}; +barr = { + revision = 38479; + shortdesc = "Diagram macros by Michael Barr"; + stripPrefix = 0; + sha512.run = "6bd398efda5027e3b762b817ce777adb9bb1c8e593ca04386adedeab7dc26ba382058ccfa3c281ef8612fcc50c9b719e7f881dcde0cfec041cf4b2cd05f238f8"; + sha512.doc = "6600ecadc60fdd00e4d894969a84118265b5c5d07e9a411d3f01887fd1e94c481b117cbda80451774294dbb989a61379b16fe3ba5c3b8363a9a2485b76752aed"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +barracuda = { + revision = 63708; + shortdesc = "Draw barcodes with Lua"; + stripPrefix = 0; + sha512.run = "8081a9b253c77cc5e68efeb8c66beffc189898cc6ba80cd96be88c57d3117b2c270e439fbe47983309625c90def14f3b2d2c50b567f4f461e4c0ef591c7ba63a"; + sha512.doc = "18767583117a7e16e5b292aa2e82082eed1f48e7f2d8033cf605d9a0b9f09f460826ba4c43af5e43b003e6514909cdea30e24666b8c518655a9e6ab7b6129953"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.0.12"; +}; +bartel-chess-fonts = { + revision = 20619; + shortdesc = "A set of fonts supporting chess diagrams"; + stripPrefix = 0; + sha512.run = "33c52620d32f5e79a702bb664cfcb47409faa049dbf7f34cc5816005b4667267810fab130e3aee1ff7a7e3292af37c2d376c01dd2bbf17be199a22cc36ba751f"; + sha512.doc = "e61232eed7f345e28796192d836af9de29bda257fb85460f67a89bbdfd7dce01b8361962b7cccf314311c0e772e69367f2921ad898c106389195164b6c925ffc"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +bashful = { + revision = 25597; + shortdesc = "Invoke bash commands from within LaTeX"; + stripPrefix = 0; + sha512.run = "b46abbc1622fcc15d65981368d5c8a7528f2142d722604eb028e0cc364d6e908587cb58a340283e7afa43581ce365ac7a545bef65d1cb5e273e777467231c40d"; + sha512.doc = "5017fef7ad1c67f33cc881a94f75cce97d422b047d8944dbff377b1f3f3d36025b7b73c76ba2ed96bf06b0c6e9c3e99b97ecf36e2ec8ab8b7e1893dc11f201f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.93"; +}; +basicarith = { + revision = 35460; + shortdesc = "Macros for typesetting basic arithmetic"; + stripPrefix = 0; + sha512.run = "346edf1704ed621a326e4f945b8f5341dfbd2d46af095691c7b853a9683dfb2254d443ae04bf235f192a57dd55336dd50249b0963bde041120468499e61012b7"; + sha512.doc = "bf454539b0202321121437d2448c3b49a2d6122459af4788a573cc2525f0301d1267b12f3df8636a36fe807c474cb23347a41a2c412eb12b674c58541516ade2"; + sha512.source = "6c8b449cd8f356be6403a48943d6b91cf2c2dcff90020041a8dde0fb8ad1fa598727137dfda0b091ee776c968d4dffdad1215716111a36be16cc5c5e5b2cc5e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +baskervald = { + revision = 19490; + shortdesc = "Baskervald ADF fonts collection with TeX/LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map ybv.map" + ]; + sha512.run = "3c0451c43f81396038c3ccff2b4a9b07bf31023fa7afafd2884506928dffc8a9345ff0b8c8114f20b3016026f4532ab138a8b4787a37811501659a0f53c98941"; + sha512.doc = "e9e2c8749e29351b59690027b019da441de5c74068aa5a8457e3014c751fb23dddb0e8b94bf56529879086ea8c58e023a23b85ed9bbaece10f6dcc65ddcf3ff6"; + sha512.source = "60122d6a04e88fecd4c6baae3a657f40bbfd48895cc674e95ee9e2b3f9172e01d009064a616f2d7b3f48c41d43f75efda19c3ca54feee612f1866fe64eef366e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.016"; +}; +baskervaldx = { + revision = 69273; + shortdesc = "Extension and modification of BaskervaldADF with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map Baskervaldx.map" + ]; + sha512.run = "f78b61573fc99c6696dd9aac4f108f473996c5e67223e721db88f355b2e55a68f2b8a21c7bf994f2ee36a8fa465b55b970d65407b1ecfe1ffd7e00061bb70753"; + sha512.doc = "8d1b8a3e12b958fe5dee50255c291ebe8ed75e8733a28a5fda7c927a9253e0d94e68b51e81ce8805e3c3855893f53947429fa9684c99925d80176522c72119e9"; + hasRunfiles = true; + license = [ "gpl2Plus" "lppl13c" ]; + version = "1.077"; +}; +baskervillef = { + revision = 55475; + shortdesc = "Fry's Baskerville look-alike, with math support"; + stripPrefix = 0; + fontMaps = [ + "Map BaskervilleF.map" + ]; + sha512.run = "d7ff1eaee4b050128ac89aff0d48d50c99936b1e04e778d0594d28ad3b225002012cfa56ff515486c98d9769d499ba5f4584358f8969c6286f07bd535b478ff6"; + sha512.doc = "131117d2170aa77f83954d61d630cd0714c7542f3b4f5e868f834bd091d0b4cd76185d478ae2e4d35c8b9930262d3f14e675681540fa8363b4aa060ea5fd96d9"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.051"; +}; +basque-book = { + revision = 32924; + shortdesc = "Class for book-type documents written in Basque"; + stripPrefix = 0; + sha512.run = "645d55362506a1bcf563a12ddb7616f085d5cc75a45cb2f0dcdf551158b48f595cd71278caf9a0c35f1d85ca66b880e6f59f9ee416fb9bf15cd7c18bf6fda2b9"; + sha512.doc = "7954b1c86ddac3a1409bf16cc7db5470332fb86459257756200dc794a3443b137e6013a7e904bbf63e8fceae64850418e56ad08af12a448c1fe507e29221c7be"; + sha512.source = "4b8a2ac7320d04d5e35a0c789e5b548582ef4e0723ca45231250b44ab08fb52a73e88f5425218ecdc3e3d35e01042b64c711ad78aaef0c4f119ebd1abc4dc36f"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.20"; +}; +basque-date = { + revision = 26477; + shortdesc = "Print the date in Basque"; + stripPrefix = 0; + sha512.run = "2f0cdfa78c3b75dddc5ab9ed15f651308dad4e598f9623eea50929c48d6f15318f768b95d55ba124eb048129447ce1e629febbb3fa6925677b2a46ac94d82654"; + sha512.doc = "249bfaabe93c4306c32c698eede8835cac334a27802253dc6ce1f380eaafa5c79fc3b86ee34ddd7b98df043cc0ccec137ae3d342cd3904f39203b0ffba2fc9b7"; + sha512.source = "f38091d9c38f86efa401f11759c536dc3ec041688ef9b1909dbdb5661ea096b7e4d69ee78a5beb194e1cdb24afc8ea07e26f2c9c45777aae517351fd4f3a2b86"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.05"; +}; +bath-bst = { + revision = 63398; + shortdesc = "Harvard referencing style as recommended by the University of Bath Library"; + stripPrefix = 0; + sha512.run = "0d32f9c6121a57900fa3818cc4efdfe7355346b7e25971f21e72358bed84e8a56467df9f8132f2666a5047c8a47606a4745ebdb5a00bdc02b4d33155ed72bec4"; + sha512.doc = "45ad0c20ad0cdab5ea22bcd3eb728de173c0c75fdea8b315f2edc5af977406e1be2db0d41b5f2d68e57d68bd3adf7e34e1b3189b401a0a7bf1436376f0e46e08"; + sha512.source = "654e5b3581e66c9df05d7f42cf00b5ad818406d00a03122aedfe1e7f4292f6c6bcbc6be1229ae62303bcb0300c7351c5d0d655da493da0d799aa3183e57dfd1b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.0"; +}; +bbcard = { + revision = 19440; + shortdesc = "Bullshit bingo, calendar and baseball-score cards"; + stripPrefix = 0; + sha512.run = "ac7fff708b3e25312460a740241ed003ee471f84dd4d30388d9cde8380ec9a6b6fa6fd6aba69b170c464a25bec44f1669fabc4ac2d7d3e216885b7e683f88af6"; + sha512.doc = "9e4561e97ea77c84e3c1cc8f75ca61318937c45b7b50dab66d6745f61725b6397458a05e50a267937bf6db4b28558ff0e9f2225078b9516fe574620982ab2cb4"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +bbding = { + revision = 17186; + shortdesc = "A symbol (dingbat) font and LaTeX macros for its use"; + stripPrefix = 0; + sha512.run = "d5505fd7aaffead426a873844112e11fba47694ab07d0f5c88be31188fbf4a09ed4b8f8bce75221b2b2efb3ff81fc132fe54c2634f32679e2e2041944ec92f7d"; + sha512.doc = "a1425b521b1c8178bd6c9b059acf034080be6f3f312decb575b7541d34a6e1de926965cde8701061ffcb57147052b1495b21142f0eac645596a783820eb6200a"; + sha512.source = "be0e2b1332835920a3c93ec69ae53fe83df4918db9d3080716d7b77edf999a87f54a4c87ccbe4d48b008403539a514810f35c6b2a59d8be0ed6968f6a91ba129"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +bbm = { + revision = 15878; + shortdesc = "\"Blackboard-style\" cm fonts"; + stripPrefix = 0; + sha512.run = "d795fb56f2ba57dea55a546244c5d07bb20c104cb9d1e6f9b6c229df9e5fa4244f8bb883bcddc150e1072453cb518d31c110bb85d157b4fbfeb47195da939619"; + sha512.doc = "034d880588fa88d97045d73dd651a0b3573c624dbbf1d2f9fee046c59f007b9e3e2121d5d773b34aa7b0bc8c72daa540447981bf60731e64d99cde49b5f6e911"; + hasRunfiles = true; + license = [ "free" ]; +}; +bbm-macros = { + revision = 17224; + shortdesc = "LaTeX support for \"blackboard-style\" cm fonts"; + stripPrefix = 0; + sha512.run = "06f59837d585c721da77f289119bd4b45a91e3d72543ed3e4de76f84a2916431a733baa379b83a3e299d166e27bc0350df6f053d1ec744c52dcd0297d416fdf1"; + sha512.doc = "20a29809dffe8090e5c067dd2df9dd5a5f7de6ec7abbc01eb14b5a500f37cd62b50914733edf7403af89a1db86ebe10b3d7262f519dc01dc35b29ba0c70c3478"; + sha512.source = "11d1d83d558a7943e35e8146b7f44df6a553a513f8e0478e1a9c773d66d004a4110288f91896b283dc4153372bb638a444c53b9184745858976a7e6aac69b121"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bbold = { + revision = 17187; + shortdesc = "Sans serif blackboard bold"; + stripPrefix = 0; + sha512.run = "1b123e9135179244050ed6f97f17efa2a43c42018b2fa3b01c956a99886ae6696c83df2a0d61ce95cba925c2bb4c734d77253aab165fe9f622695f557fcb0abe"; + sha512.doc = "c754e81f83a53c4a1cacbd2638d550ad178e0e26d7feb592585579a27b780e11733a7dc68fd374ac575cc7866a1e5417d3df0d2b973e7278d1012657bf340390"; + sha512.source = "a7a61bb796d3ee618ddc39d471bb29d1b7350a40bd7a97d44d4a1c7cd5e4eb5d5783d2ea46313344468406d1d25c71ac322ac4bbbf7b06aac35bc03651e7ccbb"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.01"; +}; +bbold-type1 = { + revision = 33143; + shortdesc = "An Adobe Type 1 format version of the bbold font"; + stripPrefix = 0; + fontMaps = [ + "MixedMap bbold.map" + ]; + sha512.run = "86631e16388a447db7c521087eccbb666612933f6fee8eace091e00b20b5070d38ebc2d4d0a754536eacef9e9e6470f237d184e00cc4419bff85087f54b81566"; + sha512.doc = "ad841ac652a7985ab907572f66462091b1c40f7cdab2b00086209a2d96056e0a9e32842dfbc22c829b27799882252da95e3d10d4a9dd174f487327d5f3ac3899"; + hasRunfiles = true; + license = [ "free" ]; +}; +bboldx = { + revision = 65424; + shortdesc = "Extension of the bbold package with a Blackboard Bold alphabet"; + stripPrefix = 0; + fontMaps = [ + "Map bboldx.map" + ]; + sha512.run = "b75c9f544bc0c6d1c046d614a6e0ba52a9cf920d73e8066e2d5e656e1a8774d42677c5a5bc9848e45bd4892e3ed19f6c3c281333f437b541d30d3410be2618a8"; + sha512.doc = "671259c208ea744654b82f25fddc3589fdda650c2121c71763ca4fb4c0ebe3a99906763c5adc354f49edec4beec59897445f5864a37640f67e47c8df6473f2fe"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.032"; +}; +bchart = { + revision = 43928; + shortdesc = "Draw simple bar charts in LaTeX"; + stripPrefix = 0; + sha512.run = "b78e4017d0355107e1e73670c20457c2dc314dd0537bb3e699df3118231b5b3c0b2acbf50ca07f71216d56c81acbb031d38dea7b42099165a03a8049f62021a0"; + sha512.doc = "762b75974de179360fcfe6057102919644a564ad2c3431ef25e2c373267ec063ac8350caf0038a5964345491355ddda4f5190eff6de93f2c2da7ab168c829fcd"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1.3"; +}; +bclogo = { + revision = 69578; + shortdesc = "Creating colourful boxes with logos"; + stripPrefix = 0; + sha512.run = "d3f060c91f1ec7f8c836e22b21dd735895055873807690c4d8fd3b90652a7f6f1648decc23f66a6d51c4970a27817642ea6e66b74b2affcf5c938c4707568018"; + sha512.doc = "e8ec77512bfbfa00de03585ac9b0b47a03d60ab27f7a10303efa3e37bd285c8c0d959f3a5a013a300022121da6bf4c07d603df63faaf0fb44013313f8369aa5f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.15"; +}; +beamer = { + revision = 69316; + shortdesc = "A LaTeX class for producing presentations and slides"; + stripPrefix = 0; + deps = [ + "amscls" + "amsfonts" + "amsmath" + "atbegshi" + "etoolbox" + "geometry" + "hyperref" + "iftex" + "pgf" + "translator" + "xcolor" + ]; + sha512.run = "25fd0161673badc509511fe31b4780a68011ac796e12a841ed185ccb5d9eeaa22c519ddbcd2fc0a5cb70ba94a0752b6b5880f86dd499e4c89f1a5b708f3d7fd0"; + sha512.doc = "8893df96934b3325455557a8a4499113c9d69d563452a01a81107054d99bf4ab67308482a70a777491d208d3e008b60d9c8f76cd560f1fb8af82d97a2a121bc6"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Plus" "fdl13Only" ]; + version = "3.71"; +}; +beamer-fuberlin = { + revision = 63161; + shortdesc = "Beamer, using the style of FU Berlin"; + stripPrefix = 0; + sha512.run = "6638fee0c05b9901935204bbcbd79baa1cd0213c0aba6c8eecf1a9f4b2b44aa9403f42078e84e437e7e14d36a991afd0446ae9ffd2ee3260814944fe7b52e92d"; + sha512.doc = "2241bfbdd7dd8b034a01e83f4076fdcf628ea40a29d27cf1e6ceba234b68580cb05f5b29d71c196187e3b5ac1e5a0ec566c5e4a0b784e56f43bdf86ab2747781"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02b"; +}; +beamer-rl = { + revision = 69254; + shortdesc = "Right to left presentation with beamer and babel"; + stripPrefix = 0; + sha512.run = "36f3fbabba1319d8019862455e97502d5446f1838db4fe42410d75101f430270df3abdafb61e7fb565040d9aaadc987cf268010aa682fb509cd7303f6f2e6dcf"; + sha512.doc = "d0add94467afb47bd358ef5a228e314e280b92c8c038f3e6b6f2a28410e8eaa6c984a34b43902e4b6abc2c0246e732be9e9e31065e11cb14cabe5dd34b15e941"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +beamer-tut-pt = { + revision = 15878; + shortdesc = "An introduction to the Beamer class, in Portuguese"; + stripPrefix = 0; + sha512.run = "6074f5933b945f02b24c31353bd7d683b35a54f53aacfa2ac19de382f56fbb9f6284316ee70c0eacea3760101d98d4a6b7d78412a0d41b13c9e1c907d181ee16"; + sha512.doc = "ef6e80c3417cfad3e2f3e0ecd3ce249aa0b4cf0a6b5dced09c27138e34a8c86a74d0d03c6888d0944fe2b03bb5b8180872306263c58f54281f4ed2fe3424d4bc"; + license = [ "gpl1Only" ]; +}; +beamer-verona = { + revision = 39180; + shortdesc = "A theme for the beamer class"; + stripPrefix = 0; + sha512.run = "71b241e603688bd22e10f171d32ea3dcca1f25c136a7c0d0cea3e72e936b068ea7ced6a40c03d2e2fb21e533506bcbfaf10f450493cb4e2c3df2981b714048d5"; + sha512.doc = "ab68e6accfbfea7651dd43b55c4ddd86a66a827ecc6f6353dc58e3aad47ba89e051fb4f9dcc76e0e8081784385cc696fda9d95c0e82c71b0645d358afaf42c4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +beamer2thesis = { + revision = 27539; + shortdesc = "Thesis presentations using beamer"; + stripPrefix = 0; + sha512.run = "793ec95902fbecc2de84616b74494d7e34a1a1c88277277ee82bb172c1ef0cc42cf175f62fa2b4926abb73817b7eb258d85be6689b60a56e0faee941276471a9"; + sha512.doc = "ea71d35ac3e02d3016b8d19d38132ee16960757c9846192cf2213061c9899a9788e98f50dac074b0cf83f6029f883eb1f7784779d0256c719d55490284cfc8f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +beamerappendixnote = { + revision = 55732; + shortdesc = "Create notes on appendix frames in beamer"; + stripPrefix = 0; + sha512.run = "bfb855380ded0b9ef019a139c93cc4f520d4390d98ddfb43483679742ee597b8e045c8286a9391ec068f51ae6c50372b0438b41e449e23804efbc18767c11726"; + sha512.doc = "abf6b36bfad890b37a0add2ad443c39ba2f2484bd19f9730fec4cbb416eafc6fce723fd5fa684cb7adba4110f888641cc570ac7b7a26ccbf06dcd3697e2c5921"; + sha512.source = "f90db38b52c3c5dd3867111c17716160191ba238b965185d31d497494cb17046a83dcc62966bdc01d79a3f1ddfe53d9d9a4e31a6084c951b68598bb4ca392c4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +beameraudience = { + revision = 23427; + shortdesc = "Assembling beamer frames according to audience"; + stripPrefix = 0; + sha512.run = "f1fa8d1d30b00ea59b3fd83347fc1ea1e90135e51e8f4393eacdf32ae983a80e865d4364c924c74bb1d409ebf22ebb5e290707b945898db9e6234dd297553b49"; + sha512.doc = "25fbfbf71ff66a80597b368882de63aee2e090e5604a67d66d52e99dd606ce54079e4a7350c4acee5966555dfa5dc8de0e650c7cb4c136bdc40cbe5739c0dfe1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +beamerauxtheme = { + revision = 56087; + shortdesc = "Supplementary outer and inner themes for beamer"; + stripPrefix = 0; + sha512.run = "8fbe5425396d8e5fea8ce618091948b84bb9e3998b9f34730686d9275398d7a149c912cf80d9f7da083af583ee37fb191435c68d8ea6741776ec2fcaabe9194f"; + sha512.doc = "3d62f584a8170113242f1ba9bcd1fd3a47c539cf646719d4e11464d892372b0713475b026be3721e5921202d40593e56f2f5cb821bb12f11a629a81e390f25da"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02a"; +}; +beamercolorthemeowl = { + revision = 40105; + shortdesc = "A flexible beamer color theme to maximize visibility"; + stripPrefix = 0; + sha512.run = "bf9874f0d7bbbe3f95c352d1c5e93c5e7fa3af18dd02eedee553c312ef01783420b035ac74f93eb150a99a597ff9948d978ea575963f4117d0965137446ee5fc"; + sha512.doc = "258016683c605b4961ee25f30077cec69c486cf3ed0cccce2482db01b39141e122dcb46e02e960a83138d124aa269ec903379c3c6b65f3366e96565e90c2337a"; + sha512.source = "940218da36cd17d38e2b8c6d79eb1570d6c779b5f694e9b43abf6614db93a8227939e1ef86678f72461752ca0acdcaf2fd5e52a45a35b6d98811511af5090a2f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +beamerdarkthemes = { + revision = 55117; + shortdesc = "Dark color themes for beamer"; + stripPrefix = 0; + sha512.run = "ced5c093d0c4e3c23fcf774bfcc768b8a3adb20287e0677e1a2474d5ad1eeea1f5f979f988c0f0ae6a484ec1953b95c044b0803df9f76f289e999ec50889433a"; + sha512.doc = "45d0daee876c0e0d94b2ce6ce7b49f6eb8282643b1bf3540abb07e0e7782434c224ba40ff933e9febd893467ebab2ba7cb588669a98784e8eba6acefa0d30611"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-40" ]; + version = "0.5.1"; +}; +beamerposter = { + revision = 54512; + shortdesc = "Extend beamer and a0poster for custom sized posters"; + stripPrefix = 0; + sha512.run = "7483f14a3008997c0c39c351e0f8b9a01dc42331ae990575ab33ab29c18cea648e0e6ab328a2c1fde404bc10eec78d7c7b8352bb02636e00d5d6e8689f1c717f"; + sha512.doc = "f597797340286e4a87b62696fa167af07a1717a175646d11836e1f347601551fe0aec5ad4362c135d0f6bbf6b45e217a91bdb5053ba1331828fbc352583d3697"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.13"; +}; +beamersubframe = { + revision = 23510; + shortdesc = "Reorder frames in the PDF file"; + stripPrefix = 0; + sha512.run = "d3ab81c5eb90d8566eb850c25d7751f5a341107fdb756b46bb50b392741746eea356ff54ef1ceb6ca6f0a2c0dfb7940aa7cd6e3d0cd27e4328e817d1be454964"; + sha512.doc = "85878ad48e6ba191174140517ac03039320620f246efb51c65e57541d9cf569d59bdd6cef17f10f6f6d85bff9532f6ea70175cb09b68ea6e59312a407d89f557"; + sha512.source = "f4c9d5b2f9a868e1cf3dead5636025698137d63f64c0c528abafa0e5719987e6df9be31a6ecb9597824e5c9793172208908616f42f8980b49796368e217be24a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +beamerswitch = { + revision = 64182; + shortdesc = "Convenient mode selection in Beamer documents"; + stripPrefix = 0; + sha512.run = "43b91dddb86a5f0158a6181a931a4a68eddbef350917f59df7a281e89f6b87d3db652146094eb46fd89d46f6564d1bcb2f278e34a6ee2738d7c4a817ed1db37c"; + sha512.doc = "1cbab77e0b5482eed26fc7364877cde6094edb23ad353340172b278d4728024b5187df2982f3985899bcbd626aa77fc2423d8dfc4936b6d32f62cace50a4d058"; + sha512.source = "0b6ddd42fffe3a1c85c94e0262b156222b0673b1d8d6f54d3f196154eec4a1fe6ccc44d8c34ab04c496e1635e8bf4555bbcb835dda0ed52e780d904d3a797610"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +beamertheme-arguelles = { + revision = 70209; + shortdesc = "Simple, typographic beamer theme"; + stripPrefix = 0; + sha512.run = "aac91e94a49c87b99e888542cb1d0ca043f6dd1513087daedd538d755989dc19f7c7201698573d3c3d9919a434b0d39d56ba6d33e22c240fd6579ecec6f215f6"; + sha512.doc = "23219c4b8718a1d4c247ae2a733a3b371f3c96796ca0e020088fcb47b4d136670377a4f4b746e9ae260e6e32ef58e86edbea80f71716963272204df312072583"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.4.0"; +}; +beamertheme-cuerna = { + revision = 42161; + shortdesc = "A beamer theme with 4 colour palettes"; + stripPrefix = 0; + sha512.run = "f0433d4a4582958ad057fddcddf1f1f992ec98a199943bcf80a7834e37eb7fa5660258edb08e2bd9205628dc1b8a69419c907b6c007a1c63cd1fb335e439125d"; + sha512.doc = "96f4e9c3afbb81a7841130ea076b2cd35477e93eb105c03add6077fd76981cbd14b609c3b9e573f143572764ac87b1ff76ce18c377f3bbd9b02a1ed45a02eaab"; + sha512.source = "a4381e52d7e46336d8d8989be45c185156e67df776d5ad159f2db6c62c751dae59e0c19fa0c5ec3de4b0385047d5f6fdf166b6c12707c889cffeabe11802a10f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beamertheme-detlevcm = { + revision = 39048; + shortdesc = "A beamer theme designed for use in the University of Leeds"; + stripPrefix = 0; + sha512.run = "cab4d390d7469056f2235c493b9383a4374c4a686810db428cfe622a4c2513f7176df489d22f7e37ae1f8a2d3303443b60c12c577764be2258b345fe9c3dc543"; + sha512.doc = "2c637af44b258c688449ad2bbd81664e3086efe874d03352ab393487d7eae1148773ba39a498611a848c43824415cb5b860259111f6d287fd9e6d7f1c01eb530"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.02"; +}; +beamertheme-epyt = { + revision = 41404; + shortdesc = "A simple and clean theme for LaTeX beamer class"; + stripPrefix = 0; + sha512.run = "2bf451ccfe095384aeec149e97d7022cefaf997cd19dedffcad5606fc149739cf21b6128ef08e609aaffd6afbaa59b1cdc401cbd3ee4fbe0e997d724b713a620"; + sha512.doc = "a615bddd7955869d7e175f734a06308b166057dce0b479a4b11d2bd1d06fda7e0a4fdf8185d0a3db2d2302cea2890184616b92d0b7abd5321fe9edaca6dbbd2e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +beamertheme-focus = { + revision = 69742; + shortdesc = "A minimalist presentation theme for LaTeX Beamer"; + stripPrefix = 0; + sha512.run = "bb09ca551108dace02506987f246f1de4672444e8d6ca7f53bbf1cbfb573a7e07b3d2f937b4724821b30b60f1c63b360e200754957289c95379aab06dde14a8a"; + sha512.doc = "5ca583264ee68cec6df53f5e4a32d4c3ce408372fd3ec4c8ec74f2757ac9f5e817a23ea875760994fd7e45a8cc2e45686251aa785adc960b5730c5059ab353e9"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "3.4.0"; +}; +beamertheme-light = { + revision = 49867; + shortdesc = "A minimal beamer style"; + stripPrefix = 0; + sha512.run = "5cc15c3ee0222678c1c97b31805421caac8b20fca03b1d748fd2a71756d5d764b8fbfb32ab70937e890f7755966b520362db98a9ae65be3f83509cfa287d600a"; + sha512.doc = "e2d0cdb7fdabe582f2b6f1a656a5b9b61ee3680fd4944c06f108cf69eced96bed7b25e56563b1cb9879e8da42fdbbeaa41d769158c5e256bc70b5d695571a5af"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.0"; +}; +beamertheme-metropolis = { + revision = 43031; + shortdesc = "A modern LaTeX beamer theme"; + stripPrefix = 0; + sha512.run = "dae8058ae5c2883b383a2bcb85bbdc45d0b0a3fab46a4498ea1f3b8568f04d049598fa78b72429adc7e36773905c67801e129378e233582f0fd8eb5ca4327745"; + sha512.doc = "c4661061ea3ce52a20fb8c704042cf755b8b54549dd62467b1e78f85a4067c11a02c89422384e96323ef277ce44a3f648b1778b54e0b5c79b721f67451fabfc1"; + sha512.source = "af3cec1b7544ecd51c875a704605500ee1ab4374df9cf1a7db6c6b9102c4800651485a64dd865c1158d729c06f2499021408230c50278da3de40f7f0cac7bf6b"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.2"; +}; +beamertheme-npbt = { + revision = 54512; + shortdesc = "A collection of LaTeX beamer themes"; + stripPrefix = 0; + sha512.run = "9125794ab2ebc4d15ab500b67b9943234d80088393d9b31989ae8209359dca97778feaab3d11365ae1b4131f06dad2fe73bb21fae1220b401c5f31f413cff171"; + sha512.doc = "7703951f2afee05627847980a05b0bef0cb2fe87eec078f64a3e4796feb4057bdf93708ef0476090d40dad2605c69e23f695b9164a969e6a67f8329e6e340a3b"; + hasRunfiles = true; + license = [ "gpl3Only" "publicDomain" ]; + version = "4.1"; +}; +beamertheme-phnompenh = { + revision = 39100; + shortdesc = "A simple beamer theme"; + stripPrefix = 0; + sha512.run = "30745bb1f92c230bedd953d32eaa6f2085ad2aa7f147bd3368fe8ebe4f6092ecc615acce55b9573da4dc04c8e89877ba2705a6712cd4c4f67f34dc59eae97880"; + sha512.doc = "626d124c6ac02271cc3bc137e60b8a66a861b7f692910e9fad283d8836599e3adbdd1ac472fe66955a392d1b563e955da852cfd5a0d712d284fdb2dc4d709a63"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +beamertheme-pure-minimalistic = { + revision = 56934; + shortdesc = "A minimalistic presentation theme for LaTeX Beamer"; + stripPrefix = 0; + sha512.run = "b9c6237108e1aa5f4859ebd1100efbddd2bca55c76bca876e0e3a0c10dbd322a3ee834e4e452b80b2f7755ce026fd2bbe5c69434371ad29df1fe3280b409bdc6"; + sha512.doc = "791e3a367f5c7ebfee453e7d7a76753763e2bbe122616e49fd0d4268dbd274e3ecb308b5adb850765d143bc46a311316f86bd13e60ce1449b0217d7b4f733830"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.0.0"; +}; +beamertheme-rainbow = { + revision = 67542; + shortdesc = "A beamer colour theme which alternates theme colours on every frame"; + stripPrefix = 0; + sha512.run = "220dd54bd2565263ce7bc48068c96b48a0677f36ad5f3d826561e1d0ca21f5ecfa7ab675005e7aef40e4b9e9f149ee341c0ed82ec8a5a6fcab40785cca97289f"; + sha512.doc = "bcf12ee63331bec8fd8c5443231109bcf1027d1abb9ce94c919c17fbb8a5248bea503acc25bda67226fcea1e30a2ae7283cfcce6a9b937362086e9123b4a429b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +beamertheme-saintpetersburg = { + revision = 45877; + shortdesc = "A beamer theme that incorporates colours and fonts of Saint Petersburg State University"; + stripPrefix = 0; + sha512.run = "c258a4eee25ccdb2437625982e54def90aec87be003f697a47334be52b85ef223b377c7fc57d49c889121caea664fcd6353015ad2e62f5bee5379bc222958f53"; + sha512.doc = "bf51e2bc33f32ba3dda6c140040a7499a60c26082569729743228a6c7abc97fb20076d1d0c7d0b64a25a54cbba1d9a8b59a9059d160a5a488ef6641999e8611f"; + sha512.source = "6cd3ed424b3a724e397de3fb7b47de33a5c9f0c5ac0e0f8b26bde55ef69b66015874dbd438912c682c9aa1c33e4e916fb895458964dea11fe228e29c1afc40e8"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beamertheme-simpledarkblue = { + revision = 60061; + shortdesc = "Template for a simple presentation"; + stripPrefix = 0; + sha512.run = "c75bb4c0f0eecf2aea0e24d30410ca1edcf645c323d88433bc6c12adf116740f2f6bc7d8517db764b0b33d9d9227db93ddddd1c521dde3343fce6d807b0e642d"; + sha512.doc = "9f8f642ebe4cafed03699377be6bb647cbdfb80f99e075e2863b69a4d6b6f59cab6dd4dc831b0fb015302b3737b32d08cf37b3034365b021e8fd9f086f7e6ddf"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +beamertheme-simpleplus = { + revision = 64770; + shortdesc = "A simple and clean theme for LaTeX beamer"; + stripPrefix = 0; + sha512.run = "de19e0011817552bbba482517f9ea4f59590cc837c4b539e01db5f08eafa2dc94adda9dc8fd4f92b07fe2acc38862b5a581c195f1776975469d69c1b7fdd617f"; + sha512.doc = "e96132fc4669ec82913ad7610a174815be79476fc40ecc1ed35744292d41ba47bbbf1a7cd9d244b41c12ab515c729655271d62a608ae47cd2acd0324cf0f0ae7"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +beamertheme-tcolorbox = { + revision = 67000; + shortdesc = "A beamer inner theme which reproduces standard beamer blocks using tcolorboxes"; + stripPrefix = 0; + sha512.run = "bcace2249558b6519dde1d9c80da791e38330de31da26c606d8bb8a780952bc2cd57f93948ba191606bd44c2260819546a367e34f672555db22d0c736a6b959b"; + sha512.doc = "240a7be55ae035ae4e155efa814639de14a2c5ddc2dec9bfb963df2010026e8cbc7f6c834b6445695dbd7f1e68499e123b505de068fc196ed25a86115c06261e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +beamertheme-trigon = { + revision = 65985; + shortdesc = "A modern, elegant, and versatile theme for Beamer"; + stripPrefix = 0; + sha512.run = "1269b79603c415123a91093bc69cd672aa54518da7e7cef52193804fcede45dc09fe6748f2c0c940a754767963174e768b52873fbac5a520f7076229100ff016"; + sha512.doc = "83b6946c17d060c299260ff272130938933dbeb9124b1608e8f3bd886b2f63851773181dc1efabe901196b37f7254569a5b5de0de7fd39ff558eb21376ffaa27"; + sha512.source = "49f9d4cf001b45b29a5c7b59155d72e286092157dfa5c0dfa05e7a20958adefda2a182974508f9a0936acb1d5ce199e21b350e85da7e292525b2aaab60e2c6d3"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.7.0"; +}; +beamertheme-upenn-bc = { + revision = 29937; + shortdesc = "Beamer themes for Boston College and the University of Pennsylvania"; + stripPrefix = 0; + sha512.run = "0c483991348107a2b9102e514ec05838a9ae3e97dceddcbf3b8cc21ae635a272c7d70d97b2e1a0929b7545e50560f16a71f7b290ca16cdfd63177782b993b714"; + sha512.doc = "5feb0a4401d9ebbc4672b7f9668f850fb65002c7d7124c607009775149c4c428642cd17df133ae80d564ab091fdff039d34c1704360033f2374b55466fe1b618"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +beamerthemeamurmaple = { + revision = 69742; + shortdesc = "A new modern beamer theme"; + stripPrefix = 0; + sha512.run = "c325ebeec7588caaf8966e9b8a71069f1613d694537298afeeb8d01c6c83c7991e874bc5bd070e722e15ac83eb339581897a501dd187ea5ee4919ba9c14fb541"; + sha512.doc = "371597bc1aeaa9c43fbef6b68234252535be41f442db6e6785605723b099b34e8cc01b1062ce1a831e62333f57673f49462eef082541c982b7bbfbac119a19be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +beamerthemeconcrete = { + revision = 69528; + shortdesc = "A collection of flat beamer themes"; + stripPrefix = 0; + sha512.run = "84f2729d5f5197d2dae7fe422f535df1f2ed14f2ae936f7c080d93f7aec2b949290406f31309fc76b21a4a80de733aadc6319a0e54a63482ea97ebc4bff773d7"; + sha512.doc = "bca6cbd0b51e52446fa179d216a3368b5bda75e6e99abf3204297be3335f2aa2b6efe51dbcd1bf0bb589070ce30c030b6ea2bed868277953a5d60210b6bc924d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024B"; +}; +beamerthemejltree = { + revision = 21977; + shortdesc = "Contributed beamer theme"; + stripPrefix = 0; + sha512.run = "b079ceab30460a7b92a616fa6d7216ddddecfa02adfd66bf38aea83eccdf6e63cc52d8b2ae88db0b21962af223b364424227806beabbfb2e344af98474af2528"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +beamerthemelalic = { + revision = 58777; + shortdesc = "A beamer theme for LALIC"; + stripPrefix = 0; + sha512.run = "70d789b4490e5ceb9d578be03f815eea97706fc89e41756908d41f1953c2b4cee4ce7c142406a0abef0497b89b74dfb2dc6d2a841898996f32025f53626a8548"; + sha512.doc = "b79c55da51785c42c68a2bd5f7a386b21fbb36948df8b5e87e60b9eab263e43592b7265902b6f3a2d3bd214dce122fcf0d504ff807a7bee0ebccf7241fa8e1fd"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.0"; +}; +beamerthemenirma = { + revision = 20765; + shortdesc = "A Beamer theme for academic presentations"; + stripPrefix = 0; + sha512.run = "6fe83e0805fde96d585dc027ecadd23862815171f56f6a05db0a6788018a096c193c995895f7ca18af6d322877e24d570743d84a922a2c7e4baef35d3f6dfca1"; + sha512.doc = "13f1dfbc8f09662b627dd4ed6c7ff297612c5d05a140a446ccdcb6f0ad3a9995b434d418994cccc2323ead666eaeb10b32e1a9d410a38c632df9873717397231"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +beamerthemenord = { + revision = 56180; + shortdesc = "A simple beamer theme using the \"Nord\" color theme"; + stripPrefix = 0; + sha512.run = "4ac0d1a6494f7acdb1afd73b2bf8e7c966ea3167f856432ebb872f0285cfb8fe759735b57bba5e9ebbb91a0bdc9e2dd643f5ab0686e9417e0719369266d7e46d"; + sha512.doc = "0e2038d76d478bfa54a547c97e002e84a98a1dc7ea0a1584f12d6cb1b2c4cb1f65d9d368533b5870c4f3ecae02396ec0172a89eef1547d33a168ab87c846a4d6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +bearwear = { + revision = 54826; + shortdesc = "Shirts to dress TikZbears"; + stripPrefix = 0; + sha512.run = "c758735d869a9b1dedb64c9c0377891606d32ba69fe0d665d882d7d113bcf3c9678e6cbfe93c269758d492a0336c26f937195f04e80587c1aa083fb1c766829f"; + sha512.doc = "03171083f40cc4688ca6849fd371189b43a9e5963e06be3ad44271b11cb985cfa0b369b49ed43110395e1d7d50f4337e9ce597989be48049cdf3c3a1beac5ff8"; + sha512.source = "5263fce263e48699b3e59e556827f3fdd88cb812a33d259effad361289ab8270c40d7c3c510938c56a99070bea4894d769e7f0986c7aab75262feb59dfc27078"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +beaulivre = { + revision = 70050; + shortdesc = "Write your books in a colorful way"; + stripPrefix = 0; + deps = [ + "colorist" + ]; + sha512.run = "e8566d352bb39bbe6256dabb57d6743db7dfc98e491683eab76ffa86ae9d6d0cf53726999620920b4845015bbbaa6cf48e8d4c82dbffd841d00d55bd2f2cb464"; + sha512.doc = "efb52d0b4df908a4425fb9d5f2767c54dd7b2d614076374d81b15f53322528a24231feb9145de9bf1f0086a6ffcff37d529a925fca879984b4c5860b00b12a1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beautybook = { + revision = 68438; + shortdesc = "A beautiful book template for maths and science"; + stripPrefix = 0; + sha512.run = "68df2cac1064c5636f1df6b5f9d51773278798310e7d36550f2a55c05c8d1480518407a97037d0167fe92fbab2f8d7be73d528681d66f63afe644ef3ede38ca0"; + sha512.doc = "62eeb012597c27e02b00ac5d7b2b280136986c412baf7113634bf62e0fe82b1fb9e4fdab3ab6a2345517a046fe46bfad6f2031926f07f69609e895800e215ed4"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beautynote = { + revision = 70166; + shortdesc = "A package designed to meet the publication of books and the production of LaTeX templates, with elegant chapter"; + stripPrefix = 0; + sha512.run = "637e51a355d5f89c2e0241140780b221fabbb4685830c1ce9ccb5cb185c53f1cc4c3ffafe737df25445ef885958c1b5f6ba96a4a3de1169de7f2cf28095eea43"; + sha512.doc = "36e71d750df5b5e5d8d05251a4be60214c09027a10c77551ff6261464729004fe0e3be586687af23db115b7cb4c99086dbe9278da0b8d6292b57005019628fc3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beebe = { + revision = 70064; + shortdesc = "A collection of bibliographies"; + stripPrefix = 0; + sha512.run = "ff133e38a475bba0e8aea3a8a98d20ff1aa17eef7c0d0f5a6d404d51b1062c2a5957d3261e844d956f9a5e97fcc2d8a438beb5b724f84f8f3734091551e7aba0"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +begingreek = { + revision = 63255; + shortdesc = "Greek environment to be used with pdfLaTeX only"; + stripPrefix = 0; + sha512.run = "c6e8493a80e328a10208088f7490a14bbec76fc8d969b85c6505d655840d9e4d8e05da3a1a3b17d76fcc0ad26df7251765d7d4e812000cd3fb9101ad5a46c3a9"; + sha512.doc = "3143cf03735fc6e5b3a77f17b6099f139d6a1cfcaecf140dab6eb4c72398742719956bc03052e539eefa9acbebd00ab14f7b0be829ece74b8a66dd227580542b"; + sha512.source = "ce891bf42100a6ff2f046f2a02f9ed53a9ac893578d7120cf483aaaa1d856c9985a6e7a59c2076c9febc35fd9cf21139de6fd682923bfb6ecaeabe63dfda2a93"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +begriff = { + revision = 15878; + shortdesc = "Typeset Begriffschrift"; + stripPrefix = 0; + sha512.run = "ed1060e0ce9bad28f98481eed44f8bd98f6b8be91dd5dc87d5c34a6cc57e724d175fa909fd6ff514399eb81bd8f28450f7c9a6c6a9bc991f35d617a8a25de8ed"; + sha512.doc = "af28c20897e297af4ca1fb13bb286ff0eece9e2f06f5b734062716c0c5f5b7dd673d046a5a47c907f9a845a7257393f3328d46c4ea2ac0ae6b0eff1244e97256"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +beilstein = { + revision = 56193; + shortdesc = "Support for submissions to the \"Beilstein Journal of Nanotechnology\""; + stripPrefix = 0; + sha512.run = "4d604245024a94e23c30c7968e177173efebc7d8d227688f0e90adbf071c7d0d44a6c07c37143675a66899062ca2b8c366516ca3863128e33e784919a33e3d49"; + sha512.doc = "9684c13b0d91121e7e7548ed9bc1e377ac7a54f9f1f2aeb57d465bab36b17d216e1cae4eea9b3fb6e5afc42e41f465a31db0209f5b45f40f7db0afbc4646c73d"; + sha512.source = "0bd1079836d7740070d6100730449e6118a14485902a9016109587530e0f83b8dd4a4466cce914c5f06f42163da746e75fd998eb6b279e45574f81535e65ed1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +belleek = { + revision = 66115; + shortdesc = "Free replacement for basic MathTime fonts"; + stripPrefix = 0; + fontMaps = [ + "Map belleek.map" + ]; + sha512.run = "4ae91c01e67fcefd46da99d6bc8379b3829e4e0e88f512f36bfc9743d075090d0c26d0eef11dde5125b344e85ccc3c5a31569f3a1078d00d364ea80120bec30d"; + sha512.doc = "93266af4f4293639a123f5ba88e2680d87e6d815f49cd7dc6c9322866dfb22308716da1e362699aeded819e7817987938f70cf48c9166e7127836de743e5dd63"; + sha512.source = "b8547d1b3da8be829b7fe99d0cd7cee8fc6b7158c1799712ea85614534d0b020cfafdc1696a0e5037ad15b215173e1461c64f86a1f52795209272aed9991d107"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +bengali = { + revision = 55475; + shortdesc = "Support for the Bengali language"; + stripPrefix = 0; + sha512.run = "2ace635791a4c7a8af0843a5a92d518d0e93fc09a94929a277002a3e4426f199e207238766b07ff3f1e1bf0e3c0cf8b83897b30ba105ee7239d6ce1d591289fe"; + sha512.doc = "61bed8e39b9dc4673ce27402c0ee76b035e254133af09bbbadd00b80d367ffe204d5f660af8c633bc7dc6bd81f66ce419741e341f63e314367f2e54c61f8269e"; + sha512.source = "ddfd0dce8379aaa3e224f74fd33fa4dd1fbe6a40d9a01bc6dc8da1dbca5b5eae97c4837ff21c75be8658d37693cdff3c2983fe01c77d13bd0eb89e14f78d6e2a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bera = { + revision = 20031; + shortdesc = "Bera fonts"; + stripPrefix = 0; + fontMaps = [ + "Map bera.map" + ]; + sha512.run = "103b2db8f7bccf6a9729faae793246d2933667295ba404fdaa7b61cfbce0f1209ea27e7a2a63846c6550b41214ff496a62598bbb9b731c087b8bba9e0abade80"; + sha512.doc = "2606c87871d6f6ed27b2a5e49117c50f00573bc6b9ce249d1433da214764b220eb00c73e59be43e32e8a4827c397c53504103e00b7e5602de5df5bb817e2145d"; + hasRunfiles = true; + license = [ "free" ]; +}; +berenisadf = { + revision = 32215; + shortdesc = "Berenis ADF fonts and TeX/LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map ybd.map" + ]; + sha512.run = "70dd547d0c5138f2a61e20b4585160e5fef281bbba72ba8dcc7032efa957d80c158ba88fdc0dda9982dbcd69a48d5d54286f52d1425a5819e54e05d79eb9dd49"; + sha512.doc = "f076717ff948247589225fbe4fcd92114d719526e535d645d767a3f7fdaafd3a6ca84c3a60997074186974ebf045e31a51d16d53c8a5fdc78a2461733cc66372"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.004"; +}; +besjournals = { + revision = 45662; + shortdesc = "Bibliographies suitable for British Ecological Society journals"; + stripPrefix = 0; + sha512.run = "e797bce36fa6529d6b57be352ed81b7413c2ca818fa904a8cc4c7c8f0801369543482aa5c286b40f6f7c5e0b73d53b6aa6b9aaeab3e6229da7dd954a3dedb1ca"; + sha512.doc = "c790eb0ced559adc6696f0f228c88a2314214ff6a4ab71ae03dc46b3974cdaae53fc685c05f0bbb7646a5b31d332f763fce4a71919319aa520965f56979eee54"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bestpapers = { + revision = 38708; + shortdesc = "A BibTeX package to produce lists of authors' best papers"; + stripPrefix = 0; + sha512.run = "d015369a268cff98571985f319f95df9ffe0255ad222e8c8133252c3ab5537cfc4c3ea11aab13a565c096e92472d7724c0ef23ce6a71f62c7a5fc2b30382a054"; + sha512.doc = "cb5e9bbcc83b6081dd0207001d1b39c6e089e2ae168f20d1cc87482560a483e4ea195fbf208c342ba691d3c85ea9f4674b2eb6cf68db9f9d83d3b98bbab60dc3"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +betababel = { + revision = 15878; + shortdesc = "Insert ancient greek text coded in Beta Code"; + stripPrefix = 0; + sha512.run = "db2a590e8ed5e946652cc54d5c01bd540b87f77253278f9211c8720229992275f80edc26d0c94b4f68237d84a5bf7b56bd93a40e2a0ce8df5ffdeb124c81d219"; + sha512.doc = "209f8fc6123f8403bf6a30731773aeea82c5c6de123e24755e9a22ca6f3ea170015feeb541242a772c3244e7b74f1a766e95886e4f773f21c48b353f22d6adce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +beton = { + revision = 15878; + shortdesc = "Use Concrete fonts"; + stripPrefix = 0; + sha512.run = "23d243f15a79246aa590a7ec65249724a4460ac6e3ac01dba2aeddfc169875dd8392c1374cb8459ff84210d51822430fab9d75a87f0ece20323cd20709de0c14"; + sha512.doc = "fa579427c97f930455bc548d5b438f32aa291d98f9d8b391dae686b270e135605cb3ddd6cfb9076cb248a17eabb4e62bcf4f720b2daf829b3d12d6ebc294f832"; + sha512.source = "79e129919c06ef083e4f8fdcd88a60339591b3f95776feb9cc076e46fb379b5ab10f9b48f3b8a948e9a120412f818dd3d99cc24957d3eaa812bbefb388d91049"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +beuron = { + revision = 46374; + shortdesc = "The script of the Beuronese art school"; + stripPrefix = 0; + fontMaps = [ + "Map beuron.map" + ]; + sha512.run = "623d3b7d8747ce1776de9d0ee6eec013c2050f9cb4a521167bcf23435d5e30c1233ee869ccb299360cfb6f8f4b4034a77d4fe601f789211b290684c0858462a2"; + sha512.doc = "812dd30a9b49d7ab5e529f3c7ef934be5d72b75adeec1a38cba77c867525243ffd0d4f4901c9100e6518eb0a8c35e208157b8e3669d3700203ab7fe95aa29845"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +bewerbung = { + revision = 61632; + shortdesc = "Typesetting job applications"; + stripPrefix = 0; + sha512.run = "1a5f652ce8e7ad60f22b7c3c5cc46c3963e5511965445fdacef01aecb157ecc4fbd3eed07140d64716b90a11db96f1b7dab8b4568aa41f7049f8a3a1ed0e290c"; + sha512.doc = "1713c1d4ef0982cf635ea57cb7af7805b001b48cdfef5bf770c627f5460f57945d2d2ead87c6e0ae8ad7cdc66036caa5dffafccc5ccd59ba889154cc6e4f9f5e"; + sha512.source = "df95e8bcc71b83dc196699dc9f4581ce3482ae9f1b673fbd2bb2551d84c68c97cbb70771ad710052d1f2652bcb2d32d8a4392a038e747e4ce7a25b65aaed2e79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +bez123 = { + revision = 15878; + shortdesc = "Support for Bezier curves"; + stripPrefix = 0; + sha512.run = "e70a0889ceab74fcff4994568a97f31ac93165353ac207ee683b28aee2ad3cb8f770d8e3b450e3237537e97312a0995fa8c17196ead0fce55fd76a49c77de72b"; + sha512.doc = "91ae5e35394e5bf3a6bbcc6aa7d7180ba546b58e84683c569bc34f5b0f9dcc6ea30153305fd83fe28e3bcd8eccb6179d277d28e1ff56538fc6980a7c3ec8f444"; + sha512.source = "fc329c0c99ecd10c42bdffde10918239874367e7b54a75c4de4882e520ea82e87188070775174a11621dca9bc5949a850207f02af7c08d1b6768ea87fba7e10c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +bezierplot = { + revision = 51398; + shortdesc = "Approximate smooth function graphs with cubic bezier splines for use with TikZ or MetaPost"; + stripPrefix = 0; + sha512.run = "0cfc80b93b76053591f4d76e3cd2f5518dec2dabc397b0d18f0d9edb40a0eabfd1ed608b0cbd6f4b7b28b9a10a9668b21f9ee798514bfd3ab4cc125392512d6c"; + sha512.doc = "284cce26134afe943c4b5c0b3d968f2512fa1c47ed1f2b19e70f48d618829b76ffc200933933f27b407e1086d95f38a4e9ecfe85506ccc2336cd5fe7eb40bf37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +bfh-ci = { + revision = 68828; + shortdesc = "Corporate Design for Bern University of Applied Sciences"; + stripPrefix = 0; + deps = [ + "adjustbox" + "amsfonts" + "amsmath" + "anyfontsize" + "beamer" + "fontawesome" + "fontspec" + "geometry" + "graphics" + "handoutwithnotes" + "hyperref" + "iftex" + "koma-script" + "l3kernel" + "l3packages" + "listings" + "nunito" + "pgf" + "qrcode" + "sourceserifpro" + "tcolorbox" + "tools" + "translations" + "url" + "xcolor" + "zref" + ]; + sha512.run = "8aacc57f0eb40e83a6331cf86b076b287787672421648df65814214b60e739697d97fea5d8d18f112c27ea60cd2f2b9a26c31fb6074b9c1f1cba4522e96a11af"; + sha512.doc = "fc7e441fac29da849714c79ed0f68e94059d09c1472b4c56b3f100f0e1af730963e9d0bedeb3bcbb87512ef68535321d6df13370cd9be3d5399cbc05e7f1cee7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2.0"; +}; +bgteubner = { + revision = 54080; + shortdesc = "Class for producing books for the publisher \"Teubner Verlag\""; + stripPrefix = 0; + sha512.run = "53d38b2bf03861553a60db38c06b5b7eb48404a08f4bad645b24383ac4131a5b60a0103d0d2217cde1aa4f8bd739db4389d25693bb6186fe0974b0ebb63fd567"; + sha512.doc = "344c8f7800a273b914265ccd9cf8175a040f021c07aa0fce3b6391db85e8ecc43d5d593aeb8707f82cc2c8c987b2d72700a2fe4d8b0bdfcaf2a525c5d79f7e3a"; + sha512.source = "ff33871afe34c6d578dd5d8e795e36e83a785893d8741dc2ddf2b8bb27062324f00e0f52b3cd3d993074a7e7d21207537f028f6f5dbf8384d02799d1108b9472"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.11"; +}; +bguq = { + revision = 27401; + shortdesc = "Improved quantifier stroke for Begriffsschrift packages"; + stripPrefix = 0; + fontMaps = [ + "Map bguq.map" + ]; + sha512.run = "8a795ba517941a07ec1445a16947ce5028cfd61ba2b5c818bc894ffa73d439162271d6269c67c8ee7afd6d13551d4a9bf73763c00b719bf3a9019a8e7d368256"; + sha512.doc = "1bfe38f2d904af63a5a0fd2ab4accd04fbd294083cc462f7d53f79819f40dccf1c3c729ad591d15327eb120bce847ae62c2bc9b9554ea278c1974e3b37296dc5"; + sha512.source = "108ecf4268a4491904d46f5aebdace10f8aab84a4333fddf94788b677088a584da284fd763a8f0ab19cbc335a3a143489a49836ba059971483faeaf40ecbb0de"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +bhcexam = { + revision = 64093; + shortdesc = "An exam class for mathematics teachers in China"; + stripPrefix = 0; + sha512.run = "7244442c52f57270055fad1ec87b00bb0f3ff4c89e37b57be051b29046348dc781e42b156186310d58eceb1ee9d4ff2fe287a3027642fbec3c9c315e00af9c68"; + sha512.doc = "3e16cf4f60c089a21d8e2d0a9c78e8204391ba7bc5a72d7fc23637e0c875a57dd1615b8332f6fea9c5a9bcb4fc17c4818bce708998c1c8c71d0d970e9bfdd132"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +bib-fr = { + revision = 15878; + shortdesc = "French translation of classical BibTeX styles"; + stripPrefix = 0; + sha512.run = "24e5ada94266ba8786470453bf8a076891e9b7efac1ff64fcb559bfe2c95875d3120634f94f464c9e40da0f45b18a78af1bc428106b31e85851a2998b58f0834"; + sha512.doc = "a19ffa9b3ce51d372a7467bdf7e360ac4a0faf45fc2205eadfaff16fb640ffb0cccac7fd0849a74955dcf612e353f0e25f94c0af9e3b5bf617f067606c1da120"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +bib2gls = { + revision = 69635; + shortdesc = "Command line application to convert .bib files to glossaries-extra.sty resource files"; + deps = [ + "glossaries-extra" + ]; + sha512.run = "e73d6e0c7596252dade43291fb26ae02c0ed8f2650498294d2b1c36d69e777411fc1637619226f34f80c7e5cc06d3ae07f3b5d2eb144a2e69bde16a22c4aa449"; + sha512.doc = "46d4a219969aaf897cb4c7705a00d1558b7b16cf0d4b16121672df8df2bdb0c0d0ee3350687b430f1d1d29eacee330aaee3206ef664c406c1d2b1c8c316de0ff"; + hasManpages = true; + sha512.source = "662855e5579429694325042e0256385b9a5c40a4b54e6cf98712432469243de567cd5ea68f1ea93a593428eaeaf09d9d5a97e3e670dfe9ba90cd6f8c2383a3d4"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "gpl3Plus" ]; + version = "3.9"; +}; +bib2gls.binfiles = [ + "bib2gls" + "convertgls2bib" +]; +bibarts = { + revision = 67407; + shortdesc = "\"Arts\"-style bibliographical information"; + stripPrefix = 0; + sha512.run = "358492693511d2de25fc7e080c862e1aa6a6ba40655fbf64991092a4a56c76a35f9fa9f8e0035fa042f0341f8fa9f13a5615079a2c9c56af36aaba4f41385865"; + sha512.doc = "d708263bf3d867e075281e0cdedca007fbcaf8cc333a8c7c0c9a0b79e68bce1c100b263a740e232a5f84861726dda947914a7c4ba52d87315163db9528c2c544"; + sha512.source = "b1d8043b2f7c49e6bfee9b1b82f361450878f6059cef790f12e9a26279caf25f2bf446b4b70c1882478503586b700e7b2e78a6c631264b1c2498ec493ba20ad3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.6"; +}; +bibcop = { + revision = 69467; + shortdesc = "Style checker for .bib files"; + deps = [ + "iexec" + "pgfopts" + ]; + sha512.run = "e67e6471a9572f502db740cdac0540d3ce848a3cd36c976fb72a5bbe11626dfccd3c40ea75d86186d584c16d5809e99afd6cebe6fc27fb874685fdcb05da5341"; + sha512.doc = "68d5b879566e871db328b92c8cd1d00c05698c07a140741d6584c5d3e2525725fe01e647938f396a505f6b28833d9df90b1984e334f7e781af2c9beb3f303209"; + hasManpages = true; + sha512.source = "e7feec5a9ba4772e0d647d34782879c5c6b535f62df35382369f8b405f8b1c8e874db819b4c68f86e58f15fff938e7c37f4eb3476e8aff984890883a3e8e1924"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.0.19"; +}; +bibcop.binfiles = [ + "bibcop" +]; +biber = { + revision = 68188; + shortdesc = "A BibTeX replacement for users of BibLaTeX"; + sha512.run = "07222b2bb0aed6b2de71b1e061c878e409205459decf998a7c100ae92dbecd91549a6c5e2e0dabe21f742fdfa7a57704252ec565d9e7ef0bb1d802fc1939edc6"; + sha512.doc = "a02c41efa4a5fd8ff79c8112dfc22b45e9717aa572021aaf93ede35ae57d91531dddc004497b562c605350dcff1c96441f7613d6c922e882652e9776707022b8"; + sha512.source = "8fd59f63eaa86ea4d87c8c01458fea16c0e470969f3dd6ac65e20954e8a63e793a58888cdb61f913fcc291fb5d2f3e0205e7e7488946738e27c23f1ac51be9b2"; + license = [ "artistic2" ]; + version = "2.19"; +}; +biber-ms = { + revision = 66478; + shortdesc = "A BibTeX replacement for users of BibLaTeX (multiscript version)"; + sha512.run = "8e78b381978835ea25e8a973fea35a653f37a23e4ab3f0a83f26808f142e4b2a91ce61ab230f7667b222af249bbbae08b40256cb82fb8ddf39c89b7dd042c3e8"; + sha512.doc = "82bbadac2732d19b750cbc9ffd76c9a26409837b0e1b9396d405b9a64a2e5e9997fc11c53d8d399f815bc822feb1ba3fe9fcb50c8e9401ef7b2c9790450ab784"; + sha512.source = "9c15f088c5c97d63b928ef10a8d1f0a628874ad664182b631e5a52407b1a034bea478fdbe1c287ddb703fd9c9d3d84a8bdb47ea09d6de25ad99aa1ef8e227fcd"; + license = [ "artistic2" ]; + version = "4.0-1"; +}; +biber-ms.binfiles = [ + "biber-ms" +]; +biber.binfiles = [ + "biber" +]; +bibexport = { + revision = 50677; + shortdesc = "Extract a BibTeX file based on a .aux file"; + sha512.run = "75f9cb374e0aee1b049e977e3ee1a855ae8f908a6c6191589ce9d9fc28a8358fedf93faa416b1020e157a8ec7a3980673d00e052a100c88724e86050ea5eb487"; + sha512.doc = "ec96364b4a9f7ab446c6b0104646e82cab1c9015e0d3dfac6a795e58e02dd3920737207d16089c5470ac32f76a61be949efa6899ca935322c0062f71f3477b16"; + sha512.source = "6c18b4e12e8eecdd03f6afae80766cebe3f826a1146c38b6387c6793abf284d3c44e7d4d6050675f01676128f1d073d8ee8f38f31a6081049b8c390b5a7813a1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.03"; +}; +bibexport.binfiles = [ + "bibexport" +]; +bibhtml = { + revision = 31607; + shortdesc = "BibTeX support for HTML files"; + stripPrefix = 0; + sha512.run = "c7245cce245740f0d930518cfee66dc513bd4b43c8b5804e1012fb95f401dbca2321be44ba6251de573723ec2e6da85fc77b9a9192004ac2144bfbeb3225d27c"; + sha512.doc = "cf01a0853d87180205651768b639ee4cf7ed1b6bb4869880489f57e37ed8fbff3e8406fbcae1d0c652b3d410f77af9b4d1932ee154c60cc79e2876014abf7b80"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.0.2"; +}; +biblatex = { + revision = 66403; + shortdesc = "Sophisticated Bibliographies in LaTeX"; + stripPrefix = 0; + deps = [ + "etoolbox" + "kvoptions" + "logreq" + "pdftexcmds" + "url" + ]; + sha512.run = "e07cd6233021bbe2f3591f866c3b3eeae083574f705da9505f6bcbb7284c243ac7f24440253c4557f0a300e9995188bf5915a42643e63eb80ff9e0fa4ffaff1c"; + sha512.doc = "f765e31a89e4deaa9578b30aa206d8f26ae7b3545a6575a5a28758263fc45eae6c5d3b5aa1233f3000f731ebed104180cf79fd051b47a79699c89305d626d0ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.19"; +}; +biblatex-abnt = { + revision = 49179; + shortdesc = "BibLaTeX style for Brazil's ABNT rules"; + stripPrefix = 0; + sha512.run = "f2c239aed726d57eb98cef8892c4b4295205d5a8d55a14b16db8bd6b42bf3f51aadb0dc767f97dfbcd8e57a1f867c5e344c604d726453113a007169edee0ff58"; + sha512.doc = "04158e1b92a2976d2a5cc107e00b5e4ab90a85799f9e55b25936fdd0e141fc2196f0f64577bf2eb8997b7ba5b7e8c575bb725febfc397940d271ecd5f56138a8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4"; +}; +biblatex-ajc2020unofficial = { + revision = 54401; + shortdesc = "BibLaTeX style for the Australasian Journal of Combinatorics"; + stripPrefix = 0; + sha512.run = "62d09153fea349881ec381bf6f2badd4453c5b2c328e8e3fa1cf99ae43cf62faf525bd453f02bb6d78e9f12ae4e35dd00c2c6f8efa015336bb13f485e8064683"; + sha512.doc = "b66f343c8456e3efb118fa18851dd08f298d5dcda4312c9688ff486db7a98fd5b3b953616f407d179480220ce905a6a6a08faa325061df9b71c6490277cdfa4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +biblatex-anonymous = { + revision = 48548; + shortdesc = "A tool to manage anonymous work with BibLaTeX"; + stripPrefix = 0; + sha512.run = "3a3cc037e3ce718c219e4bd4e380075d4a92d85cd1f490b8ffee10c5b80bb9e515f1f170b53eae033ea064cac2ddb3bb285655482e5cd65801403584fb9e215e"; + sha512.doc = "11b4a4f281068004c2bb11028200bf7f8b1461b4b40d0b52b60d60f145b3e9ea38fb672ae532d8430b0ed889df631b1dbeabcef5e9373b720d4a3c3354254789"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6.2"; +}; +biblatex-apa = { + revision = 66605; + shortdesc = "BibLaTeX citation and reference style for APA"; + stripPrefix = 0; + sha512.run = "d86ea9a83fd5c1f08bab77c12d6f93e241d444c10554918a8aa91ca4f9677531dac291962e354d2fb19668c3e59fa14e256039fc2cae2bc531c2ffaaa2ae3735"; + sha512.doc = "84f00557b32e8a50a1256d7a39635c77ee6a59c9fca1d36e571df8540afcef5cf0bf8b1dd648a0eaac1c45744d863774da2d0033223b5e3043653f8759b31388"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "9.17"; +}; +biblatex-apa6 = { + revision = 56209; + shortdesc = "BibLaTeX citation and reference style for APA 6th Edition"; + stripPrefix = 0; + sha512.run = "c327dac9368270aff53b8cc9319834c36b20701d379017c1ac0f4597cfcee56a5f9c149433e2629e2bcf708bb63d8b8706ce9c6dc009696870ebf06728f11b7d"; + sha512.doc = "4eb72746e8c627106cbf7e0a7164a30030cf87a6d91ec0afcef70e072dacdf2dcb386ff91e1ff648da178c6f01121c16277630752ce792d54812fd97cb699541"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "8.5"; +}; +biblatex-archaeology = { + revision = 53281; + shortdesc = "A collection of BibLaTeX styles for German prehistory"; + stripPrefix = 0; + sha512.run = "04c9541ac2f3cab21e412b0ea2efc284f9404f225f83f13c5ec3da2d6f3e7274e5d24647205079971beb11125c8fb3403bf09bac3ae5bbe353f6e2eb073d28c2"; + sha512.doc = "4cb13b2b394262a7c8ed212092cf65bd0707c1f0b0e8c62b1d166fc929a7ddd7f676e72b0750680908c67a17dbcd5dc1b558ef83b35c8ac7b43048fae2e56856"; + sha512.source = "0cef203b6be6246ca4664295d9b4d5403154e9813c3419c5473fdc950bfbbfb51f1b6caffd1af7891933684380e2b81756875eec9fd79ec0eeacd6f8ced7b09a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +biblatex-arthistory-bonn = { + revision = 46637; + shortdesc = "BibLaTeX citation style covers the citation and bibliography guidelines for art historians"; + stripPrefix = 0; + sha512.run = "93b48bb950e9a4bb81efabe4a3c8ee85d7056daeca88c1c1a070c5321b8caa0045c4005467cdc029f8a26b94a425235e36a36bdee163242194a5301ddd6fcc98"; + sha512.doc = "e31b7912ca34e6ec27c365c2b3e549cdfb60bd94c19b9f1cd54d35d2a1b99ef2702c3f818f7354ef4f5d3157c0e29538a94315ae7af8177de23893e598c7d439"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +biblatex-bath = { + revision = 63401; + shortdesc = "Harvard referencing style as recommended by the University of Bath Library"; + stripPrefix = 0; + sha512.run = "38075fd9040bad99fc95860f503173aa9be430317194c28fccc9ed385d7d596e9f738a436753c6d963b53fbaa714301fd2d92aa33d2ef6ce4cb6b902fa0923b0"; + sha512.doc = "e9005a72487eb7d1b4e5e7e8c024c65e2846435c8489d8766218ca6a2e77e902917a038491b9d6f1117db402397226b7c0f91805b25a9cb62ca90782ef15e8df"; + sha512.source = "1b6d136c520ec2f6db1fa99f278b0ca1a8d5b552a634012e772ed562296c1eeed1b84171ec64a4a79fe116a939108001ddc0b498f0768b0687fa45f7ca3f987b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.0"; +}; +biblatex-bookinarticle = { + revision = 40323; + shortdesc = "Manage book edited in article"; + stripPrefix = 0; + sha512.run = "8a7bfae09d95434d6db671e4037a2f1d5c1ba9cae5982e286389364ee2ff24f9a2daee78c69e529efd06be37d2e6a6f860820361feb42f5b84157dda2ef0988f"; + sha512.doc = "727228b915e6b370a74b4d38dffde3bbb7ae47973c33263bafab2aa6b640102775dbeeea7f09c046903dbfe86dbdfcdd8e0418d125a51678e603425328cd2da1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.1a"; +}; +biblatex-bookinother = { + revision = 54015; + shortdesc = "Manage book edited in other entry type"; + stripPrefix = 0; + sha512.run = "afafb9bf593dc3541ad527f09ee881fdda4af3bff78f02b68d53463a07494ac6c03ba55165738501b685e3e1d998eeb973e8431651ccf904b3ce0ea591dc0592"; + sha512.doc = "ebf06bec2cc1b083a472bcdf03772c9f5568a1482c926ebf886f02ece86a6f0c31a127d285ee16baadc4c0ea771eaac05e374c0a3de215d677b07a0335d362e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.3"; +}; +biblatex-bwl = { + revision = 26556; + shortdesc = "BibLaTeX citations for FU Berlin"; + stripPrefix = 0; + sha512.run = "ca5e20736a70ed02fbdada150433162b64b39b0d95bca623cebda8da821bfe8554f9409cdd49af7559737dbc6d6033bbf6868f5ed809b1004cbeba4bbabbc38f"; + sha512.doc = "32acf8bc10c07532e8d6174f3dd9a1f850acaeaaa5a91d14a1c299f2f5f22e34c619a41fd9ae7a90e097fd5ec30fdbce581f65560e2891f697ddb0106469f50b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +biblatex-caspervector = { + revision = 70496; + shortdesc = "A simple citation style for Chinese users"; + stripPrefix = 0; + sha512.run = "74ece2007520241b51a8518613401ceb2c37da921126f78ccfc6bb3a81765e186793a94197138cc6e52610d87a5a81a3b5159370aedd32190da2fed22346b1aa"; + sha512.doc = "f21b4c77c21f6a288bc7ea64e6959ae179117336e079ff4ef7ecf373b248ec2ad4b5c1499ecb39b18471ed33eec0fe11a0409e61761aff17ab73a7f01727ed11"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.7"; +}; +biblatex-cheatsheet = { + revision = 44685; + shortdesc = "BibLaTeX/Biber 'cheat sheet'"; + stripPrefix = 0; + sha512.run = "a974a8eeb4282f66ebdc7a57d40c76b0f2bc957249c130d4f97aa9f9749f5091745a87db277c3bef43d0f4e37790a9663949ca3bba3b28a16d37c13bd6029181"; + sha512.doc = "a2b9a82afe127d0bfb71f3a481eed3198e27ef35caa5cd08557ed35645f6209e9187f1e0c21d6fa51e6c32d0cf044c0d85373195a5f034c856fb4beec360af13"; + license = [ "lppl13c" ]; +}; +biblatex-chem = { + revision = 57904; + shortdesc = "A set of BibLaTeX implementations of chemistry-related bibliography styles"; + stripPrefix = 0; + sha512.run = "5339931e89e477284cfa76dcaa0be9ea7b3417dee4e20f8ff2a04da25bda4685270d3c001fd41f786f31c87e590b2aa4b597a517ef8086c75aad8f1e509a770b"; + sha512.doc = "17207489eb4d5ab5cf210882e6487dcf07fc30195facf27f3bab95f28fd8cfdd270da30d410579f6a8d91a1e82e7e12ff809fed47837e3ae521927b8251da5fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1z"; +}; +biblatex-chicago = { + revision = 65037; + shortdesc = "Chicago style files for BibLaTeX"; + stripPrefix = 0; + sha512.run = "dd93d36fbe11af94840c9dcd30695f5b291bc5da58b7e30e47960be42094cfb48a31a8d1c24dae41b56420f65b3b5849ad29a558387a9fb38006a9f816932841"; + sha512.doc = "e30297477d9e353bdd073b7afcfac2c890fb255e4c20ccbffea7fb3a3c6593496749f1cef0bb1d38aee649d3b054c844efb47008493f5410895a55b3369672c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3a"; +}; +biblatex-claves = { + revision = 43723; + shortdesc = "A tool to manage claves of old litterature with BibLaTeX"; + stripPrefix = 0; + sha512.run = "008cb8403f1b35a7fd077f8ac2f33f73ced090ce3d65ce678ecfe90af8ab6fb2b4349342aa838d2d4f1e78d0d87267c7b8206a3377c6490499ee9196498c130f"; + sha512.doc = "a11a4df38dbeb4c27f30b824c9f1ba230d273e227b8cdbfe5f61268a1a2b7ff3193e79d8e8bedb6f9334df39001b71a3ec78116637745679bf3d67582727371d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.1"; +}; +biblatex-cv = { + revision = 59433; + shortdesc = "Create a CV from BibTeX files"; + stripPrefix = 0; + sha512.run = "d034400abf6c0342a37e6e5de09d5eed252e80cfb93b4707f6e879edf6e190180046d28830fe382a6240d6000bcfb9277a66bf2e21b92ce9fe9deff0596f1c03"; + sha512.doc = "23093f0e8f472eac5db45026266c17b3337d478af6dc1776515417a2539ad671a67dba4ebee9f83407ee4c126cef5a6245106916188093ced89a52c44afba339"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +biblatex-dw = { + revision = 66579; + shortdesc = "Humanities styles for BibLaTeX"; + stripPrefix = 0; + sha512.run = "bcfc88a15950bce48844dfdfcaa8cc946d553c9fc31b3820dd52a9f4588c55e253cc593d13b1dda0b38153a21b93a3d9a868398296546f54b5b804c58eebaa1b"; + sha512.doc = "54699b3f4e89bafa89cec29ed14a0ac32269bd52a68dda7916961b50032fba9ad3acadebb1737d8bdffcfa07f99fd104ad3fe19f0a1f569258fb4ceacefcd1ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7b"; +}; +biblatex-enc = { + revision = 44627; + shortdesc = "BibLaTeX style for the Ecole nationale des chartes (Paris)"; + stripPrefix = 0; + sha512.run = "6aab8a819ce9a3ec2d6676ab8850c3fc6bb81e5af5c9414555581cc9d164184d18ec550fb0ca67d28d800826356f1c709144ee7d38c0cfbc274179fa813a3a0c"; + sha512.doc = "ae50544ebdf7bbf9ee708f193493ffa241ba91f0925a2bf03b6bf1ec486586fde3c630fe717f4f2904373c08a2f9a90afca86b50870f87aa0d04430554650223"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +biblatex-ext = { + revision = 66641; + shortdesc = "Extended BibLaTeX standard styles"; + stripPrefix = 0; + sha512.run = "d39e7a2418beb7b627bb6cb9566dc17553f0f33c6c720a6da760976d6f0333cc15763d79aa2dd09a70d571a3be886d4129896db14616e8e28d426cf41945da8c"; + sha512.doc = "bfca548e2bc673037efe14a54363787311c05c8518e868f7333d958f45b0a75da7d65caa9dd993ef37408414d27576ecc2cca7eb5d2e5e316f4f2f94c961d8cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.17"; +}; +biblatex-fiwi = { + revision = 45876; + shortdesc = "BibLaTeX styles for use in German humanities"; + stripPrefix = 0; + sha512.run = "72b1e41ac55403f144529fd5cbd88f51dfd61cd637bd8e6427a2714d3684ffa37774c698475994f1481442cc8eb336d8de398d55b3df28e5e1615b9cd74cef27"; + sha512.doc = "37fd37d39fee963af8567cf27cd266597175ccebe20f016c7dda699d95e6f7fd0408a57f9061b98996a6ce8eab04a8ed376e6e29b5cb41635d004d24082e91be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +biblatex-gb7714-2015 = { + revision = 69775; + shortdesc = "A BibLaTeX implementation of the GBT7714-2015 bibliography style for Chinese users"; + stripPrefix = 0; + sha512.run = "1390d40d1a34caa69d4b25d18e0f01c81974ade6b778f6daa85bfccd17a4e749145640ea66a565e2919d61c642a1c0c24e6403b3e7a3b5622e1b644b559902ca"; + sha512.doc = "18fd12ee1c680ba5e4fcbbfbe4e43f0d9163f7cf813ad20a0f264b37e252898b704a15c33c00559941d7b445b91b9652d97e46abf611ceee0885a96007279d69"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1p"; +}; +biblatex-german-legal = { + revision = 66461; + shortdesc = "Comprehensive citation style for German legal texts"; + stripPrefix = 0; + sha512.run = "0d447d700791b3e0a50fa98c14cd71c735e1e1196c9d0c23e86114942d2a9d7dfc9f769a6f8ea7aa78903f1c6bf5600dfcd7091250ef65f2a2a5295a796f8fd1"; + sha512.doc = "8b83f35af4cbc23c2e19dd35d3f798575f1df540bd4f10a9f0f7d732d5de6559cc0ad49df21753920eb659596b5e506e17fbc066fdab27552831d222da1e394d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "003"; +}; +biblatex-gost = { + revision = 66935; + shortdesc = "BibLaTeX support for GOST standard bibliographies"; + stripPrefix = 0; + sha512.run = "8d87595c133fd1b64ea7facda55a1a7a79dbedb93750e0f54abd26e5904d331200349a956eb03a67017015e85e9854e26f6753b5d2be2ef0f3e4d532eb0b7ddf"; + sha512.doc = "3ee6799d4dd00b4503fd6d7bb041d674c9e61d4ab3c366fe078a9db4a4da154601c13876dec51ba14e3322442e3174cda81212df26d2309e3517a60d06283051"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.24"; +}; +biblatex-historian = { + revision = 19787; + shortdesc = "A BibLaTeX style"; + stripPrefix = 0; + sha512.run = "bba5cedd64fcf0c0cfbf9b56c66838141917ba1e7c2f27aea5bda44261ba28366b465415e3674a2ce398812d5cefbb2727c7e5e1adf53a2d9779754849664502"; + sha512.doc = "ed87ab74fd06ccdfa0923289dcd7a37df695fdf76003aa7ab142c9d924fb69a81430ab7651314a9a391b9114dc2c2d63ffe94461bb00fd33d97ac9e8c5b2a8cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +biblatex-ieee = { + revision = 61243; + shortdesc = "IEEE style files for BibLaTeX"; + stripPrefix = 0; + sha512.run = "2f4dd68ea556dc56fde888294bd9a3368efcf4099b95b0c90e60225c3b99181de52b406a7e40a09792b6b58410174d74d774a0aeb1feb4c8bef69fd513861303"; + sha512.doc = "ef24c360fd211b79538aba8394a831a48c4b518bcecc516fee91191aad5b2eef06ce9e0e2e033134499a94dac4542803c32a207b2b71d48b14401b20f5aca549"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3f"; +}; +biblatex-ijsra = { + revision = 41634; + shortdesc = "BibLaTeX style for the International Journal of Student Research in Archaeology"; + stripPrefix = 0; + sha512.run = "040efc5b43e2642251921bcc49db1ae2e00342100d302bca24e2b7b11d1724797f1fe7aa254d01b35d1dfa316f2b0f739664f275031c498b157bb652c6aaef44"; + sha512.doc = "36cef635b4603606d36f13b489320e10fad48869b8cdbe78d6f81ca9f3caee0f3e14e408236b1f18e6c7cbf3cd414ed8eb2863058b31e761b4355c6ff1230dd3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +biblatex-iso690 = { + revision = 62866; + shortdesc = "BibLaTeX style for ISO 690 standard"; + stripPrefix = 0; + sha512.run = "e337c10a9eaee195b091deddb93fed9416912856599d31562812dc4b5818d495e6ed6443ea1c801298e351be7ae37f830e5ff23d31beba8ea0bcb682da15f5c2"; + sha512.doc = "ec7f5e962bbe119e583c8dd671b28229c39043e1aa06319772d878c8a49e466541ebd5adbab4e1b229afcbf91e9cf981dc6d0918f3358a12882bfa5d282d3a51"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.1"; +}; +biblatex-jura2 = { + revision = 64762; + shortdesc = "Citation style for the German legal profession"; + stripPrefix = 0; + sha512.run = "5fa0044f2a91cbdf550949829ccbec0a11fde1576c6f84f861f1899dbf2ebf4124a63a489f77e487194e61bf4c629772cc77aae6cb35260e8bf92e64552eeb7e"; + sha512.doc = "87d31c5f9c0ea71e28d26df03c88497e8bcf18b07784c57be3c55dba0660cf58e2113cef25e802ea6210a87cadcf2bb2398b43ffbff50519daa62b329b678c4a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +biblatex-juradiss = { + revision = 56502; + shortdesc = "BibLaTeX stylefiles for German law theses"; + stripPrefix = 0; + sha512.run = "6f78c1da8426508af972a27b6a23439a3b84c402e6df2494b333111cfddcebbbce639a49c8e900cf52b0e63724a41031b4fee82e0a17f07b479584bb66c809d8"; + sha512.doc = "94bbebfa29a491fa6e502e55236605b5a589c24920d235cbecb8c9372d1e580d586f643537a5ed6afbe6d1656f0d5ee8610cd09e3112a9e2fcd00581937016c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.23"; +}; +biblatex-license = { + revision = 58437; + shortdesc = "Add license data to the bibliography"; + stripPrefix = 0; + sha512.run = "f655338605eb7257b2746a73e4f29d58912addeb65a272b3135cd45b32035a58c0f9c9556dc9ffabc34ca8c3b00b4d8c4f44da6654d794dea3bc2a94b986bdae"; + sha512.doc = "8638454c5014f7df6c82edaf028872acd6f6a135389919178e50bb660236e63a299483f3ef4e83476e399e2cff71f1563e4a2fd111c1d18aac20273b3abbd744"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +biblatex-lncs = { + revision = 67053; + shortdesc = "BibLaTeX style for Springer Lecture Notes in Computer Science"; + stripPrefix = 0; + sha512.run = "b2ab630bfdd41150b0be50d3851c03413ca8c8fbb5756989bf4e0bd8f98480a65eadcb9b11ab879f5cdf3b6c980376ff6ca6507bd26248a9f1b42b9217f656df"; + sha512.doc = "ec622c2258d96900fa8daeef1aee6216eb933870eb09329cb90b7771b3e8668c88cfd253d4da0889ecb127421061bfa7cfbc8df27ac59eb58f7ae309eebc1f82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +biblatex-lni = { + revision = 68755; + shortdesc = "LNI style for BibLaTeX"; + stripPrefix = 0; + sha512.run = "f5d636b5cfa0125be2f5f87f41ebd0ce7bb853f7eddb4a7601f72ad42267e6456e2212bcdf5d820db3cd8b2aca058123a8dc2bbc67305cedf331d83b9a007b6f"; + sha512.doc = "87f37b95865ccc3d66fd514fa038b8c224e1a7df502e6ab59e65a37457f129b1188e510fee0f307296222d40ce241acc307e6e2d2cef7598cc009fb21a9fd7f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +biblatex-luh-ipw = { + revision = 32180; + shortdesc = "BibLaTeX styles for social sciences"; + stripPrefix = 0; + sha512.run = "e58e2522d9a4711454166c816b971bbf6bab1f8d1c7eea122933c8b7955a49ad294df410fe0a75375134b77d442bd5214ee25d56d766be7e5843e4ac14d7ef5a"; + sha512.doc = "bbfa55884d3dd3167618f6f9595c301e5faeab0a35cd058cc68922a2aa8362cb3a9d035eaea06ee43c428dd89d23538b15bd4c79c1e095ad10aa4d1d7184f92d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +biblatex-manuscripts-philology = { + revision = 66977; + shortdesc = "Manage classical manuscripts with BibLaTeX"; + stripPrefix = 0; + sha512.run = "8ac244a6dbdc725b256e5de0389ab4e4bef4f8e1c85d8c173680e66f1ba793679c8388e70e18791c544091a8bc7870459a945c6a5f298a80c530e58d071bf11d"; + sha512.doc = "eedeb99e8712337165d684c38621a0bd7829d3071fe8df1496d2347c5f0b8150af68b20caaad69c8d3e3f08c75a52ab63df5d16c48863d0ea179f15c0f55a490"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.4"; +}; +biblatex-mla = { + revision = 62138; + shortdesc = "MLA style files for BibLaTeX"; + stripPrefix = 0; + sha512.run = "f286ec7553818df5900e6d5e791d56c815711bdf6dbc3a317bd416dfae9e7b86d94e4d43cb4846cffcef9e9a246f0a059835ab6812172130a31984dbf39b58c1"; + sha512.doc = "a6e5861754ca4e1bb42dc054188777b63d11c1438f83399c4752ea849284bfc7a97943e891983b88117047f59652441c31edf82f382370ba233deafa0445c17f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1a"; +}; +biblatex-morenames = { + revision = 43049; + shortdesc = "New names for standard BibLaTeX entry type"; + stripPrefix = 0; + sha512.run = "7e847faa586655aa7b3c92d9379540b2f5e78fb50843e36416e21552c6a9e810945f5b60a96a14c35570bd0403ac29a43af29bd46e2ecb0d87e3c6ac90345826"; + sha512.doc = "c30953fabfd4717c56cc818e55f83995ceb203bfd67775aced3fe8f1f4f4a92b118ed9c40665ea28944806cb2d409a541f59df530e37274e3bc3babfbe55713a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.1"; +}; +biblatex-ms = { + revision = 66480; + shortdesc = "Sophisticated Bibliographies in LaTeX (multiscript version)"; + stripPrefix = 0; + deps = [ + "etoolbox" + "kvoptions" + "logreq" + "pdftexcmds" + "url" + ]; + sha512.run = "811bcee998c24f46ca5fb8bef9532148c97233766c30f0022cce7022ce0d5f0b5ee260ef0d7276095dc4ccba3dcf67e90a4cc1abf080951c9bd7cfa4237428d6"; + sha512.doc = "dd6dcf78d0423578a41b47ab84fee4f398a238ac15e098e09d8cee93d5d08d4af62a72d90fadcd5ddb497cf7a4c4b6017fc721c1de246d0aedc98ccb32bad111"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0-1"; +}; +biblatex-multiple-dm = { + revision = 37081; + shortdesc = "Load multiple datamodels in BibLaTeX"; + stripPrefix = 0; + sha512.run = "9f83220ae7f2576b4f58394634dea831e5759bf6560ede3244ffb9d18fbf522e9c728c47a4184a43c2dcf6807481a964d7e468e4e6cb921129440bf917925a8f"; + sha512.doc = "f33e650b2faac0c7b9d078f0f4fd9da8a58562c6a9a8b13acbb4b23001d2ecdde105c08b6b6e62f138783d61f3e071f8780afee2f170c134c275ae62ca5a597a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +biblatex-musuos = { + revision = 24097; + shortdesc = "A BibLaTeX style for citations in musuos.cls"; + stripPrefix = 0; + sha512.run = "129d1c12bc0e4e8fd339f7bc37442947dc492700a721933c9dda0b18edf78a9b402884376cb7d80893a06834f70a5d377fd264813cdf869ce5e40667f296d618"; + sha512.doc = "d2fc62bb25394195a161e47ba116f2e795e6009b5f547d09cae2e21cc0f8171c610013622c2a019438e04b6c089d17c21333e3c70b8faeb09f90113cca9536c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +biblatex-nature = { + revision = 57262; + shortdesc = "BibLaTeX support for Nature"; + stripPrefix = 0; + sha512.run = "b4b12abe904d96c9489dbdf248042ed1f1af1474921e0835027220059492f2441aace661260fa3632a65bb2c1ec0ab4e521014e63a14f7fb835293fd8191c2fe"; + sha512.doc = "c5169189b1225dba8631a0f7f5ceb5bdb5267888b2817716e23aa79bd4516665965b4343ed5e1a8e5099eb59ca64cea9edbd31613f7cb02f161b8ba561c6d4e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3d"; +}; +biblatex-nejm = { + revision = 49839; + shortdesc = "BibLaTeX style for the New England Journal of Medicine (NEJM)"; + stripPrefix = 0; + sha512.run = "97443b036769ffe3487cefa6cb5647eadfb8cdb20db0f6607028298b196a0df1ddf1fdee85e3f163a138da47f28019ab32147f65a5f7cb23b46596c96a772799"; + sha512.doc = "bfcf854e7545237dab17bfe3cd2045a1914397a02e5fa31bde2bce8c0e44c474fe0389e2cb8cd59516f4db9a3b538524f8321723a49c41233de637075bb41720"; + sha512.source = "7a2cd3e8205c9b081e9a9601240dffd3943eef31cab5339de92be61fd023f3889958292ba8698760e8d8e6cf196f306b76e34c677d6aa2074271d11cbd78f799"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5.0"; +}; +biblatex-nottsclassic = { + revision = 41596; + shortdesc = "Citation style for the University of Nottingham"; + stripPrefix = 0; + sha512.run = "a0da4bac443dcbc2c0d8b97d4eed21c171e876cdaee3699a0652c905088056802bc12e1f16965b6b2063e1ca0dee808f5f5e9fd9e5f6da7f956548fd5bf0b222"; + sha512.doc = "d0b6de2439ff0698b14781deecd260d5851b44da80a10827e0b0bf5ff21ddbe46b979dae9afe988ec1520387668a802a777fba28a830b0e0a7ce60988bfe375a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +biblatex-opcit-booktitle = { + revision = 48983; + shortdesc = "Use op. cit. for the booktitle of a subentry"; + stripPrefix = 0; + sha512.run = "4779618979e358380b2d9d2163a8e62274093bc4e7d7a959364b1980d86110233f3927a80e2dac7390ec43d0626f92311d5923657872d25bdcab5d93dd84956a"; + sha512.doc = "81990177b6cb92dde0e2d1371fa6e5ad6685c9750eac87063e336fd3412b46eca40e091bf2222631f6abcef995fd04c82a3cfd3f87baa2b069c74457edf7f13a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.0"; +}; +biblatex-oxref = { + revision = 68950; + shortdesc = "BibLaTeX styles inspired by the Oxford Guide to Style"; + stripPrefix = 0; + sha512.run = "4059920c5183f9ed337b9fbc0e56ddaed2bd7e089028729c606981dddd113e1d916f335283608774b56bc9fbda53822e1e2b9ab8d9c3283a05bbda530ff4e234"; + sha512.doc = "55d8336df5219f430dce34e2138d770557e9d68ede3d15b34a1a1b164d92d58a27664470764c45fb65dc6b5f6e1550e7fdcc9aa5f266027d3543418f7b6d2b07"; + sha512.source = "df89dae5cdd3a5edf49bd49ecb1226dfa8e9145ca9abfd10a065ea4a5f12e65b4d0dcafc9b4c6067b180029797cebdab7d50f42c8dcb0fdaa21e33fc09963eca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +biblatex-philosophy = { + revision = 64414; + shortdesc = "Styles for using BibLaTeX for work in philosophy"; + stripPrefix = 0; + sha512.run = "dad59b9acdfadb96f0be528cdc0cf5c0a89fc6d35f8d74f6d15230cf1177f4766111b6fcd21fb5aaf1694f1d0e720cf98d6228a89bc87c91124a04526e7291bd"; + sha512.doc = "1baca667f89ca22f56d323764de02e93f2ff543e68af85a8e0bf4f23e005caf251d6771012e2df44ba9df35b516e6db449037e5e8d8d54691ff68080957d459a"; + sha512.source = "d8a6ace3497436b0993f3da25a5e13879a23eca44d4eccab00377b0a62db1a2d1cb1e40083c7bd958a3d3968c35d88c0acc13ae9e07dd8b8c559a4770d7bc6c7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.8g"; +}; +biblatex-phys = { + revision = 55643; + shortdesc = "A BibLaTeX implementation of the AIP and APS bibliography style"; + stripPrefix = 0; + sha512.run = "76a37bc2d37e2813dc39b9b21cf38788e6da14e60222e4fb36aa90e5c933c18adfcbc1c8affcf9a8e70df14d516a4827599b2c5979828e7e28b77b7b3021329d"; + sha512.doc = "62fe809519f86ad46136c18247b5c440766778b61d1d406df302aec76756a2259f06ae175af2267de30c1347db511f9482503326c28e1d382039d5047a75a961"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +biblatex-publist = { + revision = 70515; + shortdesc = "BibLaTeX bibliography support for publication lists"; + stripPrefix = 0; + sha512.run = "6c93da7da5d847fedc4e383e759a8132053ba71bd3e5d33d300f1e31893b6f0c9e528e731e4973814cdaf597da2d22ba6ac4eaf9f75d82f47b46d41899e11906"; + sha512.doc = "83c98481b654b9a905d4ff6b3ec0419dad60ef428fd2b5d8a4602b73f3b061864435be3f0259f5e74b14b7c5887c7a722c223baf519bc07ac46554de58746a60"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.8"; +}; +biblatex-readbbl = { + revision = 61549; + shortdesc = "Read a .bbl file created by biber"; + stripPrefix = 0; + sha512.run = "d74bd07be5983c2731a418ae0167d99e2bdf8d1a9569186a8940f89af3b9a6fe82f641717638c693b98b61637a705fe280d033282d1e37c279aeb080c4b66399"; + sha512.doc = "9ca0584c36e7247496cd0375e0f6585695f509c4e88d29f23158c5c5c7897758d678082c9c836d0cc878423ab23d54e9a0c2b40c5b63830fd8996a35b4aa09cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +biblatex-realauthor = { + revision = 45865; + shortdesc = "Indicate the real author of a work"; + stripPrefix = 0; + sha512.run = "dec592d3f16a431286f7887af863664d777e09e5784a53e9b99247e3bae86c7928907135980d27614e52ab6bd1f1f59a3e8633ecde05d3f9b84b97c84ccefa23"; + sha512.doc = "bf0ed482905bfcf9bf5a8eda61f609037316012aa2992796c57d48b5f5ccac496dd372ef5e8c88262c8bc5b2d543cbf5f6aba8ff1833a99db6929dfbf379d2cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7.1a"; +}; +biblatex-sbl = { + revision = 63639; + shortdesc = "Society of Biblical Literature (SBL) style files for BibLaTeX"; + stripPrefix = 0; + sha512.run = "6aff57b41510357eb5d73322254fe9f8462917909cbef6124733419122e681494c9ad13966438c5cabb8efffed527b1a455539bb092b9bbe61e6ea8883f9d73d"; + sha512.doc = "e61925481c93e5a1536df91db28544d124aafa5de0871da78b069f4e1765e8a68b4b7e040a4ccdb5c3d8a16140397d33d4e04c212220ba2290968f438e4239a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.14"; +}; +biblatex-science = { + revision = 48945; + shortdesc = "BibLaTeX implementation of the Science bibliography style"; + stripPrefix = 0; + sha512.run = "e75dccc1a01975776cf94c17aad531823844085e4fa2ba54ba4f74d77ad193c26238eed602f309760f3057b6fc405fd01ec2a7a20647cd8570889832b1ee6bdb"; + sha512.doc = "ad7d8fd4e54830d77f0a155a04cd523c5c789745b5da34b8ea1efe59ffd4ee1673045dec58d28b8234993a70061337178cddda2267506366549c2639f6c917b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +biblatex-shortfields = { + revision = 45858; + shortdesc = "Use short forms of fields with BibLaTeX"; + stripPrefix = 0; + sha512.run = "be9562c2b79e1f01a110708eb6c0de165a9f596bd18ee72dd6c8add0bf380222a31ae12d86ab843083ae3e7f47a608826b985455f4c8501bbe21d4f0a0e15b80"; + sha512.doc = "e6e5e6c113ef43a9784f9000637d526f0bc989358d690d4f41be01e1e22abcb33f347421c727c411c2c02f0c11b1c60d54e7fc23180bd6f66c5c46bf29fc1202"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +biblatex-socialscienceshuberlin = { + revision = 47839; + shortdesc = "BibLaTeX-style for the social sciences at HU Berlin"; + stripPrefix = 0; + sha512.run = "f927cccda37e1ab37bd01b49f3247b688ba0186db5b162ab9b73db7be5f83d1b261bcfbf355d575a3905cdfca2421b6b592ae0763d7575957ea382b451fb6099"; + sha512.doc = "30c411b27e50e0f4ac46385a07606846ae3dd744879de257e2f2abec829e5920957d55e970255cc51cb768f3ca0aab629f30d2860e5745c4addf5aac10ecaca3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.1"; +}; +biblatex-software = { + revision = 64030; + shortdesc = "BibLaTeX stylefiles for software products"; + stripPrefix = 0; + sha512.run = "a95344eb338410804347bc0273eacda0c69804a5dd6886932d11d72879f4c59798cc9bf902667957cc26b56adc0c2f7f747e8967f85fe5602dc1e786bd3a717e"; + sha512.doc = "cfe81f1a29f49a756df7595b18ebd492df77fb7ca208418b8627f49180a0a8bcd28b779dea58a88de16b6aa6553243b2755df3e16bca696ecb8a17fc3773135e"; + sha512.source = "6ee3d3df8bbce5dfd06f64b4e959742e8cb273db8f0606baeef97750dabb0391fcf409dce603772c525a0ad10d543e476d9ec217eced690b0c84e7a547a48f32"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2-5"; +}; +biblatex-source-division = { + revision = 45379; + shortdesc = "References by \"division\" in classical sources"; + stripPrefix = 0; + sha512.run = "f7a9b6a9f8fb21a5b9f06e3904ec2147ccd21383c3ced8852b22d0cf62088be103b674466ae571ace6bea52904f6cfb79ef2982bdb16679d02ff1d260d5b3517"; + sha512.doc = "1ae3883454e6aafc91b996de520a4669a06a67cd74b9df7e7cb7d096291d5f1dbe728a2a0fbd3b5968fdebf64946e829c4722bff33ff52ccbf32d8055f042144"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4.2"; +}; +biblatex-spbasic = { + revision = 61439; + shortdesc = "A BibLaTeX style emulating Springer's old spbasic.bst"; + stripPrefix = 0; + sha512.run = "478c5cf4f9996e8b15b13a1ea08b53ea03ef731666095f5374bbca6e16c93d0f049b891540742821140e91a30a8af1fe3c233ec45df1dc777b7c408b52676d97"; + sha512.doc = "9c12f5fc1b328ef0369e7c82c2a25162568cd1d1568aed4ace480a639a38e10642e93ba20939fb0adfed2ee16b44e9a7abcb3eeb6fb51bcbe47bce7436a590fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +biblatex-subseries = { + revision = 43330; + shortdesc = "Manages subseries with BibLaTeX"; + stripPrefix = 0; + sha512.run = "37955d7e547fceb3e3856f5e367d39a4952ee0d604652963db2a54466e9d6c1effb6b2c195ffd1dd15eec5552df97419a09763bc51af06c6726dbe40a6e3bbae"; + sha512.doc = "94bf4807e0623c35690ef7b1fd879710a762630224c0a52ee4e7b4a96c27001a9653de2c7d2ecd2a12cda448bfbdc336c54bcc8fb6674782af017cddfdc8e5fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +biblatex-swiss-legal = { + revision = 64491; + shortdesc = "Bibliography and citation styles following Swiss legal practice"; + stripPrefix = 0; + sha512.run = "12781675dfedd279313be790c218e7e2fab876774207a45caf8f7843eed74a37c460038cf403d3ca38a5b849866917a24e5d61df25cc7ca44606f9b606e95a26"; + sha512.doc = "04338344d00c9df040b2aaedca7a6c8d34caf1077b9da7322ab7db6b17c1fa32da7c170e45621f5705f552eee3c2392f78a6bafa8bcb918a07452d7e696cfba2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2a"; +}; +biblatex-trad = { + revision = 58169; + shortdesc = "\"Traditional\" BibTeX styles with BibLaTeX"; + stripPrefix = 0; + sha512.run = "e14b9326eb05af2a89eac072d6c71f61527a53a813605bbb399703d2a23cf7ddcfaeb2cc77f6f7b8959e05833ae3eb343224bf126907193af557d09fc1746552"; + sha512.doc = "32d6fa6369359e15717257be6e89f77081dbd352654d4c60d55f4de9c5f522f7d222b51bfb5a1eedd7f6378343d041380c5e97e559e681bcf7647e0695ca13fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +biblatex-true-citepages-omit = { + revision = 44653; + shortdesc = "Correction of some limitation of the citepages=omit option of BibLaTeX styles"; + stripPrefix = 0; + sha512.run = "908f6544890f69b4ca405c94e68c4814c52956bb77108f8e29bb4b6b63ad7de3bc0b1f1213a612f9e0ebd94ddc054907092451a9f326476f39e18a1f81ed0c63"; + sha512.doc = "bb53e66c1aec87669be8bb608f82cd7683692cf87aeed792d1e9d49045039c15fc7113fe116e04332e8aa6331101a6e97e97f655e26cecee9636409d810f77e7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.0"; +}; +biblatex-unified = { + revision = 64975; + shortdesc = "BibLaTeX implementation of the unified stylesheet for linguistics journals"; + stripPrefix = 0; + sha512.run = "01d07011f31b2e62d6438390fa81b5b86af50a9007ef66316a8c2125c2670015fba458fbe128a409c49510baa054b2dbe6c0ed0f153366c5aab317c38f62ff84"; + sha512.doc = "56158b821a29bbe55b67520c9109569afa8b9338af18875da42f95abdf934e5b89bfd9c4bdd41de7d5f263011ab98516916d358be4f36278c6d4cdacb8964300"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.20"; +}; +biblatex-vancouver = { + revision = 55339; + shortdesc = "Vancouver style for BibLaTeX"; + stripPrefix = 0; + sha512.run = "9d31315ce02bc47869a3e11644fe3160bb7b0178f87f71a9f3c06e54326c49bb1c37daee0c02f7185ef50513afe0aa4bbf8070b91db3181a2185a138daef48f8"; + sha512.doc = "ac285c5568d8651e81680576950d593eb5247b636c1c27b0a2a4a6758bc151b51f6e2b4938bc9273cc748924cb9f6193f6b58b883692ce03fb272316b8ec7204"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.1"; +}; +biblatex2bibitem = { + revision = 67201; + shortdesc = "Convert BibLaTeX-generated bibliography to bibitems"; + stripPrefix = 0; + sha512.run = "ff86dc4068b0b3065e19af6447a71396337d9e7e5394777c1c385b714d01f2ce983c45923b460c60784024a8068ad68f05ee8dfd14039b65c2d9d9a61ef584a5"; + sha512.doc = "21a53b0f4612fc18cb43f12cd6b1d1f72db896d0c55f73928fd11399598c04973595895d7cfafa546507e19cb25811118de9d07a8e9e1e242e22bb8d17e3486a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.2"; +}; +bibleref = { + revision = 55626; + shortdesc = "Format bible citations"; + stripPrefix = 0; + sha512.run = "261773de4bfeb039d4cb3f2dd88ca7c2ae229d2844ae0f5f454e06d888d9543fbe1439490895a49bbcbc79d8335151bba2a35bf36777113a965613efdcf9225e"; + sha512.doc = "964f8547c073db2b174d9ddfd1f6d0ff06df5bc51b2050725da20687f84ca835f58ee238f3f1a9d6d4ebc1858217ed0d8b2950964cdd638012d91e94bf92aa19"; + sha512.source = "09329d9142cfeb1f70778f46d0396aaf20c7ab2a215d76120ba11147368236ab98a24ebe386f68aaf253991af4c95a320339e5d07e956132d9d3d08ede63bb79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.25"; +}; +bibleref-french = { + revision = 53138; + shortdesc = "French translations for bibleref"; + stripPrefix = 0; + sha512.run = "f768d01206a35a6ca18ba777fb159294f566be365845bc82d344e9eaa3dd7cd0c1763564b7e17d4a1b851330405cfb3c383019b575276bd9b12d084c4845ed89"; + sha512.doc = "e72ac2b74f01df60c998896b76013eec56a3d8cda8df2f26f92d05d342760204913d7d70a6c8f63680f54bf3c84fb1c654c213ec2356dcf189bf9e134ce4de30"; + sha512.source = "f70a734e6391ff8681a6e58c3161ed5bc894a9bff26a6b0cedd4d868acc0412fee0069ff937a247b129186c8d73b43305cb6747678aabfd0537c1238c9ee2305"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.3"; +}; +bibleref-german = { + revision = 21923; + shortdesc = "German adaptation of bibleref"; + stripPrefix = 0; + sha512.run = "094177e505025eef5262b876fc49cfb09435b653c87fb1ee7453650e94f098bfbc7f5c78684849b3ce0cec2019d85a0413728397b5ffaf32bde542d8fa86222f"; + sha512.doc = "c3c610fd8a80ca5a0b8de6ce4aac887a7d16f01e21d845fad595e1d5d6069d8e89459dfd187cc458d21bf2247f4f2c7fe72233a12c8e532b9466f2ceea283360"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +bibleref-lds = { + revision = 25526; + shortdesc = "Bible references, including those to the scriptures of the Church of Jesus Christ of Latter Day Saints"; + stripPrefix = 0; + sha512.run = "ba3c4e41b566d0a26bd9f0d11d8e776fe04a18aac451435ff0283ff273971138407753bd6806f34708c5a2f0c1b2581c71de46bbc2e0c8063c9838b3d946f2ca"; + sha512.doc = "6fd81f90d0c94644231e911ab44827b77864842a3fa91127fb53114179488e5ffd66a404a1b5afee513e0cd3f4c83f38cae547e6dd6484403926c4c46b5cdec7"; + sha512.source = "0494b05fd3881cc273e8232c398e80ddca4c1286b10aef5d341c6c3573ee40cd5ad1b7a2ae0aab9fd505f94a4bf98643453648b7cc52fda09f5e705a8b4da863"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +bibleref-mouth = { + revision = 25527; + shortdesc = "Consistent formatting of Bible references"; + stripPrefix = 0; + sha512.run = "5ae9356781549cb5ecbdfa33085ede0fdbcb7f131d55484153484c777f88e23cf965507afde803e7bc5b775aeb416b9ee767815b5dbec444a3d21be18c7445f4"; + sha512.doc = "a904b4c9c0c8f3ff1feaaad8d1650b383ff0110bcf463f004938c51bce84ffc860082bf3e598922eedf0aeaa664ef0379ea3304f6dc5b681679d9545026c6bf4"; + sha512.source = "5ad805eb19d6ce8fef804117b462eb1f1dff887c3b6326fd42eba88c7a218ada84992bc419d889f04363ae9b7073b13ebb5f7a002225191fc22c2a2cb5824514"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +bibleref-parse = { + revision = 22054; + shortdesc = "Specify Bible passages in human-readable format"; + stripPrefix = 0; + sha512.run = "3af7da247ff7f9708ef076a3fe110979e7ff07be0afb08597feeda9ae31e60a66eb2bbbb5da015e10566e83a116cc9f2efa56fe91a57717230fb35bd004c209d"; + sha512.doc = "08393d76bca59dcbd715cc443ffbf7a1e15894ac6a2963d0ce770c96974c14d42283fd9237c215fe454ec4403a21387ba9dee52ea1bd93b83ab4a13fbc65157c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +bibletext = { + revision = 45196; + shortdesc = "Insert Bible passages by their reference"; + stripPrefix = 0; + sha512.run = "3c5170b747c6426099c021390f7ac226ebf9dbe42ff586c698b3489d47639fcd4198a4cf49261bba9335caebf8f39488d65fe851d60d9f3c2cc2127539ef080a"; + sha512.doc = "ea38659b5b2bc252760937ecf21d4ac3e8986ac8be6afdc1f2205d84696b8da55e02037bcddb24de389d54a692240ae946ab3e41a0a7913015da4d7b5e12da7f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1.2"; +}; +biblist = { + revision = 17116; + shortdesc = "Print a BibTeX database"; + stripPrefix = 0; + sha512.run = "02f006139b475cb5d4ec2bf85ec098de78f5bed7242ec693317ad4e01acb62a8c5479f295a8a1409fccd41b327daa75a2639b67d9838777b8355e6bd40af478c"; + sha512.doc = "b5bdd51d7acb738569671f13dbd25fc7b98a8e2e03e324e9501a20ac34cf1ae3578fcd622be73a80467e47a64a81f4d897c4e167b07a5ff5d06635b09dbec51d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +bibtex = { + revision = 66186; + shortdesc = "Process bibliographies (bib files) for LaTeX or other formats"; + deps = [ + "kpathsea" + ]; + sha512.run = "568a72b269dbcb0d5c723e346e8118a0ed923273460d9518891616cbf7b174b17cd75acff02f092176d71b6020483de75df20994bfb66c2cd46432c33d5ade3d"; + sha512.doc = "4f95c010ded89688791e1115ce4e167740b43e9e48d596b2621e6c18b4529479da9441351b463946e7efa1e428cba3d60112c5f7a5e008733a00fc64050723a9"; + hasManpages = true; + hasRunfiles = true; + license = [ "knuth" ]; + version = "0.99d"; +}; +bibtex.binfiles = [ + "bibtex" +]; +bibtex8 = { + revision = 66186; + shortdesc = "BibTeX variant supporting 8-bit encodings"; + sha512.run = "27008a8ccf05b7f48f7668ea171c9d53063fc26c09ac4507a3eaa86eb22b94cbd70ba6c2b7a8d439d7978a3860be37733dcbc17f7cef930d06dc5a45a89c95d5"; + sha512.doc = "c305fe0afcaab072ee07542b8bae8475ce205744500f81c6de400b2bcd7ac05ff65a025301319f80a668ed35d653105c0ec0ab392c0c893f5d76802a1806bd04"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "3.72"; +}; +bibtex8.binfiles = [ + "bibtex8" +]; +bibtexperllibs = { + revision = 68910; + shortdesc = "BibTeX Perl Libraries"; + sha512.run = "54e8413435420357c6e4acb1ab28a6aa602f1a222ed4b3350aea498a3516f48cfec0d04e9951a3ea0117184855e32d891d2c04af98231763eb1c5f7bd1700aa5"; + sha512.doc = "e2a1f67710cbb6b732f5dc9b39e4ced5150792c06d0455704375cfd6def134dfbe54a8d92dc1dd88896a6d5405e662dceb15f0282e9d82a9d2f857a91a8b4fe0"; + hasManpages = true; + sha512.source = "92cd4a937f3783305396a5705bc7a0d80371a22405865be33e1ff1caef7ec0a479ad58d9d80d45218273dd21541eb3167ac0cffba8ac16ec5d46ada1ea4e6145"; + hasRunfiles = true; + license = [ "gpl1Only" "artistic1-cl8" "publicDomain" ]; + version = "1.9"; +}; +bibtexperllibs.binfiles = [ + "ltx2unitxt" +]; +bibtexu = { + revision = 66186; + shortdesc = "BibTeX variant supporting Unicode (UTF-8), via ICU"; + sha512.run = "fce13fca4fd3d65b04a451365c5df50e4990bb62b0e8f878b712e9062f7d240a33ca6cfdbccd2ad2df0179be1cbaf2421ca32bdb745f3b9d9c67829d4c739916"; + sha512.doc = "0f200681fd81074a5f23477ff99ac9e08e2d123056544edf7bc5b7b7645c22b74b66404028133037b5e47ffc4ff7c0059a1ed375ed0d3e4d211632c44f37072c"; + hasManpages = true; + license = [ "gpl1Only" ]; + version = "3.72"; +}; +bibtexu.binfiles = [ + "bibtexu" +]; +bibtools = { + revision = 67386; + shortdesc = "Bib management tools"; + stripPrefix = 0; + sha512.run = "72472e2c51a0b984feae71dd1bacd72880df1438406301219c80f1dc6a8702b0d7c1e2bfad7ffdbd025e58c14a069335d4f5d6f1fe981d5bca259a6eba94bd4b"; + sha512.source = "3507bf7da29aad37a43cdd1ab2668908e227a2002438fb161c822fbac48be0e6b120070d6866fa553205ed404375d160e3a8b756c0681fb6a3e3b5600ac7a7b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bibtopic = { + revision = 15878; + shortdesc = "Include multiple bibliographies in a document"; + stripPrefix = 0; + sha512.run = "34e2a644cc4472f415522e6e798bcb1e2d623afd4783b07f4904405c63296ec912fb6c1d03f80d51c37ab81944cddb5b4f3678a22a7151d89376ed9aa343e9d7"; + sha512.doc = "5849fd57abb9bd847833993e660e342a537562bea9fba76376f3885d3bd09360c5783e4f04828137b43c076b635a2d566d908be48287c3fe6645c2abcba06652"; + sha512.source = "2b6d11221e625b6d568874d12cbc7b45d074ebe2bb973d63fcbb9d85689a4c27824f3eec68fcaa46f0de707767baa516c3925ff0fc4d6a90518584847844ede9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1a"; +}; +bibtopicprefix = { + revision = 15878; + shortdesc = "Prefix references to bibliographies produced by bibtopic"; + stripPrefix = 0; + sha512.run = "1df7d78498b6de233aea92cb1b18f73893b8cab723fb614a9fe895e5131639c1b4f4318cbe103ea4d9308e383627873576664f0af3ac6fd26aebd5b8b0036379"; + sha512.doc = "473a7db7638f471fd87b1cb242a3a593e3ff0aa4586c1fbe906cf12f2dd866a27ab50176b01d3f4158cdf0fc263fa54ce16eb63c797392349fbc90a8422c3b2f"; + sha512.source = "ebb06f55dd58c5948e5586ba29fe3aff33533eb3b044e07be71da0f20512af21d9808ae7d970f168189bc84ccb9bde6a19e935d7d6280e929d169250d3781a3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +bibunits = { + revision = 15878; + shortdesc = "Multiple bibliographies in one document"; + stripPrefix = 0; + sha512.run = "5658d508b876a88f3916a190a9090d66f2dbee98260af8d23c8358d0708f27fc80d4cf6c348b1f6e1ff196e7de6d5567e371ada640a9a602185611fb09e64ddd"; + sha512.doc = "888e5a4c1863c15112ece5763b01525a1a74f97ae1270495a41d598e73c4583ce2b9e28030b3054dcfebd60b038fb2d32938d6be947477fca93014fac70676af"; + sha512.source = "37cbb8ff6443757982a97bf6efa90881807712ebd7f0ce2975ef4960ef74e0541cea9fbffd64f765b6631378f3d21e2ac308ea1554709b6c2582b7cf7485398e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +bidi = { + revision = 67798; + shortdesc = "Bidirectional typesetting in plain TeX and LaTeX, using XeTeX"; + stripPrefix = 0; + sha512.run = "e589f50dbd63df9d711540ad90b53384e52a5a0b353e2ba050657af3273f3dd7b65925101465d89831ea133504701c6d05d01ef959fcaa2570bb1188384c621d"; + sha512.doc = "09ac7b97d9d1a93b80e8dac120cd6e70932ca9239dc94202449a476979caadd596677a210b27700e3638c3cf0bcecf98c4f903ea228f94545a2cf5cb206abcc8"; + sha512.source = "1bdd170bb3065027106944aa23b99311482fd90a019a6bd1e87044f03a04f672e0b01a31d4d09e213db7b228718f7e9ad15d77acfcef7412af8ae180935fd77c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "39.8"; +}; +bidi-atbegshi = { + revision = 62009; + shortdesc = "Bidi-aware shipout macros"; + stripPrefix = 0; + sha512.run = "5b16cfee9c71927cff133db3b967dc835634553d0980f74164fe8996ef86c3529439e85e00678219879cab41bde2027f3258b2862906b58634713e4b7d16c515"; + sha512.doc = "05b8118cbc59f06aeb87ab3b5b6a7f7a14dd23543c9d45621352ceec58998601a97af31bb6b0c999047efb362c24508f769be3c2e483c21a814b8ff35bd0bb96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +bidicontour = { + revision = 34631; + shortdesc = "Bidi-aware coloured contour around text"; + stripPrefix = 0; + sha512.run = "10364edc592375f69912888945e6d555df30627498aaae409b727392c64cd4aac386433119578a7a01a48bd0cff84aae33079593219b282feb9d96a68bdde78f"; + sha512.doc = "a1a3f9692ea2e462305f8c6db432586eb76d78cef5fa0e9057cbe5766ad99e25c560ad658569a92d1885e373fb6215fe2f9bcbc1c69b46c3088d36eb92e1aae9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +bidihl = { + revision = 37795; + shortdesc = "Experimental bidi-aware text highlighting"; + stripPrefix = 0; + sha512.run = "fd82ad18b96cdd782fddab8739e09978d08fc37e8c65a177bde930671e102c9ffefe7465fc766860068188f6b9f8222119ac791f07223f79e9840f25659ea3ea"; + sha512.doc = "c9d0503857f2cfa960e36872757afcab17b2631caa8a33112ff2361694939774052a5249db62d21831e19c17826f422853a78c5522094706bd4208d4c5223019"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +bidipagegrid = { + revision = 34632; + shortdesc = "Bidi-aware page grid in background"; + stripPrefix = 0; + sha512.run = "b823a646d97c15ad9beb3aebeb7b2156aefc3ffd7bdec813e9cb2481e137cd661936c57bacc3b8c42509151205dbd4096329b5cbec25bd06698b698c59739551"; + sha512.doc = "615d87ca4c29e0a30cf1eee08819b10419a2f399a88f2bfed5bfb6eaf7b1adc8b64a2ccac5da7bedab4e4b951e80488b97203b9960980ca5919f653cc4218996"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +bidipresentation = { + revision = 35267; + shortdesc = "Experimental bidi presentation"; + stripPrefix = 0; + sha512.run = "a41f98c3f009f7f8de8a41e386cc829c55650e603ccaa8e7e381fae45be2872e0b20e66b68e4d7ef8110abf7c9f6661865d49f7c0cf3ca4ae6f781c3ef5bc0ac"; + sha512.doc = "56993d41b237d25e00536926b3b23f1b1a6940aabe4f636df73cabd5ec27252de9fb8ff17d872cec3cda7a0a3b8b13013ec77477dd89ebba83a8406da3ee144d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +bidishadowtext = { + revision = 34633; + shortdesc = "Bidi-aware shadow text"; + stripPrefix = 0; + sha512.run = "bf9a75be6d1f37055c793a16b0a4d019579adcbe14a93b64cec5495e4d7c8bcd8b8c6d86906714f8aa47be5789209a1ce78d19e8023b44b9d52409b281797310"; + sha512.doc = "ac2f47ed1a5535ff1f0030c38bc210b2e3905bd46ce7024d5237387faf87be6a408ea35648f83a2ad7697ec09a91a4cce1aebd32c3446756adf1955bfa97f7c3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +bigfoot = { + revision = 38248; + shortdesc = "Footnotes for critical editions"; + stripPrefix = 0; + sha512.run = "f56fb1545e0a044a143d1a257b9784b5f5dcc56d68bbeb52f909eb928e9d749729135f0c76b3af6dd0306add550b440d32aee21c33e70b9b48a5a82220623702"; + sha512.doc = "f5935a5ede836798f3eab1ff61d528870a07be712047a64aa5af5576a1c6032e9d88fb5c42cf216e0f9812266f9a8562b5290301446c654dcb46146d7b60a16e"; + sha512.source = "75316aff3c594fd904adec7cadd0b24aff9d527479d0c59f3fc654772e29cdb4cca938fe5fef6e14b9928fb25f37fdd3f7a894a81f95810813875c4fd419dff6"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.1"; +}; +bigintcalc = { + revision = 53172; + shortdesc = "Integer calculations on very large numbers"; + stripPrefix = 0; + sha512.run = "c801e5953008e8cd8521886496238f4f7a86a6c65a160255beb3fd6a41a48dd7bfa2da438f8e1ae4c79b51f769f0e07bcaa7c3c8aa6e1204ea656aca3d1f4620"; + sha512.doc = "f5e7cc163157e429906489cb3cb94d8694c01be3c720e03b85bb24c7bd757391cf09e08f3d88df4ae7485978042e9d408fc5af0d93e016c82912479d40457079"; + sha512.source = "e829ad1e3a118e8fd0ea0e632740ed49db65603d6fdcc7d40126a048db5cc0f73c9f4aa64d81902794ed308ca31a153044a56ef37ac179918b24be71ae168f64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +bigints = { + revision = 29803; + shortdesc = "Writing big integrals"; + stripPrefix = 0; + sha512.run = "23f9a529af214771f74c6921baf8582b6a3c5e170d0fa511c260f5dd3fb6cb6194ef4082ed299dc0a3ff8e413981a36b594b440e7bc5512c7d2732fed9eb7a8e"; + sha512.doc = "46799d5c6758657eadca7fb30d214baf47c237b63655a71ad19e188fd54b664397babbbc5cf6d9897e81decd027dea1e0d1a6fea97384461ec8976fc19c7fd8d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bilingualpages = { + revision = 59643; + shortdesc = "Typeset two columns in parallel"; + stripPrefix = 0; + sha512.run = "e7d92cd1e11e1604f94b3a825953ed1f876a39dce3dd383e7ea1e4e166b9ffb21786911f4b408ab5d53e6f770225176251096ca9df0a187feb530a27ad167b5c"; + sha512.doc = "bcbd9f48dad1b84c96fef7d6b5e0a343a261a20ff35434c5e01d4b200229764adff383f2a718c6cbd89e4b208e6de1c403fd7c614dc1c247bc5a344cd3f3d504"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +binarytree = { + revision = 41777; + shortdesc = "Drawing binary trees using TikZ"; + stripPrefix = 0; + sha512.run = "b2204194393811994915604d428e0b537bf871681ea42a93d1e26a74d01cdee3ccd7817e7705cb6a3b9a1f2a97381e23226db9d671ddc36beb5c478271099cc0"; + sha512.doc = "4ef9f7db1d9cf124112e3f3e5c6db7e0b53bd72a5d7674a9f0ac7c471b88ff72309705b8d3942277a93883ef821907f0119d4dd3f645c8caa098f363612df68a"; + sha512.source = "ff1e8ce1d07c2011624086ae5810220af3e28f19eba4dff9e090e757787797afded50d937a7c1f503eb32bdc91cee2b0b1b42486381b725e57a127e5751ae5d7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +binomexp = { + revision = 15878; + shortdesc = "Calculate Pascal's triangle"; + stripPrefix = 0; + sha512.run = "61cd0072f766bc4abb1e3ed828d06c0e0ae6fb74902ad86e6c4ff3279ddd84386bbb0b1d669d9e71eef362c8d50577047e6076b174ca5b54da8680a43c5e1715"; + sha512.doc = "9f8e24377ef858e0b3ecc94dc87eeeae08931084316034ea5e3de822ed8b6a65c4744b744a547aea19d3486bb6f2b04f46f1e7ec81cac2470d16b7134885d355"; + sha512.source = "96ac7f02535a36555dc773b096324e821fa554423dc1d3fbb3436042a2ffa63e7d28b8d872b03b961143178aad40b6d14ef0be7378be99782e94f957889489d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +biochemistry-colors = { + revision = 54512; + shortdesc = "Colors used to display amino acids, nucleotides, sugars or atoms in biochemistry"; + stripPrefix = 0; + sha512.run = "ff6e61f48eaae649c5b14b60e85c46743dabc6fb841f3f2bdda0723a5a6cfb7a45e21e48574e4bc558ddd436474c356c5d2f767cee1299da3ff67db5c70c03d0"; + sha512.doc = "0abc9a2d3318627f861be23bd175836efc6956147fbfc16f9ec84b4ff5f137f7910a12ec370c3baf3ad2dc08ca2ca197bd02e371ec258e9538eac4f11233f9d1"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.00"; +}; +biocon = { + revision = 15878; + shortdesc = "Typesetting biological species names"; + stripPrefix = 0; + sha512.run = "54676e4acaee07609c379d387af4f06b45a4bc0051a3333c250555536114b3862da73d70305b1f62adf7afca2b4a2157cce8afd9e20f10e49b01d4c2ad351cdb"; + sha512.doc = "c296c8402129338295a3043a66bab91a499b29703f7ecead0a045e0820ced683a4c25168ecdfc184c07282904afed3703b31f8ca707492a913de7c49a351c322"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +biolett-bst = { + revision = 66115; + shortdesc = "A BibTeX style for the journal \"Biology Letters\""; + stripPrefix = 0; + sha512.run = "35fa3e7a46706c715783b10997888a45cfe6f84b465562f894eb9914915e608f420b631e9d4e7fabe3d3d83424c089288c848ee34cae5cd08d1d778e4ad64155"; + sha512.doc = "2a839dfad925ca94f26bada0d14fecdd7c096d3c99e903a57e4a1d093b2d1b9cf8770974aa1ac51baa9759c68e2a4fdd6efbc861c5bdebaea4cb523c00662487"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +bitelist = { + revision = 25779; + shortdesc = "Split list, in TeX's mouth"; + stripPrefix = 0; + sha512.run = "a2022ccc4f45f7a911eea4e99557764770b4e6f2ba0333e043fda2419e29d93bac40462fd36568354a415a9b27204a38620e6191fddcdb053f8956aac5747cbf"; + sha512.doc = "5c3186464aaadbf269b26321ed9447e8a1633ca9b4a7b323da692277ab074f15b6c39df866eb41955dbd6ca8b0ff76a115786f3273fdb293bfb79893dfe0de99"; + sha512.source = "0dfbf3dc2ad3b11ce91f1f5f6949f3d8559e0f90044abff431af556560382b5063a96e661c7e95667f3079a7386df85938e937743e2f185a13f4d8a2259fc4eb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +bithesis = { + revision = 70136; + shortdesc = "Templates for the Beijing Institute of Technology"; + stripPrefix = 0; + sha512.run = "d5b2a6bc2fc272a452a3e8f7e7c05244b701d77d409d026456826d63d11d7f5c0296f00980ab06326d0334c47fe1b2ba4f8397379e35ba3a8a64e7ca1071a3be"; + sha512.doc = "8c31242c162f0d0927b95385cad88d9214294c270674ae5d1674f03e825e9d09cb93b26aa480ca7e38043038b9bfdfd7f50acd14e2f5644f038db451c2dc09a0"; + sha512.source = "0d35711be0c9f09810429a72611892e2d0ee4d9bba4af3ea59379dec238509c057cc7ae1efdec4b531e78cfc7a96ef18309c374bc48408ff066ff7462253de4d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6.2"; +}; +bitpattern = { + revision = 39073; + shortdesc = "Typeset bit pattern diagrams"; + stripPrefix = 0; + sha512.run = "34a0ade2d1110a15618b2ecc7f46a413519a0864a2e5cd1e25eacb9dd76cc66b35565b4b8c015780fa1d3dc88e2237ae7de33c77e29fd5428758a526959625af"; + sha512.doc = "d1fd1b2b46d7846804c9163889bf3a96cda2e11e35de2328c9043f99ccd9d0778710219593565ec9231775e1404d713edd7998e3fa909ada7dee35333137b56f"; + sha512.source = "8c5860792394f85ab87d2a3ab234496a1f550a24f98a5e2f8f4d815b24e4fd3e7d0a1ffefac3912536d22cd39fdbd91db013b1c8e05d4de92aca47db679fa7e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bitset = { + revision = 53837; + shortdesc = "Handle bit-vector datatype"; + stripPrefix = 0; + deps = [ + "bigintcalc" + ]; + sha512.run = "b1c9121312404d3daf6907623972c35e0f36cfb4197e589bd937c145506cb5a2d9d8c1f665ae3b4d3ec093e55bb146c0b67cd0858425b704fe29989b9924ccb7"; + sha512.doc = "a5a3ba9d27dc3d9658c1d261f798fdc5e6dc4cedd85287ef77d2a0341048d71f8575d4fbd711e499233e0991c51765953931d87d40dd22fa2a4e8ecb9f2a8dab"; + sha512.source = "40580c17ac81137d533eb013ed14bc092281b354ce42883c0a3c33ee7843be7ebed0ce642746ba9e173bedf8ee6f6c243b65e692ef2a50654ada23e323166c89"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +bitter = { + revision = 67598; + shortdesc = "The Bitter family of fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map bitter.map" + ]; + sha512.run = "217870554e509c3bbfb70d3da9e3ccc4fb1013db4508034ace728ff114e31eb9f56511b1e89c702d21cf1b522ae799601a0908ffe70a3856aee29c595a22483e"; + sha512.doc = "2bff9fef75632fb43c59cba04ea531eba8420c3841a0343cbb1d56995a8c322beff036da61d494112e9c89f82d367ec3bcc9e39ecbe153c99dc012cbc8c15bea"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; +}; +bizcard = { + revision = 15878; + shortdesc = "Typeset business cards"; + stripPrefix = 0; + sha512.run = "1575499c7118a96f3273c5b8d68e25a20410daeecbce48d1e6355039b97867b34a06c40785052d378dffbc80b862beafc06b9fedf62254d8b31445d8f95cdd29"; + sha512.doc = "f529ec77b370def29ad77927170874dc02af37bfb9f57a4e1383b5adaa93f6e59aa33df06d40a80e2374db514f55e2f115e7c8f22e4c92cbd3cb621d8a735bdd"; + sha512.source = "ea5567a5b3f2a8f70954ca9b5939cb4f9cda05dd128da4d6592dcab25babf284d5fdb2c6af7a31e181f871802ab267fe012d9da3df963be19d789c6984c88cd5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +bjfuthesis = { + revision = 59809; + shortdesc = "A thesis class for Beijing Forestry University"; + stripPrefix = 0; + sha512.run = "e017032edb4e87ae31318179de5da789cbe2164ea5679d69e928a138242adb1afa8dfb3f8b9b7796bc6d5bf21c143f51e931656439a451ddf868c77c7a7ac559"; + sha512.doc = "657e45d4faf201c2d878c5323e3fd7a283bbe4bb4f868b1413e9b8eaa1db00d03771a4d4211e23549121c5dd480cfcfd8ee8e0edd7e56615a3c941c100465c44"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.2.1"; +}; +blacklettert1 = { + revision = 15878; + shortdesc = "T1-encoded versions of Haralambous old German fonts"; + stripPrefix = 0; + sha512.run = "eb7d531fd91c6d46145c76a08678033e20097805b3a911fa85194217104e071c56d3842cee83c275a11cd4cdee162aee4630d86025cab76806f20e19c975076d"; + sha512.doc = "a1f18f4adc7f26b9e71db6f171ddb4a8eb15912cf57445110a9da52eb4e0b017a0ace85ddc46ec2df36e73ee3d9bf8dee087fe4467f46bb2bd7f708108585412"; + sha512.source = "0951e374a22fda09a3fe51e3a7743874c774a756560fb63a68aa199ad2cca674ee87d1dd30b98709b0e74e018e0eec878316ff303575eabb014158311f22a273"; + hasRunfiles = true; + license = [ "free" ]; +}; +blindtext = { + revision = 25039; + shortdesc = "Producing 'blind' text for testing"; + stripPrefix = 0; + sha512.run = "3baf7b9db502824ebf1cf8892cafb189654ad0a91a8cfba399e103b417a91e4f137918b73201fb5988c8dcecabc557865e190cdf77af35e634d0519d52715795"; + sha512.doc = "290a4c76fbeb8003c6972933baaa95e62b37310594e459e27083326977d370c1408de95eae44d05d848c61eb22b555792e5e38f4a0b70267d6a87c0314268501"; + sha512.source = "2ca8cbd44a56c36ea66fbad415524697009af4c7e39164bb43d9c689743666c05aded6042393bba6d658a0be1df3ca5ac64a6e8da2e9c726fbcd1500239c4532"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +blkarray = { + revision = 36406; + shortdesc = "Extended array and tabular"; + stripPrefix = 0; + sha512.run = "5ed66db84619cd9130e68e05acf617ed0007db9ea35895e31ad96b543f7d6a01fddf00304f05b0fb71ec9484556326ebad1d895b81b821b9f19fe6ae9f3ee12e"; + sha512.doc = "81f1d5b5609531deda3475eb906b841d33a6e01ee49c54102474d852856172954d943ee02648fd1ce74d5bf4030db8d36c7b6786c9fe3105f3be08fea36fe207"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07"; +}; +blochsphere = { + revision = 38388; + shortdesc = "Draw pseudo-3D diagrams of Bloch spheres"; + stripPrefix = 0; + sha512.run = "cf7a7865e3e994f2b951a24018b1b1b71ce2b61542751f495dc14ebc4964a1f4a2833d95bde9b8920d4a4fd60ccc03760e66b8ab64f6b14ff77b9206c98e19a2"; + sha512.doc = "3a9706ba73e8da7280495f9d32d32a38c9119bac9b8497e7e1bc69a704fde2552848d60ab0ec175544046fdc06b3e8887b4eaeb1c50a5796144cd56e4a44d9e3"; + sha512.source = "d5c54403afb2cc4db7c5340fe6aaec54da4066f6e9898cbf1f1d2ee3d4ba9a001699e8e32cf38fd87b355c1adbbbcb649635f9abc07976c2139fa6e851a987ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +block = { + revision = 17209; + shortdesc = "A block letter style for the letter class"; + stripPrefix = 0; + sha512.run = "0dedf4b50238e3f12c3d17eca19e4640f2a36511fd65fe4d0baf4f221df279a5d9f28024cb0e20f528e32921e1d6b4c785071210e5ff6471c73e42e58faf89a5"; + sha512.doc = "77b8c5b6949fb7eade5eee082be1c28433136b8374d45f255a80daa0c7a0340a3154a9f6f174fc52b25c252f1b5a2304b32e26c6d6a2f9af033569d7ba602952"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +blockdraw_mp = { + revision = 15878; + shortdesc = "Block diagrams and bond graphs, with MetaPost"; + stripPrefix = 0; + sha512.run = "86bd39051095fde2a99b232b1139c4c196467d0e1825b3c1c73bd25551a55edb6417a0810b20c4ac3d53ff82519364f2ac72fde3845a750396a4f6a8966c73ef"; + sha512.doc = "01fc4226a952c76b52726d1217649d9d98ec708163e4a9b997e36f505b385ed145182bca747a2b5334cfe8b4663d010a699664728c5be05cc4daba63ff1f3c00"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +blopentype = { + revision = 69080; + shortdesc = "A basic LuaTeX OpenType handler"; + stripPrefix = 0; + deps = [ + "gates" + "texapi" + "yax" + ]; + sha512.run = "6cb45600033a679ed498e59c2045561683edb0193cc330e2650a83cdd37e18daca45db700f5767492800af78f365c6f1b03766d92ec759b3448287c7b378bd63"; + sha512.doc = "1159bcbc24dd6a860909f0b16911b3a88e3deb2bcc0670b85d31ac82a34b5e991cf73f305c8517a8dee1088eddc3c4cb02d8c5778d897efea254a715e78de294"; + hasRunfiles = true; + license = [ "lppl13c" "mit" ]; + version = "0.0.4"; +}; +bloques = { + revision = 22490; + shortdesc = "Generate control diagrams"; + stripPrefix = 0; + sha512.run = "06b18467956f6782de7e0dad41f66a79e1c7dc5c3ff007a8970f24740dd5edfae0e375288c3510a8acfcdfda7b568f2316827cad1b6a006789afe8a31f829f4f"; + sha512.doc = "fe37018f08820f21bf188301d0145e42b50563d8dbd8f9b232e6fa1b7eecda931e8a42d40f47ed7cbae24235833eebab874e30dd24d8393dc728d6fcb10057e1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +blowup = { + revision = 67640; + shortdesc = "Upscale or downscale all pages of a document"; + stripPrefix = 0; + sha512.run = "52cb1cbef8c97f265114decec953472b2a8804659d60ce3227aa5904827dacb1cd6156c189a6e75aacb2051d8237298690c6ce6816ce9425fc293c8e32962236"; + sha512.doc = "c038502451d1952927f9b9e1648fed009452d00a5d9db06429f8968ec453cb7863444ee0e41073dce5c0c4990c2487ebd818ad51bf72d1e7a91257ab76684729"; + sha512.source = "632342966fb59de8f7ccda1fc7062c691fa2829462c67d4edc7cbfbed3dafe4888979baa60a502793f0db88343c1b8bcbb5e8cf18727e854b4a8443ff06f564a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2.0"; +}; +blox = { + revision = 57949; + shortdesc = "Draw block diagrams, using TikZ"; + stripPrefix = 0; + sha512.run = "4f874416f3115f9abc5514d805952d576d3ee597475ad27523990820d485a3601e43e503a23d948a875db343ce4817eb7fedae6aef48a78a38a1656478190b74"; + sha512.doc = "a9b8c964c8a43d9d6b0c4b5555c2c555246d04ad0c0b1209ddf953958f52af8e2ce3118f573d12c0bf727a2545a326bd284e61a27afd417cb672480e1025a5ac"; + sha512.source = "7c8ab912484f90d5aa8f406e2d3c6176eb8908457cb184260c600fd72fb91c5ecd179ec4d80c55b6eddd7607c7fc36e3ec51af5fff31e9352b17360c470e8405"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.51"; +}; +bmstu = { + revision = 65897; + shortdesc = "A LaTeX class for Bauman Moscow State Technical University"; + stripPrefix = 0; + sha512.run = "e8e2af194ab8dc10e88543cdd888438d6dabd37651fcb331df2a2372c863884ee3ff77344d14a79608ef6e87d3b82042497f26045db3007b4cfc85fa33831667"; + sha512.doc = "da816655e19a91d152a088e92078a9ef2c35f4a7b379d63e353eebb7b4047d459b73e5f53537e9be5a80d56ebe80e1f20db1305fb21fff14fedd518a11c494db"; + hasRunfiles = true; + license = [ "lppl13c" "free" ]; + version = "2.0.0"; +}; +bmstu-iu8 = { + revision = 61937; + shortdesc = "A class for IU8 reports"; + stripPrefix = 0; + sha512.run = "7d4d2f575bf4a3a14024b478610a1d3d1fb9a9609492890ce4edf9f3ed1e34abd99f519d3574c39347f35f8bd2bb1b19569ed6a3652443063942bb0900877ba6"; + sha512.doc = "142cceab83b83c5a0eddde753f67b44cb2e881cd01a4de1059606e02cc241d6d55f271d525db523f82f6ecd68bf6bb09dffcb15adb1b4b080b5701e041ec6f2e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2"; +}; +bnumexpr = { + revision = 59244; + shortdesc = "Extends eTeX's \numexpr...\relax construct to big integers"; + stripPrefix = 0; + sha512.run = "a868239dada7f16d52c5d16705ad796d6bc536b1943b5c0bb9538fc72242f3fdbe2cd579367e9230e20e2b3e53725ba8cf25d7d2aaca660a338d7863f4661d46"; + sha512.doc = "a367968a29bfe0d1496a8d444d6809a1ddb6f91031f1aafed30fdd2cd8ba929972554b186dfc897b273cb347f569922b7d59d3c472b385bd2ac1fadfadaa122e"; + sha512.source = "447c6dccda5a51d86be058cdbfbd7e38d46964754df21f155f8a41892dd0492efab2fb391b7144a0c5876cc5852176fa14310f78cf4fc8e4ffc9d28fe9f75e87"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +bodegraph = { + revision = 68785; + shortdesc = "Draw Bode, Nyquist and Black plots with gnuplot and TikZ"; + stripPrefix = 0; + sha512.run = "65c14de3d529c5f439ffe83dbeeb6551152bfebcaa4f6ca8f22bb29340f23cd2541fa7934a5c0163f6b9a604d76c7c2bda3ee6ac1ed3fca04367c08e5f580f39"; + sha512.doc = "e9dc19657f581260a59f141747bee7b15d96352eb4b59a2decf116e1287a980b106bfff220642e4d1828d65201484e657d8f4513faf7998c0ce3938a98484ae1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +bodeplot = { + revision = 69742; + shortdesc = "Draw Bode, Nyquist and Nichols plots with gnuplot or pgfplots"; + stripPrefix = 0; + sha512.run = "596a8cca1eeaf49acf1f24341601b4b7b1ff64f5df72a811738d57e2d0e5644cc9f6096b15825f208068446dfd825f9fa61406451234669df95683f746770d44"; + sha512.doc = "d0eb443a98da30d66becca6e48e4e66b4efaf31d0405ff5d559738018f0c760a660175978f603f9c648af4ba20942a58b82c45f5a5446f39d7bfa05c944b4db4"; + sha512.source = "84b487c782ccbc9f8a76331a7a01f3059d39052f440db82ba93ee40f82f420f2ebc25ab8a9351deb0a1261603d0866a7acf89a457bdb2c0b446d541a6bd78163"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.7"; +}; +bohr = { + revision = 62977; + shortdesc = "Simple atom representation according to the Bohr model"; + stripPrefix = 0; + sha512.run = "257faafc089c9864a7878e9690a96ef8a5468fa4a310232609cb769c4bd80c15ee7923ad73feac782cda4690f699ab3734dbac05e39588a34fca576fe8dd042c"; + sha512.doc = "0ffcb6071ad55d9e6a38c9cff810b625fcd6eb08e476e9ac7fb0bae73ca5373517de22a536c2348ac8646b62d70167521d70dd46327dadebfdb9e69facc0f27a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +boisik = { + revision = 15878; + shortdesc = "A font inspired by Baskerville design"; + stripPrefix = 0; + sha512.run = "48403f4b18cb23e7e16e3cbf19d066dc7e1576f4d9ae42b94a4a34508905f5e6e2f8f60f2de7881a29b8525c86a8120a76f1f66f8b9ea047da0a884637b1bb9e"; + sha512.doc = "c68e8434fe456c5e58a6ebb9e744c81dfba5098c0fb12024de750f73022e300016a424bd1ad9cc85c3122c9a0c863737b2e27f2b151667955f92ebbdc060c6bd"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.5"; +}; +boites = { + revision = 32235; + shortdesc = "Boxes that may break across pages"; + stripPrefix = 0; + sha512.run = "894f6d2484e9b72a24816c34e1254ae8a6d011610770e40590fdc3ed22a24b6f655418694de256a6522e4024f4df033c017f294743113256583ffb8445a63bec"; + sha512.doc = "22ef96e0f64b4d42b978abbba806f497fecf686d76b159bf3d06aedefe1097569053a11ced6c3ff2c7d05f975345957af0790f2035fa3af396b123da7d41cd7c"; + sha512.source = "682b3e64f47f71849853bb8752e342ca74a8937e5f1f0f75ba3428ec3e32593339e5f0c90695aa112edd2f607dc4e1c80985558f354b6181f73e5da6cffee8ad"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +bold-extra = { + revision = 17076; + shortdesc = "Use bold small caps and typewriter fonts"; + stripPrefix = 0; + sha512.run = "cc12de98493fc01b9a59993ad32e646102751c3023e64f66255a1b66505d3cc2f82d71ac53b4f6691e083bcce3037e521a35feb09cd5019d662a6ce56cc55032"; + sha512.doc = "4bb27a63f711421437385c2a76f26d74cbfcf6ac5bd8811bf4ca5a0da354608dbc6ff295c3943edae1701fefece397ec356361176a9713f607c9677b8222b7af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +boldtensors = { + revision = 15878; + shortdesc = "Bold latin and greek characters through simple prefix characters"; + stripPrefix = 0; + sha512.run = "3c2d17f2bf8ff48638540ec5a3ea57bc835227291fdf6580747a87dafeed6afa4f49b91a67154da35dfac9a405aab2aaed5bbef1ac188291319a972b4e50ebeb"; + sha512.doc = "657bdc4960e2d40621520240840ab4252e927baca704da0388e3124938c55de834e59cf8ff3d900aa294ac366ae7b1367909cbe885de08790d51380726960146"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +bondgraph = { + revision = 21670; + shortdesc = "Create bond graph figures in LaTeX documents"; + stripPrefix = 0; + sha512.run = "171233d7850335c1819bf1f74e0bcd1c221e5db73d092b0efea71ad35f71b16e4f240c3c791f9022a9e21ab7a2bb62f20ad06609051ecb54fd0640add0ef8381"; + sha512.doc = "0697b880e1bcd51c3b5c2e035a15f852f943ffb86ea2952b460f01e42ced2e4fad8f8b15f32f58cc7771c28ca9bf66f2302914bf08d6696b6d952d347199134c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +bondgraphs = { + revision = 36605; + shortdesc = "Draws bond graphs in LaTeX, using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "61ed449d8fcee24f383762eeac54949d709fe3fbcf06598acb8849613c68ce2f445dfb4cfc7871bb6c61bec65ed45e8888dadf036f299a4d5c0bad13db0e16ba"; + sha512.doc = "223448f91f0cb9f7b032439aeddc85c132f39bf5ffacd058b76c85db825df15bb47bafe333a0ae8afb089864fe966973fbde6da0e02e1fa46b8077e3f84eb6f3"; + sha512.source = "564af88ac0098d102bfc84932159dcb3df8e06ab30e849d7e039b13ae8855dc6093230e743bef13750a464eadfad54edea4f1a548c14e2df79e03b1f79754254"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +book-of-common-prayer = { + revision = 62240; + shortdesc = "Typeset in the style of \"Book of Common Prayer\""; + stripPrefix = 0; + sha512.run = "d8a2f2c007569e8a4da6150592fcc67a4e60083a2af93d15a8bcbd31b9b2d56c46d28b9f4c708714e894638b22fd9a4013175f45082c9982a05c8081855d7d9c"; + sha512.doc = "98f7dc43da85180db2a3f00462b02b23977dfb46b7a9af0d4bb97a2bbc2babcb906a1762b94ac9196bc6ca5fe11bf0690e1e59d74ea1f97f16d9d747e94b5020"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +bookcover = { + revision = 65394; + shortdesc = "A class for book covers and dust jackets"; + stripPrefix = 0; + sha512.run = "83a7b06e32e082d810fac22a842f646b692e75a4e0ad67ba59a1d39d0f0931970b615708900b139c7e11f05bb012797d2664808929ca7ba8bcfc37ae75c878ac"; + sha512.doc = "f58d3796696fd576fec15770cbe04d14e659a1d8e6570ae39c17760686b75cc941ccc2dcacb923fca4c2ffcf671a9ee1d63f348d8fe22058078eb22c5a1fdbf4"; + sha512.source = "7e40a0b41b7f46570925c6fabedddeea2b52cdf8a4844db4c9df48f12029424c08d8777227ce119dc46bc27dbbefe43284d581bf5c7f2aeb2b6d24ba2c83e401"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "3.5"; +}; +bookdb = { + revision = 37536; + shortdesc = "A BibTeX style file for cataloguing a home library"; + stripPrefix = 0; + sha512.run = "3e44184427ce346930b35fc2ea3b508d9f32c1e89cc01d66046e271d61e0bbfde54b5d18917b09acc159f1d657f9d32c29f3086b04e4f1dc6da0cd21a0df3da2"; + sha512.doc = "2449b7d32558665b297e57eaff6529932289e957e0a77d8a8ff84e9614b53844a2684a7b23a62ce6684b6e813223c2c1293bf25e678a1271e3e3cc27383d12b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +bookest = { + revision = 15878; + shortdesc = "Extended book class"; + stripPrefix = 0; + sha512.run = "e49d8f0959276202dea2079df1a509dd296858841f4fa2df235743033ba852b856e5f2a9a14176fd986ad1e431ebd3581469e7ea30093b5a01b7d23b791a028e"; + sha512.doc = "ad51d3cfff90ce83c7f6479f9f0eb49a54613c585561def33529b301e00915d7a8f94fb62660b3bf5bd87104651e7333c3a9b620bbfc1ab7fa9fa510e16dc15b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +bookhands = { + revision = 46480; + shortdesc = "A collection of book-hand fonts"; + stripPrefix = 0; + fontMaps = [ + "Map sqrcaps.map" + ]; + sha512.run = "8a341131397637618acdb9bedc835a4ea98f40d55a8a2b312ac820821b00a1f059f37cde2aeb3f5b715eff9928b579a531c4c12d3bdbb3a7629a50d363f1a4cb"; + sha512.doc = "b5901beafa849a52afaaa7cf09ebab327640eb5ad1c627bea5f8dde2c98aaf176f23f0c9460e7fb2212ce9b4038800c3a3c572830d08d059a04d3574d1015a75"; + sha512.source = "4df12247bff50722ae11636ecc0071e03d8d296ea958d2a1b84b5b2952f35d890be66af4b85dcf1fe2599e787e71c1b9e7f727a8be9b4ec79eb1bd6aec21925d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +booklet = { + revision = 15878; + shortdesc = "Aids for printing simple booklets"; + stripPrefix = 0; + sha512.run = "be6bc46fa76c0a1ecbfe199b1a1a6f0cedf14a8d583e9ab8ffd75d4cf8ae22e404b289224ed8fa6cd9e143119760d50131e97228cfe75ea56d5ab2f540e8ea8b"; + sha512.doc = "fb6d74ee03f303433e61fe1afe297cf5e343f95e3834fbdee483522a183d403fb6bac8bfd1d0ca687c448d522d370f5216caba2b52b066ac1657b8dc2fc3df1a"; + sha512.source = "7b63195d047c6d05cec02af6d44c77e9fbc0a198717a5ed3383f6d662946cb8de9b7659916ab6d7951eeeedfe00abcd68eb006012de3e083d767acffdc0f3cbe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7b"; +}; +bookman = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map ubk.map" + ]; + sha512.run = "8bef9b6e467384a2b5adc6bd61ed2e410f026f6ee867a5a62239c55391ebd6eb5e521c82f9bd0e4de995591458ec32f98ce821493a85113beaeef6535b938ff4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +bookmark = { + revision = 69084; + shortdesc = "A new bookmark (outline) organization for hyperref"; + stripPrefix = 0; + sha512.run = "0a95a2839415393f430eac43a0cac3ac1c4397d68b037167d0e66595e82cda6ef11078bee63855ed1de66191f2f241418705ff819dbe02ac4e3c68ba88eec52d"; + sha512.doc = "1c6a24efbee2e8734955b40b9908a8f5af95d6d4b8aa330c72ae7dde5c9fa374af6bbe7651f46c87bdc11f69a38b5d81d03152eb10d0eddc334b87276fddf252"; + sha512.source = "d9087686dad4b3d68e8520888fd1787ab707c0bb196777144865e2a9419112a3e3cd25064ed4c0d0d5a31a195c84d4793d0063e17037c74ce3eff20e03def946"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.31"; +}; +bookshelf = { + revision = 55475; + shortdesc = "Create a nice image from a BibTeX file"; + stripPrefix = 0; + sha512.run = "e6ab2186784aa9905053d15311b18def1c669a86db4a98033761c2f41fae97199baec02c41c32cc6ef4ed9ddb6ff5413f69a7ad1c9cf5f0c4c91d45297eb1af5"; + sha512.doc = "38e04eb978152cb97a15f1b6120ba9f062224ed4feada0347042b420d4baa9c66e453be8d4abf4095ba3403d11281153dc7e2494d34864a2ad2e1ac10a1b4b1c"; + sha512.source = "53076f7ea7a15ade58fc6ff23643515631f46368d67f9b55d67212ceface35834f10724fc7fa8dfd75d7f852bef9a6570d3bc5600805c79f7e24006e663e1528"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +booktabs = { + revision = 53402; + shortdesc = "Publication quality tables in LaTeX"; + stripPrefix = 0; + sha512.run = "8d7e46297d19f2e683f5c16a13577fc582cba391cdc8a15ad395a6b44072a5b50216ec9e9a8c727c1b2a36b9275ba9bed10baec3aba9d726505955af01d48c3e"; + sha512.doc = "952ff0f30cf7679c09020cf2bca542e11e3a64c88956e87db6289acfb03879609f66c8beb019a6639716462aa088bdff7df3330d60a5d864f25de164affa4c51"; + sha512.source = "cdca8f3e7f7dd99b87da76f60b1279de6efa8af666fc99e11749c21e59b77148a40aa197c0682ac1085a4d971a26b8cb59a9d2794fef81063006a220caf91ba4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.61803398"; +}; +booktabs-de = { + revision = 21907; + shortdesc = "German version of booktabs"; + stripPrefix = 0; + sha512.run = "25a46153cea4a6e94c77cabf3afac74e642c7362f7c852725e8443de8ef8873c5a9d2dab3fc3b083dd7382e10d74e71b40b40b1143afce1646e853899c0ea2c6"; + sha512.doc = "1016522eb74332542a9497f47fb0ea884c7d8b3d0a0630b8a6604bdc41ee08d29d963fcee0d643a8260d2e667c0b39edc74f4998ecbe66bc7a45ef23ac78371c"; + license = [ "gpl1Only" ]; + version = "1.61803"; +}; +booktabs-fr = { + revision = 21948; + shortdesc = "French translation of booktabs documentation"; + stripPrefix = 0; + sha512.run = "62d4aefc19ff86a60b8fc68a5203bbc2dd2c86ef2f74d5dc0d2a664ff342c13077f5f71a4991704e1d9c69587e4ecde629e5432ade3695efbbc388714fa3c268"; + sha512.doc = "eab2c83e6d81a601ec98ffe43ed4b5ec71e17c6ec42c26c519fdbbb3c3e82154b01bb569adca65dbf540ccbd7263cc20806dbe901ba44204b84d07d235b07bc7"; + license = [ "lppl13c" ]; + version = "1.00"; +}; +boolexpr = { + revision = 17830; + shortdesc = "A boolean expression evaluator and a switch command"; + stripPrefix = 0; + sha512.run = "677a397363b80126e45609d125ec2cf22b3ef144216e19183bcd48c1f0ccd6e2e079fbb0a2e7ac03f094470c8c0bc64ae652863aed970ee9fc75a9a69b60c618"; + sha512.doc = "6351bf2d3382c5a3b9a07a8458d7f158ee3bd0e72c96af5f2f985d28a40859f95ae7ae956e5dbaa1ed93b1331322ae1e8901ad3110f5e74024efd831e29b6b44"; + sha512.source = "561daf8eb74f10987be27e884023ad443f24e8d48b573dbe8eab5e958c2ac9f2319b293874050c7d7f56ea3c22f31eaa57f3101c8878b466ad8938018427e765"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.14"; +}; +boondox = { + revision = 54512; + shortdesc = "Mathematical alphabets derived from the STIX fonts"; + stripPrefix = 0; + fontMaps = [ + "Map boondox.map" + ]; + sha512.run = "0e1cbb6ec227a2cd17852e71f16b4972de18a076fdd4c4416ffef1416f3332fd351036fead4d82a69b5aecdf392bc7e1af85ca5bb1e44c153d25cc86ccfc631c"; + sha512.doc = "72e77b36b79bdad663db8c707daaca8d324fd3f50edc8cb7780a641f5d0217d3fe4c2b758c1775de0ce5fea3d44e9ea08e745df51485b4d1e3de11e2a98c74f0"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.02d"; +}; +bophook = { + revision = 17062; + shortdesc = "Provides an At-Begin-Page hook"; + stripPrefix = 0; + sha512.run = "8ce41fecd2befaf448ed238d8bf643362f5a945b7391d18b2698c006421b7b60ce4d886e09dc579eef12cfb459f49247f7f3afebdf8b590e9285c608d654ed60"; + sha512.doc = "7d8ce0b7caffa4e16539154ade5a3df6d6b42b75bc521643473ff568ef5c65c3014fb22053b353a917d2c4782f378bc765475dca5d20b3dc06ff02c0dd2a63ec"; + sha512.source = "ca7e5fc30d23c022e4fec8414c9ef11d2acd5707ad781428021f8a828c6c8b891674fc6eb372a0dc33944e2a54adb9b86645529ff28b4438c31d8477cb2b3a6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +borceux = { + revision = 21047; + shortdesc = "Diagram macros by Francois Borceux"; + stripPrefix = 0; + sha512.run = "e4658e7a672caccd24832b31b0635dc61ae5ace5297569a84d9da981eb37f6b9b944bc33c1e964c09c7042e3e74f9b3067795fdad508e52e624f2bfaf439559e"; + sha512.doc = "202e6b476c5c6f48ea2e6bdf2710d01afcdd9a02669d220bb11bab8fa920f41fddb8aa152a815045ce9d0c92b761f90ab34cd426ba62cf26282d71696f00f03f"; + hasRunfiles = true; + license = [ "free" ]; +}; +bosisio = { + revision = 16989; + shortdesc = "A collection of packages by Francesco Bosisio"; + stripPrefix = 0; + sha512.run = "659cd163c28a52fc12651b35b8018d0df7e4fb706739b090167689a7199a8f9ca3bc3376ed3a5b6c076e9242f4f8132dbec6cbeead499453fa5c9cbd2aecce38"; + sha512.doc = "7fc9a651f6845643fecbb9f0fff150fec2a22273accc420451c2c5dbeab6e40cbeb9b51a32589787c005fe479f626111214bebadb217a238baab07fa18d8c92b"; + sha512.source = "494ff83253abdc9f0d81b3ee36f1d860938b1eb8a7691ecda596d31126624f3272ba65685a9436a5817b93a786da97e6bc6702249630d71f697ef394f801584e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +boxedminipage = { + revision = 54827; + shortdesc = "Framed minipages of a specified total width (text and frame combined)"; + stripPrefix = 0; + sha512.run = "697cc00b10468f515b5ebae838d623eec58085269c98897a5c2c4ea932ec52ae819110612feb84b6951ff391bff9309655abf6a41e13da156e5ecc52c015431b"; + sha512.doc = "54209e9e5fb8da8db65901c729b78aa3c9b536c3bca4d40437848287d8a07d955a84ea0f13d93e7e702c47c6bf8bece3b6d3f3026d5f78568205746c9009b968"; + sha512.source = "718499cb248fb8a98a9650a78ae377f9aaed9318b91c4417c7690201504366e073e80615106156087686273f9f86adb58f854cc758c2329ad99103f788ba0164"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +boxhandler = { + revision = 28031; + shortdesc = "Flexible Captioning and Deferred Box/List Printing"; + stripPrefix = 0; + sha512.run = "8aa988155d5115e2fbfbee113013cbb4d32cebc670229104cf96c2920c81bb23245e2365cf31705b67cf72345387a275c83f170a777129ddafdf6cb7558bb077"; + sha512.doc = "15b69a4d434be9561cbcf45a5c3c68ae9560fae35ed2256cfcb4c2bca8ac172a8bd0d6f7335644f586a9b3da65948b9372ae9f7ec9bf2c0d43b572cce5af20bc"; + sha512.source = "20e1dd79907029b015d9c6d85c80fa907efc490a80db7f0e871b6b379c1370982fced3e3865a9fc0c7492a9d3631d163b98177dca99deff4a78d7f2ee354f2cd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.30"; +}; +bpchem = { + revision = 45120; + shortdesc = "Typeset chemical names, formulae, etc"; + stripPrefix = 0; + sha512.run = "3359bc429ec00bdf3b26810e373fd9bba8f562d4782d16adf2706b59ec1cd153f0fd565c26319bac0cf5065b6a2ea99ad5cf6461fba62a7bae8355fad7d8279b"; + sha512.doc = "c8edfa3e5fd901ef705b6b55dd2278eabd996e2b3aa76ec5da9c34c07db95909b67f31990684883edd256f7a5eb7c29450886472fafbd0ff91f8e81abc4dc93e"; + sha512.source = "0f2629325312dc8e7d05d593bf97ddba9b18d0709d0c29fd5df2b7e5077a15624d98edbca24e20c039e7e72bfc21e676c7bfdb6d29f7c84efd4c40f41d3d930c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +bpolynomial = { + revision = 15878; + shortdesc = "Drawing polynomial functions of up to order 3"; + stripPrefix = 0; + sha512.run = "370b9ee803390f51da2cf7da4832ce9a51d923420908ffbf5dba21a2380e13cf345413eb81465e0acf86bc4011ec0bdf8cfcf5ac0cdf62cb3e88b2f2b6a6edb1"; + sha512.doc = "2778eccb795d4543baa16966d55ab68a8c2c6f547d7a544aafec365036d9805a5cbfce97efbd25d0b39329814e95f6a2e18610f5e83a4d755a31dafbd651ce0b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +br-lex = { + revision = 44939; + shortdesc = "A Class for Typesetting Brazilian legal texts"; + stripPrefix = 0; + sha512.run = "e4eede34a086ab025a9918798feea2c6b8b19d86782a6d93745aa82d40258e1619433eb445d0b3c1335dcb195689bb76ac8142e6c65618cea6392e243dadd915"; + sha512.doc = "3d277aeef55721a833cd613c98852c33f7ce22a8034e2fe62952409cffe1ea49ebe1f3b80f91018ea51fadef226939a14e103884dca19227193a32d1e3ba3110"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +bracketkey = { + revision = 17129; + shortdesc = "Produce bracketed identification keys"; + stripPrefix = 0; + sha512.run = "ecdf6f5c6cfa46a3a0eedc9eeef5bbc59cc05a2a831249787ff70fda7d69466862c18dd7ed7a440b8b2bb93c6a08225c7a97bb2f5588d94548d9f6b626ec36aa"; + sha512.doc = "db067a4ab9ac087f565d184c48a90800e68ddb25f5f78146ef1f65bcd3cfb1d0adea78483ca8e27fb9f82bbf26d23c5c16ce735aae194f4816ea73eb993ef099"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +braids = { + revision = 69398; + shortdesc = "Draw braid diagrams with PGF/TikZ"; + stripPrefix = 0; + sha512.run = "e92513b484cd34387542fd39684141d6bd24c99ac4e99791498e75e28c814b9647f9762a5803aa127e9c5423dfb93ac9126348d94668bd7e82c82b54af482f34"; + sha512.doc = "b8a26f24d450b8176a2a6d094e3f0e66faade539266652319c354cc45a824358fbcde416582fa34917de422d0a86f782858247b7d457b50353ec4803b9024f91"; + sha512.source = "c47edfa15e2d11bb06d984cce5735699f2fa2bcbe5ce09abf7f4220bcb904bbb5a541fd0ba9479d941b909ad9cf4df3374fffae8fe6a90fbbed9e80e26def3f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +braille = { + revision = 20655; + shortdesc = "Support for braille"; + stripPrefix = 0; + sha512.run = "04893a3664b10fa1d5b912751e51b6d4a596821535da87aa1f2c2c5632e1fc60278435fe9deae4b0fba8296f2e46015b27b592721dde26dcc4acf7e3bd672a4c"; + sha512.doc = "1cf6922ffa0785adb8e7e7fa5cfe134b206d70d012eb2ec1bd40bedb72ace43c8a17b3e94b16635473d425420f362c49f1b509796d43ca0d2aff0bd9be9f25cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +braket = { + revision = 17127; + shortdesc = "Dirac bra-ket and set notations"; + stripPrefix = 0; + sha512.run = "dc5f931ce9adbb3e8398cfab83402776d92018945172c7c17f04772f3253942c6ebecd5ca0f3d23f0befa87327dea4a3a9b90528bb7409963f04d9b856186562"; + sha512.doc = "9bdd3cec0da91ffd13d556b9620e9c502a658374657e2821141191000a2321bf030edc9c32641b5ae6c52acfc7266c377a8f4dfe4891cb616f8d4f6a377d9ee0"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +brandeis-dissertation = { + revision = 67935; + shortdesc = "Class for Brandeis University dissertations"; + stripPrefix = 0; + sha512.run = "96cabbbfd22e26d8aff3b9c54c5f9bdb9ada8a036af3761171c7ec1384d4429bd69c5004e16e87098e5c6355cd029e08371f41484742618f9090fa2c919bd638"; + sha512.doc = "23c1a0d8fa47893017e657f60ef9a7ea54e6f587bf164872b4abfc51f04074ecd82d3494b1c78bec76e6e848bcce20c61af0ef7c2e9b24f91f657a678b03eeaf"; + sha512.source = "b0d4a1712c784aa20e159c9c6827cb61b007826ef445981a196bb5e4c159199b76fb59dcc6ff03dc67b0328eabdaa821b5ed6ba0773c17ef7025b171bd6f746a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.14"; +}; +brandeis-problemset = { + revision = 50991; + shortdesc = "Document class for COSI Problem sets at Brandeis University (Waltham, MA)"; + stripPrefix = 0; + sha512.run = "fc5026cefa87e1ab248d9d26466a05e11b112c75bc3908c7e6f123a1436d5f813038176e97e1ed290cc99f93dfc8d024c88c1242b9bb41689bfa0a29153db9da"; + sha512.doc = "0f6857c1ff226d797d6e0dc96bf040e2393564121b54d5d9b1e9e35acb01b7663441e0460cd117a0b015cb768bfdf3f40df142ae93d5a0d77f9a84f31c3e45b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5.5"; +}; +brandeis-thesis = { + revision = 68092; + shortdesc = "A class for Brandeis University M.A. theses"; + stripPrefix = 0; + sha512.run = "8d2c00167dc8c755d5d29f66c36d7d70d4fcb8fc1ca66e5c4008d702b38eee9c8bbb4bf9e7129a69649f57f31b25b532d44f3bb7628421aeff90e89afd9ba2e7"; + sha512.doc = "61bf51cd01c13bf698b9466573af4f91357ec77a265db2166881c1f01112ce0a17d87b74f5470aff7da42bc39bb77fdac0cf20613e379bc168119ebdafb85d2d"; + sha512.source = "0cb20a7d0b841a2d206ea4d8d9c0e7077d6b94c841d3bf8372899707e2b63c20d0cd6ea60b451abc6e1e64ec2c69771bd6fd30203e4b994d8b0e6779abaed515"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3"; +}; +breakcites = { + revision = 21014; + shortdesc = "Ensure that multiple citations may break at line end"; + stripPrefix = 0; + sha512.run = "13fdad42586a361b4e01999476f4d92ccc0fbcca4ee2663153b9eabbb08ad571dae6631306e9fc590d94f3f02af79519de30a78ed35f737004d86bd62b76786a"; + sha512.doc = "2184e40db7f4a01113ba1040a62f8213f43bf34202a57a33abfc6291e84b01cf27298442f0f636289892d02764f1000ff3542f2ca6e490e0eaf6d5bab247b3f4"; + hasRunfiles = true; + license = [ "free" ]; +}; +breakurl = { + revision = 29901; + shortdesc = "Line-breakable \url-like links in hyperref when compiling via dvips/ps2pdf"; + stripPrefix = 0; + sha512.run = "fa1fa9e3ac50f305ae5b82eb63997d1674b3f640f36d502a1000b439dd52dcaf6b539d153a2c7022f3a00fc0042bcfe341e850ed6b01f7058b1f8f6fd92b4d9b"; + sha512.doc = "38f7847274cbee0a6e7c536a982d0110670cf6af54bfa99718a862e1974fdd839f6ef6871cbe2c40bcd0b2a9036c806eb2b57c8adaee583ef316da367ed854f5"; + sha512.source = "9ecbae9c483331d636a522f67e5da197e4f647daff0a0fe81f4542c7248934c662046c8e61bd10fadb44144918cd508f09c57880b9c1e0c6515cb2dfd35e52cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.40"; +}; +bredzenie = { + revision = 44371; + shortdesc = "A Polish version of \"lorem ipsum...\" in the form of a LaTeX package"; + stripPrefix = 0; + sha512.run = "1e5629a2e6e6099a319d8b8a1efec83262780c70a57c482f66a33a48722bcdb18fb891a96b6b6f29c54d71ce581dd1c82decdd22ad74d6ef61765fec3f8c3614"; + sha512.doc = "29fba5bb48aeb2353616cfe9a8dd4fff90c164c10779b8115958733470fd47dc40a567212c62315110a5a7a51363c9f917c4984583d40177037d6b0803ce66fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +breqn = { + revision = 60881; + shortdesc = "Automatic line breaking of displayed equations"; + stripPrefix = 0; + sha512.run = "c280871916bf0689794cba9640a7666a0f7b295635b85d99d08f04cc0c4cb7ac82552360b0c8b3d677b138779239c4ac4a2583db26fe194870c0c97a9a53395f"; + sha512.doc = "70ab6500b714c0e91c597b43d934942c39c23cfc9993702b6eefa19b8c9027aa0e7eaa55cb48413e2cb42e468167492e7a401380c1cb4a711daae364ae01283b"; + sha512.source = "aa4922ba1ebcbfe00716b02b567da4b17ab1b0d22cd5fe8332d147496f93dbe0a94e9e38964b13b6b4944ccfb2ce49bfb32ed5602ca1f147fc99163eaedadf46"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.98l"; +}; +bropd = { + revision = 35383; + shortdesc = "Simplified brackets and differentials in LaTeX"; + stripPrefix = 0; + sha512.run = "d6bcf207cddeb6115cab45eab12d48326f067df2fec21386ca29282ccd484e572ee4b5420473079b033bf2b085e134fb42b76b3f18d5b56b47ad765c62b07023"; + sha512.doc = "b9ed0de353b0b0e6d7c8e48f3a20c5ee88a0ee9fb1873ced88e89b9c4d73b20701add802442e69aecc419a2c6f433ca12ccea9130abcf895a5568f7b2d66d6a2"; + sha512.source = "b33ad62f68eb425381db0c6724fbcea32b1e37f8dace6737af6e996b7103d19eadabf60873ff367feb9c3a69743d219ce41d5274b8c533d5b5323a971d01a06f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +brushscr = { + revision = 28363; + shortdesc = "A handwriting script font"; + stripPrefix = 0; + fontMaps = [ + "Map pbsi.map" + ]; + sha512.run = "f8c7107b0e98cc6e402ec8ee6f5e6f9a1b8e0d046dddae9486e4ca68327f370a75a0f90000939828605334b3ad3c5caaf5e541c7933c5545fe3e531066fa650f"; + sha512.doc = "41ad7b1afc7cb0f4bfdf0bcff4c1d85f3d9603c3d48ccb62f94a6fa2258cf3f60f03ee1b4b5756d85a77ba4ff9afddbccaba1c4bd5b69d85ce4fed206aa16b1c"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +bubblesort = { + revision = 56070; + shortdesc = "Bubble sorts a list"; + stripPrefix = 0; + sha512.run = "8d089fe6eeb4ae2e8c77de1130b0d51bc50c4b89ff4d1d26065fa93d740de16644856db55c38efa9e199c2ccdfd6906ccdccdb9676f2313f92911c5d6e06246a"; + sha512.doc = "a9cf0d74f8a713d381d1a06f0a9f658c9074a4aa9027113e47f29ba926f835878e2aa7eed9dedd948e9c5f3b50345f82ef9b4f35ac7fdd08ba041e3a00ac20b2"; + sha512.source = "9cbc0f682dcc18881f4aceca601a2dcf4996e597f4341d3459af336bdae72938b9aa4402fd88f2f7a4de960909bd25bdfa3a01296a8b2e3283809fd63a47eab7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +buctthesis = { + revision = 67818; + shortdesc = "Beijing University of Chemical Technology Thesis Template"; + stripPrefix = 0; + sha512.run = "7c27a0f982a2727c8ad7dc98052f48ddb73d37ff27b89eb53f8e33338f67fdb99dba2cdbc843cb628ea725fb7ca7d0188ec5f53c6b863c4707e8b174c8b788c2"; + sha512.doc = "edcf0ac0b5e9ea86df731fee1d2388960b997b7278fac5b88dde6e3820ed3ff488c6ab156dfbca169fb9dd11cf49c5ba5c17516ac2f874bfb3d825426f0fa5ad"; + sha512.source = "bbb105930a740ffecc9c2f4ebf3a3a206c49c3128b44bc9d96c97ec0715da1fe152bab9ffdbb3a3d8fd3689702bb7091056dcccb4b428d54ad0853f9ede97ada"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +bullcntr = { + revision = 15878; + shortdesc = "Display list item counter as regular pattern of bullets"; + stripPrefix = 0; + sha512.run = "886109fdce6a936d22b829ff769b130a445876073c73b2bc1767610302ba8a40112938311a138e1c93a0495a6e7d5cafa8d3606ca3b2fe48af442e023195ab93"; + sha512.doc = "ab01cfba0570bc565d8b40945aec5d87739a0826d5c323c5ee960c0d3c7c3135ef2c8b7878268b415ffae3beb06fbc6af48656e7c4a6a45ee423254ce23cad1e"; + sha512.source = "cd05d28c2e5c759863403e3ea9e8700002a4ef4f9021decec9a681b92d944ecc4c6765bae332f8645d06d12ab6adc096f4a560a195c981d5e6cbc72acb56e812"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +bundledoc = { + revision = 64620; + shortdesc = "Bundle together all the files needed to build a LaTeX document"; + sha512.run = "8f1e4428993dda804a2bd6b11504996e6cbef869b98a64d576f0edd97a47b1f2301b34ed234ecf1cc902c74dcb31064a96cb69018ac514fd91eb3e5c1b6df5ad"; + sha512.doc = "d74b1ec9473c4616642911fb918553350c5c65ae2cd5171d3513d6fdd5b5b774a516c54a5ce09a8fb966a9de6c5e372b773f7e8ade9f14fa2b1a646112638679"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4"; +}; +bundledoc.binfiles = [ + "arlatex" + "bundledoc" +]; +burmese = { + revision = 25185; + shortdesc = "Basic Support for Writing Burmese"; + stripPrefix = 0; + fontMaps = [ + "Map burmese.map" + ]; + sha512.run = "7bce3a31febfc6a959ba4779d975cf93276a0bd1115e06a50a3c8d705e49e8d6747ecebc7eac2147f021a538dda1bb241d8f320ef1486229c930141e06d6ae26"; + sha512.doc = "4a7f3628efd913a362786564dd260dc1a63e51a397af3d92222db6f758b7a7792b13e58422d2604ae98f615fb5fc42e77f265e505236db9bc981d7951e0ee1ed"; + sha512.source = "066d164d97f4fa9e1050d75c3c20997be859718a2be37c465010040f969b2d3aa17edc3c241f5aca45d91dd12517d72a731d02954088ee83ff5aeec3be0b0fcd"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +businesscard-qrcode = { + revision = 61719; + shortdesc = "Business cards with QR-Code"; + stripPrefix = 0; + sha512.run = "d991a7dfb9be936018a1946d2d3fbe24b775d99bce08da27e7451b54c679bf6565b207a7645ee4def2464ce08187b6ff25614dff9ec6925bce66fb6f48809412"; + sha512.doc = "6ff58a45f67ae55d82721f125bf3e9c8a5cbd049515b840eb4bdc79eea63bd82bccec41f53b05cab9e6720f3719cc58e882998249a738eaa9f033f14569b9f88"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.2"; +}; +bussproofs = { + revision = 54080; + shortdesc = "Proof trees in the style of the sequent calculus"; + stripPrefix = 0; + sha512.run = "042e01990554b7ffcbd70c9a281d87ee98d9b25d7071f24d114e097e536ae1d7fb565854399eeee547ad2cf97bdd6d4fd0755169ba7548f01ed0d736e031a383"; + sha512.doc = "b3fec7f142210ee5051b3b3a45ef26724d95c538978c4904c9723113adcd2164e6385a9949473a8b9d29109b016c24f25a4088fe3728d675fd0023a043ca6262"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +bussproofs-extra = { + revision = 51299; + shortdesc = "Extra commands for bussproofs.sty"; + stripPrefix = 0; + sha512.run = "8410e4a795b79e7ea06bfd72c713f39950da8d1c418002bc497eb802ae71dce5d5372f7692267ca62891cbb2a58719b76c2bce3f10ec11cff63c40bae9122a2e"; + sha512.doc = "87ed5af043bcb4d41f301d4b09dae511fa509fc9c50ac70cef29d0df4bc023f97856504c0650b6139ff8bcd9c25a046411b58f72db016d7429788db757a4e87a"; + sha512.source = "de1b272c20c7aa3d1c6f06fef7226083890a8b43ac3ad9ec54d6ff0649ee268b9c9acdf5d3e335f1fbf7f2b9aec3ff91517f126fe8d354e32662e3d6938b197e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +bxbase = { + revision = 66115; + shortdesc = "BX bundle base components"; + stripPrefix = 0; + sha512.run = "7d1b15d92136126999f976127b43a125a9bd5aacaca5a76aecee94d4f6a6ce6538c449fc82d95a55984b9de802e1e66903078e5d2344db532b9b2e2e94ffdf24"; + sha512.doc = "162a33a07b6149997b9cf0ed5b1baf55f80f2142c106e07188b27c02f4fad891d95d6366581d958bb730106f5d3777e59a1ba55176a7e7594cdadc77e85d7365"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2a"; +}; +bxcalc = { + revision = 56431; + shortdesc = "Extend the functionality of the calc package"; + stripPrefix = 0; + sha512.run = "580fba2af6adcaf2b2f137cd34455b3dc896f2e26aabc2352fb23c12fe1a134340c2505d38dae51e79c72408fb4023213971ddc0ad322f16bafa29a9bc1dc4bc"; + sha512.doc = "1e2e8eda856a15be3e9f3cdc441d3b1972b97125d0a370061f0919ed0c4aa267d5fbacddd453d9b99bf5b759b801c71c3e988f9666540d960d9a27e7c54ea904"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +bxcjkjatype = { + revision = 67705; + shortdesc = "Typeset Japanese with pdfLaTeX and CJK"; + stripPrefix = 0; + sha512.run = "72d3a88c117ea971faf8bc836bfe32ddc52e96c1fe1546ceeb8a9b298b7a28fdfc8aa4b0f43bdb3fd27126383b289ad293b2ca6c4ad95873948be0651de4ea18"; + sha512.doc = "8118935396e03cf72b0efe04d6e436c6d7b3aad3dd1518561ec36d1fcf35a4e29dcdf86dfe554d06f4814694e7528f238b73c0145dce6ebdd5cc9b587db3f86f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.5"; +}; +bxdpx-beamer = { + revision = 41813; + shortdesc = "Dvipdfmx extras for use with beamer"; + stripPrefix = 0; + sha512.run = "48009e69d2bb6c316c5d33dcc9d17fcf9f762b68688130ee8407648039b7c3effbbdeaf991bda7842738da59213cc855b50f48cf179ec77e0682729d6e5d3709"; + sha512.doc = "2692918a0fb1ac7bccc6e905350c6cd716b72b33d8f00bad73ed0146238965d0c1a1d9de07c22fbef1ba7211a919c1152342a9f4bb48185099aa470f76374bc8"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.3"; +}; +bxdvidriver = { + revision = 43219; + shortdesc = "Enables specifying a driver option effective only in DVI output"; + stripPrefix = 0; + sha512.run = "dc37ee5237e6eb02fca173b8b0501795604930b56c3e9101c6b653ad6df12cb5ae82ad81e66aac5c1ce4ff0aa8d7f05658f4b41057ede286715c25d290682182"; + sha512.doc = "83e18920fb6f2f54f54c401fe83ff131dcbe64ca712ded59f0690d90f1d8b2623ec135692a3fa437b77fe82336553a529d36b5bdcec96a96cd57523f11cc0e0b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2a"; +}; +bxeepic = { + revision = 30559; + shortdesc = "Eepic facilities using pict2e"; + stripPrefix = 0; + sha512.run = "a0436e9dc7dffa9c7a7b2a41662a41db934aa4242c953f480400b7a2c8a71bb526ebe8eefa46b02db03364efdf14fd88c1dcd267ebd59f594d72540ddd3048c2"; + sha512.doc = "25789b297ba2fcfb81e74637cb2270d41eff858e747b841cfbf5d29791fe6697d3a9cfd4abbbbc4ed0a5c5b274f8b5a7cdeaccc995f6ae623d2a6e2d831b7e55"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.2"; +}; +bxenclose = { + revision = 40213; + shortdesc = "Enclose the document body with some pieces of code"; + stripPrefix = 0; + sha512.run = "f3d0f39e9c21f3bff75d118bb1a9408e7fb2c84beb9301873cd37a678de4b7680d1e8f13693839ce32e1e816e756d8f0af14cc620952afc8fb02885debf478a8"; + sha512.doc = "ea7e0f17ee70d3d4798e85e3788af1110fb2adb436106ad08f601655453af2c5d192d5e3854fee1b29f6ac21f2f6b02e239ff4ec6ae9181818b23bdbac45583e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2"; +}; +bxghost = { + revision = 66147; + shortdesc = "Ghost insertion for proper xkanjiskip"; + stripPrefix = 0; + sha512.run = "8b5345c2e48c16f296e3533977b2d9a031274764f3580887d2142a12f34e93d4d31bda0a5997823a7bf52891c8707d897afdc365a001348d2ab12d8f947acd0d"; + sha512.doc = "999e7623526c6ef51b8c6da383e79d9f889d1e45efb52eb127463b94e7790edb124c2ddece303c932134df4daf4189db082c3492fe04e6a829e1dd6d943edc02"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.5.1"; +}; +bxjaholiday = { + revision = 60636; + shortdesc = "Support for Japanese holidays"; + stripPrefix = 0; + sha512.run = "4f5dc4081f989b73e5334d62af403922e2918424cff24480644f1e9016e3e20fb044cb22da91a035b198aa92edd0a51e985fe791a4c99ffbde2d339ca46a3918"; + sha512.doc = "6d3ccd7c279e9dd8063296d843dbb6b42af90359b16f421eaddc7b2ddf23e2dc6077d4748abbef3c67c9672536d58a20746848237525a4cf8ec87ed19117a618"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.1"; +}; +bxjalipsum = { + revision = 67620; + shortdesc = "Dummy text in Japanese"; + stripPrefix = 0; + sha512.run = "a3c635eff092be08bb99f882a18fd477aba3b9b25666defa4cf872806dce666ab8b931cc5b85ee217dfbfd453a066461ba169f830236ad55f75a28a81a157e0b"; + sha512.doc = "b7f020236e7cf429bb367ab412a6b58746302d2ea0c6d50c3b9af20a86e535196bf3e628c962c98ff0dd3d194d702c7a20cca55b815b88727bf8bcf0a5eb278b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0a"; +}; +bxjaprnind = { + revision = 59641; + shortdesc = "Adjust the position of parentheses at paragraph head"; + stripPrefix = 0; + sha512.run = "90d69860d7017c414cae328806e4d6e9a788dfe46f7a6a5792a0e8df563471b5d60aa6b7d2ea45caea3caf954a809f64549f24105d9856d6b89f96d366a02fcf"; + sha512.doc = "40c81a58de05b25b5ec537ee6ce8feaa9476ce64898e7ebc67ff1d5497e53eab341734438160e578487753ec9bb747d8c69cbd4365895326b081588b92f6677e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4a"; +}; +bxjatoucs = { + revision = 52509; + shortdesc = "Convert Japanese character code to Unicode"; + stripPrefix = 0; + sha512.run = "ffe18ddb89393c61df4371d6fe1154759992e544af64cdfcc007122ed212e87d16194d906d4c9f797671860a96c4dcde12682ecf98adb3c7b8b4c6ae0b432b81"; + sha512.doc = "9c281fdda182269c7a048e1ef422f0c403ecef7d8fd8dc462ebe39b861fba013ede2ef351baa5ad4537b2e1495f1f0572c7edc6fa6407031ff19053bd6dfdc02"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2"; +}; +bxjscls = { + revision = 69637; + shortdesc = "Japanese document class collection for all major engines"; + stripPrefix = 0; + sha512.run = "bdcc01806c8379d02ebcb49c25bd497d11dcd3f0954dee7c1e1639c4cb3986a1bc54266e2f635c263058e1cdb34d540d52291cbe73502f02eb54d4b98ea3676b"; + sha512.doc = "047fd7bca863ea5088d2e33d512a80879f72c32dd2e7bd3813fce6614d22f0285beb0adcd887f4528457db24472518663ea4e711d90e4fc0f36c8282db6672cf"; + sha512.source = "5eecd3c63ba56bdae6a5a720aec1394649732db2acf7d25a6e3125ed742fb1033648edd7c45bd558f7dd3b9ea912617111b0846614546b89ab5f2aecdf770f00"; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "2.9b"; +}; +bxnewfont = { + revision = 44173; + shortdesc = "Enhanced \newfont command"; + stripPrefix = 0; + sha512.run = "83775ee72fceb4de0037327561ea2f1723db89dc23ccc42245390212ae1fb849c92c75b2e7b4b23440c62086116b8f0a14b12b27f97c9277c55a7454b231826f"; + sha512.doc = "f09fde7abd39a4df52175eff90363a469270ab1385f3600e654535cc90d7b4b5ba704be734323dffca512f5942c45a9ffb5cd19a73026c224cee3be33eaa5b65"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2b"; +}; +bxorigcapt = { + revision = 64072; + shortdesc = "To retain the original caption names when using Babel"; + stripPrefix = 0; + sha512.run = "03c88a7e74c83e070d132fe55231fcf0caa51a8e87daa213533ec1db5246919b6de062e290da3e45b17f66ade1af54e38f39075284009c5bd126513e32c4f080"; + sha512.doc = "0a3c6c360bd1672fb4f1aa33dccba06c7de77a65a6e0d128fc3e90f99aa9897fd6d3a1ee5c2ca719a42a891d67a575ab13a28b7e6c9f6f8966f98167ec54cfa2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +bxpapersize = { + revision = 63174; + shortdesc = "Synchronize output paper size with layout paper size"; + stripPrefix = 0; + sha512.run = "1a58a1a8281505922f5a6a2abc8695be6826f55dd1d37d8d42633665aaaae98544a0662cd4ba4c384757caa593eb000ff933bb7d7b215447fec6d6f5517993fd"; + sha512.doc = "f6631a73d4d29616fd197f9c32b7b533f60e6b007a4849930c33afa4eb866798e1ab415f0842cee8142e7e7379507b2557b096df627dabb1d714ee305a8ba0a2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.6"; +}; +bxpdfver = { + revision = 63185; + shortdesc = "Specify version and compression level of output PDF files"; + stripPrefix = 0; + sha512.run = "693b58af2200a99c98b1b4fe9d99fca00cd39f06877c4670e4b5e281f3c31221490f3f7106e42069c1d0f35e192fc3d8e1457572db84a8176fe5dab695a55c48"; + sha512.doc = "94500d43e01e6e4fcde2a5de892ff0587a495672620540c37f08d815a4178f153c98dc1b8ee099f2e4e849842066a126d2906defb5b07bc5849ea7dc19f81555"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.6"; +}; +bxtexlogo = { + revision = 63231; + shortdesc = "Additional TeX-family logos"; + stripPrefix = 0; + sha512.run = "e0399d089bbbbac0e34a216b5164956dc9843e2d77b9cc1b395609963aba759e527dcd3fc112f4aa57b621e4419ee33d16e7bffb7f88123a0afb7c983c82636b"; + sha512.doc = "ddc5da87331449bded7b5936bacac04872467cea5ceff8b1a0b2c5938119351e17f1622020e53a94d704be03a626b5110685e69cb393773595d5b9cf7326f184"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.6"; +}; +bxwareki = { + revision = 67594; + shortdesc = "Convert dates from Gregorian to Japanese calender"; + stripPrefix = 0; + sha512.run = "6a7b89540c662871ad9799b00a8e17d0cae301366ac6651d9a9e7ba995f6d2de6b2149f6eb5795af0d58c5de454aeb94d0ade0026520a4e54594f93fd4470b3d"; + sha512.doc = "60c6416a036372f3fbe636dc46106114d2a43ba292f961fe299f765afd9e23c975a7f68f4c48a9c1ef9ea5b9b97224f1d0f1bd1585fb90b5f183a14528351539"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.7"; +}; +byo-twemojis = { + revision = 58917; + shortdesc = "\"Build Your Own Twemojis\" with TikZ"; + stripPrefix = 0; + sha512.run = "5d9330d36bef34d5deb7fae5413741de09050bc9a0fb3bef7874b0d44f397e900f626fa64b8903038d3131e5b9ae66f121a1dbaa6f25668f73bdf7d3aeed409d"; + sha512.doc = "a0329476031945d9fb694522b3bb08cfded7ee117033f758ca7a9d1dc423d66f8ca749b295e1d420b737da886b57b1bf2dbbed20d3bacfbef94d57061a22f4bc"; + sha512.source = "7971ba8678358883fba70f2394417f2cbaef639fa0a1fb13f1cef8d0cb182c91fc3097450bc29011c4b939afe6cb6ae5ce3c8c50f183fc92f10f3d0a46adc3ad"; + hasRunfiles = true; + license = [ "cc-by-40" "lppl13c" ]; + version = "1.0"; +}; +byrne = { + revision = 61943; + shortdesc = "This package provides a set of tools to typeset geometric proofs in the style of Oliver Byrne's 1847 ed. of Euclid's \"Elements\""; + stripPrefix = 0; + sha512.run = "ef27aa477ed05bfbfbe3729fcfe119f9e7e3335b9669a34ae812b21084c2063b819e1201340f3db269f9f2234b5644054ab30fb3112b6bae142c7e5a0c6831ea"; + sha512.doc = "d0c03c352aed98d7b1abff22d8613f34d206807fa8e0635b88b764f136bc851dd53f8757aff45f636e1c17c32ddbe481867a3e30218dc97ca07f25a147c1e435"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.2.2"; +}; +bytefield = { + revision = 68366; + shortdesc = "Create illustrations for network protocol specifications"; + stripPrefix = 0; + sha512.run = "394c796574674e877a6532900edbe3555b63aaaf62bf2c8bc8dac280c60064d77bda56991ae1c1a208fc8bde4c8e990cfbb05d21605fdd4f934aad0403775f31"; + sha512.doc = "98e7e38ae0a9337fd9926af76e51b6381436d4e6cc9b05cd1beee2f8b01d460643265c09b53b1058e72cacda1ee60df6adfc210efaee67b2b0cb31e3d2624833"; + sha512.source = "d878e6325e42c5a7e2695af6ca46d876c56eb4f0bbeb75e560ebac50bac30dcbf6df4b82a1379ff60e713e5f92840150c96fb1b637591863dd9ca1387e9a38ee"; + hasRunfiles = true; + license = [ "lppl13a" ]; + version = "2.8"; +}; +c-pascal = { + revision = 18337; + shortdesc = "Typeset Python, C and Pascal programs"; + stripPrefix = 0; + sha512.run = "59aa375b3b953f2fab04547b3234b36fd08af39392cfdf05f6992a90ef3a52503b2e11296787763abb9ce6251f9cc2fd062d78133038ca4a92e1b06ae65118e9"; + sha512.doc = "52252a2265d9bd48f09ddaf5f1517a6a74980897f0e8e0ad7ea71bafb194ca5bb98386af537ef2a4fb955e62ccba3d16cc1ebbae094502f16ae3bea0c5073c79"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +c90 = { + revision = 60830; + shortdesc = "c90 font encoding for Thai"; + stripPrefix = 0; + sha512.run = "2350e99bfd047ea514586894d20bd37dc778c74fd4c1848063ba7d53cb59ed5df36cd20fd51140ede8af7f32ed7efc44e1d4f3db4a0baaa7d1439941ed5297a9"; + sha512.doc = "9561381312a2e3fcd6a03da1082e9bdb5a2c30e241078adbb70d06060a21674fc8a40c5cb81ce87d31ff99c168d73e9b4074cb3a6114439d5a441dd0054cc682"; + sha512.source = "774c2aae917343ba9dd78785d2dc9123bf1dfd0920b638ee991a92a9a87199205fea04ea36304806c7213a2bb4ef06459f385558c9691a7dddff69cfe4d35fa0"; + hasRunfiles = true; +}; +cabin = { + revision = 68373; + shortdesc = "A humanist Sans Serif font, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map cabin.map" + ]; + sha512.run = "8227929382396ece0ddac74095387ee0c96d2102fffe5121f89182836792933a6ad66ded538229c5bd12f65fe7518d00a333835c17537761f309db578e81bd3b"; + sha512.doc = "95353266181cfda03973d68472ad564185abac4d828141e339183f69380f99151e0a3165f099235db54be8a3ee35ffe069512240633972f4b7dbf14ca1e06126"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +cachepic = { + revision = 26313; + shortdesc = "Convert document fragments into graphics"; + sha512.run = "a0405befc4ed9217cedc4abc78c355b869bb803fa4be32245198ba4aa8151884ace023b3465db3b4757c923d0425fd1d186e25facd7c29d05d5072668a9f0e3d"; + sha512.doc = "93108475f74b2356cea79a8403729df7c24e95871680b0b53f9316a7b158aa973ce108632a121198459352968bfdfd79f265d4aa301ecd00ce55cf56db5f976c"; + hasRunfiles = true; + scriptExts = [ + "tlu" + ]; + license = [ "lppl13c" ]; + version = "1.0"; +}; +cachepic.binfiles = [ + "cachepic" +]; +cahierprof = { + revision = 68148; + shortdesc = "Schedule and grade books for French teachers"; + stripPrefix = 0; + sha512.run = "c152dcc24128f0f6e9424012660f2620e385f470d92dc9ed530eb530d11b1fc3aac6e9e3466fea3548d16ac812c89743865ada67a3bd820cd37601f754506939"; + sha512.doc = "1e203d56ace798bff086a9a3eec3a3f110c5e2c4ec56be637ffc70edca4b28ea8e5bcd8804b087515431460b48ad4863d3c15a1496724e5ad814cac79dc5e7ca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +caladea = { + revision = 64549; + shortdesc = "Support for the Caladea family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map caladea.map" + ]; + sha512.run = "d5dccec03c75e7ae315067527ae4d88515d6bbfb6d9b1336420ea78daaa7718497e8040f75a0a531c91c2b0eae728cfddc824e623bd5c73471192c809550dbf1"; + sha512.doc = "e3f84460394d1a806a06836535c8f9110715608e2110743863e4c9d37abe696a3169e904a4ef507105d54790af4165d3a5a7559b28568b86b73761975b8c0b3e"; + hasRunfiles = true; + license = [ "asl20" "lppl13c" ]; +}; +calcage = { + revision = 27725; + shortdesc = "Calculate the age of something, in years"; + stripPrefix = 0; + sha512.run = "d3f6d46166f2b37e6ee8ff9185c6ddf5ed99ca2b32c7520966fa9a3db95d3a9517e39f5e8f928332a8dba490274c4fe48e62b6ce83ca10d0fbdb9a4218e0d92b"; + sha512.doc = "4c3f1ed751005a5fc19e0ae40dfeb010ca211dbbdb7ac11c01525c7643f1e993346f1af21d411705ebcb119f8b1c20e4ad35384d2be9618fbe6db2de99e6eb45"; + sha512.source = "aa49d205c8366ad92a46195c113e69fe123979560ae92a51589718136bc8df8b3b00e0aad4d6643ca36d217be02fa61529c4a1779d6826a52f80d29649fc50ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.90"; +}; +calcfrac = { + revision = 68684; + shortdesc = "Calculates the value of an expression containing fractions"; + stripPrefix = 0; + sha512.run = "1545318973205544c136b6bc03ee6838f9496972e43cb4dbda404d2bc389ff41f873513ac0275769685f72c0222998386d2f9abfed686570d98fced592414443"; + sha512.doc = "d9bc62d0d8f95ef3f34b801eaf612e5506c2c3ff855bac800a6bf3827fc3b1e572390691e04425992604e2d6404844db3fdaba566f98da46d67877a8d077fb10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +calctab = { + revision = 15878; + shortdesc = "Language for numeric tables"; + stripPrefix = 0; + sha512.run = "20ccd46a047987004eef78f75b18f49b1e3001e240604e2657e23e30c4e6f286ba700cb828eeffbd608880ac4994d4a3cd2d67aa336957fecd1d3ea8a48058b1"; + sha512.doc = "555a9d966fe556e8aa1dd39ec1ec327995f62fa447bfd2bbb8efe47ad667427eef249c749f9d2c0436c16e31e6fe7b0dced9b449da307411ac186d30c2407270"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6.1"; +}; +calculation = { + revision = 35973; + shortdesc = "Typesetting reasoned calculations, also called calculational proofs"; + stripPrefix = 0; + sha512.run = "d60f9face95cdf6944363ce66b842b2a695b468e77193785564d1697244e193cc0dcf462e7a13c8a22eee173d5d4cd192ae59bbc68e086ac27c92d2dbaf6f156"; + sha512.doc = "741f4600986798bb191352ef98ac1a398014f92956267c36ca1834d95996008204107dcd8575077d7eb2dc1ddc627f03ffdf071ce0d8b2646809063eba59625a"; + sha512.source = "010291ac9b9d4529283ae9ed9054a2d797109a5eba2e999d26c4e847bba6c0bbb3a357a76526c77549636d2446d38fca2b6063ca238f5912c1aced9e2b63bb8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +calculator = { + revision = 64424; + shortdesc = "Use LaTeX as a scientific calculator"; + stripPrefix = 0; + sha512.run = "de62244340b27b1b62c7cfabc8da5acac3da0440f3190c392ae86f6160544d3b8e44dbcf5b5c95526b87cb7a0272c63fb19c06181c2b996e6de2affcddfa797e"; + sha512.doc = "d699c74a2b5a7932f454f121582ab4f03482022aef0b145f21ce04bf500f01a6504a39989fe22170fedb27206274285abff54a1fe59e2804a91d05c923c88e86"; + sha512.source = "819c7159200ceca98ab34302951af308233a12a18daebced97370eda15e41490c83b577c3f3a0bd375601f1ef4f380ef3f3cc3e4f6df84b4c3a0d9ab9fcc7a03"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +calligra = { + revision = 15878; + shortdesc = "Calligraphic font"; + stripPrefix = 0; + sha512.run = "9479d6b5ab33b12acae5cb3858c218dc4a1e1901c4006dca5160778798813d333b2e9e615eeb29e01007084d8479c58573f88ad5e282dfc06f3f5a9820df482c"; + sha512.doc = "05e7b61864f483f0fc50d4680d80a395282a5c7f36b7ccaebb70e1c24cb5a101c4ee5accfec8d12c7fac0e7a32851dc15906267b93e6d75094b7ac646826dead"; + hasRunfiles = true; + license = [ "free" ]; +}; +calligra-type1 = { + revision = 24302; + shortdesc = "Type 1 version of Calligra"; + stripPrefix = 0; + fontMaps = [ + "Map calligra.map" + ]; + sha512.run = "325764734735203d4e355d33b30a289d699fa10377212e39bf33d3195f2dfdebd4397785d69d6ca392e040cd2fd5bad20b0055b5f92620149fc96ed0d6d337a7"; + sha512.doc = "c1acbd3ae35c423b9414b5e132e1a164d4b102ecf9d7305548bb5d203a8d3a25309e2aa5a5d09277d310b9446013ca2db65f9ce6d5783432ed325838bfc9a48f"; + hasRunfiles = true; + license = [ "free" ]; + version = "001.000"; +}; +callouts = { + revision = 44899; + shortdesc = "Put simple annotations and notes inside a picture"; + stripPrefix = 0; + sha512.run = "a440d3815f5c5a6d291ce4d7a20bc8483bebe190a0e6944de9f5be78a23eef119f41740ca0fbae4515b6ea7f2aefff90a62005883c44e8d70c6aec0a58c777ee"; + sha512.doc = "0801298bd110f2e484b45c66626c790217666f3351aeeab87881d7f32ada1868222a21f2a7861afaacdea302ad269d2062aaf5fa9d13fdf8efb93efaeb499bb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +calrsfs = { + revision = 17125; + shortdesc = "Copperplate calligraphic letters in LaTeX"; + stripPrefix = 0; + sha512.run = "34b5315e9e5e0ca532733f7b7ebe66e77d935fedf0e042aec63fb7cae257a423db5e93e288b9e1dacb26b0b75784eddffa8b565acfa537a7d970297f71e63a2e"; + sha512.doc = "2378c004fe888bd2d60d0830ec98e805a2bdea3a5a6f4161dd3d4cb56c437dabdb579f3293845a10e316cd868725abd304ecb8eab55fb4c728ed5bc0d2073673"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +cals = { + revision = 43003; + shortdesc = "Multipage tables with wide range of features"; + stripPrefix = 0; + sha512.run = "75321e774560d7a205a7bf6b7d2d512c6aa9b5f38f6116813ff43ebd4d1fed23ebe26c235b278ee5723062e49630fc5f9480dccbe5bdfa44f5168f18657ddadc"; + sha512.doc = "15accc06e3de07dc535078300efbffe305d8e26a3aa0e81304de37090500210932f08c24454d0bcb5d93ced903832891b6f987525eb64d04b1a7bfe577071153"; + sha512.source = "59a99cfdb7923d0e9edfa656f53825194b3c1ad0cc554e28ce792783d3196b525a9e7dc0e5ef8dd824e4d35b39a71946c579978520c7fb87de24f1e8b91c1253"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4.2"; +}; +calxxxx-yyyy = { + revision = 69266; + shortdesc = "Print a calendar for a group of years"; + stripPrefix = 0; + sha512.run = "329c4f91442d8115c997bbab09ae77e29bd2a8146d3109328ed9e08a2a4080895618b9a8467d4827c14ef65741b1380771409909f80d0b5fba6f527fbc900411"; + sha512.doc = "8c3f1a6a168e5891a07d39c7f67270adc521c19cc4be6a302dc779b9bc5284bf4aa7d9b3caab22b5591c0483800ce62f0647bf9e14c83902777aad0070e4193c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "20.24a"; +}; +cancel = { + revision = 32508; + shortdesc = "Place lines through maths formulae"; + stripPrefix = 0; + sha512.run = "ac6e6b642dde29e32e45d7a0e967370c1f7a6ce604075cd43c57b1ee002e75adbe4fbc81de30e8d252cd58f2ac091503595a433c5de898deb3bfbdbb6f2d2e62"; + sha512.doc = "5af252a521c1976166db248c4c19d4fcadd32ec9801e0cd42b73e0a3a0adc461b88d765b90dec1af859474fc64bc00cbc8be44450cb4da6b43944c8fc46ba670"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.2"; +}; +canoniclayout = { + revision = 64889; + shortdesc = "Create canonical page layouts with memoir"; + stripPrefix = 0; + sha512.run = "850e180dad92a7082a314535fedf7e45e3bc3db48db0e7948287bf7782c2b1fd13924e666ca0edecc5fdd7b00fb55cfb0c5c17bd51019a21fd10c7116796b6d7"; + sha512.doc = "5ee3ca34d87e3f9cc70b606ebc5a8f7918d86284837a3359ca8d4dde50ce36e43a651e3cb6327f66a91f23fd7d5edad4a037e99745de3e5f23005f59517fadc5"; + sha512.source = "040ce827288d3498274c9df72b4b1a7ab50fd8a5e500cf66fe4ee0f4c211a356c63a9666a3c9003b7c3ee35ce1dcd1feb16828fe1f119a0684b24676121e911a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +cantarell = { + revision = 54512; + shortdesc = "LaTeX support for the Cantarell font family"; + stripPrefix = 0; + fontMaps = [ + "Map cantarell.map" + ]; + sha512.run = "37fd0c1986f76d823be6feecdb76bdfdc8222872355d0cd66c340950ed0ad90e057acee0f90ad0e41fc77b61a682f8bd390d98c8ed559015f9a0a65014b11b2f"; + sha512.doc = "17c118e49fb173158f7c5cfc31c1bee1063cd38bd1ba976e2629a648c795295e3796e845b735cab07de99296088d09ed9d87ed92c22af3e1dd1ec1a7a90a04d4"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "3.2"; +}; +capt-of = { + revision = 29803; + shortdesc = "Captions on more than floats"; + stripPrefix = 0; + sha512.run = "f3b1b81aa5a8c2ed9d5ab94e2e242442674af957d3f987b0db459ff8ca920abaab43d46db234b92ab588bb5f7d4c587eccf586a87fd492659f5b088760859c62"; + sha512.doc = "a8fa6b2a0787a3e52f3a9a22482ba9f9217ae97b985b4975c690d240ae040f4f1e17c3ea7439d53337e5a0815a66754d0e6c528417c04d7c6684d28e869f71d0"; + sha512.source = "87d4bb47226cef478ada2482605b925a3ebb3c1ee1fc624f39e724a857101b113856d99bf659ec5e01ce6773e0f695e424c41ba0640f23a76e9721d06a1d4f56"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +captcont = { + revision = 15878; + shortdesc = "Retain float number across several floats"; + stripPrefix = 0; + sha512.run = "b5002e8ea4fc8ca1840190e8a2d40540576dc5e17110da473a8981198e3f24c858644b181545be3bed6275cd0e0bb9848a6058adfc8dbef26956e0754c4e4699"; + sha512.doc = "91bdb436163ff745f3aecc67eec747ef5a1853035d86258bbe23a080a92b3393f72b4029bad719765663c94e79217df4edf753be930a3e4b62f0b999c296ea86"; + sha512.source = "9c9f8b2785ce2620db8e5c373cd2eee4d9aa3cd8eb47c648625ca7250e7ace861d9dbc31432a7dd7d0f6c7ccd48b43aba74df519d72e3fa1a3c9546de946e591"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +captdef = { + revision = 17353; + shortdesc = "Declare free-standing \caption commands"; + stripPrefix = 0; + sha512.run = "c24a7d66c1daa3a9c336a8555286876aea9e969a4107c42c258f0f4c9a88070316df70e0f2a860adb6335a33e49cdd7a9ba8391255f1e1fb283bd2f6a7e7b343"; + sha512.doc = "c0a1a4584d0802eda39812d2c293fabed2487b0cedb57df622519d5857c2ef10e54e66032e9e9ee9ab81c757fb827eabf422b1bf2ab0ae6f7c22ab3aecb49a8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +caption = { + revision = 68425; + shortdesc = "Customising captions in floating environments"; + stripPrefix = 0; + sha512.run = "21a36ab8ece42716032a15f3c105ba32c5697c4c88fc8b383c66bc6fe7ddd4969e12721e94d79df0817b02b43e498ba5211ef844e320bd91ccd9ae24e6f28fec"; + sha512.doc = "3a13af008ba73516f8d4be8ccdeda4b18fda2bf9462fed32aca7917efca3e5185f77810900945ed518fef5d81e2629f89cacad5564462f40bc0defe79451a415"; + sha512.source = "160a286e1145f2669dcd1abd651cf2fd725ceb95c87506d0844e95393be85624fe53b2f549b7006d8470449ee9305aeed2e81d1a7f2c69cd2f38a26aaf4fecb5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +carbohydrates = { + revision = 39000; + shortdesc = "Carbohydrate molecules with chemfig"; + stripPrefix = 0; + sha512.run = "dfccca523ef4ea2c9bba9ebdbed7f6bbce1ab0739be02118231d1eb449bc826dd5e96406d5e009239a1bf25088e8df289e2e66423a536d76cf592af1a50f276a"; + sha512.doc = "67de0675fbe00573058f428d34779b3423d1c9a7d47be5f8f1c3ba6b3cfb6783f5f1a945c1f201bb719bfe835ef035dfb56864a13ba0f12e0e83ef1ca0ce059d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +carlisle = { + revision = 59577; + shortdesc = "David Carlisle's small packages"; + stripPrefix = 0; + sha512.run = "345c61b7eb6637e73a66b5f9183ec39188d4e2ffdd418f12d8ae70394f447eaf8a5d8c62e1adfa515ab7879e1afac4163957ae0b6facafd9ae6ad6f300acbe03"; + sha512.doc = "54c785d458a5a2848c2ae5c730215df4a66a7dc523605d3a9a8985cbd65677627a2a5f5800f055da65ecfaf096fda609f4a7f3a5ce22339f0ee6bec635250ec7"; + sha512.source = "9acfe2c47c7a6a9ee358bc79482f2b21f6ab735fe25696e04a996cfad798a0461dcc0bccf6ee7fff9a6b9e22307f5312e26f9c4fba46a03f0289b8031a6bb97d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +carlito = { + revision = 64624; + shortdesc = "Support for Carlito sans-serif fonts"; + stripPrefix = 0; + fontMaps = [ + "Map carlito.map" + ]; + sha512.run = "7b958d163439d9f3e7d6f8cf998beb799013a051a1b79719930d0efbc13e167170e330908a947a9708f55897e6c0e56ea020fee5876b6f3bb9e76dcc5997a66a"; + sha512.doc = "6718aed70469e95dc4d077552b453f81c9fbbcad6201194eb264bba6aa9c9f9b1b1b09d1ed987b963d6b09e13afe5dfda1436333f0c44ee3c368caa90d790613"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +carolmin-ps = { + revision = 15878; + shortdesc = "Adobe Type 1 format of Carolingian Minuscule fonts"; + stripPrefix = 0; + fontMaps = [ + "Map cmin.map" + ]; + sha512.run = "61ae809b5e4e7ff493de30ebb825870ab9caa8dc64d6d3c82d4654fece82dece4937c798e3c1e5086a84411edbcaf8c2ea777a9534865b38d4bc5457ae59aa25"; + sha512.doc = "284d9f740d1e4b1a4c989b527bac80e54afa74013d1234bf9e1c2d42ac2ca4387c3b0d24004818e1fb92b001582114a4432480804c721cc7df0bd3b85835f111"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cartonaugh = { + revision = 59938; + shortdesc = "A LuaLaTeX package for drawing karnaugh maps with up to 6 variables"; + stripPrefix = 0; + sha512.run = "354baf8e8cffc0849494e4f79a64111bc0fd4a63e2454b4d4763bcf0c25511e4fe70caf048c628695a90c55c04fea0fcb026a57e72131e746f9d795fbf54fc82"; + sha512.doc = "3811c97d39d7738ee26cc40f839eaf9f51d798d7f14a93c5906ea977a20ff864f84772adf3815216827894fec67f21c488797b4cf0b4db3c7ef6c551637d0493"; + sha512.source = "9e417dd74451cf07d406f0c085231c175ba5bed083456a06cf9e0e3539ff32b2c6d596190ff7421b879572f0f568fd775c66e4eedeb776e69d6e5dff461dffdf"; + hasRunfiles = true; + license = [ "cc-by-sa-30" ]; + version = "1.0"; +}; +cascade = { + revision = 65757; + shortdesc = "Constructions with braces to present mathematical demonstrations"; + stripPrefix = 0; + sha512.run = "7411f24d41aae23f52a2d611cc76ae4f4e6895c8cf0d038b7e4561f355d00c21a6164f0fcb866599b5637fd9cb5e4fb34e6507638a5fa7370ade5fc1df1ded15"; + sha512.doc = "dd52dae9ec2eb88f9c8db29eb633e110132795e4c995cd6980bc68e009205bf76c5cf513a47df1391e300c886f3aed78f5ea6187dacadbeee44cd985efcd749c"; + sha512.source = "42e021863fefc55b730c35bba7966f2858567efa2ff3b0222b4bd9f2e47bc3ce8d44d3f2f01405e76831c2af99feb96d30c2a5f1974a18c2a1e84326b72180c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +cascadia-code = { + revision = 68485; + shortdesc = "The Cascadia Code font with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map CascadiaCode.map" + ]; + sha512.run = "3164663a54bc3ffe39aee9cbe9501a3d405fd8879059081ee2f0f66bb523686e25f3a7fdb69e61cb623a17ed21f21b0d6752f8c05b09590672d04315d5d6594a"; + sha512.doc = "c84b14187b080c744a33319a4ef791be09b4517d8cd0e9ed2dbedfbb37a09785dd6244a4e4dd1cf67cc8f6ff608b6ba8d2299c7074921f6443d6208c702feac7"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.2"; +}; +cascadilla = { + revision = 25144; + shortdesc = "Typeset papers conforming to the stylesheet of the Cascadilla Proceedings Project"; + stripPrefix = 0; + sha512.run = "df66bd91562f3678e2ef42f16a4a0c4af95209fb28b1176b5b63968632b3235391180b06431a42afdc73a9e4f97f47c8c954ed1ef2ccb746cdbf1d65058ad919"; + sha512.doc = "2c15b786f550642c26cc8f5e0151dd5b31e964b46d59837b3f1ccbe118fba6ad8f06f86c6a5bdc6a791615929bf4c9b7c2287f930d1ca3c8bd6c2d0d7ddf64b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8.2"; +}; +cases = { + revision = 54682; + shortdesc = "Numbered cases environment"; + stripPrefix = 0; + sha512.run = "281f9d13741f16fa07f93bbd2628f4da34db07d5005b6c1d7994ec7713aa100f152efd066bf712417bf6dc3fafb496d0a80f65cd2127c4640ab28cca6a4ee1d5"; + sha512.doc = "89aa9005cbdecc26e0b2489b544cf3f504e952eddd9a28dedd2a2f555d3e0c5f8378ce1ef21dd78fbc5ebac616cdb7559f2147e143f3cef12286a3e33d9b5616"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.2"; +}; +casyl = { + revision = 15878; + shortdesc = "Typeset Cree/Inuktitut in Canadian Aboriginal Syllabics"; + stripPrefix = 0; + sha512.run = "1536d4fe6c0cc647def47d3686ac73757da8b4ebbb99a5188e78944d59350c0da731f2e51a40c94a1e05b225a793f292766de4221792804887b4350631c8a24b"; + sha512.doc = "74adbaee46656ad57512a11986f834239d60259eb45014e2c738f7f5b5bb47897185528c0feeb96c45ab7d6c04e679e1858417a93db791b72b5eea1cf828c0ce"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.0"; +}; +catchfile = { + revision = 53084; + shortdesc = "Catch an external file into a macro"; + stripPrefix = 0; + sha512.run = "6e01a91913a2a81224a533eb7f119283c267682efaa2a6cec11e9db7fc593b0d7a6830b83e482f22e96df208dba598b1c6596a78ae5d4cd17aa4c9a50eeaddea"; + sha512.doc = "ad0d938e0bb4fe3d307dff1afc5ff93cd4b76948a88f88a65e3d036fe679cddc91c52e64febbf887c766d423fa5d94371869793c93138eeb919188b9b44234a7"; + sha512.source = "e254709b62517cbb717c43e894c17a72277465504bcbfdcacb2bf7423173e0476cce8355acb9772ca74fb267abd43faf0470ebf92139dd7847c756244efbc3fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +catchfilebetweentags = { + revision = 21476; + shortdesc = "Catch text delimited by docstrip tags"; + stripPrefix = 0; + sha512.run = "71656fb162aae4fccf15767911b8524c4f3a72f4c6fbeaea45a3dd9593489ec7644e7c10ab61a49cdd125ffe56e61331c30e35a10517720948d4f03b97b20056"; + sha512.doc = "4071d6d6ada488b5bbbac0df3b7604939fafbebc17808430d8bd389b86a8aeca0df90da77fb00f8be14af9e9a79c45bf5a2dc0b9ea45af34f60cbce83810e1a5"; + sha512.source = "0d0e6436d1e065fd518a743fd39062f1ef9a86f450130a2339ae59e5af0a9fd0ebeaf72a66301c8ad42c6e218a01bef48c977044cf284c98cbf25e6c8f1773b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +catcodes = { + revision = 38859; + shortdesc = "Generic handling of TeX category codes"; + stripPrefix = 0; + sha512.run = "6eeba6d0c7435050e5ca07a6b0a24bca1714a9ba3d3a20168547502c2ec954b9d74918767c9728c1595355fdb84eb74ef258fee86cae1907fc5b186ccac0a939"; + sha512.doc = "4dbf09f34abc39d9aa5003ce3defe4f5a04b0cade5d6a848bbde4ff3f35ff6bd511b8dd8dade14f92b1ba38bda2595da65da589b0236920c7aa340d245e0cb7c"; + sha512.source = "157520a8e968f5236add71d55aab0ddec48eeac801349ae1900cf70bcaf1faa4cfe98632ac5fa41cabee6dfb6fa46655a609023329d161cad06ece33f10d03d7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r0.2"; +}; +catechis = { + revision = 59998; + shortdesc = "Macros for typesetting catechisms"; + stripPrefix = 0; + sha512.run = "3994f92840c261d92ad8ebcf3205491146ab64cc65b7685557d2b84e3ef73058f3e968726b157d13e986a5ca40aeac2a9ffd48d019664ed2da4f01589ef4f0df"; + sha512.doc = "8b44ed2ca1ed8abbd5acc75074a2e297cc72632cda43a7049009631a79e459052808e51b169bd0be7932245ea2539223587b38cdc6d06e67c16da457b7036560"; + sha512.source = "43827e136677ad8523499d0b102a7ad4be3b95a9818a8720065d98beb07c5cf1a7f6b36c0985b7f4c6fef43fdb233a6980a5899697297cf3ad39e0da6db6c33a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6"; +}; +catoptions = { + revision = 68982; + shortdesc = "Preserving and recalling standard catcodes"; + stripPrefix = 0; + sha512.run = "d58647cd52548a6ceb0f6a47ea20ba9348e1edd55f5514c5264857d99be1085824c4f75c2f7231ef41a1ff5fd0274fd5e3f5dd1b91241179d1bab417f2ef100f"; + sha512.doc = "ef09ecf5c1bb066ae733dc1dc3aefc8f6c8521c8596ff8b45d42ce8315fe49773b6c7d41d632eb342ada05d16784faac3cdfce51af9cca4dab7c9157a7947867"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.7i"; +}; +causets = { + revision = 66359; + shortdesc = "Draw causal set (Hasse) diagrams"; + stripPrefix = 0; + sha512.run = "961f6affda4b94a2f67e1acfd62a12439faafc436c66320b04c3df11383016375f0bd284836a0618def46e624e7e7a5f46524bfb9c3113575c88d490d117a417"; + sha512.doc = "241ce316af86e3f764929fa7c601a1533b86f85dacfbf2e81acb487b312c7df9c2a9ef1ddd047a977cc7eabaf4643caeca7f5c07979f9509867f3d522c507873"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +cbcoptic = { + revision = 16666; + shortdesc = "Coptic fonts and LaTeX macros for general usage and for philology"; + stripPrefix = 0; + sha512.run = "7d48e324b5c5ff5b0755903973e0b439025e98277269f21cae33709a6c39eb6df7cd8f054b22fb8b1c072cabf9e92d0f1456cb41fbdd5a6e99bc0d63952e6c3c"; + sha512.doc = "e7e33c5af518e7fc4f8fb15af79a9aefc1ab8cb4401d0eecbd6b418acfb01c2fa790d4d7f55206ec9d6d865aa177b2872f4d742bec2991e7118df4b834341af2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +cbfonts = { + revision = 54080; + shortdesc = "Complete set of Greek fonts"; + stripPrefix = 0; + deps = [ + "cbfonts-fd" + ]; + fontMaps = [ + "MixedMap cbgreek-full.map" + ]; + sha512.run = "0e7cecfdfa102113f75f46f9c8bc76f578fca6c967128bb8b203af76cc64cbefd123ae87a8b04a9780f498517bd9f660d12e2dc586220f2c12cc8aa76f1aa40a"; + sha512.doc = "a069b7ca1b46e5656a05a5e38a0f9ea5c3ab1e5301edc47d7fdd43817a8f5d641980c2e54b7731dcbcf16e12f0dff17df5a816d66f7bd2b613232788815bb8e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cbfonts-fd = { + revision = 54080; + shortdesc = "LaTeX font description files for the CB Greek fonts"; + stripPrefix = 0; + sha512.run = "af6f11a601f2ea3fd38d639beb3f836becb71aca7d282f5d0c7e020e9f73269c560ae3ac08d93706731872bd1a271c75724e1049c2dbf65e9ac0ea8f6c9b4724"; + sha512.doc = "8fb94b444966e6e3bd63b5b3ea62f661c038767222b08df2bd288965902cf152e1af4ad4b9d69859d11b1b558f4015b2f304afb0a43c356ff663498d830e1554"; + sha512.source = "d21d517c40e8c5058c8e610ee0a8ebaf19d97a6b284b9d16ceafb87ec401b4110a483f6ed00ac626fc5ed2e1fd97f9cce99df5cc12e73ee7b92b04c84972f280"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +cc-pl = { + revision = 58602; + shortdesc = "Polish extension of Computer Concrete fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap ccpl.map" + ]; + sha512.run = "3d0bef5ca5c37f1cae98bd0555d714ed4408b6fde4ffcfa78cf2512114c9aa09b81b23bc6d76705f64dd08ea493add2027e7af997357ff5c4cc360deae11ba92"; + sha512.doc = "f5503008430e969a604973e4481f8ab51269a2c3570f757787eb7a1a9d11b8508ec7ca1709a21b9e2299059a9c8ca20e5806093bd24166eb44e167c06e4fd0ee"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.02.3"; +}; +ccaption = { + revision = 23443; + shortdesc = "Continuation headings and legends for floats"; + stripPrefix = 0; + sha512.run = "f002efbd7af71c108e041daaa182a4432d1886a058cbfda2da7fcf6c0f75a217d04bbb8498deed29c7f03a8d22d4d2e24327e6a3b284d38c7b37200431f17918"; + sha512.doc = "a3d2f92700e3421c37a666093944ae297ed39a35d99d6971978f5707619046603fad06b84aad55f41d3af08725535470ccec6d6bde3ab8f1ce4f0a53038e9ca8"; + sha512.source = "83a8ab7b7b72c156ea07bf7d19c759d342187440574dc82dc0f5e683abe490c3b408d672464d142922229593a1f8363881a48475da0884920484c6057a40358a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2c"; +}; +ccfonts = { + revision = 61431; + shortdesc = "Support for Concrete text and math fonts in LaTeX"; + stripPrefix = 0; + sha512.run = "fb111cd33ec70fa672e759c9fc2894f6b0338e40bef7d1b2fda2c37a437fb1a5ad87ec87169ec389d9eb21068c890c960a5cc24efd6e443b5995d5001f4f7115"; + sha512.doc = "b0e9b5ce6010b03afc52b6f4f7a978e8d5a8f1a382750bdbde0b758209e7f8dc57f84d950163e64381c2d7a8366a50a34c02286cc2011b9cde3e0d40810e01a4"; + sha512.source = "30a301941132ba7b85c59b7e806d2b28ff314bcaae30c228337344f09846cc1051a73df1e4a2b76e36d499095c5a21000f250ec13f967a6080280ea120dbecc7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ccicons = { + revision = 54512; + shortdesc = "LaTeX support for Creative Commons icons"; + stripPrefix = 0; + fontMaps = [ + "Map ccicons.map" + ]; + sha512.run = "4e755538440c87c2bc1f8d57d41ce78ddaeae9a0e3c1c85aeed172c2a25e952963b26245cd1ddc3222285c883ed4574ac4228d17f1263db31cc330bdb1f345a4"; + sha512.doc = "0e4216adcbe01d8feb95d31e2df143ad739f66c2239196f9f5c58638a87d320949256baee32703663d6116bd13b4af607dd38d16d4ccae218af55f5402308c03"; + sha512.source = "af84fa01272028018fbcb4fa9e04971b9580b1e6fd63f0e07419a088005b75e852a122a5ee0416afb7391ff165ae39549f8931a157aae1ea272d97be05132e8d"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; + version = "1.6"; +}; +cclicenses = { + revision = 15878; + shortdesc = "Typeset Creative Commons licence logos"; + stripPrefix = 0; + sha512.run = "dca388e065610abad24a76f7dc600d9ae659973fbc47f4fc2157958aa2850d9c3bae7811418bf76effaf696386a62584c8a2ff158e98ec7a971bd1dc800424ea"; + sha512.doc = "eb710fbac41527da39c26d5d27aaa84faf05e380356e9c3bc1a0c0fcb4d2dd5412f304d323ccf13084dfe8d31243698350fbdbefac07fff6cfabceed9f4d842c"; + sha512.source = "d20b1cce1635b415d7368e49a9a32ee3a61efca8d0807b67c7e92ed59604fda1fd9b9d168ac23d54b90e396d971fd421463eb1ec77009d3e077e474166afed55"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ccool = { + revision = 60600; + shortdesc = "A key-value document command parser"; + stripPrefix = 0; + sha512.run = "2b125b2e1fa1bf91abd3968749d422873993a6d34df66bccd2fdf8b71338cd6039be8e584f801fa12cfc90a59e32b3ca0de53ba07bdaeeac745aa2a73d05467e"; + sha512.doc = "05db77b09aba0d4ccb3712a5f5086c93de9ce70e067bab00030e96a23b058b76b69f54b379ac0ad8d03e68a3986687b1ce18a980d9ee5b7e4cb80dd2064294ef"; + sha512.source = "dad84e19fabb04f783276ad11c389c9ab0425d81fd1e91eed87b6659247613bf759064e94de39904d13148393ec34ed0567e2d680c8b794113e844feb86d8932"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +cd = { + revision = 34452; + shortdesc = "Typeset CD covers"; + stripPrefix = 0; + sha512.run = "8b47a219e4d40364e1a4ed4d13245c0c9334508ffca0cff565a8d8856aef32184bdf0a19966027fc4e958a06b4f5a53bfb66188c6fd065a1b3b230cf1da2f484"; + sha512.doc = "5ab78083715332130aacf3a97f6280f2533e7f9383c38ddf431d3486c6e88589cc69b7cd760088fbd2928c9b349ff583bc275ce8d80590234deeaf1e1a23b4ca"; + sha512.source = "094b4b41d99fcc81c4c02ec7aeeaa999b3e5ec7dd4984976021a1d75c5bf9c5a3e3f13b0acb939c14f80ec05b3843fda7558aaf7c324315434b69954084c57ed"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.4"; +}; +cd-cover = { + revision = 17121; + shortdesc = "Typeset CD covers"; + stripPrefix = 0; + sha512.run = "345b001cd40137d9739a97c3c06549c3c7b761f56f61109dd4908c767151515081defd6c432232ec7a9fdeb8e85e95258ded345facdef0cf6bffa82bb5c39fbe"; + sha512.doc = "f22c8eccbecb35d4c3c01788c0eb8ca793fbaf7b97e2bd54ec79e78ba10c13a4eef46c5eee70f1550cc7c378bb01926e8eecc6d41916df22a6e615aacd2b1e75"; + sha512.source = "d8ecc73c18376678b2ee97b8bc81aebae7860e40451427e03f382aedbacdbc17a7761e8a78e275470c36927b3461c422bc62462163c6d92c509eb50cfa75598c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +cdcmd = { + revision = 60742; + shortdesc = "Expandable conditional commands for LaTeX"; + stripPrefix = 0; + sha512.run = "677fd271bd209933428d0b655529b7e6c4bfd6022c37c3ef5456e1ce6fe25c599a9883474c28dc9510e293a2ee5e87a49b797bb562b750e888c622bf6ac6d37f"; + sha512.doc = "bf6d3bb4422dae82e06d440713518dafa98ab7ef7b527268050ebe51880f90e45b76281c1d693f1b40e85f07d7f6d395f51ce2c642094e326c3b1d08534fcba2"; + sha512.source = "50a2f50cc7432505c608aac180f7631d831742c8047a8f3da25bbdf6e83efd9121fe3b5256a2b139b1c3a29da4b2003304148f5f48c745734b811c1d853016de"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +cdpbundl = { + revision = 61719; + shortdesc = "Business letters in the Italian style"; + stripPrefix = 0; + sha512.run = "ab13c84673df8a4da5b694256ab14f3c4fab34ff32e8d2faa8712da128baefcedc19c8bcccc77a585171d25e17369af274176971a33679e07d2bd138d4766603"; + sha512.doc = "5ac8e2878434ca3b30ae20c6d1ca7c19b7ac12a38f9598d265ca6c7c214beccc144b75ff5962faf3b58b74b1ec91ab2c265d5429b98206db1fd1c558fa79385e"; + sha512.source = "b958ade1a2a9f9b685c6d7821e1a97304f0c07b9405a95231a166fe5d8ccd8f89dbf168d38996e1e633629042827cb316b81754996d9b09f4d951573967dcea9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.36d"; +}; +cell = { + revision = 42428; + shortdesc = "Bibliography style for Cell"; + stripPrefix = 0; + sha512.run = "917431174b203fd839d3cf81ed965cc654d66597246ef7a4f9f3c3a945397b546eef1e7bfc4f9fb52889e149ee2fd195dd559c317472831e66e0fc3253a6c22b"; + sha512.doc = "3cbf1ffa3902f49c155f2ee6b13e24b9abcbdf50da4668042dbc720ef20f483e230fd2ffdc8448007df7ced1ed34077811199cda4fbb35c104dce73084215bf4"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +cellprops = { + revision = 67201; + shortdesc = "Accept CSS-like selectors in tabular, array, ..."; + stripPrefix = 0; + sha512.run = "81b8f2983c9425d7b95d916fc5f1989dc266154d4cea7c48165265076f187c82d256fd98989b750cbe15db64f6fb4a935bc91ae67718b5541ed695ede861c231"; + sha512.doc = "a88187cd20bd8ab41077d3221dd6f804c310a3f7e53e1e600872a4edc65dfbe1547ca8599c42a9a10d4d61ea89c0a8da2cf4d60680706605048fb728e7f93129"; + sha512.source = "1cda598a44d2b5c8663927911a291d91dae59d5b0169d34f386910877916a7edd6018549ca36a5c317d33c93096ec77dbdab5528b4fc41864a140aa206112c75"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.0"; +}; +cellspace = { + revision = 61501; + shortdesc = "Ensure minimal spacing of table cells"; + stripPrefix = 0; + sha512.run = "75c32e958beab58086d8ba91da3bf1a4a4b9f3ec306dd5369798298c45cc67ee44c591e616062072ae399aa89c90edabe597665901ec60f46fb9fcd9d4c462d5"; + sha512.doc = "3a6044a5b3e38ea425174481bf0f079943b53b9cc7d68668f5666c72c33cc5edfb82aac08bc3347225e4838dc32579ea611e8fcd2619468e080cc63c11a38da3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.0"; +}; +celtic = { + revision = 39797; + shortdesc = "A TikZ library for drawing celtic knots"; + stripPrefix = 0; + sha512.run = "df78495c7a42a60bf40be46bf14c30d97dcd7c7d1b283f487026f7c3b6a680c750d09527cdd578f69234500eca05764792ddc90ae4dc8005126510ae33fcab4a"; + sha512.doc = "ed29c2882619bc7f076578c91cfb7e1e83af9e6960ee58af78486c1af6aeeb2b2b6eabdf916fa30ab865991c677955c0fd15a43f128aecb635ee30b3ba514bb3"; + sha512.source = "d60ef14ae649288b8b9484844fc9fbf15ce564209c04249b47c3cb0beb96c209c0401cf3f9200ca3be27ba0417c60a2a7a9780341ea311e1bc836753a2df7882"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +censor = { + revision = 67293; + shortdesc = "Tools for producing redacted documents"; + stripPrefix = 0; + sha512.run = "9f61a4830737a7ec59797489ce4fef44d5d270d1ef84b4971eda0d91bd9fb6aca0efae6a7a0d056919d090325592e459de7b9182321cf1025251a81ee9127a90"; + sha512.doc = "3cf23b7cfac9f992890f67fc86f3e53cadef7cbe2725b4a19bab144766c4f1e60a3675685513d062d5ad81b3f13b4b6864c1daf83f76761275aa51b07a130c60"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.3"; +}; +centeredline = { + revision = 64672; + shortdesc = "A macro for centering lines"; + stripPrefix = 0; + sha512.run = "b9db432378f6b24ab52c20e1189734dc7b1285792e5fc392808a04f98ce784d00ed9b87459017f1f798c5e6ff769639f650c3d3abe2cd5975306b6875e1fc067"; + sha512.doc = "023be77780a79180deae33a27b25c333f4499b302d026e5ddc34a2d1b7d45496dc0940027e7982816be0f398837ceb7b0de27ffabe0d1096c9fcab096784659a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +centerlastline = { + revision = 56644; + shortdesc = "Paragraphs with last line centered, known as \"Spanish\" paragraphs"; + stripPrefix = 0; + sha512.run = "a695c30f3b3db43c83e1ae592de9bf32b2856cca45561835e78a03808c7d3d3d8b71f4cb2cf6ecd82ff475012787f953320e4a6a5817ea384382741b7ac88cd1"; + sha512.doc = "850bd95a2ba3c9538e08163b34c900c045808ab69ab021fbb2068e1ab0fd3c5f29fca0b95864203b52704a3c33b81df7ab3cb46eb7296131fd49de71ad0fb876"; + sha512.source = "0463b1c97472750b66fed17bbe1c644b78da98ce4e02cda29cb58c4ad680124d5c5153c0b3714aaf43aab971fe38b471e7c801885d35434210d61dc43a316a43"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +cesenaexam = { + revision = 44960; + shortdesc = "A class file to typeset exams"; + stripPrefix = 0; + sha512.run = "780962e24e1dc4c6c385c18a6c95b8864b1930b2bc684d9a556a1d6579a2a8d06ec0df3fdb085c3ae8115dc72d06e376ed8ea6f6d801af07dfcbf133c9cb9c67"; + sha512.doc = "72d53ea8ffc1827f3965c6f0728aa5f2cae36f645ab10d78ff8c16a3537f79c6f53fd34f388f2991e5cd2261b366e7746a140285df95d17475adde9cee3fcaed"; + sha512.source = "e1668fb9f07baea5ccb79e2f61d672f838a83c8d5d01b3da2b3080473865b9bc8acb0165dad58aa46d1ca296e2ef8dc545db3e856d95f6749310a4c90591b4e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +cfr-initials = { + revision = 61719; + shortdesc = "LaTeX packages for use of initials"; + stripPrefix = 0; + sha512.run = "b4799007822a3bc82370b72ead503661f70cce1beb7a27bf1bd2523283a248045b0ef863ab1dd9bd93b39441e50d51fabe11a12fe6528a7966219a2da2618141"; + sha512.doc = "124dbae846ced93e4cbf5b9c16235295c7e76306830bc9e08cdb5a4e8d0d5f9deada4706c6c41cc383f440e9e874cc1cc338176787ad029f8164bbeba99db965"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +cfr-lm = { + revision = 36195; + shortdesc = "Enhanced support for the Latin Modern fonts"; + stripPrefix = 0; + fontMaps = [ + "Map clm.map" + ]; + sha512.run = "02e30f6d6d19bede2121ee0a8db20c3d96c26ef000ffeab08e800bb1da994dfa2cb356a6d67c815e8579566cf97b33b956c79940de61725524c4a239f7c1a251"; + sha512.doc = "32488ecec8a781f5548419a782775725e6b32276bab5e1d7f660b99468d47e71087fb35b8f4534f874b1dcf236d04eae9d7920fcf0bb46e139a4e7fedc415ef1"; + sha512.source = "643e7f1b48e3947506e97e1596972b686fab538511c2a0749ad936285c1e097ca8677730ea0748d1def6d6318030e7bb289e55d0c8f0ae9fc01fb308e974c24d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +changebar = { + revision = 69367; + shortdesc = "Generate changebars in LaTeX documents"; + stripPrefix = 0; + sha512.run = "2dda64af4a2528e5f81a1dad9002badd1c443d7f1e3cec36b9548254e5b365a641912e720779787cabc6057dca74af42db2e1ec3a9ffe39c3ae5ef7ffe0d8319"; + sha512.doc = "5e0e2766b5078d1ffe87c36d14961aca842ff7d0ee73aefc6277b730dfcf98ea573c822addb2d6b95cc3981e6f56458a3a209c03848eea48170f7452a6261b96"; + sha512.source = "ad58dc8f77ac1f4852d47baad9718fab4549d8fc0f856596cd8501329895b532346a299e412e87840de6934151837eee0af0b4ec30200c1bb99f10709901c9d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.7d"; +}; +changelayout = { + revision = 16094; + shortdesc = "Change the layout of individual pages and their text"; + stripPrefix = 0; + sha512.run = "c6852a40bc8415656b8137cfb90a79cff8f8e9938979eba4e02dadb3c5d1ffef60966f9e5779696402f2b9344026ebc1e22ddeb9dba856d779317ca801f26e7e"; + sha512.doc = "bb81e02317d12b4dae8b0886ac3222849a457563ee8c43e09495596c56482202bb702352a8551f5d760ee41a82dde6b3f3c2bf57b4671831a25805d44e8705de"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +changelog = { + revision = 65861; + shortdesc = "Typesetting keepachangelog.com style changelogs"; + stripPrefix = 0; + sha512.run = "9b3fd70ebd0563138e2811ec8d8748dce3d04b18da636b884887424960ee69fdd30902b85b968ee9f545d57f8dcf8f6f137174b8ea9a7049308cd778f52afbe2"; + sha512.doc = "c729c19b2a80eca9735e2caa46832da20975c89810d3f669c93e66ee4a768877c7ff30d71b2f887dace78303773eaf549ed32a001124304b82d4d51c57cc100b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5.0"; +}; +changepage = { + revision = 15878; + shortdesc = "Margin adjustment and detection of odd/even pages"; + stripPrefix = 0; + sha512.run = "0ef1d3370affd4ffc2ef77031a8713b5c663263802d67142b10fa7fc025569b3914dbbaa5e71e2c643718940a0cb89194d79ec83a83b93fcf5d57e0bfbbdbb46"; + sha512.doc = "e3894d3a475f132e2242a6402899e8b9b6045681ce1fdb05fc5b0570e4d6b8b6980c2b5f5953602690250826db0e7dc9bab2f235d39fa5bda0e1161fd781478f"; + sha512.source = "45ba09248231ad1bf14dfa553b11172e610ae8f46948451437ce3a88521f84791ae149a83c1ff104dd0f00ea6a1a029e816ab7dbe1e38b9eb97902c4a9b9b312"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0c"; +}; +changes = { + revision = 67201; + shortdesc = "Manual change markup"; + stripPrefix = 0; + sha512.run = "c7c8f65cc8a6f94403a1c85b01eece41561eaaef39b39977d02b146ef8dfa49aeca27345eb96ad5f6ee05d3a6625aa0dec9a34def564fb2b25dceaa528d230f7"; + sha512.doc = "26796990ee809dd953fc8f5ead93517faa1bdddf3639d9d51fc2f0ab00a620fdc1950ca78a6a77cb58a5977f702a1d93738312451900ffb0a745282e777f7daa"; + sha512.source = "35fc09ca71c5a7baac4d4bd69ea38f507927ba0c82c2ad7318d11ac22d3e319f70522cedea14f2d36f780bb2c7ea0cb852a111dac3b07273df53291956e9c716"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.2.1"; +}; +chappg = { + revision = 15878; + shortdesc = "Page numbering by chapter"; + stripPrefix = 0; + sha512.run = "8286a7b7664f7634bc5dd16ae1888cc4b70e2880c8749fe2e894d209384da7a8513b2daa318a4154f9b443f89b7eb2e3c6d620b81e1bbfa1ed64c243ad57e47d"; + sha512.doc = "c0d42e7a9cbae3fc7386e9734492cd3f879ecf69551d17483c4f4516c2ea09d0b9b76914decb987f850af362e54c638af190de6d0d6414d09c49cf48c0635f59"; + sha512.source = "371b6630fc12563694db35e8e086f7659e60f49a6b881281bd3bf2c081c6ccc2af74b630b6a53ac9d8b447635f2700f3d15643a02f7d873b5451c9b43a331b5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1b"; +}; +chapterfolder = { + revision = 15878; + shortdesc = "Package for working with complicated folder structures"; + stripPrefix = 0; + sha512.run = "b5f68c160249e9cd94efc4c664a18c04e627d416b304697859144d6bbc5ef787c0f8721d19cd6aab6c60864dedc65e84b3ea9114b7c823a8131b4bfdfad0c2b8"; + sha512.doc = "43a28dd7182e02ebe0541c7b236046a6c23d55c73e36aa1a0e85954c5efd917667e1916ed0bb7000cbc5285230d162d5e844726282f0bb93ff85dfbde5fe8c57"; + sha512.source = "179e4fd7966f1bc12fa89fa36a5e292f0d9937bd5ae74dbc9ef5846b0d55fdfd53e998fdb9ea40311dd34c7a99646d2dfb309fc942c6cfa3ada312297975f1e9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.1"; +}; +charissil = { + revision = 64998; + shortdesc = "CharisSIL fonts with support for all LaTeX engines"; + stripPrefix = 0; + fontMaps = [ + "Map charssil.map" + ]; + sha512.run = "214d5ac5b367e863424c54f86a841c4d1d0eac7e54cb6421619906df0e6d81661ac74e6db7369281637252ff295535e8f930442851cd0268fe9d007ddf07a913"; + sha512.doc = "3f492d929afbaff4d5c1aac1d57fc719caa04e4428de280cb8f3a6d376f6f7c3084ea8ccdac891aaa9f754be12eab99ace392d4090fe692b1d195ed12b619b49"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "6.101"; +}; +charter = { + revision = 15878; + shortdesc = "Charter fonts"; + stripPrefix = 0; + sha512.run = "706efb4e3daf7c304f5047b99d1f68051aedafc110cdd51b2e3cc520ebe628a87c41579cf476978e70aa0ae920e7a3aca1082013b41be8902174975e164a8f9b"; + sha512.doc = "846ccf6ea679e3fc70192e340ce79982cd916d1383579a8549dba7125de645e4fcd4c276800bd5815fcb67d7227081a66b51f42dabebe8cf112585ce9685fb8e"; + hasRunfiles = true; + license = [ "free" ]; +}; +chbibref = { + revision = 17120; + shortdesc = "Change the Bibliography/References title"; + stripPrefix = 0; + sha512.run = "c87fc723f7d78aaf6f47f0eb34760d20c22a46983e802f1383ca4d952b354e199fe17dcb0e8b42e66522826f71f1031c59457ad4c5f5751c6ffeba66adeb4c30"; + sha512.doc = "58c43dbb1274e99ab60ae8c2911dff6d73099c02f3c6b4b97eeccaa336f56e677ad3a1897a4fd782cf97e59b9938c83f13c0741697630d2dcaa4a7daa0b852e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +cheatsheet = { + revision = 45069; + shortdesc = "A simple cheatsheet class"; + stripPrefix = 0; + sha512.run = "5d50e5bc579821cc9296209983af68f5c12f6aaea90dffe386efb85d72683c10dd518fc2abefd51687402125bdd4f108ea6325c546ed6b2216cff130abdd1a51"; + sha512.doc = "0c798c7057e6e9d8b3aabaf745b374823f0a186e95a01d6208ec22df8f733f02a86c01b35bf4dfab88837574fc63f159ffe177f6c155e52f85bc0d062966acd3"; + sha512.source = "66f00ad307295e106dbc45827a78041329bc8f4eb7fb3eff6b2c34ea6614b84496e4cec43e81213304022121268cef3e844f2f55e95c850f56ad261068448127"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.8"; +}; +checkcites = { + revision = 70398; + shortdesc = "Check citation commands in a document"; + sha512.run = "4782a9fb2223102492071b20efa40bdfaf9447165a108f680d2148c057507349a0c14f9274265ee2954b75e5f6fc8b1457115f60324e4b6598954babc565dedb"; + sha512.doc = "dceee4bd22f760a6bc1a48fa49b0c68a0579123dbbb7422ce71db2eff910156425a0d90f62b9d62c4f4763d657c552f0cc5298a8627dbe98f0d5b6bca782b8db"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "2.7"; +}; +checkcites.binfiles = [ + "checkcites" +]; +checkend = { + revision = 51475; + shortdesc = "Extend \"improperly closed environment\" messages"; + stripPrefix = 0; + sha512.run = "40af84a5510dc3038c536c4b0aae0176651f01953650c1e6ec8b5d76459e7000246205d55f2b13ef566930649daf1eafc38e6d2d822787d1fa462e99837b6ba7"; + sha512.doc = "0527c3c080f502baaaaa14a398ecbdfa714cec872f6cf8391ef8a766aa24b497a0fc00012433409904ea11d7fec425dd7c7116a52e8d983bddb2633248d2b090"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +checklistings = { + revision = 38300; + shortdesc = "Pass verbatim contents through a compiler and reincorporate the resulting output"; + sha512.run = "599ed476321a825bea61fbdd468670cadcdb11249a4a9324fc88339a9445ceeced3680459dc2d27c2e6263cd207ffc0ce3b60b325d31072922bf4644478cf544"; + sha512.doc = "3f8d6eb67f305fa5e03bb625a4034ffe616a6c0223774688463884df99c337c1e5bdd76bbfa3b9428ec4812ec72388979c4252ba7407ae8b79e3de7cfacbeb01"; + sha512.source = "a7435841305ce368f1bedac9cb531d8f0fce3fac27484547821a2e82998e977968e578601382f4cddf6c089b42e8e175c56d2e466faa5c4c0e5b49edaf6baf1d"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +checklistings.binfiles = [ + "checklistings" +]; +chem-journal = { + revision = 15878; + shortdesc = "Various BibTeX formats for journals in Chemistry"; + stripPrefix = 0; + sha512.run = "afe7c82f6e139c1321759ef9125f262d504bf602c1c5e16a11d41cc00ea47dac3f2befd602a863a12c46beaac4c50fe6fcdb145c5c6582c9d44c2740aa1b7743"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +chemarrow = { + revision = 17146; + shortdesc = "Arrows for use in chemistry"; + stripPrefix = 0; + fontMaps = [ + "Map chemarrow.map" + ]; + sha512.run = "4a95a6b81bd649764dea052984eb21c7f9e89c612ff96d23907eefce29e2d33fe92bd7944d94a6b108213d1820b3340feab35e3646f727288cb1df9b78302990"; + sha512.doc = "882e6c6fbeb5223fc1d2404e8b9ef9bce2c3b2ed1279d2bdc45616476a856c63fe07cdeb42e27f3bc459199f3537fc620ef08c00f4eea83df77502463fc30ca6"; + sha512.source = "19903052aaa97902f721892bf4a9df8d685db46ffddb4cdeb4df280c24a72d2166bc13408a32d5c760272aee45ad5516b899c0024ff3f077fec6825f94e36736"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.9"; +}; +chembst = { + revision = 15878; + shortdesc = "A collection of BibTeX files for chemistry journals"; + stripPrefix = 0; + sha512.run = "f6bc14345c841db93207745de1d6ce189e08a30d17110d8efe04af0c5aa98cf7e3a1208e1969afeca0c69f747fb5db39437645e2437f9596ba5a70610747b6d4"; + sha512.doc = "3263dbeee44d46b6661e2e755ba10e22475432d03de6b3286d1191acf2fc8df1541d9a9684d5e00143dbebf65bee468e9244ffe73d7ff43889153925b6edb379"; + sha512.source = "c0c6658210450aa13a17e04eaee082f4d08b71a50a1552b571a49557ce8422d709da325c8bc91e742eeae04de388a777134a4d626d72409da3662c2d152cfc12"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.5"; +}; +chemcompounds = { + revision = 15878; + shortdesc = "Simple consecutive numbering of chemical compounds"; + stripPrefix = 0; + sha512.run = "d8cafe15f21045522812279337f9680a975a3f9b9930231b7992435bf694f8f180b061623bdf5fbe7dc9cfdf7d6342e0d6c2dae1cbe0d8e855699064a97a95fd"; + sha512.doc = "26d9568f73f6b0c557cc55b48a99826b70d87724f7f5776f7c58691e8374b3b6ed400206b338bb0397ae5e0c1df5d1bdbb638e80d0dbfea228138b96863587ad"; + sha512.source = "d1a0c821c6624efcb31ca21ab658a64919dd6eca51add909bea4467dbf47b20dfb60f10ee979a7525a04bae0f7440ddfae2c244da25444ccf0486708b4d1a1a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +chemcono = { + revision = 17119; + shortdesc = "Support for compound numbers in chemistry documents"; + stripPrefix = 0; + sha512.run = "29b6e78d47cdcb21c634540ed6a935cd5c6eea5fb6a28ee85cfe681ff00c8bd24d7175ee5adbbeab03e11db2f56a38d3359235ed44771976917f35c673fd21c5"; + sha512.doc = "9936d1f0ce1e6ab9498aec9d68c176ddd803de3ed1e5a698ca7b548203cac66492ce319af3e5951144ad11878065c8b349f57668498d245413d7db62d1b6a8ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +chemexec = { + revision = 21632; + shortdesc = "Creating (chemical) exercise sheets"; + stripPrefix = 0; + sha512.run = "62f374a57c799873aa4d1db52c56fcaf2f15dd813e3bd9295044499defa29a88567034e39b20af1e8a7e4208dcc35aa422c0ea8e1e0925fb1ae3e02a1a8cb482"; + sha512.doc = "83b622fe694111fefb9c7863d5322f7a717778727c99db3fe5eedec0b6575d4fe50e6b5076413cbbf36a222ee7765bbb847c44783d6ce45cb07f55bab16955da"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +chemfig = { + revision = 69227; + shortdesc = "Draw molecules with easy syntax"; + stripPrefix = 0; + sha512.run = "1f5908b759c39314eb999b4d1e60ac364888e4d6193673bd387ea838eb9bc257500b0603055b2182cd5be581dc1d674ed4eaee6ec4b0ce225f72ddb77f67ac80"; + sha512.doc = "1af123c858992787d641eb6f0263f5ed0d819c4264e97191ae8058714039e202bd9bb663e25104775d9362ca005acdb056b3c97c238b1899880fb51665405a13"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.66"; +}; +chemformula = { + revision = 61719; + shortdesc = "Command for typesetting chemical formulas and reactions"; + stripPrefix = 0; + deps = [ + "units" + ]; + sha512.run = "907efcb72ebf3a315bffc11a8d78caa82b510993b4a4de1da8a960bbd6c66bdf5bc202933fce5f4f0626ad4507a5095b571487beb2414bc49bd37e735f0299f1"; + sha512.doc = "c839fed7313744c6abb77fd4f803524c47af7f9ca0e4b533b307a198cc2fefc072541d58afca8cfab6a17b85ecdda4d3bacd451ac9616b47a448560a97f3b62a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.17"; +}; +chemformula-ru = { + revision = 70357; + shortdesc = "Using the chemformula package with babel-russian settings"; + stripPrefix = 0; + sha512.run = "ee12aadfaee03282e1cf9fcde69bf141abf0bcc5ed5a35ea78a54111494c5cb65f97a3bcdf8838a536128b05de1039a9caae7ef5078188811a54d12ec4f41855"; + sha512.doc = "290b509e2eacd081d690f857ed2a2ba3f860ec25788150af8da5f3eedc5291bbfeea84e117d04959b1a30775ebe72e88f2c0a4a4dc89517ac81b239e3c001d39"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +chemgreek = { + revision = 53437; + shortdesc = "Upright Greek letters in chemistry"; + stripPrefix = 0; + sha512.run = "8e70154271fb921ad9edf6ab5f8a21ce7c229723f88d7e37fe17aedb189c67a5749ea9e622c2dcebeedd614efbf18b9138e0219aea998f7a8ab3087348afa788"; + sha512.doc = "69ef091ed42bb40826af81c9a4ce5536873a5debd971d70d30804f75a3240bc1aea037817cdc42346537cd025306c928fa347938785af9e69022ef51fba20d2d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +chemmacros = { + revision = 62655; + shortdesc = "A collection of macros to support typesetting chemistry documents"; + stripPrefix = 0; + sha512.run = "814995dfe7978e639594d51542ac7b86f419d48ffc3d39f069c24e84abee854e01b9d72047ab44311d500b98ac1d01308b56a77006cf14a975861e45d83b9f7c"; + sha512.doc = "dfe4411faa4ae403d9b46b9f8f0e821f810c1c9b5a8926149643f099b164c7d1f163ba3436c79a8b9eccf84ac234df74c080fd2e4a9ac58452b840c335b685dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.2a"; +}; +chemnum = { + revision = 57490; + shortdesc = "A method for numbering chemical compounds"; + stripPrefix = 0; + sha512.run = "ea8bcdbb4e69422052758aa7c49f8870c468834ca15833ba4aa89df98c88dd025b4677a9a15b85dd9f953eed6e05b62bd8ef2d4849bdbb113f16de9fbede1205"; + sha512.doc = "31d1e6c6165f7d8ab15ed322b1cacea608fc796c74e3cbadde89a56f1e7bf45c01bcc6985d24a69b459976f75565f35f61174fc34562265b7f159b5b42d1ac30"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +chemobabel = { + revision = 64778; + shortdesc = "Convert chemical structures from ChemDraw, MDL molfile or SMILES using Open Babel"; + stripPrefix = 0; + sha512.run = "bd6ff01187b408d0f6d40dba470cbdb9cd72294ca425f76287d1a0d01474ca64d15db42907295b5a90958d3b5a18544a66d6b49de9a9b62e21fc3efeb6598569"; + sha512.doc = "ae4ddcb5609bf5d3c634847c7be934b4a688346469098257fda8838ff2fcad4fc390cd600991648274539cf65c937d82d337840e0500661014755bd4872e59d4"; + sha512.source = "25c4b787d5cbba3fcf0c80e134c627b5a5e09524afc2df6e428ad3430bfec95e0bc71dae2c759289ccd9d0dff736b35cea1504d4158e3b6f34af9cd07b29b208"; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "0.9l"; +}; +chemplants = { + revision = 60606; + shortdesc = "Symbology to draw chemical plants with TikZ"; + stripPrefix = 0; + sha512.run = "6d5794cdacdf71db6cef86b9bc99af2edb1a13f2b209d7693a7f37cb5161596de37b656b3e4ae690102cc64cb7245b21004c72943fb8f5e08fc1ed1479d98947"; + sha512.doc = "50cdbc24501b61b81c2cde97c851df785599f5c2f5c3e4eab75bdebd2a81501edb9e3223dacb2042682a066f5640e8b1377c43ca61ec643b342f6de2972ec4cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.9"; +}; +chemschemex = { + revision = 46723; + shortdesc = "Typeset and cross-reference chemical schemes based on TikZ code"; + stripPrefix = 0; + sha512.run = "c7375af2dbf1a7b55d41b0ab617111cc198f1aeac98c354813cb2886e0707ce5648d3e4fd9eefdd23bffddc08b96c35a050c1f440f21d5a2d7d5c6b5e0b6aaac"; + sha512.doc = "b5e864a02ed664e7d7596b56e2583f9a4aff2b8117f79415156df0cab9be084bb96eb6c70c4fca9dd4bd03b30e8b145e4cd809b165d17325625ae625c33f1dc3"; + sha512.source = "56174f5943b8dc3aa0cccaefaf9d3f24903626d3c4eb48bc79f01f2a7be603921f7b1ee300e4009038e3a92cd550c08c37aff239a9426ef3277e47f645964488"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2"; +}; +chemsec = { + revision = 46972; + shortdesc = "Automated creation of numeric entity labels"; + stripPrefix = 0; + sha512.run = "7a69ed2535d477063e55541d53f73f5d1972905f63d2298629522dfbfbbc97dba0e9ea4a48ed1667ad7b50e24c4a0f7b6d5dbbf79863c9e79a0b3de522be54c4"; + sha512.doc = "5e132354e874b3ad5a4363cfbcad49e3601380dea8f53e106bb0b5d92fb1aff6facfedbad69444ea362c76473dcc7bd8703beeeda9b69f2501d995da98ef71a2"; + sha512.source = "b81e9807d8a082b1223d4747a3f0ad3eb3dd21d1d145de5c25b8c44a384dcd941eedf7117c794efc6e4af2397997d060d0b80bad1c7f487ae98b0679f5412b2a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12a"; +}; +chemstyle = { + revision = 31096; + shortdesc = "Writing chemistry with style"; + stripPrefix = 0; + sha512.run = "299e15460a64019177530a4d28154453a813c6987e6e89b6f60466ae9e59372c1a5e0fc418c49b85364ba3185d4fe4e4b7f98caad9add7dce9bbe1792d4e314d"; + sha512.doc = "f8d6c51cd7e3df7ea8366ade62d0cf8ec3825b0ca54be600107a6be8853d1c58e1989f5c13bddcacd97673260890fd0f63e9a0282203dbdbc6a01653d86f0537"; + sha512.source = "0ee97edc8ecf8f08ed39ed9fffe18b89249c513f33ff415e4205619395baa6e8b7c77832d5110d113d78d94c1d79ba84f79a5ff23a43fd0bb23d19db96badf52"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0m"; +}; +cherokee = { + revision = 21046; + shortdesc = "A font for the Cherokee script"; + stripPrefix = 0; + sha512.run = "731fb10454a9d359d91abf927a27215e72283a9635cbd853a6738ddbd5047d81fdb8d547b891f29836d0b604d97749074e9f2676c5ad122522d987ac9bb46105"; + sha512.doc = "34b258b5b699f644cc0f7f9b673f3dbe48357bbd338726af2b404da4888a9e742f04e397cc3b6a3221d218a96ac7180ce1e6ba80a19c688de0960ce59cb14bb8"; + hasRunfiles = true; + license = [ "free" ]; +}; +chess = { + revision = 20582; + shortdesc = "Fonts for typesetting chess boards"; + stripPrefix = 0; + sha512.run = "236e195febc213825fbb5569d8eddd1967fbce1c6e9d550a1c52729be43674e063161adcd5dcb1f6293d9ecf8809518d40064fee08ab64ffe444affe3282224b"; + sha512.doc = "95d3b598f63231abb6cdccddc970d6ccb29bec7e9fa29efcf1391bca70b610e9c0bc65754061a4b955548a854bcbbdd8cdf05f8f93fe52bea400b7c281ccc0da"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +chess-problem-diagrams = { + revision = 63708; + shortdesc = "A package for typesetting chess problem diagrams"; + stripPrefix = 0; + sha512.run = "a1abc825710bea252dc9dca092c9bacebce5af21672e413425d5ddbf72022272690db31abfdc6cc4738a1aef1b802f95adf93264a4ede8c352409b2dc11c125d"; + sha512.doc = "47c2e1fa3790f7229a2402b5e20edded8c2c7908d48e16a228c55bd5b23e94d77a5e1cc9d00790238a6fec4fdfcce1915251a08b6aa487ff63e18fadea6c62f3"; + sha512.source = "b06728a4f2390692f2ff557eb06484e29baa408ec21cd8f688567fb84dc7d67cd87da8ce4f743ce51b5f43267d0c0fb8b058d4fbc848ccda71a02ac29fd5ee6c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.21"; +}; +chessboard = { + revision = 56833; + shortdesc = "Print chess boards"; + stripPrefix = 0; + sha512.run = "9447eb4dd8712ccbb519f91e99ccd1c64cc0e9ba904bd46dd8c83ce03c31e5caddca8e76c2cfeeefd5946c8881b9e6b198d50c131a1e8d5622b054d1459865cc"; + sha512.doc = "1c2e8ab2776a247ab1cbaf5527e04392dbcd1eae3a9b1c6785223268d1811a778c0812a1a5437a15cf4bbf08ff28785a57da10c472dd7567f1f0217b2d7de556"; + sha512.source = "674ac2dd69312d3959bca053d5170bf98381ec70e3d688c991e276f07260c10ded70055b4f9b819fa0cefc8f1ac7850dd9df61d38a97b58c0fc05c824a42c3e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +chessfss = { + revision = 19440; + shortdesc = "A package to handle chess fonts"; + stripPrefix = 0; + sha512.run = "8250d4b470a74877c44093888657b0a3c6ce71abc2a23780e71590d0398fc08943ef77ffafcfdabdc6bfd739f7d5b4ca15f2436df103271de029e5ff6102f579"; + sha512.doc = "1f9e625cb7765450fde23f5666af3b43ddb9ba2e67e7d04b98ef19446117cf26eaec3c2586be7c683286dedc37f8d628e4142bae834af716f2c068ac28beef58"; + sha512.source = "8745f5c712df2da39a61aa3d7ec3b6b4917c4905e3a0c4ac25ea6484555f25db6fd31b49a9c86566f69a660108683b4749abeb17f512ece9af54ffd7806c1d79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +chet = { + revision = 45081; + shortdesc = "LaTeX layout inspired by harvmac"; + stripPrefix = 0; + sha512.run = "d4a43d5ed1f8e74f0b4681abeb2b1134e9ad770cbde69679d53ea77e09a1a23412f03705691cd31110d145a96dd97e078d675274342c9323b849c770828db5fd"; + sha512.doc = "143b224d3ad957def3ec22a6e55c1b9eebd5db582065d422e1cf972580eb321ffc768c51cd687add62c01ab1cf3dec170422e6d9bbbab01846bf3e4cf84ec936"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +chextras = { + revision = 27118; + shortdesc = "A companion package for the Swiss typesetter"; + stripPrefix = 0; + sha512.run = "6fa92c9cf1da7cbe2ba74dd10f1f71274e25b228156f01efe5c67e54a2ba258500f7b2cc39fe935d4e92c641b760eacb7f39ea70643557ade4816e92e92a0b17"; + sha512.doc = "8bcc8a6c99be02d8e0babc82ec016fd6e91823a31338701e3d741af895a1d87d224a849598c2784f5de9cfefaf9cd7a09ee5b102636114d528b1e17b830ffecf"; + sha512.source = "1b82f258f1420b07699a0ee75f99e330acb4b9ad1fadc9ffb0f42a1a4321cbad9c08718f9bbb94185eea9bef8d707f729d610b5f671db7014fd237dca5fb0d6a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +chhaya = { + revision = 61719; + shortdesc = "Linguistic glossing in Marathi language"; + stripPrefix = 0; + sha512.run = "c8174ee6bbb8a57448caee6cd23bf7e41790dd1ff40cf496360548fadf1e7161b2e08b2ef53abb51b1410b406689267ce2d4a8668d052754e323a1d836670ba0"; + sha512.doc = "0e6bab691d5a5965ab8ee575f84aeae44d26ed12fa8c7f636fd0997a4ec7c1d4efc4a43f3f451659b69bd367c759dc8c3239ca51c5d12c91ef7182e43acfd126"; + sha512.source = "635430d05de402f7e56110516fd16ef455c1393cda27b61198ebf92cb9787b01ce85f58d0e06389d823a98a73514470d83624d87a035565d159323524de09439"; + hasRunfiles = true; + license = [ "gpl3Plus" "free" "fdl13Only" ]; + version = "0.4"; +}; +chicago = { + revision = 15878; + shortdesc = "A \"Chicago\" bibliography style"; + stripPrefix = 0; + sha512.run = "2313d7911a8c6bbcfbfb25405e3fd2ea8c0721045f77b9ecf27e4daaee5cfc1a5c010c72d192583e6025aecc6f69421fbd7921d63daa9f29145eb6f9c96c3abb"; + hasRunfiles = true; + license = [ "free" ]; +}; +chicago-annote = { + revision = 15878; + shortdesc = "Chicago-based annotated BibTeX style"; + stripPrefix = 0; + sha512.run = "be2bc8e7e8eaa881ed7a8225b211ef464dd5635b93b867333458521e405fa42375d4804fbdebe1b913fa694aaaa839703494a155b0ea5d4a99162f6335ccef0b"; + sha512.doc = "893ba3ff20355e0c395b2092fc01689bd956eb177434ab7152aea686210a7167a04b64ed8ec21030e4f4cbc7e1367a90976168b174fd068d6aecbd0304f380db"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +chicagoa = { + revision = 52567; + shortdesc = "\"Chicago\" bibliography style with annotations"; + stripPrefix = 0; + sha512.run = "47cd96b4933b6c0bc4af01e5085af2450b60168813715c946ea18e3e7e5f6bda409862638038917bb678579bfba127fadf51b9a5916e4fb6c78bd10481a273a4"; + hasRunfiles = true; + license = [ "free" ]; +}; +chicagolinks = { + revision = 70566; + stripPrefix = 0; + sha512.run = "191bdc3b9a732cf2153dd6d31a94dcf2a306cf1af9d1505bff28b47456a90c01a4d20717faa09b2a6875ba47852479c14e1de887a4f4b1165fa1aa9d648f3ccc"; + sha512.doc = "9bd3e34a2d897859be082969ef65e8bbbff71e318ad5a1891b1b84334b80f29b1d16d29c318e7bccffd62121a62039cb89093e72163651d1ab84db0ddb279cef"; + hasRunfiles = true; +}; +chickenize = { + revision = 57325; + shortdesc = "Use lua callbacks for \"interesting\" textual effects"; + stripPrefix = 0; + sha512.run = "3cb2182717630c6d251a055021ff671eb930885e5b33978c0cd51176225b1743938447e3d761cfa83c9e3f46cbca1b5686c18f734a1ea5fef50a7ce48873ee0a"; + sha512.doc = "a2a7ccaa210583de7a765b940959ed4cc2678c6800b283c05f301814b69bb8c704394f8795a1824b41b03652e27106b9e47ed9d5a57179df685294fc3caa16f2"; + sha512.source = "614f105bf01bc1a36ece9ed319763a06fc2480bb5c5b1845f47b17ae1753e9fea5e4f25dab9b35cd493d2c6c31de1c636723b676269495d85829b683420b7e6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +chifoot = { + revision = 57312; + shortdesc = "Chicago-style footnote formatting"; + stripPrefix = 0; + sha512.run = "492361fbe54dae9585b4d62eb1d3c3bf4a81ff8ca8020ad997cb9b30c673cfd8b35cf8ff8d742fe6c1ec7cf529e3ce558b9d5604851fc39c75d72d0fda37dc6d"; + sha512.doc = "34f5bed1ff3660a5fb1fdacb0ec26311fd47593ed6aa659d12eca8141262d9fa7d6c75b2601dc59a38ab02212269f0e69a5fb5da3d9ae1d884f25677f0f6b545"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +childdoc = { + revision = 49543; + shortdesc = "Directly compile \include'd child documents"; + stripPrefix = 0; + sha512.run = "b268695b1d91b49ba6a0179124cafa5e5cfed56672424ab40cc31924c07879b4f50be47f9fe9d574f2adb3f183c71d799cde8854a2942b530c40a1e101d399ef"; + sha512.doc = "1a74059d946b82da211f5fed7cb120453049ceaf5f10841a78ff8864b41444064b223939bd2296142bde9c7bececc0ca8bed141be02431fd60f069ecab998d87"; + sha512.source = "d74e34799e3cce5093f59d66d2680350ccf559b0a06045882dad98a60626c59f8e0ed8a6e03d09cb4ff443d3f68a33208af996e2b870047fb381f97bf92dbea8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +chinese-jfm = { + revision = 57758; + shortdesc = "Luatexja-jfm files for Chinese typesetting"; + stripPrefix = 0; + sha512.run = "28dc8b70bf5e97a4e31defe09a16805a57054a019fa7908f6dda7ecededd8a37bff3f782d04a7c2fb72ec17ee1695d5a5a68daf3a159092080e5a7d667b4c9e1"; + sha512.doc = "6b0b2e65ba4bb79a6c6eb5e4075a1611b2bc752cefe1aae5b220e663b33fde685184433c397ac4957e4f2a6716129aeff5c40ff2082b2a3bcfc13d591e06897a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.1"; +}; +chinesechess = { + revision = 63276; + shortdesc = "Typeset Chinese chess with l3draw"; + stripPrefix = 0; + sha512.run = "6ff5ef8c4c29263da38847c6c836470c397e9838c765eacdd9859a055dcc719d3385d4d9cddf5ef7e92196f99fcef8470445686c1d858bf68608429b1cd7987c"; + sha512.doc = "83d08a949754dd38beea350cc1c5f2b8d193947a909efed156f662b77a8505f993c8449f21655c48c6ea78891ff15395d34796479fe081d29958fe6a2c0ba49a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +chivo = { + revision = 65029; + shortdesc = "Using the free Chivo fonts with LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Chivo.map" + ]; + sha512.run = "ef91cfbaa46c34bdfd891c3bb752e203d1cf495d5a9f12523b3c59fc591c7abd78ad943d3f4da8abb46fea9f25cfbd280785c721cde155851fa34f3f3a71afdb"; + sha512.doc = "b174894b8ebc6bf729ca8c8cabeb9d3fcc709d4f3e0947c689489e4caaec985f35265d476e44763fa5bfccb83308857b03cdd01ec8e7e47cf406d6a86a10d071"; + sha512.source = "768f1a93665644d547e611abb5b773390205ba2839812ce222bd7d7b184851d46c7e1915d290e6ee87490faa6a8b0a2c59c3fe4a16d86bdb28fa77d6df4e8f3e"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.2"; +}; +chkfloat = { + revision = 27473; + shortdesc = "Warn whenever a float is placed \"to far away\""; + stripPrefix = 0; + sha512.run = "2a08b71c204709846bbf26ec3883e9037af6ff22e9bdf13b27319ceda55381eb9e3816ead4e444eba4b8a050a188e58d14f0d9153a813953f587c6cabb3932b8"; + sha512.doc = "b79b6bd6943dcd07656bb46d44bf50ca2c0148bdb6ae711d17a49e78f3bbf2b95781cd6f3d0b2f7625b131f7485d3db608c963367dd91dc91070501b367471b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +chklref = { + revision = 52649; + shortdesc = "Check for problems with labels in LaTeX"; + sha512.run = "12f5e950ae439d0efd3f625572e8b81d993485a1efd71dc04c078cb1dc9b76650de3c424d7a6c60ebc5ccb5d29f37ed04c477ea1306acf4c5f4fccbd95e18985"; + sha512.doc = "5aeb13824c1781feefe94215f3efce15c212e0d38f9e0d5fb393e96c2159ba43f165c600cd64ee9d8c42c0a4f0db6c2e462ee85a93993965bad0420b6b662ef6"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "3.1.2"; +}; +chklref.binfiles = [ + "chklref" +]; +chktex = { + revision = 64797; + shortdesc = "Check for errors in LaTeX documents"; + sha512.run = "7c28847e87e788d0f50c07c1c3140962a70173d2a36997720f3066755740744060ecd03272662aff563de39102052e91a4582a4bb63e35f918ad8f517dff55e6"; + sha512.doc = "28df4bed075d66d9f25bcbe332731f1d5f0bb0f7f92bd2f3618c84adf788d0f429bd0c6e75381ebf7bbeac98409d94f85d17ebd752f9e4af707d9e3373d45f97"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "1.7.8"; +}; +chktex.binfiles = [ + "chktex" + "chkweb" + "deweb" +]; +chletter = { + revision = 20060; + shortdesc = "Class for typesetting letters to Swiss rules"; + stripPrefix = 0; + sha512.run = "a32f71d89ee69ad60de6173f415d0a3aca7563107cfed71aab0ae99972a2ead442bc75f848ddf07c26c5d464b2224afed5ce976bf037049764f722396e9666d9"; + sha512.doc = "05cf8a4f37eb51cc00d9c254dcb817c41167eeb7643f7a793d1a841bd2c8a3715ced2036b974533521f48be48ae493e52ef0809789d36155d1ffc9624db538d5"; + sha512.source = "6e4c5063d7710fe5842ba684705d4b94478a9d468e68d60fe0b2ad23fdf717841421bb034317cf240269b77e4351eadce854145fe7e4300b2f9b698a6617679c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +chngcntr = { + revision = 47577; + shortdesc = "Change the resetting of counters"; + stripPrefix = 0; + sha512.run = "0fc94f91911c623578912ed43526d18f85a003f797e94ef5610aab8477154078efae7000256892cc3d3103843ac8065c27d56a10c6f57c16d9ff13693930b0b0"; + sha512.doc = "3b63e4676232c05516bb12c189873e4af39b8b34df2690c897c4733203c9f19a30759850979c47b05e5fea0bd1c277a5c1ea0624709cda6a3a4ab0196231afb9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +chordbars = { + revision = 70402; + shortdesc = "Print chord grids for pop/jazz tunes"; + stripPrefix = 0; + sha512.run = "4049c18bc34bddb954779d2b534a84791967e6d9d5c246136a046e4358f3d2b7a0127705db5cb5ebcc0e822241dbb3c17dea23d194ea71ac6d7ca40d59b9b37e"; + sha512.doc = "1a405a02e3fb813c7abd4c3925b0ccfe38129857ed5d23041ef2eab47f51206ac476727558cd50ac49b6eae3c8f67fdbfca6de252db0d95a951fc28add5a0a41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.2"; +}; +chordbox = { + revision = 51000; + shortdesc = "Draw chord diagrams"; + stripPrefix = 0; + sha512.run = "0e07cae95a8ee5f040b4df4d94f996f772f0780bbe47c77db891fbf44b08f20e28ba8442dee3e981a052b0ccebb0d630e0f0917eb7c65a490c844a65f3b2e3f4"; + sha512.doc = "0826513579953ea80047d596b6c577e4b6f00fcdddb7a06bdc953bccd72e09ec2fd9123995c1e04260ad880bc860454abd283885817a9eb359ec7cb5beba3cc5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +chronology = { + revision = 67973; + shortdesc = "Provides a horizontal timeline"; + stripPrefix = 0; + sha512.run = "0706b70147c064fed807d750e3619d6f6c9ee9d875de70c8e08720bd0fe86e75fe79a2dc909ea9c76d98e0f6cd864957ee213f58f2753eaab86bbf2866b301e9"; + sha512.doc = "dacc8fbf5869df257cc03f0bb4b1c33b2ed7e67f2bb7e4fb897038d623b4f3c1c7e308191a2270e661157d3908c142fc6fbaea349740487797f45feaabc9c039"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +chronosys = { + revision = 26700; + shortdesc = "Drawing time-line diagrams"; + stripPrefix = 0; + sha512.run = "a9503f9440dfa9a42a3f2d345c5e74faa9f40b03264bdf8482ffa58c34318467a7863033acaf089acff6056f91e9d85969676c1b0b080b363c1274ab96f022ed"; + sha512.doc = "1f2078bc645e1a9af4220bf4041391353495f76f530ab5f1a35ebf2c2a534d60a910a9ec079ec2222ced7fc3d9c146bce3d6d4d703acd2bfb9ccf357f6fd812c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +chs-physics-report = { + revision = 54512; + shortdesc = "Physics lab reports for Carmel High School"; + stripPrefix = 0; + sha512.run = "568c7b71838651881417900aa5eb8711d5e38b4496e130802b7732482c4b8d83585c54a507d2f5ee27823c9d97581db7508ea79645275ac8b1b4d02238c814e3"; + sha512.doc = "edfd22aa48a1d3db245d3e41b36cdceabe4e3c2e263d3fb270325b6acc57dabe686561af5359b849e8a17d1f2e9b77f2016cfbcf8b0af37ba3120085de9e6764"; + hasRunfiles = true; + license = [ "publicDomain" "cc-by-sa-30" ]; +}; +chscite = { + revision = 28552; + shortdesc = "Bibliography style for Chalmers University of Technology"; + stripPrefix = 0; + sha512.run = "809c76b1bb47e194c43c869b27352578fb5490f6a9a8bbc2fae662b357bd36a099f5114765611d73fae87a846526781ceb7b45aa8968836c543e15f13e7ad7a8"; + sha512.doc = "215085d808b75d0d7f3e7e95830c63172606fd43e1e30a20e376f43d12959da71e8e77a6f06a6058d8ab9f9406f1260262af3e904ff65254e5d2635ca6d15975"; + sha512.source = "cf81a7ceda538e9a3a8bb0a78927c493d42993bb295680792ba643d6f771722e0fbe342bf59cd3104cccb63b1ece7905418b998c1af1dbd7c879cce024681f9f"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.9999"; +}; +churchslavonic = { + revision = 67474; + shortdesc = "Typeset documents in Church Slavonic language using Unicode"; + stripPrefix = 0; + deps = [ + "etoolbox" + "fonts-churchslavonic" + "hyphen-churchslavonic" + "oberdiek" + "xcolor" + ]; + sha512.run = "6b312822caec9f9d71396b8737010e59521cc59a744c6d2e0633ac26b24ab0ea97ef29472a83b49448e8d82225ccb63926cd91ffdacc523ebf37bfbd2d4cf6b9"; + sha512.doc = "a56e9927434f6d29db7c1ec20c0c3d20cd24241a9883fff160cba111eb5c11181d5ad1b9ec8cb66dedc649b8c8d25b9cb8670f1a28474174b31cfed380a2327a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2.4"; +}; +cidarticle = { + revision = 68976; + shortdesc = "A class for submissions to the \"Commentarii informaticae didacticae\" (CID)"; + stripPrefix = 0; + sha512.run = "1dd802c60fade71ee873cac25440e52b9cfa45293019cba6c22a16a6861eeeea1e15ad4f945dc9eafd95873efc112110b4ec14550f8bf8cdf57bec6fb6e54ade"; + sha512.doc = "ff0dbf03d9c9f371d90adaf1f5d984e5ca6628d005c1345f4e2fa7c2c4bfe494914667d8afa572a5e3eebe73a7d4e01cfff8e1ec8c213d58f71fe64089872722"; + sha512.source = "f46c3d5e483cbc9352793a2b8cb6b92ca0a561ea321633d9589a39f8331ded98e183ac331fb100e4e7e0539674e2563aad95c029f29c00e98798462e25228c9a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +cinzel = { + revision = 64550; + shortdesc = "LaTeX support for Cinzel and Cinzel Decorative fonts"; + stripPrefix = 0; + fontMaps = [ + "Map cinzel.map" + ]; + sha512.run = "5e02892250c5b787e4c6288beae9be2b9a2a2929a31a18c40ab3bb7609a23741e829747aaaa639f8579f229005a2171070853ca79e23b7185ee5edfa090bcf13"; + sha512.doc = "7edcb9894dfbae936ef6dbde1645890feb50ba5914ffdcfd4539a44f8c8ce24f150662fec06663de54e8bfa69479c8ce006038f063f6587bf70f7c3449623a4e"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +circ = { + revision = 62977; + shortdesc = "Macros for typesetting circuit diagrams"; + stripPrefix = 0; + sha512.run = "12f50efbbb07593485120d0e0b428ff2035a44c668025eb4a6ac78ecb3c733c5975f9f7ab4685c71488e7480a3a280fb90f618d03d79f1afed278bfd67810573"; + sha512.doc = "efdc13dc7bc670719c854be45155549fa24e1e195a6a61f84a075aeca1903eb13a6579a330d7ddd6bd5a1b7073217a453e29f790600ad2013e0d82a80763d29a"; + sha512.source = "e9b6ea17103eb8438f230d2066833d8d5281f14367632fdb6e8acfcd8d33348286198ee7438c04d6b04d42bb248554946aa6eaa3a2edb6900b7c20540e5b1617"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +circledsteps = { + revision = 67889; + shortdesc = "Typeset circled numbers"; + stripPrefix = 0; + sha512.run = "41f96e112cba5f15bb36afaccff8852917383269c7ccf8f163972759615d5e5b87c3acbb54e4d14db6572cb0330154e1117f3159d851fcc9d3c5c3efd3c17d88"; + sha512.doc = "815af1f69253625528fda78b1794eae1ddb5cdce357f5af5db5a68385d7ae90386611335fb8c429de8dc13a908ab5253ca2e99ed019590434ab6d087c2dbcbd4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.3"; +}; +circledtext = { + revision = 63166; + shortdesc = "Create circled text"; + stripPrefix = 0; + sha512.run = "473d8ca8d6507148814e0c6083c7046fdb57596e374d1bcd40318c67ecc5a557b324700505d40c1040fc2b2682edae1150d5051e0c26cf9823cee0965ce4f89a"; + sha512.doc = "04ba2a36dbd2c18ae7aaab0f638412590e2d5ca43f2438690d1165f2761bb9b1b1655d26df1a01af143dcd5ca83c161ac7a7c683d3a65de6586398774023c275"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +circuit-macros = { + revision = 69263; + shortdesc = "M4 macros for electric circuit diagrams"; + stripPrefix = 0; + sha512.run = "5bd9c2885a1e8bde8f954d5a4072e00fb7e2b2a1663fa6db5f1346aa5f5022107a01f44175daeb0fa8e84e066c8373de8943b89bed725c03bdf45769dca51ef5"; + sha512.doc = "784736df91755e22f003719b1821b01a8346ffd72036cef10ed2fb38869beaa449a12f8a5782d48355426ac46268f3d897178e7ad06a2bb21fe00672a9d64280"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "10.5"; +}; +circuitikz = { + revision = 69757; + shortdesc = "Draw electrical networks with TikZ"; + stripPrefix = 0; + sha512.run = "5d2d8699c29a209f6f4eb1df363acfc1a7bcda8e7a1b110f50dfb65b97c8b09911a11528e7b1d8e5b64d9fdcf1f9fdf4feae40cf71df9a11b01cd13d64cde91e"; + sha512.doc = "398f50f5b9d0e288a7cd91e0ab222aa20877138f4ddd1963c72caa5724539e1b37fbd54503a24f234270393c6c7f07667d6a39a05dbca6199e9a52785312beb1"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.6.7"; +}; +circularglyphs = { + revision = 68476; + shortdesc = "A circular glyphs alphabet"; + stripPrefix = 0; + sha512.run = "043f30f3b8e7834698e2c70744ebb66f938ff7189c593f54b1d3017b84cd7fe180b5b7685013985f68c31f8e62785804129ba91181053119679ea4f775676933"; + sha512.doc = "8ebcaacfdafbec747a690b392e872a9ee8e7293070e3200ef583f6f5e660a5ab813a8a426464f024c493e17e956f1192984ca3a58fd7abbfb89fd403fc1e359c"; + hasRunfiles = true; + license = [ "lppl13c" "free" ]; + version = "0.1.1"; +}; +citation-style-language = { + revision = 70583; + shortdesc = "Bibliography formatting with Citation Style Language"; + deps = [ + "filehook" + "l3kernel" + "l3packages" + "lua-uca" + "lualibs" + "luatex" + "luaxml" + "url" + ]; + sha512.run = "76f5e35db0ad1ad5a2bc01a6680fc27f5721bdca3f7fb2d10c19e77583947f5fbdd7ea79b8ac63d322418eff0f48b2d45384d0be195eb43b502548773f0da291"; + sha512.doc = "3a432364b82ccbbe402e5aa10e2c17ff5a9d6e9e8611c8ac0e8385fbcc43418adf9a3d2237d10fe9f98e8b60336945fa5ade19583f35c9224a5ec3885932559b"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "mit" "cc-by-sa-30" ]; + version = "0.4.7"; +}; +citation-style-language.binfiles = [ + "citeproc-lua" +]; +cite = { + revision = 36428; + shortdesc = "Improved citation handling in LaTeX"; + stripPrefix = 0; + sha512.run = "39196b799273a2da29591b1b59c0a504f0e0971a6fb12a21bed5ac45d94eb017f1e7c64691fcd46f5c151d867c1ffac706f050fe2e08bf3c58aec8867fa185d3"; + sha512.doc = "f9ccc0e1975064ec792c6138907cd3dc8080ff2fd02a2925d1a1334cebbb2289797b234b46d92be0ba45d460c31359b5c143f20e28cd1aa1827489d04b88d300"; + hasRunfiles = true; + license = [ "free" ]; + version = "5.5"; +}; +citeall = { + revision = 45975; + shortdesc = "Cite all entries of a bbl created with BibLaTeX"; + stripPrefix = 0; + sha512.run = "2549b398c98f82833849a45716d55a776ab3b7927fdc400c2e6d43c45fb0cf628bd66bdade7ca63bcaa2e98807914f7adb958c6a06c27762fb0ee70452d4d280"; + sha512.doc = "f1eaf5ed48bf3fd2bc336b7d91dde09b5cfa9a1901bd6315d4abf032439571a89f1d7c4794ed0256ef1aff0456d275e68326e81627f164652c84de2900165a98"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +citeref = { + revision = 47407; + shortdesc = "Add reference-page-list to bibliography-items"; + stripPrefix = 0; + sha512.run = "5f56fb1d813962358c737023e06bc2fa249712d8ef984f835073e11b075b676e845596a61ac312991e646d72068670b60eb002f78ac322f66d8e5a9bce185063"; + sha512.doc = "21d1a8063586b09ba953ac5df96a3b1552c586d66c5f2af517b1b1ceb75b40f173bd411654dd313c6aeebabc35db7543ea8edcbc8705ae104c7f63e5a5b3cf57"; + hasRunfiles = true; + license = [ "bsdOriginal" ]; + version = "1.1"; +}; +cje = { + revision = 68656; + shortdesc = "LaTeX document class for CJE articles"; + stripPrefix = 0; + sha512.run = "764c9429f8000aede2b8dd85fbb2bd7eedf8e6bd2924347b75d2aa51a05b060921da15b1a55d9cc33582e5fe658d89edf8337e02f164a3de033c66bed3c6c2b7"; + sha512.doc = "791757a59293d7144844cd05ae3346068bef42dee489138e5faacac68b0ed0ec639eb8c60d0fe34e29f37e1238601ae074d43d0e7194f07c1940a0f9411f8f85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.07"; +}; +cjhebrew = { + revision = 43444; + shortdesc = "Typeset Hebrew with LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map cjhebrew.map" + ]; + sha512.run = "65a73380bcfd8892ab2eb93d088076e2d5371019244bc8a65a4695e69a45f743248fce59557533add032a02a0b7ea4f02d6ea4634265d2d9718a5b100f5a18c6"; + sha512.doc = "591d932ae099aa168d55f9479842d25c5212dd7aed27eac1a5d05a111a8a396baae7c73ddafe1087a7b8008528c50b1a85825851643d8107133d41470ce1e397"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2a"; +}; +cjk = { + revision = 60865; + shortdesc = "CJK language support"; + stripPrefix = 0; + deps = [ + "arphic" + "cns" + "garuda-c90" + "norasi-c90" + "uhc" + "wadalab" + ]; + sha512.run = "b13712912e479dab68cab9027042be8cb11047ebf9c034f532c857e83d28f19dfea5a1748685cfe1847c7372f2d0982f79736525694d937c88962c5262094585"; + sha512.doc = "a8c6b2d4d0899b841ccc32b378855d61bdaa65d5f68fd408df3894d386bcde18f384410f34e6f33ee2a5ce770e1e663a05ab038d9b7483012a3cb414739c3705"; + sha512.source = "88be587328daedfed3bdcb289b1a03343bd7257ae180a9e0857a6b00f173f601eccd8e5978dd29c2d95fbab180fcfd5135a682c5218325fc6b664f2cd505213c"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "4.8.5"; +}; +cjk-gs-integrate = { + revision = 59705; + shortdesc = "Tools to integrate CJK fonts into Ghostscript"; + sha512.run = "376a1b287955a801cb223c761fc9bee8af0f587f27f8c3e6cb32ef009fa575fdaf54f5e3847d7b4ca414e3eb4d58d3611ee2194736dcfafe8afb2dd6230c1999"; + sha512.doc = "c1165f2ecd08b279cd0d0b028682eecbb3953659426a1885bbe5aab9838a90107c576a3b9bf80b0d54dbe3fc438c8af8a8c82f5faf79052c37d2c5e85ea9ae42"; + sha512.source = "ee53a480230824eb7aa1ff270652eba4f39e5f160fdd091d596b9da610d8c8c211db3aa3d89931ec16edd36b2662d07a93513563efb3bb5a9ffc9dba0d274ee4"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "20210625.0"; +}; +cjk-gs-integrate.binfiles = [ + "cjk-gs-integrate" +]; +cjk-ko = { + revision = 70332; + shortdesc = "Extension of the CJK package for Korean typesetting"; + stripPrefix = 0; + deps = [ + "cjk" + ]; + sha512.run = "e5b28f36f37e407cdcebf10dbbcc34b4a286b6bf04e6722c1821ca9cde7037893109a81e5195622b5c57de726c408371734aa69b0e1cebef25508794e86a1422"; + sha512.doc = "cbd60b19403c80674b3d2954dbc2728529b81c38fdf84ad25607e188aec9aa14c5496b73d5c998773ebc9a4825748f85a5b6f37f53fcf8fdccd99f7288f6f426"; + hasRunfiles = true; + license = [ "gpl1Only" "lppl13c" "publicDomain" ]; + version = "2.5"; +}; +cjkpunct = { + revision = 41119; + shortdesc = "Adjust locations and kerning of CJK punctuation marks"; + stripPrefix = 0; + sha512.run = "cb44aa3386cd79f05980e5402adcbbf9f8b67fa76bdd5b293063fe9810520edbdf243656cfb54fe17d6ca43d405e6b16e8012eda63bae3cb3d8fc0f7755e2551"; + sha512.doc = "cb9383b6d3fe9ffd5926d10dddcb1ea758aabda232f015b22f61dc8a9b316193b30ca2d8e2b849b1c03d92e0073bba6d90cc5b3b50f47b28a745dff2f7229486"; + sha512.source = "0155261e5a1a22634a4c6c779054198534bc2b6ef1f1d85d471a25bde59b7e872db01627f08db6dc76c7fe6fd08d9a2363c47e79425c80ec5319648c994cbf48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.8.4"; +}; +cjkutils = { + revision = 60833; + shortdesc = "CJK language support"; + sha512.run = "36b0d0ef4bae2a9e5f2238c5c9aa125eabfca509462b65a159f66cbafc690939e16760a86e7e7dcce22ffda2f301c039059cdff1af8ed862017f18552e13e728"; + sha512.doc = "636e6486f9661061d22d248b0b7a8debdb81cd08c56b449067782568fcc7db58922f7c9d40fbc992bdd008908f22a6733af4a8115d85c0572556d01e925c5587"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "4.8.5"; +}; +cjkutils.binfiles = [ + "bg5+latex" + "bg5+pdflatex" + "bg5conv" + "bg5latex" + "bg5pdflatex" + "cef5conv" + "cef5latex" + "cef5pdflatex" + "cefconv" + "ceflatex" + "cefpdflatex" + "cefsconv" + "cefslatex" + "cefspdflatex" + "extconv" + "gbklatex" + "gbkpdflatex" + "hbf2gf" + "sjisconv" + "sjislatex" + "sjispdflatex" +]; +cjs-rcs-article = { + revision = 69006; + shortdesc = "Article class for The Canadian Journal of Statistics"; + stripPrefix = 0; + sha512.run = "6f49b9c02aa67036997403d65a9efc60c0cb7bcc29931d93fbb0359624fcbf4b3899e75c1721155b6484d7baafa79a823adf08fa5f1491352d4bd547dee22a58"; + sha512.doc = "2932d797b3969a5e399c51d2c515c05cf7fccaa88d82d80b99f626dbf2ff7a6e5f7414963696842f1980755b72a06f9e9def3d282f8ff5ca5175ad1ec8d3f1c5"; + sha512.source = "e3ca39b24e2dee6d611ccf7b0753da2d99a419db6d7e31d5aee231439dfd08da4f4bd9f902fa8c65d16df7fb9560cacf3d76ce111ba2881d267be7964c538649"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-40" ]; + version = "1.0"; +}; +clara = { + revision = 54512; + shortdesc = "A serif font family"; + stripPrefix = 0; + fontMaps = [ + "Map Clara.map" + ]; + sha512.run = "549efe7ed1b523e0f414d8f6401137cb0078256f514253199f85e436a5bac595d7525380fd986fd0c674d087decb23fc401f41a67b193c58f1e8e3bf95a8283c"; + sha512.doc = "6b7912050fd352e3095f6abede303f67d3c779b778825852bdaa37345dfec91df860e5b9d0f2fccb7e4e20abfb93740f7f8dba5959aa1d630b7cd990bc0fcf77"; + hasRunfiles = true; + license = [ "ofl" "gpl2Plus" ]; +}; +classics = { + revision = 53671; + shortdesc = "Cite classic works"; + stripPrefix = 0; + sha512.run = "86eaa987025658749c642f5132933745a418002feda5a3dec0f1dd9967a178af7e9c3188cde0b0b1fc8fb9ddf5cd59b68cf95942bd811d978d72a68f44a2999f"; + sha512.doc = "df7d88ae0dc936b8b7f60e98f806b1368d249a838a7407ebd12de05fe10a6e0c9da1ba8cddd3d396033271dd3692451441ad267a187c30cbdf28dd996f707b78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1a"; +}; +classicthesis = { + revision = 48041; + shortdesc = "A \"classically styled\" thesis package"; + stripPrefix = 0; + sha512.run = "9a8c0c9ad0d97f187cf66679613514000324a72d2745c1026889b73e5981e0dcf36f388a0bf630f5ab35d28a39ae50ac842db28c214442ccfd987ff2c132ce7b"; + sha512.doc = "3eb82d6c0f951a060e56c763e90ec842d1692326501f538d71780f4a0981edfda33b0ac0b5d00ccded7d3273fa69d4dd5d4a9c3557d9a69e1c3bc17375fbf43b"; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "4.6"; +}; +classpack = { + revision = 55218; + shortdesc = "XML mastering for LaTeX classes and packages"; + stripPrefix = 0; + sha512.run = "483d96aff1739fc2cdb63e9753fbb86ec93b493ee3d8d104e6089c791e4674d522a30e0dc747a48d8ffc6690452a147b2ad15a3a9cc676c641a9f6aca535563e"; + sha512.doc = "6e30295ea5d7ff19f47d4144a3ea6eadd85d02a80023b426675efc75cd2867e3c79b60a8210f26cb732e5b0e70bcb856d96d7ad98a6165cfeaed64affa070bec"; + sha512.source = "59ab38731bbf23dcda81c02a297c69b5787ce89a69953697651c399dc86e0994db91e5d06358365e8a607a3f15b3a115ab93fcedd8bfc9b3e91946c428e5ba40"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.19"; +}; +cleanthesis = { + revision = 51472; + shortdesc = "A clean LaTeX style for thesis documents"; + stripPrefix = 0; + sha512.run = "0f12e2eb830014bd08e742ed6dbbc83f9b6d17141a4c0a6c00934ff1d831ab7a9e9dfca6931f5842284845435593449b11b8ed9cc29c7c607fe4df14c2b11d7a"; + sha512.doc = "6042357f473bf4bce302b6f43d67fadcf0f449a3f1b1183a26d4b04375d60013eedc7389b002c1f0ed62ab1a8672735774d5aff0d7301e9a5e435080a4181c65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.0"; +}; +clearsans = { + revision = 64400; + shortdesc = "Clear Sans fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map ClearSans.map" + ]; + sha512.run = "010e18c8a29e46acba07013b8ed1ec535373199cb2c62d895c906b24800e2055ab3aeadc0ef8bf761c1d47925c8741bdfec4d18b5cbcb680b07fc258c1313126"; + sha512.doc = "a2be117afd912bab15e5ef69cfd54dd66385699677dc357233efaa73e2bd2cfaa9a29c0cf492f48ecf152a9640c95a4ebdee9366f2c27bcead571b5177345ed1"; + hasRunfiles = true; + license = [ "asl20" "lppl13c" ]; +}; +clefval = { + revision = 55985; + shortdesc = "Key/value support with a hash"; + stripPrefix = 0; + sha512.run = "1d92e279264970ca6d7612c3850fd46d4f3deb74df8a9149d6e63ac19eb665e5affeb1ab9bfea44d07825b80245b0a3b951d3ec08af0834c228a21270bc45437"; + sha512.doc = "d8242b0dc52ad63167fe13a88c28fb4b088061f7bddbe3137a7b541dd1f15aacc75a1c7c1c9b6aee2db1ff14278edf3b83d8eea5cbd77e112f16f8af9e36f19a"; + sha512.source = "abf25917b9a6aac0c3ef310bdddad1063ccbb6c59e844c792638927de403da00013e93db8bb1e9c4a052a65ee8dfb46743404efcc9c8cca6191b2703a6ab16a1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +cleveref = { + revision = 61719; + shortdesc = "Intelligent cross-referencing"; + stripPrefix = 0; + sha512.run = "7e425fd19bd559a2a3f3091f6dd3d6711e6bb4ec01f6a3f8c1dccd60cb6518f3ffe563c1b68e3b379eab7be140f7ff5f3c68dabf3dc85d196aa2d41f81a67acd"; + sha512.doc = "87760a9503b5ead92a1a8f26f9c0195487b5e7a1f97cb11519791f247cf87d35f044f68738d3563ac4a84d7f283d3907eaa816f2d4f8dc4f9cdc5114df639d99"; + sha512.source = "aae3fc03f3ccefc9c58b1372a337afc9f0fc201d3db9938a01a1832711ce10e0f0b13e72da021c328f6bb1099dfafc8378663016ca6969ecef10dd5bf3683937"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.21.4"; +}; +cleveref-forward = { + revision = 70181; + shortdesc = "Forward-referencing functionality for cleveref"; + stripPrefix = 0; + sha512.run = "bf65342e8e5d0a1299e160611044f17a6f68df342ec9bdcfe64c09ed766a7fe72b39a4d1915011b077a42261686a066b8b435f36ec6d2e0b72324cc4bc9e1381"; + sha512.doc = "b89360c16f6f77ed7386f51afcf4e46aacdb6d1f567fa5dbd4d05e46953d1a0cfba24af687abae59a72189ad84eb475d80ffb6c613ba8b3a88a91c9008a1ffea"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cleveref-usedon = { + revision = 70496; + shortdesc = "Adds forward-referencing functionality to the cleveref package"; + stripPrefix = 0; + sha512.run = "2703d610437ab3f244f0e627310d4cb5b5a6a29e29d04458eb7a566bc97a62882e3a5e14bd4717baa77b9062338d91fcbb0b0b05fbc257579b94d8ff550c96e1"; + sha512.doc = "7b967ed70196eca0537012c97dfe91613e9e54a387c0365acece66132cf513c2c1fb7ffd030e0f18c2ca079be4fd5f7ae8f47959ed1d127251febc3b4f422454"; + sha512.source = "c082df105534c961fb1e28065aecebaec2a8d03f2d450d7ba96871f06c9eff232b61b5a4e2ea142f62a720f04d776b6a3ae21f11bdab77dc6c2a95f4db6ce4e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.0"; +}; +clicks = { + revision = 64602; + shortdesc = "Slide Deck Animation"; + stripPrefix = 0; + deps = [ + "etoolbox" + "xkeyval" + ]; + sha512.run = "7218b2bf0f28a0ed382e4884aa30b59c2d8bff76a3d7a09461e5e3ebf1f41648889005db3c79fe203a4d3753a65f76a48058582e25f57e61d972e8256657712e"; + sha512.doc = "fc84edae6c263a889ea5b1d7a99b5fdf2c22bbb45c9c104e63d821a80b498d1932e654034f289a7470a15cb2ea6082eb8d8fedce24b21b9ccbd5e4304043d6b3"; + sha512.source = "ff19c270587c08c28db6cad54e2a58ce23f6041b08b6d611b7ffe6fe2b6506c1a7ae33ded3fe3ec59cee3fcfc276e6a1dc3750291b4f7691255066805ca90158"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4.1"; +}; +clipboard = { + revision = 47747; + shortdesc = "Copy and paste into and across documents"; + stripPrefix = 0; + sha512.run = "19aed32c2dc229852133a44fe5ed692a0d3194d374cc77e2301314b3fff929b834fd4df82e811095049e64ba127180eddb77fcc4211aecd2db40e8124a38d55c"; + sha512.doc = "50e7447b35c1d73c1d36bab165a8bb476764ffcc4ed7994e1bc63c6759baad0dd6c2c1f6a95334c7bf649dd13c8e79d17ec536120f1112d621e833b6f9f80578"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +clistmap = { + revision = 61811; + shortdesc = "Map and iterate over LaTeX3 clists"; + stripPrefix = 0; + sha512.run = "71da5b4136bd73945ec0e1d9fe429892960a9167b39febc0d53b7a628357db59240929ed6d8c31096c170cd0b2f5c60452f364d8903be40a6a4bf0b590069520"; + sha512.doc = "8c0ca62ecf95989e1e4f90b6c606e421bd5f536ca9d7e3745384537b33b5745b221c6485e0fc5d5a52ddfa720e34f6260eb8bec0557d7e4171406ad4985b789f"; + sha512.source = "b93a6e3bda06ce394c006964046d683576474d1ccc6b8cdde069c188cf8d146be43420c5d55a9d22bca554e87ea9309faaa73b5d0b8bb1b56981414b4b99e46a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +clock = { + revision = 15878; + shortdesc = "Graphical and textual clocks for TeX and LaTeX"; + stripPrefix = 0; + sha512.run = "ba378fe241cd2e51b641f0edc4bdd1403477b392e0a22363bcf540b513c1c15b1c0e3ab37020aa77ec147ce59cc7ad6f09c86cadcc0a77892a1a798c36c411aa"; + sha512.doc = "d06e263266ab91b48ae3238af6ce283c7f720c2113d95d10c7de6026b4557b0fcb22aaec44caba2f7ad743e578e9840da1b116fd3372558d545c424159d8f2e5"; + hasRunfiles = true; + license = [ "free" ]; +}; +clojure-pamphlet = { + revision = 67201; + shortdesc = "A simple literate programming tool based on clojure's pamphlet system"; + sha512.run = "bfdc173aa0a79905af238766f162f779296fe16e343a0fc4d41e8a47be2021eaff1cb30129db1238c725f633f3c96264ccc9a2cc0fdf0686e04622090d5a598d"; + sha512.doc = "a8c782042d9c55d234ad5df84d73e0d4abedac2294073146bbb8dc0b01ea40910657d3a3e1bfb324437bc67426f69ccae6eb297b81282f32190e87bb2ba154a8"; + hasManpages = true; + sha512.source = "8dd7cf59db96f9977f9242475c46a6635bf6cbc5c18bf1f44ee65cd6e308a5d0dafd2951b602fef102632ac2f6fdf707d306fb400b02e657c45a4eaf2a52384c"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.3"; +}; +clojure-pamphlet.binfiles = [ + "pamphletangler" +]; +cloze = { + revision = 55763; + shortdesc = "A LuaLaTeX package for creating cloze texts"; + stripPrefix = 0; + sha512.run = "f1c986699258bc9e7e27093a2d44f59d001ab13c3d9ba0717dc9bed0c53b00ce8ccf658c9cc3d7d457d18f45357a6d44da4d6710c1661ffcf299a8791822501b"; + sha512.doc = "ca3d9e0a4eb7486f40e4a26d0b6a2aa5dbf7e3d28343b9069ee97b089e7906aa137d8e7f8c6d010fd2cf472836191b88b9450248bd99728d80159afc54a8d1e7"; + sha512.source = "53d30866958183101890a4999a9b8f4b20b5bbca996d28ca4a22aaf81331f186facc695725917a9e80206545a3e0962b8c17b4e08b4d2db961878a273ba7c209"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +clrdblpg = { + revision = 47511; + shortdesc = "Control pagestyle of pages left blank by \cleardoublepage"; + stripPrefix = 0; + sha512.run = "bdd3de3ea16cb5d24879bcf2255bbe01612f8af70f663b9ac578a4ac98910119ea96b8a5b4a59d25c0406c1b33786997ee2940da0273b025455e334b48f17b7d"; + sha512.doc = "53ba8c83224ee6573cd1549e7e425fd524b5caf65ab139b67e7de9b32bdd5c3c87f5af63c2c43696554fcc33c8bff4690373ad25582b23bf51134b9cb6301409"; + sha512.source = "8663b5fa032e10cd77f4f526d30fd16302fd31c1e5ee268d815de3d4b9aee9fe6688e5c94ba50f5d0cb2bb11c03198401bb1a3bd03c431dece50dab65ae3d638"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +clrscode = { + revision = 51136; + shortdesc = "Typesets pseudocode as in Introduction to Algorithms"; + stripPrefix = 0; + sha512.run = "c26ac99b2f097b3b9df8bcb3ae040da959c0bd238be75a50b3711cdf0b7b0024ef40749169c0fe0437aa8c845b3ee9c9ec4ab46fe31fe6b1e28019fcd4779076"; + sha512.doc = "b74c858703577f79c89b4e95a0fef2012a756defda525c25f2945952b6637fba7ae4c30791a5d566267a16627bf7ce991c4edf726f7106b27b2df3c2b81eb765"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +clrscode3e = { + revision = 51137; + shortdesc = "Typesets pseudocode as in Introduction to Algorithms"; + stripPrefix = 0; + sha512.run = "eb609d4204f9292b387fb8ecac13eaaad77e1d32870cd29f4996771acc5f8e82560e3fb9dcd2c8284888ed55d2b7bfbf931b50e01b0e4b8790c2ce5ce4445588"; + sha512.doc = "0792d458ee46b44d37c31a5bbeaad2257ae1aca818ce33d0b1c8ae96b7e90ea6e06e9036ce61063f232c3829ec36bcef58f111b5df0b25d209e867ac53d322d1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +clrstrip = { + revision = 60363; + shortdesc = "Place contents into a full width colour strip"; + stripPrefix = 0; + sha512.run = "5a26232ede7efdd9ebb4ca89adaa2f0c507cb4eb883fc59662abca448a9bd09894cf52e850a0f57af101fd22ebf239ef82d4fb4a761b11448b846a82858fee96"; + sha512.doc = "9d52efc5bec01766d81240bc4087d76b08b1a07c1b89c3a197291e7f7b9e1d4e10214ba7640b591cc82c67406c487c39b571ddcc89adbdf377a3e3fb4063b21a"; + sha512.source = "db0be0ba5c5686846abc9eabfffcbe24c1b3f0e62554328c254126f7b0450ad0f066f7b3da20aabd83c80545e3400d0d52b639cc23b55a64e6b5735be79ea21f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cluttex = { + revision = 68912; + shortdesc = "An automation tool for running LaTeX"; + sha512.run = "652ad061ea6dd183b7bb5e0a893f3d1cb1e48e17f93c65e2c9f82eb1261759c369498b2ba36f48acb2a29772707bbc36c2832be1518507970f06f0e527c1fb55"; + sha512.doc = "5dec8c3c1ecebea760f25d5acdf6371ee67c40b38f64b24d2b47346caaa3a2a20d18578c37e14586fc16aa81a4f50761444f26206b01901913e684e413ecc0ed"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl3Plus" ]; + version = "0.6"; +}; +cluttex.binfiles = [ + "cllualatex" + "cluttex" + "clxelatex" +]; +cm = { + revision = 57963; + shortdesc = "Computer Modern fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap cmtext-bsr-interpolated.map" + ]; + sha512.run = "e65b2096ca183ca21d8ff987489223bc98750fcbaf4f9f9a9996f5153a76c5587d1ad77693234d02f80753b8b8cb86fd957514f82065bd7aab9eb64bad9003a3"; + sha512.doc = "39ccdee82d86f01e11aaeb53844639b4f976677c0baef7675817fafe4263e8e44cfec144f6fce265c9c80d9a9373a2f46ac8a55b7f20923c680eaddd0222a045"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +cm-lgc = { + revision = 28250; + shortdesc = "Type 1 CM-based fonts for Latin, Greek and Cyrillic"; + stripPrefix = 0; + fontMaps = [ + "Map cm-lgc.map" + ]; + sha512.run = "5fcf591d132314d8ce160e3070036f6fba56962ed40d8fee7b58b0e8219a8124bcf380b1be4e943209ba230f05cfcd374c96e3e799695a018356d12be3215760"; + sha512.doc = "eda2082e865dec858a010b757a2d60e0be9526d2e5f2c276d1c5e8d386a71f4d7631d1af8dee009f9d61e0682904697bfdc89222863499c8e1aca2b11d0f3ed9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.5"; +}; +cm-mf-extra-bold = { + revision = 54512; + shortdesc = "Extra Metafont files for CM"; + stripPrefix = 0; + sha512.run = "1845d58827ff828d6b60b82e4eda94760cd3c86076982b861e53b4f996a0dfcc9a5926ce58de27891ca3ea115a752cc4abc56b06b112d43194aa8a27c61b86fd"; + hasRunfiles = true; + license = [ "gpl1Only" "publicDomain" ]; +}; +cm-super = { + revision = 15878; + shortdesc = "CM-Super family of fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap cm-super-t1.map" + "MixedMap cm-super-t2a.map" + "MixedMap cm-super-t2b.map" + "MixedMap cm-super-t2c.map" + "MixedMap cm-super-ts1.map" + "MixedMap cm-super-x2.map" + ]; + sha512.run = "45638ebf4ef2ffb7c4b74669ea089a9f8d3ab4b98e555b3f9b2e9bd9732b48fdba61dc91188e2c8962b8bfa3caaab31c10d1ccd3e0aa9e26197b148e59576f8f"; + sha512.doc = "5b524c55dbcfa1db87484d3437156ca9987fcca66e2c2e6d69e562c48ae708e51f089051524f324cbafb72a29e08f90e70c408d7fea7341e9ef0b5d53288b7d3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +cm-unicode = { + revision = 58661; + shortdesc = "Computer Modern Unicode font family"; + stripPrefix = 0; + sha512.run = "5d6cce2e396ffa0dc887e839f4ef57865db9eda3dcdf6a62737008b53837c40ee1498d97ab06eab8f0802e745787fa5c107c0738a8dedd4e65f6996aee555c48"; + sha512.doc = "f7633d0dbd08cc1e82f6804f51c8b117dee909a81d8496826abe3e9b7107577f2818323dbd789555f8cd3f62d8f1ffac440fde64a6497135f879fb58a779cf64"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.7.0"; +}; +cmap = { + revision = 57640; + shortdesc = "Make PDF files searchable and copyable"; + stripPrefix = 0; + sha512.run = "4857f7ab9719a2b6828582599c98715c61731288899494aed96026dd6ad8bac92028586cb6b008ebaf3fb516d918861f79f544ecd64bca1e6a6183bd8bc398c1"; + sha512.doc = "5a8b1bd0c47bd5b4a3df3d0270c15c0d3c8691c96f2e5ee272ab97362463c2cfc7d1e2a9a19f5aa7ab8b145e9ae63390b1ded80b48dec52f8bf62118dabd6cd3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0j"; +}; +cmarrows = { + revision = 24378; + shortdesc = "MetaPost arrows and braces in the Computer Modern style"; + stripPrefix = 0; + sha512.run = "5f56f9ab77b2f250aff664b0007aa17eccad96d6f674ae7417f610b62d84123fc85bc80cf83948e0df2a7bfb721300e149fc764b03638e5005cc4832f2fa5544"; + sha512.doc = "0bc738eb48fc34b7cb35240622925d43e5ff5fce21b1c560158b2ceee2790a284b33816fd192a5b0161544ee5add98f4e3ebe7dd0165273d53e5ea2de7d994ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +cmathbb = { + revision = 56414; + shortdesc = "Computer modern mathematical blackboard bold font"; + stripPrefix = 0; + fontMaps = [ + "Map cmathbb.map" + ]; + sha512.run = "8e720662ac4d00557b143c883e9d410da8593cdfa056b5320e0ff348c2c0e37f9c0045341c28e583aa544790e576d9b7db8c80f93cffd8c4da699e46e35f73e0"; + sha512.doc = "f1b0b1067260287c66347e52111883834d575e5857a3aede8e14930252a284b5c0bd6bd7247c9ee36462d57a63d351110582cb66ca894d9430d476445f37da44"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +cmbright = { + revision = 21107; + shortdesc = "Computer Modern Bright fonts"; + stripPrefix = 0; + sha512.run = "3251c7ce9f139a9e553e3cf343339367e98e6982850ca3d2a2087efe5e26f4828597e6f5c1ac85567e81897a09239f5be717a6a85d04b164442c9c5c53ea4fac"; + sha512.doc = "7add06e9502ab0bf912e811afbb66caf7ac83d60b6e2575dbc75709438ce6252239a43106632633e2d90b2badd46bb800533c496c811de7316cd1766456058c9"; + sha512.source = "5824d33c26e94cf0ec8d2b69d0c80c715a68ef98ab5e2025c84fc20dcda2be4b89125dfe69400f2f27d46b773c5a3918af533cc2c25fad01694776bf5a546879"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "8.1"; +}; +cmcyr = { + revision = 68681; + shortdesc = "Computer Modern fonts with cyrillic extensions"; + stripPrefix = 0; + fontMaps = [ + "MixedMap cmcyr.map" + ]; + sha512.run = "c42006e8d596b231c3ef7f3f7123292a9563f6bb0881a7807625bd05e49a67ffd37d6e0965e6da36cdff816cdbf780e54b79b999ee5d0a18fad315f2724cc839"; + sha512.doc = "153db17097c5a1e6bbad3e13e7bbfaf13bd8380633f62e9323d2c0514a2649b001c997bad9e7495a88f5cf9c1289f2987d147e22bdca6100e7adc1d88561d443"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +cmdstring = { + revision = 15878; + shortdesc = "Get command name reliably"; + stripPrefix = 0; + sha512.run = "b05a8f8d326a6546b7c865e4cbc1afdfb0fa50993f4ad5e3b3a1e1781be9ed7590e1dd17b18d58f8a96c83aa2fe6218328b2df3e193e2dc7923d051374ebc9ba"; + sha512.doc = "c102fcd054597d84d98a4f74656f36a9e1aa53623bebaa4ef39f341ddb889062a0e0c705074a4909bf50ae3cdc9a0e0da06fc6b12fde10bcaf5391fe6c792818"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +cmdtrack = { + revision = 28910; + shortdesc = "Check used commands"; + stripPrefix = 0; + sha512.run = "22de643d5b45f3898a1aeee44ae88594b545af34bb5bdac937753c13d31071872a78935dc2c73fb22c0e591d164f618549a2bd67a00550f3fb70753a951ad4cc"; + sha512.doc = "2a69b054e1de07b31426e653af45125824bd037cf5a24fcde1f0fe1b6aa3eb925688959aa84094ecc65954b92030e1b78545db18f08a39990c4412d487ce2284"; + sha512.source = "c6b02dd165bfb3ab40ee05aa3ac9df74faff8167de021495fb08e0d173b83f75453915a634d81d260d4739166b2e5a519b8cecfc7807d25f396c27c5b65f58f3"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +cmexb = { + revision = 54074; + shortdesc = "cmexb10 metrics and Type 1"; + stripPrefix = 0; + fontMaps = [ + "Map cmexb.map" + ]; + sha512.run = "584aa7d96c86be809a1da92955c92c9e73946fc236e9991925431bae4041001f6b4d7029b13004ada0435ae291a90fce8990e527188e1f35a3be922a39faefed"; + sha512.doc = "e6f362bfa79f6c32537245af645f8b6a343ef5a9204b9cd50cfab9337e9617554bfc3fc813fe4c65d2664fc617d460f15a4ea099961699bbee82381df0856760"; + hasRunfiles = true; +}; +cmextra = { + revision = 57866; + shortdesc = "Knuth's local information"; + stripPrefix = 0; + sha512.run = "fa6bd1e79ca96500080405e01a7524a6fd13358335d34b3e2983a7f33f7b7a50ff4106ee5f2f483f3e040a3a7135b4133d727c6a7cb0c90f63be40e5410e3b48"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +cmll = { + revision = 17964; + shortdesc = "Symbols for linear logic"; + stripPrefix = 0; + fontMaps = [ + "MixedMap cmll.map" + ]; + sha512.run = "8470819c5a37b3d8d1d44aae53b62ff020087e1125f381e51ef4a639fd6b2394c3d6f15a3a86fe70e61a4545213059bde6fc3e9d06cd054e46218e90e64c0543"; + sha512.doc = "71a7cd27a2744e8e3ab09b8fbbc514eb2e38d9740349139212f0861c67948fa1a98728acb1d22a4397fe95d8efd5c6fcb87a1843a1f9dbd0d161e2e835e1ac11"; + sha512.source = "de17c8e0627408358ae3de41a5bf557d99abf76bb480ab28ef9df424d8b7ae1f73ca2e30f4eeb26ac9eb2dd36ddafa143cd49ce6618b2ca36fcfc6e22e83d217"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cmpica = { + revision = 15878; + shortdesc = "A Computer Modern Pica variant"; + stripPrefix = 0; + sha512.run = "2aac63861c3c1099054286647917f4ab594fd535de9d513f790cb70e8a38278ffda0be29656e1da57206c7bac21928cf5179bd1cc22f50e0f10d1ca8083f4b86"; + sha512.doc = "7c6251f1c5090328c93f6ec224bbb6d05433b5471c6cb8b4d7f3b9ff05f9be8ad49587d24a34702fb23b9f1803ca3df3a638b16335944a9b2dc35422ca8bf9fe"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +cmpj = { + revision = 58506; + shortdesc = "Style for the journal Condensed Matter Physics"; + stripPrefix = 0; + sha512.run = "11eafc9af424689d7f4a225eea5f5d5f6123f79265f805506f4e98155d97e557fd96a6ce5dba6b1d598817ec87f561189cf48267f08c7cd7823781eaced17e55"; + sha512.doc = "b1113cf0dbc02b69e3ed72d70168103b742d85c2115e78b1f0feece71f342293fae109f112be948e5e106dde226ae8d4d53706c3846a641b8d6e8417e8444408"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.03"; +}; +cmsd = { + revision = 18787; + shortdesc = "Interfaces to the CM Sans Serif Bold fonts"; + stripPrefix = 0; + sha512.run = "97e1830bdbab04e321433f43e14d65fd2e9820d46a6fb3616f2cea38a54208e80e1238eba7b5cfd20137f6e3a3da3a1586a7caa3e0a495ed91235a05120d444c"; + sha512.doc = "f9994a39f6e14f40398abacfe0f4c1a9cbd71d7b55c29787105fdbf8212953fb761f1696cf35196d446b9905a967d2908d7e41e7742e5cd7dd538ac0e7d3f5d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cmsrb = { + revision = 54706; + shortdesc = "Computer Modern for Serbian and Macedonian"; + stripPrefix = 0; + fontMaps = [ + "Map cmsrb.map" + ]; + sha512.run = "2fef47e94ba1a5ad0774667ac84e29040a3715c413990585aa09c866297beb61c7da533685bc1e102c8edb30d7bf6bddf8fee5486dd6d4d6ea9ebe51d2424196"; + sha512.doc = "9200b4da942f308cc60dc53b2fba9cefb7448e95d89f0c34d03604e5f7a9119aea4e762d70cfa35fd12f555f8c4ae1ab4c0b12abb04742e17b6e680bd80cc9d3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "4.0"; +}; +cmtiup = { + revision = 39728; + shortdesc = "Upright punctuation with CM italic"; + stripPrefix = 0; + sha512.run = "9412576d07ec490fda4dd01445f28e4b966d2664a81e5f44a574019df1eb4de4189b8d06edf7a1a3b57e8ade129b57c0147a96fa9b77337d9a906134e33f2067"; + sha512.doc = "aae6105fc9e828715193bc4d251210f23ce6f4c4d703c79c244ff765a377f90055188f8af83e705da062cea8db8bf6b89beecc488cce32d7903fb7fb8c4bcad9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +cmupint = { + revision = 54735; + shortdesc = "Upright integral symbols for Computer Modern"; + stripPrefix = 0; + fontMaps = [ + "MixedMap cmupint.map" + ]; + sha512.run = "ce08962145a80b7b6748145a7385cc78e361295d85ea96f24397aad3025b7eaa2e962d4d30380ca1a8d22da7175a3135abacef78a76d9d4615f03aed049a4b10"; + sha512.doc = "80cab8f9387e74db3b3650b8e7b055ecf1e094f75f0e43c4540b32658e43e392c82f3fa8ab6a6c08495ef6f9f2773501a7f282acaf7d7d640f0bd891cb8b1f08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +cnbwp = { + revision = 69931; + shortdesc = "Typeset working papers of the Czech National Bank"; + stripPrefix = 0; + sha512.run = "1e52436349c9f43a04b40ded7f35092d644ea056b5be1f91ce9efc20a5c47211017cb000ba5b3734d29fcf0553e61193cfa141ea945367362c924a061392b2a8"; + sha512.doc = "685c09924feb372af74ff578a74c4a4ed24a7b9ddbac65d8f8e2c17ba4b80e7f34d49d71ef9251b619b363a83dbbe12114aed547bff6e29d7053261cae169d22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024.02"; +}; +cnltx = { + revision = 55265; + shortdesc = "LaTeX tools and documenting facilities"; + stripPrefix = 0; + sha512.run = "fa858296b0d71265f4812289d7e50e1650deea64fe8feb86c1d9a3ce49719ed4d265e457fc1e6c9382c9344b9798ef2de322419ab38b86dfaa2f20ca87052ea4"; + sha512.doc = "b1481a3f56079e4655b94ac7855019492b051de1405016830fd196442f1c3fb8213d00540ec5fa42dccf743eefd9ff1d0a581626d2b0c64b7462e43708ccb502"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.15"; +}; +cns = { + revision = 45677; + shortdesc = "Chinese/Japanese/Korean bitmap fonts"; + stripPrefix = 0; + sha512.run = "0b3645da07e0fc9482cfeddd93f949e18dc12b6aa02e5a6c45669f3d5f7f25d5fa7ff4992f40b9b71894e21b5b1855999ba8e1b130be27e8b7001444ed30db0f"; + sha512.doc = "264c64f2ae29bff96b428500af07a81402434d9422792a36ee0da74e9821f161cf8281d38317787c0db78109d2eeaaff4e62730855ae1f1e1f250f4173740d35"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "4.2.0"; +}; +cntformats = { + revision = 34668; + shortdesc = "A different way to read counters"; + stripPrefix = 0; + sha512.run = "f829d6452faa20a514bfe43a8b002d4d728b57e0d6c44de7ba8aebaa96d9a40fc0ac26ca6ef637ab9efd3f133c70cd4d5b9c81dd382ed8adcd5abd1b2fb5d6cd"; + sha512.doc = "4d6c9b8ad41dea1e14eec71570afdeb28fb834191587ba964642628674526a5ac82d6ceb972d5d89e0faeb3fb46da26361dea45f8757523f58765dfbdb773a3d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +cntperchap = { + revision = 37572; + shortdesc = "Store counter values per chapter"; + stripPrefix = 0; + sha512.run = "ade4e6bbb00d619d52cb65549cb50f4ff9275d20a9e871ddee99064fb2ae0e02ba7d403bd6c7d658fdc6d542d7a32244ce8ff7fbe023b4fe292697584aed966a"; + sha512.doc = "354ea40ce2fe4e543016970fe81745c151a53c182800e8b861006d7e1c6fff84628a0baa4bfad29a0b81c8d0eede9f31145e7d3f380953921a48f31c5b8d0a8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +cochineal = { + revision = 70537; + shortdesc = "Cochineal fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map Cochineal.map" + ]; + sha512.run = "c8468bf472552dbbcbb84a5134a5ddc84405aab0d3b98015aba60d6da0e02896d929582778bfecf3694a7a0174d31214c9231a1da11284af6fdf3362b95e179b"; + sha512.doc = "43f7de109858a3e9a120b51022d3cab77dd0ae4ee2dd5e2d032ed3f9ba669ce2f5280bd359d8dbf158181727442e1e00ac8914d8cbe3edb93c40ab01362a2dbf"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.085"; +}; +codeanatomy = { + revision = 65648; + shortdesc = "Typeset code with annotations"; + stripPrefix = 0; + sha512.run = "59f2c1b91875a69434595d435eb905265c9e114bebb8a94edbe07f597518424add7916fab565caef11302e6c31537c54e5885f3320ec0e515cd0a207c8012e00"; + sha512.doc = "4595189bdcee5788de92793b54e8a3dab0215057acbf7d9d575af6e9fb67a92ec1985d61d415bd44bea2d8ae7084de0676e121c96be2262c93eee78116f50a86"; + sha512.source = "27c57ca05dd82f9810e63a0265658174dc3a9dfe21033c70bea65db5543648dc51052a8b72bd5f2d89e7ad9806d1cf1b0bf1e9c9ca543589afef2dc07184114d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4-Beta"; +}; +codebox = { + revision = 61771; + shortdesc = "Highlighted source code in a fancy box"; + stripPrefix = 0; + sha512.run = "04f63b435f360fdfa81bb7afeef38117a8a4b81b70562e21020470f49f33abc33038d6c55665a5ae4573ff61c19ed9120e824eb319ea97523fe1fa8e82ba9424"; + sha512.doc = "165fffcfbff35064a3c55a0fe1b095f3a45a5c01d1c8a8704cd151cbb20c440592edecc3be71900b1a7a5e7af28d6a8d6c4a3b9fd09f850c7da71362e2377ddd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.4"; +}; +codedescribe = { + revision = 69944; + shortdesc = "LaTeX code description and documentation"; + stripPrefix = 0; + sha512.run = "5c3fa3c2843820575d28e1c9adced0cabf0f19fc4ae8022eef4fe18f18cf9cffe8582cb4d8b2f5d064bb5f836641f2229a6f0b6976556a9bec4ae66739b48c00"; + sha512.doc = "305c4b68a7011697c750789cbffcf09a45b3704ded67538efd6ef134c499cf42c50ff3a6503350b75cdac07574360941f66ccb67044a5f5db4ba6f050604c3f5"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.4"; +}; +codedoc = { + revision = 17630; + shortdesc = "LaTeX code and documentation in LaTeX-format file"; + stripPrefix = 0; + sha512.run = "8dc006776f2a3f0f28aeed0450e2d7b714402de1939a92d1e7f1e0174a8de7e9f7099e7ae9a5de34df03613ff16800bde17f7cc90fa82798f30c775c10c655ff"; + sha512.doc = "fa23f45c539ec134cff114d7252a4d96585168729dc33d0865f4976f94620a8d3c02fa21572953161977d893c7f311b0d15a431f74b8526d1de0680dfdad7341"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +codehigh = { + revision = 65787; + shortdesc = "Highlight code and demos with l3regex and lpeg"; + stripPrefix = 0; + sha512.run = "ca33d6cb84e716357cb18d8448f8e047b4bc049cca8e77aa80525a209c66ae4b93dcd453f91672cf15fc5305ce1d62768e9851edd6fb07214153100cdacfc884"; + sha512.doc = "f689cede2e83dee785e3b83094f5897a8d7af4e39e3c33779acceeb7ed0c1226d094aca64c222f4b1488916e7ad78ed1a6b8800070910d4e0daf6e6ccd24bc5e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2023A"; +}; +codepage = { + revision = 51502; + shortdesc = "Support for variant code pages"; + stripPrefix = 0; + sha512.run = "2531186744ce4915b8d903e0ea49e1d3e0a6be5ab2db7bc2a5cbc70e675c2dd00104a677c08b7b7d12eca56dfc4b283c49ee599fff6d3460c6238f414ba3cb76"; + sha512.doc = "b49ffff68cc599835acf436de3117c7f9511b362d821bdd8c18f0af930c5b717dc0bcd00477e6f0f367229b9d1f6dd150a8166dd74bbfbc2cfcb77ccf28cd8d5"; + sha512.source = "2c12bf42c1aa818d5718f2bbbb07460364ad40f7bc4cf0676cb064a03751e1bd88be16fffaae097f5ed9c0793f60ffb93374b43f7b90acf8ad3cbc8f5d7b8b70"; + hasRunfiles = true; + license = [ "free" ]; +}; +codesection = { + revision = 34481; + shortdesc = "Provides an environment that may be conditionally included"; + stripPrefix = 0; + sha512.run = "95318ae4933d0cb43226c714c8ff931aaa8e06cfb2c44c3929db59ae8336882c588e26268445b62f8da32145a962bae0030daff3d5cfa22007919fb7b13fd69d"; + sha512.doc = "881e62381793f548d0c291141944d81e19cf4340f2c1f63916857f5702756e18d107337c340568d62de48fe2190cf4c74a8d6604f8d4843c47ceb7c59608c0b0"; + sha512.source = "e2ca6d6cb96977d494bfa9818d90aef30a915dd4c284fb7e555e79c09db022819a6e1f825ab895108594b90b488e70780f268022a896feef7dcc1ab590fabce9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +codicefiscaleitaliano = { + revision = 29803; + shortdesc = "Test the consistency of the Italian personal Fiscal Code"; + stripPrefix = 0; + sha512.run = "7c93841ceadbb7bbfc9846d281fdbd84b7f284117344e1c4fd984e746186403e9be3e2048cfca53f6690a1e20b7471224b8d30ed1358959053111c22d3f15191"; + sha512.doc = "7b0c13252796be7d584d3e5dad65711229cf916ce7c8e89e423805183629f161b3d4e4f47d6c9488ab32ff8b52723b0fbc4252f2ca99e965f4d7c4409881b67d"; + sha512.source = "8602ad1eee729a5d21d760da54f31d67746bc336c9e18d43b9cf3a5443afaf8099d27a908cc1cd9cc028e94b2173e97179cf293d5739244834817f0bc50bbaa3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +coelacanth = { + revision = 64558; + shortdesc = "Coelacanth fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map Coelacanth.map" + ]; + sha512.run = "279faeb81ba3169bc72848c691ab42729c670bed5c41a2add3e338bec0c109ff15ffcb492e19834d0ab2293040a659e3994f374b5a6028d505823e372eab7f48"; + sha512.doc = "ae548dfea88ab4315674caca7e0531bf52512b6ac8198853e0c70661e91061e3fdc15c82be7d6f1ee5c92a7cf340e65b0ce99665da82507b9d9f9b119722c2b7"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.005"; +}; +coffeestains = { + revision = 59703; + shortdesc = "Add coffee stains to documents"; + stripPrefix = 0; + sha512.run = "7a8213810b8bb30c0b863ce996aab92a9031dd9961513d25822904c6e71dd2fa1b79f050f1840e8d88e8f8e8e87c7736369f3fa7a6873cbaa57fb8dca7c71d47"; + sha512.doc = "fab8a2aeae8dd1c6f0f501d894f90d5b6f7785bf8b3fcf86837f4bc41da8002427c69094676870ea7dfe9186b3bb92433f5c66f0cedd08f57954487db8bb162b"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.5.1"; +}; +collargs = { + revision = 69284; + shortdesc = "Collect arguments of any command"; + stripPrefix = 0; + sha512.run = "1807cca3a1e73b42ec1403c272777d5e31c1a6ecc3efe9b61697d6fee7b2b1deb76b9b909846b55a297587e950b42754f68be4cc5ed729c54e310fcd248d2972"; + sha512.doc = "395931952725fbebb85445d8f465bc57a74d98f2d70b61f67b97f9a3542598bdfb1ddd7203a3bcae87094aded580325c98f77bfcdfa78147b971a9aff18a8cd0"; + sha512.source = "4ec8b2ed23cae6473c8a5993efa79e426522ba710378598c408e4b33343b1be29c7aee01c2ad1483cad2a91fcc8775844fa598f740c42438d9c830210d31e0ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +collcell = { + revision = 64967; + shortdesc = "Collect contents of a tabular cell as argument to a macro"; + stripPrefix = 0; + sha512.run = "ecc414d09b916580b87aeba0192b55e698782ee9fca088ff3d3ab6f247ff2fa33caa0cf6913870f8f3219806e2ac88674c6f7692ebdc027675907355c38c6eea"; + sha512.doc = "a516c5c4030957305e413e252cc59f33652b42f2d0dc0aa0fbe297f33a68da4d534f0b07684d39276e8b6811b53b775db45b774e7ea82fc9b0c7382910ab6442"; + sha512.source = "1cd565603f9c6e4b267d67b501842a95916072deac09b0330336d8d2b97cce1a7571f9a8f0725958a920f0d786d1a3a6aa8682b232e276b9fe8e4208a08c34cd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +collectbox = { + revision = 64967; + shortdesc = "Collect and process macro arguments as boxes"; + stripPrefix = 0; + sha512.run = "59316a336010c03bbe288ecaf20953666d084500165befe465ac87210795f2ef68693e5fe155b45a461a690d918d83aad247dcd52eb40cd0bf80f6c68fcd8071"; + sha512.doc = "db2d2066072a3619913df6fbdfb19ec3afc50495d51ccf1339312bcff1bf7841902f412932205cb4ae2f94acd33b9fe2b250d67ae02c22d6efa25c251a182c00"; + sha512.source = "b54a9a9215639eba3c0c052676122a3c25efacda695b34c56317d809e69e6859bb52c7fb8845e08ece9d1a2ffa399f3800737b56eca7e6c4a2f7ced14b10a2ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4c"; +}; +collection-basic = { + revision = 59159; + shortdesc = "Essential programs and files"; + stripPrefix = 0; + deps = [ + "amsfonts" + "bibtex" + "cm" + "colorprofiles" + "dvipdfmx" + "dvips" + "ec" + "enctex" + "etex" + "etex-pkg" + "glyphlist" + "graphics-def" + "hyph-utf8" + "hyphen-base" + "hyphenex" + "ifplatform" + "iftex" + "knuth-lib" + "knuth-local" + "kpathsea" + "lua-alt-getopt" + "luahbtex" + "luatex" + "makeindex" + "metafont" + "mflogo" + "mfware" + "modes" + "pdftex" + "plain" + "tex" + "tex-ini-files" + "texlive-common" + "texlive-en" + "texlive-msg-translations" + "texlive-scripts" + "texlive.infra" + "tlshell" + "unicode-data" + "xdvi" + ]; + sha512.run = "4241bc3a3ef21502faa9a2e0b16295126c357fc15813a625306552b40f9da804164abccce642f4ec1e677092f81d61381958b87fcf515120a12f9b7a19055370"; +}; +collection-bibtexextra = { + revision = 70566; + shortdesc = "BibTeX additional styles"; + stripPrefix = 0; + deps = [ + "aaai-named" + "aichej" + "ajl" + "amsrefs" + "annotate" + "apacite" + "apalike-ejor" + "apalike2" + "archaeologie" + "authordate" + "beebe" + "besjournals" + "bestpapers" + "bib2gls" + "bibarts" + "bibcop" + "biber" + "biber-ms" + "bibexport" + "bibhtml" + "biblatex" + "biblatex-abnt" + "biblatex-ajc2020unofficial" + "biblatex-anonymous" + "biblatex-apa" + "biblatex-apa6" + "biblatex-archaeology" + "biblatex-arthistory-bonn" + "biblatex-bath" + "biblatex-bookinarticle" + "biblatex-bookinother" + "biblatex-bwl" + "biblatex-caspervector" + "biblatex-chem" + "biblatex-chicago" + "biblatex-claves" + "biblatex-cv" + "biblatex-dw" + "biblatex-enc" + "biblatex-ext" + "biblatex-fiwi" + "biblatex-gb7714-2015" + "biblatex-german-legal" + "biblatex-gost" + "biblatex-historian" + "biblatex-ieee" + "biblatex-ijsra" + "biblatex-iso690" + "biblatex-jura2" + "biblatex-juradiss" + "biblatex-license" + "biblatex-lncs" + "biblatex-lni" + "biblatex-luh-ipw" + "biblatex-manuscripts-philology" + "biblatex-mla" + "biblatex-morenames" + "biblatex-ms" + "biblatex-multiple-dm" + "biblatex-musuos" + "biblatex-nature" + "biblatex-nejm" + "biblatex-nottsclassic" + "biblatex-opcit-booktitle" + "biblatex-oxref" + "biblatex-philosophy" + "biblatex-phys" + "biblatex-publist" + "biblatex-readbbl" + "biblatex-realauthor" + "biblatex-sbl" + "biblatex-science" + "biblatex-shortfields" + "biblatex-socialscienceshuberlin" + "biblatex-software" + "biblatex-source-division" + "biblatex-spbasic" + "biblatex-subseries" + "biblatex-swiss-legal" + "biblatex-trad" + "biblatex-true-citepages-omit" + "biblatex-unified" + "biblatex-vancouver" + "biblatex2bibitem" + "biblist" + "bibtexperllibs" + "bibtools" + "bibtopic" + "bibtopicprefix" + "bibunits" + "biolett-bst" + "bookdb" + "breakcites" + "cell" + "chbibref" + "chembst" + "chicago" + "chicago-annote" + "chicagoa" + "chicagolinks" + "chscite" + "citation-style-language" + "citeall" + "citeref" + "collection-latex" + "collref" + "compactbib" + "crossrefware" + "custom-bib" + "din1505" + "dk-bib" + "doipubmed" + "ecobiblatex" + "econ-bst" + "economic" + "fbs" + "figbib" + "footbib" + "francais-bst" + "gbt7714" + "geschichtsfrkl" + "harvard" + "harvmac" + "hep-bibliography" + "historische-zeitschrift" + "icite" + "ietfbibs" + "ijqc" + "inlinebib" + "iopart-num" + "is-bst" + "jbact" + "jmb" + "jneurosci" + "jurabib" + "ksfh_nat" + "listbib" + "logreq" + "ltb2bib" + "luabibentry" + "margbib" + "multibib" + "multibibliography" + "munich" + "nar" + "newcastle-bst" + "nmbib" + "notes2bib" + "notex-bst" + "oscola" + "perception" + "plainyr" + "pnas2009" + "rsc" + "showtags" + "sort-by-letters" + "splitbib" + "turabian-formatting" + "uni-wtal-ger" + "uni-wtal-lin" + "urlbst" + "usebib" + "vak" + "windycity" + "xcite" + "zootaxa-bst" + ]; + sha512.run = "8a96e8a580846ea80c0be60ba037e761f5d695eb184c72da71709bf528368ac18464cbf955ba5fc6e6b574aa9ad76d2e26797907f141753716c0deccf625d6d8"; +}; +collection-binextra = { + revision = 69527; + shortdesc = "TeX auxiliary programs"; + stripPrefix = 0; + deps = [ + "a2ping" + "adhocfilelist" + "arara" + "asymptote" + "bibtex8" + "bibtexu" + "bundledoc" + "checklistings" + "chklref" + "chktex" + "clojure-pamphlet" + "cluttex" + "collection-basic" + "ctan-o-mat" + "ctan_chk" + "ctanbib" + "ctanify" + "ctanupload" + "ctie" + "cweb" + "de-macro" + "detex" + "digestif" + "dtl" + "dtxgen" + "dvi2tty" + "dviasm" + "dvicopy" + "dvidvi" + "dviinfox" + "dviljk" + "dviout-util" + "dvipng" + "dvipos" + "dvisvgm" + "easydtx" + "findhyph" + "fragmaster" + "git-latexdiff" + "gsftopk" + "hook-pre-commit-pkg" + "installfont" + "ketcindy" + "lacheck" + "latex-git-log" + "latex-papersize" + "latex2man" + "latex2nemeth" + "latexdiff" + "latexfileversion" + "latexindent" + "latexmk" + "latexpand" + "light-latex-make" + "listings-ext" + "ltxfileinfo" + "ltximg" + "make4ht" + "match_parens" + "mflua" + "mkjobtexmf" + "optexcount" + "patgen" + "pdfbook2" + "pdfcrop" + "pdfjam" + "pdflatexpicscale" + "pdftex-quiet" + "pdftosrc" + "pdfxup" + "pfarrei" + "pkfix" + "pkfix-helper" + "ppmcheckpdf" + "purifyeps" + "pythontex" + "runtexshebang" + "seetexk" + "spix" + "srcredact" + "sty2dtx" + "synctex" + "tex4ebook" + "texaccents" + "texblend" + "texcount" + "texdef" + "texdiff" + "texdirflatten" + "texdoc" + "texdoctk" + "texfot" + "texlive-scripts-extra" + "texliveonfly" + "texloganalyser" + "texlogfilter" + "texlogsieve" + "texosquery" + "texplate" + "texware" + "tie" + "tlcockpit" + "tpic2pdftex" + "typeoutfileinfo" + "upmendex" + "web" + "xindex" + "xindy" + "xpdfopen" + ]; + sha512.run = "2edd9aa26368452ebbd775da1d6223fa08141a55221594113b184243e05e1c4b841e7984de3df9ed6eff93f24b6391724eb454475cb774b693de6a3f901c8012"; +}; +collection-context = { + revision = 69108; + shortdesc = "ConTeXt and packages"; + stripPrefix = 0; + deps = [ + "collection-basic" + "context" + "context-calendar-examples" + "context-collating-marks" + "context-cyrillicnumbers" + "context-filter" + "context-gnuplot" + "context-handlecsv" + "context-legacy" + "context-letter" + "context-mathsets" + "context-notes-zh-cn" + "context-pocketdiary" + "context-simpleslides" + "context-squares" + "context-sudoku" + "context-texlive" + "context-transliterator" + "context-typescripts" + "context-vim" + "context-visualcounter" + "jmn" + "luajittex" + ]; + sha512.run = "a8426893d3b9cfbddfffa383dc7898f7abe48271695dc6835abb2cda70ca1998d65eda2acd716a13ef4239c8ca8528c92b2c679510d6785ef38bf554b81a6cd6"; +}; +collection-fontsextra = { + revision = 69663; + shortdesc = "Additional fonts"; + stripPrefix = 0; + deps = [ + "aboensis" + "academicons" + "accanthis" + "adforn" + "adfsymbols" + "aesupp" + "alegreya" + "alfaslabone" + "algolrevived" + "allrunes" + "almendra" + "almfixed" + "andika" + "anonymouspro" + "antiqua" + "antt" + "archaic" + "archivo" + "arev" + "arimo" + "arsenal" + "arvo" + "asana-math" + "asapsym" + "ascii-font" + "aspectratio" + "astro" + "atkinson" + "augie" + "auncial-new" + "aurical" + "b1encoding" + "barcodes" + "baskervald" + "baskervaldx" + "baskervillef" + "bbding" + "bbm" + "bbm-macros" + "bbold" + "bbold-type1" + "bboldx" + "belleek" + "bera" + "berenisadf" + "beuron" + "bguq" + "bitter" + "blacklettert1" + "boisik" + "bookhands" + "boondox" + "braille" + "brushscr" + "cabin" + "caladea" + "calligra" + "calligra-type1" + "cantarell" + "carlito" + "carolmin-ps" + "cascadia-code" + "ccicons" + "cfr-initials" + "cfr-lm" + "charissil" + "cherokee" + "chivo" + "cinzel" + "clara" + "clearsans" + "cm-lgc" + "cm-mf-extra-bold" + "cm-unicode" + "cmathbb" + "cmbright" + "cmexb" + "cmll" + "cmpica" + "cmsrb" + "cmtiup" + "cmupint" + "cochineal" + "coelacanth" + "collection-basic" + "comfortaa" + "comicneue" + "concmath-fonts" + "concmath-otf" + "cookingsymbols" + "cooperhewitt" + "cormorantgaramond" + "countriesofeurope" + "courier-scaled" + "courierten" + "crimson" + "crimsonpro" + "cryst" + "cuprum" + "cyklop" + "dancers" + "dantelogo" + "dejavu" + "dejavu-otf" + "dice" + "dictsym" + "dingbat" + "domitian" + "doublestroke" + "doulossil" + "dozenal" + "drm" + "droid" + "dsserif" + "duerer" + "duerer-latex" + "dutchcal" + "ean" + "ebgaramond" + "ebgaramond-maths" + "ecc" + "eco" + "eczar" + "eiad" + "eiad-ltx" + "ektype-tanka" + "electrum" + "elvish" + "epigrafica" + "epsdice" + "erewhon" + "erewhon-math" + "esrelation" + "esstix" + "esvect" + "etbb" + "euler-math" + "eulervm" + "euxm" + "fbb" + "fdsymbol" + "fetamont" + "feyn" + "fge" + "fira" + "firamath" + "firamath-otf" + "foekfont" + "fonetika" + "fontawesome" + "fontawesome5" + "fontmfizz" + "fonts-churchslavonic" + "forum" + "fourier" + "fouriernc" + "frcursive" + "frederika2016" + "frimurer" + "garamond-libre" + "garamond-math" + "gelasio" + "genealogy" + "gentium-tug" + "gfsartemisia" + "gfsbodoni" + "gfscomplutum" + "gfsdidot" + "gfsdidotclassic" + "gfsneohellenic" + "gfsneohellenicmath" + "gfssolomos" + "gillcm" + "gillius" + "gnu-freefont" + "gofonts" + "gothic" + "greenpoint" + "grotesq" + "gudea" + "hacm" + "hamnosys" + "hands" + "hep-font" + "hep-math-font" + "heros-otf" + "heuristica" + "hfbright" + "hfoldsty" + "hindmadurai" + "ibarra" + "ifsym" + "imfellenglish" + "inconsolata" + "inconsolata-nerd-font" + "initials" + "inriafonts" + "inter" + "ipaex-type1" + "iwona" + "jablantile" + "jamtimes" + "josefin" + "junicode" + "junicodevf" + "kixfont" + "kpfonts" + "kpfonts-otf" + "kurier" + "lato" + "lexend" + "lfb" + "libertine" + "libertinegc" + "libertinus" + "libertinus-fonts" + "libertinus-otf" + "libertinus-type1" + "libertinust1math" + "librebaskerville" + "librebodoni" + "librecaslon" + "librefranklin" + "libris" + "lineara" + "linguisticspro" + "lobster2" + "logix" + "lxfonts" + "ly1" + "magra" + "marcellus" + "mathabx" + "mathabx-type1" + "mathdesign" + "mdputu" + "mdsymbol" + "merriweather" + "metsymb" + "miama" + "mintspirit" + "missaali" + "mlmodern" + "mnsymbol" + "montserrat" + "mpfonts" + "mweights" + "newcomputermodern" + "newpx" + "newtx" + "newtxsf" + "newtxtt" + "niceframe-type1" + "nimbus15" + "nkarta" + "noto" + "noto-emoji" + "notomath" + "nunito" + "obnov" + "ocherokee" + "ocr-b" + "ocr-b-outline" + "ogham" + "oinuit" + "old-arrows" + "oldlatin" + "oldstandard" + "opensans" + "orkhun" + "oswald" + "overlock" + "pacioli" + "pagella-otf" + "paratype" + "phaistos" + "phonetic" + "pigpen" + "playfair" + "plex" + "plex-otf" + "plimsoll" + "poiretone" + "poltawski" + "prodint" + "punk" + "punk-latex" + "punknova" + "pxtxalfa" + "qualitype" + "quattrocento" + "raleway" + "recycle" + "rit-fonts" + "roboto" + "romande" + "rosario" + "rsfso" + "sansmathaccent" + "sansmathfonts" + "sauter" + "sauterfonts" + "schola-otf" + "scholax" + "schulschriften" + "semaphor" + "shobhika" + "simpleicons" + "skull" + "sourcecodepro" + "sourcesanspro" + "sourceserifpro" + "spectral" + "srbtiks" + "starfont" + "staves" + "step" + "stepgreek" + "stickstoo" + "stix" + "stix2-otf" + "stix2-type1" + "superiors" + "svrsymbols" + "symbats3" + "tapir" + "tempora" + "tengwarscript" + "termes-otf" + "tfrupee" + "theanodidot" + "theanomodern" + "theanooldstyle" + "tinos" + "tpslifonts" + "trajan" + "twemoji-colr" + "txfontsb" + "txuprcal" + "typicons" + "umtypewriter" + "universa" + "universalis" + "uppunctlm" + "urwchancal" + "venturisadf" + "wsuipa" + "xcharter" + "xcharter-math" + "xits" + "yfonts" + "yfonts-otf" + "yfonts-t1" + "yinit-otf" + "ysabeau" + "zlmtt" + ]; + sha512.run = "307728e63dab6f629ac955def8049a9c513fed366ebbf6896bfe21adbe3379941a85ac01dce0647393801ed1d6e4a95d6831e476d4d9805e815ba197f006b99b"; +}; +collection-fontsrecommended = { + revision = 54074; + shortdesc = "Recommended fonts"; + stripPrefix = 0; + deps = [ + "avantgar" + "bookman" + "charter" + "cm-super" + "cmextra" + "collection-basic" + "courier" + "euro" + "euro-ce" + "eurosym" + "fpl" + "helvetic" + "lm" + "lm-math" + "manfnt-font" + "marvosym" + "mathpazo" + "mflogo-font" + "ncntrsbk" + "palatino" + "pxfonts" + "rsfs" + "symbol" + "tex-gyre" + "tex-gyre-math" + "times" + "tipa" + "txfonts" + "utopia" + "wasy" + "wasy-type1" + "wasysym" + "zapfchan" + "zapfding" + ]; + sha512.run = "eaa6e54780a0813a88102258ee3bd7a4640787be0b89eff4ba2c9cc19298bf3e2799ffab4e03e49f20131d07fbac9f601a7223fc1b47257dd0feeb04797c56a8"; +}; +collection-fontutils = { + revision = 61207; + shortdesc = "Graphics and font utilities"; + stripPrefix = 0; + deps = [ + "accfonts" + "afm2pl" + "albatross" + "collection-basic" + "dosepsbin" + "dvipsconfig" + "epstopdf" + "fontinst" + "fontools" + "fontware" + "lcdftypetools" + "luafindfont" + "metatype1" + "mf2pt1" + "ps2eps" + "ps2pk" + "psutils" + "t1utils" + "ttfutils" + ]; + sha512.run = "430c95b7e104cb837b7424ebb17ab7ee1aefd99d70aaceefff8a1924fa949329aebe0d5a28b939fabf28d3c5dfc2dcb466147e1396514d5dcf4f64af231db8a7"; +}; +collection-formatsextra = { + revision = 62226; + shortdesc = "Additional formats"; + stripPrefix = 0; + deps = [ + "aleph" + "antomega" + "collection-basic" + "collection-latex" + "edmac" + "eplain" + "hitex" + "jadetex" + "lambda" + "lollipop" + "mltex" + "mxedruli" + "omega" + "omegaware" + "otibet" + "passivetex" + "psizzl" + "startex" + "texsis" + "xmltex" + "xmltexconfig" + ]; + sha512.run = "6c7f0a1829789edea6a42d45f13f482abc0aa1ecc66b0ba4b70197efff349df75c9a89a98f21537cf6f3751b608fc3ee10ac842613deaf2aa21005374a23bab2"; +}; +collection-games = { + revision = 70179; + shortdesc = "Games typesetting"; + stripPrefix = 0; + deps = [ + "bartel-chess-fonts" + "chess" + "chess-problem-diagrams" + "chessboard" + "chessfss" + "chinesechess" + "collection-latex" + "crossword" + "crosswrd" + "customdice" + "egameps" + "gamebook" + "gamebooklib" + "go" + "hanoi" + "havannah" + "hexboard" + "hexgame" + "hmtrump" + "horoscop" + "jeuxcartes" + "jigsaw" + "labyrinth" + "logicpuzzle" + "mahjong" + "maze" + "musikui" + "nimsticks" + "onedown" + "othello" + "othelloboard" + "pas-crosswords" + "playcards" + "psgo" + "quizztex" + "realtranspose" + "reverxii" + "rouequestions" + "rubik" + "schwalbe-chess" + "scrabble" + "sgame" + "skak" + "skaknew" + "soup" + "sudoku" + "sudokubundle" + "tangramtikz" + "thematicpuzzle" + "trivialpursuit" + "twoxtwogame" + "wargame" + "weiqi" + "wordle" + "xq" + "xskak" + ]; + sha512.run = "005e7e6ea5401369c09bdbb94a1bf6a2f8f35223d5a10ffee524481bfe4033c544aea2142a8af721ea62f6f0d37db84874c3214c857003b82a8ee2c191d0cb5c"; +}; +collection-humanities = { + revision = 68465; + shortdesc = "Humanities packages"; + stripPrefix = 0; + deps = [ + "adtrees" + "bibleref" + "bibleref-lds" + "bibleref-mouth" + "bibleref-parse" + "collection-latex" + "covington" + "diadia" + "dramatist" + "dvgloss" + "ecltree" + "edfnotes" + "eledform" + "eledmac" + "expex" + "expex-glossonly" + "gb4e" + "gmverse" + "jura" + "juraabbrev" + "juramisc" + "jurarsp" + "langnames" + "ledmac" + "lexikon" + "lexref" + "ling-macros" + "linguex" + "liturg" + "metrix" + "nnext" + "opbible" + "parallel" + "parrun" + "phonrule" + "plari" + "play" + "poemscol" + "poetry" + "poetrytex" + "qobitree" + "qtree" + "reledmac" + "rrgtrees" + "rtklage" + "screenplay" + "screenplay-pkg" + "sides" + "stage" + "textglos" + "thalie" + "theatre" + "tree-dvips" + "verse" + "xyling" + ]; + sha512.run = "33b19b29b31671c148900d207f1f9947be502ab215e901afa9c5fe5264bafd004717dc8f6438d1a4b40abfa63c0b94725738b8c8bc117e293676f3db1e25ba6a"; +}; +collection-langarabic = { + revision = 69111; + shortdesc = "Arabic"; + stripPrefix = 0; + deps = [ + "alkalami" + "alpha-persian" + "amiri" + "arabi" + "arabi-add" + "arabic-book" + "arabluatex" + "arabtex" + "bidi" + "bidihl" + "collection-basic" + "dad" + "ghab" + "hvarabic" + "hyphen-arabic" + "hyphen-farsi" + "imsproc" + "iran-bibtex" + "khatalmaqala" + "kurdishlipsum" + "lshort-persian" + "luabidi" + "na-box" + "parsimatn" + "parsinevis" + "persian-bib" + "quran" + "sexam" + "simurgh" + "texnegar" + "tram" + "xepersian" + "xepersian-hm" + "xindy-persian" + ]; + sha512.run = "8cef2ee028669abcc0e964ba01f6287f52c4e2857fa7547036ea00bfa47d83d38c9c126705ba7989cfbc027586315284139ec6131c5ea7701136f1bfd7cdc2cf"; +}; +collection-langchinese = { + revision = 63995; + shortdesc = "Chinese"; + stripPrefix = 0; + deps = [ + "arphic" + "arphic-ttf" + "asymptote-by-example-zh-cn" + "asymptote-faq-zh-cn" + "asymptote-manual-zh-cn" + "cns" + "collection-langcjk" + "ctex" + "ctex-faq" + "exam-zh" + "fandol" + "fduthesis" + "hanzibox" + "hyphen-chinese" + "impatient-cn" + "install-latex-guide-zh-cn" + "latex-notes-zh-cn" + "lshort-chinese" + "nanicolle" + "njurepo" + "pgfornament-han" + "qyxf-book" + "texlive-zh-cn" + "texproposal" + "tlmgr-intro-zh-cn" + "upzhkinsoku" + "xpinyin" + "xtuthesis" + "zhlineskip" + "zhlipsum" + "zhmetrics" + "zhmetrics-uptex" + "zhnumber" + "zhspacing" + ]; + sha512.run = "d10096b2d83dc0378361184a64c347918e75dd51f48d962893371534c375dd8880e8febb1aaf1207e5ce04e59860f629f10c99bbf6304239e1147a5072194137"; +}; +collection-langcjk = { + revision = 65824; + shortdesc = "Chinese/Japanese/Korean (base)"; + stripPrefix = 0; + deps = [ + "adobemapping" + "c90" + "cjk" + "cjk-gs-integrate" + "cjkpunct" + "cjkutils" + "collection-basic" + "dnp" + "evangelion-jfm" + "fixjfm" + "garuda-c90" + "jfmutil" + "norasi-c90" + "pxtatescale" + "xcjk2uni" + "xecjk" + "zitie" + "zxjafont" + ]; + sha512.run = "bee71f9df25db567c0930659e5037d1b6144d5c157e0870e9144f82c6dddbd9df156e580583c65f1bf5f54a70c9fcab108bd117e74af0e28d72a33f6b78207d1"; +}; +collection-langcyrillic = { + revision = 69727; + shortdesc = "Cyrillic"; + stripPrefix = 0; + deps = [ + "babel-belarusian" + "babel-bulgarian" + "babel-russian" + "babel-serbian" + "babel-serbianc" + "babel-ukrainian" + "churchslavonic" + "cmcyr" + "collection-basic" + "collection-latex" + "cyrillic" + "cyrillic-bin" + "cyrplain" + "disser" + "eskd" + "eskdx" + "gost" + "hyphen-belarusian" + "hyphen-bulgarian" + "hyphen-churchslavonic" + "hyphen-mongolian" + "hyphen-russian" + "hyphen-serbian" + "hyphen-ukrainian" + "lcyw" + "lh" + "lhcyr" + "lshort-bulgarian" + "lshort-mongol" + "lshort-russian" + "lshort-ukr" + "mnhyphn" + "mongolian-babel" + "montex" + "mpman-ru" + "numnameru" + "pst-eucl-translation-bg" + "ruhyphen" + "russ" + "serbian-apostrophe" + "serbian-date-lat" + "serbian-def-cyr" + "serbian-lig" + "t2" + "texlive-ru" + "texlive-sr" + "ukrhyph" + "xecyrmongolian" + ]; + sha512.run = "d20f02886419a9c65b665fec5a65aaf232a2ae51ccccd159b611278887d0349bbc2e66b7f2f5ade9b79b918cc6a4cae30268b3472ef3d5441e8922b9c28a1413"; +}; +collection-langczechslovak = { + revision = 54074; + shortdesc = "Czech/Slovak"; + stripPrefix = 0; + deps = [ + "babel-czech" + "babel-slovak" + "cnbwp" + "collection-basic" + "collection-latex" + "cs" + "csbulletin" + "cslatex" + "csplain" + "cstex" + "hyphen-czech" + "hyphen-slovak" + "lshort-czech" + "lshort-slovak" + "texlive-cz" + "vlna" + ]; + sha512.run = "719c321173ca12660891080dae509080934f72d13a9417b2c40a22add963c7c5a1ee95d3b306f0d6c26b0db97d69979c27fbb15d1690849aa03b06d4b0193a67"; +}; +collection-langenglish = { + revision = 68790; + shortdesc = "US and UK English"; + stripPrefix = 0; + deps = [ + "amiweb2c-guide" + "amscls-doc" + "amslatex-primer" + "around-the-bend" + "ascii-chart" + "biblatex-cheatsheet" + "collection-basic" + "components" + "comprehensive" + "dickimaw" + "docsurvey" + "drawing-with-metapost" + "dtxtut" + "first-latex-doc" + "fontinstallationguide" + "forest-quickstart" + "gentle" + "guide-to-latex" + "happy4th" + "hyphen-english" + "impatient" + "intro-scientific" + "knuth-errata" + "knuth-hint" + "knuth-pdf" + "l2tabu-english" + "latex-brochure" + "latex-course" + "latex-doc-ptr" + "latex-for-undergraduates" + "latex-graphics-companion" + "latex-refsheet" + "latex-veryshortguide" + "latex-web-companion" + "latex2e-help-texinfo" + "latex4wp" + "latexcheat" + "latexcourse-rug" + "latexfileinfo-pkgs" + "lshort-english" + "macros2e" + "math-into-latex-4" + "maths-symbols" + "memdesign" + "memoirchapterstyles" + "metafont-beginners" + "metapost-examples" + "patgen2-tutorial" + "pictexsum" + "plain-doc" + "quran-en" + "short-math-guide" + "simplified-latex" + "svg-inkscape" + "tamethebeast" + "tds" + "tex-font-errors-cheatsheet" + "tex-nutshell" + "tex-overview" + "tex-refs" + "tex-vpat" + "texbytopic" + "texonly" + "titlepages" + "tlc2" + "tlc3-examples" + "tlmgrbasics" + "undergradmath" + "visualfaq" + "webguide" + "xetexref" + "yet-another-guide-latex2e" + ]; + sha512.run = "49f20b883df99755070b68d3eacb29c297e76a05b3151d632c26fcf2864d996e4873bbab27429db915f93995923d5b7e680a3c901b28cac888ffa021bc629b74"; +}; +collection-langeuropean = { + revision = 66432; + shortdesc = "Other European languages"; + stripPrefix = 0; + deps = [ + "armtex" + "babel-albanian" + "babel-bosnian" + "babel-breton" + "babel-croatian" + "babel-danish" + "babel-dutch" + "babel-estonian" + "babel-finnish" + "babel-friulan" + "babel-hungarian" + "babel-icelandic" + "babel-irish" + "babel-kurmanji" + "babel-latin" + "babel-latvian" + "babel-lithuanian" + "babel-macedonian" + "babel-norsk" + "babel-occitan" + "babel-piedmontese" + "babel-romanian" + "babel-romansh" + "babel-samin" + "babel-scottish" + "babel-slovenian" + "babel-swedish" + "babel-turkish" + "babel-welsh" + "collection-basic" + "finbib" + "gloss-occitan" + "hrlatex" + "huaz" + "hulipsum" + "hyphen-croatian" + "hyphen-danish" + "hyphen-dutch" + "hyphen-estonian" + "hyphen-finnish" + "hyphen-friulan" + "hyphen-hungarian" + "hyphen-icelandic" + "hyphen-irish" + "hyphen-kurmanji" + "hyphen-latin" + "hyphen-latvian" + "hyphen-lithuanian" + "hyphen-macedonian" + "hyphen-norwegian" + "hyphen-occitan" + "hyphen-piedmontese" + "hyphen-romanian" + "hyphen-romansh" + "hyphen-slovenian" + "hyphen-swedish" + "hyphen-turkish" + "hyphen-uppersorbian" + "hyphen-welsh" + "kaytannollista-latexia" + "lithuanian" + "lshort-dutch" + "lshort-estonian" + "lshort-finnish" + "lshort-slovenian" + "lshort-turkish" + "nevelok" + "rojud" + "swebib" + "turkmen" + ]; + sha512.run = "5fa87f174fc372c21b80ebe6b097525218da63892bc8445a29c24f2bfb015b0f04c100467f85e6c9e16a27ad26e31f00832d7712ebea7dec8631a730a95a9759"; +}; +collection-langfrench = { + revision = 67951; + shortdesc = "French"; + stripPrefix = 0; + deps = [ + "aeguill" + "annee-scolaire" + "apprendre-a-programmer-en-tex" + "apprends-latex" + "babel-basque" + "babel-french" + "basque-book" + "basque-date" + "bib-fr" + "bibleref-french" + "booktabs-fr" + "cahierprof" + "collection-basic" + "couleurs-fr" + "droit-fr" + "e-french" + "epslatex-fr" + "expose-expl3-dunkerque-2019" + "facture" + "formation-latex-ul" + "frenchmath" + "frletter" + "frpseudocode" + "hyphen-basque" + "hyphen-french" + "impatient-fr" + "impnattypo" + "l2tabu-french" + "latex2e-help-texinfo-fr" + "letgut" + "lshort-french" + "mafr" + "matapli" + "panneauxroute" + "profcollege" + "proflabo" + "proflycee" + "profsio" + "tabvar" + "tdsfrmath" + "texlive-fr" + "translation-array-fr" + "translation-dcolumn-fr" + "translation-natbib-fr" + "translation-tabbing-fr" + "variations" + "visualfaq-fr" + "visualtikz" + ]; + sha512.run = "83be4aa190b32580ab6334a00785123be5678a95f84589dea2ccc2ce77a6328bf8954f28e683a9614b43a062901a28b3f6b060bd968876094aeab5b1f9aee816"; +}; +collection-langgerman = { + revision = 68711; + shortdesc = "German"; + stripPrefix = 0; + deps = [ + "apalike-german" + "autotype" + "babel-german" + "bibleref-german" + "booktabs-de" + "collection-basic" + "csquotes-de" + "dehyph" + "dehyph-exptl" + "dhua" + "dtk-bibliography" + "etdipa" + "etoolbox-de" + "fifinddo-info" + "german" + "germbib" + "germkorr" + "hausarbeit-jura" + "hyphen-german" + "koma-script-examples" + "l2picfaq" + "l2tabu" + "latexcheat-de" + "lshort-german" + "lualatex-doc-de" + "microtype-de" + "milog" + "quran-de" + "r_und_s" + "schulmathematik" + "templates-fenn" + "templates-sommer" + "termcal-de" + "texlive-de" + "tipa-de" + "translation-arsclassica-de" + "translation-biblatex-de" + "translation-chemsym-de" + "translation-ecv-de" + "translation-enumitem-de" + "translation-europecv-de" + "translation-filecontents-de" + "translation-moreverb-de" + "udesoftec" + "uhrzeit" + "umlaute" + "voss-mathcol" + ]; + sha512.run = "3b52fac1e2520302998c3b11bc2f77b34d5bd4cc09f4fa4b9238ece66b0e36e676643f7476846d1b25eb64d31b0dbe87a33ad44669be101f61cf223e70ecb047"; +}; +collection-langgreek = { + revision = 65038; + shortdesc = "Greek"; + stripPrefix = 0; + deps = [ + "babel-greek" + "begingreek" + "betababel" + "cbfonts" + "cbfonts-fd" + "collection-basic" + "gfsbaskerville" + "gfsporson" + "greek-fontenc" + "greek-inputenc" + "greekdates" + "greektex" + "greektonoi" + "hyphen-ancientgreek" + "hyphen-greek" + "ibycus-babel" + "ibygrk" + "kerkis" + "levy" + "lgreek" + "lgrmath" + "mkgrkindex" + "talos" + "teubner" + "xgreek" + "yannisgr" + ]; + sha512.run = "800991b6bb8ac7772ad030ad665b812abd9b294498f7b7678be721ccc87d54607e267bd189a0591ebead2c6ecb64047e5b5581c374f067c3b1575b6d442cc6c9"; +}; +collection-langitalian = { + revision = 55129; + shortdesc = "Italian"; + stripPrefix = 0; + deps = [ + "amsldoc-it" + "amsmath-it" + "amsthdoc-it" + "antanilipsum" + "babel-italian" + "codicefiscaleitaliano" + "collection-basic" + "fancyhdr-it" + "fixltxhyph" + "frontespizio" + "hyphen-italian" + "itnumpar" + "l2tabu-italian" + "latex4wp-it" + "layaureo" + "lshort-italian" + "psfrag-italian" + "texlive-it" + "verifica" + ]; + sha512.run = "6ec5e8a62e3c1ed8e3c23542381091d38c77af507af7088a55e44f1e34b85d01ec19342db4541d9d6cd712c0929d54a3fc663e1d8fde3c53fef0d6fc43be4994"; +}; +collection-langjapanese = { + revision = 69967; + shortdesc = "Japanese"; + stripPrefix = 0; + deps = [ + "ascmac" + "asternote" + "babel-japanese" + "bxbase" + "bxcjkjatype" + "bxghost" + "bxjaholiday" + "bxjalipsum" + "bxjaprnind" + "bxjatoucs" + "bxjscls" + "bxorigcapt" + "bxwareki" + "collection-langcjk" + "convbkmk" + "endnotesj" + "gckanbun" + "gentombow" + "haranoaji" + "haranoaji-extra" + "ieejtran" + "ifptex" + "ifxptex" + "ipaex" + "japanese-mathformulas" + "japanese-otf" + "jieeetran" + "jlreq" + "jlreq-deluxe" + "jpneduenumerate" + "jpnedumathsymbols" + "jsclasses" + "kanbun" + "lshort-japanese" + "luatexja" + "mendex-doc" + "morisawa" + "pbibtex-base" + "pbibtex-manual" + "platex" + "platex-tools" + "platexcheat" + "plautopatch" + "ptex" + "ptex-base" + "ptex-fontmaps" + "ptex-fonts" + "ptex-manual" + "ptex2pdf" + "pxbase" + "pxchfon" + "pxcjkcat" + "pxjahyper" + "pxjodel" + "pxrubrica" + "pxufont" + "sjtutex" + "texlive-ja" + "uplatex" + "uptex" + "uptex-base" + "uptex-fonts" + "wadalab" + "zxjafbfont" + "zxjatype" + ]; + sha512.run = "18296a73452e8d346ba10b8241adfdb6b0a258dd443517a566e415f418e7c158c6d179f20c5818a36fcb12bce816571c0d317120f033ca1f20c5acfcfa00074d"; +}; +collection-langkorean = { + revision = 54074; + shortdesc = "Korean"; + stripPrefix = 0; + deps = [ + "baekmuk" + "cjk-ko" + "collection-langcjk" + "kotex-oblivoir" + "kotex-plain" + "kotex-utf" + "kotex-utils" + "lshort-korean" + "nanumtype1" + "pmhanguljamo" + "uhc" + "unfonts-core" + "unfonts-extra" + ]; + sha512.run = "2d93df728d34137c8f9a884aa2871a2980e806672006f2c5f0c5f79412d5789c6f94958363cfc9a78b5a97a7d76bbb6cb157b2cb2a8a283f7afdfd838fa24883"; +}; +collection-langother = { + revision = 68719; + shortdesc = "Other languages"; + stripPrefix = 0; + deps = [ + "aalok" + "akshar" + "amsldoc-vn" + "aramaic-serto" + "babel-azerbaijani" + "babel-esperanto" + "babel-georgian" + "babel-hebrew" + "babel-indonesian" + "babel-interlingua" + "babel-malay" + "babel-sorbian" + "babel-thai" + "babel-vietnamese" + "bangla" + "bangtex" + "bengali" + "burmese" + "chhaya" + "cjhebrew" + "collection-basic" + "ctib" + "culmus" + "ebong" + "ethiop" + "ethiop-t1" + "fc" + "fonts-tlwg" + "hebrew-fonts" + "hindawi-latex-template" + "hyphen-afrikaans" + "hyphen-armenian" + "hyphen-coptic" + "hyphen-esperanto" + "hyphen-ethiopic" + "hyphen-georgian" + "hyphen-indic" + "hyphen-indonesian" + "hyphen-interlingua" + "hyphen-sanskrit" + "hyphen-thai" + "hyphen-turkmen" + "latex-mr" + "latexbangla" + "latino-sine-flexione" + "lshort-thai" + "lshort-vietnamese" + "marathi" + "ntheorem-vn" + "padauk" + "quran-bn" + "quran-id" + "quran-ur" + "sanskrit" + "sanskrit-t1" + "thaienum" + "thaispec" + "unicode-alphabets" + "velthuis" + "vntex" + "wnri" + "wnri-latex" + "xetex-devanagari" + ]; + sha512.run = "312be65445c4b862e50fcf4bb8d4413b233eadee8a9ca14ff3cb4eb37549314f37a5d00d22a4b3b2cd461b3b0473a7426a5e7f33ffbaf6dfc0687f1af754cae1"; +}; +collection-langpolish = { + revision = 54074; + shortdesc = "Polish"; + stripPrefix = 0; + deps = [ + "babel-polish" + "bredzenie" + "cc-pl" + "collection-basic" + "collection-latex" + "gustlib" + "gustprog" + "hyphen-polish" + "lshort-polish" + "mex" + "mwcls" + "pl" + "polski" + "przechlewski-book" + "qpxqtx" + "tap" + "tex-virtual-academy-pl" + "texlive-pl" + "utf8mex" + ]; + sha512.run = "fc0d08f70aeb83869109290e6d1585d513097dcd4e17791752ecd3d26ac202838afb5931f78ceaeeaf72c63b18fe9183edd650c075d03188f24cb2caded178de"; +}; +collection-langportuguese = { + revision = 67125; + shortdesc = "Portuguese"; + stripPrefix = 0; + deps = [ + "babel-portuges" + "beamer-tut-pt" + "collection-basic" + "cursolatex" + "feupphdteses" + "hyphen-portuguese" + "latex-via-exemplos" + "latexcheat-ptbr" + "lshort-portuguese" + "numberpt" + "ordinalpt" + "ptlatexcommands" + "xypic-tut-pt" + ]; + sha512.run = "554f7d7e4828e1122cf3bc6b24c67661046ce2ae646975054f6903f8c2dfd3e63131ada963cd3b5a1ca3128539f039b4d275b9c8caadde1dbe9118d583d47585"; +}; +collection-langspanish = { + revision = 67307; + shortdesc = "Spanish"; + stripPrefix = 0; + deps = [ + "antique-spanish-units" + "babel-catalan" + "babel-galician" + "babel-spanish" + "collection-basic" + "es-tex-faq" + "hyphen-catalan" + "hyphen-galician" + "hyphen-spanish" + "l2tabu-spanish" + "latex2e-help-texinfo-spanish" + "latexcheat-esmx" + "lshort-spanish" + "texlive-es" + ]; + sha512.run = "1f3c1cc4d1e28871085092314a58671a2acab47da0a758c0bdff569b0a80697ac3c32e9991a8f77268f86c02e51420e4d999a9eef72a2a7353a3efbc633e25a9"; +}; +collection-latex = { + revision = 69131; + shortdesc = "LaTeX fundamental packages"; + stripPrefix = 0; + deps = [ + "ae" + "amscls" + "amsmath" + "atbegshi" + "atveryend" + "auxhook" + "babel" + "babel-english" + "babelbib" + "bigintcalc" + "bitset" + "bookmark" + "carlisle" + "collection-basic" + "colortbl" + "epstopdf-pkg" + "etexcmds" + "fancyhdr" + "firstaid" + "fix2col" + "geometry" + "gettitlestring" + "graphics" + "graphics-cfg" + "grfext" + "hopatch" + "hycolor" + "hyperref" + "intcalc" + "kvdefinekeys" + "kvoptions" + "kvsetkeys" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-bin" + "latex-fonts" + "latex-lab" + "latexconfig" + "letltxmacro" + "ltxcmds" + "ltxmisc" + "mfnfss" + "mptopdf" + "natbib" + "oberdiek" + "pagesel" + "pdfescape" + "pdftexcmds" + "pslatex" + "psnfss" + "pspicture" + "refcount" + "rerunfilecheck" + "stringenc" + "tools" + "uniquecounter" + "url" + ]; + sha512.run = "889eae40b82f31c7c4b3a17740399c763dabec7986fcb39261b252afff69a03a16e660b114e358cd72e3fafa14a158849cf03aa2ad4d73a5bee4ca9abc4c24af"; +}; +collection-latexextra = { + revision = 70534; + shortdesc = "LaTeX additional packages"; + stripPrefix = 0; + deps = [ + "2up" + "a0poster" + "a4wide" + "a5comb" + "abraces" + "abspos" + "abstract" + "accessibility" + "accsupp" + "achemso" + "acro" + "acronym" + "acroterm" + "actuarialangle" + "actuarialsymbol" + "addfont" + "addlines" + "adjmulticol" + "adjustbox" + "adrconv" + "advdate" + "affilauthor" + "akktex" + "akletter" + "alchemist" + "alertmessage" + "alnumsec" + "alphalph" + "alterqcm" + "altfont" + "altsubsup" + "amsaddr" + "animate" + "anonchap" + "answers" + "anyfontsize" + "appendix" + "appendixnumberbeamer" + "apptools" + "arabicfront" + "arcs" + "argumentation" + "arraycols" + "arrayjobx" + "arraysort" + "arydshln" + "asciilist" + "askinclude" + "assignment" + "assoccnt" + "association-matrix" + "atenddvi" + "atendofenv" + "attachfile" + "aurl" + "authoraftertitle" + "authorarchive" + "authorindex" + "autofancyhdr" + "autonum" + "autopdf" + "autopuncitems" + "avremu" + "awesomebox" + "axessibility" + "background" + "bankstatement" + "bashful" + "basicarith" + "bchart" + "beamer-rl" + "beamer2thesis" + "beamerappendixnote" + "beameraudience" + "beamerauxtheme" + "beamercolorthemeowl" + "beamerdarkthemes" + "beamerposter" + "beamersubframe" + "beamertheme-arguelles" + "beamertheme-cuerna" + "beamertheme-detlevcm" + "beamertheme-epyt" + "beamertheme-focus" + "beamertheme-light" + "beamertheme-metropolis" + "beamertheme-npbt" + "beamertheme-phnompenh" + "beamertheme-pure-minimalistic" + "beamertheme-rainbow" + "beamertheme-saintpetersburg" + "beamertheme-simpledarkblue" + "beamertheme-simpleplus" + "beamertheme-tcolorbox" + "beamertheme-trigon" + "beamertheme-upenn-bc" + "beamerthemeamurmaple" + "beamerthemeconcrete" + "beamerthemejltree" + "beamerthemelalic" + "beamerthemenirma" + "beamerthemenord" + "bearwear" + "beaulivre" + "beautybook" + "beautynote" + "beton" + "bewerbung" + "bez123" + "bhcexam" + "bibletext" + "bigfoot" + "bigints" + "bilingualpages" + "biochemistry-colors" + "bithesis" + "bizcard" + "blindtext" + "blkarray" + "block" + "blowup" + "bnumexpr" + "boites" + "bold-extra" + "book-of-common-prayer" + "bookcover" + "bookest" + "booklet" + "bookshelf" + "boolexpr" + "bophook" + "boxedminipage" + "boxhandler" + "bracketkey" + "braket" + "breakurl" + "bubblesort" + "bullcntr" + "bxcalc" + "bxdpx-beamer" + "bxdvidriver" + "bxenclose" + "bxnewfont" + "bxpapersize" + "bxpdfver" + "bxtexlogo" + "calcage" + "calctab" + "calculator" + "calrsfs" + "cals" + "calxxxx-yyyy" + "cancel" + "canoniclayout" + "capt-of" + "captcont" + "captdef" + "carbohydrates" + "cases" + "casyl" + "catchfile" + "catchfilebetweentags" + "catechis" + "catoptions" + "cbcoptic" + "ccaption" + "cclicenses" + "cd" + "cd-cover" + "cdcmd" + "cdpbundl" + "cellprops" + "cellspace" + "censor" + "centeredline" + "centerlastline" + "changebar" + "changelayout" + "changelog" + "changepage" + "changes" + "chappg" + "chapterfolder" + "cheatsheet" + "checkend" + "chet" + "chextras" + "childdoc" + "chkfloat" + "chletter" + "chngcntr" + "chronology" + "circ" + "circledsteps" + "circledtext" + "classics" + "classpack" + "clefval" + "cleveref" + "cleveref-forward" + "cleveref-usedon" + "clicks" + "clipboard" + "clistmap" + "clock" + "clrdblpg" + "clrstrip" + "cmdstring" + "cmdtrack" + "cmsd" + "cnltx" + "cntformats" + "cntperchap" + "codebox" + "codedescribe" + "codedoc" + "codehigh" + "codepage" + "codesection" + "collcell" + "collectbox" + "collection-latexrecommended" + "collection-pictures" + "colophon" + "color-edits" + "colordoc" + "colorframed" + "colorinfo" + "coloring" + "colorist" + "colorspace" + "colortab" + "colorwav" + "colorweb" + "colourchange" + "combelow" + "combine" + "comma" + "commado" + "commedit" + "comment" + "commonunicode" + "competences" + "concepts" + "concprog" + "conditext" + "constants" + "continue" + "contour" + "contracard" + "conv-xkv" + "cooking" + "cooking-units" + "cool" + "coolfn" + "coollist" + "coolstr" + "coolthms" + "cooltooltips" + "coop-writing" + "coordsys" + "copyedit" + "copyrightbox" + "coseoul" + "counterz" + "counttexruns" + "courseoutline" + "coursepaper" + "coverpage" + "cprotect" + "cprotectinside" + "crbox" + "create-theorem" + "creationboites" + "crefthe" + "crossreference" + "crossreftools" + "crumbs" + "csquotes" + "css-colors" + "csvmerge" + "csvsimple" + "cuisine" + "currency" + "currfile" + "curriculum-vitae" + "currvita" + "customenvs" + "cutwin" + "cv" + "cv4tw" + "cweb-latex" + "cyber" + "cybercic" + "darkmode" + "dashbox" + "dashrule" + "dashundergaps" + "dataref" + "datatool" + "datax" + "dateiliste" + "datenumber" + "datestamp" + "datetime" + "datetime2" + "datetime2-bahasai" + "datetime2-basque" + "datetime2-breton" + "datetime2-bulgarian" + "datetime2-catalan" + "datetime2-croatian" + "datetime2-czech" + "datetime2-danish" + "datetime2-dutch" + "datetime2-en-fulltext" + "datetime2-english" + "datetime2-esperanto" + "datetime2-estonian" + "datetime2-finnish" + "datetime2-french" + "datetime2-galician" + "datetime2-german" + "datetime2-greek" + "datetime2-hebrew" + "datetime2-icelandic" + "datetime2-irish" + "datetime2-it-fulltext" + "datetime2-italian" + "datetime2-latin" + "datetime2-lsorbian" + "datetime2-magyar" + "datetime2-norsk" + "datetime2-polish" + "datetime2-portuges" + "datetime2-romanian" + "datetime2-russian" + "datetime2-samin" + "datetime2-scottish" + "datetime2-serbian" + "datetime2-slovak" + "datetime2-slovene" + "datetime2-spanish" + "datetime2-swedish" + "datetime2-turkish" + "datetime2-ukrainian" + "datetime2-usorbian" + "datetime2-welsh" + "dblfloatfix" + "dbshow" + "debate" + "decimal" + "decimalcomma" + "decorule" + "defoldfonts" + "delimtxt" + "democodetools" + "denisbdoc" + "diabetes-logbook" + "diagbox" + "diagnose" + "dialogl" + "dichokey" + "didec" + "dimnum" + "dinbrief" + "directory" + "dirtytalk" + "dlfltxb" + "dnaseq" + "doclicense" + "docmfp" + "docmute" + "docshots" + "doctools" + "documentation" + "docutils" + "doi" + "dotarrow" + "dotlessi" + "dotseqn" + "download" + "dox" + "dpfloat" + "dprogress" + "drac" + "draftcopy" + "draftfigure" + "draftwatermark" + "dtk" + "dtxdescribe" + "dtxgallery" + "ducksay" + "duckuments" + "dvdcoll" + "dynamicnumber" + "dynblocks" + "ean13isbn" + "easy" + "easy-todo" + "easybook" + "easyfig" + "easyfloats" + "easyformat" + "easylist" + "easyreview" + "ebezier" + "ecclesiastic" + "econlipsum" + "ecv" + "ed" + "edichokey" + "edmargin" + "eemeir" + "efbox" + "egplot" + "ehhline" + "einfart" + "elements" + "ellipsis" + "elmath" + "elocalloc" + "elpres" + "elzcards" + "emarks" + "embedall" + "embedfile" + "embrac" + "emo" + "emotion" + "emptypage" + "emulateapj" + "endfloat" + "endheads" + "endnotes" + "endnotes-hy" + "engpron" + "engrec" + "enotez" + "enumitem" + "enumitem-zref" + "envbig" + "environ" + "envlab" + "epigraph" + "epigraph-keys" + "epiolmec" + "eq-pin2corr" + "eqell" + "eqlist" + "eqnalign" + "eqname" + "eqparbox" + "errata" + "erw-l3" + "esami" + "esdiff" + "esieecv" + "esindex" + "esint" + "esint-type1" + "etaremune" + "etextools" + "etl" + "etoc" + "eukdate" + "eulerpx" + "europasscv" + "europecv" + "everyhook" + "everypage" + "exam" + "exam-lite" + "exam-n" + "exam-randomizechoices" + "examdesign" + "example" + "examplep" + "examz" + "exceltex" + "excludeonly" + "exercise" + "exercisebank" + "exercisepoints" + "exercises" + "exesheet" + "exframe" + "exp-testopt" + "expdlist" + "export" + "exsheets" + "exsol" + "extract" + "facsimile" + "factura" + "fail-fast" + "familytree" + "fancyhandout" + "fancylabel" + "fancynum" + "fancypar" + "fancyqr" + "fancyslides" + "fancytabs" + "fancytooltips" + "fbox" + "fcolumn" + "fetchcls" + "fewerfloatpages" + "ffcode" + "ffslides" + "fgruler" + "fifo-stack" + "figsize" + "filecontents" + "filecontentsdef" + "filedate" + "fileinfo" + "filemod" + "fink" + "finstrut" + "fistrum" + "fithesis" + "fixcmex" + "fixfoot" + "fixme" + "fixmetodonotes" + "fjodor" + "flabels" + "flacards" + "flagderiv" + "flashcards" + "flashmovie" + "flexipage" + "flipbook" + "flippdf" + "floatbytocbasic" + "floatflt" + "floatrow" + "floatrowbytocbasic" + "flowfram" + "fmp" + "fmtcount" + "fn2end" + "fnbreak" + "fncychap" + "fncylab" + "fnpara" + "fnpct" + "fnumprint" + "foilhtml" + "foliono" + "fontaxes" + "fontscale" + "fontsetup" + "fontsize" + "fonttable" + "footmisc" + "footmisx" + "footnotebackref" + "footnoterange" + "footnpag" + "forarray" + "foreign" + "forloop" + "formlett" + "forms16be" + "formular" + "fragments" + "frame" + "framed" + "frankenstein" + "frege" + "froufrou" + "ftcap" + "ftnxtra" + "fullblck" + "fullminipage" + "fullwidth" + "functional" + "fundus-calligra" + "fundus-cyr" + "fundus-sueterlin" + "fvextra" + "fwlw" + "g-brief" + "gatherenum" + "gauss" + "gcard" + "gcite" + "gender" + "genealogy-profiles" + "genmpage" + "gensymb" + "getfiledate" + "getitems" + "gindex" + "ginpenc" + "gitfile-info" + "gitinfo" + "gitinfo2" + "gitlog" + "gitstatus" + "gitver" + "globalvals" + "gloss" + "glossaries" + "glossaries-danish" + "glossaries-dutch" + "glossaries-english" + "glossaries-estonian" + "glossaries-extra" + "glossaries-finnish" + "glossaries-french" + "glossaries-german" + "glossaries-irish" + "glossaries-italian" + "glossaries-magyar" + "glossaries-norsk" + "glossaries-nynorsk" + "glossaries-polish" + "glossaries-portuges" + "glossaries-serbian" + "glossaries-slovene" + "glossaries-spanish" + "gmdoc" + "gmdoc-enhance" + "gmiflink" + "gmutils" + "gmverb" + "grabbox" + "gradient-text" + "grading-scheme" + "graphbox" + "graphicscache" + "graphicx-psmin" + "graphicxbox" + "graphpaper" + "grayhints" + "grfpaste" + "grid" + "grid-system" + "gridpapers" + "gridset" + "gridslides" + "gs1" + "guitlogo" + "ha-prosper" + "hackthefootline" + "halloweenmath" + "handin" + "handout" + "handoutwithnotes" + "hang" + "hanging" + "hardwrap" + "harnon-cv" + "harpoon" + "hc" + "he-she" + "hep-acronym" + "hep-float" + "hep-math" + "hep-text" + "hep-title" + "hereapplies" + "hhtensor" + "hideanswer" + "highlightlatex" + "highlightx" + "histogr" + "hitec" + "hitreport" + "hletter" + "hobsub" + "homework" + "hpsdiss" + "href-ul" + "hrefhide" + "huawei" + "hvextern" + "hvindex" + "hvlogos" + "hvpygmentex" + "hvqrurl" + "hwemoji" + "hypdestopt" + "hypdoc" + "hypdvips" + "hyper" + "hyperbar" + "hypernat" + "hyperxmp" + "hyphenat" + "identkey" + "idxcmds" + "idxlayout" + "iexec" + "ifallfalse" + "iffont" + "ifmslide" + "ifmtarg" + "ifnextok" + "ifoddpage" + "ifthenx" + "iitem" + "image-gallery" + "imakeidx" + "import" + "incgraph" + "indextools" + "inline-images" + "inlinedef" + "inlinelabel" + "inputenx" + "inputtrc" + "interactiveworkbook" + "interfaces" + "intopdf" + "inversepath" + "invoice" + "invoice-class" + "invoice2" + "ipsum" + "iso" + "iso10303" + "isodate" + "isodoc" + "isonums" + "isopt" + "isorot" + "isosafety" + "isotope" + "issuulinks" + "iwonamath" + "jlabels" + "jmsdelim" + "jobname-suffix" + "joinbox" + "jslectureplanner" + "jumplines" + "jvlisting" + "kalendarium" + "kantlipsum" + "kerntest" + "keycommand" + "keyfloat" + "keyindex" + "keyparse" + "keyreader" + "keystroke" + "keyval2e" + "keyvaltable" + "kix" + "knowledge" + "koma-moderncvclassic" + "koma-script-sfs" + "komacv" + "komacv-rg" + "korigamik" + "ktv-texdata" + "l3build" + "labbook" + "labels" + "labels4easylist" + "labelschanged" + "lambdax" + "lastbib" + "lastpackage" + "lastpage" + "latex-amsmath-dev" + "latex-base-dev" + "latex-bin-dev" + "latex-context-ppchtex" + "latex-firstaid-dev" + "latex-graphics-dev" + "latex-lab-dev" + "latex-tools-dev" + "latex-uni8" + "latex2pydata" + "latexcolors" + "latexdemo" + "latexgit" + "layouts" + "lazylist" + "lccaps" + "lcd" + "lcg" + "leading" + "leaflet" + "lebhart" + "lectures" + "lectureslides" + "leftidx" + "leftindex" + "leipzig" + "lengthconvert" + "lettre" + "lettrine" + "lewis" + "lhelp" + "libgreek" + "limap" + "linegoal" + "linop" + "lipsum" + "lisp-on-tex" + "listing" + "listingsutf8" + "listlbls" + "listliketab" + "listofsymbols" + "litebook" + "litesolution" + "litetable" + "lkproof" + "lmake" + "locality" + "logbox" + "logical-markup-utils" + "logoetalab" + "logpap" + "longfbox" + "longfigure" + "longnamefilelist" + "loops" + "lsc" + "lstaddons" + "lstfiracode" + "lt3graph" + "lt3rawobjects" + "ltablex" + "ltabptch" + "ltxdockit" + "ltxguidex" + "ltxkeys" + "ltxnew" + "ltxtools" + "lua-check-hyphen" + "lua-physical" + "luatodonotes" + "macrolist" + "macroswap" + "magaz" + "magicnum" + "magicwatermark" + "mailing" + "mailmerge" + "makebarcode" + "makebase" + "makebox" + "makecell" + "makecirc" + "makecmds" + "makecookbook" + "makedtx" + "makeglos" + "makelabels" + "makerobust" + "mandi" + "manfnt" + "manuscript" + "manyind" + "marginfit" + "marginfix" + "marginnote" + "markdown" + "mathalpha" + "mathastext" + "mathexam" + "mathfam256" + "mathfont" + "maybemath" + "mcaption" + "mceinleger" + "mcexam" + "mcite" + "mciteplus" + "mdframed" + "media4svg" + "media9" + "medstarbeamer" + "meetingmins" + "memexsupp" + "memory" + "mensa-tex" + "menu" + "menucard" + "menukeys" + "metalogox" + "metanorma" + "metastr" + "method" + "metre" + "mfirstuc" + "mftinc" + "mi-solns" + "midpage" + "mindflow" + "minibox" + "minidocument" + "minifp" + "minimalist" + "minipage-marginpar" + "minitoc" + "minorrevision" + "minted" + "minutes" + "mla-paper" + "mleftright" + "mlist" + "mmap" + "mnotes" + "moderncv" + "modernposter" + "moderntimeline" + "modref" + "modroman" + "modular" + "moloch" + "monofill" + "moodle" + "moreenum" + "morefloats" + "morehype" + "moresize" + "moreverb" + "morewrites" + "movement-arrows" + "movie15" + "mparhack" + "mpostinl" + "msc" + "msg" + "mslapa" + "mtgreek" + "multenum" + "multiaudience" + "multibbl" + "multicap" + "multicolrule" + "multidef" + "multienv" + "multiexpand" + "multifootnote" + "multilang" + "multiple-choice" + "multirow" + "mversion" + "mwe" + "mycv" + "mylatex" + "mylatexformat" + "nag" + "nameauth" + "namespc" + "ncclatex" + "ncctools" + "needspace" + "nestquot" + "newcommand" + "newenviron" + "newfile" + "newlfm" + "newspaper" + "newunicodechar" + "newvbtm" + "newverbs" + "nextpage" + "nfssext-cfr" + "nicefilelist" + "niceframe" + "nicetext" + "nidanfloat" + "ninecolors" + "nlctdoc" + "noconflict" + "noindentafter" + "noitcrul" + "nolbreaks" + "nomencl" + "nomentbl" + "non-decimal-units" + "nonfloat" + "nonumonpart" + "nopageno" + "normalcolor" + "notebeamer" + "notes" + "notespages" + "notestex" + "notoccite" + "nowidow" + "nox" + "ntheorem" + "numberedblock" + "numname" + "numprint" + "numspell" + "ocg-p" + "ocgx" + "ocgx2" + "ocr-latex" + "octavo" + "oldstyle" + "onlyamsmath" + "opcit" + "opencolor" + "optidef" + "optional" + "options" + "orcidlink" + "orientation" + "outline" + "outliner" + "outlines" + "outlining" + "overlays" + "overpic" + "padcount" + "pagecolor" + "pagecont" + "pagegrid" + "pagelayout" + "pagenote" + "pagerange" + "pageslts" + "palette" + "pangram" + "paper" + "papercdcase" + "papermas" + "papertex" + "paracol" + "parades" + "paralist" + "paresse" + "parnotes" + "parsa" + "parselines" + "pas-cours" + "pas-cv" + "pas-tableur" + "patch" + "patchcmd" + "pauldoc" + "pawpict" + "pax" + "pbalance" + "pbox" + "pbsheet" + "pdf14" + "pdfannotations" + "pdfcol" + "pdfcolmk" + "pdfcomment" + "pdfcprot" + "pdfmarginpar" + "pdfoverlay" + "pdfpagediff" + "pdfpc" + "pdfpc-movie" + "pdfprivacy" + "pdfrender" + "pdfreview" + "pdfscreen" + "pdfslide" + "pdfsync" + "pdfwin" + "pdfx" + "pecha" + "perltex" + "permute" + "petiteannonce" + "pgfmath-xfp" + "phfcc" + "phfextendedabstract" + "phffullpagefigure" + "phfnote" + "phfparen" + "phfqit" + "phfquotetext" + "phfsvnwatermark" + "phfthm" + "philex" + "phonenumbers" + "photo" + "photobook" + "picture" + "piff" + "pkgloader" + "placeins" + "plantslabels" + "plates" + "plweb" + "pmboxdraw" + "polynom" + "polynomial" + "polytable" + "postcards" + "poster-mac" + "postnotes" + "powerdot" + "ppr-prv" + "ppt-slides" + "practicalreports" + "precattl" + "prelim2e" + "preprint" + "pressrelease" + "prettyref" + "prettytok" + "preview" + "printlen" + "probsoln" + "profmaquette" + "program" + "progress" + "progressbar" + "projlib" + "proofread" + "properties" + "prosper" + "protex" + "protocol" + "psfragx" + "pstool" + "pstring" + "pxgreeks" + "pygmentex" + "pynotebook" + "python" + "pythonimmediate" + "q-and-a" + "qcm" + "qstest" + "qsymbols" + "quicktype" + "quiz2socrative" + "quotchap" + "quoting" + "quotmark" + "ran_toks" + "randexam" + "randtext" + "rccol" + "rcs-multi" + "rcsinfo" + "readablecv" + "readarray" + "realboxes" + "recipe" + "recipebook" + "recipecard" + "rectopma" + "refcheck" + "refenums" + "reflectgraphics" + "refman" + "refstyle" + "regcount" + "regexpatch" + "register" + "regstats" + "relenc" + "relsize" + "repeatindex" + "repltext" + "rescansync" + "resmes" + "responsive" + "returntogrid" + "rgltxdoc" + "rjlparshap" + "rlepsf" + "rmpage" + "robust-externalize" + "robustcommand" + "robustindex" + "romanbar" + "romanbarpagenumber" + "romanneg" + "romannum" + "rorlink" + "rotfloat" + "rotpages" + "roundbox" + "rterface" + "rtkinenc" + "rulerbox" + "rulercompass" + "runcode" + "rvwrite" + "sanitize-umlaut" + "sauerj" + "saveenv" + "savefnmark" + "savesym" + "savetrees" + "scale" + "scalebar" + "scalerel" + "scanpages" + "schedule" + "schooldocs" + "scontents" + "scrambledenvs" + "scrlayer-fancyhdr" + "scrlttr2copy" + "scrwfile" + "sdaps" + "sdrt" + "secdot" + "secnum" + "sectionbox" + "sectionbreak" + "sectsty" + "seealso" + "selectp" + "selinput" + "semantex" + "semantic" + "semantic-markup" + "semesterplanner" + "semioneside" + "semproc" + "semtex" + "sepfootnotes" + "seqsplit" + "sesstime" + "setspaceenhanced" + "sf298" + "sffms" + "sfmath" + "shadethm" + "shadow" + "shadowtext" + "shapepar" + "shdoc" + "shipunov" + "shorttoc" + "show2e" + "showcharinbox" + "showdim" + "showexpl" + "showlabels" + "sidecap" + "sidenotes" + "sidenotesplus" + "silence" + "sillypage" + "sim-os-menus" + "simplecd" + "simplecv" + "simpleinvoice" + "simplivre" + "sitem" + "skb" + "skdoc" + "skeldoc" + "skeycommand" + "skeyval" + "skills" + "skrapport" + "slantsc" + "smalltableof" + "smart-eqn" + "smartref" + "smartunits" + "snapshot" + "snaptodo" + "snotez" + "soulpos" + "spacingtricks" + "spark-otf" + "sparklines" + "sphack" + "splitindex" + "spot" + "spotcolor" + "spreadtab" + "spverbatim" + "srbook-mem" + "srcltx" + "sseq" + "sslides" + "stack" + "stackengine" + "standalone" + "starray" + "stdclsdv" + "stdpage" + "stealcaps" + "stex" + "storebox" + "storecmd" + "stringstrings" + "sttools" + "stubs" + "studenthandouts" + "styledcmd" + "subdepth" + "subdocs" + "subeqn" + "subeqnarray" + "subfigmat" + "subfigure" + "subfiles" + "subfloat" + "substr" + "supertabular" + "suppose" + "svg" + "svgcolor" + "svn" + "svn-multi" + "svn-prov" + "svninfo" + "swfigure" + "swungdash" + "syntax" + "syntrace" + "synttree" + "tabbing" + "tabfigures" + "tableaux" + "tablefootnote" + "tableof" + "tablists" + "tabls" + "tablvar" + "tabstackengine" + "tabto-ltx" + "tabu" + "tabularborder" + "tabularcalc" + "tabularew" + "tabularray" + "tabulary" + "tagging" + "tagpair" + "tagpdf" + "talk" + "tamefloats" + "tangocolors" + "tasks" + "tblr-extras" + "tcldoc" + "tcolorbox" + "tdclock" + "technics" + "ted" + "templatetools" + "termcal" + "termlist" + "termsim" + "testhyphens" + "testidx" + "tex-label" + "tex-locale" + "texlogos" + "texmate" + "texments" + "texpower" + "texshade" + "texsurgery" + "textcsc" + "textfit" + "textmerg" + "textpos" + "textualicomma" + "texvc" + "theoremref" + "thinsp" + "thmtools" + "threadcol" + "threeparttable" + "threeparttablex" + "thumb" + "thumbs" + "thumby" + "ticket" + "tipauni" + "titlecaps" + "titlefoot" + "titlepic" + "titleref" + "titlesec" + "titling" + "to-be-determined" + "tocbibind" + "tocdata" + "tocloft" + "tocvsec2" + "todo" + "todonotes" + "tokcycle" + "tokenizer" + "toolbox" + "topfloat" + "topiclongtable" + "totalcount" + "totcount" + "totpages" + "tramlines" + "translations" + "transparent" + "trfsigns" + "trimspaces" + "trivfloat" + "trsym" + "truncate" + "tucv" + "turnthepage" + "tutodoc" + "twoinone" + "twoup" + "txgreeks" + "type1cm" + "typed-checklist" + "typeface" + "typoaid" + "typogrid" + "uassign" + "ucs" + "uebungsblatt" + "umoline" + "underlin" + "underoverlap" + "undolabl" + "uni-titlepage" + "unicode-math-input" + "unicodefonttable" + "unifront" + "unisc" + "unitconv" + "units" + "unravel" + "updatemarks" + "upmethodology" + "upquote" + "uri" + "useclass" + "ushort" + "uspace" + "utf8add" + "uwmslide" + "variablelm" + "varindex" + "varsfromjobname" + "varwidth" + "vcell" + "vdmlisting" + "verbasef" + "verbatimbox" + "verbatimcopy" + "verbdef" + "verbments" + "verifiche" + "verifycommand" + "version" + "versions" + "versonotes" + "vertbars" + "vgrid" + "vhistory" + "vmargin" + "volumes" + "vpe" + "vruler" + "vtable" + "vwcol" + "wallcalendar" + "wallpaper" + "warning" + "warpcol" + "was" + "webquiz" + "widetable" + "widows-and-orphans" + "williams" + "willowtreebook" + "withargs" + "wordcount" + "wordlike" + "worksheet" + "wrapfig" + "wrapfig2" + "wrapstuff" + "writeongrid" + "wtref" + "xargs" + "xassoccnt" + "xbmks" + "xcntperchap" + "xcolor-material" + "xcolor-solarized" + "xcomment" + "xcookybooky" + "xcpdftips" + "xdoc" + "xellipsis" + "xfakebold" + "xfor" + "xhfill" + "xifthen" + "xint" + "xkcdcolors" + "xkeymask" + "xltabular" + "xmpincl" + "xnewcommand" + "xoptarg" + "xpatch" + "xpeek" + "xprintlen" + "xpunctuate" + "xsavebox" + "xsim" + "xstring" + "xtab" + "xurl" + "xwatermark" + "xytree" + "yafoot" + "yagusylo" + "yaletter" + "ycbook" + "ydoc" + "yplan" + "zebra-goodies" + "zed-csp" + "zennote" + "ziffer" + "zref" + "zref-check" + "zref-clever" + "zref-vario" + "zwgetfdate" + "zwpagelayout" + ]; + sha512.run = "98a00a699b249cc95f5466322fff70b07b94a3e3941b10dbb2a052491e23e733f902c9281a76279363b55a5b59c0d5afb84017c4bba48459525e22c431876dd9"; +}; +collection-latexrecommended = { + revision = 69888; + shortdesc = "LaTeX recommended packages"; + stripPrefix = 0; + deps = [ + "anysize" + "attachfile2" + "beamer" + "booktabs" + "breqn" + "caption" + "cite" + "cmap" + "collection-latex" + "crop" + "ctable" + "eso-pic" + "etoolbox" + "euenc" + "euler" + "everysel" + "everyshi" + "extsizes" + "fancybox" + "fancyref" + "fancyvrb" + "filehook" + "float" + "fontspec" + "footnotehyper" + "fp" + "grffile" + "hologo" + "index" + "infwarerr" + "jknapltx" + "koma-script" + "l3experimental" + "latexbug" + "lineno" + "listings" + "lwarp" + "mathspec" + "mathtools" + "mdwtools" + "memoir" + "metalogo" + "microtype" + "ms" + "newfloat" + "ntgclass" + "parskip" + "pdfcolfoot" + "pdflscape" + "pdfmanagement-testphase" + "pdfpages" + "polyglossia" + "psfrag" + "ragged2e" + "rcs" + "sansmath" + "section" + "seminar" + "sepnum" + "setspace" + "subfig" + "textcase" + "thumbpdf" + "translator" + "typehtml" + "ucharcat" + "underscore" + "unicode-math" + "xcolor" + "xfrac" + "xkeyval" + "xltxtra" + "xunicode" + ]; + sha512.run = "edaa03608bca82f73cc7ac7114443536570bd6774cee90ba4058996096f3f461a2198cf89d90c3e749bc5305447f32b3facff5c26fa56a5ac5a3eee71cf30222"; +}; +collection-luatex = { + revision = 69404; + shortdesc = "LuaTeX packages"; + stripPrefix = 0; + deps = [ + "addliga" + "addtoluatexpath" + "auto-pst-pdf-lua" + "barracuda" + "bezierplot" + "blopentype" + "checkcites" + "chickenize" + "chinese-jfm" + "cloze" + "collection-basic" + "combofont" + "cstypo" + "ctablestack" + "ekdosis" + "emoji" + "emojicite" + "enigma" + "gitinfo-lua" + "innerscript" + "interpreter" + "kanaparser" + "ligtype" + "linebreaker" + "lparse" + "lt3luabridge" + "lua-placeholders" + "lua-tinyyaml" + "lua-typo" + "lua-uca" + "lua-ul" + "lua-uni-algos" + "lua-visual-debug" + "lua-widow-control" + "luaaddplot" + "luacas" + "luacensor" + "luacode" + "luacolor" + "luacomplex" + "luagcd" + "luahttp" + "luahyphenrules" + "luaimageembed" + "luaindex" + "luainputenc" + "luakeys" + "lualatex-math" + "lualatex-truncate" + "lualibs" + "lualinalg" + "luamathalign" + "luamaths" + "luamodulartables" + "luamplib" + "luaoptions" + "luaotfload" + "luapackageloader" + "luaplot" + "luaprogtable" + "luaquotes" + "luarandom" + "luaset" + "luatex85" + "luatexbase" + "luatexko" + "luatextra" + "luatruthtable" + "luavlna" + "luaxml" + "lutabulartools" + "minim" + "minim-math" + "minim-mp" + "minim-pdf" + "minim-xmp" + "newpax" + "nodetree" + "odsfile" + "optex" + "pdfarticle" + "pdfextra" + "penlight" + "penlightplus" + "piton" + "placeat" + "plantuml" + "pyluatex" + "scikgtex" + "selnolig" + "showhyphenation" + "showkerning" + "spacekern" + "spelling" + "stricttex" + "sympycalc" + "texfindpkg" + "truthtable" + "tsvtemplate" + "typewriter" + "uninormalize" + "yamlvars" + ]; + sha512.run = "d03b9242340be7be8c32e87c2773bb8aecd4a6b7e1594fe755d9955f111dad4863e497bd3f374140c162b84c6c90379ff86c930267ab5c6d26c3cd0e3968c745"; +}; +collection-mathscience = { + revision = 70357; + shortdesc = "Mathematics, natural sciences, computer science packages"; + stripPrefix = 0; + deps = [ + "12many" + "accents" + "alg" + "algobox" + "algorithm2e" + "algorithmicx" + "algorithms" + "algpseudocodex" + "algxpar" + "aligned-overset" + "amscdx" + "amstex" + "annotate-equations" + "apxproof" + "autobreak" + "axodraw2" + "backnaur" + "begriff" + "binomexp" + "biocon" + "bitpattern" + "bodeplot" + "bohr" + "boldtensors" + "bosisio" + "bpchem" + "bropd" + "bussproofs" + "bussproofs-extra" + "bytefield" + "calculation" + "cartonaugh" + "cascade" + "causets" + "ccfonts" + "ccool" + "chemarrow" + "chemcompounds" + "chemcono" + "chemexec" + "chemformula" + "chemformula-ru" + "chemgreek" + "chemmacros" + "chemnum" + "chemobabel" + "chemplants" + "chemschemex" + "chemsec" + "chemstyle" + "clrscode" + "clrscode3e" + "codeanatomy" + "collection-fontsrecommended" + "collection-latex" + "commath" + "commutative-diagrams" + "complexity" + "computational-complexity" + "concmath" + "concrete" + "conteq" + "correctmathalign" + "cryptocode" + "csassignments" + "cvss" + "decision-table" + "delim" + "delimseasy" + "delimset" + "derivative" + "diffcoeff" + "digiconfigs" + "dijkstra" + "drawmatrix" + "drawstack" + "dyntree" + "easing" + "ebproof" + "econometrics" + "eltex" + "emf" + "endiagram" + "engtlc" + "eolang" + "eqexpl" + "eqnarray" + "eqnnumwarn" + "euclideangeometry" + "extarrows" + "extpfeil" + "faktor" + "fascicules" + "fitch" + "fixdif" + "fixmath" + "fnspe" + "formal-grammar" + "fouridx" + "freealign" + "functan" + "galois" + "gastex" + "gene-logic" + "ghsystem" + "glosmathtools" + "gotoh" + "grundgesetze" + "gu" + "helmholtz-ellis-ji-notation" + "hep" + "hep-graphic" + "hep-reference" + "hepnames" + "hepparticles" + "hepthesis" + "hepunits" + "ibrackets" + "includernw" + "interval" + "ionumbers" + "isomath" + "isphysicalmath" + "jkmath" + "jupynotex" + "karnaugh" + "karnaugh-map" + "karnaughmap" + "kvmap" + "letterswitharrows" + "lie-hasse" + "logicproof" + "longdivision" + "lpform" + "lplfitch" + "lstbayes" + "luanumint" + "mathcommand" + "mathcomp" + "mathfixs" + "mathlig" + "mathpartir" + "mathpunctspace" + "mathsemantics" + "matlab-prettifier" + "matrix-skeleton" + "mattens" + "mecaso" + "medmath" + "membranecomputing" + "memorygraphs" + "messagepassing" + "mgltex" + "mhchem" + "mhequ" + "miller" + "mismath" + "multiobjective" + "naive-ebnf" + "namedtensor" + "natded" + "nath" + "nchairx" + "nicematrix" + "nuc" + "nucleardata" + "numerica" + "numerica-plus" + "numerica-tables" + "objectz" + "odesandpdes" + "oplotsymbl" + "ot-tableau" + "oubraces" + "overarrows" + "pascaltriangle" + "perfectcut" + "pfdicons" + "physconst" + "physics" + "physics2" + "physunits" + "pinoutikz" + "pm-isomath" + "pmdraw" + "polexpr" + "prftree" + "principia" + "proba" + "proof-at-the-end" + "prooftrees" + "pseudo" + "pseudocode" + "pythonhighlight" + "qsharp" + "quickreaction" + "quiver" + "rank-2-roots" + "rbt-mathnotes" + "rec-thy" + "resolsysteme" + "rest-api" + "revquantum" + "ribbonproofs" + "rmathbr" + "sankey" + "sasnrdisplay" + "sciposter" + "sclang-prettifier" + "scratchx" + "sesamanuel" + "sfg" + "shuffle" + "simplebnf" + "simpler-wick" + "simples-matrices" + "simplewick" + "sistyle" + "siunits" + "siunitx" + "skmath" + "spalign" + "spbmark" + "stanli" + "statex" + "statex2" + "statistics" + "statistik" + "statmath" + "steinmetz" + "stmaryrd" + "string-diagrams" + "structmech" + "struktex" + "substances" + "subsupscripts" + "subtext" + "susy" + "syllogism" + "sympytexpackage" + "synproof" + "t-angles" + "tablor" + "tensind" + "tensor" + "tex-ewd" + "textgreek" + "textopo" + "thermodynamics" + "thmbox" + "tiscreen" + "turnstile" + "ulqda" + "unitsdef" + "venn" + "witharrows" + "xymtex" + "yhmath" + "youngtab" + "yquant" + "ytableau" + "zx-calculus" + ]; + sha512.run = "1fbc1238b2017d8c2a75c86a654308e02c004309d1c64b994b9f1dcc7dfb9bc62736c999773277288f0a6b391bd447252274f49d2168b70302b4ac2ca8a3c00c"; +}; +collection-metapost = { + revision = 67071; + shortdesc = "MetaPost and Metafont packages"; + stripPrefix = 0; + deps = [ + "automata" + "bbcard" + "blockdraw_mp" + "bpolynomial" + "cmarrows" + "collection-basic" + "drv" + "dviincl" + "emp" + "epsincl" + "expressg" + "exteps" + "featpost" + "feynmf" + "feynmp-auto" + "fiziko" + "garrigues" + "gmp" + "hatching" + "hershey-mp" + "huffman" + "latexmp" + "mcf2graph" + "metago" + "metaobj" + "metaplot" + "metapost" + "metapost-colorbrewer" + "metauml" + "mfpic" + "mfpic4ode" + "minim-hatching" + "mp3d" + "mparrows" + "mpattern" + "mpchess" + "mpcolornames" + "mpgraphics" + "mptrees" + "piechartmp" + "repere" + "roex" + "roundrect" + "shapes" + "slideshow" + "splines" + "suanpan" + "textpath" + "threeddice" + ]; + sha512.run = "c0bf45f69b1b11ef6e59e6dfa0bd690fcae8b1b06097eb99f06e7ffa954f1ebebf296f3245e6922d716688353e22b691092f8e6349b1f02b3234b49a3bfaf969"; +}; +collection-music = { + revision = 69613; + shortdesc = "Music packages"; + stripPrefix = 0; + deps = [ + "abc" + "autosp" + "bagpipe" + "chordbars" + "chordbox" + "collection-latex" + "ddphonism" + "figbas" + "gchords" + "gregoriotex" + "gtrcrd" + "guitar" + "guitarchordschemes" + "guitartabs" + "harmony" + "latex4musicians" + "leadsheets" + "lilyglyphs" + "lyluatex" + "m-tx" + "musical" + "musicography" + "musixguit" + "musixtex" + "musixtex-fonts" + "musixtnt" + "octave" + "piano" + "pmx" + "pmxchords" + "recorder-fingering" + "songbook" + "songproj" + "songs" + "undar-digitacion" + "xml2pmx" + "xpiano" + ]; + sha512.run = "26100feabd6d95d8b29f0160f7e9b86d06e5055387acc63fe6e47fa0e681567e2d6537043bfa9138d3f8bf27705f2117b719aeb77d72b2f35ff5e5ad220a6038"; +}; +collection-pictures = { + revision = 70538; + shortdesc = "Graphics, pictures, diagrams"; + stripPrefix = 0; + deps = [ + "adigraph" + "aobs-tikz" + "askmaps" + "asyfig" + "asypictureb" + "autoarea" + "bardiag" + "beamerswitch" + "binarytree" + "blochsphere" + "bloques" + "blox" + "bodegraph" + "bondgraph" + "bondgraphs" + "braids" + "bxeepic" + "byo-twemojis" + "byrne" + "cachepic" + "callouts" + "celtic" + "chemfig" + "circuit-macros" + "circuitikz" + "circularglyphs" + "coffeestains" + "collection-basic" + "coloredbelts" + "combinedgraphics" + "curve" + "curve2e" + "curves" + "dcpic" + "diagmac2" + "ditaa" + "doc-pictex" + "dot2texi" + "dottex" + "dpcircling" + "dratex" + "drs" + "duotenzor" + "dynkin-diagrams" + "ecgdraw" + "eepic" + "egpeirce" + "ellipse" + "endofproofwd" + "epspdf" + "epspdfconversion" + "esk" + "euflag" + "fadingimage" + "fast-diagram" + "fenetrecas" + "fig4latex" + "figchild" + "figput" + "fitbox" + "flowchart" + "forest" + "genealogytree" + "getmap" + "gincltex" + "gnuplottex" + "gradientframe" + "grafcet" + "graph35" + "graphicxpsd" + "graphviz" + "gtrlib-largetrees" + "harveyballs" + "here" + "hf-tikz" + "hobby" + "hvfloat" + "istgame" + "kblocks" + "kinematikz" + "knitting" + "knittingpattern" + "ladder" + "lapdf" + "latex-make" + "liftarm" + "lpic" + "lroundrect" + "luamesh" + "luasseq" + "maker" + "makeshape" + "mathspic" + "memoize" + "mercatormap" + "milsymb" + "miniplot" + "mkpic" + "modiagram" + "neuralnetwork" + "nl-interval" + "nndraw" + "numericplots" + "outilsgeomtikz" + "papiergurvan" + "pb-diagram" + "petri-nets" + "pgf" + "pgf-blur" + "pgf-interference" + "pgf-periodictable" + "pgf-pie" + "pgf-soroban" + "pgf-spectra" + "pgf-umlcd" + "pgf-umlsd" + "pgfgantt" + "pgfkeysearch" + "pgfkeyx" + "pgfmolbio" + "pgfmorepages" + "pgfopts" + "pgfornament" + "pgfplots" + "picinpar" + "pict2e" + "pictex" + "pictex2" + "pictochrono" + "pinlabel" + "pixelart" + "pixelarttikz" + "pmgraph" + "polyhedra" + "postage" + "postit" + "prerex" + "productbox" + "ptolemaicastronomy" + "puyotikz" + "pxpgfmark" + "pxpic" + "qcircuit" + "qrcode" + "quantikz" + "randbild" + "randomwalk" + "realhats" + "reotex" + "robotarm" + "rviewport" + "sa-tikz" + "sacsymb" + "schemabloc" + "scratch" + "scratch3" + "scsnowman" + "setdeck" + "signchart" + "simplenodes" + "simpleoptics" + "smartdiagram" + "spath3" + "spectralsequences" + "strands" + "swimgraf" + "syntaxdi" + "table-fct" + "texdraw" + "ticollege" + "tikz-3dplot" + "tikz-among-us" + "tikz-bagua" + "tikz-bayesnet" + "tikz-bbox" + "tikz-cd" + "tikz-dependency" + "tikz-dimline" + "tikz-ext" + "tikz-feynhand" + "tikz-feynman" + "tikz-imagelabels" + "tikz-inet" + "tikz-kalender" + "tikz-karnaugh" + "tikz-ladder" + "tikz-lake-fig" + "tikz-layers" + "tikz-mirror-lens" + "tikz-nef" + "tikz-network" + "tikz-nfold" + "tikz-opm" + "tikz-optics" + "tikz-osci" + "tikz-page" + "tikz-palattice" + "tikz-planets" + "tikz-qtree" + "tikz-relay" + "tikz-sfc" + "tikz-swigs" + "tikz-timing" + "tikz-trackschematic" + "tikz-truchet" + "tikz2d-fr" + "tikz3d-fr" + "tikzbricks" + "tikzcodeblocks" + "tikzdotncross" + "tikzducks" + "tikzfill" + "tikzinclude" + "tikzlings" + "tikzmark" + "tikzmarmots" + "tikzorbital" + "tikzpackets" + "tikzpagenodes" + "tikzpeople" + "tikzpfeile" + "tikzpingus" + "tikzposter" + "tikzquads" + "tikzquests" + "tikzscale" + "tikzsymbols" + "tikztosvg" + "tikzviolinplots" + "tile-graphic" + "tilings" + "timing-diagrams" + "tipfr" + "tkz-base" + "tkz-berge" + "tkz-bernoulli" + "tkz-doc" + "tkz-elements" + "tkz-euclide" + "tkz-fct" + "tkz-graph" + "tkz-orm" + "tkz-tab" + "tkzexample" + "tonevalue" + "tqft" + "tsemlines" + "tufte-latex" + "twemojis" + "tzplot" + "utfsym" + "vectorlogos" + "venndiagram" + "visualpstricks" + "wheelchart" + "wordcloud" + "worldflags" + "xistercian" + "xpicture" + "xypic" + ]; + sha512.run = "1851e3e460f1d5fc2c1f8e04e209f800f9ac27337fef200b3f200cee3580b4ff816784f00aa2dec1d7d7f36711d8cc043033ba2f512dce2933d078aa5c72d5b2"; +}; +collection-plaingeneric = { + revision = 68675; + shortdesc = "Plain (La)TeX packages"; + stripPrefix = 0; + deps = [ + "abbr" + "abstyles" + "advice" + "apnum" + "autoaligne" + "barr" + "bitelist" + "borceux" + "c-pascal" + "calcfrac" + "catcodes" + "chronosys" + "collargs" + "collection-basic" + "colorsep" + "compare" + "crossrefenum" + "cweb-old" + "dinat" + "dirtree" + "docbytex" + "dowith" + "eijkhout" + "encxvlna" + "epigram" + "epsf" + "epsf-dvipdfmx" + "etoolbox-generic" + "expex-acro" + "expkv-bundle" + "fenixpar" + "figflow" + "fixpdfmag" + "fltpoint" + "fntproof" + "font-change" + "fontch" + "fontname" + "gates" + "getoptk" + "gfnotation" + "gobble" + "graphics-pln" + "gtl" + "hlist" + "hyplain" + "inputnormalization" + "insbox" + "js-misc" + "kastrup" + "lambda-lists" + "langcode" + "lecturer" + "letterspacing" + "librarian" + "listofitems" + "localloc" + "mathdots" + "metatex" + "midnight" + "mkpattern" + "mlawriter" + "modulus" + "multido" + "namedef" + "navigator" + "newsletr" + "nth" + "ofs" + "olsak-misc" + "outerhbox" + "path" + "pdf-trans" + "pdfmsym" + "pitex" + "placeins-plain" + "plainpkg" + "plipsum" + "plnfss" + "plstmary" + "poormanlog" + "present" + "pwebmac" + "random" + "randomlist" + "resumemac" + "ruler" + "schemata" + "shade" + "simplekv" + "soul" + "swrule" + "systeme" + "tabto-generic" + "termmenu" + "tex-ps" + "tex4ht" + "texapi" + "texdate" + "texdimens" + "texinfo" + "timetable" + "tracklang" + "transparent-io" + "treetex" + "trigonometry" + "ulem" + "upca" + "varisize" + "xii" + "xii-lat" + "xintsession" + "xlop" + "yax" + "zztex" + ]; + sha512.run = "e162b0e32f52ea7ca60d5241ad6f653b29d2601eb05734ca0970224894e1acf3c21b1c160fdea652b8616f19cce5e812d5ba78ef10aa3cce784a90aebea960ef"; +}; +collection-pstricks = { + revision = 65367; + shortdesc = "PSTricks"; + stripPrefix = 0; + deps = [ + "auto-pst-pdf" + "bclogo" + "collection-basic" + "collection-plaingeneric" + "dsptricks" + "luapstricks" + "makeplot" + "pdftricks" + "pdftricks2" + "pedigree-perl" + "psbao" + "pst-2dplot" + "pst-3d" + "pst-3dplot" + "pst-abspos" + "pst-am" + "pst-antiprism" + "pst-arrow" + "pst-asr" + "pst-bar" + "pst-barcode" + "pst-bezier" + "pst-blur" + "pst-bspline" + "pst-calculate" + "pst-calendar" + "pst-cie" + "pst-circ" + "pst-coil" + "pst-contourplot" + "pst-cox" + "pst-dart" + "pst-dbicons" + "pst-diffraction" + "pst-electricfield" + "pst-eps" + "pst-eucl" + "pst-exa" + "pst-feyn" + "pst-fill" + "pst-fit" + "pst-flags" + "pst-fr3d" + "pst-fractal" + "pst-fun" + "pst-func" + "pst-gantt" + "pst-geo" + "pst-geometrictools" + "pst-gr3d" + "pst-grad" + "pst-graphicx" + "pst-hsb" + "pst-infixplot" + "pst-intersect" + "pst-jtree" + "pst-knot" + "pst-labo" + "pst-layout" + "pst-lens" + "pst-light3d" + "pst-lsystem" + "pst-magneticfield" + "pst-marble" + "pst-math" + "pst-mirror" + "pst-moire" + "pst-node" + "pst-ob3d" + "pst-ode" + "pst-optexp" + "pst-optic" + "pst-osci" + "pst-ovl" + "pst-pad" + "pst-pdf" + "pst-pdgr" + "pst-perspective" + "pst-platon" + "pst-plot" + "pst-poker" + "pst-poly" + "pst-pulley" + "pst-qtree" + "pst-rputover" + "pst-rubans" + "pst-shell" + "pst-sigsys" + "pst-slpe" + "pst-solarsystem" + "pst-solides3d" + "pst-soroban" + "pst-spectra" + "pst-spinner" + "pst-stru" + "pst-support" + "pst-text" + "pst-thick" + "pst-tools" + "pst-tree" + "pst-turtle" + "pst-tvz" + "pst-uml" + "pst-vectorian" + "pst-vehicle" + "pst-venn" + "pst-vowel" + "pst2pdf" + "pstricks" + "pstricks-add" + "pstricks_calcnotes" + "uml" + "vaucanson-g" + "vocaltract" + ]; + sha512.run = "508276fe37018f3d9773fc7cda0cb37edcdd28e9cf8ab54ed5be16b07c2066de4626a561bbe387c7bba0fb82d4102be406efd721a4b5dc90110b8560083d2b07"; +}; +collection-publishers = { + revision = 69759; + shortdesc = "Publisher styles, theses, etc."; + stripPrefix = 0; + deps = [ + "aastex" + "abnt" + "abntex2" + "abntexto" + "acmart" + "acmconf" + "active-conf" + "adfathesis" + "afparticle" + "afthesis" + "aguplus" + "aiaa" + "amnestyreport" + "anonymous-acm" + "anufinalexam" + "aomart" + "apa" + "apa6" + "apa6e" + "apa7" + "arsclassica" + "articleingud" + "asaetr" + "ascelike" + "asmeconf" + "asmejour" + "aucklandthesis" + "bangorcsthesis" + "bangorexam" + "bath-bst" + "beamer-fuberlin" + "beamer-verona" + "beilstein" + "bfh-ci" + "bgteubner" + "bjfuthesis" + "bmstu" + "bmstu-iu8" + "br-lex" + "brandeis-dissertation" + "brandeis-problemset" + "brandeis-thesis" + "buctthesis" + "cascadilla" + "cesenaexam" + "chem-journal" + "chifoot" + "chs-physics-report" + "cidarticle" + "cje" + "cjs-rcs-article" + "classicthesis" + "cleanthesis" + "cmpj" + "collection-latex" + "confproc" + "contract" + "cquthesis" + "dccpaper" + "dithesis" + "ebook" + "ebsthesis" + "ecothesis" + "ejpecp" + "ekaia" + "elbioimp" + "els-cas-templates" + "elsarticle" + "elteiktdk" + "elteikthesis" + "emisa" + "erdc" + "estcpmm" + "etsvthor" + "facture-belge-simple-sans-tva" + "fbithesis" + "fcavtex" + "fcltxdoc" + "fei" + "ftc-notebook" + "gaceta" + "gammas" + "geradwp" + "gfdl" + "gradstudentresume" + "grant" + "gsemthesis" + "gzt" + "h2020proposal" + "hagenberg-thesis" + "har2nat" + "hecthese" + "hep-paper" + "heria" + "hfutexam" + "hfutthesis" + "hithesis" + "hitszbeamer" + "hitszthesis" + "hobete" + "hu-berlin-bundle" + "hustthesis" + "icsv" + "ieeeconf" + "ieeepes" + "ieeetran" + "ijmart" + "ijsra" + "imac" + "imtekda" + "inkpaper" + "iodhbwm" + "iscram" + "jacow" + "jmlr" + "jnuexam" + "jourcl" + "jourrr" + "jpsj" + "jwjournal" + "kdgdocs" + "kdpcover" + "kfupm-math-exam" + "kluwer" + "ksp-thesis" + "ku-template" + "langsci" + "langsci-avm" + "limecv" + "lion-msc" + "llncs" + "llncsconf" + "lni" + "lps" + "matc3" + "matc3mem" + "mcmthesis" + "mentis" + "mitthesis" + "mlacls" + "mluexercise" + "mnras" + "modeles-factures-belges-assocs" + "msu-thesis" + "mucproc" + "mugsthesis" + "muling" + "musuos" + "muthesis" + "mynsfc" + "nature" + "navydocs" + "nddiss" + "ndsu-thesis" + "ndsu-thesis-2022" + "nih" + "nihbiosketch" + "njustthesis" + "njuthesis" + "njuvisual" + "nostarch" + "novel" + "nrc" + "nwafuthesis" + "nwejm" + "onrannual" + "opteng" + "oststud" + "oup-authoring-template" + "philosophersimprint" + "pittetd" + "pkuthss" + "powerdot-fuberlin" + "powerdot-tuliplab" + "pracjourn" + "prociagssymp" + "proposal" + "prtec" + "ptptex" + "qrbill" + "quantumarticle" + "regulatory" + "resphilosophica" + "resumecls" + "revtex" + "revtex4" + "revtex4-1" + "rutitlepage" + "ryersonsgsthesis" + "ryethesis" + "sageep" + "sapthesis" + "schule" + "scientific-thesis-cover" + "scripture" + "scrjrnl" + "sduthesis" + "se2thesis" + "seu-ml-assign" + "seuthesis" + "seuthesix" + "shortmathj" + "shtthesis" + "smflatex" + "soton" + "sphdthesis" + "spie" + "sr-vorl" + "srdp-mathematik" + "stellenbosch" + "stellenbosch-2" + "suftesi" + "sugconf" + "tabriz-thesis" + "technion-thesis-template" + "texilikechaps" + "texilikecover" + "thesis-ekf" + "thesis-gwu" + "thesis-qom" + "thesis-titlepage-fhac" + "thuaslogos" + "thubeamer" + "thucoursework" + "thuthesis" + "tidyres" + "timbreicmc" + "tlc-article" + "topletter" + "toptesi" + "tuda-ci" + "tudscr" + "tugboat" + "tugboat-plain" + "tui" + "turabian" + "uaclasses" + "uafthesis" + "uantwerpendocs" + "ucalgmthesis" + "ucbthesis" + "ucdavisthesis" + "ucph-revy" + "ucsmonograph" + "ucthesis" + "udepcolor" + "udes-genie-these" + "uestcthesis" + "ufrgscca" + "uhhassignment" + "uiucredborder" + "uiucthesis" + "ukbill" + "ulthese" + "umbclegislation" + "umich-thesis" + "umthesis" + "unam-thesis" + "unamth-template" + "unamthesis" + "unbtex" + "unifith" + "unigrazpub" + "unitn-bimrep" + "univie-ling" + "unizgklasa" + "unswcover" + "uol-physics-report" + "uothesis" + "uowthesis" + "uowthesistitlepage" + "urcls" + "uspatent" + "ut-thesis" + "utexasthesis" + "uvaletter" + "uwa-colours" + "uwa-letterhead" + "uwa-pcf" + "uwa-pif" + "uwthesis" + "vancouver" + "wsemclassic" + "xduthesis" + "xduts" + "xmuthesis" + "yathesis" + "yazd-thesis" + "yb-book" + "york-thesis" + ]; + sha512.run = "9a69b9b69cd17bb1fb8ef7ea4a5d870c3a5ee0241c9ca1bc1e4344a4708b9625d31332965ea33784d528d46bf0aefe9703784deee5e795107d5594b4a8517894"; +}; +collection-texworks = { + revision = 54074; + shortdesc = "TeXworks editor; TL includes only the Windows binary"; + stripPrefix = 0; + deps = [ + "collection-basic" + "texworks" + ]; + sha512.run = "b1f38877115fb6efc9b63a5591c399b799f3a258e342d5e198b74b582628461ad67ea7c1ab76e5ae83a3e8e538c62ac3e7c5b3d3f1d29c093331843067cfec57"; +}; +collection-wintools = { + revision = 65952; + shortdesc = "Windows-only support programs"; + stripPrefix = 0; + sha512.run = "8af5c376990a7ed062588a0eb8695455936a92376b94f157d75a22f976f62017999aee8aeb692a07f98a64f05ac98bf4aba79c5f75688c54ad2196807471dc1b"; +}; +collection-xetex = { + revision = 69452; + shortdesc = "XeTeX and packages"; + stripPrefix = 0; + deps = [ + "arabxetex" + "bidi-atbegshi" + "bidicontour" + "bidipagegrid" + "bidipresentation" + "bidishadowtext" + "businesscard-qrcode" + "collection-basic" + "cqubeamer" + "fixlatvian" + "font-change-xetex" + "fontbook" + "fontwrap" + "interchar" + "na-position" + "philokalia" + "ptext" + "realscripts" + "simple-resume-cv" + "simple-thesis-dissertation" + "tetragonos" + "ucharclasses" + "unicode-bidi" + "unimath-plain-xetex" + "unisugar" + "xebaposter" + "xechangebar" + "xecolor" + "xecyr" + "xeindex" + "xelatex-dev" + "xesearch" + "xespotcolor" + "xetex" + "xetex-itrans" + "xetex-pstricks" + "xetex-tibetan" + "xetexconfig" + "xetexfontinfo" + "xetexko" + "xevlna" + "zbmath-review-template" + ]; + sha512.run = "5ec49133c1a9f43a8c025fc3b46d855d13f230f2885ed1d2cf57aa32f071a471a9c77c590e1269c885be045ea9c8cd36334a4b4fe647aa23454e91e42c229089"; +}; +collref = { + revision = 46358; + shortdesc = "Collect blocks of references into a single reference"; + stripPrefix = 0; + sha512.run = "56c2fda36523ae348bea381d90493238c7cbf5ab59f074437c7b694b441f913e6b58795ca81d2c549fbba01505a8895e9e139a9d143050761bceced2717fdb97"; + sha512.doc = "2d75180ab389632ec320795d6e6b989d902b82d1cfc97ea3c5113647e605c1eead0d0f5a6733cb692b624f4caa7120959c0b15018e35be4d4894183ad3e4c37d"; + sha512.source = "5a89f6703ab1818375ff33840b1295aee99e6a36338790014b7ac4b54bd49850adcf73ca793c57fb8159be87417741dcdd6ad3934af8bfde74595367f5e3a9fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0c"; +}; +colophon = { + revision = 47913; + shortdesc = "Provides commands for producing a colophon"; + stripPrefix = 0; + sha512.run = "e85dfdef7eefa2fedd6af7c0b6eb71200485b5190268de3a89cbec8dd15f8e66b3260430660f6cb860e2712d3e20e5a8d0b874592a71b116dc07de6e28161474"; + sha512.doc = "aba1badf34551d8340f733bb9e365a99c56c473f96ed69deadda917232ea8313df800579cb347e074ff0836553bdeb49f60330883581fb3cc7a3eeedc736d1ba"; + sha512.source = "8764595f95806d0aa8cd956bdfbec118f16376c936ae457d3d28c072eb8e2d6f0e7028fdb91ab301dfb587a721cc40fae13f56f5245b418413187f8776624855"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +color-edits = { + revision = 56707; + shortdesc = "Colorful edits for multiple authors of a shared document"; + stripPrefix = 0; + sha512.run = "e1023d734b7c8c2c781fd037f29a8c845a45fcd1c62d7880d51755bf943dba142fee040c2f0b9bea2ef6986818b5f67126ff468639c0d962d0a779f6840fb1c7"; + sha512.doc = "17322e4a1e9cd8cd6043a37e0c06bca019b887aad0100367b0c99b70fe3043d32568b5cf587cb42d0bdfe77cf18bf222fba126833d9a61789bba88bd121dbc4c"; + sha512.source = "b23f1893840a3a2a8d5a77386515c224656ca0c82aec3eb82209c862ebb222e8a2cdf4942bce3d43f4538bd380f9518fe031f08259dd063578760431a6230f10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +colordoc = { + revision = 18270; + shortdesc = "Coloured syntax highlights in documentation"; + stripPrefix = 0; + sha512.run = "a4d87deccae89f844a6251887e4d20817837fff4eef9cbd2874bef8890d41e0ab930a3ee55fae9ee46685c6b3b2b3324b54ce8507f1cb10eef332b7a480b94a8"; + sha512.doc = "a2e5c6699a615651dd31a570ba6524cc7cb3d2f3c8d4b1fe49092dd4c01b40714c1c534f3554fca20fad7c17fdfb7104b699a10677519f57538e239820b6f1e7"; + sha512.source = "2c42638129705d6e08375298684ff96c867a4deeb1d836ea12f8d6b0ad9f61f6840159ed04b92f2cac4c8d126da3a8e657589635ebd3388b9d457994bbc53a36"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +coloredbelts = { + revision = 68747; + shortdesc = "Insert colored belts (vectorial format) in documents (to presetn skills, for example)"; + stripPrefix = 0; + sha512.run = "0c2ccc4f77c74e551361b6c479759d10db1ab96bd293926e3fb60c1888e073094c4aed403b147744711b5210c9fc8e0cdb431ef8b778cbd12fefb4f691faab85"; + sha512.doc = "dbe9cd28b3bdac4b51d080edae7a983900fb2f9c583d7e19d0137d551222d23138862e9acb43de98c2f321d4abee3dbc2e43961f66227a5cf2c639545586ecfe"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-30" ]; + version = "0.1.0"; +}; +colorframed = { + revision = 64551; + shortdesc = "Fix color problems with the package \"framed\""; + stripPrefix = 0; + sha512.run = "a1e623ec218635694ae31046002648ad840f9f30099e8a7d453ff4301bf2855a47e1139d20760db4d53d69292a0e99ecbfb4b4ec37046d4023ba61249f701434"; + sha512.doc = "f3dcb1d97f012dbac252b097117573b889d5bb77490d7a2c6dc40e87e7bafc31b09b411fd5f764d9db915b3142c7549d411b28f9cd3adb63a1afe444899e3092"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9b"; +}; +colorinfo = { + revision = 15878; + shortdesc = "Retrieve colour model and values for defined colours"; + stripPrefix = 0; + sha512.run = "63bfe1dcdfd85dd1d7d3c7c8d3d345f221bc90bd34bd75888c361d4de97633b9c14d96930b41adf63370403c858f754e740c53d8100b9eb3c5557dd66e6876b3"; + sha512.doc = "d871a76648cd57af0bd6bd800ee8673ff07b2572ea514a3806731713d9ec4ab368fba2cf540ba71005300d4e02beb180f8eba82c0b060bcaa7a60e54ae601df1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3c"; +}; +coloring = { + revision = 41042; + shortdesc = "Define missing colors by their names"; + stripPrefix = 0; + sha512.run = "7c89a6c53212beaa06d54dc091021c5fd57cc30fccc917ea413d23b0790ec637b6b8e69a3bf1b44d0a9ed24fa1c0dd21608b174c0230a0a94a2e5aed221be033"; + sha512.doc = "cfe600ff32f680f7b7d3916e5a2e767732a9ab9f1e6d06133afbadc87dc1b8ac420284c75c221ed5b5a81b76f6b01302c5595b69439566775adc18ab11185961"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +colorist = { + revision = 70101; + shortdesc = "Write your articles or books in a colorful way"; + stripPrefix = 0; + deps = [ + "projlib" + ]; + sha512.run = "5ff0c8affd4c3fe364bf9832811f5536316c383c212a85d78cbff62af4155092f6602b3a82d6a1bdadfa5bfb60c257a3b066658ec1704b31e24e1844c61f2a2d"; + sha512.doc = "133f8e9e5e504aa069ed60e7549579064664bb375af27e9e6457bc0347201a5902c1a3c699c4eecec5485fa905c7f026af9fe8a2de3aa8d5d2daac8c95efac83"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +colorprofiles = { + revision = 49086; + shortdesc = "Collection of free ICC profiles"; + stripPrefix = 0; + sha512.run = "49be492e62fcd615b08bb6a32767cac54a9535ab859d2a27d1c84788d4e168df2a10133e5408ab1bd3a802ffa8465a61c4144cd9cbafc6fa98f995cb7af89381"; + sha512.doc = "ab7cabd369cdde5c2e5108b4d75d71bfa5e6b44d7ecc2eda25509078f26bfbc8515dd10a6dd82adab979170e12552fbecffca1f5bd3a1105db21b31097ec5f12"; + hasRunfiles = true; + license = [ "free" ]; + version = "20181105"; +}; +colorsep = { + revision = 13293; + shortdesc = "Color separation"; + stripPrefix = 0; + sha512.run = "3c6387a4c538235181dcaf7b6c3ac51d2893d35fa2c18d95d85810b778fecaed7ae2337d2b284ee3439f44d3570ee86884d42616539bf61a15526aa711da70e9"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +colorspace = { + revision = 50585; + shortdesc = "Provides PDF color spaces"; + stripPrefix = 0; + sha512.run = "677f462e9ec347467ab39f3c4e776b870861ed0a38447d61a50abfc3172936c99b468320ad40a5b43713df070434c0b280e2d9d13609e141603453fa7d6c37f8"; + sha512.doc = "702060f3a2805be7dc472bab428fad866e947d8f700f8357e897443909d555dee399ac857feb1e341875bbd4017e7e456c46c4282def6daabc092417859bc634"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3"; +}; +colortab = { + revision = 22155; + shortdesc = "Shade cells of tables and halign"; + stripPrefix = 0; + sha512.run = "460225705cfa914efc689df2d3f0c0ef7f5883082195e3d8e29e124726589fb5e9b7fc4679541b685439de097b6b297b803cf08e104ec13b849dbb26cffeaa04"; + sha512.doc = "947e46ffe5c83c3803e40f0da9a1a926e830e2b24f1d486d158da24bceade870cb1fe580aded3838f895deb238d1615cc0e3f95a05e99800fb1bad87ddf0b134"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +colortbl = { + revision = 70034; + shortdesc = "Add colour to LaTeX tables"; + stripPrefix = 0; + sha512.run = "3f1e703d76afea29b9cb9a2e1aed6e130b4be09982898260ef0e40f41eb99e9b948e89307c2d8b605777983bd8be46e874fd40080803d5b724f99f00c7b7a11f"; + sha512.doc = "412e8399bc8aadaf131fdc07de0148c7fefa1e207788a8e9c4a82914bb99f75a3c352f60f958913ea351d31571a17c8e3b539917e72fd2b9b83b0c04f0e3675d"; + sha512.source = "05de4cb9140c7abf6be215a1485e392cdf12108d64716407e6605ce87b946c062e568fa264d3e78934a685d91f5bee38ff737a86d9a4ba54c9c9f77c7418a349"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0g"; +}; +colorwav = { + revision = 67012; + shortdesc = "Colours by wavelength of visible light"; + stripPrefix = 0; + sha512.run = "1f0ec92974581f7a1d5d36993eaef84d46019a345f1ca9979d0508b5dde7226cdb38e102dce02d404a4d28f8c408cb53cb0b3bc819905935fc9cd323abada305"; + sha512.doc = "c9d23542ccc17980837bd49012889a8e11fb87f76bdd3c5ea9650177ebe527533cb5ac3631895f2455b094ffb4c6bfa973fddf9f071c80bc52c3c824b1fce471"; + sha512.source = "d41960edb1e83edb50be56a6eb43025cfabd5fc3a83ae068daba59276e9b5995f25804311398ff6874038587165b6c236dc983247f52399ab55e156417bf7adb"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.0"; +}; +colorweb = { + revision = 31490; + shortdesc = "Extend the color package colour space"; + stripPrefix = 0; + sha512.run = "dd8e53aa707f1e73276cca9a9c5732b012ca7dcb0926d101c71aa5fe3829f07251a7f606accc95266f6c9aa4b867a38cc654ca97cc32857edc3d196b2c5a7fd4"; + sha512.doc = "b1ae7c14f2f07405b7a957831b60829046b058f6d1640051cbee877100c98a8f47d2c1d40f60599c42ff90eed246248b4f48dd8c1d31f9d45082f9ec5c341626"; + sha512.source = "4016805ddde5974257fc9f20a0f4a8e40b12d059ba74ed6425f206c4b10127596d579dd8c057e85289e32dc1652b2258f6d2590ec6d4cb10c72aa4a874158275"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +colourchange = { + revision = 21741; + shortdesc = "Colourchange"; + stripPrefix = 0; + sha512.run = "dba4ef8d97324c3da71de1c6a37e268618bab0a876e1da37226ec9fb187087d39f32507e97f4ab4fa801fd4bbb98c51a322c6f2493b719133154b24223bfba46"; + sha512.doc = "628bc515058108ba97312c15ee5af00e086ea3dc124b4e7b038b176d4175e2146afc6f571593c006d749634896fa286d16c923c17d4dc9e55e81ac3a8aa95442"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.22"; +}; +combelow = { + revision = 18462; + shortdesc = "Typeset \"comma-below\" letters, as in Romanian"; + stripPrefix = 0; + sha512.run = "17f1beb58a11f3c754c57331d1b2d9338fee359b6c27cdc0a855671397e78c0b2d29ba60247f3104d3eece22619671f56d2aac862ac404502faaea08f40d7be4"; + sha512.doc = "82d8e60a5cd8d46b952aa27dff03398cb6e65a1c5a76c1eb260d3e30172af89206a7a8ec7ab3871d5e33e87ccc2c99e2f54740facfd71d43ea6f88821c9ceb2a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.99f"; +}; +combine = { + revision = 19361; + shortdesc = "Bundle individual documents into a single document"; + stripPrefix = 0; + sha512.run = "9e57b01fa0a14556473764144dc3b5e4e3d40a7f913932b02826a68efdd952adc69e990ba75f6b5057d69850d3e693e1c5b5c40d2c3443aab2741ce9646d522e"; + sha512.doc = "4e09fd0a9b587d61da2c6a15579675b9a839c83f0b38b0f958b2f4aa2c0a49adf93730ebafa235043cf645d6b8689cbcc5916e4bba92b5e30ac87a8282402859"; + sha512.source = "25df0ae6e799710f575de4aab975f774f53abb28e627547cf61fe68a4de18cd1f9fa3a8cfd242ecede15e6363734844a8ca37b49da7bb4efda6bc90f4f1da168"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7a"; +}; +combinedgraphics = { + revision = 27198; + shortdesc = "Include graphic (EPS or PDF)/LaTeX combinations"; + stripPrefix = 0; + sha512.run = "22d36d3a44fbbe5f11522f28e716be862d354998750492d014d86037a24407a748248571e50dc99a6fe5518d8ecbf61ca657407194a43b75510b613438fa4b65"; + sha512.doc = "4802871f57bbc131c850f89eef43778ed25a9abb0a850dac0e91e762b7a321567348f147ae02847cad4c226f9acf2bce921f9745832d1dc298d751b8123741b4"; + sha512.source = "248524984e09cfe3a2a6bafdb0011d3470035243807635dff3ee6e6bd5c7d2ecb0483e7ce069a76f1589dc5bc2da4aab2ef94ce9ef587915a03d285bd95965ad"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2.2"; +}; +combofont = { + revision = 51348; + shortdesc = "Add NFSS-declarations of combo fonts to LuaLaTeX documents"; + stripPrefix = 0; + sha512.run = "838f10474c2e89f317df4592443deaec3d1a3310f7bb2b458c2a1b29a03013c4274912020ddd9b5807bb6018b6564c11df7b14b8a6db556e8db58dd98049c002"; + sha512.doc = "ab322618efb3cd8089e9142a28800d34724e499bacbd0cc4a0db14a409bea3cb355f50d412f92862f53c0a5f91fef8af7b652b21be0596cc9687e4919f5122b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +comfortaa = { + revision = 54512; + shortdesc = "Sans serif font, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map comfortaa.map" + ]; + sha512.run = "6b851b6c56ef5b6ae6e59c5a3606238671af34963c5dfb8a39a9bd6b84597f673d12963abdd687013f11edade4fb9ae37794a4789650c38c29f64bea1d41dea5"; + sha512.doc = "b1b4efa42012646538316af9bdd5c724f285aa784e18e85a1239376dc02cf1b79bf43bb0ce07a822995a82811eb6562e6943aca0b903f9241bda088ac0675fce"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "3.2"; +}; +comicneue = { + revision = 54891; + shortdesc = "Use Comic Neue with TeX(-alike) systems"; + stripPrefix = 0; + fontMaps = [ + "Map ComicNeue.map" + "Map ComicNeueAngular.map" + ]; + sha512.run = "5dc900d215fef53fe69ffda6e9120f1230173f40d220c71eaaa3d7eb21610b214591bdc043f27f0fe5259daf2a800b695167d2deee1810a67045997aff7c2a76"; + sha512.doc = "24baee44951d9dc6fd70b6b6092112a1d7d13c394eeb495162c3f80444ebd799b526acf7b7c86b7590afc9f5f6efa97c10b661ddead6ca11a168325c7c840650"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.2"; +}; +comma = { + revision = 18259; + shortdesc = "Formats a number by inserting commas"; + stripPrefix = 0; + sha512.run = "65c21bca8e6a707697847ff96d1cd909cbe0c7d33140b4b175a2e3464c1c67827cea9c9f65e45dfcd31fcf2fd94262daa907358341fddf351241753ab47ac99c"; + sha512.doc = "b25433b52a32cee71043c1f13d2ca45beff32733ac24259f767b6093f5b5f38e0da3c88569bcd637267397c49d26e546c26454381cf916040c52a2833b02df65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +commado = { + revision = 38875; + shortdesc = "Expandable iteration on comma-separated and filename lists"; + stripPrefix = 0; + sha512.run = "c5e48910b5e685c792b9dfe191cd8666472e24e7ef6d6c2fdb3bfb05b2f39f4d4ca68cc7b859d07f50e5d596250e36e1664e1ca48666b0e3126eb8c91d27c384"; + sha512.doc = "457d03b34ba53988ff287060d18f993f8e01ca99991505c5373abc05cfdde4cfcdda8fbb6dc3737e91c66ef0b30c083c31e64e326c08d4959ff8ed1a66cd4d33"; + sha512.source = "e0f280bd901ae306f17ef58686345ca38546fd635dde274456af67f41fc05523a91c1f0c0a2b7f433c992193a6442f870031459071a5d7fd6c12f68728f24809"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r0.11a"; +}; +commath = { + revision = 15878; + shortdesc = "Mathematics typesetting support"; + stripPrefix = 0; + sha512.run = "68c25e035e211107c65eece91bf84d65f2328ebaa3dc81d70186707c081f865abcb1be383cecec7d780bbebf3f565647406d6bcfc2c6bb3e846058d50882a6b0"; + sha512.doc = "5d1d162cf8fd6692788bd15e2d3c2021fa6ed96f289f2c17e9d7e9d2afb428030f0d016f4b4aac62aebec1c8988aa1a978f71bdc7f4873e181f1b2ec7e0f6d0d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +commedit = { + revision = 50116; + shortdesc = "Commented editions with LaTeX"; + stripPrefix = 0; + sha512.run = "7a2248fc7c3de4755a68dfb769c0862332f41945a5efdac8f0b9911c3479bc45cf72ef0176d8d2ed2abe127aaf388c17c90d1f58cfea4aec8bd9e488f2d96c5f"; + sha512.doc = "b8c6fbb8c67aeb878fef32bb6e61dacdb3ebf9bb7ac92bcdb685bccfac8129ee3145d40ae579ff77b097fc81ebe0438ee5c50c6bc3df156910a287b368728c6e"; + sha512.source = "19db6434ff564e454ca44fee29d22bb6a930b9f51f54265955565fffd8a7a4a1be89e3475c727a47c3723da99160f4d9ad9899321913d8739821c6491117c843"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +comment = { + revision = 41927; + shortdesc = "Selectively include/exclude portions of text"; + stripPrefix = 0; + sha512.run = "36b5b4c4d4345a4fcf706f5040c02c2de52567fae76146a06b7f084d59b12d151e65faba1ee4aeeaebee018d81200c2902feb81ae575de35a68c00fa14ed6ba3"; + sha512.doc = "d5a360c6a0c549fee1d46fa0e9c3f9aaaa4b19b30ac48046e736008ddb42393062824950684185175f8ab569cec221bc8f9a798a07623dbe26cc92a3fd6bc72b"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "3.8"; +}; +commonunicode = { + revision = 62901; + shortdesc = "Convert common unicode symbols to LaTeX code"; + stripPrefix = 0; + sha512.run = "a395e5ad2b08ffd1a29b99c66b65ddb7ab3d5207290db71ba85a0058a5404f0366030d229c5c4bc8a4450bad0a0da9fb5f6d374be2c05cbfa7a8217fadca7b11"; + sha512.doc = "dcb1071fb36eae56f6aa8b90e5b88ad32566a5dd410cf9f25c157789fac73d38d24965621f8517980cebbabb957a62f3dfc9445e00c83ed0fc43a11306684029"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.0"; +}; +commutative-diagrams = { + revision = 68044; + shortdesc = "CoDi: Commutative Diagrams for TeX"; + stripPrefix = 0; + sha512.run = "896235dcfbe5fc65302f5473b8821a2943ba3bce0c5b410aca855f48fd2ee6dd1b39667be7413aab027e0b36b3cad9735cf6b8406077b0c833f025fe41a83d04"; + sha512.doc = "49de0a9e52308dcf0b5ee7ca5b18df49efb3822ab2a46024e787979abf6cd682b180a461868c565b79607b301ef5bb65e9493bd27d9cbbdbe4d71472708fc01d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.0"; +}; +compactbib = { + revision = 15878; + shortdesc = "Multiple thebibliography environments"; + stripPrefix = 0; + sha512.run = "dbc3bb28178a656b400a2a72e48ec813d6e282ddba7c70bb4dd0b5ed7f76e9e0be1dffb0ecf43e4893210453ef420c1b1d859c287663cad6bfe8c7f46dc8d86b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +compare = { + revision = 54265; + shortdesc = "Compare two strings"; + stripPrefix = 0; + sha512.run = "16d6ffeaa66c1165ce4c6795ff2f73e0cc5a811045198db6e7aa2556bc6ff8b20883478011fae9f06400475f9a96a57fea34f7513b7fbbb392aee03dbd30ad01"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +competences = { + revision = 47573; + shortdesc = "Track skills of classroom checks"; + stripPrefix = 0; + sha512.run = "e5b2b3a77418d5bc55e8fbbc68c39b1852ce6081b00bf6115573ac29cb7c2b8fd70392fda9b04edca5c3aa1617424541fef2da4d2f777c433b8ee168e850ad99"; + sha512.doc = "8a0078f2a3c32f03aef58a5d1ba4167ac4c738103d65cad9a5f4bae67aebcce3cb7a16d6aa27fa7b83955c95b28c1f70a0404f5633e3231c3b6d4232265e6c53"; + sha512.source = "2fb4c80d75808aca093a664bb2ef152cb4ca6bbf1ba0253c2eeb6ece3cdd2299cf7f183423b65f47655128c3b374eb756cd870cc24034da7aaae206216e79fef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +complexity = { + revision = 45322; + shortdesc = "Computational complexity class names"; + stripPrefix = 0; + sha512.run = "352e1a308e159e432c3123afeba8b173b28e164c81b4874273ddd3f8bb8c8866ef33ba7c06e061d52a3845eafb3307b045b82c9da5ea6a812f3808417fa074d6"; + sha512.doc = "2ffc63af2d86b7dc121c6e122ee1d23387c4c73a6ba65b226413671b86644d0cd9e9ec646b3eef49d9c4b2d64575d83ff45f3691337ba1dea6835945ca80de13"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.81a"; +}; +components = { + revision = 63184; + shortdesc = "Components of TeX"; + stripPrefix = 0; + sha512.run = "e7f8aebb11919cd389648b1417c9d43f163858b7de28592998636a69003274d3825bb23f8faa2c29101d51343d9865780523cd95a2a014433399e2373970a116"; + sha512.doc = "f64c61df38424c72abbb778e7e39023193562228bc1eaa3f683bd81f3eb61075c4948b75a47d81946f4acf1cb5affd242309b95a248240ee413b8dd5dcb40a96"; + license = [ "gpl1Only" ]; +}; +comprehensive = { + revision = 69619; + shortdesc = "Symbols accessible from LaTeX"; + stripPrefix = 0; + sha512.run = "57419ba4ccf74c6d01c7ac972e4f02bcb0e4f57c7a3eb790b8f6de10ff71318ae0b4dae2f836b4f36d3c63fc3b9c6594b628640f2dd850b97dc9dbc5d18266ee"; + sha512.doc = "8d6e7b2de1d4a89e493d0ebc9b1e1a7e11e0839089d06a36f2cd8d0df47a66642edd8ab20e9688e18f6eac70d803da3edee1f8588fdfdb7bc3e46dd993523671"; + license = [ "lppl13c" ]; + version = "15.0"; +}; +computational-complexity = { + revision = 44847; + shortdesc = "Class for the journal Computational Complexity"; + stripPrefix = 0; + sha512.run = "639ae984ee1b581260434ace517d8209843127795e674af045ddafe16838946bebbd2dbeded45fddf62ec0a49b1a30492db0cba4ad1e5bf65530d1d5a5df9198"; + sha512.doc = "9daf1691d33bbf00b67b82cc29de0002e1aef968cb1f182bc3d722082582ed7e60945f74675b48a87baf67aa9f5fee4a167bf1548d3312492a8f570feda93ac8"; + sha512.source = "37d9b700194fb1ad6cd11fd9008aa1634a6b425133365819b5f76ec349a962e44ef43e8c18572fec16bb4f7b44fea29bcb4f01936016486c3eee4d44ddfc5ba2"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.25f"; +}; +concepts = { + revision = 29020; + shortdesc = "Keeping track of formal 'concepts' for a particular field"; + stripPrefix = 0; + sha512.run = "2fe917ad25df3b14bd3a20566b97a7ece0f87f79ec7ef10bcafdffde1834f6fc4bfa6775a7ec8d044e5f3ad241913b2664a7a5c25893e9406de26c0a1008d25c"; + sha512.doc = "5519f645d55e2a3e4e5f9156bdac2ea9e4ad4735ec9104255e75ea254f45b135f0d635322cf46a5536e8600eee1447ab48753763a4c89310e92d51c94c4fde80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.5-r1"; +}; +concmath = { + revision = 17219; + shortdesc = "Concrete Math fonts"; + stripPrefix = 0; + sha512.run = "1e2fd3339fd2bf2a48967102ca42c930ff41a5b4a9fa850cbce6aa2ed701ab351a5dfb931ed80de34aa13e18ab2b01fa2893f981fc671d6399f4d55aa9f8ea40"; + sha512.doc = "05dbb0a6d89d3f72f3d77824670afb29e6ea8dbba6d37255f6a36006a6a6b630fb56b12815ae3075c41dd698d6a85c6be7ce1dc2da9b3b69b636fcd8c4855a84"; + sha512.source = "6c4a5a4af907174df5fdeb77f0c4d0f554c2b8ac0d95031fe98f4a748bc4a96c7a526e44229174ffaccdec5bcf086722b355b3c4dcbc4441e1a67c91a71376db"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +concmath-fonts = { + revision = 17218; + shortdesc = "Concrete mathematics fonts"; + stripPrefix = 0; + sha512.run = "65b3f7003b8aaaf6565bea6a65da11f42dca2283f1d53710f4b476a48ab39ae6fffc1d0f9206e23b66047b572c28e793e1a75d047f1c1a892fb4e7c17c854741"; + sha512.doc = "7b2db9b8f2f23816cf413676dfbf6ca3413a39bb20cbc12070b9202bd2e98714a86dcb5f27a746ae197efd2284eb794f06af1b2941667abfddb72773ceb61378"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +concmath-otf = { + revision = 70337; + shortdesc = "Concrete based OpenType Math font"; + stripPrefix = 0; + sha512.run = "87b99735bef0cb6583b153794c64f9b4d76a65da57ca6bf7fcfd6f702bdb32c1cc690be32dbbf2247cb45ede15045d892121794ebc0887eb0f4804990be1172f"; + sha512.doc = "6faa741f424a42088e336ff5300daa2dbd28cd71eed6d4047230c7ac7ecfad5e8de3e881216721f89f9b706397247c01abd99ea4d0a7ed097aa6d63c8e2a89dd"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.63"; +}; +concprog = { + revision = 18791; + shortdesc = "Concert programmes"; + stripPrefix = 0; + sha512.run = "f650acafa4ffa424451f338d6432d665ff679396ed367650d360adf699d3b1e7d8d23f5b3fd070440cb4d6578d07978bfd02960c1219eed6c8594f110708e5cc"; + sha512.doc = "bf4d76362f7a764ae4c7937edf05a575b3faa8d6919c6c857ae350b742f53d6390546263d14958dbdfd423c9b45a7f9eebe862a00378f51c754b5fee65f60bc0"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +concrete = { + revision = 57963; + shortdesc = "Concrete Roman fonts"; + stripPrefix = 0; + sha512.run = "9bf9621c120f831110f71cf8d53ee5d4d42869da8c9b2c653125dd6cb6eb9b8d264116645753ee34dce1076204e008d9e74bd0596b46ffac596cc7726b0c75a9"; + sha512.doc = "c70e9c299e69daa29e9471293b59ed4bf375b8314729381c1973c5390ec5d73b3cffa16db8864e8d84466dbd078179e98b2ffa3e6466d67441e30efcd02676fb"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +conditext = { + revision = 55387; + shortdesc = "Define and manage conditional content"; + stripPrefix = 0; + sha512.run = "60619cdd5031d0fbd2f9e4e8614dacf8f439282787f6230bd2662bad21607720757a19ab27ef783a36a6a19299d5960fb786d8cc787e471a46e89f8cc2e7c866"; + sha512.doc = "3949b2f03c86a922d306cab525a5ca321509d64cfd73b99a39e3404800f63f15e262921e2c1e8eedf98ba2f6cbdda00dfb14e54198af5b7438afdea4572a86ee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +confproc = { + revision = 29349; + shortdesc = "A set of tools for generating conference proceedings"; + stripPrefix = 0; + sha512.run = "b6e054332f7f6a239a6eb102ae4b022f90d9523628a293517b1d070602290bea8e623379b5c246fcd5b8daae29c9d32d02a8a7637cd704ede5b1b928de4536fd"; + sha512.doc = "0bd697d12f1740257e89cd5853aac7340659350a6374c32c5fc22da4249ea08b7e176dc499712f4c2cac6641c0161394ff0433513f7ce1942d50ac69021c14aa"; + sha512.source = "f8530a8106931edceb4c5f0b87022092fc85368966e5029ab25e9f2f19cf95a3c97694dcedd5a78d707b4d9e4a9f358a6bc4f92084a49dde7d6100b50e77fd1a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +constants = { + revision = 15878; + shortdesc = "Automatic numbering of constants"; + stripPrefix = 0; + sha512.run = "c4f807315c7f95fe7945e937e750ea18c346a8ecabb80a39922a9b861e3cce3956db31c55e68a0d3417406284d7187fd3b1d1c336c0a130eabb07e4bb60503ca"; + sha512.doc = "2712e46552a8391b0f2a95991368882a393007788cebabe7ed6c5a604eb2085b4bf00749c6fde3c88028904b7117cd4865b964d11eb443c6939e734495d4df2b"; + sha512.source = "6ea97687aa1f8f1772ba82a09b251c557b3cbacd056a27fc45412c9d72161d04814c9478bc495ca78ba2f8796ba44b3c29ff70f94382cf173b3e6ea2eb7dead3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +conteq = { + revision = 37868; + shortdesc = "Typeset multiline continued equalities"; + stripPrefix = 0; + sha512.run = "ee0f344ed0eab872aca3c54422f83a6f8bbed2462a22cbd54dde075ceae79dc5a01ef13947327ec726d5eeb64eee5519e4074c138f4d172bbf2b4024eb88ceff"; + sha512.doc = "edf52893cef8c5f8538a64d626a12725b043c5f0106a63f02cad91df9ad632009cfe3da51149750d4c23c12742c00052b951ada957b89641d9a0da59e93396c8"; + sha512.source = "d3796e7bd679bd64c59a8d16e50ee7e190f9fe3c0774ece399486f8d5df7f6f63ec8a0c595572be305532c66b94011a92bde3bb5850f2feb4ec162e3415b5102"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +context = { + revision = 69665; + shortdesc = "The ConTeXt macro package"; + deps = [ + "amsfonts" + "context-texlive" + "lm" + "lm-math" + "luajittex" + "luatex" + "manfnt-font" + "mflogo-font" + "stmaryrd" + ]; + fontMaps = [ + "Map original-context-symbol.map" + ]; + sha512.run = "8951a79ae04a0bbcf7ec5f4d5f68e0f6ad3f79cfcce7379523b9bc74dc6ce3d0f07f628f3e182198ff37d313ca549b7b2512eeb28ce4a9c5460ec20ed7f2d2e7"; + sha512.doc = "b2558db5417c5c1ca10dd80be258fca33d9e5fd1b16c3f1baa7c871bb4d65e42a75c95336ae988864e7c4dd350c722eaa96c446839ca6d147949b38fa78461d9"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "free" ]; +}; +context-calendar-examples = { + revision = 66947; + shortdesc = "Collection of calendars based on the PocketDiary-module"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "aae09b844ae244839f82088ffbad9c777355696023fa95c24221b6ae0e4ac6dfce6a4d70efe9f09d5e5dc89e6e7a17d98282a77b90697ee6a3496ed0568734b4"; + sha512.doc = "62a63d54d0388a027cb6afa58141a6fc303fde6cc0f989348fe29fd10e825a03d86ff682f480723b223b606e296591cf03092c886cf13cde03463ff8012caca1"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +context-collating-marks = { + revision = 68696; + shortdesc = "Environment to place collating marks on the spine of a section"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "dec8338854260467eb5d6542d4561e38a87183290e53e75c3fa188fc8f537a466ce4a5974f4f5644b9f2e62591cd4e8860f8e2b314c8918ae45e90e00c61ba4d"; + sha512.doc = "6a5d88d6091e95025e7a4f12a6e831e5bf462156afa06c7b49d35086f9b555ed8fc1ed9cde970146106f3efc29b70bf0699c1b5eadcf970c1f8978c46ad590bc"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +context-cyrillicnumbers = { + revision = 47085; + shortdesc = "Write numbers as cyrillic glyphs"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "14a90656d706d68ce441301aa6bccf2033c36f9c8d8605ec9dedeeedb71a5670dae325a5a198b2ca25373eb2b495e57fff31b85089c6c0fb987738c76ac636b2"; + sha512.doc = "d95b1df26033aaff0a9f6759268ac3e68bff02556001e3f9b2bae1db68aa13c839a87047a6ae0a296f8e5817398ba35b7cbacc4f194dd93cf72684904190e7e3"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +context-filter = { + revision = 62070; + shortdesc = "Run external programs on the contents of a start-stop environment"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "c2534b543fd5444776a054f43fafa393040af5bcb67f869d61d200a4a1d0355f1d81c64adab683d15a6be806a21dfc9ad661995bbe51da3c0bfb841ade4b077f"; + sha512.doc = "a9c2ea88b0e2514840c368ea7686894dda4b86c93ec8f34989238ffdf5704f1c1898d0ee5e0724035314d2d37803f1a1afdd445dd802a94f5ff4223148f81767"; + hasRunfiles = true; + license = [ "bsd2" ]; +}; +context-gnuplot = { + revision = 47085; + shortdesc = "Inclusion of Gnuplot graphs in ConTeXt"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "d3d7dce105707bd8fd903038e458cae614ec63da7932231e1f659570ec3a7960ea0fab338a8405f2ca8ce8b03946b58db8255333d2a4ab5a659566f4d272b0b0"; + sha512.doc = "40e471b27d53ced33590792ac62992a220357c6db1c78cba901197362a36817bc14b049f2573ee2e5b5adad5182c5bea2880c4f7a2477bcd1a06ee7ccf88b0b9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +context-handlecsv = { + revision = 70074; + shortdesc = "Data merging for automatic document creation"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "b4a38aa0e04812e328e3d6225462078ddf45d8791d789e2730461630db55b397754ca192acf37b9ae7f1fc10c61d412022a9e56d3465d19ceca7f5875e3d580f"; + sha512.doc = "763f75ab94a317788d9d96b88f1b7e25847ed316b4dcd84158719ef1c3cc48c90c884ec3158412d574839adf1ce8bcb12f9c0cefb6650338afa424fbd0213be3"; + hasRunfiles = true; + license = [ "gpl3Only" ]; +}; +context-legacy = { + revision = 69173; + deps = [ + "context" + "metapost" + "mptopdf" + "pdftex" + "xetex" + ]; + formats = [ + { + name = "cont-en"; + engine = "pdftex"; + options = "-8bit *cont-en.mkii"; + } + { + name = "cont-en"; + engine = "xetex"; + options = "-8bit *cont-en.mkii"; + } + ]; + sha512.run = "79783a6096e3bbe21eff5967fa3ed4edffc573567bd027a59c40fbd1f5e3cfc7d0c213ddc9fabcdecd596bcbc9946cf4255edc4237f0148c89dbae7744f3f508"; + sha512.doc = "6fbf5f1194771c9dc4a19b49aa343656bdcad3620e14a68a0bf9d05cad8f8c813f717b66b12526c2f11a87d4ded75e1cab56d3e72ca1cabe81c9818aa11399a7"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "rb" + ]; +}; +context-legacy.binfiles = [ + "texexec" + "texmfstart" +]; +context-letter = { + revision = 60787; + shortdesc = "ConTeXt package for writing letters"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "558836a8c95743270f627a18dfe7a29ffc7a2eaeb4cf663d589ef5c07eab4dad6f09db31511379c90a41d1e9e7da5766e8dc3c8bb0902fa06bda4fb33caa97c9"; + sha512.doc = "94e1bf68371f3e8c426cfff5c471f93c86ce51fdd92dfad59669d32cc73d86de606113ece55d13a0f25ac4a26f16916407de9175b84acc79ba107156c20cd20a"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +context-mathsets = { + revision = 47085; + shortdesc = "Set notation in ConTeXt"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "e4c689c745d06c61d6f693a9832001aa8c79d51664c2a5d6d0c6148a95b30870063f50eecca31ac0924193c6dab8c12cd5ccaca16eeaf5f83a99cef1a8889ec3"; + sha512.doc = "f2c33244814da8e8838483038f507fe6b3e146f37691e55a37bb5355985d2af4c5fc423318133c4f13837a3e66a4fe72d5c14f6721bb5ee0417a59691b86d3f1"; + hasRunfiles = true; + license = [ "free" ]; +}; +context-notes-zh-cn = { + revision = 66725; + shortdesc = "Notes on using ConTeXt MkIV"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "46be6b5f9f86d6da5514f0ae0cd77aa9beab67572699f9779f3a6cd461a8600336103eaf71d6e6d99fd7ac300a3e5fedcd6e378d349cf648c9aa5a8be2aaa5b5"; + sha512.doc = "a49b1c85508128e0a2e9ae0218e3622f7479da528f51380c1e109bf877f401531689e8119cab3bde6a91e507f0bd7f16e334cb3affaba7fae5927cc23b17a207"; + license = [ "gpl3Only" ]; +}; +context-pocketdiary = { + revision = 66953; + shortdesc = "A personal organiser"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "fd90eca9b9642a16aa203984165302b111d4058ed970aab3867018f48d16884fe543d3067a0ad2fc2c0e2684924ef11e9788a7deacb20ad06d7451dc5b19383b"; + sha512.doc = "a78ed374f6a7ad63a93aef4c9cb2ecc0937c2e3df821c543f49a3ad762ed6949a7d1c4c5a03c7cf54eeb0b9ad891a18c5d10b97a42bbb840c74fef2bf8f14cfb"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +context-simpleslides = { + revision = 67070; + shortdesc = "A module for preparing presentations"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "083b1f0b70a74a3648501314fa993632534f476376fb80eb4444b0273866bf4a4d562e4bfffbd14ed79be0020361ab6cc5c40fde1f99544b76d6f33939781f19"; + sha512.doc = "e7a410ec0d99f945dae91c041b396875a6350aa06333f5a5d2d7aa4c6bb62f926ec53a27a1c95a724ce7b320ddef11d6550b0b92a34c00ac63c7c0da96a35928"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +context-squares = { + revision = 70141; + shortdesc = "Typesetting Magic and Latin squares"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "1ff4b50cf1bf75c6908b968c0fa35bdbd3571ef680ccf591ce5b0bd65370bc1dbd3bbb54b55c881d4d76ad09aa36a496248560874ad6e14e39b5f94cdec5ee23"; + sha512.doc = "08b652e69c1719991daf36b9d9360b5736c25283ef10bdb5859bdfaecf1dd3a47d7417b9884d7bf51a32b073f99e08f35d8f172ff0d6a4817923c00f81dd6dfc"; + hasRunfiles = true; + license = [ "mit" ]; +}; +context-sudoku = { + revision = 67289; + shortdesc = "Sudokus for ConTeXt"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "b33ece74cc5578c4dca8df816715d7106b674fdc653d149992cf637b11799a21eb03708c0efcc79da9d4658c5f8a801c6bb32dc681f43f3d4b3900dfa588ca99"; + sha512.doc = "e7f9b6c0ae6bad729074ffb2e4e1673336954adb9013ee6525e87715f3d22720efbe1f7e2cb6b695e01940a4d7f58489889612749ea2f4dbcba3ac6faaa741c4"; + hasRunfiles = true; + license = [ "mit" ]; +}; +context-texlive = { + revision = 66924; + shortdesc = "TeX Live-specific helpers for ConTeXt (caches, papersize)"; + stripPrefix = 0; + sha512.run = "64abf080ecfd9cf68f2ef12123ca6ee976d6fe3cb8382d34b32f424a1bfcf9165142bab2c1a9a1f394e1ed4bd53aaf2875363e7f357eae48ba00ddfc894e5d1f"; + hasRunfiles = true; +}; +context-transliterator = { + revision = 61127; + shortdesc = "Transliterate text from 'other' alphabets"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "f919d3f9e6ab25932cfaeadfc07f86ebdbe00d84dc21236e4775930fc3866cee69cf9a25d373e13655f4396a3c395ea6ea103a28ffb4f00a4e95b7ceaec155c9"; + sha512.doc = "8473c1ca7b48009055f5c33031ec60f80d84dc43396789b0c0c7e6d65bcf014a237088dca07211beae4bfb80377f55cf12a9f379995cff50f52143fc4bc81295"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +context-typescripts = { + revision = 60422; + shortdesc = "Small modules to load various fonts for use in ConTeXt"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "a13d06b9a792cbd2352016df508a7860e45b541d04cef1c9d9c8b5a6199120a71dfd69f990700c4a76ac31ec11209caef431a190b9045bdc46cc44f88cbef0a3"; + sha512.doc = "3d948f22da14b1d481817477235657cee714e4a2a69834729c20e18157f1175890ddc7fce992e8f5f27e26cd6d08186ff1521e2186681557cfff1a4778267324"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +context-vim = { + revision = 62071; + shortdesc = "Generate ConTeXt syntax highlighting code from vim"; + stripPrefix = 0; + deps = [ + "context" + "context-filter" + ]; + sha512.run = "12100c7aa3eb555cf9dbe72454a96e63feda52329a8a192ff86ba30477acab4ebaaf84c15a79f16d4e3f95cef02baf8146e5810b8c9e8e94c25ba1317bf4fc2c"; + sha512.doc = "0f49e22b9e1d465f46727a9e952e095eceab55e77a2559fe497cf14690377f77ca42aa23ce7eaca659e9b0983e5a950b36733eef49b0473fd33a8f783edb43b1"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +context-visualcounter = { + revision = 47085; + shortdesc = "Visual display of ConTeXt counters"; + stripPrefix = 0; + deps = [ + "context" + ]; + sha512.run = "da7799ee31a4298f8e8cb02cb4e480fa49fb4188b776df877648c663c93523636bdd7fa6ca5eb403fc8f3483064bf223fed042c1d27eb0817c224ddf8e21c673"; + sha512.doc = "1788355ea4109e7e2bbaa9bbc3798f60a814d549d082638a59a453cc5fb39b54ff8a00471a28a96a5501e91899874ae19981ae0f8a09b6353d19275b851b9f80"; + sha512.source = "39bba551e9f0bb8d70c0b60a2b0fba3d7cad30555d4052fc6ae722bfd9cb79d5cca784474a9f1847faccccb1618662bc4dd2fadd1fdacaf2f4cc9c035b5501ec"; + hasRunfiles = true; + license = [ "bsd2" ]; +}; +context.binfiles = [ + "context" + "context.lua" + "contextjit" + "luametatex" + "luatools" + "mtxrun" + "mtxrun.lua" + "mtxrunjit" +]; +continue = { + revision = 49449; + shortdesc = "Prints 'continuation' marks on pages of multipage documents"; + stripPrefix = 0; + sha512.run = "42cda9a2796e9006263320163777df7046a79e38cb2c0ffb53f23c27cc03c686e00e39b066228b09ca99a6e5c2bf4a6cb32d5d7c49b40cf614c542e258968ab9"; + sha512.doc = "0b6bbf7c3123b7e741255bd3ff9e020ec61bcb81a236ddec41e709f14de514057d9b902ad783f48e5c04ba1ca6daee31a38f130649cb0e5b2d548ca9689d5dca"; + sha512.source = "790671ec666983e4ff5ff594b7df54cdf7c9d136d57f9004f5400857c3001ffbd3a13a5fc559f3ab75a168c66fc5aa2ee3b5702e5ec417c9a31a1e65d18b801f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +contour = { + revision = 18950; + shortdesc = "Print a coloured contour around text"; + stripPrefix = 0; + sha512.run = "0dd4a28f97efcfd0459595776cbab019168fca48984d78f9ec17e0f3af9dbebd378adc6649bce6a9a999651c75316f3ff44e0f10e208465dda2d904d080c41d3"; + sha512.doc = "af1c649d2e5666ee3973395babce4802da2154ba95fa7fc08e378c261a8ea1c5be44053c40c5cc1bd0c74e2c54b659470c3d45063fbbd4330cdc5e664f19bff0"; + sha512.source = "377b4a92031cd957b15d232cda9e4c2e7488a4c71624eed06dc2edf9dca37afc11e18691650ea377da2dd78b5f636272eeb6d94bebd99ad5ec1ec477f7b65784"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +contracard = { + revision = 67201; + shortdesc = "Generate calling cards for dances"; + stripPrefix = 0; + sha512.run = "eb705425aa67034ddbf4390165a5f6a9690c67d34371a720298843d1c7292655bcb59a56364bdb510608d48b6590931abd68216fdcdcd8be90eddfbc339ce28b"; + sha512.doc = "046a38d7a11edaa8f67648996c31e481cd818b79afb1f971afe459b7adf0bb3d4f5cb0afc3903177bfc0b9b0678336a837002f8db486916afc24445a875c3285"; + sha512.source = "67bf64418fde78f9ea7288f47efaf50970f133325860f0283ed2842f58394417b4e8ec8f0180cde60c9bb74cd1c797aa6f89afe3fd033676681807cd25d5cebc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.0"; +}; +contract = { + revision = 69759; + shortdesc = "Typeset formalized legal documents such as contracts, statutes, etc."; + stripPrefix = 0; + sha512.run = "bb37446d3eb0f736014ed0c589b1ae86d25cb6fe2374906f375047317b74e9d4a608a4ef32bf11776f37449d59063bc0973e9a2c7e83b747480b8b73efaaf133"; + sha512.doc = "7681e863e95f295e0ec98d0aaa789b1089fdc023feb04eff3d028c4f0c19e9d6974e96350a25fcc7810e7dabb8cf43551ad0fc2d0cb1b9684c4bd60268082d32"; + sha512.source = "3b9d2277c2e1248121bb27446dbcb8b66ba6b7264b7c9502f1ef0691c66050c32b0dd6975cce60cd6c0d70228a88fbc35433ac5dd62aa3aef9040b9292adf402"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +conv-xkv = { + revision = 43558; + shortdesc = "Create new key-value syntax"; + stripPrefix = 0; + sha512.run = "7bbbcfd71a32704f2383289d91fcc1b5993aa9e184f5d974f6dd5592312e85848a926ad9e6f412bef801daa20cc2b9c999ba137b9b24e31facfd6931309630df"; + sha512.doc = "c1c923008185db09b3e7cfd90bfd9b33ca2a61ccc706b0f9cefb238e0860120da517fdc7166e4fe476a1cc02cb4a7a3fe4c9b81c87c8de25ddd1c0c417dcfca3"; + sha512.source = "edd5feac4453010dd996edbb3741339904b0380c021f9429933f6b27df6d9c002d593d617467043ae6087de3c5842fb7a4e8ccfcc95c7763e124ab5f5c9dc024"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +convbkmk = { + revision = 49252; + shortdesc = "Correct platex/uplatex bookmarks in PDF created with hyperref"; + sha512.run = "01bb9621459bac7eecc99b1d9aa59de420ba805b2e0ecdb2a89f5c86fa4a3021d957b4ddc69617ea406e77865d68e40c657979c488fc51f4676d084cfe6181cd"; + sha512.doc = "937d436cb9387eac601883ced516fa40f60e606bb4bae0be62e1ded2a31754a1d00461a34ad533cce1cc48f4d11e880233eaac128d80841e0b22f18801e86506"; + hasRunfiles = true; + scriptExts = [ + "rb" + ]; + license = [ "mit" ]; + version = "0.30"; +}; +convbkmk.binfiles = [ + "convbkmk" +]; +cooking = { + revision = 15878; + shortdesc = "Typeset recipes"; + stripPrefix = 0; + sha512.run = "6c2fb1adf244dafa9689844e1283dce19786e2c1df170d4172d3567514555d90adcb82414f79b5d9dcd59cfdd3af5d6893fff57972d6e4fb32196add0ed5b1eb"; + sha512.doc = "30cc2a5b4679126cad1b13785081d924f9d455a5f392e5047c14c8ce1dd3efca102bafb74e1a339dd938680f3a95111a7025a31508ea63108eb33cf32b03c9c5"; + sha512.source = "7b935bbf1a7e7dfeed2db1c4725e38a3bf847822dee7da8d6098e7df82b5b5035b47ce3f0b9403dcf35028b319c2661b0bd8288b8a1e80395944532777451bd9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.9b"; +}; +cooking-units = { + revision = 65241; + shortdesc = "Typeset and convert units for cookery books and recipes"; + stripPrefix = 0; + sha512.run = "82f6e5b097ff7bc737526b13b04724fa144cb96d796cff517019e49befa174f621a41ec4c52d29fd20bb502dab46db1699b98f57de337fef8320392c63839675"; + sha512.doc = "1297801aaf9b7ae7edb900165792e1b7ae91ab6c32482a7006dfddae37e1438a3748f3e048ce385b76dafdbe78ccf5c643e9d78c07f2bc9cdf7802affce14764"; + sha512.source = "245b98785b44afb68c70b5cabc228b282d8b9351ca97b0b0f472dd8ebd547928f538c002366a4b9344d74dfa35efffebfa5314ee1cc5e5f292d7134b03b58698"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.00"; +}; +cookingsymbols = { + revision = 35929; + shortdesc = "Symbols for recipes"; + stripPrefix = 0; + sha512.run = "9b43ffdce038ebb001c0ab6198fa2d92ad6f1ec6040f1c315a53fbfd29367e5c851f4015c36b0cdb2eea84f4a8dc90aa3d5126a09f93766d614931bbf555f982"; + sha512.doc = "fb6794942d016d12f527b86947c7fae9947a7cf9122a7b26d39bfeb6d5f55a7cccc11b666101b0c80a92c7385ae8305bcb4d792baa0974b738af80697ad12891"; + sha512.source = "b2e8ff3274ffaff3a3f5b3de1ab95a534247878f163cba8cac9af0cb49c59c54f9ac7b362c75dbc394a3c942864b3255ed28310ac5ba842b5b63ea0d0d80f7d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +cool = { + revision = 67013; + shortdesc = "COntent-Oriented LaTeX"; + stripPrefix = 0; + sha512.run = "4ee983b7b07d20c9fe7568ebb6be60ecc56f85cc4ae4013870c53370df99d69bc0537c3889790324baa1f1a8afab2da56763b590457c49866d219b1540effe98"; + sha512.doc = "06d182b5415ed25be80c827206759708daddfaa6bf7a3aae59c1639c3c09523a7b421abdd9d2a8db1297e161e439b777d3d1d8c07e52dddc1c071ce1c5a9fe47"; + sha512.source = "c305695f6694cfb4b08462591aabd64adef27001d0c84ba905b0d4f07b7095905cda414e7e477ae962f5ecf6cdcee60d0a432e4eea924bf2fad0770411131912"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.35"; +}; +coolfn = { + revision = 69007; + shortdesc = "Typeset long legal footnotes"; + stripPrefix = 0; + sha512.run = "b92b231bee56a8589e079a1175569a8d8b92bd0e4730e87882cd8415bf301d466c381eaa0540104abfa5e9ed2d159b3349e3dbfc34e6b1c10e52e255946b3067"; + sha512.doc = "f3f6c06eaff8ce132e5bbdc25fa244b6aefd388a467bdf78c9c5459d6bbcaff185ef0a485957e8b864ce167b0be3a994d73cbed788754da308dea2af5d9beaae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +coollist = { + revision = 67048; + shortdesc = "Manipulate COntent Oriented LaTeX Lists"; + stripPrefix = 0; + sha512.run = "7336f6e9a05311295d1ada4598d4b5506ef64ea1c245d30c2f30e079b5da66f08b029d98a74dec769b60da7ac05822f377c485bc0a7a25fcb3aec9e2f499d3a3"; + sha512.doc = "5f27ec17d4544bb4ac9891e088b6d921901504c46a52a65638d5caa0fb7ad4df55c00ff2ad7569b6b7f97919b9a139f433044f849ca4bd559c77e147e5878d50"; + sha512.source = "c0a8e06bae7ea5e3a2dfba01e014c7bd0ffa22306bc1827e1eab717317b23df8d20ca344ba182c7c44a596f3c7471aeab03ed93221cca658a0e451578bad6761"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.4"; +}; +coolstr = { + revision = 67015; + shortdesc = "String manipulation in LaTeX"; + stripPrefix = 0; + sha512.run = "272c0ad1071f394c9cf96c38ce85800aeed55eacba29dc86c5887b86a63b717d8f83fd83afb5ff813df780691a7a2deff6d466e521eeca14ad3e3d09f07ab0db"; + sha512.doc = "5f4baf28b3a5d2b83ab51037c60454def4c1ebb74a408add0459fbc7766fe828e32af9c02ba898592272b067b23715e3986ca4f561a1a89d58a57c7de6d70bd3"; + sha512.source = "56e15bc77c6bbc2523162db8a86d1b3bf86e97a59fec15e27da736b964d02e27e7838690befce0f493a9363b946f710676c76e1ddc0c048f5cf40e41d29c1c0b"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "2.2"; +}; +coolthms = { + revision = 29062; + shortdesc = "Reference items in a theorem environment"; + stripPrefix = 0; + sha512.run = "7a9d8f4605a0ff108ef5cb32ef4b6f455d16898248fee534e6557d8323c4378c8299fc1a6d58dd491020090ed4fdd3e41a90de99d18a9d114b72bd57b27b5e7d"; + sha512.doc = "2f5ff3ead76bc83138e41ee881713829de7b8b0ecdda353fcbdd9ebdb7851139eb9022fb4eec1a1c03d125f4106ce748123a9d9fcd76859e82158a541aa20aba"; + sha512.source = "088f76522c4576925af08d387ecfd18b4906aa91fa741c4848eed49addb9a9334b3f27de30c516e7a85583a450fcfd0c7054b071bb926eb8f1f9ab54b5791ed0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +cooltooltips = { + revision = 60201; + shortdesc = "Associate a pop-up window and tooltip with PDF hyperlinks"; + stripPrefix = 0; + sha512.run = "fde90a48c95ee35a7b9c9dfc1359df09646cd9f5cf1a44a7eba7ffd9aaf98c2bee400dd7ee6796583bea5a874c2693d25d3e502cdd4c3a207949f46ba7525505"; + sha512.doc = "0b9d55f41afb738f1503e232e06809cc2354775c6793c1f5f3f3c65d4aa349294b5e9ad4d223f588dbda0b0f53091cbee4855804273a8d8f21a6689760a556e0"; + sha512.source = "584d4880126bbca5343a4a8df85ca348d397dfb5cd5fe8a62d61224f9c95c5a0aed20f8c522d65ed68c6435506613fd0decc35acd848bedf2bf89de6842a7f27"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +coop-writing = { + revision = 61607; + shortdesc = "Support for Cooperative Writing and editorial comments"; + stripPrefix = 0; + sha512.run = "b00d0ba304a9aa88929a0f130b3e73bf8c095b25cebc6b33d8d01d15cc73766ac3db3a588719fe6480fb4105ed0bde32d5ab2354f2cc223c2e3bb90a8e6f877a"; + sha512.doc = "489060dd92b0044cb76c8e4f3f17aecf85da7b320406875b0c9b46fde2edf485868669e4986d9d602eb317ec0199e6ab81bb34096f7635fa4479203e03336577"; + sha512.source = "f00f9b9db508f6fb924a4371413631eb6a269f1e70034891a1cf1f6b8df6d81f5f3e7d12e5ff7df29524d5354fd2e6123651d549e997457cf4723a8e723053e4"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2.4"; +}; +cooperhewitt = { + revision = 64967; + shortdesc = "LaTeX, pdfLaTeX, XeLaTeX and LuaLaTeX support for the Cooper Hewitt family of sans serif fonts"; + stripPrefix = 0; + fontMaps = [ + "Map CooperHewitt.map" + ]; + sha512.run = "91047a9831d2f1bd9ce8c3d6b1089316a40312b4920d9e8e26df4a5fc64293eadc45ac211c039ac8bc83df5d3406cfd006d1192945bb3776983f5d571c9e364c"; + sha512.doc = "211601a3a1fe2092a1cbb67cf6fa71f7ea2225f425a8556c1b88396c3f0d721ee144346fbd29204c4d68da77363653b1f0b14693139278f2b22a6104bdf949d0"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +coordsys = { + revision = 15878; + shortdesc = "Draw cartesian coordinate systems"; + stripPrefix = 0; + sha512.run = "83a57df64b3386b7e927ca30b4b2ea031bd656121dda79dba0f96779e77d733d2293b80a3b08081678bea9b31a31a586123e9866c6aa595561843af3de0cc4f6"; + sha512.doc = "bb89a04e5889c39c23ee65c38232cc0be931dff383d52614e290b6bd8ab23e7c9063fd7ea656dde896c08830b8c7c85e1da7f56728fd43a1bedf31bef6ca2e83"; + sha512.source = "dd03bf08143a43b3486524d4aadac592e3e2264d23aa45fbb499ec7e709edcabd87f66fa38349edd856a09fb6d55ef466d565714045559b9b7f418a7d3eb5acf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +copyedit = { + revision = 37928; + shortdesc = "Copyediting support for LaTeX documents"; + stripPrefix = 0; + sha512.run = "27f48ff201c66d61ed7702b4d11f0d39b0c74974ea3a90506dace0f3cb4ac3c4ee5cac28f9669574184620b3e64a4b9ef3fa5564213e3d200754bbab791e52ea"; + sha512.doc = "60fde840ac3c6876f031daf09e852ddf79276d2f841dea2ee5299678bd116df31b2ec2dfa6d6175e45a42fd781be6935cbfa2aab8621af641985e3df2c665fc1"; + sha512.source = "7d2bb6e2e8c036345e301d45c03665b6c8ae9dfe91668f354e77e30e2d8a47d1b6db2e7032717c4b04e8e122952b916459b991fc5b566a020262835bcdf6a6fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +copyrightbox = { + revision = 24829; + shortdesc = "Provide copyright notices for images in a document"; + stripPrefix = 0; + sha512.run = "2ae2afc738cc906d24fca0a6319c98dc1e9382bbde6db3d0c3a371d3de8b92c30b3bf05be04797bc0ed6d905933a50e74809eed52f06cdba5fc5088be033d4a9"; + sha512.doc = "9b817f2874a35f3e023774d3be32e0f8bf53a26f9daf553525c95ce0c21a64a22c3a716fb20cdc76921ec90b7b5305f305bf44853cf87d13ac38ce853ca00ea4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +cormorantgaramond = { + revision = 64411; + shortdesc = "Cormorant Garamond family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map CormorantGaramond.map" + ]; + sha512.run = "1f1707a00298fc2015ba01259dc8558a79e72a10753f3c101f318359f0d4a3b6a9ae16cb1c1825ccf152fb50045f2cca429b00da27607fa8ba1046ad15e5a86f"; + sha512.doc = "85a5ba16ec8756b5052b4e6342d47e83c9fc8f348ac3b4c067afba131a7ed853cab04c22f8723a912a1178cc8ed373ab5fdd9d2be0d9816918bd22233c13ba95"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "3.601"; +}; +correctmathalign = { + revision = 44131; + shortdesc = "Correct spacing of the alignment in expressions"; + stripPrefix = 0; + sha512.run = "5a7e9b3b51ae82980cc1ab9d4ae74aa0b65afa533d21230b1f5e6867bb6464f910a07bb1c38621eb18d8bccd8bc50260b8741752936c310012590706726ed6f2"; + sha512.doc = "bc6c9f24a4107d28120e6934f6966b2560ca4c34169b0074023e941746240879bc0572840d3967effd3a1358ef288ac412946f79fd3b40151c1507cba8828be0"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.1"; +}; +coseoul = { + revision = 23862; + shortdesc = "Context sensitive outline elements"; + stripPrefix = 0; + sha512.run = "21524a0721fa26d85b383879cc75600bcd55ee05220eac245171eadc30dea7296731e4d6d2d3d82d10b32f1d674d444bf1df41dd82b92d5cfa7ea06d53f56147"; + sha512.doc = "6e950d1f5129b39de2cfdbf7cc46b101f81336f29325a5e74f58dbb4378dd79189d1e29dd88a9e828fe4e758b6de93e76f70884c9fc582cc8a69f6db1e1f2617"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +couleurs-fr = { + revision = 67901; + shortdesc = "French version of colour definitions from xcolor"; + stripPrefix = 0; + sha512.run = "d3d1abad334d50129f77b35ebd6fa244feb84e347e64cd98f3e3413c556b1848a198e4679e266f838d947244756fc19071b1bb0816c73b887b2deb4fe061adcf"; + sha512.doc = "8e88f3947d0dcebab82a60bf9886350762f57da2c2b3c739e2e3896afea70a2088ce325cfe6373d6a351b57fc2f0b0bb7f0f4c9716a094d86e1997744890c92c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.2"; +}; +counterz = { + revision = 67335; + shortdesc = "Additional tools for counters"; + stripPrefix = 0; + sha512.run = "5fcc21ea49e222cbb205998172ca4184f4daa3efcf92c48278b3e7c5bce6669594b02f5fe54af76f94ee19ba63b9701e66d24c2ce85262748c1fd2c9b6e18b3a"; + sha512.doc = "a5ccf25501d1275161e9aa53f076fea2480cd5edbb83e4133c9cf8e400b840fde78f69bf038e5778c6b8535fea3e654c11eb1ac82545a90fe952530bfdbb607b"; + sha512.source = "920d054c6a3bc41504db850407d8553b1e108af85ab1a94fd2a6bb71e8f6f7f02abd11908a8d73430cf27c9f9f8e46014a53b8afdb80dd360e4e1cd12f8bb090"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.1"; +}; +countriesofeurope = { + revision = 54512; + shortdesc = "A font with the images of the countries of Europe"; + stripPrefix = 0; + fontMaps = [ + "Map countriesofeurope.map" + ]; + sha512.run = "fa0faa88db3e7c1baf73d5fad1fa196915c752e15dc024cef051127581f1e8a3d218d5f2f815b44bbedc9bd6fce6292825929471b595771e9ecd0b5131b11d26"; + sha512.doc = "e99ac6f4b57a2aed80cfd1214da7625ae94336677f0cfa0306125b06054835c2c3b23ac901cc3f421d56e4d021dd468db12e21acd6b3883c8b937919dbda056a"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.23"; +}; +counttexruns = { + revision = 27576; + shortdesc = "Count compilations of a document"; + stripPrefix = 0; + sha512.run = "569393d76512308751bff3c5cb22bc11ecee420bb16b5f7d35d6b10beaa02f9c99a4d440e7f3a35bda4e6821405e5f8d621af5af176821549a0e0f0660f998bd"; + sha512.doc = "4a67cac01589ae5d3eb61c5c6c66bb38ede138c9c2b56fcb6359c8f851bf55ce3cf2e5662cd7751d6708c86644cb5f607318612b01b60f769858d594c2b24218"; + sha512.source = "ed482becf766081e5cb05affc10c64979e43f9f655074366063b95943229dc9043943422e1063ecf69e5d44659566fb1d0ffddcc27d33eebff9de69f4aa8c7f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00a"; +}; +courier = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map ucr.map" + ]; + sha512.run = "30d6c8906671239b9ef04b3c4d571f59e928ffefc965cd592ecd3277062c778b6f8cb0782f5eb8c6bc27d03b69a88a120593477ced93bcc44cdd4fbc3e5b8adb"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +courier-scaled = { + revision = 24940; + shortdesc = "Provides a scaled Courier font"; + stripPrefix = 0; + sha512.run = "570256a4353163cba169ac5d649458d363edc5c2836efccff1e7df83c12d9b552978b3531f2ab026430b3222b3dfc00be0e4700031e6bc50bdb60a739a68c9aa"; + sha512.doc = "59c5cec8491e678b084afb4c6e63ed07ca179b5f17be8fe581ff341c80b3cee8016601799ada090e1fcde9eeb72197986f3d4aeffa7c7a9d10a014e34282f52a"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +courierten = { + revision = 55436; + shortdesc = "Courier 10 Pitch BT with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map CourierOneZeroPitch.map" + ]; + sha512.run = "06343c68149c28b8808a38d5d7f2a57e9bff996d836c90a352ed77da4637fff150a18c13b8807f401e3d9cc9e7ecc773275f8ca18e2dc8d315ec5647c3f6b55c"; + sha512.doc = "737818c02e35e5502eca7bd80427fb814f54d495bd1315b124ad32a033da0ba0b9b4a2cc5a1f8c19b0f8d91f8534a783253742728ad1c8499d97e14fc3a67938"; + hasRunfiles = true; + license = [ "free" ]; +}; +courseoutline = { + revision = 15878; + shortdesc = "Prepare university course outlines"; + stripPrefix = 0; + sha512.run = "fd3bbcd90570aa1cbfae49fca247d761ac0b886d795fd8097754706b21ab1d6954eb8d8a6c1fb4e69d550e7ec89294fa006f50bab0c7b806c545666eac4915f1"; + sha512.doc = "5a52cabfbc28fe27aa6f85b3653de3ace51b65011ca2e33b56be59854b364319ed8adf95576f8211d9494a367fb637b47fd2805a2663df87103b2d67a168dc13"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +coursepaper = { + revision = 15878; + shortdesc = "Prepare university course papers"; + stripPrefix = 0; + sha512.run = "bae9e3188a3312f970434b21f23436251dcf8d7b5b2049decf1f95903f5e58ddf9dd328ffc6908c70bec436c9edc3ae62b05d110f42a8ab322eb3f464733ba96"; + sha512.doc = "359ee3956a6da4eb41947db9b5f8dbaac7c13c18ea91afd6d63f738ab43af4c77fd93e9123ecda28b4e2211387c910b7a46b2ccd97edeba70fd6d2852b228094"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.0"; +}; +coverpage = { + revision = 63509; + shortdesc = "Automatic cover page creation for scientific papers"; + stripPrefix = 0; + sha512.run = "a41ebddf89a5fd375ab107e207b9397b3496bc7daf213b4c29779b15d0134a131d6646a4474a5cd9d3bf56da58350fb2ea4b98692bccb8d7b06c8a4f2244ffec"; + sha512.doc = "0931d1f63b60b1b94467114db0fcc67e4905ee1fbfe7c2083eceb0f7715eff201ccca4cd74183b70a4c84808838244b3570529b372ab64a9ef6bcc0f5357aa77"; + sha512.source = "15d25cd0b009c1f8006b344498f40a293d18cf08b9098c9923b1fc678a65a2a2a55efcab53744e55ce41d34f4aad248d389aa6127827b1836ec6a706ed6c73cb"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.01"; +}; +covington = { + revision = 69091; + shortdesc = "LaTeX macros for Linguistics"; + stripPrefix = 0; + sha512.run = "c70d4926d45c93ffecff4d8f32923ac99a1b354e51dfc21eed8f3e3172e5c29875d5ef7a2509dbd6150f22bec337efceb7cd42717798144d1d1046e4332d00d0"; + sha512.doc = "cee67a2bcd26ef106d35fadf02145b74e7c9b67c2bd2ff46a4a7afc262d020d43b168fefc2d086688c4087469e9d68a9f0ae79c83dc018ecce70233a0459f9fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +cprotect = { + revision = 21209; + shortdesc = "Allow verbatim, etc., in macro arguments"; + stripPrefix = 0; + sha512.run = "f4795674aa97744b0d6ed70bcae83a1ce3b41670a1bff2e67d12825154bcfd7eac2a740996bcb4aa0445697a3e4c17ef3d8606b308b7db3aea263269a7e2eb51"; + sha512.doc = "e8a5000eb9a538f95bf6df4e2d68ecd8769974192e8181b6eb40e5f48b2cc3a9b9d405d1c7b611e35c41dac5ca5165a503efb7584ee94289ed3255a9482b2b2e"; + sha512.source = "a9c10d5437f4a9f55680fc3a9841e9dc665b7b642e2831c0bb6239d73ea08312eeae372cf95591d002fa7dd51ae45e7413d9651ea5d60e5837903adf565364e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0e"; +}; +cprotectinside = { + revision = 63833; + shortdesc = "Use cprotect arbitrarily nested"; + stripPrefix = 0; + sha512.run = "5f4a3dad026c07720a11935e5ae4fd4b6f5f060292c249224d3a45ee818063ada48778a8399b324f1f13ec4744215a5eaa4f41cbfb82e1f9503d720e3020de55"; + sha512.doc = "a8b050ddc6f3dedfd2ca6c4d7b4def6ab63d55cdb6e8e1622ce95f61aabcf2d9d8bf56c05065c9f4c49c507414273efbecb101652d372e78fef2251a87bc6bfd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.0"; +}; +cqubeamer = { + revision = 54512; + shortdesc = "LaTeX Beamer Template for Chongqing University"; + stripPrefix = 0; + sha512.run = "7c2c4548f8bbb4885680588ff113c8af96d79b5403d6cb01bebc6824745fecdd243af7e14b51bdacc91a6ee2301946ae911aa6c892d248958c1089d3fac383a0"; + sha512.doc = "f11c9d614b75a973cfd0452e283078c5af259127624f7746c0f49152da20ea016acb8842ce343cf342e4fd45f563bdadb48fc4e98cf964bb1c6dd044e610e202"; + hasRunfiles = true; + license = [ "mit" "cc-by-40" ]; + version = "1.0"; +}; +cquthesis = { + revision = 55643; + shortdesc = "LaTeX Thesis Template for Chongqing University"; + stripPrefix = 0; + sha512.run = "929e1b191e8aefd67e734c49227c24ba6f4a15704d3f40aa49b1c0390796dfef36b56e7735e068fade5415838918ec712bd34cfffc9aa2981929067d73d86ad9"; + sha512.doc = "ab270eb465858de3b92248b3b884fcb648b59cc3f947e3362a445562c29e910b0a7f1e4c137aea49c537e68ba61a90d08f40ab43d3340c109e01a293505cfdf9"; + sha512.source = "2184befc80f4ef6f23aba573778e99314dab80b65f053416e5dc8ebb0ff462c8f5d665085955fd28d88dd24cdc9e0599ba4735196b239e3123523cc1316da3a5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.50"; +}; +crbox = { + revision = 29803; + shortdesc = "Boxes with crossed corners"; + stripPrefix = 0; + sha512.run = "087ae9406fd8f6916e355b51d2f4dc7383228813716ab9f6c37714794c931a9b5defa4678a4471523c5fda2c6b0b7784d11dfb488a8d9c60f0244d9d2d64ab2b"; + sha512.doc = "8927d6f60a3a895685c679e565632ee2ca68c1f2e8dfd795a481767463d88ec37579bfbd55858ce1e6e433a981de4b5140cf75489221243716cd8035a2967a90"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +create-theorem = { + revision = 70180; + shortdesc = "Initializing and configuring theorem-like environments, with multilingual support"; + stripPrefix = 0; + deps = [ + "crefthe" + ]; + sha512.run = "b65a610bb508fc169db8447d234e656fb3b63647ccc7a6656bb015fd871c762ed2b8bd59304808f5db1ce528f8227283a6172aafee9cb84f24c5fd41041acd9f"; + sha512.doc = "4ce2d32999518c46478fb6563da42d073a04fcda76391ca722e20a4b0651819722fe62325c7bc858162368645c259de2407bf6b67681a7990e225195459c54af"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +creationboites = { + revision = 68087; + shortdesc = "Macros to create simple tcolorbox with some customizations"; + stripPrefix = 0; + sha512.run = "5aaa071101c52bbd95c83b2e523ab664a2d52109fd5ebdf71da07d3af997d93cc2550736fe18dfac05348d92cbb02749f03a052954a0807fd3d2140efb322588"; + sha512.doc = "42e8ce40f037b18e82899b570e8102835a437a5283193f1e799876039a856f86adb1afe52f5b07bc6151644e9b174dcfbd96f6148e2610a0a32cb400832f3ebf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +crefthe = { + revision = 70165; + shortdesc = "Cross referencing with proper definite articles and declensions"; + stripPrefix = 0; + sha512.run = "e3d8ee83d5c8eeb35885ac852e64df8c3e0950855b1860fd1013358626aa5968e02175e0873dadeff69eafcf14dc85bddfbe78fccbe9c784748c5e09b599a27a"; + sha512.doc = "35d45eb3ad323dc4699ee103a7efedbfb4fac371632d82e5e449a49e89ff6ee25ba9b7d86ee2ebe76c5094dbc24c0813d2a89328d28414b04ba2d20c513cdf3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +crimson = { + revision = 64559; + shortdesc = "Crimson fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map crimson.map" + ]; + sha512.run = "fb807f6602365c65470ceb947e72c63171fc401145b83a63429836d274ca1a0877008c27e4f6416b2a89a3fceb2912062749deeec81346e59c734fa14e4cc289"; + sha512.doc = "105068d0dd81b33a8c073ab33542f2ba7893d4e1d95dcf7af58b413d54a3e7e0cf24911fc2e56ee9821d6d55f016355d4e42db2d981e48e1feaa98b498e20e73"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +crimsonpro = { + revision = 64565; + shortdesc = "CrimsonPro fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map CrimsonPro.map" + ]; + sha512.run = "e119ee9df715d799231eece3e5c5c0c125077b9ca526d1293f943dd2700b45da0bbbac90a964248415bf9cb1a51923bef26995acf25397216edca531594d321d"; + sha512.doc = "3f151947afe36a62d958804ffafddf533b9970162511ff2038629582acb15b4614d9bd5ffa28b53961c53996d2a8ebc0852b511007ae83d2b4f5f908a1d1b04e"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +crop = { + revision = 55424; + shortdesc = "Support for cropmarks"; + stripPrefix = 0; + sha512.run = "f6161e7688d8853d2d9041cfe26360b71a920028df673d04ba38f258c810021752bb7282757ceb98b2e62f7ae52a5f4abcdc61333081d77b205d5431ca62a569"; + sha512.doc = "770ab2977a4ddfdfdbac5f1107e01b8bd5858a31747d44bf0186565dc79becbefde2f34a9514dcf214b8eb781390e98d5f5383f2e70e393ddc22043d4a0eacfc"; + sha512.source = "1b1f0e6a309d1657a12f9760ce2a01ab370de1d34bd628bc066768eded3d7126cbd1f8c38d315fc120c58d73cee48fbf2515492c218a6510306766dd83861b15"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10.2"; +}; +crossrefenum = { + revision = 66014; + shortdesc = "Smart typesetting of enumerated cross-references for various TeX formats"; + stripPrefix = 0; + sha512.run = "ec85888801dd66c0e1b22a257be19eb141b922975a7dfeff90ba146232a6d8b9a7b76e338b68548ae228a1317af0208072c06cd10ddebbada93b11b72907c817"; + sha512.doc = "c5d847af7f8c2d753563d5f393cd3de2936de96ebf1e653b7e0b9f72da75f3481ce1a783329f74ccf8e5f160eae81e045c663775dac916c431edafb1677b5860"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "1.0.2"; +}; +crossreference = { + revision = 15878; + shortdesc = "Crossreferences within documents"; + stripPrefix = 0; + sha512.run = "e34b4d383b8398880b962cdddf248c95f2bc7187b5ed4f0caf84655a94f92b915906b150ef904c696f49f22ef23c039ee66427a03b1430f7a3d5f619f2a80d01"; + sha512.doc = "e21b294ac2b3489cc81ccc99c54bc60985d8769e297f137180a9373ad289248b5d90acf3dd9800d0690907543cf52f0532f6317ef55a43a5b55541805e2be68b"; + sha512.source = "ebf66eeddeccc32574b0f6285d655d5e9a00e4c4c6a50c232ecbc438b51e4ac45876e925b41b71717b23004a24680b3302b8a0afb9ba124e279094d705676b2c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +crossreftools = { + revision = 55879; + shortdesc = "Expandable extraction of cleveref data"; + stripPrefix = 0; + sha512.run = "50b8ce01e9bbfc1f3b4ec9093fe0b091780edbc197a9c637b98a025926600459c5f0b22f5683427bd0a4f0a6ddacadf77833f3171d2dbd45ce43dd6e1d80d813"; + sha512.doc = "0edf43d8b68decea7d83cf5eaf2f92f86635f19041680be4a511a57a7751dd40efe4b4ede05a898c2e00f91076caeb3f4b39c444d1ab8b05a4f0471913e4b475"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +crossrefware = { + revision = 69700; + shortdesc = "Scripts for working with crossref.org"; + sha512.run = "8559fe8e71e27f8417923bd2c7a73a560c29d699ddb77e5b4ac464aecf794fe0cbd02d19abf75f7063994df9ffe6e761f98555a9411e9c5108b38e96db971f1d"; + sha512.doc = "41ef79c5487826500fa9465d371c30a8ac513c94cf4852eb1bcbdf08759f5c7384189f91362efba921e9d7f3801a12d1c1968492640dd1c1cf2f1d6001cdb79e"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +crossrefware.binfiles = [ + "bbl2bib" + "bibdoiadd" + "bibmradd" + "biburl2doi" + "bibzbladd" + "ltx2crossrefxml" +]; +crossword = { + revision = 64375; + shortdesc = "Typeset crossword puzzles"; + stripPrefix = 0; + sha512.run = "8be92df53341bca46907f0125122e2498761880606fb42621df7b4e9f5d9cc9e9a8b74454aa254f49b6fd471b371df7f9f873d9209a94c419433b53247bc29a7"; + sha512.doc = "445ff450f4ebb1e615d0e9a7193904f4512dddf4af3b693f6eae9a115d5456202c54c291c263c37fa37d082d3403c4b7a83deff7e1ae37548efd7ad47b97bfad"; + sha512.source = "018058d6dae55c27804cc750fd6469f432c1a0edca187f6adcf75255d9d2a27c34a446e54dc7a6b5de3e030a0145f5b950961f53e4dfb8976fbd283f4db30e38"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.11"; +}; +crosswrd = { + revision = 16896; + shortdesc = "Macros for typesetting crossword puzzles"; + stripPrefix = 0; + sha512.run = "889334e046aa6371df566c814faa98fdf4931c85be3d49e04d932f02bb71bffaa929614398469be04bf6426ec05ccbfcdbe0ad9798017f9504fba5f3781521e6"; + sha512.doc = "0d4d1e8c1577ee23f7fc60ab8c106121978e986945b8dd399faef4ca55e60a7ed3ba65220ef56ad11b7a100690f89692f0c1ad80c845e2aa04d81c8664a6cd27"; + sha512.source = "edb2825137c510f1ed32b9380b3e59ac492a76ed35d2a1b16ef486a8287338c1afd8b26cee9d1ae447eff3dd12de14cd7f75d97db74ef5f084286c7f5cd8478c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +crumbs = { + revision = 64602; + shortdesc = "Add a Navigation Path to the page header"; + stripPrefix = 0; + deps = [ + "catchfile" + "etoolbox" + "xkeyval" + ]; + sha512.run = "f4e3e045665c16d02c6b1cf2d43957fcbfe38ceb17b6bed9445803d4134a3ad2c22b552230ed685d42c33864169c782c9ef51ba47669d7a975e699ec532a1f76"; + sha512.doc = "b6e13f1177eace8e349648dd376e3252b34ada5e84c0a676631ef313507064c68624936730fe9780707bced36f05d4103cd9aa33a4bd511cd23836ed2ab38d03"; + sha512.source = "5220b2d854c11d4c0734ec22dded6c1259d470c416c08fec4d4fff35714bd56126f5c4f8785e958454c1a3854541b9d8cb571d4f7a86b636b1c12e739c52072d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4.1"; +}; +cryptocode = { + revision = 60249; + shortdesc = "Typesetting pseudocode, protocols, game-based proofs and black-box reductions in cryptography"; + stripPrefix = 0; + sha512.run = "d4d85db9f631bd2f3c78654e88b9c77df7af991f304732ec92b58d08111baf2548bd7d27e6187b0fb6dac7cb0517d27ef3973293cb76088ee8824cb28b1493b0"; + sha512.doc = "8516c946f2a72a898a6320be3b9037b3e94ec1e4c4624ac0c7f67f64855308f793275d682e2c16b5566abc17ab58200ec1ddc32dbb9fe2c08fe21183bac2986a"; + sha512.source = "ec51e316bbeaa2a28f7fea918fcfd3338fdff0153325b93309d79300b9df1655620227596cddb429952ee2d9074da8eebe6dd64207e2f300f475215eb33b9f3a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.44"; +}; +cryst = { + revision = 15878; + shortdesc = "Font for graphical symbols used in crystallography"; + stripPrefix = 0; + sha512.run = "49e1c9d0cb6909e421446230bf71123fa71b4aad1d90b1c7614fc465651f701d91f576c2edd8b6840d1c78dfa5557cd604e61a5e745e1ccb2f60bde9e66117ed"; + sha512.doc = "55c765a9a4799f719383473700a0ef5627ec8873fc9fbd4ffd191d205d24b29d57255d90687176789240a3c4a547a3a57ed341a0558d99aa01dbcff0fc7dffc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cs = { + revision = 41553; + shortdesc = "Czech/Slovak-tuned Computer Modern fonts"; + stripPrefix = 0; + deps = [ + "cmexb" + ]; + fontMaps = [ + "Map cs-charter.map" + "Map csfonts.map" + ]; + sha512.run = "bc956c595d4460f35c64c92e7730a7cc9cd3af95301afba56c49bcf8415666863de926733409ce1afd99ba767fe3a3fa45c68f2dcc912b69c6f72b618289fb30"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +csassignments = { + revision = 63992; + shortdesc = "A wrapper for article with macros and customizations for computer science assignments"; + stripPrefix = 0; + sha512.run = "0e5356f133fb6f3fb33ee0407a53d59330e646e4f1356c307464c45f5dbb66435d68ec833c6482673417c53d611816c4a66a5db34da6b14e327691c0f0c3590f"; + sha512.doc = "3523504d0f7289d485fd34463ab7a0ba2fcc3d4a9b2908f3853977a8b3d7fad4266fd20050d2ee8a685483f47a66e04b50fd4cbaf0788f22c1ce48d2f4b89476"; + sha512.source = "0ba1b40ea19e3c1196a4314427ed882a00a4c4807127d0792ad6f020cb273d3c157ffc469bb7f363726b8a73ec20a9989de43a9cd82e114ccf1b9a1e66328547"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.2"; +}; +csbulletin = { + revision = 65250; + shortdesc = "LaTeX class for articles submitted to the CSTUG Bulletin (Zpravodaj)"; + stripPrefix = 0; + sha512.run = "64d8593e12beed90aac7cffee0632b4d16d77e5cc12702600ac62a8374429ab0a35390d8046b43579855744dd4f59c458c574e173254d3cf21ee45d3eb97b4db"; + sha512.doc = "2ca7ffe0973b443a2114cdd1e171f62b845f4f0185aaa5b7c7cc2809cd3a2b927784a4fa68c9a3a28fa40f44217826d1f34165a027838d3bd9f4e0e740a294d3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +cslatex = { + revision = 67494; + shortdesc = "LaTeX support for Czech/Slovak typesetting"; + stripPrefix = 0; + deps = [ + "atbegshi" + "atveryend" + "cm" + "csplain" + "everyshi" + "firstaid" + "hyphen-base" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "cslatex"; + engine = "pdftex"; + enabled = false; + options = "-etex cslatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "cm" "csplain" "everyshi" "firstaid" "hyphen-base" "l3kernel" "l3packages" "latex-fonts" "latex" "unicode-data" ]; + } + { + name = "pdfcslatex"; + engine = "pdftex"; + enabled = false; + options = "-etex cslatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "cm" "csplain" "everyshi" "firstaid" "hyphen-base" "l3kernel" "l3packages" "latex-fonts" "latex" "unicode-data" "tex-ini-files" ]; + } + ]; + sha512.run = "a5ea5d33fcf2573f772541cf03cb660fbc4d32d4d1e145fabc07781f5f664369f0bce9e8434f403beebb3a6c17c2da43d7727fecf6944db1bc9d36796e8470da"; + sha512.source = "8ea942f9cf3b9939311ae29bc4badbb2a67c6f4f2e03a4745142a0b570aeb0e668dfc47dea278f960e6a11231856464370507379cdbd77588720a16ff5e25d17"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +csplain = { + revision = 67934; + shortdesc = "Plain TeX multilanguage support"; + deps = [ + "cm" + "cs" + "enctex" + "hyph-utf8" + "hyphen-base" + "luatex" + "luatex85" + "pdftex" + "plain" + "tex" + "tex-ini-files" + "xetex" + ]; + formats = [ + { + name = "csplain"; + engine = "pdftex"; + options = "-etex -enc csplain-utf8.ini"; + fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "enctex" "hyph-utf8" ]; + } + { + name = "luacsplain"; + engine = "luatex"; + options = "-etex csplain.ini"; + fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "tex-ini-files" "luatex" "luatex85" ]; + } + { + name = "pdfcsplain"; + engine = "luatex"; + options = "-etex csplain.ini"; + fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "tex-ini-files" "luatex" "luatex85" ]; + } + { + name = "pdfcsplain"; + engine = "pdftex"; + options = "-etex -enc csplain-utf8.ini"; + fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "enctex" "hyph-utf8" "tex-ini-files" ]; + } + { + name = "pdfcsplain"; + engine = "xetex"; + options = "-etex csplain.ini"; + fmttriggers = [ "cm" "cs" "hyphen-base" "plain" ]; + } + ]; + sha512.run = "5c0d9f12254d2b61a9ab34cb447dcdda56b032c5d4fcd1b4ee2ec2f3999e5b5317e067c7e03814598add15ecd56449ace1bd1a67b6d87bcc6adc2122bf7b5083"; + hasRunfiles = true; + license = [ "free" ]; + version = "Mar._2022"; +}; +csplain.binfiles = [ + "csplain" + "luacsplain" + "pdfcsplain" +]; +csquotes = { + revision = 64389; + shortdesc = "Context sensitive quotation facilities"; + stripPrefix = 0; + deps = [ + "etoolbox" + ]; + sha512.run = "68427cbe486f3b53bdb24869a3ad52cf6a006d7872ff9408560d9e4b0f1e8184fcb437d54e10f11d7a3585ff8ff7ad40ab4a95aa66091bb69a75a3e8e60aede8"; + sha512.doc = "ceba04fab9ec257c6bbc2fc903e3888bae9ef6bfa5664c8e01da14ee2b1482005aece22b6bf4fa7fb893c2dc1b0cb7f762eb048e0b2c039be80ef73b0bfef131"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.2n"; +}; +csquotes-de = { + revision = 23371; + shortdesc = "German translation of csquotes documentation"; + stripPrefix = 0; + sha512.run = "7d4667b77f1e27acb1d3c8becaad4889910edaab4b9da6b0fe821db262f3a31672050f5985a56533003178fbf1d579d170be3fcd22c31bbf41af9bcb68fb7c40"; + sha512.doc = "1e8829faf2cb23b2e565a4b5daa5a09ef01d590d920444ee4659964bee042148ea19e9fbcb63e4c4ea1e2698697554e0bc532fa0fb7610bbf9bb4bca234d33d5"; + license = [ "lppl13c" ]; + version = "1.01"; +}; +css-colors = { + revision = 54512; + shortdesc = "Named colors for web-safe design"; + stripPrefix = 0; + sha512.run = "cebeb4e7cd71ecb1a502f6788fa62284f2d9e3e4afcdc1ddce585e94683a42b20e7b9838ff5c85fc0634894898d8061e01de79e062946e943b315d2970ad126c"; + sha512.doc = "6299617c5740f104b59e850ca826a2906d63ef3564b6730b01decb4f7707828e28ae3de2d44dc851c094abb702a00a9a4cb2bc61f18f020dc37c04e189521c1b"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.02"; +}; +cstex = { + revision = 64149; + shortdesc = "Support for Czech/Slovak languages"; + stripPrefix = 0; + sha512.run = "cc0f0d0e2af2c210cb7888e90d668016dba4cfce3ae90faf0597a7f8c2058dfe56b92b71d185705c7d3b19d53b989724a9106ab56664fd2e6f4e95da5c0a48b8"; + sha512.doc = "e84c12eed94f459a7769527197f8b4b2f638297eec5d41bc7e4e3cc86c593cf957158946eb495947ff557ff323a085212b61cb3233972238d3afa2fff54e367b"; + license = [ "free" ]; +}; +cstypo = { + revision = 41986; + shortdesc = "Czech typography rules enforced through LuaTeX hooks"; + stripPrefix = 0; + sha512.run = "ecc9054a0866e4926277bf5f52faf97b0b07f0ea660b7c4d089a552ab57d3a900cd1d688981770df9b3a4285c3d451fb23f1b69757381f3cbdf88cf0c88cf61c"; + sha512.doc = "1ac42bcd1cadde9165f8edceadb438c4c2e91d6a89486e56e31623cf1ffdd5f38ec800d836dc90a5a6a0bc48dfac4a8ec90192319f8f046665c77e91fc51b91d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.03"; +}; +csvmerge = { + revision = 51857; + shortdesc = "Merge TeX code with csv data"; + stripPrefix = 0; + sha512.run = "f3f679127d912a8df32893f0afec13b21a272b6e5ed2d2c147e1bcbea5698e043d88d5dcadc0c772f5640945fdbbf4ff43655d6d4450b48966740cd3cb936829"; + sha512.doc = "b090bd51f547f16270534c2305ba68af9f86800f55809b050eea25d5566be3a3ce245ad0f79a76ed21ac64b68b6650800fba5a5ad942cc1f3f8e982f56ba5286"; + sha512.source = "b189b456daf9a54cf8fa09706f93de7e8365d75b792336a8328414d589ffa178ff0c39c17064b532316fc778b73b000610b3f966f9eb0d8e526cf1fd5b4bdd58"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +csvsimple = { + revision = 69494; + shortdesc = "Simple CSV file processing"; + stripPrefix = 0; + sha512.run = "ef7d09c254982998b009c4856b69b263e7ee5df3b54c7513aa5459651d12989f38b1593ca9e3d4d3de51ae6cf8b02c89a8a9298213c7872157712fb4c1c61900"; + sha512.doc = "c6934e0bfc8448008c0fbe7ed06da871aa9a9073f7948551881e00dd8ca0d31f7da5132d14282a9b08564a2aa8e875f36cf67db900b94dcf4381530a2b6843c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6.0"; +}; +ctable = { + revision = 38672; + shortdesc = "Flexible typesetting of table and figure floats using key/value directives"; + stripPrefix = 0; + sha512.run = "3192df463eb4d307ba886b82d586580a741da8d901dc560c06d293e04c5d5af9efff56a1482bc41b03aeaade2cc25cdf6f4dda3e1baa26da1f7d4d138f44bebc"; + sha512.doc = "a32bc9c82a87f1f9327d5cbf4c15052124608f970ecda1909aa67abcc2fb4f10bdfcbb5568d8af9332687817f6f5bd6aaa0ce4843490e8ffac22526bbe123fdd"; + sha512.source = "9886347fdf0a1a7105ab33bba00877ce22df66b1d82a60b8818af063da371d8c0c6d8f60252342dfe44bbaa65ba9a93ac8f972c64439bea7296b9e98e1be4b41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.31"; +}; +ctablestack = { + revision = 38514; + shortdesc = "Catcode table stable support"; + stripPrefix = 0; + sha512.run = "3485fbd1bebf80814645c1be3e7358a959637439fa17cbbf7c2478ca73c4312cab82eed2aedb5403dfe94b0cfc09ee3e9c8182c08d3708608a267da235ab30a0"; + sha512.doc = "2c74b9d2aa44b25952307e4593b4a792cb5d98b78619efef82ddfb134ee3da64de87973db30f3e5d5788ce5e6ef138fca2cabc4ed412c97cfa7b3dc6c3ed1060"; + sha512.source = "c39356d4d78cc8121b20e572fe59879541ab533ceab64e68f17a346723aad4f73103df79b1711feb12337e5e2dcb56222b00a9b36ddcbc04fb5e946831340d6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ctan-o-mat = { + revision = 51578; + shortdesc = "Upload or validate a package for CTAN"; + sha512.run = "a995dfc6d79ba77fe673aa501f28eaf9f057c34501fa032423569317e5a4eed048c3375d806eafacedefec02e91bcb587fa6bfb8c0ff980395bb877b2ce88c4c"; + sha512.doc = "423efc3f2f850c5a9bcbe787edb8155ef76e56ce5e3a1ba3332bb465b8239616bd1fcff2e8a58db6f5ce9d5191ae3209a5451f746250a3b081fe9b35d024eebd"; + hasManpages = true; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.2"; +}; +ctan-o-mat.binfiles = [ + "ctan-o-mat" +]; +ctan_chk = { + revision = 36304; + shortdesc = "CTAN guidelines verifier and corrector for uploading projects"; + stripPrefix = 0; + sha512.run = "6eabd7281d79ff0ad19080350dfcca8ee3a33ddfa6d17827a7851cc53f09f627729c8d715a1dfe50e0c079add44331a07d543cb8b6a57000efa6d73c30f2ffe0"; + sha512.doc = "c61bc0d70cadcc4382dae55cdc1af076882801321a2de16f164223267732e476e41f949f566808c928f446d69aa22bd9965adb155c97905e32b93808810c76c0"; + license = [ "gpl3Only" ]; + version = "1.0"; +}; +ctanbib = { + revision = 68650; + shortdesc = "Export CTAN entries to bib format"; + sha512.run = "1d89c7bab95472d993c6e685880d513f9cd4ac57af87c7656bfb8423b2e5c9c1ede851da01e638558edb37e85caca3080293a7df9b0ad9e87b2aee84a6680a52"; + sha512.doc = "760b98e3c4d7b07e2f15d7e2b1705f10eb697f5e7f2aa03de97a3ce347d7495f3595d9ed0518c0aa5d38d2eb0b20c3a889e6e66416587a4d15b89a9965986d04"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2d"; +}; +ctanbib.binfiles = [ + "ctanbib" +]; +ctanify = { + revision = 44129; + shortdesc = "Prepare a package for upload to CTAN"; + sha512.run = "6774b151bb0fb052d41d8447c7e8d378d7f31b0a5aea5f2f00b93669b8c2f629f479ae21d40480fd62f468d866cbe0c6f0dedd8a0248f8d83cd1039131849439"; + sha512.doc = "f9b636cb41b126809d808c167410a37052b1c6c385fe4eb8df3b819c0cf2cac2c7c1c74d7ea15d2916c1cbc563e078845e451000e3a08cd9a8e0696a342b22ac"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.1"; +}; +ctanify.binfiles = [ + "ctanify" +]; +ctanupload = { + revision = 26313; + shortdesc = "Support for users uploading to CTAN"; + sha512.run = "4464bdfbf72318b24abcd88e1c25dae5925a96e867c694f3f02a594ed7b8b24cffdcdb345f0054e200a6af63f88b591ff84058af0adfb4a1b3feff2a057d9d72"; + sha512.doc = "9e027f7ce08041be7668a7a404fad6b6c7cfc71e581ad1216956d0b53c379d204bd84d2d55d186c74f784df8911770b96f934775f44f7141a5f1b9b5e773cb7a"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.2c"; +}; +ctanupload.binfiles = [ + "ctanupload" +]; +ctex = { + revision = 66115; + shortdesc = "LaTeX classes and packages for Chinese typesetting"; + stripPrefix = 0; + deps = [ + "adobemapping" + "atbegshi" + "beamer" + "cjk" + "cjkpunct" + "ec" + "epstopdf-pkg" + "etoolbox" + "everyhook" + "fandol" + "fontspec" + "iftex" + "infwarerr" + "kvoptions" + "kvsetkeys" + "latex-bin" + "ltxcmds" + "luatexja" + "mptopdf" + "ms" + "pdftexcmds" + "platex-tools" + "svn-prov" + "tipa" + "tools" + "ttfutils" + "ulem" + "uplatex" + "xcjk2uni" + "xecjk" + "xetex" + "xkeyval" + "xpinyin" + "xunicode" + "zhmetrics" + "zhmetrics-uptex" + "zhnumber" + ]; + sha512.run = "43954ec2acfd2a0e37acb55c3bc7496a9959abeb60787a4daa742cfccc3bfe5b88542d341552aa9bfef6b4224c79a14c5a5e9a7221cc0ecf83d22c9e6ce6a48b"; + sha512.doc = "475eb846b55672b23769af8757c7532b30d3d13d6667fcd71b8783ab291dd3a39fef6d255080745d4d609276f9074896fae7e674e8abeccad7c5984db5f88636"; + sha512.source = "59df412a321a4ad75e1b948dd12d250a844c042c9a7c5ef24f0108591fbb087ec6949b537788f070d496b9ead0e8b8de120b37f6977dd536bf10ac353d5da6c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5.10"; +}; +ctex-faq = { + revision = 15878; + shortdesc = "LaTeX FAQ by the Chinese TeX Society (ctex.org)"; + stripPrefix = 0; + sha512.run = "39ff8931e0007a78e4fa0788d7c7fcd8f25dd4cf4fa3f34b694e681e10dfb3d804842daf45a6e56b5ff450bb965bc322dcf593bdce176ffec27f4696c1c99fc0"; + sha512.doc = "0942a249a30f97d56bf5cbac2eb4de285a63406620b825a36d9ff8d46fbccd614af488f89e2af7472f1a9075a0e2b7228bb65a5804451df6945ce6bf4287b0a2"; + license = [ "fdl13Only" ]; +}; +ctib = { + revision = 15878; + shortdesc = "Tibetan for TeX and LaTeX2e"; + stripPrefix = 0; + sha512.run = "8999ea42b82e56cbb06e2485060b829a0781550834ea421607b4621199692976488f4031266eee1a6b1443b12828e2fb5148ff43eff137c01ee9db8770bb1565"; + sha512.doc = "65d8f613ddb651cef4c345791a4a849e3f672930fb94d1ba789e827b466c459bc321762c71675cb4c5fdec8fc456520bb7013d5b737b4ff2bd049bb5917a98ef"; + sha512.source = "b387b2cc636f98bf7bf43fc3be04cbb62dfd6597c419b7791605011f59981cd9e90737f9d2f0f668f63bf9abff854219a75a7527d881c991190188f307f3642d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +ctie = { + revision = 66186; + shortdesc = "C version of tie (merging Web change files)"; + deps = [ + "kpathsea" + ]; + sha512.run = "0180080c48fea7b717ff0ad27e060ad4564841fe2929b8db919aa0402886a00e0fa40f1398ef82bbf9e983343c9f9f6c797606045d55ed07e572e006588c7353"; + sha512.doc = "178a88260131781b6678ee63b1b35ecc0734525309b99c0d5bd4498127970bd67e30c23072392b6678186532a845c7e27188b1902b5dca52180720bc98fe3dd6"; + hasManpages = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +ctie.binfiles = [ + "ctie" +]; +cuisine = { + revision = 34453; + shortdesc = "Typeset recipes"; + stripPrefix = 0; + sha512.run = "cb594c2ef79a1d1614ad2b7bedff3b5bd9853bf36947751c880c36c73a458152eb7036861d0292614992623192841c28a3f4010bc0c4107fd8a4277154a1baf5"; + sha512.doc = "9e4f55bf8199b4bd06847dd39e67e91a8a6885b3903c9ea772199d9b9fd9d7cade173dff6f785d143b4e7c3b154477622a4c2cad14576b22068a6729693a8227"; + sha512.source = "1df5e248af42513b212d4c18cd95c8c9f2155598604624cf3b5e5e5b020643bdbb9c3addf03d8ff111c14185234d42f0db8a06a9de040fa0b58cec3895f32731"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +culmus = { + revision = 68495; + shortdesc = "Hebrew fonts from the Culmus project"; + stripPrefix = 0; + fontMaps = [ + "Map culmus-new.map" + "Map culmus.map" + ]; + sha512.run = "4f6f370a13ce2cdea9a1dd32bb1e2243000f4cd566f1a7698c641b9ad4793b3c1148fb914dd748e37b5e7bd6802144d4e1b9fd4c536df58bcb4863ad4f9cd2dd"; + sha512.doc = "4c1217f0cd27bcd56c11006b7b3749e661aba567798b2e397a21b3b0df39a35acb6355836d4eac4fd619509b09b57c7e39a97068343b6e28005944ebf0430adc"; + sha512.source = "2dc2e6bd71ee949208625fc259cecc6a0ffdd0701416c5775cc32855a2bbf8a533238e07d4fa08c090ed3ff627613c27f0cddeb2c86eda1b320cbc68e236a6a0"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; + version = "1.1"; +}; +cuprum = { + revision = 49909; + shortdesc = "Cuprum font family support for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map cuprum.map" + ]; + sha512.run = "578ce2e5af01e81ba80c0cfcc0225985722c1515e8f98460a1cb5d71d8ee4630d400f28dee04bb505c429b13f5cb604364d26503af0b5d9bf98164b218b09413"; + sha512.doc = "b9a9bda8eab6087a134b3b0660282998c7c3fa7fda8890e61ba107b9f7576d85ca01b59664c1c198679151e01cef6ebce5b8de29644a2e249a6ca2100f526fe2"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +currency = { + revision = 48990; + shortdesc = "Format currencies in a consistent way"; + stripPrefix = 0; + sha512.run = "d975cbe846ad5708a3558252094f4568c3ea4c5bc840dea7ade74eb8f6d90f4527b417a875a7bc286010473078d895cf510560f1287013e70498c983c896750b"; + sha512.doc = "1f32fed0bf778b3460e094239afd76b4be9915be8a3e8ea20b7e48b02f1ffdcffdd1e588a507b8145ed232a38cee43db1bac0e232c472d5b5dd85f1cf3954c8c"; + sha512.source = "c7a99bf685283b415c7cf71a6700bcf2928d2342f5db8a3b78e96148fc01ad028b0921a7c048f345dd5d5fbcb3f47618390fd580b02fb4ab1594e7bf5def9904"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +currfile = { + revision = 64673; + shortdesc = "Provide file name and path of input files"; + stripPrefix = 0; + sha512.run = "4c63d6d33c21a0ac9aed990fa79eb1457908d9301dfb81b3dc7167d5b8089ebd20abfbcf29380a7dd348c6ca8c131260e366aa55819a6affde146408a8e80014"; + sha512.doc = "e891b03438257ae5e8eb3b6bf21a44b05df274cc18877a6c39569e94dcc9f5e678aed5a5858eb2e9762b4a8ac6b04856839dd47d81b5de55e4023a369e09ba7e"; + sha512.source = "e68a86c05be5c92eb8a7a224bb404cfbf96e7950e6154e2446237692320f06368c0097d7ad0b57438012a36994e838b514e4588b6eb7d31478160bdf66bce4d7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +curriculum-vitae = { + revision = 68211; + shortdesc = "Lightweight class for CVs"; + stripPrefix = 0; + sha512.run = "a650807bb2a12df8460ff4b450af6bb7122a8629aa72d5e180e196ed3f904ab70e04fe0ae79474649d22534a0a7cf0342f4a1ff953355b8003e9d8eea0016d10"; + sha512.doc = "5c07bdfa540b65a6df224bea38b5865e44f08ce042e4b465be83f580a08976236442d7bb96573ea8c5b089aeff8f02e2a9b556997a24a73d264a557e775f8d3e"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "1.0"; +}; +currvita = { + revision = 15878; + shortdesc = "Typeset a curriculum vitae"; + stripPrefix = 0; + sha512.run = "c555b0e9c7a500e086f0435a2dc6cde8da8b02df4d27be14534d28c77c1f546aafecb863bc652922e07191d0441a77db647f8d1d11e33ec9bc6014f73a5822c2"; + sha512.doc = "b3de1ad371cead2829225015d60a4defe604e63890ef06da65fa9223cce4e748707f0b6f4f0b0dcdf22c3096e381adc3432a7b21b36f834c18ae4eb32bfba024"; + sha512.source = "a1dc7d983ac6badf9ced1492c712373205d5b0a91934f0a76eb1ac546470292e6c9dda4cd5f5d721e06c90d6237eb39236f1417d1c6992a774f7a9f7df9213bb"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +cursolatex = { + revision = 24139; + shortdesc = "A LaTeX tutorial"; + stripPrefix = 0; + sha512.run = "6c58f5a0f6fb8f129e202b786c258ba088efa44639f162b9e0109182072c16bfc6ba928953d6e9b31b2b1c2f693fe064476095c232dcb9e0c6bfcf18bfb7994e"; + sha512.doc = "a0f726330a5b2d8da94cbf25fb1b1a2b22e5e9010e0cafdfdee3781bf518f0cb48adb27dce0fe2e46572460f8c1749c0db1c16e06343cabb8cb94227e3da58b6"; + license = [ "gpl1Only" ]; +}; +curve = { + revision = 20745; + shortdesc = "A class for making curriculum vitae"; + stripPrefix = 0; + sha512.run = "9d318d35ef04d171da1c36ab4646465d4aa0feebd90fd3e97db5f1cf09c28c174d0c3be288c369215812f51ca83b341abbfdf3fa44458d1994cf68dfaeef0615"; + sha512.doc = "7a56d7c3bd8b9b13ee675b99a2f5a8a27fb3dfd81dc5225f3a880f338d5390c893ca887cbbcd9ad8deae2a1d6b6620ef664ea64384f93fd93a75a5c886641a2d"; + sha512.source = "8e5026da24dddda0f266b8431fb28c27037ad920e37010fd97fdbfb5dae8024cb687b681356a6e27244dd4812bbd043e12c91508978dbe796a119e3e8633566e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.16"; +}; +curve2e = { + revision = 67599; + shortdesc = "Extensions for package pict2e"; + stripPrefix = 0; + sha512.run = "36b8d1ebbc07ea1cb78b85fe2c327a4c932ef0a88881ef9185654cda6865ea5ca017aeb33334f603fad74fa0245a531f50e2016c912da4355cb552ee5e069f97"; + sha512.doc = "d28134fe19310084b6ffee13bea26b7dd131789a124041cbecb500e070bb134db98d4cf01d7d970781ad1823327f363fe886be9615d3458ca6763fbd7039f0db"; + sha512.source = "7a9207da9be81c2dd9de00adf25f81adc2bec671e4fe281904410e964670968103a4e556806a287e830aa9aba908c353606884079f3509a66975dd9411d2c886"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.1"; +}; +curves = { + revision = 45255; + shortdesc = "Curves for LaTeX picture environment"; + stripPrefix = 0; + sha512.run = "b2ac96620bdcae2263e0ff37ef0975fc705efd2ec30fa53a5cc50d54378cb29c6ef44543cc321e6cb37dfca0ea9a6cdf85777825703b866bcbad9729235c9722"; + sha512.doc = "afd68373952dbf2a97944bcd7b36dcb62d5b65727c660af56dd8da97137ef4845037988e211996289fb54efa435833fa4a503ae4bba70ab38cd6e55f1966db1e"; + sha512.source = "cdef0242776f9976f72d953ac743a4771ac5d5aaaabf6988ef37d695c78e206f43d546bf21621c5a9f91e191c95c02ecbe9fc9d7e3f1eb23372a755856d61d2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.55"; +}; +custom-bib = { + revision = 24729; + shortdesc = "Customised BibTeX styles"; + stripPrefix = 0; + sha512.run = "95b485e330c97242bbea4b989ea9e70882d796f7ff8fdbb10b0627d102ef6177c8cdfca976a89853170a9171a69499c58711d1deeb0e420f9cb268e336d4f663"; + sha512.doc = "3d5fe696f095ef5661418e3066f2f98768968eddbeb24ce9ec84647b78452f97482ae1dd17cd9c84cfb81fc4a43052b05ef6aa4080e32a464d2ba4e8ce33869b"; + sha512.source = "e17d437ae7fb0c1328c2fa333f1f7d286a517bb536f7cf2d66ced327d1ddc78b97791852cac8fc9de4994b41f1433da17fa1e41838ddf90f1fe387eaa9e477c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.33"; +}; +customdice = { + revision = 64089; + shortdesc = "Simple commands for drawing customisable dice"; + stripPrefix = 0; + sha512.run = "d537d8357fa1d718f685d3bd05afe849eaffcd63050b8ef5f85dfea39260b9268e7ed12e727ac3a14a7194f21e4de158bc0a8143408c45e5f3718ea143a27aff"; + sha512.doc = "7512a7fa81198895666d135bd50d75345e8d7152289f51126fa3fb68a028f05666d4807e63c82db5068a9aeaca11fcb06d7b0edd4d77804bee195409bf042144"; + sha512.source = "8ab4af162c7abb96a129934f5c6b1471ba781d43dd7d0dd220a53638010c9c082d26c634a3e65c02f51bb92a7603a3aea9f370e82cea1d8de17afb9d815d1a33"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.1"; +}; +customenvs = { + revision = 68637; + shortdesc = "Custom environments (MCQ, list with picked items, ...)"; + stripPrefix = 0; + sha512.run = "d58a216909f8bf7c425f0836c05842ca918b03b928a57ab06223a82fa588a3bd3d515f6beb5ed27330d5566192a234a08385ac387563db8ad171b928749b488c"; + sha512.doc = "d807f71f40367888621fefb52ff3fbba1d5b301b670710461b0feb79eb61171ec6208de41ea15ab39c14650734f2ba6a2c5f89182f27072c87c9564fa462544a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +cutwin = { + revision = 60901; + shortdesc = "Cut a window in a paragraph, typeset material in it"; + stripPrefix = 0; + sha512.run = "922ab4c0f1158fa699c883e0fd8ed942a077c3b3109b048087756895d0ab6ead05182fbe17ab19310b78691fd77444d1460c7e021689c2eab092ed82974ed6d7"; + sha512.doc = "f37bc538e4affa716aa315535fad7fdb2bb0e5188844d028b8bda4935339965e3f375439ab0abc62d63f2f57c3d439a25888f29cdf3be484092a57ff86c86c72"; + sha512.source = "d3a544d356d4afb5599379a1c767d2aed9ace420d4540a1c62b617cb8f542fbcb225ec4e42ab65f7ddebf91df3c77a6b9bf0f59de9e6a11e06ae68fddd5b21ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +cv = { + revision = 15878; + shortdesc = "A package for creating a curriculum vitae"; + stripPrefix = 0; + sha512.run = "624d9bd1578e0d2e40e2ca76cd97d7f44d9da5c71daf737e06e6b6b15c64911af17f0da197afa17b5ff3b145461cf7efb058a5cbcd02e7c21642e660cfa3ca4d"; + sha512.doc = "c04b207a635f1b6f76e316284da987b45fd4387961c59b7b1f1b947284937f91f4d95ade824195d1f0db00766fec870e6859a6dd27cf3b6b426d095866f17d6a"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +cv4tw = { + revision = 34577; + shortdesc = "LaTeX CV class, with extended details"; + stripPrefix = 0; + sha512.run = "607745abedd1325c59bc8ae360a1c5d00834ec7bd050b057ba5427c135f17046027da3fb6130a0718e8d33bcab74eaf235f2de7a1ace483da1af87be5e559867"; + sha512.doc = "d9166421ab15d7569a4db66970486c78af43ddbda9d7f9c9488dbc46eed91ab5079c0f9b7851835afeed6045ee4c65c888e1be93a95cda14623405847267880b"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.2"; +}; +cvss = { + revision = 65169; + shortdesc = "Compute and display CVSS base scores"; + stripPrefix = 0; + sha512.run = "563d310188adc99e14bc93772f8f94af0741665c15d8013d9cc98fa5d86129d48b62473835973bba90fcb4117fbd782b029b87045e5b392fabd308c8f1a6de42"; + sha512.doc = "604139dd0e636b5b050d07417f7990c741e7400c7c656d76fb15d56a76b869a2805e43236ac2ea062826df5f102753c8f1450a4e09b24dbc2f96b6668975bbe3"; + sha512.source = "771545e51e6066529d43edd5f14f070c816c8b86478f5e2598929f34838dfd0e90d9ed666d478e8f5c3aa14da9f6f7b8658e6b1527f212c775cbc2c7645e9e2f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +cweb = { + revision = 69586; + shortdesc = "CWEB for ANSI-C/C++ compilers"; + sha512.run = "6ba6d7e560abe642d30e4b9eab349eeb0135666a8f6f27d1e0e12d825048ec772305e0870edbe85dd3b977fb3e3ea0c7d3de84d9c6a02316be9691092c6b34bd"; + sha512.doc = "306eb00fed91a6a7ec679b9ffa46a9f5a8747817cdb3230accc5f322505aa928bb670eac09c77b508186cb3e308ac347bea3107ea0a5dafa2aa6075555e0c61d"; + hasManpages = true; + hasRunfiles = true; + license = [ "knuth" ]; +}; +cweb-latex = { + revision = 28878; + shortdesc = "A LaTeX version of CWEB"; + stripPrefix = 0; + sha512.run = "5d94dd53bf3212967ae38c094115c4ae581ec15a49e3d0f64be311cd1aa190eb9efdfec2cd83bbc3bd89250efef9470a6a6af342247fb9670992546a976a5886"; + sha512.doc = "16c8cd2681e216084564cec718401b9e8d98228e6597d38c42f8ef4cc4775e8e606fa11c84d21f0450d85ee18c7ed1e5fd9e1f54bcd0e8c2927b1147ecd4591b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +cweb-old = { + revision = 49271; + stripPrefix = 0; + sha512.run = "efb1c9b65f7c628905d2dac1373da96346b6b6c78f15e8c0c8055e86c1a52b09bdb5f78fb06106e350d10a8daa378eb45f5fe788c6c3d8b23f0b47c3db6f256a"; + hasRunfiles = true; +}; +cweb.binfiles = [ + "ctangle" + "ctwill" + "ctwill-refsort" + "ctwill-twinx" + "cweave" + "twill" +]; +cyber = { + revision = 46776; + shortdesc = "Annotate compliance with cybersecurity requirements"; + stripPrefix = 0; + sha512.run = "f79e9ce92036c8a106de0a5da06f5c2b833683527f1225f5b69298b6d886cb967f9d1eb459b7a0543d89b0943a8425dc802619fadb9d69aa4f57a5ccc71a593b"; + sha512.doc = "4dfc2289e92552dde5cd1703e5644e6a19f4281dd16cb80d86caa35cfbc07eaf0f5cd57686e185adafce3883433fc87b1fcb590cd65087571115dd4b98023d02"; + sha512.source = "cf9beb92528c860a3ec39041c0436d40d113bb0cfaf89ae9c5b76dd44ca18b846b14739c1a2b447ea1ff84042dbecd48ac2cc118615ebd30013da305e822c81d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.2"; +}; +cybercic = { + revision = 37659; + shortdesc = "\"Controls in Contents\" for the cyber package"; + stripPrefix = 0; + sha512.run = "f3bfbece973cb3b9a3077c160b0212561056cbf7733e1c011b39fa1dbf94395937f4858964acd0874f1cd3ba283df9797cdf19e8e71e7363a7619c5ae653881c"; + sha512.doc = "dc72453f55c6a72913865f584b026baf287a35885548ee5c2c8d29cefd60595f4aa9f7c456f59ebf3ed3e3b72711beaf90cf85f24c2ce6773146fd2a4724767f"; + sha512.source = "55223353fadf2986f777b4a61b2f34662f493d2c70e29cba8712625c16dfa49ba50644d406f49a908afb0e4b6816666c1cf5f060685d5428eb2787b6b4ef233b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.1"; +}; +cyklop = { + revision = 18651; + shortdesc = "The Cyclop typeface"; + stripPrefix = 0; + fontMaps = [ + "Map cyklop.map" + ]; + sha512.run = "dd6584831fae3eb388f66e42f289f9bdeff401412c7df471752c4aa56bc67c16c56f6f271d11c289a1389faae138ac15abc41bb716bf344bc2f49fa087ecd380"; + sha512.doc = "4d81a01eea30a4f86b2f0a7c9c21923196dbd28c7d5ba5c1639068318ef227720550b3052cf0ead6f3194450d50dce9acaa325a0dace0e6fd230e0ed11d9b106"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "0.915"; +}; +cyrillic = { + revision = 63613; + shortdesc = "Support for Cyrillic fonts in LaTeX"; + stripPrefix = 0; + deps = [ + "cyrillic-bin" + ]; + sha512.run = "1b8889d33e5433b32d0b84bd31ef7ea96fe338456ef8e1732ea6c254dfe2f21d3600766b1e51bafa4ddbf0144e8420ad8ba6ad593eaa32c3d45dde99b0b4ec8c"; + sha512.doc = "b0b1d24d3e8887c5b9c251922157de7cf042845009c07e62fd324ba850dff9f39bc6ebad04ab216ad69070da93f77f68693d1be57cd15b038374f0253329c8fa"; + sha512.source = "4dc564f475a883cb75ae0fad6b5aecb936c1ab9cdaae857dc7cdfb3d8f06f6534542c36b053cc7b74f455a2646f081060c670b35f1eda5fa69418b1c1f97e5dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2022-06-01-PL1"; +}; +cyrillic-bin = { + revision = 62517; + shortdesc = "Cyrillic bibtex and makeindex"; + sha512.run = "30d3bdb0f92a0006613dee654714818b6961207029982d62b9933829b3d044bea0b2d9a30d0007dac23c08358a7ada2df9ac25ee92398cb32d47e9c29c503c67"; + sha512.doc = "91da42251e165d17507b37eb48b35e157c75b06fa8822c9717fafd5e7aadc60bfeb084dc30a5ec32df22ae4e69c03c3f00e8a243d187881212ffe62c96b6235b"; + hasManpages = true; + hasRunfiles = true; +}; +cyrillic-bin.binfiles = [ + "rubibtex" + "rumakeindex" +]; +cyrplain = { + revision = 45692; + shortdesc = "Support for using T2 encoding"; + stripPrefix = 0; + sha512.run = "84651aeb63d3e47f208732f3c0d54ba86862d0ff7da7c56b3d8b8d1b49b6b88ed4c5f9abfb4c1c9d8a1ef8a455632aaa69408651e238bdc4aeb4eb7709f62096"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dad = { + revision = 54191; + shortdesc = "Simple typesetting system for mixed Arabic/Latin documents"; + stripPrefix = 0; + fontMaps = [ + "Map dad.map" + ]; + sha512.run = "600bd3267a47e5513f51e67135920c15aa7aefb51f2c3dea6e912f26d1a45071f936e4c568afd322aa7e89d5139e68398b394c287d5076c17e310297fa7f8fa8"; + sha512.doc = "97d4596972c436762e33bd1d5077f7fdbe7da2a74b016a8841ad98536c2e9d9a2bd01a91b1ad2fb306c7ba06a0a5532d47c7b813d42b0bd82a3390f3bd17760b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +dancers = { + revision = 13293; + shortdesc = "Font for Conan Doyle's \"The Dancing Men\""; + stripPrefix = 0; + sha512.run = "f570e4c775a7e4cdbeaf2ad764ee147a685b5332369aea29175a76fdc9fb37f052da295d20a177eda8e4b8352d733034eba36882c2507fe804d7b996c0e0537a"; + hasRunfiles = true; + license = [ "free" ]; +}; +dantelogo = { + revision = 38599; + shortdesc = "A font for DANTE's logo"; + stripPrefix = 0; + fontMaps = [ + "Map dante.map" + ]; + sha512.run = "883c5d6f8368bed41002eae123329954fe38cc23a5e6db7feecd57c16540b6b9277cf7d13af6ce8f63994c11148708e1d3dd10ddd9d17457b015d40477f91eac"; + sha512.doc = "4612de774c6a39c7f09dfc99aa182fd37d9f3e32dece37726f1e87e48e5faae246f2959992267f5b2cb685c26177e47c5112fbe42b8f1ac3a60da92e6276a681"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +darkmode = { + revision = 64271; + shortdesc = "General Dark Mode Support for LaTeX-Documents"; + stripPrefix = 0; + sha512.run = "f844ce29d5147d9a558f257bfd1a6c32f2f1de1fcca4f3319d22528da052fc228e61606623820fe078db208509774dfc87dcd82058a2e744e703d03edc0bdec1"; + sha512.doc = "db103f2257b3d844592ba12c0e2c22d6ae97e8dc5e47521392ddd59951d9f9a56004d0891f0a5e84d511ec2043f1fa26c4cca4ddfa23ef7abea39637e6d54a99"; + sha512.source = "39a760fd973d56c94f60026906597bf74b57ddc8a0bdb913856a06358b849999e7f7c49c54e102160771e599bc3177da5788651f48abaffceb14d9e77465ac0b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +dashbox = { + revision = 23425; + shortdesc = "Draw dashed boxes"; + stripPrefix = 0; + sha512.run = "a52bac248fa26031db34686e57cd3c9be90bc18b41339d7e2dc85a68de1de23a627648599e5fdb207d3364b2b4e3651aaf9c2d90e6c3bd0f0fdcaa30fbc8932d"; + sha512.doc = "26672278ffdbdaee64b82f4e7554b5664ca3410ce8009454cfc229e3590439b4a4e212b77568605adda885761f5ad456bca022f198e259ff9a33b8e0abc1ea6d"; + sha512.source = "833bcc8f98e6fbf3e205b54311dddb9377026234132e5f988abd25e3ace36b9f3b54a95e98a5c4cc40ef1f049536093b0f779517c6f5a63a08459bf0a7ace741"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.14"; +}; +dashrule = { + revision = 29579; + shortdesc = "Draw dashed rules"; + stripPrefix = 0; + sha512.run = "4b1b993e9044eb2ed4bf6bde0c114b0cd1fe7daed38f8bc5d3e25a2705d55cb41b8a372cce84b0d61093044d970003a4317de98cb468978c8cb1a8315f980940"; + sha512.doc = "f45e0785d7c6522683e724ca27f7505e3da6bf5923d5a8c71a75ef8c67ffba8a4e4711b91b64f25dca95566448cbf74b5937dcecc73f5ec0aeff7ace8d0e4c1f"; + sha512.source = "0cf95a6d5fe3e80e9f77266033d64186300676d74a7cc39dd6f907784d1a6f7c9f83ff5a50198eec8bfc075ef5adecf58d226063f3f0e02f55dd7cc0daf691a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +dashundergaps = { + revision = 58150; + shortdesc = "Produce gaps that are underlined, dotted or dashed"; + stripPrefix = 0; + sha512.run = "c3ecf5c63fad14f82228913e0b12c6596a9aee24b6de3419a4e95de8de94e40e3d43c2b163a30cf221602ad9c1aa1c3ba42429ac2adac9d13888d74ee1f4e900"; + sha512.doc = "88ca6be34c5d68ee4f983b9385bd83047e59bbeb94af12d2bd16105bc8afb99b8e6db9d0e25717fe5bd517d7e834d8795bed30ba24455d8f09760d1ad2c47803"; + sha512.source = "1fce3d4ccecef6c2f5775792162a9cf21951f0006e168df236884f89a4bcc662c1ab9028e856805ebdf19dd410c109ca3de993c088aa9c0611ec98565be06be4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0h"; +}; +dataref = { + revision = 62942; + shortdesc = "Manage references to experimental data"; + stripPrefix = 0; + sha512.run = "da099bb462ae2698784097cb04268b039f0900fbe57d77284532c0ef694c50d422436e5e0d8ffdc9442b98c12d52c72629b29f772b0d66f226ebabca579b2249"; + sha512.doc = "6f51ed66ef467438a856ed22a7644d2bc574c789e89025cead65393d701abaee299861873d97c9509522ac7e478a35693e34d2afc0bee3d08d862b11992e4230"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +datatool = { + revision = 52663; + shortdesc = "Tools to load and manipulate data"; + stripPrefix = 0; + deps = [ + "fp" + "substr" + "xfor" + "xkeyval" + ]; + sha512.run = "323b1526a32eb4e0d81db77278d66ebb6ac91fa357f7f76c8ac1f199efdc4be17ae4f8fb83fe55f3ac9cfb8a18d163a85d6c21cc11c26e4dea0db5f85dc12dd5"; + sha512.doc = "32b5391c7197bc29783bab0c93a5225784fea999f69bdd8b1b5c152ed338716f82dbedfdb6cd19064ee409407c0b808e5f410e6090cda6d1f8ded2ca41f3ace9"; + sha512.source = "e149a3be96ee0161b2bd872ab73e74c36ea638f0a1f0a48e0268093bdff2c2c1cfabe5c0a4d3ca8ef7ee4c02bd03710c5c1b2ff9c1b543ed792a444160814493"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.32"; +}; +datax = { + revision = 61772; + shortdesc = "Import individual data from script files"; + stripPrefix = 0; + sha512.run = "04de65ca5219e0e3b53fd0c0b92fa514bec77be2f889e48ad100f93113f54e738016fdd93ae59d79ae7f4ea31108efb9cbac87a6db010b71008fb17dcfa19900"; + sha512.doc = "e1dd35b5dce9a4ea5b1bb9d9db14b8e6b6f8ab1a8f374079c2328862fb231b4eb69a05e1bddac424401d063925b4a75a9994000ee4c36c43e3fa6344badd6f5e"; + sha512.source = "076509cc39ab41b028cc17551342bcc26cf8bbcd5c12d25d291e2eafb3610d390610d36e917a192b38fd7870c6ddee60a365bfa9711b024c6de2a3494dcc498a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +dateiliste = { + revision = 27974; + shortdesc = "Extensions of the \listfiles concept"; + stripPrefix = 0; + sha512.run = "6da6a802994a06e040d43ac7fc9db0515d9273ba9d4cac061e04b05922f9eb9fecaf138eb641b3149be7b98f9139c428084b6470bc177a020386e0dc053427b6"; + sha512.doc = "53ca32cabd7e3a32d02c77beb076b08ccaa782b6a2ae249b932242987741f0e255bdc83a2b6ccc7ed2e0efbec66923798026040745152f7244984a0843c8c23d"; + sha512.source = "563840e069cd1e1c1e9b1774c5c3ee8b1703305fac3fd5f58a0afe76f154210150be05f779a94717c227978d2a1317a10f5b6232f51dc7b3e422638b84b2ce95"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +datenumber = { + revision = 61761; + shortdesc = "Convert a date into a number and vice versa"; + stripPrefix = 0; + sha512.run = "5c7d23f949684000d0e38855e11e4869433c33f82fc42da0568d4b74fb0e69fe3fbcd5f72516222059ee446938144c18b10552290e24e077f2e624286e729d28"; + sha512.doc = "18f2573f8c02685d20085c31384b75dd1ab5a47a5bb2b9dcda036a7cd1ecec80db175a674c1f148cd51a078721ed88a3c9b7a0915acd7c023c02ea9a16e2a1f2"; + sha512.source = "7835857f1c4f3e59918fe9ecc903dc09139191b050b1b0166e4e1fbe4a5d0c95f33b8591f30012ef5d69af324e8a71cf24b39893029519c13e13d8044b191261"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.03"; +}; +datestamp = { + revision = 61719; + shortdesc = "Fixed date-stamps with LuaLaTeX"; + stripPrefix = 0; + sha512.run = "558e8ec60ec317f8342efd63d0146b92e43ca37a772b8fb200a40234d48a71e5374cb3f3f15bfdef129fd1fee8ed27491bcb8b69ae2b681abee72a3dcb8f18af"; + sha512.doc = "d9627cbb294f0bcb96b019d3497b12ecd4b4eb656a1dfd70d1adc6cc4cd217bed9d4f9e209497c683f925cff4063d759b02b44bfc1f38421a9044aa8ef8bc988"; + sha512.source = "3afaedee82a4e4c6f92f465fa59ccb29976272a75aeb523d8c161b07bbe313b5e79dfd96195d0426926a3ddb3117944ab21838d085e1cd59256bae31419e243d"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "0.3"; +}; +datetime = { + revision = 36650; + shortdesc = "Change format of \today with commands for current time"; + stripPrefix = 0; + sha512.run = "3d033ee164d52f7085bffdc12f2062be7e94a644d9ed731b4d1b97a3a46838dabadcf6687063e165c65fc938a51a4adf8078339b720a305175d6cd6a3b889f07"; + sha512.doc = "510449d17b09d9207b76e732b5d426121888cf653f29bb3be8872b74a243596ac339f09d11a14a4a3007f8818171aab28727cd1713ee35c8908d2d168a57d9b0"; + sha512.source = "3e03ba12952ad5dafa701c7ddd5d79097890d13d3510d420cc399b30b1c60c2b6f72bc5caa2a6d2f53ec50430d13582c5c6fb549dcb3566f827af0d4abeaa011"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.60"; +}; +datetime2 = { + revision = 63102; + shortdesc = "Formats for dates, times and time zones"; + stripPrefix = 0; + deps = [ + "etoolbox" + "tracklang" + "xkeyval" + ]; + sha512.run = "7f2ad65f95e3881e5016647bff85b10138faaa7d26d097bdce0ec7b30cc0d913a43c2a45b0caa69a6669e54725122cf1a86117d0d4f543caba67058423af7f62"; + sha512.doc = "d43970aea6c7971ed6a3564a6681caea0e0f5606607496d9ec51d6c2fa741dd6c28754c9e9f06cde0ad1a79280b53629eb427faf820d00549468a650cbd0eac8"; + sha512.source = "511c10e67c7d77ee10d8d75704628313a1598636ce82a5ce114942854b3a9d2da237ed12fdab986f13b04ce3c2123933db91b850360b309aa52305575a7cf2d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.7"; +}; +datetime2-bahasai = { + revision = 46287; + shortdesc = "Bahasai language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "6bc05fa0f1cfbf05008de715f9b278948272cf7894e8c29b52b6ee4ba436e01e5588356fa020fd5453ed2e9bee185cb46c54ee3e808417782587c9509bab17fc"; + sha512.doc = "d9542fe7057b9972c6e0b9ebc1360c2fde8f9b3538e70efd7249f0bb344f2d5c2845acac9ce39fec6f9f7197b47e65496ffc662b9f3a3044829e4709d6202995"; + sha512.source = "7edf39f7e2c5b44923e66cf3dee57e7681c549b7ae944ba2f4593e4643e9d50b686b8c1cb6905326899b6974ec5c0587ec7a5f4f880b5b1e81c94667240c601c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +datetime2-basque = { + revision = 47064; + shortdesc = "Basque language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "73d7dcb4a2d13d4ad4747d4d2a19b839bd9a1bd55793657315832178091357f61d9b748d5aaefd317baa7f52df2a4926dad6196d11d11cbce0df78168b2ad380"; + sha512.doc = "ce083f982f95f5e4beb33a706144d26f6f09de8ede946ac89d28ad5e5c75f9a475e4e9bca5fbc7773ee90a91ca095f0b1a9908fc0f74fcbb4117ec7511d603b2"; + sha512.source = "a2bab4c1956a0471571221a57f85e9f4260e349a9b775540638255d8313f5db2c9922120e045b8c769b7b7fe1698c7fcfae1e1aa101e858e84aac32673f6fb86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +datetime2-breton = { + revision = 52647; + shortdesc = "Breton language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "725766f3227119012a79807c5909daab83e8056718cc4e116d8992d13e11867439d71392cdd8a2118f2d8ead61b1d36af5ae42438f8ca68f26ea14f0bb7cd0c7"; + sha512.doc = "f421a467caa9202ec50678d398e31e1c4cbb4e98805bf86114c97fd49479670e825c1c091955a41056adf0f9c7596dbf5dd14397326c1b88fbc2b6f75ec8ec55"; + sha512.source = "0d1d5ab08bd27ca1e322ee25f8a6d58733d29291439c2e901d971969f4f05148b2c1d660567ef07ef9d002e7939dc10d5bf37f03fb23728e6242b3db783928b8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +datetime2-bulgarian = { + revision = 47031; + shortdesc = "Bulgarian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "fe0cf5eb73c5253467a8d2b972cc20825b5179ccd3964f64656ee8f4fa5d7fb7bf1660a7e79d58c491fe74e8c9421b75c177d4c8bf7309782c81ddeb69ff1203"; + sha512.doc = "f07df79af157b8ed471f5c8021719d8ac4dea9075885cc42ed0d64405692efc5ea59b6a77448225aee477b8fb05d564ce9155b7e1efb3d9cd7b7baa794783cb7"; + sha512.source = "9692b6932f74a7e15a625612dfefd975a948f8a2111401c44b156702fad868d7d34381191b5cf675f0c17aaa6234071e10722f6b912e80f8afc4af69353dbc6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-catalan = { + revision = 47032; + shortdesc = "Catalan language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "7a414761760e3fb61ed12c656a88b6ae4d36b8268998f10ffc85a9cd362a6ee60b73b37c0994aa47603e805d785a3a0faa7266efa46c3e017535b864f2282e5d"; + sha512.doc = "d1613bf5d8a35f69bf3dde127a764434b8527f0e627cecbdda43490642cb8d0a10ae629bf5f1359b7a87c12b3845bd468fb2c00b508be1d2cd80b6ad98904ebe"; + sha512.source = "35fbd618c48265f4cd6bdccca100396f54b6379111189f8fad705e93f69026fbbba21f246074a3d154855b0a04e83c4a310b99c78e2105f821d109cfdadff6a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-croatian = { + revision = 36682; + shortdesc = "Croatian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "603052fb5cff6ea8fa5b951623efb1fc72aa6583fa1ed560b4c5266ce96cdd209423773ee0d3a592465247343f3fff966d7a9cd9698e02e339d5a1c579591f37"; + sha512.doc = "a56060b84fc6d2917fd0cf160f0405104a3413e02456ce91cbd97aebd746b0e91c730d2e2e4bbbb46f39521b5c6cbc45558bb4327c7260719ce21e8226fe5910"; + sha512.source = "5eca1a663801a65b79e0cc069bfa8840e04e08e589445713ea0646f104f5acba51d6f925d2d4ea1c36a83b8f4e095693767a3ca71a33af1015fff5f396c51bc4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +datetime2-czech = { + revision = 47033; + shortdesc = "Czech language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "048ffe6258ce1d4bf9d098e7623d3c5e25ef8215a538e33806c4d35d6368fda81941ff9adbb394085c9b4f058fe9a3b02cbeeaae8cb1f7b2bb55aaa35c743d61"; + sha512.doc = "976e98000a80e15a4ea5204f15a5288781ab35089bcd9427b62fb445f28a25ba0c03af4e64a3de688a51c5c94788732fa199705a68de3e9925f1db4ec7dcead7"; + sha512.source = "9ef924462b97d29d6102cb691d1845f68ec50054a71d93222b61af91f510211016fdaa4861433a65c589263af11a62cb23d64a79f5bb26624395589dfa812515"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-danish = { + revision = 47034; + shortdesc = "Danish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "b9e5b442282fcebfc114a772af8317d8888cdf24cd5cafebd5d3c79e3ea8790a4fd082c2facc1a466e7e5b4266b0d93ea5fb6cae64f96f3d131fd4869a465a4c"; + sha512.doc = "1d933d9d48ad6ef3dd0716fce0b2da6de6700bcd8c1d729d8216145dc5f243ea83323b0fefb6adeaf10a9fb264343e1b429044aaf86e6a77a121b0c951c2c77a"; + sha512.source = "dbccc381f173d7204eeaeb8b8a4fcf59e6f0750213986207afbef3754554e4524e1ceb3620135a93ed43d786210583b3f931b41a1c645bfb22e33dcaa45a6c85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-dutch = { + revision = 47355; + shortdesc = "Dutch language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "c14fcbb882183095c60f0e881ad1668f90855b90cce352922a562371bf2cdd556bd196ec85068775b9aec590f098c956c784b98da283ee1117bec68ee585f5fa"; + sha512.doc = "e5f2fe126eaf87ef34dce686db6e9b9c3c322a2266293517e803435dfa67b55da6a771f6c7253203dcae0dd1237096093a6463f6bbbc096c108b73bac4a641d8"; + sha512.source = "32036be5e4e8643da1cd0a2a291db4875328c5e8685f711e247eb7fc38b6b25b92db2f98bfa3769a02c982ea09cbedc75bb963d3f39c36860f9c335e73e331c9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-en-fulltext = { + revision = 36705; + shortdesc = "English Full Text styles for the datetime2 package"; + stripPrefix = 0; + sha512.run = "19f08e264921b8b12def2b20bb1d904f90dae712bcbe579a9697d1f657f148ad8311c6d7a8621f336dc82518ec64438640b49776fdab62f302b0919cc7de8e4a"; + sha512.doc = "a6ed1e804d8229d735aaf1874458dda3206ecb5e648c35af82a1d3fe524e65aeb7669088dc4bd9fd83919263d59035fd539a8318a24b2bc2470f14670e28eced"; + sha512.source = "9bf741dced10ac57d7c4fbc3a8a26b49b35d07a221f4d7ecf56ddfdea6500edeb39ef75ed0234d6e510ea07da5da06cf29691a36545dc4367b3682e879d92b10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +datetime2-english = { + revision = 52479; + shortdesc = "English language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "2faf2dbcc9e49a9c30e5af599a26bb6925c6cb6831c1eb38bb58e08f50314cde1f3ebed343fc43ff50c6338a089caf90b8aaa53093f1284c583ba217c25cafa0"; + sha512.doc = "ff904eb3279062f6573aa0190bd2f7426a18f4b67564b9b10673a88c4583c580cb88b33ccbfc0c8a979b10f6d2379bd22ad8483f19b1c4baf3f66e06d2ec52f4"; + sha512.source = "f5177d83f75709135356331615baa47cdea2a01fc706bb507391c40866b1d072260bbba4ec33fe88ce44e9995bec77941d636e5ec6132b6c4f07d2f1f25fffae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.05"; +}; +datetime2-esperanto = { + revision = 47356; + shortdesc = "Esperanto language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "6406e5a6708c1c97da6e0f8460ba70d61c403875497c57008013a3d1a8a9100b344b3d7267ed869f777566aa403110e17d778e2a47b3970846324bf08e8ae046"; + sha512.doc = "c200c3f39ed756765876ca5655b99025a898719f9723a996bd4772974643e0421edd8d36a8eeb00d29dc75ae715fb55927e31f067b1159bbb1f4dd218de780a7"; + sha512.source = "799b2197ce9f0950889a933952dcc33dc0ad2cb97d906baa61bdcf8d32bbf341d65aa2c2f1509fa59f366cb570e9ba6b4946d4d5785c5022c55117297192a32a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-estonian = { + revision = 47565; + shortdesc = "Estonian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "93e8ebc62b48da8f5c159822f53c35aaa2cbd2fb6bc701108cf6452db7eca3df39de3c1ba9b84136683d22d65a975dc138aace0a81960d1c9382309a4cee5f3f"; + sha512.doc = "268b873d870ff19a3151d4244b0329994e559ab61198ab3d76d830b1bdd6a05e8b5a7a7df2fd6eec8d57b9e28626f80af755b1866f4ee90eb0c7e94b85f3c087"; + sha512.source = "2cccbea84fc47da4668a06154b97116b39e1aa51e31196c7c9a41d517aa5f24924c86474fa8f7f1252e356a85392977553b6a28ad154d246bd5192a7e7f07b4d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-finnish = { + revision = 47047; + shortdesc = "Finnish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "45f971bd3711d1424b002f32e0535465658e50cd9abd9758faa3685aad6a6e74747e7b3cc840a38968ef49ecb91b3007ec678f63f0c0ad3b77ae0c39bdab2457"; + sha512.doc = "01470814a87a5c87bb54b17a763011872864aad8d1f78f82c2325defb7f135daf34aa2b721bb4cbe7ec80efcf839372de07c29245ecc477708fe60f3d501a258"; + sha512.source = "56f4b99f506673c89115e37dfd9458f5e3e55b62dc9dedca98747bcbc7e6e27306dc2711c05b0c8e2844aa03a4c8f7835bf6643ff082b7d1ed246a68b2af37d3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +datetime2-french = { + revision = 56393; + shortdesc = "French language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "b786e4534dad90a76fccae091d86396324c4f5ddeffed4a2aa44d2df53cc3a05556265603accbc5f07bd1464f00caa9fd5ddaec0faf8e10b4edc9ea036c3f82b"; + sha512.doc = "6744ddc0a8cd6f190de4462a4629d01b57d3a3bbd33f7c2fda8529685316565a579903bcf4192b5e811cb879eb01427c3d03c9c94ea59828b03f1763ced586c4"; + sha512.source = "0566b2fefa4f170bece84fc5cf76ebea6805f96d48476f1314d2cd51252bfdc9814ce5b46de2a78a808ff1d8a60026753ead89bad17f022b717d36c0d6e8110c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +datetime2-galician = { + revision = 47631; + shortdesc = "Galician language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "050dd3e5db5aaae106804a315e679cdee0a4e9fc2d10481f21059c410a73492d6e41d9db070bbe5112377a4f1dbec3345bc5f87efba998130cb20e31a443bf34"; + sha512.doc = "881250aaf53eba33ee223e5d87f0d8d4081785ea723d5f2e605d04767aed63b2fd8a592eabddd4343c489f1abd809218c600aa5df2447b24bf0465e7a31c8ff5"; + sha512.source = "671230a9b4da0cfec5c1afd50db2ec103c1712006c70be0c9d6d1eec637461005673c73dd1c457561e54af1409072fab111e7d93e785a91ccc6dd0cbbb497127"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +datetime2-german = { + revision = 67201; + shortdesc = "German language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "1c020ab84d3c6f5b5dfa8170d9be8344c6a63bc3a7f462b29697fbb892eb4061a502801177bf21408f3a6eb68fafb8b77711c125d23e662ce1510f75117c1d03"; + sha512.doc = "f050add5492691986f50007fcc48fc36a0a19e6a23303062c5a865be753e0c56f4f5f955efc22c4c838fbf9af79f91e0f488e00027f4bed045af483ce06cd24c"; + sha512.source = "f131874dc61bc52d040dd25ce684782d50c0519c03294f23f9c6b717a8f574751e8f2df18de0b74bb3a9026718b6beb299435af6c990e4e2d7c891e831fae7d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +datetime2-greek = { + revision = 47533; + shortdesc = "Greek language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "d067dc579e739c8ebfee602d667042c4727e73595fc199197d58d0c6caad4460401bc9d08965292b36811e38be5424c22d6dc4f49c4a9682da3ef34d46e35cdd"; + sha512.doc = "5025cf0113e24efaa2bc413da5d2c14c58ead82ceb07fedad299783c5e445a40295d54e0d5ef3a5937586c484ccaf80e40fcb95e5592266fc82e5e52966af6dd"; + sha512.source = "b0cc23d43a600f72a13234938b2d1e26d011e416b5f979f86003b4ba4cf53f3fe76db4eb5301db23263490b59735d0226f0b27e10a8f521febe52758a3f63ade"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-hebrew = { + revision = 47534; + shortdesc = "Hebrew language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "c9bfe10e1cda7e3890cd79fac15a8f629ece47971caa43229fe73236e80e1f476411aa4d05be61f7f03bc34324b114ccac2585b83cced2d38a28f279639523d1"; + sha512.doc = "636dd01321842cd0ae1c3a1ed8ef41e1704d720aeb830f03a93c921c4735c1913211a1d987a1b430e312c57440a11cf8cb80f4336b4770a13fddbd9d6a5c3cbe"; + sha512.source = "9d1cd5f81a144ebe0efed5773ccc480fa2a14fca7411ac621a489884873dc7fcc6d877c66c7e70ec6736f4e2f6a90b57c9db0516baec961230f14dc6fb55d404"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-icelandic = { + revision = 65213; + shortdesc = "Icelandic language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "020254357b8f32dc146018f3eca4080f239203128671d8e99b712dd038e39bfbdabbabc2e62bf0782a86a3f5c6742d8ae130dd589cc6ea28f87a3ebdc9e9d994"; + sha512.doc = "e3cd7b3a0d8ef17d5b5baee057a0b5c4a445c3b8ebd2894b27d5dea9e7373fe4798bbd48b83a1a96704661b935c3196f52ee8b21d624a91ad75ec51e5a246aef"; + sha512.source = "4b9c797ea798156c88f4e4350e28ce3a63111a6c8cbf7399676ccee60f117196cb32dda2bc56b7a2386756afbe6e5207d83e59405d8e0f96f59f85f2359b80be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +datetime2-irish = { + revision = 47632; + shortdesc = "Irish Gaelic Language Module for the datetime2 Package"; + stripPrefix = 0; + sha512.run = "8c1d54d5fc80b2f7dd8faabc31df20253c9ee48987c268ae685144b02acccb5c3ec6bdaaa5bc420e90ecf4ec7d421afc96d82aef1a76ec7e01fb8e5f81d0a036"; + sha512.doc = "692acb7c50c30e6790344b37e9fe3cb07f2a0e10b9d63b47c78df1b2d1bd1f8f186107acf4d75dabc14a99db57cb32810989bf7af817bfdd16fa694bfee5f17f"; + sha512.source = "1e829006f0182374511addef820ef08868eb1c00b5e82d0da82efadb4df377531755a4212fb0e2f4a5df0d06aaed39863094524b351c29dd88dfd5ee71c84860"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-it-fulltext = { + revision = 54779; + shortdesc = "Italian full text styles for the datetime2 package"; + stripPrefix = 0; + deps = [ + "iftex" + ]; + sha512.run = "29a67f9c4414d08adce673ac2b501e92be5822470511b55677b041fa1d89b55760246fea08ba0f4cac7ef6f8e7ff52498f0459d50f94bf2bc6b3e4a944976a99"; + sha512.doc = "24bceb74337abc4ae74bbf9101bd32cc65371d60a0461cec91c8e3ecc3822c848eb8c7f0bc8706ec1b2118294df659b44f3139c3a3ed1c0c243f9654ae1b3d6d"; + sha512.source = "89a91a69a45100324b24c5cca3e0bdedc8dec2a466c414e65044f55a6c1ec3c715946dd5c5ed942fc9dc8f6a597fe5f2075dd7d05c88d241da4bccb27ba9cb3d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +datetime2-italian = { + revision = 37146; + shortdesc = "Italian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "d099d05904e416d44e9a9ffb337b23e2c1f908dfddbb41cfd7629c4abaa7769c76f50ef687751224ab4ae94a0df4d1962adbad602ed3a7473566e16c5c4bea48"; + sha512.doc = "963759f5e07e01315b827d4c67364d9367d114a09d518154524ba4496aee69f1ef08acbdeb67522d3b350a6f8abf8bf571171d4c380bc3f093d59ea3207beea1"; + sha512.source = "4036338ded2298c97e49173758317706452c254bbf07dcbe83080e28b6d59415d0ff14657cd11b9a5981ca893a4033db338518e251d59d0c4eaddaa9498189f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +datetime2-latin = { + revision = 47748; + shortdesc = "Latin language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "25f4e92c72abe14db9340aae354e0f598aadf88ec109b6dbe6b48e12f55926f63fc80ca420ccbbbf8fcc8dac066520d69b653981ccdd41b2e8588d85d4f11a99"; + sha512.doc = "f683c8764e99edcd9d9a449eecd3f1e4a10a2803a20bff7be22568a69ee1b06c5d054d6664a051b0eef8cdac5bc2387175cb582d005e1af31a5be8bbac4a0de4"; + sha512.source = "9270951371b2595f59a5dd8f8214603d9a72856caeb7902488fd7e7068b16c09b7ebd8f94cf10b99d31fa95777b475d403d49429944bc79f20faf37ae9192f8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +datetime2-lsorbian = { + revision = 47749; + shortdesc = "Lower Sorbian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "04fcebad65bee525697ba96cba9d66d6acfe9bc602b6cfb207103a2bfba0d3cbbef948d614930c1a2bc785a6ae2ad6c4e0b06db58d562681225d67b7a5f2f8a6"; + sha512.doc = "7bee606e0c48dcfa676835e3a313ec8c3b79f566fba6d6b65cb34c4f939e7a7df34d73e24f0f03d569e0f6a01cb244a90b9023e2846c597eb589e984ad9d1f18"; + sha512.source = "9dee46b9c2290e00c1a9f9d7e63b3872ec206f7afe9ff0ca592824319b035da1295f566a8934d7d4e87f47b8061311682d2a6ace9a9ea15180433279759d847a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-magyar = { + revision = 48266; + shortdesc = "Magyar language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "4d3b27b0409d26431cc06a1ac83485b6d4d63b9bba30a862ac043cc27c25a77805d5c3aeff3a329e1348a32ca4ceaea917f2f840ce1696a58f00325775ae5009"; + sha512.doc = "1eff11bc2c7cdae101331521f08d3a9eb878e8d1695b35724475eb5b99e0a537bf16a00bd3c13760cb36306e84b72f15e5ec294ed958ab5d67e75ad8571ac9a2"; + sha512.source = "674e795a5b3d49665bba89c7f01abdf4c366a72f9968ea008455179319f66061ef2f73e21c6ae736e6dd960aba1184b7e374eecff8429d1b533078202f294ad7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-norsk = { + revision = 48267; + shortdesc = "Norsk language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "9ebcd994305b3b3aad61383b9ece13425b4c34432dae0aac2ce38c0219b2f19871f89cb30bd774a7db9be45cc8a21f7856f1f568c32941502b18f6089b787066"; + sha512.doc = "3d834d8572cb8f1237b4b9e69bcbcf1a5eb0a1e5c001e8610a00ec377204c570218f6d97765c3efbad9130cb2ad9ced3cb80b32bcdfccfd62d7069ece93ab1da"; + sha512.source = "7dbb4161731dceac735ce39e042713a07d3d63dabac0a4dec870a022ba79c2637d7fbde4715936908d39f3475746f243dbe2e39d88040f35822503f59c0f87d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-polish = { + revision = 48456; + shortdesc = "Polish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "3b63541325de4082a828af5131a639c11f2562b8e2951f50199f7281e7c59e2a2deaf8cba124cc8679a4de5da3e95d988bb3533eed6cdbc9471a95476ec59bc4"; + sha512.doc = "6bcccc320063567e2527ca6acce6180c9d19a3ec8a1e922e640e82d3ad2a244cd455741e059e385fa26ee6479ddd5086b9dcf73a705988adec96a311cfc5e40b"; + sha512.source = "0adc45a662620826c90aac5f0372d83462eb571b7dc0751465ea246602ffe4f7b43f6a5b3153cd04681ee8baa23703784e15b79e5ae2c15cc9e6db5808265b8e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-portuges = { + revision = 48457; + shortdesc = "Portuguese language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "976ad1440f05bd166659b5b950691b4d0ce988a3d71bb91525e4448b1520a6ead37bbb3ef9a899bac08c7dfe8cc7b9b7e15174c8ef143891133bc00e5c39e9fe"; + sha512.doc = "3cd176813f3b0bb16341ddeee4d0a848b4eee9bacfb90734d97fd9ddc3e88285057dd0bf4f0f3ebb5641ebee48b15161feb3e4e75032e32368a51bfb9ca4a8f0"; + sha512.source = "71b769e4a63cf02cf6c2794d3fb876a33d9c8b150059a2bc0960b8cd1b355e5ebde3d02b48ea47653cf781721fcec118d78301021e8b95543d32215e690a3c12"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-romanian = { + revision = 56394; + shortdesc = "Romanian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "fed59ecdb496fbad41a5558526671cddf9cb487f50cdf103f61141fb1955170e54dbc3fc134ef51a2867715e7bc714dbf81bbb11e6d30c324a87492870738d39"; + sha512.doc = "7c65be46449bf92e2c41623e785c6262c710de23527ea54c505cbe155af50dd9e9831780dd380b3d0c44af7607bc59fd3b168d700c1a8041642bbe4b4ae9cd08"; + sha512.source = "58e3773e40d6116f5cbb6f2a46d33fb6d557d42887efb130c051c24fd991d8f0709f5afbc8e6ee9b5ada21d613d4d8975488f2e691bd0951c5f5429eda7de61e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +datetime2-russian = { + revision = 49345; + shortdesc = "Russian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "2821680ce189aacf8b0303d5698d9359f240ab4e470c0e2b052235e6aaeeffc882ea4b9c9c4f91d52b1402ef7486c7115bab8058e2223b7ebd3186fbd4c4c34f"; + sha512.doc = "97c1b02377328ff75775194baeb2c3e15f2dafee303dbb85c47a0baf7f6edb4323f754578a9caf9db609477204c1310dade3b87d5a768a16fa940be2fe320081"; + sha512.source = "f9055eefe76d9844e8764ec766c0e1da7d3c61db65c754115cdc47419ab68d84685688e59939f219cc5ab87f79570cd4c28011ca597ee4f89fcdc38c42e82a75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-samin = { + revision = 49346; + shortdesc = "Northern Sami language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "fc4e6401ce02b1aa7be5fd78e5d5e74aff6ac35cbb6864cbce6d93fe0b2716510f6ccdd290c82286b8e51f37abe8460c0f8340ce0f9135838ecace7502f72784"; + sha512.doc = "e5879faedd4d4fa5ac40575e0ccd1d0db94a80d78c3d01f8d36bb37875e2b9025537c876087b85626ccaed5c90f505a98fd3e5adee64ac1bc72f48ff66114438"; + sha512.source = "4aa4d272188a8a2b6e40792b97df9b205857870f3787153502c12fbaaf81ed61d9d823a7966e147fbc1d94f761c40f179d4025166a48f358821134559a7bee3b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-scottish = { + revision = 52101; + shortdesc = "Scottish Gaelic Language Module for the datetime2 Package"; + stripPrefix = 0; + sha512.run = "b3f8c2e2c61461c162f4b7c029ced53b5f0c61398415d17044a5189c08460550bfd0ddd15c693dc959b5cb5bacef63a1d4de8a9fe11108843edeff475964aae6"; + sha512.doc = "87035e38cea316b776f2c61d0c1522e61c560602650bf6955fc7330536fac42dcb17bdad1c3828f2accd10cef009efcd805ed917352ff921d03b46ed3d0bea18"; + sha512.source = "4e4c7d02ea59a5d7592660e80c996adc11968433a2d88b54179ff15ab577a487789cba6fee4131511a5c22de2025879800544689653c48c0f7560a311b264c02"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-serbian = { + revision = 67201; + shortdesc = "Serbian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "55ddf54bb1ba9cca7836ef0ec082d98d9d280b92e1d2d108c3a4d11b5c5d89f43098215eff675e8ff5b42bd8f446c6361a98f544f2d4bcb4ae684f69597eecb2"; + sha512.doc = "b3b25cef5afc1481617cc3edbbe0aac242b1dacfdfdb9bbd30fa9d2c0f963605ead09bb9a91b016d0739b848cafce18ab17d3fd0750e589faeda0c434b4ac73e"; + sha512.source = "c36f353d307bc2a49844dcc53837ab6ff2cb17a10973419ccd848c752f0eb53b369d4f0e123e3992f96d5fcde30f204e830093d6421f3544be693a9369c43129"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +datetime2-slovak = { + revision = 52281; + shortdesc = "Slovak language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "c69d8eacf36fb7232a85d92e5db277b281b631c0c8f63df7fbba51876d1be782b7196efaaea0ac25140716f983ada40aedaa550102fbe0d445e5cddd41317a09"; + sha512.doc = "c40e20b000f3fd5ac368c310d1f11519566410963cadaf4aabfb0c9cae05e0d3e8a3810c7da451a5e206e8b5b174ac0b837c1beff207597e050ec529e82acf51"; + sha512.source = "19547ebf7016d1e416227830b81e95dd6d91c7ab7823d3fc2d6890d628a51074e4ba7b8b5f31020bf86c2fe447b60f22754bbecb3f7e65dc908ffcfa9087e12f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-slovene = { + revision = 52282; + shortdesc = "Slovene language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "1d0a73d3781fcc9ea0df63e391f6b7a0a254bfa920c63ad1a0c76b56d4770822bc4e049ce18c554974bbb20478150cd7a4f545ef8983bacd31a112fc3acd5419"; + sha512.doc = "dfb2a9808488ab0e0b225d0a397490f7e1cd2343caf0a685d8e3f48feff2ce549092771f0b4017a3c45640067ad1ede8a852e714b313d9abfc7c9642f983cb46"; + sha512.source = "f1a60b0173e8c1f6f245459ba35014e4cca9308e2c5aea203d6123cb88f6de945a6f80ae350ecbfce6554f6d2b671f32487825c5f01093c3bd3fc7a1902231b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-spanish = { + revision = 45785; + shortdesc = "Spanish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "07c321a300d779e39de46628b8e1b95d383e2a1a0af882cc607929d894f11b2e8329cb256014193d428182e78f2cbd5e3e277bc7821d3ad7a2740fedacf14e28"; + sha512.doc = "629b4a2771fe68715978afcb202d984e1032d2e0f1af95d4971a980e14baf4b0705187f4a7ef9748c024eb27780f7720d8d5010ebfb23026ad8605a42730293f"; + sha512.source = "78565125794ec1f5cf762cc27fd24c96eef5a1792941d4ce88c85bbecbec777da239db94118260feed6502e55f81b45f105a170e4b6207ec5e4201f043fa67e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-swedish = { + revision = 36700; + shortdesc = "Swedish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "b904b21b593e529ffb714f3762ca5b8de37e87fe25df593873defa43de3995d1c72b0500217182728eaee6030cacaca969376a5623bc0baf48fe33aafafc0a66"; + sha512.doc = "7d6f2468aaa20da4e086201c0ffa6e6ae031e2a23db7fcccbb9ee8776c59b56a51cda9a03dfcce9fbf81b618f2e7543272f4ae88871f2b5380d1b98ff89e451f"; + sha512.source = "bcdb2b0eb40b7acad86b37e215cf4bd3c5376cad8fbd10d7f1af32a5983243aa28d950116d40abf4ae10bd28e32c10022297b77ca40daeab15b6f88ed33758d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +datetime2-turkish = { + revision = 52331; + shortdesc = "Turkish language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "7d4b756ab2f102c7981376d6f87e5a7f7b47d57b1ae9f821185bd5b04e7a5d9a81aebc7835a9bb43a217dffcfceb5b2c46b838bc652dab7c2f468d9510c2ee4a"; + sha512.doc = "6c95641444f2eb510a330c7002bba2c40cf28daeb63fd9092d74846673c03d2aeafd1e7d61d5a7470bac95117c3717cd75566907a896f5cb4b54ccbe952c6d65"; + sha512.source = "da530162bdacda3904b07bb2d9b0ab74c56cec0341f0c0457d6bd2e27e45b2d8c1f5ca298718d96924e3dce30e83beacd0fef919d1b5bdb5dedae29c7b3edcc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-ukrainian = { + revision = 47552; + shortdesc = "Ukrainian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "5e3d412b8a5b73bb6bd2ee176305806d9b41c5a67196ddd28640e958a7019b3e73f961964b7510be4cd69833c4599db1fed05c6a6f66d4d0b3bc5ad73b5d6dbc"; + sha512.doc = "df40b4e156164a1c05a94c926d691b887a56ef8f42baee26e684383871edff05e5c6e87eba95994783cac2fcea1a5c72347c8eb86f0cca360faa8dd4829349b5"; + sha512.source = "36c7db71bd063a87e8b9f2958217c71c7e6820b4e5536a5cc46db35ef69e83dd5e7b0ddd57038b66f8405d5a24afd21253ca34f7a8d174a26b4a67607048caf4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +datetime2-usorbian = { + revision = 52375; + shortdesc = "Upper Sorbian language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "bae799fc523f01f7c70c7818ced0294bbb57a849567e05768c4f1c3f9cbe241755ac2dbda0a9ce0e3bb3f70eec45bae1c0607410302b458370a4c05951d791cf"; + sha512.doc = "bacc067e851e4b58b2978472551cf869cc9d3d4412ba930b2ab81f39c4fa9ca352188b6a6bffc5b5dc4a6bcf611146b3d1344d221732a7caaf45f95bb67d5589"; + sha512.source = "dcc7b42ec9873ef0d23026d07165301deda63b829462ab7f4074ae7c828945bc5cff2e2dba372782e250175b596b1be536dd27271e4b2f0913f42fb1a17ff320"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +datetime2-welsh = { + revision = 52553; + shortdesc = "Welsh language module for the datetime2 package"; + stripPrefix = 0; + sha512.run = "2c3b56f2e2796840fec8a60b4f75800743a4d71128cb900ed7419a7a01acd306a9ef86c2b1587e661833f8de48ef89e22c11589af21c9abfa2cedbf709c4c340"; + sha512.doc = "7abb3d603eb94f99c1fc49e53ee28996d2a536d647b0940db20e5a9aa70eb10d7e00385300bfb3adbaf4f463db20c4277a8afbf0f174c449e402c02954c57243"; + sha512.source = "92b71dbc5a21f650de8e9ef42bab3e3cdae1f4f1a48b34db9b656d894edc678e79e27dfe8b2143d85dd69aebf6e1cc9156a9b72d632065a2d146084f7da0f12f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +dblfloatfix = { + revision = 28983; + shortdesc = "Fixes for twocolumn floats"; + stripPrefix = 0; + sha512.run = "05931528012077b92702926856b1e0d1aa6472188f9b1fbff74e5534a41a3260e53b82bcdd0684ff045aafaf4b427dab6d8e06fc7a5d11cb42a545949bc6bfc8"; + sha512.doc = "5790850d01d9f3734cb89146c23077bc852d84242352718ee655f1410ee84b77366bef133d8df49fd46ad976aa007fe2c4039a08035122f93e719c5f0f7563f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +dbshow = { + revision = 61634; + shortdesc = "A package to store and display data with custom filters, orders, and styles"; + stripPrefix = 0; + sha512.run = "339bd686c658c462c9da56018234c6a31e72a3def962798772bed17bd453efa94c5f8e2d72a2f033714eaabbde8b45bbeed07d302e311d65a27c37f8ef177a2f"; + sha512.doc = "4d4ff36d121b950d7569f4ae8e7fee7e0a4790f61e8d2b58c136644d0ce455e8b8f4c1857c8df68d2f230016e5ea28a35047234ee101b3f949d1598f4e15e52c"; + sha512.source = "189d3f8bd131bb3fb8bc7481215fa670001ec9bbe20a4d1ec99a9864005b44fe9fb582ad5462ef23f62ec538fe8d2dd9136cf79e94756c4b6e02d644e2d66a1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +dccpaper = { + revision = 67890; + shortdesc = "Typeset papers for the International Journal of Digital Curation"; + stripPrefix = 0; + sha512.run = "16a507603bffd0fd0e305c9e2d21927f0788dcff750ab276349919cc2e1036b41f57696e088ab5596bd714f890ea68ece629980dc613581d5c90f586f7e4117c"; + sha512.doc = "7793786d0c34ab72954fe189bbae96a388f61f789b845b42d7fb062bab3858643e8ee730d11a5d4209fb0d728220e7ea89bceb3684118978dd8119aedf167a89"; + sha512.source = "bf4bb7b3ed2cae28c3f3d15758a48fcea3e737872b27af3ded1cda51f5b1c84ac200116fa7019972c65aa2a4966885582956bdbb717b6b427ab42f2f7b7fb00a"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-40" ]; + version = "2.4"; +}; +dcpic = { + revision = 30206; + shortdesc = "Commutative diagrams in a LaTeX and TeX documents"; + stripPrefix = 0; + sha512.run = "6cfae1fe50baa81ba778ee1b8cc76dd2d0e66e3cd4a868364857f2338b1078ac81178dbcea81d4edbe013726b7cb14700506f38e49eb528701bf784280ca7de8"; + sha512.doc = "25f768812f31cfc3e4d00717ed8d77392272f2480efe3311ecf5e922b18e1f5b6fa36892c7eb69cc077e350d5d7e55b7201673fc653c188ec8a76205f90b681c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.0.0"; +}; +ddphonism = { + revision = 52009; + shortdesc = "Dodecaphonic diagrams: twelve-tone matrices, clock diagrams, etc."; + stripPrefix = 0; + sha512.run = "9ccd7a8715af4a808a72d4dbc96a1216663c7eddb7a0fea48b77bbcb546a12d0e9de00928189b424e9db8e612778ed53231456d087a1eb83bca827852c9691c8"; + sha512.doc = "d75ead2518ae448eba251b3f43431751f415c9650e9ac023e1647fbfa828f700ef2fa3a19f53fdd6e28c9e8461e071fabb7c016aeaa62678ada20ed0b96017bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +de-macro = { + revision = 66746; + shortdesc = "Expand private macros in a document"; + sha512.run = "6847ee60de3e70db18f402744ce0edf926fa2ba1ccd64faaa9844aeca85809efdab740d99f1ddcaddb74fa54c70d0c2dc0a7e8d15575e574ce8d451e0b6248e4"; + sha512.doc = "21065d2ebaee0a2c82e5d41ae6a5ddb071623f9e405262de404557053c2f402f9166e7c3c939ec57e3d3a1842397143c16bfee9d219eb84ef613b74474538052"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.4.1"; +}; +de-macro.binfiles = [ + "de-macro" +]; +debate = { + revision = 64846; + shortdesc = "Debates between reviewers"; + stripPrefix = 0; + deps = [ + "listings" + "listingsutf8" + "pdfcol" + "tcolorbox" + "xcolor" + "xkeyval" + ]; + sha512.run = "88f9ff3f473dfbd84509adfe4491d15b7c20229361afde9cbce382be0441378cd6bb7d306c9b0a424dc065f34ab2d86eca8a0334d00fd3a5bae513776c418815"; + sha512.doc = "ba5e90ecc8c1733cdb78233099cdc95e09d02786df11606b3f823f2b1b60934cd2881c873ad7afa192ee1b0ff5ad91121896cb30e7405ee3ae9bc960d26e7f9c"; + sha512.source = "b9c0b94eea82d7b684aa358788a5ee3cb9709738137827b7a4f70ddd0d02ad92b6feecf03d0de7dd08c1ab233f17db3c973cfafef98134be33a41d6a8d7c4da6"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2.1"; +}; +decimal = { + revision = 23374; + shortdesc = "LaTeX package for the English raised decimal point"; + stripPrefix = 0; + sha512.run = "9a0d0947eacd52800b3b2cbc36d6e866c1876bd5f929896825dc604d9d633cfb169d93de0f86b0e78e3274936bb47834c222ee54b3571bfcdc0fe81bb2821776"; + sha512.doc = "977fc97627bbdbf4d65844dcb7ce267cb2291b102b718ca36ba2fee881d5fcf359d6d0dae839d4e640200d3b8a31cba301d20560f5002344b8ea256266efc9e4"; + sha512.source = "a880091295229345290acf605feb833489976ed3b661b403c8effaabd07c48730ac958a4b48dd48d429a3f031413c1392f4006b820f04e3dde6b2035a948747e"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +decimalcomma = { + revision = 69251; + shortdesc = "Comma for decimal numbers"; + stripPrefix = 0; + sha512.run = "78d257b6a3b65c44e9cff04093896240c7a9401af04b028fa79bf29dc436a18d163049d34a9a7c92c193ce07085aa877e69399f79da22696da800f72de20eb37"; + sha512.doc = "21f1a61e45fe9d83f4ca7d01375c832b230485035f39277e18a3062da98f7d0bc63aa1703258c7fbbb6330dfde15153ed9bab60afe62db9bca4250033a12fb0d"; + sha512.source = "56906bcdf0d1ed82de86cb39994682705b5e19504a97d2deabf34ccba239c499ca3b613e013c04c2726155b49a7971b9ad450d248acbeb5bddcdf4c4c7e8d687"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +decision-table = { + revision = 60673; + shortdesc = "An easy way to create Decision Model and Notation decision tables"; + stripPrefix = 0; + sha512.run = "8a0bbe49c3ef76a7a60fff1778bfc06c2e11521e028bfcb190c85e8a38932bb1f2a97c26293a2965ee8d2e4e6d2cdda54dd2954881ac9b1b8e2506529af1ec97"; + sha512.doc = "d5b9301a4308a4e2709b4c82a621fbea2af0cbd767252446f698f269b3ef131502d3db3aaec6d192642b154b546124326280ca4c1331dce64b36517db51c3bc4"; + sha512.source = "c24db9cf19bf41d714d643d2be4bad5e339ba8f57175186793db0ae03b941ddfcc3584061ec4ef2aa2de550103346381d31c19a054d428210b35ef083866ba28"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.4"; +}; +decorule = { + revision = 55230; + shortdesc = "Decorative swelled rule using font character"; + stripPrefix = 0; + sha512.run = "783f09b3810616b14f04dace838ed1ed2faf32ea4df84dd0973df375928e16fb129ddf6429fc54560a317da0a9422630becc92543e1a1da76809c4962c423fc7"; + sha512.doc = "0c13e2ff2744ca2d0e32446a85cbec06d832ce1fc8af5a719f3c73ed59e1a85461d5f51d33fe5a51a89b209f80196ad52609e83adbf7cc41336f5bfae8c4389f"; + sha512.source = "84ab7801ab7b0772ffa3520a42e132007e05152e206072fc1ebb43d8d9675ac4929ad1abb30d8111db7d825f05d37b038ecc923267c5095ed62a34cf3955dc20"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +defoldfonts = { + revision = 68234; + shortdesc = "Define old font commands"; + stripPrefix = 0; + sha512.run = "f6823da220c00ffd688d0b25d06109f0f3a7ab606d535631d9197a26b02388b11e4dedf41829c94ca4a414cbc1cee81c425d006e7567116b243272fa8d8659fd"; + sha512.doc = "d799609d039e98e2b737fcff5bef277359818838a8cc1489dab934d6b890ce480b7d6e935a84562662e8f130873d1a2dc777e08b229b7d5c0b431b8fde5d6978"; + sha512.source = "5bc0c27101fac6b15e8e792bb4436c4f5ada6684bdcc254eae8466ef07ed7896957544186c09ab43d8ed278efcf44f07c40c9ce5c194fff081bd46a6e628704c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +dehyph = { + revision = 48599; + shortdesc = "German hyphenation patterns for traditional orthography"; + stripPrefix = 0; + sha512.run = "2dc4ee5b4389549c032f3a4d87740ab3c5e296a1ef109a6b673656a82ca4c317ca774f39f61417568b8ccbeac787c4058184fc893d53799bbf0b042ba5aca9a2"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +dehyph-exptl = { + revision = 70496; + shortdesc = "Experimental hyphenation patterns for the German language"; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "german-x-2023-03-06"; + synonyms = [ "german-x-latest" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "dehypht-x-2023-03-06.tex"; + file_patterns = "hyph-de-1901.pat.txt"; + file_exceptions = ""; + } + { + name = "ngerman-x-2023-03-06"; + synonyms = [ "ngerman-x-latest" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "dehyphn-x-2023-03-06.tex"; + file_patterns = "hyph-de-1996.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "3bf6178cdff605d289bd5b035416953b26911b636786340fb08eeedebc8a0a6ab45712547f6b6eb312751514216aadf36357b344e38fb3bf1dac84bdd6fe97a7"; + sha512.doc = "3e41d2581f5b96afbea332529ee3d9523d935fec0e517a1a39ce04a405328241cc3bff97a00af3ac363a2a413c4dd70c9e38102d1ecd65ab8aae994abc46e4ca"; + hasRunfiles = true; + license = [ "mit" "lppl13c" ]; + version = "1.0"; +}; +dejavu = { + revision = 31771; + shortdesc = "LaTeX support for the DejaVu fonts"; + stripPrefix = 0; + fontMaps = [ + "Map dejavu-type1.map" + ]; + sha512.run = "a26a57bd02b14c6e67d328c2c00174730b819f7da37ac147ec7f34f37195b6aa17e3223ac4d03617f5239700b1dfa45ca1741eed7b4488d2e604f02ac34ef2a3"; + sha512.doc = "7e3364a3e0863c63f2a66057780fa922cb53f4da2f81e42ce9e200d5a034854216f4d4b833756a6d4d6837385e48aa8d03f608846f2f95caa84a7ebffe3257b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.34"; +}; +dejavu-otf = { + revision = 45991; + shortdesc = "Support for the ttf and otf DejaVu fonts"; + stripPrefix = 0; + sha512.run = "d0d32f3c9d53a1a61e6e717a6275f3fc934c0815fddc3b36fe2afbf7702e5128d4cf15e8cdfe8b02009a6fb7c203ea42b134eeeb080b9765ff99c4143f887744"; + sha512.doc = "212663371f747b03694327a40de3bec0be8efd5cda15c0cc343284f3a427890e8d16c4223098fc16a260b837a9d522c9cd35876a4c1004e09ee9ee29c05ec7b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +delim = { + revision = 23974; + shortdesc = "Simplify typesetting mathematical delimiters"; + stripPrefix = 0; + sha512.run = "c18dc230c5bac8db3d66f062402392761467ad18f48a65930a960c0772be30a7ed729a50657b12f533d72086563a67a98e8f5ce7afdc9947b52146e76e22b157"; + sha512.doc = "c343842bcc03981c1814f5cffa2ba3eacc2e6abb5673ba700859406869a2398518e9abf02e159f4d92bf91383c3a6cdaa9f5720adaec81715fa30f4b8f36ff9d"; + sha512.source = "8ff42847f918ab8d65eca86ee8daadd14ee138f984e06e1c4d66704ab4b6c53c1271b23aeb33003f9a7489e22e29850711efce99459f10764150742854570034"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +delimseasy = { + revision = 39589; + shortdesc = "Delimiter commands that are easy to use and resize"; + stripPrefix = 0; + sha512.run = "7f9b1d77e9b9bdc6e5c45ed3c38606fb0d65113f7303e03f591c1b84aa83748d72fb8ecde0cd0c7b19d1bc9fcb454834e156429fd9080660aec77ddfd7b53e42"; + sha512.doc = "bc9c1ff757a9d98ff9b84993cedb62ee024d0f4aafee301db0d862be3d45c76d8d164d2d3099ae37d41017316282db1e7882330dd10de43a9539ba0b10e86b08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +delimset = { + revision = 49544; + shortdesc = "Typeset and declare sets of delimiters with convenient size control"; + stripPrefix = 0; + sha512.run = "5c19bda2a87de91ac1d32981198ce7718d490184d4d65dade231b66c3f46621af91dbeb89bb79ba1370fd82a0527d01d0aa7cd9dddeea818e8c4b4380a7b63ed"; + sha512.doc = "9e671fa601b878187b5b3ae1a47feffb6c451fd42f202f948a87b02f35385b47239947a3e91260e699c64c453df161d9ae734fa3a8e241b0e47056181fefc46c"; + sha512.source = "d5618af6db29684ddd58164c9f55fbee73417d6968550361d7277558de98e621e2d1233b593c87860ccd8f7beb66a3c2369518736e14c86472d77425d6499869"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +delimtxt = { + revision = 16549; + shortdesc = "Read and parse text tables"; + stripPrefix = 0; + sha512.run = "25332ff7d2602047938630668c849829844fcbd622f911542bccd59d2eb1293e406cc79aca08ac3acaa98828b4a6fa4da98feb08fdf678ad3863c70cc2fc1817"; + sha512.doc = "cd9363d8d44309c2ca51431bae067d87c790180eb884888144cd089cc9c14f83e1e7ea2389650d547e47d4575755a5b6b369e82b76cc19150b1dc973e99109fe"; + sha512.source = "487557d866b99ec0fed6d9bf18c4bdaffa4ad6a8294cd2e9c681a4f65fbba051a97577b82e7170464daf4eb9f154e66478f46512331e1f4f41b48e61d65a86a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +democodetools = { + revision = 64314; + shortdesc = "Package for LaTeX code documentation"; + stripPrefix = 0; + sha512.run = "f1c15d50ff6078ecfb012e5235736785aaed4cb59ebb8f4d54c06865d5299b7b32ab436b79671d68c8557b12de65cb50f162424affb7a91aefd4fe4dfefae04f"; + sha512.doc = "ac49187b57e75bcad5d70960711b5a34162a7c97b237a1fed19d08089f3b7abdd7db9ea24368b8f0f2e9e4124c5f8832ea0570d8f37e002d00ec7007c784386c"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.0.1beta"; +}; +denisbdoc = { + revision = 70611; + shortdesc = "A personal dirty package for documenting packages"; + stripPrefix = 0; + sha512.run = "ffae3c7f741d9a6c53ad3681d929d26d1ac7679477cb66d3bb3e7cb4bb81966137aa191810526b322f13c52aac31111ee4fc4bebdc49f8be78b40b26bb4f3e6e"; + sha512.doc = "1bd19497dd7fcbc7df9416a43e09dd68a825fcff6411f81b9a19b100915296f094898a8b746ff7dce263a7facf5b776c08d93e4d70052b26e180a58079e62cf5"; + sha512.source = "437387ebdf81424660fb88dbd758720ce709b1c771a979b83b462f08fe923b393cd6235f373aa20c91aca43e1cff850e19c6abb8dc34cfbcd42902fadd479754"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.5"; +}; +derivative = { + revision = 69746; + shortdesc = "Nice and easy derivatives"; + stripPrefix = 0; + sha512.run = "a936429cc5b9933deaa349121fed565fd46e2d81f8d5a5be3b282f3a5107c13e2ff29e159759c10dad12bda9d5fefc5177fbba636dac0dd31aedb0074cb5ea3f"; + sha512.doc = "8951a888d07fa9136a71c0b0fb25b7f3925e137100460fb41cae0766c56cbbadad6b58e0afd690a608306032f5c2d95c6d4bc8f07651a1354b184fc28b9fd2b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +detex = { + revision = 66186; + shortdesc = "Strip TeX from a source file"; + sha512.run = "e258d80d1509831132c4f70df81b8e93cfc9d92ee74c5d39e7f35bd4f71a3eb93fe3594afbd5ab0e33cf0b6f45c816506e32ca8f41427f3c3fe661f3086100d1"; + sha512.doc = "3d5a3b371e007bda61441460479a208062fd0d477d1fc9ab9a6764c1969fd383acec9e336e8d0b16aab5606444f5d87335320e010657cf088e9caeb18d6dddf5"; + hasManpages = true; + license = [ "free" ]; +}; +detex.binfiles = [ + "detex" +]; +dhua = { + revision = 24035; + shortdesc = "German abbreviations using thin space"; + stripPrefix = 0; + sha512.run = "c6e6187bdfc80cec3ce092a4dd3605055f3ad67ff49777bf0948af128c8b48118247ed9ca6f5feb1a69d32719f81968d8259794082a28277796eb6beccf9cedb"; + sha512.doc = "a2f9f61ed61c5476d5f70fdfe59a451e7b3cafd3412336c5767b53b0157416149ee9ae924834f8a05beaedabb9e4a8dd3e4dbcb2f17b733af113c0a8085e363c"; + sha512.source = "ff72f267dcbd05830664f9ebc328fa1b6b80eb579627c5ae78965b47b8b8605ddf33c6b6a9b343774b2944d985afc9a9816924f23e8e7ec9fbc807f00bddb143"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +diabetes-logbook = { + revision = 54810; + shortdesc = "A logbook for people with type one diabetes"; + stripPrefix = 0; + sha512.run = "427912b3eeac373ba82f99b30a6ccf360b285a119248e9dd2aa175cfb7f2538327331d9e8eab7ff62cfd987466352c08016313f51b8651c4b42484fb6f089bda"; + sha512.doc = "3a8c1c45b24d23ff236ca2d8bba6ff6d9ad055a688b5621a660cefbdff4e1407d71d96420cfa39dbb896f8035e6d5a2bf3f33fc2e80074527c9a41fcab72f976"; + hasRunfiles = true; + license = [ "free" ]; +}; +diadia = { + revision = 37656; + shortdesc = "Package to keep a diabetes diary"; + sha512.run = "55a246d4e3ab86d6300210d830ce464a935bb83c9ffd29b5387f0a56f5c82d4c5a71cf107f78ffe0cde07f17897e2f949acf1fe70da9da7c7992b330a07b1c68"; + sha512.doc = "e7487bb47fbe8aee714304150c00866780782a9ad32bf6ccbb02799aeb251345ce1cf042e8b4d7b4011083a3be2fe3b16b78f25a4a4206d173ac1384716592ab"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "1.1"; +}; +diadia.binfiles = [ + "diadia" +]; +diagbox = { + revision = 54080; + shortdesc = "Table heads with diagonal lines"; + stripPrefix = 0; + sha512.run = "34d2530343877efebe9ee53027253ddce0e59df3cd70900bf0f040905f34a8ad9d41328aa3c6ecbb622f7731f3bc9c4fce289caa58e2c1db46a6ec1bafefe6ca"; + sha512.doc = "96310db4878e417f09e6202e5ca86f29524af5c1292ad8fed2563f1872e094be1249c4753eac5129c68492a5fe9ea87857783e2ca9af1ab77dfd1ca9b3309b2f"; + sha512.source = "65ac012205c309099ca2f1a23f6446abb434a1a9c66a36d75d15021eead74feeb70c21024386fc11b223386100404b35a0ec3571d24aeec13b5513e60b11b3c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +diagmac2 = { + revision = 15878; + shortdesc = "Diagram macros, using pict2e"; + stripPrefix = 0; + sha512.run = "553d3610ef7bba5bf669040cfe6b51b26718b9f04835413d43c3f8a018a8a37274b445bbdbaa4a512aaefc8327f6a2c7abd8d754b3d8cbd4687c9c518265ad09"; + sha512.doc = "37952cbaa4c20180a2d09455c748b245927245c40093510a79fa0461e5836197d8bc05bdc3cf5c7bafa72c54cb503fa9722d7a8ff9a0630ad1b5e8382b4029d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +diagnose = { + revision = 19387; + shortdesc = "A diagnostic tool for a TeX installation"; + stripPrefix = 0; + sha512.run = "91fd8eb4b7d896f27c15c2b3b2a0a9bc839bb736a1fa053d47896c6b989729c3dc3a644ad59f6b3bd4164c150034f6ede5d52b680fb1c8cea6838dc70713f654"; + sha512.doc = "f3e7152e656ee4c5f6ac28205b1dd5e9c0cf19c3d9400e2c40c8d8e9fecbcbc01cb1f7a36534849b6ba26f222f9547e3d669114a7d8923645528b7150cd10de4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2"; +}; +dialogl = { + revision = 28946; + shortdesc = "Macros for constructing interactive LaTeX scripts"; + stripPrefix = 0; + sha512.run = "68fb25b66499e289c7615fda04fec859d2a3a6105ecb3bc69ecd0e5af8f87027e74170495fa587f21767028d9f423cf04e3d11768ea0581a7474e9a66d62882a"; + sha512.doc = "cc1fa10345fa089cd86ea4b0a638334c55c6a57cac3a9c549469cd52cff27b8eb3d349ce14d49de14fbb65f41d1887bf98e9c69081688703d8eef06e6324f684"; + sha512.source = "0a39faa751021dbfe7638f139e50689201f93d4490339af70b4ddd42a77cec252cffe7a18a5ddce43ce8dde7f9645dd088fbe9c6cbdc4efefa65280f70c54d23"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dice = { + revision = 28501; + shortdesc = "A font for die faces"; + stripPrefix = 0; + sha512.run = "7ec762fccc174a13f2a84ee43aa49319548aa970f017cd17bca73add506ca270a6ac621f51ff96d47a4f5eadeafc89ecc44f1c99b31a2e76722e648519e1fd69"; + sha512.doc = "9c09c47b70e28e4c8ccffd4c75f8cac7942767279d0e01e543538ddf0ee70fe60cd15d1e3ddce27b56e1a9f865d5ad9b1794a875e41d131d763c11a3e0fb96ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dichokey = { + revision = 17192; + shortdesc = "Construct dichotomous identification keys"; + stripPrefix = 0; + sha512.run = "8ed4f0010546af68390f93642cab4495226387fd7461383e32fd3dfa72867050d0da05ba90cb768c6893afeac9bfe55d23b7299ef4a76432e8d11252012b47a4"; + sha512.doc = "16a75d20463a0b0b508c2d50aa67a77999cab525e003704ab34663d1f0212c39432caab0e4df1c69b540be014bc86901031c7c8f647ff18ceda77dcef7239233"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +dickimaw = { + revision = 32925; + shortdesc = "Books and tutorials from the \"Dickimaw LaTeX Series\""; + stripPrefix = 0; + sha512.run = "8e478160699ca5dd9c52ea7e6b0a7be491d0af44b3022c22797b02b9e6ba6ef67ce9dc35649d9a2ebb9b123e3fbcc02c0602271bd8049a12c4520a32a15d4ef3"; + sha512.doc = "5ebe8605d1a4ebeb11896919c39aa736220e9ca247912b5655dbcadf03bfa45b4cdfe44ee6555bf8d5ecdaf63b0d2527d3d58ee6d7056a194a6a42f88ab0aa41"; + license = [ "fdl13Only" ]; +}; +dictsym = { + revision = 69720; + shortdesc = "DictSym font and macro package"; + stripPrefix = 0; + fontMaps = [ + "Map dictsym.map" + ]; + sha512.run = "1f1c145c9231616b8fd603604b252903938ced0d0a85f4ce2bf6775f123d47a153d0f1231fc78e965da56befd94b71901c5ae441253d0266fc984d47e9b113b3"; + sha512.doc = "787f3d06b1239c95022c8dd64f07d98cca654250f9846e70f2e7571def724b0e316d66d60289ebbcef204088d6f603d7702af36b985cc640a4f963adb7d347aa"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +didec = { + revision = 70237; + shortdesc = "Fixed-point arithmetic with two decimal places"; + stripPrefix = 0; + sha512.run = "ed59a87d35b2ace9bf525634d1993400348a114669c9a358aa18836a152c5d973584a10f9514014336ca0a90a2050abd5cbf69d305cbae547d644f17c0873d64"; + sha512.doc = "a6a46f0b9e57e3e3e124ec719026e75516722d32d9b0e29d49a736b57123c7d916551a5ddc26a60d972932a2134a236efce0147d13ce645ba5c198bee574ff39"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +diffcoeff = { + revision = 68838; + shortdesc = "Write differential coefficients easily and consistently"; + stripPrefix = 0; + sha512.run = "a40e95018d471504d5d0cfa2d6ed3c43bb7d4a749a97200b2ed682905d6b448cbb51b80d27d772673b747fdfa3c9b02515ffb32ee9e44efc67445bc4c8cba3ba"; + sha512.doc = "65646cb4ad22f5755be51c5c8e1ff907803d9d3817b76da8146d81b7b42ea4c9af07710d55d861795a2e7f25f0adbf4f0c55bdce208a563c3ad34d32992c17ec"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.4"; +}; +digestif = { + revision = 65223; + shortdesc = "Editor plugin for LaTeX, ConTeXt etc."; + sha512.run = "098d625749cee42f965d21ef5ec2843211db36fd0f4cced882ed15f32a20a2d70bf292b01e6797e7ca097adfadf2fd40d3c5eef6c694da39e8302770cfb784d3"; + sha512.doc = "fabc6d0ea5a1e55b7ecd6430b2373c15e413c985485331bd7bd5bca437947a76ac7d8ac6ed2ea3d6afe687284aef673b0e302a1c9925737c6e1d95cecf2ea8cb"; + hasRunfiles = true; + scriptExts = [ + "texlua" + ]; + license = [ "gpl3Plus" "lppl13c" "fdl13Only" ]; + version = "0.5.1"; +}; +digestif.binfiles = [ + "digestif" +]; +digiconfigs = { + revision = 15878; + shortdesc = "Writing \"configurations\""; + stripPrefix = 0; + sha512.run = "a1d5cf0e93aa2722087a491d49c87c1b6c1dc863a39807f28dca198d4c52d8add42706f992ee91b6a42fdbf379293a2aaf3a21199094526c545f41002e8992d3"; + sha512.doc = "95e948491a51321671b15aab55dddd7c6b8bad78bc67bcc25db0970dc478d1bba898fc2efe44537a18d46f3fcc73bd2af600c4a74af4982e8de8a5fc0345a134"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +dijkstra = { + revision = 64580; + shortdesc = "Dijkstra algorithm for LaTeX"; + stripPrefix = 0; + sha512.run = "5662fff484dc88098c2bd22784aa95c4d990c5a725eedabaa1f542c53671783fc89ea1a4d6f7450483dcdb2cc8ce758a8a26c40d7ad27b93d7e3eef4d31d2ebc"; + sha512.doc = "474f8fedec9daf17363773a200b81ba57f57175b1c52de5b7a7c8f7395996725284056ddf4a9e3e68baa1197dce84ed2767795956a403946f530492b6713b8d3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13"; +}; +dimnum = { + revision = 58774; + shortdesc = "Commands for dimensionless numbers"; + stripPrefix = 0; + sha512.run = "636543ee5f2e027ec242d59ab8af28e8aa6f35d3e91480e4812a72df3c1636fdfeed2cf472c79b29fae5ed65224da4ca4a0bf5040e2a4360b73fc5f4cec85bb0"; + sha512.doc = "a00eb3157b84a22afeb66c6f918fb434bb2a183afba110340b93cdb7dc33152f4b9472da134f999f36057b7ddc221a2a78bbaac5fa0509e452c4d8d6e96ebcf3"; + sha512.source = "2d729252a866edd8039c2d09b8ebc92c28aad4b0863777460c69075d7c4e1065ad515937e13f2de5b0578a89c4693cc508dccf002823e5591a6960c6d2752456"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +din1505 = { + revision = 19441; + shortdesc = "Bibliography styles for German texts"; + stripPrefix = 0; + sha512.run = "cb9b819eb69ce4870dd36da844b1d24e4f678ad05f43eabbe861e9de5b53258e45e70530ca76c0aa9fcf54232e8f33dc55623f94c1d9e5fc3dfc48481093c3cc"; + sha512.doc = "4479f5ea1e1ade4bc7951d5722e397a688e75293da55ec57dd0f3d32add2bd551844da81336be0a77cc783e4c9af958be46501c4b78adbbf8a5463770b5cbb2c"; + hasRunfiles = true; + license = [ "free" ]; +}; +dinat = { + revision = 15878; + shortdesc = "Bibliography style for German texts"; + stripPrefix = 0; + sha512.run = "0b22f43a5088f669820674b46af72e66f3f2714a36052bc7d18c334b202d0060fd07b1a608626adf183314d2380fad672baf58307ed83aaa888231e75c63b1c8"; + sha512.doc = "f4491ab35e2ae8003faa8220e88c0abd2d970cc6b985d2baf993effd2ebe94a964ae8ece6db70a55f922abc83c91cce5f598ac2e722b5eb7e1584aee436e4393"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.5"; +}; +dinbrief = { + revision = 15878; + shortdesc = "German letter DIN style"; + stripPrefix = 0; + sha512.run = "0c2679265417acb042f81300895be7dc7d6b8d8f0bfa2ff8853b9c1adbb6bae78598c7eb4b7c2c91a9f95959ff7a7945f846e1f262f923d741e6fc77458be9f0"; + sha512.doc = "5182bf0761a484e89331ced44d05f82da097cb7be010333ad3eea1b987119af3f3e2a3cd8ac2c4b2b6149a09a5789325edee49205fdfe52d2960c12edacad0af"; + sha512.source = "0f81c2cea6799ccd39039b3fc9c45ab38b2041d0eef6efad245cae9fdfc17a7f967c24509b241fd19870170b4028ebed40db25884556bdf74e0ce2fef1a6e1ec"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dingbat = { + revision = 27918; + shortdesc = "Two dingbat symbol fonts"; + stripPrefix = 0; + sha512.run = "d6bdfc62eff8816e03eaea41ffbabf2d3af7194edbb2f9073c8d8b3d333c75f0b587a74556b916efb40afe41c88a8029f0dd764d7dc5894aa50e66e06fccb77a"; + sha512.doc = "993ef5169759d86641e2a3185064f94df858d81d9b7ba4b0516b22abc51eab887b5d02ca487ad85b007e7ee3117563a257d80b803a361ea1d32857921e794b9f"; + sha512.source = "01e935a99ff83496cd1e5c9e297d316f879fa8e54808c33a2daa54c78e1afc5048d3fabbf93450d15d6fed09eb59389348da266c751782cf017f383a97214d2a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +directory = { + revision = 15878; + shortdesc = "An address book using BibTeX"; + stripPrefix = 0; + sha512.run = "c07947f06fb08da461391cf6101a7a2e55875179c5d19b41007b0d11ff1881623e353b813dcca1da1f09e55beb80bf412f85ea6c9f7e3dd6e52a875770a5ffdd"; + sha512.doc = "24bf3fe447363c20e4ace4fb326c329a244aaeaafbf6f596ec91a3975e7cba86a2d711f9a5f10c2a70d72d74bc08dd2540e5139b4c4b525103e867a9d8e62bf9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.20"; +}; +dirtree = { + revision = 42428; + shortdesc = "Display trees in the style of windows explorer"; + stripPrefix = 0; + sha512.run = "5faecc2a6d79ae79929481c283b01e69df482267635957c5eb11c264d924ce299021d95baaf8cf6f9cb10e57f5fe14820c6b3506021b4d0213494bdeff5746a2"; + sha512.doc = "9edfb6fbcf4278c2b24599b58e10f64918d901bdd19dc0e9e8c8bd77756f2f3ba5dc13e31fefd2bd5f1467a0fb0dc0e765fe4e0515781103bdb1b81f687def7b"; + sha512.source = "4939918ace772a76142674410f9a1e91c698e02c113517385814346399cc94e031384905dc2719d717ac1dc65ff04d1d5a7049408ec55e20b4c0000f4b8a7049"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.32"; +}; +dirtytalk = { + revision = 20520; + shortdesc = "A package to typeset quotations easier"; + stripPrefix = 0; + sha512.run = "d5cf28f17a68cd064a290769aff11e656debe87ff0c04e61d4dd4fe87d285daab6dab9516b80b33b03680d50c420a4f3a9858ed5d2d3d5c96fa7fbf9989d29d6"; + sha512.doc = "8cdbdbfca4bdc58a560703b6406c98334ea0b5d9920cbc98ea0fdb7b56c9f1d48844167201829cef83fa84f0e21530baf2fcf4a3f8f8b5e44c5e792864ebf94f"; + sha512.source = "448c9b5765cb054981e306b795f7747e6e5a9219f00a4698d6f5ee36ebc56c80a1adc857212b3baa1a065b9a8f585f9938e2d20d8f6d30f8d17aff9fc80b11c4"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +disser = { + revision = 43417; + shortdesc = "Class and templates for typesetting dissertations in Russian"; + stripPrefix = 0; + sha512.run = "98c497bd8d422cacf639cb38ff3a489b5fcda3f92cb5a734287fc930666867eb0e9e6f6014ad42df527d3999eb5a87da28d7178b47cc53eb44a338567f952ca4"; + sha512.doc = "ed0c04c0afccd7f9f68bb8f65a6497b9cbfb2bbcb5333852da7b790083e71ceec8348f6893f1e0f16bef7e4b5ca0b9d1a58ca46898dc58a02f0324a62971b916"; + sha512.source = "9a9770eea5ab44b2265cb191bd113be4e98038a0ba8f3c92ffb837791cf59447c82caf63d50af6bace698a3b5b8a2bc25f427add6cefb436a6377df4816524b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.0"; +}; +ditaa = { + revision = 48932; + shortdesc = "Use ditaa diagrams within LaTeX documents"; + stripPrefix = 0; + sha512.run = "1aa2fab8150212ae8dbda9d0138a4c396f47256f93582ed38d9449f9440daba9e07dc0be397c49981e2d1813b7e41d2002fb7ff914382606f417f2738a8d2735"; + sha512.doc = "345d6d7d3f21d2dc728b93e2cbfeb4fc1f589797e852604809b1ff3e7bca53414d684571faf8245c740a50205e7d8787afd5304beb89efd3545a389ec4a74331"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +dithesis = { + revision = 34295; + shortdesc = "A class for undergraduate theses at the University of Athens"; + stripPrefix = 0; + sha512.run = "b11165408ccd30427390e9f409e8f561122d1a2dbe821ce90687df9feb2faef692d8ccd75fd8372b975a06e3f11bca0ba6e873d59b30aabfa95015ca35e557a8"; + sha512.doc = "25058b262f803fbbf3c41fa62ae8983ade351fc7bb65be7d886a4300390f836ef5d1240e59571839b407afa2ddb363e6c31e76e36c160ed3fe0c6d0e0ef71fbf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +dk-bib = { + revision = 15878; + shortdesc = "Danish variants of standard BibTeX styles"; + stripPrefix = 0; + sha512.run = "9de9e026b9e3de53b297d7925bd0e4e9ab08562e798a8f1b9e6988ecb891067534a741aefbbb81f1c53d7ae6b6cd0e0796d8c0690c5af661e76a5c6d9ea876df"; + sha512.doc = "258d8413d860f6a30c597c10b8c25f352166f8bc39cf23714a137e46f4748ba716dcae8eb8b6e17378f6a850ae64a68a9f331c8301c938f0a8042d967b3e62b3"; + sha512.source = "ddb3927504b35d025c339bfd1c072e9ef770a159f046bf86220ea675df481e5b781026ed6395a776f27518ffedef83b7c5f95be30f1be49747a76bb2e2280817"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.6"; +}; +dlfltxb = { + revision = 17337; + shortdesc = "Macros related to \"Introdktion til LaTeX\""; + stripPrefix = 0; + sha512.run = "d1d7bd6a855d131324fee30bcb920e0dfa6ba733a1d52f94c59e8f328b533d63444b5ce7e5fca9dcc7f21833a9cef84460106aab0a578fd17974c0e348f1ee07"; + sha512.doc = "171d6661ca71533fb869832be2bf6f7d26244bb5735fb884b5b1ce7c27d291b3e9518a902d6c7565d94d2c55c37b00564184bc5851824a00b5a71963a577128f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dnaseq = { + revision = 17194; + shortdesc = "Format DNA base sequences"; + stripPrefix = 0; + sha512.run = "b4a83c42e16aa734611dd8295aa033904828ac1825ccdd41f297586c0667ebec4a43606740fde56bd01f58ffee1b1f4afa647ce196ed042a5dfdb641f0ee2d7d"; + sha512.doc = "089352ea3210231ad158ecb0bc17d5ba0a9efe49ee4c609554f08dceff9ef534185a7f9f17526910d3b602c4c6c358f211fec4cfe27bd6df61555bce4f9d795f"; + sha512.source = "f4357ef3a23d8b1c7ca3168441ddda57fe725c4c17022807464e61035b89a8a8334684144d86f3d6ff0f3955c1c928903b80a61e6b1792cab633d6dab51d44df"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +dnp = { + revision = 54074; + shortdesc = "subfont numbers for DNP font encoding"; + stripPrefix = 0; + sha512.run = "27a4c150b3b5e3fa23e0df55289154d44e3eaa55330544e426cdd3126f8ce0308abcc17fa5a011e12d83460616cad039cc483f08d7254b64d4dae933db6273d9"; + hasRunfiles = true; +}; +doc-pictex = { + revision = 24927; + shortdesc = "A summary list of PicTeX documentation"; + stripPrefix = 0; + sha512.run = "c866f0855f701917fa81966c16a7f1c869320ddaf38e2c1c2a71844fa7b224fe2216f267b7b700ef6e36a13f97fa6f33a1d05342d5a7a8dd47ccda761fc577f4"; + sha512.doc = "3440fd4d0e2117594d6b350dcfed891506ce7fc0500ecdd4f156431363a38e399061469f5def9082d59c39b14b65ebc19ccb3204fef71ade300825cf35659158"; + license = [ "free" ]; +}; +docbytex = { + revision = 34294; + shortdesc = "Creating documentation from source code"; + stripPrefix = 0; + sha512.run = "0b212fe2131eb4070e08efad7f1e0745d0538b2173b274a41c113ae6dfce46d7d1fc8ebd22f16b3a956570865df9cad668866fc2038687ad6c0b7b72e76a79d8"; + sha512.doc = "0daa32aa23ca248dce228b8029cb19c6d4509114094d46efdcc45b52d6593176c44da88040b37d83054ec286c4b79727ea4ab2cf07c4522e5f597750d85118fd"; + hasRunfiles = true; + license = [ "free" ]; +}; +doclicense = { + revision = 68441; + shortdesc = "Support for putting documents under a license"; + stripPrefix = 0; + sha512.run = "f312fe38842267c1a35ab506354717a0ffc3d4b2684769965b7b94ca5fd6b137d0b13fdc98943b1fe0f635bd673c331ccc53faf5667b75d1192d786972008dc3"; + sha512.doc = "162af038ac645790412ea0e07771c39bbc3706ee3ccd6b8a496b166e7ef51e7802a225b00f1cceb0bdb0c8661ab51a79d4eb40a52c0348f1565fc83dc7efed9f"; + sha512.source = "2002418b83eb7117195e60a6f0211a395febe6455b210068db7fe1d99738820ba111e14fd6f61bf53020a78ce1bb7d0bd12b57294cf5081d37d5002dcf641253"; + hasRunfiles = true; + license = [ "cc0" "lppl13c" ]; + version = "3.3.0"; +}; +docmfp = { + revision = 15878; + shortdesc = "Document non-LaTeX code"; + stripPrefix = 0; + sha512.run = "55f68d7affd8d82631eb0e67c6232330bdff97ea908259a5e14255058d88f9f745afe55bd4a15eb91bff959b7cfc31835fa22196d3d0edcafa40da521b3105b6"; + sha512.doc = "fc3721046105ae78b19b61a45fd01570873842c6786a096575efae282e4fc884f5f5dfd5ea6888a25ddc82077340bf0ede4a36977cd33d2b555ccfc3d0ff2c02"; + sha512.source = "90c38a698f428980635ab3a826f35adb65a1f9b2a2dd385da8ff41ffba01870c071b7ce100dea1142d85ca216a68a0170aa8fdf92feb80a8ae055899f6b05633"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2d"; +}; +docmute = { + revision = 25741; + shortdesc = "Input files ignoring LaTeX preamble, etc"; + stripPrefix = 0; + sha512.run = "5c01f4e6922b7a23e753edf9110ae7f1386a4d6ca719ac898b058068a754a6c3bb123f918bdb1087baf5efd1176545f543ab8b93bcb6c9529c9000ad6a3b1e97"; + sha512.doc = "8207eade8841747201656a7e6edc789926a9dd411946a860e4d865fed618392bb9159245f7162adb4a58c88d00191d83f2daef49f610c3d8e5e231ad7f1fcb7e"; + sha512.source = "1809026635be9610b39f5f428dfeb2c323b4588dbc6306a50e00f092910fd449921a2cd797fdbf3408442b9f24cfeaf7c69e75db9bd217dce975eee2f1a4b930"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +docshots = { + revision = 69676; + shortdesc = "TeX samples next to their PDF snapshots"; + stripPrefix = 0; + deps = [ + "fancyvrb" + "iexec" + "pdfcrop" + "pgf" + "pgf-blur" + ]; + sha512.run = "55d866be055e8ef97014bae75355f9a3de111527d96475b604154566b5d92b74788c1f6d250b3f58bb35e9133bef5d923b1aba309704375fe19d85559600b23c"; + sha512.doc = "aef2d08ba7bab13a3ee496409601aa3cdb20612daa6866521bc70952032386f45fc64223ad5a2f188055053f372a0d70a21ea111901230f6dcb53f210a9c50ca"; + sha512.source = "ddf9a609829d07da413738be5b22454f8079d9e8985a7d8305ce1c00ae41625f7f145f3b806b996947b4836793193735df57da831d81dcf37ca61521f32cb464"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4.3"; +}; +docsurvey = { + revision = 70449; + shortdesc = "A survey of LaTeX documentation"; + stripPrefix = 0; + sha512.run = "ce94e7c797ec87694ab4df4ad3eba18586c0251d6cf4a5ef3d615062125a1cbd46ac2e9b7d822cfa07e44961d5354fec093cadbbd48cef403f9ac2c0ca665fed"; + sha512.doc = "4edd65ee2c7c910fc8bcfec3f33bc1f390ab1bb67bd06a84e84eea8421775b28c519615b23d2c25fe4524f79e8e295778fef6868d741f4484f42b1265d49eef0"; + license = [ "lppl13c" ]; +}; +doctools = { + revision = 34474; + shortdesc = "Tools for the documentation of LaTeX code"; + stripPrefix = 0; + sha512.run = "5c621b063d752fbcce773f2b209d358de1588e7c4edec017eb45a74c350e86932ac9c4e0662415ba7ad5bca8ca86d1255b15f4e5572ea949a5d6404b28f14025"; + sha512.doc = "a78cec3ce74e4689c848b49af7da035cc7c684730f78acd7a7f8d8f78194492e53880e7884eb00dd22d4bbca4f370aabe8175048503959f88023a12ee4f26598"; + sha512.source = "bf61b5c519ad73fa8187797367355c195ed2048d83cb4842862edca740f51d60bc421881da10c474d950485faf701631af6299033d2005f0d2aa8c6561625864"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +documentation = { + revision = 34521; + shortdesc = "Documentation support for C, Java and assembler code"; + stripPrefix = 0; + sha512.run = "330534f15cafffa56dc35e5b4de8caac66a87ccb0b834df5419a68a7cb136136263af14ef14ee7ecaf01fedb2803c2653dab7570ec2535ad1ca3033e1afd64e2"; + sha512.doc = "09854b00d86dd902c26c1b4f8cda942ea09796911939a20014b6d50d01b052e04007b55fe814877cb4515a6aa1f4ca1a7ebb39a6a6ac1bfc89b98d1f910329ee"; + sha512.source = "7e32523123407b913662fd7bbdedf5d3058e1e7e3592649b7afdd4d4df6bb704c7b1c3153fb0fdf3b8bea183259a64b8ab6ec17d74ee74ea086a56ef1dc90bc2"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.1"; +}; +docutils = { + revision = 56594; + shortdesc = "Helper commands and element definitions for Docutils LaTeX output"; + stripPrefix = 0; + sha512.run = "13a31f6925efd5cb0e0ccc632d7b8ff80e15a2e95399779ba33ee6e0f1d3c1a3f4a397dcb7fe33455471ec65e6fbb18d681349a43b24a083882c23aed5a0b036"; + sha512.doc = "1748ee0bfe61704d8174202dfaf6a674fd52ba154456f6aa18cf90b2248be90f12bdb36993cfc4a701a8aa3037614c2f86be93ac8528f3da3bce96a611cb5748"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +doi = { + revision = 48634; + shortdesc = "Create correct hyperlinks for DOI numbers"; + stripPrefix = 0; + sha512.run = "7a041a56ecc0f88d5200d39d7611c74f955e79e5f5f887d26a70c76624c334b6229f7b937426cbbabfd7de7ae0f9cd2aee70c502981c46fcc3f18fddd62261bc"; + sha512.doc = "3dd77559fbcb32d8bee7121f62bc37ca14c14c8e62f8d2ba44978438920dcdd54605a543135a6294e2ea9742f5fde4862a2efe3eeb6bf22b6d7418b4b01a2ebd"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +doipubmed = { + revision = 15878; + shortdesc = "Special commands for use in bibliographies"; + stripPrefix = 0; + sha512.run = "3f313afd9cee76d11b5f957a3e9f7cc0d5d2d04003c285df7cd872adc0cdd26d0248c03f0642d62af53f23c4399e7e5ac3ffcde38da782f64ab265e5879a7f60"; + sha512.doc = "0298b7f4a408f2092bb7ecd8d5b0cee745f442bdcc2bae463d922ae4511d5b0fd79b8f78d1de49f77b4fb158937fcb752d919239efc25829228c1f75185454ae"; + sha512.source = "ce8a2d5300a2a3555cef789064047d49810f1f7d9d00429eea8122cde3e4cf75b41d5cec901a3d6cb3596e83bfb43e8ccb2558c64ac3d0574970e9980ceceacf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +domitian = { + revision = 55286; + shortdesc = "Drop-in replacement for Palatino"; + stripPrefix = 0; + fontMaps = [ + "Map Domitian.map" + ]; + sha512.run = "f228d1670e7904b08ba6064d0d1e8c23432fa826d52229d575bc2067e27adc904c3684d76889a8beb4885c3c9de5cd4a5004b9afd3f7140ae5e90d36b4961b9a"; + sha512.doc = "81af6be4f2707ec5d46d5f78d459f42d81e0cf62a17a8e695e42b666076637183447a9f1888b3f4c84e4832362eefe01b8d8dc5d748a640eb8e20c72bdfc1f3e"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" "free" ]; + version = "1.0.1"; +}; +dosepsbin = { + revision = 29752; + shortdesc = "Deal with DOS binary EPS files"; + sha512.run = "7f31d47d60b0bf151cd6e6516e29a8414c6344657c133e726e6e8dfe23818995b10b9a2898b1801c4bcb9219969a8af1d2725b75df514ffb119730b3e49008f1"; + sha512.doc = "b9edce9984698db8e50f9183f89b025cfa89dca8a8725054af80f379c88ff1d2b02cef8f3d5f37ee5b8585a59d1a4d0f0ee0e541a7784f3f3f4e382d78e6a47e"; + hasManpages = true; + sha512.source = "d5739533a9d10e584ed7de4ec033b4a31be5681fd06fd9a2268f924d4434df902fc1f346ac2636f4ba7b7dcc6b5804a80b5431f7055fe8eccfeeea09915ad2e7"; + hasRunfiles = true; + license = [ "artistic1-cl8" ]; + version = "1.2"; +}; +dosepsbin.binfiles = [ + "dosepsbin" +]; +dot2texi = { + revision = 26237; + shortdesc = "Create graphs within LaTeX using the dot2tex tool"; + stripPrefix = 0; + sha512.run = "20cc54f907b00e2eb14e4641d5098dd4886ce8d4627f391421bc5e819614dec97e0ec42c92794bacb8ffcb03737cb8736c308fad6984abf13c127f6d1174ee0f"; + sha512.doc = "9e8461946582e0c99ee35437522e25769e2afe5d7051f072937a57c5d4e1a0c8e144509c751f9ddb7ef576f43ca408ffca663f81c8b5e69fb176a4233ff45ea3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "3.0"; +}; +dotarrow = { + revision = 15878; + shortdesc = "Extendable dotted arrows"; + stripPrefix = 0; + sha512.run = "43ff7e4e163764e703673312a1213c50f0a77da98f3f36b726e87042d082f3d2433e35156e1c963d1c6287aa4cea5ccc64f140f89b82569b0552f406b29813c9"; + sha512.doc = "7b5a4d0b2b31f55e657eed5b7cc0185a8895df77895bbe40f27c4d29d1086c9fef1779f7c4c726faae25821972fac418c379e9e68ad4cd059b1c6f5b0420e9fc"; + sha512.source = "3d756e93ba60153727d1719f3eb77d278ecae65c08f18529a6352707b655bf39f01152f13b60490ce21ba358e2021681a64de8e9fa6f46f9f4bae5b3a754f1a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01a"; +}; +dotlessi = { + revision = 51476; + shortdesc = "Provides dotless i's and j's for use in any math font"; + stripPrefix = 0; + sha512.run = "348be296d710fe22d8122b45437d91027913b90ef36fa7aa365ad49dbdea566506c80072623ccc95170227e77ee2fc2fb3f711772afe4e7e7b83195eb3110b61"; + sha512.doc = "c77fed1f0b8ddbd6ed141fe8c9f914cbd5592820ffe3e457ecf35952817149d1315598f449dfe0e15e0e50328e45b408d3f1ef91fe83154f5374bcc62041ba77"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +dotseqn = { + revision = 17195; + shortdesc = "Flush left equations with dotted leaders to the numbers"; + stripPrefix = 0; + sha512.run = "794be5110d50ff9134471aedec8adaf7267f112012d962ee6e1cd7ddaa36cc37d993517cf4663686c90df891fe2e912d260cc9c9945aaee25925c2915afcc45f"; + sha512.doc = "aeb026d83497b78725d623b52223877d4d5a0a745312511f007d69395b87ba5362904cfa26bb24f2f2c7d0e0ae14bb82699d6108533260d736c0e85bc29ceff2"; + sha512.source = "7cd2a4a2001a38e999e0632222116f32b559d8f004c9e378493d84486028e5c1cd5268f63a0eb93f9d1402b2c2e11b2db2429547f300809cca3d9f39efd6b17e"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.1"; +}; +dottex = { + revision = 15878; + shortdesc = "Use dot code in LaTeX"; + stripPrefix = 0; + sha512.run = "037586577425d8a38a2170bc4bb9a7fa28a7886ad852d1c85483f7c3b625321c41a204b613479382ff5fb9e8cc3f8f9d8ff6e0a07c14b71ce6fdc68280515e33"; + sha512.doc = "3708e08c630e27d744c3a865cc02e91868a32b1648b4d390cea0f20ea6340c56ea1720348f6b82796df6cc3f4d5b7feaf59ffe7e24c32e34535a4e5763318df6"; + sha512.source = "adf26c722ad1e2fa26d10488125267516923db87c1185068a33a082c6f51bf5ec644ace69aefa0630eab9a604bfc28032cb5d10db15ef0c80ab28fc93839a13b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.6"; +}; +doublestroke = { + revision = 15878; + shortdesc = "Typeset mathematical double stroke symbols"; + stripPrefix = 0; + fontMaps = [ + "Map dstroke.map" + ]; + sha512.run = "ff1be47939d9a2e8ec4fe8e6852d9fa31c2776511de158611ef8b853ac73291d1aa4ffe81985bed60c75a16e3cfc963a3a8ce3fb9494dcf6664cd6d92a549e73"; + sha512.doc = "2cf0cc8936393be2b01ed06158b250a43514098aeec4007bf493bd9232fda911f4a59f45716fba5837e475bdc39a86cf6e1180d4220e6aef26ff9e0315389200"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.111"; +}; +doulossil = { + revision = 63255; + shortdesc = "A font for typesetting the International Phonetic Alphabet (IPA)"; + stripPrefix = 0; + sha512.run = "02e347325823f5b8359bbf192965b58a2b1907dce315277a65dc573b1d2e612fde821455dc8f8afc69dcc532f43a20d0f78d0b0f5649641c8ce6dde73525fc4d"; + sha512.doc = "360c64adf1eface29c60c18e4b20c4aa382713f0e4a59ecab2737135a422178238214c9cb567669bdee82519e0658497bf409f92733403a1749730986be71d5c"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.1"; +}; +dowith = { + revision = 38860; + shortdesc = "Apply a command to a list of items"; + stripPrefix = 0; + sha512.run = "7c9bc25d94364ea13326ebc010d15c92b27ffad08b68fa5c3b5034e6bbd6a96370d159727270adf76e6edca15d08de86c13ca7ede009a445b500ac22b151c05c"; + sha512.doc = "2fb2234cdf6b42bd3f9f991b3d2d76473c45c51ffb67e7c12e7976310e0fa562cb8d1f01b347e9b8140c854e1ede865cfed17f5748ded909dc8d983d4f246961"; + sha512.source = "44d331b8f99533a6bb3b150748245787f686a807b22dcea3dd9bef311000881fcf0870d19d6718574d56adae79451ef05aca1bddf1904a76d50dd4e74529fd47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r0.32"; +}; +download = { + revision = 52257; + shortdesc = "Allow LaTeX to download files using an external process"; + stripPrefix = 0; + sha512.run = "051fdf31160c95e88c8ed1214311b0ec8eda80b7128752c27a203c7e7dc5cee6d275dc4ed93f06308b71d199d9216b18600a2b6b219f852fc256eb2486c2bfd2"; + sha512.doc = "388fbef93df8f76de34e7968b8a1925f294b87972e2e26cb1ae92145b252b5a88fc06254453a6bc15eab14a4532e1a18e3b719ea243142c09239e3521ff8f7d7"; + sha512.source = "6090434f8a33e1ac95363082c0536a9990ea6c4936adbe151c1f8e5ad20e7ad9635ee656c9c29af9360b5d8bd427f78d26c9527c4a84dfefec7dd73a007e9839"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +dox = { + revision = 46011; + shortdesc = "Extend the doc package"; + stripPrefix = 0; + sha512.run = "dc37733e7253d457b2fe09b72b808c5198f222dcde12e0d36ae546a8ad0537419fe7f27945625bb3cd3efd2b5b63991e89dede1199e89c67fe7d6917370cab67"; + sha512.doc = "4474e38d3dd35dd14b281f7d2e5ad1d6104d95579901a50b3575e846532c279111c81f813b78c4d16ca6c78ac627a30e51515ee7b178602b7338c1c799c62609"; + sha512.source = "08cbe72a2af77f3cd34a78d0743ede6f0017e7edc275e56c66defd51b1550990cf00d9327ee9cca5c44b7c73870ead063346754c4dc1f1aafc00614a5d5c0707"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +dozenal = { + revision = 47680; + shortdesc = "Typeset documents using base twelve numbering (also called \"dozenal\")"; + stripPrefix = 0; + sha512.run = "ca4171da87126231a791f432a6015cc069f0eb0d540f8b79b3b5028f3f3e30d9202622886b582f2e351049603d0323a458fbce3d6b2565af5391a4aa94b734c0"; + sha512.doc = "e7c180bed185135cfba31acbf4488ff0991066be7456a7c54625df458a24819ef8b41bc19eec955967f22fc156ad6efc9e194489178e2cffb806bf066ea42520"; + sha512.source = "4e8c3cc35fc2d429fa286fc68eb92d2d290bbbbeabcb714d849f9132ff71bf99edfc5b08a0ae596f98e900e1b49d658af2b2b9daf1fbacf57e2b3aeefa15f6ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "7.2"; +}; +dpcircling = { + revision = 54994; + shortdesc = "Decorated text boxes using TikZ"; + stripPrefix = 0; + sha512.run = "d102312ce1c70eeb9cfb279b065197ebd3ec6d3f54a47de55a5cb9828e76b2e690823a2ea19a935151c972f791783fa41a55adde03aefa54eb2b3fe3da0ea677"; + sha512.doc = "b1b01183f3490897b9681927676a7eafd01367eee6ea2fcb82fdfaae59294c67d96036ef67093fab13f0493adb9dce56f4e420b486bdc5f94e8a7801efcffc4a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +dpfloat = { + revision = 17196; + shortdesc = "Support for double-page floats"; + stripPrefix = 0; + sha512.run = "df136498f7ba41b1335ac109667d07dd9584e6682e1d75fc82a80839bf0f6d7a4de1f5750aa738eefb96d14d2adea20a3ec9fbc92130481d9bce0abb6c6f175e"; + sha512.doc = "2cbdb8711556580d14a01b9daf03b1a1095387c077413b2815bfaef1af2781fc8bc56fa7a6a36abee60d6ce6928f920c9d9c3deecc2e071e8e99d51c1421508c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +dprogress = { + revision = 15878; + shortdesc = "LaTeX-relevant log information for debugging"; + stripPrefix = 0; + sha512.run = "4f56a2d6e345cb98eba3ffddfa977bd48661d90bd10712387141b3398c9a85e8b9d7b0f33e75635b7a98e91176f1e866ecf0b14ef0197fc488bf976dd4889673"; + sha512.doc = "455451396b22b3d38288a5c51f6c2413c56ffd07ac1331c3727c4f382eaa07f0a128373ba033ae58e53411e69a4ec0eca67609fc3c111c91f24f2adb2536a2e1"; + sha512.source = "de6166c9c79f62c0f3eb973b6383f2bb486a8f7673628862d54af8e00a5ddcdf78419ea819c95e750f47fa3e65cd58b598e3a3510d43ec3d4d3fa9538a846a79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +drac = { + revision = 15878; + shortdesc = "Declare active character substitution, robustly"; + stripPrefix = 0; + sha512.run = "f45c94e222a6bcae0d87ab5aebf0f594f1674a49787391dfb9cce32f9b36a0aa6a81e84ea4ca345e0918ff2166e36738ae9969e4d9e4653bbb99ac6a7f0cc63f"; + sha512.doc = "7e6debf9580d7c145d8f95329aeadd63012bcfe3ac04fb9c4a3e815391757051ce021e4e2659c96fd7ff5066e3e324ac947cfaca16e52bf5895fd5724f81f552"; + sha512.source = "a56b3648bc75174179ac74eda67d84226985d18863270cdf6b6c1688ff1405389ad27f20abdc6a41f68520e1d95890fe021d1896d00a5c44a6a4ec2b9c380944"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +draftcopy = { + revision = 15878; + shortdesc = "Identify draft copies"; + stripPrefix = 0; + sha512.run = "f1f2ac803e1858ffab880c7427ed2dfeaeb435255e83ed795e0d5b4262fce1fbf7593653035af2e45d4731107c8f886938015ee1a7fd0018001c0e39e9f1018d"; + sha512.doc = "f7a4941c26c92223a9dde51e288380efe3b701d847051c13345e97f5a082cb3cd9e5d5421dfb2b1f1cdc12214df1ce6970a8ca6fe7463faad73af1a12c3542e7"; + sha512.source = "9320e076a200fa5d7fa297c7d3228ce77ad9a9a56f57e4ef250a21320e9f2e429004ab716747499a264108ece97ae03388df084c24e2a370f57ee22b80628cba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.16"; +}; +draftfigure = { + revision = 44854; + shortdesc = "Replace figures with a white box and additional features"; + stripPrefix = 0; + sha512.run = "e8ced947e69803243543657185e8fb28e67776dc9eee5e095126ec712fa368c32903f53243aaabb7308c895cf8e0c10a6d89c33e6b6c5d109f0300dab5213e60"; + sha512.doc = "f0a9a59ee326746802fb33412c44148ed8c836a24653df6685ecb69bc76870cae63ac8955274705639e658491566da0d0633ee8d57cf57d58fe43a971252ee05"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +draftwatermark = { + revision = 70401; + shortdesc = "Put a grey textual watermark on document pages"; + stripPrefix = 0; + sha512.run = "39bff239cd08c6c57c445944ba3fca6af408b2ae32212555c9e9dd64c8d7fead3eebd35a48e6c68f139d65ac5404efb60182993ab751df8d8670e646f06cc97d"; + sha512.doc = "1783cd72d65658df483c8c3f4b0b27b7a5e354e8686d08f08ece7cf6e15947bbab6ec9a07efa233144eca4ce3c015027093b4d502c39d2057555fab9ab07fd8d"; + sha512.source = "7c58ad08143158711945af36d5d9b77a32cc4b800144a7cf55b777047c08f7267731344997354bce0fcafd9b3eae17cd39659660784c9a1a47b307708b6f45dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3"; +}; +dramatist = { + revision = 35866; + shortdesc = "Typeset dramas, both in verse and in prose"; + stripPrefix = 0; + sha512.run = "d61da72538a7d83ee902081aefc23f3addf2fd6e5fa7ebb207fdac16546d13602c50419682e842df8f36a899c2c0aba0aaf615bf64202135dd9f470f5391838d"; + sha512.doc = "fc28e1dc8614d836637350a20478a0e8a03121909cb42bfd1cf4caf8e7adc01a4ac3eba08e82c389c41a567cd00f191ecd8938ac40a0a226e2fbdac047ecb733"; + sha512.source = "a364353dbbb9540a9f43c26fbfe6be8f814452a23e9f25c5a4c4f45a65534e0696dee993bddea4eb20eed284b892d258f6947fb0f96af63a0516f9f0fae01651"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.2e"; +}; +dratex = { + revision = 15878; + shortdesc = "General drawing macros"; + stripPrefix = 0; + sha512.run = "1a18f8866d1cffb0ac3c277bf27e1585c7596eab60ed51756077abe3154b6d67ea95205f60b5a244e9acabb05e8dc95a792d48f0a2fc492f90d224f85895fdd8"; + sha512.doc = "0ff34bd23dd8718f4f8b0dc3e84068ca2b38a9758849d98230f1a8d4561705d6db7be3b0fcb34621054993f27df7a9215267b3ebbd7fb3d77b8cd9cfefa0ad60"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +drawing-with-metapost = { + revision = 66846; + shortdesc = "How to draw technical diagrams with MetaPost"; + stripPrefix = 0; + sha512.run = "9e9deb95f1ca68c4f7b2a1e82bbc213da68e60bea65510e18dfa12528dbf65b20d06769c766009a1db49b9b7a649598f64a513957a4874f6c657ea0c1bc99901"; + sha512.doc = "9d3ac79b2d4165a3e7fe1675826db2190b7bbdeaf8b14460a618ae909e29dcd9796aff70af98bae5307f67945434ab3a304d955ed5d56e17ea94a67f83f2ef09"; + license = [ "opubl" ]; +}; +drawmatrix = { + revision = 44471; + shortdesc = "Draw visual representations of matrices in LaTeX"; + stripPrefix = 0; + sha512.run = "6be4d4ee6970956dd2f3b31d31ca0cfbad268e2f98ae64fd87a49de9ab26765447531121aa0edc157779f3f9c0dd76ab2ec3f747912f4204aab9e2e7181368f6"; + sha512.doc = "07eec69024d4daff597f2a937178f66413e6dc4974a2044f983e809b046f09140db7eaf3cfd68833bd95be0d56b4a564dfc9ad4d771fa124f55ea3783eafca1b"; + sha512.source = "8125f7c3b0867df9d8f21e45d89a03e6ff0f946d946646c26b0ca825a30c62051264f45e5c2da5bbd45b35afbc2f7f7120e9ea3d2d289f6a228385860d25f523"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.5.0"; +}; +drawstack = { + revision = 28582; + shortdesc = "Draw execution stacks"; + stripPrefix = 0; + sha512.run = "383eab0b77675ae418a775a413c37720d6f74d51d1a31bdb2923b45ced53afa576f10304e372171298ddbd566a8418526d291f74a1871eaba36ea3793d7d0173"; + sha512.doc = "d435447ec29bc26262886b3dc4c41cefae81d24e0704857a9ea61f1fc08ff8e4bfb4ead7686a9f49808dff30da47fc5638e2c0dbea4c6a551800a373f68df0e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +drm = { + revision = 38157; + shortdesc = "A complete family of fonts written in Metafont"; + stripPrefix = 0; + sha512.run = "662a2593713dc02debd4702b5184586736f12200aba4079154e6890b49d581810e1a7a94f0d3b6750ecd241dc03cd5a638a3ea5bd4792f13829e7812f5620b36"; + sha512.doc = "7821503ea6548fa200221d2c2234389a252ddc61498d66389f0afd13b6c36536b744f060f42bf26c4e2be722a7cbca8841b1b76510391da4960dcfbfb9956177"; + sha512.source = "a505f89568d63bc36799a3802fdd4e5a4903a10226b565c58b1b6d0900f0efeb699838ef17f84d9720558c7e1959e33d97c387b371862366726c6b99e30e838c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.4"; +}; +droid = { + revision = 54512; + shortdesc = "LaTeX support for the Droid font families"; + stripPrefix = 0; + fontMaps = [ + "Map droidsans.map" + "Map droidsansmono.map" + "Map droidserif.map" + ]; + sha512.run = "e57eba23d2b7a84ca36be4b0a2988870a89b69a5c2f423d8961c8fe38c074cead0760c0061a545518959145ead02a13e321c5719cfcd7d6a575b7050cd74ef2d"; + sha512.doc = "d1f86ef4fd82d955e5f6560b1eb56805bbea621358c3e708f5c07d6539d278a4e61fed680afba425a212eb7383bcdc1d663d492b4cd716ba2c1872f9006350c8"; + hasRunfiles = true; + license = [ "lppl13c" "asl20" ]; + version = "3.2"; +}; +droit-fr = { + revision = 39802; + shortdesc = "Document class and bibliographic style for French law"; + stripPrefix = 0; + sha512.run = "76c928be0648ae7bddc76f654b65a99ae6670cb17b0ae9a54596599ff655636d4520b31d4e802a15af65637c5bf956d41a2095762a3c4bb77052c9f74da5e7af"; + sha512.doc = "6129658aad2fae20dd12252941ee774393e262d9322ec2163ebc964ec27c4ffb63f2ce0faf9b74a90717c137065e9af238d45c623cc58d52b1e4776da221e231"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +drs = { + revision = 19232; + shortdesc = "Typeset Discourse Representation Structures (DRS)"; + stripPrefix = 0; + sha512.run = "5054b389c79b6895e648d3d4fcd1a3f7b06b213963245702e5bc4c0e8b6e3a87c6a2d3f72509998216e25553148008e597c6dd3015ef0b94724e84f3fade5936"; + sha512.doc = "c265c462094e50872fc2748167226319a5723aabe54ca057661b95c7cff897afd08f42ce6d520b7ab35f259b760800e79ac6deae0f1ca0c776c2c2aa7839cf80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +drv = { + revision = 29349; + shortdesc = "Derivation trees with MetaPost"; + stripPrefix = 0; + sha512.run = "b7f2b56f305d552bd857a5950fad2dadbf800857d4c8ee411fd2f5786697385404fce3956e59b5928ed5f0a688117dd740c0f56806674d08cd8cb1d52b79a9d8"; + sha512.doc = "a79d9883615568bd6c0d5aac44cc2ce28e0bd08e96f802d500515428ffb5400beadea94347abab7752904ae01342049b8d6687f6047aa9d8b27f5fe3a647bd02"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.97"; +}; +dsptricks = { + revision = 68753; + shortdesc = "Macros for Digital Signal Processing plots"; + stripPrefix = 0; + sha512.run = "f51353329034141f52c38563f79de526b7b47de3435e14dcbf91f658a0f64a7b23075e8cef98d0f948ab54b57681c7d9fcec417b59871ff908c00e12d1711b6e"; + sha512.doc = "0cfcb4e1094284ae954da49c1212bb793831861b57316f48fa93e20e92c8d35e1ee8e02bb1be8ecb52442dd80e3f0f921d024bdc8797a843ea0fcaad29759d01"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +dsserif = { + revision = 60898; + shortdesc = "A double-struck serifed font for mathematical use"; + stripPrefix = 0; + fontMaps = [ + "Map DSSerif.map" + ]; + sha512.run = "7fa159e85b370a1327a8cace1a20ed54b37f2413e553dbcd42c6e75cd224da35b47402d89d39971873e888cc9f89117fe5403887299ad8c43e6bf2f706df357d"; + sha512.doc = "e831d9ba6233cd260cd6f212f4f8b3adb360f6d701d121d26f0de95360dd56ccf7e3a5fb6fde990d875e60ca20f7632a4badaa9df8e3b98f16bfa5b176308761"; + sha512.source = "dcdf454c0d970338951b5b458df039ecc0287020fbf13c3ef46d2effc4aace39cdb424937d506783f572ccfd7cc136e9059e9894d4339b53f4b1be4b52d93579"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.031"; +}; +dtk = { + revision = 70117; + shortdesc = "Document class for the journal of DANTE"; + stripPrefix = 0; + sha512.run = "c9f59b7a80c40d4a1a9749ab3b5c48ab7dcbf213166454edcef30226f001d37724967e0306486892a64e1b16fcfd45f9d507f4e467642150ef90a75a5296471f"; + sha512.doc = "2cbf434924fe1b7ce9ed50f647069ab8a278f4be1f65981e7d9f6027f6f0f6b7465e7f2f169e860314f84fe38032ce0cdb0d96b55f281a04b7f830216498b46b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.10e"; +}; +dtk-bibliography = { + revision = 70517; + shortdesc = "Bibliography of \"Die TeXnische Komodie\""; + stripPrefix = 0; + sha512.run = "c6e8940feb04015e068e70a80b1b7058b451f324a2b7ad87644e011364077630b2fae6f8b292bd7cf426b3b4036279bc4ab449f182326b84016b39d66ae62f05"; + sha512.doc = "9fbbf62c28b5dd4f561e3aef62c033b7cf11eb8276ee1137752d36bd0b018e40cb477f0ea0dabad277ca5c541ef2fe84a968affe606da0cc3fb9123c246ce337"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-01"; +}; +dtl = { + revision = 62387; + shortdesc = "Tools to dis-assemble and re-assemble DVI files"; + sha512.run = "c2b7f3ab778c01979b158c335e4bff7bbb677fe8c5bc3202a5f43c747119dbc4a7e348c5fbb0bf2a487a49430939fae6abc855392da92ba65441b87e08585189"; + sha512.doc = "476723cb714863405daaa5fdc35557ffe7cb1149735272cfec2f14473ee65b93da90648abf73b4cf09799b1595569513f3735a07173b50eb6db405d526d40660"; + hasManpages = true; + license = [ "publicDomain" ]; + version = "0.6.1"; +}; +dtl.binfiles = [ + "dt2dv" + "dv2dt" +]; +dtxdescribe = { + revision = 69507; + shortdesc = "Describe additional object types in dtx source files"; + stripPrefix = 0; + sha512.run = "232d7cbd4d1d65740e97b608d3fca9da8ec4d06faea3fb39fdf49b829704fa269dc6bdaf4235d308fbd0f4027cf2b8fa48312320b4e972940118d69d17ec80ed"; + sha512.doc = "96b2397398fb9a1a59de1ca97543c7bc84892d5eedc5935fedbed753577d77428f58587b42e55a5e69b5c03c68eaa176c51c037340eff4cf19596203051452a2"; + sha512.source = "cfb804d222c7073b1cf4f143d2a98af9203623bc215b9747ffcfbf2e5b0935e56a9072027d8462f9c17e10a447c8bac7f3a30f93b6f692240ec3a472718493e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.09"; +}; +dtxgallery = { + revision = 49504; + shortdesc = "A small collection of minimal DTX examples"; + stripPrefix = 0; + sha512.run = "c4b164fc1fe9230aa92bd38689ffa67391aea511af59e74b93c9379f1d027f07091f98734af837a1af90b35b0e2e5245f78f0198f4a09465a8c59c18077a2457"; + sha512.doc = "ea56d62e0fb8b168461f8d01a08a9829ed00db4e2d6a460791de3018be21b4b446ad8ebf4a1c4a69e99a0989b85b55cbaa8aed171a53479df0501ea36cf03bdc"; + license = [ "lppl13c" ]; + version = "1"; +}; +dtxgen = { + revision = 51663; + shortdesc = "Creates a template for a self-extracting .dtx file"; + sha512.run = "b197684c1e941a64b606b472fb9e0f1ed4f5d0b0db2df59202712c0e3f3b3993106b8d493d707c4875e90dacd9dc7d12bba784ef7c8d04984a38708073b1b92d"; + sha512.doc = "f666a2b5d3cb32d43a23cc3edcd92bfb727d500a8c439b4b78bae89ac73c317adac9786e4702e78b5b4861b76489ff7af5cfd115a80b96cd6298c65412d56a50"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.08"; +}; +dtxgen.binfiles = [ + "dtxgen" +]; +dtxtut = { + revision = 69587; + shortdesc = "Tutorial on writing .dtx and .ins files"; + stripPrefix = 0; + sha512.run = "5b8dcf885fb0e3361154f6981efa3fa00c8ea9b11da7aa5f739f87b97b8a89226a4b150b97bfba33d0fcdebe11e7d900ee881203ea707cd8a3fcde16866ce54d"; + sha512.doc = "f7d37f9d766175c816eaad931a7623c3a537d4d8d73c28b57802c417bbd954b1781cee8bcc7445ed09fac9a6f36b2336aa6a9b5b769bba877f72754bc713eb4f"; + license = [ "lppl13c" ]; + version = "2.4"; +}; +ducksay = { + revision = 64655; + shortdesc = "Draw ASCII art of animals saying a specified message"; + stripPrefix = 0; + sha512.run = "d89900ae1247eb6706719ce472964a2d3b82c2826e18b3965de12d0c0503d77968edd9faffdee9870089de19e10319f94b1c6374371d387a50ebab414934bb61"; + sha512.doc = "1231fbd9920d0f9cc6c848df09c175c8bf47771e909463331a593bc71a7656948541e66bff507250030a88a362265531c7997f90fd23b4dde40e555d02b75760"; + sha512.source = "594c31ff9f2ac3274a275ba0f9b40a20b113f7357aba2755ca684e88f77e00dff220204908709b0cfe678a83fa391fd6728455123dbd53160a5edb5be3c64de2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6"; +}; +duckuments = { + revision = 52271; + shortdesc = "Create duckified dummy content"; + stripPrefix = 0; + sha512.run = "77c975ea3e42faee4db5d99d692220884b24ccce2d69a30ce484d113cd261ddf5cf5a13ee04d9e8a95572e98c8c4bedfd901db34379af6a567777f9358e4bad5"; + sha512.doc = "0c9e24cc988b9350d188878dd8b463428133fe30c00218eed3d67917ace24412e55c396422890fc6c02030378b560b3d374970e879e3a331db7d8e34b3302421"; + sha512.source = "528db05e9c1c0232fae271aff911f35cd55f85bfcdc931820f5a74d6f490fa3fada99c274b36fdddc6163cad6f779183b0056b1a6e003c4c2737282fed608497"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +duerer = { + revision = 20741; + shortdesc = "Computer Duerer fonts"; + stripPrefix = 0; + sha512.run = "15f39b70d6b595a1c4d6594a2908fc07e3597bf1bf88ba25b24ee545d473c709a15b52ad0bd367b0cb1a47ff9548a110c6dce6c2a2b2402f655c21f6dac5a393"; + sha512.doc = "babbe18510ab7acc910639e2993858b2cf27c4414772d2a03fd2d3576f7dd64f4c7b1aa05d9a7913b4eb8d4eddc942137b41b87816631b34cf35e0120dd3ea40"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +duerer-latex = { + revision = 15878; + shortdesc = "LaTeX support for the Duerer fonts"; + stripPrefix = 0; + sha512.run = "e474634e00b86878bc0c09ff247a930e102621d3606079d72e7c284a8ec61d2a2b36f1d09c171b7a4953981dea65df49da1962f01df272fa80354281a3209bc6"; + sha512.doc = "d1ea1a023e9f2f1ea4e0fa045d8831f764dbef34d1ef2ec96090f7f7a49aa1f4ed2df63bb611ee354a1e816a204841fbd7f4059a14ed06d758a31ca9f460d50a"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +duotenzor = { + revision = 18728; + shortdesc = "Drawing package for circuit and duotensor diagrams"; + stripPrefix = 0; + sha512.run = "33990302586baf5731976a27a8268986db6917137219248e559900fc2e64e5ef443bfd14a0472194a962f6fa59a8ed8bb1caadd46badf157fbe39f36815eacd7"; + sha512.doc = "83a811a37004975e4b3fca67bfed83d8fc85fe97a07a20f624d321c62efddf2ce188f1748a5cea47185675e8d5226433b48327d8d7daf87465471b89b652f2fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +dutchcal = { + revision = 54080; + shortdesc = "A reworking of ESSTIX13, adding a bold version"; + stripPrefix = 0; + fontMaps = [ + "Map dutchcal.map" + ]; + sha512.run = "308253e2b148cab892ef0ea5004cce0c3e3fbea4c0555b67f49e554734b16bc5be9baa08119fd0a2186360cef20e165b5133ce85c793eceaa9955673ec4594ec"; + sha512.doc = "1ac89d2c4ef090edc8c354a3f869485d3af9c374da012fb51edfd22f0644d63a5c380aad115b6dbe83e70846904b722b69fe4093f4a7ac8a4a3eb1c1c97f25b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +dvdcoll = { + revision = 15878; + shortdesc = "A class for typesetting DVD archives"; + stripPrefix = 0; + sha512.run = "e6b553b2e13e87e105ba1c64422e5269e2f285754f12db1d43f475e0f94dbd32253620c1e71ef08de106d5a050c531e058e529264478e7f4545ed83dfffdd233"; + sha512.doc = "59b152b1922bc79ec3a132902547e8ffebce8cc05e2933b3b54292b507d1ac1810cd0aa2c974045b9b996fd14445126e3eebe6ae3d6ec45e1fdccea9a6ca35e1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +dvgloss = { + revision = 29103; + shortdesc = "Facilities for setting interlinear glossed text"; + stripPrefix = 0; + sha512.run = "51227cd1323c6ef94f8e0c537289abd3812f39109ce178793347d6615a718109f120bf9e6a4dac1ea801effb6f2b9425c376fdcfd5db6a5409887a8b9b49dff8"; + sha512.doc = "4e59a568e0230e5e5dab7968eb27a8bda4680ed31b23d21fe3dfc15d0e3d8b3d6599535f91a092e2f9dea69402ba8ef07291d2cadc1e1cce28aea927fbb84341"; + sha512.source = "a4df82b4ea3e57de02e61e28cf4b9e8fa91e385534d7676fe3e287c49148849dc736003b867f1b481d56466847f9f62f020bb2e826ec81dc31be3d2b6f6a47d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +dvi2tty = { + revision = 66186; + shortdesc = "Produce ASCII from DVI"; + sha512.run = "1051c3448703fdd6395d78b0d8b7658197da6114fb7455b31502bad5c2eda24fd4eba2ceaba1f65d106f981bbc60caf9f3bd0db29403e898b293514d086bf91d"; + sha512.doc = "3ee736f5fbf91472008a5c8613c0e629a9f76f61fee4c4491b67045ddaad7aa2f89a22937b172e058b072ae1a013478fdf5a9f68dd2e225e8a8e77c8e3b3a289"; + hasManpages = true; + license = [ "gpl2Only" ]; + version = "6.0.0"; +}; +dvi2tty.binfiles = [ + "disdvi" + "dvi2tty" +]; +dviasm = { + revision = 68043; + shortdesc = "A utility for editing DVI files"; + sha512.run = "aa75c4d37cce8087658b66f8559cd31add027eaaf9b4fe4075f42f1bb4cbd30e57ca1125c8ae42852d17d51709b6c368bacc7146f16dc4f0d2ceb56b327dd824"; + sha512.doc = "116a7b02005ced75ae3e712de7d66513ce7d6d3ae9ee4e6e94b347d6000b27bb58d4fc1cf76cec7f19fd7cdd316f42c02e8ad7b8e0f0ccf88d405e17ef2ff155"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "gpl3Plus" ]; +}; +dviasm.binfiles = [ + "dviasm" +]; +dvicopy = { + revision = 66186; + shortdesc = "Copy DVI files, flattening VFs"; + sha512.run = "60f44492a3d1af9686de3118af37f1d054068527f50765e21773f76ec406b4ec0f419d6298dab6b5d33e2fb740bd740f2037f711e8993bf9d3ab8f611bebb2d0"; + sha512.doc = "40dd53fe878937846f003d3b72b7d474c13ad07156e78679501d01c020380a3fcc450aee7a72c0155a950429c258b8fab253a7ce3043d58d88300d0c1037da56"; + hasManpages = true; + license = [ "gpl1Only" ]; + version = "1.5"; +}; +dvicopy.binfiles = [ + "dvicopy" +]; +dvidvi = { + revision = 65952; + shortdesc = "Convert one DVI file into another"; + sha512.run = "81c58f4e1352a8e5133de1ad86b6b37c47f9b0d29307354001693ebc4975c30808e349c73a477283a16df4219fd5702b733ecb5abe2043aff1d1b537b7fa6a3c"; + sha512.doc = "b571021445b822e9824782ab35a0743ca23f69b809354dea6676c58209a451be5bf595641fbcb461211e6dec15e765bbfaf8164c0ce1ed4204ea72a2073ecb92"; + hasManpages = true; + license = [ "free" ]; +}; +dvidvi.binfiles = [ + "dvidvi" +]; +dviincl = { + revision = 29349; + shortdesc = "Include a DVI page into MetaPost output"; + stripPrefix = 0; + sha512.run = "dc09380d453b2c83359fa1862f6d289162ed4ec12e7f1b2842789db26e780713981261369dee0d03561a6864bb8bb25e071ca73c3d85e6218667587fa78f55bd"; + sha512.doc = "3418aa91ac8daf98f2ccbe67c2ca13bcf8fc5adb380f7c56e133f4487bc3ab701be1925d7a5878fc02ab7b8607e70991887a3d875d25b777b5489b7ae904aa7b"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.00"; +}; +dviinfox = { + revision = 59216; + shortdesc = "Perl script to print DVI meta information"; + sha512.run = "d366c28a88f488418405944e299b8e8c681a2bfbe1fb8d37847d89920ab41d3103d52072c7455ecec2451702cbbea02971ac6f1e1d609bde9a2f5e8abd345ef5"; + sha512.doc = "4da7f09620beb3aa7e5a572f31c1d53466607ec0f6401b687ac1da624ea435f0efb3e0e2074252f49a720cb6d53412658a8a45dcba5553315fc9423233755dbe"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.06"; +}; +dviinfox.binfiles = [ + "dviinfox" +]; +dviljk = { + revision = 66186; + shortdesc = "DVI to Laserjet output"; + sha512.run = "0d34e837c0f67ac43dd8ef5bfb9a11d2821188ef8259f41b0cf9454bfa6641f956c21d63fe15fbd68dd59f89c1da820cab4ec5c4579fc0255a771c47010821cc"; + sha512.doc = "4b5815d766a41eb74125269e297eb6f7d1626d68b3f2cf9d6c4f8734721e3c71b63e84e729c39fef41320e4f728888796e421bb5c7ea5ffe76cd549400d18d37"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +dviljk.binfiles = [ + "dvihp" + "dvilj" + "dvilj2p" + "dvilj4" + "dvilj4l" + "dvilj6" +]; +dviout-util = { + revision = 66186; + sha512.run = "684f5efd93c0c12a07b753f169f44e764b01e4994faa86df8361ce38c15675a0601f61bdfc9702508f66273ac8c69250db65fa0d10d3c544fb78fcc824d4ff3f"; + sha512.doc = "d10e8c9343f9065499e2c06b5eecce4047730875ccee29d6a09d1608e2334f7310282cff765c88c7da8ed8a52816910c79f3fad58d118f047d04b4bb7ebf44ca"; + hasManpages = true; +}; +dviout-util.binfiles = [ + "chkdvifont" + "dvispc" +]; +dvipdfmx = { + revision = 69127; + shortdesc = "An extended version of dvipdfm"; + deps = [ + "glyphlist" + ]; + postactionScript = "tlpkg/tlpostcode/dvipdfmx.pl"; + sha512.run = "75703f600365c90379c5d009e00d35d2e514a76b2556c96c84fc2a717287441af419a26fc9ef087d111f2e77c7180f6371ca2ec33b66052ab63ca3d11f48e788"; + sha512.doc = "d2fb71e116470d2d629613401f448ad9aa8cfdfa9ada68ed324061e4ac614efc4fd2c4ea2542c8fae32f476b92aafbabe4a5be648f28f16708c43958d7aa99fd"; + hasManpages = true; + hasRunfiles = true; + hasTlpkg = true; + license = [ "gpl1Only" ]; +}; +dvipdfmx.binfiles = [ + "dvipdfm" + "dvipdfmx" + "dvipdft" + "ebb" + "extractbb" + "xdvipdfmx" +]; +dvipng = { + revision = 66203; + shortdesc = "A fast DVI to PNG/GIF converter"; + sha512.run = "a1693423389d56570a3fa1ac1eb45bffdef5fa9bf26d738adae1ac2361fc9aa7985d4ed0908b5f8aa49e2425da9821989a61a3ac925ac4432c9caa49f66a95dc"; + sha512.doc = "a4473f728047cdf06743520a5cd4c79d7aa41818c44291abf4781f04b87822b03fe5db9f42d489d7542ca259070f71a3f255507f3dc8fbe772e30da8cc88722e"; + hasManpages = true; + hasInfo = true; + license = [ "lgpl3" ]; + version = "1.17"; +}; +dvipng.binfiles = [ + "dvigif" + "dvipng" +]; +dvipos = { + revision = 66186; + shortdesc = "support DVI pos: specials used by ConTeXt DVI output"; + sha512.run = "9e949fb402facda9c30fa2f388b80f2cfc530670b33cbd78559e4449fa6004c5d4082e4fb895ea397a334a333e5d5ae1a4f66fde3885f0a9eb28c9d9ebbecd0a"; + sha512.doc = "254a1db41636608a133e7807a8d4ea8ddd99ac646f35b66a43205ac7fdaf4a15c21eafbb85e23a182506e509895776d1fcbe63b3b8a7f197d577c6405ece5c44"; + hasManpages = true; +}; +dvipos.binfiles = [ + "dvipos" +]; +dvips = { + revision = 66203; + shortdesc = "A DVI to PostScript driver"; + sha512.run = "fbaf1dd979ceed4f7146d8aebc31ba7d770a8389b4ac214086db5951c485a2a3e3a62b2772394c8053444dfb8de0d22b3501c2ee3ee1e4e7493a1df5a34cc275"; + sha512.doc = "ac2518c20c26dcda42df79be79ed24e2c021af2084ede43f51a5589b1023c9c94a307bd0a4742880e2c89d7620b2889f3a675e30a449d699d15db98922b0da71"; + hasManpages = true; + hasInfo = true; + hasRunfiles = true; + license = [ "free" ]; +}; +dvips.binfiles = [ + "afm2tfm" + "dvips" +]; +dvipsconfig = { + revision = 13293; + shortdesc = "Collection of dvips PostScript headers"; + stripPrefix = 0; + sha512.run = "ff7ad395329dd1cc5d21d5459916d0f10a8c03399d733048bce0a8aaa4e3a955f3ad3dbb228319d4bfb96e0694069002507bc294ed81fda5a48ad93f8cd82589"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +dvisvgm = { + revision = 70496; + shortdesc = "Convert DVI, EPS, and PDF files to Scalable Vector Graphics format (SVG)"; + sha512.run = "94bcb0d873e30ca7d876eb28dc9951462fc28d6961beb11dd8b33fdb0c265614f506d27abfce6b8a540bee55bc489ce2243690341eaa509ba329c88ebcdc28ff"; + sha512.doc = "eee54ef41b2962cad615be1b6082e99087a3790ac057d280481ab1fbc50f3c525c732cb038dd324b757c0cc738e0a26a0193faa79637125858ffea285be61196"; + hasManpages = true; + license = [ "gpl3Plus" ]; + version = "3.2.2"; +}; +dvisvgm.binfiles = [ + "dvisvgm" +]; +dynamicnumber = { + revision = 38726; + shortdesc = "Dynamically typeset numbers and values in LaTeX through \"symbolic links\""; + stripPrefix = 0; + sha512.run = "802df3848c8ace40e1eef5c1d30c07a6a5f30fc902a9bb18581b79ff322921e7235ab05981625eb289f093f4486f0aec2e9c83bf669a9afa993a86146317b619"; + sha512.doc = "3eeb8617b33d45c1f97756f58bb87fa1244cd3089e0ed64f363f2909480459ce17e30d54bfbf948642856984618081d0fd15c0721d0190c187b375fbdfcfcebd"; + sha512.source = "8a4ed9566201af2835190f574c3316f5eff4258ef0e9b25b62b146b483c14e9fcf66abc2e1c4b3512f12969bcee1a8102ba020ea78874e0c7f3e68c0a64232ea"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1.3"; +}; +dynblocks = { + revision = 35193; + shortdesc = "A simple way to create dynamic blocks for Beamer"; + stripPrefix = 0; + sha512.run = "bda4ad43754e7d4fa87cc4ac5bdb772cd24a4e613bcf7993e3d448a9c884aad5ad484c6dd7739f4c6edb983560181717319dc26376a6025f3847afb588fa47a1"; + sha512.doc = "4f4084cc4dd913bcff3e71286fa4e881c7d577afd8e0669396de2ab18ccbdbc8649117bb931e365fa5999c5c842a71cab18da5573e83c1d721c87256e614c321"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2b"; +}; +dynkin-diagrams = { + revision = 67267; + shortdesc = "Draw Dynkin, Coxeter, and Satake diagrams using TikZ"; + stripPrefix = 0; + sha512.run = "4c7d15e3e04cc562e1f4a401546223af6e53f47f8edcaab6e82bb84246bb6c72b1acc15437402b161a123d11c21ac350d01b33ef7c8d8b7bab6c8dcb9baf7723"; + sha512.doc = "94d9a69e3603664d9f81da2887dfdcdb70d9318ecc13c0232da64cf23e6d6dbcd072807035771c519d58283ac40f306901db8699061305b3c97a3f7ee42ecf65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1415926535897932384"; +}; +dyntree = { + revision = 67016; + shortdesc = "Construct Dynkin tree diagrams"; + stripPrefix = 0; + sha512.run = "e8591951639020398e8f6bd892bd2d43217871fae4e94ecb09bc6005f1857858edb5b3b9330c5d08e8490598fd2f3d45bba4d99a9b33de464d0c5e6478399689"; + sha512.doc = "c2b2368a88648efe795a633f00ac826fff3b53029f557a4c5eb7dadbe882f560c768754adbbac09347b6bf44ee3bf77ec4b5ad57e9d5726e2c51519e0d02814c"; + sha512.source = "8df01c048b52cad5fa5862b16d16672eda36158936af1bd8254ef6b9574ecf84263f5f70a466f2846e653e1565e2f57f297c4b05c281c16ec72a4fd1e1eb8f25"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.0"; +}; +e-french = { + revision = 52027; + shortdesc = "Comprehensive LaTeX support for French-language typesetting"; + stripPrefix = 0; + sha512.run = "ed14a41b05d47117fc354bb5a1782338ed91ebbd6071af96f4bb94fcefed31048ef3ed1301686dd720d7f1c9ee59c518adbf83c6c7de2c35e3d50cdd65c0b0bf"; + sha512.doc = "d76ba6c016c8a48a06ed126d0d011e1336203cc8182f744de9d238e723019156f369574b7090cfcc943829ef058b77ec536ab6bb7c054e5e2587dc92998258d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.11"; +}; +ean = { + revision = 20851; + shortdesc = "Macros for making EAN barcodes"; + stripPrefix = 0; + sha512.run = "8a44b134d612ad4908a3ec025b0934feb56a8a8d7c7dce91f7ff152fda91c99c0c557ecacf7b22d8e9abf8e99d28b09b21abc8658e598baf37bfbbaa885b86d4"; + sha512.doc = "35c7d054236569b03082af07412f00dd08d760547433ec8da1876a83546c7432c4cdbffb617ff34b4e48b86873d699d41749bd838e12ffe32980b3d6e92865b0"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +ean13isbn = { + revision = 57514; + shortdesc = "Print EAN13 for ISBN"; + stripPrefix = 0; + sha512.run = "84f73871c0ddf2d6d2ae0d23f6d27c1cc985ac1c42345ad339d55762ac9e109f8d33dbf27105ae470ec2d2f127918c3fa0a3c49d9fbff8a7c67b3d20f36d2e8d"; + sha512.doc = "e7c474d1d488d95786d5f061412d051c9306cedeb86f6e31915d44e6fb71f09303b8f0e782be393e56dc6887730560825ef29d57af5a20f7bf02d96f77eb554b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +easing = { + revision = 59975; + shortdesc = "easing functions for pgfmath"; + stripPrefix = 0; + sha512.run = "3ed041546ecf6e921ce60f48365a1ba81ebaa8420f8f6d8e1c9ba1b38b20ea2a8c13392295d31a784bcc2fbf135ae37e5b89af794603b98492a4fac9c6dc6861"; + sha512.doc = "bbd559d63635d83e00924a9d40258f3edc32519524dcdc4bd3d7bce0487eec01900eeb26070cd4abe372150f013ab3206b075aaf530de6d395a938465de072bf"; + sha512.source = "dcbac9aef840277651060def21b4bac6f26572d7a0dbc7524788af224934c6344ac47af13e85a4c4d8f0857227b5ba8b5401081d34b7d5929747f510288dad37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +easy = { + revision = 19440; + shortdesc = "A collection of easy-to-use macros"; + stripPrefix = 0; + sha512.run = "fbc84351fe02c560ffa1c6b1713e762810123e7abee47bb31899d4baed353928350422e7d237abca758753ad306f927466919ce6b160a3820d1d5101c0b71ee9"; + sha512.doc = "27bfb9792f0c8261cd2de9bc95dc4023c69a37e12037855e31c606f0dc18d47e45f8299d385fa1dfcabaf6df298bb529e9da41f6d9d36f38f8d7fb5ef7930886"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.99"; +}; +easy-todo = { + revision = 32677; + shortdesc = "To-do notes in a document"; + stripPrefix = 0; + sha512.run = "88b496c1f4f56d26ac2fcc6d82e28d71bf11418368d82d3dcb193f8299672bf41d6c15938f3f6af5ac28141f2a52d132844fd178ebb9694de7f7a22fe8f13eaa"; + sha512.doc = "b2c49273445084f94083ed11f43492ed8ca32582fd9ffe9d12ccb7afe316b06b1924a507c5a12ab5880cae40ef4ee196c6d3e5d05f916356fdc026acc0a9acf1"; + hasRunfiles = true; + license = [ "asl20" ]; +}; +easybook = { + revision = 70236; + shortdesc = "Easily typesetting Chinese theses or books"; + stripPrefix = 0; + sha512.run = "b4abd45311a400ba7812dba5ff6ca299326b1e062c4dfc301ba5e5733fbaf6ab131cc285314396003dc616f40ffb98987279e80575326d4b3258023ec6a8e577"; + sha512.doc = "01d8ce41bae5faa8f818b3a0f95c37827d6a7aa50fe5a74e7ad5e57bd40159b77351467d0c7c71f9513bef32739786078c2295ce3cf62207891f3bdba660ebaf"; + sha512.source = "3789d9428ff0ecb54b113d61160db88cbe86f40e097dc17d386ad471af388188a189008bc5000a27cf0643634c1bc7c8df59130c82388f1cadeb4b1ac506bb1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024an"; +}; +easydtx = { + revision = 68514; + shortdesc = "A simplified DTX format"; + sha512.run = "f3297c900999197a5acbd73b931bffb21cc989296777b4884d62792d283490e46b06282ae5ce0cf3b0411690432dfa442a4f00c693f4d6677b9ced6037234914"; + sha512.doc = "2f9fe3dd6b2ee2d326a05de9f38966f26ea5baa154c3d7fdecea4af944dd041858b9e66f593b1a246bc6a3fe7d44d64fe1ddcb72e2495917bf8f4ad38b6531c5"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.1.0"; +}; +easydtx.binfiles = [ + "edtx2dtx" +]; +easyfig = { + revision = 64967; + shortdesc = "Simplifying the use of common figures"; + stripPrefix = 0; + sha512.run = "37a8654ee9f53ed35003d7d78fdae32ef195aaebc0530310e7f00829cec431d7df4f9bd807da8dae844731650a79a7cb9f7a7ca20c5dd540bafdca7975237503"; + sha512.doc = "1a197fa61d347919b34bd8735f5265d058e5a932a638ca91d34f43ceecaa155b9277db8ea40178b37bd2bbcaec4f0853c2d42ebdaf16d37e223da45f305c330a"; + sha512.source = "7fc5ad4208c6f1da261180edbe2cb1c11c8a34f87479199c7701986e516be43f05be6a226f75828aa2045a7fff0ad735b192e02e9739e381e8c64c66dba33310"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +easyfloats = { + revision = 57204; + shortdesc = "An easier interface to insert figures, tables and other objects in LaTeX"; + stripPrefix = 0; + deps = [ + "caption" + "environ" + "etoolbox" + "float" + "pgf" + ]; + sha512.run = "2d02a55fc3d50e5fb79ebe8188300db47aaecb42089843033c569ee0508a38f81e9409d872535e1f7fe3b13a067bdabbf8249073b803c8d232d08aa1d5520d48"; + sha512.doc = "d6e96d7af908e83b67b77f0432e6ffcdcc55b64bc63ac360e42291f16adec4ab6655a423f5fc8f31180071afc5645f47b7ecb2c1c80af719b6cb0cc6e77948da"; + sha512.source = "b21681d30b8963127d603bf81b140851b5e8ea17b63d5979bc05bcfa68efd67460b9f0d0419a69c44606a4d569f5840b3c8d6f0ce7b0cf18d86c1fa104776b5a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +easyformat = { + revision = 44543; + shortdesc = "Easily add boldface, italics and smallcaps"; + stripPrefix = 0; + sha512.run = "f952227a7b0e579d2bf432b3a72e80a45e8adc22ddd9e7af380de54c12f04acf6c4a88dde5a8e7027d11fb820448fdbcc6a343500ae493fa20341634fc64aed5"; + sha512.doc = "99b5f56c6004b72bfc7289905d2808b5e3c743449896e2af88a7b5c23bae3c62aaf2da9bee43192c662be28372bd856dec1b78a56626d5b1eb91b5e21a759356"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.4.0"; +}; +easylist = { + revision = 32661; + shortdesc = "Lists using a single active character"; + stripPrefix = 0; + sha512.run = "b1ddb6242b9ad2e40785602f942d4381a5d72a7d35784bbc2a1732ead1fbd9d730b580226452e9f56fda873b174c56f9b433f1193e0e3424efba4821f7b714ad"; + sha512.doc = "518258b7d24763477376657e128ef3504d2c8e0f71187edf9edd34825d567f9cdcdb09d61a37d99655959d7c76edfbe550bd08ebd7760735e46fff33bddfbf0a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +easyreview = { + revision = 38352; + shortdesc = "Package to provide a way to review (or perform editorial process) in LaTeX"; + stripPrefix = 0; + sha512.run = "4efa69b2e6280333a89022f93a95c8af4d22cc9b82c4e8692291470af83696e7ed524c77cfe9d9c397c4136c0ebd8399a8ca4ab47d42b84da35bb79189ff1b6f"; + sha512.doc = "4f71891df0b1dfbf32be06a427f34e5c45f73543b3acb9117487d2bffa46f5b61b74f795249cf3d806705beab710c5a7934a59a8e215c87678e778db517a0832"; + sha512.source = "8e4375d0711a1fd8ffb3c43a53b62e5e9b84ea90217c21a7155e514a4a42b8b34c36a0f0a839766d7e9b4eee05a6cb36ffd1da98f1c9f756d67fc8ba0acd4807"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ebezier = { + revision = 15878; + shortdesc = "Device independent picture environment enhancement"; + stripPrefix = 0; + sha512.run = "ccd80579b8c7e7e3500ad644f8a418bbd48ad1f2e1cb2aaa82836477553332b43092bb760c01cd7412393ee5b8bf23c055361f111467c71bd7061459781557ac"; + sha512.doc = "b81d28abf5c8b4a3dbed9219e6519e23fa5b94428baa8aef0ff32dd4893b24524e49cbb8ae08327a7ee59eba93cb0fa2950883d22296451c1f7949225f42b1f1"; + sha512.source = "ee742d7061a7891ad2b9cebabe827a408750f00ce2012bee8ae787bfd7b6d7ce8e968614d3d3f9eee72072560d47d871fc0022bac8ca8231643f85adf31218db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4"; +}; +ebgaramond = { + revision = 66604; + shortdesc = "LaTeX support for EBGaramond fonts"; + stripPrefix = 0; + fontMaps = [ + "Map EBGaramond.map" + ]; + sha512.run = "4a676d0016c5b3c4e513dca01e7e2f1b5bfbc061e111935380af4937bdfe2493927b226b28972c060ee0c09e7c27c6bf828ea09151eec0b8df67530f62e30aac"; + sha512.doc = "82713ea36e1eeb1d2673a049d9ffcae97627406571e6e8e47fa6a6853511beb5a5eeef8a63fbe88e6c79539b1fbde880d0b2779f6f01f20eb7b1c7fc716104bc"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +ebgaramond-maths = { + revision = 52168; + shortdesc = "LaTeX support for EBGaramond fonts in mathematics"; + stripPrefix = 0; + fontMaps = [ + "Map EBGaramond-Maths.map" + ]; + sha512.run = "5d65f676daee62f96875def0faf6d1fa217143046768985956372473b4cd3c6c00ca650cdedcdf677d6ae6a03c65743d30df6d32c36cc8366d8a1a9961bc11d3"; + sha512.doc = "d2207e0f6535be6ed1a53fc15717a60fab0d473da4f307cfc70c7271fbd93e7f6cbd92d1c0f0738da6d1b607832cbed95e5c87edd53cc5423f35f287289b4573"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ebong = { + revision = 67933; + shortdesc = "Utility for writing Bengali in Rapid Roman Format"; + sha512.run = "c38185b31613af4d6b27ffb5442cd404c1eb05669605a2140db85ae3074a3a7739c3e375e3cc16736f9c2889224f33f685d503b3908f4009fa308be7737aa499"; + sha512.doc = "a3337ca9bfe756672a66554b88feb59a49f66ecd7d1aec3702d74f29bc53ac1052394bda679a4cb4aa7509c5eb712938ed943a28c6f56a749c926b8d566eecf2"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "publicDomain" ]; +}; +ebong.binfiles = [ + "ebong" +]; +ebook = { + revision = 29466; + shortdesc = "Helps creating an ebook by providing an ebook class"; + stripPrefix = 0; + sha512.run = "3345ec303d77965800fb78a1a6b0645c206534bdf84e5b5287d23fb273a720025ec770527d662a5a535e98fb6cb9a6d37d50569963ca24225af8d626ea7d4dfd"; + sha512.doc = "0aba8d5010ece8e6e3c155d05a87eea960d8ec1b4deb1cd7ba948b4106eb8e20d752d3032696bb98c1d23b1927317d3d53a79fdf0b62e9053245aa86ef6e79e5"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +ebproof = { + revision = 57544; + shortdesc = "Formal proofs in the style of sequent calculus"; + stripPrefix = 0; + sha512.run = "e2b130cbc7b98555ad010ab5bc5226c68f413581b3128245500ad3ba734e4291c91cc42c96ee4108a1f359fb7cb4c884dd717aedba9e594865466e6c29d13be1"; + sha512.doc = "d5a1b900c73969c590921f3fea138e1ece49d9c9c4f1ccf7d3c1c877f501196a08d8099afde9913b83e653f4a8937e91878640975233f5482b6538d262a6139f"; + sha512.source = "16145b4ae4c6998533ed85df9a19abe7108ac13208f19fde0906280f68d96817df87db2db89ef77e1734e5c9ae6f2825939ce670856d6f35429cde10442907f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.1"; +}; +ebsthesis = { + revision = 15878; + shortdesc = "Typesetting theses for economics"; + stripPrefix = 0; + sha512.run = "37df2bd7749bf91c2e2a6e27e92a9222ed9b9d499b3a9bdb63f7751008bf7a4bea20d62bd59e8672b7fbc7bf0caa1ca77ef797c42224fc4167e5212f21cafbd3"; + sha512.doc = "5c508fdf7304668a371966d1be0198d71cce4ec762aa1b5b480dc495f47dd13d88f678d8613ed266e1d8e1353811e3058c31aaa5ae9f181c34c6bcf40adf5ae9"; + sha512.source = "0e35721d759fac3af82d3c627c5520ed60c36a83e50f10a717db990f2bcf5a3b22a0b28cce5f3926ec0a9859d5b08124efbe24ffe9a64f9ddd15f45f3246f596"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ec = { + revision = 25033; + shortdesc = "Computer modern fonts in T1 and TS1 encodings"; + stripPrefix = 0; + sha512.run = "a967804b42bcc11e766d5b74de28c54d167625d2b108a34bc5e49351533ddcfe3334e4a7a34966f8d159bbde6a80f84b4d216553ce03fbcfb7a4b6267574538f"; + sha512.doc = "bcf6617cf66af91312aea98f6c4a034f3af4ada14687414e7c3572e319fa4bd957dd25ebf557078297950d8ba8fd02229c5ad53464077feda462263b52536f29"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +ecc = { + revision = 15878; + shortdesc = "Sources for the European Concrete fonts"; + stripPrefix = 0; + sha512.run = "0f91383595d8606d0a118f8111af0531e0c53fe383511b6424f7cbbf70ace9c4d94dd379813bfceafcea11f6be361bf7d8df2088fad98a42a5e5d31476581f11"; + sha512.doc = "e3263aab5c8ac9985c579d4fba121085419d5c28e4813798402ad67213f96575dac0776d18918edaa18d42d458937a1e60ad666b2a01dea445675eea7e32b2c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ecclesiastic = { + revision = 38172; + shortdesc = "Typesetting Ecclesiastic Latin"; + stripPrefix = 0; + sha512.run = "f2518f8f25bf4b7c7fd34ee5fc271d08c3262ca2d90e271e02db96ef4826bdee53565f004fddd89e886258716874b101e7fb63b46a6124ed13b67facded6ddcc"; + sha512.doc = "35902f78af7c9acc42e23ae1d5c39ead5d92f0cf73f9c27b3f15d025555ed08502709638dec3788305fa776bb2924eb43e691c6e69424b23c21110de3160b60d"; + sha512.source = "9661b16b8d3af5e205e99a7b8da8ce1913ac1ef495f3e02202ce7cbe1fe786692c64b4a82913190db42f922f33d939069cf423b55af53792808900ebbe728b8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +ecgdraw = { + revision = 41617; + shortdesc = "Draws electrocardiograms (ECG)"; + stripPrefix = 0; + sha512.run = "419650d8ad24b9e08523953596a79c318740b2dcb7fd18a7c7a17019fe17cc66439c0acf56a7a7f8176349df0d80b44640511269d498cfa19aba6fb1f353923f"; + sha512.doc = "24968ada8568861eb973967b33827642e1201d002f73d40de5183a38d5f447a2fb93feb1db32807829c071d1a1147039e34ed4c287886260453b9c9737693986"; + sha512.source = "27ea4e0f4d184883eb0515cc95b7b797ea215626fb5c4003fc02bb490b6f3edf1d9422a7f764df28372d9ded429dbe47645bdaa8fa57c4517ef438096ac68801"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +ecltree = { + revision = 15878; + shortdesc = "Trees using epic and eepic macros"; + stripPrefix = 0; + sha512.run = "7461fe472dbd2ecb4e692cdbd58d5b801960d160bd7e18fa7d5ebe3e42defd11faba318d5d9134fd17275a4271f4c7761fa2d65fc1f202b4eb7b0fe3968a9fbc"; + sha512.doc = "3dc607ff60f9e738476b1f5c801801e3dc10713d7f5dc4b790b92f454fec1e68e9abe8efa7e4b0464ed6ad854d7971e241987fd63d406ba9deec9c99f8bf229a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +eco = { + revision = 29349; + shortdesc = "Oldstyle numerals using EC fonts"; + stripPrefix = 0; + sha512.run = "7bed893bb3f379d61dc874280ccc26db037511ea69faf37076f3cfbf01cf3d747706d40086eb99c502f215f026b2e357e44e8940a859559c3a5d9876bfd70c00"; + sha512.doc = "3c2042779dd30c8ff0e8f09580b3173f3dd43659ff2ca94c52500f989a338a29799c22eb08c493dfa82496117d7fd7548f903f71fe488727acf4e517dc6c0377"; + sha512.source = "355f1a47eddba5eedf9933d0a137045d9cb06e3918814754079e7dca0852d2fb10969f0c48a030ef9dad923e7131b6e77af8e1e8b2954b3d70409fad400ebe05"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.3"; +}; +ecobiblatex = { + revision = 39233; + shortdesc = "Global Ecology and Biogeography BibLaTeX styles for the Biber backend"; + stripPrefix = 0; + sha512.run = "bfa49fbd340223db68ae6d0906b617c06605a41aa141ce7863d5ab85b4da44eaba554b93bf163f7e4b7cd2c5131e22ba30161082663588ce85240fe2147433a5"; + sha512.doc = "e12bf5be5028e848baf10fed969a5ea94e2246153b481fc1b8ab55a6fbb5c356391ec4ccdb37ae7c71d76885000d9d74e46271402ed83ed08d1d67a94cf372d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +econ-bst = { + revision = 68761; + shortdesc = "BibTeX style for economics papers"; + stripPrefix = 0; + sha512.run = "e46ee69626bcf1fbb051d66572e1335496bf7981023540707cd267624798d4b4e75022cd85e0bfee05a227cb20b65c3b70053a4262b662269f905ee89569d2f8"; + sha512.doc = "dfda5046d25922e563df6deb93a9d4402f75c883a8b449f70430c7ab7465e8d8cc392b585e5aead7fe499ed9143d5928bb556ad7ab4c563d54be11270cf8cdb7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +econlipsum = { + revision = 58390; + shortdesc = "Generate sentences from economic articles"; + stripPrefix = 0; + sha512.run = "e3b007e83980cc9d7ef7fbc1f7cf067d757ba29c886d20f6c53d028236cc688fad23d7ad24cbfde19b6adb77a159b10f2bad617de009b2fa769aaba042a8ff01"; + sha512.doc = "a540e4cb09c88d1614ea0dd46bc35396d9f11a39089dfc9d83c31587a2f72c0537f5d7fe3c8ba1a25559d8b7fa4dd75a577820eeb02386d50fe418b50c6fb8b9"; + sha512.source = "bcbd36e3ee0ed9e941e34dece41fb4e927f5f826fccfda3612f4757d72b7485cd34e9569d867435eaddaa763b28199db765f9caec107b2e6954a3b9da8e44a37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.2"; +}; +econometrics = { + revision = 39396; + shortdesc = "Defines some commands that simplify mathematic notation in economic and econometric writing"; + stripPrefix = 0; + sha512.run = "40c205421ca11111d2aeae9f84b4e418e6b4f260858805c03029753af03def61221b81eabc18dea5fd4cf5722e3dca1ff9f575264257db3a8431b061177530dd"; + sha512.doc = "b5992f38536f0e4ec1c570d78523530b53e428d922517d0ad380ec76dcd2ee21243b9979e876a7f809b1581f4c4b6907bcd3f581dff97c13a0fea2a0fca1d790"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +economic = { + revision = 32639; + shortdesc = "BibTeX support for submitting to Economics journals"; + stripPrefix = 0; + sha512.run = "d8bad4a76eefc8729ea06e93a63adadfeed57de5694775bc44f1dfe03217101609ada6d12b7a2382b9d80d068f0c51fb2ef45c2cf289fe294efe23fcf0bd028a"; + sha512.doc = "39c319f14ee3d6fb10fa3c4f5d3a873322d332bc181a33a70020a9fa787383b72809b3b9aea5fcf4a3cff9930543e0d0269f74146c12f2b0d77a4f77c159eeb7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ecothesis = { + revision = 48007; + shortdesc = "LaTeX thesis template for the Universidade Federal de Vicosa (UFV), Brazil"; + stripPrefix = 0; + sha512.run = "bed57bb0ea79c74517b26e51d88966f9a05943c4df6464200ffe36f486e9cabccaef2fced0a231b40b40410ef32c44a3ebaa984e6def30bde5d426dc68e42309"; + sha512.doc = "7e1e3716de1eb964142a85ab31e28fc807ca1433f964e44cc8a7103b9ed023457bcdb01af2797a5e22fcf75a2e851d9c534f17937fdc44e4ebb6b5a670c6c115"; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ecv = { + revision = 24928; + shortdesc = "A fancy Curriculum Vitae class"; + stripPrefix = 0; + sha512.run = "0ff0a352516aa90a19eb1a0a9bdc651601edc63f03c5cce9face4bd45b359734d954e2b7859a0244015e3933eaa2d3803d5579ab9260dde51a0ec89db8034910"; + sha512.doc = "1cb8871b552a3d91fb59c644ea98373742ba9bfea64a92911f67f2795afaf01babe82a691fb3344f236e42b92860b754d7e92132b266713948cd1a6af13c58d7"; + sha512.source = "e17e9d577cb3a562a381c8ee8a09e7b3bbdd236812fd9e647b72fa18d6f7b11c9a44f70376d5dfdf2a3b81d1480b055d23e8889661b557e88c03f02eed033946"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.3"; +}; +eczar = { + revision = 57716; + shortdesc = "A font family supporting Devanagari and Latin script"; + stripPrefix = 0; + sha512.run = "47906067bd5e2bfe28e6451456e2187fc655986d4eacc89e9c3edf67bdffe7f54ef2c14029c9934db6c85acdacb006cd829255c2209d2d1dbcf57a98fde40e3c"; + sha512.doc = "03fc47faa72ccbfbe696e68bc5f9c332eb7262cf1b3129c6b83fc5f5e2b5c3e0ba93b047dd9eb6d92c32e218d303896272d0c1d3d3dc7fd07b80757ced9f231f"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.1"; +}; +ed = { + revision = 25231; + shortdesc = "Editorial Notes for LaTeX documents"; + stripPrefix = 0; + sha512.run = "a6999fbe2a9a44f961ef60d3da65ea306809d1ee5c39d2fc605982083d69c3c723a0e18f4042cbd441103421cb569008925279871ea8ceeb0af4c4a21b746943"; + sha512.doc = "cd7bac245c14e969b5162b86cfc76e0673da357fb1492ba311930ea7e20a6db61e3a13be2069f4f589ab57cba9fdfb0fcc8779ec8607a624437d1b2bd746825b"; + sha512.source = "7736dd9bef8c265437675d87a6b70bf0bb67ad736b668210b7187ddfde899b145050e18a9d54629b966cabc8b46028dc982b107c0f869e581669b663d3267ba7"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.8"; +}; +edfnotes = { + revision = 21540; + shortdesc = "Critical annotations to footnotes with ednotes"; + stripPrefix = 0; + sha512.run = "3ffca21a97b1e54045129a8894db25d677a54c791e3453f53285741bceff0eb4c7cc00e81706ef77ac475a0f54a7868f2e9b444df0c4e4ba6b161fdfa954dc07"; + sha512.doc = "144e2e22c4ceb6ea46235ed51b9a1ad4b20aa524af7b6eff617194aaec4f1606d857a8575e95816b4ef089e5c7d3fc1e2fc8e622486bafe9e5a9ace22bb44105"; + sha512.source = "9fb306c9b77f0988fcc2dde74336687e8678364e2d53167bff8053a5888de1cf51240778281a7c864a7b8a66738d2c894e7e4b7a88871f0f7ce0e40c61b706be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6b"; +}; +edichokey = { + revision = 56223; + shortdesc = "Typeset dichotomous identification keys"; + stripPrefix = 0; + sha512.run = "c598495449919a67650e7afcc10924cf93f4c29e1dd32305f0581910aaea288d43e6c8c1b91ae9d849b354e343538350ef0d6e78513998a9d2fc6023cd3cf941"; + sha512.doc = "07a8689d20663340d5398a26cd548bbd53c5e6d5c7eac00e9e6478c780e397e765a8cca0e4b41a7b70f09130a1c7fac5326e5f2c46b95f40e11f0ba88b1b3039"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01y"; +}; +edmac = { + revision = 61719; + shortdesc = "Typeset critical editions"; + stripPrefix = 0; + sha512.run = "12395b2429372cbf88794c197e28ceab4b69ca7d14cf78524e9538491b2ca8d14714e1ef00f2643a0e3e62db559f12a9a53a56d4bc7f54420d3f125727fca557"; + sha512.doc = "d78db33bf2b2fdd17f23eae23ab9605efb29a217e52d89df5feb64db1907c1b5a497441eeb1fe2373342b7c9b09296c06efa24d6776edce84406e22a1967bb64"; + sha512.source = "995092e2ea0776377938076b67f25042329ab76ef31f83f6f40aba449a735a90bc697be52f16fa6a2ac02cbe4ff2ef99762fdc03bd14eebff7a363f6c7f46c13"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "3.17"; +}; +edmargin = { + revision = 27599; + shortdesc = "Multiple series of endnotes for critical editions"; + stripPrefix = 0; + sha512.run = "242e7eff25ffb539353b73c18d31a268efaebe4fb51d9ba1cf376346e559ea2fb380743b29056aeb8e4db2065a660bf59e7c8dcf5469f91c39135be2b8c9527c"; + sha512.doc = "da77df03b3eb89daa0a544d61c88956a7105073110dd9e1f4d1a753805bdf722a63f5a9674897f4f09a92f689d6bbafc190c870cf5784e02df7efed781dbbcee"; + sha512.source = "6f3b848e12b92f773ed23f51bcfcd52fbb8209906b937486c87ee34cbe29d40739cb6c20799ce64bfbe7b0e3dfb96d604aaccd005ecc1dbb7126bf5302d3c814"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +eemeir = { + revision = 15878; + shortdesc = "Adjust the gender of words in a document"; + stripPrefix = 0; + sha512.run = "81679a08a320275221058cf0a73d71489621bfa4322a4b90759f67253df06e5c98c1325846966924c145092d9f63d9ba51544d0640c7f0827c7ebc42fddf9f3a"; + sha512.doc = "4f7a67d76504c4fa8de1f7f4e5db19c1ed1509a3ee68d93811c84e3ca523b8ff040d61e14881ccf75d20edc7c6b52550b3b3fdfa58a9a73bf21ec7f8b0b719aa"; + sha512.source = "a75e1bc385293e5e418af04a1c03ab606c5c77fa95bc6830a029e53e4298edd853c0bdb92ec0b97994fb8d2b7af293c3ef60f3d14974b87e079f15f904436d4b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +eepic = { + revision = 15878; + shortdesc = "Extensions to epic and the LaTeX drawing tools"; + stripPrefix = 0; + sha512.run = "37930ecdebd43ac8ac1dcb42da4d4eb4b5ff371605b9bfe4675ea861f4edff7cb19703669c8356c3d69e7ccc09789bc536714114397c3bca74fcb4a22b6f4d9b"; + sha512.doc = "02efd8775f6d0db35fa4682c6bc715fe619037a6531de60a2955fbd7fca01d97a8e6dee0109a8cd7cc8237bd694c64797392991e5c203baab49dd9857b0ccb4c"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.1e"; +}; +efbox = { + revision = 33236; + shortdesc = "Extension of \fbox, with controllable frames and colours"; + stripPrefix = 0; + sha512.run = "5091324e7f5c05385296d570027a8546db4220a24da330ab85ef5d1185772f51b4f200f63eaad0cfa3eaeafd3d055509f4ffbdf798c1139a60c5e572ea46926e"; + sha512.doc = "394387e09ecb0d497014a62fc1caedcb3e00148f6e0a9a16ae1b53efbb4d5cf749e154e4c905d197280e4ecd9bc88ea07ab7e0c004b8c30eadbe7f9f414c1345"; + sha512.source = "4739cf6bbe23b69605079bdd8c39eddd6b44e192c5c335001c9612598f2a005e98b853bc02ff67996b63a971b200996f35de2331f230d9c43ed73ad9a8a98a7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +egameps = { + revision = 15878; + shortdesc = "LaTeX package for typesetting extensive games"; + stripPrefix = 0; + sha512.run = "b8d1c056783c4a71484a00f0d80de4eb9de3beaa54cc4dc71e5a7c171871b5dacba753ad03ab196661b1bd73cf9d2eaf202a813b73bea405f807319a143644cb"; + sha512.doc = "0216a85d539ab19aef8c2c4f313f5095aa39e4955ae9610c14d0243081b7af98f50a74a2f7720b376493e660a5486f83e69b41f8cb8017ff66a8e706eb9ca71b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +egpeirce = { + revision = 66924; + shortdesc = "Draw existential graphs invented by Charles S. Peirce"; + stripPrefix = 0; + sha512.run = "fb91855cd9264b72df852d4adc5d369b26efc5305c032120013d6cb18e99a94c8123cc7c9a4cad86ef3144609f0a34f3645597c91aabaf165a51b903b24c9d11"; + sha512.doc = "c78830f07e8e3caf99f51b53783112fbc7b6ada78ecc284a53e90c532331ce9e4430540e5cffed679b447b9e23cd5bb25c4d437d07a127e65e142322cabd65fa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +egplot = { + revision = 20617; + shortdesc = "Encapsulate Gnuplot sources in LaTeX documents"; + stripPrefix = 0; + sha512.run = "c96cc3185c09f66fc6a4c19958b88d178cf0b6ea9d889938df5a07d4fb7b19962a9c17ebe0a906ab19a8725808aa09ee41b39a0379fefbf8816a5e78abf9201f"; + sha512.doc = "e6e55708004cdf3dfd753071e2fc242428a6636944f3ea65510d2e9f8e2921b869ff4a22d100b43d70ba0708a5b19f002bbe21f57c858ec72b11ffe82e161e50"; + sha512.source = "45c810de39612dcd60d71b4acc8aa9a7c2c22c1eab8e1ca1628ced9873c86b0ff31035ec5f72d89decf91ba552c4e3473249138f557bd650b9863c5385502436"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.02a"; +}; +ehhline = { + revision = 54676; + shortdesc = "Extend the \hhline command"; + stripPrefix = 0; + sha512.run = "759e123a2418acd7239c4b897e64c146ffb84cc1646d331acc5ca498f707b916c1392f3fb9b97d2916d745e9afcf9c630a5a94e413ecd0c17fc2a8b13f773d3b"; + sha512.doc = "79db947da1c51811e834999889c3d089e2c5077d2d21fe133f6879a87afae4e2c7fcf1f07981ef9335a6b7234f083e74e21364be3526448ebdeda6ba75815fac"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +eiad = { + revision = 15878; + shortdesc = "Traditional style Irish fonts"; + stripPrefix = 0; + sha512.run = "3123d601a5f5c34c45bff20eb052a0934a2bba9d693e460fdb84908ed327eff8b3a022a5c617c8818bd48b1fe72b9b0c48443e0cb290f15e94334152f1f5e5cc"; + sha512.doc = "546bbad79f9f13e420b05b318010f078ea8844a02cedf11faa506d41073e2e0668356291a4e12758e5a37586e4aa9c79c17c8135f244756c39b61076038fb8e6"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +eiad-ltx = { + revision = 15878; + shortdesc = "LaTeX support for the eiad font"; + stripPrefix = 0; + sha512.run = "e052333d39e72562e8e84d0e7f6af7066c2068a782422f612a26bd2903d8143874cd4dcc556d7406f3601a6b3a28506a3c0edc92e4029d124f02fe91edf0163c"; + sha512.doc = "907a20283eb78965dc4d8fdb46c542937c70c7a3f2849984034f9f37872d4d3042064fad0ee232132aadcb7daa4d4ec4b9745f8a6d0406dfa7b929ea68be0d96"; + sha512.source = "dcdb63542954048aa74a1a412cef02c16706bb7f66870e72ab4c772e2e41048c255bd02877fc60ffdef15b09e229ba721054cfbcbea5ce16fdaa181ca0bc8283"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +eijkhout = { + revision = 15878; + shortdesc = "Victor Eijkhout's packages"; + stripPrefix = 0; + sha512.run = "448f3b51c984a1ec81428c1840ba01d072cef4d1110b85f8d4f4d786d02e8d08e702e0b33e757035aecef1f43b604746c7b6f492905fbb201fc1a34ca6fb859e"; + hasRunfiles = true; + license = [ "free" ]; +}; +einfart = { + revision = 70318; + shortdesc = "Write your articles in a simple and clear way"; + stripPrefix = 0; + deps = [ + "minimalist" + ]; + sha512.run = "5e15f55394c35e033661c00295fcde0ccd424532ecdcf3c55f134ba7f990ee95961fe9b620a1addb2cfaddc97b030296b4ec9dae29a1d025aa2944d7130574e0"; + sha512.doc = "56b8b1415b0526af7610502a65d13f304f05f18def4fd4c2870be9adaacefbd6e9cf34d318f135d358a85d56eb57f4f2fb583a529c43d4ffe9bed729310ce4ca"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ejpecp = { + revision = 60950; + shortdesc = "Class for EJP and ECP"; + stripPrefix = 0; + sha512.run = "160b09a6c0abc694831cdbcb17c8fdd2feddeb27c82c06d70e31a5991c8488864cfc99b7e5768fe745a09ba811a5cc0c108428c6c7f3dbf3d8da7455074bffe7"; + sha512.doc = "206012655184167bc27c73f4fb3b4cd14e6a85dc2c3faea1eaf98d74c89a8e34765aa1f6c47c6a9aa1bf862c98b1273d19e33ebdf099ecbce674b6f7aa39e7e8"; + sha512.source = "01f26bcc15dc2e3b926524e6e0f1dd9739f7c5333bd947d5a1c83bd285e34e3c997c68acb6b33993a281f0dc81d751a9b8eaaf17753531553c6a366b6b60d635"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.11.3"; +}; +ekaia = { + revision = 49594; + shortdesc = "Article format for publishing the Basque Country Science and Technology Journal \"Ekaia\""; + stripPrefix = 0; + sha512.run = "97479cb146f37e0fd80fbcf67db44a474d96da9897fb058073b75bbd9a109f16dfa36bdd97c5fed5397255cf0320028ca687955fb40e069bdfa262af50773c99"; + sha512.doc = "f95512969ca475b87f09fa3b61e2be1ebf949161b7209721579f7ec1399e6873186535ec30dbee092fd69dc427a199daa4f94ee47cc08a0fc37fbac6213429de"; + sha512.source = "f39b1a8a90bfe899fe914b6a4e99e08334ecf01ca54bbd6275ab9edfefc12f7f165eeca09b6195532ff92d72e4aeba63e94be7afe00d8215a86dca3695d523c7"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.06"; +}; +ekdosis = { + revision = 69568; + shortdesc = "Typesetting TEI-xml compliant Critical Editions"; + stripPrefix = 0; + sha512.run = "2b69616e44379680fa41e2e3f42dbac8d052c7d12e6b59e7e56fbe3c7d7f581a44d3cd2cb91d6473b8fd0cbcdadc68f184feb2f7cf0fc2c868f03edef7369f85"; + sha512.doc = "7332370e43de4076fb6f595df6d24419e210c866e79630c3fde4cc50b8e7d7127232ee123443a2443b3f236bfa7721dd43e2dd78d81820f61a5fbe92245dc66c"; + sha512.source = "dffd9d9cb8bbbdef03c491d2ad6283d9b474ed4c5a7337a85aadce978ebb4ea35c161c11427d0fc09ecf61b9e5f10dd7e3c69b1e00d2f63ec2c27b2ba8bd7c87"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "1.4"; +}; +ektype-tanka = { + revision = 63255; + shortdesc = "Devanagari fonts by EkType"; + stripPrefix = 0; + sha512.run = "7bef493207c3de9580b8daf3af8cde6e5ae616cc94334b3d8b3de8c117262c0002ae73740df4fbf3f30df913cfcd7c5c51d8c9659c83d6ec060bd54ae3c96368"; + sha512.doc = "ebb43cd9951d120bf664ab177c70ab2f912e9ff0080cd42fdf1ba695ae13f766d75cafe77794fe69b626895b89956801a527a7ebdb2f87fb48d263f2c3e6ecca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +elbioimp = { + revision = 21758; + shortdesc = "A LaTeX document class for the Journal of Electrical Bioimpedance"; + stripPrefix = 0; + sha512.run = "4db2b191fdb73854bfe605efed30c4835a77180fc865eaf201f8405fccaf880e02ac9ef7802c2d215df8ad77d01fff611114c391a6c43190f95dc2b40cabd596"; + sha512.doc = "5097310e0e400c269a30ef8ea26f400ac7768f4a790ca5b79222c0480553434343de7b0976b18bb6d67bc89dc2b2ad2251c24e94e4747450275fd52a8c9d3285"; + sha512.source = "00fb96c43b0639f88b582bb26b6306d1ff112e9277c34f6a623d7643ac7a003b31a14b5a82b3b03680298e5c054c137f44a186804a90127ebba14442d5c71d6b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +electrum = { + revision = 19705; + shortdesc = "Electrum ADF fonts collection"; + stripPrefix = 0; + fontMaps = [ + "Map yes.map" + ]; + sha512.run = "c12af3a1e6a76d4a94f0d02fa5802179fd1f47e31be29e2151e7be3f569f027137c9d0268c86696d822b8d7a4c88ae2ef264341345c6a7421a8ec1026c104213"; + sha512.doc = "b840b153a134fd9cd923aa9f70576b7e586bca87d7f1b9cfbf7a1f25ac4972905989876545a914ce845096dd32579901ece93851012d057114c0c61b1eceffa4"; + sha512.source = "caec0c43c2870a6640863bc060e02c764b235336123777181ae1fab42e32053af0e2c09c226dccbf8bc31b450c720b69ae67f01b66b36d0ba308282637afb414"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.005-b"; +}; +eledform = { + revision = 38114; + shortdesc = "Define textual variants"; + stripPrefix = 0; + sha512.run = "4103aa370bc8314433b5cc9242390340467591bc38e2f5b820f9d35a1951bb9fe9e384b1d3c64a0434b3c3dc87c42463a0af5d9ff872180bc2b7a08d4b40c080"; + sha512.doc = "c59cfa6957a21c5e74d9a15b7621536170137447111f9a88295e79aa7a29dcbb3d1f1f1367afd7243d2506b864a53df41b0e10419592a5e4e12af8e1e90216d4"; + sha512.source = "3bf4fe6df4cb16c8ab7a3fc366754321c5a1056cbdd51a787da33d212c39ffa0bc73d394944b7b2cfe52b4f41abe0e3df7156571d3acc1d1c3ccd4d467798430"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +eledmac = { + revision = 45418; + shortdesc = "Typeset scholarly editions"; + stripPrefix = 0; + sha512.run = "644df002adf2f39acd9a6704a5c2e18e02f30d17c8e04173fb0f68e9daf5469bb6290c7e98ca181ebd45b40d54dbdf4a14fbbbe7dbe8f945b226ee086efc3972"; + sha512.doc = "14c8b024b6cc817a025b6a4870d3edcf956ac9e358107c80d29fcab41f343efba5b5832dc22cd11fe2e92bc74b58fc5d67982ab26a60230a5b92af4223543e04"; + sha512.source = "8d3436d3e3cf377148a52ea77ac93491abc66bfb1271538aa85f6cebc559ca225221b4b7dfaaf33426505b792ca57697d6edf5903b5d0e306434a4c32e06e8bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.24.12"; +}; +elements = { + revision = 61792; + shortdesc = "Provides properties of chemical elements"; + stripPrefix = 0; + sha512.run = "576b318c0972e8862b8d4cb9c248a3303125019a321b2f5efcc0b6d6c7dbc5cee4a1db725af49754360633d654447d83a58dfc7e25c13e91e034e73ccd5765cc"; + sha512.doc = "6adb7fd993275022e49bda34889a21ce000ff7c247d6c3747494bd67adbfc1776f4c2e8d9affd57dbe659740cd9a5646bd34ab87975d306e8568a27899555e9e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +ellipse = { + revision = 39025; + shortdesc = "Draw ellipses and elliptical arcs using the standard LaTeX2e picture environment"; + stripPrefix = 0; + sha512.run = "edcbca8843239eae7bd927d9bc6b5095d1b9a4d8db213e22c77ab4a7c5bf7a09781aa225af26f1e4127f263d5322c8138cf38ad1a7b19688468ba2ba56f840f9"; + sha512.doc = "722d50daf9863145c81ad2b97d6acf6b6229d65f868985878651b506b00f52c4a556b888ed848ac1194c4a68e793bc498b2b6b09132c8070b61b103e6ca9137a"; + sha512.source = "29736aeb1a6d64d0e94124e6c67246650f517fefc9761f58e70e1438c8380a25ce48d2deb180683da02f77ebb508302b3e446b534b7e56ba257e61ac6f5fd62f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ellipsis = { + revision = 55418; + shortdesc = "Fix uneven spacing around ellipses in LaTeX text mode"; + stripPrefix = 0; + sha512.run = "009bc55dac8eab88e27124317acbf9f3101959cefa4419b507ab74f49453f72f272db2b4826424f3d8c76efb50163c11d6eed63e1219cae2a2632bb629fba96a"; + sha512.doc = "7d0b4c51008203729df1bd50d2c2a2568f2426b7284f0d58eae4720a032e4ab469a5db6cf5656e57ceb0cc9062a7bfe1f3cfe20c51a3d08c85d55c110ce7ddcb"; + sha512.source = "65b536bdd6d5b429e2f1832b3d466bfe055be6074b43b60305b79ae9ea09172e3e7e82bf7cf3b4dfbf73507135ec4caa3d713c5cfe060fbc925ba7d2a8c09dea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +elmath = { + revision = 15878; + shortdesc = "Mathematics in Greek texts"; + stripPrefix = 0; + sha512.run = "66e11b5d5166fc6399337183dea142ecd045050176384e71993c76aeacf57c693495b5153887a95051a902167a8444c24ba6fe2ab2fcfc699abfd41ffaa96b18"; + sha512.doc = "3454096f8ddd220820709a83f4b5b741e80213bada631f5fd78292ff77f3a1963a487b07bb6c227451568c594c5bcaec9c1fe9724345a35478a68191305d5a97"; + sha512.source = "0ff2b6fd17db3dbae757d4e015007ac99628f0d1940e584643f9df2247279cbfe3ebb81e057884a38ab167aa18b60a8db5eb7b88e777653ec68675205ca0fcc6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +elocalloc = { + revision = 42712; + shortdesc = "Local allocation macros for LaTeX 2015"; + stripPrefix = 0; + sha512.run = "7bd72984c7bc1530e2659364b5e93b643db1accc8a034f6fe8333e26ecc12b8dca9cf40ada0b5986576e266e0eb7c801f9a3e4c2cb7dbe4d8c373ba0f0486ba9"; + sha512.doc = "6b2d6f65683912405cc97b81a7cef07b4eb21be4304a12b5e0e11087d809d32023ea8067a81c01d45851943af2efc4eb4018f3a0e7a39e08bdc821f87264d9cc"; + sha512.source = "c1dfe4848af6e1cdb57496b8f42f5f1744494857648ca1db92a770f9983d0ec7a4c3398a3a7b7d473204da475ffd0e33ea10606201edcd86f9cda3bf5bdf24f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +elpres = { + revision = 60209; + shortdesc = "A simple class for electronic presentations"; + stripPrefix = 0; + sha512.run = "6470db4f68936b14fe514828455d7fd96ff9393990982b805e5ba08e2281aa0a98c46551297dde6243e4ee3c5894d87d6fc48fe843177f9dafae102afab4aeb9"; + sha512.doc = "0c3a7e151414e8ecc2ddcfedf55571db3d09e3a3cdf58d42b3cfefc82e160ac2487b6001d6da152b7a7f192a21c2e54b1593c01c7376c359a342f7e5410d16eb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +els-cas-templates = { + revision = 62931; + shortdesc = "Elsevier updated LaTeX templates"; + stripPrefix = 0; + sha512.run = "ecb340e796a94aab2e26abeb7d4d72ba5d68adcb15a0d99d3511236b8be5f8ab21d8d32995b1dcf1b0a3ea15eb321df75bbc016c52630b06498b75e9e5f164f8"; + sha512.doc = "b616f6a170484f75dea1134f0570133b63ba40fd1bd474e13ae3e46249224b8ee7a777d0d18e11e828d0e5e59c2635acfecea99537060a7cea03fc2761dca892"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.3"; +}; +elsarticle = { + revision = 56999; + shortdesc = "Class for articles for submission to Elsevier journals"; + stripPrefix = 0; + sha512.run = "5a0a7c98a8e255e55468f9b01a43c33d757a38faa1b3130b1c3613648dfcbd0fbedfc69db99727c4406ddc0601249b2d021c680f83edd34bc3d64dcd4a7af64a"; + sha512.doc = "47fe52924e95cb8267d0f65ee6962fd56fdc4ce00ccdf49533ff7af0916a962bd8c045b31f2159d7c70d8a041f7c20aafc73b23a8982572d456223afbb85e718"; + sha512.source = "5887604f9a6ed0077bbbb2498f6ba7c1a3c8a74485688d40a6fb0e9e9765035d22e928b104876a19e42775fb766502ef71446e659f6d75a519e2b84ffdd2a01c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "3.3"; +}; +elteiktdk = { + revision = 66821; + shortdesc = "TDK-thesis template for Hungarian TDK conferences, Section of Computer Science"; + stripPrefix = 0; + sha512.run = "01ad0912bd93cb849013665046de7ec3773d90860b92c98201a7b075799cf6adcaad6f820abe95520e848f088c85b71afa78e49067da8a1abdea093de4476935"; + sha512.doc = "5d0fef08a196fd796fcd3ea74f5385b83b361c8e7f1bc2bb4a5f663a5d5a86820b7bea137790a973152e5f475008423ddc55f18613da3bc48be211bb79e3dc9a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.0"; +}; +elteikthesis = { + revision = 66820; + shortdesc = "Thesis template for Eotvos Lorand University (Informatics)"; + stripPrefix = 0; + sha512.run = "e533636f732fead1525c3264f96f69e19074728955772c92c381dedc42e0ed5b14bbdccfe5f9663a8a54a530f52d0c8e2fea556778751214cd626372004872cf"; + sha512.doc = "a3f8102e22a12d0a970e881d3937cde9a4f71550132067ef844fd72e35c6210dd6feef56d236837a2183fa5d749287dc3c4db4cad00dd4c09cbe47fd431a7571"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.3.1"; +}; +eltex = { + revision = 15878; + shortdesc = "Simple circuit diagrams in LaTeX picture mode"; + stripPrefix = 0; + sha512.run = "6de1507df2fe408081aad0f75b69d7c21807f238d37e3c6d9cd243b741ae1761aced90e948a0c570f28db5a39616954412fc77a87482c890183f039923915c05"; + sha512.doc = "1bdd0f64c524def46dd0a20482b9ad6925b0d06ea272b05d6163a23f61ad1727b099a893f5af7a7de4140bd264b1d3503794a4c9c11cf8137c5c6070d08fe0e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +elvish = { + revision = 15878; + shortdesc = "Fonts for typesetting Tolkien Elvish scripts"; + stripPrefix = 0; + sha512.run = "ca1496b488a85a32364b264706c9b4e4edde5c92681493b150942a3a8a2a32158b314a163ff4be8afbea489a75feb5dbb1c96e8e70f730530cce6472f9e46912"; + sha512.doc = "e296ece5bb11d273b33e801ecddb1b9bb93e5f8cfc4a7d62b1555ddca89661557149935b7c5a71880efb888364989715b4e39585b2de1bcd8ecc24203afef199"; + hasRunfiles = true; + license = [ "free" ]; +}; +elzcards = { + revision = 51894; + shortdesc = "Typeset business cards, index cards and flash cards easily"; + stripPrefix = 0; + sha512.run = "436449b4e8d6368fee200dd810b05db570d27846a56a5159422e7af74348f08e6f2f4c45cdc1aaf21d31cf0ac6e8552cc7f0968c2178ad4e65163294d771e027"; + sha512.doc = "c24119acc3aebfc676641b17a0db75edc30dab7eb3aa766e35291463ee6049c9570ebe05d456e0bc0fff3765bee514332cde7b80e7d1479ed440c621143b7457"; + sha512.source = "59f09337eeafa9b2ec6ff7bbfcd1d04535fe7d3defb942f858ef57a8007422358a68a72894ed120c3792da7c0f397d1a50dc093cc1dd2058d598649ab905d354"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.60"; +}; +emarks = { + revision = 24504; + shortdesc = "Named mark registers with e-TeX"; + stripPrefix = 0; + sha512.run = "8e5f2d559958083abbde5efe9e70b3cb3dc71cdddd3066ac305c310fd5a8b2652bc6b5ce66531963c5a5f9426ccfed7eee0700938ed6a515865ac8e1718de5aa"; + sha512.doc = "4deafa2295612c7428b82a4c8c2c19811f91c2d456b430b6ab59014b3cdb42a86a84e67319745dea469ae40f89b36d104d30db28228c825ba0d86436a37cc7df"; + sha512.source = "d7ded6022917a50689905c953808e9f4a43d03811bda490721480f823c4ffd36d15948e5693d73cb061a97f775e6590cd376ec20e0093af3af5b792d7d67e2c5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +embedall = { + revision = 51177; + shortdesc = "Embed source files into the generated PDF"; + stripPrefix = 0; + sha512.run = "c531feeb7557cfca45127d9c37c93bf5835e35efa7c8aab65d58594c30d6864deaa22b64ba90cebcb1e9dcb139b00ad64ff96238835b8e059169278fb602ff2a"; + sha512.doc = "be228eb577bb2a59b93c7684bc1fd47e9a4a505f6c66eabf434ad29523f978c877608fe76cd6ee24c8942889710270b8f304170f445e2a1408303d7c5a8a52b7"; + sha512.source = "f1d3527809502aafa0a0b9aafd02d25fdbb97ab795cf4306a4ac84dccb873111e580390eb0499dfe13ef3f0bd7ea1a61e90220688dc814de7ff21ab4ccdbb1c2"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.0"; +}; +embedfile = { + revision = 65528; + shortdesc = "Embed files into PDF"; + stripPrefix = 0; + sha512.run = "5fe36b7666c58f676b48fde16ca5f07296dfd2f6d28cb8861ae3d341020552a509dd79695afa73fe20c6a5e6e87d3557f89f66902e8f02f39665efd9fac8120f"; + sha512.doc = "bb2e63963298b2c3a35c71b83eecd6464c7e4841e1098177ee78e56d15e072a88e6c58964e9292d70d495cce513b46d7b542d30574a41f4d0643df1f3b6842fd"; + sha512.source = "6a8c7c8ccdaa01f7e36ba6fad9e1d1f3873e77523d4c8b6b1de222292515016ee9aba5df53846d1367e2d5be90f7c912eb4828c4145575e38cb940db65e62e9e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.12"; +}; +embrac = { + revision = 57814; + shortdesc = "Upright brackets in emphasised text"; + stripPrefix = 0; + sha512.run = "930b42ef834a50dab0889598e1cdc531a610c9a5a8cffa31f7bea5f3c55d947db59453f71e061c8d055da53fb50fe20c17341e47c2fe5bb35a604ceac71922d9"; + sha512.doc = "f56db972f586aab767cf7300a3fa34a62564a67ede77ab8f8b6fa03ecf07680692eb0023cd3ed99656235c5afe80b672a4b3e50ec8f0ef95c9744a48ee99c399"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9a"; +}; +emf = { + revision = 42023; + shortdesc = "Support for the EMF symbol"; + stripPrefix = 0; + sha512.run = "bc1b601aa523b30a54493ac92e15bcdb918775e9f57514b62357b85b5919fb05cc945b3120cea474fab714585fe2a81603f43eae51bb266e8989af6105ebc65c"; + sha512.doc = "f2e37967476ed678dce7c01f195ec03f77327d59beb2b15cc6a64ef92cc377700a2b7b528ae6c42497cde0ac127cd10c51e3ecf5fda0cf7954d598a0dc92b5df"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1"; +}; +emisa = { + revision = 60068; + shortdesc = "A LaTeX package for preparing manuscripts for the journal EMISA"; + stripPrefix = 0; + sha512.run = "dbe700eed5cb82ed687a5650fb58f07cd588d7a759ef67f0b015a795a732ec1b2d3019f637ecfe39fa240c93816c41084c5448d107371d209d40ce122fbda821"; + sha512.doc = "48529f12758cc7874b45ff5fd418641b322ac33541aee2665ee309a6b0bee8362c97fc2e31870fb34430d60343cae433f5a2793dc785c5a88d4f2e5518317433"; + sha512.source = "98437def2e985e2186bdee4f1ba1200807c1c1dc9882b41e60acf620907933417c774dc217c67e86a667fa84ca66ddb07f9132c7e3e8a105638097bc66b7d940"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.0"; +}; +emo = { + revision = 66944; + shortdesc = "Emoji for all (LaTeX engines)"; + stripPrefix = 0; + sha512.run = "633c92dde16b5170d5ea27fbb5e72e865300abf27054cd167652ebe598b90a8788d129c950e5a230f75201648b25aaacfb6b47aa44e994d05549c31a82600da5"; + sha512.doc = "e60b38c75c23bb4ec5d453d76fd2c815abe712d1c602eac6897eb1ec9b51f1d6a964fd5aae5c7ecf17956eb9d39104708e887b0efab0830b72b9ad37c8c79af2"; + sha512.source = "79cdc96d441c82b4f59b6f2bec0fb82b047d1b9540b0f29946c2d41f355118e3a9cdad2da2463ea4c9a0e26ca832a98db5b88f4445baf6ac41abff8b443ad1d5"; + hasRunfiles = true; + license = [ "lppl13c" "asl20" "free" "ofl" ]; + version = "0.4"; +}; +emoji = { + revision = 59961; + shortdesc = "Emoji support in (Lua)LaTeX"; + stripPrefix = 0; + sha512.run = "5c87970b1d47489027ef1a13bd35958b54c7c8b7bb59f7a97a5293d2156e3acfbef13c3a83b5eac3ce8297aa01b25423add40d3d0e654b5e0007f34556449e5a"; + sha512.doc = "170a8e35c4f4c86751db4d357df39dbc215126465e784829cbd15e9226d04b92aca0d7836312c114d1c699daa5054883f364377d1f355f97024b63741aeede0a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.2"; +}; +emojicite = { + revision = 55131; + shortdesc = "Add emojis to citations"; + stripPrefix = 0; + sha512.run = "351fd8292800ce22d821351a6f69afadc87a24e4077dafd7a83b5f70b3f700c44764f2434255fde29532007faf952cb39d97f642a0b91c1cecc3b58d85753ab5"; + sha512.doc = "642c3656e3f6e89deab561df4253bcac0f98f1b65537ba3c78079ebc4d3a9336ce40fe8abb1955583e404b3945d76fcbca19845dbde7bd7c8f4db0a6209d80bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +emotion = { + revision = 69881; + shortdesc = "Make emojis more easy to use in XeLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "17516f0c2ffee5a1045fbb11b4f49f09b3cb14ae0dd223c8427a107a625b7910ffc4085ec3937a28a4cdc58614ae41512ed1059edb0835007b8b19d6ca1526e0"; + sha512.doc = "5cf42cff3b1730fa8fe9bf5268018a2ec7d39fa599528794eb01d5906f2dc6a85be5508651d5828c014b06fa4b1efd24821fd68a6d454649b1a8d0b1aec669e5"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "0.2"; +}; +emp = { + revision = 23483; + shortdesc = "\"Encapsulate\" MetaPost figures in a document"; + stripPrefix = 0; + sha512.run = "5028360a2b412232b06b0bc53352c7a0a379943c14781b49b45cb75aef044df5bda24449dbf13601d1a574e5349bd0f2d2f7b7969f10bf72b3aeebe9e81b6ecb"; + sha512.doc = "480edb224fcb42457c6252d4b6fd8cf42796e9b2ac72aa8d4bb22b3840cb10a55a509a47b8c504efbdba3e28192acee367e99638dfdbf9cab4fc5628496cd5db"; + sha512.source = "e80aeb8566f31c3582423abc2794cd468b2a7b3505d4d01cbcf261201e4e8a95ca6ed87c6deffa03c9f868762fbe8b2078bf8327172ee9a172605fa0e6e72c40"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +emptypage = { + revision = 18064; + shortdesc = "Make empty pages really empty"; + stripPrefix = 0; + sha512.run = "6379cbd0983ca7b58d2c94ce02a76e054faab1afb2942227469dcf2c4d572d9946921b6d24e9c7d2b5a82cc45e7e380a8ffae671f165ad0e2a3a611b95841352"; + sha512.doc = "11681a155df95f913c3d25cceb32b54ace35bfa5aa7541916c15473b951b02a7417380dfa5c30f5dc3de1259d6cad99859c31bad4c2f2056ffb4608c614a2e14"; + sha512.source = "1bdfdd32ed844651a109b54c65e7297222cb065a122269bd5c10cf77c6ae0e38b717fe182dad6bd0432b5eafb38b3d8631218599a46bb61a598eef4093a8ce1c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2"; +}; +emulateapj = { + revision = 28469; + shortdesc = "Produce output similar to that of APJ"; + stripPrefix = 0; + sha512.run = "12b73ef4234af72358c1f120d860b7ba823bb4d65f91cba348a4a136b57f8edccf3849eb36e95c50cc40445a5fe3908652c221b938ee34a17aed6b4cb265744e"; + sha512.doc = "2d226b60313de3387d87c373a23e490a66c2fe1a94e97ef2364e65fafb037a148db7f5162ab9d3f1d788a037fdebe02ddedaa772eb715dc1ec8fea941b0e6708"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +enctex = { + revision = 34957; + shortdesc = "A TeX extension that translates input on its way into TeX"; + stripPrefix = 0; + sha512.run = "e6dc0988bd10dcefd63db2a57999637b63187d8a234c46dcb148e9dfe8388800e61237d7b58d271b735d2658d40c1f81016b5018e239d556fb9615d35b4129a0"; + sha512.doc = "2bf47c879c6ed0fc539763c899d8db261135f1a0ef0052904d03a72663cff38d40d2fe7b0daacaf2d54771c7b9eb5e98b73ef71d2a733899d458803f8caee723"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +encxvlna = { + revision = 34087; + shortdesc = "Insert nonbreakable spaces, using encTeX"; + stripPrefix = 0; + sha512.run = "f6aa0a954affda9152f5b15958ea453e3c2979205f25a5d9f15e3fb189b2352a87256a345d382a3c7dc401eeb55360afa9cf942cc4779406b97cc8f8c47eba81"; + sha512.doc = "01f44c8205daf33006eaa73061d27c9e17ce5b456e73f427f797023cf94d7380e44180c347021cc5c17870550fc7e626bab8de6219d6b56000526aa54ba34efe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +endfloat = { + revision = 57090; + shortdesc = "Move floats to the end, leaving markers where they belong"; + stripPrefix = 0; + sha512.run = "9c3820ddd36934dcfd049ab766ed037119459d02e9c049401b910b1c14ae2aed93d94110db66f0cdd2149451e152b5bcac14866c7844ba4a47f8c0a27756f733"; + sha512.doc = "0004d60fe959415670b5173bbab6d37733ed82b537d714c7357dae85ff8f7204e316c48d2651b1b53cc9b6ad0206a47c9cde1acdeb6aae676a25e50f363238c2"; + sha512.source = "bc5150716b23d3aa1e3a66e29fca3e8f9703199feb05b4bf76834e79654c39b0f6790ef1f0c193abeb0acfd0b2717076d4e2c89069221e1bc45716e0de314e85"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.7"; +}; +endheads = { + revision = 43750; + shortdesc = "Running headers of the form \"Notes to pp.xx-yy\""; + stripPrefix = 0; + sha512.run = "55f01774d62616b81fc846af275067445c8979d50cbb67c8f6cdc362a26999c83c9ce5428af28170ab9e4c6262fc4ed8bd0431c5aee8aafa89e38bf4cdc30989"; + sha512.doc = "bbed9408161f827ebe39ae2161e89f1f15d8327f29f7eb18bf58f3cac7c58492529caf05ebe3111891520c406c547b2f1aa57d2927c5f857ea6e02ecfa9cf84b"; + sha512.source = "c58d68a17da865391ce4480dc02f3375ee6d311a2590f8505885c3ce7fed65b2e7d6c6dd5838f55f4fe3d7192b56217b7146646269938a3a10cdefd3c55bd0c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +endiagram = { + revision = 34486; + shortdesc = "Easy creation of potential energy curve diagrams"; + stripPrefix = 0; + sha512.run = "50cda29c5f045e45e0421efe11128b11be1206b4ea3b183d401562a9c8afe214031c993f885bfca67f81e8b4827e024a0aeb1d95e5a8a03426f72f414cfd17fe"; + sha512.doc = "0807629080916e9ca7451fd1975da985ac786326914521c21155c337acbf48888620e3bac03b00fbbf45bbb47740faaa40d1db768a296e4a6b1cf6c6671357ca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1d"; +}; +endnotes = { + revision = 53319; + shortdesc = "Place footnotes at the end"; + stripPrefix = 0; + sha512.run = "3b4d5b55dd1ef844b96d30c7d40d5ea56ea3082a9e6740e3bffb837b864823a2c5545a13fa79eb49f79b47ee86aaa28e15c64f676bd27e4987aaaaca76bb2f31"; + sha512.doc = "e4de81d6cf0d7bc686d84420dff1e390ad18747ebc9381c6df006f871f9d5e000aae5cd43a3648dfdab2806da83efc6b375ceb4a9110137ed6b373538a7a8b57"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +endnotes-hy = { + revision = 54758; + shortdesc = "Patches the endnotes package to create hypertext links to the correct anchors"; + stripPrefix = 0; + sha512.run = "abd177ac968efce6749d8bb80c327bd8c3617e14045d124e036f2e503eed7bc33c72112d46acebe84d8a0a2f25cf3d99fd02a514d3673f38ada9e7fef879e3f5"; + sha512.doc = "46b7ea667c12de23f0491af714e5b86fb7fdbef0e3c03d7c31e242dc715745824be08028861c0e72244695aee8bcb0ce2191746c8d1f906523dcbe6b39958281"; + sha512.source = "6771356602da1fef77f350eb8390abcda0f1267c0761bf255f4aedeca79fadf1c0255bb267b456469c1d8dffb1ff052e567d0bb6b07035c1f5d676d5ae2d4cdc"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +endnotesj = { + revision = 47703; + shortdesc = "Japanese-style endnotes"; + stripPrefix = 0; + sha512.run = "acc3ecb055add319d5cbfc4e542c1be490c00187153990dd42d5b9a23adfd19795bebe4648129bc1cd8aa8cc243111602b287183803db8b5962b23b6c60487e3"; + sha512.doc = "71e52552f4a432b8743e448142fdc8e49b9e1ff1d290b6d20731c083f62bb5be823db76720fcfa40cbb8bf75968b80875926aea8a7f67808555fdec160de1911"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "3.0"; +}; +endofproofwd = { + revision = 55643; + shortdesc = "An \"end of proof\" sign"; + stripPrefix = 0; + sha512.run = "a4b62882d4111a916588298415546fd402abf15ad89177fc2f57b983ef4060b49c7f73677add54c683e0ac8d40b91280453f8a239bb9da5e262cca20d12562d7"; + sha512.doc = "5953acfac90a34bb2c57cd813d220279fb96fa74415f0d7677ed7b7a8839b858f64b3c96d1dfd2dce5a8704e76ffc7eda1e5aa337585f6715ae229a759148ec3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +engpron = { + revision = 16558; + shortdesc = "Helps to type the pronunciation of English words"; + stripPrefix = 0; + sha512.run = "e525f8d2ad25b93566c101edd29a70d49d9f65f591e15bf3457671aaf748da1afac5d483389eada870cefc9e144010e16c561d0561d97ecb3ae240e21b5c5b39"; + sha512.doc = "dfa3ba98bddd11db47f308c988735967d1ec92c688081bad0deba88c29bd01c976bd1180342b890489f3026c964520ec1fa399fdb52f484c24285e3540a12859"; + sha512.source = "b47f186eb08ee68b769d61954b705fb5e0575f9af90968569a1928a6b97bbe5bbbd8b65dbd2f946a40ebc7dc1fc676a03effd7cc51924356531ce18fcc3c8dee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2"; +}; +engrec = { + revision = 15878; + shortdesc = "Enumerate with lower- or uppercase Greek letters"; + stripPrefix = 0; + sha512.run = "3856199a11043eb42062122d99f11a64791113ebee137b588b69eab7ba79d721349c2268440a4b801b0e7bc293fc99011fb9a70a732a03a5656cc6302cbd0054"; + sha512.doc = "f5402766dee90ec0cd2aad59db562a7314805072d4247e5930e59f5aebda9c1b87c4b6935028ec960bca4eb27a1bb1c7ff31b2a671ae0338e1058e24323d4cec"; + sha512.source = "ff2e4447135db1164447ed8502f45e9dc647cc3b8c9329fe21d3a279b40c2da0923fa78be44ef52d4d9a4781945976714140bd2837268d0537cd6bd6c430501f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +engtlc = { + revision = 28571; + shortdesc = "Support for users in Telecommunications Engineering"; + stripPrefix = 0; + sha512.run = "c1ad2ed5337168c70bcfddd35c72b83b19a1596bc7d9c71298eb82ad8637c984253c79216606060753d1cc5ad4f961095eed8be2381b786b12202f5b0bc748f1"; + sha512.doc = "4c6cbcf337eca115a856eda24924588208ed9e7491936640c8875d49d649d6012279e4eadfa7cdb6544e08fa283c341754d896c921402a2b1180764e8a8ff233"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +enigma = { + revision = 29802; + shortdesc = "Encrypt documents with a three rotor Enigma"; + stripPrefix = 0; + sha512.run = "70cf80101d3fe9a75e750f5b3df4db79f30f5ef76ed65f4bfb40f36e5c8c5f0d22468396fe3a531508dd484ed5929cd14d4e22734a92814a4eae9ae2ec3e2b07"; + sha512.doc = "b0509d252a2dd7b61339ed084dcb8dd4c3ec0e63aa6fcb7fd81302b82bbd3ddb0b68d0460e5970798a12b2b66e1f560b80c7bf36187553abf6531e0916ddb71a"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.1"; +}; +enotez = { + revision = 61490; + shortdesc = "Support for end-notes"; + stripPrefix = 0; + sha512.run = "0f292fbfa3ad395857bf04c50817376152765c1511bc1b922fb6612033a0924a416b83b38e15a36ee792ec5ba351614e93cf6b70c6b2eb8cf78ca74cce6438ec"; + sha512.doc = "6a52564111cc5af280ecb578c916a340ae0f0a8e1848f6d19d97d4c8dae863af7c8c0ecd057f5eb54ee701fb1f3f0b101bb4b6fde2500af71867b5d38a29cc8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10d"; +}; +enumitem = { + revision = 51423; + shortdesc = "Control layout of itemize, enumerate, description"; + stripPrefix = 0; + sha512.run = "d49701368b0ce611f5cfb52ec06616edc27b2dedb99230983ffc59c4c1eadc265a8afd3c94f1e57920de875c4ec684fec007dceca59fd4f4008bb5572c13880c"; + sha512.doc = "b61f62bb0da61c7124f661739ebfaff6147d73899511d8b1a1d4b98b31bc596c3994acfd73c3c1922f5cc8a05c6a98572254067718be394c48976a10b2351503"; + hasRunfiles = true; + license = [ "mit" ]; + version = "3.9"; +}; +enumitem-zref = { + revision = 21472; + shortdesc = "Extended references to items for enumitem package"; + stripPrefix = 0; + sha512.run = "5cd16cd19d63d4825dd1f726ad7617bc892a0d80e41f559234b3f82950f589f044a9816005a089f6837805ab08f07b507e47c5d2d389728adaa5350a76d1c1ea"; + sha512.doc = "af4404c0f76f6f693d1fc0a82e0673c461a1acd6a0d7e9cbac10719790e54199deed1b87fae59db4826c2d1874ce59c7c2a1e5ae33286369a4f7e495223fe2e3"; + sha512.source = "7f5642d0d3f3779b0d66832f509265a17e66c6e3ab4a74e7fdeb0bf4af9c66257eb78a9bb3a1a7dc1747a07ace12607031f861a14664addcc9d707d3f8c5d5ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +envbig = { + revision = 15878; + shortdesc = "Printing addresses on envelopes"; + stripPrefix = 0; + sha512.run = "e39ce40decbb52360cfe465d8a5147f9eb5bfae8dd42b86a868a46f1d3c2544d14035d6c307e116c0d08e6ecb62ba5943de803ee9d40a0a8cdf94a88aec8f808"; + sha512.doc = "cd8c32d4694252449e78736be1697f9a8da01079a8aeafb774d92ded858de9ee7ae163b3758710df466dd0f75fb8b325e86e575457b66c8107f3c580fe0fc737"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +environ = { + revision = 56615; + shortdesc = "A new interface for environments in LaTeX"; + stripPrefix = 0; + deps = [ + "trimspaces" + ]; + sha512.run = "c8dec70e56651a89ae8da15abc0ad81cc2edb4487837469238e2adc0e7c58cae4c5da82b637a3336839b50103e3d846c5cee8c73141488f644469a0f3e9d363f"; + sha512.doc = "78d4d3f570470619c938687a6c9a6925aad901d781e3e893bd731a49bb8eca62bf1870e68d84f7125e10d91d7bec02a323ae42278ff59c04d7e33eefa2261496"; + sha512.source = "b30607d21bbf5ddf1c7d36bd9173a16d91bdfcfa004782be50e50f17bf54d94e943d5e524e2331b75f3ce65e81193ba98e69ab56c38959d632007f5b0a87bd6a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +envlab = { + revision = 61937; + shortdesc = "Addresses on envelopes or mailing labels"; + stripPrefix = 0; + sha512.run = "d4272cd079bc0b48835d675f1b36d0155d7da4cf920785dc7fdf608c311f43afb88e6861087c79774af6a434aacce05dda59f9e53aa7b2f3f37e06415eafa01e"; + sha512.doc = "dfc28fe6df6822fd8f45b3bd31a66e635cf621daadd5465408dfdca47a176e0f23e66501b5b89a8f803265c68a02db6a7ba1e05e0f9ba0f35287bc582d1f48a0"; + sha512.source = "39ba3371b9aeab277968d8847ba5fe519ea3035306fdcb2a6376b6fec881a3d443ae7f4912039216058fcf7918ddeace617ca08e85c6f21c70820e8d379805bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +eolang = { + revision = 69868; + shortdesc = "Formulas and graphs for the EO programming language"; + deps = [ + "amsfonts" + "amsmath" + "fancyvrb" + "iexec" + "pgf" + "pgfopts" + "stmaryrd" + ]; + sha512.run = "67a51c2a83fed799f07eaa226c21a50b38cf5109bfb06f7adae4933f2f9fd474bc8ac6e8528f1134273550a9834b4da6d42dd7d8274d6d76a80880b4cf221c4f"; + sha512.doc = "752cf6a65326027af32d69cd86e1d1c703cb8f506b686cbb2964593c505813b0785352399752802358e10d6fab1e55e09554b34b3b928f43afa3c5724c1eec88"; + hasManpages = true; + sha512.source = "dc0992ad4576ec3e4eafcbf0a4039ad3b15bc97e18dd0a9dadce418d9e2b9c29b24dbe3900142692c1248f898744bfbb6b4c59237c2df4d62fa454f535d0c6c8"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.18.1"; +}; +eolang.binfiles = [ + "eolang" +]; +epigrafica = { + revision = 17210; + shortdesc = "A Greek and Latin font"; + stripPrefix = 0; + fontMaps = [ + "Map epigrafica.map" + ]; + sha512.run = "82e5dd9f781b6c3ad0bef743b117d9658ae9e0162fec524fbb59f35f13008d3ce9b37daef8d6b977a5ec4834a1ecdc06346627857445c5f19c89f4b202706beb"; + sha512.doc = "c90061813a408ea74da7c0a9a53c1dc0f4ef65a9ec1d96e92002127ef401abb5211b7f029630fa445725497018a6e5ed3415e31c40001674405b13a4b4ebf6de"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.01"; +}; +epigram = { + revision = 20513; + shortdesc = "Display short quotations"; + stripPrefix = 0; + sha512.run = "8952dbb6f7c573028b1f9621cd9c947a264847e59e1ead9547d386d71c2c15ab5f9c26088568b023030645b02191c9b72d827a80706ca1570785876c6acac6f0"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +epigraph = { + revision = 54857; + shortdesc = "A package for typesetting epigraphs"; + stripPrefix = 0; + sha512.run = "bfcc661316dadf02c8bc1c4378b04c588ef612f030c764af3119e5c9eb42df667f7da9ad71b90fc2b5dbe7adf4094b05d792ca2fb2292c96035384ce65578293"; + sha512.doc = "d8d2ac763e6bdcbcc200fa21995ea5044b4adad11f147b3d7e9f212274c1678cbba7661cc93df8cd013470a5397ca257690d85b8fe55704800284805abac7c62"; + sha512.source = "566c5d132b17c806ee51d60122c9c89f7e1d3e6b6df1444bac715c5e77e2522513a2971f86c495b7fc654c684b07dc53982436aefa0544955e0bae30479b42b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5e"; +}; +epigraph-keys = { + revision = 61719; + shortdesc = "Epigraphs using key values"; + stripPrefix = 0; + sha512.run = "5e92bae46fec0037bb0a2b92c2b44de0c73ef4b434584a0bf13aa4e6f09e89e5e4b7fcc3e4809cd0f5e574d627285b8eb97f3971c65745e48591bd8e4a60f7fe"; + sha512.doc = "21c4e1f6b5c3a5b4402e3d3189b6b2424aa952e777994d330e4905393563030f9cd2dad9cc20c2157accc0e78fe98e7828781d5d63a7fb1c6f1ecd504c67f037"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +epiolmec = { + revision = 15878; + shortdesc = "Typesetting the Epi-Olmec Language"; + stripPrefix = 0; + fontMaps = [ + "Map epiolmec.map" + ]; + sha512.run = "5cbe40240b14ed494500c3831a02659be437ad9710708929a69670d00b788ffc99d4d35e66fba04f170c9844faf2432c116d75e6b01988736ab483e7d0255a8c"; + sha512.doc = "d2c54da2821e850f17ea0a21d0bc67385e2d986948503fbc23ce6df5229708f0700cdd30a94d09cb310cbd911c183c40935e944341b6ee7ec56cdd9c2602011e"; + sha512.source = "a52ef99c57524444151175f8e345cc59ae99c962e31420363c01e3121e1b4ecfbaeed28a01c3185d9d57beae90aaa8fe55dec15fd0790088f72fc4ee8860ea12"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +eplain = { + revision = 64721; + shortdesc = "Extended plain TeX macros"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dehyph" + "everyshi" + "firstaid" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "pdftex" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "eplain"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx *eplain.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "fda8158ae2bdc96187b6e6ace2a94be3e0f68201adbc02553b48a3848481352ac10ddd72babcbc2835e089ce751ade7dfa6cfd1c642c94155c2861db865f5c29"; + sha512.doc = "60902b2422d2f5d7570a19daf7f586df7882505d7c156539699a0aa47a0f3bde5688dcbdc92c8a6a9878f11392bc9b9f147626aad230eecd2740d56f104928ed"; + hasManpages = true; + hasInfo = true; + sha512.source = "015de2eeeaec99bd15882a190f9ef3f2112520f8c591c7e6d2351c52d8690b024750adea426bcf95f438aaa20c97dd321881ac7212ff181e148337b57f6d386c"; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "3.13"; +}; +eplain.binfiles = [ + "eplain" +]; +epsdice = { + revision = 15878; + shortdesc = "A scalable dice \"font\""; + stripPrefix = 0; + sha512.run = "acc0ceb408f320570a93a52132d3e37d43d4be65a31a038187edd6de9899427f08d7859dbc383b7b27e9d9b5a635ae94ea97f0be4ab8386b5991089a1435c350"; + sha512.doc = "6d9db45832d3e26e79a518f06d00db992ddfb2999099d32b415891e8d05b51803dc4f03d097cdcb04e5ccd6073606d4c7a87a07b9dd20d8d257456f927ee7427"; + sha512.source = "9bc8b64a815e9aa14b6ef09e9ea6328e338e9539ebefbe3df805d3fe05ba3aff61750fd98033be72ed7a7cb4c3d5aa6152b557c9a1dfb0272dec856968171d29"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +epsf = { + revision = 21461; + shortdesc = "Simple macros for EPS inclusion"; + stripPrefix = 0; + sha512.run = "4c3698edc9ef386b08a2ed7c360d926be6ca5a8284e3e53e0dcf5f222eeb27d4d33b4547b42dd2e5544ab381397aafcd58899376d26a4d9d47beee00ad1e9bda"; + sha512.doc = "52be704eec6159e70d99ae2a4823c1da0790f41da9e6de130c84cc77e0d8d29aae145ccb9b416ddc5c9641100821f5099b5c597a350438652381be903e7681bb"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.7.4"; +}; +epsf-dvipdfmx = { + revision = 35575; + shortdesc = "Plain TeX file for using epsf.tex with (x)dvipdfmx"; + stripPrefix = 0; + sha512.run = "0f210b940d55bc2e85b3c86318be82fde1bf2b6fa2e5d498101036a01cec3b09cd8081079476f128f21881b14a13c7fa248c758a7a33ab0770f261505260992d"; + sha512.doc = "e7b770f6880bfa8001851cfdcf2f2d03117fba3a2d38514bd7e23683aae08d57774bd1bfa4d0f75df443d9111a5472ba96bf8129e45b618b39f1798b27fb533c"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2014"; +}; +epsincl = { + revision = 29349; + shortdesc = "Include EPS in MetaPost figures"; + stripPrefix = 0; + sha512.run = "f9251142a990038acde2f1e7b61b94eba39b2c4f5c43a1151af29a17d5f0efb0cddc0af1ac8d056d8617b5ab4eef29bba14a4731ef933480a9bdb95fcc15d023"; + sha512.doc = "2cac5738a39157563707879656b473e7ac7edac2f304c209c8164c7878b10f0d5dcba1d38232ed6ba8e20fe21b3a0cf78dfd51733b993ccd5fcb2c0a05ea31c6"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.2"; +}; +epslatex-fr = { + revision = 19440; + shortdesc = "French version of \"graphics in LaTeX\""; + stripPrefix = 0; + sha512.run = "f3e90ecb487259301c20ab4c4c28702b9cadfa844a49361fee0881a26f827ae602f954e4a3e824e910d2e098097c387aa5311c5f32cb58df5a0a1e2fcd9d2364"; + sha512.doc = "7965e6094535d22b04193619842bc0bd090c2b47139e65498dcdf428f4ce2ec54e7da5edbdf9015c9d8f2013642d11347373e625a3884c629d9d807af2a9880a"; + license = [ "gpl1Only" ]; +}; +epspdf = { + revision = 66115; + shortdesc = "Converter for PostScript, EPS and PDF"; + sha512.run = "3dc467713b1d90b96a8fd3903effe209fe15be82463a1ef4693e29e7d145220936bed0e75dd3824a1e520f778ab9b96fe29389037e14690352db136e642f6a2c"; + sha512.doc = "ee5687a3add6773e127a1e83c91683b5c6ea5e37dd98ec5f5558a32015d292c31f1a456c985ee5d2e4201c0a47324dbac4a7129529236438676f587985bca64a"; + hasInfo = true; + hasRunfiles = true; + scriptExts = [ + "tcl" + "tlu" + ]; + license = [ "gpl2Only" ]; + version = "0.6.5.1"; +}; +epspdf.binfiles = [ + "epspdf" + "epspdftk" +]; +epspdfconversion = { + revision = 18703; + shortdesc = "On-the-fly conversion of EPS to PDF"; + stripPrefix = 0; + sha512.run = "a1f328125f82f33bcc881adacec981f4ce8aefd4cbbe160de66397ed3b1d4c2ed980f5e1c17c63b75973e3c253d76afc2f1227272ab7f0236e47e8e48f0f015c"; + sha512.doc = "dc09e2ef835a85bbfc7c399b7c7323d64c312b04143e8070fc403fbd484bd893be1e4b532580efea93baffe64625c33004405eb0ed9bf6295646cfc260d72c40"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.61"; +}; +epstopdf = { + revision = 68301; + shortdesc = "Convert EPS to PDF using Ghostscript"; + sha512.run = "fcba30848cb2a5bfb12cf89e1ee6d54bb89e7516789738e1fc7d9b1d47c403ff6ef1d679c9fed214669e8d06fc5e76eec2af0ef513d2649cd1d44b535287455b"; + sha512.doc = "9d9068ce64a2e14ad72de11c6a608bf9379240c0fab77a7bd29fbf2774515c5eff12b375a592d3ad6c8accb06021309768c3965284d18b89fb0a57487e2dba06"; + hasManpages = true; + hasRunfiles = true; + license = [ "free" ]; + version = "2.33"; +}; +epstopdf-pkg = { + revision = 53546; + shortdesc = "Call epstopdf \"on the fly\""; + stripPrefix = 0; + sha512.run = "3e2177a1c6cbf8850026f981ce3ec5e6a24c4fdf8c40716e3f18ba7233cc7a5115e5b74d60aa077575f41bafc58af966ab55c189de4d06863ab2a38551ff0dca"; + sha512.doc = "c098251d55112c0c630e007c85d1c7271e32bba9443ca3c2590b51987053e945e3c52030ef4bd1f6758894cc263e9316bc31683572bd07c24fd0855f01c68be4"; + sha512.source = "0816a754b15e42d6f43ef333c6f508988c861c04f7f6f53a370777ca85633a981948c10a13f3180797c1f5af1ed156b60a29c608d7387a53756f2e440f38bd99"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.11"; +}; +epstopdf.binfiles = [ + "epstopdf" + "repstopdf" +]; +eq-pin2corr = { + revision = 59477; + shortdesc = "Add PIN security to the \"Correct\" button of a quiz created by exerquiz"; + stripPrefix = 0; + sha512.run = "631f8dc9f50f7a45a0d03f0c4210af427cf8492d56886cedeff6cb0e9587453976beb1ac960afb53b7a31538a176bb63f55afd330ca2463847f86e57c3d545c3"; + sha512.doc = "4e704295ff398a2e167293178d69edc4882e9b9f37dae4f9debda7edd921a7c2d19c036b4d1424405ac1b9853e57615d9183fbf56a763088dc58919842da2720"; + sha512.source = "eb40f073d1763c59f9a0ed0444930f6698fbde754e213a73bff251df7f83b2c5a730345104d3b947ee8400363d324f968e3ebb7b74ed6f484d0c3589d5134b37"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +eqell = { + revision = 22931; + shortdesc = "Sympathetically spaced ellipsis after punctuation"; + stripPrefix = 0; + sha512.run = "b3544579e03c33b7a5a10f1fbcb22735d1bbcdb9fb5ac94330ec1eeb6f6ae646935a46f4c7c3bdb4305368b2e9aa9eba244c80f08f3127fad2080b610f1041a1"; + sha512.doc = "9210b85937d0bae3eab982f45b1f38f7020327c9b4cfc6604de5b171ecc84f54f5bfd088a3f06ba7123a7fc01a6fb09953015b1813db9ab2fbabf2a15bca955c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +eqexpl = { + revision = 63629; + shortdesc = "Align explanations for formulas"; + stripPrefix = 0; + sha512.run = "75f328b6b1e729b76b9be92ec7ad9844e5a41d8b6776700175af98ec217ef93df6dc56b92b49892090523e9308afa069ba3e6beaef8ca6712aa2fc3995417103"; + sha512.doc = "2ad0eb828e3ea2484220335d61102e0ccdf9787b0165d6f8ebab2073ad2407757c04165d5f872a4b3c674d2c27b952ce9ce1bdc09a626b8e4fe804a5ddc5b1ba"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.1.1"; +}; +eqlist = { + revision = 32257; + shortdesc = "Description lists with equal indentation"; + stripPrefix = 0; + sha512.run = "1af830f51ce25946ac8bc6a4cca323dffeff20389ec998b74afd49a8edab5ad7a453818d4799e55ca564153a87b85e2a6b03ed67e53cc5ae6fa74c45edf3aeae"; + sha512.doc = "a5b22b8e9300064d77d02ca6f5652659293c6fedb792be2f0664a2383b3167ed7bf8796af26edfabfdcab8d75ddf30f3815be36e8f38fda30f1609b56c16ac61"; + sha512.source = "15817915c95c5f609c3def3bce324e6ca362408aa862e7b3548a67225bc1c33bf8a5c8f924dcbb1951958beaccbf86071b4e866f0e7a4d55a09456412fe70223"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +eqnalign = { + revision = 43278; + shortdesc = "Make eqnarray behave like align"; + stripPrefix = 0; + sha512.run = "6793d24d272ff5f95b4e37fa3f4206e7358e0f5b51c51bcf4c61908e3fa554d8c8a53d888c7d7b1adde09f5d308c19944e93abccdb7846c88544abc90bbe4924"; + sha512.doc = "65847f34d7d1c76dd4d87ebd7e46aa1bb9e9a34ecf04cac6e58c18f9f4949d3e82325dac982f6d704fe6013e2acf718f0372873e547434c15a4a07c07ace27c9"; + sha512.source = "124449d3ce1f3b120f152c1eee49447f640f97d01f1d5a6f79ef72d1465cdd31de896049a5a7163e4e366ca9454b0f78723c4a94a24b8d83e2c4540d613bfaa3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +eqname = { + revision = 20678; + shortdesc = "Name tags for equations"; + stripPrefix = 0; + sha512.run = "1717aa83439019ba2c07ced56ca5dc969a68b78c9a711d97d0a168d432c6e26b53f30b2a3f6f8d241acf465fe8817d7e4fc4238982a68bf2ae143c5fdc2ca72e"; + hasRunfiles = true; + license = [ "free" ]; +}; +eqnarray = { + revision = 20641; + shortdesc = "More generalised equation arrays with numbering"; + stripPrefix = 0; + sha512.run = "f5abd20910152cf65d92c7e44930729c1052f72441f162de2f4ad869f0ff37b669066f43089a1369298e9ebdb536ed62d437b3f34be5b3e417d8b0bf34d9c870"; + sha512.doc = "7ea3d87f81eca28dd52f9e9cf4f7df1ce4f7b9cd82cc40d0a7fff234415b2a3e033fa1c8a11594b2c08e5edf87ae265e5f7a65eb92a79cd523568f37853de30a"; + sha512.source = "9dd02c43fca4f6e8dba0bd44292c8f97aef4cbf39d521b9df10206a2309e82492f344fb65c35ac0509532e9efb2571aecb2a5894e639de5efa1444bba9916587"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.3"; +}; +eqnnumwarn = { + revision = 45511; + shortdesc = "Modifies the amsmath equation environments to warn for a displaced equation number"; + stripPrefix = 0; + sha512.run = "ddfee700caa63f65fb4f53fe2469d1e6ef6338843738dd2c06989f23b6f4b40dd1dfe4b5979a04b34a9430d7cdd4d0f3ef14e3ce39613c8961fb0266e4ce6af3"; + sha512.doc = "e6dddee646be40e01c211854d3fa04855286e24a39b8217380e555eaacfad50fc66a57e89336d505c80a8df77ff7885922195423d11c2acefce583c9cb9fce81"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +eqparbox = { + revision = 45215; + shortdesc = "Create equal-widthed parboxes"; + stripPrefix = 0; + sha512.run = "b6e64a4d30840933614a42b16ffec215d1e01138c42805ed20bfab6ec03e232f87fcc2c20decb2e7e75234b7bd5fc2ebe5477808756ec92e6e724acb3482afca"; + sha512.doc = "1b0f7e6249e114bb6371d19f941cd2308f70ac4f1c831ce5a1c15551bbd65a4289b0b0e718580cc7df97bf4732ad3a76b3f22ea12f7caeaa2ea6362fabab2074"; + sha512.source = "2998b3fce2cce05512a41b4700905adb78d421302ed0275e7f263f891a0d8e9d5d8793ce2fb80cf1ca3e8f5f148e530a48c3c701f72729e6f4667382ad9247b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1"; +}; +erdc = { + revision = 15878; + shortdesc = "Style for Reports by US Army Corps of Engineers"; + stripPrefix = 0; + sha512.run = "56754f7ca1872837a362b1f5cc929fe5ed8bbd59a1a45eb2fe20b071f7c44362b0d98764c6d2870d275d0f0216a9543cc1e9f671f92de1b6b02136f9076f5f95"; + sha512.doc = "3e9d2dbfb3bd877c6bd105ca8cdff87cad9cf801797cea39e760ceaa1f27ed802795d728f9bd675c6553a88e22c03a035436abb19dacd38c774b94a0e2bd1567"; + sha512.source = "afe35b5120001d40259065ba25a9c5720f78fb1a679ed984727b89076bc265113e93184bc8ffbf998f069f85636f332ec5c93a40ba39aef4d4b7a3884da42446"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +erewhon = { + revision = 63312; + shortdesc = "Font package derived from Heuristica and Utopia"; + stripPrefix = 0; + fontMaps = [ + "Map erewhon.map" + ]; + sha512.run = "760818dc93dc0564680d76c152f6db9f69870008f50c43227b329df3403e7b6b50f241b96822fa63aee6b6c64ae42ecc69369e8e94f43836d6cbb9125f197e94"; + sha512.doc = "bf9219328f592300b90c3aa0ad425a4adf6e6cf2e190dc21cccb4b15ebe9db8f3dcb88c3e72b6f89f7b9085ecaf28f8ef628fa3175e7fb7d59545c61e2d76f42"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.12"; +}; +erewhon-math = { + revision = 70336; + shortdesc = "Utopia based OpenType Math font"; + stripPrefix = 0; + sha512.run = "f92ccc2cbb8edcdfcaa5d4c27192aeebe75cfbaa3d42077d3a1e87309b381798d8bd6836082e4302006e51d0a79e8676d0f831a790aa7436e0b992d4bdc78d8c"; + sha512.doc = "ccf0b4ee3b6914e26e485c8c292bf421da30a76a1e0dfc03f61a290186920f37163b0ff2ad1102b30049b58844f06c888d70d2f6e506ad7ddc2a0ed45ccdc711"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.66"; +}; +errata = { + revision = 42428; + shortdesc = "Error markup for LaTeX documents"; + stripPrefix = 0; + sha512.run = "ac3b99ef6e120a5b488cf79f3e942c10a47ee92e84a04d3667f99810ef365aac66598908c491897ef7a99df268a0bbc7185d49aed2313487712e300383356ec5"; + sha512.doc = "7fb625a66efc914e2eacc45696ac43112d7ca49b668ffbea179f47f04746509f981141a77d2948f30b8c56e4a2ff06f6af3047fe494e4f084237891fbbf6710f"; + sha512.source = "ecc57287f78000349f4999d1f85aeaba0206a898ff2d97a1fa9b4f94acffd76099cc0f92a88e5a38153f71570f62d9616e0332edeb987e468a6483de0dfab5ee"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "0.3"; +}; +erw-l3 = { + revision = 61799; + shortdesc = "Utilities based on LaTeX3"; + stripPrefix = 0; + sha512.run = "551a7c38657547038a8bcf5973ecaec81cccb4b803961145d4aedf7416834e3cfefe736a59e20c80cc1621d415216371d58f3d0c7d2b0fc3dc0a182e1ba91acd"; + sha512.doc = "8a0a823482fd19c80471e9c1a38312b5db7f04f618c8fd8381324c38bb9b9ebe8eb8fc9ce90137d4a4f1de7b6b65aa1c1820cfe0f009f4ad743613f53b549323"; + sha512.source = "babe7d5b286f4c20f469112efd76e4a37980bdb709ca9cd058263bf74a5d20b4b7c0aa3a4aba7fba512b5c63b538b6da1ae90f1903bd58ddeb36e2dfa4339e32"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.2"; +}; +es-tex-faq = { + revision = 15878; + shortdesc = "CervanTeX (Spanish TeX Group) FAQ"; + stripPrefix = 0; + sha512.run = "33f66e4f928591188289f07e003cac10229735e69ee7390020748e119930ea7b74ad69e5eea991d8e34325ac4d548ce0b843a00b3ca50b9e6fae3e96526a4ad8"; + sha512.doc = "5b5d0ebda1bde2c1c67fd4853a41bb10956487fa5ad2686d6814dbdd51f68dde2a3d294797b7b1602d587a44ea6acbd8260ab9965efab81d91eb9d9fdb93da69"; + license = [ "lppl13c" ]; + version = "1.97"; +}; +esami = { + revision = 67707; + shortdesc = "Typeset exams with scrambled questions and answers"; + stripPrefix = 0; + sha512.run = "e5e2656b1f1dcb224652ada214871004828ac04c2ad316250e4ce1ae54f509df5607248eadcb018308ad2eb14ea761224962b751c7998b935540b4de516d4e1c"; + sha512.doc = "7eda39cb0372f0f500b05196d526a215efddc58aadd1ee6c66504f73129936fbffc65d80183662de665b6fd54d4a9eeb5bdb2c7d5e11ff645c712ca6d712fc18"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.8"; +}; +esdiff = { + revision = 21385; + shortdesc = "Simplify typesetting of derivatives"; + stripPrefix = 0; + sha512.run = "84b2490e6ff743f0133deacc22c8e0368368e961d634239694ccf7b5cde7826996e080077baa0e0045230b6d2c3cad53ee055c05b17c89ca735dc2e40a01fb5a"; + sha512.doc = "97dbb512437c868f2b15ebd1271f51a7f196e40c70043c224617378e6c9333f19e2c18666f64fe6ea323c7aa5a58438944d8c6f5b1a9c0d36a239caee972eb08"; + sha512.source = "983f7f7cee22e442768ae56fac614d569eef18bff35c52c669d51079a61beca395c06e7fb9bcedde338bbaa1b3775094ce9b77fe7c043df2e1e25975410ab7d2"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.2"; +}; +esieecv = { + revision = 59638; + shortdesc = "Curriculum vitae for French use"; + stripPrefix = 0; + sha512.run = "c39e028de2f9cfb981baa2d36335863d6e3252a3bc3e1ef283905fed24daff609a85748dfbd34db0cbdcf7131f4db3aa6d66d0e714f0359b287cb14efb95f568"; + sha512.doc = "8bac60946fe2a4bd5c1ddd55dd314c59dc7fe45ce33a214021de68bbe03b610b8bf1d6ad426e855e10340953176285132017563c41f0326c273f2ca790be4acb"; + sha512.source = "73f00171770070e8d71396540fb8adeb79804b341c7906ac7ebaf67d8d9696a178b5458d6b4d7bbf2949c9d7e3a6d142bf682931763714c5d0ce0a77416bd28a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +esindex = { + revision = 52342; + shortdesc = "Typset index entries in Spanish documents"; + stripPrefix = 0; + sha512.run = "4e3fe4402e025dbbf300b509954600e3a1eca221a448d32ff2399aaf552ff930e6921bed6f0e1aadb20d6453848e235e42e8b809c4f4280d39c29937615e90f5"; + sha512.doc = "6db4b39371280b0f3a3e0be9e18337a75611410ad25e7953742247e750ca439c92c614edeffa03c4a7f39d8aea447037a6e25cb8f6f0d22a190f359c9cc35f8c"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.7"; +}; +esint = { + revision = 52240; + shortdesc = "Extended set of integrals for Computer Modern"; + stripPrefix = 0; + sha512.run = "d0eda90d6a890b7813648516f21e3a88213b1374df0c418895301354de402b9634492a1fd89193f34c6db6b9fcc0cdd0f8f46472e0e3a210234c7d8cab1bbed8"; + sha512.doc = "aeeaafe3746b8fd75ba80fc36b1610a3e4f7c7f26044ca82c2c8091139e0294275a1dde9dd73fb3e5b013ff04e4d0f26422e8c2a44a88beab167353e7686b3fe"; + sha512.source = "242e864b822f5deac76740d7a00edab9b6ff77e260b3e1adb6676dda009a8c200b9352e87998b76ac3047f0eacb9bd5ef87ac554c7c20ae649e91f1fcad889b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2d"; +}; +esint-type1 = { + revision = 15878; + shortdesc = "Font esint10 in Type 1 format"; + stripPrefix = 0; + deps = [ + "esint" + ]; + fontMaps = [ + "MixedMap esint.map" + ]; + sha512.run = "5a663d01e9241adf1961c922c588888561f495e6378fdd7aaa90954c3e51c5f0f8e6dc1e1947c9f03ce3472e1aab3dde1b35e6b5f0814f5e2cda564a31a45a1f"; + sha512.doc = "081a225225f503fac403d306fac3ee3b2747341ef5c4ee9420f49a56ca959c7757f154c24f90ed9506041b13464ea216e6edb52f29790d189ea7b33c7c797f8e"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +esk = { + revision = 18115; + shortdesc = "Package to encapsulate Sketch files in LaTeX sources"; + stripPrefix = 0; + sha512.run = "584d9b9abf202d93826c690545206c3b7276d6b3a4b717ed3671f9cbd2a1c6c6503d3352471fe60232e75d63632e021fb0ed34ce49d5a1e72ae58b08fbdd7211"; + sha512.doc = "acc40c8829e69c681d3bcfd5aa7223b3f5320c1ed5fa3f4a9a700f203b622f300b73912ef5df2c163d2cce1b40aecfdf1eb880dcba48e94783c14054981e0e11"; + sha512.source = "8f7123816c718d86eb1b362369dc10a745a003e8e79c54b8edb90813382528466a7e0fe3eb6b579372754d03888065b6f5c48a0682c6288905e93cebfb1b4a4b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +eskd = { + revision = 15878; + shortdesc = "Modern Russian typesetting"; + stripPrefix = 0; + sha512.run = "d0c1745172683bcacfb061f48bee10f78dbc849657295f5e7714cca949afd586c441f727e909c627b595ccdb50b81d813538e6837a00809ee884ffe1acd6b25e"; + sha512.doc = "01a0be9d02e7fece62cfd1bc8ceb26b2036f3d2e374794f3c4aacbfe004cf4059346510009760fe48fc0141c4e9f3cf1e40088203d31b7bbb31ec375cf5f70ea"; + sha512.source = "88b3edc0487b638142ba353ef108558b8fa6d420f2560a4fb1c189829af87d877a8900566c042556b15d654d11d2a0def58fa958fb9b234fca84419b2621cba4"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +eskdx = { + revision = 29235; + shortdesc = "Modern Russian typesetting"; + stripPrefix = 0; + sha512.run = "e5ef11cba6b0251844200093445f5183de60e0c0198da9c7000ef5c05a2a9a4303a15dc77ed03e9874e452ffdd283016cedb8901e78cd0312ea5bbcc529b74d5"; + sha512.doc = "748dec387a09546b28718e943e05772cd56c75a0066793332b343e7f604e607efd37a071c1f4f32fbd20d7427277bf2d598b355b8ea3a0a04943ccb90f4f249d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.98"; +}; +eso-pic = { + revision = 67001; + shortdesc = "Add picture commands (or backgrounds) to every page"; + stripPrefix = 0; + sha512.run = "ee2a5c75fb02f94feabff9107d8e183cb3ce2dc7d38f8c82b2748a67718286a824e839443a9cf00edc142148271c83ae08017f2d5b8e6bc01faf50455187e75e"; + sha512.doc = "ed03cbb8e57d28abbf3260c4a97c10833c89a603e219882920ed95fc2eab404c461a9c89b21772757a37245783c3ee10743f7ed248d4915d04a0619508469095"; + sha512.source = "988e2f00cec99ab76b95bbb1a64a47bd11a3bc258bf04fb26db8825f381922d6d4db5f4059e09d9969c6a00926a8f6b4b235be82027368812fce493f5f16854b"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "3.0c"; +}; +esrelation = { + revision = 37236; + shortdesc = "Provides a symbol set for describing relations between ordered pairs"; + stripPrefix = 0; + fontMaps = [ + "Map esrelation.map" + ]; + sha512.run = "a6d8a0a9bde08e3582826affa52142fe5b5a0dba43c4ff15f5fdd19cb24b561bcdcdd761c2a84238c9b31d3fe0a023949d2d0c716e105852443e06ced9df13f1"; + sha512.doc = "6698e9f57df458d9652ae98abbea08ce1f14c6c31677c32ab8cdf9b8fa0866a57c50028ea36d2c7cde133588358dce0b2bb37b7085995e4bab9ce7d3de1a541c"; + sha512.source = "17b0495b4b19ca5166835549c62c9c5e1dbcb59e2252e321860dc7254b9ebc9d073f317a344a2a8a4ec772ee1a931a5181d9d3b1af45f913b0ad04ebf189bd3a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +esstix = { + revision = 22426; + shortdesc = "PostScript versions of the ESSTIX, with macro support"; + stripPrefix = 0; + fontMaps = [ + "Map ESSTIX.map" + ]; + sha512.run = "e503f25cb713918329f297a4ed088b63967eb06828fb753653aaf60ef99c5fb7db6507d6f0f74080b9fad2050ca1917f7ab873be2fb0bd3fcd126f29a43eb775"; + sha512.doc = "1233a284b88e5c8bfb29350b3b534e7a4c81b5692a9ac7aff5d69f77210e026dede300b511bc45efd18d6a96f6df9be2add166c80f0ee5d17c93732c0c242bf0"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.0"; +}; +estcpmm = { + revision = 17335; + shortdesc = "Style for Munitions Management Project Reports"; + stripPrefix = 0; + sha512.run = "20213ddd795e862dc924ddd71df08752f6adda4be7a06237507cec84abf6a6ccd664fa9676cb9b275ca9de8647011da0bc731fef9344945404f885b56b75aea1"; + sha512.doc = "c240305f2ad7a841c1d9309d1934001fc42d68819505b5c862ca8c97c5ecd7b6d2fd8a79a4273be79126d1503d968fa4649ad06e0c001f3b731e300341802dfd"; + sha512.source = "f867a24f4bde53c0de195874f1717fe49a3869755834ba1dd0a9004e3085f06076eefaca2e83c59cdf5cdf65fa740d0df898e0ee75f88a5cb516a3cfa404c164"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +esvect = { + revision = 32098; + shortdesc = "Vector arrows"; + stripPrefix = 0; + fontMaps = [ + "Map esvect.map" + ]; + sha512.run = "1a6940862940d8ca29bcb19c69817b84a7f71f7a8762d3a63829fb0e0e88eccd940f3e2973d8d05dbe9323aa1f80dc9045b531e3509239eab399f02a55e7988c"; + sha512.doc = "502d2cce629280d7c192ad11764c0c12e65f9f1318286d1acdc3e08c9d7d36b07fc3e5939c053aa57ad59ee91e73b4035c9bd1aafee3672ddeed4a64bf3cd7ad"; + sha512.source = "658e98e4c97dfdfcb34b396ff644fda060a645d15760bd975ad1397ca73f4ed24331a77bfd914bfe6f8f218aec9ab3fcc0a2a48efc19a0c6adc1024943584a47"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.3"; +}; +etaremune = { + revision = 15878; + shortdesc = "Reverse-counting enumerate environment"; + stripPrefix = 0; + sha512.run = "511f84d8cb951caaea65cbe839fe83c9c2dcd7dbe0e0c3db3611d914dea475b60de029d4dbe482616e9d219929c50b2a87f6c33451d0d880e3b368fbc9f7f612"; + sha512.doc = "4d7728be13e1454b2456e543ffb89a19fc5204e8025f949dcda7ce3b8a8b898dd9a6d96e44477cd158baad4d462afbcc17b6df6ddd9982232891e7b4ccb112b7"; + sha512.source = "17c0b9d705cd5ea494428bbfacf73d12f0f40d5eb4be2a3b1a4e2aeb97af61d184ae6a471505d6dd604174cdf34976f9e64de5366be7877da26141720f542953"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +etbb = { + revision = 69098; + shortdesc = "An expansion of Edward Tufte's ET-Bembo family"; + stripPrefix = 0; + fontMaps = [ + "Map ETbb.map" + ]; + sha512.run = "e034a9a750043f459b8682229bf01c08b341b4494fd6fc6669e1065652ae9154e0eef74038f1e5f16c2d57390ebfa70056198d563f3e454ee3e4806971a707d5"; + sha512.doc = "cc4ebfcb831cdd9f02c93248d5083b81a69c59163fec85d469a17841607affb51310858b022ea819055c6bdade821d330599c97838ab9f92de7b8fa4d8f8f0a8"; + hasRunfiles = true; + license = [ "mit" "lppl13c" ]; + version = "1.057"; +}; +etdipa = { + revision = 36354; + shortdesc = "Simple, lightweight template for scientific documents"; + stripPrefix = 0; + sha512.run = "88502eeb78f2f5901cdfc192638501690aea861de2105445de226261c62f526d6602ab5c63f02974d067e229b12441ee6663b54769236a1e0e125896b869301d"; + sha512.doc = "6aa2ecdb393932a485857222e66471b9c52388e726edffd0b4357e340e8a5092af96ad1847486a58d6a8485a4ce0e80e25e80ad58f60991004136739d26aa996"; + license = [ "lppl13c" ]; + version = "2.6"; +}; +etex = { + revision = 70496; + shortdesc = "An extended version of TeX, from the NTS project"; + stripPrefix = 0; + sha512.run = "3ed4f77ffb42e86877ae448acbc84d4ecc7003b9ac4f4c80e88bacd23d729db991c115a736e798245d4b81825f12247ea68ae35e4a9ec3dc6fc147b6153d0a98"; + sha512.doc = "1b5225821ea6faf8721f6ec6ebfba649d2d14496274b625daf8374ca50e72f94030fd8570e0bdef0bd8ad249f378bd4cfc4d46c1d959eec2d1af01335631c15d"; + hasManpages = true; + hasRunfiles = true; + license = [ "knuth" ]; +}; +etex-pkg = { + revision = 41784; + shortdesc = "E-TeX support package"; + stripPrefix = 0; + sha512.run = "e2afebc530bdab4d5384170dd807d6e39c96d5a18af0defa534106103243b0e52d926e09f3ba62378452ef643bfa8f0e4d92a3c0256847c91e561707410052f4"; + sha512.doc = "2ef9984629ffdafdc799041127e31360c8eee80726d8c410130d61f12de306e7b4c2cc892e8012029827e8ed470f9191eebcf758830cd34b8d01593ff78cef1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +etexcmds = { + revision = 53171; + shortdesc = "Avoid name clashes with e-TeX commands"; + stripPrefix = 0; + sha512.run = "b0be75d3c8eb92407f21111e6c9d397ab5de39b96b99403a149a9554eff523e99cdacc9c1c37ef47cd190487511c6fc6b7c91b617e889eac1d6d8b6aa61c0c6b"; + sha512.doc = "841ff47f9cefecefb241cb81602b825c07d4d0eaf143343eb9bf6c35ca66194c98f851e4aa27a369d60927fe96968bf7a1c1d8dfc7bb5be092e77330ad8ac6f2"; + sha512.source = "057bd48b4c4455f3641c961b6337127c6f84c72dd89615197c095b13846599f1fd8016ffb7fe22be820f16f7b012ee0991d8e959e59a3393694239c1abd610e7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +etextools = { + revision = 20694; + shortdesc = "e-TeX tools for LaTeX users and package writers"; + stripPrefix = 0; + sha512.run = "ed7e514441de2fd296c372d9c56dd71ebd5318bd67eb4611c4bf784b16b045a08338ca4456899739dc023e5bc4695a6fd1784e592e542cac6a0564a68307a983"; + sha512.doc = "5a8d722f9e2e59d483c7421909b4a0f8719b0de81f2b8b95801f905d478624eb4df936f193eb3e4ad1e3f0c2d844c7672a5e2ab1c0ff0654ed88c66bee4802ef"; + sha512.source = "a2535e9648828eee76f6fe48d7c85ab4211c2c107bc91f72a944f8a9eae384205ef371459fe2df743712039eb745e48dfbcfc42cd39b7d5391263711ba027862"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1415926"; +}; +ethiop = { + revision = 15878; + shortdesc = "LaTeX macros and fonts for typesetting Amharic"; + stripPrefix = 0; + sha512.run = "ad9da81e2a9af7f93c3a9677a72b80335562677d552511463c20b73df25adb0a6765463273306486e295b8c5994af03fa1df8f1e70cc48ed7df44698637f8459"; + sha512.doc = "13e9149433cee0c44d8eddbcc6f738cf113581e4890a8728aff08a6f3f26a62617e1770b4875668dcd75a3714925db9cf5c5d9fb58a9870292bc0d22005c844a"; + sha512.source = "46bedb27b22953ee6aab0b372581fc58186f3208c985a88006846a1f7917d998b5b8abfe463c3f415100f27aae20ae1d1648044850e6e7d095afa480adbe5837"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.7"; +}; +ethiop-t1 = { + revision = 15878; + shortdesc = "Type 1 versions of Amharic fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap ethiop.map" + ]; + sha512.run = "84f97fb5320ada95562aade797fdb62577e533feee9d7ece5cc51e17303012b198c0b1e6b4f720dc1539c4cb917ac71e3da6f48776d6fcfe84d4527ffd7b78dd"; + sha512.doc = "81f2ed72d5cef9119c94c4b0025e31be6739153e36b7b31a2c59b0cbe5a683a67746da8346345d561472fdbb760c07831d1936222ce1388ee12d70c9053ca8ac"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +etl = { + revision = 60998; + shortdesc = "Expandable token list operations"; + stripPrefix = 0; + sha512.run = "14c5db74da0c3878609323b450c99dbc186c97997079d09acf55bc8fe78a2cf9f7fccf7c89c1fe02ef8fe9d532fc3d33e85d77e374d4f0c601c6251a04472dca"; + sha512.doc = "2a1dca3962826cf749d67799c6d871b7822b16f81c7ff3473628926db217812ed5d85ee2da351245f6ff7a973bb1b90b61951101978693fb92f07bc86425bb2b"; + sha512.source = "1be3c92c55576ea6906f08461f08269fc4840815124c3f1f09ed145a680de3763e3bcd88aae61c46d872e05ea34c302625e439ffdbcbc15d7565eeb250b177e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +etoc = { + revision = 69343; + shortdesc = "Completely customisable TOCs"; + stripPrefix = 0; + sha512.run = "ee9e46861d53c0cf3f0807f55a78b2e9c24ed6d5b37037b87f162a297421548561728dbe268927e7155a16da256e61b24c74ee9b1c18addbca937b8c85ce21e9"; + sha512.doc = "693a6589f33a93e9086342d093b8801235d9e7d8e1729400e4e1069d0bd9457bf8b96c0a946110f12e2cf6ae646dfea81fcb9a795724558f73e53bb87b300957"; + sha512.source = "0311468458efe4ba2b12bb0917dcc4bc763a1f7e1e6f2621843358afea9edc5a96373f5beb74224df33be1276b36cf53f7d45fd7183574acc38057b31c51f01a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2d"; +}; +etoolbox = { + revision = 56554; + shortdesc = "e-TeX tools for LaTeX"; + stripPrefix = 0; + sha512.run = "b4c2ba570b1636b7ccd741c8960335f4863fb7242253be6c071100b64ce0d6ffc1bcc9da5e9bc65830ae5e34cb4cf887220585c0006d7afce0af3ca95f96b36e"; + sha512.doc = "15f5f37471b991c1363e7d34c419c4defe1920522d6f666c383ce31b25b412d40a1dd6ca1c0fdb0e56ef3c7e529215964957c5a2dc55522bec60e79bdd972947"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5k"; +}; +etoolbox-de = { + revision = 21906; + shortdesc = "German translation of documentation of etoolbox"; + stripPrefix = 0; + sha512.run = "cbddbd599e10b6409db5c9f9d27f35b5922bba82da39b19aac010ef77e76a29465d91c10a40c578e834acf5d9ade2d52baec5cca06eddc802eabbe599fb3dd28"; + sha512.doc = "4c966dc094430caf72e462c1a854995fb78b54dca84322233a16508e41f33f0dd71db2b997b26beb7fd4722f0df1695a118ef782d7954983e9df3ba2132b828b"; + license = [ "lppl13c" ]; + version = "1"; +}; +etoolbox-generic = { + revision = 68513; + shortdesc = "A loader for etoolbox.sty in non-LaTeX formats"; + stripPrefix = 0; + sha512.run = "12bb7835b59a33026a0acff3c8f8204bf9b159fa84538332ebd7e4ce7116f3ab0dcdfda075555e595c050dcf96525a67f13ab33757df5e55e21b62c3d08488cf"; + sha512.doc = "f877ad6a682abe82d84bbd1e9bd2870d80d5b79a63ef150f0eb4cc9abe0cf07c485b59d55281709027d705843bb7da33cff2eac6d382885ba806068a3a651c7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5k"; +}; +etsvthor = { + revision = 48186; + shortdesc = "Some useful abbreviations for members of e.t.s.v. Thor"; + stripPrefix = 0; + sha512.run = "c70654c50e186f73bd6dbbb65cc40cbfd809a86de223f96b4bbd1af94fc5fa928f2400eca58d6a97e5578186c58cd038a99264a412d9bb7fe15a01d7f3aff8b9"; + sha512.doc = "47c9d66a720a8225b34bd0571c0f0da18fc72fb5f37e4204e7d4842facade9a0b72550351c0743dbb9296ca8bd2ad61036361f0cb7447b06e0994fcdb7c657b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +euclideangeometry = { + revision = 67608; + shortdesc = "Draw geometrical constructions"; + stripPrefix = 0; + sha512.run = "8aaf01108b5d96000d909e3d041a7e9c00cfa85043b25fcf4029238f2570330b2402a2faa4f63f80ed84d5dbd3c12cd4690668714ca1bd75c14673b2828619e4"; + sha512.doc = "21d80f3152ecf31c62d203b77ec42c183e2a6058faa173163fe456d521e89cc514f83b0ad60684f2b29c7952428670afccda79372bbea1727d797dc78de04bf0"; + sha512.source = "e48b5ced844b3ad25f11c6afc93fbf5bde4693d9977106ab175c369bfda583c0725aa77185458a88d2e38797b31ff074a48999774ee9ab8cc76480684a815f77"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.2"; +}; +euenc = { + revision = 19795; + shortdesc = "Unicode font encoding definitions for XeTeX"; + stripPrefix = 0; + sha512.run = "f5968e42b36d9c3ab7ae17d156283f8fc09f0c725dd1037cae3b232f94af11a8ee84507efd87cab901bdc8a34f0f72d831a078de205e9beec81c574bb65f79fb"; + sha512.doc = "ac8d4e83ab23bf692d609a617bf8aacd8b33949e0bff1070301b8cad4e91f2a651555ffb44ad70be99791e64020984fe07afbb25976b73963abc79660eab96dd"; + sha512.source = "4037c8f9961be1f4cd6a41d0cced28f4bcb54e5b7c4f9681b702f1d90e425ab0c772561b662fded93a0c469cfa1c43967fdfb3eb8c9e0e8c86d8340930565910"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1h"; +}; +euflag = { + revision = 55265; + shortdesc = "A command to reproduce the flag of the European Union"; + stripPrefix = 0; + sha512.run = "6d6b156148fd6aee2f82ca489263de2fc37103e00aed4a287eb10acef95c60902d3c0c329eb904d2b808e5844f9d6ce92fd8afa4e9abf187d4f8bc7b8f4b75ad"; + sha512.doc = "68eda595381f5f22bcd819ea4d2a4ee430ec555c92594ceb581a9e566de648a74ca3fd53ecd4566d17d3b54dc05b7909bdc3dd805e8c70fb68520b299da355c8"; + sha512.source = "ad66378d43f833c0713593db5875cb0431a251e6443a939389551a4a4e5fe8c76865d1109ee0aac1b9213ccf6f375b1e4ac5a2dbdf347a88aafd86a0af721e90"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +eukdate = { + revision = 15878; + shortdesc = "UK format dates, with weekday"; + stripPrefix = 0; + sha512.run = "4f64df42384897fca09574330d919704bfac2115f330f8ef085c9be60b51c64a9f1f46c10b863e989b9eda6559a3e2cb2388a59a997afad73632d83b02177b3e"; + sha512.doc = "7c79bb48296d491816b5e5cbcec389fb7a2a200a9b8e544394a8363b5b99c7ad36b332c05968b98c1bfa1caf04fb554318494cafd0781e25ecbed532c752c65b"; + sha512.source = "114d472984fb42b7043762f7f76e1ac384ca4efd338b7ea1815d25178256dafdc2c83323cdc3e4c1835fa8d3cb019bf0d73dd3fe82acae16b41db4e0c76e81d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +euler = { + revision = 42428; + shortdesc = "Use AMS Euler fonts for math"; + stripPrefix = 0; + sha512.run = "3b3d383a2f715f14dba0ab926d3df9d10ab63c06d203c59e551732a7f6af4ff8965750404a37863c91d3fc3db7d44d1a279d03839162fde9d8d9fd849f0047c3"; + sha512.doc = "789c0b35257ad74dcddea589eed36f0a3b86eae3b201fc708c13cb11dbedc5b489d1495c218f9e10558b8977658b72c345a5622c10b8b1d7ceb3065a6c8fb9a0"; + sha512.source = "59e262e4ebd3eee88828fb2cbc91b55ffe962e2bfe662df5c052075cf4fe4b9b8580ce217e38e4709789a0e77c810f9681ed3cef95f10709c54da5f1dbebd73b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5"; +}; +euler-math = { + revision = 70335; + shortdesc = "OpenType version of Hermann Zapf's Euler maths font"; + stripPrefix = 0; + sha512.run = "331055a1c53976130824f826da975e7ec49d84b993be8a2e4330dba4ee8a48df209140879405307a3d635eb264831b790b05850ed00e8eec98d9f649443e650b"; + sha512.doc = "31b74c70d914e16a7e4f0bf4a6d94bccdb7656b71eb5024dbe01d25f72612c22577248b3d8ab695a32e58377f315f59ad679b30ceee23f2d7b66444710062f5b"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.61"; +}; +eulerpx = { + revision = 63967; + shortdesc = "A modern interface for the Euler math fonts"; + stripPrefix = 0; + sha512.run = "86f23cf10d19427876caa9e21bdce3adcfa7ca06578e7ae05f20529333e36b7135695c1c3990c6700e0ad365fed41634de5d152813ccde20cf642d7e2b282455"; + sha512.doc = "997bfc34f084027c6275d41d4fd8e1eafc55a6aa1aae66895c6bf8a3ddc8a7b411052a126cb87b9900829b933175c6be942e1dff4713633b5fc12f6688799753"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +eulervm = { + revision = 15878; + shortdesc = "Euler virtual math fonts"; + stripPrefix = 0; + sha512.run = "f497e30a188bd0d6cb66795253b35f6a108ef11a2924da94110e5a2c913af64826a21789265bf7f2b15a31a914b74ec171fe3c3d299b1164801898c0d7b0e7b0"; + sha512.doc = "dce6b483aa0d8ed6d6e607a0a518060fb290b25f04306ea4ba50f863034aa3184118a7a13f42e89fb2706daa173abb7eb5c2bd433eb038aafd1f3a8eb9c17995"; + sha512.source = "33ad15486b813b4c4cb7758cb22acd59a9578df070857483e6cf7997997437df954619a197c4bd762c38417bf9841c06db446ee74939b8eeeb6a0d3bf893f5e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +euro = { + revision = 22191; + shortdesc = "Provide Euro values for national currency amounts"; + stripPrefix = 0; + sha512.run = "35a1c763998bdbc3b3b54ade3e4887859aa9d166699ccfc73db432aab3439be075d858e88d3542c25f8a0065301f0b1fea9bc368f85ed767e9deafa090f35beb"; + sha512.doc = "896a040cf80bec968e4fed5b2bd774e433997d336855775c1e6e5215cd6d9bb094550da324a2433d4da94ead4af3cfa6b192382efa73bb7c6bc951c22bb02fb3"; + sha512.source = "cf587911ccf53bd78d100221518aa62595279fd5880152d715950ece34b23eb5ef39b0ec190d2c5b5060a4f68861a8b9ac2ef93a3a6f3dbe3b85223dc386bef4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +euro-ce = { + revision = 25714; + shortdesc = "Euro and CE sign font"; + stripPrefix = 0; + sha512.run = "c1a864ebf022c8949b62195be6ce857ba108b7f930cf6e0152d70b7e3283e09c2f93fc670732cac79e3f48b860431186ea903324a02597b2a92fa43a0819b57b"; + sha512.doc = "3a44189546231f3bfde594142e6901a69f6e351e1d04203d1d646c476ca330431c0560faa79fec79485a4092b667864dcfb522ddf9a56bfc2b2ab76764b3852e"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "3.0b"; +}; +europasscv = { + revision = 56829; + shortdesc = "Unofficial class for the new version of the Europass curriculum vitae"; + stripPrefix = 0; + sha512.run = "35aa159fd84082e1cfb65bd05ea83462400e12edf5a40a89740373954d72b42cc33516452691814359d3bbfae1e96f4605e0d19592c54f4e2e5328542cac42a6"; + sha512.doc = "834c4266e343a8b615a45a2c4b064170bf6c9516a8631342ff02d4de7154229458818192670f3f73aac5600407c830c1be384226bb3b0923af964905a39d99b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +europecv = { + revision = 69661; + shortdesc = "Unofficial class for European curricula vitae"; + stripPrefix = 0; + sha512.run = "8e71b214a28fa5cda60a769cc9584d030e348e3236ea57e932ef3bc7d02fc07969e31f83ad2cba0f7bc7a32c41d9f478881b437e003675fa26031da7552116c5"; + sha512.doc = "ce96aa71bf8886c67c65d0ec4e24e97d45ea4b4a948d9b1b6dd51f79781f0667798fbee8fc2577c13b13860c5a886be2b4eb6bf743500a01e1982e5c8e29ac9b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +eurosym = { + revision = 17265; + shortdesc = "Metafont and macros for Euro sign"; + stripPrefix = 0; + fontMaps = [ + "MixedMap eurosym.map" + ]; + sha512.run = "9624b0a91a8491d4178051e8e8264e506725ace0eb1b4e4ee9f3cf38cf7868d392f0f4fae92947c74182a6cdf7d4cfb46319a269e4e3aac686ecf4a4cd2f7b3d"; + sha512.doc = "db226757ec82087da3e67fe69b5e9c2429e3cc2addb126bc528dda8bc421a4e9da2a367e64f119eb109e8898409a4e50177b81f9035ed1e0672bb902836bb61f"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.4-subrfix"; +}; +euxm = { + revision = 54074; + shortdesc = "extended Euler by DEK"; + stripPrefix = 0; + sha512.run = "2f786231f801ba9a9c5f5176bfbd01f8e952c33c722c7508988628afa66d1ddd55c4de02c0ed9cfbaa35a8764833e822046f7125330145995433b517f7051bd8"; + hasRunfiles = true; +}; +evangelion-jfm = { + revision = 69751; + shortdesc = "A Japanese font metric supporting many advanced features"; + stripPrefix = 0; + sha512.run = "ff08a32b6283fc7ca0454e0071ce1d90b7a6fbf8989ca3eb4cc1f804f002f920890b083e5aa81a9455f57659a4df52b6c4677096621d9dffefa37c318e79a0f9"; + sha512.doc = "ef98234e6c6609dc9ea6f60027c3dad1f417d677d5177525945330122b9b513a90bd296ba86a1d96eadb52792b5d162264578118872d5a7b1794b4a1a7fe06a4"; + sha512.source = "348b751825e0ad309ba4d37709d9ea5949448e1a3985b69ba446404316486e40a4fcd3a5c337c26b10c63a6b9051ed4c88cbd1f31a0707ec15242f7fd19ac7e8"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.5_c"; +}; +everyhook = { + revision = 35675; + shortdesc = "Hooks for standard TeX token lists"; + stripPrefix = 0; + sha512.run = "56547973d184de21ff5d6d3eaf1baf9b8cdbcf93307c31fbbcf658350ef0d441509ce359266ea6f962ef9b40b1680b47e4c14a822aa043ab8174ab0610df1665"; + sha512.doc = "331def0138dac385605b3ea1d88af6d5d1ae29bac696b76f41cdcfd070d50915eb3371a14a894b1e59bf35d55eb7dabecfe18e89f0bfbe6f028ce5fedfe1bbc2"; + sha512.source = "ba0d5e3f2661c4b5ba765b7509675f301dffa3fb3d9f158b3c3255d84b3a5620ec4d883a9c2f116319e6c70784eb5efa4a1cac270d1a299b23bd6fdcbaf60b2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +everypage = { + revision = 56694; + shortdesc = "Provide hooks to be run on every page of a document"; + stripPrefix = 0; + sha512.run = "032713896e2704667582aa03e8d542062a5eb26188d41b08968955fbd8535aacc8288559112aa264c542e3523f452dd9b2acdd1dc3f66450cdc5c5c902e38b80"; + sha512.doc = "4c19f905b5a16674980da2569b2994382a2eb108fd20bfdd29a6ef4220e00aa390c197dd86ecd093a9acb83b9a2d64521f732083e3c2828478a8c8c45463d180"; + sha512.source = "f01679f5ac00d3c75a0595496b489a008c664d7197af6d267226498b821ca83d34ae842c212756ccef81aae40f4447ddae2146b5651084dc55081f75c1ec04f8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +everysel = { + revision = 57489; + shortdesc = "Provides hooks into \selectfont"; + stripPrefix = 0; + sha512.run = "79b83d48e3e6eedcf1673a30c28fc06eb2ed8e3bd292d6cf914faf5ce2929795e6dd11baae3a207c796abb67ced2a2442af11c2618fd7d565696f8bfd121a0a2"; + sha512.doc = "5efdce418de6d29481a8a8a9bb89fa561e865f5628dd67ce88fd648f54a40c6a90c625700d053d741b650c568eb6b63da81b68bebf89bb618a398a223a5b08a1"; + sha512.source = "c288dd88a266e87bad6880e36a681e29f5f52f02b5f7b86133daae2972932572f0e529945acc6a0f00b844909da8f77cf3a524bece531667437a5ffa0dc2a684"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +everyshi = { + revision = 57001; + shortdesc = "Take action at every \shipout"; + stripPrefix = 0; + sha512.run = "b6219fdc669847a30ad2359d6b0888eec0980114d5385c018e9ddfd0876dc52390e1e8ffae5d2850cfa140833365c30024456bfacde6615bdbe5101e7059d52f"; + sha512.doc = "2a05f4b42c1a85b4af8fb3881d1e32d0cb8fad7070bd8eb83632b50e387083a5c8fd264b61b70416451f56a97e1c0702507bd50c534ab7baf975372d854a97a5"; + sha512.source = "4ae653fe3cf9dcfa51f461ca72954eeef666a6324321cb5e6416d7e2baa5320115818a26f1970bf7654acec9454e5174262578fc4d28f251d3476d27d6d4d9d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.00"; +}; +exam = { + revision = 67600; + shortdesc = "Package for typesetting exam scripts"; + stripPrefix = 0; + sha512.run = "99621f442f2a36e661f98e2722776e2e9dc394abc39cd20d45bb6bcff3ed362a942dc79d386ebf45efe053fc6abe2524d95fc85c4c766d241385970fa00e5f65"; + sha512.doc = "abcc7ead3c7d4847537476969bb708f61430940e7572e078e26baaeb6f2493309dcb996bac0796870825d4badb7bcabc81fc49aa7f4e71c0c816fd7e1ec875a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.704"; +}; +exam-lite = { + revision = 65754; + shortdesc = "Quicker preparation of exams in LaTeX"; + stripPrefix = 0; + sha512.run = "f1f16566eb49d5514bff3076f1c1837cc933278f3b0e8b1d6541f158ce4922daa43585057666e66ef80366d36b4b28793b930421ed8901d456405e52469e0e43"; + sha512.doc = "a1a2ea02e4ed3d846e428f5ae43f25150a982f2d490d9753071345d53e640f3ef05b43e812ff84155a44f369ab49e294050bbc53823da4e899c7e1b6c2d1f36c"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +exam-n = { + revision = 64674; + shortdesc = "Exam class, focused on collaborative authoring"; + stripPrefix = 0; + sha512.run = "bdd3f8a1e7836ce86fe022e27c554c125403247a9ca4e4cec7a0f32937eb517351d815248ce67815610bd063a9d0e5111868c301847aa5b6e5d666dd1cfc2f8e"; + sha512.doc = "3cd31c7cb86e66901eca162e7bd0ced047fdf22f2d8306d9f8cc8dffb299d027305e950ff1f188d366226614aaa2db2ece78008bf1a34d4076eaf3db7edab319"; + sha512.source = "4234bf167451fadba8b098e686490b517c44063c76bb4a780aa0d585db0df75fb30050efbe539cf6ce2658414db6a69c5f0c6e63de6e024a825ea45070ee894d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.0"; +}; +exam-randomizechoices = { + revision = 61719; + shortdesc = "Randomize mc choices using the exam class"; + stripPrefix = 0; + sha512.run = "bc29ee238d430b0d1b536084568ec8e68381c827c7ea7a4742eb497c7092ac8eb0bb990c3356eaf5939420e37979412c61ecd2e83a98a0e36739f1d6c73be3e1"; + sha512.doc = "0cc99d67ba7b1d8d27048b33a1f1b9864e35c542ba8683c590598d5da3d4be5d3f93c9a01f339dde6fb0945982e20de19847805d185b4b28aee2c7d86bfc631f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +exam-zh = { + revision = 69920; + shortdesc = "LaTeX template for Chinese exams"; + stripPrefix = 0; + sha512.run = "d4d15c90b4718be8deec3042d4fcbe8ec497417a3761d8e203f6e17079c613a3ec621d58ce388f26353a5d4d668546aae40ab7d0248ae577e1609e18186b19a0"; + sha512.doc = "b00e5d88a1d801e38b3ab2fa8286b880348e99ac0f9daf8b28174a6d04b862c995331136a3236801812e05b9bf15e1288268414753b99545abed856141868215"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.1"; +}; +examdesign = { + revision = 15878; + shortdesc = "LaTeX class for typesetting exams"; + stripPrefix = 0; + sha512.run = "bf052063b16056faed35007a5e1b6e2bf4f116388b2698c24c7c00ff257fde4f0225f138af6c011f99d051085169b51357c8661647f28be07a7f6dfd330ac10c"; + sha512.doc = "1870e3732933e0d69f52eff2c403011b09814938083b91bb428c776ef50140e1b43713837e018b09e8340dd5e47811aa1050bb9f90b350aa341216edb00c2a9b"; + sha512.source = "8f755df76be154c4a2a1aa6d2814774a0b9398d0b64f7a59cd865e92e805dc3bfc84026a18dc449a2ebd6cb6215097e351037430de19960e957f314ae724e244"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.101"; +}; +example = { + revision = 33398; + shortdesc = "Typeset examples for TeX courses"; + stripPrefix = 0; + sha512.run = "2f790c1bb8934e1127ba64c61ccf0d9ed503c01cb8975c114257a2179db7d88b4c969475b0e357d17785fcf7e42487e991e176df3dd7a1be5db4cdf87abb9cad"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +examplep = { + revision = 55265; + shortdesc = "Verbatim phrases and listings in LaTeX"; + stripPrefix = 0; + sha512.run = "689c71afd2f5733b669b12c27014edc260ffca597b197ec0a91b5cc476bc6458699510bc5053863f9fa8ca47b9e2cda18939e734d3c23c7507f0646e0cbd9afa"; + sha512.doc = "09fab96fddb1f42c6c5484e1716d1f2dda3f51c6c6f666343a79070aae079ad2bb67f210e51875621c4b4f8a30f9908d4bd53caa74c57ea8ec4ba330dbd721ea"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.04"; +}; +examz = { + revision = 67303; + shortdesc = "Randomized exams with multiple versions"; + stripPrefix = 0; + sha512.run = "7394aaadd38993f44b63409c28517af05f9875840d094fa4467e8bfcbf1be4af41327683264ad81107f2f84f024fd683a62fe32c04d9f61ee0532b100fec93f5"; + sha512.doc = "400eb0b85928fdb12e1afc58036f6cefadc301ae4a3e659d1cd1f2fe122231729cafbab7a05910cb47d969839041ea240df26e510b43a6728e2d1794271442e9"; + sha512.source = "df30d1ca746c4c4efaef640884ea93eb3d97288addc5571db4ae76454ec26e2b57df5e401314b9628454774c8d29b4e69b2a2e6391c30da2c29a7b7330e670ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +exceltex = { + revision = 26313; + shortdesc = "Get data from Excel files into LaTeX"; + sha512.run = "ef8495b4ef6937af022951044652ea1fb1dcd3f65961408e84a52f9053db8f4fde6703f18833ee9cd002bc058f01813ddf765f575200211563d6e16a956d3613"; + sha512.doc = "a6c4ae60f2922af773f67494c30407b5b6ead39def9253b4710940774e619496a3c242f7e9bcc8733fc733234679bb2b01c6f4571e30dca16c8eb15ad8d6d01c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.5.1"; +}; +exceltex.binfiles = [ + "exceltex" +]; +excludeonly = { + revision = 17262; + shortdesc = "Prevent files being \include-ed"; + stripPrefix = 0; + sha512.run = "b83426d7ff334e64f8a5566fa905f1c03478ff68da5b74b85dfd6c872db7a63454f627db4e6bea48f8048da0d84bd80b269cf5cd3a5b487484dcd8f2e21c5058"; + sha512.doc = "11f1a4e7b0bfeb5728ab632756fb612b784e7a8b46e68c2e5cb3681928811d394ac0b7f508e7c655945209b1e75837d4ec1a69bcaa6b0ac8d45d66302b4bcb13"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +exercise = { + revision = 35417; + shortdesc = "Typeset exercises, problems, etc. and their answers"; + stripPrefix = 0; + sha512.run = "8de2044404690716d781a3b081181d9a14596487213762bb1ef426a0951dc18b1097a4cd8255bc7094d9d5e7f874e68181849c173a4932e7d07c46e14d1609b1"; + sha512.doc = "3059c297ecb8a990bac32e1e52bcd6fe39e6958c96c145ad70b937ba89284a6f447a84e2f144d31aefa1c446331c7ce80ccba926e288d7ade917c7aa68095076"; + sha512.source = "fa76e8b16def4f53a968c897e12e37707c054c3a964f14ee9654bae4e7285a3d300d62f0a79ba7fd80b2fa15e9a334bf38f3a744f0c0f6c32659853bc9b57855"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.6"; +}; +exercisebank = { + revision = 50448; + shortdesc = "Creating and managing exercises, and reusing them as composed sets"; + stripPrefix = 0; + sha512.run = "6398abee37218c1c4b0e21f7dcdc82b49985888c8e5cc4702fbe20942471cfcdb8bb37c66edf2c6764d9a38dcc932b8584f65bec8dcf75ba11c738705a71048e"; + sha512.doc = "d7b262b7a9ae3a45b69112e2924be8ec7cb2c13a8b973056e849cc5a0f4c82f85d4b5887a3286360b38c3459bc99ea9d917cd1084d6abf1ffc343d7ab522fed8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.0"; +}; +exercisepoints = { + revision = 49590; + shortdesc = "A LaTeX package to count exercises and points"; + stripPrefix = 0; + sha512.run = "cc706842f62ffd982dfde7f503f226c7f7050099b581dbef6e5e7f85269e3110a738232f1a99752b353a54a91ae5ef145697ff36ad9df1fb69ce1051bf92858c"; + sha512.doc = "81493e680086ce4d833e8e9107a056daa4e74e321964f914d8824e25b4dbd6c181b1e10d41ceecf27d18baa53958babf77b0edf4c0234e0b80a8a3f5ae49c348"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.3"; +}; +exercises = { + revision = 55188; + shortdesc = "Typeset exercises and solutions with automatic addition of points"; + stripPrefix = 0; + sha512.run = "90ca30f7417076a9933970d6c8559317861015480ae5da813e19e0114a6838084317fad6a0b1aa295b7a8a8c49038007a36ebcf4ee83f54fc0e454a317943923"; + sha512.doc = "ba5b8125bf2a59646f401c5d4968f1e00b5d9a35293bcfd7c67c54d275b8e4b1586a5f07ddd097065259935a541551a8b990f5dc737e1be8e78343382b7be72a"; + sha512.source = "32728c5bd1bc6465bb82ab95f9c2a4fa4a403431a8369373d75861ef0d6af8850c108c223b6e202f03b53f87d52bbf45f07a81e75175c0896951cda89cf20ee1"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +exesheet = { + revision = 69885; + shortdesc = "Typesetting exercise or exam sheets"; + stripPrefix = 0; + sha512.run = "80b24d8740ff9d633b852fd27c2bf6c6ba00465c620780a0184fdd2c0944a3d84fb467561602cff66c96657d6feb983225f529c72419c81579aefe2a10885735"; + sha512.doc = "b6e1f6534deaaf685428d83ca76716309c33f9bba4799a59d9a5223d1594989c81bdb568b4591ef3c58fece8cf4b9849c309e34b2b482478d1b4994d3edf3455"; + sha512.source = "efe535af2043be2f2328b52c2c5fccd3aaaa1e84b839d0b793f1fddaf18b277b9cd1f325f94fd9cdd87159b28928b4ec2085830a5a1bac0daa2b31d98b165a2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +exframe = { + revision = 53911; + shortdesc = "Framework for exercise problems"; + stripPrefix = 0; + sha512.run = "426128ad41db65598a47e0baf0e019b6592c996b10442edddd624d86524116df4e0fd01411c3ac2f4153ab1af6f3a960680a085a556f07a90ff2b326bfbc26b2"; + sha512.doc = "c8f9913899a52815ddf7d96f033db62e248a92ddfbafea2091a93b55fd1bdcb01734177c7e234ac2de51383eea7e21afaf77164ce496c7858f95d63800461007"; + sha512.source = "1a42fbe43846bf5e3a87b43b4e855a0f7b198aad0f0aa311a4e7c3632b4d45ef338f107484190461fa15dbfa8a52dc7fbbcf95ac00cde18281b2d58e931df060"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4"; +}; +exp-testopt = { + revision = 15878; + shortdesc = "Expandable \@testopt (and related) macros"; + stripPrefix = 0; + sha512.run = "26b5af9bdd06a3bbd231b1b55c4ae8929efa06655656747b804425e802fa7d07355e510ac673590cef235cceaf88fc03e1493f4bee9c99ce2a32c32b9a3f9aca"; + sha512.doc = "f4f7cda5cc8b3f8900cb12989834e5b1702f751248f58fe65a8d65ab69eb2a4118002212eefb609e251d4437579e635173366beb471e32d07d45c5c645ca506c"; + sha512.source = "a41951719a9a4bc391216d3c5ed796b0f285a1a7049fa3617bae689127cffd32590ebd3212bf24b221bd7214128aaf564fa62e0a511f98f03961c16a39bc6fb9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +expdlist = { + revision = 15878; + shortdesc = "Expanded description environments"; + stripPrefix = 0; + sha512.run = "fc0f0473faea3d8ffe917e654909374bef6b6d7e41d14c32acb3ee822748c6f37d1f5ab562b4bbfe35dde983f12cd9e1469bd2061aff32e3f79de66e6b3a6c32"; + sha512.doc = "624bbc4ce685589e7e6393cd991b6305d8a20419b4538f2e1728f9ffc004ef4d724831515b77a607093bf45b8cefefe3e6a352403ddcb543b690b314fb469ce4"; + sha512.source = "6713de4d316d2be62338ac94d465393a9e20e16eb2a088ca9086f2e9ad0052f799e47d89768e38fb04a38ed07800cfe9cc505b578b517c2f4cadbe520ee1bda3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +expex = { + revision = 44499; + shortdesc = "Linguistic examples and glosses, with reference capabilities"; + stripPrefix = 0; + sha512.run = "b447a885d65a000f0b79b4c9b050bc89bb32b71426a29261d282fad72428fcf64dc6c660d9142114094bba32040c8e723190e553260c3899a1c1923ebb9f765e"; + sha512.doc = "b0dce6401ccdef7fbfebbcdef9d68f073058f935eabc95fa45619f4d4d85e6b53e15091d845593255c000c3e672dabadb1cef024b2b0c79765f4f6a231de86e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.1b"; +}; +expex-acro = { + revision = 68046; + shortdesc = "Wrapper for the expex package"; + stripPrefix = 0; + sha512.run = "303eec6a2ff399771eb33ecaeaf85fa4a95dcd6bfcaf2a99d702dd148c90b99dcb6ec292170406e497839d5c64ca1a5a6faa20e6cd64a497eae7900b2f28f098"; + sha512.doc = "cb24be981f9ef838be718f44f2b69ee03f81bdd0c6bb49ffe632214f3b6029293d92bd492f59b0c34bc39aeb506204f747a6e02064a9f222cd01053fa1ebe98e"; + sha512.source = "c07114ec326345002f5a4379125516083452e7bc38ce949280a850095d260d8545fc1a3672206163dd43985a48a1e249038daf401359be8383c889a01397982c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.3"; +}; +expex-glossonly = { + revision = 69923; + shortdesc = "Help gb4e, linguex, and covington users use the ExPex glossing macros"; + stripPrefix = 0; + sha512.run = "367021fd290eda11945ba892fee935bb6c86d10427c86232acc000e409d254f410fe7a1012f1870f9c6911a2e1172dd27eae3ee922daf5804433120ccba46015"; + sha512.doc = "fe033244e38a76c3dc6cd3da6189980184e0dd95d74b006011881218e6a385e468c7e59c6dd0da60967f3a8a31c030a1ab70e209c054f89ff1d90e802519edd9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9b"; +}; +expkv-bundle = { + revision = 65623; + shortdesc = "An expandable key=val implementation and friends"; + stripPrefix = 0; + sha512.run = "969711569e1a27e2b08fb7aa9049413ab55c6799d6e1b6cd1c92a79f82214e36d26608fa0613bc3299385a94919f8f2d0029bd28ff2a649873ba6f5da74d48fc"; + sha512.doc = "091fa4f7e8a3b321f02c874160eb92aaca0bbb9b0abb895c74f398c879cf52945ff3468f5f9f4f9d5ada750c47c817be3f9280328e6958ad7de470a11ca340b4"; + sha512.source = "aa9721025f7ccf9091933d95ff411a7fdc763f9d34bc191eb693dd2fdf4e8056e6db929977c89956cd4bbf0804a2c6f1e902b06e26047f55e11e6e2c15fb17ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +export = { + revision = 27206; + shortdesc = "Import and export values of LaTeX registers"; + stripPrefix = 0; + sha512.run = "04b5eac3e263fd692a1f4796ddccf7c5f41398075c9b15e65a0712cc83dcd85a65ae4506a882249e09c9ceea37f973be3398a0c31d2590e0c3e57549f07e9116"; + sha512.doc = "169236b497ce09d685c71bd21eb6c35ac260d5978c03f074371386062ce8219bac1e501878ba13b60677c423904ed11b37d8e018adae573d135a1e1cbfdb84a4"; + sha512.source = "844f1bb688d389fba93a7350b884b4cd5298ed6974d48218cd1cd2c863b9193e6d4d177f3ca1e905dfaa028f626fff4af4b9912ab9bf3eabd2bd9f4ce5d5da7d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +expose-expl3-dunkerque-2019 = { + revision = 54451; + shortdesc = "Using expl3 to implement some numerical algorithms"; + stripPrefix = 0; + sha512.run = "9a642f593f0440159d802bfd78a472645dc1c320a43e8bfe91fd7eba3c0b67bc3ad9477c17b36f6ac08b39ddbaff11687e78694bc81134c33e1af085a9384a24"; + sha512.doc = "d3b09af828ace720aa3f7b0fe979893f9fca3d358a69abd818bca7a81d45928cd02e0557bd607bcd91f223ad9f4808b0aeb61ba7269728d467eab46999ea5f92"; + license = [ "lppl13c" ]; + version = "1.2"; +}; +expressg = { + revision = 29349; + shortdesc = "Diagrams consisting of boxes, lines, and annotations"; + stripPrefix = 0; + sha512.run = "d380b7ca2efad2cdafc3ea6f2265452a85035765a221dd5cfeb33a03859dfca0e4cd01219995870c8943657d2525e25d32bf7e5b9fe8aa9afa8d17c1ac4703df"; + sha512.doc = "9287376ba5aa36088b4a99455b727c0f60648d50421ebf2fd125542f208f490c5b57af256bf2b704f01a3e00e85e6023c69cb6dad529fb7521ee8cde74ae9559"; + sha512.source = "4fc193835f6b283ebeb0906d847d54e99e5026ae53929b8855d78208212bc4ce6133359191830803298c1dfd07bcf7eb1e163fa12f8bf799a9eba381e11f7f82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +exsheets = { + revision = 67300; + shortdesc = "Create exercise sheets and exams"; + stripPrefix = 0; + sha512.run = "475b2508bedfef0f537b02dde56e489ec464ab500e1b6b63e7d8accaf9d5c17e8973d9aee8d370494115592febe684262fbad239fabe5a314c5d89e781506377"; + sha512.doc = "8a00471bef6ab06927fc7c3a4c33e32a2f6de376cb238fa3e06e3e5a44c98b2ed413f74e60bb207c99c6e64f934bcb406d898bdaa0bd6d9c70b3b5133f4e8178"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.21k"; +}; +exsol = { + revision = 69343; + shortdesc = "Exercises and solutions from the same source, into a book"; + stripPrefix = 0; + sha512.run = "b29f3f9e3ba9d4b98b5db23876e69cce17740923419bc2999c742bd24ecf8f6434bc6226bf4f0bbbd17de79b45653b97ea85866b76892f07d696b0ab5b6afb46"; + sha512.doc = "8be8c7e37139dabc5095c1c77f21a55e60666067ffaed66448db31a3cdf1ef2c21cfa4cd8e4021ecdb6586f1a7b0ece40ebd79f485f878fb25249e1094b7b316"; + sha512.source = "d48acde6262a2eb4fcb2de2f0e3da5f7b0c33418d896235b2ec656df5fa946872c8cd4b266b8801fea5f9a30bae24154ab663358013e450736742604742578d8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +extarrows = { + revision = 54400; + shortdesc = "Extra Arrows beyond those provided in amsmath"; + stripPrefix = 0; + sha512.run = "ebaceefc82c42bd0b0e341d6d2cc589f9369fceec0a71dd7da40f0228b0ef1fbdcc9ba95ee0990b47b4a202d15c87630e46867afd8e9d69fe02fa721bfd590c5"; + sha512.doc = "c51c13205ebb78eabf181b4a927bf92ccfe6756d732162407d1e98961c6b50fc20143de05c992feab2b6622a80ad7556eb173d87264e4c0059cddd10eaf8506d"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "1.2.0"; +}; +exteps = { + revision = 19859; + shortdesc = "Include EPS figures in MetaPost"; + stripPrefix = 0; + sha512.run = "1991bc0b471276ca3db68a8ba7611becc4557de4335a321b5c3e92c1fefbe34dc0488ab44850835b5ceb1684ce429e7756fb86d885e2da2177e0d9081797aa0c"; + sha512.doc = "aac2e20a993818576f9e1efb153e9285b17b48827a1547a0c1033f22fa1a52f84ede214b4322ce4c6ddff69b8736f214f27370b3f1c006ea6e5fe2ab9fd64304"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.41"; +}; +extpfeil = { + revision = 16243; + shortdesc = "Extensible arrows in mathematics"; + stripPrefix = 0; + sha512.run = "5cfe0172ad420c3ca53c57be33fc56b205ba05a11876e4d14c6d86387788c73370bc0708bee46e43a02f10ce9db4b3611b4ee337ace44fe8fbcb2ca82f88b2f7"; + sha512.doc = "8c2983b2e777e21e95d6ce1b9b4732491ad8a931205adb071877bf966fbbdc4306b88b35db87db4c3fa0bc52cfd333f721de2e1e7d233ba3c91d192a3574171a"; + sha512.source = "6dfefa85e111b39bd46b2f39ae52e94a053569fbb0b263bdf02996bcb122913cbb999ed6c060e00a12a88e0ea9b187fe2e33a990bd75fd1f6f78082d8859071a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +extract = { + revision = 52117; + shortdesc = "Extract parts of a document and write to another document"; + stripPrefix = 0; + sha512.run = "32889da48868c2335866bb5c229728f9a37dcfe552830ca03ad3b704d1f7a471ee120de2ffed07bcf50797f7e34dd6fce53c77f1b63d15071888171d44cc938e"; + sha512.doc = "64fd270a61f5e5f39442a56bb7a20606854b45a995b9a455604139df8006a1b198ae332669de09c1baa5dee5ccdf59e5989d21c17376a764a096f535ceff3f48"; + sha512.source = "c94663034b4069bb47f611b761f08df36e2e69705d491ad0405d826d81d07f0862dd2a7963cc1bfb0f071ca4ac56aedc96debdfbbb35b097a6a49f863ac3de2a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9a"; +}; +extsizes = { + revision = 17263; + shortdesc = "Extend the standard classes' size options"; + stripPrefix = 0; + sha512.run = "5b000d25ff594af2895408f0d83eeb0e7d6dd5604c53d5acd835898197e44fb88ed2469039489b75b45678f28182dc88a0af56ed1b1730be2ce41e6e81f13b7c"; + sha512.doc = "9bfa898f7eab416beaee2938902fc0f3a5ddcf1ce972f30d18a683756fb53bc8f66ef1220bd3bbe6ca6a473959a67c55c18a7996eb095ef301da8b594f42d3ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4a"; +}; +facsimile = { + revision = 21328; + shortdesc = "Document class for preparing faxes"; + stripPrefix = 0; + sha512.run = "3a179a3abcc33bd0f48bf267338c8a7dc0186f7eed097af74cfd8a936956952fb50876dea447839738842fad34c724c057f577d427a82fd82f85c7e8ab80c8ab"; + sha512.doc = "36da402d7b15601ad768aa1e07f356812ddf0a09b30d19c13bfecaeac847537caa3be31036cb80441370b6c046dee24b13aa3e04f339476e9ecd18cf09c8c9cf"; + sha512.source = "ad8f90796cdeefe11e6c12e254c4571f2be57f5cbeca8b68e301d857a0ef8e52fbb1e32eb2d39e6d6b8c7ea19af58f6087c67c9bcee58e84a32038f18bde223b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +factura = { + revision = 61697; + shortdesc = "Typeset and calculate invoices according to Venezuelan law"; + stripPrefix = 0; + sha512.run = "6a90efed09588600991644ba847b16641aef40dd0b989b1944f7b48581d6bae642645fc97023e6cb0f1dde76593086c3007580df25e5997b92593020140dc212"; + sha512.doc = "f449e749dc4b61a8a15062fc9e5556414868cf904bb279c5e997402fbd6d7f21f3e8f19c19af5ab4049a1512070d8e74064d4823d56ee7a20ed03f2a2eaa1b91"; + sha512.source = "d26418ce7f0c6d95a1019f16406f39e791ba79733632cf5072b041a3ea3b70530d08356590aa5305b9d52fda0d882669d52b1bada9a3d0c458c2888cebe35b9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.32"; +}; +facture = { + revision = 67538; + shortdesc = "Generate an invoice"; + stripPrefix = 0; + sha512.run = "30ed6e76f8801f61eeea27679c8c23c050c7d17c334eabe0a00984b1117f046314e59c2c52225ca7d38eb71b93efa57dd563fd582eed500fdf238fac9540b606"; + sha512.doc = "c84aeae53d8324b9e4f1d386dbbc8774d1b9266ca5c8b893a7280bdbc2578dc9e2ca9975874f4d0cbfc5dc10455cac322d9642534b0fc1384a6d7d192a816d51"; + sha512.source = "5d2f865404607f25af2c0704d83b88a359ed5601a970c6798eaca104a2b61bf45745e271c9f19a6b41977cef1119e6981f986a20e05a07ba6053b24c5fcc4832"; + hasRunfiles = true; + license = [ "cc-by-sa-20" ]; + version = "1.3"; +}; +facture-belge-simple-sans-tva = { + revision = 67573; + shortdesc = "Simple Belgian invoice without VAT"; + stripPrefix = 0; + sha512.run = "b37887eff90040c6705396b81ecf753289974f1fc5e7e348db2f0414ed7f1afdc0179814a6c89f0843f310b6afb56e8a3680c787fcdec886dceb49ac5f25be9a"; + sha512.doc = "5d5bd334d970ea18e5e041e629893fa42c391a3de0652516efa258b8919429d1d6fe7b43cc4bb104d762e5a5770fe3fe8ead51c61c40ebaabe25e3d15311bf0c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +fadingimage = { + revision = 70610; + shortdesc = "Add full width fading pictures at the top or bottom of a page"; + stripPrefix = 0; + sha512.run = "c86ff2a9387a4a1e0713a42a6a95bfac953bdbdcd2d0a5b1de918d7f5bbdc39a00950ad7e9ad1705245a7f8f6021a4b3a676540930c81d9cddb7f87fd9bc8477"; + sha512.doc = "1350c995bc94b4d5c8a0d8c0e88dbbe1dadc82cf5b75be09be3a0c3fee90ee6451934154488d5c2a21ce8451fcc7ae8544f7938aa692f96bb133766a05b49730"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +fail-fast = { + revision = 67543; + shortdesc = "Turn warnings into errors"; + stripPrefix = 0; + sha512.run = "dbe4eed6fd1b3bd3c2d48ab4590043c2bf95871350bc1b56f47bb4dc27ef3010097741920ce0a935aaa03fe9e2e8de49db7906dace3be314fca49e816c7451b3"; + sha512.doc = "6c5bcd8329cd21f13a1e0074ef4c4b5bc474babd663d444d9ce48d23ac775dfaaa7cefec393a6ce2bf81ca67c1429c65dbd41511162030b80fd1445c9aa5b541"; + sha512.source = "0703b26d3675c57d5d81de357fdf1b50133dbb2a07710338a243dff8b04370f2af0d1c216d1b1751e1e281436427635a6bb5b226e0f35085f9dfaf9378bc6777"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.0.2"; +}; +faktor = { + revision = 15878; + shortdesc = "Typeset quotient structures with LaTeX"; + stripPrefix = 0; + sha512.run = "5c598fbb40d7b37ee5b66bc1bfa8b0b2a0b45f7e22c992e6d0c85ed952a79a120803d41f9b4a13bcbbd6424c555c8b9ba6adb4eb79d1056fbf759008f9b741af"; + sha512.doc = "57934606287afaf1471f1207af5d0e97533a504aa83324069154e88e70f10779d2eb19ed2a9e177c5a4b2cce4203b576272fd2513d989d4ee276330305597034"; + sha512.source = "01f22e60260621a41e4efd6681b6fa226f7461f47348a79dbd75f214d606c6af2fa54d904792e653d1accc22298385d4cd658c204e653e4320e2932d742da28e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1b"; +}; +familytree = { + revision = 63739; + shortdesc = "Draw family trees"; + stripPrefix = 0; + sha512.run = "2f3cbff39c42d0d6414b372c165bbbf3a4dbafa28bf16ca47a89445066480317caedc9b371f9deb348ba986de2c14b71b1820aa731e74d72a4b0b39a413bf9a5"; + sha512.doc = "55f035425d11f070870cdd8ccd555447861823754a91b0a31f54403013a6427197b3ea893fa7e75e63577635a5896288f29ef052c9431aff3f1a9c2038ccdb1a"; + sha512.source = "b6f8e0cfa54b13a95b4ab39e8a249d50f5d09fd325ed8acde8b7fca736d6aa05432fe3a40554f3c289a678c1349db542c6f321e8a35f5bd486ce6b0675450911"; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "3.1"; +}; +fancybox = { + revision = 18304; + shortdesc = "Variants of \fbox and other games with boxes"; + stripPrefix = 0; + sha512.run = "752e26abee96dd2bbf77b30a6d98d48a1673632d5601d28bba5799e845a015357b96302f3f1d8977f0458003d3456df4694884a05ccb6124b76ca8f7fc84fcbf"; + sha512.doc = "2c3e0466198d392af57b2bda16f80589a9aa9db992272980a2e7ab9d7d1842d7e8f2980003b3b09648cfe0b9a1977562534ca54fae120bd7e4d950d25a83c0c2"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.4"; +}; +fancyhandout = { + revision = 46411; + shortdesc = "A LaTeX class for producing nice-looking handouts"; + stripPrefix = 0; + sha512.run = "0091703483cab573f9c9202603d31e310baafe932f929ad852c23d2ca97f21681637bb3ae34fd3d916f3e50f553b42ab1682b437f5a63b67c6dc4b7b7f202c80"; + sha512.doc = "be4c7b2caf2e85ec192f3aded87309ee2361fbb7e8fd1225f8f98f96446251aacd69e04e306473d06e14c8a8b686dd7a1c54cb0311bc4138fc9c34fa2d528ddf"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fancyhdr = { + revision = 64977; + shortdesc = "Extensive control of page headers and footers in LaTeX2e"; + stripPrefix = 0; + sha512.run = "51254df035199653a78cc06c6b62f3d9edf3fa8c78911c0c667d5043376c9d449ce5a412ffb4e9df2bbd7b7459be8bf43f5ff296015ab2b2e146673290211a3f"; + sha512.doc = "3c3a1f01fd799b8530634ea917523f6a789f7f1b4dddf16e269ebb78ddaf749fff6ca07984044128147fbf5e568837688906c36c409688150f61490565b1a06e"; + sha512.source = "57db137f52c1f93ac8cb70e234985f6290d326f073a30a2eff4806da756126238f36ee87d123dccc71d4f73968e1342006fae63a96604e2b1b858d798f42c287"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1"; +}; +fancyhdr-it = { + revision = 21912; + shortdesc = "Italian translation of fancyhdr documentation"; + stripPrefix = 0; + sha512.run = "6899f3c11ed4a8f7476fe954166ea7576446b670d0b22737766927fcd29eb24e6143ff3031b974856562a7ff55e68f208164729618a4d28d28b856919f2a666b"; + sha512.doc = "cda5ff0581545e4eca9787b27dddcdad226b5dc9a630773b13073e9248b7b30b985fa5f5fc1bc5380e5a0d96f06c666d4e7e73168afbc2fa4ed0dd202967dafa"; + license = [ "lppl13c" ]; +}; +fancylabel = { + revision = 46736; + shortdesc = "Complex labelling with LaTeX"; + stripPrefix = 0; + sha512.run = "950455301b0bf3ea3be0817a45c4e7453ba95c8afd397c1cf9ebf559f160e2828f414f0dca4647a80481f6e8daa0902e24692469023c21ba844afe1edda60b2f"; + sha512.doc = "3a05f2b388eb2a22a0b48b4761b3964c7b0c616eaf0c8adcbd4f375a3dd059b3d3b0831e754842bc084123fff7a12f59c87c5c5b362739c062f36a215dca2ca3"; + sha512.source = "5d0ae7fd455b679221c1877a5a8fe58da76d3db96de7bb6eaba24c50ef9a0bbc3252858276e4f0c6b81161f65e985911ab1608bca21418335e23189a2ddac425"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +fancynum = { + revision = 15878; + shortdesc = "Typeset numbers"; + stripPrefix = 0; + sha512.run = "93e1b88ca722b4169a572285443fad53b66ac59a3c0b6465aad54bd8d416046bfd79897db3d8f318f9d6e004c958b94bbcab16b1183d66197e1078840934689c"; + sha512.doc = "4be390bfd7562e0c94dc19fad3e0f34e52db393878290773517d6d7951e428cd3d0dccf5f47f6f03e5f0b380ebb386c8d89373e8c8e4cbd16463a9cdd2f2417f"; + sha512.source = "8f2f569fbb2a6ddaf371814e26b251286f8046e8a1e923f18e67b165c26c69cd09b46e39dae5fe00a427dbe4f95172680973b3eda7be16c60cbdfe6daf37710c"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.92"; +}; +fancypar = { + revision = 58895; + shortdesc = "Decoration of individual paragraphs"; + stripPrefix = 0; + sha512.run = "2f4e242eabb151834c6014a15d0ae012949e5e35f87bc32374e12f032bbb0fa21d6562b207ba855afaa28c36497cda3ca51eaefa579956f51283c84be8cefbba"; + sha512.doc = "1d972212b86e56eb692cbcca5d7d47b9454a6c0900803818c286b6cc071df93c5444d36eb29a8035e53c65fc9c30582686a6b9203af8e142e1cf1c31a6e4d58d"; + sha512.source = "3f88c040637b50d49981474b38d50cb5c3ba7baa5b6390b53f98e3315d1f17f0b0c48780f4c719583f3e452041ddaeb36fdfa367a616ce07a2758b11db152d39"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +fancyqr = { + revision = 64182; + shortdesc = "Fancy QR-Codes with TikZ"; + stripPrefix = 0; + sha512.run = "fe2a8078e8491384ca4cc25fd058433dde3d4d4fdbd5784ad67150169f1ff5eec85c6f2c2ae7efb6aff6e6fc731c18cc4a156d968872b69d58a36bc042825c2c"; + sha512.doc = "afd49422e17012b84a9ddf9ead15af3eb4f5b0e8291f76b9a672d4a3097d9f390753e0090cb67df94cbd5cc88c45ec2bd67b55594bae9ed4b945ad293e4f07df"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1"; +}; +fancyref = { + revision = 15878; + shortdesc = "A LaTeX package for fancy cross-referencing"; + stripPrefix = 0; + sha512.run = "8f4ea5f16bfdbd06bdbaad76da724a1aad82263f4db2c24cf5f2e9f2db9f2afd9d4004d629098f936e0c2d4dcfa5fba8bd278746b90542f87b547e20abb0bcba"; + sha512.doc = "2231f5fd45d45cb7b538852c95b90db35fde9b66629d17ec9288de6ecf5339359c17fdc8931019fd4acce61ec2927a0cd494cc7462cab0df13d7660106b6a142"; + sha512.source = "65de000487a8d317f0d05ff6d35574cf0bca521e4ab029637fd459b34f8640c53fed78bb9a54c21e4f5cc7c03dab221995810057350c46690c948a9e436c74f3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.9c"; +}; +fancyslides = { + revision = 36263; + shortdesc = "Custom presentation class built upon LaTeX Beamer"; + stripPrefix = 0; + sha512.run = "a0b9ef4ce804b78a60b4c3a25d5d70bb7ec17324d295cfaccb64d166bb1a704bbd2baa5cf6edfed7adff03f48bd3f3e7854e2fbfbbfdc7eb953d567a257a6e46"; + sha512.doc = "77e1839377ba440d4009f30ae6e58d843ec4b7a1bf7f0d3414700e32c9a01062cd6506cb589039299e7a4fd945f9ee5cd951a62fe9795f822089152ca19f3441"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +fancytabs = { + revision = 41549; + shortdesc = "Fancy page border tabs"; + stripPrefix = 0; + sha512.run = "0cd45edda0062f4a0fbc26a0516d7f5b35cb4f8dfd4072830da880369d71d8a4aea6a7d5dd95a0b479ec3128170108f114aa00ef4b0c8324c60ddd214568f5cf"; + sha512.doc = "0113da627d27fe88c4faa87e1564851344dac2efb75c78facc4da49a8937e2bda8e1f22997a2018b368001c24e721cbf623fc199d03673701a55c7ca45404770"; + sha512.source = "4a7c92f30414a595cc8c928b181565e3d50614fb4e5a128197bb4a8f90a50cbd9c75ca447bf37c41e9fe3c05d4422d6e3618da63edc51f240dc3e8d55c8d61dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +fancytooltips = { + revision = 68931; + shortdesc = "Include a wide range of material in PDF tooltips"; + stripPrefix = 0; + sha512.run = "b24e747d4ad811002cf742f6c74855a85b69745661de1cd1d4bcf41ec18ff62d34b39adf56393f79214a1cd4e54f72c54796b00d573e29414825b8c1a3cff317"; + sha512.doc = "4d567cc367e19727815efd49392ed0455dd47d9416d6c1a4cf846eb017b3b3cb0c8060fb0fdae0a93cd05a156422f5ece0ba15e54bf3fef9b2aa8ad6a7c4166b"; + sha512.source = "96485cec2bf6d02338699203cf0afb06a43156a66c7c55153bcb158256bc816550b2a0dd7a20cebc8bdffa84c1e40d1652b9a829746880203b49e80dd0297c47"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.8"; +}; +fancyvrb = { + revision = 69536; + shortdesc = "Sophisticated verbatim text"; + stripPrefix = 0; + sha512.run = "816a42630da356afeba3d7f0dcab924edee8a0d349412cb920a3ee21d9e1a57cc65e1655ba6759e7acd6508532f4ee059512a8997b964f923a59a57f548aabcd"; + sha512.doc = "4dd0ce373ac1fe5b44c6e9470790e372e240f91a8b7add6ed4e0237a22a68309bf8326607679817d5b4db975a286340c469457d8ff4664a7d7a74e65e92a4a5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.5c"; +}; +fandol = { + revision = 37889; + shortdesc = "Four basic fonts for Chinese typesetting"; + stripPrefix = 0; + sha512.run = "309b19d6bff9d3e009610d698a73ba191da70cabd57157f274dfca7583a9e9b31fc30ea52b2b2ab3386be7290a680f8eb47dc92381c3da8251b01d8c6a65c3ff"; + sha512.doc = "d74e78a1c863d3865ec4b21a4c762bf6e2c30a8656fe0ec830d1e56b9fcb48861f316ccf8d8641e7c674e25f1ac2292d10ff2127315275347096ad325828d7e5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.3"; +}; +fascicules = { + revision = 54080; + shortdesc = "Create mathematical manuals for schools"; + stripPrefix = 0; + sha512.run = "0d6318bea8660796a5ddeab06c416017ec2075633a391a536c7c3355de7b7e7f711e74f0e43e8b4fd39debfec797164f1961eb27776ca3b53eee729d0e27a479"; + sha512.doc = "ee9a54c4b2d746577e94abb6d458c473f88bff18e4f0f57bed5923a1ef08c6ca533183ad9e9eb1d1bcfae6aa5082d88a9c08fe7cf96c3ab9d71ab099ec64c1c0"; + sha512.source = "c5fec67754d84dc42dd6c62267c8a906a5717f53d9c063efc51b6cc45f3f616d270fa3af2658deac438739cb231bcf9b2c9497477c910f576ca943b80e03f3c9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +fast-diagram = { + revision = 29264; + shortdesc = "Easy generation of FAST diagrams"; + stripPrefix = 0; + sha512.run = "cedc8305ba0a7b1d22274d869629a1872a80a4001b443c8baa93e44198a5dd88e39c16c28bb5edf9fedf4f8f2f68c6964f009cbf6feb21c7c14974c4b598acbb"; + sha512.doc = "cd8e3edf882fc16b5757f59d16ed1a479e437eba36c783cd86cdfb9cb81f8b30e8b95a522ef6fe4b6e22b4b0bf6637e72bff734f7771034cfaf85df935e4a003"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +fbb = { + revision = 55728; + shortdesc = "A free Bembo-like font"; + stripPrefix = 0; + fontMaps = [ + "Map fbb.map" + ]; + sha512.run = "d63e140b60941f114b7aa7c82888c224715d6d173b88ca85aacdb3f7635aa928846e804e807830674d3bec0fc801435eb9e07406270c156d40e8c1994f50aa3c"; + sha512.doc = "c63214ea5a91ea6bab66a866a65c2ee43c64f49afbc3235e2f55cc0de89fb3a269bea45fb7d67ccbcda4bac3249b2f2ab14f780fde7cbd112231b16e58eac67c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.16"; +}; +fbithesis = { + revision = 21340; + shortdesc = "Computer Science thesis class for University of Dortmund"; + stripPrefix = 0; + sha512.run = "3e593e312ac8efbbdd294e6a00ec020678dcb12259ae778ddaed4d43a800aa19ba16f8eb15b5122ab22f44c5e23c77e4fe733c7772929ef55589d387985db694"; + sha512.doc = "92d0ae3382aa71260f6ed204f6bce1bcbac26985f41789e00c5d3186dcd448bd169b7641fa40d34cf87c556ca10573b0d8cd4235aaea8a0d1533dc40c71b3779"; + sha512.source = "a931b41de1feb5b0a78bc40c20bafebeb529a8a8b351344020032641ecf9673168328dc271228130ff22ea17190cf021b1dbe01635d7cf77984f69861c84c02d"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.2m"; +}; +fbox = { + revision = 69041; + shortdesc = "Extended \fbox macro from standard LaTeX"; + stripPrefix = 0; + sha512.run = "705a0f1f6d5009f0ac2fa1059f3029ef7bf7e8fdab6e85bddba822eb50dfcc049f94b7ff43afc97234d44f42505e1cd4e6caac1f22178949dcaea0a60e572281"; + sha512.doc = "19a61ddc64c3c5108ec05089e988a07f0e10d772bed810898bf82046922eab58a389c3816b15055b5c2e8a4d1392305a351802eaf3f1e72799c9c192eb8c1484"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07"; +}; +fbs = { + revision = 15878; + shortdesc = "BibTeX style for Frontiers in Bioscience"; + stripPrefix = 0; + sha512.run = "2d5bce7890fd8e087e035e60064bf134d8ac7ca2646f7b846df8fca7c594843c2778d0ad1752ffefed40283153194b5da97156e866bb4b8bd10b14c8ee3f2c4d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fc = { + revision = 32796; + shortdesc = "Fonts for African languages"; + stripPrefix = 0; + sha512.run = "12bb408f7ba4774d943aa954bd3d2558a329d383a65cd4780f6c5bdc39f51b943f01d87ad203aea3b02768dc0b9ab42f681175c18a1e1dd901255aae05156558"; + sha512.doc = "a7495a0d6bd394811ff22438a42afe3c5109633da7c606a732f4c5746cc4162fa1c86ac3774aa7754e9b07c499f3519423d4b6fb212ecae156b0b8e8f848d914"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.4"; +}; +fcavtex = { + revision = 38074; + shortdesc = "A thesis class for the FCAV/UNESP (Brazil)"; + stripPrefix = 0; + sha512.run = "db440d7310805a7f3d918996e577a07c5d8dff72e6d667f00c1ffe5d88e3bcb689e794837609d9a0760530e923f9a28d3e5c052cad4c38e23ae03454e0ec26c4"; + sha512.doc = "2060c70b6a926aae23c145f11c7c6e255f684f925bf5447ee98fdd6f6290d64fc5a92ccf8cbf85e0c6f0d6fee869a2d947e3df8726fffa4a5d2c87c217beef59"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +fcltxdoc = { + revision = 24500; + shortdesc = "Macros for use in the author's documentation"; + stripPrefix = 0; + sha512.run = "c14db194a73247122e589024824a53125ff10e15f8bec2475530aa41e78d74993f73474ff9b3899bc499c0cd8dd3e1ea034ea821d233c2a512f8c4d4d06d095c"; + sha512.doc = "4aa6aed9c5b4ddaa63eb2aa7e529da03dcfc57723a6cb40cbbfc729636e459f4df1e292bdcd20093595cc3ea154787fda41abb4f6f46db2a7331626f181f47d0"; + sha512.source = "6b16053cf7941063e4f08a249d1b4dcb61127eb0f22938353b17b959e7a9cb78d7953b81346f25a6e49f4a7c8bc602b3f820c3b9acd3b84215796b3ef1a63550"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +fcolumn = { + revision = 67729; + shortdesc = "Typesetting financial tables"; + stripPrefix = 0; + sha512.run = "0edaa6ad0c01a2cf9cc06c65fec3bc13b85be893d7fcf4a92b0c8760d1999e5c3b90975e44c586ef104b020eaa0a18cfc4476b3abb243c5f2862941864113bd2"; + sha512.doc = "9be3c50f25522c3fafb52432b74f6ab755afc02df04da84383ebb466bd9424c716082d3d6ff176d32c03c9097b6e39c6f54e70cd8218784492d2ebe37de0ebd8"; + sha512.source = "e122343109c0367d3f22bfc2b3775ae10545a01d18908cd227422060ba3c685e35beae26c6892479e03c3a4f774e2f9edfcfd60d6cba0880a4279e610de1050a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.2"; +}; +fdsymbol = { + revision = 61719; + shortdesc = "A maths symbol font"; + stripPrefix = 0; + fontMaps = [ + "Map fdsymbol.map" + ]; + sha512.run = "e8b2d08c3e64def77a688dc9d96c0b9da9eaa4c942e571578fa0a7e6dff9eb3910ecc66a7be9334ecd41fdc0023f89d8c98facc2d42cd0095c75d6e1b4da69ac"; + sha512.doc = "88efcb300a84b6c214fec37603ea23cb51043af78e1af8aa6e3ce157bab1c8e395e71991c7ea7854051f4706c6b702fe0d48edd76e919a4592e57320b1f77b98"; + sha512.source = "7be26193e05d57fba2a91d57b49cbadaf5594d9ea843b9d9f1ae15608cf7d45e40112aa286bee73ee16da976c7ca7bb7aef5627cf8f0023cded506a493426b31"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.8"; +}; +fduthesis = { + revision = 67231; + shortdesc = "LaTeX thesis template for Fudan University"; + stripPrefix = 0; + sha512.run = "e495c127884aecc1856b99705c262882b390f9e800dca59c2fa1200ae584a424ef4ce7752a9bb5dd7aad9a94c4a685af557163f2b07327e80f5b99153532d915"; + sha512.doc = "31a91fa609f3ef8631d6ed57526e932d5c110e4d84cc78862d1bf4c682f8de97c080a1e2d82e60842b731e33505b99dd2a85ae899705ebc45de44e526358703b"; + sha512.source = "d2cee0822ae532782bf30e1cd8b07b65a4c7ec3cc29901b10a25d81c4cbc224a9724a6ab2a1e7bcd8ebdb05f6936176d95783198f6bef20dbefd4e80ffbd7349"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9a"; +}; +featpost = { + revision = 35346; + shortdesc = "MetaPost macros for 3D"; + stripPrefix = 0; + sha512.run = "9d7c35499df5c8c8efe8ea51d88c4cd9ddc6bd5238ec527d842aaa9ce42c30bb1d73c667f5aca22f385d3725c7443f043a2b63cd337a7f6d5b5d5810ea34bf64"; + sha512.doc = "e4eefb43d63c6522c3080a76b4df3a369932bc9e2f868ed0143d62fd2365bb74e6891705b287d19b4ca4b2560b0573d6ff9a0e5cf2a3da2e4b21482cd6cdd0b9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.8.8"; +}; +fei = { + revision = 65352; + shortdesc = "Class for academic works at FEI University Center -- Brazil"; + stripPrefix = 0; + sha512.run = "2be4e4d83c5a02bfd43eed59741e07868e0e22489bb087f91de0681dbb04e999cff2bb9441b87937c3e2cfa60b7d4a1641dce4529a5aabc15df12d70e22e521a"; + sha512.doc = "adb30683e075801f74cd87bad431c880ffe410fdba738b197932af4f0efdb1c6530ddd66c6c860c1097b4f9e37601a1a9c744a1b573396c29898f130988174ea"; + sha512.source = "4241c9b50e339c450ca124285205d6fd7d2d2f73cab829c0248204012420f5ccd0615a1d1986cdec8efa15b2c8b8ed54ffd1d815f22ad0f9aa8e05b9ad485c07"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.10.4"; +}; +fenetrecas = { + revision = 68779; + shortdesc = "Commands for CAS-like windows (Xcas or Geogebra) in TikZ"; + stripPrefix = 0; + sha512.run = "6337deecbd49a9ef9d19ab31cdd705cb49bb127ff451d9f3790a3ef8fa95ee7b65f52d49d22b1698d039fe268fcc178c07f30dd66ba7aaff69e883594e6956c1"; + sha512.doc = "8fda8eeac400f810e3839f5197c53b808594c2536b1d4a5c7c96c788b8faec40a4efe403b065519d20f09cc1d14fe80e9e060d2b8e4a396cc9c1ad34dd16fc42"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.4"; +}; +fenixpar = { + revision = 24730; + shortdesc = "One-shot changes to token registers such as \everypar"; + stripPrefix = 0; + sha512.run = "1b09294b430bb9ab6a4eae11549500b224514e55bb99329a4ee3d9d72ab906128063537302f672a772c02ff4372d46649656a88c4a303a9301976fc7a804387e"; + sha512.doc = "6ee02d615438e99df82f939a8104097e43802b00af2a0e7be56f329061722cfc7df0edf84c82ac73754d63a703533bd6d5b88b6e648bedbc47be712ff86ec5c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.92"; +}; +fetamont = { + revision = 43812; + shortdesc = "Extended version of Knuth's logo typeface"; + stripPrefix = 0; + fontMaps = [ + "Map fetamont.map" + ]; + sha512.run = "20c5c83119d70a94e66aeec0bbb9a0494525deaf9addb9b91d8d5595397ab5a1195eb9d72056a5fd1c3ca490aef66b43558f5c5b86688e7d164360a697c331a2"; + sha512.doc = "16cfb520cf8b3030d546e1c7f7cd41772fc9d16ea55db6920a50945a7aa3034050d873d3d5da05c108ee303dc1c77217c8a1f014c2e9beaf36d932e33aefeb93"; + sha512.source = "de4a25f0a86f29d10fd1cf799ac6c8efc58633a7ba0c48bb33716c46e6b0e1c9d5be6ee4e8e4955739ddb324270e44d6fa658c360d03123c18cc275ba6abff06"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fetchcls = { + revision = 45245; + shortdesc = "Fetch the current class name"; + stripPrefix = 0; + sha512.run = "6cd8e2016f7ff344aa06587fbfeb4e498d1b2e76d9a6ff64f167dad71c4ce6ae867d791660f50e80b6f2e59a9f2fff4c4c9b7c1cdf84cdbbec5113081b24a25a"; + sha512.doc = "ebf9aa0150b06a0b4674e7be076fa5ae4b2ba4542aa28e1b9d4320ea0152a5cc9cbbf926d713f877e74ea948d6132fc36898647e4790c67aab651502c4e5d57f"; + sha512.source = "067385746ed2cdba4501038cbc4565bef431f2e35e9069fe883c0de8669cbf6f59d8233ff2f561e8590fe8b32a7613a195104f89774bdae4ddd63d65deb3123a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +feupphdteses = { + revision = 30962; + shortdesc = "Typeset Engineering PhD theses at the University of Porto"; + stripPrefix = 0; + sha512.run = "b4d4285b33f314720cd07eea903bb2fc6092f96033f75d4b06cf315fd24d1a34722aa73db4cb6410a847e1d23a131ae329f8ebe75fca15dcaffb99097768f55e"; + sha512.doc = "d87c0a7722f62a599bcc63f7ecfea190c64d82a4a4a1ba21d18c69866f80ec77a527a82cb94b0d081002073f5faab95119c6902e8f8f2c10d815ca2d206b1d4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +fewerfloatpages = { + revision = 58058; + shortdesc = "Reduce the number of unnecessary float pages"; + stripPrefix = 0; + sha512.run = "4f5637bf431b54590e8c2a8ec27e3da3d801205b8cba053c8c1294ba0882bf8aef17a0e291c149799cfc3530a415202014570460a6e2e8986ef71bd2cc05567c"; + sha512.doc = "a18d15933e6efbbe3428f366bcc5ba5ec0b254dcf77f7ac2e72c19bba00e78b44c98df34f57468902101f547fe9e88b2033430a02098805c6f0072e68ac82513"; + sha512.source = "e98684d4cb79477c66e4a831c8571729b3da021bf9945bdecfe8a9ff57fb1e2948c42c3481adea0fb702ce4d56ac533b14f76e78c182500431af7f3671491d7c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0b"; +}; +feyn = { + revision = 63945; + shortdesc = "A font for in-text Feynman diagrams"; + stripPrefix = 0; + sha512.run = "30e3ca5e633d040fe2eaa88463a8c9fa6004b86c4ae264af9b8a9a3bf55f71f7e1eb21e656f2fa194ebc751648f411a094fe40fc6a2cade1fc31aa586da1317c"; + sha512.doc = "b420c19b69caf39cfa0e54bcfc90f291d9ddbed21d771669bf82a0fb04b4099fd494d2287144655366af7d0ea9594a74d64867a31754278ab1b97ffa507dfc5c"; + sha512.source = "578f093c588cd577ff696dd052ba969769f418dffa3b2450b71efeefd885105efcdc7be4ef9693bedc911940d2707eb084857f5db9197e74040211a9952d2209"; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "0.4.3"; +}; +feynmf = { + revision = 17259; + shortdesc = "Macros and fonts for creating Feynman (and other) diagrams"; + stripPrefix = 0; + sha512.run = "d4eb87e3f086f2d39c87eba057fc490ce5d39e9c5ae39aa1c04ee8c3be9c4a188ef123f860fe74d31e0e9e9182909c39df3434ddcc618632723f00627f66397f"; + sha512.doc = "933edaceff112f7442f7c662fda43f343b0e7e41f65aae4f1a45bfd2de18c1e4bda505a235eebc4daf2451846dab376449242217ec803f2932a4a1584038f4ee"; + sha512.source = "bdc4dbbc449c911c0d516b10da18c1d541645ec57fd95c163d571a039c70ad46e6111717ffc86c802123c272509c85ce1d71d90f49578b2e228a9229f4d40f02"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.08"; +}; +feynmp-auto = { + revision = 30223; + shortdesc = "Automatic processing of feynmp graphics"; + stripPrefix = 0; + sha512.run = "64ca275292b12847d823322ced9dbad615a34089c8cbe43262e676b34db205ed56509f641e18e949523bd252ed1ea73eeb5f019e2cd052274c02b1df67860a25"; + sha512.doc = "3dd88f5af739013ace4fd8eea70ce247b997e887c0f7067040ff9bf4e0300126aff53845ecefafa7bb52dfc4d05d181a1e96847e6a534c718c5a7447231539ba"; + sha512.source = "ea29f32f9f1c628d63b81c958f7c8064e884ba1764953dd62fbe5d90506547846f52fe378f813a09090ef6991c9b7d2905095b04fdc0e26aea4c8cbcb5e2b2b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ffcode = { + revision = 69706; + shortdesc = "Fixed-font code blocks formatted nicely"; + stripPrefix = 0; + deps = [ + "environ" + "microtype" + "minted" + "pgf" + "tcolorbox" + "xkeyval" + ]; + sha512.run = "0047a3b5ae171d3636a80ae583e2413b805546baa662862894dbe6dba92f3e4c20fa1b55d1862dfe968f0b738f2067a4aab294278b1003c864b5c6a8702590eb"; + sha512.doc = "72f09440fd91ecf532ada964010fcd364ce30abb200da2285aec45a2bc1d11b97b7b557f19473e26cc4d690e96a9151f3cd8129aaeb28eaa3d3f26ed5d230333"; + sha512.source = "eaad3fcdcfbceeda1c991c5961094cd470b384e4c749ebec657c5b575190b35eb28ea7ee88aa113b829f1fffc225a61f38d5c61e28bdbefc133c55565ef03daf"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.9.2"; +}; +ffslides = { + revision = 38895; + shortdesc = "Freeform slides based on the article class"; + stripPrefix = 0; + sha512.run = "393903c180f2fd554178c909bf9a4c060707d8f2fac44022b4811526c7b505a0354afed77f8ae0fa3fbcebed3918a6b46f9e81206be78d7ed6b1c959cd3473a2"; + sha512.doc = "4a8e176b7bce3d54464a30497e41d5a899905a0029199710aedca7234612092f0b2e265a465084536434c9b8c7f45eec3f2ac3df5eef66cecfdae5cdae36c798"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fge = { + revision = 68353; + shortdesc = "A font for Frege's Grundgesetze der Arithmetik"; + stripPrefix = 0; + fontMaps = [ + "Map fge.map" + ]; + sha512.run = "0f97109ffa1daa97d4ad496c2e948a123a9fb04393e668c9c3b1a14131f6ed7a21ac9056c6f3766e3ab2d3a2caa2baeb67c4b59d6c6489299090976d697e10f8"; + sha512.doc = "8505aadb706e79e6e1d0faec203de577cf76acef5360ed7c29febc2239d2719a717a59e9d4f8fbf5d2eefe67be1ec3cc1ebbf9be47930750582df29bef2fa9fe"; + sha512.source = "c1d966e094ce4a61c6250717731a20c3db0a0e438b5d8acf1b5332cd05a2f6dfde1d0e99bd02ef5ee725c1242da9ef183f680a03bb7f10d7ed50d0ce4c2bb1ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.25"; +}; +fgruler = { + revision = 63721; + shortdesc = "Draw rulers on the foreground or in the text"; + stripPrefix = 0; + sha512.run = "d30678e5f84074c9844845bcb527333a7040b9f9e787f8aad92103eaf880e89bb1747946cd91fb9b8229c9a8fcc8e2ff81c3dc69804d37de3be1b1f6a4cc5a00"; + sha512.doc = "74747c385452b4d996f70413a88920d59b4ac8f4f61c92516e4e60f36cce68c8ce9bd72f621aa52698679aa10542bb2118088058c489230e7c2081b17d8f987f"; + sha512.source = "3d7017aac6c2d07cd73166b1aab65452b11a97a7e34516c75c1a8e5123a3587eb90b0455846b82084a6e997340624c1a1053fa079bfb202a558ff4dc08398cf4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +fifinddo-info = { + revision = 29349; + shortdesc = "German HTML beamer presentation on nicetext and morehype"; + stripPrefix = 0; + sha512.run = "86767390bc9946b8f8d47dae0334d7cfc21ac2b064b00ab70732f7ca3f50d875a35dbb0e477ef1c014452fc14c177a1c5c6b96ee334c99bbc2bb49eee9ffe6b9"; + sha512.doc = "e6635f5cc989bfa0da9b2b0cbd5c3719aa793552f4c1adbc1ee218a78b6b116d2c2046b04254e3294834e63901ece9489b8c86421afd3c58aeb8615b5859ee92"; + sha512.source = "f01f2453c206cc7fefaafd1269c77b43bf1f24a8fef034ebdc40ac2be5c4ef553d2096f4168e7933e63aa816b1397c74fe21d725f0a6bc3d8187c751145a44a7"; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +fifo-stack = { + revision = 33288; + shortdesc = "FIFO and stack implementation for package writers"; + stripPrefix = 0; + sha512.run = "4121e3cefed7ffe80bfaa8b054ba0825ab0fc2b4073a845386de4db3650b4d68c48a4f7378ffcfc4a221b21ad30ac6e199920e7d8c44f503b35c14cf4c001462"; + sha512.doc = "220d9b2796c20251ae568d1dc5a7eee1fad5cf6aff26a2b94c1a2c9dd6d853dfc9c25377ec8c3d6edfc43f5b4cf645c459754c5d6a642506fa7779cf79f1a901"; + sha512.source = "3ab0e67acb7895c527be3cee1ab0fe7ba03397410f9970dc7c286418ae6e785d8051b82add959ff7d0596d6983ae6514f70c631672fce5c66bdb6542a3b7d777"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +fig4latex = { + revision = 26313; + shortdesc = "Management of figures for large LaTeX documents"; + sha512.run = "3f01676ea85d64e09376da4481794e1537b9e19c0ff0bac77c022b10b5d49c39d789de6e4f0356b4ea4b23326f9ef320f4b08035bc04a827951cbf44ed7c6228"; + sha512.doc = "c05d3c08b916785b765694e68b8f7cd96c3c359325e8f84166102beb4caeada7490ed24ad0b4f52a66cb822000f8b4d75d1013b93055898e88e82d7f23d5095a"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.2"; +}; +fig4latex.binfiles = [ + "fig4latex" +]; +figbas = { + revision = 28943; + shortdesc = "Mini-fonts for figured-bass notation in music"; + stripPrefix = 0; + sha512.run = "2fdc1114b03123c35eccd6b617310c714f37015620551538458a1a49b1e9a583aa55b3cb661f204bb9168cee0a7325b066d64315a15a94daa01e43d05bbb2561"; + sha512.doc = "7dc8140b3b545d2683c471e2e2907a58e2c995f23acea26d763da8989c3288940dcc154ffc0f81ea99169ce574bf90543e94f86bf8217996b7c83474a300806e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.3"; +}; +figbib = { + revision = 19388; + shortdesc = "Organize figure databases with BibTeX"; + stripPrefix = 0; + sha512.run = "1632b372b06d8ef3cc363d6b05e70b8a493f357fb947ca1b8fbb7752d7ffc4ec09904e747a3e9b91b61e5d094c96eee954d533d1b286b372aa57244ec2abc63d"; + sha512.doc = "ba42f6cc811fc9e00c41bb6fb410a57a2efe759a0fd0621cd83801963d0ed138dc66a1a245a4b7256cb056f3fe71e883a8fa84d19dda785ba24825e85edfa044"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +figchild = { + revision = 62945; + shortdesc = "Pictures for creating children's activities"; + stripPrefix = 0; + sha512.run = "74775cfe7d7ef14acdb22bc6c60aa4db512183441828025c8e68f30e9e95c4e5a1492c99a31f459035956a0c50de054bbdb664f9cc68b73879d96a4ead5f2dd9"; + sha512.doc = "68cc451292f68cb433ff567252837c438938a8d16c4e48987abdd76bcafc9dca9482ad29c540ec24cfdd66f55da801b9c3e052615e805de055c944df82f3971c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.1"; +}; +figflow = { + revision = 21462; + shortdesc = "Flow text around a figure"; + stripPrefix = 0; + sha512.run = "f75517b5c43119d33edf46fbe124523cacf0d7d837cdf66af702ba563392a96323b266bece1ec9e7f87df34d684a87ab38f9ddafab6c3d069dca8ee22c3bf25a"; + sha512.doc = "c972bfb356731aa119e8cdf1292a3bcbfc08a74453feb7e509a5cc519f62ae6c7e6b0c087973549b9d860b97ff1a3bae9cfd1166c4ac6a74553ca6c0f463694d"; + hasRunfiles = true; + license = [ "free" ]; +}; +figput = { + revision = 63957; + shortdesc = "Create interactive figures in LaTeX"; + stripPrefix = 0; + sha512.run = "4ea2768b272f9be270f1ce3edf02cd73b8d8c792d8b92c20a8d38b05649e43e8441d6e439f0e1be8ca906c5b9a47db1d6a48ff7ee136f53dc4ae09cc6172d46a"; + sha512.doc = "54c8428c9b0bd267389a9bf25b005b31365fc9451d0e3ca4632e52a07af9c02a24aa1c7c9b5f19eac196f4dbfad9db91647cfef82c301496ec4be58d9e2360cd"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.90"; +}; +figsize = { + revision = 18784; + shortdesc = "Auto-size graphics"; + stripPrefix = 0; + sha512.run = "3c7523b05d04363c57c1ba75a39d9698b1648ab6a858be15112b6f47c052742033e3ed16752a9b9ef3854ab93f547f0841c32f1cc68fb9d4538fc02a7bb19ad6"; + sha512.doc = "598f631423a97e189c21e117a7da23c95bbf4dc3b616e62fc6738674848fc46be4d7dd43832ff58ef834c0fdbe35d8923ba9729d5c48f90b0431a22bf86f79d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +filecontents = { + revision = 66740; + shortdesc = "Create an external file from within a LaTeX document"; + stripPrefix = 0; + sha512.run = "bc51c03ea84130753cf4c6a6e6efe39403bc48a47b4c40f177d3ae17808c63a346a2b361ef61b0e0421094b6b64e20a972c6bcad305228ce0991818a62344296"; + sha512.doc = "15f34d023a498c733810ddb4b04c1672507d97d731a579246fcfc3f29afcb47da73429807c4fff018708ddbac76851ab8357dc274cb6c2506cd37d075d2dbb44"; + sha512.source = "8b93ff5a1cce54150c67bc607e67a40788dd0af08bd55163380756ce6979f3862b4cf1d70888b7b4ddd7accf078a387bf8540cb97af491b4d67bce31600fb8f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5a"; +}; +filecontentsdef = { + revision = 52208; + shortdesc = "filecontents + macro + verbatim"; + stripPrefix = 0; + sha512.run = "63b399a5e21d2d4946c195f380a0d5f269f8c978c0b504cda80c0796604dfcb66df38ca79d31078efa03c7475967bc0ebfb856e933bce6b21d12836368780e2a"; + sha512.doc = "26e7ca9971a0683325b62e2feeeb0db6ecdd3a732f07ae93515f2300ed58e97a44ff8a7504d194119c1e27d1d9bc4f367f29c17458c0e7f0b6a0a61fe18ea0ca"; + sha512.source = "f6e822a28e074fece05b911f0bf9d262e2b925c2a73559764e1eb5131d9081b48ace0ead5f46bb250bf648eac204eb1d5d7b362be508f58b40a50f70577de534"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +filedate = { + revision = 29529; + shortdesc = "Access and compare info and modification dates"; + stripPrefix = 0; + sha512.run = "5e2789c065459e82f073599c4d5f04c626fedae7e02c8dc58d6595d81ec8281c9c362592eee9547369b7a8e9cd2aed1ec526d69a8ae22f35771d5494e3109032"; + sha512.doc = "cfc2eb596e6b6d17015ab2ca061da39e673376d6f4c526dc045c8d2514fa8372f1a853a97425b4bcb9eb0bdc522c6b482a9bc3da9f56f8a4e0c22e4970a40575"; + sha512.source = "cc2a12c8f3b9e7391d6b57eec6c0f486137524022d89d3d3e7c037ab468a4858b253e8baa1cc8eeb731510c5e221b7cbe9a9f22a972023b3d1fe2f975e4751dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +filehook = { + revision = 64822; + shortdesc = "Hooks for input files"; + stripPrefix = 0; + sha512.run = "caa1f239fc8300f2925e94e860df3ac76637e337d57f599446c6b5f059fbba026fa9e440f4272b7e37ca9921731cddcbdd403c16e42b9c49e302452dc940fa27"; + sha512.doc = "7c86e322cbdade28c03b65580c992adff2fa112ae65b28c1485419c457a7f930614337eee70bb6cc2e9c386dab866e4e657c0b8d394c975c6af3a8b2fe651cec"; + sha512.source = "c9683da993eb365559e7d47e6c81235065e9ac74c9c334e9e1d9c040c9cde0ae135301b83e49c27307a6f3bc529c24d8f597dbdf377256d03c8d149e69c03bfd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8b"; +}; +fileinfo = { + revision = 28421; + shortdesc = "Enhanced display of LaTeX File Information"; + stripPrefix = 0; + sha512.run = "2e5914e32af48db731aa83c3e51e6d9128dc969891bce21e1e2f859cab79130c9f5caa0f591765fa8a9b48c38eed8d19305f4be598430ab1e2cb3276b6faf191"; + sha512.doc = "03b4ecbd21ec39d98949f2e8ece7e48bd539a75051350d1a9ea19e3d32ecd620c0f1a5dc454e626237534114d0430e2ad7c175e9c1b27ba15c78a35aeca3e3b9"; + sha512.source = "6875ecef667da4476def344901db38f38e988d2345c2afff42fb812c01c356df8bf1dd3c8c9a563a883fcb9e22e85b8813bbf50905d711004a439767ac0f7227"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.81a"; +}; +filemod = { + revision = 64967; + shortdesc = "Provide file modification times, and compare them"; + stripPrefix = 0; + sha512.run = "e346e795df32a3b0cec0232da9c2b190bede65d905035a758b949c9cf01219e0880ec2ce2e83201f8dd9dcc77a98b29df2b463edf8c44cb1c220a7efe7c9f24a"; + sha512.doc = "3e8c5a26b5c2fc8a6f713f006d091c0be719bde7bbe237e49d2496032289d67624fbad1319db421a0471a60aa8c11c97bbc60127053904725e53e75a2ae6fd7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +finbib = { + revision = 15878; + shortdesc = "A Finnish version of plain.bst"; + stripPrefix = 0; + sha512.run = "14f08cdc92a2d6d511c112c480efb0112d45c199023e89c9314740c2b9b83598bc9f8917ce616bb2493671f408f946ada3de4535136eff48b7bbf72e7436f912"; + hasRunfiles = true; + license = [ "free" ]; +}; +findhyph = { + revision = 47444; + shortdesc = "Find hyphenated words in a document"; + sha512.run = "aea6305dc0d9b31367638078a7958933468e761ef4cf47a1c44d9fd5ab2e25f7af22273c4631946a90edc9b51947c2e56b3d4b74c8c59f0a79250c2edf5bc137"; + sha512.doc = "97f3fa22fe490d21bc9e5ce5ea0b23ff25ab9afd9c5dbf6e8d78b24fd306ddc132c5ba7ca7ea7e3d7aaeb48993c7968b0c02ae0b765416a939d84b53171f4179"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "3.4"; +}; +findhyph.binfiles = [ + "findhyph" +]; +fink = { + revision = 24329; + shortdesc = "The LaTeX2e File Name Keeper"; + stripPrefix = 0; + sha512.run = "837a470970c8376e1d699b28954cf2ac6ed849c2f96a4c17ced56ebf142297c36d3f856f9cbf4db920ae33f491738f7891433c5c6627565a48fb5391b663634f"; + sha512.doc = "7b1d9d1c62766082030d7632bd91c65328d1bf3e8bb6abe4ed64ec5188d9f38d3b2a99695f32c2bf04e2fcd634819926ba923eeea915186eb9fe96bcb43954ca"; + sha512.source = "e37a35a9c292ad3f213c560505ca6c446eda397771c18bb1fa2b64df70cd667b58ca03b6f821aa0a9d6bedb3910b66c411349f70dfe3eb5ca2f1fbdb9f925a35"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2.1"; +}; +finstrut = { + revision = 21719; + shortdesc = "Adjust behaviour of the ends of footnotes"; + stripPrefix = 0; + sha512.run = "8b360a3426056b61e58e577cc68ba9e2f55b63a3b4a0a2eb76ebee53e9ff327da9235e9da5cbb85e3cf369cd48354c00a79cd46110ba4adb4b64192b7ff7b603"; + sha512.doc = "8cc27d82f7125b5ee82585f97385924737406e45d9739ec9cd57b76736e902a588c7258628bdcc4841e3e23f359a4d8ad22a31ed6f821f1d1c59798f4e8f3d56"; + sha512.source = "c06f1b10815444ed51b13d83258e1f3d246da65a581a0946e7a05a9c8432e78ae395efe18ff6c0a84db8fdf6016ab8dbcc6f3242e72936f46e522d1074ff1b87"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +fira = { + revision = 64422; + shortdesc = "Fira fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map fira.map" + ]; + sha512.run = "5faf4cdf1690f9d6c690cddbef813c8973517309144495016ef5d61ff5e5df9ce73f70b262d1c36ba72fa92f93c7a1d550b96acc4965d7ab88efce21ee20d682"; + sha512.doc = "b97fa7ebaefc3a057eae0a3fd14f43fad1a9789af0b2c43ca8a0c6969610b1786e24508b1367002527841a8095486d6eea180c59d95b1df904df846c943b88f2"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "4.3"; +}; +firamath = { + revision = 56672; + shortdesc = "Fira sans serif font with Unicode math support"; + stripPrefix = 0; + sha512.run = "c18ab8b2e12b947144528b196c9b1de7f1930f3a38338bd114bb61205d7f910fbf1e3b20ce48ad8228fc24b14d734ae68c3c8542218a058120a62783b007461c"; + sha512.doc = "4e434c757b4ad4c82397224ab275db9a0783994dd9e3acffaecf19f73b3bfb86dc6f70c2833b2f203ec354aa275384d1e97f48deea9a765b3d972eede02a35f1"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.3.4"; +}; +firamath-otf = { + revision = 68233; + shortdesc = "Use OpenType math font Fira Math"; + stripPrefix = 0; + deps = [ + "firamath" + ]; + sha512.run = "6c713fe81dd006707b987930e8c8835c21122607d9488ce997bd9b76cbe85bb91fe7017f4282fa91c11ab41827ce70de62d0baccc78a543d56b0d873ad153c12"; + sha512.doc = "39c2eab4cf1dc638194d81effa1b442b87e96b1ebb2efc72d0ce26041bb04fc3cee8f44b939f904b07cc0332708d8ae8cd7a1f41087d363888306c0f0583274d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03b"; +}; +first-latex-doc = { + revision = 15878; + shortdesc = "A document for absolute LaTeX beginners"; + stripPrefix = 0; + sha512.run = "39641224689a1d45d59b5643e5037599d03df3ecbe95090d565778758d334bddf832e867a25c1688adbee1f99eea23b3ed21fd6729fb3d4e50f1503537c9a400"; + sha512.doc = "497080fdad8195bdc43bef476f9e678b49d83829f10a6653c9443d327cb0da8505623e941cd3038349b6307ee37a65ce1a3d3eb48e4c6262f9d636d10d96e17b"; + license = [ "publicDomain" ]; +}; +firstaid = { + revision = 70324; + shortdesc = "First aid for external LaTeX files and packages that need updating"; + stripPrefix = 0; + sha512.run = "610aa5b4c12511436b7b26145f24c294a3c98e75a9b4211198c144e8c0cd58142853d0d581ea0bd620a4f01f48bcc186c40db1d0a27ecc559bc5ba012508bf59"; + sha512.doc = "36a0180f0ea5410157c03fa26a7c185229f5a6fefe517659f6cd1d5cce7425ee18c58909f985f500987bdf1d9993bb0d24d58dbac21121cd0bfedc384b3de57d"; + sha512.source = "374f4edef549e60798f9a44ba2e795f2b4145acf7164fab9ea170baf294670878499ab9770dd3c0a1d1df49396db17b827076b3e5049437e0d8d7ea1e7686f64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1c"; +}; +fistrum = { + revision = 66461; + shortdesc = "Access to 150 paragraphs of Lorem Fistrum very dummy text"; + stripPrefix = 0; + sha512.run = "7e0a92affb0fbe23b9d08e525f6e2878e3bfc10133fc95b41bbdeebca5c02c988b2c4033e50969212b5889dda4f9e2f043dd65688ea33d81b5bd138d49af5777"; + sha512.doc = "15b50530a68fbb2b330aa972640fd85207dedc0b0e640f830940cd712a16fb001e60b59c22ff81890ed810a7aba9f1e150deb3f91ad1fc4bf52680d9d1735342"; + sha512.source = "88fcdc104594951933fee790a45efde2cfe3665673b2589bd4f2972f15e8dc1f91b85c5e04dde3866688fc2b76d2692caa2f4dfd3353ca9416002126be408cda"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +fitbox = { + revision = 50088; + shortdesc = "Fit graphics on a page"; + stripPrefix = 0; + sha512.run = "5244567062493fcb5300048be6786f1ac48c72c363220b894a2695e78646f461584e189f227d04f55e9127a66ab966dc04cbd762fd08277774fe1c0fcc7d3c96"; + sha512.doc = "71d77dd1879a2b9b20f9c4934af8bd696de567b5c0187e7a5bccc9e225fec5793bff6bc670ce0bbe1065cb67de73f518942ae48aa0a27e46c2aa47dcad6856e8"; + sha512.source = "406ae04d838114e9cb7205c9e704b95e8ea8c4747827bb82fbc53891ca552042e5742f7e524361f2a797a77d8b7286dca3512ce7099ec8fa23101668d4bad5b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +fitch = { + revision = 69160; + shortdesc = "LaTeX macros for Fitch-style natural deduction"; + stripPrefix = 0; + sha512.run = "ec44706fa5f5fc258666e343569f695db0d26f6628aac1ac6eaae12377f23138c49ce29d03dc5b08cb1f5427cb5ad612cbbf9aad5a9270f4b31f43679023e73a"; + sha512.doc = "3a32fa5657e0042588c82ffd7d32f11dfc8e9d29ba268700092d26d32d24afdb3baa1f02b8ca4e248a19413aba0421d991809cac5db0d5d38aba8389b43709b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +fithesis = { + revision = 70536; + shortdesc = "Thesis class and template for Masaryk University (Brno, Czech Republic)"; + stripPrefix = 0; + sha512.run = "09bbae20efbe651a7cc5ec01c0a3f2b97aec3af24efaf21935992c7ee63841916cb29ea81ce7a916bb6ac4cee74cbbd3b02629b9c8c7467397dfb871e863fe54"; + sha512.doc = "4a476ca775b7571d4bf88e20e76f0acd8d36778a516ce5c778682b92f0de92eaafcd671d8ee756b9ce18f136855752963e994eb8f6e37611517b68abc9a6737f"; + sha512.source = "51b654e9880727283aaa5ea262dadaaf95f801980bfa2bf43c495e9315e60684566bf6972934ee95863c31e9e827462200527e1df26251cdb62caf0e660f2fc8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.1"; +}; +fix2col = { + revision = 38770; + shortdesc = "Fix miscellaneous two column mode features"; + stripPrefix = 0; + sha512.run = "b3f096a64fcea6c6b2864d4e8a86733afb852f3decae4704e6c275c41e1295622f1eb1c8db0e0d33a29e369a9b757495477c9ebcf82ae0003c4316967c03f0dc"; + sha512.doc = "302ffac957bc37305fc5b6f458c4b7dcb06b65408131bcf64c0132638a110813eb6c748270ead340f3d864b927aa7bbfe0a16c3722cbd8334b1d8ba8ca72e7d3"; + sha512.source = "af17350815d50b2f880cfdc9cdefe457e541041e311e886a87fe45e53e7e48ed12ad83c27b6cddb0b3f719469d6c0e379a68860d13892879cb89678f51607e97"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +fixcmex = { + revision = 51825; + shortdesc = "Fully scalable version of Computer Modern Math Extension font"; + stripPrefix = 0; + sha512.run = "fc3a1ba6c5516378182373b89b71ddaf22e713c0be959e8d5afa1cd57c50f363e68669049750f286142499961c56f6bacd60c63b0211d5e6ba01d7f25d58f759"; + sha512.doc = "e6f65b38a4baddf6c1840b0bb18464b6c94f97163672b67a87c693af19030bc3ab2db7607646d73f8f684e08258906da2380e7b1637ba85f80c49cf7d5045bc5"; + sha512.source = "2967a93b0d041ff868b4f894a2b9e1d59d445e601af982d576a8ddcaacb00d4688eccdfd56d51beffd19c90903fb15fbcfdb0cba08983e78636757daba176cc5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +fixdif = { + revision = 66606; + shortdesc = "Macros for typesetting differential operators"; + stripPrefix = 0; + sha512.run = "655c9733d727189d7b2aaef2b629e67cf5c7401ec2a8ffd179fb450cdf1746a40571e0b8be56f4202e31d752c35c7255fe01cf0b36917c582f24415e8e842273"; + sha512.doc = "e17648e54c68ebea15be76a8cf1406fd42858bca77be938efeedd72bcc8fe92ff016427ef815dcb590b8f900ce0efd87d9bb96f37afc8d79bcafcdb1e5d23bca"; + sha512.source = "4c96dd12535cbc852d4d24623295d1d7236f8f4773e5dece09ffa99f7fe8bf24efbba89dedfa069e32af53b1d88afa109a5e1075aa368ed6331fb462c57d80f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +fixfoot = { + revision = 17131; + shortdesc = "Multiple use of the same footnote text"; + stripPrefix = 0; + sha512.run = "52c25b4d5bb9e34fe3f8d2b122e68352ad572ff9ecf1011f3e9fbd67319d0781a48ca08ab03ad3201f1d1d2bd6d4e35fa3818e695a741a8ab440ce81f7724039"; + sha512.doc = "bfe0e39165be8f9a56e2cbd4b91c0b7b7448d0b9d8a4a0b62d6c0d45e542a9964af3d34233ec777b69f0666a0945513a8475629f0b084f72a0b349682e8ad6f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +fixjfm = { + revision = 63967; + shortdesc = "Fix JFM (for *pTeX)"; + stripPrefix = 0; + sha512.run = "afa050087607d8eb5f36923d6ec72daff7f1bab0154edd08900486fee152068ebbfe97d87ae29cca7d8f4048e0c6091933d0b71d4a0266950828881b55aa6b59"; + sha512.doc = "d1c39e4d0dcc1a8eb5510e3306d68f0bae6067d358bfb458127ff8f5d5223576f270cf628bf8ca2c3e8322d6cf1b52b936db0c2a431e4258591057a7f50513d9"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "0.8"; +}; +fixlatvian = { + revision = 21631; + shortdesc = "Improve Latvian language support in XeLaTeX"; + stripPrefix = 0; + sha512.run = "48d39745498c187d23c62191d7da6341ecc13d6c43ac97deebf453046e78a26d221b5c7b7ed22aa8909476a754e877de26c20391bccb5cddb2db1fa7b238d643"; + sha512.doc = "07dc4fa87b8564c3ff3144936ae4374e0bc7cf37a5a3e4b5d0724681859a41d30d714e96742253bb9a269116dd32d2ab0c1e5e1965242e88ea12fdcd224ace31"; + sha512.source = "04903bf5ba774034c0b3dbec7c7d37ca5a802b3d104670d259667f8a965da26e7e954ce9272e14b6bab058a7e6a4b8ad42b710e22f85f2d0320a7827b2c7e173"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1a"; +}; +fixltxhyph = { + revision = 25832; + shortdesc = "Allow hyphenation of partially-emphasised substrings"; + stripPrefix = 0; + sha512.run = "df41497da718b157073b6ad2a4b9cea3f9ee0a0824698f47d4441b76261efb21271f1605f69b1c0de8a99e3e636587a25b4efdb4d578683ef0c89d7f849d2c8e"; + sha512.doc = "37d6b9903a56d33577c8aaabd40de592bd78dc6b2f5a2c82457f6d5b499d1d6f9a9bdaff29bb9f9511365d32e160f92c85c6c0d93ed065fdd1688aaeae9ab246"; + sha512.source = "321e52dbc69bceea16f03d5d280ae10f497278876cdf3b7f64cbfb6f31993c18afc5bf4c38f424c9a84ffa55b235b73b4daf7d68dfd115c31dc3a237a6b64eac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +fixmath = { + revision = 64648; + shortdesc = "Make maths comply with ISO 31-0:1992 to ISO 31-13:1992"; + stripPrefix = 0; + sha512.run = "e3aaa53832094173eccbb1cb3aa2f2876227bf9b1c023d2b6f18e7df49d97bddefd450a53ba717fe54ad7cd8e8f36452ff54dc7cb67bf518037fadc6eccf40c8"; + sha512.doc = "5fa1aa4433ded289ce899004eaa165117a77ad6b4846624bc8c4ff5e203af701f1065683466998a5502ea13983bc9092ca3958059c047957e41555c753c1b11f"; + sha512.source = "7f2e12e15c0d23b9803f6cf97c52327e6f111e8e14d39b78d7519c81df5946c1db18c2fa93c84fc3734bd2f9fe722ae716781d5ebb502c56546f9007decfe5b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.1"; +}; +fixme = { + revision = 63708; + shortdesc = "Collaborative annotation tool for LaTeX"; + stripPrefix = 0; + sha512.run = "a5fc18a3560f5908521fdaec0f3e20f25f124e7ded9de72b36d81ad573726af7399d223c70dd11a8ea50e47e05e3549b785ee5c64215fcc1bf6a5a9ab2e5769e"; + sha512.doc = "89036e19b4c7ce8d9266ce6dcc5bb449c5de11ec74ce13b5208eaeb81054330ba53a0b01370b7e21d1d3d7486ddb7343f4cab946e1c3cb1387965b5e434e5b08"; + sha512.source = "061d7bc9a8813accf165c98f9d386b3ead721a7a893ae55ee0bc895f6623e4fbc52988c5933ca71223094fdbfc6f7ab71ab18a2df00715299158d58668117e22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.5"; +}; +fixmetodonotes = { + revision = 30168; + shortdesc = "Add notes on document development"; + stripPrefix = 0; + sha512.run = "d327d19ac0e9041da98458e9147b3d1a9c9182bfe5c893c03ab9ef42b9c8044314f4024503327594bef337c1af6aad0b4f2046ea2d6a433947c6c45ebdf8838b"; + sha512.doc = "7d7f8b049feb8e70c5d1ab0c71147f1f398b098f9c961267c3e90dc5e9ea9a8317361a0dacd8fe581e17cd85669bd39e83a1391641d353b01265a6195af33714"; + sha512.source = "1a4028aca8ae5fd53dd8068d17a5331ad9011d72d668f9ca8242862599edf7709e84a8848bad35fafd790ec756c972488ac8db53a240426dc5dc95dfe18385fb"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.2.2"; +}; +fixpdfmag = { + revision = 15878; + shortdesc = "Fix magnification in pdfTeX"; + stripPrefix = 0; + sha512.run = "733995ec82df92bea5a674fc25a3a6af2102739c3c73eeed7c9f40cd54bc4c5d65cafb35366b70641ff0661dc83700071054f7af274487474c3893ce5a44c9ad"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +fiziko = { + revision = 61944; + shortdesc = "A MetaPost library for physics textbook illustrations"; + stripPrefix = 0; + sha512.run = "4ad67bab5850464deee4a3a29fd7c02d011eca50dbba03dafc5059ee54aa434bfae5c173e6022fef4cb761f2c760b6dd5aff403b33b7ddc8e632961ce4f8dccf"; + sha512.doc = "e719652f76de617201a2562ac5b3a04df1577ace8fbcbf10b874326a85cc0ebe3549b0b427f39cfbeda0f34f7f3fe4ab6458ad1df2613572260fa77cb8601dcc"; + hasRunfiles = true; + license = [ "gpl3Plus" "cc-by-sa-40" ]; + version = "0.2.0"; +}; +fjodor = { + revision = 53207; + shortdesc = "A selection of layout styles"; + stripPrefix = 0; + sha512.run = "adf4d23888c6c778ada6d7cf930d4aba68b1cc20c64c571c17017b11c115452e5a4eb766d03ca03f27f9de46a5027590cd806b17fe94dbc4c5026948d3ec74d5"; + sha512.doc = "a0a0e01d4d40f1b847f40401d20604bafd2723097e72c208df2a5acb30f57042b35df4cabfc93108d4278f5725dd4b50539f7e17b7c51adf875898071a368fbd"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +flabels = { + revision = 17272; + shortdesc = "Labels for files and folders"; + stripPrefix = 0; + sha512.run = "b05d66f1181eb9d7eb80636b69ea3af7a29ae7011f6888438cf80a7fa6fde44666f9fa7ee71620055f6882e73b6f5e211a2a65ca003d903cb26cc4f9571257d9"; + sha512.doc = "cf9b774ef4e1336a123d48b3797d8122c5b9128324a9f6c0c1497194e8d3a3d9ee46a5a58470074c0dbc02f8c0aaeb1da3b4d5683ba9faf6e479a6790bc599cf"; + sha512.source = "26b2a3e7fbdfe3523cad96880dc6b168cf633a115f6b8d794709514013a79eb2ab6d1545769b74236248b73c3b08d5b52e02fdac9cdb420e3a4f1ac5cad55d32"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +flacards = { + revision = 19440; + shortdesc = "Generate flashcards for printing"; + stripPrefix = 0; + sha512.run = "45cf4fc3f4678a5242873f80ff1ab328e7675107d14052be90308d94d44a931ba8b2cf3eec67e7456a21168aba168fe848979a8d45ef07bfc62613ad9174488d"; + sha512.doc = "087d2c5500b5ab51280bf3f57362f00723856b041f520d41849d21043859bebc106ff9af33dcbf044aabd838f68d1165f74645360247de2c3feb9a8493ecc441"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.1.1b"; +}; +flagderiv = { + revision = 15878; + shortdesc = "Flag style derivation package"; + stripPrefix = 0; + sha512.run = "a7618ffc60c548fb98a581324901af09defd9226a655163d967e251b090b6ea74d91ec10bbe1e5d685a83d147818ecbf8b66d84c972cacaf3e270baf39293200"; + sha512.doc = "8c9731aec45eb594b95e1c89a1967f169bf8394664977059af0fd77aa40ebf3769200925382694e221a32ced470161f505420539b5e3f7f00be4688e308ff54a"; + sha512.source = "c81038f892b37dc2759251cc14d8bfe11d0aff056b95204cfe1a4434ef1bdc6fb3c035edca0e01282ca019193871dd6044a8b9b64f3b6051c24f041700f2b71e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.10"; +}; +flashcards = { + revision = 62104; + shortdesc = "A class for typesetting flashcards"; + stripPrefix = 0; + sha512.run = "0c336f9609fbb81bc373fad344a44b8159c7d142d2a62de795dc7f1b7a8aadba563ab7a4788164058c19ab6f6c9835af1f1a0dc275377f51aca9520b3a8a2327"; + sha512.doc = "6ef79cf1f91bb8dc7b9b3785da64af582891d1536962ea9ac9232bfb8fcb156e7c33319970793fc6776db2224ac991796a93a287aa3eed2e0cd0ea741c6ef9cc"; + sha512.source = "9d428930e3993de9d2fd407a78b19d2b851d9e7faa88a5d5c0bb44ec014432518fcd4ebb6cf68e5b3a0693cb4ab7bbee0068f431e0ca169423ecb5959ec233e9"; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "1.0.2"; +}; +flashmovie = { + revision = 25768; + shortdesc = "Directly embed flash movies into PDF files"; + stripPrefix = 0; + sha512.run = "99ae914e1fa627f462be84f7bed923c638bf493ca183f010bdeb5d607ab00abaff7a1fe3d0f8613e6fb9df7cd5047b99e99a5da18470df25e7507259a441e188"; + sha512.doc = "016331e7328732f5549487f8b2edbeabc9548eb81201584d3d3f7e0ff41a9a962761a8af867dbee8951bf4e99ea4eeecec7e9230868c23abc95260f288ca7958"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +flexipage = { + revision = 66614; + shortdesc = "Flexible page geometry with marginalia"; + stripPrefix = 0; + sha512.run = "1e16b1722a4c4349879c4556338c9d72eb4fe8364d0e19e0237b3a269b85ef19bd68d4334e190b7e0cae6e3ab1551381bc2e46fbb265ce36e839a967fb114220"; + sha512.doc = "5670616faa6646b68d3b3b2724f5e324cd1ef3595a0da3b8615d364f908f684f98d641754b71498cb2b61853192859dcf602a2925cab145292b1cc7a21f99766"; + sha512.source = "72458fc100c39b56a6f5ce173fa1149997fec0e4b7040f9a6ff2a2f671e27a33a4cd326eefa48bb81ec53bd53147bc4065d677fc1aebd9620da1d869336b495b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +flipbook = { + revision = 25584; + shortdesc = "Typeset flipbook animations, in the corners of documents"; + stripPrefix = 0; + sha512.run = "8e3140fb417115ada958bf6dab1a22b39779926b47938bb49cf86499d64ae16d321e6e6bbc8482ee7e6a2d79d8341a227785ecf04c66a15f7e5c0ccaea016d21"; + sha512.doc = "a5f6aa188e7a0aff29d4e693f0f8e52512838278e12d13c29706c7bd5c1c1c2a8d70beb619195d8572ca5a3920205380d586d02580bc747acb8e3259c79c3fb0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +flippdf = { + revision = 56782; + shortdesc = "Horizontal flipping of pages with pdfLaTeX"; + stripPrefix = 0; + sha512.run = "17773b1ba5f40d694cddb3d2e2742650bde889d53302e6fa6ef0686ea4cd3fe393ca2e5b31842e93e5588631ee53ebb668cb035b2843fc5bd57911167074edaf"; + sha512.doc = "d5191d079641c9a06336498c396cbcc7585c983924a646bcd3b26889ca51a08eb166ced560f45f834281fae9abaa47d02fdd4ddadd3348cef704dd9b818e7675"; + sha512.source = "95e86fe1e8ce5cbba8745123dbf6c352545d0a75f3ce679e2cf132e46184efa28123f9f9ecf805939c10f59af5bbde84bd2a75eba8f0aae3628b41226059bdfd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +float = { + revision = 15878; + shortdesc = "Improved interface for floating objects"; + stripPrefix = 0; + sha512.run = "4a5270ca2945915464ba25b7996dfbd4771ca5f477e4bf248183bc340b7051c042d9566908acac881782af74a59154f4163bc7879a21e042e1c31d67237fc6a8"; + sha512.doc = "6f713c71361c1536bb086e7638b770ffe58e97aa01bd59bbab779f71cb485b9c06322d7d89e7d87cc8f77a0c7f18f4174fd4ec47b62556faa32d82fead0b7377"; + sha512.source = "9e577ba84dcac612e4105e597ca2385da3dafb39327189caf30e5728b85a380b5a90363b8bf9070a0464aca2130bcf9419d030bd6c39d51f9a17b0a7dd578d5f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3d"; +}; +floatbytocbasic = { + revision = 67945; + shortdesc = "An enhancement to package float using package tocbasic"; + stripPrefix = 0; + sha512.run = "01f45baf2f0713a229bf6b6d59e02c8a05f0478331c3c6c7ca7dae050db94d7497a87acccda1cd7c022b79b54ef5088f6af181429e60154ac8e1ada081062dfc"; + sha512.doc = "0d6f29221ddb39019a9c6d308f77200279144efa9de35d5fcad8518de9ecdaf840179887282840cf7b31e7eb286f0fa41bec93e8a1f3682873adb791a467e22d"; + sha512.source = "4b3c146a6e9960f77532bf2fc23cf686a092f00da541a0c0fc1243a3bb623b16e19de8e9bd1e792a9134cc1dd3d429fce17ce372da03f0abf3176ee4b722cf69"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +floatflt = { + revision = 25540; + shortdesc = "Wrap text around floats"; + stripPrefix = 0; + sha512.run = "1f7de96ac5e82cc4bbfab3fdb665a18d20413cceea097e1407dee2073109ee1b82d7d3ea82c80630d9aaf445f14a8497aee7e3824458dea8b40b270135052ef5"; + sha512.doc = "7ca1c6ed832bb3d697685cad5575e02b531c0469095468fd40eb3131d89b68dfa0fcb9c882965aa7a9cc9c60292f64bdbf6264d3d990bd697dc27b23a46fae47"; + sha512.source = "6d243fd8c9a2fb7bbc242ececd19d94916de97fd3583095e8342d8e7c56decdcaceac8038eee9a774950d9261979150035e8c9175175ad7346b0eb1fbea6c5bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.31"; +}; +floatrow = { + revision = 15878; + shortdesc = "Modifying the layout of floats"; + stripPrefix = 0; + sha512.run = "c650b5c856bd625ad192901f3c056171f790c549748d5de5675f14cedca5cf32931ece537ce2280c0e4895895a8eff0cf140c3408dffc2b081ebc8c62d2ae1e3"; + sha512.doc = "b721ebbf59ca3744f1834c130da1a859cd4a98e9f5f977f5d35eef77b420deee303c109439fa70f89757cb9f57114bc74c5d527cafacc1daf2125b975621b525"; + sha512.source = "033c5c65c9676054e209c64dd065f86631c9765b1582e4042e72bfd247a49602dd97ba4dcd5afa1fe2f7e3d252e4b6ef2ff1a2b00eec3156937fc214d7cf0c3f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3b"; +}; +floatrowbytocbasic = { + revision = 67946; + shortdesc = "An enhancement to package floatrow using package tocbasic"; + stripPrefix = 0; + sha512.run = "3554c3cd560d5203b650bd32fa39aa4372f935bcbc757d1ff93fbde3fcf1a395bac4676e7029ec58fd79ce0089595858707880e35fdc98a65615fa27a555ea3e"; + sha512.doc = "1ee0174dff4209c1bcc3764c89ede858174e1aea624a0032c0af8bf61c1cb4082517ee2713fff0f5a5687ae4d63ec67c04f4a14eb5479edab183d0487241c37a"; + sha512.source = "126754a11d2a5f47d2406bfdea43ee33371ed1eb8f6b94bcc48b71fcedab4f468e3d0fbbdd7f0229780a70b5d337aa3e443046346b1c53e968a585c6d44c1c66"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +flowchart = { + revision = 36572; + shortdesc = "Shapes for drawing flowcharts, using TikZ"; + stripPrefix = 0; + sha512.run = "9adc1f823378fcfaed58e99727b68389b97bc489ba38995e5e7451608cb712dd7fe02b2686f692328b73d1bc8011131017b8edcebcda5e886f3bb4a0f6aed65a"; + sha512.doc = "0bbc3f1f56f5adbabca07096804412b33e93669e20af345e57bc9ad42133ab629b9546887599b472dacc8ee43b9c395f8c2e58a288c487e78920be1db5a110aa"; + sha512.source = "5ea69b98cca431225564482ed0597be71fe45e9ed933f4417059f4cf16401ba82987f90617e57a5428a42d03c0877969579a2b976a2c48d439d0dab7af0a6179"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3"; +}; +flowfram = { + revision = 35291; + shortdesc = "Create text frames for posters, brochures or magazines"; + stripPrefix = 0; + sha512.run = "880869c22914392c4ade9dddeaffb20d6c6edb6da78d30705d9f6aa1b1352ba2734565fa8c2a6851e81f1107573753748d3f4d208bbbc4c0dc443c066e912719"; + sha512.doc = "25924c121d2feedc7d815e4510b89f05000eef87efae8039c6566136b7fa92d6d4d9f25f2938363dcce8222d5c824d42894e4863b95e422b7949207a1e1daccf"; + sha512.source = "993d60da76f1144524f9ece2c5c9ba0eb38526111a7cbaf6bb5c669eea790c1ab9519f4e7dc2bc955c611fadf5771f2d9b6582d753b4cf3b79038b2bdd29837a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.17"; +}; +fltpoint = { + revision = 56594; + shortdesc = "Simple floating point arithmetic"; + stripPrefix = 0; + sha512.run = "906155f3bb5fa81cd4e97a375c37774db1ad4db388f334867cb5ba30735ec4ded5461eabcc833951b5d8a6e2403eec02e0f464d35f109304b9d6152638949b00"; + sha512.doc = "3c023dcb86eddffb28e0937f9d31dada6c82852e44a430c892feff9572c81d9830e4524f742afd958a79f0af63e72311ece43c9eb0e2d8434d871fe144b7fab5"; + sha512.source = "cf5031d06ada079028382b5e845df5b69330fe23412aeb2226af725333dd9d5f4b0915f5de2c46bcfaf6809c9f85479f6257c6e7825c076f896c5f411e3ba9ef"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.1b"; +}; +fmp = { + revision = 15878; + shortdesc = "Include Functional MetaPost in LaTeX"; + stripPrefix = 0; + sha512.run = "b87a361454199c16e1fbf97bd2b82f8b5569bbd71b7beaa780a6d88357e9262f77c9c3ce17d2ab0ad9b043ed7a1dd721e533c516e1b927f0439e13ced6598a30"; + sha512.doc = "461ee793dc8156b0ecd6931b9d4c56f368ce4938838b042abae5d6475ca3739c4fe47517168dba742f03c98229376f59f8654a89f1d65ab394c0dd907ac48ba1"; + sha512.source = "912cfb9e0d4669c5d128ace088190ab4c5f90e371b45f1e399346816d606ef3f96901775a51b5f89a8670abd1b08e159587c9eab4ee6383c12e260d26e070034"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fmtcount = { + revision = 53912; + shortdesc = "Display the value of a LaTeX counter in a variety of formats"; + stripPrefix = 0; + sha512.run = "ec5e10be2b93adbfa0e1ac710c7df37457e8d14dc5c7fe1cd13e062f136c63bd20a3e42d57c237fb4ae5c1be936e1d821d0a6568ca0c22b41948660f0848da43"; + sha512.doc = "fa0955c7d08dca99d3323b9cf364edd8b4b305723a3fd3ae38687c6473ea2af3593c47384a61feff0071199b909e1424d422eed3864866b28c7d27b1f42c3994"; + sha512.source = "1325ecfee60e7b602e5ca2fffa2b95a4ad11d04b5e986413af57da19cb75e2a268356f33ad64355511d526ed144e14e2abab4b84e5ec5e4faae122eff9914104"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.07"; +}; +fn2end = { + revision = 15878; + shortdesc = "Convert footnotes to endnotes"; + stripPrefix = 0; + sha512.run = "6be5c07123cf2470ca88b7c28c068c6dd308824138fd2f645a1a7c04c69fe84953468733ca2994faa42389b5889990941c8e09dc543b66a1589f3cf22df1e017"; + sha512.doc = "17f0a1d12afd607a26687b675ccc65a150e4ae67785389fe9582a3b05ee383f078bde35f296941ea069323757e1fccd1ae0e76e5e24f3446b4154738c1a45385"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.1"; +}; +fnbreak = { + revision = 66615; + shortdesc = "Warn for split footnotes"; + stripPrefix = 0; + sha512.run = "15d3ba5ef30d8ebc23be3f0c412f7457960a7032f3c78ccdeba6342852a3b7db699b8792b6f981659268fb28c74e5cd93bfabde2b584f7eade98e6b422127d9e"; + sha512.doc = "44837191d22ac8185b7748fbf32769a1d2299b92a313da918e6a03d78f56206e76d73990cfb1f94d956835f369adb4008df4da117a20984afc48289b1291fa4d"; + sha512.source = "7ebefbbe46d0c4db1244ef699e454c0b393285a489bc20b0fd78bdd5da0ddd00982f063c25dbe78c4aa1661402a6ca8ea492774e9aeb5aed3d7fbd460ae2f58f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.40"; +}; +fncychap = { + revision = 20710; + shortdesc = "Seven predefined chapter heading styles"; + stripPrefix = 0; + sha512.run = "83d74f4bcd8fa90cdf5d0b6e03e9e8e36ab09884998f9955647928ed0a33924735d236a82cc730412edbf54485ec8c357ba3954a264965f67752e397908ba295"; + sha512.doc = "6a8c6910f0790457c71cd55c8d30d07df81c97f80a8b6b7930c067966c76c47848142cdcb7454c4b63a154c5c653933bf71acbd792c06eafdc496c92e4bc5806"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.34"; +}; +fncylab = { + revision = 52090; + shortdesc = "Alter the format of \label references"; + stripPrefix = 0; + sha512.run = "47aafab923d6455da7e63eb24e0fefa8b869efa5a04bb301000cb2eb658893927dd9f9aeb8e6919ea29e0caeca235b1883106228f6acddc667117a3ba1136974"; + sha512.doc = "a987a6efd0964bd5ab5328658e011b5c8da56b404d233c55d96541ec2f37cc72faacd934908c7346041ec8bab3866dd1f171e1c5de5eb528b0f0e80969c0bba6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +fnpara = { + revision = 25607; + shortdesc = "Footnotes in paragraphs"; + stripPrefix = 0; + sha512.run = "620aafcef4ec7fdaf5cd732551fddbfce53222cb7540dd370f2cda425e1782c907e59868953f50acfff993a8fd8a84d108da7992f1c1565cbfa889a5ca0ef5d0"; + sha512.doc = "798c7fb03a8fb20695ed63ba1333686d21832a936a74a93ca77c7614346316234b2255b8e0340dd87fd57bc1480f23df24381107fc81c68cd4c0cd594ddf5329"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fnpct = { + revision = 62248; + shortdesc = "Manage footnote marks' interaction with punctuation"; + stripPrefix = 0; + sha512.run = "35b1fc24b9cc8ae46104ed20023bc3e1a5a83cfb857cdedc3e6631b8ac4315a79dec012793174fe239898460ef0247f2726b3a7c0f07561a58178ff754b513e7"; + sha512.doc = "2f986edf21052a8e008a64493787139ff9fa5f65038eede1c87e59add2c496f23fb20e7b33d632dc598318dfafbbcbdb7a938a7f04bee6c72884565c104df7a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +fnspe = { + revision = 45360; + shortdesc = "Macros for supporting mainly students of FNSPE CTU in Prague"; + stripPrefix = 0; + sha512.run = "5e9af6b3b3136f49e49524c7fc85074fd75fff30826fcbb8dad358102e3eee6fa44037b7dde99b6556a063dbe4e819b27ef5a522999eb304f70c2785642478b3"; + sha512.doc = "733a099cac2d96ddf6593b9e0195b85c8d5e86f6a1b283f011a55acc4a1bb7391bfd4356c6aaa40d9b2c70a7c180886d64162eaa396a5a457fbea491af1b47c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +fntproof = { + revision = 20638; + shortdesc = "A programmable font test pattern generator"; + stripPrefix = 0; + sha512.run = "c1cdc018808a2b9fb5b91c54b55eddf3d517b8dc6062db1ffda3db154efe6f3abb91e61ce90a68743ce411ec614785974b4362f20f03ae398488ac1f816b3ba6"; + sha512.doc = "cf9e8909ed030b27a57573cc257682da84b7f14c3c3775e17fdc8a2203fe99dda8797ae7b2599dc92e9684140102f6d1ca2147bbb437edcf8eb41ffd28b9a576"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +fnumprint = { + revision = 29173; + shortdesc = "Print a number in 'appropriate' format"; + stripPrefix = 0; + sha512.run = "7f43363ff861fd4f887df68dd6daae6c97940d4cdd60b19563a966dc7c08cb88356a150eab0cb5b91bd4c3d5d47e324dbbfd43cf45872a5738c5f9b70766e047"; + sha512.doc = "44d6fdf74bf6c231a57b3fad63efa7eb1bdf5b4342cdb38e0d504c4c09190130d37534769e17c3f60bbad668d50aab064bc5c0a1ad99808a6d084dd1921769a9"; + sha512.source = "3f6465877aa1dbf5ab021e8397725ec83217bd774ee0623e71cf15d746d7d0edeb2f78ce76dfd607568be75b67f4cfa8d3e1ddd29c0ada6d376f7b4fdfad86a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +foekfont = { + revision = 15878; + shortdesc = "The title font of the Mads Fok magazine"; + stripPrefix = 0; + fontMaps = [ + "Map foekfont.map" + ]; + sha512.run = "45342633aec41f2a5fe7213dc418960d76ff196a08b906965e3b68f2c5ed264b3192ea45756133f12662e451fcad11d08232995c0de2493495c40b9b59cef7ea"; + sha512.doc = "7e1aa7a240d825c014be6af7be5cd7c1bbcbc6e52bd55be36f987b4a25223179bcc4c4d342906c10f9df624536252fe4dc5a45cd3b5ddb63f91e9f4c7401a239"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +foilhtml = { + revision = 61937; + shortdesc = "Interface between foiltex and LaTeX2HTML"; + stripPrefix = 0; + sha512.run = "88bd7239cc37cc4429be37de0e68ffd6291844bb81f34a3e9e8c0dab14641d66b6d3990e44d58e5322d2cbac8da27901fe7dbb3b64a59be577ec0f94a036bafa"; + sha512.doc = "c444f13c4c60cd7a723d9bca8d687a3f995438767d077c812797b91e0111372fed6c76fb51f264c0332cffb1a598e5f2a17a63882dc18b4e682f08a3ffee0900"; + sha512.source = "9904924a8b8b1723e7496960fb9856e91efce76313cb49e756d99be5f6f97022e1cf8f27edec0ee738281137e3fe4d251448caae54335d30b0772a1be44cb8e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +foliono = { + revision = 58877; + shortdesc = "Use folio numbers to replace page numbers"; + stripPrefix = 0; + sha512.run = "e5082c626e22acbaebbc7abadee75a71e3902af989767bcfba5d851fc89e771cf8a331ea540c05e6455b894351fdb6af6c598b5440e55c553662efdcb73cc093"; + sha512.doc = "f03abc88291b2591b509a575735f6fe3e29ffeff52e0d2cbea287efe5426b7668462e6133394374f01aa3b968fec035e6a40a8bee01b12cbacf90fd0bca80b2e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.000"; +}; +fonetika = { + revision = 21326; + shortdesc = "Support for the Danish \"Dania\" phonetic system"; + stripPrefix = 0; + fontMaps = [ + "Map fonetika.map" + ]; + sha512.run = "4db9e50fde60ac69373f5abd151f3e17275f5c492b6855a7f5dd8895650a79cda1feda43398fffebbecdd6f7e032f8935972ef573f79ae1cccc5844dc148352b"; + sha512.doc = "ac3f0de2a9a5b5052d4ae626b4368f8b1fef419503cab9a88d4bf89db348c1a756555a6cef7aa70bcf733fa032840fe9ae7cfe347fb40bae32b54506e60ccf37"; + hasRunfiles = true; + license = [ "free" ]; +}; +font-change = { + revision = 40403; + shortdesc = "Macros to change text and mathematics fonts in plain TeX"; + stripPrefix = 0; + sha512.run = "8ec91864d719d20ff66195ec1bab456d772417ff2d4d9ae75ecccafe0da616d1dfdf5b965be489a65eb28130b3672a5b55c33f3254f59c00cf204dcae6fd4eb7"; + sha512.doc = "75f7e45fb5313d0bc1c333253aba2bcd1d650fb6c0baffce6e5c558b0e7aeaf2e697ea9412860b4049d2685cdee26d19f12d9a28184084ab9df66101b78b0361"; + hasRunfiles = true; + license = [ "free" ]; + version = "2015.2"; +}; +font-change-xetex = { + revision = 40404; + shortdesc = "Macros to change text and mathematics fonts in plain XeTeX"; + stripPrefix = 0; + sha512.run = "17de7c596a774c5c2e115704c2c57385f3fa90bf2dd49362547873453c27700537ab7f1e8a143c2ed49c90efe6aec234d3cf61643228bcba5b51c5ddcbb8bba9"; + sha512.doc = "138375750a4d493774cbd558c6aa910d04bf3f32337f773438d6bb31e16df3d96af3a6ea12d4940c785c04f98130977750058f7c0ef2425e0d8147b4ab882a64"; + hasRunfiles = true; + license = [ "free" ]; + version = "2016.1"; +}; +fontawesome = { + revision = 48145; + shortdesc = "Font containing web-related icons"; + stripPrefix = 0; + fontMaps = [ + "Map fontawesome.map" + ]; + sha512.run = "e08643104006c9e14c40bb965b4401a8fe296f43e5f39b285cd19d5aa0ed33602cc0eb6ffcc996e1d6e5aaa57dd906903324626ee40facdcb3cedc5216a3deb6"; + sha512.doc = "bbd18a60db734922ea006ebd00b0c9f90c34907a7b519a08bf007daf01cceaaf6db3b31c3dd8c76e1dac199d4f7c312116f6935b764afb62248b7dcfd92ac78c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.6.3.2"; +}; +fontawesome5 = { + revision = 63207; + shortdesc = "Font Awesome 5 with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map fontawesome5.map" + ]; + sha512.run = "d7f6a40797b2968c31b28f1bf273af9d27b7a87e7c2953748f354db2e760b027feb5a8fd52c8f367649fba24cd629d71c1b1368b8864d42eb84269e0b22b59d4"; + sha512.doc = "1727133ca0e1713c356a647e08a7e22af50ad6a67e66c54f3d9e9a0601bd4a693c365cda625b37be83cb4ece42aba8312488f4ba5e885cc44f68f7930dfd7add"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "5.15.4"; +}; +fontaxes = { + revision = 55920; + shortdesc = "Additional font axes for LaTeX"; + stripPrefix = 0; + sha512.run = "49a2a2a3cc34370fc8db7c08446b2d12cb7b8a9ce6913568d7588c051683e24b859af23c440df1c815ab1b65f5b5de32242df344dad8102eba7ec1383b02c112"; + sha512.doc = "c37621f082498bfc4c2ed0717fbe18b56032a7d5faef1ca7a73c4fd22adcfb8f7e517ced768511636d4c8488932d3b33a96137837f34c79416b9c5d8d852456c"; + sha512.source = "f0bb1bdb666c9afc19ea333ec3919716565be9454970e7a9e3930f503ea7e31ebc4273a16dff6fb2ae44701ccab1ffa2e9c285ac145ed32294b47b68fff91267"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0e"; +}; +fontbook = { + revision = 23608; + shortdesc = "Generate a font book"; + stripPrefix = 0; + sha512.run = "55ee9dc22aefcf91c7fe30f516bfbaea5d0b8c5423cec204bfb208ebfb4b2331ebdd65032eb6f2a9f8958f15fd47433a9c7884f49ff1f3900f1538f9f25d4fe4"; + sha512.doc = "65eb7d3f6426d3dcb13ac9a0d5b396eb4c03586d9d2b3d842af9ae4ad98119e8721034de499eae485c5803873946f04af992ddd860d09a7131021027c14b5d4b"; + sha512.source = "8ecb0b7b4e5f00806a377acfa0198ef217faf0573930be1272d13d743d1e84db76f067afa7e7a665c4540536c1d888bdb702ea9c203a2a405389079aa49f71f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +fontch = { + revision = 17859; + shortdesc = "Changing fonts, sizes and encodings in Plain TeX"; + stripPrefix = 0; + sha512.run = "c8354fbcb6a13f2f874dd3df71f23ee1fcefdaaa1eab5166f35001811b9788ea2b53e5d5653437071d02978dc94b0a658bca5e2cfe825a0315d3389446b6c138"; + sha512.doc = "a7c5f6622414d943a20745f7b02c3859d43d4f4ec0f9ffd3b2baec34e142c01474d8827c7b0fe5d1bebfa25d33224b26cd876e3457b7179097fd9539cb9d9444"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +fontinst = { + revision = 62517; + shortdesc = "Help with installing fonts for TeX and LaTeX"; + sha512.run = "c3668f79f4b926090188386044fd68b0f13913168cdcb2aa23ccfd3aead488dec03e79133669bac3d2b719fdd2d5ef735fd46cbb27fd26fe560368f9e0cda05d"; + sha512.doc = "23c569bdd6f12dd4cd0b5673ed9efde2c7c7988d86bf2f89409bc22c80f64ea80ca6824745b50ea3ef30f70e4bd7c8d7005a9e05e511c1e917a12630f4b4bdb2"; + hasManpages = true; + sha512.source = "1645dfe5c6cd0efc8d8af966eb7363176ee7a44646b5860a3c137dd70c7e130340887e8690913d03be84eb1d84134c4ec2add713e4583a0feeefe4a1c4554402"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.933"; +}; +fontinst.binfiles = [ + "fontinst" +]; +fontinstallationguide = { + revision = 59755; + shortdesc = "Font installation guide"; + stripPrefix = 0; + sha512.run = "c3f9820453f9cc3fcf4323f382a35255d2dc066dd0c090f55d15b2b28d64d8e3935e85b3dc8f30d9ee50408a48aba0ba4278d4985ead454f177ab1d484fe7b01"; + sha512.doc = "785a84a3bbcf67fcbb878f331815fd585093de89faee6f2556727ef820e392131545646242ebdef603e85e22e86b1e97f5369db4e1c565875e79683ff4987198"; + license = [ "fdl13Only" ]; + version = "2.14"; +}; +fontmfizz = { + revision = 43546; + shortdesc = "Font Mfizz icons for use in LaTeX"; + stripPrefix = 0; + sha512.run = "43febb41a8bd7b0a89a2b60b52f9b83e0d0fa8303c0a7986658a95c93307ba6642fe07f8ac935ccb50b3047bc74100cc7268fde438d3ff80c944ac59afa6e3df"; + sha512.doc = "6dc0f6c10d44a17d42d8ed4148f39bf89c84dd5a3a672755340456b0ab983b1b52cbd3bb62cd6f5ef4c3f6dfed8a39568d5ca35598c4b016483fcf7d3cdeb360"; + hasRunfiles = true; + license = [ "mit" ]; +}; +fontname = { + revision = 64477; + shortdesc = "Scheme for naming fonts in TeX"; + stripPrefix = 0; + sha512.run = "424da4dbbc07c41840e6aeb6fabeef5d4778d206b9cb8a90e752ebeb65d962b96ad41a7e20c86a16665e2bf48ad795d85001da66ff41b01ae3c949c6eefa4593"; + sha512.doc = "78199996913192f5f69423b6f412acc52b74f051b01d3e345b97b7f1d9ea4aea762a7b83488068f3091b41da69471d56b3f18ab4d299cc6adfe4e004072db303"; + hasInfo = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +fontools = { + revision = 69241; + shortdesc = "Tools to simplify using fonts (especially TT/OTF ones)"; + sha512.run = "5144f4a0636b49e63bf04f518b6c416623e2228615e33169839547cbaca574bed78777ab20f4db7e5820c1acd401b756896b39998c43f21f93de6cf8f987f6ab"; + sha512.doc = "bcb3ab7f49e817ef5b6f710bbc227309f28396c6f4233e39e94163663f10db3daaa41b6db93a9ae85a26599dfce352a0c132a36b0c047ecf8f5269f428af4f6c"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +fontools.binfiles = [ + "afm2afm" + "autoinst" + "ot2kpx" +]; +fonts-churchslavonic = { + revision = 67473; + shortdesc = "Fonts for typesetting in Church Slavonic language"; + stripPrefix = 0; + sha512.run = "a6e3759ee4fa9cb50a8b7bb55f162ddf6644c3d2ab61da514ae902c99868f34e3de67f1207ac003f98a872b1b1daafada441e888efe2f0482ddc6b9132374c03"; + sha512.doc = "9fcc08b521d9706c3775d33ed7391553e855ef43a49ef1c6cc92ecc1f21677909eaf5c5d231fe86f232d3a092e3f913012d8d96f35b3344e0a774c4e5c8f1476"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.3"; +}; +fonts-tlwg = { + revision = 60817; + shortdesc = "Thai fonts for LaTeX from TLWG"; + stripPrefix = 0; + fontMaps = [ + "Map nectec.map" + "Map nf.map" + "Map sipa.map" + "Map tlwg.map" + ]; + sha512.run = "3b1894d677b63c88010fe583381ff7c0c8a7c5c6753e62e166ffa8ae7f18d6a521b12a4e57f16634855f3b807605407cfad110eb405a3ad334f8a14bfacb6338"; + sha512.doc = "93de1f1c668d460644f8246ac25c47f10d99e91c878c50c3096e2df373e521e54412c239d89f5372c767cd768f7973b06f97f25705e865dd5c36cc3674496c0e"; + sha512.source = "555a7e3fb1f1202412dda95924b692f21b6ad7d1abb68b5fa789e360667b6a23bc377651d592d43aa67728a8bc9f2a20ad5b1cbca85c412b90ce8a8654b07b17"; + hasRunfiles = true; + license = [ "gpl2Plus" "lppl13c" "free" ]; + version = "0.7.3"; +}; +fontscale = { + revision = 70541; + shortdesc = "A flexible interface for setting font sizes"; + stripPrefix = 0; + sha512.run = "95ac9aaa5ff2ff9b9108bea483b23ef415e825beaea1b1573b1869d441c9ce34188b47241c5eed9b5762931823f015c0f05897d7085b2462f1f401c98ddcbaa3"; + sha512.doc = "28eb33adf132aed909f74211c538ab82f4cd5a958692a20a4692f9774a60c44e984fea28949366e3ae28d507088eeb1584592fefa1abced2b7bbf29bf9c56c41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +fontsetup = { + revision = 70135; + shortdesc = "A front-end to fontspec, for selected fonts with math support"; + stripPrefix = 0; + sha512.run = "e599ae4f458be9375343dc4eade6c4ea56175224b785e48193af974d0b8f4a0d1f9426f8bd0fa22b15c962b7e10ef856f938699324c4b51e46d3e06602952e02"; + sha512.doc = "18c8d669b19274eda6e8daffe5fa3e6906a98026052ac668ef51e97e2e49e73b749dba7ac369d532020faccff121d210b5c1ec3540f353a98fe276f4aebd4c2f"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2.1.1"; +}; +fontsize = { + revision = 60161; + shortdesc = "A small package to set arbitrary sizes for the main font of the document"; + stripPrefix = 0; + sha512.run = "8e89cde1cdcc388a5e8ef48ccfeecf6f1f25e938c7513081bb17bb4b65f889c2826a929baf4833b2191554f3ddef2dd9c5bbf50f53ff14fe7463ebd1e494aa4a"; + sha512.doc = "0b4cb325f4ca5b94a1757aea9ab3dc00dc92ee2b095dd35f176e7acbad7e1ec87a7e2b7cdf9ed19bf50095c41f221f8c791c0e7c9d541021768945a84a30e51e"; + sha512.source = "42b9a587d63a2a0190776851b86eb66c4e7e2811a4367ba659ebc996fcdf365b9447c94a4d04af5129a6b95d119e37735df9b26fcf12702f157d61932f64eef3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.5"; +}; +fontspec = { + revision = 69880; + shortdesc = "Advanced font selection in XeLaTeX and LuaLaTeX"; + stripPrefix = 0; + deps = [ + "euenc" + "iftex" + "l3kernel" + "l3packages" + "lm" + "xunicode" + ]; + sha512.run = "3d49ce69d6830cb4bcc16b0df3fe86335761d71fc8b930470ecb4e38f4131c40c534d8c613a252d552b1d298d61968e5bc2aa574b0299a9f7b9e79b63711d442"; + sha512.doc = "1ae04a6e17c2ef6413e9cf21ec7934502a3fff3324bbd274dec1837916accc6da5f09a25816d99abc5cd0a431b0e652c44a2f570ecd69f400f56421ed172e58f"; + sha512.source = "48177f9500a5248dafb333965cd640e600aff2591a4e53f17b9b32a6c7042559e32d907ae5e2e6978389caaf13dddcd0827503fffba35b647974dd67d13f5c4f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.9a"; +}; +fonttable = { + revision = 44799; + shortdesc = "Print font tables from a LaTeX document"; + stripPrefix = 0; + sha512.run = "f8db43eedd7f9e43b0cfb8c37e2687321fe236daa4bee898141c305dd2e59fb40bf3e8b3cabde561c75fb65dd053de33e45b90a8ab9518b0b30aedf35f6af1f2"; + sha512.doc = "1d2b27ac253df62568087abb8f9e0f0054e3bb98cb62e65784192b281722e69e8565fa569eef4d061684e8965e0b05a0cd6dcbf7e632af7f68f97e8d4747426e"; + sha512.source = "56210bc42e0716196bed05a35ef9ff7ffb40a17a8cfe8cef4d31e2c8ea28bfb75ee035bb887ca62387460cb7f99eb4f2b408cea767ce824124116caa6ae7d15e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6c"; +}; +fontware = { + revision = 66186; + shortdesc = "Tools for virtual font metrics"; + sha512.run = "7cec7df72b76ed64b864401c809b48e51f69338c7cb3ed05ac4ea69899a077983763c728543f99130f18afdd2a03c955d848066a239c97547ab0240d87c97d7e"; + sha512.doc = "ccd22e262e5fa2cccd5da0ff016447d2df04aefcdd6960f226762667ea2e81b4afd406ea9f822b74d07c8f93cbe70ef90cfcc4040cae2820cf5ace94ce8d1113"; + hasManpages = true; + license = [ "knuth" ]; +}; +fontware.binfiles = [ + "pltotf" + "tftopl" + "vftovp" + "vptovf" +]; +fontwrap = { + revision = 15878; + shortdesc = "Bind fonts to specific unicode blocks"; + stripPrefix = 0; + sha512.run = "5bad0487f5cfa4119d7baafccc6178925baea12f1cbed5912211c52f2c4ea01eb00f9dacd300c24b93f48e5f13197a86ba1e37c35ed69fb1031281fdeb08edf2"; + sha512.doc = "857be54c81d9bfb14277c17638ec24c643c278d660b56e18a4701aea0ad28e496df0aec191b12d93bb29b7ab326b39ad9cc7ddc3615871d1b70fdf6e44ccdc6e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +footbib = { + revision = 17115; + shortdesc = "Bibliographic references as footnotes"; + stripPrefix = 0; + sha512.run = "0cadef58331d5d51aeba1f69d0c9ceae99104f7c31ea79e0f5dee33c8612bc52cd0c8551abc6da1799705c879cc88535b46e4ef15232d3c4a0f7136e0fe46e05"; + sha512.doc = "27d1f0e6bf0ef526f2b3c4852c53b78fc60fc10ec526796447940565ad75fab023406bd28548170f7382e822c3b0f43d96181233bc772ea58f8ac195f71cf495"; + sha512.source = "120d5c14a1b12b15a39792d2cae0bfee5b1695af1c014708c65d61eba6f2fd52f17e2b61b576e192a2d2a9abfb3aa2e059fcd9ca17e48e8a3ee6e9cc2150f119"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.7"; +}; +footmisc = { + revision = 69729; + shortdesc = "A range of footnote options"; + stripPrefix = 0; + deps = [ + "bigfoot" + ]; + sha512.run = "7e205e392bbc933c6592f91afa053573f174ea83b07d81a17a144b29bc3837ba4e6639c56f5b07a9840e141e408163cbc2edbcee5fb7b159264ebc54f4a09645"; + sha512.doc = "93d3ca6476356b7a0ed955edbe442764740d32db58dba91276f6bd891ca4009c3731872a703f1621e344a69c401cd70a7cd9e5fe2845d7667a8e0dc61e2ad2a5"; + sha512.source = "6b2960dd45ec7ff85cbeeac863a068c3eae5d161b19811f447fe31b572a7a11006c3608ddd34a677ade6c69e781bcd7938dbe451b0dbebb6c82708b393d363e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.0f"; +}; +footmisx = { + revision = 42621; + shortdesc = "A range of footnote options"; + stripPrefix = 0; + sha512.run = "591f181c8103ebd7a86440b27992df9eaea91d5998caa0f52dbfa48b7afc4791ef8c1f5a95d85b7cafd56113726beb74268b7498ec489d7b3142dcdf7f07adba"; + sha512.doc = "8c36c6eb169a804769ece280c2210949db96bbe57d6dacc1a0952fc1338d619334d3d8b46cbaa3dcac09e05a0c015f37146d8bed315238b5e918c373b2b42155"; + sha512.source = "5b069985c3a55240d762ee67a1da66895c304b5ac82bc0ce80c9e5fe9e77906cc0810dcb11c39b3ab63ce39f5d52964b7fb3319d49c0b18c85bc1410bad84ae2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "20161201"; +}; +footnotebackref = { + revision = 27034; + shortdesc = "Back-references from footnotes"; + stripPrefix = 0; + sha512.run = "8c18d95a4c74a7fe2ea4cc98df6bdb6813d9cf8323e44474330f03694758ee53da46d0d691164f6d90b2148a7cf9dc253dbc93548a3b33df3b0344096e4a90c9"; + sha512.doc = "685484323b721c5277aeaa041b1d40b0d4675bc901a371f36dbff6246063252bca69261748a096919c7345a4a6e6284a6093068555bb43eb92fbf7cfea41facc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +footnotehyper = { + revision = 60374; + shortdesc = "hyperref aware footnote.sty"; + stripPrefix = 0; + sha512.run = "24d270cf9fdcec81a91be4084e371338f1daa0a12c8344b850860bddef360c97d66e7475711106ee0d1d2f4df359abdb2f0005740aaca83651ce92f1d6c89140"; + sha512.doc = "605c22ffce3c413a0f9caa41a3ff7a43022a9c7a26e43fb177c107c2bc156c93a75f392b29d46880793788f9b5f0ac9e87cdb4c5075a247c17abec2e41527ef5"; + sha512.source = "77f579a0e7422a98e0fa9898ea5fb36223f66a2b9889a0da1b4cb40736d88d11ca87820503ea934e6b7e41033ca18974df4d4f585d8283a0e62959c9c16ab7c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1e"; +}; +footnoterange = { + revision = 66149; + shortdesc = "References to ranges of footnotes"; + stripPrefix = 0; + sha512.run = "b2c20e7b528219e0eee9ca32da40982670d3fa88938a58251e1ce6aca26b831d9ffdd89752ac19b78bc148c11c265374d2f679e7e3f54cff0ba445acc4025922"; + sha512.doc = "bf5b704bb39a8d369093feecd02da251eb45790381605495960dabb9a4ef099f9118dc7a791c9d9db74eb19739628638a8c003256a42890d64ed821ebf2b8c12"; + sha512.source = "22665f8b1e912c325a0ba7b8b05ca7da54f54b92e8f7700d045a837e98a544c651c479dff88937615ea1d13a25ae3f6d6f3a5a60c1c7402c8a892dae0fa0a62e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +footnpag = { + revision = 15878; + shortdesc = "Per-page numbering of footnotes"; + stripPrefix = 0; + sha512.run = "a1ce9661f0f6a69d1709ea053fd548aed428a9cc8ef0445b9c4b897eeef349bb9767c219f5d860ab4d7d264982c1f4404d33619c80dec8411350bb965b19d709"; + sha512.doc = "f83c9cc0701c63dbd5d3b7dd6038e1bb2c427e6edaca05b814778592587b066af3c4f7f12646f7b2ff7cc1c2ab8d2ffd99480dbfe72e50c9bce907e8e2d4c509"; + sha512.source = "a44b0ba4ef7b6328d6d307eca25c34d494000a238c69fec3686a55057ff56ae1ada7cacc763ff1cd26aaa83962257442060fbd795c76d61f92761bd66be81378"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +forarray = { + revision = 15878; + shortdesc = "Using array structures in LaTeX"; + stripPrefix = 0; + sha512.run = "f818d0899fcba2d61ad119698d3633a28d5300098a4bd56a82b7b1c9cfc12c47a9457efed7cbdf8aee3ba9ba4143eefbdd54bc995c84c9bbe99dd5717030bef5"; + sha512.doc = "e292418f60b290bf0567ea70169d66557a8408b2933221e0658d6d8e807b6495258a6ea33d65d14e13129ff8e58dc9cb50115459b014ec00e0b084f3d3fd55fd"; + sha512.source = "4a9574868753faa19d0e80bd08c524445a015bcafe241a85d59832fb308981d12dd133fa64e65804ac5c3d86617046f06a17a4667e8cb382676dfbadd6f012a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +foreign = { + revision = 27819; + shortdesc = "Systematic treatment of 'foreign' words in documents"; + stripPrefix = 0; + sha512.run = "e886be0cbbb64b11b6c54d6b62d6b38db1bb7e65b7a3a9cc951ad71d4cc1a93c323d8a1e17ba863daa6535c747c9801b06bc4d3c664bfb8da38518a9c93d45b0"; + sha512.doc = "d3804dd1b83ba173e4098696656c814629ff099699f332c3b81136c4519bd577aaabd4d2601893f88a58009f00e8c8ba44fcf2c4a3b72ce90af4d4febb510ec6"; + sha512.source = "d91bd89508318df931629678cdd0415da8baed9efcb55f965d71e26a61db705acc6abe14c6f7c17b61f54e32ae123ecd48cd018920b1f43626559e2b0b4a3c16"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +forest = { + revision = 57398; + shortdesc = "Drawing (linguistic) trees"; + stripPrefix = 0; + deps = [ + "elocalloc" + "environ" + "etoolbox" + "inlinedef" + "l3packages" + "pgf" + "pgfopts" + ]; + sha512.run = "edc3341b84e7e89fba3bb76004562c0bc889f944ed33474ba9cf5ed5e63a690202e851a30f44158caa8351b874b8e91659bd91c50d59ec43de9460869e4213f1"; + sha512.doc = "fdaec77023176fc2f7510a9e3b4dcc587898e1f96886340222f932c0d93b1002ad35fba8a38a036f713e41814f3dc6b3f75a5657ae485b15ffea43089895bcae"; + sha512.source = "45f912d17d29568e6ee267814d63bc14c20bb0d91c62b39c21301dd611c50db3b5f7de5f16b519da0f2b4d15609727144c34b16a620abb85114a42344cdaf24f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.5"; +}; +forest-quickstart = { + revision = 55688; + shortdesc = "Quickstart Guide for Linguists package \"forest\""; + stripPrefix = 0; + sha512.run = "52e77fa1a6aca02eb15838d7c04e37744cb4f37f0bb078fa571c1309244fc329d92b553f3e7c62f574561929b5e4964b71cd2cca3d17d4f9d13f9bdb9b0ab8b5"; + sha512.doc = "974a0d0e5a5e7e640e4e18cc5eb59b5a10efa7c5ab4f81e2915e9bbea30bcd68323cf95c62891ce1711d822336e5ee054735761a474d186e3c9f11fd4dcf6f9a"; + license = [ "fdl13Only" ]; +}; +forloop = { + revision = 67017; + shortdesc = "Iteration in LaTeX"; + stripPrefix = 0; + sha512.run = "e4cf4d9fdf01b753b40d4fb2c5edac94756ccf60a7e0b1bf0da8b5b0c433eff5669858fcc35096967f9a53e6a365880e6677956ebb86764cd68ba3093fa4be91"; + sha512.doc = "7315a8e90a83bbb73cb82525fec32c750d97f62fadcf1cd1faa816aeb2c54b5183c8fe659a19f213764979d495d7774df7aab7c950fa9886c6911e526712f0ff"; + sha512.source = "fe9aa2c7836a17debbfc392b44bcccb09de5b978224b2ec81e17daa07eef3eaf508206f1d54cc9dc7897122ceffb9d1b8d5957c26f2b4bcaed4ee93ebe3436df"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "3.0"; +}; +formal-grammar = { + revision = 61955; + shortdesc = "Typeset formal grammars"; + stripPrefix = 0; + sha512.run = "9a14266ff45b4d153000f27694869ce0b3a159d646ec0343726e4510ed8444d9e1ea08209f64ac2b88d8875e860880d048fbc67c5dd5292e60c02521f89de3be"; + sha512.doc = "48d80287ee514f4a846e45b3c0af655644817a3a8dfd2e95e7955fcf4866cb15d5b771e73076cd8cb6717d2d70bfd615e2b613ba58e79380905d3cbf23beeb9a"; + sha512.source = "55c30bdefed19d9a794cccef0a437cac4fcc8d36b62f3fed1a8fee4c8ee68414fcbb5bf14203eb6510d4be32058388adc4829be1572aa9fc44915bfd362f67ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +formation-latex-ul = { + revision = 70516; + shortdesc = "Introductory LaTeX course in French"; + stripPrefix = 0; + sha512.run = "f5f29f4a61b1c7145d03985079bdb3fb26a4a627a6f839b3c9020569388abacf501e9a285d29de66e7e3d6287d255c5549aa389c5fe42fe0093315b01bf963ab"; + sha512.doc = "2a64b940b37d3c460db5c31434a650cbe5d61d361ecb6d3ced250c65a4d817eff324fd296c137fb26a144fab77cdb2c93132bbab11a3f50f3cd0acff87812178"; + sha512.source = "d2c09f1700193814485fd25ef4a119875821a39a54a52429ef2f3889d276a9a50d74cab2df73e77c4ee62d96a413a5a8b488e216f9f11e5d6410fc0337662156"; + license = [ "cc-by-40" ]; + version = "2024.03"; +}; +formlett = { + revision = 21480; + shortdesc = "Letters to multiple recipients"; + stripPrefix = 0; + sha512.run = "9d984435565a9354d03f7ef1307d543e3a0bd3a8d398f6dec426f7ae16fe3c6b20e60cfb5daeca7be092427606b5a5886a31dc05d023d0f26d61aa1c07be4b8a"; + sha512.doc = "8eee17c77620f48319e862f2e7d8ae4b979c84250dd17f33cae9db52b1f219f2f86c690969a783648ee3979f24ef58e410cee47afcb12bcd26e4278af4625c6c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.3"; +}; +forms16be = { + revision = 51305; + shortdesc = "Initialize form properties using big-endian encoding"; + stripPrefix = 0; + sha512.run = "9d8b0c7aa2314c81afe09cdd9ba3455e3ff7e3000fa9de0e99da935b282c3d32bc60aa7f97a27450ce999ff101b606fadae3dbb4965cbfc1d4a8ca5c29eb719e"; + sha512.doc = "52bedc12e5ad33ac78c906f9d60284ed079b0f6d66e578f826c946c28de3996c70da0b11284e774ad56196875b3bd166962eeead9282f3d71f6c6a0d4a8cba68"; + sha512.source = "19e3efc0f73c919c7e74eaabc4b7f9b70be4dc2776b22719eec4f373e180f3ff736ac3ddc26209acfc9f9f9de9c594467cb6f67899f21f563386a44ff58c9135"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3"; +}; +formular = { + revision = 15878; + shortdesc = "Create forms containing field for manual entry"; + stripPrefix = 0; + sha512.run = "0be09e33fc3cf97552dc9e960979447de61c53bea46205a52b37094f7ce39f10309f559dc99c0037392d4924bb688e27bc8d26e5f6fc69dfbc3d3c41736223ab"; + sha512.doc = "09550cdf735f340a13c9104b86b37dfca67e39c277ec9f98bab08754f393368bea8379019c402662b7e7df351636e44814bb45c0970cb24db10bf3efdd9dd7c7"; + sha512.source = "12a7c774c2b6638d610c3277246ced4c8946f0393527ecd0da101481b1b85d1418537019962f86aa8b7657a0159f7c210acb3eea1386e8a528a09428619f0b6f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +forum = { + revision = 64566; + shortdesc = "Forum fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map forum.map" + ]; + sha512.run = "17336de3385fe31437577e541a63fe10a9ff6f972e02776448a2012337499633eb118d86f7c1995cfbfd5b84360370c614a3687b18880e24a7e4ce06c1874117"; + sha512.doc = "6598777d072ce157440923c767ec77f710ef38bfb019b7134d0ef8ee216d1a66af185a63a54a6af0c17d537a4027c7fa322ebdad07466787e400b6ff4fd77d99"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +fouridx = { + revision = 32214; + shortdesc = "Left sub- and superscripts in maths mode"; + stripPrefix = 0; + sha512.run = "01a2cc941482972cb8ca3f5402bef75f53d5e7db2b42f8bdf614c34faab3805c3548d3786c3e7cd9d8d8f7691cd5e8e71e056ad8afc24d52444c6969c11eaa14"; + sha512.doc = "8bc55b8e191b83ea42e228b47621780f4aaeec65248f5b3e9aad94443eeba08b1bf1bf44b7cf252f66466e5b0170260ad202c13abf2d76d4576833224212ae44"; + sha512.source = "c29e1c93e31da33a3ba3914ea2992a53b52bc18a4da0d20cdfec712037f98058be5113dc65d731253aff8c4e1b0fcac4afe3da36b972f1fb23ce45a795c546a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.00"; +}; +fourier = { + revision = 61937; + shortdesc = "Using Utopia fonts in LaTeX documents"; + stripPrefix = 0; + fontMaps = [ + "Map fourier-utopia-expert.map" + "Map fourier.map" + ]; + sha512.run = "127699baefe3be6cf18d50da60d162ad0daa8794797b2200d91d11f290de4f209f2d6097283e9340fb49f20810bac7fb376e014e419994444a6611718670c301"; + sha512.doc = "7f6ac2665a52e2bf4fd4769629e00ac2192c68628784e3bb9bc5cf4f9f4c99e8e46485344e7a1019182be0af086e2b5b0ed557650b1d02ed8a9f6e2dd075d59e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +fouriernc = { + revision = 29646; + shortdesc = "Use New Century Schoolbook text with Fourier maths fonts"; + stripPrefix = 0; + sha512.run = "904b464fb9066100512cfd8a8998bb089113b443e2df1fb77100f9b5a26d48a5b3512931c00292d19764eb4f068f207eb38dab78798f217f2533a65229411df9"; + sha512.doc = "039ce79d06bd1fb55b257f1c65c53412b15c26d4eafb9d3abe9bb7a7fa836c8b545718f70d935f1449fa235f33d07c81ad8f228608de20ffdfa99b9f532e059d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fp = { + revision = 49719; + shortdesc = "Fixed point arithmetic"; + stripPrefix = 0; + sha512.run = "27e60a78da80caf0e50d1fc83d227d19982e30950650845df710949f4d88db67dad96212331182561c43d37cdeabd3b68f9af55763f30175ab27a6b5f089870e"; + sha512.doc = "79b62424943f725ffc6c1698cadb9ba2fa6d9f0694741a951bbed23c43f870b930d966f110bbe722c17249c7211f08a3a95a5ce7e9da69b7487aec37e99e5152"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1d"; +}; +fpl = { + revision = 54512; + shortdesc = "SC and OsF fonts for URW Palladio L"; + stripPrefix = 0; + sha512.run = "9c8ca7ebe7124afec8ba3f4ba4fc27c0a54ab460e53afeab599dcc619f81e5f8ad744a3cd68df33cb6ce456d0db0fafe7ee04d585dbc3fc123e5758a1242cef7"; + sha512.doc = "7b951310a10295bb453eed81ae668f042262094971dcd48c83ab721220094b3a62b79b5090002cc8a7a1fa12b4e75157fd8ead7c4deed8fa1d3629cc6746e8d8"; + sha512.source = "64da822f5b40bb6abfa33d19bec50d8e002452a710d0d6ba3c5e66097e9a33f6718524471fdc716ecb951fcb2ad82659288a08ef85b72229ba40297fc33f7727"; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; + version = "1.003"; +}; +fragmaster = { + revision = 26313; + shortdesc = "Using psfrag with pdfLaTeX"; + sha512.run = "dc5d80aa4bab7a0a66258face6cf8222d03b12ea492f7cf568ef815a6d5950a8a2b36c7403ab466141f49cb8faedfbb33146820b88da17d8b8fa18a2b16235e4"; + sha512.doc = "61f0bd7dab46bfb91b634006217f01648007cbce3c9187b0811a5cc1755ec19654da94b47866ad9873fd57629f1561d1cc46bf3a4d62db618502aa0e67500637"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +fragmaster.binfiles = [ + "fragmaster" +]; +fragments = { + revision = 15878; + shortdesc = "Fragments of LaTeX code"; + stripPrefix = 0; + sha512.run = "adab94e7cc71c6ed2d881d13254793df16eaa08d1e37e4d3f0344e7a56cf08a4ffdca784871e8939f5db8e868b7166846843492ced0071c9dfbf56e39d20ec0e"; + sha512.doc = "dcf795392d989fdea695512c8f7011f783ea9091bfcc238ad296b0cdf1775bcf631c3097ede09a138117e39c7fa71da7eb355878c8389bdab2deb76a319102e1"; + hasRunfiles = true; + license = [ "free" ]; +}; +frame = { + revision = 18312; + shortdesc = "Framed boxes for Plain TeX"; + stripPrefix = 0; + sha512.run = "b66df0a91a8605aaeef2452236b5169cd363689a40f4a35ab9006ac18c21d4ae2a070407f84beff7de0be246f2f1e55c8b06f234921c4d7153fea9a7f2df1679"; + sha512.doc = "b61a3dfbc23031a39bbe01788f0f1d51750a3aa9132671917ed8d14c57453d588c75f8cd54beac9ac120f26b09fead55b871d53e918a735ee172f1603e4cd1ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +framed = { + revision = 26789; + shortdesc = "Framed or shaded regions that can break across pages"; + stripPrefix = 0; + sha512.run = "06f0da36c24ba42959b2176066d3e95f23dfed41753f4e4b07c1f92c4789e68d1b246c61cbdeacbb9c00b6eb990ea2b3ec75dff8ac57845102a867dfdf2c72c7"; + sha512.doc = "1f48ac19f74f5003df88700ff85c072c8a655d4623b82bc3b7c6570a548c0a7b7e97fe292f8557a72188c0047fc28e280bc3ab65f58559804fa78e89317fd67e"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.96"; +}; +francais-bst = { + revision = 69866; + shortdesc = "Bibliographies conforming to French typographic standards"; + stripPrefix = 0; + sha512.run = "02581d45d6d205f0251c216435e068a44b7733ca23dd8f47df119a7aaf6db8efd9eef892e71219219713ab8031a77c373826c8b259e5c7f4f54f6b6edb2d8f5c"; + sha512.doc = "1f4a474fa1b953e9809315509c664fba06490dcef123ff8d1de32f05831fccafe45788a8754bcc70d6df687a1b75645d6f36ccfbe56958166e51a471e6c703bf"; + sha512.source = "3125847740194c77fd502d723fccdcc69e5ef93a1997ae46f1dac1b5a7b2a2978fe8a8f55346b67f2bc5b5c442f562a4ec3dd39466663750c7af7bfbd17f216e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0a"; +}; +frankenstein = { + revision = 15878; + shortdesc = "A collection of LaTeX packages"; + stripPrefix = 0; + sha512.run = "1d94962185391dc1fa9edcadd67a60d9a4b59592442ffdd45badea6279db8dea101b418ab3e03284e6e88c247fd213887f06e72fb6c4a002a66acaee82d8d4bf"; + sha512.doc = "8d8a404aa0a61fb76104bc57e1c2b837ddf68516c4d4fdc1af0a84425943f4e23a4f660b28b02e088db8849090e3734915ef7e0216f578a5199cf12115c498cd"; + sha512.source = "8481205c937e58fc0b46eb25e4f7c8b28becc7ebf2529ab784f0bbb7292dc21faa9ebd1ef3be2a98950f1d2570b23eb13f7d6e134b8c8c5eea25e81c0e6c6eb5"; + hasRunfiles = true; + license = [ "free" ]; +}; +frcursive = { + revision = 24559; + shortdesc = "French cursive hand fonts"; + stripPrefix = 0; + fontMaps = [ + "Map frcursive.map" + ]; + sha512.run = "5ac038493648ad14626e2a015c7dbf96a41257ab1d1086f9e79b0128df2c85af1a279e021e52c722636f8647364791bcf7580cccc1d80d60084f5a9a55a23317"; + sha512.doc = "eb0559574af52a711f61ab84cbda996c7cf4b2314b4d5faaa18824ae3396f041b7a5948151b2b5cffae6675bbe09c2e4358b81e9ad7792e5ece8a2912d7ff030"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +frederika2016 = { + revision = 42157; + shortdesc = "An OpenType Greek calligraphy font"; + stripPrefix = 0; + sha512.run = "b7b271af72364e0d2d00ac499bc1e419534d479d27fb424b7046373323354c47da29b888f0d765e3ff4725333ab3d407cd21a064bc4d063adf890de75aa49e3a"; + sha512.doc = "e205744d689113870fce9cf791f089ccb59cb6fa326c811f34db7183588df3de9b946cddba2a02128a9b88490e9326bea6563fa0fd9a3cdc76467555b7b8d198"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.000_2016_initial_release"; +}; +freealign = { + revision = 69267; + shortdesc = "Align math formulas in different lines"; + stripPrefix = 0; + sha512.run = "ca74fc018fe0162cbc403c32efa1101edc215bdfcb9e5432c8d395cdad4f26550df6447b7cef9ffb103863052886b608c89ea5ad56a8a909822e7fc49f3241b2"; + sha512.doc = "ea7ea3cf64373fb06372d4452d3b66654813f52e221fd1a002c5b95c63604d0aa3b3a21ca6dc70e406b51e18628bd6ce55a74b1e2562b9140811f4d860cef91d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024A"; +}; +frege = { + revision = 27417; + shortdesc = "Typeset fregean Begriffsschrift"; + stripPrefix = 0; + sha512.run = "39d359f01256f2399cd9226744aa9735543d5c9eb26104855bb52efaf51b8c720cb85e5be08241d72d3b2e1c2deb9cc7a10dd90ffca789ae91b6ea6b7cffb879"; + sha512.doc = "28c5cb420f25ed57a03f3914ce2286732ab8e06cbb0b8446ab3112ccb79b34814762becb7ac7457593e1b5b1579613a76a8b21fe2c43ac9f08175495ea87bd1c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.3"; +}; +frenchmath = { + revision = 70163; + shortdesc = "Typesetting mathematics according to French rules"; + stripPrefix = 0; + sha512.run = "dc8bfa123818c5e3ae96194158cccee72c29bae0b59dac01014750d1907039eed6ef3f24f08a32f08f15320c28e03bac3a9f052010e4609108bb5b4a4ff97397"; + sha512.doc = "1a1146f868e4d68014b080462cfce94f0f8362d23ccd42fe2a16fc526834850939aa10bc60dc65e5a66c35d40632f7c7b1fc607548b966424ebcda59104264bf"; + sha512.source = "9a3c55e4d175635953917751c57b9f762a20046f1967c47a022703249a0fdedae4264810b16bc4188d6b19ec3836835e2d911c78fa7769bc1701b906b8898f65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.10"; +}; +frimurer = { + revision = 56704; + shortdesc = "Access to the 'frimurer' cipher for use with LaTeX"; + stripPrefix = 0; + sha512.run = "81057096f64d8ed53fb8afb9bd72eac6538f5babdcc054f422c7d6d0fa73b88459d250ed56b1666ec8d6c936b52102a9a1988d04ccc2efe76761e945d9027145"; + sha512.doc = "d2c8dd345fed5935fe2e329ebfe7c2e9a5c836f3af5d52605e35ce32ebf51cee529c182505db8eaec7772476f758bc5905a8b57cad5ebd162732801c2cf6d352"; + sha512.source = "a0fc0076cb4beaf081f21ca474ee287cfcfac07c889907d690093ff7b188214875766746bfade8f7de9182e5c32c7bdf912b71336f078bee120b042615056e46"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1"; +}; +frletter = { + revision = 15878; + shortdesc = "Typeset letters in the French style"; + stripPrefix = 0; + sha512.run = "5f6c61585ab0626931cf7f19d18138ec70572f3531f36cf94eecd82d93855a2ec8ed2ed0146971e035f8b5119df7c602c6279a9976e024ac85869953448d51de"; + sha512.doc = "36fbbc422eed8e577e054067e7b442cc84b640fcbd0706e3d8cb503884a5208e0a5bbe0c40b67cb5b495bcdd0ba7a78855338588757e5a9d26dce21f9bedcf3e"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +frontespizio = { + revision = 24054; + shortdesc = "Create a frontispiece for Italian theses"; + stripPrefix = 0; + sha512.run = "6045214cc6a8325d8c828c2591fb43995f098803b031adf50bf8b4dddfa0047ce110dd25e5db71b068376893b7ee83a70806713a83b90a26c4d1c8553e4f00f2"; + sha512.doc = "beb8cec7ff51ff9b85e2a650bd7931070c126ea3b126051eb63194e8a071f6dd92d0014953afd85b0e73095208fdcefbf202d9c0ac22003f71d7f7a72f4a4034"; + sha512.source = "690c42ad3b6db68c8d4305fd9c402126013a26a28049f5cdbaccc455effacf9bbf86ba77d91c518d88b72e48930939389ec33620e8adf06eb20762606ad53daf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4a"; +}; +froufrou = { + revision = 67201; + shortdesc = "Fancy section separators"; + stripPrefix = 0; + sha512.run = "06c13998e051544b8fad8c65dad787b670beed1ec177262d3076b77d805423196b1b9092c0c2acf383450ebfefc4e670406dd7ab4413217c492759335a2d8310"; + sha512.doc = "fd49cc43d8479aa952b68b42bdc58a1e6256048027eed2d50ee80d2312f375956d6936f91b7a1d0d6ea2cdf5414b09f987e4bbd0f7ba279ecaccd8cfc9f6dd48"; + sha512.source = "bab0baff37c117b842d341045b3bc01ca9722f92c5b0b18c8e777dcbd06a8e6bb8a13432f44b561ef5857a8f8538e2ef47a9bc5a1f012addaa2accc1cffe971a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.0"; +}; +frpseudocode = { + revision = 56088; + shortdesc = "French translation for the algorithmicx package"; + stripPrefix = 0; + sha512.run = "f8807f696b69f5ad8b08ee24c210c084e11652d8f00b996e48f5e08c894e991b0f2cb288ac72e6b45208add3185a3e14fcfb432d8b2d2844359f54811859cb07"; + sha512.doc = "6c22157462f55d2c19a8da146558556eef0e28ed7f79c5231b282ad218b041d1d850ffd24c8f06c914ae5d9efd04d442061598f6f427ffe9393cb2ff1a4324ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.0"; +}; +ftc-notebook = { + revision = 50043; + shortdesc = "Typeset FIRST Tech Challenge (FTC) notebooks"; + stripPrefix = 0; + sha512.run = "9dca1b2e09293df3a12df85f843e1701e1ac428f4caccbc196f43cfd02517cbc98908fe95fcd3e26685cd95dc8565aa5e29ad79f7d42ec5cdeca0346db6a759a"; + sha512.doc = "36022ae2df65e45e2fdd2a01e2c95502c3acee0e8fb0b738ef06b313f47cf8798df30a41a6f5e7b4021a556ebdfd17f84b4a79d54d2b6e88c8044f0a67a87f8e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ftcap = { + revision = 17275; + shortdesc = "Allows \caption at the beginning of a table-environment"; + stripPrefix = 0; + sha512.run = "1287e0bd63fc92ef3e3c77ae3a6113cfcca38dd63f4a90948baadd2a365c07b38631d916230baeaf550b1aeff07f9cac3a26a07301838716d8d70fcf0843953e"; + sha512.doc = "afa317f10c600c88bb96fccb0383b291e1fb7c11abba5f6bd1efb05e7d2ce117c4ece7bdf9a9ea16c71c116143aa65ba26cf7c2e1dba68f225b655d122169001"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.4"; +}; +ftnxtra = { + revision = 29652; + shortdesc = "Extend the applicability of the \footnote command"; + stripPrefix = 0; + sha512.run = "df8395b996f96ed72505ef1ef7f0e8e6101d4b26059831b227344023514d377eb189961a240e83ba42ac4ef7e8086b8ffcda347290014fbb1cf1531371c20eff"; + sha512.doc = "fc16ff992e3339480a4154169665be49f51e56f361d0b1f97842c555be59485fd7edf3cf815e32642826224e188c5377fdb2ab36746cdaef7f552399a4b7119c"; + sha512.source = "87e580467312c6198fd7106b6fdfdac994c5f9fae3d131b793da60ebc9d852141ed6630aa0d4273e50e7311b6e10499a3e4e2cf141ff197d5ed72822f0c15be6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +fullblck = { + revision = 25434; + shortdesc = "Left-blocking for letter class"; + stripPrefix = 0; + sha512.run = "b298f55ca3afe8819e44704329c06be2867b00c1a2a399b5db8de8477751f9945bce1041450c7e91559eeee65c9bae5e76b57469c956239c9752341b820047c7"; + sha512.doc = "9da7587195a077f8218abc6a7df98bd15369650e00ab3893b6cd70a268bf34431b8c2c49b3415269bf6b8d1ddf51a8e23e76ae87667309f8466ad69da87f05a0"; + sha512.source = "2ccd2da9f1924a1547f4a6b870ce150e6140abc9c1984f1a951a59146944d50c6f8e115ccfe79232f941dbec756e26d460037d92af191eee644bb2dcbe986c6e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +fullminipage = { + revision = 34545; + shortdesc = "Minipage spanning a complete page"; + stripPrefix = 0; + sha512.run = "7ca92205caae688761ddeadfc0a37173b37e285adf3c1f54c4b2994a0c82c90713a255d5068784e3f3866a7f1af603906513a561632b2d09c68477e497330d2e"; + sha512.doc = "111145d2f1c81f74692df8ef397d36c4c0d7b6c89efe0250571c0153b22b9d562df0dcefa90e3be96f8eb518af75ee8a23d42ad898e23668265dcf39d3c678ff"; + sha512.source = "d95dabc4565fd48b8a6e8b35777fd456934a3cba8bac34629ee6ff4847cd1578f70a06e6b87a9b76d26e341a502d1c284e4e155aaea9c92a12dbf6d0043d8249"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.1.1"; +}; +fullwidth = { + revision = 24684; + shortdesc = "Adjust margins of text block"; + stripPrefix = 0; + sha512.run = "c9b9c37991365346804b51aae7b4645e5b63eb6a3c5c60a953cbe0583de0960e8a9d6cc99dc7526944415764869308d778fb85e7cde821792bec940f6c19072b"; + sha512.doc = "55892645ce01b31dd0285749091b8fbcab0061a7190f7a426379f6d3ea8bece8a5c054cad8b53efe1bb69a68fd3e49c3e8c8afb94954ff4ba8838142ab4576b8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +functan = { + revision = 15878; + shortdesc = "Macros for functional analysis and PDE theory"; + stripPrefix = 0; + sha512.run = "0899d9a3c30e701d5ba6a0275521a40a3cf2df680e9d4a95624730184fb370ae2537bec1becc3b185647a988af5fa8e4bda5198f42cbe68cbc848d8915f1c9da"; + sha512.doc = "c824825fd424316701e25fc573a431aa5967af0d520b631489b20608459dcd0f7abfac277c5b1e7b60e0a2888e0b37d787755acd6f671e48d4911969e3058692"; + sha512.source = "f83465845900ae5bc872fceead5a83fa972c9fa8b858606007237251ee2dd77cbd095376194aca0356e5c8be53fe653a88f5a10c1f73effa8201b3adf55c5a17"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +functional = { + revision = 69929; + shortdesc = "Provide an intuitive functional programming interface for LaTeX2"; + stripPrefix = 0; + sha512.run = "efd3de1e1944193caa18069a1478e19bf602f1110c880ea14d9d7af146d4ef0da5c84078afcda4a26a326f01978240f6c011212424f029c491148317a9b60e43"; + sha512.doc = "1943c1451b357fe05d2586651cf52e8593927847ad3f88ab21d89626c8dba63e0bdac8e702dc79f7a8fc4ea8ea73c7b6fd05e19e57caac28adf5f1d53acbafb1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024A"; +}; +fundus-calligra = { + revision = 26018; + shortdesc = "Support for the calligra font in LaTeX documents"; + stripPrefix = 0; + sha512.run = "a999f372ef266e66a199935a0783d99293141aa08586a38d65a3748c1a239eca7b0faa74d537085852e79520343ca937943b30ce38820fdc925d75b1a334aabd"; + sha512.doc = "93aa54f12ade2eab798bd84596ec3b366db0a15eb05b5279261af8bc13bc1ce782077de36465e8e29d11ea1b89456ab207c33ab907e5c31af95e63d5d897da88"; + sha512.source = "bc5cfc694592c7a0fb469f752a6ec854d11d9f69588fa6e42390080e88cca3da2fbe888b826ae7a3c07505bc418129237faa791dbf4f3dd9a31cb8e06ad1a9af"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.2"; +}; +fundus-cyr = { + revision = 26019; + shortdesc = "Support for Washington University Cyrillic fonts"; + stripPrefix = 0; + sha512.run = "de84ebbe6e70f61bf9765b9368df95fa5ae607a8d6e1c5535240e8665bb097c6958956d1b19ccf12a2a510672675c7ffa08ab98bd80b6ae2973fbe65d0e8d343"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +fundus-sueterlin = { + revision = 26030; + shortdesc = "Sutterlin"; + stripPrefix = 0; + sha512.run = "b15a1fa2ee3272f25a616234a335d0bd5c8ac810724ecf453e172d2b68293b55f01f3e57acf81c17721cd3f489b35cde077d5456b78afacc589853224f1bce94"; + sha512.doc = "7162188682c9129e1788104fe94aae2a70607e276eeec4367ae60ff9e50d26aa88a73998028b99ee42627aa27e8868ed2fe72063db2e033798b09ff0b7a13477"; + sha512.source = "59f5e1e7f338445d3e8430c5c7cf69de9499a659ad5f32566c26166bc2997eab82964919c50aa15311d19c80a14a1a7bc4380e985f382d4ee89c387faef38b37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +fvextra = { + revision = 69001; + shortdesc = "Extensions and patches for fancyvrb"; + stripPrefix = 0; + sha512.run = "42c77e74ff16a7aee9f79f8a6f08309742c1168138ccec2a085baad525422119bff6c10ee323e29aa45509789af188eead92379c5bd0d30c5e4a9ae557a0d991"; + sha512.doc = "27ee96621793f4da2cf719c49edeb3cb272fee6b31b13cfd86653ceb027c84dfaa1885b82510de22e0ca1e365ed783b745190809482a9f20796617e3fbc059c2"; + sha512.source = "49252913e7683100f1f12c5bf85420b6de4832d68af740fd8bc0f7fd1a18aa9e39005f6217c89c4a532aa72250bf0dbfa6de7f5991dc48fd6fc8b91e84606a5b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6.1"; +}; +fwlw = { + revision = 29803; + shortdesc = "Get first and last words of a page"; + stripPrefix = 0; + sha512.run = "ac2c981bcc4da92a7f91c3ac17d66c4e0e7c94ff1bdb3bf3c7f6a4eef19fad1ecbbc6048a5c74627126c7e1190ee18c2c9373e80d52130a2d272c58ef70de6fc"; + sha512.doc = "bb55ca044aafb5b11b89b3c817066c4fb20facba8812667398ecf945bd8ed4b11bec2dfd21455db9cfa5e81e5f865655a3e6f4d3724bf40e47ad1db708896902"; + hasRunfiles = true; + license = [ "free" ]; +}; +g-brief = { + revision = 50415; + shortdesc = "Letter document class"; + stripPrefix = 0; + sha512.run = "6c0a8e653cab5f67a85d25e18b98371323b3dd09365f6a3d1b47eee409b233db4290f6e6de70128f5b45facfc7771475671990bb2c79a1718c74972bfba78070"; + sha512.doc = "147d30be05a9224e141d9dc23a81750d0c43bf590d6e1dcb3e92fda6c668031522ef410904e5c7621c9b98879d6809fe604cf47de7f24891bc7e15c7be5ad05c"; + sha512.source = "447a25d983f71d109bc747ee8ab9e120a0b7c698a9238ea5363d4d826383af5587f78f21c442d4e1d999eaf4cbfee813063f7547e786df962866e57c55673c8c"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "4.0.3"; +}; +gaceta = { + revision = 15878; + shortdesc = "A class to typeset La Gaceta de la RSME"; + stripPrefix = 0; + sha512.run = "54c42cde3613f1fc28ba0a675281e64d2596e8f3c7831e1b1611c34fed1a82c01da2d6eb98058d5776ffc625d04e62359f63819307d04c6296705de74bfcef66"; + sha512.doc = "594fb3b44492018c6777e014ccc4784813784d3e282cffec0f6b6410a59f088ee30c8113a714fa41369eb795b35a1c615f3069a43697d0bed887123a44c02bf7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.06"; +}; +galois = { + revision = 15878; + shortdesc = "Typeset Galois connections"; + stripPrefix = 0; + sha512.run = "0c864940c2a47ad82f031868c1933679f9ee0e5ab01e98386433311a4230a77c7a5d41016619fbf7bb1957fecc259bd092d7a0894eedef91143a0d85e68a6978"; + sha512.doc = "7c71fe703efe235b3d1cf3298c99f2ba7dfbdc8d7c20861e8738070ef03b9671b1a4f6df40b2238d4b7cf9e765a1cfdc6210ea63ad06dfc60e0ac7a101735315"; + sha512.source = "f1f62a005edc9b6b5c1b294aedbfe00cff61c48f22d2fd0b90d76b1c6144fd9c8b885890e4a6c6e64e054ceb67b851c6fe3d9f2f1baf2801f070f0bd269d4925"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +gamebook = { + revision = 24714; + shortdesc = "Typeset gamebooks and other interactive novels"; + stripPrefix = 0; + sha512.run = "4af22bc285bac3f368778dae5c91cf6a1999748a6dfa5fba96e166ed320e124c33f2b6d6bee16ad8d00d0f8067b24bb3567a1aba849b74a6b02fed3bb85dbc0a"; + sha512.doc = "58493c9b39343846913263f53b3bfe0fd89e4adb4154580d1bb0ff5d32b5b91ddc75511a0241fa3b98faef8b2d9d7c1846aca486e0c7262f8b3ea7a6bfddc619"; + sha512.source = "793f5cb23ef53b3d24d10ac5d52cf1e8bf90438571e23b5171c778ac720fb2c52a03a90e1f83f353df0b5410e94b5551d0855284df72c34a0f212842a3f96c41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +gamebooklib = { + revision = 67772; + shortdesc = "Macros for setting numbered entries in shuffled order"; + stripPrefix = 0; + sha512.run = "b100e95290634e0697bc420259b287650c8bc436a950749c8f60955b4bb1f622f692730640c8b882400d7f1ac7a9cd847cfeacbd5310a5bd57f3925f21766159"; + sha512.doc = "f34592d3d47f5cff749fc0bc44b4de233a13bb962674cb22e06dbabadfedfc303049c73b18cc0807e0f1827ab583732a0019345991b3bedd6daa1f3e84c40108"; + sha512.source = "0c97580b9451a154838e8e32a67f3dd2af36d1a9e3a464d0912a0ec2e6a1338f617855ff49b199cdea21dabb2678b1e99c58dbe2a3ba5c976eebbdd87edd5a20"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +gammas = { + revision = 56403; + shortdesc = "Template for the GAMM Archive for Students"; + stripPrefix = 0; + sha512.run = "8ecc1d5209ee6492e032b30e217dbbd0ae4c1ad9ab5a42e7e042eee63809aa257c8cc5d720f54be5553c8999f78334b8057bdac1134d4788144a3cafade7154e"; + sha512.doc = "62ec08047df846d2e32be9396356fdbdb9eb9c1867079a891bececc1d56275666127d997ddd4ed2c2f73423dc4a2e051586a1b06b516fb77372b04c60a4ca342"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +garamond-libre = { + revision = 64412; + shortdesc = "The Garamond Libre font face"; + stripPrefix = 0; + fontMaps = [ + "Map GaramondLibre.map" + ]; + sha512.run = "2c8a9057bccac0b8187e7e7b38445102e2ee89885595d93eb3dcd88bea4fe18d73786b471812f9a0ba256a6fe16ceb3724902e587b3ce6a98a1461d554182698"; + sha512.doc = "b8a575d15c7020287313aed6fc7f08d4d6d9cc02633527a657db4fd0fe39a25154f7dbbd9d6516ecd4662d08644d803822a19da43348f955f553725558c0dd6a"; + hasRunfiles = true; + license = [ "mit" "lppl13c" ]; + version = "1.4"; +}; +garamond-math = { + revision = 61481; + shortdesc = "An OTF math font matching EB Garamond"; + stripPrefix = 0; + sha512.run = "fcab922fc4faa8468a2d8076664567c8533e95dc6767eabedee5c053bbdbb721890731f0d976a2d6047709f058a4d5e029996a5a5574912d21cb493f2975a76a"; + sha512.doc = "c7c5795e7d9de09a590dbfd7311786027be9dcbe51b1f40284639341953effbb0dfcb331061cad0a8d01df55c52611a8d61a6b62fba701565bb643826ba55734"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +garrigues = { + revision = 15878; + shortdesc = "MetaPost macros for the reproduction of Garrigues' Easter nomogram"; + stripPrefix = 0; + sha512.run = "e1440fcf8eb0ccd3b140649c590c902882a8a5a02d4cc14589ed44193f3a70bf13839e9de9663c500bb6874d6fce34f5a21c07e38a7456738548b6ebf449b258"; + sha512.doc = "0c91f7e1c8fe4910fa7052440edd9afd81c8932e99368219c8a5037bddfa4c8c11037576e9c94721062df9cf7fd5d467389ddcf3aed3e1853be38846c049100f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +garuda-c90 = { + revision = 60832; + shortdesc = "TeX support (from CJK) for the garuda font"; + stripPrefix = 0; + deps = [ + "fonts-tlwg" + ]; + fontMaps = [ + "Map garuda-c90.map" + ]; + sha512.run = "a806538598cae0365968ab20936631a052dc65f9f6056c39197f7b1c7a5aad717a7a8b72ed2a1af347f8ce91f27d7dcd74b758db8f01fc7810a8d658990bcc28"; + sha512.source = "58f62ec8020489b69743c0591129967730f9ad0729f7cca343ab6e6fa6675122a1e37bf73f090cae050cb695a14dbfb3c52346e3c528e660484d2cb576aaca65"; + hasRunfiles = true; +}; +gastex = { + revision = 69877; + shortdesc = "Graphs and Automata Simplified in TeX"; + stripPrefix = 0; + sha512.run = "1716d7e7a0327fbde392a435b783da48382adc8e5751f06730dabe655422b2bedbe6d6ddb589de67d3d15df0b97354bae10aaff81df1795f01e44d6c7f90681d"; + sha512.doc = "417c7ac005a4d754dc5d6082e5453f400aea53f61848efd244e97a3c6449346d2fb77989598113b15d16d81d70a9abaaa06f39ebccb542fdb88265e1dbf170ab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +gates = { + revision = 29803; + shortdesc = "Support for writing modular and customisable code"; + stripPrefix = 0; + sha512.run = "704126d5e113b9718654e5d611d169df17b45ec09f187d86d1c108a331e80939d0266c4473233277e1b465a70775da1ea9576744171209ab45203b4059b96b83"; + sha512.doc = "a9cd7d2c616021d429b299027503fed60e8474774b6d57095371f1afaba68709770857ba09f74e8e5223dcbdd1d9f1f70a0ec81c3801b1a77c3a494336fa86bd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +gatherenum = { + revision = 67201; + shortdesc = "A crossover of align* and enumerate"; + stripPrefix = 0; + sha512.run = "c700375b321db078bc99492ba42c03855a80db6c1661590dba6763d52c65ec7c86a9889a38956a5015b78416d8c7a296efd764d1eaa758891cd8c7f7d4cef8b4"; + sha512.doc = "a1f184ec862cb4d343b4dbb8014faee217a61e1f72418a8472a2a46b6731af4e3e767755f4f367631f40199aafd449aaee9bf409e9358822ed6006eed495d4ad"; + sha512.source = "378a9b33f0b370fdcf8b068e8cb58def5b9c66b7cae4a72cd02d4fee61edb060bac43fd30180c5709b2e7367861430bbad0ebc812fae9520fe72382ead5b0354"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.8"; +}; +gauss = { + revision = 32934; + shortdesc = "A package for Gaussian operations"; + stripPrefix = 0; + sha512.run = "9dd3f7685a8b7bbdfbee1fbe5dcc5d2819091c7c20df7979b1b0fb7971e613e45b6321a18674e88bb0d6222f050f0ab3959b087be70b90b5bfefaeffacc733f9"; + sha512.doc = "50de7e9af2360367de7f7136def2536a82348752656b1c40022d7e13271cfde64e67bcd482c2d208f47b88a30560f8179b7b8706288809b41d023c037147f0c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +gb4e = { + revision = 19216; + shortdesc = "Linguistic tools"; + stripPrefix = 0; + sha512.run = "1ec519ad5f22e6d61d16a0233a73065b45e8628549bfecd109f968b8749c362cd04f358d67e96b1311577f94f6152e7de7a9e3264ffcff5c5769662b52df7e29"; + sha512.doc = "9b8c8e2590a1a515aa84e11a4028aadeff9e4acb7d3ce99b0d21009e17443db3d2feee85d888a333595e144244efbf978239e6dbf48c68a43bd5709d9489c203"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +gbt7714 = { + revision = 64633; + shortdesc = "BibTeX implementation of China's bibliography style standard GB/T 7714-2015"; + stripPrefix = 0; + deps = [ + "bibtex" + "natbib" + "url" + ]; + sha512.run = "f2f869bf4d507ac76ee576f1bb739bc5e5681d3f2cb1db64841f90dfb22a9b18aab04c5722e231280cb94f055ab002ed99fc965bdbb3d2bdeb8d953f704e73b2"; + sha512.doc = "17b79fb795d0b2a0f2c696da83ee1196750c1fef15c77d33353d6742443d43287b5bb96c349be8e58b0df538f4585f45b353234bb100318cbbc6de6f14192da9"; + sha512.source = "0d7e44fdd1106800d2dac2cac49dfe4c9154498837e27880f0193fbc8033f2a74fe5670f79c929ce2216fef216288e5e072f1ccddd23cec85b6265ad569d21d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.5"; +}; +gcard = { + revision = 15878; + shortdesc = "Arrange text on a sheet to fold into a greeting card"; + stripPrefix = 0; + sha512.run = "de462bff229779faa33c546d525e3624f1ed372c09c1b90fa9270928caf0a2604f2bb9d3ef0768de7dd0646202d7a59995b7252c0b83b19eaf777438bd1acc47"; + sha512.doc = "f7fd3c07e053962c88d0a0b8e5899272a3bd9af4cf1731f88a7014773d8f0ecc91fb45e1e59b1a372d8c8977e1dce91c5162558d0245d77a187ac7787a3710ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +gchords = { + revision = 29803; + shortdesc = "Typeset guitar chords"; + stripPrefix = 0; + sha512.run = "7fd655af5446982b450e3eec2b8966f2fc17c11686bb75f516ce0043af651b90e4f88c9cfac133929fbb686fe3f7be6de64d89bda6822f218b691791c9207950"; + sha512.doc = "26818218c9e3142f4bba491e996556b28266953c6b84f1c3de58d60b1bf100d15513fd2898507cf43226eec127942dede647784060668d86bcb22e3fdaee96cd"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.20"; +}; +gcite = { + revision = 15878; + shortdesc = "Citations in a reader-friendly style"; + stripPrefix = 0; + sha512.run = "169d9e96121d80bcbe7580e7ff447e8df252b19dca5b304514a792764344df679e9275b1a552d67070d3f5b0fc41c70a6cf1ce9c90358dd9ab58878643be6015"; + sha512.doc = "d9b50778855efc00ba4d6d6f48891865853b8de8e55c3432140b0ba69767c6c13ab934c2be43b2556a862bbb5413ddccce158ec4130576617a75708919f1ab0c"; + sha512.source = "44e8fdfff2e015a9bb034496454016f8f03e08e2f5b8ca907670447694877a383ca99a5673db107397dba07142e99cf01d9ee59a4a360d6146a389de7d103cb1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +gckanbun = { + revision = 61719; + shortdesc = "Kanbun typesetting for (u)pLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "ccea354895392747e5c84d750ece8f3717a0f9c529fd5b8b7ae2554bbe607b4497b9a8d213c479d5ad11e8ebc40187799ffced6f08f4fefb4e6d3cf223566c98"; + sha512.doc = "4a885440883d615ad20dc083c768c3b64c3cdc627e1daca4008dbf07672ad62e8020a9b14f732d181c4a902adddd49908c4a0e41b3afbe2d68d2f90c5989e78b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2"; +}; +gelasio = { + revision = 66805; + shortdesc = "LaTeX support for the Gelasio family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map gelasio.map" + ]; + sha512.run = "d5ef910eee7b3e26a180c88ae104da77becb4bed3a955938486d6763c2a0dc51e71ab6f9351304894d5e531fab714cf75f6a0cc421d074b3ac86931698582274"; + sha512.doc = "aa49c6e0bebb4c097b78ba11781f7027b783c6280a5fa0e3077f9c1eb20f6b372b3910f5c78b0103afa2429938a94b277bdcacd210afb8bad2bac92f5022ed8a"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +gender = { + revision = 36464; + shortdesc = "Gender neutrality for languages with grammatical gender"; + stripPrefix = 0; + sha512.run = "261d57b05993954b80f82844f590f952fedaa4ade8f89704f2e2b4e2d18441ab5c8adef2ba3dfd81b61bed53150b737ef72964e1faa44ca48e923cfeb5a1bc14"; + sha512.doc = "7c8bf143cb7ae1d22416df88aecf7e004eb02bf199f74f8003aeb9ae3923a3db42f1735650fac8aa908bf220f16ca48b3e4f9dbc312668d87df65149ea674be4"; + sha512.source = "ac76060cc1b8c3bd876ccece1d82127575b956fa1bd3bed63d9d8a927845c8477c903b47be3a6e2d85de06899957d273d981f250cc7d02a12830a8cbfa6f6183"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +gene-logic = { + revision = 15878; + shortdesc = "Typeset logic formulae, etc"; + stripPrefix = 0; + sha512.run = "b7cdc0d653aa8e25d763ca4115fa6fc857ddae35ed835aee6b6a204ba83d01ab91928b00248c40677ba132ef113276912a6b85dfd456d937114a3263a1ef4c7f"; + sha512.doc = "db358777af18e7d2e93dc23084bec0f47270b4cb6c6078382a1eb9ce288aed06a6f55fc30ce728b1312d06f871458fc6b5b697b1073316e8f727b5ee80f99468"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.4"; +}; +genealogy = { + revision = 25112; + shortdesc = "A compilation genealogy font"; + stripPrefix = 0; + sha512.run = "907394cb0ca9b3d339d78595e613236038ea2acce27c4468b7d028d0db7ddf36f7037c4f0bc63d5970e904d0675bcaf057c769239a79f064fa6aa9dae4f2014e"; + sha512.doc = "34c9d737d31626331a18051a5b04584fd896d7cb8ea1814ff2fbf30486ec3578b2bef16155b9c8f2ca645d42f797f3101c799d3422c05f824026e268fa4f94e8"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +genealogy-profiles = { + revision = 69580; + shortdesc = "Genealogical profiles for LaTeX"; + stripPrefix = 0; + sha512.run = "36b0b0107bf8999ce6d2a0ec46b792dcb9cbd5313734e2cdb2879bd7a15d8f70af09fbc831b6183412cb72c44eb6fe3202d00a0dc510e1314ce7115d78be12dd"; + sha512.doc = "52f75186e84f03f21e33bc1b5ca935bddf8f45b348ee5dc93d82506b444cf72a1a51c4a33b0510cccd8e89cd46a74215e6acbeaa5d2f32953ff7ff3629bea5b2"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +genealogytree = { + revision = 66513; + shortdesc = "Pedigree and genealogical tree diagrams"; + stripPrefix = 0; + sha512.run = "603091897c07e0d6643482ee754aa9f0a49ba4e71e3a426c35404f46c6f6fc43a6d24f721023706cf0c03b152ad3153a8322b440a89ee6542edbb8aa71a384f1"; + sha512.doc = "88757eb6be6ade83a5125da7bb7bd0abb3d56367a330607fdea9b05929c8caaa4fad0be79863006e9048daa66aa0ce7ddddd1a2100ae9dfcfc835456c08453f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.0"; +}; +genmpage = { + revision = 15878; + shortdesc = "Generalization of LaTeX's minipages"; + stripPrefix = 0; + sha512.run = "b2618005fc0f00a636e3a307ba1038f8dd39798e2ee2afa4d9169eb45ed4b38a67a57bfb516e9dd8d93ea0210a7fcde21b26c0564b974442e18021d83f905265"; + sha512.doc = "c428886adead6fed52f0d249db34a950b4f22b03770ce1bff0831fca29477ab92b5d83a9719b73aa45aeb5f2067f31afc810b6cdfdd69e709ec5e61a08f45472"; + sha512.source = "563042ab68aaab51d357c957111419012a0edfd27332bf30be0985e8625abce945ca6a6a081e62f6d0ee29b6885a55270553b622bbcda5f369ad61b53d4ea723"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.1"; +}; +gensymb = { + revision = 64740; + shortdesc = "Generic symbols for both text and math mode"; + stripPrefix = 0; + sha512.run = "311de4fa6c68b21cdc8c655a7092d98772398e82bd9790e0bf00898a6575e234da44534635dfdd500eb7815d302a4487162f528452caf373ed11b7994682a43b"; + sha512.doc = "4175231e5b998f26e913374ad20b2718d4c566e5b220bfe4de9f89ffc4422b2aa4c941acc067d392eb43a725d93457b1c10d8568f5ad0eb7c1aecd4fa83e9746"; + sha512.source = "56cc850ce5a2fb0d84b2232f591d3f1e3ed18d1924d365fdb6349237d98ac655b0881febaaed414f4903eeed7889385b4cf985eb3cf72c3fbb37392e8586f848"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +gentium-tug = { + revision = 63470; + shortdesc = "Gentium fonts (in two formats) and support files"; + stripPrefix = 0; + fontMaps = [ + "Map gentium-type1.map" + ]; + sha512.run = "03a32d7926747e42f25daf87ef08f866b9145a7782fd372a4688404951211a3528bcad7ee5e4a6888cd8ede2602930f628141953c840268041edbde2624006ec"; + sha512.doc = "7cef5c563fa13b5b8458e2932be450edd48168da9db9ac45ab16ba608323beb4ea79f8dabf2c38b13b479de9ff3065a0cfa84ff5c259aea95495248e9794ec18"; + sha512.source = "b2743e38fe079ca3d46711fbcf810f4feaa1bf781e35bbe33b62cf45cca3b2ee1ab6da22d61965c440f987f9850e614d3f1691f8aa0d01beb0f56984c31e66f8"; + hasRunfiles = true; + license = [ "ofl" "free" ]; + version = "1.102"; +}; +gentle = { + revision = 15878; + shortdesc = "A Gentle Introduction to TeX"; + stripPrefix = 0; + sha512.run = "b244b249329d1ee622686d2a44d1469ceeed7e2adec5d82a2482e8659266a8224490531e0ed971b56f945b63fd1081f29aded9c43cea78fa8a9aec836301b26b"; + sha512.doc = "fe296c5bc38a1e6d13d2b46dc8081a6658764f7017d0831cfd46dd86082371d6ae095ec3b52b3aaaacc0a57cbcee066b94644a5746391fae4129eebaa246e146"; + license = [ "free" ]; +}; +gentombow = { + revision = 64333; + shortdesc = "Generate Japanese-style crop marks"; + stripPrefix = 0; + sha512.run = "4aa08751c2fc9c6709031d53637e0c2dc734926160f357df53bed6e4c33c4340e33f9dbb92d3ec2bf5dcc7b552c9508622986edc3c30d6fe15cc8334a0773779"; + sha512.doc = "af1d418f108bb050d8380223548d7fd77681e942a1a48aff8b7fb2c7e7a4d79b288e47099382e6ab9218bca78dc5406a57a42de00c2029f080285d6f11183a5c"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +geometry = { + revision = 61719; + shortdesc = "Flexible and complete interface to document dimensions"; + stripPrefix = 0; + deps = [ + "graphics" + "iftex" + ]; + sha512.run = "ed64996404299bd8379197b293baed752ff064e04eec87ffafdfd55cf21c2c48174560eb1c3bcdb0b06190badb9d9cc699aaa7a2ac8a5c537b0c818a423770fc"; + sha512.doc = "a58ab22ae6df349d81b5ddf18a4e9b7dbb5804a497bbaff42acde18ca59fe8a19bfee34293debc23e44c690456e6a1b1d87614fbb85dc6cb3b3b7d330fc866d7"; + sha512.source = "f4e1e8c0f5b8f443c8f5e6ad948cb1736ed944384daec20e9402c871872e86248b3167c72e07fc94fe32ef6ab36c17d2f177135ccf99f68d1c892af0a695bcbf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.9"; +}; +geradwp = { + revision = 63134; + shortdesc = "Document class for the Cahiers du GERAD series"; + stripPrefix = 0; + sha512.run = "b5b4cecbe95f3091348b917d9cafa31a5249bcf0b11b5a0be405d980c3a22d7af6f241af12ff999b5bbdf0aa3aebfff537e8c01fea9bdc904709eb66b3fc78bb"; + sha512.doc = "e12924c6e3437f0d2665bbfd97aa7d88c491a159866a3ec7ffdf9f84298e4bc0ff336487a194b68f0ebfea67dbf415749118328ac1606f02f32193963f6339c9"; + sha512.source = "faf85f46bfe88f5ea1220e69b514f6c026096ca331f53bb19d2ef2f1cc728cf8b9c46d394579bf78ef60d1b75c3164c2c8c204e959d4a298dbbef2f9f2dbe5e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +german = { + revision = 42428; + shortdesc = "Support for German typography"; + stripPrefix = 0; + sha512.run = "6cc469012ca6cb76baf2bbea00d198b97c2694d9388e90d2ded6b27da30f8d56aa2e6742ecabbdd335b7299c0c7476cc5479b59fa94468c9354f35ce18b59732"; + sha512.doc = "b9795ae418790119ca923079221114b9bf608ce2460b810cb39575910c0b173ff445c428a2ce6260bf90a993fb354d2b5c300ba58344d907965b65bb6f2d4ee3"; + sha512.source = "9064ca69c304f86eaaf2530bafe353902de078530f57f39cfcc0a9dc0d5a04ba5329ac9d0e7e10e3ddbbbd380c14b4efd8a5b7a6b0099f2c504563af74469c42"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5e"; +}; +germbib = { + revision = 15878; + shortdesc = "German variants of standard BibTeX styles"; + stripPrefix = 0; + sha512.run = "a7854f834c868ad80bcf986380f19139687eb80309e3aeb9a001d2030c5bca51de617394f920801834df460d05b52878301c6b45a52666984b3ba2d0910c416f"; + sha512.doc = "53dd4fff2fbb7044436f37e8a2baf48877699db4f99b92a701d10c0230439b00b48ee09051839efe4392abdb4335c3998d92d6239802c765bde4aa2df3d34ab6"; + hasRunfiles = true; + license = [ "free" ]; +}; +germkorr = { + revision = 15878; + shortdesc = "Change kerning for German quotation marks"; + stripPrefix = 0; + sha512.run = "6819a79268da2704a3fa6baab74be48ccd591ba998a0b012d323cb0149273deba6298a92629f0d19c19725ef0b41db9dd28adf9bb898c1c637038f9c22ad4b16"; + sha512.doc = "ab5362e069674c2c53709bc776be9fcbcfd3e56226a8fa7b9230c2f4ccb6fb74bba20485362f48130c153d81df838281620a628671c202cd60a52bf8ab5b89cd"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +geschichtsfrkl = { + revision = 42121; + shortdesc = "BibLaTeX style for historians"; + stripPrefix = 0; + sha512.run = "24cad33dfcbdb8ab91a80509771bd130ea6682a14fea5510ea202af73155653471deab91abb43a302b9717c252475db58135ad465f28509adae5d8583bf98e0b"; + sha512.doc = "6d1097dd0047c029100358bd3161f2ca515a09cf9a62b2633d4797059688bd5c30e4eab11c31081faeefacf892415c5d9a4985d20245ea9cf79b4197925ed2e7"; + sha512.source = "28c6a7181bb91d32ddcdbed7dd9824c8a63a351acc39f4c2e60ca507630fc23b0afe62380a64618d882fe742388d5537a435dc0b6738ba8d5288c5f2894a4064"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +getfiledate = { + revision = 16189; + shortdesc = "Find the date of last modification of a file"; + stripPrefix = 0; + sha512.run = "017b3ad95801da2788f2c5040225c6a8a2ac6d005c1d68d9eba0be061dfc9fa6f088a0279a75d25bea8ba380e4a92cfbd9b6a6b812d08cd2f86de097f7974fb7"; + sha512.doc = "490daffa0b0b28c9c02d745d8de50f22395f6ae773e07f6e826a8ddaff0d38f9ee48e822953e9642e46be26084ec2919bcac76c388cb3f42965f1b662e4e43a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +getitems = { + revision = 39365; + shortdesc = "Gathering items from a list-like environment"; + stripPrefix = 0; + sha512.run = "8797c7e70f1c81330b68b6c386116b0caf2c350a2b75724d796f0ab7380a2ea4cb2ae293ac3e6b941887b30faa2b73775c2bfce7c674ee98c4256a23231443b0"; + sha512.doc = "95302dae67f3193dc3d52b4e5724584ee066eee1dbba30b1233faa0c65fc568f932805b18b8054165760a2b655b486e7f3115d3b37be780f8f5a7220f2f924fc"; + sha512.source = "1bc8b4c2b75c5cf43e18a510e5e479a7109ac440266e0dc7d748d6ef391280d81f72a07f6bfc518c6c0c313b7c8e1e11cfe9ccaae33540e1b48988414bef5ad1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +getmap = { + revision = 50589; + shortdesc = "Download OpenStreetMap maps for use in documents"; + sha512.run = "e5287152442820e20087b45c50a750af621e71e2175cd6790231d81e1f338e50aa75f29d9fbc31c2e5802229c8f15c4e0c7769d0513f1d1b0bafc96a8a3b120f"; + sha512.doc = "bb55c60ec958182aaaa6dfc292a06fbad8a0ebdcb56a6799f1358ad2009bcb72b06611672219c5e9bd6d7cb4db76c4fa030be5e06f9bb38d04fa6744f8bca330"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "1.11"; +}; +getmap.binfiles = [ + "getmapdl" +]; +getoptk = { + revision = 23567; + shortdesc = "Define macros with sophisticated options"; + stripPrefix = 0; + sha512.run = "6a2e543d0997c52155807d0d2641af9714cb09531286a58bcb2d5fec0e70c694edb7d603a250281a641610d1c39495d5f93417da5cfea7a86da1fd53a98ef77f"; + sha512.doc = "fba54e8acd4f494c4e859c8705cb97923e477ed909720adb8c4735c527c3b13799ad74ac1700099bfa282144f2b38358b890bc52d4ae4a9e16699c2d0e10619c"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +gettitlestring = { + revision = 53170; + shortdesc = "Clean up title references"; + stripPrefix = 0; + sha512.run = "101ad92c2fba5c43321d8e12754190e09b0442508799dbb6bac23d5cbe96c470425a4cc10a28441408ac5a1c406e18aab7567f2464e48c2692fa38af1e23a16f"; + sha512.doc = "f9e33fbe89df368c4c5dfd855f2fc0fa8c4d1eec5c0ab925b0a28b9f021fd2d88521895233d12783a023e40d70b05a0e849d4551f79fd4b8d0af72fb60a1af32"; + sha512.source = "9bddc79e0f839a21ebb76e21e20ba5a26971f4192ebc2209468a780a15e5e5f61a328df5f033c115452751a31d1e6dc2e6e238097d2cbdbffa33f56ca420b602"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +gfdl = { + revision = 65415; + shortdesc = "Support for using GFDL in LaTeX"; + stripPrefix = 0; + sha512.run = "d93bba6171e3179b559a26ce246b6de423c06d0ec4e360e33b4d140be07645b90aea070d41d988d0ddb22f6686789e96d9df5e3f1c8ff8cc23829b7be0d015db"; + sha512.doc = "24034eb02baab28efccb6569425229f6e2dd4a0254c926e9153eb6e8802d0cd18d9af7ff4229dc1f8b39fb5dddff767b33e026b12a3443cb3c62f1f0f5e64ade"; + sha512.source = "be816d4aa6547ae5e48201b5ec61618f2868422f2a3bb87422543ef4faa1461b8b7368a1dee29d36881e0e051b7d684ad90f5dac4b5f43dda70b5e11540c5b76"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "0.1"; +}; +gfnotation = { + revision = 37156; + shortdesc = "Typeset Gottlob Frege's notation in plain TeX"; + stripPrefix = 0; + sha512.run = "4f99442eacf28ea13cd98ee4bbe981b95ae9d849e6bf2682cac2305fd793f6e9f5e4211362385890956fdb24ef03748e9cb0184c7ba9ed89e7985b2caa3e2da2"; + sha512.doc = "b65d173c11400a7681510cd837ac6e8ebf65a458327bfdee140013d49a0c6fcc339f6c45d4b4ee918585acaf785c12e66b3df5f73f01a1f2d8c5b8db58b9c47e"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2.9"; +}; +gfsartemisia = { + revision = 19469; + shortdesc = "A modern Greek font design"; + stripPrefix = 0; + fontMaps = [ + "Map gfsartemisia.map" + ]; + sha512.run = "28cb811a30c06bd6390b9268dd2a7a4dadcb2fa9d426d9461af1ba5593b2c419ed1c7886c3aef9bdbb0f1fea3d6bf127ff6088a6b2c2048dcccfb21c2a06a5ee"; + sha512.doc = "9f2efd76c243177240f237f7232fc87eb33d7ea1177a7bfdf7d506077e19c40d3fd923a960595c46f50fa19979598bd06a1865cae8794d45f91da1d6a9a60a7b"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +gfsbaskerville = { + revision = 19440; + shortdesc = "A Greek font, from one such by Baskerville"; + stripPrefix = 0; + fontMaps = [ + "Map gfsbaskerville.map" + ]; + sha512.run = "b545ec586b3bdfe3da2cabaa959ceeeb4ff513b48024575b1b5e3c57bb2d10a0b4e2cd7507726275eed0826dabf03d05c20eb9d5ec341aaedc0313264214ef78"; + sha512.doc = "a45ed2b35774755a6558431f784faad4bbd63aa81ad5d80c3cfe3f7726604aea3e4de2baa72bb27a4e2271e9bfe180c8963d06b880a0efd2dc5f7789dcabb51b"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +gfsbodoni = { + revision = 28484; + shortdesc = "A Greek and Latin font based on Bodoni"; + stripPrefix = 0; + fontMaps = [ + "Map gfsbodoni.map" + ]; + sha512.run = "e01cca38176330bdc0a4b523bd2bd4f73a497d90a34682d29920e145d11ea099f163fa08470c79e10a27a137a5901d7da9db54e461667af61c687adca1960249"; + sha512.doc = "c70b1a32e945d82e50b8a37319ee2bf63d4800b381f317168fd945311485cf6c41c7a3112e89457f4ee40bd29736accf681bd61494120e3d41f0c8fb28ad466a"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.01"; +}; +gfscomplutum = { + revision = 19469; + shortdesc = "A Greek font with a long history"; + stripPrefix = 0; + fontMaps = [ + "Map gfscomplutum.map" + ]; + sha512.run = "4013ef92910c3c1145708afa5a9ff13cfb0aae05e6b225c56c98090ea7cd223799e73212982312a14cf504a355dddce08e3364df8c046dfe462d07429cfa617d"; + sha512.doc = "5854b000522120f6a1b065300943fd8aebcd75f57da15d667616a3706d35ffa35cac0422712d0b008dc2abf2b9deceb0248fc044be68f893f6ad0eefcd50b316"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.0"; +}; +gfsdidot = { + revision = 69112; + shortdesc = "A Greek font based on Didot's work"; + stripPrefix = 0; + fontMaps = [ + "Map gfsdidot.map" + ]; + sha512.run = "436a8cb4ea88663ff3358d6991fce9364f197027797903eb1b5c74ec0a857059579f0a58597ca6427c1651bf89440d7b7c8965e79fc668ecf444dbcc9f7ed4a3"; + sha512.doc = "29b49271f62496e6537e84301b361d372b24cf208365d97f3ac1d6d5b82fae84ff82954ad45e87201eee0df9dfc58f3486049e219480d20add06e9eef934f17e"; + hasRunfiles = true; + license = [ "free" ]; +}; +gfsdidotclassic = { + revision = 52778; + shortdesc = "The classic version of GFSDidot"; + stripPrefix = 0; + sha512.run = "7b07a974f5447917d0a10a964011f2ed57db2dc9155384117310eadbe1dd05067dea6d617a598545713fb9250bda4241b0b2d5bdd84be4fb8c994d8d8c4e5ac4"; + sha512.doc = "3256c1af2f7b0d15625eb3a7250e15b9645991b3a7408d11afc77aa65bb067cfc3682fac334a61d67f894468b3a14c21e694e4b7445a01ce88203af06a269031"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "001.001"; +}; +gfsneohellenic = { + revision = 63944; + shortdesc = "A font in the Neo-Hellenic style"; + stripPrefix = 0; + fontMaps = [ + "Map gfsneohellenic.map" + ]; + sha512.run = "7290de85142975c61b28cc8d3e5919805590e2be5f5b442f0c371c393f92012ef6b00997bbac1aa1fb63914578e99eb5e6b26f6af8f51cb5ec7f4c53ede51fd6"; + sha512.doc = "231ea0eb57834e5b781cc3e8f49a85e2564756abe3812a432212fa7e85468117a1d80d6af5db8cec754eb1996d3b9716c12c403b1865d60b18660f454a2323b8"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.02"; +}; +gfsneohellenicmath = { + revision = 63928; + shortdesc = "A math font in the Neo-Hellenic style"; + stripPrefix = 0; + sha512.run = "17e81da77241b3dcf6727ee8e954d9ea24a59a235d8e454b77204f99bec343d020803790ce6ce82a22226ef48ff29e65d84b6ec90e44286addd3ca727e8fbf1c"; + sha512.doc = "efb0faa6617a402b6d840d9f20303a8acaf4140c60b8de285dbbb9794dc6212715cec6d1fd2cdee65aaf348ed1184ad66c480e00843801203f47fd3a4058250a"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.02"; +}; +gfsporson = { + revision = 18651; + shortdesc = "A Greek font, originally from Porson"; + stripPrefix = 0; + fontMaps = [ + "Map gfsporson.map" + ]; + sha512.run = "f52d6cd8d0b674771dd56a5d2974fd3edd8b4685bb201489e578c62d1e31b5dcb6f2cb2e9b05702ec439ec7f0b35740e291d3a92de53b75870fd791858f8a474"; + sha512.doc = "3dbcafd00a88537db9e27aece276df08da805b59076d5e65395a4752d8ce57a794f23508238e96ec26b8d7e6d25e11992c2a567e44ca2f930bc44b9dc980202c"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.01"; +}; +gfssolomos = { + revision = 18651; + shortdesc = "A Greek-alphabet font"; + stripPrefix = 0; + fontMaps = [ + "Map gfssolomos.map" + ]; + sha512.run = "6e6ac03cf7ee20accfb67855b3dce136e3caa2466fce760adef0a2c1633e0a170543cf861a6a07a0c80344ab026dc2f74a35c5543ea92a53f7ce8a1042f778b7"; + sha512.doc = "67640d1a95ad7ec43d7df407916cde264c5460cf400011cf0cdb3dc4caffabba370f2fc15ae945e20b6a9bb6623645f6ffe80034a781cdeb11c400bd23985e3b"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.0"; +}; +ghab = { + revision = 29803; + shortdesc = "Typeset ghab boxes in LaTeX"; + stripPrefix = 0; + sha512.run = "7e919cbb0c84fe337dd05c749a3288990e750ff0aeaf119736108463a1684a18a66be94811a31156f951c871b2f073627914629756b06e747f3220d2ce08950f"; + sha512.doc = "2cb7dbf5b43130b122618c50c18e513dc0ee0ce267cdfa6e710451d1fa7fce8965617d74d48748241321948ae8c5eb9cfa4945df146ed8e5d476d0fc5caaf204"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +ghsystem = { + revision = 53822; + shortdesc = "Globally harmonised system of chemical (etc) naming"; + stripPrefix = 0; + sha512.run = "42f94adda3268ce20f664113211d3c32e7ee005db053f3daecf72d381dd4c4cc2e78610b821cd4b43c4543610bc66170513c4fd9357445977a8a2ffc6bf140f2"; + sha512.doc = "d2f1f42177ea820d209e9574def8efc0dcf9fac0c73ce1c9eeaace7bc0b25fc470ff7265ca8a4f42f6482dba61d7d764b2171268c168aa7eb154bb6f9672f52a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.8c"; +}; +gillcm = { + revision = 19878; + shortdesc = "Alternative unslanted italic Computer Modern fonts"; + stripPrefix = 0; + sha512.run = "37c8141eac6b1636292479299f7df6b3dc128addf8f7ba680cef2c75d2f7ab04686134b243a86168c54052d4dcbc33f13c13a6629d7c98d3908e4cce5fb53f06"; + sha512.doc = "55e02d36c12bd12932c2d220f892852dd1c8c947cdea09d058ad38e5e513dfb684e75a8ecf07f5711200f942ea7732519c739866458c330ee271bf45af32ed45"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.1"; +}; +gillius = { + revision = 64865; + shortdesc = "Gillius fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map gillius.map" + ]; + sha512.run = "f2ce20c1650588af9f446ffc6d69835e4e970def915e3912ef36ed8d065d717ccbeb125a783768c360328ba6d44e15f954348957d774dec8eb3b84f4b8e00406"; + sha512.doc = "df8f143a6a80e9e5038744744b649fc26d042672eca7080fc8493a965ef4e3bcfb714735e83ae9a3bb500e3a298bc9bc9d940ff343caaed4ebfb8bf8d8101fb8"; + hasRunfiles = true; + license = [ "gpl2Plus" "lppl13c" ]; +}; +gincltex = { + revision = 64967; + shortdesc = "Include TeX files as graphics (.tex support for \includegraphics)"; + stripPrefix = 0; + sha512.run = "2137967697765b1167f36a858d2eda778b43ff1d681ec0d8af7963d2ab4a92448c6c1ad6933975afcc211d301cf168528e7ded7c3114c4b5ec580f42d8a7b664"; + sha512.doc = "86ee14069c5522d7c0713a532627bf29e8cf71ec4c86184377cdcd8a73dcf0f034be9e92b8ff7c2caef8310f968c956d712f3281eb6e4d36e83a3464149489b9"; + sha512.source = "ea7bb92e9f71606b39374bf43704187bd627ffa20e686d2ca09a8ea4c825e5cc363cf7cfb2a6811df7c82ff8773aa058362b9103052646e7ef5febf690abad22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +gindex = { + revision = 52311; + shortdesc = "Formatting indexes"; + stripPrefix = 0; + sha512.run = "b65317c570c923c7b6b84c2923122d844f895657267b694b46fed2d505348833a57700e4da93cde3d5a81e7589a456eea179a455dacb7c9324e0f65d9c718c9b"; + sha512.doc = "2a3ed388473c669874b0474b9b1f45c60e2efd69e8c589a9f9086cecaeb5f1e3192fbb949c3d0b485422c7f6b49075d3db4cb8ba03bbdde0f5f77089331f770c"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2"; +}; +ginpenc = { + revision = 24980; + shortdesc = "Modification of inputenc for German"; + stripPrefix = 0; + sha512.run = "20ea4e42fa07c21d8f2ae5d4419e6382141e6babca0b89b508744ea22d6310052f2c46e6ba0ad32b06f5623daee07a16eeaaa98378c9ad04dacb78634b9a583d"; + sha512.doc = "4e343ab469e2445f6a2fd5297ae38d1cb42d4db1a3c438885815a2e4c5d367bfae3226a628e11152826fc5e4fd28a9c4bc5c393acea550c5ab33cd854d4f3e8e"; + sha512.source = "b28077cb4b369567952e77198cb77f4edad02f0949d4f46836ae59d75a2f113f64446fba83a88e6155e9356797577fea72c79244808d575359eb7ca10d029940"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +git-latexdiff = { + revision = 54732; + shortdesc = "Call latexdiff on two Git revisions of a file"; + sha512.run = "74077b3dd1a91a734af6d668b309f804dc58a282393d88d8d5d74a5e6fc73c197e49b462369f829cc7151e20aaf8085c0587428ed61ce7957a1ef173d92c5481"; + sha512.doc = "bfda354f808c1f94dfac207d1526409a160b89292e44541930dac34383e3ffec9ce63d04db041ea5ac529e1e01fdc80c4c64cd43e8cdc14aac974094732d6fe8"; + hasManpages = true; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "1.6.0"; +}; +git-latexdiff.binfiles = [ + "git-latexdiff" +]; +gitfile-info = { + revision = 51928; + shortdesc = "Get git metadata for a specific file"; + stripPrefix = 0; + sha512.run = "7d3577b55f0154dd9c0a1aff3d46741631fc561b4c730a4f55a84dff361e6c27f327979638946d89ceb35370bb4051b1471481e6bd761fbed66757bc613abb2c"; + sha512.doc = "ac2083dea1ae4373ee2482f41f9c66ab93a2b66699fa01449c712c219ec0c53635230b062ba58b4107eaf7fb54fb7eed76c5b9346ffc60f6f35b18a72ed0a08e"; + sha512.source = "7b15a31e0ad37c75fc1e64079edb4ffe93d9e9a71fba7db13bb9ca7b68fa8dda0244fc0da473ecff8456459bb3f6f52e3edec2ac8513433d03ab107715ba5258"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +gitinfo = { + revision = 34049; + shortdesc = "Access metadata from the git distributed version control system"; + stripPrefix = 0; + sha512.run = "099bcb4970827cd3309f88278d8ed993856d5ebdabb22c3a3f558787bc6cae46378f7a92b88c5cbaeef496f40a8adf1e0740e685d667ba2376b5852a12af9e5b"; + sha512.doc = "c5a9c948ad8cf8f2bc3cc134d60165ca4fc79117a6597a5981b39e26e25f4334f479f2bc1a0e22c52fc48794224115c0c170612c8088a414544d9f51b18421f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +gitinfo-lua = { + revision = 70117; + shortdesc = "Display git project information in your LaTeX projects"; + stripPrefix = 0; + sha512.run = "cbc201f194a95f27ed11a12f555b8296dc68b4b0895ec2eec65d4f22dbc005716bfb92f46b342acddf023475a9eb7571ce3410efca50755589b6513e025cab8b"; + sha512.doc = "b5b284e2d6abc36e97aab127592c6c928d737b8d94178201191905b7179786cc6a5520364d1ce0ff92551de5ecf89aafc4ed336b145591b747d43d6380bf8815"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +gitinfo2 = { + revision = 38913; + shortdesc = "Access metadata from the git distributed version control system"; + stripPrefix = 0; + sha512.run = "7dd68c7b1d5ea49dcaae8ba1a1582676617bcfc6f5c6ba34eb1c62e60ea5b8ac3a50841a93394b640e8a79c3cfe447858fdd1630e4095683958f8d36439a84ca"; + sha512.doc = "872b7fa8e0c97e4f6e0e1989b7c45507773b4f96cd56f7aa7064376b520d8f2beb4acfe71a21e295a8a457b86fcf7521809fa59ad02875466cf426fa09bd8aa9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.7"; +}; +gitlog = { + revision = 38932; + shortdesc = "Typesetting git changelogs"; + stripPrefix = 0; + sha512.run = "2fc9830dd1c43cf0c32fd743c9fa001287f5753dea38d8491af43803a1d98a0e09cd05641484fd2f7c47e68c8c6919c2eb9fc298ebd761166eb5b77c54d7f00d"; + sha512.doc = "c1bc22cdf9b23baec98ddba49784a09c97e9e5f8c1a471dc39b3d58d67bb3ad2559f25766debeaf613b3c4e8d8bb4b22244de07d09e957ff09a94c0254fd3e64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.beta"; +}; +gitstatus = { + revision = 64662; + shortdesc = "Include Git information in the document as watermark or via variables"; + stripPrefix = 0; + sha512.run = "153b9df6e1629d42a1c96a4f6c4c25dbe180db8976a102d633cd54ac36b75c1650328f8c5039ebb10c7927f7d6717a9260f39b7de6c0f9f9f37fb6fcfa9dffad"; + sha512.doc = "e7741e738bafe379f71bd77aaa9b2a33c26b5da13f659181eddab01fcf8209ffbd0604d0b374368b7d814ca9608503f9e4004730871845e8f7b491e40bcb79f3"; + sha512.source = "23ab1b1fe293fc842eb9ed3306e2b70d2fae8ba62178b64b29872f933bdd8f80b0991358fbd6aadfa194185790632acf2ec5249ef2fa9d490913072ba1b0660a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +gitver = { + revision = 63920; + shortdesc = "Get the current git hash of a project and typeset it in the document"; + stripPrefix = 0; + sha512.run = "c2a82b062f130225f36c66827deead41ad644512160351e216fd047b6f4bde03ee4798e5a753f319ce83b74cfe0ada5a9346b1ab12ee1058ce073ba114ed890f"; + sha512.doc = "08f5ad70d40a3eab79a260958baa2e4d75872a93a33ac3398ad54049231693d3cb4f659ea91e3a53af8c19fbf6b8ca537c66f907b4592a45b155d895471cba63"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +globalvals = { + revision = 49962; + shortdesc = "Declare global variables"; + stripPrefix = 0; + sha512.run = "815a1aff9e889313854962e44c1c09a41713f4efae915a1d1a65a3f0777a4c36e9987c588c0d6f2f1ea91cfed6c28ffbe045a842ad71fd6babc91ae1bb16aa5f"; + sha512.doc = "36a8b35ad90d9fb797a03b48f8cf818c9514ffe6e7c24be157e04455559d3004ac6011e2dbd16a4c478105b39ec0d2597f74e484a1913bcb180a7209b9191fb3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +glosmathtools = { + revision = 55920; + shortdesc = "Mathematical nomenclature tools based on the glossaries package"; + stripPrefix = 0; + sha512.run = "38d5eb1cc7337e81a1d824fcd3d6820928e06b421e1bd1141bc4cd859a32aaa1a10062e6a7a2512687245996c8848b42720085271c1cf6a24957bbe96ff824e9"; + sha512.doc = "511c901bf123984727ccf8bc4e2449738a66fe866418f23b923391d30f6ad46ac260b5684b73b89616c07cff9bec0475e3553a70ba608c58873751d9a6dcbed2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +gloss = { + revision = 15878; + shortdesc = "Create glossaries using BibTeX"; + stripPrefix = 0; + sha512.run = "399bc1b809c01fd60934e28834dd7d6f263aded75bbede67507a5dc7bdbcdef725248b9a10d4ebf3cfaa981be33fd35a4ade78eb20b2b23cbf851376ad5e58f8"; + sha512.doc = "871760a86ffb9d50cd480e2cd234a9873de48ce620f57a6538b36b0c1fd5e7f11342fa435e147ee1fb47ed08b8e855eba8168c8b755ed67ed7fffcb8f0e0ac86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.2"; +}; +gloss-occitan = { + revision = 52593; + shortdesc = "Polyglossia support for Occitan"; + stripPrefix = 0; + sha512.run = "ee68a2f0c41dac79d00a4103804ad735b5bdc78bad660d5933e61e88290a2dea17a695ea45129a672cdb301e1c89e4fc319173df1fbfd87f944abbe46f7f1dd0"; + sha512.doc = "1325b4c8c0ff8c1e53d27b5696da419f99852bd6c272176bab4e03f91bb6a715de51d24317b9cec1af50ee0ae2b34c03c51afe9cedb8903a1e8f74bbee3cc06f"; + sha512.source = "043c132580baf8e66ac76a01312706996902c448cbd81f596db732cbb90d66be64d8a1f673275edaf11031d1f878587270663bba7db32da37360ed024e210280"; + license = [ "lppl13c" ]; + version = "0.1"; +}; +glossaries = { + revision = 68437; + shortdesc = "Create glossaries and lists of acronyms"; + deps = [ + "amsmath" + "datatool" + "etoolbox" + "mfirstuc" + "tracklang" + "xfor" + "xkeyval" + ]; + sha512.run = "bb81a95a1e379ec87b569d94ebf08f83823f825a70138a3770a3d1236424b976a98cd1265e7d68771460e6e96827761d697ddf0dbe48872c802414236e0065ba"; + sha512.doc = "d11140ef1a6933170e59d497c57723e62d7ba7abadcbd9d3ee91e50171101d3e0740b0853da803bc7b9f56f86d7fc6cfedbe985e5e341cb775e850ee7c8ccd40"; + hasManpages = true; + sha512.source = "01ebc5d8d91a666a2693a039305103a98de9b2c7a958a40be04275e948664b3c5dd4818e4bb686a3a2a681b0ee38360a43fa795ac4537f8d083a2637ccd3df72"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "4.53"; +}; +glossaries-danish = { + revision = 35665; + shortdesc = "Danish language module for glossaries package"; + stripPrefix = 0; + sha512.run = "d9551aaa01e6f6720406a58f869048fbeac30fd629edd7fcdef657525dd1f7fb3faa2127cd81fb777d339ae65a1015e9cea7e5fe26a7de10db3a387152aaf0b3"; + sha512.doc = "8e6097ced6686f3f5f0162c7deb11de9acfd55ca152c8ba3d4eafe155f645f33ec32dc495e3b4f4832e33300cd63d2d4ba56d018177f96426ee72e14cc60e230"; + sha512.source = "f8a52fad43c5a95989ed8da27ad5a15da56e5cb2b08797bd70879327a512d9bad44fd217270940ca1ac541a880bb939b9e360fe5a686b0b25d779baa1bd01de6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-dutch = { + revision = 35685; + shortdesc = "Dutch language module for glossaries package"; + stripPrefix = 0; + sha512.run = "0e3d2607caa6032c8c768c1bd7c84808f6b836d6c167b1e0c720b57c3033c175269663f6e21edc248676bb2b73142c20c85cb6c3011586cf17d876e540a435dc"; + sha512.doc = "c2d6ce929bb9e7482413886967beb598b6cfb4a2f84d5a2e5edd7039b94e397ba9ad2e63954178d6fae91c5e3aeb080a68ed466b609ba0adddf98003f570cfd1"; + sha512.source = "5088bafba48d95e4392a5891ba3566d37a708cc7ed002243995d67ad6f6cd1eed19f6a572e5e3234c8e4ce58e815b4cc79e97d2644bc5341911388f7b80030aa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +glossaries-english = { + revision = 35665; + shortdesc = "English language module for glossaries package"; + stripPrefix = 0; + sha512.run = "f62c43c9cb5a10fe5e364e6aa4ca500aae8b89e71f6bc80831a8c8211ca640f3631f011735ee5c82278b188bf896360b69502da2128e1db1287d24e44805ef97"; + sha512.doc = "40c30888541114f5594403ddf251f0c209daa57c6b6f2d3d75b4a51416bf3011bea70cdc5f461e80a1e148181d6ecc2b2d7c891a7c75b1c577a72e5ee8ddc8e9"; + sha512.source = "4a1d9cbf515c52d8f8a787970bf5537f25d6de7a66c3a1819cc5dec05df0f004aaac3734dba6ef813473db0cd5b08db4ddebca8dbc8674c2582abc7e9e85524a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-estonian = { + revision = 49928; + shortdesc = "Estonian language module for glossaries package"; + stripPrefix = 0; + sha512.run = "48eac96868bbeb636bc8d4352cbc1959829daab75716b3dea2ef98d98e388a2668a2ea1e35cc46f53e9ee030aa07dcef3e528f056f59d49883f0a00380785bcc"; + sha512.doc = "5f957f53acaf6b56e338b606843cfa2ddd16dccef6bd2c74844e514c157ddbc3c5c24168cbe28c67894afab8d115460fd497de91f0142bbec3d1987d5889925f"; + sha512.source = "f2d2ddecc5a338f844a9b98d50e636d69d31866e723e3aa261ddc5ac2d8349d01e76afdf9cc6b7a4b4d96dadee78ea6933c0d1c69d1196f11770c92cef356fb2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-extra = { + revision = 68409; + shortdesc = "An extension to the glossaries package"; + stripPrefix = 0; + sha512.run = "65f5a9e3aea0c8f419c530a9b989b0296830347cd0f1ad4deb0d879ac82970d546be4a907f90c917e35b7197dfa6b16fa6f1b4318a2b7aae74bbe924580fd0dc"; + sha512.doc = "f90103cdaae2e6ba00cfdc82865a4beeab9f76d364579396b8710d81a14a71cbbd6168a307889664b0a289a34f9f7f9c1c69f449b09e90669184a0159c8aaf90"; + sha512.source = "3eaf0e0f29949277c66928fb0952cba6e568d700c118e32e7045628da340bfa12aad6b1b6c794c9dd79d73bdd7e0e120a4ba2418e7390115a611696520e39488"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.53"; +}; +glossaries-finnish = { + revision = 54080; + shortdesc = "Finnish language module for glossaries package"; + stripPrefix = 0; + sha512.run = "ad6109c67ecfc88da631b3f42aa91b95720619599721a6c6d87b4d8a668cdcfd5bdedd333a43bfff663f5f26df64f4fd8268054dc2dca089ad34177e6e5b9078"; + sha512.doc = "ddc0047503a68316c3d2e18d22c7ebb861aacbf649366a60ee186ff31ba79846b461d3fde029bb5b0a3ce8f07ef25b89bc46898047176160815570f68b022b10"; + sha512.source = "0be0af63020fe9bcde5ef0f3b832d5fe90325de0412f32b3c0f34b6b00126bd2b139f0b3be376d54a41794447dd38564fd248ce30fc08f68a607fc65daa5d503"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-french = { + revision = 42873; + shortdesc = "French language module for glossaries package"; + stripPrefix = 0; + sha512.run = "8516e94f69248238b0e94099b67c9807f02587e934e6fd2c9ef23befcfac783297cc4df71b8e41be77fdab85abcb4103435c3fd24584b46a3b473fc4489d5d82"; + sha512.doc = "c26b40d499199c15c875cdca901a3168ab72e4009a04e92f3b1ae9010d7912484b1185453d117154eb5b9e63358b36cd58aeff3d0c4727945a343be4c3c2ede0"; + sha512.source = "9c6b0b1d851c88c757e87c8b29b2cfaa3886efb00433a9c3744e175fd4dfd4433de3b80b9d70df89f879536b1058ddb1baeae41c5cdfc6c47377256df8e63882"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +glossaries-german = { + revision = 35665; + shortdesc = "German language module for glossaries package"; + stripPrefix = 0; + sha512.run = "e0b8e18dbe4d4e503c144be2406b99b56ef0a48847b4044665ac178dffc59d2b8ea95873ee5f2e64fcfb8379a44ee8761ee84ae44fddf996d1029372d5185d58"; + sha512.doc = "0ad0d7d8f41e52613d049fe3ec6e48d5ceb77e768c7b9ee6b3b0978eeebe6abfc803df44bbb7f90b4e487de074a2cc174224ab0e89d5fe7bc896adff495abfc6"; + sha512.source = "7d34e603e6c667fad268f4d16edd7b066d3f6fb34739ae5e7620cfb2024fb6c7882862845055205d3a3c14f2c60bb3b304cbb1871958c17427107cc245e10bcd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-irish = { + revision = 35665; + shortdesc = "Irish language module for glossaries package"; + stripPrefix = 0; + sha512.run = "b59add658270f734a8fcb70bae29ac210c84472f0f7ded62baa647bdbdbcba2e63dab71aca6f8c524eae9e3d80bfa7bf96bef45bef7039c3eeff738055a93acf"; + sha512.doc = "9ce14ee4ca3ac1eed10f8c356fd6561f7ac43abcde46009a6d43245395985f045e9ecb83a38a190ea3a5cabf462a233967993bcaa40211cd7e64791dc2a583a5"; + sha512.source = "cdc7332678be3abc86804b9b674aab88f087791c8418e6273cc07f2c2b4bc8316ad21a3421af9ca2f87f76a3ce42a6fc5e7343e006120dcbe1c7cb14901d7ff9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-italian = { + revision = 35665; + shortdesc = "Italian language module for glossaries package"; + stripPrefix = 0; + sha512.run = "aeeeb9fcd98e55ed64c918276e0bf0b25489538da80f96030a85225635e7e0ca3d1c93c65aba8b97b486f086a50504c257ba478bdba28de92058053dcafe323b"; + sha512.doc = "f1ee5a84c9a67b88087f657c259a3700fcd1fa4ad8c765cfae11cde2d54c4a71e69dc57bf626ead0d2cf1057750e284a31443c72e994e37a62715548fa9dbadd"; + sha512.source = "9a014922abb8be849e97660f2aabff49413a56c06a93f5a3fb0cb89f972b54fc371bff8dfd6a758196d941efbc9281c5cab3fcf047901ab08e296d55e529206a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-magyar = { + revision = 35665; + shortdesc = "Magyar language module for glossaries package"; + stripPrefix = 0; + sha512.run = "66847635e1f00af9191cef210c19ed154dc1e5405ef0d2ad38485a913626ab9cd93b7c35395feedefcc04bfd1b46112e6410154c2ff26be51553619326d1e55e"; + sha512.doc = "a6bc19bf794943b1b15c8cbece363f644671f912bb71d8b2f0a9e75d05886ae4af4846c78cd060099bb78872e4d7991a9a3274fd1343a07bf73c3ba1d475241a"; + sha512.source = "e0e90ed2fb01df98b20a7807a0dc1155b108c35788ea952f753ee9033d2c7e516086c6380b8617411392198c5469b57b96aa35f8903e44ce44d30f5758acb75f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-norsk = { + revision = 67141; + shortdesc = "Norsk Bokmal language module for the glossaries Package"; + stripPrefix = 0; + sha512.run = "8e718082194eabed6a4448b89a703a3b63873286899df02824cb4582dd7fea0cf0c1496aff95139b8a4f0770d6d49c5257ca3db14b3581eb529f2a7e95858308"; + sha512.doc = "fac57f6cecf17f22de50fd360e4069d2c0eb8dc3283e00ef1a46d86827a411e15e3a2228db08165b158d384448aaf6beeeeacace05390c428bbfba3bff553ae8"; + sha512.source = "f90b767ec7d7a3ba384198942ca6502e33f6885cdf9cebfb00299e7909c10d70a4b5cab58dfd7b0a39f366b667a1ae0c1d3cc89ed91db415625ea0b2b0367fb3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-nynorsk = { + revision = 67201; + shortdesc = "Nynorsk language module for the glossaries package"; + stripPrefix = 0; + sha512.run = "eab5020321d14af5af78a3449dd2b99333bec3e56014b00c5c7a1a4410c26ab715ee8d3631c5a19b4356af61ee1904650704c623b7d36f783424409481424dd2"; + sha512.doc = "e123e0024f750a28fb3778ca6e4880c070524837dcca5bdb628d0b32fa647c8b2a5595a76d436567caabbe88d309a1711d81d5bef1c33542206bd3c8e56f3e22"; + sha512.source = "ac2286ac8a06a40d0d15d5e4200c14d1c242ebb35c5e9d0c9a0138cbafcbde4f220798082dad3b521b33cdde9c569403fbf23066104daf1ffefb28078a9e0fb9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-polish = { + revision = 35665; + shortdesc = "Polish language module for glossaries package"; + stripPrefix = 0; + sha512.run = "7ad5a924f24acb052c16436f1d1eb198bf10c65ed3f77fb8911cc8b390cf286581a6d7ed409211993545d597a4dee4318e1d9b820dca6f831ca215986ec4a1cc"; + sha512.doc = "cad7bbadda3e690ce56c75d2dfc92b02576226cb31d848b0c96d6115d18d222a50e514a6c6b5db9907d6a0e542824e229b063a0cec49dd726246f3dc5d4b41ed"; + sha512.source = "5f7ba658feb54089405ed6a2fbab3a279143205438a9dbf6ba0a49d38245799cfac6369c48f9ea1e5eac2125cf475e26a3b31dd3745f283a21f3ed07aa8e64be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-portuges = { + revision = 36064; + shortdesc = "Portuges language module for glossaries package"; + stripPrefix = 0; + sha512.run = "64582081553f90a5000992f9db3f79aae7ddfedc6f128ddc09ec7878576b0e17a580f7c58515c2696e2c46ce1ba49c2cd756687c144d0134d91cb6c5e0506ec0"; + sha512.doc = "5f1692f14e2e4a596555cc426a556d069fcf710775d9a039f0143eddbafd0502e4f4a10e677a43589b1f91cddedba6dc9358b6015801e68f1b3d1e908e57dc09"; + sha512.source = "a7cb8046b8ce5d122f691170804acbcd39b5ae367cf66057d12fb24d58f142e2a4cf52a1039de9cd73a0f8c0bf851f07367c180eedb12923ab3398189de29652"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +glossaries-serbian = { + revision = 35665; + shortdesc = "Serbian language module for glossaries package"; + stripPrefix = 0; + sha512.run = "7360d33c1d3912802be171ecf8c218fad45719ee6dfa0596904484ebf9dcebcc0d926112e40fca76a196ec6081fafc4524c81b366008fd20207f8150dd82be29"; + sha512.doc = "1ce493838bdc59521728b6856d2cc2df26f44f3bcfcfc04d32fc20d3e416639b1420e1451acad8b8bb0597336a77b553ac599ec0c541527ab4d8e56765f07f3f"; + sha512.source = "9097fda313f9cd3e0db095c27fa534269e2460c6b5efa3e6681471590591b0931c52f28374ee33404ae0491297d1047dac8b7ce7a525a46b01873210b6242515"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-slovene = { + revision = 51211; + shortdesc = "Slovene language module for glossaries package"; + stripPrefix = 0; + sha512.run = "d569d73cbaad175549fe5d4000ac73b0fb65d00598dcab0f3a7c7b384682568d21016fb50d7dc6d2f6a1b250ef34c44c784eb99a1ff042bc3a52bf1c987e0b55"; + sha512.doc = "63d212e4c04dd7c7e663de230274b9111b8025839c8136313677d13e967a23870927a49220aa1efa0702422e8ad4cf683d1e5e09fcf291873d78bcb055e24003"; + sha512.source = "0e779292973bed40b3e077058aa99ceaa851ef516af7be57a21bd378492f77b87e65ca95f9f8fdbebc8818dc820108e598ce93efb8c6129560e0ed40f3633b48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries-spanish = { + revision = 35665; + shortdesc = "Spanish language module for glossaries package"; + stripPrefix = 0; + sha512.run = "6c92de5e24135a9c47d200f8f0c0ce7dff8a01f8c13bfb49d4090d1c195052559f75763c0ed68d633b40cf18bc89bc51e7b6c2aacdec05376a3c2e1d1b7a31b2"; + sha512.doc = "5fc58f64a7f54b50dcfd632e700805bab2f46a92b727853b147d9f7156b2fddd50a8fac08d0ac59bf5f89e0ecf1d5ddf7c22482e661f8a5e7b5568832168bd5c"; + sha512.source = "8bccb84eec75980107ed08b9f7e1ef0a595f7eb0c270ccbff77f4ea176fb5e17292b7d34d081ffdaa7d7be82fe40f71bbc30a65904892400536c51ea777475df"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +glossaries.binfiles = [ + "makeglossaries" + "makeglossaries-lite" +]; +glyphlist = { + revision = 54074; + shortdesc = "Adobe Glyph List and TeX extensions"; + stripPrefix = 0; + sha512.run = "c050808623d162ffbfba8742c9aee6c92555717eb3ed0a0cfb0e3cd6696c4f6d940aa494582011e6d0becc3c5572ddccac2598ac8d521b58a323768272f9125a"; + hasRunfiles = true; +}; +gmdoc = { + revision = 21292; + shortdesc = "Documentation of LaTeX packages"; + stripPrefix = 0; + sha512.run = "cfe29d7bd5e7936c2a40292fe2518dcd79dbc105f08d3f0dfa11ebdc4693ff207a1b312e6160fad4c089bbe5012697bef1122a893b1d42d59fc39fa5c48d2ccf"; + sha512.doc = "68825a5fe89383d68b2829bc7e2fe230d717104a2ec56010bc7e67fcb14f9191bf47594cd0387b490debb5e752670048404a7985ab0b5dc039f4764d7926192e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.993"; +}; +gmdoc-enhance = { + revision = 15878; + shortdesc = "Some enhancements to the gmdoc package"; + stripPrefix = 0; + sha512.run = "481bed630ec444fda66a22656c2cdfcbd931a6743823c36f570ede09038ec4f219ecd1985243a4fc8d852f38512c6b369227f559d3874447144e0cd62d7949a7"; + sha512.doc = "0cbecac4ae6f70ed01a407a9e5fa388f2c142b7bf77d219429d6685bf7d7c6bb3f324694286e6fe49bc2eff287faba901b7eba44f8bde1894e8cb09527c289a8"; + sha512.source = "131afb02bafe204637f0cd1589db70584071d9f2480d2a11c03de4b0c14ed79500fe0e811a035a761ae4e6084d63a89e1dbcfd40edd24b4715db55d206f5206d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +gmiflink = { + revision = 15878; + shortdesc = "Simplify usage of \hypertarget and \hyperlink"; + stripPrefix = 0; + sha512.run = "768353fee03e36d5f13e5ea8ca2cf0925fb5dc3c847680325a0961b78a3ed6c30859bc57de7b927cd9e782f85539c97183687755c31738e1da3cc27a08f52387"; + sha512.doc = "4fea41151ea197efdacd9e5756043b87500af8445769d0d0f69560cb94decd4f097bcdd52041706ada9b1ee7826f3c56aa30db473c472b1c74553cebb5231072"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.97"; +}; +gmp = { + revision = 21691; + shortdesc = "Enable integration between MetaPost pictures and LaTeX"; + stripPrefix = 0; + sha512.run = "79ec2dd12610086eb5e7b582f5296fe7f1101c20b6d4edf10d47c5dbcdd506ff7c5f326af7600287a148031be060b3e8319d20d8267933b94b6c8a53e7753bf8"; + sha512.doc = "d3d4bdbc5b1c4618820247ec101e43c1c28b9e023e7613d5256456424fa95a54f23463ff1336f2586359a6078aa733de77cd7ccb892b367cdd00215ac7b67512"; + sha512.source = "13c602f735e86066e87231dd299680739af8ab526d55897c8a972b177ddda6a92277c3455208a11184281332d94f924b59dc845b51d7288c7c6ed750c45a3fc0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +gmutils = { + revision = 24287; + shortdesc = "Support macros for other packages"; + stripPrefix = 0; + sha512.run = "af0fa2ec7a3ce1414bf5d48d0bd8ce9de1b96b2bfa4f9c2babc6b27c52d11a7e5024bcf66938f3566cf6cf331b154f7eb4ca9d1cbe7109cde939829ea5be55a5"; + sha512.doc = "f1d6205f39f573b0c9b28f0ebca03b32e20e27c0be12adeb7eb23e12daf41a9590733270661aa29d6b8393dc87855f293437617cd8598f39082db8a33e9281ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.996"; +}; +gmverb = { + revision = 24288; + shortdesc = "A variant of LaTeX \verb, verbatim and shortvrb"; + stripPrefix = 0; + sha512.run = "18038202bca3493596925d9d7c65612434ccddde4b301134f1f57706e5d2978025fead598751e27a29d23f66ed12306e6092461aac1d9d921ce818b0a49cdfbd"; + sha512.doc = "6dfcc27b38639d4a97ed311bf7c6f1faeb1a023abc27d53e272f334b232a52aa0edc030b0c53d6587845da64097496696ceb03cbd6aa13c8ca5ac12c1772860c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.98"; +}; +gmverse = { + revision = 29803; + shortdesc = "A package for typesetting (short) poems"; + stripPrefix = 0; + sha512.run = "98692f781fead4dc292648153ca18a05d03f2c44174bce8b2f72e85fd1e98cb5ef0fb67c12f33dc982f1d04958873ea4e78f486fadb0c94544ecb66180ee52bf"; + sha512.doc = "7e37c0c2e8443aedd6462251f603e2eef9cbacc45d980d79bf42cdc64b7ab0a5d81f50ae65251c17115265c45e641a5930de640099f04dc8112155f68ce9adf0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.73"; +}; +gnu-freefont = { + revision = 68624; + shortdesc = "A Unicode font, with rather wide coverage"; + stripPrefix = 0; + sha512.run = "8889c49137ab983c2744a6ec26dab4c1cdf2de3e6809c620b5f2fed51d3025bdc018a9d85b93b85235053d6c0f672f8cb1c074e64b8cd971d53dba3535d212a7"; + sha512.doc = "232e8d0be31f77adbb62383da35e1e37d7b952cc2e6157d6eeb4cbb7d5e1dc0794d9fb3185e68073c5cb2980a3d5a6c447f878ea8cd45c7e2b806afdab21f8b5"; + sha512.source = "b81ca0245e9a7b1bdfb0745ade7cd9da0734a407dd8c5cf3859a7fa269b949f38a3ca18341b6ff0e1c3d99ca04282ed6dd9fe2923901a06506fc9bd6b677006e"; + hasRunfiles = true; + license = [ "gpl3Only" ]; +}; +gnuplottex = { + revision = 54758; + shortdesc = "Embed Gnuplot commands in LaTeX documents"; + stripPrefix = 0; + sha512.run = "5bc237b3bfa3b31eb4d6d2fb63280ab89fa929b531ec83dec362947f49ad0316b9107abe3a876f79e4c5b283134c859e4908b300a592aa69fc7ea20b80af7fa9"; + sha512.doc = "c0e56811b5b4340c770d61ab605961bcdd5ab1abf72b9fcdb0c13c5e56a7481944aedbab70bf5d2daa90751528f0b9d7efd04a1453c08a4a6e40a46a41a1296d"; + sha512.source = "9db5deaac39afbef502db7cca3c28d0669803af3d927d6650ff39abe365c39be8dff8d7ae7537ab139fe747b7acd7e9fbc3a66dd30ac8495f30dff143dcbdb5e"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.9.5"; +}; +go = { + revision = 28628; + shortdesc = "Fonts and macros for typesetting go games"; + stripPrefix = 0; + sha512.run = "772772146ad95f2ebff85a2f3064615c26300a6a4050c1a6c7207d53e12b41477b0936b1c3d182f1c5db0aebd8499de19e0c23283c2bccf753addb2623dfd1be"; + sha512.doc = "c65516b11156d4fef5104a36cb361bf59be244555233cb5d9692892da06d3bdecd0b09866db136aec177a2bcbacfae6bb41c606f6b9da0329a00c614055905d0"; + sha512.source = "54cbaf16bd4a1a9bdd02b7811120cc82269be40e97853d94b1d526eef98e7df8e7ab8de2e7abcdd7e7db4c1f7fdf3d7355d511ed57c44c09643ea291e5b1c6d0"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +gobble = { + revision = 64967; + shortdesc = "More gobble macros for PlainTeX and LaTeX"; + stripPrefix = 0; + sha512.run = "a3490d91422940763da75ce023ae032a3d3dffc7114c02edab40399a1ef11e5fb2c3f8f3bcf27ba5fc089b4d961bc3b99f45351f43eb2f4b31d6a425a9df40e5"; + sha512.doc = "cb1bf320485624448d9456c44056fd5c43792db4ef2a4211c37acbe54bc4be7a8eba0b7cd2a10446efd1591b631d6a3adef26b5440b1a79739af095a831b4300"; + sha512.source = "f430253f8b2534f1eb1a2be289f7356792ee12b5be6f0847715974e5ed0303cd12f437723e93cc00616a4b55d4874d43477ebcf62c5b03a038a6bc76d838a597"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +gofonts = { + revision = 64358; + shortdesc = "GoSans and GoMono fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map go.map" + ]; + sha512.run = "c30a0fa1e76d0d287ed9296bb379bbb284873593f8136aa567e2573ec9d20310ad5d2ff993b00714fc472b6d365e2556c488278216c95898ca44f1f5b5c681f2"; + sha512.doc = "6a9d31a1d55f65d05922b71d9651198f9f9a8c6df754cdc93c4605fb6bc241b5c7cb56d0313a2681f60f4d92c45cbc42a9f61eba0c1eb1ba447a0363ff72593a"; + hasRunfiles = true; + license = [ "free" "lppl13c" ]; +}; +gost = { + revision = 57616; + shortdesc = "BibTeX styles to format according to GOST"; + stripPrefix = 0; + sha512.run = "13bd2ec15fb4b61fa1a318092e27f9e94761af1fbb379e52c5143f10802a4bb77be35f152e33973d078e7e3d4554f89f66fc344a7efec9d5a1e0593f4eea0e5e"; + sha512.doc = "af9cbcd39b0ed78157040634ea949152f972a02e2b19c4ffc679decfc4d76b161b591ebe915298bdb6927bfdf70b6a6e80bd119f52355fceec8829b20909c4c5"; + sha512.source = "d375e1f17a9693ed87a840ea11157b5c496ad2495dfeb21bcf67e0b82ee6866ff7072c132c0bbadd5655ec50d791454d63290c32be04be63eccb11617ae58223"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2l"; +}; +gothic = { + revision = 49869; + shortdesc = "A collection of old German-style fonts"; + stripPrefix = 0; + sha512.run = "0c3fafd295fb087d3ace144df7253ff09fb3d79091dcd49003964a7ce57308cb4e86f3c3158a5e3d7e509e9958f77d5cc6da03fc41b585ec4ea397822ac29a7a"; + sha512.doc = "8f2495f3f9c72e5a5b01e17e1a9f80bae3ded97b902765dd2fa9b43ff87769a9ac2b972aa660344bcc8e29af3824985c49639477ee96213c0ee7d9d411e8ebad"; + sha512.source = "f6e600c736989ac81cde1fd51306ddb520e693b6a5ee8338c3413b5656aaacade8d4f1ca7aa316589c4d49fa8b96b598637792825b03ab0fe3efa4bb584067b2"; + hasRunfiles = true; + license = [ "free" ]; +}; +gotoh = { + revision = 44764; + shortdesc = "An implementation of the Gotoh sequence alignment algorithm"; + stripPrefix = 0; + sha512.run = "478d51d4f8af849180d1e21ea21c6404f6eb1d13cd70d232f7002f62a588ed2de40e2950699c1bc0e5442069a957b05f3128430ef421311737cf55a6df868a12"; + sha512.doc = "3aa9837e81bc59adaba5b1cc3908738451fefe2645bf1422e0c6b119e4ff94ad85a7c2ddbae798e1e1ced95a530ab95b2f7a5a92da827c9f6d9bdc574b5f3231"; + sha512.source = "8ae972cc1f0095c442241e5340c3688021253d135167a89c67000c74a53418c48c3fa13b4b2007dbbf598abd1445ef06a9113a32a1fa37b0b8a5dca6c050ba5e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +grabbox = { + revision = 65223; + shortdesc = "Read an argument into a box and execute the code afterwards"; + stripPrefix = 0; + sha512.run = "f592b70d4b3bf02e442725ab3a17e3ebbfd3e69d7a790c01be44fa7dbca66b6df76d036b3aaf9f8ce4944bcf370dc626a07e94f5edeec11eb8dbf04c49bd3ff7"; + sha512.doc = "52e91ad758b653bf6ed804009f3aadf575925f9ce4f52225c1d5e1fb30a79907a587914b265471ff7bdefd5132b6b2d6baac6062193f498e127fb29c34107fd4"; + sha512.source = "c49132a855bd7e3ed4a98b6af13866bae68301927b22757c824497a778d2036b30307cd262630d336be7e569744b7667d554fd4810aebc0646dc90b6ff196baa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +gradient-text = { + revision = 65567; + shortdesc = "Decorate text with linear gradient colors"; + stripPrefix = 0; + sha512.run = "87ecc935dec50f43fb4079a86c0fce5de8d4222f941f346ba6d9ec67bf3c623351fd42fb88989e4d1de17c36a82259aa61b7baf9a9227eea3f8e5caff3ab8bf9"; + sha512.doc = "63894d303192ea56d1f29b33ed8722352a83e6fb58f05c639a9b930794ed5e7f2634690c5049dc62989e286464fc9f48d537e77fca234061dfedf755231b59c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +gradientframe = { + revision = 21387; + shortdesc = "Simple gradient frames around objects"; + stripPrefix = 0; + sha512.run = "31612230548e2167c7f1d6a13029ecc202675d6ae3e681fd915d38aa116374214916155453616da51ef3dadab06955fcbfa9bc383f12b5008adaa8a60e24e6a1"; + sha512.doc = "8b010be9e222609d13015176dee4bcc196d953caf7a8c1814e49f9e50325bc33362975338241bd5cef27d59516114113bd5ac81e3dcc6e89ea7f4d53465b3cff"; + sha512.source = "7ac2eaaff343101c1e9501104e2be138bbbf85d009c2eff98f10876ee814762ac2198bc800ca43b9573e206241b9e3f196ab24e053078f78138415db8ed8fb51"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +grading-scheme = { + revision = 62505; + shortdesc = "Typeset grading schemes in tabular format"; + stripPrefix = 0; + sha512.run = "d68e5f9110738f2ac7258c312045b40db3ce20ea8fd80e6feab47164091cf2dfa460ff7ab5fc794cfe2895f5df5733ed67429f3babafc448448aa99d52bc9ee0"; + sha512.doc = "337f873bbb07432ec9e5c20484d82e65d315921411757c295af78e521075a16044943f41bfe6daba9f0efca56d33b372ebd177420d13284a44b0251409277ec4"; + sha512.source = "47de7e1c71f78bc472500b44aba2cb4a606a6219737913bc07492bdc485fa7ec1bee30ee04311bc3b278b8017180e98e032e4f2d1cdcccf561e42f1a9bbadadc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +gradstudentresume = { + revision = 38832; + shortdesc = "A generic template for graduate student resumes"; + stripPrefix = 0; + sha512.run = "b66b3b8f7cf16f17758e4dae3bcd45f6e6e5cbc0dcfd6fc42f8dbc08abb572f16b96d5de4ba634b27cd16a1c4177bc62644d3eb5ac6060e66d9ca6d3f5df4eee"; + sha512.doc = "e7b166b87a5dce9941d6bd931dec91124a118ba127075aedbe70fc9fe415a8083911f90f094ddede551eef197baee9cfa4ab6ac65c8ae081cd8938f872ad7bb2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +grafcet = { + revision = 22509; + shortdesc = "Draw Grafcet/SFC with TikZ"; + stripPrefix = 0; + sha512.run = "d322b1b45762c65232f6f66adcc12955d85d4bfddc08655cba8e11903f6403f2031a78d7e566f4d9b5eaf950aa8d2a53472038e204a1d18517c754c379c60bc6"; + sha512.doc = "b02bfb612cd5fd85c1839307a016bfc4c3d472ddbd591d1318bd7c5fcca42cc1200da07f2105ec429768cb0f9270273425b01df1242e475946bd37658e692f41"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.3.5"; +}; +grant = { + revision = 56852; + shortdesc = "Classes for formatting federal grant proposals"; + stripPrefix = 0; + sha512.run = "212fec263131499530ecb81d7dd23ad5d162928d4bf8a888b29c190f15d1d15df71f50ba5c243cc1cfffd324cde3362e98d2932e7562f69cdb77eb09025ac7cd"; + sha512.doc = "5170e7f01087c8198220977c1c5bef2bcd2d1a2b824122a9727fb1504576433d682caaa6c9a93454aab756dcf654875fe129c0fbe32452934b1a8b08fcac079e"; + sha512.source = "7894584e5cd67051423ec0febc19e67ddb83e6e183748f9bbe7f037073f8f3d271a6903b535cf699960ea8e8bb5a7fd47a8108cd7ca32e12d309133b9497248d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.0.5"; +}; +graph35 = { + revision = 66772; + shortdesc = "Draw keys and screen items of several Casio calculators"; + stripPrefix = 0; + sha512.run = "6449e4a42b8de0556d9ab46b3c5f4e0da94fe015b289877e1e9a5ca6f5e84d2f0d621e8f02bf4cf3959807f830f2671124e725147fa033d25444eb14048fd77e"; + sha512.doc = "bbab6b3a5a8ddf69de43815fe54a29ea376839f0dc8e1af47cfcdc55cbeb6ec93005c1c137fe717b8b5c81ca5ac87e0d2d7b0f181608fa1d7714ac2aa37f1e3f"; + sha512.source = "f058197a060da4bb7525398bf51f76b595464cf2253fbd8135d20e0e9b66d12def451eb687c229a96a7f2f79afcd66b768a4db37d448824ff9597eeb3a7ae903"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.4"; +}; +graphbox = { + revision = 46360; + shortdesc = "Extend graphicx to improve placement of graphics"; + stripPrefix = 0; + sha512.run = "d78f870b4cd54f7c6819413fd8acf0e3e1fe9b3b44f3b68ff3a20ad51aa6fde69c52b336b57285db1f6d5465204beb8a1179f918a71922889297cf6925282d14"; + sha512.doc = "342c9018116e80ebf3414358320df55e456581630e7e266ff868e6c624baec0b7209ad3895d3232cd0bf35a9677b8c3db800b7772606afa928ed3424ac16c71f"; + sha512.source = "1e97e3a1a91d007309c091fde6f05a7c1b062b715ee1f35051b20ad5fa119ccd415fa3741cf0d5e4f2a090ee9acb090c06b5467294ca26ac8f25a11971ca7530"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +graphics = { + revision = 66204; + shortdesc = "The LaTeX standard graphics bundle"; + stripPrefix = 0; + deps = [ + "graphics-cfg" + "graphics-def" + ]; + sha512.run = "cd36d380c8315829f3bf711dd970d5460f00e19961671714dbdf5928c2e842d33438221ee1fd9e45061a2adabb7f75eb34209914229eca872f2bb7fe7b346a16"; + sha512.doc = "b2a23c52e19eb8f6eeb53951f5fee9015f6d0ebeeb8a97f1bf4db217498ddb27b62d028b3554be3e5ec3b866d1d4bcce6bc805761e981c718f123f6688ba153c"; + sha512.source = "45f998e3729e81f50cf7c064d1a3926c18007069b4a89b478e87a6f97f3e6820eb5d58be6025f374b05d9c443c8a101918ebff84de512366f5415e041356a848"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +graphics-cfg = { + revision = 41448; + shortdesc = "Sample configuration files for LaTeX color and graphics"; + stripPrefix = 0; + sha512.run = "e1015d360b56f63f1b9790daf16e2101e6af995bd1e45288ea604ae94e20196cab22e7e54d318aa79fa386123032a928be70a57154d409321e04f03ecf97ab75"; + sha512.doc = "dbcfdf635c2816f305205915119e1f6acba816c17b683622a8a32c361d75338376426b258c1fa3271abc1d7ad2a520ac85092a7b3bfbac6463106449bc906ae4"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +graphics-def = { + revision = 64487; + shortdesc = "Colour and graphics option files"; + stripPrefix = 0; + sha512.run = "7f811afae5119a42f97c23f65bfead8e7ba7e64796688b219eff78914115f8dbffa6e3aba97208f67d38b6463819ed2cf49e173aebcbe73aef8c2cf399ef803c"; + sha512.doc = "b52099d553c2bdf52ddb7b50231303f106db445d58e675ad819dd0dd84750f0fc6d164fa21deb1f622644a6651e6bdbe41ad3362fb021f4a7da2e7599fe0a526"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +graphics-pln = { + revision = 68760; + shortdesc = "LaTeX-style graphics for Plain TeX users"; + stripPrefix = 0; + sha512.run = "33c1b9a4db0c564df07360c17ea89a7cabd557b21e2703e68532388f7b977a2f99f12c6d7002e9297b8e35259a42fb713fa0d2c49e6c9a347845755186437c24"; + sha512.doc = "27600b6127990a06a75ad8aea49a86b8f16b68ed306ca3ec54762124af02ddd1859adb714eb0dadcacc652578427d230d37416cf3326f567239dfa4b9d8b53e8"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +graphicscache = { + revision = 65318; + shortdesc = "Cache includegraphics calls"; + stripPrefix = 0; + sha512.run = "90e4df3ce08bc12f0d5c2e8b66687c79fe7b791708bec5990f8e11590b64bcdf50ec393244ee85af7bd6f644787d56626f08c31fb1ca1b354b64ffb5527a960e"; + sha512.doc = "749c11a534cbad3f32a7840097e6d42c70f99aa684b5971ccdac4e6a0bd668465ed4a7850bbfea61e14d396440754bfc0d1fe45a9ce71a57908b1c94ddae5444"; + sha512.source = "c730c10210c785ff27f319990b24af529a44c365d675f294401d363c1e5901af4b0e198c93a147ccf85fc440da99bf577063ed207d1d172ca4008fc9215586ef"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.4"; +}; +graphicx-psmin = { + revision = 56931; + shortdesc = "Reduce size of PostScript files by not repeating images"; + stripPrefix = 0; + sha512.run = "d0cb1283998d0ba654ec75e0696bb2b6102968a504e3dee457826cdf82d7cc5793dc8407d0145f314a780b3e015a7be49e70ed21c21e68a3735bede1aacde6fa"; + sha512.doc = "149f130b4e47f60ed3484267486033fa92aa7529169061a2dd9582daef579b6aeaaef4001261ff7bc301c17ef2817bf7bfeef909d22be44079a2c3c145c92040"; + sha512.source = "20cdc55b6645f661f5ae9ebdccbec0506c4e2a4a699dfc88aac9bb6d0ea1b0c308f7ef08abb4525faf498edc77eed5051d9130cc12769dbad7c2a31a814e46ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +graphicxbox = { + revision = 32630; + shortdesc = "Insert a graphical image as a background"; + stripPrefix = 0; + sha512.run = "032168dcdd5eab142cd6bf24eaccc3fc6482e3eba7e0fd2600322b4a6f2bcb1ceb8e30a64dd811b500af37c94e7de3ec25c60c437ba9afa7ba4d8a9af8b79a19"; + sha512.doc = "6fd432f48c05c486963b8058025dda2a65b5cfa87b6ae03581009dcdeafd26396bf16e04fecd0e68a896a99d5c3e09e43902bcfd3f58fa9a9b393cf64406e160"; + sha512.source = "a563a3c1e81496da30aca7256b5b2afc57d9df9e9aab2b6f5bf908691961f736a616f7c5f86647b94a6dcf36d3732bd68b75f5a4ba7d7d049bb67789ec48449a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +graphicxpsd = { + revision = 57341; + shortdesc = "Adobe Photoshop Data format (PSD) support for graphicx package"; + stripPrefix = 0; + sha512.run = "c1327b1adc6657f423bf8eb0d29224773055f434cf749da8a8b2d1713c2a90a6fdeed2bded223c7cc941cb2b7403cb68927d72b0eb085e906750ce64ffcad3b8"; + sha512.doc = "082a8e580113ef796be4cc750d98f6dd0bf783298fef80a06f5387f352183d513e0d8b90dfb684bcaa575ff7b9307fe11e55f84aa66d7f29b411e06af76e70e7"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2"; +}; +graphpaper = { + revision = 63116; + shortdesc = "A LaTeX class to generate several types of graph papers"; + stripPrefix = 0; + sha512.run = "1a850300bad30f7139032bf12c26cdd120e62342e09d7d742067c2f040f171a5a20bda2d57fad0aa769d0a337cb7373cf0f5f4d3932ed65ae589e4feecdd5738"; + sha512.doc = "dda173040d6d492a96e8ecfc374f1a8f01b30689f6f97be6c2c530f2653c70340c7f8c2181fd4a854f2b25e5b4b835f67056b1a95892fb328d8f5c75152f36e0"; + sha512.source = "fbef9be61d0bf8e35e61a596a7297e1eb78308004786f2d48b66ec3fda045784ebba80d7fb66094dda99dc54b751710998dd96c013ac92e97a1c4e60d0b795f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +graphviz = { + revision = 31517; + shortdesc = "Write graphviz (dot+neato) inline in LaTeX documents"; + stripPrefix = 0; + sha512.run = "9065f2316f423697c8f815ddcf91254f22e44d89964196d971c3a42192bb1e20f9152c5a98375060daffbb295f8885899d2800728de31ecf60e1a25cf7bce31e"; + sha512.doc = "688f17db6771785753797edccd141470517dbb2ee875e2a70769754bbd314cf8af46b3dd89d5c340e7da7d81d86895894baa2b9e8facc0a54ad91cd1a3947722"; + sha512.source = "c3e4fc091b5b64924e886435667049ec2dbf91c20fd7d1678f40990e66aa9d94fd7b40b30dd359be0fd1fba0e169b29058337ede8232189dad3dab7bb34af869"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.94"; +}; +grayhints = { + revision = 49052; + shortdesc = "Produce 'gray hints' to a variable text field"; + stripPrefix = 0; + sha512.run = "45d0736b5b600aa3ae524e0ff2471846cf48105464710fc7bb7f8d27326275d1accc63b5a0726c5d43e5af487207eba105e1d5e4f59913a1b27d33e950122574"; + sha512.doc = "85a6b8e44ec045ec00b7526f034e5b15d71fc8e439bfbbd43e1c8f85d4400318d8dfeee4bece211705c351e2b5afc9ddc89073fa14c1d90756bdf458d7b5b100"; + sha512.source = "7342b60e1957297f41970fa2af45a8736f438e6560e4cb6bd279516fa40ca283d7cd60e5faad2959aba12958c0fa70a95d94bb9c48e7ad47956bbc646af82173"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +greek-fontenc = { + revision = 68877; + shortdesc = "LICR macros and encoding definition files for Greek"; + stripPrefix = 0; + sha512.run = "24aded84aee9dbe4674a019fb3ffbe0d48fb51d88908e532cbfbafbebd8dda63ac6d2d47c907d32063bd57c3c9d90d51b1e8f1f59ee4fecb451f20002d4a1115"; + sha512.doc = "67f22594152f543a1b59e91a49168b92d6e9870f0c362a69746c6d3ac9fa4918980df4708bf1a6697fedcfd519153b9a29d92114b6567a2ec03e65210eba3d7a"; + hasRunfiles = true; + license = [ "lppl13c" "bsd2" ]; + version = "2.6"; +}; +greek-inputenc = { + revision = 66634; + shortdesc = "Greek encoding support for inputenc"; + stripPrefix = 0; + sha512.run = "47dbf3388943440918879234037ddb08a8ea7f2851945273af2a01b032484e849af3898860f1daced148b770c4146701a987afe3ba3b8b66dd030bce36c4006d"; + sha512.doc = "2f85fc72c0415b48fd74ebe9d19e5ce86440c57c08038e96a2d99673143f2848bc347e95f7beab7753d0921414fc635aa9b4f98eafc91fabf64155a55a407bee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +greekdates = { + revision = 15878; + shortdesc = "Provides ancient Greek day and month names, dates, etc"; + stripPrefix = 0; + sha512.run = "7f350b4db9578f9020b28bc217e508574b697749c1d2e10c9de9c6499e26605da8334583ea7fb56d74bae77bc30e5835653014f5f8f594d3f35d04478ccffa9c"; + sha512.doc = "979353f7cdeb127e12388e1eeea4903a929d911f6f8fd42cd814b6cbea09a64d0ab9c8118968bf218330dfae64f9147621d23d2955fb85291f484d0b5eb92a00"; + sha512.source = "16a5fe04bd6a598a09c7f326f6848074782e8801d0723366e5ae2b1ae51580319210c64f5e7dbae7eca5cfe3573b0f24d689c802d9594d18dc7c8f4126d9ff49"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +greektex = { + revision = 28327; + shortdesc = "Fonts for typesetting Greek/English documents"; + stripPrefix = 0; + sha512.run = "d7aeb9640061341ed39a71f7f69036f892bbe60b9db2236660e163b42fede81d6be58627b0163d3a183c120c9c8fa54f91a1a036ed9e50d2a72d5eac7f8a79a5"; + sha512.doc = "b58305d403a58a60ac0cd6ebb60afe3058430eae15774895e03e41b331824673c128c5f06b583525e2311dd8ee5166549ea831e756e8c934c73ae911a0adbaa7"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +greektonoi = { + revision = 39419; + shortdesc = "Facilitates writing/editing of multiaccented greek"; + stripPrefix = 0; + sha512.run = "a19dd42de4bfdc3c068169bbf32c55fbd76135a8138d41e0726b421d3cd5e20483f77d7b78f85e54571381f780568f1fa1ebc57d23ca460b33e4caa256c4894a"; + sha512.doc = "94da0bcac7b513fb9f720c0bc6d7ca8d822956b1517a95335b415e477d3144063bbff65d57978421b6b9611c6b4a866701762cbb2ab09351fe6c5d02e4b02f39"; + hasRunfiles = true; + license = [ "lgpl3" ]; +}; +greenpoint = { + revision = 15878; + shortdesc = "The Green Point logo"; + stripPrefix = 0; + sha512.run = "2ab6b0a9d12c12936362e9e1ff387c393bcd2e9769357dbc74a5d9bcbbe027424f5d58d85d608c2c519d615f01e6e809f6192280c8c60aa53fb8d96dcbdeb8dc"; + sha512.doc = "84143440a421999f0a59461652be21d49d8ace66fd3b8d9d89132c6f06f67ef4b571522d6ed54d87f614a15dceb99cdf4c3caecb54eed9a4bbf49401de20ada5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +gregoriotex = { + revision = 58331; + shortdesc = "Engraving Gregorian Chant scores"; + sha512.run = "00dcd5bc7c12374a15d778cb903715036bd29a7a07522446cb5a5cb14509956db71df518d97e44d1e89366402281c26b96eaf39cc9f97d624ecb40107eae3db4"; + sha512.doc = "67f018fe0eb9568b0ecc6977de8eb8fc1b0b9503372e2f674a97723c537d8a8fb4f48d48b95ee8979e4d4490d3725cf4a1411ab9d7da2ea14f72d0dad0fddd95"; + sha512.source = "0ae6211b33a256f1b10a2b167f3f5886f712688ae73baf13f698af37f69f83a9be754efbc6b0d5b3a1cdf11e7d459a98986b27c27b6318cba8fbb3e48d7f682a"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl3Only" ]; + version = "6.0.0"; +}; +gregoriotex.binfiles = [ + "gregorio" +]; +grfext = { + revision = 53024; + shortdesc = "Manipulate the graphics package's list of extensions"; + stripPrefix = 0; + sha512.run = "a5f68f2bb2ea26d4b8f963a1b8fb8adfb3bd32e3a139dca57e6b45d80fcdd94c5e846549b1292224b9d845fd6a4d0ee56d4c2d2fbfc12c24806eca8551b9dc96"; + sha512.doc = "4337ae578d9e524e2da8564a1b736eac1dd50c1e4495d027c44f3841eb65c6c494527109e32f00844c17a5973a94572569a429ceb95beec98d2b19e84735eaaa"; + sha512.source = "cb7dcf9b3860b90bc8618c6d964fb7e9f5e056882bd5e6739a57564224f970ab9cf0ba136ebd88072541b8d169245ccaae90f714392a30f83c73e82281a07359"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +grffile = { + revision = 52756; + shortdesc = "Extended file name support for graphics (legacy package)"; + stripPrefix = 0; + sha512.run = "3f1f5e4f258e4ab1f51fdb44fa0b49e80df21a6c35dccad16a6b70ad76489cb4fdfff7e6c4dd07821c54543fdaeecae32cfd8037d4920ce60db02be9a2f8fa07"; + sha512.doc = "2f2285ad44d0c585cd02b85359eb31f885f7c704f6da5f906240c1094ef8d347d33ba6beb31cf34e09a5e39e618a27a7ea263a63d6a887638d8f761e3cd4b61b"; + sha512.source = "6538e5cf13f8212b5b231637a4abb68bc97330e123432922e403ae7321439bef910a0d1839abf394518ad274ed232c4c2e19671c8e6aaa55e2525708f305c679"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +grfpaste = { + revision = 17354; + shortdesc = "Include fragments of a dvi file"; + stripPrefix = 0; + sha512.run = "e7c28c38a20e01b05c5839dc7d011ef5769b3344fd4321f68e1189a830a90e6ccf9edd596e248489a0a578b2aa4e5e5f3bd1ec21c76b3dba86a91d5e431d0617"; + sha512.doc = "63719b8f7904baccddc9e68d1fc7d609453b2eb9feeee95bb077b82d1345c40db7a92c649c3d9abae6b9c2e19090163b6a227418f4d9d4d91b1e8b1c0438005d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +grid = { + revision = 61719; + shortdesc = "Grid typesetting in LaTeX"; + stripPrefix = 0; + sha512.run = "312b142c43ef4bb9624fd6589d086d733593dc0d387894bf58749b3f6251f33df415656b974935352a0d4fff090953f136d0353b98329ed3051ad179708af12e"; + sha512.doc = "c3559726bf89f766b0d95e3b493046ee6b4c0edee43e4c581adb150e6ad5358ad0a1a3a67b75ea1095f2da87393734972a59693332de10b7b459579a7f73e534"; + sha512.source = "dd59a48ee18940509d89ea55219706f7c0ae6d7f699b77137495fd4a850cd9d373f01cd9f2485a2ec47204c380c0a17c4986940e0a0ef21740c383e0eec81f0e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +grid-system = { + revision = 32981; + shortdesc = "Page organisation, modelled on CSS facilities"; + stripPrefix = 0; + sha512.run = "b9846f467854538c488ae444645fcfb962c1aece34e3847dc3dfdd4a2aadf8339840c09243448922ce184f6211bb3b95c6fe9675b5bae0e3b3756b2787e7e87b"; + sha512.doc = "659b426e99db9152c64f37a4c977176ce1a24c324465399f3e481cffef505044aa820f1a445a79c68f069702c07082d3d5c73c5fa762068a44acdc21221cce68"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "0.3.0"; +}; +gridpapers = { + revision = 58723; + shortdesc = "Graph paper backgrounds and color schemes"; + stripPrefix = 0; + sha512.run = "17f9b6b16a0d2f45648b131623c243e0b62f5e2d2fb1c1997af921a1307d941ffb07729d5e4787b4627961160a75de98165e97a42331b07a3259e91c987f27e0"; + sha512.doc = "0f4fed3e0d17f317f3d56f69a7100d36ac6d022f7c7c81c8dd0bb1f740f782ca5a4064cc2c80daf865c85e7ee84027a97fe675a13f9d0d348e489a2a8afa2ed9"; + sha512.source = "962b9dd3c99ce419e58cc1f146406b0703807d365069a333971c1b0ad3409f64c9c89d6dfb9c4ce80731164af1d6dcde6b510c156602b0bdde2f231d7da45406"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +gridset = { + revision = 53762; + shortdesc = "Grid, a.k.a. in-register, setting"; + stripPrefix = 0; + sha512.run = "296200c463b67ce45fd7c9625298b5e0b83b730055830b3affcdc0c329a2ebd5f89c5da93e004b056efb63f8e43771824c7f0adfe435461943cc68aea4bbc480"; + sha512.doc = "54fd48dce732ee11a7279eb663bcadde958f2ec9d3307194000dae2ced43f604a54e44174ca36dec389c9ce8e5e0809849b5c66aebd9527337ea3273353142aa"; + sha512.source = "fc25880cbaa087230b0106a40d2c945809f09200c7e25de88588ab0075e06b91efd362453c599397e29f5e9a053f9554e0496cf03f4f134bd74678d1534ba07a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +gridslides = { + revision = 54512; + shortdesc = "Free form slides with blocks placed on a grid"; + stripPrefix = 0; + sha512.run = "9f9c3fc88cdf9e3641aae264eac0c116c3dc410ddab4c688521289baaf67cb4c8c605c734fbf45538b6498f7c337aeaaa4b90d2584c6becf06a97b81894c63c9"; + sha512.doc = "ea3a2ed6334a5e160cb27b096e0868aae28908f77d67626b9d1d86840e615bf1b296ff5813ef5ed24ca0435eea39f4afe601216f243f2be585eb952f4df33255"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; + version = "0.1.1"; +}; +grotesq = { + revision = 35859; + shortdesc = "URW Grotesq font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map ugq.map" + ]; + sha512.run = "30d0d52c98f44945ed40f45f1e73ed60e6b98a8a74dbf57cdae5c2d400ef613f8bed2b89b3b6afbf7b98e449738f637911dc1becf0c0dd33c21a23ecac9a9767"; + sha512.doc = "d41ae946f315d87b483a03d8b5a1034706f5bda765c69fa692f117b79bd5046b409e42c7b17577ee086ec98795e8a93acd761e30815c6083520b4bd244c33cd5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +grundgesetze = { + revision = 58997; + shortdesc = "Typeset Frege's Grundgesetze der Arithmetik"; + stripPrefix = 0; + sha512.run = "f9912e5daab42e6aaec946ea34f420acc194ce88ef75135ebedcdddd5f70fbebc81c250f3368bc8f65cf3952d0229fc450ab40b58bd02473ae4eecee783f3f09"; + sha512.doc = "7dfacbd4686f5296cc1f677b99f42946f6ba1e761454308568ecb013df3eb0a505273e1cc357d11780f7d4762d03007ab44b87343062c50666bc8e89e1512ed6"; + sha512.source = "dfa00982121cd247149768a95ac8555a2061ebfa1bcc154ff944d07843d213ab7c7bf0931cad3dac118cd995abf0fcfe03f12285e2e7fc3e808223939d4c1d58"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.03"; +}; +gs1 = { + revision = 59620; + shortdesc = "Typeset EAN barcodes using TeX rules, only"; + stripPrefix = 0; + sha512.run = "d12c13d30c9e0303bf6c6bfb833d673cf673de3c60cb9d637aeff80470d34e04653860e2186c16c55660faa107bf583409a9891ac8d5ebf1612c8410cf60d10d"; + sha512.doc = "b3757db8c56cbacb87bd17d578be51321b0ac06a3cbcd75b136cdf52bc66a046f0db42af84e5fc33bd347fb52950448a352027713ad01263fe6344a75576efde"; + sha512.source = "bc9f08753c9663ecc056de0ca7662dbecdec18ab9346e8590fc1ecd373392bce8af50a4a5f37eb6301a2cebce0dffdf0025a3d036f14ad0f696557abdb8f2716"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "23"; +}; +gsemthesis = { + revision = 56291; + shortdesc = "Geneva School of Economics and Management PhD thesis format"; + stripPrefix = 0; + sha512.run = "42d5d8461d5f8ccf461e24d04fa61991507eb545a60b7f7bc3980d39c9f767aa155164cbb914ce961204316b1be61f5622f21236154013c6404a86ec30ec18ce"; + sha512.doc = "3497f766bc496369a2eb9f829b8ba3f0d73bfe7ac11c4afd7f9ce06c21f9aaceacdee0456a14624ffb38bafeb978c5a4787ce824143693e4c3d99a227a994cb8"; + sha512.source = "813f4825450b66024ea804e0f36d1df721565b046979d822830b87ef9cbd8a01300d50947ba9344c3e21f9624af573d7a9844d60432dacbeb0890944a9e11dc2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.4"; +}; +gsftopk = { + revision = 52851; + shortdesc = "Convert \"Ghostscript fonts\" to PK files"; + sha512.run = "cb9aebd7428d10b627d80ea40d297f3e6de006859c7dd713478ff193458494f90017ecd0737376ac1f47638b059e02e8a46ea53a7c56b8561af75f770e214413"; + sha512.doc = "0a597e2908438fc00fc2bafa7ec635a82b70aad9d7f7e86851a654c0b72b719b8c550be0c20ecf6c8d96627863a48e6a387156ad2c7e71d1e296dd4937d60805"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.19.2"; +}; +gsftopk.binfiles = [ + "gsftopk" +]; +gtl = { + revision = 69297; + shortdesc = "Manipulating generalized token lists"; + stripPrefix = 0; + sha512.run = "18cac75f4370c759fb74079c6647553f5d91a8aaab946c46a54c40b8ed757e3c14fbb2f2f5b375e691c8599a7f7d3ca4ebc5a748f18ad35e507305a5e5d8f73d"; + sha512.doc = "ca1fd56abaf08f10fc6c830b51d799a71ba00c11d94e48619f6ac44f151920e8e53df450c23426a860266d5c6347b7c24c9373d152be80c2ba5023836df6f89f"; + sha512.source = "e1ca28c2729e2a4b10ba53cb3f18a657ea1ac7cc0b3eae8b7d13b70ee510008b90d900eea9f5f48ec8b0541638e76ae73e533493ab5b1b0de020d3ad39b95561"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +gtrcrd = { + revision = 32484; + shortdesc = "Add chords to lyrics"; + stripPrefix = 0; + sha512.run = "dabadc0fba92f6da23830069e533e8d4fb234bb679aa355382c03bd3ac13924328ea8fcece3186f36d33b7d7f6cceaebb23f1158b855673160f183991e880796"; + sha512.doc = "d8e715d1c4d9c7ebb0c34c690a82e338733501012ad19cd9e2c52e6b39dff352a4e042bdc5f54e63a03a38eb9c76b5aed2ec3afae88ccd63f56663ada32e828b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +gtrlib-largetrees = { + revision = 49062; + shortdesc = "Library for genealogytree aiming at large trees"; + stripPrefix = 0; + sha512.run = "320b5993b676d803b235d0a10cfbcdde966c3e9415f164da6f45dbd2f6f201750b84cf9dd8ce5383afd92c72acd35aa8a44d0c6518e359615b5b2009e772bc6a"; + sha512.doc = "6558466d513a94cc98e5fe97d5e3bc89f518128dcfe411e27d0af171716545557096a6cdb103511157f0cd93540ea784f97d688ba271d9b2f1918f11608bb437"; + sha512.source = "258780013cefe87f8fed74b0e3251f64da8fe700b13f45dcdf20e9d9215a5b7b74e931bdc1da944e70b5a6c9d87516eb2618546994b5b45193112fa9af74cac3"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2b"; +}; +gu = { + revision = 15878; + shortdesc = "Typeset crystallographic group-subgroup-schemes"; + stripPrefix = 0; + sha512.run = "243eb6ca0af62518d60134a8fa66f91ab05e39c96fa9c0ebeb2232d27f46679da0a634b64273608028bef7f80bfaaf049dcd9f0cd935d5f66b0d5054b2d21a20"; + sha512.doc = "151f9765d6da2312a10523ffca06cb4e0529d4ebf8189e9ddc00f86510c9cd13be9a04e47b85dc8cd815461c17f7e4b8be9604a1a605c86d7228d1113f985a23"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +gudea = { + revision = 57359; + shortdesc = "The Gudea font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Gudea.map" + ]; + sha512.run = "e32cd699f60de092f9bf04e0eae725555735478db9ae7bf0a01a8aa78ff303c5dedee7eefcfa94bc1d8012f4062160dcbcb25cd405debccf7eed20abec056cdd"; + sha512.doc = "633f6cace4db98c88e3a7ea1f68deeaf9b0fe980ace490807688b629b1e3b2b00a12717b66b641dd9949065e4f72f423f78788693ddfe2128752f8ac990fd43c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.1"; +}; +guide-to-latex = { + revision = 45712; + shortdesc = "examples and more from Guide to LaTeX, by Kopka and Daly"; + stripPrefix = 0; + sha512.run = "cc569e242b42361e6506144257db1109f1adee52915f361ed330699edea1895b78ac64488ae8b9e2224bd3baab01515be86486113afc1ed9b072a400ca736695"; + sha512.doc = "bba47b9a9e5223e558244029e258835a865b90824c7069287f0c996a36c4fb78d21e62e88e52ea008dbc573e7a4ea34843a646eab11d8377a5167724286c397e"; +}; +guitar = { + revision = 32258; + shortdesc = "Guitar chords and song texts"; + stripPrefix = 0; + sha512.run = "fed7be24d0bff6d2a0022374e4cbb60cda508b0f99a5a96d59060247aad561c1124728f00a6d0a51b3b22f4490c6153df740a5e9d8106da23c85bb18db385195"; + sha512.doc = "4a2012e693257c2bdb4daf46a2402882caf0c8efbc65bd6679c9eb11440ae75f09d31369839f84312bd1028207d8aa23a745847be1e762dea977ecd7f73b4a87"; + sha512.source = "26b552a91240900b54a3266f26e9f439c46315bb9558d95ae5b27f518a7f5ffdcc1990a4ef676e9186b5492d4a66826754c4d34e13e82b9bd912ff74d14cd185"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +guitarchordschemes = { + revision = 54512; + shortdesc = "Guitar Chord and Scale Tablatures"; + stripPrefix = 0; + sha512.run = "777af4d4ad1a35bef3f0075e2df707c3a3c98969ee688b71c3d13449b04ecfcb2d82ed9332a8aae81a3bd825462c2cbbf840b16a72fc6e3f65e7565ef6b1b164"; + sha512.doc = "f7508a78fd341e4d4d0fa8a0f89a14420ca50d590bc4a1f5208d4130a3aa84048faa8720545c24e8f0243b1f062a6f40cb5cccdd9ed7db583a11fff1a40c7eeb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +guitartabs = { + revision = 48102; + shortdesc = "A class for drawing guitar tablatures easily"; + stripPrefix = 0; + sha512.run = "a4866683cb639b63d455f40da2ef58ee4c69d0e29e5071437a07922a0a45598677557ce609905dd8fc5c3e40a98bceb9a753cf4506342585e6cc2c37fa591271"; + sha512.doc = "ef5f516db586d1473d949f44a2eb9fb307b84ea5a7dcc3c9419298203b41c54ff4dad75d3b24cf30fbc24f4c60ad4b79b9c1fd58804667732a66b0ccb52cc3b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +guitlogo = { + revision = 55741; + shortdesc = "Macros for typesetting the GuIT logo"; + stripPrefix = 0; + sha512.run = "42fe915cdb69b18182222843452627655ba1d619c2ae9eb469673a35aab31967afc3cc2abadbc2fd13d9215555a2f97a54a6d3b1ec895fc3d3f6388819bbb9f1"; + sha512.doc = "505a1f12e772f2f1cebae02164793b0416322aa60cde58a18ba0e3fea0a7072d07d0d8b1bad9aaeb9248dfa89b4b1730e0e5c2a2581b41a7a3a80636fc161b66"; + sha512.source = "600881490f339ffe540248d7c497a970ee606a9e8167036043b833b24630171d44a58a262e79ddf72fa9308b45bd70c28893251b8c185aeb955114a11c70794a"; + hasRunfiles = true; + license = [ "lppl13a" ]; + version = "1.0.0-alpha.4"; +}; +gustlib = { + revision = 54074; + shortdesc = "plain macros for much core and extra functionality, from GUST"; + stripPrefix = 0; + sha512.run = "e752e4b53191a9c5b46d1aa5797d491b98ab2585873e9a9a1471aa89accd898cadc5a9332ab36828b4baa6a3d3d69b311794e1948b788db755dc8f066a68550b"; + sha512.doc = "9c1c0279f18a37b2a500e415364dd4404a7dca8b6e0f85b053db5511826eb401865984ee3471fbe607e4cfa605ab50c08e6c11b166dd629e84d9f07db4af7114"; + hasRunfiles = true; +}; +gustprog = { + revision = 54074; + shortdesc = "utility programs for Polish users of TeX"; + stripPrefix = 0; + sha512.run = "bd9cf1c174a5674a0b71f07bf76f46ca4e15dfa194372cb04e63467c29ee1e07b03d0e611afceae80ea192b6f842fdbfae0bfce7eab2ce43a4e448058521cef6"; + sha512.doc = "268a01f59660e5225c1c21539076e6239381294e6aaa31992032ff8e3d777cb7e4195247c92d9f22efbee498c8bac34cdb915e0a5b0f6cb2b5c0b72c15695d72"; +}; +gzt = { + revision = 70535; + shortdesc = "Bundle of classes for \"La Gazette des Mathematiciens\""; + stripPrefix = 0; + sha512.run = "8c6cf2243e7539b0ba4f84e36a634e46f6a59d57a5d5c58df0ab77ceb031301048800c35c092e3cdfa4ee08d1d61a1a5ca27a6648f9be5e658deb3ca16cf6698"; + sha512.doc = "08272184765997826e89cba2ef02c4695956f14ed603e32f602884dc191b1a81b60e654abad20cf50bb377b96ca50f39fd89234deaa81cf3a66a311445c98f07"; + sha512.source = "6654412d1c9eafad470db5dcc6045f2872f1b505e498d1243a9f26ba76e3b3af11567af78e242268d3d338bf7ddc9e5f2546b730b0772718bb0afbe1cae99827"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.4"; +}; +h2020proposal = { + revision = 38428; + shortdesc = "LaTeX class and template for EU H2020 RIA proposal"; + stripPrefix = 0; + sha512.run = "ddee9c5c1838bad606f212c1a7ebb7ac4d7ae571f1e29e83d55744dd50afb55e302f4f20a3cedd0d4446886cfa515371fb913b862d4549618858896de2a543ef"; + sha512.doc = "5ffad62ed8eb39c8cf07d4840983990009e5696a2d7714d2cbab13a69c77634d01f10a18f612c853a09dfd91ae1ea453bb3373681e89a6994ff4924dd64c3093"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.0"; +}; +ha-prosper = { + revision = 59651; + shortdesc = "Patches and improvements for prosper"; + stripPrefix = 0; + sha512.run = "fc78d9c422c05e4d5b859d39f4b681c5deda4d6850ea383f33b71b0e2aebc5e4740811a831e8e364122c7f451866751d77af8d5e4fd6b8b9f5dbf76f23a7d09f"; + sha512.doc = "939e86ee09351991654d8542cc21667e16d64dc56f0e9d29932b816458319c3ba8e0632e92bc8c17cd104fd10dd7171a89f9026fc9faaa197fd7376c61377d63"; + sha512.source = "0ef051d229ef636232751d77ead251622845f9b973ee32cfcdf67c046423334c0fff283fa1f569464931ff8a6ec139e9fb16acb133874bb56aa11684b7388f00"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.21"; +}; +hackthefootline = { + revision = 46494; + shortdesc = "Footline selection and configuration for LaTeX beamer's standard themes"; + stripPrefix = 0; + sha512.run = "223fb22b01327fb63ff16684d578f89ee583d5c7700dbfd5966aa8cb94ca4e280e4409620b0d261bf2a80a57f51658990b0a221c0dd311e3eae1f39d459e8098"; + sha512.doc = "960c6a0bd61210b097710cc6715012e4406b54dafcf070659228074598a05e0dbb65669ef77c3f6ca2cf80001e95c5f801070be29d416d2bd552d6c2a1d27f56"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hacm = { + revision = 27671; + shortdesc = "Font support for the Arka language"; + stripPrefix = 0; + fontMaps = [ + "Map hacm.map" + ]; + sha512.run = "6f4373f4e30d95c747ecbec45c53a9af23b78acb84a063dc0b2d4d5ed218e7c5f70d4f29817d39f6cf62cacc455cc3117ced589d41bf3f321a6f9d882823164a"; + sha512.doc = "bb6d5cd50e68ce84abd5f7296d8216d929b772f30e946508ca9bad2ffcd8d077d1927fcc76a5ea2e338799109b34adc8272f9f7f6d316f5af1312070f57fcc3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +hagenberg-thesis = { + revision = 65819; + shortdesc = "Collection of LaTeX classes, style files and example documents for academic manuscripts"; + stripPrefix = 0; + sha512.run = "bba9dd22c1e4cf082697c555f2bca5b53af2f3684c47c8911cd11af9f35c9e16e60c5d6e7941436f0a584cc98f882f22c5c855194cc71df7e928f105bcecf9a3"; + sha512.doc = "9e73ee93a231c319ed65a2c23d23d28ad224367ef7773a9d5c1de474eaf6f9d2a402ae1afa4138ec172ca9e07a5fe64c47d57e16ceaf24b203390a0adbf645fc"; + hasRunfiles = true; + license = [ "cc-by-40" ]; +}; +halloweenmath = { + revision = 52602; + shortdesc = "Scary and creepy math symbols with AMS-LaTeX integration"; + stripPrefix = 0; + sha512.run = "1c897f5582e26a42799065d9b105bde3ab7823e9320912eba72654d00624a3796f468d9138fcd47c32e021b31bffb1a618f3ce0024ce753005236a9e08ed05d1"; + sha512.doc = "aea1397af446f64f4d8bacb03f0f2d211a44f0f85d93612db840f198a1ed894e1b0a3680005a002808fbe5b8b367f8a8d79b9b99908a4be0891c0d5b43c730e2"; + sha512.source = "dcefec44ecf9cd8488b756c70624e3cce53ea6cb2c98acd09948d08fa0f4292ea20fd19156189329f30b47a0a3f7f7fee96e633125eb55eee066ee87b09981cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +hamnosys = { + revision = 61941; + shortdesc = "A font for sign languages"; + stripPrefix = 0; + sha512.run = "36af23f5eb95a743a691047d9dc02a19825e88e8fa62f1931f5c2f13e95f89351b42dda6a204493d5f2a147e0d8c039b6b5bbb2aa82bec00824c7c5612d5056c"; + sha512.doc = "068e8232cf97513c69845e66eb6772e80de0dcf9422a3547db3b002ada137a1b385829a7e8258145ec2b5a05becfd08ad5ee40fce71326b93c3241bbc9f8c0b6"; + sha512.source = "bacd0fdea3934bcfd32749c759d1e57e740c0e47e477790dd3c706d252c9439182c0af36eba30b8c00c785bf782605c319bf63b7d9ab677c799a5997f63af32c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.3"; +}; +handin = { + revision = 48255; + shortdesc = "Light weight template for creating school submissions using LaTeX"; + stripPrefix = 0; + sha512.run = "361fa013f1932da2370ccbd67e70acaac725349e4fd4fea28a6b676a5459aa8ce8fbc1edf42f3f3fe234e12771c5be8bc463ef758f823a3b43fcb7191bc1a660"; + sha512.doc = "cf91e16a8f04835a47da1a5ccb31711fd9317db557f0152689a93c4f58de33c8e7c8be1f7c5d9eac599bf8dceab3f4d3e84831efd0612a58571d3c71f508f20c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +handout = { + revision = 43962; + shortdesc = "Create handout for auditors of a talk"; + stripPrefix = 0; + sha512.run = "9c5da5e16df3bfb4eee1ff7b8c6881e7faeba7001fd7f0ecb8b3027a464d611149c8768b8d8853c07417d67a723fe5b1de19620593a177139241b47c7a814285"; + sha512.doc = "6da7783c7a0dcfee168ec4ad6924fca636ccb5fc965e326d9c38ff31c9d2c7942a820165232e4e89b7c1e4857e81952156198de55d7990ba01e5abcd4c31bfcf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6.0"; +}; +handoutwithnotes = { + revision = 62140; + shortdesc = "Create Handouts with notes from your LaTeX beamer presentation"; + stripPrefix = 0; + sha512.run = "cac79ba06d60e99e151b272f28d6a8a04f1f766f406801c6f4fb24f4b4c74cc59d78fc6961624b1f77405bab6687ad896826426d8bad30b3b210e7ad5be035af"; + sha512.doc = "f4f604fd888f5e072d8c002fcd72edb726d3f5512b5fd511446f3fa1295f5a6608510dabdfc6a162d648a3e020489d1e1ecaccb7e563f54e8ec156df51be6dd8"; + sha512.source = "b41429450b42e341df413bc1d7e4266836370617ee94fe685710ce66c7b559b0ed44e3ecf95963fd84595845eef57b695982b9ce300f214901bd967a06f09269"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +hands = { + revision = 13293; + shortdesc = "Pointing hand font"; + stripPrefix = 0; + sha512.run = "77c1742d045110ee4da7473b14c1804fcfab3772ae10223848fee99c7c8a8fb3809aabeb82e4c99460f3cfa0e009ee8d470d60e8be4c79c25c3ff990b7d1595a"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +hang = { + revision = 43280; + shortdesc = "Environments for hanging paragraphs and list items"; + stripPrefix = 0; + sha512.run = "4a8227707b6878ab010b595296dbc96f0b31489dfc0abf0116e00d6b0acf54e91bad1ec182169357e4a2e1f14ee27afcaa23bd35db1fed7e4e972e66eebee042"; + sha512.doc = "bb0af0db38793e12dbd8d33e2df613d581a1809e0661138a3e75cabac1aee2aca942aaa429678a817f487fda82f3ffa3a631d98c3129853ba6a5ce4175346b09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +hanging = { + revision = 15878; + shortdesc = "Hanging paragraphs"; + stripPrefix = 0; + sha512.run = "54bd2269c169bfe2a28513354407de22948658e8067cebafa3a3b3d88040acc318f3f3aa375798e36bafacecfa10c4ab5500095b92328e6cbfc12a541a8a7b3e"; + sha512.doc = "a1e7e9d0d5b85e43ebd7ad88b39d6d5629807f668040041fd1248239c02394cf3c51aa676065c1d1d9e9ba8d1ad20f00e46d25025ddc0db7ec15148280a5b9c0"; + sha512.source = "d982182e5c6c19d6dfaf527f5ff95c0a1d15cfa3078205c73d9ac894d24ebeea31a636d66356387996fc0faf9815242661c884dd566c0dd1d90779d61ba93c28"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2b"; +}; +hanoi = { + revision = 25019; + shortdesc = "Tower of Hanoi in TeX"; + stripPrefix = 0; + sha512.run = "efc8c4892ea4cc8ae395907fc428fe74d535d689a68b3b21422c5c944d4defd57747e519dbca9bd2df2dd010b99e3132afceadee36d547fc11b04480147626c4"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "20120101"; +}; +hanzibox = { + revision = 63062; + shortdesc = "Boxed Chinese characters with Pinyin above and translation below"; + stripPrefix = 0; + sha512.run = "125406446426da598ff92398a7d0de5ea26e866d4f9248269191d113f50e8a613075e3e3d3f9d625ad3e9e0b1c5ca978a0420c2de9f31f12958d5adf7e2cbdeb"; + sha512.doc = "87ef15dc7f3920e11d0cc678f56365ba9dde31210e0add0d80763c1d271baae5b7e905f72f2081f5712c286edacc6943e38df4eb112c7ba17c125edb4d0582d5"; + sha512.source = "d3d557b65df0809561c99431377585a119994d516dc9e30f0011e423abba27eaa545af6a76a0eea7269d1e2ef57a77c316f7aca5b0f9134b709635f87df14e38"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.0"; +}; +happy4th = { + revision = 25020; + shortdesc = "A firework display in obfuscated TeX"; + stripPrefix = 0; + sha512.run = "45492a6becc7496ec6ca6adca474aa141b9c68b06aeed46bb1459f15b6cd1df9e4e2de3842a91ae0121d83269c1fe4f772418a93da67031bd14b6649f3a80657"; + sha512.doc = "78fe311673e370b867ad209fc1c62acd7aeb515e4b145bb7c487d30c121715994803e6dd540bcbf1b9b0776014327c7ca2f6c03437d9ff0b40f477ebff9cf254"; + license = [ "publicDomain" ]; + version = "20120102"; +}; +har2nat = { + revision = 54080; + shortdesc = "Replace the harvard package with natbib"; + stripPrefix = 0; + sha512.run = "b88cc102c09fc86a762da6c16802241af705a0a7da8707d072f051dea7b5836af9bd5cd46e7c80922877dfa389aace6b7713b10c4f1da75cd0d03c7bb3e68745"; + sha512.doc = "de971a2f65481fda590a1ecb254663778a9260e65d26efdd67c739f02099baddd4937edd1bdadbce5020fbd9ad227cd525ad524dc4ea5fc1e563369313f5ae22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +haranoaji = { + revision = 68501; + shortdesc = "Harano Aji Fonts"; + postactionScript = "tlpkg/tlpostcode/haranoaji-tlpost.pl"; + sha512.run = "2ff313007fb9b93503ed6d703c976f639d878ccc706060e0a26ab8a21ffe1d4669aca9df9fb001c886a1b1f7a0e140403253aaa5ef76a6e91d327c504fc251f3"; + sha512.doc = "1c294bbfbbcc6abbbcb0cdf6ea29335d2b1b039545c1dccfe60e8ae4f1883d2564a5924bec22b0dc817e4eef0009108df348d7af788afee1dba4f1b7f1ae30d0"; + hasRunfiles = true; + hasTlpkg = true; + license = [ "ofl" ]; + version = "20231009"; +}; +haranoaji-extra = { + revision = 68500; + shortdesc = "Harano Aji Fonts"; + stripPrefix = 0; + sha512.run = "79b1d71d80bc73681f1d1d48679c2f4586834d7dcaebceadfcc17ba49fd6c41849cae77a88ae4e45f7b2f535352a27aeb91089cdfd5a75b0af88024988617422"; + sha512.doc = "3331b5113f2f8634ddbf4e280aa7e7b8f82a2ecb494b29d2a1587ab338130340084b1f70402e70fe2c0039ce57a4665030581323c703ed504caebac823a712a1"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "20231009"; +}; +hardwrap = { + revision = 21396; + shortdesc = "Hard wrap text to a certain character length"; + stripPrefix = 0; + sha512.run = "eeb0f1da2161dae80d292db7b3289a307d892b8967ecf16021b8ed73c5fe724d914dda356bb8fbb48786760698e0060b39349b51886e13289524ed9d45463106"; + sha512.doc = "6dbb83fc5d4b82d11bc8d97d0ded3bcfe583c2b21ec2a260000b6bfb0bdea9c10df834735ffdcddfa9785b7c86b53920a20146d020b0435b8dc04610f05b9b16"; + sha512.source = "9a40a2a441e9f47b3d681dcd064fad48fe90999b34b57c85b7112e518c99d3b87a9bfc3867beb66e76499bb53ff3c14837f71f2d261ed4c78cad447f185d0ce5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +harmony = { + revision = 15878; + shortdesc = "Typeset harmony symbols, etc., for musicology"; + stripPrefix = 0; + sha512.run = "25e84addf5ac4c67985e1e433f795f377accfdd4dc56eae0ffb25ddffeb52e0a44278ce1a936406105ff5b7e9541452a103e0bb4ed91b8949facee75ca7c11ae"; + sha512.doc = "3226831df9702b669ba4c269549927563ae321e8e10e0e41c6bd1a8d6522dcdaa4ae6a25a907a84cc1dc324c516a53754c81a0e1296fd8e3afbbb29f0992ead9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +harnon-cv = { + revision = 26543; + shortdesc = "A CV document class with a vertical timeline for experience"; + stripPrefix = 0; + sha512.run = "5acef7bfd07f896f4251fe922cb96f71e9f289205eebfa83dd6aadd241f20eec5d9ecaa3d70d6df3dd61fbe7523f568407d89b7c32c27aa719a6f97b89f4cd33"; + sha512.doc = "1a8d96a152f9ac90f3a6e546c03652ebcde8f8d88a7282626d44177854aa41ec1c66eb6f4d787853711b80935f5e3e3c31d726d0e49d60841119db7ae278de96"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +harpoon = { + revision = 21327; + shortdesc = "Extra harpoons, using the graphics package"; + stripPrefix = 0; + sha512.run = "1894f54ff9eb98975f4eec9250a382534a0ede5312b4b540223d298a0fe5d7d8d24abe2018d07b30773e14bacdd97b60039a458fd274bb446aeb2e26b91bf96f"; + sha512.doc = "4d69050cd2a7c57219a7c55e8d97656fe6f130936d2e79a00d3760e9139799cbb98db2f338586b65412402069b22971ac73e5b722a3911bf1402625dac3e7d52"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +harvard = { + revision = 15878; + shortdesc = "Harvard citation package for use with LaTeX 2e"; + stripPrefix = 0; + sha512.run = "64781bb5c419248934f259dafba2c43270396a1d3f49bb9a79050ebbb5655a5836a07fd69720f54f009501c5294a62f344f6b6c76adb89114a8c60d1e149e612"; + sha512.doc = "291c2a530da6d24ecf1a87818d27b6141e99944eed10cc2dced2537f30ecfc12580c2f58d01245ef53f7d2b803853ce9bf72c03f8a2c3267dde0f4c799a991bc"; + sha512.source = "58720acea1588f742d95d2916f8b1a5c8cba391243a433ae9b2cc4845dd3949c7b2a7a349b87fd663023e4d26b15b15dfb89b7f8db92e14e52f2f7ab835a160a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.5"; +}; +harveyballs = { + revision = 32003; + shortdesc = "Create Harvey Balls using TikZ"; + stripPrefix = 0; + sha512.run = "c282249d5758f6c8aa9dfd06cc4671211e76adc2e7c4f5cf925e713472e60f3d44c8a389c9ab4db5b8096336d46d99b62bde0f8c1f9fb5d22857e3cba98994e0"; + sha512.doc = "89ede2f13e82600a2e78047a08766e99879ef5c64dcbcf747a2c21b1a395f4c1a1184921a8a0064b15b86f574834f602870f6641f0f265f92dce506959c6c4e7"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1"; +}; +harvmac = { + revision = 15878; + shortdesc = "Macros for scientific articles"; + stripPrefix = 0; + sha512.run = "7acf7eb52104bab80b0b9995cf43cac842c106b8aecdff8245b0d1ce8440823e65ead75e470f00923764eadd32e936e02192ec7bbe70295ca254aa57f9b5f662"; + sha512.doc = "a0f3308b938ae73c66398c5a3140662240603248cd6fe338a22f3ca6b23f28789dbccee48dcd94a8bf84de029ec103aa35c5b9a78151ceaf61a9cb60b832c484"; + hasRunfiles = true; + license = [ "free" ]; +}; +hatching = { + revision = 23818; + shortdesc = "MetaPost macros for hatching interior of closed paths"; + stripPrefix = 0; + sha512.run = "71983591270b533a6824a836948fdd15d19c3f966c8277d8948b13c5f38b29c29c0b7fe577661f1ecc570dd71d89fa964afd254d50556b6893667cda95e21aa7"; + sha512.doc = "02c2eb4991aa9775feec0846eaad9ddb74123a64eba8a3731c8e40c689844e542793e0f6884df8666f3cec2ed43af26b2d25254cd0536920c6ff0b107f35bf5b"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.11"; +}; +hausarbeit-jura = { + revision = 56070; + shortdesc = "Class for writing \"juristische Hausarbeiten\" at German Universities"; + stripPrefix = 0; + sha512.run = "bfee6719ea75ee672a39234d9416a0415a11658c45f4e5958bb12fa67ea416f9da83d2583e7007e3dad860a18d207c42e3e0fbaa3f09afd0b3825c170d00c63a"; + sha512.doc = "76898cfd9d4bd0f34632092ac7c1d913f4d460beb9b9fd3d98c249156c406b81fe42a4bed754fde79c497f9e674f50c698de598c9bb675270e7ada1c0002bba4"; + sha512.source = "3346edf31e0f7545c1c53fbe88fd12a902ef673cf5dff0858caec415e1b30e3c26a2bad613a947f5897b6867ac5730deff8c7cf24f51d9078ed0494104bf5a1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +havannah = { + revision = 36348; + shortdesc = "Diagrams of board positions in the games of Havannah and Hex"; + stripPrefix = 0; + sha512.run = "f19498f0f9a7ce349fab4291fef80ff2f2f9eb88c60edeb76174918955fab51f22a0d06b533112e594c0f4cfba23feab58c41fe75e1c4fa2fc4db7cd9f473d0e"; + sha512.doc = "ee1a90d491debac3f22f470e5df79e11152d153cef97e8d2e38c5d8a60a1931384d65bb91a6d459e6aeba39741763fa67d589bf9004efc5059699ec621b99e43"; + sha512.source = "9831ea87fbe6e12af8c7fb49d321049316221f4dd33b79a9495c5205b60ddf2f3593c8dfe2f4157e3934f21e69e3004b05802a0d592ae608b2de69cceb2f0c7c"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +hc = { + revision = 15878; + shortdesc = "Replacement for the LaTeX classes"; + stripPrefix = 0; + sha512.run = "17c7037eb04c1d0064dbb637f51947243d1b8f07d46245dfb8f2a38a1ea068ebe41da7e2346ccedf02979003a0a2fa0fbd25eaebf7847b266e21b7c873b032d4"; + sha512.doc = "18aaf579ef82a11ea1e752524d9a04a4a0aa5d6cbb496bde380664723dd30cd421c77dfba1ee6bd88def576c76e202b328198fa6dfb4a9ab451875c3753a515b"; + sha512.source = "42d3f57fb2c38823875116a67e3e71a3b1aeccdfa00c7a201163325c31fbd47d60a1dd028c6d9102d38d6490424bb118178c7589a433a69ec26e505b805418f8"; + hasRunfiles = true; + license = [ "free" ]; +}; +he-she = { + revision = 41359; + shortdesc = "Alternating pronouns to aid gender-neutral writing"; + stripPrefix = 0; + sha512.run = "726954216d3f8328eb7868553875651c2dbc3f626a9eb60fddd770b0e236a4e09a45872020589d8f263cb9f39300d1743e0a35676947752f33933db1e766411d"; + sha512.doc = "580702222de769b066b01af45aad75717d11f46178a2b1f19e0bdc85b67497d9aed8b7ad642f76b8b85c5513f4921f58af8bcb80d1fcb88307f8ca8b07c8307b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +hebrew-fonts = { + revision = 68038; + shortdesc = "Input encodings, font encodings and font definition files for Hebrew"; + stripPrefix = 0; + sha512.run = "5c27626c22275c42c25737d35af3c39a98a921037f6b9165a3222e168dd2c679e75e6854f88713681bdaa8eb8961bf58cff3b34c207bd1775ffea474b3524ffd"; + sha512.doc = "bc7f81a0f09b544bee91bd387504f5a764e7a6df207f3255f5ba25b1fe654532b14e2c7ea9d1d2804db875b05e210b11058eecf7c15fd1fa7a7b516e2bb20207"; + sha512.source = "21203d9e15eb6d3533c7a50c5fadf2cae403dbda8316a57d2a7e834ccbbcedd483f11fdbe12d1ab72ef9039e195f31e57eee1e0df8548da052bb030576557eb2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +hecthese = { + revision = 68584; + shortdesc = "A class for dissertations and theses at HEC Montreal"; + stripPrefix = 0; + sha512.run = "ca64dc8ca2265ea038ac3c2250c4ead4aedcfda74ee28077db2b9f4019f2ea304ed02e7349ad0a191012d2c903a1ed21b879459c048b29827ea3478115c935b0"; + sha512.doc = "28e1e4940bad5a6f76160f42adbf3f5f793cc9a7cd869dfee2389229335c09036044d79d3e14f179d5e8bf32304c04fd23ff997a116338c4a3500906fa6bd1c0"; + sha512.source = "348f79081082f3b1c6362b2bc7a59b7d55947955a482bc5f323119ce3a47158ac07f44c2a95aaeaa3a3c9f2d99f322f3a163b90bc7522d613d55311973639ee4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +helmholtz-ellis-ji-notation = { + revision = 55213; + shortdesc = "Beautiful in-line microtonal just intonation accidentals"; + stripPrefix = 0; + sha512.run = "2c91c08df5e97f9f7ee17f40408d8810cfc3099b5e125b5445a89d2f0d35849f32be0d4150bf7b9f812d5c9c0994c714430fd8d015b9d4ab3bf9879deff5bb43"; + sha512.doc = "20c9b9fce33ec63cd635751acec1d25fb8c5cb4171ea06f3313c839ea400943926550098cc520c4d5fced46c61756977c6294e435821330715ab82cb894222cf"; + sha512.source = "bddeab10a607bf0cd194f9725ffe66e103605c5910abd6fce216c579ba2722afbec724f8717b52b2ad6fdc8f472553519e000d7df41c5a26a157e8eedb41fee4"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.1"; +}; +helvetic = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map uhv.map" + ]; + sha512.run = "243904e50c3458e62bf346f5a48332709db226e54b17c731ed0bdac5fce04d76b19411a12b01b51ca93b5ff7f06eee38f78a8375f6244d7b7d53116713d601b8"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +hep = { + revision = 15878; + shortdesc = "A \"convenience wrapper\" for High Energy Physics packages"; + stripPrefix = 0; + sha512.run = "9cd27826b7dde1ebd5830cdd17423f4092c9833c962be7e73b515de2e624a7853badde0c244dc26be6b7d3d9f9c3932fffc48bb4e86e06b90d6699dcebb0d497"; + sha512.doc = "1d77a9bd31e982a8ff908f772d8cf67692145624bf00db2745afaf1aa59fc1da7cae6d2e094379077a550e4d76338a5a82bef8e25c8d733547751a24c84035f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +hep-acronym = { + revision = 67632; + shortdesc = "An acronym extension for glossaries"; + stripPrefix = 0; + sha512.run = "3eeaf8ba9215868df3ad2d8eee5ed17aee0f91c5404b8c93a7ab378ff6d928660853f8dbbab4cc52421f0d902936983a8cb34badd675453d2fc30344de19fb1c"; + sha512.doc = "a17c6f61a44253d6f9db070392b146f0fa297c080f04577f30e190a2742e344c22b3d70a58d3609eea6d981e843bded2a1a01b3fda356c822b1f60ef7ed05271"; + sha512.source = "83b2899d05ac7f8b2e1525e76327303a135860a358c08dcfc6f9d1c66e79c1d743f77a625b225c477a39c07a091d282ea2869fa9f5189ae4e3007e7e792fefb3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-bibliography = { + revision = 67632; + shortdesc = "An acronym extension for glossaries"; + stripPrefix = 0; + sha512.run = "8fa9f0a0f19f7dcadc88e727c461af05f3c0723d2eef1c4c7cc91fa0b507a6cc20f0414c82f7bc3ef12932ea54e8fd9c7c402fb2041032e23ee14c6dafc3a467"; + sha512.doc = "388fed1b3b5b9de09ae4b1cb73de2f618f99293e1b3a4cba5ffaa2d5ae611e454688bea2ce01780ad844380e2de56e62c38013677bbc3a9194d0831de4cc97bc"; + sha512.source = "5e82014ec9abfc9ff19d01c929d7475f6bbc38d0e77b9888f884862f17c1332a868153315af6d13c023e8f94b3d8b567e73d610ebc17c2df799692c603d5b509"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-float = { + revision = 67632; + shortdesc = "Convenience package for float placement"; + stripPrefix = 0; + sha512.run = "ccfbce04c651a478a811b2148141090fffbdb3851a05b9d3fa7683943fde9e6579eb75693c4b2834741b6cf02a5b381d1f80bcec5d44783e71605e445840145a"; + sha512.doc = "11c922d42d6793dffab0cf82f228f554510dc089956030c9c5e76b0a17e4d96ce2ae4d95533f0f704be1d4054f35884901a61ec851fa73f68b06c87b93f18821"; + sha512.source = "c896cd60a4b8b4bf2bd46425dc615a55132fda57b42ad536807bba8cfafb65feef34cdacd4efc2b90de2b30bd859d6695b4f670d5f507786c48d19b8d0dea842"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-font = { + revision = 67632; + shortdesc = "Latin modern extended by computer modern"; + stripPrefix = 0; + sha512.run = "a70b15ded3774985b31a78ae5d05572922133d3fb59abcb482677ccefb6767726b902b62007e9d0e14950ca9e9f133c8677d6c2d352e0f529a3909b5f6da867a"; + sha512.doc = "97a4c20933260eb24a935ed7a780a6e0a49f8b305872a33de5fe6df439ead0e555b909b04bd559016451bbf5cdc3494a3854d257b1804bc022a8925166103877"; + sha512.source = "d85c106c458ebb002830f7f0cae13996f203bbc3377c66bc2776b7c501e6c2bea26530955b250eb5dd96fe4b6a18af18c9b616ca49096b9133d0041782e2ebbd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-graphic = { + revision = 67641; + shortdesc = "Extensions for graphics, plots and feynman graphs in high energy physics"; + stripPrefix = 0; + sha512.run = "59dc1363cdcbe8376b5d5de1a2220c9d70c7022d1d943f657ff226a9ec1bafc302b30255983c090656d293c0995095dc325e1cafed113ff43ea74d2a85add741"; + sha512.doc = "9398029fe703f385decf3ed9295cf64501a9ad7efc3c50bddf1ac261e780dbe5a4ad9fe5f1871c2a8f081909741ec11a93b2b399b89c841cb9b661d812f326b2"; + sha512.source = "fcd58e2b778eb16b6b0cc9d36d44f233b9f2e40a243dc8792f37b8159c4ec3b9500df418465ee2c809bffb24d919d8295dc83b661553ab413390b0b5cf32b9c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-math = { + revision = 67632; + shortdesc = "Extended math macros"; + stripPrefix = 0; + sha512.run = "4446d255ec62b12b2eec1958696c10f4d55d83e3ccf30590f40d146d1305db3a351894c73d03baf6327834d0cee4592491c0a3a57bcfa7f95af0e172fef3148d"; + sha512.doc = "5110d1cd03ca6b925ba6872932cb53c99068399a5329d7368189229103e13f79296bf6b97b2097ab800823eae6dd14ac408fe404d309c37b1e6e9a20c6543ba5"; + sha512.source = "d853885d8f6910843558fa4854b51719e3d4917a324096e5dc38cbd7b701e8e250dea3a86fb803637268f36858760c2ac82ee147cd982df0b1516b93cd92150a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-math-font = { + revision = 67632; + shortdesc = "Extended Greek and sans-serif math"; + stripPrefix = 0; + sha512.run = "0bf2ac1f414216568cfe4247f1c1c9187fbc8133831ebe7a55b2c2d3d30555db36b0c0c1edc2e8bdb799a34b20650990d26c1cc838c5a3a31c55bd9160ab1efb"; + sha512.doc = "eac39c9916a87efd036b9f680ee9b774584845d1a3451b192857d5db72cafb1eae5ce580f1225fc6afdffe80e136f69ed2447f87986cdd3afb34adc9f9d9a49a"; + sha512.source = "ff88e396d084bd47256015530ed0d9b6a2f29f67a0a88db018fa6c1efe5d949449a8ecb339e4ad438ebaec4f57792b8cd83496ccab23ca64e383e28ac3929cba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-paper = { + revision = 67632; + shortdesc = "Publications in High Energy Physics"; + stripPrefix = 0; + sha512.run = "2cb6988dccd76f121a7aa39de3246559caedc0cc697a25382f7edf6cab36af32b03db915898f6073b31cd459e8dabb3da3acd387bd0c027e44d40af917613c76"; + sha512.doc = "dcb2f4aff93c609edae00fa44c285cc6f5d5bed76026c8d5f3f722deee19dc197a28dad7372f2b44466036d6e8aa0e576457e07f953d36953219175224fc6818"; + sha512.source = "ca7865f2f8ce574fec8d7b3a9faf77ae3899d75a2c2bc7200b8d355b89149cd88e0fbba66d5060f5b5cb567aa6a355d5ba45d34863f7fbd5749b4073e6114437"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +hep-reference = { + revision = 67632; + shortdesc = "Adjustments for publications in High Energy Physics"; + stripPrefix = 0; + sha512.run = "9cc4b4b63f41b28fa95fa6a81e47b5028c8ed0bdd03670c6d239bbcc09922265dc69b443ab2b1a4032cbf966a5202ff6e8b1a8c61afc2072e6628d11e071391e"; + sha512.doc = "588d2c5a2990b44d64598cf698cc1d6e04e92991e5319167e412692d62ee54de5c6053e4e10ce719f470ed08c028d03f9dd301afb65be4f5370742fe621a80b3"; + sha512.source = "84ca10f669a9541f7c51609b72d2caee0bee956489b4b9efeacd356548ea573457bc5cfed865b3806b1175d0d6b3b47793283589eda435b065668395a01a255a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-text = { + revision = 67632; + shortdesc = "List and text extensions"; + stripPrefix = 0; + sha512.run = "bbbf90b0e85a9b962267f42a2ced125448f8aa85bb93e347214164167a151e663f647b754e4b55faf42041ede7b6e90b6a073290056e00814ed25bf554eb20b7"; + sha512.doc = "5c914c5b3bbda70d93fb340b863c656d67a480eb3f59c51f05fda65396d408ecc26229992bf4a0161fbbfe0801e8807381ffe7fa3a502ca68b56f5a3afc88caa"; + sha512.source = "0052e0357e20251faab93ac645cec196a504881db615869e18073124671005a5c942e791705f2460f55bbc8bf4aa4906b74ff6cacc7174c59aaec6106afb5291"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hep-title = { + revision = 67632; + shortdesc = "Extensions for the title page"; + stripPrefix = 0; + sha512.run = "6da28ecfebbb06469fc666978d8674e81b60ce019e0f9a730bafab928d95af4d92bb8783275bc261a43cc61efcb14cfdd4973fa9f52b92f33d70890983d89e53"; + sha512.doc = "3841dc3378d6f8fff0783815f68d75581dc5623961799a034410de2e37224fbf0b1d9ea6b0b65b9b5c339cad565520960d51f7077f7c785807e9afb5acf83d3c"; + sha512.source = "40f64530f2328fafe8163d4bf0ce2eaa7ff34f3d1661dda967bf14593af9270e33c8e3eaadd79b7d9b70e065a8876afddeaba059c64a7b0759f1cffe3bf565b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hepnames = { + revision = 35722; + shortdesc = "Pre-defined high energy particle names"; + stripPrefix = 0; + sha512.run = "ec893de8b4cedd1b18dd16c3237fa79b434e91cbab4b856c4fbe11afef162b560bda18c0fd75ab2c47b863cdcca1d64809a139d51f04e9c2f45eab6ba4036c28"; + sha512.doc = "36a0966b755b6bb0f0dd27c80235e66af7c5252df1ae27652e59fd65fc5f280eb487666eef04206813438204dc592c0295651ccf0bce1e5f85f4797cdb439850"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +hepparticles = { + revision = 35723; + shortdesc = "Macros for typesetting high energy physics particle names"; + stripPrefix = 0; + sha512.run = "fb9229745b601b6f731c959856fe46d6871dd3a1c7fec2bac8116f4d74a575ff52523f610599979e25e7147b4ae6d36906d19ba66260356f15bc1a47a2d57460"; + sha512.doc = "539025b2f0998bf031f417d002028e29edc58c1818d0dc9c07ee58c6877b5709936be23985ecd5a518c36187f451a2d5df66b5832d0019ff8b755c763b903aa8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +hepthesis = { + revision = 46054; + shortdesc = "A class for academic reports, especially PhD theses"; + stripPrefix = 0; + sha512.run = "ea6543fec07480af8db52e43ea5fda346ed4e9ea245af0810a6988d864675a903841849e502506b333cef0b1685a6946ebf1f686bbc74f4ddcc7eea676c019ed"; + sha512.doc = "e456a0ca03da4bf71d767616a140b6e1d922e05944a4db2c0cbb360dff39fc7e8bae741ae5adb49972253f38774f1a9c65393bcf4e38e3c568b0215a04f63d48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.2"; +}; +hepunits = { + revision = 54758; + shortdesc = "A set of units useful in high energy physics applications"; + stripPrefix = 0; + sha512.run = "eae3b071eb3c81e79f166a925f5a3b16ffa3e992073f318b8a193a8188bff5b5222cef7533e398f1481671e17849123947577c13a182f40136124fe6368547ff"; + sha512.doc = "86f0080a818aae8743f9c2ef20a3c87f2f23e29641037e91a89e3f195f55fb6653c1ebf1e990b1a984f2acad26243bc07afda6cb2b00d58e5f2416a0f8fddc04"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.0"; +}; +here = { + revision = 16135; + shortdesc = "Emulation of obsolete package for \"here\" floats"; + stripPrefix = 0; + sha512.run = "35c9ac325579de5d3bac4b8d16b1f30355398037cd0ad1c52b1585eb7ec666e743680eb05bec7b1f8cfa3bba3d7f5c0e6e06cddde6ca879ea708388df140eef0"; + sha512.doc = "482a2ef8edbe41ce76e2c32bb579b132c84306cbd5387cb5249b10a02826e610229ec9c75a1df53b5b930bb982e1157ad9ffa63a77f84461cb6cc6332f6d6e54"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +hereapplies = { + revision = 68638; + shortdesc = "A LaTeX package for referencing groups of pages that share something in common"; + stripPrefix = 0; + sha512.run = "b796f6f276bd9cdea0f469482c96aa42956417c544647df201a8dfecfc5041b726a1ea1084a51b392b6f71b3172961689cce0cc7be63c146ba7edc3dc8bcac35"; + sha512.doc = "185798c65981f2d09b5c49ac3bfcca8763ca929399a9f534316ee8345f5550a437be10dd39bc886febc5d9de4156c0642c125ca2a033d129479c9cf98bc885c6"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.0.2"; +}; +heria = { + revision = 69058; + shortdesc = "A LaTeX class for Horizon Europe RIA and IA grant proposals"; + stripPrefix = 0; + sha512.run = "2ddbf4e07a47f72b402087046e4778d7d655af7243465bb7ca4ec10c3c15b72c49d8c6343e4ece780ac4aa1e2007e3fff4f8eb395673952d8050e7b6803b275c"; + sha512.doc = "08e4a34df324d61089a7632b2b8d2b41ff4df47fe633803c1c246525b86ec25ec40f6b56182432488a3cf4d1d90b36038773104d2c78a809b12d04f7a9a23bfe"; + sha512.source = "307a67c4095b52687fd978da3a1aa90b4cfb484d5f00876c86bad6c7103d926cda269ea081781b08a4b3cc2990e6570f60590b2b431f6a3f9c4d5c58d43016fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2.1.0"; +}; +heros-otf = { + revision = 64695; + shortdesc = "Using the OpenType fonts TeX Gyre Heros>"; + stripPrefix = 0; + sha512.run = "370ee21398ddc2f3bf285a7c6c545e998a192d4dbb5790a7d2a9b6835d9076871a349001901764761fbdcac0e29d5c0fae8800dab4a34918998b54b7a83275af"; + sha512.doc = "fb99aa73c128cfb184a097b0d9a32a007ffd9e135d74b543cd23689bf5284176642c1f7a635b1a24ee167b5ee44daec090f7f78dfe9636fbe88351aef125d8ec"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +hershey-mp = { + revision = 64878; + shortdesc = "MetaPost support for the Hershey font file format"; + stripPrefix = 0; + sha512.run = "8759bfc2237fc1954e3ea3a47355cd42c48479ce01d959cf0b072ffba4f26068e99f32737bf8669a509f53085b8d8e5c5b0b02f9a7fa6ba73a38bc996539d902"; + sha512.doc = "d869c70b0919380ae4d88d9cded20baf9a8cce0946550d1a3b80056f80bcf2eaa7fbffbe16a3101c2a04fda512ff1b9160786c05c279a78732e1909782cb2b23"; + hasRunfiles = true; + license = [ "free" ]; + version = "2022-1.0"; +}; +heuristica = { + revision = 69649; + shortdesc = "Fonts extending Utopia, with LaTeX support files"; + stripPrefix = 0; + fontMaps = [ + "Map Heuristica.map" + ]; + sha512.run = "de0cae8f801f690e2d07ef7b63ad4c91d91ddafb8c3044441acb9d6a8e943f1c1667e17c0d2d9e4677b3a1a562b072747bebeeb01ded4bbd713b4e6103221a4f"; + sha512.doc = "406d07cc807454c429e644b7572456b2d9f49d2f48093007c43cbd3087d108beec1806f810508a849bfced690c97141ab34a2daec7ec641c8bdc71cbb55a43cc"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.093"; +}; +hexboard = { + revision = 62102; + shortdesc = "For drawing Hex boards and games"; + stripPrefix = 0; + sha512.run = "e82683253d7790448bddbcefc617d0f0e91b5373de477f1c78a5db9256d632983b1d5f700a0c6fcb4490b746e932de3fe40a22875a6c0d37f6d0ae728867b73e"; + sha512.doc = "97c92b9c8644cf060da8b3306c8a3f26d1c59f36b1731ca4b6af06ec77211ab676963d5ed8fb70c6a63096a7224cfaac22cf77d5dc39f937902815bea778f323"; + sha512.source = "f2ab006e01d1ff8ed68252f594d3340441a5a6bed7cc0cbee6c28e119a923a20b186e1f08db7444c75de52c86afdb9aa86767278f0b506a9c601064783baef95"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.0"; +}; +hexgame = { + revision = 15878; + shortdesc = "Provide an environment to draw a hexgame-board"; + stripPrefix = 0; + sha512.run = "b16abb669f6bb5c3111e6c333353cc37a76431c49920a4cd22af79f6237f78a5c56124c5854b7665e9dcf963fb2715c488dd7ef4df86d5582aa7b3dbe3d08822"; + sha512.doc = "0fad11a5510dd1a2ceec227c46c3f8c0c387ab3e2819bd70765d363ca5f97822147bfac62e69de773a96d24a881394c35c1542a8f08a1828a82f94aaa7f02644"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +hf-tikz = { + revision = 34733; + shortdesc = "A simple way to highlight formulas and formula parts"; + stripPrefix = 0; + sha512.run = "47ca98b066829e6ea2009c4beb92db2c7671642c495f1011df9be00d546f3613b7853aba5db88e3805441eab66c873e15b60f5ef75cf21e906f80b5f11aa30a7"; + sha512.doc = "234a8ccdd9cd921368f700fdcca818d0c76265371ac89e09c1a54454fa3e00f0f28fdc7f962c227f9bb69d851585f2c65e20b4a4093aacc3ad0aa84d1abc7f87"; + sha512.source = "74fd110da2d0d248d70811db52f220012c0a41cecfaf702765cf8bdeae98d9e1a96c6087770de4fcc1ec249901ccc79837ed4e89b4527dd3f746ecf503c201ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +hfbright = { + revision = 29349; + shortdesc = "The hfbright fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap hfbright.map" + ]; + sha512.run = "91c8b007dd8ce71af9dbc98a66a82a395d68fc87a0abcf9518b5b89a98dc23b28f1b9b9aa551f82b920dc3e2d8b6500884eaa3bc98be48371a9774f9f283a641"; + sha512.doc = "7de24b513093d965fab1f8d7d13ec4b356e7f5495cb3a8f17204b1a786288488b4921df6b7e184262bdd3aa11fed6483a25d0bf8e898db05c8b1f7dff769c175"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hfoldsty = { + revision = 29349; + shortdesc = "Old style numerals with EC fonts"; + stripPrefix = 0; + sha512.run = "5ff36855df468bf59d387d56f4ea65c86ba304eb2495f2ca110558ef48c528ef444c7ebfaa378a454c311c806525ddaa639a32d3d1b16ca492b641f223133390"; + sha512.doc = "1f88ae3c13857be317ac2097093bb368a9f1ffa2a8fe1b5e15f59622dabdce2f2b3aededbca31a4d17f05c2dcb28f8ae0c9be3cfb1758bab4501a99efc68612c"; + sha512.source = "5ccd5708962e9ddeea3ac41426cac6469ae22914fc4bbb5779e25d592d1cfb0df78f73d79c969e00b68b38eb9ae7016cf394f9592c14d9400bba152e6fc91092"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.15"; +}; +hfutexam = { + revision = 68829; + shortdesc = "Exam class for Hefei University of Technology (China)"; + stripPrefix = 0; + sha512.run = "4ebc270b01ed4f0e9d1aa501cb16cc0594c209cb77423b3b83b43600cb1080fbbfa8ecd9d2512e460d7215260a3045f1f33f469762e8a7321ace472d69e0a43b"; + sha512.doc = "bc70bcca6f0dc432fe6fbf1c92ae8a364a93a8e94d65cbd22939ee2313bd5d82e2446e60b6dc0f8a4b88e49f5cb2b3fef9ea5502e5362860eff10a8123645c40"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +hfutthesis = { + revision = 64025; + shortdesc = "LaTeX Thesis Template for Hefei University of Technology"; + stripPrefix = 0; + sha512.run = "928dc93116a78a440fd1dcb163ccd5d88daa4b96a6850f5bb45c996c3c81249982588ffda7f51f4c76f153f3df6f85e033ce15d28593c4d6235f7781a829ddb6"; + sha512.doc = "491a841f563a79fbbc71d19bc9aa259ffc4429db53c86812724306432dcd7a5d3af98eb2ce1defd4f6af02fd5f4b34d4b5a96de540e95bd59fd7991ddd5dbc85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.4"; +}; +hhtensor = { + revision = 54080; + shortdesc = "Print vectors, matrices, and tensors"; + stripPrefix = 0; + sha512.run = "ce772bed045b85de5032e3b4beff52958e18513e2c9628e67505b75baa17befe4e3a5eb86f812305b87dbd15dd2f483df78ca7c5db54b64cf18abc75a2ae8f59"; + sha512.doc = "aca1224b327f448bbb3f598b350fd4e569960bac9d05b8674b4cde79c4a13b376dc2a932b8fbd315f63f9dbc930ea28599afc18340eb36d4a38d967c14b62152"; + sha512.source = "6cf27dcfc865514e9274053bace69bd71e6699a501195c553ab3386723b375714f14829e70163539443c4c63b2821be8357653f137943cf49f26e0569c0fb0fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.61"; +}; +hideanswer = { + revision = 63852; + shortdesc = "Generate documents with and without answers by toggling a switch"; + stripPrefix = 0; + sha512.run = "9124e631262dce82cea19158e34353817129e014ec5808dbfbe87df661127d516664de2a895622344dc663c68ca51731bb6d887a5043789e3d830fa908b82cdf"; + sha512.doc = "f9bad79f55157a0f9007c1f551592d0e054f2a519aeda36c175afa807a70542068cce1b9bffb31855de8e99e8460fa22f41f046be25c2bb4757ba859300b77b2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +highlightlatex = { + revision = 58392; + shortdesc = "Syntax highlighting for LaTeX"; + stripPrefix = 0; + sha512.run = "befd40ea2efc15015a76f97add004e33da86c628b3bf58277f8a9feff9396544acdc6603cae74e7bb88d2c819656edcbce9897e32f65156f39a0667c087a491d"; + sha512.doc = "20760262af6cfeccf512ab205fb874b3f1c9b3c15637ed6500bf5b627ba2f319963eee0f76aa480e1257b0cb31288829bfe324f05afde290c3433aa9a018c10d"; + hasRunfiles = true; + license = [ "mit" ]; +}; +highlightx = { + revision = 68756; + shortdesc = "Highlight formulas or paragraphs"; + stripPrefix = 0; + sha512.run = "64919a37471b4ed0520cfcf8685a67ba2f9f84a278b9dc7524a484876e95072906cc5a7d40bd8c751ea2d4ec65633e589274e0b729f43625b46f91928a50b3e3"; + sha512.doc = "ff1b00aacdf83fcc54021520bc447184ebf29498d2b5ea66b3c3266560066bc1b05d7f9edf61eee810100531c76db4c65814cb1d6c3051dd1e3d4911e41c145c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.5"; +}; +hindawi-latex-template = { + revision = 57757; + shortdesc = "A LaTeX template for authors of the Hindawi journals"; + stripPrefix = 0; + sha512.run = "1f6651a4aa033a7cff44caff62d01f3dc5dc280bd19d8a0541c78cd35116e9f765517a078f6f6f7a25f9ee42fc4e4e743b86a746e80583b491ac399d46e94ff1"; + sha512.doc = "459a131616a15431dd489aaa87a23533ae5eb58575f38757a81af8eba425bd4e5c0c0f3a11a3c030d04ecd7d29e9ab08b3f4e270961c4c8e8791c15a497ba7fe"; + license = [ "lppl13c" ]; + version = "1.0"; +}; +hindmadurai = { + revision = 57360; + shortdesc = "The HindMadurai font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map HindMadurai.map" + ]; + sha512.run = "24a585a4452895c901b41e64613d0bf3b2438c0bdded45b38ec6b61206cca96d5f0dc12ee5fb0073bcce95f208971e0838469e000108bb2d24567b2c239ba936"; + sha512.doc = "9cde302caf78d14cef5c191c6df0179991d07d8dcf40dd46941a966062d3df2ed5ccd21b6f5e5333bbab9245962cfed9ba75161c16bd8e0a914c231f9f420ef6"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.1"; +}; +histogr = { + revision = 15878; + shortdesc = "Draw histograms with the LaTeX picture environment"; + stripPrefix = 0; + sha512.run = "987c392828a4995afdb37b10194c7735a7dfe3375bcc6efda6592d3f35351c369c045a2c1464cd2653d6275913a335ce3d527afb44c51ee38d3038d4751eaadf"; + sha512.doc = "6cebdf9d6000ba48dd8106645e7a05709ced06c8790f8383a036629d8d53ca434f5c5aa0ff511754ea9e00fa743e435a304dacc16edf18098409972f763f9087"; + sha512.source = "f5e764adfe67c9e07261ff1211cc08ac9b4b076e67683dc50f9759e942f50810a72222a9669770b9f281b7f821d50a7da85014ad65461dcaf1117d54b98d89a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +historische-zeitschrift = { + revision = 42635; + shortdesc = "BibLaTeX style for the journal 'Historische Zeitschrift'"; + stripPrefix = 0; + sha512.run = "da501792653c77f7cdac978a348e1267d4abc2e80d8b5565b47fdab4a1e2204f9544bab972a291d191ce26bd29203ff28a6440e2f8969cf1b33a5cea48998b04"; + sha512.doc = "1b091b850e4936e8e6484ca484f740005c66458655a0cbe24938c3f33f23807fe9b7a0ab93b38f6a3481c684e35031398860d5452f6bc3fc8a8e6f4c2e82f927"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +hitec = { + revision = 15878; + shortdesc = "Class for documentation"; + stripPrefix = 0; + sha512.run = "d7ebe166a23c05a1b78552c102507e697c07b955cddc8f4061d22fc42fc414664d3a1bc1c08e0dd122a987c736d24d4935dd944b37f62fe260b3c811678a3b30"; + sha512.doc = "f166b529f29f0470770d5a24e0f3ea2be9021732fb5373611b87cda10ff2196d1d121258fda75369a2f0f9a65324f4a8dc0d3c5f377cf994c04807b18b5a46f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0beta"; +}; +hitex = { + revision = 66924; + shortdesc = "A TeX extension writing HINT output for on-screen reading"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "etex" + "everyshi" + "firstaid" + "hyphen-base" + "knuth-lib" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "hilatex"; + engine = "hitex"; + patterns = [ "language.dat" ]; + options = "-etex -ltx hilatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" ]; + } + { + name = "hitex"; + engine = "hitex"; + patterns = [ "language.def" ]; + options = "-etex -ltx hitex.ini"; + fmttriggers = [ "cm" "hyphen-base" "etex" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "b831998a078c61be41f376c73a63d2996ebbb128aa90dcc9f21e1e80d2e834d6628d150d9e98819defb4b38fcfd9e1ddd0239fd0ddea19d0086c7187d3d80a7b"; + sha512.doc = "f278d0d4a4b37e4489ba46ee3325a9af5bd7205359b55f30a3de10de36182c754974e0b7a0f506ac233280ee395bfdb5a8f7f5c3ee1cbcb0c30480338968e0f9"; + hasManpages = true; + hasRunfiles = true; + license = [ "x11" ]; +}; +hitex.binfiles = [ + "hilatex" + "hishrink" + "histretch" + "hitex" +]; +hithesis = { + revision = 64005; + shortdesc = "Harbin Institute of Technology Thesis Template"; + stripPrefix = 0; + sha512.run = "d4060e3b06d2a103f414402e83bf5f5277c2af784b00abc7c6c0468518b0bbeded50f08735573e4a170eedd46227957127e3c3d2ab44edebe7386a7893af432e"; + sha512.doc = "c5fe2912c4429fc14fb43aa7de9ef76e30b0354f8e673ab9ce693c75a85f5c6dbf77927d1dcd82c0c5aae4a84a665d37fdd505f1bb2dd0e1ade7e5dad3ba5ad1"; + sha512.source = "64515fa70127ba17b9a8d846c9670bc93f16db80db83945037a4ae8b505979202a16e0fc7187731ead320078b8d9277337b555c2b2a271e99677e0330940b9f9"; + hasRunfiles = true; + license = [ "lppl13a" ]; + version = "2.0.11"; +}; +hitreport = { + revision = 58357; + shortdesc = "Harbin Institute of Technology Report LaTeX Template"; + stripPrefix = 0; + sha512.run = "e91894f8589f029d9cfe58d743d495131c24f0f6d6705d52d34ef34e1cbde5ba6dfd8e256cdd09ad7fa3080c613c3feaeaa15d3ca6ddb51fb82ba0a4bc333b99"; + sha512.doc = "e7f0b2566042a8442d5fd5cf36e4eeaffdf093a682b8c640ae8b059016997148d17d9449fdfc6026ba169731e0a7e2bb60c525a4ace29e296fbf1a910e887e9f"; + sha512.source = "7abb2458fa0a46e21c4d7e88699a3768555e954b37d2406a11d26925f520cad6a02e22282367d6787c560d0cecd34a1ecb6e96335b3f22930a083db5aa50e649"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +hitszbeamer = { + revision = 54381; + shortdesc = "A beamer theme for Harbin Institute of Technology, ShenZhen"; + stripPrefix = 0; + sha512.run = "a90ea22943c228d15f659bc562d79b9e50b157451ee9d06b02cbcdf5a1ef4c1eb353c756e0963d113d6258c1799ab22f71a79905387c78638c01abeb3d936e00"; + sha512.doc = "84d8a9edf719b1af7ee9d8276d91bfb15306bc3a5632c5c0290412533a5c321c1087bb642104d47137007c9328a346f72c8ab87b9d5f8b94e3ca0b6d2fd18a70"; + sha512.source = "4e62661f3e51baede19234e9bea18065833ee07d1edb6efbd434d8cc194f04adb3ce48e74f93050a4e9fae1d4b77f5efd0346925b6ead46a344503b9af96a23b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +hitszthesis = { + revision = 61073; + shortdesc = "A dissertation template for Harbin Institute of Technology, ShenZhen"; + stripPrefix = 0; + sha512.run = "b7a3dbbed2d9520aa26fbf88e9fd5f864912dbf0ebdf052cf65fe888676b9d5ce9917d154bef8bed2c5cdbec6bba5ce57cd434bdf3d9ff8c41ca6fc12f07a8ce"; + sha512.doc = "577c2dace816b5356e3a2da21f8e95aa165e55b75f5df0524d5abe6649d6e1879b7a2e97d0da88890e37baa05becfbcd567b977d62c58f17e0f372234cf00b36"; + sha512.source = "cedf9d399434f48032d4bde2fb91088320b2bd8b939629ee71fa98e744e8de1dfe14b4a01787fc9eecaa7ce8931b322bc0fccd7d96c7eb5e24f2097362063fa5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2.1"; +}; +hletter = { + revision = 30002; + shortdesc = "Flexible letter typesetting with flexible page headings"; + stripPrefix = 0; + sha512.run = "bd79dec347980624c634918880718af9e434e24acaed206815e974c2db856e8f424e12b6870d920079626423f18a02fd326bdc387c256ae9c3a1dfa4ae26e71b"; + sha512.doc = "67a9a39cf0c8ac1054588ad542a8ba3705e94445920d4ca85b46423a4cea364c58e8d2b02b7d7579c9684653734f0766e8ddced28a7c5ec77e0daa3c3dee26b9"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "4.2"; +}; +hlist = { + revision = 44983; + shortdesc = "Horizontal and columned lists"; + stripPrefix = 0; + sha512.run = "9e2150f08a7fac07a0e2e36edcecbd5c16ab3c119d8532fbae9399f14c6c7567d2cf4e2a92eda9a650049a901a35b6a9a0dd3423a06da6a9d266a3859392334d"; + sha512.doc = "5b3748d7f67fb51dc0df2a03318e96ac9224abc42291ab475a907befa14fc210d9d2371005150404480900865e8ffa9f97e3ab122109bb5454c3b061f66a064d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +hmtrump = { + revision = 54512; + shortdesc = "Describe card games"; + stripPrefix = 0; + sha512.run = "34b2e61744e3f8cf180a61ca13788834466dad7bdf831e576829e0f6613c5e8a6330075e89516915728a5936a68c14288c79e0f050e5956964d69bab3784d9c6"; + sha512.doc = "36c1a35cb4efb4dc340a439a921252cbaf48d3f0b7fab0010a7fa22d8b03e7b5b644244410efa9fdc63b5fbf69eb9396cc048908d00210e650941a0647d3f4d3"; + hasRunfiles = true; + license = [ "cc-by-sa-40" "free" ]; + version = "1.2a"; +}; +hobby = { + revision = 68137; + shortdesc = "An implementation of Hobby's algorithm for PGF/TikZ"; + stripPrefix = 0; + sha512.run = "0caaaf772dc325e70594f909f1a58740224195aa7af7ef86571e7a97e1245cea5ad6a704415a3275719fadaf74ec55605e66af55dbbdff4c524f529e121035ad"; + sha512.doc = "3e418503ef48dd0be479f17171d8c6767c77da95d43a2f31a374cbb6ed47c5129e2baa64ca15128240856790ea92acd2b090364384c29954266d2b9ec6aed362"; + sha512.source = "5978e0c2f5c30145a9a5562661004a50cbb5054ea98907c25690bfd1c55f13190d74283ef79e7995d6f63d2d1516919062fe746b989227a4e95fe091ff5c9acd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +hobete = { + revision = 27036; + shortdesc = "Unofficial beamer theme for the University of Hohenheim"; + stripPrefix = 0; + sha512.run = "d2c79f5d39fbe82b43704a78add3a016768ff282d48ed1f49d1991c6ab56bef5266e8cfa7b3b03bcc944990d407ae43eca99930270ab84679f51323407b861a0"; + sha512.doc = "ef7b1bd487c496cb2ffc01fb2940a72ac69edb1a5516d19ce6a6e6cb197ba6f517e03ac673b2372cc9cd4f40e5c6ea2469c2712528a10a3f5ba09e9d3a46f209"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hobsub = { + revision = 52810; + shortdesc = "Construct package bundles"; + stripPrefix = 0; + sha512.run = "586189051038582c9303935c70bed67975f51472d28b533e4b72ef341d4d93ad8f313774a5c585baf4b72d607101941f01176892499c7ecc5cec3ede2e28a693"; + sha512.doc = "8cf2210285b162e52e2cbaf0d1a9e7027ca3aeb7da81ba238fff97a9cb10c7ba9058f5eb4f28303031a7774f457207ace1f30610cef2f733dd65b35d9ab6b1b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hologo = { + revision = 61719; + shortdesc = "A collection of logos with bookmark support"; + stripPrefix = 0; + sha512.run = "d4c5899f35a7405ff19ba810af17a86c25ba76cd01597dd19e074ec468052a95c85f8a80e1f0467f48f72280246c152bb24928a68fbbdb2cf6f0788cf94703b0"; + sha512.doc = "f92326ed2d0bb3ac455a54889b469f69563d4a91e80883bfcf0ce92fb55c0dd63423be8ec800696f8c078bede28929e8a79d43174e8cd1a802b4a6ac88cff178"; + sha512.source = "38d75dffe94c9af12005254231b3fb7fc8bf577993aec3ac3e132d14f304e400806627058a98f5ed1f8f9dd5f4ce6d8caef1214ab8d5dee31aa66f47126bf22a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.15"; +}; +homework = { + revision = 70050; + shortdesc = "A LaTeX class for writing your homework"; + stripPrefix = 0; + deps = [ + "einfart" + ]; + sha512.run = "df7e3907150a637b948ead1db86158058a096ca1df98789f012a6e2ad2aef2d4b84c17dbe0d11ef2a459f1fcf9708d5775bbdee25c4542eb3f5439b95c346c89"; + sha512.doc = "6dbf5889b71e0022f87c59008b884b49c7e882d99dc2e7dd39a2e04d8429a71064b71ea389279dcbe919b1d04da9dd3bb6a4998c066aa507ae64f96e95c1e94c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hook-pre-commit-pkg = { + revision = 41378; + shortdesc = "Pre-commit git hook for LaTeX package developpers"; + stripPrefix = 0; + sha512.run = "6fb3009d4bb4016f0d6e92571d52aaf7e3780d39a6b2ec73ffb37112b3f153ed71ecbcd985b81dd841f296a39da83e9004a2d6e6e85e9a49765e1682563cfde3"; + sha512.doc = "3873c4714a8a6d221f860a5d0606113c64482b363727067e0017d27e99d73f31cfdac88a799fb1412225baffaecd7bb03dbdc66b607a075b1e4539ffc0df2a9d"; + license = [ "gpl3Only" ]; + version = "1.1.2"; +}; +hopatch = { + revision = 65491; + shortdesc = "Load patches for packages"; + stripPrefix = 0; + sha512.run = "6c0f9549ce0321d9080cd0dfd3062eab47722bedac79293a14019c25edfdca7afd0cd6bd3b7be67a99a93ea0b347ac798a7b24909886d300e7085ca67d1a5c42"; + sha512.doc = "4fbf84371053bd67fb3d4b370bc335013cb62042cf9c13d2fc1c63a582a56885a93f73a44aff8986b4c657f7d172a1bd75cbde556633647a1abafb72746f9150"; + sha512.source = "bd32091e28973236d4de3255642677966c4c856da4d53ab811780536e3c564956ec8299d75f553790f2208ce2ccf9356fead39a5f501f53e91d108782bc3bcb2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +horoscop = { + revision = 56021; + shortdesc = "Generate astrological charts in LaTeX"; + stripPrefix = 0; + sha512.run = "d00c8ecbc9c76c2864a52a8bc9f802477e402a59c86789252bce1b8296735035b7b9cbb1c3a18baa76cd1d308d4af53d7d2f64ee9aa37a70e33bf27e1465207a"; + sha512.doc = "9bdd655263da0847bed65c71e423e301a35e69d7cceacd650c0e9d4be91800c0de5fa0d7aa917a6d5f5abcc585ed031e6ec84ef003bb813be41e3daa3ab95f82"; + sha512.source = "40627807a0ccda26d1ffd1e2340542644b9d38f5344e427bf33c2e6ef72acbe9de9b7c11366d5ad258361b217373c13a9c8fa88da7f8176af6c738440d054626"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.01"; +}; +hpsdiss = { + revision = 15878; + shortdesc = "A dissertation class"; + stripPrefix = 0; + sha512.run = "4905368d081cc6e7f2c7b43b28d4c6e22081796d8594e5a07e521bb7ab0fb14c9ccce1dcbe135b0cbc5a7b2671e3041d7764ff80c7e1543b4ac4cefe945794b4"; + sha512.doc = "566f0509feee0bc5c28481fb62f2c991827cd5855f9696fdda79628f5c43329b39dd508fe9613d2c0f823bef421a97393fd303d830c779c42ac67f88303a239b"; + sha512.source = "8337cbedc42502ececcfd60adf422e15aba32381c46489a82d8b618286a4d8848c0288136771b8acdbb03af9f39029e4be8e1c287f6dac9bd3ade3b727e8ec8e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +href-ul = { + revision = 69359; + shortdesc = "Underscored LaTeX hyperlinks"; + stripPrefix = 0; + deps = [ + "hyperref" + "ulem" + ]; + sha512.run = "e8e5d7767c93d0f30a7cadadfb2c7644078b590e46fa073db9251426f961dbec4abbd0dfcf6db6056f9a03342a01d706e19da027f64a01adcfa584a9b1becd2e"; + sha512.doc = "56babcea1003db2bc7456ccc77e004814d9dbb7711289e2a0af89548ef2e6b146f027ab7d0503628c7e61ba25691b1b2c7d5a24253e0fb08a30256cfde0c1e5a"; + sha512.source = "eb842f9a9b01a36dd033f2079f0f4508eacad634c89c33e6c2607e78c6016fa441cecffe82fdab65c27870af5b3eedd4e0af45a9db224cd7c60c43a24b1b0d93"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4.0"; +}; +hrefhide = { + revision = 66189; + shortdesc = "Suppress hyper links when printing"; + stripPrefix = 0; + sha512.run = "f62671bc667f8a0eccf2d63b06b55e5483a7f5d1f97e4a1f829c898fe947adf048c21cac10b659160d6ee51f0ad4a48a3998a1e820e387881b6df390ce9bbd0f"; + sha512.doc = "0ade5f947160493a66f8772d6980db65d0c52ef03b1c12cc2841ae40eeebaddb8b0af50a8c28b010cfe7689dd1bfaa136b80c419fe26ecad302699e754f372b0"; + sha512.source = "51373bd9570c5df5ff388e9174875db7144e5868a0da8d5d27a9f4c332dc37c97436d1ebedb60c18b47a1e6befa07e5703fb1d6d5d5f872d46f3bc3e2ef71b84"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +hrlatex = { + revision = 18020; + shortdesc = "LaTeX support for Croatian documents"; + stripPrefix = 0; + sha512.run = "14bd6fdf4a60ec599971b1f5ee7ae5fc649b0d1382f9dff8bf9905f4623f3964c2d552bbc4485680d22cf04651a5e49b71220ec2c05e6599356b6dcee6e4d122"; + sha512.doc = "ecd67675466d365f00e49b775ae3e5264e2d10d574dbbe913d52b3a5b553fe942e06fcca26cb2357fa76688c55fc4268bf7d18f5cb2a90663bfe47c11a5bbde7"; + sha512.source = "01f47918a1926f36840fd4d78debc70cbe09fd2a52b06ede7b40d7c3ce0d42e6385d54cd2cc96eed8bc222ebcbd2e7ab191c41f8c8df82f9b5ff93d2e0f54a16"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.23"; +}; +hu-berlin-bundle = { + revision = 67128; + shortdesc = "LaTeX classes for the Humboldt-Universitat zu Berlin"; + stripPrefix = 0; + sha512.run = "57b3122fb063e5f930e5d94aaa94dd00fccbe865570c345abbb6252c42d3f67ed7f2dd163d9474452142ada7691783b7b4e0aaa8a23fcf6320c4bbc581e5391d"; + sha512.doc = "91483639fbbe4b073eb299b0153eb57383dc59c7d669bfc07e275bf445b22f2eff35a7abd632388d701eb23eb833561d9ad4d865f3e8d7495bf44c74be8dd12e"; + sha512.source = "eaea8de8f9ff48ee7cc3d1d91819cfad340f9f8aa2b666bc23fd28489c585b4344a946cfca6334620acbefa2602f90050476c5da56552088b1c1ddd3c483af0f"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" "bsd3" ]; + version = "1.1.2"; +}; +huawei = { + revision = 69871; + shortdesc = "Template for Huawei documents"; + stripPrefix = 0; + deps = [ + "anyfontsize" + "biblatex" + "caption" + "catchfile" + "changepage" + "currfile" + "datetime" + "enumitem" + "environ" + "fancyhdr" + "ffcode" + "filehook" + "fmtcount" + "fontsize" + "footmisc" + "geometry" + "hyperref" + "lastpage" + "libertine" + "listings" + "listingsutf8" + "makecell" + "microtype" + "pagecolor" + "paralist" + "pdfcol" + "pgf" + "pgfopts" + "ragged2e" + "setspace" + "svg" + "tcolorbox" + "textpos" + "tikzfill" + "titling" + "transparent" + "trimspaces" + "wrapfig" + "xcolor" + ]; + sha512.run = "0678b16b3fd681a0d1b8da43f87ee2d0d42510de15fa84733c008c8e8298de0f9172ed0046ca58862539564e960b94b3786233f277734320e74678492e5bb3a4"; + sha512.doc = "640d3b244481aed907025fce0271a81cf31a55ba991f599c87e146c005c6349078993b43df7d8260475c82d5abd6d23e77988cead11f0b74422c6bb231bf3595"; + sha512.source = "dcf0989d3769ff2e43580953f009efa4d9372e58d45af5821e81e8766096568a59ebb1ec21e68e2b1696edd5e2cb6f9fa4ee39daf3e2d46d10c56a2f0dcb0e5f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.18.3"; +}; +huaz = { + revision = 64723; + shortdesc = "Automatic Hungarian definite articles"; + stripPrefix = 0; + sha512.run = "78331527a14c974923706a26527c8b42e1467935a741d28e81e7ba0510b29cc26242f8b811ac7025a9be3da1d92a2d65fb47dbd798fc1ddd985d58ad96e82c9b"; + sha512.doc = "32c2279e927dfe4fce1554b2dc9a747aa274c6406a0b98fe4477fcf159d3b978f46035badb293bea596067583ad738373e2bf3680fb1d5e20284a0d45b3900a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +huffman = { + revision = 67071; + shortdesc = "Drawing binary Huffman trees with MetaPost and METAOBJ"; + stripPrefix = 0; + sha512.run = "0d78c3874045ce45d703f443817d9b20b5baca0e3b713bc5f09e18a64102af3d349ebb5b7051a5152eaf06c8d9cd01c3a00b5a3c0f5b4db12f566b5f5356c991"; + sha512.doc = "3c1651e5cb8b527e1c55aaf682003c1639c91efd9bcaa4fa51779fac572550195979c0baf2bb4738f8b5e2628b6deb4af6109938ce70e4238696ca35f7e4ea34"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +hulipsum = { + revision = 56848; + shortdesc = "Hungarian dummy text (Lorum ipse)"; + stripPrefix = 0; + sha512.run = "32e981937f3077fb1310205f17bd10c93ae20c98e098f766b0a90218d81c7708071aa4ca605bfc55da1614116cbd8299f9cf1853426dae04a99669839b2d5c83"; + sha512.doc = "862a91b902cc8bb0d71efe3933bd0a1b0f3aba1023586595d57cd45e15a0b961cc3c56a59315eee02337f89d35582497dd6894bf3ead060d2863823765211e1f"; + sha512.source = "6de61158c97297d4c76691f6aa2686d8ff88317de0dcc951a23e6aa93c63a4fecfdcabb74629e2e12ed7878a8a74987834f36faeae3c5fd661bacf99aa7f7962"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +hustthesis = { + revision = 42547; + shortdesc = "Unofficial thesis template for Huazhong University"; + stripPrefix = 0; + sha512.run = "508c86a6cf5e3d952dd43786f78952cc8bbe635620a913abd82b49c2cfade29875bc924d5ea89803b03008328c7297010e98f70b62b5191d9855e0cc1614d3d0"; + sha512.doc = "5c114cda4bd4264904b7fdfedd55720046403b8cd3c1bce4181dffbf319a9107ec0ad8cdd092922c8c5268aac62437d1128a45ea0cdff4121a40f02e26dc0148"; + sha512.source = "61b6147d4bd063995900479b894b60d929445e60855c522e46abaedfbd33f7516f90a99d5052b3241d7070d375504cd660446d6647c28284e76d0ff9ec5aaf76"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +hvarabic = { + revision = 59423; + shortdesc = "Macros for RTL typesetting"; + stripPrefix = 0; + sha512.run = "2f9af35f3e3ebf6d90ed05a77fcd6d6c079d3a476c26e0704e6f6b74899badc3eb0cc79d37f5f9e8b6a2846edb869bf57fc5b4bf14e834629d126bc71b77e42a"; + sha512.doc = "8508cab70c4cc87665790dcfd34a4465fa22002ca19a41d2d24e21ae0a2ed833a7f3c0e346d36e8c95411ea925ad3ebda8b6d1ee4179610ce0e3f673e6226246"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +hvextern = { + revision = 69651; + shortdesc = "Write and execute external code, and insert the output"; + stripPrefix = 0; + sha512.run = "2a2237872220066195c4ee4458eef20c01d6d1b9bffbb82efff08522052eba3775820bde7133cf9417ac591d2196f06d0f8400edae1fb15c82489731e4b9b28f"; + sha512.doc = "c77b44743e598b7bc3c7963a21d02bbd50e53b3346c102aa72926a46280a7aa39c6e48eb220ef1f8744f4f1dd2252dcefb3d876e788ccff1616fda4d55862a5c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.39"; +}; +hvfloat = { + revision = 70400; + shortdesc = "Controlling captions, fullpage and doublepage floats"; + stripPrefix = 0; + sha512.run = "dd24119659fc1b0d359488451218cabba05b226469c9a56997f6ae491fea42cf58d7b131f7e6ddbd576ae98d94575a9518aa4bb5d10a97875c0e19b647f0c250"; + sha512.doc = "98b26dee51f787d82e49f37fda6e902c39af3c5e0618090bd78e2577d0a080b7cd511064d7b41aa4e356d4ff176e87c9b68399d1e06532e20b6d392d3e714851"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.48"; +}; +hvindex = { + revision = 46051; + shortdesc = "Support for indexing"; + stripPrefix = 0; + sha512.run = "12e47531ca8dcea2f195d86b5721f2a62d2590de5a0b464e5e6de5484ee34803eac14f2474e4a00938f6d5e5b307ed3183ea3aa0a4f0d5874877356de6e8c83d"; + sha512.doc = "2a10c26537e550e3d51330c704711c2c43b872f90db15ee709dcfe603a5fc64102a8b466c5d5b7ab4706d5e96e91b11559305ac607477776f34da97590151368"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +hvlogos = { + revision = 69581; + shortdesc = "Print TeX-related names as logo"; + stripPrefix = 0; + sha512.run = "eabf4a92462aa7ead3ae7930400c641d6e64b520867c9e7cceaa48872dca31716ce965cf105c784b725878fad05e6d082a9f9e9cde94b254c780ce55f7daf515"; + sha512.doc = "3124f1521eee4688e6cde38bb39e9c4a123d5d06d008b23447495fdf11f3b3f8ff98f138f2096c322ebbd8f714e60208958b0b01e98c6b81c09c80eb2908424a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12"; +}; +hvpygmentex = { + revision = 62405; + shortdesc = "Syntax-Highlighting of program code"; + stripPrefix = 0; + sha512.run = "5770b9933ad2dc7c844ba2281a3717bc1d27f67a834de45a87effd400551fc74d111ba5087ceab96b2a9e6ed11293fd0d3dfbaf7ac89c4d9a1434911a2fbf734"; + sha512.doc = "cd7b3a615ab8ca79e0d0e9feb7804cabd9036831d2f9761429b7bf528125d055e29f3f7a2e1eeb8efd4c73c1f6f8e0ed03a2ba47dbf9504fc1a750b4c278843c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +hvqrurl = { + revision = 69723; + shortdesc = "Insert a QR code in the margin"; + stripPrefix = 0; + sha512.run = "cfeaea8387dfd425278cc9a8f278d7a0a1590336e24a8b8112b6407a808688012c970822973fa7b4a2816fdf0422171ec6e2926bb51a012f02c7a5b273465a9b"; + sha512.doc = "ee7e0e77406e2e486a2898710953db49aebc28a9bf39d0e40cda20c38a1aa67d0f48f7936fd36bd417658600f82641f6f7d39d12b328d615ac694abd49d76f69"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07"; +}; +hwemoji = { + revision = 65001; + shortdesc = "Unicode emoji support for pdfLaTeX with sequences"; + stripPrefix = 0; + sha512.run = "fb29647b4b81c5c4cc389fe4957400e01dd408f9b915fa4062218af3b2a8eb852315399251c257ed1220ff48359940c59ab9a09dc7a67fa8f0817e39636a1312"; + sha512.doc = "ec35434e49038755dfaef171273e70baffeb3021d002c83703bdc18d0f181f8027a01272bf5b3ce02ceede62495dc9dc1f1c390323e73d77b1bb6adf226f74b1"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-40" ]; + version = "1.0"; +}; +hycolor = { + revision = 53584; + shortdesc = "Implements colour for packages hyperref and bookmark"; + stripPrefix = 0; + sha512.run = "5269044c5b462f13c78e80d28f7237f2d6e353da98db50267a5c4f01b22d565b0300c689470f6eb1ef9af7b66c1068c1d40d7a30ae01f30e7b3649189a7e7fbd"; + sha512.doc = "79e4c83b952182ea89b2ae7a1abdafd771359baadd34fce8d573d7449b24908a5bbf515d16d73fd088e7add82c143a458b2c196c125e5b492033cb36da63eb6d"; + sha512.source = "587ca9470aaa935119d142a970931d89444d2d64ec311ba74a697fa4cd982be999e7e62ee9924dd6028f2b9411657d6b1cf4b6cb9887d08cdb0b969e8a334fd7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +hypdestopt = { + revision = 56253; + shortdesc = "Hyperref destination optimizer"; + stripPrefix = 0; + sha512.run = "784fbff599b60abebd3ae794376a65b460c0ac4aa189319e3f245c1feefa5bb501acf75ed345bb6099e301070d0c1e1eaca62129c4e82fae5611526b6aff370d"; + sha512.doc = "cde846c9c4da226d27bd15881577ad3f1c3f0639c3e37fc86486af40939b0efb2d22d522646136b1b2fe2ebbfd5f2338e347b7476be7289d2a3710d43c2fc8ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +hypdoc = { + revision = 68661; + shortdesc = "Hyper extensions for doc.sty"; + stripPrefix = 0; + sha512.run = "bdd5a75f53b714976f54f0fea68093d79dc0d781a708dabbd3cb90e49d77f282ee15cbf8c1082cd5746bbe6b701e58e71bde38141db56cab5042d7556771d286"; + sha512.doc = "cece39375981cc4adb60b20387ca441404a69c734f686cbe51df759b3025833814e9ec09aa4b720359cce4c4ae14b12cc03ff38954c3fb12ef268304a60f9dfd"; + sha512.source = "3bf5a01f6ce3ec8cacc04fdd4d3b83d9cbdced6dc75120991e031a56a3dc4e5958c367f009c4f5fbbdabb02d0d7b391fb8fbbcdc2c4d5f68b9c0cf8d68259d1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.19"; +}; +hypdvips = { + revision = 53197; + shortdesc = "Hyperref extensions for use with dvips"; + stripPrefix = 0; + sha512.run = "515089c437413d6d21c8d2987b8917aca7c046e42c0dc9212b39be1c9119bcc867f70c37087f9f3709db8c9f824ffe16d1b261f34d06d66e12857db9854892f7"; + sha512.doc = "ef485ca27145ffc614c78547f68d574a0b27cd1a7cd5abd5752681e20ad6612e280f34f85c3e1c753bc6cfea976c9801da1768bda1dcea377c19b138ec9f2777"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.03"; +}; +hyper = { + revision = 17357; + shortdesc = "Hypertext cross referencing"; + stripPrefix = 0; + sha512.run = "6e5bbad0a682440e28be67fc893a970de315671e1f4987bebff4a163d9c38bb33d8de9557765f1d8c74386556c59e332ef5855a3f1fe36d08eddcbd2a77179df"; + sha512.doc = "41fafe8bcaf651994c45abd0040e2123caf8e33fd2d06fafd310d978c10ae5c705f7dd64d9b4740bacee51f11fe52741ed64f83d6b236d298cb6c932fd3ba06e"; + sha512.source = "50552c5d6650973719d892d2696ee4885f8fa78d9e9c62e3fabd8ac42f35610c025c508aaa250f52c5c7676cb5e0e6aa4b75efdd19d3c9e1f3b3ac6981ab1342"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.2d"; +}; +hyperbar = { + revision = 48147; + shortdesc = "Add interactive Barcode fields to PDF forms"; + stripPrefix = 0; + sha512.run = "80077002a3bdc99339749e2f76687a0f8597a786fd3ca3f5207ec44dc2037dbec1e696ab58d77ee6b067d6e958357cb8f0c9805621c3feeb40dde004851311b3"; + sha512.doc = "0598acd8fb945605b204c5c99982db63f4fc06fc82c47f7b301ead30be0474c7dde5eb4f78f3aa698160cd068d38aa2aabe3a1fae3c49cc32194e7cd796839c2"; + sha512.source = "99555f8a939783db613ceaf509fbf2d95352ce8e774e750a9d552717eb538a64663a905a063b6b93aa83384ce322079656c61eeccc9678bdee47b2c56e52220b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +hypernat = { + revision = 17358; + shortdesc = "Allow hyperref and natbib to work together"; + stripPrefix = 0; + sha512.run = "0a803b9e7d23d364122869a89a6f181132f00b54d39f677a9d9471c336c933ba0e743fa4100636a6d3e929714a8896ce964e7614800c675ab9df7cce7e6d732c"; + sha512.doc = "04a3f646e1595404513149f0ba56a36f0cc21a29f3ab455f38c4a7c3f5a282199208ac3aad329f38aa9fd5086762d326d85fa5052dba125d944969bfc0446489"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0b"; +}; +hyperref = { + revision = 69523; + shortdesc = "Extensive support for hypertext in LaTeX"; + stripPrefix = 0; + deps = [ + "atbegshi" + "auxhook" + "bitset" + "etexcmds" + "gettitlestring" + "hycolor" + "intcalc" + "kvdefinekeys" + "kvsetkeys" + "letltxmacro" + "ltxcmds" + "pdfescape" + "refcount" + "rerunfilecheck" + "stringenc" + "url" + "zapfding" + ]; + sha512.run = "71d43dc16443357600d83779628922c0f6e4ee1b57b562b9a47cb7c11a2710ac1b573040c661819e71086107fbb6e7a98851c1a99a10fe5db19d406e98c0ed95"; + sha512.doc = "a2893e722d6aa2be885ebb15a96ab0f30c71811dc3b4e9791e2a6c2ea78c2cd6fdf90e485c7267e533f3e90eb71278074d6883cf4e6fd6c7d9f2a2c744ea6012"; + sha512.source = "1fcddde0f8e9c057d1ddfdc31616f1e362c57ee645f23c71cd9e94bc86f41de8ea32dd478f9df91cadcd66f1814072c5b0dbb2c2ee89f3f477302577ac603edb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "7.01h"; +}; +hyperxmp = { + revision = 68251; + shortdesc = "Embed XMP metadata within a LaTeX document"; + sha512.run = "79dfcb70b4df1be8ada345507f0cece0b36c38f57c1b5e92fa008af3ceb5209c5df10d9144a24af4473a2f640d2adb59054cd9985f762b9b6cf7db45ed99c4cf"; + sha512.doc = "b56e9ef7beb7502ba2e952267fddeb3a26597e9e5193ed66369dc3c78f5a08d34b5fca0685cab8f6ec67e12167a1aca309a18b85073b8e9c497641cf062be6b1"; + hasManpages = true; + sha512.source = "02ca43c9809c347a6db12e0a8ffb2ec96db3b27d4c89ceea10091235c6b411de38d76f976a08d139bad0b0efa0b181e2e2fe5e2edd8cdf41ac5043fcc8758bbe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.12"; +}; +hyperxmp.binfiles = [ + "hyperxmp-add-bytecount" +]; +hyph-utf8 = { + revision = 61719; + shortdesc = "Hyphenation patterns expressed in UTF-8"; + stripPrefix = 0; + sha512.run = "64055aa046fdbc721fda474b7848b37d094b1a8f5f01e507df80003ba591dd959871c880f04d5bc6e0bf169e99bf89f5a1a7dad1195c8839773fc613f3719d9f"; + sha512.doc = "c4aac42267b75a16559705e7de3716eafbec96a285d523d5e7b2f77f345d8e344e174571e247b9c5de8fac75942bc1b0f924e81efd8356b52c9ed91a149d8f09"; + sha512.source = "2ed5177a81f46bb538517447d89129d82bab87f937c98e4afc6c74863d5f4cc3342470f66d2f5d05247fb3ac26b23ed4b6ce4fd093fcb61fbabac6dd330889f2"; + hasRunfiles = true; + license = [ "mit" ]; +}; +hyphen-afrikaans = { + revision = 58609; + shortdesc = "Afrikaans hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "afrikaans"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-af.tex"; + file_patterns = "hyph-af.pat.txt"; + file_exceptions = "hyph-af.hyp.txt"; + } + ]; + sha512.run = "0f969847994b3b377c752c23f802e8c51b4076efc2d43ad2560a72b83cea3bf0a64d7df18a59afe4289a4547a9f23cf81b0c365a499be85a2467579941fa9700"; + hasRunfiles = true; +}; +hyphen-ancientgreek = { + revision = 58652; + shortdesc = "Ancient Greek hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "ancientgreek"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-grc.tex"; + file_patterns = "hyph-grc.pat.txt"; + file_exceptions = ""; + } + { + name = "ibycus"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "ibyhyph.tex"; + luaspecial = "disabled:8-bit only"; + } + ]; + sha512.run = "3f91560ecf78c5540fd4f5d9890f6aa7a57bcd3a41095985785505b82e40793b91a5da3a01bdc021b11c32db3dd7030a104686b34b496c9094acfb85509cd007"; + hasRunfiles = true; +}; +hyphen-arabic = { + revision = 54568; + shortdesc = "(No) Arabic hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "arabic"; + lefthyphenmin = ""; + righthyphenmin = ""; + file = "zerohyph.tex"; + file_patterns = ""; + } + ]; + sha512.run = "85012062097dd4b624cb39c68b293169a25ab3c9cd15b4474c3a3ffbe4b8ab13d6856c6c70a580da45a2d210952df2d9760682da3917cfd24d17772dc2ccce7f"; +}; +hyphen-armenian = { + revision = 58652; + shortdesc = "Armenian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "armenian"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-hy.tex"; + file_patterns = "hyph-hy.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "59538414bf5a4701199100fbd9d5247999a36bc28c7c6ef2a28deb9024e01605d48839f00f345c848365853ac3a9f1aab7402f44860532d7a5c099d2f27ee189"; + sha512.source = "d25e6347545e00a809db1dc8e48ef3fe67678b9ec93a1f3619d2a5a3d786d6e411c2e9f905120e3c5d01d9489c0a83035ce8025836249c88ee768bf07b8e2ca7"; + hasRunfiles = true; +}; +hyphen-base = { + revision = 68321; + shortdesc = "core hyphenation support files"; + stripPrefix = 0; + sha512.run = "d3f2749cc6946702ff0d51c1d823531bc92b77c1106aec252c84cc8649aa56048556c90e9792f1b0749bba0b86b7c34aa2b04fe2946d1226315dbc73add36913"; + hasRunfiles = true; +}; +hyphen-basque = { + revision = 58652; + shortdesc = "Basque hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "basque"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-eu.tex"; + file_patterns = "hyph-eu.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "b90680dc5692824d60ca603e8bdd2fcade7cc772c8c0f9538d579704fb16165db2baf0c466ccaff46d92491b4a678fa86a127c0d106dbef6d640dfd2f887663d"; + sha512.source = "75a20da77fa056c719ecc1f014bb09c67f62f1c4a3abe04b7cadf45c7a4e06e4492cb0d34a8025f19f3ee5e3330e488212885095335d4a7e97baa5b106576223"; + hasRunfiles = true; + license = [ "free" ]; +}; +hyphen-belarusian = { + revision = 58652; + shortdesc = "Belarusian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "belarusian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-be.tex"; + file_patterns = "hyph-be.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "19b9bd10d2357d0cb6ecc9ddb5e46b65b3c0eec1b2917a78311f255c1609bbb86595ce617d331271a72de934ae4001597f4a04d61b3810e34f3b197b21cab193"; + hasRunfiles = true; +}; +hyphen-bulgarian = { + revision = 58685; + shortdesc = "Bulgarian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "bulgarian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-bg.tex"; + file_patterns = "hyph-bg.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "9763e6ece053594b01cd9255a8a3551eb6b86ab082f6f9283664e256c55d43b9513b624774a650d83215d656334751f569496030187c1c78e2fe80f2d10f2f1f"; + hasRunfiles = true; +}; +hyphen-catalan = { + revision = 58609; + shortdesc = "Catalan hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "catalan"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-ca.tex"; + file_patterns = "hyph-ca.pat.txt"; + file_exceptions = "hyph-ca.hyp.txt"; + } + ]; + sha512.run = "37189e09ee902f2c5145f30180b51211091b07d7d04125c98f1b7c424ad27f6899424b78cd17c559509076eeeb957b4f268fb4130807e7fafb461174fed8200b"; + hasRunfiles = true; +}; +hyphen-chinese = { + revision = 58652; + shortdesc = "Chinese pinyin hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "pinyin"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-zh-latn-pinyin.tex"; + file_patterns = "hyph-zh-latn-pinyin.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "a78b70095fcfe297e2d85a49108affd5d48451ff4740461eed46d395410a665011614c9a89dff37e9477ee3803de6ebaa68595ac39222f2968a4124355ea7fa7"; + hasRunfiles = true; +}; +hyphen-churchslavonic = { + revision = 58609; + shortdesc = "Church Slavonic hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "churchslavonic"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-cu.tex"; + file_patterns = "hyph-cu.pat.txt"; + file_exceptions = "hyph-cu.hyp.txt"; + } + ]; + sha512.run = "c44b3f5fec7b44958336dcfb1a43c5b71fd1715262278863f5fcd74d7ec0cc6f1d572b741256d791e6979f15e4b0fcda8058725e27f17e1deb6e5df5fdb007ab"; + hasRunfiles = true; +}; +hyphen-coptic = { + revision = 58652; + shortdesc = "Coptic hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "coptic"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-cop.tex"; + file_patterns = "hyph-cop.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "fe36adfe900e23f2b0c3e9c3a3d96b608c49bf597222537d355d6a68e2f87f587db78a1921ab1c9a80ea175529e353524c35e99b83ef7f5515ab7c0aacd2f680"; + hasRunfiles = true; +}; +hyphen-croatian = { + revision = 58652; + shortdesc = "Croatian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "croatian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-hr.tex"; + file_patterns = "hyph-hr.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "8355d0aa95bb2e72bfc45015f9ae9f6a138f94441387a4daadfec5be4060878f6e69d05eab15432d99c256c1a3f68c122d5c915164fe343459d658a4543ddf42"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hyphen-czech = { + revision = 58609; + shortdesc = "Czech hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "czech"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-cs.tex"; + file_patterns = "hyph-cs.pat.txt"; + file_exceptions = "hyph-cs.hyp.txt"; + } + ]; + sha512.run = "f5c8b08c2db716dfa6d36fcf337b4e18372978d04e28ff2c8ed0a0b3866f4bb3efb7b498fedbfde5052fc504b8677ae553c2dce73701e219632d8c5460d7e826"; + hasRunfiles = true; +}; +hyphen-danish = { + revision = 58652; + shortdesc = "Danish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "danish"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-da.tex"; + file_patterns = "hyph-da.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "954543a3fb81ff00d9c58315ba59d7a5e3430217dda6c1453bcb7ffb0516025dea4b877eb9d66c9f80ccc69d3d4895bdc6ae1b611d8394435fa647b8b806559d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hyphen-dutch = { + revision = 58609; + shortdesc = "Dutch hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "dutch"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-nl.tex"; + file_patterns = "hyph-nl.pat.txt"; + file_exceptions = "hyph-nl.hyp.txt"; + } + ]; + sha512.run = "111371e47ca29069a5a9144d694858dd899b19e2b38d0c793b1e4884c69ae2d62398aacb4cd89e23246fc025e42872875bc808c1f327ac1502fac88c962e6c14"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +hyphen-english = { + revision = 58609; + shortdesc = "English hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "ukenglish"; + synonyms = [ "british" "UKenglish" ]; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-en-gb.tex"; + file_patterns = "hyph-en-gb.pat.txt"; + file_exceptions = "hyph-en-gb.hyp.txt"; + } + { + name = "usenglishmax"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-en-us.tex"; + file_patterns = "hyph-en-us.pat.txt"; + file_exceptions = "hyph-en-us.hyp.txt"; + } + ]; + sha512.run = "a305cf89138e4327844d43a7e21773e31ac97a4655e4d58ae9a46dc0df565e432330debf704c37b4ad552561357521eba0b676755544ceb9c4f21ace09d6dd2c"; + hasRunfiles = true; +}; +hyphen-esperanto = { + revision = 58652; + shortdesc = "Esperanto hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "esperanto"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-eo.tex"; + file_patterns = "hyph-eo.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "ed2976e9fb3eec5d2f0759348b284129e43bf161db571dd21270335388b8aec57e1b8393bc9b246f8a6e9cde22f93a4cb3c1a03dcadd64fdda3d70b576789050"; + hasRunfiles = true; +}; +hyphen-estonian = { + revision = 58652; + shortdesc = "Estonian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "estonian"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-et.tex"; + file_patterns = "hyph-et.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "0eb91153214aaca8c3b5816f5315f9afdeb7c19521c87c79ea2b35e82217bfb23c8bb774baf810206f4413fc663e441ebe6b4962880ca0dbcda9209d2acce3b8"; + hasRunfiles = true; +}; +hyphen-ethiopic = { + revision = 58652; + shortdesc = "Hyphenation patterns for Ethiopic scripts."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "ethiopic"; + synonyms = [ "amharic" "geez" ]; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-mul-ethi.tex"; + file_patterns = "hyph-mul-ethi.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "a1532603758e7f774acba7c13ee74f0046ff187598ca86b2e93b91da31317f03fdbab5d4d7c0814978fb2ac159bd6e5a48e6e734c19758da21ad0a031844f52b"; + sha512.source = "9d6c8c1b0ce5c40d388937328461336a97fcf1fe780fa6198e029f12ef118d9d98f6eec03ea217743851f0217217d6548298df9336fcf33e6c4c196bbdb9eef0"; + hasRunfiles = true; +}; +hyphen-farsi = { + revision = 54568; + shortdesc = "(No) Persian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "farsi"; + synonyms = [ "persian" ]; + lefthyphenmin = ""; + righthyphenmin = ""; + file = "zerohyph.tex"; + file_patterns = ""; + } + ]; + sha512.run = "5b02582769a55bb07d81e748e83170c16aca1c33b0a240cf547fa9c2212f2be52223e258229c760ddc5dd730419bd9e761614cc4fb3b3ba8102841bb779af511"; +}; +hyphen-finnish = { + revision = 58652; + shortdesc = "Finnish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "finnish"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-fi.tex"; + file_patterns = "hyph-fi.pat.txt"; + file_exceptions = ""; + } + { + name = "schoolfinnish"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-fi-x-school.tex"; + file_patterns = "hyph-fi-x-school.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "6aa171d77952165cdcb1b667885f16dd382124ed70ed1db80a9a89553d972720d8ff5f0da1b36669e02c3030d9ff362ab77ba1fa2ba45cddfb460018f0c0191d"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +hyphen-french = { + revision = 58652; + shortdesc = "French hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "french"; + synonyms = [ "patois" "francais" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-fr.tex"; + file_patterns = "hyph-fr.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "b9d2d05311a90f4caa6c4e8aa8a2e80e9c15fc3552f03f0ac6ec70d386610612715deb6e778247248355a3a209fb2413d6d2aee12f18bc35d5a334870b612507"; + hasRunfiles = true; +}; +hyphen-friulan = { + revision = 58652; + shortdesc = "Friulan hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "friulan"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-fur.tex"; + file_patterns = "hyph-fur.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "d1775a9b6e6b7fa155e44c93271e2ccb41bd1ec143ea0cf624841ad48a123db924dd134e6e60b862a808ad2058ed5b86cb34d98e5728b9dccd3997ba2f06932e"; + hasRunfiles = true; +}; +hyphen-galician = { + revision = 58652; + shortdesc = "Galician hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "galician"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-gl.tex"; + file_patterns = "hyph-gl.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "2d707542f80dc94ad20c0daa776df23b773a5e6ccb261e11db675e1e89f5f303a4f5cd50d97f491cc7ea8b0f3c0d3f6391707812a95d4e72cca3afa7815e566f"; + sha512.source = "b9925168b1f9ae5139ffc3bd34810cc05a27475cfae31e98fd0d7618575fc994ca95d7479506024abec2c33bb20121811244d69c490df18a29d6c93fe02174c6"; + hasRunfiles = true; +}; +hyphen-georgian = { + revision = 58652; + shortdesc = "Georgian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "georgian"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-ka.tex"; + file_patterns = "hyph-ka.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "edaf041a2f92b0f7dbf28042c81838e8fd781cf9c3ad529c314227c94917ce4e8728ca676f8bd42e2a81bae76b11aabc1e22896e3ef9cd38ca4b718bc58fa0cb"; + hasRunfiles = true; +}; +hyphen-german = { + revision = 59807; + shortdesc = "German hyphenation patterns."; + stripPrefix = 0; + deps = [ + "dehyph" + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "german"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-de-1901.tex"; + file_patterns = "hyph-de-1901.pat.txt"; + file_exceptions = ""; + } + { + name = "ngerman"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-de-1996.tex"; + file_patterns = "hyph-de-1996.pat.txt"; + file_exceptions = ""; + } + { + name = "swissgerman"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-de-ch-1901.tex"; + file_patterns = "hyph-de-ch-1901.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "c27389dea67ffd0d45419d484b0c72577b2d5b8234266483add078b970d5d994d41f7cf9a1509ad93efe9489501f986127ea717135c5f57588094393e0d7219e"; + hasRunfiles = true; +}; +hyphen-greek = { + revision = 58652; + shortdesc = "Modern Greek hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "greek"; + synonyms = [ "polygreek" ]; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-el-polyton.tex"; + file_patterns = "hyph-el-polyton.pat.txt"; + file_exceptions = ""; + } + { + name = "monogreek"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-el-monoton.tex"; + file_patterns = "hyph-el-monoton.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "3da84f41aaf7e5d4be0ce609e4d119e65c9189ff6662051cb7e879e9e373d990ef1c59ac7cfead1bdbc6e55b52d4b3ed28d157b22dbec43e5226f16872d5a7de"; + sha512.doc = "865aaf1f9f0fbe130f9006e41ef677713667832745fc24c28cffe805a540a19f7104a3f0fef3258ba0e16c1c456959904887899a4c584338c58de7fcc80c5419"; + hasRunfiles = true; + license = [ "free" ]; + version = "5"; +}; +hyphen-hungarian = { + revision = 58652; + shortdesc = "Hungarian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "hungarian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-hu.tex"; + file_patterns = "hyph-hu.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "868a4c3f4d0eda078054026bd1ec35e05c2f4013e093bf58147bfa2d861814242b55a900ce60384767558c9552ff9d41cf447e2a157bae83bd2877251012d96b"; + sha512.doc = "164180f0485e16a49ba83dcb4721902e8a29f399032d4f5a59d55e424b8178a25dedd9fb99919d9d772142342fb78fe0dbf7a5303382a0b7feae4a381b76f8bb"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +hyphen-icelandic = { + revision = 58652; + shortdesc = "Icelandic hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "icelandic"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-is.tex"; + file_patterns = "hyph-is.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "69add7ccde189e86810e2a82692a260de9a9fcc0ba011352881d202d4f4c94c4dbd84fe36dff40ef9b9ad3e8e990947cc61022307790f13cad56744f3ef5e41f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +hyphen-indic = { + revision = 58652; + shortdesc = "Indic hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "assamese"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-as.tex"; + file_patterns = "hyph-as.pat.txt"; + file_exceptions = ""; + } + { + name = "bengali"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-bn.tex"; + file_patterns = "hyph-bn.pat.txt"; + file_exceptions = ""; + } + { + name = "gujarati"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-gu.tex"; + file_patterns = "hyph-gu.pat.txt"; + file_exceptions = ""; + } + { + name = "hindi"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-hi.tex"; + file_patterns = "hyph-hi.pat.txt"; + file_exceptions = ""; + } + { + name = "kannada"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-kn.tex"; + file_patterns = "hyph-kn.pat.txt"; + file_exceptions = ""; + } + { + name = "malayalam"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-ml.tex"; + file_patterns = "hyph-ml.pat.txt"; + file_exceptions = ""; + } + { + name = "marathi"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-mr.tex"; + file_patterns = "hyph-mr.pat.txt"; + file_exceptions = ""; + } + { + name = "oriya"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-or.tex"; + file_patterns = "hyph-or.pat.txt"; + file_exceptions = ""; + } + { + name = "pali"; + lefthyphenmin = "1"; + righthyphenmin = "2"; + file = "loadhyph-pi.tex"; + file_patterns = "hyph-pi.pat.txt"; + file_exceptions = ""; + } + { + name = "panjabi"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-pa.tex"; + file_patterns = "hyph-pa.pat.txt"; + file_exceptions = ""; + } + { + name = "tamil"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-ta.tex"; + file_patterns = "hyph-ta.pat.txt"; + file_exceptions = ""; + } + { + name = "telugu"; + lefthyphenmin = "1"; + righthyphenmin = "1"; + file = "loadhyph-te.tex"; + file_patterns = "hyph-te.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "765be1c13ef3445b056b61c24460cc2f18bad038c04541bf4773c7f61c6d26be25d3079b260a1b9623e2f01155ec52eb5bc87b0ea9234e50a5ca24dd8a7a5937"; + hasRunfiles = true; +}; +hyphen-indonesian = { + revision = 58609; + shortdesc = "Indonesian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "indonesian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-id.tex"; + file_patterns = "hyph-id.pat.txt"; + file_exceptions = "hyph-id.hyp.txt"; + } + ]; + sha512.run = "3f04a63010c02d77cb229c90aec9f1079557493958573be9ce992ac5ae3c229f01f9abc0cac785d9340ff48aa169a01f8b327ecb2e255bef57f1fe85d04d1d2a"; + hasRunfiles = true; +}; +hyphen-interlingua = { + revision = 58609; + shortdesc = "Interlingua hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "interlingua"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-ia.tex"; + file_patterns = "hyph-ia.pat.txt"; + file_exceptions = "hyph-ia.hyp.txt"; + } + ]; + sha512.run = "dfed82ea70f25d452726b5cd03d8e060bddc23cbbc5deebab2ddad93ce6744c38d357327fbe570bf7a1444f62cee0cc422a6c7d066d6693a238d851b4fe46e32"; + hasRunfiles = true; +}; +hyphen-irish = { + revision = 58609; + shortdesc = "Irish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "irish"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-ga.tex"; + file_patterns = "hyph-ga.pat.txt"; + file_exceptions = "hyph-ga.hyp.txt"; + } + ]; + sha512.run = "478a77c4ab8231a3041c3427075f16c072f58a394eced8ff0cd5da6544f3f2fd65722f33fd8344e18060c96f09bd18b90af71f8508639fc9c59d29d704d9e348"; + hasRunfiles = true; +}; +hyphen-italian = { + revision = 58652; + shortdesc = "Italian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "italian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-it.tex"; + file_patterns = "hyph-it.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "4e79ee31893d6c948a3aac8588d4beb75d89f89df973b1e39cd63894e008af55f8dca774194d7eb105fb0aef692b17bb645d5bd85cca7debafd74aabf241bc30"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "4.8g"; +}; +hyphen-kurmanji = { + revision = 58652; + shortdesc = "Kurmanji hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "kurmanji"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-kmr.tex"; + file_patterns = "hyph-kmr.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "e5114da178fc841b1079130c01f8729ac94f0e3592dbd479f44a978ea009fd75b410d6130d9badd6227d115d8f6dad3ed4b553dbfbf4f80be5d1c2adf108e2fa"; + hasRunfiles = true; +}; +hyphen-latin = { + revision = 58652; + shortdesc = "Latin hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "classiclatin"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-la-x-classic.tex"; + file_patterns = "hyph-la-x-classic.pat.txt"; + file_exceptions = ""; + } + { + name = "latin"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-la.tex"; + file_patterns = "hyph-la.pat.txt"; + file_exceptions = ""; + } + { + name = "liturgicallatin"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-la-x-liturgic.tex"; + file_patterns = "hyph-la-x-liturgic.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "9d0db7fcad4ca764379957fa22f9daede79898bcacfbdb62abe54318a52dd82a66f8e39542c18008e3f6b6d0db284b1e9b891531d3c8f3c9cf22c764e83d57b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +hyphen-latvian = { + revision = 58652; + shortdesc = "Latvian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "latvian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-lv.tex"; + file_patterns = "hyph-lv.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "85aeadb0cb3c5de9ef48057132ccd958d17f014b07b56b9ebe2186a709c4e7646fad260e156718e43ec3eac88681654f88c9b53a6d71fb3eaee934dcb4439ed9"; + hasRunfiles = true; +}; +hyphen-lithuanian = { + revision = 58652; + shortdesc = "Lithuanian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "lithuanian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-lt.tex"; + file_patterns = "hyph-lt.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "7a691e3c55c768b9ea5ef13552dc42025ab613df0a0d5c0d54aad58b63da11a93e59bc53e6a8211d5e054cbea8500846da01e9619bbee723d648e2d369a49d55"; + hasRunfiles = true; +}; +hyphen-macedonian = { + revision = 58652; + shortdesc = "Macedonian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "macedonian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-mk.tex"; + file_patterns = "hyph-mk.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "f88208291212874df493151581205d1b270b2d4278176c42e11edac9b344b73c2ee859f93b6947e4a6003a00abc4d3753024add9caf84f114c8a0cec72aa8c8d"; + hasRunfiles = true; +}; +hyphen-mongolian = { + revision = 58652; + shortdesc = "Mongolian hyphenation patterns in Cyrillic script."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "mongolian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-mn-cyrl.tex"; + file_patterns = "hyph-mn-cyrl.pat.txt"; + file_exceptions = ""; + } + { + name = "mongolianlmc"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-mn-cyrl-x-lmc.tex"; + luaspecial = "disabled:only for 8bit montex with lmc encoding"; + } + ]; + sha512.run = "159562a8feb25918bc422e7dc78a46423c7fff2f3c61016a0162761411999a5555be3c6e36cf967d5034f65c12f4b0834ae0c0423c2f3ab17a65034b1803dc72"; + hasRunfiles = true; +}; +hyphen-norwegian = { + revision = 58609; + shortdesc = "Norwegian Bokmal and Nynorsk hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "bokmal"; + synonyms = [ "norwegian" "norsk" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-nb.tex"; + file_patterns = "hyph-nb.pat.txt"; + file_exceptions = "hyph-nb.hyp.txt"; + } + { + name = "nynorsk"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-nn.tex"; + file_patterns = "hyph-nn.pat.txt"; + file_exceptions = "hyph-nn.hyp.txt"; + } + ]; + sha512.run = "8b02e90bfcdf3c6d4bd1966b21e0512069f1749c638d537e9553f68e61e0bc325db8d3b462f45650db4376c7a769c2cde3e0c0601d7de272898a23cd2251c064"; + hasRunfiles = true; +}; +hyphen-occitan = { + revision = 58652; + shortdesc = "Occitan hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "occitan"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-oc.tex"; + file_patterns = "hyph-oc.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "b0743d1f6083dac7a347e22aed19d0c5d76119582e4862557a55b817b17dddaa69a2150f14daf6b08689278dd61b27c1b6ed45df5601dd6327bf185a7a46a5c6"; + hasRunfiles = true; +}; +hyphen-piedmontese = { + revision = 58652; + shortdesc = "Piedmontese hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "piedmontese"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-pms.tex"; + file_patterns = "hyph-pms.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "fa7fc73edd582ba20b8236507385f0a30f477bb9c79e35fea56aa4020be966b9c4a16a327848dd051fa4cf6e6117ef8a51eb92ed6cb72f6993cb290fa5cd5ca3"; + hasRunfiles = true; +}; +hyphen-polish = { + revision = 58609; + shortdesc = "Polish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "polish"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-pl.tex"; + file_patterns = "hyph-pl.pat.txt"; + file_exceptions = "hyph-pl.hyp.txt"; + } + ]; + sha512.run = "5580b3865ff8d20d475cb962b0257b909ff0e410b6776cb8153145fb0ee42b2f777069413bc6b3622c8c52318aba1ba836210e8972c5b6a47ef978c24fc8848a"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "3.0b"; +}; +hyphen-portuguese = { + revision = 58609; + shortdesc = "Portuguese hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "portuguese"; + synonyms = [ "portuges" ]; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-pt.tex"; + file_patterns = "hyph-pt.pat.txt"; + file_exceptions = "hyph-pt.hyp.txt"; + } + ]; + sha512.run = "9d9ab3e616522ab9837bb7c7509127f998c442e96f96ee6b6fc0fdc9ac53fd03319d0c0ce28e23a35f1ae0ebb840cdeb19e8ab6444549c33059b28e7b307486e"; + hasRunfiles = true; +}; +hyphen-romanian = { + revision = 58652; + shortdesc = "Romanian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "romanian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-ro.tex"; + file_patterns = "hyph-ro.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "124a93a633731dc1b3d6cbf2fc9b8489bf0737911a0c25ea44dbdfffa07c165ba5804dfd7e9cbe0be3b6eceb9fd6e95daefcae2356ee140f644416bbe1b13507"; + hasRunfiles = true; +}; +hyphen-romansh = { + revision = 58652; + shortdesc = "Romansh hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "romansh"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-rm.tex"; + file_patterns = "hyph-rm.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "a69d3881493c70cfd58e3d79ed76ce6f18bbcb43e1683f31270eafeb743b366a3c52c9945ff94db333e88ca18145263ba74002f5e78bb42d7aefa48c66af7955"; + hasRunfiles = true; +}; +hyphen-russian = { + revision = 58609; + shortdesc = "Russian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + "ruhyphen" + ]; + hyphenPatterns = [ + { + name = "russian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-ru.tex"; + file_patterns = "hyph-ru.pat.txt"; + file_exceptions = "hyph-ru.hyp.txt"; + } + ]; + sha512.run = "f17852dffbb8f5c337b8316b92c2b0a60a318df491231047d9c0930d55d8b2be3274ec94d0d87085d53e06e89c585d47250f046300bf3890ce751f6f2052d348"; + hasRunfiles = true; +}; +hyphen-sanskrit = { + revision = 58652; + shortdesc = "Sanskrit hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "sanskrit"; + lefthyphenmin = "1"; + righthyphenmin = "3"; + file = "loadhyph-sa.tex"; + file_patterns = "hyph-sa.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "e84b6ca93e922c9c6edf03f4dbec1fae9eef2462379ef2fd0f3508a5048b54819c5ba12e0d76bafe1336666ca74ba95e27f63224fa048068bc515f3bc41f6eba"; + sha512.doc = "95c6ae15687118ffc9019c8634347a602e6590b4a1d18bc060e57fe548a81f097070322975be1f62fa2685c5affff7f31b4854b0ec941bbcb9377ecf16986cea"; + hasRunfiles = true; +}; +hyphen-serbian = { + revision = 58609; + shortdesc = "Serbian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "serbian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-sr-latn.tex"; + file_patterns = "hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt"; + file_exceptions = "hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt"; + } + { + name = "serbianc"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-sr-cyrl.tex"; + file_patterns = "hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt"; + file_exceptions = "hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt"; + } + ]; + sha512.run = "390aa9c116b6db7b362fc57aa0758a4c489c5fe33c718fb37675b17a9772a463ce532a2ace3e1ef90275b4afef5ea8d6cff71a7abe625d84e3f461c115306452"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0a"; +}; +hyphen-slovak = { + revision = 58609; + shortdesc = "Slovak hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "slovak"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-sk.tex"; + file_patterns = "hyph-sk.pat.txt"; + file_exceptions = "hyph-sk.hyp.txt"; + } + ]; + sha512.run = "a0786980e0cda7029a72075023520acdc998b83226e85deb0b8186ee4293560321517d507f74fbe68f1d68a16cd8af67aae68baead9176f9cc687bcc7d0a72e1"; + hasRunfiles = true; +}; +hyphen-slovenian = { + revision = 58652; + shortdesc = "Slovenian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "slovenian"; + synonyms = [ "slovene" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-sl.tex"; + file_patterns = "hyph-sl.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "a605c9149ae452df8b2c25aa0f6bcdde53150e4485147a065f1f56c9740c3544c5c7f9c6049aea913916a62aabaf40777cf6f0f76a858e485c0bd09826a6ef5b"; + hasRunfiles = true; +}; +hyphen-spanish = { + revision = 58652; + shortdesc = "Spanish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "spanish"; + synonyms = [ "espanol" ]; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-es.tex"; + file_patterns = "hyph-es.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "d6783537ff44a326b83c2004afd63f5bdbd162fa4865138c2e6d34c9e6a103ac41dd7b382454646b09c74970f8e0d5827a5f4af617936f74fd300b2054a096d4"; + sha512.doc = "263fd9480c5f225c7e36169b86e846baa64745b83c1072c9602e873f2e7cf8e63b07ab85b29e9d4263656faff58a39fe83e1eba34517b8ba34720f189c8e7f43"; + sha512.source = "b1ceb7602a46ecab68fb767ffb154f0dea9626d81bf6c46dd43be328204f72141842c81efda9d7d51997ed25356746e345f7cd9f9ed88ac2f99746794becb75d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "5.0"; +}; +hyphen-swedish = { + revision = 58652; + shortdesc = "Swedish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "swedish"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-sv.tex"; + file_patterns = "hyph-sv.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "5f993ae6b22eadb87b6a1839bfa7d78a0dccc1107c5afbec8c248ed001018da38bb179e29f2430cffa90283221b20c5475346a8d5566edf16152266257f2a37d"; + hasRunfiles = true; +}; +hyphen-thai = { + revision = 58652; + shortdesc = "Thai hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "thai"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-th.tex"; + file_patterns = "hyph-th.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "8336eee03250859ab4328ad3c1fe437d2af688ef56b43be49c45838965ffe033befa84cdf600e9f48cdf60cbbfbff44450c830bd4c34556f680c5096ed3aecc4"; + hasRunfiles = true; +}; +hyphen-turkish = { + revision = 58652; + shortdesc = "Turkish hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "turkish"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-tr.tex"; + file_patterns = "hyph-tr.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "5c7023e01bf59af4d36bd451f51ae00c445711c7ecf109c9d835f1d689446d7b0b1b2627b7f9e84e4f4a8ceff52227ff280ac64481e1d29d538a30e093dace85"; + sha512.source = "2aa80889b9657b03b6beb6510b6790fba13811b97abbac186eaf4d3f40212b41db0dd2d21583429820faad558b0415a09aa8254d2edd96812cf6396fb18ccf5c"; + hasRunfiles = true; + license = [ "free" ]; +}; +hyphen-turkmen = { + revision = 58652; + shortdesc = "Turkmen hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "turkmen"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-tk.tex"; + file_patterns = "hyph-tk.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "c984bb7f09c5816c36a7a790f16df1750ee90f36e2130994ecd1db63f26afb650245985699a80da9b4d7004ad67106771d8c7b79262438369aee3f52fd8374cf"; + sha512.source = "a496f681db0b4b85d82ec1dd60c057f63b6d1c1b52d391e7bee98d3d6e1fb596701c91f2ca400d0df13b96ec7a43d275646b7d2874fe1e4efc9d9b2b47f6cc5d"; + hasRunfiles = true; +}; +hyphen-ukrainian = { + revision = 58652; + shortdesc = "Ukrainian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + "ukrhyph" + ]; + hyphenPatterns = [ + { + name = "ukrainian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-uk.tex"; + file_patterns = "hyph-uk.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "05a9111b358c659159c6edfd38b9ce3d78febd794cc82968dc3e2acdc3612786304721fbd07f00f0a8278f4c2e46a1bfad821b5da45e60546d6acb5bf9068d08"; + hasRunfiles = true; +}; +hyphen-uppersorbian = { + revision = 58609; + shortdesc = "Upper Sorbian hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "uppersorbian"; + lefthyphenmin = "2"; + righthyphenmin = "2"; + file = "loadhyph-hsb.tex"; + file_patterns = "hyph-hsb.pat.txt"; + file_exceptions = "hyph-hsb.hyp.txt"; + } + ]; + sha512.run = "b2cb1bcd953ffabbd3f5acd8c72e9c60415fd300004de56ee446fc77d381aac1db65d613a2f591d3d0e45f2a12ff5340457ae3061b4c77de502923932383bdcb"; + hasRunfiles = true; +}; +hyphen-welsh = { + revision = 58652; + shortdesc = "Welsh hyphenation patterns."; + stripPrefix = 0; + deps = [ + "hyph-utf8" + "hyphen-base" + ]; + hyphenPatterns = [ + { + name = "welsh"; + lefthyphenmin = "2"; + righthyphenmin = "3"; + file = "loadhyph-cy.tex"; + file_patterns = "hyph-cy.pat.txt"; + file_exceptions = ""; + } + ]; + sha512.run = "12a23e0b9d00eb4381e3c97ecbb449faf5a73b755a17fc0301f1cbad5d0babb370aeec16dcdd316cefb56e142873abaa685288b1a1d3c7dcb76a07a9ef127ac6"; + hasRunfiles = true; +}; +hyphenat = { + revision = 15878; + shortdesc = "Disable/enable hypenation"; + stripPrefix = 0; + sha512.run = "5af847cd55cc1b455b1928f6ba275054209ad5c9c2f81a7ae648d87eaa39353e842b2df4e91cf530909a46b4aa226228978d771b35e46b7e12f1a08a08faa181"; + sha512.doc = "57f8a5d71763cac73635fddba75eb59faaaed01d47bcbb7ecc96b80fa5a926bb0091d3cd3448c6f53ad82cd44c9244ee631fb5b56141351b578cd899509eb323"; + sha512.source = "781337dbca0ecf6155221b768ace1fec364bd1ddf29e3df36b2da64b6137a09996423466c8241cc5107c3eba056b4bf5c54572af77e781fe8e1e7f02264d9577"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3c"; +}; +hyphenex = { + revision = 57387; + shortdesc = "US English hyphenation exceptions file"; + stripPrefix = 0; + sha512.run = "77ad574e0786d7cd8e7d731fa7666a6a531b29a914759ecbb9b5d6e5f62e9ec9027aae7e3b9ffd62bd918bb0354c41e865779b044381bc1b7256528eddb34754"; + sha512.source = "d93fbc4f3f1a711967f40bbb492e9f6497b7a91b90d42eab92f3815fd0d15b239286c96519acff2d6609be00809a86846ba2cea4bd94719a35aae024e5785a4c"; + hasRunfiles = true; + license = [ "free" ]; +}; +hyplain = { + revision = 15878; + shortdesc = "Basic support for multiple languages in Plain TeX"; + stripPrefix = 0; + sha512.run = "f2968e8baf048329d8c78934770aa5d0a364ac7b3f77dc00a163e085e4fe45420c180acd05b281016aefdfa6523bed234e75ca07da0d133438798c1e51330d83"; + sha512.doc = "cc64c35df85ba832f18f153d0f0cdc9f153ac4a9db0a175a1961a353f59ba585e19b6607e0c4cd1a832d921aa3451687427965cbef4fcb2a87488895e6643bb3"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +ibarra = { + revision = 66892; + shortdesc = "LaTeX support for the Ibarra Real Nova family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map ibarra.map" + ]; + sha512.run = "7de51f4d206481dadbd4409a0c98dafb36a415e75053b78f40349edfd8b122e9449e749967eada07507ada1f6f22658c02b0a4993e39c2b0e97334076072d6a8"; + sha512.doc = "318a4bb5d2fd012c783053f457023604d53cdb2b02739ef8a1780f1856d5a63713774568cfa7a230f8ca1eb4711fa65f99d5a99b5c4e9235fb1b449751bc50b0"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +ibrackets = { + revision = 67736; + shortdesc = "Intelligent brackets"; + stripPrefix = 0; + sha512.run = "fee99798386a5a6b9b8ff2ae9d2eecc5f4dc835b825795400777780f567ade13d789e81de3e841a54653226098ec602fa91839ec86f25ac0ce2033b31508b4e6"; + sha512.doc = "1d6bd5b4a22a44f03006c1fee3d94ad2760042ac98835d1ab043905595f435b583ba2b65fb6f0f881234085f028f492a283a5593d9a8316eec6fab541fc3c6a6"; + sha512.source = "766f93cb337190246b6a446407c8ed75b1ff35edf61cae443798d1f049639bf277951d59b5d8ee7f953be848f81a74b991856d328910e9237206f47a1b4a3a1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ibycus-babel = { + revision = 15878; + shortdesc = "Use the Ibycus 4 Greek font with Babel"; + stripPrefix = 0; + sha512.run = "30f810bd70555df4f05fbc0b073456c030a0768372bd3c681921f41fc31bfbe0570a39e474ab26aeeacb142622154e5cab3714412b09f89d1260fae8b60e817a"; + sha512.doc = "f09dfd00f35f653defd756b72437dd712ed1ffceb05beeadfb34c1c5163559ee7c0ae6ce0420f57b722e93080248cbcfd678d811f1383fa5fa1ab76db52a060b"; + sha512.source = "13e3ad11b56a70d7752209feaa9437bda4979c40a25597114bfc5b4e26a889c623aa7266959a212de6b7e74ebe75fb38b36767fa95f692adae027e5d025a4702"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +ibygrk = { + revision = 15878; + shortdesc = "Fonts and macros to typeset ancient Greek"; + stripPrefix = 0; + fontMaps = [ + "MixedMap iby.map" + ]; + sha512.run = "89002af0024ec804ebffcc45f3a33337ffdb66f71e1ca70224b0936388892dadf99605a8ca3f59a2b879e76e24acc91b1da92622d602f49b236aecb8aafe64b9"; + sha512.doc = "9dd3bd7a8ef3267965f30048e4a71314b6a9813cb400b7a94dfe285606d7554cde80aa429603d0fb1f587935e193e5ece5ed67870fc4e0c66eb5152c392a9cdc"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "4.5"; +}; +icite = { + revision = 67201; + shortdesc = "Indices locorum citatorum"; + stripPrefix = 0; + sha512.run = "23f4f25a72f77cca2585bd390ad1828e04a70b73fba0a86f0622e29b6bfee596a9a3172a8e8b2531c3bac60f8e4d840301d200ff4a4ec20d5332de62766020a3"; + sha512.doc = "a84ba9a33de8ceffb8c92b0555daa1a39fb822a272af2192513ce0c03ffd7c97a413a5916f3f5745a1b36b8e5aafdb081ee301d613d645e66e0f2ba2b7484a0c"; + sha512.source = "227acf7dd54f4ae1e23c753bc9c8a0ad82e275eac2d406cf6147d986d5e93ba2483cb7f9abe3e31d347218d853e6a8bcd4d015b7b9b3afeab901a1a40461924a"; + hasRunfiles = true; + license = [ "gpl3Plus" "cc-by-sa-40" ]; + version = "1.3a"; +}; +icsv = { + revision = 15878; + shortdesc = "Class for typesetting articles for the ICSV conference"; + stripPrefix = 0; + sha512.run = "e865708ef636c7c917cc9a870eaba4b8c0249acba01bd2cd3fbfc9d95672405db133bbf0faf9f2d299bc4024118b80b4354ecb8216427507f66817cac085e01b"; + sha512.doc = "dd06bf5d8a087bcb20c63a61cb9867bda3df35e8adf30a3d4ca69ab149772d46e3b83f168a8fc1c597aa2536a14b98561f42226a59b6663f58de4e338f9b4e82"; + sha512.source = "9ee3fecec68c7719a39d83860e8efaca3f5daafd82b9ed06af9ac38ffa3659d03f7ecec5407d568ec5f071c22c0cb33166449b64757be7b740943472d9ca1941"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +identkey = { + revision = 61719; + shortdesc = "Typesetting bracketed dichotomous identification keys"; + stripPrefix = 0; + sha512.run = "3f41af7a6b1f253dd34c670c3726f9b5fba2849230787827f69dfffd7008ec7bdf8bf84d11e7151b9e0a47b486f60ed2e475f30ed3f6cf35d68e283ff6a9c558"; + sha512.doc = "58574d462eee30612617c9340e00e956968f04b8da292babced36016516272e4d190f06862c9bc41466c85ced264f380192c4e9376c4b0ed58e673f37efd3cd0"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.1.0"; +}; +idxcmds = { + revision = 54554; + shortdesc = "Semantic commands for adding formatted index entries"; + stripPrefix = 0; + sha512.run = "ba1737eac5f6985ab4a0bb25aece07fd0668533ba046d9f980e4c4ba4862c9045e19c06a477e498df027fc0cc2af5503683389377287d58ae89690c58b5f6683"; + sha512.doc = "1894abf19f05ea74aad0ac1fed2409478dac130a019a44d6bf2c909cb1de66e4c9ec543c75db6d9238982f51af066a4287bd8827f89a59d3d9ba6d3f79aed4cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2c"; +}; +idxlayout = { + revision = 25821; + shortdesc = "Configurable index layout, responsive to KOMA-Script and memoir"; + stripPrefix = 0; + sha512.run = "968d869a0b635b14ce8ce85e710c987ecd8ea2efb97a03314098014366ece450b4566d626031e11b52d7ede53a019665640fc1626dd1e24651275b35a8f2cac6"; + sha512.doc = "469a20893247406856f15dad6b14050e221299dc2adc40f1547361d74d3f7ce90ba6eabde06402bdbe22c845119df4bbfa8b999931e99c1b944b165f3b245892"; + sha512.source = "a2fac68e0c6c0f2cc0c9472d9d58882c337f519caa3b2bb088a330bda4f65b43a1acbbdf936e4975f3c628ce1f5a45f58def28cb129a0708a0b4168cbcdcac0a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4d"; +}; +ieeeconf = { + revision = 59665; + shortdesc = "Macros for IEEE conference proceedings"; + stripPrefix = 0; + sha512.run = "1a0bf2fe8e019b55ac1ed72a9d428c3e90653183918f2c1ff22e9ea468cb3b3fea424fa3de2a46b9534086138f1130105672ac217ba7172354c51bbf384ba20d"; + sha512.doc = "a0133638d4da1822c2cc7c41052fc69d71feb89bfe0351594343166cdb217a62cb849d2a355bbaa3a12e38882ca76c94740f9f4711b42280c81a58bcc9fd17f2"; + sha512.source = "9badadaad5c47d067054176f8c979b4472ff57db1746ec2f2adbbb39fd75856d2145e120de78e51388d064765a018a06a71bcf75f078f3a4a958754c6f565c5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +ieeepes = { + revision = 17359; + shortdesc = "IEEE Power Engineering Society Transactions"; + stripPrefix = 0; + sha512.run = "60ae4ff80be5c2b02e2ebeea5954ed61b73dbc085a4d282004796d9be6038cc7c8020b7c81226d7dc7b121683e4196e461c7c3d101bb460eb8c39bf2da179bb2"; + sha512.doc = "ae2413800f1bd4c0467321a7332fac15a8010e31ba7a4effc0fdb44e9e7a0001ba62d6acb44a72eb6f996560ddf96231b7355c4b9ad8b816be102a143b7c8011"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +ieeetran = { + revision = 59672; + shortdesc = "Document class for IEEE Transactions journals and conferences"; + stripPrefix = 0; + sha512.run = "d688e4be2d145652c16b028cccd05ec5f41a94ca190caff0c6b3fbadaa5c859516a28e4555569d072dd1d550c8794c1ddaaefecce49945284dd304938360f419"; + sha512.doc = "241119c6d2848d5f63e2afe8f1e07c263fea526c9c7ef21ecc533f27c92a67b1baf9a33122fed6ff491b2ddaddb0e02ce138164c8b9ff2f5db11d1ff802f73b8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8b"; +}; +ieejtran = { + revision = 65641; + shortdesc = "Unofficial bibliography style file for the Institute of Electrical Engineers of Japan"; + stripPrefix = 0; + sha512.run = "16dde97354dd4c4ff2bfbbb9ead8ce7141a253afe2ec5b39cebe3239d40827d73c83ae90e79be77c5e5a799b40dcf5a3074f2659feb5add8b62d4491097a6cf1"; + sha512.doc = "41ffd8978d9a591c4aa711c4b2f1dc73a4d18a39e67003494c4c9a86d5fd24acf40b6c79dcc139cb46a36dda96d1e0a26a7d5336683c3d7d11eb6e46765c03e9"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.19"; +}; +ietfbibs = { + revision = 41332; + shortdesc = "Generate BibTeX entries for various IETF index files"; + stripPrefix = 0; + sha512.run = "ad8796bf4e492072dcc9335f913ae2b5d81f2152289ca76cfbb61a63577c631bc38f5cad6860aef47b1fb54c02157f509c23c3f903b34b8e7a82b8604eaa449a"; + sha512.doc = "586dc66004dcf4abed254d223394badd45557d79c7e1b56bd20080f41185ea8dca28b3d501e708cc3ed4088f1368f153ba2d2af313d5d6add2d072b46954952f"; + license = [ "mit" ]; + version = "1.0.0"; +}; +iexec = { + revision = 69420; + shortdesc = "Execute shell commands and input their output"; + stripPrefix = 0; + deps = [ + "pgf" + ]; + sha512.run = "c9b89b8d93868060d969ff2943fc5915b831f5354a78b87fe99edc3b475875ed10349934e6cc23376d23d3fbd8e84234028bb4d2ccd49a30e8cd3e3b20035311"; + sha512.doc = "7226a854dba47fd91eca3ff5781e312fdf1650b8b3596d4232b353e8854d5cc213cb3f31ba4010016daf4d8683249697290b7886ca8db651b0bce2856bb7e08c"; + sha512.source = "53b295fced75d6a8451d1d6e9130b3aad977fe7b1e0ad57d67e899920dbedefc297b36636772cedb94bace189efa7f2a65172e44069ba62609961ea0cf8fe2f2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.14.0"; +}; +ifallfalse = { + revision = 60027; + shortdesc = "Compare a string against a set of other strings"; + stripPrefix = 0; + sha512.run = "2117368f9114bfe20c7fcd387c47d27d59cb2af720eb6c55f2a8254067e2dbf7be21b9081a244367d46d5deae8150f915b17431296b02de486f4147e5ade9b87"; + sha512.doc = "c952a3f591c77df2b2443352783606e57ccc35d45769d1e7892b12399de5253af174a739c7283a28463536394430d0582852abb677fd87015bada501b0bde95e"; + sha512.source = "3070c2a5beefc8ce8b29f8216a66b5636aa71f6f68aee9734eba78e487110efa67a405ed4b87d4a550bd3fe45df3a8f3da10ae717d0c31cd98bb2465bb903bb9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.0"; +}; +iffont = { + revision = 38823; + shortdesc = "Conditionally load fonts with fontspec"; + stripPrefix = 0; + sha512.run = "a2a329da661f003edac0e0bc701958e0744864f8693ffccce7f1ea6867eaabe7d71b38a1dbef8bc27f770e8b4c30a4480ede1dd575d26860095575020db987f6"; + sha512.doc = "95a8f7357f095dc39ff642edeb6d7df206c37ef01c14a1daa280939d44047c5a935eb18049c280ce00238ad4fdfef6abe7399dd8c6fc815b7c70b22072465453"; + sha512.source = "2a12158850d95a2008e5a845914293cc9aae54dedd54e4a13a27899b0bb8c272e43bba374447b34913f7b4aae01aff9b9fee981240bed93f8995dfc53eefd2e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +ifmslide = { + revision = 20727; + shortdesc = "Presentation slides for screen and printouts"; + stripPrefix = 0; + sha512.run = "c9027b8bb34f15e667e530a8b8d57b793ed16a7ea33feabe58f22cd71230945905054e01853561f4cbaf5fe22f4aa140cbc95072f375d567f57bcce3c4d07d09"; + sha512.doc = "4e7a64773cc1a14df0d2f58ae0b66d1769b44958bafa8fdd4e51bc294555e7895632b741b47edbc29fc5f5ac0ddd73dddcc16723a7297c12311d3915e88f633d"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.47"; +}; +ifmtarg = { + revision = 47544; + shortdesc = "If-then-else command for processing potentially empty arguments"; + stripPrefix = 0; + sha512.run = "b04aebac5acfe90a149f417cdf0d45b3a7cbe53d53d4d9f39d5badddfcb894e07f397933199bca702f3f0e66458133ba17feb5ace2ebda4a25bb24bf1af5d259"; + sha512.doc = "8f456c15ecd5090d2124a85b02c1ad100dc999064b258678cad3c444acae3e88b95e38f7ad1785bfc91f385d6bc1664c0b58282d5ef36e6cff9857b81176ab7b"; + sha512.source = "e30806ba6fa85737f67dbfbf7cc1556781bd4cb2179672e5b9980e7f625366d5627c69411dae34a9e1c0fc29c16acaf302c344d9d93b9dd4afdf23bea020cc63"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2b"; +}; +ifnextok = { + revision = 23379; + shortdesc = "Utility macro: peek ahead without ignoring spaces"; + stripPrefix = 0; + sha512.run = "a56c703e1830fa64432d1b3aa72d3dff52b17c0e5b90b2cb34f7dff974e51331f5d9daa2b5aba578a8bc4a73b693c9a3dd811c6d7e32379165cc7ec1349c541b"; + sha512.doc = "1eeb8d7627ad8887761e66704a8f3c848b633a4f3a5b094626b3c64888e6db95c25b8dbad4332887a6d9e866e4aada2816b7c7e7fd19c07dba03db38842886fe"; + sha512.source = "05422af6ee53e12ad124b314388811490304c5f42b81b17aa899e7cea5c548395043abf4abfd0d4819e6338b6d93e99c57929d18312f49500f0368038e440495"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +ifoddpage = { + revision = 64967; + shortdesc = "Determine if the current page is odd or even"; + stripPrefix = 0; + sha512.run = "2a750da3db6bcc2c08f4240874d57c4aee1df4fa42e695156ad08ea5c1e187061c8071f621d3cae9365f28853c44e53a94d7702ccb4972656d096ed4d1272524"; + sha512.doc = "924f08c94634f1149f8873c626c4b73cbbd2a6fba0ed28f1199b6688fd8940720643ba672d781b28f6802c1fc5dfed5928784a70436d492f4bc51c6d43006119"; + sha512.source = "1a77f0234475293f72afad4b2db4e5b861236b30a80172460be7a4bf0b734a4a06a2f69018415b80bba11bd68bf4a36a953eaccaf11efc93698f1f779f80f071"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ifplatform = { + revision = 45533; + shortdesc = "Conditionals to test which platform is being used"; + stripPrefix = 0; + sha512.run = "952f87877c058c1e8ba3df227ed7332501e7861bdfd2a29878dc4b14e6b95a1b116459bef7f65c5bf277c95d08120c7e9fa9576a7654739e4a26125ca4d5c724"; + sha512.doc = "520004cfa412c2a24ece0e00b11d457405e71a446e554a1d930e60ea7dbd00f61b2b6a7ecbe89b62610316fd3b6fad685d7013042fa71fd7fb270b40748dee56"; + sha512.source = "a3c33b16decd5fb443d9b5bb13f3a5e0ed56705d353b0260772d81f963460ff7e914fb1d7f4ee24e249bf15af77368ddc6fea49014202389baaf035f2165e17f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4a"; +}; +ifptex = { + revision = 66803; + shortdesc = "Check if the engine is pTeX or one of its derivatives"; + stripPrefix = 0; + sha512.run = "9b0588af312fc3627687703f030f40ae421d9949d696891e9a60aca3c7582f0a534099685e8b8d5535df0d2f9dcd452f4219092d70c285d0fa65af6d140b7afa"; + sha512.doc = "a65a583b033509fc0a41fb65c6ec17357c0e095cf09d6f5d2b9b1f8e5fa323f368cd381941e8850bc1fe81a213dd2bbcc3d9877c08d50a5a78efedca05a7897e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.2c"; +}; +ifsym = { + revision = 24868; + shortdesc = "A collection of symbols"; + stripPrefix = 0; + sha512.run = "ef6615a3768f87009d22c3feeaa074a0589b17efc8585a509e21692195a100e5b11e2d0849fa2eaf8f80cbe0d96ea12e773aee0be28e7120ee80a86dcfa6f8e2"; + sha512.doc = "10dca0c00a52d9d9775bd2ae35b50d7d56294da9b8eb21f2bc35f7863cbf1ab357cf8f3e1d949570ebf4908a60d9ccfe604e69fe779780c8e7527172f3f0e999"; + hasRunfiles = true; + license = [ "free" ]; +}; +iftex = { + revision = 61910; + shortdesc = "Am I running under pdfTeX, XeTeX or LuaTeX?"; + stripPrefix = 0; + sha512.run = "ac7958c10c0cd5ee3a82273632445423c347bc9c5fc2015b97fdb7018d7a07b7e1316761698973b325314e945fba6c86be0dd49e058ecf74a55ccf2b9df8774f"; + sha512.doc = "d51b452532fcffce4b1078ab26396bc4f8739e2c3025917b4ce88af2e5aecfbe0a54e481f1683afe2d25259c6f73e27be8f257beb1b599f9817dc37df427fd70"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0f"; +}; +ifthenx = { + revision = 25819; + shortdesc = "Extra tests for \ifthenelse"; + stripPrefix = 0; + sha512.run = "76235d3f8dc4e62604828beaf87327d11d4a9ff69061edf1a3ed4c874983251fba75d80973e54fb3daa2d160b27000089f4cdf1c29748124825fb4075b6f7148"; + sha512.doc = "efc4fa3b5d6e91d1d5af27846bf2652672a233537810051b2858c1c4ffacafb9771b2c3a222cea4d490e0478eef96b205c4043f4957b876b7f4d57903b26454d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1a"; +}; +ifxptex = { + revision = 46153; + shortdesc = "Detect pTeX and its derivatives"; + stripPrefix = 0; + sha512.run = "7bc52847fe21879614ffe673ebec74c735c70e07d63649def00f70d22db80faa920f0764f76c5094ef982abbff8202ca55410ee92d033c45ec43fd25adabb23b"; + sha512.doc = "1bc4feaacbdd33ba6f46c699969638cdc8a4b962287332476d0d163a10141136f9b913027ccc3418033dee0862d5e572957dbe07d47371c1d932103958151e27"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "0.2"; +}; +iitem = { + revision = 29613; + shortdesc = "Multiple level of lists in one list-like environment"; + stripPrefix = 0; + sha512.run = "b2b37e68db2b33e414ecbfb9078b60ce5571b7ae931ca828a3c668ea7cccd7b93a2919cadc7723daa3f63a7015939a8046973ade140fba01025dde0d5212edd0"; + sha512.doc = "f9f001123e1f49bd90cb3b24448e423068565c9256129e23126791e2ea2bc39788ff5769939d90018087beb1b31fbf3568c6d4962f2e92205717c84aeee54a21"; + sha512.source = "e24eb4a7a6a635b95b6a1b40d27651eccf86a6c5276aad3ca46cfde08185371fdb34ac2732d87750db74605c14e087d2102399e23ad85a236a68dd5987784c0f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ijmart = { + revision = 30958; + shortdesc = "LaTeX Class for the Israel Journal of Mathematics"; + stripPrefix = 0; + sha512.run = "a1fc1aca9f557ea9c8c70343ad1e5712a846b8a7edddf2077e78fabc3919b928a5d7e8b1fee0f0bc29ebf7887e26dcda5bd95f2ba613051e52f13f1ee24001d3"; + sha512.doc = "502aebf377c8b13d7699761651cfd67e1e2d10a8e8a022303921aa1e708fe913b217e186b4e2527d8ed81e3db6ff055dba5edbea218d6b9a92f679da66fefe97"; + sha512.source = "e42bfa6ded16f78b764d1ca55e905ae0b2c0a5611b8ffb2e882f121d04855b5f72bf925002bc322cc1106f68c7c68ebb412acc71789d560fbca12051a75860e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +ijqc = { + revision = 15878; + shortdesc = "BibTeX style file for the Intl. J. Quantum Chem"; + stripPrefix = 0; + sha512.run = "55f7693a820f0cdaafe8697ad352cef2748471711113cfa4738931926cb4d49497f4e825b0a737c233541203cb5c8f23dc4f8326950520e8aa0f4ad27f353347"; + sha512.doc = "6b94eb95d58a06b54a1fb28b26ddec15528ae99286a37631a64b4ced32343872a04b96cb2de540d54c54f02361981ecc575ef7d014a17e1d0111883e92671fad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ijsra = { + revision = 44886; + shortdesc = "LaTeX document class for the International Journal of Student Research in Archaeology"; + stripPrefix = 0; + sha512.run = "9d5db4217675af4577fbf9b7e8a5dc4a42f447e7af60a818d740327326d478afa9071be37c80315b0822fec48d1fefe4e3d6a8dfddb6f34fbc11cd81a5d05a12"; + sha512.doc = "a3424b8ed16d1881c5a2c4d80a42277a1c0e3a62484a0d5ee6a18a9ed9fd39fe0de241fefbc723960bfee331908bb5c95a0b1b95ecf5e06d6425ac8e6c2dc342"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +imac = { + revision = 17347; + shortdesc = "International Modal Analysis Conference format"; + stripPrefix = 0; + sha512.run = "5e51d080e18f2a5d9529705d0e8745a8c7b2d0186c929e04434b71ed356df3ee2456c268ce2232da9cdbf6c15182f6580b2b96995a6c48e40fcff1efb001cef9"; + sha512.doc = "df4232356db6e2001277bdd8de706549d2f91b2d59d4a55f39c4aa9628e1a2b6ce092a7630ed4fc20096d069d19f2ecdf445129a870ca8bfc9d87e522350798c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +image-gallery = { + revision = 15878; + shortdesc = "Create an overview of pictures from a digital camera or from other sources"; + stripPrefix = 0; + sha512.run = "0435d5011bdaac97c6f36202a03cbe52cb45f83d7dcf37111b9c68706e4cc971b5b13ab5fe0b29cb296f7af4b217a64b5507ea00dfe63e8496e10b5adefeed8b"; + sha512.doc = "ae9c965bcaeaae17b8a815bac824093a5834f2b96c99bf44527d915ae251cf1dc818279f78d3cbe75e51875e658d47baa3b9657e27f5121ed4e259ae5cc052b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0j"; +}; +imakeidx = { + revision = 42287; + shortdesc = "A package for producing multiple indexes"; + stripPrefix = 0; + sha512.run = "6ca0680f29daf88dfbd26fa87d47a65c8b2c2d534321b814ff78d77d0b97d7fc5654b4dc0b91d12eb0c9373cfaff5fac59f24def8d0f50d97da34fda6f839d84"; + sha512.doc = "a07d9461013045274f03145e97d286d930055c4573e917a78e8913841cae30fb61b99e66d098b4ba014cf44e92982301c7d72414e3ce1df176bfd35ecd26ddf0"; + sha512.source = "f3fd8e1a5057cbbfea56a0d21f16bb310fb815ad7363e284083f2c313ac055b1b335fc1c43bbddd1b1beae64ec42e29bb4a194056be658cfd3ee24e49d5e5804"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3e"; +}; +imfellenglish = { + revision = 64568; + shortdesc = "IM Fell English fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map imfellEnglish.map" + ]; + sha512.run = "59c575a0c08ea995ebdf871c627734e47d48de927f3176f7ebfe54fc9f73d0a026159ac75e5673b180ac3cd5b8af9bc59aecc9879ee1a30084609c3d5828ede9"; + sha512.doc = "ca9e465e985ad5568713c5cd79f4b6d8b0474ecff9e35356bb2c88cbd6e71e451c44cd9e407bf0e8b15b4267d44bfce2a64fcc052a7f4be662b560695c34a865"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +impatient = { + revision = 54080; + shortdesc = "Free edition of the book \"TeX for the Impatient\""; + stripPrefix = 0; + sha512.run = "8c606388baf92ebfd113a2e7332c479f1428f4c9b2c5b27f04d9504be29ad20e38b3b538366c2feb78a43998460d362156e9abf8fdb3f8457ff4c8452aeb2141"; + sha512.doc = "7b0811a691b9ff35fe245df7929164420f2155b4797d372988c7cb7f6052291c5735fdf44a0cd3f7a956be9dec424b5b59385b3f147f39b5beab7b56d1eeae1a"; + license = [ "fdl13Only" ]; + version = "2020"; +}; +impatient-cn = { + revision = 54080; + shortdesc = "Free edition of the book \"TeX for the Impatient\""; + stripPrefix = 0; + sha512.run = "e75363bb36568ec42f13217dc740b839e109529e41ac9cc713e8c7eb620e557dcc08d20f36cbdb5f0e3145d9201d659fc8478d40fae4862fefd3eec005a3463b"; + sha512.doc = "ea0918afe1c785d864bc280a6b64a87cc62cabb02540cdf64a7cbf4b8f81afcef9ac85a6f28b5bdbb42a75b6ce1e12139c12d0e1af4183a28115f8d740c6e78e"; + license = [ "fdl13Only" ]; + version = "2020"; +}; +impatient-fr = { + revision = 54080; + shortdesc = "Free edition of the book \"TeX for the Impatient\""; + stripPrefix = 0; + sha512.run = "f6a9a69ded33199fcd46d518fe8ed7dca48677c78fac5f90cdbbed2290558c4a9d7c9b0721c188023384acc97ad95df29565b06abc16fa33deb04490ca50b4ac"; + sha512.doc = "963a379e3fbf422f4f4d53a41d6bd074fd077360908eb0db1db0a50699e12f37dc6b3ec8b42812604de4ea444ecb38cbfc81d3445cd67626a65fa9b520fb8550"; + license = [ "fdl13Only" ]; + version = "2020"; +}; +impnattypo = { + revision = 50227; + shortdesc = "Support typography of l'Imprimerie Nationale Francaise"; + stripPrefix = 0; + sha512.run = "7afd6cf1fc2738bda4f390fe7f2f9d5e1bdd33c2e6bd32b4dda5b232005589f38436813d9e5effb6feae6371896be453b608ed61c64b9bf38fd25ec400c4b101"; + sha512.doc = "086b106a965e0f469cbf3560561da7d84e4151d5430d42d87c2c52568243305e20a1bc99ec4b252237f4c61369127683ff7b629013af8c76e9dc8ea6e551e24c"; + sha512.source = "5bf181ff35a90a1d5c7656f7ae9778305088035370cec3542fa451b055cdad6d3b1ac1cf830fb7ab7ba3d4d89ce7b96a1112575f924fb13f24b1a90fc84e24a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +import = { + revision = 54683; + shortdesc = "Establish input relative to a directory"; + stripPrefix = 0; + sha512.run = "96a92584b4ff4a4bd3b345b446f2802e34d59ebf8c14469a5b5331e6d2f92b63f42d8f5799bdcefc9ae3f74e5e6f93aad7d5371dbe7d21e84ced3890a76c7a19"; + sha512.doc = "967d456dd18c8838db7d2ed64016fa0f77f2ed475e5cbe36389414849786d7e7850ea43e8bb00d8aa06e3ba06f62970a6525ee1b5a5109f8cbc77a0baf894b50"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "6.2"; +}; +imsproc = { + revision = 29803; + shortdesc = "Typeset IMS conference proceedings"; + stripPrefix = 0; + sha512.run = "12ce0d8ccdcd54890f846b501cc5cf7af00f7759c916147c676358b689b852a86a1981b76a14e455a4edece20ad1857100123f91469dfb23ba168177e15fcafc"; + sha512.doc = "a4007fe80cca88525dcade8d8201fb82a2c35cafd7bf92a8ebe6b4668ddce6bd43e958e1223d5c212e91ca692df39aae84c4a25b6862afa3aed2f1f646eabba1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +imtekda = { + revision = 17667; + shortdesc = "IMTEK thesis class"; + stripPrefix = 0; + sha512.run = "ae95a9d52ed07e962a9d98cdcad868a9d2dc6e1eee82c38fceda7f7668934caab5062727e75ee3b1824ec60ad112f15541c9519fd494fa8199caaf0e83906484"; + sha512.doc = "6f854d85a7649b49b3c88d99f1f011df514b39064e2c340ae1e807de3e730a46a432afe178574105a414bbd46ae0509b9e88d6c0ff825e74dd55772ed189427f"; + sha512.source = "c4285c9099d8a2582570d0d7df327e6f693825a63c7dbbd6626361d9ceea83a039425b295e17de133fe51e43a23ada74e5fa83d0995fd4a6528eceaad2f59461"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +incgraph = { + revision = 60810; + shortdesc = "Sophisticated graphics inclusion in a PDF document"; + stripPrefix = 0; + sha512.run = "06c7228e1ef4d760f6d7b1d308d4946eef7a55a60ff39bba6bdc6a96407cb6fab9f47dfd2c26f37d4f674d815e0ab7196badf2590638e214c980d26343a6bd55"; + sha512.doc = "3e37591fd1c239d2feb262434a5782be0160104392f6b6c2f330aa30d8e8af5905694a125d29045b403239d67952bb88d1194a1d1e61194e82426405fa11c772"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +includernw = { + revision = 47557; + shortdesc = "Include .Rnw inside .tex"; + stripPrefix = 0; + sha512.run = "a2b43d658ed62ff3a301a1b190cc46f04a4a46f413ed4af3e0f84f1873efc6841cd23fc07d68a90cca50b6ed00ccf654aef9dcb6a8b4863277b06c7e8c666e6b"; + sha512.doc = "8ebde646868cebadd8d50cfca25cd8d924c0112129ea86b0ca3ae5b9f9f4e4fec3c1e464486ec0f92e5cf7b7fe3df1fceb1a7967bfec755c57645e6909705c0b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +inconsolata = { + revision = 54512; + shortdesc = "A monospaced font, with support files for use with TeX"; + stripPrefix = 0; + fontMaps = [ + "Map zi4.map" + ]; + sha512.run = "3b33a1627083b50019e0c66ad49319d3ae699943f217daa21f57b19dd2733d29c6f1e9fbaddc1e3e39ea96623581b1d6a388f1a0009e84e4c3f381887b05d4c7"; + sha512.doc = "9139f7769536398c2822c41fe1fd0850a81fb54d70524904b266c8e231c95e344e27468187f474d51a9ab8c4028d6e5f9cc4513d1b38e306b739a1572c387e88"; + hasRunfiles = true; + license = [ "ofl" "asl20" "lppl13c" ]; + version = "1.121"; +}; +inconsolata-nerd-font = { + revision = 69061; + shortdesc = "Inconsolata Nerd Font with support for XeLaTeX or LuaLaTeX"; + stripPrefix = 0; + sha512.run = "dc202282d55ad63ffbf39fe7b36edbe42391fefd1c1cb0fe2410d01c562fe8024ac007ba235999c5e369a0d80763fdf80815d2beeb7dadba0f39d027fea507f7"; + sha512.doc = "00fa8ab8a508a3bac281ab2d7f63fbabfb6958770d308184e0fda7924383dc22a3b36d5f4dff701cda63e847cca819d38b45a0d51f634e1f503d5964fa60d9e5"; + sha512.source = "867f875d6b1211fbc8d223df7f00030d28ed13336c639f83251fc3b930e75f61d12daf93cf46943a9b2a3db883cd2e9c8b759f19f85562fb589ffbe2f01ea344"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.4"; +}; +index = { + revision = 24099; + shortdesc = "Extended index for LaTeX including multiple indexes"; + stripPrefix = 0; + sha512.run = "2b9bed00e12b5aa7b1813be766ba7c2e1eb750dc270e9eb585b1cc3d559a3f0c9094919344aaaa51cb6cf7cc132a5f89f8c07c96a12c5b1a5446524d07f4121e"; + sha512.doc = "0e68aca1c5dda444aa42cb1883821f2003c450291191b2eef16169f3f76e03e5ec9d31577574afd8d3b10237309be303538ccd1d4c8edb9757e7c910da7c5f51"; + sha512.source = "fc9e646c54415a14e41f1adf9894e723ea8d25e1d151b56fe40e5dd437a4659535b11eccbe9e2b6077d01a7a83b044c2d1d2b9aa1b08243d82b5a37a70641c11"; + hasRunfiles = true; + license = [ "free" ]; + version = "4.1beta"; +}; +indextools = { + revision = 68555; + shortdesc = "Producing multiple indices"; + stripPrefix = 0; + sha512.run = "decb4d3e7a2504f0f08f5e907eabcd961d1900cfce98e79cf8d7745868564eace7f3fd1217de69d615f9267630c71f9289a0519dd9f3b8603be6544ce6d1cad9"; + sha512.doc = "d2b1ed9f2d79bab4dc9b69b09eafc3657c2f60002d53703ec01e7cfdd29e8e9ad4027fa46563d50ea89bc2e63fa7b6c71ce2e37caa5e37838b6cde2f99ed97d3"; + sha512.source = "2d4d637e3cd9e6dba00104c0ae58021211cf8b10d8d44bcb9c3d9af1d0680e4539187947f6c685acb8ec194e8e60c447e6dbd02cdb6b8915c8abaaf8b991b39b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7.0"; +}; +infwarerr = { + revision = 53023; + shortdesc = "Complete set of information/warning/error message macros"; + stripPrefix = 0; + sha512.run = "a41fd6f2ee199e460950fdd31484be7e949a5e36ca740daaf3a1ffa01103d865f573c8ffe0859a8629456786cabf2f1751dbd828cb5d26356b1973960c854261"; + sha512.doc = "2830f622e2ea8e5b3427a9d924dd5f45f0c63a8a6de82e261102ca2c3f3afd7b781a7e0d50903dc8d8c1bee0674503f3ab935fe81dd9490d4310650097c4ffa6"; + sha512.source = "ccc6e1f7a63c10fed449c390b2283ac44b94c33a453f1146658082c888723ad8223bea01b71545d7f57f89fb8c8373f1a8329aab7255b7d17fd36853456cfbe9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +initials = { + revision = 54080; + shortdesc = "Adobe Type 1 decorative initial fonts"; + stripPrefix = 0; + fontMaps = [ + "Map Acorn.map" + "Map AnnSton.map" + "Map ArtNouv.map" + "Map ArtNouvc.map" + "Map Carrickc.map" + "Map Eichenla.map" + "Map Eileen.map" + "Map EileenBl.map" + "Map Elzevier.map" + "Map GotIn.map" + "Map GoudyIn.map" + "Map Kinigcap.map" + "Map Konanur.map" + "Map Kramer.map" + "Map MorrisIn.map" + "Map Nouveaud.map" + "Map Romantik.map" + "Map Rothdn.map" + "Map RoyalIn.map" + "Map Sanremo.map" + "Map Starburst.map" + "Map Typocaps.map" + "Map Zallman.map" + ]; + sha512.run = "442ffe7585c725c62cf9edf86bccabfcc0406b7517f145567c952ff0de65dae94158f586a1c0081afc5fe3320494750ddc6f455c78ba96e91f409bb0f5905d8a"; + sha512.doc = "c8e837291eb7dced1d4bc4d94e7e6bc042ebeb5c561ad3688a491f451991f122896d7df01040575ac6fd705d3ad55350e12afc986dd619c4303ba2919f64dc6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +inkpaper = { + revision = 54080; + shortdesc = "A mathematical paper template"; + stripPrefix = 0; + sha512.run = "d07bd9d2f32981607f4baf3bc348fdd99aae0c331423bf1f678231a2ab9830e4a824357df067e52643e6c89ecd1b850afb2444686fa33d75e6a3e598b003553b"; + sha512.doc = "acc6ffc291db3164d8428a50ee0792907435b90d3677a0e9ec883e0d3b81b6c04785a08217bd6c9554545eb5bc328a702c2958301245bcce68949ce76726c389"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.0"; +}; +inline-images = { + revision = 61719; + shortdesc = "Inline images in base64 encoding"; + stripPrefix = 0; + sha512.run = "8cb6a0ba51ddbc06a795dc21c40ca4f18921fa978cf17254aed279e85e769b29e7dd6a0266738e5f52e22bfed87599e6b2099bb04aa656397f04d6d51722c56d"; + sha512.doc = "ce56e90e90da8ed441213eaedaee7bc388714248547524701ad49021899ef439ae78884ad1de6e60cd06b5916649403d75ea7fda051fd3b87e89bfead9ccdf10"; + hasRunfiles = true; + license = [ "lgpl3" ]; + version = "1.0"; +}; +inlinebib = { + revision = 22018; + shortdesc = "Citations in footnotes"; + stripPrefix = 0; + sha512.run = "42e158a9ff10dc165345bd08b18fc0f90b463482fbb824872289edf93269b36b04faaf35cd12538e83ef1e509b7400ee61e604c5849922106368624c6c20f507"; + sha512.doc = "2a00d2f51daca68362b5243d8cc485bff6f64fbb9156d1a221d75dc5eec001c3377e6d67afe5d6384ba3f7504eafd65919f5afca8e1170f8b584eb101c947faf"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +inlinedef = { + revision = 15878; + shortdesc = "Inline expansions within definitions"; + stripPrefix = 0; + sha512.run = "b98b83ff26b5ecc9826f111d9faef5aa0f51ebcec7978881da2a61287af7aee022dc1b7812ee457885c7813eee0d2200d250ef45648619f3d105e2df54cd21d0"; + sha512.doc = "6bf73914a9eff5d774ca7b7e37a859b0e7da3d408bae603b74c9f76e379ff6d3558d7e30ee4a246bf3f7d40f18446fc78299edf4eda0228e2f22e47ad09ea024"; + sha512.source = "ccac53e2ce8ad0fcfadfedeca45d136ba94bd51d46fb4b860269f2efb7c0996823d32ee1935a0dad79ebe69c9794e2882e6dabca0c5751b3e8b25e5329623953"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +inlinelabel = { + revision = 63853; + shortdesc = "Assign equation numbers to inline equations"; + stripPrefix = 0; + sha512.run = "66d105c71bd5896019ec584a4ca0a26fadadd8d922be95ec7c8e0ee8f9b5a265304359a19ad77036e8bc885ec0e786e03ee8e1edb72addd1adb5d064eb40ab08"; + sha512.doc = "0d70c8f7d7b9f022444c95657b3ecef395790ca80697511e8ebcef975ae19edbfc43abb223bed03888943203e870e8732cfb37f2f07e0e4e2575b8e2d495f8ce"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2.1"; +}; +innerscript = { + revision = 68776; + shortdesc = "Small modifications to math formatting"; + stripPrefix = 0; + sha512.run = "7b647763f5a535f45a7741c3264fb59e2223837a9c99617aab870b624122783e25d1ce2f48e14fa5c1f01b660e5372eefbad3df51c52cb414ba675b8bea18e51"; + sha512.doc = "406d30155e73e13eb51967e3902e1fd2d76a92aa29323306a8769f9b4900323d288d1620a2a85ff76062e1a7b610bdddc06b113e15cd1479cbcb1bbb25b4c79a"; + sha512.source = "caf662052e89c10a1f6da8f671aa3e30eb4738a68b095146339f9c0cd95cfdeaebee30869b5c7c92bcff6ebfbfe526ad6ab032d26bae93e671707dbcf3835218"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +inputenx = { + revision = 52986; + shortdesc = "Enhanced input encoding handling"; + stripPrefix = 0; + sha512.run = "5550c1d76a0906f47ac3e2303fc57ef9ad1c8442e12e3522826dbe7fa8c971c7ca4241e0a1707f6e10336855eded20e94130a6db212b787383282326aee8886b"; + sha512.doc = "087bca2b38a73530b19dba7343cc488b39ab505ce00b4c622f56f9d40c448e6349052e12358cc8fe6d8db7039c6af4f06910784795a2cb1e69b85eed423d1314"; + sha512.source = "a633d0ba777e0342fe99d1ee8d9c955fe159c4a881f31c46fa205078c3b1786edc2025f58ac88b7dccce0c6bed50e8f44025ebd43b28871db953a34e54b3aad7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +inputnormalization = { + revision = 59850; + shortdesc = "Wrapper for XeTeX's and LuaTeX's input normalization"; + stripPrefix = 0; + sha512.run = "ea1b93d71757875867fb9d899399ad5cf95d2a0560b3caf2569d08480f4d65dcf4a963632dd27b1e28674a9b5c6496f769c17ae08494a6c37ca2d0e6a8fd8f04"; + sha512.doc = "ade22bfe8534389f117f0f99dfefd7e27f84ad653419929ab86ab045ff08c1d08952178c6c8d42b3b22d575e371ad4b77c2efda436e4b8ff89dad2bcb67c7d65"; + sha512.source = "048bcdc198cb028863f2f3f30366ab209f18fa2d3f76cf42ebd795cf34d92734e617fdd7412c3f5e43127a4853f1f2b3fe928c8cd554b5e5fde430b5c9170d47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +inputtrc = { + revision = 28019; + shortdesc = "Trace which file loads which"; + stripPrefix = 0; + sha512.run = "e6450fbeb0f9033b0bcc586c34f5bb8e9c3a6aae102c15912be315d14fe883b8bea62a59a4a65d0ebbfa9cebcc518b9dedf59297f026423ef14aed2c0a2004ab"; + sha512.doc = "4fe7894ee87bcb81566d1838f52c02902d8f5668662fdc016005e9a44b31f35eef8831143cdf5321717ee590ed14fc6c35305f584a0b63254549f96149ae2a50"; + sha512.source = "942d536481750f2272cf8b1420e13703d16231a0998b90c7f3335d4aa6dbd0cf1ff3b6ce072970b182fffdf14614422cc794798632ecc5ff41dfffb18c836398"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +inriafonts = { + revision = 54512; + shortdesc = "Inria fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map InriaSans.map" + "Map InriaSerif.map" + ]; + sha512.run = "9c960dca72d433a5ee20b2afe843b92fa98060e67638676a8e92ce9c7dde872be4bfdda6be7a76ea90db97e51784db4487ce22c79cd110ba0214ba54bc8fbe18"; + sha512.doc = "352e35b1b748f502db20c76f670c8eb6d02f672ee743518113a7b7807678ab45f2a628980229d8dae67df0dcd3581a5a28492adce8752a1a5f914fe550bab01a"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.0"; +}; +insbox = { + revision = 34299; + shortdesc = "Insert pictures/boxes into paragraphs"; + stripPrefix = 0; + sha512.run = "98398c838689cfe22ba859e2983f374ecf94b21bcf46de362056821af31285754717f7b2169f8bfb6fbbbee849449a1f3caf52d1397a901133d0364b392654ce"; + sha512.doc = "53baed8af86447a60bb1a97774778256fc4ad1f08f73e2172a68fa091c32e41bf84d10642ebb426be610e34ef5575999d15be7f0c5a966618cea5b3a3832c9a4"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.2"; +}; +install-latex-guide-zh-cn = { + revision = 69264; + shortdesc = "A short introduction to LaTeX installation written in Chinese"; + stripPrefix = 0; + sha512.run = "f93859b38da5da139942105175bb9c4f399934777fc04a7d267b45d7fd42cb792de40217221c6e0fee7db3b62ec3592ad0744f0f1a7bff52864e8762d58e216a"; + sha512.doc = "13042cd81cae222dab8ca8966702a28938f7f4b4a734905d64dba2bd819e610108078f0f81b3999b28a63dcb015bcb7941b177be9cab243fc9d01b6808ddf587"; + license = [ "lppl13c" ]; + version = "2024.1.1"; +}; +installfont = { + revision = 31205; + shortdesc = "A bash script for installing a LaTeX font family"; + sha512.run = "cd5133b93c5daabaa0ea13649f3d34c28f9af9f92db54917e64cafca5f5e7fe5169d87e36783036850ccde0002d34860eceaea528ad06e21f08141106e6599ae"; + sha512.doc = "2b61c4b229e0c4ec89c591075e52bcf8c150f5f9584bff94f81ec1f229940dafef11d6b6f84dd086692cbd99e6616685533d4313ef5bc48c56a7494fef3583b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +installfont.binfiles = [ + "installfont-tl" +]; +intcalc = { + revision = 53168; + shortdesc = "Expandable arithmetic operations with integers"; + stripPrefix = 0; + sha512.run = "e1087a7ab3f1d695bc20435ef0bb2b806d1cca71eb792fcf46e6c2fc6d819de2ff623a65593b65d5bf228309e3e3d5210ae1fb1452356f97a5ecb45921a7ce0f"; + sha512.doc = "f3cc5dba031957d77cdf39d902eeda96c8405efef52352109a7bfb187e363321d31120b4c66ed4b2e990fbd7085b927599a0956749e4303611cdbec5d9d7179e"; + sha512.source = "c3fc56d3ece265756a6c19684e7c2f9717df7f65176a640bcf6fede941468c8a426abb610ebf9955de920adaf2c96165f91f7314f48701121dfc4381f921d42b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +inter = { + revision = 68966; + shortdesc = "The inter font face with support for LaTeX, XeLaTeX, and LuaLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Inter.map" + ]; + sha512.run = "3e2799fdcbb3648912d99ae0fee49b3e34098204e742ffd8bac5fda212f3e452606124e5503f99a52f7f647b54c31858256e7e1dcee4a566f3ca8e9d5aab5eb8"; + sha512.doc = "64260a91b781bc0ca36a73e1b44ffc34847b26b977a950cefa27649d7382e9cb9d34f70f982831912489d86e343d4abfc81ae0d91302d3276aaa5c8567c3ba42"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +interactiveworkbook = { + revision = 15878; + shortdesc = "LaTeX-based interactive PDF on the Web"; + stripPrefix = 0; + sha512.run = "2afca3ee8051065d4014cae8ee751f085abe6e62ea0af7d6c036bfd9ae6c3f38a295857d67c7e8f75a049fd618c82ad8b28a66f5c83a387969549cbf20ef159b"; + sha512.doc = "cdc12a36f547787fd1e6aaa5f9dc38b99092f4fd7e71095c1b5ca25730b4d2a5a5fc1636798978741538624091721c96220d91b8f1cc29d7f4698767ce0269f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +interchar = { + revision = 36312; + shortdesc = "Managing character class schemes in XeTeX"; + stripPrefix = 0; + sha512.run = "8beb2e016e1a6af0199708355b8f13aa1accc614135cdf1d6dd534eceb6fd5a8d9e611e4d6fe0d72da9effdef446549b01d5ea2aad043f3fe94b81fd3d4aa188"; + sha512.doc = "c36dfea3f3f62660cae4f4653136269247bd109931b2eb6478eba29af089d42b6ea9f8afaf0c345c9364a68c1645e288d289345e13c8582e1639edaea20a26be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +interfaces = { + revision = 21474; + shortdesc = "Set parameters for other packages, conveniently"; + stripPrefix = 0; + sha512.run = "3c726602547ae05d0ca055d92b98a3cd5fce9709329fe9e769e5bb02c401a28b9b4cee53e5b1ee21dbb6c1c4223cf7a098aea227d615a45ced885c7c4ccab93e"; + sha512.doc = "a9b44711b1f38c48886f7b4a49b3a58ec5514995c9bed9a067d41cbf35dcc0093fcade7ef28693970f1f017924dc2f6f79d8c89a1efc847f7a8c264cb8f98ea9"; + sha512.source = "a93e77e7d12c91515e2d67f926ff6bfb76a278eae5880c60d2575580517d31f82d45656061f2999d5c4e73279a09dc5c5437351f10419b6ea92424d555e7e3a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +interpreter = { + revision = 27232; + shortdesc = "Translate input files on the fly"; + stripPrefix = 0; + sha512.run = "6dbbf39f9f0f357f45ae275458f03abfee625720b5f2dd3bbb5a78f60f4c0e8972d153c8d1647f147403f7c665e25147fd0c576cccb226a74630348a9f0a7381"; + sha512.doc = "3408bcb3cd3e6da67294c830870534d3cd620b7abc3ad35d4833e30c831bf93d11dc06d00547888268870c75f6a6e2e861448a0fa197e3e5a3c10aaccc6e4dd8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +interval = { + revision = 50265; + shortdesc = "Format mathematical intervals, ensuring proper spacing"; + stripPrefix = 0; + sha512.run = "2a2fe0ebdc4754ca74962270ec48c69e6574c13e446628f34604b13584e7b14ff33add55744f03a1d28443b5ae87ba79926816bf44781951a729913ceeb4d6c9"; + sha512.doc = "22dcf2288d7f888e76967209ef1fd31bef66dcb9784a45126a945c4a0ea302c67ab4a35bd864355b29679131cf2cf36fc6172017599ccf3025c4ae1537362b9b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +intopdf = { + revision = 63987; + shortdesc = "Embed non-PDF files into PDF with hyperlink"; + stripPrefix = 0; + sha512.run = "77477057b8c49400059eb2ec0ed1ec6ab8c5b80ad661871c5b179af60abd0a5904ccd1faf045951d83e29aec560a77188c8468cb9f854ed28676ce52c3bbbd83"; + sha512.doc = "07abc35842c8170da6763d070180f63505ce5fcc98ec9966b3e0b7502191ad267b4b6b0a9bbc6fe1fe037b0eb6e249c9ba9080669abeaaadfaa6be26ea86e5f7"; + sha512.source = "ab22656c6f47d03fd416e7340438a1c57e9ec1bcf360ec3224aa7c37859b1210807c3ba7b94d9fcf7e4a6878c9874332d3bd030cb7e1baf3f05f10077169d75b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.1"; +}; +intro-scientific = { + revision = 15878; + shortdesc = "Introducing scientific/mathematical documents using LaTeX"; + stripPrefix = 0; + sha512.run = "9919021461485fc22ed6ecc0b30d0a23c0a2217c76a07dd8acd87c9091c9d71be0e370ce1373f90e6f5a36a9638ce4312fc674b16ccd0846aab97d1b05674391"; + sha512.doc = "0daf84bdf7821aeb2f7971ed15de5546a13a444f3dc1b757f31490679350199fc893111109fc564aae2c8786fefc9e198e79e817bb318a1ad62698b6a5c79af5"; + license = [ "lppl13c" ]; + version = "5th_edition"; +}; +inversepath = { + revision = 15878; + shortdesc = "Calculate inverse file paths"; + stripPrefix = 0; + sha512.run = "d0d95399067922172799d17cc9b9b4fa7a79cf2928630c63441114c479bc60e72b3e5133b54f8f7925cbf90f5b419c89e07699ecf8e8269b43f969e584698043"; + sha512.doc = "a9dba77a8aa851a5e915e368c5090fc83fd894c22efedffce97ee0915b4ec50fa72efc30f377891b5efc0749c12018228ce400cd4024369cfb81ff3fe62567b8"; + sha512.source = "de5bfe7ac5967f4ab02dd0931c5799c6c68c5c7a57d8b6c40a205e76546d8a23a6ac6be292c6a1cd4c8475bbf0eb229b6d198eabc66a17b2ea4b0ffd0c798323"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +invoice = { + revision = 48359; + shortdesc = "Generate invoices"; + stripPrefix = 0; + sha512.run = "7ddb8e05d88321f45cfe8618c740671e17e79ddf53fc2c11a3b9224a27ba1ebc815635484f3dfb4c849d90efb859412028df1e7f91a4e746cf812b19e5d1a269"; + sha512.doc = "7b827f575eca669f15767be9fd215e827a3e98b03ea3e1f353039f5190fa7d75a5e59dd5d89ada982518101fc5164449843656c60a65679dd82061dbfcb95ea2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +invoice-class = { + revision = 49749; + shortdesc = "Produces a standard US invoice from a CSV file"; + stripPrefix = 0; + sha512.run = "d31a445c1696741dbbdeb4f035358cdabc9a4ff74855c432dd2b6d66b0d690e65e400207bafdb643a1ae7bee3b3472393043088521a685251acaf9abadb08769"; + sha512.doc = "a3ab71dd11f6aedcb7ce8a89f8b97f8a18ac4c610e3460fd13c1d31b8db0d347d25ff6520af7bd4d37453759d03db384df9e69b281307a36a1d05b4beed0a60f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +invoice2 = { + revision = 67327; + shortdesc = "Intelligent invoices with LaTeX3"; + stripPrefix = 0; + deps = [ + "booktabs" + "l3kernel" + "l3packages" + "siunitx" + "tools" + "translations" + "xcolor" + ]; + sha512.run = "7ef03f3c3a5c23774c0f3a495f949d5761f28a5d6316be7bc2a7b4039612fbab3f4aca9d29b6881a04948b9be2f0e6f7199d4ab8a41362e2d848f2ae8a090c30"; + sha512.doc = "9621a018752d18d9a5dd069e48a3baf3fa2f11c378304573a5bd9b9bc37ddd79366732f0b47f3acc878cdb68e04374db8371a1f7efec6ec6fca251a6c2b95025"; + sha512.source = "eb17a9ad06f67433b749e798783676212ca16dd78ab9a2029335c923235110e9c8bd8fb0654fc47417c60cd263d868789d8f86fb075cadcbd19fcd6142872121"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; +}; +iodhbwm = { + revision = 57773; + shortdesc = "Unofficial template of the DHBW Mannheim"; + stripPrefix = 0; + sha512.run = "a0a6807c8715dfa5f4ded44f66509ecd6af804d5dbfa44adb4fec3454f39be633fe17b79458106be0a6c35086dd1d3e33aec19ec657a6cb6b3903695b5019cac"; + sha512.doc = "ed3c906cdbb26c095f5078dbe961781ab1a31f8c1a7b926b0a8082b7bb41b71a8912774829135651937bdcc5f2e53880300cf9b21b6ce35430fc443d30423244"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +ionumbers = { + revision = 33457; + shortdesc = "Restyle numbers in maths mode"; + stripPrefix = 0; + sha512.run = "f964955ea6470a8906dd7623bd6959aad72ab4da5cbd4c32aa78cb2350cda05a1f577316ef97cdec9658deda027429462b70bcdad18024f255191b2f6cd7f99a"; + sha512.doc = "5bf57ed5617846d10834f880e4a1c029547f1ac678a52be3e79613803b4e6cd0986887f2a44a0a4bfabaf9134ef39c44e420a12047fee81fd34243ec42c5262e"; + sha512.source = "f7d0f56de1a00761104fa7e9aa13f1ca4b9ef97051ef2dd6d28dba3066998d53aeae015d956dec0d3c771d85f6553c5835e4a9bd9d83dd4feb65591d6c613fb4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.3.3"; +}; +iopart-num = { + revision = 15878; + shortdesc = "Numeric citation style for IOP journals"; + stripPrefix = 0; + sha512.run = "49fadfe2a8a1796131be814b170e270e7d39c035419d7e546e57d2ef1fea13d48b2b022eda463829e1bdbe60233d361773321d86070420ad2b63b48154adf18d"; + sha512.doc = "167b0612883558f74d7696a6c9481fbb75e9ef6e7760edc4f79d81b3e1d7a344dc1efbf638eb4f5ba69be7002391211024f7aafed2e08e19fe559b58b0f7b1b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +ipaex = { + revision = 61719; + shortdesc = "IPA (Japanese) fonts"; + stripPrefix = 0; + sha512.run = "dec0527223fdb0f897ccf54e96691cd68b933ac61de4c036e21fd35bff93d32766444fe6971492ce64328f92621bd2949ebb669ab33b6b6f4ede88280351292d"; + sha512.doc = "c53cf11bc81d9a8f5aa19c264a1970d4819400ceaffa20b688d0709546113f932b82b6b6d12cf9fb31b2a3d2c0d45b6b33ee3cb3bd0060c961360389839b1475"; + hasRunfiles = true; + license = [ "free" ]; +}; +ipaex-type1 = { + revision = 47700; + shortdesc = "IPAex fonts converted to Type-1 format Unicode subfonts"; + stripPrefix = 0; + fontMaps = [ + "Map ipaex-type1.map" + ]; + sha512.run = "0dd513aa3cbb9dba7e1099f7f08d839e80002fc5f5bcfc2a2a013dc799a0a6389f128fe72ebc32b673afd66f3ebbc7fab9b97c31763f94b7ad64eebc83b2f569"; + sha512.doc = "1c2974ec35c0291207ddf560b6cef4cb5b161fb59e80a6508b4f88aab5ecf93c6a3dda2a3107a40e838235f5af22ce23704bf4f13fc4a0b344f0805c29655605"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.5"; +}; +ipsum = { + revision = 68861; + shortdesc = "Insert multilingual placeholder text"; + stripPrefix = 0; + sha512.run = "72ba4708735350c0b1c6521d3ba09ca0477b203328c1452033755da7eca159b82e50ca0950f2eaba7cac41c1f27cfb28951716887e2736d9e69f29f91acd29cc"; + sha512.doc = "b53fd7756b3ac604583d95f6cf9b90d322ebee9e6a1f085607de710a2bfe3257d29394cc816f1817b0cb499a550202a0dd1578c9e7e04152e8aa132fea05bd3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.2"; +}; +iran-bibtex = { + revision = 69347; + shortdesc = "Iran Manual of Style Citation Guide for BibTeX"; + stripPrefix = 0; + sha512.run = "0dd643474cdec8c5d15ce28dcad815978d9e3a76d0327cffeff021ff6811ba2313e44a5f21a4ed23a1bbf09433c479e551ad0a49c0d074d38a777df66daefa9a"; + sha512.doc = "51f903f7ee725dc2ffe58d594e64bebe5639e5efcabcde15206ec5e9583f8d4771fd2b457f8a79b2fe691fcf77d03854d1f5cb291d0b33fb7f2d5272a17a18bd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.0"; +}; +is-bst = { + revision = 52623; + shortdesc = "Extended versions of standard BibTeX styles"; + stripPrefix = 0; + sha512.run = "491b40704ad4c36e7ffac12bd5b823a4d796a9d52b82176cbd9654b6fe07d3a8a0c63f9756070bd4a971a33836e179ce6c7609e5de2eebddfac9c6aaecb92b43"; + sha512.doc = "bbd5aa6261779b7d395a89c04421c680b6906f795ec713b9c72bbdc282fbf459c443a08ccc7c395ac5274ef5aa1b3f56cd773e50faa7ced4ab4629f1b91e73e9"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.03"; +}; +iscram = { + revision = 45801; + shortdesc = "A LaTeX class to publish article to ISCRAM conferences"; + stripPrefix = 0; + sha512.run = "6111c93a14c28572c17a1336fdf00ddd16b6c04b34b4a10a1b4a5e46742852b949cc99438397895de36632c9f2fd57c4940a0ffa458ac148b4a5e49707e5ca79"; + sha512.doc = "24f5ebac7b8bfa826cb9ebaaeac0ec82db18807c5c3417dac53c6b636f6cb32b60901ef51f0d545cbe185ef0eef034404d3120c1211bf65c4ed4d155c67e19d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +iso = { + revision = 15878; + shortdesc = "Generic ISO standards typesetting macros"; + stripPrefix = 0; + sha512.run = "1ee4026383b28594c02ee7a3fde24228ac777814456fd8580954b1708ba3f735b563beaa291cea859c6492f8b9cc488635b67e373fc3afbd8f884a3b6d30a392"; + sha512.doc = "f5c874d3e00fb451f81a52f5711ac0b1c39ce48eca50a6edc0b1049bf4aeec43830fb534e207d852bb440c96bcb86d960d5e2e0670610d7cb9eabad2ff1451a3"; + sha512.source = "c40bd267337a62dc7dbf437087e36e569b83da7806f801017ad3aa8b3059409cfc51c32d83e9991b7fa0c9b2e7eb5aed22f841670196fa9f7080e5398a098d74"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +iso10303 = { + revision = 15878; + shortdesc = "Typesetting the STEP standards"; + stripPrefix = 0; + sha512.run = "40a36335c15b453d2e5b5abc29b2ec1891c6f1502ee2f8ffdebd2f9a159cea3aa28eba7c661c12a0445a4f713b77079d8b965ac955123fc81225cfd4491e5317"; + sha512.doc = "24c2a83508282a348d6748bbf722962f3ffcd193cd1cfafc4ca1e87c60622e463e5fd382ff65235590f2a9d629e8f40588630810036d2195172f61d1448e3dfa"; + sha512.source = "27cb8dd236ad5f249595d963282054eb40de35d135cbd6ad6a106941955e0abf8777602fc341233d22feb1073980341d31b6e939a69097d3776d7e20096fdc18"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +isodate = { + revision = 16613; + shortdesc = "Tune the output format of dates according to language"; + stripPrefix = 0; + sha512.run = "5fa145cde64155e9a4ca7236cf41449169ce0d1aa88381b46935641ed94d166429c1b139c852f96526dda270fb85736ca54e8864c32452996109b0061003639d"; + sha512.doc = "75118f62de8568c9826dcc11b753511f57b7fd237cac6aab1c75377121fad2179c81ae5ec5f64ec127a299beb88abc209727d17b1ded623718c7594bb7ca5da0"; + sha512.source = "43bfcc11aefd2c68ec96cf05f7609cab4009f960b5220bc15d982ad384e062bc42a791f269d5480bb1582ceda68f8c7d36e1308129aaa3df41d25d35cbbb96d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.28"; +}; +isodoc = { + revision = 59709; + shortdesc = "A LaTeX class for typesetting letters and invoices"; + stripPrefix = 0; + sha512.run = "5bdd4158aa30923d2f06513dd2f1a729077eef05f8f6e068c1e376f931558b9ad786eea871396ca3d16778692f010bc39f25da3993c74776bd746ed5355fc0e4"; + sha512.doc = "ebf8ac1221592472837590973700603e0cef6b459dae92cc28ba751f5c3c0c49a686b4224c83502b09cec26ba306e44fc00f19b0f9e9c83b26f582a9923f76dd"; + sha512.source = "9240f497398b77b6633f5be4040d13053abe51d64189e6678beccc1110f9e97b24422105bb3a552ade1f33c1af3ca2f8941b5c86548fbf7885a799fa69345b90"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.14"; +}; +isomath = { + revision = 27654; + shortdesc = "Mathematics style for science and technology"; + stripPrefix = 0; + sha512.run = "c9ed49ca5df0932ab59de0988de688fa119682810c3163ec530a8cd80f439eab858bca4dfad85567dbc2de08d226117b4df5249ff29f247c208ae2b1739165f2"; + sha512.doc = "55d94c6b4cf4c2ebc0eae4998f8ed6a1f450efa70e1644549e169cabcc782f1acb879c99bec5237e3147886c696c36f675e9f3c452da9f9880570dabf7adc5ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6.1"; +}; +isonums = { + revision = 17362; + shortdesc = "Display numbers in maths mode according to ISO 31-0"; + stripPrefix = 0; + sha512.run = "d82a96c2208dfd59f091b8316d8b496115ee56d51e5418344f128418c3b202f0ee20bea505c05f5e81f76006e2efcef48b2d3592bb5c550e219b5c8e4a6e5f4e"; + sha512.doc = "5ecd4587ad6d782182986592bb7f76fd62ccd2e9245921b48ae28e9e381f4084e0d5930b32815ebd074be4190fcfd6beec8be890014edd76e9a5b4958f71d6f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +isopt = { + revision = 45509; + shortdesc = "Writing a TeX length with a space between number and unit"; + stripPrefix = 0; + sha512.run = "2e313aa3afe2e1457a794834c1c5eddec66ac2d17fb614e15e6781a23ca0834a3fc2d68632b07e55618c6d8dc28de5bb8bf435e34f61a419cb27fa53042d4a7c"; + sha512.doc = "94498c64a4acbb2b41a7e4869b628c683a975f1ba28a8b721b9c44843574610a47a39883f5333b405bb8c02d49f50c3d9ee4f344c27b5e5c0d22c181db46bac7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +isorot = { + revision = 15878; + shortdesc = "Rotation of document elements"; + stripPrefix = 0; + sha512.run = "788b712fc11f3e4dccd58a75a950752d0492dbc30f0475dedeb26b86e500d0d23c4babf0dfc2361fe16e74d7b37d8f5605b4d4faf1e7018642a5e9dd1be73be3"; + sha512.doc = "4aed42e6fe61aecba99783a1173d903daec621e7d5e0867f6f73319804bfa7727a2a2dac204d792b76a98f8e291bc563bff364360b19ccede2b79600a59260d0"; + sha512.source = "99767e98f2eca92d4f0d8e32024805bea9646f10eda7cdc7fa5b325de04d6e70648c1e1421172e2358d7a6ef7eeca718db3e31e7f272160ddba2f24e4c516888"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +isosafety = { + revision = 68801; + shortdesc = "Provides ISO signs and colors according to the standards 7010 and 3864"; + stripPrefix = 0; + sha512.run = "4f3997e5ab414bea29e986e1edd7b1436f82bd22b32e4047814d48058a57aa7ba042c88808784ddf5dff3926a1ec366f374e5e275df8e16e8d8a9b9c07982ac1"; + sha512.doc = "905fcdc25540ca0db66cc8fd6057bb71ded0016180b4efbcb5855e9ece8213d2091f387201ab44a2827fc4bb897f8cd9209b570b9bc23ab5c4b4293f5848c1d5"; + sha512.source = "38427c445a9a816c674a01e3ce85b1a30b6ccf06f7097e82bceaddf72e7d178bac1873e57061d76c37cd3b73abd783b1d35b16648f43485b3d80cb7ce5158278"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +isotope = { + revision = 23711; + shortdesc = "A package for typesetting isotopes"; + stripPrefix = 0; + sha512.run = "27c03c4c6519c038185ee485e94ac51d90c21fd095e4a4cb6d91b06f98e7adb7a423a53b1df035514f58cd0556ab0ecb1afd55c05008e558812d95de2159c8ba"; + sha512.doc = "e1a6e798f894f9455e5d2144a935ee2960199e65db0499c4a900f888065eacfce72269f6808e01e98be3ea3440144eb4004c53af26d80d6ddda1be5df5492b1f"; + sha512.source = "555ad9d5db22d4efe1373bf971f441391371c91538b73f3140996d3a2dda85fc3003f6d685c3e54c06be216e5b54493d07f165c0a7adeb00845e79bbd9958c5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +isphysicalmath = { + revision = 69343; + shortdesc = "Simple way to write nice formulas"; + stripPrefix = 0; + sha512.run = "5329b97930fbe9cc13c275132a32cfe4293bc23b2c1911089aaaa80baeb0437606c73503b4430574e88da61615d0649fea6f5666a5609a79ac5ca37cc90294a5"; + sha512.doc = "f044b6cbdcb63a5e66b6dfd396393a99d605a219ede55317c759c28c3890a7c79ff6c0feb1de8f6517350d15a6422dc54426b7b5169ea1865024e5a335fe5517"; + sha512.source = "d68bb0b9753303e844476ec27156dc22ba7f3c4456a26870edb080709efb88a2485f2b41bd3c15a89d7d665f22acbd206c951d0f817742d352f6997621188734"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +issuulinks = { + revision = 25742; + shortdesc = "Produce external links instead of internal ones"; + stripPrefix = 0; + sha512.run = "2ac24eb0e19b92e29fa898fcb8cca7e2f64cf87fac408aa0c834f6afc0ef262560a512637b30dcbee2ec06e9f0fc32f344258bab983b1b1d6fd4da85c821c056"; + sha512.doc = "2605ffe2f42560b04fe781efe3c1972ad76f6cbddc7ef68bdb0ece9b0573b8cec785c2bf4befdf339935730a728bf19b83f3597119d3f9705f571350e963801d"; + sha512.source = "c66f332f9dea7a03a0ecc7844d99375fbb91ca262aa50faac13b9b396db0991411b33616aec6c1af22e915e3643e7340e0083635fb40b6e693a4e487e1e45fed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +istgame = { + revision = 62946; + shortdesc = "Draw Game Trees with TikZ"; + stripPrefix = 0; + sha512.run = "40ea41a683ecff33942fb3287f57489079be48eb5e7512b04f5b7038da34bf9daeb523b9d15325444f27493119d2258302838b4a44becc7dad205504064cb5da"; + sha512.doc = "275d45c62d3e140b5a292e0499c555716a43ed4cd06c69c59edc49b0e832371d39b320de954452226dcdabce7a140a622f3d3d1e8acb69fdd4aa0c62b39fe0f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +itnumpar = { + revision = 15878; + shortdesc = "Spell numbers in words (Italian)"; + stripPrefix = 0; + sha512.run = "73770854d45bf404e874aeda0d0bc95dac7ba266cb012fe4af7c4e7686c078b1314500ddaa767b1652e9b05b02691c93cd24b34d6b145fc30c0a3f56693f6a17"; + sha512.doc = "b7c81a74d816508121f0449580e4599092bcf3d176cbf9f754fe9e662d83a5c8b66e52e43b2621338a13b09c44babac6a575f1e8894863402c028dc3ed792486"; + sha512.source = "72ad2e68d946f5a862e97c3cd3f20f94c23a2a85fa5183a6da9b1f03be60067a482b2f22e7560c5c731df18f910f643f0c991a2b0c09925cc270287290654c86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +iwona = { + revision = 19611; + shortdesc = "A two-element sans-serif font"; + stripPrefix = 0; + fontMaps = [ + "Map iwona.map" + ]; + sha512.run = "2a125919a015c82e00bff575407f02a6c9a176f83a6017df682b98af55473e7e36ca0a94ff27091a3a4279d42fea9c49f0d8ae6da7e852ae9c44389dd5d8f7fe"; + sha512.doc = "87128ca46f7f2f13f8f886fc1c3da11f17636637632c0d39ebae07dfe70ec92024e1136da7a736a3fc8d494e856b86407ef9c01cd54a56fc2e41372bc0f1c4fe"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "0.995b"; +}; +iwonamath = { + revision = 68144; + shortdesc = "LaTeX support for scaled Iwona math fonts"; + stripPrefix = 0; + sha512.run = "e0b87b6815ffbec37a52e0ecd1d31daacd46c222abb71566ab3476cbc2ec28128f5977367715bf1eac439f978d750b6ce7e7bee589de7a1f18bf70ab8ce166ab"; + sha512.doc = "81fb0f9b7b738994a4af09a8dda8b580f4d59a92f790f8b285c2b1a252e672786296472847a6d4d8ce804a757248dec04e02894d1550cf0791863d25d22f35d5"; + sha512.source = "b7aa315eb74b6fdbfdd75dc176ede1841406efb9bf5ba584fe090123f3e93b1f7db9719a321833d2486b0e5e7a0a214a4b91a8c1afb2443e126ebcf96bea5b70"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +jablantile = { + revision = 16364; + shortdesc = "Metafont version of tiles in the style of Slavik Jablan"; + stripPrefix = 0; + sha512.run = "40fb96443b2194adf8477a68d9d435101dfa42471d02ec48a37968d21e12802ff1feffa830484642b457562392b6ea147d394734acdffd735a8a5db421d0eefd"; + sha512.doc = "00e753a85f3521ac0c6f336e0e563bd0a68a5e2ae756dfce72d3cf59a01eb9654b6f5c9ad9b83047d3d4f7743b7cce6f2d0d734510532db13942ef6619ae813f"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +jacow = { + revision = 63060; + shortdesc = "A class for submissions to the proceedings of conferences on JACoW.org"; + stripPrefix = 0; + sha512.run = "7482562b56521fbb70325ad3b633ebfc82165d65149dd85b89697ff9b5941f580f43e42da9775c659fa4fceb8a2908a200258dc31162b013ad8a207b88a5152f"; + sha512.doc = "b53a0cdf5c3fe1eedeacbb438fbb453f844eff9c669946963e18c0c787aac744307d51804327dfbfebba1f88332dc01c40c43d3a4a50b5d2c9c8a0bf67840dd9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +jadetex = { + revision = 69742; + shortdesc = "Macros supporting Jade DSSSL output"; + deps = [ + "amsfonts" + "atbegshi" + "atveryend" + "auxhook" + "babel" + "bigintcalc" + "bitset" + "cm" + "colortbl" + "cyrillic" + "dehyph" + "ec" + "etoolbox" + "everyshi" + "fancyhdr" + "firstaid" + "gettitlestring" + "graphics" + "graphics-cfg" + "graphics-def" + "hycolor" + "hyperref" + "hyph-utf8" + "hyphen-base" + "iftex" + "infwarerr" + "intcalc" + "kvdefinekeys" + "kvoptions" + "kvsetkeys" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "latexconfig" + "letltxmacro" + "ltxcmds" + "marvosym" + "passivetex" + "pdfescape" + "pdftex" + "pdftexcmds" + "psnfss" + "refcount" + "rerunfilecheck" + "stmaryrd" + "symbol" + "tex" + "tex-ini-files" + "tipa" + "tools" + "ulem" + "unicode-data" + "uniquecounter" + "url" + "wasysym" + "zapfding" + ]; + formats = [ + { + name = "jadetex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "*jadetex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "amsfonts" "auxhook" "bigintcalc" "bitset" "colortbl" "cyrillic" "dehyph" "ec" "etoolbox" "fancyhdr" "gettitlestring" "graphics" "graphics-cfg" "graphics-def" "hycolor" "hyperref" "hyph-utf8" "iftex" "infwarerr" "intcalc" "kvdefinekeys" "kvoptions" "kvsetkeys" "latex" "latexconfig" "letltxmacro" "ltxcmds" "marvosym" "passivetex" "pdfescape" "pdftexcmds" "psnfss" "refcount" "rerunfilecheck" "stmaryrd" "symbol" "tipa" "tools" "ulem" "uniquecounter" "url" "wasysym" "zapfding" ]; + } + { + name = "pdfjadetex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "*pdfjadetex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "amsfonts" "auxhook" "bigintcalc" "bitset" "colortbl" "cyrillic" "dehyph" "ec" "etoolbox" "fancyhdr" "gettitlestring" "graphics" "graphics-cfg" "graphics-def" "hycolor" "hyperref" "hyph-utf8" "iftex" "infwarerr" "intcalc" "kvdefinekeys" "kvoptions" "kvsetkeys" "latex" "latexconfig" "letltxmacro" "ltxcmds" "marvosym" "passivetex" "pdfescape" "pdftexcmds" "psnfss" "refcount" "rerunfilecheck" "stmaryrd" "symbol" "tipa" "tools" "ulem" "uniquecounter" "url" "wasysym" "zapfding" ]; + } + ]; + sha512.run = "7406670d136a018d8cc7a7e39d4ce6a2b4b58e48c8947eb257a2d014cf69e923fe770f8fd8b38c726b66f6924d36adbaadf59dd9b6f1638a598dcb812a84f926"; + sha512.doc = "16e2a21e6e724d194f4af66dd67e66fa294332f05222384ba63d5ec76a52d0da12e6381b60735111078cbab8129bb7f7f039487a7a0fda61466e2409f4ce3428"; + hasManpages = true; + sha512.source = "7e28b294c84333b5c8b4ab769fd0907b6ee3b05e8cc6f729c8925029c9a9d03f5b81b000abd26a5b6d7158ed7465efc2f403a7c5a28786f2a23592e0deeea6cf"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.13"; +}; +jadetex.binfiles = [ + "jadetex" + "pdfjadetex" +]; +jamtimes = { + revision = 20408; + shortdesc = "Expanded Times Roman fonts"; + stripPrefix = 0; + sha512.run = "72e2dc3995f173f75aa4714c397bb036c140bace3b17ddbf321afad677ad397c2be804c890df472f89e15300d4645d02d8ce3746c33fa37be85a9d9312ece3a7"; + sha512.doc = "bc14db250b9d34e700c0fed6390948b39022f7ba39cc0e083c6a1355517fd10aaf7065f6ca90f40a50aa0cd6557a35cdfb1534aabff12ec6c462a2fc87ec699a"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.12"; +}; +japanese-mathformulas = { + revision = 64678; + shortdesc = "Compiling basic math formulas in Japanese using LuaLaTeX"; + stripPrefix = 0; + sha512.run = "35245333f0ad08ba0772aff54e5ed1b252ad1b1d298c55934ade4a0e33dec29fc67adfebcce22f10b61b9469a2a2d208c4b9977519271457f1538c4bba8bce24"; + sha512.doc = "cfa07138896028186773970685309030f587fc39f95b2fb0d993e2827a124ae4172acc91f9276ae65b32fdc614cd9525d557505b2f1fc11750a982a5c9cebb42"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +japanese-otf = { + revision = 68492; + shortdesc = "Advanced font selection for platex and its friends"; + stripPrefix = 0; + fontMaps = [ + "KanjiMap otf-@jaEmbed@.map" + "KanjiMap otf-ko-@koEmbed@.map" + "KanjiMap otf-sc-@scEmbed@.map" + "KanjiMap otf-tc-@tcEmbed@.map" + "KanjiMap otf-up-@jaEmbed@.map" + ]; + sha512.run = "30821d9e8a8de886fcd6ac64801771ee7ff48c7523e38946a8127579bf53d7ed730867d78573dfdcdc88017743929064eed1d4a5b474328ee2cfa7f889905026"; + sha512.doc = "80fec029e80a451eb9f53efc6e69935f9ee42063784a5f92784a595dab76532837062da90f3c3ccf8fea4e14b3cfcd339ba4e5fc539257c11e7726cb70ad2cc0"; + sha512.source = "c5ee59b3741e19c96f151483ab5444f3fc41dd498ef8a8a34f87dd087439d29b614fe3d9597d1a29e65bcafa47b570bbe119fbe6d705436fbf1dcbf9a6b76576"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +jbact = { + revision = 52717; + shortdesc = "BibTeX style for biology journals"; + stripPrefix = 0; + sha512.run = "0f1cd72dca41b37c26d863aa734737ad128f5c39c508db13a3e91e4088477a99d9978aa1ed003ba0812e276bb4d80e527c80915cd7a08fd1cbe968816359814e"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.30"; +}; +jeuxcartes = { + revision = 68266; + shortdesc = "Macros to insert playing cards"; + stripPrefix = 0; + sha512.run = "ad90719dd34791c88a5300d33ad7d633e650b3de6d61f493cf9069c39429f57ffbbde7aca1d2356a9cf6486701511fb7805049ed6a53ccbf49daa7a3dc5ab4e3"; + sha512.doc = "9c918a0cb97ac3b82a88fd104a2e084404b83b2c04acac44e5f566774a3c01d8c91b0a73b49325ab6d7d366c5849e69a60c28a9686049c009bc249cc9b04c7a0"; + hasRunfiles = true; + license = [ "lppl13c" "lgpl21" "publicDomain" "cc-by-sa-40" "publicDomain" "mit" ]; + version = "0.2.8"; +}; +jfmutil = { + revision = 60987; + shortdesc = "Utility to process pTeX-extended TFM and VF"; + sha512.run = "11f0ee88997b197ccb4cf249a92f90ecd08227b0086861b59752c2e17fafb1e1fec7a1cfc701d5df91497d4cb9e61d13f892d776ded07c34d7dab09a2a65eed4"; + sha512.doc = "045b74024de9798fd7c74442404dba0610a94f66b60455d84fc33bfe56e8612b014fbd83cfa3edfb0c3a8acb31c0dece69ebefb58294b2d271dc1dc2e95d094f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3.3"; +}; +jfmutil.binfiles = [ + "jfmutil" +]; +jieeetran = { + revision = 65642; + shortdesc = "UnofficiaL BibTeX style for citing Japanese articles in IEEE format"; + stripPrefix = 0; + sha512.run = "79433835a06c0fe268d90ad11bfe6a9956e49284cb2ea2255c4577883f2087c0c6b823121a563cb76f666ce74265a056f0e0b470dd2542a104894adb0242d083"; + sha512.doc = "ccdbc9aafd94956f43c7f78c93b02f067defb038ba6b9c649e38d1e0c02647c853ad391a1c2b10b60e14255b38c5d77aae9ddd260c8297e06084236c27d70073"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.19"; +}; +jigsaw = { + revision = 66009; + shortdesc = "Draw jigsaw pieces with TikZ"; + stripPrefix = 0; + sha512.run = "3ad1aab51b4fbd99efc6bbfabf716cfd27e4af71674b094053f4866e38ab4c6c3f8d1884bfc4e4f7cf0fef11abfc488cafdb696238c5af1440255151b1b2ca77"; + sha512.doc = "92d04e7497c19471f8aaa5344a1cc3824e18691daffab637a1822f900468269367244c984e4420efc94014cfc849ebfa4fd0db6e5b37cb1e89aa5493bdbbdb87"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +jkmath = { + revision = 47109; + shortdesc = "Macros for mathematics that make the code more readable"; + stripPrefix = 0; + sha512.run = "8e549db42b25c2edac71013afba0ebe3e09859ce4ef104da2b969663014cb88c10bf1c8899ee181070e6cec1b28d0ec9e5966d27f2176e2032d6855ded8ea941"; + sha512.doc = "99a954f6eb917333a8e6c4e3437fcd16f6950e0473fc1a48c99d748246c97d5a3df5b96e0314a9ec5e7c6bb0b318b934c40070ec94df00546e49cf140aef23c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +jknapltx = { + revision = 19440; + shortdesc = "Miscellaneous packages by Joerg Knappen"; + stripPrefix = 0; + sha512.run = "0369405034393ea8de2cd94497a97ba6c40264ec9142eefee09647fd4e51f83e169a99757a4b92c1c9d911637f137404fa54231de452bcd208ba3f9982984153"; + sha512.doc = "cadb522c007963278990e75a011e22d2c6bd8429e55fe5ecba3c2f20b9ae13fda4eac304bc405440c1c1566b1458e0f3e77a6d4adc77117b20673204bf502131"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +jlabels = { + revision = 24858; + shortdesc = "Make letter-sized pages of labels"; + stripPrefix = 0; + sha512.run = "5077471a09df4090e087a465e9d1823668ab80f088a7d5fea7d14559e9ea8906dae029a2093038ce5e9f013bbe3a9bcd74d8626e6ccbcaf7ebedd5c2f1e3521e"; + sha512.doc = "7736480f6736d8b623fac61683321eb7444ca8672eadf0da200eeca928de9dc031152e4599783d602e9c11b58463b03fc1162756edbaa5bd3dc1f6c5b64e08a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +jlreq = { + revision = 69932; + shortdesc = "Japanese document class based on requirements for Japanese text layout"; + stripPrefix = 0; + sha512.run = "a6ed1fc8706d9aa3bb759bfbf85f451db0f5f941b46c607217a0d1af653e617e56c50d4b82e0f376d212dfff5e4fc46f922e5397940931cdf2acc191f7c34ce6"; + sha512.doc = "01b804ec9c3447f50666e5bea40a3142c29b66aca69f69b2ea5cc7f4696b569744e55b148da26f6dd9698ad4cf580a738196c5b09fe0a0b831105251ebcf1855"; + sha512.source = "e6f452eaebc5b9a3b7a257dc1754f6aac822a92acac243b3301475f38828787972f8c15a34d92117c3036fd38f6a3c0b8895979234a52f3a65f518b129a601f0"; + hasRunfiles = true; + license = [ "bsd2" ]; +}; +jlreq-deluxe = { + revision = 69971; + shortdesc = "Multi-weight Japanese font support for the jlreq class"; + stripPrefix = 0; + sha512.run = "bf50a2ffb569202f6bf182637482005543ec24ac214287c3dcab234b6613430f4cb0e8d7a987bbd674e1c3442d57f03bee2df5cd1384eb29298b9f304a07099e"; + sha512.doc = "8a8dc59a0db9128c3d4db9a207beae6fca412ff9da59b7dfa32741f3cb770ecfe2d5ac1dd02521a938d82c5c15735f8e42ac56906ad59a097a5a150bdde1bc57"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.5.0"; +}; +jmb = { + revision = 52718; + shortdesc = "BibTeX style for the Journal of Theoretical Biology"; + stripPrefix = 0; + sha512.run = "6317f3437416ead3fa1224432bd2cae247614e614f888ea074cfc442b8c7c3832d0243988269a1d772172008fa377b142288f9644bb1e2954c3758c1b75f78a7"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.21"; +}; +jmlr = { + revision = 61957; + shortdesc = "Class files for the Journal of Machine Learning Research"; + stripPrefix = 0; + sha512.run = "95a5e59c8f4617b8d3d459a2cfe0730465d46a98781e4352debb9eb0c4357e74c8f519e77873a236f127dbecc235f611e30fbd7348818d9024a27fb8f0ff1eac"; + sha512.doc = "a481634eac642925340aa02323deee2aeee1577696abd435814a2f27d6e4bf6e61be2b2618778c762f3ec60a1e5067d634da74125dfacccfd940488b6a812175"; + sha512.source = "1dee8b499ad2c5427082a69b5a3a65c173a96ea298a05f94b96d448d8d7554d96819798dc724e1e8f55afdd1b25d9e6ed6e7f3474bd83af83b2f89add907f2c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.30"; +}; +jmn = { + revision = 45751; + shortdesc = "special fonts for ConTeXt"; + stripPrefix = 0; + sha512.run = "2e250c3f115911c56f9b8d46d358fdef289c624a5b24c9b4213bbf7818bf42c7b778df55d4bf181bce115b388915cedc90ef7cfa99ee6ad8dd621e7853fc7c29"; + hasRunfiles = true; +}; +jmsdelim = { + revision = 62630; + shortdesc = "A package for compositional delimiter sizing"; + stripPrefix = 0; + sha512.run = "83a76c353b38c9d5e432606c2f1667dac10adf54f844d9c4c7a9b8b8733a44d63db9e2c9e46b2ca54f427bca1d3bf4ef49d016c26dbad361b83d091c78708918"; + sha512.doc = "ef6f90a4b7d3738ff857158822fbc7b3dc23752b5da5845932f560fcaf83d67a22920e045448caae26eded760e34aaab375f29993ffb503d0b5ef3c8185ae737"; + sha512.source = "bbb2b6acb1e2a4be8fd02ea84f3f43b14675b7c02fcb036fbf10e59553411d4a19ad5bd6c087e7aebb5c7309d3ad6d19ccfc67d9186799159e0209f45bdbc5bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +jneurosci = { + revision = 17346; + shortdesc = "BibTeX style for the Journal of Neuroscience"; + stripPrefix = 0; + sha512.run = "1ea3d11a66045784c2d1abe0290d95482c5a2a65a21963a58d9626872b25bb0d20f8d1c3c3b8173bf7f63ed71f7c33e13c8f6dab0918585b36d72fa37dc35714"; + sha512.doc = "2ed6a342b376ced405a75da39fff51d03e9fffa89341522555d2edf8d8eca701013a95f09f01cbf642d3ed1ba93a1aecc89682986ae5c94d784f3c857eaaadb1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +jnuexam = { + revision = 70117; + shortdesc = "Exam class for Jinan University"; + stripPrefix = 0; + sha512.run = "bb4bd96084b70e0808ee15cf23f0ab721b6268074cc5544aa80c9a8b3f6c8a1784591859215e17846a606d7ca76d93ce103c70a8805a321d5833d59061e71192"; + sha512.doc = "45b3a04be31cb9fd778a2a264575a536750bf0c73b0ccb0fb68fb83d99fbe370a70c119e962a1dfbfdcc3da4056439e271aea0e06d7b7289e0c97f3bfff1d6e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.1"; +}; +jobname-suffix = { + revision = 64797; + shortdesc = "Compile differently based on the filename"; + stripPrefix = 0; + sha512.run = "b2e5a82d5bb8575e3708a3e2c30e23a3ceb129c6cd78882126061321350c3ad72e36ccf41392eca7556203be713530d3169bcb39210f91d720159c49975eddf7"; + sha512.doc = "fbe45bf364098e30deb8e040dfbb59b3b81cf53720793ca02dce59ec113ea57b86c1a3a8465ce6029ac1fa7b19b2220fdddc71f71285969e8f91eeafcabc3bfb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +joinbox = { + revision = 68003; + shortdesc = "Join boxes vertically or horizontally"; + stripPrefix = 0; + sha512.run = "c7ef7c28e11a64f060b37e1e17fbe54a80e1c5050bde043e77c42385037974a462598b66c3ab48a9d3317a6ce55a0af3a434465657e0a42d5568a127779c765d"; + sha512.doc = "ed665aeb55d066887e536ad545199809216a2eb84d9d81fd81e40798c7a69c5d14a191a73a8c2ee9fdcc6d36a8d206d07fbd72d427172eb9a182bbb3b4751cf1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +josefin = { + revision = 64569; + shortdesc = "Josefin fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map josefin.map" + ]; + sha512.run = "6be43db9172d51a84374aa836cf9e2baf02f087336685a37c321449ba06461f08b08a8d98c12cb3aba0dbc9c0e2e8b3316362f65c7393b9286ab50b11f70174d"; + sha512.doc = "cc41ce980515708238256db38ff05c74a22f78ee5a8f4dc63d68339a064799e1beacab7be71ec15b2c97a6d9aecc7a39064fcadf4d7c67ff172eb9b8f7a939db"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +jourcl = { + revision = 65290; + shortdesc = "Cover letter for journal submissions"; + stripPrefix = 0; + sha512.run = "6039789de2a03ec2568597cfee911d20b66db75ef4ca3c48cf9481ed2debd0226ccb605a083ba53bce91b74768e3d70a2e2ac077c630b8de33c010f917d68335"; + sha512.doc = "873b2e5636f6409f7b6c4c8c4a8c8988108ad4740df9fdcaef4e7998d3eeba0a2a26e84fac5e6c7b6534bafd120a3dcf066974fc9419e4544cf597bc99fdaeb3"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +jourrr = { + revision = 68556; + shortdesc = "A LaTeX template for journal rebuttal letters"; + stripPrefix = 0; + sha512.run = "cbd5484b622c865b7c42f8ce54a76e54a5cbde6045701cd8fbba54d17c8abc510c79125e7d335c3509cb9c674ce233005f9fcac703fa95f3297239c00c3be682"; + sha512.doc = "395fadb1bcc91eb1c3090f57d783b0b2deff507d22a4221258dd826d635ba382c4c4d00c0d341402374ba4bb037e39cb23efa2bb323652d73b0940ea89eb9f7b"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +jpneduenumerate = { + revision = 63893; + shortdesc = "Enumerative expressions in Japanese education"; + stripPrefix = 0; + sha512.run = "10bb936cbddc6e88979ceed208bdba424d4e4c9c388cadd3a9b84a767c59ea43362f11092907f98c16696f07134ed66765a8bc7b02ea0a8fbe9eb7b814760780"; + sha512.doc = "447c925bfe05d1c6657bbf2592bfbd16f80d9bcc1a3320635231153b90198f2e8010cef5d13573e84504d5a41b9cc6ec750054c00a9178154c4e210684919d0a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2"; +}; +jpnedumathsymbols = { + revision = 63864; + shortdesc = "Mathematical equation representation in Japanese education"; + stripPrefix = 0; + sha512.run = "c4f23412a83fed8ee870922d1e8e0c2e8a881989223b340de7ecda0851d45d504fa6c5f0cb70ceb65e2c07f5df0154f77f343787573a6265a709bc398e3add9a"; + sha512.doc = "0589ea6fa4dee93900753dc170aea295e9bf1103687fa146633589897292dff8c472ee95607a2d0b682321a5a33e22220234e2a396cee4ec2abc54fa4276459c"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +jpsj = { + revision = 66115; + shortdesc = "Document Class for Journal of the Physical Society of Japan"; + stripPrefix = 0; + sha512.run = "de1383f7c52d4a43b0ecd2677314a88181e2702ae487b0ce3140b3048c1820bd504b6743002733e2da3e45553aaf911fe2c6ff552f77e706cbcd300570a34c03"; + sha512.doc = "65c25cd1540664e4e529be67851e5198761cffd6eea495d1f60963dd9deb911ebe8426391fc456f08bb6f640040790fbe7d7702b21f7ddcfca5d246c02791764"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +js-misc = { + revision = 16211; + shortdesc = "Miscellaneous macros from Joachim Schrod"; + stripPrefix = 0; + sha512.run = "6dd7920204cc66ff28c78f54bd6432a71d77ae2f4463bd997d2a4170465053eb86d61bc35d8da66377b47cb1eba88c6ed0918142910a5bdd4e44aec41d3ec4d0"; + sha512.doc = "507cc8c04589dfa7b4d36bf32e4c1d18af42b90df58fee128c0ad37284a87aa1adad32623591d0e8ca880c53a1f583b0bd8054487e231bb2a58ed06d1bf6c6e3"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +jsclasses = { + revision = 66093; + shortdesc = "Classes tailored for use with Japanese"; + stripPrefix = 0; + sha512.run = "aeba8c75d3af2077763da1846e09b6d51ce0f5935cc4e8a09fb6c747d9321161996423ce620d04c15cfe3a4f9af3ea36f90ccbded6fa03dcc088c5e71be74295"; + sha512.doc = "0ce0175fc4a3ea36154c329961d7604bb06431b586dc1bc928afd5b2ada528bb79349a833504ccc93525addde80818210cfa2a1803ecb319032bc8eda034f18c"; + sha512.source = "4b8e605a8f9d3de33b9deef3dd58ae2984881f9716b0a9647fd794a3c97549e50ffe3f2556bb4b4ebc5938ce3516abda9445d4ddff21882b53ccfd9276b37e02"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +jslectureplanner = { + revision = 70448; + shortdesc = "Creation and management of university course material"; + stripPrefix = 0; + sha512.run = "8a94f190abadb4e8d4293782984f94b17f5d3c352d4a0c4f9368327df0e27a416d2f584ee44c4829f05afebeb8a4bba2770086d8094c54cdee887f11620da808"; + sha512.doc = "0907581fac47177633defd0f55a6a8373078224e2edc62b0c8f5e2521464d179833b9a50d513ca52ae1994465f75b129fc34cf81ff54fa904fc7a7622b4a0128"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.13"; +}; +jumplines = { + revision = 37553; + shortdesc = "Articles with teasers and continuation later on"; + stripPrefix = 0; + sha512.run = "e09ee044fe7d5692fe4f1098406e33481ebdf81698168223235e735637499053c66f278a1f7e27585aaa1a586ccf85b4f5afdccfa3ac35950475f56e46324103"; + sha512.doc = "c7f56f012d6eca83e54610aabf1530889c01c1b28e9b790b220726bff860504a3e46ad4fd8d88ef50d3fff17507710bc168fd2d5861e9f2cdae69cff6f95ae71"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +junicode = { + revision = 69355; + shortdesc = "A TrueType and OpenType font family for mediaevalists"; + stripPrefix = 0; + fontMaps = [ + "Map Junicode.map" + ]; + sha512.run = "e368f15bb9adcf7ed15527e4e381424896590866cdb9a214b7f8310e9fd0c660ff5abe442a2206aa88f4032665f40fbdc21b33eba910ff1b299c5940eba82982"; + sha512.doc = "937127e4089bf632b62dc1a218645b1c2903a700183e9d9e7456b16a47b089846509d5d3f89424417a19dd540badabdc6a8a6024826e5cfbad97c19ae9f4bdd4"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.206"; +}; +junicodevf = { + revision = 69374; + shortdesc = "A TrueType variable font family for mediaevalists"; + stripPrefix = 0; + sha512.run = "1c227ce22bb32e8799cabfb943fcd38a4ccc6c07aa7d9dc9708c9bc84352c4a660cbf8c6d31249e47825b961f67a0d7da59349c827a97eada6a37a327091973e"; + sha512.doc = "c96e5c1887f39a2151bf697353b84d9049ca3686a61568f1d99b68596d1b7f6363810962652813403881754ac412240a9d557a7053803172ba45a8c7c7057c13"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.206"; +}; +jupynotex = { + revision = 56715; + shortdesc = "Include whole or partial Jupyter notebooks in LaTeX documents"; + stripPrefix = 0; + sha512.run = "3b5cca7c6b8b14eda35d52a6db5e7ac027c0b29ee08a7b8f58411886963d8dc69348752d6cc1f010d11b9216026b705fe4cc915d2c60cb3ee9f3950fcc6bb308"; + sha512.doc = "35b8d2dbcbecfb4e7b2bfb0ef39f2d076d6f4eec9189e89cee3bdfdbb6f57d5c1dcefbca3eeecf4842f7f94616030d2e73588074618b39e232f40104e371f3ea"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "0.1"; +}; +jura = { + revision = 15878; + shortdesc = "A document class for German legal texts"; + stripPrefix = 0; + sha512.run = "08426bab6c0627e945d620a338c6081a8a21d80567d4a4b686617d0d57c99b1e148f5e5c3406a0337ee4ad61bd795dca353c28b0f33d397c5b47515969fa5951"; + sha512.doc = "4d19c663f73791712d9c24361d8e2a0c2faf25bdac15dcce48825f02468f6a798eff7e147f531368bcc8d7e2a1938202b5614e2434cd46866f359f8349564adc"; + sha512.source = "7c83d639330c1bd405b2439b5e85dd723f476f8ed5096c8085180f03d63ffdeb834639fc8a49a454d50df9f882f27dd42782741fed89f8bafe45b6222bd43239"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "4.3"; +}; +juraabbrev = { + revision = 15878; + shortdesc = "Abbreviations for typesetting (German) juridical documents"; + stripPrefix = 0; + sha512.run = "4d6fd00247c6c915956679674dd029048cb96ac3bc97606c0a299bbaff24a4cbb9440d557eb2945151720265ecb27bf15c638c003e1039dafee56471dfa03945"; + sha512.doc = "ede48ff67dacf107baf50be345b042a7b64c815442875281241b7de4c3be56ec40c969e40ec69669f31058bbbe9b27c51cae25938d93bec99a8c57dfb8e9cb75"; + sha512.source = "3a92a5231317d6f7d7b1afdf5df14997e17217e10b694ad97a9a2f3984b0afdfe5a3edeb4368108e4fb389a98a7f5414409e5fc7d319f4c78802cdc1a350d6a2"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +jurabib = { + revision = 15878; + shortdesc = "Extended BibTeX citation support for the humanities and legal texts"; + stripPrefix = 0; + sha512.run = "12a1d9402ca15ff23cbb9818f07290f0b295c9844bc4cf02e1332eb27a26a3a8d0ed3199df1c4f4f85c9ff5308e7426d0c7adad8dc587fe905c5a15314863b3b"; + sha512.doc = "3f804537752bfd7b6780d082b37834c805e521491f39bd76b52541707e69f8b775b9e18bfcba0b0827133be8cf82bab86651f2a7ec351f9cc140427056ca0dc0"; + sha512.source = "349a2f55265584d73d0a1b0cdd00f0fdb384c87f8b1399acf62f14229ec4cb03919bb1c37d3c8ed992f72f3cd846c93bb13f25bed052edd80810bb6a92665e75"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.6"; +}; +juramisc = { + revision = 15878; + shortdesc = "Typesetting German juridical documents"; + stripPrefix = 0; + sha512.run = "cbf6ebe12bf72dfb823578ed49066f34059e5ab1beefe0eeee84c7df55135644eabdea7582dc848b52cd575579d8807a2a2723bdb697e851eb8aef88f8a5e533"; + sha512.doc = "3925418b9e4d05def76b9e0ebcf882c4b7061ff7ae446aa63d412c093caa04536ad45c757e04e088c3b4099c569885c6e6708ad31b866ebe89ecabb8395964b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +jurarsp = { + revision = 15878; + shortdesc = "Citations of judgements and official documents in (German) juridical documents"; + stripPrefix = 0; + sha512.run = "511130814ed94c7f0829802a0c3e8e613b0c4aae50854f6e06779448f430e78c8712142fe04d3662b799a488d90944072847dd223b01b642de78c1f98649e79a"; + sha512.doc = "1c439e351102ae3f768ae38404cc5d98403028fb6fa6088cd53eea40593ee03c10d20955f3fadef41f41af6d23f139ba356a9b06ed735644b67d3f42a076e0af"; + sha512.source = "8853060222f8f45e69fd7d3539534ed6a0762cb7f97d4c140dcb4ac59fcf1fe339d7f6cdca6e035d4e9bbcd730746e1311885d837fbedf65e208be2100ec2a90"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.52"; +}; +jvlisting = { + revision = 24638; + shortdesc = "A replacement for LaTeX's verbatim package"; + stripPrefix = 0; + sha512.run = "70626cd23359751909ce385a7ed4415c5641e9c303d0dafeb99e36d0151f382c02c2f6818a135bc92fb156d4fa25d1976b2c906074fcc112e56a1a7a458801c2"; + sha512.doc = "de6a694c26332d9c97bf4202bec0989370226b7381d080c4d6f5a106cd8f2bf352d756cbe7cede2a4ba3e17f85ad553e5c24e874a00cc1dd307325125e6d0bcb"; + sha512.source = "776fe9200a5447c151f11ee09b0f3d95aa5f07ccd427607b12ad7069aa70084d99c7d620261797e6c147ab134bf3a151bb739eadc8e3898dc8b16f284c66a965"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +jwjournal = { + revision = 69162; + shortdesc = "A personal class for writing journals"; + stripPrefix = 0; + deps = [ + "einfart" + ]; + sha512.run = "9778eb2f8a5999584afdb07b9604691d9ed1253a8a2bdedf569a10e892e876288a74c525bab2e0d26f8ed851d94f81e4a3625a54f1246cb0428a24308546d502"; + sha512.doc = "dde16cc247d095b61e09b62039f081afa1855778b7d804e6e5692213c25a14c2746204a730f7934a531142f5b9151dc183b20f1d2aa14429d448cc5d4e543996"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +kalendarium = { + revision = 48744; + shortdesc = "Print dates according to the classical Latin calendar"; + stripPrefix = 0; + sha512.run = "fea39ce08f6028f078e2d87ec73aeeb56d72006d24d316f8e257b3c71604efe2b4ea2fa698f79798ec5c9b3d271d758d4c0699ffce1bf380a74d21158224eabb"; + sha512.doc = "60a1dcbaa92fcb4438f4a2416dc4784fc30af34c6e1511533b8827a266b61a62a6c0e66f51b27ce81dd879d774e9fee6b155a048ddb9f68e1f991294791739e1"; + sha512.source = "a1668bd43e489002ff365f5f90c6f9f8d6acb752256159f223a444b41ac1398e8d0bde50a63deac11f8d3a22f792278891cb05109b5af4c2efc1e8c278f01a76"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +kanaparser = { + revision = 48052; + shortdesc = "Kana parser for LuaTeX"; + stripPrefix = 0; + sha512.run = "a9db1fc66330bafc5fc26ed600f1779dce328d6234ebe930aaff65a02a0d740188e73c5f73a9c75d69926323a610dca4b37044e7357a141eae9bb3231fd3e272"; + sha512.doc = "9eb00a9652f22411f9ae0123bd2bda62af617f39ed3eb8266c4ca38ff0783722a3d1eb05a0fe1ef6a238a3132ade65c5ebd882309f154ca416e2191b9db44c4c"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.0"; +}; +kanbun = { + revision = 62026; + shortdesc = "Typeset kanbun-kundoku with support for kanbun annotation"; + stripPrefix = 0; + sha512.run = "2ca12d697ed80a1f3182ac2e28897f670f8d770d99ce6fb3d8cb692e8e40d45afb463959ac8668b60ac7d67c9d8dd8f88ff5ec9e83a96f656ea8cd59ac419187"; + sha512.doc = "853230ef31da0bab5215f62e68162553b5ba54619e1e6b6e84c9c57fbe43b5af5715af2696c384a14807a1cd6507dee600d37bb205e5b82d42cdae15ce30e940"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +kantlipsum = { + revision = 68983; + shortdesc = "Generate sentences in Kant's style"; + stripPrefix = 0; + sha512.run = "bc863e42abe6397617c588c85936eec4dec5fd9578b26cdfaa80e25abd29ae814a009952f246a4920a3da43e0842a9b113d0c73eb7514b72a9c5a16193f914bb"; + sha512.doc = "97f15c38fff7c30d99313be71a6908f5391bb15a3e363fd00bf6a6563a2abdca2d98969d5299ba644d33917b48da41985c5ea6d9238e2e8a7fbd285262bcb8d5"; + sha512.source = "873c0b66e7d83fc93d916d4599e96ff8ce8cd045ad2220914cd4161e15e8f357676b86a35dccdca927c03abbe224f604dca187eb58cd3bc42ba78ed70b9130d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8c"; +}; +karnaugh = { + revision = 21338; + shortdesc = "Typeset Karnaugh-Veitch-maps"; + stripPrefix = 0; + sha512.run = "344027bcf79a9b1d3c408aae774bc532a39e7c638c4831d2566e7cf5ba5780161c6314bc0f9337de21fa08a2a2d72f3b5ccf9df7a521d7c95b4dc6e62cf2136f"; + sha512.doc = "379638ab38cdfe3d94d049fec7701995566df9c5451f4f6a862c7cde232ceea899222b13f3c40398676bd2746305ee48e8b43781804cd24f48f36946526d23e4"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +karnaugh-map = { + revision = 61614; + shortdesc = "LaTeX package for drawing karnaugh maps with up to 6 variables"; + stripPrefix = 0; + sha512.run = "789421645939ff491e3ee00aa06813a5e194108c2d55a5e06ffb4dba593a095352ec54c5194ef8ac536f4226007d2323a923ada94966b5cdbd147117856ba680"; + sha512.doc = "6a04bc71128802a62fa2dbf92a513c9859f9bab336cd2208d05fcd3b9404a1531e4f20cfd69a1d58186cee6660582ab03e89ce87511c3e1173f84bc6ac132f29"; + sha512.source = "520bcc77beb97f2f106c92682898244160c2ee45ec85118776dc375763363b272e1459e73d3cfe1c27c7f82f24f723953bc9705cf1f506e7c4b679c0f3063804"; + hasRunfiles = true; + license = [ "cc-by-sa-30" ]; + version = "2.0"; +}; +karnaughmap = { + revision = 36989; + shortdesc = "Typeset Karnaugh maps"; + stripPrefix = 0; + sha512.run = "72c5ee674d7719b535a03cb9180a605fce2ac089c875cf57b95739b5c139bc45552960faf8f3287731fbe12c8402ce3c2c6517513d20bbc484e12a44468d6ec7"; + sha512.doc = "c79e28dbfb45764c3f5feff21bf3cb8ec5ee41380fe43d35b2b091b1e263db1eb417a19c74987743c04a2f41fc2c3655fdc531c8971320580be48beeb4d3d6eb"; + sha512.source = "ff5bdbaebaf55faf2d617b1e3634e52a6ec52c9d56932653d9b13a8aba94db101c4afbccdabd916d51be201135de2e739295b8a0523b63def160f1c07171e4a2"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.0"; +}; +kastrup = { + revision = 15878; + shortdesc = "Convert numbers into binary, octal and hexadecimal"; + stripPrefix = 0; + sha512.run = "d7cbd22ead6633284e9d114d90b2cb47924bfeb10c15eb350e4c2f82b883930c953410362313cdf8ac476a68cfa3a9b020217097909504b97a8ecd7addbc8d97"; + sha512.doc = "32883a008b0f44c341fbd5f65f9783e403fb5751201235b0c4a2dfd9af8400e1a36adaf4573165688d78cacdaad3c8b2ac1b92ba87ef6951d3bc5330537d1f9e"; + sha512.source = "60390a053fe2fa53685403df1d67a2bf8795f49db0f4eaa5a147ccaed951a55c1ed50c9cc5802bcdb5e356b694c2b4be78715022842c958f784908cab89a3f75"; + hasRunfiles = true; + license = [ "free" ]; +}; +kaytannollista-latexia = { + revision = 69876; + shortdesc = "Practical manual for LaTeX (Finnish)"; + stripPrefix = 0; + sha512.run = "e7b939930e9c0952cf67e402b363a00a7aba9ad226bf4301650553ab8117a78dc415f81c31e8ca6a8eeaefffcf3fe95a57cd93164df01b63f74c0513f0e8469d"; + sha512.doc = "f44779f63f301091ac2119f6c5002c29d2969509775acc752ca4aefeca8b16bbc02f352c36e3b869ea6070f3fd70bacecf3e7d41d00bc5007d0176e5cc489f3e"; + license = [ "cc-by-sa-40" ]; + version = "2024.2"; +}; +kblocks = { + revision = 57617; + shortdesc = "Easily typeset Control Block Diagrams and Signal Flow Graphs"; + stripPrefix = 0; + sha512.run = "1cf755fb680b13d5298c306698bf41cd0446f7ec8da321b065ed549c1bc83bc352bd4a44d67eaff6fd1c253b2d92768f8ddcdb6a986febc4dd1abe6884a2354d"; + sha512.doc = "7aa79c73b32d4098bdbf6152f28de628083639fcea2b7338e64fe6108aa605662f36002d93268f67fcfac59798369d392c5c4b79adcb18d0600faed8d804d8df"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.0"; +}; +kdgdocs = { + revision = 24498; + shortdesc = "Document classes for Karel de Grote University College"; + stripPrefix = 0; + sha512.run = "79b64f2f20b9da908fd9acee1033fdef290c30e99794c37f5020f33dc5fdbb670383463bc17614f4ecaa1d5d4c03b4ffd3aa4f2b7c53f27455740adda9d0545a"; + sha512.doc = "6b579a44d041a10eb9224aa80c1b59b113492cb12c121b1ca5f57625d044b52a80cbfab63d7a3160043b41b1b4e27d463f5ef8c9688f620f431fc1937a8bc561"; + sha512.source = "256c4c4e0a8dddf39fc6ce14f17313f2bee7c967dac21910fb44fd674573de113e78b0beaaa979d3c7f3fba06ad15d24d6243b8716b0114507331f267144d6f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +kdpcover = { + revision = 65150; + shortdesc = "Covers for books published by Kindle Direct Publishing"; + stripPrefix = 0; + deps = [ + "anyfontsize" + "geometry" + "graphics" + "microtype" + "pgf" + "setspace" + "textpos" + "tools" + "xcolor" + "xifthen" + "xkeyval" + ]; + sha512.run = "d68fa467a50f7d1648e51b918201b76c199920e39915a3c5fcc72cd75c4b11b0924082cf8c01363fe5af998c66ffae71137e7f9635e147ed40ed5e7cd4fd63cb"; + sha512.doc = "880f981153526b41cc128677d950e52b4ff5449adc4fbb3b0004a983bcc7222fb64714ca033b605172fe0b52107e6cc8ff0fcbd1778bf7aa6b9d20fa994ef452"; + sha512.source = "e67cc3eede96c42506beb03d8e4e7db1b5fd4a7ed15026a060c3a5db559c0abc7fe0f9e24c22b23d2aff7c7979005f0c26d250607129d29b6d4bc9babc0e11be"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.5.1"; +}; +kerkis = { + revision = 56271; + shortdesc = "Kerkis (Greek) font family"; + stripPrefix = 0; + fontMaps = [ + "Map kerkis.map" + ]; + sha512.run = "b4a8465264a174320180ac5f9bd89900f7a3b351af21d3a138db40b0781228bac8f8e9ea66a54a1910b3750d65eed17f74880f1c7396780dcd631eda164aff58"; + sha512.doc = "b9c57f71b2c5e48ab3b96984b231f5ad418d884caad0a3747c78bdf0a5688c4ac05993e43707236b02650750d5b7507d39e50668b7cc16e00a35547d63d0bbb3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.11"; +}; +kerntest = { + revision = 15878; + shortdesc = "Print tables and generate control files to adjust kernings"; + stripPrefix = 0; + sha512.run = "9f295c253228745bdd91db65f2e414bc6113d246242ea1717db6659c2ccbf72530fdc326c0ec499f6d6c2af3ec8df2b78965666dd8544e07bce864716804e76b"; + sha512.doc = "b471544af9d1ecfd6225e4b9d61f05b4da950a6512ac4c4bab54b1ef9befa859ee5aee2498690e724d84313808d2abc8f005fd4e121891878cd2dbd03ae36415"; + sha512.source = "8d7c2a8e8881f361c67ff71a57056dbabd3e0af5d24cbbc5f9e7e6e321504482469809f8bf349b5fd4d65e011049d5a67e7570c0b364cfe178b0fe377da82c31"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.32"; +}; +ketcindy = { + revision = 58661; + shortdesc = "macros for graphic generation and Cinderella plugin"; + sha512.run = "da33a0bdc989fcb6f4521d23e5d44bae70d608ed8ac10f05d6962a252e99bbd80380afa2cbe9e02b9c652b044dfff79218f951144da6ce55f8a53033c11ff346"; + sha512.doc = "1704411b3e7c41b6318ff6f8da56007dbf1bec67bb495d25364d6274d9b8acf234430081c22bab6ad13ffd0ea47586e6e24c9f27da8a97a309e2128ec74f89e9"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "gpl3Plus" ]; + version = "20191225.0"; +}; +ketcindy.binfiles = [ + "ketcindy" +]; +keycommand = { + revision = 18042; + shortdesc = "Simple creation of commands with key-value arguments"; + stripPrefix = 0; + sha512.run = "90c2246edbfd199d98a05df336ee228c65f26073f3c95c5ae55c3201cf59453bb5afb95ad367ab4af6b36dc4e0c52a25bb10f80fba265003c701122247be50d9"; + sha512.doc = "b99b58407f5d93fb868bf525ab199c41e07fcf5f31c7a6a14cf68622ef3a34e44d1014e4d34594441144af5c7d9a9853cef1505311928b32a9fcbd41c7bf4284"; + sha512.source = "44b63a11f08c3bd47ab337ccfa1b0b2737624f77228ca1d745020e2c1ca1b1616c1bfadda1b99c362c0b372bfbdf37d839f0d0457082922a54a66608c82aa928"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1415"; +}; +keyfloat = { + revision = 69399; + shortdesc = "Provides a key/value interface for generating floats"; + stripPrefix = 0; + sha512.run = "b3bbbe74c5db4eeb1a74d49e0fe9608df347921caa0814faca8eb62cad674fc3977c7af1cd58849fe6abab5a1231b4ac3999d5af7aceb7655f12d883e41148bd"; + sha512.doc = "43771371d9f81311e29be4b7ad2b1876299d6ff4ea740e9cd759a01701665bb6bd37983828238e13141e39c253b6d3d92b566fc97ba2944d7967cf55e492913a"; + sha512.source = "89f10c6c68e6941de535abfc4e86a0e019a1bcbd2cf10f0fa542adc208f5ee8c1c7884f679d87186c2103b4b1f69b36b50e3c73512fd9209db1be4f5c87f05c9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.09"; +}; +keyindex = { + revision = 50828; + shortdesc = "Index entries by key lookup"; + stripPrefix = 0; + sha512.run = "93de5becfa1b4950f518bc004f0dbdfe96f567e17ec4b7656326b89201f1f85edcbdaa771dc8568fc0c87bcbd8877b618d0d00ce387ca70036f6794a8b870695"; + sha512.doc = "4be79367bed5a7bc3f5bfd6c10f7ba6a4c87ed51139e8f8a7f55c59ae3ce6c1aa10df1c88728f7dbb4573634bba2ee599378755cf6c77a2ccf8d93ece5540736"; + sha512.source = "3f177cf8d323fa6dc0b47742a27cada66cc505777a20c26864dcee73c272e46ba3867c4120f480be8ce5afcfc6896d908eae0f336cf306a13019bd0f0206f9dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +keyparse = { + revision = 60277; + shortdesc = "Key based parser"; + stripPrefix = 0; + sha512.run = "f3ca8d0b78d9e20bf99e46ebf181d670fe6d936f9d91f1059056820f8be1a9be6eb6278fdda8b118a5f82d376440681dc4cf9a063bb6693df67d5e2d47b3a5dc"; + sha512.doc = "01b6aa91350a1ebad4f37be4051a4bdc97939392a6ec2b7708de77d06a575c14fa3f9bc9a8b98ac5d73428555389aa6bd0f9439dd299c2b34e19b7800eb2a27a"; + sha512.source = "2eb4c90abed3e2676bce4865ad4254b6f572a69edf63ba82a5a9b3c994343f8d3a3523dd465b94d6afe814364c41a581dc84d49c9e21be6dc4231c3f850eafe9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +keyreader = { + revision = 28195; + shortdesc = "A robust interface to xkeyval"; + stripPrefix = 0; + sha512.run = "d1786b07a3dc87f94248043f0bd941dcd8dccce29132e67118d3fedc0fe207a2df846d850851217fa87ed2219915719e70fa73ec284ed420072654c578ee0b3c"; + sha512.doc = "05c45cb13bd2612dd5b048f296437b605117c71a52cef2a1b90ad58b693a31d05da9491464ea9b208dd7eed3f3cfc96e9b5a00f5a77e5d492208fe1e924dde4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5b"; +}; +keystroke = { + revision = 17992; + shortdesc = "Graphical representation of keys on keyboard"; + stripPrefix = 0; + sha512.run = "e04e13e23b3342686078c2278d3b6f7c8678d99acda197f50296ade3dd91bc4316323a669efd7238fd246c60f169c694677252601a81d9e23b49a1e37049c93a"; + sha512.doc = "bac7f2e879796c0ccd5ee28c47aa79e9208ce0d01456de9ada6cd00d822c098cfa318615311c43b1815de0e6968252f6005a3dfd9d0475ee7dec25f7d24d1d86"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +keyval2e = { + revision = 23698; + shortdesc = "A lightweight and robust key-value parser"; + stripPrefix = 0; + sha512.run = "08495711a9b509707ce6da359f9743b267baaa6ba6e18e41c965ce016c4c51e1bb7353769ecc9596e9bc415976449612f602e291608d306ee5baa69a4e823160"; + sha512.doc = "424035c6250990b4104200fdab744d50643b6ce36ea717f50544fecd40746d47d7d2145203f0d6f19652a7217c99eb599a1c7d8b0e3a0fe00e1355c416cd4294"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.2"; +}; +keyvaltable = { + revision = 65416; + shortdesc = "Re-usable table layouts separating content and presentation"; + stripPrefix = 0; + sha512.run = "733d7e2f07b07b1b7f0538f54c0dce33a706210203c9aaeb203c7c4129859d025d20a1afc973f5320102c89bcac78547213707802726367311625ab89566492b"; + sha512.doc = "7b3cf84548c2a8d997b8cb5ff3cdf77a40ff309220fb6d109fcb8215e78c8b93f44e495f3da7d92a3e144c1635473fe8780cc45acd9e978f12faa7dcbbff9893"; + sha512.source = "0bed97c004ebb8aa8af13d226c10fa01e00459534a061d5bb9500e7d5376fd379f67310cb169e2c1fbcc0e07f4e5c35d096ef1ab65b92a1b78481fbd7e90e1b0"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.3"; +}; +kfupm-math-exam = { + revision = 63977; + shortdesc = "A LaTeX document style to produce homework, quiz and exam papers"; + stripPrefix = 0; + sha512.run = "cb050347cc1cfab5e2ef5c248b6460edb50779b81216f3b9277700780922c94e44ea2c14696b470111421de1e049378811645cde6dba004c23631f2111cadab9"; + sha512.doc = "8cebb9035b23e1919fc9428e9f57335ecfda9c98214fec78f95d665f44060cdab2aff6a9ae22eb124a6da7716e88971f559084f64f7b1c1456e95dcd03c00307"; + sha512.source = "0a7dbdfb80a3ae91b23256839c8174b3db13ec23f3dca35bba422440897ade8b33c0ecd8d8c76367241e71abe9b12c5d69a07bb9d0a1962d080a6d89e76a50e2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1.0"; +}; +khatalmaqala = { + revision = 68280; + shortdesc = "Arabic font for university articles"; + stripPrefix = 0; + sha512.run = "78481f7d494a7c1d9312e3c11a700e43b007660aaaf28f74a3aae4966b2387088bb891cc8e73bd431ad992395f7b66a10b9b326d2262509fdac3e153473d37dd"; + sha512.doc = "ec0f8ec3213a009899134fbf2389f9f33e2747175bf94246c0e035c424728251c0e16a3391e598007b83262353db66acc87431f6856dc1df6e784d5f40b4a2a0"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.0.2"; +}; +kinematikz = { + revision = 61392; + shortdesc = "Design kinematic chains and mechanisms"; + stripPrefix = 0; + sha512.run = "6f23b8084247aa807c5738468f005fbaaed59559828247f269dcc24e62535984bf7805c69aea27b889d01b2afa04ad67811a0cc8e0ffdea7e263f9ac9c384fc4"; + sha512.doc = "b5fb6a456f042a677866f9fee3bc7a13a8405ab6fcad590ba37dc9d681e61d04abdfe6bbab5009cc1d79f73859a1fdec137c92e6c0d367b1d801ca2d41d69160"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.0"; +}; +kix = { + revision = 21606; + shortdesc = "Typeset KIX codes"; + stripPrefix = 0; + sha512.run = "dd819518a80ca0486a191361625b58f91d00ccac88a2f69269bd6e1753f6c87dd3c97d39a14a5dc3768c9ecccbc981106eba1f495cb7870103a828ea69ed8bef"; + sha512.doc = "3d3816d395e69ec83c88fe55801cab052b12f5e38702edafec2d3f9225c80a31165dca553b60401dedac7689c583feb00615e41c7179fd19ccdc420fbd5e6d86"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +kixfont = { + revision = 18488; + shortdesc = "A font for KIX codes"; + stripPrefix = 0; + sha512.run = "a866364705d75ab560488c84a5e403755acfffe7b49b8e6dd65342f45f852a5be9d4072d750fae606c3d5789e1d46458da66f0af6fb9f9e0225c1d9acf69d4a5"; + sha512.doc = "ca250703364924daf9827ddeb48126fb21ff5ec3230afbc3f6778d23e96dbbb16173e5504900032ddbe14920cb40adf8130be50ee92f3c9c2dbceb95b8ecb90f"; + hasRunfiles = true; + license = [ "free" ]; +}; +kluwer = { + revision = 54074; + shortdesc = "Kluwer publication support"; + stripPrefix = 0; + sha512.run = "25210201032ab5cf867e8e46de560a2232e36cb636db8d6d533a6052ae125024f2fdb3d016aa68d49d5be4ded676a1e02108094c366fbc9cc443035edbc82107"; + sha512.doc = "0908a60833ebab53fda54708cb332f0b3e2ed6c071daa1b231570c6dca57b09b6c9e7e52afb606300b04f9c42794d6d6b7c2387ab35fdebae0ef4d346ca068e4"; + sha512.source = "12f20e51c0c7668761c2894ac6559f16f853c4d255331db36d9d50e21ac92103828d661d2df8358de24c8403f7a0292866ed4edd5c64e54e555e979475bb5adf"; + hasRunfiles = true; +}; +knitting = { + revision = 50782; + shortdesc = "Produce knitting charts, in Plain TeX or LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map knitfont.map" + ]; + sha512.run = "af3f7d2355054293c2c7973cfd40f0b741c8821884cca6ceec7562efeb92433bb81aa204b7b0ed4dae77cf674f4a63005f36133fbb5bf3d239f0cd5ef61a69ac"; + sha512.doc = "effaaf06a5593a9d73f2e93a722355009a0a957a2067a1432edb40d8dda7649c42571cbc37fc7aa4103ae2094dea7b1bfd861273566102c55546f71b326e7118"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +knittingpattern = { + revision = 17205; + shortdesc = "Create knitting patterns"; + stripPrefix = 0; + sha512.run = "cee26b0e6fd54a43a12e0e48fd5b4bf381816dabb6019cbd7c13ab5e2561b9f191d9fce4c75a513c06530077bba8d383b26552e2e6f4e97600aa2216547a08b5"; + sha512.doc = "d391a25a224713092128af5adf68e5331c530a67a763dc37f657d8bfcee0d904632e86ae2f3745ec2c4bb0cea5e886c85da15b064780dbe997104b9afbef9e4e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +knowledge = { + revision = 70609; + shortdesc = "Displaying, hyperlinking, and indexing notions in a document"; + stripPrefix = 0; + sha512.run = "8c97dc4a8a0ab5fcd2ae59da3b4217fd1e6171d788197c3755577a89fb86c6d7d7075778c669bdee8c0ff8157583695dd20c1186b54f80b87c968add98970f99"; + sha512.doc = "a0058b7065a25ced7469000536321cd830503fc3e3f1bdc00d44ec4dcd7eded837f62ccca4ea49d46c9262c7bf8accb2f29d6564f39e9c3acedb163817098da9"; + sha512.source = "f7586aa134293da41c4920402aba230c12e5f14fa9e7675206fd270203bedfa42426e1ffd56f4289980b5a49877f8179cacf4ecba8f2a5fb857fc891087a2531"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.29"; +}; +knuth-errata = { + revision = 58682; + shortdesc = "Knuth's published errata"; + stripPrefix = 0; + sha512.run = "f74443cd6bd0ebc039ff7eb0f5df2709b28c34c1fbf49793ee6d8ba2477337d8b7d0072573c32d67da17f7796efa058aa0d2d7cc2f7e196111c9ff90668ddb97"; + sha512.doc = "86abd134ee7d4afd4398735964c83340b67edb9b41a960d205aacb3dbf1c702a854eb469d3c39b06a7ed1974c8e2a951dcb1c3fcfdeb2c394b7d21e4205ceca4"; + license = [ "knuth" ]; +}; +knuth-hint = { + revision = 67373; + shortdesc = "HINT collection of typeset C/WEB sources in TeX Live"; + stripPrefix = 0; + sha512.run = "ffe5a785191fe8506f59557546b3bce29a236ed5e23a6766941b37dd134bd00ff1ec5dad0278d837bfe2cf8a0e69e5ab5921daa320184ee259580c9b41d92ede"; + sha512.doc = "5b47b3cbf6164bce8cf6903702b5a6ed93fcd13def2de2e6b30e3c8e758fdf076a1c14f1bc452768c9841d967e932a6597ff0a1a7c9140ce2100036fa04f031b"; + license = [ "publicDomain" "knuth" ]; + version = "2.1"; +}; +knuth-lib = { + revision = 57963; + shortdesc = "Core TeX and Metafont sources from Knuth"; + stripPrefix = 0; + sha512.run = "47d50b1966dc5a3adf4921c297d9ed5917035e917098154fc08d1c72ebd0ba70ebfa41735c7ae52c5087d62242bcfa9b0b49914c6da4f392e2d4c56a6d72807d"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +knuth-local = { + revision = 57963; + shortdesc = "Knuth's local information"; + stripPrefix = 0; + sha512.run = "91962f359e8b2f668130a6511e7fafad26a0c4c14a46f715172aa28723f743e08c50be666cadafd7a591f2283daec4fdd45039afc714115077667b66e67cedb5"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +knuth-pdf = { + revision = 67332; + shortdesc = "PDF collection of typeset C/WEB sources in TeX Live"; + stripPrefix = 0; + sha512.run = "ab6e1db43370a551700c4ad8ca9e3787a7be7a06da2a72fd4cb0faa7091fefa1847d143bdf9c8d603ad7d307495ad34faca4e5ef054fa011d0137ba90f888a5d"; + sha512.doc = "0f16994ee8e64478d01f7b0f2c54c55369b5f661abe7f4db347cb2b7d146c4efbf337e20fd7eba1cce497d8cfa5058bbf4c013073028c364678334c524aea155"; + license = [ "publicDomain" ]; + version = "2.1"; +}; +koma-moderncvclassic = { + revision = 25025; + shortdesc = "Makes the style and command of moderncv (style classic) available for koma-classes and thus compatible with BibLaTeX"; + stripPrefix = 0; + sha512.run = "68aa7ea875f46a4c1d1bbf29d4abb77f4ec729242fab41f3e79caf95a925a076ec3d37ce7d98b44aecaaf9edce541d1673780238786b36cee0621acf4212a1ef"; + sha512.doc = "968f5303bc7b5fa3df39a2a44c38b63e54059a94ac7df2349b45cbc0855d22ec64ec39feaafd761515720d306d5e5ea8a223ca74790ba160bd093f989d8b69c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +koma-script = { + revision = 69755; + shortdesc = "A bundle of versatile classes and packages"; + stripPrefix = 0; + deps = [ + "etoolbox" + "xpatch" + ]; + sha512.run = "610827993fa3d94f1b914ee24be0c0a2ec1062c1d1863dac8687e6ccf9c7866b7ea56fb45363587138d7d7842ff58cf1aa4e1c7970f48ca8f7a783e0fafea1a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.41"; +}; +koma-script-examples = { + revision = 63833; + shortdesc = "Examples from the KOMA-Script book"; + stripPrefix = 0; + sha512.run = "03941b9cb516d836b59f493e1e6af7ef409306cc567ace2abc467c7b6c73156819fd23212668ab5506c03697e29840073162dff5f912f605354cf9851ab6dda8"; + sha512.doc = "d355edd3348b454015a390449e251bf476350385b062d314d9e924b187e85802e815cca97c550073605ec3a91a38a15d2a9af79b7771ec74557067dbedebdbff"; + license = [ "lppl13c" ]; +}; +koma-script-sfs = { + revision = 26137; + shortdesc = "Koma-script letter class option for Finnish"; + stripPrefix = 0; + sha512.run = "3b281a1e94c73e1d8224f6ae552be91e3df344f9031e139334fd7256e38dc70bed4132164935845c710bef9dfe0e8c439c229d3415ff835e48777aea182e7fae"; + sha512.doc = "84f7fb5c11c9b40029bc481d34ef7cca39baa2a3872f22fd5b656e324aa5cc0becf3ff6d894ceaf26e8ddea0d8cc14d428a140e1f19ff2e060c6d32390d51070"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +komacv = { + revision = 57721; + shortdesc = "Typesetting a beautiful CV with various style options"; + stripPrefix = 0; + sha512.run = "028e8d2a7e5ea450ad8d6f2b14ad0b84b319db0a234f03f8a6e1efc781fa7e60a67a67e4aa5cd101eea59e2c93a073b635d74bc6443d84b01599575466994a6f"; + sha512.doc = "d016f4bd23fb08fb932c3d1516167619d239f8cebe8d2ad8e6fcd07aa945c2df17d6e05e5474dc5522ce4bff1d72fa7879bf9dee4348eb8aa8624d1fe30ea86f"; + sha512.source = "ab1dd4f3976bd0b1a81c7772a92f1c015f2a0a662c65f474bc36b9bc6edfce6756f428fe9e45d969dcbbbeda41a0b1ffd463c3fe5cb286fa9722de22c59847c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +komacv-rg = { + revision = 49064; + shortdesc = "LaTeX packages that aid in creating CVs based on the komacv class and creating related documents"; + stripPrefix = 0; + sha512.run = "6d400b0f228d42aaabf9527bbd3447fdf92eeff81f1fb7978cf90c3afa9835e4731a9da938bbece65034476ac2e2f7afff19000d9012ddd76b6f65618bea7223"; + sha512.doc = "58236086df2335cd167a5d475cb0e223747d43d81d23c0c0ace1cd711a19ca371426d36e199d69a9fd5414a33872dc4ab3725850a6677440484daba0e55d5208"; + sha512.source = "512fbddc0b233061afd3a2af20846e8eefcb9d1dc00b29669e45499b62289d842053201b208819536af0a2a7db56cfbf2346210775412035fcd13d2b2593dcf1"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.9.2"; +}; +korigamik = { + revision = 68204; + shortdesc = "Typeset articles using KorigamiK's document class"; + stripPrefix = 0; + sha512.run = "8218a2e5d09cc572c3e3bcba6d49ad9ef9be5016cbf2f3bb57c7f649fc638f718f5d91c09c3d9013ac182e651b0c53b65c7a118a021eda68a53a1e8641a0a8ee"; + sha512.doc = "291a1153ed32bce9c7b845a40b4de3f63715f2179765021c1ac3f678bf1594a0abe405824099826eeeae30a90a5fd773e6e5aa91fe66a08ed47c91f371fdb6cc"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.0"; +}; +kotex-oblivoir = { + revision = 70496; + shortdesc = "A LaTeX document class for typesetting Korean documents"; + stripPrefix = 0; + deps = [ + "kotex-utf" + "memoir" + ]; + sha512.run = "7a4d61b5e5c20b3ef673eae06b95403b7e3f65808f8bd1163f8d6a5fb33004a86991b5941da88cdd89b74ffb40bbfe14d0a51f062b51c7567b03609cfaf6ddc3"; + sha512.doc = "42c6dd702f21cfda0a1857f42832a53c0d936280e07c0a3700e39d614569bc5bdd0dd50daf4e01fcb0c3ab94c747645a1ee7298966b5c3ce16281b402bd1ca97"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3"; +}; +kotex-plain = { + revision = 63689; + shortdesc = "Macros for typesetting Korean under Plain TeX"; + stripPrefix = 0; + sha512.run = "940f6672fd2d490cae446408ed6421c77ada3ea9c0c4820b00a0b38026ed5d30fa2b0f8bf86a5904a8c04b15e561e3f146ae4f817e7e2ef8c3a9284f9c841350"; + sha512.doc = "34a45ea6cda9fa9b6ba453fef795740869b1cc3c3eec84b467847b7221a916f4eada3bac97b78dc6e5a545e12f87f1d56c3540fafa658535f9ca89335bc6b534"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.0"; +}; +kotex-utf = { + revision = 63690; + shortdesc = "Typeset Hangul, coded in UTF-8"; + stripPrefix = 0; + deps = [ + "cjk-ko" + ]; + sha512.run = "be75556f3857a405d235f920866f8089f105a57f9accff07a541fe110bb8124e049ebe75368ce3282bcd329cc6a02eed0ccffdfad49020986d61221839cae4b5"; + sha512.doc = "7226874594b10ee48e8aea30a72e6d6f4db9f770d5d5830dc83a41f828bfe36b0b11f679aff02722e457150548860f1ad719758e6ffd239bbf9ac18d907acded"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.0"; +}; +kotex-utils = { + revision = 38727; + shortdesc = "Utility scripts and support files for typesetting Korean"; + deps = [ + "kotex-utf" + ]; + sha512.run = "569e9677ef0f346e5a53f4cc84302a8ddf2b4ad85708f4ab8ba7d076ebf339ec60998a41fa92fa815167e9bfc37085ebfd921dd13a60b017a0574e4a5d205802"; + sha512.doc = "a46c5d09d119fa2fe8b9acea87a37776536e3216b776af6b7037fc5b0a522af5c1a58baf081e60f06c9a4054e8ac2372458c276c779038a030dc92efdfa3aef6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +kotex-utils.binfiles = [ + "jamo-normalize" + "komkindex" + "ttf2kotexfont" +]; +kpathsea = { + revision = 69121; + shortdesc = "Path searching library for TeX-related files"; + sha512.run = "08b2ebc546de9615927f9933937c81a5fbae702e20e389055c62f13b70ce81a87995dcf402d8b94d0025eea80f9fbc1500270b615fe3f26f1e9c12a245dbd1d4"; + sha512.doc = "17687e289d912120a0dc0b79829145521dcb660fee024f249153235bb2591936bedae9370ff20d8eb137d54d40d73d2854e4312651eff8a6763bf70040e0bf47"; + hasManpages = true; + hasInfo = true; + hasRunfiles = true; + license = [ "lgpl21" ]; +}; +kpathsea.binfiles = [ + "kpseaccess" + "kpsereadlink" + "kpsestat" + "kpsewhich" +]; +kpfonts = { + revision = 65583; + shortdesc = "A complete set of fonts for text and mathematics"; + stripPrefix = 0; + fontMaps = [ + "Map kpfonts.map" + ]; + sha512.run = "d4d035c30acd5d5731a16e144cb45df6a3ce12c06d290f50c9e721ac67aa4808eade4eeae4c91a5093e29c64f91ec4d7a8d65d42307238c472d87d22eb5298c0"; + sha512.doc = "d030abf78988bc21f0e4afc06f0fda95339864036883877f5ceec11210640fcea8cd0ba54eb4d7b7dcc33b9eee8a0b2593739b4e2260b9db6e23cd480861e79d"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "3.35"; +}; +kpfonts-otf = { + revision = 69636; + shortdesc = "OTF version of the Kp-fonts"; + stripPrefix = 0; + sha512.run = "5c90bbd34da4ff9b610e5d1d407787cf658cc1a649c42c43d64bd374d04f43038956a5dcd159efbe912fb952d5a11370388870c87bf0a4094f19c019965a173b"; + sha512.doc = "677dc5c94ab24a047028b403db43a0493acb4bf8644ff6b63cbdfba12f1de11541eaca6836290c4ed822c1800dba299e2b5afb9f5455164db038c01e7ef0f17a"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.62"; +}; +ksfh_nat = { + revision = 24825; + shortdesc = "BibTeX style for KSFH Munich"; + stripPrefix = 0; + sha512.run = "8893133ed49c9b4ba7472bc80a4e5583ec2546838e261fa2cf9aee188a0b00bca45de05c4e969af0b6f222a9668c3a7fac0caadbb180c10500fc53ae8c9f56c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ksp-thesis = { + revision = 39080; + shortdesc = "A LaTeX class for theses published with KIT Scientific Publishing"; + stripPrefix = 0; + sha512.run = "3a250167d8810e3e81c5b6f86dad57e191a2a8387b5c7701e9b176cb007ebed79bd11867caa63e9cb9d3412fd59baeca7ff8e7589b11c4ef1144678552957216"; + sha512.doc = "ea4ff7ccabb237b113511b58ff767b494b213cec1382467ea8b95b72abe9c0d361f39781940c976075157bae93e8e32364f716cdba2a07b8a7d72c0970a31cf9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +ktv-texdata = { + revision = 27369; + shortdesc = "Extract subsets of documents"; + stripPrefix = 0; + sha512.run = "c2f3e86494993e6e56f131b9e7105ee2d15179b96580982ae7fba9e32c3e9889159ae767d96d95111f2eb052bd61f0c3c15406ae3af70b359e3b5ce081a6978a"; + sha512.doc = "d930db31105dbcfe3df4184422115d82fda7efa93d00eb8f9fefa0eff3893602fb4db9e7be26d2a44c0b3cb56e8e9810f61bc660c15e49c23880c3f0cd44025b"; + sha512.source = "1f7eebfcdbdeae66dbff4037a01173bc9383f75b5d7704755a10c442d63380d286bb4532546e036d5c558dc399defe3f9d3d035bc67a5ba90f8482e427b507ce"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "05.34"; +}; +ku-template = { + revision = 45935; + shortdesc = "Copenhagen University or faculty logo for front page"; + stripPrefix = 0; + sha512.run = "4603e59129f749b0eb065283bff9cddcafcd1096627f196749be09c19a4a79848564ee9343f14f31dddb2e37a01e222bf08531d5b3237bb906cf88efb427fdb9"; + sha512.doc = "6b8535ef84bd1ccf70d16f7098826b5acea602b22cd461df66cdda64c4afe36f9ef6c4386227c5317a31767e4694c388f7a2fd87fe8fe06697af4bf5202b29bc"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.02"; +}; +kurdishlipsum = { + revision = 47518; + shortdesc = "A 'lipsum' package for the Kurdish language"; + stripPrefix = 0; + sha512.run = "d7160d78d7f0d8d7771740f030cf1c76b57aa9ec2d179887fe4065337e35bef528b522c666eca0974aea6696033678dec5446a9a198fb139f2d2469c8cd47eff"; + sha512.doc = "6af516595f4cc5b090398078977bb37e97a5aa4b28a578c068931eff7d34fa2cac379b53e70c8bcf270c998fa6fbcbe354b56d0299657fcce9a4e076a87b36d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +kurier = { + revision = 19612; + shortdesc = "A two-element sans-serif typeface"; + stripPrefix = 0; + fontMaps = [ + "Map kurier.map" + ]; + sha512.run = "4f727e8733824e8c516e3ab1286cf0c834413a6ab52bccb5519c9a14a526cd3397a6d0a264679dc8b7d80cfc1d75ab11dcd2c02734ea63d5a2a5cebd3ea3c24c"; + sha512.doc = "7fda14c05f105d341a31561e761517ce12b3e5ceabc01e0c5c8552ddaf55be1863a22545b268026c844b23f03e8700350f0dede79ca8fda62e7a2672fa510407"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "0.995b"; +}; +kvdefinekeys = { + revision = 53193; + shortdesc = "Define keys for use in the kvsetkeys package"; + stripPrefix = 0; + sha512.run = "2a03840307805bd6fe30be9c108982bc472912c11c8cec25737ebc4042e48af8fe4f1a76124536874bea8c554f003a9c52b8a72d2f6900bc6872ffef8649c40e"; + sha512.doc = "c540045ec1c8bd7fea3000dd0ebc8adac64da7ccc24b0becb9b9c32c9dda6e5e11a77b57bee667bd2ddbddf347bd8af069907e087d543898a92ebaedf3fa4b7c"; + sha512.source = "0944a3f6f8e8cd8c189767944a74d5dbf09fcccd94cfdd2e67018f4a3542ce2ca4b8b7e3cb440345eb299584707962ed903f2fd8c832fad6cb850b29c7a99af6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +kvmap = { + revision = 67201; + shortdesc = "Create Karnaugh maps with LaTeX"; + stripPrefix = 0; + deps = [ + "amsmath" + "l3experimental" + "pgf" + ]; + sha512.run = "ea3659bf10ca08945ade08c52b4eba46fa01e28443bffd672a1614f917fe71f68a63d98568e23266d7becf6f6a4fed48f2d2367256a39e956bd2f1d40aff6f71"; + sha512.doc = "96f3738d31a6d9fe8f8f8624448749fea3aa2d6edac1442eecd70d570954692eb9e1756c1b4f4cb02a8dc17cde37ea0012824fccc5b567250c8ab6715150c796"; + sha512.source = "24103e29f4268d4ced68d5d1bb342c0e0155fe56e1ca07caadeda841795e44b0b246d2cc39a97f8c683a9ba71160ac774bcd194177352d6e29c079921c43c5b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.5"; +}; +kvoptions = { + revision = 63622; + shortdesc = "Key value format for package options"; + stripPrefix = 0; + sha512.run = "8e4189334b66ed38279ec0deebb12769453db802b1538e8ef47598de08123006a5f65b4b86c144aba5c7ef21abb95c65196e314e4b80e9b513103354e4b29619"; + sha512.doc = "864fd685912d7bdac610c16508efdfadf82c9c2efb8ae3c9b5a0d16c1dffd91822a1389109b3de1ce63dd74bb1aff5efa534c134ee06f1e61df9c867aeea608d"; + sha512.source = "38168cf3c486866ae79eac1708ed93f117187cd7404d852020cd9b70b3a518ca50d641db564d5d1d36b7e2a2c9beaab27e45abce93d01db4c37de7d9ad36bdf9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.15"; +}; +kvsetkeys = { + revision = 64632; + shortdesc = "Key value parser with default handler support"; + stripPrefix = 0; + sha512.run = "8acc4b9069c3baadf9a9802546d636fe8268afb97416b47d79b0a0306d90104fbb86b8ec1b4492f3134357564bb81eba1ae0e84a38f5b94a556de45525777431"; + sha512.doc = "127d4a03b26c9adb92254b08f0aac6039e39ff961539e253bccfdc1ee3598dd5e10608b8c8909708c041f5134c549f9af550bd1371a1e7b90003f77ef53bbf33"; + sha512.source = "696e78c295f0ac2a4d4c69e0d855925d46fee487da25ff238546033cae5e3b9042f66b924d1535ee41afc6142234fbef63ecf4df5b0c6c191b395109244e19e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.19"; +}; +l2picfaq = { + revision = 19601; + shortdesc = "LaTeX pictures \"how-to\" (German)"; + stripPrefix = 0; + sha512.run = "c6ea1d8ac189784d6581eaf9cae83a83beba9adfd32536f43c04633f7cc457353f0dbb69407332a29856633552910bfdd31cf85332c6dfb05da2cbab88ec67a2"; + sha512.doc = "e4202740ea2842296338e9d635b27c35801f4a5f8b21eb8dc0c1db572da0718fc5adcefc5c122793618336272606ec27f02f13825f8d2a6cf4b83583ea372288"; + license = [ "fdl13Only" ]; + version = "1.50"; +}; +l2tabu = { + revision = 63708; + shortdesc = "Obsolete packages and commands"; + stripPrefix = 0; + sha512.run = "2e3dc6f2707cc6b9ef6daba6f18099665e279b90ac85d6c391d33dcaf1511b1d85cc8348b259163ac6fc96879053364423510b199da3af81f1fcb2674b983db1"; + sha512.doc = "c6913d96a1821725c0d1a91cabf2db7a8afe692c1dbcd23113c3df63793653de48aeedf142d2dc81ec81c863d16583767766955a7ba0cba0de09840b9d3f74b6"; + license = [ "free" ]; + version = "2.4"; +}; +l2tabu-english = { + revision = 15878; + shortdesc = "English translation of \"Obsolete packages and commands\""; + stripPrefix = 0; + sha512.run = "66e1d62c731a021c1be2fb6e9e3034c7dec59edfd03dc2bb0042a37ff6f0d967e59a023fee994f45cf2c9b15e64445b45c48a207e21b7edb81d8a538b6c8eb6b"; + sha512.doc = "250ebdbd2a6dd3dd7d05c35cea0ea8fdb969bef983bc0a5f2c804129091f22ac0a499df482a1a990bf278ad94befc774d354341b30f9a0cd67539e1f63074ee4"; + license = [ "gpl1Only" ]; + version = "1.8.5.7"; +}; +l2tabu-french = { + revision = 31315; + shortdesc = "French translation of l2tabu"; + stripPrefix = 0; + sha512.run = "8478211e871e38765cbbd36f8f571e63b5cfb9dc652107a4a9178c11a16b419eba7314246878507f22bf7f66818f8c5d1516a527deda5a2dc6c30f9260f23b59"; + sha512.doc = "f489b0bd07b60797b53fc9010c699029dabccbf326767948dd815224f1c591cb59d6da7bbac0d0385ddfb6f0e885e187b2385bfcdbb88933588b06dfc34f640c"; + license = [ "gpl1Only" ]; + version = "2.3"; +}; +l2tabu-italian = { + revision = 25218; + shortdesc = "Italian Translation of Obsolete packages and commands"; + stripPrefix = 0; + sha512.run = "5b2348bed7ce47d7e2b8de6642e14b24ab440226d0de46a51eab08b3d11a39bada93d890e1ab9e2dbd3ce253b3263460fe7114baf9bc7b5c775a7d806c731ab2"; + sha512.doc = "c76981112631423d5d92ee9236d9b5b076e3d71086f9dada77de51362a5d5e01d82d5b018a68950c2b7f4b10eff1882d677243594436bae41bcc6ab996aa900a"; + license = [ "free" ]; + version = "2.3"; +}; +l2tabu-spanish = { + revision = 15878; + shortdesc = "Spanish translation of \"Obsolete packages and commands\""; + stripPrefix = 0; + sha512.run = "73cecbb031be2d421c25a7d6a5c04d08e30d83a88b4132682d434a879da915f1d4af56980f1bf04f7df5a3e881ecdd940a058a2dcf89b5e9f48c378eb322da06"; + sha512.doc = "a6886d54c0f5e1915ff9efbc4974ab1ef7f6dc026d67a0596ed47ac9e94da098e690bc70d5ed3e45a4d8cbd0f877f0cd6cd3a3757288dfc2df284e9c040b7c1e"; + license = [ "publicDomain" ]; + version = "1.1"; +}; +l3backend = { + revision = 70027; + shortdesc = "LaTeX3 backend drivers"; + stripPrefix = 0; + sha512.run = "b0fa82d3f6ad4ece3ce1e0b254ee52c97f30b143e458ad4a2f96d530f787650ae2cafa20801b865e696fb4deaed2fdba3e82ab938e09d563569ab13d6abb331f"; + sha512.doc = "68c69840f18a1f2c0442a008d632d5bd1295390a11208b8b94391564cdd0095aced7ecd3ae59035ec55faf267266115c76adf3839eb22f084ae348fd051547f9"; + sha512.source = "4fc5659fefbcdb53f30f6852b38ebe2e05238637ebbcf9885fef6496c5f4e54749f341bc492bc65c17e268c71bdfd6ee5add0bdcde9baf8e527ae48a4915fc14"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +l3build = { + revision = 69748; + shortdesc = "A testing and building system for (La)TeX"; + deps = [ + "luatex" + ]; + sha512.run = "32999f257488429d109eecff598df6f7cba7e4511aa2b9cedcdd7cdb9acbbb959f13a1d3253d73f75e02c5c91e29744fdd934230d186ae7e76c057e51145cce1"; + sha512.doc = "aeca997d50468e929d32c727606273fb01ddbce1fde2ec8f03f7e92f3f334ff7cf537432516b584f0420b9a93d7dfdf1f277d789222d9a3fe346009d2d46d72a"; + hasManpages = true; + sha512.source = "5969f5f85c71844c7d3abea497059f2bcf8b7bf96294ad746d2acfb876f3edc5e573aeee081f2ef45baee4eeef5465e69c1591412d45d2912f0391d6dfe35d18"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; +}; +l3build.binfiles = [ + "l3build" +]; +l3experimental = { + revision = 70027; + shortdesc = "Experimental LaTeX3 concepts"; + stripPrefix = 0; + deps = [ + "l3kernel" + ]; + sha512.run = "c25e7d14f3208e59bca4da786df9f63bf64455e9adf3517438e4065e99dc0e89fdfdc0325f7aa26aec7e9622b99029a370a5d0fed6bcc780a62094cf26b1a03b"; + sha512.doc = "4606266a1a8d5022594e7239821afc9d02b735b68bab4da681699851f748c0893763cb1943fe20eb7484f16ba955ee193e961b7f6235710f8d813198529245db"; + sha512.source = "834b404c08acc25cdcc1124512d527e7f094c18ca6283ddecf85bebe25ed8bbcd40f2c9dbf56c19280f8dc1db3a2f35a6bb996175ef2a85a15280c9be6cd3ce2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +l3kernel = { + revision = 70027; + shortdesc = "LaTeX3 programming conventions"; + stripPrefix = 0; + deps = [ + "l3backend" + ]; + sha512.run = "0908782021ed4318ee3d43eedd7b0a9b83621fc04f9e6ad3d540d2f87b24cda8bd69accdb9691495bb3f7320808b976d1b798b3c4c95778b9b2804f4401ff893"; + sha512.doc = "d57cc53087b1a164c9cf7586313acc176a4de52b3da6734df1e36603b5ccfdae9fb19542e46246474936363020ecfa65e12f024b1fb50097c3205bb6b6aa2961"; + sha512.source = "e9b7b0e179fb168106277716bc8519b6a39d8062e3dce86212d582d42680ff7bb594542210a8ed1ee969226485db1d4055df071da898234cfeb9edad92d675fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +l3packages = { + revision = 69992; + shortdesc = "High-level LaTeX3 concepts"; + stripPrefix = 0; + deps = [ + "l3kernel" + ]; + sha512.run = "906dd058afdec3fdc416e1a39e3cddc0b8c8079dea35bc1dc453ca4f287b849aef55b71bf9d8fac9a0c428d1ea3c6f0bccb0dfb9e895a2511cf31852024e3cb5"; + sha512.doc = "49e8d52bf64ccd22827ca9faf65dfbe3a4af727feb089509fb512aa5ca8263be2c10294485e6da5bdd6a3426215ec5c83a434322ead9604aa029414b1047cf33"; + sha512.source = "9afaf6e363b3a1a3402b64bbd6ef2236dd062c933583ab8be5f57217d90196b456aa477f5c9c830fe6fffcb79d2e0f2dc3ad51ab3c9cc764b61b5252cb211aa2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +labbook = { + revision = 15878; + shortdesc = "Typeset laboratory journals"; + stripPrefix = 0; + sha512.run = "92bd582cc729bcd3cea6979771e934d5a4a194536ff89a475309d3999ab0a2ab70d5ba5be6f0353e97498ab4e971e3209df9a3ca4ac99a8c9de27586a0f4a3b0"; + sha512.doc = "98758f4cc186df470e8a16b2e9365f3bec585be18c0fa8700df238befe052ad69b697357c7d89b19233a9cf2b308c29a54bf84215fa3ca8859111b0214971ed2"; + sha512.source = "23b9f993dbd431328590617c6715bb082cd1dac757db003b05296d318a002e85c8c541f5ce6a45703fa2cc481c7af98fe41e483c77b5025e50de324b68fcf525"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +labels = { + revision = 15878; + shortdesc = "Print sheets of sticky labels"; + stripPrefix = 0; + sha512.run = "b1cd175e1c5ece09926ad3fb5ef3b2dbc528435e26c81df563f674388083b481e6a6f072724254302c243a640960a942a6b356664675f4041c94962155f5ee62"; + sha512.doc = "0ac61f3a1ec027dd3631a4e6ffabdbf71ca27eb19c877a0beef8d7d991989d613769474e99770e9edc74dffc8b59981da8666e5dcb26450717be37b098a028b9"; + sha512.source = "debc22ed66f978aed88c84a0756677cc5faed39ef47ad37f8fcd4d6dcd02ce6b3a582ea6edc73ddd96ae04e7a50d43eddaba8404ceadb8c49439927f41f8c210"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = ".13"; +}; +labels4easylist = { + revision = 51124; + shortdesc = "Add reference labels to easylist items"; + stripPrefix = 0; + sha512.run = "1f792dfc8c3d51cbb3ec4370e4ea36612d503a9a92d088f0d8b03ccc78c480118308aa48e4dba66dcfd55c8a3442950242742eddd557bd6b44c925e01e361163"; + sha512.doc = "1ca630c5aa01e53d6a7fa65d9ebb4ccf5bc43af7d3cb66a6bbb287398e28764dae0b535eb4b821c2c406e22e239e8a88fc63a010d4e79977ef6e8cfd563afde2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +labelschanged = { + revision = 69400; + shortdesc = "Identify labels which cause endless \"may have changed\" warnings"; + stripPrefix = 0; + sha512.run = "9d40f477089880f8e0c61f95af1e94848dbac11a8ea5ee3a0c0c33a5883a8aba4c0471d2e23319667aa0dbf0699599372c8267588247809f316304e868ebaaf5"; + sha512.doc = "ca1f6dd7d4be5c9b130a17c75cfe927e354ffd5756bd893ef99c2f67dfef69a585e139d9d3b44e0828cf0928197bfcc8a909e5a32ca386380ca2a203a8ad0fee"; + sha512.source = "e3e5187658e31d0391910a1d4610cdb5572ddf13006423aa673475e165b04bcca56f6d324f0b383a6e7faf0a3263e68f5727c39eef38e903ee2950981c5b290c"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.01"; +}; +labyrinth = { + revision = 33454; + shortdesc = "Draw labyrinths and solution paths"; + stripPrefix = 0; + sha512.run = "06c61f5a0a2b39d644d5b741877f445dea48fefaaddfb7f60251ecb328f16ba2ec6f09731608ac5ca7b288fe77fc193984dad25b8f0ad0da5f35bdd43fb2f8ee"; + sha512.doc = "980a3bef8b8eb51cd454c835ba09205f8dedab92f747db9704c72d5433db75f68df298ee4ca06c6d68e0cb4c4b733c882d14bbbb9d877406163b0f95730a10ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lacheck = { + revision = 66186; + shortdesc = "LaTeX checker"; + sha512.run = "5a27d940fe59c61539d053bc6602bf37df1f538679eaf34d0e8b3ec3aed74ff619e4843ae2769aeafd10074328e9e27255376bc9e809d373d3913995a2a95b87"; + sha512.doc = "cf4355d56985f9335270e4280d10602299fadfd01605e83edb4e8b89cf0d91b3e8ca671257a9599d5f5578e7a85140d390edd40c3b109f77bb9fca5ba47ca517"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +lacheck.binfiles = [ + "lacheck" +]; +ladder = { + revision = 44394; + shortdesc = "Draw simple ladder diagrams using TikZ"; + stripPrefix = 0; + sha512.run = "bbe2f94442a4f308a416e9d849f9e4b8af12387e59e73931b563d5daaee312dbdf82a99f5122de897cb069a54f3bc13619e719ed717b38db4aebcac72c2c4f93"; + sha512.doc = "1cf2a2a2267e819c9ee723af9cf51d711f778c3583c859eb01f2b2faebfd0f7a6fc4f4ab6caa83a9df6a797175ec27d29f0debbeaeb39387954070623ab60b29"; + hasRunfiles = true; + license = [ "mit" ]; +}; +lambda = { + revision = 45756; + shortdesc = "LaTeX for Omega and Aleph"; + stripPrefix = 0; + sha512.run = "54da97daf172e3dae434e75425b80d1c617ddc9991f6ee804cd812e2c4bd70b49eb1a01318e243c10998870877d4f76e084b5ef0b0eaa89afa66f77a124a7c02"; + hasRunfiles = true; +}; +lambda-lists = { + revision = 31402; + shortdesc = "Lists in TeX's mouth"; + stripPrefix = 0; + sha512.run = "caeb3a547eb68d3e255d729cb6ec390cfaeb3bd9d4b4b6e8f877140fe24f4ee3ff0ddccd4107fa836faf5163d3d71209fed4a9e052d3329ff22a892d62b43b92"; + sha512.doc = "846c403f99194a19cd21e4d7367a1b43a8ad608055315bb36a1113fb37dd3d922dd8c5cb8474ae52ed3006be520b7e9023680e85f0dbb17f69a41c8c17e81a5c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lambdax = { + revision = 60278; + shortdesc = "Use Lambda expression within LaTeX"; + stripPrefix = 0; + sha512.run = "63ce2370079b4b2a286355d05d40771658e35fef085570aaf07d264d81571378a6d76db128e3fcea1c6c27632cb37f317ae28300059027979114e9eefcb5cf53"; + sha512.doc = "203a8ecde6022efcaba0680a507833ec56601887b47dbd563683195b828cd246d55cc9a44b91cb6ec2a3d0b8d7ce6d0777aa9519b93ca2b4b0f96f643df35dd9"; + sha512.source = "2790c5696eaa95b18c4c301d3a72d5aa0a72566cfebd514dab3546738897f2d0aafe55ef96ba51073fd07e98f0052eaca4cc9bd8d46f5fd9cf7b544b4f103c64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +langcode = { + revision = 27764; + shortdesc = "Simple language-dependent settings based on language codes"; + stripPrefix = 0; + sha512.run = "bc3e601701732d3ff533a7415446c2aaf7306732fdd6a8ac8aee6571cbdfc02b38f51fffde3a80cf5df6b0dd5e649971406f76d394500a74f1830139ea0bc0bb"; + sha512.doc = "7ac261071a2902d1e24cbe4bd43bf1baef418bdeb4d3c1dbee4db273d29918649f346e97b5ead3e3de2820110c0cd11dc58c78f765dbd07f7221f28ede5242a8"; + sha512.source = "60baef83840b42deb38d8ae66e18484e4a0431fedd23b1a8dc96c426840ee57f37ab613d93409c3ad8660eef2e759757daf39ec9aace30350623accbd21d2de8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +langnames = { + revision = 69101; + shortdesc = "Name languages and their genetic affiliations consistently"; + stripPrefix = 0; + sha512.run = "16d4b14025e142be2c0d21509041d99ee2eb9b4b765abfa3102cf79759c79e79f43191f8ba1fcea3d8c7269bdeb6feb0a9efafb1f1ea195b58ed97a307386bdf"; + sha512.doc = "0cc3548f9a640e3c6756298ff609bc5458f30fe096fb8557881356624dcfc6f81068af21731df3c5635381ef98c9b30c1f297213b8489e2bab8840c78f723ed8"; + sha512.source = "dba944b6330ed6ec883ae6bc0fddb724b74d5ea31d703cd89e85e9cf91642d9edcfdc4710e812bbf658774611bb29764fa8e2a3e1df678e70aab6fa160cad50b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.0"; +}; +langsci = { + revision = 70028; + shortdesc = "Typeset books for publication with Language Science Press"; + stripPrefix = 0; + sha512.run = "02e572eac6731aae4dbf7db5c1e4652dc34cea9dd6a43f0f63b7d7e4aa79113ca5ba4122758303d33c94f33e42513e4d7b51d22e4b7c17fa8b7ebacf8e5024b7"; + sha512.doc = "05c1231243e03156ffa01cb84f16708542598fcd5349c858913c2d0c6f0962871ee70034fe8c2255ee6338d7d659ef0262a408650a262ea8c6c1e8e173ca4e12"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +langsci-avm = { + revision = 66016; + shortdesc = "Feature structures and attribute-value matrices (AVM)"; + stripPrefix = 0; + sha512.run = "00cb724f7783d4f6d088f38bd60c816afe8c117b338bf3ae320e4b8118416f025b535989a48262d13d210087560ae01d850f2562f3d75db38210fcb6c012ab38"; + sha512.doc = "618e957df349847fd4828b07ad44e9a8247bcaba893704379471afbf9348c310da92fde003bbbe963b3249ba532982483ad7eb53950a5f39b27f9c17058f7bd0"; + sha512.source = "bd2a2411ad9e5d418f33b3c758bcc7f572aff8be2a8b757c247bf099d246f4b658602cdda97e12de0e784259e13b3e4840b5789baf35606ebfc3baf2629bea10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.0"; +}; +lapdf = { + revision = 23806; + shortdesc = "PDF drawing directly in TeX documents"; + stripPrefix = 0; + sha512.run = "10bb6891b82334f7dad4a1cf48c78b2b55c3b4a8939628a26576e99495f00e2bb8ee82028b13db4de6224e58e421402794feb2591842030cd47898506589ff6d"; + sha512.doc = "6e561e0d513f7b18e4e40d11fc1f077a061e6cb08ed072de1d186bb86ab1fbd3905af6a79f9dbb0c201e437a1a8716706a83f1709d580c293961ae454699c9c0"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +lastbib = { + revision = 70377; + shortdesc = "Record the number of citations in a document"; + stripPrefix = 0; + sha512.run = "e2648c74401833e4be62ba616e146bd662626b1e6d9dd3e6fb3b1c371634e3cc022dbd1b4f670d957d239ca9ae776dec94ff63306d54b9dc571ab6d701850c8a"; + sha512.doc = "45ce82d5721d79e26e1d7f034764b526315add13e6943fcfcd6105b9040b7ff4951e7c8482be15d2366880286e1caea8ef47aa8a6fce92941e9f19be1e7003b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +lastpackage = { + revision = 34481; + shortdesc = "Indicates the last loaded package"; + stripPrefix = 0; + sha512.run = "f4d30e327704b32afe1bcb81023a247095203a9b47357f9a6dc4b631f4bb669255ba899cf1c8378b42ebd16f2608d8a649a0999f26e3d05c963eced1cc955ee2"; + sha512.doc = "f31731b5a93c154db123e66699ac5175fb63b965522bb511d344577645f9b8ac6d78c6a1a108cad8914b1c01b1c7a6e656743b075a03322c306aaa5417f62be2"; + sha512.source = "f894a701e4f30797039bf60e98f9f9e6cc730a167fcccf88075802c0a5a0244eefce9f854b95207b7a0714984592030965f818ecd72c98af199c07f3400eb74d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +lastpage = { + revision = 68557; + shortdesc = "Reference last page for Page N of M type footers"; + stripPrefix = 0; + sha512.run = "058f7b1e73340b5290beb22054c1bc0b97cd64a3051e90a4359ac7916ba033ce0817e6a1139a8b6b301bc0f68176bd882e8bdc7a7b59a719f0d090dc7cd76242"; + sha512.doc = "e72576d702e2e76242c18d645351568f4adaa468b5946fca30c9ca7b9d2c36a703ad91df3b898089499c0127aeeef79e904652f35ab6bf98f5126ec6c387baa2"; + sha512.source = "3b0f6326e815812644493e1a0ff422520e9e555f87f93d1c3f31a3b4a1250254ff0f4161e36785cdefb09833c9a3ae93e005cb4d5a4c3157372f79e00e23a779"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0e"; +}; +latex = { + revision = 69443; + shortdesc = "A TeX macro package that defines LaTeX"; + stripPrefix = 0; + deps = [ + "latex-fonts" + "latexconfig" + "luatex" + "pdftex" + ]; + sha512.run = "b6696892356c87acc788255f0023f081078878f4f76408be138b8b9b62f0fe01f8dd8bb68c8049fea319b41dfe4dafadb3237869fcde797ff5580ba94d68a473"; + sha512.doc = "d599e1fb7c4433658aa65df89ca318467b3c6689d3e4e2d16bddd9397968888052937900d382fdd43fe627813e40d242d7728325a1bc15c8ab5658fd6ea4c912"; + sha512.source = "4b156445e50bd24dc3ab2f90088b0ae5e25930818fa14b7db3ccc1aec4642cb3172f07c57bf0dab3e17f91cf22e1b5d5fa08e705e392635328fd366514da7a24"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2023-11-01_PL1"; +}; +latex-amsmath-dev = { + revision = 68730; + shortdesc = "Development pre-release of the LaTeX amsmath bundle"; + stripPrefix = 0; + sha512.run = "e36a09409559a415c14fcd5e5aa8afdf268ac8b099814a1eb6fec88aeaef17ed2bfc1649b1859d8f5d4c90b25af520028c184a01866e9cc25bfd5ad7e945f84a"; + sha512.doc = "609a298efbf504274793777b78af7db57b3e161ca8a49abb2cf9b095162a93c2eb0b796f24183d512f4ad30375401a56c6e238b1c18e61038b51bdf3513542a2"; + sha512.source = "abd63e1e75b661b4301e90ec60015073e42f2686f2e639e2c264047c3d6f071c10cb933049baeea3b49734ffa0596253be65644d8ad54253443e8ba42d09d30a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-06-01_pre-release_0"; +}; +latex-base-dev = { + revision = 69872; + shortdesc = "Development pre-release of the LaTeX kernel"; + stripPrefix = 0; + sha512.run = "d24b56bb77ada497449c501c549cb6fd06246f899d4f3a2d979292ffe85f80f532c5cbb8b3e49b6d1bc0f8098d56c34e87f15e8123247ed7af59c9a33b815a64"; + sha512.doc = "4ec2405d8d3e3c92666bbab01cdb065b174f82bb9c3b91f0bd7af23dd2fe3e8cda98060cf1e08df349ea32386da911ee4c7a28dc29bc52ec6ac02a46cab98b66"; + sha512.source = "83f7103d961f186fadd6feaf63cfb4f9fd6cc2aae0d5c04b6ffbd0c0eee2d51cad4b2458491cab7760a29155682d806fcc3c1ca1dc8d788ad248a58dc071a361"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-06-01_pre-release_1"; +}; +latex-bin = { + revision = 66186; + shortdesc = "LaTeX executables and man pages"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dehyph" + "everyshi" + "firstaid" + "graphics" + "hyph-utf8" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "latexconfig" + "lm" + "luahbtex" + "luaotfload" + "luatex" + "pdftex" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "dvilualatex"; + engine = "luatex"; + patterns = [ "language.dat" "language.dat.lua" ]; + options = "dvilualatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "lm" "luaotfload" ]; + } + { + name = "latex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx *latex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "dehyph" "hyph-utf8" "latexconfig" ]; + } + { + name = "lualatex"; + engine = "luahbtex"; + patterns = [ "language.dat" "language.dat.lua" ]; + options = "lualatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "lm" "luaotfload" ]; + } + { + name = "pdflatex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx *pdflatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "dehyph" "hyph-utf8" "latexconfig" ]; + } + ]; + sha512.run = "4067db41ccc58892a4683c2ce5e15784e9aeebea88a9d9302dffc36fedf48f51c469bb1e99035ebafc58aa0a8a442c12b06457898a71e492ce778e58122a6a62"; + sha512.doc = "763c7e3df586a275b2a756b591c96ae98ca1a2b5f0c694e9b502d55e7c4a0ad1d40b15ff4987e2be6a06f2f11afe99a4f7fcace22c45877dc54741383a55df25"; + hasManpages = true; +}; +latex-bin-dev = { + revision = 66186; + shortdesc = "LaTeX pre-release executables and formats"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dehyph" + "everyshi" + "firstaid" + "hyph-utf8" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-base-dev" + "latex-firstaid-dev" + "latex-fonts" + "latex-graphics-dev" + "latexconfig" + "lm" + "luahbtex" + "luaotfload" + "luatex" + "pdftex" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "dvilualatex-dev"; + engine = "luatex"; + patterns = [ "language.dat" "language.dat.lua" ]; + options = "dvilualatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" "luaotfload" ]; + } + { + name = "latex-dev"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx *latex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "dehyph" "hyph-utf8" "latexconfig" "pdftex" ]; + } + { + name = "lualatex-dev"; + engine = "luahbtex"; + patterns = [ "language.dat" "language.dat.lua" ]; + options = "lualatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" "luaotfload" ]; + } + { + name = "pdflatex-dev"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx *pdflatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "dehyph" "hyph-utf8" "latexconfig" "pdftex" ]; + } + ]; + sha512.run = "56988a74dc1969af32a87890a930eae5d1c41cc7d78d84d5293836c139885e1bca3103304d0083583e0a9d9ad1ebd76b11f86df67887de6ebec7b36137755075"; + sha512.doc = "2166531c752eb0295b643f0e20f518011d2c3063a9a5de5e7e913b2cdf8efcb382a9460ef95a711420e9a9f49fc2ac77a538361c4cdc7d730af5acb43f15f2ab"; + hasManpages = true; +}; +latex-bin-dev.binfiles = [ + "dvilualatex-dev" + "latex-dev" + "lualatex-dev" + "pdflatex-dev" +]; +latex-bin.binfiles = [ + "dvilualatex" + "latex" + "lualatex" + "pdflatex" +]; +latex-brochure = { + revision = 40612; + shortdesc = "A publicity flyer for LaTeX"; + stripPrefix = 0; + sha512.run = "de98a91947d5cb919b6a2c6e6a87f63499c8c5975992d039bb8d2a4662ed597cbdad99668b006cf775f71af936e5ad285958b48b57eac61783460fe37ed76298"; + sha512.doc = "f057b86b61ee1f50430cdb83a56c27896e052047bbc93c4f09884b7d76f16f73cb1b570341faa2b8c771c0d42bb4d6450b8715c921fe866a57727eb4ffdd329a"; + license = [ "lppl13c" ]; +}; +latex-context-ppchtex = { + revision = 66687; + shortdesc = "Legacy stub to allow loading pictex as m-pictex"; + stripPrefix = 0; + sha512.run = "6ab0e6d04cbf49cc78ed8f45d65837055d73f55ceea9014e5178bb30f7a322137856d187b7e0808f08df48408b57635537bd8dbbb1157d1508728aa2bf7e1190"; + sha512.doc = "130b525dbf4172306b9bf6b74defccbaa17ab1871d044ce693ba2c0ebf568adce98eacc6cebae94bca425c7b8cb7bd2860747768a03380018a9abd33175786c9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +latex-course = { + revision = 68681; + shortdesc = "A LaTeX course as a projected presentation"; + stripPrefix = 0; + sha512.run = "533e270cadcee8dd7510368c596272d9e877c753f76246f11d8b3db6a3eed96319284c15a872d1fcbdb0557c7a267eae4beb9cd2d618f98759456357fc2b6087"; + sha512.doc = "56f0cdd7a50b396657d60d3d10586e0472e18f3b66005df08746fd93cd481742bec1f1e820248185f9b25d6b58251dd8a4715231272324a5208e25335ede85e9"; + license = [ "gpl1Only" ]; + version = "2"; +}; +latex-doc-ptr = { + revision = 57311; + shortdesc = "A direction-finder for LaTeX resources available online"; + stripPrefix = 0; + sha512.run = "22017cc47746d2e14436915a0d649b31050debff1827cca44a3ab7bf9b240f40450d445a8eaab811b8737f589839ab7f2078aced47b65b320237ddbcc443b99a"; + sha512.doc = "c7d7217a9136785cfd6ddb000e51d455e7482bfe395a9131329767bfffc71f918c2349b1426b615a6740263c958530c68c044ee3ae78300a004a8acf20bd8bdc"; + license = [ "publicDomain" ]; +}; +latex-firstaid-dev = { + revision = 68730; + shortdesc = "Development pre-release of the LaTeX firstaid package"; + stripPrefix = 0; + sha512.run = "837b36861d1c5c42107ebfca9de78df1e4426b2466c001532ff3717743babecb8f574c5b431cc821f27a8cf20e88fa7e6dda5633fa8fac28084007183621ac08"; + sha512.doc = "2f0676b179ec977da7d91135d2e9330bc37a67eba038754998445c49523d1630c34360bb857c108ab47a185a409d3924039d7b03f3b420d74c52fc98606ff408"; + sha512.source = "c783d78612a76b55f49828ccd3f719ad94ab3a2a3d8b936e2049322c0c5fa773b8db76bc1a8d471d443bf3bc0d7897df7db628866287b64ee281764ae258f839"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1b"; +}; +latex-fonts = { + revision = 28888; + shortdesc = "A collection of fonts used in LaTeX distributions"; + stripPrefix = 0; + sha512.run = "98549dd0c7b29511abc3a1a6b6803a86af0b48121d47e292066f3b67e4b5847efbb7025352c1ec996778c7ea3a5cba552385e9b4dfd6ab005d716f503e37a26e"; + sha512.doc = "4d3162776a17f31caa8e6a0fe05eed9447b681d77e653371cb5fa5d8dd2f01bddddc9f95ca916f233c11f8ec7d15e02fe575dc953fdd18c34ba877829a142bea"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +latex-for-undergraduates = { + revision = 70210; + shortdesc = "A tutorial aimed at introducing undergraduate students to LaTeX"; + stripPrefix = 0; + sha512.run = "bc5dd03127625a8440ce605d8f4e8de65615f330dc9194e0e096175095263eec3ce2790dcccd96d32118492fa71483645510675f4868580fa00daf95f12f1aa1"; + sha512.doc = "b21b7a6a759eba0ae086ba3492266b9784aa651a727b22b671b3e3668197727118f35095245ad8d4b99a40f6c5c00500f7791b3cb6a6237493b7656a17abdf3c"; + license = [ "publicDomain" ]; + version = "1.0.3"; +}; +latex-git-log = { + revision = 54010; + shortdesc = "Typeset git log information"; + sha512.run = "15994c6eb9ba1b194df270c68a3d74ab3db11974875ce192559182b2dbfa9b308d598056a3145f2cc2f6718865a5b140ccb95dea22a9e23edee527e5b86362ff"; + sha512.doc = "52bc94324c64caac9a5b25b49c9ea01b8560433d640646ee70830d27637482cf50da95bbb86db93006f2be4ab9f5f79fa144e4b631d62c05f0a11ab45e639cbf"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.0.0"; +}; +latex-git-log.binfiles = [ + "latex-git-log" +]; +latex-graphics-companion = { + revision = 29235; + shortdesc = "Examples from The LaTeX Graphics Companion"; + stripPrefix = 0; + sha512.run = "3148a646539db3622096f9aeefd7ca2d44b0cf83cd454673893978897d07cfe7107b8f5bc745bc6b60734d4ad3429be1ffc2edaa8c9dd1721b41bfe913fa0dbe"; + sha512.doc = "ab9d885c811af3964e8cdd8576349059bd45d660e6b9a7e931697f7c7fa5282c725e044817de8f2648ded59519d1592945e0804ba7cbe0054ce2bd4d44606af5"; + license = [ "lppl13c" ]; +}; +latex-graphics-dev = { + revision = 68730; + shortdesc = "Development pre-release of the LaTeX graphics bundle"; + stripPrefix = 0; + deps = [ + "graphics-cfg" + ]; + sha512.run = "a6357498f8bb7b6e47dc78f22163955e6f207df84a5270bec98d003ff7c0c31d82a13f3ca8e6d1242721bbeee6d5c8bc4e6bf744708fda9a3e5e9ebe30eaf9bb"; + sha512.doc = "0edf4d8f6b4d48df6e5f46ea5836a30f7608701a0470fdb713333b4e17c0348bbbde8df2e9dbfafb8bae924eb70c34e351aabe4a0e460821790adfa0ee52e384"; + sha512.source = "f2d2b4e1c67d5159c14426df49065edd0605a1db88ee0c2d72d582edab070c6f8f11bb517f969893761c0c22935df69e5b9dc6d981e0f6136326277e1e2be927"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-06-01_pre-release_0"; +}; +latex-lab = { + revision = 68720; + shortdesc = "LaTeX laboratory"; + stripPrefix = 0; + sha512.run = "ede4176b7ca60193acd644f572db5d1611a6940027f7641ca755634401b19e20eca65915d57e6a0859e465e818d6854ca98dc16106782bee0f817d776c056a10"; + sha512.doc = "eda6ca871645fd6fe60424329e4c4d8d9817039d9cc30bd6f710c30675a3e8f0b7f7523b081b871e9e5abbf62a0ce0e22854aa443684818771ce2022f4887e7e"; + sha512.source = "acc092bf6cc685cf8c9d5a0cd5af47022c3936ff0e509a3743ae22ab888daffd0c1b7b657c5a1e1019232c4047e89626963ec1784b406ad16d3dd3f10f6e19b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +latex-lab-dev = { + revision = 69872; + shortdesc = "LaTeX laboratory: Development pre-release"; + stripPrefix = 0; + sha512.run = "7812684eb2629b139e5871b5b916e2344b85d8bb88bb983d57d292d9873147d51b60177733e61180d86b95d185e456710acc5037f56fbfeea52ab1d3e04433fe"; + sha512.doc = "7750fea3ff6ed1352db54674844367b3ecb400cd4e306e3c130acabcdbe59b3abdc7508dd12e5febea2381cd74407aa3cb3bcc25f5d7b34401e75e1eebde2529"; + sha512.source = "d1ea2349dde66988f51b9d1f37875a2d02a4b44499f3551152ce3bf38460d31e5cbd423e17ac72dade53eaac00720d547b460bda25f29821875605b02c51ccd0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-06-01_pre-release_1"; +}; +latex-make = { + revision = 60874; + shortdesc = "Easy compiling of complex (and simple) LaTeX documents"; + stripPrefix = 0; + sha512.run = "de9a924c38afe1abcd0802a17de4c5fd2cb444809dc81e00b6964cf3d0c81b8d8796a1bfa804250701ac4d71f42bb9d2a9ca1ec0740f59a8feb329d26aa605e3"; + sha512.doc = "aeef6568aec936c43dd0bfada1245a0d353faf2329e6e66e9d49ca8a1a2f9eb738ab1667934cd0a160e074c2e2da85aa8b068bed0bdb1ab1b944cf62f42af087"; + sha512.source = "521a553ebb556cb6df809ea5f830c926101dcd06f147544c19476a0b0ba82154c3b0316d795f4057a906370972648b485a96dd7386c8e6541160af469a74487f"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.4.3"; +}; +latex-mr = { + revision = 55475; + shortdesc = "A practical guide to LaTeX and Polyglossia for Marathi and other Indian languages"; + stripPrefix = 0; + sha512.run = "eb9b8b12f15a8662eea0e3df907264093074cac1d8f8e1f027186b35f3f3318c4b8c120d261be21350fa660b51a5f33e196d957864b0676395ded0f70940464a"; + sha512.doc = "51dcfff4a8df46a8715d07d2528d3a1960479ce4bffba9b8eb5170d5d6307f0c776e197bdbe788d316067070c1d5f5d1382c32430e94ea83664868931a844e52"; + license = [ "lppl13c" ]; + version = "1.0"; +}; +latex-notes-zh-cn = { + revision = 15878; + shortdesc = "Chinese Introduction to TeX and LaTeX"; + stripPrefix = 0; + sha512.run = "5e5b3bb01456fec3dc22cb5d0d4f521b4d4f5f8f3119fdd76ea9cc55a70a2ad8a2b72e36471894ee448c1d40d887d20ac8fda39c4a3fe2cd111d2850eec12071"; + sha512.doc = "477df31445a2991db3c2b8cafaa97662d722f3f7171c2f756cf025717cb3b896c1773adadbc42c22cb360f7542a0e658547f15cd71c54e9b79f76fb1e2097e90"; + license = [ "lppl13c" ]; + version = "1.20"; +}; +latex-papersize = { + revision = 53131; + shortdesc = "Calculate LaTeX settings for any font and paper size"; + sha512.run = "00010f764235c6d9e4d6667c8c8b9f0ec6ae4b65afb53109f8179e0429d4b3787bd6b0985cd511f770cd74512483d1077e0f42136fe7ce1871984b372f2f2e54"; + sha512.doc = "8ebddd884e3e533d06332f2d6f8657ed54c9c376b3de68c7e7652f3b2835ec6601f5326ea70dc830b645440f0bd9ba2281e4f71a847946bb595771c6a950c0a6"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "asl20" ]; + version = "1.63"; +}; +latex-papersize.binfiles = [ + "latex-papersize" +]; +latex-refsheet = { + revision = 45076; + shortdesc = "LaTeX Reference Sheet for a thesis with KOMA-Script"; + stripPrefix = 0; + sha512.run = "ea6751fc09aada1b8ebcca08ecdb10279b6df881b3b373b04e8c238609de92b4cdc4f1e7321f178b15637c0b712e9781317af07030f2f9297a3ce23a5f46cb32"; + sha512.doc = "77149dabb1fe5c4a46591b3b307d02b2e2b33a07267afcdb44b77a2a823dcea9ea76b4be5ddad530151b638cfbcaf5d87ed0fed59a9e8ed99acb0895717bc71a"; + license = [ "lppl13c" ]; + version = "1.2"; +}; +latex-tools-dev = { + revision = 69872; + shortdesc = "Development pre-release of the LaTeX tools bundle"; + stripPrefix = 0; + sha512.run = "04828515f6eb9382d3c3d9c2ae8fa52bfe42fcb511b36840add979901b4a7535ec5a40d75113f0240299ec3bb07b59fc54fa65539389467f402a7ff15714ccf2"; + sha512.doc = "7136ae8556c19d2eaab7891981cb10b52e4538d10fd82073843744996de3ba2919b07ca63d5fc2100d093b9e9db862dc1a4f7d19615f96d164aa2431ee2f9b8f"; + sha512.source = "2073e38c2dc81da1d79fe6567bb99cc5f2649a8352b5e4164ae21cb0efa9d7697a1e9e8e71b5d3ae636eb215ce14c5b202cca88ebc6ba18c15524d0f566568b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024-06-01_pre-release_1"; +}; +latex-uni8 = { + revision = 49729; + shortdesc = "Universal inputenc, fontenc, and babel for pdfLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "1e98eb60547932eb218f30cc713b94e8c7ee5861e66cc600b01f577a37e318a5b440b65c2aef1c770ef94bb4c4cf86d5d1636943de60f78049d2286a92ba5d81"; + sha512.doc = "201de55826ce4911153f079e1107e2f4d2399d3d3cca95bc669cd958d09839ed7de778d644502cb6af8429818834027c9d3f3255fe58f95c985d1a96e4682f22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +latex-veryshortguide = { + revision = 55228; + shortdesc = "The Very Short Guide to LaTeX"; + stripPrefix = 0; + sha512.run = "5c32c836c5ada42858de4579167848ef51c4b7626601fa95fe56175f406cb747bba5015ffe369ebfa93e789d29ba5329e1ab3e42262699695fa59b6cf047a581"; + sha512.doc = "e2c521e768ea425312a400d88c893404c0f86c5886f595162b2a03493836ee1a949e2feebf8a8b3c9d6450630ff644b8973374f9963c67478af29e2a432d2f9d"; + license = [ "lppl13c" ]; + version = "0.7"; +}; +latex-via-exemplos = { + revision = 68627; + shortdesc = "A LaTeX course written in brazilian portuguese language"; + stripPrefix = 0; + sha512.run = "d98f99d1da5b8192cfd824829ec31f09f3178b0682885e5f497203c6f3f73bedc0a4f0a766ccde2f4f8a0e68b231f4d1213b3586fd1093588f3a9312716f072d"; + sha512.doc = "605dba889bfa1ad23b2990b2f0f40db42947b718cd272d8f61243818d40ad9a552fb61f87ff4e3844e580d3acaaa9842c2484c62c5c5dfb4450755db3fb02758"; + license = [ "gpl2Plus" ]; + version = "0.5.10"; +}; +latex-web-companion = { + revision = 29349; + shortdesc = "Examples from The LaTeX Web Companion"; + stripPrefix = 0; + sha512.run = "5f45c7f74a0e97b938009ada69146875e141edd556165b62185553b0ce5f590d5ca6f93a875dae1c546ebc788156d5cfc69c46535000adfe6933abe79a2fb06d"; + sha512.doc = "a972860f65d763c6fb45e9726e5dd7b8234509b90634f45b8b25e090da92d0ac577bf8b33ea7b0a0f91e4e5639bf62c07086dc36708ae697c1e16e644acc83f0"; + license = [ "lppl13c" ]; +}; +latex2e-help-texinfo = { + revision = 65552; + shortdesc = "Unofficial reference manual covering LaTeX2e"; + stripPrefix = 0; + sha512.run = "34b91b19e1b71b1df6d0f57dda4d6976a93b16afac259656c9d4e331b0c23a9b0550563c1a10dd7a95640e3740b3b15597c1023f6c2721bf2a64800466b9cd09"; + sha512.doc = "d4584d9259f3c1867e7445d4a219e4decc5ba3b305e20d1e780180a47fbad8df4d55552726d8288e78c8388823a2b652b81080c8139b00f4ea3ca10e5789375b"; + hasInfo = true; + license = [ "free" ]; +}; +latex2e-help-texinfo-fr = { + revision = 64228; + shortdesc = "A French translation of \"latex2e-help-texinfo\""; + stripPrefix = 0; + sha512.run = "96366ea420532f56ae076da48f5402c2ee78ca27fae8180795d6cd18aae118a8c7060208ff43ab64526addcdce9e4d90790583842b20c751f37865cf616e04e4"; + sha512.doc = "52f6aea9ac2393a73d7dc7ce8ad4d6f08e0a224397199d5def97412502026717e8cb966552368899c50718a1049b1ad4610d2d23150a45bee55cc2c776003db7"; + hasInfo = true; + license = [ "publicDomain" ]; +}; +latex2e-help-texinfo-spanish = { + revision = 65614; + shortdesc = "Unofficial reference manual covering LaTeX2e"; + stripPrefix = 0; + sha512.run = "870c8f3af54ac42df5f4958669cf730cd16084c985f0b377c5aba9d526b8f7be14b367791d2c0a1f1a715739390ab63777ff2a92e7f9aad09897c8bbecff495e"; + sha512.doc = "4c751a7305e089dab61bf991436ab1e612cfca0d17e416e21d659c04ef32eeb2d14dbeb09d63649a2b79f842766a218c43ae2c6fbeeba5549f039f991049a79d"; + hasInfo = true; + license = [ "free" ]; +}; +latex2man = { + revision = 64477; + shortdesc = "Translate LaTeX-based manual pages into Unix man format"; + sha512.run = "2617f6e8059f30c0098ea896cff69f585ea2ddbd3bbbd8066e7296dd833d3a246b8fefc0af71a92abf7e2051c754c0e3e6098175a4b181780563416bc9146b95"; + sha512.doc = "390666cc56ad70342c9a24ca593fe65b3760674a882ed8bba383d193f2578285727a085f823afc03fa0dbc9966612caf9a29222fd2a9f39214f01aa268acdc50"; + hasManpages = true; + hasInfo = true; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.29"; +}; +latex2man.binfiles = [ + "latex2man" +]; +latex2nemeth = { + revision = 65269; + shortdesc = "Convert LaTeX source to Braille with math in Nemeth"; + sha512.run = "f2669a9e58857094c922b968f337e2cb2cf475b07811d53c61a8e0b4dc8bcc41d95186940361676bc62c0f235edb4fe7a7c0d5ee0f6d74c541d1108960e18e7e"; + sha512.doc = "7fa7ae1c628e29549fc3cb2c98164e27f60cc0bcbf14e26b7a325aee313a5f41c3144d5adf2993c20999016f4798dcd436d96c637c4258ace0efc3bda4a54a43"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "gpl3Only" ]; + version = "1.1.3"; +}; +latex2nemeth.binfiles = [ + "latex2nemeth" +]; +latex2pydata = { + revision = 68919; + shortdesc = "Write data to file in Python literal format"; + stripPrefix = 0; + sha512.run = "7da5e33f287bac42a378bf33073ec6a982dff7000097fdb865844299efeb9e7a1647ae49bd3332b036755dd4da6be34fbb197c8148d2c2af5c60b7580d0420d1"; + sha512.doc = "8d78f4bfe6ddd1742baaa792842ab9ada5cdf4e1eeb3fb3496780e3a31120406d56be4be7cbbade5815f72cab57b76a5218e3bd86ef4593d1fc75fa2196e7212"; + sha512.source = "fe7111c44158c400af7d0feda67e2bc8a1cc313ab8bca7c101ed75e57ca1a00fe434232ad4c5b78a19fad388d8a8cfa0af6cd53c7f84b809209d7bf955f8e05c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +latex4musicians = { + revision = 49759; + shortdesc = "A guide for combining LaTeX and music"; + stripPrefix = 0; + sha512.run = "a37c75d55857e9680b8e4b0f59f1889f3b5198477212ea531aa6bbf9ea11dbae06fef7fdba9e706f016c6c0618eebe4ddb81ba73b48979683a22592a0adb119a"; + sha512.doc = "738c2c467d9df87cb1eccf0442b5c94a97a3c4c2b329d78d80b05d2adf9e3be11aaf2fb407ebc29f07e6455e6533464d981ae65122b080aebabdfaa29cf71b61"; + license = [ "fdl13Only" ]; + version = "1.0.1"; +}; +latex4wp = { + revision = 68096; + shortdesc = "A LaTeX guide specifically designed for word processor users"; + stripPrefix = 0; + sha512.run = "0111de0987679fe40b14a4ad0dfa098fef36acf15e099f932e75121c26bdadc2e493c77b1d5b4208e662f2e5893955cfad639bf018d48aa5e7a7c77e5d009c6c"; + sha512.doc = "eae8e0b5e4fe28311508b09b4b8b03ac31469e32772427c5d016bf43d48e458fea06f9dcf9ed696e1eaaea7bfd6b0ef4661d8b84c2bdedec44ca35c782079bf9"; + license = [ "fdl13Only" ]; + version = "1.2"; +}; +latex4wp-it = { + revision = 36000; + shortdesc = "LaTeX guide for word processor users, in Italian"; + stripPrefix = 0; + sha512.run = "691d8936d71ca825da3a5fb193f8f7067480981b1b9bc93100f54834a7f9500e66785a216110cb1eb5cdd41b538333b693dab8e0e855e546a3eab90c43c48630"; + sha512.doc = "c0c527bc7e9e71038316be5c6a57f4200ed69e7ed6fa0f066923cb14d14e20e90213cf0b989d3ba746bdb3e2263cf1daba56db3073017a0d7582e40640d35fd3"; + license = [ "fdl13Only" ]; + version = "1.0.10"; +}; +latexbangla = { + revision = 55475; + shortdesc = "Enhanced LaTeX integration for Bangla"; + stripPrefix = 0; + sha512.run = "8b61b8aee0e95339b356fa85b9bb7ad3833ccf410267eb31a84a811c25c4e34ac350952fa26ed6461468bfeca37121e809ba560fbed7a0d8e747613708ff7795"; + sha512.doc = "8d8c686edbf3e70e70fa577c7d09f2e3d3f1ab938253ed01892ba030be0ba948bba48d67503a6f215628e03160bb32878f868d8a72b5a0d65ce3400fb9011ac9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +latexbug = { + revision = 63596; + shortdesc = "Bug-classification for LaTeX related bugs"; + stripPrefix = 0; + sha512.run = "343629bebcc022be463cfb13e155c372436b6138a3ce641ddb7ff17286788b6db438d040a8fa76bbd0354b880e5455a1aeb5060202b99de2cff1bddafdafac35"; + sha512.doc = "67209c3221ddf31ea4ba6a9678d340a590feebbe4965750a65037e3c8546d4a3db0b43d0ea5fe178eaa5e4d1500304b2a3fc04bc8e65781da2a5bf22e702fd0c"; + sha512.source = "28e88cad4c3b0e676e95d3b4be46285a73036af1662156d298bc288cead111425d956352cb94165ff515d5b725f1aced863e6cca917d6cb100ca71affb5da7d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0n"; +}; +latexcheat = { + revision = 15878; + shortdesc = "A LaTeX cheat sheet"; + stripPrefix = 0; + sha512.run = "530041d286048809968d91b20fd40c5ec41eb440fec25bf08f92af0f0fd5e1481a1344ba3c659da4477de353d222f3cb160d75eea2241ccf19b05e63e059ed6f"; + sha512.doc = "28abbdc3b53c245b0cfb6ab68549661a72d37df004a5c760f5021e91b1df892b02872c7e20f328c7dd4624edff96f3b1fadfb46cf35d080c6b7c5635dc36adfc"; + license = [ "lppl13c" ]; + version = "1.13"; +}; +latexcheat-de = { + revision = 35702; + shortdesc = "A LaTeX cheat sheet, in German"; + stripPrefix = 0; + sha512.run = "84de8075c1ba86467c8b34ed614462953ca8b9a237bb84453b2f9a1482eebfdb628c3e460d38da126416cc111387d68d3f479c5806ecbf06d079e47c35b88ca6"; + sha512.doc = "dda8002178b55e155f7ce1f49f57f928b6c5097007daf36aa473c1a2d07aef4c3ec5e1c238537c0531731af0cb0d51804b0c0310be63954f112f266e737c7d37"; + license = [ "lppl13c" ]; +}; +latexcheat-esmx = { + revision = 36866; + shortdesc = "A LaTeX cheat sheet, in Spanish"; + stripPrefix = 0; + sha512.run = "ab9965189096647e8af9aa58a937fa15595bed32055b3819bfd12334cf60e01d18b12563de8169ea28e3c0a7768864e51631c29bbbe47d45e09ffb2b87c5d524"; + sha512.doc = "a45f2db2445e2daec8b31e995669a189c1d201f457e06de7fc2a85ad85686b31fcf70040e7840e1168e29b2e5caf796c45b6ce934780fa5982d0750438263606"; + license = [ "lppl13c" ]; + version = "2.00"; +}; +latexcheat-ptbr = { + revision = 15878; + shortdesc = "A LaTeX cheat sheet, in Brazilian Portuguese"; + stripPrefix = 0; + sha512.run = "e50cd94941704f1a620a7411624ffd61d47aa4ef2944220ef0bfa9fbc428d8ea46be17bb3b18b30d645dcddf3c8091dafa9532f809dee7af230e2133c86b9bf5"; + sha512.doc = "00369fce725567a85310afd3063a4a20e670d8a0c57ef7e4515579ee0f91157f44bac2471b076c2ba51253e2c172447cc4b915877d80b0c43874c4e125f5f9d4"; + license = [ "lppl13c" ]; + version = "1.13"; +}; +latexcolors = { + revision = 49888; + shortdesc = "Use color definitions from latexcolor.com"; + stripPrefix = 0; + sha512.run = "b22521df5572411a33ba84b2d7560f0735a6f3a3bab0c6d7ca460e19333fba20ec8852becc618274ca7b7461fac1c42d0e6ce7fb9b7e4349c74bd05e8e1b5faf"; + sha512.doc = "5f6f26c2ece42c07b2b2e634308a2a417e12a105d9856d630f483443825615d770ed35f7322f59904b1d8fea9425e0222fe9deff27451a5aec52fac39eb9369e"; + sha512.source = "369c0cb2c019ef227c41d38a193f82ca1417158065cf6f0f913d9e4bb7030e6ff3b34fb49157d3e81b9917bd38db454194c3576009be76d9293b365e59619a59"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1a"; +}; +latexconfig = { + revision = 68923; + shortdesc = "configuration files for LaTeX-related formats"; + stripPrefix = 0; + sha512.run = "22e233cad5742691da573249b3f9cd4ea0c6ccf4e31a757837d710ca863e0cccd089106e523e40fb541255f3795d963273ccdf70211f19ff3caecb30d7fefcbe"; + hasRunfiles = true; +}; +latexcourse-rug = { + revision = 39026; + shortdesc = "A LaTeX course book"; + stripPrefix = 0; + sha512.run = "ab31ee52beb0fe100f4798e6e42673d5284f6f85ccdecf8875f4d058928cab7363507f8cafe6c3c6f437a682f3e0017923d138ff671eea118ca8d2339627fbe0"; + sha512.doc = "aeaeeef2c43a5ddf782a91152c9e2e18f00d9b3e18b7023837920a53eb390652d7ea85afcae338519a00b84a972a723eedd7819e73944ef7015f8c028822fea9"; + license = [ "free" ]; + version = "1.1"; +}; +latexdemo = { + revision = 67201; + shortdesc = "Demonstrate LaTeX code with its resulting output"; + stripPrefix = 0; + sha512.run = "e8444a7362e06fe225e9033fb4fd69a5dbdae2e6b18ff50b860e327890cedb5ccc92a2aa977d5349346dcbc0da91644729d292e08cd9651e096362df43f1b5fa"; + sha512.doc = "b704b4f266b2106d6a48dd5fca3af644ffb750c7a183d0ceb31db06c98802faff451d4a224289203174f086c7ac46bb83b5296115fc2bb0241b213ebf631115f"; + sha512.source = "cd9ccedf50931754ebd4f3a9cdf5df651be802fd31622a7efa945d41e3d2d4325827dc12983f17761caec0458a02d69eabb717c9ee0a80973b4f055d8bc1b7e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +latexdiff = { + revision = 64980; + shortdesc = "Determine and mark up significant differences between LaTeX files"; + sha512.run = "ae7179b5a9d410302d750233b6b22d29382406f3222129155c98b1f2ddc23d22ca7abe1683fd013c7302fe8e21e82a376499ae33d83c15a01fa2720696e5b718"; + sha512.doc = "2f484db22ec12886a4d76fabde3a65a982d3e659f524120b377221f91c7ad5973ad6023aa3226dd35baa687c86ec8dd8e736553d1604690d87e68d3cf7be84f8"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.3.3"; +}; +latexdiff.binfiles = [ + "latexdiff" + "latexdiff-vc" + "latexrevise" +]; +latexfileinfo-pkgs = { + revision = 26760; + shortdesc = "A comparison of packages showing LaTeX file information"; + stripPrefix = 0; + sha512.run = "b08fbfeb87299273a0e087e7cfe0e9df9bf50b95503a3110b9b329a9a41931f34f65661e219c6adf377e3448536d5aac8199799821f7057a67a4680a24f30ad0"; + sha512.doc = "af5ff5d84fbbaf299be548d13163c8e5e83b73ce795bc1236a204f4025e34d9ef0c587702ea5d6b234791e16e7cd1930a63f3839c20caefad7610de125a583e6"; + sha512.source = "b204065af499edadaf997f6a6cb1be474d02d03c1e37f94b33dc7d290f934c4a453fb648588482821f52f7b0b80f5edafa9a034f8eb2a9287ef06e753b8c1e96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.22"; +}; +latexfileversion = { + revision = 29349; + shortdesc = "Prints the version and date of a LaTeX class or style file"; + sha512.run = "3a017b8a367864358370f0063957c301014df2aa039566ef33ae78dcf428235ccc2a88e19c917c940e186371e2c0b747887cb04e7cb78b9a04ac1720dbd94cf9"; + sha512.doc = "b1df01f8bc7daed937cd20d1ab7cce443a3d1fbb58e04cb18f0c0b30ef0795c988cf51bf49ace2f960c173f6a95fe982ee9d29d7650dcde21784c788165094c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +latexfileversion.binfiles = [ + "latexfileversion" +]; +latexgit = { + revision = 54811; + shortdesc = "A LaTeX git wrapper"; + stripPrefix = 0; + sha512.run = "4e3787d5e9bf950e796e7eb475c825f20628ec5ed5b99cb145036fba99c4941ed81b347acba1548dea624d87a03e0cdbbc28fc579cc8edb0aa36460e9df0b6d8"; + sha512.doc = "bfc6ce99ca1b66c0b1d5d98453716cf9e3a7e65ac55d7d17e5b06417f57d13f532602b537c804581e2e81b5265d554dd99e4d4307ef6d634d25916aae1892cab"; + sha512.source = "8a09f128428644335c9d909d23acc91ede2020304ebf009be00928cdef670aba23d245b979e5fd8d927c9d0e652bc195c717a744015a31fbb2aed1c566abfaf4"; + hasRunfiles = true; + license = [ "gpl3Only" ]; +}; +latexindent = { + revision = 69472; + shortdesc = "Indent a LaTeX document, highlighting the programming structure"; + sha512.run = "23c35d38e78c3debf1c89cad7f719727edaa21e93d1cdc3f845f3badc0e4211919bd8e8a495010fde7eef78f9784f04c545d67546f30f16179624e36f82d31e8"; + sha512.doc = "6b0de79326494370b3fba30cf44b0edf7ec925462152c6c11d7e4b9de489b58a94ea64b0e9059b28ec17817cd73e75f0f327aff2ef190dc9fe35aca2b24af66b"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "3.23.6"; +}; +latexindent.binfiles = [ + "latexindent" +]; +latexmk = { + revision = 69657; + shortdesc = "Fully automated LaTeX document generation"; + sha512.run = "ce495cf39bfc7a113d53427eec1ecd6fc62038c91cf5b97b0a7dd6fdf719b15425b6adfe1c734e5eae5330e5f8d15e3f9bf808d8e324afd53b8915d55e505935"; + sha512.doc = "0ce5229b80291809437e57518551e0ab0b06bdc381e07ae100ac2fff3f66965b64c4df096dc90fc5814b1110a9080322742b92af57675cc53b26ab1548a37582"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "4.83"; +}; +latexmk.binfiles = [ + "latexmk" +]; +latexmp = { + revision = 55643; + shortdesc = "Interface for LaTeX-based typesetting in MetaPost"; + stripPrefix = 0; + sha512.run = "e32eddbc519ed33687c1fbe36b2cf45f9ee886a78c0a088f6648da42dbebb0a72064ec4b9d5333656cc3bed7b251ef3a758926db88e6bb79ffd4536489717db5"; + sha512.doc = "02cda290799bde7288220d0b634b970a6ac543fd63318bcf90c4ad06eab074f5851e7bc42c9359af709eccc0c8847a0d3d1a9e27cdfd3f60c7143de7ac4d3901"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2.1"; +}; +latexpand = { + revision = 66226; + shortdesc = "Expand \input and \include in a LaTeX document"; + sha512.run = "e5b63c9aa31f3b5885b1a61503998ce949021b448199538ac385d3fe687156ce6669cd3610a7c3387592d968b0707f7122f35fd50402616470e34bb49f341bf4"; + sha512.doc = "c06bbb57bc006aebb644fc4a8edc1f89e10617c67bb77193bd2f4dc3eb7b04b55fb1f239d7d6979f9b385134f3b1e584d9f10521efe704292b7e64865f78d156"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.7.2"; +}; +latexpand.binfiles = [ + "latexpand" +]; +latino-sine-flexione = { + revision = 69568; + shortdesc = "LaTeX support for documents written in Peano's Interlingua"; + stripPrefix = 0; + sha512.run = "e498d5ec469420db789dac92e314f9ac0355b4afa2c43d4dce2de3eb23481db2687283f9ccce2ffd6edfd7b8f2d7ca3bf7425f0ff43ed46d7ca2dc9e3bc16797"; + sha512.doc = "ead89b61f23f527d4b545775c821792aaa5a4c3a6290767139dd8872ff6419de248d2f1d657589f469b49bc7b8a68a3368d5c26aa61a39ef6a0e6835cea97389"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +lato = { + revision = 54512; + shortdesc = "Lato font family and LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map lato.map" + ]; + sha512.run = "2f8454888913ec6a024c53cf157509b8b769f948ac2c92d0683e80ff8e22865545a6a65864876be35569bf4a5d56ed871c8112b216561e3ce585136bd062c9ce"; + sha512.doc = "0965bdda9b3c106bc49d8156f497c4c85a80d76a4740964b2d24c58155e8afed57989166bc5ac3eb44daf377b7e8985b406a0955dc419ced4a7011f328ce0c62"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "3.3"; +}; +layaureo = { + revision = 19087; + shortdesc = "A package to improve the A4 page layout"; + stripPrefix = 0; + sha512.run = "849b0e0fbd15b45cb31ed4856b0eaa190c26437a1965da2c860af62b65cbb000b590320611e96c5a6c4cc63c029c31fb352ec44d96e0704eb52c70ee460abcd3"; + sha512.doc = "b4333e1361b352689dfd67e13a694a304449eac61ef8189957356bd94e5745f4c15fa38bc21219c8a21805dbecd44a51e719bbcd884b850ba1276759bdebeb94"; + sha512.source = "054df6aade854320987e605aad0a641778336ef918ef086dd097db8d1a2fc8d623f0335aa4ffb98942e157438ba06b6e75411b48db541779fc2a6e08e5b1c594"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +layouts = { + revision = 42428; + shortdesc = "Display various elements of a document's layout"; + stripPrefix = 0; + sha512.run = "9db14862ac1bea22096130ddac071a9b058e4cc1309917d2f8e8c536f280d2f4efc9a8dad9a5dbec0824b94f92c290e82820ec1628f0e4b72aa8fa617b72d981"; + sha512.doc = "aa6639c5ca0029efda9af523a0a075ef2b60ae9e031bd68232ee03792bb2f7452e2201e7223735e83b7979f2c057674fcedde4ed416254ab4b5b8a6cd9bb002e"; + sha512.source = "1abb95aa76cb3dc55d7426b8f98923662b48fa91ae8e5e2c3c01fb14dc28c8ceae90c01c9a22b1f59103e56d1818675d6da6223be6771083562ebc50ceff07b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6d"; +}; +lazylist = { + revision = 17691; + shortdesc = "Lists in TeX's \"mouth\""; + stripPrefix = 0; + sha512.run = "5ceccebce9cf3ff0574c471141f94b919d14a7faf1b5c7b5e09eb079aee11cb95bdfa7d8b26fb83e99875818d842cbd64733ab7cf7b7024f04f661f732a3fb04"; + sha512.doc = "1ecf491370fd7ba0fcd3ef1ce11df768509c32bc9bf14978e3d6f36e39094570144b897337bbc481bfeb8b74354b36f66d561a33e255ba50aae0a5c42f002e7e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0a"; +}; +lccaps = { + revision = 46432; + shortdesc = "Lowercased (spaced) small capitals"; + stripPrefix = 0; + sha512.run = "98d57c77a3ca19a067c04c9cef06d632e56f42daaa70ec729a7cbf3ff68ef3e7ab95e1d0d25cf853d85dd1916668dd5601ba6feb889d1eda344b3ebcb31da333"; + sha512.doc = "ce14177476624831de64a12ef858516a2df28a3e194748a1c759d7a41743a93e03a7d96bff3acd85f9db0f5d4c96a53aff7b73077e131bc6fa807c8b36844bef"; + sha512.source = "cb0f4f8400542d9d15e55dd8d9b55ecc1aad60dfda5de9ab342e8e02d075123e9b32b1c19dbed700ad8626d754a11be6e694a86b6eef757db3a6f47f9f5a22d8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lcd = { + revision = 16549; + shortdesc = "Alphanumerical LCD-style displays"; + stripPrefix = 0; + sha512.run = "829c0fbed639619707023c1df1fa511d584e4805aa4f26b0ba5e5c5dd85d927901f4ad949e4a171d9765995c9ccfd34e5d45aa44dfef2508d5ec84c27712e05a"; + sha512.doc = "385df3ec85fdbaa579b15f0ef0fa2347e15cb796a84265b1cc7a9e2bc520c0c98d0703615ed28c68ce5ab7cbca6f2699502ec26a31297c14b0039dd4b584fd86"; + sha512.source = "1d788d589c959240c92775455ee3272b8014a9491f2299c4d6f4d9aff66681100a6352bfbb644e0c4cb770e27152bb5b3fdf0f347aff489c172189c542a02e58"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +lcdftypetools = { + revision = 52851; + shortdesc = "A bundle of outline font manipulation tools"; + deps = [ + "glyphlist" + ]; + sha512.run = "3f3cc8f7cce233eb36315b21db408847a267ff393d6d4118de61c4b03ec408f3f29b2d41fdcf84995bfbf5d07bcb25984d7ffc76458d4f2dc12fdb6dfb85e23f"; + sha512.doc = "5a1dd1e2fd79351afc65d6786b24aebd9681a2b9e92755b44a836b47da5ceb1817f085483f306991a113dc0c26edfcd84839dec93bb46a003034536f31b31e5f"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +lcdftypetools.binfiles = [ + "cfftot1" + "mmafm" + "mmpfb" + "otfinfo" + "otftotfm" + "t1dotlessj" + "t1lint" + "t1rawafm" + "t1reencode" + "t1testpage" + "ttftotype42" +]; +lcg = { + revision = 31474; + shortdesc = "Generate random integers"; + stripPrefix = 0; + sha512.run = "6ca6f347b6ca4104ec376554ff7ba5d19002b2b4174fa491f3fec87d6c75c3ed11c1d13b9e7d30e6c086b2a12dc3013f21ee10b482c95b177f0eaff02d953fee"; + sha512.doc = "5674612693481265f72420ae10914329029f9af2f526e6b59ba2614d4d2994a0033cb3393d2751064987698f819cca8e0fa3783555db3fa6cc5849f337b1cfd5"; + sha512.source = "b26dc9e706b14c304a282d2b5abc2d0fdb81799238c3951badb6152f8c83f6a2ace579ea0c2fb782bdfe0d02448cf716e77c3114ff0be594b12bcabbe138b17a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +lcyw = { + revision = 15878; + shortdesc = "Make Classic Cyrillic CM fonts accessible in LaTeX"; + stripPrefix = 0; + sha512.run = "324a9eb8f1a68124888ad7d4f35dd0446c917e643e2cdcfa041ca26b719ccdc541b9b89857aa05dea2d599912c506561c762d288ccc86d637fd927cc70bf910d"; + sha512.doc = "c063b6b5d23bd0a7197f5bd3121c93237c24f0a77fbc72cb370a7cd535282151731ef03098c36d8152707c50808c1b996fd1adaf16185bd3d0e3589e85b67981"; + sha512.source = "5303052e625fa1e07a3e54a682a11469f0b14697fad5658f2eb6d0266dfa25e6f66bd752265a3ca99dab138200711b48cadb29d8b1a1a878a59f5c5e112aa860"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +leading = { + revision = 15878; + shortdesc = "Define leading with a length"; + stripPrefix = 0; + sha512.run = "c326950e6c4b07782148ee4c9ac5b22f7e42512e0bc6e5e1f75be6ed757ca90ebf2bb6b30b91ceaac32c761d595ba5799f0f40ca15954f150d481ea366f1c72d"; + sha512.doc = "3ede6910ccb0a30c3ae9c78b86cf00cd7e2c5d8905b648861d2113d0af6225b2ffdc30509a72a5f69dd9e1164525c3225cd4ecaa04471ddf5c346a862fe097e4"; + sha512.source = "b42b230efc2508f4b3901de791424251c6e0ff003bb342fa11ea282f46b2dfd5c68a63c95fbb9aee146839944586218a3cec0ef182575a9760d3ed3f5924d78f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +leadsheets = { + revision = 61504; + shortdesc = "Typesetting leadsheets and songbooks"; + stripPrefix = 0; + sha512.run = "026e310ee9617108ac60fca69b0f08b2031d9c9dc583a400095765458bc72681c5c39332602994fd8a7dd4757b5214924d4f5d75bc5861365ef65e8e33b6e143"; + sha512.doc = "dafae48e690e6f0a2272d268204cbe58967eec5dc895987ecbff563061f23a53bf9d0d39f4a269b852524c1cad8de08fb121aa8291d2c723c01615f4c83b3231"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +leaflet = { + revision = 56878; + shortdesc = "Create small handouts (flyers)"; + stripPrefix = 0; + sha512.run = "ec809f2aa4cbc16dd26aae988e2e3b5fcef9284cd31deb126d26989358e52596a50fd63df07095f0bf081c46d1e8af3b3f59572d372be873d9afe1f3db3cee95"; + sha512.doc = "ccfee44447524b112f47211729bcd2c78021dfd19394b82eb7024bd10a68d1a04789d01d16cc9f3b5eab7feda884eae6bbd47b6abe8023893587c49613b44d6a"; + sha512.source = "cb505761b78adbc0dd69fba2888ab86394c7c32fd590969f721cebac249ab8298c87fad284fbb8bd9d557e4f7741559536e504155ee3b4f771dd135204857337"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1a"; +}; +lebhart = { + revision = 70050; + shortdesc = "Write your articles in a colorful way"; + stripPrefix = 0; + deps = [ + "colorist" + ]; + sha512.run = "693591f7f1316f2e04408500a958db59528cf12e9c93bc38b9fb88edad1e3bea01d8adbe00546cfe8d448c30e1f34144b53ab9182f81a18c4b30b2167fc86306"; + sha512.doc = "9932c964d79640a85a28dcbf523625c4b291f9a2a6f89be6a4c416c7318a7e55c15923406457ad5ccac8ab4257aba21b1f97ca3e2acba6339178c7307895ee10"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lecturer = { + revision = 23916; + shortdesc = "On-screen presentations for (almost) all formats"; + stripPrefix = 0; + sha512.run = "e0c217ed089dccb7cb526e62456bf72d186bf8cdc69b2014bd4210b6f1225277d1afb514f381e4581727900c6ebf34780bb4df01c3682580cea0418fa9caa1db"; + sha512.doc = "97892442ebe9263cbdc8e35ecbc2f3acebdaa886e5fe814bcc0ada98b0cecd9e140a0d103adc9eb0aab1e5e48e9d7f4ab42e786d52f8fcc96d03db17c51fc17b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lectures = { + revision = 53642; + shortdesc = "A document class for quickly drafting nice looking lecture notes"; + stripPrefix = 0; + sha512.run = "e3fb80a67dcb5198503050d61266cbd3890c91c1c5c93042a17f2aa410223c3943e3dcb73d7d6e7a4d5888d87ae9613fc89025f0435c122ab44a8f822732250f"; + sha512.doc = "bc50485fd0a8782095bbc37b9185bbc61df2a6bdccaef359f2cedd553cedc14ffd0bb8e6690578f1d57b85e2efa650a68af3b579a7c360a737791ddd74373424"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.5"; +}; +lectureslides = { + revision = 62292; + shortdesc = "Combine single PDF files into one file"; + stripPrefix = 0; + sha512.run = "48d99cd8a5b0c730af30c9c3585f0d2c9d9bf88f359f591bb769d5744412f5b76fe7151a744cfa194dc77f53da2737895fffc9b0e81de216d6d3f5bf4831d26f"; + sha512.doc = "8bce5395c30b16ea534071464941e4d4df7622946f09daf4e1dd4f63f79dcbc05f350353bbfa474e1d990a37c0a61368aa34683ee251a4e34da5ad5c896ab84e"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.0"; +}; +ledmac = { + revision = 41811; + shortdesc = "Typeset scholarly editions"; + stripPrefix = 0; + sha512.run = "b465117d5634dc4eeaefbc2c12a4d0fb892f4a27ed66057938701fe51e4dedfb5b7f28d796145d89a59b2667cf61c7175803f72e5970cf81244329130d173136"; + sha512.doc = "7e7fa49106457f13aed11bcf80a1e38f000f5161e9a67bdbb174371db63a3953109f26da3cef8781d2c13abb4b86d5cb0c2b1b41e6f2cd3584512bed1a67cf6a"; + sha512.source = "918f3009f11e3fa2b5531c5cf8ffe9d835e331793abe1241f01f01b14d990ffd1f3aac6ec153b17f77099f38c284965209cff8f9105c340bfdadc85f78fd5d5c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.19.4"; +}; +leftidx = { + revision = 15878; + shortdesc = "Left and right subscripts and superscripts in math mode"; + stripPrefix = 0; + sha512.run = "a01d085af4ac4048b5659e7f2f1692dd787b7c4cc9a0c06acf9852ad9d5aaa9790bdad6db7a76ec2f1a268af520ac35975a7fc55ef0d6373f244c85b8b6e116c"; + sha512.doc = "1e372c7d307b4bae8fc5673c9654785db1fc7c510e188e7e0945e01dd502580479b7910e19132c7b8b169acf7d9de84504de2aa9fb580c9a526a5700114f009e"; + sha512.source = "3339968b569bf6fba6d7332399d0727148add95c1c0dc2ae06626269c156a4e365dbbf672b652d3c5d097d0570b0955e6cb34255e3f8383f05ea52fa2c12e375"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +leftindex = { + revision = 69660; + shortdesc = "Left indices with better spacing"; + stripPrefix = 0; + sha512.run = "3fad2e822408843bef73d95b5c7eb99840e9a3b9cc3f5815197ca735d8953a30a271c9609c7fb34eb4c8a7bed1a637a3421fe8a1380b5972e342997cff2ea247"; + sha512.doc = "482b46b33ea20c85765b6b1e4920b96e8f94347aebb057f2958ff2bc6884e8c1a5f121b31f1aff79deed93209940d37fe1fc33199a3f25b81dda74f02326a862"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2beta"; +}; +leipzig = { + revision = 52450; + shortdesc = "Typeset and index linguistic gloss abbreviations"; + stripPrefix = 0; + sha512.run = "6811c2259558856d930901d2d82a47774c4c37ceb5d1309fa6b78ebb031685405e334e8de7cd63b1998bf673d5210aacfd096b1c6570ed26840fe4ec22359c5c"; + sha512.doc = "a701d8c9ffc741099aa09f75dcef117db6c64a832dd51f57dfe07cee694a177a3a8be824560308b9cdd483013d4e69b77ee8755972b9ed504e033db6396532a0"; + sha512.source = "957fda848d5d4b5a07aa0150019670058343764434b5a7151131ac1d401e4de60a6f57af72eb485f02d0e3b63a60edc291ce1692d408363b23f811d1c97fb389"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +lengthconvert = { + revision = 55064; + shortdesc = "Express lengths in arbitrary units"; + stripPrefix = 0; + sha512.run = "7796d45d91e157f2e901a1a48a7841bf222f86540ac00d59250e3f47568ab86832bc115340c0b65b27c12eb1a39cc2729cffb5da71afc413dbae737341d8eb63"; + sha512.doc = "4191c3ce9b546f885c61243a343761a9dbc1ac031b3878a87c292d99a70effc89d927a1fd35eeafdd6523aea7c4bde0c90255057177767f534b471d4e098d3d4"; + sha512.source = "ae8d4f8563c86a5fbcd56d40dc39df2bf52bf4dd5098b4976ddc6ec00b8512e2d6cf4a4b3f6fe83e27188ea24ad954c8043daf49aaaa15e503bc2f84f740ae75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +letgut = { + revision = 70496; + shortdesc = "Class for the newsletter \"La Lettre GUTenberg\" of the French TeX User Group GUTenberg"; + stripPrefix = 0; + sha512.run = "26c67af52a69cf3c9eff59e1e3af2cdf1450caba17938ded0c6c8d090cba120809d4eaa981c2934a62e9bcc78a0430053f55e1c4ac241770c779c4a5a8cbcce0"; + sha512.doc = "13fca9f0e879d4838cb7e05e2978c5a63bff21b14f7da80e82030916218d49c870f97037f88ff4316bd220e5c318d2f7d568ddda9f787618aab31478e1a0ad63"; + sha512.source = "5057d1ddea61c0fc43a4b7cdf3f749b08bf14e443eb29a315d74a3f7a2de9ba3a41fad379c62cce83d15984c0d9ae484d738d6a875627cc4706bb708a2cac290"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.9"; +}; +letltxmacro = { + revision = 53022; + shortdesc = "Let assignment for LaTeX macros"; + stripPrefix = 0; + sha512.run = "c9c1f5c3b9aab6b31750011cd45c42bdb32ecd712ced8f8cdafe1aeca532159051d1cff1449b06e3d35fbefdd44f2332805cb1618ff1da022d405a88d600083b"; + sha512.doc = "8be12930acfaa79dbf3d7d3e0a60a518b12392c094e1dc531bfbcd8d9517d4744e99d339b3b7bcfb1e156d0ccbd17ca464126d8530e9f9c13e29d19a6aaeea99"; + sha512.source = "86863fc9935ac5044f2e3b3013b0df39cfe95f54fff5c6b1af0297b828fc88353243b117caf79cafb7f8c17d9fa90b2e0e8ca753573baa06db7acb26a978f30d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +letterspacing = { + revision = 54266; + shortdesc = "Letter spacing"; + stripPrefix = 0; + sha512.run = "30fdc0f87976feb698b9736e9deb6726746e4c25e4ed4a4637ff26699e171738be6447e8e2d02d154cf57944aa988208ee97859c0a7fac784d55fa6ef889b86c"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +letterswitharrows = { + revision = 59993; + shortdesc = "Draw arrows over math letters"; + stripPrefix = 0; + sha512.run = "dcfd59b7a51100a4e1d856d3cbc0d4f2ac258e745566b278e275d8ebd0273e7f96fa1431b681d42e10b1c7496596f1ecdd92753b8b58df4fe352c51b9b009bcb"; + sha512.doc = "a21ff5d9a4c2e409cd7a32207e1e162b263dff46919fdad25bd5fbc1cca86329efebf847ed24ff7401293d8a318bde9fe7fd2c9def69f39740d5e0686c0ab849"; + sha512.source = "50e2521b55a238cd6e461b3bcde326c5948573363988bf3bdcc428d04341728dbf73e891d09af65ca1832924cdbd0b0320bd94d662afdf78b3d1039ca3519231"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lettre = { + revision = 54722; + shortdesc = "Letters and faxes in French"; + stripPrefix = 0; + sha512.run = "308dc21e8be8d8f6952eadf9b5e9002fe32e8ea3b79ba679606badef75ae346721270e85e3fbcd269ee86b9ae049390164c57cfd73d7f2efe22fe82c7466a813"; + sha512.doc = "9962763ae46836874eccf4ea5a2dd695eaa1ab890224d6a54e83670618e2cae4a917fb6bf05610c5104f4d241e0163e079628e79ddad3edf374b513cf6a457f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.002"; +}; +lettrine = { + revision = 69508; + shortdesc = "Typeset dropped capitals"; + stripPrefix = 0; + sha512.run = "759f71e952f99425e2425f938164a402b86bb2e83a298e08bc4905007e7805f5856a3f90067c0d08003c409282c79a9c3edd7095bf105029e05addea8dd328fe"; + sha512.doc = "5618801ec7cdeab3b378cfb55748016df58fe00851a09a0a7929ea97de49b11c7cb2c6877e54d1cca93cfeece45c53f869e47ad3a9715a9ab8b7f414a8216cef"; + sha512.source = "004cbdd91606755b80857ac3b0fee75ba686a4d73010799fb1086c37b626ee2974bf9401d272763a58dcad7d4ef92cbd3cfbfe752bdde365bc88637da73fc429"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.60"; +}; +levy = { + revision = 21750; + shortdesc = "Fonts for typesetting classical greek"; + stripPrefix = 0; + sha512.run = "a71294df1b2bdb1402892ebc0c82dd60275cf41f6844cdd284e1ba73c8515e98258118c5a1e5158fb6d09acdc53427eb4e3f62f24591fd2eafc90d0bb69b71ea"; + sha512.doc = "e69a1e2e421100a50416f86bda40702aa9a4d5c5b0b8c783e328e56e1ce587f832cad984fee2cad259603e893413155bc4539e853e1df0d95c89e9167c67b2e1"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +lewis = { + revision = 15878; + shortdesc = "Draw Lewis structures"; + stripPrefix = 0; + sha512.run = "7dbe24061df0d0bb4762e7d308c895c99d8f9a9105137bce8c4e589c7fdc80f989aa8c3ebbe40708a8b6fa2a2df5542ce25fb16f528344ca46d50c47724e006a"; + sha512.doc = "b267e3c79dfacdd7ed8c931a0e5954c9fd2ea0cfc12beceef3b40bbbed30bbb421d29afd263a25a5b0b5b77a6bc74ddf38e609262485eecae065d65e23200bff"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.1"; +}; +lexend = { + revision = 57564; + shortdesc = "The Lexend fonts for XeLaTeX and LuaLaTeX through fontspec"; + stripPrefix = 0; + sha512.run = "6a9e4ab844e5189e996b73ee95d5ea5bda0d5d9f7b00a707d5bf9b7ceb97eb2f37baef9310252227701d6fc280a14a8a79ff524b5cdee3610c4dc48968f6b3b5"; + sha512.doc = "fa21e0311899513ca5f7031471189ce0269fcb35b5bb38d2e3d2e8015dab11ab2a10cc086ba6d41f24c25d99b32f91750371e3297c505ef4a522d61aaa24e5bd"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; + version = "1.1.0.70"; +}; +lexikon = { + revision = 17364; + shortdesc = "Macros for a two language dictionary"; + stripPrefix = 0; + sha512.run = "7c0642f9e727d34175898138d27a838f0432a68659acd7986acb0b74183f28467351c169c52ab057daf46546d8ef9f9bdf30dcb1846b458b6b718ae38633b275"; + sha512.doc = "4f1329d49d92d93743127e4f3ad9401e07529d31d2d68af86373f08b56ae69c22c70b89151461548aefb7fc1f7eca66cc1a4ac73407d82b65bd007f3372243cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0c"; +}; +lexref = { + revision = 36026; + shortdesc = "Convenient and uniform references to legal provisions"; + stripPrefix = 0; + sha512.run = "f9bf7792ac09a6b5a69ae642e0becbcb1ed0c2eea3254b31da62bb9b7e3e161c24109e0bcacc8b89e3d03426710378f04e13a05be467115eaea2be028f8e5812"; + sha512.doc = "6a348acfd0e0701954195210bc717666308743f5f282b9efb7a253ab860a0372ed383cc2c8811527eeb2ed72c46be95cfb9e133d156fe8b906b67ed5140437af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +lfb = { + revision = 15878; + shortdesc = "A Greek font with normal and bold variants"; + stripPrefix = 0; + sha512.run = "5b1386321f8c24673531b48d996a20cea9ed527ae60e608f63a790a2cbbea573d01e0351c1ef695b11f14d31d5c482ffa02b337ea04e649b7b758eef713f3bf6"; + sha512.doc = "59eef59a1be002d28ce802617ee638b6c0e74efb391a502fa9593bf19e54f563f819f45442714b46a2e97f49bd561d2a2df631e53ad3847b48a881c8762d2d9d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lgreek = { + revision = 21818; + shortdesc = "LaTeX macros for using Silvio Levy's Greek fonts"; + stripPrefix = 0; + sha512.run = "f0b5cc9b7267aa07dc0b0f8c6d23a164bc239591fd13b5d77c5c840d33e131546c63c63a3bbbee2851000bda2e8593e7617f8a7ae381e7cd0561302a667acac1"; + sha512.doc = "915df985f4766f492a70a35342e086567d17c155ea0dfce5514c6edebaf1dacb78998dc4bf5cc44415fef580a7779083bc2261a22dfd668e8f2023f1f15bff35"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +lgrmath = { + revision = 65038; + shortdesc = "Use LGR-encoded fonts in math mode"; + stripPrefix = 0; + sha512.run = "415c04ea9add325ad71e678cafa99fe896d02c8b16facb0c4f69d656f0621e131c79be9470d15c755bfc4f63d9b6611e58829281c0e5c7209ac7c10ecc456b0a"; + sha512.doc = "c68c01069ef48b668f471c86d0b562f2455e9bf022ee7a9d9a9b2c6475b9fd04b4e1b9b0eb7cac215f51ca965d35a1cc80102a6d862b2d72f9d9c72f07fd5900"; + sha512.source = "044fc3ae8aad6637cb8489f1cb0fed9e5cbe7435a7615fb20b77c749fee43de1de6740b0212239c71106d7615c7a54eee36bb9fb35be571220744d6ae41da90d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lh = { + revision = 15878; + shortdesc = "Cyrillic fonts that support LaTeX standard encodings"; + stripPrefix = 0; + deps = [ + "ec" + ]; + sha512.run = "265aeba5ee99cbec2eca77a273a9e4857d78280e0ff17089a358e7f85d0595025e259b2edd471ce5287479531fe37cfeeaeba405ac9cabc7ac9616242815b6cf"; + sha512.doc = "33f1cd39b2e68caa750ca5867bebbbc43c9948a7606f6fe44ba3bd8be84661fb562b5472ec57ccc3f6c18ef2823188c2f81ca4444b562f935e6f041d8ec0f39d"; + sha512.source = "a81d3d7295101718dc4e66c6daafca8c480b281d7219956b0007adb4fd7e0f35959277931254fc778bf69c581b7d15ccf445f5037b589cee937211c39f59529e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.5g"; +}; +lhcyr = { + revision = 31795; + shortdesc = "A non-standard Cyrillic input scheme"; + stripPrefix = 0; + sha512.run = "55cf81c051e8f23fe4f085990bc72a5b1dfc276e3ae1721680ad033deae1e3eafb1b9dcff3380ee20b72623b1ab8f117aca66f61441387d914dc29dc91c78448"; + sha512.source = "18fc370261acff25634107705a36d06ec6367da95526a79fdd78c887234a2f2a6a17147eb317e97effa2ae8fe8e21e8df71cff3da5572055356386d26d2b06d8"; + hasRunfiles = true; + license = [ "free" ]; +}; +lhelp = { + revision = 23638; + shortdesc = "Miscellaneous helper packages"; + stripPrefix = 0; + sha512.run = "3a5bb1d95c300e9546b67c48cc2c3e1a5c3089c4430d76172a8d7f3cdc59fe03de1fafc6a1babeacc9259444e09e85e02a64f3b3f8ddfe3883511482b9ff0985"; + sha512.doc = "2411bd37dba9c4afe1ac4251c9897c99e5934938bd802dbe89993d5b6ec0d19e1cba8b143ee5febd9ad73f0ef823eb79f34587e6885250a2bce8eebbdbf06fd6"; + sha512.source = "42e419f41c8d8c00a4d27b4bd4499097b7c4c2b8b2e75c68fedd224796dcc9b9dd09054f90cc525286ea6b72a579120c3fc027239bd0f0630ec471bc870ec02b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.0"; +}; +libertine = { + revision = 68981; + shortdesc = "Use of Linux Libertine and Biolinum fonts with LaTeX"; + stripPrefix = 0; + deps = [ + "fontaxes" + "iftex" + "mweights" + "xkeyval" + ]; + fontMaps = [ + "Map libertine.map" + ]; + sha512.run = "5c1dfc8bac01acd0e6e0d3412c08ee8672f01ebe1c7e22f36f313541139bea13d8967e53f5959a04b31d08c0ba88334b30c3e909eef310567b07ead39edafd3f"; + sha512.doc = "54963a7cf440750aba83feb1a55d1de26ea6995716049d22d3f0ff742364db4c4ddc366d2937d022a3a8ed9951a114367a6ae1bef74c0a655b47007d38c2422f"; + hasRunfiles = true; + license = [ "gpl1Only" "ofl" "lppl13c" ]; + version = "5.3.0"; +}; +libertinegc = { + revision = 44616; + shortdesc = "Libertine add-on to support Greek and Cyrillic"; + stripPrefix = 0; + fontMaps = [ + "Map libertinegc.map" + ]; + sha512.run = "0af71c5bd17a2c89d85c2df056e76e4f8ff98b24de40dd306a9c4207c15dbe9dfd08864736a3a45f1c82f51717396ea843082f6798b89f7e9ea8c316453a707f"; + sha512.doc = "010db594b034a5e401fd17a7772dd3dbf95c37d533fad97f7b1568336beca31523384da1eab42e74b2e8bf294b25a8d19df7469eddd65cc1bb61abd5dbe79d03"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +libertinus = { + revision = 61719; + shortdesc = "Wrapper to use the correct libertinus package according to the used TeX engine"; + stripPrefix = 0; + sha512.run = "93fc163a66e711943c22f383187d4f7e81aaca32f36eac6e6f944682169282544c9233d05a2b5e6d263dd95de3d8a8106871a0ea1fd2028899031e2cde1244c4"; + sha512.doc = "8865b61037690bd3569654879866592750561d3fdeddd7943280ef772e7798194cf0bdb95809ab4373e1f082d1a1468b3b4456971b72dc892b07e73e2dcdecc6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +libertinus-fonts = { + revision = 57948; + shortdesc = "The Libertinus font family"; + stripPrefix = 0; + sha512.run = "5deeffa40e2399169a7ec16fec4d417c27350cb5ccb7f59eb1638172758e88167d24470d889b311760b0739b9fa0251e2389f7ccda0e4e8e2ce3a454406f13be"; + sha512.doc = "410edfda953b321c9fa53e99854eea206177e4486c0fdd6ae3cc20eddb31111f28f17dfd725c5f2dc573d82ba5daa1f75c544709accae84292cff45d52b10c18"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "7.040"; +}; +libertinus-otf = { + revision = 68333; + shortdesc = "Support for Libertinus OpenType"; + stripPrefix = 0; + sha512.run = "74e8f653e1bfd28b11932b0a5e524e823dbc1759566a3a6fd3d74b854f40df7a78b5dd3845e2b8e217fe9608cdb116d1216a3139e21d4498bccf62b8d8e42742"; + sha512.doc = "e708bc00e33f6cbdb1b21b1f62e968896f373301b8a3662fa32016c30bf913831d14258b9e1ceef3da39fc468dfabe0f9e4ff6f8b0e4357fe15bcd80c7e859bc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.32"; +}; +libertinus-type1 = { + revision = 67450; + shortdesc = "Support for using Libertinus fonts with LaTeX/pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map libertinus.map" + ]; + sha512.run = "6c84de57b1778ec35d9f56b00e577f9f8c1293132cedba43e657f4425e9bf01ab4243fe6ffb872aeb99b446019539a640d29c88cf29cc86d649d2a00f77952f7"; + sha512.doc = "c656af53b98735bec8c63c3e56160da943379f4b908f553a27cd1c82111b201eb15c1f1eb1b6ff89fee281c27ea36d6fffc5592b75722cd561c8770ef2d3f6a6"; + hasRunfiles = true; + license = [ "gpl2Only" "ofl" "lppl13c" ]; +}; +libertinust1math = { + revision = 69440; + shortdesc = "A Type 1 font and LaTeX support for Libertinus Math"; + stripPrefix = 0; + fontMaps = [ + "Map libertinust1math.map" + ]; + sha512.run = "ad93607e4accadbc0a429bab7d6bb8ba964a98324a9c65fc1993db025a728dfb8b3e48e3d67552a88bbecad247db573d1b1f7386e1aacce7954b00ace4feacb3"; + sha512.doc = "012227a7d46da30dc4a20b403a0f0abc0010d6902585c18a0bb3fea1e4b7cf58b629ae8c49597c6c39a264cf25a7a80877cb09e99b0f59b01d37198c5c4db769"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.0.4"; +}; +libgreek = { + revision = 65004; + shortdesc = "Greek letters in math mode from Libertinus or Linux Libertine/Biolinum"; + stripPrefix = 0; + sha512.run = "bfd9b373b9dd5bf637dba467b32a8b15965407ff1f6d47629f400b919d7126d5f37e1f35b8624cc5505869d8a649e25db2a175de4aaedc50a3607d90848c6cf6"; + sha512.doc = "94f7022093b0b1c3903b214a3e874751884020a78355e13ae101a2d336eb25796ec0f8388884f5dd9600badd15992978f3c9516a5a6d8ac1d7d3b92046ecde96"; + sha512.source = "7a04909b6663987eb42f690355b91ba72056540f5e4cb7e8998ef04db7bfa90d33f605103b01a383107a1c0629c9a328006ec2d5b2d0d98777bd4b69db779db9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +librarian = { + revision = 19880; + shortdesc = "Tools to create bibliographies in TeX"; + stripPrefix = 0; + sha512.run = "2a01755bec49fa8c78680b0599b58649b803694f339383ad168bdc06554dabeab3047d1b17d63f7487860a5d0102dd8f68a78d5ad5ba94a2f8b29db7329e1ebb"; + sha512.doc = "6d95e43b1f9965fe016bd9fc7ba3f9df56716d8f6c89948417643bffc4b9e89f8a5e6cb045e873daff819a16cc10cd61e74e73e98119a076580967187338be37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +librebaskerville = { + revision = 64421; + shortdesc = "The Libre Baskerville family of fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map LibreBaskerville.map" + ]; + sha512.run = "671894db7ebd325e35efba47a8b84dc9afbeb213358503f65e246e97af090be03f6591fe124d4f5b4c53ae99bdc7a56bf84d385597ed7564fa63f7fad5265e4e"; + sha512.doc = "9cfecbbfea90ff99af78bac088674061c7123ea046aa42da806fc09d6fe5e88c94fbaa3053bf87b563e55f514eda5cda108d5bf6b096253e79fa0d09567221ee"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +librebodoni = { + revision = 64431; + shortdesc = "Libre Bodoni fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map LibreBodoni.map" + ]; + sha512.run = "e1bc9e0560febac6f6e56737ddc070fb9642ca6e701699dd3546e63fa681ce28a995e61b4190edaf4d9b9f9a4131b77436d69cbce47e601b11b63caa25bccc7a"; + sha512.doc = "be63dcbe34c1f09f560f85aba54e469b3b14331a4ccaf8e44ce7ffcc649ec1a0c4ba2494ff844cede73943a646cc8c62c8bf7a949b602389e4abf9ae5181331e"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +librecaslon = { + revision = 64432; + shortdesc = "Libre Caslon fonts, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map LibreCaslon.map" + ]; + sha512.run = "96c3193cfc16b5cb312ff67303825c7e9733642108a601ee2b8dccc6e8d6aaa0db28e2da7c84faf71eaa1576ddab230bb6f385972d95f4aaba547e57a82b1e54"; + sha512.doc = "9f7c6662af462f0c73b97de098cc4bbff5a3060e44a72ce294b175c5d5a3f520a93026b1bab17bdaf5c48d2de55c4045730386f7f8f046b3ff797c4d715acb8f"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +librefranklin = { + revision = 64441; + shortdesc = "LaTeX support for the Libre-Franklin family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map LibreFranklin.map" + ]; + sha512.run = "35b304ca5b24ea88fc6a5227361db7f825a99eeba4b1ddcc31e5e71bda3f6ec911b00e2ec7ae9f54022748f39a26baa61aecff267628343dceae8eb8cb07bfd2"; + sha512.doc = "092dfd68010c10942f030828552e4609ded2b27bbd13d213556ad301629893748ace3380aefda1adc8ad23261b2de253599f6784b461fac8a1bf49cd6e1370d8"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; +}; +libris = { + revision = 19409; + shortdesc = "Libris ADF fonts, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map yly.map" + ]; + sha512.run = "1a754d896846d0db358cf4f878928dcb511d76a7de6e7dfabee71970908e3ed7caab98f854695318ead334e052282b690712069597f42505b00c41e328ad141d"; + sha512.doc = "04378b8461d6ea0284f038974fed6ae6fc48fc362f63dfb8b8d57a81a721da7bf17ca3aeabb198c373a68a4c8e5516b66f12c240e081dabcf1b9c79fd2d2b388"; + sha512.source = "8ccb8a6beb30c508d582dc905136cc8b1b053a8d71a7701bdeccb0ff1eecfa69e32d7167b871d4e38eb0c98ef49c8ee9a00a9ea3bbc30e51c8a81d903ac147ff"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.007"; +}; +lie-hasse = { + revision = 61719; + shortdesc = "Draw Hasse diagrams"; + stripPrefix = 0; + sha512.run = "b71ed475c73a94a92b8a8078a4edccc73f7d688bad7a1a5e6218bafba823b76a20b79da83c7591903fa234c6f0e7f776317dd8b740e5fd7cd014821f8dd77c94"; + sha512.doc = "d846971b6b8429e58521ad0cc564906fc06623a3764117069fdb1912aeb84858e7af93ea2f4a7732c6e677f260f10a6a9b79488d43caf56ad158152245f8e4aa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +liftarm = { + revision = 62981; + shortdesc = "Draw liftarms"; + stripPrefix = 0; + sha512.run = "a4938aa3e9a7c844766c2b6ef5959fda39f4de50325545d64a319a9d7f80ac2b3b5c4966e1db249e83d4cca7b82a3a7a60bff90c5d425f32a2a5c5b55b2fc4e9"; + sha512.doc = "1d4917e9a032e459ed1922b4d1ed5b525d3cc8799dedb8d435b0a387fb9c529159b620668bf5e737e87c68e434f2c01004d6f6b2100ea2484f179f2105901a73"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +light-latex-make = { + revision = 66473; + shortdesc = "llmk: A build tool for LaTeX documents"; + sha512.run = "1ede05b31d3b7acdd0f38b19e83b4258f05ddb184343dd36a46f142adca9f4081631d687411a1370be880dba5e3c6ad3f1c21108232e8b8f4fd03fdc1f3ad60e"; + sha512.doc = "f5bb10465cf3dd983f59b101f6c631e202ce655282319c773cd0d83c0a9a8a3b9cee7790ef1f803b0c68215b553a2668d861a51dd9ec35b2dfe4b07ef0cf3a08"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "mit" ]; + version = "1.2.0"; +}; +light-latex-make.binfiles = [ + "llmk" +]; +ligtype = { + revision = 67601; + shortdesc = "Comprehensive ligature suppression functionalities"; + stripPrefix = 0; + sha512.run = "f75a730290acd024eff3ebad6965fbea0e3388c98e0b6f325183758a7771de4b165810e7cfe05c43b12fb0cfcf71c51665c082bab82e44772ad0e0fb4b21c0ba"; + sha512.doc = "dee12f5e8abdff666582edde442085e8c937b39fcc5ad37759f0cfb683cdeafb63afce7a051573db307d2c416eca46bd9bf626f0cc3cd44bc6e1379c428d2e09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +lilyglyphs = { + revision = 56473; + shortdesc = "Access lilypond fragments and glyphs, in LaTeX"; + sha512.run = "2616757691d289e859fb2bc161c2a5b5312bb1cd824aa15854520e004a639e597f42515756b3cad383e4e33b3057a1579ff5c2ea7c39d8f9bf9d36e9c9b58b70"; + sha512.doc = "4d9ac765c6a4b2b736d08569eeb6d0d8b168fe96563526264f2485d3d27a944a3e81c6144cd8f1d8cb5162d425b436fc688172db18b09610b3088df4ce868a27"; + sha512.source = "e0a1db8b5c4e57374ea19a7f8da3f4a89a2947869eba3f57411a9e815d645f4cb4200832276e3d3c869e2b3a8e3018e8e0f20f942f2396395b7739d7e9b23951"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "lppl13c" ]; + version = "0.2.4"; +}; +lilyglyphs.binfiles = [ + "lily-glyph-commands" + "lily-image-commands" + "lily-rebuild-pdfs" +]; +limap = { + revision = 44863; + shortdesc = "Typeset maps and blocks according to the Information Mapping(r) method"; + stripPrefix = 0; + sha512.run = "eae51f72a65d407b091244ed926ec98a7bf02ed8c360fcea2d614011555195992d315bb22b3697c8220f8e91f34a1c2f88092f34697dc9ac42f757e066198650"; + sha512.doc = "748504c008704d2aa1c763920c03c72372c89368e245fbf4172b442b6e9efe11b3754f37c37a864ab19301c8822aa31f0d25f80edbe26405c043aab8a0382739"; + sha512.source = "2fd49d1313293fdda8726c84438a742095ef9a917369d8ac62d619507f540b4a9ced794472441f8d48edd5a5cc575ac2ac8ff43b3a50ccff70af0416808dd611"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +limecv = { + revision = 61199; + shortdesc = "A (Xe/Lua)LaTeX document class for curriculum vitae"; + stripPrefix = 0; + sha512.run = "14c7bb278113e8d8ec249e18fe7a142f5216984468a51a2c64926b2dea6e79d928310600cee498cb3773b0ae70e97199b4800a8c5df94431df121ccf62955b5a"; + sha512.doc = "7e64c4a940dfb321da2c81ae84e709e1601068935f2531c8e6fdf514b5cbca6407485005f60e4f410a303b97557986f1962dfad976a3c3914d01309c67ae8049"; + sha512.source = "43ab876f14fa2f920741f26252b852e5d579e9394efa1d5e00753f23365b62192293aa48850275c2aeadfebae4c2f8e0a929d4459c5feecedd7176514dbdcc9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.12"; +}; +lineara = { + revision = 63169; + shortdesc = "Linear A script fonts"; + stripPrefix = 0; + fontMaps = [ + "Map linearA.map" + ]; + sha512.run = "b87051ba4647ed2f0beb8e5bfe8419d8558421f509cb6eaa931f47a10488dfac4e36b3ece1cfdbf3e46eb431c3d15e7a7005f27522dbc4cfe6de52ce6127bea5"; + sha512.doc = "4c87a47d08606416e5d6605edb3a89bb3a67babcc621dd28b8ca02bfcb5ba6108e56e76fc166ff0d6a54c058459acfc8ee6b46d49309d6333d13305d00d3179a"; + sha512.source = "6476de5673f0e0f4896b0f579bd37e31c7301916dff1de1a957044b7782c04c43b5b5add887960d1a7013648a7e352d2655bd9a8e57dd0cafd31c851cef5f21e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +linebreaker = { + revision = 66639; + shortdesc = "Prevent overflow boxes with LuaLaTeX"; + stripPrefix = 0; + sha512.run = "282c1687acd1843f43d281804ef4860967c069b38c415cb015c0694ddc9d78e03a5f3456a8331d3aec341d856474fe95a2f4fd92b786c2834d65cfaaf4b9198b"; + sha512.doc = "d39b7d5ec0712e3e26ef76f9e1177f6de5413dce21b143e791d79c8980be640c785448fdc8fffe48fa5ebdd9d2d594518b73e8db21cb16cb99a8d9377ce8f9ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +linegoal = { + revision = 21523; + shortdesc = "A \"dimen\" that returns the space left on the line"; + stripPrefix = 0; + sha512.run = "87a062513ff7674f315472cc46e13fbce99057c3b7083a2b9c93b92f09d538af29f5d1e3664dd5273080b9037ac232dc0d7491753b83136d2d3558ada1b81976"; + sha512.doc = "9c61ec4fa6bc63a57f7b272c7dfc55035e8e4f14225bbd2763157915fd351a2bb4f179150801f06682fd9bd59f756edbb127e7bd68592ffee5c1cfbac91b10a6"; + sha512.source = "69133c573e53608e6b341abd7e745ba6b532eba05bb9a2ff2105bb9da69e31bf590fdc3f06241e5b667ec7f0c9458a908f5ad72304c7a5c9e412c0057611c5cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.9"; +}; +lineno = { + revision = 67171; + shortdesc = "Line numbers on paragraphs"; + stripPrefix = 0; + sha512.run = "7171da9917c0218a0c55c43126ecfe07b9e55e9633b673c89ae18f08897bb1634cc8412cc3051ebf6640afc228e246f1e5549ddea45261a6ddee01d158f3b9e6"; + sha512.doc = "ab4aacda9d0f4a9a2aefdf37b23067ad27eaf40500fd92f7a4c619f9c012a40ac0c69fae32c425d6c12d2b89e6d6c2ad9585fd75b2af8447c9f7d333473add73"; + hasRunfiles = true; + license = [ "lppl13a" ]; + version = "5.3"; +}; +ling-macros = { + revision = 42268; + shortdesc = "Macros for typesetting formal linguistics"; + stripPrefix = 0; + sha512.run = "686dbb33df2670af909a80863943a8870ecef128679ab679f3d90d1747042b752c9aea15660c962b0f02418233d4d152e64357d5b57884a2fc2371acb3d90a52"; + sha512.doc = "fe424a7db4be743168c4b1016fc25c95d33cf9d66767b39db0e79a5ba1bb667c76b9b5f10b23a08449362a3fef281d60f0b53e2b0f196846efe9f4765f3f08c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +linguex = { + revision = 30815; + shortdesc = "Format linguists' examples"; + stripPrefix = 0; + sha512.run = "36fab316a894029feba86bf771d4e600b3e7f5d766deb9d844605979b066483500c8fa0a425718d22e9a2bc14d74aada16ca8deb7ee744a81e18fee8c77a7b50"; + sha512.doc = "7a5d84d5425031d341deea8f37f1d8a9f6eaee820ef66661e8e38eafad2b20a5e9b04b81b1a0db0b11ab70fb0adc9c81cef886978626008eba6aa3c32bc0c848"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.3"; +}; +linguisticspro = { + revision = 64858; + shortdesc = "LinguisticsPro fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map LinguisticsPro.map" + ]; + sha512.run = "6bf94e8910ae03314a3ff55157e52586b5f2550c2aaca1a8989b1f02400c87363c74e00658ee953c13a44dd69cb253bda6128e66a96b865e6169310165a7f9e4"; + sha512.doc = "8f0c8937cacdec2e2ea4999dd1bb45af96a99a3707ef22b54a2bf1e0c745d663550ff0b68d80cf895e8bdfa1f279873c4725c7851af547f06155589d8e5bfde5"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; +}; +linop = { + revision = 41304; + shortdesc = "Typeset linear operators as they appear in quantum theory or linear algebra"; + stripPrefix = 0; + sha512.run = "ba0c5e053399c44203d6eff42252854a16ccbf12132ee6e26fa577587554234b36ed31a63f1a6c40059e0aab8d9367a5b6aa6f34d552d64866b46e68478c36b4"; + sha512.doc = "e63f09e370a53dadc92591d105c677f2a5eea4cbcbc4e3133448df64b10abf2eae1d76cdeed5e288f610be13eb4baf8f248a6e9df92ab79066078ee165b9fdc8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +lion-msc = { + revision = 55415; + shortdesc = "LaTeX class for B.Sc. and M.Sc. reports at Leiden Institute of Physics (LION)"; + stripPrefix = 0; + sha512.run = "8eed5de445edcd936654a9d7ef8e227d43b479f39279025115fd8586cb7fa107dbacd8c7272e868eb11de0e320740fb8dc5c1fd26327fc6e8394c8924ff37cf0"; + sha512.doc = "87d5b7e8fec95c857f6c45aeeab3cd6eb70e9b7a237eea3b5a4deb8e92ec8ddd5a381c88ae4919bc1841df15a4b93a569a996ed032cf2b0b7a5bb088c779e873"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.30"; +}; +lipsum = { + revision = 60561; + shortdesc = "Easy access to the Lorem Ipsum and other dummy texts"; + stripPrefix = 0; + sha512.run = "24697be378aa490bf71194c8622400c11e27d5c6549caf2362250017ac97b4443986a4ad5f8d2d96aa53cfd7bcf5cd7ada0e1ddbbbfd27135e2a23bbad21563a"; + sha512.doc = "ce44b2d4acab295bdcb2d0edcefedea449c4dae7cc4c0d62ef73e36169b0858863003bec1575000bfb78b1ecd9e5413807a89bc464b5d173f05a43313c7a22de"; + sha512.source = "5984bb97fbecbecb5aaf26f788a6879682f6ec39c87e01c834533a779384b20ad02f1825cf5c2339b288cc61ed716eb3a76e51c45ccf80849b4434132e0c4081"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +lisp-on-tex = { + revision = 38722; + shortdesc = "Execute LISP code in a LaTeX document"; + stripPrefix = 0; + sha512.run = "67817d9894ac5bc8d456ce2b114eba81b0c444bf53422c4acb5066b42cd5cd55d73c46fb2b443db9fe3b13bebb58d6fd7f2bb31686dc4ac2295447285295c602"; + sha512.doc = "fb3a8ef4ada38d910b3055f408059daf700946c84b17873846175e6cd3075ad7f3889d2af154adc3a7898ac33646251bdbe0d8cda17ccf354dee526a96476432"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "2.0"; +}; +listbib = { + revision = 29349; + shortdesc = "Lists contents of BibTeX files"; + sha512.run = "e71bda783acbb8ab6ccab3d8af535034caf0eea919bbd175685fe50585970b87613e0df5ed076967aca395cd8c7f1317e805fb1cf765897b03d6cc131d3d98b8"; + sha512.doc = "0ec0970f591fd3a840c27730d41f0b817f631727c9c7219880b45209c21fe0d3aa616eb6eb94bc7016a9acabfe9c50846d872d3b36a104e1f4eb74dd003a16d3"; + sha512.source = "441b13ec75d91c68b8e7253a5dc9a6e515c5bb0df81a4784dd414b1956be6f2c9189051ae9090a04bd4d11919945a38ad6563f41c27d1b8d03ad283f71c9a19d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.2"; +}; +listbib.binfiles = [ + "listbib" +]; +listing = { + revision = 17373; + shortdesc = "Produce formatted program listings"; + stripPrefix = 0; + sha512.run = "154a9eb9da19d4a1d9f6ed421bc13f1f83279cd456b95ab8b7d84f9c48d6aae5548b7357e46041580d4b457758aa090e6352aca9d9e20f1739dc589d4fa24bdd"; + sha512.doc = "11ef594d55ee823dab2a88ad5882e1ea89d7741f1038d3782ac43fa43cce948c1ed72096ddd11d1efbcc3b43ac9bc4dd23713f725aa71807ea174548d9a5c968"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +listings = { + revision = 70052; + shortdesc = "Typeset source code listings using LaTeX"; + stripPrefix = 0; + sha512.run = "233399d89e14afdf7c8f8856e61e3d5bd81781a795087447b7332353a3a71b5c9514c39bea39a851fccadce2234e0fb9af537dfa10fc4be2c25051261f7c67de"; + sha512.doc = "7fe88b4098e5edb4a7e548688e3b12f66714e6cafd35492e816385563039ed81e03b25406a9aa1dd231cf89d2b4616cc838ee352ad1468a756ee00aa291c297c"; + sha512.source = "185f23319d2509c9eef88dd36edf55b7f144711c9836b6ea9072dbbdfe62908f4d556957fd62eee5d50a82f7635216d7069be0c9fcaf646de84a330f56011719"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +listings-ext = { + revision = 29349; + shortdesc = "Automated input of source"; + sha512.run = "c68752d0e7a1ffb7d08f153bf337849164d0287f20ff8f092635ad7083b2e5a6c487bcd9dff913dd029f4ea92750768d23583eed53a0c2d3bf012e4db059708c"; + sha512.doc = "82491f81dfc89950d085f7cc41dabdf7b895b23c8a69f80c1b4f4c420fe8f036ac181b56e3ab60496910d0f1165ce19b2f94c5e268dc1d59e352ab6747e3bee5"; + sha512.source = "fab34f07d6384a5474f3ac30e2e00a75398418668134ac1041cabded6209c9521244e1637e4037e7346bc70b3247ebcd90526d5e34fc3c4e388fa978382bf228"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "67"; +}; +listings-ext.binfiles = [ + "listings-ext.sh" +]; +listingsutf8 = { + revision = 53097; + shortdesc = "Allow UTF-8 in listings input"; + stripPrefix = 0; + sha512.run = "846cc046ced340cafd98f009a55e891bfa6bd5715c94c0dbd5b124599c8e3aed1f248f56592795184fa040285001b0d967dfb26b0fb764bdfadcc2eabe8c3122"; + sha512.doc = "fd15657a8c7e8af4d21721f64ee0c2a77606d965698fdfeb581116f3b13dbf95bf774b77f019bef4cdb4565cd1957cf040818b1d9f78425eecfccc48ab6c5e28"; + sha512.source = "9ee30440400c6cba5726ad3e15e0044fb18b74613237da64eca9e188246193b6e0ac205af9a3e7e1b566503330a85bf6507db7c3ac4caba6c31033f9f87404e2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +listlbls = { + revision = 67215; + shortdesc = "Creates a list of all labels used throughout a document"; + stripPrefix = 0; + sha512.run = "bb0391bd671c306bb34abc336f74e203141fb0b2ae131dc36820e24716ddb5b7a1bfe9650baa5ba4cb4078e6f9d097a9a464aba1022b36f76c3257e25e583979"; + sha512.doc = "773bb3996ee16ca65ef8a91e42e6d1641d42ae50de7fbe4b8324ad9e70d326d0fbca85e245d48bfea137a65f33ffc6e81add6208d239992012ac1851ca12d4a8"; + sha512.source = "441fa4a8ac0e618a997078368794800f57e25545134533b81121718bcec912c1c367b193bf7cb3756102ffad4f75497e63c9cef611319aa478fee955c9cea780"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +listliketab = { + revision = 15878; + shortdesc = "Typeset lists as tables"; + stripPrefix = 0; + sha512.run = "0aead2b70e314639aeb98c199d051fb0701570df0263f452bb2e65408678d437c7eb071c41d8674971e42a0961da30754696a58eaaa41dc32d33ded58a833153"; + sha512.doc = "70ceddb9c59981319ec33fba05c663ecaf549b5dab56f29fa07f9c314d97d999c762ee1efff0d20b5e35b39e89b031458fdde4c5c708e0a1c2dbfdf17d710c2e"; + sha512.source = "68b75e9dcce30acb59d928f4ff95732cd7e37061d31625f8c1835ef6b8da85ef39f4d8ee86b50e299e71cace2ca5307c25641042f325a93a93bd04bf804ec5b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +listofitems = { + revision = 70583; + shortdesc = "Grab items in lists using user-specified sep char"; + stripPrefix = 0; + sha512.run = "d6262c85d8df67b4e85e8d80caf776f723dbf68f71e604c012965ddb1469c2cc3d965f84fe26ef245b6788de4c5e9e5b6f2b97938a0b1c5c67ce8661877a2295"; + sha512.doc = "a1a5cfc935658cd452b08ec422b6530a2d7fa49685b226a27760976ae652fcc0e7c6a239050d2a70aa34b0933b5e5c14c072b6ef7ec294182c274412d830703f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.65"; +}; +listofsymbols = { + revision = 16134; + shortdesc = "Create and manipulate lists of symbols"; + stripPrefix = 0; + sha512.run = "dd32fbcd59fa9ec599b0a06672d2e810b5b8172a96a4170cad03a93be3da21a02a036967d0e7e3a617bad6535aca2b1a34a114c383b5ed1aca22bc45239266d2"; + sha512.doc = "ff8bb87ee326f0b0df175eb41d634d67cf2f1ecb76f1f8dacf2e19d061e54c4f5cf8e01c7e8c41087ca6b69a04f5a3184ee8ee39f00758d3df2f24a4b2e372d3"; + sha512.source = "b232671411ada9bee8e9408ac9f7bb94e57010a39d916beb78d3f04dd1826203b37f8b8d4f040cce5bf0cc6b7ca97eab97d6f764ffe370b09c361a44af530837"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +litebook = { + revision = 70583; + shortdesc = "A fresh cover and chapter design for books"; + stripPrefix = 0; + sha512.run = "46946e4546edce653f21a71689352b8a582f76bd61fa91da3178ac09860a878b38a3fbf72d6a57f6bd94120fe5ded01b598e6516d5f8a2acaabaf6b2ebde4680"; + sha512.doc = "4b91e32193a2fce61dfd96feffc2f7cf5211982d7676c37ed44e32cd03665bce80911f636eecfa6039263875e81f1cf5135b06faae57134d88372156b5576abb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +litesolution = { + revision = 70608; + shortdesc = "A template providing a light design for solutions of test papers"; + stripPrefix = 0; + sha512.run = "15a900b8789ed60364c2c8880522963484d9397f0774c1b945b109c0e320ff191e600e0db7878186444707582bf1411db18145c6ce2545f141be9491ff9335f2"; + sha512.doc = "fe0ff414190a8d2c9bd9752df294007f4681360bdc07cd23547d519e0f7db0972900a2420bb761e28ca54e0a49eeda1d7cb1a2f20f3d3c6eb0cb3e5b09da9938"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0a"; +}; +litetable = { + revision = 70355; + shortdesc = "Class schedules with colorful course blocks"; + stripPrefix = 0; + sha512.run = "a77145b829bfb5ff6d943f11e687f54ccb3abb3784ce9e3bdf145bb66e5c808a46a802eaec1f6932a2917683d64df41cb44b8ec90499a8e93928b46913d099bf"; + sha512.doc = "b4080e8d6243b8e6353f12b090c481cc63fafa7c1c20596467dec79340a8fc1060431f9576d9742c901e45cc1d7285686356bd64cf0d274a7a8bc2c0de8162f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4c"; +}; +lithuanian = { + revision = 66461; + shortdesc = "Lithuanian language support"; + stripPrefix = 0; + fontMaps = [ + "Map l7x-urwvn.map" + ]; + sha512.run = "c2cd1b54daf74e78e6087159fa827ece77f2dc835eda81e03fce861581e812536292f3f0b70b8bb77107c0a4032d12006e870303156a3f3c7cb653020ed9b97c"; + sha512.doc = "ae7a5e3bea2bd62a0cdbbfbde7e0d9e06554fa4b3bb825b45febed42556fa101fd2e6c611ad9fc1cc87ed5c92540977780fde47ae78a89dd37b70f89c94b5e8d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +liturg = { + revision = 15878; + shortdesc = "Support for typesetting Catholic liturgical texts"; + stripPrefix = 0; + sha512.run = "e97da4e9046fbd60ac2b22bc3753db7a75b5b6aeeb6c37293c5dd1e4e8fffd18b32818b9038b816a405033ff74d9c19ec2443b0169721656af687f1c5d62cf9d"; + sha512.doc = "6b342e85917d5a70dc32461de01ae3c6ac66ca247b4ba3d812b7645f1cd1d961c914e584cabf743bb03ea74cac144ec05b03cc09d0c23cf7bbf4b8ce7d01937c"; + sha512.source = "07bfbe684ae7584cac1dceb3d9012607ee24639a0e4e858d2f570f4aa3c21280bb6116123910a111c729dab794e568c05f8778d3b71612ebc288b0c268eab920"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lkproof = { + revision = 20021; + shortdesc = "LK Proof figure macros"; + stripPrefix = 0; + sha512.run = "58c211cf1ed20b36e69ceffc8568fc1cbdb51cb812af79d16a64cbe8a8e7e672a2d49e672501b2cb23ef72c4a04c59017e17e538061159c8b9e797624f8334ca"; + sha512.doc = "01c3f1b50147c73294dabf83d79811862d4742f5a76f69ff6f6a1d5a2b0a8462e3728ba6e4d6fea57d3703c638f6cf04568948d45d4ec8d1dfe59571ff2933b6"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "3.1"; +}; +llncs = { + revision = 69629; + shortdesc = "Document class and bibliography style for Lecture Notes in Computer Science (LNCS)"; + stripPrefix = 0; + sha512.run = "0c50b5bbb2a6c72d61fdac915b1918b76323b715f71ffe42e1575d21f5c3e39fdf0b802c3d139d07894b4ec351a779dfdab53834dff83e09cc20de07736bb031"; + sha512.doc = "be33f338c2243da8c20677c485be4de3a9287b953137e00a5f1b7b04fa9a9c452cd32b5b5adac55626ab84c36d065c958ac505f4a63da32c25cd26ab5f69f2a5"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "2.24"; +}; +llncsconf = { + revision = 63136; + shortdesc = "LaTeX package extending Springer's llncs class"; + stripPrefix = 0; + sha512.run = "ded1d0ad62120e6665653575e6641a9bacb1fdd18b168f7c4389e2d8bbca6afa8cf15bbb7cf087f2ba502f85bb492dfd5d79862e03d909227666af7d8860d47f"; + sha512.doc = "1fc61aab273b9ba1ffaa95cc2716f36d61bc5d7d7c03a2470e3dff5fbee20dda933e4a38e5b39a7e165f68408f993de693ba5547b673e9faa9e5115358c9bfb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +lm = { + revision = 67718; + shortdesc = "Latin modern fonts in outline formats"; + stripPrefix = 0; + fontMaps = [ + "Map lm.map" + ]; + sha512.run = "9e05642ab07ebe05c13d5fa98f3212527aa66a9d049f8eade506cbd9f0652315363a01ae20a9df873055e5283bba7574d51251c7dd86e56ebc37055b92379421"; + sha512.doc = "d15569c1f55553b068b8d3a73efdbdb74137d02fdda5db5d57f29203dcd92dea7746b73a3f30293b2932f046e60697ea015b83d2587cde2783300fa41967c5b0"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "2.005"; +}; +lm-math = { + revision = 67718; + shortdesc = "OpenType maths fonts for Latin Modern"; + stripPrefix = 0; + sha512.run = "2fad475b347824d564525de51ed5bd1cc7ab2fc27fd826a00e86ebabd7d85afce2f7a4c85d9620c9b66d14ea0c813a269a13843a0b27eb7d0ca3e294114aad26"; + sha512.doc = "fb1800349628229dd522d4dffa182ffd2bc9411803f5b349c88f4046d81117d050a3b681e3021a514a6ada5bc49b648b8dda8b553f9294f6d4fc317db0cd5990"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "1.959"; +}; +lmake = { + revision = 25552; + shortdesc = "Process lists to do repetitive actions"; + stripPrefix = 0; + sha512.run = "3613e9d53808b2d1e326175c28acb672c1f244b2e00ea1d544e1e05c73e2a93e49b5e8b187a8a73e87ffbb00c22235781983a2c0a733a6ae5598db12c278a763"; + sha512.doc = "08fa487d9151ea6a49a73044d1f6b41ed0c636a69e04a2c9f04bce996f915e9d267383a6fc374f3292c01244981fdebf6d9fc462ee0fc151ded2601e4554593b"; + sha512.source = "d18894108d2b4b5d46d4e212648b6c7d76894faf4dd45555371d17df5f6d186d4d2b5c8878e745520441eba2459c5fce320bef28e23bb59c09f01fee44a6041e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +lni = { + revision = 69361; + shortdesc = "Official class for the \"Lecture Notes in Informatics\""; + stripPrefix = 0; + sha512.run = "5b091deac5f045af63d4351abfe70e28343ee46fa9e9c62d2cec409b0453b1c391a07abb743be24c8d01f8e5063964574ee684beb7b91126da55fc8e0663a831"; + sha512.doc = "da89225db988132af56a8f6be0330e5ea761d1a8da1237c966c3b30f91c776e7e2c118e8aacc843c23f58d3f514c5e0cc6c2d06a689c886be90f8d309215095a"; + sha512.source = "e02d92d0878fe98ce533ad9fcf058325c7d82f9548cc3211d34ba0d9d83e515c41cc77f588455d589b50ebc41358ecafe0c84e501ac60a402f8d548a1fe87671"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8.1"; +}; +lobster2 = { + revision = 64442; + shortdesc = "Lobster Two fonts, with support for all LaTeX engines"; + stripPrefix = 0; + fontMaps = [ + "Map LobsterTwo.map" + ]; + sha512.run = "ff9a64e40eb1e8d19ed353e4c6e46472f48eaa057a1283e8203eafd895cc622c031a849cf2cd941a664b07c4acc0e9fa18ca65acf6420cb3d40ce09c6ab6f391"; + sha512.doc = "a02034161dcd7d09ab14d907fde0b4cbc570ee7e13fc1945e18c71eaffe90e5dc039266f0ac83dd7887fa1e298add0d2be9e4259cb58f6dbfe13b7bce228ab8c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +locality = { + revision = 20422; + shortdesc = "Various macros for keeping things local"; + stripPrefix = 0; + sha512.run = "c7fde4ad74b339d340a046a4f59ff73da45942631c6b68275d365c18ee80b213d18b84540b8ee535f012aa18ef559e88b1df3fcff4560d241ee1147695824a2e"; + sha512.doc = "5b7fde689fc764dc75930522416cfeb51ec30eec64080b289c085be4b00a0da1c5d6d79d2734502ca8a329bc2935216a8b298495e0ad1ac8331c6d3a5718bb5f"; + sha512.source = "bb1e55107d9b16460b8990f35461bbe775c674ecb2dabb78d19514e365cc97f0b03ad5884b310edc60f2fea9366ee2633ddf4280165cab562038e024ea9267fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +localloc = { + revision = 56496; + shortdesc = "Macros for localizing TeX register allocations"; + stripPrefix = 0; + sha512.run = "abd3aaa28d6c90182990890ebc8aa0ab1d71833549e9a1ed9a09d7fc2db01cad45efb231cb8d3b09a849c948a6f7ba309954d38152af88fa8cd3e38cc857fe68"; + sha512.doc = "40fa07b0d5a5fe0603a087ce9440dd6d95ab188b83b4adf847d7145f9e1f1cc8e2d8ef49c7ee206e341db26afd885308ef349ea5a8c2b826ba6664c347c7d8c5"; + sha512.source = "9a19531358e4809a90c1e571a8f7c507ec1b0807a009627ad2dfa3ebdf97fb749a4f57441b0855e44cae93ccbdc64e79b640de078fb9ccdca1de891a2d156eae"; + hasRunfiles = true; + license = [ "free" ]; +}; +logbox = { + revision = 24499; + shortdesc = "e-TeX showbox facilities for exploration purposes"; + stripPrefix = 0; + sha512.run = "0c6f9d401c81344465d6eaa6eb6e655443c4af1622bfb6751db508638e2625aba7b5e77780fbb6453eee40b8a7ddba84d70ceca8882049779db61f83e7a15aee"; + sha512.doc = "21f379c88638ee8499e7e47abb0850822a08d520aabb352e0f85ed0c38950aa71b4f9b3d430c31193de5640a915d0c84dc28fba71443d3f2e461a2dac53e2b9a"; + sha512.source = "3123ed1fef39d4a252159c65e0cf938933f2ab4c693d8f7364f20e60accb20e32fcd9da8828019a8cefae1fb874605ffbcf88dd7123fff91871858cb5694a985"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +logical-markup-utils = { + revision = 15878; + shortdesc = "Packages for language-dependent inline quotes and dashes"; + stripPrefix = 0; + sha512.run = "87f7fc345935804705ab25ab010376fb72bc4722c75bb115b0c9dd0e0a51fc8bdd6dd4051b76dd083ec07d80b8c59c5d18423da55e0430db7a9f94ad0bd45906"; + sha512.doc = "80c44068a6e474071e40a0bf3dc67f0201b21eb84a041fad8423c59c9e34ce138833c54ead638979357dc3026eea55da034daa05e71a56ecabe701ebf53faf24"; + hasRunfiles = true; + license = [ "gpl3Only" ]; +}; +logicproof = { + revision = 33254; + shortdesc = "Box proofs for propositional and predicate logic"; + stripPrefix = 0; + sha512.run = "d5b15ee5f35a9ef94618f8b092e97ccc4f1959a617c2e604b99ba56eef14c4a1a078d66f2c77d02239289e30878293ea6c9ff4134bd003331fc41fd3db19cec5"; + sha512.doc = "bf8a33c5db05a30cb4f520fa2f73f572a90c3803c4b6dc1709f9e2c80f67e32e7665ce898852dedcd3daa8974bf909034d06f805ce473318f0f512645ceaf9da"; + sha512.source = "4cde464059a65161c6ab069ef0c8905e4e6cefb7ebfd8c7c3b2af909209af4a911dd1bb0daee5b27868305660601187fe7a105660b395de98ae3d30864f012ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +logicpuzzle = { + revision = 34491; + shortdesc = "Typeset (grid-based) logic puzzles"; + stripPrefix = 0; + sha512.run = "2c642c7aa6d6f12e51228432f8bd9fab906ff4dd3354a49f636582a065bff0f534222161ce11306ff6bf3e354a9ca6f6394cf9826b321ac94e9ef5ee8c0621ff"; + sha512.doc = "872a72ed13f7dcb43df3bd2f2b7bd504e3e430030115faadf0a130d2fd94331a335c4853e37c78e4b8aa7c59a44bfd87ad2a484b1b836c2a7526b97ef26ddd56"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5"; +}; +logix = { + revision = 63688; + shortdesc = "Supplement to the Unicode math symbols"; + stripPrefix = 0; + sha512.run = "29a2701ae91a5d7fec49e564b90b8a7e31374d2218680f4fa0c65c9df6dadae78c6599977e88cbf293fe2435d8b7403f41748abfb1cd5f9b00e94c76ff43e139"; + sha512.doc = "7b655c727fdb2775a0d980bc54198d1b2c262842fb278f94caa764204022f8da4bdfef8e40a8560359e6fef23e28aa97da4c08a44c80140ed337010d47173eed"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.13"; +}; +logoetalab = { + revision = 68916; + shortdesc = "Insert Licence Etalab 2.0 logo"; + stripPrefix = 0; + sha512.run = "1b3f01a1acc23b17e30185b3bf2b4e965d047bffc7d87649a40e52e4fc9de36518e82335055c66f221cf10b7c6a1cfdf9f51641f5ea945aa0f7d7efd76780fac"; + sha512.doc = "93e17e5c624aa8a6f826294fc33de8a66731020696525821f4e14a5bfe0f3033cb6ae21abef41d408e627a6ca8d6e12ddfc7aa30d02152e6aadef3fb88fe92ce"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-20" ]; + version = "0.1.1"; +}; +logpap = { + revision = 15878; + shortdesc = "Generate logarithmic graph paper with LaTeX"; + stripPrefix = 0; + sha512.run = "159876dc23e96f65fbb29278e30baa497489331fcf52ebda2adcb19098c2519044ce54ee590c3d91f80bf27b6df0a49aff455da54748c3e04c7e81c2be108e4b"; + sha512.doc = "f85a52b9d95247ce5eb537cc677aff184a434a41fa9c3433955b43eec3e3cf2deaa701718fe77dd3b3cfad5811c5275a097d980e157130705ad5cd3f14276dff"; + sha512.source = "c6c2127c2789c2717072d8d08043ac73a86248d71dd542d38dcedb3a36947f7ceb99f0246787e279b22fa03dea554a6afde6438ffda3fda6143027a7e6f1d78a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +logreq = { + revision = 53003; + shortdesc = "Support for automation of the LaTeX workflow"; + stripPrefix = 0; + deps = [ + "etoolbox" + ]; + sha512.run = "df61c0c6c0b8520f5ec38780d8eb69cfd5fccd21f5120e48eee71e02b004d3da4cc9cb9371a36766852e3ca09a3db86655f1a2639a49741f00134cff1246acd2"; + sha512.doc = "fa9277da81dfb3aa235bd795780e8d3e629558fede90fa9234528b50a11507e59e65e49a0ca787af037186890392dfd45bf6de7bd859cec369626fb7d57b543f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lollipop = { + revision = 69742; + shortdesc = "TeX made easy"; + deps = [ + "cm" + "hyphen-base" + "tex" + ]; + formats = [ + { + name = "lollipop"; + engine = "tex"; + options = "lollipop.ini"; + fmttriggers = [ "cm" "hyphen-base" ]; + } + ]; + sha512.run = "03a780145d4e761f3d494ccc54117e2f92f1c32b8f35a88a77b3145442b040c195b2bae10aaf39557530e548961230c7550e25ea77472a8b0e272f0e72609a8c"; + sha512.doc = "3ee627e18491a48c58132b85cc1079b2a2f857b9453cdda113bedd7c9393f04e15c6215e6cbae99fe3d4c24a297d230a687e3bb7aeb67cc45ef105051838c6dd"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.07"; +}; +lollipop.binfiles = [ + "lollipop" +]; +longdivision = { + revision = 68609; + shortdesc = "Typesets long division"; + stripPrefix = 0; + sha512.run = "2f1f1e6a6b93266a1c6e1c3fbc33e4f9719b6ed06390d2e277e811f429f0b71c3e3133e2e406b837c109672b725bab29534a8e9c9b380128cba6901d5082c53b"; + sha512.doc = "8314b4fd0802dc541d640a706b0bdc3b10f909365372ad9432c49e533f95103643c1171038b7f346b9f92688d27338e81fd5c803070d99f10a61adf690ee6389"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +longfbox = { + revision = 39028; + shortdesc = "Draw framed boxes with standard CSS attributes that can break over multiple pages"; + stripPrefix = 0; + sha512.run = "43164941fd7ad91fa304aee01c3d34ec1faf8672549ae3b2711bdd4c91ae57ecbdcd8b29080d6c96cc64a73f7d7fd74c8621a70604a29dc1474f3c922c34a4c7"; + sha512.doc = "fb319a679631e56122535b99a187d3c2ad5400d4a1f00275b73420c43f98e8b421a4b86f77b868c68edb39870132117de3310a00bde82f6387559c6adf34a8a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +longfigure = { + revision = 34302; + shortdesc = "Provides a figure-like environment that break over pages"; + stripPrefix = 0; + sha512.run = "984f10c8a2196b490dbffb015f2aa6449e8db6475c2f02dd71c92d5a3f6cb5dccb98a4c4f923f6efd3bbb1056aa8e64f324e3d8a051c11879677addaed8d3f06"; + sha512.doc = "1f949e3ada113710f40b6d2960bb01ffffd3f9d26a65fd0482644da2a20c5375454c430e1c7d3b74cf872cbe486ccab9a4e71567592da5d39ad9e72102c382db"; + sha512.source = "03d73c0d0c30d0c69f1fb878dcf843b26480c5005d88034e6f09fce485db3cf249240f2e39f591acd13556cf06677bd567857ceaaf96ec9cd0178f8216323be8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +longnamefilelist = { + revision = 27889; + shortdesc = "Tidy \listfiles with long file names"; + stripPrefix = 0; + sha512.run = "1d16ee9c76784c5124de3abe62b6e916d0f65e979a18a721ef688a960e5d20382dc976de0b68d95c47e9651ad71a67ca97a828f1bdfba8e4a77ac084d7561386"; + sha512.doc = "d909908d763342790b8ab56d333e60d7047894472f3922a2554581a5455539845af72d3867d0a55f5a27e982aa8128ae1a948f40e106fa127f2d01156b55ccf6"; + sha512.source = "af1383755b422a3bdbf7af7437b732a39aaf666c7244e75d498b1252d3644e58a18115a744c4b4c7fe1433f415b40886868faeb064b13647452d444f64fd6f9b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +loops = { + revision = 30704; + shortdesc = "General looping macros for use with LaTeX"; + stripPrefix = 0; + sha512.run = "60ee6999e43ba9082c5a283dac5a930c9075b24f6bc7cd3f719b0336b01dfcb17fb2d5e3c82b9f1636c9bb3e6c923607a3d9237d08fbaf17bbfc1196d0a75281"; + sha512.doc = "9d70b3ae88d64bf2710157db88113224a95947aa03f11a2eb659c61109a451e2a93b2aa5ffd6ce9cf2f1b5fc8e0ef815850a0a9f27c7ec5ddbfbff1fe98ecaa4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +lparse = { + revision = 65693; + shortdesc = "A Lua module for parsing key-value options"; + stripPrefix = 0; + sha512.run = "a5f16ff6e4b9ad5ba247205952a1a2b6ec26ea3f307e7e61527b8c9aad860b0d3cffa4166a4fcde56b2d54f3ae1f22bb33bb892c90f896015b0fa4cfc73a13f7"; + sha512.doc = "0c08dc7cf19169e33ad0c4695dbc2a5ba6f16bb328879d2ab9ffe3cfedccaf65499ec0865783947a7db873b20f573e4443368d39d5ad7ef959b3f24770ec9c72"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +lpform = { + revision = 36918; + shortdesc = "Typesetting linear programming formulations and sets of equations"; + stripPrefix = 0; + sha512.run = "91d5748629ad72ca421834ffc61c13f71240bbcaedf9f0e4279bc6aa0bbdc817f093c24cf5a9c50d5a4a132208969bd356642fc5704ebd5c4ef2b7eef23f27ac"; + sha512.doc = "92ddf3b473e13fe8b77ad955d55acbe7a6da34381bfaac78184342a900f2c9bb1e0981d5ebdb440cf0f44affe2eb0dd862f9b51d2a40c9abd90f1dbe81584c9d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lpic = { + revision = 20843; + shortdesc = "Put LaTeX material over included graphics"; + stripPrefix = 0; + sha512.run = "d918fdc8744a9f5e0d24f6ba4f19bbc4cbd9a5ba4b3c559ab1321c36a9e3599ccf6ee849bd7f2ef6c3156cec6e526a44d27bc033b7dc5b217e289fdbff0bf149"; + sha512.doc = "307109b75129099c191a65a7632ad0cbc903cb2b621b199dcceb7cab5ab5ddeff7ee504d7da3afd653e1aac04236efb6a3c1225f9e533a777295052bcc28d2ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +lplfitch = { + revision = 31077; + shortdesc = "Fitch-style natural deduction proofs"; + stripPrefix = 0; + sha512.run = "189b9d6000d4b762a3c64652bb05f9465d5c789b7e2413e8f0ca281a8d4729a3044aa955ad7eb82c7b8513bd547bb76c2ad2b609e902b07f8f4f018698e17071"; + sha512.doc = "a690ee2c1f9cf5eb36693a4a9385c047a31d29387930211bf6384d7cbedb3d1f1696c0c04269b02ef29b13ebccc69bbc329772f3fee209a1b1d51768484f9a50"; + sha512.source = "b06b45d992045111d1a8aed78267519f8b959415b00b94f75602b35cb7d37c47092e726db881d9094e82d3e25492513db66b210603730f8119d10e60819ec89e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +lps = { + revision = 21322; + shortdesc = "Class for \"Logic and Philosophy of Science\""; + stripPrefix = 0; + sha512.run = "8bc59b5d8874fca88bfe62822f2050f5dee0461523d853a1c92a051e854ddd6a8b2ce235a674bda383f26ad01d6e18a83cac87db2ea73b4af7e22e74ff823d0e"; + sha512.doc = "a8ad542b5d2c28a9a02b5e4d4a43a13e2f3469512cf7264eb7ed78e2c5a29228531de3be7e84e557e3cc8a9ad60e59ca426da3d5e034dae6b40088ee99d2fd94"; + sha512.source = "d1ae82c4a55280183a85fb3eec77306990f694f85c5d6b543b4ce4bbaf87a01b7fae2d6892bbf23587738079be503ac94b6a68b372ca1948863ceab826975a85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +lroundrect = { + revision = 39804; + shortdesc = "LaTeX macros for utilizing the roundrect MetaPost routines"; + stripPrefix = 0; + sha512.run = "6e4968db6d4593fb0ad66c58b7977b77cfc5ad29a8ae8648bfa0f7844d71a809e0b381acfa4563cb1795177374963ddc10e8fad8a62c1523ea82288c7bd02087"; + sha512.doc = "12e6bccf3875f4045558df6e274a13f60fb7845a998de2e8a722168cbef2d9003224f02e379bcf0752770542aed15ec1d1e680a54e347763b554535ffc2e1042"; + sha512.source = "cf39670d2c17420b2283be3264b163f7d4df70288b6c974674cb0ca4d52e3d7f99766f9f0c5b8636348aaad2ca851d1c4b3d530a2a85567a1bec2804ac5d70a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +lsc = { + revision = 15878; + shortdesc = "Typesetting Live Sequence Charts"; + stripPrefix = 0; + sha512.run = "f61d81a49c25972e03120cbf6557d356d6df6937af6e0443e47305312485217b6bb5c0818adf248fb860ec5d42c07fc22fdc0c54f9dd1f3bdcb12486350316da"; + sha512.doc = "5d0550421ee0657c378cc1ad8159e16e43644f533e3d8a013d917c494bbb8d11cba79b99fcaa7bdcf8ef5f5deb88d144ed64d75a5682fe4c4187c60c634297f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lshort-bulgarian = { + revision = 15878; + shortdesc = "Bulgarian translation of the \"Short Introduction to LaTeX2e\""; + stripPrefix = 0; + sha512.run = "b528c16903ca8ed5ce69f5e2397dff8f05b13016384bc1304980cad71d86bbb55004d41db92dc29dd412a12b9a0a1b1ea99afcbea621a25bb20da4639d008776"; + sha512.doc = "7cd22cad45d7ef2972679cf2a3653c3bbcb1d9bcfe94a65fb9dac23760de05b659470ca45cf8be13513924fa1cbb98599a304a51bc18f8f4d6631f082e662bc4"; + license = [ "publicDomain" ]; +}; +lshort-chinese = { + revision = 67025; + shortdesc = "Introduction to LaTeX, in Chinese"; + stripPrefix = 0; + sha512.run = "6d6ac34f79c3d5447c1bbd7f2c87071a92867bd770fd023bc4d6fb48500d27f1b1a8706a727b0d0a7b47eaa9a639c6b5a691b7d21a5e178eb79131cb4bd75b6c"; + sha512.doc = "c220f086c2e0c9bd52ba3ee1eddd2afcb0aaed1c4fc4b9ebf854ce57b4720df7ab3c5475f3164cf740b3020c14c5682e1798e43c8ad9e39eba596a24b04644d3"; + license = [ "fdl13Only" ]; + version = "6.04"; +}; +lshort-czech = { + revision = 55643; + shortdesc = "Czech translation of the \"Short Introduction to LaTeX2e\""; + stripPrefix = 0; + sha512.run = "dc967aae970e535c5dea48264c30f01d5ff3521851abd718905b78497c3d95d403c4f1ec8633cd2a7a55fe0a6bc1e1523391b214fbb8a0e2ed03737b09080e40"; + sha512.doc = "10de238b8152907ec04834d6b4737cebb13bd6567c9867e19e2003d123299c733012569cd64a66d31a79894f9b37c1fc409cd5b76ed10832762988fc318875e5"; + license = [ "gpl1Only" ]; + version = "4.27"; +}; +lshort-dutch = { + revision = 15878; + shortdesc = "Introduction to LaTeX in Dutch"; + stripPrefix = 0; + sha512.run = "c8635db5888817d392706b8b65aa5158a4973cf236dad7fe31a9545857daab15a6c1f2f82ab06e71e50a4af94824b17ac89c394a759721e192966a1f78433d47"; + sha512.doc = "29fc8b6a2645f241e8af437de3a295be8d56a088bd7c7666c35b14f104f242e68ecef2757d62a393400d9f337eb685e48ebac06769259c723d634312a7288ab9"; + license = [ "gpl1Only" ]; + version = "1.3"; +}; +lshort-english = { + revision = 58309; + shortdesc = "A (Not So) Short Introduction to LaTeX2e"; + stripPrefix = 0; + sha512.run = "73e7cebb51b9ae5ce2c6ddfd191a1d7e5358e5a1bfc61ff8d921cf0928e2cde839f232dae6cb0d9dd1b05df907c8c56c3f72a4d89917a6930762a46e1b1aa286"; + sha512.doc = "ab6dccb0110d7033a36d743b9f8132ec5ab4a0b4b334ab7800dd68f9e65bdc7de6c5e766fba6a7a3596d3fd8d6a3a16299344fcbfd67585f1fbe5e519876d7ba"; + license = [ "gpl2Only" ]; + version = "6.4"; +}; +lshort-estonian = { + revision = 39323; + shortdesc = "Estonian introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "6bd3c07c1e5f9d543b0f67a5585cc33252567cc346a8d7feca050baf8ab437be97e73d2c4b4b159102e9c4772f8cce2abcbc25486d73e976b83a3d2f4b9e9487"; + sha512.doc = "e16397fac3e6cefa699b412ada1851c7792520da8af1230274fa1a337b890629b68f71d94b3894044f28e687c6aa60d766377e12232d0e522e82e18dc97428e3"; + license = [ "gpl2Only" ]; + version = "5.05"; +}; +lshort-finnish = { + revision = 15878; + shortdesc = "Finnish introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "997db393d16942e78e4f52eef886ac7b14cba7ec3fd0c88f8c2cc74fb6b35f3802c58c51ac0112cc2b086f9c3b965b5f8d508ea81a36edb7da1ce84ef83cd203"; + sha512.doc = "71c2e5c4d49a779f529a527cda5fcc6e55cfa0149fc2d9272ae7e69aecf2a8a361b057bcfdf5deaa7791073bc6252c3101f5ce0b8d231c779e99c34910a3343f"; + license = [ "publicDomain" ]; +}; +lshort-french = { + revision = 23332; + shortdesc = "Short introduction to LaTeX, French translation"; + stripPrefix = 0; + sha512.run = "1b2ab00e9e69eb058afd96c1ed099b8c783bb97bb52411cc907afcc82d43167ad6e2023a95671e90d059ee43ae335dae3401cc0d1b53c19c186992756aad5060"; + sha512.doc = "2974f067584486528adf42a13cad28afd205f2f52680e89e8de33c4c0debdccb2d0d9d8259d6e2adaa5f86af0b9451232450d40ffacd9f63c43af2519cd8a06a"; + license = [ "gpl1Only" ]; + version = "5.01fr-0"; +}; +lshort-german = { + revision = 55643; + shortdesc = "German version of A Short Introduction to LaTeX2e: LaTeX2e-Kurzbeschreibung"; + stripPrefix = 0; + sha512.run = "c937bb8da86a3ef6d428d134903bf8af74a286d644bedfe4766841b2b5234b34e2caed70460ecaf7a1b1dc57f1faf1396435cca7f714f84d75f15acea12e79f8"; + sha512.doc = "69cebdd6a1444670a154d5cdd199022f6f1d6612b24b05fc8dc1e9f54a89fb65cda1f545341cd37616dbf6dd94077ccb924bf4b49f1473e45eb0bcd33f5f33a6"; + license = [ "opubl" ]; + version = "3.0c"; +}; +lshort-italian = { + revision = 57038; + shortdesc = "Introduction to LaTeX in Italian"; + stripPrefix = 0; + sha512.run = "05435f3a1af4c589267f1841e9af267fc12e2a3fe5b3ea2c586fd352f4a1184f1fc4be408780ff6db1b9212e1e4d1bb7263e3b35e7be9358e97e1712e9abcd6a"; + sha512.doc = "6caa8b7d2795779ef010c0ef9ac387c73b15715929557a6227e0a8112f4d99717ad82fdcdf8d1fe18ad5ea9b502ed559bd7b44f73381475034b481eeb6ab1c9a"; + license = [ "gpl1Only" ]; + version = "6.2"; +}; +lshort-japanese = { + revision = 36207; + shortdesc = "Japanese version of A Short Introduction to LaTeX2e"; + stripPrefix = 0; + sha512.run = "25de64f37ca5811ce39c8efc3e895c1deea317c8dd02ac3e091a41ff11ab7a4730a0e476d323d8375c41fd60401cf441c2c15d614a090092d66413701500d43c"; + sha512.doc = "83292d42fa21614a055420eeb372ae5cf21a9a15b999e0b39f1063f63ee7fe53f77ce771a8aa649e860827214138fbd435161cb3dc4b3fdf2b75775979d904cd"; + license = [ "gpl1Only" ]; +}; +lshort-korean = { + revision = 58468; + shortdesc = "Korean introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "3050ad46874a78c36d8bf247c00e2369c18e122ec89a36b0423df290ba8e06e9c5dbd1d9bba5485e370cd73dc500a6d2415b3d8f6de0eabb3932b9ae5515fb8c"; + sha512.doc = "6789054257f176828b341fe9ad258b1f7100d2fc880aab68244842317b45cea872ee49031ad2c1d376011772fb39d2ef05a700f962279f5ce3a286270b77ee1d"; + license = [ "fdl13Only" ]; +}; +lshort-mongol = { + revision = 15878; + shortdesc = "Short introduction to LaTeX, in Mongolian"; + stripPrefix = 0; + sha512.run = "464b6638ca4bf859ff178238625ecdb7016598fc98c476d3e4b2a24e2f34e6096edef5864ab325ab4df21bcf309a8467deda80b385b624685b38b538a0d40b8d"; + sha512.doc = "cb60632992b187e5cc80973b9e9848675b464b075b13356db171c1a7613c94dd9bf8ea53df47e0c36c910772316f4c43857c8e638819d8ece7c1ce1790fc9d29"; + license = [ "lppl13c" ]; + version = "4.26"; +}; +lshort-persian = { + revision = 31296; + shortdesc = "Persian (Farsi) introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "6430462b11786fe3703e78efc9f1486da78db15601ae31e72a95d516d10a098c8b4c5dc9079490e652c57369698d3b4fe4d75b32c44ddd2a470aa5cbc79ab492"; + sha512.doc = "9e7c43f3df8299db4bfad3c0b270c5b54a1448370e6782d095dd9a9b82ccc186aae98da86b2efe71c34031a5f4a07f54f4640de6d8b6fad913252979d440ccd1"; + license = [ "publicDomain" ]; + version = "5.01"; +}; +lshort-polish = { + revision = 63289; + shortdesc = "Introduction to LaTeX in Polish"; + stripPrefix = 0; + sha512.run = "c61289a35103ecfab025169d432be2b3c7f2fd4ff1eb094b345feae6c9a30bd2cee70e0402eb6c2ea330254cf00d04c02649a40d6bd011f9cc612521c88b94a6"; + sha512.doc = "abc5162a490b9646649dfdf50779ab12632eb3ddc6d1c2bae93a4bb00ef1f9387bc8d873a7b5c062b92a999c9d62b74e64b1688dd3582255f7386958649ee009"; + license = [ "gpl2Plus" ]; + version = "6.4PL1"; +}; +lshort-portuguese = { + revision = 55643; + shortdesc = "Introduction to LaTeX in Portuguese"; + stripPrefix = 0; + sha512.run = "70031c79e7124b9c839571fa95d8b141035a0d8f79665f1e79df8a3154b81f0a7f8b7d371cd00cfec11c141165ca5e1fb0e1cbbc4d0de8c52cc5e0b77c885f5d"; + sha512.doc = "19c55e5547d83fbce705121dbb09fe329c23cd42c1cedb812cc282bb447f9cc51ce0861e61a984e2863103a2bccaa6a4c7ffe8bd2913637930e42747c6947b02"; + license = [ "publicDomain" ]; + version = "5.01.0"; +}; +lshort-russian = { + revision = 55643; + shortdesc = "Russian introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "d6641dc4f19c740898dccc357aa1004860952d0a2add37c6c37fe69ac222dd8396e506ff6a00ef98f77d8cdcea2287c96258214159f08d8b63184eb014ececc3"; + sha512.doc = "b991cb5fc833446ab36c82beefa82afa026eda6b1084d99e6c4525687b82bf7c2f64f9cea38d244065cecf1b12a00331d4e70716880c5bf2509add05257accac"; + license = [ "gpl1Only" ]; +}; +lshort-slovak = { + revision = 15878; + shortdesc = "Slovak introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "bf3821d0846701c2e45d89578625f517567d401d613f5aa7aaa4cdfdf8c4c4f87abec22d6fccac21b274afdba9c29c21a6918fabef77f4cca506071341b7cdbe"; + sha512.doc = "8ee79c17e5ccc9dbb9f833b4f8927b22e7ce368f49f4d016fb936d2a5ec964791d9473b679a037d704efb269dc6caa1344168927a90a8e859527c64b0410996b"; + license = [ "lppl13c" ]; +}; +lshort-slovenian = { + revision = 68204; + shortdesc = "Slovenian translation of lshort"; + stripPrefix = 0; + sha512.run = "b053e42404063ed3275363c361ec85de69dd92281070f0c88afc860cf2ac07b3fef1a98598ceff52308e36c9f2b5e6c406df591481533b80fb0258ae20f32ca4"; + sha512.doc = "851951cd5822f257ecd23d73901d833ba6067d3860002a4dd4449f23d5e7a50fa97ed579f5cbab8bc9494801055ef8f23f6f3249d9f6843a28f7da1b4f15409b"; + license = [ "gpl1Only" ]; + version = "4.20"; +}; +lshort-spanish = { + revision = 35050; + shortdesc = "Short introduction to LaTeX, Spanish translation"; + stripPrefix = 0; + sha512.run = "127fc2d598f16d38b075b4a9668ded064537f7056aae34bdde22f89aa8d301d77cca818976e22aa036f47867929d30cc47e02ed3f724ea26279ecba723e5baf4"; + sha512.doc = "f968352fe1e32a918c1d5ebfce16d3975c436539349af22b32bfae1ab06061ac2b2b85feaed3e8a28da89956f4d5948e7d1a6426766144b0c0ebec72ecfe99cb"; + license = [ "free" ]; + version = "0.5"; +}; +lshort-thai = { + revision = 55643; + shortdesc = "Introduction to LaTeX in Thai"; + stripPrefix = 0; + sha512.run = "e81deefb7fa47e336a6b9fc363fa75c35576fa40de1771fff207dff22106b33d185c267d76a3897f2188d2dbdf9d2b93a1caddcdae38eb770cd7c5d6f1ccdbb2"; + sha512.doc = "fc805e2749305cff0164ccd8d0b043d26731fd6f39e19c0023c87e4812f8509b923d4c1a97594563394dd7bbbe4a99d3b25aa37366f6e5bfb3cc1c2aa21c0606"; + license = [ "publicDomain" ]; + version = "1.32"; +}; +lshort-turkish = { + revision = 15878; + shortdesc = "Turkish introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "769036083d282ab95c5f1fed08d669dd4fb1d2dd7937e5a4e2fad54e20cf56ce3d5100b7aa612cc59dca50b6ff67fbbd5bbe05c085b6121654f873fcb991609c"; + sha512.doc = "3aad40a5de5eee9e59064b15fe3e9c6a2585146fc21fdaf4683bfcba6786366c4ff1b3c38b6932426f53a6a9211809d4173f688f0878cbf2011d8982e3732834"; + license = [ "publicDomain" ]; + version = "4.20"; +}; +lshort-ukr = { + revision = 55643; + shortdesc = "Ukrainian version of the LaTeX introduction"; + stripPrefix = 0; + sha512.run = "82600643c91120d732d50dcc6e14a4b4b4c471bf6c0031890487215d952cbb9675210f11fc40b039aff529bef90282d432966ef9547fc7d0272f85c02a288f4c"; + sha512.doc = "f707d0491bb6a246243035d1cad265787ec4aeb7cbcc73e3500295dc67bf3a3a06b316f9f82d559502b7f108ab636b90fd01c3d1b0ee5f13fa3418910557c8b3"; + license = [ "free" ]; + version = "4.00"; +}; +lshort-vietnamese = { + revision = 55643; + shortdesc = "Vietnamese version of the LaTeX introduction"; + stripPrefix = 0; + sha512.run = "6192e85537e184137189771d2180f1760db5930ad5a8c3dc8788ab5ca502a92b433224b1cc1afcc4e2a493fd17d4e4c43edbc84e4893ecf0770bd07579444eb7"; + sha512.doc = "a0bad6d83fbc288ac1f39bee6bf1cfb3267a47852a0860f56b8251b67b2dbcd526d203c20b91f7adbe42034481255e5e3128b525e49f8cb341f18d9fc2407e14"; + license = [ "lppl13c" ]; + version = "4.00"; +}; +lstaddons = { + revision = 64967; + shortdesc = "Add-on packages for listings: autogobble and line background"; + stripPrefix = 0; + sha512.run = "ad18d38c13dd5076a9213d8a6723b069dd75e546919f106be54a26cd63c3a4186fefdc463e52cd926e85c8020460cde516d12e900c51448440bdc165d4312f19"; + sha512.doc = "38a3b1cdea124cf0cf0951fdcec168b6baa33cec75924687b0a49c1c9713cda847ace0b8bb01ba60fb8945ec2ff421678cd501fa6f5a446ce2ccdd15b2ac34d5"; + sha512.source = "4bcd82c3b8178b1b4ab486fe8e0cb9393ccbca4612bfd7f7507213cedffe8ec92753e16f647eaf28f6a69fc0bdae655228bcae5fe5f1dad2c62c753433142601"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +lstbayes = { + revision = 48160; + shortdesc = "Listings language driver for Bayesian modeling languages"; + stripPrefix = 0; + sha512.run = "8089546f54a849fdd2b8cd1bb2430927a03249f1acb72bd9d37e9ce42770be2413c6ba8186a45eda8f52a3ba2f34e01e6073ed7acce5883d9407e4ccd86cc12e"; + sha512.doc = "9e256d20493164eb1ed01bb6f7dc7f555d9617492fe14688c0852b85e27c1f8f7f1978b1352ea3294bea41f77ce505c6a5bf2910514240e62ce19c47c8da0ee6"; + sha512.source = "9378291c820b65d1f1f126a47d6db40ad757009d71327f84e5b78fc4309d77272231cc892fb6881426130d6571b0e7caca7ee910117a9e2660cef42f6f0d7827"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lstfiracode = { + revision = 49503; + shortdesc = "Use Fira Code font for listings"; + stripPrefix = 0; + sha512.run = "d2752c177194f4926191245f6397ca1ad613e66708e245b29ed6719bfb7438cbbde8dc69a639bdaf7a4447d7737909a5dfdb465a0f0b446c0d30900b7d279c6c"; + sha512.doc = "ab396312abc4174267184dc2d5f4dd61e4510d3b70bcf1b6b84685cbe2e5941d6325d4abeb1d08f85cef62adc953d4a59ebc5d99fe9d7c643f7d25c3d36bfde7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +lt3graph = { + revision = 45913; + shortdesc = "Provide a graph datastructure for experimental LaTeX3"; + stripPrefix = 0; + sha512.run = "9a3137a56952d18f41337f3ea1412180d6a0d7732178fe4855d23647d01648ddefd57859f786534c5bf39cb622da11e113a028135429ca38e6ea3bcfde41b5ca"; + sha512.doc = "efa314f54f3d7444931f4b7410c406fc89c35fc318882683cc97cd479faae00d3aeb58be06c9b174e59bbcc2bae57ff712983ba0c216a270441490866646fcfa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.9"; +}; +lt3luabridge = { + revision = 69867; + shortdesc = "Execute Lua code in any TeX engine that exposes the shell"; + stripPrefix = 0; + sha512.run = "132009434c830ebc5d78978cd1258861c86d53529cd0cfd30e26ed0516767b6dfd7f4a8f9252610394a87a1e42e011499c4f7bcbc7bf6748c9b4ca9eb09b2168"; + sha512.doc = "ff386128898be97c5388c4a3265d7c22c83def095d37aa0c27c167cba95d2e176da519878d53d60b0c7ed60a8b8fe8b5aa987c583dbe87138c54a0533eaeae69"; + sha512.source = "45e1698f7b0cae5dc127d3cada726333878fa39a753c62f6762c5fec55d95d21e4e05fa8fbedeaf7d8861ebe030a6c99ebbf66cf367921a3320443efb0115da5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +lt3rawobjects = { + revision = 66619; + shortdesc = "Objects and proxies in LaTeX3"; + stripPrefix = 0; + sha512.run = "05b70d22b56925542bd3f2ce832b1ed71759cf41f8ccce3d892c5bc6e17fb8ebfe8843a82d0aab6b6e88f38e84819b25bd18344683d182fdcfebcf81a47d27fd"; + sha512.doc = "3aacb576ebf0233692b81daa231ae8a93b392d07a261011e41dd4eac34e295f288f9fe7ca1abc208534393bec1e290362b32ce0906d4c97fe56a598c49e6f135"; + sha512.source = "2e09660f1a59fce87af33d5fd80a59a83ba856233db4032bec88ba8b6f5a8a6306de7416289c51043f8a947dc2481ed90cfecae095425144b865d7a1095cde92"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.3"; +}; +ltablex = { + revision = 34923; + shortdesc = "Table package extensions"; + stripPrefix = 0; + sha512.run = "5a64bd2904338fc45d6150c6be6497d56cf2e190c41018527a59ef075db41f94378f8981d4b92e211f60f2d641408144c546f2de0bbe4a8e94b0a3cadf4311a8"; + sha512.doc = "c3ab3559880077f63523c84cfc5cf363cf9f1d2c4d8aa9cb173b4a2dd07e5afbbdc9b1ea1b29cb50b64c68d65f4470dd9c1656703e0a1ac8955b72b87e33e804"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ltabptch = { + revision = 17533; + shortdesc = "Bug fix for longtable"; + stripPrefix = 0; + sha512.run = "15c839c34935ee27b0b741325a13cbe6ec2f918b007ddd691029ce341173d12ca0e5cdef3a0111c3148257babf686815c5f81c92b6019cbbb022608535f17283"; + sha512.doc = "d85ff06112e540d5bd3cac2bc6100d7d922e44d3388d247e521119ee4145716ef52889515b640e85c8a21405a35fbf63b168af09253e772e826572b0560305ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.74d"; +}; +ltb2bib = { + revision = 43746; + shortdesc = "Converts amsrefs' .ltb bibliographical databases to BibTeX format"; + stripPrefix = 0; + sha512.run = "42e634e7c3018b87825e2bae40513eeb757520e1dba1b1b20244bee2d0fadc4663cbfa0dfdf74fa71f7821f47c41bb7c873a64cc68e153f9b7207f6a8bf3f8a9"; + sha512.doc = "c26b018043c14022acc64bfaff6377988b5e40d09ac10916479079550bdbcfa5219df13988327679e7647c4a679490645376ed23be0601dc4df0528d45725325"; + sha512.source = "0ed23f0084e3afbf51cb6a5c6079db62fd8dca9ef12a159b4be1d68ede6b632155ebc0ee9d6fc91cf93d2cddb5463b5d52b14cb72e7c1d61b975c891f710af3f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +ltxcmds = { + revision = 69032; + shortdesc = "Some LaTeX kernel commands for general use"; + stripPrefix = 0; + sha512.run = "9d9a9835f4547200b160b42c07e918fb8b2cdf9eba91c30647c6fb1c74cb6f9ba60ab40bed63514ecbf334d527148b31fb1ec90af60075d19e28d10d675ded68"; + sha512.doc = "21be07f4f98531621f90b7ed23c06fa4b39fafa12a83c45784b83b5f9728817657b5c2ac2c09e4988ce0c6df0918a7c93d29d7ab89159cca5ce5fc9e0eb017dd"; + sha512.source = "becad978f8b2303a44057f165cdc6d22ddec03e58a26a0d6350bfbaf6d681ba43b105b65492c5be2382ee1e4f814129f86abc2ce376d2d42ddb0fdbdd2671d01"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.26"; +}; +ltxdockit = { + revision = 21869; + shortdesc = "Documentation support"; + stripPrefix = 0; + sha512.run = "1144bd68bec92b4ac9ec8763e2e7df7c6018cd8b88c7ed2f02e7597c3bc13608a562551d80fab2a41b8aa9881848fa1b3501da7ae9c39edaae3720875ff65bd8"; + sha512.doc = "a47852f464e8c31d9a2926e55d62c090292337acad6398568c7082012899045ce32163b798b25ac090e7fbd6ebec95f17a83ee1fdfe5f1f33d0b423dbeed94a1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2d"; +}; +ltxfileinfo = { + revision = 38663; + shortdesc = "Print version information for a LaTeX file"; + sha512.run = "ca078af6b822747e9b337eb5694c1b019444e55f5f9f9dbdf59fa1a65c9445b19a62b0d610514c9231365017d3ea95ad9288a37b62b400c12df74c0c7f774a44"; + sha512.doc = "0020ffc5874e0545c7ae4d1f6f9c0d5d598786444f4e98369e0c5fc872c5d63f235222594a9b0f5d2def5c3dcafc5ad660a4fd5a9e4551dd7717bc6ac06189d5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.04"; +}; +ltxfileinfo.binfiles = [ + "ltxfileinfo" +]; +ltxguidex = { + revision = 50992; + shortdesc = "An extended ltxguide class"; + stripPrefix = 0; + sha512.run = "bb808c7fc1d3fdc7a4d065822a5ff67113bd9fa47a60762b5674040c52149cad14ecd2d0612216b15bcb9684e65e9b51312f83f14030e66de37ee30dabbad434"; + sha512.doc = "534e51a54903e1bbc783b5120015178c48a1a9ff3b06b2121bc9f79c95b7fdc1bc64c374af27a357a44c67df45bb70699d788c150c625d7d949acdce5b109a3a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +ltximg = { + revision = 59335; + shortdesc = "Extract LaTeX environments into separate image files"; + sha512.run = "0c91f46da529823a96ef441ec88d6d3c077a8bd5997bc291f55012e0d227cc24f00081f846ae127a364cba26498a74f2769d401e6d5fe0057afdb2a76a875f4a"; + sha512.doc = "05f9639a0224c779276a3b7f19450c93e255c70680fd54292e1ad41b3c89aa15dc187d58a73475ed9a8f7279faa0f3a0ec15042e75a52c70d78416ec46255b44"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.1"; +}; +ltximg.binfiles = [ + "ltximg" +]; +ltxkeys = { + revision = 28332; + shortdesc = "A robust key parser for LaTeX"; + stripPrefix = 0; + sha512.run = "f99008a8d6d18697d095721dfd741ed2dc48f6edad09b15d39ce2c37f05e6f9c9d613a4ca7ba7fce8755f9dc5659e21f7e7961a7e38dbe17b7114c2337103d8f"; + sha512.doc = "ab28eae4955de3e5a23be1d718fd1e23384ec0e4a8c4b86348bd83ff501ec2e51a3981c60babd478bca0c115ba524367f77f3cabd3f733b82a9fe4cc5fc06878"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.3c"; +}; +ltxmisc = { + revision = 21927; + shortdesc = "Miscellaneous LaTeX packages, etc"; + stripPrefix = 0; + sha512.run = "3433a283f52c41f198b944eaf58a961751e7fd3c0991960a2516fd72af61671e776f48c6a5e241e379b54a08af6fba732ab1c35e42b8c93a62937b5a38cdb767"; + hasRunfiles = true; + license = [ "free" ]; +}; +ltxnew = { + revision = 21586; + shortdesc = "A simple means of creating commands"; + stripPrefix = 0; + sha512.run = "7dda3fd3638ddf528adda0430cbd32cd8fe410a743b7af5bf76e651ee98b10f2481723665a19fda2f2b468ca5c4a838144cbd6e9c457f50362f7b0e83106de26"; + sha512.doc = "91e07169ac377570382b9bc7044c0d66b61268fca38e2fcff4d7075322dbed0d3151976848c93b5d0a2088676e67f3a79d2a555829f170ca61a37b7c40fbdf66"; + sha512.source = "0718785df4355f264738d8929128e4024eae629dcc1fc51e0d408ace6be8688b9281bc0e352e401a6fba71b0a3f376610fdbea7520443233d088e93740e0dbc7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +ltxtools = { + revision = 24897; + shortdesc = "A collection of LaTeX API macros"; + stripPrefix = 0; + sha512.run = "aed74d79bd9da7f7303cd14db5c2a74aab51de03e87a84986b294019a971eb68a445cace8af2394631fc4ec6963ad32347c47a80612f70a7427adeb689d3cf36"; + sha512.doc = "e0a8b28f512a15fec379aeb3350c0611a77652531a66ee5a39010400fe5d1416c40bf6bd89d4e967851b09ad5d11b1d83ead675a0a722255a0e941980d74d1d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.1a"; +}; +lua-alt-getopt = { + revision = 56414; + shortdesc = "Process application arguments the same way as getopt_long"; + stripPrefix = 0; + sha512.run = "60ad4731ac61f9b5c4360bb3d0c6475e2abd358418e20bed29cc94761fdfb97fcf02829b9785e559ca6052a1e82ee7f0b104b166592b9fd87237679ac3caa2e6"; + sha512.doc = "5921a3fd6846b15b0564b9182fdaa5aa62ee6897f3ea55eefbfd07f30f556633668755ee6e356dac23c9b61fd7ecf4013da8f87ebe151a2bd855c36d45f60434"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.7.0"; +}; +lua-check-hyphen = { + revision = 47527; + shortdesc = "Mark hyphenations in a document, for checking"; + stripPrefix = 0; + sha512.run = "89cd0a13578d386bbf584f3c74c6c3ee1a45a7c0bf40480e5396f86b2af29b26abe3ab8aac69be0f1fe23cceb6da33237ea38384854fdfc7be6939832a8cad08"; + sha512.doc = "cd756e0356b36ccd26d1d78c67026f5a27272ac383bdfc6f44ddb630f58d067c05fb9152f1ed9793d71a63af6607107b8d4b5af311563e2c3d966079b2d3e0c1"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.7a"; +}; +lua-physical = { + revision = 59138; + shortdesc = "Functions and objects for the computation of physical quantities"; + stripPrefix = 0; + sha512.run = "b28768f63c2b34930a073139be3e6e90a0086a561bdcdb6aa6c8111db4e6def819c0a3a6af2b5b274d009d3c9b390c6da91416189718a67a4e1efd7eb547c500"; + sha512.doc = "52e764b0492aeb423d8c267f43436821a239e9ad019e43f7fcb881fbec31f9a56b690d792f15f954cec91ba7e3d32f70cb567994a82f3030870b44d0490fb593"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.5"; +}; +lua-placeholders = { + revision = 70055; + shortdesc = "Specifying placeholders for demonstration purposes"; + stripPrefix = 0; + sha512.run = "480d898d4c0e03776fbbb45243cf813a1a7d87b041b70566d74a1b89601602b8b3890f6d0395bead0cc6e9a876f5e154883035e1318ed0781302c2aabdc4a1b7"; + sha512.doc = "13fd2c68dbe7f3672dd6e4d560db81f4b1583cad137ff6b38b82f73ec4e8d20c5b1ca87d10d05b9566805a4f06aa97725d0aa12d5838e4ca146890c824eb57d6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +lua-tinyyaml = { + revision = 66776; + shortdesc = "A tiny YAML (subset) parser for pure Lua"; + stripPrefix = 0; + sha512.run = "3144093c160dd1bbfcef7c0d56a3ff2a6354ed2c5ad30a4201706dea66fb8cb19b4be71087c078c4e36d163e6a785827c378303bfd700c086a7ea6b9d7eb2135"; + sha512.doc = "1b0932800ff6fbad87c2a87e68e433d46de5a0c2543c8fb0c7b7b6f60749db98d9863ad4debdcd508bf1a613d32c8a8fa5d7e23f177517e4f7735f2c3b63c616"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4.3"; +}; +lua-typo = { + revision = 69403; + shortdesc = "Highlighting typographical flaws with LuaLaTeX"; + stripPrefix = 0; + sha512.run = "177b89a930ed061d18e25bafc230b402976e25ebc88d09a0a42c70b5848fdf5b7964fa69160c3456a02f207dce39363c9fbf603c928cd50b373be6ba8a2c8ab3"; + sha512.doc = "60a9e3560c35583377d4629ee4885ad5e8bf52773927c9d3e2b06a2385196303df704bbcc6245a2e0fc93c396b4a6252309180af270d9bd13fada543c9f3b7b1"; + sha512.source = "65eac5cf5c4af2eebbc7d6412cf6ba17a4de37c6c47caf7667e047edc6697a0e93f9f3a334f3ace081127654b6337ebbe5db767d1de2eb48a275c22c0617ca08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.86"; +}; +lua-uca = { + revision = 61023; + shortdesc = "Unicode Collation Algorithm library for Lua"; + stripPrefix = 0; + sha512.run = "e6c703b5576c7d66372a3989618609f2fe4a2b41de78c624e15bd0905744559b2adb3f70536b9680f83897a3997a492a558e285818d38b63ee7e99798bf376c0"; + sha512.doc = "a842063786a53c558bcd4bead5b6affbe9e448618d421435f49722e0a55087c28b36bc9d6bbcb874c3c794a9f5b303c62429b4386801e03f78e2f60c83cb1d1d"; + sha512.source = "7bea2f473bf12fccdc21534653f6237ea3b71c57bdaf651b8f543c5447ba25b3ae3bf735c3a0e7840b31907b777aa87215b358d152c1ba29c0e372a2672b0e44"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1b"; +}; +lua-ul = { + revision = 70206; + shortdesc = "Underlining for LuaLaTeX"; + stripPrefix = 0; + sha512.run = "158abe2f05bc7e00e6b7876023a0763e4a4f4178b5816fc4c5509342cb0b5db0a96fe16083b10f9150e1a7f089a64ade43fe1059a5c970b484d6b0e58adc1691"; + sha512.doc = "3c5c4cac2c17c2eb31af2602b73d3be28928ce72e84b1b84fdb5165463d9f563b20a741a1934f9587e2235ba2f4755cee4767b32fb02b09631cc2afd6af622dc"; + sha512.source = "0e2b2664b7f5fc711ee8213cf5790dd0bed5c9961af0f7abc2bd32c331e3d852cb80fcc350e8d9ff5878ab299063a96774f175c7ff24eef65636713bf240902d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.1"; +}; +lua-uni-algos = { + revision = 62204; + shortdesc = "Unicode algorithms for LuaTeX"; + stripPrefix = 0; + sha512.run = "01307963a88c4507a7864272f321580898e107601fc3784ef46122dd3361f4a272285836e186df8a5454a9825c608071caf79976323e84102eae6f59296f3a9f"; + sha512.doc = "5f667cebc56682225d8a68668bf7e02545e6239b6fba3f8f6ab49bc34d50d537d39484b060d8239631bc4a0de42b63824af04e5e3cc33c528c0925de8419b5c5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.1"; +}; +lua-visual-debug = { + revision = 65464; + shortdesc = "Visual debugging with LuaLaTeX"; + stripPrefix = 0; + sha512.run = "4d75ff11873d88b0914545e2233b7f49e6caca18a73aa71b74844ff516e41399c99c1fbb7f3bfcf420bcdb91bdfd10e42f4e8f7bfee05af284cea78e25718343"; + sha512.doc = "99736a1b08c2eba032d749686d30df9384fec22ae65878162436105ff9edc4c781bee5d6407612edb53edad73cf38aa84c870c612663c5b8e2262b191c526f76"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.9"; +}; +lua-widow-control = { + revision = 70602; + shortdesc = "Automatically remove widows and orphans from any document"; + stripPrefix = 0; + sha512.run = "1e489f819959a321b0baf60420dc25a217b0ed380067bc440307e500295b059f450c961072c001708affec4ad353477627095e71b75ff961f69c7d1f00fd8953"; + sha512.doc = "dc01e75eccbd0650ee0126348ba38c25fbe0a303a8317f7255c7f6efdeff66cc1603fa181bccf4371b0f4c56fa664d2ea99822914c1db9bf6e282f74c4c79f5d"; + sha512.source = "3add66b2dc968e7ce1b56ea4efced89e04f388b7f37f8be8d8d935df42c60fbceddbca6142a168f2a83493ed1fac3617971b7e342d9cf29f793a12ba429e5ab1"; + hasRunfiles = true; + license = [ "free" "cc-by-sa-40" ]; + version = "3.0.1"; +}; +luaaddplot = { + revision = 62842; + shortdesc = "An extension to pgfplots' \addplot macro"; + stripPrefix = 0; + sha512.run = "8834dcf95f0cd2260423ef2a65599c0ebd948c67b61b97ebca8fefd36134d995630238b6ca01b5b9aa8b6fe50bd10b0cd49a350b3e2c3dfcfea00cac56a777eb"; + sha512.doc = "166ad5662521aaa4808ad1031ec922609f7a5049d9d219dbcb41ea4c7f777776794b34e356564cbf03628e6065e1eb4354366e3bc2c2bcae2b6e83344f6f810f"; + sha512.source = "11f90c6f468fd67f58bc7ed6d468873d9c12989b5a4d86563f35ffb9b62219def0d2cc36d45362cbb2fd957928b673b93e52437d26ef3e69ef7edba0b4645009"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +luabibentry = { + revision = 55777; + shortdesc = "Repeat BibTeX entries in a LuaLaTeX document body"; + stripPrefix = 0; + sha512.run = "ea46242da727c40f24fa232e1cd1db4bdaa7391aa372ae7dcb0210e2755fdfa2155de5c80a61b0c4554ab1c23a14bf286d00f07b34aef5edf416ac6b06f031ac"; + sha512.doc = "9b4954e294173699cef6ba965948bbc2518d42158c3f80cfa5bec17c5e58166240f8c8d3864f5dda94ae325aef688db7003138ccdf3d6eb249b544baa72ec13e"; + sha512.source = "d43a9d2024e5293966335df592451e3bd44e3f3522a06163c93da3d242b3e70377dda3612333a64e57d9db8ae8052753cebe9a73e01125b41e495c7a0f3a7592"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1a"; +}; +luabidi = { + revision = 68432; + shortdesc = "Bidi functions for LuaTeX"; + stripPrefix = 0; + sha512.run = "10a304c8844ad7b8f5e1832d59e678599f503c1eda38e1a1e29438abf6304fc44d8d4235e1308d661fa0879494c1779b7110853305b645ff1d2d35cf575bf07f"; + sha512.doc = "8276f91aa767b9c066bf6271f57a929aa21c7ff19a49db5db2e4eb68bae7613a13473cc23b7f5e60232148b46ff33bb86366320d730ba67918e2b009e5f22463"; + hasRunfiles = true; + license = [ "lppl13c" "mit" ]; + version = "0.6"; +}; +luacas = { + revision = 67247; + shortdesc = "A computer algebra system for users of LuaLaTeX"; + stripPrefix = 0; + sha512.run = "21a488b33ef09db0e0fc2c479564cb15f1f2afb4c790ed8e64baa9b10ec1ad3a36486261218959f8c7951bc06d234f0516bed5d31201adc8d573c7490658764b"; + sha512.doc = "45f583d602c6afd13cd32d4049d4305d23ff8b47866a9d95b873e7533d3a46d2e357afda82819dedd450e95e3300aa34a4abfece9e0b90c22d6b2c3dc8cdc701"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +luacensor = { + revision = 62167; + shortdesc = "Securely redact sensitive information using Lua"; + stripPrefix = 0; + sha512.run = "6dbcc3a2870106eb49955b6e67fd621019fcd759b9d68d37e86af9d4121231e50ecaab7abe7fdc7720021575b8f6a28f28c4a11edc72f6ea71f7cba2b76909c6"; + sha512.doc = "95cf6068dd5812806f3a7fb40349f8adab9099c453459789937c68d49e8238016575148254b436724b7764a0eee7caac2459b96ab214746d3c12ba1d268cef45"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +luacode = { + revision = 25193; + shortdesc = "Helper for executing lua code from within TeX"; + stripPrefix = 0; + sha512.run = "b107c9cf774608782c1ba1ce3ebea8d330ff9762046eaa9b9de112b704df1d0da1bd7e33b15e9d847f232b7594d53fb2678cdb78b23d87aaac73cc2517ac8e1e"; + sha512.doc = "622a2417490fb818d5021bb519ea7ac8d886df5002534c4d269268ca4d2119ccc15b029111edb42d04a546e7a46a60bc8eaa6a0a108e9231cc49fc2141ed8ec7"; + sha512.source = "fe53aa46157e24f7f637584faa0c18de62ce3857d9841598f51e09a03354e9cd44bb8fc150e91d5b9ad6d1ca150a065fb1507847cc385ca67bf67679669d7ef0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +luacolor = { + revision = 67987; + shortdesc = "Color support based on LuaTeX's node attributes"; + stripPrefix = 0; + sha512.run = "142376345f25de68236e56fd334d8f24af90f510abc0d2314049bb03142df76988cd5451e22cf98df4443348f7686bbf9c269e311d5036cf8ae621200ae585ba"; + sha512.doc = "d6654c3ac1ca1c18cc60cea463cc3b4b4ed902ba6c29521883079123b9906f089ed25e2268e7a1f92800d9b1158225b50c0b019ea28c68b846e73bcb350dee6a"; + sha512.source = "8b29907f0e0d865704e5de710ac2dd37607330d66a4282ff1f4673306be40ce366a0c2eccdf4dd25c3592e804cd6fa1e2a35044c494c4a3c73e64bd0c264d102"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.18"; +}; +luacomplex = { + revision = 68883; + shortdesc = "Operations on complex numbers inside LaTeX documents using Lua"; + stripPrefix = 0; + sha512.run = "dcbb87d1c5776f20aeebf0748d348ab748e98fdc95427404f252f55fd1df9dc607aace2f6b4bfa086016eec7c4bae295979773d3a70d20a9e32da47974911949"; + sha512.doc = "a892f4360b52ab22dcb282c5bd6e538af83836d40e7467453ad345e2d272363efdef83b29b76864dbccaba1ad3589f2a3a47d20415842f727212d3923191b052"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +luafindfont = { + revision = 67468; + shortdesc = "Search fonts in the LuaTeX font database"; + sha512.run = "0d02fd925b33616d3f23df0609ea6fc1595b830cff8a712f6f93414cf80b51b2b1dde2b29e71084aad89377084b606ee7eeebcc2b5e8342b74fab23d8c97aa82"; + sha512.doc = "fd16f72bba665cffaad3102d6573117300c7df4ea7b4a3104be3de7c26c9f127fccdb54e373cf47220df2652fd405c6dd3f956d2278ec9339e70ea390333af75"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "0.13"; +}; +luafindfont.binfiles = [ + "luafindfont" +]; +luagcd = { + revision = 68893; + shortdesc = "Computation of gcd of integers inside LaTeX using Lua"; + stripPrefix = 0; + sha512.run = "d9b770680bc147b45c3bcd984f58335d4e4d53f97ffecf85eb1c017a1c61ef6ddc06ae3230740769e199dcf674aeb92b5ebc10cb29863bcc4f67caaf9a41d15d"; + sha512.doc = "98905c9e829d1d96a44b25236a1181d5b96b75ca8a05293b185b9f372067cbf35d3db2d0e3343aacfdf840981bcd2af19e089b4a1ca7ae79a7a52b70c6828862"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +luahbtex = { + revision = 66186; + shortdesc = "LuaTeX with HarfBuzz library for glyph shaping"; + deps = [ + "cm" + "etex" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "luatex" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "luahbtex"; + engine = "luahbtex"; + patterns = [ "language.def" "language.dat.lua" ]; + options = "luatex.ini"; + fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ]; + } + ]; + sha512.run = "30b1fcd361cff27688c65ecffbcffc65053696200abfccd543a14253b53a35de2af53b37f7ed1580510a8c63293d2d002cf4d9fd2d44f86678e2ecb09f02e4b8"; + sha512.doc = "3016c12de8386af715932819701a6da1b106c504a7d13ba9bb5a04999737709f474b50c08311c1d4c23b5532ba7c1546cb0585e5375babbcd2091adf52d05664"; + hasManpages = true; +}; +luahbtex.binfiles = [ + "luahbtex" +]; +luahttp = { + revision = 67348; + shortdesc = "Compile-time internet-interactive PDF-documents using Lua and LuaTeX"; + stripPrefix = 0; + sha512.run = "ec1ce2020efcfa3288c70d79756fd221a2cbcfc873b4f7f77d23bb18ce16764873c30a6d24a36dfd86af5ffbd8563c0c9e863cbeb78b8487725fac7f6c153bc9"; + sha512.doc = "cd4f2a818a31b8f9df2dd83590d8cbcb01cb6b06309a7a001711f990250d31232680ef2f10b252704eab611cc20c78cca51331db00f17eabad40ea88a8d2860c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +luahyphenrules = { + revision = 56200; + shortdesc = "Loading patterns in LuaLaTeX with language.dat"; + stripPrefix = 0; + sha512.run = "01025f1aa9abf7fb0c06045e8bebba3572b1aad06bb6edafd916e721c8ecb295fc680bc4da968e4fb059173ed9ba8e8de72ed42923b458a8dc42de4424b6ef9c"; + sha512.doc = "1487269c78bdef7aa626bee1c339358aea03af7df17cf92d48e56a1530b5e4bb7a5dd56fd7e094512fc3c149343e35e9e1683ffcdb8634042f26e86083f3ca69"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +luaimageembed = { + revision = 50788; + shortdesc = "Embed images as base64-encoded strings"; + stripPrefix = 0; + sha512.run = "c0ba8a3164f1a87cd12a5699e9caa23ff7a85debed9881798502436bbb594d48a2e15a135e3a18efb9f3d825af98303a46495148142c810e4601641fdf925654"; + sha512.doc = "188049c30c2c845d18e1a20af3d5ee009eab6064321b1f09aee4b77c3111317755e698e28876561440695c910cbfea6f67e41a5195a5f7b50d45831d7b78d76b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1"; +}; +luaindex = { + revision = 25882; + shortdesc = "Create index using LuaLaTeX"; + stripPrefix = 0; + sha512.run = "baafe2dbcfcc07293ec04f775becef7b59a2349ed5c98333c5a4e680fb3f8561f8749a6abadc6901cfbeae1b6e9a47cca05e8ae76064372585b7d7f4978dc844"; + sha512.doc = "c90deae24da8584170bc2247d5f6ee22ba522c21d3d0e05a6ec2b9594645a022eed1fcf12c3ffbaa03ce0d92a16f75550dc7e0694920ef58b17bdacae02d6fc7"; + sha512.source = "aa97d6618e7af11a7d5aaee332736aa60a8ba5a2cf796296368736c7d12b1e6eeccbd5c807cc2129fd3e4310617dd92e14aeac053753fe7267899b9b3459d8db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1b"; +}; +luainputenc = { + revision = 20491; + shortdesc = "Replacing inputenc for use in LuaTeX"; + stripPrefix = 0; + sha512.run = "bc3f05260800cc537436377c1f9fbcfc6a1a60a7fd892af23ab323171208b083c08c8bb2a5d299e4ce09468f66197d43f68717a57e649c50caf74b736cdb06db"; + sha512.doc = "7c6093b3fa622007aa7e6cc852076090e1bcc64e9b890d1ff0cf6ae552a21e930e791d32cdc2238a0f60c605c92a2192dad7e9d423a2d6e013582926957da58f"; + sha512.source = "a9ae3dcacf7ed85f5ff63e32c9fd66ad6860e149c3d2737bcfad870137b242797b8a3f62e90f290931e6884c74f70a0716c72f2e5414cb8406e5ec0141f13831"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.973"; +}; +luajittex = { + revision = 66186; + shortdesc = "LuaTeX with just-in-time (jit) compiler, with and without HarfBuzz"; + deps = [ + "cm" + "etex" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "luatex" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "luajithbtex"; + engine = "luajithbtex"; + options = "luatex.ini"; + patterns = [ "language.def" "language.dat.lua" ]; + fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ]; + } + { + name = "luajittex"; + engine = "luajittex"; + options = "luatex.ini"; + patterns = [ "language.def" "language.dat.lua" ]; + fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ]; + } + ]; + sha512.run = "21313a5786f2bea08ce55db3a7beedabaf66f3331bd0eac1f8f3d7b926f68e103b14b1a5beaa271c37b60fc56735cc180e424f91db62f6e740530a65495d8e82"; + sha512.doc = "7637835fae934f4fb1aea954270281a986733d0e0592204346edc290f2cd7d5200ee2fa0d9e15a27be8221c3c990a8c3d4654e314f96441a65c197d3bd259129"; + hasManpages = true; +}; +luajittex.binfiles = [ + "luajithbtex" + "luajittex" + "texluajit" + "texluajitc" +]; +luakeys = { + revision = 65533; + shortdesc = "A Lua module for parsing key-value options"; + stripPrefix = 0; + sha512.run = "618719877ab11bb672c319bcc078a625bc92b4d3a783eff8414f6c9597ec8ea3225822afbeb0d1bb04e8889cc3003f4a1ed8063e1ecca410ec6f0170fa55eb00"; + sha512.doc = "be88aac81b85730c0cd85ab76541b8af01ca85326a4449168062ff80690db7d90669dff794b3f5926f1344a0de03289958fd4d2cf0cd2eb4b593dd052577e01c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13.0"; +}; +lualatex-doc-de = { + revision = 30474; + shortdesc = "Guide to LuaLaTeX (German translation)"; + stripPrefix = 0; + sha512.run = "c1bf1c7f367e5d15cb1a5ba0878a4f02dfe25772bed22b48f7376e8448569247233ee41ee8b58c156494d9cf0c0956dc23f4576f053cc349896247de0a96444b"; + sha512.doc = "b615887d8b543af1c125b6e9fb9c533f52816f8087075a8bd4e6ef752ff48f51169f5945ccb067228612cbdeb10dbeb298a090bdb93d201b9629b128b0c5a466"; + license = [ "fdl13Only" ]; + version = "1.0"; +}; +lualatex-math = { + revision = 61464; + shortdesc = "Fixes for mathematics-related LuaLaTeX issues"; + stripPrefix = 0; + deps = [ + "etoolbox" + "filehook" + ]; + sha512.run = "16c945e72165acd9f4bcf20f81e6c5df9ec22f19d45cbb8f076763d2d1a1a2e230938dabbadfcc065e3a060487885ac2edb223aae22d12f6981f5fca5c0f951f"; + sha512.doc = "f5a8db238ae096b7b1a2eaa84643f063cd28e08b328cbcc780171a60c571e858a1cd1941a8ea9053392a8c65b965a81c8cd585ce2accb27e797e3e4e8ad3a127"; + sha512.source = "e04a36a2280fbccb9572539ebc9bafba4edb7ccada25c4b3faadaa61c2f4458d9e9a90e54fa00b5ba675e59f42ed2d076b39918e5c126e2f619f2f69ff904d81"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +lualatex-truncate = { + revision = 67201; + shortdesc = "A wrapper for using the truncate package with LuaLaTeX"; + stripPrefix = 0; + sha512.run = "e896a6e065b5dcc49c24f8492f640f5ebc06c4f1ac8bbb57e8f76768ec20b14a016f2f801a5c5c855d03f72808b5844011aef7ac377a38a388cd843120b4edc7"; + sha512.doc = "242cabec009e94adb1582874f959b10871531b433679c2f66ba9f82af02150d78b8acb8b486a182c5e41f2d0b7fee9a7294ab2d8977c9a6f0c021fde8678a4a8"; + sha512.source = "fbe5c95820b8f94773f8f7e33b554e05a5d8ab2178472a6a6c27a24e08dc7dceb3bc1483999b3b13db389b46ba6f5be1532927adfd1623f0ec003da2a96e5793"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +lualibs = { + revision = 67994; + shortdesc = "Additional Lua functions for LuaTeX macro programmers"; + stripPrefix = 0; + sha512.run = "4387311fb78a29d63959114e401a2b97a8743a50c76a22163e0d14f15cd7b51a50f4be7a19232b32fa4152eac71c73fbeebcb8e38fee3bfc997aaea37bef78bf"; + sha512.doc = "a4c878209934b2b044688dc77b4b467ae4e106adfb5f728f398d7adaa279ba612883ae22f30e667a79a22d633a507b689525356ff24daf12c50bc84dfa798ca5"; + sha512.source = "98fb3af23ec41561f0ffb12461ec2977472f4182b49a37c0365c16bc3d52ce61c382e6ca172ef92638cc0496d5e3073e4c96b13acf390e783f1bf46d34226d2d"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.76"; +}; +lualinalg = { + revision = 68918; + shortdesc = "A linear algebra package for LuaLaTeX"; + stripPrefix = 0; + sha512.run = "91c466d51adeee70e9504deb30a623c41d4fd6b461e76f4a6dba2529ffb3e879ac9bd706845b00354418d6a600b3c774029000b3495ebb4711b152e274b87d0a"; + sha512.doc = "21d4a285713b962e17ae2f83be803abb77813bb6fceb085787fba35f2a1956b88cb199e057c1f49d15ded68c3fa186a5af0dc5bb1ba99db07dc557c3a2da1a44"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +luamathalign = { + revision = 63226; + shortdesc = "More flexible alignment in amsmath environments"; + stripPrefix = 0; + sha512.run = "61a2960d103cad9cd9776de0c08b8d2167f6272484da2a7ee067951f7bcbeaa683e046a053c1f4d35ab83c8d70fb96e9b7b55566852d2262162b90c1a63f0b80"; + sha512.doc = "96a1fd4016b189d31c966faeba0942d4b3bf24208ebc6c03281336af6d86504f552f0bb705a30e6ff108ff692de969900a229b061f7bc91c6cbae68fa42e8143"; + sha512.source = "7f4c636a013d6fe8f0771ff3d3234cc2b5f098d0369d9ca73f3aea29dd47e609ce56ba20cec0dbeb782988200b8fffbf62c1957055d074d21b98051d8c155ea1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +luamaths = { + revision = 68883; + shortdesc = "Provide standard mathematical operations inside LaTeX documents using Lua"; + stripPrefix = 0; + sha512.run = "1c5a53bd44f062a4531bf4099c0dc1e76a47f5475901bac7f1fccea0005f9704df257044b76063d51158beb0d66d18e41ed6a4873388f0e531b1ff21ee1042e7"; + sha512.doc = "0846e5ece550ec73aa65b07993faab7151efb100f6e5cbba8a4e73b595b012f031435ecae7d1100690395bc973fc82b617a0463bd3388e38081ad32b8d16d78c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +luamesh = { + revision = 63875; + shortdesc = "Computes and draws 2D Delaunay triangulation"; + stripPrefix = 0; + sha512.run = "e30e6f2bef6958c2f76df6aae5ca5899b91f41fc35afdce24840e2d028222c31a0613ba3c7eef27629686137f15eac24d3b97b7e0fc33b5d91adb7b766c0279a"; + sha512.doc = "286dc5fb713f06fccf7195f317791a8c775ddcaeb8cea4004fb7a77882bec36c60679ed9ef725128ff354c7230becdcc623683fb78eac9b24cf044f9cc97af1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +luamodulartables = { + revision = 68893; + shortdesc = "Generate modular addition and multiplication tables"; + stripPrefix = 0; + sha512.run = "0b390717c538a8c44cc7e8214908149c3705d5cb453d7776015eed27638ed0c0d16ea0b5be5abf2b6bec6e410b849f35796f574923303ebc883c75f7221f7634"; + sha512.doc = "dba85f4e58f7a7d8f1f81d0051a0305cdf51e7bd1ad4220cebed513871c6a3d816d9a6048cdce352f48527da2b04700b94210eedce5104af289dd0508fc72f63"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +luamplib = { + revision = 70583; + shortdesc = "Use LuaTeX's built-in MetaPost interpreter"; + stripPrefix = 0; + sha512.run = "97551597042f2b609abfb7c275e3f371a57aa6948b4085017926ff8a8adba02ee68dcbc84d3cfcf4eb3ccb93ff1c61157c9dab2e2b3bc945707ce106e17d169b"; + sha512.doc = "6c366637d27c498cedbeb6222ea8b48a807ce806bcee89cbbba7f7fb5d6b3bacc7fa4ffb3c1288a02b803bfd7b96725b12fd46eb2e9ec965e2b69f057b1c2c03"; + sha512.source = "546d9403d20ed58a470b9e2fbd5b34c1863c4ef69e90156a6c0071f09ff425f6bbd9d39813b870f55997cafa520caa9326b79e31708630f9b3a44b0b0ceddc3d"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.26.4"; +}; +luanumint = { + revision = 68918; + shortdesc = "Numerical integration using Lua inside LaTeX documents"; + stripPrefix = 0; + sha512.run = "f34fdf0308fe4c9aa36d59e11862958ee1824761e5aa8ee62e6df81b335ec8dacb203a64ce5e26395ab612583126093dcddbc42dbeb927c90bd3bec73c1b5485"; + sha512.doc = "e8718322381688bc306871de22d585ad50128f45d25ec6864034a42cc661e78c510dbfffee46ab5a6da0e3018f1cf3d35974d9e4cf27e4208e9a8186aa03e656"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +luaoptions = { + revision = 64870; + shortdesc = "Option handling for LuaLaTeX packages"; + stripPrefix = 0; + sha512.run = "0169029e4eefcb746f48b266d590c7d9f3d4d376070c762139accf27adb8e48badce38769d22250519b3482b4752c55f66a165f4a6c59b20c3048738dcd65a72"; + sha512.doc = "8731eb75ed8dd7089a6825350c2cf335049ce80c1ff378ec26dfe32423e4278737abadf7c83bc100837b2676866d38fdff50024845dc78c1625e64f8748e140a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.8"; +}; +luaotfload = { + revision = 70234; + shortdesc = "OpenType 'loader' for Plain TeX and LaTeX"; + deps = [ + "lm" + "lua-alt-getopt" + "lua-uni-algos" + "lualibs" + ]; + sha512.run = "3882508595c12b7eedd7bd657e28e33d1d1ffc546ba6b281e6e212b1f9492a124e06b0d27da28b5ddaaff05728b231fe044be581bf001ed1441fedc284b2f436"; + sha512.doc = "bcb4147d4713fcbc28094209d9234aa95e5bceaae53acb97674cc4a458daa8ed3db4685a8d2dcf7da29218e06daaa4a727c3ed2c9c5d991904054fbd1a023459"; + hasManpages = true; + sha512.source = "5ff132658ec2fab529595dc150674f19fcb266f87b6f294f42de04c4aa2c067091cec7a416c201b5970e56dfa3adb6772ed4276370aef7bd97eb6bf661bf2e8a"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl2Only" ]; + version = "3.28"; +}; +luaotfload.binfiles = [ + "luaotfload-tool" +]; +luapackageloader = { + revision = 54779; + shortdesc = "Allow LuaTeX to load external Lua packages"; + stripPrefix = 0; + deps = [ + "iftex" + ]; + sha512.run = "7f2558dc265746f143520c2c6f3bf2ed05ac8c54988e573519321a7fb5a2a991220d0eb8906893f77964dc01f0e3f16b783dcd20f809042a11d29cd137f557fd"; + sha512.doc = "64719d715fc98bc09ab17db5f2053ea3e34d703adda6677f50ffe178a974230e8a03a9019b995238d073580e1faa745e655a7207468965ccb9f67bfccb5b5a49"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +luaplot = { + revision = 68918; + shortdesc = "Plotting graphs using Lua"; + stripPrefix = 0; + sha512.run = "99bb803fa2eb46b33e2f3d7bfb1b307dd268df91d392f8fe7bce5e45db65fb8b1de66d8d62f0bb2912fbb5521a73ea60b6627fee3fad23262fb92485a7858c80"; + sha512.doc = "b34d3b67d1603fbb940856d9da2eb4ee57afd87923c2a1c4541d5d9325cfd597bb47b2ecdc829b2ce4eb3bfb35eb9b968e0cdba2cb9d557d12ccbca959506f53"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +luaprogtable = { + revision = 56113; + shortdesc = "Programmable table interface for LuaLaTeX"; + stripPrefix = 0; + sha512.run = "68ed668fcc84eddad444edfdd18ede2c94ad81fd61162d62c5a052fabcda6e5bcb519d6eb473721fc2cc090bb7f642dd55ac35b9f1f0a682b2fb8c480a0a1014"; + sha512.doc = "d91bb2fdf9851b1aeb3dba0b5eeb75bd1f9aa8c806fc3a99e063af7f56e0878152630aa18731c1c40aa00de72a0d192981a272d586fb25f7a19d14b4fc25b5e6"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +luapstricks = { + revision = 67207; + shortdesc = "A PSTricks backend for LuaLaTeX"; + stripPrefix = 0; + sha512.run = "742b75749754c3370c64c50bc8138474f0181b4777875227cccf749851aa0d42cb490cddbd72a9624b931fe99f02e2727fea4e54d36b1d46cb084c666dca445e"; + sha512.doc = "634cd9587c4fd9c6fc558bf9369b191e0901b58d75d871815592f3e6959bb103d32026cd9ed48ce448a497833c30916d39b92cbb85c6544b41b7341277dc6820"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10"; +}; +luaquotes = { + revision = 65652; + shortdesc = "Smart setting of quotation marks"; + stripPrefix = 0; + sha512.run = "20c0c02ec0a89e37d82d6ba10cdd9fce632189c442950f325ebc09f5cc2a1e798238ac9d3e31245e113d4909dd0b37e3a145b471f7facacb285a2a2450bc8998"; + sha512.doc = "3a9b36054a67ff69ed8dcba75a6d5bb5bd4783ec301e59f491b82954184ff7793e68120762ec95182d6dd00afa1fd4421d2f87fc8294ac39061c88f50c37d803"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-30" ]; + version = "1.4.0"; +}; +luarandom = { + revision = 68847; + shortdesc = "Create lists of random numbers"; + stripPrefix = 0; + sha512.run = "1b5f4f420fe5acd552e7ff34459184319337a586b19f3b53111940fa648b09924f03ce7ce4da7463cbc894e65ef87647ada660922ab252b560dfe99295255097"; + sha512.doc = "4be8b8d72bdd6d4eb33999d662e06a60c8971d5a990b649e37c990dcc6f708856ee61a59ad1dddb6c083eab09e809ddfb65a1730a8e76bb6aadb1a240c809a26"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +luaset = { + revision = 68883; + shortdesc = "Set Operations inside LaTeX documents using Lua"; + stripPrefix = 0; + sha512.run = "97617f8c763ec968750949f5050ae8682b179caf6433ca036c820017c4ef73aad3f96a1f8071be490c029db25afc6b85c45310ffbddcf3c8ed7b4b5547cc6e58"; + sha512.doc = "546beb759fe4f6e6a6a9814eb46935a3d1245bc2a48878c8391738e92e79c7df2148e564b2eff0cdc60281b6f071d8fad2edbf171d7c1130b1068aad11aa5a19"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +luasseq = { + revision = 65511; + shortdesc = "Drawing spectral sequences in LuaLaTeX"; + stripPrefix = 0; + sha512.run = "b77936a1b92ec8b3889ec9ba8b356fa235da6eeca98d6a86f315723c64b4c0a7d8db2213cd9fdad4d2b38cfa8af1bc00c7861f15a9f4f1a809ec86bab8a16f77"; + sha512.doc = "82825043ea6c04a76cbf0440d9de08ee281b843342c6385f11cccf06bd11320138119fb90944f6f3fc5aa8ff9854f1934f7890809f0a8175de389ef5cd448cab"; + sha512.source = "3a6b4fa48956e2f448a1be96eb9d05f236c9e1b2177de13ad16aa942c9b4ef5d4d4585bdb6f5d9b1a19901375f34cbd381430c629e037be500d84cf626065500"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +luatex = { + revision = 69182; + shortdesc = "The LuaTeX engine"; + deps = [ + "cm" + "etex" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "dviluatex"; + engine = "luatex"; + options = "dviluatex.ini"; + patterns = [ "language.def" "language.dat.lua" ]; + fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" ]; + } + { + name = "luatex"; + engine = "luatex"; + options = "luatex.ini"; + patterns = [ "language.def" "language.dat.lua" ]; + fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" ]; + } + ]; + sha512.run = "5ddb75ca2e358bea261363cc19d39a37a9e467f9cbf4f8006f036a96fea61cb00f86c4000c09d7dd07f71f9b9a01ec165ddefb862aa84f0bc3da6a387ca1f42b"; + sha512.doc = "36a5dfb6b7ca09adad807d2fa74df854363107eb3fb514977e3ed8c69eeb1181a19a55a49eb8c001a3532601c0a222a3ae9d130827caa19864df03705af7271c"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Plus" ]; +}; +luatex.binfiles = [ + "dviluatex" + "luatex" + "texlua" + "texluac" +]; +luatex85 = { + revision = 41456; + shortdesc = "pdfTeX aliases for LuaTeX"; + stripPrefix = 0; + sha512.run = "fbc1306d40e1c329a106d7ec4ef79ebb99b2869ce72c45212b87fa03f66a18b1636324dafc739a33500be77bee2c71ebeff02c97c42f85716f5bded4dcebc021"; + sha512.doc = "4bf353f60c305ea76e66848920e521dec0c66c80f71ebdfb0593acfc9e2914eac272eba3d69f63f43fe8be903cfbb2da7edd82cbc3d38a897934d91f1ac276b7"; + sha512.source = "40f2732ba0eea372d084c7a9096e12de76a6f7c4ee2c8c9c042ae51696ca46fb527aa73dfb37b7c6a1a75f9753ed32b28fb9d3f2474cfd54528336b4a3cc95e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +luatexbase = { + revision = 52663; + shortdesc = "Basic resource management for LuaTeX code"; + stripPrefix = 0; + deps = [ + "ctablestack" + ]; + sha512.run = "cb187dcd0f9e454a3b9d021b802ac6f7d09c3eee68adb5da31035f5b7bb36d2938ca940505ee08c8410ee0e5e5c81ffdd21617ea5ba0e9ca7b58abb6ede3defb"; + sha512.doc = "5dc696009e84662fc56443d7a5d61b3f30adbfeae3cf7176e81e676087d0fe580cb0575add49999ea8d5651850b7562c775b0727de01934465f3613ab7344be3"; + sha512.source = "ebb46d5d4c3f6ccfdbc758f9dab64d7e83c2fe988f7da6852dfd5e786bc757f2438f86010a695eb2e780a02830f15dea941de7fb5bdd6e6561df0774b476dd5a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +luatexja = { + revision = 69988; + shortdesc = "Typeset Japanese with Lua(La)TeX"; + stripPrefix = 0; + deps = [ + "luatexbase" + ]; + sha512.run = "07d0f7ff77fd6f59561c176e6fc25d4b1d4860696aa728c0f9586921f1f32c5a3e01a2f463d5ad3830648fb19ebf6899857259cfa042263f3f17a66b1ec6e0de"; + sha512.doc = "bf01874cca52c561a4ce76d7111596b5a0a20dc0c6f7c383f8bbc9149f4fbe31aaf652d4902ab0b8d10f4719811fd16b9e8d5cfc97740429dd67f3c6a8bdf312"; + sha512.source = "5a92e1abd52c044957a160e41b74b15094b3a85bd8d29ac06ad35b8117ab9ece4d98b93e988994811846ba8bfa4d56f27b41708776489fd9957ecb0ae783ade8"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "20240219.0"; +}; +luatexko = { + revision = 68243; + shortdesc = "Typeset Korean with Lua(La)TeX"; + stripPrefix = 0; + sha512.run = "7815d0d6caada77e5d72c410a299de6349a81f635cf9f2ae5b61a73e5619808b8997de70a35a0a6e8cfa1250d413645a9f90f398582e061c92138dbca97d4117"; + sha512.doc = "cd1d68f9fa8d5bc5491f4a58f465ea8ddc4a0c500f7c24c2034c75f33ad31d869d2d63d836ea6699b02b04b69406290e7f98eef1294ce8be0f9358f9b207c9ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +luatextra = { + revision = 20747; + shortdesc = "Additional macros for Plain TeX and LaTeX in LuaTeX"; + stripPrefix = 0; + sha512.run = "03c95a5e42d8fc0ed88704799a36624ebb48b9c7606acbc09de29e5da845ede3f239a6dda43cbfb4377971cecb55b1f5280cf0ea1aae5057f3ab8df2e0870745"; + sha512.doc = "f1c0d31fbd66f4e78eb638a9bb336f49de3d19b29bf276fb6fd0d976ba2f33599c1536ec82f7887af1c1ee359b48b1048d400b7faf0cd8016b914f4c5318c849"; + sha512.source = "2050bf6c907f6f4e210b400cc93b1786a7ea8407eb64e90054b2ac8408d31689fdb1ffcf4859f1bf6c24c298e5d07fcbd201574b9b397de192609dda504502e0"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0.1"; +}; +luatodonotes = { + revision = 53825; + shortdesc = "Add editing annotations in a LuaLaTeX document"; + stripPrefix = 0; + sha512.run = "4cc24f72014d50179fa1cd3630a483677a98a5dedd28e94f2c7003c3c61eae66bf9b6787bcde81b654f4187d873440828655be372b4d6bbf59c802da23beaeea"; + sha512.doc = "2b7298a56975f0ac71bf6c0327d95531622de23a33c4a1999cdd35ae960766342071722e388fd3d9fc10fcbd23c0752e5e5399516c8465f7e66f5ea8b952e447"; + sha512.source = "0ed8cbb2160246c499ed98a7865216e8f5739a7c87a1b9a6ef8b63944a4b3f2c6a011ebb4276486d2ff8fca96428b0c25e87936fade5967cf41f7cee79307880"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.5"; +}; +luatruthtable = { + revision = 68893; + shortdesc = "Generate truth tables of boolean values in LuaLaTeX"; + stripPrefix = 0; + sha512.run = "3f239ac9d477c456881921140345415d2bc9f0db00c9180bdfac2120c86669f2a52fe8dc92752535b2dacbbab626e51ef614da7fc10a93ad90a2322dd1821343"; + sha512.doc = "5e17243dfe5343e211991a9e7b73d8b2d454042bea5cd15fe5bdf257344b4953d9a3e3ed9c2bfa66263c32c53a93be233715f2d524bf78c682a57b67332744fa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +luavlna = { + revision = 67442; + shortdesc = "Prevent line breaks after single letter words, units, or academic titles"; + stripPrefix = 0; + sha512.run = "012bdbcca4062a2f551b28dbbd781c885fbb557f5c1258157db01fff7141c8380341f53a9e58c3f844c022af64a748299efb703de5e37f05acaa0d385b8ab8ed"; + sha512.doc = "a785d65816ff637c4c08f6a0ce95e5a65c4121885f6af32b3e68574845adc10886685451cf3fb68cff05b4ab29c792b3c02f793d912e86ace55f2602af6d63e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1l"; +}; +luaxml = { + revision = 70117; + shortdesc = "Lua library for reading and serialising XML files"; + stripPrefix = 0; + sha512.run = "d337c443f09a8fed88a3530e94326660ebee59260e873e7581226aadc622fabfb37ace31ee105fc321b6633d4fd8c8117739ba6884b367cdaf708f81f686f3ce"; + sha512.doc = "ad30466499514af7dbb5425f560953c23e94f6af468b2e693a560de249eec4b5db913371884fdaa36c22693b5175d40da297fa98e22906fc4c501b9f3b7de2d4"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.1r"; +}; +lutabulartools = { + revision = 67714; + shortdesc = "Some useful LuaLaTeX-based tabular tools"; + stripPrefix = 0; + sha512.run = "eeb781b572beed01f5a787a4d0351289c90751ff49a289952a150e3aa013b10f4b0f69fea546709ce9c6ee077a08a551ac9e03d192c1064205eb2af6e907be1d"; + sha512.doc = "9595cf869f480951f9d0d142abb05548e4f71d8af6d62c4ff0626ad9d9019d63b91333bfc8ba1f6948c9075d62fb7b7956658079fd17ea5e86f920eb7c6ed49b"; + hasRunfiles = true; + license = [ "mit" ]; +}; +lwarp = { + revision = 70072; + shortdesc = "Converts LaTeX to HTML"; + sha512.run = "db403b10401780ea2e7db5d849627e3ce5ff4ddbf3fe9c4e0251c29da5e49f7cfda768c9ea8c397e7c8ccef2c25b3db88db0c406a4fff4ddef081a7bbd32b88a"; + sha512.doc = "1f818d8419e2e7d986fb35ef662f95a3ec24c6a3f439c3ee08f9ca9d8917871d4d21a8ba8f960346479bccf8c926b32751604912fa0274786bfdca641f83b803"; + sha512.source = "70fbe22a77b4494f2dff7e09448a1dbba42d115ef1a8739a305dabba55f8bcdf47cc3e632f09285c6de0442a5050551f7f13d15f573c88459ef8bec2f29a5f70"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "0.916"; +}; +lwarp.binfiles = [ + "lwarpmk" +]; +lxfonts = { + revision = 32354; + shortdesc = "Set of slide fonts based on CM"; + stripPrefix = 0; + fontMaps = [ + "MixedMap lxfonts.map" + ]; + sha512.run = "aa732f403af1adc898e6ac462412a59e4d2c8821ef47807ec5d8c1ce565a73299d472377117bca3fb30add468b546280b1603feff95d35090b338f87b279bdf4"; + sha512.doc = "fed48ea91eb5ad414463d3b929dd4deb5cf433be63aa2753acc251aa1e8b85f0db7307a0ea96ea0bf9c4d9b14d0b90d26cde703bed2761a4a1b789ab3d117eba"; + sha512.source = "18da6f216135745887160dcc1df6ed72eb0e49f60a445e45326c84bed8fd98cd66316e21a6e0e7528d551917092f9715641fc68e02371b609690e00403ca5d96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +ly1 = { + revision = 63565; + shortdesc = "Support for LY1 LaTeX encoding"; + stripPrefix = 0; + sha512.run = "79ec3f1971587a3266d3351cf4d97e44d7871ace695c7f229b92c819f1334c2032a3c906a2e7e74e98fea5f01ef4dabac9c2dbdbecf68f0d5512c637288e8297"; + sha512.doc = "c1a39c96000fa3e929ab6518acb71c26bb06179cf06af4f4eb1f2bde0d21816e108c6a89dfa2f7dd71f95887a37d532bb2914a03732dfe4080541ffa204e8e43"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +lyluatex = { + revision = 66880; + shortdesc = "Commands to include lilypond scores within a (Lua)LaTeX document"; + stripPrefix = 0; + sha512.run = "8d8491e9760f7464cc420b2b457f61c6f9e8e08b7de11dd9194f39330bb193b534f5ae3ea981317e4b2bce536149ca002f532f98bba5e0d8cfee5450c6b9b171"; + sha512.doc = "96d99f944aed67d9e59714deaba08a5b41cd8d63f7c8a38151b2d7952817d5096517d1c643246dac8bb3616efa9c44180264794b90175aecef9362d32a83bf3b"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.5"; +}; +m-tx = { + revision = 64182; + shortdesc = "A preprocessor for pmx"; + sha512.run = "b56bc4432bcd340f3e92f5043c38bde7f14b5f2d32b9433fa21c73c20f7ebb981714175aa6f4f871636efb62a52cd24aa639e87a320039313b16db1b027ee2f5"; + sha512.doc = "316fbc2b37b903cae8da6bb9f44b8afad0e3e577c6fd84664e1724ffe318bbdbf9609dcadd5cde6a14cc5acbc134f69bd7a87dd90d9da7d4442a5f913b8132f5"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "mit" ]; + version = "0.63d"; +}; +m-tx.binfiles = [ + "m-tx" + "prepmx" +]; +macrolist = { + revision = 60139; + shortdesc = "List operations for LaTeX2e"; + stripPrefix = 0; + sha512.run = "d722a58921aa7f6c5a887c022027df5d04c905f9c1cd7a95df31e1e3d9ad8c583028436eeb35217cb186aee6ea21efff09d3f52fa5284963789ccaeedc3342e7"; + sha512.doc = "21893f581ee47e136a47c56deaee6f9c4e6c5e4380027e22bfb62cf6258502ecb1a647f11dd5468b8687c033e0cc708397efc2499307db320963598228dd3b4b"; + sha512.source = "ee930f3a9d8a909c9c139f47b9022badf50ead0fb95a87a38dc2850e1bf7ea38d346ac362e1aeeb8c2dfb661ce5dca0c3cb78fadaadc0524b080d73d3241d0fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +macros2e = { + revision = 64967; + shortdesc = "A list of internal LaTeX2e macros"; + stripPrefix = 0; + sha512.run = "4b11fe67e0a57f98bec13e9ce928664dbeee189a2eb303312632a881ba4f321fb5acdfbec9d14544782b86a961add6154a21c731f58e889ea58e98459de05c39"; + sha512.doc = "71db4e3a595508119b1a8059c25b7a38e3252398186386519e7edc28b3a75cb6d6954f274795b9ef88e360b1e0998e4da2a29ba1f5ebf464e535ea90c498e8a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4a"; +}; +macroswap = { + revision = 31498; + shortdesc = "Swap the definitions of two LaTeX macros"; + stripPrefix = 0; + sha512.run = "39af1bcf247986c1f7559e1523d1d33680270602bda1d904404db0700452d203f950eadb2d9808a1cd3098bccf070218bd791fdbe5be4a3b0f539f013ef226a6"; + sha512.doc = "4e46c824a6a5909fca7d8a4628c87cc7a372ae5eab0d2f5110dc1f205e072e53a817043cbead53dde55e71c7c1c0e23695ba963c27e46bc70e2f84d430b656d7"; + sha512.source = "43ac07d97c89b821f89f7308acc21521d025bad0dcc82f281e011254b163a54cc457db5bc0dc74419cc5bdfc4297e18cc886bbb1b22715dcb7d41e6bcc0c2374"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +mafr = { + revision = 15878; + shortdesc = "Mathematics in accord with French usage"; + stripPrefix = 0; + sha512.run = "802d108e7deaaa1a42b7f1eca5059f9547f0f4edb2eb5f8f3f0b68d03c05662f37d2bf7b25844dcec6b89d6d1f0babe93614cbc87fe1e2ca0ac2153602c0cad7"; + sha512.doc = "5e3a0c42944944fc467e09751c1881dfd16ee526c78e509acbad394725703771893770d11e5aa16b09b6b5d1059331b72ce0f1e85c6ec61677d101276398624c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +magaz = { + revision = 24694; + shortdesc = "Magazine layout"; + stripPrefix = 0; + sha512.run = "5c35baa39a8b26911b2c2dd875576a0f875f5edc37fb497dbd403720855861219fdced11ee3fbbdee8e63f0817b6c2ee6a20e6ec3bcc9a5183465c22caf7735d"; + sha512.doc = "78c9163951f269a489f6e8a48cce7d9ca46aa5c7f2f2567f8e50627ddc32920a8a5b54bf141ae881c2863de6bad4f7a954588fef9469291f18e65b7fadbf051b"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.4"; +}; +magicnum = { + revision = 52983; + shortdesc = "Access TeX systems' \"magic numbers\""; + stripPrefix = 0; + sha512.run = "305d94ec07468511e7ada667ded30a1c3ba68835d5bdd03a9a32c7bb7c0d274d5ddc77a5ad02712faf10aba5eca73c6708cb2bf497bea0b73b3f99b10923a8bd"; + sha512.doc = "084bdeb7d422a5e79f4a53864ea0c94b09962e159e103fe3ea77163a9a549605f7139bb2ba9d1a57877b3453162a99470f48a691ff78289a1caa5389b2a7f67d"; + sha512.source = "3bc74965fdc7ecfe7481e426e3cd2c9a27c8752fec3248e707c1f0ee1fcd03205540d6cbde05b82c9313c567b7e689acc9b1146f53962eadfef22d7006c896fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +magicwatermark = { + revision = 63656; + shortdesc = "An easy and flexible way to set watermarks"; + stripPrefix = 0; + sha512.run = "87dc295ac046213ed1a0b3c1b2b415edb3f65cd1e213b101ed3125df663fc4261fd54c07343ece9dcb4e345f134e7d9caff2791e0b8ff507b8d006d5c2dd1430"; + sha512.doc = "76504a77b18c8fd21d27cb26092edbca6e1e9470c006bd486ab4412116f30b833f3a92cac216c73318372da4fe3ccc7342effed2cfcafd09fb8efb1770582d5f"; + sha512.source = "4f42f8459f7ae28a4799473b57f0cbeea59de0f6b1cb065a0e2f27a8ab5698512bf3845b275e488c7157d3504d79680e679c88fbd510bce485a89b72671fc98c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +magra = { + revision = 57373; + shortdesc = "The Magra font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Magra.map" + ]; + sha512.run = "2b182272dcf5bf3469ccc38daf9ad24081002d118de77d2dd012b136152f2147a63c6c8fad5ffe2f758efbfbf7665ae0c61ef6281cf16112b740da95d2334b63"; + sha512.doc = "8364aaf47ee07d7462dcb13bb370c88c47556e23491233e580dee165528b417bf3dd139f0cdb3db6c565c0ffbac40ea2fb995a0dd2981dd227d1a70561f2f619"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.1"; +}; +mahjong = { + revision = 58896; + shortdesc = "Typeset Mahjong Tiles using MPSZ Notation"; + stripPrefix = 0; + sha512.run = "697c0a634304e4e94a6165fd033d906209fa6811cf6297868b76389165bf557f3b6abd419582d200bb252365f790ce53c98e1da75c8b6d3d061cb5d6b635ef38"; + sha512.doc = "622a34f880eb02813e7f4c1f6eb7199194c3ee0e62df534e7832530c34f09e2abfa7f1d491b4840310841e230e3ab5080cbfa5370e9366c0f9b8fd9000b0ef38"; + sha512.source = "6b64551b9cf9d4e79875935d2b37af602be7d3b001a3ef441003136b950741adec8d4b8521ca9a49d744d2173c0b053f025af909fe320edf08f1b3d7c131055e"; + hasRunfiles = true; + license = [ "mit" "cc-by-10" ]; + version = "1.0.1"; +}; +mailing = { + revision = 15878; + shortdesc = "Macros for mail merging"; + stripPrefix = 0; + sha512.run = "33fca4d77b34e3390de647e7e39d6240344f2a90c6067275bdb0e7dd1a3deaf5d5cdaa84dc4a49a0c817bc6923eb593602653b0d0ae4b794510a272b78498be9"; + sha512.doc = "2fd2d4dd5c1896d0849294a1911ae3682b7331cfa574bd46aa047f118fdcb09b4da3e29f6d5412d23ea49f776cd042694508e8b5492ec53cb44a6acafec110c5"; + sha512.source = "5adf58b4bc60e939906b8ae587829937afffc54af81623e640a513ed8522984c2308d3af1631857f4469a5774a844e3655bc3a9ca8ee09445b545d10dbcfea5c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mailmerge = { + revision = 15878; + shortdesc = "Repeating text field substitution"; + stripPrefix = 0; + sha512.run = "1930b0c554dfa36514d0c0b33749d506d6e5acfcf65e3c1dde3ed75a7c45bafb74db8d83f1b286c1a623acb32b2047dcab566ad85e3676c67c0ce1f7722d24f4"; + sha512.doc = "3e8aa80211af8f59289b87dece6cc2a1c5eccf02805e3e7927c78cdac66cdb6afaacb07b1114f8c67105289e4d4f7188043cc28f00365c1f5c3f353a53f14922"; + sha512.source = "d894133e294ea440e1916a04f28a738930ea0ae80ad96e148434c84a02a388735d00778ff4850306ba7336c915a9b2992f41c496149447e6189db82c59a66138"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +make4ht = { + revision = 70117; + shortdesc = "A build system for tex4ht"; + deps = [ + "tex4ht" + ]; + sha512.run = "f16c8062b72932b24673df223850f58521ee5766536c9c210eed123b62c77efa3829f7cd38e2f9f7b62a516dd8fca860def52599be702f22e2d60a8683b52138"; + sha512.doc = "f7f45fcbf92488c2c97fd2b8916b1715cbf76512f43f7e60d29293ae7553416f9a7969e1b5a9e29c88319a5d0ecf6b8fb8a2254b201cafba597122a6d594ff11"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "0.4"; +}; +make4ht.binfiles = [ + "make4ht" +]; +makebarcode = { + revision = 15878; + shortdesc = "Print various kinds 2/5 and Code 39 bar codes"; + stripPrefix = 0; + sha512.run = "a19268b5e63e577b4df9255e4c0eac640c73ac9e08f6d4b4baaff7920f714b7dd961f8143587b59478df2d854dc2f363312833c7636d08c2aab644a25b54bb40"; + sha512.doc = "ecd0121f679d7e4ffb162c151dc4b60acc78f9297d3bf0003882b914f0b1a10a52b43e844c5bb085d73ac08f9f0aa2e768ec4fe7374067ae2fcf304e842a29e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +makebase = { + revision = 41012; + shortdesc = "Typeset counters in a different base"; + stripPrefix = 0; + sha512.run = "cf36d0bad24180f48a7cddae8fa19c6260ceb5076b21f05e48360a30ec259b342e6a17f1c5d299ce5fe02a8dc5ed7934dd55c5529118bb24dd13cd36242b0d6a"; + sha512.doc = "2f7eabf88fe3777ebb1455caed5a339c3b56e0e7a97d34aac0b4c461e7ccf6450de936678ce00e64e39f308167ec55a6b3ec42f7428a7a9c87d2607570e1576b"; + sha512.source = "734e05be1aa54da7bf484fb9211b1f5d6d076c9a87c3287ebd1fe0fa965f542e4e8e14a6df767ccaa23063fc263e66d52b42df54fe3c3142bcf0b3d7f7fd8de0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +makebox = { + revision = 15878; + shortdesc = "Defines a \makebox* command"; + stripPrefix = 0; + sha512.run = "918052ed5c358e12ac7ca7c93f25a43fcfa8f7ba261fdf652d7ccbbcc27e3e0f822813d8297d3b75450c443687bd97e93416624b51da61572557d6a337638bc7"; + sha512.doc = "807d495fdef601fff666acb79c7f3fa43d1aeebf8aed77bebc02f90dca4fb9c36ae1bc911a9af1009538f3d3e2c4c7f9ceb0111d091dd4c1691a1520e089a697"; + sha512.source = "04ab9a02882a505f4393288ae8e5d6be374bdd6aa8a4472da1fb7e2c9e3b4bfc58132921a3287a4c8fe4d8d3fb91ddc33496a088431862407988ade1f716ee85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +makecell = { + revision = 15878; + shortdesc = "Tabular column heads and multilined cells"; + stripPrefix = 0; + sha512.run = "ba32b6a68b0a4cd6df36d460832e5cd9664a9c305c24dbca93a4fce69e97b6db3d86e3f219a0511c7d70378ddd9424d3685d60cabbc8554077c6bfbd8847789b"; + sha512.doc = "7c762852f1c7b4609fa823117e765d2b42ad857e2ffa1ca84aa3df74497c88dfc0a2cf05747f11f14453873ee70c4b0f2f890112c567d04ad0d61ada37e14335"; + sha512.source = "bb2d33b674b612e67bbbc1bf04a68f3804fc37b9e22e19c9af05746efa869ef52db48c5828724b88de130b15120e9ae003f49ea6389f7add98c712550af87d4e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1e"; +}; +makecirc = { + revision = 15878; + shortdesc = "A MetaPost library for drawing electrical circuit diagrams"; + stripPrefix = 0; + sha512.run = "9bba91e5139b90201e232aa3fa21254c5bf8d989aedaec8310209ae6b772d24d7b8c3be379909f04c2c7ff079cca10f43a1f74091a77bb1b8ca637a0743a2ef2"; + sha512.doc = "25190b3a5d911de1d02fa596f604527006f3adf7512afae397e5ba15ab62d6471ab834f92437d35a9f37ed83c8b84990d79ef0fd9ce2b0edfffdfaa2ec97a345"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +makecmds = { + revision = 15878; + shortdesc = "The new \makecommand command always (re)defines a command"; + stripPrefix = 0; + sha512.run = "fb63fdc9cc0aaa531b25417f0c23348971c306b1a93d99e7efdbbfd7c3907b50f28c67f36a88bb2a94154bcbde937e63246ece577ee2440ad4f5c2935eb25b99"; + sha512.doc = "f69dbf682df7e3089727570417be3624b496b5ad7db627b344d32b106606cab5299dd23497e137770fdfb9f940503a65e1074e06dd67e0561b36729ab6c3d428"; + sha512.source = "380eca4f5fed0ae72cded8f6d3a201cacb05a57851c4c207f086dd17762689cd53a6b27daa23d8043c311adc9baed32808d2c7eb1855892f8113ec7f13c02946"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +makecookbook = { + revision = 49311; + shortdesc = "Make a Cookbook"; + stripPrefix = 0; + sha512.run = "a4fdb7a7553a08b51d15c038187ef621ca6852c20a033b1751c544634c3092f93c3db5c1f4d744732ff6696509d8fa406251e9d14e619397ca4202b55c1b9c64"; + sha512.doc = "84c97dd438e3d3abedce031da5841f789f3b8c28672c9e3b6c53929e2e781a9d51adaec6d883d0008b42f1eae2ed5bbf992ec229bb8b2f7f510346d10dbc31fb"; + license = [ "lppl13c" ]; + version = "0.85"; +}; +makedtx = { + revision = 46702; + shortdesc = "Perl script to help generate dtx and ins files"; + sha512.run = "e083fa791975cef84b2e2ba3472984e354d5ced50ae7fb96dd8239cfffd379e7a25fdab80abcb721e63dfb10d9557bce69e97c5624d1635f894bcd26e22b5f4d"; + sha512.doc = "913f6f02ff478ab5edeed4792846ee6bc06d28c16fd3d7396d394f4a964d6f39a12c8163d66a50a5bf53add151317184b09a712dfd32f9ff783bda7f520c7eef"; + sha512.source = "84e12e7798c37a598a2d37fa7faa206ffb6f5c1f9c21af7130a9f05bebf9857f2a4fb7988be55a9936199694a0d74595ff75a1261187d81fd06beda5e0628931"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +makedtx.binfiles = [ + "makedtx" +]; +makeglos = { + revision = 15878; + shortdesc = "Include a glossary into a document"; + stripPrefix = 0; + sha512.run = "477523d4663e1e4a1fd6bb830e4574d6d116180b06a3199d6ba27f7cf704a1906a2812496e9a7ba8063690a2095fbd5022a5eb8c2448b1e0341c8a961cf05794"; + sha512.doc = "c580a23d65422d8405ce011fb6b088f53836811e3da517423f6d0dce098ffbd64c0648318eb9fb74ab637e1796d19247ee87ca8a25c7d306e3dc35a5d6d79f99"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +makeindex = { + revision = 62517; + shortdesc = "Makeindex development sources"; + sha512.run = "5967ba4123fd4c708ce841d29211fdb66c28518f4b418903be0ddf2a49964f706af96b250eec814c547e0703460c1273ce72a7acf3ea9fe28cc1c7073af29d3c"; + sha512.doc = "40b9ee1ebf7dba9a4bb4bb3077cdb1e88b07f276a9d0ae9c2817bd76a2f742ec9237d1b6d9658694fc5fc4e8f82591194862637bd83ea8e106c0541591d343ee"; + hasManpages = true; + hasRunfiles = true; + license = [ "free" ]; +}; +makeindex.binfiles = [ + "makeindex" + "mkindex" +]; +makelabels = { + revision = 60255; + shortdesc = "Add a '\makelabels' feature to KOMA-Script letter classes and package"; + stripPrefix = 0; + sha512.run = "4f58301507896c2e719f2607e1e456aeb25cc78913ed02d9eaa12489aeb643e73bccaafd1f219c1c8b485d77aa64e99d64166b63e8a2c7a7c3c8cfb77ac23bc6"; + sha512.doc = "da01e167d1be1d4831c1bd0aca43472aae12a8204ab844f9964e60f57cf22312532c52cae85964f10780aaa0e4f84015f6ceee8ebfa042b184fb1ecc7c174585"; + sha512.source = "588029533fc25c2501cb8a72cd4226c878a0c419e42d6e4269b68224d9992d298a01019c59c794eb1c9cca14b3efaf758f5c97b6ef90451a6e6d1fb56233a5ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +makeplot = { + revision = 15878; + shortdesc = "Easy plots from Matlab in LaTeX"; + stripPrefix = 0; + sha512.run = "366e9ec4ce551e17ae6e77f068b0d2fb46582c033eb27781cd620a87731eba744212db8dde9ce8e50318f280dfe31e61a344ab4232c3bf26040dd7a2290d4fef"; + sha512.doc = "9aa863af450a66201e7cb3d3a58d9248430aa26cca9b50de4c71c350314ac9c0f6fe54e5eb1b37917a75030a60ca18102933f154bdeb7831ca02bdaa65b3a6bf"; + sha512.source = "b4f0e0de72c005124b7e83f214111931ca2ba03ae5f1270b5d10ff790c6fd84cb02950aed7377deae2c432de55b7822ddc68b9911b608b0460c7800f375fcecb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.6"; +}; +maker = { + revision = 44823; + shortdesc = "Include Arduino or Processing code in LaTeX documents"; + stripPrefix = 0; + sha512.run = "d8cefc4d4389e4024c448400f02bc0ef0a21146c1d079f804f5e102ee3f2977be7fdd2c1011672b70192af48693ab1fcc38bc1d6f7711fce217792e82f0e5e54"; + sha512.doc = "fb7f68b4c48de87e6c1e380525a998bd1cf7578c2e4a51551b5ab4909481e66faf38f0a74083f25954b5d05e9eda12e56734351fab063f80955abf24eadc0e21"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +makerobust = { + revision = 52811; + shortdesc = "Making a macro robust (legacy package)"; + stripPrefix = 0; + sha512.run = "502b4dd65ae3535a2519c696b8b2ef73b3eb8f19d20af7dce94e24c8f718f827e55ddf7ff229bfc0810ab8747c94720cc7a66335a7d44065d0a0ac6b156a683e"; + sha512.doc = "4503551b0085c7c829d41042083209bc02dfd2391f99cf0fabafb363e288a455e51273bf0f9d4ff5a5fe17050fb5288a7835742e06865407b8400c88244f4e6e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +makeshape = { + revision = 28973; + shortdesc = "Declare new PGF shapes"; + stripPrefix = 0; + sha512.run = "b13358696b16b41a69e5a207fcfb717b417ec191ae9f6ad4408422b1ce99c3785a3328cf9bd2e87ade3ede4998ba76ddb2f640e06ef5ce88172942e4d0cf2bfe"; + sha512.doc = "a249c636b414203e75225af611173add2e90af306d4a78c7d865fdd0e76b23637fb3b8eb41f127905bbd0065cc7b941d3d26e3ee73b9aad56e05ed0a44f67d57"; + sha512.source = "43886cdf9c2da20943bcf0403e05fe19c035cd3d49af9afa52212c376a2ecae9ad963a24c257b70e3dcee448f42ee1464e63dcb0c5addd7018234658867d3179"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +mandi = { + revision = 70235; + shortdesc = "Macros for introductory physics and astronomy"; + stripPrefix = 0; + sha512.run = "e5c8cb0ca16c5b34097aef6e3bd00e452bf6382f6f9f5c3213a42463181a4b7f17df8025d479559b281dde7eb61ed2f79f4b9b6c3a37bed6cb3ea1bb9b428eed"; + sha512.doc = "b1d5662645562102719eebb2d349f8a0a2a047ff3303abd076bff1b5888dc897e39034d027eadfd9ba03f1de26b0e0e6c8ccd226ee7f3a7b8545320023e47fbc"; + sha512.source = "e1bffb5b494059bb194496a17957b8adde0247178ee32baa9771ad47616f4dc101c7ad4423c62c50c94f7e62ac59d4ba7b7fa3983dd5503b441b882565db808e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2.2"; +}; +manfnt = { + revision = 54684; + shortdesc = "LaTeX support for the TeX book symbols"; + stripPrefix = 0; + sha512.run = "492dff2a46b9c0e89b8e29149546dfc736195f7f264b156fd91f4e8d1396f43b149948df656c7b148a2d54064fba89e033179b31eeaf03d0037875e36e9b4244"; + sha512.doc = "469280a4576d3b8396f310ba627f5a69f8fe47604f39562321d9b3b7d2f3e81f8d2c0ff7cd18ae4a93d9125df0fba79744edf0b30d036916a8259dc39adbdddc"; + sha512.source = "c90ac97080e2c0c767673f7128e1850427218bb4b05024401fe37aae71ae65f1feae2e11301055dbe6b74fe56e7b16bee4ba1fe0f1a1defbc07763fc5f5cdeb0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +manfnt-font = { + revision = 45777; + shortdesc = "Knuth's \"manual\" fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap manfnt.map" + ]; + sha512.run = "fe7ddf667368990f988005a44013aab80af9c097f4f824f717d84fddfd61dfc658f507d5b1bf8f7c076be1bd5a4363f117b388ecd39b0ce2b0ee5fc8aa83fd4c"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +manuscript = { + revision = 36110; + shortdesc = "Emulate look of a document typed on a typewriter"; + stripPrefix = 0; + sha512.run = "24e4c800ba6f5089ae76b6d444c81689fa696cd2fd9e62281171d771f8f9f065320b53b058cc6adf836f36d378f6f7fece98e8c09e2b655ecaa8884067bd696a"; + sha512.doc = "baaa102f870cc307fe96b583f74c19c7ef2c7649f01fe7985c3dcd331539bc9d839f6e34aa238354b6932d14638b77e83b7bf8e62296c36fc2dba18f776271a6"; + sha512.source = "0cc418f2b5538035123d81f6702031d97bf99fa6733d491b306981ae698f3cad9bd121a20410329b8428b5c14749e825052544cdc52b9c8457d7e302dfc64888"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +manyind = { + revision = 49874; + shortdesc = "Provides support for many indexes"; + stripPrefix = 0; + sha512.run = "e08291b4cb0d2c18e6b97cf6a287d7cf5b49eb312138910185845b6c0a075981a15548de2dded6f597605aef885e736c17b5306328574473aa56f8f11b6b8288"; + sha512.doc = "e8d9c687c1b3525c5e4d218a380781f1b2e7d512b053a583b00c97f0b7eefa1202dea310454065194039841bf8763acc2b0c4712ca8d5e9d31b57cf03c50b928"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +marathi = { + revision = 61719; + shortdesc = "Typeset Marathi language using XeLaTeX or LuaLaTeX"; + stripPrefix = 0; + sha512.run = "5ff1e45d4434c68f09fd011fb0d0bf7652002a9ef6c36035e953a5bb9871baec4dc1998b0c0ec1749ef93cbca8bd40512457d962bf0e9f3bb4c0d36fbeb6f301"; + sha512.doc = "8ef83a4eef0d877473a24ad3d5efb9e4d374dd1c2e00b210251ce145d889d8cf8eec7ff368d94db888b134104770901877fb4e943bf758f921b341bb7bfb5f3c"; + sha512.source = "6cd0135286dbc64b59628e7af8e84e3c4277705bca226155ca899f9ad438751cf5f5da73dfcaa500fdc1d4779f707f8290922098409c69216a5c66e2bdbb73e5"; + hasRunfiles = true; + license = [ "gpl3Plus" "free" "fdl13Only" ]; + version = "1.7"; +}; +marcellus = { + revision = 64451; + shortdesc = "Marcellus fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map marcellus.map" + ]; + sha512.run = "b6ba86cea7e275ae2cb6f35468300035fec789b85280307e65784bca9844aa8c834aa23e9f7e59de75d53879dbc609e64c084adcb1c38811483eeab15543f95f"; + sha512.doc = "5267a43751ac7a0aadfba28ec4427da7c1afbafac2425f09582a736520ab4bbd769e08ef02b86816225cd76bedcbb23f6cfd3e77352c9e4008f9443b826b48e9"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +margbib = { + revision = 15878; + shortdesc = "Display bibitem tags in the margins"; + stripPrefix = 0; + sha512.run = "7f734e46e72badf838397305ca926f4589b9aba7a0e91e21313f6a733f7cd09db959f30e3694490633713b1a77c8d11a521b2892722496fb162d7c25c7b8641a"; + sha512.doc = "c4f93e442d1337cb5a1825b4f7e6fe5ae0a759c32837a896852ec5592b3c31a9c473789db35c147b67360ed662b1e9ae42a59fed446dde234b174f65e358662c"; + sha512.source = "7a9aecd832d34d1225606a905558f5ae33befaaf20f8fa1e6e5263850d2c72273be5a4a05e96d15225b7a2853212e3de28455c856c17e42838406862cadcc344"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0c"; +}; +marginfit = { + revision = 48281; + shortdesc = "Improved margin notes"; + stripPrefix = 0; + sha512.run = "dafe223cc6120beac7ce419c5f5eb72ece9be2a21992e829a8015f7e05ca22c40d5196d26d21d8febf3459bfa58c7defc797ce7bd4ee1e3dda28761594240b3e"; + sha512.doc = "fba2ff6febb4acd0dad443221c6146fc2b3818c4948827b827fe2ff2df82f4e2843520f1f4cd41fd64900012d64d973d9b649e65b1c5ee4e74757344ab423dc0"; + sha512.source = "89892d83570cad7c46b5fafcf8a7d87b660d898afde97c2fed03f82d3cbdcea9bd11baecd19d3aa958305cac0d9f7163e00fe262a0738e7f89b62f7d1bdf0df8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +marginfix = { + revision = 55064; + shortdesc = "Patch \marginpar to avoid overfull margins"; + stripPrefix = 0; + sha512.run = "70dc40b9823cd82a52a7e55e5af47e5b2373fd7cf16567f6eca2bb886d3612473141435444b538f81ab9467d1b3e5ba04424b1ca47d95cc0869dea02faf82b03"; + sha512.doc = "16ab654dd8957bcf37351b7c766b787f27baddd4e73a6a4c3a07f5b1486f5ea73c9028675b5830b8dc1224eae29f50d61bb579aeecd9af4aaafaf78259bca900"; + sha512.source = "5e94ffc102902ff040162f5d9fa39f1d812801d0413befa5db7cc2c23d91ce24d47317f411e64f2fb2e22fb782c9cf1f87780c2cf2eccc50214b502402032eb3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +marginnote = { + revision = 68204; + shortdesc = "Notes in the margin, even where \marginpar fails"; + stripPrefix = 0; + sha512.run = "6643a77d01d59bc371d301e738b59957bd63cfa0fc98a554f853d1599392ceb5e88663651563445633df704bbc3ef74510ebd6150c44911314225259982f114b"; + sha512.doc = "18882e317048606324338ff765cd11e972c3dedcdbfe2407a3f9643b3efe6a7d173561726d4221618ac510a447cec7b1aa13a46ca45a091ac76e601c55c551e7"; + sha512.source = "edcdc3acba09440dd7d1594a1813fd205447c672e0bb73e3b968ac6e211365c488d3ce0287b7df5e198a75e12d3301248e39674be831387cdd06636e97d76138"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +markdown = { + revision = 70583; + shortdesc = "Converting and rendering markdown documents inside TeX"; + stripPrefix = 0; + sha512.run = "0b133a8f7a4d9315365569698cf2f6897b46ac0c49eb6f6a7697735e209e6a45354101cbeafe7504aa18a39cd514332db204b4b53051a4a9e7380ec581be6d23"; + sha512.doc = "ca199c02ee60ebe597bc0c7324b910d78c58457e614bc23be98720e301bd501540b52325fda4a0b6eaed15859820f5eba4e4749dd4163057c6731c1d1643f27c"; + sha512.source = "b33cf8d6604aa6acd27a67ee5ec5ec1a84fb91c77a0d5f830f6dcbc78343420036175bfcc1cf1665f23804ee9d06e58029fbf4e533a75dae29e8d7b1ee6297cf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4.2-0-ga45cf0ed"; +}; +marvosym = { + revision = 29349; + shortdesc = "Martin Vogel's Symbols (marvosym) font"; + stripPrefix = 0; + fontMaps = [ + "Map marvosym.map" + ]; + sha512.run = "64093dc5de012c6a50762ef34001ff2305e6b59b667ac7b1ef72cc53f8b0ed3852b4d307a8d421ece996e78f2e32c8871038b6b66659b0866dbdc536445dc7a3"; + sha512.doc = "d6f72ee7ed64404acce5c37c216a7e23193f2053c18910d80fc6d5fde73ba86c07045102488f17f4cbeb9e1d148567973713bb4d9ce2cdd3cb166936ba5623e1"; + sha512.source = "c28a69567c593160c7d04b4fc0fe7f0106db12ab588d3f02139e55ad99a1b4e33f1bba92f5af103b6f2a7e720d243b919d1f39f28031ad95dde3ae7e723f6e36"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.2a"; +}; +matapli = { + revision = 62632; + shortdesc = "Class for the french journal \"MATAPLI\""; + stripPrefix = 0; + sha512.run = "b8330a2fbbcb2b6c65a1f056fdf572cf14b6c3b8aff3abf91cd40a150a12feb37cb4a43b41e8239fbe00bb4a2168894c375f0bb35c7dbe2f1d8de0d5ae2ae476"; + sha512.doc = "6c24ac9fc5b1968ee8c675c7aef8c8fcd3ce813e407886a412419a4a894942d6928d49cfebaf1d7ac7be7cc5c08847e8ba2c70390e3ea7973b0882a51d039ae1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +matc3 = { + revision = 29845; + shortdesc = "Commands for MatematicaC3 textbooks"; + stripPrefix = 0; + sha512.run = "19996040ec55b000d84637070a21fa9fc216eb3cf8ec75f7c408925e0d7a716a7dca0eff4887778f666be3e857b589cd033c53d3859f84226416ad069720f7be"; + sha512.doc = "68f65e9171eb03fed79dc9bffadb725dc7324fd9696ff9f6f0a13233327f47474477180c6e17b5bbb9ee2ee02996ebd6213b43eeb7e9b7eb7dca2caac2db470d"; + sha512.source = "efc84a936de1ab0905e94937d00c3ab2f371412975786c3816cb3b8fdf98482943c1f18a08422ea95d7a7bda6607ffd1dcb6b5c28101c7f5348260a088cf1233"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +matc3mem = { + revision = 35773; + shortdesc = "Class for MatematicaC3 textbooks"; + stripPrefix = 0; + sha512.run = "e0736f75126aca9506e1cfcbd321645e731e2dec7f3ae2c045201dd8c729044689e358724b77ef9d99aaf3ff742802857d488e3f2f78e781b64af711c7fdce12"; + sha512.doc = "2038d84ab20c6763163769b62a35fa4e95dbd3e76b0e2cf1c4a25694488ddb5b9be8b40f81a1702600d918618455bcae46d22fa101a1a95978b996714de41dfe"; + sha512.source = "cd8ad4afa288ca175c06df2de15cb7ae048f3b69ff6b96225f134c022efaaa5223fdba1b2b80f75ad3ab6e3ac79d38b41794cdbfecce1ac6ffd2ed47cfb69649"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +match_parens = { + revision = 66681; + shortdesc = "Find mismatches of parentheses, braces, (angle) brackets, in texts"; + sha512.run = "ed3286292a5480d73db2d3e231663c37eac6a17a50d4bc37131bb5d5627d445560c1bd47a3ea05dd4d9439ad97c275a05542c5664ea0460e2c596eda75aa56ac"; + sha512.doc = "8ff55ae4caaa0ec44f2c44c21d08e977467e6a1a1471f0d361c428a2fd552907a3bff6a88a4f7fa40f3fac7f5ee0a62b2471d5966430b533ef5dac554d919a99"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.44"; +}; +match_parens.binfiles = [ + "match_parens" +]; +math-into-latex-4 = { + revision = 44131; + shortdesc = "Samples from Math into LaTeX, 4th Edition"; + stripPrefix = 0; + sha512.run = "d5739155ac3cd6a02f356bbb600f7f76022faa4a5c004a93531678ead3c2f0a9f8e1419044883306ce453ac96ab8726ee45d8e49c86b0fca6a9232010a8927e3"; + sha512.doc = "5fee7c89fc9f273817b23fa25260733ee0552df7bed0333bbe604c17bdecfc28d7e386478f7b42d3c2aef89f80ce7a1d35215fdc386ea47e4db3a334bc6a9597"; + license = [ "free" ]; +}; +mathabx = { + revision = 15878; + shortdesc = "Three series of mathematical symbols"; + stripPrefix = 0; + sha512.run = "400bb43207c43192321cfe1b658c85a07410778e7694ab1604b992025d69300bb2d4c2cb7866a255dc4988c843dd3b92c33e527c12f087bb560cba4520115643"; + sha512.doc = "e1f9f96794f6d20dd75bd7ceabd40993e56d5315848bbea8a6812a16f74c0fb92ddc6356c71aaa1367c47b1dc26a3711793ec88cf0b90d391f8157fe20f77196"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mathabx-type1 = { + revision = 21129; + shortdesc = "Outline version of the mathabx fonts"; + stripPrefix = 0; + deps = [ + "mathabx" + ]; + fontMaps = [ + "Map mathabx.map" + ]; + sha512.run = "ae2272ac7d79a3bb1a655000a2d5fa1c3d948363763abe194cbac4084d5ef60492648977660c3d9dfbc2c70bea3c207d031d2147097fb1d7af503aa80f257d1c"; + sha512.doc = "2504e85d659cba06fa25ae4e154309a6d3dcba2ac8bae0d4066b6637f19081987b0bc774902365e5b723f4b6c35cad07709e316ec1893a018baabc699d755e8b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mathalpha = { + revision = 61089; + shortdesc = "General package for loading maths alphabets in LaTeX"; + stripPrefix = 0; + sha512.run = "9c56ad5cabba0fc7ff7403882cd46161be0b4d7bcaf632e48eab5170b1350a1c780a9f98ed535466ae7c17a387a461fa4663ffd3c4fac5cb01ecb77bccdcfec6"; + sha512.doc = "5de9923e39ccf9b55f10f0b97067d001ead5598423174808d2a7636c96f8fbd2e8a8e6c0d66140f62d51b9263a736cb6106cf6db0e16e62ee5d9f3887baa3159"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.143"; +}; +mathastext = { + revision = 69237; + shortdesc = "Use the text font in maths mode"; + stripPrefix = 0; + sha512.run = "057e16f2b729c1e6fd6857da04ae30b2d2bb42bf185cfba01dfd2753303e6d2668e5c48362799ecff40318bf709c348818f0529f6f8971f9cf6f66cb1960f03f"; + sha512.doc = "632a36650d095b8a9f49ecfac9fbfb896ee29f18e81adece341026291fa945e361ea2f4678bde9b31166f2d7b0d7224c8be856184871e85b31d5e7613f950785"; + sha512.source = "7c9499486765d4b59320a67e057d3550e46d1434a730ba06d288b869468203e89b9b73b7c96b4904def75e6193fc4e0f79e814e9cd3acfd088c6da9b6dd4b856"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3zb"; +}; +mathcommand = { + revision = 59512; + shortdesc = "\newcommand-like commands for defining math macros"; + stripPrefix = 0; + sha512.run = "4be34084705419757f92b8f31be35a606689c25786bc5b95a0531d572ce21601881cbd7548b7d380241089d4473fbfb70debeab9b30633671b3494d66bfbb9f6"; + sha512.doc = "80191b36dd3e34193c2aff764b7ffcf274a4d9fc41b1d19fc92ac807e03809069efbcace953fdbddd481db7d6604a859eab44a2c93024ecd59968c9e24e2630f"; + sha512.source = "99fb6c9f81e72c3b78807ff1d073ff4c6e193a163c3aa6aaa2e45d94ca246933733b1b35a671557cf40fdb33184af6ea28fa8a590b0339db373820ad9c38d514"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +mathcomp = { + revision = 15878; + shortdesc = "Text symbols in maths mode"; + stripPrefix = 0; + sha512.run = "7dca82aff58606afd315bc18c6908946193be75f04ec456e2cede8184867543437007b27f04f4363a026a0db83da3fdf963afecab7330e9419b1ac5376efcdd8"; + sha512.doc = "6135b3d06908c5c359cc432a7406f146ea6b0bb614ba0b983738230ca2073f4348a6ff139bdc4b43325a8b67ef59a6db8e60ecefd88af5c8ff0eddceb0f279fe"; + sha512.source = "3578e5e31ac3cfda23381e348dfa9e4da6993a9cefaa73b3746be0f2719d04dd37d04e75925414f4f0083b0971222da5eced4bd582e405031f29899faacecf57"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1f"; +}; +mathdesign = { + revision = 31639; + shortdesc = "Mathematical fonts to fit with particular text fonts"; + stripPrefix = 0; + fontMaps = [ + "Map mdbch.map" + "Map mdgreek.map" + "Map mdici.map" + "Map mdpgd.map" + "Map mdpus.map" + "Map mdput.map" + "Map mdugm.map" + ]; + sha512.run = "cc8a1c58348f8f81417178434c9bc3d9edea79dc5d300753f41870734f8fca8f43325d56f73e3113aee8e9f38be1fbc6abd3cefe4458af1e1e22900ce889c315"; + sha512.doc = "f6c0a3595beb7b25ab5ef2c8a08b3e0be90cdbfa20c946b7b3f5cfd29f5c9a38963262818990ef78be02d95c2d2a5991581be77834048fab4eb0e4c0252e6871"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.31"; +}; +mathdots = { + revision = 34301; + shortdesc = "Commands to produce dots in math that respect font size"; + stripPrefix = 0; + sha512.run = "1235583223f831852458d53e1e8cb767495987829d4930387f4dccf7ab060b9f0af8722d6c1aaa820c1a371f8ce1c0222633e6feb064e0344e639eedbaa4129d"; + sha512.doc = "b1ce238b3abb3397b0085983e752dbb9eb9d9c1026046726360498d089304f7f4deecd656dceee27b63934092568f0ca46620231f03e0952c43f28ae73e97dc0"; + sha512.source = "dd590187fadbf0eb788eade245d4198a4c1075433db1a0df00ce2d5cf2b6f332e09ce995292d21ad46f13ba68284808cfea6c7818a47bf99a61ae44e5381fe55"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +mathexam = { + revision = 15878; + shortdesc = "Package for typesetting exams"; + stripPrefix = 0; + sha512.run = "30fc0cc9c44f2b7a64860a7d8eeecd25eec7e888f4ebdafade236edebecbd79f5d832566d151243430a60c5995807ea77d34e19cfd5e0d8cb037ca67d3e933bc"; + sha512.doc = "6af2944d12d09f1ab593a7002b9de71d14c5436885b79e5e495dc0ba1fdf9dc6b9080bd009bafff988b019ec3e75da934a7c8c043870fdd52a9a46b36c9d646d"; + sha512.source = "f2324e1f9e0fe8f259b6e1d2a1370ddfec87091c82650432e24b08c598fd6ce57334b88ab53a6049f416ff14c3ccfc7c250029767eccf05456d6c233e665f6a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +mathfam256 = { + revision = 53519; + shortdesc = "Extend math family up to 256 for pLaTeX/upLaTeX/Lamed"; + stripPrefix = 0; + sha512.run = "20912d6df0f287c14300e4598400cc2da676f7e484757e3a9a0c41ef6861d7180cf7110fbc7b5668ba8a713cb66b9120736b64a1f5098df25379ebc7b14e44f5"; + sha512.doc = "26aa672bc55de7c45a857d1ae26e156fe19f4ffa05417a7a4163526d01d5f58576f8d6db951e377b646e1ff25167571587d09f21eadecb95bc96e6b85707a9bb"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.5"; +}; +mathfixs = { + revision = 49547; + shortdesc = "Fix various layout issues in math mode"; + stripPrefix = 0; + sha512.run = "513e5dd9eb58ca5b1eb8daec663c48577fa2102ade0234412dbb22b6d756ad37009c689746c57c6624c731df64fa8d58eabfecbd4cdc31c576eb0ecd1e232fdf"; + sha512.doc = "c9ad8dda9ffaa77ba727f536016ba1dcbfb91c4d7ab98b1e4b72156591e8ff0359f623475324e57c6b22f509cdfe7e30ba67c3fb22f9dd152e59f1557c96a6a6"; + sha512.source = "f08a26458ed871a11a44a1e957a1e9140b3e95c98ba1bd958cb9d63cbe483ee94e91217a5a7e54745b2cf245ee7f898fb64238941d1a8fce04699a3b8a06b7e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +mathfont = { + revision = 68241; + shortdesc = "Use TrueType and OpenType fonts in math mode"; + stripPrefix = 0; + sha512.run = "9ebe3acb43ebd09a537b99eee5047d2abf28a019017ebb434684864104892093e4451ff3ecd0393c4f56d4f94efb16cdefaa58b073b517e7dd01adc04f5f9a69"; + sha512.doc = "304bdf738ca94eb7c5ae708ecf0400cce1af9c09f05056b3718bc0ea5352e1d06a2a1cc3c037c8569bb26d33268e14ab660e627da0d9df075af1b36f6bf718bf"; + sha512.source = "771062f0f60be1c0d3a300ce74ca9ca00a56b6042e3980da47590116c08f39c8b4f0bdb756e41654481615fa1896f53963abd0c322817c57cb78247505abde9b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +mathlig = { + revision = 54244; + shortdesc = "Define maths \"ligatures\""; + stripPrefix = 0; + sha512.run = "1ec5761aded23b8ebd4b9afece00ab1f3f9a18886edd12ffd2a2e0b5b9fe9adc9a4ee6fb629933f36f6a161c76e85b54e3d9855871c3387cb0f70f90194b2615"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +mathpartir = { + revision = 39864; + shortdesc = "Typesetting sequences of math formulas, e.g. type inference rules"; + stripPrefix = 0; + sha512.run = "8e1c99db2d64e9c815bf8b6784d1c717969a5ecc96281df2f815ba7c0d779b53484c61ca233468de793be94cf636373f4fc0e3413c0ce32d4715db30cafe5471"; + sha512.doc = "fca6b3e2650ada022617af137dc86858c83c51c55fcadf2ff21832a1fcd9fc44f371f89e8943c5e1d117a09893c3587f15a3e8021b11f7472dd3c9d37383f8a0"; + sha512.source = "f5c5b328745494965d1907f6dc187859a5f9bda5a8beda164e7317dc1b8a6e886073f9d2e9b564c6aa56d55e7cb7191afeea38edc059b2dd55066e68ff826dd8"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.3.2"; +}; +mathpazo = { + revision = 52663; + shortdesc = "Fonts to typeset mathematics to match Palatino"; + stripPrefix = 0; + deps = [ + "fpl" + "palatino" + ]; + sha512.run = "72bfba52e37abd933cb7b1b19dd813c3c76438591c94f9c407cabb8a44c8c67f78fae04442027287e5bf30b7239c3703ece4271194716882773eeb50d4cb2f47"; + sha512.doc = "94e624f2cea50bf3534300d3332dd61e1bc5b4c834603356831d0f9bf4c6bdc34af5d31df002c10430d4945c2c71dbf7c156b7b05ba08c657cc2d960839c2a35"; + sha512.source = "bd6aba477ca38c9778d7d23460420f485ac5658e9514ac2260475a50b6ee7e2ff736bac81a4548fb4aebae952a406a0de1bef01bd7d8fe4984080ab835d328d4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.003"; +}; +mathpunctspace = { + revision = 46754; + shortdesc = "Control the space after punctuation in math expressions"; + stripPrefix = 0; + sha512.run = "81d1fa6ce0e96190516f2440517d554e259013869065a4242c55bcc06f2d9eab1f8102464da71fe72dd0d231248b637d54733b2a11b832d2153f151dc5513339"; + sha512.doc = "ce318466af0c6690a905c92e9f24f9a7c2891c4afac7c51eead8ebf211bf13e2c20d368782ed41f20a2bb2d6f3a6cd6bf44eb6a0c848ff8006564ec98aeae2d7"; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "1.1"; +}; +maths-symbols = { + revision = 37763; + shortdesc = "Summary of mathematical symbols available in LaTeX"; + stripPrefix = 0; + sha512.run = "f2028a2b8dad52aee2db1fcf679647192cb926e13cca831a419d876783e492dbc590e4745302addae7d3f01eabf7eaa1fd7cc6f757eff2ab9d9b5c39a1b0b785"; + sha512.doc = "b60a66b3cc67e4dde62b0fc0552233ab59b1981ab92cedbe4c0de31a4c9e9d3207cf54ec5d2361f81937867d81bd345e77c4ab3e36fcd8588851765ec3267864"; + license = [ "lppl12" ]; + version = "3.4"; +}; +mathsemantics = { + revision = 63241; + shortdesc = "Semantic math commands in LaTeX"; + stripPrefix = 0; + sha512.run = "e8cd9b91b758317d310265c41f565481a9a18c9a345ea3c8b3f771de637f0a144d131cda93b7771ee7b28563fe1e6d42a410cbc7c9fe08532a5821ca84d5a101"; + sha512.doc = "3f0b2120c9551e498d71ace121985553d1d40f2b242887fe0e6e31a9e25dd62d32fd44d3bd1b50233cbebbbe70201162dca838ede7409512a91d5e522149b479"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.0"; +}; +mathspec = { + revision = 42773; + shortdesc = "Specify arbitrary fonts for mathematics in XeTeX"; + stripPrefix = 0; + sha512.run = "7e9838ad2f212354b103b9beb61d60f124d2f47e52a04e2fad61de01e2e8220ca5f19f5b2188cbfefb379f94dc4b76573355dbde563f887beec29c57b3648ae9"; + sha512.doc = "d22c19bd2114bc48f438d820177006170d52d1a261f3cfe69452148f4e11a0ddeb1bb25e1c1fa22ef8d2284c7f34f7ef41bcf9d8e90a89705b3a7515a679a922"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2b"; +}; +mathspic = { + revision = 31957; + shortdesc = "A Perl filter program for use with PiCTeX"; + sha512.run = "e556960f07a003e877ce678110e724ef94d34aabc0ae52c59ec2ae487fc7d3e5de169844baaefd61e467e98a7a9718d94d881c3f0d43855e133040bdbddb6a62"; + sha512.doc = "1702071f4c26097e241ba161258a51461405954105c8a7f2d92a552d6397ef69af029652ba5528df999c569fae32955d1b194b0f7c4475b3fc870656b473386a"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.13"; +}; +mathspic.binfiles = [ + "mathspic" +]; +mathtools = { + revision = 70607; + shortdesc = "Mathematical tools to use with amsmath"; + stripPrefix = 0; + sha512.run = "68ed026c12d7fc07b1d7881654a197e1fabd7bfeae278c3243bbde9449aeef3ecb4e7606e24e964f2cd488e475f39cbb9a632ba077c1229067df883e853186cd"; + sha512.doc = "fa3bbad3d9fa4bf678cbb2254cd2329c515cac6387d17953e66f273a48500f1a04b25b4de4c8a8a94cf79d86572be56bd2ceba01de8c9a72a92844a127b3c8ad"; + sha512.source = "edcb96fc22f68a3cc78b13fbac2f73fa54aea36b6e57b0af12eb7b21a449044eeaca9157caaf9770b0d93f9c2511926452919fda5d03903f36fb5b4e3540b2af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.30"; +}; +matlab-prettifier = { + revision = 34323; + shortdesc = "Pretty-print Matlab source code"; + stripPrefix = 0; + sha512.run = "840d860303925d148c10a980218018ed14e2d0ba2b1638f8328308a0400e8862ced7cd28822fd81c3c3533d2ef4cd37e1c4009065b1300011898fefb407ac202"; + sha512.doc = "22b783fbe09f661d1e5034cb623fab29e54df35b4f0379579f430b17a80236a843c15201b6583bf58f22ae39dba34d7f5a4f8482b1c6d185822940c67ac06942"; + sha512.source = "25daf7d57d376a2a218a48c275b07459b512bb0e6ab95e78969883a3ca26f010c2e3204c0fe9af0922a50b48aa0f87c6b47973cc7adf9678d351faf9e263a9d3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +matrix-skeleton = { + revision = 65013; + shortdesc = "A PGF/TikZ library that simplifies working with multiple matrix nodes"; + stripPrefix = 0; + sha512.run = "55a7bc16ea6afd1e9e623b2fe9e8eea8e7db2a98be58432a296500a246dba7556bb5f79c062b72c0ae957822760ee2494cc3bb2ceba7ab54860f96e87dea53ec"; + sha512.doc = "acf72a0c4e065137df6a803891fc804579e799d5aa3ec2d509f26284e64bb86e52c4c4f287dd87e5d0c1f3f73ef9a13e2af2459223f3441dda2b74588f7f6ec2"; + hasRunfiles = true; + license = [ "isc" ]; + version = "1.1"; +}; +mattens = { + revision = 62326; + shortdesc = "Matrices/tensor typesetting"; + stripPrefix = 0; + sha512.run = "3b58af4da3a0c8abb4499a28e993dc3bf128fc24188bc906d3bed69ba3040aca66d341122cb0e57adb18ccb4320736d7b27423ec8f6f6dacce4fb7bf4bfc5d08"; + sha512.doc = "6139624ff7f8b5063e69c07738e07ae8a1bd1dd48c155b73d17466d4ee5aae25d377e7b7c0726e84e89010d99731d337187ea017f934889843360533c7218c77"; + sha512.source = "d8b01f5c5d7c730e412eb1fc9beb7ffdc60b4b6021968803f24362cf558660074e3d94050878f09513221b6d670ab195b1c2020109e03c9c53c9d485355fe740"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3b"; +}; +maybemath = { + revision = 15878; + shortdesc = "Make math bold or italic according to context"; + stripPrefix = 0; + sha512.run = "32520ff01d76e11bd70694a07b86272425680ca8bf21b6da9412c133836f9ecbc9a9537377ee67cf9292e33dedaa1d33e906b4f681b89f075d1fcbbbbdc989dd"; + sha512.doc = "b0f978f89ebb7f681e7b045d03a9a6e7e9083d7c468c91d52ef417c85d707243fa0ef253b3e2d1f1737a9c7235fefae06c4a8fe2975cf2c13f7f09ada7752f26"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +maze = { + revision = 65508; + shortdesc = "Generate random mazes"; + stripPrefix = 0; + sha512.run = "e09c0b0d00301dc1d90f66e774f6fe0ffb1c4305498f9aa4b41bbf0460940a2570e40bd8359e30d1d521418111ee9c6e6c8e61a6a2efbdaa484d3f8436f44fd4"; + sha512.doc = "cfa47a5d16d4533fdcfdf4ad19c5560fc897da669c4b9bc5a5f7723a6082fcf1b29fbe410117bab9249a526d7c720cab400afec1945b24868f7b73e46690a2ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +mcaption = { + revision = 15878; + shortdesc = "Put captions in the margin"; + stripPrefix = 0; + sha512.run = "c3e1c2948e2687bf720dc05dfa1ed6140a1ea55de3cad7ebcfe518d720ed96793b6bde32fb0882cae773f986b11150482fdfb382391650a8c513131b7041555a"; + sha512.doc = "e803f5731e6ac1c299bc3a42666acb81a75a3f110be729639357a15633e0e7b8ad0a244820b96ae9f8b435d9d1fea54a0b7f14c5db02799b3a632b2f0c5cb4b9"; + sha512.source = "e859c83efb88fa03790b2ddbe18cea57ee489dd59679559f8d7f3b93a0804d93478412414e131f39bece090ed5b3433e2784facbff9b3ad705a81d1adc542e77"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +mceinleger = { + revision = 15878; + shortdesc = "Creating covers for music cassettes"; + stripPrefix = 0; + sha512.run = "0792d7a5289965b2379001a54177e1aed4a3356d8611e52ef77f5097bed1918dac324bdf5c618ca76d2925d11539b623cd9d4016ff0f4d1f9283137816ec145d"; + sha512.doc = "2dab78fd096927e3958d7270ddf15de9350ec30d1d000e7cf92be3b249ccf70e6faa1dce482a07995e65b4a4549693ce3b34d1a63bcc403ebe81f3d1887ecf90"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +mcexam = { + revision = 60481; + shortdesc = "Create randomized Multiple Choice questions"; + stripPrefix = 0; + sha512.run = "3c75869bd0e65798fa451d971ff441f3a42daa0647c31458631c388cd14cbb36fe4f4dc9178e59fdb307de590d201e8716b1a86dc9b995aa184090cbdc95c9d2"; + sha512.doc = "30a7f5cf9b01e8619c95d63ebc2e3dce27beece3a4da6ed4d68843c171257f37d7883969edc94766e065c5bbdd78a2731d38666d2073fd5d77873d5a88b3f820"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +mcf2graph = { + revision = 70167; + shortdesc = "Draw chemical structure diagrams with MetaPost"; + stripPrefix = 0; + sha512.run = "4e243f8410b3ff8688365ff1fc90da5c81adc1a3ea426d2ba92c18a1378f76e5f00bf2f7aa97c39387caec9b1803fe0603632d1197f31fcad4a860dc3b93b579"; + sha512.doc = "ddc7500877bf459121a7ffe242618efdabe2e201da58f9038fe863451456a013816d66b807df74735a6bd1701cb72341bce771489e186b21c404d623d58b8205"; + license = [ "mit" ]; + version = "5.12"; +}; +mcite = { + revision = 18173; + shortdesc = "Multiple items in a single citation"; + stripPrefix = 0; + sha512.run = "71276681ec29d3d77450a8c343d64a1ea734bb48de0d693a4e9ca795e4a4c9a3d5f4103b5641c8684d49b5c95f56bfd08bd12e1d7e37d06f9170008b51804897"; + sha512.doc = "8c5ae4b1beb334ecba3294108345bd616746ee651f03d39a7bd5f5cac97f671a861fb046e29ae7565863aecf4b043ebe25bf9a4180889c39e48735251e430004"; + sha512.source = "9f6e6edf49906bf3300123f8fe265ac8f8580c6838d59f7147e9337e67bff71325ee41a3993b3d1cdc9c036b5d519834261fb0a2a9cfe4d3afdbe070b454af8f"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +mciteplus = { + revision = 31648; + shortdesc = "Enhanced multiple citations"; + stripPrefix = 0; + sha512.run = "5be1980964ea8342321964f0db1c750c33fee9f21724608a260ebed22500d1fcfb0fcb7e588a0dd030a6c534b0da904b8bfc3eb0da7b2df34c0b3f2b1b8fb637"; + sha512.doc = "5e720fc2b32ca00d71ade77fd0a47c6ef44d9b7692a8160ddc55a5f60495a40272a7a0c6c2f5bed923ea10703654f155701d4571d72805c1ef900780a209a0a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +mcmthesis = { + revision = 69538; + shortdesc = "Template designed for MCM/ICM"; + stripPrefix = 0; + sha512.run = "8730424989cd18392214aa59d34b0885fc7966d3b2728fe8a4c05ddd042ce3a0fe54bf0ec6e602a9a7a6ead6df67b653b09c6cc360a14a9bf17bf3dcec3fc2b8"; + sha512.doc = "8beb47651814e5f6268da9d3b40d99e4cf1988d4ea10498d42af648c9e0a37e3e73392ecf91259a3164c06287c8db59392454f49aaeb480e4d5e2b350e7f8c64"; + sha512.source = "318fc5ba9034d304986a77c86f78c31197d5522f8c1471de8d25c7bd4f6c7c38f58a7f5b41420fad24bef7f8ff4fe75e179e4be21dd1270d5b36c57fcb631db5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.3.3"; +}; +mdframed = { + revision = 31075; + shortdesc = "Framed environments that can split at page boundaries"; + stripPrefix = 0; + sha512.run = "0cff0945adc04102e0b0a154cac1f78e9ea903b29e3f880156b888abeb4ca23565d39a7b66d8097c35534baebdf6af152c5b3830d08e1287e8e8d18e8f6344d0"; + sha512.doc = "06822404872899d6f509fa94f69cdcb81dd69866fbc5a82fd54ca361aaf27133140290cec2d08800dbb39c896ebb7cc19dc4cce38d2a0e45de9c658bbadf3352"; + sha512.source = "04fa6379f9840676b4fbc31029f091d9112524f8450747ce31687c9ba77a02e41c25ff51676424e97b788c48bf0bbab690459b6b84e128514cda8efd459255d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9b"; +}; +mdputu = { + revision = 20298; + shortdesc = "Upright digits in Adobe Utopia Italic"; + stripPrefix = 0; + sha512.run = "2720c63845939d2befea3af157eae95d2550a216cd22634ab0a923a06d50b48e7133e914d210c5d3aaae6fd620312d23d2e55a015c2a24ee1881bc7ed4868778"; + sha512.doc = "8c8097552ffa1f11944203e818742bec244abc5a7708207cbb69c46ffc64acaac28ca390c1ee256cd1cf2af093e39189cc9bcf655e948062cd217b58acee7628"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.2"; +}; +mdsymbol = { + revision = 28399; + shortdesc = "Symbol fonts to match Adobe Myriad Pro"; + stripPrefix = 0; + fontMaps = [ + "Map mdsymbol.map" + ]; + sha512.run = "49b52141928fedfdf5fdd63251de182761825a6cdcbf423bff562a863df159ac0d1c001239f777e7aef68ddce23c52407758c70f7da42f066775e204ac8c841d"; + sha512.doc = "ea4ddd0fd65204ec0ed980108d86e97be267ba46c1cf45711c36721bfab9302766ec1d0849b38de75003af564a797f8566def377d8d947d464367bfa40b91399"; + sha512.source = "0b649eba13871f6da834bbfb2c6523db6d50bd6a491b042a19f0e061ce9794d2ca03c39d277669b6698b48806fd0b705f322a69743c4fc50233559fd10406280"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "0.5"; +}; +mdwtools = { + revision = 15878; + shortdesc = "Miscellaneous tools by Mark Wooding"; + stripPrefix = 0; + sha512.run = "bd78773e42fe20cce637a8fbc7c0e3f4f37ed50810190ffcc035a20c83508b6b7de7f7432b7bba8fbd039ba62f43a5b5e1f4839acb3fe62b425b650f23ff71bd"; + sha512.doc = "06c8619d8bcce2c5cf9f5fce65318521bbb0c2ce53acd6b1793d0fe19a8f7a32c36ff68f355b6809491cec365d09f5f14b0589ddcbea6c5b48900d11fda4867f"; + sha512.source = "b3e6ba09116dd83187a55f205527c318d9afb4742404bc21b12e0be3b754140ecba82642154d92947cbc0706f0f9d3e6d876bc27108f13373d3c9d6ede4d7f5c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.05.4"; +}; +mecaso = { + revision = 60346; + shortdesc = "Formulas frequently used in rigid body mechanics"; + stripPrefix = 0; + sha512.run = "b240bfbeda5a18fd24625444403f508e3dffc5b3631a8ff6e88db6aebcc97da3eaa2ebb3ebb0d15b0c1bca0d7f62a72511a00c0ca1870f6d0d3e90398bbc5754"; + sha512.doc = "42744543f456f1c77a30be81b4dc47f69b220d2d0abd8cf7f05ec7136bda9f55f98e63a48cb9b2fb65d6fdb3270bce7a31cbcbece15527d4141bac301dd55963"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.0"; +}; +media4svg = { + revision = 64686; + shortdesc = "Multimedia inclusion for the dvisvgm backend"; + stripPrefix = 0; + sha512.run = "b5f9ffdd5fa9c28b2d4fa71bf7e6b207ca1632d98ee7a9018f2eb84cc602edcb6434917c2cacd2bd51b7f34c893c099e94e9518905700218f03da224a3df2fbc"; + sha512.doc = "50fc60d4bd74cf3c009501d37f02c9cbc98b11a5b498a55edce56801fe3e6b4e247c038525c9c76df108df0d991d797935ba131cf8b74dc27439f75b4a3890f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13"; +}; +media9 = { + revision = 64047; + shortdesc = "Multimedia inclusion package with Adobe Reader-9/X compatibility"; + stripPrefix = 0; + sha512.run = "3eab7f0687395941f6805db51fff943b6bc795a8a5cf2fb2ed9f03f0103b4fef0bfebdf449701a051b72d8f18a8e332ec02f1893812e4be6d31a56980d50a1e4"; + sha512.doc = "e3f97ec8b1fbb345e42f641eb37f6210d4ebc2e791f6ca21af6c7ac7c7f86c149fa874cafe6a2eb1d47508e2a72aded6ea40b381393ae79e9baab5ecded73c6c"; + sha512.source = "907343fbe326e491f543f104ea9335d6c69848b3d4a69469587bc5d417e3a58e2d18567a0377c71a28e8e7ee6d94959ee8a7e632819773692d34b6cc47a3cb09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.25"; +}; +medmath = { + revision = 69510; + shortdesc = "Better medium-size math commands"; + stripPrefix = 0; + sha512.run = "29039ecd484047454355d009688d5ac4ab4ed5d79a90039025454d13985971659b33476cd0306da52c1afa1a5fa87855b37a8c32b072a094abec28af204abfc6"; + sha512.doc = "19f64ba210e9f3b7a03775cbd3de1b9fc1df69b9e29034f0e46a5ca5a480905565ecc484c6fc5b0b5b7eb9bcff79b8faa8a05a0bad1128f7c224ae732c2973f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024E"; +}; +medstarbeamer = { + revision = 38828; + shortdesc = "Beamer document class for MedStar Health Research Institute"; + stripPrefix = 0; + sha512.run = "731eb6f78875aa38a90a228626d7cb5b7129c60085418d7ddadff056c9b82f8db95ee17f20ec8cd4611aa90bec391868f6b0b16fa0eae518358a869b576c150b"; + sha512.doc = "1605cf9ac4eba56059b6e90e6a6e7f3cba9a924df1cf3dcfed300e218bbb71d79bd69b47a5e376da209490a8869061d6de8415e1670b4ac5b0fa977f74d7c035"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +meetingmins = { + revision = 31878; + shortdesc = "Format written minutes of meetings"; + stripPrefix = 0; + sha512.run = "315897eff4ae50257057f8191ff92535b669fb174a2eca5c368a9a4b9f75cd71ad745f3feff1c6863705b3e9e4a954afa449cf56f86bf60c389250842aef5215"; + sha512.doc = "6afbfe02ee39e26e2f38ce462affa66e7e0acf5f26534ff9ace0b26b4e63514a3b1702e34bf478988a50c55fbb09b7d9421a8e79da6a6c46de88c6a958afa874"; + sha512.source = "3f4a274000889e9160943ca0b7a7af30bdbf7aa9a33c8cccd0e938ad3ab94ad8f24a6685bc99596a1046a22d32855061a7c511046dd6c306353c4f5979e1f230"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +membranecomputing = { + revision = 64627; + shortdesc = "Membrane Computing notation"; + stripPrefix = 0; + sha512.run = "831c579f8d66e265125e3a730338d01fe98d87241f2b52c7060ba3f852667a30afe256f37327497ea21e77cbbbee0017f23bd1f51c59f6445b4552e7cfb52ba5"; + sha512.doc = "5b6479efc72f8e06e54d17c5a3ca4e63f0fe942bec8f0a1504365a97b59ea260891f959939165879aab0d23887b98b2ebce8fab4789959d1c2de3b37c3162aa0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.1"; +}; +memdesign = { + revision = 48664; + shortdesc = "Notes on book design"; + stripPrefix = 0; + sha512.run = "42949db3193952d1ae75855110ed40a1ff467b3cef0bb6d43195bac960a0873a47fad002695ad1376da2d4a1df5e1e05f89289102780d27b173da2e852b53cdc"; + sha512.doc = "f4dfa00676379ce33857cc0fdeae867d1ae5c99e6767884a029285a94d2197926a68cd85c574bd876a2eeb85f0453520ef5efcb7f2a71a77c725f8066e7adf8d"; + license = [ "lppl13c" ]; +}; +memexsupp = { + revision = 15878; + shortdesc = "Experimental memoir support"; + stripPrefix = 0; + sha512.run = "74931ebb1a146edadcde19d8c404ff8df750c4eb8f2f59fa83e6da9f8dc6567005d51f58e4b7bd2cdfa6b960adb072e9fee7b1842142076df88887c3c2b41051"; + sha512.doc = "645bb189fca1c74e249745ad42c470dcd5d9fa4412a6dfefbcb6377555047bdbcf005f1c07977762e0026e8a4f8ea49e6965a7d50b0d5d5e7efd0228ac2141a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +memoir = { + revision = 69600; + shortdesc = "Typeset fiction, non-fiction and mathematical books"; + stripPrefix = 0; + sha512.run = "ef905bedb5b27fcc0e65e2b86ce9f949135e0bf4c857431a0af68eaf5a4472e69ffc687d243560d69a3727d8db2388ff9da7c86283e625964ffea677f7e80c0b"; + sha512.doc = "4e2b4f36a5a894ed7579e1018e0ca2309791716fb9e36623237c9c4021441893c634ffabdbb33bc23b63a599d4576bd1ce2f1c549d424c9d87c6df2b12e43a09"; + sha512.source = "31d3120456a4451e955c0476846c057591836de72c76b8de9b421d2e22d7f1018d01073e8f9354ae82d9603ca9fd153a617cf9699b31a1c79254eaf2094503ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.8.2"; +}; +memoirchapterstyles = { + revision = 59766; + shortdesc = "Chapter styles in memoir class"; + stripPrefix = 0; + sha512.run = "0a109f84bc4d908b1d32bfe3ea0591c81f3de757cc5a5cc1aff3e60b1d2fbfec2e8b760fc0d07faf1fec62348933149a03c8c6147fbc5ffddae30b74a131a100"; + sha512.doc = "2f8a20d21dc1db21017435cd58c4ae3ff744b5f5605aafcfef6dfbedb1461a8fbee456ffb8ac1399416f7ae6b8ebec5d59b5d50886182ba5116e22e3768fd530"; + license = [ "lppl13c" ]; + version = "1.7e"; +}; +memoize = { + revision = 69522; + shortdesc = "Externalization of graphics and memoization of compilation results in general"; + sha512.run = "ebe8082704f8276468b392fb0efa92ccd65616fe48296160669ce10b99b31a6d73ccbd9078ecc9c8fa520c31130bc57f3dc8561267ed64d9d6ea14b28a32f909"; + sha512.doc = "635e985c02d8867acebf493cead0e80ea7b481c98c5615cfde781ad850bfbfbf606d2dad5579dfe22085f7947b2976d9e26b397b8509e31fc5018e074f852848"; + hasManpages = true; + sha512.source = "06f1c38900d1daf52ceef138a658937dd85e1cae8280afdaa44e32eb9049ce444970becd3e0936a9f8f732ec8b32120cb55a343f5c8c523e217d8b7172de763d"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +memoize.binfiles = [ + "memoize-clean.pl" + "memoize-clean.py" + "memoize-extract.pl" + "memoize-extract.py" +]; +memory = { + revision = 30452; + shortdesc = "Containers for data in LaTeX"; + stripPrefix = 0; + sha512.run = "9b760613dc36895edf50a592aa5ef994a30117cc9da6ea256835cd3ad9ed62ab8d8c39de95bda5058d1bd3f06451d1c79d78d52ff6d068c28d75410c5ad98516"; + sha512.doc = "479428f1af468d909fa291388cde319aff1ac9ef6d7c0168577c5f6978c0fa7e6b23f8f81dedaf746b7e394c92d51d5799bd17aa3488207be494621b77220cd3"; + sha512.source = "731d4e4c874a58c2c1ddf6a394dd9eb67e557608b0d2a736cb500e4e299be2a726d4312d2eb4a05008684cf5fe14d458a7c020bd31fe134f8208d9fb618b312b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +memorygraphs = { + revision = 49631; + shortdesc = "TikZ styles to typeset graphs of program memory"; + stripPrefix = 0; + sha512.run = "e35c7e727cf5d6e496c9c0e52252b5169670006b9bc9e96b1c95584085d57a3f25cb9464bb55fc4138640ebb6fdb079908cc49c0f1bfff130a509b6866d3eec1"; + sha512.doc = "1c04e25d1c16348e594191c17f9f104e9388bb608b10783927ab3412f2f316138d6b41242046f12853b37560873bb61e0a0ec3f884cf8fc26ae2ba5809b094c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +mendex-doc = { + revision = 62914; + shortdesc = "Documentation for Mendex index processor"; + stripPrefix = 0; + sha512.run = "76f59e31e7d2a4240ab7b258745a7c94b8d78f8e308ad2bcf0ab85fc2d4b0ad77f7e1268014960cd29913bc3a81fdf2d6bbf6a8ab0b0845f2587c3134efb20c0"; + sha512.doc = "1a56d1ceab9536869e6d7da57146bc126f45893bfa998ab42eaddca7c48a9ee9d5b69abb31cf02cb6590d7acab68029f5eacb8547de6e877ed893c5f51acd923"; + sha512.source = "e22c3a7573e8f57d8324d7ca74b3c6b4c716dfa0ea6f43ba3e6eaa63aecf0fe0591ccf9cc4b18984ed2730fc5b9e0b84287bca677717f81c583e0c3c3e0c564c"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +mensa-tex = { + revision = 45997; + shortdesc = "Typeset simple school cafeteria menus"; + stripPrefix = 0; + sha512.run = "c453044a7f744cf89605996d0b913c56208f10c46e26e0ba37a85bb1d63ed08426a18d87cc7841aabcf44231c71dc33a5c858de482c6d48759893066168d5fc8"; + sha512.doc = "8297e3f69517f3bace8f509dfb42616e223073f5d428c2269d9dbeeb53579f105fb65755b22ab552e5635f1267e437c4aaeda284a8325b2d95717cf7adc2de01"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mentis = { + revision = 15878; + shortdesc = "A basis for books to be published by Mentis publishers"; + stripPrefix = 0; + sha512.run = "ee03fae28adbf147945a88548e8223bfe8c8ce220a61726bc6738f34cc90ec776aa468a1cf7fc862d1f7f091cf87964cf665839922819130f3575d56301a5d26"; + sha512.doc = "2e869d1368b807a70f3de5550d2c79f229dbeb8d888a927005fcc43c70644da0ccd36eb2464fa6437c9947c78d59e77c4013824b1e8d5a4bb517b80f1cfb5a8e"; + sha512.source = "10858cb9cb2db0f7db31d371e42436ca001ef20fede5f6b34dca61fa48248383e32547576a2dd3a4a98acddfcaf9e1d3fec89183c48ae76d5b3b677fabda7549"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +menu = { + revision = 15878; + shortdesc = "Typesetting menus"; + stripPrefix = 0; + sha512.run = "2b2560a1df5091d19ff37bcbac1465fbfc54a848e4d19782602d656bf42abe47bd2bb1946f87a127c70725cf508ff9712337f3a8719d1fc0bcd4dab4473c7bc4"; + sha512.doc = "ce8ddeed4e1bd859865f548d8ffc6978a620d9003f908d360e656085f6010a0f179218cc8b2bda4f754685369b53ad59245fef8d8f8a766b241f092162bb76b5"; + sha512.source = "6c96cb64584802af2248bf43ccb7cc5215d8a2d2c13f1d6cf8567934938979095bbd51760bad7892a6d894a9651304dc9f5e4ed038f68ba0af087567de0777ad"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.994"; +}; +menucard = { + revision = 55643; + shortdesc = "Typesetting menu cards with LaTeX"; + stripPrefix = 0; + sha512.run = "2cdbe2b8acdc12e4fc0b7d8a93afacd30ea2a8bef6a3f1766d219227e77cf06d26f1fe24206f15dbfd6d0a7507780955060df1056f14cc546e9a3c781c36f307"; + sha512.doc = "0133f249cdaed1bd565047974868953dce96c4b9ce143cb8c1170194d0ef1b1e6d2e4088004edd831ae0ee1f5e736a1a297bfce75c1bd4b600b3b14a270e746c"; + sha512.source = "d493d78656919b30822bf5e95024b3a85c8912936d2c7835af1ecf50eeb04c81e6262da230241c9bd78f0ca5073a1a4cfca4bcb43ef528b8623f0fc21671d38f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +menukeys = { + revision = 64314; + shortdesc = "Format menu sequences, paths and keystrokes from lists"; + stripPrefix = 0; + sha512.run = "624bc3f2c0cbcf4cceacd555619b5e3932c7c8623e44f4b313390af47143908d019fa7e83d28f8ce94a5e44df40aa73d6823edc931bf8b289d20fc2bf42616b6"; + sha512.doc = "5edf9b9e2accb846aa352046e37af630d997480a3483c53796e56066c1df00798b7615d13bf69d822ed9caa300f6abf624174cf7136caff8fd14c5d23ce2b68c"; + sha512.source = "724478484b110022c6bb591d92829042299226595fe9974a41efe9c6fa9b67c4a1c617690a2518e6bacd1f903bb020c1f815f4c3186ba2ceb185f624a869fabe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6.2"; +}; +mercatormap = { + revision = 56060; + shortdesc = "Spherical Mercator coordinate systems and Web Mercator tile integration"; + stripPrefix = 0; + sha512.run = "552c0fcb0eb72d55c51a2e9e4d055cefa27859d8e1a4410934fbbe6c139b4ddbad7e2444974acf4035fb29cc4bc8c3f76d33ef6c6e73e91e57e4225c102afd9f"; + sha512.doc = "446be6f13150ba3490890b528fe04c8a8080213aa6a5b66fe61e3e58ea4fc0bd03581aa96b0ec355c5ec725187b7b681507f961a9b29350cf07bc19bd2c0fdf1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +merriweather = { + revision = 64452; + shortdesc = "Merriweather and MerriweatherSans fonts, with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map merriweather.map" + ]; + sha512.run = "363cf63b7211464fba6fd7686dc7d1ab6914c64d724128eeaec90b3dac39002c0653a2c54ff6932c8ce1f16577cf27b1e4665a3e1dbe92bbb81e0a15419ae36d"; + sha512.doc = "8762dfd5b3f3443177e0900c434c74d4b8ccca6c8817b1d8353c41ee8310b2299e2fa67113881bb47dd6def3295663aeeefafb15d7b808def000b6e253ac2d3f"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +messagepassing = { + revision = 69123; + shortdesc = "Draw diagrams to represent communication protocols"; + stripPrefix = 0; + sha512.run = "8a2243bb9b788a4dbb1caf14368fdd4df3919d9d407b65f2d4f49af16a341a030bd9114f86078623760dc3ee5db060060c58c6f675f4e8bdbc3c1c7c9b7a1d3e"; + sha512.doc = "c26c14eccc615a306b8ebe1a5c80a09249d5ba8668a34e2f7141b034df70634a277ad94078f2f50e51e53c514340571f9cb766232c3e2dc0ef5dc28336ec4e4d"; + sha512.source = "6ed92b15d4f17613ba540069b4d5f4bae5b7ce2850594377ecebeed76b92c61f672da8f95628d46db87dc9b44ef7dc9c8561736bcc9500d1951f523dd43d7378"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +metafont = { + revision = 66186; + shortdesc = "A system for specifying fonts"; + deps = [ + "kpathsea" + "modes" + ]; + formats = [ + { + name = "mf"; + engine = "mf-nowin"; + options = "-translate-file=cp227.tcx mf.ini"; + fmttriggers = [ "modes" ]; + } + ]; + sha512.run = "2ba715c32631b3ce24aba65e7e1df90a7beabc52b855f5e81cd383f94399e439a344f8a8a21f38648d34d546ca8f1890a74922836557cae5cd05ac945013d71e"; + sha512.doc = "48b1def32bfba5ab1123712fe41d69f979e33a77456801c21f030de8a39b37fcae179db44a517d7b194d7e6e6eb93d770e179ca49db9014cd433c86ef91b07d0"; + hasManpages = true; + hasRunfiles = true; + license = [ "knuth" ]; + version = "2.71828182"; +}; +metafont-beginners = { + revision = 29803; + shortdesc = "An introductory tutorial for Metafont"; + stripPrefix = 0; + sha512.run = "39352d8b181f3010fd4dbfbfad18a8cd3f68f0c38bdb89996ea4c77a649acbbd15e9a7fa318193db08733b3722a07a8ebfb17a6430bcc9af8101dc444608d75b"; + sha512.doc = "4fb7148b0668845447fd38411df0288972312a56897b1d5bce69a7e57ae632aacd12c273a911045204705a5534ac1d1c290af08a7057bd62184a59eb7146feb6"; + license = [ "publicDomain" ]; +}; +metafont.binfiles = [ + "inimf" + "mf" + "mf-nowin" +]; +metago = { + revision = 15878; + shortdesc = "MetaPost output of Go positions"; + stripPrefix = 0; + sha512.run = "e7b3661d99ea50f7b20fe3af370e59e960fc0599409b5c11bfc9618c12c38e44b89e4e81d69ae7ba5e2565e46078ee52ed0bef46aa619408b386bb73926caeb7"; + sha512.doc = "8396725c0afc87c63d16256d5ab0d575a19f05d78ed245099a60785f0810a012e8c0026cf13d03781d09d7c0007bb9ed9b87072ed732ba706c893e5465461052"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +metalogo = { + revision = 18611; + shortdesc = "Extended TeX logo macros"; + stripPrefix = 0; + sha512.run = "20d5a9b8454166535aa3aa80da7d2931937fc6a4d730c1ab70c856311c223d466e9fce2ed6e3b2fbf4b4fc75778d7d4c2649111df5f92dd58b6fc42b3ec72696"; + sha512.doc = "48318b396e4e227dc1b80e21474a296ba4dfd37e81b95f9669dd8c96ca7318abd8a1e21ceb95e0ca7832ed64a85ede985fae7e2e52b3aa742c64b86e54fc563c"; + sha512.source = "bf240b77ef00d5351218674baf851b0eabcb22257fd6ce9dbd6b66afec5323a730df7b27d522f5130830ecf92af377edb3ec7906be206e760971dbe8f6266942"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12"; +}; +metalogox = { + revision = 70496; + shortdesc = "Adjust TeX logos, with font detection"; + stripPrefix = 0; + sha512.run = "b78976ad7e84e59ecca68c0e7ecb496f99f4e50ed5e1636b5675bb0c290f3f4d4d00b02dfe55c78ff4c5ae936e19c8110cdbc1fa76fefc1ee8b31a2c481625bb"; + sha512.doc = "64211eefedc7175e4859deefaaf89d021763b76cfa3509c8f6da27017993012471b3b894949d3c70eb1f5286bbbc545c712b041440e05df46bbe0ea82eb090fe"; + sha512.source = "89d9eb81eb883c8aec531117b0a62b838e8a1b0b9396eff4ad690aff37363aad31d6ef045621736e2961977c40e96fc54b4a72aa291863465318fc89b9c5006b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.06"; +}; +metanorma = { + revision = 55010; + shortdesc = "Write Metanorma standardization documents using LaTe"; + stripPrefix = 0; + sha512.run = "e9ca6b583cfc64ee78abdfca2520083dc231afd7bcc0b1b8373273c23da3f3bb961bad04d752cca38113d3a4d8e1ce54b401b96ea29e00e78be97d73bc528b4f"; + sha512.doc = "3750e580e3d7d0d69515e0de7a88a161cd8e7092af41be10fb4092cb519ecfebfef900e691d0c92ceb95df236cf040b2a314d54bfd8a6f7a09cb3c9585f15a32"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.5.0"; +}; +metaobj = { + revision = 15878; + shortdesc = "MetaPost package providing high-level objects"; + stripPrefix = 0; + sha512.run = "cf587c174e44da9496ece876bfcb8330bc52173cc3bd6d1b1351efc75a7c333ed8c7cbd41c079d492947a1ee43d8043fabebc80b4c7a5d348eb054e82c704e3b"; + sha512.doc = "0bfe1fa6a4b3a8923cfbe9bdc4fa1b27567df66365db447346fdcc739675d1d815515e09fbe96f44369643c38e6a8007a0f8d089ed8504020fe0a0e2a795ea9a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.93"; +}; +metaplot = { + revision = 15878; + shortdesc = "Plot-manipulation macros for use in MetaPost"; + stripPrefix = 0; + sha512.run = "eb083316720a5d7379c0ef7c1afa0e82ea5df63a3a98200b7041637a6fa47aa33dc20a265e05bdbc63abfc375e6b59fa199d4091875c057a044821c557963dab"; + sha512.doc = "1732b5a572a3d4c0a646308d3c102be29de845030a624763dd6075a44a739a29e65fd9f224229eed6dbe8dfc6b590a3df1cc07c184881dcd2f3dc5b0642a48dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +metapost = { + revision = 66815; + shortdesc = "A development of Metafont for creating graphics"; + deps = [ + "kpathsea" + ]; + fontMaps = [ + "Map troff-updmap.map" + ]; + sha512.run = "fb50b9d45a36cbe11d07fe2d0a1307bf257132e195825a2007894d5accb33ae1d10e0ca6d6a27405e79d3c439fca4dc1df00f21814eb530ac3707ca516bb9a0a"; + sha512.doc = "6b10e2a6183e6c7b9515ebfa0186b13d48bd87fb25cb69b010ac82b885fbb1f88f31340f7161e34f61cfa7478d50ebad6e82eddb14d8c746ef1bd4c480fe4b58"; + hasManpages = true; + hasRunfiles = true; + license = [ "lgpl2" ]; +}; +metapost-colorbrewer = { + revision = 48753; + shortdesc = "An implementation of the colorbrewer2.org colours for MetaPost"; + stripPrefix = 0; + sha512.run = "e59dd121f9a176e628697e31b720507723867a0b7b68b73531aa825bb02b07d04ff705bdfbeb369fe3a2d304f4c6c5aad3f823aaa4c82257540f1459cf099cb1"; + sha512.doc = "59f17d78ef78a142bde5783996f149b3a7c740c2b3ec6f90133115ebddcf6c460dada543482f5379872054a74eb772bab8afd96fa48b2484f7932a478b8bde2d"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; +}; +metapost-examples = { + revision = 15878; + shortdesc = "Example drawings using MetaPost"; + stripPrefix = 0; + sha512.run = "95942b1b110e65274839ba01c16fed3e63a0ac99aa564d7a000bc9d9a0f5625ddc1dca13e786d0721bf93e76410722d4d76c86a05297bc39cd9af6dc91c2e6f8"; + sha512.doc = "2a3aec80b511864878e07ff973e17ed4fe1aec692c7e6983b57dde586aa19500cdd373687b0e081dc80c8584f116f0fa3de7ed4f09ba232eee8adce5e998c954"; + license = [ "free" ]; +}; +metapost.binfiles = [ + "dvitomp" + "mfplain" + "mpost" + "r-mpost" +]; +metastr = { + revision = 56246; + shortdesc = "Store and compose strings"; + stripPrefix = 0; + sha512.run = "fb3a0484636e17b763c1229eee4736a13820a852d977b11d9e8672e08a8ab2f9438bba0ed53286dfc5b1422adef1cfc1c393d1eeda5d3172848c051d6aacd211"; + sha512.doc = "367ccc05eb31c50519e7324093759d6452081075d7e9435cb9e37e9787fd35666c1c18c822bfbff2b6dba0b312cee727ce8b7fa94ed627eb439c3c00e5b3d4e6"; + sha512.source = "904c3cdfcade4637a16366bf511094f4a33cd2614ee3f47bcf4cae7c2ffc0d0758633a8ff556ef9494eddf76969b235ae599e1df28bf9cc7537ddddfe33db157"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +metatex = { + revision = 15878; + shortdesc = "Incorporate Metafont pictures in TeX source"; + stripPrefix = 0; + sha512.run = "8d438cf0f3bd375c169681b242b7f00dca96cd3bcfb167c6aa664e27dba59eefb53a6d28ef537802d584b17bc578b1d63ca25799146ee6d986bc647ae1b0af2d"; + sha512.doc = "3c2918a3bbb30b4abe2395baf32ed2fd5fb1ce3541f86250f0c4037aeb127fe7e90cfced87144d564813a437b39b184503ea9a2c0c61b979907db74d91860677"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +metatype1 = { + revision = 37105; + shortdesc = "Generate Type 1 fonts from MetaPost"; + stripPrefix = 0; + sha512.run = "1dc34e3f826ebf09c6f3baf358aa0e5ee4ecbe86e2f82a7da12c706f443f5eba7fd8582bf46612b2fa3588515dac34c49d47cfa2b9c3ae905cc51dbe7779eb28"; + sha512.source = "26f891bb5a62da78763df29f1d9caf26588c6dff57e063eb445ae23a5dfd7108956068de991bbb514ee394c49d4ad119d4a0fdb5398aad48d9be223b8f13d388"; + license = [ "publicDomain" ]; + version = "0.56"; +}; +metauml = { + revision = 49923; + shortdesc = "MetaPost library for typesetting UML diagrams"; + stripPrefix = 0; + sha512.run = "96773f0d0e2788d13738930fa1aa727c7ca2edee020f3848326d7be3533c177ac977564aed533c59695b1e6c4c65e191784cbc3e7e70becdd651cd702b462ef5"; + sha512.doc = "6c649c32111a6350d36c69405fc272a917144be429bd84c0f118a74e1232c06744e66fb6647c5a742f58c6c78b46830a1484bbed3a9a962380ece6b16c555169"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2.6"; +}; +method = { + revision = 17485; + shortdesc = "Typeset method and variable declarations"; + stripPrefix = 0; + sha512.run = "9b71ed52073f831431ef6a3a81afe7efac97a6dd39d772b8f48cfa639dfec01411a5654830fcbaef6a3bef7aeb718bbbc38cbd18c592a080e67175dabc7e9919"; + sha512.doc = "2a211d1325322bfaf57c81a534f29fde51ef2e0dad8d7697c3af9fe10745c5f6245bb689b65d54c39a66b34ccec69d055f201aba34b2a4957ce2fea0827eab45"; + sha512.source = "ba90537e63493073509e9407aeecb28797370d75aada1835d5fbbbf991ea9b933226950765b61ab831a708d5fddc10c2fccd624d2872148bb77759a3595cd275"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +metre = { + revision = 18489; + shortdesc = "Support for the work of classicists"; + stripPrefix = 0; + sha512.run = "29d99fe061c828b4eef12047215451eaf6d603106b0ebb0b7c83c8f8b5ffd360160e29a0c86bc0cd329e6f694efae695ef03282885e872cf26c8177f951b705b"; + sha512.doc = "73ca10e1d2b32d4f7b37de6c409b68dc38b3dd165f47f52714c3a17e7a5dc6c1562928e7a7f8c5a3ed9aadfe1324e451baf6cda5dce69043fef3811cb6ff8cf7"; + sha512.source = "d11bfb161dd68208b4f4e29b67131618a02cb60f4e87c3f2809759ab42c44603e790876ea84c6c9f4f053c3cac1bf189344110ff5b4acdc97d7ddfe4c466c977"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +metrix = { + revision = 52323; + shortdesc = "Typeset metric marks for Latin text"; + stripPrefix = 0; + sha512.run = "00cbb4d0cd9417c57ae2cf701f0a485d296e17b95eb56a7a3b0acf328c4eadf3d8ddb7d4c3442ea26ef019dd4a6b5c95af9f718cd4e31b5e5d29301ce8e82edc"; + sha512.doc = "e5f8654272e8a85366c226113d3815ffb1e539237bdace71da55e30864f8c746162ce1b3f3023e3e62616b286145157816aedc871c6c42dcd3d4b76092d8ea46"; + sha512.source = "51a355ceccac5ff53cc98baf6d8fb3c36949f620a51191899d272ecca9671819c740703af1c47856b4c171757de68df839959388c2d87b2f43f54aaaf219b7a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +metsymb = { + revision = 68175; + shortdesc = "The package provides dedicated TeX commands to generate (vectorial) meteorological symbols"; + stripPrefix = 0; + fontMaps = [ + "Map metsymb.map" + ]; + sha512.run = "02864640550428b4869f0682d5571f463d21089f85e4e03336890cd7d37d08b9ec89b9bdc7b09b0f3ff5ea8bd612acfc2974655439fdcc5b617846d5f3d1c2a4"; + sha512.doc = "a3afc302c345de9e00f89f6e0781d4763d4ca5461f498e2cedcd0ee0494483db9cf7cd0ceb68823e7b1806caebc85a22751d5d4ce3b8041968036c8b2514e5d7"; + sha512.source = "29ccd5eb8915077ca09b568c7fd1924d61243266dc2fdfebba00691bb35a0dd908f2311caee865a044a78a9e485f78a4b91065c8d17f08b13420bdcf1b64a05f"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.2.0"; +}; +mex = { + revision = 58661; + shortdesc = "Polish formats for TeX"; + deps = [ + "enctex" + "hyph-utf8" + "hyphen-base" + "hyphen-polish" + "knuth-lib" + "pdftex" + "pl" + "plain" + "tex" + "tex-ini-files" + "utf8mex" + ]; + formats = [ + { + name = "mex"; + engine = "pdftex"; + patterns = [ "mexconf.tex" ]; + options = "-translate-file=cp227.tcx *mex.ini"; + fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" ]; + } + { + name = "pdfmex"; + engine = "pdftex"; + patterns = [ "mexconf.tex" ]; + options = "-translate-file=cp227.tcx *pdfmex.ini"; + fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" ]; + } + { + name = "utf8mex"; + engine = "pdftex"; + patterns = [ "mexconf.tex" ]; + options = "-enc *utf8mex.ini"; + fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" "enctex" "utf8mex" ]; + } + ]; + sha512.run = "a79d6a1ecb15f7962826773d7eab4b1ffd86a5c15f8076f096fecf63df1bd661449eb7d14251a57a1eb2bede030ddf93aac170fc3c59ae0a124da6cef69e55be"; + sha512.doc = "091f2825376718d8c2190555af7ef54d0ae5202425d57b986fba861df2f8604301df5a121ccfcfcdc91032d07dcda8289fb8de5d81c487b93b0e202a2a5a658e"; + sha512.source = "6f20a7e4f80670f7dfe5b2cfe3357a5d16b0f627b5e9e95c2d7d46598e00b989d5ae8c797589c56c594b7d3610f5f79cad42f3bb64a628be968e4e9e5d541e98"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "1.05a"; +}; +mex.binfiles = [ + "mex" + "pdfmex" + "utf8mex" +]; +mf2pt1 = { + revision = 61217; + shortdesc = "Convert stylized Metafont to PostScript Type 1"; + sha512.run = "ca93a3ae439f9cd8029720bd1d90fbe75a403e7ab4ebcbe1ba1e5a7a28aa9269197f90a4aee849fea59d734d5dc38f04eedc140ff1be64fd805a10ab5510a2f5"; + sha512.doc = "6c10831fdcc48d25645be675fbf5da29da945bd79032c60e73e04a39d61c287a64e7b884381ac0b08e48f5dc9b6dec27efea874f6e13d6e4a5e3f32c22fa3ce2"; + hasInfo = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +mf2pt1.binfiles = [ + "mf2pt1" +]; +mfirstuc = { + revision = 64743; + shortdesc = "Uppercase the first letter of a word"; + stripPrefix = 0; + sha512.run = "2fde98490744da1823c5d90b8fabaa9c02d33f3f974fc7f0f6b8ddae4d8ec86f563a4fb491644d53a13b8632fbca2c7768970eea018c6112dc76d21307d89166"; + sha512.doc = "43fd4ec0bc778fc110c0002ebd8a1fd25374d9167c8b64857b29bc3642870c89f02deb406378bfa0fbc46825af6fc6622a1029880189f37d58efea74a983f5a3"; + sha512.source = "cd46a05b9b90c3e703c5970ac46b8fd59d94dcdb83dfd38a1038bb2197ebd0b8a89ef9582dabf1ee8665abba4905548706fcc08ced7966fadaedb333bae968db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.08"; +}; +mflogo = { + revision = 42428; + shortdesc = "LaTeX support for Metafont logo fonts"; + stripPrefix = 0; + sha512.run = "a1c5168e37fd9cbe5fc2714ee43143f36cec662441a7a9d33085652a5d6f769838d351faf416df6fda78529b5f8712f1a056afa47577fe925dcca5249f1fda38"; + sha512.doc = "6d1dabc636d22c824838a82da83a4676b20bb8a55dd1ab5628d00b4543096f91d234a51a312eb83544891910d923650f09e8911ec9db668f411735de6ef5bf3f"; + sha512.source = "7078092cdbcba668ebb440ca6214eb155221427ceaf4d1f574d1055d2f1f52d288cfc0f1d2212f2a62903e447c4aeb378fade068ab901833ab9c251b1890e15a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +mflogo-font = { + revision = 54512; + shortdesc = "Metafont logo font"; + stripPrefix = 0; + fontMaps = [ + "MixedMap mflogo.map" + ]; + sha512.run = "4b2552a2f38c68c755f3966aedee8e054af48e0b0a61267d7a4b1a29a4bd6be15c8754d657a2f08d88dcd42a03ed768d336747d2c35107b4dd2d5bb0e1f649aa"; + sha512.doc = "8ce49b7bf7bdbc46589da02c461f98746e13e13f19eb79af1c2ede084174204c128b27f88e164d5192415b6f464238e7f04fe95fe8e0873ce8aac84bc1e56713"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "1.002"; +}; +mflua = { + revision = 62774; + shortdesc = "configuration and base files for MFLua"; + deps = [ + "luatex" + "metafont" + ]; + formats = [ + { + name = "mflua"; + engine = "mflua-nowin"; + options = "mf.ini"; + fmttriggers = [ "luatex" "metafont" ]; + enabled = false; + } + ]; + sha512.run = "fa735fa117e7bd433339efbb709caa5fc25007088500dd5e4f6999cc417d188fd43435f74d526186880ac857f9bfc52e1fb7f1055974cea959e28536150b1a19"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; +}; +mflua.binfiles = [ + "mflua" + "mflua-nowin" + "mfluajit" + "mfluajit-nowin" +]; +mfnfss = { + revision = 46036; + shortdesc = "Packages to typeset oldgerman and pandora fonts in LaTeX"; + stripPrefix = 0; + sha512.run = "33206fb4cb7ce8f18050d713be415abb95323599270b2b91c886e2ac3f24a58786a480e5d4d1ad6ad2083456231eacf94dc769b26e6cae7288e996c6e14bea29"; + sha512.doc = "f8421e58ede77c8817679fcdcb43fecfc519427b3cb93ed2594fef5c8ac8124e0563a2182803a2a6bc417982df298abc7fe092f1cae5ed7583e2fa6fe94c8345"; + sha512.source = "2bd5aee80abf38884cc4a3ad6d6226243a6ffe0d2e879101aee56168a10cd0c7293eec7ccf53c7a7e8087ca94398e3f4ef38d71ccbbfe48677ffee3f8b813bc9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mfpic = { + revision = 28444; + shortdesc = "Draw Metafont/post pictures from (La)TeX commands"; + stripPrefix = 0; + sha512.run = "361983a020165d094bcd0fc9616be74bd2b5c72542b1e1b257b5ec42ac6be1175caf59c79e156da2bf6fecfe3746b4e33a4a8fc978eb124939ce0ffd2c383081"; + sha512.doc = "97ec26cc1ed8e181c7d69af264204772c9075e3650044b58cad938fd6918f9cbf5c849699e31846f437e41410492b67668a7ec33e848cf6b5fb9c2d52d7a7947"; + sha512.source = "609b960a70d47edbb814c981c5cb03b91fd19e905f8caed599be2488e0ed9ef0bfe01af79353015e0d6dd2fcda6810bde10ec4d8e993356bb7371ed2805988c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +mfpic4ode = { + revision = 17745; + shortdesc = "Macros to draw direction fields and solutions of ODEs"; + stripPrefix = 0; + sha512.run = "4f3a314afb6b1f8c4fb07421244f2a05747f5d24194659053c561ba24ed90f325e82ab9d97981af6455081580f75e9e8f75d11f06aef9e1c027ed0f9bf17696b"; + sha512.doc = "9d5f38873cd94fc3248b619f68e04bdb1824eb1249cf02e555a60c3e84dcab78d3e04f9451e1803943e898ed7f55e33615f673da8c58569219650976c25f0ae4"; + sha512.source = "b5de6dee490578bc460f76ccb606b5d62d4f6f2c43e2f9967085f1a323ba287cfc596da70905a40e1ac602074323940a9e42ba8096a9a35190ca280217b2e10e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +mftinc = { + revision = 15878; + shortdesc = "Pretty-print Metafont source"; + stripPrefix = 0; + sha512.run = "64fa5f38398a626d5a351be7ad866c75feb4549f836932dc936cb99f921e7b8abe5b3d6fc1e1e6c427344606ee5dacaf067d8678e7b199fa1ff8d5c94cbffa49"; + sha512.doc = "0846744cfd86bbcd8b6ad90d58bfe5788a79f43d05f3cf6f438fdef50cc4872ad8ec4d32005ced9ea9c424f3e86a799d79b0baf2a9544a3018531a99cd81fd5e"; + sha512.source = "50ca90a2f48970b3cca5552a361337ed138b4a9e31bca2766eb429cdceac2a09adc1cafa6c444c514fabe71c38ed82a63b847e1da014f2c131a15c362efaf09f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +mfware = { + revision = 66186; + shortdesc = "Supporting tools for use with Metafont"; + sha512.run = "f14b1f8876f8a4f2ba8954459c2a3739e0537d800fc1fde11aaaaa61400c18b9419edd3c7884ecac499da3efbd5219244c06ccab1efe17674b5458b464abd3ea"; + sha512.doc = "ec469dc655be20598ae40cdccd8360252cb216039cfcdfaab5f45d0276fee272a463f19db7f98f6d35b3e6930098536fe8eb4a453161646aa0ed33dd3f8773db"; + hasManpages = true; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +mfware.binfiles = [ + "gftodvi" + "gftopk" + "gftype" + "mft" + "pktogf" + "pktype" +]; +mgltex = { + revision = 63255; + shortdesc = "High-quality graphics from MGL scripts embedded in LaTeX documents"; + stripPrefix = 0; + sha512.run = "920784d4332e4e1635e089878a55848ef4ad82a7b23e24a1bc81f71a08bb7af411ea54710533bf1f429e506c4ca5e94855c73d890929dc558274e108155e1a71"; + sha512.doc = "a8954ba22a30368ce01329b930486c02b317375636d85c7fdb7f14cf032173ab3f7a28ff6261d20cebdb8995560d4c7f41c03ed6285cfcaa555d405a06891432"; + sha512.source = "63b874341f2e18f88862ec5e6cf7064e9d4219070d274f0daa2dbacf8eb0eee5b4206167bd86520d10ffa0316d7ffe93615604932924b4cc04936db352073d1c"; + hasRunfiles = true; + license = [ "gpl3Only" "cc-by-sa-30" ]; + version = "4.2"; +}; +mhchem = { + revision = 69639; + shortdesc = "Typeset chemical formulae/equations and H and P statements"; + stripPrefix = 0; + deps = [ + "amsmath" + "chemgreek" + "graphics" + "l3kernel" + "l3packages" + "tools" + ]; + sha512.run = "5b85541e565ad80891ba56375bb3c2d6720c7e0acc9e96d611626eace4daafeb078fe08fe4e6db4875823bf570f8af1dd4b319d38b41fc4c3ae9696772e7996a"; + sha512.doc = "487a5d90782d1c0814c7110388e5277e70dff9adc82048f8b5c33ffbf8c82e9df73293b4ab78bc83c2ef23674e341a2fb15f6b3268d1fdff1aa57d4d3813ea1e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mhequ = { + revision = 64978; + shortdesc = "Multicolumn equations, tags, labels, sub-numbering"; + stripPrefix = 0; + sha512.run = "bf1e2b11a9b4930a9ac364ad1b6e6f6097f346494196ef64fcb76dce00c9d3c3d145e852ddf321c0c8ee7444d52656e2db27e6a80c97b4c18c5fae283b8fd88a"; + sha512.doc = "aee8ac5b73692b37a9f0541c07787eef3dc173996c92aca250c35227f095416dace1e18be9fe6f2ae955610dcca9fea031a6b787fd2185138d7668d0cd269caa"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.72"; +}; +mi-solns = { + revision = 49651; + shortdesc = "Extract solutions from exercises and quizzes"; + stripPrefix = 0; + sha512.run = "ac5beb872c78675bc9df379f8a2afe533647a1c39781c57fed2cec6e610cafbbb45a4fdcbd9826cb123a584e121ff752633d6c990109bb1f619b1d9fac6906de"; + sha512.doc = "cfd36e0a1476e0d148fb36f350ec236d57beb2c0b27f08eb56f69683790b16425a6f95b4f93a010fe0d450863fb34a7eb31b1c8e40fbe5319df128439dfa5372"; + sha512.source = "cf41fb6338270f2fbf56b33b9d0b3b6904f06a84b99dc8fc0613e10644b3f198b22634cd82b78bd50b236415ec6b8d46c9d0d99728480782459f514d2086426c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.6"; +}; +miama = { + revision = 54512; + shortdesc = "The Miama Nueva handwriting font with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map miama.map" + ]; + sha512.run = "b9a5416b1de4cb487575894f3dacac8b07eda2b37b90fa0c5ca0ebc5d9d412c896fb7cd028c6af5627368c44d442670990949c9ceb9fe3a60179d3f70874135a"; + sha512.doc = "a76db9f49bcdc225d9206ebaa3b7ca42bc7148a44d1d66b72d2033b68fe9a1137eec265316d3a24077e3e3712687e80ea948d4f1c9cd819e6a4afb8c9bbf91df"; + sha512.source = "2b9e1a649f944ce6b36b1dc09d28112f7d5ea3c0a26a1f292576448171aa2f51449988ce85703ba7c2098f6dce62093ccf5af256bff1993268f31dc884bd3b63"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.1"; +}; +microtype = { + revision = 66587; + shortdesc = "Subliminal refinements towards typographical perfection"; + stripPrefix = 0; + sha512.run = "c80e6bb2c13432ecae2be22622e3bbfe82342ca138f61870cb8f3c2d7ec93f431bee5ae0a9619d4ad6a842b0752ecb73131452d6ac5c5fba7732ad4d5c979fa6"; + sha512.doc = "6f7eb5d18fc2864c0bff52f7af82b3284766cef64d2ba8f4aa9f2f6d26af3e47e3be9d486f29e646e92ca597cc1129dacb5d1c03dbe155503ae046e4badbecf7"; + sha512.source = "77d5f0e22a97ac0291e891df206618460a2672fc36c79a91db2b5212092d65acb0e1cbe0ecf82e0a31704baef207a48f817b5fa65abc4d6e6c031acdd85ed602"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1a"; +}; +microtype-de = { + revision = 54080; + shortdesc = "Translation into German of the documentation of microtype"; + stripPrefix = 0; + sha512.run = "cde294b4dd73d5948ef16b314e70745eb98bed30b4343c04885686533e2457a4aee07616e84eba6b0a552fb342331114de835d777d882308bdc1dba75927b17f"; + sha512.doc = "fa524a0225a57fc60bbad95cdd7855f4ba73691a6787c906ef5091183425a650f583340d65ce8b11792046c767b0b31e5131c62dcc281898457234134aec291b"; + license = [ "lppl13c" ]; + version = "2.4"; +}; +midnight = { + revision = 15878; + shortdesc = "A set of useful macro tools"; + stripPrefix = 0; + sha512.run = "8f8bf1d8d3c5c12147dd61a4d65d311552877a9f5eb7ebcce71602dc69ed5459187134d3a1e346a15255f2c4ba57f054c3d020817df0d5d89c7fc2f216b19cc3"; + sha512.doc = "0c594cac3c7e8d3064145f1b2b088d74a5445b7a7506fc2629b3df6f63419b025779e348116f7dbc859d7c406d87e5b5988d529e5da61d01b0759b0f0fec2382"; + hasRunfiles = true; + license = [ "free" ]; +}; +midpage = { + revision = 17484; + shortdesc = "Environment for vertical centring"; + stripPrefix = 0; + sha512.run = "9a13760b776cdce28cf3eb1e28e957265d7d4e83b23234f1590285bc83409f1d5b09040fc6cacd3b9f7a5ec2f61a4e5431fea92a5fcf20032c7bb919ed59612b"; + sha512.doc = "25f41bb8cb12c6d310da66d36032eb4933248f0c84a67216cd0981fda7e61343c0dee03e96f522bddf969e925e6cf495754e52e863672f1cab4e94ae3b0400cd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +miller = { + revision = 18789; + shortdesc = "Typeset miller indices"; + stripPrefix = 0; + sha512.run = "a1415d82a2a81c3dccdea1b59c4c0e8d2cb3902dbc6816cf7615fa3e571de26168a6a066f52bad94c38595102afcd1447721095bd084befc20b3fb3ad420e129"; + sha512.doc = "3f888fed2b909c269ead9e5191a788828048a21103c881a9b769fb0e8a3c0f3e6c41467827143f6b79a45d2497e3ac21d5c6da8727be3c987ab8a1fdbcec59ca"; + sha512.source = "06e15ff6c146685a8b4d13c5d4e23de4ea343afe684924694f86104f362df7dfaa975b25e850b685e05efeeddf2ed079038cafff8a495116f27dd756e4dceab3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +milog = { + revision = 41610; + shortdesc = "A LaTeX class for fulfilling the documentation duties according to the German minimum wage law MiLoG"; + stripPrefix = 0; + sha512.run = "126942c7be2217843d5dd0a6a927d1a47537ced3b1a083caa54b4905625b57238cc0a3a8d1652da076144b8c2469f418077eb4051527e5d351c2d95f3d3a5f79"; + sha512.doc = "251b73ab0f52ff2672733c3855289e012965151e07ff447da373bea083b1ff6bfeff38adef72419f03ca153545fdb90bb18f3aa254fa7b59d3c5c061ec5d15ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +milsymb = { + revision = 66697; + shortdesc = "LaTeX package for TikZ based drawing of military symbols as per NATO APP-6(C)"; + stripPrefix = 0; + sha512.run = "fdd01cd6a9a5b27ceb741ba689a82f1e695132d78b59c818fcf2e3ce63526109173b978246b1b556e355237ce456b6f632effd555c27b3096ecc1cd5f5bd22ed"; + sha512.doc = "7baa8152b3968047e66990eeeb94b601a0667a7db598a4403930328f6fa18595c46979772b8b496dd7b076e99e19969d22c8a3f4f19d3b82f01bd84bfa920db7"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.03"; +}; +mindflow = { + revision = 65236; + shortdesc = "Write your ideas in a clear way"; + stripPrefix = 0; + sha512.run = "35d1b4fd39bb64fb1e9c89ebaf33d54051f0f550967362dee15294aeac0066f92b0437e688b5065795dc19a680a9f26c99cb1647c3ddacbe0054ecf553c2f9eb"; + sha512.doc = "4ad9f6c4e024f782dd1f0ec2e4847c45690c4c39410395cc4fb122f340b2dba0dbea5664f65640d2fc53ea301bba9e5758c7e29f3556511e307b6c0c2c46653e"; + sha512.source = "1a267ca0f437c707ba05b65aa4355ad721aa2de26518143aae4e752ce1dc69d12f6e4b42b670c032d82ae15f5a6753cbc29f56bc44f4bb48d63ff6dc0afb9e1c"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +minibox = { + revision = 30914; + shortdesc = "A simple type of box for LaTeX"; + stripPrefix = 0; + sha512.run = "18d409728f57cc2e423b5c74ad7ff4a9e93f2405497a96024769fb01f7604e019d914365f82fa5908bb679ce4a48cab64fd4435b531ef72235067481b8dbc96b"; + sha512.doc = "0404b375fb0ef258d0e5acb8e7a78a60a55d08ce7339b9b63b1711dcc6d40b6f302b0f35f7d1fc8bfbf431b66bb5aaa2c94e92ee8e788a5f2156031425c0c4a3"; + sha512.source = "6aafb14003afb2ee18390391e15fb00f73a16f568158d72fea348e7052bf1ec5f25cd446569bb3c6dd815577fca7b2522d4474681b560ee3ea65b6053509df92"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2a"; +}; +minidocument = { + revision = 43752; + shortdesc = "Creates miniature documents inside other LaTeX documents"; + stripPrefix = 0; + sha512.run = "33a7938dc25833faef05245d00219ad4d94902d1b5a8f63de8c08448da1f4ddd8e305cd261a3051df919b097f0b3b82081b57fa420e773dc89a1c8cb801ba463"; + sha512.doc = "03ac398f6f8e79003b155434992a53b1485032ef779e5fa05a43adf7528fec1966ba94731ab2fc11cdfadce51bfca6ca9d1a88f882ca87f08d8e4077896af4c3"; + sha512.source = "556f1c482366f1bf2bd6e2f4e92f0fb811d97e91e057994605a2794f9441f2df35bcd2e2dc4d6218e980e921b7d7a03e5ea2613b6d27d8258985521ecde2dbf0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +minifp = { + revision = 32559; + shortdesc = "Fixed-point real computations to 8 decimals"; + stripPrefix = 0; + sha512.run = "412bbd3466eee82a99b43d6f4a5998a0a22b20c2d51621368ecba1084010a5333bda9e221b07dcfc6ddea8810edd0dcf60c2be6f926ca0da33071e6a812108d9"; + sha512.doc = "56e1b71f8289c126df12091cf155c8c05f05a391abd40ff6ce0b84bb7620630a80747e23c25bbb4276aa5d110314076f61da72683b6846a44a53ad3515b91670"; + sha512.source = "32cd837a6c750ae92f9662db289a5479a102d09058bb4c85605820d6ced83f237d684fb07c9ba59f76062d6d383d1b45485ac2f2ec4e5bd43f780254facac1e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.96"; +}; +minim = { + revision = 70320; + shortdesc = "A modern plain format for the LuaTeX engine"; + stripPrefix = 0; + sha512.run = "5c2905e433d296d4645a7f4b9ea4e8d952d3b97b3977a88dfbdb36278f399ea9be02a14f866c4615290a6ca617cd0d29498f330239832fcc2d2178bf6dca7515"; + sha512.doc = "35ac9d101c958af4ffe7909762edb173ad7af619d870dfe44408634160446568cf480c209ef5546142d390e89a155d902ec6dd921cc33511e5d84cdbd68a2a4f"; + hasRunfiles = true; + license = [ "free" ]; + version = "2024-1.5"; +}; +minim-hatching = { + revision = 62395; + shortdesc = "Create tiling patterns with the minim-mp MetaPost processor"; + stripPrefix = 0; + sha512.run = "3d6720c4bbce847f1ca08279593398d162c80c14034ba6b8d168517ab30af883ce4fcc6cb0cea4dac0b0720be8fb8f67ddd131a026ed6ca5ea46182af1c41110"; + sha512.doc = "895a0b7731af0ea67e581ff4cc0208aca12d04ca862a15bc897d6e104a1bd9d7ef27f3a8c2a24c8533f16d0ceae1eab05a3dd923ae829529a223ba76d94485c1"; + hasRunfiles = true; + license = [ "free" ]; + version = "2022-1.1"; +}; +minim-math = { + revision = 69352; + shortdesc = "Extensive maths for LuaTeX"; + stripPrefix = 0; + sha512.run = "b733b6fb53b450bcb4afd2265f65e64b6087d08d385a746ea78720efedc4d1aa14bf6fba21fcfdbef7a331d1c657674caace33f9a213d34d0b56604a4d0067ff"; + sha512.doc = "d3754968215fdee2a31db13934c22a06998f93a11b80ba46e30231176e1583a8df86dcc8ed91b582a8b6f1427d9bf121f0f43cf297edb3e4a79250b9d703cb76"; + hasRunfiles = true; + license = [ "free" ]; + version = "2024-1.4"; +}; +minim-mp = { + revision = 70322; + shortdesc = "Low-level mplib integration for LuaTeX"; + stripPrefix = 0; + sha512.run = "99fc9ec8eec155bf404274bde2981ab791bae041860e184242cf5ac06b7c0a149ce70adfae1b2088a773114564afe93ece070cbae5fd77088a637bc27f830c95"; + sha512.doc = "ab83c7e366b87d42ae6351ef505c21c14cd39fbde5020f59595ce3534338b38cf2911496fb196226d012ec0337424047c158477721434fa0f08e2207b0fa5e1a"; + hasRunfiles = true; + license = [ "free" ]; + version = "2024-1.5"; +}; +minim-pdf = { + revision = 70321; + shortdesc = "Low-level PDF integration for LuaTeX"; + stripPrefix = 0; + sha512.run = "da700da69e8f6e82c47a08b0e54fa0cb959fb7950544a9dbd49d9b0883620434144932301c2dc68f03d45b5f7d3b6e9521a7d66fd820f8b91c6bd8364e0338e8"; + sha512.doc = "f9e3735b6a493c2ad07b1b39c1393eb39dce3250afa358f15c6870fd02c527342198f8198b710db298baac4309544fcb457589aec75e4f54a5817fb8072fab7f"; + hasRunfiles = true; + license = [ "free" ]; + version = "2024-1.5"; +}; +minim-xmp = { + revision = 69352; + shortdesc = "Embed XMP metadata in PDF with LuaTeX"; + stripPrefix = 0; + sha512.run = "4df50df08721b8c6cbc2314a36f08776766164c57fffa387d4804afae2fc1f35deb386f2c01e81da8a18b535c7103b7e07ffc51b37d4c621d8c5ac5248f4d960"; + sha512.doc = "a6c524225e0e9c5ffe620950474ea7f0f16780d555e354a14885d81066228d350a14399a78cda455677fd116e752f3637e73ff3e9aa342ff4036363805d736cf"; + hasRunfiles = true; + license = [ "free" ]; + version = "2024-1.3"; +}; +minimalist = { + revision = 70329; + shortdesc = "Write your articles or books in a simple and clear way"; + stripPrefix = 0; + deps = [ + "projlib" + ]; + sha512.run = "899476ca5e7ef145520819cf365e1afd9056b377e5eb3d64e63743d1eb041e6775d9d6ea616e241a6575e57789eea70dee3651a1dc4098c32b72021835d330f8"; + sha512.doc = "9f887a4043097a7fad52699d2568bf3e534d27df57f0567e392560e5153d7706068f2835ed03f5543bcb8e9021393e526b1499180bf00da851ac661cc86e2443"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +minipage-marginpar = { + revision = 15878; + shortdesc = "Minipages with marginal notes"; + stripPrefix = 0; + sha512.run = "acf33aac7dea3c20986a9ed1f76efbb470d9fa1cbd31f29ed4fddd0e16835ace1946278fcfd04ea179122e603f63b269872953e40f8a64843ae8e60ded769356"; + sha512.doc = "20d503697a246b8b56a71cf324e4daaec436b62e9c3b9556095670c2b461d273e8b77e24da3cada37106c350304827a37bd6f658727373e384f11fe064e07992"; + sha512.source = "1050833e51b5a00963b616b496d9b18e49cc8ded901ccdffbaf949eac12fe8d31219c650936c083767e39a39dcd08686ef049ce11abbaad5daa998f4e9c1b7c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +miniplot = { + revision = 17483; + shortdesc = "A package for easy figure arrangement"; + stripPrefix = 0; + sha512.run = "2c5d08c2476871dd182bb320c50ec96f202ef65a417e65d1de8aec391fb60dc66c1e9e4642ad2207f7f4bfdd12e83bfe2cf75e9fa4f0fff0f4ee72769f7ca84f"; + sha512.doc = "6ae8000b3d0ef50e37dfbda399396a42bd348d6ed9ee485ff01ded9d850693f43b0c1945dfde93d9ea0f17494ac2e03391824f2f0c0eff67355c3d3f3ad6cccf"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +minitoc = { + revision = 61719; + shortdesc = "Produce a table of contents for each chapter, part or section"; + stripPrefix = 0; + sha512.run = "e2d2503ac4888198c56e9007b20f489a04e31fcd29c946c5504b7d193506fb58e2577c6085be5d9d17c6f5b21ff77208810385c73688468f3988f0b651fb81a4"; + sha512.doc = "15955f17dfe2916081156e1464299b598f1bba780518516f6bee7da55cd1c45e2fc90c27402ba9d8ab4a994ba5ea1675ca9593699792a08407cda5b3a2230908"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "62"; +}; +minorrevision = { + revision = 32165; + shortdesc = "Quote and refer to a manuscript for minor revisions"; + stripPrefix = 0; + sha512.run = "d76224254aa18dd80f9bab56f055fde5bb7ee6b5c3dd88e6ce19667c939fb2dbd1e5cb987522a3f1c50082f46ee20cf918f1e01fb00f588ce11d30d300fcf574"; + sha512.doc = "ab1484f7ec214d43b95a8bd5cd78ee28bf0055d99d8c63c424c5c1db1c77b41a8631ea35bef745ab0399dd1c8dd9c9ab66b60033bb151f46afb023b6b5e1ab44"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +minted = { + revision = 69163; + shortdesc = "Highlighted source code for LaTeX"; + stripPrefix = 0; + deps = [ + "catchfile" + "etoolbox" + "float" + "framed" + "fvextra" + "graphics" + "ifplatform" + "kvoptions" + "lineno" + "newfloat" + "pdftexcmds" + "tools" + "xcolor" + "xstring" + ]; + sha512.run = "d9bf72028b4aeb2febd7e2ee8f44297f047b5eab76fca8265a56dbcde4d921946bce15af5a89bc110b8ba25d234925172822e045670cd9795f13e38cd0e90f18"; + sha512.doc = "6ddf64e40d3d28ca2bedd8a8a9789f1839c63a96f5aee3f71155722876f8ddf0634c2022ae4c02e1e9336a76dc8477994654d20e9d5949f2054017fcd09a9146"; + sha512.source = "2cab20988a7fae52fdeacfca9e0f30fb1d471ea1a93f7f76c6812f9c6d15e5c4949aac1a904341be30387ea1030c67100cb696a861b114bdf8b7d348c9d1a808"; + hasRunfiles = true; + license = [ "lppl13c" "bsd3" ]; + version = "2.9"; +}; +mintspirit = { + revision = 64461; + shortdesc = "LaTeX support for MintSpirit font families"; + stripPrefix = 0; + fontMaps = [ + "Map mintspirit.map" + ]; + sha512.run = "18167b9d0b5c167e2679cfb135812e3cbc20a90a182acb3eef15a54f4029298ebb39f6db626b5cbd8368389c9f0656f7575eb4f1970fd242d77d976762ca8d5b"; + sha512.doc = "8a7855b5cd117a5a11eda118b8a4b08eff4183a427655c501c5e3c40e1e9617397d58e6622058187a48d04948fad9164b866e58c76080404d7bdf4ff9fbc4d9b"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +minutes = { + revision = 42186; + shortdesc = "Typeset the minutes of meetings"; + stripPrefix = 0; + sha512.run = "3abd6c4963ceec3cf073048c21d2abc236d58f522000195fd459c554c10d2af9afaf772b0fd1545fdf72decbc7e1c62a0bb12d7bc1dfd9d5b025f5131ca5f145"; + sha512.doc = "a069ea537eb1fc572c842a26dd406b1ef2f1343ef6066d266642dfe37515a3679c3a9e64eb37e1e992fc40281d855b817edf9116aae3922abc60e3c01106e3da"; + sha512.source = "09b6260de696981f020835c61e20f23bfb81404df44af477f62341b9b07c65a1be58098d33dc876d6f07f3a5aaf6df25c8e3e7707c0f238ae76094ff0bfe5a2e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8f"; +}; +mismath = { + revision = 70260; + shortdesc = "Miscellaneous mathematical macros"; + stripPrefix = 0; + sha512.run = "21714883ae8a8640bdacf7c70b06153914cafa03ca546902017d98b24931d9cee041197fae2b31b317917351294addd8c9531c80586aa14924cd57120f37780d"; + sha512.doc = "faf0bcb6b8f2c9ac698bdc3df87001dfcc7488449972bfd5a4ec2fa619d1ab88e9764f4b9773788902385d6887d56a9d51edf16631dea8a0379921f380996878"; + sha512.source = "4c8a203150e5c7c8a291f57cd5a87686c05114d220d427ff34d4255542a9f02bdada4805a28edf7deb479a4529ff841f89253043ae648a55f650dc6f212efe25"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.12"; +}; +missaali = { + revision = 61719; + shortdesc = "A late medieval OpenType textura font"; + stripPrefix = 0; + sha512.run = "552f53302060b3f4c764a669feea4fe1dbadfa3abf53c226f9fde2d0e876bc8992ff2dbd4be6cd3e261ab0e01ed4d1ad2b5a38c2cfb780c4fc099a79ae52b46f"; + sha512.doc = "c80c201b7d3fa5808bc337415e86fe7e009ceccaf8020e587fae72f7024452f7c02b65ce48b2e8543c9796e8b3ea6431e0b8a5f1dc25b5adbd6f2ae7146e75a4"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.0"; +}; +mitthesis = { + revision = 68732; + shortdesc = "A LaTeX template for an MIT thesis"; + stripPrefix = 0; + sha512.run = "7f7fb74329217ceaba1cb55e8dc6d52216327991f397b01b7603d8a797ad214bb0f62c51e237a14e388ba5110d558716436218a511647336115b9653c61fa801"; + sha512.doc = "315fe938373d4fca5cb740067855cf38b52c00b49926baf2a61613ed5353bb81e4b156bc43ee3c67dd8414d5cb9f9fc1b36a215d67b04e57ce4ad4967456a021"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.11"; +}; +mkgrkindex = { + revision = 26313; + shortdesc = "Makeindex working with Greek"; + sha512.run = "bbb0b306f30b4fe898f5d5bfdcb1eaa4d2d88a95cfa1ea0da51957aad1de028928562c930180f6c0a7d66b5cdfd804d52afbd229e7ca43173477a229cefff192"; + sha512.doc = "5a5b14d4282e97420f796456155a71c23a44d4197d4d92bfea1f0f20e95b42e506c7be3f2b0aba37508415341e999522bd823c649cc6259a6e26d42399c6b8cf"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.0"; +}; +mkgrkindex.binfiles = [ + "mkgrkindex" +]; +mkjobtexmf = { + revision = 29725; + shortdesc = "Generate a texmf tree for a particular job"; + sha512.run = "c0dffdb276141b78bd2c47e6d2bfddcd13c1800d3a0806a05ca1fba72a91621364b827801430bc757601e07f2a5130366ade49d7ac1df27901fbec29827739c3"; + sha512.doc = "3ef5c333cedd5104b63c1457fff2eee40aea7d1f1b187d34ce4cfccd5b6bd38809b7686dc7b41a147fbee2ae0e951470f3ae574bd3c10a5f9b6fb76b686ce4f5"; + hasManpages = true; + sha512.source = "7f9de9bafb890d12ef2f07d3b8596dc31c4bb97079f826c9efd4f318383f64d8250099a937d8d692fecf703e626b42f942962f4d906e705cf4b0155e354bff0f"; + hasRunfiles = true; + license = [ "artistic1-cl8" ]; + version = "0.8"; +}; +mkjobtexmf.binfiles = [ + "mkjobtexmf" +]; +mkpattern = { + revision = 15878; + shortdesc = "A utility for making hyphenation patterns"; + stripPrefix = 0; + sha512.run = "0395c9258e6c4a8459e69ff2fbdfe511b0c6863e02333d9481a8a1e82362cf9e1be7e89e7447bda497e7ed2bc18e1986e0a5461e9f49c63ff869f39a4da4f007"; + sha512.doc = "8232866143444fab1ed1f15255dc5f8c1c5050812e2882d2e20636bfd300216815a53aa03cd4f69ed7f45aab255a8efae9bfdc10df6b7a246d36d4db075204ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +mkpic = { + revision = 33700; + shortdesc = "Perl interface to mfpic"; + sha512.run = "7814f14293e10a23bc9348dcaea9af326ab4dd93cc55865320706984e50883742381b5df3e77774e7a63fbba7ebcbe0fae7268a3d1a34ebb2d8a0303f5b53034"; + sha512.doc = "bfaf4232fc39c13fefd86c21b2f9f76cd93761c58e39c1420c601627e95adf9e6c5c06db73a0afda6621acef374089dd93afbd2a3bd761cf5aa8db29883375e2"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.02"; +}; +mkpic.binfiles = [ + "mkpic" +]; +mla-paper = { + revision = 54080; + shortdesc = "Proper MLA formatting"; + stripPrefix = 0; + sha512.run = "e82a0f04441b08a8f5b2dc0bac9480ae9ae8c169c7e5a1d1795315d3e103cbf3a07f726eb41d7dd7b1ffd1443fe00bc686b37c62edb59481a110bfd34944daeb"; + sha512.doc = "6bf3856fced879c5dce5cf1442ed0302453f7a02ec30b4d1a2cd63228baeef58d11999d56f505c1aab6a78eff1e4671665da381b7e319a467e42f70c56cfc89e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mlacls = { + revision = 67201; + shortdesc = "LaTeX class for MLA papers"; + stripPrefix = 0; + sha512.run = "7d0ccccd52f39b97f5448674dd961dd230b93799f71871bab7d5cce5b77e60788029795436765b6678b4b9e89f9f370ace2a43c99a9c185c216335e7ddaaf5b3"; + sha512.doc = "c4ed81865684aaa5d15679ce667d41604a2f9d7431b06a258ec2d8f5f0f22aeacea5f944e39faca856cc84139b730d33f407147deb07f7ac5da70fb82341153f"; + sha512.source = "c8a602a2ab7dbe1c0ecef7a1d4288eea10b0d8e5bfc15319d31c2f417a6ea2190576c986088b8da8aaff317ffaa0f0f41d0025e8e16a02503f2d96a91835382d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +mlawriter = { + revision = 67558; + shortdesc = "Write MLA style documents in Plain TeX"; + stripPrefix = 0; + sha512.run = "67e9de777a464cf7ecdff6c821ff31d73f31f5f69cc5e6800d740ed6df296b5fc3a584b34e60be025f91b96a609e392198b67d386b60fd24deefb11746ecd439"; + sha512.doc = "7d05bea21e44c771cf86e94b03ff2960419fa99e44adb1e7cc9a2398eb0647d0a177ffb9e2b8bbc74775946e2b438c51b8dacdea916311c967a02c34dfd1a2fe"; + hasRunfiles = true; + license = [ "cc0" ]; + version = "1.1.0"; +}; +mleftright = { + revision = 53021; + shortdesc = "Variants of delimiters that act as maths open/close"; + stripPrefix = 0; + sha512.run = "d1423d7e794ff011e6bf436d85bc3d2d933263bee059cac910e1a3375140d0eb0f1682e38c675afe17607d71d253b656a81cc927d22f54a8add2df01571a5e95"; + sha512.doc = "193d3fa473d136c11ad8a1b4f707d286cb0243bd32c020c1c5343c23a5d6347c2ba2ccc5c11e5bf835b4666c8e4a0ca2d234661e155c0f5fdc32e7b85cf2d253"; + sha512.source = "365cdce5350ecad7f1ea2fe478ac4c7414c9e8c5053c480229cfed7a478f135cb033e67070f327956cb5aadf862762e270726bbeaf8e511b10fc96e996e06d64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +mlist = { + revision = 15878; + shortdesc = "Logical markup for lists"; + stripPrefix = 0; + sha512.run = "23466ef3b73d8476c69632fe0c701f3ec675250b534fb4451cb0dcaf93c30a649ca07bb58cfbac89054cc31cc1219daaa1e7f746e6689927573175d42f78bfc0"; + sha512.doc = "771f51f52e47aceb7da064a0bf8ba4b19f0255fbd14d3b6d301457ad0dea80836f3e4c449611f5574c12e87185ab5ac9668404c5f1f97100971293425c7ecd13"; + sha512.source = "6112422b62304d0dafb8e4fa43239dd0899327dc952db6d1179af684049b46482a30675b8c44be534213d9b2fd9ff6bab267997bb0b08102e35e1ebdeca9956b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6a"; +}; +mlmodern = { + revision = 57458; + shortdesc = "A blacker Type 1 version of Computer Modern, with multilingual support"; + stripPrefix = 0; + fontMaps = [ + "Map mlm.map" + ]; + sha512.run = "6fe8c67f768cde92e38741885c336786f65f9793fce0027b0476a8e45366e33c4a559c3bb6367014646e89f0ac39bd92219bc59921c3b3e0fa3a9c4314f2a632"; + sha512.doc = "bd5ac414d3b3ff53b059543d25cf0296d59365dc219748d849f89a085225d864361923b4220a0a989585d99e9dc221f9a4209b622be5f279e0f02e5e1cc2d966"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +mltex = { + revision = 62145; + shortdesc = "The MLTeX system"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dehyph" + "everyshi" + "firstaid" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "latexconfig" + "plain" + "tex-ini-files" + "unicode-data" + ]; + formats = [ + { + name = "mllatex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "-translate-file=cp227.tcx -mltex *mllatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" ]; + } + { + name = "mltex"; + engine = "pdftex"; + options = "-translate-file=cp227.tcx -mltex mltex.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "e04f33b83474e58c4725abbba21ae56659920ad2929faba7f25b47befeeb7e207e36888e1dbf7260ecc95c126e1732f6f5dced3d277db7c3889f2b08590b04dc"; + sha512.doc = "e9d5a1cfdc6183bf99ef369b447c73e9ec5926952a80a75708db4fc6343ffc1a10d599276c13f295005f7c8c56e2e35ad9edc9dee3ee06928fa8c7b267d82bbf"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "2.2"; +}; +mltex.binfiles = [ + "mllatex" + "mltex" +]; +mluexercise = { + revision = 56927; + shortdesc = "Exercises/homework at the Martin Luther University Halle-Wittenberg"; + stripPrefix = 0; + sha512.run = "9af80a432fdcafefdabe9697cdfc16dcdee9f6a15d85d3e15774860e94bd579ad523c370b289e823f82372dfaead086ae0ed175fcdc51cafa53bd98076a8664c"; + sha512.doc = "bafd00d7a14ddafeccdfb2bb4df613dc0ad6428445722b29ba6875d0dbc3feea9ab5ff86d8e7799f4a907840c584c2e37cb54e89b5d978e67b8f7e4b7fc7ef51"; + sha512.source = "aebb67b8257f675b1237a362ae5ddb523d983717056915db5e482da90fd5674d7620aadc9b81b2667c9e78ad590b2cf670463eada81154f379e5693f411bc3a6"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.0"; +}; +mmap = { + revision = 15878; + shortdesc = "Include CMap resources in PDF files from pdfTeX"; + stripPrefix = 0; + sha512.run = "a2427b9863ef37385507783dba7bdfd65bf022d1c7322e7560b78222c3d4e0ddfccfc70aa927196e64ca1a520e985eea8cb78a4129a39e73a8410bc210b801bb"; + sha512.doc = "95a71c9a9b9cd46c1723c986ba41c29a7204fada2cd7bdd14ebfe5e0c4e1b06106f9c13469edd9caf0b94615bfbea9cc8a1f56a4f83cec37de481b39d2b4bd91"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +mnhyphn = { + revision = 69727; + shortdesc = "Mongolian hyphenation patterns in T2A encoding"; + stripPrefix = 0; + sha512.run = "e580c984d9a2242eb7f3a356b222dc6fc4f2fb1e6194f09086e265e253746ba1d94cff324a30c473724410d1d6b0bb7b8bc162cadb63ed96f0837e996c39f988"; + sha512.doc = "3645bb53bc2aff292dd5a70e3020898b969422b9e21fd11354e2ce60a6c7e668afe149263ee02e3588e0c3803c9568d999a6a6bb067a5941ec288923e167b2f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +mnotes = { + revision = 63406; + shortdesc = "Margin annotation for collaborative writing"; + stripPrefix = 0; + sha512.run = "834350f6b4bcaa9b84c18d526072ebcbb260c501b08fb81fd40d3d4ebe015392ec94f6dfcb0fd751716f213afbb4615bfa3e1c729eca416c9d499d0eb784686c"; + sha512.doc = "198f7b4e402a71e6617a1c7a92a54fd2a742c8c1748bfa17f71102a833b1fbb656dd5b85f7f7a58bfe05588525e07cf978278d6758448c4dd69d48275eb0be01"; + sha512.source = "db27a6007ca0bc687bef6298246d5a3a72c232c8728f3dfc8d0f8c8fd62990d98d9e13b57916ac1a4562cc521610f2625f90172b76afcd4b5600e7c571b9a1ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +mnras = { + revision = 68878; + shortdesc = "Monthly Notices of the Royal Astronomical Society"; + stripPrefix = 0; + sha512.run = "cb8e7cdcef07bead94509ab42af1e3d6a966b7266b75473f5a6107d2fe7f3f4c2f732c9544072def55d923883b5ad495a166cb128bf67e10211919be9f4fdda3"; + sha512.doc = "be0eaacc684772a599ef62a782d73b41e0e9963cc9ab0624805cac56af8b8f8dc529405588c687a018ffe888b643902ddfbd0f833cb7cb67a3053bd5c34e373e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +mnsymbol = { + revision = 18651; + shortdesc = "Mathematical symbol font for Adobe MinionPro"; + stripPrefix = 0; + fontMaps = [ + "Map MnSymbol.map" + ]; + sha512.run = "68df6dcaca1d2f3b743c62e205a22427152ec6ac1deaa126e7511842ad7817ba4a7a232b72b45c6dae88d930837f46597c5f89e50b1057ba313a590157342ff5"; + sha512.doc = "bf06a1534665ad50d33073e5d7332337c05f5d5315ba41af399f73f98d54b22a0610c65fa0e96b311925f40bebc1458fd0f0fa9c5fb41330f6d0b9b49aa12aba"; + sha512.source = "1d622e81bfa0c2e61ab64f058a356e66c98f75a2511728bc49c6cb3d998caf132def2f092db7ff18b4283829e7c118368fb09a39ba2e9c05b0a0be5e4cada210"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.4"; +}; +modeles-factures-belges-assocs = { + revision = 67840; + shortdesc = "Generate invoices for Belgian non-profit organizations"; + stripPrefix = 0; + sha512.run = "0b0e546eef6640b70dbb07bbe6401983fd0547357dad47a854b4c87119727d79f5ef54789394ebd5923474d2ad95e59a55d9340cf84811b5f2d5a94e406e8c7f"; + sha512.doc = "0bee390919ce8ce6082c2373f639db7de1029d0830d4cf9f1c807ef044e0ba27c8f0e4dd37677df63c03b64ad00b27825cd703973776377f844324846a908edd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +moderncv = { + revision = 62128; + shortdesc = "A modern curriculum vitae class"; + stripPrefix = 0; + deps = [ + "etoolbox" + "fancyhdr" + "graphics" + "hyperref" + "iftex" + "l3packages" + "microtype" + "tools" + "url" + "xcolor" + ]; + sha512.run = "988cc5f400af4ecdfc0730a63d7f2a13fde81b9120f198622a5e2d145ca94e1d5bc952e261ef2f4cacefda8a23626119975fd1e00b44f4a66b1fbb7f4c011d40"; + sha512.doc = "9527fa84fffc4eb2ac92dab59cf0e5ae87a6f5befd4ed05acdd85cc7050dcc669f8b814ef928e69bb1c1e8bb3bd774aca1f85acf6b750a1c9555a3165eba0281"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.1"; +}; +modernposter = { + revision = 47269; + shortdesc = "A modern LaTeX poster theme"; + stripPrefix = 0; + sha512.run = "d631f058a0a17a841d4026c43fd086cbefd50d0ece85563ee81e34440650bdd7d3db6dd6f49d5e74278872961300bbd443b896586f5c7ea00a9ff816ef20b7a9"; + sha512.doc = "385c8b97c57053d861d72b4f10134cbf2d943e4bcedb55ec42bff51000843db3fe30737f7ada3ce569c1d96584ec0df80afadc39be98c16950828647165f6801"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.03.1"; +}; +moderntimeline = { + revision = 55518; + shortdesc = "Timelines for use with moderncv"; + stripPrefix = 0; + sha512.run = "3e32e360bd8249cded439fc563c8fd38e53314fb468251368aa5311463665771748b605c247c63e8e5aea2654dd05c4b12aafa073190b883d21469bb14333de5"; + sha512.doc = "018ad6b095dca602021c45e04a526597ca61f5bb6ec7adb52d86c221649c4b3be94761e826d09ed9772c0628bd9d719f6a4db6ea1411e6d34f94f8c049130855"; + sha512.source = "e86a6e1175c1d86e5c0b035ff925107ad0dc80e00f1815161348608e90a7ed5bc9828f896c0d072c386cf695a5f9d1b894eef2c864d403b74a75bc89a9910510"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +modes = { + revision = 69113; + shortdesc = "A collection of Metafont mode_def's"; + stripPrefix = 0; + sha512.run = "71e00fa0f1c3cdf01a6d49567df15b5a9119005ea63a2411680afdd0b423fe0f66a13f01579a379883969cbaee5535a4d338a9659196d4c95404b2cccc321cee"; + sha512.doc = "32135a28343fdf1de2ff2cc25ae78920729c34f777ae6b147ff85f80953eb7610bad5e1a8919d6d873ad45fcc9b51cc9152e9e2fc566d47a57f7df4e6f63f5b6"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "4.3"; +}; +modiagram = { + revision = 56886; + shortdesc = "Drawing molecular orbital diagrams"; + stripPrefix = 0; + sha512.run = "3da30c6f2759d1beebc0f33c61846343b505da9527f2a34ad7e622958802cfd08e1da9ca297003330451aa913b45c872b4eed4cad3f5bf5f8e597a2b0800a09f"; + sha512.doc = "cc0513fdca073761b8f6f9e34c826af2de587c9c6ef47bbe54b45e60427c5536a2c4743e2c187a9b089eeefe82359962d1081f5dd66fad9072e4c7adcb580763"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +modref = { + revision = 15878; + shortdesc = "Customisation of cross-references in LaTeX"; + stripPrefix = 0; + sha512.run = "ef5d822fedbd5026903fb7d2630a837a3a1b0222150ee1a9f72a54e13d626a0387abd1fc20b18a257714c63cb65868ac885f8340d35c5453b42323da3b9b0782"; + sha512.doc = "f7539376630672b6fc67821045eb8c891b4781d233e1b914f8fc5c255fdcc57ecb6e5ef4d36ae72ceac185e8d2e4aee42741538f27fb3ab1f5160855cfbc8def"; + sha512.source = "370a7287ed60084ce3d92ef722bb1b1c5f49faf6563a154dc2fa2442a60eb2ab06ea1c82d63e5c887b8aea859f9e647a5d80455f9cc87746d2c9be25f4920b47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +modroman = { + revision = 29803; + shortdesc = "Write numbers in lower case roman numerals"; + stripPrefix = 0; + sha512.run = "3314a474cdb88e517fd16943b8f1f1da252608bc5505bd91581e87bca19ea317718d36694abc670d471d0028dcb5fe502a3be1b1294604cecf619de235fe63c8"; + sha512.doc = "5c6ad1cdad66a5a7285b7c51074f724670880d4417df45cae51e5b3b35bf5cf99f374f7abca73c7ae68d12f626e4b9bf0dddd6b2bc94250c4e6146598d4c5ac6"; + sha512.source = "21e8a2bf6f1d58800452dee77d7a7dc89bd8c952ced6f485b42a2e0b6300df9c823c23f4ab3327d9a367ef8e8d6ba1bae27d3c9bcf875270053c7fa65bcf9f70"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +modular = { + revision = 44142; + shortdesc = "Relative section headings for modular documents"; + stripPrefix = 0; + sha512.run = "13d80f572497551551151c35ac32c09cec70cd40c6d99d36c22ed84bcef509cbfafd511a8e2e284cd06ab1a57f4be7fe556d7e390f9d30135bd20cd49acf362a"; + sha512.doc = "7d7201db0a2791700748d440fdc5cca9d8d274ceeacddb3715d99b68b4c04f52949e8b9897377168463059deec86177470a997bfea7a32a2765afda713aed499"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +modulus = { + revision = 47599; + shortdesc = "A non-destructive modulus and integer quotient operator for TeX"; + stripPrefix = 0; + sha512.run = "e5dde62c2e0730befb63612bfd6ea3626463db85b74291df5937d8f7e1995f6b63c8bc6d7e08536ae761457ab1e9a0ddeccf11afa4108910561075dcc03201f6"; + sha512.doc = "965d03005ef257526ffa6667d889a4b238ca5314f4fe8714bc8219ace1e909eb5765da6c0dc94e9b312635e0f9ca096f1d14364effb0045ed467da7c1d735474"; + sha512.source = "0f33d1d241e0155eae39875b0ce72019740771c2e36b337255a0865cabeae78c93e24d7f7eddbe7cba9ce312090b251b26a632c260e097a2619d35b47fb050bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +moloch = { + revision = 70496; + shortdesc = "Beamer based on Metropolis theme"; + stripPrefix = 0; + sha512.run = "58af737c14943781d96c8a8fbd6004a207281329973bec3ac0166d117af0d6cd4ce38174d4bae4e9a4e5c6eb6c7bf1be9205539afa8267e166656e74932f6e90"; + sha512.doc = "df09576955c0cdc3dd439e1a15df6b77d27dbc7f4ad876b06078823bf37c17db436cc5b75afac8aedf6622dad706a124cb01252e05345cedd2d305c593a82bab"; + sha512.source = "55084e06291835c8642d6313dd3a8a34071286c0bffb4988a8787913b38816cbfc26895cc1198fd58feae934400b5c4b5e06f78c5959329a784f7bf32ddf6c68"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.3.0"; +}; +mongolian-babel = { + revision = 15878; + shortdesc = "A language definition file for Mongolian in Babel"; + stripPrefix = 0; + sha512.run = "a4e7abdc0b5817d88ad442e693fefe79df224a74f37d09b630fd7ded16e1335f563ca00a26aee8ba4b46b7516c0fa2f5dc9d37ec00455b11223e46a6e289cc01"; + sha512.doc = "d0aa4f4a7f1b22d3d3a6a96b85d4d72acb71ee6b1374b70008b966ca2401b7b9434bca675601cc1cdf2f013520eb82c2cb193634b3ac9f9b9d40a201d10dbd58"; + sha512.source = "07e75b2c9bb6c7596d698e0f31d8194ab5cc4e06f5ca472cc706214c342960378376406bdc0eef0940ac0179e989a92af496069ffb25ed75f5b3a0d5fe639517"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +monofill = { + revision = 28140; + shortdesc = "Alignment of plain text"; + stripPrefix = 0; + sha512.run = "6b9a45c32bd44aa01119c7bd8304ba8e5953422c14bfeaacad20f012188f9204c19f432719c74d9481a00611a18d4ef1ba2c1dc858b83b8a25205d40568e5fa3"; + sha512.doc = "edb00621e74238c09d0ca0c04e5c57589012ef2272f0b470345845ddedd647c73fffc0fcaf4741726214b2419e9581127375ba2b36948ec73f4caef561c3e57c"; + sha512.source = "fba90d74e9b12086fb4dd431eba4bb3349a83a2b839db1f1a1f7f076e3568cdada03de56570bd38e937eb51a76990ab39778a1832ad233067025ae24877b279d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +montex = { + revision = 29349; + shortdesc = "Mongolian LaTeX"; + stripPrefix = 0; + deps = [ + "cbfonts" + ]; + fontMaps = [ + "MixedMap mongolian.map" + ]; + sha512.run = "9676cef9e0fbe7a0196b1ea0fb3ea4f0399a3ee8ed76ef06e824848a57922dc4f7cc1f50a1fcea47fc265465407653447ab80e80dbac3c4bc00488d0929f87bc"; + sha512.doc = "1965f31e28a9f54d86a495b4b8cea50dc59f409d066918dedf77f86448b60ea547565dcf2069ee0e0a646d53f34d244868600951c4b1a4d4e099fe50e3c2b477"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "IVu.04.092"; +}; +montserrat = { + revision = 54512; + shortdesc = "Montserrat sans serif, otf and pfb, with LaTeX support files"; + stripPrefix = 0; + fontMaps = [ + "Map Montserrat.map" + ]; + sha512.run = "58c8b4a1f6eceb10c7fef8e6dd951985ae6108cb3f93eedf20949923237cb8af6a834674dcea48b1c68b51284ef37fe2d4120d52fee82753fd873f60b585e685"; + sha512.doc = "694ee7f51b0fe1622981bfa636263bbe18f89ec481071af587a683648f4ee900d9100864e51669d65b9952e6acf64794b5610989d2bd86f6e4701e1e41193242"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.03"; +}; +moodle = { + revision = 65672; + shortdesc = "Generating Moodle quizzes via LaTeX"; + stripPrefix = 0; + sha512.run = "0a297097f864ed3dc8c9d263a6a3aa8930732679a585aa34e2e5b31852bdfc3cff40118d3b67566816dfeda0f74282a476ad8b5ad793d2c433cf44f41f7c91bf"; + sha512.doc = "ee40b07bc0ff2ff75f18eeb9ea68dec0a624a1b75b81ac00ea9c5caae3f6232213e1a5ff7028be28372cfc43685f4004059d972176eaa2b18688f16f8ef2ba09"; + sha512.source = "02754bd2d6ec9ca07e07b3768855cf100d09de057ad7b3605dd7a97574c7f8024028ca882b3b6a1cfa25e49ec40400690ed7e7e1404f0836a9d6158cfec30bca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +moreenum = { + revision = 24479; + shortdesc = "More enumeration options"; + stripPrefix = 0; + sha512.run = "069ef44faaa8847a07ad00dae31c1b63278d59a560ed90823100cd601850a798f574d8210c07854a8b1a90165efb3bba852e100e53aee496f78395e3d6defade"; + sha512.doc = "987a1dd96669b9202846fc604fbcfb935b68c79d13bbe4599f32fab9e869ca5b60f3b4bdfcf78d3b3f5102db9ab16955ec13958c4cf3df7ec64649268c226d1c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +morefloats = { + revision = 37927; + shortdesc = "Increase the number of simultaneous LaTeX floats"; + stripPrefix = 0; + sha512.run = "28fd471aa854852cc2a48597dda19cadda3c92c589d0419b8d36e044f9c04e406037f162e1d02c1f4b20a6288efe4a689fe4e03aafbfc6b06cf14019f7e880f0"; + sha512.doc = "f542aecb6d3868559cee66a7c153dc80cb6aacebae40c0cd0dd120c4230cd358b4d2787286cb3e7bdfb5565949861a35af65ca616369585b8f28462a2b1dbcf6"; + sha512.source = "7f527c20294826a6d7e1c3ff390ca02f521e9b6824db41d078b4132201d1d7575cb43eebda9e66e8226ba2a641db692ae2d1f1ccac5c4f027851b75100e261db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0h"; +}; +morehype = { + revision = 38815; + shortdesc = "Hypertext tools for use with LaTeX"; + stripPrefix = 0; + sha512.run = "698ec10d9e70dc1b89ed5094369359fdeffb663ca95513b7207aed065515a66dd2c82b4e43d14fe271c9851e72a44e9c2f6e3baa177ed9430f89e88bdd692172"; + sha512.doc = "2600045257c75dd15320a2f188f5b043358bfdb21ce4a19af2d1a696141a2f553da42c13143d14c8ba136fb1ef7a560684ac47c5274738c747f729a00b02a099"; + sha512.source = "f710fd59d5c99d7df8b84a365a8f8c110ac7086699f36d1851eb7fdd27ed43212c403c14d9f9105c78402b278d66fa77ca2f50a0253073f55842a60fb19b4c1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r0.83"; +}; +moresize = { + revision = 17513; + shortdesc = "Allows font sizes up to 35.83pt"; + stripPrefix = 0; + sha512.run = "92f67234dd9c0429798f9e8001a2d4b7004e11f2fa90130b738670e6228f45ebca3ba26ed98616e3af5c86148992f9915e3e6a1cfeb4c875fbd20fd818743525"; + sha512.doc = "3c1ed984163e2adbdaa7e94439e160327515f1c6999e40114819d8e5250e090c932909217d37d1d07fcb108c56ec50f294324c32523995f68f57fd918983a412"; + sha512.source = "701a2ba72c22bed8397350f92023b0b1d1587b837c4fd247dabe5860cc32e58499e8803a0286aa9f9e3831faff8b9ce0e74ac1a0f82d798a2f7f461b015b5809"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +moreverb = { + revision = 22126; + shortdesc = "Extended verbatim"; + stripPrefix = 0; + sha512.run = "673b7ab5951e418fe10622fb1a4b4a420c4c436684afbb1474c58b7aa7b235f7063555a220133257b351b5847be5e880714e44ca49bd9198a4306c0e821dcdde"; + sha512.doc = "27e4f361f5d7193c97629debec048168045bc38e353f677829677cb5ce5c0a9ad8f5b2576bd9f870da8dfbf16d745e489ba79e3dfe6aa1da8a9cab1ad72ace06"; + sha512.source = "55ec67b5b9616459a776b0ca386be19cb6ae57fa2a7bde1f6a1896233f4f303277474d629c884e40bcd8d076522ab4e41fbe8850304dbd33469a1f21750c81ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3a"; +}; +morewrites = { + revision = 69679; + shortdesc = "Always room for a new write stream"; + stripPrefix = 0; + sha512.run = "738ea602368142999aa6f5d99226767fe9d6613b3e5d58687d787e8e470bfbff3ec2fcabeb5931454754ad80661a5925f337ba600fa62f021ae99363451c4c75"; + sha512.doc = "a8aad8b575785ee7b36f6946ea2228c507745c4f7ca61e05e46c9b0824e84880e355264e45540b61022010943f2cd63cf051ed1d4b9b438a6eceac840cb2e6d4"; + sha512.source = "e3db6542cdd4548e0a9fa10a40b333e48ad4ab713acf8f38389f8ebe5113b598f647e9eb11047339ae09ae344aa22ea3ccc0f782c35dca2552fdf8707d4926c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +morisawa = { + revision = 46946; + shortdesc = "Enables selection of 5 standard Japanese fonts for pLaTeX + dvips"; + stripPrefix = 0; + fontMaps = [ + "KanjiMap morisawa5.map" + ]; + sha512.run = "7f149fab67905d6b21670becb1c3e3afbc8fb4c45fa3c376960e5a87d7fe17abe091af63930a8385b5bcb63e550fc0b9bb16d522f50f90b911b09599dc5ccafa"; + sha512.doc = "7af68b3a8233cec22efb49e8131c65e33db4076ed4f254f2d62f629c03d0122e8dddc3ba68d283affb5ca663d3b1f744780dc98c14eadfa1a69028df281e5bb2"; + sha512.source = "7e3821bc1f5dad076307ebf00cacb68cdeb9e18a060c9c024c0fea85c558f7373f214f16952fa643f8b832376101ec8c8bb839a902e6e8213912a4cbc10862ad"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +movement-arrows = { + revision = 67270; + shortdesc = "Drawing movement arrows on linguistic example sentences"; + stripPrefix = 0; + sha512.run = "42adce39a6f06212f5d6c3c235ad79772064d8b0588e3f79b34ba7f3a8530e08857e5a1612051ce6c58e419b0ea4f1a6012b19d8e37ae20ccb1a20c11f9894d8"; + sha512.doc = "d1f1856297ccfbcd42d05524d633857ce548fe5b5c5fc84d76239a2cd62989015ea62f2fdcb509e918e47cc176002fc5467c7d721942f674eb4cb405dbec1be7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +movie15 = { + revision = 26473; + shortdesc = "Multimedia inclusion package"; + stripPrefix = 0; + sha512.run = "a45726b24f76683c44b0f006d720695c14ef51a260fa00f3223a075e48173638dbc9d9d361fb4e1f8f567cbe80f65d990aae485b669901a50d5b18750640b103"; + sha512.doc = "4df2fec7f0abac6ef4d948285b3156bb9489a3b7b18939fa109abcd9c537e383d505e308516e1bc852aa5c5bdd6b8825e8f7e887c9787d7c2d337124942cc9e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mp3d = { + revision = 29349; + shortdesc = "3D animations"; + stripPrefix = 0; + sha512.run = "e5899aace25cef3a690150cf09e76bddc008f426800588ef7d21361229b0040dff74af7b43d563b05d8c3d16166e34b5a21e8e25ae3e97ca80e5ffe5c4925392"; + sha512.doc = "2b64199f50ae5b0e6528bf041ac2422574f9adf467183f3ee3d58ebd91317ce25937699be29d0a5954565a4fd326719f11bc04a35cb4938489696ae479d5d7f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.34"; +}; +mparhack = { + revision = 59066; + shortdesc = "Work around a LaTeX bug in marginpars"; + stripPrefix = 0; + sha512.run = "9a4e5a08320095095538eea8c5c5db5dc6d6c99ca3e3a3f5568228b8b52a4b1de98c1118b09626b58ef897f6810d2b43d2b5b416b3687e1bfd3a01506460bce5"; + sha512.doc = "fc4cff80bbf20460e28f8d5a142e8994cea7e017391b147a47332b444fad0ff8cde1e7bb29159e39f8c14f4c9881ab91dcc0e2f108cca1534d4335f5b6b32a1a"; + sha512.source = "1eda2d1f370141d0a5b0bc15f68dd40b9dd72017e8cfc75c71b19e2fa2ccfef7b1652d5c035c8ab6120e12089bf469b6e6edadd7997329da6409e6248bccc5a2"; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "1.5"; +}; +mparrows = { + revision = 39729; + shortdesc = "MetaPost module with different types of arrow heads"; + stripPrefix = 0; + sha512.run = "58e4a909374486cd2d4313d62a49e4e30a5e85f8ef2cc0d9a7e734b546ad8b36e3bbfb96f3eecaa9c10b8d7b3b1557aa9e0b5dae5b4547d42cabc64d2f2949d3"; + sha512.doc = "d1ca204228c1bc76d4f15257687a865c650fa83742dd126b3d7cd5e93e725b2da31eedfbca9a86e93eaa08df487b0432cc41f0d4fd2f99951f874691acf47016"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.1"; +}; +mpattern = { + revision = 15878; + shortdesc = "Patterns in MetaPost"; + stripPrefix = 0; + sha512.run = "1efc3f1f1c93456a3038ae5037ad5dcc4b177c57852f7db475a7ce6d2002559b370ba22dcc6d312c68ba75c03523cdf0df8546fff8dab032832d3ff3148b5d65"; + sha512.doc = "4ec7cadd89449ca049fdd723de9e29f20199a630fc28585a4802e3ce3666783822e4f0769907cafbfb0fe097b1da4a08d3e5e5f4038ecebbe9fe3543dd3413d6"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +mpchess = { + revision = 67704; + shortdesc = "Drawing chess boards and positions with MetaPost"; + stripPrefix = 0; + sha512.run = "b65838b9b3177b069a2e8e4141fdb9ae68ac1dc9378c9fe7534fd23556d93ace29ba1ed9deaeb53fd54d709b77ecd98d9d0fc79dfc8e77b8eec899d4a332bc3f"; + sha512.doc = "c859e9f5df0d24bd1eb59dfd39dc97cd1ba6e713b33e37d17128388928071e2da8f41180da333fea34ee6215585208de193a381205fd866142f341e1856485d2"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Plus" ]; + version = "0.7"; +}; +mpcolornames = { + revision = 23252; + shortdesc = "Extend list of predefined colour names for MetaPost"; + stripPrefix = 0; + sha512.run = "9808706010059e8d2683f88a47535b8039049681e5a9fdc013cc384bcacb1910cc7ab2f7614d35ed964c28507bf5fc062fe4db852afa45f9d9383c367838eeba"; + sha512.doc = "bfb9ce4c85de655b890948897deba96a5ff60cb7518b3e198cd0b088b63670531f29bd84dbde4837298a24f36dac0652f2d2d3491dbcd7ac8f9e57de6500c6dd"; + sha512.source = "ec29085382f6464b10323680488140b483aa09c9df050806a154fce60bf92feb7d4e04de444d0fb4b1623c6ea3506ba619bf0fb2477f048fd4c5f2f0be9f272c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.20"; +}; +mpfonts = { + revision = 54512; + shortdesc = "Computer Modern Type 3 fonts converted using MetaPost"; + stripPrefix = 0; + sha512.run = "7d602bca0f33f83033cbe15cb2376d0ae023a4d02218f10b64965580842f269a7065e6c2154bf78c7a72a46abd0e41214dea4d2f012f1945a17fb5b8cf0fa832"; + sha512.doc = "4aa1296012f4ed3483f444320d7d28d942823da0cd58c1350dc4a90da1fa5e51cd5bac86f257290c720f9808b74c2cc87c49f18882073ac44ef7f577248f57be"; + hasRunfiles = true; + license = [ "knuth" "lppl13c" "ofl" "free" "publicDomain" ]; +}; +mpgraphics = { + revision = 29776; + shortdesc = "Process and display MetaPost figures inline"; + stripPrefix = 0; + sha512.run = "5d711f7a981f701e11874916fe8d22fa237404dc119fc2d5c8f8e9b3eaf8feb59a63023ec30f0c67d304839e4971288a669d70a697260af35e401edf00673adb"; + sha512.doc = "954c8e3a8a0deafea163c9bea9da6bd1c27fcc9b5270408fdd29f0051ece1f4138a0af99808cf85279823cb48475b8e21b3a450f021d678fc5b2fbdf28e55320"; + sha512.source = "30e7324760efabffddf6920362ba213eb05fce2658d9a442677a2f8f322695d5a361b1d183c4f775b289ac116d586e2466be46d4ea1798cde251132b95a98bdd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +mpman-ru = { + revision = 15878; + shortdesc = "A Russian translation of the MetaPost manual"; + stripPrefix = 0; + sha512.run = "e234fc25e9d8e5aa89a59e21186a16de3c695ce45c9ee8d132546381cb18e9be681bd4ee9c70bb10b4769ada5e5874b500d2a3cd7d264d89610dcda35fcba9a1"; + sha512.doc = "57f2449eaed3651b808095348f056fdfa90b00979ba2e21fad120efe096dca9a9e48474e9dbb539f347ffe20ccd5582f4815ff4552c54e9ea5f9df391dd75edb"; + license = [ "free" ]; + version = "1.004"; +}; +mpostinl = { + revision = 49559; + shortdesc = "Embed MetaPost figures within LaTeX documents"; + stripPrefix = 0; + sha512.run = "0749fdf4c54efe9b8c9ed9f735a851a0c0b08a9092679bbb80eb32a80ed6e7284094a043e27721dacf8112b6898a8c5f47bf0b0dea4af9082a40bead0599ee76"; + sha512.doc = "ad639ec50e5b71a1ef02bcc04cb1c0b195e9ed2cdef9ff8e145d17cfb34dd853d96449620f5d0eba614154cdf6291902316f4fdfbd179a112cebbe2a059acc70"; + sha512.source = "44ff22f1fb0496422dd760b786174e520643ae9c2b8d3b922a08f9e065708fb4c292169e58cd328381c29672d0526c13506429c55eb57100e96f876324e6fbb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +mptopdf = { + revision = 69363; + shortdesc = "mpost to PDF, native MetaPost graphics inclusion"; + deps = [ + "pdftex" + "plain" + ]; + formats = [ + { + name = "mptopdf"; + engine = "pdftex"; + options = "-translate-file=cp227.tcx mptopdf.tex"; + fmttriggers = [ "plain" ]; + } + ]; + sha512.run = "680851a49d124cf0e2ff0c7626dbb5c5e48358ab08c94906cfe019fa2066dd3b47c763c7985a101d44ef6a6bfab3b3f72c88bbc1ad0eca0258b8f6467ffc0ede"; + sha512.doc = "46b4dbe5a903601078da34238dc449ad932dbc44fdbb6df33b53554fbbe8d47307ba99e971ab197e468a8689d731f989c02097ca2b8ab07c575ec05e2866e81a"; + hasManpages = true; + hasRunfiles = true; +}; +mptopdf.binfiles = [ + "mptopdf" +]; +mptrees = { + revision = 70117; + shortdesc = "Probability trees with MetaPost"; + stripPrefix = 0; + sha512.run = "64efb9355c79a8145e0bd4e44922c789a718f389ecb59ac186ec32da8e37323d09cc33d558cbf67ca5550f68501282dc429b784f483df1e3df5b9d5bc3b5ddd6"; + sha512.doc = "de5d2c52ebd3651ff42812fe4ea74a4ed92cdd8d0452f2e83af9723581820ee07e2e9528cdc254410193d8b82f8ede7554e182c1fee104333715f253d3ad0d41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "24.02"; +}; +ms = { + revision = 57473; + shortdesc = "Various LaTeX packages by Martin Schroder"; + stripPrefix = 0; + sha512.run = "73d46ed7ba85773f4ba7c261ff0ea8f2e751e53659fc19686bddd9523b160dba5e367c8fcb30a20678e4a3df26c0812a6b771736eef8616e112cbac3a25e7b48"; + sha512.doc = "d112ff182da85ee8d84d8e7cfc50e5c13ad2e555ffe4dd2867a3439d69193ec7bc24fa87d2527936a57dbdc8e98df8d2862a740f91d497a8eba7108973a637aa"; + sha512.source = "b03f9ac6bc7ab56bacac4053d278d0c826925f4f81df80e73ee2a48209e1e51c48b0706dbd0d69ec9a068e4a59a12df104b8e7dfd60cd0cd5c6210f43d528ce7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +msc = { + revision = 67718; + shortdesc = "Draw MSC diagrams"; + stripPrefix = 0; + sha512.run = "103ff1fd368f97920f5403691ccb5fafb34c6a291db5d76a83d56f64d1ec452386cb844dfea7462fcec573d86b05fb183034ae8968d7127f4bf425aebac1f087"; + sha512.doc = "e336c0969d2f39c06baab3f7573109e11f76acf47767f0653996ea772bc5fc4ac801154c5fa0df2eeaf999699aa0d61c1e7d223b44248fba72dccc8bc1b86663"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.00"; +}; +msg = { + revision = 49578; + shortdesc = "A package for LaTeX localisation"; + stripPrefix = 0; + sha512.run = "9419f306ccde237320abe22fe192a2473785244fd337063332a242e029b8650404df7f7d150b196d3bccb0e10e58e25e2b8aefb15627e89eda8636ddc50599e1"; + sha512.doc = "85db0022daca5aeeb50e2eded6214a3b144012bfd0bd433b4f9474307c2a37e57c7a311385b8de4efcdc4e462f39c53f6a5fcfac2eae7263e2d1583b0ba584df"; + sha512.source = "988d410412b2e7b3617678d0cdb2e8059f7261d48b942eff588c472ccb29e022a3e10ae2302268789331c20705ce062f0930ef53bb785245923ba199ed71b15f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.51"; +}; +mslapa = { + revision = 54080; + shortdesc = "Michael Landy's APA citation style"; + stripPrefix = 0; + sha512.run = "28a13eda4b10f25e4887feb44f64e23cfa683d28e57b66a64d2a15c627e5f7aaef36e9fbbbf3c2320891a0bb9a5270fb59ca9044f1822402d82bc494f41dc3a9"; + sha512.doc = "b53311156cb6872ec996130474f18d8735f9fbba8d53258638f78d498b3cb294eb490b6eb1460546dcec39258e0785401dad5ecb66c82e2cfd7814bfa852908b"; + hasRunfiles = true; + license = [ "free" ]; +}; +msu-thesis = { + revision = 68480; + shortdesc = "Class for Michigan State University Master's and PhD theses"; + stripPrefix = 0; + sha512.run = "a25f539ee6eb50450a603b25d6639918118a8882df16fdbe71dee49f09045480b80514994079f291120d6f3132753a90cfe3a7eb5e366a6c8b15b6674735fa85"; + sha512.doc = "da32f1f22664d0bf05561a4d99977b942c95167a2e325928fc05714bf59a9f8aaec302f278685d0fae90b8511d246a156936101f6a12fe76a31d7aaef5dd762b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1h"; +}; +mtgreek = { + revision = 17967; + shortdesc = "Use italic and upright greek letters with mathtime"; + stripPrefix = 0; + sha512.run = "fbc20f61e1d4e9d3ebf4a92216c7c007f2aec2b2cac0aca6e08f0e1ea5f6f405a32d947efcea0057a025a138afc85e0d1486191ee82fa9a0e9f2f6e2542a9e11"; + sha512.doc = "49631058e9bfc59dd38a7e0e2134f6d9ddf68779a6f8087a056a89fef975154510496415b782102dfeae6b5563527fb6178ce301b004fe33a4dfa8dbeb4474ac"; + sha512.source = "d69c6248a4d8fbb9a64cd539e7f66db5373f9551d27c98b755377594f9b1680a323719599f5963972d169399a0686b5e6f500148cc54881d23d8adb3b91bf4f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1+"; +}; +mucproc = { + revision = 43445; + shortdesc = "Conference proceedings for the German MuC-conference"; + stripPrefix = 0; + sha512.run = "02ee23aa25152e80e8dc2c57f14b99c70ff57c38175498c179e505a76d967f826acf076cae2085d305cde93964f03134fc6d1027e0669acdbaba5ed5ff6efa8e"; + sha512.doc = "01d154fab3c0ad8db790b5a22fcc4cae7a5beea1a2850f5e9d6fb1fcdc6c1071c2dc294568451f40db5455826f78ae910be9572de5a4a7d870e3a18a74fc0082"; + sha512.source = "f1ce5b80ed1c79cdb5939fda97b18bd263b313496a98cd7940e990ff719dff9e633d636505c0d538f37ff26a81c33d6f625f51a479e5ed6f949f7b3ebd845917"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +mugsthesis = { + revision = 64259; + shortdesc = "Thesis class complying with Marquette University Graduate School requirements"; + stripPrefix = 0; + sha512.run = "f86bfd4362af798bc435bf6ad1f6ed6f8cbafa61a4bf273a196160bedff21d349c1d4294e63de5a2c925ec3f5918dbb6ac4f5c8cd41785ee715cbc4e903aa226"; + sha512.doc = "18b239e98e97512030a55a6a9d071e2b53ac34147f121d14687dd2e68acf3cba3bc7c36c7b64dd3221121a37cc7665cc71ce0012218ca2f8a28eefd6ef46bc3d"; + sha512.source = "8615a13f214ceee375685ab995ed91cf8521d213e311809561009f2d43745c5dae8b126ce09412a23007376e02a0b9a8abc021b2e5b8ac5e390e07640704f255"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +muling = { + revision = 66741; + shortdesc = "MA Thesis class for the Department of Linguistics, University of Mumbai"; + stripPrefix = 0; + sha512.run = "5a955e229ffe00e276c4ee4590473ba9d137d668c63294735ecefb031f2a01b310723dd2a5cf37b4c9613793df39146d08c01e2109ca37fe1d9136903cd6aaa2"; + sha512.doc = "9eea5504062340098751c51d99433f91e95bfe74b93f584e08d3c6d1ae516f6d8a18e8495d10a90a4c5f751f44854758a3a8779d56ae158397f35419218aa01d"; + sha512.source = "fd0a41543e4d20ece031b9d2143a6f4196010141dac7c3525d7dfdea17e93ce1c6602e78c00d4d310a9ceadce2d9042140b8b53deaa95d665b3fc043042505ad"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "0.5"; +}; +multenum = { + revision = 21775; + shortdesc = "Multi-column enumerated lists"; + stripPrefix = 0; + sha512.run = "e73e2d3fe45f562398de752520628032fea310e5345a247472a2807618b72467b245995f32f21474dcb5702106bf32d6394508a96c4aeae4dbeaf6fdda7bdf4e"; + sha512.doc = "889ffbce149b1f0a98e22a1ebcafc60e29858d08b57e2e567956830c679515759a6c8209901641e3d77ded31238e8fe93f7e4cdff95d1be925e3972c9005f4a7"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +multiaudience = { + revision = 60688; + shortdesc = "Several versions of output from the same source"; + stripPrefix = 0; + sha512.run = "a7d89874dbe314ab37cf42d8d520e234764bfc3fbbb6c89e47be95ef83bacd170c290bae005830286e206da25a68939ed8ee60cf11ad3f5ff9d994d568638b86"; + sha512.doc = "b6023873f5843ec7db13e551417ef4c31a2f622372f32b4ad7af1ab155e3902185b06d6f2fdd432bf582f3da8a5e32e985fde93ae88b7916062db25021a641a1"; + sha512.source = "8d528b7e27f8883846386374cc936118a9537f0dfabc71c3b993f105dee381f0cd2b40e16d5c48df01b9709f902479ba87c6b94278f6e8be98beafbf9dd3e4ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +multibbl = { + revision = 15878; + shortdesc = "Multiple bibliographies"; + stripPrefix = 0; + sha512.run = "419f7bcf8f2226cf8c60119e30da278bf6138f4e1903dc322da33ca2b22120e50b205dc0bb01b46cab0c93fdaacc37b823a812121a731fdea4cf03354d1b0690"; + sha512.doc = "68a3f99cbde27d15fa8b56730f4e9f7587bcecfc9a6ebe19a7811a29278cbe21f214465942bd4ee6cc28833b9614dfef14714dceddcdb041d5676ee7ead810bb"; + sha512.source = "be2bb39e0267d6a008dd3dab1d1fbfc22e38017656f6fd717e35d3252def115d451a1eddadc6fbb3787bee901b43b09327ebb0f676ee452db71196cd2299778c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +multibib = { + revision = 15878; + shortdesc = "Multiple bibliographies within one document"; + stripPrefix = 0; + sha512.run = "82cd48cf9097b36664d4dcfb5d73dbd6e961c2f0a8bf7816d1bc59a33cb6d2c65e0f63a9d1d596dc9faa4339536746089e34bd1b510e1b2c0ea272df5840e396"; + sha512.doc = "1d4536094c09755fc91b2657cc0eb0b0b2fd8d1c5ca37bf2f046b62a4b0be6f83a93debac8be3c5481651dc75cac2066962556370bd84face6b03aaba24bbcc6"; + sha512.source = "c7777e3c32833538893ae463d8396f894b390f642fa697b8ba237cd7183e2bc7cb86a9773530962f41372e4ec016eb96c7a060dc63081b2faf29248a65f14a1f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +multibibliography = { + revision = 30939; + shortdesc = "Multiple versions of a bibliography, with different sort orders"; + sha512.run = "faa2e16b8bdb9309e2f16cdb2c717b59c8ecd5d73e4819d72ee3226a80fe0c0ff6b4d686d0f1d009601e0d6dea140cd4812c2f4cb94f37b5bd9cc1bd19137965"; + sha512.doc = "3e13c8c60ab8091a363b63a63259e53e3c5076feb224a6f426e55a351141f007ea8bf7526b0f80684c83e4e97b43f5f05217e254f978e8b69665c736efbe8512"; + sha512.source = "544b3778bd0a51e99e89e18e606d37551576d655a01b46523786d6f910cf84b3886a8b29c72b9e0c25b3ae629045470b24e2741d7894f867437ca069cd692cb4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +multibibliography.binfiles = [ + "multibibliography" +]; +multicap = { + revision = 15878; + shortdesc = "Format captions inside multicols"; + stripPrefix = 0; + sha512.run = "5e4a4eebd7560d4aebdaf7035b9bc14116a32cb2e043aa93afb9f95eaf271fdd75fe7d2b6296d36327d7aa5b14b52046b0c941ae949584ad27a2b89ebe54b6de"; + sha512.doc = "644f46fa6431f0f7bbbdfed8a346887d107c8ff7c8d5b2c826b16994faa48d83ca59cd139c16fa144122e0425e6a2c592762b86568f17fb914dd943cdb7eb808"; + sha512.source = "95df0571a8741db7d0b4d3ab0fd0d1469c531a00e3cf524977fe2cec57c3cb9ce9cf3c3136b42a8d0fb8f9dea2e8f4cc6f07fa48490167094e04c0e688d45527"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +multicolrule = { + revision = 56366; + shortdesc = "Decorative rules between columns"; + stripPrefix = 0; + sha512.run = "46c8745965a2863f3ded3aff6a910e1971d9aa3127a33c36431d68d1150075f52444495c0fd16fa1b737d2f1dfe7058879f7a50003f763cd0d28781f62bfea0e"; + sha512.doc = "42d7798d38abce4454a726dd2998b94e4171bf963108a8ed18b05b5acae739e19e8e1189e74cfaad02f4ca92b32e7fd0afe9496fbd35983574da8607441a2295"; + sha512.source = "53c008ef7b7b6505a592ac3684ae51224e9a1d7def82822a376b7b4b6e6f1ccfe3cb2e2dc677efce6ac3807b5ac7424c34003df2006b8682c89ea78a060178b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +multidef = { + revision = 40637; + shortdesc = "Quickly define several similar macros"; + stripPrefix = 0; + sha512.run = "2d15975c8a191cc08925cc8cd74b982af909a7488a68e4b6f5eb4c2ba0dc94dbcb40c4347c5c4774fda24f98efff52131f6a243e1e6bdcb4dde7e683e408d6a9"; + sha512.doc = "50b26f8fcfde20dd04f3e3701d611631c8914e9488a3f87d25e0c60803090133f9abe889b449c67a09ccd5053c67c4a3ea699d52d44480051391edaaa7ff9ef7"; + sha512.source = "4f506eef5dc2bbb8c740d3b25c00e21a56ccb02410adc85788f2cf2ec7da81531ec5843d0a29931ab1aea0b4e8280eeb235b6a97505fb777068d902199cfd084"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +multido = { + revision = 18302; + shortdesc = "A loop facility for Generic TeX"; + stripPrefix = 0; + sha512.run = "5c861bddcb8b2bdb654dc4438621834a68b2bca102799317c9a220f9bc9bc4c9d70775375302a85736f8706bb7fbfc1a4c24fae2f850237e8f54ad521b1cef83"; + sha512.doc = "8cef36438fbe57c54f625b178331f7a6ca19854abcddb475283fc0cb4a362764c443de05989245e962dba9e2e4f17734533502fbd4b2ef4fc8e8c36b96bc68ab"; + sha512.source = "3f3f6f5813ab1da542ebc9c4837da72339804866875bf225292d8a36ebf54b33f12d3e84de9d0b5027d3e8889e10180649a19e25c7ec6bb532296e9e204e25e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.42"; +}; +multienv = { + revision = 64967; + shortdesc = "Multiple environments using a \"key=value\" syntax"; + stripPrefix = 0; + sha512.run = "04090331e44ac252dcc6929ec995cb0e6d38922729a6af99ba103a833d1ac93f7553d9314359cc5b1ad16d16757828e57059a6f1f8bf2892abc41b2d901fb15d"; + sha512.doc = "29dfcd04a9b88d6da8a279b021e3178652c388a9afce5063e863307b8030fce66dafd48ae2a7e18f1e5e207f0f11b4d6c8da035f0799ddfc47856b7651d7fd9a"; + sha512.source = "5c636e3040ec84931a7188151eff2eb4bd2696c4137c2e2dc27dcd2190cc316e3c75ebf74c49f0eb6c8e43900e87410c3ad414dd623c045f58ba1d198ef630bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +multiexpand = { + revision = 45943; + shortdesc = "Variations on the primitive command \expandafter"; + stripPrefix = 0; + sha512.run = "63f512ca5b9649c86a6936cc2407737e41afd6c6a3b4810fe81155a5b4127aecc538303e26b91f53decee900fba7946e90a46a545b3c9caafb3e0863940e0009"; + sha512.doc = "6b8a727aae2d314877df551ca5804e84be0bc530b4f09d8bfe6a9c1a4c1eb98647257beeb1813a183f0aa5422b0041443e817ce11b6db70e4129e3edc664e788"; + sha512.source = "197ad74e02212405fee0c79ea03021172e7ac5a99222e0c0d300da6a141bc694a2957c544bd357fb67fcac24acbbb4059041bd37f607b29f5f763b59b70613f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +multifootnote = { + revision = 63456; + shortdesc = "Multiple numbers for the same footnote"; + stripPrefix = 0; + sha512.run = "928a2086fdf167ae23f851ec6da8cd84a012e85c97f56b7ed62fbb2873cbc6cf2793a02c8c23bc76f0bae3089edf9c594141a9029920d9f1038f7cf4b39c5e23"; + sha512.doc = "9e74a56d5d27506e354d0d68b4639df92ba4d017354e3f12bb2c9be33c210eef6cd2ad3dbcf0fa17b75b0c938da9407f0b4f9ce3e5fee000e2840d702d28fca9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +multilang = { + revision = 49065; + shortdesc = "A LaTeX package for maintaining multiple translations of a document"; + stripPrefix = 0; + sha512.run = "57f9829b100068a84feb8a09a94066b93ec5fe70daf831ea99604089a4fc2f67af76f79505a2eab6dbc8f2b025feed6d908a1f24630e27e0f7606c4a3ebb71ca"; + sha512.doc = "e611f2195fc4f7083d6343eb3554a2e786fd6522383456544e45346481cd57d54b0899cdc6ffd9edc4b75567b1e092ecc597bff660d849e0ce2b3e2d1bd55507"; + sha512.source = "1e52e9c740d0eae4f89eb4a65e1d12b3d5f159cd6c938f729bdd019ccb8bcf98300a544fa7131fe214cde9b7b58f9b64a771a49513f45943c681893fbfc78b6e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.9b"; +}; +multiobjective = { + revision = 15878; + shortdesc = "Symbols for multiobjective optimisation etc"; + stripPrefix = 0; + sha512.run = "80b0f340f19dff329cd9f0fc32cbb9a8cf690243aa925d6687b9da345984f9eba9c0db7b62fedd2a54f077d841b9cbe91e47c98140f1cfeebdb16fc05408898d"; + sha512.doc = "3a7c68054a85bbad36b6516c52ea74c35ce11c5ffd6f3d1f235ecc2ea55209343a4ff609857877094fb7f8861e8b7c54c8c979d06cc3b3583fb64e997372ae9c"; + sha512.source = "99b9d17438d9f3f8a6ac40d0e705371d255af957fa5dc78dd6d98c89b515cb5af7377b5ac11558c84c7908b7efc7faadc9be83b86c2a255ba8c4033a69be3f4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +multiple-choice = { + revision = 63722; + shortdesc = "LaTeX package for multiple-choice questions"; + stripPrefix = 0; + sha512.run = "975e7ba809ff551faacfeb8c40f0965da34068b4d4d2d0d14d9334996a245682e74ee05a4ef99fab064263c14c0ee4e7fc50372184c2db7ea90572eb9f4beaeb"; + sha512.doc = "334d989ca885f640b339028d85acefc8d1762b587e652805ef49a97c0cc1cff9f87fdae884c613719b5c377eda17f85c22137db6a368b663a389661bf34f6e4a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +multirow = { + revision = 58396; + shortdesc = "Create tabular cells spanning multiple rows"; + stripPrefix = 0; + sha512.run = "7591c7994fcac6fe351189c1364b448ac8b82e88bdaa50ec87c72123961a1bddfc02b397d5955eb96b9d47b4bcc9b6c1352eab0016b1dec24e034a95c53323fd"; + sha512.doc = "c02af3deb73b076662da0f45769dc57a7e11546e225f0df76f1fb163251e070b09203c4434382b7d4c3ad110460d0a1b6b0b384079b4a7cb54d105173fc7c575"; + sha512.source = "0b6880a377534734eec1945b91a8479bbbaccb61c3da5b4986e53ed0d9e0837f88ddc6c1718a36482070a12dfb490c0295123684707ad531213b219f314d2d1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.8"; +}; +munich = { + revision = 15878; + shortdesc = "An alternative authordate bibliography style"; + stripPrefix = 0; + sha512.run = "d8d2de2245f24c6993fcd178e2a21891e66b5b99039e8969639d2a9cba15abc6c3c50374db61c8082695a969a69ddce902ff8b5fb8104fe66ba1384ef99b93f2"; + sha512.doc = "ed2dc99df090a012f1b1b922659eebe4c2d8523127e17341b9c4b66413acfc89f8b64ed639c8fd40ace0f4fddc8662f42630411c67026311a26fed436a363b78"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +musical = { + revision = 54758; + shortdesc = "Typeset (musical) theatre scripts"; + stripPrefix = 0; + sha512.run = "4bb8bd0781cd49950f2a80ed9527de1b0e49ef6eefea5787d1d13efa3893d57b48a9b69ddf0f62bd2695a61d9b785cfa1dfad2217f8cd97929e1dfefac9333c6"; + sha512.doc = "c06f45815ff65fa7c492575731bf1aec0e774cf5a81907d1e381ac8ab366c167ada688b8c8fc82293c96980c5361a688eda666b130c1ac3f39976d49bf78f60c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +musicography = { + revision = 68220; + shortdesc = "Accessing symbols for music writing with pdfLaTeX"; + stripPrefix = 0; + sha512.run = "310c10402a269d7bf44a811b841be8a8058ef8eefdfa4440fa64ac27983fe1212134e4a616b3979ffa4f63c8ee86a7ccc5568d49c195dc1683b326a501cd83fe"; + sha512.doc = "52dc06ba9b0394c0ea66fc02094174b45733002a3a492784b1e67670614caf57a162d5ab74cd51bbe6d884fbf0f04458d6eeafa2faf637ccfde4fbbfa435cb7f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +musikui = { + revision = 47472; + shortdesc = "Easy creation of \"arithmetical restoration\" puzzles"; + stripPrefix = 0; + sha512.run = "602132bc51f1ed20f045bf0c822f201f7bbf3386f9181599894e66cb3c59f4ed15364013a5e30bfc59b22ab3fe4931872b779d1e7f34b8dbcd1eabe058b1f5e3"; + sha512.doc = "29cc8526543698f218e8c9c20b424fb2b05d3ee0a67c70a2afadd33dc49f0030ceb440b349898b8bd66a53a5682aa8289d081e4502fa5ccdfe481b4e2430de03"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +musixguit = { + revision = 21649; + shortdesc = "Easy notation for guitar music, in MusixTeX"; + stripPrefix = 0; + sha512.run = "6262e1b447f517680ddfd9e5e076ea384dfa7fc8d219e7a2613a80ba66a0f0435d9dc31502f6abbfc150fa1e2de001afbdec25dd5778e3ffe559ea389d57208a"; + sha512.doc = "8a6c9a42383d6b35c1300b958a7629306a6883bec1bd68751165eb3514f8f069c9995247142bad459e06fa42378a9ddd23093cb749bb2ccd58743312f83425dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +musixtex = { + revision = 69742; + shortdesc = "Sophisticated music typesetting"; + sha512.run = "ee6f9654d867c1f8a4e4a5744a927f511510ef2397d8b452f635704154692cdd128a73fe6c6719099e9794e727beb1e38b211a61d15caa3649a5c059b0be8376"; + sha512.doc = "942fca6475fdff821fa847c06d6dd8f92cf786e8f0f79d8edeab6276dad177fe97b8c70adb86db424b99875952b93151db35007575744fbc1d814e28ea03b949"; + hasManpages = true; + sha512.source = "61984af8c6a5b024a6e5afa310b42953bb12c68cbcde2af24dc885bcdf28854eb0bc44a764d6ee25d6dacdb7395c62941964fea8768f11e75e11835dfc6e1363"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl2Plus" ]; + version = "1.37"; +}; +musixtex-fonts = { + revision = 65517; + shortdesc = "Fonts used by MusixTeX"; + stripPrefix = 0; + fontMaps = [ + "MixedMap musix.map" + ]; + sha512.run = "53c6f1b80b789608ad1187a2d593474c12d71b27ce9bd8c9c0cc7d2ba1bf3501c2dbab6375f51eb4841646b1f0dc7ed1c641efef6bc32dbaae3cec56f6583e09"; + sha512.doc = "eff2e4596dd426f1f57003d6441eb0632f7b9bbbb216ab4e2b069a1a624e77e06f032f191ba13afd2e55b472f5a719936f34fcf2ba6997336a3c3716c4d936c3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +musixtex.binfiles = [ + "musixflx" + "musixtex" +]; +musixtnt = { + revision = 69742; + shortdesc = "A MusiXTeX extension library that enables transformations of the effect of notes commands"; + deps = [ + "musixtex" + ]; + sha512.run = "cd36d0240d3874930da5ceb759254e6b6e3d7cff6ef12aa74ce3d532580b731fe79cce0ce729d4304659691c13a5e28e3c02098cff7ece22f010e8051afcbf56"; + sha512.doc = "9d5646e3657c74a6d6c6be0c3f07e91ece88c9f0430e7cd54fec45769ac308b813a0f39ed202b518092d856e3fa0876c589f36f37c38b62adf078647aab42a63"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +musixtnt.binfiles = [ + "msxlint" +]; +musuos = { + revision = 24857; + shortdesc = "Typeset papers for the department of music, Osnabruck"; + stripPrefix = 0; + sha512.run = "3ad7bc18f20b0df70f6c92f7816d4e5bc90070a392788d93caffaba39f25e516a1ca4a6ef5438dbe55b514822d2882e7dfb809eaa4fb1380475fd624ec3efb9f"; + sha512.doc = "a2bc27d789cbd6833961d41ee6d697004fa7539810aafa8749af918572dbd20e2f267bb7435c068fd604540d0a75d1a558fea38a8cc7748c9dcf087c17469a61"; + sha512.source = "55cbd375a48388b310c52e26b02b6dcd56f7d50761addaf275de656a2668bbb0c436c742649cfa07355e626c3ee01572960fc0177ce4226f764db2b5c3e04598"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1d"; +}; +muthesis = { + revision = 23861; + shortdesc = "Classes for University of Manchester Dept of Computer Science"; + stripPrefix = 0; + sha512.run = "66345512d1713dcd352feeb46d8ad9c609d4c9364a37b47b5fc0207800f6576831e15d7be59ce13f560ebedaeac9a595f2bd7045b621fbdc8e20a3b3c553524d"; + sha512.doc = "5ed08b459ffdc954f5857be1a1970e9a23d2cfc23cbb04e820b82368b1febb9bf04811e53ce6fd05cc12da302d182179d29b278fb99157e801afd05db15cbaa1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mversion = { + revision = 29370; + shortdesc = "Keeping track of document versions"; + stripPrefix = 0; + sha512.run = "3031b6aa9408bfb0994ff23c36f6b3f770aa8beac0e94bfe1361dc2ec6ac47859a996ddea9f5283833e5711d0308ebfe5aae91bc0ab564c6e83056d7394f14f5"; + sha512.doc = "bf7639f024b214c2b8b73cbe4f87848f390d106f46afff6f6a1257d80b37a6b7b02d8d9224580d945b93b3f86a43495d00c5c07d22e8428703036dc43273ad41"; + sha512.source = "22ea633c451f88302061c2d3427ed52e561bf31bde30456e632f3abbca918a329c40e239ecf0a2f2b219a23da063101ebc9a23ea5fa355e479ee28a9404d50b7"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0.1"; +}; +mwcls = { + revision = 44352; + shortdesc = "Polish-oriented document classes"; + stripPrefix = 0; + sha512.run = "045fbe4985684ff7bad3a7c493fa0b37e412e698ee5eaf31b4ccdf3e185433d185faeb78bbbae7e11b84354e4dcbc24c8f2cf549a64b81ed0b6adfceb4bc8d8a"; + sha512.doc = "17b548e9db8a842c16367cd27b3f5639fdaf418f1967155a72c90e3e91d47a121c87dcf2bf0c6eb9042005d54e04ee40b367e0d81c7e2ff57de04da617f8b1b2"; + sha512.source = "aff2829633113538493a5634fa11d11a65d643e65afe74255ab31141ddd5fb39f6da59764507af10314b1d458c5c75b1f970b808b1e90c53d211cb4bc11f3b55"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.75"; +}; +mwe = { + revision = 64967; + shortdesc = "Packages and image files for MWEs"; + stripPrefix = 0; + sha512.run = "707e5fbc793f608432e0c565311964a8b92ce55dfae43649cab61b767b22d35029a781fe9cf5997505afae4ff75a48d82acff95cd18b27b72033616ab06e22e0"; + sha512.doc = "d6cb1e619dfa4e99128e4fbb95605eaeee694c59636f6759055f3ffa7ff13f12fa1a6d73a26e72baf63bcdb9737ebb41795b79367498e2c1122ca2b15c4fbee0"; + sha512.source = "aebd949d303f0de76079b78fa94f6c9d941c2cde5f35b25dd8a9b3db9dafbd4fffa73e5edc216d1b68ce15daee383794a0553b905ce29977c56b03d4cc6136ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +mweights = { + revision = 53520; + shortdesc = "Support for multiple-weight font packages"; + stripPrefix = 0; + sha512.run = "50d675bdee00625b5fbdcc1ef923a48abc19af890faab90ddde4893081dd2a5de6b5ce9165a4bece512c885ba3f3990d8dc300a873177c725a5aa16b434d4e77"; + sha512.doc = "b103ae1a7e4072e646aa70ccd660cef52b6954deec6425fe2007c15a1f56fb45d43d276449e436f188e52192609766237ec22b69c7782af5c0e3f15081989dc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mxedruli = { + revision = 30021; + shortdesc = "A pair of fonts for different Georgian alphabets"; + stripPrefix = 0; + fontMaps = [ + "Map mxedruli.map" + ]; + sha512.run = "f721b48b71ae2eb74104e23989cae84d3316b322ebff4703d9bddf74e0ddacf742e279813977bf29883fd17f01049112169d02aa3e4a9be887c049f8484ca0fe"; + sha512.doc = "ea9de17ac138af2fdfbd624e0c516faa2eca674ae1c423cc7f972f87c1bfbd37812e199f68b463c07213fa263636490b7207baf68506514f73fdef1d6c041a49"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3c"; +}; +mycv = { + revision = 26807; + shortdesc = "A list-driven CV class, allowing TikZ decorations"; + stripPrefix = 0; + sha512.run = "72e74c30c994441aac708e719e894d01bc3d1a6570863a589dbacae8e3c69f70d192abf7473b58a026b2859f7f10dfd1e56827cc759898248e3cfc9d36f37583"; + sha512.doc = "892d0c10fb8a2dd9a65bb6fa4dd48fc3ea49803a7e633cd390427bfbcc8f16f6d213f9ef511c7202521b518db4c94bfdad5197c30b2c8786bbbb6c6f188293a7"; + sha512.source = "56901df8931579aae3cc8f51e7c6c6542cca3b1b231512e6cc27b88104c39dea50026f0cf21b2b4251f4e1ddfe4119de7ddbde6f50bde743296bb84195fb5f05"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.6"; +}; +mylatex = { + revision = 56751; + shortdesc = "Make a format containing a document's preamble"; + stripPrefix = 0; + sha512.run = "b7ffebb46952c41818081cc14545d429fa65e376a2214d0ed41b56cea05cb1d3146d87513b4a701825b01bcf1ab268cefe6e9d709cb627dbe7b95daaf439d509"; + sha512.doc = "791cce1eb8370e62642b64389b26a91af563ca875268039ffa978cd07a743b999573199f1a3851ee65f8118cb462ab5d5c658118a735875db90eb8482246e889"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +mylatexformat = { + revision = 21392; + shortdesc = "Build a format based on the preamble of a LaTeX file"; + stripPrefix = 0; + sha512.run = "476e2c739c9a99a53a9f6bb7eb32e6122c149fe224497cd8e777af0ebd139ffadfa792090d8673ff96b4e17466e918f9af4ecb7a12c608d4c33d4e17f2b26f0a"; + sha512.doc = "c0754ef147a457e7c91b16a50dab2220fbf2f5385e126e796b1c65025f0fd998371b4e58d96ae72b8c6eb21b2030906729270c88c0914b1748714455e78d1bbb"; + sha512.source = "4f172517cd3e0bec77bc9003201a4488acfedcbddbca217ecac4878d3df9ab86719c5d9fc645671bbf3a5d5b66a1c4e80f9acc01ef27c82a3eaf13aeed45f857"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4"; +}; +mynsfc = { + revision = 60280; + shortdesc = "XeLaTeX template for writing the main body of NSFC proposals"; + stripPrefix = 0; + sha512.run = "6736bcfc3e0285b4def1b690fa0be98da319ce91f3e77978f08afc81289bc64b9a7aaae1d23a535a437c68037ba3cf0c068846ded35e3a6f4a26fbb7fa1be382"; + sha512.doc = "0b8936f3a2f36f68be9b1b9ba7c90f60babf6a6c9c81ab165ea947829ce0cf4230cf9f53d0acef3dde83c2fad10867e7316f9dbee0757a7fb9dac98b683d811b"; + sha512.source = "613c70050fcedf8917d39d2cc212b19fc2b1bc983e442d33bbce4f1fcf99cf73a8ee8a51c44eea090deb76fa57ed6b075b9fad12ed00516b80a2314d0202b988"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.30"; +}; +na-box = { + revision = 45130; + shortdesc = "Arabic-aware version of pas-cours package"; + stripPrefix = 0; + sha512.run = "8b0659454d8324ca51c9e97f7957a3c14230dca0b4b8e047b961bad1b81d2a8b0220cf275bf84e9aae6a3d601fe93df3de94f603a198f6bea716064ae8675d0f"; + sha512.doc = "2c78a71155eab3cfdf551830051dd360f6e9fc8085ebe364c13a79a1ebda0693d633e7ba08e31c356e46140c33bf3b190365cb88d944d2b3e8c0799ff68cdc8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +na-position = { + revision = 55559; + shortdesc = "Tables of relative positions of curves and asymptotes or tangents in Arabic documents"; + stripPrefix = 0; + sha512.run = "fb88693c5d626331b9deab494bdb0fececfcb3d6f76e91f76f467ab8f152fe857e4ef41f87b38092118646961c0f64f82501f0f75f5610d793b8158d77bbbf9e"; + sha512.doc = "abe7a0a765cfdd1d4ff454180b32d4153cd715d9af333221ed3213082dfbcf5ae0562617a2b30835a8aaf2a65c166e6fb3941d3bd6c781d83d65e971bd53f356"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +nag = { + revision = 24741; + shortdesc = "Detecting and warning about obsolete LaTeX commands"; + stripPrefix = 0; + sha512.run = "a2d239ed1e12fd1b082c8df5531c9b83cf55c39b13781aa01848f3fd06136a9522598abf9e63580a93fb12ad7c392061b14d5e96b4d4f4dcf8180180280224a0"; + sha512.doc = "9a4859b67182b40428f720e2e955b591fd3fdf30acbe7c3214548766312833b3ebd5a046d1ca2e2b824e3bad95bde635a1cd112e8023395333cdcdb9cdf55ba9"; + sha512.source = "969b7e463e6e8eca51af114ba51d538d0a1f7b9ed3cb5dfecab92ec7eb913a872b740b2f434e854a7c11b31c7b3364120379a5732220833235912e73ee202878"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +naive-ebnf = { + revision = 67892; + shortdesc = "EBNF in plain text"; + stripPrefix = 0; + deps = [ + "filecontentsdef" + "l3kernel" + "pgfopts" + ]; + sha512.run = "52780f4292abba6d621638637f8c3d11a3a39d4e26c3e7a10e077f4369624ed0f1fead7aa781d9d0017b000618bf08ade1bddb78e9d773c3abd9c6124ba00068"; + sha512.doc = "f2abf68012f902440e17235fd49c55c4776d79c3e7db46d18e203b47160a427545201170c6644a18d33874a90c6770d83fae576da68befde87da17606ed577e6"; + sha512.source = "a149e3c6ca7f22ed9b9d7a03c0d5bb941af809b6145967bfbc63ff96aec966eeb5e657cc0bc099c7727af6c2ebffaeb6f45474104c2c7c1462295ea115ad0d87"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.0.15"; +}; +nameauth = { + revision = 69758; + shortdesc = "Name authority mechanism for consistency in body text and index"; + stripPrefix = 0; + sha512.run = "2b27daa9547563ba455b9b3722c8726c1ea5c71d1c4976857add784efd95202cbdd2ed631096e85a0408deefa8e43c95dbb8ad7c0b6f1ef3da1f8476737c341f"; + sha512.doc = "f8d9f727c25cf50b31d28a3e4a53a7694c5462997f60060e7a2db15e38b14554df00f5afcc3675c5b6bbab477a11f499e79e7a98988b7bc0ef0146a43da5c239"; + sha512.source = "73615d907733c3252cae3e861a531fc57dc15b2b2ac0149b976f0a192d75c4463fdbed60cd25a19231b5e10e1d017d1e1ce27a4006488ed02ad2dd185e693342"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +namedef = { + revision = 55881; + shortdesc = "TeX definitions with named parameters"; + stripPrefix = 0; + deps = [ + "l3kernel" + ]; + sha512.run = "c413d600911ab1107554ec2aacadc80fad12a95e7486817c002274f282e047915d06f4878e68e423af649569752cd27d7c1b3a802a9abff68e91038719b2fd28"; + sha512.doc = "72031cf2858a3b68092c852c216f96aaea212c721e47d90e870c8153f83db921590246fb11b59009d431754720791e3c625fb3abd7bdd9010cd1a49894023ebb"; + sha512.source = "adff08a774126c8faff52ba14044a8e2140f9586358dab6ce95e7a941706bf57c32acf0ad75282bd3b01dec8a73fea105c0c65a1453f5903d5eaeb3fe0349b15"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +namedtensor = { + revision = 65346; + shortdesc = "Macros for named tensor notation"; + stripPrefix = 0; + sha512.run = "0925bc8a0a9f0cfee910470318fe00972d604e815aceaacc358fc412f3382c5cb5a4f9b1a337b9f609f0060fbd82bf1a7579ff611685a992b68eddd5348a8dac"; + sha512.doc = "9127b5d7c44a4b2a1cb28062f3a0c18f61711dd72aba86ceb9b948563ea5cbaedcd0539e0ef8608222f957f6fcbe878848095fa48131b564e26b1bb654ac8395"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4"; +}; +namespc = { + revision = 15878; + shortdesc = "Rudimentary C++-like namespaces in LaTeX"; + stripPrefix = 0; + sha512.run = "71ec09a2aee5f299e9620b9b90558bca11415cdbf4304d0e5777896f85cf4e30cc39508fd69ff831a86707e230cfca1773fd9a8bc50c37f310f8bfeff629d2d6"; + sha512.doc = "4bd240f3ce155ea517fc267af1925f2e84f7af694a1ee4a068a2679d97cb6f97fd77f8812017e05f33c935bb54a34459a9deeaaf43cdb4ed69d792676316734f"; + sha512.source = "33579dd40ba708e2e8a727f923f727f893f2f8e9562d369b1e025b50300250010d2829217a7aa72c1ee5781f3ed501e60b010cfc3cf3211b4bed1168494fa4ab"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +nanicolle = { + revision = 56224; + shortdesc = "Typesetting herbarium specimen labels"; + stripPrefix = 0; + sha512.run = "e9f90cb21730e34fe03961281527cfdea0f7c15e349b9d441747be7ba591c40ac876ebed92f884bd502c3cf7a99f2f6f6328bce515680100c2f9a3d7e04a4aa4"; + sha512.doc = "3d159eb9fd84aa8bc6c183ae6a42aefc331b9bd606abbc1b2c3c53776d5b8f1554a4ad304d0555b8d2c95be2e8000eab0a3ec6a167e089292099bac6751782d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.03y"; +}; +nanumtype1 = { + revision = 29558; + shortdesc = "Type1 subfonts of Nanum Korean fonts"; + stripPrefix = 0; + fontMaps = [ + "Map nanumfonts.map" + ]; + sha512.run = "fc775dae204d8f1ca7e05005ccba0bd568f00819519d34b2282028d7f2b89b9c1f9a091ed192def7281de97ea97c75b9327727489e8ff88585bb97cf5e8b8f10"; + sha512.doc = "ff0bd0bcc32eb8166e7bff9d440692a3c21c5cc7fd7b8139b472fbc2e079cba0591d162e2a81090919990dba31d1e04b57d50c35ac1d0670ef9102c64abc88ad"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "3.0"; +}; +nar = { + revision = 38100; + shortdesc = "BibTeX style for Nucleic Acid Research"; + stripPrefix = 0; + sha512.run = "212f1a002743ba14eac41de05a88325533db8b25d9f12b141064b9aa98f78dd5c28caa7cdaa4419829e6180e56ff93e42b069cdebb52fb8ef40c9652b8a23c79"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.19"; +}; +natbib = { + revision = 20668; + shortdesc = "Flexible bibliography support"; + stripPrefix = 0; + sha512.run = "7e78ab76bd86a864eeccef86a64fb28b6b063d5a12210da80f0c5a5608df429fc2939580b88263dc50fd68d841580a12358617e20a0048ccbc9e148ba04d5f26"; + sha512.doc = "afe78103a6ba2d58c6f6ba6927101cb481abb1b028c4cc09dca59296d30978c636e837c248eb4f8fa44aa8fa7f6db1e1b6855afac9d99b0cfa030dbad6e59edc"; + sha512.source = "ac850d6b92e7cf538f564d052593319ec1b1366d74dbf86e55f0c59ab3a01ad79b780378e816289aedf9b645774cbde56b7d186abafa8d1ddaa6c32d676141eb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "8.31b"; +}; +natded = { + revision = 32693; + shortdesc = "Typeset natural deduction proofs"; + stripPrefix = 0; + sha512.run = "85568d2bd3b729cda5e4512a2e3309353e7abdcd6a02ee3f86e07bf65cd74ca9581d7b2746d582b704a116313b77cc5ea94f19fe0d233a3b41c4ae88a8704f12"; + sha512.doc = "5cc23aaaf6006c1f77d676ad1f20d3a62d9ac8d8be6f41e68085844f6060d570baa04000bf3108c975add502c7ad62086509464753474a74c43d045122b28294"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +nath = { + revision = 15878; + shortdesc = "Natural mathematics notation"; + stripPrefix = 0; + sha512.run = "2eed9bc55d9d994df8710703c5acee9fb07d8c9732288740cc3c20740bd8db1e3d22617886818ceffb0346110dcd0dbfafaf192878500b2865523d00c6e02bf0"; + sha512.doc = "ea75b3f282f81963484b2f6b29513a99f3153f222931dfa811deca40cc79a814a225a0a79e67237f53e3aabd33f7749095d3c7fb8f374ec802ee054ebca291d4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +nature = { + revision = 21819; + shortdesc = "Prepare papers for the journal Nature"; + stripPrefix = 0; + sha512.run = "78b6e945642bf2073e49acb318a0ff78c1ad24d38c28133b08d5e2881e6e5ee2dd6e8634b467047145dd72d08bfefefc631fd81c7e0facb590be2f9f4798ff6d"; + sha512.doc = "cac72025fbb65e32fff8dbe3a457e28b2953ce2a14b9359b93724073d1c56761524f2e3200f80aabfea1aa0747fb010bb78586978856c89348fcb255630e5d9a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +navigator = { + revision = 41413; + shortdesc = "PDF features across formats and engines"; + stripPrefix = 0; + sha512.run = "868f3c08b71f670010fdad0320e4792929d31c2be1b29fbb38da518288596dc299b58635ebc8e7551b9191954b76280e87c47b1eb3c4987fbae3afcd133a5c2d"; + sha512.doc = "56605790284309e8b6432152bdd6765172e9e7c9c6ca88b07ce5b4b19ac792df21879999a47663dbffe7b3dfcf6da0de3e8f8399cc65fc96dc2e8e3a57350f47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +navydocs = { + revision = 41643; + shortdesc = "Support for Technical Reports by US Navy Organizations"; + stripPrefix = 0; + sha512.run = "b1a5afb90babbdf8fbba1915b88cdbf30a0244d8363c25dd9ce33bb153f9e8e0437146d9883016a40b1cf55c1dc02a06a7d2b72947326f5dc13998beaabff923"; + sha512.doc = "2122252986f1fc852a121e09ac4f6a6a6c23f9227e374809f2968e729602f6d870bd9293fe1d456c4cc04aa48ee01361d37695c7290bb047f2c8f9a41981d3d0"; + sha512.source = "aedc1a3bde2379780b1042f9fb103081acde19e4f76f5608d0382756b8f9bf0d4743aa3aa66556bfc9240d2044336a609f3b1efbf0b4780af87b66109293b225"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ncclatex = { + revision = 15878; + shortdesc = "An extended general-purpose class"; + stripPrefix = 0; + sha512.run = "88ec3d2c350521fdb978734d32bb7eb9bacee0ecb95ae051d7bb039cb86e6dd1eba3b4ae93881ef8fa2623e99f6dba9b126373f181c4668176eaaafa94aa992e"; + sha512.doc = "e9c08ac08ee2316b07610bde89aee98289b937e8dbfdc86b392cae02037632d6d303c799f74f381f89a6bd4f4397a8c4d78025a88b8fa4ebbce4be663167f2ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +ncctools = { + revision = 51810; + shortdesc = "A collection of general packages for LaTeX"; + stripPrefix = 0; + sha512.run = "f7ec6f6c51d2a4f071b85cf28299a4a11eeabaf225c85cd0144bb0971ec3da44ee9aeac7cdd7501d258b7e8cf25b3e3484cd60dbadf0ff3ee05767c713c12dfa"; + sha512.doc = "a594e74455024dff7d38a8a750ee02637341f84d342a83409ad0e20a1b0f292c370e16c1b267c2d6a58975f45a6b4c1092c8518653994392cf4dc08fe8553644"; + sha512.source = "9fd3fccd2383ba6dd9f32766fbabb5a2c108c335eee1b5fd6dd11d93d5d6944bed22877b640ea676bf9721a69e34f0500a3bee131a4bc65feafc348207d131b5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.5.3"; +}; +nchairx = { + revision = 60196; + shortdesc = "Maths macros from chair X of Wurzburg University"; + stripPrefix = 0; + sha512.run = "3ebdb5c11c57818018172d87f265760039f4de415eff568271dacdccfae4aa1b8b3c646d5c68b4df55b66f631679c0a72c17283d949a35047f1cb8a536f582da"; + sha512.doc = "2c58e3cc770a2180d010688683117a8beb4c8dfc17d0f6502647b5030ec3f6db1131201a352e0ab0247df158b4d5c61ba60995dfc8ffc7fb5e50e6a03b16c2c3"; + sha512.source = "f1621721f65fce09ed2abcee3997dc1d2eecbcedb651641a99922362d4586be53c5fbf3c9d07cf1834ee6dfb79d67d7b20ba070ddb80f6c302d053979e3d59e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +ncntrsbk = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map unc.map" + ]; + sha512.run = "cafa6f6ba366c07bfa0fe37ae415cf924ca54249288a52726eed52b9c8147925b6ac4a85fcb69a19596944ed8585cab4ce8fc2710a7c32998b360ea2ab143d56"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +nddiss = { + revision = 45107; + shortdesc = "Notre Dame Dissertation format class"; + stripPrefix = 0; + sha512.run = "62f951bce52bab564ab2671bd5d019ff9f6f5ad1d8a18ae9f8b574226aa83e4d3a9c6c931f4830f71c43499f68b8b06e539d55a027e712ce4cd2c03e349d3fd1"; + sha512.doc = "bd92c614f160c50a22ff83d296f0e511909906459cfcb7100c615170ee9fadbd38ba032bf95f7b25a083cae33c80ede96964d3b81e23c481fe5a836d91967ad1"; + sha512.source = "498e13f4e4bbf8e2133870854f75feb5617a517b55593ab90c203ba860f95599ac5b010bee58d4f35706a6e17bdba54c66e02e04281bb548e62b335c576a6357"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "3.2017.2"; +}; +ndsu-thesis = { + revision = 46639; + shortdesc = "North Dakota State University disquisition class"; + stripPrefix = 0; + sha512.run = "d79b603726abaa506ec0cd59c30e4c341839c1dd6f7b7aaeb536385d22d69a37d764499aba390fe7e1efc6a6e25ae6dbb7e92bf659a771b6f4d6ae3b5a2c98d9"; + sha512.doc = "8e93554ef50d43562d1c42fff3da81b77b4ae444d644e5b1a818571e80cef88a2006f1b1c61c320e467724df7847be50f4f3ec1663bd767261720cc1a80419ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ndsu-thesis-2022 = { + revision = 63881; + shortdesc = "North Dakota State University disquisition class 2022"; + stripPrefix = 0; + sha512.run = "98f01d4d37fc1661c117027c7dd83e4c74001cc7d03adc854c6f869503e5700512186585b15d1b7dd7a40ec6a526f1e6eaeed1332ba9531850e6506ce2feaf47"; + sha512.doc = "ab0c8ca7aa865052422192b51d1affe2c26af465dfe3de9a0bd10a30e5cbaa8f9f9594e1337bf175a069ff189c8924c844acff0b7788692f19e44198c1f578d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +needspace = { + revision = 29601; + shortdesc = "Insert pagebreak if not enough space"; + stripPrefix = 0; + sha512.run = "663b2ffe30b1d9a588183916ccb0e3fecf3098d3e67f2a40fc49e1db1e5c1a892bfb56eb177bccd923415dfe51d4a225e2017be3b2f3f7185071836cb2e04391"; + sha512.doc = "3af05a6704a8d3c9539cab0871f9f9c8b7a241549c1b3127dfce2a0eaf77b87d54fdafff4b2749eb4614ad9aba45bd2e3d695a92243ea30472e62f7945eff004"; + sha512.source = "a629e9b798ab772feed1e66b773fbc141b0b2c2cb6c336acf61e8e3884246da1b36f90260fd47121e53e552f6569528e81ee788b6d1779c9e87eb54517a2d787"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3d"; +}; +nestquot = { + revision = 27323; + shortdesc = "Alternate quotes between double and single with nesting"; + stripPrefix = 0; + sha512.run = "cc75905a3423deb02f226340eeb6a5f97d9d83470f156bc75cdf39569da845279fe8d4a3907fdf269bac75e7afae02faa04dea367cf0326720301ba3f1c31395"; + hasRunfiles = true; + license = [ "free" ]; +}; +neuralnetwork = { + revision = 31500; + shortdesc = "Graph-drawing for neural networks"; + stripPrefix = 0; + sha512.run = "ba66b86e10f4425c063c76ffcc97759863677a673960255d5c335d215ff8c0eeb4d0f12fdac584ae1fdcec00ab04705cad716ff9290f6b1ca9c8635841f580ff"; + sha512.doc = "fc2cda90284e4360c9dd9c03611f582c7c4569331a3bf04d51152408ff8533dcc1f398f641ece389e63f9b7dd12ae471c3f6b5d8fbdea5d206afb1ab15df4852"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +nevelok = { + revision = 39029; + shortdesc = "LaTeX package for automatic definite articles for Hungarian"; + stripPrefix = 0; + sha512.run = "01d207fe9d77df0a225cd5fe718f118bc755c1e23c9dcb2bc4e0b4c2983205469baeeefcc195b150cc54f4540ea71d96cfc393fe61a32f7e85d5c9b5944c5938"; + sha512.doc = "653fea96310508e8a30c76821d1cd83dbf579052fecbb8c859d40cb39926d24ae0141b4788901b34b4839615b33d5995eed2b6a27f6abcae981b9d47b6ebeb34"; + sha512.source = "455ceb971d4617b096bb2d1c42fdb487208e8c6ccb3fa94869df08c9e89516e0f5c9e5513b0573d17929bc3284fa41ec19ef092ac7c7c99ca8a7f9e63a1559c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +newcastle-bst = { + revision = 62856; + shortdesc = "A BibTeX style to format reference lists in the Harvard at Newcastle style"; + stripPrefix = 0; + sha512.run = "bc3f53c76ec9711d2ad9878dd12a62ed5fceba680dfd89d55ad81df0bf6e63e49e8660e1aa0726ac8ef545fab1e924fcae938701a59117bb42a59a016a349944"; + sha512.doc = "c00154d8a4abc12d57d1760383a5da13af16ba5340edcdaaeeb4e61b5ceb42d0776c0967af7814bb3bc6a8669a61998b212fe62b190458a50ae1e6a03c2a3645"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +newcommand = { + revision = 18704; + shortdesc = "Generate new LaTeX command definitions"; + stripPrefix = 0; + sha512.run = "e4716ec35793f0ed4140ed3bb221bbaedaf121b2529dbde5114a575bfb8aa32a8fc56e79e43068adf560423aaf68c5f09dd5d6b624e37005bbaa4def2b280060"; + sha512.doc = "84f71adb1cdf4213f34e30a2737f41c93fd0e8ac4970b2adb832570c98c5f3876502556392fa077a8cb647a552a8e914b2a30e4e38a039c355802e2c85c5f3e1"; + license = [ "lppl13c" ]; + version = "2.0"; +}; +newcomputermodern = { + revision = 69379; + shortdesc = "Computer Modern fonts including matching non-latin alphabets"; + stripPrefix = 0; + sha512.run = "140226a635763be7a407910980664b38323dc3634980452fe9eb4395194e7bdc0144715f13d79b9f108630aebd393073135328c98fa34310e3b8d4150e2a5fea"; + sha512.doc = "dd8cc0f43cd3a1d19a6666ce39d0d4024f8ce1ea8c51c0809878f8b886b286558d78f91cfe962b7cfa0e83c8abdde5912c4913c9c67be5d2b5ae81c274803fde"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "5.1"; +}; +newenviron = { + revision = 29331; + shortdesc = "Processing an environment's body"; + stripPrefix = 0; + sha512.run = "4ddcc24de158fb1a5b585c65adf769c3f92c4598355306e08257f4ef62718c6ca7f2dea80d742759601b37133a951d031445a39ed5d8062496459cc2f98a71b4"; + sha512.doc = "cadfcd8ecc9c0904bc9a45542a24c1b6907dabacc94f45a1ed1b885557304a27e7e836b55cbebcc6130da0bffeff7c56fd89f0b7a16430dacccd670c8c6ddc7b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +newfile = { + revision = 15878; + shortdesc = "User level management of LaTeX input and output"; + stripPrefix = 0; + sha512.run = "b949934073af1aaaada73c93e493fd39ca01ad625d72bcfa5df915b2c2f759a39d77b7c2a0a952711c8c3e0af5e6cca59eb7f333fcd27e7232c3780ad5400ec8"; + sha512.doc = "c2c0e825ae7fee4fa551e831c822190f7682392d47bd8bffa3ee947900d6eaf00a363edd204f7404c834ade0bd5a05e9bb0a8284f8c660eeddf7f75179c0060f"; + sha512.source = "9cc5d4e1ac98c2884af3a2e5d11e9cf573660679658450d0705d6d0c4004a8994c3b471078db8a6a95527f5aa84b3a7ea18a1c00b7cdcd9169fa1cb870a277f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0c"; +}; +newfloat = { + revision = 68434; + shortdesc = "Define new floating environments"; + stripPrefix = 0; + sha512.run = "6b7ec618044ee10c16722460fccf4e3b71092ed5fc902b0aff431c7407d50e97bc27a2e9bf4c561df50da7d605a3a1ea95c20f47727111e7077e338f0c0e483e"; + sha512.doc = "e3faedb4cdb78304c738a4437fa503f7870c81c13eb82652ebf5a5ccb2befa1180683a5704b16891715c60445eac214cf8e6fb01f1d9675954d45e1a7535d659"; + sha512.source = "150ef59ef64c4378dda85cf5472947575bf78ede8c080ebc9f2ad37ef8928c1d59c50c5772cf48683330bce60ce633e2295493c7bd65b658e3538628cbbbfd37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +newlfm = { + revision = 15878; + shortdesc = "Write letters, facsimiles, and memos"; + stripPrefix = 0; + sha512.run = "72f7b087ba1002541e3d26d5b41b58380443e30061b92885bbd3bcc017b17cbad9227c14074a53706b98c785117c7b07c6d49639c84c617782066491dc0cabf5"; + sha512.doc = "8391122e13223055582bfe0f9e6d62315c9a48588848ab02cebd5b2d7045be5f1d476145e8ca29392820d4ee018b9f84380408331b3ea56e7e99071024a8c369"; + sha512.source = "fa807aaba787c52d3e769e240a04f5fa23e469908d2eb5a60967e2b08cfb7a694612e85514a56c3138925ce2f3c480bd5b6d0f701031d8ee8e646c3017cd0022"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "9.4"; +}; +newpax = { + revision = 68762; + shortdesc = "Experimental package to extract and reinsert PDF annotations"; + stripPrefix = 0; + sha512.run = "88888718c7ddd02cd3fa3286ee63d7d527d836f0df15250d9ddde12be475275bd7517f4a0562f30d738d4a007d61c4a417a7f03c8fb628b3fc981e7a6f643ba0"; + sha512.doc = "7edcf5fc73e0b28d92b8f11f42e47bec9a6b2327cc23a146fcc65143a30aba16d839579d94de7001b5937fcb241e977d9933e44fd5947da06907dbe4c327e70c"; + sha512.source = "00ebef49ba9b5bd4ddc4c6889d0d9479fe8d1921f94170c51a2c5583f4d59f2bf533db3348e2b595758f377d4e6c504ec6b9c582c5fcc8c4468d782e68416bc9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.55"; +}; +newpx = { + revision = 69777; + shortdesc = "Alternative uses of the PX fonts, with improved metrics"; + stripPrefix = 0; + fontMaps = [ + "Map newpx.map" + ]; + sha512.run = "979e5e67eaf5891a96c127f9726061bb0a480388b0f67cf27bf753f0171521118f68bb82beb127bb2c18d866643830125089518436d1be56c58acf49ba0ccd75"; + sha512.doc = "fcea214e98b92d697699976c245f841f87bb5a314ec738fb551e6f546e32e79fcfc0b1e78d9cf1ad5299bf691a833b2ba69aa9c917a6cb1abe891c39556123dc"; + sha512.source = "7928e84f2c5523c72a30061e99fac64c37e1c5fecbeaf6ad9aa8ddb1be55c26bb4198adb8c303afed7267d33c12f9f73336453bf32bef98c999547e7f9f4a952"; + hasRunfiles = true; + license = [ "lppl13c" "gfl" ]; + version = "1.536"; +}; +newsletr = { + revision = 15878; + shortdesc = "Macros for making newsletters with Plain TeX"; + stripPrefix = 0; + sha512.run = "e2f1995420ed7b94b980fd794df5dca89e89dd96daefa43559d568881ffd17668717de1baaff18bf27e8519663203e0ea7fef214b8f7541bde81d436a3a5c378"; + sha512.doc = "aff23fd9e3397c52a1566930d6da6184786f07adc64c63e5d9e0062451014d261db8dab06e9d393cb66b3b56a51b57f494f01c9ab27b05bbe2a226cd4623d590"; + hasRunfiles = true; + license = [ "free" ]; +}; +newspaper = { + revision = 15878; + shortdesc = "Typeset newsletters to resemble newspapers"; + stripPrefix = 0; + sha512.run = "227fd249bba9deea4f191c59060c49d2d1cb8e367bb3007d3b123c17dd4328206962946ce3f637c8e6ae079a9c95244ce9027b0c9f83e0901801dde066a0405a"; + sha512.doc = "b08d57346ba93e37e93f3c6e2487d56a0ac67eac0e4d9db564d221319e6403a1055729a2a1e43db4e161877b7300aa90e1853d75843c95295481d7cfaa3f6c1f"; + sha512.source = "172e832bd15e8aecf6f80f8cb768d2d7b3721975638007ce631b78cf5f6dab27ef24ff63f5693f5c46cc430bfecae577beefe4fd2f6fef22d6f5fdf9ff20dfe7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +newtx = { + revision = 70496; + shortdesc = "Alternative uses of the TX fonts, with improved metrics"; + stripPrefix = 0; + deps = [ + "kastrup" + ]; + fontMaps = [ + "Map newtx.map" + ]; + sha512.run = "140e03a3dd5a59ee6b5a81b7cbc5531e92bd2d2296ff74df4f1805d44f6d136dde2aadb0af145f4f7f0a9e223d39122a8320b3858850fb49dd8cb59e80d692f9"; + sha512.doc = "c0344d8e74e412b1ebc8b9db86579672cd878eaa004adc081c73ba48258a57e4093361237410122198f71ed0a6c3f1fd1989e9ca028118d5f93dbf9b21f6e5d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.742"; +}; +newtxsf = { + revision = 69597; + shortdesc = "Sans-math fonts for use with newtx"; + stripPrefix = 0; + fontMaps = [ + "Map newtxsf.map" + ]; + sha512.run = "4d44962a7bc466faa60d39791f18be3b5d3bc5a1eb2b22e233c80a81ad3280b0a89c03717881ee858e327b67040f5859fcde7d465420e43df547ee56f00f5b93"; + sha512.doc = "992123b7b5f30b827b4cb49b933cdaa323a007c1d41632993a2a8d52588b5f5d97612808dcb48423dba309f025d851cf15aeb892c8bfe10d0929cb5744515b7c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.056"; +}; +newtxtt = { + revision = 70403; + shortdesc = "Enhancement of typewriter fonts from newtx"; + stripPrefix = 0; + fontMaps = [ + "Map newtxtt.map" + ]; + sha512.run = "fe95d2c4d2ff7a83f362f55bf2579576b94251fdeb3556c2f417e0118b2dd215a705d06d79e66b9aadeca09cadd5c19f2898cbba8624ea089fef804749d350cc"; + sha512.doc = "02879af2ae05a703502966acc561df08762a9fe01a873180672652a9c931ceadcfb85d411523eb81425e7f1944f514673e8d04a208d54b27d0d26916077a81a3"; + hasRunfiles = true; + license = [ "gpl3Only" "lppl13c" ]; + version = "1.058"; +}; +newunicodechar = { + revision = 47382; + shortdesc = "Definitions of the meaning of Unicode characters"; + stripPrefix = 0; + sha512.run = "8e1748abc585f51033a857db126c4b18f0c42e015d7193f8bc7b69493fb13a218db38da97f3a6733df01dbc247093beb544651a050c5a690f3cd5479c4ad9e6a"; + sha512.doc = "9ec3bdc81587e8b2553dd4ff45ca4ba0bb504ded0726aa44d1e88423cdf425124334d04ebfbdbbe57b576b0fa52cfe1771c97308f146ea19d89d41eb4475eb9e"; + sha512.source = "0464584e516c8f5d9c7ab4db114fbe3ea9e07d33c1544109ebd0d3b25e4e3ddac222dd69b6a8222e290ae2b6a7d7166a76b54ff9fbe7ffd5225368986e2af6d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +newvbtm = { + revision = 23996; + shortdesc = "Define your own verbatim-like environment"; + stripPrefix = 0; + sha512.run = "029829b1da07d7e2fcc5950c32021707058f3d7228f6ff82404aeb962663277ed107934f04a93e7f43bd7b67f7034821437f3a8116f21028b7c9a154449ea53e"; + sha512.doc = "dda7ae47bb076f03cba83438c573405f1c67e5407d83fa0894e9575952c284010b62f62720022ffb7a8e723e829610d1e8ff6a8b5098c92207e8ab8755dcb409"; + sha512.source = "8d58e55977d708c8e3fd9ea6394494f68ccb21712703b2302355234d12355c23de97cb392d7ceda95bc078ddb2cbdd2030461b5b4069805d4ba01b5e3a8b8f59"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +newverbs = { + revision = 64833; + shortdesc = "Define new versions of \verb, including short verb versions"; + stripPrefix = 0; + sha512.run = "f2e2cd3fd2712d3333c7caa9e74a16300d7f08327b9bc7f44362570377feed31a206e6b09df15c524dcbfe39ffc54388de4fca90e180e38d28cf9cfbba79ab2e"; + sha512.doc = "7524a6e767edc5f55d96026f947e17e42f54138157bfd1851832dd139617939661ba5a4e759b4cf313990077dc9ed240c032cfe706b595af4d9a4197e519fd1f"; + sha512.source = "ddb1f40238ca2f622180ea640a86abf993add81c44ea3a459c54b1c114c0b78d4940536b712ab444e93495492b5c0deb02c211b06e00f8fbbdc69ebc4097f786"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6a"; +}; +nextpage = { + revision = 15878; + shortdesc = "Generalisations of the page advance commands"; + stripPrefix = 0; + sha512.run = "fca0aec60c5c7277dcadb0f86d757617484d700575fae13df8b386775e153ea89c52935ffdb2448c52e351593b396fdf3394f5b97e23a0d2d40dac339e584f59"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +nfssext-cfr = { + revision = 43640; + shortdesc = "Extensions to the LaTeX NFSS"; + stripPrefix = 0; + sha512.run = "5083d4ff4168b857a7391855ce02ea354cb17a26242a3e3b2693d6bbb35f722f750299669a37afbb99a52180433d697fbf65a6fb6afd6bd58d4b16c63e5b0d67"; + sha512.doc = "28b2aff47d74de3a42c441dafc156297904b5db20d267f1af07d1e3210e7f9959474b3cec387be7d9b20dc04560b4100a0d9da6979ab8ad2a7cd1e4518cec278"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +nicefilelist = { + revision = 65842; + shortdesc = "Provide \listfiles alignment"; + stripPrefix = 0; + sha512.run = "deaf84bd004172584e0437f3f15dacbed3d49ef6bfdba15e77e0c888bc03e35a634107469ae979b38d1e5519f4c8236cafed71c0ec46b9e7735041f234c03f96"; + sha512.doc = "efbc5965c9658e1f44182bf92f695b2d200cbdb8c5c70e23631b31603682168c0cfa5e114615483f7d897fec175267ef9d7fd0040f653e75defbe88bfb395bc5"; + sha512.source = "f520f4114d7f44b3361fead74f19750a4765f0397b158d2cf8c0076dff4689418bdfa0f731dc9383a74da6ff6e36a84f9658432a271352b904cd816409b026e9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9b"; +}; +niceframe = { + revision = 36086; + shortdesc = "Support for fancy frames"; + stripPrefix = 0; + sha512.run = "539d4a6f3a192188064fafd94366ad2f8a9146175d9e04b08cd83d1386bccc730a0e3be4a9fd45e4f47152f10710191b063138ba504fca95e4226fc179f70a29"; + sha512.doc = "aaf777520d300b5e8c9a17c2dfb5b12406f5e6926b17c4244feaa8d6c5bc28d87277f23fd814304a7efb91dab8a42e1ed88f6568b96f13f30c831e81201ff4f7"; + sha512.source = "fb0106ee32e36d34767c6200be1d2415e11c275e5540dbd54777a6876474424f1c82ba52bcc0fd76da9ecf3b37671d37c762834b3e6ef714028c1917dee45235"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1c"; +}; +niceframe-type1 = { + revision = 68091; + shortdesc = "Type 1 versions of the fonts recommended in niceframe"; + stripPrefix = 0; + fontMaps = [ + "Map niceframe.map" + ]; + sha512.run = "b43c19a164d9d6eeadd11072f07d29d00763863724a5b5168ef8640b2411fa4c02c4955e769b23a39e06db8d02d168ac7b2a987e1ab8a9dbe4c19063b8f4bbac"; + sha512.doc = "9f30b52e177fd2fe5bb3ef1f23a16b29a80f049cf33d8ade3dbfb187663e4a8872a18bef0fec1531cabe610839ba21b118623db244b52ab16418a7ad4dfb3d67"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +nicematrix = { + revision = 69991; + shortdesc = "Improve the typesetting of mathematical matrices with PGF"; + stripPrefix = 0; + sha512.run = "936cbf7f65d1c34986bd6113e07885051e3213dfc98d4102564e0d3749bfe68a0beca8637a34da833e45ad8f5d1eb13ed6f7c75c402158e9638f4f2548ef2b8d"; + sha512.doc = "f9255154b3f69e14c82f9816a9c2b9b2a171311501c0d68904443a4ac8a05518164ff80b9428922e62fa0b62bee61557e12cfb20c9a53625c3a6ac0ed369592d"; + sha512.source = "7ce23449d29a57d58305bd77b00de46677e39143e75580236c846cc6e572c4929374329cd58ef9a4b6747ab66e586a0665b7768232703fc9d792b59907dbe6f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.27a"; +}; +nicetext = { + revision = 38914; + shortdesc = "Minimal markup for simple text (Wikipedia style) and documentation"; + stripPrefix = 0; + sha512.run = "04a555a82287a39249cf6b0e18d890329098a1d0d6957fe9a1c535024b63a5f50b6487dc1fe4fd69d87908abd385b0366474ebe3af0b31f41f6a35c519a6ba9c"; + sha512.doc = "96cd1694ae0cb116bb4620f7cdc1f9e24385886c78cf87466cd329c5ca0d78111005ff89e9be50f07078eaedb69c4f3d495b1fc5063a1a69e483b86a6c8534b1"; + sha512.source = "d7c556fb2fc34e7eca9038667842825053ac03478e32a6a58cdda2209b33ece494071e47d54bb24f7c085f90b45375bb5db7781db642bd9f8cf661853d077f60"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r0.67"; +}; +nidanfloat = { + revision = 48295; + shortdesc = "Bottom placement option for double float in two column mode (nidan-kumi)"; + stripPrefix = 0; + sha512.run = "42ef65277deaf474a619e5ffd570309db8c8349f32e9bcfdf216251e81136a3da87a745b3dcea5212f636396179210c6acaa96a957ffd9588d1f414d6a59bded"; + sha512.doc = "2be76c8e243de71698ae5264a8e3af4da8dcfcd130b0554d1547a0a238e55ee71ec57d8757648b162a6ebd17ce1047206979cf139003a02921a4308a852f0030"; + sha512.source = "8a778b33036445dbe375af746244433470e5d10a963ebbfbc397c0376d5c4f7c23cdbc2ff3ff6455e274e83b465a64d8bac5023e8537d5b949fff038098d862e"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +nih = { + revision = 15878; + shortdesc = "A class for NIH grant applications"; + stripPrefix = 0; + sha512.run = "5f016d57b1b55c698a902c7a85a652fdcd40062b409a14e38c1356b9030129b46631929e49c6fa70db7ed499043a75060c97919f15876ac7a647d31c2f0bf729"; + sha512.doc = "1c209615f0745ed0ae4d2f4c55cf9447ec4711e9345ca3db778fbf45ccca76792039e6a7e51f2e7286034ae229b5c696ba7deee5bb8c224dbf95a4cccca650f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +nihbiosketch = { + revision = 54191; + shortdesc = "A class for NIH biosketches based on the 2015 updated format"; + stripPrefix = 0; + sha512.run = "ce64ef60a007e8a955dd48f9f9f748a738aa57829116f060b3fe353308244db0a2c1d56d139e2b1cc1a6ee4f243eb7ea2339a2c927966d7418e6b553600b9e53"; + sha512.doc = "4315c32e1ba43339b609c272fab7aa0b18c44b2c323f43cc303210f37c44c5a08d0dfcbf62e450bdd9ce899d69afd5eceafad91074fec73ac9bcc1e5c8c8540e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +nimbus15 = { + revision = 58839; + shortdesc = "Support files for Nimbus 2015 Core fonts"; + stripPrefix = 0; + deps = [ + "fontools" + ]; + fontMaps = [ + "Map nimbus15.map" + ]; + sha512.run = "9e39f92dea1fa293d6249d16877dd6b2d990d1d48cfd31f4ac1d66233b97ff178d2b70f428978a084fc9a50b9dd994adb6a8ad29375e54f5d5ccf6ca7ed62f64"; + sha512.doc = "8fb9ece6ca17549572a0d79a541397c6545dc01ac0422a5270314bba1cb83b1451fb0f56e34f449cc3d3de326e063e4ea1f2ea03a0fbda7342e9d0a101fb5ed1"; + hasRunfiles = true; + license = [ "free" "lppl13c" ]; + version = "1.014"; +}; +nimsticks = { + revision = 64118; + shortdesc = "Draws sticks for games of multi-pile Nim"; + stripPrefix = 0; + sha512.run = "0b2485f7833cc8f4912a035284fcc4d0e710d942330a16a36788f7d80ebc5d9eb9ceb98f6a15b11e6391429d4684c985a83753696c1202bff5f0c5f4e528ce59"; + sha512.doc = "6848acf10eb3c4b2e0dbb9e33868ac4a1c639771c1508a19e4d41512750cb0978dbb61a570830f2f555e09ade976d9cd5c91d23da73013a7310b9cae02b6ee1a"; + sha512.source = "76903857b5e115f5c3462e114ef7a142855c7606e78f0ed96de54b4c810cdac596b39f38333db445387264ed6723c6c1788b13c17c6c9702407aec267d4b38c5"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.0.1"; +}; +ninecolors = { + revision = 62006; + shortdesc = "Select colors with proper WCAG color contrast"; + stripPrefix = 0; + sha512.run = "f755768830e02aa434432ab4e879646ad43d092f50b7e38e39009c98327c5ddcd23d0b5a7ee8d8afad30e69b6219bb871a14dc7b274ae11a60aec33df2c94ae6"; + sha512.doc = "0550d7b4a8b7040541edf156c5b82bf61d350a21c732c4ef324c58289eda288b7e30edd1f36d8650d453a590bdeb97b61d0c782f3d945b033b0fb746b6c802f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2022D"; +}; +njurepo = { + revision = 50492; + shortdesc = "Reports for Nanjing University"; + stripPrefix = 0; + sha512.run = "a62efcf4630d7c26bbedb19e0c4405e730733b71361cbec9abed7a06a377c230bee561d8b48427104bef8dbd4e0bd56b0eaf9f0f7bbcdc8b289c726cd7b6cef7"; + sha512.doc = "61f32efbea3b94749fa0cfc3ef2a3b3a34ccfb4ed3b6b09afa74e4f6dbd2540c1a263c81ca6406288f015303250f51acab0b6a4a4d51c95a2f9bbf1f3360f8e9"; + sha512.source = "6a790ae4e533c8e040ede3355967ee030e136d42afbe222a8fc4b7c3810817901aaca1625199d88443c8dd64d3d6b52ef9364d706fd1cfd5a6dd8a7916890df8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +njustthesis = { + revision = 62451; + shortdesc = "Thesis template for the Nanjing University of Science and Technology"; + stripPrefix = 0; + sha512.run = "829c4af6651ce3119dcfb0f6975289bc6cc4a8a7dee4a382ec8f63c1b876cd972452b766ed13e6aec1fb4d4613255a9ef206f1b7d8c03207c00a52876f22533c"; + sha512.doc = "fdf843b266b0d2ac780fe934d4ba55c6a3b470fcf81bcf71f2ffa0a689020ed343768650cce06c5cbed0a35d9178723b0d2caadf5038871c55fbc47f244ce15d"; + sha512.source = "bf0f1bfa5d6a9367bee61c90b35c4f8492ad072ce44b0fefe43c1251fa0e7fcb4c4f92392d5d317d808e6f3ab1fd8f7e274407dcc815e2f7e281297b53e5d7c0"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.0.1"; +}; +njuthesis = { + revision = 69051; + shortdesc = "LaTeX thesis template for Nanjing University"; + stripPrefix = 0; + sha512.run = "da5a4d00161d7904d58d745df89dcb1270eab27c291866300fb5a7293db2a078777c9fd234a3972d75d5d6208acda160921a603b45d72f4c235dfa09f2421038"; + sha512.doc = "12f094efb1a86dc3ced366f3f5a2cc7ef5042ed109e30c3d4130f7de9b514a437029eceae67786e7af1159c0ecee1ea1298efca7a02eb8d9c85253c0acdb43ac"; + sha512.source = "078e7e50803f934601b30042b871cca6a0bee5d66fcc1275c227aca20cbf5e098bee5ef95b728a2d4b6fc0f7e5a27e0042b385c07d8b4e6f8df71ceec0c67f47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.2"; +}; +njuvisual = { + revision = 65261; + shortdesc = "Display logos related to Nanjing University"; + stripPrefix = 0; + sha512.run = "48f446e5aec77be8e9ebeba59779c990ed4ec5fc3f533fd22807e8415d9bf962075e940d4f789e3809c8ab4c75be6fc505d42cf37bd9e1d5b9e1a02d78e7523b"; + sha512.doc = "351f6cccc1a7d91f953c4dcce294a0ca81a0e687ebdf2ee676aab18e299b8095d089d7691b58316c8955e06e341f78674bbd52b6073e010a3facb6184cb0a8d2"; + sha512.source = "0129998a16bc4ee8c9345bf0519ce561360e11860a148252550b3536f2152175dae5af414d586a906adea275d0fb1fee1c4f31a2a18f23571a2a4dd5ef9120e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.0"; +}; +nkarta = { + revision = 16437; + shortdesc = "A \"new\" version of the karta cartographic fonts"; + stripPrefix = 0; + sha512.run = "60537472bed0bd22d64789008ff8bbbab92ffcde68cbd74eb0b6d9910705f9f476e8f2c4dafa0020a24b0ff2e27c42a39de1791f2c91040af07dd429e0fa28ad"; + sha512.doc = "b3cb0205fdc567fbed23f797031e7336fb231c11490f463ee3bb3887e5d8ad1aba90bed1b14178b1d9ba15d76ba02ba93598362b9655eea78bf086c7df6c8b61"; + sha512.source = "f96b85f2a779ae64c9c2a056e16d2d8473844b45c0d906f97a3b62f6f517ea614600312d44151d9b9b676f3ec7360638c72fd43c7a35e183bad0d4602dd84aee"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.2"; +}; +nl-interval = { + revision = 58328; + shortdesc = "Represent intervals on the number line"; + stripPrefix = 0; + sha512.run = "486597624d640ccd13b4cf4e913b5735b0f2a36910f563b87c6ebc6f38e2ad8df99591fe8dfcb503750eb6a98204ded9bc80d3cc0f8e2441257d6f9bd2167cb9"; + sha512.doc = "8c9bb64229464a05f51396d50143688b8f108ba47ad23a01ddc97039133cc3dbfd51a6a58e36e946145ea483d3d06f36926d8e881b2e07c005e637338092f75b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +nlctdoc = { + revision = 68448; + shortdesc = "Package documentation class"; + stripPrefix = 0; + sha512.run = "ef7f443bab4a6608b506ff65bd885965c23607aa5a93a721a021e741eb85a757de021eec7b8b247c9b5a41cad3f3f06a90ce44c143bfbe6ab79ec253eba06264"; + sha512.doc = "e887bbbc705456c084c26b1bd02677a185e7c7ac615b9711821233e6ee3a62de91c4cfdd3bbc353b0775b9fb99dc42e3447d7ef51492f4abf0c519ff1af42af6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +nmbib = { + revision = 37984; + shortdesc = "Multiple versions of a bibliography, with different sort orders"; + stripPrefix = 0; + sha512.run = "c915b266e2a7644a88de6476bd4cf81943f7da31472f1b8eb889e048df8acc4afc36e247b8fc63bfdeb8c0384d87fc59f43d87f3ff09822d076c62a0edd1c110"; + sha512.doc = "0014c7fdade3685ce03bf9fcc2725b430f6272025809e224b88361960cb47e5b533d88d60f0ce55e011dbb943c8fc025340fadc506eedf10189724ae79dd2bda"; + sha512.source = "52297a890da760e2c945522094f128612ceb521500c81ce54da2f481581000bf42302665585fa056b31ff0f096a3a170ce56013e0979ae2043a94b68e7d32a5a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +nndraw = { + revision = 59674; + shortdesc = "Draw neural networks"; + stripPrefix = 0; + sha512.run = "0a3ef1e6654d191c588f8269c674e5d7542785aadd97bf96101be8627f4a4746e443083a0403b8710f2e8036f0d69be1db6d40cfc1865aed89056d84ee4a512f"; + sha512.doc = "0ee7cb24d7cdfc708a3ea7bc4588259ce92723e3c4be295b85d689750ed81ece2a575ceeb9d6959692e36e363bd6ca26615fa598080977cb62de9a641da44322"; + sha512.source = "c97381de546d0e4173c7d34ddc8f9098359a3ec8b84c78d155efc49cba120a3e59f64c3c43eaacc07196df86402a084558ca20a5ddc52733134440e21fc0bc39"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +nnext = { + revision = 56575; + shortdesc = "Extension for the gb4e package"; + stripPrefix = 0; + sha512.run = "406e846ebe7ed721218368cd00a021edc41af41f1ccb5989925abad92d4cbf4d604abac8144945599530c85917d9404141052ba9891b778d1006b7d339499041"; + sha512.doc = "6efbea453691fe2af7f436e79e1a486abf5dda14e2457ca3c1c2bda9c8461016d4436eee82a18b079a2491e1c4eb2f7dcbaeaf8fe8b8c7846e744f02da8e3b6f"; + sha512.source = "a0cc70a3bed51b403ee26c2fc583642ab25565c1ebc69945a831827bfd2c192946142ad92bbfa130f891bf9a36c18bf50e5b424ecc119081d72c7efa1654310b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0"; +}; +noconflict = { + revision = 30140; + shortdesc = "Resolve macro name conflict between packages"; + stripPrefix = 0; + sha512.run = "660ea2bc008866130d0955eabecf0afa1e21ce38fcaa0ff0d4364ebc32ea8af6a2ba57c80b340f824b14f0488d2b40e5c7ddcf663e37d6170a7ac0aa740ca260"; + sha512.doc = "b403c57b0d794bd95416ae09ed3fbc0c4a164689f9885dbb15e8a4c25ff8751376e6e61b622c9a94feacc4dfb905a7926500368bf51e5e568efa31e1dc5c785f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +nodetree = { + revision = 68244; + shortdesc = "Visualize node lists in a tree view"; + stripPrefix = 0; + sha512.run = "8c451fff46fda636b2b1284d8751e070bc47526d7dc94acceddd49e8eea3f951526c1680f330042e51f61752795b4c8ebaa490cd93a736747e1bc554126bf7f0"; + sha512.doc = "3e69dd9f6ef63f3ca1ed8c071510a5b6946037d9ed76449fd14c16ce0892ca50031ec594f6bca7423d3669270b4e2821311a53b852f906ecbd22035dbf9c2858"; + sha512.source = "ded67b13d69785d978a4662fc62cf0c76b63bb931b94ca2407b9b8021857cb1d6609b466ab9f552d11765f7b612386e9fdf0fec02e2a77a5cef459ecc4324b35"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3.0"; +}; +noindentafter = { + revision = 59195; + shortdesc = "Prevent paragraph indentation after environments or macros"; + stripPrefix = 0; + sha512.run = "8445839068a264cc57df9b0e9cce4562b3e70ef208baf32fb2aaabf7ce95804a31f0f8b65c8ce2f2f0fc809a07cb864ff977af31d8162cf10560c39f9d2b78a8"; + sha512.doc = "95f0e11cc91dce0e970caa703149b602150426df174044b0a2fc7d902f040fa4fe6fc3014bcf49d240bc9612c5c61a5a40124d5b49ffab1bdbabab0cfe55889d"; + sha512.source = "e3a12b14ad4571a3fbaf4d4297da28a69cdba7bcf57a365dddb163d88a0b1f7acd20d600ab6353b4ea110d4a0a72c9bef365a3b1fd866448f65318bb5940dd7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +noitcrul = { + revision = 15878; + shortdesc = "Improved underlines in mathematics"; + stripPrefix = 0; + sha512.run = "1629f5c0f832927093283cd5cb534cfb7ee35bd74f306fdf6cc18cfca3c72d5c1501139c180b7cf3fe71ef7131dd6a42465ee666c7bbb5c83a86f2a69a5a3c8a"; + sha512.doc = "c9c3adf9742b329ddbfdcfc41126c22039e89642f0c0d93ad064ff2160f7708b62ab28994a81860aa08d83f11a111bc11a2a54bbab88bf3713f3f6ee4aa2e641"; + sha512.source = "5be6bf65ca4dc0c5819a1bc870f704b595b25e5ed6900beb8a53fa8167680929a7fe038e80fef120e77d5b8731c13f92f7907469ce7aa4825ee4e207c09268a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +nolbreaks = { + revision = 26786; + shortdesc = "No line breaks in text"; + stripPrefix = 0; + sha512.run = "4057a988b0357e2256eea6ae47c560d8535528e63b93d648c45d65ac44c4894104015e3411b7046606b9a68afc44033d037229d684f0c5427d9dd2ff5b272279"; + sha512.doc = "8cd5d7336097abd2d873af36b2ba6ebc8cd1c405c9a715c67e6c04d02dbdea067c0b7a8603418005ce223e0f1bff161a3dcb669da7c07c30b2ccdccc7f953fa0"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +nomencl = { + revision = 61029; + shortdesc = "Produce lists of symbols as in nomenclature"; + stripPrefix = 0; + sha512.run = "ee20b8a21b03cb02ed2ef37d38c219841d4a07e17ff781c067906ecbb8f5383d8558c20164f7db79af0c8cd11c5ad8d76142b15ea74674593bb52a5a5993b6c3"; + sha512.doc = "1caa5bcde6c1a3ac5de024f513793c52011285e70e32664d6c5d1a103027c74d45c716d01aaf849726b5b7ffac511ebe6cd16ba669bfeb5fdf37addc59e24a6e"; + sha512.source = "0fda8a0c5e46933cf991bb4120e4bdf98a8ba05e1ca96600fc9e6abd5d3a5c78ce50ae9e625fdda956c90a8f9f569f18d9ebd96b6de4e0e5bb0fbd2b5b00889b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.6"; +}; +nomentbl = { + revision = 16549; + shortdesc = "Nomenclature typeset in a longtable"; + stripPrefix = 0; + sha512.run = "195cd134db2faf9c7405d040d0d3b4a71ec39ac201fad47c855d34d8f734d069c03424ddec6b1af978e7b244b3907f846fbd80fff6063e7b25df3de508fc51ed"; + sha512.doc = "4ea606a78da4c0c4f5c35b38b9a430de8dcea49c8662081a85f3aa575523c40f5951bd54e2c8acb368b52f75a3214c0a4b0d178dc262a64b8f6485852c4458ba"; + sha512.source = "5cf26c7871ccb841bb8350d594ed9333d7b46c7d2e3db70080ce743fdfd7c7fbfa3c8f7f976bf8f37decc653e54954a5e0a90385fb99ac3428a8dea4a5311719"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +non-decimal-units = { + revision = 69742; + shortdesc = "Display and manipulate historical non-decimal units"; + stripPrefix = 0; + sha512.run = "0aff79bb4d211419da92ec10b0e9139f2fd0e939e57fb8a6ada437ffc71c0d42394c5561894e2f2537a24e466aad7e86aeb40e6ffcacc04963c8c88268bc1cc1"; + sha512.doc = "fe3e393e6f2de3d5678f71fcfc0e98577ae77d063b8d09966cde4d5145a9a4c0696f4c09d24757e18d8adf75a9473eda57fa5bc1218ca96c2b4594bbecfb5d3a"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +nonfloat = { + revision = 17598; + shortdesc = "Non-floating table and figure captions"; + stripPrefix = 0; + sha512.run = "39f8f0a4d9ef1cf8f1dc02c63612980f25cee80cb545bf405d9d2a080256ba6799ff3030c98c26e6f2aaa10ac71015e58e4233bf84703b290220b12db45c70c0"; + sha512.doc = "2d090fa397a385cb32c26957b5c4c05ba8443fb1bb7ce7e3eda777ddc2d3af11ec3ae6297bf014f40e71d4668044ab729a6dedd74e8802ce9089b59d57663374"; + sha512.source = "be5e0b078adb8c530d8255bcc72daf50ad8cbb48343fa76f132e1b75fd64d033c7caf287b6901f1bc49422956f6901dec0f7e7b7639dd71c10c1a76ec958aaf6"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +nonumonpart = { + revision = 22114; + shortdesc = "Prevent page numbers on part pages"; + stripPrefix = 0; + sha512.run = "e97fcc36af3e86c1a432d0e425dd86308429e764c976a2f7f8106c3433ae5a148bf3abc45706bcc3090089911e2dfe175156eccaba7d97f544154ad0b288e58b"; + sha512.doc = "0cd6b115638c3151e5983845dd2964ed90f24bd35a06e904a005755696d6faccd90bbf88c7bbb5a0282ffcd266cb55e9eb1d058fd78432ba062fb4fd723348f3"; + sha512.source = "46130f9c35465685dc690096405791f82d70e73091f6654b5bbdaebc71b5fa3703a013461aedbe2cfe59975dd6233668f0c204e817ed65fc83c30be59be52505"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1"; +}; +nopageno = { + revision = 18128; + shortdesc = "No page numbers in LaTeX documents"; + stripPrefix = 0; + sha512.run = "0e152caa8b8df06444f50e2f9ca93f18088a0c58e2d5936f612a770b90cdb8f4bb0142064f56573d8569eee274adbc2703037ce4d7477c24d23c7c8de8748a62"; + sha512.doc = "5988c42840efc02f816ca0f9ff7ad2d731c66563c0c4de21b857de975bbec08962cef4ed1dad096abc39ecd8489d3a34a66809e98f49b0a280c186d03e6540a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +norasi-c90 = { + revision = 60831; + shortdesc = "TeX support (from CJK) for the norasi font"; + stripPrefix = 0; + deps = [ + "fonts-tlwg" + ]; + fontMaps = [ + "Map norasi-c90.map" + ]; + sha512.run = "5f65927546348815b07c93003a2b0922403d274bfa3d1665d4649c9dbc737df924958c2fd61c1d06cd5e7c1862aff392c8d1e9d827f4ae79e70d9b76467f651d"; + sha512.source = "8fb30cc3a1e762ec15c813fff0191b08b64a0d259dbdd21a9edcf70c6eb1b327cff5ef3f48b9dba0b7d99d1ec31b3accef65deca7285e27790261ca659bd525d"; + hasRunfiles = true; +}; +normalcolor = { + revision = 40125; + shortdesc = "Changing \normalcolor"; + stripPrefix = 0; + sha512.run = "013354a5f7514f6267d57d098ca93eb48970df0ce1cb2db0c60ecf664cbcea177b934ab8f252cfb9dd4c0979417937462ef55e51502bca7f32a7de1a0e820e32"; + sha512.doc = "ca7a9c008f72aa1287092f881f9ffcbe58ed45bfc97ec3231fbeceeb007f6248629d9cf49598afe604ac8cc30a4e8117f54fe517fcbf52548add2f6ac6fdb662"; + sha512.source = "ac6fcbd939d13714f21106c6b0786a9ede4ae6a3023348678ce22bca59343d7379fce9ef12bde91fd05b4912c70c8b4eb64b95f2869f4a30c03c4443640b9d80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r11"; +}; +nostarch = { + revision = 67683; + shortdesc = "LaTeX class for No Starch Press"; + stripPrefix = 0; + sha512.run = "3646dcc196a2b0fc4389d8c7ddbce263126ec88f33749e7b290bdd5ef1800cc8142c35fd87635c7df2b0768c3be03a25bf4e3b84162119c859f278d70bfd4fa4"; + sha512.doc = "279cacf2c378e30468748f3e92ae30d3085fa93bc38b43e7a2b423d06de056fbb2135f9aa5d243fadf504c60628b1048dbfa4f8c9e60fee2f844247f093bd7b4"; + sha512.source = "1fde1f24f5d0f009025f1391b360ebb1e4eeda6fc571c6e41bfbd4620b7dfbe739e60b660fc034f3d2f0e1e5a101b1e8c5c8f187e5a3f38c9734f35dd6742bbc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +notebeamer = { + revision = 68871; + shortdesc = "A template for printing presentations on notepaper"; + stripPrefix = 0; + sha512.run = "87870abd8c42303024df10a6339f6973e83e61fbbffd8851526683ad672810929b1e2f2fb2c9ade58a155b063fa39932122c6e21c652df1a4f7ad60f64c5ab7f"; + sha512.doc = "d9b9bdeff61fac3e6bea8aea4611cd46cc08362cc104bb30e4a67638ddb9d45c91059606d016be559c4926b0450bbef3962eb75d6d6c1fc14f262ef3acac2510"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3a"; +}; +notes = { + revision = 42428; + shortdesc = "Mark sections of a document"; + stripPrefix = 0; + sha512.run = "7b569f27ec34c103c5808036a6ffd7f97f9171287883f38c048b8eabbd979559fbf15b20c7002dc9b8b0577889482c4347e4986e076079809a4a5656aed46101"; + sha512.doc = "4e66790b76290925f49ab7f56175e2d41a20e715c43518edbae39e444d02b945ec05ca918574f52fbb6ca10fbbb060242c688fb9344094df2e025de83272322b"; + sha512.source = "f5405540929d6d99471bac43d89b01ed7ba59bdb8f1e7d978dc9a43a563e6b16c9cc4645d291054308f06b3d4df10547e09a72081c210063d37810da511dcac1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +notes2bib = { + revision = 52231; + shortdesc = "Integrating notes into the bibliography"; + stripPrefix = 0; + sha512.run = "019645974d270df27f5c5bf22570e26b5bfa5c076739824eff60a40d1c246010fe0e599eb2fb282cc08aa2161ec7ee753b734548ca04370d9bf923f357ced1f0"; + sha512.doc = "f4b97327b98e86c64620e975130a7fe790489d16135667c95ec7a368591084c381362e1447dfd1b3afb4f57ed2657a43f8623942f6618d839cb9b1c0995234e3"; + sha512.source = "04cd8f2ac89b8f4fdb20a445cd98ac382a082114eca90306eb0cdb793fe088ef1d1ba9e35dd9c9b2c98238cee6ed9519144c012973d7c2e1928c11f7350091fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0m"; +}; +notespages = { + revision = 41906; + shortdesc = "Filling documents with notes pages and notes areas"; + stripPrefix = 0; + sha512.run = "f5f6960bfade079642a4b4f221a7b762cfb5276a74b20bb3eada51706cd2e3496f91ca23e35cb39f221c57da19012597eabc8d3aa63c58e0749c8a01b6a28ab4"; + sha512.doc = "8af2f746d4484a2e06bd0f7f766c49cc9b0b790da2cf0faf1c83d959f2e2f60fcdcb7cdb6f1ffed89c2b03846215b589de332dc20935d0c0add4e3dc025c42cb"; + sha512.source = "96b547ad56fc2e503c2cf9b6089dd74e2902831d99fc8899b57affdcc1c1d23463dbc7472878cf30ee26078c30cac9bdc20975925de01a86982af19b6a3113fa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.1"; +}; +notestex = { + revision = 45396; + shortdesc = "An all-in-one LaTeX notes package for students"; + stripPrefix = 0; + sha512.run = "64f9704fd3646cdcfdc03f6a3e03f9fb37859b9f11463fa77e1d3d076115297fac9c0b8d6875c8b6b7f3d37127a400e6205239957526018d9ad5cdf36a984269"; + sha512.doc = "c47bd3a4153467a63ac2e2b149f498f9458132e841cd70da9871f10674e77d928f7f88e58855c139dacdc225d286615caf0297077b843750e6940482398f02a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +notex-bst = { + revision = 42361; + shortdesc = "A BibTeX style that outputs HTML"; + stripPrefix = 0; + sha512.run = "68627ca4a07ed0228b9b9ea4b70cdea5196e907f71f343310259d19464d503e76e2ea8fb5f59f01337916ee1f2ef398bdb1d3e4d97f0d49eac660fdce20590ff"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +noto = { + revision = 64351; + shortdesc = "Support for Noto fonts"; + stripPrefix = 0; + fontMaps = [ + "Map noto.map" + ]; + sha512.run = "6b1c2961ca9199ec9f0c9eb6e8c2ce61eda6d4eb0157ef292a176831df2df83bf09c3aea23825818ef5ed03128ba838f4377e42b53409c96d388422ce9dfd467"; + sha512.doc = "20b8371eec90440f2a491e1f34a0fce79b700e7b2f0aea2a808baaaf4e3275dd253b65d32429a78be6ed2b31b576f4291cc1f3cc2f625a675cd7a317bab90759"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; +}; +noto-emoji = { + revision = 62950; + shortdesc = "Noto Emoji fonts"; + stripPrefix = 0; + sha512.run = "68400eedc7540f11c0d3649558ce14ac1bb0bf7f2ed56dfda355fa08c7bf37e947a4c48040075e52b4f4205250df2688a7de22fcbde8285ae4549deb5e02e263"; + sha512.doc = "6c0d286c903b49e6c09c570a8586b0f480497f5b64eaf7e9a99d81a143ff9c383cc281d2d1c06293d82c459b5ac108cd960f1d5e4ddd80a70f6c39b4ae3a7d75"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.034"; +}; +notoccite = { + revision = 18129; + shortdesc = "Prevent trouble from citations in table of contents, etc"; + stripPrefix = 0; + sha512.run = "b63b890933b27717625383488d2cbeb1501ace58b83e5af66a35ba440816527dc879df444af78090294df6d4d412d21fddbab43068a6d677b22d750ddb4105e6"; + sha512.doc = "83b3d2c7b97bb88af13d888d04f08ebb7e79661b4924ed6e328f26b9d19e4c6eea6719b49e6f227dc37c96201a901fe57da3745dfa7151bec27c7e8bfb81b236"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +notomath = { + revision = 68014; + shortdesc = "Math support for Noto fonts"; + stripPrefix = 0; + fontMaps = [ + "Map NotoMath.map" + ]; + sha512.run = "908ef695e1eeeeee1bbff53956b1d890fc9327cf985602877abc26aa787bbb7a09c18d592c2f5b2d1840aa91e0c1c0b071b8af0d576c5110eba5f62cc1f3184e"; + sha512.doc = "708eab7029720af202b7af3d45becbdcd8c8fe6def7327b70f3c67bdbbe6c17c53c1e42912f4dedde1f805f7d7009a75e7d8279f7e3a6faf091ca6990cd4f5ca"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.03"; +}; +novel = { + revision = 69945; + shortdesc = "Class for printing fiction, such as novels"; + stripPrefix = 0; + sha512.run = "35da534328bd371913fb43dfebb29dd1dcd88b92f1c39fad6c6248bb14982538b4babc7fa91a54a0c424cf1c3d6dc7d17dcecf5acfaa3979ca37c7fc8a45c9df"; + sha512.doc = "ecea10182e63c454a78c746946d47017d9c40592a6fcf2053319bf7fb06ccc1c0e655d213b5eed760d44e81195165cf6dea6288c8ff2aa59f5170c337f5ad114"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; + version = "2.1"; +}; +nowidow = { + revision = 24066; + shortdesc = "Avoid widows"; + stripPrefix = 0; + sha512.run = "2dff380964c5c487a015073ade0cef996f5786b204657ec5c8948748f485c03b457f6d8caa5bce8148cdbba2623489a01b5370bcd38eb73469d07da4afb8a216"; + sha512.doc = "b11e2051543215f3f19c4d1e3398564093202be07771b7b3711e9ba5359e750bd8f73118b099f82fc3bb1e9a5f202027b168c371ca6587703d82f853ced4d538"; + sha512.source = "862f3fcfb0a165473657d8e8616fa200a017c410e162bc8ce95376028fa4f2c0959e7d116152e73ba6c6cf4d39ad34d1c57f2320dc20f637e1d3a0e2cb2ec7b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +nox = { + revision = 30991; + shortdesc = "Adaptable tables"; + stripPrefix = 0; + sha512.run = "0061e0bc12a06b79c4339684d0598587f3aaf1c2aeacc7aa32118d7b91d3937ffe0ca50b55f5ba9d1b7a4a1c511811191160c58bc51b68dfdfa2b0cee900b409"; + sha512.doc = "2383ebed9a9c6f65d6271317b46147915afdfd6caf39893e4cfe470e302f9ed6f30ca9f725bc2bec296cc88027462765b4ca5731cd5ccf98fa5c8156b1d88987"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +nrc = { + revision = 29027; + shortdesc = "Class for the NRC technical journals"; + stripPrefix = 0; + sha512.run = "2d93fc25d0305b8bee0e5e9ae61bba492bc265e023980a411ffa521f15746c6d73940e352c886ed5dbe08502f472a63559191aea44c3801518bca8b28d0b753a"; + sha512.doc = "35f86598105db616ea379175f3a098cf7c94f4a0a8836302de664c7bb65bbb5f72f41c5c9dc58bf336781a23553ec49e0a5c4d7d0be12b1cff68108aba77e88d"; + sha512.source = "3404facf13d3ddaaf4a9aa295cd7c0777308502075d1ba70bfd6be6e8158eea6ff4b88db2414f8ea5e758ebdf52dcd5f44b6bb55e903c0e11dc6260b02a1779d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01a"; +}; +ntgclass = { + revision = 65522; + shortdesc = "\"European\" versions of standard classes"; + stripPrefix = 0; + sha512.run = "f0bfad104459f2740712d186f7f9aab20e9860ccf75f8c552a4c80d8b14ece4d503d2aabbd7d3000e1bf05203f41ebd49f2c693b4d36478b631cd27ce71c9c0d"; + sha512.doc = "c6a6d7302edac0aef33d1747900c3781683c2a0deb4d9dc3cafabda375e9cc92d9b57b6638442c164b7435279d43f208d2ebbdacf944e96c71ee368087d70922"; + sha512.source = "60cc5982eeabb092b53f1bda76c12e3c090d9777d6a39ebe7b675dfa5dfab27450edac8da7e44539a67af1cf737060e0e52dd80116b8b7f784f46efc9fe7df82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1f"; +}; +nth = { + revision = 54252; + shortdesc = "Generate English ordinal numbers"; + stripPrefix = 0; + sha512.run = "e94365bee89f78b13ec22d8d34ac78aaf50f060f9282c0529d98518ce1e5b7f7995bd2da1d17654ed795f7555e7dcfd9d51399f4a83affc059eb3a760a76bf97"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +ntheorem = { + revision = 27609; + shortdesc = "Enhanced theorem environment"; + stripPrefix = 0; + sha512.run = "aabab9d6f1a5d9e9bd2ee2ec4b9ca8200098a8f3dc786b9c06d4b0e00431dd66f32a254d452bce7e1bb595454e178dcdd71d724b8d835b6f1c9ad9de41107295"; + sha512.doc = "fdea81cedc9ceca6ee29ee006867a05f018f210db2cb59c763adc4bc15db65a7e96ffc93bcd576a4c1a50e7e55d4b199132371686538216eba6fed65dce77ba1"; + sha512.source = "bb0eb98e3344c4be782d113a0e5f1c91d615a5530e1c0a786938b1cf608fe8828d59d365c0d1011e62517f0f76139ea13bad1857f2e1315a2b919af1de3335d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.33"; +}; +ntheorem-vn = { + revision = 15878; + shortdesc = "Vietnamese translation of documentation of ntheorem"; + stripPrefix = 0; + sha512.run = "90460e92cb52bbf8ac9b56bb950d36551b40ba260a9745e8f4d339bbca855286f8682c1a5bd7dd4ecb53e85448f96d558e6c35ffb42d8b862d4680930f3a64ab"; + sha512.doc = "e097290ec9f9696aaabaef4dce11bec4337050848ee547535c30a9ecdf12a1e0be014f905b235fa1d851ad2c20426cd4a9a442a19475063dd4fa73945c3e1780"; + license = [ "lppl13c" ]; + version = "1.203"; +}; +nuc = { + revision = 22256; + shortdesc = "Notation for nuclear isotopes"; + stripPrefix = 0; + sha512.run = "d540e5dc8a3edb41994ef4ed8af6a51fea544ac929ef059fc50cd561891e02e9ee9b55a62782757101cfc5eface3a170bd585c144e7c8e79e191299527f979c6"; + sha512.doc = "ac118243f5fa4c7a4000344dfd5793dfbacc4d7a16a7031fca6305578e06bdd627473eb065a13c4d9cc5d9ef3c1712202c2d65a913c75043e36221fc7df25ac1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +nucleardata = { + revision = 47307; + shortdesc = "Provides data about atomic nuclides for documents"; + stripPrefix = 0; + sha512.run = "68f9d542701bb9d2db956e70784dfce8a14058b5cab5c8316f9d76d59d20de4bc7fa05f22cfe318312b9ecd823a0d0b5cd084b809bcd615217f14e9e0ba76de8"; + sha512.doc = "3d03a8b301c91fcc3e8221f913574b4542e0aa645d83e443d117ad0d69b7198c4780207f0a5e36f7e24f538a249097e1ac4d828e192f6dd22684e905ce9f1cb6"; + sha512.source = "cf26f591795ce6db64ee7548c0384764c42f2eda260b5e5c1d56f7f08c54e13fef84616ea0a3bf9a9bfbf95ca139adf675eaae3047c80faf49e14d6330cb25c9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +numberedblock = { + revision = 33109; + shortdesc = "Print a block of code, with unique index number"; + stripPrefix = 0; + sha512.run = "d45a69881dee3aa3b6de69587b8c59d889fcae528c3c66f10cc14d653dbf7281e9ef4045dd2595d1a5c7305686bb0d12696bc00b672c5907dc58481a4e00d70e"; + sha512.doc = "99443d809e77b32fafaf59b3faecbd121f038e3ce8e054304e8fdae6b145a0d19a67b5e7d003db72f06528d975c3e543a2fb9bbfbae9f48be460b1a344a0d2c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +numberpt = { + revision = 51640; + shortdesc = "Counters spelled out in Portuguese"; + stripPrefix = 0; + sha512.run = "c23fc54514b98cbc31e095f6b1ff37d37eef75146a3eb14e230ee75b71f6d506f148de643ec5e890a565b544b6d05436d47033f0c00ecdccdab697336b61dbf9"; + sha512.doc = "8b3723dbcbfa0163d7113c96ebcdc5a2262c169a94b733dc4af3bc263b119addf58042817dc8437ea5583ed93be1f3d5485ed76c2d704b20d303b5efa8bf41cf"; + sha512.source = "967569a1ca42c00cac46f77cf2dbe61d1aebbb89d3754d69ff3beb848d174fbf544374723d33a8c4ec8b98b2c4d93f32dfd1570112a149afad934eb07bff4ef1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +numerica = { + revision = 68021; + shortdesc = "Numerically evaluate mathematical expressions in LaTeX form"; + stripPrefix = 0; + sha512.run = "56dea9cc66c348affa62820c78bd92b793f6ca18c4581bdec25e4579ebea16bef934e1243fb18f35bb3ac62e1499dcf441099932c05f016f5edc32fe85a564b7"; + sha512.doc = "321c27897e1d1fd615cd8e1d122cc6c0271e5dbe72c7179ad2dcd0e06c6084bfb1e0a6a244b55cc41bbd8658f5ff9fbcc0962e950564a3fe3fbd7d179f0317f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.0"; +}; +numerica-plus = { + revision = 68019; + shortdesc = "Iteration and recurrence relations: finding fixed points, zeros and extrema of functions"; + stripPrefix = 0; + sha512.run = "803e50eefdeedbfdf610f4084eb8574246a3f0c56e647a1105df410254fe7d965faadb397690aa8df08e488c5462af2404293f7deae6f8ae5810bb34488f29fb"; + sha512.doc = "aa8be0b87a737a956c5f69b84a9760ed76de6d0c4a6c27bbdf0a08e9d3cafef977c4a0c22f7d2ec088c278e8333cf85e7d84a8054ce8a7fcacac6cb8a0e2a5e8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.0"; +}; +numerica-tables = { + revision = 68193; + shortdesc = "Create multi-column tables of mathematical functions"; + stripPrefix = 0; + sha512.run = "1244ae95394a7e28ff9281d1eb4f81de88a7e83e7dc880ad6c185591b2aeb3fb826113f83881811e19385aad5dceecb79d99fcab53f6d313b63b31235228643a"; + sha512.doc = "f926645cf5f512dc655e46f6fdeb54b5c12050d66e9408690e0980843a291d2056a51915a44f2fbef6564f85344eea46ecbbf1859d79443952e989e6b8ad5e07"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1.0"; +}; +numericplots = { + revision = 31729; + shortdesc = "Plot numeric data (including Matlab export) using PSTricks"; + stripPrefix = 0; + sha512.run = "6b51a7c68357dced9627d3c618a167d689b573ea44c2f36de5417735f39f5b3d1034558cf188bad2da5eb25f81a2bdee3df6059b8c14879770c3b300422cf016"; + sha512.doc = "1c9f9856ec2f8cfef61829256f1076099e6bcb79cb45e8155116d6c24feaa52f481c739593c6cc51df803fa76e8ec38b8d276e796660327a2bd1d86957896332"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2.0.2"; +}; +numname = { + revision = 18130; + shortdesc = "Convert a number to its English expression"; + stripPrefix = 0; + sha512.run = "b2859430992fa6ee99f4d96f58cabe26b0f216d5e3b512c69b4db74738d933ea8d54503a61257d304201ac3fbc2ba49e908eeca5953ccc0f0023cbbe8b3df76c"; + sha512.doc = "41aaa9057415ad83177f416e43fde4c8c81e335b2f3c025cbc53ffe1d9d61fc05dfe33221c16f1d652837e4ab5a797f60391fb4c319339517090ad0e2ffe66bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +numnameru = { + revision = 44895; + shortdesc = "Converts a number to the russian spelled out name"; + stripPrefix = 0; + sha512.run = "c6f92a720fc5baf6f55c3bc18e22113de0f7cad8a051c2019360f5f3c64eaa450bb12d6c361c52a5a802f558ff8d2cbfaa35897682d6ad218e9adbbc788f3c57"; + sha512.doc = "5e67f1908356e1f21e672e63a8873e46ebb36af39e55a64c174c3bc5c49057c6d19ac36523c34a7f1c1fc53346f6ddde8fd239ca88b5790ebba1eb8b7dbeb0ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +numprint = { + revision = 27498; + shortdesc = "Print numbers with separators and exponent if necessary"; + stripPrefix = 0; + sha512.run = "cdebfa502a461292b02186b146ad8086f46447b5d8a0292fd7943d93a39796eff1710563866506679e903b7a4d415af9a8d863fa81a62395c7bdeec2cd68e66f"; + sha512.doc = "b821566e6fc532425c8f1b901b5613c763eb392461644850428707105626b6eb1a53784d6a693e7f9fe2aa612b72b4d5a38ddf65f22a0d022981771b2b303d04"; + sha512.source = "d4af01527564c9818840a87d9c876ec8d8cf6e7712913ea3deae4012fd0d4f0dae19e4016fc205814620d1cf97f3c12b98f1003fc6fc81857101d2ecd90fbe83"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.39"; +}; +numspell = { + revision = 61132; + shortdesc = "Spelling cardinal and ordinal numbers"; + stripPrefix = 0; + sha512.run = "4db8e16d137f47681f754cb2bc1b9b6fb404676f57c5696ef044287a3f0052603978997e597a2b8b13393d59e6531298daa127d72a381770cadef1a29944948b"; + sha512.doc = "8bcc1bcca230a7829a106c66904feb70de818dde2d6c4c7be3a5df3078482bba001a35db85b1c548fdb5aada0018cf6f0dee936641ae5959ebb84dfe953b6b9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +nunito = { + revision = 57429; + shortdesc = "The Nunito font face with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Nunito.map" + ]; + sha512.run = "920e074987e7e75fa6db92e3c05d76f7aad3e7d9b4f0166a8a8ca79bc5183549299b56a10f1cb6c7fdaa63f7f55aa6b9c1b2bcb4cbf03567b26e9fcb0240472e"; + sha512.doc = "e0de75f22da96d229a6465a4d47baa8e4c3199567f8d2e3255893e5b2a2d16ab73eabec1a103b355518c4cb98ea3146ff067af54938c21a910aa65aee3f429db"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.0.1"; +}; +nwafuthesis = { + revision = 66895; + shortdesc = "A thesis template package for Northwest A&F University, China"; + stripPrefix = 0; + sha512.run = "f3bbd684f063f59ea0fc53df99ac0e84f3106651d6ce5cd48d58cbcc7cfc205a9330db5d4c7988a213563d6fb215a1c6d90c240396894ded1b7ccef0ea4253c8"; + sha512.doc = "4a5395c215dd135488bec466dd4fb210402bdca2e54deb727264b02bd621bdf16ea60b4c16c86497b016f30f2dc5c291d0d432bbd99beea84d59533d29c2557d"; + sha512.source = "d6188d94c3c35c2fc63efbbc37263a3f0c584974de022978671701e8e0d25d26b11e3dc92edb594ffadab231e754745b35498f09d9f95e00a114f09f790d103f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.25"; +}; +nwejm = { + revision = 70606; + shortdesc = "Support for the journal \"North-Western European Journal of Mathematics\""; + stripPrefix = 0; + sha512.run = "1d54bf4f1ed74ca7ea51761ed8381b170e6d66e35513b272ab22267d799e8ae562c5532bbf3212a9300c0bfb19201cd999eede311387645e66ee6cf03693e98b"; + sha512.doc = "456a5e6f5bcd21557ec0faef50fccc95f2d7f07fe26f705c88bf1ec601e94bf34847c2cc3a8763af5a65f6b2ec3183c97f8f1878bb09ca4b7f2c2997eedfe1b3"; + sha512.source = "00302f0628e72c6329f03d65f57a9bb78e6e46647247801ad15d0f2785a067c0d1b84fa8ea2af02fb4c4d6c02d8d46288f6642cdaf74eb3d6bc88aceae183a6c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.6"; +}; +oberdiek = { + revision = 69038; + shortdesc = "A bundle of packages submitted by Heiko Oberdiek"; + stripPrefix = 0; + deps = [ + "auxhook" + "grfext" + "grffile" + "iftex" + "infwarerr" + "kvoptions" + "pdftexcmds" + ]; + sha512.run = "d8c75685ac77c9b8f3259952cead1d5d46dc7bc556044daeecccbe1229da7566c0a31dda776356a6bddd0b710b8e8e3e84612c3ea9e9691bb486e154d9e121be"; + sha512.doc = "728d95ced0404da11e4dffbde075eb02803a09d5c89fc34b6ffe78e47c78837c105a85827adaf8974d2edc84ddf1e7eb0ff20846a2712d152011b2198bcbf18d"; + sha512.source = "726481c21c3bda68ab4050c8dca78cfef2a9e7fdd6f8ee21540fc1dcd629383e21db06588cfd836915a58e4c8da7fa7762f4e65bb01da8d0ba94e874c1d04742"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +objectz = { + revision = 61719; + shortdesc = "Macros for typesetting Object Z"; + stripPrefix = 0; + sha512.run = "15aab03ef1773a4ec72a3dea3fe036cca671abd3e55721d69201c43902d9655a9b71b6b109c13824015a9db740cd8e463016f59dd84a22a3648c14cf7e95f2cb"; + sha512.doc = "b1918ee04b6b1755b947d12485abd250ec91ce4dfe52403631e00b6c3dac88db2c3c3801912c952d26a00b06d8dbf7a9d88586ab7aa348aa0b2ec7cac1e4fb2d"; + sha512.source = "77332f847ae68cfcbe61b1568e7079a9d2c5a51012c0de3bbad166df71f3cc2af61317d886e4092192e647ad2ac13c7f768b9397770587910ef63a89acff117e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +obnov = { + revision = 33355; + shortdesc = "Obyknovennaya Novaya fonts"; + stripPrefix = 0; + sha512.run = "8adb7a1e6183576b4ed9d709b2f64cc778217602c807fce0daaa62b59786d5629fded5e7ad4824cdee90ad5333b9fff4fd47d462e38005fcd1026af8838f04ed"; + sha512.doc = "6fca30705b614ede4e055a39b92deac91daa6e9ca0922725f29c801e58b4a1ddc7176148b03de147aa906289962a3ff45a743828c0636d7f8fa3279b88e5103a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +ocg-p = { + revision = 28803; + shortdesc = "PDF OCG support in LaTeX"; + stripPrefix = 0; + sha512.run = "23b0b4377ec615d8d334d09018629f524a775311c3d227b350e7dfe95c6154795d1d3e44e7e1e405d45b623ecc614892d0996631615efae2ad6f040c1c4d8dd0"; + sha512.doc = "c51169bf3398b17f3dfd2e0aa0efb574cedf40c4739f1b4693f9282042fe9f024dd48675bdf5ec04895c49e0583ac436bfb36e12ac51ce89bc23ac587b3f92f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +ocgx = { + revision = 54512; + shortdesc = "Use OCGs within a PDF document without JavaScript"; + stripPrefix = 0; + sha512.run = "33b8ab1b03b7a887127dbe589212747c8cfd794c1b1c9525222cdede3f941812007441ff2835386e59a19b253e5cdef27a83dd958506dbf7dce6988007befa3c"; + sha512.doc = "c3c28d54a06a5010d8b1c266b1b9689cbf41050e8427689015ce0016131cebaec87ca0c416b865b5bf9a386a2cc33326da5720d326d797e94c41b8f02e160889"; + sha512.source = "633326b032b98f52375e75cdbc55165e35ee4d531d4436df6575ef54c7897187030d99aeeb0de26622ce4f5e56a10df3c381ab72c0731fd8150d677f1fa3c09c"; + hasRunfiles = true; + license = [ "lppl13c" "lppl13c" ]; + version = "0.5"; +}; +ocgx2 = { + revision = 65292; + shortdesc = "Drop-in replacement for 'ocgx' and 'ocg-p'"; + stripPrefix = 0; + sha512.run = "dfc6fb9f004ce6af6cf0af6f057ef3db0bb8957b52f2e1ecc262da1f2b2fd556626560062a712ba8b45adcda1ef0f1414b54d78f58b68f1b13cba913a9df71a4"; + sha512.doc = "c09b684bd181579f6e773b295344ba78b6058f87d76d0ef3272bf5f80691bb40de49554948be53f9bad7779c0b4b8e3adb9fae1e12e0c4403962bebe4f949350"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.56"; +}; +ocherokee = { + revision = 25689; + shortdesc = "LaTeX Support for the Cherokee language"; + stripPrefix = 0; + fontMaps = [ + "Map cherokee.map" + ]; + sha512.run = "9638c408e96fa861d395881d1bac87b55048a25de61561823242d78f836522205c9621f5a01bbb5ad1c8390230dac727b4fae333c22966a04ff5df1f923b5909"; + sha512.doc = "40bb5e47b2ac627007d349c0b043f299f09321aa0d6fc11ad9f345576fd7a902be4d012d56ceede9e66c8a5972828e7b5a5646c101c08fd28fa3ab1c935f8256"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ocr-b = { + revision = 20852; + shortdesc = "Fonts for OCR-B"; + stripPrefix = 0; + sha512.run = "30b658802a2a30776cef18c2ea0f1a71044b5b7819c75ec58df9acc04134cf1aaf85b97f93231d439d79c47f66d7bc57b43494aca073871ec3479ae70178fc58"; + sha512.doc = "6d162b10b558a9db8269b2535ac9df4f76973c54d7e23dea20efb29974b839278888fceab2da85f945da483415bbbafc614c8ae4c1cea6d262d6a46dea5b69a2"; + hasRunfiles = true; + license = [ "free" ]; +}; +ocr-b-outline = { + revision = 20969; + shortdesc = "OCR-B fonts in Type 1 and OpenType"; + stripPrefix = 0; + fontMaps = [ + "Map ocrb.map" + ]; + sha512.run = "ac15acebab9c9f81f0e7786cb3222b336aae3fa4a379592d5fa231e145cfcab536e28c9078ac617bf9b8b672f6dd24b30caa998242ba1e3f4633873ae8d54609"; + sha512.doc = "7bafe00b9c5d846f21cac682d9577ffe696eb54a55f4bee9314646451fec37d883eca7531f594a7994fa8038f7bb5c78a55dd8a8264255a6e60ff90929596d00"; + sha512.source = "b2fa5f4561a4fe61c216e800fcb47bf99a09a62d41d62e30669753139484b58b137649248ec152f7631461c54ab4e51873f3c7a42d43ccf2db86d3cd21d3493f"; + hasRunfiles = true; + license = [ "free" ]; +}; +ocr-latex = { + revision = 15878; + shortdesc = "LaTeX support for ocr fonts"; + stripPrefix = 0; + sha512.run = "d6a4377f66293f8f7ad8b7f8fe3a3a3dd294a302dabb33e193921882d6681fc1c5537b8de2bb188396139bbdd33f14d4f1c20f6edf44ce680df837b250ee83b4"; + sha512.doc = "d0de99d5cf93517f5be8627d649a1d8018766cbba44c40cfbe0f93a3b69c1a5f10b4057dd79194d148030948509a26ef45ea83208c2922cc64b10473d663d591"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +octave = { + revision = 66115; + shortdesc = "Typeset musical pitches with octave designations"; + stripPrefix = 0; + sha512.run = "03db52eae29898d00b407af64fbc8aca35cd5c6165c3f7c890dce1f8218df65c3df447801d8c68d29af67f62de3057feff203de7486f192d9e7e6a59d4f28e02"; + sha512.doc = "13cf74923401dfd58978c2365e27aa394aecf01849543cb6f65a52b3344902c546599c350927950f63e3faf1b81667e9329b9c18aca6cbb87327046f0d695988"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +octavo = { + revision = 15878; + shortdesc = "Typeset books following classical design and layout"; + stripPrefix = 0; + sha512.run = "06de0f1e69c4bd8bf0a65e08515994a10ae8df83e6e8981daf70b6eeb424fd59b58808249782d76b9373d9982aee50e7c12c17e090e3697533b87d35480f94a2"; + sha512.doc = "daa628a0c047ece5aaf15425c0123128a771a17f08fe9212856e2d63b40340dbd7a50a4ed1e19b04198637e11b530239f4280b810ee3813fc6275b78d37bd8a6"; + sha512.source = "3632856effd0e32e8595bca0f2a1ea569261cd0d273fa200d9cd9c70908a96da613f06eb315389fe9b8e6fcdcd9db233ca8c148120625f6813848a930fdeea67"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +odesandpdes = { + revision = 69485; + shortdesc = "Optimizing workflow involving odes and pdes"; + stripPrefix = 0; + sha512.run = "57a0af92aea846e23c0dd05b896af1eb7538f0bc20e957ad3a528212101adf2a1e03bf661b0af2881320e4363edba32c0653a533c74b536d91e86e27666e14ed"; + sha512.doc = "ea581c7e77c0ac143a10caee59ed2d0cd7de439966974ad80bbe472e3c5cfa746e9cd43da677c42297792ac157e0a3fea25666f55c3e1cc3c38cc22475b1b26b"; + sha512.source = "428bf6bea18ab29fee6b642ea27676de099072791b72716cffb7670eb274658203bdd53529d8be0dc7918f2db9dc0ffe56baae9986e41ea772fcdae548906443"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +odsfile = { + revision = 68204; + shortdesc = "Read OpenDocument Spreadsheet documents as LaTeX tables"; + stripPrefix = 0; + sha512.run = "0c663510fd84f116cb2cf12c41a59faec219b774fddec215ade16b9299db1e445e46deb565c4b0acad18ad2b0ac3c5f54c9b8d7b2ea3fa3bfd43cf86716969dc"; + sha512.doc = "e76be0163772f0bb905cfc4987dd2d1083decc706e521647217b7ecb09214c29bb1118867bbe8d20bd2aabb1648bbfb3ac12ba072c38ab7242d3b1a86df5f6ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +ofs = { + revision = 16991; + shortdesc = "Macros for managing large font collections"; + stripPrefix = 0; + sha512.run = "347dc05e8742fa09679e3f16465077b0bbf5e34a4be5a5c2e1da094ad22c0e69ff9f4abb4aacb9be2c698b27da7e169adb0c1840da3e56b277514a9f9631dd02"; + sha512.doc = "13f7fd3ab4cb31ae521827b703cf4c3a0c796b6a33f46b2a24a2a8c488e92d6039a9b136440b00b6a0aba14a2dbad832b777cd5a3aa120ccfc4888ee147954e7"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +ogham = { + revision = 24876; + shortdesc = "Fonts for typesetting Ogham script"; + stripPrefix = 0; + sha512.run = "fe651bcbdb0e8f9ded07fdc412f1273cc8d473894f06af69ae65ac4c6895daba3f61571eac9a49d16de043ae6ed6e03ea386f11dd6b395347d98784bece4c8b1"; + sha512.doc = "6d406cd0a2ba68946be8d2eb148a6c9286a164ae701f66802ecabe6661807ea54eba175617e00920d37a88dee376c1bfcecef6184320ef1790716d53e5a07871"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +oinuit = { + revision = 28668; + shortdesc = "LaTeX Support for the Inuktitut Language"; + stripPrefix = 0; + fontMaps = [ + "Map oinuit.map" + ]; + sha512.run = "4d6b72ce539766a3453f7edb24c243a2a495f3916ee9fd650917c510a0e8fe36e12399843c1de3dc0b0de704bf5362ea20e9bd0d6c3100e659c5641395d658dc"; + sha512.doc = "dfb7275002731695086aa8733a543ca1eaa207bc57cd0b324666940ab932cd9301cb1c0b0bbfa4df36278ac8e289ac1be78a2e0a58ec656c470ff4b841a70803"; + sha512.source = "0d81c9803b9b45b20c096ab00d0c0e5ca26e71d5af463e511660c5bbd28b5b962afe243f21418883575b5d40f503bada65b5c34ba48486aa74a6f9ddcbd48680"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +old-arrows = { + revision = 42872; + shortdesc = "Computer Modern old-style arrows with smaller arrowheads"; + stripPrefix = 0; + fontMaps = [ + "Map oasy.map" + ]; + sha512.run = "2b67317d41349c6d601d8ddcba6ba58cf503756f5bb2f4343c1447cbe4e24c8949a4de58e7cf3863a730bfa809dd09f5f1ce9944e3dc5d4de104e4817d6add17"; + sha512.doc = "d142a95119386f85d1e6ff0f6a24bcf09b9bf7ec83a581ca43be67376cd4a44453d090e4eedf97bcba1026827eff29f97add3a6ed676833b02b718da4811a3ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +oldlatin = { + revision = 17932; + shortdesc = "Compute Modern-like font with long s"; + stripPrefix = 0; + sha512.run = "02ba84762eccf816178cc652d7f8d8f7d962db7d5386de4a8274dbc9524fd7a212116de0d7a53886bd5b431ddb8a5cd8ffca7defe3174cbb50f417172d2963f2"; + sha512.doc = "1ed3c1640420272b33178c62aaf4c0d538f5f1ffc5350c377788210128c74eef4e6023fa20b3d9f214f518079e8a8c3753c74d30084f5a71a994dd4b5534635e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +oldstandard = { + revision = 70428; + shortdesc = "OldStandard fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map OldStandard.map" + ]; + sha512.run = "838a3c6e29a37b060c2f5e158a7145a6119432006b213e4fb3da956d7df66e76e1fb6d963c67d4833b5d45bbdd203e689c9a54302dc3ee28de5d630b200f3dbb"; + sha512.doc = "7933ef5fcdd97201d269547c981bbdf50ebf11b5a11d417cdd1df9f3e0f35fd5fd618a198050865746f9fcb31cedd61abeea25540d2a70bac45b0ad9065c81d5"; + hasRunfiles = true; + license = [ "ofl" "gfl" "lppl13c" "fdl13Only" ]; + version = "2.7a"; +}; +oldstyle = { + revision = 15878; + shortdesc = "Old style numbers in OT1 encoding"; + stripPrefix = 0; + sha512.run = "968ff7b641f6ae6e8aaf43d1ae9617710b0bfed9894dad135cfd11050eef1c35c48d589d58d3a94e34f93c22d85c58b047ce8d0bbf0ae5c2e645de72e327f9cb"; + sha512.doc = "79e2c2d155bab57456cf7d2ec08930d54e538a830c1e7fb12c0731b246b917840d0ba06d31939ca97e7a20e53a061caa5a5a3beb139fc1a05f32dd9497a37ca7"; + sha512.source = "a9200c32d19045cd56121a64727c1465ef16f48269e4b9bc6957106451694707fc0fc3db253e0db425fa8396b32560b5922f8556fafdeb68ad129d90f027d944"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +olsak-misc = { + revision = 65631; + shortdesc = "Collection of plain TeX macros written by Petr Olsak"; + stripPrefix = 0; + sha512.run = "f2bd1c22a294c89c171d3df5ff9fc77d2c4476c7e44e7f0e26b07780467570ef852384e510a959f75b9226d4962b6163d890dacfc9341a8657d9b9d5d6e76834"; + sha512.doc = "856c8ff6d539198f7057e45d5da22bd4120bbe1915fa11b5cd6dacf6b13354df49370dee55d024ed8ff8be29ab83dcc0a786db5fd1f72857bcef7f47d3167f8a"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "Aug._2022"; +}; +omega = { + revision = 33046; + shortdesc = "A wide-character-set extension of TeX"; + stripPrefix = 0; + fontMaps = [ + "Map omega.map" + ]; + sha512.run = "bd07f654ad56219136e2f9e7612b87892bf8c6d0c8f2e41434a7fabb8b159bc43f79444301383adf560f1985f64e639dd496dad6d3ea97ccbd85fcee4d7a36e0"; + sha512.doc = "31eb2aa643ec37d68d902f4de7be391e7da3af61bde93e78beb1e6df1c6367fcfe00f88e29c8cc878b9cd40f2e3a45f9e46bf24ca3a5608aeae09be491130fef"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +omegaware = { + revision = 66186; + shortdesc = "A wide-character-set extension of TeX"; + sha512.run = "9978e66b66e988d49f3dea44b947585e5ec4fd61f204ee06a56a9d32df721c1bd66ab32a05c3d36ca92e740aaec2b478261f3eaf8c48c0cb30fbf9bbb410d804"; + sha512.doc = "e3312826fc6f2bb7fb8f116f7d73f4f113e2b4fda8acdce29668ffc324bdc90f26dfe21becccea36e53f22707067c19116fa2942fb4165aed3d7c28da88992ce"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +omegaware.binfiles = [ + "odvicopy" + "odvitype" + "ofm2opl" + "omfonts" + "opl2ofm" + "otangle" + "otp2ocp" + "outocp" + "ovf2ovp" + "ovp2ovf" + "wofm2opl" + "wopl2ofm" + "wovf2ovp" +]; +onedown = { + revision = 69067; + shortdesc = "Typeset Bridge Diagrams"; + stripPrefix = 0; + sha512.run = "bc62aac04466286d07ffaf65b31c4d7ecdc6f4194f99192700774a213ca52861b0296c3f9864c187a83926696ad3a3a139ae7c00be2167b970159a7605fb4570"; + sha512.doc = "4fedacde595f96c2bd8babf38d4aae73b3bd9f73572547ed5b93e98c16dec50e89651c42aa4d90046464c765aa2f4d5f32d8aeb6ec5de2bb30f6599e53314e81"; + sha512.source = "aaa8de7cb8444749e1e7671406229d222c36b35f2bb676208c22ce8708a4e1cdc791ae99abad9b55fd877cf97573006c41c5aa2fabc573df589d059924f64626"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +onlyamsmath = { + revision = 42927; + shortdesc = "Inhibit use of non-amsmath mathematics markup when using amsmath"; + stripPrefix = 0; + sha512.run = "5452647ee6eb939c292457ee26cb3639560eb55893e44ebbbeaf27ef1c2ed30346d91d733422e65f6780af7c434cf02ac740d722612f888fca8dc45538d81303"; + sha512.doc = "154273f8589b0d8bfa0ed46cfb297d44000eaa750e8d34b1a7aad9f7b26cb19423d7f7ba362e3739cb7d22b2aa077fa44e59d9c46a52db5a82a57659e86a6dcf"; + sha512.source = "2a3568cde9264ed3f074ad47fb5afa22f4c4835c7e0eb53699f691bf4c52b829c31724e56b9bbc84bffab76d425d9fb72b2bbb49ce14ff7cff0d57f538218783"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.20"; +}; +onrannual = { + revision = 17474; + shortdesc = "Class for Office of Naval Research Ocean Battlespace Sensing annual report"; + stripPrefix = 0; + sha512.run = "0c9f717c54d70ad24a1d3b08a6bd44a4e96e932af4d78ba2895f40e16ae5e5b841cd421b71ff3e90490c13e0843d48b8a28efd49b33ee3f74ef9b6476c88f8ae"; + sha512.doc = "4a4f46965a0de8ca99585d4af31aa2f0f94e51328c8cf1ed29768bb9e2f8cb7e14d63315a008a1d0446d7496ce4f8abb224946277ddf47223808f8f2277cfb64"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +opbible = { + revision = 68465; + shortdesc = "Creating a study Bible with OpTeX"; + stripPrefix = 0; + sha512.run = "8a4fe7d1241a1f1f431a666f0d6fecaf330cccfe19c2047d2e244b06838310dd106d2ff8dcd029301cbdbb0f2627e46a4f4c37b9a81104eb695d62f78d835ccd"; + sha512.doc = "691b79162654071d39ebfa448203bec2c7dfec8091e781f44d7a48d4c16b884459bbdc4230626999349c6822b17ac5f6f4aba1a8dbd6c7e2a1d6127132faa2e9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.31"; +}; +opcit = { + revision = 15878; + shortdesc = "Footnote-style bibliographical references"; + stripPrefix = 0; + sha512.run = "4514d83e3554810da7fec3cc165c89a87a4aef04866755a5b42861b484ffea81bfff694609d18fb5e3bbdacc3723cbed96305ba0c09bc48af92456cef3b7b5a5"; + sha512.doc = "6c4e48aa8ea0dd464d7d2902513b1640437518661e9d7237b958b95ad091053b41c6c5ed4407f9c9d87ff5f0ce0b2bda3a99947d3bb0cf70352d5737419e22aa"; + sha512.source = "031596b3dceeda2782e355e3b19c23a1a31f71295d9ac763055a2ba07eb550a501c9672cbd63929984a3c65108e6084ff6a46fb03e885510e9d696df220b1e70"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +opencolor = { + revision = 66363; + shortdesc = "Definitions from the Open Color library"; + stripPrefix = 0; + sha512.run = "b6b9368a3167db0f71fdd4cf9c369f43be2934060b79bbb2b477d8a247456a7f69932bb92bf8bb8c1e1b5e7721383079947fc40e1a5d7bc6f84a2e3fe9e02646"; + sha512.doc = "ff198447e40d71f447688b5fb28385d9fe34265e520496f7d77acf7947569dbd6cc7a98802bb353648dc50979c4be889cef1417f2d15f98bc3ebf95e4a843963"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.1"; +}; +opensans = { + revision = 54512; + shortdesc = "The Open Sans font family, and LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map opensans.map" + ]; + sha512.run = "d92d10da8d6d8adfa62d440767ed1fa9abf413a575b122dff275eb2e46d501436edd90c215611cd943308f32a197c72b8fcdf56b72268f76237c2227cc9dd5ff"; + sha512.doc = "00e5243e465d948b6bd63bfd161d4e549cc6e5b008a8cf8aff1ea5a31bc7a1406858c045cf6fb52c254d61869f1bcd5ef8c6a43ea66164e842fe3fcff2b26540"; + hasRunfiles = true; + license = [ "asl20" "lppl13c" ]; + version = "2.2"; +}; +oplotsymbl = { + revision = 44951; + shortdesc = "Some symbols which are not easily available"; + stripPrefix = 0; + sha512.run = "bb894b28fd62f95807bf00856aa2250bbe58b0c1def385d6528b50ba925410ff177ebef97279338bff7ab70db012ba916edad067584989f86797b1fbd7e21863"; + sha512.doc = "cd4ceb0b923da7c0f56817602eca672442d03f628440c8beb82c953cf73a9d1bf8e24939a3ba4c813c99b7a2aa98adede0c98b4678b06fffd3f0bdfe8fae52ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +opteng = { + revision = 27331; + shortdesc = "SPIE Optical Engineering and OE Letters manuscript template"; + stripPrefix = 0; + sha512.run = "1af8edfbde5ac2abae770765a437bb42d5852877438d283d8021493c621e94d09bd62d9012556024ddecbeaddd838b37ae9abd0486d73e2698956ef49ab585e9"; + sha512.doc = "b1dc3f9f107e1e8313bfa25b843a4959522eec2e6bc886e8b6271c2175258d7108c824bcbed8d243f0e51b70851e68246fd572bcf6afa6aecdeb86a946bc247e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +optex = { + revision = 69864; + shortdesc = "LuaTeX format based on Plain TeX and OPmac"; + deps = [ + "amsfonts" + "cm" + "ec" + "hyphen-base" + "librarian" + "lm" + "luaotfload" + "luatex" + "rsfs" + "unicode-data" + ]; + formats = [ + { + name = "optex"; + engine = "luatex"; + options = "optex.ini"; + fmttriggers = [ "amsfonts" "cm" "ec" "hyphen-base" "lm" "rsfs" "unicode-data" ]; + } + ]; + sha512.run = "f8c0c0ac739e52ea2e468041b50a690999ed7c7ad4ceddc6a915946c6679e60fe4919b7f1d8b0cba49f2e47e54137e0c7a92ebb92ce7ec0ffbb2e3b7cce5ed9a"; + sha512.doc = "0b807209aa67fd18f6c40baf4ccf4e1faa0e4ef28c25df16569f266cf6d3d05e318a25e2af623db92832ff124cde5c7ec81638ae50bd9211f61acd52347701eb"; + hasManpages = true; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.14"; +}; +optex.binfiles = [ + "optex" +]; +optexcount = { + revision = 59817; + shortdesc = "Python script for counting words in OpTeX documents"; + sha512.run = "88a35391d3deb37dd6466e903f3cdd7d134eb9fb8c0a9ab548ca2eeee86687544e1b499248c2d0a7aa3b801d9604913e763128309f88f768d0dafb8ac1fd6998"; + sha512.doc = "7f0d33068083736fe58c08dc9e37929efcf65de3b62a3afb51077a21d0e27b473a65ee1b333a0dd31b1d39e7f6ce79cae3343e8b7a9742199fb409e90030f7aa"; + sha512.source = "c62820e25f1251b6baba3095afa41a39616e49147fc88c5ddd00fe56e0eb2d20a6b2a0ab633b01f2578819308fa0f05e53fd1daf781e276b08ade1407024c46e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +optexcount.binfiles = [ + "optexcount" +]; +optidef = { + revision = 50941; + shortdesc = "Environments for writing optimization problems"; + stripPrefix = 0; + sha512.run = "dfd704e585df8d01b279e67ea3a2baba6e86ddb9f38bc9747e370580a5f218e7ae4446d2429fc6bffc605ef0ea56c8077a8f41f3ca6a8e857df29d0e3f328143"; + sha512.doc = "3b80346a15a6e1d7209c3584d4fc9de944c55867ee7f21b018300b87615c0ff4fbe290a8683088c0e81f0eb20cf514f13fba0eb141808d8e5f5986c75bc9546d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +optional = { + revision = 18131; + shortdesc = "Facilitate optional printing of parts of a document"; + stripPrefix = 0; + sha512.run = "3f6d031b4bf863a339a80c3a05b101393f88dcefb67c61a67e01d9647e74def1fbf30f3d018158a83c8a171b875959bf57d7a3e90dc724c32868f9aafcd5cabd"; + sha512.doc = "d975e4f1b31e2335e55a41b317096be36161fc36fd589255a461772eb701376ce3fe714d727c4de9663ed8e4300bf0b570855b6b3ccb6b55fccd56206ac69692"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2b"; +}; +options = { + revision = 39030; + shortdesc = "Provides convenient key-value options for LaTeX package writers"; + stripPrefix = 0; + sha512.run = "3cdcd07f3c279a601da49a843169f0cb44aea573ac6c1c67a347712e5a087df4b21c6481168407ac6383e8fd5cdc511ea29fd7ec944edd2d514ac88b560633a3"; + sha512.doc = "f23bc3575d6c93d056c752c63bb39e3ef9c92de1a90177e204e4d6a1fd90ce8c9afb36e727ac8ce827a59dad96a3b236e5c3c09af081160113cee1b529bc1973"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +orcidlink = { + revision = 69253; + shortdesc = "Insert hyperlinked ORCiD logo"; + stripPrefix = 0; + sha512.run = "fc1b4a63ce470c910737593ac877b58dec0e77de2a258fe7943b156a31c5f224389f5be5cecfc9d3098cac690a627cea41993d7c47b4510762b3e5c04f63db2a"; + sha512.doc = "ddbea7f5c36f26e329c8e58c4d8ab3ba6aa2371a564505bf1a1a80a2f89dacfaeba706ac99940da6a742df262a25acce0f7b812817cc4db99793ad11e06cf6cc"; + sha512.source = "93e268f12d314647f19ab92910eddcc68811e4db66a6c57bae504525469e24e3e30752cdfadb44d36ea866719765c76d89ac8011e0e50f4ce6f930c476c2e4c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.5"; +}; +ordinalpt = { + revision = 15878; + shortdesc = "Counters as ordinal numbers in Portuguese"; + stripPrefix = 0; + sha512.run = "c494aee642949d56d8fe4aa28c18e38faf5f66ca8d9f1990419b7197ba6d8547004bb11c3d7b1d63cfcb7414b5c618af81425e4fd61fcf114dc36f9b7fcfb039"; + sha512.doc = "dbcad860dd1fcff2e44f568caac9d3d60f4e9ac2312c672b9e9b46f9b31a2498a7e92bd646df8c622b024aefa8f2ecdc9c24e3f95f72f30f1e9b213d6bc4a53b"; + sha512.source = "c4264de0f61c1d2abb6785f2a19e76578a154bcdb5314a3016c3a8bf700725294847a482f33095bf7173885e765db2afb4a3a34de3fdeb1d0c2a213c1e60b614"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +orientation = { + revision = 57390; + shortdesc = "Set page orientation with dvips/Ghostscript (ps2pdf)"; + stripPrefix = 0; + sha512.run = "729921d3152b76fc4c6c8385ce0b5a8ca2491670a7082133084c2e09774bd5c94b7c6c6b8ace1db787b4626f68a9b184550d43adace8dc6646ad36d2d9703f8d"; + sha512.doc = "75d3d1dd0a71d34429584dc1519b9ba26e329f58f468ae8548e7f9ec9f92e6877917bda790b61af9642e595d6b42370e8fc511b2e1d9b974617a6f5bddf96821"; + hasRunfiles = true; + license = [ "cc0" ]; + version = "1.0"; +}; +orkhun = { + revision = 15878; + shortdesc = "A font for orkhun script"; + stripPrefix = 0; + sha512.run = "c1e52283e54e4de7caccfe605438e2775ebacc9c3fd21c143e29d7966c591ccc3fba77019e4f9ed9850762a0c80475edb6c9142d7ac2e3ba54007f3dac8b056f"; + sha512.doc = "ad0c15ca89057f2ff7d43a1bb8ea4513973978e1316e661a0e32ad8fb8005257a634954e85990958ba22360d29eea2d6ea9d87049435416616349874617d9dd0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +oscola = { + revision = 54328; + shortdesc = "BibLaTeX style for the Oxford Standard for the Citation of Legal Authorities"; + stripPrefix = 0; + sha512.run = "831e450ea6fa77f521eca76aaf281a0f7425e28d889c7bc919cd04c52a78c3a0665abf011ec4ef722f47e737c1dfb48f8aac231aa3f370d594cf5300d84c2456"; + sha512.doc = "6024d48e3b6f68037a68dc04051451be2ea7a952e5d8f55b9bd1160d11900751b5a58cc8662e5c38940bee01a442f3691a8cd8329ee4bd5749cf7698adf72cef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +oststud = { + revision = 67217; + shortdesc = "Templates for the student organization at OST FH, Switzerland"; + stripPrefix = 0; + sha512.run = "9ffd86c1fddc4667f6d02a9ad91ce0a3e562147dbb8453c474ad5595a77df8ae77a4defca5f6fdec2ea837e37ab23128be1b00d4ec15f20cb0bbc2e591fdf0e6"; + sha512.doc = "700021abdba0ba3484a0f11600564ffd372bd998f889da1cfa26ff505395844b958468675eae6465af4010e417a56df45c2226d6543d1bb6f2331099e08d9ac6"; + sha512.source = "5a35d201ffaa677d464e0dd8f2f5a474099505d341ead2e00970be39523199a2e3ddec73da19e7ec329a53cdedad495640dd1385fd6e5d005dca9a5027ee8f90"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.4"; +}; +oswald = { + revision = 60784; + shortdesc = "The Oswald family of fonts with support for LaTeX and pdfLaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Zeroswald.map" + ]; + sha512.run = "92d4d3a7d8bd09031368a89ab7b49483e653750e1c348908aa3fdb62cdb8ce14ecb7d7a29b37e6774c613e658591622891e4bd6b348492c669716f220b46f9ec"; + sha512.doc = "1f6606c8786b0eb54a4c3aad0220347eac3b2bead83ca5540345737cfae509be42b9eb10f27a5ff1ced559aacad7413b69708eacd215afd47636d17194b40082"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +ot-tableau = { + revision = 67813; + shortdesc = "Optimality Theory tableaux in LaTeX"; + stripPrefix = 0; + sha512.run = "57ee595a08f2a30174215056300ed4f8ca496976ef7d0f80627b32d45bff7af85e8a33d8d37decd61883ab3cc61f74ce411687c260d2a427c96014d3defe9758"; + sha512.doc = "45bcff2db460c23e543434ec46b8a168498ccf1fc1ac977f72f3022ac7ec02a874eda98a3bb6814edd22d86915b354fac5105efd1bcdb8eb979837edcada699b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +othello = { + revision = 15878; + shortdesc = "Modification of a Go package to create othello boards"; + stripPrefix = 0; + sha512.run = "cddd446d5b63ed22ebc4e561e43fa8b4b1ab2cdb1ecc45ab98e60d6799646845a9d432aa45248e7cf70bfc4aea10cd42960a8846479df46a7cd701f792b4ca74"; + sha512.doc = "8ba85bf32ff739e4588512c2b33bf242b00e3f38a7ddb1b3f5582cd19b925e1adf52b4243857f1ef4b9d8198e8dc80a9aff8a63a7b3ff926978dc7e5c81262de"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +othelloboard = { + revision = 23714; + shortdesc = "Typeset Othello (Reversi) diagrams of any size, with annotations"; + stripPrefix = 0; + sha512.run = "c975c73b8737f008b7f31af86e6c8a89de3f907c6fe782f075b04819bd936da3853a8ecf15935c04970777a4873b5baa38f9c675cc8943190df84ddc511dedba"; + sha512.doc = "af025805142a845bde22a5fe095fb96cd533d69c50bfcea8716dd7d61fc95c41727c16127c2f2b60c5bf2b55870d698db54d307c2b025aff3e251419ed58a3ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +otibet = { + revision = 45777; + shortdesc = "support for Tibetan using Omega"; + stripPrefix = 0; + sha512.run = "8fdc06f22bc9d25b61cb7b3b151919b7d2d6cf3d78f3cfe5a11284d9246acb858410ccab56996cd521eb98518be9c232a4c8e0f8ebbe52d7e93c510e3a0ac070"; + sha512.doc = "96f9d64c8f668f67afe20dad97d1cd3cfec19df3300204831fbfe0d245c1e15d8d0cea48bb94fb002cfa18db45d3ade730848908b0d77b867fff7557b0fb826f"; + sha512.source = "4b51b49e3d3a802a3a19aea604a63f1e9503f7d9d86c81200dc5e2f2051b06e184add9292321f4895905a07595de6771eeda2463ae0c1b096a98f2d2fd210721"; + hasRunfiles = true; +}; +oubraces = { + revision = 21833; + shortdesc = "Braces over and under a formula"; + stripPrefix = 0; + sha512.run = "8a0a6e0648cc3dd9a342a960dec6512fc9153a083c8fc74eb08c4e0f46d091e5f2c71bdb69bae80fc13a857175ec6bab4b18cc81a0963d794028f4faedd0def3"; + sha512.doc = "c97f91df77f64d824605c56669136585b94d95031ed5a4a67f3404c54b2c96f32bafaecc06d114755d0e65c3fcd0379d63f28f94aa32ccb8d23730f5f3eaf63c"; + hasRunfiles = true; + license = [ "free" ]; +}; +oup-authoring-template = { + revision = 64491; + shortdesc = "A general template for journals published by Oxford University Press (OUP)"; + stripPrefix = 0; + sha512.run = "b4d2d3f66092fd8d65cb8539cb0038e7437d2a7613e36404f0a225462686051833c8335f2aa56f31e8bf3623f799f96f5d63710d638645b390c0f0947cf53213"; + sha512.doc = "00987789fcc1c209d08464b919079b5d17535dee92da189180087f5ec67c78eb384f9622f965ccaedd3434c6f097433fbce75be6c459c08e494343217db2129d"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +outerhbox = { + revision = 54254; + shortdesc = "Collect horizontal material for contributing to a paragraph"; + stripPrefix = 0; + sha512.run = "954af6a75833dc388c430faf538415457d0526b85060602b93584a45e6b0ff9bb83ab1d2117ef58817f08b138146873ff74ab045f174e949a0c9fb9f042b1121"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.2"; +}; +outilsgeomtikz = { + revision = 69124; + shortdesc = "Some geometric tools, with TikZ"; + stripPrefix = 0; + sha512.run = "ff64c7a149bd0d890896936c1f5c818cc6f9c34a50b6f0312134dd47819b45df36a769ddd5b4db903c441217062bbbd44da086fd0bfd863ba8bbbbf6f96a764b"; + sha512.doc = "0cebb1b166aa5b6628eb9aa88788beec5da60d7b25b9d110465ed25b130bbba2636209e151a9633171bc016e0953b5f27780ffa02ca4bb2f0dadc902e998141e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.5"; +}; +outline = { + revision = 18360; + shortdesc = "List environment for making outlines"; + stripPrefix = 0; + sha512.run = "ccfb49c4e035f0d246f00aae56efa9d6570ad3997c44e2bf70588ce67a0bc3fb7bccff19b65629fb27158b0156a9802d97ea1f8edf6f4494f644f40df5d97118"; + sha512.doc = "301ad12a8f964a7dab05b208649c74ad39a64264f113963ebf36dbf83c90ed8ed042d8cc15f626f6081bd41f51d66dec592eaadabec32c65a0d67d15e8ead37a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +outliner = { + revision = 21095; + shortdesc = "Change section levels easily"; + stripPrefix = 0; + sha512.run = "9251cb4154042c7620f545b2fb305cb996af9ff51c44259287a1f5ec490cd83bfb82321c4d8512ca2d22e5d2a7409ac5dad9f7a7d51f38a76bfe77faf2ca4af2"; + sha512.doc = "024095493b4b7301597798285afbdaca9fad291dffec9707b82da9f23b1ee0585345e4f201d6b322a1a65ceb6f703ab5430d14973c3fb25970b04d2785ebb9d2"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.94"; +}; +outlines = { + revision = 25192; + shortdesc = "Produce \"outline\" lists"; + stripPrefix = 0; + sha512.run = "1611e4ba3b8fe21db83a542da9d7e0c3431330bc24e3733d28c8c5b3172ce3e4b46ff5b7dda41f95b4edb6502236f6d558608487ac47f8726420a2afafed75db"; + sha512.doc = "bdc507a3f3cb966d03df37d9385145811c5750bce6341935231ae987b0a30dd65424a1bbb772920586721e25711caa429cd6d8b8149088f753f36b9dd69ddaac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +outlining = { + revision = 45601; + shortdesc = "Create outlines for scientific documents"; + stripPrefix = 0; + sha512.run = "0d2b7dbe710d1ccd54a70cfbf6464a3ee5ad0fab8ccfa61306d5d5d83252c0f3b64f1caba6b5e8e75f7e6237fdfc675981acb67fbb730282978071e76e92ee40"; + sha512.doc = "c083046671d159fc118f25e56ba34d04f8011e0c49169920fe679ffcb78d93e52a6f8bb5bcfb34c47f0b23f73579519c431976229ef143a31ab059cde6dd64ce"; + sha512.source = "8a2f640df3572a5cb8336342b49035ad97513ac97eb87483a73c0d41ef4b98e2ec39b994f9a7005c7c6cdc2564aa55fdd8cc0e34bd79b189882df34ab10e6cb0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +overarrows = { + revision = 65853; + shortdesc = "Custom extensible arrows over math expressions"; + stripPrefix = 0; + sha512.run = "5c2d386bea3d2358e7c6baffcabdbb00411895a45b0500f60f139435b55fc86e6c2c7d7bf96a9bf38300f4d217606ffcc4f212523dc5a7fa1e35b7eb4358fe3d"; + sha512.doc = "1e5c39621f3790fe752c8785f5264b842ad00d7eb3a5fa91c41fb8f3c0a84c85d8be00b553a74f1750bfaebb6f97f7c462d9181c7b6afe9547a38b9d3f431b5e"; + sha512.source = "57b1da2b639cd7b2abcfd8b98c8e73a704b5a247b78ed8373aa3059744eaa127314abe34fbca474106b5a3fda4bdc6dd8f2d399e082eb7a6e6396f77b35309c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +overlays = { + revision = 57866; + shortdesc = "Incremental slides"; + stripPrefix = 0; + sha512.run = "93d1b7bff165da32f509e820cf88c08e8dc17ae688814a6913357ad9884ecf9fe94334be82e54c4e902935fcc38a6dab5687a3f5d4e333268d03df8e977611b6"; + sha512.doc = "d1db70b9ca58bf23946a824c9b9ce173f008b45b608f409c6230403c5f5c1c2e6dbd22f7ec416e9869d3dd98bb0cc2b5a4a0e1d5bfd0a39bac36675d46a5b4d2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.12"; +}; +overlock = { + revision = 64495; + shortdesc = "Overlock sans fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map overlock.map" + ]; + sha512.run = "0c934c6f34922772336f39dae801a83c705197d7a7dbcf95cb890c25b8209697b3cfacc6899c57016ff32066979b665198d30ae45caf60748599e4c6ac052ad2"; + sha512.doc = "44aec04d96e2867a074ca1ac85fb3449cd276d6a14c893c8cd73dfaa91e60ef5f98ec7ed3859cc57efe746ae1454a5fcd01b44ac580369a87f69bf5cff3e3b22"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +overpic = { + revision = 69343; + shortdesc = "Combine LaTeX commands over included graphics"; + stripPrefix = 0; + sha512.run = "6663af049c657a947c3894157eb21c38f8f240250894ee1c8e34e3ae7cfaec294670dcb053d36fbb7749c383b8e9645d25f583670401c7cacc232eb64996dcd1"; + sha512.doc = "005e2aabb66cb7904544463274add08f9680a38cb608c9d8976e4c8cae114658278d2fb3dae55af989c21825dc9d71b4a28202eb68566ab462d1a4bda76ad54c"; + sha512.source = "3d0e1d66a6ae6835eaa1e5342a448895d6cc6ca5b0f9a300113b2c43d276ec9e1785c41700895f4fcfa19d4fd3098e476dbdd320eccab3c2facc855a85f63870"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +pacioli = { + revision = 24947; + shortdesc = "Fonts designed by Fra Luca de Pacioli in 1497"; + stripPrefix = 0; + sha512.run = "a82b391630b5f572d8ded331ae98f480fb0cf7f3eaefdcab3100bc839e2b026f012320e334e82d04e01a27657f36927a4d1570086899ad637f8c47ddd0f22b2f"; + sha512.doc = "fa911ec25c0d6cfa62a2d5396aedf893b9078604611ae5d34b06f24740f65fd62895e4d53a10931071d19ddd24244e3c7ee9893f4eff03efd0920fd1c1626610"; + sha512.source = "d9347b85cd548f5861b83ef2f213760805c3cb76fe0313f02935bf28baae72caf2d548459aed2acb7ad5061e49c6e6694e46e88bccc1164e83f63a6f97045d04"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +padauk = { + revision = 42617; + shortdesc = "A high-quality TrueType font that supports the many diverse languages that use the Myanmar script"; + stripPrefix = 0; + sha512.run = "fec57c3e7bd299671ae8d6489723a4d33c54b11223f5f37f3f3b3cc148fcbb6d9a9aa46587ab83e414221cde3a7d0e4493877d90e9536952d9069a4cec7c758f"; + sha512.doc = "ffa9d45c971b7fe4fbc55644be4093268f842e13a2ffb1713be401cc88934dae86f012741951f30580a94a57f35b85cac9525869e0abca5601278d48a19782c0"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "3.002"; +}; +padcount = { + revision = 47621; + shortdesc = "Pad numbers with arbitrary characters"; + stripPrefix = 0; + sha512.run = "9378dbaa1d3a569a3cb4bd70fa1b5a6dcdb0fe089d3a2c3eecef4cfdb776607f42b7fb018461c00781f8b022dd962e790146297f5df29889db13794e25c1cbb0"; + sha512.doc = "68ffec3a80473b3b2899ae262fcbca47198c61bf1363b9c167986cc95214c778fdd49ed65e8fda8f15d48d3d9941ac54c6660f28729dda176123fa1b3f7e8631"; + sha512.source = "088fd314ec5717f6b40f66762af47a32eb01f40259948945b48bfde12923474cbf0a7aa8389b4ea83127915782bffab4d9cc0be40d2f7d752dca734b0fc0b62e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pagecolor = { + revision = 66885; + shortdesc = "Interrogate page color"; + stripPrefix = 0; + sha512.run = "7cd71dac6790eaf48afb107310961bbe37f04199b70316009f6e62c064c23f0bc7e4601765fdc03c98b1a39c35f9f53a7b83023e5f29ec0a273d7130b13802e2"; + sha512.doc = "ff3cad39418f1a6a1b4e31788d79eb83d33cf7d04fcc8f5ad4703b60db1a581ab2de158f0b4d24d42c13fd2ddd6c85ad4eb3f9f4db09927ee2c97eb7d4e4a063"; + sha512.source = "4fa8f8d617bf8cb1d8a2399ddc88ee37778f1a7de904385351fdad3c4267c1d27e8b6157a206ee0b434991da0a508c42afd71fcc4cea81477e44849c15f81384"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2c"; +}; +pagecont = { + revision = 15878; + shortdesc = "Page numbering that continues between documents"; + stripPrefix = 0; + sha512.run = "53b0f558c6198181349a66b39f0b54108a931279766882bfb713390e79ad0f62218ed841416e143c6909161ffec548592ffccb337505eba61f643a05d49f1fa6"; + sha512.doc = "634110b7cde040e5ae7be237abd6817055f7886d9fed5ce1a00b5ea93e9bc885f0c15398c280abe8472e27ce89aade2a827e66fc041081c8d31cdaf7755119bc"; + sha512.source = "86417ff0f398efbf5b6abf2272df933734724a7d94f93d0a94704c393e195ca0a5828698d4d91527fe1bb0d70a26af49998513f0e9d80e1b8966239555a3dfab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pagegrid = { + revision = 64470; + shortdesc = "Print page grid in background"; + stripPrefix = 0; + sha512.run = "587c09867ebe999b3490d2b6dbd541acf4631a3d40ce1c0dd102b3ca4801ba5774f60ae86f27cd34bf32f324d54bef305f365cc1a8565ab54d84925861082b8e"; + sha512.doc = "3c5d05229ac51f2013017372cbe1df54709b604e170bc4aefdf26a1a017ded6124fba4922ec7609f72c059e45e1ebf1a1eb838c89f4c1564c518469333afb5ba"; + sha512.source = "f9f5f7ef9f3b0509ae0f52fbb9afaafd96396777862c2976550ceefb88d10feb7eeabec2dca561f5a55ce5f4ae6034be4db94da07209652bc6a85f5b4f2b4a56"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +pagelayout = { + revision = 69486; + shortdesc = "Layout graphic rich documents"; + sha512.run = "d68bf1937910d93d028757ee0fe06ceaa222b29239d7decc1479c78dd3bfe7a210349562718c87173f26bb34eea142eac4764e013a33d63d0dbe3b6204e60124"; + sha512.doc = "8b2fc3d9fc36b821dc1082d9fd980fe7280ccdf9d44218a84dfd5ca00aaf79df8b78c674a3460bf2ea8c93d977006bcefb053b8d55d46591bbce2b88822d4891"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +pagelayout.binfiles = [ + "pagelayoutapi" + "textestvis" +]; +pagella-otf = { + revision = 64705; + shortdesc = "Using the OpenType fonts TeX Gyre Pagella"; + stripPrefix = 0; + sha512.run = "feec3cb6db5c10b2ae3d4d4e58cd21b1e425be368e3002914823120b1396622fd2e6de09bf0a892759f3e9629deaa1c419da59bb858dc1263cc271fb33d46564"; + sha512.doc = "6cc07f42d696c04156c0da6610ceb562174dd5e00d1eba96c7b1813e86b53081245e45f835309db257cb1d157d6a77a3d453ea1f689400cab9fc08cbda21b8ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pagenote = { + revision = 63708; + shortdesc = "Notes at end of document"; + stripPrefix = 0; + sha512.run = "085f824f879091e479635e2da9d375f51217f00dca5cc51f6b3dfa43e8a54197e4f2bb0f1748e7fa5dfdb522afcf177c67c9e47f4a9e756ba71ba6394fcd56da"; + sha512.doc = "20ac52f56753f0166829aea56e2b1514a34f67eea08ac8f2fbc505dcb046d2cc4168156b8db8691b426e35bbc83295454eb299a443e44d236fd31b695bb8bb44"; + sha512.source = "1926eca304ce92b3ec5fe2e06fc62a2bd8a7bdb45038050b5cf0871b35265f7149803ab32a28af057b7c3c1ff0deecdf0ae6cd4afb950d45679624a317b68651"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +pagerange = { + revision = 16915; + shortdesc = "Flexible and configurable page range typesetting"; + stripPrefix = 0; + sha512.run = "9216d443f44deba5cfc4ce04174031cae55f2adffa0f3400bf3f315c3b9003d1ee015fb6df69cb2cba23eb117f2ed191b7033ad46a51bc718260a44778783c47"; + sha512.doc = "862ed02746c6d91a2b8d9e19bb2e943e251dd18f0d94562bce9cc9e8ad603f7554e77ccfa2485b9a4eb7a2d6d5185756985f104d870e95823a4b33072f24bc9b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +pagesel = { + revision = 56105; + shortdesc = "Select pages of a document for output"; + stripPrefix = 0; + sha512.run = "c07cd3b48fd5cd59ca685b1ae39da7e7d8774348241c26d29a74b41ee6c29fdae0c01a47a79aa669cf6651b0b83a5b79f8424c139c17db5bca20d30186e5b655"; + sha512.doc = "eeb70877276b393cccb1c0e301c191480e5aa52715738ac6d01b58be864b065b3b72afdbd90d3a398284671682370300537d4953aa2adf4355fc6d2278d2819e"; + sha512.source = "457c52df8dca820c8ee39494630a077d0a14f58f7308805dd0b5f5dc374fdaee83581cab3543d7a9ded91ef94f7555f2d2b2420a6ff2c9ddf7c790b5407f468a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +pageslts = { + revision = 39164; + shortdesc = "Variants of last page labels"; + stripPrefix = 0; + sha512.run = "7db146bce45ee5ceeec5904e8f3ed6efe0010885b657b0f74546644c3ce2a018deafa95a11390da3d8a62eef16508b82c3efa9d02ac1662cbed18e905cf869b5"; + sha512.doc = "58fe6250af4ecdd6d62c231778c89e0b049995feface3af66dc73b920f4dcdca8838d3274a7648caf2b38746fbdaaddd1b4f87577c77dabad2096e9c8b681619"; + sha512.source = "99db221ae4c7795ca4093b7708aac14fededf3c55aaf314433602906d8b0f3d9c074fc0b8cc6807474e81e510f35bca486db3aa525e95a5486c7ff379cdd5e18"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2f"; +}; +palatino = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map upl.map" + ]; + sha512.run = "5db043495b8daf0a5a854367ca1c82007a154d09b2bcae9f399e8f851f30a554fa98970cf45ccd8f0681f70ae7e01f54dfd414bcbd888b802e93993c2ed172df"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +palette = { + revision = 60119; + shortdesc = "Create palettes for colors and symbols that can be swapped in"; + stripPrefix = 0; + sha512.run = "0583223e81139040de67fa9a1fd93479dd2024c19d34e775a71b9fc03d7b01799c2dd58736d431307cb067d2d3130fb495aaa002425a8c0c80ddbc3e33679693"; + sha512.doc = "16934d0cdc60fe7c1d6d2cbd0dfb640a13d8282d98e322c98853b71ab7fe38a33241857ae98fd8ffd9f2e5c009327889f4c42a89af4370fc7d4608b457b1cb4c"; + sha512.source = "ea0e817ec066450c3bceae8ff9859f9b4934dba86f1ef850bfe8d566ac1da8296d780313962ab63babdfb822d1c72e686dca2925f809baa3a62eb2d744e8e6f8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +pangram = { + revision = 66300; + shortdesc = "A LaTeX package for testing fonts"; + stripPrefix = 0; + sha512.run = "1a74fb3bb7d1a4c9dfdb594bcbfef7b716affa55bbc7010fed6937708f9ca0d9f644c2d56a557737b56c1b8386de90a4b4df699aa50631c1e94f1e4e3c9d3465"; + sha512.doc = "eb031dfabc359fecf7316cfac1d799f8377b38d2e86922a52e2409214f9dc251d1ec5c5ea439ce2830ed21ac9a02925f442e0930f845b849b7ef662c30a70955"; + sha512.source = "8d5a945567245da7bdf69db5cdaa72d693054828d948700210e8a71c3f1178e7c690c7fb912275cbb1b3700f812482aaac896875ebbfcc33d3b9531f37b6cf89"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0c"; +}; +panneauxroute = { + revision = 67951; + shortdesc = "Commands to display French road signs (vector graphics)"; + stripPrefix = 0; + sha512.run = "d904edbcc40640e89e3399a5e00310174bc9317a1ac87da86ad15dfb2ec24757b21cc9ec1d9e562547b6637bc63fb1d58bc5373d4b84f4b53c0194c001a2ae59"; + sha512.doc = "b0fc8b96588dbe692eebec332da0cd3fbea74090b566a9afddad30b6028d3592e95f729d7d8f6f198c14e2cbe63e821715ddd2678bd4a58865c5a159d8d8ce4b"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-30" ]; + version = "0.1.0"; +}; +paper = { + revision = 34521; + shortdesc = "Versions of article class, tuned for scholarly publications"; + stripPrefix = 0; + sha512.run = "484964a6da8fffb001e29b471f7c9fa52d2f1aecf66da8f9365376b987c79e8e39cdede0f0d61977381aea78f9e6429216c0cc2eaa67a831e4f1ace29e2c9503"; + sha512.doc = "2fd771d5f1035cb48c0a4de89f1174a988b3b8254caf535ca75633efe2ddc0483d095a720a9dae93aa7e832b0d4e63bc49cbdcd801e4190209f56bb0632c5aa6"; + sha512.source = "74ad404eaa44a523f97d245d6ccada1546d9c991bfc64186ab1ee7f6efdecddf87897d7e64136c0285e4d6541f1bf164173efb020adc113893d8e9309a687967"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0l"; +}; +papercdcase = { + revision = 15878; + shortdesc = "Origami-style folding paper CD case"; + stripPrefix = 0; + sha512.run = "8f2c923e72c7f16b394222ad86bc3f07304e6c39965473482c708b15574b0475af6eb6aaa085b94be6b0ddcce3324cd5639a8317caad55844998868ff18f0e73"; + sha512.doc = "01d43ccf0be5caa114f1b406e5cd4c1f8f44f06ea92e6d3fc999a5bc71e911d6c99dbcb8a1b9c49105b978d0d36e6ad2642f73446e3ba6a55edb11f82f40638a"; + sha512.source = "7bce5742cc7504e789011ec877fc2a934300b0edfa2e6b8f89d625184e5dd0c8cc6116aae7701c313e133d8669522c1414a2a16d11e7e6eec0d1c7112fc44d56"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +papermas = { + revision = 66835; + shortdesc = "Compute the mass of a printed version of a document"; + stripPrefix = 0; + sha512.run = "a9c2fed35bcabf0e3feb98fede1f66f0c60dbe6a40b50c3818cf88821712ae4ef789fb5a080113f31cca4851767e4b607c623454f06a8dfbe1542bc3897dd7ea"; + sha512.doc = "2837d42a830f3a4517b7a0bddd9271264643198be3b1d805e471a62c9c87df81944a088b448829c26e05868cbb5f6a12480a6faa9a8c5d3f56e0c52c38c8cb75"; + sha512.source = "b64f9a1940169e858a51f94eb03ab1843398deeee001fd63bc97ca0a24d385d8f8d6b65a4195fcfe52fe76493c78506a7e68c1e32be1d669b16087a741122ee4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +papertex = { + revision = 19230; + shortdesc = "Class for newspapers, etc"; + stripPrefix = 0; + sha512.run = "489718b18bff9055917d9aa1329c34218282c2dec743c4a136625b6c39dc5102bc85d7da6dfb5e2b6a0f4bfe5a8fe27341ba9c7cd205cb8435ed3bc81a7a5c1c"; + sha512.doc = "aa36046e89f7e4486020a62dc8cb10f0a680247a3148149831153400a4ee935d3120525de3fbf29eac5c6cd58b655c1a2dcc2c4a8baf7d849a40f842d3b895fa"; + sha512.source = "9afa6d8e8d23108266bae48e78caedc5bb20c06eb15e3de8969a2e8bfaea880901a184fa8f2409e6d7ec0a4341105151049e1763fa4f4cdce8150e6bb3a52174"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2b"; +}; +papiergurvan = { + revision = 68239; + shortdesc = "Commands to work with Gurvan Paper"; + stripPrefix = 0; + sha512.run = "0f79f739273caf08126817ac44fa0c02bef9fc2e2bdad32eee12d1e377bca14618b426bc71f4f9cf734a5e63c319ac019de2c7959d25a0e31f594aedf1ec6d98"; + sha512.doc = "c9b4f46772ca50c8ca89d7d3d35719d8b2a7dd7ffc9d09a39569500047640404d1d3937ebbd4b3380a4e13cf56fc2f722d444f71afe464df332a69dfcc6049e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +paracol = { + revision = 49560; + shortdesc = "Multiple columns with texts \"in parallel\""; + stripPrefix = 0; + sha512.run = "ff7f60734dcf6d1db89a0b80747b31eb95bb28ac90ea5d83546feb08389fe890c6e3b4c44995b115d3e9d446823e81e27bf08337ae2d236a5a89c2c79258f741"; + sha512.doc = "a5711614d817193cf34cce405fc57f00dc17f3757b8c945dd174ba03453943c22e9c66b19a0f83444abd61f486e5df10246556e59d281f10f95452ad1931fb49"; + sha512.source = "cfa0bb83368dc27a7d71fb5e8772aa1c0ab69f597b2b00630fa1a95cf448684e6b59d46bd6dbe011953c51c0195b5cd0981a2df8d7d5fb951aecdee0a9ed0576"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.35"; +}; +parades = { + revision = 40042; + shortdesc = "Tabulators and space between paragraphs in galley approach"; + stripPrefix = 0; + sha512.run = "6eda005756083b1ca0c1ee09efe44830874d8090c25aaddb8d6631284a057130d2f03ca7f88b460fbeb7bea90ad31da8242028a70b07f6a66bfb978cd7390e26"; + sha512.doc = "eca6b66f0bb424730177498fd6310718a78ffdd031961f8de877bd6f9d027430143c19310b158abf26f92b4280016cdac696f423b493aa49d60b06cefc546688"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +paralist = { + revision = 43021; + shortdesc = "Enumerate and itemize within paragraphs"; + stripPrefix = 0; + sha512.run = "e05bbd65ae7146515dd5dcc6ad7e40fc8437fae29ee26861aa9c2b4b6da0015fc00974f0a2328a72e6487660794a822bb64b35ea3282eac980c3e7fd23f4b899"; + sha512.doc = "5f103c629d1c0bb94aaf6c86f7baefe3e99a854e764306cd21e256011ae5ed95601416e33677f73f6471bf4ce2a375b6dc98b8aaf35b8dab1c41ca91b7ec3ec5"; + sha512.source = "1cb11b8e7792df9be259e1a5ef3b2efdc85b5454265deb66e2a527c4696d7e9297e2022d5191b1d666996f1be1f638517ce4441d0bb696f6b33ae490f4138e78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +parallel = { + revision = 15878; + shortdesc = "Typeset parallel texts"; + stripPrefix = 0; + sha512.run = "975bb869ea0df9236f0e86cbfe880e9bd59ab2d6aeb98f0a399f5bfc7e4367b3f14eb64e707e4e7ba8bd3e0ee641765b9ddfd79ee1abac61f96414f215fa5cbf"; + sha512.doc = "ab4c283176cf1fd3d524151cc647c1da360a1772e57b282a91007edb1269d6bade379775d0efe6731fee18b3f3bc02292057d67795475a291a4dadc748d5b185"; + sha512.source = "6dde2ae1a2ee65decf5c1ba547d2683948d58a7955b75e5a3bd74d0b6705e7c6a75f2fe4dbed01562211b670d455a0360d0fff3ac0f24e3e77b4bb01a65577b5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +paratype = { + revision = 68624; + shortdesc = "LaTeX support for free fonts by ParaType"; + stripPrefix = 0; + fontMaps = [ + "Map paratype-type1.map" + ]; + sha512.run = "b6f50e5c3063357e04e94a9454cc34b17e522c54effe14696d3d81e6de1f4732953b608c0c0d13965dde5c9c95e125d967afc888ecc9396001c1deb89e9b70ef"; + sha512.doc = "ba91b90030c703dc35a77b9a51a23d90e5cd6f0a6490f74e151023248b05a6a0ea5bcf188e3c8e69611b9b7d5f72b4569538a9da02193ca737e94e744c83c107"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +paresse = { + revision = 59228; + shortdesc = "Define simple macros for greek letters"; + stripPrefix = 0; + sha512.run = "1604c9320918893633af8318d049194158daaf458bbafb5ce34b2ecf39896eae4591989117bd1ecdc3a86d4728a4c477f32b82b38315aa0693fb5978a81d2b21"; + sha512.doc = "f25aae5058f765f5f141c1d2ba537db5395384f64b1e0aa803e486eccc1a9c958dcbf6b1dfb0aca331a5d20a798c2107092f79b9e8ec44e342ba52964ed43b06"; + sha512.source = "5acbb82be5b06506d603eb19b01770806e515b1d496a2b51ecbab0a6c5fb4b6a0842764fb76446c09eb9a49a9a9cefb571e5133a0f72917de989814cfb3bd00a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.0.2"; +}; +parnotes = { + revision = 51720; + shortdesc = "Notes after every paragraph (or elsewhere)"; + stripPrefix = 0; + sha512.run = "798ac362fa4b67dacfe9b744163555d3c25c9e4487c5d2e2fa47be12d8d4b41bf89cb24a04f6434c804e9ca1f45e6d1f22ec234ac04596d5e1905589cf1eb558"; + sha512.doc = "e9728eb1025e80f41ca07632cc2625ee670a61ebe06d003585645e6aed183087df460a1dea4f3a8b17013af6fb3e974a95b33d848d2502435a37b1aa881ce833"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3b"; +}; +parrun = { + revision = 15878; + shortdesc = "Typesets (two) streams of text running parallel"; + stripPrefix = 0; + sha512.run = "1a09e6dbde9c24d88e21fffe24ead7ee7567a2c7bccd2ef33e49eb1bc8eff2befb3828a87616872f63d1d8eeba21814cefc8bbe756b17f887558449aaccb1668"; + sha512.doc = "cf284387780c9b2f4a79ebdd781388525aeb2a03ad9d85048061a6c43728bb6f2f4fc840ebb499a44a3fdf612ff4a20f36c17a377f959be813b4ee4d12288fb7"; + sha512.source = "9a4fb32c53f5bd2f6f79992b4ce076ab211c24e2c0f4ca2665c903b2e3d5268b5615bb5e9c8107d1d44df6a9e50a9f942f61cbb1fd05a388738449e4b312f306"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +parsa = { + revision = 54840; + shortdesc = "A XeLaTeX package for theses and dissertations at Iranian Universities"; + stripPrefix = 0; + sha512.run = "76edfb996d6354536b009066d4916b5864b0be1a55954a627380d4927eb05bb888d80c0259d52d367a8be58f5b20309cf65cbec0e8d4ebc6bef2b3840bf4d207"; + sha512.doc = "9cf2df697f90c46bc119f4df1816a734344066fefc54acb37a6fd2c127401a4f8ba12dafe0350d7bde90212924e40f08a500fddceaed44d735bcaf0ae9e48cb7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +parselines = { + revision = 21475; + shortdesc = "Apply a macro to each line of an environment"; + stripPrefix = 0; + sha512.run = "81d18bfa1f70157ca04383a2f6e4cf228f23d878a9e157e79ea0bbbb743090046f5058ff0731ac42f881f5cef13063fa0ff2fa9b80992b334e02dd7f2a1a33d2"; + sha512.doc = "b6dfad3ceac162f9c122c2b18fa168469cb6c4befce1c4b2c8f003507ff4b2aed30e6728bf29f04545a080efada1fd98a9c8c064f4ac1eea521fb486624e60b2"; + sha512.source = "454fd4c9032ff1075237294f346d55fdd0926c316813c3eaa487e1649db569455f89a364b9688d024567a15edfd16c397bb1ab76652b46112791874bae5db36f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +parsimatn = { + revision = 69090; + shortdesc = "Contemporary Persian font for scientific and formal writings"; + stripPrefix = 0; + sha512.run = "73bb90c41be56b880b11114110a69cc206640ad97a2193a9557447ca8c901bba3485a971e31b6888b671b938a24d8bc880b532b5638a4a726fbe7978b1417bc7"; + sha512.doc = "c2e6b53ae9e2c8c949ea843654eb9d1545907a539af43f0b6f1728d78f7b0fed3ed1f92b8650aef85c0cb34e9cc91ab9ab8e1e7e4c406f9a9bf0f02ade10c243"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.1a"; +}; +parsinevis = { + revision = 68395; + shortdesc = "\"Scheherazade New\" adapted for Persian typesetting and scientific writings"; + stripPrefix = 0; + sha512.run = "bb783a5c4d45e32cf5298d5407b3fcc98d64cb0f5c66a5f45a564acd3fc90faa6006d5d649597fb293aff746cef1be3d1304a7ec223e1fa604f7eed4fd705746"; + sha512.doc = "4509dd23bf7baeee99ced80e0b1d225dc2d616c992f44e5ed5fca7a75bd71dbb97081ca04b96477d26897f6481c929f469bc2483fb0483485406a90962ffd6a4"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.1"; +}; +parskip = { + revision = 58358; + shortdesc = "Layout with zero \parindent, non-zero \parskip"; + stripPrefix = 0; + sha512.run = "2d64232f41b2607712bc67ce77ebc987502924ebaad4f799b6ae2163862a8b833a9c1a7c8871a33b4ed9fdeb74c8368897e1b831c485ab82e084fe3ff0552af3"; + sha512.doc = "759e9e8d698f8ad77ce388ec127f158a7280586338c6e56e1f9188a9a2e8106cb482f8ebc4e252749331e65ac2a771884124b16e3ea5e9ac76005439ca85876b"; + sha512.source = "4783fdc97f269963e4d5998b2d8066a676f371f5034bf5204bc9e5935928f153dc0a4aaaeb11a403baa0631d545a18a1cc19dec4ee42314e1f33b239a9cbeeaf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0h"; +}; +pas-cours = { + revision = 55859; + shortdesc = "Macros useful in preparing teaching material"; + stripPrefix = 0; + sha512.run = "a2a96c526de2581461941553b0c47bb4b08b3a9df03ffd121d14f3ea6e8bd62227f12acb4853f04240608a805189f4d90459324801ee25def1b44c48ebc83bb1"; + sha512.doc = "7bbfff0a879ba2287e528a63815b005a2159800656078db2ea2c0460887dd15772e04b1eb8953446c86281037180d82d84172370e015d2c66dcbf23651c6a182"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +pas-crosswords = { + revision = 32313; + shortdesc = "Creating crossword grids, using TikZ"; + stripPrefix = 0; + sha512.run = "cc93ed7340380b2072ac7df4c0d343e43e1a3ae4252c42d9914edcb33232597a5c86d22cce3dc02218e6e725191f056ef9fb342e88d1a60dcadd8d011723b649"; + sha512.doc = "65baac7fa63a01c70293baa26d99d21dc999f959074a3d2668cf6661d3db059b47d2f577f8c9f5d7ac6014e601f50e547283c55541c492b3c2df4e5f01b65be5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +pas-cv = { + revision = 32263; + shortdesc = "Flexible typesetting of Curricula Vitae"; + stripPrefix = 0; + sha512.run = "4dc3203c5888aeb3c613ddc16446d7ced1dbb8ee1c0f0d983fa010eaf81d5a0a7a9364381be04e10bb15a9f258d4ae086fdbc650ab8ca627b07cc286be1ce1ec"; + sha512.doc = "93460e4435546cdb2df20e4e1fd555a726e909e411d42068b6f16f8bce2fa90144e1db95cad4cb94430f65b9614d766be00fa8c3e781a1de733b189a0b4585e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01"; +}; +pas-tableur = { + revision = 66860; + shortdesc = "Create a spreadsheet layout"; + stripPrefix = 0; + sha512.run = "3457ffc6633ecd2eddccd0070a1ea5458d5126c1a42684991229c7eb8ec7e64db31fd809623b930cf4bb39c928cea2bd6ee2eb5ade840ba9ad36cc28b8d307b7"; + sha512.doc = "495b121c5860a96603a060e925173a7d197d0d22e13ab26857de5f7453f061847620b44b95c6494dc8e1f8108e58d987cec5728507cda2b61e40173c1b6d6a95"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.05"; +}; +pascaltriangle = { + revision = 61774; + shortdesc = "Draw beautiful Pascal (Yanghui) triangles"; + stripPrefix = 0; + sha512.run = "0736284ad69dc62a9f97887f09aaf4e527438d068147319be8710c53708bf88c156964c9737548df4b2210b1e6bf5219d157e5d5baff53a510fa373684a8eda5"; + sha512.doc = "137c13f7878fcb5f3f2e7d4d47d05e8a25f7fd19f58672d7b521ba944a5eea22e90dd12418d4b056dbb1a94faaae750a9f2e06e4dfc8fcd206609f5f95e97a5f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +passivetex = { + revision = 69742; + shortdesc = "Support package for XML/SGML typesetting"; + stripPrefix = 0; + sha512.run = "2253d07d753a5c20c29c2ebb97446453d2c0912c9f26b2e3bd78676e7c3c2ee82953e188e62253c80da538546481da58602b5478b2b8ccb3a6f7554ee41d228b"; + hasRunfiles = true; + license = [ "free" ]; +}; +patch = { + revision = 42428; + shortdesc = "Patch loaded packages, etc."; + stripPrefix = 0; + sha512.run = "0ddcaa07696216f9fdea55471e1265fcaa71dd8ba2b8a50690dd519ad8b9442015502ec59b8f9f05c79f5031be3de2956cd71af58153dea8e1917f33c246fa63"; + sha512.source = "ada97aba615160b3c30c9cdccf3360f3692612bc702247ae3fa44f7821aefa2ee60c89ab79417b0ff658335768512a0d8d9b5b17df619c57d169f6487d39e5bf"; + license = [ "lppl13c" ]; +}; +patchcmd = { + revision = 41379; + shortdesc = "Change the definition of an existing command"; + stripPrefix = 0; + sha512.run = "a98085cb274c189644fa1307cf4ab5949a9eda76936fd6b74a7ba366b04d58b2a213c1a5ede53f644bdb76d44eeccd919176fb1934b8eda55489fee16f0c349b"; + sha512.doc = "3c65e6b1fe2b25efb45853deb5b3111dbfa03de7c0b154fcd86719a81bbf725e1872a6e6b5a9955e63f410ff3c05bce5de336f4ab1e612ea0d82b8d44d5fe960"; + sha512.source = "d3effea39c2dd33c9b40dd12304973d2d96457bea7b7f233f196c2ad0ca9819e57b38ab7b44e9532350b6c1cb519b184882ea924dc198dbaadf185ac177bea63"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.05"; +}; +patgen = { + revision = 66186; + shortdesc = "Generate hyphenation patterns"; + deps = [ + "kpathsea" + ]; + sha512.run = "f37ecebfd74a30b2f4fcba5db893b31e7672f2d91d2be7f003bf625512dd54be056a23165ba8b1f5ed2165595405220df20dbd711e63a3be9901424aaf1fb0de"; + sha512.doc = "c7bf5af0965cb675a82ee13c6ec467f88395438d07d59379f4850a36c783cfd6661d6fa6493e67bf39e78be615e3148cda9452003b5e9f5d5ceb1fbd305d4ee6"; + hasManpages = true; + license = [ "publicDomain" ]; + version = "2.4"; +}; +patgen.binfiles = [ + "patgen" +]; +patgen2-tutorial = { + revision = 58841; + shortdesc = "A tutorial on the use of Patgen 2"; + stripPrefix = 0; + sha512.run = "0db7759a327066df9aa738a977d664b8e150405fd2e57e5532a7f9e2cc6a9cb0c6541cb37b916f8506589ea02e36eb4ca404ec1b8ace3726ae431a6c78f86db2"; + sha512.doc = "5abe4de29113af4db20d85ed0089190f5ae82ef1573d8ffffcb9f5f03a4417dacbea5aebd0b274ea27dc54255f8ac6792c841a9bf77ee39628c8bb1dca49b084"; + license = [ "lppl13c" ]; + version = "1.1"; +}; +path = { + revision = 22045; + shortdesc = "Typeset paths, making them breakable"; + stripPrefix = 0; + sha512.run = "6a1fad600e4683476206385504ab5fb916caecc1101ac903d23042c25e055c6d4a73b85a57a3293929b1effd7d4af6db26c36ff994d76efd1c4f81073cee785a"; + sha512.doc = "e52367b81b9042af70e940aab99fa13140c31d58768ce94fb86df74ec9b52fb365168e7e325d8b2e304094e5a35fbd9fd687305062b5b606bb9e5748f143ac2f"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.05"; +}; +pauldoc = { + revision = 16005; + shortdesc = "German LaTeX package documentation"; + stripPrefix = 0; + sha512.run = "36e67d812dd0218d013808879eec1150d6029e13519b0796f061a850d2dca99b8c07a2ec2fe9c49004b0f9947db10ac8d02d47a858b8b27852744cea58779d13"; + sha512.doc = "178950b84cc4d5e1d78001aa75fd8cd5f0b3ca8e800b15fa1b65e19968a4642fc8ab2a3c2a95ab661155437790f100d48730d40a701dfba3a21981e93e35ba6d"; + sha512.source = "7b35faaaa89048952de36bb0b340dcc367610d87ab104cca82ea8e38493babab9fea26d30cf4eabe7d6bf64552cedaddc57f49c129076a1311c2e50f9a991add"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +pawpict = { + revision = 21629; + shortdesc = "Using graphics from PAW"; + stripPrefix = 0; + sha512.run = "426fe59ed20c41d3b11c87814b5f3737271d20bfb2cbc45142a36a42cb5aecc1555ea69a8ba1a1cac7bab323d8c9f23720601934f183d197b25e84d2037f057b"; + sha512.doc = "5f8fb39ccf22aea8c40e3fb5d2babd757447e089da79a9df35336c56049872f45bb04fb76ad08d8d8a8404523666841fc757e7ebbb5201a156274ec2c29958b5"; + sha512.source = "29f272c3d643ce366b3f82b3a5a913534e9b1833677540834bc48cecd946be0b5cf9d4de9e22012452a33c448589506d865db4ad589425634d80fef1562ecba4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +pax = { + revision = 63509; + shortdesc = "Extract and reinsert PDF annotations with pdfTeX"; + sha512.run = "71a2c105a7d593ca432a50a68fbcd16d876c8a28ce25be99326f323bcdba997b000158514328542378384f55a0ceadd9d34b71840980346b0b5c1c63843f7c1b"; + sha512.doc = "a2e0e7129e98efc8a44184d445118220e16f8149166c2093b7c44a936885845c0d49d37a7588f32e2c06fc834f808b0e4a1b15808a32183bf9e457a9a1c19ba7"; + sha512.source = "3920502e3ef59332129792eb87b771bac81ec3061d6cf35d77fcf785fdc88434824592b6f0d5b74041d372977e17b85d9253e7280a5ce9bc361ce56857397dd1"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "lppl13c" "gpl1Only" ]; +}; +pax.binfiles = [ + "pdfannotextractor" +]; +pb-diagram = { + revision = 15878; + shortdesc = "A commutative diagram package using LAMSTeX or Xy-pic fonts"; + stripPrefix = 0; + sha512.run = "6e2e18f93d5575e3f9db1147a9e255d2ab8a3918e25f53315f91ec395962a3c65d7321c1d162ab7510f16b25e4bdc5c8e4688e56820759baef06dcb08833a0d4"; + sha512.doc = "4b12c7f67411ed86eff674665f61b6b2e34694c937222c7adceaab453d78a6a1f23c58d3abd7ed2320ccf05c40e6b38ff2280bd498e7b71e857bd6fc86de3067"; + hasRunfiles = true; + license = [ "free" ]; + version = "5.0"; +}; +pbalance = { + revision = 67201; + shortdesc = "Balance last page in two-column mode"; + stripPrefix = 0; + sha512.run = "3b9579669a9bf79892e433eb5ad7203254fa99615398e9ec58d1438d4b57fb94a5fc0dd14867b6ac18a874af3c4faa1d072a9009086b125a18ed21de144fd40c"; + sha512.doc = "d02220c268923d141faa2a4249d50c8fc9f119e1703475f1ba979903a79df79b6ce48b70e113c0193a9b953f935446486e7d926ff52ac1eaf5f2c193638f9a87"; + sha512.source = "141d99a8fcb9ba830c6df2b74fdb00dc8aa22781c6da19785c9b6b04ad7717b8f8e04315d5f9ec7ba2939f469d6728fa845c1ba9e6da1bf3cc0a8aeac0291fa8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.0"; +}; +pbibtex-base = { + revision = 66085; + shortdesc = "Bibliography styles and miscellaneous files for pBibTeX"; + stripPrefix = 0; + sha512.run = "6be03a9f18741e16104d620effc7c0669e12ccde1aaa7d4332ada2fee95ceb1a6b30db4df41386995367b565b437174c0d4cae6e330c8181ee47095fb9bd5a5d"; + sha512.doc = "69a7e564464d8b1c31474ca37b5e9fadeb4c2d4f4d25dad5f884317b226c6b7f8f467cd1809e1330cb64fe2006f1ab397cf4f163e469a14fb8de5b778dc70c08"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +pbibtex-manual = { + revision = 66181; + shortdesc = "Documentation files for (u)pBibTeX"; + stripPrefix = 0; + sha512.run = "ca4690e0ce37561dcb877d17310f498b5b528cf6892beb075b4ed87f1a4432957c2ac56ad29f66da1452794c587f2d9343fdf7715c670ac7c3f7880f620f698e"; + sha512.doc = "152ac93c6e1bf07d90434581a8891f293527d4ff93f7d439e7e15c99d53b0cf43872c9f8a6935fe314614b9c3fe3cbe7bb3dfdbba486dc7248fffc60742f37a0"; + license = [ "bsd3" ]; +}; +pbox = { + revision = 24807; + shortdesc = "A variable-width \parbox command"; + stripPrefix = 0; + sha512.run = "cf2ea3781aac3d0b8619c46513bf9894c4b4efd8ba89eefe2e5fbe4e8f82fedd3b17f64467598080a577c65cc21713671c68763ff2600ce24fb6f6ddfae83a3e"; + sha512.doc = "1955a1cd5336a7d71483f49bbc8c65426485fd38447282262b58b4633398cda0753c5574455421b19d92d5c88c599f9c227b54a7c340a35daf233a4f48a1c276"; + sha512.source = "67cf5bae9494a81b97738ca8ed5877c009d631cb8ac681915559bc4919f536c657fe4e3ade36b8e4a0ee3b614ca4a23bde8a9cae19f3a9aca12cb2e3926160b1"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.2"; +}; +pbsheet = { + revision = 24830; + shortdesc = "Problem sheet class"; + stripPrefix = 0; + sha512.run = "4fee9d64b1988f9981a056adc10de3be6940cb2cc7e23d9bc4effa8647e27601e5b74d2c15289ed5cc96c3f42d4f2569d897be111e2dff064a4c5d40445c760c"; + sha512.doc = "d929cb815e8204268f17d9e71f53550b7647d39fd50782c1e6bb848a6a8840ef8389d2f3359bef554450179bd9a638ea80a1c7ec018c7275165622f1ba645a95"; + sha512.source = "7790c2a14e44ff68071c4b3f0017c5b83a2fcd50a110d05b55297f07b4b313ebe8d5ab3b4d071bab5b575ded1323bb26b828aabc7cd20522a4298827d1686c12"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +pdf-trans = { + revision = 32809; + shortdesc = "A set of macros for various transformations of TeX boxes"; + stripPrefix = 0; + sha512.run = "8e3d1526b0373113064e4812003b84fd78dec65ce4946ef991f09efcb6ffab8e89a9a655c8a0582e1f4452feb526c077ec9cff30b1ad7f3c59f07bc715e643e6"; + sha512.doc = "a275e35947c38b93f5ade7a812d7938d342b25460e2a29e16a1431c7fff5939826ffe0bab30aeaf504a57ded91925e85853f93611702ee6dfec713031edf9306"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.4"; +}; +pdf14 = { + revision = 17583; + shortdesc = "Restore PDF 1.4 to a TeX live 2010 format"; + stripPrefix = 0; + sha512.run = "6291a2cbe2fea33d2a948a8ce58415de875cb09df1eaeb674f2a8fd3e3eb9fd5897d73e2ff613cb71562299ac22b07566b3c8730c807928e5a12f3e572f99622"; + sha512.doc = "1b848dc73554175d33b7501fe83f1689e5181bddc6f59db00829ea39ac6aa7f91ca4f936f93a66411ebb257fd77132c6a4fd3371c8c28f0258cdcca31b8f0b38"; + sha512.source = "81e13e0e9d0b6c4c0d6a764c94c6958a437a2e2fa186532607058c09f1c3ca2a6187a778ced20e67b7d70079395be11de7e2237548b12843f4f5ff80cb82c732"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +pdfannotations = { + revision = 68958; + shortdesc = "Annotate PDF slides"; + stripPrefix = 0; + sha512.run = "22bf69647c957f3235fe1be6d90cb75e66188722e3308f80724dcccd9766a470fad09d0b6510fdf7d7e012d595726b5053ca727ca813a2771cd601f8761c97e6"; + sha512.doc = "900b6383a998afb3593c6e588220341f73d3a03ea81e3bd4f71369b889ebf722dc921da4607342f7e35fa22e62b6f11a22af1c3e8d64acfad9ebc13ff1c5e66d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +pdfarticle = { + revision = 51127; + shortdesc = "Class for pdf publications"; + stripPrefix = 0; + sha512.run = "50cabf25f9da7b9adee489fd0a01fd9e5da2115d1dd09111507143a99a605cbc7e2de5a40a0e963b68942a601b7f0b753fdaf9cc1eadcdfb1261730fff5b4875"; + sha512.doc = "d77754cf21565337f6db1b984dd3812798833f61fa263e39f9a929b25391a3b31a55df97a7f0db4fd379e4bf3855c51b61a719c30187865f67d7d37444e17de3"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +pdfbook2 = { + revision = 53521; + shortdesc = "Create booklets from PDF files"; + sha512.run = "dd87268e3856eb26b37f025ac62f24cd5e680e92e727588d36878de9df799f49254ef2259c29de15db11d5888ada83110a39aaa3116aa6f6aa290d3e64f1231f"; + sha512.doc = "3048de4be891e270e8efe9f9d85524aff948c9483da25f491669a7181967dc281f42b984c9ee46464bc563c42a4f171589066f67818a291a136e1f49d40912ef"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.4"; +}; +pdfbook2.binfiles = [ + "pdfbook2" +]; +pdfcol = { + revision = 64469; + shortdesc = "Macros for maintaining colour stacks under pdfTeX"; + stripPrefix = 0; + sha512.run = "c9d9350a68513b9c7fd1d99138cf93aad74b76ebac4e5a55de483501bc5a6ac42a366e60e15a6d7e81149355dd6ea87b968bb070e05f04848e4a167422f645c1"; + sha512.doc = "d2b5b5e1681092d024e0e0d47d3252e915cd3456b9bd27e1d2b871688ff2d805b385d864088e8a9ec665d7a0b495811b3ba6e8237363448d378072ac0c12072d"; + sha512.source = "fed939659d5d9223e184f3a47a681b298bd6d076ab807eb164082d273da35a16126bd4b0b3c647c0a40d23abfa2974bd566aaaaa4f5d7864022e2c769870be3d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +pdfcolfoot = { + revision = 65512; + shortdesc = "Separate color stack for footnotes with pdfTeX"; + stripPrefix = 0; + sha512.run = "40db84311e460e79e6627bb3692afa56abe6c0f335f054955fa4f75c11b4c2a4f65c9c77ca225e1ceb37b3dae6727f27ee4b6e27a155eb1fdf9b053693490537"; + sha512.doc = "afd7cfdef3e0290360251ff1de1fee17053229d89dc88e2275a3b94df8a9b5235ba462cb66eb741e541e8d59a9d0eece345c521c87f33fa5fa99e5d69d139ac5"; + sha512.source = "e857b9d671a5be1737ea4d3a002aa89d6155aa6e89fbd336ee77189fc61a85b8a3713a631efa8078894261748d39ad029e2ac40a91ac1b97ba4b82f6fc054b3a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +pdfcolmk = { + revision = 52912; + shortdesc = "Improved colour support under pdfTeX (legacy stub)"; + stripPrefix = 0; + sha512.run = "ddcc125c608eea472c06981c9f5a901a431da978fecaa2a5ecdd08e2f6499ad25632e4de86f7e92445a8e276403ee92bca636b80e5216e78b21ce355910ead67"; + sha512.doc = "e2bb876ad74381fb441d870422186f4cee76bb4cb5f721334b7119fe83b2ab0565ffd5300575ab52e8d25a263d87739a1e114cffed44ab3e25d8d5cff2006456"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +pdfcomment = { + revision = 49047; + shortdesc = "A user-friendly interface to pdf annotations"; + stripPrefix = 0; + sha512.run = "82e1f9e9dc35f652d1ad348c6f2e03c1472c36c113cb17080061f66777d129f55f56a29c2a94292974ed759d12727d93e1724a8b529ed0b4c8c3e53511ab1934"; + sha512.doc = "a7b6f568daa2d2c01574f56641326c1cf46c692d247fb8a8fd7485d6e804241a43691ac42923df35dac4453a23a5433fe1d7a063a88f4675a00780e89675a169"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4a"; +}; +pdfcprot = { + revision = 18735; + shortdesc = "Activating and setting of character protruding using pdfLaTeX"; + stripPrefix = 0; + sha512.run = "d046543b42966f8a566be0c89d78ca26b26d4095d99d5b16045283f0eb52a90a92122c1e87a2842d12d7ef2f865fbeaa69315a51bb922f713d33b9ef2e270fac"; + sha512.doc = "ef19fdf93050dfe35df88163453067e589307b2173481d4f3b6943411bbaabda94b472622b93485637de5c2f885f9153d5078f5d3bccafb52bb28d3e25f39ca6"; + sha512.source = "fbbfba0b35c70cc847a6ccbef17a1f506d26070d616254cd415eb6cdcf1b74c5a09baee420012fd88c11e4b4f8f45c5b7d4e2f5767e9621974a8d941a460360b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7a"; +}; +pdfcrop = { + revision = 66862; + shortdesc = "Crop PDF graphics"; + sha512.run = "d2f33ad228c2cadc78cc8f16bae747ff1aaf98094a5dbf16462bdac0957f14aa32636b3ee0e16603e7e3caacfbd0d76526502911cacab29dc0a3d85c46a36e44"; + sha512.doc = "0e3eb0d735d146c98bd9a34170afdfe73fc987b4d4a7102fa220e4d6e7bbdc185cd0d3bc219ffb7fa14c6fc1a971225ed24335e4ec9fd2ab9d3923dfb2f15137"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.42"; +}; +pdfcrop.binfiles = [ + "pdfcrop" + "rpdfcrop" +]; +pdfescape = { + revision = 53082; + shortdesc = "Implements pdfTeX's escape features using TeX or e-TeX"; + stripPrefix = 0; + sha512.run = "ca908d58a9a0c0094fcd9bad550bf493a0dbea9e90702534a7418f9a5f506f5cedd42663f154bd227349e4e57e223b6360871bdc995eaea221c07cccaa780327"; + sha512.doc = "d95aa97463b20c178a04f9f2cb71011985eb5242ec620adb9911bb5f1103f71e9fb0feca5704a9339b9490a71ed67c8c038efcf6cf43e16fcd20ba2eaeff8161"; + sha512.source = "b6edb668b4803c91288b0f149e2700213ecab7725310d7d4bf499cf557590cd4356d9c79a6bfaf17a50ce85f4951a1e996ccf6725ea6da000f0c316f5a0466d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.15"; +}; +pdfextra = { + revision = 65184; + shortdesc = "Extra PDF features for (Op)TeX"; + stripPrefix = 0; + sha512.run = "84a84fe75512fce734c9c6ad3eb2b44091ed07ab69e202b64d0d86f143166a4ab511350120b75a8f71f5c88b8d9b175fde9b5621bea23aa5017e28f0c5c2e2f5"; + sha512.doc = "644bc2b11ae5a538172eccd92e64bfa60b6fb3d5463e3fd897f46086dd84c9bf098d91565b2d88b24d5c481bfc7595f999a7b4a78c8bf74b130fe243abc9f2c4"; + hasRunfiles = true; + license = [ "free" ]; + version = "0.3"; +}; +pdfjam = { + revision = 68597; + shortdesc = "Shell scripts interfacing to pdfpages"; + sha512.run = "ce5f86bc1091795bd749d79b348d5f2e5e9e012925222552c9b9431100d1608a20356fb6379c15cfcbc76096e65b2fac6725ecaa485952a28408191db2c46652"; + sha512.doc = "c72b039c93eb3ae542351117de5d52eaec2bb7a191092ff8547947b11e9d1a6a921010d211a1366f71846121576cd6ac105d3002f95ebd3fd4aaa8106855ba5e"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Plus" ]; + version = "3.10"; +}; +pdfjam.binfiles = [ + "pdfjam" +]; +pdflatexpicscale = { + revision = 46617; + shortdesc = "Support software for downscaling graphics to be included by pdfLaTeX"; + sha512.run = "d36dcc4d70156d52bcaf668d620c8eee5db8914473f943412ea5ad5c8bde673a6715fd5a69d13e502a5d4fe0b1e0e55099432c4e0e5e02bd5f6155ca5804c3f3"; + sha512.doc = "64440f794e88c08bfeeac75d6d4174eccb800125c8d57e3b0be3ac6883c04790d422cb05cbed6be7335ab2e4d2e6bb2c8c0137c04160db126674960ddb7603e1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.32"; +}; +pdflatexpicscale.binfiles = [ + "pdflatexpicscale" +]; +pdflscape = { + revision = 64851; + shortdesc = "Make landscape pages display as landscape"; + stripPrefix = 0; + sha512.run = "13c581f774e61de70e97b40c54a59054b9ab0a9fd6e1b71d94fc5d0e072aa96661d8b72bc99c083b322df974f75b2f415a6fcd8bc23f95d2d999a03ffc0a3188"; + sha512.doc = "c59c598fa494e5a57d2ba058dd6d096edc96aa958bec7ea1240195022b670f0cfc45d15eea0d0b68b499975811505a6fe9a209c7630c74c861fc42ce3904284d"; + sha512.source = "f844e74588ae5982f1122d9826caa8a93c229d2169813a074537053e0a8387c3917b110ec1653fdddb31513124b4f6974a2e3ba4e96f714a57a03155646bf115"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13"; +}; +pdfmanagement-testphase = { + revision = 70328; + shortdesc = "LaTeX PDF management testphase bundle"; + stripPrefix = 0; + sha512.run = "3dde6bdb63f0758ccdaf62f6ad928e241afb7e7033e05c7d40ff36a2eb526ab1fdde01fddfb96a11856aa59a29272dce2740456c72fd23ce0e450f4f48195448"; + sha512.doc = "337bea25f8e865fbb70b86318bb806210e8f9e284fb0cd03d11e8998601f9e4d627d616e74f5d9bd23a171700b17e7eb4b3c8ebfb07da8e8e66c0bc72dee0d97"; + sha512.source = "4c23bb2485c3fbf18beaabe0cc219faa28400a9178703f983e81d8ec412e597b0ac48c98b1ab6e6c188cfae23ea675d2fa077740684181d812e082228cff14dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.96f"; +}; +pdfmarginpar = { + revision = 23492; + shortdesc = "Generate marginpar-equivalent PDF annotations"; + stripPrefix = 0; + sha512.run = "1cfb39ec9982fce753e3c0040123fc0faf39d94a41cac95dd0d189f2f5dd21f0a03c2f7e26de999097905b2bb32ec8d73e6dfa808c8ed2a49610da436639767c"; + sha512.doc = "24f2fe0616b0e6872da321bc7878f423df54057c9ed7b62eac4e3de36df4ba9a5f0c4481392902130038c8f2da098d2fc48be34056a03d6e764a01b66c2649db"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.92"; +}; +pdfmsym = { + revision = 66618; + shortdesc = "PDF Math Symbols -- various drawn mathematical symbols"; + stripPrefix = 0; + sha512.run = "f424a0fcaaf484f919b1e6646c63eff6550711e23cf938886b9cdbcef8719defd1d23efe949916cdf27dda54a87a8eb5448d4c9e8234ffc043dd295937ea5365"; + sha512.doc = "a40e39c7ce6e5d93339aeb6a1ffbb23dbecd11656b6c698362157c0fb46477dc4506d6b40269b3e9f10cf8fc0b2c982049d4e732b92c0a3401a0a40614b631e7"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.1"; +}; +pdfoverlay = { + revision = 64210; + shortdesc = "A LaTeX style for overlaying text on a PDF"; + stripPrefix = 0; + sha512.run = "e167d180f13a5d15684072f2b9df8521e5c2dd89ee1eb6d515d6a73452508c083ab3b188fa856b571a0d41c0d490b65705631c236e677b4c58bcb0505c310cc2"; + sha512.doc = "c77f221b34d01653995bb15ea7c05c13089d99a5d213b4f991fd09ef96dd8ac9a12e9b58f39b8216b1421d84204ffff8413694f4cbfe571a7225930a7c3b244e"; + sha512.source = "4b4b18a150e6de4d4e40daacb06faffe0b838dafe619ccc065f88777cda32b765939bc38d9e72fcd7ab9be49063e26c42b6590a9a5905d541e3fb3c1e1bea8b8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +pdfpagediff = { + revision = 37946; + shortdesc = "Find difference between two PDF's"; + stripPrefix = 0; + sha512.run = "ce28e8160b14d0833b57445392237dceab536108a9d96942dcc0adf5305c149ba08269d697ab8508d8ba05dbc59dd972dd242cf7c4cd12e3d3e857eb885e5277"; + sha512.doc = "dbdfc61b7f7bcafa597e439085f9624a48b734b2adbf53dd58ba6186b3597180b7ad3fc757acbd07c6466276a9e865bc154245e84d28b1e291004cdde64f55ea"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.4"; +}; +pdfpages = { + revision = 69524; + shortdesc = "Include PDF documents in LaTeX"; + stripPrefix = 0; + deps = [ + "eso-pic" + "graphics" + "oberdiek" + "tools" + ]; + sha512.run = "09586903b55b92d16ee3e3cd205ff8e9a3b7ec07f4261019a340a1c128a9370ece443de314c8922ea5ff8822c9297132e399be2f7ef95949bc7f218535980a7e"; + sha512.doc = "c1620dcd50cd5b8735645fd001eb2c09d13f1f2edb73d4aee14c55e63c2a10b278be6b71c2bba0c5b4999539dbb74ab3f67f718a192a1fcb6f2a51c93e5b16df"; + sha512.source = "6c3c6c357eda878895f9bfb49040394c52a764db8297fd3a90087dda851eaa1375b93276917bb8e010575d24939a51b23d5e3acb695e4f1ef540be6759dac31b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5y"; +}; +pdfpc = { + revision = 68610; + shortdesc = "Define data for the pdfpc presentation viewer"; + stripPrefix = 0; + sha512.run = "f94232b95cefe880b963755f18d71e4d4c00eec6a095a3ada786bba4036c8ac1bbf92377fdc64d6a4fa1fd8a3eb2f308a5edd451646f8d552dc1c29f7e93dbeb"; + sha512.doc = "762933c4c5864e8f94a0719f4c26e5b1e576e11353553875df690fe9f2546c08dcd2f35e7ae46fda6960781fa2223d874acfb5c0c8f6a7f1732e2ca227001f46"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.7.1"; +}; +pdfpc-movie = { + revision = 67201; + shortdesc = "Pdfpc viewer-compatible hyperlinks to movies"; + stripPrefix = 0; + sha512.run = "55d8f438a458048893cf6cdb56969b84c5e0d195346a0d79f4e097a6ea336623133c42efedd1416e294d474f44bd01c9fd5efa6e38d44fc49194fc5de9a965bd"; + sha512.doc = "96eb1120fadb2fa47cea38fb9fac189d8e142f9fdfaca5f6c46b5b0fabf603f7fbfa013715d589b25ef928bd69ffd273afcfd5d1fa0d8a30f2f8dc6c50c20cd9"; + sha512.source = "891864cdee43d1c4da7ab9cefd3ba751ec7f574811ea09f680fc704475fada67c3b2fef727abc254b83269bb169f8d8f2269e5d938b9ffebe624cf9c31e5cf93"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pdfprivacy = { + revision = 45985; + shortdesc = "A LaTeX package to remove or suppress pdf meta-data"; + stripPrefix = 0; + sha512.run = "8ec360bcfa5056b240091f1b2b5e6562656b15379bcf74b161899ddce41cb70d08cfdfb73b9497efd48e192fde11bfb4ffc59ed99059e1b6f6619e34b7f39bcd"; + sha512.doc = "81e2d8a0e5f5889efbf96eae5e879378fd0b4cdfa9db66283e34836b767d27d216e35822f9225eadd8816e46c503443055dc822f221b35134ecf95fa2e0d22ab"; + sha512.source = "7c31f0fc5836adffb8bb9417fa90c5acdd1cfab2f653d79c00cf5c4552435ecbf915cdc53ff4cbed796013c0c737c25fe779e9410ccf646090d5071139df5069"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pdfrender = { + revision = 69058; + shortdesc = "Control rendering parameters"; + stripPrefix = 0; + sha512.run = "507450ada31750d833e46a74ab38570bab964c4d36224482d0aa14b2f846a10c34c21735cbf7c4a8bd7f6c10dab5932830ceeef8198b98f72a716aed27a0714f"; + sha512.doc = "447336df8ed6b0f026e9b99a5a45481fb04da0dfe009e091727d99ef536c5e073ca90bb9e4268104146908f5bd6588dbb8d294cceb0acb3f46763e0f835b6803"; + sha512.source = "83e6d5dcb7aabd6bc3e84d273687b91326209dd78b8c91acb256e5c42566a4e441e526de9b64fd8d5310a6f393ee7e66c6f561f87721959fe2cc9e41aca02fc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +pdfreview = { + revision = 50100; + shortdesc = "Annotate PDF files with margin notes"; + stripPrefix = 0; + sha512.run = "1cb41c081230f601eb627d81118a3832597e97c2e0565f48f584e8f4b6d039ce903cdca54fea4591a5c9707d5145ff45470858dd2e39d3b18a2e964cb380301f"; + sha512.doc = "72f7a2083c7bfae24d3a4cae397925f9d02555587c59cfea8d78b8fcc0de5db24367968fd27799f4148865ca7c2a4c2dacd11269d1d71c36f039fdc913a532e2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pdfscreen = { + revision = 42428; + shortdesc = "Support screen-based document design"; + stripPrefix = 0; + sha512.run = "e8a3fecc3aedfb87156c1dfeff4673650a8dfd31109e3d76e7f51dd99b1610aee086a2fd183d48cfe1403dadbc6a8ba84fcfab5ea832b43b8a5128bd07612112"; + sha512.doc = "8f4b1f6876b0adfcefb4a9b1ea5f9c8ffae0fb4ffc245fd75f631b172dc592dc82ffaf68b37e9c1907db5275f317b444966a466ab6c8e7b20b80535842230794"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +pdfslide = { + revision = 15878; + shortdesc = "Presentation slides using pdfTeX"; + stripPrefix = 0; + sha512.run = "bdb1d91b587375a0d72e317e4a762b9cef984dfa36d94fd7bd13a3e22941f0f1f4c981138b805613f7a62f4d09c7c781fa9e4e5d4b5019a749a8f8a700bf5540"; + sha512.doc = "92008d1e461e5309649ec5160b7dd3796455f04e923f4e5c8593a3a4cc76f704639206c48a4af13bfa9fa3fd735b03ad419f07d1222a45d093a6824aafcb8df1"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pdfsync = { + revision = 20373; + shortdesc = "Provide links between source and PDF"; + stripPrefix = 0; + sha512.run = "0a7f183fd83f52016d499f8aefface745fee8351bafb4abb467166553d742f91ead7377fc3ce8111bc57253431aedf70f4b540975a1c139017f7d02ccebb6ca4"; + sha512.doc = "7e103ba84fd41acbed007f4acceb0188372a4984977a3fbee3bf4484612c6e0621a934709982407bd1d59a69167c1d2f5ebd4b94f73bc502baa8a4830fe3f983"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pdftex = { + revision = 66243; + shortdesc = "A TeX extension for direct creation of PDF"; + deps = [ + "cm" + "dehyph" + "etex" + "hyph-utf8" + "hyphen-base" + "knuth-lib" + "kpathsea" + "plain" + "tex-ini-files" + ]; + formats = [ + { + name = "etex"; + engine = "pdftex"; + patterns = [ "language.def" ]; + options = "-translate-file=cp227.tcx *etex.ini"; + fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" ]; + } + { + name = "pdfetex"; + engine = "pdftex"; + patterns = [ "language.def" ]; + options = "-translate-file=cp227.tcx *pdfetex.ini"; + fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" ]; + } + { + name = "pdftex"; + engine = "pdftex"; + patterns = [ "language.def" ]; + options = "-translate-file=cp227.tcx *pdfetex.ini"; + fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" ]; + } + ]; + fontMaps = [ + "Map dummy-space.map" + ]; + sha512.run = "c0158cb19918ea2bba57cc68e32af1d2c4ef50ba45bf05e0c8b7e64057daee19843ff77633e4dd0ad660df39983c46f755c691f85d4aa2000086c02d48498d0e"; + sha512.doc = "d059f01596573efacc4ca80333b07236f860375f49b82d0cd3ab6b3f441f379163a37c820e713a2d96a8f69b821b3dbd68f360c5b5f005dccac54575df4b5d4e"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +pdftex-quiet = { + revision = 49169; + shortdesc = "A bash wrapper for pdfTeX limiting its output to relevant errors"; + sha512.run = "7b33e37a4b33060abee48ccf825cacecdee552d641da48dae47e3615fa0ab91ea9912b52fbd5c5ba6cdaa9c0d2cc7baa7c48a80bebb6d1887e5c633dacb4d104"; + sha512.doc = "e13392cfefaed2c154c086ffcf85e21725e4230ce78d10e07dcb0a1c8b3685bef2572c5f5e249c56120320f2b0167cd5055ade50625a296446a197c0ba4b85cc"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1.0"; +}; +pdftex-quiet.binfiles = [ + "pdftex-quiet" +]; +pdftex.binfiles = [ + "etex" + "pdfetex" + "pdftex" + "simpdftex" +]; +pdftexcmds = { + revision = 55777; + shortdesc = "LuaTeX support for pdfTeX utility functions"; + stripPrefix = 0; + sha512.run = "91054b61b76382813d80e873d908cc07f8571b7651f49a3dc3e87063507af43bf31107c34187b703b0c4462eafe0cd605159803c72cbf2821cf6ab3afb78fc6d"; + sha512.doc = "a16db56366e80b1694b78919a245336c37690ea9a1305a606a3bfa85a73c854e92d1cd8b9ddb0bdfdea82f1ef684d06d8b4649e4111c39f24f321dbcb01aa036"; + sha512.source = "f3e62a5f9029f71c652105b137048cef4f5562dd0848bb7a94d251e2af579c394322a70f40aadbed3ac56312005d59124ef3fd5a2436127a72c430d344ecede1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.33"; +}; +pdftosrc = { + revision = 66186; + shortdesc = "Extract source file or stream from PDF file"; + sha512.run = "8cb175ce464b0ec0bf74c39ddcf381daf9e27635098e775d929f5cdc60858d39cdbac1a4302446f9368a274ce4c3afda9636d882ef4097d2272d22e190d8d272"; + sha512.doc = "01598180f8eff2913eeebf5bc3d5f3aba32029286fc6e0c072aa8c0f4dabaf0c6e71ae7451ba9a7b65b4d0075a7f0a3baf345b02c5826eab64d74e39eb82798e"; + hasManpages = true; +}; +pdftosrc.binfiles = [ + "pdftosrc" +]; +pdftricks = { + revision = 15878; + shortdesc = "Support for PSTricks in pdfTeX"; + stripPrefix = 0; + sha512.run = "f7c0a71e44d0d388ab952ff820e5af63fe0f94acb2feb3415a2d1b3cffd94efc7e8bd17efbb7b608d082ab1b7d7ba1b780c63088df54a8db241c9b3d133eab1e"; + sha512.doc = "0e3ec1f3b7d7c9bda1e08060f0ee0615244863e513a25370b598f22bef00e6ece79592a105eb13cc913c169b1994c8a38fd60be0566e1c52e1ce2f97dc1e5995"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.16"; +}; +pdftricks2 = { + revision = 31016; + shortdesc = "Use PSTricks in pdfTeX"; + stripPrefix = 0; + sha512.run = "e50406cd680e1d5cfabcfd8000b743fde61dcff7e3c686b06f58fd1fd36e414d53140b5d244ef65931aeec67dbf458e5e2d43266f26ee9de301babbc0f88853d"; + sha512.doc = "4a22c280a28e4a45f068d52f4d75f19b5ccfec30609d7c8d143cccc67d16fc04cd1ae63e7d6a5a659a0805ed85d96d57ff5fba4b246f67029457088e7696ad23"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.01"; +}; +pdfwin = { + revision = 68667; + shortdesc = "customizable windows for screen viewing of TeX documents"; + stripPrefix = 0; + sha512.run = "1064e81793884565568f6bde33072dc007c9b9a07c010be602111ea4429ccb803c18a3af13c85bc1367279624266063756bc59c72e6190e70090eadc8857b8b1"; + sha512.doc = "5055cfb0e2cf0e1cc105a43fb82c05e133863cd22278792de5aa931afd84afe7cc3b35566a399dba97645da4495d16e47d723155991ecf1bb3e13a892f230787"; + hasRunfiles = true; +}; +pdfx = { + revision = 50338; + shortdesc = "PDF/X and PDF/A support for pdfTeX, LuaTeX and XeTeX"; + stripPrefix = 0; + sha512.run = "c1e1be225efd5bd66873663ccb134521b40253875248096a66a8499609e62e481fa64e563afd75952b2dc0041fa1fce594f4047c3c91fe6b9443493ce8899ae7"; + sha512.doc = "22b7e52295ab8da136e584f545001d0db480cefb06b7d595133ff3508c9ee3e7b7d8c8a93c41ebf24a9e313b4e40fdf355a88ef0a65b629c3b27f5f4bcec906a"; + sha512.source = "31c9d2e7fb89f9405f26a18dce6a5066958867ca03ee793e46f9676022ecda77074eef23fb4a238af5b077d642107c372e268ce5b4e7c0358d7ca8c0ed6daddb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6.3"; +}; +pdfxup = { + revision = 59001; + shortdesc = "Create n-up PDF pages with minimal margins"; + sha512.run = "f5b7623c1ecd132bb3646af5953245bc7378901bd5ded2e910487770cd79bb3d248cad426aafd18dd12a28bdd46be0f89b81dc95959f06688fb6a7a8f96dd11b"; + sha512.doc = "23db38fd8ebbd04bf6fed3b2814360cb6d0b736db1540d0298e9ab6edd449894c420078adae11d97998fa1fceb8e7083adacc0048337afbf4b6fbb253c8ed21f"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.10"; +}; +pdfxup.binfiles = [ + "pdfxup" +]; +pecha = { + revision = 15878; + shortdesc = "Print Tibetan text in the classic pecha layout style"; + stripPrefix = 0; + sha512.run = "12092c82c52e34259fb0894b8375c45fd94b9aead121085736a0f7bac90b7e156906a22d233c596c79880aa0b858f7213f37b2059cecbb4627ce2e4163f22335"; + sha512.doc = "3d0d9184aa0009ab67f299a87b3840513229a93ec08e33208fc7b3c1a69fe043b02844ccf7569d14c5d5cdf0546224b320970caa080458c92cc299853b021c98"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.1"; +}; +pedigree-perl = { + revision = 64227; + shortdesc = "Generate TeX pedigree files from CSV files"; + sha512.run = "4aca97c3d231e3c68a8372d6d8c970aa681fef3d1b7061fbea1648a188c03e06221bf83d2ed0678390780e9a3c2edfe425ea0050172e837ef1a1a62369c41909"; + sha512.doc = "b0b251fcf40185b017835a7a47e32736ce0d49c56be134bf93619dffedae4ecf44d36050e4515fa681c8c37707a933d8faece2943b4eddb58dab6ba3a2df113d"; + hasManpages = true; + sha512.source = "febf928301eddf00aa84ede679712a3e58520368f7ecd488e9d696b82dc6ed5afc403d88b344071b4291391528a4552620c4882ba2d2e6ee518fc3a8733a2f41"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.1"; +}; +pedigree-perl.binfiles = [ + "pedigree" +]; +penlight = { + revision = 67716; + shortdesc = "Penlight Lua libraries made available to LuaLaTeX users"; + stripPrefix = 0; + sha512.run = "7765a7beaf9d2f99f383c6723fb7ddf3968f656a433bd519631b539e7c599e4ea26546585c1be6732a42e1632fc11b980ee9316de6cfb765332790f81d548aff"; + sha512.doc = "30307bc7774c3768227da33c31c6296e8d470f1f835f792248ed4ff40e261ea682fd967987396808fcd36e7e0a74c3da2bb947de7eab7af5783e3790857b081e"; + hasRunfiles = true; + license = [ "mit" ]; +}; +penlightplus = { + revision = 70319; + shortdesc = "Additions to the Penlight Lua libraries"; + stripPrefix = 0; + sha512.run = "97de3ce726fc5469bf1230edba37728a332e91dae33a9498b4e32c474694866e95abfe9156dee1e4c4a7b4f9b07922741c87519ab892c01f037db04a92150238"; + sha512.doc = "e35a2d252d8377efd170d9b42ac233af921b34b2a9a91248ed7640d9b79809debaca54451251fe5cc1394df73f0ef476c72f614ae5aefba5db319d7f38aae7b9"; + hasRunfiles = true; + license = [ "mit" ]; +}; +perception = { + revision = 48861; + shortdesc = "BibTeX style for the journal Perception"; + stripPrefix = 0; + sha512.run = "669bf4b618c4120d6cd7b574352c38d0fb3ab7bd949e26ea239f4ceb0fccbe102dcc6644ad2cee9eb79385f590918a12bb2c065f80b54e8343223056df448060"; + sha512.doc = "35428e19d9e2429691948331ef574168a3eb5dd3e09f4286c66003ced8c0a65da9853de4dd57a1920e2f2315b8543f9ec9e096bbd26123554455dd8c23b33f55"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +perfectcut = { + revision = 67201; + shortdesc = "Nested delimiters that consistently grow regardless of the contents"; + stripPrefix = 0; + sha512.run = "5c3963a08f1041e78f871084531187214f3735b15409cbdcb4491046feba1fbe44887b23f450d40eb3a697a49e0ecace584b96cb10a7f959e28afc642259b5e2"; + sha512.doc = "4a978f726c8b5a69006f293b8428978a1a6185df27f2d26a0be06309fc55ec3b8cd6117cbb4ee732f6c2d0ddcfe8ad66d86f7f838ee2e386931e41c0ab043e2c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +perltex = { + revision = 52162; + shortdesc = "Define LaTeX macros in terms of Perl code"; + sha512.run = "af7cd6b065f2405a514d20cb386b34399742a42286002ab3e0f795b64dcb434ae97470ce9cbf25cb27a9b124ebe56844b47c7cf89e1f83a4bd35f1bfcc98163a"; + sha512.doc = "d39c93f4bf3da08266bb0f10b06582db2bf96bee73faafdb191af3770c7c24abde407774f21d3c97b1f2453a8a9bd24576acaf0606796d7439334b8b1e42ac7d"; + hasManpages = true; + sha512.source = "99a8e27c23a7056496c56e734fefa1e921a002d7b86c153b3a209f7c3d7c415dac05e77b0ce5bc8685bd622243d6ed53be4a7f570a3ed487c3d55baa5b5af06e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +perltex.binfiles = [ + "perltex" +]; +permute = { + revision = 15878; + shortdesc = "Support for symmetric groups"; + stripPrefix = 0; + sha512.run = "2b1ea22ff45718a12f5a031a60a2780a43b324afb3a7c4b3bf2e1a9808f5eb789938f0e084214912a50dc1a8ebe76c58cc39dccd5a411ce001fafc8fa5c41ea4"; + sha512.doc = "f0f9f8d4e7e9b7cf5794529bd5febb0bd58f1ba0e95a72d688280ac3e6837cf39bdfb62ac29584fbf8cb37e1dafdcb971b9333a0306fa867fa4a1a256dd5a4e3"; + sha512.source = "4273fc09b30de6ea203e13b09822a07b222de8d1abc143e67c0c465bd8c31ca4648b83a7fbd895a8865b7793462bd020642d383e761c926504a6d40e785c0108"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +persian-bib = { + revision = 37297; + shortdesc = "Persian translations of classic BibTeX styles"; + stripPrefix = 0; + sha512.run = "e6650399eb5129dd0ad08c3ff93843da47287ce641a65826545b10a9213437da56467eabd8c37f1a7fc17086af968043586c53bdbc7485e9a4453b3f5b23bf83"; + sha512.doc = "a18f3652bfa8cccd8d574e475859bde8d41de04d3093f05222dfe5687460b8eb29a1e9bc258cb73cca69dad52f567572a654f46414a0d513ec27e462f4787f35"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +petiteannonce = { + revision = 25915; + shortdesc = "A class for small advertisements"; + stripPrefix = 0; + sha512.run = "8ff32eaddcc84973851b93f0c1c1b250b596a080669ef60ea2c115098c4984d426e37240ae8781fa3b95ce494e9fecccdd259fd25b47402498028f2b8e5f9fe3"; + sha512.doc = "d171f31889fbf07b727c78a99bc91a2e6a8231faa25944a600ddb17ba32273ffa40a39a56e6e9b2c35ebfd0bb396ee699ebd9ab179577ab07e63feb8686d4af5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0001"; +}; +petri-nets = { + revision = 39165; + shortdesc = "A set TeX/LaTeX packages for drawing Petri nets"; + sha512.run = "0807444f934acf16b052dc499a097a2a645d037622a71430cd82fcef85d11bc652341ce6396a27d717effd08bde8ba3224c5235351fa9146000c01abd522f644"; + sha512.doc = "cf03048e2bccded143fb493b100fd19103ab90f40713441c5380446702d6c57ac3820f2892a3dfdb80880952e09de78e69b309783767a3e157f76b81c9360535"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +petri-nets.binfiles = [ + "pn2pdf" +]; +pfarrei = { + revision = 68950; + shortdesc = "LaTeX support of pastors' and priests' work"; + sha512.run = "2022347ebca4dcb71e1dda7d8ac906733a664b98d14660e48b16e6592ae229641b8c7bd10602d89b3b01535d2851f9504e3329a9f82f4adb5a4c68dcd69c6ce6"; + sha512.doc = "4e5eb99b0e0409395954170339a744d18f8d0f8ee389ad1bacc684a037cc8b2b6121850a7674ec9b699596bcfa8e9e36521d13571bcad0db271cd1f9fa619488"; + sha512.source = "65d865d2e79ff7476a3629fd3ffaed09b3edc8fea9224fd7126cce0203bfa6f5ecb5caee6727bd6d01196666f138786ca409f3530a577efae4fccd405cbd845b"; + hasRunfiles = true; + scriptExts = [ + "tlu" + ]; + license = [ "lppl13c" ]; + version = "r37"; +}; +pfarrei.binfiles = [ + "a5toa4" + "pfarrei" +]; +pfdicons = { + revision = 60089; + shortdesc = "Draw process flow diagrams in chemical engineering"; + stripPrefix = 0; + sha512.run = "cd09de584483a1493648e9f842b743c43d7712b35f9d315ab34871a964b6ea7e8bcb0ff4b8d4399f5ce7d5ebadf41c94e8b88772b15155d4c21e17e4c62ecd2d"; + sha512.doc = "cb9f0ae2a1b7a3c8cbb12f859c9cd9d33e447652ceacec2642e45c7db7a96ec6cfb9bf63ac8f711c1661557308ebc3c6c04604412d09cf16d232e23c805e395c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +pgf = { + revision = 65553; + shortdesc = "Create PostScript and PDF graphics in TeX"; + stripPrefix = 0; + deps = [ + "atveryend" + "fp" + "graphics" + "ms" + "pdftexcmds" + "xcolor" + ]; + sha512.run = "d7fbf0dc83f88a2f6d2de3117365d3f4ac2379ecbc530e343bc3e02ac8083e9a9843d479d375d086e39b6377b21d2fcba22883485e040fab1601642ba80128b9"; + sha512.doc = "e3be45f63b46124218592ffb8083998b9d25e81dbba7ec8ee58d578335247b05ecc46c145f5de8b859c72dd54cafac58ee784f9aa33888fc129817c66a819568"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" "fdl13Only" ]; + version = "3.1.10"; +}; +pgf-blur = { + revision = 54512; + shortdesc = "PGF/TikZ package for \"blurred\" shadows"; + stripPrefix = 0; + sha512.run = "95093365a79d7f8a2df134decbac172a080711bcf8e8f77267ea4520ccc9aa398f5fbedaaa5500fa189b3873d8897350dc2c99f142b6bed1a6e7705293a3b8b7"; + sha512.doc = "d313e5ed1a0b5637996d6bd1827b909a771fcb44490312c502acd89412966d7662b1482fb8f3347b8d658b336051773c3d10e70df9c1f22e810802936eee816f"; + sha512.source = "c8b7baeb30d520d05d53d6c37f70e028d8622d59eadb7b8aef9c26147e5ae4704fbf45798315597f6ecb65a15e4c8e8e18dcc0cac98b0cb69efb191645632710"; + hasRunfiles = true; + license = [ "lppl13c" "publicDomain" ]; + version = "1.02"; +}; +pgf-interference = { + revision = 61562; + shortdesc = "Drawing interference patterns with PGF/TikZ"; + stripPrefix = 0; + sha512.run = "569dc2b0f5b11d93aa447d54649df07c3df375dcdaab509229d0304bb25523bc45062916089b15776b727a9c05205688a161bc79cfb4abbc466a243b2c8c57a4"; + sha512.doc = "106f86c28759b0c105a6f57df9c8df416190f781b73f1bbb7398fde6e88192fca5aa3e198e7235dfc23c2fc3bb41a5cd0cfa060f9dbac4faab30bf04c484e9f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +pgf-periodictable = { + revision = 69924; + shortdesc = "Create custom periodic tables of elements"; + stripPrefix = 0; + sha512.run = "c640e847afc370fb47c39d44712c7fdce6078d39b4cbca9630708fa4374b8a9793100763a5a2734fc3a925d1b0dbfab28aab868f49750dfdabd4df69f0553af9"; + sha512.doc = "a148aa9df7e95c48f6eeb5a85323f68539ffbaa7deed7b3188b75c5827814d2b26e20c61995334e77a868831d5bb9b7881e8cb993967293f79bb327c387298af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.0"; +}; +pgf-pie = { + revision = 63603; + shortdesc = "Draw pie charts, using PGF"; + stripPrefix = 0; + deps = [ + "carlisle" + "latex" + "pgf" + ]; + sha512.run = "3e5cdb5def0918ab1c3d38d35bb85f07711144d1fcaf0f3af8b2c5e0eacd9af6c3b92bc6e1f45438e40d7f5838770b91ab513970cdd9a3f7dad2918eefb875f6"; + sha512.doc = "ac151cb61ea4fc440ffeeea9b987f6dd648b53596934900f41437f787bedcabe2ca8dd53c37828aab816e9334d0d26573f81000333e50d0761d70c586a5d87e3"; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; + version = "0.7"; +}; +pgf-soroban = { + revision = 32269; + shortdesc = "Create images of the soroban using TikZ/PGF"; + stripPrefix = 0; + sha512.run = "e0f85a77e9d81bf01f5516c3b3baa52a9b7f1b0faaa6f0aab1cae2182732eaf04ea2edb6b0f9091272849f1d7ccb3797cb2641090b926db7f3d0483d08569845"; + sha512.doc = "3f4c021cfb99a27778c250f9ac13e2abe48127731b54d0fca9e8e588f44ebf797e034a56d3ca19bc847bca173dfb03ef9a70e0fee71649188a8427d6eabceb80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +pgf-spectra = { + revision = 66961; + shortdesc = "Draw continuous or discrete spectra using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "723fcfd1b6827cf224fbbba91bbe4b65e8ea6b09cfc5eae2645144d2f64bdc0004f4f6184f2a310f7208650870041f12c4eb73e4d34c88fee5513d041ba88586"; + sha512.doc = "81e418c2539e9df982025478d552b947dc040a5fb3ac8250636e874e77c97c83d215df6b2e9208f660b8a928eb1dd0e059fae357aef1b71b6e959a37affac2d6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.1"; +}; +pgf-umlcd = { + revision = 63386; + shortdesc = "Some LaTeX macros for UML Class Diagrams"; + stripPrefix = 0; + deps = [ + "latex" + "pgf" + ]; + sha512.run = "a55281a157a2a347f1c9d82679cd663f4493e03123d14dbef0d71582613772252b693a25b3d3e5b72b948c4fd12d0d7b0354d2e38083583b550d7cfb5e634d93"; + sha512.doc = "6d798d93590d859d69bda9f0bd391049db91e2d4fb6f0b019a6f76eeaae9e73c9f249ec356cf5a5d4505af6948d4c70c2ad4685c1c41a7ba40ec62d3d8a9dd00"; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; + version = "0.3"; +}; +pgf-umlsd = { + revision = 55342; + shortdesc = "Draw UML Sequence Diagrams"; + stripPrefix = 0; + deps = [ + "latex" + "pgf" + ]; + sha512.run = "6b015603e3daa362e473d795d32fa785ce247b58ec9f88872fe4bdb4fa660000bd87da2369de556f998485a6fcb6dd49aaca549b0470b41adacba5a278453197"; + sha512.doc = "968d23fcc4f114bab204ec53281975a6fee5f81635ece256351198075cd8463a706954f463beacc162180459fdb3652657f2c060a71c588681f8de6e788a4e6a"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.7"; +}; +pgfgantt = { + revision = 52662; + shortdesc = "Draw Gantt charts with TikZ"; + stripPrefix = 0; + deps = [ + "pgf" + ]; + sha512.run = "0269703fc00f10981d5ce8958159a24814b9f410c1b00516608c039b1ea8a3381392bf1d89e98f3011d42210047bf2e1fec2f103467087f9172e143d9ab6fcf1"; + sha512.doc = "4890ae174c92db8df7befcef30d03724ae52fa4b26ac796d247a703794ce745ee892f0d2ab8a4f62e96a5e5f792791a6f7e8b9e71f1c0f11b68e8cbcf5165472"; + sha512.source = "668987bd37aebd38697c02bc39d85371c7d40613aba13c0f3b62ece8145608057cf3f76cda03de6df25f7ba820359ff2ba1c340aa1b9ebff94bbd42aed39e401"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.0"; +}; +pgfkeysearch = { + revision = 69385; + shortdesc = "This package offers a way to find keys in a given path 'recursively', unlike pgfkeysvalueof"; + stripPrefix = 0; + sha512.run = "c90dd895a9c4d3ba737f6dca0a618af781ef712f7254f80c4f6bf222db80c8e7f010e9e2b2a0fd4a125154586d1b1532881f1e29dacc677c416dc8b5857acd51"; + sha512.doc = "8ba4bc32f3a0393ec32e387110a725d10ec67793867ff7efbe8bc6047a6fe7c2e19970f091f96e2cc4d756809301864c48ce550f46240e22aaed885d7ebb57d1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pgfkeyx = { + revision = 26093; + shortdesc = "Extended and more robust version of pgfkeys"; + stripPrefix = 0; + sha512.run = "c2adb44ef34930aef1d78aed2025a2dc17c69ed641b59af29bcb93c9c9532785090f30834d52c415116ab4a9477d83e5a46d1509e6bd41f47fd4e37cc8ff2933"; + sha512.doc = "2a596ee81d2af4992dc23d6f28f788ef1d3e9a528992f01b7113de726898ae3007b685c4c447d2fcad640403d1bdd8a0eb07299ac9ea81f41c4158eb21b8e9e2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.1"; +}; +pgfmath-xfp = { + revision = 59268; + shortdesc = "Define pgfmath functions using xfp"; + stripPrefix = 0; + sha512.run = "c82fdb2b540dc37393610199581416b4256d9cf382da4238625b9ae29f6d7ea6150925c6837ae1f4b55fa10239f8563fb8abd042d5533080de7283246ee69ed5"; + sha512.doc = "f48114bf89d4d5aeca399c44bf6a6fb26567d7692de319e7d457d3b753df8e302871e9901d98bf8697680125fb8fad56ac8675dd339bc420b439aaa4cc93dbb0"; + sha512.source = "18571bdab8756f25c357ceab0cd82f242007c22ae0b6b5cec17ece221137607a6d245ece8dd90c427d0eceda63749f0d75e77c2974e9dfa8509a1bd34768b5c7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pgfmolbio = { + revision = 35152; + shortdesc = "Draw graphs typically found in molecular biology texts"; + stripPrefix = 0; + sha512.run = "bdbd89379ed7310b78a3847c43022f6cd65f5fccfabfc4723551f5ef4f4cad3e3dcf596ff65cb4c5ba4a354f9bd59fa4aa39147782a0ed369a7dfcb68ef7f9cc"; + sha512.doc = "a9dbe657b4037477adcf3ead4ad4ca5b703ee8c53739da9de0bed8e02c8e14961a963e9a4a5a86b3f53348da9eab5cdbada1b5ddd073bc18c82177abc92023f2"; + sha512.source = "1552182819893f7538ee5b38816d339639ff6e6ed3e092a67dde1dfa2a73eb7bca1490909fa34d4999399a8328b2ec8885ad86e76438e4f177dd81e2e6accdd0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.21"; +}; +pgfmorepages = { + revision = 54770; + shortdesc = "Assemble multiple logical pages onto a physical page"; + stripPrefix = 0; + sha512.run = "9a4fd2f42276cb72cd39dfe3cb5b6c43855e1d7f01f47c53b23c8aae7bee98c89e8a8f784a917c0c4ebc35f9dcaec18b8d4f6bbeb05ec5a80647ff7ca23c02ab"; + sha512.doc = "3bef05b263791c9b1e92868ae22966f5638a900d44ed9ab9de5beeb0dd25c7e8745d09da4cd3c2c7a9e9e5c710126cb7bbcb67579e770c43e6c7e057dcfdd1b5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.20"; +}; +pgfopts = { + revision = 56615; + shortdesc = "LaTeX package options with pgfkeys"; + stripPrefix = 0; + deps = [ + "pgf" + ]; + sha512.run = "7d672d626428c37fa749a810c57be43c6102e1325a6d3e16c57bc560b6d65a57bae94e619a73f3e0efb46ce7b4783d05a6e98c64b1e90c6e0f94f1dd9acd676f"; + sha512.doc = "ff82e0502fdeefe6afe90aad4e7615de9be4ef8e2e6a69e7a537202af77aed00c0895269ceed3d38e0f34345efbdd771d22b0c8759fcb46ff8e91ce639dcd21d"; + sha512.source = "758da1f3daa0ef888b484ea657fdd4384102868e4eee543bc97e73f103b67c367277f5c00efd06a2080f9ac3fb82c909cd30f641363120e70357450179dab6c5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1a"; +}; +pgfornament = { + revision = 55326; + shortdesc = "Drawing of Vectorian ornaments with PGF/TikZ"; + stripPrefix = 0; + sha512.run = "3d5742197af0b6bc11a14ce5b2198aa7a580655f29757f825c24b4081dbd318d45d4dfca065fc04f0d5f47d92fca166a185c878c8d7a506e4ae7547def41592b"; + sha512.doc = "b35295915c86e4ee5c2fb9b1ec2d545c8d4fc1cf5e65f3e6247e4de1e77e2f789f7842cf234546d6e658a73b4837cd50f8216cd9425f588cfe4a12c76bd134d1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pgfornament-han = { + revision = 68704; + shortdesc = "pgfornament library for Chinese traditional motifs and patterns"; + stripPrefix = 0; + sha512.run = "7337b577e10f2a6306badaa45ca57614ac0da6b3c12ca5c9c3978f1358fa88a352cd092452ef3b6e86d01ccd05f1cfae663f914956b74d184c08a21d2e484e01"; + sha512.doc = "7b9138088db1581571508ccb550b1b128ce0b574dcb2a903f5311b9a6e63e9d9c6e56eca0e46ffb5224f5685c5b047a57e5e7d292e7d6de6a9bfb06ee568d9b6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pgfplots = { + revision = 61719; + shortdesc = "Create normal/logarithmic plots in two and three dimensions"; + stripPrefix = 0; + deps = [ + "pgf" + ]; + sha512.run = "8244e65860f37d74d05535a627ef6cd321407a69a142d156bae190c562a9402a0d7e927df732c32cc5f556dede1b51f7aeca5d7d3a26167348a21f2e3d8be5ac"; + sha512.doc = "720a77c574c81e7c3619e3b988c8a359bd6cf284ad3fa7c795eb01c371ede85ad727dde8e5f19d8f683947b5dc5752324581e364c59e8a644b5ae34d6b75a96f"; + sha512.source = "d840015854794de1a311f1d8a9935a93c71a098c46fb1c5cec8a57228a924685f75ea76fc9cf2a9f9f30ed39920bbf2092fbdef2645ddaa5ad5a3787839c1d2a"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.18.1"; +}; +phaistos = { + revision = 18651; + shortdesc = "Disk of Phaistos font"; + stripPrefix = 0; + fontMaps = [ + "Map phaistos.map" + ]; + sha512.run = "d5cb8a051e1e80629385bff368896c47bdfccfcf38a24a723ddc5f9056a59c57703986799253812c9a4651f4e16dc55cee0876ddd0552900f978dab0381c9aac"; + sha512.doc = "96eb22628467289f72aaa0d4983e494c75b3a2315d8b9d2921f8ab29d93fffae4f459ef852529dfa4ff48a65e25d652662c54d84db54e0118b1c021bbe39eafa"; + sha512.source = "5ba2b04fe4e3aef136de2dc40568ecb81f437561ee8e6c320927bb816819889666f57ad07c3b8bf6eb7f6eb84b69147f9233449a26529b61712d158abf889f91"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phfcc = { + revision = 60731; + shortdesc = "Convenient inline commenting in collaborative documents"; + stripPrefix = 0; + sha512.run = "1d1f6387db333cee296545663bc4e2026fecd0f381cf4e45b42c8b297a4ae9bccfaa8e9791f92cf59bccc428b3f63b944d9173660c3606f1f49ef1878caf2181"; + sha512.doc = "ac10825535fbf1e5173d5d209c26d665a128473c3100e349a63ccd921534c9645ce3c7b7391aac56de70f23657db8e1496f6afc0b2d112a45f3ae84d87220498"; + sha512.source = "31c59c51bb48a722e4962986bef69619ca1ffd80bc25ee1308cef80e78246811ee169ca6a0c9ea5e257626e55fb04bfe40bb1ec53d09c81b2fe636e6ce215a37"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +phfextendedabstract = { + revision = 60732; + shortdesc = "Typeset extended abstracts for conferences, such as often encountered in quantum information theory"; + stripPrefix = 0; + sha512.run = "0e1f0f232c7216d654a41ab750477a5a6efd1a2dcb15b2114eefe1ffcb582bd0512bc8592111904c550badef12a3927c5ee2af58548dab5015901165b35a8bd1"; + sha512.doc = "aad67fc68996c032bca758b44eb65288f2245f780e9e4200888fb027b4638963e2f3b9c771a5ec78f8c65fd0c86c8b55b16d8cdad44fdcf9cc6622a766175e00"; + sha512.source = "a5d3ae9a1bc6b8859e998bb3561a63e99d9a4f30da3e3c2dd918ba7f23a09362bd8f123e2bfbe2af4ff7f2204c969ad487ddf389fa04287eacf0abe9f251391e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phffullpagefigure = { + revision = 41857; + shortdesc = "Figures which fill up a whole page"; + stripPrefix = 0; + sha512.run = "4d443d5ce4dfd4805eaea4ecfe11bc94b9e92bc4d68f8fdd001a72ef09f519f11e20517d01722f5c7f79eeb9b92d0a6099d620e5c54dc0845b7ed5cc762c260d"; + sha512.doc = "837b57707c0d37d20b02ed83ca32768c4b2718958ba3124650604f4de0bb11528c2d5fed95f942545db400eca0517ef59fb168408ea9960f0a894a777e9f2681"; + sha512.source = "f0abc0f77efc7460907cd18282ccdf2ad15687b3d891a72e8fe756c16d1d715cd6f7eaabe09898c2bd88ebe54d16b86115c06b4d56fe1f2f4b8e3e952292a107"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phfnote = { + revision = 60733; + shortdesc = "Basic formatting for short documents"; + stripPrefix = 0; + sha512.run = "ddaea70a5bb3aecdf634b44dcf5f006db479a4d47e44e96f92bd390c2c0e166b741ea31a0f22ac39770ff0c92590a261c18fe5096bf97997743684a95a82da2b"; + sha512.doc = "2dc4e7d3615d8f185bf1bcfeb5a90d51f362538691444355ad6820f8bdcfcd68f1dcc69486c0b630d1141db1b4bc10bd17abcfb93cf37b778266090f29ec946d"; + sha512.source = "15c0614cf6bf41c94513475d0b65f7053970505fcaa3126550d283b8597c49e30b86e716d3b643fceeee2bae37f81a65d8f65859847bee6f0aa4e508102f6617"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +phfparen = { + revision = 41859; + shortdesc = "Parenthetic math expressions made simpler and less redundant"; + stripPrefix = 0; + sha512.run = "c184623f226f9bc9926eef0b5e23443bec20e66c6641196bc90daf27a648d9f0db70ad176488fe061d44746b6cf46a3217eeb42f6a95f2e37c20d641ba2838c6"; + sha512.doc = "5c34575950ee1a9616408f293319eb0634795e07173677cae112466a298dbfa5cc18fbead8e92e459718df91326d27cc7baf0414a1f1e8613a5c115c070b5016"; + sha512.source = "ca94f1756265e0f92e8808b7dac74eb57f62eedcdefbaf6e4059c8a7ffa51819da979a70203b11250d329ec9000b454067c101b25753673add4b35c40fe1e882"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phfqit = { + revision = 60734; + shortdesc = "Macros for typesetting Quantum Information Theory"; + stripPrefix = 0; + sha512.run = "604093594d05e5f331d27bf5b0d6c40b631934a2872841f2534f69279542a6bd26ad758712b9b24c5490c4e9396ac147f46a9d0790cd29f56c0d2b13d876bd56"; + sha512.doc = "738e5f61c0318f331ea2a7f1e0d5d019969636917fcc18ca19a72ed42b1207f4025c58ea886c4758b64c61cb33faf8ae5b4d5f2f7a55a9ce9758b9fec00508ac"; + sha512.source = "0d0ce4d75bb6d73e24a47c8d66ac0b72a0cfe273a6daa4af1fd3a89f853c3c5c1f856d749321fc9ef79b0e0a9c27465045a48202536b73270971deb2d4cc7a30"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1"; +}; +phfquotetext = { + revision = 41869; + shortdesc = "Quote verbatim text without white space formatting"; + stripPrefix = 0; + sha512.run = "809820fd3108cb5b33c5f3129fb3ae8251476161aca5936b966219a49a29204107375a33e6bfc452d2aef8b0cefb30f8ab0e53984f39d5c3228ded25ca19c37e"; + sha512.doc = "501d652782670318fdb45368e01dbf76de7cb46f0f1584bc7dbf1242a71a42e7bc870c5cbf7dcb33d41463c550a0803226860a0aa64e75952f717436e8f6501a"; + sha512.source = "fa812150acf519ca0995afeb9b3dde9c1929b945bb964612319f7065c6c303641e2a245397e7271eb777af9f6cfd310ca1ec7f9974c0bf9c329a0f006df2b9dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phfsvnwatermark = { + revision = 41870; + shortdesc = "Watermarks with version control information from SVN"; + stripPrefix = 0; + sha512.run = "38dae3ef3fe183bf5149b91050afd5bc9c934d01332b021ce87e9ea412008bc22d42d25a389e82b02ccc4cc4820a10d821c228c02c4f08fdca89ebde69c6e2d0"; + sha512.doc = "7f35bcb41618c7e14e7e9f8fb289231a8032f7f1cd2e6333982a346c5f8dd24e5733f70c03ddd183d170361b2b3af4115f6fa9b788c4dd2a020020ba525aff18"; + sha512.source = "6c5e113bb45ce6b11768c711bb59743b75bf4b95e9d84c045b59f502f181e80a67be56b3b5153364c29ca5c36f6adb73dac4a5d3051a8dc3ea275a43277732ec"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +phfthm = { + revision = 60735; + shortdesc = "Goodies for theorems and proofs"; + stripPrefix = 0; + sha512.run = "2a608898b9038cc46e4720423a42f403abcd105700e20e90274ca6e01ed3c4428a443466d0e32b0cf0da9735c0b7ea74b82e90a3d0b72583d38fa5a14094f806"; + sha512.doc = "bb0c2da2d17b0c3c3550569428fbdb5532d1fe79b325289d71f35659d749fb952bacfa6140210ebbbdc661dc445ae8add1be6cc79b77bf6346fadc70553bf189"; + sha512.source = "7c234459aaa013a9d2d0c719791d99ad6db252e152a53f7111e6d9e04fed3c718efb4fedc85fd064825d40ef80fec2643d6310e582bf830486b8e43efa27c966"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +philex = { + revision = 36396; + shortdesc = "Cross references for named and numbered environments"; + stripPrefix = 0; + sha512.run = "0b6ce5d281836926d6807dda7a8a4eace43a25160b8bdfaaded7ef9838f933db7a7bd4859019555002b662ca01800e64c4f6228427b4f40c9a79e71759aca6e0"; + sha512.doc = "ec8eafe3e1b5e7cdeeb2554c3e34036c808f33b4f4bd2e5fb8b2e10e4366f51db02b2bf3dd52e46c92d600cc092f30c4db6cb6f69cc66cafde5c11a53a883839"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +philokalia = { + revision = 45356; + shortdesc = "A font to typeset the Philokalia Books"; + stripPrefix = 0; + sha512.run = "6a7b76995074ec233d4922de96f727ed031b21abbaf1a423bded6bcd964e8e503d7d3d84d8d4eb1ca42ebd99e1af50a244238f668db245ff4810176abefb0976"; + sha512.doc = "8cefb15592711d19d3fbe5fbbe6efb219ce081dac6d8bfb12ebc57ac807a30aefbaa37f371e70b7141876333ef408ae5fde177add749faf2302b2d7f60a1bf00"; + sha512.source = "975d97494ed2fceefd6d7fae5cd7916689087d5f51136398b19d233e88335c373bbd572aeca930e3be212ae30b7d8b34e0070650aac5a9c391793fd6a5c1e394"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +philosophersimprint = { + revision = 56954; + shortdesc = "Typesetting articles for \"Philosophers' Imprint\""; + stripPrefix = 0; + sha512.run = "8b4a1b9bebf971b0963fd20c01807d5d541a978b88a1b07bdb950c1e39fcb20b8750cc0c78bb97d663c00bac2a714fa95f0a088a1c84f371261d236c941cec4a"; + sha512.doc = "9c6d1f01b2e815c4c33c4e95be40d1a7819568bbf22edacc202c3346ac4f7373ce4b6e8316ed194a32551f07296628d1d8f971ea856ddc33c1d964efd6388d4f"; + sha512.source = "12c557b2f273c06ccdc322195340e10f50d54986ec8aea4ac103a173c9a31514d5fbce39413472fd530f0c41a21e1e5d7fb5ba03b8dd3008efb8056adc22dbee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +phonenumbers = { + revision = 63774; + shortdesc = "Typesetting telephone numbers with LaTeX"; + stripPrefix = 0; + sha512.run = "328a221086c26804d8655bd38f4a302b9d76b25e1a6238395f342bba8d1f6206b1d64a7a2fe4de41940015701e8fb8bcf33a0ed5d7298b8c7642429d93a85f8f"; + sha512.doc = "ec94445c39683298feaf57ac7d074147fa094aeb3fad983b85fd922ec8baf533160a865997c246a62677ba79bf85ce8f385ede4bae159667ecae6eec2cf84824"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5"; +}; +phonetic = { + revision = 56468; + shortdesc = "Metafont Phonetic fonts, based on Computer Modern"; + stripPrefix = 0; + sha512.run = "655dda5113926fe28ee0695d8d87a18c1ae63599a2d476f7d9b3e3a28bde475cfe33fd06aa70d709fc05a2d43026e91348bc0c5435f4a9132859b7afcdf41a7f"; + sha512.doc = "626ca0614b723fc3e4b75ca977c7a12e77908ca710ec52994e62e9e89e2064f973ab2bda3182a3b466eb2df2bdf030e0e6432cbf9f984bd7316b483f9c310b47"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +phonrule = { + revision = 43963; + shortdesc = "Typeset linear phonological rules"; + stripPrefix = 0; + sha512.run = "0465e183077f7daa57d2bbc5f1a76afa72770718d2dc969ebc3078b213738f5ae3919f3ebbee04ae54ff7b8ad6e35630fb22293b5cdac31ee5bf31680433ad15"; + sha512.doc = "80ea19243537e769c49a3411e036c5811b19586fda3878894126a151af4ddff46a554db7bc07f488f692fe9efd0934149c8c94cde75b92c880bfcc28218ae5a1"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.3.2"; +}; +photo = { + revision = 18739; + shortdesc = "A float environment for photographs"; + stripPrefix = 0; + sha512.run = "11727df46b85be20802588a6c5743a9ae70a89ea73b5f16b8a4a3d3f1d3a9ab3194f56f0ef9d79947b14fe3f6b3e05cbd291dad8346cdb128b4d1c8c22d50bf5"; + sha512.doc = "037466dff8edee9f6218b1fddfe579b2f82491746e22886ea5f8496b5f564084d81e35ed549ddfc42855c850913cf8c587806d71b7a531ec3ea3056962c54e48"; + sha512.source = "644303a7eda6cbe50db8cf871ffd642dde5115d4f1a72edde65e9218337faaa63ffebc94bca96da28a4a2d7568ae0ea124f1aa12fe5402cfc1c57619e86746ab"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +photobook = { + revision = 68313; + shortdesc = "A document class for typesetting photo books"; + stripPrefix = 0; + deps = [ + "adjustbox" + "atbegshi" + "changepage" + "colorspace" + "environ" + "eso-pic" + "etoolbox" + "fancyhdr" + "fancyvrb" + "flowfram" + "geometry" + "graphics" + "hyperref" + "iftex" + "kvoptions" + "listofitems" + "mdframed" + "numprint" + "pagecolor" + "pdfcomment" + "pdfpages" + "pgf" + "textpos" + "xargs" + "xcolor" + "xint" + "xkeyval" + ]; + sha512.run = "1ceac5c208ff577c3072b96bd3c98e03a75126c25c5bdb8a88c3a253623b2f089d4bff17bcc7cc14d522461df2f95a44ba784ff8108a6b2d284127d20b75d4d1"; + sha512.doc = "fc29b76cded75fdc20eceb668cc0bda2346bc5e11c5df2d860e90999e48b73a3e44c985048174cc54f42aca2dec3d195b765ffae923a1eb78b1d7da180e6a966"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.1.29"; +}; +physconst = { + revision = 58727; + shortdesc = "Macros for commonly used physical constants"; + stripPrefix = 0; + sha512.run = "3655aa79c067d01831e6f30d85f13ba7b06742d4731f2f2bbea8066205256fd4f6a5d3290812e667bde8805b9bcad82c4713d49e3eb357cde56a1f50ad065877"; + sha512.doc = "1824589dccba975de608260ab460a8a6be0d8aecb099571fb9e088e0ecd53f2f6e854a3f21eebacafd06717bfd53290ce23fbdc85467798c8f9b1189d64a58e9"; + sha512.source = "9e21baa7fe13e2ac201ce8d3d01e5217d078a5300c580fcb9e32fa321fa02ae5da58a4d44f81b4acdb31dc219ae6544196ab6580a123c891021185b65583362c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +physics = { + revision = 28590; + shortdesc = "Macros supporting the Mathematics of Physics"; + stripPrefix = 0; + sha512.run = "e394a7f8eda4583cf196dccbd9d52122d0ee630a411630f11d432018c5e9696a9b3feacfa2f881d82090df165a73ee0fa610ad86422123a9e1502ccf4b695be0"; + sha512.doc = "40a85407502116954024d51361dcbfdf36cac07aae382ada1f96d413f9b838ea5a11d7014722b5641a75b6c9bb8a5c6c134c8c0d424788f47f45fc80b277b3ca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +physics2 = { + revision = 69369; + shortdesc = "Macros for typesetting maths faster and more simply"; + stripPrefix = 0; + sha512.run = "1a598dac27ac5e1fa163493c307e48ff2e8c31d9c1c51a676a1b05bfde7af2a558fce4bf410a2c70837d128121331d6aaa393c6e7a84d8b98f9e271184e78a50"; + sha512.doc = "0627e9882b0ff31f2d6db46a9437c536c29aff39a1a1929784fe4bb16dde1a18aad351819d36a7578bc71664a4313c918623a87cbfaa36738b19ee9a9f4769c0"; + sha512.source = "3709f7455ffe7d21a1e5f04f08fb36edf1fdf9664c32aa942856248527fbb735dc6664b971bb2de961ac5fa1f8dee14a2ad06b39903e6ca83e639a18b71b01da"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +physunits = { + revision = 58728; + shortdesc = "Macros for commonly used physical units"; + stripPrefix = 0; + sha512.run = "96f700e6dd103f768383a78645cb32e363b83c459a0c764a77d127bbf2aa7c143105752ef9910a2d9d6e659547931b01a2bb0683b41d8870c0fd850d7e01de3f"; + sha512.doc = "e0a3fe337242d4da26153258f16dd8f71c2a704ed89fea8dc0f58b1fca7ecbf9fb168bc05adee988aca61883bf94272ec2f1ed841d99e47f0992b04f6c5bc371"; + sha512.source = "59ebd20b6658b4f4082e56dbb2017b4f63fbf9d7a61dc6c5b91a1da1be4794b1e555f2c6e68cb19ee6bd4c0e860eab77905eadd7fd4f72ea83f4b251bc8fae14"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +piano = { + revision = 21574; + shortdesc = "Typeset a basic 2-octave piano diagram"; + stripPrefix = 0; + sha512.run = "49c3b29f48211ac6ca04ef8f9df74cd3f4673a84e9d84c2a9b06bbc958abd640116673abd751be40adb470907bcf65a42756c22996f0adc4e2c0dbf3d6afeca4"; + sha512.doc = "50609a17b51de85d5f9df4da91c0c1c421a86ff222d08268fd0145e248eea740c68445724fee425a2adbdab85e0cf5b4a9bb4ee5cf3bfcb4a3d5cf4f1868df47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +picinpar = { + revision = 65097; + shortdesc = "Insert pictures into paragraphs"; + stripPrefix = 0; + sha512.run = "114b1e715384513f87f2a6772a6176ade44ac7053a8eb19410fb92862e721865dcc9350f08d77874296ae6402eb8d8da4b4b26ff4a96d035666814a3d3e21682"; + sha512.doc = "3b972c49a8c2ba7de3e21c065faef96125b2b275b25f7e8a35c72e28f27156414a558e290ed4b84d6ba49921a0c858867a0a7cfd5db87a501b3ac1a0ee6594a9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.3"; +}; +pict2e = { + revision = 56504; + shortdesc = "New implementation of picture commands"; + stripPrefix = 0; + sha512.run = "04c4fc0ea9647c0a434be2ba709f539392685233adc92da262fee4d081b6d31bfe88d8c537c19a102bc7200e2adffac4f7a4cbb3a7a47ca47c26e93e96772e6e"; + sha512.doc = "90fe6e6d6fce7d2a679bb511e2b0bbca2edc42f332886962aa227536558083897e1e3425b6c7efadaee6aa46d1e404ab5d4c18e21db52e723be8d4f0566eb5c5"; + sha512.source = "0c637f9979672267e73dd762b43c3339f41ed8965c12fff1141c757572ff7cef7d7f2d8faf50d855cd22a3810b9ead5318b6c20c3e5218f01fc32252f93d29e7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4b"; +}; +pictex = { + revision = 59551; + shortdesc = "Picture drawing macros for TeX and LaTeX"; + stripPrefix = 0; + sha512.run = "cca6216568bead5120ef39eb2743897ad97d285b55e7d9b0723b3f6c7fa94ab17cb8cecb946845aefc57eae3c69305de6d839feb9df8212be83d2c7f242c2fd4"; + sha512.doc = "e5bdad8dfdeaf3e3427d37b35641f37c8bb8005aea3773a914967a10b2583e1721fe0afeea0b8cb7f230edfa7b7d33c2d6fe023c229de4a27d6c979f6830088a"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.1b"; +}; +pictex2 = { + revision = 15878; + shortdesc = "Adds relative coordinates and improves the \plot command"; + stripPrefix = 0; + sha512.run = "26b608cc8409c62f4c0130cc032f2ca5929886fafb9d22d93aa23af5a6dee62bbde83926bccbcb4fbd3d86a43810d751eb43a2a94be9528e1639c59fb61e5446"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pictexsum = { + revision = 24965; + shortdesc = "A summary of PicTeX commands"; + stripPrefix = 0; + sha512.run = "a24861e4b6184084fffa783918db485e5c7cacf7a6528681e7d8d4212287f1f6687604bd4f347e9e34ab7d29867dec2b30c9871a13b9bedae31b5dbb82ba1ed2"; + sha512.doc = "148b7c29cb8189174442b95cd39b0d5fdf9f937a7a44a17314b93cce555cf3db459e21ae2c4eb9098c15551bd7aada2804855d68f9408fdbe974f6c12dd724a2"; + license = [ "free" ]; +}; +pictochrono = { + revision = 69865; + shortdesc = "Insert \"chronometer pictograms\" with a duration"; + stripPrefix = 0; + sha512.run = "3c6d73efad12ff4b3c10c1a09e36fb489a75998e556f6042db8f11dfd157cbb27a488eaa1f12f7c72de5d2ea5deff14cb8d2659b1d4618dd91e5bee84f72eb82"; + sha512.doc = "fe015528ac5b4c2f2f7f955d23372c1a3066e0569e50a9e38699e44c305d588727f0570c265c79aec82f8f8c02f6b671183426c3a58f6f1f339ca40415967b24"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +picture = { + revision = 54867; + shortdesc = "Dimens for picture macros"; + stripPrefix = 0; + sha512.run = "9dbb4e17b455a6a18bae6309864412b975d07a1a11e908e1023ab8e990ded0956ccf3826e72d9878f3597eaa4d185c8b147d2c7d2149618bdb0b09fce8e20e90"; + sha512.doc = "ce60fbc915b3c07db6ebf4bccbd0e2e8ed6f38fe0c07075af2c433b2bd7f82cd191c314ef3ae1fe9b4a02c2c27d75e97a5831c45b833a33373d545a977a162d8"; + sha512.source = "599ad9e192d2ee50b7037d93c3a8541014ada30c13a9a8b637ee33ee9dec476a46779b06a44f56288e6fc08b29408af30310fbf0ec951aef3a8b0d8dd776aa2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +piechartmp = { + revision = 19440; + shortdesc = "Draw pie-charts using MetaPost"; + stripPrefix = 0; + sha512.run = "e4ef7bdc43280c4311a6e8abf2719815196fb0ed0a8450501061e0b3b0bb44cd60947d6d623ff753c5ad1384d98219df695865e6459eef02b2b96f00906d023a"; + sha512.doc = "f74c3c34d37eabc3b5e857a90e8da2c6ffaa3b4a6974c6b1127f898fb727ff18f0f399e9c4ccde8d4d198bece0ea83fbbac37a1ba1d381576166b5a2742113c5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.0"; +}; +piff = { + revision = 21894; + shortdesc = "Macro tools by Mike Piff"; + stripPrefix = 0; + sha512.run = "79b804dfdbb12b8d2e854341062f2a149f9b0e061385a30650c39b877cce72d1af4ad1644d73fb3ca733a171aa61d1b533295818dc10a92eacbce2ca60722de7"; + sha512.doc = "ef9d14cf4a38315e4d523082db9baf8d0f89e5963001d12ba7ffe260ca2255a6aa99dc38392a6ceb0fe24e6abb8c77b9343f29300ff5c814c01adfff3321923c"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +pigpen = { + revision = 69687; + shortdesc = "A font for the pigpen (or masonic) cipher"; + stripPrefix = 0; + fontMaps = [ + "MixedMap pigpen.map" + ]; + sha512.run = "54e472281b1ad2f98b8f49df945fc89ea2e28bbec4088c15b4b73a411ad42936f408926a006e46656eb70b90172f39dec376b2eace6fd22923dd4881e1659618"; + sha512.doc = "94be29262f4d00ff65c1679029bc76b33ebc10051862cdbd4da08ef9802975378efda5c2b2cbf85877382d093bb408feda0d53d3458337bdff5239cc851c1dc6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +pinlabel = { + revision = 24769; + shortdesc = "A TeX labelling package"; + stripPrefix = 0; + sha512.run = "56ed76be6c634b3c1fd3f83e12304d0d0e078e027754ac7619d680d2072ac7b67c527a4d23dda8feb6496e3808b3414bec65a48d4750d44405fa4574f122880c"; + sha512.doc = "c56fad48b7cad065196cecdb64e501555d2a8f3ca098f001123215f8e21968cdec2da28f2a68f7e07ee9b1c2d961a82590aa136b15bdc87e9176462cd706b0a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pinoutikz = { + revision = 55966; + shortdesc = "Draw chip pinouts with TikZ"; + stripPrefix = 0; + sha512.run = "88ecb08a15725e4afbd296cc7eba16583cbe260989784e625eecf008441ac54ea53cba81801d77ab8439bc076c32d6c09d62305ef589d739ec1ed59e1f907755"; + sha512.doc = "9fb1acfa981b7d38b312d089be9b9d5dad22334960133377b06910cb0df39c8e556ca86d5f9b959b27ef4c7fc2211b97507b138f026df58d439fe3ae9fd3f420"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +pitex = { + revision = 24731; + shortdesc = "Documentation macros"; + stripPrefix = 0; + sha512.run = "dcc4280ef914ba66210ce471dc276042070b3246bc95ecb93b3d8af55393f49921a1d5e6851223299831344503dfc77fc2893f4cf1b78351dad40058979c20aa"; + sha512.doc = "c3765f6acd4a147ffd2c216b1cda58e5e6ac8dc1202b444fe80d0dd69449b01df3eb17069842ef745e76e88371bf71c178d06c5ad2bc85e3427726bb30b74002"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +piton = { + revision = 70446; + shortdesc = "Typeset Python listings with LPEG"; + stripPrefix = 0; + sha512.run = "c6bf65efaa6dbab5d75aa789df37c823a8b2bcaf28a42e476ee5cc7d36c5a3e830407bde7ac7c365e4dc31fb14b873e2e25aa94f7867fd73c6f8e16d25610f08"; + sha512.doc = "3b5d8305bc3fbab8e3805a9d7f9a5c76c6ea1d6cf45ce31a121c2071fb0de71d275acae3e2225e85aa78c3d24dda559b52842072e917d07788c25b08dedf9066"; + sha512.source = "db4ac567e3d6741a650ed8cf7098fde78a8a0d26225c485c9fbb954494f500d9304719a9f5f32f9277811923aa323e5970c4826a2177a8c0034f50752468f756"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6a"; +}; +pittetd = { + revision = 15878; + shortdesc = "Electronic Theses and Dissertations at Pitt"; + stripPrefix = 0; + sha512.run = "5bd78a90b4c7b9cfa8fbfad66e0de79d09762e06d3bb35a7aaa13ef8ba73aacaceafd8d5b5468de8fb59c6f4c76d364af145e101543c7ef2089dc9fe00e5e9db"; + sha512.doc = "e72d325fbfd3159699621fd703fd539259d1b13ae69d00e771291e156e3ce6cc15a0d7e4d2e74a3ad3492c39c67adfdca5491b68dd6e8ac78ac1213400f091fe"; + sha512.source = "fc1afca13fa1d4b6b0f77dcf693939be3d6423ebf15dc6354b955e1a02ea5655933470de740d0d626d718bd48b5f4dd1ed92263d8524d0ba38b2e4c328bbc135"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.618"; +}; +pixelart = { + revision = 66012; + shortdesc = "Draw pixel-art pictures"; + stripPrefix = 0; + sha512.run = "0643246fbed81ac008f675b9cff8d3194f8eed02937816c41887ad84268850cab50e5c6a7c8df5148f04cbb43c6ab80d5fa4d960d541b42f505f95f554fa0602"; + sha512.doc = "2823d82ac741954d19afcdf74a1b2071591a904183877ee54e8eb9a4dc2d63716f05bd1886691e87d36010fffb929e9d31aee05ec707a929a5fc74c01ed6077d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +pixelarttikz = { + revision = 68520; + shortdesc = "Work with PixelArts, with TikZ"; + stripPrefix = 0; + sha512.run = "c3aff99cc3027fc32f191f6a3329b397d23a11267e9fb89cec0bc5ceac875144375b3b16cdab42b471f16153cb75b21cb25cf38a74eb22c9ec0990f062245827"; + sha512.doc = "e06e2dd718c81822b0701390d8df193ce68d491138e75e929ea0c75881466b4e190cc52cbb58d69e2f3619b1f2ee4ce8489ceff9a35170256d02057cab6b9483"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.2"; +}; +pkfix = { + revision = 26032; + shortdesc = "Replace pk fonts in PostScript with Type 1 fonts"; + sha512.run = "b4d374e5b771e131075ec59ef6713c6433cc3cefb6331a933e791c3774a9d54d6c8427d70a4aadb2c6326c3733abdb562ca103f0b6a9dbcafd87856d20b18a24"; + sha512.doc = "c6819c63aa4cf7df5879a796e08299f2fa132e1244648d17a7fb0b3c28204b0641e56fe4661887c257ca4f5998786c31b1cae2aa64e3163340f08d02fda4c8d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +pkfix-helper = { + revision = 56061; + shortdesc = "Make PostScript files accessible to pkfix"; + sha512.run = "e5151d85d2db65f41b69320ad92611adcc8d211719aa06f39488ba75972f6bd4eda3a9ebd9f13e8889eb84451a640bbdbfd8862c95620304917cca3dcff4a194"; + sha512.doc = "50103799bbfc18a728b6510f9cd3d9aa4cbafaebb1e68f2f3280b3a57efbdbf75ff68f36e72b4442e49bbb04801795250fb3e2d0728968e30c1e70fc5b7d15d0"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +pkfix-helper.binfiles = [ + "pkfix-helper" +]; +pkfix.binfiles = [ + "pkfix" +]; +pkgloader = { + revision = 47486; + shortdesc = "Manage the options and loading order of other packages"; + stripPrefix = 0; + sha512.run = "2b9af06a79f484ce948b98d8ac09f3327a64e2299770ae6746d9762fc6b339d68aa3ad2abc5e67dc385bf4675cf406f170ef706fc101e87f6b58c839b6d3a3e2"; + sha512.doc = "231038d0af3e7293cec5b5e3a9835b1ddfcb60d5c8006009998e5a04638e0ff818ed36abcb2326a56149af0884297059577a3437e9bb144264cf42feed055cb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7.0"; +}; +pkuthss = { + revision = 70496; + shortdesc = "LaTeX template for dissertations in Peking University"; + stripPrefix = 0; + sha512.run = "ce10fdec461d1de90a7b3256db0c29c508427c4b21ae77ed7d08b75d3c95b46bea27c7ed869c1bc8828d40cba05ab84fd7288fa6ae553d786e1ee18e3c468b8e"; + sha512.doc = "7093f5e5d39576e9b57b08d528675d43460713050af48c77f9b7db78be74b16490dda55f1ab8fa425436d59f6428a3e244ee9490d22ca70eb141a68fe14835c2"; + hasRunfiles = true; + license = [ "lppl13c" "bsd3" "publicDomain" ]; + version = "1.9.4"; +}; +pl = { + revision = 58661; + shortdesc = "Polish extension of Computer Modern fonts"; + stripPrefix = 0; + fontMaps = [ + "MixedMap plother.map" + "MixedMap pltext.map" + ]; + sha512.run = "bb0d16d92272c6233284fbcd94864c381ce60343e5b9ac23a04871a515f36c18d5eca92e7ad4f80b1335348f62baa703671984db2c85d5a35d84f725f699db9a"; + sha512.doc = "efde952f17a904492b2c36e49801514b97ac5302b406beca7680a893051bc3821e70cdaad8d01dab479476298154c5ce2db99d43b04cf51cbcc5e16358c9b9f0"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.09a"; +}; +placeat = { + revision = 45145; + shortdesc = "Absolute content positioning"; + stripPrefix = 0; + sha512.run = "476dac5b149811659c663751478f9f224e209dd63954cb88baadcc94c70a4861673512e01c4a5f30097d242f56f1a6edbf4fc225f8b561e49a4e60b02020488e"; + sha512.doc = "0fc82d9b448c85eb3d77a7943b9243720f41894f062d9723b3dd56f2d3e9cd8fcb87a3d57f387f1c87b3ea132fee2e0e08962d9044aa7c756f0db979f4c06a3c"; + sha512.source = "c24fb52958d4bf39ea7925b1b68f2b2a5eea95c4c7bad8193d272111d6cc896b89e1b7ffd923a0e6fd9fd231dba3d1038a8730ae58b4ba059738da646e6b7bed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1d1"; +}; +placeins = { + revision = 19848; + shortdesc = "Control float placement"; + stripPrefix = 0; + sha512.run = "618eb33f1fce0b089fe111b083b0153c146e0d8abbcfc235a86dc6a698a2fad080f8ac38e04037e06b0e1e2782291ca6d01ae69922d181b26b4c809d6aba262a"; + sha512.doc = "2ac2312083ae8abd3fe3f85da7dc65032a4c6bed4d1778c058120b48292f459d1b77d40e4eb6f0afaf88a5160d4fb0eb7f353ba1d93b7ec672f054e58de4d6f5"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.2"; +}; +placeins-plain = { + revision = 15878; + shortdesc = "Insertions that keep their place"; + stripPrefix = 0; + sha512.run = "ba143fda432b8ff9f96d48218ea3b3d29308db3a403c64af5f4a89b8305ff835481d9e0e77bff92530207359115f6a44b006cc58bce99c0f7d3924d1134ef60b"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.0"; +}; +plain = { + revision = 57963; + shortdesc = "The Plain TeX format"; + stripPrefix = 0; + sha512.run = "0010ad47f363ddad3a0433fbc48f4e39950eddab3d08e2eaa6d5eacdc620265d45b09ca23c48f92ac8bedf222f98095c4f91d424a27ef0e8e50ed6d673780c57"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "3.141592653"; +}; +plain-doc = { + revision = 28424; + shortdesc = "A list of plain.tex cs names"; + stripPrefix = 0; + sha512.run = "bae58c957de52e1a45f91d8ea49579ea9c5b50b641331ae8d27146b6bbda1cf93e09abe58a011164ef99e5513cc32d346da7d693e975271e1892674aa5799406"; + sha512.doc = "03f17a65680e4fedd76abf2ec46dbac4b7871c3106c74d3d7c7f200bd6124146b2f78848a3761eaf63b2c909eb5925b78441d73a48a4437ef496b8643777d847"; + license = [ "publicDomain" ]; +}; +plainpkg = { + revision = 27765; + shortdesc = "A minimal method for making generic packages"; + stripPrefix = 0; + sha512.run = "aa1158f3958013b133dd3f9308063543268181296274a40e2ca606c8e684105e89b79cd9bb45d225e14865ca0e998e0412e8edf8057445bde549f249a6d69b2e"; + sha512.doc = "684b4f193f29336d5bd2c494c0c447cf0ac28090a156ae286437033e14507607582b3b9b40bc7b82fd92661a4bdd75f953e7c0b675f46418bb585b6a9492eaa1"; + sha512.source = "44138ffb31ad8f78b0ab917302f48f0bbea871ef390c52b211ac25dd9c16f0687f02348c96682d89c9fdb5586b157c9d6d4ab3f404f40ab173835997ffe7c237"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4a"; +}; +plainyr = { + revision = 52783; + shortdesc = "Plain bibliography style, sorted by year first"; + stripPrefix = 0; + sha512.run = "a42c5fc8c9a530f91d467ab3707fbec05f49764e85b906510f4605749c60bdda224a4ba23be85acd722f48b0958ed7184b4bfe88dc7c3fea4a64e70f9407afc6"; + hasRunfiles = true; + license = [ "free" ]; +}; +plantslabels = { + revision = 29803; + shortdesc = "Write labels for plants"; + stripPrefix = 0; + sha512.run = "7e1724b32035ee32325c491bce57ead23f40ad7377b4c1d5572499fef920b874bd57298e654429203cbea726b8d645a0899807547db80825be163538c1d91537"; + sha512.doc = "999f132df73c15a7b3501487f350e48777543745c5cddbbaf314bcb62eca9b3ba41b51324b61d04e9f1d9cef4b9b8ab851d3528f8893bb21e612a7f50511da65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +plantuml = { + revision = 67097; + shortdesc = "Support for rendering UML diagrams using PlantUML"; + stripPrefix = 0; + sha512.run = "97af8222b28309bd5d8ce5d083ab54bbf550b6327d463de8b481cf4a5f62c0c82b33718b5c95301204bfe8e4858039a0811f491d97c02079d723e66c3549c90b"; + sha512.doc = "b76c635cd30ad2638619b1ded721d468eec92033206cda03cbb638b14be082de1360efd2048f2cb1ac787a4c9232416cd18a82ad7b261ec785468ffdc003b86c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.2"; +}; +plari = { + revision = 15878; + shortdesc = "Typesetting stageplay scripts"; + stripPrefix = 0; + sha512.run = "86e91b884be131df6b4da6441a9fbeb872e0f345eed49005ef74d58eb3ef8a2724da98cc810a51b58d45047d77545ac6b9512612b5946ba29d443dd14bbdb263"; + sha512.doc = "befa46f8ef7c4c89e18339ececbd53341aa50d6bfc8927001d17395cba42db0f0ca3414619c746c78e4f5f4f9cb1f6db813defc7b89299f5b29e9c0866852c82"; + sha512.source = "e03c7b5fe7406c447509d4ae841c13c579c608564f45b83e1fddb066248b53e46f83a2760d745db1a5acae08dff493686d667f0328c9c3d467df6a92d8304a5a"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +plates = { + revision = 15878; + shortdesc = "Arrange for \"plates\" sections of documents"; + stripPrefix = 0; + sha512.run = "f662191f6a053585bbcf5a71635b6f63ee5d713086bd24f3c879f73868b5ab42b6434860b68408fcade7b7ba448845d1dd6a5be12b10bc25be8032b9dcef9615"; + sha512.doc = "12779b285951d5e3d7a0f9d3ded736d5368291b678fd884262908897c4e32bd5fdbdd6bb4eeea59bf922555d5dc8daf6b0e06a174fba2605d4357dcf1f09c6d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +platex = { + revision = 67315; + shortdesc = "pLaTeX2e and miscellaneous macros for pTeX"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "everyshi" + "firstaid" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-base-dev" + "latex-firstaid-dev" + "latex-fonts" + "ptex" + "ptex-fonts" + "tex-ini-files" + "unicode-data" + "uptex" + ]; + formats = [ + { + name = "platex"; + engine = "euptex"; + options = "*platex.ini"; + patterns = [ "language.dat" ]; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "ptex-fonts" "latex" ]; + } + { + name = "platex-dev"; + engine = "euptex"; + options = "*platex.ini"; + patterns = [ "language.dat" ]; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "ptex-fonts" "l3kernel" "latex-base-dev" "latex-firstaid-dev" ]; + } + ]; + sha512.run = "4a2682c51dc82e078ad14b30545dccd95f600ab02d5d05fb5c44c214221a3947562432783b43ea505b5199f37a1175a792c709282999f77b17b532d2a61c6e54"; + sha512.doc = "faf91bdbc3e0d2ba0b13a914d54fbc4ce47e27c1225e5412b78c1217b2e3f6c22886a9f6f85b06e5e3f38a8b0c7a9aaadb4606721799749ae6ef5018f7bb08bc"; + hasManpages = true; + sha512.source = "a1ba3fe817e5f4aa23c2c4c9b7397cdda6ecc889ee244a05fd7eeda59fba1baa02fd29820107c887982983b2115631f1aac7d19ae281f88779b3e99253b12036"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +platex-tools = { + revision = 66185; + shortdesc = "pLaTeX standard tools bundle"; + stripPrefix = 0; + sha512.run = "87646f8cd885b75c3e7dc0edebc32675afe2d02f87c37ebf6abda7b68256f002440fd1a94f3f13dffbd8a7b694f3813d4115621f931b9a3a9d73491bda7c4296"; + sha512.doc = "cf04b2c5d4df6d68bfdc3b0a3a8dc0f988cb0549252b3a6ccba58df685c41a9312197a63c97c3ff63c1ec15177a43d1e8064fd449054eed3df968fe213703552"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +platex.binfiles = [ + "platex" + "platex-dev" +]; +platexcheat = { + revision = 49557; + shortdesc = "A LaTeX cheat sheet, in Japanese"; + stripPrefix = 0; + sha512.run = "1409c7311eaa82811236d869b04e9f55fa2a96804faacef4820072a4813055e70ecce0e8c155ec19016f1ed4e57bebe0b362c5457d1258f317a40fc475d42aff"; + sha512.doc = "bfe47b947a915099de15e5519a3aff201b327c31d29c1966d4fd3e9b73581792d918b461ed1944aaf5e8a5eb7956c38579a3fd972f189b1e3abb903c7c904cbe"; + license = [ "mit" ]; + version = "3.1"; +}; +plautopatch = { + revision = 64072; + shortdesc = "Automated patches for pLaTeX/upLaTeX"; + stripPrefix = 0; + sha512.run = "1313cf815568dc385d5d1691bba7e57e246c45e71242acb94904ca0fe796940afb59bd3d07f728a9e407a9a0914b3890a7e7dc3c8bde3ddab7b36c3ed9ffcefd"; + sha512.doc = "e4bcfbe263cd17dcefdc239f06f1287ff8d936f0a6b5ea89f914d7a4254e08040c076be0317f4e3cf2aa96542878e1c93fd3ad5b9633f4c3c3d85ee9d719f4d2"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.9q"; +}; +play = { + revision = 15878; + shortdesc = "Typeset drama using LaTeX"; + stripPrefix = 0; + sha512.run = "040468367a783e7bc49dd4b51e22a72c41ff2985a52e2551b3be6780767e17c8d11178f097cc66f5683033eb03cc2ebc2c08c1f4477daa7b8f9e22d8a40dd385"; + sha512.doc = "97c882b12ab350c5b0fe066e04ea7c2c136b1dc7ca29e51d8f89ed695769c9ef1ed255c3c109ff71838bde91d25167a398230cd25809f1374ca306fbd9ae68fa"; + sha512.source = "3bf9b5449611ce72af26a68c99a7ea813c7eebce59336d5c7bf65da1a870e6c26238f803ba8e07ee2a084826e6bee7ec819a919e7abbbbf11946f611cab17a03"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +playcards = { + revision = 67342; + shortdesc = "A simple template for drawing playcards"; + stripPrefix = 0; + sha512.run = "3c7b076044328ceed3005de84d628d6d926f93c1d759982c2e37c8831093aa12c0dbff71f8b8bfdbd171dc545f313729c7c11086a3e529858086896bb64899f2"; + sha512.doc = "396118759c2f02c709ede5e6b4be042d2348cc38ce4783fd9f612a6bca887f9237f86662b8ce84a78a6abbedc8e2ce9e2c61be2f2c818e262c693149b7125019"; + hasRunfiles = true; + license = [ "lgpl3" ]; + version = "0.2.1"; +}; +playfair = { + revision = 64857; + shortdesc = "Playfair Display fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map PlayfairDisplay.map" + ]; + sha512.run = "2c75ccda034c607fa67993922e498347cf8a708c31360ac63d8304ebcf538e2012529864c6c3102a63b0320db68101fddae021ec396efaf0396d4d609cd0d711"; + sha512.doc = "006319162a3a7035955064d7ab99e704bf828cc7441a9c930cfccf4cb7e70ac52ff672de3ce8b415fbfb20f29a0b4c09703fe0e3715d15e38c1293973bd3a86a"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +plex = { + revision = 69154; + shortdesc = "Support for IBM Plex fonts"; + stripPrefix = 0; + fontMaps = [ + "Map plex.map" + ]; + sha512.run = "4180d4b5ff2d6843ac375a52bc3c63570638cc29f7d3bbda476dee962998293ce4b201817e056d5e87c20bd8280336b65bc689a8e1580ab8aa6f24164002732c"; + sha512.doc = "175abcc07f213d5837070171b7fc483aec2c26b80f530ca7ad7a6f571de028c833e32d71a4c465fbfbb803afcba934e68df560944b8b54b20827d31cd21fa9f0"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +plex-otf = { + revision = 68238; + shortdesc = "Support for the OpenType font IBM Plex"; + stripPrefix = 0; + sha512.run = "1dadbb3073ccdf40e496f89cdbd31af8ef37e810178eeb7aee49e9c1abdef42f28e58bf12988a59b9aee95384de842cae8a827e8ad8968c7ef37e8442e596d21"; + sha512.doc = "226ddb9c201dabf158e0e9a5480995539d20d14ef34f5ea9498f9fe5966a1f7eaed00e1bac62fe17eeb710d0d3f68f9397fa568ee1a91076552130661dd6e3f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.08a"; +}; +plimsoll = { + revision = 56605; + shortdesc = "Fonts with the Plimsoll symbol and LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map plimsoll.map" + ]; + sha512.run = "c0b44cf022ca470767d296af1ad80b2d5ede92adb22635f7ef34b9fa81ec523f769dfbfa6a78005a46bd9a4886507fa7b3a4f761bcb8f686dbf736e3ad92676e"; + sha512.doc = "9ee880e89387986e228f357f59981b18fa8565d60e88d6f1b15c4109f9f7f20108c447fb995f0edaf64723ac37635b56cb5d097e93e0374a0f64adda4215eed5"; + sha512.source = "2967c9b53daaeba02405da837050a53c69b725da8daeba1d6a9c58dbef0387628aa6dceb07815c5bb0d2cc37c6a1b66f5c64037ad33d74e1179dc3fc0f0431a5"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1"; +}; +plipsum = { + revision = 30353; + shortdesc = "'Lorem ipsum' for Plain TeX developers"; + stripPrefix = 0; + sha512.run = "203b9cf56acbc53b2a3c195ba0a27728c93db91bd4be48441e61967fd0488cbc4ef96485ff0b567be64ddba798bb44308cb7cfabd2a2ac89d294203d93ff4d29"; + sha512.doc = "6d5c77102abf42304f8480f74a073ba25b8cf317c3a6cf4c22af6035b17b07ac213866a10ead2a53d033b214e4a6d6e642d043d847e61fb165aa8a02ef90f7b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.3"; +}; +plnfss = { + revision = 15878; + shortdesc = "Font selection for Plain TeX"; + stripPrefix = 0; + sha512.run = "0ae352953c5981b791379d9da9b61ad8837c22053f3371f351152078f4dce6b12615ed771987115cc094613ddeb0c275568e1d7404f321516418d218d9c68473"; + sha512.doc = "9569a4f77dead68ad8c76794f03e6ffe147e1801324291fc13487b05051fcb7f307971e65edf66024c169411cee9b2940eb4daac4d073773e67f2f303b364870"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +plstmary = { + revision = 31088; + shortdesc = "St. Mary's Road font support for plain TeX"; + stripPrefix = 0; + sha512.run = "72d54627fd8a10215ae9fe417423c46240997f865da8b4f4b976290ded7fbb0360477db27f140bed0ceb4dfc57c42a23fe5ce780ec5eeebb9b3e30b372adfe9e"; + sha512.doc = "6e5c425b7d484bbe187eef030fbc9d6a0ad50d6d8e22c5f08d3762cf8082b434de8a4c5d13251d90a016715c9a85aa82dd2637abb6e17a6973a08514baeef7fd"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.5c"; +}; +plweb = { + revision = 15878; + shortdesc = "Literate Programming for Prolog with LaTeX"; + stripPrefix = 0; + sha512.run = "1899a3498d10950f67d24d2d7bf0488cd8867bd862960fa892581137bb1fb3426dea9e193f8993ffa93df11684dbd1f25bc79a98489317998936ab4186e9a22d"; + sha512.doc = "9a510c4fd534c9451863a47fb8fa3911cf5199b295b1e3e2739cfc37ca0351d28fa1876e5456cf05ac7cc05f9f60761578ba6d77841ca575908cf4f0c9f0e3bd"; + sha512.source = "09039cddf52bb2080fa6f9dad964f267e43d04504dde81e010727f4957a4de0225b0e23c1cd9ce7222ee1ddbf0d6f1ed1405d0405cb849adda77d99086402d1f"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.0"; +}; +pm-isomath = { + revision = 60368; + shortdesc = "Poor man ISO math for pdfLaTeX users"; + stripPrefix = 0; + sha512.run = "89e11156c2a4b7d05fc3404b4badcbac94ed190db4c215e573c84cdbc8fd46c5775b19272e423df1806e8a38d61d8c071aca7d38380637c79f06c411a05ee468"; + sha512.doc = "92366bb3963f1615de3cba205345d5d799fac04bf4935574868be140109756fe9a9a2d7cf7a685918018919ae2350e9ff717cd898fc0404205f21d56a359ebd0"; + sha512.source = "fac0256323bf26f55e5908c718b8622f4996b2b792ec3770b1db4a31d91ccba84a8e21e839710e1d6305448044c5140fc38a4eab06954783e428dd94008d2fc4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.00"; +}; +pmboxdraw = { + revision = 53046; + shortdesc = "Poor man's box drawing characters"; + stripPrefix = 0; + sha512.run = "d229b15e57fa76a9e8e9b903b5fbbb99d81d3c8a2b1818d71c103df7f2a1e9bcf79aa8396b6ab7a2ce054371d212375b968a4a5d572fa8686223baa8dccf4eff"; + sha512.doc = "42a439f2f88235faf7302400432d49166861476cdc43708f84780d153bdcbcb55dea1a6b31cde2045d0b99d48c2a4f51ddae8bdee08937308c5de02e9b16a523"; + sha512.source = "77220cba1cb61836f0be161566d1f177f2c503901b0fd4c0052dae81b457f59364596eaa4a32071b5c90623509f646ef3140f67e29a558b4910beb3a1d63cca6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +pmdraw = { + revision = 69366; + shortdesc = "Draw elements of partition monoids"; + stripPrefix = 0; + sha512.run = "ab2b72364f2833ec7362d7284bfc10033e72c3f20c1b4f6ff7a89a8368bebd5aea2120c5cb82c27bf924fc1342030d83e61a8b4b0343aacadd09247890495325"; + sha512.doc = "60a9292a2705281b8f32a2789b34e0dbc46cd8d475d7c946e00e8f0951b5cdd5a29cc145e0cc270ed87b52a23f819552081fd78f99fcd529aea57027d4d71b23"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pmgraph = { + revision = 15878; + shortdesc = "\"Poor man's\" graphics"; + stripPrefix = 0; + sha512.run = "b6e9f00789ad102b6cdcfb0fe48e5ca4f6976a7c207088c0c3e8b0c2d4fa376bbb932500d42133571a6e18747615c77eb6df2b4872ba86f853e3069ef198a671"; + sha512.doc = "35f45f43c95264d4dbac5d12a71270fd15280f9008d204e12ab0a3bc6a62939e6de87233c94eeb7cf9627464d5f383c3d8c2cdeaed6eed9473a3e5fe380cc5e7"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +pmhanguljamo = { + revision = 66361; + shortdesc = "Poor man's Hangul Jamo input method"; + stripPrefix = 0; + sha512.run = "099517421e9590597157121de5d53eccaae0784969288762ebd8e35a31eb12ce6d5466f890204bbb69d0d9c805c314b6a475653a1cb26ef270672683e2625a24"; + sha512.doc = "12f324ea6c852b134868f4365a53c2f434adac235d01efdbdad0d5df138587acb28fa7324e10f5fc996c44f43289322bdbaf764107cea4e66d7f999b71807384"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +pmx = { + revision = 65926; + shortdesc = "Preprocessor for MusiXTeX"; + sha512.run = "433287732fbb2cb47886c6c78c923d5b6a1b5c1e71e3990084cde9bb288a282fff7fb9134a5165e0fc0908b8e60547e23cb900bc82b99717133d7600fa17dc31"; + sha512.doc = "dedba4570b68a8628442716dc3a9b1699e5f531aef2737e4b3f47862a91ba69bda91d6fe6692914d2bd7b8fe3188a83fdfce8bdd219ab7c4f238a9c6ec273ffb"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "3.00"; +}; +pmx.binfiles = [ + "pmxab" + "scor2prt" +]; +pmxchords = { + revision = 39249; + shortdesc = "Produce chord information to go with pmx output"; + sha512.run = "0a8f4a88834eb22d3f11ca567f37189af7834370530c6dbca4d83482e94cfb48b128bc1290e7f3ee718bffb4df445a300ddf5081805f88002f53bcf8b434bb3c"; + sha512.doc = "d4075306620fa1ce037a37b9d2646d197348f6482e1286ff6fd99641a8b441b3d830a1420dbf6c025b8d11af78363b717a1acc7ea6b9e2954aa4f11ef04452ad"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl2Only" ]; + version = "2.0.2"; +}; +pmxchords.binfiles = [ + "pmxchords" +]; +pnas2009 = { + revision = 16287; + shortdesc = "BibTeX style for PNAS (newer version)"; + stripPrefix = 0; + sha512.run = "5e20303db90b2db63a3d6026db582026df8b9e910942303c952753d5dc27928ec70a8dc21edaf44cd57e04d25e93a87a5f28caa769a0425b47c78ea9d56ffa86"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +poemscol = { + revision = 56082; + shortdesc = "Typesetting Critical Editions of Poetry"; + stripPrefix = 0; + sha512.run = "e9bba80cd6fcd7b1e7b0e46fe594b3e25986dac5fe39d329ed4b8e15bc6b542e033a392abcad4e0c67d5401066703a1a89658ebc612d2adcf846de81b34fb78f"; + sha512.doc = "e8e3ffc366be12ec5273c85a352a6c44ee22af072fdc9e63db390c0d3435e390c28ca83279a1a54f95af991890b7e47ba896612407ed605e229ec184cb1e5096"; + sha512.source = "cbb9340d8241dc8616f997dd962fb913ac6d8d46241c55e37bd30fbea12cbe8f331d07268653c9100928b92a171245489685761e091b6d3e2b6be6558779b683"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1415926"; +}; +poetry = { + revision = 53129; + shortdesc = "Facilities for typesetting poetry and poetical structure"; + stripPrefix = 0; + sha512.run = "1f618b339fecd44d21029ff9ecfb95a97e47fd5d20089a2115d70c8336738c794e1c639c78a16b5756d591fbe3ad52576e3923f6f86245fcc9f7501008382eb6"; + sha512.doc = "540a209251cebb31bdc87143fc8b60627a9296f488f58a81faaefb3c3cb66517e8a670e81b4363840cfa1220697d26517fc1bebedf43f62a4f1c18e3e14a8d65"; + sha512.source = "59132d5d5deb62236ebdb4ec0335f3557cb4a99d4a5871ec40669801338f5f1b72fe3023a09160feabe2e0e1d2e1a78c8b803dc4d21c63cd3efafd4040224f9d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +poetrytex = { + revision = 68353; + shortdesc = "Typeset anthologies of poetry"; + stripPrefix = 0; + sha512.run = "f56937e0c18fcc1db0872ed27d3ab9497e42186552f5eb26015f7c28f1d38091544212767de088e8d94f6d1e15a5ab973bb1b4960f8d4633964ad9aa295e3b87"; + sha512.doc = "3db45607b5d95695c3f54ab924912c39ed3c06d956374039656d2a2d3c25d1261541124d7a89ba05cf935ddc4b36b7cbf4c907d02a6b774748ae96d032b30d4b"; + sha512.source = "8c43393c86bbd430b0e98695dcecf110a08c5f35f152c56aaf8fce946467803810ca87a3b81fea10302b5dd079d817e4874440c069fb466a2773a7c086af40d1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0.1"; +}; +poiretone = { + revision = 64856; + shortdesc = "PoiretOne family of fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map PoiretOne.map" + ]; + sha512.run = "07e1479df1d89b568388a855236d997580cb76ca6ea8f45b55622425d10584037cec5e17a734c24a0eb0a9746966e94137026c37d4696b475e641806d07a7ef5"; + sha512.doc = "c164f53258e08e74cade46f03f1e6d3d538a0f65cf3086629150c2741488bd33a82fca89d91bcbb83045d126defc3ee9493fc5e1d05e2c567464d4d29afc0cd9"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +polexpr = { + revision = 63337; + shortdesc = "A parser for polynomial expressions"; + stripPrefix = 0; + sha512.run = "4d04a0a61b5f50c61eef41360aaec305b727e6d8686e8ef1742098a7980a6508e3455a8282a9cb0b4549d7dcd49cf065c49bbb7e710ca5120cb32567fd58fb8b"; + sha512.doc = "d2477a275477b6e47461e769fbf43abfc746769582cc916eab153fb7ee19e85285561601169dea0335d0c525b79c5435ee2d44ba931739eb9d903a3f2e3b670f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.7a"; +}; +polski = { + revision = 60322; + shortdesc = "Typeset Polish documents with LaTeX and Polish fonts"; + stripPrefix = 0; + deps = [ + "hyphen-polish" + "pl" + ]; + sha512.run = "24bdb98990f66e89085056e6ad3e0930dd16d0f4bbd07a2c9a49931796e143505276d2025fee21b2b52d927c3b2992d31f4edae4668cdb549f6f00ef43dc1c69"; + sha512.doc = "755e7625d5ee1e4457e7ee518469d585c9c1e566c57bf147c62195555ae91dadb68f469127cb18a7c30cda1468129db09cb09b1974f5273d41c9491a6e1d5ffc"; + sha512.source = "8e216956a95df02134cf411d170a75309c3f167a5bf7d78f77c4e47950c8a5da52e523e367f5ce60492fc0ab7cb205e9b57835b883225752731ca094d7c507b8"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3.6"; +}; +poltawski = { + revision = 67718; + shortdesc = "Antykwa Poltawskiego Family of Fonts"; + stripPrefix = 0; + fontMaps = [ + "Map ap.map" + ]; + sha512.run = "620708dd3f1d2d8b2601377486631c2bdc779d06d2016e1c9ab5869afe00cb88dcb1ebd055b6859ad3e3dd25200c1079b723613283f048c7cd7354977b66b8b9"; + sha512.doc = "51067d3e930f9cae71d5cdf11d6ac83738e23539c020c93e6f4d8b460e63b04e77caaa41927ed8658056d96ff4fdcfc087e591be991e10c7e95a6b58d56ee368"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "1.101"; +}; +polyglossia = { + revision = 70496; + shortdesc = "An alternative to babel for XeLaTeX and LuaLaTeX"; + stripPrefix = 0; + deps = [ + "etoolbox" + "filehook" + "fontspec" + "iftex" + "makecmds" + "xkeyval" + ]; + sha512.run = "d34cfbeffd1cb2eaeef0d7d625a1f1ef7e2835e93eb88a53b2d44f21562c76cab82e1f5637ebf05b25c0fd0b56738ef7946bf7f9607766ca57a7658f98cb2647"; + sha512.doc = "f59aee2cdfd6ba067e4ef5c20503cdd9317ab854ae35b0a04044b94116d4fea9fd6b839bd4f33af934b207f1c660e126c223477cc57b7a1ad81db54bda2507d5"; + sha512.source = "cd285a93795e6b0861eb6e930384c836c83463cb2c4806dcdfff2966f23cd28604bc113b48916332d60ddd7cf2e747ece902b7040c41ff3d95b9eb99b0c9ea56"; + hasRunfiles = true; + license = [ "mit" "lppl13c" "cc0" ]; + version = "2.1"; +}; +polyhedra = { + revision = 68770; + shortdesc = "A TikZ package for drawing polyhedra"; + stripPrefix = 0; + sha512.run = "26169961ab8e21114a4c44470da03fa510822b495f36afaad745c0324d45d5bd64e4e5587b7601fbb97156ba02ff18a2c253e175296f15f2fb3915f7bc15e060"; + sha512.doc = "6a083101ebef3810467cfe377a820ff178e752c62655462153c661222da3c75034a1735a4a39d76e963fc6773441df423444d40e040f39d73dccb5adc6fbc34b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +polynom = { + revision = 44832; + shortdesc = "Macros for manipulating polynomials"; + stripPrefix = 0; + sha512.run = "bbff103f5828757f9c58c768ba46dcd9197629273b12d997e80e299dc1cf6a34e851fa4ebe088d131781eb6efc1fbd39cab602ba23b791c68fdb0e12f69440aa"; + sha512.doc = "b0fdee90082414d88469ba5067f1c16279ddfc8c13627098bb3c2adfaded3c355cbb161193160fc5b9682d45a10216c56fe2613855528f9f4965479c681e6355"; + sha512.source = "cf9dc9f13290bfd84e2956630eed115a132bcedfd34e6da076b2fa0fd4840fc5fabaf995b44f2a8f3c3d9ba9de851683a306271b272a83331a92fac367d82a57"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.19"; +}; +polynomial = { + revision = 15878; + shortdesc = "Typeset (univariate) polynomials"; + stripPrefix = 0; + sha512.run = "46324509f078d9e83f4d94893454061636fd1148d5a2e9b59af640f617d82ba1d7397c7f7bb68ac99a83945354c875d3f29853e5ba38da59a2812f5f45ccacb1"; + sha512.doc = "b570f3abf21a480e0bce2c08e44d97b488e9a0758d712cfde3ccbc45348eb95486c121662e296049220dd2802edb387651e839c2a819058111a2839049fc5964"; + sha512.source = "db4c1d698b2a096ce6c848922beb747f70a874914d4ad1a468080c55ac0afbd89330c0665006f787c32c6c444ab601c64e7173ce9a5bd9241c1ba71582c0ea0f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +polytable = { + revision = 55837; + shortdesc = "Tabular-like environments with named columns"; + stripPrefix = 0; + sha512.run = "2ff55bb460357dc11b274ad3233e5ddd67fbfe05e60d25bcc69f1d06f9b0f247831cb5db4123b7ff859dfa88bd56fd5bdfc24aa992e98f5a17d0f883b40fcd2e"; + sha512.doc = "5bdc4a4c8f95255343fccb6db79da434a6b883e0e2a769eac5c8accbb6343d3f5b8de2fd465c5e229ca0ac3e9964fbd96c50062440970921ebf70f01a3097943"; + sha512.source = "dc5c2c007012a4a57a20b569adf784afef0db7b22ae88ac91f54bcab5f8a25a3dbde48a118ff5090d806d42954ea28276ed2adbddfd974972012a645805d9fc3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.6"; +}; +poormanlog = { + revision = 63400; + shortdesc = "Logarithms and powers with (almost) 9 digits"; + stripPrefix = 0; + sha512.run = "e67561e7818e8ff9e02a43c02b8b992a26bef477176ce36eebaea37f56ea182bc9bedcfa56ffd8581b5d696698718d87f5319ac93d79032c4c27780ceb964851"; + sha512.doc = "7d99c4036411bd892bc0a520a42c5e2a1c1077c89e58e1be8a9fc991b87da3d22871e75669c814358701d17add447a7e6546a33a8ada55f55ce0814296273f91"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07"; +}; +postage = { + revision = 55920; + shortdesc = "Stamp letters with >>Deutsche Post<<'s service >>Internetmarke<<"; + stripPrefix = 0; + sha512.run = "1b7ebc9b82ae1dc0a642892b6d74ef94ff0810ff3dda1628f741244dd17dc8d5013b42e2369c1dd6c27e65b965a1482814c62eaef582cd3bcb4c945fe0aa76da"; + sha512.doc = "5f0d2dc0a4986509862b17af55f590f110b3dbdc697ed4cc704d31215945e224a0029087e04cc8602b059455447fa9214bede0aa63509958972c9dbe2cc4a0e9"; + sha512.source = "68d0ae1488f2288b7b5ae3aba79ca877ce6f97e1134e61859a81c77bbed47c9b79d3eae07a6ce0bb5fb3645078fc67d2c6cd4a5baaad1460e09b4b34d3d597a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +postcards = { + revision = 21641; + shortdesc = "Facilitates mass-mailing of postcards (junkmail)"; + stripPrefix = 0; + sha512.run = "0e358697b47ee74afb9fb6bd339ea4a76457c78a76a37de6039ac44cd9ce1fc28a3866c42d988ccebf025d0e08c4c092a2b647cce4841662242f740f12297338"; + sha512.doc = "936c1f923bea76aa323d2c8ce9949cea3364eeb1a145e735ff5bdf609de4c54cc78125392e9e3cc914180815bb9dd5bae63e50c0000b2143fe7de94c199bc50e"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +poster-mac = { + revision = 18305; + shortdesc = "Make posters and banners with TeX"; + stripPrefix = 0; + sha512.run = "f685c2c6d7d2795cf80702c0f8b4da6661a6d076dfbefeeeb071f21ffebd4420c7777681e550ed8ce05726a4392f526da42cecd6e3f26b5dc8ba775494589297"; + sha512.doc = "d06f06a4432638ce7780923818cbe638edbb21f836566fb984353aff0bbfbe0905adfa39cc69fc59c87c9e6f7f2c3c268b7f2ef9a55a0f0a2bf0b5212d9e2124"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +postit = { + revision = 67344; + shortdesc = "A LaTeX package for displaying Post-it notes"; + stripPrefix = 0; + sha512.run = "cb825667ddd1379b07870c388915abf36efa1249036795d3cd5ed7f41a87c046c00c7e292e542dad6a8b3b3090f327c5cff5e173220d49cc829f0fe206676aae"; + sha512.doc = "2754e847a190afa3ac22166365a0ea12557d939fe4d2f06dc0c34a518da82dfbf7ab33c8ab1ddea5d3d95dae13c013f238abcabcf6444d956393fe61b00f4a6d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.3"; +}; +postnotes = { + revision = 69102; + shortdesc = "Endnotes for LaTeX"; + stripPrefix = 0; + sha512.run = "a2b8a54ad8062e550af61a6f51d816d11891976525aeedc5267923665ea63967a388bde67dd2ad537b2c4d8fc3ffc738f05064d2fd26b0fbf7328eb806dfc0c0"; + sha512.doc = "28537fd0437da707dfaa5dde2fdc92d11d4de5bdf99e8fc7655cc60533d8ed5bd5b9e1d680f0269b2d60e498fee577a3b069957c6a5ba41fc55dfc1631297853"; + sha512.source = "b3050fd301f1a332622912a082dfffbb8ec4d172d4e7a808491f84b2ce7e494d16756a5ac7412cc5d1590d6a0f1ea5ec5a20bb7abb61b051e9f4a5179351d39d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.8"; +}; +powerdot = { + revision = 59272; + shortdesc = "A presentation class"; + stripPrefix = 0; + sha512.run = "c8ab1d65e2ac0695cac0e8a0a683fe712ba51e8aa028316901e1ab6e31b0be68348066fcf290b03321c0bacbf5c0b16265b28022ef38137a3d89bd25aac58dd7"; + sha512.doc = "99e602f4f96d6b805a8cb255d72f49c62e75543df2348471e31952a2588125724dfac07cd82865e9559220ef98a7b8847ab9ebd1ab803d5e155804f3669abe3b"; + sha512.source = "cc32d07b304d6214fca1244823154290c68131111c2144592fb1b4134c59dcd0ab110542bcb64e7462c6959bff1bc9d1e2706bea66b0bed2abfde9c80255af4a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +powerdot-fuberlin = { + revision = 52922; + shortdesc = "Powerdot, using the style of FU Berlin"; + stripPrefix = 0; + sha512.run = "73026a8e853bb9141ef3d8915768ca07a9f5caba4e810cf08ab2f41b8c6ee42071065e347ecdc1da070686765591d5cca02a372bd256fc1f9871547a7e1657a2"; + sha512.doc = "f2011b2d9362cdd1006714e71c3178b279cf764dc82f10ac31370d197de98a5131dec0c64bc17d4746a554396687e115e6880ae6940d902b34dbd91aa75ba308"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02a"; +}; +powerdot-tuliplab = { + revision = 47963; + shortdesc = "A style package for Powerdot to provide the design of TULIP Lab"; + stripPrefix = 0; + sha512.run = "91a8008d0675ea36676682d741ffad1e2f842ae37b47da628bade8391b2c775d7a756d31d5169e087ca0c4c0b0e958a2bb34d5143f905439e9572a6e72c4dbf2"; + sha512.doc = "5805d79f125ad94bc0818f52d31e14d786f4f032e03a89a0ec8ae69433d56654b6acc864563e3273664576a59880bf86de81756f76cf9b920a21ca8331ce117c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +ppmcheckpdf = { + revision = 69527; + shortdesc = "Convert PDF to PNG and compare PNG files after l3build"; + stripPrefix = 0; + sha512.run = "9c6612db37dafa8ab2771e42443f528806542b0c949b67adc861440bbcc85492a726524f543406daadde3d66d20bd32eb521cb96c719f948732c3a84e4702d7e"; + sha512.doc = "5bf1e2df2c702a3b447787cfdc77b243578f6c59ea4c46ac352628dc647e55da9837375d5d960e17d8baf3d1fe538abb81cd33f08e6b0f501159be8f84131ef5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024B"; +}; +ppr-prv = { + revision = 15878; + shortdesc = "Prosper preview"; + stripPrefix = 0; + sha512.run = "4bbd2404d9cb4bee9de81d463a6f4966e28409b07aa744e155f398f07e513dac4ad262fb3ac81717dafc9dd9abaed2789c08d0cbf0ce29137739886b2ad1dc74"; + sha512.doc = "b8228988551d32a5d5b3ddfc59dde6af1f48aece8f5c0f8889fbe479db6c962d77b687fb5593079796393a255350dfc90965fac07e241d4f0a48027927065e67"; + sha512.source = "cccb93596677625d323b0ceb6743fab15c4300f3baf09846054aae249608f61ab2a0a5bcfd9a7baa2b3a9ec86b2fb90aaee284608bb908229a918436c9acd772"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13c"; +}; +ppt-slides = { + revision = 69568; + shortdesc = "Good-looking slide decks a la PowerPoint (PPT)"; + stripPrefix = 0; + deps = [ + "crumbs" + "enumitem" + "hyperref" + "pagecolor" + "pgf" + "pgfopts" + "qrcode" + "seqsplit" + "tikzpagenodes" + "tools" + "varwidth" + "xcolor" + ]; + sha512.run = "9206d0b59cb501b129ffcca39639593317d2941ba1a982d036296800ce9486bebbf87d0194b43ca811365044a9dc8d27ad59169b2e187d229511db4b08b878f7"; + sha512.doc = "4565f7aadae38518e2e5f68fd9994670a62b492c2e57344cbeaff4a60d601bd95da23f0c5a74c98507f5023d87d24c73199bcda6fbf7cbae6719951debe7ec77"; + sha512.source = "2a7bf0d2b9229678565ccdce5c8d01fafd07cc5bc3b2000add41e027ecff7a38149bee9bb04d841dfe0e9993e91c0b9456bd5039c2479b775e4710169540bde0"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.3.2"; +}; +pracjourn = { + revision = 61719; + shortdesc = "Typeset articles for PracTeX"; + stripPrefix = 0; + sha512.run = "ad416756dca8491f2920d13b8374157bf1b49f236cf2ce1f66d6415c8de7282801645f5cedc31f2652304b1133f787a32ca4afa9f0e65a8bd5cbde956e54b82d"; + sha512.doc = "2cc3efac5b128bc6873034fc451124cbb9d6c4040d9d1c1053367aa99d57687eff642cc55a52d833732cfe88c5e139c67998020ae220a1657744140745ffec30"; + sha512.source = "819dcb9329ec553889d50646b7ac4ec52e2d82b329ad48d6b1dd391a7f575115c49c317497ebd32237c3925741cc6f7d497851bc5fd938d3f8e7341a05150d21"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.4n"; +}; +practicalreports = { + revision = 52312; + shortdesc = "Some macros for writing practical reports"; + stripPrefix = 0; + sha512.run = "71b180b863f5405c145fde98bcae5942ed186de52654dabda4ef1a859ea292e6c2e6f1a29fa4c4320f2f9a442699844d4268fddf0200281c0f1a7477b49d9f5b"; + sha512.doc = "48159a00f0c64c6a05e56d9c01b1e7c1fcc8342df3f762775c33377d45b0621e0e933db3097a5d489ddefeed1e0c155893e99ebf98c98fdd11df9b33e05e113c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.3"; +}; +precattl = { + revision = 63967; + shortdesc = "Prepare special catcodes from token list"; + stripPrefix = 0; + sha512.run = "35ce5ceaa53d3edc0fa92c8d9e5979255fa94bfa6818f8100b29f6fddda22f947c0fd2899efa5b4c72bb124fa5edd4f25b512460e7d370068eeff3d0ae0cfd2d"; + sha512.doc = "869b3ccb9aa47107b759fbaab3980168332d51eb07e4fc77f5fa31056f1260e5d89ed54e4a3329afeb828445dec17e43df899358e7880ebe364705006a3571ab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.0"; +}; +prelim2e = { + revision = 57000; + shortdesc = "Allows the marking of preliminary versions of a document"; + stripPrefix = 0; + sha512.run = "9f9fa79056db5be108c3b34b2ad61d964ba35fc1b6f7e9375c9e2ccbf66cd2028ef9e6689751c90c9ca236719ed1a001ae26753305fa3454bd88650cb12ae82c"; + sha512.doc = "196640bfbf73f3f269f5b27f024f4c1e677b61b6cc452d796f025196786c166f60bd2f41ad83ac6cc6b9eca56778a07b77af05fc68f05330f14c92cf391bbbc2"; + sha512.source = "1f2629a45183a026fe7bb3c83baa96ccf437846f902b5075fc210e47b6e3b99e81e5983bdcf617ba7bcdea60851154cb70bee3abe227420b5cc3c5a65e631973"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.00"; +}; +preprint = { + revision = 30447; + shortdesc = "A bundle of packages provided \"as is\""; + stripPrefix = 0; + sha512.run = "66ef40f1f9bc1ef3348923e781ad92dd0174b9c45e16c97662f30971a449dd74580391e1f23fed031a41995e65ff90a6785328de0372cea53e3ce946da469d60"; + sha512.doc = "b5e5fa40832249c5a0faa24c26e8b3a2a73036ef007dd3a61adb6a7989926c80e018fba52a66078c3d7b39e76901cc041ebcb9985ff29b53ade2c057abaf1376"; + sha512.source = "a7fe23d21dfee4071285ac0ca77a0b8936e8c149b804e9fc19e42cb5fa5eeac23ef3ed59e0433a965ec6203a1b031d2a76975248e624a6452e8fe6ea016be1c9"; + hasRunfiles = true; + license = [ "free" ]; + version = "2011"; +}; +prerex = { + revision = 54512; + shortdesc = "Interactive editor and macro support for prerequisite charts"; + stripPrefix = 0; + sha512.run = "4238f65f9ef42d218f092bc436fbbe95ddcbcee44a9032b74020a989696db3ce1481460162171f5feeb16f7507a41643443429afb8000d5bea0d7bf16e8dee96"; + sha512.doc = "af17b95e20638fecfe6d431cc320b6d3207dd739779636206899d7bf39c26018718521dabf76adab33db28f975e99d2b2dcd9b13a164dc24927d2017e947bdba"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; +}; +present = { + revision = 50048; + shortdesc = "Presentations with Plain TeX"; + stripPrefix = 0; + sha512.run = "b22c0bb6803ebed5cd26aca4a9b55f2c7b506cc7e8910346a07437d60007310a3d2e3549040ffb2616df7f173279342f2334100aab14b589d0cc9e710ea89369"; + sha512.doc = "e43a5de9c4bcf9281416963a898e350ba0a0b2d1cad92cbc97d99e2ee9d25f8407a09f024ec5d03a43fd3eee58e1c40bf99ebfff13913bbf85465588b4cf9710"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2.1"; +}; +pressrelease = { + revision = 35147; + shortdesc = "A class for typesetting press releases"; + stripPrefix = 0; + sha512.run = "0f983d4f836c03ede4ed6bd8c2c41dc69ad75a28d9006ff7ab534c6e483e84e2151bfd93fefa43ca327fbeec14787b43205457a9cf1e733f8a4c3a7c561498fc"; + sha512.doc = "f107b506ba50ba8ed1b655f13049210ec4b90620348ac708afbba4d992470dd5aa8eabe84e2c0b926a55afce49e0a2cee28ecb3877550fe81099f7e5b40e9f40"; + sha512.source = "57e94723413ce6fbb1405dacce4af0ab9f7b5e5fc9d091fcf3054fe9505cfda885ebf00b3242ad341325d982d223438e1a2b6cd1f9286cbf5621feb5ae9b1a2f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +prettyref = { + revision = 15878; + shortdesc = "Make label references \"self-identify\""; + stripPrefix = 0; + sha512.run = "06e3ee942b9a30ff866abf8f6a46b6960321c0aaf2516ce48f587a55ffcb66f158887cbb9a476bc6323e90edd22766fec19d0cfcc2be8805eedd175fdf08ef42"; + sha512.doc = "abcd8cb7e7ab78511d953d95699060581844dda67b3489317057782d97388f7cba990735b395e9563e15fd1fee137a86e8198d2d545f437a2d105bfd3e95bc12"; + sha512.source = "d4793c0cec0e56a74d05c08547b68a83e5af33464b3c29a50189696c4d000ffff370422192a289a734e42cb4ef6bf2b95866523f3d6257961608e95f13dfb87e"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "3.0"; +}; +prettytok = { + revision = 66884; + shortdesc = "Pretty-print token lists"; + stripPrefix = 0; + deps = [ + "filecontentsdef" + "l3kernel" + "precattl" + ]; + sha512.run = "d08eacff02fadea3aeaabecd957c4e32881de942a3199bad1bf9e8fd80639ace3d819f9a7ef875c77fbc95eb8e79281ee7bd93ed0f113f9058aad592c70422c2"; + sha512.doc = "c0fbd26422e6399ccc4aed70e3e8dba976447161d008d440728fee07443caf35845c28acd86af860e9782a171e3e48a6e1e9a92c6ca44d8d7433c561408831f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +preview = { + revision = 69470; + shortdesc = "Extract bits of a LaTeX source for output"; + stripPrefix = 0; + sha512.run = "b7ed05c49ee852d23da47c4dab53e5116b1dcafe4ae404220e10fb9622ee6a593346ed7474a2d13c64d6d3782b5894f01758cd267bfd269f54778d2af46e8bb2"; + sha512.doc = "d0f797210790ee1ed8a80df8090f9273cdab22de2bbe8d72b609385ff2f0e2004dcaf2a91d0ebe3fcbf0693cf4f83b2a978f7b02744185ebc9c803205e88d7a0"; + sha512.source = "e2dde7963e5337c8d0b0f0fd2a7adee2f09e8bd3900d2d8d6cca7d612e3401fd6567a42141734e72e6cdb043aa1fd786ca0dcbf42a776880447f81d0ba4e8838"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "13.3"; +}; +prftree = { + revision = 54080; + shortdesc = "Macros for building proof trees"; + stripPrefix = 0; + sha512.run = "d73717b68ce3d12108a76a3850f3a09b9e1100969e79c745b7b08340175ea9599f10f928809fcdbf8ffbece3a60baa41d84dae182ace8b85ff511082f1db70d4"; + sha512.doc = "3b4d81db24039d15e76e0b237ecae6454d54b452b542e26ba8e0c45faf4f512124f0c1d1f5fef3ca6e6dcb3c7cc09eead3003a53a59a689e5e917583585c045e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +principia = { + revision = 66625; + shortdesc = "Notations for typesetting the \"Principia Mathematica\""; + stripPrefix = 0; + sha512.run = "ef88cb4dd25ec8cd3d50a7f152698e771c8b5f1fa18adad21d55bcd3a8088a38b09eb19873c6a3d1883101d27f318bc092c9c1219a2be76bbc07bfd2eee9711b"; + sha512.doc = "8dbf4e19a3c688278c52299731ca24fef83d08886a179f15cbc58038fe92d5ddd6e57bce1451a0af686593f98adf9ed3f52ef0b20cd68f65df52b8b6a2576dc3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +printlen = { + revision = 19847; + shortdesc = "Print lengths using specified units"; + stripPrefix = 0; + sha512.run = "bbb48c169f31a1f93024195056c323ce67afa1fcc00f309ef1b820dd40e0b86ca98d05f6cd4af66379682813a3807f24295a803fdc91d8b9f19972e1520d5eaf"; + sha512.doc = "25d00eec6c6bd069675cf7d980886b12444e41d18a83ed8e650923d839da8dca21dff65b110105458767b95c50b52a0143b2f7d88b6567ab3aa9953f4ec32a88"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +proba = { + revision = 15878; + shortdesc = "Shortcuts commands to symbols used in probability texts"; + stripPrefix = 0; + sha512.run = "33ef76474e7183c32b5f982347ed414ae7616484ff5a5d8564574220d3757688a3a47aad000c5b0a66a39dbbef20c789dd1445d872b025c274585248176c86e7"; + sha512.doc = "960887501b74d2c5e8a00c09464ff17dc9c733dd663fb35c32b34bd8b79b2a813536b6c0f9c5df4340dbd3adf1f30f569aac678e90d5f328e1c33130767fdf21"; + sha512.source = "d1305e797d8884f264a20df021b6b0619cee1df1aba8943f5533c2cd839e093420e43ebd1aa46282457a650569a883f4f11a9319f6b6612dbec5b99d29f37087"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +probsoln = { + revision = 44783; + shortdesc = "Generate problem sheets and their solution sheets"; + stripPrefix = 0; + sha512.run = "f0c63a327569410af7eefa9f87fed56a6a2db78b05133c417afd245958a7f10dac965270fe00e7fe5de6ddfcc4a1cec446df819728e76ad347c7664fcfe849ec"; + sha512.doc = "c79babc397260f03e2ad66556230966d1af97bbd5703c25cd09ff3aaad48b49d464672c501df047cf5226370b80588705c59212e75d0d1970337fd446d86e70e"; + sha512.source = "53ce8efe56938c3e16da53bb1255d86b1ae9cc546cbf4983156c098ac07f1e7c16a998a7dc53fd445efa9f42a6b82889e50c188aa57a72aa9186177fbd744f5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.05"; +}; +prociagssymp = { + revision = 63242; + shortdesc = "Macros for IAG symposium papers"; + stripPrefix = 0; + sha512.run = "f85716931c9fb7ac695db838d5e76160c485dac5f5f6a8f1c27cb7e375d78b385dce513103fdef30eca238fed78734661e192d712e74d948fbce0ccd209a1066"; + sha512.doc = "9d7e118fb0b704649176bb51f523d8a64ed11fb8e58cd1cafc7ffe3f4ad5005366cf518df9d7a4577b600524e19f089a4086d46f946668e82a1272b28c750f8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +prodint = { + revision = 21893; + shortdesc = "A font that provides the product integral symbol"; + stripPrefix = 0; + fontMaps = [ + "Map prodint.map" + ]; + sha512.run = "ab2b0ababfad124b38b018c7313df0114c36fed0dbbaa42de04295b09142740ef43f34c4c6ad926c97c1ce28521c1d87274486588609197c2178b631b4ee6876"; + sha512.doc = "addad035cb9e7b88d9da2bf161723db51897342872dd6c671695bb7bb0a6a4c7bac872ce40f31b22f5fdd84cc03994562a6f78f14d9203977d5b7c8d17130db8"; + hasRunfiles = true; + license = [ "ofl" ]; +}; +productbox = { + revision = 20886; + shortdesc = "Typeset a three-dimensional product box"; + stripPrefix = 0; + sha512.run = "9b243f6558dd449ddb9d9190ea53a71ed5b28d25f5fddc64eddb194144aa688e8d8e946c53f115d40813d0933b77d5d2c78023f24a1887d8eeb70e6c1ad0bc1d"; + sha512.doc = "73f8e1afbbfd9d4047120280e746ae1349225dfa84b98b288e23f477d2eb83310271610d6f4e40cdeb0d124788a97c1f8aaeb182a03cf2b1311e286f7299aa45"; + sha512.source = "064e591694d0c7f6c9c981ef4038175cdb1fc9a120daaf954051dc05bb6b602bc7fdbf961a25d5cc490380028564316adf5714a151e4606aca31d1f4bca09a54"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.1"; +}; +profcollege = { + revision = 69539; + shortdesc = "A LaTeX package for French maths teachers in college"; + stripPrefix = 0; + sha512.run = "37e807c9a37384e55c799156dd3af4124345b46d0a25af7e878d675701715bcd8bb5809d5bc9bee6e31377e3d8c16e43cf0f99c4b8f9d16df68c299c04e4ced9"; + sha512.doc = "666699cdcb971ec304455569fbf8138fabae13a0edda0af06d50eb15ba54b68f90a9d83d4062ef6641476192ea0187c66e666a2098245a49231d84e4a925e59e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.99-z-z"; +}; +proflabo = { + revision = 63147; + shortdesc = "Draw laboratory equipment"; + stripPrefix = 0; + sha512.run = "7270b65b821c303e84eec760126ad421dd65fbb5ff81309142690f8820c4865c3b1ff39b22b2cf700a10920b973e18085a1e73ea3f6c9d90da984d48a19bbca7"; + sha512.doc = "567ba9cd2d7eb724fd4ab20ec417f6804a795ff506bf8df582df9d7ace7ef2c5a8f95b46ff374391fed44918c6a536f6b14348ea3e0f3ff149fbe4fdafba9fa8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +proflycee = { + revision = 70513; + shortdesc = "A LaTeX package for French maths teachers in high school"; + stripPrefix = 0; + sha512.run = "e71feda42148721f3605c48271f51db60fc8826401c97372794b799d24183da186ac33d352534d216d642ba85a4a62606ae893ee11414144eca7aa9fddadd162"; + sha512.doc = "ecda097d113be20b48dcf933647d9e7d2adb6589b1d27058ff06f6a984b0b109fa383d406207119348388a50ce33521432960bac27f91dcb27561e09f0bd8e22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.02f"; +}; +profmaquette = { + revision = 70496; + shortdesc = "Use exercises in different types of documents"; + stripPrefix = 0; + sha512.run = "17223e35f30ac30274ab96d236903eed3343e8c8b7ce9915d82e430fecd36c7d8586fdbde6ab0f3e91694bbeedc9fe1e1c084fb8e47f08af53424452732e6f94"; + sha512.doc = "0c93574c3090cbe5959db0b3eb9ed46a45f5256bd8ac3915155b4e7fe44391dce10f6ef6d380da1340234c2fe341ab6bed3975743b4eab3794b4b48db5922b75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.88"; +}; +profsio = { + revision = 70211; + shortdesc = "Commands (with TikZ) to work with French \"BTS SIO\" maths themes"; + stripPrefix = 0; + sha512.run = "b4e8dcaf48a7b9a6e5cefa8b188e36d4f017afad476f6441e0718d89a497d2bdff06ea3380917a836309de371446602bdee51fe12f42aee0fcbe189b4c1d57cc"; + sha512.doc = "846703236b09ec68c49ec05c5fc817e109914d6f2449d652876371e92ea1e5c0ac98697886ca81d2bfe6bbc7deb6537f5d828140d380e459f706c9f902dd1502"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.1"; +}; +program = { + revision = 44214; + shortdesc = "Typesetting programs and algorithms"; + stripPrefix = 0; + sha512.run = "a9ef7d68ad86b42657681e2b798899b5c7c472c5e272a9098a1424a35a109dc4a946be54c4007db73edb861cb475f293e404cee9fa0dca8cdf086eb6c4790319"; + sha512.doc = "4213b5bc9cd6b2604bf1c667dd123729c0674d1c74338ebeb86b1551af14be3e24c4e94b4e5cc2c06a25ebf934d56eb6d3b5ce80e452798ea02fbb0ac6533580"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "3.3.14"; +}; +progress = { + revision = 19519; + shortdesc = "Creates an overview of a document's state"; + stripPrefix = 0; + sha512.run = "df21ec7e4adc36a420959550376fff5b8a55fb7dccc064476b2306226c1776fb2075994d9ae63bd5bde0b68571671bacadf9285f53bc9e639c2afd59e5b6814e"; + sha512.doc = "e88280bb1a93d34dd5597627d763d1b2a21a56990ede2e029246dac84f3bb22e05a08a9a94c0790a9c8a87698684816ace02149562785cf36f2b6af82f89c130"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +progressbar = { + revision = 33822; + shortdesc = "Visualize shares of total amounts in the form of a (progress-)bar"; + stripPrefix = 0; + sha512.run = "d12161aa891ea45cec2a4511c48a1c338de5acd512e426a24988b79b7d9d1734479a1cd93e3e8ee11da67858d97260b71ca35a3a7a3dbbcd2bae746221a7bafa"; + sha512.doc = "a60ee29da0517d6769e09f12af7b600284f32478aef1d28cdf167610c45bd87f841500c2bf718ff9b6678a171f3138f4a7a6ac45bd41500510f509e8e7067efd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0b-4"; +}; +projlib = { + revision = 70327; + shortdesc = "A collection of facilitative tools"; + stripPrefix = 0; + deps = [ + "create-theorem" + ]; + sha512.run = "180698941fa86735f83bb4d93886c2cd637aa7ac50103ba68d3369bcefcbe6200a377a9975e04db9f0e528a0b821bbd82a5fe6deb4e85832523798e1523fd976"; + sha512.doc = "362d152dd0c82a9807cba5b6fe49da6b4a8335af6b23f6958273e370140f3b48e1a52424cfd9c41736bf672f4552afb43f897a8624bdfc300e09db363d501dde"; + sha512.source = "0d943cd81f384da704841841fab42276b66db825258b4aaa0392ee651527960be60a80d87469a679ee7292a0096c5d438f4c76ad39154981b113cfd12e273d44"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +proof-at-the-end = { + revision = 69602; + shortdesc = "A package to move proofs to appendix"; + stripPrefix = 0; + sha512.run = "7859a8ab78c39680922e7131f2b95ca1b253b5e1252aa14fe219c3c7fe9c4357ab30d4b58a54e84c3188fab87de9cc14a23925dc1fc1563a7efec400481d572e"; + sha512.doc = "5c3e4eacadd2aafe86c231d44a340b2567ddcd9d9b737739c3b2e2ed69c0e14d6966174e3026cd10cf4ca4696af61cf305c25584e0df959e49f01b2d95a3f9ed"; + sha512.source = "088cefbdb746236e400b232079c54c6e8f73d8adf94f022c842f45d5bfe0e83cdcf8540c0dd51214c5538d6609dc0a0cec7fa3b5a2458a28eccd288249f4f9fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +proofread = { + revision = 61719; + shortdesc = "Commands for inserting annotations"; + stripPrefix = 0; + sha512.run = "79787978d7888ba127b9b72ea38f0f3e7ef9d427cf8e493120849cf7c2852ffe79b5fbf349160bac419be0725a9d79f33a00c13d6b3eded2cf0600b7d0994513"; + sha512.doc = "e33aa6e720a22bebe6f64d90b00bc4e01b0892ae66c5f9c4dc8758e6494fe2bbb9ba84df442471b9db652223fd3e7f40fae486f09c7500095f7a2d1cb2280b3a"; + sha512.source = "b1b334a3bc3dc61dad0eb071a1c5dc3595cb9231a3b7e50856bf0d5c50a4ecf188f5efbaf7a0065ad51341c2408cbf3d81a6e7c473bbd003289cca02d1962f46"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +prooftrees = { + revision = 67399; + shortdesc = "Forest-based proof trees (symbolic logic)"; + stripPrefix = 0; + sha512.run = "ee4feb832296a512e180b4d38e5989a87d6884c3c84ea2b224754201e42fe2fb6c4f68461a0cf3d3cda10b263c88c6da9e082572093f53ce2e8c62473d4707a5"; + sha512.doc = "67cbbd3068410bf152d54c2f25821b5672c33b68e76fc7ebe02f0df160cc658b20e072379035f090beb34a7d4d5ca21809965bd8e44a554e5ae65039a12f4850"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8_svn_9582"; +}; +properties = { + revision = 15878; + shortdesc = "Load properties from a file"; + stripPrefix = 0; + sha512.run = "3bde5cf132c9013bcbb0eef439e61725ea41a09720f98bb53f8bbf39d56d6cde34ed1613b001a86b40221a36233b1d5c226819c94b41d49211065e1477a0bd42"; + sha512.doc = "eff6b91e8fdd7b0a6b0526c7dd2243e32586a5ce12071130f388a911fa34cbac4681d4118b601b9eb979a272bf89b82f00f8ba509fa996521e8a2861f8e84a80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +proposal = { + revision = 40538; + shortdesc = "A set of LaTeX classes for preparing proposals for collaborative projects"; + stripPrefix = 0; + sha512.run = "d9a352995030efd57ecd46028147a6326ede0695545194a01846d4a3e2d29096ace9e6f69900766906f3ecfa05ce566ebd1c2c5f76a3b2b2646c1e0f865093ba"; + sha512.doc = "53c1d47f2f42c9ceed73f350c2aff9b229d6dc8dfde9e3fb8109971905c5d6430ca52d72551d540f5a1727a767d6cf485d8bca2489f301edfbf964490ecfb5a2"; + sha512.source = "39ec30b5c0d94a2beb6d83d796ed13ca95b5e0045edc8e7828f5528e44e9f24350fceef93ec2c3bf9cdbf3766d7ddb0b72d6e10a909a6fc92e393681d425d8b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +prosper = { + revision = 33033; + shortdesc = "LaTeX class for high quality slides"; + stripPrefix = 0; + sha512.run = "bf2285803a71b00c67a9e64ca5e51bdd880856338b0bf3e95bfb2ff2e78d5cdd0617424ed95918b5982d5befa71476b89567b2107eb0c206f9a9f53966a983b6"; + sha512.doc = "21593ccdc8231e37f0b2938d3978205ab3ed61f74a6e8a4b1dd2cf82da552bd920a7711c025964fdab5661207cbea1aee04244c93552e20d10df338c7dc5c138"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0h"; +}; +protex = { + revision = 41633; + shortdesc = "Literate programming package"; + stripPrefix = 0; + sha512.run = "be8ea34f282fdd739f72f9b33375bec3be5055bc953c7a441d769ac1e7568af9327ae6030f67a805188dbd485ee8223936921590ec86269e371da6d3ee353afe"; + sha512.doc = "95746823c32526fb5e2c9968749a7da2149d23c2ec9f1ced2a655a4fe54ad272bb414abd0be0d78775b0ac95e6440d9b6ead609de7615dcceb0186e4683e4138"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +protocol = { + revision = 25562; + shortdesc = "A class for minutes of meetings"; + stripPrefix = 0; + sha512.run = "e9555a25b0051592bd700df5b7335ad07eff024efd1efc4ef620fe7ad37866aa1edc8f354a7c772b3a298935bcffa9b5b2b49c2b0a14c868ae744cb9165bfd19"; + sha512.doc = "f047068c0b9176087cd56530c9b73d30bbffb0d4b958cefae39f1f3bc924fbe705e81b5c867735715566b674379d1731e1d58b123dbbda3686a2b84f42674338"; + sha512.source = "f41e90e822d9cffd941a9be8b918f5817c5757c2911a3c2162899d9e074390fc4500d8617e385f5edada4c2accf5a08421cab6192505721deefb4b1ceba136e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.13"; +}; +prtec = { + revision = 51919; + shortdesc = "A template for PRTEC conference papers"; + stripPrefix = 0; + sha512.run = "06e946526f194e36b55c91c46615c74a255411ff3de2fba005a672741830a5bfc162be122a7f03d00374917ab70dd789549a2976280db8c8106999ab7e0854e4"; + sha512.doc = "fb299846eca43fb054ff441c2eed6f87382cbb58419947092d04bfa99102e3db7a8395c9b974395b579f6b5700f55c2c730c162bcd19e5246fbc64b80acf5681"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.06"; +}; +przechlewski-book = { + revision = 23552; + shortdesc = "Examples from Przechlewski's LaTeX book"; + stripPrefix = 0; + sha512.run = "18b9546576957553b477a1c5a90e6780770f18d6aced92b17017c44770b6bfa9c3cf928500a9e56c6c67f45d375bc12ad8ebc97eb1589f3cf7b5b3ed2f7b55c6"; + sha512.doc = "0441621561c2c4208d083f84eaf47573de94248cc1aaf027061de636c1a65f35a307260eaf390257bd02acac34b42963f96030ee27c83650deb11234edec89bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ps2eps = { + revision = 62856; + shortdesc = "Produce Encapsulated PostScript from PostScript"; + sha512.run = "c43ba33d29d5b23ece2add44310b89036d5c4725ad76da1ed6e17bb93d0e7d103549f4a7e7807f89cdffcb19a95e0df2fe7851989b8a3b691aacfebfd41044ae"; + sha512.doc = "0194c8634c5d31cf441fb3d7fa171d85358db9831c03cc77bac37272ddfed81d8296e9b05eb4daa7c8012f3bad1a01625aeacb2232989969551e01a92912c409"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.70"; +}; +ps2eps.binfiles = [ + "bbox" + "ps2eps" +]; +ps2pk = { + revision = 66186; + shortdesc = "Generate a PK font from an Adobe Type 1 font"; + sha512.run = "764e6dc186bc0e9c1b5ee0a3c5a256e9d42d81645477bba49c59baafec55bc9af63124f77227ca5b6516bf3fa2bdb8d201af813cff09ac9da4574e70351922ce"; + sha512.doc = "032c5ab3442cf668d6b40851bdf710b4e4b9eca701bf04c87359c579a5fce52bedea15ee5dc9e4c5967fcc0e3b84805450987b73c204e0df4708b65a7cf74c13"; + hasManpages = true; + license = [ "free" ]; +}; +ps2pk.binfiles = [ + "mag" + "pfb2pfa" + "pk2bm" + "ps2pk" +]; +psbao = { + revision = 55013; + shortdesc = "Draw Bao diagrams"; + stripPrefix = 0; + sha512.run = "eb391c615ed622d928725b3a227ce0141e75ccb49a0e2e915d41bf12e343a9622d9032c4c3d6935cdf6e36c6afb4d3138d5acf17febe4691fa6e5c34da01c2b8"; + sha512.doc = "8fedc9f84eb5f640ff9644c933b5eea71c1d4f9e03f861ca7e8820a582cb31f38e3a9e4625fb1b28ff189f02b3546734eb71e1491f63d4508d3d7b5f7ac635f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pseudo = { + revision = 66638; + shortdesc = "Straightforward pseudocode"; + stripPrefix = 0; + sha512.run = "223e02f58f4b1cb137241a273cc6aec3c2923ea49bc74fcc220df449d01e6b3009ac6303a99a5d368ab3cee62d6542707feddeee30f527c2be1ad8771244ca85"; + sha512.doc = "573b023b0d9604ecc98b774f77016fcb971c7c5dd508fd272169ad5d3da9f5273d78c07801257cad5c1461de2ee425f036afdbc827ae343e9ae151a63c86db73"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2.3"; +}; +pseudocode = { + revision = 54080; + shortdesc = "LaTeX environment for specifying algorithms in a natural way"; + stripPrefix = 0; + sha512.run = "8335336bb46c0bc362bb10b6bed547d95230a29ba8144549476ec984323bc79475b11afef91409761e4f651dc4c28669639106d14c4dcceef7f90290e5f77b12"; + sha512.doc = "ad53ed572d7d79caa21baa8c34482ca6032369824967e2966479e85a95d140a6477acf0e69ca7bc2d6dda6f8b161253b1afd43cc53ce4d44641dda64d82abe13"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +psfrag = { + revision = 15878; + shortdesc = "Replace strings in encapsulated PostScript figures"; + stripPrefix = 0; + sha512.run = "71bf5c02e7a8a17eaa891f15c88777dcbbfc3ecf8b4a72dea49683f061bc86427ab813dbac5f5b8ab4742edcb92cd32d510675a80b0b3cdff2dc2cf127ee89fa"; + sha512.doc = "072210deb2635a2032f6ac2d100ef72aa4471f69dec03fbb25fbb0d78b89aa2df0972b244d4335e8ed16e1a5f0cb8e04d22ad44dd5740fda59f9a4e5300befaa"; + sha512.source = "fd02b807b47f3818545e48825ddb11d188e9e3fa384b0f3412bb09051daedf73c2587a74d70aeda472047c1eac039252a25cacbf74a3c8df76be13a2644372de"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.04"; +}; +psfrag-italian = { + revision = 15878; + shortdesc = "PSfrag documentation in Italian"; + stripPrefix = 0; + sha512.run = "4d26f0191ffbbe7fa6a9aae1ece6e72739925b59a1a1db5ad3cbe8f2b3ece92ec8265f008e91fcabfe2e04863300db833eff3104486e9c33985ce5c7f8dd7543"; + sha512.doc = "7a513ff265d259adfbaee9ffb47856602004f19679dad1316f04d36848f2e22bff8c3164ba9b045e7a4a57df76c2ad17b071a9cac68d4b92cff57a29f1e99f55"; + license = [ "gpl1Only" ]; +}; +psfragx = { + revision = 26243; + shortdesc = "A psfrag eXtension"; + stripPrefix = 0; + sha512.run = "b02063b8c1df58133b951eb10763d3b9099376a473dc980fef801ab565326ac1c5539be3ee94ee5c79837c1e6265cf41d6554f66e8900df2663d5d7e727e0df6"; + sha512.doc = "863df965aa6abb99c115b06ed7d1b1660345e9bca0d0f5d62b6a7ffb55391688a92114edae7bd28ef8b715515c8bcf3c5b4fb4970cc1b6bd9cc068b09595cb10"; + sha512.source = "f38ac5c21c7f366e952e71199321865a70376d1dfbcbed2ac993fa01f412f185a09725b9e6b1808167a5cf55d253b461a43a2f126cedd7d469645b7740702938"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +psgo = { + revision = 15878; + shortdesc = "Typeset go diagrams with PSTricks"; + stripPrefix = 0; + sha512.run = "75791ac8c340cd72139c50b2e2a05f6001edf2b79bbb9fcb4c9118f2acbc67643469c8f6da34122bf001e85af60b5b0050bf3c7b5bcce7c393e7930e3cfe7eaf"; + sha512.doc = "9d061c884f76eb87e86cb441ebb693a9c64daca024c35dd631d660f3d1f8b1541c40e285d5f4115b36e2b02b7640ea7be70f4527e7ae92c6d6173625b215b7cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.17"; +}; +psizzl = { + revision = 69742; + shortdesc = "A TeX format for physics papers"; + stripPrefix = 0; + sha512.run = "7dce0f9b7781ca89ba93c1607acc0b440ffcf482a1927d0709aa0e914531e250a4f1ef24b64ee63008351c7b206fc092f9211966fb92bb6e0214f296da872677"; + sha512.doc = "c337900dc35cf0e02667d0eed6ac28aafc5336fa39bd7cd90dcf910ab27ebb741abe0ad7b0182fa8018c945cf9d4951db062d1ecfa9a9758e6e9940a0af0b0b3"; + sha512.source = "7294b45fe17bcea21243b7c719d151a6fd87fef9e641b5a3a193e355df660f7adf5e52dcc22ad7b8998f8d882973e32bc3d9af57b33223c39ae0079e1829fbb9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.35"; +}; +pslatex = { + revision = 67469; + shortdesc = "Use PostScript fonts by default"; + stripPrefix = 0; + sha512.run = "b08cbb8ed7a4b89b9018b5b31bbaaf8ae9c520ffbf47b54d239b30ca67a26e138206c1f2f9951f8cc5da49357c0eca9a3df9eda4f02119355cf2be0a85c3a825"; + sha512.source = "9943941967009a9d3cac0841318c6a31818f7496ded89fe6cf4d6ee8718913d0145497443762d55e4f80a1fee496b5170ff4b6c13266f04e6ce4c5bc2bdb5728"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +psnfss = { + revision = 54694; + shortdesc = "Font support for common PostScript fonts"; + stripPrefix = 0; + deps = [ + "graphics" + "symbol" + "zapfding" + ]; + fontMaps = [ + "Map charter.map" + "Map fpls.map" + "Map pazo.map" + "Map utopia.map" + ]; + sha512.run = "f7d1acebcd1d32a691221f396220358f3bb15dff2e2cebec4b537b1b790b68d8ce1164711983a52b4f04d6e470df2e3e5fec63bb1d3bf39fe205d5f0351299de"; + sha512.doc = "d1c14edccdf43ed2c786394bc04e9fd683b683532a9dc18d592f918ee8899234d23feb738128aa1418f441288cdbf0c6de832f8c4d98023926baeace36365a1d"; + sha512.source = "6862a7e74be6a575996e6f45a2236db810f1c030d3a0c53b2b97c2e803fc7e29010108e4597d637b8abedd63b1f956da268f62ca2c609accaa4d035be7bfd8ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "9.3"; +}; +pspicture = { + revision = 15878; + shortdesc = "PostScript picture support"; + stripPrefix = 0; + sha512.run = "139d160fa67dbb7cc932fc75dba80dd46a55a1dd5973b27a6a5dd38a6035cb367441b178acaf3c11859ad60103283774ee5e2623a083a0336d5c2ff74a7b82fd"; + sha512.doc = "a743397a0d48c587b60db5f1dcf9e1c22f67ba15dbbce241a2584c95456b3546aebdfaebec9fcfb3dedcac65f7f053ec52cb479d726e5e3fbfe042efcf1ad702"; + sha512.source = "af1deb00966a7d4d1d68e156dd5fbc60e95f60a65a942f1bda1acbd579b932e0c81875386bd3eb1945fab211cc9ad5607c3e21e5d240048d775c28574cb754ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pst-2dplot = { + revision = 15878; + shortdesc = "A PSTricks package for drawing 2D curves"; + stripPrefix = 0; + sha512.run = "3109c2709323906ec39bd1be6e7c9151b7b07f9d2dafd5f7af61d3facd3e37ae35bd8bd923968102fc702f35fa4a903e9a50d3a7a85a1c088017aababd16d969"; + sha512.doc = "f46a0c8c94900d180fac92e7b393672d010388fe80867f01125cdc7c486eff97ee36cab1aeeeb224b9ab80739c2ddd9e89b84926948acaa8b2b0ae08457ac0ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +pst-3d = { + revision = 17257; + shortdesc = "A PSTricks package for tilting and other pseudo-3D tricks"; + stripPrefix = 0; + sha512.run = "dfd8a2b79d308cf4ae3bdcd438b967446f8601509fd4afb3f090d946df0cc2d66e9b7071ce33e51ad4cd53b7e62dbc02d861d46a302bfe2c901d1d8c82ab0649"; + sha512.doc = "e8355b936fbc1685edf205e88f2793ab298aac4e4c06de10dddbe1587b5401ba8cc4d2a01dbad3ad56da5eddb27bd6049a41e6da8c139727d36fcc94d93ac554"; + sha512.source = "fc50cff8bb86571d3827a03f3c64cb62a9fdab25e2595ccf9465e4ad39539ebc0a55da92519ef203da65da3a44e01ee28b39ef27a5af24d26463b215f96be313"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +pst-3dplot = { + revision = 68727; + shortdesc = "Draw 3D objects in parallel projection, using PSTricks"; + stripPrefix = 0; + sha512.run = "1fefbd8b34e49b7cf6bc35bb761ed9aa49d062d81f280936b86b58f123cf6023e038308f066a2f9e62c2fbd4181d3dad781525f289a9f5e58acefcdd344fd69e"; + sha512.doc = "7e15351efd6190ff52e10287a7797a6ef0944561e381793290fbb56f6f2f174447343d10c9cfbfd0f61a62755ea0b3eb7adf52dfacf1b0b7ef2ec159f393b4f0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.09"; +}; +pst-abspos = { + revision = 15878; + shortdesc = "Put objects at an absolute position"; + stripPrefix = 0; + sha512.run = "b56bed1fedb14fe7cc455fe4e87ec51085e8e09132ff5dbe52083701cdd0d63f2e6dac2ab55838fbefd8e7de9666d0239e9fba712573a51dce2804d31ab140c6"; + sha512.doc = "77754a1c27c083f60c2836483a60bfb6b4c826783d5acd16b1eaa9b7fe7aba8820886442ed28a5b334929a3f21f0f1b4487c7403f8dbfc3ad3cfc08407e35229"; + sha512.source = "faf4f7e2b94bd66d19be75c307c8a6b20a2c779a8e6783096b41e7b4da66ab07f7ecbaaedfa668c09089bea9c2c79af4cbc12aeafe949cb729c589989206cd0c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +pst-am = { + revision = 19591; + shortdesc = "Simulation of modulation and demodulation"; + stripPrefix = 0; + sha512.run = "a5f466dacd393ed7243fa2cb43aed0a5bb8469a51aa82fac4b53c47a474a1d9758db4d7a001cee49716714049499339567cb62a66f2731ffc7646fecc15c7784"; + sha512.doc = "edea0ddc3f5472a86706d1823fe78459d2908724daf2b9bfe44b41e749f2b41483000602817a45a5e41869f86d4034ea52640bdffa334af54e4964510768152e"; + sha512.source = "fca7f1f7769f839632eec75b3baa864b60f9ab3c1ff9cc08437fad4086cf9a063f283568163d1ebe3e5a2c87b06bbae1b11e5be07a8eca5030cccfc68392b40f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-antiprism = { + revision = 46643; + shortdesc = "A PSTricks related package which draws an antiprism"; + stripPrefix = 0; + sha512.run = "dc93e3a8a040a2712f701c2fa89924c45749824d20ad814a9f04aa423e15caed3a457b762dc7d30cf5c9e3afea378efc303851af919831c0969cde50b9adea57"; + sha512.doc = "df528e5693cbbdca80a88d02e2b8487b70c188109825da66c9d9042056c6ba62e361fcba2ac747d69a08a4c8d78f27534640ce55c583289c3f12c2eb4c57d861"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-arrow = { + revision = 61069; + shortdesc = "Special arrows for PSTricks"; + stripPrefix = 0; + sha512.run = "3e928de0ec8f1c9dd80143e35e3dcc9d51ff106fa12193798f5d2a77f49b3049f042273102b3dfd1460de68814ab32a3aa4eeb14daad846d729e7f6ddcdaa5fc"; + sha512.doc = "19878f237410d2db75096be382efef2ab1c5d169b4bf48b393956bf13a697d2c96b0da528c1044ee9b36ca8231ba4ad2b478bee24402033ebbcdf2778e4128a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.05"; +}; +pst-asr = { + revision = 22138; + shortdesc = "Typeset autosegmental representations for linguists"; + stripPrefix = 0; + sha512.run = "c5ae73e1553b564a90d2c77fa434c360fe2858657fb5ff4c6ce1cbb46838fea9c0dd7a8d92e2048a8ed0d748839518b461b0727db3b7937c4e39edf85277e081"; + sha512.doc = "560ea68a6f02dc3b79c64554652a9efd52c7fb00d07e7ffbc9b92ffab251854e07e87642028b94fc42bf7d01fedd82bfd50913f9c42d1c37d76c1eaba761ed00"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +pst-bar = { + revision = 64331; + shortdesc = "Produces bar charts using PSTricks"; + stripPrefix = 0; + sha512.run = "a4ca273cf21aade2adb15a8fae3d7aae9b24f4cc4a81002cfe0471aed7b5cc7be516aae26151a8bd2d98171f5524686105f3576df8cb0ecc6e16d690907f7156"; + sha512.doc = "7b090d51bd669c3b252f002855d60f008054f12966d01cffdf6163e4360fd88fc064459d42d756737b1a915d87ffb8f789900be480eb7be1f3925389e2873f58"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.93"; +}; +pst-barcode = { + revision = 64182; + shortdesc = "Print barcodes using PostScript"; + stripPrefix = 0; + sha512.run = "c79fc6d5ff483278210e654a3b325a6acd2492d6cdcb8958d5e4802bcec6aa119887bacb82a91e312c39ff5ac12a62d28c04528439684bf000dc1f1003ce8651"; + sha512.doc = "ff4d449709479f9e1218a2fa3ba642660b09556c96cc94a1b65984ae0723e8b730d09634053feb256bf196aa183e4f8a46ed3efdd9d91dc5a03b4a6d4d59c0f1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.19"; +}; +pst-bezier = { + revision = 41981; + shortdesc = "Draw Bezier curves"; + stripPrefix = 0; + sha512.run = "e2277175eb2087e13ee0a1100d602730514e1e5bb023d4db7163ba4113f69c9fedf74ff50369298ed970b89425b824cb8619e2cac4be463589edbfd747ccc6c5"; + sha512.doc = "5126769fb89900916a52135af0ba459651083b01db466471cc984b6dc837686cd780bda7c3295b6afe9a7bc85180b3acd95c015084d49f46049adb2fd84b5748"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +pst-blur = { + revision = 15878; + shortdesc = "PSTricks package for \"blurred\" shadows"; + stripPrefix = 0; + sha512.run = "5726819bfa08fbf6e9b5a2c6f93008e468b759a825fef04739a47e756d4b12a99aef604d64618081b1788b5fed9247c75dd3580a899771b148306880341f0444"; + sha512.doc = "5e483141d8f5ad03421d9c7c5feef8baaa3b522385d307022dd617af0889bf57d1cf603a1d519a5d17d8dc918441ca3310d766e4dddb7ed6b8155985186b5e7f"; + sha512.source = "2e7038a248c307c50d29a6171d1b52bc8d6fed76885ebc24480a3f679918fbdbf1e538f783d0f9e3792a3530e51e60da4873c5da0878e66672dbe13fc9b950d6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +pst-bspline = { + revision = 40685; + shortdesc = "Draw cubic Bspline curves and interpolations"; + stripPrefix = 0; + sha512.run = "1f39a02cb0d56b4fcb8ed3a3768b59a9d14ac14769783dfde7108d86a8c6d68d79342df501c60efcfb8aca4c7f97fffecfe4cd0ea0f4fb76e528f696180b6dfc"; + sha512.doc = "1f2b8c3f5d85db4215cb11fcd663c33fc1e34e764432a2285f879ec8bf7acb9d09368c6a9910618ee99c3305d701aff5e5d401c227d0c1db9028be3690b5216c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.62"; +}; +pst-calculate = { + revision = 49817; + shortdesc = "Support for floating point operations at LaTeX level"; + stripPrefix = 0; + sha512.run = "b40a89c1e0152459e9dde468379b1a848955d40b9d9e05223544347d6057affac092a503e6307904e485a81de781eb9455abd948bef7f343359d44abf37f93ea"; + sha512.doc = "d6e936e7bc53ae3296812b1d33ecf6ae890599cbb9fa6afac719d8ebcca4516772ff6c18f27e8d825ab959d430cbfe8876b2bb97e480bf6464690b28cedfc2bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-calendar = { + revision = 60480; + shortdesc = "Plot calendars in \"fancy\" ways"; + stripPrefix = 0; + sha512.run = "0e9bece02b9deaf677ef2d6f02999d3b4b7bc7028ec768fb57e69fcd3c1c26d1ddee1c261cbdce8eb8cb18c647dcdbca1448860d6139f01e17f234b3a8a0e793"; + sha512.doc = "07796be64b64e6c8eff2797d145933bb45c0e3ec0ba50e6fb41974d2dcabce09f2f781f989a62a5c5fe6295af3ddbce10ab811c2abeafe2d8b56b7a603f27412"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.48"; +}; +pst-cie = { + revision = 60959; + shortdesc = "CIE color space"; + stripPrefix = 0; + sha512.run = "fcddc7d04c259132a45fb30850c02b613ca71e9c3df26729166b142e953e997d3c618d835be472d98c0aa7a50caeaebaa5631cfa64cf132aa35c2d29be59c63b"; + sha512.doc = "431f1d8306bb623834ef5f5d732e8fc413947b5f3d31d07874fc9d7ad0897046a4cf919e6e2e520b23eb9f268cfbdaf547dfe7e8e72d44ba92ba9cf3b7a4fabc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.06b"; +}; +pst-circ = { + revision = 60464; + shortdesc = "PSTricks package for drawing electric circuits"; + stripPrefix = 0; + sha512.run = "2335b728be1227d4631e09c3994e9e1f559839e871e29854e700ed74b9031a7d2ea58cc744d20b459c99f1954b7faaecc2ced19c449e98b97fe26b2fa71755da"; + sha512.doc = "c2eb37603cbba656eb1282130e112d0c3bbb49d4b3703c3d9b19d0d250d272d31fd19d2790c97cf8cd5226b0735e8466eab824a35754f41d7584208e606a6ce7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.19"; +}; +pst-coil = { + revision = 62977; + shortdesc = "A PSTricks package for coils, etc"; + stripPrefix = 0; + sha512.run = "bf6e1671f6c1d6d7fe348958042892a10168cf96e8626e4d15cb34089110677ede3535abf96e76847b6ad8d3ca910030e975e7b52fe8b168136c98a05f6915f3"; + sha512.doc = "84fb627c91d56e1553325c8d87981ba6ab1001b8f0163b45bf1a7352026853c8d086350191a4f98c01bd6d59bb5f4b638275c38b45eae6d360c8dbba1a5b8867"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.07"; +}; +pst-contourplot = { + revision = 48230; + shortdesc = "Draw implicit functions using the \"marching squares\" algorithm"; + stripPrefix = 0; + sha512.run = "9930e77c3ac5adcd9e3f14c4785a52a79fe5068b5ee239d1c9f052181657d2c5f16b082a8900b9571094ec83b7326be28a567dd39876332e5f68aa6b1c1b7083"; + sha512.doc = "1a52121a22c829c9c5423810f529cbc4cf3e49a805ec4fae123dd795dfc8fc87bebb13653a9d173ca962bba716c8428effa4410e48085af4bb208331e4e89bce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +pst-cox = { + revision = 15878; + shortdesc = "Drawing regular complex polytopes with PSTricks"; + stripPrefix = 0; + sha512.run = "b7e0e787e5a6d825383a5c06d7aba34e5d7cb12258925b7f0384ec069e873a6652e421f963147648903f6bf063d9592089adee5b043f24dac10e30dc344f0608"; + sha512.doc = "1de830f83253ef11f092c9ec0e698ff36971c7b6d4237c8eb9f6712bde051b9302d657faa21bf56d34287c838453c611ef1a7c70c09e55ea647bad48ca216e1e"; + hasRunfiles = true; + license = [ "lgpl2" ]; + version = "0.98_Beta"; +}; +pst-dart = { + revision = 60476; + shortdesc = "Plotting dart boards"; + stripPrefix = 0; + sha512.run = "f8d2665eefeb791672864ae5fe17aebe6b83ca776a6170c46672cce02ab639fcffb011afd922b1dc9abb98a70d6f81cf4b00321e2b69542d532c3c72341e28ac"; + sha512.doc = "a0c747f8736607f920174b2a80ab07563d1cc7114d6e2e751f7e2d9835eed9f656f4b57b7b9061ad8501f4d6ba26c1fad37825b3819be1060782050ece94199f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +pst-dbicons = { + revision = 17556; + shortdesc = "Support for drawing ER diagrams"; + stripPrefix = 0; + sha512.run = "a09ba8f72ecc1b58298b436c47d3922b494337179bdf789468aa3a2236a5e2bd0f9ddd9b491c1a2eb181d08090cc1c6d8c4a0e9e56cb8619a65ce168d7efd355"; + sha512.doc = "fc0a74b0ca228ff598f3f88840ad1b87654cd7205afb757e6eb6d98abb0cd56cea0ac3ad7b3464a9a5b09d3d4f3a8489228b19c78edc8ceeb8b10f5d40e18540"; + sha512.source = "ad710329d577b7da464028bc0abe684d987a601b6ea68cbbbeafbc6135c3ade2ab124026ba0e1d714984251f800028ffd018863c9bb51aa8fae4b5b7ebff02f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.16"; +}; +pst-diffraction = { + revision = 62977; + shortdesc = "Print diffraction patterns from various apertures"; + stripPrefix = 0; + sha512.run = "15db0252472e17f5d4d702d98961babecacaf7753c15ff8e615199f868605e133188c996756cd6cb5b379616a494454dadeef36678709eae8128b0c69623f417"; + sha512.doc = "a90ff70c942ccf4526ad82b83c0666db05b3aecec3e3b00fc572a7aeeceaf6487407b178e00b929c6d3402752d0b96d345735c5731ce2046fabb156df2703c07"; + sha512.source = "b5df7c25649efb0fb2143428e7a67f3abffe9ace683c738a45e38a2c1714cbab6fbf009decefd829fd5f17c1c3cfc4859ee9abc3d428f110937f94f4bfa44070"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.03"; +}; +pst-electricfield = { + revision = 29803; + shortdesc = "Draw electric field and equipotential lines with PSTricks"; + stripPrefix = 0; + sha512.run = "db9f7474d8290640d960f411574b6dad9f9b705eaf68644e001ebfc5050328673f0c1c31f925c6a2cd2279b9bb7ff89cf8d21e71a99e4b937137af404d046df0"; + sha512.doc = "9d89a2818a56bed9e3cda9069f91cb49beb0182e0b24474051bb28c4299439a7b5477d09fa1caf23b855226d4d4441e48c9fba4a4dd1cd5eaf044a608876e5ae"; + sha512.source = "89d6b2314db2840f70d99f2f0e66a875b47cc2e653bbd28c80a71eaf6f7d269e647e84b5bbf5ab7349d8a45412b824f9ae7d0c4ce9c4703f82258418b82e8867"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.14"; +}; +pst-eps = { + revision = 15878; + shortdesc = "Create EPS files from PSTricks figures"; + stripPrefix = 0; + sha512.run = "90be1124bd22958b0a9cbb45a3b76513e514131c416c98d7f70ca101e7841980c33bd8380e888054cedb873143aad168b0dc25918d9e241f763b9be3ea1a76d6"; + sha512.doc = "70542680c550bc11bef851cfcd12010e17f35dd75adfa390ffadc7b920c2b357594ca514fcdeaafcf1bfcf1b9e622b23c680adbc64ae4787fa96ff94f9a62add"; + sha512.source = "97e2adee4ce93de77d4d46946795565dfa0e0da188fd686bf96917b1220661510c1777fb7d025ac6dfca816bb8575487d45b180e4e35cade21353dcf4a8e5540"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pst-eucl = { + revision = 66924; + shortdesc = "Euclidian geometry with PSTricks"; + stripPrefix = 0; + sha512.run = "9310a2ce965b8cf9b03aff8c505515cbe386e12fc5973a4d8f26bcf2541a856605c8f14849baf649b1d1c24219dd4fec6ea5375ea43e8ff533171dde4e7d5ea7"; + sha512.doc = "1054740975d1be6100ca269221925af22fd1760a5f88ad942be398a889f59209da79e31c53c702a02fe639d218d80820c3f1d1033349c283e9fb6e05c7e7643e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.77"; +}; +pst-eucl-translation-bg = { + revision = 19296; + shortdesc = "Bulgarian translation of the pst-eucl documentation"; + stripPrefix = 0; + sha512.run = "ba2a7a76db77f4db3a548654e53d587b8f5b3dab9fef56b1f8c2640bcace64237e0bea5129025a07a490a2660ccd019fc5e83e3db504c6cd30b12b19df755f8d"; + sha512.doc = "9f6d0153e79a205d0fce5b289fa43317ded0b70abc06139a503b98199584e8cb12b083c8235b6b53ff2a80cf249a4a43cefd3e0b39a9a406c62c1e684bcb35eb"; + license = [ "lppl13c" ]; + version = "1.3.2"; +}; +pst-exa = { + revision = 45289; + shortdesc = "Typeset PSTricks examples, with code"; + stripPrefix = 0; + sha512.run = "af3bf68bf2401e0bd7023762748180bbedae1a34fa749b02cccd6b498f1f7ed0ca0e929e1b290f9b4f56b7f30718cc602d54b348e23f73c4cfb4d72ea22ffa4c"; + sha512.doc = "9f0310ad130ad4693575e33bb2f2deb795a8eb4cc6b3f5fa946095d979ad8a1a348feca0ee5421b4831fd16a1de23608013b69d027b0dd37f782113e7de868bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.06"; +}; +pst-feyn = { + revision = 48781; + shortdesc = "Draw graphical elements for Feynman diagrams"; + stripPrefix = 0; + sha512.run = "c1ac123bac3f92fd92321387be28f519963ab196fde7ead8ed6b4c93ff9fe5cdf07bfee65bef67b9cd70d020adfa99c72592df9be376d69c5dadcb8bd0d6963b"; + sha512.doc = "e30fc57ace8fb4f0c36fd1a07415e894abe6840592a9a62b9e45c0663281a79532387f5d37136e9cb5e7b27f4c0d7722e6d1a9779e1a57a2fddbd8d0324d1424"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +pst-fill = { + revision = 60671; + shortdesc = "Fill or tile areas with PSTricks"; + stripPrefix = 0; + sha512.run = "5fa4ae2e862a9297073bf0559dc46d44109d1153571eb8538650410c96f5c43a9a8c85a379690820f63a5198ac1983fdeb514bf4b1342349352f1a16ef3ee375"; + sha512.doc = "ad51d3aba8d9ee19b4a53081a5956e8cf26f2673faf521af088076c6a356e321ca2fb9a0b504e61529c5a2ae49480b3918bd12235a66ad5c45035ce92e2eae92"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-fit = { + revision = 45109; + shortdesc = "Macros for curve fitting"; + stripPrefix = 0; + sha512.run = "ede8c3503963f44d65caf46975cebdad296576742a771243914b49c6d802deb2f24e816dde7fd9a4bea7fa0c39965693575676ebeb648da099d88ee50bdacb8b"; + sha512.doc = "c8619c7c98cd42884637de98c88d916e18db273371fd64090d5e9789570153b2508f0adb90fbec9c5184f6ef1ab24559b04daccf8dae7c5f65453044b9bfb73e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-flags = { + revision = 65501; + shortdesc = "Draw flags of countries using PSTricks"; + stripPrefix = 0; + sha512.run = "142a1d78f1423474a935bcc977964eeec310f0e8d8037149f4f5fbf691789f0a9f2986630f629cacf319e34ee640902556b0b59145ef2a763006618c65e21f49"; + sha512.doc = "4c8bed4fa6f527fd5e0262692cf4acfd52d36bfe8461acb97615c127ab54336ada7a274ed9e5a7a75d26cf764c2f63734aa75d5bc45ec833f3b77b6179fa74fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +pst-fr3d = { + revision = 15878; + shortdesc = "Draw 3-dimensional framed boxes using PSTricks"; + stripPrefix = 0; + sha512.run = "ccd418ac7ac5ee1885cd2b7008e867c08cc0fc13fa97e264377446d301cef1caa82b8552731a4c7d3131f0e2ddaa0267276d5b1726998a0be2f149ac67bbffcd"; + sha512.doc = "48c559c27999b06d63ab5c33c9779d0902e05c80c51ba9225f0def724e02892557deda44add976bd5fb73403bbc2615854ef9ea398b830357f0fa5be12702e74"; + sha512.source = "7fde5941ebf78da6f5142d07963aba36f2c298e46c2125f5ec210830f5f3694b3b1a8bd4b342b6065fdefcce1e5807321f379d030b0950d3ca5dcad30ed2ae3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +pst-fractal = { + revision = 64714; + shortdesc = "Draw fractal sets using PSTricks"; + stripPrefix = 0; + sha512.run = "c52e3684398956e0cb1c79c9d1fc145e3b012d011d60bae1a756686529cff076331bb1e8d1895fc2dc46fbda8616a1ecf5c30991778b6041cd40e79fcad32f25"; + sha512.doc = "657b15f4342764d64aa54c1bf8a86be16ff859c7810e86f85db0b5c5a32064b1caf57944cea09a267f7c5bebad9db7ffdbce5d33a57c65045dab7f3c1d5eecd1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12"; +}; +pst-fun = { + revision = 17909; + shortdesc = "Draw \"funny\" objects with PSTricks"; + stripPrefix = 0; + sha512.run = "68d0c52bb40354a72b2eb14d2c10a18266badedd452a57e4c2a9aaad343b94f5c13f89853962e85c94ebed9274e87c44cc4ac1fd0203ec54097f71e5c4a15fdb"; + sha512.doc = "b4f498e3f9d97be8fb8918abe5139d431656b52ac592ce9f3155c6dc7afcea17e51996dbb275968950dfae179b336ef923b2d88efb4b77506c64b5c775920d38"; + sha512.source = "4cdd6ea161216ee5d8be410b96749ae52d212e75691de0a9012ee6f0b5044d14c5be4e8615a6bc3b3b22f8a8fa99a75977fb264730ae64218b20898444793dd7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.04"; +}; +pst-func = { + revision = 66845; + shortdesc = "PSTricks package for plotting mathematical functions"; + stripPrefix = 0; + sha512.run = "28c50cbd77b2400cd262b8156c01c2adf655da279a33703502d79590174824b0470a788db1a04c7439c63d1870eefa19a559f6f76c0c80c076cfb259eb920970"; + sha512.doc = "b25be44e2e42b35ac48730aeb2d705082b99d5bead17119e1c5e353790f25aabd294043f753291265dd102ad7d8448c1592e5fa486fda317c1e8bd03aa1a3ca4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-gantt = { + revision = 35832; + shortdesc = "Draw GANTT charts with PSTricks"; + stripPrefix = 0; + sha512.run = "61b59f922129de60bf954145a0c83a5bb4c0232270b8213b45856a69ca56f32a9525d70ba86e51f95fa1c8836d4922a0dec971dea16f13f0c2f83c80fbfefc56"; + sha512.doc = "950a55218077d7203988c42c83445bfb10f53c7292cb85bb4178ab20b9f1404ab4a864266e52c3af074c45cc27b6777dae71af41caf270143160d3d59e222731"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.22a"; +}; +pst-geo = { + revision = 60387; + shortdesc = "Geographical Projections"; + stripPrefix = 0; + sha512.run = "4e97b80679129df2cf52a8998e1b131b7ed5ebd21046219843af1ca81272a84c3a8fca72810622a7215385207eb541cd2bfac65b791920da61c233f969423c3b"; + sha512.doc = "7dde4c2584eb3c538a21fadfb9c49db02ad190b0778b64a4a51be7b777b4971302151a4f6ee7c5fb29f6c156c34a420b1734471f550d541bd2eb87877ab1543e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07"; +}; +pst-geometrictools = { + revision = 61430; + shortdesc = "A PSTricks package to draw geometric tools"; + stripPrefix = 0; + sha512.run = "838ddf95e3ba7a13fcdb5cf97d85647cb6b15bb6735947d26e358af83a34a4d5bf55530c4624f006eff4a9f0794d1fd7f5a3ed351607243e31537e36bda33b96"; + sha512.doc = "4b7d2316dff80420ed5ce03046115670a4ad51c705dd960f56f6e7debf20b0d3c86030d93cc635410e01535aec1b42dd3497d18126e6c86bb9304c5cd506306d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +pst-gr3d = { + revision = 15878; + shortdesc = "Three dimensional grids with PSTricks"; + stripPrefix = 0; + sha512.run = "85cbaa41c3cce49aeda36ef55a89122370fc23dc91c5e5e63790aff2b8b748eb6a13a9a921836b2a471ab2deb9577ecf59be0bc6dfa4d2f1ddcf17bc33ca4264"; + sha512.doc = "bd9026c7730dce9c09a092cc420fa7ca8d7c85db4a1f9a665a64f933595b43397027904c08311ab2301305f79a426a1b726b8df2c237c8a545726fadf9b8ed30"; + sha512.source = "ce6786ec803ceeb33fd42d2d786d119ec2f604c1d4b4f7a51c6e9ce9e4171f01fff33b66b234a5af854e5bee24f23bb50abb898ab89c568150a50ffd8ff7d582"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.34"; +}; +pst-grad = { + revision = 15878; + shortdesc = "Filling with colour gradients, using PSTricks"; + stripPrefix = 0; + sha512.run = "f98fe4e4996e20947d90ef24d6825d72a8ceb6bbd586b0de9b90d5d73208816395e5b195dcda2816c8e709fa4c408f3b814c02911488c83a207039d28654b9e3"; + sha512.doc = "11f4a4de67f92bb2ba77457b5940e2b848985de111e3307215981e6d39617b8590316de5cb6e5002748d9e951be405e3f938d1708c28a7970be53808688c10ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.06"; +}; +pst-graphicx = { + revision = 21717; + shortdesc = "A PSTricks-compatible graphicx for use with Plain TeX"; + stripPrefix = 0; + sha512.run = "0d3f2d072a7bbb58ff555add4df7347a4dcba929bfba49d25dbf6b95956462a3fda07818135fe40f737151f323a27225983f656389f9a91a8295145ebf2877a1"; + sha512.doc = "8deba57cafa74987ff7dd22b52db699fef2067dfb62e8e2c7e8e17b662f1d7644278272ee97209b3c109345ae8c295e125d1b195ff68cdfa8362eb3b7ad1bc84"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-hsb = { + revision = 66739; + shortdesc = "Curves with continuous colours"; + stripPrefix = 0; + sha512.run = "d3eef4f4672b938b84d1fafbf22889f9d7116af9a0574a95bfe2a7225d4a7185abcfb862ba7309fca924993f9665f2086a35edde97306c4b2311cf18f1763929"; + sha512.doc = "a2664b558f51c43ead6c078f0895f4a6c5c55045b8485e7f564bac10279b997fe082279e3cf2c35a7f47f78fd826ecc5a65daff112dc8659768c3b6275b7c854"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +pst-infixplot = { + revision = 15878; + shortdesc = "Using PSTricks plotting capacities with infix expressions rather than RPN"; + stripPrefix = 0; + sha512.run = "a8e69a4bc20752d5f6d455f34fc4810e569a5f444de257c1b50c76d567a23d868b0e19c9f4656370a12d3a53ef35ad43e7dcc946782c19ef76091634bc2440a0"; + sha512.doc = "0b6958f851af834917ab04f39bf60d50e26eb61ea52c9dee91274714ec0a87519323b1f9ef7d665f0a6d05cc97e6f8b1bf51617f2c57a5d80ebb96ba1aa94306"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +pst-intersect = { + revision = 33210; + shortdesc = "Compute intersections of arbitrary curves"; + stripPrefix = 0; + sha512.run = "847a2532362e570d3e14ac4aadedf0cf1ac0f2da1991837abcb6cbfa607357d8a451d852bec9be50ea8b2995716613475c4c1ea1c3766169902eb82e70aaba0c"; + sha512.doc = "e8775b9d8adbab9e7ce63d595cb70747dc3d850c4b43095e1a35f6be8093b61ec92457c7fcf6565484e62b1aa7bec82700d8ccb2dc8dca0089e56bc8be5e762a"; + sha512.source = "87bbc6bb4d4b43d6c1e93e89d7d96c5f9941187181eb93814110e3930255d6ac6c95d81a53a6ed440f6bd4fd8c38725e4cf5763467722465cf941c4cc16b5841"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +pst-jtree = { + revision = 20946; + shortdesc = "Typeset complex trees for linguists"; + stripPrefix = 0; + sha512.run = "9947e00e7fdac25f25f1f828ff5b9a3b962b1d033c57232d2d47736ee7a675ee48367aa934153ec17ae3f2eaa763044dc067d83b2248c5f42a93eb5d9a79e292"; + sha512.doc = "4d0a2432e9880a71f1d7b6a9965dfacbebeb44ea2586fd428fa58f634d7670d763e9ac293aeec6adda6cdef98736a7b5d341ec41d89bf3999c4cfee9066001ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6"; +}; +pst-knot = { + revision = 16033; + shortdesc = "PSTricks package for displaying knots"; + stripPrefix = 0; + sha512.run = "f481b82e5d21dd86eef3cf64ecedc45420b33e43619574f072a050fd70a6446ef8d527607ed5a929443ff6976cc94a03817837c8776bb2ee9794fec80a4c0751"; + sha512.doc = "a8a82ce955b707c6ecb319783cdc4fc8406411dc8d711321919413d84ca42197828e69ae2b6b368a4b5b326650caf5393cb2214a7cd8b7bc0cff742b9b0d977c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +pst-labo = { + revision = 67147; + shortdesc = "Draw objects for Chemistry laboratories"; + stripPrefix = 0; + sha512.run = "d04fe4359a34f466d306265919bb13483d5105d6c77c8e297f1f964fc8224b6923773c4d3a0c58f8dd9b809deddb4dfd4f99f205f09de6a9e64a2398b17b7ae8"; + sha512.doc = "98d55a590607e78c55402af375fd25dbe1d44bb4793d5dd3327311f9e9457e8b6073cebfa3dc993560d5144426e8195ec450b030a8897c84c8b711afa28a3f91"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.06"; +}; +pst-layout = { + revision = 29803; + shortdesc = "Page layout macros based on PSTricks packages"; + stripPrefix = 0; + sha512.run = "6d4c06efe0d0095ba52eeee25ffdaf44f836e1e41840d8098e25c6fd3b5ee79d28663ef7f02ddd7d1ba21228bf4f9bd5a66548e3aef642a49cc9aab5b4b24fba"; + sha512.doc = "fa32cd065979fcaf2105372155ae8debb399a0f930d6b85e7ca4a69d8b76bc0d7fb717ebdc8fa4c9794ea03268c2079b93e0bd6453155bf5925defb75cf05e08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = ".95"; +}; +pst-lens = { + revision = 15878; + shortdesc = "Lenses with PSTricks"; + stripPrefix = 0; + sha512.run = "406bc53d476d47d464f7fb318e75a5aeac85cf4239ab916e91728f5d8c0c05a9fd4c4fbc24b4b058f1c15d1ee4c6a0d45511b8cf6b288bf10163523b2bed0f37"; + sha512.doc = "8d29f5014e0bae5d1fb22483ca3231e3631c76820be080b3a588660f868ece861c2d816291656a45c8a33356b992cd6e2396e9d73f4ab316b877b2ed8b778f7e"; + sha512.source = "7546475681934697c5fbe287d9d0c81c4532cfb07537ce0184addac26a3c29e4a37da5e12d9ac3e64f83436c07ccd9ca360ca276f77cefbb9c23c740b15bab65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-light3d = { + revision = 15878; + shortdesc = "Three dimensional lighting effects (PSTricks)"; + stripPrefix = 0; + sha512.run = "2bcfd2835e20302ec865667a44af8dec63c6c006c8a3e39b048464e129ef04300d0d7c2e23f324a8acee0e1ae1439e75ce642f7b76a8f1958d600546ac7c220c"; + sha512.doc = "166f47222230e24530508e3ca66c881dcc844cb8cb35b92fdbeab164b964ebf2928df3068d79467fc8a9a8a4db81d2be48350036169605365bda116cbd86d095"; + sha512.source = "8edab208ea567672bbfa0252fb4180abd8134702058223f04ab23c3ac92dca98f4946ffc31620b9d65376ae41c819038403ad3bd7c9162cabf8efcf7d4d57362"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12"; +}; +pst-lsystem = { + revision = 49556; + shortdesc = "Create images based on a L-system"; + stripPrefix = 0; + sha512.run = "0da3611c401895f508b6963c46f781863ab6b42ced2addf3413b74ff1c14daf42cdfb5c166072e18427871ed6d06c5cfe3b185f0af30cb25db2f346828ee1682"; + sha512.doc = "0b277cd979f4a12abb57b8e6d2562b156bba74e0ca46da10da17a6bc505c6747592b5f19c5a3e9b72f99bffabcb45298663c6dca33c875c923408646c4c5f6d8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-magneticfield = { + revision = 69493; + shortdesc = "Plotting a magnetic field with PSTricks"; + stripPrefix = 0; + sha512.run = "c0260df43810caa61a033b835e1e60544421e008832091ead56fde4140234a878ba31dd5e98777fc3a58b3e6247daef9a80da63d7131a717e73f1c935db7fcf2"; + sha512.doc = "98f0e0464e41b12474bb5b5c6e931d7da60206b766a39877f36d3d8f68a016ed7c9772483b1cf30d46a83a9a05576093b2048579ae8d4133806198602f3aaf10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.17a"; +}; +pst-marble = { + revision = 50925; + shortdesc = "A PSTricks package to draw marble-like patterns"; + stripPrefix = 0; + sha512.run = "e16ea0ed61c6548d43746f251bf8581a00863370b73d46077e5510fd167d63a539ab4543f0ad7db704571b5274cc5756fb713e5182c8abea404708215a98849b"; + sha512.doc = "5684abd4913353b7a4953ed1b5878183f1c10dcc1bdecea6f3e9e6adef7c73c7f16cdade2b5e18f4a645c203dfb15a3917740a7638c410002eab892bc5ca6acd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +pst-math = { + revision = 67535; + shortdesc = "Enhancement of PostScript math operators to use with PSTricks"; + stripPrefix = 0; + sha512.run = "12bd81bed4fc5de91cd4db49cb97a9911848c347a9a9325cb61637368bda4e0f35f9c5c348bd385d46907b61aa06682ae1a9d70616d4c5c81659550064d4cc0c"; + sha512.doc = "1b07b3086fa3e1d12f255632ceddf5b30c219472763cc43c0649b669a6014bb76e3a0fe7c182d0ea24c54fee8d2efe8399867321992e20f7f418d28198661bd2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.67"; +}; +pst-mirror = { + revision = 60506; + shortdesc = "Images on a spherical mirror"; + stripPrefix = 0; + sha512.run = "316a6cd32fb2b8c59f554a49695ad097627e641982d1a6a8b1e5db12949c2cc84dd150a190834604d57ca10735779cb09983c28e7339e92f3cb82d642dc9b61b"; + sha512.doc = "f577868d1cf76a372a3c248f6dde28ed423beaa5e445a6a343d9b5e4c2ab9f737e4266c12702fcbf6dda91a6639624ff99b4cba29d65ebd4c7a0c3f3ce1323b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-moire = { + revision = 60411; + shortdesc = "A PSTricks package to draw moire patterns"; + stripPrefix = 0; + sha512.run = "60fb7e65170ec16f08f4109794afd657436fbb42a18feaff2997fdef20e18376810c3b34e0e341a5e577a6d08d6bf6314adfa51611d83a4e66245f112581d678"; + sha512.doc = "f24fb6a5a34a09f7b519f864c40d4bb4afd4b37f12280877fa9e6edae48a655c12bdf13eb7d13e9ce43ffa849a183c6a81b8040f61d90e9ec514b07352fced3c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +pst-node = { + revision = 61838; + shortdesc = "Nodes and node connections in PSTricks"; + stripPrefix = 0; + sha512.run = "663d072baef5277519157175183313c9b80385d1574dbbc1502b60aabd111688286499426e88d28b3b5252b8ff23b3d325981b6e14b846fce3b92ff391ab5a7c"; + sha512.doc = "5cf9cb60b0c36915945a4e2fb4e79a35e2ff9e957df1b1e39d8158560843fe1dae6867aa6270e70cf3ba387b104e9dd8b6965434168d89748e65aa77368a0707"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.43"; +}; +pst-ob3d = { + revision = 54514; + shortdesc = "Three dimensional objects using PSTricks"; + stripPrefix = 0; + sha512.run = "19cdca2466071a1c6236fd4c149d4962dab3aa0b0c097fa408ea60c2bb46011173033bff02d33f596c8a413ad781c14f785b39bc28be4c85aa66480cb8a7e295"; + sha512.doc = "78ea80a6d63ccbc69640e6e18e8ef43526fd4d4b51a63dccd23429ea44843a0f99f522bc34a7cc88d6ffe48843313da64c550464f28ad48726554bf74b9e9cc5"; + sha512.source = "a0827ae0fb0ba2072894bfc284234eb301c982972d8333866cc8b66ff754e85b837fa024083ae31d637ba941569ae491a85bbe62ab32adf0fb99bbe3ecd019ed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.22"; +}; +pst-ode = { + revision = 69296; + shortdesc = "Solving initial value problems for sets of Ordinary Differential Equations"; + stripPrefix = 0; + sha512.run = "1474e118f16c644c7d63ec89a42ea598443cdeed56e965fb85bc75adea4a8d5572a49f07417786682844523d30438a0a2798e9e5635879891f039453e53c4264"; + sha512.doc = "f46dfac052060fbe8f41d74a59e85c3f7b0d0d25bf2b65209e7bb53d6478947fcd4a2af9b5e68bbe585afe94fa53ccd80aa80f2e1e21b68210d38fbd114b217b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.19"; +}; +pst-optexp = { + revision = 62977; + shortdesc = "Drawing optical experimental setups"; + stripPrefix = 0; + sha512.run = "a72c425dc808ab5a4507691c9a86ad2193c08f8e88d62ea558d2559b68e18e9dfd8e0295bc18fd66e3cf41236c17b85086dc218e46317c09867b5eaf024564fe"; + sha512.doc = "6c4f4427b023b6dccaf75ac2cab2c22da32d0fbe6007c68e05b9ced31b11da91e5537ae4dd174a726b36ff2657113bc07e1b054e9dff344a9dd99f3039be97f6"; + sha512.source = "8f3f7cdddc2b26ff9adce1cb60fd165fdecfc0b3b61cbb827e52f97702cce602312bad4838f2ed96a8d07d1deda4f5226a305c7796a8794b6cafb821c8b745a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.1"; +}; +pst-optic = { + revision = 67052; + shortdesc = "Drawing optics diagrams"; + stripPrefix = 0; + sha512.run = "132b3eb936678d51a4581efc14998c794047959f89789ed22098326912d00eaa0e39396608d3c1aa78f1fe8bccb21ba2ab454bd2b3744ba252c24f164c58e23c"; + sha512.doc = "a7169c870dbcb336025aec5d475afa9691ee524b35ef3404f2e3244c4e4c0f08def16a8eb458eed1a8ebce27c969ec80004904484615588fdbb401b863052efb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02a"; +}; +pst-osci = { + revision = 68781; + shortdesc = "Oscgons with PSTricks"; + stripPrefix = 0; + sha512.run = "c888d41f7e14cf311b359fd37aa0557fc9fc639b76dd5db782099f6d307c4e5e3214df2a670fcdd3625818e461c34ccc0e50ba617714e58aced1c71b484b63d8"; + sha512.doc = "5abb2eb53cb6cf1492c9bfad164ef8ed1088e6b6cbe1f0af6bf0ec10b34de3c5b17163e2bcfa52bf0b4394f3945887ed0e532fdc6a8497189325d10db50f4577"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.82b"; +}; +pst-ovl = { + revision = 54963; + shortdesc = "Create and manage graphical overlays"; + stripPrefix = 0; + sha512.run = "e3349edf9643e5d9e370b5dbf1c4dc3078ec82520c943a81ae353e1ccd0e2476105813b0cbbbeb707de5419035edcc39748c7e86a69cb90f8bc0d61d70f553c5"; + sha512.doc = "755c786cec204ad3dd41043d8dd1bebb33ebbd889580a0a85390ca8efc318076ec9300a8e38b99788bf348a49dbda8ba5f3c758ace788bd9de47c251dd4e0407"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.07b"; +}; +pst-pad = { + revision = 15878; + shortdesc = "Draw simple attachment systems with PSTricks"; + stripPrefix = 0; + sha512.run = "cf519f69dfd1003ab17a4a67f309336442bf35497cd0102e346ab8537865540c314666fbf01cf6e3e106ce922fd8922ac4bbb5b20ee90a7ce24a7a98ee974006"; + sha512.doc = "0a2206d3ef84dce88d3e0ea7899fb623d12f7f6a820298b031ff76044eb9ec49bb09f70f6ee0b00018fcc02f6260d67ee58c8a06a48ddbfd2e5b17f52d374830"; + sha512.source = "ffd5ef230c25a731e5127cda390b60fdc275d53a833f8fd02ef8fda7b959d7ef5e2074637af603f1e510cd558cb3de22245bc34f91bb7114269425d3b4db211f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3b"; +}; +pst-pdf = { + revision = 56622; + shortdesc = "Make PDF versions of graphics by processing between runs"; + sha512.run = "5f5850f0e908bf6b10977bf616aa82ce05d1f0afd4127b5db14379a510ca62614a3552cc85ec0136805fb479201c817442872f9d1074fa6cc1367f41403476e1"; + sha512.doc = "eb5013040f3774e81d019c0010e8fb507d22cb2fb9c74e75f2c14aa0e4edd20245ddaaa3744fec7204c607b5f6329425f8f2b6e09bd153e6df6a3ae39d1e1625"; + sha512.source = "1c353ad8d3b62fd5e5bb8746f69f00b8df2c7b53dd558ec8b24d571b1fe84fdab02daa4d7193f67a258c7390d50f25cd5270578d742b085634980eefc744b09e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2f"; +}; +pst-pdf.binfiles = [ + "ps4pdf" +]; +pst-pdgr = { + revision = 45875; + shortdesc = "Draw medical pedigrees using PSTricks"; + stripPrefix = 0; + sha512.run = "c42b723e2739eb3a70f7a984d45b6b738a1dab1f4f3bb7311850c344be736fbc97ababb6f744539deddc7d1cbde47830e81d1bfd42f705a7287b1fb970664823"; + sha512.doc = "006395a2e1caebf8c86f4eb41eeb03a35d47b82e65e18ce4045eb22f93bc78a38f7611a1328216712d29be852fa3431876254f3b41b8b7a2a7c453f32a8e1bf7"; + sha512.source = "e576ffab3eb1b0094bf7514ea996146c1d73abc5f68a47f3cdccf5e7fe7eec133a21511e9d1107ef20541750b12766899bd3c925e09be931b1e0e2a1cee376d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +pst-perspective = { + revision = 39585; + shortdesc = "Draw perspective views using PSTricks"; + stripPrefix = 0; + sha512.run = "b1c6c1313e0f87d7c4dbc7122d09777f14f02ad0908c6151fb5da905d908a9ca2d905c5a9e3fb1e54deb0b7b91dda1488de0b96ff40683488947985d68e2d331"; + sha512.doc = "df82bc95d3720f7da3c23736d83fbaeae5132f7b84aea9f2fd8ddf925f919e5d56f6701bf5b541446c024e8d2f6a5875d562d96cdb1564dae92d6ade759671cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.05"; +}; +pst-platon = { + revision = 16538; + shortdesc = "Platonic solids in PSTricks"; + stripPrefix = 0; + sha512.run = "8eade14982b0ffa2c5e7d5c68a91d4159ee6f3317b20836c3f470ed68940a522459bdce54b1e1dd4068173e50b0c611531d1210b1651d805602f952a1696626c"; + sha512.doc = "7c252b535853c4941fc4cdbe504a3c20ece2c04dd15e2bc5ea0c88928b5fdd7063035c329dccb7ed04d71606e70f632fc1d66847dd35ea46a4626c04070974be"; + sha512.source = "092665b806f358201f0dc1b0010796c2090b84cf31d1f0e9e33d2ce370049f0e7f65ebac23cf9841f770df8c61c22bdea60e583474694311c7e3fb4fd71ced6f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +pst-plot = { + revision = 65346; + shortdesc = "Plot data using PSTricks"; + stripPrefix = 0; + sha512.run = "a273a0999f14697ffec4165c8f6013821f9a3439bb7822963e79d4b362a89334090af54d591f7cbff1f59d0e15e9b18dbc3ed9d711ba90162913098dcec67684"; + sha512.doc = "870ef12eaebc4078ac0906cdfc225991714a55dd674cf7b757ab7b7925728ab771bc63612c61e26a997d900f8c03ec4d439d767b0a83fa54b8a65517399fbd7e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.94"; +}; +pst-poker = { + revision = 65818; + shortdesc = "Drawing poker cards"; + stripPrefix = 0; + sha512.run = "850b8302f7754e90559ba43ff3cd7440866b23cdbf7d3d577a75a232533d750917d3dc7ee9554ded07e6cc38346905da82e49bb90bbbe4de0f02c40fbebd111f"; + sha512.doc = "d021da1775a7f91968490bb4e2ef5fc8eac114fe33810d069882e72e381ec94e0cb81f4ea213edd394b5919e07873838996b3aa0f043fcc41814969e59db8a21"; + hasRunfiles = true; + license = [ "lgpl3" ]; + version = "0.03b"; +}; +pst-poly = { + revision = 35062; + shortdesc = "Polygons with PSTricks"; + stripPrefix = 0; + sha512.run = "badd0fcc2b439ba270d5375703f91df9009fb7eae920915eab8757185da0c6665c34d530d9b4d8bf469767dd79ee834ded104a0fd98243a1e8a17cda47be0f79"; + sha512.doc = "0facae2d565a22853a6e455534065f5954571311898e0850fcee7b18909f1cd0fe06b116138faedda6767d8514d44f7d843c13985f8723ccb8ec03a81bbaa46a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.63"; +}; +pst-pulley = { + revision = 62977; + shortdesc = "Plot pulleys, using PSTricks"; + stripPrefix = 0; + sha512.run = "e9e3f27eb01146a6aac0f9479f8c7bf120845a9c728f7e08296d95dc3cbbfd7d4eac6cadc0e7195848157929d5001fd9a1a7b9c2daf4ad97e28e0007ba8a22fd"; + sha512.doc = "f7a0820425a1d785a91ed2cd070fb371b6503f1116e1e08a6e97509133ec8d4892bf546deb5b7d3c0fcb343a65f2b41c1e2c2400e23ca8dacc075e2dbd27c3fa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-qtree = { + revision = 15878; + shortdesc = "Simple syntax for trees"; + stripPrefix = 0; + sha512.run = "5bbb7fdd477850e4e6c2bc395665c50668a427cbe176122d160fdfc2aa2f322ed83ec43929dd185fa1dec439bec3f5de719aa8d640d0bc498aa7ac9f9089cd5b"; + sha512.doc = "4a0bba9fa7072e5860403c3b22a23947045106fd4b89781af848d17afbc5ac456c77617979ebcb80afe07620ab8b990e868c688301c4637804d32790fa4bd7f4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +pst-rputover = { + revision = 44724; + shortdesc = "Place text over objects without obscuring background colors"; + stripPrefix = 0; + sha512.run = "3bd94d3a37fc8bbabba547a0072618c6e2bd2f6052f95cd4dd8cb973f64c4e97d0c7ef72fbe425df032aacbb8cb109b0eb06ee304b725ddcda6489da2c893934"; + sha512.doc = "16bc8c2500c19cdaeb701da98e4de0ffdc13116a0ed5802beae395e9664ee16acc6341db7d2c3ea7b2a16b0afac35503cd5a53e1ce1fbd67598be4c890b317d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pst-rubans = { + revision = 23464; + shortdesc = "Draw three-dimensional ribbons"; + stripPrefix = 0; + sha512.run = "360f1a04170358b976bc8b6d4d4ee138398f6b018b5611811fc41d90475c474e89fed214708d11b47bdb58cfcf983b37c3338c4d5b13b13825f3388d1562372b"; + sha512.doc = "086f80c0b99a0043769b159b6f52de125f01e6c3b00189b0924c62961b934121b09a2f1634fdeef737b2fc468c392051f8b117e1de5d7e6d223e79ff443c2cae"; + sha512.source = "f62e689c044a0600f4e303251329033e705f3d08b025214af34cc85488f347324d552594a321f88ecf91845b5db5011875436ba9fdb819dbe038dbbe012c4676"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pst-shell = { + revision = 56070; + shortdesc = "Plotting sea shells"; + stripPrefix = 0; + sha512.run = "e6c12f5a1c8eb6b521e6bd3d76609a750bc12633de1645f6991a177d633043f1c5597091b34639079bd007d81302ecfb6715f826ec42353720863885e1d3a1e7"; + sha512.doc = "72185b764b1c282e772341b9c616b27252759f8e0ca3a776770e976a31d160cea7ac74f23a982e088dee50a86a9af73d19f3f695a24f13381e88281c8c33577c"; + sha512.source = "b49620358aa5b8d57c4f227770a59ffe84a751a494ed459c8a61602b3a32621df6a31041311f939c4da6ac2114c5c4381d2ef0cf1ce870ea41081d9d920f5902"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +pst-sigsys = { + revision = 21667; + shortdesc = "Support of signal processing-related disciplines"; + stripPrefix = 0; + sha512.run = "db3d3dd31c4166a132a174cc9b2a86fb226496c663c1ba95b36f6590e18799c5eb4e8587ccc3db5de0d3833729ffa90080cf037519b2a7ba24c70fe381aedad9"; + sha512.doc = "ae2869eaa649898daf057875d28fef1be5f20caf0b7385ba7723e9be51e534cc69b953bba8ad4fa6d04a0d67f85659c82ec08043ba760279a6759c20a2c27d0f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +pst-slpe = { + revision = 24391; + shortdesc = "Sophisticated colour gradients"; + stripPrefix = 0; + sha512.run = "43905d7525acca6d10261e169a1c1ec1ee0cf0d4b7fcd05643dea3f705331588d774649ad5ca560111269025e92a1e91796693c5246e4d2b2816dd33d4eed87b"; + sha512.doc = "377a89c5dcc49e587e3e2d2e1221c289da9dc6b3cc0565bd182d0ec356835309c12eecf68680ac4083c906701365de0068608ee1e49ea9fb95c866a188931a67"; + sha512.source = "f8579912fb5477394f8eb150de776b9a15dad8f67b821a073748910388e06c70b23163fdabe260d55216add2924879f5380915c5d3ebbb21f0da3c65c6f82f73"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.31"; +}; +pst-solarsystem = { + revision = 69675; + shortdesc = "Plot the solar system for a specific date"; + stripPrefix = 0; + sha512.run = "8c977113eb47ea9139cdffe297f0b4e333ddddd5c7f54e2cab2dc29d65c11616e938d9d79a4362901b1715ca9be104ecb6eb72f43b779cb11644520306d8ba7b"; + sha512.doc = "3714132e0ed6d7fecad9215e6ec13af2a74576c43b21faa746adc6caeba16af479e9f35c7d3948ca69a82092d8d6ad2ca07b1b3ba9614dfdd043db1c57cfbd0e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.15"; +}; +pst-solides3d = { + revision = 68786; + shortdesc = "Draw perspective views of 3D solids"; + stripPrefix = 0; + sha512.run = "fef032b9aa9a87711e2c09e0a7213a2c3e70451e64060ba9fad81beeeababdc622ec46107f077ad2869a8ba9420fd81e3e9df96ba60f98530fb3238d4bec45ee"; + sha512.doc = "3bbdf115c8cb4e0dec4deebb1bf8af6317eb0deafa19054404f992f79361a913b26e1523a31105b7fe0addcfef438a016d6b5c5780da564fc108a58f449ee86b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.35a"; +}; +pst-soroban = { + revision = 15878; + shortdesc = "Draw a Soroban using PSTricks"; + stripPrefix = 0; + sha512.run = "c21d3f0e19c4cfcf79563e23e760178de6e39f1f42147f534946fef315c0514968548b30d24eb345f4f2c5cb7807fef4f0d45d8e345e9523806ce1e054d8cf11"; + sha512.doc = "b7c1422ac43df949426581f7dbe749300093ce2d20145df768e21e893b9d2c419ffa8ab16c60fa509f09317bee4c7f80bed4920b92a5f9f2e9289eb93cec5eec"; + sha512.source = "49fb276ae7277b1508ecdcc3132d103e26204f314f8779a556335e1875dd5c3c6768b6b152264ba5643d2c39eb275f7ef193ecb6a292135abba2d60be508d654"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pst-spectra = { + revision = 15878; + shortdesc = "Draw continuum, emission and absorption spectra with PSTricks"; + stripPrefix = 0; + sha512.run = "325e4f07e9c2788d571c6105e1fdc3a097881d1b472b038c365c65a84a4e69e15866750720b2c86f5b20e00fc3a054f619e79b6564fc3712194a1a5d05edf248"; + sha512.doc = "f3655f399c4986b122253c4849bcb15d0ea4d2390b0ec3b8328d8255e5e2d44481198d63c6ad9dc10365095414267285ff02a944c1bf5bfd8c458d1a7cd5a0c5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +pst-spinner = { + revision = 66115; + shortdesc = "Drawing a fidget spinner"; + stripPrefix = 0; + sha512.run = "ec6925c95e398426089234227b29a2129a58097d1536b0f1569c4a0e6b4d7deeb0eaf7d9d5ede851c93cff49da05772b6113ad7ba0cbb34b854e3b2261bdc41b"; + sha512.doc = "1cb4907c6b5feb39c947361176edeeb4da560935d53b3b56507642142f3dd61d98caff293c0d686bb33383c706f1cd865dc3644379564310b141c3f0204cdb57"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-stru = { + revision = 38613; + shortdesc = "Civil engineering diagrams, using PSTricks"; + stripPrefix = 0; + sha512.run = "bc0961c1f9afb68f66c4af9aa9d37cd8cc7c6047f55920d12cfb14a18b2c2288c8468c8d9f0e21eb7e395eaa884f0216b37a6fa947fb2c5ef51d57996ba8bb5f"; + sha512.doc = "b9352eb01e9d80049a474e0b5a513bb8835be16af4226b4f4269d9a94d64b81a842e640ab316f066595b0b6053080042deac4b0cce1bbc602ea0e029f7809cd3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13"; +}; +pst-support = { + revision = 15878; + shortdesc = "Assorted support files for use with PSTricks"; + stripPrefix = 0; + sha512.run = "05ddd6f09d603a2a6887f03aa3da0374ad061e2ab52ad25f0036192179f985f3695b0248c602607172c94c55cd9d2bb453e8f145d73f133bf79a881ccb1daacc"; + sha512.doc = "ab2adb2c06d4f7f4b4a4fbfec59e1fc8d6b9f4ccff5aacc29f0a1524759fc1f0792640e8cc301e614477ad45261bbedb3ede93de2463e0a655aeff846561c185"; + license = [ "lppl13c" ]; +}; +pst-text = { + revision = 49542; + shortdesc = "Text and character manipulation in PSTricks"; + stripPrefix = 0; + sha512.run = "6cf40d3dffb7803959a187f6a19b137b824d46ea73bd31430e983abec0b828d49c6d404287382242ad224e2f51feae74b3bee374443e9f421ae70d1ea2c0c3b6"; + sha512.doc = "87f213f037227c05ceefbcee7ab8a316b88ee6f9ddc366c40cfa7676a714ec6802f3781db8357224769216241feb9171668184534572ebe5c5776c1553c1b62d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +pst-thick = { + revision = 16369; + shortdesc = "Drawing very thick lines and curves"; + stripPrefix = 0; + sha512.run = "5eab2dfdad0c9fad21cbb7d4484f9701bd48b225e881e0c86a2418afa143582aef160bbf4cc9f5a773aea97d2c12c7f614f41fd87f0ff2952c27ddac91f75905"; + sha512.doc = "5d75bab3e4b5c18a14e7348dd97a3f7e0895a2b44111a72d87ff8ce7c7c0499062f61b4ff38b2d36b0632719fd58a33c91f077edc269d74fa58281a83752e9d7"; + sha512.source = "c3cbd54dab4d8e71a2d6e9f94cffb1dc0576344032d3af01c21a4ef0f493c5b886fe6f99e7361f4ca0c9b2e01e68e61e0f8e74b5f511cd1680b20eb01a068030"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pst-tools = { + revision = 60621; + shortdesc = "PSTricks support functions"; + stripPrefix = 0; + sha512.run = "591dbff503faef5316eda8364a422d8810524775e6c6b59569d24928c8702c54463e4433a3c28953d2f36c873aa6a6e52c71dd9cdcce5bb0c362ab2231f5a165"; + sha512.doc = "f61816b6be166d85ae238cf5651e2e1960a5303b3bd3c643e4fdbcc779b5e59f49ffbe53bd6e2830b2bc28289baad3b089eb01ccbd7bee4eb9805728cda4309c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12"; +}; +pst-tree = { + revision = 60421; + shortdesc = "Trees, using PSTricks"; + stripPrefix = 0; + sha512.run = "39d6f88d9b0dd4280cd08cad6524fa693cf727bdbacf16063d76e100e16f957602124ee71421e88f389a7ba5070a932d779a2abbb64d791bbc071398f09a8708"; + sha512.doc = "6ac862eff40eaa1a8cacc5c1a1d4886e82dee53046d3fbf631ec23bfb59490fe89bdde5f2767cba35e8d0439fa7b7688669b50ba3ce81698c34bcfc9d010a7e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.14"; +}; +pst-turtle = { + revision = 52261; + shortdesc = "Commands for \"turtle operations\""; + stripPrefix = 0; + sha512.run = "df30018ed03f10edbb9e215879f041ed6eb0db48cf0e7e2b5128cd3339d1005ef074aa0631c84bcfd2c8f9c1a1a69a26cac36248f3971a3b3302e2f763af750d"; + sha512.doc = "22c14f1eca2aa764bfc250d8140f0a24f3dab1cb8e755180167ddcd1ac9224aca07fb41408823b8933b73293204053f7f139513781ff37a67ca9e0ee7bec4fbb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +pst-tvz = { + revision = 23451; + shortdesc = "Draw trees with more than one root node, using PSTricks"; + stripPrefix = 0; + sha512.run = "79e206f5e4154a797cf168b1b490cac8e1ddf98a79de6ddbd9dc98cf53eae01301c034643f6660708b58e890ca94b7235e5b0f48e53136f32c12c0adf5749179"; + sha512.doc = "ffbba30214dce83e7f00aa7c6e126919cafe341dc727736e27a5af8ae212dc66dafa49afba553079d6857258ca72577950c06ba2deb21ca3c1b13231d1909935"; + sha512.source = "ea0d7dc35ccef586bbe4dc225886755b28524b4db4ebcede6fd41c51bcc0fc8e7fca1f7a326d12524dae478b5a9228cae413b80e7a2830f0cd729e7efa8bab4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +pst-uml = { + revision = 15878; + shortdesc = "UML diagrams with PSTricks"; + stripPrefix = 0; + deps = [ + "multido" + ]; + sha512.run = "e4ff8ea9b7fb9f530e33280de3e9eb20d653c0c062fa80611a544daf74da0b1dd2481b43d8f5258f9ebc1d1bf95b393b32c7152ab8464a9e980cefa105c45ceb"; + sha512.doc = "d8aa92785c241b6346762d98349d8464ce604afceb8774ef160e8c24e0a40d3fd8dba7cac3f78cbf38cbf6cfebb79939ad3c76e6b4014c1028859aba38123efe"; + sha512.source = "8b7e551154c1b1966046268ed3353b6c78c3a66bfa20f44c7fba3b58f661f2585b71d49d2dd673368f732b2f9446dc7783bad4ae5248169a79721d330a49514c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.83"; +}; +pst-vectorian = { + revision = 60488; + shortdesc = "Printing ornaments"; + stripPrefix = 0; + sha512.run = "e3898a6b489afe685bfc657760702bd5e2e44fce2ecf6e4af28c1a6eb36173fc653e003af7b7879fbd3a342adfb89b8cf47168b1f1868815fa44050495d15f54"; + sha512.doc = "6bdc368c391d12e6fb54740867631c7ba62b66a889e11dd40668dc7bcf5f9846e4414f84b706010505d3032b132735a9247e25193b952bd3272590d47d59172b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.41"; +}; +pst-vehicle = { + revision = 61438; + shortdesc = "A PSTricks package for rolling vehicles on graphs of mathematical functions"; + stripPrefix = 0; + sha512.run = "1cec74ed600c4c4df629942b158d47b33f26e3a38d3d363cd506e5dc7c9673e0da1af4af8bbf71bf735693d15f0b02a36d8b148e07405ff4181efc820e73eeaf"; + sha512.doc = "e252811d71bc400b3cb72a29fd9099247044cb1d1c79676cf4319d58cc60293839b022a73706a9685434d338c9daa24e8b9bc5b7390a75870379385dde0d9c7f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +pst-venn = { + revision = 49316; + shortdesc = "A PSTricks package for drawing Venn sets"; + stripPrefix = 0; + sha512.run = "63baf8075ef294bc3a909b3160fa7868a7f179c832d680728fe463f8b1c058411a1393614ade666824fa3233d6617b1dd4e0c50c299a620bc459104515c85727"; + sha512.doc = "e332f8ed24744c03c32bfd139a38dabfca1c6eaf9c5c4624d1579c16feda26e42e81b39dafc98527e8bdaacc2e3ff2d246c6f4b88d89bebfaadd57454e08af7e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +pst-vowel = { + revision = 25228; + shortdesc = "Enable arrows showing diphthongs on vowel charts"; + stripPrefix = 0; + sha512.run = "6ee1dd91b42e319e3a88966fe4cb7327211e5859ae9bc9e262afbfe1fb7f143386ecb70a71d6b24cb0c794cb0943a6cbab4eb40ac683c55a7ef1fbafc118e132"; + sha512.doc = "4fd8ba42b0d4ed821abe52e5848af0d19fcf12c2b9660f09a502561fcfbeffbe38bdf2a0540ee79b99f50cb3c783ab4b5d003a59cf84b3066c364daa7dca0eea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pst2pdf = { + revision = 56172; + shortdesc = "A script to compile PSTricks documents via pdfTeX"; + sha512.run = "a266409d6740653bacb23e83b98e545dc462ed879299b195d65761b10e4700a797005ca231fc24e37a42591c09ba93b5ea6b8b82ad8b14a29a7649cdb3f39b33"; + sha512.doc = "5805c535c8a043fea721093a4b7d2ab06c86c80d4a45eb3d603986b898b6d2053d041b638874e53c79e2d815a929749e02ca0986a2f8cbb400a2fa87581462dc"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.20"; +}; +pst2pdf.binfiles = [ + "pst2pdf" +]; +pstool = { + revision = 46393; + shortdesc = "Support for psfrag within pdfLaTeX"; + stripPrefix = 0; + sha512.run = "a97af35dfce4a137af97071b49e58c31739e6f271afc62a455db473e573148d25fc27937ce680c6f400a200151ffd73867d5dd8781b12a63c68b7bf256cff5d1"; + sha512.doc = "613cc4899b1d76e0686cd269568cfc0dda437cec0e50571086b3d44659dc4b3e3d567dec88b5420e4c802d676f21c2428b3930fb6bb3f7d7faa14c029d35d43e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5e"; +}; +pstricks = { + revision = 69674; + shortdesc = "PostScript macros for TeX"; + stripPrefix = 0; + sha512.run = "8c9d0a2c8355a338f459a34dee22893acd54fc314ef588a8fc6a727f4dc0d6fc34e64059479c096e490bb2c90d627b555d5052cbf871089099acd18fff0cebfd"; + sha512.doc = "10946b40abd2e00549abdc0e3d9067c74756785571b4f75f6baf6e6155f90087cba7eb35427f159571a04ba92e1819cf92ad12d9b4b02119ab957bb4b77da1d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.19c"; +}; +pstricks-add = { + revision = 66887; + shortdesc = "A collection of add-ons and bugfixes for PSTricks"; + stripPrefix = 0; + sha512.run = "073ce9b5f97c4432d87f51a3b239c758e2840ec894847c334dcd206433e6c0a45575ed2214c00bd013f9ddc0945a696a8eb45b2efc62d8425d1c9607da658850"; + sha512.doc = "552fcc2f0d448bd1d7f643a5c9f2521f72fd61a653363eab3bf6f31bae306a9c6694ca8d64ad5a5997adea9b92978aa366ece8bd7966c9d129942f8f487b99f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.94"; +}; +pstricks_calcnotes = { + revision = 34363; + shortdesc = "Use of PSTricks in calculus lecture notes"; + stripPrefix = 0; + sha512.run = "1b17e544484b71f3c29e5c3e1bed6021658ce7b9a256c21c004113b722a85be7ea6861753230910771b7c900184ca8cce146408301e75de79e0c2bf8939c49a6"; + sha512.doc = "bab8492549fd268f856e11f5f6db4e1ca878c67634387e7295bc163cd17080ee6b685893ddc85a882bd895adf3689639bfa7fc7d0da5e9916ef305c18d94ad65"; + license = [ "lppl13c" ]; + version = "1.2"; +}; +pstring = { + revision = 42857; + shortdesc = "Typeset sequences with justification pointers"; + stripPrefix = 0; + sha512.run = "d77c937467a9cd16f24fb1374a0d797db04bc301fa8a677712e09d83b58df6fd12aad8857dd83f4d5278d799a0d1d52ef12106e8106921d1ec1453ff6692605f"; + sha512.doc = "51c316c27c3d4083696dd9ee86e378c83ed09c75c632a7f0a580bd84d0033c7776008056a4b26d7835a4974b879c0f2b0389ae83c70cbd6ab093bc8b2add9ed4"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +psutils = { + revision = 61719; + shortdesc = "PostScript utilities"; + sha512.run = "1489c9cd3ae9e1063367301f038cd52f0fd7f5b2d548ea78c06a2bff56100aa613cd01026ce601527b6a32f88b6ed1df96f9c8c6a591d16a63dccdc8e32d6969"; + sha512.doc = "8b4814c2a769b1ea8831aa945352f31125267aeebedd8dc8abf6381928707799bcb1eb29214930152046bab63b1a56179ea035ae6568595fd5ac83bbbd22f588"; + hasManpages = true; + hasRunfiles = true; + license = [ "free" ]; + version = "p17"; +}; +psutils.binfiles = [ + "epsffit" + "extractres" + "includeres" + "psbook" + "psjoin" + "psnup" + "psresize" + "psselect" + "pstops" +]; +ptex = { + revision = 66186; + shortdesc = "A TeX system for publishing in Japanese"; + deps = [ + "cm" + "etex" + "hyphen-base" + "knuth-lib" + "plain" + "ptex-base" + "ptex-fonts" + ]; + formats = [ + { + name = "eptex"; + engine = "eptex"; + options = "*eptex.ini"; + patterns = [ "language.def" ]; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "ptex-base" "ptex-fonts" "etex" ]; + } + { + name = "ptex"; + engine = "eptex"; + options = "ptex.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "ptex-base" "ptex-fonts" ]; + } + ]; + fontMaps = [ + "KanjiMap ptex-@jaEmbed@@jaVariant@.map" + ]; + sha512.run = "dca32af2c2742207b380c909190204049e29eb9c824f534c39757e3544e305a9395c9fd6ff76d855f1e7fc67e0999bfd863640fc2d2f45dc44bdaa7df543568f"; + sha512.doc = "160902b1b32b9725f4c7cabd06dfb612fbbeef31845df108efd50917d85ef619ba62d03760852d31a21a23e2bdcb5035292b317982d7fede260a696041bb2293"; + hasManpages = true; + license = [ "bsd3" ]; +}; +ptex-base = { + revision = 64072; + shortdesc = "Plain TeX format for pTeX and e-pTeX"; + stripPrefix = 0; + sha512.run = "b937359bde7ade3645edb6435a824ee6af66e51e7cb518694706224e63e4d92391911f01745d331cb92e62c34c085aa5f284babacf6f7ab0a0474cbf06b00859"; + sha512.doc = "85b6422630754144e4f9c552899e588f1650af2837cf88e8f47106e2919bee8dd956002e102f83dd76107edb0e61e2a6d4ebfaaf6fc06289942fdb32385454ba"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +ptex-fontmaps = { + revision = 65953; + shortdesc = "Font maps and configuration tools for Japanese/Chinese/Korean fonts with (u)ptex"; + postactionScript = "tlpkg/tlpostcode/ptex-fontmaps-tlpost.pl"; + sha512.run = "b864c185b5718dfa76e0d4385654ca8e319ab0cbb59911defbec8d6198879265d064087df233d9020f3abc4bebe0742530f40b2ae6e584dbb4f5b6ed7ff28d07"; + sha512.doc = "4b21fe546634aad338630520bf68fce2a83f8e6fade99d170ef87a92c8308dd289ed130bf67bfc88419f8752454ab04730bfaa68de90535984590ce8435d87b5"; + sha512.source = "028304d777bfd5155baf89fcd4003bec43e5a7f3009aa9250cfd13277d085cbe52cf49511cf664efa0c886b1681475b0c25eaa65624bf0b77d4ab4403ebb457a"; + hasRunfiles = true; + hasTlpkg = true; + license = [ "publicDomain" "gpl3Only" ]; + version = "20210625.0"; +}; +ptex-fontmaps.binfiles = [ + "kanji-config-updmap" + "kanji-config-updmap-sys" + "kanji-config-updmap-user" + "kanji-fontmap-creator" +]; +ptex-fonts = { + revision = 64330; + shortdesc = "Fonts for use with pTeX"; + stripPrefix = 0; + sha512.run = "d625f45f7211eca1152a16814ce87814cc19eb7d6646d4f66971eb08eeec50bcf91ddcc253f4ffe24418a3e2a989ce10c03a3536730ac286980742cdfa22fe67"; + sha512.doc = "3a07313f79f31d09bf96c78a574d00d57641df75b9eeb89c76425ee3d6cd51d1e6ad6574fffdeb834d2bc2fa8c41511561aec34ca6be2be43d55da6227d19a19"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +ptex-manual = { + revision = 68147; + shortdesc = "Japanese pTeX manual"; + stripPrefix = 0; + sha512.run = "ffad7c7c67e7c6c92ec7b814cba8ca8cd7fc9935d5b6c7f685ee83b97cca56ac410ee2c15f8d86f4bbf443508f2e2224603c9abc64e734451ee94ce968425d62"; + sha512.doc = "dc2643c258a98410d9a456e16794d70bf6de6e1a40b8db2bcf7fb40e20953bbe482cb26cf3e65b0caa19806e915cfdd3787ddcbf69108e2af0d83e03d3b0104b"; + license = [ "bsd3" ]; +}; +ptex.binfiles = [ + "eptex" + "makejvf" + "mendex" + "pbibtex" + "pdvitomp" + "pdvitype" + "pmpost" + "ppltotf" + "ptex" + "ptftopl" + "r-pmpost" +]; +ptex2pdf = { + revision = 65953; + shortdesc = "Convert Japanese TeX documents to PDF"; + postactionScript = "tlpkg/tlpostcode/ptex2pdf-tlpost.pl"; + sha512.run = "6a4246d9fbc7cc6f37319d338df8320769cd4b1f0247186beea117b8bf228263f3a330146cf251a9e8e8c7232eb894ce6dad9eda840dd4a154f2502eae4c0f57"; + sha512.doc = "5635ead2dfa20ce9b616073272452de5c68c55104d88b2362b87cafe4762608d681b0c370169bff78466520d14f9055e509efdaa4ecdb083c3c3111ad829978c"; + hasRunfiles = true; + hasTlpkg = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl2Only" ]; + version = "20200520.0"; +}; +ptex2pdf.binfiles = [ + "ptex2pdf" +]; +ptext = { + revision = 30171; + shortdesc = "A 'lipsum' for Persian"; + stripPrefix = 0; + sha512.run = "ceb8844ff23034bf730823349e6251ef0c7f208ef74c3ed61fa212af89a3208e8f9f1b74b7877698d4459047b64376faea647a919b340d306d54de43ee9617a2"; + sha512.doc = "31ec6dea18c99aac831f4f180ccce47781ce98b2a8859bb62019cdffd690a8b803cba66728d1a9805a8a39de9ef43e357be8fb6a16e0602cf67f7f9dc6cb317e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.1"; +}; +ptlatexcommands = { + revision = 67125; + shortdesc = "LaTeX to commands in Portuguese"; + stripPrefix = 0; + sha512.run = "2a2924af70b0ed8d76f6062482a500371d67d5a3bc0b87382d76626b34da9c1acdf9c123ebfdab2e5e79041b10d0e327e9cd732781e5fa1620247bdf02dc21fb"; + sha512.doc = "5b9fc92a4cb3597c0c95936d5fb6ad475ca4f9896f8165a0e391e591bb3fc9ea75ae79c14ee62197200d69d577df8025e6017960beafe6bef0bda90a6a615118"; + sha512.source = "47c0d8ffd0f352a39f54ce32696fa67d25dd438de8fede88bfc5542409cf5576c953b40180b5ee1f469067e2ae5ea8543a68c84246ef9ffdc3c51c14866be690"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1"; +}; +ptolemaicastronomy = { + revision = 50810; + shortdesc = "Diagrams of sphere models for variably strict conditionals (Lewis counterfactuals)"; + stripPrefix = 0; + sha512.run = "58202171aa08b297e2999554d8b6ee43d4c5772e2f28fcf73c11a00ff8476dcdebfaa5352c7d248720feab2ba642947f07362cd9124dbed27e22086123da3de6"; + sha512.doc = "04997eb4bfd5c5e7789b5db02e9c27a9eb4d65e685be1428c5b81199957dff5aca626a76c719d871217ccaa2a6e6eef6c17ed94f4ea161f581b77a22306d61f3"; + sha512.source = "2a2d250d5deff043970037268b6f7400e073da58b1e6fce0d2a6e2b0c77a567dc683f616fd7ba67b659bec3f137349b37c84b808364bf5359392026730af3aae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ptptex = { + revision = 19440; + shortdesc = "Macros for 'Progress of Theoretical Physics'"; + stripPrefix = 0; + sha512.run = "a2c31b2e039c198d3c3c84cb58cc0b9326bcf11b4c361c1d5c9b8f5aa4943f14b30e722bc2425a38b69935f4c88c67439747ffd65e0a194f2e5dd54a6448bbde"; + sha512.doc = "0e754625fb8507591f21b860901de1b06bcb31f5c0b2fd7df1fa5257c7c611bae4f575f7387362bdd21d826a329a8af3ba00fd30c3bc9d91be7dea5d66e2fdae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +punk = { + revision = 27388; + shortdesc = "Donald Knuth's punk font"; + stripPrefix = 0; + sha512.run = "a442a536dbdaff9dfa9d1cdfe1a084d0f4e4e28174a424cf59a1da94013e115b9fc6294ea3362c85cb770028c62b21f7f7fa9817dbd68787498199ce585589dc"; + sha512.doc = "33842d1fb46a78654d7351ccf88b40b87e6e03d83598f661ac21ee99d45156dd8b37a652c5c8e55506f95fc57b83e7f62f6c90c3fea5443dc5bb6590302b3e7d"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +punk-latex = { + revision = 27389; + shortdesc = "LaTeX support for punk fonts"; + stripPrefix = 0; + sha512.run = "e44098c082465aa620d436a41306c9a1f36075c2612aa045e7c958151fc62e9a740584d9a9dd94b0c5631c00d406762a8e35f672931cccd3c09fe95850f3a2ba"; + sha512.doc = "36a3341d2dca08941a923a1f407b422e96438e79ba5e3911a89f13d48317ec5aa0f5afccc7539b0882996fb872b38bc3653f1e5b088805e5ef7c9d96a4546d01"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +punknova = { + revision = 24649; + shortdesc = "OpenType version of Knuth's Punk font"; + stripPrefix = 0; + sha512.run = "bcb37b02258ba406e8ef3965619c99193c08a4e1d11f771b3c6b06716eac16134be81585220a581176d9e8b4d7f488730ada3b5963238ff982be400cbb41d888"; + sha512.doc = "64df58c8996563a447ed7a012c6dd8f5248c8a7db06089d776e8ce64d516b4a0c4bf9042f587c996c7ab61582bba919551d352c9ca75f8696bcac5ad0e34866c"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.003"; +}; +purifyeps = { + revision = 29725; + shortdesc = "Make EPS work with both LaTeX/dvips and pdfLaTeX"; + sha512.run = "79d99ef7ebc462c7c65d03f23cc85b9f136df2b0c9d647fc0672584fa57bfb7447f6db0e6d6b11bfc738cfe8c8658f45fe0b4059ff00f355e4b21d44f0d4102a"; + sha512.doc = "3f9fadfb35596835b250cab98b0d1e3c6d537cfac5878e0b9788aeb5cc7ef455ce3d44f7d0f03e9002796a162d374f6aa8f9bce5bd4c3f0e8937040de0b82a8d"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +purifyeps.binfiles = [ + "purifyeps" +]; +puyotikz = { + revision = 57254; + shortdesc = "Quickly typeset board states of Puyo Puyo games"; + stripPrefix = 0; + sha512.run = "635d17a49a905c99e895df3e777eed02f4c5e91a38d083e57890cd13c927bc68098d5f0864d6e32b2585d288091d15e5cc1303e04e26b2267d7e78a07f77ea0d"; + sha512.doc = "64750274694fa8c7fc792d6f5ba19ab756366eb87668469aa6da9df74f4f7bc571772cc6a406f7c3453f306f36516aca9c2444ce126ff4968d1cc49d2c4585db"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.1"; +}; +pwebmac = { + revision = 69027; + shortdesc = "Consolidated WEB macros for DVI and PDF output"; + stripPrefix = 0; + sha512.run = "aed495ad3c056a34f63416e570db395125719e9a9cb05c5043bd4f0d58713c28ee548c931a5c18d316d0a2a39c81671788f87b422f01148cf9ecdb52ab2a87d2"; + sha512.doc = "0312806d06b3db91d2e0bf3df2c1f3dc8620c1f6b59e4e968232631edac217e99bccede5d9cf133f52409d8a664f69dfa072ab5d205f67fabafa0ee74db90d20"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "4.11"; +}; +pxbase = { + revision = 66187; + shortdesc = "Tools for use with (u)pLaTeX"; + stripPrefix = 0; + sha512.run = "34fef6f30f53ea2c67394f931168025f7dae7f6e12904b862ef821040a15eb3eac0949ebfab7b1b3dfae8e9944fdb85b99294fc6214df0ce8c1b82eac2702ed2"; + sha512.doc = "4e1fd7e88d8e17dbc4f65a7dab0f3c4bbcccf3b24b55085fafc9f393cd99a653ec2c4fa41ca85760436a1c7c6121848c57912ff649c302db6966a5c907dc0209"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.4"; +}; +pxchfon = { + revision = 68103; + shortdesc = "Japanese font setup for pLaTeX and upLaTeX"; + stripPrefix = 0; + sha512.run = "c79d32b99873e5262d3497846af0fe8c327d574ac61030241a8a1d95e4439794439cd3fb75cdcae51206e76bd4218a6778717492c036ab71aecd8e67a0040990"; + sha512.doc = "1f50dcd95cf37669330d426238d398d5bfb2503e4db06287f7a361ef87136547d1020bf1d35fcd9504ea5017dc9ec0a0cb8f9298e4d178ec4c7cd426d91f1d6f"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.0"; +}; +pxcjkcat = { + revision = 63967; + shortdesc = "LaTeX interface for the CJK category codes of upTeX"; + stripPrefix = 0; + sha512.run = "81a71b6cfdd280f65f392ad602291d468a8ffeda440609f513166b88bc1af298d6be546e953e4f3a9abac3f0bae235c12b124e11258c53c1abf778f3f78f3559"; + sha512.doc = "69fe6721aa9aa17aa1aac44680e7a520b7fd002c8fd06d2ccdde0e4d20a17875b9b585394159528fb9bf2c6e817c8e3762efce21a938217a199e49094592ec50"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.4"; +}; +pxfonts = { + revision = 15878; + shortdesc = "Palatino-like fonts in support of mathematics"; + stripPrefix = 0; + fontMaps = [ + "Map pxfonts.map" + ]; + sha512.run = "3b50d3f04c00cd080495c71d9387fe9c810ade7d83ead1178d661a618374a3a67c0fc70ae2a809d2b91db4afaf352b1596a588f6998a4eda220a6f181390b6d1"; + sha512.doc = "71898d307cabff64078bbb98bee9417c79504fd56f1cfc1427b9e4ccc9448b5e2e8436fa085a63d6fa6601e591673ef52eb2225ddfad5e34943456a2239206a5"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +pxgreeks = { + revision = 21838; + shortdesc = "Shape selection for PX fonts Greek letters"; + stripPrefix = 0; + sha512.run = "d3f8ff3c975643d74dd92e749397d01f8d3fd0087a838271a491791fa4bb2d65c852ff5989f79952d40547a601c97fe0274ab4407a8e73aa047221934b9b2e9d"; + sha512.doc = "22239223646ea121422016119b6d0edce32d002bf361d096c173857b36ce324ebe2e4107bc0eae650b50d0e94775c84f480768246ee65f975ad5a24af0335158"; + sha512.source = "9924c5b5a60d381efc41f77f9b5224a12a158fd7de6551a17b1d32eebb6ca6e80a7686648a81774398c4e25fef759612c652fff983a635f4cf56c5bbfb52858d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +pxjahyper = { + revision = 66272; + shortdesc = "Hyperref support for pLaTeX"; + stripPrefix = 0; + sha512.run = "f6e62e0dd4a5da2e9c702fc09c311a0661d58668c4999eaf5209792d3c88001b9e7d80cc1a9c259ec5e2668a7139a4fe90dac2b23ea756f238a387a6c7e66772"; + sha512.doc = "f08af33a25f837e86dcd6dcd0f96d9f7bb2570eeae9011201468fdc9bac50bb8ea72d4f069753bb0c93aa9d61952cebfbbe936f65220167e4648cb206b901aae"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3"; +}; +pxjodel = { + revision = 64072; + shortdesc = "Help change metrics of fonts from japanese-otf"; + stripPrefix = 0; + sha512.run = "a44871d5c059df8962a135b6f40c3ab4d5d751bcefa5565e428d4efd8f242f34bdbb142a065e011065a8791a141dcef022d5e6ddd6d22cf78e369413b62f046c"; + sha512.doc = "3a85af8fe9f557ae10468e5aab8c6a19c45cc1f99dbae5a3e66530484074ea91f152177ae3ba54cbff8869178055e53b7282674eb748d82d789e767f16e075e3"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.3"; +}; +pxpgfmark = { + revision = 30212; + shortdesc = "e-pTeX driver for PGF inter-picture connections"; + stripPrefix = 0; + sha512.run = "eb341eaebbe2fca860c2592c0d24f6b5c4ef0f1e6b2bd731d48c1994ded7afa01bd5cb365d3f30147f68855777defc3384038aa652240178fc948b5225cb4c08"; + sha512.doc = "8a80eade76fa7b5e5b919136e499eddb5ff534042fc56eb8223e80124bde97a39a65d31370037cf425042a1ae516e5888c8751388899ae65a8b561f091693c97"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2"; +}; +pxpic = { + revision = 67955; + shortdesc = "Draw pixel pictures"; + stripPrefix = 0; + sha512.run = "4eade52198c6ed8a9e04380cab15098435b2e158f8662d32c88599e02e49a2f7f6257bbd6fab8d3c660e61ff679aefb38d29b4787fcef0a3510776a21707526a"; + sha512.doc = "28151cfd56136ef07c9402fb8f4e0da4a2694164a38e7eaeb5045845731b0b204813b9c0f2b07f9998619feea24effd049cb42a0057841a6a3b3bd998dbc0124"; + sha512.source = "f5281b971ee70e963cb308a1906bfe8ef96939005f8b5972680db8565c1d0c9697d674426b0833064a07dbb086163c621d764125b3432af3d960a3e466b250b5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +pxrubrica = { + revision = 66298; + shortdesc = "Ruby annotations according to JIS X 4051"; + stripPrefix = 0; + sha512.run = "0ffdde0f17b1bcb90a858d6dd6ca204eea552b49e91cdc797e6364e8b59cca4808a293154426f9c3f52dd2bdc27e93c091bbddbe6c15862fec144b9e4cd6ea9e"; + sha512.doc = "e2a217a5029857d66882fb5a626e7846a2cd282b9cb2f5a65e6a61919bc7ce23a16294bfc27e9b189a8aee6bcc95cab24a94a6dca221f63d650f38c5e5fce28b"; + sha512.source = "f513b8bcc4e89323b199fd4c793a9405a94206e9498f3c298fd81a7fb07cc46a6e624e71d30b8a7951bb7b081be3ae8c621b992a0c290e0334c834d83244fed7"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3e"; +}; +pxtatescale = { + revision = 63967; + shortdesc = "Patch to graphics driver for scaling in vertical direction of pTeX"; + stripPrefix = 0; + sha512.run = "5198b276ba052495662e7adfba51b039bfc355edc01c206b6b5745338dc43e977ce7a48cd11fab3a71f6e8683f554920bfa41a427d587742d2f64f18e058c5b5"; + sha512.doc = "e3e3cf332727476e80c65118da7e7ad55f9f1c1f6658d2919aa37622bdbbc082858eef4ab718e0632752032e0f4e315c28ab8a218902509b3dbcc32377a02994"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.4"; +}; +pxtxalfa = { + revision = 60847; + shortdesc = "Virtual maths alphabets based on pxfonts and txfonts"; + stripPrefix = 0; + sha512.run = "33dfd01f714a662f351fbd3a0e0f36c413360adac666ca5665c628bf5d3acf732cb61e18190d340d144e146fa04116373259403b9eca314f48dba5ea4e6aa032"; + sha512.doc = "f547cbd3cc4a0e09034e98a27bfedf41e2e2ab9b6561e441d7656b99b6b883bb51f9fa24d731d403133358917428c53489eacf8c7ede08a963ff06c3d0404c1a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2"; +}; +pxufont = { + revision = 67573; + shortdesc = "Emulate non-Unicode Japanese fonts using Unicode fonts"; + stripPrefix = 0; + sha512.run = "370d82da425014bc4464415b4f0fe6fa1cb3375979734731ea829942ead4289e1ac6fc47c1b5c42185c97b9013da2e779c90c10454ea2e4b6e5d65540ce4179a"; + sha512.doc = "551f14e0603c0ebd59c1c250a1f9e894683f69d22de748ee6cca05ee78c75899aec8671fdc784ebc5219163068dad7a98cf94c831d81091892a72e7777bba5dd"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.7"; +}; +pygmentex = { + revision = 64131; + shortdesc = "Use Pygments to format code listings in documents"; + sha512.run = "097a1eec7e6a969b0c2aef3915d8231d7e6b6c234abe79caa7f7325df22f4976d1bcf2b111c87c9b457250a2c89b5b0a29afd7deb81ee309753901768fb3fd08"; + sha512.doc = "050bf2576a7305eda104ac928cb332e6fd1437e1852726442694fb7ec88ebe7fb9e7e54987a13b76aa103afcc446019a57b8e011f4e638469ea34a9788a8e7cf"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "lppl13c" ]; + version = "0.11"; +}; +pygmentex.binfiles = [ + "pygmentex" +]; +pyluatex = { + revision = 69372; + shortdesc = "Execute Python code on the fly in your LaTeX documents"; + stripPrefix = 0; + sha512.run = "7d400d0cd1af26732effc31e2b7a7e0cb501d712230805204362bb5fc456d379258ca2075f4c902dd6d4bb6004ba154d47ebd6cbbc5febae8d07c113987b1a60"; + sha512.doc = "3dea8e36fffdc92dd5dc68279e61d0d1bfa374373ada7236b1717b5df7c5cd1baaf2fe8fdfa02c5f64fb8ddbab209055cb707a72ca839e63ea00ffb480f6613f"; + hasRunfiles = true; + license = [ "mit" "lppl13c" ]; + version = "0.6.3"; +}; +pynotebook = { + revision = 69990; + shortdesc = "pynotebook presents (raw, Markdown or Python) codes (and execution with LuaLaTeX) as in a Jupyter Notebook"; + stripPrefix = 0; + sha512.run = "221b2167c77db3e434d253f04536398501e6bd9682e09c1984db040b9822b191366413f5dae85c84dfda5219f84d4f32dfa1366a5da6ca6b2dfc8a55389ce725"; + sha512.doc = "61d565169841a001608af347596e4a91f207ac65c45020fdf6b3a91d29b2c01192161ae1d5d274651ce90c017e27ac3d9e56041a4c2158bb43df2d07e6a9e3f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +python = { + revision = 60162; + shortdesc = "Embed Python code in LaTeX"; + stripPrefix = 0; + sha512.run = "3b2b55d1c8da0c253711ea5d6434ffe3537baf273d8a6798a5455b3170601aec0dfbb418969bd9d79f47ec502a73fa5bcbb3b74bbdd77d242859c0f7496bf8d0"; + sha512.doc = "c6785b22dc6820a84a9edc573e308a79991b4a67ff1c5b17553c05a75155ea9b981380098335162a6a7c3c25d2dc20665e35b9cf74317b5c865bc6d4fbed7a8b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.22"; +}; +pythonhighlight = { + revision = 43191; + shortdesc = "Highlighting of Python code, based on the listings package"; + stripPrefix = 0; + sha512.run = "1018d4383ba04f92d383d2c4f51d30f091528f7a89ff23614e0ebc9e488ef3cc8167de12a42e6a6465c2b3937d849bd5eecc94cab0a9b8003569b06ae2c91632"; + sha512.doc = "31297eb541060d760fd61ebe169b840cf182f8f857986aba5a2a578373037d3c99ee12ec9c707ab1f9d29564925821665997ea45f728273007f61a5f0bea5180"; + hasRunfiles = true; + license = [ "free" ]; +}; +pythonimmediate = { + revision = 69487; + shortdesc = "Library to run Python code"; + stripPrefix = 0; + deps = [ + "currfile" + "l3packages" + "precattl" + "saveenv" + ]; + sha512.run = "d780c2bb49199fdb77c28016bd50a229851580d8c48c45eb098ced2cbd66bd2a5e4b84493b65b160ae02e6a1c22e64ecdafd0718762c0355db13acd9cbc1f943"; + sha512.doc = "75d2a8ded38f8740e8ddbecf938388e06568a2a3648b94611b35072639af2ec128b687259aef2bd12a03b0e205f727532f633bd0163ef44e60a526ed38b30fab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5.0"; +}; +pythontex = { + revision = 59514; + shortdesc = "Run Python from within a document, typesetting the results"; + sha512.run = "2e67beb9974eb9a567726d8a68f7d565aeca97d20484ef6e36312100411eef9d9de937297399a98f367a756f6679314cc1a25201ff11936b8a61f8f1f148830b"; + sha512.doc = "3ec2fe0f095384734575c2c9fd1bc9d485b628485c8ee75cd8fb9ebd6d1f56edbec6f378c7c9e1d5ba9c10c4bbcc3934ddb957dc47a258ac81ca89b5ce3a2e92"; + sha512.source = "8a3cf562716df588d4ada0273c3340b73e16a01524e02a9c83c4ca781b8dd1763a1deb9e303635878721831e0d57b780c0666b694629106650f639061d2f32f4"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "lppl13c" ]; + version = "0.18"; +}; +pythontex.binfiles = [ + "depythontex" + "pythontex" +]; +q-and-a = { + revision = 69164; + shortdesc = "Typesetting Q&A-style conversation made easier"; + stripPrefix = 0; + deps = [ + "einfart" + ]; + sha512.run = "6a2ba84da635b700df2a39d69240b62749454d245ad6bb7e7ee8d87f8125f82575fa7c9e2ce4fb2b51bc0af2749135c5ba3bbfde443344ef950f6ce61a79b678"; + sha512.doc = "885a499e877514022277317c5f4d4fef22e5a0593b9a69cea2021e2326b4f57662daf55977da5078ac45f0146a76a0cc644498ae6c2c9dc49d5e5c8a39565037"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +qcircuit = { + revision = 48400; + shortdesc = "Macros to generate quantum ciruits"; + stripPrefix = 0; + sha512.run = "72dc726d377bfa13b30d5440f65e3f451a717c32785c9338bc95107a3fd29326d5011ea31a6805fd751e276279b8bb577f2b4a488ad0f380ffad84fbe46e272e"; + sha512.doc = "cb4d00d575ed8f859722b97af7f15323af85e69b7276947c05770a6c745dbf0e4b3aa1546b3cc82d9555a5ce839b142ea8edd3da166d2c109bf6b829b2ebb74f"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.6.0"; +}; +qcm = { + revision = 63833; + shortdesc = "A LaTeX2e class for making multiple choice questionnaires"; + stripPrefix = 0; + sha512.run = "f14457229f0cd0a291482b1fdab1970552257cc65955c9df43485c5af5a389d5323073c70b18ba0a6729ba4c7491fa4b2966f341b04ca6ea454d9e85e21ea904"; + sha512.doc = "f60d3cf3581f7f2fbf7a4fc18994bfdf77b3ff16d148f6036694e477f7b8945b25bffdb107f4fa11d90b65498f8abd034e24a73fe8bf3e610e2d158a08ed429f"; + sha512.source = "8cfe155d514e9b310b853b0c3b326104f26c207f49ebb0326e455e92e40f7848f3b3c89dffabe13f69cc73b9a561c79a334b4fdafa27cf8b3112977f1fe2960f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +qobitree = { + revision = 15878; + shortdesc = "LaTeX macros for typesetting trees"; + stripPrefix = 0; + sha512.run = "cd229c1611f269f904d73d276b8b36fb60a373130a3b5bf78508daf85d5ce50cdc4841a25e30c5a0925344eefd93f638e635be2878478f575f32fc458fa9a0dd"; + sha512.doc = "b3b587bbe835456cb6298804cac2a8d61c85d4bad6550cd355e6a9ba155e7b691c5b2f5f919ded355b21dde9c4009ee30466bcfc5cb6d81e0af0fdeb97aa3b64"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +qpxqtx = { + revision = 45797; + shortdesc = "Polish macros and fonts supporting Pagella/pxfonts and Termes/txfonts"; + stripPrefix = 0; + sha512.run = "7387592a338e7ba10942e4ed96364e36ca325040bff02cd69bf0f98d471775d38bd63e54bad494f64874e2fd0462762595c5796d7453aa6909fccc2d9d6bd27c"; + sha512.doc = "6b6fc20f5ec1269d318813b1ad34020e2b5341ed8891c11d2eda6b84884b3782e992dd9dde16d14b2030f2b57e1146fb6da6e761a35b12a3d88e8d865285668d"; + hasRunfiles = true; +}; +qrbill = { + revision = 67724; + shortdesc = "Create QR bills using LaTeX"; + stripPrefix = 0; + sha512.run = "61a65a020fb5cf012cc08d6d852481ce8712c214fa7cc446ecd0d5a68221f29ecfa710e81889cc92d3f3895105f153ca5fd54b798261ec095a5f06ccc75cc4e8"; + sha512.doc = "e348c90fb8ee446551fa2747763ad611344279ce00e0b8fc3772f1ca0b9bea674d1d759fc26b8955261d853b264d9e598862f0bf80561f23b4d3eb038a45f248"; + sha512.source = "0466344e7d7fb00449bad39b5c42b259a8fec4d8472bee7fbca7acb702777f7b30f0a9469e97b3b6d03ba851b13a66cfbb5d87898881ea35089976c0a7258798"; + hasRunfiles = true; + license = [ "lppl13c" "bsd3" ]; + version = "2.01"; +}; +qrcode = { + revision = 36065; + shortdesc = "Generate QR codes in LaTeX"; + stripPrefix = 0; + sha512.run = "65ecc00d46d06f8a36cb1f170c12692cf7ef8c0cf9e68bbdc6a7da6b0a7f5fcda6a2e065b8a474609556518ab07c2d12f19a9fdaa0b6339aba94cf35184e26f9"; + sha512.doc = "406d1cf238b397412a57ed695a39af0ef32de007b94e8650cf591c63882d05d7df18061fbd2b350347c052091202a38de1ceef19f61fa58de38c2e73de6b01b2"; + sha512.source = "3e344af4bcd4e0d2b49638c33177f600f1e3ff24416ad503f55b3376fe7323ab381c7ee695351923cfc06b54c9ba8b3d1f4705f5377164f2b43ee04ccc565955"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.51"; +}; +qsharp = { + revision = 49722; + shortdesc = "Syntax highlighting for the Q# language"; + stripPrefix = 0; + sha512.run = "29aa0808112111d088f8795ec87ca3df6f2e10f0a8e91347ddc7101733aadc72ba90356f7e4b39fce6484e04975d3e151205a5d5272789ecd414cd0a6afc243b"; + sha512.doc = "69d74a3ed755d16957a2a844ae624a15e18813fdf02595c2e4ae2dc0cf13b20a1db1c4f49c20db3e4d3343c586411a88c7ecfe6367c4c1efea1a8cb2730cf8f3"; + sha512.source = "d8ad97902be6b5f29db2cdd7d27049407ebffe5efc8bf0f0ac64e64ed2e3df8f4fe86b8e023ae7dde4368740fdebf22ff6420a32854d5745e8fb147005788226"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.1901.1401"; +}; +qstest = { + revision = 15878; + shortdesc = "Bundle for unit tests and pattern matching"; + stripPrefix = 0; + sha512.run = "1461a7e5a88a75d1976b8bf0b6b9a685c7e68bd5983ea1549b277627e20b8e7d0b890536c8e8357e168914220c168cc2be2e9a688b512e16d613107c50622f79"; + sha512.doc = "a2e138b5de9012b637cc98b18e5aa64b2c9384f03beceda724c86f1e81e03b6da6b19de27fe15724463edc61520d035495f2f039a2d541b4761c44c55473d1c9"; + sha512.source = "1ff5ae66e8620b298f4cb5ca4d53e420ed0e89e476edae48f1f37fb1785e8bf4693da410cf2149d690734ad11fcd669152ffa7a560bde94e923e772560f8ca19"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +qsymbols = { + revision = 15878; + shortdesc = "Maths symbol abbreviations"; + stripPrefix = 0; + sha512.run = "b910db8e0e33bbc111a95db914958a3261fa89061677d999876b026d25609326b83444a7c6b77ee4a39d60eaedff448ec662dddf9511e99c826a3bddbf0b2861"; + sha512.doc = "c633094c09c291666f1953d8d8d8570d71b773e70f90c805cb01981117ea4212ce8cbd4ffabd9ca5aaee07637d19c6e627856115b3943f9d5c414034eee500ea"; + sha512.source = "5c88d0d929f6491b6b9df65ac3ce2be28ee5461d5cae5bc2ecaba64a9012ce4d84cf3f63bec19971ca2e8ec37fa869b8707c8d6ebb9e80f8302cc04127873962"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +qtree = { + revision = 15878; + shortdesc = "Draw tree structures"; + stripPrefix = 0; + sha512.run = "9f381007c2526f51483d7c190cd7cf86cb399e95475841900ffa8f522d3da71f4f451b42562783d756e252e513ca1f9e9e8586517057a8f6b881cbbecb5c3987"; + sha512.doc = "c16142acf0c3f9e4f347c9ceff7a6c29557c0c2c4d2232ce9df146279b3cd4e1019e703479f426709a3feeb6ac46fb91f7dcee8cad35b19c83c9893661322f96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1b"; +}; +qualitype = { + revision = 54512; + shortdesc = "The QualiType font collection"; + stripPrefix = 0; + sha512.run = "c507e8b712f2ce40474ebf2c072654f00d71f1c21156cecced7ed40ea9beac07790a67250ebb7a535c19a266573edb5dbf8d1fe4d661b7828428cd1c7574a1c9"; + sha512.doc = "20ddd865622520e4f9a7a1472c03f3c18bac039dbbe10849364a8ae1d0ee7d8771f30a02511a701962b2db25c79c74d3c2aa14f42951c7df9c0feb199092d510"; + hasRunfiles = true; + license = [ "ofl" "gpl2Plus" ]; +}; +quantikz = { + revision = 67206; + shortdesc = "Draw quantum circuit diagrams"; + stripPrefix = 0; + sha512.run = "af7a59b5fa4111199351b3ee6a14ecbcd6f6e86041a7f516c97f0cd4349a2d96935f138969e0029e4f5f8b8650b7efcef9554bd631c1231d371ec323d7b41024"; + sha512.doc = "a5efd5af9c89a13afd29a06215becf7544e9643697759695f8be2ea39bd62f99748369591cdc619c18b2bba9f0a0529ea6ba0a7be1d9b4ea1c9a8a8042ff4426"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.0.1"; +}; +quantumarticle = { + revision = 65242; + shortdesc = "Document class for submissions to the Quantum journal"; + stripPrefix = 0; + sha512.run = "432dd6c4365dd1e6dfbd9ea4de2f29f0bf0fe3bb7f29b110354ad7d42c4675acc4df84cbcdabc8a476ff8de260e083d32c1b3e63bf7b6122dbc0d5373847bef9"; + sha512.doc = "791b37745fd91a13638cd1689478a35272e4b1b04ea1fc5dfe16d8d320576fbcfaf8b2929b3afa12e783fa148cf3d5f422354d8de0976d808f0921839ea3659a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.1"; +}; +quattrocento = { + revision = 64372; + shortdesc = "Quattrocento and Quattrocento Sans fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map quattrocento.map" + ]; + sha512.run = "cc6819b03992528b4a564757caf4767c92a00b8ecdd6053595c5561483287be88014b6cfe60c1eedde75160669981baaef1e71cc293d1585e9a7c54e0186fe35"; + sha512.doc = "f3881de285a603b1fb11c470f0c16698cdb4a4b165750a2bcc17fd4deaf44d5d94a7af531ddb1135d12556317731639ea779d25663a81bd25b578241ae3fab1d"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +quickreaction = { + revision = 66867; + shortdesc = "A simple and fast way to typeset chemical reactions"; + stripPrefix = 0; + sha512.run = "9915f2032b336f50f784dddf14f69df6bf59ea0c1df668adbd36cbddf98df601605ec6a245e3fc2011742f6349c830add2ffadd49e4389c088bd15bf5bbe7a7d"; + sha512.doc = "c71b5b5a52e12a50cb52632225e9c70acb40ad4796b4b8a922d810e8d5d34da532e3f2b0b708a7a896756f18edc2c39376eef4748e80ebde5869ec44e6af0765"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02.01"; +}; +quicktype = { + revision = 42183; + shortdesc = "LaTeX package for quick typesetting"; + stripPrefix = 0; + sha512.run = "4950c1c7a4536cb64d70fe8c08a69fd9336825973a7c8a669ba48bd66476888775d1ad288d34d4b83a9d674624960e3d17de1c972f52bd7f329eff971ec0f185"; + sha512.doc = "6e43ad0d932eb2237106fd991dcd25e5bd536cb64db5988c958b138af294fbc777dc6ce2c2b791e3875a2bdeaf5a10be7d15585b44e7487017925e0068e898f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +quiver = { + revision = 67779; + shortdesc = "Draw commutative diagrams exported from https://q.uiver.app"; + stripPrefix = 0; + sha512.run = "b7eda520bdfeebff570458d36e22b1779bd16c14070192072987c7f1131efa33c6f1e7ff8c16f73c338fbfe6ef80e656c2ef061ad9ee15885b7f5e8f1195ffc0"; + sha512.doc = "42bff285adfadd6655941b0221b2cf0d9a457a638997591220b564040acb94b4c57bb9dfccf90679c81e301618e8e4b5ea19c1dad9fb478dbabe1c2dbe4da991"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3.0"; +}; +quiz2socrative = { + revision = 52276; + shortdesc = "Prepare questions for socrative quizzes"; + stripPrefix = 0; + sha512.run = "f4fba8eb850a90288a9b3e7f4571f5df560e09e7cba608f7bf2bb3090db5a2c6bc7fc7240ef2e3cef9d37fe1a0105e74c4c63c39a7c1793a1fedc6f86772eac5"; + sha512.doc = "a51cc19b7d13c0bd4f1ed07c6292940176104b5fb381dece7709a5bc1332edb4606cdd4a66ee5a4e4886754c4d274aeab40666eb45328dcc6c465a29a1c4ae29"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +quizztex = { + revision = 68823; + shortdesc = "Create quizzes like in TV shows"; + stripPrefix = 0; + sha512.run = "dbf234ba1d366bdd2a1be442c4bb670efe34d67584386ab1dadfa8afa2ff8551ff03ed9c441f6dc480bfed36ea79082048aa6f0e182f4b9bb5dbce7782c81391"; + sha512.doc = "5c9242df37a22ebdc33d834acd95f760681eebf32516857d6b7ef866ebd00060017ec058c7a628239aa65cfbe62d0335ec00d786d4f9558ec754687b161ea017"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.2"; +}; +quotchap = { + revision = 56926; + shortdesc = "Decorative chapter headings"; + stripPrefix = 0; + sha512.run = "7d94162630e53133b79e33b60abb7c4664d3e486da611e37d48593757f39b0526831cedd0c236ce9b4d8ffc85b35734acadc98236435345180b999d7ea68c1f9"; + sha512.doc = "e2fa71ee21ad019ef785a3c74ddab5f232d3a6d1e9fcdcedb34c216eb5e6d44abbafcaae5d1c4557bc1e4aae92561a75ba2c3723707328a12cdb6ff4c1b72dbf"; + sha512.source = "eed36464f1b04852e8af08c5fd91c42ccccbbaeccad565e6f338ed5c87b003b2dd1704e1dad0ce0e49651461b637e8ed613399a0ae8122081e9084e47704665a"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.3"; +}; +quoting = { + revision = 32818; + shortdesc = "Consolidated environment for displayed text"; + stripPrefix = 0; + sha512.run = "44a9c726a5a9158fcd13fd93785101d2a9a940f34da3d52efd5be1a0467cd76aeaf4706b945a8de0b4e0b4a90740567cfad87f08aaa92e7d4eeae8eb9f7bbc73"; + sha512.doc = "b3990965effff7529a7c18cdd3a08af337be3766ffe535feaf54db504a47b0f054af41511a635c3e70c34d3025df419af702d319240ee673f7462d2cf4ccbbc2"; + sha512.source = "a50186cf1b8b0f55ffe4b2e8447b1232c14c6b36aaa4635bba464de1648ed01adbfa13d8a184bdda8398573b2b9132948577e47e252bcb1014761f4318a76ede"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1c"; +}; +quotmark = { + revision = 15878; + shortdesc = "Consistent quote marks"; + stripPrefix = 0; + sha512.run = "9f21ef20aa9354b1347f00a52df65ea691fe4a00b05b794815279c070d05544611ccd8773cb7c9f8146a3a135f3100a06aaec48acacba255bae9a0654a2a9b53"; + sha512.doc = "6507fcf8639e780ab844700f6356abd8eb69df6158ee638d8471a112159f95a3df8f358fa40479eefad0cf09c34fc37d9292904ae159f2a79fea5acb93f6e542"; + sha512.source = "bbc423a9d6f6fca00c5c8dd9ed5dc084d094898ad5b27397147c8dae1f3bcb8a09f137f1c2c7066fb92d1cab1f5d16681612a528fc28ec4e7901b660f6c8eee8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +quran = { + revision = 67791; + shortdesc = "An easy way to typeset any part of The Holy Quran"; + stripPrefix = 0; + sha512.run = "d725825669bce286e05ba5a6a4034f2a485434d40cd32d7f9cad42c1bc7e74001a0a0d1784b5af73c1075166835042406c42839bdd6fca40cbb06b349cc685d4"; + sha512.doc = "1d706f0ed780efb7529eec16dc9e76182c584113f6d5bc58521de023611401963636e6370c8e06082548da191c4523c7017c59f164d1cf5b234fe7fbd4522689"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +quran-bn = { + revision = 68345; + shortdesc = "Bengali translations to the quran package"; + stripPrefix = 0; + sha512.run = "24694bd309d78e2c0315d60027502a93f3beedc436e3b5dbdb3491d9320ff4e2439914a3d3b84c70644ccab3858d184d948a006b13e622af5cb6c1211cf6f5d9"; + sha512.doc = "d82f949a61f668b6577527d8ee329cd7e23fa7d584eb1c7258be3afe819d6bcf249d9db9778b6da4f57cc1f239d0340cc8b64855eb25d5825d47cf1e298dfb80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +quran-de = { + revision = 54191; + shortdesc = "German translations to the quran package"; + stripPrefix = 0; + sha512.run = "d969c3fd171102e4c47bf4eca383a22498fb6e95a5f8be288a137e12e1c92adda9e92587c402ccf87fcb116597c6074e64eb70b8249b208e7d1bd684d6ffd6d3"; + sha512.doc = "4a371576e7754789ec67cde04f533ade561d770cbf410e31c8fdb737d127dd36e0f8f6a233512b147ffd5692acecc43e1977c76efe04b1a65de3c6297038a954"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +quran-en = { + revision = 68790; + shortdesc = "English translation extension to the quran package"; + stripPrefix = 0; + sha512.run = "75ed9751d6d9517970ca0cf842eca390a172ae24eb12be04a2b97ee1d2673446064489bf594a172677cd785c05ca31587db8b3f64f8d8a1080ce0be0bf191356"; + sha512.doc = "7e5999f4378a32dca0b47ebe63a1fbaa331110d638f1b2d3308964a1a61d4036967aa1712e1c07bb0d3bfaa2106abca72302df06a811b1412d5029fd94588d2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +quran-id = { + revision = 68747; + shortdesc = "Indonesian translation extension to the quran package"; + stripPrefix = 0; + sha512.run = "88328a074b74b6197079c9fbe92170989a1c4ba139e2a84ae96f803ca5805000e11024861e9f033fcba5f346b6bcf38a59231b6849fb4af586eab33795efe7f7"; + sha512.doc = "42d6c03ff54e65e94196ea0b66e77921dc6bfed3f45605835fd6721aae3b97ebb69acb2362bf0fb6158348fedafb8d543f32602358f3466ecfd89cb56650a074"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +quran-ur = { + revision = 68314; + shortdesc = "Urdu translations to the quran package"; + stripPrefix = 0; + sha512.run = "af8d0d7c10d3b9dea55cb4339982196d5dc33204fb9ff368591e50f48b8fd5ea741207466f158a4ce7da1125cadb5240bda38cd4bc5093966fb42f7de77beed0"; + sha512.doc = "17d660971e942478baabe2e98eec7da096c37b13f9da24a8e8e4139d0dffccb280b0a464a0fe76f47ff39f899e8ae0d9a582a01be927ff8529e14c097b81090d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.22"; +}; +qyxf-book = { + revision = 56319; + shortdesc = "Book Template for Qian Yuan Xue Fu"; + stripPrefix = 0; + sha512.run = "be1be15996d6db58200ced70e6b17d29ad015bd1f1ae1dccb7cb50e225e9150db76511fbec37d17711e10104322782f92bf9fedecf990fb4358fefc2df7a78e8"; + sha512.doc = "5bd3f6f9576ae2cacf3351db9cfe59ba519953a6e25e32b2ab4215a928d7a0f2903a9c75f9432c8fff3d9b7221d6ea09c439421eb5c5ec6830665d89836b9d63"; + hasRunfiles = true; + license = [ "mit" ]; + version = "3.1.0"; +}; +r_und_s = { + revision = 15878; + shortdesc = "Chemical hazard codes"; + stripPrefix = 0; + sha512.run = "86b219305e4e085af2a22d34bc586253b5674abb18e257fa96bab1d45695f841020c0004f1da51fcfca0fd0b325e4043f2e368740841a5a2e8db774711ac6348"; + sha512.doc = "26e227f106bb9303c4823f0230b689d6ed883580051e1bd5ec2e16ad796a3e33df2caa389c309b21b010bb43b07e5ec1027d6c046af55193deb0e4d975288846"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.3i"; +}; +ragged2e = { + revision = 67441; + shortdesc = "Alternative versions of \"ragged\"-type commands"; + stripPrefix = 0; + sha512.run = "363d952daecbd0c4d57e7d2aa5bd28e32bd04efd1b26f5ab65c4874fc65948fb4258eb430560bb8d294406cf314778047b0027a45c21cf99f77119519878e368"; + sha512.doc = "be65fa8afee57fb8044ad9ec3ae1ee05ebaf0d8b40388f9876de7c25f6bc6b3a78221b393442e1c3bfe69450eb3c98b276b569540ea8a154a5297560f8a972c4"; + sha512.source = "56482d060b48c8433214b352efc1b2d6499aeb97a689fffd7e2ae5175f92033714aeb61250f79eb847ed3dc63db8e873ae8efab2aa8dd6d8824902a4c00517e2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +raleway = { + revision = 42629; + shortdesc = "Use Raleway with TeX(-alike) systems"; + stripPrefix = 0; + fontMaps = [ + "Map Raleway.map" + ]; + sha512.run = "8ce708ec993b1405dc04ddd96b6d39da324799f404e2798448c12cd03749f11685f840ba4f986b1b0f7696f9141923f3b91f5318de634979720af5af5b07781c"; + sha512.doc = "eae288de26c57ac27172e83bc6985b0edf80ac88538561468924c34656f31507e008097a1e8452ce47729ab501493733a1c022440c31c34cd99f8211383e889c"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.4"; +}; +ran_toks = { + revision = 59515; + shortdesc = "Randomise token strings"; + stripPrefix = 0; + sha512.run = "25b78e30d7e6a2f082a7740fcdb968cd4032e6fd612bafdbeb58613f45882e788809457d0fcf29af76d3eb82c57d8772960ad84f9ed5940fe670f8662853364d"; + sha512.doc = "7e837aba73d0d578494845f038f7616a64eaeecde059655c8ce3ed5a5bc2c5910086c955b6a16a42abd09dbbafb71409387959eaf2378618532d2e494bba42d2"; + sha512.source = "ad77e0842ddd144f49b26a548846f2058611336f51d7540e96ad63258ee46c2f0a139b6945c0fea1f26fbf61b5e1d21ec45f87a9f68009d87ea6b9b5634a2895"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +randbild = { + revision = 15878; + shortdesc = "Marginal pictures"; + stripPrefix = 0; + sha512.run = "b4fac4fe105366ae1047a1d4225bfbe8ecfe6e05c29e955bc91d591f25ad6a8ba0e2b81848f27af96a1509a278864393c8874b14f30e64c8d5b69b9db811ec41"; + sha512.doc = "fd8f83db389fa62ae8dd63a2c3bc8e4feb9beb6c56d7579fbd9e9065c399a73ad19563f22cdbe1dec78bd1c33056ed1cd4d9a534105b34a2ceae0cd8592326df"; + sha512.source = "6180472c45b6eb362076c50a6a813d5521fac11d92881639cfa3c7444fa456dbc7b453e4f94de147a635ce017bb21e30087ec7e6c39ead8778bbe9debb68a68b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +randexam = { + revision = 69965; + shortdesc = "Make an exam paper and its randomized variants"; + stripPrefix = 0; + sha512.run = "bba998f59e869c81278e5a174d3f7e66c6534531064e30152c3a7819b32f81ae2e75b11ee8190772c282d06f0b3b1aa84de2fd730f18edb8bc4244ee31eb60f5"; + sha512.doc = "251e4e88983af9bcda1024e014fb587ee6ae03840b0c59b141dca606271c582a1085b8a985a1d138781f9a3b6b629616ff4d6827a61ed95284a61dc123c39a41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024E"; +}; +random = { + revision = 54723; + shortdesc = "Generating \"random\" numbers in TeX"; + stripPrefix = 0; + sha512.run = "a93eb4d5b526285da18105f67bef5cb4451b7b71be50581936a4718ad99360dfd8141ee9437d374c56eb3db3aad9af4ec8e1555a4a5b8654711bf64aea3f419b"; + sha512.doc = "f2aa83c5e34707ce9f7cb46e6f3b1632784ec741a68ba9faec0d323aba2054de55f184aa9f1120491bbc60db2040087c4b2dadbb9a4b3763b84358c1855974dc"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.2"; +}; +randomlist = { + revision = 45281; + shortdesc = "Deal with database, loop, and random in order to build personalized exercises"; + stripPrefix = 0; + sha512.run = "895eb116868ced533e23d398d0f17bda2f55a2cea52ec46bcfca4004b9411fade8817af4fc9d3d91b2ab2959ea24027266d8fcac0c77a64d2a4b88fbed5d56a4"; + sha512.doc = "4c0ebff9275bbd1c8550902735b4ef0d04dbd688bb1abdf124560defd2e5d0cc23171e8034fc67b5379d0ec30395b4433ababf3c3a244cbb5ca5f15005057f58"; + sha512.source = "3ccb29c8a6b815484929b7bf0e142090bca848d3f5562533380b71e1be3c9fff2d7ed00f39fa68a745442ad45e1b07e4ed38ef2db55a2bf341e6adb0ce51c373"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +randomwalk = { + revision = 49513; + shortdesc = "Random walks using TikZ"; + stripPrefix = 0; + sha512.run = "3a1f08f41864cc3b855fc4a9f8aba298d92505231c728381f5c5aa29f21c73d6e10834ad589c114ae26ba97d092b33e9c83a30518a7f289aa0ec96c933471afd"; + sha512.doc = "00c23d42132d4a47973871bb9a2054385681898d6cd7e0a7a47337808187855812d98535428f6e37a3eb2da13680ac4128fce38db670a87a66483f6ece044c8a"; + sha512.source = "55bcb9c1acabef60ee605d9dbc0cf9d601a31528dcf444f2caf2f8b91867538549bd304b3a73b3bbefdc9e7ec82791264f054386c46b4fe67d20e8ff6a44ca8d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +randtext = { + revision = 15878; + shortdesc = "Randomise the order of characters in strings"; + stripPrefix = 0; + sha512.run = "6cd20551f4b48d30d4c830da395873bd20e11b930336f4fac0f0ccf09c9a956d18107c45aa2b1ecea51d1fc4b0c0fabf06d436e247aac6ff58548cbfd31d35b2"; + sha512.doc = "3bec31ca40816e7e86642e080021ab5faabb19656a15463f712e111485f1de00d698816e84b1ed7b63ea9380970d4e80b04aa0cf79442c7d1d77d5fa3f4d072a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +rank-2-roots = { + revision = 68161; + shortdesc = "Draw (mathematical) rank 2 root systems"; + stripPrefix = 0; + sha512.run = "c15a31fc178dbce9a776c8409d0df18e4ac05e2786aef486bd9a932c64ee6482ca15d6ca10eea70b98f9444f01d292a5e1032fb924cbd1add8e8bdae7a1bfe8e"; + sha512.doc = "b5b2bfdea68db76c4d52d45613cdd45d91e684f24739024c53a2e6efee83660c2534cc88d4aaad5b1e2c203cebf2244ccc4331935142661090b95e29aa4e9240"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +rbt-mathnotes = { + revision = 61193; + shortdesc = "Rebecca Turner's personal macros and styles for typesetting mathematics notes"; + stripPrefix = 0; + sha512.run = "15e5b0c52a70b406cb6de6ff55740206dafb75c8cc20dd45820059dcdb112c03ea0df0884b6caa12db0f792b97e0507f90d06644a8f78cd7569f9489a896b3cc"; + sha512.doc = "effd703a23c4eee3ecb385cf8ca891c50e373fdb91834f45f7ba414d6e69b5fbef8a1833db4cf76e27dc316b734b714926078e4d92de08122dc79948ba928f77"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +rccol = { + revision = 15878; + shortdesc = "Decimal-centered optionally rounded numbers in tabular"; + stripPrefix = 0; + sha512.run = "0a712f0918b4c0e4cf8cc2a0d442a681c6cd4d00b50478751512ed4588f070566f005717196f694c8d07e79f8ab6a49be6ddbda8db71af65e30cfbbceeab6d2e"; + sha512.doc = "56c43ee9f49764ce50da6b1b4fd736cfff16a1cf3907fc7189807e5c946f1c25c593ddc1aa22c2ce2e0799f7057efe2df35bfb9aef0fa1c31724110a352fe4cd"; + sha512.source = "bc0f7ee1a6fec9adf6d8ae77fb174fb0334030fcc504af46bb2cb88516c05b4b9539748b381a029b657f22d7ce6313b0f19471ef85b1064139e6cb7862c726e9"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2c"; +}; +rcs = { + revision = 15878; + shortdesc = "Use RCS (revision control system) tags in LaTeX documents"; + stripPrefix = 0; + sha512.run = "4a9d7cbc5c16163a5866bcc3c9fae95d8fc42b27d0d8dd8ceaf32e2b568bf9ac6b710a4124cbd255f1f2d18fbcf66ae020cca58ce6d16c6c5eb6e0a85e288419"; + sha512.doc = "71430d5e481dac53c3b1d5f86ec589fd855c244c6717f31c16e2fe00507850779fed3ef43db2deb546ec5b99ffe775a10711f1fd59c022f4223a8d3327424cdf"; + sha512.source = "3c2db69ab4106eac241e9126407e90d8b20cf3e186d50cabcb35041a68c1b670eb3bf9b571d00a52c8e4cd410cdd7cfb38e6bb4558560d46420d1074312910fa"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +rcs-multi = { + revision = 64967; + shortdesc = "Typeset RCS version control in multiple-file documents"; + stripPrefix = 0; + sha512.run = "597d15909aa4525608f649c08dcad66ea3e7bc41a5d3003c1fc2582ca459dab58bf9e8a909f92b3a5eb40397a2612d26601ef33fae3d151b7e5188a39ed3780f"; + sha512.doc = "7ff57e19f66f665b1b2e35b32f109f091b21300495177fdd63e60b26a8c8e1d7532e40bcdb2e01d3499b753bbb53b1dec6f70ed3273c43d3fd541a1fe63f82f8"; + sha512.source = "f86425b317ce13680ceb9f8bff961074f081e2381bcd46bd947f711835b64210452e6a230f1b5914e464b827106d4c7a8be5dff78b988d4d49cb7ad9fa98d749"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1a"; +}; +rcsinfo = { + revision = 15878; + shortdesc = "Support for the revision control system"; + stripPrefix = 0; + sha512.run = "6070a3f0b434b5339e527161b7c1e18dd21b23a9b57817a2699bc13369bf35110868e38d3e487b7b0b58ddb12699599a6e8ac4314b150ff2c8049ade5124f786"; + sha512.doc = "c7d149405b9824f7fb9a453386477ee3ebb7e265b29a004eeab687695667a9e8ddd7ca91ffdb4fe7f60716e6c1f2b39004aae82777c58cb60532bb2ace2bc846"; + sha512.source = "bb38328d3124adb4ca1734912bd0fb15040e7d390d886d3817ed547d08e4f6e5a134db6e4279ab2cf0a5b8d0216afaea475c3dceed7381bbc84adbd63bbf3b82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.11"; +}; +readablecv = { + revision = 67986; + shortdesc = "A highly readable and good looking CV and letter class"; + stripPrefix = 0; + sha512.run = "bfbc2764d56277d9a215d4366f812e53361faabd136ae86ae8152ab763742f51d27e9b61bf4a1d42fe2f14a90d5d3d0cf6cb513b3c6f5990ad34abeb26c22d44"; + sha512.doc = "6a337934b2f52cc8543ac0bee5dd52d2deff2e3fbf192977937c8331134227d816c846845923ead87615ddc117b44fb141239024e766e17e1896cfa1c4afbb05"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0"; +}; +readarray = { + revision = 60540; + shortdesc = "Read, store and recall array-formatted data"; + stripPrefix = 0; + sha512.run = "615f0be7efb7cd6954d36ad1dafc9f0f0a1632159247e7d6feb064e272c5753b26c5e07af709240a6e5f8bd7ceb7ca2c2c29842a5bd6e9e9efae2470f7a94107"; + sha512.doc = "d9f87dc14d40c33b06591b611e8a79df95fc62c32d16f72cff96222e7fe48f4c09c95bb0b02a6acddc8b4630158ed61c9375dd370c2f2d21ec8a9328f63fff47"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +realboxes = { + revision = 64967; + shortdesc = "Variants of common box-commands that read their content as real box and not as macro argument"; + stripPrefix = 0; + sha512.run = "2705000ece0e4bdc9b96929e853733eb594d6d12b1bbee97b3068f46ba2c6c3b2d06ed0f0eb5e34bd3e26e331722e51c1fd98ff36fa5c53473e99a7fb1610c22"; + sha512.doc = "aa3d6f25505cf1dba7c5ae5c364524cbed6c6a588073fb29e7d9b14706b8ffbe5998dca4f17e1039aa242ad4bbc29871c72686f920610d8662491e1c91e339f5"; + sha512.source = "096371da7866350529304b9be81460a2e081d4725c29ad423070253b7623069ee0d7ef7af6b2a88dba650231d972dceb74a70254765753f4227e39946245cef2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +realhats = { + revision = 66924; + shortdesc = "Put real hats on symbols instead of ^"; + stripPrefix = 0; + sha512.run = "9cd41126ccfdffe1322e0b49af113b65761a34fd8bffb96390f7c50d78739be06605fa2e16347a226bb7fba47bb832b1bfd19c8d836dd557fb41ae5dd0281d5c"; + sha512.doc = "94fa596ae22d6c4f75276b30e5fa0f0d03d575f01ef2d6e6a18454bce3c0328a8dd7b804d586af57363ca1c5eaf3c57a4d021fa37327920f123e7b8b2ab55df6"; + sha512.source = "87f5274eff261f29b387b8b171a1ea031e5373b282950c60517c66163c1f6b75cbe4bdd52731249b22348386fa3565952852efd5143c80edb8e6e070b0e77f5a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "7.1"; +}; +realscripts = { + revision = 56594; + shortdesc = "Access OpenType subscript and superscript glyphs"; + stripPrefix = 0; + sha512.run = "fc0c686971c536b3490438e74322aec06371857a987bd70a6def7310441229fc4813d2080c5aa9b5e22cf78dc8ab1c3ed75b301acd987117d3e6f1f589f78981"; + sha512.doc = "bddc4958f2c57e5e05fa31912a6c19ee123be463527f2e1121405194ac47b6a806790c204268bcf590785c927808b75305079ed44537ec84284c594d691c906d"; + sha512.source = "117c3dadf6aaf7a46a3290f6c49d23f62af1206e512bde7098068071e9edf00bc7da0fb34392b0911a4ae525eb0a99b946317d31d12d3312879debdfbb345a84"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3d"; +}; +realtranspose = { + revision = 56623; + shortdesc = "The \"real\" way to transpose a Matrix"; + stripPrefix = 0; + sha512.run = "413eb0a65d79521c81417afdb2d7f0ed8bc625d107d2fa19db84ae04a1f27f2da8f07fea27139dee411e1850d8646d63412eb581b08a9c4dd69c886457027cd1"; + sha512.doc = "a2382dcfa84f3a2773ef6cfdd5a10bf23cd541927e2844419d75be6206ff5b42f37243ab2157ed5765c0f9c090340b6b75b35271157daa3440ee9d81ecdff9b7"; + sha512.source = "5fd124830f8e5e29cc9b1a2ef967a21c2065d183bb8ae1560b95e66b09d1248b8bb6a65e6321651c23d309c2508c05629c2b7740e8c57e4130d2f06b99347097"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +rec-thy = { + revision = 63982; + shortdesc = "Commands to typeset recursion theory papers"; + stripPrefix = 0; + sha512.run = "0497b8d382cf239b6b8d2f4bf2aeb3af34c8d1f1ad94640f930c316f9b7bd7e6a150c3d344a555313a88cc848fdafb3e392ff6cec0caf72d3517dd1db4b7c2c5"; + sha512.doc = "0733917542d683cddfe9651bc9187d2dfa7a57e2bfbfddca687a5bda10609451a3f58cbfd7f5308647f9a3014f0a4adc36e9075cfc1a5b7db48c7d1063cc9b5a"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "3.8.2"; +}; +recipe = { + revision = 54080; + shortdesc = "A LaTeX class to typeset recipes"; + stripPrefix = 0; + sha512.run = "03e9e48a2e423f36ccfbeb2e61ffc7c3588658a158c1729f697ce44d98079f104cdf1c17d85ffd5700a7532f762e22da0c4388350007eb13226cc0da43b08678"; + sha512.doc = "4dfd27cfbb4f5f5f45a5fce25fcbee4c9881990dba1009337f41e4080686e993246189595a7c28b8d56bdd2e81a70e9c6fefcfef0897736d5400888bb9fca210"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.9"; +}; +recipebook = { + revision = 37026; + shortdesc = "Typeset 5.5\" x 8\" recipes for browsing or printing"; + stripPrefix = 0; + sha512.run = "c030f81bac27221f24b275d689fc7cf80bd6d97ccfecb0c5d51876ae825871854d7729e123caef3735a7b2a5608f070ce170709c8a1723b5c740f05371c82154"; + sha512.doc = "0c9d803360e1ef65b38f5b66c6d3eba6e9c38c371a430e2cca371594935fda16a051d6d1ee33e787114747b9efc36475c6c92b2c8b199aa1a5b48e214f7a4643"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +recipecard = { + revision = 15878; + shortdesc = "Typeset recipes in note-card-sized boxes"; + stripPrefix = 0; + sha512.run = "62778e7429aaa8e4bed6546c748a7e135c9edc4909508723e7931284c619d502e9efb0e6fa54c8c1d242858355c6d95bdc87959400c18a5648ef105035ace26f"; + sha512.doc = "0e62ac28631ee072c9b0b5dfe9995744c381f17b14da5e9c8f4159fb274cf2a7662f0eed8f728ec5990a6a957de051304601acde2d171e696e79284ab2faeff3"; + sha512.source = "d08838184d5d21107ee796835c95dd446242ea3433819229ab918a30e73a3e042e6f4cc8f75c144ced7a16391841177409567bdf3116632b0915ebe47378943d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +recorder-fingering = { + revision = 68595; + shortdesc = "Package to display recorder fingering diagrams"; + stripPrefix = 0; + sha512.run = "1a97324ac1264d293a05207a667255e5711cc13b6acc02acd5a170d776d357dae9158491bd0adf96a11e17fbdde1d24809940d323f417f31c5b73c55c7758031"; + sha512.doc = "ce1782952b53171c686d0f76d9f48a127e6c6bd6c1c2b0eccb00fb8968f31c809118f6bcce0503a61997907feb7d677ad23692c68427bf8666124bb0b040585c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3b"; +}; +rectopma = { + revision = 19980; + shortdesc = "Recycle top matter"; + stripPrefix = 0; + sha512.run = "17a297d7862eeb8c48788e40fd761fd42b37fa7b49b7447e00e828f1a7e0f2e411eee357507d79bfe0441c7feada9e06fb18ee5ce0af87e7aeec7ae618e22d83"; + sha512.doc = "27ae9a381a685373a980e13b9b5c3f6057f98224a7c9659edc0c056a6292e7289ed9772f3a503e8de3ea93b796f271dafeba57f6e240caaf738003e1ab848e46"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +recycle = { + revision = 15878; + shortdesc = "A font providing the \"recyclable\" logo"; + stripPrefix = 0; + fontMaps = [ + "Map recycle.map" + ]; + sha512.run = "3bc28ed41a8205534d34593429429768bdfa64e61cc212017ba4be32f7a985e8d65ab296137cffbb7ad5be4dec90bbfd30d675ab314bb79ec0ea10b277c33d66"; + sha512.doc = "3bbe68b48915c6fa662fb72072eb9e130613587e86d3d4172766c8fe690a995d23d252cbda9a226a7716c9da8741b3ed0e18eae1cab2f547d08265ee493a64dc"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +refcheck = { + revision = 29128; + shortdesc = "Check references (in figures, table, equations, etc)"; + stripPrefix = 0; + sha512.run = "46dde83ed04d4586eb6a2af393ab925aa7238a30c23f49ea33f0da331e2a5071447c5df22b31c2cd9b10bd37458794fe15e53e0e79f002bbcf95b0471d6a7d02"; + sha512.doc = "a87b6ab25848571770bc8a7ac1f47e139c7a2abebf36b9c72b65bc66e02c14b23f7b0d2246c7160b7669460f52afd29063449c6659336f01f3e99df53cbb4428"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.9.1"; +}; +refcount = { + revision = 53164; + shortdesc = "Counter operations with label references"; + stripPrefix = 0; + sha512.run = "da914e64de5b70e124d9eb62148f5650c9445d2fdb94272ce622478b9aa50a4c7625be9c2152fffe9ff9fd87ee19319a0bc31ec5fd82839a479faec687de4af4"; + sha512.doc = "5324828978e3c8c14e9a28b86cbf87de175b9908f460ce6090bf19944557cfe82b112c6543d2878b54f4a16b1a9f3f3ffc66eddf1234c04b8852dbfa3ebaf27e"; + sha512.source = "26c03363bd65be818d05792fc1c7e3a2e7e747a49382562eeebaefac35d5b4143b86bd46fce97fd4aa0f162ce7a1399e200f2593b3920091159bcfa08f0f8781"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +refenums = { + revision = 44131; + shortdesc = "Define named items and provide back-references with that name"; + stripPrefix = 0; + sha512.run = "7113ba67dcaf3ca2a070e42b4fa9660889bdf7803401cc0f8c3f9f62c59e467d9f637c526712bf9aa9fc7ac3df3c550a41f419de9cff375e24e68d102207e8af"; + sha512.doc = "3511419e6507d2c5a7b48679e9220e63643b38f803e8a5d7046a55ea6b6f4827fdfabb74336fe61ba35628868a7f042ad472567e73351d13ab9568c508468a97"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.2"; +}; +reflectgraphics = { + revision = 40612; + shortdesc = "Techniques for reflecting graphics"; + stripPrefix = 0; + sha512.run = "ad670c699d958eaf103db1ae65d79bad78dbb0677c7464144739fd67b63dc5acd3c298f81c81f258de477fe9f2d4a4177de887ce1c031ac9c701662167c1a5d6"; + sha512.doc = "78717728d537cf0dacaee67151cd7f19fef6fa031a856ac49a58bb576337690df4323c80e1ff0f318a4eda3689fbdbc2aa5a3bbcef69b957fc4615ff825e1e0a"; + sha512.source = "f228c9e8dedcd7d261269c896b0ef1ebeb7efc18a0137fcd64765ec92b957eb634d8e0e2d4f6aceebf1760e65936c6bb1a7b706c852e6c220282448830b7f672"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2c"; +}; +refman = { + revision = 15878; + shortdesc = "Format technical reference manuals"; + stripPrefix = 0; + sha512.run = "45f51a654703a7e749e7dbb08fd0ccedc86b5f264ce08b504ed11827799202583f81a4f3fe32dae0794e20cefe2e6bbd0ff8563955c3a85eac2642c307aaf332"; + sha512.doc = "560d70322bcedfd0ca6a10c161d3930d389e77fef25ed568f5a68ec87eaa63efd4f7dd2363bab283af00a49719c3c8ba38e8a35ca011ea349dd854a0698ec79f"; + sha512.source = "722e2493c24738bf767b271183eb1422ab103b84dec17d28f615a52d9b35e1671d3745fc5a6fc97b2a9d7934f314fbc7dba9734af8e0c802cc6760940112230c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0e"; +}; +refstyle = { + revision = 69680; + shortdesc = "Advanced formatting of cross references"; + stripPrefix = 0; + sha512.run = "05e95688dfa1e8a8a3be6937cf5c36c315371b66c14d5dc0e51862db7a5aa0307bda55848806c259b68be64bf2b36e6cdf6c328b41b84f839ec67abf2fa949dd"; + sha512.doc = "6b71671a5a7b472823e805f5559acdfbab76bbc06a063c7efec468122b3884dbe5a6229c5ed7ab4c0e1aecd304c3333a58fc5c75c22a66739fe0ca16b5c686b9"; + sha512.source = "60064112f68bf18d55c328da986c852b23fd2a9e8082221d4b4b29d901fe37de8c2ab5b9b21701e0db8ca2189945c25bd661ab9ae5a425351a3197bc0a528c27"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6b"; +}; +regcount = { + revision = 19979; + shortdesc = "Display the allocation status of the TeX registers"; + stripPrefix = 0; + sha512.run = "6481e37b45ec26aa270637b465d9fabef010c6717c0a402f0bc2afaf5dfcd877e46fd8699ff8fa39d80218e6f319e09acec1417a47fedefe6da5d90a81b2928d"; + sha512.doc = "19215d4d4e22777b236f4226d82cebb1d0f8ced841cb33a4b275f0cb558c3addd4a1fd76d3aae9cac5e275695e197574145649be5f767372bd1bff13ec76cbb7"; + sha512.source = "4b152aa79080914fa59e2b8a3103fea930ad3a0ab8959c570eba06ba36596d82ba58d03a4404cac9b2ebe3d073ca0eaff856a892b3d1e84d183a9ed60f32e42a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +regexpatch = { + revision = 58668; + shortdesc = "High level patching of commands"; + stripPrefix = 0; + sha512.run = "80b3be47155c8cd654d1b3ff7a1e261da826d97237b15733e6f63f6e3e9f1e40fb8f1cfbff48b38c4ca3acabdd3209147664aa8aa408b4601751f58d596c0f38"; + sha512.doc = "7cb6eaa1ba3e7ffcb80001b2380171204059907fa5345c3c684eb84861340f70590a8b5f1f3fb30a84516ccb2d49b3245a6a697b328157f7ed09bf9caa80982d"; + sha512.source = "bbe6ee9178c3f7d3272fd585f50f0ab66a86d38bbc65ba40a7deb8e22c6d300299c8f4203d3849b5f3c068f2194bc2ef0206ed0c0e5ebb3b235d8a83cd367d08"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2f"; +}; +register = { + revision = 54485; + shortdesc = "Typeset programmable elements in digital hardware (registers)"; + stripPrefix = 0; + sha512.run = "709694065b22e33c9d3f8d859ba8632672bd5e3fcf6102d0915c203b4fa6773e0e78f02b1af537b3ff2eabab5dffdae40e0dce63232037c37d4e50ff325e8116"; + sha512.doc = "08ee956f1f667245f3dc63a27f10b898a03929302f68f1fe19bfa3cc923a890ca72795d4500b16da31e7f69d375fc60e5023ebe404f3ee8b0ecc289fb7a6af5c"; + sha512.source = "9bccd74449f5b20fdaae9b1a6e9178a1849f711bee6ca23229c20bdb78f036a81d38a370cd8dbd0a092d0f9fbd0f97b71d61e81f337561e7345610e04412dcf3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +regstats = { + revision = 66795; + shortdesc = "Information about register use"; + stripPrefix = 0; + sha512.run = "4eaec929726cc9bce1481d4edd4222468c05aa30272b24e26b0c9737154316430ef91203531fbb94e3432fe06042de22d30a6253c1eaef6f1c9287b4f0049460"; + sha512.doc = "8c9f9156e513a4f29c7d362146056fd69f7eabac72e2747c1c93821c9ed69753630da257e1a250b415074c21c1793e4f5c57ea4022338b104871379717da37c3"; + sha512.source = "0a2b173393405c825dec83d5151b1cadd31a1e5b9b20210b7e46982836807a2e7e9c294cb3c184af2464334d43f9a5792f7ebd6c868ccba3f0b7879d34d747b7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +regulatory = { + revision = 69611; + shortdesc = "Flexible drafting of legal documents, especially in Dutch"; + stripPrefix = 0; + sha512.run = "5225692577191c662f7eabb217b9c969cd410e75f07f0ab6b2b8e7745b873249f6b56ca8b6f1b8be8fa538f566ace75af847b272045186487212d452dce9f007"; + sha512.doc = "ac792ec6ee63c2c69cd54fcbaf11e78c49fa819f3dc3bf3eca072ae76fce168c3cb5d3b26f3b0c8e31ed6118eb7787b6a043f0bbec298a80b129314d332c9a2f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.3"; +}; +reledmac = { + revision = 70207; + shortdesc = "Typeset scholarly editions"; + stripPrefix = 0; + sha512.run = "a342f8a3e20265013b493836e5b4297c847718bbf8a8cd0eba4e8efee53a2ed6e937766f67ea6b1dd3f09ae03d670f2e1bcb5bb9acb2d751d63264f1212266b8"; + sha512.doc = "45172bbd27094522f440d6df80826494381d876b715b849415fcbc13e4bc4a78a937b3dce3387540f514b9627413a3c96cfdbe390b101ffb2e2662a7ff716cfd"; + sha512.source = "67ab848a05a4592b2755c2e935f7613355881c32408c8f999b63815cb44315b72809c2287ce5aa7e27a80f5fdcc399f501a0cfd67428e86a050075e1dd54ed20"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.40.0"; +}; +relenc = { + revision = 22050; + shortdesc = "A \"relaxed\" font encoding"; + stripPrefix = 0; + sha512.run = "d638db869698a6b564f1482c3ffbda561bac0da00e008b5b3ddcbe267587813042bd3d578ea871f5ef48a27309baf8e290413b65f99daa26ba7a8b2a1dc62050"; + sha512.doc = "b5e81a7edf8e7d0c3be9ea46ffb2a43af5d58153ee91d656faba600d4082a8982706744ba1991c82ce8c119fd12fcc0eaee30353135338154b0445e48f33472f"; + sha512.source = "ef1a5c1034dfac3ed942354fad6a9e4cca44a33d2252120fe824bb41280453a6c8e00c259331e4159206f60e5043664bb4008e758d8b81dff06c7d68c3382e6a"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +relsize = { + revision = 30707; + shortdesc = "Set the font size relative to the current font size"; + stripPrefix = 0; + sha512.run = "90a4829b63d86214c44cadab6b9c9c114d6abfbd72dd4cd8bddb18add9b7fede2867f39d57b03ac9e7762950db71664767554b515b5409cc873d8b31aebb2c1c"; + sha512.doc = "45b6e38a14c31d7387a99d78c395fd0cdab5ee8bbbe72f840d511d14f6af73f749649b48977e8a995c2ee375358677b31a97646c8162c5fe2ee6c286a05a20b8"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "4.1"; +}; +reotex = { + revision = 34924; + shortdesc = "Draw Reo Channels and Circuits"; + stripPrefix = 0; + sha512.run = "e97663d414291b3d0a009143ea370676bdc69b1897492ef86bd2092e47fcead566151f175676b4a19e196054ecd4a41706a74e9d4e6ba353d9e346786d04a2d9"; + sha512.doc = "fbdfd00526129921896db36234343d991bba29b68adfdd06d9fce262a58b2cc544dbe49d28cb9722eff1fd03ba3a765e38368baeddff18e36bde436c56ce538d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +repeatindex = { + revision = 24305; + shortdesc = "Repeat items in an index after a page or column break"; + stripPrefix = 0; + sha512.run = "f700f201ff05d25fafde3eafd63ddb5aeba81dfe8be0dc4522a08459f35b3ab78cd06d215477ef5bd59c1dd6d1a05361ddfdc21159f3b6347f5a8271c4193192"; + sha512.doc = "031a5113799f662b88b2275f2f82467e2fd84ae58d18f4cb69e090aad7f2c8cb44eefc4c43f3fcda9e92de0c0027fd4ecaf9f152d33b73ebb69f06e6b4c8c1ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +repere = { + revision = 66998; + shortdesc = "MetaPost macros for secondary school mathematics teachers"; + stripPrefix = 0; + sha512.run = "502e1948f22a70003eb5ff4b6eed2790e28cd5acdadcaabcf1f0be699026fbb1cb7144bbb15f230a25f85abf00dc1de075ec44fcc6fa10e26550f85b50a272d2"; + sha512.doc = "c16864711c87f2632cfa56ba06968ed967874ca25139360476f6fa2bb7bd89b900ff8a98c4514b4664e5d623c9d29437e375284bfd0073b2cdda0eae13e896ca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "23.05.b"; +}; +repltext = { + revision = 56433; + shortdesc = "Control how text gets copied from a PDF file"; + stripPrefix = 0; + sha512.run = "a5deadeab45a6a2ab4732e91c26da32f276e2d5b35ff357faeb3361c917c3b47c81e59cb6934d052d3525df2a810510e6fa7a8b9e9d6d272c91b4b558de7132d"; + sha512.doc = "0694a76754c98bcfb6999ddb96c368701556eb1de025af1ae32ab8e39361d18405fbd2c1438c1ebafd2cb06f2d9884afc08e1c94f57eaa89313f54d58a289808"; + sha512.source = "79a4c693599b0f20e4e1b2210f65dab3b1cc276bf3a661f385a2ec70c703846e881bebd2d6ae8913a007b832206e033f178c4017fc69ef099c3ff87f4b40f651"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +rerunfilecheck = { + revision = 63869; + shortdesc = "Checksum based rerun checks on auxiliary files"; + stripPrefix = 0; + deps = [ + "atveryend" + "uniquecounter" + ]; + sha512.run = "464daf4ee4f443f4ff329e28b928df94e83e83696e3e5604de7b51beb61c25a0ce50dc00b35d2cc8d0cabb32d10bc28c3c06069f5dd7eafd9fdb2d44a3adf313"; + sha512.doc = "7c570d38c989aaeb7db5271501c5384ba8b8601396f629d7ffee32baaf1c289592bb5d69d2cb2784cfb2008fdc047098d43dc20803e4b90eac59848c15dd0cb7"; + sha512.source = "2d987c01bc0f67708080d4578f308444ed3220a37ee11ef1a95c2a9bfa0ab49a46ab46d291153f0c748935f473124d70212a821233b22f1e606be6183e4afe81"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +rescansync = { + revision = 63856; + shortdesc = "Re-scan tokens with synctex information"; + stripPrefix = 0; + sha512.run = "4ad1b90e89a005930d1ad5500418c0d867a1100d21429af64edcc803811e29bf4cd79815fc0018505c8d9504069f7f17bf6e09465484bff5ddb3dbc79f54aab1"; + sha512.doc = "602eaceabe16b326a1e2546b3fea21f22c17b92d01500dfc30f0659f0cad8d93c4e919a18af4a96e8633afcc4c08346dec8f5e84f55fb1f54cc2067e2b54ca42"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.0"; +}; +resmes = { + revision = 65375; + shortdesc = "Measure restriction symbol in LaTeX"; + stripPrefix = 0; + sha512.run = "b55b0ed4883dacc78d7d4406fff05ac80421259e85297ae8050b6a77539fd38655caa6afe6afb7c3d8654d9da0d965d7cfe52cbbcc6ed9f7be4d87aa9cd6abc4"; + sha512.doc = "f2faf70d393cead42f20aeb5fef487870c69c8fb557fcf6dc3c589fda448a73b2ca0a0a39e4d963e67a0b38f976cefe410b2c983f820dfe7aca2c255a24f4bbd"; + sha512.source = "67d88b13822d35065708d68b57c2013fd19276bed7cd433235f94b9af0c47b92c13307177c78cd16e3a87a6db634a3c93a1d8e8b30e8bca1babdece0defc8a0d"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +resolsysteme = { + revision = 66192; + shortdesc = "Work on linear systems using xint or pyluatex"; + stripPrefix = 0; + sha512.run = "b4d196ea41fd5f4c9d78df932516a8f1bcb2a8862a4b367a8a288678213fe7a7d6fa8f4ee531982dec11bf04576cc5836bf47368f282cd939464ea6df748eccb"; + sha512.doc = "3fe3d927326acf296c5cafed3c7ab5902ba7c8c943e6bab280b1e0f0a997f90c3e2676522f3dc7dae0436845b4caeb2c58804280d546dd4e6223bd1984659aa2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.5"; +}; +resphilosophica = { + revision = 50935; + shortdesc = "Typeset articles for the journal Res Philosophica"; + stripPrefix = 0; + sha512.run = "0ed9a50305132206585f322ba68fb514e0a4d566fc703a617cc6eda1de23b53820ee45231167f8b81aac826de732763e3c141a9ab65d13fac5d76e92d2101cde"; + sha512.doc = "30739549cd7295186c10a54232e4ed57d6c2a589acf6f27ee758a40880e7a4178375835662b88bd78bd50ed0f695c71650003ae5ea78c63f5dcbefa15c5dd770"; + sha512.source = "cfbaa18ff43da9287755c0cb3f218a57f034862ff9a63b3b77bc51e8171afc7c4042ee567230e7d1c263d7f993976bf4c2f3bfc055f0dd759b034d6d42d6df78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.35"; +}; +responsive = { + revision = 69147; + shortdesc = "Responsive design methods for LaTeX"; + stripPrefix = 0; + sha512.run = "13fd41361d1770d9fc58f1834adb312bde154800e5b1b6c39cb7c0b50dc5623ae3970d5d6fd179c706bcc6d92512f1af88b9dfd78440d47a9e330bff568d5ef4"; + sha512.doc = "840556a6a8ccce54850efce732e63e58078e12740c39c8b81ed47c470d39fdb8a9cd27dca9abb5380fe2d9afdc41c801d2beab4717933bd4ac110c26491ea082"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +rest-api = { + revision = 57068; + shortdesc = "Describing a rest api"; + stripPrefix = 0; + sha512.run = "a5a8f299d6feaaf4079e4a99fb84bdf7752016c92aaca0d0060692c13a7656c230e611e06bdb805712e7427d2e6cb599b96bee77e0c51ed769c4bc49cec32f1d"; + sha512.doc = "b823828c122f971101a161168cfbd489985c159278de80db86647b0c0adff207747b6877795ca97b27f541c7907aff90213feee61d4b039dffbb8b7514923e54"; + sha512.source = "2869854fc933ed536ef425d8418303e3558ed8e0b3681c2d7042e1386b0069dcf70286ee732e0f8ace19cf6965e3bb046caa0384ce1423e1c71d9591012e5a10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +resumecls = { + revision = 54815; + shortdesc = "Typeset a resume both in English and Chinese"; + stripPrefix = 0; + sha512.run = "1ee39179bba50d32bd3d6d9a00dc9f77a9a2b1822e13958b15804307e36ca208eed327f4f8ac144418e2ccde8d9e248dcf4c72bd137bf440f956d60d0bb11634"; + sha512.doc = "23a3484a598f3b18763443fd4131a2e0278f17788aac6b640b00f0935c43ee7c3da5850892b525eb6bdbb9fb01d543f7a22b93cd5ffc64290ca0fa4f41a31354"; + sha512.source = "a2c0f2062f30675fd4c336f618e7f25e1abb2737aa98f5bcb499c5941ad4615246046f9b8a5aaa57d94ed3b40906a73985c2045f8e571c2d86cc0e7dd2c243da"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.1"; +}; +resumemac = { + revision = 15878; + shortdesc = "Plain TeX macros for resumes"; + stripPrefix = 0; + sha512.run = "f944441058cbe8468ed6646dcb10e09cbac78d5c7408c2a81f2531491739034e47da9fe8f45583008892740a57a2d36bbd1417f05f8d998bd79f886bfbad87bc"; + sha512.doc = "5b89a7684cbe4da1c653d4a6253f82304b7b3634a9dc973e5f7da41967bdb034597e64a4fd82a922fac5ca62ee40e2ce35be6234deceb25000ff9103859e165b"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +returntogrid = { + revision = 48485; + shortdesc = "Semi-automatic grid typesetting"; + stripPrefix = 0; + sha512.run = "751eddac662b8ca6d61edde7a25b11c357c497743aa0edff92be2a672fa13e4a92e6aaf40a8ed69853db642d656c3f54ad0af6cb35c94fe59cd540fa19f7b964"; + sha512.doc = "6f5eb1997e25ceaa7a8956ced78c584058cb8f9fc112f98c350ff996826188f9b7748b7bedc6c19ec0912894500a4743dc7542532317016ef3d295563c450889"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +reverxii = { + revision = 63753; + shortdesc = "Playing Reversi in TeX"; + stripPrefix = 0; + sha512.run = "28117df00d778cfcc2ac035545c561ba1f078f024a8676e32d339f4c47b2206e2711474edde9c15987c397dc192528c8a584dc6bd4121e6da6588dc1a2bed71c"; + sha512.doc = "4d47dde91731affbaaf168e1a3ed79160312d9533636a95c6f9736e6f8c01f2514ec4e4c015bc9d68d0abf637b39fc063820c856693e8876ff7aaa1935f009f9"; + sha512.source = "2dd66631854044834677e0167545de184382c2f9a925b4761b041137ac957dfb2bc645f1065c675efc45e400f7d8ea2a79f0bdcbdc84bb29c1e4bad1d54769d7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +revquantum = { + revision = 43505; + shortdesc = "Hacks to make writing quantum papers for revtex4-1 less painful"; + stripPrefix = 0; + sha512.run = "0e69ce3a2a4a1c289d494e081cd28e9c14c84a45717880e92292cc94803783a350bbe33426c4f5e7ebf64e5b28876e656ab2f1ce681b86c27c7a3c6700563a41"; + sha512.doc = "16b8ff06bbc2155a853a26a0b622e3f89bb7d35439945948128fb37d342d293951526d415a3da9a01381f841dd61287317e52dddda8e8fa6e0eaa5d6a0006dc2"; + sha512.source = "47e7a900aaa9198875acb1a0727bd30b64c0d41e9c33cd6240c29b8d67b17960f1ff05f717701385f627e6827881d365c01ed68b1adea8bd3e1b5423700f9bc6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +revtex = { + revision = 67271; + shortdesc = "Styles for various Physics Journals"; + stripPrefix = 0; + sha512.run = "3c0c008929457a405cabd699a6bdbb0c4ad2afde1c7155b163c52e9564f15718bddec782abfb6336e55c77ba1d0d0d88a1da39420ed1116f21efc1e4c93d4751"; + sha512.doc = "de2053c650920b4e83183883b4fb15f25abde4210eb0c0a81adde4838c76db8e755a2afc74c8f3cafc0819d57b762e701380687e589ffc785cf6439d120c1474"; + sha512.source = "270c74b7f50c5c8ef4eb2f27dd72e5029d6d48083baa9b477506e1559fd6684aa9ff95f371c8a40fc1535455a89e13e625b1cd7c129ff18ff3101457794f34b9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.2f"; +}; +revtex4 = { + revision = 56589; + shortdesc = "Styles for various Physics Journals (old version)"; + stripPrefix = 0; + sha512.run = "cd1f83a7f2664c6002b93bf7ac3b5dfef4767b79f66cd03ed738e395027736d062d23f1a6a9354834093857d467664168295e615ed1c734b708c098943d7bf87"; + sha512.doc = "3e74689745c65b4ae0aa5afc946983aad0507de7cd382db5cddfad6bd13e1414d5f72d7fa1308b3fb65b34eca82ae632b772690a67c643eca6a26490508f7597"; + sha512.source = "32be85786fab483ac0bf8ce8e0bb314a3920e17b3102ef7ad719a4e43c3fdae113089c76587ff2075f7bedd1a6dde3fae6123a0f346082aa7a7645e7c76538e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0a"; +}; +revtex4-1 = { + revision = 56590; + shortdesc = "Styles for various Physics Journals"; + stripPrefix = 0; + sha512.run = "8c3e7c3845cd070ec51430a14a5b2d6f5b49821a837a6ac1f3a8889b353324479cf6121de0084b021c46722c425caa997b1b14df454f70bf7201ae4884de0f33"; + sha512.doc = "d17acddfc14e54d74b874d6d7599a3d20a2e314072a760b0d03ae7e17184e0264fc2d98f0d3b32109147f9b4e0a099e0c7f7e8747730a567d3a2b44d4e4d22f9"; + sha512.source = "d21d299085b7ce98e665cdd28754878c95beb7b0f0dbec970be3e39334bb520eee0ae4784cb4118b60edc0a92c6abb5bca8ad567cda65f5acdfd72449b15f2f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1s"; +}; +rgltxdoc = { + revision = 53858; + shortdesc = "Common code for documentation of the author's packages"; + stripPrefix = 0; + sha512.run = "85b9166bb4408d3b1091b033455650fdf53b24c2fce821c872420191390a1bfbf457326a1a85aab1bf0d6c15765275337764f87adcb393464f2533e2462f10c3"; + sha512.doc = "5e35c6d1e6883c895d031f047fff1ededd4629158a8958b61fb6fcbd885c57797726f595894081b4933c78e5f346289a020424405e0dcae6df40b279b86395cb"; + sha512.source = "8f94655ca8d0006aed02fa7e8fd28c5e3b8be6e92ab010a674d85bc88ce8f6e0120392540fcf5f7649a4af1e6bed4e0aec3d1d15cd095738beeb709fa2efe526"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3"; +}; +ribbonproofs = { + revision = 31137; + shortdesc = "Drawing ribbon proofs"; + stripPrefix = 0; + sha512.run = "88d1ea87819bef7f8e70e0df273315981c28ffdbc00247431afb8b92959aa2e0a3e489b01f7571d30ffaf3606d240f25bee6487fc704f39417146a93403bcb3b"; + sha512.doc = "d0efb33c19d632253384182b562cf0e0aa10be81ce2336992c83ca7d25abce37c44b152cc8e928cdac90709cb99a4a5caf3ce8a631b13762aee7b39ad92da3a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +rit-fonts = { + revision = 67659; + shortdesc = "Malayalam fonts by Rachana Institute of Typography (RIT)"; + stripPrefix = 0; + sha512.run = "6f9be849a018d8714d30dec2d9d745c745c48ded444601bf64136580999614b514ab23468a440e8811ffcd114d0968606bac269cc3bf27feb9a5cbe51a68810d"; + sha512.doc = "bcf029e75ed4d8fc403d8868bd8e01df2ca6c292766750ecd0e7c32ee6ac2e3a48527e321475c8f56ff7f38541aadbbfd8461fa59ec1ab911891bc73fcae1ec2"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.9"; +}; +rjlparshap = { + revision = 15878; + shortdesc = "Support for use of \parshape in LaTeX"; + stripPrefix = 0; + sha512.run = "9a7f5f821635f110d9bad0015d9fdf489f836cc6ec0c101f63a3bf5bf9235d7446dad98db1325b0720bab85d68432f4cbdbc6dfc78456329a8c48b47d9212abb"; + sha512.doc = "73987b63cd565766586dff08144bb9cfab13b7251053d5f008ccb7dd3091ec9d3bbe8ed92fd8e7dddce93afd13a649e68826468b87947a036a054fea76225921"; + sha512.source = "37af8ef7c124fc331a4156b177578aed29b99777a0270ef819b896e5f6dac9b694c3a05ea439cdc21533a405bd052e071036682b0846905c09ce95c32a986dff"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +rlepsf = { + revision = 19082; + shortdesc = "Rewrite labels in EPS graphics"; + stripPrefix = 0; + sha512.run = "198037c1fd20eaa28b727054607241b7ada10c9dbf4d48cd36f295a8b51a7d4f94859d2349d3d4e831a74e0da025ccaaf91fb53a3074a704f7a3216bb7df0cf1"; + sha512.doc = "fc06c857011fe01b07180c9530a334e021f5b9c034c65e15959e173a409670947c7aa406bf751d64d5d77d462139f4835824aa53203381d27d4ecb0e51463e7f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +rmathbr = { + revision = 57173; + shortdesc = "Repeating of math operator at the broken line and the new line in inline equations"; + stripPrefix = 0; + sha512.run = "d1394e40203bc7a0adffd26587870ad4aca0faaff6226047cedd5ece5e55e6a99e56829a38ce40b6736c1f9a03b9bc4b337a0e4f9eadf0617ddc385a60372176"; + sha512.doc = "e7c8d4f198399ac35e51a0d1c2c6ec420c746768de362a8179c0208325a45b11a8ba6445c2b7a433e7689e677505e3baa4b87d48a749bea5f3243d10f43deb83"; + sha512.source = "44e4859933c2a5f664feb1bd40ce1e51da845fed56b8594d3fcbbc814654c80b18d20760db3c2690fbfa74233523e4e8492471415154942cd2666cc52837a98f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.1"; +}; +rmpage = { + revision = 54080; + shortdesc = "A package to help change page layout parameters in LaTeX"; + stripPrefix = 0; + sha512.run = "13c05ff27a2b5979102c80bf30cda04d72fd144ecf43359cafd427417ed9f8921332a0cbba704061847c9f1d740f795ee1135f6ba2ba183311496884189e3fec"; + sha512.doc = "e4de990151be0c984486b833b9f883d1f3412371fdbcc09900b89849b943800cb269fe0164695e95472b463bb4dc81b92fdc532dd59a9c3ba451fb961b89211e"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.92"; +}; +robotarm = { + revision = 63116; + shortdesc = "TikZ powered LaTeX package to draw parameterized 2D robot arms"; + stripPrefix = 0; + sha512.run = "fa60eb073a9a47690935403a13da3570a4aa44e9ee13c12c5a4ff93a1f02509ab35b5f64a03a67be74190420d0b174fbb4b9a34070a646ea557f03a584fd354e"; + sha512.doc = "2d2838b21c1b0c8201375e0e4e4599c7ca11bfbf05a55e070db236ddd3793e51d1f809cb9c5e92bb9faa2e3b90b01cdc9579bbb44c653294e384c66b7628ae5e"; + sha512.source = "02b928d574b29d2de845421b650156432911c3a917c7b2f5f13a1e3decc513abf5a73fd1d8bc27563885c9502e3a6058258a79e4fca2a1cfd59437a033b3d58d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +roboto = { + revision = 64350; + shortdesc = "Support for the Roboto family of fonts"; + stripPrefix = 0; + fontMaps = [ + "Map roboto.map" + ]; + sha512.run = "d82d9ce9480bf0c9d7f6559e7bcbb5fe8f22179adc44113121f67fc0daadd66c938b9fcf9a41073843e1cc981162972a79f15fe6162f68ba7a01b74732b0f01a"; + sha512.doc = "2ceaedd2b273c252e8510a98cb05d581dad8aff94f3c8be1dc47fbbc9b52a0546ba8025c6bf0c51d97d0573d208af2f8a635c0cf405a980ae8cf8e4a1f13e499"; + hasRunfiles = true; + license = [ "asl20" "ofl" "lppl13c" ]; +}; +robust-externalize = { + revision = 70605; + shortdesc = "Cache anything (TikZ, python, ...) in a robust, efficient and pure way"; + stripPrefix = 0; + sha512.run = "d4abbe1a409b7f282985986d75032361a1c5b38fde2494a8249423edcb304c6aad8dd45484c2d3d7cd56dac9462226791cd73549b0403feb578d18032709662e"; + sha512.doc = "330f8b74e7514fdecffd7c2749fe29bebec019e69f2368b15d180c775ed85f61c90a1b59192c34d3b802dbe1cb45cbec6955e8d91e11ece6df1a1755c1a7aecd"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.7"; +}; +robustcommand = { + revision = 15878; + shortdesc = "Declare robust command, with \newcommand checks"; + stripPrefix = 0; + sha512.run = "806f997cf6c0eceec0c8d9b8f8207014c4ab9243f8007fc688674af2fd778455a787b9cf998262fb7d0a92ba8e2ffb597d61950c22a6122ad957a62ea54d9a42"; + sha512.doc = "4d5c8a994edf816d39af12d7881793f0fda0223a3545559255674fa5a08f2d0fc9ad8ea2779b3c8bfe476966045f996b8b8f5da6fdd028188d28ae724c24a222"; + sha512.source = "3dfb71a6a73f2ed968777eb1074d65773aaee7c1218b18fddd78e74a86f27d9cbf5fce79c41503c34e497b12543ec2e0c16d9f35d39b893e208a236fd66f4f50"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +robustindex = { + revision = 49877; + shortdesc = "Create index with pagerefs"; + stripPrefix = 0; + sha512.run = "3aeac1a43261302532d7b5ee309d6cd94f54a2b17954c023bc6a94fa89c51291f3c4fd3276b03aa3ec65f4e21556d302c81aec107fac5dcb477941cb474dbbf3"; + sha512.doc = "aab461e990176e1d0cb82573edcfe11a4bf668b2d09edff05f673fa20d24ec76464495bebc64086fe3bb4411d5ec9590f43cd57949bedaa3366f6c7313359f56"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +roex = { + revision = 45818; + shortdesc = "Metafont-PostScript conversions"; + stripPrefix = 0; + sha512.run = "7df2224f9970b72cfa1474898c057799fe42d717876eed864f35aab113d01dfb483edb71f7f4a0a98b6762bbc309ce6fb51e41dc222a6f19be2025f6448fb1cd"; + sha512.source = "d89d02dd79142344334678f2d8ec4f34eb825532e8be9260cd08a43b28e1aa94ff5655c1c1eadb2f9a365e51693f6195a4851e1420072c867d8b2c0f1cbcbbb4"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +rojud = { + revision = 56895; + shortdesc = "A font with the images of the counties of Romania"; + stripPrefix = 0; + fontMaps = [ + "Map rojud.map" + ]; + sha512.run = "cd7065dc6a916941a0fd05ea342d29499b6f7496d1934e06c49e7ea1a99c5be5cd515bbcbc2b5935ff8132adcc7b94e653d55de967700410ace55697f6fc156e"; + sha512.doc = "fb9c9f00433ba959ad8f7b5acc93b1e7b0db1cffec96b7c988eeaaae89ceecc815071a1e21f78d36279e529f4e9095602b1887d3c5d4164494be502cf4a19873"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +romanbar = { + revision = 25005; + shortdesc = "Write roman number with \"bars\""; + stripPrefix = 0; + sha512.run = "205ed0508765e58397953f28e6a1172d8684f8063fbaaf4d741f4f092e1f652879b414a3225c87bac01e4d41f01c2b0a44632e0cb3088c5c174fdbe42cf25272"; + sha512.doc = "a5fc8c5d6e6a584de4394c59f9bacddc23fbec8d4639a0476cc0814404f1413774fa2d6bae3d8438cad2eeaacb56405680c0c6bcc152a5e4155ecb73de72f07b"; + sha512.source = "9a96ef043dc3542251fab1dc299742b5c322518c61de8d365c290926f2365e5bd6b80a57fcaee19a30ad504ab51b2dcf71170303ab92eac97fe3db4a76dce08c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0f"; +}; +romanbarpagenumber = { + revision = 36236; + shortdesc = "Typesetting roman page numbers"; + stripPrefix = 0; + sha512.run = "7c8fbfcd5e9ec9e306e7ac836fb4c82db3bc42179bf77502b5299c17c4d3ad515b9397016d600011eb24c5d9f2eda23a485634c5aca3a765653cce32d7bf82c5"; + sha512.doc = "a46bbeef023b74c576da84f9791d4d6d47a08091b43c6bf6936c4e17ff54ab2bf5b517cbf1d07e59c077e0981ac989570265df1fde7237ff24727e33d6f1b71c"; + sha512.source = "953af4fff1fe7e6b3e4bfb7447a0da7207f93d7377ce365bfdf563c9dead97860826c8f5b8dc491164437523e27a040fee5b95b58f09f248166268197233f89c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +romande = { + revision = 19537; + shortdesc = "Romande ADF fonts and LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map yrd.map" + ]; + sha512.run = "874883eb3592852dd6dfe2dc675a768bed8db80c0c617cad7c28bbefb2ca111adb410a584f75fad935bfec330765650ea9d0f73c8c5a9fe567526b5fb46ff17e"; + sha512.doc = "708ffe5a4dccf8241eaee7d22787e0e30bbd10faa1cfd538836da676cbd4f67b16a80772f8a4cea08f59af6d41a697426c4a4254c481d13ac3a10157b2a679e0"; + sha512.source = "040b154c19ee55910b05d0bfe355bbf000403fcc5c536a081e4569390c599123d64000680cb847ad710204d1c33d7ceb0ab7ea049847ff4ad0762fd9c0acfeeb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.008-v7-sc"; +}; +romanneg = { + revision = 20087; + shortdesc = "Roman page numbers negative"; + stripPrefix = 0; + sha512.run = "4195303ca32b46d722bb148ce4079bbea7cec08fc74a7b0cb6232dcce517b7b5a10753be22fbaab62ec11d894955e1368f3a6dc2a2474cf9b9450e035bb73c11"; + sha512.doc = "cd583b94911ed57e6c61689d437fb4a55a868813fad5791dfa7231b4cbd8b7d22cf4e6f3fe90e2cd36eb08202f4058abf93b5df2d74e1841070378dc9c31db64"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +romannum = { + revision = 15878; + shortdesc = "Generate roman numerals instead of arabic digits"; + stripPrefix = 0; + sha512.run = "06fb28ffcf6c8212ba3bea5e3fd93fe4a5394ce1cd3977556bdebb982888c2c0f7e45dc751f94b1ecf921c701fe6783166e73a595d5da55e874359b7a4065182"; + sha512.doc = "60caceb87b6d866c905685cd180f0deb73f400b33007e0589e1aa5a0b42ed948d88c672a620ebdd4d78bbf92aa81c1094e4d4d6afcb981747e65596711e112be"; + sha512.source = "dd1a19bdb63aad8f3c3458bc000933b9c0d04a3b331c37d84a9e7de4a7027b6cbed113038129a789f43d1049dd72acc432e6cebbce365277026d5e6b5cde328b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0b"; +}; +rorlink = { + revision = 67461; + shortdesc = "Create ROR symbols which links to the given ROR-IDs"; + stripPrefix = 0; + sha512.run = "6dcdc3e26fa093346bb60d2346af7de4cae4ebaed024fa21de1f28cc462b956bb21e946e189804a69420ed26fee38b3a3f8d45cb5a04d16c2859f4f0e0caf8ae"; + sha512.doc = "cc711052ab363104748b944b0f9d32e6328e2613a100871a53a2b9464e4e4d16b6cbfa4c42bbbd5cd093bfac1518e605af4b43205fec40641a0e2465b50f7728"; + sha512.source = "105222e02016315b5cd5367e2a739db1c977f403e7cbc3172be8a2528e140197472785a7de48be8e252fa702941963ba2b4dbc75ce52929bea0d4b02b5b9399a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +rosario = { + revision = 51688; + shortdesc = "Using the free Rosario fonts with LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map Rosario.map" + ]; + sha512.run = "e1e200c49ba98fb1d2bd5cd927ff209a1f72b9681b1cf3b49baa263985790f7d4854ac1cd9fedd464e2076488b3042456c7fede5648dd8ef23d1ba6701705437"; + sha512.doc = "1e5a12a62b7e62587b452d0f8926757b987e83a2980698deb94c6955cff1e45ef634ec8ac1c1051f6567db8a3de9fe8d4df23a5f80317ddfd2ba863ef15935c1"; + sha512.source = "4c7613a697439feba9e52ebe40dcbf738370f3ad5278ef0232f0e0e13ba9ac2c46d60233c8159c626b97b53af5238f75c096106b0b8529423d5fa3feaaf57a87"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +rotfloat = { + revision = 18292; + shortdesc = "Rotate floats"; + stripPrefix = 0; + sha512.run = "2976812ba6d6bdb304d56c9f10f08c02aa8acceeeef6eb05ccd0ac7b3e3b86984794017627d8f939994ea0228bef5e9d6cab0b08843e87a840ee5c2390dd0bb7"; + sha512.doc = "020e080e047f20db45bf83ff32c267f5a10b7790adb64495d09ebb3795a55d953154b8afedcfa0214a77f11c35287b18949b8f1fb89b6ee51aac12a04832e922"; + sha512.source = "b3b986dc11e30b68f75bfa371c85eded713f759f6fa0229857cc05172edd70caafd9124098813cdafd1f060fe57a6667326ee84445fade50bb6acf9d1cb6a95f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +rotpages = { + revision = 18740; + shortdesc = "Typeset sets of pages upside-down and backwards"; + stripPrefix = 0; + sha512.run = "a206e4147a68ad0ae750e18ee6a360d6ed2ac91785b75f8fecda4b63db695a36a9602da8dbec1310feed4072f952dc49f4d2c5d2817fe74477759aa55246177f"; + sha512.doc = "2723d32029abfc773de8f26a1f08cb3535c5878f63effcb94fcc6a2f98f1a0f9ff3c53df8a4d9c1ce1f99b52b9fd7b2f5c919dd9cc915ea8266835aa85ddbda2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +rouequestions = { + revision = 67670; + shortdesc = "Draw a \"question wheel\" (roue de questions)"; + stripPrefix = 0; + sha512.run = "7eaa938339d1e59241b85cbbec4238be4fe2aaf4dbb3544c6d1511723c62b96dc5fe38c4fae062dd2d61760739caf0df3652b710546a6725d072969df8e68b0b"; + sha512.doc = "16ea492fabb90e0a649d5ff8e13b358a4ff7a612df34cd60a7023a1572337d237b87bdd5deadd206513562cfc1a3b27e834c49fbd5204277d38dfcf3a1e4e586"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.3"; +}; +roundbox = { + revision = 29675; + shortdesc = "Round boxes in LaTeX"; + stripPrefix = 0; + sha512.run = "078938229ca1ccba4c26f97eae59376afcee469629a7e8704d6e376d5bb256e8991ee1cff17f24e362772b78ed800b57bc6018b10e897daa73c142fafa1f62c7"; + sha512.doc = "cf0f56e42a82d6ab36fe6af2ba690024cb555192780c04ef1a01e71fd6cdfb803b0129aa95e304de4fc8c1e2d1015b14dbb6631d9773bdf463fa52c22209501f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +roundrect = { + revision = 39796; + shortdesc = "MetaPost macros for highly configurable rounded rectangles (optionally with text)"; + stripPrefix = 0; + sha512.run = "01cdc4c8443c50a91dd408c52122e8ae65257344176227a508cb082f92d61bc02756d47e27f75d7862d3c87c26add2003604956ad00b448f63b4f6417c520ba6"; + sha512.doc = "35289692327bdc68acbd442588fbd37185f9e00e3e4ca78fe500474c53ef96542042cebd18cba7720bdca0b72f19384fd3b8afcf45447644bb3c560a1385595f"; + sha512.source = "9866ae92b2c5f8c446ebca5c7afcdf3e8b52f12504b7d74c5ac4faa570a98ab6775c3ba5ad99d4300c1f9b7f92ffa423d5c73991ad47951a4e2bee3eb3bfe473"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +rrgtrees = { + revision = 27322; + shortdesc = "Linguistic tree diagrams for Role and Reference Grammar (RRG) with LaTeX"; + stripPrefix = 0; + sha512.run = "cf80b48866e36b983527f0646c94fc9776ea799ac475a2c5879a4dcb3b3b0d052e061f871b6eb0a8c0fb1153c0a9f6f0ccfcfb1c6b8f3ff4839c3d454ea3e62c"; + sha512.doc = "71992711c27e741403c5f7cc268e8597e2ea17abe42d953bf0c3caf255c0a8673f6210bb808fc70b741c694778f7cc7a45435afe39939b1377951e8e2343d73e"; + sha512.source = "8ef5cf9dd617b1f37c57cb70e2aa7b3706d171eaca5e5498fbb3f653f409667a058254fd618681dc2af701d1d9e544d97ebb65c24081ecf1e40cd81f442183af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +rsc = { + revision = 41923; + shortdesc = "BibTeX style for use with RSC journals"; + stripPrefix = 0; + sha512.run = "abd1d24110722545b93cc16ff35b70c87f467193a33e8da2a04eaff354d89782911e42a46da5d380b9406f923c6fc48d38950d7346cfc799abc0660efa23db8b"; + sha512.doc = "8569a90d7f5c532e366901d8bd2bab3d5a32d5b6d1c4cedcf179d1ae96a6c34ef5d294392f93fed589a55baf3ffddee2cd35a67c2aa8fc7e0477b47ce92eb411"; + sha512.source = "b3f097f76dcd1288a70d7aec88d7ae9fc58bb4b3f3a2589944c379aba887b3e7e6c2fd6b74b2a70de58e8cb078edc0d6ac0b1997078d0c322aca9928ba033202"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1f"; +}; +rsfs = { + revision = 15878; + shortdesc = "Ralph Smith's Formal Script font"; + stripPrefix = 0; + fontMaps = [ + "MixedMap rsfs.map" + ]; + sha512.run = "f5d52f49ead227b058841bb88571ae0d6fb40b95dd652536887acf13c0a5dc5b61e3813faaef2effc26539125c2776e113937a1612e7bc7146e7d5517b02aeb6"; + sha512.doc = "2d23715b38d90c686d7edae77f2a774041d3b679035e0399b7b6089f9b17db3ea4c6c3cdd655bb6e5f3a3cae782e30984c1fe89f5f263a0cd86b441c5376848a"; + hasRunfiles = true; + license = [ "free" ]; +}; +rsfso = { + revision = 60849; + shortdesc = "A mathematical calligraphic font based on rsfs"; + stripPrefix = 0; + fontMaps = [ + "Map rsfso.map" + ]; + sha512.run = "7632b0cafcb0d28f5f4b742f8c457634a9cd1ec7fd59e61e01fd5f3da3964ae941fdf2fbaba94b0d0934270ba56a2224352e11075970e28bcf16bd9b6f97f236"; + sha512.doc = "ccb3ce73add1f2a4f269728b8189569637327d85cd1a4d29a03904872cff10ce3057bd01a9d74a94373c3aaa52afe74a98d07bcad248fd18943efb0bace6db36"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +rterface = { + revision = 30084; + shortdesc = "Access to R analysis from within a document"; + stripPrefix = 0; + sha512.run = "3c3cd754ab17d03d50c35ec9824b76b9d4528276fe2b5a882d35df5537ca12f83956b2c596a269f9961f243bbd5e8c394c6f1bd508d07cecae50fa47bf05fd86"; + sha512.doc = "c8c38026ce2bf2a996ba40062fe3bce797b381633e4aac50ec438bc9fb567f73ad1c4e764af3cdc816e62713d4f1dd8bf2ab1814b50d086811359e999103c7bf"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +rtkinenc = { + revision = 20003; + shortdesc = "Input encoding with fallback procedures"; + stripPrefix = 0; + sha512.run = "a1f31a946838123b65124fc7220e77283cf89105ae439f1e851abfc3c30b6a6b7c83bebf676fe47de1dfa9668cfd22c638567ef9a097aa97dacef1f0e3ba1eb7"; + sha512.doc = "f3e7b1e7c95af7bf89b58ac949ab5b3fc12d991a436e28196f748ae033c46446a0cb885943777f44af1fe5ad4aa579e0fc43676c44812b01cc64d85e4ae15e4d"; + sha512.source = "9078c15d4c1531b9ca0b0ea6a2561815538de45dc33a9f8cd8f886cb7ced93a9fdf8296f409516480fb58861b599692982b503bd49568548b4d34743c44ca037"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +rtklage = { + revision = 15878; + shortdesc = "A package for German lawyers"; + stripPrefix = 0; + sha512.run = "6e39e34a7c293f503949da66f1d5ebc65ae0388dc56e87992e9fc4daff1a250196afe68150be14ee2ec3242393ce9e5ea7b681cba31b7ed1c2d58526f6506554"; + sha512.doc = "550c21bcd8af04041f1fac11f2be3ae2a1f01265ad6bf31243569820c7b8d83f32ccd0cdbcc4d5a7a5905ae9aa0512a449a1b2d6923affceb344152e6c12d72d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +rubik = { + revision = 46791; + shortdesc = "Document Rubik cube configurations and rotation sequences"; + sha512.run = "67931287ea126947b5b2d567ba355d44ce094b2b527288ce32329de4a73434be9a43cd520e6c24ef570a46a16c0edcf12212f46228ee1bcd2b8a8be7f9db3a7c"; + sha512.doc = "33d5c8210600cb4ce7b1313d1046f6644f0a6648f7ee9676d4d628d042f6501b5e92f2b56a31fbad6f637dc93a460a568be9e1335bd52bcea825f5772b2a9d51"; + hasManpages = true; + sha512.source = "3159acbc71a007877c046f6c075bf271e031feb00cda04c1818e4490396c3fb0651f160c7a98d8d3391efccae6a5b1dfde2155c6bde1c463e1c7416107b4ab90"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.0"; +}; +rubik.binfiles = [ + "rubikrotation" +]; +ruhyphen = { + revision = 21081; + shortdesc = "Russian hyphenation"; + stripPrefix = 0; + sha512.run = "d681972cad53b86167f4800f78b5d25de305d2f3f604e6b41b481c432bb9f09a964720fed5b5052cb8a30148da1bdc76306d8edb2139018d83c331d3439de958"; + sha512.source = "df587bb8c81e73f70a93146d6c3a50c2a66b16084e8eab0b01e0aefb3ce073c6b6e812cfd8c5a1520f98ca58e2e2e0634877ca2987742eccc4d7340a7d62e23b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +ruler = { + revision = 54251; + shortdesc = "A typographic ruler for TeX"; + stripPrefix = 0; + sha512.run = "a0ac63735eee4be96fc368bece6eed80058b79689954780990e1da5632448203c4f99d9b13f541a89e523f4a531983d5fefd836b99ed64c2f177723c822f8749"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +rulerbox = { + revision = 50984; + shortdesc = "Draw rulers around a box"; + stripPrefix = 0; + sha512.run = "197588dd36056d6b6e9f7772205cc44e81734cf63dfc83a7c987209df0c2b47f91f460d322df05f123768f3d10d9af8bcdda6619da394fdaf3367be88821a135"; + sha512.doc = "b4de5828d5602845217726ded4d56ce6f4008a599bb1ddba89745ab39bfc2ba9ed3fcd1f636cff4743252a975a18ba07925f1e78f81fc8cc2ded80a7cf8b74b2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +rulercompass = { + revision = 32392; + shortdesc = "A TikZ library for straight-edge and compass diagrams"; + stripPrefix = 0; + sha512.run = "8f2e8d9a4d61c3c79e3ef29ae554db2696b9c374fe10f59fe2a4baea33c679a0678a95c30ea1d4310662bb5af6a1b02d88db7bb43610545b1ffb39fba19b5001"; + sha512.doc = "6077a3c137269e5be37b62879c394d800f4bc80cacd1d9600b2aa81503958e2fa29f0364db58c1418bc206db916f84f46cbcf70d0f30a9276a6e78d154150425"; + sha512.source = "75765738f4d3b635468d8e1ebda805e0fc6e2bd3eccfbcc1594fcce89908834572aeec85fea189368d02d05ba1fff6d0e2bb454ad25bce2b92a45cffd74a979c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +runcode = { + revision = 69471; + shortdesc = "Execute foreign source code and embed the result in the pdf file"; + stripPrefix = 0; + sha512.run = "bedab511e29b368c929f688742dc59c36ee6416a8f362c2a24847dedf0eae472e64c060f26287c55b9b881804213ec57eb04249d9c031458fb3d642c01255e03"; + sha512.doc = "fe6b6af9efe7564e6c3ac6040f08ce30f17159b7a56ca983a9e8f97217706d75dc481daccc0c2594422d3c578edf0f00e5a72f5b06f7eecc8ea81f79ad27ac4e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +runtexshebang = { + revision = 68882; + shortdesc = "A Lua script running LaTeX document files with TeX-style shebang"; + sha512.run = "8e681e06b29e235d76b21370614c22ba57cf69debff19869f3589ac5a1342f368621083a17b7a1ddc1ddee37478bdb9b81f4050bb9a2f7d28a7d753909238233"; + sha512.doc = "4f2754641930105b1bd70a0a116e724e019c1930ec49e27c3ae895c35b7840c54082285cb6241554915234c16a59dbcea9ee07c509d09d5315ff6f04e0137168"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "mit" ]; + version = "0.5"; +}; +runtexshebang.binfiles = [ + "runtexshebang" +]; +russ = { + revision = 25209; + shortdesc = "LaTeX in Russian, without babel"; + stripPrefix = 0; + sha512.run = "11bceea67aae767037d728ab7892eedab312e9477f1f9f7501f9702fca4ceea4e21bd575b1589fb545abdbdc5f5f5315243f77adb4c9b9a2507fb255481c5541"; + sha512.doc = "876cba326071d0f347d9a1a4c1eca692ca743729b9604a51bb5b53de96da6006ff24168040e77df60b1999cb22901b7318669c32378a869081956dde40974802"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +rutitlepage = { + revision = 62143; + shortdesc = "Radboud University Titlepage Package"; + stripPrefix = 0; + sha512.run = "fb7d3aa93191c443ba31e1a366f34efa7dfcc896c534d3696002ebc54f3b24cb34131c50fc7d584f4b725d3b56a323628441398b2e1116789437460b97e21fc7"; + sha512.doc = "f8293227a99eb022a2c3a3ac75d7e8ba6f61880b62f5cce11eb791bb489386de93cefcc2b607cd4880ca58bb933328af66ad93b4c6ce0e16a842c56fed231206"; + sha512.source = "f42d310b3697077a842fc13f580adc605826c94984102769b6b27de26548792cfac59517319ebbd20719068c012389d0c0a10dc0a89986a89855c8ab8d039620"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +rviewport = { + revision = 23739; + shortdesc = "Relative Viewport for Graphics Inclusion"; + stripPrefix = 0; + sha512.run = "eb4bd4e75f021db40119cb4d4334611fa80d26885dd4229ace652bf8dbd7b4647a6dc4f45c8be78ad8db0cf1001b7117ce3c38de2483f0dd96da05473543ac10"; + sha512.doc = "10f94dd8b29d354eda99e8c0f15b53baef80714f7212714a94070061e403d45fc5a97d25174f268a14b0f4c924af9b25c81131929c08be1ed9a4e62204f17c22"; + sha512.source = "25e91e8c4f52b1752b32293828d174fcf3cbf6491f38dc2c58be23ef7f2a84570c96606472ed89ed837951bd2ab9bd1e48d4a126beef160c14899b0e70240eb7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +rvwrite = { + revision = 19614; + shortdesc = "Increase the number of available output streams in LaTeX"; + stripPrefix = 0; + sha512.run = "c187dcb7e1c72b727cfd0827a55d721c6a094679c1dae27438ed030209042b49c646af20e158900543369ca8ceee9896a9f36de76607f8514004df80e3be15fb"; + sha512.doc = "545e5b96a2bb3646a7b4a6eb31d5192ef85dee9ac0b6859f6b414f26c5235651294f486bd132af112a2c6021d6843e6ffef8a8f79b7389b974227bc1eee16230"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +ryersonsgsthesis = { + revision = 50119; + shortdesc = "Ryerson School of Graduate Studies thesis template"; + stripPrefix = 0; + sha512.run = "0846fb24c6b96cc30edf46d1311809e1170d3feb13b3c26be4dd330ef8dd856771f257ca197f562ed409815f0edb7e8ea744a38b9098b86a325eda9cd4ad360f"; + sha512.doc = "b0d57ce3dcab586fdc2e15f6c2291560c43dd772b693ec11e0678e083a1475c21b55601878cf938e666d0f8a5464ffb0b79281b62f4859200fc6cd67b33b8779"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "1.0.3"; +}; +ryethesis = { + revision = 33945; + shortdesc = "Class for Ryerson Unversity Graduate School requirements"; + stripPrefix = 0; + sha512.run = "63988ab74eda81270f0e470f3b1d1c772b17668fd9c6526fd8d53f588da8e52d3690b4c3ee898f2b460f83ac44ab4c528a0c6c48abf1a1cbe21427fb4e678a1a"; + sha512.doc = "03ef086a51a97ed93038338b99a516ba2898a0097326f4cff3c650c7035acc4bba7ee2fd6458c579a9f1af4ff31334dd22cc23b7004d08e58a259306ee1fbd8e"; + sha512.source = "0754857b37c510f7cc581201c516d3ca1f6e9ed9bcc0825968efbe728a281e2ec73f58f7415efdb07bcdaa66fbbab3178793907b3da17511e69044bbdb2d8aed"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.36"; +}; +sa-tikz = { + revision = 32815; + shortdesc = "TikZ library to draw switching architectures"; + stripPrefix = 0; + sha512.run = "e30f8b6dd6f082bd127077fc5040ffef53e2c2fe43afd023bf0fa9dd8094769e2d40734dcf412d477989b746e1e5141cc42cc082e9f5b26e5986cc91f8336ec1"; + sha512.doc = "d6586a6196fa9ec8c70ff6410873604d987394ff09e93462548baa202f22bda479fb4f76f66fb710b8daeb7b34e455225c997f07cc9360a09c5cbc4c45697a5e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7a"; +}; +sacsymb = { + revision = 65768; + shortdesc = "\"Sacred Symbols\" prepared with TikZ"; + stripPrefix = 0; + sha512.run = "59c61767c7f9cc782ca1a9cff78c0226f7860080453a772172f8dfba0c1deebfddba701704d15a2d05cfd010b4baae553d30207ff4701056a263a51f5a4e03e8"; + sha512.doc = "135724503c2c646bd49ad1e434f5e4c20335f23605839847b3c6729945e4550b6f855ea015e5020ff9de7ca4bc5a46d70e99dc9f372e6fbd2cbe8aaf55683984"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +sageep = { + revision = 15878; + shortdesc = "Format papers for the annual meeting of EEGS"; + stripPrefix = 0; + sha512.run = "d8e107109129636cf68d88c96a36de87b95dcfc4e154dae51a1145d7a0c58a17ca12e95b1b2fa1312c6c50c5cc02be35b23168d8eca69a7643695c38c5d0bcd6"; + sha512.doc = "7f92c14d432ca5960669a8faace80ff6d4e97d9a021281c847b7f19942f4c1a06da3657e8992998e91bd1d69398b3fe379da690f81be28cb4ddc3980262c56b5"; + sha512.source = "25f06543efc104bdcfcd81fbae6182498f23a7d1d958671cac945f5442a59a71033bf3fd174bd41c438c7a6a066d41b1e4a375b559b14bff6e705ad2ca894b05"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +sanitize-umlaut = { + revision = 67126; + shortdesc = "Sanitize umlauts for MakeIndex and pdfLaTeX"; + stripPrefix = 0; + sha512.run = "2f9514b9424a72762c9b4bfbe2bceca10dfe4e75a42e9fe2e26d6808d14fa2aab62a03f26becec8e80b00c658d4452e95c3b84bf692d64cc287693b2542ec3b5"; + sha512.doc = "2de8f2935de490e127f19b50f10698ad323e823ae4bcb7b357b6cfe084c9f6a48d2314889a54974a4b58275667da4eac89cebfac5c25e570c0172ecf9ca44af5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.0"; +}; +sankey = { + revision = 61874; + shortdesc = "Draw Sankey diagrams with TikZ"; + stripPrefix = 0; + sha512.run = "8a77f2ea3b4c2167d823a839fe2fda2c633ffeb775678e6fa9cb84558dad547f4fb03c3fda6c1f85c4984628ce1515ec874482e8a223385bf1c24b2c30dfb362"; + sha512.doc = "a3d18d1a43f22470ea5498423c10246c780116769b0493356174c8e9acc6d9aaa32657f7582b795d2cd720fdbb6786319090303548661f899a650da4a0442629"; + sha512.source = "92b3d428919f217c8c869d3896829e324670647c29321bd868753e3b408c5e227acdc15097c81dee01b3319c08fcd94da1cb5e11ceb5d5775a90235a54e997bf"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "3.0.1"; +}; +sanskrit = { + revision = 64502; + shortdesc = "Sanskrit support"; + stripPrefix = 0; + sha512.run = "85b4c707f00cba5b9be49f228f0466e3f0482562d481763b9cc7f269e84e4018e3c00668483b6ba798b0336781555e45c06a6be116c2c4b23a978defa8c8141f"; + sha512.doc = "16643e1c8e72e37ecdfae0176c415fd655619121cc75fe573dddf4a07a64161050a681f524747868101e72ee655de6935d3c21f68e74c31bcb7113d9942c818e"; + sha512.source = "e7836d95d46335a3e809fce62211029addb84ad586fdd74f2f8ea924e767bd7c800edac5b74c8660c10eec46b5a8f0b287121e83b48e029b98ae69cc19bdb14b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2.4"; +}; +sanskrit-t1 = { + revision = 55475; + shortdesc = "Type 1 version of 'skt' fonts for Sanskrit"; + stripPrefix = 0; + fontMaps = [ + "Map skt.map" + ]; + sha512.run = "50f7a12443730bb017334ed1bad840dd2086a0225586eeae02f1386f410ae802fd043b1ce8a90e495aac7bdb20e2a8532c4cf98d48f0fc32b96da24f28de26bc"; + sha512.doc = "11a0bbb4212f72a18df5eb1ce1e2259774c6376a3c107fe32bed4176d23da2f5bda5cab71a7df618c67113ac9d65969ea8e680ab939c7c6cb2542ebd4c7e5efa"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sansmath = { + revision = 17997; + shortdesc = "Maths in a sans font"; + stripPrefix = 0; + sha512.run = "075b9a32512f191767bfc739b833497eed371c2078fc8511ba507b19e2744675bfb3caeda40da484ae559aaff44aa4f6b2f7f5baaeb0c30076654593216fa5e4"; + sha512.doc = "7923dcfcf20c945dc61af747000694c59c61982417307356ef2ee335f7a3eac7e44974a334072125ed4a3ec3b29caf342f15dfda1fdbc348a5e2cfb8a4dc2469"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.1"; +}; +sansmathaccent = { + revision = 53628; + shortdesc = "Correct placement of accents in sans-serif maths"; + stripPrefix = 0; + fontMaps = [ + "Map sansmathaccent.map" + ]; + sha512.run = "685b0c604978aac45efd75c37652471aa165bfbbf12dfa686320a6a9ef926f9043382333ecc26db6d2ff4d12732d135947145ba937eb6d01d4a4e9aa17784315"; + sha512.doc = "c9bf7d65a232d668243df9867b2eca64e0288fd733c6b39ce200f64fc5b0a07c98ea6a971446f67f1766998e169c14a80eda71104c1653ed54d3865e6e145fc0"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sansmathfonts = { + revision = 68777; + shortdesc = "Extended Computer Modern sans serif fonts"; + stripPrefix = 0; + fontMaps = [ + "Map sansmathfonts.map" + ]; + sha512.run = "d31d37820883b0fa2a97dc878d11b6866554839acbae8c56fc10fb164fcfc2af5590d0d562512aa313ca950c32aecb4d4b89ea4113326446a75006b34a2f677c"; + sha512.doc = "5972253d34cb39cb0151050b4e9dab45dea50901a84f736ee8a25beb5ad647a112462ed5b3d46c61ff20a3a20852000c64736c88df9ed59defa2da5bf54b5638"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sapthesis = { + revision = 63810; + shortdesc = "Typeset theses for Sapienza-University, Rome"; + stripPrefix = 0; + sha512.run = "14ae91cff0c5487a6751d92f1ac4e252ba53feb74883c3e0f078f5269845fd85c906a4f962c4309f6765fcbadf934877a183659d68a88e1050fe636c0e5d54be"; + sha512.doc = "04c294886ecc33f3725222d9a44953dd2c4be7a5dcc5c9d08d8cc05c2d8dc9c003bfa80a7ec027956b1e680a555b1fa70af64a91c27833a77ad4469a1cbc6111"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.1"; +}; +sasnrdisplay = { + revision = 63255; + shortdesc = "Typeset SAS or R code or output"; + stripPrefix = 0; + sha512.run = "5f6483d066775682cd08b9f68b7f31f5e8bedaf9248b7345dd23a950d5e61e3d2664dc2cffe2a86b35273044f8d8df2694d4d3598d70b974d38e02ae8343a844"; + sha512.doc = "a99bda8628ed2b4cdc0ba24bdb0f514ecac643481d9d866c2992df131354a677ee6fe0244285ee4d9029eb10b219c9fd9dc5f7f93a01414a3db2cff8f58e08e9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.95"; +}; +sauerj = { + revision = 15878; + shortdesc = "A bundle of utilities by Jonathan Sauer"; + stripPrefix = 0; + sha512.run = "a4fe5bad7f3d5c895d6166846100cabb1b59e5f37c06d21e451acbaeed0847ab93d9995e70209ab18cc55bf8c78a6c83cbbdd49a45a4cfe511cdad41baf3ddfb"; + sha512.doc = "3ec0f5c2132a809b4f2f945255f0806508a3dfa3733119368ba59e4dcf5304ac9876ea5f05912faf926db651d1aaf4a3a1c40744fe7d3a077d8bd9dde2676754"; + sha512.source = "05d2adc3b802e3c338dd92818cf7ce4d3bd6964dba8522bf4628bfc2d13939bde47cd0892b4fb629270d5e9104b9577fe6e3ba6eb71ca60a07f5e6441b0f572b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sauter = { + revision = 13293; + shortdesc = "Wide range of design sizes for CM fonts"; + stripPrefix = 0; + sha512.run = "17fc32a3dae358be5215301abe13d9e865ff9f52f58cdc849d5fc80aeb1a79723d0a39282383086282fbddcaeda0fe586cd3043edd582e0addc0b223bc3ee756"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.4"; +}; +sauterfonts = { + revision = 15878; + shortdesc = "Use Sauter's fonts in LaTeX"; + stripPrefix = 0; + sha512.run = "4d7e491a7a6a22fd6ad8f407cbc8c041434466850e2e5efd46897843281cb71e046fc6cb849cb091cbf05191c45c52a6cb3e0d806eccb9133fddda9c8f305969"; + sha512.doc = "16647b89752d1871c798f80be91bacf375ae9a4d5199ef7417edb4ff019d7aae548fbbbbde47f84cd5c7c36ec4988ad1df82735f4aeaeb40180b07a86dceb5a7"; + sha512.source = "d8379fb3c2dfc5dcd9fc5c22101855a27ef5de3ac377f1e6a56bfd397888c5f7f94dd37c24c6625a9dc40f15160721c468b5a5bbe8a35f98f983755889e250d8"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +saveenv = { + revision = 65346; + shortdesc = "Save environment content verbatim"; + stripPrefix = 0; + deps = [ + "precattl" + ]; + sha512.run = "e0e368dcf3add9d59b22d8e04da1de9110d6f1ad2e31cd2cd44f894ea1d7f0cbd4eb41b500637e896eb179539e19c4a1d0601035e2404726dfc98677f9db0927"; + sha512.doc = "2016c815add27dca5b498f4cca3ce69c9c18f544b9651305d5d9a9a7a10b30fe187c526da37813218388f8305fc3df83257b2e9b6289171febb770c7d59d9274"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.1"; +}; +savefnmark = { + revision = 15878; + shortdesc = "Save name of the footnote mark for reuse"; + stripPrefix = 0; + sha512.run = "2d39c1246bc9c5c28222a6ce96b93bc0c1e93c3155f68f44843b5560b548191ad3b608f24b5c444b834fc441238a0d2174a9a8ec006f01b160f77159decfeeb0"; + sha512.doc = "9ca251e6d17373e5d6f308d2e75896aaa3e44d0f5883be65f7629f922f0eda296c963530e8fc1c80073e0706c2c72f97d062cd731481654c0564cdb695eaa86a"; + sha512.source = "984807d4efb4b24445dec6742e0328274527ef3c7ddb3df57a5d941531d1e634b5d672c9a510b62f7053d69c10668c311457b3a1065e1775f964e9a74ad027a2"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +savesym = { + revision = 31565; + shortdesc = "Redefine symbols where names conflict"; + stripPrefix = 0; + sha512.run = "212ea18ebb424f9b64ca9c75a783dee9ceebac09adcd6ff6c721d90796bf4121aa8710935529451e6f9a4de9c3cb5910b6c07d6fd6b7093c4b9904348f43a1fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +savetrees = { + revision = 40525; + shortdesc = "Optimise the use of each page of a LaTeX document"; + stripPrefix = 0; + sha512.run = "f31ac72f12ecbe2ab05bde14de907707988d6b9ba20414543b9176b71d2a0d5358a34348177857c56b961301678b612ee6f767d1b9cb671b9bab344bb8230e6d"; + sha512.doc = "3e5cfb62d4020d32d9bab01b3df2ea1cb485240aea5eda3541d29cbe38487ed8b242a1eb2b9d15d08bd742390a8d8a25b584e110145dab330580e69e2287f181"; + sha512.source = "2dcc671cae73824a2e4cf10682f0ad7d6236f5e856267663f14864804587e1394fe12de5e3e54e5a64abb798c16014fab07a462584eac3a561f971496c58b5b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +scale = { + revision = 15878; + shortdesc = "Scale document by sqrt(2) or magstep(2)"; + stripPrefix = 0; + sha512.run = "2d090a08c8f7d5d9b332f390b29b16e911f339071579cc09b954b2978df4b410ff3c47afd6b8bea0ce7eabac551b94f8630fdb7aaa4ef39f793748925157a19d"; + sha512.doc = "aa41f6de8baee992b123ed40086dd5d0aff63c187858502c66056a52f3b8bfb12a5b7dd15ae9279a224e9d67d717f3927e97f5879ab09ded9e0960a3eb910a90"; + sha512.source = "387efffefb6774f50165a0c3242005a52418c5c9ac3ff6d1b87f696eef7af8a57a19a4efe6066e7939fcd76ff8ff9ce3ab4941d30d36c6bf30beeea1a95d4eac"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1.2"; +}; +scalebar = { + revision = 15878; + shortdesc = "Create scalebars for maps, diagrams or photos"; + stripPrefix = 0; + sha512.run = "1e367f025943a56b6592238e2961f967beb1d5ff5b68ee83565b3926a392214557237e482ba0b174ddb2e6861e4690e636edef1a5fe0473c465a0deaa1e1bd0a"; + sha512.doc = "cada3793771a28c3ce30439c782d245b6b21cfa426d2268e7e072a8559a81692b6c4e9e26a8bd452fe5882f39e55fd061a1af4e9be362bdcdb1f6ff6bba781e2"; + sha512.source = "f6f3e8d007ab3efd6bf1d45b9e3af1fa846637a8b66226f9ae24d64b3be9938b547bc3879a33f44d465f8f62494d1f55141c713b18161ec4006ed76eaa52169e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +scalerel = { + revision = 42809; + shortdesc = "Constrained scaling and stretching of objects"; + stripPrefix = 0; + sha512.run = "0b0a996bbed0fc185714f84e32c76e5a9277137d3d8dcc6b12b516afa97f3c80b2684c3c22af8717bb3e6acca267a3862c1244df7cb71eca61b10074fe1c3a89"; + sha512.doc = "1533997bed3ce5499a1285a6db03be20f28fe70b1ebbac5d117e692c53068ecbe7f8082cd5f93c753bbfc1eb4fb3b78372c7b14f5e2c636398f37dbc17972d97"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +scanpages = { + revision = 42633; + shortdesc = "Support importing and embellishing scanned documents"; + stripPrefix = 0; + fontMaps = [ + "Map scanpages.map" + ]; + sha512.run = "e13f7849b2b1cbe9fc60fc2e3d3bb7f2879644c282e8664a5ec46b3143f4ac7fbd21f2976183ad410bf778a181d5063b23832734f0ff43a617c9020b16587fb6"; + sha512.doc = "34eb2549a4d809602cf69eb562fd3c03c8d3fc4063820ce41b52d733228a6a83ace819e5bb82e77cd3be3cb8093e7997377fadeded652d20509eecde458d9b78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.05a"; +}; +schedule = { + revision = 51805; + shortdesc = "Weekly schedules"; + stripPrefix = 0; + sha512.run = "c7d58c5e4ecdef504e1d32934ccf2c71cd36b073af4031ee83b0d0a3b3393a40acc26dd4e057f426561903d0d08297bb2a9849cad2cc5a11b02e15a3983f0e1b"; + sha512.doc = "ca5f9e2b27f0b01531e82e64e99f816aaa52f5f340bc2fdefac367918d50c564cd178709428554a908951c117dbcf3d24753f84d864fcdc546129c3de25d7e77"; + sha512.source = "e910feb417f9d1606b323a995026f3d3275523b4fcc53dd94d44c10b375ba13d322f32191dfec36b9606174240ec77de1b024c1f8ac14b94224d34e2aa0cdabc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.20"; +}; +schemabloc = { + revision = 68445; + shortdesc = "Draw block diagrams, using TikZ"; + stripPrefix = 0; + sha512.run = "7a99b1fee9c4436371f5228e969786518f55aa65dad3cc540be912d6123efbb5a25634d337bcc9a3f626d37f3408b08999378bdc9d32e1e1db2549499b59b1cb"; + sha512.doc = "eca5a57f53615a486b21fbc2a0870c5816decb97a1c6bb004d5a6f6faa89f1cd8c7a8a51135904d2ab53076b6ac239f3192c976b54672d45d1eeaed353d07055"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +schemata = { + revision = 58020; + shortdesc = "Print topical diagrams"; + stripPrefix = 0; + sha512.run = "d3c6418c699bb624287d7de3d64695e721fba3e44eb99df02ef58c02c7478f12ca329153295e076a126748239a483e941af3e8d9ade86e3f15a134424c6f4e5e"; + sha512.doc = "9f71ea989942daea92cce48f3a013fc1eca84ef4a36856e28f280f04efd21a0dd3cc5799f9308fb8fafe803c23106544ea85e2d094bf21f178158e30eab35b06"; + sha512.source = "55c041e627470133a7374e0a1f00079f5de58949a3c0e8d3c3c78857e7bac3d5afd33304d57f3c70dc98d682e4eec3f00e3624aa22a1310b56269b724df6c95b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +scheme-basic = { + revision = 54191; + shortdesc = "basic scheme (plain and latex)"; + stripPrefix = 0; + deps = [ + "collection-basic" + "collection-latex" + ]; + sha512.run = "027a1cd0dd4fc5da2427864bb49fc885a00bec6e8a74da24ce9cd781c69bf4288ddfc3c790307ed48052a8fc00c1989d3939b253da6638370adbb1c43348749b"; +}; +scheme-bookpub = { + revision = 63547; + shortdesc = "book publishing scheme (core LaTeX and add-ons)"; + stripPrefix = 0; + deps = [ + "barcodes" + "biber" + "biblatex" + "bookcover" + "caption" + "collection-basic" + "collection-latex" + "enumitem" + "fontspec" + "latexmk" + "lipsum" + "listings" + "markdown" + "memoir" + "microtype" + "minted" + "novel" + "octavo" + "pdfpages" + "pgf" + "qrcode" + "shapes" + "titlesec" + "tocloft" + "tufte-latex" + "willowtreebook" + ]; + sha512.run = "0ea47f8907821e273a581c52494b6a4e9a511a71e11ebfb05756eaded6e5132fc548312cb6365cc4c1906b4e8ffb14ee5ed496484fe5e2a2611e154091d23cf6"; +}; +scheme-context = { + revision = 59636; + shortdesc = "ConTeXt scheme"; + stripPrefix = 0; + deps = [ + "antt" + "asana-math" + "ccicons" + "collection-context" + "collection-metapost" + "dejavu" + "eulervm" + "gentium-tug" + "iwona" + "kurier" + "ly1" + "manfnt-font" + "marvosym" + "mflogo-font" + "poltawski" + "pxfonts" + "tex-gyre" + "tex-gyre-math" + "txfonts" + "wasy" + "xits" + ]; + sha512.run = "0b041f3c27ef88e7baec105b7cb24fa65c4b1f092f155482d584d9041ced4f329251f0b0d32f7019c15fff3c57b4d17f057cf39781f8be16a4e8c0ce4838163e"; +}; +scheme-full = { + revision = 54074; + shortdesc = "full scheme (everything)"; + stripPrefix = 0; + deps = [ + "collection-basic" + "collection-bibtexextra" + "collection-binextra" + "collection-context" + "collection-fontsextra" + "collection-fontsrecommended" + "collection-fontutils" + "collection-formatsextra" + "collection-games" + "collection-humanities" + "collection-langarabic" + "collection-langchinese" + "collection-langcjk" + "collection-langcyrillic" + "collection-langczechslovak" + "collection-langenglish" + "collection-langeuropean" + "collection-langfrench" + "collection-langgerman" + "collection-langgreek" + "collection-langitalian" + "collection-langjapanese" + "collection-langkorean" + "collection-langother" + "collection-langpolish" + "collection-langportuguese" + "collection-langspanish" + "collection-latex" + "collection-latexextra" + "collection-latexrecommended" + "collection-luatex" + "collection-mathscience" + "collection-metapost" + "collection-music" + "collection-pictures" + "collection-plaingeneric" + "collection-pstricks" + "collection-publishers" + "collection-texworks" + "collection-xetex" + ]; + sha512.run = "bda507842fde5239d7f45169ff78690bd96066d1834cdcc6a0dcbd3e3439308c694ce4be6a91d1f155ebe5e29d46173fe13c83bcd4356969da95fb7cca1b4e38"; +}; +scheme-gust = { + revision = 59755; + shortdesc = "GUST TeX Live scheme"; + stripPrefix = 0; + deps = [ + "amslatex-primer" + "amstex" + "antt" + "bibtex8" + "collection-basic" + "collection-context" + "collection-fontsrecommended" + "collection-fontutils" + "collection-langpolish" + "collection-latex" + "collection-latexrecommended" + "collection-metapost" + "collection-plaingeneric" + "collection-texworks" + "collection-xetex" + "comment" + "comprehensive" + "concrete" + "cyklop" + "dvidvi" + "dviljk" + "fontinstallationguide" + "gustprog" + "impatient" + "iwona" + "metafont-beginners" + "metapost-examples" + "poltawski" + "seetexk" + "seminar" + "tds" + "tex4ht" + "texdoc" + ]; + sha512.run = "2b3e2e3d31c8fca7297729e910ada06a0d0282b618c92487b7a0da686938dc1f6f3b0881c7d1f8f3d002806ad8860c25802637c77919e21ca54ae8a23ef08ae7"; +}; +scheme-infraonly = { + revision = 54191; + shortdesc = "infrastructure-only scheme (no TeX at all)"; + stripPrefix = 0; + deps = [ + "hyphen-base" + "kpathsea" + "texlive-scripts" + "texlive.infra" + ]; + sha512.run = "f3e449bf0b34deb9ae776685f386245c4ca9644f2175ae51e9c62faa00e3cfac30fa2aa07fbd83b15b21d487ca368c09a18742d2434047783350698ced3b20b9"; +}; +scheme-medium = { + revision = 54074; + shortdesc = "medium scheme (small + more packages and languages)"; + stripPrefix = 0; + deps = [ + "collection-basic" + "collection-binextra" + "collection-context" + "collection-fontsrecommended" + "collection-fontutils" + "collection-langczechslovak" + "collection-langenglish" + "collection-langeuropean" + "collection-langfrench" + "collection-langgerman" + "collection-langitalian" + "collection-langpolish" + "collection-langportuguese" + "collection-langspanish" + "collection-latex" + "collection-latexrecommended" + "collection-luatex" + "collection-mathscience" + "collection-metapost" + "collection-plaingeneric" + "collection-texworks" + "collection-xetex" + ]; + sha512.run = "fdfbbd8fc370bfb0ea35ed9f3137b62eddd3e54777963668b3dfe7af6328a92f37c74e190e7f506ec27a3efbe44458941360599a4061a2765d0072af56808d60"; +}; +scheme-minimal = { + revision = 54191; + shortdesc = "minimal scheme (plain only)"; + stripPrefix = 0; + deps = [ + "collection-basic" + ]; + sha512.run = "ac177b74d9d5b9fa599831275a4084a0eeb7b764a6ed837d8f14f8391f0e6c0757f7b2d4a8e71868e0c8ea4d497f29d78c4c73fb9e6311dbecf29626516bbf82"; +}; +scheme-small = { + revision = 54191; + shortdesc = "small scheme (basic + xetex, metapost, a few languages)"; + stripPrefix = 0; + deps = [ + "babel-basque" + "babel-czech" + "babel-danish" + "babel-dutch" + "babel-english" + "babel-finnish" + "babel-french" + "babel-german" + "babel-hungarian" + "babel-italian" + "babel-norsk" + "babel-polish" + "babel-portuges" + "babel-spanish" + "babel-swedish" + "collection-basic" + "collection-latex" + "collection-latexrecommended" + "collection-metapost" + "collection-xetex" + "ec" + "eurosym" + "hyphen-basque" + "hyphen-czech" + "hyphen-danish" + "hyphen-dutch" + "hyphen-english" + "hyphen-finnish" + "hyphen-french" + "hyphen-german" + "hyphen-hungarian" + "hyphen-italian" + "hyphen-norwegian" + "hyphen-polish" + "hyphen-portuguese" + "hyphen-spanish" + "hyphen-swedish" + "lm" + "lualibs" + "luaotfload" + "luatexbase" + "revtex" + "synctex" + "times" + "tipa" + "ulem" + "upquote" + "zapfding" + ]; + sha512.run = "6267151dd73cb8b751ad47b79f9c698b465ad5ae5494d462cf5b3b4e7446a3c014a715381bc6a79eaacfd1ba6efb37c6c1bafbd5e1f82e8db751bbaa9a943013"; +}; +scheme-tetex = { + revision = 59715; + shortdesc = "teTeX scheme (more than medium, but nowhere near full)"; + stripPrefix = 0; + deps = [ + "acronym" + "amslatex-primer" + "bbm" + "bbm-macros" + "bbold" + "bibtex8" + "cmbright" + "collection-basic" + "collection-context" + "collection-fontsrecommended" + "collection-fontutils" + "collection-formatsextra" + "collection-langcjk" + "collection-langcyrillic" + "collection-langczechslovak" + "collection-langenglish" + "collection-langeuropean" + "collection-langfrench" + "collection-langgerman" + "collection-langgreek" + "collection-langitalian" + "collection-langother" + "collection-langpolish" + "collection-langportuguese" + "collection-langspanish" + "collection-latex" + "collection-latexrecommended" + "collection-mathscience" + "collection-metapost" + "collection-pictures" + "collection-plaingeneric" + "collection-pstricks" + "ctie" + "cweb" + "detex" + "dtl" + "dvi2tty" + "dvicopy" + "dvidvi" + "dviljk" + "eplain" + "eulervm" + "gentle" + "lshort-english" + "mltex" + "multirow" + "nomencl" + "patgen" + "pst-pdf" + "rsfs" + "seetexk" + "siunits" + "subfigure" + "supertabular" + "tamethebeast" + "tds" + "tex-refs" + "tie" + "web" + "xpdfopen" + ]; + sha512.run = "fe8b53391733392a72be2e2c80892ec68fbdb749c70636c307825c8bfd6284945c9961610fd19f8b5d6b03ec50f0a1543c7d159f5f2a19534d71b221addfb708"; +}; +schola-otf = { + revision = 64734; + shortdesc = "Using the OpenType fonts TeX Gyre schola"; + stripPrefix = 0; + sha512.run = "3a59203e6586f2cdfed6d5a948e5c150da934a809c12ef7d55f04ba8a8b95b0f1365fe7e0d802d8097f48dbad753ae481c3e27d580eb050f75956d4d04ad10d2"; + sha512.doc = "14f9cc49ae04ec2f9d5ccb48d5267ef3843bf66a288e0dbc4e7cfd00b52331216e7ab179b506acd799b4031ef11feb7c333faebdafe9a3a94bf31da442bb4129"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +scholax = { + revision = 61836; + shortdesc = "Extension of TeXGyreSchola (New Century Schoolbook) with math support"; + stripPrefix = 0; + fontMaps = [ + "Map ScholaX.map" + ]; + sha512.run = "f7062ca975c2801c220c6c34844d87e410e501442313974c77281aaa0927b27fdfbd2328676405cd1820c809e0354edd332e9fba0d04fa1e9a8d28f91543905c"; + sha512.doc = "7c64a884165087b72f052e7d3fe8c57857d62b92532bdfc6bcd46e66b12f8b12112bd71ab88d4a9603237b612d1eab5ad10e7de0c14e69ccabeefafcfd380302"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.033"; +}; +schooldocs = { + revision = 69659; + shortdesc = "Various layout styles for school documents"; + stripPrefix = 0; + sha512.run = "eb9f95e2026935a9fde3c6a72600a8eb6683ae68ffcb48798c05f3cdcc4f1064fcfd72738dd734a1561de563e044913aa82294b88984cb84ae49947387592f4b"; + sha512.doc = "c67955fe6568f0a661a2b6ea4b186d133f393420ce20c2d38dc461ee0d551ec91eccd0da94492effe4faac8c5934dd6e59853af07dae9d415073874fcb8e8fdd"; + sha512.source = "1569b42e84b56ec417435d157a1c1999a9cf9686f72dcfbaa4d365a3efab15802390e594448d5f3816bb6a03b459b63dd85942fd16d0eafb597dd4c232f67d02"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +schule = { + revision = 68483; + shortdesc = "Support for teachers at German schools"; + stripPrefix = 0; + sha512.run = "6fd063de94d68e80b5e3d2e9699330453f82f43ccd059770e4d73097c1172ec0733012317aeba7bc5e55ed322936c20f97c6f53e9d7aed21a29e07151ec54d7d"; + sha512.doc = "6763529c688e540d937af7548a7e0b9003e5df74d643c3870a016bba105782435146d5771d4d8b69cfec90ece084c245a1825c5f3ae4a5429ad0626b07a9e4cc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.0"; +}; +schulmathematik = { + revision = 69244; + shortdesc = "Commands and document classes for German-speaking teachers of mathematics and physics"; + stripPrefix = 0; + sha512.run = "3258429a336a133334b5f170178b72e39fb3e63ca053a8b541136cc89e88caa991afa86439acffdd99f25a12b7b430d9ef45cdfa7c4ec6545fd1af2efba857c5"; + sha512.doc = "82ed02e73e3db3e2055725a4d5e11dc8f370ac4787e30987320ec52deefb8de75eecdfd2adda5e76d77cfd8bb1e749b4d0e6d6a75ae2f6ffb3201f193cdd5f86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +schulschriften = { + revision = 59388; + shortdesc = "German \"school scripts\" from Suetterlin to the present day"; + stripPrefix = 0; + sha512.run = "d24778c0ae93d06b42bc8d7eb8d84ab6e0f42b33352f2dbd79586a4ed9bb21fe99a61dc0eab375e56a20624fa5ad63ade3446d685dcf063d46c0f60264c431f3"; + sha512.doc = "c9b6b43bff7a90f158b0a10c431cc52e65c4c2d49c773aafe7e54d1283d97c3badfca5315ff982cf0a524b514594faff5666063164483987973ce60d2edcadb8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5"; +}; +schwalbe-chess = { + revision = 63708; + shortdesc = "Typeset the German chess magazine \"Die Schwalbe\""; + stripPrefix = 0; + sha512.run = "ad2f033f018767556e8e4c2b76f1d2c80e14780cc4b483e73bd165c0cfab11453514065597fd7dbce05e8acfd4c307219156abcbb3d59ccead70df61a128961a"; + sha512.doc = "2df38380cc26d4321d8b18facdc6c427d1986143ae1ef8227a2d536af2fda5f6bfb73ccc395156a7f018c9c9af20b3b89bc994d9021bb9ff3fe5d771f3a6bc59"; + sha512.source = "a75dd975edceca279cf120a08d0666e9227af96732ff3d71dd82068b0c185842902244baebb074ad1ab611fed8064772cc65dc2353a9a79633f8bbe21955dc95"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.12"; +}; +scientific-thesis-cover = { + revision = 47923; + shortdesc = "Provides cover page and affirmation at the end of a thesis"; + stripPrefix = 0; + sha512.run = "2427c534ad767f1e8f319aa24744346d4a0a39f73d93c779dc89d3cd0abfd683d7a33c81026c4a5823ad686084f026193c917ff173d639dfac2c99350a819c59"; + sha512.doc = "31bc280c96b87b079a7dfb6a0c2ff1a03f80c5a047bc2c11b9fb192c50b8e51a65cb3fd5c043c37124afe2383a611f38accd91d6202416451b3eb34bfe855077"; + sha512.source = "ac14306fa7591f6fa684dd8fb6d7c7335b6ce5c8e3099d80286f05a9f378b4d430b1210fec9c071aa8a4e430ff6cae9ea712ea504cc575e89b02751c02e60bd6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.0.2"; +}; +scikgtex = { + revision = 66764; + shortdesc = "Mark research contributions in scientific documents and embed them in PDF metadata"; + stripPrefix = 0; + sha512.run = "32433b1c031747037fa329d8b8048563cb53af867bebde85bd5fb95abbdfbd67434595d5fbe682f1247c23535d75929f341668fba9a02221b4864728a5f3cee3"; + sha512.doc = "217da3550e3752fe239831790294d158dd68d16545e5c9ef3e047bedcbe82acee7e34d4216ef843363979e269e03180f20ec9e83b033b44f28acabb67ee26f74"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.2.0"; +}; +sciposter = { + revision = 15878; + shortdesc = "Make posters of ISO A3 size and larger"; + stripPrefix = 0; + sha512.run = "1a4292c9fb6dd8a8780968c69ee70a88dd5d1c5d81df9a32e22e08c9115528d8af634a1681fb1672664d57f80ab333a1b811a9c0e17597afdc358988e14fae93"; + sha512.doc = "6ea102c2318e30080224684693806e16008f946a01fe9e1d232a871f231100d1491324a3ab0260746a61a10125afff6b20072c1a49c8da279a4c0b477361e46b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.18"; +}; +sclang-prettifier = { + revision = 35087; + shortdesc = "Prettyprinting SuperCollider source code"; + stripPrefix = 0; + sha512.run = "77f8909b870fbaa4f1a0414f75f08ac602051d26c0c935be8661be8820a0b77734b614b9f5c8333b1f1fd12f57a6ee3c4c403f151bc60300e454673a2a4235c2"; + sha512.doc = "7680fa17762f17d2d7f3c9d3062bd194394bbbfbee36e4704e8b95b2be568cab51fd1dac9d90c6034919b3ec61f75f0f7689478c16f53ac7b4ee820768eaffa8"; + sha512.source = "8a9188cccf4eece9844156747bdf8414bd42227cdb64ae79ce2e95c729ebed16c9af14abb943cb1caaaebb693bde4d39e39d1302afc0595444d16b3bafa98131"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +scontents = { + revision = 62902; + shortdesc = "Stores LaTeX contents in memory or files"; + stripPrefix = 0; + sha512.run = "692fbbe0cfe9153bb4782eabe8f1713e646d5a93d4b1b2fe0f7662bd995bfae25b8200acb9eccd0057b53bff7c33c0f9ff621cd37596e9aa4cd51f84c2a30dc7"; + sha512.doc = "f978650de27e8306d70612331c2c98b5e0c047bbf91908c9968c6d613311c034dd00816afdc30b63d7673a8627651467af64a99fb7fd3978947113f8fb6eb563"; + sha512.source = "d23c98c16b7f60a1a77c0dba32eb7886f5834c1d05455a172f38f984c7bb61ffc84bae147fa7d143c196179fd719887b160718e04ff3474c5ef176af4d99165a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +scrabble = { + revision = 69599; + shortdesc = "Commands for Scrabble boards"; + stripPrefix = 0; + sha512.run = "89ff7d5440c04e7910d3c001be2d4df7d08a53a47d05b161545fb8446977a8f2695cc722854ef040b59b334804297005baee9f2d3572b767d680925191abf101"; + sha512.doc = "e3d922722c51b71f9ac74e914cf189ffa8e8f53fea4eff7addd2ce5c7d99ac3ab360b50a3212a9ebf353114f1dcc82cedd5a9315b48f4828b1340a9867ef69fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.6"; +}; +scrambledenvs = { + revision = 60615; + shortdesc = "Create and print scrambled environments"; + stripPrefix = 0; + sha512.run = "075792b5d0fc5201d672e622a958c600ff479caba2920a32ed3d3f469c525d799d8bdef20b3a08391a22ed3eead6ab3f30cebbed36c469e423e2ea844c170651"; + sha512.doc = "339d1cd398e62d65c1c92927a07dd4bed740916f2a98dd8ba2d913976d69a70b0340b9cab35250ac3ee862f4572438f87562cb6f7b2031cbe0252d8cc781009a"; + sha512.source = "1a605abf62adf986a933b6d1723699e9920df07fe383527b5d8491aee5431b5f91354052a0810d8a0f8cb2b8b853a3945d38041fc6e9e573c159e7baeaf356dd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +scratch = { + revision = 66655; + shortdesc = "Draw programs like \"scratch\""; + stripPrefix = 0; + sha512.run = "bee431e5f45ef9f5dca39b7ed439dbf141141e4b0f40642c0fdec1650dae9f0e50353e21b58307e86f34e501e06083a6858c140c870752c45138ac6788080023"; + sha512.doc = "a93b672fe46f97c1311d79de5a9304111bb75983b6151e63276a0b84a660e7b917c36b1a99a28a0b6a268b3498dab9897980aa4ca161dd4b9d59a7b2baaa3be5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.41"; +}; +scratch3 = { + revision = 61921; + shortdesc = "Draw programs like \"scratch\""; + stripPrefix = 0; + sha512.run = "f33f18d725253b11097443116e6c0cf4930b7718a5f8678b0d8fd97d8e4854efb31bd016a40a7dec2701a99bf2b5ac6136a856798ead314a8c21cf38013bb513"; + sha512.doc = "97a8e684ff98c9aca2ab57cf93be2cf8bb4c0464fa772828c033622860e46d8c61bf563e346aeff1123665c878bf3fc68c58727ec2c1579e815c7a8ece078ff5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.19"; +}; +scratchx = { + revision = 44906; + shortdesc = "Include Scratch programs in LaTeX documents"; + stripPrefix = 0; + sha512.run = "793c4e96cedd97ca37b7906b6a9e78bb06f39572ddfb57d8e4b54dd9b2846b31bbdd835fe1a93517d1430448571a30d26fa8ad7cad0aa3fab6ca526bacb605b6"; + sha512.doc = "c87994e90a748fa8afba91b443850a2d9f555ff4ac6b264107b42981e078b6966e8cbffd75f071f3f69a78c9b9aa10db65c3e855a4920f3b732446df01da7d6c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +screenplay = { + revision = 27223; + shortdesc = "A class file to typeset screenplays"; + stripPrefix = 0; + sha512.run = "d14dd76c4b1abd9ff7adbef7e4c3bc1f732156dc2d989787bed7382e0288c44dcde18ce05143e6af03ebe83c753bd2b6682cb4f56c73934ca4209a114eb9e3ef"; + sha512.doc = "ed723ffc17a98c8d4a8c960f56a3550ea74db84fdd06d26b08b5c46b12310fdb9b7b7719ffa25e8ddd21f17642f5f64f1c96327066a131c468cee8ff185cb199"; + sha512.source = "f6ada6c467c3a9d11096928dc31c7f71131f0b40146a697bda2a3e194c86070a776323c76c8b6da0edd247f8fcd1a65c286801a7353bb53bc6aa364bb7a75944"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.6"; +}; +screenplay-pkg = { + revision = 44965; + shortdesc = "Package version of the screenplay document class"; + stripPrefix = 0; + sha512.run = "974795ca0b4a286077e38f4b3b120cf9fe243d450b87b8397adec2c5425b865cdfbe70b86b815d513edb6ae7051d9ad3003fcd6a15b5b02b624dcd4ee0534164"; + sha512.doc = "9aa4407d1b317442dd76f762af5b673460bbbcec89e47835521688085183e00ba9dbb70dc9e86a95235bd9a32da701c846ceb2985dc70894ca8abe334428a532"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +scripture = { + revision = 69232; + shortdesc = "A LaTeX style for typesetting Bible quotations"; + stripPrefix = 0; + sha512.run = "3b3e30f0c5bbc99a49c9aec873f2ad93535d8c1f3fa79f91619d30fdca347dcf1bad30485463ce875e4511ed857e358824197059732c2538bffebd97b017554d"; + sha512.doc = "1de0de0b83915b59b54b234daf51ea77aef3bc58a80251c7b055708b7eb8d457806d2b897cd3771f6a303e8137b5f5543dc06c97be94142edf44558cc92a1277"; + sha512.source = "555f72881eb6d76d9362598cc0e30f67cfe2dfc8747f68e5214258fb127947965e45f0bcd1eac5e173c83e7a4e25e3bb0ef6615fe31cac5f6e3f23814e7266c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +scrjrnl = { + revision = 27810; + shortdesc = "Typeset diaries or journals"; + stripPrefix = 0; + sha512.run = "39198edddb3a3ce24bdc0d9cc6f5d7ff204b142c200a9ce36060bb016f1e1e1750b83210a91f1eec90a205c5a4923704bdc0e44876c462eb768355407597a05c"; + sha512.doc = "bf6dc1704ce60f9323b68d39502fe95d4eaf8409bf65c278e64deb1ff80aaa84f16e294ab08629466b6f8c0ca02ec03142abdf3fe0a43f862352d0ec55dd410a"; + sha512.source = "05b0a8e50efd2f21699c3bd476cd308e02267a6dc2a9cd480e0f7b2e6d9633c830927c54eaf75e4d329a8f6a8d3993782ecfe2add7b450016f7e7bc92aea1b2e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +scrlayer-fancyhdr = { + revision = 63844; + shortdesc = "Combining package fancyhdr with KOMA-Script's scrlayer"; + stripPrefix = 0; + sha512.run = "4cd49bec1f3bec3bef5c54964b06fa78cb21cfe431a05741e69cfac59577a2d24cc5b32b6abd739a96a93441e8cab0db80640e5015dc70729ff32c27d26805f2"; + sha512.doc = "d4711f5178d0e654f80d2771519d6ddeca8b883f9bf3d0ba6e9524ad4541a9fbf9179fb69c356d1ab0050b051c28cb074680a6322fef41ee765ebef8fe476651"; + sha512.source = "4d0ae176e9d191b3773a39d7d4982e6957ae95fcc8b06f4233764e57b8954aab4ff0186415f1d8ed988c1473a8850fb99515c0966dd2ce8a7c8d99e0ddff5d65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.2"; +}; +scrlttr2copy = { + revision = 56733; + shortdesc = "A letter class option file for the automatic creation of copies"; + stripPrefix = 0; + sha512.run = "5b2f1c1c86a8b3df5bb4d5edfc002ff80449d2cdcf6ec7aea3732d0ba8e6bcaa105675f9f37dd5280d3b9061400d8edc0c67460ac9f1541159484aa51b851fc2"; + sha512.doc = "04728375909e27e0814f9c2dee14697711ceba7b132ee6de63f257e2a6c3eff11a8e808d7929bbd0c9346b459afec57dd62d523314381c0c19a5e2b8b3650f20"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3a"; +}; +scrwfile = { + revision = 66872; + shortdesc = "Use LaTeX .aux file in place of \newrite files"; + stripPrefix = 0; + sha512.run = "b4d306af1e0d3dcfa59ef14250f14125bfc4a0b9b0f3e6ab32b809f2e729cfa45e27549c8cb9c2dde2819d328c1a032eb6aae6f123f1c71efeba4c9d16611a34"; + sha512.doc = "6aab0a6af0c3f989788673c44bb8a885ddb259f0be3f69f0a32b0bdebdc8e607b32c8f8530cb99d59b1c7739b2c33446f8b7c832384d07158c90bd347704a1a3"; + sha512.source = "abd536d76460165077ca7dbdcd1801b018cae2d16c783e72502bcaf5ecb34562f273ca37cedb044a50e7d53fab84412bf9a5e804be064951ebf753aaa764526b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.99"; +}; +scsnowman = { + revision = 66115; + shortdesc = "Snowman variants using TikZ"; + stripPrefix = 0; + sha512.run = "2335082e981929d24b2dd327db68f101a93b0c2b9176c116d6ca9430ea45bd85c9669921980090554406a658821f3c68305250894fd710058e15ac6aa8ede1c5"; + sha512.doc = "e883b300888ebdf62af976a94ff29a3f621a92420c26553ca16497ffb57db0d1cec7f8a38a1996e080b660ee3ae0b7245688a7732c141b0a680b864f527069f6"; + hasRunfiles = true; + license = [ "bsd2" ]; + version = "1.3c"; +}; +sdaps = { + revision = 65345; + shortdesc = "LaTeX support files for SDAPS"; + stripPrefix = 0; + deps = [ + "environ" + "lastpage" + "pgf" + "qrcode" + "sectsty" + "translator" + ]; + sha512.run = "57559707a9a5a2a924a767b25ed2f86759826a31788fb2662aa2e3ad2889b2266009ec9754c48ce923561c7587c78b23ab56731322a619b4a225775b7beb91b2"; + sha512.doc = "fe1f636c2c21159e5c17aaa75ca0bc89fb1b6ab8dda8d475045efcb3eaf489a876fe9caa4cd077e27b51f37292c5141347233ed6103ebe4f20573ff0899e445b"; + sha512.source = "3f5d1073699a71e9e89a3c71704b8b2800925041145a60454cae0ce2fe7f468e5200c7273afb70c64306a347f4037bc0698b3af223f82d755658d54f2d8c08fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.10"; +}; +sdrt = { + revision = 15878; + shortdesc = "Macros for Segmented Discourse Representation Theory"; + stripPrefix = 0; + sha512.run = "6faa9948e5bb4369fefad7d2b1a5f2bf39baf8b98e8ad3b8f61ade2001b431894ddfbd61e2f1ec73ed767b102f79f8357d965a5c3805c082d8d88bda29e10c6b"; + sha512.doc = "570795dd0c4fe0450e628f61e43d05f3e969488890eab2ee1364712e812d839c7b3185c7ddbd27c44c486e234afe36aceb4824e828cb0c9253e8e5479b0b6c15"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +sduthesis = { + revision = 41401; + shortdesc = "Thesis Template of Shandong University"; + stripPrefix = 0; + sha512.run = "10f1c0a749b9b30dda0e1c7dce4ef2fdd29220b4d77d03b8e71d8c3a460a73c98f8d16e27e6bbab07a66bf7a23cc9d3bf2b12db523232df1142a8563e0068ed8"; + sha512.doc = "afa02606e7df5655ef46b59e92dc54bec9e8f05deb1d9ecd8a0546ee068f2595620cc8dd39d04ea8db53ac7f2e9983ff01ac2646b6946fd3619db64a0bdad332"; + sha512.source = "2c4dddfd7a6fa27ebb4e48e61f8d2887e116eab174e13d9b41efc9b7a3c2f5d5770f000b4acc4275fa82d54ad5ef2129bf614478d11b24a359a38a03d38caa76"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.1"; +}; +se2thesis = { + revision = 70117; + shortdesc = "A Thesis Class for the Chair of Software Engineering II at the University of Passau, Germany"; + stripPrefix = 0; + sha512.run = "4dd20b0d80acfe324039946be7383763bc704c5e468b79edbb079993ae89bd98fd10113c97075e2b2afcccf6c75438ff62bd32f509e0040a64de69fe4fa77784"; + sha512.doc = "42a8c89d3375e35454975b087a8670cb2cc95e29e130bdfd41afbe902b0dbb66e3219dd8873fd88970a6d4cf155d077e0b4a50755cf278cbadf71718b05e6f0c"; + sha512.source = "6529a9dbf2bf038f418964a9e8d6cd7423abc2ab4faf569b983469644098bf5cc80892b4db1d7a4c90771a9495d7b64de08944d2e502c2b6e37b5e0c503eff79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3.1"; +}; +secdot = { + revision = 20208; + shortdesc = "Section numbers with trailing dots"; + stripPrefix = 0; + sha512.run = "7fb101dcd377cb5e3d1dca352d266af419c6fd83e4f2d1701a3d598e69e8e7f70afc9791a76337f4833da612cf07989ef244af1b24eb62ee59dd5f76225aa037"; + sha512.doc = "7ca1b4102c6f92bfc6dd0571c489852dc5c1df4a58530aea490098192ee256a4df7e0bbee20adff78c2b35dfe39b8cd3f821c5e45dc6d78ab4865b6f08ad8488"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +secnum = { + revision = 61813; + shortdesc = "A macro to format section numbering intuitively"; + stripPrefix = 0; + sha512.run = "543d290e5ae38ac65cd22217aec417f4c1098d629ce9acfe03340b529a7bb89ca012e2edf5321fd90331d79bd87cb5e6f15eef3e599857c2aaaad22bdfd1be78"; + sha512.doc = "da4ec2a79e7a04bbf4296f1fd0929971bd577cf4f55d0852923a0bbb73e78e28eba392d203f1abaad1fcbcdffa9e2206fb7d78003b10a2ed428c87562b01de02"; + sha512.source = "ca61cea878ed892f46b4defcd0a05176578d01b01b5f3924dfe6278278fb77ed89df3d41bd788a06bd7af389904421439ca06afac2440ba557948aa4e80a5817"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +section = { + revision = 20180; + shortdesc = "Modifying section commands in LaTeX"; + stripPrefix = 0; + sha512.run = "8b3eaecd49f8b7046bc35df079541121d76757bc2a1b6a6ffa24357a20e9ec4bf5a7b65fae1673401ebf363e46ecffe3c64a2de9aac104594b2b111cd10426f2"; + sha512.doc = "91defb5391b9e607cfaf74ac3abe53127ddec379d7a7c052f5c8f776bcef1728010a94ef7b590ddac8df140ee11fff4fd843bdbe1a13efd322a9a939ea2df39b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sectionbox = { + revision = 37749; + shortdesc = "Create fancy boxed ((sub)sub)sections"; + stripPrefix = 0; + sha512.run = "d1a4da6a59c0411baaa785c58350c1d5be9c1081e0344d8a61fc009f49a1b751a09f358ba1baa3b645de4eff7d69e3781d8b44d90738105c0f56723da36efdb3"; + sha512.doc = "80ae58336eabd8169781c3c30b42b2583f78ffa4093a7d3f9d9e9c6e31a3fb8f457fd42d56f2ff75b2ff3c38b537642dd6f254e54b3112538657a37b3b4e0410"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +sectionbreak = { + revision = 50339; + shortdesc = "LaTeX support for section breaks"; + stripPrefix = 0; + sha512.run = "4b2c26642ba346acce5aff9678bf94f76d85005464f80eaae862a522bcbfa34c1671af79671982a91208ef104a21a532d851dcc785b5c40de4fe462d12488832"; + sha512.doc = "a98eede394708bf612f593e00c58b5500a35b5173381c1f149d0be29b49fe95f5162602177b7d4f23c5b5312d7cdf47ea6ced8bc285853d2b7d77926a6ca66b0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1d"; +}; +sectsty = { + revision = 15878; + shortdesc = "Control sectional headers"; + stripPrefix = 0; + sha512.run = "7e164b14f29a385f8a97e09ad124c347a154e316ac2eb41e0bf9f161d44f2782995fe271b5472ef90dfa4ffdd5495de81090b44f5777243ea76c9f75fcbde2b4"; + sha512.doc = "69d7fc032c06d015d7a6e6d2273c5240b146062565882fca0ddf5b7b795b788207bc9b478366a0a40e4acf223b07482f5cf41a65dd9b37047bcbf12566f6a826"; + sha512.source = "fc79d4c7c437d9c5ff7d8dc62439242cb772f250527ca099cd1180e58742a9ff42e7c63776c24fa5563c95b5d2bccd97df0e1c086869bbcf5ff2ed8ff5297bf4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.2"; +}; +seealso = { + revision = 43595; + shortdesc = "Improve the performance of \see macros with makeindex"; + stripPrefix = 0; + sha512.run = "4d52687aa57245d3be55bf486b100d61fe2e2d979447c2f123f566c3aeb13657e531ace55fe5d00eab57cebe89cfd3729a71dc7177831b5192b8c0fde452d7df"; + sha512.doc = "6baba95b6b08ef95f2966d227161ea39a4084b46371967057266ddae155b115fbe4fcf148e1afc4629e33f54d0329ebb6169f1be4fdcb801d869b212d056cc61"; + sha512.source = "981ed17cba32b2bdc4848c099038193dba2b39d04210cbb2851400044654234c75c160f9c775af2fad6b76b80c85c782fe6ea75a61728ab67193dcf414b0b4d8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +seetexk = { + revision = 57972; + shortdesc = "Utilities for manipulating DVI files"; + sha512.run = "1f217550f7455a82dd1771556045e10a39138eebddc90f4d38a274d56d9072501d94476c6045012f3c5cda43aea71924268fd222895079b225d893df3b78fa97"; + sha512.doc = "1b36ac131e25541123a7d18e9a5e3cb1fccab04ffca1b0d1e5a036a26de99fb05e6745d43cac6dc76a295eac5503f90eafdb2b40f96c88836123b5b599a47e2e"; + hasManpages = true; + license = [ "free" ]; +}; +seetexk.binfiles = [ + "dvibook" + "dviconcat" + "dviselect" + "dvitodvi" +]; +selectp = { + revision = 20185; + shortdesc = "Select pages to be output"; + stripPrefix = 0; + sha512.run = "1674c9c9d7afbc851f8c4fad1b46a1ec18161eb48375d892c947416ee97791addf92f75a69090c95a0f08bbaac1a7a745af93a7bcf91e2e0f8117ed3f3106dc9"; + sha512.doc = "7c99f0400841cb1d88af4c239f43eaec7c0b2358c2e581866d4361cd86b9eff413bc9e07d8df630ddff8d4f37193896bd430f4c357d9cc04591295f18ebd09aa"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +selinput = { + revision = 53098; + shortdesc = "Semi-automatic detection of input encoding"; + stripPrefix = 0; + sha512.run = "41888a394e4c9adc60242e4c689b272a7b4e2a2db2e4824e0068a305cdae59c1edd46b0a9e45909cf29381f240693234330fb3488be68831136f8f04a72faca6"; + sha512.doc = "918b0b2bbb8230a482418c56de8081bb455980e178843b0ea84b18435c1fbfcd50a71cd0491b89c5797a374479060175219333bbde2ab28b5147cb5c3fd65ff3"; + sha512.source = "c6b2c23826216a5c479c3cb3de1685dd4d695422ec67fa7109e7a1adb46dd7ad8cd21138a480e8e13bce1c4184fea0153114f338a5754778b22dc173d6f9445d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +selnolig = { + revision = 68747; + shortdesc = "Selectively disable typographic ligatures"; + stripPrefix = 0; + sha512.run = "8dd7baa476f72549830f2571615af2374b9d74da69c16f2999708201b7404c46118e7a6046ef8dff39935d3b94373140819497508b2a8982cc928a5dbfc6eaac"; + sha512.doc = "c36e55066eadd959f625fcb72fb89ab2ca51f3411ba9bc81c38d2ac3f18ffd792fd95c33178c0607e3958cdbd81c031193d1b6c712906a2c9cdac4178ace6ceb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.302"; +}; +semantex = { + revision = 65679; + shortdesc = "Semantic, keyval-based mathematics"; + stripPrefix = 0; + deps = [ + "semtex" + ]; + sha512.run = "156ef55009e52bc91bead46963d5f383c9b760d4c72a45097de1e3ce3fcb1aae4686386efbf8a3abc2f18d16f59d02f297acd825a9cfa21e544ba2dde9986c13"; + sha512.doc = "1f94edb17be3e148a913e98ce020f5273085507537b51b4737c5c4d1589e415aa361cdb25264c412af8b93025b6dde204c625180c5182d319c199d5e8e591757"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.525"; +}; +semantic = { + revision = 15878; + shortdesc = "Help for writing programming language semantics"; + stripPrefix = 0; + sha512.run = "d49c22d4982a33177fdd73c5ff15a68e663c3ff1ec9a45a40e5a8364371a25b536dd6c1dd963296ae998760178833b5f2c357119f41e7bb5a72061f0f9ad23fa"; + sha512.doc = "21e9a7efd9fd6dc28be30f284285cc8c13b266eb03c9212b30f97b761c1383e1fb84a18e92437d331d3963068a68c61276cc1fd3446807bedc954a490fc490aa"; + sha512.source = "4d513b6c9b320b9ddd8ec92fd8eae079134d351170122833e99557fdec7510938d8ef856c52e0a862a8cb8cdffa3894c160dfe085452e0cffc49db4d3fac6a79"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +semantic-markup = { + revision = 53607; + shortdesc = "Meaningful semantic markup in the spirit of the Text Encoding Initiative"; + stripPrefix = 0; + sha512.run = "f795c901ec0b133520cde8e269364977638d410d6d06207d868e6151e7f43a4d3c54a73780237e2dfb86b9077b0724fccbd7e9121d51a64034f4bd604a38008a"; + sha512.doc = "f1498e628054e91f7b0ecc0fea7c926aa55d7bec56c3c13ebcc5073f96df84e8c1e255532f9ec72b8133d21511e4f5f2996d95c39c15cb74ae39fffa87d5a785"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +semaphor = { + revision = 18651; + shortdesc = "Semaphore alphabet font"; + stripPrefix = 0; + fontMaps = [ + "MixedMap semaf.map" + ]; + sha512.run = "b8741be1544d8ab488632e05464cf607069f0d09df7a727bc05d06175dc16bff461d551e7130e01edbb53863d56fbf4cd0cc9085c51186e19e5f2fae986b400b"; + sha512.doc = "ef0c85ca5e86a17d59c03255d679d54cc8fb36eec02c8546f29e1c514408559788d1dbe3ac7565224b320b71e9ad77979b1092fb0f098a1c48c3a7093b72b172"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +semesterplanner = { + revision = 56841; + shortdesc = "Create beautiful semester timetables and more"; + stripPrefix = 0; + sha512.run = "26c7b18796dee2f703f22ace3aae21b38f98d9250b1896a3cfe5214b42551ae3fe4accd9e8bf905109c05169370317608e23363f4bb512e794cfaa528b645119"; + sha512.doc = "32c29aad8acf63e60f07262930f267a295daf9498621c48f0b9697fe31e4dffc63c8992b5c5f60b1d61188de893421906aa3abf160a79c6dd5429eca87c03fb1"; + sha512.source = "709556569a5defa5240781ac1bcac0af6e9cacc0016d6ff057a4414a67c69cf8d11a17c716748dfdc81fc31c2bdee230c9c4adb7c4978ccba20b7330db47ea81"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +seminar = { + revision = 59801; + shortdesc = "Make overhead slides"; + stripPrefix = 0; + sha512.run = "28795c64e4af5296e228986c28115305cb76087d241e91312cfff351f7e51833a0d76b2acd667fc5f7616dcb1685cd02b2d9352ef7f0e36d5bffdaa5f421e6eb"; + sha512.doc = "8b7364dc568d1fd78cce21ff1846a6369fe3fccf07bf16ece8383c941492404d6fdf3be1607aa2279a10d670803536474d7cc318b9b3dda24142fbcc69fe69e0"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.63a"; +}; +semioneside = { + revision = 15878; + shortdesc = "Put only special contents on left-hand pages in two sided layout"; + stripPrefix = 0; + sha512.run = "cb3f20a7f766681f9b7748ea3a816fcd477e6685a159b071502716c708e0e1d5a2a33a5b210cd1e2a684a288d07079870ad243218dd74e80853a227fd445c884"; + sha512.doc = "8d6b1ada214f99028ea9843b4d5a85a8a974a9ab52e8a7d9338d25341282d6f1c8ca4e7a24271ec20bc4be781f418f2ffb558ef4fe6e6f42d165bb24650b54da"; + sha512.source = "1b8d0d90db12b52add0f7dae10cb16bac8a9260e0a6783762908a07a014dca294ea6c631ceac3a5d063705cf39fd1a57ce6b99f72c5da4d57d4a30cdafd25767"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.41"; +}; +semproc = { + revision = 37568; + shortdesc = "Seminar proceedings"; + stripPrefix = 0; + sha512.run = "ac78e19197af3c72863ee4ca94842d596189d37c2d559ac1254f70fda1011943ddd7ce17b48f183b839a6610f8d7dbded2a0f2a18453823a0c0044a70841dcf2"; + sha512.doc = "2c7e2a40348b098037001928d6f21f5a66c23967dc63296ce26736b006a46f9d9536fae9480c1f0d0db72ed59973a6140471bb110702fd5cb997fafe03133dee"; + sha512.source = "7faf073ad7da9627b59509f41056df76658875d04651321389b3ae789e2d704691e494726635161eeab97786b8c8d6cd322e3ba83b3e1a779ff3d10a752fb51f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +semtex = { + revision = 56530; + shortdesc = "Deals with stripped SemanTeX documents"; + stripPrefix = 0; + sha512.run = "10d2b93b30581cede982f5d7ec1ee5bf6f60406e27e1750f2bc6b6dfe0f683ca922a762fafac0d5d037687c0a98188617ee48bb51ea132ccde7cd1c33bbdf273"; + sha512.doc = "316df9ed5f2d058e6c28e5e8e5f4bc3ed64439409d1ae1c608b2a75a23c40d438b657642093cb723b23da4f14382f1080aaa3a9a49d8ce143e26e494a3e7b3e9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.45"; +}; +sepfootnotes = { + revision = 41732; + shortdesc = "Support footnotes and endnotes from separate files"; + stripPrefix = 0; + sha512.run = "a7333a9779ebca371aeef0a1348968d8b4649ca037e88f6e8a6f5224d13265202c8de8d2ce5dd89de170ddc348cfb04f5df92e249c122a608efa8fbab4daba98"; + sha512.doc = "eb7d70eaec4bf58c85964f7a3692da09894c898f712a119fc0ffa42429be2e53b96ed6f569fcd37aff170d2b953543992bcc693e264ee1ec542c435be2723414"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3c"; +}; +sepnum = { + revision = 20186; + shortdesc = "Print numbers in a \"friendly\" format"; + stripPrefix = 0; + sha512.run = "4ba90558d397f0c047ffeb01620d2d5ed4bc38431ddbd75d9a381fac58360d78270b8f22e761693a8a39176d1ab92c9da3b6bf92aaaa90b8ee20490f5b70f50d"; + sha512.doc = "080b081b101ea57480e4c958e997f5b10d22c5de56a60c1f415248ba0564046560650ae589b29c73d185fa88334a26ca3412e996fcc1214ef0b9d20e71bf18fa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +seqsplit = { + revision = 15878; + shortdesc = "Split long sequences of characters in a neutral way"; + stripPrefix = 0; + sha512.run = "02413d104e12aad40f093731e2d28d0354216d3d57e6f811609f398b8122bdbf906f78cef38f355562efb4e7df6dca314f8548d8d8c03a2a9404addc42f0e1f3"; + sha512.doc = "0c49425b619ac62da4eb2392c51cb7726d9bab008910a88ec36b866717c8ac341be0903e3014ed36a30ac701fafc453a0e319470f2f65eb6775d6ff52b9f07e9"; + sha512.source = "7349cf842e7142c5c13e46d16acc35535cf34be8a4985f9a581a4338ca54beffbd80fe2820123652f3ffc868bcfe1c995200ab918c99b19d6c2ee339b61354e3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +serbian-apostrophe = { + revision = 23799; + shortdesc = "Commands for Serbian words with apostrophes"; + stripPrefix = 0; + sha512.run = "4e3998b6c3f5578929204c0b5f131b0ad4526057b50811253b6a90367327c63af5bec386aef54ae6c80be7a1ecdcc6875bbdca532fab864e61837cf16855750f"; + sha512.doc = "38c8ac74b304ac992bad807f2727a3e75a727a77c5bfe5042e24a39ad305162e828ca0333963a3f91c5f26ca0324e7feea97dc6ab84c1cfdb6c26b05ed5f4fd5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +serbian-date-lat = { + revision = 23446; + shortdesc = "Updated date typesetting for Serbian"; + stripPrefix = 0; + sha512.run = "420b77a36a08e75f8020edffed704ff0398115a6bfe694fa46957ad8b35c58435ecde4c16176a72bbcbcd16139502f8fb679399852bfc9000df6d5f305fbb04e"; + sha512.doc = "5c10fe13a4e1d6117ebfe8d737d50047dc97483c7a0cc287a9e79d367af50ec1cbdc0800161919b92c6d82774c9e756970db71344259028c254fbf2c1fe86219"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +serbian-def-cyr = { + revision = 23734; + shortdesc = "Serbian cyrillic localization"; + stripPrefix = 0; + sha512.run = "6cbd1da1160519914db1a2269a54f1f81442d84750b15179e4a0f4e5373512c959542a789ef39a2803b68030bd6a8001fde777e907e85852703ff696ec9e5113"; + sha512.doc = "0f2a2fb44eaef8e0eb01e12260fa310d661501c3e1dacde2882199ce4bd5323c837704fd50e8db5b4ba567a38038b37be28fd834874262de2e3ad36b65816498"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +serbian-lig = { + revision = 53127; + shortdesc = "Control ligatures in Serbian"; + stripPrefix = 0; + sha512.run = "d9b5d42c565d5704ab516302534238961ad42e971d3c3b4b4672d4cc19927ac22a871735d88c362b753640d457597911fa269ec30edb5c1c0af96820299c6720"; + sha512.doc = "6ed0551c176ddd34e1a4eb4449fd78ca38c166efd41b31c78dc1e192a714fdc81b195cf83587f256462b610681136b69960867d5f1a571a5b1b47256fca88f05"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +sesamanuel = { + revision = 36613; + shortdesc = "Class and package for sesamath books or paper"; + stripPrefix = 0; + sha512.run = "bb7b38ff9e6494fb3150602008a66df5fd8c35dcb52a2da196cd177bcffeb40e284fa493b296f01f22864a5bf25d89fb4c079ff4d9fffacdf37dfc9de9256518"; + sha512.doc = "cd144c93693367bdda658fb1ecd424715849fa57f0aded627125db2703947c8b5886df9ec08595592b6900327b42e8cff00f0c69967075321bd7cd1064054f3b"; + sha512.source = "4a5dd4a8da6a8719f47d4b4bfb5e3a6c0e1498369fbcf7f9fd48304906bbff383793329959b69f13a75bcf3d01b888325c23079b4503aa779f464c2864560416"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.6"; +}; +sesstime = { + revision = 49750; + shortdesc = "Session and timing information in lecture notes"; + stripPrefix = 0; + sha512.run = "5c5ab4808645230c6563a08b8243f27fad02a76fa56296f4c7e1b17d2140ad0c9ab0b6ed02e27240f596113019afbed52dc5a9f5efd874ba7783c921b81416c9"; + sha512.doc = "93b986ea6853761fae06b297b951a7a46ffee403a4fc980aa1afb7cc42c15fe753797eecbacacbfb49b0119ac9e24dc105975acf72852eb0265dc4586f397bc2"; + sha512.source = "8f3200ab63d77bf24aa9b2cd51ac460f086cb82599e9099b41614f039cf569f4fba23f2dcd59174623037046bacfd5a11ff59f140b09f373edb6346292db7910"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +setdeck = { + revision = 40613; + shortdesc = "Typeset cards for Set"; + stripPrefix = 0; + sha512.run = "817474bc928883f4bbe97391a477bf492a4e339879fc85d7aec3ca932f9b46c310f8fec5b732deb2196c705c2bd3a22721376ea8289a1bbdc12555447f12f757"; + sha512.doc = "c27f7ab563f35293ee6019560f643d562ff2bf06747402930c767031a8dccffac0ebae9cd16b9e3009b5883f594c541ccf4c38883aa89f4256f7db83e378e1e9"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.1"; +}; +setspace = { + revision = 65206; + shortdesc = "Set space between lines"; + stripPrefix = 0; + sha512.run = "9462cb011a2a13a962c08d7d962c120f2b459630f8ec1f96704c2878facf01a37118e9c94ff9cefcc9ac0e0e3c1bbedc158aaca24dcf13cad0973a6544e79651"; + sha512.doc = "0ff85289fb5ed620f208e3ba84e82efacc91da32611e95a4a99aa5c939c0400ddd3a118d460ef65d77b483678e5ce8c71b901ed0ee1f711cfaa29f26141089fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.7b"; +}; +setspaceenhanced = { + revision = 68493; + shortdesc = "An enhancement of the setspace package"; + stripPrefix = 0; + sha512.run = "594fc089440a356201122b33160a16785dcabbb2eeb1fdb2fdbbc1e53c83f0ffcbfc7b9c6be623e6a5e4ff23b933f25120ba1ecce72e73d8e32e1939a2744f8c"; + sha512.doc = "d9356a26bed9405fb9cb45eda3769dd5360418c02fb6442cb4dd64da5e70e9785b167e8406fc772fb7ca1cfc574b23a375916d0c5dd6a1afb09668f5e6c743e0"; + sha512.source = "5f16118ffc9b7572a18c485915a677b822c26ed0c4f885292c6779f91c0a9b6fb3d4f88dabb94798715efd880f6577349ede1936720ce2c6274c35671e2f0aa5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.02"; +}; +seu-ml-assign = { + revision = 62933; + shortdesc = "Southeast University Machine Learning Assignment template"; + stripPrefix = 0; + sha512.run = "929cf4aa8b1a55a74cc13e4f823f6d814fadb425f7a6ea53c18cf4244a14b9bee8afd8c06327add62b016ff36e7ecfddc29323105362a63342d382febbabc428"; + sha512.doc = "fa1d6be46bac0c2075b8e43c1f39d74092cf86b975b4c281c57b778ba16aa6345258261e26690fc84f79fdfd57082eba64d894002a723ee8bd821fd9d99e7774"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +seuthesis = { + revision = 33042; + shortdesc = "LaTeX template for theses at Southeastern University"; + stripPrefix = 0; + sha512.run = "a36006ff6a093cd589a0e328c60e7e78afc160ab45746e562a43a8944b2ab331643261f56890497b70449f76be43c0b226642cc5570dccfe0d6240181b20bcb3"; + sha512.doc = "5bbc5770bc42c62da7ca569b10558dc02bbe7fda2a463a3a2a78bc76fda3f1d0e7023c311f62a91bef73ae3c4026561403284404acc6bc72cb2e308ad4092ab8"; + sha512.source = "a442b5ca4e1e8a4a3f8d331e5575066a8c63d1521d1f774fa7d386a8e42b09a2c4727fae1f0a51a31c6a98c173113349738caac8991d50e4459082a874fed1ad"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2.1.2"; +}; +seuthesix = { + revision = 40088; + shortdesc = "LaTeX class for theses at Southeast University, Nanjing, China"; + stripPrefix = 0; + sha512.run = "8f2aa388faf3fc41cdda54ac44631dc2f0737b727f3af27c41bc268223d2f3f6353dc24f067ec487fe5f3ced5c7837ee6f60d46de3950a3a3c9573df77cc725a"; + sha512.doc = "1d54dacc742d558af5fb006cb4f26e073bbf6a3a572b7e81fbacf691995a4a96c72251225fb7cff598c930a4c9984d0d01d080c797f202f7e30aced20b8b3e5b"; + sha512.source = "fbc848315e2b76ac915aa6abc0a9e7bf2f63c4af716ccf65c9af3ae05e049952703c1f86db97a5825b92f43dc2d1163e6544c30fcfce4b672272b4ba9057c171"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.0.1"; +}; +sexam = { + revision = 46628; + shortdesc = "Package for typesetting arabic exam scripts"; + stripPrefix = 0; + sha512.run = "60fc18bf706b787b9bc59d1ff12e62fc3b69f5c6815a629f6743c8ff3fbbb2948c145278805888b235756beac5dde5613c10fe4ce20bb6536b4a3d77a2713569"; + sha512.doc = "0d2d5e2e5214622ea6b398c0b0f7a297a3f247ef3df0ed696c6faed94527b2edb6564c917d182177f8f3b44d7cd0e14ef4ac186c89113ad74e3ea70475ce1179"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +sf298 = { + revision = 41653; + shortdesc = "Standard form 298"; + stripPrefix = 0; + sha512.run = "c9a262481a01019010a645c321c675bc93e3e0c6627b693bce53a808bc9366d7915c19f97871786001fbf61b589f2cef274aba005681f9b32094644568d0f2ec"; + sha512.doc = "03b1d51626e6ec0b076f4c2fb5b34daf490a671df69edef7235a6c8c77b2475e79604c7d49aed3c7d756c9fb781a7398a27596ab9b183b942119ee86385ec612"; + sha512.source = "af4d0437e6c79c7bf0975f8e14bd8f19675223849b04b9e7b1d526ccc70a8a4a6d6773f86f9ddbcb98329368eff8c7f41cab4f2468f0100b8f5f840288184826"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3"; +}; +sffms = { + revision = 15878; + shortdesc = "Typesetting science fiction/fantasy manuscripts"; + stripPrefix = 0; + sha512.run = "ea7fbce545b9e9dc8b804e293239fdd491bf1293875fa841afc5a33ddcac7acddf243194e36f8958df4d23c71ad9b83348fda57dc261f211b49fc137b66ff6b2"; + sha512.doc = "e1702249f2516dde93887403833f9261f73e90ce04bb97d4052de1a28b9f5bcd5729d1d9a68759ea92271b46cbbebed39565e8c30248af4c894c347e4b9b75a9"; + sha512.source = "50fec199dddd2509682af8910db1cecaba7359be24a1666e156715e4613571c6f48c27eb813efaab2d6a4fd01e0e9d110021a42afca501a75a2ee02f7c80499e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +sfg = { + revision = 20209; + shortdesc = "Draw signal flow graphs"; + stripPrefix = 0; + sha512.run = "d90305b5fbac3e06bc3195b802b4ef78f7c6cfb4f0592dfd300839dd608150e1ad08fc7479fe6d8df4f2429ad6b7f81692d9723dde198991fc9626565cb38578"; + sha512.doc = "26c17b606f0cfb4e199755f7f16eec16cbe379a786a88bec2d77d983d17107d86bf8da23474bc3450f8467d18028f2f41a314c83565916cf3ac3e97c5c079267"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.91"; +}; +sfmath = { + revision = 15878; + shortdesc = "Sans-serif mathematics"; + stripPrefix = 0; + sha512.run = "7ba73610785c9270e8741ba0137701677575e38cac79976d89e2f5768804ff52117c5fcbaab9b260be522f174458a18d2d70d82c2da201e7fd6a91fe4bbdf6fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +sgame = { + revision = 30959; + shortdesc = "LaTeX style for typesetting strategic games"; + stripPrefix = 0; + sha512.run = "60e1c4d7f68bd6d39e081d49bfa1ecfa7dc56b940172719b4d6d0f2e87456c4b511ac29bb1884f7c290e7b226eb6ecae8f2ce4de3f7f5fbbd21934c440395ab7"; + sha512.doc = "29f4ee374c7b9d07274fb6f622c0769ff6977ce522ae25fa24571c0b7e60f1e120e4e26d37c6c340372fc0a2dde71a25121fa9538a35aa100e21637d5c79c874"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.15"; +}; +shade = { + revision = 22212; + shortdesc = "Shade pieces of text"; + stripPrefix = 0; + sha512.run = "968be382e1f82029e7e06f5ed34473fc20fd38dc758b97fec6dbf015ca13c3604dd6b7638dcad2f80be474ad001c47ec86e75e8d9947bde26053873376e9e068"; + sha512.doc = "0c9ec337ed4c9bba949e6b449368868856d652b2f5ac7c70dd08a9daaf8a3ed3be4008a91c003c731c97f7e4132f571c44ea9d4a4529f7b0ac9be11a673310ff"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1"; +}; +shadethm = { + revision = 53350; + shortdesc = "Theorem environments that are shaded"; + stripPrefix = 0; + sha512.run = "b9e15e017332eeadd3324afb858ab15a820e23da59f5bf7ea57dac719b9864304effd092c3cb2f25a6f29f22dd2b6f2585279edab4d77c62256582c66be550c3"; + sha512.doc = "c24f37f7f864283f9ced1da1728dd7ae137395ecda3010aeff8ad778b96723224df77755f8f71f7672f5870ad6832a22bce47bec88ae51d0992e39c0a00c8caa"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +shadow = { + revision = 20312; + shortdesc = "Shadow boxes"; + stripPrefix = 0; + sha512.run = "885bca1090b93545f59b387e952998f65dee0931fb5b680d06667c3bb8172e2aad37e840942b9495134b421bb40b871633eb5de941b3a257618751e789128ca6"; + sha512.doc = "402e64195e247cd2c5106e3bd621705b80c006b2f6cf0b1da14ea459acb7dd97e2ebeda87ec118be3e73bf76edebe3067330498a2875c52c4248add70d7a0a25"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +shadowtext = { + revision = 26522; + shortdesc = "Produce text with a shadow behind it"; + stripPrefix = 0; + sha512.run = "59ab708b0f8987838cafe864cdcd68aad5aceb7cb4b3ab2b479ec4fbd15e268ba4fdd1b0143b7c247cc186a825d99ad810839221a391eafd5146f0a46865e23d"; + sha512.doc = "a89bd6ab160e364af06e26d9bbb88988c286befb5dfe4e4bdfc7c511811ef4a1ef630708d4a7ff32cb0ab6831dbee54d49a84376ee9366bd422d5689d86db404"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +shapepar = { + revision = 69343; + shortdesc = "A macro to typeset paragraphs in specific shapes"; + stripPrefix = 0; + sha512.run = "24975c53f9b29ae8302dc4e169d7d176c4825a0033764c8a08aa610c184e79d249e849e2ac3ddbeccb3bb80a4a5e29ae1c474331de68000de1a63951079acb4d"; + sha512.doc = "69a5f9dba1683ed0302a3dc4edede537986ea473357c0c8c454c26eeceb2c51d31d87d139bc3eed39ef1862c2a6feef0e570e9fb12bf88f15ee7f34280f7daf2"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.2"; +}; +shapes = { + revision = 42428; + shortdesc = "Draw polygons, reentrant stars, and fractions in circles with MetaPost"; + stripPrefix = 0; + sha512.run = "4e082b6b61ae9f2d02c6bdf7fe5beeb6b6384b2718c1644b945b175bc17c951ec7890fe7e81eb59faea4ae86da93eaf51467450cd61d223e734408e624bd8abb"; + sha512.doc = "2c295a28748f8df117a5abf16a758b079d7481f579e1bb571fc758bae505860e1a1b82f9615259b14359eb4ea8f43be82de6ae6d761225ea76bc0da167b6786c"; + sha512.source = "58ccff2be6db013bb66e606ebec52b0f86b4ab3e2066d9191f18da0534d2187fe6a3944cf179b6b807025182cbd40be8c24f190c5938bf4e4264ba492a845be1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +shdoc = { + revision = 41991; + shortdesc = "Float environment to document the shell commands of a terminal session"; + stripPrefix = 0; + sha512.run = "e72e5d88966ab88ce2ea331f2989a949f3da30cb1066a0501fe8770f077f8aaf15803d9337ab266374364fdb7b35507c6d3cd181e1fb472f6d39b6ef94c08c1f"; + sha512.doc = "38c3a7302edd2e38e3196b4d3935bc001f83fc71ed50ca8c3563ccf82e9e0729c65baf0b95db0ac637cd037cd572ba557586bc85230ff6014f63a8fe0602d9d1"; + sha512.source = "8de0b05b8cfaf13d3f3c1192c718f5663bc5d1e5d9f67395956bc18d8f97c6acd0811660c02c3dd087f617098d0ec810a69dc31a20e157fde69431eaae4047c4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1b"; +}; +shipunov = { + revision = 52334; + shortdesc = "A collection of LaTeX packages and classes"; + stripPrefix = 0; + sha512.run = "e31326135e93eaddf9f07eb0a746c83b9b6b7a7569daccc2b4ae0439664ce4a9cb2edaedc0e3ff727a4896fea43411c9cef0f3fb8455b1616de04e03b54b257a"; + sha512.doc = "3c04f8dec84f3ad87572f6c180ec783f9a879b887b4c7f860097ac03b297dd7c4a4385cb402ea0b7f09176d711050ca7813e51607cf7bba871e191ec35d9af88"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +shobhika = { + revision = 50555; + shortdesc = "An OpenType Devanagari font designed for scholars"; + stripPrefix = 0; + sha512.run = "86050c89e5939b8ffc2148f9269a48dc66f8adf396cb883a7018a1a8f123cb602f216f652f56715bebbdb7b0577a8d0cc799c847898543a4cbd22e478524b127"; + sha512.doc = "f5d9d05f54876bab260043e698fd746c95b59b04ea5b2df7244b11af30bb78e5cbb6e3511bb75d775e1bc649082575192ccbcb68fcd32b9816879b5cbf3277ba"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.05"; +}; +short-math-guide = { + revision = 46126; + shortdesc = "Guide to using amsmath and related packages to typeset mathematical notation with LaTeX"; + stripPrefix = 0; + sha512.run = "6e2c131cb3a2ce85a6718a8dab1cc52fa5dab7a3db34575dcfb0a33e6a3f3ba6025eccb82a2e07a198243bd24c5070a931e591003a768c4a057f70659e442155"; + sha512.doc = "0feaf4b3cafbac8fc78855250dc39858b0b8326b803c851efd831f36476dac2f1ce86083c11476e36ac88b44a2a8d25094f9203c774044306536fcb2b261a184"; + license = [ "lppl13c" ]; + version = "2.0"; +}; +shortmathj = { + revision = 67201; + shortdesc = "Automatically shortify titles of mathematical journals"; + stripPrefix = 0; + sha512.run = "a8ec0460d532b657c6237d5d321852b0c8ff0807d8cf73a02e0d40bc6c86b2c776dbbc5ad694d3fe022f851f049dbba6fc11d57d5d6fdb8f168a935f9f443269"; + sha512.doc = "a1fee222b86efa1cdd1d35aa2eeaf84df25db25b1a68d56863a370fef11ae62a6a21ed2ecf0f563d8c00c38759008d26e7c43988538bab6ad6b2a52c68c74c46"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5.0"; +}; +shorttoc = { + revision = 15878; + shortdesc = "Table of contents with different depths"; + stripPrefix = 0; + sha512.run = "6e78bca7425e0b23d7520af19494d9de303b86fae7a013ef85b2d512ee86be1f478ede2293650b435ab579811e444b570995e2ae8720afc60b42c0c26d7489a6"; + sha512.doc = "03090924cdde619877b271fbd70761035b5da1f2278a3642b471a86e83559da316558a752d85716242001f40ca403a985d036750218e78d873a4920905c5a652"; + sha512.source = "2841e846e2e691864e3412c52c3cb2130462b2b94f01ab9ccfba7cad05392db2b63ce3cd3ce60896a7861969ea20fdd3b1918a69e122316149af3fddf1b9c492"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +show2e = { + revision = 15878; + shortdesc = "Variants of \show for LaTeX2e"; + stripPrefix = 0; + sha512.run = "702d0913a299b68bedec15c697868a70f058957dbd3a2dd2c503bc21c8a250dc7601e6348080bb394a38108bcd2f5ee67796a888183aa181c9f88a72e7666580"; + sha512.doc = "a427f7126ded4251c255fcaf2c381f7c00d0d0e55253804cbe631ac59be1bd51e7ba2ee51110af86bcee27d73698bb7baa323fef8e23a41000928b242b0be282"; + sha512.source = "3a6bb6fbc35b5f6b1cae00d5c63c16ea13af270cbf90f57761f71076b26130272924154b8b0aac60cda41d27b75db4f1edfc82101f38b29e9641a4e02cb6c2a2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +showcharinbox = { + revision = 29803; + shortdesc = "Show characters inside a box"; + stripPrefix = 0; + sha512.run = "9cb18e80701d22e167b026767068e0fc0a7b6c4cdbc9014991f10ecd76d37614983591c931972584c50e0d6e35abee70ae3079f7dd8c855d33d1e4ea06693d25"; + sha512.doc = "47dc7121ed852931bdc5bc38b7fb4dfda6616b8b0ce649d90da71c7a4cb6084ddd69e07596dd4179b5654fa9a54fcedef6949ac4778b449ad14740058e237dad"; + sha512.source = "0c3ee2d6c00183936b57ba8e44d274baae8d90b8c089f6b5f3384c5928c703f22c87ac2781a8399189e028d6503c3e154499e85ac6b1ae69c7cb27eb29ee11a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +showdim = { + revision = 28918; + shortdesc = "Variants on printing dimensions"; + stripPrefix = 0; + sha512.run = "07c409f3d30def6894a787d9c2f7366abf6ee4248386e9d5b2e4f7858d692c7cd3e72871ff02c73a39a190ac36ccbaf5fe16e8e1b7b328be80a9ba041d12feb7"; + sha512.doc = "ba76568009149bec7484b4dbe7bede8e516a2c2ad20c77c70f0357e865c66751aa4f3d8c92c59effa1ac12e03b3b8c500c65708547ddf52458b0ce90def8fc98"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +showexpl = { + revision = 57414; + shortdesc = "Typesetting LaTeX source code"; + stripPrefix = 0; + sha512.run = "d42f5d3570f252295a25c130c9ec9a94abaf9f28038fca163423a0aa44afee4f354aa2dced3ccd173e698a5da6ccfaa8284096742ba04b03f5aebf8fc502426c"; + sha512.doc = "a3f12a43edc3ffa5556bec25b8527fdb039aaa704b2ea37c723cff367d453b0ac53b14c1eff41bf6d3961cf1d4f11b70349c03d253336421031ef0ba81b56561"; + sha512.source = "52ff44163115b6ffa5a8e181739df2c8c5619a32af0aa7bfc773d84b12c0e85a67bf87823ae0dd47f7d40d9e12fb8bde039b935555a1cc220dcbf49d182f6da3"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.3s"; +}; +showhyphenation = { + revision = 67602; + shortdesc = "Marking of hyphenation points"; + stripPrefix = 0; + sha512.run = "0a3ca7d966edf0f4221dea2c084b428c9e248b3d223b57f3f210258918593d93518a5ebdce7d9de6b88ab040c0f2b632039e23f3339a729d1fe1391f8a51d4eb"; + sha512.doc = "9d7263e5f285f5d29738c7ff578a0bf9256d67e56b882e41f0578bf9b594225a6e0711d9fd05bbc89a03cc0bb56b1ea8c3ccb1f4bc4f91ad40dbe55849b20c99"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +showkerning = { + revision = 67603; + shortdesc = "Showing kerns in a document"; + stripPrefix = 0; + sha512.run = "37a913fa403c9760fd150cac3fb88e349e8c1109f51768ee202194e72232d6e16d8dac529872dd1df7896a40a79ddb72d65c9191f72337c806de307808d80532"; + sha512.doc = "39f8f12a70550a5864956c6145a2a19555c18ce60084b66d2b69b6a2ab8796ef2b911be39c59e736534749b42930bd055969ced8eb5cc03f1e5f2796a0d0b3e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +showlabels = { + revision = 63940; + shortdesc = "Show label commands in the margin"; + stripPrefix = 0; + sha512.run = "285389ed8ef5efcfc4855e2b8003cf94275de536c8f28a237fbdf856947d55c935bfde721a00eb3e2a0187bfe552ff97671197bf1c40492a2e5e700f9536e3e8"; + sha512.doc = "0e624e36f96b8f0d06abc41c301753e3d71671daac4ab01a3914cbd45a5b07f4574011f93c5ce62129fbd77021712fb39364c240eb9b394b204597033ab13df1"; + sha512.source = "b3bd2c4e750662b7a1728f0b100fdb1c78bd33ac95e976211156786833345f2b5a3b5744a29cc134d31b166f85064607d812f7ba1d73c00be421301f4e41031e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9.2"; +}; +showtags = { + revision = 20336; + shortdesc = "Print the tags of bibliography entries"; + stripPrefix = 0; + sha512.run = "b70dc03f22838dab65631d39d8690897d4a5c71b5451775e85cdc3ff600d63afc29bd28e49aa64a5a2467143f4a84d62f5a2a9af4a8365e0a867d6a46e9de93b"; + sha512.doc = "3e1efebe8edd469e66b18aea9d9a3614b753a43ac61f5a31b57fccc1b45047aaaee8f80d156932671f9ae7457fc627732f1f72c65fca42946280c1182d8960de"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.05"; +}; +shtthesis = { + revision = 62441; + shortdesc = "An unofficial LaTeX thesis template for ShanghaiTech University"; + stripPrefix = 0; + deps = [ + "alphalph" + "biber" + "biblatex" + "biblatex-gb7714-2015" + "booktabs" + "caption" + "colortbl" + "ctex" + "datetime" + "enumitem" + "fancyhdr" + "fmtcount" + "lastpage" + "latexmk" + "listings" + "lua-alt-getopt" + "lualatex-math" + "mathtools" + "ntheorem" + "tex-gyre" + "tocvsec2" + "transparent" + "undolabl" + "unicode-math" + "xits" + "xstring" + ]; + sha512.run = "da3b02cc3558a337d7d35018fad00faf6d9183f3f4bc5b5b31e168a11dcfa705a77cad6c42f3fe3d98ce67f50d94ca1f75a82999d5a27837ea8fba6c01602594"; + sha512.doc = "04f1ccf2bef9e11364d7f066ed1a7fc218e39ef7a08824eb65537d88ed03097399eb01d07ba6d0a34e7456fc6de1291ea4f1c9264074eecd2e1af341c42e9197"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.3.3"; +}; +shuffle = { + revision = 15878; + shortdesc = "A symbol for the shuffle product"; + stripPrefix = 0; + sha512.run = "62b456ae961d34908fc25cc085bfa04d39e70f2641d65dc8e0eda419ec96a328798cc258162ebe065285f3ee1088e6076525ccbd8c0f7c0800024f371bdee65d"; + sha512.doc = "1b6427fa0cf98651a219f1cf6f15a400c09ea924bf0dcea7d48ce0665a5f1828ad64513f87089ea48d02d489d8020c90c661bac60c069601be437c77364813d4"; + sha512.source = "250729a95e91eef9c1f9b5364aa3b0a1f03a75805845c773f82b26c3782764d6f866f33391aed2f0cbb167d016b06593c015e6fb2aa9b7ababf33f215fb92647"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +sidecap = { + revision = 65618; + shortdesc = "Typeset captions sideways"; + stripPrefix = 0; + sha512.run = "3133ceaf7db89d57e7dbdabc016491795b2dd67ecd614fc4125f41dfd08ba0a03371c446d1fd7e22d1c491ac3ba6ced2856c6c3c9497304f4c041c21c0c7f558"; + sha512.doc = "2ecf3e41c8840ab87b49f771d590f8ba0d05d205bd435571dd71f2ad1d1aa727f7151b9bd913c4d33ec16ccb5cbf513bb170e59e600bf64b7c69a08273580eef"; + sha512.source = "e961f8965d2f28da04a8c5369370ae6d07e54c1091ec28da87639c6ca737f028010b85d93943fa84a0472f6f42d52d0254fa3e916acada22358e06c420a60d57"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7a"; +}; +sidenotes = { + revision = 54524; + shortdesc = "Typeset notes containing rich content, in the margin"; + stripPrefix = 0; + sha512.run = "6cf38305b919deca31761f1420c18a0ffb5ba18e045515af058e9b7d73535730117f757f16a8030d97247378efa46428ed9f28757524b650a96133aae6fe4e11"; + sha512.doc = "db5f8666987eeb2c8e29426a91bc731f8c380176b3f0285c4c4ca8554b91c85af52d0ebe16d57cdb558d8c7d1e97c6f169addb12a57a107c00ff36486dd2d218"; + sha512.source = "6d237c8df983f2a3d056038067039c45604086a377cdf02b9adc0e1c125619ff911165891d27be7e30466d3cda03f62c32bc7edc73152460d21443a5cc6886f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00a"; +}; +sidenotesplus = { + revision = 69176; + shortdesc = "Place referenced notes, alerts, figures and tables into the document margin"; + stripPrefix = 0; + sha512.run = "d7d7be2971798a869308564095617484713471f4b1e46b5729f40871eaa3216285cb063d19a7d85a6db3f4b492c4af290c3c6d392d7a7fb78b4e7761255c0a83"; + sha512.doc = "d712e51374969ab345d8f641e4ee860bbd72e5f4aa759b0b00cb538c768f9e790265074003715252f8e6c8a6ca56a5513b0f4c2dc0c3d55214aa80a994ff5c08"; + sha512.source = "c87cbc1558e5985583116a4d587aba0a7f7f6a8e7103bbd5d2c146d250fbea2c5449515787080c49ed949a28071f49036bbc4fd343d4e8d063d5ddf50e42986e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +sides = { + revision = 15878; + shortdesc = "A LaTeX class for typesetting stage plays"; + stripPrefix = 0; + sha512.run = "739e26e0c0b77d75e91f2a3a18996aa55ee1163a2bee6d489db4ba3b0864b51572c55ec53441946f16cb87694425d09e613abd2223fba2941fea4be137341b10"; + sha512.doc = "653a8472a278bb1d33d9f86559398b62e32b521c6ce8dd977dbbc4f44183e37b95378ea4b29356948735c42925f9ed25153cc6a9009341ff01d80befe2bcddb3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +signchart = { + revision = 39707; + shortdesc = "Create beautifully typeset sign charts"; + stripPrefix = 0; + sha512.run = "d379bb1a9fecc06f4e48419d0f4f49e50b6b276e15e64992ee7e154154eefc24e71c060066de3bf9e97da6c8e62b78208f3a01918150cd2ef51231b5abaee44e"; + sha512.doc = "7b140f890f3342ba6b2d25385dcae6925d8e445a862af703578f455b73c69cb71f4b9b5a933ac8b1a16178874f71c80d124c352b5aff4d7bf3dad6f1aa5a3874"; + sha512.source = "c2f141c1e0a279d5a76cddf97d5dcf24e35cb219d0a0114d5d2f91a6b24bde3b900b168225cc6afa4c623c9011bd373388799a0448ff588ffefadf7109a24af6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +silence = { + revision = 27028; + shortdesc = "Selective filtering of error messages and warnings"; + stripPrefix = 0; + sha512.run = "95f4f095e0f70dcd11482be4f6d52c5ea7a06ad820c08386ad956b9bb9ad593410e59fe9bb5904c3242594d466c495e7793718d4cb707ed3edd1d17ac3c1c1a8"; + sha512.doc = "988df943eaf9337145d081de38ac22389bbffd3e94408b1cbb5de7605cccb47e2fa837813d4647c339d978b5b9b3e82e6d9859b840e89c09c95dd9572db0601b"; + sha512.source = "7a628ca9efcc34863f064783a1e65e7bfee2a735a2457413d5b938e50b823fdfc6137f56041885e2c4910119ac756a5d6eecff91d9e99eb2bb85d2cd73f273b3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5b"; +}; +sillypage = { + revision = 66349; + shortdesc = "John Cleese's Silly Walk as page numbering style"; + stripPrefix = 0; + sha512.run = "5ca2f89c924dadaa727aee6b6bf5b0a3c06fe1d841ec37cf1a6fbb7d3516cfe8f4e2823ad8f9acbdd85a333e3736985d139e44b907d3bcf793340d49a164405a"; + sha512.doc = "fd4ed28957de74aac2f90d2aa37e5014f423738f783f837fdea9c28db0d4b9ebc65c8017fbcb596f86610f712dcd38864356838c1e8da123c2eda1be4932b936"; + sha512.source = "460ed2ec718e74921711b29010138f5e6e544da8e91631b32144f3ee0ad377b815a3d974fdfea47ab231dbdf17d4894e6a73ea78b00ee03e8934219858ce43ee"; + hasRunfiles = true; + license = [ "cc-by-sa-40" "lppl13c" ]; + version = "1.6"; +}; +sim-os-menus = { + revision = 68843; + shortdesc = "Insert 'terminal' or 'context menu' or 'viewers' like in an OS"; + stripPrefix = 0; + sha512.run = "565fce3e9e13d14f7f52d3390e407b03ec680b21cef37e68439095d9e7cc813739853c9e3307dae040dcf60c6a6dc4934b0d8bac68b258af4c14aa22d8d9aadf"; + sha512.doc = "b2392fac63c75de85b89ca7037f495155cb749b17220cdc3fb2aca368bdbd593039425bf21a0341a4160935fba94d0a9bf5fcfa6c7d686178a715aab44a28ae5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +simple-resume-cv = { + revision = 43057; + shortdesc = "Template for a simple resume or curriculum vitae (CV), in XeLaTeX"; + stripPrefix = 0; + sha512.run = "996341ce711f6f9a68ccd7e0b315da98eed8f4737d44b8dbd9881c2a76c8ef2d04b1c956333b0e33997d57e0b62bcb2485029283bb4f4711c2f8e38c177755d7"; + sha512.doc = "a380b2a498bde69cef1ba2401e16886d35edb40e3338963bcbd6e862da3e54f547e7900a18f668515b3ff178462a4ea0d41bc228b6b6e7ea8b0693e295231e92"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +simple-thesis-dissertation = { + revision = 43058; + shortdesc = "Template for a simple thesis or dissertation (Ph.D. or master's degree) or technical report, in XeLaTeX"; + stripPrefix = 0; + sha512.run = "201826e649acbc8dde933da3d141408ef3e4f3bc5daffbd520a19885af612f17de2618fe7e8c78a419b6e5e4eeeaa36a2fcb3db6f610df2189e01e0b4a66e9e3"; + sha512.doc = "8dd82147b1096f728fd52a56c39309d0f421abdd972a1297b88b516e0a5ecf8387a3accc508047bcd3996ab81d778dbdd221934e2bb4c96e1ef2a59cd0fc6995"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +simplebnf = { + revision = 68959; + shortdesc = "A simple package to format Backus-Naur form (BNF)"; + stripPrefix = 0; + sha512.run = "87c6838d1a31f3a617752f428fdca3ccb7af22daace3caff307760f24fcf3092cff324db6357174599985bfbbba6a8c0f31a498481da3a7790ac653043c0683e"; + sha512.doc = "bfb6dcf8e843a42b5e7481e3ace572f55561418886cb0ed562fadd79a72eaac6c505b9a52ba37f0e3c2bfec7723a7334e81ab2dd6dbddca47ec2339f8a9b64cc"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.0"; +}; +simplecd = { + revision = 29260; + shortdesc = "Simple CD, DVD covers for printing"; + stripPrefix = 0; + sha512.run = "5fe4024ce7991242fd60b8a87c88605f68ef9595895857b56981b35dabe96c97f9af684fc5ca9c3089ba96791e076512ccd549ce70071d215eaed4e731145b30"; + sha512.doc = "5cd208f8869dc989542bf028c216fbddec5bfb285ffc18c25cfea928035946e903cc2b61de630125d8e8deea772f7f20cab552505538eaa5d3aecaef8192abec"; + sha512.source = "9b26b5fb78bfeb1115af219615c7bcf2ee85c5878ff18807444642e103abccda517c3d701bdfd655f5f9e3d1dc0374c316db96d5d7b0ab9addad74b8d7ecb5f3"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.4"; +}; +simplecv = { + revision = 35537; + shortdesc = "A simple class for writing curricula vitae"; + stripPrefix = 0; + sha512.run = "c67e9200925ac86386efaab35a8edbf20f0fda700c00c3b0350eadbe62f39fc02f502493a73acc768a4727ad1162561d7baf38193d57d1fefb4c8083ebe38c35"; + sha512.doc = "dbf087e0659f11b4dc0cf40a6826cc45f48b8155d9148262877a0d51f5766888780698d792f055666766f029ac6f5384b41c0fc41e1c84548582e665eccc0f20"; + sha512.source = "cc8f96dbb9c99cf9567171e65276d18bc8faf4fa9980ca1fb60fb5fe1ab250d462c22af29105501d72ac7ff0421104be78f097bf6afe8b88dfe48932ac19fd70"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6a"; +}; +simpleicons = { + revision = 70519; + shortdesc = "Simple Icons for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map simpleicons.map" + ]; + sha512.run = "336d8cc4f3a20bb6b9f7f956dc09dcb3184a333b0e82f9b72ebfdc7f73c757fa53a48ce0bc31a1b397c42bda9826944e3004d881ee1d6dac4f3430919b4cb9cd"; + sha512.doc = "93e23215d137d04ed4086269aa79dc8f81b70147f5115edbdf7e43865b20bb241275eda4b519db5d9a3857f36d956707d936156c002c155333d72b1f60edbed5"; + hasRunfiles = true; + license = [ "cc-by-10" ]; + version = "11.7.0"; +}; +simpleinvoice = { + revision = 45673; + shortdesc = "Easy typesetting of invoices"; + stripPrefix = 0; + sha512.run = "8d3d905dd9dc418503bde7cd51c90ff6fc6f688502ff871040f9eb6bf96b6c1ef999d3dd98b16c8739ce9518a22a8e99a23b5cc66c437504b3837c30ea19cca1"; + sha512.doc = "81e5ff2bf76f2b35549feb9b6336bd04b9273d4e6b951ee327101d4e5a5d3c429276735238b63c3b2ee03466b477ca2d7990a68615c1d0eee4f12a37d6b65472"; + hasRunfiles = true; + license = [ "gpl3Only" ]; +}; +simplekv = { + revision = 68439; + shortdesc = "A simple key/value system for TeX and LaTeX"; + stripPrefix = 0; + sha512.run = "16b0136de5c1c97ff19beca9f9488768adae2ce7107310aead9f9da82230e9d9cbec62badeacf66175fbaa181d691558dc4203e848b979dcbc23f8cf9bb8e669"; + sha512.doc = "586321e8c1597582d3be117e74ef97bfb0be59a75aae1d5bdc87b2a481b80cac350958ca77aec34148d5e54cd22a0b0b11306f445cd5abe5f1868ecb357862a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2c"; +}; +simplenodes = { + revision = 62888; + shortdesc = "Simple nodes in four colors written in TikZ for LaTeX"; + stripPrefix = 0; + sha512.run = "e92bb0c87e0c490702201fe8328f065d4307f4adfbc06a2e9dd74ee698434274ddbc065a600c5c0a36bca0c55b9cdcd7e3bd469af276585c09ba7d918b711e51"; + sha512.doc = "df7900304a63225b51ceebb02d387f172cc415c09a65209cc850485668f893e4effb3befe424164dc291e283f80054eb6ae18785024278e93739e9d98562eb21"; + hasRunfiles = true; + license = [ "mit" ]; +}; +simpleoptics = { + revision = 62977; + shortdesc = "Drawing lenses and mirrors for optical diagrams"; + stripPrefix = 0; + sha512.run = "2b53c2ccab2dbece85653ac4d40802a41c7dc9aabbb16022f08e351e77e7bd464e47a54005889707de15041a5f3565f40c97355dc3953249a951dd984311121b"; + sha512.doc = "36aa19521be45853d96c9a0406afa60a934ff5a701993fb33d2c4070e3e99822097b9daf100e9364f80a0779158a81f5acd6904f5050dc190fe22eb4ed65deca"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.1"; +}; +simpler-wick = { + revision = 39074; + shortdesc = "Simpler Wick contractions"; + stripPrefix = 0; + sha512.run = "2bead248c2380e19fb19012ba2cf7a41fdd113f48a372011c27ebac0820236500c5e49e5235e2c52fcc5a0f9c79f61cbf76a5d6de86322bc40382f5499216783"; + sha512.doc = "d8a45e06707d3e6c39e36d83020f0a2d4654cab508d91e47022320e67454d08958cfd6d3872c5ae40539f29b03080915e136746452afb9f2e74fe8be2ec20bc1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +simples-matrices = { + revision = 63802; + shortdesc = "Define matrices by given list of values"; + stripPrefix = 0; + sha512.run = "859e5e8c221deb1a40f08a0cc2ac6949cbb055791ae5435f97675aff4bb1e97caa2fa8c49b5735d31ee7b11ae8638af839affdd795d052d022890b267131dc75"; + sha512.doc = "8350ce5c4b504f955e7e2b214dfc7938e010ae440b0e51389f2013b8c9229db362938743e8da08d7fafaf1be67d29231d7fe6f92507399b838c65ce3890ec29e"; + sha512.source = "f88a1b06657e40cae2c505f56e35c8696f4f4d962376b5f8886965066fe21a4bc36edb7f467c29cfcd511b5564643699a54179b44f5187f1c193690485598a15"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +simplewick = { + revision = 15878; + shortdesc = "Simple Wick contractions"; + stripPrefix = 0; + sha512.run = "86aab23f8d19e9fa5a6251f8f725ada87b66a71a3024253d8b56f3edcc20f26695b2194b710f691ff9ed0713c993a8652447674ec84d4084c3354791244a6f10"; + sha512.doc = "bf0c3b8724ed8cc41635f45001fa04f655a7b37792c5b0e632578b066649c3bde1f894c3ab739ea2bb49f6e4f65e63fd7cd7d515ea15b53ab5894778a7918d13"; + sha512.source = "45d26e7044fe0928eb8e572f0333bee64c008c2e4d1536a0145939ce0f3392961e72bd7fc70c35b2607b2a241249d13e44e433b373b57898193185a808f128d4"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.2a"; +}; +simplified-latex = { + revision = 20620; + shortdesc = "A Simplified Introduction to LaTeX"; + stripPrefix = 0; + sha512.run = "31313aede3900675d183bfcff0045df5fa7719b982df1822823c15d645c7ef64c0b46e0f1690d98d30b2a6057e082684f23cb61a490fb2217887d0f20231ce73"; + sha512.doc = "f5bf92ed89cfc83f306cd4b2599446a11b73f73a0b82afbd0f441e26d837e6f436913bd2df18585c5e215fa0504bfee3d5d4f5ef4da8925161f85c70c14045e6"; + license = [ "lppl13c" ]; +}; +simplivre = { + revision = 70317; + shortdesc = "Write your books in a simple and clear way"; + stripPrefix = 0; + deps = [ + "minimalist" + ]; + sha512.run = "864101fbbd4d71ce75960255e0df965ff1dcaa7c323bcf34fe4893190c81877cb2b86d50559b20f8698ccf015cbcd111a3b6e052eb62cea28e9a5f62335d0121"; + sha512.doc = "890638ab256f56c1a964e89d990ba57288fe4ff2d8149065b1a6d24b056eca50751a932c5ac91a453bcffd1b909a7e8c277c3e240d525a97bee259d6a40bf91b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +simurgh = { + revision = 31719; + shortdesc = "Typeset Parsi in LuaLaTeX"; + stripPrefix = 0; + sha512.run = "11b77f831aff6796e41ccf2024496ae1c9d4b9b5f4c029daf33e0eb4b4fd3d1e5c78137b945e3c9fe7a16380365fb88165a46e614dc3078657ce025a55f90d44"; + sha512.doc = "30ddd7a9bbf3f568ad4876336228842651d8f95eb5f21df81ac524b99a7a695e68e0469f79867668dc3b9913cf223b72a22f6a0d0c818233c081ba90ac67de1a"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.01b"; +}; +sistyle = { + revision = 59682; + shortdesc = "Package to typeset SI units, numbers and angles"; + stripPrefix = 0; + sha512.run = "0423402d3fea5dbbb60abf6c763bd037982479557b84b6ff38f795168234cd3dc6eb0708fb7b5e76abb1f68560a884e7d8b4e3a256d78b23aa81dba9b6e70d4d"; + sha512.doc = "94fea0a472ccd43396921d957544ce6b0a1d6b9ca5ee63a01fb0f1fdd61e1cafeeca4c85366302117d852f20798c51b76966097bee3c2d7f6509e339720b744f"; + sha512.source = "bda83997fcdebffe1792ecf0678cb8065ec0f4dc37b2662fb515c8f314884799650a38efafea97e4103cc915d421b9cbc60ef9c4c81bc34a6b083548ebbf691c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3a"; +}; +sitem = { + revision = 22136; + shortdesc = "Save the optional argument of \item"; + stripPrefix = 0; + sha512.run = "64a34fcf0769ed4ab4b201facc056b890a89009e1847e9ca65fb405e1c1144225e8fff59c1a906341521bba5d39e3338900a9a35aff5bb716a5aff5e6aa4d49a"; + sha512.doc = "af74d7b4f4dfce45e543494344fa32f4f4d55435034cc1b23b24b333f89d54d0b8c9d0a1247561bb7182d3841fb04b7b3531be847a6fed3db212497ef2ccec3c"; + sha512.source = "9aa058eac9367ea31804b5c2983873f16d1c74f598fb0967f43257a963a38aeb7d578ddd596dbee87d942d87ece9188c6fe0f5e8734751325121195d9d348769"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +siunits = { + revision = 59702; + shortdesc = "International System of Units"; + stripPrefix = 0; + sha512.run = "01b2b83edba4482a6d0434efd4590b3b0fbbb596da6075632a215d60a16cc48d66f0f47d3ca61a0e73290e933952cac15fa2048f6ac12112dc603956f123f5b2"; + sha512.doc = "d6c34f20671b68a1ffdf47b32e037d7660b660fb8a8e3768083ee7e33b08e7c313eb5f2c585657dcfa258f85574bf6b13a86ef81e49c2ed1b407e4dfc8dc5d04"; + sha512.source = "8cd5d556cc4c6abc503b9882a7c2ff19052a9004d703b37383d6a6c6ec671ea434b03f6f1df362aef2fec06dfeefb7b231072c975eb946262b71b15131f38daa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.36"; +}; +siunitx = { + revision = 69922; + shortdesc = "A comprehensive (SI) units package"; + stripPrefix = 0; + deps = [ + "l3kernel" + "l3packages" + ]; + sha512.run = "df5ab6600630dbb86b496aeb3c048137a950ba0ff56275ed4fc37a8eab517f45e53cf5aacb69e21bad7799b15dc0e8d6c2f827b2a3e41abc972119174d2f2352"; + sha512.doc = "e0801e342de9483cb5a8cc24b63002c9cd01d2e38ab6945eb91b635ece0833cc1a1c6c12398a9e00eb6ffa284e11329ed53e7f5a708432d7ae1c361ce5390821"; + sha512.source = "6df46783a825446b651644bae7c5d5ad7c0abd970153de9b360376b30a1d61adef46ca3a9887689fc1fbba3427a3d634a3bfb499b3d933bc6670e02cc396c170"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.3.12"; +}; +sjtutex = { + revision = 69967; + shortdesc = "LaTeX classes for Shanghai Jiao Tong University"; + stripPrefix = 0; + sha512.run = "b9c366d594492e128f183bd1805626fc9cd7a226cfb2e8839047a7299027515213b279aaa46e51d3828997685625e5111d8da71b4f80e8063887612891594cc4"; + sha512.doc = "b996ff331e0522e6b95cdc17f289f50974d62983976611b428bb49ef170e12a94784f96774e99e6488c88749fd78cf304ed7bd041970e14a65c40531b4f71f73"; + sha512.source = "7a6fe3891a069b3f2bb9808a337b0812eb28b99f6502e0da539ec573b29892a63029f43e7aefb3e5d660e69ae8f26d6b4239cd34900776c1bb1cf49d3e420a26"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +skak = { + revision = 61719; + shortdesc = "Fonts and macros for typesetting chess games"; + stripPrefix = 0; + sha512.run = "df1a6adea32b01c8ad8ad7509c68e025ad2e1005d9aaf26cc35c67f82d21f510d1e414831f5df0a2f0703e295fb4c187d359ef7dbfe8afd76a8ce75a90f3b4bb"; + sha512.doc = "ffcb56dfae0a0ea91e716b99d1d91d4f20fedab8eb7b637f62630dbc4a8fad0562120cc02a754df475dc16c4b1a09fb2da48b8a9e22112d0c69550016026f76f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.3"; +}; +skaknew = { + revision = 20031; + shortdesc = "The skak chess fonts redone in Adobe Type 1"; + stripPrefix = 0; + fontMaps = [ + "Map SkakNew.map" + ]; + sha512.run = "879107f0bb96441082ccc4afb560e4fd0f625e7fb7cab84ebbd642af1ef180bc27540eb9ff26c689039dd6abb11e9b88bcea30d5b1e75b40f0e3499c981ae6e2"; + sha512.doc = "8c26115910f2e9a9ae28e1b6c0933db3308c9f59eb151bb37b23de3f0f790b9726aef895def0826e00928b75753d925c5c9db0a6b91ebf7035fad5a4e473a315"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +skb = { + revision = 22781; + shortdesc = "Tools for a repository of long-living documents"; + stripPrefix = 0; + sha512.run = "5c2e0e7310898e258505cf438ad91650fbcef6b720e9d05b9ddd241ceca3eea0ccc3a71b6ac38acee58d8e205b8352ad7abbdc277596ac74f6a5cf0ca805a0d7"; + sha512.doc = "29aa9629f84a481cee1871b92b49e1a34683092759864f1e612ef4f7b3862a9ddf567b2d20fae3f99d5946de43055de2dae8ad326000e344383c854eb9ff4f20"; + sha512.source = "fd0f3a1d4cf3fa189ef0fc8bbbb35586a39aabbc733fba3aa9d3fc48d920c416316a4a19d88583ea42b1a4c38baf4ec75cf0eec78b68a5434f3ac4578d56ea9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.52"; +}; +skdoc = { + revision = 56950; + shortdesc = "Documentation and extraction for packages and document classes"; + stripPrefix = 0; + sha512.run = "d00944f58e9842c0d1841b73fb1936dc14655f07d51c60140581d597a93a0e9ce9fe65941cc343979e549620edec6a8339cca6089df068d932e1344556c3449c"; + sha512.doc = "481e590c14396f3318999524157f8e5a8dafd0b6f553414d3ee09cb0dec6d356c2b422b6598b613ec4d29b35f27a59024dc9e5bcb49ea2643205f37c616788d6"; + sha512.source = "70343ccef329a3dce81aca0c0253b42450e7eae4560b58d69d9f12d7ef32d25023d5f09208f22f7d65414a089d2992c28079dfb708ab701803cb42fe41480691"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5d"; +}; +skeldoc = { + revision = 57922; + shortdesc = "Placeholders for unfinished documents"; + stripPrefix = 0; + sha512.run = "2bc1374e969e5b32e9a88b8240a94eac90066514c8dfcb91196a13a3774d200cb8a412fd490b581ba18e9e0047596d30296206b0607316554a361b6103ee33f3"; + sha512.doc = "13cb76835ff1eed119d8514aae495d6adaf8b4c3db17c660af29624247cba9c37d4f6991d6a99c566972e4032f14d62c21fb4f31b856c49de40d0a87def1cf95"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1.2"; +}; +skeycommand = { + revision = 24652; + shortdesc = "Create commands using parameters and keyval in parallel"; + stripPrefix = 0; + sha512.run = "0aabcf0a47ffbdaa2f88bfb970f844df36cfa30f2e5ff02cbd9dba2179fd871c2ae1f979a99e70f3f7f2ab2589b7ecbaa6f999352559100bfaefcbe7f6ec16a8"; + sha512.doc = "26f7e544e9b1b75fe7131d409c3083c39914424c66051e46535de5415383d82e48a3e2c1d35e34e5bac624a034f2e14623c8cd5b6844707b09fd531daaf7c544"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +skeyval = { + revision = 30560; + shortdesc = "Key-value parsing combining features of xkeyval and pgfkeys"; + stripPrefix = 0; + sha512.run = "151a705f5e62dc80e8a470a7ce39cf197933452a35b296e70790d7ec0f6667f24acbc0c643db6c402ca1e9b9735f34be388efca5a5e5951725e8f00bb8d2833f"; + sha512.doc = "97bf20706cd14e0b479221c6ed96e56754aca13d7b72f1d7bedec6117d159caca2a4e9a931d3d8311f593a538985d8e4e5bb9d5a76a653d72aa8d094a66e9e92"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +skills = { + revision = 56734; + shortdesc = "Create proficiency tests"; + stripPrefix = 0; + sha512.run = "0719d385343a79a261409a07d659c0fba4f861e69b082278b1442a12408bc3601de789575fdf566ce280a2699dc10b28aada80d490396498fa9a6bbc8d064eb9"; + sha512.doc = "9b2339a50fbc759d9e5bc907a4d8dca2f06293d5a5f38602213a859dfc34da1715105b2b5a46e82a23f71b741e4db713b0044f345767a1f87c32526b57fb0103"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +skmath = { + revision = 52411; + shortdesc = "Extensions to the maths command repertoir"; + stripPrefix = 0; + sha512.run = "6cbc67d9a6fb9cb6a3d8da38ff83bbb6dbd28c5e3e81a07a1b7292472d9064f321206ebd4ac1917d80f138f9b9cf91c008b8e3eac27ef0a77ff2073cab08eab1"; + sha512.doc = "ce579b82a84f81169bf1a6cc37fff0c2e7c4e1570d0cbe2eb143dc8ac6dc082fa3cdaecae5a31791aa590c89fb74a58a4451811ec66d38eaa146520ff16e7471"; + sha512.source = "d5101fecf8963f78b9e202c9d537723dbea069558cb764fc66344862cbcedfd81ecd3d923ee2f8b1167a65f8325e2f1fd66f16089a92ab419a580ca7313fa484"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5a"; +}; +skrapport = { + revision = 52412; + shortdesc = "'Simple' class for reports, etc."; + stripPrefix = 0; + sha512.run = "60ee0f76dbf9e1539c08a97cf25cf14d2fbf02527facc3764c57cf0812a67d740d5c3148a4a7e76a6880717166c935b34bcf38de0b4f7d02df9c1ab50046a2ed"; + sha512.doc = "986bb0ce679b69bd9a0958b6d4d1a3fac49ac6a5e31bafa5d556ac28c2bc3d0d8c892e998791e74172ec86c5899acba2cbd193dfc685e7dcb0b5d47b4c2e3576"; + sha512.source = "b2f63eda57ec7ecbac63c6f0b2dcc2175bde5618db88cd6270a27466178c39209418a94470d6f78b8ea22c5e6ce8d3dfc178f52cba943f9ccc98fea447ade818"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.12k"; +}; +skull = { + revision = 51907; + shortdesc = "A font to draw a skull"; + stripPrefix = 0; + sha512.run = "261ba31f30fa26e25f82dfe60ff7600c71db51f1dee68a5c094fa8a746995ee9031e41c0f24a4e83aec52c603cbea71a0773cae63481f167b81abdfb0ac3f782"; + sha512.source = "3967550eb9af93aaa3fb9c623437e2c6ceb90f52f20533832aae3be91c719a774e3fe6a51f4d1543d6547479a2efa6c1965f0870174cfcd5c93cef0c20aecddc"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.1"; +}; +slantsc = { + revision = 25007; + shortdesc = "Access different-shaped small-caps fonts"; + stripPrefix = 0; + sha512.run = "45d92cb8f2a5aeaecc9945ce2778f2fa330b703ea0efb2deb4407ac17d30ad3a3e1ae7966474af28a7816dee18254422fe7c72c50f11f47cd52a54522f05fec3"; + sha512.doc = "8f856a45e3088d2047157bc87d60a16b6c6e481334f4ee81a23e4cb8ecf53d1113849877ffb24ee4516dfba228c10c9974b0b0a148020d64e3069ed7a2d12750"; + sha512.source = "7e2af37c07b8ccae052c84ade3ad49fb4d93fb5fd97a5387b1ea8af523167f21d48e3961df58c7a93dfbd07f09ed1140839e48a57b3149dfa713e5945081f200"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.11"; +}; +slideshow = { + revision = 15878; + shortdesc = "Generate slideshow with MetaPost"; + stripPrefix = 0; + sha512.run = "f7bd44c9720512297f15ff6cee1c49ca52c29fc206f739e6aa447e778fed00a64e282aeab9d42b215cac69a64ab39f3919433bd0640d30d55ac540e2dde07967"; + sha512.doc = "d271c1f9e7b9c45694463982da8c9542fea326d7e191a705e92f5b423e054c3f926768d2209844ddabbe75eb610d4a5cb05ffd53098cdca9e35328c865027eff"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +smalltableof = { + revision = 20333; + shortdesc = "Create listoffigures etc. in a single chapter"; + stripPrefix = 0; + sha512.run = "50a4878bddc55e1b05ede3e770aad31f6c56b81f9e6d0a536ece25729e3c5a9a1720068534f26a9c224c101f0e0d833478f1a5c3b12759d7c3ffce027bbd5edd"; + sha512.doc = "ca62aa29f6ad62f149dd9c5077ee2b14ed69d8a750f33d3de274ae275e5d1528482e58140a78b0917cf02a879206194e24a6beecd33060544abb50dd6fc564a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +smart-eqn = { + revision = 61719; + shortdesc = "Automatic math symbol styling for LaTeX documents"; + stripPrefix = 0; + sha512.run = "03f69303ec66b59a7425e06a4e8941a5c93414514b5f80cbc138a75a5619791dfa3ff2f1435ddbfbe7fe5af298a1af5325f279f36d924e97a5074ef930b42997"; + sha512.doc = "85eb6e8ccbea66cb6e30f862491adc02316af9071753459eb56e8f19011e9ab7865f87868ed348e5b0f6192b2305dffe5272d885486b881e2d286ceb211c77dd"; + sha512.source = "f7bd8c3b2e616a739b0d5ad459e1041c492b1e00cb9258b55ce4631465e510e71c166a3f6a94b8244a7e1b4bf098ede5c9379a7a5a6baa90eb28026e9be0bad3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +smartdiagram = { + revision = 42781; + shortdesc = "Generate diagrams from lists"; + stripPrefix = 0; + sha512.run = "322589506d1cdaa30dd9f97b419347fba0d617a3ad35fd15fe91611b10382c595598ce1111a287f5b1aef617595cba77b53490da7744b23942f072f522a68ef1"; + sha512.doc = "1cc7abaed3dcdb11fca675bea8e458f1879bda4ac72278566a9247ec2cb0016f10467e3120e9ef688c5674af05559bff39862d4b3292596f0dafd5e13672a14f"; + sha512.source = "a1141f82e32b444951bac9fa0fd119e59cc2389577cd05cc19702582c64972602215648e727ccb338565edafb0116f6c50a033d9c3ce8664e97f392148f888d1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3b"; +}; +smartref = { + revision = 20311; + shortdesc = "Extend LaTeX's \ref capability"; + stripPrefix = 0; + sha512.run = "149dd95ca0677a4e273df64a589d1424b8dd89983adf3a3ef81f8236d1b594d35b851b4255fd9f0d05b4feb82db59d816408e3ca59f2b86b73a5724a8e937367"; + sha512.doc = "07eaecd9e924e5912e8e3a3ba6479412282e1408cbb59699b9e83006768c4042b173d38da2e8dd2c707b392cb48d99e4be25985023db4de80d69450fe95a338b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +smartunits = { + revision = 39592; + shortdesc = "Converting between common metric and Imperial units"; + stripPrefix = 0; + sha512.run = "d4c23a39d79cb5c0ba700da40b916ac6072e612d0e5b8ea1c189100cfe56fe77c9d1ff742d92fc44450255048d96f2e1dc2b5f0e098e56aad5efcdd423fec608"; + sha512.doc = "e85b83a090b3e352a0faa61ee0f3dfc84d3f2fad8f1ef503aef7bf571e706575b19c1da394b09e69968b10fff2542b5b749a895eb17e84ce1293273532d2e241"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +smflatex = { + revision = 58910; + shortdesc = "Classes for Societe mathematique de France publications"; + stripPrefix = 0; + sha512.run = "3723047537c97c42f23eaf15dd95941092300a86a5072cf261c2d9a4fdc09d17e3c09cefc6a1f632996b45300cfc5e3266dba4130decf4f6d33063b0b7f45d0f"; + sha512.doc = "a0ead1f76c26126c3cf00bd735ae8002648ac874511de92a73b756197328af3d81d66697c0fb3d210047570dd267b5c975b26a7c6e42b0fa61b9b77a29bbf113"; + sha512.source = "99a45d290c450301108b032830b02c81d3487ebb281f19f17826df8ed267dada23b5bb039874f97de29850c1d33bb775097d53d7e4d8d4373de9143219aa57aa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +snapshot = { + revision = 56735; + shortdesc = "List the external dependencies of a LaTeX document"; + stripPrefix = 0; + sha512.run = "2b9bba924070f81319758c4b8a8e85533ff5099e901598248d5a645aba249e7158587e7d90072d3e8fa4d544d09f800b94aa415117683a8bb8c6d7ff642c313d"; + sha512.doc = "b1dda7b3fa9195e5d0e425a4b7facc75f8737446b65b29cd5f3c954dad348055c8544968b3c68f9b2256e8d827ae73b54b765d23b958abc383bef072d9eacfe7"; + sha512.source = "ae57330c3c69e82c638e07ca7d2d011838a85ae79f3f16fcb8909076f375da51f2b1d3487aadf55cf93306c035099397fa826a7bd9654e6756cde66d2138b15b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +snaptodo = { + revision = 61155; + shortdesc = "A todo that snaps to the closer side"; + stripPrefix = 0; + sha512.run = "10d9e3d154a3713c1f494ae626c61a1275b902892ad7cb34f41c65a36335a7ea21bc9d7d77d00845c2e5f270edc91d1be5bfdfa34189a2ac6bd88ab83e78212b"; + sha512.doc = "ed3df0276b44e2539b9b8cd0b5f6b46f86b18723d0913ed29fba45e30a132b53f8e0206add2d31bc152c78f319b8f7671ea000a1f344dc7f7d80ad9de32cd66b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +snotez = { + revision = 61992; + shortdesc = "Typeset notes, in the margin"; + stripPrefix = 0; + sha512.run = "8e827171eb8ae6281d0be97bddd251db57349f935ac6309eace72396be37c33e8bd79d792701f56a5e338eccfae452411de520bdab5f5747e6fb741e5215c1bd"; + sha512.doc = "230cd4f3f8922fe520c7b476f8f7b31e3965029e72e58828107e5f7c761b87a64f5c5df9faadb610277d45ff95052878c070e690932759850da34fd82fb028d0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +songbook = { + revision = 18136; + shortdesc = "Package for typesetting song lyrics and chord books"; + stripPrefix = 0; + sha512.run = "06f81b35318ee9844565f622b5ecfb0f323373f14acfed3fdd042a244537c313fcc974c8cc556011baed16c5a7f90b8163342d36e360749db240e6eb639351b0"; + sha512.doc = "a8d98e2d3b90ebfc4e8df53ebaf92f2d0deb95034bf234dfeaef1d38213af9a36e38d48599e6e78a7e87fb966de87db821f4de7a6fd50f57c1afb515050bb510"; + sha512.source = "57fed8f034e860787cd72b2acece0a491832acc526964c75060258db6bd46d77a551b967af41bfeae47d83ab97e4d6c2799c0f4ade405a43812126acc1b3d390"; + hasRunfiles = true; + license = [ "lgpl21" ]; + version = "4.5"; +}; +songproj = { + revision = 66704; + shortdesc = "Generate Beamer slideshows with song lyrics"; + stripPrefix = 0; + sha512.run = "7c6341931e78dd362cd67062518f7f6d1725c239f20f65a7e345fed03787381af08b18102f671be4913ed53aeeb669f3744330d2eb2681878939a813ade2f1ad"; + sha512.doc = "1d219f70c51484b321b6c3b8fb63a81aaa311cecf5abdba6b5cc2662d528ce5fe78a400d81dd3dbfa0e3616a65bf124e3eb78ae94e57e1a87dbce83ba32b3b64"; + sha512.source = "ff8238a64adefe5fb2e2ff8b7541fce489c0759dbbfb5fa517458e404e6a7184b77782cc9ce30f2063a958e212b1d133c7c4a3b82518e7347b2cfdb930bd6cfa"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.2.0"; +}; +songs = { + revision = 51494; + shortdesc = "Produce song books for church or fellowship"; + stripPrefix = 0; + sha512.run = "dd1309fda1a7bff1236707cb45047dd5adc582d3e3f509f211af7a30c0469cde704773af48fed379a29307201d9781150487821219f76d45d556f1d27e420c08"; + sha512.doc = "72c374aab68334b050a5d801299179c8484b6fa46db8c8e20b9fceef3cb9a8c0c1dc51de93f34115d4e34767233179c5872054cd03ea3e622abb63a49ad81f24"; + sha512.source = "016d389033589ab9334180edf70321858ba3b6000d8f560a18631e13ef28130f4b39aed81f7ddf0a178540a463789955d14620b37b7979ac0ea6abeec77d29bd"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "3.1"; +}; +sort-by-letters = { + revision = 27128; + shortdesc = "Bibliography styles for alphabetic sorting"; + stripPrefix = 0; + sha512.run = "41e7db4a4c5242493aeb099ca103f4540e038b1e91ec0296629f4dab1ad013f98b26b664c7d661dd2f53c1e5c749509763c46f51bb823225a104c125a9f75f4d"; + sha512.doc = "e2b6c68a42b9364d44dfa06ea93d8c8ea2444d97a3cf3c111065b720d3706b36315a7c8650877f1d6a2a72c1aa42268af4f17fc4632032e1e3c0a2d0fa08e577"; + hasRunfiles = true; + license = [ "free" ]; +}; +soton = { + revision = 16215; + shortdesc = "University of Southampton-compliant slides"; + stripPrefix = 0; + sha512.run = "59e9e0bd127e44e1a80ff7dccf1fecb18b34a54c379a46632b13f82d80648229daa54c4655575c52ee718b02277c4e2b264451f8d3fe58abd60e593d0826c97b"; + sha512.doc = "de9b03e8626535d2633af3884e373d8b25fe6d203af75382cf329aeb7b79c745f94c6d08d49a69b42172f4bad3cab2048fadcc4ad826a1c1126425a40289ecdc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +soul = { + revision = 67365; + shortdesc = "Hyphenation for letterspacing, underlining, and more"; + stripPrefix = 0; + sha512.run = "233f1178521296d5cccc7db50c98425995b8708c97d750a5c24f698bd0de2e54ed5c57f9641f402bb8a42721e348355e6f7e9092b4056999b032d001c8203aba"; + sha512.doc = "c734b198050f5fda61e0477e7cadbb6f6f9257a0fa41babed664621d7b64c4971412d831b350879a5405976d4e35a11caa0519fb67f308bcd622f0c72f431b4e"; + sha512.source = "6a50fd644f99214a71f96994d52fdfd5f353a584ad73dca3b66829ee6094976eee8d4fec3f691149f634f27423ef5490bd4c1b781fb743bcf228e4b1e52e5d33"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +soulpos = { + revision = 60772; + shortdesc = "A fancy means of underlining"; + stripPrefix = 0; + deps = [ + "oberdiek" + "soul" + ]; + sha512.run = "2b4d2fcaa687ff7d229706e563f739356a450a8ef02180f3c98432b11d027cd097fa895c3c971a944329b8657c74b4d2cf566110919e511e6883706561332678"; + sha512.doc = "9577aa2c77e9cafea54eee0ee032acd7c1343d6eb66b76fc25d694b524630bd2f41043187671cd444c9cdd0ccc8b9064e6c71365492cbdbd46517a061efc87cc"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.2"; +}; +soup = { + revision = 50815; + shortdesc = "Generate alphabet soup puzzles"; + stripPrefix = 0; + sha512.run = "478c8cba8623b184db1c9237b7a805219bf1ffb7ef45280fecf7cd75a1720ca0ea2e1e1ad73465ee20dbc2bbaf14667d4707524edbc073dd4fbd0537dbeca8c2"; + sha512.doc = "318cb98167123bf8d9a5f80db8e31a31f6f61536e938da3b68efc0dfec6722bc898d8295d32896c24d2842b262f22f70e08014c07755b6728dbb2040f64aef5e"; + sha512.source = "41d74f1e6812f4b56b44e3a80abb398baf9eef5c6a361de98a1237fc6931952460450f3780f682d35bf9bc718d2902c9d82ce15994144b2a133dcda46b531774"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +sourcecodepro = { + revision = 54512; + shortdesc = "Use SourceCodePro with TeX(-alike) systems"; + stripPrefix = 0; + fontMaps = [ + "Map SourceCodePro.map" + ]; + sha512.run = "98ae07aa0c29c1c1cf2e181b1a5d68f85736b90b8f381bc9c1a2368cea2b8c62fb0c8007f5ce6b53b8e87195b8b0859c54bb2656cb7361119c29ed87d9259c62"; + sha512.doc = "e786d75bedbf5c5d155a69fda50e9fe6fe07914ca01aa10d7ab66800cd37a4bdfeb543ad34c9ca2eec53de226e68d7a1849a9a0510291d135001c5228f19e2e8"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.7"; +}; +sourcesanspro = { + revision = 54892; + shortdesc = "Use SourceSansPro with TeX(-alike) systems"; + stripPrefix = 0; + fontMaps = [ + "Map SourceSansPro.map" + ]; + sha512.run = "0511dcf736273d80f7143c9dad96dd9f631b016183b4078243ed061d35889fea62e50c5f48e9842ffae7b654fd2e08a21d1c46403e56349c0b515ff2eb62e164"; + sha512.doc = "174def8872588c27b8f90b3c384ee356aec43e4e42014bb1c02d648d8b309dfa8fb9cea03f65fa9bd86dc3ff1e64483f1312dbaca6e212f65d2d379a1d9935e3"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.8"; +}; +sourceserifpro = { + revision = 54512; + shortdesc = "Use SourceSerifPro with TeX(-alike) systems"; + stripPrefix = 0; + fontMaps = [ + "Map SourceSerifPro.map" + ]; + sha512.run = "5125dc5b72d960fefffcc4c8651f3d176c18c32d111440a16a0319f90b8dc973a4af0e20fc3b571578184e31749312c0c1f0ec3bba36b3715a3c59fc03768d65"; + sha512.doc = "c469f7beb0e99c8a9891c4222171525004c63e9feeaea9be57e663541ba4e2f259d2a3674f3029e4609fc08292d749f005f971bfcc542115d53e1845a02680f8"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.4"; +}; +spacekern = { + revision = 67604; + shortdesc = "Kerning between words and against space"; + stripPrefix = 0; + sha512.run = "005bf533b88e602779cb71c0ab7720492e5302f6c9321ef8d68cbcba8f4f9a0c7839c5408ff6c2a5f72c18c5bb5c8a7d41a5500aeecd29ba898c209c83dea6ea"; + sha512.doc = "8c24513b5f81d1f2df44a707a5e2ee6baf66af594507a545ff0c5e0fb90412b6c03831d73cb473dd32168a6f55f110fa699f941da0626aa0b3ce35bbbf1d9e26"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +spacingtricks = { + revision = 69048; + shortdesc = "Addressing various spacing issues"; + stripPrefix = 0; + sha512.run = "df9b7518565ee8f619aaedc82384497dfbad69911c66dd68f306010cee603ab307c3af89cc3f9901585de03e1796da3d8b96380e454ab0d3d24171187e39872a"; + sha512.doc = "76ebfa44b0f992db86452e5ca6bff7b4b5285e743de595f6963afca7eb0e80f287a1eb71b2f287edd33acbc7a9f24fe1876ac6f62d2812da2f1fd89c9650f814"; + sha512.source = "1f22a7811c34d834cae307a149fd993d87232c6e1ad6d9c22c79f005b6ba06a84daa5878caf189b44b8afd39a9ce41005973168b7198f04223becc2c0e90ff6a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +spalign = { + revision = 42225; + shortdesc = "Typeset matrices and arrays with spaces and semicolons as delimiters"; + stripPrefix = 0; + sha512.run = "6e00399e0940778a6ed8326abce14f15836bcb69f8e7c67d06cdf8567330ce0482a213c7b65c2662e0fddc47ce7b684a640e133017eca314b59eefc278eb6425"; + sha512.doc = "534f2c39076a6ff243a8e4cffe353a569b493b90fc1bdcc3db43229dda3955f013de15ce1db7beb38bc9b8d972c7430a24d64c263041c82e84c799f446faab0a"; + sha512.source = "3a12b34469bbefd61112b7338c8b5d440de46837632a695b52ae18e4f297d6ac0cde7ae71db7bb0a7bd3db0aeaa83e78f33a60e4dd496cf9c0ccda1a297b4ae9"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +spark-otf = { + revision = 62481; + shortdesc = "Support OpenType Spark fonts"; + stripPrefix = 0; + sha512.run = "787774aebfb3834f1477a8afc61d2f81c32fca5f69e5828b403b58a60c2047a5afb79d50f33be0376cee57fd30ee1c3af2a6428c08abc9a058e6a3b04b8fee0b"; + sha512.doc = "69fa7131b247a93b26fb98a8a4fc69b11fc8f9f05905948f530d78abebea76852baf4535768ea925839b0e3332fe9ac61e94ef7b10762afd61024bfa934f243d"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.05a"; +}; +sparklines = { + revision = 42821; + shortdesc = "Drawing sparklines: intense, simple, wordlike graphics"; + stripPrefix = 0; + sha512.run = "5dc74f46a819a6539034d570d4bc11403cb9f4617e2e6e373cced6cf335630e4e5a3d919041ac67a8b114b2d53c56871239b67a6acd6bc47f8c6130171d84824"; + sha512.doc = "4db42aec14145d4b73fce7940563f6771c3d994955006cceac7c93c9d5d5e2200fddf6d83d15e4dde0385f982c0ee85fc844914d80aa249c3ac2e86a49369b38"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +spath3 = { + revision = 64818; + shortdesc = "Manipulate \"soft paths\" in PGF"; + stripPrefix = 0; + sha512.run = "c066ebfc25685d450caeddced161ad5b4170453307cfd21fc2c85c113bab3271b001514481827149757e536863fc2bf9814e03720d9a934c4df02321d6c5bbd5"; + sha512.doc = "ce6fde7f6fe42711a2c685582dda0bb9a4715b12a43483a76824361561cf1f20b40bc85a3c2facc90783cbc46b632848a9701d28381f0eba343463ac03ac443d"; + sha512.source = "5d85d1f8370009e0ff5f7cc25f95a1daf3604ebf03e2dea28d3ca4f08f69bf4f86859cd63796b43eab7104945204f70448a90cf95234b574f8ab11f883a1bf09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.7"; +}; +spbmark = { + revision = 69927; + shortdesc = "Customize superscripts and subscripts"; + stripPrefix = 0; + sha512.run = "5734970852cffeddd5e926e407b15bb1058d010098a19ff0f96f5b292ad9b87a81e608400779c9b827e78db768a24f719f382e159ae1a472ebf1e7b7a2644aa0"; + sha512.doc = "17281bda5938984885102aad59bc815c0488277bd5e4b0dfa7f0c48f7ecc613b7b6716dddebecc97586e18059ec06ca95f6757ef3a355252f5d2b8cfd7b62f18"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.46e"; +}; +spectral = { + revision = 64528; + shortdesc = "Spectral fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map spectral.map" + ]; + sha512.run = "e260d7605cb89a7ff33f530c5f6448f2ae512e9ac1b22880f3d76147701ae458fa5acb3525d49cae3973c24b51858ad687b76f5a00ca8d914edf4e329f3dabc7"; + sha512.doc = "4fba6fa0576a84b05d0a0bc3520ac6e08dbedb7f37e5af5a0cc961c80deb98d53065be3c645c0eb0dc08a495d113e72f4474de32dad5d080ce67b000aaf4042d"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +spectralsequences = { + revision = 65667; + shortdesc = "Print spectral sequence diagrams using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "797f7ded1824a025337a12b47a8b85d16d69b8e0f7999015c0b8618ce639f97a5883f1a694a22b56de4a237901e1a43b7cb0f387bb02f567301e59203b16d31b"; + sha512.doc = "4c876bfdbdb40b6d1b58d1640aa39f02a29097f0ddc1015bbd6b415d0d7aa88c90c0d45edc444c69baeeb68741320745157466bff3242daa48526a1ebe21eaf1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.3"; +}; +spelling = { + revision = 30715; + shortdesc = "Support for spell-checking of LuaTeX documents"; + stripPrefix = 0; + sha512.run = "ec32c627f52e1cc08f893aff21d43519ac30169772e82793525cfd61c302883c9c0c8444f2d51cd03a94f55e1ad589afac1a404a47b87ebbe7855acde887e511"; + sha512.doc = "a51b8fb45701d318dd9b9736830b83ac34c84b781d61a3a247263167d527aad7cdb6e1917ce260d09e0304fba38bb2e2a25288f75aa2335bef479918036e1221"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.41"; +}; +sphack = { + revision = 20842; + shortdesc = "Patch LaTeX kernel spacing macros"; + stripPrefix = 0; + sha512.run = "b2cd588384770e0d95bf6e5c6b67df0ba8160e0a01e3f64932d67debcf9fa836212aafc78c79b8d28aae8124a25aff73f4846db514dbfc0a65a519eba75fc52a"; + sha512.doc = "6b490ee2e736a6bf1ddf32d5db605ab5fe77f079d585c2e377bda73a688a7de575b99d56c6626d9888c395f6a4d181cd0b42e77dd5673c8456bb0e029510b8d9"; + hasRunfiles = true; + license = [ "free" ]; +}; +sphdthesis = { + revision = 34374; + shortdesc = "LaTeX template for writing PhD Thesis"; + stripPrefix = 0; + sha512.run = "44c467fc1de689bc198acfa224aa1109c47bcdfce8b161673752f73d59877465b0c4b87f1fcd4a8f589a78fb05ef5efd42edaff2fbfe7910a1ab7b409d9a7e5f"; + sha512.doc = "cfcd8c02c68a990cda426d737914d195c78d98e0b8c9765128aa8319d47d27163e7d072ea50d312a394b85e8ac1e580dcbd204fcf6b670b4dc519d1f09ce8d72"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +spie = { + revision = 15878; + shortdesc = "Support for formatting SPIE Proceedings manuscripts"; + stripPrefix = 0; + sha512.run = "282ee645ea5022fc0e325bf211b358236f07c6509883a254fa4e1ca0728fd73a4be8889e4919eb5e0ea9c203300359808b4d141d71d0c158a71a3d10d982264f"; + sha512.doc = "1242f49f1499b798977eace516487543c23dca36471b1e49a2b1377a84083f40a3d5a2e316624f8ac458b61c2cfa406fc3580209c9629739dabaa2fa35e6b806"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.25"; +}; +spix = { + revision = 65050; + shortdesc = "Yet another TeX compilation tool: simple, human readable, no option, no magic"; + sha512.run = "e0447cedced73a9544b837c555f3d42995b5fa5e23ba737b6794e11e7fa391969c2156ae89d6e7e18140dae0e0c9b0f2d5d6036c4fda3d236790abb21fc8d9ed"; + sha512.doc = "b783636e01e976f3a0020d6e5b8c87918277fb0caae09057e68b2e216e504618f0b784b1214fdf99fde79cae5a6169c585bacf093de149a99534ef7069e6cb2a"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "gpl3Plus" ]; + version = "1.3.0"; +}; +spix.binfiles = [ + "spix" +]; +splines = { + revision = 15878; + shortdesc = "MetaPost macros for drawing cubic spline interpolants"; + stripPrefix = 0; + sha512.run = "f040046978cf51bbaf3347406e224fe60a85f449c1fac1703e7a2d936140b099c14ffd488ebe4c3d932b35a8380f943250734a054ea5165ed26b2be712ad577c"; + sha512.doc = "08532f43fb7aac979e78d30f27f36047d7b70733ef6bdd65d26a40e6818f2b73852d4a6ac5eeae8cd29fc86e1630d2ba068b9707666f66a13e2090a6da81ac25"; + sha512.source = "dd23ff4702f70ca2f29950e2e1c915dc96f9b0951b6f00ff94371ff80fe60f20d8de517a9d9157db9518cb51f96f1f52b8cd7f080af7760c926c5d29649844e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +splitbib = { + revision = 15878; + shortdesc = "Split and reorder your bibliography"; + stripPrefix = 0; + sha512.run = "2936732fdcebff683e240e139ba6e1e4268dc72e427bd30af0590cc3dd7dcc8dd49eaf6f007e549efc5c429fbcea2b37f9e68040d1ffb023162c571341abdb40"; + sha512.doc = "df266ae77aaccf91b08931c57b01a9eefffe6a469c4cc549ce41640dc9c9041676539e1302aecfed88d19baef277f507ede8ba6f794dae6ea4745b1338459d14"; + sha512.source = "72a8da016f943df7f5e2d7cb05cd1a64e222ec0c3be784ac21e6aa5f571c9e76cc3e8a5716444aa1033d5127af8d82df5cd632a884fe17f08c55e08d38956e3c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.17"; +}; +splitindex = { + revision = 39766; + shortdesc = "Unlimited number of indexes"; + sha512.run = "858033eadfa82b4e40a388356f64002370a5f4fc2c95565eae90c68373f708a3c9827fc4e0ba8094659382aba4e5925cba86632733b15d85ea6a82f73ace8737"; + sha512.doc = "c8dd92e955fcccf71b412d9750fff7b6f214e929ddf194a6496a79a146f4837af3d773ed3f2303546727cc4a8fb9d5366dd75b64d3877e6121ce20315f71997a"; + hasManpages = true; + sha512.source = "8aa928bdf6f2e8fb6274c1fe8d0b4567d03a1c6ffbd078726bf6a36ff1bdab981d5150cf0250602a64d2a0a9be92695fdd399c04d041b7a9579a7d3a71910151"; + hasRunfiles = true; + scriptExts = [ + "tlu" + ]; + license = [ "lppl13c" ]; + version = "1.2c"; +}; +splitindex.binfiles = [ + "splitindex" +]; +spot = { + revision = 22408; + shortdesc = "Spotlight highlighting for Beamer"; + stripPrefix = 0; + sha512.run = "95a7bf0a9e04e7157fe27499a7a2d2bf3e8d86f284e9c2d150c40b5efc1786d4820af20ccde7f5b649a775d7a13d25a78347138a200335fc0b9e4165dd3e1f0e"; + sha512.doc = "26ee8b13622a46078e8199c818dc353801af36afdbf67707a6942202fa458e7cbe9a000a4ea022d0dc4ec6ddb3a63c6adadf240cf207778765e47b2db636ea5b"; + sha512.source = "96438aef76ade4df7f4f49d819f96792a28dcf3a0f5e50498f854c047a7754accd31d679d034886eafbfd32c0d4eb941e8a888a1ea94fb332b8b48912d0f673f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +spotcolor = { + revision = 15878; + shortdesc = "Spot colours for pdfLaTeX"; + stripPrefix = 0; + sha512.run = "6748982e7007323414dd8ca5f1ede105bb2bfd0b0f8d2f83c8731926628c094c8c08f0cf4ddadbaa209e182f8af83ed6fb761142ecbb97371752473b33c44ffa"; + sha512.doc = "4055f42161bd45dee74974358eabda875e9a3d62690fec0486748cd7fe974af133c24e56bcfd240c6928334fd9c7e1e6a6935c45b974760b41f7ce080d44f568"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +spreadtab = { + revision = 68256; + shortdesc = "Spreadsheet features for LaTeX tabular environments"; + stripPrefix = 0; + sha512.run = "f808d82cde55b9b8fbe0cafe9f2e67acb19547e85f8d48965ecc6c8ea70302b9ebcf4097330707780fddaf1d9b2a2a12512fe4026a0d660c5a376fbcffdb6f19"; + sha512.doc = "a2b57066ab198d88be6736572276593cb2b31a9c6392f74c68358d39a8c88077266b2138730225b6ef54245a6f084aa73dad5bbd31a77fdd8b60f53f7342e25f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.52"; +}; +spverbatim = { + revision = 15878; + shortdesc = "Allow line breaks within \verb and verbatim output"; + stripPrefix = 0; + sha512.run = "0b26e941f77264ae2db7cdcf2c4459c26601f6079e0bad24a3ea0edbd22157c324bbf50426a794655dc1aee710092cd9b662bb401838186e42657fcef5c1121f"; + sha512.doc = "245825f18ae835b984eb6474b927a579f80b6c6feefbfe02a53f8b7ea5a48023e1bdb43b39f090afe4ae42937d053cbebfec6ff97d7732d754287401a95fc641"; + sha512.source = "23f8eb04b0debee1c9babc4ee6720740a4e64a28969365c27c96113cd777e0565b19d8f6db233470cc600733b1831463881d86eaf4b4119cf60bd3fbbf3d0597"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +sr-vorl = { + revision = 59333; + shortdesc = "Class for Springer books"; + stripPrefix = 0; + sha512.run = "8a9b0833bc518b12019d2d474a70760e3b44766751485215c746b8a7c3b9ee1f9e92a5cee09c5f961fe97387855627c6a385b7484564556e0901c08c922410dd"; + sha512.doc = "774c91361a95510a356fb7fbb70f753954d30d1ac309c1cf09727a2c9ea647b65f046d3eded8e631b512190f5705eab020abe8b7923ee9d6230c6c9fd782dea5"; + sha512.source = "fafacdaf874ec094aea5451962c3c79584da5fdc1e0aec34b9965b9c8531d19538d362b68ff1d07073aaa3c24483214168b942b6b4e0391384c69c690620d9a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +srbook-mem = { + revision = 45818; + shortdesc = "Support for use of memoir in Serbian"; + stripPrefix = 0; + sha512.run = "5cae41da74957078b2b0ed38c9fa4186006f24abca804b879641b4bff5324950b1a59296c5733fcadd2ef05661ff1dba8cd7d9a2c5f9e2a5c6bc1e6d993ff218"; + sha512.doc = "5e06fb85b3398cc65372fc0c82eaae3d807c6c908eedbfa8f4ea593ea6213790c3fe9c5142990a9b7d4c267ed01cd61aef4fb950a0c2b51424b0ef5e1f2aa520"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +srbtiks = { + revision = 63308; + shortdesc = "Font STIX2 for Serbian and Macedonian"; + stripPrefix = 0; + fontMaps = [ + "Map srbtiks.map" + ]; + sha512.run = "7caf4046990b6708f753ffe9eda73f564fd1d18a97fbb78d72fc0db72e0b8a2af2974e6348ab2f62973805398581c7bacf6b9937fcfffb33057cc3586e4de6cf"; + sha512.doc = "1b393eddee48395dcd94889c3e5d530c9c4ec736e41f901bf6a66ebb9d4929f363407d026ac9824ae82c852823e9f4d87a618ab4aaa0cc25247c3be03ec00f31"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.0"; +}; +srcltx = { + revision = 15878; + shortdesc = "Jump between DVI and TeX files"; + stripPrefix = 0; + sha512.run = "2edad3f8b56fafc034d94a3e3240190a8f4f1a1054c9b81d6dd9fa5426abaec0b29118f7bbec909ffc3534693b8941fd4e44b6670d7dbcb852fa3a056ba63fad"; + sha512.doc = "1f8428bccf142790a3221d470fb66dcfba40552da0d8aeb9cab62732c5a5ee0af3a565774e29822ebcf0c1e4d7a2bfffc61a0944b762ffbb7ff4e8901a61ab48"; + sha512.source = "497aa5f6bd5dcbb354a4abf74bf8276898148f42083a0657ac9dfeb4374038b4f8003b3ace3b4d65b2a08334c1cccafda371e8546def7e44f823212c257d42a3"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.6"; +}; +srcredact = { + revision = 38710; + shortdesc = "A tool for redacting sources"; + sha512.run = "9e11ed88fbbfc0130f43fdecd8fb0b3eecbdf50eb33bdca57bd34c860cdfe84dcd560371efba4cb261e65aaf4577306f478d1c43ed89152e7e21fd627eb7328d"; + sha512.doc = "dba9916acf75e800af1e581b4276e82bfe4c421a500a400773354766b37849568c1f19752a75983374ca41f793903f9776423888215f00376db1e0f5f3b3dbbc"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.0"; +}; +srcredact.binfiles = [ + "srcredact" +]; +srdp-mathematik = { + revision = 69288; + shortdesc = "Typeset Austrian SRDP in mathematics"; + stripPrefix = 0; + sha512.run = "168efb5c07ead0dc00c318928d717b2840e162517486ce1351412d7cf5f5cb8807d8016799510c6db48210fe517485fc344eec8f3edafa587cc55d1e6e60a005"; + sha512.doc = "318b530ec453df35135ea57a514574f71c83fca3f63c85e36405ed20f84a2438951325d9a30bb9c5abf2dbfcb5b2829811720b7031a68b2ecf9d19170e4ec235"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12.2"; +}; +sseq = { + revision = 31585; + shortdesc = "Typesetting spectral sequence charts"; + stripPrefix = 0; + sha512.run = "25d3d2af859d8ce83f7449470be02bc4bc77b8ac49c4e10f49fdca51b0a85488f01cbf5f826b07fba12806c932125a35197be2c7bcc330f9b6f51a331fbc77c6"; + sha512.doc = "3b5516fa412aa19fe8f3d23706b3046b6af698e8307db32cb895fb13eb876032c5c3fc908a69f0e18efc2ac5802a95957246d58248dd05e1fe25409d46a8bd20"; + sha512.source = "b86247430a144ef73ce271b904096368291a6581de3e1c7627d38751c102256e77d82963d86956d9a9dc8e2fa16aa6b8b0a15dd02b4468cda88f70b19e856711"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01"; +}; +sslides = { + revision = 32293; + shortdesc = "Slides with headers and footers"; + stripPrefix = 0; + sha512.run = "5809b9968b16d35d5f76f185687c683512883942f8ff3537a7dafef3a76e5fb017a4bed36dfd102fb5edb93648148861c78f6f7e93aaea8c5cbc8113c05278a7"; + sha512.doc = "4a0fde19b43390f80d6d671933ba51b0be854d774d6f35f3e8fb33653ef7784df85871dc4fdec03f2c734e819af6c1098e8be152e0bd42740ec2f4ae53c38f4a"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +stack = { + revision = 15878; + shortdesc = "Tools to define and use stacks"; + stripPrefix = 0; + sha512.run = "897ca71e1a8531485d9807743e4549a994f5e6e22dbb9a958466d4bfc7fb1b4579af0d7ef701146b8142c394fcbfca70bfdf28779530e487a0ec868c77985c23"; + sha512.source = "d10c0b9555df5643d266cfcbc51970cb7d606c80053225e4c3891b49f59fd9831c89f8be97d41e3e70b8855defb2af709190631e71a470a061959486162d5ed1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +stackengine = { + revision = 60019; + shortdesc = "Highly customised stacking of objects, insets, baseline changes, etc"; + stripPrefix = 0; + deps = [ + "listofitems" + ]; + sha512.run = "15327eda5a6eda2b58055efc419ef50b8d8cf8c35283bcc41ee85e354f61ede6efeabf5e75bbb4cd022b95e52109bce1ee2e28fc701c5940723f3b15dd44c75a"; + sha512.doc = "a0edeaed3766af88d1c5e0508fd285382850bfd072cf4f6fdc1c329c8ca9f5e1eb5fe75357d9a86dd8b2476381747c9a3f7cd7dad0d7c32419bef0d37849928b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.11"; +}; +stage = { + revision = 62929; + shortdesc = "A LaTeX class for stage plays"; + stripPrefix = 0; + sha512.run = "8472bc96265ea7fd3be748f147238b6852079ba002f9c7548f5a5e8cb0f34a8155a799635ee5e31b22bb30554795a6fd08e62312b25ce83e727e10f6ccd13f37"; + sha512.doc = "82df4a8fa154a09cd8231c21f3a450a089796306e8275b17291bfc903ef00b316a1ae0a4175637294ecbed0dd6eeffa7baf134d60352284aa07e0a1a0224c205"; + sha512.source = "82255aaf0407da34f219f220deb5b12edd5dea55f168a4ae11a5bc5fbc6144fb45d7e79a4d9562405f838955e72efc3a5533269f05b493a48027bd35713ddd65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +standalone = { + revision = 64677; + shortdesc = "Compile TeX pictures stand-alone or as part of a document"; + stripPrefix = 0; + deps = [ + "adjustbox" + "currfile" + "filemod" + "gincltex" + "xkeyval" + ]; + sha512.run = "8e74a676232ffe9fbe93ee3a1095c0c29cd65bd23f8e4602308d8fc1abfde9025c01e8ba379782d4c79d3349b4298806419735c624436a7b0c93e2170c592efb"; + sha512.doc = "358fb3b29f4c2d37d03b7d98ee02b35ff8571ffaf30b8d3fa1a9b0f74965ca4b0bcbf2a7172b8771dd3f1240c7dad1acccc7710dad302411dc43a301149597cd"; + sha512.source = "a29880dfca00e77b19ee828333c72f7c95a26470b8edd5ecea53bae3300868266ad4aa0db2bc6e16f72c14493b43659434ef4880b025b5bccad3305d0ea18b33"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3b"; +}; +stanli = { + revision = 54512; + shortdesc = "TikZ Library for Structural Analysis"; + stripPrefix = 0; + sha512.run = "2273ba6dc99762490a0cd7af09edd5c4a511ace7317e62874535946bafa69c14f02663afa21fbc54753d1b5d3884858ae93e4790de7dfe4a829e4cc4ecf4e004"; + sha512.doc = "e4405c8903478ad2b8a5c524666e2fd4aa99dc34dae2d15ace5de7ca4713a6964467f18d4ae2b73c02316bc7d0e51f12e82312544e2e44d50eb3e4ca51671ebc"; + hasRunfiles = true; + license = [ "gpl1Only" "lppl13c" ]; + version = "3.0"; +}; +starfont = { + revision = 19982; + shortdesc = "The StarFont Sans astrological font"; + stripPrefix = 0; + fontMaps = [ + "Map starfont.map" + ]; + sha512.run = "1f45f97813f5e51b45e1cbd3246b877aad823895a4b087294d0754c560db5796d8b4f9d09972b5c90c4c569db82a2d70bd1c39a9dfe6e1fcc4e0deeceb44f876"; + sha512.doc = "def94e1e2995e20e282d9319f763ddbc5e152a48c18ba98ef4d168e69a9a6deb5d7d87923a3259553f990f2da73c78929858852c6165acf7a94a6010382f786b"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +starray = { + revision = 70604; + shortdesc = "A structured array (of properties) based on expl3"; + stripPrefix = 0; + sha512.run = "69d5bbdd999a47e4dd15d01b9b34bbf4bcede27dd60e19c7c10b4d85257ca38448b924e900c109d2d40e5ddc1b7a0e1b9abf76248a60d08c44805c1d1ac7d814"; + sha512.doc = "1fe545c98ee814c1f6955a1b75ffdab665cb18b071bc1c833c9a595983c15eaa211b990666768ce0e4eabb336ec11876ebc72141e3cf9aca2dd9d6686d5476ba"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.6"; +}; +startex = { + revision = 69742; + shortdesc = "An XML-inspired format for student use"; + stripPrefix = 0; + sha512.run = "65d5b1c2f5b49f3ceba1fab6021ea4445aec25f302145586331468d727a9cfd992e444b0e53f3aae132308492f15d8f76c5c18cdcb405d9d06dcef6a443a4e23"; + sha512.doc = "a4693b80da94c5644e85c43b93a73ca385097fd2b395856d497e5a138b54063d98d59a8957937d2e2e6ef8948f59d0b1cf74defe50de0b7c5c0fe3c1da83c9a6"; + sha512.source = "e3d11a95d9705f18241f2f31e2dd21bace280b82d9edb5de765f0970ea9367b2f502111222837c328486b68875b59828d73b718e9fcdbc4b5b5b16da4fa900a1"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.04"; +}; +statex = { + revision = 20306; + shortdesc = "Statistics style"; + stripPrefix = 0; + sha512.run = "66fb0e346ddd4902ac98a90fb7d0b0193d8c8166aa30774dca1f5b6007a3e19c3b98e25bbc88abc379e199720b6c9a2c73caabbc515db2a54b2a8b437c5b270a"; + sha512.doc = "9851bb7e2e9af03affa1f4b5750817543be9e985e02d06ca4908ee1ebcf0eea2b8d75a25cefdde3492efc52d86be5bde6fc2f6a99f935c183cf3fc9041ee0e25"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +statex2 = { + revision = 23961; + shortdesc = "Statistics style"; + stripPrefix = 0; + sha512.run = "dc823a25cdc70bac79c69e721feba69883a99e9e0a5b211398ff0682af4fe4bb1c4a7feeaecfc7c12d2df876b8aab6be0cb8868df8b8eaaa10850042615226a7"; + sha512.doc = "6f0b45577bd4383359dbeb592c3f9e3c1a66d1b2540cf6027ffaa20f8f644316cf2feb0e585f42801b43b529632efdea52fc2c83f2a6d9347cd443da27259646"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +statistics = { + revision = 67201; + shortdesc = "Compute and typeset statistics tables and graphics"; + stripPrefix = 0; + sha512.run = "dc3e9516f7bec533adae533d73583871101f26a42a96e6e0afc99f57b2d11797c1850113630b128ead90997fcbacca1bdfc17ed70d4854756cb3a14fa4133d99"; + sha512.doc = "239231ce3eb6e75450e4eabd722a6fe2149e7825236c2d028a0923ad53ac4bfc2296a5d4d8f80b70bc24276f77f9b6b79f2e33debc03106b5915cacceb4d7040"; + sha512.source = "a35c628209828b5c595dbab9596a3e25255dd1d61986c8108125e45bbbef7806b9204791d59ee23ced7c486f0a39271b15f0bb6914f06cca379ee6072f31cf97"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.2"; +}; +statistik = { + revision = 20334; + shortdesc = "Store statistics of a document"; + stripPrefix = 0; + sha512.run = "2d2455227b5db15235763c4fa677b549380d66f2485d1d53c2c607f96bb4b4a176ae9868419351f691f3efc3117e6e54be3317040f2a6f8d1d105cb86709f86a"; + sha512.doc = "88b28820b5d2a4a304c26658e27da7d673bf430a6be3ddf46f5eb3103abb7e8d20b03e30b65b88583960f9cf3dbebb9088330621b99e1eb9f2f28c0684638240"; + sha512.source = "d37bf82f0830e14c500af27146a1ae1a80bf4aee3bb272429c7c2351366e2fdb51b7ba16ab6459b7cbb8abe2d37870b7bcb3fa43582e588c7cbbb889ac1e3859"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.03"; +}; +statmath = { + revision = 46925; + shortdesc = "A LaTeX package for simple use of statistical notation"; + stripPrefix = 0; + sha512.run = "128532a808c4f8cae9ad03d19d9f70673427f9335d298d4840776ecf59a78b0051de64093f00510ef34c61d3e2ab900d4494f800eff8183a4c8451bf90a1424f"; + sha512.doc = "14754afa159041c359c85d31d8cf3483789b02a7057f59f6772455ff7dfbaaf81e793db3bbdb8d1a67e25de7a00f32c22089e2cc908cb1c2e0abf6a17eceb7fc"; + sha512.source = "67329fcd533335927638057bdafd76c3db6e49abbc23c63027623397ab35450ba811acf61c5b3ef299077cc92a14df3f0d66076a8f8a2d009ef9e4828ebb533e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +staves = { + revision = 15878; + shortdesc = "Typeset Icelandic staves and runic letters"; + stripPrefix = 0; + fontMaps = [ + "Map icelandic.map" + ]; + sha512.run = "f6a1aea97a3293ffb514ccc526faa71ea5ea3ab32990da8725cc3ff998d15a2909001976d9705ba13110fbde869001bec2f286e58c05f1fe31f345ecd5882482"; + sha512.doc = "b839484325cc6d06a407ea685dd705b3616d1e87f22d4a625c20dbc507647b602417a085328f9ba886766ee0fca2516da397c742198569477bc1009271a4db23"; + sha512.source = "9dbe40efcd1699cc9267b739bc1b182fc0e5dc23ae52d19ea89c1742b815e4ea9b7612e4fb80aeb83f3d9206ab408cb0ca3fcb99c85883fb86f89f3ac26f0b5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +stdclsdv = { + revision = 15878; + shortdesc = "Provide sectioning information for package writers"; + stripPrefix = 0; + sha512.run = "88d8abc04d10f029a9ce0fe9025497afe3eba3dcc300631fd37baa8174bdec8dff44fbde07599ac8dd6635be27294c359c77178690a4e6c97f41d15f9d2abbd4"; + sha512.doc = "8321d823ffa159071f66d87d38fa38ba3af03f6c69999a041d765f0fda8549547da4b8eae86efce82109679284dd912f2c5494b5ef6e76c73c467cf4eb87aa2b"; + sha512.source = "4a9987bcbb557b7923c6c2a5c58dd117fd7b56f58b3df55154514075b68bc59a8928fdfe275dbf328ab2bd5b6608b193ad5ff07b95e7bfd2d79eb632837e5469"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +stdpage = { + revision = 15878; + shortdesc = "Standard pages with n lines of at most m characters each"; + stripPrefix = 0; + sha512.run = "a3835f211b744dd88e0238a01f0a5f960305f7eb92bbd9e3437474971173e66c84cbee1d5ab3f1aa1097a262a258b79085fd0d86884bcf3acc4017e7885968cc"; + sha512.doc = "77510670a49db00b185e6b502d07bd85f9ca18bedeed86277c7d51abb582f40c793c665f2ab87435e90380f7f6f740b64c937d2171531a419ccc59bed197b90f"; + sha512.source = "2973110831807b73409be0082c5aa281b176dbe7174b736cb9703b0c75ee918d1135fdf0513bca5dc48bb996d0067c9201702b76212eb632073f9b0a17b00d55"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "0.6"; +}; +stealcaps = { + revision = 64967; + shortdesc = "\"Steal\" small capitals"; + stripPrefix = 0; + sha512.run = "483580c347831e7623c75dd087fd6ce57f3af84d0bc28afb5a95f5193ac4e4594f8d9b6a45b8b62e988519208510e0acc7e32f720df3e1f90065e90d06b33900"; + sha512.doc = "3fea8ed1b6a50a2f5a95da2d9d65e26688886b55bad60e71404af7fb8d83664383e3e0b19cf3e52433ddad75da57a99abd16b6b40a89d620464b5cc4a64347fa"; + sha512.source = "7dbbb83039cd65e127705d7512cdc4bd4aedbce7837bee7f0372070aed8373dffd4fa0087c34707c0d5c18d3afc72e597e6514d82d390fa3e3ac1c308a1bb637"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +steinmetz = { + revision = 15878; + shortdesc = "Print Steinmetz notation"; + stripPrefix = 0; + sha512.run = "8ff095645447f9349d2b35ab5ccde72109eddcd85ad3c9de262833320ffcbe94c2fb08df5323c69fc64cdf173ee7193ce2ce887f1c033997455a33f290cf1884"; + sha512.doc = "e409db74c366c5f49011a6e21355150e3e97d16c1e3a7fcbf06cc8aa0db2c01288dfc60b3c79e539936077e452c40dd601490be8976c57d01f9a5a88a3798093"; + sha512.source = "c18fde06e32eb4155921bdd7e4dca7ca108139859545c638f562f82deb6feec904a53870c929482504ddf28858ce5ad3c5abf4148b3bfec0193f260af432ebe9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +stellenbosch = { + revision = 68039; + shortdesc = "Stellenbosch thesis bundle (legacy version)"; + stripPrefix = 0; + sha512.run = "8e368dbba7713051fd9a834223848a2dbce700d9ea8cfa2ccd04a3f2e88cb15d5ab1d881d4107dedc72bfe4e6876e5b7bfbd019cbf5d9d7fa152f4e6343b5aba"; + sha512.doc = "0996a6932b4a6953cac70299ee655349f6b7723b416e3fef10934de92844de2dc4da42dc5d3c3a3939edb0cca087c2fd28b0d222641197593e9697891891da20"; + sha512.source = "c1b4c3ac30f5f923a3b0893f4921fed69d99a0fd07f6de7cc728c7e95a2250c1544a5f60ec8331ca912dd5204f273c147492559ce08f6233fd509076db116d0d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "11a"; +}; +stellenbosch-2 = { + revision = 68183; + shortdesc = "Stellenbosch University thesis bundle"; + stripPrefix = 0; + sha512.run = "ff82ad0faba3b5742d1f31d22820cb4998e88630067dbfbdaa7bc01fe4927fc0d8f10afa1713551759048a9166bc6d86cf52561f72bb743197b7e5fbf911cecf"; + sha512.doc = "9314fac0288fcd9e0e6040b3fe3276d52848693d33dba16af0b2e6f4bb79a2ea3258dd29e5b62bd90b25d8a02e9cf160833750b0aa99b8d09acefb6c8727bad6"; + sha512.source = "bceed8029e35a4491999fa92d6fd046862895e4214f83fff06fad39cd82105d8c494d78d6a449c374ad678aaf727284e6367ab9136e106dc4266afbf1f01b367"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "2.0"; +}; +step = { + revision = 57307; + shortdesc = "A free Times-like font"; + stripPrefix = 0; + fontMaps = [ + "Map STEP.map" + ]; + sha512.run = "d1f19415ceeefb879a3b4017fa286e5e5806e193fc75159b515fe21a9a6093c6a95d04e2e2e3c7ee457edb8ad717b88043c58727fb3924cb192e05aec12c5c07"; + sha512.doc = "bbf49f36bf7588c83e237d58d49ff7453c368cbe7e3a32c431944a2249c0dd75c2c1081d10bc2279e0836384602268ad163ffa3eb7108cd28a6c510a18f001c5"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.0.5"; +}; +stepgreek = { + revision = 57074; + shortdesc = "A free Times/Elsevier-style Greek font"; + stripPrefix = 0; + fontMaps = [ + "Map STEPGreekTest.map" + ]; + sha512.run = "c322bb089a887b36c4008502160f0970ff2ca33f05391010adc38c12726b2079085bb1775934597fa1758effee14eda76647b886644971e7c40a451154e446f9"; + sha512.doc = "c3f4c2b1ea06a012ba4d5f5ca72faa0a6c1b4ae5c132b17bda0b6bb895f34e555724f93cd791fad8c6ff846027dbedd723f874ae1e772de95c64bf54f5fa0265"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "3.0b1"; +}; +stex = { + revision = 68569; + shortdesc = "An infrastructure for semantic preloading of LaTeX documents"; + stripPrefix = 0; + sha512.run = "dd17faf11269dc6dc5e6068bb956a36b2af86775e296b15110d0c9b6e1e8b8410b936deb690c7a89d604c012b5643849e8abd317ca67cd872469f863511deeb4"; + sha512.doc = "0a8571fab8eaefb365c52cdcca251f2582d4581f6243e678db90c2c05789cf55ae077ba3216a9318a1bacc172b259ec444b35d8de1622435d4a02b5611d141c9"; + sha512.source = "6efe24e0933790ad7c3477e9c1d25c37b585ed0e18ca937326102783362691d92b51486885a3d08c1581110a2e4e9f7182f706ae4896c70f69472e01ef1ddea2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4.0"; +}; +stickstoo = { + revision = 60793; + shortdesc = "A reworking of STIX2"; + stripPrefix = 0; + fontMaps = [ + "Map SticksTooText.map" + ]; + sha512.run = "aa2ede628a273b4fc0796153d243bf89dce6d3c1b0097b29327bf21836340d11f6e6368f312d76ff726030c05d012c3890f86277ac7eef79d5c5ca579f47cea7"; + sha512.doc = "e1437dd3b47c8799b4a8a60fcfc215a303f1eb289e0424e51d29fad78c9fb4cc4890896baa77251681d000f2eb08365f9f16a2fbc1c37881b852790257432088"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.035"; +}; +stix = { + revision = 54512; + shortdesc = "OpenType Unicode maths fonts"; + stripPrefix = 0; + fontMaps = [ + "Map stix.map" + ]; + sha512.run = "7e639f7a534e24afd9d009e224d87c9c2a502cbc77ff882c6dcc9ca0bff512f849d1f3e658dff8badab3843a658171b88ab66d8e731392dc456f9c5f4e032318"; + sha512.doc = "b01c3dfaa96a6bbcaa83e803514c8090546dcdd54595d7c66a1ac280286f5baa98947fe9d513da3d8baa1e83cdd174443751fc79c07cf66093af4e9044fd9010"; + sha512.source = "594af38fdb72d632c36cf6ae6165518553b10127281ef8a6ec71f4ced16481f2582a13f1f6f0ee98e900c3147c574647c508f7c9e51afdc57ce68614a394d007"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "1.1.3"; +}; +stix2-otf = { + revision = 58735; + shortdesc = "OpenType Unicode text and maths fonts"; + stripPrefix = 0; + sha512.run = "b966a7d18a471f13b5eb85115566ef4aa7c894b142561a46144e5cda6a0198dfcd83b776d19d605cffe482d07a4ac9d80acde7879892381e1a266e7af4f9f72e"; + sha512.doc = "15e370d490eb01022877ce01cb8e9954af89553bd0cb2b404820c8744271d13ea32c75d2971abed4cc64a692184fb0fe369bc97bf870524599b2011fec3bfec2"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "2.12"; +}; +stix2-type1 = { + revision = 57448; + shortdesc = "Type1 versions of the STIX Two OpenType fonts"; + stripPrefix = 0; + fontMaps = [ + "Map stix2.map" + ]; + sha512.run = "802ea99ccb3b8e2e727537113843846dd6629f722508219be88cddd9e7f1e6f67a1bf48ae3a61c51991ec91ba5c543467d3aaba64116e4be08707def58c70f34"; + sha512.doc = "b4f1e6e8962fd77ecaf0df94b156783d9f77c07231e6cc258e04c26a8190dcd0a3175c71bd3a1187ad6cc083595ee80925712f12e0f838c474ac93701b47401e"; + sha512.source = "5963bee636210eb89d31ea8d5954468fe9959429d516fb988c8ceab3c591f53b47a5a77df8f10d8e20f136adbf2fe23f546fa62b1768db7164ed74fcf706a228"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "2.0.2"; +}; +stmaryrd = { + revision = 22027; + shortdesc = "St Mary Road symbols for theoretical computer science"; + stripPrefix = 0; + fontMaps = [ + "MixedMap stmaryrd.map" + ]; + sha512.run = "8abe58b84fff2f4fd6846b6c267f3b245fb1dfc2f38d0db54ce7cd9d456abd07627247613073f09dcf7e11e3e9c5940d8ff657327232ce638abc6babcc5b3d77"; + sha512.doc = "caf883d1c5021b52d6471c4c2145e708ac3c05c8944eaae621a3ea7b602b683ba2ef2bc0052f9caf67adc1415e7db02b5b55d3642ed82727a926ec193dd984f4"; + sha512.source = "ebefe2836daed0dd4db99517af0f40c73f0a7b19453d5415c80ae6cf723f4ec4e4ae6f9700a21722b4c0d9b8507c58a596697017893716111b46222f54676aa2"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +storebox = { + revision = 64967; + shortdesc = "Storing information for reuse"; + stripPrefix = 0; + sha512.run = "8f414a7bef1e3b2be8c526e67dcec5a5878430891323ad5c4820e0b304fde35e9eb8ca69e2d1c6dca623387220114f7371ff54d2ba4297b8e7d923354d6e5ea5"; + sha512.doc = "09b0b2914d8cd87b6cf070d012a5e9581a399cdee4cf73e38b5f53dae613b3957a8fb8e0a2df6ec2953038ca984e3800b7ebe839ca01af556c655ec5e27f3065"; + sha512.source = "a48bd8d8d3fcca367265706cccf14e5b8e90a9d74528754ce96436ac1925457a78e5d1fbd73a6ebae998121b6da27595b573f15a46c573f1aae06168e0100836"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +storecmd = { + revision = 24431; + shortdesc = "Store the name of a defined command in a container"; + stripPrefix = 0; + sha512.run = "1987e3cffafe007d9f3cb9e0d53fcc648eca40140f5188dcb0202a0916296651c1ab02fc589339fc51999b56bfa4a06b29701aa598ec03f51d7b1ee66ecfde7f"; + sha512.doc = "feacd83403672380cc2cfe90ada2704f98bef63e905740f8f8d50767f86ddf95478efc38fb38fccadad172f27db56045f50a6af4a487f0c5cd2b6ebb5e7666f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.2"; +}; +strands = { + revision = 59906; + shortdesc = "Draw objects constructed from strands"; + stripPrefix = 0; + sha512.run = "bc902fcd06413468d2dd3f23aa774824602a910749bc2b2cc8d4c24decc184a088190422c0f2ea58995fe627f855f6fa6e0b5ad0490b1084fdd122abebb77cef"; + sha512.doc = "95cbfbe360a515fa94d0222eaaffc2cb5920a8a2f5b0ca0a052f29f7237b58214c8f39288d08db88e97ba0694f3ac6793c7c8c90d47295841e009db46b037b91"; + sha512.source = "7e95d4132e4d1c4bb319d3ae2f4ddb10b65ca7b30d2ba6942274e0169a8d69f39d7d552c7470adadf006ee0725bbc0862a1c1190f425643bba108542bd8e4b75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +stricttex = { + revision = 56320; + shortdesc = "Strictly balanced brackets and numbers in command names"; + stripPrefix = 0; + sha512.run = "5e823dde4f0b902f59327be2f41dabbe19f569d5d05941deda33b44664b736c9ec687e98a04635c6f2af2a0f894ad162bcc4b866e52b88e5db55228d4a35538a"; + sha512.doc = "9853efc6722d028c1ccbd90bdba2b4045c45b384e7fef1949ab51b7d2e6d29f1ea2c55c3a4a580a42faae9e03d38de258528af3e37c78f61ef8704798be5ccb4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2beta"; +}; +string-diagrams = { + revision = 67363; + shortdesc = "Create string diagrams with LaTeX and TikZ"; + stripPrefix = 0; + sha512.run = "9f05bf09bb74ab07ecf1a4e6aa1bb16db06961b1caf87c73f48fe33e8174081c38eab30b0249e219a936499a533d441b092e642c88a996193900fb0000708c35"; + sha512.doc = "3c692dbd5835abd3bb87cdc8b3abbfdcc63d233cd3275d92d5073772979349c759c391f254bab3f670d65ebb55b50b4d7024b748b538349428033971beb09bbc"; + sha512.source = "632a1fa22b3bef38b708169aecf1b9c3b9bdcf4cd07843a2b12893a996a98d41d397e3614e242d6021a385dde4e563aaa011e38400c216e76bf221548996d2cb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.1"; +}; +stringenc = { + revision = 52982; + shortdesc = "Converting a string between different encodings"; + stripPrefix = 0; + sha512.run = "a776ddb2378bea0880d7c17e1a87db5f66645c5856243e49de1c56bc427213098afbca34773a44ad955a0014b969c59454d3a0c0ec371d213481668f5f784ca4"; + sha512.doc = "a4f182559d37e45ca8b6c50656d2d520e3f0bf1ab63dc6477cd6e3abe6cbb5c4b89d779c380997b167019aae6fb12ae68d5fe37ea0c08945e3383f5d9905bf31"; + sha512.source = "3febbaa990eb691af640df745f36e289a7f2bfe6f52259d6693c6c9991d719e79edbd14b35c1eba5a9033b203531fceb4164303bd6a3dbab7238b814bdb5eda6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +stringstrings = { + revision = 57097; + shortdesc = "String manipulation for cosmetic and programming application"; + stripPrefix = 0; + sha512.run = "fbc29bbf65e7d4a1fd367b03490f73bf44349427f6c1a7e826135ee9092c9b592a4cf23454919e0bcc74dc59d3a6ad072dea16096e4850780ff295dc3caacc48"; + sha512.doc = "1779de4af914b69ab258bc1f69a807c12f750e5919936c78ace4496f86200bfc4c3146dffbb27ac5977c2e8d41ec8d0139cf2a2560ba7c627dacd70b34cc69ea"; + sha512.source = "94cf26d431d3638f769166c999e3dff156bd37e02a7099129f1259b7259be95896b694a64fea657aefce22f3a1e98ec2bbbf0f6f85171ccf977068ddafbb8078"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.24"; +}; +structmech = { + revision = 66724; + shortdesc = "A TikZ command set for structural mechanics drawings"; + stripPrefix = 0; + sha512.run = "a92eadf53e3bad0a1e54246b75b10c99d84dc509ea31cc9fb30ed5541e3d757afcb60aab7fbb7515be335a2caa2f29d7fc211b561f073e25a8a1cdbcf90d2d5f"; + sha512.doc = "e3ee8640eb6650f1cd18bc111d0e4f9b6e3a8cc8ac480bc05ae8251b0e620223aedbf59a54e16953edfd4faad8b05c78a51d5756f7b8660c612b5eaa32defeca"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.2"; +}; +struktex = { + revision = 47931; + shortdesc = "Draw Nassi-Shneiderman charts"; + stripPrefix = 0; + sha512.run = "3d81817eac5cc8b8bd468537406db6a26fecdaad1db269c2ceed582cae84fc2b549eaf527d4c356be7d4f2f16f9db4746251e9b69db0f0fc3cc8acd9f39d1f50"; + sha512.doc = "261a9f7ef5036bc8eebb87ba503b604b158647e82e88844758be506ac5d389103661f681689a836c0048529446bad0d6537a6fc6ba273dd2ed29abee40336360"; + sha512.source = "98b06394519aafc81a565c7b12fb1ad86856ca447cb5ccae14aacc95bded9663a72bea301e7f5998eb9cc2a6358c978881736e564c3672eef456c6c44efcce0c"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.3c-0-g7d3fc5b"; +}; +sttools = { + revision = 60736; + shortdesc = "Various macros"; + stripPrefix = 0; + sha512.run = "4e52219c4d3d668dd52d9a1e8e0de4f547871efb9f5515851b44e1c968cd564080c87c631d8cb53c76cdcfb8df884af0e9ea1492228929098a390b6184f5ed37"; + sha512.doc = "c07922c52f57ffeeb57a9bf3b444e251f01f859f2218933889112b86d9dadc5791d7d926091eb3a2753a6ebebe439bc7037ef857b6d19a1e6e7b516fe879f4d4"; + sha512.source = "65616cdefbe3d5b53f7f888412f8ada24860d33c2cd5babff26a3ae71c6c56a4d1a5eb5dd355d557c8fd947db82401746a4928a16587a88c3dfcc19f712f5e59"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +stubs = { + revision = 69128; + shortdesc = "Create tear-off stubs at the bottom of a page"; + stripPrefix = 0; + sha512.run = "fb8276d461883c289329a74f1ba3bba5e64acaf199f7739b013f32a4fd84ab5e2d94d73482a3b70c64e156ff9332b3c81bcfa74854edcf6cc3fd6ac89df595ac"; + sha512.doc = "b2822ecb49ccd9c707cf731490c628a75b278848dcec31283c782ba72a12da8e8b7282ddabe38939e5b0c01afdd222be6991618d4cf1b73a2e06b875fab4f82d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.1.1"; +}; +studenthandouts = { + revision = 43516; + shortdesc = "Management and styling of student handout projects"; + stripPrefix = 0; + sha512.run = "2a7d8cab28b58a26633fec5845498a2987763f61b896fb747d97521b569786f114d80979956a9b9c2b94b61f01677101248a1a4c1735415703398b57306b6c15"; + sha512.doc = "10e3ff558cd5c544d82a61bc67be8b7ed0c9ec9b01550bd3d1c9d3265d1de7153832983593c0be6f5a990d33063b065b397e4ab6b7ed12b0ea79e9e49e0a68f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +sty2dtx = { + revision = 64967; + shortdesc = "Create a .dtx file from a .sty file"; + sha512.run = "f95ad4f6260657ce329c10ae1306e5ec50965c2766c3c28f5a6dd77f4884637c36ecfae28b7853dfaf4e2e5bc256713abe4c8b3525e194fed1eccdd1ea24e1ac"; + sha512.doc = "1bc66506350b07341c8c4b858c6b1c637d9f0bf48323714ee7dedd701faf20e3cadb318f56bfb1a05f4fcaf84cdd6e9db18299801a69e0359937d7852ac6a824"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2.4"; +}; +sty2dtx.binfiles = [ + "sty2dtx" +]; +styledcmd = { + revision = 70496; + shortdesc = "Handling multiple versions of user-defined macros"; + stripPrefix = 0; + sha512.run = "59af3b3ab6b045533167dfbecc3a0a124fb3f8098112ab9b80cf49a3c5c20323122a488019ec3079dc596029a38e45ba679c2448611a8f90108f8b2b59f5568f"; + sha512.doc = "0c096994a7027873f97ac1bc5f9ff1439b32cdc9b6255e4ab9fb955b8c4e60406b152a56c3a6dabc0f5bc41b26fb60ee0ba94e4d9c0202d93d5bd8f0e422ac7a"; + sha512.source = "cc8de429174607b5a27123c2c580a9cd35858fd988bf4458d7522984f8ce0d24223f9f31bfef41152190f1533ceab9d87dd8bad368446292d9b495161d228b00"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "2.0.1"; +}; +suanpan = { + revision = 15878; + shortdesc = "MetaPost macros for drawing Chinese and Japanese abaci"; + stripPrefix = 0; + sha512.run = "a9fd27694ea7491321580ee325f8b151bbcfcf6da14ecce85b6d4e68b09cdf125c810a5170aacc966835fad8f2aaefd78916920cc3e896cad7738d026450ed83"; + sha512.doc = "667d3c5590468170acfded106a2a468d9abe7b4b34a9b56d153d401a60e8f24bce99a4f6c5f2761572a42b85c7faae5741ee5b6f22c3f1004e6d6685463b9350"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +subdepth = { + revision = 15878; + shortdesc = "Unify maths subscript height"; + stripPrefix = 0; + sha512.run = "7328742873abc42d2b9916161ca43e339e03ac1fd34479e93d9eccc98a065e95cffbc920395dd6f90d90989d29840cbdf2ca87dd1d0b293dfae66abbdc6e2d3a"; + sha512.doc = "6bda8b822a4f1ac2a181ce34f739449bfb976a4450a54589e0cb4a64a0f1ff358a469fc88a37639104f731671ec474088968ab3dc95552a2d92a073d91857668"; + sha512.source = "6a63a2d62dbc47d41e78004792e5c9e6ae7b2f3c435e95bc9969bbce109293a8257d4913a5b1959d95163c9aaae557daad53e950c5313faafbd8fb8d0de2c367"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +subdocs = { + revision = 51480; + shortdesc = "Multifile documents"; + stripPrefix = 0; + sha512.run = "a38c6e9bad66582914ad4acdae213e37c2bd5658d5e16482a1700f5869762b489f85b61fdb70c04578319f2772c974267b7c9a4e302c34df87f3a01128caf949"; + sha512.doc = "46bde174536e96bb78ba40990ae3b4b8cc1fe2ef26803b193afe2fccfc05bdb6644a548a712522596786847a8fe6071a52599a17ea52134bbed2e5495bbc401e"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1"; +}; +subeqn = { + revision = 15878; + shortdesc = "Package for subequation numbering"; + stripPrefix = 0; + sha512.run = "7d04ceeb8f75cae074f9bff3e8d0aac4b529d199343c59fae7715d1023aebc3cbf2b45614e0d5ef0a95ff9bca4ff9e8318c4ddd86ceaec42d271f8c0f71282cb"; + sha512.doc = "09f902bf3b4c8e2e1f9d805102c170b2bf2f4de067cdd590b22fde6b58f4e3042d0b14d362e0af587f9fff9e2c8789bb8af4b329bbfd721ca7dce8af01612c50"; + sha512.source = "f1f7229f058a7dd80a67f18692fad36601015ad6bd7994775b573193d74c0ff7f175397ad446384cb74b3797f9f17605ce2d381327249ab9e36ae0aab756d09d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +subeqnarray = { + revision = 15878; + shortdesc = "Equation array with sub numbering"; + stripPrefix = 0; + sha512.run = "846d822661b903328ee7b199df6bd7fe5b606c13a185cbb6e6fcccf3b009f2b94396bfc3f9e4b8eb5052688536867dee06c6b9571e051d477415e1ac999fc162"; + sha512.doc = "9f47b8fb760b51a87ce5f9728e9ff76dbbc10ae009e04c9bc0c91133941e5b528e09e5034156b1dc5ff9a0c74446b548bb69c389486e68a4b8a79a7c9ed1a7f7"; + sha512.source = "f41086ca65c7821167acada640a11768da429158b4da7caa398db254be156dfb291281b1e2f4f4f58f04c0c8041c45efd2072ddc40db8673808b83b3ca09a93f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1c"; +}; +subfig = { + revision = 15878; + shortdesc = "Figures broken into subfigures"; + stripPrefix = 0; + sha512.run = "ec7ae149b99fecae3b4ee7cf600811dcec9bc44eac762b5480c6df48b725db3c08a87922edb7a524d7d2b748bf7d25482e155fd40080cea9ac62f2575bf61d15"; + sha512.doc = "8cb67139bc1063fc4d5482b51f1c3ad690c85d4f7e022a99059a7b20176bbdc97a44af23756fa220b3f7f7afdf039c4a7b672700012e96b98ee25ebb9e5c99b5"; + sha512.source = "44e7113550dcac4b14ddab03ad5ba4bc86cb3a4dcb14a31f73e5caf0b02f9f3bd56fd9d18ddae002a981e9680bc6fae5850ed07ee94e60d858647136cf9243eb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +subfigmat = { + revision = 20308; + shortdesc = "Automates layout when using the subfigure package"; + stripPrefix = 0; + sha512.run = "d607d2e79b3b0d6e99c8577daa577aa25a0a7d9aecc00c8b7026ef3a923b0e2815837d257599dcfdb1e5320305f492bf17845f5c6cd487b476e789c5140e01c3"; + sha512.doc = "6cfbc274a466796ed0478e9c43cf68d51bbf5379691ea6848968c48cabcfd54525075727463905e48b64946df9822cd10903c562a2f7d546b3d2cd2e9ef11db4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +subfigure = { + revision = 15878; + shortdesc = "Deprecated: Figures divided into subfigures"; + stripPrefix = 0; + sha512.run = "d4ca2ef4c52c84ddda85ee95328c9d3e97ef601db4f08ea508bc53393e3b2722224273ac63f749d6a922c7b42787e932d7f60ed3ceb03667fcf8fc591d4ac97f"; + sha512.doc = "46c2950db73fb557e81887f605b866827b6ae7e027a684f0d24cb3f9d5962a3d83aad97b84e61617381af8d0949057df17ef45d629e992e51c80bce3474cc742"; + sha512.source = "1295290b8c5cc814f6cbadc2be418413d35a0a1cfd313a69b05fc8e5e47ecf5da0cbba73b81f499f0085a55b7e783b9bd82b29ce1072792fa34e422596a117c7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1.5"; +}; +subfiles = { + revision = 56977; + shortdesc = "Individual typesetting of subfiles of a \"main\" document"; + stripPrefix = 0; + deps = [ + "import" + ]; + sha512.run = "8f842b0debcae3110f0a4b2f59047cd55c2726d128bf3e159f2745a4b8a645c3f8471fe218ca34c32f2b35d42d1c5023a25f09fc3bf0c1a4f0c33197776b1cec"; + sha512.doc = "f54f52c5cee01b7ae8e01bff5a4d828b5c6708c31f2cf40d7e83c8a91c4c597945695dd7062b6088d3f91f7a9858e3227c850d658ae7a7bf94392e00e3eaf9c7"; + sha512.source = "2623a0ec244722c1e3194d9ff1237305c1b7bf8c3baf6f60edd69b165bbd5ea83fb73ad23bf9aac1937b4ecf1059754e798eb2c97f7bab5d550fabbe84b752c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +subfloat = { + revision = 29349; + shortdesc = "Sub-numbering for figures and tables"; + stripPrefix = 0; + sha512.run = "d5bd48fe7634ef6deec540595fd23aea21d95d7c68d053bc65eeebc950e35064add73e5b81e92d3a3d4a4dc938448d9c9a27bd0f1a625e4a9f425d4e2d55f237"; + sha512.doc = "400b9b272e51cd9fa7370f1cf7cb354dc1235fc41d57fb07061dd08b44e06cfc17d38c1be3fd5bafb5ed6bd0404660c46c9bbbfd2fb852297f283be85424c088"; + sha512.source = "e72b55996a07665b1deb038c5924e7a71c7b7aea761a1420d4c38d64c1ee98b8663b4a996ae39a869cb12b6ef99efd09c989f937bee18f05a1eba57856dc686f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.14"; +}; +substances = { + revision = 40989; + shortdesc = "A database of chemicals"; + stripPrefix = 0; + sha512.run = "c7e3d72a506242b79e99c531bc550c81081d59c5a850af52ca3b86054a5eae42f9f1ac5c7808f54c404bee829f4cafaa1807c46ac7b994cd0f88ade1aec94c5a"; + sha512.doc = "b2900ddbd6f8618522db171c5fb8b35ce5e5ab6b51fde609a18e6b5656437709772dba683767ad23ce955463a869c483e5e3fe81e1f9b5f7523f4f0cdb87a4d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2a"; +}; +substr = { + revision = 16117; + shortdesc = "Deal with substrings in strings"; + stripPrefix = 0; + sha512.run = "979aaff088f7bd521e2af3f008fd6fb9dc908ec7c9f3963ab7b6338ece92b2a7eebbf9b4974ab87f73cc71ecf7ba92c25d22be8d1fdd297d066da72f61ad1d4f"; + sha512.doc = "97adaaa986a8540364cd6901448eb47bfbe9d53842f412100696621c55d2209807d0d527c8126d9df7b5b38b0ba2f0598e79a467934d9069fe96a2d9125b701f"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.2"; +}; +subsupscripts = { + revision = 16080; + shortdesc = "A range of sub- and superscript commands"; + stripPrefix = 0; + sha512.run = "a1578fb66e6068955c4aa69b8ccb951e79fe55616ceaac8d5f01b62d8c6e862d816e0e1ff6c387bad8b8416a3993699872b0ee3df4f432a733ded0eaa60424fe"; + sha512.doc = "b1424b69633b1c09fde52a38c2e50b6c744671292875688b295586bfcd340283c03a122c83298e8be9bf714201db35f0000c41720a6db49cc09591ae69a3d176"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +subtext = { + revision = 51273; + shortdesc = "Easy text-style subscripts in math mode"; + stripPrefix = 0; + sha512.run = "0ab32328d346bddddd37094ec086727222bd386bd24c1aa164aaa0cba85d60cf6be2aa26d64bd0bcf63f49b0188e79a7212e8b98d2d7400f828ccf10f60272f3"; + sha512.doc = "cd3fdf312f2bd7d30c3aee67309220e8e75d20ea69ffcb17106812f0423791dbeb26a8ddd3621cd48e6b3cab5c910083f49aa18b439d9f8114c08002cdf8826b"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1"; +}; +sudoku = { + revision = 67189; + shortdesc = "Create sudoku grids"; + stripPrefix = 0; + sha512.run = "0cd82916142b881bc4ea7fb9885de56d3ee724fee637eab5f1bc6bdc6891360680132cb2c3d52028cc0ea9670efdaa4666d59a853ac3f850f2642954962de22a"; + sha512.doc = "6b44d22aa120727f8a7a55adac7bf71eb1eb57ea1f33d597f06923bbb50d88c088d431f463951c3db27c2c1d68024b44992e47c83eddce98ffbda054cf98a4e1"; + sha512.source = "eda0ed193fba97a2f0ee2d435d62110acbc054ca486a580fcf0a79f3c094d6e83b4a5732fffaf237978abd566794ca6f3be56f70a34a4cac05c867e9213cf1dc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +sudokubundle = { + revision = 15878; + shortdesc = "A set of sudoku-related packages"; + stripPrefix = 0; + sha512.run = "da5c7954dda7fb8076d9b2fbd8a379e416a162ce0039a0566799bba0ddea975f3b951b7615cf50819440b46c419277a080b6e1c3c514e73483b4f81420a4b6d4"; + sha512.doc = "6878ae9a2734e5efb51f04fe24cc30546a2c812ccfd5ae62cbbbc94496a081b03f7d2bfcfa6c7edd610cd6eccd741c3dcc3441a6d437eea5f310865dd13d30f9"; + sha512.source = "00b0b27e9b97dcca17113d8f314480b2617d18603bf022631f6553f2b8a7c4e7d30e1718cfe4ce1ede7996d7ebe7905d25480c6516df4b3df65403346c050beb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +suftesi = { + revision = 68204; + shortdesc = "A document class for typesetting theses, books and articles"; + stripPrefix = 0; + sha512.run = "627d002ed932ed3f55382b50e4f19c2e98284602bf3095f352f1ad3120f2586b7ebf12653279a98c794e34b97829bf30bea4fbcd06c4657c94cec96be233b3b7"; + sha512.doc = "af2b5317858ab9d19723c668fc6af548fb4bac805cca26e7dac31872e54c35c768c228763681db34722f2a1c4222e2f1fa45e5263b183ddd51e848e643b7f47b"; + sha512.source = "298a0a6a4d627d662c4a8ca6dc7312238dd36dd546c768fc16402fa6f630a224884d8223c30b69abd4f28ae7a19d02870b01ca71608ff37dc548ec3d5f854c95"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2.1"; +}; +sugconf = { + revision = 58752; + shortdesc = "SAS(R) user group conference proceedings document class"; + stripPrefix = 0; + sha512.run = "db7082941e64a24fd7b04fd48dae2b78d67314f7483256278a8d8eceb5aeea77e24bea7e7ebb9e3742fed7cbb4add6a5d97281819ccf307b102b8265d00723f6"; + sha512.doc = "4a64c9ff5c9350b80601052093baf0d9ebddf24de17c9ded5cffb299b94cb6b4e6f0beb03c058b8a7a4c4f7cfea118cf8e95b797881ad9f77e879b228ecc2165"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +superiors = { + revision = 69387; + shortdesc = "Attach superior figures to a font family"; + stripPrefix = 0; + sha512.run = "50c352d7ee3b267ff3c25f93d5ad9d32a80f0f09cb8e802f6426e9d415ebfd8a54d3d07425c2908c75f328309e4d21173feb768c63e931658d151274ef6f953e"; + sha512.doc = "da35e722be66689020ec2052f4e096502ad63121fcb3a55ffdb724d1b557122a401e7bfa8c4c0ea2c6881b0138bd155b1e5baa7886c2e0c7d1b693e56c9e7dc6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +supertabular = { + revision = 53658; + shortdesc = "A multi-page tables package"; + stripPrefix = 0; + sha512.run = "68ff94c82b9986983b0a8b0c1e60301067aa20c92c2576e6d0a9b9060d4db48e2770334ae941b6b7fd1a4914098e2125f324e0d5284da52b523a7616552604be"; + sha512.doc = "0a36abcb782ea20b3c45d5c42a55fb41c04c3707c9c5b0166f90b7494032376d6756f827f1293cf998b56a84192aed36b6224e4abe14646557d130427f3bb63d"; + sha512.source = "1c84cbac59404c9f2e1adca379d24168ee4a7f1639110c3c8c5031a17025efb06608a9e8e703395727d1cc4ddb8de87932af14da71475e16d850b78fd5de0b52"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.1g"; +}; +suppose = { + revision = 59281; + shortdesc = "Abbreviate the word \"Suppose\""; + stripPrefix = 0; + sha512.run = "b78fab6e7784cec1ad8c44c0ea6b2dabf7aeed133ae5dbf9c8044a5fd8af8509b68a1fb615a8bc33459676e4eb6f6d13f097cd689c35acf37beca4750ee09c36"; + sha512.doc = "c59de255274f2a8fb961b57e4c59e7020f990b15a54ef008b251380b63d3564cfab7ce434a3782d3f467561557eca9884745e12f3886416967ad26b0a95b1f5a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.2"; +}; +susy = { + revision = 19440; + shortdesc = "Macros for SuperSymmetry-related work"; + stripPrefix = 0; + sha512.run = "406a172dfb787c833d8d71e74cde627fad5dc168a1be7a71c4d0006e2f0a6625738ec11f99c9215af6973b101e17abe8eb8355206bdaa18ab3fa6328d7ea42bd"; + sha512.doc = "f802ccdadb5ac2bd96ff27396b020798ac023889f751bc3a286392f62341ee6ac50486899f4e633b90b85320f1bbb679dfba98aa3746d01f0220f07cf65549f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +svg = { + revision = 57010; + shortdesc = "Include and extract SVG pictures in LaTeX documents"; + stripPrefix = 0; + sha512.run = "fd2c051969ea85b2e5c2818292128044038003456f8019efc3c6decb7e811f3eeeed6f3505cb661ee2b4768fa7715f5b3aff4583124d6cc99fef5c5f6a2fed77"; + sha512.doc = "84f35fd26786e57a8eea08af996d6edc93116529ab364e2b2e23ea6826748435d8487264438f7ff6b44b6d6975e0f18b1f27599e0e554b3d664055296e8fb0d7"; + sha512.source = "834958e4f8a0d8102ff88af0c499455c9bdcf61b0bd2795e25a07507c55ad6e7a5bcd131bbac48e463bd93b4bf49dee9aebe46a8999d75c24218a332814d5974"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.02k"; +}; +svg-inkscape = { + revision = 32199; + shortdesc = "How to include an SVG image in LaTeX using Inkscape"; + stripPrefix = 0; + sha512.run = "e1708206e6fe85271e729ee8c9bf952f45af662a54ad2e816b449fed263fefd8527529ea777b85a50f736d0ec7875afcb3059ed2ac81afd45c54ccdc687c3979"; + sha512.doc = "609d1a7d2256461a749c3a74ac5dffdb7efec999faa15315872f4e61884933cf47c380bfd8eba53de491494cb498a45ba263dc889fa0fd337c48f82842fa6bdd"; + license = [ "lppl13c" ]; +}; +svgcolor = { + revision = 15878; + shortdesc = "Define SVG named colours"; + stripPrefix = 0; + sha512.run = "617a880e8e94e781819a8ab3a169325e667a18afd83a10f070a56dd9f1813153d8f52cbc3322c264ee249c0e70080421a9e1debf844ecbc7ea6c2368a6ac67e2"; + sha512.doc = "02a28da03f72cd85f30f73282558bd3aa05a82318cc90f56af6ff8ae29e1f205d3c05553598b88ea13206b4d54f64ca36d5a6a8d6f8913e08c185c7bce6011ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +svn = { + revision = 15878; + shortdesc = "Typeset Subversion keywords"; + stripPrefix = 0; + sha512.run = "a64768b2c5931ba6b9e0b910d7bdc1473a7dbc01a70e41fbda46b4064ca1c41592f3d704496199e41ff27ac4d0ccfad56d9d89e536176010e35c1c8f56312454"; + sha512.doc = "123ce3eda16e4a1c44a85c6d2ef2bf4e5f6b9e9d939cf66eee52ad1326f06b35c457f4df054956dc16c169031909f2ea93aca380d2ba080f6049795a841dc34e"; + sha512.source = "0033fe1be2ede6984cbc0397c20187cc03520b5d893f7ae239bb688354d7198c4e96cfed09dcdffe7160769f6dafc9995d77f8f0f9def753048d4ecb8231ee69"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "43"; +}; +svn-multi = { + revision = 64967; + shortdesc = "Subversion keywords in multi-file LaTeX documents"; + sha512.run = "cb2b1c9a95445b1b2cae4b4f8b7d22a417c766b8158a229712a2ecf8b5b2c731c4c4ee348e626a734406487327d7e0288df458329d1231aaa9c63c1283636930"; + sha512.doc = "6fb5e19bc88ab89fb7363587121374f08ebac0d3bc2868e27c43a8deb986cb5b1e82a665adfa56810ff70a49104007b056aefbb3e55cb821e0039eef0bf941eb"; + sha512.source = "b50a0401ac6e0f056fc029ae78ffd8cd4e64bbf677b654c0462d1d160d8f4b2a2895594b8f591fe6aa4acab0c01aa5633af9d9f7a24fbd6f177d2a717cd0f2a4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4d"; +}; +svn-multi.binfiles = [ + "svn-multi" +]; +svn-prov = { + revision = 64967; + shortdesc = "Subversion variants of \Provides... macros"; + stripPrefix = 0; + sha512.run = "319bd5de2870a3c8237aa5013f7807bf3c2c5ef7fa4618a400cd5ab60ec8cb88b94510b0129862c5d98a11e2241f9790f8c84473447df8e21cbe711d52268e98"; + sha512.doc = "01cfb48533e07065f477724efe4c3fcff13691da0393a0d8a9dc9cf4b5d3e3953ce233f8331c1e5857c2259ac6dd7e4859793bb194d750f35ecf3723dd7b4b0d"; + sha512.source = "1e0206e1506082c8ca5ece1e66b9c85650b986e92e5906a96e7156964f3004af2d008815f86c609eba48f02a0750403fa3860ef2a3bc14689140c8826cb3881b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1862"; +}; +svninfo = { + revision = 62157; + shortdesc = "Typeset Subversion keywords"; + stripPrefix = 0; + sha512.run = "ca2e0a3d0a5f4ab6950d5995b39f785ba071294134d947a47ca3e1f7e0bedc69398f9d0fc2162f349a635aa19ce8c963ec7c88d4bed2100d8f3da05219235655"; + sha512.doc = "aa4bd06d31bad0a2441623b80f52702d67fdef03912b6f96058f3a89d00f4601cc4bae76a24f49540169ad30883177d038ddc7dedabd8d643b59df5c94be4a65"; + sha512.source = "f9f65dcc56ae6b9cf2f5cd9dac27e3760f12428bee623e70018a767dbbf0b919178994349051893e52a04de75b8455b1c218b0f779f4a0ae4930480ba0ed24d1"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "0.7.4"; +}; +svrsymbols = { + revision = 50019; + shortdesc = "A font with symbols for use in physics texts"; + stripPrefix = 0; + fontMaps = [ + "Map svrsymbols.map" + ]; + sha512.run = "1fadd5259d527daf316502aae6072865b9c6e2efc1ab92f4bc0c3d1070ca4dd863b8f7366c9e6909b7885858c1745cd723003a9f4bd28e8208889da2c21f18d3"; + sha512.doc = "6ff7b9c1efa4b59c453b42fd37dc66e3c79912ff0bf9765b2745fd0cd946a4cfc4a063fc943d1b5919368f8a5809eef5cb7f3a4bf3b6cbdf8200f42180d21f92"; + sha512.source = "916ca0f14ff1b9ae99fc609c41fa655eef39bb053ad39274dbe43167dbeed06ebbb9990cde6c040fcbf9b432b4ff89651195df094aa9c35bc172e7932917148d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +swebib = { + revision = 15878; + shortdesc = "Swedish bibliography styles"; + stripPrefix = 0; + sha512.run = "c34174a73f2264bd0963bc6932f6ce840a84d3c48ec9aeae9f7f92ce25ce5f55dc2e4c05d1eaee54c18b4c0ef9adcf494310cdf0a3e1d73031910b75a6db30c8"; + sha512.doc = "a3db201554a0b828cfc72d47a22b777fd7b44b25c361a4d8f032cc62658780628e83f6eabfbf342b867fda335c1ddc228347f5fc66651193c8229e0bc6e46f67"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +swfigure = { + revision = 63255; + shortdesc = "Insert large images that do not fit into a single page"; + stripPrefix = 0; + sha512.run = "0cc77bbb379aca7561a6cff50be46dc43a1e064d6d4ea5f5b2115dc5907ceabb012d951c7dc5ee33bf0c8e824eb51a3eac54cd1b31e4dd974d226eb4bdb5ae52"; + sha512.doc = "64f3f91acb388322ab4ea30d4f0c65e029b1c32755e7769d7d4388d4971f518459106acbde1b4c4b0cd3d4796769289aecaac34be32383778d913cc628d9f57a"; + sha512.source = "02a5c33997f249a3f41065af3187516b27621c65f2b2ec82020b90b721221a2cc4c52e9b8ed65ae6d89559fbceb51da9f7eef00514bce7040822b280c3d6e505"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9.20"; +}; +swimgraf = { + revision = 25446; + shortdesc = "Graphical/textual representations of swimming performances"; + stripPrefix = 0; + sha512.run = "d4bd2097892db6467ae1c80032e4ff5f39e3da81f45ecf472d350297687609ff37b8498de9e44405ad9c7dd7b483599c844672233d289c6cc4ed1e2b9e2bb842"; + sha512.doc = "2394080a393e2a0cc8e8299dc4debbcc7548186a714454c87662c22a371308c7e8e6705c9dcbf6eca632f2f80788a733f9d5a9f3fddb2f46167fd50654c5bcdc"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +swrule = { + revision = 54267; + shortdesc = "Lines thicker in the middle than at the ends"; + stripPrefix = 0; + sha512.run = "fbb2a8fd060e41340a876595310b54d069cf808d4e2eacba0d913732fe45a3cea698c1e6e229dd152666f7b509eca424d17378c74ad14edd0d5f08ec85c6c65a"; + hasRunfiles = true; + license = [ "free" ]; +}; +swungdash = { + revision = 64204; + shortdesc = "Typeset a swung dash in LaTeX"; + stripPrefix = 0; + sha512.run = "fbfef096e662d2987dd9e4989fad28a93387722b29bf7974e47cb3a5c13b535df63113cfab6883d2c3c98cfb4b3272ad1de6c961e2818dab5e59661ca5d14630"; + sha512.doc = "6bb0c45931d2d028d5b337b7295e5645fb709eee6c30c3cf3bc539c7142cd8fa4a9543ce70a54cec9b12e7cb565366df674da7b85d32a24839d8bdd0d1cdee10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +syllogism = { + revision = 15878; + shortdesc = "Typeset syllogisms in LaTeX"; + stripPrefix = 0; + sha512.run = "6f74e300794afa114da0f498bf70a389500bd2346bd0bd3d9ecf0f30d6167bfc9ea094024039775c649f5feeaa4b62384072ff26fc0c0fb426634912f440999a"; + sha512.doc = "1d2f3cfb453a4964b0e64a486a7c466731fec93e3a4210b216ebe9bc311923f055bbb903c26b5177c34a16a343e5f4e1a0643c7f6bf635dc0762182185f6e362"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +symbats3 = { + revision = 63833; + shortdesc = "Macros to use the Symbats3 dingbats fonts"; + stripPrefix = 0; + sha512.run = "bf967082ea372ad1c752b6f4bc4201c0617390f23517cfc00fd5fc802d6e728f4ef81c1787fa86bd4aac4f8adeff89127b6bf1615b70f4733bd8d5b203b8a033"; + sha512.doc = "e7a1a3f915000ad773f47a5529fc0aa97fa6dc2a56feefb8ae55815580301704a3c49eb7ae92b7f1248fd7115d7d55a54a6f2b38f05825be57b1e155ab8997ee"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +symbol = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map usy.map" + ]; + sha512.run = "1a2d3239cf7c9910b19db527d5c2b43af2b399114b3186505e790a139ae5ef82c2ff1ecd5adc858a46febaf2e46e028037ba65bd5b84fec0737edd89d5061c09"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +sympycalc = { + revision = 67087; + shortdesc = "Work with SymPy and PyLuaTeX"; + stripPrefix = 0; + sha512.run = "98c46fc7727bbb8fdda4038f56482d5fbf1c88e3e869b5865f45392dfbeb5be545f754e6ba109b55e66c96d6cf733ac97b472edbd38e3c21c2f937ac9136f19f"; + sha512.doc = "52d163772f25442b32a5ac240d15ab2d606e4907c79682cd37ff45389beb41fc2eaefec9b85d0736e3490d0f4cd1d60a42091cf24aba1ede8aded1cf7a786a0a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +sympytexpackage = { + revision = 57090; + shortdesc = "Include symbolic computation (using sympy) in documents"; + stripPrefix = 0; + sha512.run = "9a1fa177703dbed088861ff47e5b53f3c0f433abe15d471d181368c52e0cdae7350090ce5cb3c25d4ca816d1132eb009359977ada3f3c0b5c3b80bc0873f8110"; + sha512.doc = "0013c9c1e21f70e36e6b30f12d777f9f78b727ee1beb2f893133248fffb75f0bc4523c0787c0e292f197ce1c01b5f37b34c33ae97ed713bd900848657d803c59"; + sha512.source = "45df3251efd8a8e5669f72b83fc8c07c9df777ec90bdae9b8a92ff3c1875fe623574365f69162cc4c2f89e4fc7ea32dd1ac0ce164ee804799496be25466a12bc"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "0.3"; +}; +synctex = { + revision = 66203; + shortdesc = "engine-level feature synchronizing output and source"; + sha512.run = "cbe1f8c6d64619f742003c01566d55b675724f5d03681ad53dc1f58ff7314af88000ba25ea74e4fcfb07ece6160be6976ac8e69a9a1b524f223f5b80f350deb0"; + sha512.doc = "14e1f266182ee0be47a7b3841435f79594cdeb959245e6226520e81248691beeaa73f365c1112ef3bb4eacf4ca77e55265bd0d13c190858144bdc3064fa88a59"; + hasManpages = true; +}; +synctex.binfiles = [ + "synctex" +]; +synproof = { + revision = 15878; + shortdesc = "Easy drawing of syntactic proofs"; + stripPrefix = 0; + sha512.run = "934235e8eb4ca51a906ca287c5524cc3b0b69c649b47a9fa0fc2c9fd664199eb6fce835d435e97e0b24bd0662ee68b8db471e3546c4bdb402bfcc19b1fd02c50"; + sha512.doc = "9a12fab29c7c0118bd97a7af1585ae97c5086e7a1e9529624b7fa43a723151e00537b9488a42628d7f6e93b87d092fe0dd18476c7d232e3ee74597186a92585b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +syntax = { + revision = 15878; + shortdesc = "Creation of syntax diagrams"; + stripPrefix = 0; + sha512.run = "be1e049a98cd7e45cec9675e707575107af9c613028012b8fbfa658c6c9cbbac5782d3a7111f37edc719fb90e7c168c9a98a3d30a4c997b6ac4ed0691fc7fdc3"; + sha512.doc = "7d0754c08081abc9867d0d40fc910ae5f8b34518004bf698dddc184f0b514d75a7feb3085870cf8322b3d6f3bc4c32ab50acdaeb56b574bf41604a18c23a6656"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +syntaxdi = { + revision = 56685; + shortdesc = "Create \"railroad\" syntax diagrams"; + stripPrefix = 0; + sha512.run = "79d5df672a25ed58919b7e054be992986edc8484348388d5eb318dfa99fc55ad3c452d6924c857c1bfb46361d59fe1d4e38cf84c9cfecd241f7d0c9d184f7995"; + sha512.doc = "a7c370c6b6c3877098e5cb216c4e82d382dfba0627de6abbca8f4e1bc6f94f53f11bac7456be213fa632d501dbabe910ef94680cb2cb20549c292ec5ffe79451"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.2"; +}; +syntrace = { + revision = 15878; + shortdesc = "Labels for tracing in a syntax tree"; + stripPrefix = 0; + sha512.run = "613c70859eb0c710c43fa4a62fe8b8d38a407ffe94c532d80927d00fd47c17b6570040f5d9ace5035f4dc53deef97419f52ecdf021ab11d5629445153b85ebd2"; + sha512.doc = "0349aba5e1455a6676cda43c7981677cfadf77b9898a79d90104808e77cd351f219392a91f83b670f7f1801babf53854f8719c32b8da112fde849b7b120e2327"; + sha512.source = "a6b5e08c1eae9b6c631f2d2316bf0d2afba452be7f8aed0d6f9724dedc7d50785ef09e1f29986d2cf869988e3b5c59332cd2b44d185b298e59333131413314f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +synttree = { + revision = 16252; + shortdesc = "Typeset syntactic trees"; + stripPrefix = 0; + sha512.run = "3fa23536373a41957d985e5a0aac744473459d195c1e7e00e60f2b4aeab15d8f150bc76fab05068d5ae4994ce52ba4dc35380ab042cc9917a23962b2f0a7094a"; + sha512.doc = "164c74dfacdb0cafab112d270b15ad0b7c58be0e8d65c5ce08f80182971b63026584c5c071988d9b7053f99b9d81c893f8b103a3145f1128ffad880259a16264"; + sha512.source = "3fcb8ccf6da19cb01f6a80f97bf98a84c86ca7d06a95b193cbb4b33968c80cd842554ab8d5a9127af0434b9abc83f2cbff428bf1bb976fba01e56d5770f6e20d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.2"; +}; +systeme = { + revision = 66655; + shortdesc = "Format systems of equations"; + stripPrefix = 0; + sha512.run = "ed93847bd9d5b9158026e364d98f7102e4040d19f8fe198565b8e6a9573ba1796a89b69f76dae76c40acd9ac96392aa75d2ccc006f8419b699f8f4c7b35c737a"; + sha512.doc = "97bc9240c34251e6b3cf0fe53fb5c5914e0bfc2cf852ca70aaa72213ac9e5ac7d55738f63e73aa8ebc4e320a3874b3ec84c3a0465b188c2fa263648306faeaee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.34"; +}; +t-angles = { + revision = 15878; + shortdesc = "Draw tangles, trees, Hopf algebra operations and other pictures"; + stripPrefix = 0; + sha512.run = "dae9953288c0067e233ca26d2d5e7ea32207790eb16bcff2f0f56180dd9a65e70c234de48652d053a858ec92940c3c5fea10c699c697b65a249a8c84fa050b71"; + sha512.doc = "32dc9adfda93bee5e61eb062e6970f6e093a09016a6ddf32f82d110b7717916fcc92f961c8be682958d1f3f345e02ad49cde4a85ad4a0d0add08a0bc80109d8f"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +t1utils = { + revision = 57972; + shortdesc = "Simple Type 1 font manipulation programs"; + sha512.run = "9065b22ec60747b603c758c3bae67ff06759ebf97c979028ac940a1b773e3a20f5f249a4a61b7564038dcda3c72ef635315e64a3b8692501cc8f6c30ff7fa989"; + sha512.doc = "34eacd2f14282108ba41d49cc68c066e12383c4873c9cb8a2389300f9c5685b3f3d7d0626e33008d28c229f8311daf2404b2bfa164fa550184f1e856163ab386"; + hasManpages = true; + license = [ "publicDomain" ]; +}; +t1utils.binfiles = [ + "t1ascii" + "t1asm" + "t1binary" + "t1disasm" + "t1mac" + "t1unmac" +]; +t2 = { + revision = 47870; + shortdesc = "Support for using T2 encoding"; + stripPrefix = 0; + sha512.run = "9a47581909735a9ba582b71a132c925beab45cbfeb0201c93d138c35670fdf65580e6dc20d9498458e01eba7088c81d67cce329465e4763235e3f3404959c5c6"; + sha512.doc = "8c30658eab02eb576963a6a2f722b143444abf5d286473f165b6cab84c75ef703462a1841121a5d12cf822b150ce8c23a96256754a2d662fbe6c451a058333ef"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tabbing = { + revision = 59715; + shortdesc = "Tabbing with accented letters"; + stripPrefix = 0; + sha512.run = "dcb4bf112afc6a2221030ee7cf0f0b3043dd12a178195ba57afd10702b3efd65948d58607334dd9445270cf69862011d97b72a0f8ca5868748174b1462988132"; + sha512.doc = "e056f857e62c1fe3f6b0183c0929e617525586068c62beee604b904695274d4c271d4b973a8a8c9b046792227df389a61591b528a8a4c1cb5c9916618206de48"; + sha512.source = "7ed54e677b3dbd8e10e85e84c69791339fefc223a753164c0e9aa8c47301ded6c0737cf62b25cd9d3b152eb63bc32406d9a8a86a620b0e8e00d562ee795f6aa8"; + hasRunfiles = true; + license = [ "lppl1" ]; +}; +tabfigures = { + revision = 25202; + shortdesc = "Maintain vertical alignment of figures"; + stripPrefix = 0; + sha512.run = "d2a1fe985a74427888995437beaafa62b5def851d6f2a7788ead9cddbfcefd7206366a6711f29e85d2705c0d787bfc88accc56c93b827fa372ebd9cfc562f2c6"; + sha512.doc = "5b2c7c5bd350c3dba68117151f3cfd6eac8f0e7ed602b44406ff9d15a79dd7de7e0ec303b1163e3c882412c86adc48afac6c9653cf1fbff86e7cf6a7ce852c94"; + sha512.source = "78602de26e50e0d9ee43b8289a96a3639904bdf79983d4633d6c11af1c8215d1e77649f640ecc6b3f37cce30e6cc6b4c204e2cec58a3454c8b8486104eb17922"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +table-fct = { + revision = 41849; + shortdesc = "Draw a variations table of functions and a convexity table of its graph"; + stripPrefix = 0; + sha512.run = "a6300b1989f536fecb27d300bc0b27afd93f7f72b894fdb87bae5b0756ab241985ee2e5b4c0b68d1b2cc5611aafdb62b300fe40e2a08df5f6b11774f13309756"; + sha512.doc = "a9108cee93e6c7250643636619f923659d468a2148f5b04168fb08738d85e794c1050fef8152fb95d114551f6967c955f3d6f548e1ede37711b98b1362e9910a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +tableaux = { + revision = 42413; + shortdesc = "Construct tables of signs and variations"; + stripPrefix = 0; + sha512.run = "1846fe9da749b92700be07c094556fd296d47123df3a5d6823570056e6ce2ca8ef365b70f6ab2a8577602d1be338867fd2610403f89729dd51632d404951f84f"; + sha512.doc = "cfa58a8e76dd61659f6c13ea6b3f97ae484715b735028c513576312dfa7dfe92c8c15a0858077e3ff2399807274dd5a836182ea65b948a976f6384bd8d1b19d6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tablefootnote = { + revision = 32804; + shortdesc = "Permit footnotes in tables"; + stripPrefix = 0; + sha512.run = "90812cecdbb464592b17b8faf4d81b221844a354b0a3d3ea30cb72d0b56c4ff7eee701caf113e13586315ce846d30de6ce8d5028966f2c310527e34e8ec90464"; + sha512.doc = "712c1ab696f5924058f4ea6ce12e3ff14fcbf79a78328259c4b9acfdaad33e9e4dddf36dbb322598f09a8fa3ca75d68b474fe1a4bcd4d25752704e0c4e6ba5d7"; + sha512.source = "70456471a5997592668198463d1e44af464e9c24619c09d186c952c5afe2bc5171d5c29442820b267d1782a966fbe63997694427f1c870d14ec6194ac99ded52"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1c"; +}; +tableof = { + revision = 59837; + shortdesc = "Tagging tables of contents"; + stripPrefix = 0; + sha512.run = "e577e1e8df3fd1ad12a2cbfcd05ffb1184fcd3555124986481c62a33ed7f5789bf1858a1370888887d2aae0d2a508a891e5e67bb0a4a1d9a924b3817c2d9e234"; + sha512.doc = "bd568b16c6e708e4d0ee9810ba97f8363c842c22156dc90a257fdb0319eb49cab4f6ac9faee0700687a8a6ee54ea02b9660635cfeddd5275365d9c7f38218784"; + sha512.source = "5086e314c042757a5e90bcbde9fdbcedeee689f89524df43ab390eefc7bf10eea6a9c5bc83b359b00c3ae351fa10f8e8a64b356adb8e7131d48568e06a8ed0d3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4c"; +}; +tablists = { + revision = 15878; + shortdesc = "Tabulated lists of short items"; + stripPrefix = 0; + sha512.run = "ed0ebef871c7bdffe93e2cc38b823dd13376c53e4388daa8aa1198cb213010594c9bfe468ec0e42901df2dbd1b938e7f037cf49ef2cf6d9ff3bc53502b220a14"; + sha512.doc = "afcfa520702fd873b4deb7c4acfbd4290262a0df133c87f01698d20b8d17fd5b5932384124f49fb4d90155da284b873bb3ee1a2281955449f8ca2f278c38d39f"; + sha512.source = "34ff94c3adfff4188daf4ff906721833dd925c84f107867d7931fe66c58ea8a8438737065f64a9aaf57acb0eeac9e17e8388dee7a0af93476f5add226d4481e7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0e"; +}; +tablor = { + revision = 31855; + shortdesc = "Create tables of signs and of variations"; + stripPrefix = 0; + sha512.run = "64169a74a787f8877d41d5e32c42e5659950854a1e20cc05103b3ed58c54fb800a9af0701a40a6c5b75553b86d675fbda51948106cac464785c3d46aac77c979"; + sha512.doc = "77a6d1b47337f015dbfd39074e1dae417c3bea3c9635955c6518d691ff336854cdd7587af54640282b45f5bf3885044d3b6789a0a73f39a726aeaf0afd27c883"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.07-g"; +}; +tabls = { + revision = 17255; + shortdesc = "Better vertical spacing in tables and arrays"; + stripPrefix = 0; + sha512.run = "1a341985ae61f047694470d19d4e192b4f4e01c0bb595d91b1f80080eed3077be4e40b431cc05b1bb482f18c30bf36e6076542f2cf37a49dd6b065b0fe044bca"; + sha512.doc = "f458058964660b2b1ff2a61ff8ff2ffcfe7ab103e9714cb1e7c307a8bd39c5a1a6990683c4ed7aa401cbe9b9dcc083dfbadd80a5aa00bcd64c0fb72638cf71f2"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.5"; +}; +tablvar = { + revision = 69212; + shortdesc = "Typesetting pretty tables of signs and variations according to French usage"; + stripPrefix = 0; + sha512.run = "0ecb62b92529825d893d5ae686aa7d66576da1915ff760ae80466e9c76c2951f1300e72b3bf039a61997ebfaa9f72a8c56fa58f53c65d0a75bbac71d830dfcbe"; + sha512.doc = "7cfea26a1abda9aa3642c5d48c763184fc0f7a18b77fb72b8083c7271847b6d7ce3bad33fca96f082abd171f5f013eafbed51bd84b3ec046d82be13c11043f2a"; + sha512.source = "871139aa0cecc116ef7e3bfe6cfd048cb804ccb108c18b6fd71bafdc02bfbce56d297b111ddff348e92f44fbe1a69e06a5be3693386f02766475004d78e54d06"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +tabriz-thesis = { + revision = 51729; + shortdesc = "A template for the University of Tabriz"; + stripPrefix = 0; + sha512.run = "b1e93632159fa6b5ce46a13b6d2bbd3115a09fd7c6908a8465934e37feb0633eea827fa1ba8521d91a0d30492135a428463f6aa99cca0c6fe7db640d1310c6ae"; + sha512.doc = "e56f4a93c7cdc68c227791a21fbb06e44193e9681e677f383d19994c714bdb8d0487f9550c0c94a78890f54c7342aa777349770b4ad04b58e191fa62b31a3462"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +tabstackengine = { + revision = 46848; + shortdesc = "\"Tabbing\" front-end to stackengine"; + stripPrefix = 0; + sha512.run = "2f6245d65a7d711d598b894c8acfd8d2a032ae210eabfa219934e8fa086bbe3edef81e73092234e5528f9f62a6856546aaec7eafe5572eded155ca8fa5fc3999"; + sha512.doc = "6ce0b2ec254e44bca6f6cb746d4e3762735e9bb85e561df7628d3a2e2e35ddaac1635c825f27900d06badeb310535e73c84495e24748c1181825fd61fb03105d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.10"; +}; +tabto-generic = { + revision = 15878; + shortdesc = "\"Tab\" to a measured position in the line"; + stripPrefix = 0; + sha512.run = "5b3bd8081ec6800c96ce4b4cbdd8091578ad1df2b625fb2792202a6c31f3f126d612f99f04802d82d490cb529e03e63f98b01c7842ec0df69b48c2fc289108fa"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +tabto-ltx = { + revision = 54080; + shortdesc = "\"Tab\" to a measured position in the line"; + stripPrefix = 0; + sha512.run = "8654a7e3b49bbfe6e861a6f757d8553f78149e7187809b03f6854f2173143e10195385d9e8b35510e49a5f941b27a5796070d6db1183b58e4eb71c452d4a34e7"; + sha512.doc = "35e98681472b9d6fefa25a534385133d630f072a75a045c9adfc4b0e775095609ece27322e3fe8af451db03c0ac3b63141c3cc7272924ff758a8985389040a31"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +tabu = { + revision = 61719; + shortdesc = "Flexible LaTeX tabulars"; + stripPrefix = 0; + deps = [ + "varwidth" + ]; + sha512.run = "b40dc1e91084912df03175a6529223c6f24ae3c0ec77cfb8f1f8625816ea78c044c8f01f1b473e84696421d6772d9201fa4b59aa93e6f014b73598d16c09a6cd"; + sha512.doc = "5ef0a71d643bf5069a622aa8c807bf87db7445caab1f17b5202ee25ddab5368e94e796eb16de4fb183f294cedc232d48cbdba68f45d2451e01a2483d6869822d"; + sha512.source = "7c80ee8d25933e5d1c579357cffdf7177b0a419a847ca1e671cb1dda19fbde9b3680658df6b814d5d92953dd13eeee5100a5aa2fdb5fec3cbc1e213545cb3a78"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.9"; +}; +tabularborder = { + revision = 17885; + shortdesc = "Remove excess space at left and right of tabular"; + stripPrefix = 0; + sha512.run = "a30f668ea84238df674c079fea6b05878776b26b4f6465385e26b01b16181825a8cc20767fa45eda8e7870d272875bc9664aed145885dd655d15258aa072ebb7"; + sha512.doc = "f0376dfe99c68523332be0e83c0a186d7e3051862fac22785b4ba1273673fb9b1776654a127ba1c617af67063763e5837723ca2f23b3f7dd012628bd40ad0604"; + sha512.source = "862ea87bf23f2e4f42bc15fb82d9e417b4e51d7fbd555383cb985892b9b40734b38dc4f0dfb09790040c64791beb2cb2c6bbd2df9373c75438929be011748978"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0a"; +}; +tabularcalc = { + revision = 15878; + shortdesc = "Calculate formulas in a tabular environment"; + stripPrefix = 0; + sha512.run = "7535398538d6802c4e70858028ce6e7414aa8a88336e71f90f7f909d015bf896eeb5e6652cc5bc5a2bb384bc25d280d8cd6506f7ba05823c20dda04fb3adf0ba"; + sha512.doc = "7e35cad1507cfb62117aaddae77c3faa5d19c4e320193afa0054415e84d49833ba64afdf743b6241d611dbb4d45c6a532779293924f20b6c748659a361d6f30d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +tabularew = { + revision = 15878; + shortdesc = "A variation on the tabular environment"; + stripPrefix = 0; + sha512.run = "512851ce7641e0904dd25ab8a5cd5ac0dd281154067e09c4389fa3d6f330d30099dc60b252de4ebee52a2cf28d6b7d10bcf63fe4ab1472238db35754adc1dba6"; + sha512.doc = "4b5b8aca9d9be8cc6618d9393278f8da2069341a982cf6cda9e561b64bc158e5c08cf9257b592f82134cd74ce0b69682e15339d9068d9fedcdb26626dc2b8a7b"; + sha512.source = "9779876bfc65936043b0b4918784888acc68a8e8aec3b5eab6eea5cba3fea10ff0f696d1c38f68b37227cc086ca519630a96b945b33e3c1b853ee8ad95ec08bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +tabularray = { + revision = 69926; + shortdesc = "Typeset tabulars and arrays with LaTeX3"; + stripPrefix = 0; + sha512.run = "bfbce523764d979d0ab24992be6b0c79dcc20dabbdab195496f11e21f01c349fcf0dff8f400b6833dc046a74e27468b496b99fb65d1aeb820d7c4077b21525ee"; + sha512.doc = "2b58577fde437018269468d81a9f50e39b6cd36803874dd2f09e7fe0ed0fc2f63c6bc195fc433b997e65dd43ae15cfbfeaadee8f46fe63bd32bc3ddf91fd8507"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2024A"; +}; +tabulary = { + revision = 34368; + shortdesc = "Tabular with variable width columns balanced"; + stripPrefix = 0; + sha512.run = "2c873a3840d8bf06a095ff3106b317ae6acfb8498d47b0229a37e247e0e0a9df80300759d65d13ebc9defb15d1cde0aa1e956d2f88bebab3311af459be47df0a"; + sha512.doc = "b619c6b3dce1421ad4f06ab5e6f0ecaa6dc4f55076b66303a4e5409b42a4a9e34d218251177234dc0f3dac13046638a75623db0094978badc4db93083660f5e9"; + sha512.source = "aa075526ddc2f793676ff45e9d37f02251660cec33b3f4a74da23e725181e48b2103fef16adcd6d622ea2c422a5fda1d46cd9fa1c35bbd72f06f77d05f3b4c58"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10"; +}; +tabvar = { + revision = 63921; + shortdesc = "Typesetting tables showing variations of functions"; + stripPrefix = 0; + fontMaps = [ + "Map tabvar.map" + ]; + sha512.run = "255b93a8eda59386b798e85741422c529903acfc0d06cb77f4b128c2e32e4a68ef32097888e921397c3e22434b581de30bb79c8cc6dc8357eaef94f26e6da04f"; + sha512.doc = "117158275aef7f9e5ee3e423e65d9ada5c2f6d28b660941a3d5d80ebb9716f4e35658e070911280e375b29290e2056ad3521acefa1eabfeda95ca9051d64a0c4"; + sha512.source = "48fd599f93d6a5310ebb7dab44aedc9ac017878bbd85d2f1bdb21a676ba95ce717be96f8a26f24d67c4ac4530d233fa8b9842f13fb124a8cc8ce3badf44c6bb8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.8"; +}; +tagging = { + revision = 52064; + shortdesc = "Document configuration with tags"; + stripPrefix = 0; + sha512.run = "8947ad0dc443891e0b5a395a27d2857acb5879821443ff64cb0b15b99eea7a69401ba165b26565bac1b0036032d49241504ea2e008106a85cdd896aa28abd9e4"; + sha512.doc = "06d470576136a96edb69bf595e55f16416da552a5f4a84980ff5393689cb58246d4fbe62b979c22b85c5abc58b926d9be63cd0ec734b43c653a0d0a5c4b04d8a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0.1"; +}; +tagpair = { + revision = 42138; + shortdesc = "Word-by-word glosses, translations, and bibliographic attributions"; + stripPrefix = 0; + sha512.run = "146c2e957965fb7ad9976a4b3b6c40d28b8d0cdaf0c8b9627f51dd55ba88b32ad7490bf000bb853a416b5dcc091243b9d6e92999431327a05879adcf89809d7f"; + sha512.doc = "af9dcc1c1dd0a5e44d3f436569cf5d36f8154b70219340dd914feb3d8c036164f1bd70eeb6819bb51a06c0f5c5dcab1b3ede8be4b4d22b2536529474d0d841ab"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +tagpdf = { + revision = 70259; + shortdesc = "Tools for experimenting with tagging using pdfLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "cf20cc71bb96599498e470f62f125a52f8457cd6a5f150a171c51c379c9d75d6ee3116d09a281dc0c2a079182a3ccb70c8eb12d5f8679b4f8839f63ce4da95fe"; + sha512.doc = "41c3de45c71f44af9c022c0a329b9e6e34956f15884d6da96373dba008b14058c851f7c51265b0f408f5154233a9e84979395a9a970aee36ac4d465209572722"; + sha512.source = "bddd07551ca8dbb27da3cf82b5caa8a6a89de15b4d13d50997ac0854e4e9b2e480cb371f7843af960f698ecb6f19ae376298fac3560488c3072b141fa1ccae75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.98x"; +}; +talk = { + revision = 42428; + shortdesc = "A LaTeX class for presentations"; + stripPrefix = 0; + sha512.run = "371c640254994616744b2bd0c9b4040415392bb2a3adfbe5f4656faaea5bf3e7d2d4ab35373a65a857fd57112f7fc628321492d5bf7c5b052e0026c277663d7d"; + sha512.doc = "d6a641789923559a94b0077d718e56258804caa1dec0c9ea0f9d010e92ffc361884664ac22b07b95d20f464d18ac76301a718430d8f1ee30172489cae3b844ae"; + sha512.source = "10661b5ee41914bdc60b5ab38c887087d6529b976a3acdbf95bf80160c6e432fe6f8a4d6030711f5672f8aea564fd23ada09f92b0e3a2a05ede903026d24bb36"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +talos = { + revision = 61820; + shortdesc = "A Greek cult font from the eighties"; + stripPrefix = 0; + sha512.run = "50a35159c65afa43900ee8633d2b86effa5aec6a430f2e8fa85f77442da35b140012b27959155564e29286aba465d9bab17c9f5ce5ec0a889ec4ed5dff1b4dcb"; + sha512.doc = "9bdbd72f86e0b957580bb008ba349eb428721913010e9fe2cd9ee9b01733d6259914712b60a4a7f0f5804041e6cf876d8bdda2910de1b191715c1d9c8d8fbf77"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "1.0"; +}; +tamefloats = { + revision = 27345; + shortdesc = "Experimentally use \holdinginserts with LaTeX floats"; + stripPrefix = 0; + sha512.run = "bd45962a9caa5b098b6a6a5c0bd3fb964e13cf2744a5fc960a97910183799d532aba24d5f4774ac29eef14bf1439e285010b2e22641167c826d5a36262fc39ef"; + sha512.doc = "2b9d013fcb93682e9be0fb1758fc871b4784eef72a0892383a35073aa177ac29acfda5e54b6a919379b43a3dd0fb0b22dd44476857665efb59b2e9cf27bb679a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.42"; +}; +tamethebeast = { + revision = 15878; + shortdesc = "A manual about bibliographies and especially BibTeX"; + stripPrefix = 0; + sha512.run = "75a71590f1d905bd2a78b508d66936975eeacbfa32e850f599e94efa92da2b043edb8b0899b7027268fa131d94283c13432d4c4126afb79d1615bd538af52436"; + sha512.doc = "0df79f434714deefd60b9b9d32dfbd47ac7e560c26ec0d02465538eefbc779f0252aef235ae2e0a2d2d634d618bb52c73b31c229b5245866239776c742ebe69a"; + license = [ "lppl13c" ]; + version = "1.4"; +}; +tangocolors = { + revision = 66733; + shortdesc = "Use colors from the Tango color palette"; + stripPrefix = 0; + sha512.run = "f33e7b7bf60f7e10f6b58e24a53c374ffe84a48a44bd6e0259dd741c91f94e61f71c6e6689e204017eff1b0050aba4e6eb5715b3978ec633ab0fb41317b1c835"; + sha512.doc = "051a1f028e4e77eb78a11dda00fa950f9405a4703dfde7fa61318482ece12ba16e16ed0dd035532cd272cf3d66efe03d212f44c03ffa342db76ead6de1a5a2ef"; + sha512.source = "d88a247cec1928a8178d189b812175df0a6f861f829fac382c952c0e1d6a5cd3ddcf4216e88a50676c831b1940d3593dc1e441bc45b827591039a13a31f27aa9"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "0.3"; +}; +tangramtikz = { + revision = 66183; + shortdesc = "Tangram puzzles, with TikZ"; + stripPrefix = 0; + sha512.run = "81446f01dd97ef332003f8cce4becb670fe3fa284e540c0dcefd6627b03efcc87874d12c7c7e399947a269cd4fd66deff2064cd1ba64cd34d6cac2b4c587e802"; + sha512.doc = "45435423e7b0a7d7aaf9db5cdbc682b9f62721b7fb333c64cd76a773fd67bb7faebe1bb11a6424c15a495f2c2269a78698a7846f2e8902c16023f2af91c9be9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.5"; +}; +tap = { + revision = 31731; + shortdesc = "TeX macros for typesetting complex tables"; + stripPrefix = 0; + sha512.run = "07ca34ae47976c65deba5443052001406390befb6dc675af7651141505f088e2f67f39648f14a94f70788eda79221efb05c2246d1991811e697e88c7408f6cf6"; + sha512.doc = "a61b861cdac25c0d8c7d48f67abb9eed88458d0d55e8afb706adabfbed0d1e7c7159fcf000b8012885f82f849ee965bf6a2607f1b67f2d9191f59f8538147230"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "0.77"; +}; +tapir = { + revision = 20484; + shortdesc = "A simple geometrical font"; + stripPrefix = 0; + sha512.run = "f3d93c9ad813008fa72cbe317d244bca9a70855c20f327d22d1720b79d70019af0f5d8aef237fc78a598a545f44a4612f1e5a7622b34247044ab230bd42eed5d"; + sha512.doc = "a32573ba9df3d0b30e796f7bdd03e63ba8a96559380895b8db2d33fd9812c8b781b75d19a12a24405c52df13acd9a5f2e925da64b019e92a124d143345bb5bb9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2"; +}; +tasks = { + revision = 61541; + shortdesc = "Horizontally columned lists"; + stripPrefix = 0; + sha512.run = "0625dd459eaf53f842f6c36a550808c3efa8004a76cf25bc892b4c50a640ba588c2d069ce8df10f5c8febf5461390517357040b8a472532fd1f9b9ceddd9e5c3"; + sha512.doc = "a3240edd6bd7e87b7e1b6292fc227e166b54cbda7f130dc5f03c92707577a9b51f4da5377375419feda6a91a710f48b787dc3da90a1befe1d1328ea9a799f649"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4a"; +}; +tblr-extras = { + revision = 69776; + shortdesc = "Extra libraries for tabularray for caption and babel compatibility"; + stripPrefix = 0; + sha512.run = "d47a63520ae3b3d8db6054357bace701b890d2b6c325d620d69d3185867b3c0092dc9702fdea4a84b56a3e192a9e01c083d3c449cc597877a8efa1abe9f6784c"; + sha512.doc = "c4f99c06e5ebea7bc88806252e8182cff3282ce6d3eb0a1a71cea97bb132304049a4077c57d0a0d0bc8ea20c20e63b4299cad0d9c06b49157ebcaa2e85d3af5b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tcldoc = { + revision = 22018; + shortdesc = "Doc/docstrip for tcl"; + stripPrefix = 0; + sha512.run = "82348df3f6dcedc17a3cd50f709d01b1f2b0e4be9345e63d40ee6ad2aff908f97c7d19d586431e3fe8399a8d076505ceaadb5afe0116093240a6e59a335934c9"; + sha512.doc = "61f24f628c2b62c02e08e1a2a3a2fd917d057baaf977e7837b1f62e4331e370b83f8a0b00e679c86ddb1893d21af13211185502ed7bb19699d4f33356d3a3a0d"; + sha512.source = "44a8d3661061ab7dd828fe1cfa8342384e2cd20f5338d54fb0a79516a2cf686a3a6d2a1648d18a4d0c1395a60fe8f8a7b5af0d0c2edc38385852117f408f9e26"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.40"; +}; +tcolorbox = { + revision = 69370; + shortdesc = "Coloured boxes, for LaTeX examples and theorems, etc"; + stripPrefix = 0; + sha512.run = "f62323c290e39f10555df66bfe43a3a199f99fd5ee81c13e450cab4736c805a21cd3d85ae710ccbccbcc552d5e0370245600a5e58e605d6b3d35a3fefa2a6fe0"; + sha512.doc = "7f4f312fee029753decd7456a6e2d8bc829484282f93d245e73a3ae706f7c948091694c05bd2b4f18982b4ed11662ec1868ef0dfd7bab3f35c15a1c1d486f41e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.2.0"; +}; +tdclock = { + revision = 33043; + shortdesc = "A ticking digital clock package for PDF output"; + stripPrefix = 0; + sha512.run = "29e2e50d9fa432b08ea730b8a12228cd2bd3eefe61946e576a262bab06a966c0b28c13d48b1074a838a1a567f9797a943282d17e936db146f15e7631261761fe"; + sha512.doc = "139c82690e2c9b695a10a6f3e6f94a54c3ae4d4a929ddc18763e248114926554206fb4c007ed758695476de3750ffc1dce3db75efdf2598434f27abd1ac84baa"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "2.5"; +}; +tds = { + revision = 64477; + shortdesc = "The TeX Directory Structure standard"; + stripPrefix = 0; + sha512.run = "b03911aa9711eb5eeed77c026c4bbcf952da80322b855ac631e78c07a48ad2ff1a4afdd6e25a00257d1b70e054645f07f65c98fe74f6b1389be46625f5eb8487"; + sha512.doc = "f4078e3b1693fedcbe139b67c50824845644a2b1e57dd27f9e46e44504d8fe8ac0ca706590e9149c06e71794a188b20777bfd6bf1afe85f16c806ba4f9b99cd8"; + hasInfo = true; + license = [ "free" ]; + version = "1.1"; +}; +tdsfrmath = { + revision = 15878; + shortdesc = "Macros for French teachers of mathematics"; + stripPrefix = 0; + sha512.run = "f2c7a19dc327230f46320c695eaf40e9ff17088a709e38ec7f8de23f5c0cbeb18f606bd41625a1229734dacc80edba9d052c21620f7cdf213f60e915b6128010"; + sha512.doc = "9b0e747f90b75f372f04eddfb1c17dc73c3ef6a95d576077790b23bb496cee07afd3af5d1a53581872255c4e71b933949beae909591d0e1c407d9efc3f1d227d"; + sha512.source = "f44f98be464973ef3596d6e0d77e508280b597e4010b2c94620aad0ff950c8328ba1d4bbcf22e0f71f091c311d9b99dd979c73c182debeedd90ab14bea9e1d7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +technics = { + revision = 29349; + shortdesc = "A package to format technical documents"; + stripPrefix = 0; + sha512.run = "8eb9eab801bd83fbf0d9365c36a202f909cbcd49b8da6887f3e26aa3fcd047b8085e0b405f0f5fa7f2b5ea0ef21a9956114ecaa7934e1b46b1abe55583d5e759"; + sha512.doc = "2158bee41c25a1fbbf8c963e3364cf7d08e160aa895f54c77ceeaab7da6963232af61b4c7349d1be7f0aa84097bc7c00cac7748bdb8ba523a899b9e7cf6ed11d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +technion-thesis-template = { + revision = 49889; + shortdesc = "Template for theses on the Technion graduate school"; + stripPrefix = 0; + sha512.run = "5e9c6bd47744601258bef52102acdfc744e0dd1219a7236a5710d6dd98ba5ebf1061bd6070c5d02707a7c8b895e362db51f48ee081126bcd9a99e523c6b9e5c0"; + sha512.doc = "bcc290eae933b00cb32af0da6d31c6190f3b38d02a599fec7f8cbfcdb6f8737380d4c440911b08de5d768d9925526a63521c97c20a8c075ce8e9500dd3a62c24"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.0"; +}; +ted = { + revision = 15878; + shortdesc = "A (primitive) token list editor"; + stripPrefix = 0; + sha512.run = "42b0fcded19e05d5cf316fdfc0f1f6474816b656a57bfb5214a76f47e644bc16a42bfa95a21b80251723e2c30651a284d873d898e84c277922120a9169d274df"; + sha512.doc = "a36387e2520d7afadeb270f7393ef45ac1b26673840d541a50ecf864304d529b24be7d107070c96cfa123801284ffc53c9daa60753640fcd2ad6367f88887069"; + sha512.source = "b134ab90045781a2a686206d4de20ebf63ffd678d47d81815365f67eecce60984d7e17e3b9098e42f06876b1f711609bfa4133efb4b74705f25ba0e4323984bf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.06"; +}; +templates-fenn = { + revision = 15878; + shortdesc = "Templates for TeX usage"; + stripPrefix = 0; + sha512.run = "cc61496f15f9c4060c8d42de23e3bf6f6d2be02d3a8b4fb761f2fda4a9c3565d74bf1f107dd9371e096bef79ddbdef56d2e696cd84cb4fe39a41986b8ffbbc78"; + sha512.doc = "2a96b0963b2d09edd3f6a6866ae298001e6ccd4e96b98a9002df6e6718284a786b63761441c287ddd63dd5eba636fcb8ce9769d498962ffe2565e771902755e1"; + license = [ "lppl13c" ]; +}; +templates-sommer = { + revision = 15878; + shortdesc = "Templates for TeX usage"; + stripPrefix = 0; + sha512.run = "55b47c4718786fd4910d099878d5808288e83714567adbdbceea32a76e92f7e36c3f850d8597b297445a6ff428d1d0dbaf9209a387485eca0fb1a85f4909ed59"; + sha512.doc = "543b5cce4842dc6b084d90f9bf4e3c19c18a690ebe85379d9d93a5998fed06272bcac4cb3ae44f965614962827b9926fec3439322e38a720c134133a88cd94f0"; + license = [ "lppl13c" ]; +}; +templatetools = { + revision = 67201; + shortdesc = "Commands useful in LaTeX templates"; + stripPrefix = 0; + sha512.run = "696727231a51c33d10ca7c18690d2f960cd01a72b4e928c581e2a7ed26770bf5ea18bdfbdfd56372fc7289b59323025ea7d30f208e991e1c6c89a659a240597a"; + sha512.doc = "55c03f8cf8313aed72c9434eb26b0623e55a5644a22914ed82c64c07834258f0d2f9f7c083b22677be854f69bcc6d980e45158caa4a530df517083c1c590089e"; + sha512.source = "a14dec17daec4f731aac48a155fcd306528ba106518db1b07fa1b77d9a90fef82746a4b173f1ec072ac73023469bea88d70f3b3cd106b3557ce426fbd05062e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +tempora = { + revision = 39596; + shortdesc = "Greek and Cyrillic to accompany Times"; + stripPrefix = 0; + fontMaps = [ + "Map tempora.map" + ]; + sha512.run = "0e1cc1a13f7937e5497f454b15ca66e0975b784b80223a902bf12a9587abdfdb56116b100e04306b1999e053b7c3716b32e1183dd7e6624162611f3b70388df6"; + sha512.doc = "18259e25b2c9f2a9cfbce9a9303d8827af069bbe2a7ade5c14518ce2c19dc973a86fadaa99b2abc8bc65644ee5371c745abba03cca76a685382b7d8b6d20bc6e"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.05"; +}; +tengwarscript = { + revision = 34594; + shortdesc = "LaTeX support for using Tengwar fonts"; + stripPrefix = 0; + sha512.run = "c6a29d928b1f25dc4b8893f9fc803f3a5deef9e8e9aa4803153fbae5cdd7170eea819eafba8a165203e48c8b2f443c55ce682df9f7e968ab621f2cf7eb082108"; + sha512.doc = "35825a4c1cac91c088daea643e8a8901f0c3ea15c44e8a9328883c22c1fddab95fb32a65372af3979698f81e68d77b34764a1c5748460a28396480075cb594d1"; + sha512.source = "4afbd079f20f9989a817acf49b46409bfab6ba0b328249eedf428a5a11e127fedc6c763c87db08b8b7c453562400878ea0c54d6d66c6bb7d407aa498a78dda38"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.1"; +}; +tensind = { + revision = 51481; + shortdesc = "Typeset tensors"; + stripPrefix = 0; + sha512.run = "fc20b6f6b705218b82b5788582d8b017be783e42c87b3f35e7aa99a8215ab0168b7da899c73ef1ebc282bedd5c715e69ed9e1c19b94d9b6369ba8e9986b5c5d6"; + sha512.doc = "12e443e2ffe876732759ddf91c8948e9cfcebc3c1c96949c51f090e15dadfbcaf801e488c8d043855b576404207612ae91d982279cf0b29bd73d4a5d1528bb6c"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1"; +}; +tensor = { + revision = 67667; + shortdesc = "Typeset tensors"; + stripPrefix = 0; + sha512.run = "4e19620df8703906c539541afca09ef871e1cf6a20315b246ebf758c5a0ff5f2095c51d312b19f818e89c9714a79a32fbee708d4ecd0a0b0257546b0d940ed1a"; + sha512.doc = "f60b5bdde9a29bf6a13ee94833b0d1fdaa1e7958d01a6a42b20a995263f398f7fbd761150b71f66490ece636ad2aa2c69a8ac9447a0000265ac480396822db2d"; + sha512.source = "4a90f092c167a905cf72abf029bce706cbbcefd4dd73ffe791a132f22268a5c0322c246877a387739bbb15697555fb021e6132538b5ab9b188a9fa9135b9859a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +termcal = { + revision = 22514; + shortdesc = "Print a class calendar"; + stripPrefix = 0; + sha512.run = "f28ee31f06cf2b3119df8010aa6a8312d5365452e19c3a278db7bee3bdeafe9ae0d3b07decdf1a104d8eb763abc5e02ff0e6c7030dce924596ac89d8e9508e13"; + sha512.doc = "44f54dedd59afad78eea60ccfd43805dca1a4dc87a3d827e0fda26db15505dec18d91cf0629ec937dcf3eb14d1244f80559a0fa1ef09b30288bf687099fcec1f"; + sha512.source = "0dd39a06088a0bd2bbcc3a9d6715816368deb07c55c85897f7c49d23553ff941f5f68d7b0ebf8fc54c4fd4d2bb8a510cec3ac9d9b509f27aeee29696c75a7ef2"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.8"; +}; +termcal-de = { + revision = 47111; + shortdesc = "German localization for termcal"; + stripPrefix = 0; + sha512.run = "9d4d0be3e26dc69fa3986fbe41099330e97cdd4d3aa0b12a180657577ef839878aea9e546a5651cdd0ea45e7af3968c5b83b509ad5bb3ef210d42af5c00fd91b"; + sha512.doc = "48f0ec01526f75e9e2b8369f8b30bbd8e4f093cc91fd5b485a36e225de35fa0afc750508b6533f2ec82ef123805788e40e98d5459dc85a73bef675162e682fa7"; + sha512.source = "51d257533f7897d6b605a2ac26f323e3c241cb6920b329387f1be3bfc8444e98570f2dc4f86e78e81f5838204a90a7f79074989737005f035e076c41be74f4a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +termes-otf = { + revision = 64733; + shortdesc = "Using the OpenType fonts TeX Gyre Termes"; + stripPrefix = 0; + sha512.run = "df52961346796914dca6c8f7c45671aa5da8c8ae4d55b951b5dcec6168c90082c02734db1133a119c951e50507ff1edf777b8976e34da1fc1cbc7ad783d4ae4c"; + sha512.doc = "221decd0f8193912d30032544095c3f30c4d8fd3b52ab74dd167bec1de528c8c9b753681985259dba859f8fd3d06ba239665bbdcc93d80904235c6f62685dba2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.02"; +}; +termlist = { + revision = 18923; + shortdesc = "Label any kind of term with a continuous counter"; + stripPrefix = 0; + sha512.run = "799d5fbfb9b055e8674a244ecaac65c2f0412a4c173e6608fff946544142d851d8dbba02505fa8be21bc37b15acc2ba99a6f0dc77a13dd241fedea1c1b38dec9"; + sha512.doc = "14add37c32500f246eea2a3219b58a232c9a8f41cf3cf5a0d1d2aaf4cba4d700c1ba5379b037fe10cfc06385ff0a7d0925b46beeef15dff2502142e56f37e597"; + sha512.source = "2d6a14828ca29c08d0b08f33749deaafef88ec73bdd72450468b5332e95c83ccc5d29d0a154a6cc49a04ca0a9e5a17d0f28f25139d928b87cb14a2059d51d848"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +termmenu = { + revision = 37700; + shortdesc = "The package provides support for terminal-based menus using expl3"; + stripPrefix = 0; + sha512.run = "5c3d4ac4a2bab5e18453b9de0b372b364981444df3550c3a195a8fee841a6d76e73835096ff1b71a37f5e5acf0fd2777dbc8846be9345f99b004adb560ced517"; + sha512.doc = "029f4ae3b57e0b226883e66030db2d3c41cffc0a4dbd4f8b3662562fd566d8a09b7aa0c83d98f7fb0cdfbd1226c5dde9c93211565292f037e5b5554e9a5d02b4"; + sha512.source = "56c1396e90a4c1db5dd28ae96c6f3ebe0310c163d7fdb2cb4e3ade78b522b349fba0bd43556165c282bedcab167241033b065feaac4c4a5e3dc2d8a8a55dca61"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +termsim = { + revision = 61414; + shortdesc = "Simulate Win10, Ubuntu, and Mac terminals"; + stripPrefix = 0; + sha512.run = "132615cbdbe257f2c7643414ef4b577053425e457a2e2ee2a9b4d8d56a7e6758db587b7f5223ef1a324931f5468ac5365b7dde7b971312bc8b8ea069ee5efb9e"; + sha512.doc = "af5047a490608fbb5769b6b4d3dad3fac6b9b20abb5dbaf20d08a633045ea45ca1a01f572d3f0701567a91a8429ae0c7279fa82f054e6fe0802d413765c46ccc"; + sha512.source = "45ad375a19ca939496f6f6546c9d2568367b3cd49c11fe1b2d94785448eb679d3e82c41a3282df054027636ca367b86b82dc3d937b42056398c23622ffa6e34a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.1"; +}; +testhyphens = { + revision = 38928; + shortdesc = "Testing hyphenation patterns"; + stripPrefix = 0; + sha512.run = "c16a9299721c571ce9bdc91e4ed4cc54c973b43fed5189d2f377b2a9143d94d3eeba6bd6b728e3df92a5436b3e2c5e07a21d4a6af0210bf87784d40d96caa42c"; + sha512.doc = "44cc1d9afa4e12ef2dc1f7be2d7718fa33b80e5ee16c7396053690bfea6246f444b50cb044d314ec677436a3559ff1ba9fa227acb446db37bacaa2829c309b2b"; + sha512.source = "2f84528ee4ca5d8434b0042f7b24908ff97c45f27580a5b59bfe226b195c295d4fa546fe240acb981db6deba970e2b020d38c00e6bbf5a0cc1b3caf2b3cbd506"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +testidx = { + revision = 60966; + shortdesc = "Dummy text for testing index styles and indexing applications"; + stripPrefix = 0; + sha512.run = "e4179ab827eb21f27fabdd06674302ac141b6abf889e87c4183b4d86253ae35b5ea277ecb8ac36e66d51a4e25556fae092f98bfdd768d34728412f3bb8b5faf7"; + sha512.doc = "60761fa19984e3ab2a0b5420320a43b84c1174a4e6722c75523fcaff43206ca2bd01f24af74ee307b5cd7d12196238f86539f8cfafc27168bf134df74e2736df"; + sha512.source = "358c712d4073983f872dc9664bd6e138c7c66a420d1253ec36646cefa584c9148573fd978026de87d98806c71ea8f8f45c1cd0160b3be738d6fb9cd535d774c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +tetragonos = { + revision = 49732; + shortdesc = "Four-Corner codes of Chinese characters"; + stripPrefix = 0; + sha512.run = "dbb37eec17d41633d951b3202289289bffd9bf9a8f509cfbb7f98baab9b7e684e7d7fbfb5f50ce41251d09d9f0ea81fd9e68fa91984e788e5e43f8e398463fff"; + sha512.doc = "f55cba055574e78934b8766f02de08f417f625042627c2c1e64cb7fe39ecb1e3553d5b862afe521f4d65805713c856ab000e3db3b7fc906266886f2ebec490a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +teubner = { + revision = 68074; + shortdesc = "Philological typesetting of classical Greek"; + stripPrefix = 0; + sha512.run = "c5f03b824d75099a38f8d203722d0edc4136392ff282489f6473a83dc178f536eb972ede3bd9371f47f39dfc2dbda6b4db78d282642889b4036dbbdb8e49a473"; + sha512.doc = "f1d7123e4438f781f6f4f7448119c7dc968be54888c027f8a7c95e5c70f06adcb58d127de21679bc125355f85f82ec94d2537cb0467f7c285427fba6b8f50775"; + sha512.source = "a44d484cc8de4f280f35648c93bc1c3673fff20a3477098d58342cb579b443f4a417f528e7b80787bf13fa8feddb05dc2cb5d7c261d812a5473236d00fac59bd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.8.3"; +}; +tex = { + revision = 66186; + shortdesc = "A sophisticated typesetting engine"; + deps = [ + "cm" + "hyphen-base" + "knuth-lib" + "kpathsea" + "plain" + ]; + formats = [ + { + name = "tex"; + engine = "tex"; + options = "tex.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "028cf62dc7bd7f62acdd005c1121b4fcd55f9130db61d3bfd782cdae22e2e51581cd66a43a827ce76f6e4fed09f2050ee81c13594f6df64817c3a48ca3d1d088"; + sha512.doc = "69e9a2068eb63d7a503be0aa3d94cc270485370be0342d5adf6fac714743a90b705622b8cfbd7e62e52c15f9a663fc3101d11a116c1af9c4f9f3f5c5d3dbfc77"; + hasManpages = true; + license = [ "knuth" ]; + version = "3.141592653"; +}; +tex-ewd = { + revision = 15878; + shortdesc = "Macros to typeset calculational proofs and programs in Dijkstra's style"; + stripPrefix = 0; + sha512.run = "9850acafe002f1b6b147d00aee55e4cd9c1813edbea0f570282119fd8b2f134d3a48c113cc9957c69905c4e88a06097c45829026342d7ec88838870eedd7fc44"; + sha512.doc = "05f6414dd2309401d1800e2b053d7907703e144f829c2e7623a7c98c1313da50c0a659c25fa0d9a0fcb8b50891c575b47d8fb8a90b925e105ed9a6f8c45b8667"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +tex-font-errors-cheatsheet = { + revision = 18314; + shortdesc = "Cheat sheet outlining the most common TeX font errors"; + stripPrefix = 0; + sha512.run = "403b4faae7b16b1eea5a4d2a7d77bcd8a6e7a7b5be54299b79635280be8f82f59d281380754a0bd1b9e53ff4fb534fb3bca0cf8bbe1cf0ee88ee4d925fba103d"; + sha512.doc = "adc72626fcb4c5a9285ad4a7cfd1c6b984f1aa26c7732f35cdc241f7b00d623f6b646e878317f30d10b9f47f4eee33e923538be58f3c15bee668f4fe652f0170"; + license = [ "lppl13c" ]; + version = "0.1"; +}; +tex-gyre = { + revision = 68624; + shortdesc = "TeX Fonts extending freely available URW fonts"; + stripPrefix = 0; + fontMaps = [ + "Map qag.map" + "Map qbk.map" + "Map qcr.map" + "Map qcs.map" + "Map qhv.map" + "Map qpl.map" + "Map qtm.map" + "Map qzc.map" + ]; + sha512.run = "5422f349d15233e6f49576fe3a65f8afb5cae6a3c51e5ad7cb56617d7d064e9cf574f233f789c029c04bbfc24e5948c115b2d33569e881373d68615ac709153f"; + sha512.doc = "db2bcc8da6d3bfb6f2165c1fb127b2b4a7471e41a0cebb851ce5465a18740d34948ce8292b4f6bd359621166602cf62a978bb179346dbd1dcfada49cc7972686"; + sha512.source = "e958408e6e64a54b25fa89b38de181c96fffb9eb8762959209799c39cead7a5525f220b7b3cd278e35cb9e3e49c1c85d565d518ffacb0695b0c3c09ede935266"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "2.501"; +}; +tex-gyre-math = { + revision = 41264; + shortdesc = "Maths fonts to match tex-gyre text fonts"; + stripPrefix = 0; + sha512.run = "a50a9eaa30cfd7754ae702a3bd6fced2d07fac858215b913945665940c71a0aafd2b59a0d0baa0fb9d5090773ef69a86864cc11126a5e30adc3d0e94cdbd2594"; + sha512.doc = "cd346226dc36bb4fb5324a43dfab7790cd80ec6bba992849dfcca74ea6fe8d85fe7e0ac66408a41ac1ef644e6b32c9b06d337c4f394fbfd8fba4153fbc1abfe9"; + sha512.source = "3c58821e5307257578ec149317cb621331aafa00bfa465eeb055f1f93691ce57a489a32a7eea068b12b70228433031de33c0ffe36b0e8e10b368e0ef5e33fe24"; + hasRunfiles = true; + license = [ "gfl" ]; +}; +tex-ini-files = { + revision = 68920; + shortdesc = "Model TeX format creation files"; + stripPrefix = 0; + sha512.run = "58f8b1dd44be6ea67dfaaa67a4f7c6d27d222ccc7c7898c31ade4f23ae39a9a5aace902f05ff48bb3f6d63eae38f9db93b75c4d2efeacd394230694eebc33fa3"; + sha512.doc = "9caf187a5589e49f946a7fc5ad332073dd2a90d82f71587a57ee9d62e365321fbf14e69e3e3448d85302cf5418a2eb7d94a114f95c575867b52579f6c35d5e48"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +tex-label = { + revision = 16372; + shortdesc = "Place a classification on each page of a document"; + stripPrefix = 0; + sha512.run = "513310d4dc5240d0b290d0acc941455ba64e069d19c223670d05a632033aba8de367d5dce6acf073af4df476876d3ee414dcf9f1f579738bf9bdfe6738c19d36"; + sha512.doc = "bc705cf6812515923d60cf44b75830bd3ea78f078c9ef88ded3e94f060155e1fbf5dc1485cbaa8530e1f10b41b421e70bcec6c61066ee98b498aba7ea8799dc4"; + sha512.source = "07c29de4e85fc21404dad1da3a01a5037b641526110fe5410899c60aeae6a92836de322895afc83824df60f431955a4da959c4d4c21cf17dc32929f445cc1ed8"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tex-locale = { + revision = 48500; + shortdesc = "Localisation support for TeX and LaTeX documents"; + stripPrefix = 0; + sha512.run = "0e3aca622bb6fb49a06a3aea1d997414add9272dd39c10c3a1d80956dece59882993b24366a1126acab80f8a7c8328a30756f727210f829f5eb838ac0b9cb1a6"; + sha512.doc = "d3898da3687603b1f1f3f2f5b203d01c985ab0c3e39eeb05dc7c855c14fad8b73649777e4a0b7844c242bc8946cab80b585987eda37a1c10e3ba75c6955fee23"; + sha512.source = "b24a01b9845f79a86c12911e71ef179a4dd8f5a8284d067b760a8ac3cb906cbf2465ae3617e0196d9163348f3a865fea4e5869adac9921088b13d738803f87f4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tex-nutshell = { + revision = 70378; + shortdesc = "A short document about TeX principles"; + stripPrefix = 0; + sha512.run = "46f2ee7186bbeaebf250eaf2b5768ef4827bcd3c87a037fff5bc88d45c749f65e25f60a02639bf793e50bc66a11d9da365f4b1068143ab5edbf11c59818da02e"; + sha512.doc = "cb3d558047b0737a0dedc904f615c309be9b13ae53f99871d8facc62c3efcd00b933a67f496d24d9d896c1b96b8f21e257487b610633a73b30017b87e98bf70d"; + license = [ "publicDomain" ]; + version = "0.10"; +}; +tex-overview = { + revision = 41403; + shortdesc = "An overview of the development of TeX"; + stripPrefix = 0; + sha512.run = "1217aeba55d723dad2843509ad3adf205090298f2362ba4ce23d73ec581e439c344f055281a95f82bd8cec298c77da012cf892e60369562238bba7f8b8d258a1"; + sha512.doc = "0cd9941afc0e50d3d936f5ba1f9d2c7f16244899982ff7eaa44bb019653b5e4e142edc1ee608ca1664636c77178dd8a02f4625a2216a019e770651a718f0a27b"; + license = [ "lppl13c" ]; + version = "0.2"; +}; +tex-ps = { + revision = 15878; + shortdesc = "TeX to PostScript generic macros and add-ons"; + stripPrefix = 0; + sha512.run = "cc616b501be7c0724646d5e0f326a5729df8f4cb0c4070f92bdd3b5b370e496efd6208b3ec8b2387713810b9764c75525689f434b7f482a83fb0b8e9b0383cb6"; + sha512.doc = "2f82f63954c1407c2caa9c39a538ed1cffeabfde8ac0506906f0f28430d12e18d858040ee66f2326cad3fa758c23d1ed490b70c5d18eb68b699b7ddd0afd15d1"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +tex-refs = { + revision = 57349; + shortdesc = "References for TeX and Friends"; + stripPrefix = 0; + sha512.run = "aa03714a0ebb90c7431935608851c504080f8985db3bbba98cbfa9b957e0a3fbb87de8e0119bfdcc996d664aa46bb943c6f90b36c4408a42f14fcc8387508df6"; + sha512.doc = "f033d8d8bfafdece7b79c8417bce19dde484adbaa958497c0b4426448e6ebbfe8dcda07a34c336c3abe038447ea9e5177bce4660c9b8be36b0f94d02fc7a41d5"; + license = [ "free" ]; + version = "0.4.8"; +}; +tex-virtual-academy-pl = { + revision = 67718; + shortdesc = "TeX usage web pages, in Polish"; + stripPrefix = 0; + sha512.run = "23005895f708b07162b2b251be125b70dfa8ef6add8ef7c5dbab2c5a2e211f65fce8432cbf3ee324a9b72c2296d5dfffaaf5a52d77425e4d6fc3c042397d6bec"; + sha512.doc = "fd22d5a6c34e5ab7859bbb515d54e822eb5167853abba3e25d5137df1bc34f0bad9892c16f7ed5dfded8b90651551e1ed84a00d561c561ba18f50fa04e7bc7af"; + license = [ "fdl13Only" ]; +}; +tex-vpat = { + revision = 66758; + shortdesc = "TeX Accessibility Conformance Report"; + stripPrefix = 0; + sha512.run = "918054527c2d325ac0c1bdd621014fa4c79d7c6cf4ec8b5ac5d81dee84b9159fab0cc0047ea35eeb2de4460952126b3bdcd03395c29379e9df517ed7243206f0"; + sha512.doc = "f16ad935930ab663bb2e5b486c4fe53b3bd9e883c660d97893c4aa86bfe22f7ffed77dc66d88060f7eabb1daadd2dc77742c1d9604ea94d26594aba340693f35"; + license = [ "cc-by-30" ]; + version = "2.3"; +}; +tex.binfiles = [ + "initex" + "tex" +]; +tex4ebook = { + revision = 70117; + shortdesc = "Converter from LaTeX to ebook formats"; + deps = [ + "make4ht" + "tex4ht" + ]; + sha512.run = "7b2cc47523db8f9b987d2423e10d30d50684f2cdd45dceb846a0bec634ae5ee1514312d8cca46dce701ba1d86c9cfb21f0a0bccf67376f453fa5fec99165b19d"; + sha512.doc = "6011f8dbfe4308e17e8dae72227404374afd1c47e8ab2568248be67913ad1f170d7c83cd01a9e01e39607486579d2e9a1f0a1bbdd3230299109d12a3aba536db"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "0.4"; +}; +tex4ebook.binfiles = [ + "tex4ebook" +]; +tex4ht = { + revision = 69739; + shortdesc = "Convert (La)TeX to HTML/XML"; + sha512.run = "c78b1daae522e9dfb8a0c3b49e04cfa57d68bf96555cebb5ce2700f87748e7c7f5092ad1329f9bb03d1c3f2f11eec58653a66aaa51e295b8aeb7f3606d7d87af"; + sha512.doc = "135b1475d6b4f8650a6e9363caeed0c769ea6ea2512a585b19767ebd440123f39206ebf80b708c37dc3f269b9dbec9bc91a306c36055324e883f679338fcca16"; + sha512.source = "1366b563e320f55c4a005e25520b942c9d4e6a1dc6204a3f4e5416fdc6d682cf1b3829233780f4fb7ea81881b3b32f741ab87c2496bc75ef45993c4769fccda7"; + hasRunfiles = true; + scriptExts = [ + "jar" + "lua" + ]; + license = [ "lppl13c" ]; +}; +tex4ht.binfiles = [ + "ht" + "htlatex" + "htmex" + "httex" + "httexi" + "htxelatex" + "htxetex" + "mk4ht" + "t4ht" + "tex4ht" + "xhlatex" +]; +texaccents = { + revision = 64447; + shortdesc = "Convert composite accented characters to Unicode"; + sha512.run = "5a2a79c9faddebd523939cb3cf42236b1d2c441a036cd7fc6f6f62422e5142cdbc0a45ddaa9e642266c41c9fe5b723fc440d0372639cffd399a89d489bd11b66"; + sha512.doc = "87bc11f186513adbf32c15af2f1c1253dd72802fb2008b76b9d7d67fc0a039aab0d2424fb853b6bd8e968cd4e9c1cd93bff786fa07e84593fbda99191b053eaa"; + hasManpages = true; + sha512.source = "8bf5d4957008833d54f87eff9feb14f60694ea02e7e9fd2cd5c5d2e2db3f6de3a33784121208ffab516763fbf578125399cbd6f39750e6bb0162a65c2fc44f24"; + hasRunfiles = true; + scriptExts = [ + "sno" + ]; + license = [ "mit" ]; + version = "1.0.1"; +}; +texaccents.binfiles = [ + "texaccents" +]; +texapi = { + revision = 54080; + shortdesc = "Macros to write format-independent packages"; + stripPrefix = 0; + sha512.run = "e964e090b4bf4e924166d0fbd8daa2087a300d4da9d993bcabc624dc78c3f2db9984f2aa851740e61706af213d112cb32e80795ec2cd4e23a69c13ed92fd91d2"; + sha512.doc = "0f3886e76090beb0dcf295ba875b9ddcd950da4d50da710f1b4417ffc7c1ceb48223a20d7cc93cac3cbe2f19edcfaa74c801096fce33c55e9fbc6c57b1897b22"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +texblend = { + revision = 68961; + shortdesc = "Compile segments of LaTeX documents"; + sha512.run = "fc2026a5b2487af785957873f20fb91045262df7df2a2a71777da76727c054cae19b1e005d30b2616469cc009f680973091a7ce6d291d2ff29b3bcc8a47fc12f"; + sha512.doc = "936b56f3823567252297cc3a659d951b501a5f60b2d43f6d8b19fe803ce651d67363d026bd97d0aded3320148dc230ff81e8961cbfbdb5c9a822da94070bb945"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +texblend.binfiles = [ + "texblend" +]; +texbytopic = { + revision = 68950; + shortdesc = "Freed version of the book TeX by Topic"; + stripPrefix = 0; + sha512.run = "d2418ef6b672e82c08b2f7b7f0089a9dea1f514db584662351135b511912faab828956fc252cd854fd2bb1243bc0e1af428e294eb92935cb63b38e73078858d9"; + sha512.doc = "787b12bc92a17a00fd8278138d0e36d94be377fc23401c4bd677c372dc1d19b4b88c12395366b8ba5d766fbd7bc364588986d7528572510a43ba48ee0330b787"; + license = [ "fdl13Only" ]; +}; +texcount = { + revision = 49013; + shortdesc = "Count words in a LaTeX document"; + sha512.run = "82f51346d9474270af6374cc1619ca005206b1bd729ce1559b8b66e361b184a192c7fbe085216a3a64e656197756593f7d76e52437ac562fd33bf09504b0f58f"; + sha512.doc = "5141bdf4378cf87a19933945d6742427f4467dc73d92f4a470e34474232dbb2f60c4d8db065f812481520f1aa2f8a90d7e97dfc83f0f089d10386847f64f4d94"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1.1"; +}; +texcount.binfiles = [ + "texcount" +]; +texdate = { + revision = 49362; + shortdesc = "Date printing, formatting, and manipulation in TeX"; + stripPrefix = 0; + sha512.run = "c6f34d5ab0c54f799669c4c44e8c6e00381796ca76b9d2e8352a749effe65b9ffd6ebd139998ab9267d1e54da6471f5f38cc6931f7ff046882261cd5e5440bc7"; + sha512.doc = "2338dd99b32a1b2e04326e888b718f595a26848bbef17206f92a0a0f26556edddc3e0a06327d86e72fcb3e55270bcdff846cab3bfc37cbd61115b601164fc10e"; + sha512.source = "30a5c6401d66e7fc2cf0300341c7007881945fdfb267ce4c1f9930f6cb84d04d7895df613215be27da15e307baff361cba6bd4b530ac78f352b74aa81bb94356"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +texdef = { + revision = 64967; + shortdesc = "Display the definitions of TeX commands"; + sha512.run = "ad6b67da367b1cef01db4e7d912685ccfde58babd7dc4868325624114d85e89f5daf3a47fd855dc084ffff66e332ca85c5d77f682d7bfe1b507c43e0a0612977"; + sha512.doc = "bf84f04183654db606a7ebcd30d4986bca69e633439511cc7d9cf57a3a1210231ed158d2bcd86c5014065d355ec94faf3d5f9ab08be568eadc6637ae9cb72aaf"; + sha512.source = "d8c20d77f5b5c68e0acf2fc26a8a0d142aec1377554c3f6b6cf469aef28ae2b82ab4c6844ed8414cad073dada8a035175d6e48b53699daf029ca181cea41f112"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.9"; +}; +texdef.binfiles = [ + "latexdef" + "texdef" +]; +texdiff = { + revision = 29752; + shortdesc = "Compare documents and produce tagged merge"; + sha512.run = "26fa84b3090d641efb186947ce4d1d89c30a2c224cfc8fa759da3ba7ec9cc113c0ed4afc1c3d0fa5f9d0a88af4f9b3001d57651df6b5be6e0234fb78ec4f252a"; + sha512.doc = "d458fa8db6433b4c7fbd23a16f9be53c2c822e396e7f50844cfa6acdd2a08acf8efdd0bd946c8fdc09ca8aa28d1eb25708d3719184634abced92ea5c94d9a948"; + hasManpages = true; + hasRunfiles = true; + license = [ "artistic1-cl8" ]; + version = "0.4"; +}; +texdiff.binfiles = [ + "texdiff" +]; +texdimens = { + revision = 61070; + shortdesc = "Conversion of TeX dimensions to decimals"; + stripPrefix = 0; + sha512.run = "737074790de5c16de0e30dd6f708d6b8ec43e8d387ced2dc6b16b64f38854fad7367884abeab71fd41eaa79dc0c5939904314deed97331f9919a1fbefb0108d3"; + sha512.doc = "3ab30a8de33cedd4bdb9aa0a84104eb5b02be164de9f6fb81a51dbaa6caabe0029228c311970a3287cfbcf270a5430d6883756e9c28fc924a3286d76bb71217e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +texdirflatten = { + revision = 55064; + shortdesc = "Collect files related to a LaTeX job in a single directory"; + sha512.run = "3cd6cf4d9ff3a1a3daef0bd5a998417696f6645cb54679e99e5424ebbe3926c45acad7b999ee4371392a7ba13fe3f2899438ce66efca7829c7aa1eaef84aa6e5"; + sha512.doc = "1114dce13ac47c4352e968f42e89582b62b2702bc25ce3a9a4fd766b3bd63607e11eab52d19bc9f809b2b67cd92153c4f591632cfc72dcaf1c0a1b1cfb416b11"; + hasManpages = true; + hasRunfiles = true; + license = [ "artistic1-cl8" ]; + version = "1.3"; +}; +texdirflatten.binfiles = [ + "texdirflatten" +]; +texdoc = { + revision = 70583; + shortdesc = "Documentation access for TeX Live"; + deps = [ + "kpathsea" + ]; + sha512.run = "f81535eda231bd03ffcc2c46bc05d04f73f6ec7c6ff0c436da0d42417f0a8b21c444489762a33dec5cefebbee9113f403205b621e51ee2ac33a2b23aa0eff431"; + sha512.doc = "fc6d8041f21e00214dfed376b29bf47c52a24f09358255d0587c24eb1a046a6d8e65c448109c63d485f76b2cbe90ec8b609c20bbd8490206224457b1fca2499d"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "tlu" + ]; + license = [ "gpl1Only" ]; + version = "4.1"; +}; +texdoc.binfiles = [ + "texdoc" +]; +texdoctk = { + revision = 62186; + shortdesc = "Easy access to package documentation"; + deps = [ + "kpathsea" + ]; + sha512.run = "f3300a088f5ecedfe66ca277f793d3565b5b0f111721a0d73a788d65b72f09d0103a11edda13679fb9e919f11ce9ed3662717c18e46be99a83b744a1f7ec88fe"; + sha512.doc = "fb403dc17ad839ea64bcf6da84e59288a8745b5eb731051d7df8593138aa5d3b6891d56f52bdbe5c9a41e590f1f36db390e7e7a825d9aaf00d4fbc01c8dc16ba"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.6.0"; +}; +texdoctk.binfiles = [ + "texdoctk" +]; +texdraw = { + revision = 64477; + shortdesc = "Graphical macros, using embedded PostScript"; + stripPrefix = 0; + sha512.run = "f4d160e494b1579743a83b2a0926df9e8dd69fdaa79d3f4f97e0ed5f4ece31ab380ff6994a1c9015e0af9b842bdfb9b066442ca4b3018df6659922af9f746b0b"; + sha512.doc = "e177209a937fa1d9d683eb805e9e8929612b4b1ff750955d38ca681b657662712a59609990f77021063a223ce61a92fdd567eee91376ef4b67fd3a322db09463"; + hasInfo = true; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "v2r3"; +}; +texfindpkg = { + revision = 67027; + shortdesc = "Query or install TeX packages and their dependencies"; + sha512.run = "a6fee1faade94bc462dd4fd0e567b7716d0dd057e0c973b9a498949e701bd054fa4fce1cb8717f1d052ab03ef9b894e2f222e2e9a70957215f7266bcbef15f57"; + sha512.doc = "452df8270ee53864594cef99a7ce0fbb6b325547de0ebcecbecb4463646706fa9e726fd433f31c4f6c44d2bb915431aecd7150921043e50f6b3a2ac5e51eeb70"; + hasManpages = true; + sha512.source = "d784abf4241ccd65c8c910c16171b30d686a53933043d8f6ecf787866e5508d4e89866c90fe2627ae4b536ed7647006f6ce257c8b47676adb77221d08b6ef690"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "gpl3Only" ]; + version = "2023E"; +}; +texfindpkg.binfiles = [ + "texfindpkg" +]; +texfot = { + revision = 68110; + shortdesc = "Filter clutter from the output of a TeX run"; + sha512.run = "0886ab706ce0f18b0eab304afa1d570fd55b57bc02c8b3b1aacde77c73ee260f688bd395b2e362cb998cc1aa9a2d1e228b118f5234eb9c40ce867a97d86f4ac9"; + sha512.doc = "d652523552ad401598c68227b3e0e11c84261a3a243afc731f54892fc971c8f22e74bb58b6eb45ac15f70c8789e5a4a9c4dfca81a3dc304762ab97c8bc74e3c4"; + hasManpages = true; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.50"; +}; +texfot.binfiles = [ + "texfot" +]; +texilikechaps = { + revision = 28553; + shortdesc = "Format chapters with a texi-like format"; + stripPrefix = 0; + sha512.run = "b65e737c138a176e6674612dda6b066a9953d8b737fe2e947eb10c058d6b67eb27f154a3ca4f346481f4dc077fddc2c95cc302762a9e9eaa2f0f1d23160bd4be"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +texilikecover = { + revision = 15878; + shortdesc = "A cover-page package, like TeXinfo"; + stripPrefix = 0; + sha512.run = "fc73ce5601a10d638ea78fe815978d395001a73be75084539498644ac7f3fea0f3a57e95bd80e5f38659891adfd9c817e6068acfe04972a836938d733e0d4382"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +texinfo = { + revision = 69818; + shortdesc = "Texinfo documentation system"; + stripPrefix = 0; + sha512.run = "5a87395dfb732e8cd213d50c3bc3079c4c6dd6a070e1be580dbe45c02b2c9f0f3d5590dc36222d0833c262c6412024e55f0881e92358715a585dda064b964e2c"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "6.8"; +}; +texlive-common = { + revision = 68510; + shortdesc = "TeX Live documentation (common elements)"; + stripPrefix = 0; + sha512.run = "1d56101ace5038cd3b8d36c90e026a1c26363535fffbe1ffab64dfbd01408e7cdfb66045e11b13e22491f238e2d3a7015fdeb9bf75fa56f581d2ca5da8f1a01a"; + sha512.doc = "c9832e8249440656334db12b6ee54b467fdebe1194b6adbb8d28ee375250bc6458e8c1b48b5684eab0ff2f0b55db4f4ab6e77679df447a01070a15c1243e5d83"; +}; +texlive-cz = { + revision = 62854; + shortdesc = "TeX Live manual (Czech/Slovak)"; + stripPrefix = 0; + sha512.run = "5491e3ebe9c70887450f8404b64c01a8f4c4c54314d2acf3d33b8921f088b8885074d53bdb42351198daa9cd2c72b1ef97b1e9af5092aabded700ea6f2b995f1"; + sha512.doc = "ff1124b30be77782b5c5a1b80ae69c852a5a9e81446c0574007bc28910ea6202662514a34a85858c577bb528f9fbcc11f798614d11914876151d5aeadb3fcd7d"; +}; +texlive-de = { + revision = 67108; + shortdesc = "TeX Live manual (German)"; + stripPrefix = 0; + sha512.run = "521ce2f9dce3fb329de464ee847c077d449885869e964648e8f89d920231a68bf0d3562e5b54b3cf36716dc3d85b4f0d0591e06843796f216670f963c7191324"; + sha512.doc = "30eeabe60126b3cc7fb8bd400613a9a5cd0484ea73a8fd0e4c3ec7edee5e985c64c8073cf2b121446b9ea1b60ee54609687c168a75198408a30cb221d4a0ffc1"; +}; +texlive-en = { + revision = 67184; + shortdesc = "TeX Live manual (English)"; + stripPrefix = 0; + sha512.run = "d77184250d7014dc65e74baec435fe42e784f80349df81782e8e1f7681cd14e3cc99313d61d72c010e5ffb33a0de06890c359e7b582e94662f253f8ed29cb7eb"; + sha512.doc = "9da87903b5ebfb7ae0ea257ecb77654fe53d93b86fa73d8089b5b2adf46183862e6c67d3b93d6e112f750cbb4af6d6b034f35a1628adac413b61857a91dd962d"; + hasInfo = true; +}; +texlive-es = { + revision = 66059; + shortdesc = "TeX Live manual (Spanish)"; + stripPrefix = 0; + sha512.run = "d055fbb5a4cee9d207f60ee27033534917a0e91dd2e37791290737bd2727b47ccbb3199c0e18f4a564f15e5dbed3599203a7b3611558a26f784713714262311c"; + sha512.doc = "f124848f80289190abadca35a259d60781b5ae75771687ee44e863ddaace61227217a7c1ba888a85afd28583f1eadd4c91b03e224f5cb1b4516772243ac0fe63"; +}; +texlive-fr = { + revision = 66571; + shortdesc = "TeX Live manual (French)"; + stripPrefix = 0; + sha512.run = "2b5f6f94f9e9b3af2a18de94b85615bd09cab31d9e3f01b9ac78df5d22fae6ff84d300cc39aa92d1dac02d858c69e86d9d3dbda422574a4c3ce4652b08990090"; + sha512.doc = "5463c1ecd592e7d304325276f950964cb52cedeab20084137deb0f4b7de1b17b536e4b030cd0e961191d61912f9c4db27f16e6e196104c84ad16ff7b545a7e9b"; +}; +texlive-it = { + revision = 58653; + shortdesc = "TeX Live manual (Italian)"; + stripPrefix = 0; + sha512.run = "22874afcd046572176439818fd3a1c2200d00c0e184adc4fcbfa90b2ecc88dac7f5b28eb95c74bd546fd7472fcfdb2c5b74e5b1b5d08ffe4d4a5aa5f924da698"; + sha512.doc = "0c0d3585bb2c12476751bc5dafb5ea5e10dcaf5149b98e823e607d7a99e5bd9dfd698d73950ecb1efe353435ba2f88be2c45e18c6cde2245df90cebfdbad4417"; +}; +texlive-ja = { + revision = 66482; + shortdesc = "TeX Live manual (Japanese)"; + stripPrefix = 0; + sha512.run = "92f3767daa4e88bcbcff86aee215bac0ea945645a626e9612e033ad12513e41d15ce8074c22cd39b0fbff9d951608bee799dbefa431c31ca9e8f4681f15242fd"; + sha512.doc = "464442dd7f1e77598e7bdbb6884453f5a4a2f57d5d8b028d0126e5bed50b3c19f9fefe13b602ad1aff3334e45e8082f2a1328f884ade2ea92ba4b054a41c4b5a"; +}; +texlive-msg-translations = { + revision = 69796; + shortdesc = "translations of the TeX Live installer and TeX Live Manager"; + sha512.run = "470b395fc5ae1271c39ca5e85d7432e46ee2379a338120fb442542fb3513508dfe8c1326cf60148a4a3f58cbc990913dd272661c6b9a942f167ee6d6d15ac7dd"; + hasTlpkg = true; +}; +texlive-pl = { + revision = 66576; + shortdesc = "TeX Live manual (Polish)"; + stripPrefix = 0; + sha512.run = "b43de2e6d5fe66c53370a4c43ab1a66cb08f353944f58756debc40d6651cb5df11824d1eb4ec79890b449ed611b8674c0773a4e477ad4abf30f162906c1f75ec"; + sha512.doc = "09319f848fe28ca344367f70c826380b3927aa26df7eeb195f6eb176d4951ded181cc47c772f401e1e7936de5fb3a9be3339c69f5bb4e8a5f9785f7313e6baa8"; +}; +texlive-ru = { + revision = 58426; + shortdesc = "TeX Live manual (Russian)"; + stripPrefix = 0; + sha512.run = "7658ab0d98a505eda9a86e9ecd64b0e35d9cd332b03066b46825c2a6252b9aa8edb24eb4af2bfc267127b349f741709ada836104dbfc2becadfd97d22e737365"; + sha512.doc = "40e8b29f29ed61addc2b9e7ce4b73d12bf2e59f1c50c65e59e9c8cac5e6c3ef264ce2071b0d54e15f5029c101a51d0efcda0144e113aaedc714eb1300aa9635d"; +}; +texlive-scripts = { + revision = 70585; + shortdesc = "TeX Live infrastructure programs"; + deps = [ + "texlive.infra" + ]; + fontMaps = [ + "Map mathpple.map" + ]; + sha512.run = "fb5abd894d2ac7021391b7ee270cc833131c2a30f406e8b63e1b3c713abda08c3a28a30067d89e905fa40d7092c9529e8ed954a020833724cc867c6f2eab5272"; + sha512.doc = "3d497cf7940b0b6410a537da324da33276b8af004c00b54462f40986d7a2af818c817b57663d47c714c3e4237dbbe622627bb64dedbaf2017732bc76e59492f5"; + hasManpages = true; + hasRunfiles = true; + hasTlpkg = true; + scriptExts = [ + "lua" + "tcl" + ]; +}; +texlive-scripts-extra = { + revision = 62517; + shortdesc = "TeX Live scripts"; + sha512.run = "46ac37826d3c60de6c9260bf83d6275d49a35cbde88fb03481a050f92e87b698e9a94b2e520a74edc0417419f5a2dee53000a529b9c81ea6f6244a83480e56e7"; + sha512.doc = "22cf59bf4dafc7ad9425086bc0aaedb2bf5f7d8aa6ea9c65abde2d523be37665b9c9bee4acb399857eae03613e7241ca1d6099f43cab77a95c10eced8813ad80"; + hasManpages = true; + hasRunfiles = true; +}; +texlive-scripts-extra.binfiles = [ + "allcm" + "allec" + "allneeded" + "dvi2fax" + "dvired" + "e2pall" + "kpsepath" + "kpsetool" + "kpsewhere" + "kpsexpand" + "mkocp" + "mkofm" + "ps2frag" + "pslatex" + "texconfig" + "texconfig-dialog" + "texconfig-sys" + "texlinks" +]; +texlive-scripts.binfiles = [ + "fmtutil" + "fmtutil-sys" + "fmtutil-user" + "man" + "mktexfmt" + "mktexmf" + "mktexpk" + "mktextfm" + "rungs" + "texhash" + "updmap" + "updmap-sys" + "updmap-user" +]; +texlive-sr = { + revision = 54594; + shortdesc = "TeX Live manual (Serbian)"; + stripPrefix = 0; + sha512.run = "de99d6d13c6b68f8327c0b72dd3ab8aef92d07085f3eb59d94aaf8901d11d542c0795a33cb2bff1ff0dfb1acc99e43fc767150956abd873536a7d4e3b8f031f7"; + sha512.doc = "4e07f6f015a023af113822e409e03405f49b9786f854308c14f2060cac75d8420ddab090696044860be75f1337b6d3b6e7a45fc0d56969b0894efce3a8c60ae7"; +}; +texlive-zh-cn = { + revision = 54490; + shortdesc = "TeX Live manual (Chinese)"; + stripPrefix = 0; + sha512.run = "1a7e43528c2dac5c623943b1b268b99f0db6a4876f50c5386a8ea160b8b5e066604d34c0a53cee25cc3f839eb7f4be177e3d98ed51c83c77df6293c77a02e0ab"; + sha512.doc = "534c505455c5f9c73803c140a340df2882a97516e15f52c5b65695b7c626404336a0e4f6190155b5bda1b9a86d7f4d44ac294bccec791ec6701e56d13c00d71d"; +}; +"texlive.infra" = { + revision = 69740; + shortdesc = "basic TeX Live infrastructure"; + sha512.run = "d3ef23150149d240d8b74f5b9f6126de90f44960238deefa94415310586790d5324f9fd83478fa4d726ef6dff516f5382222f56933599b384101521a66d0a248"; + sha512.doc = "fb06ad12bea2d062dd5e2049e74e096064198242f010cd6e04e2d4a92a7fc39ae829003c7ed3f8347f96c99c31e26ec44073b45ed3ebbe9e18fc78e801d00c94"; + hasManpages = true; + hasRunfiles = true; + hasTlpkg = true; +}; +"texlive.infra".binfiles = [ + "mktexlsr" + "tlmgr" +]; +texliveonfly = { + revision = 55777; + shortdesc = "On-the-fly download of missing TeX live packages"; + sha512.run = "63353a768b700ea11982e9552046dfd1dc3d844883f03099833cabe2af5ccddecebd7ef737fbcd256c90304174165a4d283d4912f8311508e61c723d751619a7"; + sha512.doc = "46d57a6ebd68a56d55ccddc68006693fcbad8ed8f809243a3ffac7adb82da58cbc28239b57556d5d8d6388ea034b6571557588ff9365d4891145d5cc3fabfaea"; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "gpl3Only" ]; +}; +texliveonfly.binfiles = [ + "texliveonfly" +]; +texloganalyser = { + revision = 54526; + shortdesc = "Analyse TeX logs"; + sha512.run = "85f491af4a3867283d56bc2d98ebcf491e622008b3a70bb2cae03b9deb38170e1c73088d109445fac11fcce6e10aac57f42f03066580a79c978dd19af1f74caa"; + sha512.doc = "8eb890f880dc56d37e29e2f0bb3228e36031d45010677097136d40959ba7ec0cdd10b5056169325f481318f137a9de2f180438f1716bfa12705fcf0db315e3cb"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.11"; +}; +texloganalyser.binfiles = [ + "texloganalyser" +]; +texlogfilter = { + revision = 69919; + shortdesc = "Filter LaTeX engines output or log file"; + sha512.run = "cd70a50317af4ed121bfca914ea3083d11be2087b9507a7caca97238ca5f62df418b2e059feb1d24492c87f57096f3e3268ba4921f9cff1709d43bfa6be29f25"; + sha512.doc = "7d83863001f4c57018253fc1ddcb08abb847a76307fda75c85f991670fcd8de006cee3c6292696596fc7be5eb752ff38fe63215e2a80a51d7a35e19dd8702914"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +texlogfilter.binfiles = [ + "texlogfilter" +]; +texlogos = { + revision = 19083; + shortdesc = "Ready-to-use LaTeX logos"; + stripPrefix = 0; + sha512.run = "d3b5f5ea0dd90e925bffc1ac0f790848d1c2abe50003e2591c8efb219b4a205d48e4420d2000b3de15b1ff9d4d0bd9e083ba1694d4ee34febd68f8db0df16ea2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.1"; +}; +texlogsieve = { + revision = 69436; + shortdesc = "Filter and summarize LaTeX log files"; + sha512.run = "a4e94f5674cc2bb54f03e285aa18a19d3c389455f2ab15e40998aed6d211435bde3fcf549c989364673bc77a93458e4146b0e662d4bd139e18880a36d4445832"; + sha512.doc = "47d11f611bc3a440dab6dea06cc55053802d2b78133eec21af4eb8d44e74b013a4dd8df0667b946afcbdd8132821ab1429f30f74da610bc1e1283793d465c454"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.4.1"; +}; +texlogsieve.binfiles = [ + "texlogsieve" +]; +texmate = { + revision = 15878; + shortdesc = "Comprehensive chess annotation in LaTeX"; + stripPrefix = 0; + sha512.run = "52c35f096426385f229b7ddb66c8ec2a20539bbad6296f2bdd230c2da79edf5668fdde0fc7ebac7099a414b622b31309fa7f610564c8212602f71dca7193c597"; + sha512.doc = "dc1ca347bfb0ba8c54403e643b4052604f98b39ced23d092808cb221e930384f49d1c34794a933b0a05c7691ef04158688653ce69eb8a4b72e9172b4254954ee"; + sha512.source = "b75362c3b748021934052ef38b9f95ad7047804d5100b2a00bd8f9e396103d2d641f1fc5a3c636cb42ed66fa88488f6c69d3b188e3a55f715df2d19c05331889"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2"; +}; +texments = { + revision = 15878; + shortdesc = "Using the Pygments highlighter in LaTeX"; + stripPrefix = 0; + sha512.run = "6b0bc365ff7ba6a8118a4e83350e73d5c4dc40e6c30a0ed3267f0f20178a08264866bd016aa3a9da72d4f27a20bf7e8f658417561468294745b78911ff46fd4a"; + sha512.doc = "67b7843546704e9b48f6ffe75a33ab68a5d8ededf3cd45ca329c6ca5ffcc783f4ecb9a663fc4eb94fb554e3c43e753512f82dc8f2f7924c1bf4bb8942aabf749"; + sha512.source = "92d2216144fcbcc96907fd09ece64428684476ab8e9f3a0c60e898f9f4cf7e0627fb145adbd8186d56a6d5a21563c41d62871e860ad51d9b74e5a0f6441a44de"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.0"; +}; +texnegar = { + revision = 57692; + shortdesc = "Kashida justification in XeLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "09e4b3753d99fb4f99c150da87f5602dad5a28778f9489e67f6e4e45d5f9dbdf0edac43826c1a162280e9399d28d050b5ff230713b2e45cc2804f21a76dba0f6"; + sha512.doc = "403e75ef47ffc6da77e4d61dcc95419932d2b62ebb0c107cf612a195b0e2a24862139a518ead801ee15f56546c44bf9cf0e56aad7b4d8a7ede8529063aa745d1"; + sha512.source = "9785ac1b0a7ce4f33458bfb3acc203098c8985d6381eec5c610de16b22e2e60ecb386bb5b98da0f9f082b901b9dee096135c5c2a38d5233e92fb09413de214f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1e"; +}; +texonly = { + revision = 50985; + shortdesc = "A sample document in Plain TeX"; + stripPrefix = 0; + sha512.run = "a51d7288abaa3bd03e8f3816eaf2d7f8931340e95e3897ea4a63ae3d251277a78e71ae66b617da6cc81a8100c9ffe64a1c9142369c67d58daf200ab2ed7c9682"; + sha512.doc = "5f03987ce079f21801f08a7e325a36c6f1065f5cc32ff2dbec7989bdd3a6b3c54ade8f96a71e19553972d3c36454a08b007adf3287a7be7972a8b3ce6961778a"; + license = [ "lppl13c" ]; + version = "2"; +}; +texosquery = { + revision = 53676; + shortdesc = "Cross-platform Java application to query OS information"; + sha512.run = "d454a95139920c24404a501ad3bbde4ae8e809e0f0b6b7c32053d375e0cac31d81087a53d65ab067c9c6dfd988ae90429adbc5d7cd2e1b23f41f46dbf6a25056"; + sha512.doc = "51bc4e5a9f62b4526198b380fa69dd2d79ff69ccf0915aef4269d890fed057c4130ccca65e0c279e58ebfb72347d627b186534138f9c4bc8d395677c73a2a0fc"; + sha512.source = "5ed0dddadb7e8f406635d7a2cc309a030826607a76b4520b1f47a07affb603d96577118ba1fb5b9797322aa49a68616acbbcdde39bc8538c54c5d2fa1aebe510"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "lppl13c" ]; + version = "1.7"; +}; +texosquery.binfiles = [ + "texosquery" + "texosquery-jre5" + "texosquery-jre8" +]; +texplate = { + revision = 67201; + shortdesc = "A tool for creating document structures based on templates"; + sha512.run = "44f2e0008d1b8629bfd15267e3add7490c9a21e28d7b29edc5e37ca51e60bfbc8b25035cbacb57bea5df762ff9783ccfdfe6d9244bced55961509c7ad97046ec"; + sha512.doc = "bfcbb319719b9f8d4473c50afcd435eaa1cfb906f6107dd7e859bf40a30b452dc135ea1ce0a733c297112647fbc76d6bef16b9474a65d85e6d93e5df96acc549"; + sha512.source = "e11a6716016b40525f3ecb4906dc1b54650177f28e7759499928ce78af410ea9a159fa3703cf2098aae227b6bc126cb4be35f8637ef6e15c7df94fb8ce4145bd"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "bsd3" ]; + version = "1.0.4"; +}; +texplate.binfiles = [ + "texplate" +]; +texpower = { + revision = 29349; + shortdesc = "Create dynamic online presentations with LaTeX"; + stripPrefix = 0; + deps = [ + "tpslifonts" + ]; + sha512.run = "7e2efadabaf173fd30c592cbcd2338563b8690048ccaffd86efb079a04b7b95c8ab113b99205cbb2912eae3a709a110d7b152270422cf2cbfd2ab85d42f12d69"; + sha512.doc = "e61965b5e31b487daba383a4e6ebc0dba85475f8cade2faae6adb8576ec7ec544b518a6e0e105aa185ff82fd6aba7a9ea4abda2a9446d52f5b3acdb42580e315"; + sha512.source = "3add8eeda886ce6422d3b7ea53a55dc69bb2f5c2e64cdede105a7b4756b008807bef6245ddc2596b45809311874e566263c51e98ec6751b4db9d3c5c5f58efd3"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2"; +}; +texproposal = { + revision = 43151; + shortdesc = "A proposal prototype for LaTeX promotion in Chinese universities"; + stripPrefix = 0; + sha512.run = "19265b32271b8603d8baf8b16f043c3228606230c1151a33e243e493b6306faa839860f2b07ec9d5d43c57f49e984134e760342bc6302186924e5c95cc1f3380"; + sha512.doc = "70c04643ced459099ae095c88c0316e96c75e99bba0877198c7800d3b5cc9ac872f74b36adfb03dde968150abb3cb99131fb52ecaff56dfbf1aa85379718a74f"; + license = [ "free" ]; + version = "1.4"; +}; +texshade = { + revision = 69371; + shortdesc = "Package for setting nucleotide and peptide alignments"; + stripPrefix = 0; + sha512.run = "28ec64b312161f1157511d4a4dcccb3378bd054ed6abe75830b2eb98b30c5afb2ccd1bc88b0ee0fb049a3610e97b4408b8e66675094a74abe1bde8abe5d1a1e4"; + sha512.doc = "e06fcb1e6d743561ecc1b6a1a14e252fa5a7eceb2bb0ceb27409dd52c62ec5a1397cdbde7bf61e62b143af2fe6787a49ad3b6b9117f8418e409e54b26deb2a25"; + sha512.source = "23bc248ea1ee572c6ac13fcf9697810ad6881530a44adf9a16927801b0a951c3fe012295ac2816c85f203fcadfb35f04460510ea7fbe2fd758b05098a4f06dee"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.28"; +}; +texsis = { + revision = 69742; + shortdesc = "Plain TeX macros for Physicists"; + deps = [ + "cm" + "hyphen-base" + "knuth-lib" + "pdftex" + "plain" + "tex" + ]; + formats = [ + { + name = "texsis"; + engine = "pdftex"; + options = "-translate-file=cp227.tcx texsis.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ]; + } + ]; + sha512.run = "f6ad2f3d49377de738bf37bcfa1658a2977ea3d399aa4625e2482c5292e65596c67c8912ed1b2d23b1a4611ea2cc2281585b558ba2a5e7f65638899f714c267a"; + sha512.doc = "283e9cfbef23e946a14869774649dc4afb821b9a284841c0d8ff45ebae4e931ba692600974afdf87752160dd71ed32496c46d3ca7e91cc26cfb4d5bf902b4132"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.18"; +}; +texsis.binfiles = [ + "texsis" +]; +texsurgery = { + revision = 59885; + shortdesc = "A LaTeX companion to the \"texsurgery\" python project"; + stripPrefix = 0; + sha512.run = "39c270382bb228beeb9ec61f744f66805c76a7fb1522158a59daa5dbbf29b3f4151c20d7dbadf404cab8ca023456b9988d45e53f65a1396da9259832390a0980"; + sha512.doc = "76fe49291714772ac56097e5869f82868d149959bc091d3e9b1810013c92440c05825e2d585841a3e7fe015d66e09c3e8a92847fe7fbb8bfbe308c62919e8c26"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "0.6.0"; +}; +textcase = { + revision = 67755; + shortdesc = "Case conversion ignoring mathematics, etc"; + stripPrefix = 0; + sha512.run = "1a4a29b33270f5100109f42f4caf529d3203a6bd1a934a06fba6ed3ed082f0bbdeecfeb7ff158182c88ca7d724422c83be2d170bba78738cb7417fecb13f65da"; + sha512.doc = "c8b42e576dc6458441703344724bb1ee8f441e79da8d59b1ccb0b6280de878ae65ac48e628f3230ee2094ee285a58636a6e37c29e4458d5f164c36cf4ec93d6c"; + sha512.source = "1e7e5e16c982ae65aab5cdb4c83e770336dc38833f6027de701114da45c0b45a1ef21dd3096de3933401a13222438a533397661d5654acb991c0ef5d6a8c29ee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.04"; +}; +textcsc = { + revision = 67193; + shortdesc = "Simple commands for caps-to-small-caps text"; + stripPrefix = 0; + sha512.run = "99429871433a809febd561793ae53253812792f7ff20f154cd9c01ae3df95c19b1927e677b686b7ef19c6e66cebe2047136810ad287a67ad524d905c6ccb20a0"; + sha512.doc = "a8b38f3c369c5603d1a696672fd8a2c7a49e1d60c011fd5d2158cb9daf37fb4ecd691d859376c55086f894a9a2769a1b8a78d6b63ea4243a27b02bb2247bfdd0"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-30" ]; + version = "1.2.0"; +}; +textfit = { + revision = 20591; + shortdesc = "Fit text to a desired size"; + stripPrefix = 0; + sha512.run = "96638c0bd5cb14b629f03e4b6a3266160c75bcf05d871ce3d4262ac1c070d9efc0532411f5d8774f97362b148ef6cd1c5dd5253e72e3aebb542fdf14aa6d78fb"; + sha512.doc = "b88df8c99662a182483fc6d12d33d0bac5f6a32c84be700146d048b799045800cbb69b21599e5debac122995800b0e48fd82395c498a58df503395fcedc92228"; + sha512.source = "cde6e37b48b1aa49811fd5ec29cf094c7b49d690fb4d884edc358bd3a8a5bf58a815e539eb5e56a95616f54b0737dde09e312c0d2baf37498ead691d4fe1dd72"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5"; +}; +textglos = { + revision = 30788; + shortdesc = "Typeset and index linguistic gloss abbreviations"; + stripPrefix = 0; + sha512.run = "1652260a3e946a8847ceb7f937893bad27a24737d9b3573466f7369ce9cdbf900af0ef6c7f0bf3033200664da736e8232c3fbf6db61bb7d51acec1010d13a3e0"; + sha512.doc = "922ce1569fce889bc4608e9a5da4a45b7c3d2e80303ac36167efe6767c266844664de00384447e288da70383fe91261e5914394a6fdf8644349f785600271e5e"; + sha512.source = "0dc80a20fcb8926b9bf586808bff2403452e43471983d0bf49bebd310d2bf78cb1e61cd4674f7bfcf86d94ee083d2c8e0099554858549dc5c6703d0f4ca57dbb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +textgreek = { + revision = 44192; + shortdesc = "Upright greek letters in text"; + stripPrefix = 0; + deps = [ + "greek-fontenc" + ]; + sha512.run = "2370f666c2cef43a579e32a755675431717ccfb4bad6f30261a6c67e0617816ffc272c25e0d076d91c4047c41926c92ae375507f36f2fab01673bd7e708f5188"; + sha512.doc = "9107ca31b645977d56a3b1e37f7b12f0302b1b2531bd2a21883f7931831e70c4383beae77469aab4663253da3109cdd9c53589cbab95f7f0126389d12509127f"; + sha512.source = "367b63cd318c1e69944444f4cab82af7a7b1dde667d6469ade4c6433960b21a6f8922280d5a46e96fc88ddf4c2d5d3f3a440b55045a67512459208ae181bda96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +textmerg = { + revision = 20677; + shortdesc = "Merge text in TeX and LaTeX"; + stripPrefix = 0; + sha512.run = "5ef9048849bd2515c1af0ff41d0b5189715b375464c15d4708e0152d99f01839c462a0c9d0a9a12f401375d38e2c53a0f0c314e6905e1bfb3171296448bab649"; + sha512.doc = "05a087347db5dce688065f56c106d022f3ac30d27ee5d2f420e7658c5b81df66549cda86193f3ce4fb2cbeaad37abe7eb32b984d00d4f25dd0ad51433f8d7a01"; + sha512.source = "bec01fd7721b5fcc61ac934ebffc3936492817662f4445f082601fe4b7aad576448d33b7ec16ce400c8185704e60238c56bb9e8e31c3b445503673145c0cfadd"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.01"; +}; +textopo = { + revision = 23796; + shortdesc = "Annotated membrane protein topology plots"; + stripPrefix = 0; + sha512.run = "89a415b1040ff44f62c452e61abf9a5760929953ff0a4740080f79e8343b2b4f4eef9340e5a83fded39a000947dbe7f2916fb18624c4512c5ab58171708de268"; + sha512.doc = "80bd54a9843fae371884b87710094f72926d5ad8a7e40308e9aa753b01533d3e649ff94831ea75aed264b5f9f5df482e157a1563dc85ab2976cbf9260425c5ce"; + sha512.source = "d426490fee0b747726dfd7df1f6f72677c9aee3d8ba56ec04dd55037aef563297d16d08a821c2e9a1493c5c29ad6b52c5af23b6bb1f4adec754bf530beb81571"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.5"; +}; +textpath = { + revision = 15878; + shortdesc = "Setting text along a path with MetaPost"; + stripPrefix = 0; + sha512.run = "7780972480a1355a05cbcca3c46f3e5284b120a93ed2265f0fcceb6965f55ed793756cf96df63aa8da589dd12fe1b8127bd470077b9f9dda758238ced566b3e6"; + sha512.doc = "5507082be0235ec2253ddc0b03e239607b9d140952799684e5193e4d3d584846d33a59aa9b1630d058f17cacf7cedd2fe0a180b40207ea8f10947b534784fc02"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +textpos = { + revision = 63967; + shortdesc = "Place boxes at arbitrary positions on the LaTeX page"; + stripPrefix = 0; + sha512.run = "77451d38b88f76b80b063267e2dde1e6e6c771c3e4b176a006d3e38351b823a9ac735455dffd6ffb3e23d6198ea7e2e7828c5d9a4e0b0bcfd5c07567901a05aa"; + sha512.doc = "0b17032df1840b6659c85e3d4801d36e3eb2c5887d03f6c37fcbcc1f030d75fb32991850ae39fccf4e2e9a6498500659ba5fbacad971071de608f4137900a392"; + sha512.source = "569ec215d0b9d8ea250b5f8fff39a332fcb5ec6dd2830b8d65145428bfd5de9c3f2320ef342a887b712d7e7078063ac3b3157609b57b947fbbfa8d5badd578fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10.1"; +}; +textualicomma = { + revision = 67201; + shortdesc = "Use the textual comma character as decimal separator in math mode"; + stripPrefix = 0; + sha512.run = "9437756da9639dc29fad64ea7bec0b2fd4ce783065ca00fb522ece24c33b99fb2f51f82564cb382f5f39ada825353f007d14a36ce5d9d5b1cc4015b71b8cd314"; + sha512.doc = "a1382aa53f3df15c57e391420e7f4164a3fcbc8e765cb53a87814a4fbff7e354268f8ff7e6bfb1113f269fa426aac480fb22c330f234d58492fc4f8960fa2960"; + sha512.source = "1a42e7e80fa555dbc81c7f133c6be0ed265756f826d701c3bee5dfb7b1e2a8c94c2bcafe6421d89ae82aed2c5e1a367d6d06df7d12941325c0d0148372a9091e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +texvc = { + revision = 46844; + shortdesc = "Use MediaWiki LaTeX commands"; + stripPrefix = 0; + sha512.run = "cc149d490180e58e9796ae0bc962e51794400384671eee53c932acef88512a129dc3d87ea4378247813acbd3ead010014ab71bd1717b6edb0bef4b7856be8aeb"; + sha512.doc = "e8639a2ffdd2d40b27545c3f4265e473bfbd81a028632a082199fb0dba7ea0b0468bdae488a9eeea63578bdd610f7e16d4f4da846f9316dabf5645af95fc8cab"; + sha512.source = "4bbcf12af602c328084e76e339d9ca33c205f08faf489be3008fa5fe0b424631e940baee1da9144fafac42e09fd2d27a7726c16e159cfe24c70d32ae1014d198"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +texware = { + revision = 66186; + shortdesc = "Utility programs for use with TeX"; + sha512.run = "532cf8cfb19ea5c8ed0fe6939fba0ddfaed58989a588acef18ef38c587d8485295e9d438487fd2225a0f68c12d0dd8c6263d597c2e94cbdc96ed074ddd296729"; + sha512.doc = "c4be0bdc3490a0bee08d6a99907f7abe1145ae8f8f89dd8665cf6a8738d07c7a537c0d7e767b56a6eed3a00ea169729b4d78208aab2aa883c9fb422e4dde3383"; + hasManpages = true; + license = [ "publicDomain" ]; +}; +texware.binfiles = [ + "dvitype" + "pooltype" +]; +texworks = { + revision = 65952; + shortdesc = "friendly cross-platform front end"; + sha512.run = "2d0f90699f7ee4fa6dfa9eca4a62c8deadd9ee8303e17603bd32d0b2cd41875e76d1cb28879139dd62e534575f1dc8e71d6ec401a65ecc333f5b4bb636ea5a67"; + sha512.doc = "767bca3619a0f645f23b029e1d8b84fd7333bfff5df073026423e83681abb2c3e60a50f843aeecf95aaa54b29018f145a7b655e2dccae0465626e84ca00d1b99"; +}; +tfrupee = { + revision = 20770; + shortdesc = "A font offering the new (Indian) Rupee symbol"; + stripPrefix = 0; + fontMaps = [ + "Map tfrupee.map" + ]; + sha512.run = "ee935ea5c6563fd8da4f403a1c3583b289b64e212aed4b9e3703ec345dc47c5521d291e1ae0a10c9aec2ebfed407fbf14e804bf51ae4c4a1e03046fc7cd0ad5c"; + sha512.doc = "19da18d665a8369e58a26d4e979d5fd6c8b3187dfba97a281008627aeb8c5ee824dc2ad3f5c94c3b35c67fe28a646f44aa5f532912de5f5640b0a7d56afec2f8"; + sha512.source = "30133dbf65f1a33f79ad8b2c8ee84ff376b39d12cf0d48c4e72e86b393e0d55f5768c7af5f5f3f6ff1d78fe2c7d4f2b09d2980107dd5aa1d94fb5ea27545ee9d"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.02"; +}; +thaienum = { + revision = 44140; + shortdesc = "Thai labels in enumerate environments"; + stripPrefix = 0; + sha512.run = "25f6bd1e6e9586b261721b66b6b193c07f60dc074f7b7b1911b0a8ba4f33815c86945bcb3946ffe153f70f0dbaeec4dca8e5574f8369c754a6151fc271029f3b"; + sha512.doc = "246dbb624a2e2e30bd5468c2596e7b3f7183c7dd9d03eda42fbed88fe51f16b53801ed39f85590d2739a93d48bc413fce5c52685d5425615f650b19f56013261"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +thaispec = { + revision = 58019; + shortdesc = "Thai Language Typesetting in XeLaTeX"; + stripPrefix = 0; + sha512.run = "02434f56fcc8ab499b4f80439fe9099d5dedef00d6dd295dfc47644a7b1397486a419e1ae2b89a0aefd9cb3a093974158a72a2eb2921d25df3231a7628897968"; + sha512.doc = "26b88ea1b87d8391b8864011449116df3fccbbb978aa76e6cc51dfa893eac87851ee10b1320350de57103b80c6bfb30ca97dd1cdf13014157ea35eaff780843b"; + sha512.source = "e79096902654f302311ab531f8ead3ab9852323ed774fd217aff94c0e1ce456c01a5d8a28854b7c5d65d0274318a22cacd4dc04a00498eaacd92f538f20f6013"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2021.03.01"; +}; +thalie = { + revision = 65249; + shortdesc = "Typeset drama plays"; + stripPrefix = 0; + sha512.run = "695d16e6630efa10363d6c94f410cdf11947dd0c0e59987cdf01e0c699c53c994a702b3802b8830e38b6f5b0ce654af5710ef93b094fbc08954eb8d9bc5d2915"; + sha512.doc = "f2fce885e0aa65d42413ad7ba26a38ff787fed8c1ac5d6434e949e229d4f728a055a6a2ed80f36fe94f6fdf11cac3bafbd2a945cb9bf2ec0b436eacbe1ba58aa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13a"; +}; +theanodidot = { + revision = 64518; + shortdesc = "TheanoDidot fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map TheanoDidot.map" + ]; + sha512.run = "f7c8f9506516c52ef1714e0abbf594f1f6be8492aced3f502a7f49c2a1b12c69b6c57c01300f71f582639f42001c3ece2bad4f9b4ff2b1a1266c3e36e9bd0d91"; + sha512.doc = "0396291a9213e2b80607572a2313801a6a93f4ca2f54889a4c18e8330ffe9f057b856ff957d58d61ddc2828838c6db9e45e26cf611ff88ee80f3b2073668ed64"; + hasRunfiles = true; + license = [ "lppl13c" "ofl" ]; +}; +theanomodern = { + revision = 64520; + shortdesc = "Theano Modern fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map TheanoModern.map" + ]; + sha512.run = "c940c73df2143395fc4f2887e0273850787cda96cf586b0a2067ae39efdcde999338eb7826fac9af5e97bca978bb309b0478e1dcda43cae0a0b3266430d3348b"; + sha512.doc = "934ad9a47609277dc1a10bd20f55f0ca01b6f1167a574ee8609352d94f4aff6305db9ca0e3ca5b83cad1f1eac74e5227fa92acd65df9de3f91abcb653f60d21e"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +theanooldstyle = { + revision = 64519; + shortdesc = "Theano OldStyle fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map TheanoOldStyle.map" + ]; + sha512.run = "b2df891fef113bcd50ba63cea16942738a9c8665a1644187401ba471e53c2f35070c8a339c1281e4d679dae39e22497de92d854ab311720903e676dd7e7b7413"; + sha512.doc = "cb896fd78684c8c21ae5579da4b510636336e4959c0943577657aa90d2d843415eaaa2eb42e7d1cc031f6a50044a7702c7d01abb8af7dabd4b6132545c799a07"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; +}; +theatre = { + revision = 45363; + shortdesc = "A sophisticated package for typesetting stage plays"; + stripPrefix = 0; + sha512.run = "d450ef176d5543581316ff36590eba2ed829a3f2b8a019fa8ca379af0ae2aa4df4e4e3068b52ed91edec4df33d08aa78b1f5f21d0fdf33d0aa718704e3de2851"; + sha512.doc = "cb4920d5acfe0e1288c7d459d15b06b9ced1130b56ea92c9ed49376743cee7e3fbb694362bac51f2660269992d64717effc5d8e9f52a21337fe7eed51a4622f6"; + license = [ "lppl12" ]; + version = "0.1"; +}; +thematicpuzzle = { + revision = 69356; + shortdesc = "Horizontal banners in a puzzle style"; + stripPrefix = 0; + sha512.run = "3dc42fb8b0d1b5aa3f68af6efa29a683e4a2d7b14f9e8b79aa56cecb15356cd8a9ad6487267b2ca978363ed7e8b5988f3efbfb2136774e8c5d9be25ef65f0bd9"; + sha512.doc = "cc3aad57de0a8f2ed5bcd46d391820a2d8d316d7fd75d5d4abb8a6532fcf05d6643aad83570413dae441d14956747265e7137b05fe5512423d8fb3c1fdff5f89"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +theoremref = { + revision = 54512; + shortdesc = "References with automatic theorem names"; + stripPrefix = 0; + sha512.run = "ed6990b6c7a9ec4e72770252bcd07ad5ddf4015cde0129dc0a89cb95bc96958963209fe46f0ba9a614ebc0cdb358d8125ee3eb22b9a4249367d975ec12250a3e"; + sha512.doc = "022ef42c6765c661f5828a8adcad7710d74f168b3a2dfad0e73218d1a5295b25ea24d5fa010a01151939e87989cfd6457917167e69cebf5ee5a364347eea5f2f"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; +}; +thermodynamics = { + revision = 69086; + shortdesc = "Macros for multicomponent thermodynamics documents"; + stripPrefix = 0; + sha512.run = "0bae277827251a42a366ce85aee49d762e08025b96472f8102a54b7a9f1e74622bfa0064aeaa6dfee5248ef84977fd47389fc91049c057caf75c33930ade37ba"; + sha512.doc = "3e2ae382e61ec8734e6cffe6c4d5efbe853a3c6748e1d8e75c2e4fa0ed6e7ada7f8a79424f49c43a753bcf6ce867b84ee353c553ba412c0386d58d2d4f5f437f"; + sha512.source = "0ddadff5d744ca8f45bab8f471685e9afdcb494e60aa6ba0c32c8a75bce536adc6544c097e95da02457059b5bb96ed37508217577caf16c963af6e07651ae721"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.01"; +}; +thesis-ekf = { + revision = 60228; + shortdesc = "Thesis class for Eszterhazy Karoly Catholic University"; + stripPrefix = 0; + sha512.run = "7ef62e88cf25c1b7c37dcbdba00dca0fe522727cd6d1b5bf27cdea73e4638defd2430c2440879479427b2faea91315203179b8f45224d68067ad46810dfd6da0"; + sha512.doc = "50220e7cdded7a36703fe4e0965d19e18c6aca7a8f738b4808efc28d472f01522b456474bfb6c4d43ecc61d81173f0025918b302083829e849059fbcac5e096f"; + sha512.source = "a479e92491a962f549ba9a2863504efadfa5a1515d209eb26a541ad88a5bd8657ee3f3492e99068f3dca869e8394ca9008a074c17d139e2a22325364b0a7d89b"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "4.2"; +}; +thesis-gwu = { + revision = 54287; + shortdesc = "Thesis class for George Washington University School of Engineering and Applied Science"; + stripPrefix = 0; + sha512.run = "7001a1f11d069fd15894b34a2d220394924802c3ef1a37869e0d717bdb650bb53c01078dc14760f7887addece64bfb0f6662741bfb6dc4dd77d2ff1f3d0d7415"; + sha512.doc = "e53925a31286089cb5e8f051cdf969c6bbf29db0ae2629c1a584ead2885cc0e1f95c5b2cd9583056c8ab40b1c41d4f8203b876a1e6365d8967e3942440e04e2e"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.7.0"; +}; +thesis-qom = { + revision = 63524; + shortdesc = "Thesis style of the University of Qom, Iran"; + stripPrefix = 0; + sha512.run = "71aab07394cd5e4a433c02d80ae1b81c059edaec926e242861bd9a902ada1af25352f660d892718c88f0de05c4eb4a4dfe2c07f68f63f8d28d2d0c2923949294"; + sha512.doc = "47148e246b917849db3c280a1b6af3485d24a5d809cb252c597b4c731a058eda5824c99374bfe2bdb199057f1c9493506ef757f6c25e3f2d38a11c8bb8a5613d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +thesis-titlepage-fhac = { + revision = 15878; + shortdesc = "Little style to create a standard titlepage for diploma thesis"; + stripPrefix = 0; + sha512.run = "62cdba17287f90580fe6273d1ca9143c9fac01d7da214a20413995b925c6eced385b3a5c172e8bedb4f17396ed7e9b78e789ca475c5efe542283d9b421bd6ffb"; + sha512.doc = "13378f3ef37bd1033d009d03772244e048ff2a16b95ca8a0f14feeda8c44b29036276c41aae812cf1c28ac5684edad56b000f8a45576bd0065fb844f5b6dd189"; + sha512.source = "34b0f176df84b1b1d1f3e47c7c01d640b0e74e30a86488e07e9e67c61c80a96cb1b9ec835266dbee3e45a952f406ade5af5173e7df33f1d12d1b1f5d0611ac75"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +thinsp = { + revision = 39669; + shortdesc = "A stretchable \thinspace for LaTeX"; + stripPrefix = 0; + sha512.run = "ddc80b4de32524ce76fe34e8f88d01e2db18a8bbf60a718454a0303aea8082fc2e495c89c2ad0a7459ed3151e890e30a1263267f249581e24bac87113a5fd266"; + sha512.doc = "b5b50522a4a7b5f7772118d95fdf42e2f570ac35c49a8690560df27df0754a170acddd782b516fa185c0f6ef2abb3ff8a9f366370c2ad46e2e4d32dba21e634b"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.2"; +}; +thmbox = { + revision = 15878; + shortdesc = "Decorate theorem statements"; + stripPrefix = 0; + sha512.run = "83ceeb0cf84ff75afb734f41be5a5309692c6804a5a20627c54cc8760f8ac5e205cf1a24097c8b8624823668796092d620f5ffbc488f63b87e7cbf9365279aac"; + sha512.doc = "ad8e0710a15781eb3164527dd16ecc2050d3cd3317c386841ad8612a9ebc6055a1501272e3b01bcbc6a7f1ffa80455bf2ccdc0cc9ff4428c9688e9f6404a16ff"; + sha512.source = "1b559b9286a97c3157d568982513541028d96cfd5d67ac541909586251ac3729574c23a05ebdfc42ab06a92ab2ea0cef878b1f42983d06fd48f825962de57cb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +thmtools = { + revision = 67018; + shortdesc = "Extensions to theorem environments"; + stripPrefix = 0; + sha512.run = "7d150df3f868339c6bcccb2e881105d9eba11bab8cbbbf42d5a696a7496cfbb87f0ca848e5cf7a63239e563a75515b15d4acc4a72046ca9539c4597e077333be"; + sha512.doc = "939567cab1c401d0946de706105d23add703e991bf36dc58f4e1d40fa35b5b30b37a9e32bc2d252f247da1f1db654bf3aad460dd1882389c00a8e11106270840"; + sha512.source = "a086c028394cff2fcb5c011d2a69627ce2f9651694b8e1596ece652111e88d43c1f1e358ae4c1201ddb0166180d6dec9eb14ebec8a05469636061c224c6f39e9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "76"; +}; +threadcol = { + revision = 28754; + shortdesc = "Organize document columns into PDF \"article thread\""; + stripPrefix = 0; + sha512.run = "e75f887dc04aa55834c285d5e36babfd0844b79b9d1cc5cfb2eb6412bde9f42b651bfdca9f6819b27f6615aff6f96031135f1a6af3b59503fda34e7566cdb01a"; + sha512.doc = "626ac69b0a26fdbed51876782a9ac2e3b0ab9b32bf3b2f32ce19cce080b5cda40a62160f453199a76b58903d762cc8085a8541fa2de3adc5fea6266592c06bdc"; + sha512.source = "df757dcfd1eec3e8da04939ef69d04ffa59767544a1d5349eb538e111843f4c6dd4374e15bc6e586edac629f61d6979688c229381ad3cd4ad61dc2d48afa7c10"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +threeddice = { + revision = 20675; + shortdesc = "Create images of dice with one, two, or three faces showing, using MetaPost"; + stripPrefix = 0; + sha512.run = "66e6a27aa277b45b44c156d408c764da5bee6dc540f2058a783f02bbe806c95052267a5ed79ea49b5dc356d0f03747e9b186542640b34753a693ecffa158a6a4"; + sha512.doc = "c750497229b8bd41eca05b221ed2ca2ca49db8cbbff03bfce2712869d352ae0385e4c10e9730e0b2f8286db9af1e1b87f10d599788a3dfe8d41c28efb8b0e4a6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +threeparttable = { + revision = 17383; + shortdesc = "Tables with captions and notes all the same width"; + stripPrefix = 0; + sha512.run = "f947dd01e56f6f3db8a4ed0b8f3ec564a38486fcb27f30bb3bacdf31af8360590e7e3886cc00cfbab813213974f4b335ff06ceb521d25519e8b95e345a002692"; + sha512.doc = "6b5eb1d6ceea740ec54ba935c45f03c2e6328140e86122a38b90d84e375382adfcfe14e2e9f56384f825c913140f01a1eb6266d2d46f6b813a34b4da652ee31d"; + hasRunfiles = true; + license = [ "free" ]; +}; +threeparttablex = { + revision = 34206; + shortdesc = "Notes in longtables"; + stripPrefix = 0; + sha512.run = "9dd33dcb7f9eebb9396a6a05ac20e9bb221260cd80f355b23f60a0466c64847ebacd8b0d19c75b3d9cecd9c522a8633468e7cc86121f7626141c066e12f977d6"; + sha512.doc = "3dceb0aecfa2ef09bc20250cd38dd698e35b2cd2a33fb446e78a39fa654899c4f6658a18b95b39a5bff2279a0cbeeda71bcedcdb7fa91d148290302b73e7a64c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +thuaslogos = { + revision = 51347; + shortdesc = "Logos for The Hague University of Applied Sciences (THUAS)"; + stripPrefix = 0; + sha512.run = "584d8f130844ac834be8f061bd8078afcd8eae2e4d22e33d8a61dea8ea637476532181cdc7df9f1710ba5d8dd022a64dcb561f21334b830387e9a063ddbbe426"; + sha512.doc = "5a2298e713e4a0711b01fe7fceae12bf20d6a0fcf91cfda63313e74709586532bc407c07be1807eee5405a6b6de74fe976b2ac56fdebbc344d59255080d80224"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +thubeamer = { + revision = 61071; + shortdesc = "A beamer theme for Tsinghua University"; + stripPrefix = 0; + sha512.run = "8391507179c7237588645f08c0611ab441cb4f426808bece8122ddcccdec8c94457efb8db75f7078b6b2adb6430350d5279bf9efa091cecbc263d31fbbfc11c4"; + sha512.doc = "fb2383dc358f2d0990a3f697746b6941a04116af8f184dbc37cccb100bfb19fc72ecd876bc581234c6dafc2c897576992fe8f741fea07ee0889bb1f51555601a"; + sha512.source = "775b719a02f4ce703a37844cbff77e476c35dc105f8c370e6213f157053a397ac80295cf67c84229ff565e997bb89d89f7db209c7f84d8e47b4c92acca98ff48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +thucoursework = { + revision = 56435; + shortdesc = "Coursework template for Tsinghua University"; + stripPrefix = 0; + sha512.run = "6342b407dac5780e1e35f114978ed4466c547a49b1099ecec8cc6169817d3c1405be0edf5f7cd3d82e5d44f9a7e9d1ca762e82970898e92cc7ef06739eeb65ca"; + sha512.doc = "565d7846b45c8c0bece73da1010f835d5d54f9244648d61747c9fce7a8bc2559a3e53a2327e146f559a6df2809250d7057befbb6dcb9dd2026c76f1d1dd16fa4"; + sha512.source = "34da6d4ae8ad815881fc2f8b7df70889ff99adb3ebea2598e0502725b229cb5a5afea11847c8a1c5d56fd528603dc8aaf43c460394ab301dfae1abe6880f8616"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.6"; +}; +thumb = { + revision = 16549; + shortdesc = "Thumb marks in documents"; + stripPrefix = 0; + sha512.run = "30290cc3b8cc48de6c601fcb3d066f0533bb3f09f053d7912db7a127d8327c4aac0a96499b7eaed36b8caf4dcdda5c8f34a5430d69e1fac70510f426c92ab9f4"; + sha512.doc = "29abd2e57cf17edbfeea06c041666ba29e436defff1600df7222dca6160e7be740b64647d7a44a10f6f803011a1754abd693048ca36c4c372ee0da52df2562dc"; + sha512.source = "1712eaf8ef694998eab8cd0b95c6e8affc2a967c81cef6d6bbe8d985137662631254318ad2dad9a021a70ab849986e727699715b27fca1a5952df111474f92e8"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.0"; +}; +thumbpdf = { + revision = 62518; + shortdesc = "Thumbnails for pdfTeX and dvips/ps2pdf"; + sha512.run = "74d1b32b1a48825c423d4346258f6f1eea60d2054ed38b3d9d4e207a3375e35b6e80d87706bc2d265f62606a449a0a665c8698f4e1615b39df98f6f54b309fff"; + sha512.doc = "26f698eef73b85181abbd155e8ec8f6057f7ec0c5ed1448a256e4fc2e41cffc77474fe4c3695d611e8993bbb1afdf238e3db3a90bc2b7af145535f726af027ed"; + hasManpages = true; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.17"; +}; +thumbpdf.binfiles = [ + "thumbpdf" +]; +thumbs = { + revision = 33134; + shortdesc = "Create thumb indexes"; + stripPrefix = 0; + sha512.run = "58e489402fc44cbaece118203bbe7011494b7ef16ffa0e5d60be2daaec0c4ef2d048a71f0d9373a1683aa780fd20e3d64330e199596effc7cf2fcdac34f1faf1"; + sha512.doc = "4c58ff61d64b841b3a3bc018f94c193730129edf45c87fcb9c85685f748ca3db1f7d51969dd25882848cec906485f739f8f07c8bb2f8bded580b59ea93032a14"; + sha512.source = "26458ebc431f64a324c39ec370f2b0714a56563decc944c64156f0a6a3e22664e89239bbbfa7710d9b46706657b48470ffd1da7a1801aaca2732b30e01935fe4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0q"; +}; +thumby = { + revision = 16736; + shortdesc = "Create thumb indexes for printed books"; + stripPrefix = 0; + sha512.run = "485bb2670133c3c83f0f7aaa685defc6d36f5d24173652d869f526770e1f55c55a31f3a3180f115aef45fb824d9032ee915b91c1c59b9b33794c95c92f03c3e6"; + sha512.doc = "bac645197085968fe8a7bd41f4a9ec3c6e51e17e6750b87ca1a458acc9f6a4f244d1f3b36b9c622c98492b90abddf9a4df1636b1874c02820dcdb6340bad0910"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.1"; +}; +thuthesis = { + revision = 67127; + shortdesc = "Thesis template for Tsinghua University"; + stripPrefix = 0; + sha512.run = "8a70b2f51275494437fde3ef83e0f0d901b7164cf9e330d19e00ebe79bb9b4215a6cb3e7137970eb528904e35ba7bee3329f32b9fee64181f57dd09883582207"; + sha512.doc = "fabb0e47004a0fd21f06f442d0b7eb5384242e879af7b7303a7c354d7226213df082d3c38ce24cc571d667fa2b4d978741fda5518871d727ed491a60f1f1637a"; + sha512.source = "3f78020ca5563319ed78c851f781e1a40f16dd234207bdb2e6ddc38cff5f622ab7891c37bf7a187d927e81d9bed96686547d081156700654c23e410964894ab9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "7.4.0"; +}; +ticket = { + revision = 42280; + shortdesc = "Make labels, visiting-cards, pins with LaTeX"; + stripPrefix = 0; + sha512.run = "cefb3e06df2953063e9d12f19f03e973212e784cebfd2d6628d2e9ddb443159b285b34f12238f6b77813cc48e86aae7018cb5bccc4fd158f4d891f05fc51dab5"; + sha512.doc = "fde4b06ad09837d1d6b6efb275800e32f617619f9c18d2dda5924b094f860492053c4ee361a2fded1c9f4509ba5e615601b183191c0cf064af24cc59cfb23748"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4d"; +}; +ticollege = { + revision = 36306; + shortdesc = "Graphical representation of keys on a standard scientific calculator"; + stripPrefix = 0; + sha512.run = "92bebbf5a5e7ccf7be09c205d9007a780422c625d9a308eeeae50b2ec4ba3cc6755a37fd8a49e24b7a381894cc3791fbf50f54348c3ac584a2c0d9a693f93a56"; + sha512.doc = "f0049064eab926eefcf77fe5aa0606202cbce79ed7f0e0f1bafb171ad82b72daf09fe2c0cdf79720834d6349d9190f1d3069f155df922ceb469ad3453a6389b1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tidyres = { + revision = 67738; + shortdesc = "Create formal resumes easily"; + stripPrefix = 0; + sha512.run = "6ae766645bb046c18c0ecaab4d567ed3b66800696a37e28cbc0100dd50db7d89e03b5f2bfb8073a1d819f552f81ff8ecb692889ab7e2cf28210474663d4943e4"; + sha512.doc = "53b927e92aae7d598eef4de6035b8165665a7ed06f37a9457ff16b92eca2c075045f528c62b179923f03d790f163741f5a900b505a50baa8b299d6fb2513bd68"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "2.0.0"; +}; +tie = { + revision = 66186; + shortdesc = "Allow multiple web change files"; + deps = [ + "kpathsea" + ]; + sha512.run = "ca58ca773fd1e4e786f12e1acf9b0e39afe1709c73cc7a0da4331576933c1a4aafd9eed3a0181bcb20b6087d409c73f78fc2a77d96bb75d183996593b8aadadc"; + sha512.doc = "66e92b91bcf9b6c44d8d2af141d4980a2b0e0ee3a9dcab778eae118debe4ce4459c933cde6a5cb8cf07af8b5d5d001bc1bcafa2776ae64121ba6308a7b19b3cf"; + hasManpages = true; + license = [ "free" ]; + version = "2.4"; +}; +tie.binfiles = [ + "tie" +]; +tikz-3dplot = { + revision = 25087; + shortdesc = "Coordinate transformation styles for 3d plotting in TikZ"; + stripPrefix = 0; + sha512.run = "6d4aac2eaeebbe2a4827a5a40e8571c48ff4f5cc854daf130ec7f20f8fa06135bae1486a42b223410be848b72be2c19d6e2ed798694ef5dcdb5861846bd9c072"; + sha512.doc = "0fd9bde0f12ddf5a4bf6e2e1df66a9aafa42e81cd945b41e09e8d289c57b04faddd303a415c36239e6686be90f06e8a7cc794ea50d17ec54f1e25703314257da"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tikz-among-us = { + revision = 60880; + shortdesc = "Create some AmongUs characters in TikZ environments"; + stripPrefix = 0; + sha512.run = "13e082734e52205e78e804b708c920836c04e9b11dac23e49a8e86d40209ce1e074ab5ff30d97b528c027fd45252824a41daa850d1a9669987a7a59210f7b2cf"; + sha512.doc = "6146f3ee670400e39771a264eaa81a9b4b701a47487c7a4f9ec26ef26a93641062bc61893f71c4f66c8a035d52d763aa94740d9a00f5ce5b402272d67af93ff7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +tikz-bagua = { + revision = 64103; + shortdesc = "Draw Bagua symbols in Yijing"; + stripPrefix = 0; + sha512.run = "bb9444547aee41fe90a4f8b8dbdff080b594d05182798ce87274dab5cf3f0510d428c79ee21eb90107ce9b98a0cc906376d1b49ffa80ea57598c4418152f9ac9"; + sha512.doc = "894fcec05e43df7fd13fdcd5f51e50128defa5a3ac67c2681f509740906449322862d885e5188861a1b92d6aeee9b6d4454ab1aefad74c5585efd937fa789e0f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +tikz-bayesnet = { + revision = 38295; + shortdesc = "Draw Bayesian networks, graphical models and directed factor graphs"; + stripPrefix = 0; + sha512.run = "b3c535af8afe86e311e4c7371addfa484403a0a9571a17d1cb8d39dd7242aa4798476352bb04a6bb214086f1ed4985595c502723444a032f9bde04423c26bea8"; + sha512.doc = "2bdd764163c606579e68099873844fdef6b9a36495f4117b99ca483bbe43334965a177f398da60e82c11035b5c7b9e0513ae56e6868d6238cc0c798f47ab37e7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +tikz-bbox = { + revision = 57444; + shortdesc = "Precise determination of bounding boxes in TikZ"; + stripPrefix = 0; + sha512.run = "e68c3c6922c8529bea0b7c25bafc488d7aa41ad81afacae0f674caf637a1638dc8666bd16628b123063d94031d4cd4691ca127bbb648c1fb5a20d72ca8a41fbd"; + sha512.doc = "428d94e87d51e000c5fed4f5b0bd87b8fdb261b9550e0c67e05a69fcee7a4ce3ee070f262d278e21cbdc5bfeea790c6d17450bc91e1e51250b572e754ded3df8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +tikz-cd = { + revision = 59133; + shortdesc = "Create commutative diagrams with TikZ"; + stripPrefix = 0; + sha512.run = "abe5952a90172dd74ddfd02834ec9fc632f26da00450c310eab2528d5b52750e80225219b75e778d1f87b2279e654bb743804da19ec7da91f12e4105f9ec3447"; + sha512.doc = "ec354963bf8915a0c0b68fa0223c48ac48fc0450aff936c34e4c95fe15641319b711b753da7da542352e0fc6e9bbeec627de5a3023b4b90828ee05a81ca5d255"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikz-dependency = { + revision = 54512; + shortdesc = "A library for drawing dependency graphs"; + stripPrefix = 0; + sha512.run = "f13e652066ed2237c22b397b76f628e9108a999138ab5d8349792551205cada4709031f5c4b458982618871d4d65abfe5623f700ee9d8f474c66b1e31df374b8"; + sha512.doc = "3ab32e535d11802b3a828b8b49e78f31df5e5d3c7c36509a3b8aa0d81c02c465ec84d45b9d951ad833dea705381b4df05fa3d9a478db9af0622bc0d69008b227"; + hasRunfiles = true; + license = [ "lppl13c" "gpl2Only" ]; + version = "1.2"; +}; +tikz-dimline = { + revision = 35805; + shortdesc = "Technical dimension lines using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "c7a3b158a8acd100192b7dc936f2e452513125389f72c12f0c3818bb4e771abf0748338f13603765904adf1d808fc2b263d0f798999c52638e610d24addcc641"; + sha512.doc = "62edb9667ae4405c798a00c1d079ea9ed5bbdddd76e4a730aaf7405d175afa146fcb7bf43a551001eeff1f683ce3b47a0a79fab66b7410be59f18f4f6e409ef4"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +tikz-ext = { + revision = 66737; + shortdesc = "A collection of libraries for PGF/TikZ"; + stripPrefix = 0; + sha512.run = "83094598e986b8225ba72ca5a151b8d7b475b3fe41199209e816ef9e7d7b3609e693a321a219968d38d78aafb5fe1ac6058e6860379687077abe4921497d7cb5"; + sha512.doc = "ca2e8a322e3f3a63084d2c0b79d3491fdbdd1b6b363e66d721e691ebb73241e96ac7f4ec352588f46a49ee1b16b4ea214d145692f194f67b5ce23d12701e1eb0"; + hasRunfiles = true; + license = [ "fdl13Only" "lppl13c" ]; + version = "0.5.1"; +}; +tikz-feynhand = { + revision = 51915; + shortdesc = "Feynman diagrams with TikZ"; + stripPrefix = 0; + sha512.run = "5dcaa2f5c846957f3583ac5bfba14c668cc855c6dd930eb5851c19d448efdd207ff34599b09379354d0c772cb1890fac375d75d61524e64148602f4b5dde4355"; + sha512.doc = "b0cf316dafb9494fc21d5657e1e3c1b4780b7c30e2fe93235d6d8538979471c31989e4203575dc66204fdb1cb11386d290feba3070e43a273b62ec59a73047d9"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.1.0"; +}; +tikz-feynman = { + revision = 56615; + shortdesc = "Feynman diagrams with TikZ"; + stripPrefix = 0; + deps = [ + "iftex" + "pgfopts" + ]; + sha512.run = "34c147e6ee16643e99d2c8fa789b39aea6f3b9ae7de93fd5c65d1b0daca1e9514d484b5b38892a0cffa1aeedcd405df0bc6621bf68e587311bc9fe45205c29fc"; + sha512.doc = "ae0510a7971538fe458d83d4da4c78f7d607c7a1298344a139c02c49985f9005f6a81ab15f9dc621929d70d634c2cec4189ac4a2955e994611247af0c96986f3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +tikz-imagelabels = { + revision = 51490; + shortdesc = "Put labels on images using TikZ"; + stripPrefix = 0; + sha512.run = "b74cf7113b288af9e98ceb801eb4d72e4785ce30390718c4c0eeabae20c49ca8eba91342b89dda525f06b9f436a427277c4ae8415748f1487cdb073088ed26c8"; + sha512.doc = "843f943c4a0e12d1260ee17f9f908adee568100b1e415df3f1b383fd83d70065c57a21290b89923d7ee84819356a366a467e42fed61370b214621a9ee58ee97f"; + sha512.source = "2c6d1c0b599488bea8d53c136d81881d8cf15497e295b6e0701bc8570f2e868bdb1e0149f25943102cf6e9babfd53ad8401328224bc16a305f46748857c79572"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +tikz-inet = { + revision = 15878; + shortdesc = "Draw interaction nets with TikZ"; + stripPrefix = 0; + sha512.run = "0c4ecd55d10893ac8bca7b8ac38f2366f30cd989c5d6ab4dd501047f01c0285f8e4b78309dfce06525bf525cff77e2edd56429aa166f24b9a7e07586e3befe96"; + sha512.doc = "e61f0a7879dd0ec016b6c85d66e6ace6b953adc2b9abd87306dc4d071d82f44984e6e25530db3fc658650f5ca74e5c237aa64d18e60a3c5c8c7f57c6f42103e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +tikz-kalender = { + revision = 52890; + shortdesc = "A LaTeX based calendar using TikZ"; + stripPrefix = 0; + sha512.run = "8bda7464a62135fe2eb8739d428aca770ee6ba90d3fc08037ebd192f6e436116b59962ae7e0f0cce7addc6a44d0bb5eed47d8c0ff83371a070d3a5c0e8b1feee"; + sha512.doc = "d73e1427574212a2652191b0afce180155ff32b7d8d63f076f2b5dc71c64d1d8dd562666f8a7ebeff445409fb884ac79a66d0271582b0b6b72e84c5fe7c44f7e"; + hasRunfiles = true; + license = [ "cc-by-sa-10" ]; + version = "0.4f"; +}; +tikz-karnaugh = { + revision = 62040; + shortdesc = "Typeset Karnaugh maps using TikZ"; + stripPrefix = 0; + sha512.run = "aa7bb0cbaebbae2657002c01098e9904c21483bb9e67a415834d54b2bcdeae75514a2e98a53e98ba87996b3147af84226e43ec9d121eff52b4f77d57d1802db5"; + sha512.doc = "25ccf7b40c1e808bf5fc45241d3f811e603bdeb770b21e5d98779e04ccce1ff67e73012816b763a083d07f1c62a16cce8feffc0e1c87ced8b83339de84d4cd4f"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.5"; +}; +tikz-ladder = { + revision = 62992; + shortdesc = "Draw ladder diagrams using TikZ"; + stripPrefix = 0; + sha512.run = "c18340557f53f0617831e7e6dc904840e6f1e04938684a21f2897297c8a70b95cacabe4a00e66d632026d8ce7728334eadaf02cf5bfe4ffc0e746f3ceec36fb1"; + sha512.doc = "d77c8771b36df84e61cfada1f56300b10908727a164788b3c0665f14a26db5b03a3ea7f4a0fabf5ecc820e90a27a73c0ff0a7985e37e755852ac401b7143e7c9"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.3"; +}; +tikz-lake-fig = { + revision = 55288; + shortdesc = "Schematic diagrams of lakes"; + stripPrefix = 0; + sha512.run = "3c1c8d90d58c564f54abf0c34db63b3886f6e591dde8a2f7322f9ea2c6b51f10d1eba9d9f66cd1bf6e98e8ad57cd7a1d329e879381b164d4e1517331325ffa4f"; + sha512.doc = "86afa9db08487666cea340d81355e73e64f72566efed3d1fdc8dd86108eb4f82621850baab86e039572e0ca40d5a38157091fa15f7e1462cfabc73be2c5de0af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikz-layers = { + revision = 46660; + shortdesc = "TikZ provides graphical layers on TikZ: \"behind\", \"above\" and \"glass\""; + stripPrefix = 0; + sha512.run = "900f3cba19f723cd75f59f2d3380ac96c6bcd53f4d80ce27b2d393d4728f37b9d9d2bae414f20d38e4b3b93769374281d4e741ac2480986b1662696e08a9a207"; + sha512.doc = "617f1a53fa77f4a766157e72013227e992589b0030ac90ddd181643b1ef212f7e83b8f84f2520d64acf53f2cc76e3333e7ba56b78984b28c3320e2977a87cd56"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.9"; +}; +tikz-mirror-lens = { + revision = 65500; + shortdesc = "Spherical mirrors and lenses in TikZ"; + stripPrefix = 0; + sha512.run = "133199223a6b40d9f07dfffcf842bf3cc5b37f58858aaf96fc5304f72d590f7ea4c45349455fb41ecadcffbcfeb8dae2fcea79cc282038d2bedd589a3a7cceeb"; + sha512.doc = "6515311c8514384e205bb3f3f0859e33c05f3b4b1815c56d84c6c01aeaefce2fa9b4d8a87a882ab38afb6fdde7aa236966bc6ef775d4a29aa35fc8c1611d0eae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +tikz-nef = { + revision = 55920; + shortdesc = "Create diagrams for neural networks constructed with the methods of the Neural Engineering Framework (NEF)"; + stripPrefix = 0; + sha512.run = "27ca8ead5ab99566c3bc398b52df4da6bda646519fc5d84d4a8b5476fbf0e86d8b405f2c88a9be56f6f6f4def0e5174ab0b2bc8100300d6b32bbe025dd7bf9c3"; + sha512.doc = "07e9b26ecb4b334c4d7459e636eb116dbf03f7978f88d29f462cd2f9ad81bc24bef57dd659d23c39e8bcd81ba4fa74214c7c399c104fb5af35bf18dfc3e4d1e3"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.1"; +}; +tikz-network = { + revision = 51884; + shortdesc = "Draw networks with TikZ"; + stripPrefix = 0; + sha512.run = "e8100d04b9ef3336a514d18f43ffa6af5d4c2a2ce28663c9f4b40272f5619dbe11dc32f8d7399b7b730f8a90c5aab5fe18cc839d6736d7be6c8e37289e2dd30a"; + sha512.doc = "26cfe73177bbe885cbb224fcd9b4f136a224947a4d9000e24c7f4fd1c44194ab8d2e11dbfac558c68ce36a30c7a7b82f335e3275db22e599dfcddd48d91ab08c"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.1"; +}; +tikz-nfold = { + revision = 67718; + shortdesc = "Triple, quadruple, and n-fold paths with TikZ"; + stripPrefix = 0; + sha512.run = "d227be41f651a45240b3cb79f1aebea5015a06eb75c0a5aa69823731c69cad02c2f8b621de3d10d3b2a334781693f39c47f1b5b560c58ee9c5e7278258bebe5c"; + sha512.doc = "a6684f61e230a4de3cd1e4b0da5ce17aff301cd80c434b7c9375d1e4abf3d3b6f3295979153f957b1499894e59d1fbca23e639ee76db6ff6d719df425d1da56b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +tikz-opm = { + revision = 32769; + shortdesc = "Typeset OPM diagrams"; + stripPrefix = 0; + sha512.run = "eeb000cf28e2ff79106edd734ab71b9ec4ecb0db043a8b03764a98a33d3ef570711974bb13b58453362dd045b1019bfb4a1c1a856b74590110f7d8af308a3f01"; + sha512.doc = "a2ed9a4b52d34dece5b0007b9dc46cf8da8cee0a9288b8db79f38068db5227e35ef9e3fe1f93a4c53e994c06c2d5cf21257bcde24b02f1553cb21d9f7585751d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +tikz-optics = { + revision = 62977; + shortdesc = "A library for drawing optical setups with TikZ"; + stripPrefix = 0; + sha512.run = "ac0a42947cf864f28d5bc23aef1163fdee23e05d54ae570ed28e3445a66cf3e9345d6be7aa231496ad86065731ff0a2afa7ad0ce53332fbb3592c07bd396e297"; + sha512.doc = "7b088c27e6cdb4c2b7b44400a31353963b0b45cb26251edc60b4b8eb54663ce2cb76784c9850349e50728d6e7366be22ee6d84a79fccd5791cf713133079a1ff"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.3"; +}; +tikz-osci = { + revision = 68636; + shortdesc = "Produce oscilloscope \"screen shots\""; + stripPrefix = 0; + sha512.run = "93711a01365e992d47306bd379ebc8f72296554288c855dc1f678232e5030894a9241d195cf949133da45ac8df2de1b55244629999f0c311b55d51a2083c4693"; + sha512.doc = "356d60c65bde0d61207df028447409827888a420300a4b27867561494917e4a45db8e6a6dbe291fd19797d64d912089bacda9fd18ff405a28ff2d6512b3b43db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.0"; +}; +tikz-page = { + revision = 42039; + shortdesc = "Small macro to help building nice and complex layout materials"; + stripPrefix = 0; + sha512.run = "be0e43fc329a014b11fce907c6b073f5f4be64b4da4b184705aff2c08d82c1e644056491d01d59ef0ef8a22b4b4c3f22b9012953e00802a9b697a10f0a2f4920"; + sha512.doc = "896da337485c89508e7cb2adf377090b768beded3360a730a5a9c2400db73866b01e0091aaaaf8ce25b7444bf5c5a243f5eeff444d4588a4f8f8b5ac8aa9cdc9"; + sha512.source = "34741f8aec629a8d7929372f1fc5b51ffcef4d95fb95c039c9ba96e4fe05db366c09c88b6987b57ae0573ed067947e2a375f0bea96a74653133abba850453593"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikz-palattice = { + revision = 43442; + shortdesc = "Draw particle accelerator lattices with TikZ"; + stripPrefix = 0; + sha512.run = "6654ca0888b9a4ac7106d5d275a347e38de7dfc342d7c6228670e51a0285937015a39fd34e83e42a5ab8c2f4341e7f233535308bb2cd65a55227dba2d67ad79b"; + sha512.doc = "8fd0a5a2ca4371e021ccceef41115b6520df6437198fdcba7fc37aa600821a95e91696fabb19cb0277639ff7664574cc56a62e1edcc96e58f26dd65ef5c82fa2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +tikz-planets = { + revision = 55002; + shortdesc = "Illustrate celestial mechanics and the solar system"; + stripPrefix = 0; + sha512.run = "e990d8a92d8f34f3042117e289d7c385e17b973954a2286629c84cc2f13397159b75ec5ea1b032d710babf5b31d58d5f2b23a101b535b9d88328d797a36b952f"; + sha512.doc = "c92e05217a4e4aa6f49a5a400f2faea365483257b61db934351b0ec4c932e1d4d88e313f443cfd726db2b1234d0bb66f4f70064d690c554dcf4c4f16672b0c67"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "1.0.2"; +}; +tikz-qtree = { + revision = 26108; + shortdesc = "Use existing qtree syntax for trees in TikZ"; + stripPrefix = 0; + sha512.run = "5b00d147eef48e874d2d5c9b171e93703c728cb56f3882af4e63a41b36ebdadbd5bcae332bcfc8e091b16ee14a3a3e16c594b0f0879bdedeaacde1c1700c542d"; + sha512.doc = "0e2a19415d00cc6c94961dc2e8292038078334cbedeff63d889a3d843d9ca3e89533870cabe2068f5631b3f48fc456cac36b1720df175c20a9f6c986c388f799"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.2"; +}; +tikz-relay = { + revision = 64072; + shortdesc = "TikZ library for typesetting electrical diagrams"; + stripPrefix = 0; + sha512.run = "ac75431dfeae69fed707b99a42ecf64972436b22863e77586125fd6cde18e8e4d8bbdeaff839edc65aaedacbfd1c1e0ce776bde792b7613f810e7ac1f9102132"; + sha512.doc = "1194309c0892e7c35263389e96ec58121e9a82e887c4c702c69b381b75fd5f4f21df6c33440a746db6a944963d9a22a05b23e53f7c818901591499dddffa0087"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.3"; +}; +tikz-sfc = { + revision = 49424; + shortdesc = "Symbols collection for typesetting Sequential Function Chart (SFC) diagrams (PLC programs)"; + stripPrefix = 0; + sha512.run = "f31541b2333c5d8343143aad3a260e528523f78636cd772deae6e0eba81957ceeeb41491279dad621e4476bd9f5125ad994814cb2ab691e5039b54f9fffc7cc8"; + sha512.doc = "caaa3c08f358b7f920322c553ff77e1f42414f16c67d2dd77bde8992e545366224cd7070e833268437332c080d6c65ab244678a3e9d5888fa97d21aafaa2d2b4"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.0.1"; +}; +tikz-swigs = { + revision = 59889; + shortdesc = "Horizontally and vertically split elliptical nodes"; + stripPrefix = 0; + sha512.run = "f1e10c9cc4625fd2e61113f7d5c1cd637efd35ab9b0ccb4308837af3e384ae412bf068140a0924b0bad29e305fd4ba5a0770fdc1467e82cf85dd8eea8289190a"; + sha512.doc = "3ad431f150914461149b85fbc7ce05213c5176e6eaee553ecbf8d150644bc36fdcfa2d836e5201d9a8aecb58751eedd8b98a06ff305c60688766ce8dd00c817e"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; +}; +tikz-timing = { + revision = 64967; + shortdesc = "Easy generation of timing diagrams as TikZ pictures"; + stripPrefix = 0; + deps = [ + "svn-prov" + ]; + sha512.run = "2c3af958ff5509a470b4e1f93bdbb063f5b911a81de12d749fbd7dc6810715a473814d6d8694a81a49d2f45f1f468ef9d441fe07c2269c9c9a9094e350228b36"; + sha512.doc = "33ab52c8b2a60b9bad41a60375aa75432aea20a71c9fa7816d5dbc868e6a70b491dca9572d5c63ea486053294b6b709aa313de464e375e4f0a7a04f76764630a"; + sha512.source = "f1c7c0be255d533898bd65e85f2a36b2f86abb6580b716cb239821a243f67a2706cbcfffb99628b060aadc9b56dfee45f66e54851861df2e0cf12e6cd331aa4e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7f"; +}; +tikz-trackschematic = { + revision = 63480; + shortdesc = "A TikZ library for creating track diagrams in railways"; + stripPrefix = 0; + sha512.run = "421966536c63307c7fe9c194ebd4d5f8a724f99b9baba20a44e867382b1c08f934c9e88d02d834221671ec6e18d392e6ef4595b5a7bec9a18da03b84bbe06a71"; + sha512.doc = "f5d6c8b60da94b9471adb5faa8d159ed89a8ed4742049ae55da2aa615217215fa1334648c974e148031741fea1407b64297bea8f681cedc770ca13975cf289c9"; + hasRunfiles = true; + license = [ "isc" ]; + version = "0.7.1"; +}; +tikz-truchet = { + revision = 50020; + shortdesc = "Draw Truchet tiles"; + stripPrefix = 0; + sha512.run = "74cc5a05cd9558c68cbb7987671fe1e02a9a076049aad96d4c95d7471ff04e48f03c500f58b85bd8eead46e1af592a54ffe1ef0b0ea0644f4479a332a63dec4a"; + sha512.doc = "7fb291a9d7309c722fe31cbcea7a4004d44552f547e4d71fdcd667efb4aba41b6bf0be0cb941dd16e425eedc668dc6de3d2e55f964146a62b861296b0ed18579"; + sha512.source = "88a3d1ca19871e0329e40165b35ec90ce65b1565d42b4a678bfe611311a0cde68a6a8c67ff3ebdf78a1bafed1fec875a4f221efc6934724a265a3402d4970832"; + hasRunfiles = true; + license = [ "mit" ]; +}; +tikz2d-fr = { + revision = 67239; + shortdesc = "Work with some 2D TikZ commands (French)"; + stripPrefix = 0; + sha512.run = "87cf1fd8343df4c6960e4bc004da9154f98146b57a723022e5a81db506805ebdd60db1edafc03d9d787f151cb333c1d141c5407023493bba316b8b41bc245537"; + sha512.doc = "4951babe22ffa5985e3533970b88a8a92f626e18b34e8f7f11051db21accd2977a926fd7e668ecd018324fa62c8b539fe52c279f8ceddd5a037b76dcf03f399c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +tikz3d-fr = { + revision = 67774; + shortdesc = "Work with some 3D figures"; + stripPrefix = 0; + sha512.run = "6b60280f60ee690ade367eaa10a033cb9bb8452c5b5f6413b7ca4918d521638be357e6af6f760844046c15d1171f55b71f5210946ff4a6c6453a7fc332288b85"; + sha512.doc = "599bcf41c7de51c44c943d984bae860748324faf7981f754b44bf8125499822df505cebe2670229fd7429d5b6b0809f7c88649ad8996f8d2cac604b58c9e9522"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.2"; +}; +tikzbricks = { + revision = 63952; + shortdesc = "Drawing bricks with TikZ"; + stripPrefix = 0; + sha512.run = "3ea07c2c6c3ac86d8fa0308e438956e70e2584f7995b3188904e7cce7d311ad0999635ce77c134046da711a723bd36b9602fb60c21a00970503f572baffb6967"; + sha512.doc = "ab32949ad9502bea2ed2951db41029ef02672db38e7a28f02e90099dc1c1dc9b740f1539c3e7c9163b8da7dc2fb4eb21048ca17a0ce2366a364efe66e2a47609"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +tikzcodeblocks = { + revision = 54758; + shortdesc = "Helps to draw codeblocks like scratch, NEPO and PXT in TikZ"; + stripPrefix = 0; + sha512.run = "a19ee68d5d59d936f1882bdf1de5851b9cac48debc4754025d214cc6838173fd7090631b08dd1916043520e97cd479087ad4548c991c0631856510ee912a42dc"; + sha512.doc = "b75b6ddf66fedf1d69611ca0b817ad9c5d7c0bc162cca2f04794bc3723135032908148baf4aae1b486a0b5af9bc335b9e585943a3a2fd73ae55a0702236f5142"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.13"; +}; +tikzdotncross = { + revision = 69382; + shortdesc = "Small set of macros for defining/marking coordinates and crossing (jumps) paths"; + stripPrefix = 0; + sha512.run = "d99ba25a95558629b611e7ae2e845c9b87cc8766f468be6160115a8b26cc648e83351cf233f946f47889773907023c061faae7744e140129930db481b460889d"; + sha512.doc = "c481b80b675bb9cef760157b7b9ea7c790dc42c75624687231b603b39f3bb9835f642e50cabf4a046df67e3698032b644cdd1495d6a9932acfa3532a66b3b031"; + hasRunfiles = true; + license = [ "lppl13c" "gpl3Plus" ]; + version = "1.1"; +}; +tikzducks = { + revision = 66773; + shortdesc = "A little fun package for using rubber ducks in TikZ"; + stripPrefix = 0; + sha512.run = "73675b3ee47740e0c54c352a9cf3349b563cd22756a33aa1f56b6282a9cb4b2da3b851705e7574d5591190bf2392f8900a477d8f93b9102d831c01b2a8650dea"; + sha512.doc = "23fa53a7ee87b26dde5f9832c8b0b23466baaaed4be3ac361659828af6d611ee742b92531ee977fa0341ee5c3058a8ff77cf6ec1a7c3076f6ae4145328320164"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +tikzfill = { + revision = 67847; + shortdesc = "TikZ libraries for filling with images and patterns"; + stripPrefix = 0; + sha512.run = "4864d0859490cd07e123e1160a35fb7817c3ffcc1f409a8c61285823f655357473e0dc7ab92434b5b552cbfca3e88d9181e57cf944d2422467b466cbdcd743a0"; + sha512.doc = "f08d351db50d0ac3d6362c223e30b97b9a734a8b19fc426d5592a17692380667172ee6793064b8c2787ee9e1eaa1a38b70a821f53a2e0dc26316ba81f0549aa2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +tikzinclude = { + revision = 28715; + shortdesc = "Import TikZ images from colletions"; + stripPrefix = 0; + sha512.run = "1559c739ee5ce26c531ed1c989a2d986ee6da05880e6dcb8f14018c71c638028517d1c2374cb452421c92f5d430d4560ae4463732926c56ff33407941e70ffc3"; + sha512.doc = "9cf9e6f5e45f9dba8843684cce3ff395f18c485e30ad0d0566e947dfa69704cd99600f8673203ae212a1aaf77908715c2e5ddbaae0de3732b98564725297112d"; + sha512.source = "3c7b7da5f7fb09fb52a4517846d3cb380482a03a2506c0f2f04f4d71bb42c7ce6cbe4087fe772b45808ad497fc7ba353c9ab193e61c328d57a5dd58b607ad4e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikzlings = { + revision = 63628; + shortdesc = "A collection of cute little animals and similar creatures"; + stripPrefix = 0; + sha512.run = "c838782065c705dfd919708c281d97f1e399df4775ed1410473d392b0f1cd2c8e293cf608cdde5e3cc50a26c51ba6bff3c79b5e02216ae3d3318ab92cc0d6a11"; + sha512.doc = "0a728af74191084ad20d20ad2165bc7690ee805831541b5f2281117961fb9fa54e6f214a4ad570b63019fc8e7dae57c6a28ef37b18088a37f4fb4ca580c37b6b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikzmark = { + revision = 64819; + shortdesc = "Use TikZ's method of remembering a position on a page"; + stripPrefix = 0; + sha512.run = "21196deccbed47e7bd2a95adbe92e197f1073afd26da98ab92494e46ab7cef325c6005d8bcdffaa53a42de440cdf10c5d20370fa0a5f43894defc1a01a284310"; + sha512.doc = "c8222246f56882479a84f834b47332fa9a66d0dbb21ee3fb4018835aa9fcb26fa2204d70ca17d7c4609352648d76b1bcb4dd5a32eb7cb504035711643c944141"; + sha512.source = "bb2a0a621379392d5741296ad90d7ea7eaeb73496363e42e9be44642254f7db2fe8318572c6a44b0d0536cd33a96952c7d860024ab6c1d2ff2a2b2d85d78a46a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.15"; +}; +tikzmarmots = { + revision = 54080; + shortdesc = "Drawing little marmots in TikZ"; + stripPrefix = 0; + sha512.run = "c2ca7c1f66d070e1249b2ed9e88cadd482353140bc3add0146d7f67ffdd8c08cc3eb4b9c59f8e2d822000554a8bcf1e0f064c96ac0e002a6c80655c5eb909f81"; + sha512.doc = "03a4494458d7f053547952945e9ecf1c500dd3fafc665852498de05f38234c45f0972971e8278d279d36c81f2b920152f10ad1bda2c5b24e5957ad0846e77d9c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikzorbital = { + revision = 36439; + shortdesc = "Atomic and molecular orbitals using TikZ"; + stripPrefix = 0; + sha512.run = "cc0be76e583d67759d53ab89f777f137e7038eb8344e841a3a1c6e5327129063f2cdcb67c586546f8bec94e8e83d944ae864f291b5b7d384610f93c0ce604aea"; + sha512.doc = "676980e8772650f77ed37d545cbd4ac22af170e1a4541acbd0739f3b5c0aff91f3d48cd3b3fa3c562510c1c624f46de2218fe33a9e53532ca88ccbb929e3495b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tikzpackets = { + revision = 55827; + shortdesc = "Display network packets"; + stripPrefix = 0; + sha512.run = "65f07d48b37db0391081c8edeb97d59dbb7a261ad1320b3b018f14a2b4544bfad46964b82980b3135416ed75fd7f21d08df97179d1a3ae2fb55308d36e89d2cb"; + sha512.doc = "f669d0a09de871167915f4a6647791346703abf03b557c8afa03f5d3ed81754c4d175d211850b7d6f87c2b0a1077c8559093d9743130f10ef334c10df74ddc69"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +tikzpagenodes = { + revision = 64967; + shortdesc = "A single TikZ node for the whole page"; + stripPrefix = 0; + sha512.run = "f8e3258505ccb31b677212034c3300d442fdae73a45c0dc6e7bc0837cd716caa778ef9410f37ca1bd87c647d9cff28ec3d0f35496c8d1a5f940ce9e602dff475"; + sha512.doc = "daa0cc0d2125a41a6748a2b94b5f399c05d06c28479e1f1bcd188a647ad72048e17f1f851193dbc35bff58f6ed9696a4aa9885fdebadad3996d1e2bc9fda6347"; + sha512.source = "285249f6a0316dbce7b28c41afbcee367a4c682c75d0d31cd6cbbb2fa9ce68813839584e6c74c765ee0e03c4dec115091c99a6509328e2b2e5089a6222b42bf9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +tikzpeople = { + revision = 67840; + shortdesc = "Draw people-shaped nodes in TikZ"; + stripPrefix = 0; + sha512.run = "18621315d7bcec4bcca281b3c3410e281404fd29b0a5d2f4ad799aacb71a1c9d389db8bf1c9fc91b8cc279ec801f0cf8e31c826ded92d8476ce4ce5831754390"; + sha512.doc = "8b8ad4cbfc03663afa6064d4a81ea9c256b8c08522e455c5660c649fb9f1de7859f368d5252b348e0521d62fa3a446b6ef9ad2d1490f7afed8f5423a99b46d3c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +tikzpfeile = { + revision = 25777; + shortdesc = "Draw arrows using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "9da38e2e02c651e2f89a0e9ea917fc5147626026acc7302b7e32aa2cbee072f91311fbab73e44852a2c237290de76e560f2b45e88639936b542e6986d90a9b4d"; + sha512.doc = "a66c6ca303ab6afcea5d94b02936335d28077697d81632199de2678528100c3b5a754aa281fa83d93819a53eb2fc945ae899e254b6d6ccd926f8fbbd86d5ac2e"; + sha512.source = "0a2e2d5ec964bbe5e6230c609d1997fac779f1edb087fdf130b93ce3ae76fbc0b90f5af9076de3f969a8d69e4054571f63dea947113f7447b7fb1f526849929f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +tikzpingus = { + revision = 68310; + shortdesc = "Penguins with TikZ"; + stripPrefix = 0; + sha512.run = "78041352e86e68eb99f875a1c8bf7d4a50c527a4b405e4c93e9da6ecd716bbb0c5fad053fff80229723b4550345077371a52132258cb9d251c319f743767cb7f"; + sha512.doc = "1748e17af7b3190e19a0c446e78f5b40b6a135633850d610179f33927650c8cd92babca86e4fd10408586d1fd81814cbb54985ab0fadfbfd05219b033e4323c6"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1"; +}; +tikzposter = { + revision = 32732; + shortdesc = "Create scientific posters using TikZ"; + stripPrefix = 0; + sha512.run = "75fd7b71632c663329843a48bed32b2fd04cbac02d24271ff1a49bf03e2905ab8f94b5876ee68876bc6017455cc3272750e85eea6061dea57f47fe96ec9e1045"; + sha512.doc = "1bfdf7bc2aa38e876378a1dfac751a57ac93dcb0fc5abeff700107c8ef11423751dc69bd7502c9b2ad2641f7f760eb697a248833b6914111dcd86d7f8a32e9bd"; + sha512.source = "3d78ed0799114da415a112f6cfe73b84a242389d475e223db53a4c9b25d9d5c4ad3285910a3b24eb9fece2195dbbae72e18d57cc83f057fad6062bd5fd5325cb"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.0"; +}; +tikzquads = { + revision = 69409; + shortdesc = "A few shapes designed to be used with CircuiTikZ"; + stripPrefix = 0; + sha512.run = "104bdb76221a25a50644dd8c9a655d5adc4e6019a11c470fe24637a51bb91ac6fb718a4949bf940199aa47f43186f874aee59e5405db45a6497e45f84e69fd9b"; + sha512.doc = "5657179ce49163299bc91f3730dc3fcf77972597502f43822330199a20bc244649e6437a6bfb1c4e98bdbd02e30beee58b950dc73e8269b318801135025c6f1c"; + hasRunfiles = true; + license = [ "lppl13c" "free" ]; + version = "1.0"; +}; +tikzquests = { + revision = 69388; + shortdesc = "A parametric questions' repositories framework"; + stripPrefix = 0; + sha512.run = "616098fcc9f7867458edd525fc71d83786080b1f4ead9a007083d8347add52499b2fdf2c969213e06d43ffc59e9eb4d17bd7872404f1481138229c4f15c1aec9"; + sha512.doc = "433c1202106723c397b383edc37ecff762ce7910b4adf2e70a5ea2d2c823cac2f96147227eeffc71bcc2658b18ce875c780f91d8997f40ab823ab09eb1d84354"; + hasRunfiles = true; + license = [ "lppl13c" "gpl3Plus" ]; + version = "1.1"; +}; +tikzscale = { + revision = 30637; + shortdesc = "Resize pictures while respecting text size"; + stripPrefix = 0; + sha512.run = "73aa62d84417deec8085c3f46b1ababb756e32ae55c4af97def15816606df2b3df4a7735ab434d489d24dabf26806428d945ff3fced3c5eb7c19b36996f2f58b"; + sha512.doc = "d2ac9080a08d7d7e37ea2d1f801c4091cddf9540eb7c2cc2c0753ab0c07c2f0e7392742bc2e93274775c890184c126aa490c78fedf8827a6c787b951abcb6bf5"; + sha512.source = "e073c55b8101eca9f401dc58046cbae260cd9513945e9c7a2fadd0ef86886607d1f92b83a11258be94e0bca08dea87ee878af031c6b42e343b716a1c6af42a2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2.6"; +}; +tikzsymbols = { + revision = 61300; + shortdesc = "Some symbols created using TikZ"; + stripPrefix = 0; + sha512.run = "4e1a479e6e238026dfbdcf152d63c8b67419919f74bffe3c259828a5ab6bec62955cfe5f5a7f407646fc2e5b742fd009280ec4a57cf708317bd9dad95a35a1b2"; + sha512.doc = "7219e48fc2407bd44992378b24c5a1fd0b9c1a9a9c408de2734966657f83735b8cda336d207e9d1593afe0fc58aff7d83213a9ca4be61201df98757e2e4ade75"; + sha512.source = "546f813ef97e1c6d286b4c79e2320bae75e2d94e43d9a15b9d4c6786bab9027c2aa86ba1ff5f94149849f7c11834408106623929b732f8b54697dd7f2916df3c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.12a"; +}; +tikztosvg = { + revision = 60289; + shortdesc = "A utility for rendering TikZ diagrams to SVG"; + sha512.run = "0957b87c9a06771afab350de769e3fa9f97ec0aa09e4e740d0f916992948a65740a96446a0f8ac144273e94f228db2c6c0ddb22bd01ea9f0f66abe5adfe0125c"; + sha512.doc = "3d90c0963c570a115390603bcd5f39a224a155faea8ac6eec511b9689ab98383386d3d6e92076129e0f704d69bd18da52cf2f89f5db024a4d5c34a75c1edf279"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "0.3.0"; +}; +tikztosvg.binfiles = [ + "tikztosvg" +]; +tikzviolinplots = { + revision = 66659; + shortdesc = "Draws violin plots from data"; + stripPrefix = 0; + sha512.run = "00fde57102ed13eafb247859de00c62829ce60de361794afb9103e501033140baf9b474fa147b7282727f7294a0b337897985460526f573532d90117d5f8e552"; + sha512.doc = "5c7cd0990935fb05fa418ace90299532e3dea64e74789dafdff6aa9306e417a3fb170a2b5068045fe5069a08c4ccd97bf4c98ebf5f2102a2c9ca2564090ee52e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7.2"; +}; +tile-graphic = { + revision = 55325; + shortdesc = "Create tiles of a graphical file"; + stripPrefix = 0; + sha512.run = "b6235459600c5c8bc683c9fe778bf864f5ab3dfcc8c15afd7b997c45f349f05b57ded236daeeef1e6bbbb7e535a4f203625344a35d6e4de401c082a937090cfb"; + sha512.doc = "c945ece6ed1b83f4fd8923dd74d0c961c907071fd5d33feda3ea514beeb8b85878dc63011ba73edd1d4a62799ee2555cafe7d4c866d55d160c7e97168ab16038"; + sha512.source = "8334012b871abc58eb44f3b20f76d1afb2764f07be12b7122c81e5ab627a14fe2221596756868523ab8c6b11e0e7f4aba0b9740efbb221e569ab1889141b250c"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +tilings = { + revision = 67292; + shortdesc = "A TikZ library for drawing tiles and tilings"; + stripPrefix = 0; + sha512.run = "f0164d69df56b1b981aec352326eacdf0f79366852bba6eb010a3842c338c678f1f38d3a5b1043ac4ff681595cc4a14a127a40b383f7d5388d9c52776352ac13"; + sha512.doc = "13ac6a6e02a39420f0ed5e74d3f242561de4cd1e410fd6845e82b893c63d2becbf21064a676be29eed0c4b38251a78da55f43164eb2acccfb9f8d94fc72d6462"; + sha512.source = "d6ff1a0f7453df40b7873a5b64a6d449990a3f8459901a3aaa41a5977fa0049a6203bf1cc4802b3d7383d6c68b55abed99c13ff5c5e7ffef4dcfae0e36ed43d9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +timbreicmc = { + revision = 49740; + shortdesc = "Typeset documents with ICMC/USP watermarks"; + stripPrefix = 0; + sha512.run = "01e0e06769810e07389006e9443a836de76e95fea6133e7aab1f47cc554c3912a8aeb43bbf33d06cf9f3a8550a9eb9ec23830ab96ebbb84629ec957d7050e9a9"; + sha512.doc = "ebe4cf57814e6699127a30031c801efe583505098c707a97bece8dff93ff0cd4939cf047802ed38e645c339592e1a062c512dcb5d027192122e4c98ce41d1eac"; + sha512.source = "eae8ea0badfc036dd6c5908c95bda4e829bebc90e4d50cbf766937701a6f631ec9f39269d09889c5c2bf15a3dd24ddd8062829e5bf735c291e4338085749607f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +times = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map utm.map" + ]; + sha512.run = "06f93b823a6141a51554bbd682c128977676775b1c097f7787916c0c14b76d6e9c4041645003111d5a1b905de4faafde5b3efb61d9be9740b9627ab57f3f8eef"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +timetable = { + revision = 15878; + shortdesc = "Generate timetables"; + stripPrefix = 0; + sha512.run = "caee17cfe1a4bae7bae4479066e2f869e6ccee34d28a8952bed7a1409bd9ecb27adfd005f0e824d8ddacbd0e65762da79f9ea5b04d0332d643749ef36b908946"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +timing-diagrams = { + revision = 31491; + shortdesc = "Draw timing diagrams"; + stripPrefix = 0; + sha512.run = "0c07a24aea43b0092610cda5878a7e2be95777f199c9983e0aad42d83c1a6bd96dd4ca4caddef6b61165d62e924033eb01524fc925fdc8a4fd4baf44f568eec6"; + sha512.doc = "1882008e990cd6cfea47b35bd70a50f22972dab0470ada417edf1aa236d2619d57bd3b1d4a149ecc08c1a196c36c9dbf97328f58ea4aa25acb0a6addfcfe8651"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +tinos = { + revision = 68950; + shortdesc = "Tinos fonts with LaTeX support"; + stripPrefix = 0; + fontMaps = [ + "Map tinos.map" + ]; + sha512.run = "0212c5d1d87d1c73c66926a7bf06b2b62a0be51b3a03daec2086a15a4facd80e175ba3f4e23f486e181fb6d3910b77f7d26c28a8f76a9802b5112b010efccc2a"; + sha512.doc = "e7f6fa5253e729b602c1bde603e568d5cdcb953e2a4f1e478c52959d25f58f7678cd107466d7a99b459af70250076c5f16224e4ee549998356c1b1957aaa60cd"; + hasRunfiles = true; + license = [ "asl20" "lppl13c" ]; +}; +tipa = { + revision = 29349; + shortdesc = "Fonts and macros for IPA phonetics characters"; + stripPrefix = 0; + fontMaps = [ + "MixedMap tipa.map" + ]; + sha512.run = "7919b8f5a416cab24c02675ee0a24c60f64e9dfb3bbacb416eb74e29badf6b4dfd8a0528cc8b38dab6395b8c74ec5c808ad84d3a8d4ae5e8212691bed9066129"; + sha512.doc = "213c4eb24943e655c03087dbc5a51eb3cfeff09ece1d31fd11f1734ab3b219db94cc8b5f4735f3d6381b79a5d6ee2cfe727acd17f823b21163e910c09f48e413"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +tipa-de = { + revision = 22005; + shortdesc = "German translation of tipa documentation"; + stripPrefix = 0; + sha512.run = "45ce2504e63e517e76ebbd7b6bfc7b6a4b3a10d72747714c731b6af0b1a9de4d025bce996594449ea61e983097748389a6d878936078fb676ddd4d6f1f267425"; + sha512.doc = "c69333d9a7d335fb217dacb00610b9f0e5eaaf78e535d69998fc600fe53f0ba61c7e3cc1e82d75f52b435cd6945044560b2d275476e96d84d611ab4978c02e3f"; + license = [ "lppl13c" ]; + version = "1.3"; +}; +tipauni = { + revision = 65817; + shortdesc = "Producing Unicode characters with TIPA commands"; + stripPrefix = 0; + sha512.run = "4e628711f3f1efcf96787bd1ce489380a699c4f800edf79523c8d5929339db8ed2b7c2ba49a456bf71b8b280e006fc672ec186b92c35b83934adaa561ce9f296"; + sha512.doc = "9b4f7c48f48797bd4b40e3d823a0cc25f4edbaf1983067ec60ef1df6be58553c10438bca825c4315bee1098d57c8255e988b784660ab6c8ff9d34b11a42d3430"; + sha512.source = "c7e8ced6797fe52d534c30e216bf1f8a1a6154a60623201ed13aabae07ab68a67b1f3bd62c7651e36a059db3742fad364a8ed4eb26f72b1846090f0887f25b06"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "0.7a"; +}; +tipfr = { + revision = 38646; + shortdesc = "Produces calculator's keys with the help of TikZ"; + stripPrefix = 0; + sha512.run = "c8a8efbca7e1785dd81fd4695ed7e0c5dbe713d0a5632078bdba2f7df8e9358bc246d8f9d972ad3035106a7ef687f9229ed31bb630009eaec3b63170cf8933bb"; + sha512.doc = "bb739994051c5738ec0cacf1111d104b225593cbac1ee829057dce42017990483630cc062131ccd7d766d7400a252b1ff84744f91b77d0ca5a1f9ee195a28d5f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +tiscreen = { + revision = 62602; + shortdesc = "Mimic the screen of older Texas Instruments calculators"; + stripPrefix = 0; + sha512.run = "00682d70199d66b3f6a759a32a1cad6b14ef09eaa541cb0ef547d86fd512ffd525f2b53a8c1a7315462aed33148a0b769eea70c5c42213d0731a1034cd96d6d6"; + sha512.doc = "58add8332b25188cc4d7199cabc2ca49e3d08598f6ee2511bc525500b1ab0dd7cf8212d5310ee7fc803bf06c09e4c248eae6c52c52e0a3b3a6694ec1d36ec57f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +titlecaps = { + revision = 63020; + shortdesc = "Setting rich-text input into Titling Caps"; + stripPrefix = 0; + sha512.run = "c9a91646115722f41a82e4010e2b95090447e66864e1b7cab57f24dd797e299568d3c5422b3974829112cd118c4e40a2b14c04eb0e141105fea7f6ef8358bf9c"; + sha512.doc = "5b22152e9e3deedd0e6e19bff817030287b81849e76d0b926caec947e315e0ddef533cb911e0fd4f91346b0c6cd7cb87ac10f33c64e3dab6b70de09613949f1d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +titlefoot = { + revision = 15878; + shortdesc = "Add special material to footer of title page"; + stripPrefix = 0; + sha512.run = "aee68d15213c20d9ba0ef6e3a95f111804e4438d2c80a6cd83ae67725c3174db7f38b0d4280b26f7119e9e1c6477a0aa04d3ee5877e15b05ff2742d94a720c5b"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +titlepages = { + revision = 19457; + shortdesc = "Sample titlepages, and how to code them"; + stripPrefix = 0; + sha512.run = "affb8e221dd2ba1ad6e18d08dcbf3176bf65ae3006a732a7d2bf954fbfe90215175cd3de0dbb7546906b7d65eecb9aff06fabce86c46e88e5027851e11e52260"; + sha512.doc = "703f376c6bb2480f7a326f31ec277716073ddf67834930401c17627dba41c5321a0115e01ec73160917c68fb7ba4e0042e8ac40d968eef89f52b5dd27c2e0495"; + license = [ "lppl13c" ]; +}; +titlepic = { + revision = 43497; + shortdesc = "Add picture to title page of a document"; + stripPrefix = 0; + sha512.run = "753ff5c116f102ebd9fe59ea0ad1e80a7fd102f55588f9454fb3ef43fd5478add2d39984638e112dfcc5421f5f79b4c34c8c15d47845273744b6960946ad1805"; + sha512.doc = "6faaeeb6c7212e35c22321e279c08ac8a985ebb8ec66054b49456ee5a9491b88e48edcb20920d61a052b2df9617ddee7e40bb0e868fe082ce5889e63c193b641"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.2"; +}; +titleref = { + revision = 18729; + shortdesc = "A \"\titleref\" command to cross-reference section titles"; + stripPrefix = 0; + sha512.run = "73905fbe96bc095f602339e0c943048d775bf2a89ef9de3b7149dae7b76aef04e5c77803555450d931f3a4dfef16f5e72597a4d06052d4a852623516edd978f5"; + sha512.doc = "70db133fb8a5fa38a6f0f82912d19afe84e0f68820fe62b3835a6d237582a32fe6c2ba5ad05e46f39540d52d0aafa5a88325e1050e6102164a5753fd9c68d6ad"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "3.1"; +}; +titlesec = { + revision = 68677; + shortdesc = "Select alternative section titles"; + stripPrefix = 0; + sha512.run = "b738823380d594dcef104e3b7fa05d9df233385ddbadf6fc6bb45e8346311f5f58f5f605dcb4b6541f88b57a27b73236eb77a1d128430c6ede675625e2ec051a"; + sha512.doc = "b29c7b4dbeaee946e404166a4b1f4848ecffc4cc238534cf0c7248b1964146893125a9f5f8f87d6c2ea21c1e61304454bf7eb57d95842397363b88d438636363"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.16"; +}; +titling = { + revision = 15878; + shortdesc = "Control over the typesetting of the \maketitle command"; + stripPrefix = 0; + sha512.run = "2a321a17b1ff74f57e7bf3f9d72d1b66a0623ed286c8aa75df6d55f1e62b214954ff38456f27f172789bc4cb500688656ab156609933faef67e62954d05d0ce2"; + sha512.doc = "e69af16331da73c2a61b063ca4dc4c5f70f7958c366b06e96745a2bc92397f89210ebfe598f445ff33ce7705d0f0b56fc3a46f93bcc89145d50b92d56820f61b"; + sha512.source = "1b32988678f184fb335c70ee59d47cc3e20a7ee0f1606495d77880aa915677ed4a885557a406cfc5f5a67878cdd0675ecad503a6457056d901b96124f7eb171a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1d"; +}; +tkz-base = { + revision = 69460; + shortdesc = "Tools for drawing with a cartesian coordinate system"; + stripPrefix = 0; + sha512.run = "a26cb6c8fda3baad6d455a989a4c0f46b5e3b1364acb8f32a866f5ed946344574d29b310c2fbf4e3534dde555d068ae588f9e04b430d15a59ccfdedfe31bd2ca"; + sha512.doc = "9da2aa2bad4901e14cb4c8fa747af000de891005c38175bdce88d706fe83166b534f0d5b39c8557e5ae5975b8b58212cfafee7d2d22c07e76d41ba77ce1403fe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.21c"; +}; +tkz-berge = { + revision = 57485; + shortdesc = "Macros for drawing graphs of graph theory"; + stripPrefix = 0; + sha512.run = "1772cc37537ca421022c5b68536ddcd6cf0d5e88d428cd7682e7773a8290c4b2ad90a11b07dd8c4a4edce69497b63d9a87b5f113bc5857dd8e59e7b80d1340ff"; + sha512.doc = "84b5524a8a0cbce6f33611b77c451fd9a75f0d60375e61e2064b27ad4f28a579fddc9a9dae538cd1f540cfe78f98fa62d9b2df979b9a1ca8e73245245ac35f1e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +tkz-bernoulli = { + revision = 68780; + shortdesc = "Draw Bernoulli trees with TikZ"; + stripPrefix = 0; + sha512.run = "0824d03ce5cca5be08cd648ac3629094eb4607681601b5d75a56069df687054b5e88c3645367c0728de8f7cf43971b32286eff4b18dd094c620ce37e6c957880"; + sha512.doc = "ea1d787fc049cf42605d6adf107892aa4afdcceb32c874382453836d30b956e1599e2b9286a0e64b823d55005bf8ae2e81259d881b69172f6af5db4e01aab581"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.3"; +}; +tkz-doc = { + revision = 68665; + shortdesc = "Documentation macros for the TKZ series of packages"; + stripPrefix = 0; + sha512.run = "ba4c220f4a53089f8e6cde73cbdd7e1b8eb68f4828217dd5dbd3360086bb946fbfc30a993c678bb8c6e4987579016f610875fb2edc796fd19968c3940a0f4402"; + sha512.doc = "f4e798620ecafd750332e5ae7b3491eebc72c02ecad00e9a67247ed0eba56a537d8ea139bafa6bd9bb1c908dbcf0e13491d2c208805cce1f18db438e8da38a71"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.45c"; +}; +tkz-elements = { + revision = 69715; + shortdesc = "A Lua library for drawing Euclidean geometry with TikZ or tkz-euclide"; + stripPrefix = 0; + sha512.run = "cf3694ee7c964b32572bbba7f0f90f9705f546ca074ca566d7f9e104424d9f3a06c804dda89e83496a5749341778d676742ccd1d11fbed4267b025944d876a03"; + sha512.doc = "041eacf3a2657e364db72c12defc437ae336bf4f4250d35de3272f27821b01b4589f102cb4232c7eb1afbf3fa6474df022a0f40a79129b17d2325f81694bb4ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.00c"; +}; +tkz-euclide = { + revision = 69702; + shortdesc = "Tools for drawing Euclidean geometry"; + stripPrefix = 0; + sha512.run = "ad51786dcfc0bb75edc35b53f753972be5112443901d9e3fb42707c33b08ce2ee16e66443f59b6e6d84767fe48088c1ad0532a7c9fccb70da29888db607f6b68"; + sha512.doc = "8225a344b3c73e3fe4bf00d36517f3fce40cdac5580b605b3571568c58737d8981db8de1639fc5d5cab4ae881898dffd7799b390d6535dcbdcbd3f9264aebd03"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.06c"; +}; +tkz-fct = { + revision = 61949; + shortdesc = "Tools for drawing graphs of functions"; + stripPrefix = 0; + sha512.run = "ce605595518cb9b400a5b49620b5f359de8e0fefbc939d88b8f5aa2113a856ce05f4e9f56bb149c73e5f46c65d7d340a65edd6f1b55f6cca68b10dfaf7e04a87"; + sha512.doc = "c2de4bd1cd9ebc5e0747608de7b1780ec97da00c512d3e1b2ce3150431c307c043f24b0bf1853d6c3e96203c33573322d66dbf0db7cd82f5b1a026ee5b7c6d77"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7c"; +}; +tkz-graph = { + revision = 57484; + shortdesc = "Draw graph-theory graphs"; + stripPrefix = 0; + sha512.run = "04cf17f69862b2ec068dfc061fb019b54352cab3fdebb3111de3c28bf15047e06c236d979e9a9a92140c2a59ac9c0813ed7006d0411737b1f04f71c3a5916cda"; + sha512.doc = "df2a31047ece6f5809db42be2243d00b0342d54d3b864de6a32a43257b0d8525170e9d642db495f876c12adf4ae5580252c1378356acdc5f18531aa3099e76d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +tkz-orm = { + revision = 61719; + shortdesc = "Create Object-Role Model (ORM) diagrams"; + stripPrefix = 0; + sha512.run = "41263c9ad122a3cfce3eca3cd4ba8798e61ef662ebf7f00be99dd16a25b50f5419fb6c04a84bae6bd0ce2b349d4b3216a1a88c6e3d081d8a064ff561536a7e71"; + sha512.doc = "ba9a6a67384478cbcf5b76f7148f60bb0f2f1932033f95945b28794f146d89b21e82c4d59b87735d46bacacd10c1ddca2b19e2e7ae4045a331383f4085a99221"; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; + version = "0.1.4"; +}; +tkz-tab = { + revision = 66115; + shortdesc = "Tables of signs and variations using PGF/TikZ"; + stripPrefix = 0; + sha512.run = "cfd37929060d7213d2294708a38a0ba9df8847b0539ae105ec99b4171083877714dbb19ba2ad5d89bd3ad474573f51e263f42b8bf9866cf010e30bf481f75861"; + sha512.doc = "6356829dfaa331e2e0af9edd044168e07bb8608c28ff386001cd06288da0a1517f7b1dc4bea31e1b06d0715620a4bac80a138bc1228a3ab15f88fa706a9c4b18"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.12c"; +}; +tkzexample = { + revision = 63908; + shortdesc = "Package for the documentation of all tkz-* packages"; + stripPrefix = 0; + sha512.run = "d312aa7220166853d5960301b1aac7917969d6cc3859bff6766d366836255cf46fa24f66ad3401243a0cd63b719428b848969bf66d51e5946f56e672eb10b353"; + sha512.doc = "30ad76a0efecf48067e2027eb713dc9af4ff1b0ac50e6c8dc2213a848a41e83d6f53aaf70f5db8654ac4d60b196dfa2ed465cc434010f5ad457bed8cad15f319"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.45c"; +}; +tlc-article = { + revision = 51431; + shortdesc = "A LaTeX document class for formal documents"; + stripPrefix = 0; + sha512.run = "80b2c0d5418e8061d07d502399895a8334003bf5ed574de8f4af0c422ff0d3a660a511b5064b48e65064a91ea0cd057c134f9651e001eb7d5fa9d981366374db"; + sha512.doc = "96535abc8bf54c62e22d4e47178c1cbbb1ca96bfca16df4cab37b182d50e872c57a2e6ebe65727121fd2682776905c962551639d9435e86ab3fbb5d3e05fb72f"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.0.17"; +}; +tlc2 = { + revision = 26096; + shortdesc = "Examples from \"The LaTeX Companion\", second edition"; + stripPrefix = 0; + sha512.run = "3ac7d28285b15d7e97839619a449c870b3f96e1c557470ba4bf680016c9834af9f09715e09525b00aa2b951bbe20e5d3b1d0a5e5f957de99c13fdb39f4267e3d"; + sha512.doc = "79eead14f268eab643f676c36b20ba89828928fb3b418956277304ac6cf7145d53b4f97c30605690cddce8660361614b58ac65e8454b7740dde17ff82a053818"; + license = [ "lppl13c" ]; +}; +tlc3-examples = { + revision = 65496; + shortdesc = "All examples from \"The LaTeX Companion\", third edition"; + stripPrefix = 0; + sha512.run = "2bdb38f294d1737c73068fa9d768d9a8f96ae858d400f1f8b651c4c51427bdb0e4d623fb8b9b0c0ab2adfe8d55fe472ffa4a27e7064b51528f3eb03ace111a06"; + sha512.doc = "b5bbeccc60b9754e888a0ce457cb88f5c86a6b20c3cdc7850d28c85c409057391355551a97e49bc964521c3b4b498927b499e21bfdcaf15b8b8266c7316ebd11"; + license = [ "lppl13c" ]; +}; +tlcockpit = { + revision = 54857; + shortdesc = "A GUI frontend to TeX Live Manager (tlmgr)"; + sha512.run = "50817d4c68d4e302cf0f4075ff9321bde2fd26336923efd2fb39bf097090b617a2a67ce75d1a14d562939514acb17b2a356bc388f72049dbe52a868ff3d63ffd"; + sha512.doc = "d40cec8456db0d9fdd55b76c84b40565a8b16d7639084eaa5dbc61c3bd2ebd73fdde6f40b11007835be242a9103cdc5ecbbecb6082ad650663968db18cc1b04d"; + hasManpages = true; + sha512.source = "01a9038bab5226f57922215e6dac5acf69ba2bae866f72df1d2d4a3a6252fef78e18d1e7b2a8baf327bd4b89262abe6750b0dd1166f47868e797e50b205322a2"; + hasRunfiles = true; + scriptExts = [ + "jar" + ]; + license = [ "gpl3Plus" ]; + version = "1.2"; +}; +tlcockpit.binfiles = [ + "tlcockpit" +]; +tlmgr-intro-zh-cn = { + revision = 59100; + shortdesc = "A short tutorial on using tlmgr in Chinese"; + stripPrefix = 0; + sha512.run = "a89c2f99ad63c8352462ef7139b36e8563e1db815dcb06bd2e0f8b96554c380b574f7d856aa6bffb3c972bd68e9505d7864d87cfb7bcfef1bdebacd10f14a96a"; + sha512.doc = "2b5a7672c600eb2f4cbfb2810090e4383a7032d851f35a74e36c75914d9813566603019f232715e2e39ab6d2f8a60273c01e5cbdcb345892b0bf8c99995e3d4d"; + license = [ "gpl3Plus" ]; +}; +tlmgrbasics = { + revision = 68999; + shortdesc = "A simplified documentation for tlmgr"; + stripPrefix = 0; + sha512.run = "53f7cc8c2a39ea21a8c5eeb57ae7f99759b364ff7f1b41e2f4599d464ce17920746b8a8e182a044faf0621fa3dc842e14cbe93652d351d9fe8e1fde8a7682daa"; + sha512.doc = "ee69a90ccf9b83396b0d9fdd5f030e673d00b2c372334378ad450089b40b93de8b596ed5bc8a459253689316a7219080b88248c1f65a475980ec270a6c84c8ea"; + license = [ "gpl2Plus" ]; +}; +tlshell = { + revision = 66771; + shortdesc = "GUI frontend (tcl/tk-based) for tlmgr"; + sha512.run = "b514f1c41c464300eeff261dc46004963e9ae6133dee084c39d8d7354510f37c3ebd8481daa377e057b48cf805ca87e7f247abe103c3a6404294b4b308361b69"; + sha512.doc = "a4e686c57454adbbead87afc078720e294bd865dc5f77905e0f8e183efe83fcd2f0057336aac17ba6bc91eccf785bf1b3b47959359fc3ea49069bceae3d21d6f"; + hasRunfiles = true; + hasTlpkg = true; + scriptExts = [ + "tcl" + ]; +}; +tlshell.binfiles = [ + "tlshell" +]; +to-be-determined = { + revision = 64882; + shortdesc = "Highlight text passages that need further work"; + stripPrefix = 0; + deps = [ + "soul" + "xcolor" + ]; + sha512.run = "a7c6b60844601f81bb659f57e212cfdc9e7cf72f24bfc662aed9dd26ebb9385187ebf44d82b59b637544b920c05dd5e3a698b69a0ef7ace4b57cd7531d240e3f"; + sha512.doc = "0df7f6b340c28d2ef9db73af4bbad364bbb238a42f37effbde69af30774de627d29b2f03e098482e6fe66d09bec49d7d4a4566ebb3125eb2f3423c1d5fdba066"; + sha512.source = "38d70708e3be579d46e086c2e1b227ac081da1d721fff64b51543269b9df11b7ebe67a8e95999bb3ca1b691b91a4c3e1a8d79bce2f367e6965e34a5577377608"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.3.0"; +}; +tocbibind = { + revision = 20085; + shortdesc = "Add bibliography/index/contents to Table of Contents"; + stripPrefix = 0; + sha512.run = "f373d6c98730e60d06790d1a219df26e60bbddd2aaffc3aefc5877ae6b2c10c1a08e21dfef82cc591e1c6f7c014e0843ae30be948b7eb55321dc94cfb7b16aa9"; + sha512.doc = "1521eaf8a15038a2a0b6136e444ac38d6033071b305f6de6db6a5f8ae34625a5b8bf654d7a97b5ebdfcf4efeae58c41a7c9c17005552314928e315295766c441"; + sha512.source = "fa8375bce4af25fec4743d0c0002f90dbad7240f7959ad843365b72502c8c2d2cc9047b21e01d68a6fc525fca132b3a4842481f808999cac40221af32ea7e487"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5k"; +}; +tocdata = { + revision = 69512; + shortdesc = "Adds names to chapters, sections, figures in the TOC and LOF"; + stripPrefix = 0; + sha512.run = "b1d8fc5f578eb9507e1271fb19d2e024b272b0c23fff4ca11177c46fc2ec69777adca4329960787bd52c8d9862010547ca8b4378ad0b8986c503576be2930cab"; + sha512.doc = "6fe648771c02287ccacf991b7b0e106e9e3917e882993c6203314f97cb20d8e0ce873246abf7fe11d107a22cef0fdc02a7bc89278a6d0a14d48cc6838f17158a"; + sha512.source = "c29fc710ccf0952570aa682af419d1fb2432a4825b9fc8fed5368f8004ff5355250df6deaa28d7168258914711f31b3f379fe7c9383255957092676bd36bad72"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.07"; +}; +tocloft = { + revision = 53364; + shortdesc = "Control table of contents, figures, etc"; + stripPrefix = 0; + sha512.run = "249b50b4dde3c9b14cfd3a7b00c441007643ad6638996b83a0274bf4126ca8a26f6cfff816c5efc9b6516953cfc29c18905138fe137877ae920e82376afeeab7"; + sha512.doc = "edd477e3c4b2a9f815c3e57a6b785c2237bc34435dd561d28b3e38bd8da5cc5d4d4de79a10dfbb55e920d69dab90d0a40efd3bcc44cad1c736a723b89f147af9"; + sha512.source = "a870218b7470962996f5bbab8c15f880d6aa863b8102dfccc67bbe3cdc3895785cc44624bd460d37a96da74d1ef28340535576aa481129e9ccda2e5ee1ee6256"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3j"; +}; +tocvsec2 = { + revision = 33146; + shortdesc = "Section numbering and table of contents control"; + stripPrefix = 0; + sha512.run = "685ff581b0cba155a763ba951b4f5b1e12a44741dc5245967cc2d2effad12127828e4d2f3adabb9fe3d126ffa1f76d43dc196b89faa39745ce85a7f96fb44017"; + sha512.doc = "9247adf45a6a8f18e03d7b93ea8de8decdd9f1ba15eed7ee28c356679a6f62bd8607b9c519448bae2234cec15b76a5155ad7efe99ceb9382022988a29c2ee85c"; + sha512.source = "c6af924f3d8e52028c7bfe7e27bab1420dec1fe6f3e948b09a131c65a37ec8e9baa594d725a4eca7b3dd10ed19ceb5f54f1ccae49706e9816c7e4e1d9f1212c0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +todo = { + revision = 17746; + shortdesc = "Make a to-do list for a document"; + stripPrefix = 0; + sha512.run = "e3cd06aa47c36344602a0dccfb48e43c0639cadcb91aa9e787d552c6d3ecca95da3b0f3af8d0f479caad41f657bbcc30016dfd3f80f42285fe8ab02e0a904601"; + sha512.doc = "c747b4cdcbe8533338a9120b06120b0daa68940ace4cf44d87882d5b5a5a42e2c062c667d2e3fbf8979e1385cd55dfd8747f4fcb044a4112f4b2a79588d0463e"; + sha512.source = "7f70973e13cba6c532d45af7f5c21264adfb75542a7a68e9bf23508955a553efee723edfe098c4a87015c463c99d4063a9bce6888e7bc9018999ab4721a524ce"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "2.142"; +}; +todonotes = { + revision = 69319; + shortdesc = "Marking things to do in a LaTeX document"; + stripPrefix = 0; + deps = [ + "pgf" + "tools" + "xcolor" + "xkeyval" + ]; + sha512.run = "6dbe5b58d44d900b7beceaf265fc0ab227e3f4a56a1f8c1ff4f186df0657a3fe0f674bd60411516e54d90627ec41ffa38d4bcda7f5dcc69632892ac2f0caf96b"; + sha512.doc = "e5a8937624df00f9aa487d43a449c7ff6181219c4dca0ee559b0a10c6fcdf83eec55f9afec7d43721bde0f60c0e8e3eeba55d85627be3af5d20fb9ea45592c30"; + sha512.source = "2ed0f6f85b777e49fb17df84ec97a7b4bb01000de19a578d28f5bdea038a13f360598f3e53b66d20a1584d483297e55df9b1be91ed016cadcc1e8eb9c00179ec"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.7"; +}; +tokcycle = { + revision = 60320; + shortdesc = "Build tools to process tokens from an input stream"; + stripPrefix = 0; + sha512.run = "fa7beb7d6dd1ee5a6caaa968d425143f946426e98a164d1f1b44288105a6c8f57d94931782616c3926493f0af9709c5836bece10aa7ed6c2f1623f8301ff9bae"; + sha512.doc = "dcae2b95cad3150dc8879061d8c546074116af04a970a7c2ad9a91292597f3c859927ebf56ffd58aecb995a9968fc8221b6250efddbdce80edce96fc9c906b48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.42"; +}; +tokenizer = { + revision = 15878; + shortdesc = "A tokenizer"; + stripPrefix = 0; + sha512.run = "5174ea1b9c6c02fb8245db5315ccc7b65239d1343f719ee23428bd530dfd70edf26822bde25d672603d268a63360ba31b4a9fdcddf426b82eef440cd7f449d8e"; + sha512.doc = "4e978a368cd7e97a1300addb739b457cbf4810ecb2d4e1161d931373d858573d8fe1688629cd7d23a44a4d5403e5d8d9dc92869be9809bddc9110c55879c940e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +tonevalue = { + revision = 60058; + shortdesc = "Tool for linguists and phoneticians to visualize tone value patterns"; + stripPrefix = 0; + sha512.run = "052216e492b58a5e8ad4cb3f346815924291f3d24c995d42f22f189e6601a7b4236d434684d5777ea10d50a3d77f033b02ab76ad1550c0ba1ec275a6d22bf4e4"; + sha512.doc = "b9bafeaf2a089f3537767a51923ecb6d7008009f4fe2fa74cff71f7d7358ab52afe4f39951efc04d29e2bca5cfab4ae70cf35a9f1e895377be4cef2ef0c523d0"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "1.0"; +}; +toolbox = { + revision = 32260; + shortdesc = "Tool macros"; + stripPrefix = 0; + sha512.run = "af5320de678474075998f9497be0b766e826b0105b344939a66c5c1377e7c345623e2de18b73cb43f93c8edc241fca7a99fff1ca4b6bd3dfba52bf2ff476f18f"; + sha512.doc = "ee800bb98c9577b12bf20a0b19ce27d9c6900f66e0920c922626599986b887e34513cca8474456aab7ae59aa5d5fae3c7c323ca4cc21372979ab3d545921ed34"; + sha512.source = "201c3153ceb48cc4f7a3b24babd95e78939f03a7d2f3992a73113d904c90e5c957135a0efab98cb2ed01f742c39cf84c4a12efb8bf9f9bb9a082d56f62c98255"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.1"; +}; +tools = { + revision = 68941; + shortdesc = "The LaTeX standard tools bundle"; + stripPrefix = 0; + sha512.run = "6da3f34edda1c3839737f6ce0db95a899af8c47fe9901a502dbc6a6c95ae9fbe317c7365d6cebe3a20bdce8af0e37b803480f8489de57ccc6daac8a758a5c9d9"; + sha512.doc = "614a64b6d5f25c4fd691d629f70f1fc0f614aa4ac1a1a5a6e06f6ab0edcc0a8e8cd14c2cce498aa75ef3320e493c7ef69cd6ac858505519e10b8414b9cbb13ca"; + sha512.source = "2bd6ea620d71ae1e5fab48f5b361560e290a2633668b03a36259228b0cf8f9eb5acecee705c66052dab306288c1defd46a366548f7aa66cf04e802bc40122caf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2023-11-01c"; +}; +topfloat = { + revision = 19084; + shortdesc = "Move floats to the top of the page"; + stripPrefix = 0; + sha512.run = "a4e4031292203a04a1df1dc5e6bd4f6b89c8806599d995707fa0dfc238bcb3dd1ecf185665db33a406302567607da5640f385f12cffb46f482993850b78155a0"; + sha512.doc = "6c37c3b9ad32a121eb03f23049e11fe52b7cf6d49353e94a18eb39aaed3c049bee86ef6c6984440c9700546f20023f7a71975591c1f3750d31e176e8ba4f4c47"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +topiclongtable = { + revision = 54758; + shortdesc = "Extend longtable with cells that merge hierarchically"; + stripPrefix = 0; + sha512.run = "3bd1bc743191a644cf9dbdd36890929003adfd8bc68372ff74882b3b37f2cbdfcd007222fbaadf4d73b5b1f919e1491edf8c25e9c69993be367d3816d06a6b12"; + sha512.doc = "c837a90b1c13f194d4bd41d1ef91e994c4027443169588622bab2613b57cc86c6a29b81178f257c2a6b36ea65c89e1b66791ed137c2b5c144deea8c7cb987a17"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3.2"; +}; +topletter = { + revision = 48182; + shortdesc = "Letter class for the Politecnico di Torino"; + stripPrefix = 0; + sha512.run = "1c583621d738ff203ef755c4ab6d4ad520fe25204c882b3b5b1dc719590cc4ae117502008f0b2ef67486f33127e6eab92a2177aed42a8e011c9309632ce1fda1"; + sha512.doc = "2fcaee9c15adec307e5cbbc4e71dadd2bfe2158f51d5bb842ea6faf1e10487f5881d171e29a48ac7c6c6ce52bae7bffee91772dd046311959167b11ddac8328c"; + sha512.source = "b22e020b8fc477da1316c9f36818d9508f45bd3259e03e2cb096aef984cf655b1171069135001301f9be631c7bfb99e63ed7dc95af968be0700c8027b6484f45"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "0.3.0"; +}; +toptesi = { + revision = 56276; + shortdesc = "Bundle for typesetting multilanguage theses"; + stripPrefix = 0; + sha512.run = "be7a920e195b9ffd3fcfc0bbe1647d1b47fb98743ec69ea9b23783f052d9c10c26acdea42d4d2c7501bd57d3853f53642a5328a1c6954294a2cd38d8aeeaaac2"; + sha512.doc = "7dd70306861e8528cd4c645893a3cb81c20a6f82db2237e595573226c77f8df71ecfa57909b9675e19e441301fecf38f1b1c4bb7b4ed2705a4e132d4bf19b436"; + sha512.source = "f127b3ece0428207e503bf2f9258da2c4128b524069c45c4d7b188ac06ef52527d04020a8f002c72a878a9cf5caa358323e5db9e0b65c46d6fafadc657ec014f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.4.06"; +}; +totalcount = { + revision = 67201; + shortdesc = "Commands for typesetting total values of counters"; + stripPrefix = 0; + sha512.run = "71523dddd67c44f4ef53c14833d4ea3f70603cc76f0495e5533e68eec99b1006796796b39deb40f6b36dd9ed03102ad859a7032bc6dd65137fd19c23c4027a07"; + sha512.doc = "2fb61446efe5fb3ca8c80099d19ecb7a281ea2ebfa756778e4bba8060e9331fd1b712b7b77c66ddbd3a5b60451d6007130803b6138f1eba466a5f210c1d3322d"; + sha512.source = "be9fc65fdcc7999279b5e4c5b495fd7fbab4606fe9f6dc96a5683ef0af41ac8f4fd8c3f5d2470224304a1bc974a6a9b40a7c017049507a7b6ad8db15d2dd2724"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +totcount = { + revision = 21178; + shortdesc = "Find the last value of a counter"; + stripPrefix = 0; + sha512.run = "03ece717c7db3820cf41192e3bad2711e159fcb8a5a5a185e1c55335364917a515d9dd691cf1890421a8c62c9e55bdc49cb13718f7d98d9df34a2470cfff0daf"; + sha512.doc = "46ef8cd2317108d0896b32ba9104c69fb34a6d13d1e123d6b8f1648bfdfffa6bb21f17207433dd763451b1f6c104ae3532e7aac43ef2ba73281842f0a3bcd05e"; + sha512.source = "1820b0b44434650c072a67a4c6144beb7a34129415a4ae298b9c97efd7e81d3396ddb6e4a03081a19962001c8c01a4cdda563c20ba19bda1411e4832d5e7fd14"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +totpages = { + revision = 15878; + shortdesc = "Count pages in a document, and report last page number"; + stripPrefix = 0; + sha512.run = "8dbfcf7728690d6c2a20f661daf62e80c00d3f08fd00aee7a07cbddd31f6adf8f38e32623b2963748367ea08dd3c95919ab576b22d70214a2f5f4f07c40374f1"; + sha512.doc = "58cb9d30644402a68462e0b00b6175ec4a002135eae0bb16ad2cb5b919d1dd6b93583074a0723e1c55946e7d94dab506b8527a67d7d7b39be20608207bae5626"; + sha512.source = "2ac7e8e8f7b79721fdbc6cfcf9d5d81d80b64f60a535435ec13335e1b6059c01001003ab87d9ab8fff4323575a0fbaf6e8a3569670eeb5411be495d9fd712a1a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.00"; +}; +tpic2pdftex = { + revision = 52851; + shortdesc = "Use tpic commands in pdfTeX"; + sha512.run = "fa8689bd257b6336badb8e5a742d5c5f12d9088b33b43bdc41474feda62358c754db05735fa471baa307907bcd61f68e8d061e66c400198d6a1dc165f39d2226"; + sha512.doc = "f24f8508279ded0689bb9dda8c653cfbd903c46782744fcb8d004f50a771ca74b86549c86abc765a408f2be67334048390e407be9446faa476a02ce9c27d5547"; + hasManpages = true; + license = [ "gpl1Only" ]; +}; +tpic2pdftex.binfiles = [ + "tpic2pdftex" +]; +tpslifonts = { + revision = 42428; + shortdesc = "A LaTeX package for configuring presentation fonts"; + stripPrefix = 0; + sha512.run = "0394101636f394f04c38b6677f921136f74e3c8abccff199d4c972ede085c3915e2fe9bbc5b239044dd8f24b405cfc34b5c736a7cd03b749b6aeaf7feb15f5e4"; + sha512.doc = "e5be9024a02669212044844ad0e99b72faae15c62fb0c9065c8a5e3beb852968cf4cd4744d01890534df5a540bd1066749d999e919afd7d791b4e9ca7dd3c26c"; + sha512.source = "d55ebdf58c24f9d68f7a69fab79b8486c46d4d23714d9e1d2365320457ca60275449492482d5d28c4c8a2c884074bbe74874f509c60d66f49b6deb2a06925c9d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.6"; +}; +tqft = { + revision = 44455; + shortdesc = "Drawing TQFT diagrams with TikZ/PGF"; + stripPrefix = 0; + sha512.run = "0bd44773d17cdaac4e3490dbca1fe038bb18e50d057d6adee53b32d6127ec844e3ae9b8f0f671969c8a00e0df01eca9fd93f27e85fc1ebcf03966e6c82b53f8f"; + sha512.doc = "0b6c66aefec59955214299a99eaf4949900fb294e7f1eb904efdfc0de3aa85c5fa38961073ba3f7a3c60f26688c28e6f1bb5ea2c32751062fb3231edc4607f0f"; + sha512.source = "afea6aaf0250f9c9307479d587e844b3f391e387a4d2b6bf83b1eb2e63459d132cf0da38160bbcbeba0eaf1fc8401c9c21dec9dbc8a5e54aebeb1bd25a357445"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +tracklang = { + revision = 65263; + shortdesc = "Language and dialect tracker"; + stripPrefix = 0; + sha512.run = "a8cb03ea2fd0063ad3e0784c1fb6085e623f08d2a8a8e1e5907a13b0d08c2a99c7e1f6d0e357dabdd4e655122b572dca2eee5855bb5fe9ca500715a4b8b4790f"; + sha512.doc = "42dd6cef4ebe9212277ed9cebdcf9875a73981ff88ebd19a5bb43296605087cceeb4095f5de1eef53b70f8edeea5268ce327d16545c55411c20880673f7fd651"; + sha512.source = "1ef4767d6a2a6f221d64544dfe3bc7c6db411b1b525dd887279d8454e7425122d1b0b7ee7b7ee65f2d006a12b76eb1b9f5fb23263da16937894209cb864ecb3e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6.1"; +}; +trajan = { + revision = 15878; + shortdesc = "Fonts from the Trajan column in Rome"; + stripPrefix = 0; + fontMaps = [ + "MixedMap trajan.map" + ]; + sha512.run = "66fe869b94f489a3240078fa28da32fab71767d93befefca62fda3a39ae53ab975b13b7ddf84e490658e915c100f16225ea0ed8e7787b099bf4cb067a9fd4e09"; + sha512.doc = "c6b6137d1952660b99bf077eae0ddc0f40b4ea9ff6308e4f461fd0e34c7b4b35b4ad79f3e42e4d0077c9d2947db642d0add032f2413d580748ba786a8abbf029"; + sha512.source = "36b85f870cd9b006f89df594193877a2188635be840636ae9300f511e5ab2a1ea60eac7f927ccb3e9832ab01972bf585460b47cf7ef30f36a6049ab0ce0fd95b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +tram = { + revision = 29803; + shortdesc = "Typeset tram boxes in LaTeX"; + stripPrefix = 0; + sha512.run = "4592a288c08f5bf6b41fdffee8129e08fec7397edb2b351617fe79571d2905be61cb776f87a5b152c4b62acefdf21ee2f0b293f210ce52f449d3b9e41833b2d5"; + sha512.doc = "bfc46f516c2f81530ed7e648ef6774443502b580cf580b5fd5ea9f7be0311b33fb14156aca3f36bb4d74cc165dd33d0b8ef3ebbab5624f38239c281c7d7bda09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +tramlines = { + revision = 65692; + shortdesc = "A package for creating tramlines (lines above and below a title used by lawyers in the UK)"; + stripPrefix = 0; + sha512.run = "d30a7a7ee30f933163f5462ce00b63e82bbe65b2d08b2b530004c22f7fdd884c99d44423aa98ee4176f0d7cab159799984a399ce26315d0af6522babf7b3f646"; + sha512.doc = "209f4af2dbc0993c3f3b454c2d030c2f69e43403d50721a2c1e7159c1ed1cd95a01c76bd1821d1f281c4b1fd516b3084799d5877acb500453008c3e7e1b15b5b"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-30" ]; + version = "1.1.0"; +}; +translation-array-fr = { + revision = 24344; + shortdesc = "French translation of the documentation of array"; + stripPrefix = 0; + sha512.run = "d32d6b397916bf631d65171f4f7de4bdb6049eec5414d1a9adbbe88d147ce2e4930a4f17b70c5c12b7ef9c3300d9eb099d63fb14ccd5478c6bfcd0557074b343"; + sha512.doc = "7d9b2e43f4fde3e6a3b7436a55b2095fbc4ffa31223019c1cbfdf3d623c48be406858cdb96c8693e10fd0023050ddfbb09b463a9a3804879945ac0d6aa616be4"; + license = [ "lppl13c" ]; +}; +translation-arsclassica-de = { + revision = 23803; + shortdesc = "German version of arsclassica"; + stripPrefix = 0; + sha512.run = "76ced8c2c93e35d6bee10f34a7de5709b8027f9d498f8fcd21ba776850c65e1e20eaf20528414b7d9da1891a2db7132b6e3b703c4f8d91f4ff0c69eb9159c996"; + sha512.doc = "58773adb7493e6ef31d8fd3854a51cd37921dd331f56f1d9eab5283c121fa8c3316ffc41242356a87af04bb6da68761ea15829e5e8555d2e6cdbb68833c8d313"; + license = [ "lppl13c" ]; +}; +translation-biblatex-de = { + revision = 59382; + shortdesc = "German translation of the User Guide for BibLaTeX"; + stripPrefix = 0; + sha512.run = "6256a868d6f6ea53107245574d3d7fe3f1b646cfa67dd456f88abbab980b4f9060c752faa14f185957762b76c159aa8d52b3ab8908c53c5938e415fa8e4d5f7d"; + sha512.doc = "e7e634d9d581f781f33ebcad17f4f496738d6364725dae75d7dae6d357bb7deb08a5e01de0e1ac6aa32cdc09ebefbf0190d9f6f11b286a20ce0fce23c0516fef"; + license = [ "lppl13c" ]; + version = "3.15b"; +}; +translation-chemsym-de = { + revision = 23804; + shortdesc = "German version of chemsym"; + stripPrefix = 0; + sha512.run = "e23821fc1bbdee758e534bb52c4e0f348d6be3396ca2d8e3c11c9425132fc9c28f2bf6c98cb1beee9b23716cc1a75704561d9d8f16d2f4e94851fc2f88e0895a"; + sha512.doc = "efe9f711c42925fd035339c25284e09ca7a99c246bf70ef2c15c4f1149accf5bab09e396b94d6d59d4e8c303bfdb3f40570912713dcbd33e7ae360a6b21c36de"; + license = [ "lppl13c" ]; +}; +translation-dcolumn-fr = { + revision = 24345; + shortdesc = "French translation of the documentation of dcolumn"; + stripPrefix = 0; + sha512.run = "8d2288707f13896dbb578b538b535efffc89991d56586f27a35b284b5be7c553df97a72ac163a625238e281bfe97bb79fa716855dc8e93f25f0a8af69674eb45"; + sha512.doc = "95d1633884f7237bf2a7abf8a43127ac1954fb5d0e308d676a7f4c3255d709496a382f01a8af6c28f793bcd1863e98f8ed1441e7cc288d3b8de3176631cdca1d"; + license = [ "lppl13c" ]; +}; +translation-ecv-de = { + revision = 24754; + shortdesc = "Ecv documentation, in German"; + stripPrefix = 0; + sha512.run = "33998fcadaf7b42874968348ef4e3232652ea401410eea6a8011db146a4989afb102a2bba247df53b875bc02b1ea8f21ec5c68783ae43f36a3f175e77dde6453"; + sha512.doc = "a86784aaeaa786251f35ddf273050e9c981a68d060ba1a2f186379e04f89edc696090b44b402996c4f2422d1cbfd7fd68136c29fc7c74a2fd32d6d230eb2e489"; + license = [ "lppl13c" ]; +}; +translation-enumitem-de = { + revision = 24196; + shortdesc = "Enumitem documentation, in German"; + stripPrefix = 0; + sha512.run = "7018a95d7b68b6b736472d6f43d356d25d2a73df4a5dbc080485f3b4e747d122889788b3d1a75ec4c479a84a4453128104f01b2e1788e9dc50d09bda0eb53cfe"; + sha512.doc = "bee33ecf7a3045c382242f4b6ec9599f32fb254053a6417ceb514f3aad64b2bf51c50f660b562a2a3f0207f7bdc4676527627f432b1556362e3a9f5e9eda8694"; + license = [ "lppl13c" ]; +}; +translation-europecv-de = { + revision = 23840; + shortdesc = "German version of europecv"; + stripPrefix = 0; + sha512.run = "6102a92b45fb7c19d2190bf4289e8b6b24ded67d0255ce2f483627bbdbee00c42c044be03bc10c9d0e23c2b911e781d21a7e6562e80988620a6da60562d98bf4"; + sha512.doc = "f50e761fc7925f0cf404788ad2ad70586536e1676bc7a026be5a81136a1323f011a281160a344c455346553e90cb632133668c2483200a05ecf961e46e50bfb3"; + license = [ "lppl13c" ]; +}; +translation-filecontents-de = { + revision = 24010; + shortdesc = "German version of filecontents"; + stripPrefix = 0; + sha512.run = "78dd9ee41d9b06438e01ec12f716929c4cf0fbf6ff209f45fadce9fad4bac0d1b31732b3f66896bf7526dac7532504e0913dbb69c3c7e13830e81297b2761935"; + sha512.doc = "17ed1c39c549b43c31c13dfd6ffbd968ecbdd3e64b00cbc66b0a8914726f4baa7faf98edf30c23ed81850cee98a732bbdd70ef667973163ccee0b35c160fdc64"; + license = [ "lppl13c" ]; +}; +translation-moreverb-de = { + revision = 23957; + shortdesc = "German version of moreverb"; + stripPrefix = 0; + sha512.run = "6b11a1b522c728722d4d5d5b38dd453ec017dc053d360180b943778923ca9a23b3ebb92516c1a6880e507f5e8b6d8d87878c92762637acc5ac93f42ad790446e"; + sha512.doc = "955070d4e92e38712a5df837fd0df716d1a597780a4b06046d5aac5164efc0fec1121c51ea09c3ef1a090d51732f57308f4db386440118548e2167f3cafe16ce"; + license = [ "lppl13c" ]; +}; +translation-natbib-fr = { + revision = 25105; + shortdesc = "French translation of the documentation of natbib"; + stripPrefix = 0; + sha512.run = "ff34cb7cece157b933117ba0e9aadb0e9caa759a406fabf7b0ebb89e5b03ee6db7aa493551816e9061ff91a460e46a58f1402b086d37c48863b4e093d19326a8"; + sha512.doc = "971570414f9705cc4026a21a557b2f1dfe8fc010feca4f1ada946d11aa30169746c2017fb3882e65e68520539974eaf2361ebab7bcd292eed177fa7f6eb7337c"; + license = [ "lppl13c" ]; +}; +translation-tabbing-fr = { + revision = 24228; + shortdesc = "French translation of the documentation of Tabbing"; + stripPrefix = 0; + sha512.run = "76f1c6318cd964b94d5a1d836b1a40fc58de49566cdc30b1ea60fc29fbcc8c6b01a477f4739a5fd9bb24998325dbf42817ad016fff27207e710bfc4b51b29985"; + sha512.doc = "ae2f1aa60162512287f15c770a465c2e39abe1fa5d1223d96c524dc81bf065d62f307893d22dfc06fc50da8d63d817ed60c8f07fd4fede984b6febe9c8b7b710"; + license = [ "lppl1" ]; +}; +translations = { + revision = 61896; + shortdesc = "Internationalisation of LaTeX2e packages"; + stripPrefix = 0; + sha512.run = "82d2a821c42bda66658f8557d85f2c52bee6324c88cf44e5440cac4de5bf7e938a3e37f7fe2371069a923c1f3fb794f8860274765054f902eaba560ea195297f"; + sha512.doc = "ab72edcca1d3407eaef679acd3f3d2a49f559e5ca6d9d1ad7221dd76152560be307722155cd4da54215e3b7f561f39e08ae737c70ff2e7fea1ddce2561b506fb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.12"; +}; +translator = { + revision = 59412; + shortdesc = "Easy translation of strings in LaTeX"; + stripPrefix = 0; + sha512.run = "5700b0b8a95b244c93f17c5e1bfc74d4defec842892eec358b308dc55f45ffd5bef050a1ed938c9100cad771ce5ccd53bfcc917083a9ba23a60a3b339d241f2f"; + sha512.doc = "abbe08cb16a39395b53d01f85172a11e339cd18f2c7f9dde8ab1d0cf353649c181f442fcb94c9add913b2b807ae9f6ba1ac54e9a6fed147cba1af335b6b73d8d"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "1.12d"; +}; +transparent = { + revision = 64852; + shortdesc = "Using a color stack for transparency with pdfTeX"; + stripPrefix = 0; + sha512.run = "58ffa6219576a994955be228a412835c8da328c351ca0cc5dfa9d3a9fdfe8b38324890ecde9ec8ed9ccc49231169786d704ef65cdd3dfd860f5aa761a18c57d9"; + sha512.doc = "73942fa07c9bcc6e8f08b91837f96a3c781f2f60443078b67232092b98e0bfaab07e57bd43e54345df7fbb9ea20bba8bbbc10c9dc58d5cf2d0b6f6bed469d894"; + sha512.source = "b37938a27dce42366234f7ec2ad1287e4864f53426584ae72dfd801055a06dfd15cd7abffcc0908e22971b01eafe11521c01eaa36a9d0f15fa8b1e61d3d250f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +transparent-io = { + revision = 64113; + shortdesc = "Show for approval the filenames used in \input, \openin, or \openout"; + stripPrefix = 0; + sha512.run = "69d27356f57d5b610fc9e6e839f6df111f6b98b8bf446327ecfba473dea6bc997cb6802ca382b3438d44de85fd5f50f82bd4e5508bfa43d08223463b5436950c"; + sha512.doc = "2e54e51744c482f98c1b35588cc934ba18e3358fc2be043459d7e16f8c85ee6aae7acf4b6c3b329cdfddcf1b3126000c6559d41d5b2c4e88d5018844717cb8eb"; + license = [ "gpl3Only" ]; +}; +tree-dvips = { + revision = 21751; + shortdesc = "Trees and other linguists' macros"; + stripPrefix = 0; + sha512.run = "6153417c5d2677a56adf031c5f2f27e4c2bf204c0acef1cc5cd49355370aa336814bad7d2be00e95d22bcf73b9b69105a255d15f29ed650511c0eccc3c9bda07"; + sha512.doc = "8c507ec7719b92f2cf82527c7799b073ff2679cf820528b489eb7d8c83d28d098033760cf092bceb9ee7e28fec15eb580122c080b982dbb12e0e65176121e84c"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = ".91"; +}; +treetex = { + revision = 28176; + shortdesc = "Draw trees"; + stripPrefix = 0; + sha512.run = "49202a38697bd9bd3bc6fcbf30d28047b8ddc4d737bfa68cfdb83197b484352997a33f55e195211eff1d548f95e2072f07ed18f1d7c6772a03c66a13051d1709"; + sha512.doc = "fb9e09bc2f6e45b854824c9c757733c2c17b4d48edc955ea48bea3ab3fb5dd914eb6427c8ae4f74ebc62b4715bada84c8f3fca0ee7d01f8d3c2526339a844681"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +trfsigns = { + revision = 15878; + shortdesc = "Typeset transform signs"; + stripPrefix = 0; + sha512.run = "3607b6371c2dbbd93524f0811dbf14cd93cb2556fc217899ef3a273c27158771f743bafff0fc90a582d65da431efd7ccc1f07bf92a6600a7bc301b5b6a308325"; + sha512.doc = "9bac4f4deafd62a8b113107ce47bb5ea3afe05078a3c5083b1ed790ed690bc3d73066e0abadc5cb1a3d45246f759941d6e2389105632bb6592c32a08e7b7671b"; + sha512.source = "71aaa336a9f66af6f682cadc72b2ae100c606be7d95d76c2631dbb03ff617718c1c322288c769bb1b9b19116a29baa208fa085e2868e67ce3f7a5552d823e6e0"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.01"; +}; +trigonometry = { + revision = 43006; + shortdesc = "Demonstration code for cos and sin in TeX macros"; + stripPrefix = 0; + sha512.run = "366a5e96499bd96d2eee38b78305d9fd7368d0b70f91acecd5a5337675002808a5695a525d011a1ab7b31ff34cc14c469970a3fe55c694f003d0ba7002795297"; + sha512.doc = "a9bd77bda2cca604a69ca1b60deeb8da3128c625b87d64ccf39aaae853a645e736b5350d3d575302ec2a35e9736e4133cd4ffd223b9bff6191b6fed9549a8092"; + hasRunfiles = true; + license = [ "knuth" ]; +}; +trimspaces = { + revision = 15878; + shortdesc = "Trim spaces around an argument or within a macro"; + stripPrefix = 0; + sha512.run = "09bfe50d1b14502311aea7a20df80e70c1907b1c8443aba9453aa0a3eb76cbd34728734b81df63bd5895a4a5a55ddfe6d0feedf7d5d28d6b5922a374bc550c9e"; + sha512.doc = "8e26064de0c14d6caa1d6cf625cbd2d598102056136dfa20d0a7ffb178c26829db0206d87893937b63f83171744a29bea3567e16e2a7a0d454734a0b72837277"; + sha512.source = "a34429fb9b8514d25ac523f0e3bfdc880b84951ff228ede3016e2d29c001b7f8058755870fc3c63e6041ef4768290177dabc6d520157082fb077497017065b65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +trivfloat = { + revision = 15878; + shortdesc = "Quick float definitions in LaTeX"; + stripPrefix = 0; + sha512.run = "25e07373c53a6d4c92a5f2f19fa0d70c86202435863b8b3cd036f2d12f74a477a33cca6508794f67256a877117bea821a11b9bff235e1a894c90b71810bbcca4"; + sha512.doc = "eb9fce19c495eedd728e87bf47f5d925a685a8b9e81e8de0e6c317f74af6c82352f403486f5a904849ed418722d830ae294a89eaa57bbff59eee8a03cf9b8af8"; + sha512.source = "9537944503c1606151207e75dd7a2bad64b34f82bb23d83e0eb93292ea9ad9edd0bd72a126de588125b6b425669f657506ca602796b6e2dd2997052b70f60dc5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3b"; +}; +trivialpursuit = { + revision = 68971; + shortdesc = "Insert Trivial Pursuit boarding game"; + stripPrefix = 0; + sha512.run = "62cc07c80aab3b4c35bbc5ec96d97204241b0e83248147b2875382657ccfe035567455bf8c689798b4c0dfe6bb8688da2ef9d4a89388521817dd09454867202d"; + sha512.doc = "59474350e6626440d5a5e4f5782135182c6c5e497a3fa6436264a6774ecf498f719b7469a69539766c5e0b10a13ad659e00bc5fec854d0e961032ea7ed13af71"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +trsym = { + revision = 18732; + shortdesc = "Symbols for transformations"; + stripPrefix = 0; + sha512.run = "e571d1c0c042e2fe75b992c6e0e9e07b04f0368f1e74a51ba91c34a642be148fb817027931ec35831672970725377038b5cc80d34bdb716d936f4aa59075d83a"; + sha512.doc = "d6cd64c1c4bbc927f4154c2281ef4c13ab145b750d92561235364a35082e497afc5d8aa5806452757b499b827305a0a183723deb38272ba43bcc38eedc367731"; + sha512.source = "bd9c99b4c5ac266696ab4c3557028d1776a1852000db2e8c1b5a4c2f78e58f25df379a71794faf49e2c0d2ca14116796d8f6d617f4bcbaed7f05a75ec06fd5a5"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.0"; +}; +truncate = { + revision = 18921; + shortdesc = "Truncate text to a specified width"; + stripPrefix = 0; + sha512.run = "b676d65803577b4bce5f6240a0d05a306199f24c2b14402954f4430f07fed9a8af574c4cf9cdc233824bb1a285eee0c531aa40ae31c782a43afd678d6e44f27a"; + sha512.doc = "78e9a96fc2e635237cae9ab4d7ac30cfee8582dde13331800ac9079d1e0726c597accb598b5e679b6643d27b2a53fb367e740b76d59e9a5d27226a4c829e8518"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "3.6"; +}; +truthtable = { + revision = 68300; + shortdesc = "Automatically generate truth tables for given variables and statements"; + stripPrefix = 0; + sha512.run = "1f8ddc2aa2c8672c876794eae7266f8a4a02382ed61eb00af972a2adc732fdcba89a7a7579f07d755eb4ab742018240ea69fa214ff0393b53b9c77ba0179b0bc"; + sha512.doc = "462a23fecb4c1f4a793200aa45d42bd325fad9abf9ea6481fd2c9d3f3993de657cbb7651c7ac1f4aca6d97626c751bc6d66285b8b3e9c06bdd216fbb5dfb9033"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +tsemlines = { + revision = 23440; + shortdesc = "Support for the ancient \emline macro"; + stripPrefix = 0; + sha512.run = "d4b6a929a403ed7fea409aa618e7ca021c2c7138a6b11c980430ba18f952ffba44df951dbc7b7f3a5ffcdace3b5f3a455eedc2a50b6e0e003ae3e17e8e7f9969"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +tsvtemplate = { + revision = 65333; + shortdesc = "Apply a template to a tsv file"; + stripPrefix = 0; + sha512.run = "36910e6a376f074b70f5fd35c8f9bf0ba1ea1f377d7b850506f8ade19e8442b8d9af3216485dd2ebac29534a5d5c59b447679a5e1a1e12c59f3661774d30b244"; + sha512.doc = "48a91c16fd0f819ae201027409e3482edb070762f446d271eabc7822938789d8eaf5255605f66c99c5a0ac303d1d765831ca980a3ed318064b8553d447e1c3da"; + hasRunfiles = true; + license = [ "free" ]; + version = "2022-1.0"; +}; +ttfutils = { + revision = 66186; + shortdesc = "convert TrueType to TFM and PK fonts"; + sha512.run = "2e4eba2acd3b97297d2629ad93fdac4587afdfff30584ff77f69574efde4172ce60b904100c70d168016e8cb5c6407f4b4ef5ed7b3c83f942b7477af2f101be7"; + sha512.doc = "bac6812f37f1d53184a4944e91b06c4ecd6a03d96d78956781c4b01c38ec3b65b74032704d98a4951f8dd5ad84ff54d82891c12e7db99ac58e687e535758decc"; + hasManpages = true; + hasRunfiles = true; +}; +ttfutils.binfiles = [ + "ttf2afm" + "ttf2pk" + "ttf2tfm" + "ttfdump" +]; +tucv = { + revision = 20680; + shortdesc = "Support for typesetting a CV or resumee"; + stripPrefix = 0; + sha512.run = "957485431ecbdd31f180b36e7519c4bee8379f477b765ff5cebe57ffa3c95caa5556ed057943eb052d61e720074dc78035fe05b0023115caceb05bd2c3757183"; + sha512.doc = "750f739c7cc244ce52b4838009666c9b6196cee234e9bbf0028e3316c75a435b5038269e93f42d99116b9db3d93dc4710c03705b924d62f09a217f2acfe36303"; + sha512.source = "f754ab6d751eb5df0477802ab0a4d514aa0825e824531e76904ab474ed5423cbcaf773e37ce80e94c32236bee061f92c0782749c9196c3cc7fcb9249a57ea32a"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +tuda-ci = { + revision = 69351; + shortdesc = "LaTeX templates of Technische Universitat Darmstadt"; + stripPrefix = 0; + sha512.run = "d5a2887147c21caa4c3fa2d8f421a7e759998faa36ab2933b40f7ff43768677f982f5b730c593245c55d09dabdff7bfbc51e5765af897821c525c5510d513bba"; + sha512.doc = "c4a61e1ed259abea0d77fff546ba79eec85d0b5ec63422c8181ba5cae806b4180103361d3ed0eec3035279a13fe6e45166f6832a5de5a801e3b1564fba27be92"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.36"; +}; +tudscr = { + revision = 64085; + shortdesc = "Corporate Design of Technische Universitat Dresden"; + stripPrefix = 0; + deps = [ + "cbfonts" + "environ" + "etoolbox" + "geometry" + "graphics" + "greek-inputenc" + "iwona" + "koma-script" + "mathastext" + "mweights" + "oberdiek" + "opensans" + "trimspaces" + "xcolor" + "xpatch" + ]; + sha512.run = "4e17b12a82a18bb1f4babf123f1e84681c6f9524f2113725f14ad85042dcd5b1fb2aeaa45f709c1797512b8e0f35cd0ff743b60901e75676ec321f8bc682e793"; + sha512.doc = "3335c87afe969963718137a9f854e0a4935c34bd850471673a3914fb9666e8f3195962d3474df35b876741b37c231851d47b440d49c35e42533b3717be1f442e"; + sha512.source = "d317e3fc0624ec762293c972c9feaaf56186faf0962137f43f36b974ef223b094919cd84b9f5183e89e0ea6b922e4ae22b489bc619af466dac41c98fe0b651e5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.06o"; +}; +tufte-latex = { + revision = 37649; + shortdesc = "Document classes inspired by the work of Edward Tufte"; + stripPrefix = 0; + deps = [ + "changepage" + "ifmtarg" + "paralist" + "placeins" + "sauerj" + "xifthen" + ]; + sha512.run = "6dd01a5a6faf37439ca9aab23534f99050b84bfac16df48545417ee03e72700344c25b2de3262e8e28406da705d50296473a815fa14b701c609b3715f01405d1"; + sha512.doc = "11ac57e79a05db644235b6db851473c75d1538a1261d7022a63d9ab0cc54486cc13b7cc95c44d16912952e46bc9264c1bfb831a728b51a03495d01f1963410d3"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "3.5.2"; +}; +tugboat = { + revision = 68694; + shortdesc = "LaTeX macros for TUGboat articles"; + stripPrefix = 0; + sha512.run = "23c3ba2e45560d22a55c4eea733fbfc55466503631eb02c61527f0a73a595790ffe8c8143df2327af61ad8c23848309065fa69abcf181f584f64d03f437228de"; + sha512.doc = "d0482d7fe4ea30d21f43a9266c8ab4b85da66fbfabcf405ba8aee229c0081b623f1cb5862fd7e057d4080439275aa08212079bfed06f992553c4b0dec3a96798"; + sha512.source = "fec6b9556d9a945a3e9ccf73d0d043d099883d4c5c01c0d4a06e50b7900414c37fc62ec586e43526ee4c9e711c558b1601dc46248f2a97180bb75ebd79decbd1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.31"; +}; +tugboat-plain = { + revision = 68695; + shortdesc = "Plain TeX macros for TUGboat"; + stripPrefix = 0; + sha512.run = "e30aecd365721f9c986b70eedd022bde17ffcf348452d650144792bed0854f18547d837d0b3731cd0810d5f6f32f10778b1adf3b29eb07a8ed4d0765dd88cf61"; + sha512.doc = "c49683e2cef04b15c39dd275f950d602be8ecbc2e6fd644634a60100257f2367a623d06086558a69c469fb3597fd32e0a2ccee4ce9e90791daa8f8e67e1122f3"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.29"; +}; +tui = { + revision = 27253; + shortdesc = "Thesis style for the University of the Andes, Colombia"; + stripPrefix = 0; + sha512.run = "59e8af51c39984a42247435ad893c3b8e37eb9dc53634e0a5f30733ee0c973690b66d805079a0f5cf61762abe7fceb1f2dc91691df9be26f72a1a8edd2524ba3"; + sha512.doc = "b48d9811ac6414d96a7b5059b33c174464f262c721159552e48e6f5bcf5b969ae91bbac61aff6077304907d3d2bd8eb73774628458a7e740ea49fe433b9bbbc2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.9"; +}; +turabian = { + revision = 36298; + shortdesc = "Create Turabian-formatted material using LaTeX"; + stripPrefix = 0; + sha512.run = "fe4ec8291e8b1dfc6130bdc862384b8e7c6ea2d4db6baaf92e0b7b053ab8ed328ec452e0c1efc4da2eecc3f8b6c86e77cfd2100ea66e4f59276fb64683d55a92"; + sha512.doc = "3b4900c67c65ee1b20dedb2ffbc844ff22dc519dde0121b375dd13bcd80a0f2fdf5cef8c4e43a395ebe8fb4c82d463f18ca30ec65fe2be398c181af78ec0a0f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.0"; +}; +turabian-formatting = { + revision = 58561; + shortdesc = "Formatting based on Turabian's Manual"; + stripPrefix = 0; + sha512.run = "ebef1733d41cae66456e6a50c47ae0c66a7d7254a59e57f6af62e21cab73ae7a68092baa4706eb1f1e93ab152e0ab22550f0b4ce8cf9ac36eb3740530afe8499"; + sha512.doc = "6cac53c6fe5dd36702ec07e22a00871932dd4b2e421649d33e33f50e8b8b8cc57e42c752ff6e4e2a53610d28f42ddc68b0b6c1cddb0a7a045f3a547c04e77735"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +turkmen = { + revision = 17748; + shortdesc = "Babel support for Turkmen"; + stripPrefix = 0; + sha512.run = "437ff775642326f25f260280ca8d846e546f0f4b3c3082eb1ebaadcfc6ca5196967f82a00237367754b3ff307f983a828dba5c8117539d65634379567062a377"; + sha512.doc = "39014c9049322a1966951a242152b8774b2bc914bd620b6eba8c97e8ec457a1ed3547f2c211b3bba333cab21bac98882dbc9a1e9028443e7365780cf4d78b577"; + sha512.source = "1d69e90b8aa74db44b7b89c8a3346ffbfca2b8514205a04610b5049e50e61b19ef063d9b3e9c99bf4c141d52bb03d600ad5ce1a13494b06fb7d13d12f47b860a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +turnstile = { + revision = 64967; + shortdesc = "Typeset the (logic) turnstile notation"; + stripPrefix = 0; + sha512.run = "164b6b8f053b2daf93e8253df850c4aad793521848a93053f6b3879db5badc0b88b5f8f44487e5525c60e7ba7deadce53b2cecb00b7330b22b0815e01cb68338"; + sha512.doc = "de25995e56ac3fd556aa3c50e8b041b201e2f881d38ec2183b55c5799bc0f110e12e2daf387dc9a6d72a9a85377c6e4c1610f6b54811abe617e8698a40e659c0"; + sha512.source = "3364a27e7d174249212280536479d2ee32ee37b22f7c942858b023d9e7069c82ba80120c7d9eaafb90312dc313fb783073f08a2dd212d5ba380a386081abbc81"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +turnthepage = { + revision = 29803; + shortdesc = "Provide \"turn page\" instructions"; + stripPrefix = 0; + sha512.run = "446b0516264eac6b880048e16cf4ad7bb529718c726233fc645b8c32d625f3f6b505b72beef81994b61ddc77ec8ecfece907347be4f9e18a79fa36c2aef91b5d"; + sha512.doc = "4af8dc61e53df587f19b61f6260e7a7820a8334f2841a63f2ecc05b7197eb69596dc36163b39cdaff9258651241a334b6e3a814699065c8ce4f861fba6110f83"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3a"; +}; +tutodoc = { + revision = 69343; + shortdesc = "Typeset tutorial-like documentations"; + stripPrefix = 0; + sha512.run = "acd6fc6114ab1c25259485514b54d848b75cb5f45dc05cdb8324a91b127031c0db8c84c445b0e1b429dc1a5ca0a6a394987465363265c0f830ea60e72c6ab7de"; + sha512.doc = "8f58c8eaa4db17315d69088b9cb446b90504fe62395fcb07495742695f2c8e8215ab76596d4d98cad3c432f3e6079a2ec3088074345d0ace4d309db3163ce405"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.1.0"; +}; +twemoji-colr = { + revision = 64854; + shortdesc = "Twemoji font in COLR/CPAL layered format"; + stripPrefix = 0; + sha512.run = "abc9583bbfd3690ff52b2341e74166fb70eb0f6abbaf99b01b0f24b818abbe3cd7556ef9cdc3cf58c056a038fe6fc3bdd45199c437a7eab99b300622e8d7308a"; + sha512.doc = "90e01641e73702fe012510bf3c9cf741bbeb594d528b2eb69487bd57beeff59c27ab397902b3c42d5dd1b5745e5b69d0db80b3b2d399bb1ba67e2c85d14a88b5"; + hasRunfiles = true; + license = [ "cc-by-sa-40" "asl20" ]; + version = "0.7.0"; +}; +twemojis = { + revision = 62930; + shortdesc = "Use Twitter's open source emojis through LaTeX commands"; + stripPrefix = 0; + sha512.run = "d9204536ff2cf76cfb341bf8096ea71571663527dea945de901758032393f6e4f53c88f0d274e37da4cccf6b61149cb64f19a8712df80523c2f921354155b797"; + sha512.doc = "3f2f3b13f898545a32aeccef972ed52c448f3547a6834c8cc1a5589e2ff8479b822591d20acdc41f1cfaab1e43469d75abfd0841baed7b1a1dcd4000b87d1045"; + sha512.source = "e9c85a850603cfc49b5ab4f5c51a303dae326a3e44af547c5c9e77319422273c762facc885b76234e935c82b217e53945af524ec9e9431d834ad6645265f78bc"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-40" ]; + version = "1.3.1_twemoji_v14.0.1"; +}; +twoinone = { + revision = 17024; + shortdesc = "Print two pages on a single page"; + stripPrefix = 0; + sha512.run = "ffb9610d416a15f664bfc34772651af63f76843127290bd64462991b3b892a8bbe9b5a8251e278ce757883226bc07f89f54cf94be08d6bdbe6f68c5841e3a282"; + sha512.doc = "5b79b0b235fda5e32680884702a16fe033f3a617daa765a72233d22df5e217f6d2a617a2d067f6a230985e5144e6e6d733ef6e7060f267c6d22bf5de39361d41"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +twoup = { + revision = 15878; + shortdesc = "Print two virtual pages on each physical page"; + stripPrefix = 0; + sha512.run = "b3734b3818498a7038d544304d27376ff481b81fbd776cc44b9d246c3e69560364a784d897755cb69f9608c51135a1fdbb8ed370d624db64dd7b5f18a48bf754"; + sha512.doc = "2bd34ca3274a229949c322a543c2e1fcffac7383edab2cbb7f0c74dd43d3b9531f9ade43f6d0126f5fd43371093f92170f69fdcbc4f69ba7fdca1d1fad167c36"; + sha512.source = "d121f96d050e4dac6b2b52ff99b9b1ac5d5dc5e815c670f6458cdf8989a7be5e5a2ffcf4bb25d3f1ab6d5c02d1c67c15382ea266d0ef2e1f6e86e404fa1dff20"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +twoxtwogame = { + revision = 70426; + shortdesc = "Visualize 2x2 normal-form games"; + stripPrefix = 0; + sha512.run = "b2275f66d1e53f031b6c512754b7dd9fa2e7a078bdb08de64cfd51cb8c66919027397ecc6d740a7fad741b9468442aee0f93b7d9082ca75757d69437de05b001"; + sha512.doc = "1ea1154857058973b8ad02656caf68ffbec00ba7b3a51a985fb4367cf8622fc9a0d6848082c80cb2aa67fbae2fedb8d134ebf2361067704ece953c1b4651a17d"; + hasRunfiles = true; + license = [ "asl20" "cc-by-40" ]; + version = "0.2"; +}; +txfonts = { + revision = 15878; + shortdesc = "Times-like fonts in support of mathematics"; + stripPrefix = 0; + fontMaps = [ + "Map txfonts.map" + ]; + sha512.run = "2e6a195791067ec85f4eeaea5970467c97915dfa48f59d17b5a73c90ba221de1b41ed35502c6714335cd190af05ccaefc6cd5855c5f35f49bd8e15a2b4ca0726"; + sha512.doc = "f19a988305799931023026f714b63ee539ebaddcd39e9be1f1bf765cc4cc89428b626ff4d6bfc91ea2f324f08cf09b618b6a0f8db6b01dc9d8685618daa1e2d1"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +txfontsb = { + revision = 54512; + shortdesc = "Extensions to txfonts, using GNU Freefont"; + stripPrefix = 0; + fontMaps = [ + "Map gptimes.map" + ]; + sha512.run = "7b73b199b6d1f109b14154ff659089b2f3c36feaad10c26fdca80f5c4ab464f8a52fdd52a6191a89538661a3a9cac8fc45748cddd09b6e32e79f23db9e8586e9"; + sha512.doc = "982d29750320bc1709ff8329effb3f7bedc6ded888a537aeb7f080c6fc37414956b1b1e149225cea3f3a60982575fbc943433cd4f9cc5e5d61c596973c07b3ed"; + sha512.source = "f9e4d922abced380458f9fbb25c25a55d55e3a4b938c612bde03c0dd60d55573735816acd745c2785356e5956078615ada3c1396148f8d84a6ba9a805f4ae0fa"; + hasRunfiles = true; + license = [ "gpl1Only" "lppl1" ]; + version = "1.1.1"; +}; +txgreeks = { + revision = 21839; + shortdesc = "Shape selection for TX fonts Greek letters"; + stripPrefix = 0; + sha512.run = "05b24a0c9705589d2e04933a5e29b8a49de155ad0e9a4caa0c36785f7feafe475275b76c58aa50d9318df26342b800382d3c9e8164bd95fdf400f730191282f0"; + sha512.doc = "b671e433740ddc414e0a881d1f91a1311ab0957038ebeba23fe99d623a62e0499825548dd591d0adc67d32a5d7331cdcdc76be6ba87f77265bcf48758626919f"; + sha512.source = "09ffe315c18dfe3ce065a6a48dd17f1340c2381df2585a973b666d2a93f1560be11fec50c44e178a154bc39416437772ef1059c539e5934ca6b02866a087eecb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +txuprcal = { + revision = 43327; + shortdesc = "Upright calligraphic font based on TX calligraphic"; + stripPrefix = 0; + fontMaps = [ + "Map TXUprCal.map" + ]; + sha512.run = "f6840ff0846b52130b65c81513d4bf358dfea413ac6d7f324eab592b96d5277d7036e5d991dbfc1ecf6376fd35baaf0351818eed69a21b6ba88e25f878a41ef1"; + sha512.doc = "f5bd216c689b0368bbbfe29f7fbd57bb7c02344d8696af488fdd7f1078fc5ad9ac7ad5565f1408b7b7d19224093d1418c1e3d8920b8cb0cece770811576c894a"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "1.00"; +}; +type1cm = { + revision = 21820; + shortdesc = "Arbitrary size font selection in LaTeX"; + stripPrefix = 0; + sha512.run = "85a72c942e61dc0c0fd3fd7646d264ee692ecaf4e2badab4f68dbcc380a1c88a78d4ce066e23a08d1cfb29ed3af0115b08ea05a0e078283513eb14f9c6031863"; + sha512.doc = "6cd4061eced23057d860143dd7121b1e0ca1a17de1c2f08334c678c9623c0066ee77c1ab5036953ce390be7356d3fc0d155a5de1f0aa977e1e95296fe71d5199"; + sha512.source = "6a66a866c6edbe8c914bd3b0a7568c0e23914253fcb70fd849326e42b2c32860c97756fb94f5879dead5bc3f057cba64f639038b5a125f607c3f21abe4807bf7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +typed-checklist = { + revision = 63445; + shortdesc = "Typesetting tasks, goals, milestones, artifacts, and more in LaTeX"; + stripPrefix = 0; + sha512.run = "3b8cbfe59d50498fa196655596660c7cab045734e1c2f03843696c35b71ff5bd4af738a7e4fab2272c021558413adc3205efb0ff918ebfd6e46ad3cb6407905b"; + sha512.doc = "5fa0547034644134f207beddf56d523eaec47c1a2f9e2be5bd9d0db17b07874aa08b86a6c059d71ef6e7918dd326171955d9dfd921b28350860710b2935ed494"; + sha512.source = "8b5de72d3200e2c75ecf442b3cacebf6de88e4dd6473b97d4bbfa3ccc3e26a0506424854485d6f81c4c779834ed439017395a72dc7af22e2fe5d72e0e0bb5282"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "2.1"; +}; +typeface = { + revision = 27046; + shortdesc = "Select a balanced set of fonts"; + stripPrefix = 0; + sha512.run = "68a71a590aaf3c6defc28a52b47f38bd1d24ec034df904d7baf4e22f1d390ebbabe744855bda70e72986450b402f03295f772a9576a2bffcab5638f3f77718db"; + sha512.doc = "548caa57dcde46484ae947f46abbd8cfae54c0325b42cc32c23c092e23f7cfe6589b6ddcee1eef09ece3c5ce0328fa561c52234899d9544fdb86440c91c63ce9"; + sha512.source = "3c0a366505b9631e4240bc6a54619c8f526b18ddada30f2a88f8adb29916d0be755bc0643fcb40dc4d1a0bc371596774d029ab4c42d473ec09c36fb48e99cd12"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +typehtml = { + revision = 17134; + shortdesc = "Typeset HTML directly from LaTeX"; + stripPrefix = 0; + sha512.run = "9a158c2fd4c16a5dda1f8828ba32e082f5839fb841a8479563828b0085db4fbe28cb91674c6f22ab4965f8bf6f6cdc0f5b3113743113ca0188ff8bb851845ae3"; + sha512.doc = "0001ed86af90c4fba458d299a2651a200ece010ec76bd8e934afcbacb7d7684fcd6c9514d280bac886a41eb38b4630fa52b1ea18da70ef9c29bc04618e392673"; + sha512.source = "729bb6acd2e6ec28bb18972cc58b7ef8efae136bea2d96a38cedb4b0d40b02e00e2b21143706325bcf9add879e8adcc6b0194b6cbef3803c5566e7f6f0e63ca7"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +typeoutfileinfo = { + revision = 67526; + shortdesc = "Display class/package/file information"; + deps = [ + "fileinfo" + ]; + sha512.run = "6f448ade3e08de1512064cdefbc1811f97f0a32141dc6123788bbd1147fe3d5c3f8709f6316c0268529017e611cf455d1488a8565a128c4c45d1de0ee9311ede"; + sha512.doc = "d8c8e568d87a0107789db201875f2116df08a2c3dc9bf235951d5b675a8b1d01ab8b2170301581f18cfed4fec98e8d63fe127999f0273c9c59da163e72debeb8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.32"; +}; +typeoutfileinfo.binfiles = [ + "typeoutfileinfo" +]; +typewriter = { + revision = 46641; + shortdesc = "Typeset with a randomly variable monospace font"; + stripPrefix = 0; + sha512.run = "f8b9edca6a860f0acf0d676fff381276594f7c13fb13da2e54caf5513a8a65fde378b4c16dc621d89d25d7492318b006d7c5d863c1f96a0a246064c0dad1f2d8"; + sha512.doc = "12376247fd8500e7c147609bf47acab379e36126976ea9f2dc0a352b8b0d779b1cd43bd1394f3961b1a7fa894a8b6448b0369f612d8bbf8d1bec3175e850f89c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +typicons = { + revision = 37623; + shortdesc = "Font containing a set of web-related icons"; + stripPrefix = 0; + sha512.run = "38b0afff6e88635a2a27502f1abc279fd70e49f36d56bb44114895614cf80184ebf8b627bcd576d128b3557de08b3791c5c2e48f2adac9766f9a809ff0db3cba"; + sha512.doc = "36b9517833fa6c430671fdaf0ad0775813c22ea3b3f56fad96410dd90e052b76d81f0ecd411ec19b567cd664b7ca44b9268d05ce59fb9bea0429c8f91c3a4a55"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0.7"; +}; +typoaid = { + revision = 44238; + shortdesc = "Macros for font diagnostics"; + stripPrefix = 0; + sha512.run = "56553f1ea620566efdcd5dbe3710627d4c1b0be0ee294d256cec8cd633a4b24048012c108eac867427ddda28614eadd73172fcd2c57ac702d5f5e5c4a40769bc"; + sha512.doc = "fd4809e02b1167e16bdb75cce5837f6202cfb44e7a0204900f6eb70173aac984eb35b14f00a9d43d4a61a4fb3a00298eafcbf71de15c7531f043e64cef418d8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.7"; +}; +typogrid = { + revision = 24994; + shortdesc = "Print a typographic grid"; + stripPrefix = 0; + sha512.run = "4ef0239ae626245b25e43819bc05da7d22d89d1e33b94402f8bf2b24e2518bfa7ce6626d0c9deffba5d461dd65db0160bd9134b78cd9ba930d0e6315cd761b9c"; + sha512.doc = "d228343668d98616c6cab8a1c4b0cea313b4a7d2f25699a0f54f64b660b10869d2669d98f7f5b992ddff5a3202139ef1e278ebd40b3dd76466c6154a59804c90"; + sha512.source = "23aa23ca0ca597a03ffbcd0ea79c1341d52aecd41d363e6daeea8b35c74d59a4edcb6a0f2dd7fc05e0a1018ce375f77ef7c831cf093292dd3785f486b2397388"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.21"; +}; +tzplot = { + revision = 64537; + shortdesc = "Plot graphs with TikZ abbreviations"; + stripPrefix = 0; + sha512.run = "78d2a67470340caaf6ee286f0dbfb9b8706cd4b0a689a64592c11f6b8a5108a61d33a24d36262aa5b802b8893ba440365fcd1280eac4cf7d3e514f6820ad21ca"; + sha512.doc = "853cb61ef10c91e1392c23e2b4d389f0cf572b692a6eafb8bb9af35ad9b2f1e7a8630ec1df6faf1ac1bc83e88dca0146519f571917ed9ed57e6ded912fecd895"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +uaclasses = { + revision = 15878; + shortdesc = "University of Arizona thesis and dissertation format"; + stripPrefix = 0; + sha512.run = "4341612f18d6f5f4352ec0bf0018fe3115be73f479479586a81d7f994ec23adea7c38fd773022b4d81a126e43bcbfe5f97f4c36d61bad73509f2c1b97882c00f"; + sha512.doc = "63beb08274ed7db9a2d77761277d65f89988812765a2484d7db54a8419cf67dad3fbf76b46bdafd8bd7cf17a1d540deb83c00c7b6df01f6f023bbb5f098c2ab1"; + sha512.source = "ffc4902edf6b4007c3685a58d3e5a20a02a6ca3072466b7415cb4fa98de236e52c6a391c5e5cf30aabf37c7374cf00aaf2c7d6c845a3a61e2f9c0b0505e215bd"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +uafthesis = { + revision = 57349; + shortdesc = "Document class for theses at University of Alaska Fairbanks"; + stripPrefix = 0; + sha512.run = "52e0fde63c966392a235239725e2db7cea70a300837cf53003f961d32f54787d8c4e70ee76577889ea543f884ed5ec281b345bc9e83872e5a131e55429f7afe0"; + sha512.doc = "92c2a15a214f42a9dad8c0c50a67c68d037980b813e8ea4f6067341628f19f51de36a20b0e0d8fc49acbdf6ff026a729dc86e65dd4b8fa148a541d9535db0f85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "12.12"; +}; +uantwerpendocs = { + revision = 66819; + shortdesc = "Course texts, master theses, and exams in University of Antwerp style"; + stripPrefix = 0; + sha512.run = "88163f9a28d8027e1e223e551f1fb053751f849822727fde7e595423e6f10c67e2d389f515aeaec77a68a48d7b20600cf9cf3ae7adb02e72f45e4d6df48c2049"; + sha512.doc = "68dfb896b3b189ac38362a8826fb925c8e1af493029d04bf584a1a6e57c8e501689fad7b63c96fbec69d2aeb69965ff1cc7b544bf35161a6d90c4a54bc486438"; + sha512.source = "9efadf4bc9c217dbad28b57845ef9bc18bdae2e5b48887d1c6c3763a3867083138eaa0a693de0c407fb798e150b0737041789bef915216fd124351c1ee6b3b99"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.5"; +}; +uassign = { + revision = 38459; + shortdesc = "Environments and options for typesetting university assignments"; + stripPrefix = 0; + sha512.run = "3e61f381e23c30670fe78c4a54d99970bd05883e6fa03040e7123fb0936aabf51341d64aeff92109fdc33b7b97f40aa0cd81fd6624d9449584aef1fa3061070b"; + sha512.doc = "e6569cdac6854bc1856d6a4604589619ecbf317442018790eabc3332723dc167a879e7ca6be0da8c281847e757ddada005daaa3b8712f7697ea4052b9c9f7cf9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +ucalgmthesis = { + revision = 66602; + shortdesc = "LaTeX thesis class for University of Calgary Faculty of Graduate Studies"; + stripPrefix = 0; + sha512.run = "b836c6cd59559d6858b6ae98e04c8ac9734f8c9df34c103e6076911db5db6430d0b253c29414a63073216f2ec8e02ffafd69ea97750fa886859b9da1ca2cc07f"; + sha512.doc = "acd371ab0e495a664d37f5da31cfaa9d31edda71b2542afe9b4ece6e4845da19e16d4b84d64b0418b49696d080fc019e521874527ecc0aa8559f2c2341c80cec"; + hasRunfiles = true; + license = [ "mit" ]; +}; +ucbthesis = { + revision = 51690; + shortdesc = "Thesis and dissertation class supporting UCB requirements"; + stripPrefix = 0; + sha512.run = "b1a4258afddfb1283c3fa4f8e126dc63f1ac948ebee2d2fab3738e2f5228b0bda85e71ab3cc3ccfab0b8ae66b84547c5070e111e8c1516b54bcef721f935e63c"; + sha512.doc = "aa443fe9530f08dde9b0531e075052868524c7ff6052e8e93e384ee3c01a354fd1752664b602ff6c98ab5250d05eca910773236d55270c09a567c9b238fbcd7a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +ucdavisthesis = { + revision = 40772; + shortdesc = "A thesis/dissertation class for University of California at Davis"; + stripPrefix = 0; + sha512.run = "ce8191ad81027361c23175194bf23284bc2e43407f0047586a4a89a2c51f9823356e2e571639a1f76f6a1f2b43c08eeb134d874c03f559897b0cf50aecfc94a9"; + sha512.doc = "26ecd36ab09467341868d0ad7d71f39728f23688053ad4b8a89339238da5c96fcfe504d8e6403663eb6441a14333163f8998e00428609b161c3e9665a4ef0bf5"; + sha512.source = "759eab6cc5b63ac159e481bd012ce5da4d6ba35f459928d4e578b96bac60485df32771660b4f8fce08e73303e517c37aee1a5503a96c810506bb854cf7bb050e"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3"; +}; +ucharcat = { + revision = 38907; + shortdesc = "Implementation of the (new in 2015) XeTeX \Ucharcat command in lua, for LuaTeX"; + stripPrefix = 0; + sha512.run = "333e8f92394d89bdc3492606e467d4b664c5d87eb464e1c16ff293e3f87931c3c70308aeb523fb40f2e76e5d0aa2c1635402f40fc36ecfbb7ced98d232b8bcb5"; + sha512.doc = "b4615cefd26201509c908c2719519f927d61ad96367a612d654917819b2ac973fff85d081dad6e1d092e634388b16e83e440d3cbad4fc7c16f638f5e2853bb7f"; + sha512.source = "6ac34b38f4e0908d841ded4981d649c9202bd3bc277843e6e82bce629a245cea9c6ef1336d575d77139584f3940181c5e6f0abadf4ff71c42a97ccc33be59d9d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.03"; +}; +ucharclasses = { + revision = 64782; + shortdesc = "Font actions in XeTeX according to what is being processed"; + stripPrefix = 0; + sha512.run = "41e9f5323b62d529f0b0ddd1ae9c5d613df19190a2a666e1c1b35cadd8bd5411487ecee1419b7dc7f06183181f68ecbb8bf813537c6e711f926fa99fa74f249b"; + sha512.doc = "52fb328befc004024d10d4222eaa7d6d3d179523bfdd48ca8453d6023c118f328a1981b69c805660ee4ddef95df3b5b71e1c85f59f3cae92ac74898f50b52206"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.6"; +}; +ucph-revy = { + revision = 69750; + shortdesc = "Musical script formatting"; + stripPrefix = 0; + sha512.run = "f9fb2dd19b7a963308e5c5058ac990ce3b944377ff6eaf52b26fcd7a12087c75bbb464e5e1155a1c3340e8fb3fca65b6d344d76f47a9a386fdb6e5425303f81b"; + sha512.doc = "0ad9f32badd36c033dd3d368e507518bd27d79e3bb94747b86622c2e41b81e87b5db673ddb4cebf7a88df4180b7cbb2bb0826ee19990e572c5e5ff33394c05f0"; + sha512.source = "b8245b1d950ca2af99683fe87f3eb5211cb4990b0911d11963cadbcc9c9d23d29bda0e7bd18a12184c5ac2501e69b67c89844d061c00f0e1ddb842d5d51d7112"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +ucs = { + revision = 68759; + shortdesc = "Extended UTF-8 input encoding support for LaTeX"; + stripPrefix = 0; + sha512.run = "9adaa0a3fef64436b56d3e4e1c504b74c18dd795db15d193df0e0ced419490ab462cc61850d3bea6cde7928ddcd85cb872130d1dc9776aaf3bcd8f12cf144832"; + sha512.doc = "95dede76d97d0dce6cdaeb0acd128e89c2e98383e633925b40433c0d4e0e342fc3df94603f17370fb56b88c40effb99eacc4310e4de4231232a2be6892adbe87"; + sha512.source = "e2f0406d59b69bac26363cabe90364aa61513e3c20da1fb414ca683e830cdbc79410fbf9f9b36e60d467c989d03e942efa2b9905dcb2339bfae9267e49cbd00b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +ucsmonograph = { + revision = 52698; + shortdesc = "Typesetting academic documents from the University of Caxias do Sul"; + stripPrefix = 0; + sha512.run = "e4375327eabb390842ae833bceea1a554fd833b656e0ede5d56b1bd48a070dc0b89eb878db0c77e92865760755c006fffab8a1d0627f0acb6cc1485aa9a13c6f"; + sha512.doc = "00cfc843b8377d9390806d72a78c5c7d219adc0312a7472ad764bb777200265b6f2d6757f98c44ebdc671671df38e920fe488a2cdea0dab0a3953856b5233b57"; + sha512.source = "900c1f53d5f78fcd7e2fbab9a83130ff0d7233a4fc3a547fdecbb6c7ac35a7c3a32a10f74b00f959c8cc4afae98f97532f3baffe1db433053497db80ab74a852"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.0"; +}; +ucthesis = { + revision = 15878; + shortdesc = "University of California thesis format"; + stripPrefix = 0; + sha512.run = "5409e366c69372dd3a93b3755d185e0b96edf71c7a8de4d6cc3d41850e5b9915d2bbe68d3265b5facd52e7d8c00159031737dbcc26302a1a6a89425ac47f443c"; + sha512.doc = "7f7ec44a55e2d712af2204d883a7136b44192a402daff4376cd6cb217419179d2b46bc083688d9be9ad85d2b3daeb00305f2253196784ffc9d72c039f0aca5af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +udepcolor = { + revision = 69701; + shortdesc = "University of Piura (UDEP) institutional and corporate colors for digital and electronic media"; + stripPrefix = 0; + sha512.run = "010172b3730b31b12a6f9e425203f9064b7c880e5abcfa0ed538ffaedf3517dd394030d55501b48c1582036bb78153d7d4f581cd2c396d658db58faaa00c0cef"; + sha512.doc = "33e7057cdbcb2ee342d061194d5b0e36a1e3e7fd48c7e1d728b6b8b4a2b6fe1c4b0a4a9185b4cfa3a483cd084f93ac905a98f7140bdc0a8e4f37395bf9a55ffc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +udes-genie-these = { + revision = 68141; + shortdesc = "A thesis class file for the Faculte de genie at the Universite de Sherbrooke"; + stripPrefix = 0; + sha512.run = "01422998b27a84f3b892114fe468bd57ecfe37dfda68ff84f2cb95fc9ba589d74fa4874bb35419403269685c74607e647d98b1b443d8739c5b4c3335820f690b"; + sha512.doc = "c962a955f1d618232196eab7c87b301dbf725f8ab08156ed98d4819ba3be5a6873b81dd7deae65c0a36eced5e42be6415b78b06c5fe945b4d4492e98487bb91b"; + sha512.source = "77a91a01bc6e61de8d08048cd4d04ba6e6f2b2c082e14ea4100728bec3229f096089069188a523d3d213c3bc00d27065fb5949b622869fe419226705e357d802"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1.0"; +}; +udesoftec = { + revision = 57866; + shortdesc = "Thesis class for the University of Duisburg-Essen"; + stripPrefix = 0; + sha512.run = "56171faa46267dbd99185807f619a673cc1ace837eea3c0e8659c4d7fb50aab7f8842e259f433070b8eb54390d3426542c3443a62d37a1aa9ae7029f4d7f022a"; + sha512.doc = "463b9ca1c153da84ed0045a2adbe8129031bab79d0a586710b6cbb9fca9b84428b7036848efee27a075b40f0cb015081c89e6e7f5588f1e2bd011d81f40be721"; + sha512.source = "99273b3d809dec7f508bc3f1744143804edfbcc2b3ffbdd6fca4e51be2f98f3ac0ab6852ccd333c5a69a627dfb108952d511a5398eedef0af4306ab573ea54e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7.1"; +}; +uebungsblatt = { + revision = 15878; + shortdesc = "A LaTeX class for writing exercise sheets"; + stripPrefix = 0; + sha512.run = "e9ce935da13de8106d63f233349bd29e954538ad17de7505be14a4b5a2efa1e1aabd3ef46871e98d2f5d4730bcf6c49998187924328eed19a35a95bffdcb8d70"; + sha512.doc = "2853eae6fdddf889b305166c6c09351e8e7d7fb087c68a5ab9f4a7a282118200a5120c215708e7d2b9d4487457aa6330d11ec7f7a8e0139719b67217732f2633"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.0"; +}; +uestcthesis = { + revision = 36371; + shortdesc = "Thesis class for UESTC"; + stripPrefix = 0; + sha512.run = "aaeb270174e260230d527379ef0a7581ec9f78387aae8505ed5e88a04586dfbb1d90cb923181f34e92d5100bcece0da66e17452218f0c83bbb12b38cc517f3b5"; + sha512.doc = "e68e86bb446c1e79111948b004ece03e2110166d01966d562b1bac6c932385aeaa682f04262eccd822e01b93c66c77be53c947c1dbdbf5ce129a74efdacf5df6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1.0"; +}; +ufrgscca = { + revision = 70603; + shortdesc = "A bundle for undergraduate students final work/report (tcc) at UFRGS/EE"; + stripPrefix = 0; + sha512.run = "4232e58cb76fc9e6e9a24fdc760dd189004dc20a10c9b27265a8d2449d8ff4f741ad745e52815e2b729d78896d682a9b11b96b3eb01bcca7ec4a4cc8f4a3c893"; + sha512.doc = "efbfb6a83e5fcc88ce59b8b008c961b3e7e84266ee7b8c8f5f129f3625c1018352b701ef6fb7f8c1f41b21655da6b26d9add397d54b7bab4fe7dd74c91e327d5"; + hasRunfiles = true; + license = [ "lppl13c" "gpl1Only" ]; + version = "2.7"; +}; +uhc = { + revision = 16791; + shortdesc = "Fonts for the Korean language"; + stripPrefix = 0; + fontMaps = [ + "Map umj.map" + ]; + sha512.run = "b5e722e7a72d2efcd89c969c10291779a2885603817374e4318f59b4042b8890df967503016d08a91e30ba8cbbc6f1838843644f06cf44766a7096efdd3bf905"; + sha512.doc = "c37c5041d155f9a175a6761154211a683405d094850cc829a6b942afcb93af987b4049e663d260ae2b066827007d8c6576fdcd5d14d3ff599f031b13c00e162f"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +uhhassignment = { + revision = 44026; + shortdesc = "A document class for typesetting homework assignments"; + stripPrefix = 0; + sha512.run = "a394f6f161cb72ba42eccdaf26f08b12048cee56207f754dac157a2eede1b0867fa0d5916a37d5e3dffbf10237178f156fd3cb33c88be6a926208ca8dcdd0508"; + sha512.doc = "21054dc051229a338d2aa954cbf80893e156236329206ff3cb63f47dceda4c35c6fbf6c2d9492551b7609aa88dec74c507094e2d96f2f96432436e74e80a9c38"; + sha512.source = "0bd0fcb18d334c471fa7d4259cb7c511dc7917344ffcd724ea8bdf859272cc164649f01eb4e553deb5b44f91dfcaa1640b18ccbb5b10c1b0d3a7b585afa323ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +uhrzeit = { + revision = 39570; + shortdesc = "Time printing, in German"; + stripPrefix = 0; + sha512.run = "7b5c732258e25ecc2d429b09349b94cc4f24de77e8db40add018f42bf7658868e9c3730f0fed86312ea96625556fe02a276535eb14416d06fa5fd2cc1eff30c6"; + sha512.doc = "76c7bdb6c74ac05fd9b51366b68b0dae8180da51f506ba1793765d25de29582c8eba51826d6d6c6d3c3c1793f10fda3f6bb75c82d8d454fb19e1339eb98a9eb2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2c"; +}; +uiucredborder = { + revision = 29974; + shortdesc = "Class for UIUC thesis red-bordered forms"; + stripPrefix = 0; + sha512.run = "4a398e734fe551f1636a63ab3ac8b851ff1e445c8b15b6e48017ed7a81edbcf042750919db790d7e2e9d6b08132ec5a3c04195854315ba1c1c8e8712996dcb25"; + sha512.doc = "6e1c91389897853bada4b52c8350dfbbc321395cf1ff7991d7f29d5e64119c86c4e07fdad889f2a4a149e0e2db1a1e5cd9a44cf6f905d5030afa25cfb14d1323"; + sha512.source = "74256e3917f7d28adbcd5d08e4dad126dcc93019c852ff6307417b2e150cdefa986affb61d7b174bf510e5f75563bfde01fba9b4c588db3d41c2fca82e0c882b"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.00"; +}; +uiucthesis = { + revision = 15878; + shortdesc = "UIUC thesis class"; + stripPrefix = 0; + sha512.run = "565b499bcef08716d627e206a53f2f344a10a0e219876eaf4bd82a63accb2eb43c14c8c8b25236d336022900e9a7d5299b5a34d5e40eba0be6d7dc8ee4431490"; + sha512.doc = "798e7428988a622562b94bfd4ae389dcbba3524fda0d427aa4fbdaff0f1a437babb4e68b58350a3229fa078bf11e17af9f5eff61a5c9153960a941783cca623e"; + sha512.source = "3d1eb025e066a311e4ae28292b00e697cf4de63b1038944b41edfbdacbdfd246d5a49bd63f561c5d0d4bfadad8d2a4325a8784245c09308ef5d2380054b966ad"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.25"; +}; +ukbill = { + revision = 69362; + shortdesc = "A class for typesetting UK legislation"; + stripPrefix = 0; + sha512.run = "45a1b6be9d4dbe7a9cf47ff7cf07cd280069203eb9e3a5297e699e84bdffaf845c92a32136ba7e2f61db613a32dec6d37af3eed1a8dd52fdc652af207ef16d23"; + sha512.doc = "ad3076413ae87035b82d913c3772642aef429c7cc0efd7718f3838a5c7dae52e3954d0566c23c57f2f25d51ee9904dc8dc78b3d8a70bbe6554ce0c74d8703862"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.1"; +}; +ukrhyph = { + revision = 21081; + shortdesc = "Hyphenation Patterns for Ukrainian"; + stripPrefix = 0; + sha512.run = "043338c4e92d84bc2b7bd63610656b53b39bac225c5610089c0c8b58ce9bbe3f414129a6b043a5307ebb7b59cc062ade7bd803fb6949d06a0d0c87e2dd4a0bd3"; + sha512.doc = "a283d11ed922181d4f29f521e3019fbca2b1bba1aacb312e22dd8e69d05d7dafbabc5c23b63707f265bcd215d8f517f58ab2ffee2b87d9bc1a968d00e9542840"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ulem = { + revision = 53365; + shortdesc = "Package for underlining"; + stripPrefix = 0; + sha512.run = "bb7fc8d93d38a847431f9f62f1447520890f3904654ef6f3cdffd14537600da35d54bd0839cd8fd8d26e1e3146463cd9ced79f706df54df075292eea8a40ed4c"; + sha512.doc = "153dcf2057d267c2f59c7705c4997752e902aa004201f97d52a180419d7c0fea4173c0b5b1a1c8a11bc1703226e55ea55721a4d18c265b30343a5812d1f4e0e7"; + hasRunfiles = true; + license = [ "free" ]; +}; +ulqda = { + revision = 26313; + shortdesc = "Support of Qualitative Data Analysis"; + sha512.run = "228132cc464dfe171426fffec6103f0dd5eac61c112b03d64d98bc89a0af0ddb7f52f27f9bb5461c8be6f752ae30ef3d4c6b987e580d834eb7524d5c27d956cf"; + sha512.doc = "182dbcb73a25e05035f878696887ea219569a1a7ef44281bee14b4498b37e92346e0e97d187a5f3dbcd8d9783f260080ff10f58dfe41e69caec4888d901b9128"; + sha512.source = "352f1a739cb9c74c0dae529ff330f3269e763242af4dd1bc0aca963b3af03f02f5becad436cc3a93aa105359a1bf2f229b3cdb7175d539d58df67563b490de8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +ulqda.binfiles = [ + "ulqda" +]; +ulthese = { + revision = 60217; + shortdesc = "Thesis class and templates for Universite Laval"; + stripPrefix = 0; + sha512.run = "23a9ad74b214612051104fb111808caf9c6bb2056f129265e77bc76370c293248a7903a5bc99183998061bb18409d86508cd488a4e82487726e17599f5948101"; + sha512.doc = "f7e062e470c524746898e88e2f07cdbcc58c1bd3dd5c04b1f0f1e7e7e6c9fe9968ff68ef2f2a95f25405c7901d937a32ed92b752b6c74fa228237b08645a757c"; + sha512.source = "545c1b5e53c093a1ea29ca73fdd4c3c355dc34a225651d774c31a6dc64acb2dc20d78421fc939bae4d324d6c6e5ce2e4f82ddac6ed935ec8de7e1f530aa5f30d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.3a"; +}; +umbclegislation = { + revision = 41348; + shortdesc = "A LaTeX class for building legislation files for UMBC Student Government Association Bills"; + stripPrefix = 0; + sha512.run = "ea6a55698b51da3939a1bfc10963dd74d9e772ebd18ad9018f649077224f7ee30ca20f051a68c9bd8d8bac94baf1d0d28ab2f864419c61385ebf9bc82aacb7f0"; + sha512.doc = "d4d5f318baa1f1ecd446bb864d0670ed2dcd7208429bfd2ce587810b27dde22f49a6f7c072aad8f6515e721a98ea0ec356ee36eb970cdee385910a291d964394"; + hasRunfiles = true; + license = [ "gpl3Only" ]; + version = "2016-6-8"; +}; +umich-thesis = { + revision = 15878; + shortdesc = "University of Michigan Thesis LaTeX class"; + stripPrefix = 0; + sha512.run = "52bb76c9d9e3bb742c2049495a74d026a1803396bc5064a10f4da2e80390ae6c9c9c74326b14966e989c9edd1e29b797b89413ed6e87e90527ae470a8b731889"; + sha512.doc = "db85abee0ad37ce814c645c072399a6ab7e3307c623bd402a1b9ee8b69a1c2a8aa782b5007a433ebe9eaba984432223bd78f247fdcd0c6f50edeccc87b874173"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.20"; +}; +uml = { + revision = 17476; + shortdesc = "UML diagrams in LaTeX"; + stripPrefix = 0; + sha512.run = "b20da85c7166f8aec4309af3ab0b1319f37ada1513ff502555794b1721ac8c3f551afcdf49a58bf5c3c5e666e48962075f7711a45de003245584541175a6a470"; + sha512.doc = "d81393e3b6d9efc0177478e562dc0a22323e3e5913d7592cdb6ec595d525238e154d2a599380521652eda4fe75b12006cfdc907715b0a9d461f8df60ed27986b"; + sha512.source = "afc5aa7db53b82f6063abca35d8cde75659682525d939e2f55c375b89fa4cc196bca8852c91d12f7daae939c053f4c9ecf99b326361f051847e660af5afe3ef7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.11"; +}; +umlaute = { + revision = 15878; + shortdesc = "German input encodings in LaTeX"; + stripPrefix = 0; + sha512.run = "35188d3930b11c0d1b52a5032bcf9cea21a22ce8ca2930f69ad4ab54bcdf56b73858168cc62581aac1173452dd0f7d0da3de8ac21b0ca2255ef324ff63c89091"; + sha512.doc = "89f28b3b90f63ea4f367019f0b65aa1f8e9489ff0d897af6ea29b7455948e3e75ef003a5a2d5b4a88e00a5e415d409a577c03b63a330f93ed6804c99f951c68e"; + sha512.source = "494ee6d1432d783f9586c80cee044e2857d4d24358c7dcb7d3043945bb3f5331b8eee78a13ee759ed6260518dcdebab33d78bab4cec5d384c4773b502c96fb0b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +umoline = { + revision = 19085; + shortdesc = "Underline text allowing line breaking"; + stripPrefix = 0; + sha512.run = "db3b8216d50288ec096f3dea9db24dfbad76848d9b8ccdc5d1310f4b8bb1b37ef10fed74ee5e6e0b70cc3e0aaa73aea87354ad731e4057c888031eb4e1940539"; + sha512.doc = "64d559300349fd75af4bd98f0841aee5c5d622791cdd03373ea1e7840989b5175e300663023d0f08636b86337f66c6668871387a51a9a28e079111087265bb98"; + sha512.source = "13f53876f0b1c5921b480ad9d2c63ef3abf1e175006145f200f61f515e778161ba631c6da9ca4c4d928f94220e0964b64130638d7dd7195160b54f39e4bf868d"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +umthesis = { + revision = 15878; + shortdesc = "Dissertations at the University of Michigan"; + stripPrefix = 0; + sha512.run = "b2fb90713da6547b9d4cbea4f972144f70d7f1875e325225f0dfb90df1a04b4693c5a3dc651f0066ef7ba6456c7732aeb5272ccfd5e8edc24281c1b1bc9e4e32"; + sha512.doc = "fb43c7ab262d2a1eb70b80bf4ad66ae9e022c847451009372e1ee1fcc5250e93b0a4a2195f4208799ae78cbcb5fc24d48de0b2355884721918ae5d4c827c3507"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +umtypewriter = { + revision = 64443; + shortdesc = "Fonts to typeset with the xgreek package"; + stripPrefix = 0; + sha512.run = "e62f573d1dd79b27a9ed563a9081c94eeb483fe9904cf080209a198793bbd845e4ed29eb5849165a3880338a07dade313762c02a0e37c8b518752edede622950"; + sha512.doc = "8d8044cb196584c363006bafb7e31c023e1761bb23070ed56fa3eb84040861fa29cfae479ecad01050b9cea0f5ef408d551a34809362456e31fd53513d1bc90f"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.1"; +}; +unam-thesis = { + revision = 51207; + shortdesc = "Create documents according to the UNAM guidelines"; + stripPrefix = 0; + sha512.run = "aaa8c4029cfb130798c5e9401fde5dbc7943d7cb89c9a620e050e619ccc1950593b1d10bf6300958aede043ed0e4fbef371d0c40f055b259284f008463a64c40"; + sha512.doc = "ba6897f0b31953cc60bb49430de1b77d10d7656363d596d4160f96189c70417227193ac7d3809e1bd7518b89a871f5bf4b18004ff8185b2a03e0226536dc6a3a"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "0.5"; +}; +unamth-template = { + revision = 68681; + shortdesc = "UNAM Thesis LaTeX Template"; + stripPrefix = 0; + sha512.run = "c6b6d86dacb71575a7f76e33eac081f630b81815e3501ff5ba5a5e056d5bab76c709b19b8843adca39330fb644cc49e70c8687b5a66d0dc636caa74af6c3bf5e"; + sha512.doc = "e7e17ba71d47769db4766628d334ed66980d7f133ec0bf2bf21d7a00e92d661dfa624def736891c5d70f11755215bff47b8cc9ffaded3baebbaf52e0365227e4"; + license = [ "gpl3Only" ]; + version = "2.0"; +}; +unamthesis = { + revision = 43639; + shortdesc = "Style for Universidad Nacional Autonoma de Mexico theses"; + stripPrefix = 0; + sha512.run = "f48e7aab2c445c5e257bb39ea4dd880cf9334a5b1dcbf429e8d4420edbdc4621aa59548f31770d67698bfb4e59e239dbcddc959c1b010e012ad16971ee7956f0"; + sha512.doc = "240a697f242b880fd2436bbaa3752aae57ef3fd2e9ee63da173c78582c4bcbb1eb19e02a96607991d1d6a40157d52f00dadcd4956af230d429ad5223161a018d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +unbtex = { + revision = 70325; + shortdesc = "A class for theses at University of Brasilia (UnB)"; + stripPrefix = 0; + sha512.run = "0896c89b0fe51d943455fddd654f67b81aeadbc83d2a66eda450b9152f6d3ebceb4854c3bcb03c38f4ff0f0ced0b50c2e276b2ffb306ead72be05dc1eb02893f"; + sha512.doc = "e398de7bde9696776778314665d6cf37f55c0faf33cf3dd4acbd14d82d7d303d4a0750119aa0fc8e8b80288ae7219020ab43ac78c7d125a54845277a8ee2ead7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.1"; +}; +undar-digitacion = { + revision = 69742; + shortdesc = "Musical fingering diagrams of Pinkullo Huanuqueno, Flute (Recorder), Quena and Saxophone"; + stripPrefix = 0; + sha512.run = "933038ebcded30e59b2075a064c35a00e5523fae80a6a7091d8a0c44a043d4e9150b68f1cdd6814b3a0346286086b8f5af7b68b2de2c32be1c38684672afc848"; + sha512.doc = "bdb12e362af8ff816c0cc43a76974a8f1ab326486a6b103430fb2139f22cddd27514d2e486cd969179be75684bb6e5fc0bf959f8d8c868ce3d5fe466097a0224"; + sha512.source = "37d9e4d5872cca1cfe157233b56050a4f599038f3d552614ca11125dfe23596cb81cf5059244e6f3d702b338558d687b5a28a4f96a18c0c9d2b038a31484197e"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.0"; +}; +undergradmath = { + revision = 57286; + shortdesc = "LaTeX Math for Undergraduates cheat sheet"; + stripPrefix = 0; + sha512.run = "948d0f0ac20a63fb0c6de8003c572c11704d2016d2ddea6674f58742e997021d709d51806b5acb4716c79539b96086758814f4f5d303a257768c8716821e8451"; + sha512.doc = "6300a5d0781bae331091cfc8007e974ed3534ec3672dedc080c8e118e8526c98206438a6841d50d2e642e8d6c7859cabae14e140c211bc8175e7f9d1cba0ddfe"; + license = [ "cc-by-sa-40" ]; +}; +underlin = { + revision = 15878; + shortdesc = "Underlined running heads"; + stripPrefix = 0; + sha512.run = "b3afaf4c51b3da2d082e2cc742deaabe70cfbea7425e0c57f0d1d6696cd7d8f993707a219556a5c5bca925ea63373e3f0a716a82ead647e09ef2f716535886d2"; + sha512.doc = "d296a04d3a24b463de3e4fe99c96a2fd8afa7c4ed2fa17d1218ac9e4c17455b4752176be60743211d59657045c709c8b4bd66febf10c81a41879e8c7a67e9958"; + sha512.source = "8c534008a2cb0710b95333869536bdef5e3910e4a7c29ad2daabacd94bc5a34ea15dd3bd8439e7ebede0985831662d86f68815bb13b3fc36c82d83c51b16cb5d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +underoverlap = { + revision = 29019; + shortdesc = "Position decorations over and under expressions"; + stripPrefix = 0; + sha512.run = "3f94b5d33cfaa7f48441ba656e9498ea17ee5ca404e39486004e43bed71bab5f2140b391191e4d6f9575ca23e09b83bce343433c02cc394844270e563aab70c3"; + sha512.doc = "5214981a15d7f15cd361f007505a4a0060a2952d75ea28f4eaef01c19a5b79736512a2b0a8c5e6ece2d08c364780256963276a9bc9ea980e13ba292e3d0b8bc2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.0.1-r1"; +}; +underscore = { + revision = 18261; + shortdesc = "Control the behaviour of \"_\" in text"; + stripPrefix = 0; + sha512.run = "4fdc57d0a36aa5646c6b960b7579a8111441659469df32beaae06f54e6e835456810b1d9b5d36036510befd5e80b5b481b9179a6b24364bf8f858ebc97039ab2"; + sha512.doc = "e1f0730b39a5d25cc52160e090b797ed73a5becc16b6813cd0c2f4bf78696b23aec5c82367c347d0e734f3b92761ad2090e517bb6dd2a40879639f62149fdba6"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +undolabl = { + revision = 65846; + shortdesc = "Override existing labels"; + stripPrefix = 0; + sha512.run = "7a2a13c7cf9a5920278bfcc57c6670a3abe704ffe01f3d90e253dc974c601da9a65366e7dc49785c398e3040771f45fa67365ba4e2b32426380c70556e4337a0"; + sha512.doc = "dff0446c4efbc3ea2a8e379718ec977c53aa54c46c6703cc774db74e9e3d85c49dc83cbe0f1d8cd6450899af5929480968fea873333aea321d8742cb328105e1"; + sha512.source = "b5c0b41e71540e0a0b5cd7baacd702403b4611446a208186caa8f98eb840ae093b852e7b64451488ab7bdba4f3f5bcb8fadb79a9c81015de4989ffed1ea1a743"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0m"; +}; +unfonts-core = { + revision = 56291; + shortdesc = "TrueType version of Un-fonts"; + stripPrefix = 0; + sha512.run = "5476421a802ec3daa8fcb8354924ffb090aa9ea337db315c813637fafa445ef82601edc61cb7aa424bd7e2deee7607902ed33f0cfe70c214901d4c52dfcff6c5"; + sha512.doc = "8f51172be1093ff9da6ebb7071f5fea435e2bdace5619faa24ebdef52b3e34197d91b8f9d302844d4e1377a2a4712247743172afcd4b01367e9f166bd76112fd"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +unfonts-extra = { + revision = 56291; + shortdesc = "TrueType version of Un-fonts"; + stripPrefix = 0; + sha512.run = "9cf9a73ba3c2190da7999c3b770e92d8afb43c640d651173c126e930155e9f87f371392accd4eadae8922ee846a5e02c0eeab845561dea943b34b185164bba3c"; + sha512.doc = "6173d49bb64c9b162763ff08af445e518fa650fcc13e02f5c72454d335285d9c82347cf79f945fae94429f3a9d15f9c9b58ff1d175c8f59ea7b75766cd279303"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +uni-titlepage = { + revision = 68917; + shortdesc = "Universal titlepages with configuration options and predefined styles"; + stripPrefix = 0; + sha512.run = "980f748d37b5b4a3118b1f34db2957b71cdb7551595cf7673e64d75b70688e882b90bd83132ad43bfdbbbb2bfa2752fc2028f3164fb9ee5e9565b84740b303eb"; + sha512.doc = "1198414d70aac8b31e23c73bd167586be5bf2f2745ad492fe516381a1e202e9e0720a389fc8c12eec2a21747f7e5c85fd754243b09dd5a008b2dcfa9a7257e57"; + sha512.source = "3eb42ea4fc401d4a55362f66c96db5295fb6ee66cfd840786ea5aa640c9f2b92bb5718f614d832d7e84427af20334be407ab59e155d135212a00769bbbd50038"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +uni-wtal-ger = { + revision = 31541; + shortdesc = "Citation style for literary studies at the University of Wuppertal"; + stripPrefix = 0; + sha512.run = "d1b6186d50733f87576ef6509f7eebaa17651039d882f78abbfa8ae23ddf7b896a90065fd5ff83a2e216485c22e865057f715784fab37ad9440616297d67a26d"; + sha512.doc = "ffee19f2d4ac337f7615b99946287eb902d2841b48f9d5c49d51604b45b7eaa126538732d64b319a8ba320f1dcb9b62b45cf608dbb0059f37975a1220022c333"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +uni-wtal-lin = { + revision = 31409; + shortdesc = "Citation style for linguistic studies at the University of Wuppertal"; + stripPrefix = 0; + sha512.run = "803107d89b4ce6fe120bb528c684a65db3a9c70433abfd6bcebe2a5d05e6c7680256a407ef5f0515a56915c5c1e0637a183cc866631558e32afd96a0e45139ce"; + sha512.doc = "e88b2c8364eeebf3768d0d562447d29233280daf685d56fe791d25b352cc64c4c95be3bec198aa6e5502287a654f3088e643a3a58edf7e55d0d899eed5b704c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +unicode-alphabets = { + revision = 66225; + shortdesc = "Macros for using characters from Unicode's Private Use Area"; + stripPrefix = 0; + sha512.run = "5a4b043778811bfec1ecc847ee191dc64b3f99ae0adb8fda2b16fdfddabf195133d53acf295fb18dd70460e1c1d200d3e6889815edabcdd0bca9d007d7a309f1"; + sha512.doc = "ded2197bb621622c7f9947ce736814a6acb63ce86bd866792a8fe8e1f22a8131ee12c785a81c764ab707e5bf1b2c99df73c1214ff71159e3c9fdd34ee7aef7cb"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; +}; +unicode-bidi = { + revision = 42482; + shortdesc = "Experimental unicode bidi package for XeTeX"; + stripPrefix = 0; + sha512.run = "35e32b9959e698ab0d32ef578376fdeaac54c1acb9abc584e742a7caafbb2cf82364d58d73ad07de4cd273a5c9c60e4468df74fc4c21fb6552ddb5be725e384d"; + sha512.doc = "44b76c810988c541c5dc6cc85a56fb81e8c2aa97afb84192477e57f59423e508e34aaa0542009ceb5ddbf74c95cd662697544af1cdda1d0c114bb3f0507493d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +unicode-data = { + revision = 68311; + shortdesc = "Unicode data and loaders for TeX"; + stripPrefix = 0; + sha512.run = "9e74ad2fd167a913e004aa77c705f0f8b3ab3d8e717384ee150db076660bda4e2651bea97292ef9e747d4e2519d9ffaa113947dd5241f830c3e4d653ee061d71"; + sha512.doc = "a8e147ba4d30bf80e1c1bdfba67bb3a0ff9f765c5d41734aca1708adb58c5c357a17401383faab827477fc837ac1dbbdcb55ee0b3146acc737c094d6984709d4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.17"; +}; +unicode-math = { + revision = 67919; + shortdesc = "Unicode mathematics support for XeTeX and LuaTeX"; + stripPrefix = 0; + deps = [ + "fontspec" + "lm-math" + ]; + sha512.run = "181168b0560a67c98fc9df214f0bd37bd1314b2400622d2aa3eac6659db42aabd24ab724845190cba46fd9d53b7b1440c016a0c6fab49561c3d795fefc41550f"; + sha512.doc = "deffa8e0656c9e543e61228e4cba9a9cb31e137f6517e552f8b6243d14273b580b69e617c0473eb57a884972abfd07cd8cd9b4b836ffa1858aa1bf433375e954"; + sha512.source = "c221366b66e3f83910aca83dd8bd97591cca5e4a22244af77c87c2a8e161294ac7f3e89d2bd7cdbfd8236df93e60ee99c9e8e9fa2c20060938b96d93f1664ebe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8r"; +}; +unicode-math-input = { + revision = 69591; + shortdesc = "Allow entering Unicode symbols in math formulas"; + stripPrefix = 0; + deps = [ + "iftex" + "l3packages" + ]; + sha512.run = "23396fd1b313414ec1f6181646651a4c304a1f937458111bebebbb0234ef5e007e22dd2590d87c2a58514cb5794036da25801901f980eb3a08fb122e9a107cc6"; + sha512.doc = "e41a989367baefc296d7a890eba2a10f31df4e047b174f34d1843f632ae0d151e34e6290d6b1e86cbe949e7808d59b4523ceaca89aa69097b5e8233d901adb31"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +unicodefonttable = { + revision = 70354; + shortdesc = "A Unicode font table generator"; + stripPrefix = 0; + sha512.run = "08b2d90bed46237ebfdf0e98c45696b4dc1ba7f6f3ba2547fab2b129d6dd96e836dc23c345ccb45bdbd370fcc706e7a127a10f43aef9ea08ad75227f0b6b2857"; + sha512.doc = "823d26c705d4b6154ddd1324ac6297f97ef3244b815a7da23b0079c5bd94ece9391407432cf66b7bee7422dd55514c033839b31ee04262cdc1a75e5e11726e42"; + sha512.source = "ea0086f6d9c3838d0fde1baef225c4e9ab57470033749e6bd4a877d6aaf85a28ad4c557b44f7ef2970db1c636c9dfb43ace959c2e41bf20f2daef3418ad08b60"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0h"; +}; +unifith = { + revision = 60698; + shortdesc = "Typeset theses for University of Florence (Italy)"; + stripPrefix = 0; + sha512.run = "98eba02a617fa5d4349c5b17bc971cc0241d6d41fbe82af1fcbca1bf44faf901e5b13e786e62f26413805acb8efc941c3f1481307c69712aff55cf17b100b5d7"; + sha512.doc = "82620cf7a81f8502876edcbce06699a05f0e580760caab77cf56db89a145a3264202c8ab193a5a56df2f07b2b29d7d814b851dec7413fe0285124920f54baae3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +unifront = { + revision = 67054; + shortdesc = "Give notes a unique front page for every chapter and section"; + stripPrefix = 0; + sha512.run = "da1d02f97f5893d6f51b833e9919979e489ebef273922a01d0f5d48ed86ba9c401c11d5641da82f55be782dd215537159bc2c689309d3a4f730b93f2b739e74d"; + sha512.doc = "f66a3062ccf5d1bbe11e88cabcf7bf907487993cd83bcdc9bbed927a9f0c7fe06d9975ae5006441b7b71969c436a0faa0fc8808af35ba0d381d1dbecbfe921ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +unigrazpub = { + revision = 64797; + shortdesc = "LaTeX templates for University of Graz Library Publishing Services"; + stripPrefix = 0; + sha512.run = "e97b38083929bb67c306bb3c306c5293dd5a024ff58eef5d11d5742ae0cc2bbf39c8505c89014b4c0a769d0e923f91db39173da1a4b374f3d1179a017b8d6052"; + sha512.doc = "dd7a27267e4a7e16f9152ff393b15d4255aba7cbeeef7e5bd7211a8059dcf25473e244cdb02340e05324d982b4e973ac76a1812a82f787fa6bb504dc9713451d"; + sha512.source = "157f4f6770f276cb6567647321637a82df9c9562e9bc661723ca56c2a7893daef5de2e75a8d8fc93d1e80b646147f87e4c294d0b0d936d9c5d9784fda27bd652"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +unimath-plain-xetex = { + revision = 66394; + shortdesc = "OpenType math support in (plain) XeTeX"; + stripPrefix = 0; + sha512.run = "cca8482cad022f39faf3b0b0cdf20a7d209acf5041642bac0103a3dbd1dc832a61a17c442845752317515764ab3beefd6dfcabda8c3d03cdcb8471fdd3bff4fd"; + sha512.doc = "a9138d1b80d8d5db0f00682f213518df3a40e19b3e6f36a01e62ab020efbb9c468da282393cc43a515a39dd9ffb399801607e3ac59800dd7fef73f3007b137f5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2b"; +}; +uninormalize = { + revision = 57257; + shortdesc = "Unicode normalization support"; + stripPrefix = 0; + sha512.run = "b9b0e91a61d99005be4f37d2e5aababf70729c60d959cc57295a7197b5e360ed183bb9cd80bbb287508bf584db48f061bcbb25c6a5bfd0936923b106d9962f60"; + sha512.doc = "804c2e70ff09a677c30f531db5605512453506ab83dce8f9dab4bfbb5602f8605376becc8f65cf375b28c9d6d35ad9f3a92d6f185697e2e9f9d367638d58fb56"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +uniquecounter = { + revision = 53162; + shortdesc = "Provides unlimited unique counter"; + stripPrefix = 0; + sha512.run = "9769fcfd787f210e0653c971872aaad6e0ef1e5a066e392e9d599f8fc11ab9f6587d21db1100b643d09d4850cfbfbbc1d32f01fd1e86aedab8c92da4f5a7d614"; + sha512.doc = "4dc74aabd9288ae881c4513886ff917e1e8bf08446d3b34c946bded6a6fa71ea7b6786bf432fec2661cd1db1af6b5875ab329708cc3c443499b83b0325645d0f"; + sha512.source = "caac3c3445b2b9301d46ca94744eb600cc45b79f6946065f036f412d2d1b41716864d61e0cfb9e9d32ab8dbf870e5f4e302c96b388d680badb13c52821f7722e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +unisc = { + revision = 63178; + shortdesc = "Unicode small caps with Lua/XeLaTeX"; + stripPrefix = 0; + sha512.run = "41f9763e8d090ccf8669af560e53d0abdb4d3f81aaa8c88a97d3b72b8698e95b9ec3c81ebd7d863027f832a945fc11d7e225bb56711cd49b90d430107e9a1938"; + sha512.doc = "26e6907ee5f0d7e7093946cbb524e8dac63ed5c71f761875877a352f8f1454487a91ac46c6be16378c46540175d23d3d50a72eb32b3f3f96599fff9b00db1e48"; + sha512.source = "076c5e0cfa27c31226fd1d729ae8de7d0d009f6e4f3d4d1b9e1339e29ac2db19377d34d2c16b4d821bfca999b3c59826f3b263c6bbadf022aa24447a0ffcb85b"; + hasRunfiles = true; + license = [ "gpl3Plus" "fdl13Only" ]; + version = "0.2"; +}; +unisugar = { + revision = 22357; + shortdesc = "Define syntactic sugar for Unicode LaTeX"; + stripPrefix = 0; + sha512.run = "01dbe995d32b49121e28163c11f89e51d4c692ab864b3dbe6305a0e4364c025b13751c137df52d24160acc9a8080fbee56fc7a5af522405c3d0564486c151260"; + sha512.doc = "8e6fdec36271f3561c768acf095b6fc353da07864829322dd0b52b1784d74793828951e006f8c56a9c38849b28ce186682d906bd7bc906739b22782db2102021"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.92"; +}; +unitconv = { + revision = 55060; + shortdesc = "Convert a length into one with another unit"; + stripPrefix = 0; + sha512.run = "2d1b66ee4ea2cc4bbdf18c5fb88a3f6c2ec438361d3e1cb058f9c3cde3272e40d471b48ec24749ab8fb714eca4b2f6e311c7af951744edcd04154c0f016ca1e6"; + sha512.doc = "f01593365b13c8447c6a0ca34027956c9eba7daf4921e5fc5815fead966916b70ba5d6429ab068b3f0bbe98dcec903a59fcd6982d41769b6ad5dc0db86d7b60c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.01"; +}; +unitn-bimrep = { + revision = 45581; + shortdesc = "A bimonthly report class for the PhD School of Materials, Mechatronics and System Engineering"; + stripPrefix = 0; + sha512.run = "595883fa58169e9cd7a860933f19847895ca02d3a684b71536dfcdff54c5fe6410e6cf6fab8ae9574cb9a9180ce24f3ddf41f817ceeab85d0c65684cdc9b3909"; + sha512.doc = "3049a0bfcbae6666f309979e2c2b8d52647d3c445992201afbbfa28684b83adb2a1ad5f227360c49826ba2de2cfebbc87195801c38413f5eb26bcd793b77ca61"; + hasRunfiles = true; + license = [ "mit" ]; +}; +units = { + revision = 42428; + shortdesc = "Typeset units"; + stripPrefix = 0; + sha512.run = "a1c3266bd95d8668d67e7dc451258f7a3a0362e4435ab70a574be5f7ac44bb5fbb7b30ded852602c73f227f57e8f7bf61af148070b9eae6103a982f726869a2f"; + sha512.doc = "e8a1d929e9817539a5fef6cd89c8d4daf60cc0495fc7698e4708eefbf60fd36daf88ee5cb668e9f1d53978d53253bb52ef6b3e6d1a313708022e5218c99e89d2"; + sha512.source = "a6aff8a5917b48ce17a62de74bf327e0bc2b4a8cfc8a77fde67cfa710d8715b0d8dda54837b3f895cd769649444691df5fafd9e486bb37f4e9af110584f676da"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.9b"; +}; +unitsdef = { + revision = 15878; + shortdesc = "Typesetting units in LaTeX"; + stripPrefix = 0; + sha512.run = "048b2d4f3b160a359a8db5a66b9bc3bf68545384c39c7c4964521aa2067a35e4524734e082d5bedeaf3ff52b6a5043717ca6f510cce0d041b0968968ffd232b5"; + sha512.doc = "c1e6de470c8b290c66f71020794fa5a855a0c9b22d90f629c8ec0f6ab110ff780c0f39291f0309348711cc2acb60cf52f38538da8894803cfee54f9fd6fdc9c6"; + sha512.source = "9ab403624c578eb8f33801309e8c7ab0bb0b53f5bd0de0ad912a5ed6955a5d3ea0d44bb43b61fbfe5cc60a667cd908f85061c92fd397931a2a4780d0af58646b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +universa = { + revision = 51984; + shortdesc = "Herbert Bayer's 'universal' font"; + stripPrefix = 0; + sha512.run = "f21f9bbc0c4e730cd1b115a5dbab22df9519d4a364045e292eae6b73741dabe0117c53759b7db7696c88241800970801335f7537e19d448fda6f72569c4eba50"; + sha512.doc = "3d5ae6da093d5671b369f7db4920baab6fea25e58e11926e2fffaedf1b0699885005f3d0158eb2a6afea9ac4f08ec63c577e99da7cbb75e33727f9a97c8157cd"; + sha512.source = "2040de94a8a45c28a6c8c50d16a5d72297c1c8680f778a3fcf341cc35622c46219945f89d6b5ddffdcbc32be29b93505624fa450ae202f3ec53d61befb0d248d"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.1"; +}; +universalis = { + revision = 64505; + shortdesc = "Universalis font, with support"; + stripPrefix = 0; + fontMaps = [ + "Map universalis.map" + ]; + sha512.run = "4fee20d63395348a021573af4e4e8897f267d69cc59dd7dd8e9fd6ec06041fbb00608dd3adc103b1886638e9783fdb010fbccdebd3ee7cf91a4b57dfd85b67b9"; + sha512.doc = "79c500724365b3fec6f25dc49dd019ca23d0d3bfc9889f75f10a090250eb1614549c8f3ef215102fe5d5ea8c317bd1f1b60557133be0afe376cfd74d73d67fea"; + hasRunfiles = true; + license = [ "gpl2Plus" "lppl13c" ]; +}; +univie-ling = { + revision = 66728; + shortdesc = "Papers, theses and research proposals in (Applied) Linguistics at Vienna University"; + stripPrefix = 0; + sha512.run = "5ba91b2cdb6001a42426b77284aa68b82575997ffe1c5c62afedffd6a74710dc0e4af25df1cb4025a8ffc619376333b318a8be828490d45c7b55126e4c7848eb"; + sha512.doc = "bd576c575776ae2467f146f2cb344c97db797babce5c06a7785449010187a6ce8217b082ae84e0d045b543a4f3ba204f207d8c4ee61b7115f2b484ed4f237e6e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +unizgklasa = { + revision = 51647; + shortdesc = "A LaTeX class for theses at the Faculty Of Graphic Arts in Zagreb"; + stripPrefix = 0; + sha512.run = "ac96ff7105cc0a6eefa7a797b325c6e3cd7a0e59d31a6ead1f715d37d326450fbb3d39d6bc5228df5861c5633ab8be027f7652426c10e0ab23a2c9ab68bcfd98"; + sha512.doc = "00e373b284ea78d596519d982efe8d4c8f59f8abbec67c314bf361b1744d35fe2846615b8cb7d38e1516503c6ed49f9ea38718c31a760f3d19ed4a7686e8bebf"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +unravel = { + revision = 69308; + shortdesc = "Watching TeX digest tokens"; + stripPrefix = 0; + sha512.run = "36afdd36eac84c2421e745b4f21dd1f00e357769df37482fbdd697b7dc27904234e89dfe7c3c61313307522c7c06264290c4e805651024390af7700379f71ae4"; + sha512.doc = "05f27d954122d3225e43412518e3c76be1c9ff4a93f9d27c06dd57bb2f42974608960f931ebf1e8f82dfc717c51f82bcff4b34a480aaa5d0fa90504d6c7a4130"; + sha512.source = "25047c5229041ed87e062c277603be51687b1b29296a83c87f514a6630bc89f42979059251de8f8c1cd1b01c95f0dda23926097fafa1e6863a98c46e0edce874"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3c"; +}; +unswcover = { + revision = 66115; + shortdesc = "Typeset a dissertation cover page following UNSW guidelines"; + stripPrefix = 0; + sha512.run = "4080e5cb6621c3f265245540b22ae026e9c29c37739f7ae955a90ec107199bd2b52b9e2301330a630f535c05004ef762cf058b70ea5d44f65844790156379322"; + sha512.doc = "e3b10ddf23708fa8ea68a8d5d11152812a1832f4c8d87e03a697b81f69b94167d1ac8c70824d7434fdd022f4dc10bd823fa3c177a4f0a282cd60ec166ced6420"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +uol-physics-report = { + revision = 65761; + shortdesc = "A LaTeX document class for writing lab reports"; + stripPrefix = 0; + sha512.run = "ed6b2af5ee9c0ff53cd282b0a7c8cd26e07a5823f00abaa03471707f116f14e04c874548ccfabd2858ebb0c4bf56fe55d19f09dcf865521277cfa04491d3ea8c"; + sha512.doc = "117ed58415a3502e75d10d2f6d6a34d43180294ad9b3a33d12e971ac20e4092a4a50f815390c7f158e79b7f5cc246616cd84a07eb76a04be1286a54a78378883"; + sha512.source = "eca0d3706ae7428a72da99a7ffb123f471ba731f26d3260a5aa7f55b843d25c3ab837ded478263b78fb3530f7f64077488b52160806b248968f46981496e5ab3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +uothesis = { + revision = 25355; + shortdesc = "Class for dissertations and theses at the University of Oregon"; + stripPrefix = 0; + sha512.run = "8549715b39426264ae94d5618f13837bf20e48a350cfccc5642ff5e246ad84e04050e2def0780e8f3da69647d86b6795a009215da1277f43ab9a8a3b5acb798a"; + sha512.doc = "16af5c258ae738401885a1451675ace657e169deb37670336ab87ac39d30128c98bff91b5f9f6f2de9961d981b2719f94472692c5456913bada6e7ec6bbb60c6"; + sha512.source = "3b6a5f3ccc28877e4e48000ec88c480b70f5f454c481f970e6ba409fe71e19cee64293cdbc9fe46c8d0a498401fb2f46f2bd6c1662c3bf19a2c24e1c10c3895a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5.6"; +}; +uowthesis = { + revision = 19700; + shortdesc = "Document class for dissertations at the University of Wollongong"; + stripPrefix = 0; + sha512.run = "060684c777f377fcc98b371123cfcd9717a113deb0f7fbd99cdf6cec65e66b77fc44d50a3475c8b1e8071eec80c2e6b1c20437a4432d6d5fba208fe3f06fe127"; + sha512.doc = "00386265fd93cc89146fba04eff87b55fc250e3429ca5d769f006ee1e8c581fdd96702830a90ca4eeedd35e0d90305b5ce19dea6f16ef5600479d1fc1ab2e35b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +uowthesistitlepage = { + revision = 54512; + shortdesc = "Title page for dissertations at the University of Wollongong"; + stripPrefix = 0; + sha512.run = "3eca5009deb6ccf7daf6d31ffb5e6d3c08ff26395e03b80617411c4dc4049bb2ebd68628f285b95b547bc512fd1cc83246afd5513dc54cb1900edb813f77ede4"; + sha512.doc = "e5e2ec32edb38ea3960922c5f38c9dd9705914f49421b89cc1cb8e6f1d8213512c804c084f1883d1682d5c65b9c54511ec47cf700ca731c4bc352b0bc4e85ffb"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-sa-40" ]; + version = "3.0.1"; +}; +upca = { + revision = 22511; + shortdesc = "Print UPC-A barcodes"; + stripPrefix = 0; + sha512.run = "3423a3a7d42273bfb28642d250d5000fd55d5cfe2dfb5ba0c2f875ced6c6df344866a5512a624dedb12d6bb9357f02a831297f4aba463dbd5e69e5e8dd9941dd"; + sha512.doc = "f19dd751bffb9ee92ee80f74f692ac410781e87817ee841c01f37bac87fc770b9fc97d488ffbe97490206899653d329034d82cf649de0ee52cfa4643f956d7de"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +updatemarks = { + revision = 69989; + shortdesc = "Extract and update marks from boxes"; + stripPrefix = 0; + sha512.run = "7d2f78253c7afcb0ae7e98ca467e6d00dafb92bbe232e99cd11f2756c3277d4bca1688e2d88cbd214580c99fac539c9d01af50115647d5609f239be906c3ddce"; + sha512.doc = "03595b62f116276240b44ef558fcc164e49c8d831dd068280b5f8be70caecb9f165ae3340c2824803ac829f38ea3eb143955a59c3ef71ddde873a2a873185ad5"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2e"; +}; +uplatex = { + revision = 66186; + shortdesc = "pLaTeX2e and miscellaneous macros for upTeX"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "everyshi" + "firstaid" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-base-dev" + "latex-firstaid-dev" + "latex-fonts" + "platex" + "tex-ini-files" + "unicode-data" + "uptex" + "uptex-fonts" + ]; + formats = [ + { + name = "uplatex"; + engine = "euptex"; + options = "*uplatex.ini"; + patterns = [ "language.dat" ]; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "uptex-fonts" "platex" "latex" ]; + } + { + name = "uplatex-dev"; + engine = "euptex"; + options = "*uplatex.ini"; + patterns = [ "language.dat" ]; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "uptex-fonts" "platex" "l3kernel" "latex-base-dev" "latex-firstaid-dev" ]; + } + ]; + sha512.run = "920d770f36992085250b38bf8d58c59fab7ac8d121ad171612b99ec7f91369f9f31c24ba5e5402552e2fe073a3913b529fd013be1a70eb37913a9731caf69895"; + sha512.doc = "8024c2dfa393ddadffd5c35a27542d3f27a030464306087ffc28d65c2e0c704e56143f4f449f1d59ca1f19f007389256a4a23c2f2405855a5aeeeb11bd4b3802"; + hasManpages = true; + sha512.source = "7fe21c87bcdcfc7ba7221a51c59eafd17a767aff04a1f267682167962f2a75a34e12af5b035319b6e413ef1037533f2bc07e7b7d21cda63355ef4185844d51e4"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +uplatex.binfiles = [ + "uplatex" + "uplatex-dev" +]; +upmendex = { + revision = 66381; + shortdesc = "Multilingual index processor"; + sha512.run = "947d733e5b96ee6a621e9686357b8c3f8638c0bc482f4efaac87a72117160f81ad7aa0d34088e61e67982b345b56ec478ef3b6a49865ffb3d5512a7bf18d2b8e"; + sha512.doc = "ec4d1670ff84680fcab88e29ca5f4306f44450ccca9cba06282ad34bd026f74b46d166724a06a313957ca8d798b0c296e848bb248ad416597a99afb16b4b5a0c"; + hasManpages = true; + license = [ "bsd3" ]; + version = "1.07"; +}; +upmendex.binfiles = [ + "upmendex" +]; +upmethodology = { + revision = 64613; + shortdesc = "Writing specifications such as for UP-based methodologies"; + stripPrefix = 0; + sha512.run = "97028afebe70eefb0d2776abf4c7a311b1d78fb1aaf7e19f625337669ef0f085c17f9d88c76c4771085eb4a2ca1a05ec04078750fffb2904ceed8210f78be75b"; + sha512.doc = "1931a840502d230b991078f5c35fa4dc482bc57c488b8941a5cf7b09a9aa98c6a993fe508227bfdcd0a03c421d498e3b6a3d8af23a200563cfb420cba019712a"; + hasRunfiles = true; + license = [ "lgpl3" ]; + version = "20221004"; +}; +uppunctlm = { + revision = 42334; + shortdesc = "Always keep upright shape for some punctuation marks and Arabic numerals"; + stripPrefix = 0; + sha512.run = "522b68bd32887ba14ecd927c49c5fd57a84a1c0f9b8a0bfad65a4d377b68a7bd449754dd411a72fd83e5736e32e2c47cb1f54155f72395c465e4e09ad1d09dea"; + sha512.doc = "d0f67dba683a40a6392121cd53b58df6d7ec6ffd8bf52df60f53537fc1b389de178dfceb1e772dfc9e292cc543448dac3a85cc6b712283b384ccfec4655c988e"; + hasRunfiles = true; + license = [ "gfsl" ]; + version = "0.1"; +}; +upquote = { + revision = 26059; + shortdesc = "Show \"realistic\" quotes in verbatim"; + stripPrefix = 0; + sha512.run = "06360c313124487f291a8daf7399a3139cec8c0a05be12724cedb3d60393ecb07aa31e34f9b74a83048f5752a8d826505f91f2c85d34348264975b48a1813fab"; + sha512.doc = "4b92923e8af2dcd65e82269994c766b88c6f78f6e7b8d10b9f44889832150711acb0cbaf467d595d6745863f385569f7eeccb4ce69df8361e56910969532e314"; + sha512.source = "dcb227a6ebb481e9c4abb9f9ddacafda03ae4a445768a3a242c6dc3bc79f83e9e5f185db4d353916b4d50f5aefa9884bc52fbced79894e1c00cd7f40f0940884"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.3"; +}; +uptex = { + revision = 66381; + shortdesc = "Unicode version of pTeX"; + deps = [ + "cm" + "etex" + "hyphen-base" + "knuth-lib" + "plain" + "ptex-base" + "uptex-base" + "uptex-fonts" + ]; + formats = [ + { + name = "euptex"; + engine = "euptex"; + options = "*euptex.ini"; + patterns = [ "language.def" ]; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "uptex-base" "uptex-fonts" "etex" "ptex-base" ]; + } + { + name = "uptex"; + engine = "euptex"; + options = "uptex.ini"; + fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "uptex-base" "uptex-fonts" ]; + } + ]; + fontMaps = [ + "KanjiMap uptex-@jaEmbed@@jaVariant@.map" + "KanjiMap uptex-ko-@koEmbed@.map" + "KanjiMap uptex-sc-@scEmbed@.map" + "KanjiMap uptex-tc-@tcEmbed@.map" + ]; + sha512.run = "fea7d0156a1f8b8a66fc061d454c1318fe98e6c1a3c618fd9e31fda4246c7a55684df6e01b986d0c296a7a9458c3489af0e4bb2142341a95e5279da97668b4a1"; + sha512.doc = "edd326824f93b2e893ac9bc7b6f498178427477138c2e068a3cffddfef5ac658cfad2671454caa6c222bf165a2d4a16964fa67eed86c01342d119053f31a3fa3"; + hasManpages = true; + license = [ "free" ]; +}; +uptex-base = { + revision = 68298; + shortdesc = "Plain TeX formats and documents for upTeX"; + stripPrefix = 0; + sha512.run = "793b51b536fe43860fa096d590bb64cc079f089effaead0d97262d1476442fb6212d30fba092a207797fd6508bfa24c3c3ab448ce4d531700fd8cfb08e4e8c24"; + sha512.doc = "93332d9861526dba5c338bd14a20cb7e6e95aa6666417aa92dfa99200ea735d8ee0b61d8da1eb09c758b9b179f613c51a725abc997275905b3a832580302df51"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +uptex-fonts = { + revision = 68297; + shortdesc = "Fonts for use with upTeX"; + stripPrefix = 0; + sha512.run = "1802a5ff347ee4b9eabb93e4da5881a19b9861e3144009839d7779f61bf362dfa5be2a37b42b64041af7083ac756aaf788ad9a69cb4ba97887b21e78f6a794bf"; + sha512.doc = "5cfc4bbb9ba533d38bc52e5274c0cc42bca2a2cf6c3ddb623eb4f48c9a49275b2a6959311935fd3e1ca32ce775da6bf0c531542a49c31039c438000d1d15c8ab"; + hasRunfiles = true; + license = [ "bsd3" ]; +}; +uptex.binfiles = [ + "euptex" + "r-upmpost" + "upbibtex" + "updvitomp" + "updvitype" + "upmpost" + "uppltotf" + "uptex" + "uptftopl" + "wovp2ovf" +]; +upzhkinsoku = { + revision = 47354; + shortdesc = "Supplementary Chinese kinsoku for Unicode *pTeX"; + stripPrefix = 0; + sha512.run = "03dcf2b73ca644f8e9e2589082d49a4d502adb51944fcd9ee5cf737ae782611b35ef2eda4242b7eec2b8033014ddbbbea3abb52b1bfe90be9cc1634345223d53"; + sha512.doc = "d4c038d864b40603281f3186e21110ec96530e84a9ff88be4241cad165d09cd091b28bd768ca8ca0a28575dd850bb68ff88ab553cf9caaee6edd8d311c6fc9e2"; + hasRunfiles = true; + license = [ "knuth" ]; + version = "0.5"; +}; +urcls = { + revision = 49903; + shortdesc = "Beamer and scrlttr2 classes and styles for the University of Regensburg"; + stripPrefix = 0; + sha512.run = "5b8c80a756e45e5b847c3b970005b866f6c498eff7646155c73a9b86585dffd73e8dc66d91583dd691c910caccab60ee22a1e9dbe3aa450290fb17f019477172"; + sha512.doc = "40b8e4ea2abcc82acb843c692d90e964932f1ad7d0e818d54eeec77340f49686aafcf2fcf3f8f4d942f7cd967754ab24ee2075c6906862266f5af56251063fee"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +uri = { + revision = 48602; + shortdesc = "Hyperlinks for a wide range of URIs"; + stripPrefix = 0; + sha512.run = "402974f30df5a00118d4bd2e978f342cdcdb22119059dbd0c1b2111fd1ce94ab8a29ceff88672c80d18a669d5440bd48dfcd23fa07844f492e5f7e0eda1671a6"; + sha512.doc = "b2cc8cbcbc81f0c3db349952546e60c152044aae264d4b30aadb6b90b7aa5b304c89203b6219bb5161807bf1e4649235d2f98a60339a0cb93a588852a1755e00"; + sha512.source = "0206e0d2907f3976fd605d78284a44c909ff23f16ce9b2490556136099e56a374bd410e1c9bd5687bb791334612af1cc5a62a8b53f8c7876bf02d921c9868a68"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0b"; +}; +url = { + revision = 32528; + shortdesc = "Verbatim with URL-sensitive line breaks"; + stripPrefix = 0; + sha512.run = "164fb94cb128e997031bfdf8c602892d78813694f39f4b95bfead8a5b7e3cd9a0d9596dbe697e012bdf84b89c2551c2f2f1c7f99d4543e357edfaf2076b9cfba"; + sha512.doc = "65596e0ce813233491959ef161be8570450c6c71c787b3253d0bce503558e63902137a6d337ad1e7cd2499feacbba4a93b7b75559750d05d7898ff2527f1240c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4"; +}; +urlbst = { + revision = 65694; + shortdesc = "Web support for BibTeX"; + sha512.run = "25d5655fc01f98a1414aa962d8ad924464835aaed993e3bb5a749721034aacb559a4ca1590d353615734535ac91d31abf7b99004f6298525ac618f35bfcb0fd0"; + sha512.doc = "897c866ab03bdd5ab741537182788c5f484009681d6fb98f1149329068be707abae7ef012c0bd0170e2b4b673eaa63b46f5d0d55714015e8a451457f5a6c540c"; + sha512.source = "5bbad9719daeeb8c03e7db6ef956881994bc17d7ced9b45165ad45899a7230ea8c0ceeb23d209d36535d2081b6b611d46c19b1f0f03e8fbae1788f31ab09e7bd"; + hasRunfiles = true; + license = [ "gpl2Only" "lppl13c" ]; + version = "0.9.1"; +}; +urlbst.binfiles = [ + "urlbst" +]; +urwchancal = { + revision = 21701; + shortdesc = "Use URW's clone of Zapf Chancery as a maths alphabet"; + stripPrefix = 0; + sha512.run = "beb82950bda88e7170c7ad753e93859f96190f30e89fbfbe1cdbe37930b07740f70da40124639c6ab14be93fe79c5e87b35296b68c702888d3e9e25100e86a9c"; + sha512.doc = "8f218f76d45a2f3ea9be173ba1c6efcb8a7cff26a43149b7e0ef4fc535a4638cffe69358d8ccac44a3306044720958ea9189996e88a38d560d264f5fba6863ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +usebib = { + revision = 25969; + shortdesc = "A simple bibliography processor"; + stripPrefix = 0; + sha512.run = "94e0ded0c7e7ac10f2d8ff9324afcfdd2dad8247cf31cd6b404d9c2b12e223e6f435ec9d3dfad0ab510b943050444f5206788540a948e44f44c5d011596cd34d"; + sha512.doc = "3b489185729ac7d93ebbfd632b77eeb865b39043b2b68d920a6ef561ac55701a44d362b84c1fb83a2f59770442a655b779c6e49287c9d2859c44140e61c543e6"; + sha512.source = "a0c64ad5a7479da4906b848a31ceb02b047a98e8e2c505ee748f2eed4ba27dc8b6d89d8ee3a171566417315cc2b83810f514f1a0c11f1bd4a28b57cca03676df"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0a"; +}; +useclass = { + revision = 70447; + shortdesc = "Load classes as packages"; + stripPrefix = 0; + sha512.run = "d1343768b6e6f89a31c437983db7d2cf2e52eff35054604719b08c5ac9ce9ce936982ce7885010e8f4929208a944746e07f28090099eec3ac3955bbf6805c396"; + sha512.doc = "9904c849d24426fb3139d92a0a502af362e12bd8d7d993da422a0e5a0ac0984d3a6f8504d0fdf88e170244877300efa1b366ad11e2683db75edd6c7fdc8b2a1e"; + sha512.source = "c9e2083c974e78991310afa76d9b49ea5fb8bee62057aef1dd0f92fe1e26628b4bf0fb7e0dbb1d3dc734c307b8b6cf536d38e0b68ce825ce5b7605e0b74d76f2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ushort = { + revision = 32261; + shortdesc = "Shorter (and longer) underlines and underbars"; + stripPrefix = 0; + sha512.run = "2ece6efb162a13c37413e4fe2eed33ab7982d681fcd9435ce53248dc4c573cd90ac51293424385aac29b84159b34fb3f7fde2bc8d39eacc71f0ecc91c8db7af8"; + sha512.doc = "d262bb270e41cb7d9378d42ec075a81158d401b737acc7788722ea7e99d896de1eb98c04a65e733d6e83f6229a9703f72bfd0a11e36e52d4799e82e19c102d5b"; + sha512.source = "a26cdd79055b74cf30202c162fb38243571ce2bac990ea44a0eecaff407951aebd5ff4619cafa6190ef8ba6101d86a800262ad1b09972dbf7b207398b82da672"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.2"; +}; +uspace = { + revision = 63123; + shortdesc = "Giving meaning to various Unicode space characters"; + stripPrefix = 0; + sha512.run = "cb830007a35024a6fb7817f186fd0c02270c1cc639240f2077b10193e411f207ecb744281540dd6cfb1cd830424d9a5256fc7cf5a315adcab082b6f69e7da1d9"; + sha512.doc = "894c14ae766ada6c0eec7b3d5a2c64931a011560057fa3732eb32de0bfabb6cfedcc27d73235dfe8616e9e6403cef563880bbb66f2ec2a1244da95c92fd2002c"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.05"; +}; +uspatent = { + revision = 27744; + shortdesc = "U.S. Patent Application Tools for LaTeX and LyX"; + stripPrefix = 0; + sha512.run = "fbcce7a06cc018dfba47aa7e9d572003136d5b179e957f10e2bb42b2635ef4cdd40bbef19e8f827963d048eadb23a1aeedcebc87cf128f5b28cb1ab281408b90"; + sha512.doc = "e0eafb5fadeab38da049d0d5cbadc8fa3dc3c335afe4fd5289fe30de38f0898cdd9dee091b703f6a853eba56b32b161abfe56b3185c71512c9374585e6d9784d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +ut-thesis = { + revision = 65767; + shortdesc = "University of Toronto thesis style"; + stripPrefix = 0; + sha512.run = "a5a9c3028582fd2c379f00adb5d6abc650d0d89c3a802726c6e4c0e86f9083c445a9a431bec9be956ef242a0b3051f32eb5b63387e2fa380961195cca8d3832a"; + sha512.doc = "d1e28a7d927620e259caee4c4affa8af9aad67089a0886f098ff85d96bfa473863aa4c9f6ef225629fe3c97b7505a9bb73802ef861c4198002ae1af4456b1cbc"; + sha512.source = "0ed214fa702923f6a9599bcbadd0e670545d308c32502ffeb4381e64d2f5aec4cba6b74f44e208789d9626d160b111409b5b70c46b3bd9d311d9294a4b57df80"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1.7"; +}; +utexasthesis = { + revision = 48648; + shortdesc = "University of Texas at Austin graduate thesis style"; + stripPrefix = 0; + sha512.run = "829826bbc06bbd9b8ffe585705856bbe4bc99973bad7bedd489ff23fad9cc19c4f33beb88756644d76945126983586fdf78eabb305e353cb8bde8341a3d20fc4"; + sha512.doc = "65e3100a6acd2a02df2e95834e5e99d718cd0b73e20ef6da839cbc9831918f63a2f5b38ad888a5068b1fd87ad71ac480754d5e6b459465cbb6238d4a3b3c09b1"; + hasRunfiles = true; + license = [ "cc0" ]; + version = "1.0"; +}; +utf8add = { + revision = 61074; + shortdesc = "Additional support for UTF-8 encoded LaTeX input"; + stripPrefix = 0; + sha512.run = "988d720d5f4dac3d15e7483e1ce904f214055407c41c19ee7c2683db592ef870cc9a87d28f47092cd062b5ac5bd061b68738046dcea919b0aa9573b0c31a04c3"; + sha512.doc = "c1f41ca0ea536db11e2e6c1df561e74f8bc51da3147410f7f33863d0be1d38948bcb64d0f4d8c41737278435d2f88b8ad758d2c48f1672b682169de5e0099b70"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; +}; +utf8mex = { + revision = 15878; + shortdesc = "Tools to produce formats that read Polish language input"; + stripPrefix = 0; + sha512.run = "0cd4c549c7b00939dec5055705658f76f6ebbe5de70e082652b761673ba5a249924fb862a319512a9a124b9cdaae8906c74439bba97be8825d4d1ffc70642c8f"; + sha512.doc = "cd438089d90faa0e9144d23adb78ce91d85b80ce084cb92511cc23882c675cb654cb704aebeb623bb29c70b764c8a0ab19915607664895c457c583f376c1088e"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +utfsym = { + revision = 63076; + shortdesc = "Provides various Unicode symbols"; + stripPrefix = 0; + sha512.run = "66dd74f22a26022eb13ff7a8807612d33a978070f86ee5e0eecd9b957684150985e6bd6bdb81c8917781926a0e8c13f9310aec36e12b0a896a353194f0a900b2"; + sha512.doc = "a70bd657812f64e79f028efb591888863ba5bbc0d7f16a9c70fc1614d21c0fab9d4de2545288b12c7d6c885f489b5b0062e739e531595b8673bdd4a7e1da653b"; + hasRunfiles = true; + license = [ "cc0" ]; + version = "0.9.0"; +}; +utopia = { + revision = 15878; + shortdesc = "Adobe Utopia fonts"; + stripPrefix = 0; + sha512.run = "5f58ac6dacaddf4110b2ac2f77fc0da90d5cfdff26d888b26af06cd6dd8f483c7a6a12e0aab3f50d4188aab9ab649d993ad89e74898d54c14b3de4948451279b"; + sha512.doc = "ba60eaf55cc08378560048ebc6f735e743449a18d2822e6027a86e595a9634461713ceb37d15b9f0c8239f1935f910bbdbd9a0d0d6fa1683174739f91c16a504"; + hasRunfiles = true; + license = [ "free" ]; +}; +uvaletter = { + revision = 66712; + shortdesc = "Unofficial letterhead template for the University of Amsterdam"; + stripPrefix = 0; + sha512.run = "df759bb1a8acc3a770d9c4f2753c7968ec2a4bcdb2f8d68cd97e25e36a1a72e4ff5d16da3ce69059679eecb10d5de56464297159c7d3b0b8e16684b5cb97108d"; + sha512.doc = "d5e076da3feb4904b0af7b6be1db59c2454784f5d9679f6f6cbde3cabde6b70b075d83126313f5938dd9d153344986a6e8b574e540b39c4fba82d513e2d61b61"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.1.1"; +}; +uwa-colours = { + revision = 60443; + shortdesc = "The colour palette of The University of Western Australia"; + stripPrefix = 0; + sha512.run = "c2ec752b4cbf80f35787db83a0d227306689b1ba9bee6339bb6c2940fd938ce33daa995bbad2c58ed9284143ad3f45aed6668dff88134878cf115968c6820a3c"; + sha512.doc = "42745187e02211f149c74c82e0046f42eb5c1c6b01c39fcc8f0a52ae50613646b216355f29d0af0b6536558c2689b2eb83f31c84d29bc007de4c8f9d78ea6d43"; + sha512.source = "e03bbb8bf8f7684c02623d9f46187cd0b4ba282b1971679927b633ad2b987748c3f784caa6eb01054422f91f2703e2733dca0bdf2c89902ef61321875e2e96a9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.0"; +}; +uwa-letterhead = { + revision = 64491; + shortdesc = "The letterhead of the University of Western Australia"; + stripPrefix = 0; + sha512.run = "f9e4b88e01528992956abffcadc5614ea0a250283b0bc87709e228fdc394b58600c7cd41d4c9d944a6cddb66b9a23b8ad3473f37de8cb566aaca218d348fcce3"; + sha512.doc = "63a53dbd15700956d199ec147ccdf5c84e821e2a19ff46209f869a5656055fa9e4654746cb7f89b7cca1a3927c64715008846d87d85c8ffe6c269056b0d7a6c1"; + sha512.source = "c86680643bbf04636e3a2cc581ddaa457d48a6dd7d5a7344480a1b1340b27f3fc23657422d5ec44200ce9fed77d1f705b85fee5ae4cf195481eb8c57fb96729e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +uwa-pcf = { + revision = 64491; + shortdesc = "A Participant Consent Form (PCF) for a human research protocol at the University of Western Australia"; + stripPrefix = 0; + sha512.run = "290e29b50c9842d87479c3ace96368ada1c0561e12b6c09d8b562a134a935511bca6ea177ec863e0c57339b90177f09a5305d41f741b821a621ef2a80af32aae"; + sha512.doc = "22268ddb91b0490a9df9805803c831ff1f4259311b1fe02103658d6da69b0ec474bcb3b7b918aad23a365c343e1bab3124927d36c86d06bf3e91e021d8a9bbe4"; + sha512.source = "cabcde080b1409d27212c2a9e00432a19c68b6af3a8304695a47311ff83745d22612c0bb967f58485e9d030700df47b97425627b2f2e2365bb57c6ac0fe33884"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +uwa-pif = { + revision = 64491; + shortdesc = "A Participant Information Form (PIF) for a human research protocol at the University of Western Australia"; + stripPrefix = 0; + sha512.run = "d16d72cece1e8d98495066ba0b55dbdb51ab4909cad1b99d9d11534dcf1c57bd3b7ebfef27b2825ca24bb0e19bf4b8a6e9a1bb3b28fff061377e90c8c0afb52f"; + sha512.doc = "d14e8f6cb0aea97df72cd801e474f7062411a15e31294a032d6e0d33f084f0edcde6b1e7d0319abfe0881de9dfaabfe89fa444f6e846f1a27916e8377358c310"; + sha512.source = "27c47feaa89b3820824761d67d56a0f99033fb42d987b807b29624448c6f61dd7383eb16b3cebc23f899fc718e62767a567a914bdec3bf012570a8ca6cd0faaa"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.1"; +}; +uwmslide = { + revision = 27354; + shortdesc = "Slides with a simple Power Point like appearance"; + stripPrefix = 0; + sha512.run = "a4ee1019a36a66abb6614dcf6ffdd9706b705bd18a19d34fcedba441c355ce3a7573ea0ee53686b325c6d6b485fef99dd1254118d1cdd1603e1597b0fa17b751"; + sha512.doc = "7560c214913e9dc61d01ba8528e1bc147a4f261995294c8c938ffd853a9b6a174c1d1d47e49fa20351ea45d61dca03ef7f0ff085e8725820c24d2895a0d17530"; + hasRunfiles = true; + license = [ "artistic1-cl8" ]; +}; +uwthesis = { + revision = 15878; + shortdesc = "University of Washington thesis class"; + stripPrefix = 0; + sha512.run = "07bb8a3ab65110aef8de3b606ca53060dc8f29c76de55a5a84e87d43fe0e09dd16b48ec09b9a451f2285c06450ad059c4c3f9b8d48a21572a1bffbe2ee512a6c"; + sha512.doc = "278a7ce5f0bab547de0c8dd4a26dc270500baf8abfca1ff1a8e76283fffff4a73835fbb1daea2f6864cb9dca3e0fff297887ab10305c6a87ea1d7384d964a9d5"; + hasRunfiles = true; + license = [ "asl20" ]; + version = "6.13"; +}; +vak = { + revision = 23431; + shortdesc = "BibTeX style for Russian Theses, books, etc"; + stripPrefix = 0; + sha512.run = "b7606cf33b8e9d14f4ca4cced0620810eecc469faba959728d3b4d7f8d87023d600fb33f1739ce0e7d14d4a54936fbc682a54d8ad8c6b514a1f2baed2c79b2f1"; + sha512.doc = "1e6f148de79c2ecb5fcd03ff1509c3a509ee40795af0e7f7a95fdc64c403f2de7f9d9ca37716b6488cd496e2be0565749222ae95f8b97e5cf7e05b3877bb6d62"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +vancouver = { + revision = 59192; + shortdesc = "Bibliographic style file for Biomedical Journals"; + stripPrefix = 0; + sha512.run = "9fd38e4545902a8f715e2912ce2046a679476f0a91ee76af74213b65689c4e2c01aa68ea8fdb09d93442097695443a2be0d6169dd50fc8ec63a7f9fe424ea739"; + sha512.doc = "4bb074a9ae48d6e565b1b60dfcdec4b6fe35e367639c3737e68e4cdeb9ed9017b17d57ebe895865b6b0f63bb7d66df5af08360d149aa5f2f7c604bf90faa9859"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +variablelm = { + revision = 60014; + shortdesc = "Font definitions for the variable Latin Modern fonts"; + stripPrefix = 0; + sha512.run = "1c34d4afa65db4993f3098cb32b604c68a75bc2c0b56b026a6d50c2de61392d4bace210dab2fb5ca0c15253e7486406aa3aa5084e2296bd5e8f1e9c953419627"; + sha512.doc = "56bbeff2f9cb4a99c05416d7fae7cea8cef81e712092ae8b5d1ca644769debdd95c443fb6af7edc034fe9d778147e1b37da50d951278a7f64c407dead5f6e7cb"; + hasRunfiles = true; + license = [ "gfl" ]; + version = "1.2"; +}; +variations = { + revision = 15878; + shortdesc = "Typeset tables of variations of functions"; + stripPrefix = 0; + sha512.run = "71252475aec013adf9bf41460753a648420ea70fb093cadc667500a6884adcf0c6661a2d81053a733844a3f8595ccffb5ac5f7680689575d8485c47a1cc1e469"; + sha512.doc = "75d6d8afd13f6751bad23d0adc58355d75e355554dd95971dc16ac148150990e1362ec211a3f3e6fd832ce231dbd08e50ed9d44856c763e47ddb5374b1b182ff"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "0.3"; +}; +varindex = { + revision = 32262; + shortdesc = "Luxury frontend to the \index command"; + stripPrefix = 0; + sha512.run = "fb7216b4cb06126970148788859d9c12a0626d25321cc591b2db5d7018ab2a76f5c6505d9cd47da6a3babc765dcedb6653a3ead2eea67f688cd883fe81d9f42a"; + sha512.doc = "30b9f50b7357f12774f78f0792ee0321b5ba84d2c3dff96f5f98d87cf0bb811a2fee74b2bc691fef07a80eb65e13e42b657b74efb0ee334b4f04da7bfdd0b75e"; + sha512.source = "19571ec2000fb99ac8e1b188e2f6965748c78476bb3fb2d38c2f668b02d268817c6f2670b9bd51df48c2db8fca1e6f62ac738f378a6832368c74de297f19b679"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3"; +}; +varisize = { + revision = 15878; + shortdesc = "Change font size in Plain TeX"; + stripPrefix = 0; + sha512.run = "c1a900aa29601e9bcc5d1047ea5bca0bd3c079d05e8c42c8e3f85521cd8a1989425650d0e84ab0acf2a38e468bc4823e149cf1e799da8eea1d6af4554cbc0c94"; + sha512.doc = "f575e4faff4a80f72108ef5b97abb0bda08573669bb8b28592fa607538c632d3b59626282a0ff8d7805e6b66121b2c231618901a9dd71f0242e1a0875a3e2068"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +varsfromjobname = { + revision = 44154; + shortdesc = "Extract variables from the name of the LaTeX file"; + stripPrefix = 0; + sha512.run = "0d5fb07c93fdd08570ef1dfa120870f4619b124cde769f48b4107c41827dd65c023840e1344aa283d0b21bfb0af2346135577510119579c531731f132bbfee1a"; + sha512.doc = "57e3111b8426ace2a838a128dae49a6ffadc6892e4b85cfc83eae3b9422dc4188e505fcb2a281ff38cbeb18e385ba1da398111c5f00683568999004ffd5eaea7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +varwidth = { + revision = 24104; + shortdesc = "A variable-width minipage"; + stripPrefix = 0; + sha512.run = "d44fcd1912f1751ab18f5d7d00ed47f42bed3ad2863b35781a83df9c881943c3e1916d003361b6e64640326541f43a37abdb0a3cdfe07e4d0cf7980dfc5fe1bb"; + sha512.doc = "ba0c0d562a7c9db36637bb18fa6f0d01661b229c66b8f0d2bd7cbafe286b81485e84bcccd06c4d47561db8895cf8933ff11d08a8de0b01405d6c7dde443e86e6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.92"; +}; +vaucanson-g = { + revision = 15878; + shortdesc = "PSTricks macros for drawing automata"; + stripPrefix = 0; + sha512.run = "e4bf83ea01ff4162f95dd595b93635ed988ae081d0c65ada59ae64c6c64c730dbb92ae049d22dcc20d6204c5a7cbca5cd643be6c572e51a3aa17df88c6f1f700"; + sha512.doc = "520aabba38562e208b464fc0d4e9f9a138c238abb94b43e89864e4ac21acfd35e5d6e224e855ab4baf9feb1df736b7e937508f6245e5f873c5c8f8a75947e014"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +vcell = { + revision = 59039; + shortdesc = "Vertical alignment of content inside table cells"; + stripPrefix = 0; + sha512.run = "39d8f934a07095d21219d58fb41fd3e939391d5c68c51d8b9ec82a97522e55fc09a23195c8b5ae48cc3e9d9bb9a62a0b22123f467627784c767321140356d6b1"; + sha512.doc = "f13e941e7327f4369112f59387cae9c49f10197a2c7c4016cbcc5880759d89fe88535266f5f753b48b547deda24a3ad959b42f864b9ca2764cd593bacbf908b4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.2"; +}; +vdmlisting = { + revision = 56905; + shortdesc = "Typesetting VDM in ASCII syntax"; + stripPrefix = 0; + sha512.run = "4c4b5deda36fab8ac8cadfea2093da188284cb26eb9874f27ffbedab1235d4e7bdf48e977a714fb33f0ef2c5cf4c0b92c14767c565efa6842cabf451af51c1de"; + sha512.doc = "fcd476e8ae2db61e3a71b1dd4bffae34e6eedaa409dc3434179ca66bafa2dc4b5790bd06bf90db609f91c682d2b7bf9d5effa893e5fb914c26c20acf67f8b22a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +vectorlogos = { + revision = 69010; + shortdesc = "Vectorial logos (GeoGebra, Emacs, Scratch, ...) with 'inline' support"; + stripPrefix = 0; + sha512.run = "cf9232e47bd3deacea13e858f4b85b45000d09f1df7fdc09bd84ed2f30de669b5d79d048a97d9aed05ccbe4ab65977becdae35b1bcbb2bb5efd2c874d7d71d22"; + sha512.doc = "21725294c097268bf0403c9cd7cfca5a8e9541cd6829ab65c561ed4ce6e111943000e0bae54aac328262524bd19ba75e90979660948631103b4a97e4ca63930e"; + hasRunfiles = true; + license = [ "lppl13c" "cc-by-30" "cc-by-40" "free" ]; + version = "0.1.2"; +}; +velthuis = { + revision = 66186; + shortdesc = "Typeset Devanagari"; + deps = [ + "xetex-devanagari" + ]; + fontMaps = [ + "MixedMap dvng.map" + ]; + sha512.run = "b7901813517790a92a921b1202c39a058d53a4159634cae79960ec7ce2da08acb757b307b5066ab1251e4b460234fd9dd98c2e404c05fc6384c656472302e3ec"; + sha512.doc = "06a9330410b55052759e18efa8720ef65f0f3dc8a2f15d3c0a0c8f70edaf8de65eeef8ec10a9a376b4b285b1c8f619278f68e9a2bd7ba1622da72b6ff488f8f7"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.17.1"; +}; +velthuis.binfiles = [ + "devnag" +]; +venn = { + revision = 15878; + shortdesc = "Creating Venn diagrams with MetaPost"; + stripPrefix = 0; + sha512.run = "617ba85e996943d62a33acb2535e23700fffc63331741065faee558bebde608232a31bd73aa79ad707b107a9adda8b454f9b81dee184a64d94f32c44d76180c0"; + sha512.doc = "0b1940cdc2bcbb7e2f103497622c4d5971abf4f6f4885f60b35a360cd655c34cd789ecbfbef9d35c61611ef22198200b11008f4f59588a5cd111870b77ba19d5"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +venndiagram = { + revision = 47952; + shortdesc = "Creating Venn diagrams with TikZ"; + stripPrefix = 0; + sha512.run = "cf57b84165067234f5be58b2300eebb77339c33b883895e47cffdbc7c4acb6d013db7ace1eb47ef491e21526cea8b3ab993fac836498bfa16a5cea700caedd5b"; + sha512.doc = "966f7eea0d4c40004b9710c53fdd6838b757a2c8ed47b4098ca2d47834ba52575ac7c062497f1a6d26dadfcf0d7f95f2213d34bc638262520aade0e78beac827"; + sha512.source = "16bfa22856952e9c0595532432eb774a2ef44f52950002db670e5f3e22af02981305ed5eda1265b6d1a97f43d9a6292311bad5268a562aff6ab00f4a14a058f7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +venturisadf = { + revision = 19444; + shortdesc = "Venturis ADF fonts collection"; + stripPrefix = 0; + fontMaps = [ + "Map yv1.map" + "Map yv2.map" + "Map yv3.map" + "Map yvo.map" + "Map yvt.map" + ]; + sha512.run = "0f6b7369c1d589f9725897182f854f008b73dbda47078285635e87d480011bea0610da81512416b0963aa55487d646cd2a957002552ef2b8609d4536c0dd96bf"; + sha512.doc = "b46066744794a8ae1443b18bf1f6ce3d586c8ee8fa5c3273db608751979089b2407a6feab421a3c3c738a682e83e2f44bc5ac86eef1d51fa914ed0f0df985bcb"; + sha512.source = "2deac2b1cd151e41ea604d99209174b28de33d9f9358353b7d8b120c8e3cf45552947497e6d54cdf4024f5a071c39246221fd25cbca09cee7984755036993a40"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.005"; +}; +verbasef = { + revision = 21922; + shortdesc = "VERBatim Automatic Splitting of External Files"; + stripPrefix = 0; + sha512.run = "483a75883ea602f674abec796199c5206420079c6ad5e4c3ac22bd836e7ce02f686cc8b9b749f806fe8e44bce8bd35fc6b17865fc076c72f2223143ee0e8a123"; + sha512.doc = "c88b1275eb4e3b87172e6cd157ad868b7b230d96d00ca0dc550757fdb89648a40b1090b771dcd0776b6f86a9194c553f265d990220348e5bbf9c7aa792f42914"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "1.1"; +}; +verbatimbox = { + revision = 67865; + shortdesc = "Deposit verbatim text in a box"; + stripPrefix = 0; + sha512.run = "a2520d96ed713f3e82135395c7437f1bdce04f539ca924feb1468af6a9afb9a2707edba554f073175bf01d279576d7f3b96cd8a69ff7cd6b82f6fd9dde537f3e"; + sha512.doc = "c9c4a8a720a9dd1381a128480312ee416e6332d7bb4cd6f59c3f3c13f2c4ba5e9445f5659ff4b64cb40059fb117ce79b27b62c07b70a81ad7e3fe987f7dbbc41"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.2"; +}; +verbatimcopy = { + revision = 15878; + shortdesc = "Make copies of text documents from within LaTeX"; + stripPrefix = 0; + sha512.run = "e415f9d74f35e28c73bec5442124b7c426aff8de013aa8a2af9c234ae3ea20c131d5ad21803c92eaaf6d0aef6584b7f9b83218f9665a959ec0d6ba3ef606b081"; + sha512.doc = "0281da688f11d2a2fefc053d8f7866878b337ee85114c551176d6c329009f8c1a8479ccb29f202106f745ba215728e7f08509898182521bcac433699e22843a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.06"; +}; +verbdef = { + revision = 17177; + shortdesc = "Define commands which expand to verbatim text"; + stripPrefix = 0; + sha512.run = "f6bcac8b35bfe707d4e39cf625987ddee6197977894e9f8ded9e3a715e0968d2d1fab07c57edf1d38150ae0c9cfc937230c9fccec431e73ae235a4cd44ed8609"; + sha512.doc = "e64d4bf3018de72a131e7688ebbfcbaa59914c0542d2c632a91097a77f404307f9bdfc613638badb3ccca3854313f17a7a5bfb6426f467bcc98ed235af6ba49c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +verbments = { + revision = 23670; + shortdesc = "Syntax highlighting of source code in LaTeX documents"; + stripPrefix = 0; + sha512.run = "7b5780efe1b6e4cc62909df5d5cd4a03be3dc83717f20738a83f37f539103ad12e382c0a3891b8e81b44086f92b7277b17e88c4e7d81123c04941c38114f23c8"; + sha512.doc = "744471659373efbe040bd0698a9b33a0942d5df33312ad3cdd0f02c0e16fd2c67ea44c4ab13ce83ddca6a5e8ca68c8c8bc40c1a64470a9716511e2275683b004"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.2"; +}; +verifica = { + revision = 56625; + shortdesc = "Typeset (Italian high school) exercises"; + stripPrefix = 0; + sha512.run = "8c3258fdf2040e00495b56605f88160b5179743a7ae3abc6334e734ba9f1fb122bf2e4847fd9a577c1221c9e22dcfa650f15612d7a005b3719ce6c92df180bb3"; + sha512.doc = "de41df53ca78cabf7ab3f672dd00c0042cfd8a71219d694985c18aeffa045dcd37c7b999058d7edf6a2348d83c9ae27d1e242f17a91d43b61f2b873ee2d157ef"; + sha512.source = "85e46be6f8ee729753362243492c7946166049ebd0a89f0871bb9308e6803f5ef9416c30fe380be4961aa466a03afd9541d09e5920a196550582d326a6de8b9f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +verifiche = { + revision = 69726; + shortdesc = "A LaTeX package to typeset (Italian) high school tests"; + stripPrefix = 0; + sha512.run = "6201051c81c5a002423d3a9959e847223350c83ff03dca7792a727f2ff7f0405d20d2499827f5e96ea8e1f2e7855b887b0c2b35180ea2153a5c2126d36e21410"; + sha512.doc = "dfc3fc5a5bc8ccede3bb487a17941ac6e28879c03ea9e398475c058aae07230e2831bc9dae3195effd331abe79eb5f6ea8962da85a9775273810da80d8ada70d"; + sha512.source = "f46df8dc9759ced453752b53003d9377748346f8fbc02ea07a61b8ea44fc51eb6d0290c9b1a940ef74cf1999ec5597794237e0b28bb28b80c331b19c0defc14f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "7.1"; +}; +verifycommand = { + revision = 69389; + shortdesc = "Verifies definitions are unchanged, such as before patching"; + stripPrefix = 0; + sha512.run = "c977f40e851a47dbb329e96df9ac528aa9a2419bbcf34470af1110751365e219aefb36c6d630022b8d57949ea904e12dbb560329c526b3e35bd101c1032e38ff"; + sha512.doc = "69431fb242574e7ee11200904483eaa1a52f5c621d5c7c6511649a80c71d06a5527dfaefb90a74929b81b0cb2559ac136e1f6fe7321689a296a040f6362e35f2"; + sha512.source = "8ef472771c5719e2473702f1a871ceb3512bcf557427e31a5c508701a72e813e6390fee4758f5cd059e27040c55fc5e9a9e094911d82c10d57351d26f851efae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +verse = { + revision = 69882; + shortdesc = "Aids for typesetting simple verse"; + stripPrefix = 0; + sha512.run = "cc76ff256e4e388e0385c4a5152db537b9c3b368a29de79fedc17395d9d3b362c6e3af05a5714d7d2fee68f129cbdfe82874eaf64c8e0093f70dd796e8c381b5"; + sha512.doc = "5c1c29d0008c800bd967445ec3efbe2e8c1ee8d39d4373173f88c75fd3e8454409302308a08be84c69dda9c679ac25c6a411416c247fd44cd9cb23fee6b80f7c"; + sha512.source = "ce95d8664bac0580b761c503497d675763f8efb8e5ec066ce392f9d8e7cee44fb4071a1d2dbca394afdd318aa347ab9c229f120aaa65452f8d0f19069004e766"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4c"; +}; +version = { + revision = 21920; + shortdesc = "Conditionally include text"; + stripPrefix = 0; + sha512.run = "9b57997e63fab25d916630bb086b7d4372e094e64175caa761c20c3c2d426a58fdc42ef661bbc1ec47f2a8d9c617b7e4dc405499c01b84eb53ca0d10f6c9108d"; + sha512.doc = "9bada1489523eccc809d4b9654411addf31f2d63efc1f1f9d68b81e2bb3d9365e2709f55a77c53c3d2231b8da89114bd5a4217c8d18553234a980d379b1a0084"; + hasRunfiles = true; + license = [ "free" ]; + version = "2.0"; +}; +versions = { + revision = 21921; + shortdesc = "Optionally omit pieces of text"; + stripPrefix = 0; + sha512.run = "4a6474f6a014789daae358c5b73a85bcb0894eb67d09a530f3bdd8e4571552d0a3e1983b5ba40d33122caad8bd457f255b7f1bb34e9797c5137ccf461707dbbc"; + sha512.doc = "ffebda27a9000a0c8bd8462b750e34331968aa1abd5c7039e198950eac6dc02796da6a02a258bcfcd84ca12b3d5f6d0ab11587bb5d6fa9b3121297aec2179ccb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.55"; +}; +versonotes = { + revision = 69249; + shortdesc = "Display brief notes on verso pages"; + stripPrefix = 0; + sha512.run = "c430ad5138ec17c4a5a12bb42149bf260b582f2a8b3c9fcb15356c3ed87073b68063df1ce8d821c456c0ed0e154137a2e3ed54b83b49a859a08dc1134dc6b559"; + sha512.doc = "3e4047566d0eb6ade7e78dc0ace0f540b56a6bcb157f613f6af0f7fe5c8ff9e47e526d68ec11b94f9e7ef3bce8fbbd26fc8c3ea115b2d1454e750ce7e15641ff"; + sha512.source = "f986404efc03af8b3a58f07aefdcc678e0f4b37ce25f8772e145e08bacb1ebf330361d56bbe5710611d09b01d31b82e9c736c1a7419a0dc56f0fce3a5c797136"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +vertbars = { + revision = 49429; + shortdesc = "Mark vertical rules in margin of text"; + stripPrefix = 0; + sha512.run = "3c3c905c6bcb013a36bc2eede14d84315f49075ab5f63376e9a440e4e7fb281ee5086b5bf1953782641284027dd8e7058e0accdafdc9295a19ebfc0088d8f7e1"; + sha512.doc = "de6df3133c801e941cbb00c552cb2cdb1d556f099c402a0a66f460d5c7c1c6e28ec7d983563f20a609a5b5266420dcf8c204d1b6bc685031cc41fe2770a5ea13"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0c"; +}; +vgrid = { + revision = 32457; + shortdesc = "Overlay a grid on the printed page"; + stripPrefix = 0; + sha512.run = "ee46d8ae234af6f0b3bc8689cceab7d5ce8e7229b132c396a000cca15cde0ee422f91b2d4fc485c743e3a896bbab5ec90b24ea5d398bf63342751bf75143330a"; + sha512.doc = "92e5498cea29d5fc1b373619e97c6692fef3f63002757a954649c0c4f9ef7b6594d61cce017bee709f0f1898777f962c25053b64da8079c8c9c9893f821a9aa6"; + sha512.source = "5589904860a74979a070224b252be9b302e0f7128946624fb671e8618a2afc55c526631217348eaf84d7c0f827dfef7aac7a13a953e1ff82a61211eb2e070e36"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +vhistory = { + revision = 61719; + shortdesc = "Support for creating a change log"; + stripPrefix = 0; + sha512.run = "1e8bc961ce70a199403f548bc918efbfff57ae6514338d32928a670f1f381ccd0474f3e2e4bcb957e72ae0b74b959f9eb98b552e62dfdbcbea995549bd87ca70"; + sha512.doc = "25420975890dbeae7b322ed9769eecdc67b9271f36e3269b6dae582af19968b79593ccc0306486de5d9c277be752569591953b423c52f8aab396430331c61e27"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.8.0"; +}; +visualfaq = { + revision = 61719; + shortdesc = "A Visual LaTeX FAQ"; + stripPrefix = 0; + sha512.run = "e746106e0525c9d40c3600e283e1b652d2a5e4e99381dd7ce88ff2ded109024d86610b6305fdcc6f06220802c7ce565b3e01f9562c00884fe5e161104ad4f8ed"; + sha512.doc = "cd8f11ebec1eda30ba7b673fe6fd241e61c4ef42a769988d34e58546f608af6a4ea569b2a30957dec0463385c5a4df70f7d10bc6e5b898229c5e6cf46f7e4fca"; + license = [ "lppl13c" ]; +}; +visualfaq-fr = { + revision = 67718; + shortdesc = "FAQ LaTeX visuelle francophone"; + stripPrefix = 0; + sha512.run = "06a9f22c86f54883ce55b23ba81315e53afed4f7ed2b77d13a8958bc18e5a96cae849a327126843865b6ecd55d7153cf261ab784625b9a848e7dc661df95fbb8"; + sha512.doc = "8d18a3712c42eb7921d6e0e7d29ac96c4718386643bf967b3c428fe5846830dbaca382822ae3d23523dda2e4c7d5f0d96c137412c2302f5e634471d83fdc4547"; + license = [ "lppl13c" ]; +}; +visualpstricks = { + revision = 39799; + shortdesc = "Visual help for PSTricks based on images with minimum text"; + stripPrefix = 0; + sha512.run = "fa501a3ed6506fe52d3d31515f453db5378c7d01415ed05c0870ea15051d34dc5a564ab8ef2ef4608f616b657ecf29f5b18a8920bdf1606f78928fc505cfb0d1"; + sha512.doc = "3d2dfea937b2b99e148fb0220067b9a777126854d82cd1e591f84a1d13e1090755660509814e4690dad20d2568286ce05653d3b5c7c6653df61d27229c9cd5e2"; + license = [ "gpl1Only" ]; + version = "2.3"; +}; +visualtikz = { + revision = 54080; + shortdesc = "Visual help for TikZ based on images with minimum text"; + stripPrefix = 0; + sha512.run = "fbd3f158e72dd8b0ebd3fe9c33fe47127ecfd38bc0feac3312d569718672e9f88165856fa61389b307a211071467c10ef73981178cc9afd8ecd720cdf627dc1b"; + sha512.doc = "16a32e64ef4d00d2bf6f99fa05b35a071539d71944227eaa5b37762e838a62b80ee4b227a8bb9cc49b831bf19976421684872f8eb104f37365669907e9621a6b"; + license = [ "lppl13c" ]; + version = "0.65"; +}; +vlna = { + revision = 66186; + shortdesc = "add ~ after non-syllabic preposition, for Czech/Slovak"; + sha512.run = "6c66717442bca3306e23f5d546e17929240ce9626a562b9e56512446998996d38f83f78fbb39e46bde0b9faf0db7eb0c0218c79e1d66711d6cd3c64a8778edec"; + sha512.doc = "921d76535cbe7e940617355c74b82acfc61edb840db8ed9cae1aaf987fe6b83245505048c7c550d59829b204f139ae1cfd44601435e2fff2b0d5230b45a27b77"; + hasManpages = true; +}; +vlna.binfiles = [ + "vlna" +]; +vmargin = { + revision = 15878; + shortdesc = "Set various page dimensions"; + stripPrefix = 0; + sha512.run = "dc0cdd4696a44bb6bd189dcf73c69f1b2c8790b9936b1c6f35013d9342a97d36a4bfd8eab82f3e2e97f1cc952459cd9a1909915348b25f01df446c5ffc452e71"; + sha512.doc = "ca8ebc274efacbe192b73c9551294bfae60b0cf7ebaac8425cf1b88e10ecda7f3230c336883afc438349f1ea47d66d369b52bb415c482803fb742b16cb483348"; + sha512.source = "0ad7482be9aef59f55b1a489327c03e9d9560f10c984a0f244aa836ef12086dca2d834c033a36bc95233d6de9b801ac483d2dbf472f33e9478c5182d06a86cb6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.5"; +}; +vntex = { + revision = 62837; + shortdesc = "Support for Vietnamese"; + stripPrefix = 0; + fontMaps = [ + "Map arevvn.map" + "Map chartervn.map" + "Map cmbrightvn.map" + "Map concretevn.map" + "Map grotesqvn.map" + "Map txttvn.map" + "Map urwvn.map" + "Map vntopia.map" + "MixedMap vnrother.map" + "MixedMap vnrtext.map" + ]; + sha512.run = "f6a4396c473b6b0dd067c88911457a21ed393cd1d10edc90db0122fefedca2a6809ff50c34932d28bc1d6774ee176a165002d24062f8b6b949e85cb1468747ee"; + sha512.doc = "dc5f2b41cfe273a14278abc75490adceff6c50698de384130310a70370a3e341280d874f398027e8b2af2fd266beb2f470d414218862097ad718e5daa157928d"; + sha512.source = "bf8835b8e7dbd8f1ba5dfd28ee572635360f6f99818b40bb0daef4bd632ae68e1945f96dca6f0e3238fe42113c025c5e41dacd4e756476472fdbb4bdeaea3d3c"; + hasRunfiles = true; + license = [ "free" ]; + version = "3.2.2"; +}; +vocaltract = { + revision = 25629; + shortdesc = "Visualise the vocal tract using LaTeX and PSTricks"; + stripPrefix = 0; + sha512.run = "7daa3923a6b9d84a1fae2c9bd63404c2fb4dfe3866f897895deb9ab85f33649427b38ce5e34552bbbbd8704da1fac55822a747747a0c522728e605638831df8c"; + sha512.doc = "36aa01a5be9da9a23e3a4de63fb14a39beda4a42cd2615f75f942abff677e71f2a4f640773d27556ef246a99004c3a1aa68caac9435957152cfda96707d79787"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1"; +}; +volumes = { + revision = 15878; + shortdesc = "Typeset only parts of a document, with complete indexes etc"; + stripPrefix = 0; + sha512.run = "e54add2c60c5446329fe6f944c99132e0f99e89dd8fc9ff459e0ee106a5241e4df4d864b43269fc14a08ddda92f4e41607eaa20ba50d4a566be7468d0dd66b2c"; + sha512.doc = "4471a360d04cc1ed9c90ecb53bfc422fdae30571a25fc4811813f30ed5308f4d20309a1fdba808d1eb20e84b97318708f57d08722344afd755aa06588acbd024"; + sha512.source = "0f47cc01b4631430cc4b73c7348bcb9d500d0c5c9960a15e9fb29e1c805ff0be4f0108c6bf795156ab7f939fb355f800da916f913a4a441e65bdcefdb05c0499"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +voss-mathcol = { + revision = 32954; + shortdesc = "Typesetting mathematics in colour, in (La)TeX"; + stripPrefix = 0; + sha512.run = "cec0ea20b409192c618278001045352ca6c4c11c8eda59633a9bb65ebb7a89c8c1db4046936a7f0096f52efca8a251501fccf7890288ed830f13e0b24b1bb017"; + sha512.doc = "5d91b23d9eb45998282731620097f214b274ee744972b3d7fbeda1be2268799572f36b5f4c8b707f48e8ec2d825438bcdcee7f1376531f366af8949a862ff379"; + license = [ "lppl13c" ]; + version = "0.1"; +}; +vpe = { + revision = 26039; + shortdesc = "Source specials for PDF output"; + sha512.run = "5fd5180edb830cc2f309652ad6a86e3ce1900dd0b150b72b3115f2e0f51aed4023b3f7af8c86befd1b1317829907b35ce583b50fe5cd1fa50f15863046e806d5"; + sha512.doc = "3c60c736fa03de82bfa5bb86f40420e7f7eb59f6943a94790361bd1d64076ec97843404d1cc508074a903f83392892c6dddd1dc912162928b286e65c24a46037"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +vpe.binfiles = [ + "vpe" +]; +vruler = { + revision = 21598; + shortdesc = "Numbering text"; + stripPrefix = 0; + sha512.run = "39582bec5217d65179b4293a18697cae20b35a0ec5416497691d16dbb919d78d4463ae15f2f05d308f45c65481f611a3f699cce9f5a3c311b84bde08fdd5f234"; + sha512.doc = "dad09087e028977501fe143ae050c57938500b8aa98bddc1afefb298444d17c37cdc5b9db2e9d01df5e9f6a47679e0659b21a2844d268f8b324a24bbf22d9492"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "2.3"; +}; +vtable = { + revision = 51126; + shortdesc = "Vertical alignement of table cells"; + stripPrefix = 0; + sha512.run = "ed8dee287daa32719b6650f43b963fa66cc55572526162978fc5245d3c253f027548ef5f1cbb38423c30e6cbe93b3418c373615ab92532be40d947c979f14b47"; + sha512.doc = "12626485ed74fdaee2aff65e97f59d14fad8f856bc2a84dda96010985b039d48850a07ef08525d74b155a699d44b1e173923e0f67716f47e392fa7558760076a"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0"; +}; +vwcol = { + revision = 36254; + shortdesc = "Variable-width multiple text columns"; + stripPrefix = 0; + sha512.run = "3963b738e1214f7a495daff6476102e6b25e86034c552b5f4e4314af55e4af073ed94a72e969dfd1fba16baa0264577234917f7dfd074dc85f9c56c5f2409903"; + sha512.doc = "a4d55b62caf4968d3e8329fd06f8857f646c5a867fbab23ea9bd7fb57c5b88b5f3a918642bc608eb1ccd936dc2e36edc50a5662667b8bb35cc59ba1739b2e7bd"; + sha512.source = "8a605a7250f939789fd863abf6fa2b5da37b8f723460ef2e56ed93dc826363ec1bad03f5bd2af266ede11ccda04546e6174c0dd79282ba41ad6c3d9923ccd51c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +wadalab = { + revision = 42428; + shortdesc = "Wadalab (Japanese) font packages"; + stripPrefix = 0; + fontMaps = [ + "Map dgj.map" + "Map dmj.map" + "Map mc2j.map" + "Map mcj.map" + "Map mr2j.map" + "Map mrj.map" + ]; + sha512.run = "2d603ccfa92e8ef9abe91f5afaf490c7c8476061679f7a54c22879bb90b4d874f9e0e533e25aafb94fee2ff512f689ec96d25ed7ed42d0ae90c5e05985daadeb"; + sha512.doc = "f9c35379b396dfb563c66a05d200c405f03de96e22ec94de3a9f0c99ada057db21d31b43d59391bc0175479b5f150435f8e704fa40f6b58f2c116bbda3ec4603"; + hasRunfiles = true; + license = [ "free" ]; +}; +wallcalendar = { + revision = 45568; + shortdesc = "A wall calendar class with custom layouts"; + stripPrefix = 0; + sha512.run = "43a682e78a3a80784180dfd84627e5584af9199bef965bb5551b203df7f939512d4307c450ed1ee55caab611154c1511fc339831da2907527c06ab738350e05a"; + sha512.doc = "e4816b91f08a26e99b03892b3d70f4d81110e476461dec505225335d46955f9f3790d883faf19afa4d7a31ff05afac4fea870e37299f45827c5a8155d4bbaf4c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3.1"; +}; +wallpaper = { + revision = 15878; + shortdesc = "Easy addition of wallpapers (background images) to LaTeX documents, including tiling"; + stripPrefix = 0; + sha512.run = "45647b8f8ebab9706437be2ce63f3506638fcc794839ff366210db4c35a3e16b2a39127fcacd0d97df356180770b6808e80e63ea1a50e69fc591cc0992e1787b"; + sha512.doc = "46b890e0ea7bbfb3c3421f79338f5140a105bb90cbe712477e2dc956f834682f6d137e39492437d8f206fefaf07086cab7f3cdd6c27dc7136df54c5ba850b4a3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.10"; +}; +wargame = { + revision = 69692; + shortdesc = "A LaTeX package to prepare hex'n'counter wargames"; + stripPrefix = 0; + sha512.run = "8302254134c342db781f4bfdfafd92dd3484e2a0e91dca2bf43113665bc3c44c0bf50637bb702f33fe243108bf1902283059a923e64bacdcdf7c9a5bfecc8836"; + sha512.doc = "dc1a5d8ce42661ebe5f0bf9cdba69ae66f8fe592bc48c8036ed60cd75b07a84e18c5d92fa4c4730155c5858f7ade450d59934db4e55a6ddc6a3d93ea0c78a0ef"; + sha512.source = "c7a04ae48a204f6e4c3819f8f4781ba65f4a71c72e011e4aa83680818f35bdf1b5cf57f92e58ad7eca366a677f2101d1c58e362869156c61d53e0028f250ef9f"; + hasRunfiles = true; + license = [ "cc-by-sa-40" ]; + version = "0.6"; +}; +warning = { + revision = 66616; + shortdesc = "Global warnings at the end of the logfile"; + stripPrefix = 0; + sha512.run = "443a02ce9aa004379aac94091c4f3014042cf2826d12bcffaa92f24ebd3a023ef314d05aec00947db74175e03e432fb80b7060b51c4fc310d14c15ac86606abe"; + sha512.doc = "561c4aa05df7143f68067d22b337f1754482c40eb851356f70887dab86b3944116f2e7d9f3a83e4439c7b0f6d6db0ca61371ee049758173c35b70468bd0166af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10"; +}; +warpcol = { + revision = 15878; + shortdesc = "Relative alignment of rows in numeric columns in tabulars"; + stripPrefix = 0; + sha512.run = "66fd9e243339e0841576e1a1a3de05f2e69a24a7e1dd31eb38d848d06c9183f691229d8e89878b661c7f6524bd9ebd1380fcd4c9b175feb8490cd4476ac81303"; + sha512.doc = "e88082379e90edf1517579009881204bcb70df888593d7535e2b1e5b673cf116a456967b0ca5ce372efef9dc0818b9d0dc252be79819f6b346ad8619d70551f3"; + sha512.source = "843965fdddfffe6bec9567e140b9c6db66f60d1eb90ff5830b08b17499f21782ae1842989d479e50c293a8e1d7e2a9ab886622b8375384e1238871d6872e9e52"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0c"; +}; +was = { + revision = 64691; + shortdesc = "A collection of small packages by Walter Schmidt"; + stripPrefix = 0; + sha512.run = "1e434b13cf6cbaabb173b34334e046055366a9ec844207460a852a0066963fbdde6288e94979e873811b4e66140f07b6cf2e8526ec47a050efbfaf4836edfcb1"; + sha512.doc = "fcf5434911390ee8f20f0feced15a627e001471b1867d57a7697edbfee557179250f0a01e9e20e0d442dcb0c4509174c504959e7a991e928e392d27515ff2d0b"; + sha512.source = "9053fd6524c572ea80670ed9af80780579e6961e326620120f87f809d76f3c23310fb572f39536eee1ee8c20269ecfc1ad5bd5ca195ed986d87c46bc53058a31"; + hasRunfiles = true; + license = [ "free" ]; +}; +wasy = { + revision = 53533; + shortdesc = "The wasy fonts (Waldi symbol fonts)"; + stripPrefix = 0; + sha512.run = "4c747ea3cfab820b803f624a32178a1d09cbb5a3c441ee423abc74caeef9217095491c0c490f11d3a6d6adf052b97492e081b2abedce6cc9c61410a8e878f5b8"; + sha512.doc = "4ee0dba83e3d1e00a1c58bc1c27d1b8e7e1677bfadf1d2653be216618d65fd168eab7aae26a5fe5ffae42c546b3438e2ad15f1a7bbfd58cd7b75cafa78a46205"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "2.5"; +}; +wasy-type1 = { + revision = 53534; + shortdesc = "Type 1 versions of wasy fonts"; + stripPrefix = 0; + deps = [ + "wasy" + ]; + fontMaps = [ + "MixedMap wasy.map" + ]; + sha512.run = "d7131c025bd97bdaf62697feb698da97d175783e4b0502d3e85b60a663f46a0520268a6063956afaddc6308ddd21954992bf8d216049cb324133e3760ac20825"; + sha512.doc = "d9c88d39deabe19393df0b6d83bddd644e347592735cd7511dc70374ea015cd7fdf36ac9f320b44c612c8276eee3d7cd94f9e0b26de050c0771c85ec7dbae53c"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "001.002"; +}; +wasysym = { + revision = 54080; + shortdesc = "LaTeX support for the wasy fonts"; + stripPrefix = 0; + sha512.run = "408f9c2b70d7860f7d8f7ee7f93af1351442b92aad9c8d8e4a501414058d8347e6da2408df3d5b6fe217597861eda5eda499771a7e973da03597f24b76250da0"; + sha512.doc = "ffa36c6f1446c0dcdf1e1dd8b47946eb84d666714d94eac28c857170c9aa414b612486fcf107ae462c50ecafd6ff20c90c776abb5774db64a32aa07be8c58b2f"; + sha512.source = "12dbdd1e868c3382e7ccb5a507b7f72c20e3df3105e272c00b8b6294f10c1099d3c6c7b1a2db5bc96b866e246807604b615d8278357d0214539a8f959de14667"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.4"; +}; +web = { + revision = 66186; + shortdesc = "The original literate programming system"; + deps = [ + "kpathsea" + ]; + sha512.run = "cc8b2b6525ef1ee49162dc157e8d735225f5fc3bee54e56ac01ad47f85f639e4c43b4409e949d68804e650e243da0a8a6d098ca7c37587f14c810112cc82abee"; + sha512.doc = "ed04fce861ae2adda602a2a50d560cc9a5863ab1668dd9512baa96b6c37acd8334e4800bc4ca853c0b1f58bd3a643abc82a96f31de9d4980806ad0572ea2a92a"; + hasManpages = true; + license = [ "knuth" ]; + version = "4.5"; +}; +web.binfiles = [ + "tangle" + "weave" +]; +webguide = { + revision = 25813; + shortdesc = "Brief Guide to LaTeX Tools for Web publishing"; + stripPrefix = 0; + sha512.run = "0c99e86fcba92d067ddd658893b58463390764b215515068e025563b66f445b23ae11482345bf305106afc1284ffaf32b23a28c8e0f81319002dd6332c8a3848"; + sha512.doc = "933ceaf7bb2400fff1bfc5ec26f60d750e0995680579fe487536ddcf8eca670e2b6d3fb6150b4ad659c6fa594b9db540523a878c74e9aba9be7710b5380e55af"; + license = [ "free" ]; +}; +webquiz = { + revision = 58808; + shortdesc = "Write interactive web based quizzes"; + sha512.run = "04ce66027089c2be815380a10540e6c12040d33a33b1de9c6a98985e82a65e87f58a19b6cbf2b0ad7bc8e0a1e500bd21a80e2adbe3ff395ec4be1ecdd5b5adf0"; + sha512.doc = "58faed1d21c5f0abe004d5aff0ef6f754012722dace25948e236c940f3e9f3a49d4f661d6692afa0bbd0a654424017e84611c32cdd99a0ef60e510c4b2fa01e9"; + hasManpages = true; + hasRunfiles = true; + scriptExts = [ + "py" + ]; + license = [ "gpl3Plus" ]; + version = "5.2"; +}; +webquiz.binfiles = [ + "webquiz" +]; +weiqi = { + revision = 70179; + shortdesc = "Use LaTeX3 to typeset Weiqi (Go)"; + stripPrefix = 0; + sha512.run = "7202c5b907439d47868e940d1cded455a15d1de82420e8846f93c81ea3b723eb2f6d455bfe8d1deddca7e856b5d9243418b546abbf36d0883431675866cdfbe1"; + sha512.doc = "ed2f33194866228569800a1612bf73b5aa2b8ed8b1c859b3a9475ce6b2411b0a7a9ac4236b4b1372d8eeb5635f18b340592656ce5acc76664d620184a62fcc9e"; + sha512.source = "8d0505d70518aeb70ced15c152389c08a5e4938a1cd82c623ce21ee83678bef53e8a8876fbee13a121b428f55df013ca44389a98529c6ade2909375f910c5b06"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +wheelchart = { + revision = 70518; + shortdesc = "Diagrams with circular or other shapes using TikZ and LaTeX3"; + stripPrefix = 0; + sha512.run = "9b54a717a73761b09007afeb18c6fd69f6af1b1dd22f206e556fd076a61e6ae03211d58be316ec6eb62909979e8d53f74c6cd7dddd11fac33917383f4de2b073"; + sha512.doc = "23e759467608b69aa7b3a3376d4dc62ec82aa831cac2014ee76d5b73beb99d09a69401f61f1db02b617a741189fd34ea39b90c5c1b1f7f7f94d380ba38041a24"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +widetable = { + revision = 53409; + shortdesc = "An environment for typesetting tables of specified width"; + stripPrefix = 0; + sha512.run = "bd6c85eb76b1fdd4b7e81ad24ad7d282b79e4234ec029e48ed63611260b00e8b1c584ac800c45643e466ff6aefbf953246b24c1bc6453098a76b71ba01624821"; + sha512.doc = "5f254468e606aa188030c95c79672a6fb0211c0b5c4df6c3fde98c43ce1fd89993d495eb750b58395175e2b6bbe3e9771895627a04bdb8839fd4d0a143c1ab69"; + sha512.source = "31ae40849337a8c6a7872621e55ae2a53b1a7d4d1a7907e18f5aec07f94196636b99c26d46dd8c10e1494a35b86d435a014a229160edbbfccd064306fdf06598"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +widows-and-orphans = { + revision = 66753; + shortdesc = "Identify (typographic) widows and orphans"; + stripPrefix = 0; + sha512.run = "0861e1449011f6032d847c5bbf8d06fe7b8f6d320dcb0f2281ca558dcb8ef1eec561ecaf622f957e6a0c673223b3aef8cbac4663930931d945f18137d19f4e45"; + sha512.doc = "6105b7306ddfcd91080bdb682702dec2a4d1b094e1b8c9bd0a28bfd185bbc9a0bc4252180101b2674e702d645fba31420d12cddad2ff3db6703f6e83042b8a4c"; + sha512.source = "4eb52ec1f9f78daf90f62b7f88ed96506069fbcb22c9bd33aa853142ea2282dfc4b5ff87d6280ad82ee3d9342d4c5737e91cd7a83416dd1de6b26f2e89062b2b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0f"; +}; +williams = { + revision = 15878; + shortdesc = "Miscellaneous macros by Peter Williams"; + stripPrefix = 0; + sha512.run = "44ef966e5d8535aa7bb32109b20f47c774995e6368a92e20a68d25c1694ad86b7007bc90877d276c2f15b8aa3c3d11f7fe6aa117c35265b5988205df869af11b"; + sha512.doc = "c559e587868698c1a635db13b6db265234b3b475937fa1759f9e7e3a8d0644a43543005e9607b5a965bbdc304863d6c7cae6e5cb8345b546dc34afd8c7e2de43"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +willowtreebook = { + revision = 60638; + shortdesc = "Easy basic book class, built on memoir"; + stripPrefix = 0; + sha512.run = "835b19d0927b01e4acf9da483148d3fa45b1c12eecebe39802ee4bab7426843710dd67306b2a8946c9c2b51d4c1864eb054f440c3ea021ae124bbeb6e4908b33"; + sha512.doc = "9e5fddf4765325a550e6dbea529d110bbbfbcdf89e1dafcfe62099a4e8fa6ce2bf3384ef9e1b2453f1155b6e6d3f48d1d1675100c8295362653aaabec35aaf86"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +windycity = { + revision = 67011; + shortdesc = "A Chicago style for BibLaTeX"; + stripPrefix = 0; + sha512.run = "f83fe1f694d3fd448484961bb23c7c220ccb5b0f8982198660b5770140c8e9120fcd1f095492555f00533039039d11b3d2695189f40b716b17b2c2acf2e7c553"; + sha512.doc = "eff7b0bd0603d563d077842e77fff4b9a104d008724d3e81f58cb26ebb77f8e61811f5a74d9cf2d5d62f3351ca692d5028cea9629ac1a9e8dc6263637c1cb616"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +withargs = { + revision = 52641; + shortdesc = "In-place argument substitution"; + stripPrefix = 0; + sha512.run = "73cc4db53528595f54f31f0d2824f08af54310aaed51b6eb51a5386de3f06dbe6ffeea8c4ab6f1e4ee1d169b5b0082f113ed435eae90b99a9b59df3296a3f4b9"; + sha512.doc = "050ecd695b269896d1252649978af7cfbafa80e289038ef1054d82296cd83934b0f7ceee274340d54d836021f0da39f05a648dba8bff141eae8f378527bcf865"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.1"; +}; +witharrows = { + revision = 69996; + shortdesc = "\"Aligned\" math environments with arrows for comments"; + stripPrefix = 0; + sha512.run = "31e9cb805fa91b903d91a0090ceffe6cad323c3340bc16c268e6667dcb5fd99e05c95b87fcc6cb8500c187479973d5595fe510855a7c6b2b86db06e513ba5172"; + sha512.doc = "69c495a471e5fc2fb4da60b06360dae6dfa2c79d93fe176fe54485ba95f3c854fec8356f9939d5521360f9d461e9dac1a6290dc3ef29b8a82e52c0892e8fce14"; + sha512.source = "bb5144cd95bb78dbdda91bf068597de2a8d409a2f0ba8f48c861018c52b897a7b5b7a095cba1b5e301822f75b2808dff0376ba36591cd8964f2171553d5e8dce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.8b"; +}; +wnri = { + revision = 22459; + shortdesc = "Ridgeway's fonts"; + stripPrefix = 0; + sha512.run = "6ad06e6a867b323c382b85fa1effe16280566b1b61dd37be0bd7e9384d145fff2b1b4ff8117aa49749db1f15495e835e3367b0b7191cf9444e36fed662ffd0ed"; + sha512.doc = "c3d6ff664edd89fa711e9573b138b29b113b588ddef9ad4a258e1f28c4ca2aad1f05741a402c1c1972bbc317e0cb989ce7a51e52d59b42629343d9a5780b64d0"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +wnri-latex = { + revision = 22338; + shortdesc = "LaTeX support for wnri fonts"; + stripPrefix = 0; + sha512.run = "1dcecf9ac38a9099625ed6be3955af8b063ee5b5b8d0d3e3ab8c94a8215b72b86a0b5dbe930eb69680917bd3d6652b3f4f08bb377197ab6f3d2fccf2b96aa59e"; + sha512.doc = "924266d547910d25ed5355ec2ef697d271dd992aeb6767d5bcb703d4d07cd34b6844e9a821ed93f5a04237aba1c185fb68926967e78043f390785b619c2389d2"; + sha512.source = "e3c5cfaae7b14a28489344392d66a1e2570c900ffd571c54b4f2d13b16d6dabb5cf58cad9259f8b662a218567982d1ac51ef8b2a757902c36540200fd984a497"; + hasRunfiles = true; + license = [ "gpl2Only" ]; + version = "1.0b"; +}; +wordcloud = { + revision = 68209; + shortdesc = "Drawing wordclouds with MetaPost and Lua"; + stripPrefix = 0; + sha512.run = "7e4f6adb72d2a7b3cf740f338e63669304ac33d90f7fa09327cb3e6ee882105c92786656d5af742de0d28717cf45f4fe0900ef0c48faf1ddbe57af322959c8d7"; + sha512.doc = "fbf28ca6311850020c73dbb1a6a60bf5f31387a2def4b01f348674e678a3626cfdb23e2826a30db8ce021a5fadfcc26027584278110781a99ee26337c4b1f642"; + hasRunfiles = true; + license = [ "lppl13c" "fdl13Only" ]; + version = "0.2"; +}; +wordcount = { + revision = 46165; + shortdesc = "Estimate the number of words in a LaTeX document"; + sha512.run = "3c26b3bcb4c3edce8cf9d6628cf6b89103aa1ae454b07c1e963ca90693c18fb851772a52082a23efbefb51235005e558fd553afc891a472eb39cd430c97f861a"; + sha512.doc = "a86b034ebff42c89f07015b01f86756a83ff2c69ed911ecde185ff719b09e3db47f284fe778c9dfd16442d1513edc9ddbb4944cc242328c17bd3fc18a0aa098f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.7"; +}; +wordcount.binfiles = [ + "wordcount" +]; +wordle = { + revision = 68170; + shortdesc = "Create wordle grids"; + stripPrefix = 0; + sha512.run = "fe32704e323185cdc9fcbd3e87bf02c4c0870af501de731ea1b05056cc7e57861042b111a3307597969351960bb99086f99f8577b70e8e6b31cfbc9cf8825157"; + sha512.doc = "38f168ddfdab5e786a4ad5b42f726e7895178e949c04f75ffd2f14fb42d77bf6e8afe22df5b87fecf8490be61aa3edde0dafaa91191f459e4378878aa575e8c8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.1"; +}; +wordlike = { + revision = 15878; + shortdesc = "Simulating word processor layout"; + stripPrefix = 0; + sha512.run = "d600073b2373119973ca47564938db5824181d6b74409ef7f4a2b19d53b83b97ccf8edf5d77dd831c0d52a4379f5928ad7a0391d90a2f19fe4d3ef681133078b"; + sha512.doc = "10bbfa76beb0718dff8d4175712567e34e77aaefbce9fbc350d5bca43d8d5e87fe1cdcce5c558946c2b04beede8628b7535abc451f7d904ac283929ae39c6460"; + sha512.source = "23e7f66f064e7e8bbf94d58118c0c8891a316fc2e2fdf37156b078242fb33343a38d19f03dd605035ce874de1d05d9e405c612e32c407e061f54386cfef791ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2b"; +}; +worksheet = { + revision = 48423; + shortdesc = "Easy creation of worksheets"; + stripPrefix = 0; + sha512.run = "439c430189e74e8c476a068fe449034fa1c8f4e8770ee454b92b8645ee865b103a02b0eecb45a925a8021fa7c64d98240e5f1f980913515df49d8415bbeb2c2d"; + sha512.doc = "56d502e993eb77f7dd4b2a659a8646823cf033a3e246e90b0c6e4e9d2a7cb31922dee26c942404b13d18e7abaa79714b4394b589376d67e8fc1556a098ec7960"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +worldflags = { + revision = 68827; + shortdesc = "Drawing flags with TikZ"; + stripPrefix = 0; + sha512.run = "662c7b2cafb1764a42a94707f350ffe0e4060120071d715c3c1cebd21b2c64f2ca0896ac3c9c1e629b2fe4b057bf0b890805747a668b6a8c04d501a4ac1ca1fd"; + sha512.doc = "16948753f069aa0e9f0e19efe9072c35eddf4bd20e32e6a47321a93bd3117f2206d44d3a76bee1581f7d4dd7e392d2bf1a4fd0ebb83d0d7b6cf207e69a42c7ac"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +wrapfig = { + revision = 61719; + shortdesc = "Produces figures which text can flow around"; + stripPrefix = 0; + sha512.run = "afa6eed496f63dda436a9a57c9f056ae88fb7985328d58d81fddde743a737b1ec69a5409941a76a28840d938397928925500628b2e11859713871977545278e2"; + sha512.doc = "27aa1cfb0641876516eefd483f5f37e25e06c24bc255fe81afadd985d9a5ea73d311184ad46120d57d8dfc584da02f99c90128c6e0cead71064d00c1bae09f7b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +wrapfig2 = { + revision = 69513; + shortdesc = "Wrap text around figures"; + stripPrefix = 0; + sha512.run = "68b48be5ebdf766fd414ce9a121321f26e172802c6c504213306762e383dd1ecdf77f6260a5602b8394945a86c87b0320cc0a651ad054753c5c2510d746a8149"; + sha512.doc = "b2356e3756640a825b44c47fdde68acc49d966508a90ba76a019992f10a9b65f124282d59d26422bf3c51a658b2adc723ad36f4e0d92dcb74a8bffabfefac471"; + sha512.source = "e502c514d9ac982b3fa67428a2be8e97b50b2c5389ab2e29981fc65b002e2c3076509a061635991c2ab48ad8969eccd1ec39e82b2f7a07e34de98bc2801a8dd0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "7.0.0"; +}; +wrapstuff = { + revision = 64058; + shortdesc = "Wrapping text around stuff"; + stripPrefix = 0; + sha512.run = "ec0cfc45b68b5db1b0b8cde55a0b98e2834e8d69727d9a243a4ff814e7f98dc794803c1ee0487263ab06323f8d4cf68a0c7de6639b8f91dca953a8dfdcda3f06"; + sha512.doc = "688ce97d588807fcc36b872198f01a74678f562e8daa2ee4a4bc12a1ee9b3d914ed670d7668af259ee92722e314c28a65555a61b2fde3d22f5b69b4bf05332c1"; + sha512.source = "b7e1b8ea480949adcaffbf9d175b75f9eae3f23c79648080379fe178fbb2976d11446a7384c613e5ebe647936a5aa88c31cd82b2a9425a59b6c41d7ad819d63b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +writeongrid = { + revision = 68863; + shortdesc = "Write on grid lines"; + stripPrefix = 0; + sha512.run = "5e97c246141838a342192743411ce0d3cdad4924433540cf5d1faff7f2650388eaed5f045c60ea5bc69ed4108aa23863f38d812ae4702af1d04000d96d112dd1"; + sha512.doc = "2f4c29ce5949d3f10b8a8971cd62c34a473038f211bd1cb947baf675d9320fa7d4b61931a83675acf6f00534656d827fcda4a5fcfa51b69052c8f82a7625d62d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.5"; +}; +wsemclassic = { + revision = 31532; + shortdesc = "LaTeX class for Bavarian school w-seminar papers"; + stripPrefix = 0; + sha512.run = "064c1ec12a33dbb6c5a2c08c98c21d5684d8be6edb807987e69a47002d52bda4634a8e0d8016d01aaec6b0bcb9851de61d2a1723f70ea7da2dd4000d2340033d"; + sha512.doc = "d86741a35d1873a17839e880b2e1c0915cf7b64bd52e5836f9967159479611482c2b2c67388066b9f171574109a5fa0a5b9555ccf4e629d4b26434a31cd754da"; + sha512.source = "cbf8ef51ab7782a2b52d238ee2f517a541ef1a0196ff72f08cd722c3335a80a2520fbd359cf865302229cf146b16931d4b163571e908360adc8139c2ade5f2b3"; + hasRunfiles = true; + license = [ "bsd3" ]; + version = "1.0.1"; +}; +wsuipa = { + revision = 25469; + shortdesc = "International Phonetic Alphabet fonts"; + stripPrefix = 0; + sha512.run = "7488fab88bb273463ffa45819fb486aa3c95d7202d8ffe2a8aa8f2a1b00555e70bbc5a008a72cb60ddc1759dbca60bed05d2a21b4308e75490e965e71a84ee7f"; + sha512.doc = "b24aa32e2e7b466d7afc827aed570deb70b41163cbe6ce975d8df77e9dcc92b453e5f0d5f0edd5a2f05c006939003849b7b44c2e3f8a86ffd61a51ff307466e5"; + hasRunfiles = true; + license = [ "free" ]; +}; +wtref = { + revision = 69214; + shortdesc = "Extend LaTeX's cross-reference system"; + stripPrefix = 0; + sha512.run = "abdaf96d5c4cc919fcaa5343d25243266f86dc079cf701d71f047b01874baabf20a0c7972a6aa863c7f9eb9a003eb5a516714d57fd453574e7a2c8ee2e500e7e"; + sha512.doc = "f248f448bcd110c59d5dc19c67d4192a20d4f334c6f17562d34db0dd4ecbd7c6414ece9ed4e55aaf2ea42a0e5373fc5f25e8eaaae16b468687bf5c2d2e88b908"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.0.0"; +}; +xargs = { + revision = 15878; + shortdesc = "Define commands with many optional arguments"; + stripPrefix = 0; + sha512.run = "43b9cc5246123ef3c424614415e04db9e7a578eef348c3d580626918a4c31ac99714cf501dd54d305ed6ab9ad7e0533bf5b39250c43ad682032dd676a12173d2"; + sha512.doc = "387a051eb8581b51d2042bcfae2ff9af99659d664c328c6b30b3789c75fb73687c32e2037df7a345335966671a3e3267ff4b9e0eead0e5b759bd305850ef22b6"; + sha512.source = "e4717f476260648eb66fefeeb125606c16d302bbad32c55730a0102da355d0c828b106b25391f69bb34627f56cd7659dc185bbcd36ba7f5a8f0b77a0786a7957"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +xassoccnt = { + revision = 61112; + shortdesc = "Associated counters stepping simultaneously"; + stripPrefix = 0; + sha512.run = "4b3934d7a4a219fca3f276b26b893706ed8a65682425ac40d6722734f3e133099837ea8aebf214bad32c0d6b415121f73ea605dd851f0f2542dfb0bc38744313"; + sha512.doc = "020a2fb86c86372302e68636d727203625ddfbf63cf8eb5b3055502fcd073c54b52a44f8c7bfcb2c3c73a206082e5d285f05cf762b9857d2e16c43fe36f8fb96"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +xbmks = { + revision = 53448; + shortdesc = "Create a cross-document bookmark tree"; + stripPrefix = 0; + sha512.run = "e17701f9cd79d49467e4dd47ef9a504a8b0fb44b216fbfab0f5547e9215c4dc40f1fa46aabc209ff2221a4a9424221adacc52f6040d3f796d51f2d37dcd4e8c5"; + sha512.doc = "76d255a036a19d80c826eff4b18643523787c53f9b79e44710e03f9bb8a7648136559727dee246508c1cc6ff332cbc92b8d1c728b4583ae26502ce44538a61db"; + sha512.source = "4c3a9ade3d3c204db2c2d0e11a55bef0a18cf1e3e4dfa292c3da356ef5ef5aab9ed6021d07f6222f1ec722298c46ee4e4eff02658e76b99bb426e6e289fbc136"; + hasRunfiles = true; + license = [ "lppl12" ]; +}; +xcharter = { + revision = 67742; + shortdesc = "Extension of Bitstream Charter fonts"; + stripPrefix = 0; + fontMaps = [ + "Map XCharter.map" + ]; + sha512.run = "9e71217c7df0e41de44aa8cfe09b36955910ccca4337d878b0f18f4352f52d14b9dc1cafae01e9b06ed1a094282bb73b25e5328ccbf60e6070b57262e106018f"; + sha512.doc = "04b1aa9efceb7b87551ffb6743605861ebe695118376940fa84e8c3a8b0ff7c073d86850713f8df98381c674fff210bd2f4dddfd82de4f152945207ec4c44354"; + hasRunfiles = true; + license = [ "free" "lppl13c" ]; + version = "1.25"; +}; +xcharter-math = { + revision = 70333; + shortdesc = "XCharter-based OpenType Math font for LuaTeX and XeTeX"; + stripPrefix = 0; + sha512.run = "1b9da3251b6f5abfd2053114edb174638046603c6b2f46a8baf26c20050f3f614b4a9e01ef92b458ca4b97ca90bef7c72bb146754184d311553bb0a429e29873"; + sha512.doc = "291b67678718b0facbdd38b95d24e75895a74d7bb6cde5c320598fecfac2ce0ebea442d0d3a62c63fff9ee38579042525297518c9373d90edcbdf425605dd119"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.62"; +}; +xcite = { + revision = 53486; + shortdesc = "Use citation keys from a different document"; + stripPrefix = 0; + sha512.run = "0412a4f47a044efbd22adbbea9cda1bec44379dbc799ca83821d4650e8e40f6b5de51b80ea6a80d747639a9b840b7cff6612b6e4df0b2c09c0f3ed506d3de714"; + sha512.doc = "11af105ca5f1610e5cfa226cb191d1f69d257e21439c2408283572e136b183518f58631ec1b0b145a1edf50ca58e9a1eda789e5646c47b46f75a6325c90262f5"; + sha512.source = "0f6d0e7206b59acd468dbd77ef3358d2865f48e2d59ccae2ec185759c137b9db99bf417acf71ec40cbafbf2569cd9b4a74a97b7a3959f51f1703af9a026486e4"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "16383.99998"; +}; +xcjk2uni = { + revision = 54958; + shortdesc = "Convert CJK characters to Unicode, in pdfTeX"; + stripPrefix = 0; + sha512.run = "db0be3360dc3d6373866c9d27900f8dba9353bcf92d219f9f0b82532e2855210230a06b87d1ab6eef7e1f96c54e46884e6827395affb9375120b7cf8d2fbb99b"; + sha512.doc = "6a9958bc6ddf6d167b9d77a513d04f0077c9a8581109c51166410d60d5a243758da62b40bdf5cb1488a50b9ba76ca89261a2d31c3819d8b2738b4a7023ac3f90"; + sha512.source = "8868210c53fb379e12b22472dd3575baa62743cc059b3215b634aa59e61af5b3bed8415b9b811a7949457dbee4a051e4926ecca02c293be775ccfb3467e0883a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xcntperchap = { + revision = 54080; + shortdesc = "Track the number of subsections etc. that occur in a specified tracklevel"; + stripPrefix = 0; + sha512.run = "7be16f92de86fe67fd34857f7151f197e5ae52e9ab944e0ef3603882585dfb240b8e01072747b18092c6ff060f2f4c341b27e106ffe8864dd1879c3965435e47"; + sha512.doc = "c7d25df1dbac57e05b589662214e46ba446def465ae7f64d8a2d52283151ee04aaee93ac1bbe0f2c7b01c50e505ca6c1cfac96750d1b13211d309a906427c6f6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +xcolor = { + revision = 68864; + shortdesc = "Driver-independent color extensions for LaTeX and pdfLaTeX"; + stripPrefix = 0; + sha512.run = "6b7d38d631f89f4c4ffa9f447a16cef6169c3e4798c5c65339fe48f9318291373a49ef9da8143c453fc5fd9ee853bad53b5477b248ad5f99763df9ea28638c78"; + sha512.doc = "1dc8355913a62657a2b50d45a6fdfbabc8a0dbb835ec5912fced934350b21619e8081b9e9a4774ba48ec3c51572c7f95f52efe92c85344dd81da0bcc81e73809"; + sha512.source = "98fdb68955160820347af83f7f44ac97c3a61b9732af2a17980155c103b6d6ed9037504ba99aeeda5608fea84f82ac871dbb55d9de334943a74aa617caaa70fc"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.01"; +}; +xcolor-material = { + revision = 42289; + shortdesc = "Defines the 256 colors from Google Material Color Palette"; + stripPrefix = 0; + sha512.run = "7f1484435458dafa2a04eeb4b5b1b89ffee9ec8c91f1d724449457b719f92db009efd6b6a580a2b0ccb8ebc66c0d1889f3ffa05104c0fba5cc9c7ee90985d2d3"; + sha512.doc = "388f9b604291436ded0510437be93c1fdf120a91fc3ddbabb870840f2caa9e81313035ff6c9d0c00de259fa024f83399a4004e7ba512a5c3bc7920a08ff58819"; + sha512.source = "118b21c883848b5bd6d558b5c22146fad54df5e107d0525e48df42c0bbe90b210c7ea3340fcf30b5782d251ee1caefa2aedb8a130cd01a84f4e9022a40ca6a8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +xcolor-solarized = { + revision = 61719; + shortdesc = "Defines the 16 colors from Ethan Schoonover's Solarized palette"; + stripPrefix = 0; + sha512.run = "fe743e9aa394c6a8a75f8c9e87cb7349d87df114a8c5753a157d4dd129a677af6a0381969f7719712a9abbb9fc720e0d19f8e7ffcc2bd7ba09ee8cb3df3c8d95"; + sha512.doc = "bdc4d9a9a0e1ace78a90e9c64fba0894599179592c948494588e43efb21e3b329d6f0a0c403b21073943251796b4cf37f8d0665a8e8bf438b09616fed19c03ff"; + sha512.source = "851e8ac38bb8a5f6e3410daaa307ba54a5762f08e10b656234feb020354b79caeffaff1de58618e6e9f52cfa50d40013fdeb1e32f6605593dc224cf3650e54f1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +xcomment = { + revision = 20031; + shortdesc = "Allows selected environments to be included/excluded"; + stripPrefix = 0; + sha512.run = "ad19a29caaaa4da90c740a18f3b3bf63666303f8047210197e17c270082d483e33085c9249d7143ba65f343f6bf3b52c6974021f954831c5196708824e21b843"; + sha512.doc = "d3b4d70cd88923e25595acf726afa6eea2efff4550455ed2eff48411621f212059ffedc3a82e4ac15359420a00c69b55e3625d11f8e8d4111eeb87cc3a6e8cfe"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.3"; +}; +xcookybooky = { + revision = 36435; + shortdesc = "Typeset (potentially long) recipes"; + stripPrefix = 0; + sha512.run = "3f74d540c4da5ab4f6f1b6c78f3a35172fb4f2d94b7c720fe3fd1d31e1c53db6659371da6d48adf755675af831d252178b96ba57a1f0c0319459f4a564897b49"; + sha512.doc = "29d1620c7ea3d13e4fdf97454bf824fab8de6acd96661554a1f37717e4fa0dcf6df20cec580b6b25101b75d2d22080962713d05347eba4974c5cbdbca6129ec6"; + sha512.source = "0a0d8eb171bc551831f65511f74b9db402587b6bdb47dfcd3d9e31403eaf530e954c5ce0510f9fa4e850b3036bc6807339aefca9567b9fff7152c72c8332d640"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +xcpdftips = { + revision = 50449; + shortdesc = "Natbib citations with PDF tooltips"; + stripPrefix = 0; + sha512.run = "ccf564a59d658a4f6747a3df866d0b0a0d6dae489215b5784fbc0619a2f3f222ef348c5fb96faf192d9db7e5c63d44c5f94549cb809e89dabd06bb43d745df1d"; + sha512.doc = "5d483b7bce276815fbb3602d4082ff9c939ae414cb2e2b03f75307c71b2b19a6adba23f609836c78859df5823f4aaad175e01b9f223326176b62a4ac9060cf02"; + sha512.source = "d386d33f5437cd31bb8dae0ea51a22fc90353f7866544694e3c41bd2f9cb70fd734a92bd50864a0b20443bfe40f6f54cc404e503da395e928ae69fead87db771"; + hasRunfiles = true; + license = [ "gpl3Plus" ]; + version = "1.1"; +}; +xdoc = { + revision = 15878; + shortdesc = "Extending the LaTeX doc system"; + stripPrefix = 0; + sha512.run = "8cee132082c70214560ca8377766f45e6f15da2af18e0e9d68205d094b2a6af4d50150bfa6d145f78d92bb95c8657ad9fab1cbb8e76b75859f44ac1039464cca"; + sha512.doc = "cb7fc71f84f88a1035e91500e9b7ccf0c425733227e4106c7bd87eb30b25c8fdae6bce046f22e5a07ec919ee0527f264dcd826b7e6468eaf21a791e7dc0e7ab8"; + sha512.source = "d82f9fe7cf0a2faaf0cc6a5f1f1d5916bc3eecef63e6e983f62c4b17d36b17f31251af6e704811af2094cc43fada5597b0ceb432a4b38c4b066ab041d7a5c578"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "prot2.5"; +}; +xduthesis = { + revision = 63116; + shortdesc = "XeLaTeX template for writing Xidian University Thesis"; + stripPrefix = 0; + sha512.run = "af32af87d621a3ad64ff6565a02190288e0f97526973a1a3a185c077aef8926f56e9754fb866812f0cc7f515b54fbf7583fec10c17d6f9299d1e186c9a8542e0"; + sha512.doc = "45c12bd4d3127c5d49ef5bfe434b7f8df5487c37fdbbe6ff687ad07796e95aadf4f027cbf16ad4fc5a8fd3455467c47c32ad99d8bc0397d6f70caeaf199d3ecb"; + sha512.source = "c5c2276a352d01ec6ff2724d069d68e29cfd3b78272b5c7a075189dece45c28292b814a9baa951c14ee166f66c9c26feb19c86d31fcca5a65416a1fd1190d61d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.00"; +}; +xduts = { + revision = 66661; + shortdesc = "Xidian University TeX Suite"; + stripPrefix = 0; + sha512.run = "8c2b0b04ff619c18961014213db4a509af10d46cdd5177706021675eda7d408be01a3f9c9aeb18556b59535dd9cf8de7d9147c36c57350ee3fe8e02e61f416d5"; + sha512.doc = "7e89d160b992eba61328618ea463014c52f861eb1b952f05aec2860878c226d0354470522468ef79c710486c0ced8bfe76eee296035a752178fafcd380f957a4"; + sha512.source = "3227078ea75cbc6d23aae9086f51bf86b2d7fc42d237767ed90f915a6d2255f6e2f816c49d77caa1d85fe0f623d99d3e76dd458db699b458df5c28f3fc5fc092"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "6.1.4.2"; +}; +xdvi = { + revision = 62387; + shortdesc = "A DVI previewer for the X Window System"; + sha512.run = "57024e05928f45e253e236d7e8c6b9cef07359c1cabc10b3f6ac13a9b98dc04530517d8d66b20cefaeced793fbc57a5373c226fb3d26186ba3bb7eaadb0f4ef2"; + sha512.doc = "0fd1bc1ba7bb022f03334fa6c6bc6aed779179a7c486211c3016b0880efa2b13859eb7cea78e8bfc0069192f93313d37a4966fd7e233bccfb1d010d3e413cfd9"; + hasManpages = true; + hasRunfiles = true; + license = [ "free" ]; +}; +xdvi.binfiles = [ + "xdvi" + "xdvi-xaw" +]; +xebaposter = { + revision = 63513; + shortdesc = "Create beautiful scientific Persian/Latin posters using TikZ"; + stripPrefix = 0; + sha512.run = "c12da79ef06b07aaaa361fcc474da416bfabe898095eef7bdb9ea80efddc8051735b3cb4c86eeb052bb906b3fc96d3e3ea10b23e0bf00bc0aefa80433d6e6ae0"; + sha512.doc = "c1018a8009d360ea411fd816719844af3e13b429135e533c2c033898f763f010f281ac7cca9c41572eaf1d5f4a9c4a837e4f0651aa03c140c2285dd3f087a7ba"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.53"; +}; +xechangebar = { + revision = 54080; + shortdesc = "An extension of package changebar that can be used with XeLaTeX"; + stripPrefix = 0; + sha512.run = "833f0b1cea32c0bb345d1aad5360613ee36baf17a35e13d20a4bcc75edc77b3a7c48c4406ddadd670890cb93dc0d03cf91462994271f351ebf2bc221bfbae5a3"; + sha512.doc = "6d2c385b3b826b8b97cb725ffd3e7479ec3ddd2d2bbd8c772fb0b1faa9d0edb758871003ec379d8ec349fc4e3f7de2bf3130cc0e5d9e356ad472232d16acb546"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xecjk = { + revision = 64059; + shortdesc = "Support for CJK documents in XeLaTeX"; + stripPrefix = 0; + deps = [ + "ctex" + ]; + sha512.run = "3382b181053c76e58ba3f77b195765d83e5515a48b0c73580fc19305bd395de8d19b98be3494da8201b0a22a851a53c82dda14beb54a545b652cd0bd5719af67"; + sha512.doc = "b2dd0caf3317d708cc001b5aba57979f86eaa20d9d38d360650b45fbb683603e2075658a0c0a9c0631c81ea06ecac27694c45df47f053d9e7440901d66280295"; + sha512.source = "07fe51d62358a376d2f3cc2774cf606bd4e9f8b3bd3fb202427f34c3c15b004fed5985f7fe776b3529a83ea4aa3e3e176311e14bb0a02cf055eb501a3f474839"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.9.1"; +}; +xecolor = { + revision = 29660; + shortdesc = "Support for color in XeLaTeX"; + stripPrefix = 0; + sha512.run = "0ab23e651b36f06256fab5acb14effc93296948aecf7c7f11c81f4db89a58bfd8e038dd857a1da3a86ab573cf0ffb1d1bc188789e0d493ab0d0c1c9d96d593f3"; + sha512.doc = "9441eff384f57e8714cc543ade380ecc321e6c0e7dd0ae69c71337458e2607a43f793b490bfa6752c1c70bdb17be92488b89ff848ab9a3a1700907c15ed857c2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +xecyr = { + revision = 54308; + shortdesc = "Using Cyrillic languages in XeTeX"; + stripPrefix = 0; + sha512.run = "0429aa515115ef69811069b08567c97ce40a8be68ebe72f26b8e94947abd86394204b21bbf25ae44c616a806878fe9900f5a639bb8707106836103ec06663454"; + sha512.doc = "555ef35f9e50450a796c24b87295eeac319d087a61e4fc7cedafbc398cb9a5c0add8b93318b8afadd82bbd2ca90dac9ade02dfbf286ba825c1d697b58110fe5e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +xecyrmongolian = { + revision = 53160; + shortdesc = "Basic support for the typesetting of Cyrillic Mongolian documents using (Xe|Lua)LaTeX"; + stripPrefix = 0; + sha512.run = "2faeeadc81ca7f6fba45b6b237fb604a6eb6e8888117f759f6d369ed354b20b35dd007eb11c017e4f0ebcfa99627f519b291eecd1b41505d7f4ecbfc23307784"; + sha512.doc = "11b9d4a92c6df44dfc629c7385b56463dcb13564e819cf1bde005e228040a9f675cfb5818ca9f5c5d59a3db7a0d42a5584d9a3a530d772ba2b4bf3145534bc0c"; + sha512.source = "57a31504636eb9ebe717b6eb9028d5ed0eacdc7b9d406ac3822539a9e40ed0718668a640d557677b1a48920b272f3374817d8182b9db04a8329d2ee20227d801"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xeindex = { + revision = 35756; + shortdesc = "Automatic index generation for XeLaTeX"; + stripPrefix = 0; + sha512.run = "bc3f399973bd8be5b83ea6da2c39d80de8f39ac6cf2d82d689c81816cad334310081f44fb4e256e442fc47ed6640c2b8ebd185e431f0d0ddec5f75f7b535283f"; + sha512.doc = "c84682c8034c5e182bcbb2ac0411f4ba5d8065a5db1f008c6f9e7a01b94b3563c44c03fc4c1cf48b3b09d19ba93f22778d8840741737bf1a344cb0c8f66ceb49"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +xelatex-dev = { + revision = 62145; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "everyshi" + "firstaid" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-base-dev" + "latex-firstaid-dev" + "latex-fonts" + "lm" + "tex-ini-files" + "unicode-data" + "xetex" + ]; + formats = [ + { + name = "xelatex-dev"; + engine = "xetex"; + patterns = [ "language.dat" ]; + options = "-etex xelatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" ]; + } + ]; + sha512.run = "088c917758f727ba08b8571d302c93f0b14fc15ca6dcb0ef7a89df4ba144c508d8d42265cc6b1915707329b64aa1d1030ed0b5513987fbd4437d0a58a232b5db"; +}; +xelatex-dev.binfiles = [ + "xelatex-dev" +]; +xellipsis = { + revision = 47546; + shortdesc = "Extremely configurable ellipses with formats for various style manuals"; + stripPrefix = 0; + sha512.run = "3bff74473b4e7fdc7a349fd54e7703b77282381d9ff5eac233d5eb7cefe98f4abc5ea4fd309b8693bd7245471c565545e0ab437a5f8e5cc1b89368c914078d54"; + sha512.doc = "20d238f8281b93643af570c3dd09a9cdf9822af0da6a9d06b3b9d09196ac4c7fcff2efa3271f763caf42e54f9c72d2087c491cacc5ea4666cef1060c12ecab3a"; + sha512.source = "ae58f20d0aaec99bb7e56a0a5b277210d5b9efb8e2677e9e22caa08ebe9576befe19e4b7409625aee00b30cdbe1d90ae61623e86d3fcd255df96dbb7c89291c3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +xepersian = { + revision = 68117; + shortdesc = "Persian for LaTeX, using XeTeX"; + stripPrefix = 0; + sha512.run = "aba7b248b1ed6fc557e51c267d3da21a3f3473cb0b0d997ef7d899b3ec518a099a173a163c53aaa7ff29e13aa2f1dbebb65775af828c85fcb9e4e91476d6e1ca"; + sha512.doc = "dc2f7a06a6122baf9f2284412edf4231eba88f6968f86eb06e47a3e3f3cac14f833ccdb8f69e95b17a05cdc9c3244c361e8d581b6ca65a715a82662ae722fd35"; + sha512.source = "6cc50aa2d511d744499620b010066916913aedb63ed871f93ab8cdb45380da206dee76c4d8ceaf01be5df971e0437ffd8b469a3ae793810043515a966fdb40a7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "25.0"; +}; +xepersian-hm = { + revision = 56272; + shortdesc = "Fixes kashida feature in xepersian package"; + stripPrefix = 0; + sha512.run = "50a3e4a12055aa051f72c8d9d5f616a6901aba7c8dc6777610b48d7e3c993c6a49996cdd77ef01161ca9b7dc588cd9d86b1e1c4e65eab4e4a6d3a3697a990d92"; + sha512.doc = "79b0a6e9876f697b8c7e08d5f5051975d29e9b7b3245b49a74ae5c76bfb23926fb4810fadcc029ee529f5f2752a49c2ce748277da0fde50f5078becff090b1d2"; + sha512.source = "b43f74f1cbb9e2bdd06ca614f17fce49a18018cc3df9f88ec3a4732bd0b4bbf7068ac77a65d549806be4c07a2b7ab16c165fa7d5a9c9401a4dfb60426c5fde23"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1a"; +}; +xesearch = { + revision = 51908; + shortdesc = "A string finder for XeTeX"; + stripPrefix = 0; + sha512.run = "4c204a8f92fe9af0ef1f0da99dfb12ac8f784800f7ef673a116a5f5167556fe49584b9457bebfd07aebace44951327f8a576cdbc8091a7aec776768384c62507"; + sha512.doc = "981e6cc62a2f50815aeb875c46ab2ac83510ea535953629755700650831500410650b66ba070d8b5ddc494792e782fb75f266ffe0fb868318a4782b2f8d701f9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +xespotcolor = { + revision = 58212; + shortdesc = "Spot colours support for XeLaTeX"; + stripPrefix = 0; + sha512.run = "fcc3a800986069cf64c62b2794447650331dfc2fbefe26fc2d537ebfb520acecb6530bff7591a597fac9b108f23781f0faf7c27b97f35ff2358d62c09404a5da"; + sha512.doc = "90ff1badeeb6e2d6cff9797b1af2052b4fa8474279c7b2e9916f7f02c767988d640b57f3d63be8de9f0082e50bb93c1c122b3c1f9bf74132c5c13b1b6b70122d"; + sha512.source = "60aa75660ec567a3015bd8b4985e95aa3387cbda9b239c2d1d7e8bb29fde8d44fc414ebfb195aa3be037a3f4cbe510354e28d3ffc9d5777d054585597e2ab762"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +xetex = { + revision = 66203; + shortdesc = "An extended variant of TeX for use with Unicode sources"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dvipdfmx" + "etex" + "everyshi" + "firstaid" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "lm" + "plain" + "tex-ini-files" + "unicode-data" + "xetexconfig" + ]; + formats = [ + { + name = "xelatex"; + engine = "xetex"; + patterns = [ "language.dat" ]; + options = "-etex xelatex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "lm" ]; + } + { + name = "xetex"; + engine = "xetex"; + patterns = [ "language.def" ]; + options = "-etex xetex.ini"; + fmttriggers = [ "cm" "hyphen-base" "tex-ini-files" "unicode-data" "etex" "plain" ]; + } + ]; + postactionScript = "tlpkg/tlpostcode/xetex.pl"; + sha512.run = "fddc7a48405d5ae56b09fab5f180372972fc7fdd10eb19ec8e2b0f6e1e3bc54d2f92512a6954238c21fbdd75425923dcdf115bf16fe35ab3a850363c41ac99e0"; + sha512.doc = "7fda9e0a2e7f4dcd6a1813cf8fe280f7193aa88a77cbc5891b892112950e5d5e7690328e267805c8b9a24dc735e7991065ee3664b1278fa334f83ddf06aee236"; + hasManpages = true; + hasRunfiles = true; + hasTlpkg = true; + license = [ "x11" ]; +}; +xetex-devanagari = { + revision = 34296; + shortdesc = "XeTeX input map for Unicode Devanagari"; + stripPrefix = 0; + sha512.run = "96eeb5289b4b0ce252eba1daf15fbccaf2cbb2d251a85818b6dd761048532f36355619e37f1f857caf4592cbf85d112d6d48d5944c455ef36da9913529a783fc"; + sha512.doc = "0f360c3f43c6562520b8843269068fc46ecc405cd3a4d8faecddc4f606d69cedcab28950fc1d2e11699e297fe4d70c4c3d50765a2ec30541c237914accbc7129"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.5"; +}; +xetex-itrans = { + revision = 55475; + shortdesc = "Itrans input maps for use with XeLaTeX"; + stripPrefix = 0; + sha512.run = "9c39898cbcfd024f1a274311a192c647e15624fc04a9484daa2d08ac37340a799b4209a5aa91a5e3a96f774d7363198c5a07f66d88578e1998ef3680b10dae6a"; + sha512.doc = "f10eb9651823eace7f56e88e710bb5536a35204b8fee80219419659d0e2f5fcc60c6009834fd9aa215aa42e8291e14786688fe1974dcab943578bd22a40f4ee1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.2"; +}; +xetex-pstricks = { + revision = 17055; + shortdesc = "Running PSTricks under XeTeX"; + stripPrefix = 0; + sha512.run = "59186971a188f4541361df8fc492b3767069b3081f7052c88df5395539807970c709537b074790411dffbc871010cf4d3fbbdb6684c43007477c44be6259b64b"; + sha512.doc = "cf71359ea6e56061848b085da9755fd3d96d2a9d30484b5d5028c7a3dfb52dfbe275c46f17016179a56f90db3b6df4453cbf3a990a709e59503fbf1a576eaf8d"; + hasRunfiles = true; + license = [ "publicDomain" ]; +}; +xetex-tibetan = { + revision = 28847; + shortdesc = "XeTeX input maps for Unicode Tibetan"; + stripPrefix = 0; + sha512.run = "de7d2f875416336f25e8a14f8c743aef87017cc0aeb30b5c6aa9e1bdf044d71d3c9e9a28d52ccbe7fbd2099ca9e47938310dc3311e46399027aa822b76ff90c9"; + sha512.doc = "0bba33024862284354416e55f2f718f3f3220e4a853c68bd6386c013702aa07a3142864168f6d136bb351044dd9ae8b59754cc2a0181a358fe1baad49106d504"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1"; +}; +xetex.binfiles = [ + "teckit_compile" + "xelatex" + "xelatex-unsafe" + "xetex" + "xetex-unsafe" +]; +xetexconfig = { + revision = 45845; + shortdesc = "crop.cfg for XeLaTeX"; + stripPrefix = 0; + sha512.run = "62b130d16ac01845df5acb1a10e487408208b0c4369d58892a83a42609b3dc92589195540154d1e07a9cb528e8e4ca65009dfef236efd53b9cfbce0a942c5b01"; + hasRunfiles = true; +}; +xetexfontinfo = { + revision = 15878; + shortdesc = "Report font features in XeTeX"; + stripPrefix = 0; + sha512.run = "8099f45c704ea74e5bbd90b1817c3ad06cffe3d6da0a997f8471e72cff364d346a3cc2e6f156b51bf7bc3ba149e5c755423418d58be89e1872f84db9c1eef039"; + sha512.doc = "a5a9b085e5dac02d75b83c7063fe653724367ce203c20832e2ef6b11db10e31bcb90745a7b7d65427a33cb018d68afdd4acf9f92c907f91904188ad60f2e1460"; + hasRunfiles = true; + license = [ "asl20" ]; +}; +xetexko = { + revision = 70316; + shortdesc = "Typeset Korean with Xe(La)TeX"; + stripPrefix = 0; + sha512.run = "860352c31f173c31f5b296759e8ff1dc4c2ef58c9db459c52354db92362812a96c359b4e344a5aeb6ab4c52368bb3c409aaea39102e5a48dcb973c285d5f55c5"; + sha512.doc = "7deb9249472c4dce235cfbe38e1e8f5f11a792e559a5708f6d9a2803bdcec68baa7e88fe0a25545896c6f671b7d6ea91b9637a2d75907d667d8b8454597b6f5b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "4.3"; +}; +xetexref = { + revision = 68072; + shortdesc = "Reference documentation of XeTeX"; + stripPrefix = 0; + sha512.run = "a26a066a25162d3f3484158b6a5d3e3f44727ab5b7e3d3d9a4457fd80e92522f09d61015a4a3b0fea4dc63987ef773c8850b6afe8a50fa5ac2ed58cca51a4ded"; + sha512.doc = "d0f2de750f04ce63aeecdf00a5f0628978c78afaa753f8dd2b41a819c76bb0531bee8906d4eb2014075cf4d0202b6c1fb41a9093120614478045fcb0820a70a9"; + license = [ "lppl13c" ]; +}; +xevlna = { + revision = 43864; + shortdesc = "Insert non-breakable spaces using XeTeX"; + stripPrefix = 0; + sha512.run = "69c80d5243a4af96f2dd8092926d2766bad5d6beaeff94d6aa2f184a68a45fa50bb3abb91a4652d8c5e5617073aee9caddeeb73fd5399965f477be7075b7ca01"; + sha512.doc = "d0d033b646314eb250b245575ea2361b6c12f13eefab071c2b9f91524b08bfceb9fec197c3fa5f61e3ed19caaf4198e69ce1305bf1eb2daf1db6e30365eeac48"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +xfakebold = { + revision = 68929; + shortdesc = "Fake a regular font for bold characters"; + stripPrefix = 0; + deps = [ + "iftex" + ]; + sha512.run = "96d7c43d4aa975f5e948038f07c765397dfa240b41daee453064e8c7abd90a1a52cb8af02715de51b6e56aaacc4f8e6f72e40c562371541ac94c00e2f5b6aa2b"; + sha512.doc = "11b63158d7e780d390a1d4cb4d046108fa34212431d41dec582404047a8fa272e625898d4f1181fd8728bba789962b63b5462a9ea5556fb896b68ad2eab3c038"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10"; +}; +xfor = { + revision = 15878; + shortdesc = "A reimplementation of the LaTeX for-loop macro"; + stripPrefix = 0; + sha512.run = "6e3ebe83dc39a87aa86d5f173f56893ab1678253dc18dedf16c5d4a2df864e21b9b6e84c6bda56e2c624106efb2f73c110964948e4d553848bbebae87f05bff8"; + sha512.doc = "e75b3d57c09e1580282f4002b684645aa21aeed4f90626b7e439f30dd79edec9c6f23492eef83b67e9ccb885c001caca6201d43b5182632a5b38ba5f67488b52"; + sha512.source = "508dd3c696da5287cee35fbeca12aa60667908f1f456a9d1333197e76b707902d281e83146b81e0a095c168054ec96013074f5b0bc236e35cb17732f4158e2ae"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.05"; +}; +xfrac = { + revision = 69888; + shortdesc = "Split-level fractions"; + stripPrefix = 0; + sha512.run = "6a173abe1f5cd65db836157fa336be76bc9879e137f2542b3141bb096359c3bae771705a3b761730e1e3bbc7d623cc08ac46f87af7412be4fa4d7f42a70ba9b9"; + sha512.doc = "292b12956c4236510024bb3c85b4b1aa791de4eeba14dd88affe264c6384080c2340eacbeb19592424f2231e8347ae6d1b4fc32eda12320dd694557a982aa80a"; + sha512.source = "f22458c874e394753b0dc6296a86a2dc6cd8df8f03ff3f84e09118bb0069d84c2de56213368cf351ee922e8f753c3348dfac7bc4d9f496a3aae8302304460136"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +xgreek = { + revision = 69652; + shortdesc = "Greek Language Support for XeLaTeX and LuaLaTeX"; + stripPrefix = 0; + sha512.run = "b7531fd3f5c42080990022689e5e4d43a0d16f9fd206e389bdaa0aa8c9345e062dc0a14d3086fa0b6c8b641a646edde9b7031af91664f1dde56e5581f2019882"; + sha512.doc = "0221363435657925da4f8edc62b08b9114beca5cee39c410d57b1661a6b6f084761a0ce0be76968193d950b427aea5e16844b099a386420865765b569dd4bf8f"; + sha512.source = "34ae0948d3ed0343ebb4007997e3dd0c536f6893d757a83082a031e2dd5b3f4f13eb6cbb6ccfbe38b879e6a2521bf13d9e5a10a0c278c5caef1300114f26179c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.4.0"; +}; +xhfill = { + revision = 22575; + shortdesc = "Extending \hrulefill"; + stripPrefix = 0; + sha512.run = "cc0ea9e9d40a590444801359c455716856c807eb429aa01b460fd7566797490932bd3566a5c6f95bd6723e0b05bde1aa632b83383c8bcdeba8a455cb84ea9f1b"; + sha512.doc = "027287d941c4576d7f55a3d618e13cde5348ac072f3e546dac6f8a8814efb982f9cd0c4162866403f946d07ecba0ea8cc15543cafbdf9008d60b78d0ea3d26fd"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.01"; +}; +xifthen = { + revision = 38929; + shortdesc = "Extended conditional commands"; + stripPrefix = 0; + sha512.run = "21c5882ffbde05c50a6536fbf19f812a3ce6381f565227f61c8062281a2472a105bf6223cdc03adebf275fa23dbc1ebbb967349c715f20d1b516f100f820af3e"; + sha512.doc = "52ffddbfb4d0d579849b7a89d30bebe9f1d511751c89012712a8ef73ae3f4eb8799ef9b3755dc957c47fd874f1ce76b3ed54591d59f7e4d9e1851c50aff3dd4b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.0"; +}; +xii = { + revision = 45804; + shortdesc = "Christmas silliness (English)"; + stripPrefix = 0; + sha512.run = "a5355a456005e09eac4135735973a14a6add3a31639fcea441d8d6a7c06e7a7efbfc1470d485ab317fa193897abc2d9edeccadd19239944014b7fccecdda52a3"; + sha512.doc = "c9b348da09c3a9c1522eb7713a17a58b3eabf4ff8ed52e8d14dc9eeff528ed93af505b5e3cb59c1af4c2ce999c6c1d98f66d026a6ab3d7a09778230286059d84"; + license = [ "lppl13c" ]; +}; +xii-lat = { + revision = 45805; + shortdesc = "Christmas silliness (Latin)"; + stripPrefix = 0; + sha512.run = "e4538ac31b6508371ee156168d4da71644a65297b91be7f070291f35563a45a1ee5a528d25585bc23a4690e8fc5c6ad04bfc829de4e95f49468a5852fac9e822"; + sha512.doc = "50322d89f494d07793d964fe515b8a0bacb74bd5706a6da80f6860771a8e3cad35c7d06bf398217a7e4364594d54f4dc490f39980194804a04460047ff5083f8"; + license = [ "lppl13c" ]; +}; +xindex = { + revision = 67771; + shortdesc = "Unicode-compatible index generation"; + sha512.run = "bf812f7ea5f981969b1963f470a0006c4afd937ab27f6b40f7897dc2b6ddd1a0ae60f347b8ed13483ec4fd9feccff257a79dd7b8a2720be1d49a40fe2b325fc6"; + sha512.doc = "ec93cf3bb639326dc6905be018481da8438ebc5558e4c161419910e1a4427f6f7bb7bbf35ac779ea6769b6c009f9b6bf657b78c7c42bf7100725e8cc6252c975"; + hasRunfiles = true; + scriptExts = [ + "lua" + ]; + license = [ "lppl13c" ]; + version = "0.55"; +}; +xindex.binfiles = [ + "xindex" +]; +xindy = { + revision = 65958; + shortdesc = "A general-purpose index processor"; + sha512.run = "9b7fe97c14e3cf30d1e6743c2d7b4460e8bca901ba3ee216001f1518ff4d834fb3d9b67085825a6e152c6acde544c41cf16d56e609016caab89a594305a21599"; + sha512.doc = "d0dacd7cfa169b03b7fa9d0b351133582577c3908323f501d7bca7b0165159b72c34f62abfd73b97065baef8cf179b292e654759f3b3e324112623539e5acfd6"; + hasManpages = true; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.5.1"; +}; +xindy-persian = { + revision = 59013; + shortdesc = "Support for the Persian language in xindy"; + stripPrefix = 0; + sha512.run = "07313253d80b5ed6494e1189088908e03590424c7d24038a437dcbe83637db9e426fa0989fa202f25f62e112cc77df3c4acef111bda6c8b44dc2b2660af959da"; + sha512.doc = "3868c7f2c20e22cfb3b1ffc61c830581d774ca909c4fc450586ed0bc82a091546efc46540a883e667ac5ac7d292a4786019384afa741599634a2fc05975c36e7"; + license = [ "lppl13c" ]; + version = "0.8"; +}; +xindy.binfiles = [ + "tex2xindy" + "texindy" + "xindy" + "xindy.mem" + "xindy.run" +]; +xint = { + revision = 63562; + shortdesc = "Expandable operations on long numbers"; + stripPrefix = 0; + sha512.run = "7c98cd18683bc57dbae80c74fcf30995519f5c6176b5af4865ecf3adce844ac0a58c5cef2bb96e30f9d244da37effbc0b164a544dbdfb9f69ef0314c0be1436b"; + sha512.doc = "a1ecb80e4ebb43b5b3979493f426b89d7b952c03a388f3eb36d3496506820b97e15926736f44f94195336224e3d382139458ad8c6f6060bb5129ce4edf9d3e39"; + sha512.source = "c05b56b92a09c51eaa9a3e12bfe52e85408efd97175a2ea8f1c504bc5fcb6800776360e9453b970d048e97b129da2316ae5fd5c257978c3423bcee04f5c864db"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4m"; +}; +xintsession = { + revision = 60926; + shortdesc = "Interactive computing sessions (fractions, floating points, polynomials)"; + stripPrefix = 0; + sha512.run = "d1e279e733e37d6ef163a1dc537f5c02119403710a930f409cc6cfa55f1c08d9dd30bf4aeb14b68e4080442137a7352207ca8dc9bd7f859a8d19cf9205b68c1d"; + sha512.doc = "1a99ce3ce5e2a311e1dd4086f416738c48cbd42ad0b37c372fffcb0a4f035b3384f1b4963cccd2b602164f256e4bcb8d9b1d3efc56c99382e284d6d97e20b7c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4alpha"; +}; +xistercian = { + revision = 61366; + shortdesc = "Cistercian numerals in LaTeX"; + stripPrefix = 0; + sha512.run = "e0b4db57c0c3b819f1c653f097c6adcad1d2b74409926d5e0652fed4aced3be5b82ec5f663d85769261fb62e89d16bbe36ed87e6ca2352ab9548fd322c6b7b5a"; + sha512.doc = "673d6a01619a36fd8db88ab056a8560200e03de519799b867583d6fe0226a25661245e4942a1e2b13a23d2913a137736f6b10ecb25962e0b4afbec8e2b568cf5"; + sha512.source = "8c305d95953774aaa5e181a3ab2f904b6faceb2387a6b4c9dd4f6c11eb3ddad4e31088a11db48d2ca2a0a72911f5cff1d3bf5bf37a933ceb76805a6265d3c816"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +xits = { + revision = 55730; + shortdesc = "A Scientific Times-like font with support for mathematical typesetting"; + stripPrefix = 0; + sha512.run = "8c47de766f965fcb50399e59d20f030e90a28e2aaac018ab1289a1a26b16cd6c9c7d3fd18f1d2b84fe86a99734bbf2ac9b58bfd723a7854bfe29141ab6acb874"; + sha512.doc = "3c4594f4023f6ae4dd6ac57841720a47f00ae65fcd6930d4e8ec94281a71bf97e7acea26c60d6866304b5018e866ae87554cc470e671d47ede6572da1ac2970d"; + hasRunfiles = true; + license = [ "ofl" ]; + version = "1.302"; +}; +xkcdcolors = { + revision = 67895; + shortdesc = "xkcd names of colors"; + stripPrefix = 0; + sha512.run = "3a2c40713d8e826c1bc09589e56ae6cf661a73cd32bd8903f80f51d71fb79ef34c0be9395ce2f3915fd1ec1385e970945eb00ed0f9f598294363742fe13f4d8b"; + sha512.doc = "85b7b920d701a6e6752ed78ddf718ef99b7c6684441012feb5bdf2937d3a16ca8a89033e2a5eb723888a52a913cedd320a42c2b902696f876437e9f912a05aa9"; + hasRunfiles = true; + license = [ "lppl13c" "cc0" ]; + version = "1.0.2"; +}; +xkeymask = { + revision = 69223; + shortdesc = "An extension of xkeyval with a mask"; + stripPrefix = 0; + sha512.run = "1502216d5f8b5b2f15317f7dd9faabd11e06232a093a74a64a7114b5f2307e7e96065810129713c679d4aa4d2e622c6a1af8dfb31719b447e9d8fc1e8026e027"; + sha512.doc = "812473ff009eceec4cdf23cfd89dec769566f2027e528745273061047b4abb3b5b62426492f30755090c664f61e33b675d333cb0e9002869339a4636e6fb260c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xkeyval = { + revision = 63616; + shortdesc = "Extension of the keyval package"; + stripPrefix = 0; + sha512.run = "e7f8355a0dd505af021d413b7e1ec605c083b9e552382eec48de85a1d037937696fc0a5949a4a8cebb065dd339c70742863991bc855c1ffc82177571c16cd313"; + sha512.doc = "f7948832c943d3746c3115950259430724abee49316aaac0343e0959ddce796ab8064583d048f71ad39332df966557da9a2ec3c2752c16b333cc55bcd2cf3c7e"; + sha512.source = "8eedead41d620e3561dc120e16d745a18e475107ba3144802200bd043cee93efb2062052ca220da4a4cbbc431e7d432db1d217ed3f4c8430526ebede52cada1e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.9"; +}; +xlop = { + revision = 56910; + shortdesc = "Calculates and displays arithmetic operations"; + stripPrefix = 0; + sha512.run = "6d1ebe5d3870a07175b5c07840dd2170f2309790d1b828df69b716aa83db1a35ff70d265a33d8fc0f6ebe0c4385b7fccee8445ab93b2649d3b27bb65e41f87d5"; + sha512.doc = "9e1cdf96a23bd468c2e4f358ade19c509685563376d5a7ffedf5cfc122138b14d1075c7ae8c8a00261f789d4010a9df7dd5b1e6a9db5bc7efb067168e7866540"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.28"; +}; +xltabular = { + revision = 56855; + shortdesc = "Longtable support with possible X-column specifier"; + stripPrefix = 0; + sha512.run = "6e49b4a2adc351394bf5ab5cc04d532c36196919a4de8be1ecdcc22c6f226a2d035987df9aa70144d701d9fdeae1dfa07280458a934e289a5d1b5976b2be3ce1"; + sha512.doc = "daa1f1ee3092d545b3949afa781e40a576a8a3ab1c20e40237d83c14455fcece353dee03161ed1725d3f54c8963ba94c683ae0874a8668c8e5c27ad3b58f227b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2e"; +}; +xltxtra = { + revision = 56594; + shortdesc = "\"Extras\" for LaTeX users of XeTeX"; + stripPrefix = 0; + deps = [ + "metalogo" + ]; + sha512.run = "ff75c7b2f36f0e3cdc466dde35d83ccbb76c9c95f5d191a5498831247d1d418b69a8f0df8b263eae78e4a13694e628eba64c24e7480c7dbf56948cd5b1504a76"; + sha512.doc = "6fc84121dd3486f5f7744d757520e2b4d7baf83686e2630990be7e72ccb121e5b417779e4682e6e8a566b016a8995f80d7d4c6dfb3d6d2c9f70ed506bee99d64"; + sha512.source = "c177b99366479f6ed5ef935be07fbfc3425b48f2c3d274e175bbde9c63cbcc93ee4bca4c3c2886fdc2894b627332ff7edffa5b1083ad86dcced56bfb0d9fe03f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7"; +}; +xml2pmx = { + revision = 57972; + shortdesc = "Convert MusicXML to PMX and MusiXTeX"; + sha512.run = "9545fb5ca0e95788afab79d8a29336f337619adbcac68472bb5de6af6c54187f19bda655232175223168891c064f6fadc67c4ab8f5a0256e2c55e1a65c5e6f6b"; + sha512.doc = "973960f65159f5107caa7e9a041dca75f0171fc61f94794c7b7560eb9b6898534974fb8b360a28dfa3a01d422b71618bcaf8aba2ed25ae4d4b9f67d24ab730be"; + hasManpages = true; + license = [ "gpl3Plus" ]; +}; +xml2pmx.binfiles = [ + "xml2pmx" +]; +xmltex = { + revision = 69742; + shortdesc = "Support for parsing XML documents"; + deps = [ + "atbegshi" + "atveryend" + "babel" + "cm" + "dehyph" + "everyshi" + "firstaid" + "hyph-utf8" + "hyphen-base" + "l3backend" + "l3kernel" + "l3packages" + "latex" + "latex-fonts" + "latexconfig" + "pdftex" + "tex" + "tex-ini-files" + "unicode-data" + "xmltexconfig" + ]; + formats = [ + { + name = "pdfxmltex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "*pdfxmltex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" "tex-ini-files" "xmltexconfig" ]; + } + { + name = "xmltex"; + engine = "pdftex"; + patterns = [ "language.dat" ]; + options = "*xmltex.ini"; + fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" "tex-ini-files" "xmltexconfig" ]; + } + ]; + sha512.run = "60c804d65c5d1f7c2d006e410be1dd6001ebc8dd96b7829c77bbad88685a1e18afb5ab8dd42e7c2542df02d0336485766b9bd7f0657b6683e55d7a1e444d4580"; + sha512.doc = "017d8d30a8371fa2a22c60a57b9eead2e3f2f9fc88aca858c701912d40af5212f6a58b77fcfba53214c98eb23142c08962827312010cd6474a0d66911d55ba85"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8"; +}; +xmltex.binfiles = [ + "pdfxmltex" + "xmltex" +]; +xmltexconfig = { + revision = 68933; + shortdesc = "configuration files for xmltex and pdfxmltex"; + stripPrefix = 0; + sha512.run = "a377856b79abb94771b54ed19e6f5ef02ebf80374ac868be2905dc23f36d821c79ea9a99077233edd5e125278e6d8bd44c40de50dfd56e389cb46c76348d51e4"; +}; +xmpincl = { + revision = 60593; + shortdesc = "Include eXtensible Metadata Platform data in pdfLaTeX"; + stripPrefix = 0; + sha512.run = "49777de1160b2ef53d845ba08fb0af29eb5f06c6fc534da4856bd0f02dbed2dbaa73ac24c45b1e787ea44d08199b7d1c462dc21a972cd1815fcbf65a08388f26"; + sha512.doc = "b8750478957f6b33163ef546d7be0c0ba4e5906d64a72cdf3edda33c663bcf7400eaeebe3119a175f21093a1b00bd2626df0156c8ebdfb9cdd076bc8d7953ac7"; + sha512.source = "48d8805d763169bd3024227edac213a5e57d207e63895492cc6f0a25ef38b82fe9d8fee76ea5309344bd397e4c5b70f8b72892d4054307bf758fb81cc8af3bd9"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "2.4"; +}; +xmuthesis = { + revision = 56614; + shortdesc = "XMU thesis style"; + stripPrefix = 0; + sha512.run = "3c9bdbd54cb99bddb9356586a1ba16d8e0ebe10d0120f6d6e7ae1c60375a41ce9ae9c01eded07b122aa323ddcb0e3ed9c68f6da6e716915f523e77bb343ee665"; + sha512.doc = "07e9b8eeaa864efbe6fb8e1c54e183a65f177b81454a2abc049e2efef8fae1d61a208273fd3cecb9d8bb8d601266f1c4897939c52d43fb5dff92ecdd3855c322"; + sha512.source = "9f3eaaac30cc9f396a3e33f6216b56485c27eb2f855b511642204025c27b40a529aa6dd1952c753a1fd50474ee6c5ef020f859dcc71e07ece39df090ed7ef46a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.1"; +}; +xnewcommand = { + revision = 15878; + shortdesc = "Define \global and \protected commands with \newcommand"; + stripPrefix = 0; + sha512.run = "3296d6f9b580699e86ee01da444ec9b3cf7b76775f05529cc9c4dd931da5f887c914665651214a8107be612b18cb286ec039ad9ab3de520bd17090b38265d5c9"; + sha512.doc = "e03b7027a3956829823e92bd4d8a3000d8f79f26558875ea3837adc9ca4a17ce75d9d4e9136d7ebda7bdc8fbbf4a1b44fc6f71d1bfad710d2e22bba8fab24292"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +xoptarg = { + revision = 15878; + shortdesc = "Expandable macros that take an optional argument"; + stripPrefix = 0; + sha512.run = "3ee6285ecac00a20781ad530a7ca1ef35a94efdcc31d29084e167cde75c51b4bdd644bfb5d25390c3deef44fa7b09e479b6c616169ab0bee1e83d4e37338e00d"; + sha512.doc = "1692c6700b978cd05cde7c0d45e970a4cc8f783d53cb1e2fc57639483e728ef5dcf29bc7563c9ce42eeaba72da93b36e366876494f3680f0fd5e8eada08694bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xpatch = { + revision = 54563; + shortdesc = "Extending etoolbox patching commands"; + stripPrefix = 0; + sha512.run = "d96d078066ee7cd39585754b0ed1aa2bd5680f90eb2a879bb2dcb47cfe834094f0b5fa1373ecd7f80f626c1a8a8fd4823525c33fa0e67f63b0beb4031a35956e"; + sha512.doc = "49479d5a73beda78852f80f786e559caa49b51a44c79e73d689499429ee177ccc1a93064122c13e5cf4e34f00350df3e18fc131505364dd8cbf218e851249e8f"; + sha512.source = "bed0cd07054aa93d1bc328b57792c79ae90c3f5feb5b6f86e76b4b7c4a2b583248c19b9147d268e1dcb16c107b0dc18b34fe13f537b10042839a46a98b5afb25"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +xpdfopen = { + revision = 65952; + shortdesc = "Commands to control PDF readers, under X11"; + sha512.run = "927b6a17422a3573efef6767f4835492df27764bc7fe729ed2697665d5fca697fe1a76e141ff30d5cb483bb4ef8e2021ecf2476c5bdf83ebc5dc6e7778b70765"; + sha512.doc = "b4f332054a5fe85c9404a05673b373ac2b1275b79a1f0b57061cda614350df230dba60ed3be590e0688840334a113ce5c64847c1dc4e6ebae6cc29524c1f6bd5"; + hasManpages = true; + license = [ "publicDomain" ]; + version = "0.86"; +}; +xpdfopen.binfiles = [ + "pdfclose" + "pdfopen" +]; +xpeek = { + revision = 61719; + shortdesc = "Define commands that peek ahead in the input stream"; + stripPrefix = 0; + sha512.run = "1b264f383d76e1c213aab0ac650a934ac6a91eb8dea8122229b2ac6bcb6ed694d62acecae3882b41abf34bd016922109064de0775f91222ad88be8287bd62931"; + sha512.doc = "0633a7a51a329ff6849d080bac626b4174567823b8c597187f62158004a8df647fe40653af371d55d6a4743991fc3ca650e034f68e5b737448245c7df79cba84"; + sha512.source = "38165be35b6fece20141ab61b4e212d6a754d2971e340a0f98bb02468aaad6b470aecbb5f4887969a987c9e7c45be109cac5e190b534264caced15fdc803f14d"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.2"; +}; +xpiano = { + revision = 61719; + shortdesc = "An extension of the piano package"; + stripPrefix = 0; + sha512.run = "892f018e4bcad350e4418b2724b6bf2d18aca9f74aa01eb10906b90630b36ec3497a0b96b293e44ec136eee22648b53a13d7a9b614a36c0b79f5a7b94dc37403"; + sha512.doc = "467da8be6903252b1d1a9436750b8d2f0f5eb1f1f7ad1178acf0a1ddbea253ce38ddc842c89ab6a22c4bb72ec311a2ee2536dee5834ca3ead427c36592c35100"; + sha512.source = "bfd5a1dde7e05755f3c0167f16b7af2d83881b25d31e96644d18d193f4afb8f9f359b5149fe4534e43243e9364c1ab6380576196422c79077c82c4269b7619a0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xpicture = { + revision = 28770; + shortdesc = "Extensions of LaTeX picture drawing"; + stripPrefix = 0; + sha512.run = "1915b8b9acb3db8d4f8ac4fbc0baab55d6b8352288852f20d066a3f0ce4f7dd0cd4d2d70ae2d2e29aadae0bdb272fcb237146379313b2900accaab2bc10ceb79"; + sha512.doc = "dafacd0f38ca6a248f701cf48381ce0a3816a693150118ab6a7e18f818814a1b54435820dc8c11135146cfde3d40a08a0f2cd78bc54a9ddb450bb5c848b99e84"; + sha512.source = "e49b8512ef83ec38f20dafa1e5f191cfd4c2bbcc62016f209be06f969cccdf3cec9545a24756710c767946f8c532074d53de8a6bacd6c565fdf49c579b0cb6c7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2a"; +}; +xpinyin = { + revision = 66115; + shortdesc = "Automatically add pinyin to Chinese characters"; + stripPrefix = 0; + sha512.run = "3b7eda4c75b90284138c1277657c8f4a3c2c9a3374a2d6f80969e78805ab8f0c03bf09e5aceaaaec689582dbe30a82b704e41ce08305a0b4b869a84d4d07678e"; + sha512.doc = "f233ca01195f0f3e236414c02cefbb8da1adc24d6ea94fa56e98ab8772f48456e4bf469f6def555a01c29f8a258c352186d7bf7054db2bbe3843ed937784a440"; + sha512.source = "f4775152d7879b352f6193af3036258ca984a195abe6de3c03baa41325a7b1fce3900facc2f3ea8fd2deafd3740128161ccfbb2a37eb88fae196a20136f68dd9"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.1"; +}; +xprintlen = { + revision = 35928; + shortdesc = "Print TeX lengths in a variety of units"; + stripPrefix = 0; + sha512.run = "dc446adfe453430d5e2c9155acaad26e258a36319490a5158f0874292e9e68c1eb61ba57e361b5ff8bfff84c3b4a359709525f42599b95e9ba19ce9e28f88423"; + sha512.doc = "5905ee8d3589b7d75388e6e2355639435f3a72fa99abc17118068069715ba7220fa3d69f58e046d7972814bfa3834222858bc8933562ac91f83ea250f0952d82"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xpunctuate = { + revision = 67918; + shortdesc = "Process trailing punctuation which may be redundant"; + stripPrefix = 0; + sha512.run = "a90da49b111181c61512777e4cbccfc63710b19513309bc2a04fad0285691095c812e7b8feaa0427cd5e837bf644458229b78c2bec530b01bd772fcdb18a2bca"; + sha512.doc = "8a7c873e8fd809fea44c136ef5b810f6e5d6213f48806cffb5018645d2a0252fb45b0de029c1f070963d4a584983c88e8c2c7661f1dd2f7cd4407c902ea13880"; + sha512.source = "5e871cab9151f51e1b05f0266d42f872a3eaa27a0a801e517219e400f7be808463038461fe45d1d748c05085dc605545e5b2c83250413138f19649d5af84cca2"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.0"; +}; +xq = { + revision = 35211; + shortdesc = "Support for writing about xiangqi"; + stripPrefix = 0; + sha512.run = "f1fc2f43099e022aaac631d4ccd1e5f5b9a9f23db6f1c6c3adf59d47dca57c25728f81ead0ab62d07b9bea6219e3121874c55973b54e826b1a70c5e4fd47c853"; + sha512.doc = "cbef1b95b4db328cc29d5f4fef544459b893cea82838e9e1f2faba00dd8fc78bd12d36931dba4ebe76cbe985879c30b8606df1f2091fc8d2108311350b2ea339"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4"; +}; +xsavebox = { + revision = 64049; + shortdesc = "Saveboxes for repeating content without code replication, based on PDF Form XObjects"; + stripPrefix = 0; + sha512.run = "a88227b8f3b8adcfb3de271307e97c13db9da52c9446efa69ebc9b12289a59b2b92b608dd87dadf4837f0501599b74775671cc4e529a99ef37035dbe171cd66c"; + sha512.doc = "4acb0dcab63edd326db7736bf4632f375e4e1dabb1eab0969c0255312f6207871f087cf81e2a01bbfdb99ce956e568d6331cd82346feeae966331569d2f0c3a2"; + sha512.source = "5843edad34701520c35763cbe3b66523a67f11299affdf4ffcd213ac3abc8d67b9e7cce05610132fcbad3639412f1fe04df15887d1e671c06ef066a0f859f231"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.18"; +}; +xsim = { + revision = 61988; + shortdesc = "eXercise Sheets IMproved"; + stripPrefix = 0; + sha512.run = "daaf1cc1ac8c34c4a63de3a16baabbcb661177172892bf4bf85e588cd150e8736b5b3ef382656c4ca5e3486f93889bfe00a9895988284a3fde84caf222e9744c"; + sha512.doc = "a020e1c60dd909ad48607b315e63d2225a9a884f2939f1cba2a783e9336b86dc002e1fd771469daae9a4c16d80b4c9263f04a545b270ad666749d5d4536d3e7c"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.21"; +}; +xskak = { + revision = 51432; + shortdesc = "An extension to the skak package for chess typesetting"; + stripPrefix = 0; + sha512.run = "202f61fffbf22346ff6ad6b2b8f411b2a8e4f58a9d53e5613810f2fe0b56b0c73867f0c1c293bb0c1f0edcd4ab73135ae33a953d3709d2d01060c1b638842dd4"; + sha512.doc = "6256df468580dcee451e4a650ebab0323c92024e9bf872fd683af1f10c19221887b5bd1bed7540a517eb6716627e689759b7ceaaa2944869e18591fba5467114"; + sha512.source = "11119e38b4f21663e36764d2b9e7da22d9493de7296590db4beefe185b2c9e89224806257d3880c78b07c3984478843b1886e37e5a33fc798920be221789de04"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +xstring = { + revision = 68015; + shortdesc = "String manipulation for (La)TeX"; + stripPrefix = 0; + sha512.run = "a7373745f3ea8f75b73cd3af280743db902a683f16a9820c214b8b5a92c72314323173a966b5356d78cba667978f677f42ea10b54e98b08dec29202ba8e67b39"; + sha512.doc = "c9ee24a7661c7dcf4f7cd1b657269951baced39e6d40f5a6656d491120c9fd90034d9a4a226d0f714909e7a03fbc474f6f7a355d4138ba87906d950e1156c884"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.86"; +}; +xtab = { + revision = 23347; + shortdesc = "Break tables across pages"; + stripPrefix = 0; + sha512.run = "e308d3ae3ae32b945450b319834dfac19b6006cb0ede7f21a91999b840528927aaca7cdc330a02ebad874602d6d268fd1fe609dcb52bef2757b2e0417310e012"; + sha512.doc = "10a158bf2d50fa89355654da36a179bbbc5d30ef3efa8a79537de66c50a892f540938cb364e45896dc079266d5e47bfc2c74b8cfe01ec1691cde34bc221e4ca2"; + sha512.source = "0ae0bc4d96f8b7c4dd5bc62d56538ef5e8f5d8d8ecdb114759209dedc722a2aee1b646a27cff611bfd2ec9ac96f0633393cef9d3a13a6d54978740b28fcc09c6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.3f"; +}; +xtuthesis = { + revision = 47049; + shortdesc = "XTU thesis template"; + stripPrefix = 0; + sha512.run = "5d9081b8d197952aa5ff58b1cbd490bb529cbbc1b72956cca8dd28b1b6bc12c6248d3d04fd457349b30df7594aa1872ce9c8438feb67af1b93ff0fd33eefcb7d"; + sha512.doc = "96e94598e3e397a9657a83496d940aa2525fdbe1ec2cf820b05e5493b1f3e1c45568e16b62c22d4ee25afe2bd0657848a433477e82cc8038895c2195139ca065"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +xunicode = { + revision = 30466; + shortdesc = "Generate Unicode characters from accented glyphs"; + stripPrefix = 0; + deps = [ + "tipa" + ]; + sha512.run = "f49628013bc54e82bc38a2c749ddde9426c65716f04c5c8d8264398b9595e571d380e07c045db9e7ed5d6df7d0b7b1f8e81eaa28d6b67a6756d2c5023b731176"; + sha512.doc = "fbd368180c97649944aa23fae4f50f8a8d1aaa776f643ba520f121b9aae196dca94c11906f9d5b2f961b6d494256329670af1f4563502b44a8fc9633e29373e0"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.981"; +}; +xurl = { + revision = 61553; + shortdesc = "Allow URL breaks at any alphanumerical character"; + stripPrefix = 0; + sha512.run = "df2570d0eefb64df3a0533237ea09f00b9e22be0000134b32de40198649a6e98ee48a31d769dc750847672be7e3577fcd8eabe25e1ae8ee493d77e40ce684147"; + sha512.doc = "e02cceecac468713453432e118dd1cbe3f872a4dc33fcbdfc769861f353ac4ff5c117f51197b297a4eadf295f75f1f0254585ef0a48909aa004f4a598d796491"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.10"; +}; +xwatermark = { + revision = 61719; + shortdesc = "Graphics and text watermarks on selected pages"; + stripPrefix = 0; + sha512.run = "c8b7e89cb39ef5b3f01f24a89cbdce729ad2061a0b3a1ef504933ab7e116b4b67ba8f1a68db74d46839bfbb60cecad4fc459fdd5d913716ad6542d8952ffd926"; + sha512.doc = "a812651c587a76e086076bc8c810dc218431b40aad223644001f42d098962a401246781e0f83789afb3407fd93a0379755f82e30d815c14b4bc72499a9d8d26e"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5.2d"; +}; +xyling = { + revision = 15878; + shortdesc = "Draw syntactic trees, etc., for linguistics literature, using xy-pic"; + stripPrefix = 0; + sha512.run = "5f78d2d61050d9ed84d56136fe59b4674f4e03a536015e3ebc3b9500dd8a08878164ce9fb1aa9ca9a1262a000149061f3fe22f10cfd68941316aa186b81fe923"; + sha512.doc = "7b4ca312ea917329260eb0a19bd504ac2f3ddfb5f066806296b164fc541bfe26e6ed1c03ffac5b52af6b19fb4ba1e77b5228ac4b4db0c2ee8f2394fc0f888d09"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +xymtex = { + revision = 32182; + shortdesc = "Typesetting chemical structures"; + stripPrefix = 0; + sha512.run = "9f0f14d1a862622ad0ef695a58f7dab554daac8d5151193a70c94ea872d16fe8eb1a763d03b226b08583db484bf576f5a41d2070d5396ac323ed00ccb0daf5e1"; + sha512.doc = "0e2eb5439f2e629da902e4c7d7ddd2d03bc4d654c4ee49e6b005450174acbd70760b52c9deb446ca60efe7c0389403584b86a6f9c9964cf24858b13cfccf7ed3"; + sha512.source = "d805d6fcb72fb801001ad80fe43ee36126c0764f8baa96dff9fffcf7452bba8e5cf42cbca6a50b89f5925607c277b3fb7408f8f7e6ab087edbade0dac294252a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "5.06"; +}; +xypic = { + revision = 61719; + shortdesc = "Flexible diagramming macros"; + stripPrefix = 0; + fontMaps = [ + "MixedMap xypic.map" + ]; + sha512.run = "431451f2028cc87d2d22b4d6ce95ac8f216755da312301195ba7af46146382cf76c27f9964a94817e90afdcdbc7a01dbd887d45808296984fa0b3a3a1770b46d"; + sha512.doc = "9664336d5bd14145603a8c3e861f8fdf062cd4587b8f739a29d93ac78a946c06a0985da4f011030df575276bd43555e55ba467eb4c640d60b2db0a07be706908"; + hasRunfiles = true; + license = [ "gpl1Only" ]; + version = "3.8.9"; +}; +xypic-tut-pt = { + revision = 15878; + shortdesc = "A tutorial for XY-pic, in Portuguese"; + stripPrefix = 0; + sha512.run = "291825c3461b397deb825266c7ee4316c5d04b8db1a29759378409de55c20d81552e31260468f4fa6a9a04f04705422714a8ec70a866c87fca2f4f1e189e0e4e"; + sha512.doc = "e27dfa0b36341bcd02ba63a8b543f1a6c55c674745cc790543ea2cfded80e536e5901f184a3af62b92b4534c738a06bf4fd5cbd4dfb4da865d13991279309aac"; + license = [ "gpl1Only" ]; +}; +xytree = { + revision = 15878; + shortdesc = "Tree macros using XY-Pic"; + stripPrefix = 0; + sha512.run = "fdabfc451679f7ef3752db2537a7dd51e9c0fd34337e429f24e44728ec1ee0a9b97fc2f176948440a5c1cda609182f60d4c564ddcd76c70e84410cc6a0b1f371"; + sha512.doc = "0e2b08c8db25a5bd992c8aa843d8f6fb2e0efb3c11ea9dd0ac69106cd71f58996f73786513e0ff13bfb54932f468297edbb981e3efccfec2652f80bb02fc6ba7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.5"; +}; +yafoot = { + revision = 48568; + shortdesc = "A bundle of miscellaneous footnote packages"; + stripPrefix = 0; + sha512.run = "75ab34d40fb051000783abf573f4507e3791ea5aa1cf4b8571ad16bc020f10d17a49220a2878e5a2791fb7f073613ed20d72cd5618feadf38e290ee4f047e615"; + sha512.doc = "322e9cd25fd7686c4325d04bc7dfa00aee45fe993bdb730ca3669cf860b7cbae1dc76483fe3dec11e09ad848f166a01f43ad0885e0e9fe324ef28d28a7d2b4ad"; + sha512.source = "5159db9c0f8e1f1ba4fd265c1188c47271b6da4290c33f65e8284b0c95d8144a3219951e13c1fb8e7fc172f2cd0094cc73d63fcd0cab67908f6542881930d772"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +yagusylo = { + revision = 29803; + shortdesc = "A symbol loader"; + stripPrefix = 0; + sha512.run = "f6f367155aa16ab0133957fea3c099d4e839f248a87ccca430e43c08257b2aed3a11c77ceaf8484097910bcee2dfadf260ab5047fa7f0244b43bcf332f367bf0"; + sha512.doc = "0ba73f1c7c7d7d646312f8a3d35c0d063e792ebae45c3e869565f01ef65e14f31bee463a1ebb8ad60166d54cdc23a9d21684675a6ccb09b8da233badb0d0ad96"; + sha512.source = "0bf71cf46e2cd66f9066dda7e7982f91e06803ad2c89358da94fc0ecd593ecfbed8b36ea9668f3e713987265fcdf03fdaae08ee9dcbf36ec1d22a91e3bfe84c1"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2"; +}; +yaletter = { + revision = 42830; + shortdesc = "Extremely flexible macros for letters, envelopes, and label sheets"; + stripPrefix = 0; + sha512.run = "28765f3b6296ea3b9daf671543b7b2cf371bf2aefb4f3eefe6e95d50ee9a11516a7ec14fec5d15305e8f52d0089072cf10ce9dd4cba30c8fb60fa75365ff0d22"; + sha512.doc = "ed81b08b0306ceb519c9a652ef0d271bfa486897b05bc3a91a3840e36d348ea86bdd645ae236d3f34de78d038de988a023e542075f871aa6d8752d9606910dc6"; + sha512.source = "a2e64356234f9bf9bed1a73d5ea362ee487fb3eab43dc89241bf21c7033119e030cf3db81321b1eba245b3330103bff6a7b9f345e6df27f47de35ab9df4a6ace"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.1"; +}; +yamlvars = { + revision = 69071; + shortdesc = "A YAML parser and tool for easy LaTeX definition creation"; + stripPrefix = 0; + sha512.run = "07d8c9983e631b3e4c97ccc1a7bdd20486e55a59eb6049388823db24149635bd59b94d98f2259de5ef0dc163a9f44e4e01148a42c3f676c65fa802d310f6a0c3"; + sha512.doc = "686e2be82054f40c93dfcfbda35d2fa45fe0c28d0b85af30c5ec9c9a8c125a6789fb7185d08da9859bf714f6f5e4dc4057890ee4782fbea446aec923e0adfa6e"; + hasRunfiles = true; + license = [ "mit" ]; +}; +yannisgr = { + revision = 22613; + shortdesc = "Greek fonts by Yannis Haralambous"; + stripPrefix = 0; + sha512.run = "509e69acdef68eadc65fef6980e9166c6327e8927fb9cdf6a7a33786a8668ac9b900954a4bb661f223967b26dd240d5ebd91683658b324be284e46876c39061d"; + sha512.doc = "40ecdfe71670357e8ec84fd262015b5b5d0b8e486ab80c05d0863a335649501e9548d785cc2b2374f989b820dadd9a074cc229674dd1ae9a6252d4a0ebeb4191"; + hasRunfiles = true; + license = [ "gpl2Only" ]; +}; +yathesis = { + revision = 70512; + shortdesc = "A LaTeX class for writing a thesis following French rules"; + stripPrefix = 0; + sha512.run = "85c1c7a9dfb682271ebc6a35cdd91dcaa11137d6f1785f98c3b0abdec46ab346f23a08b034b8aac95324dbba490291a59f74c5d27c93f791b38d47302f5cb61f"; + sha512.doc = "b241afcdd6e2e7cc112faaed178fa2d1f15afea44e4c614b69edbe0a08ac78606f6adf4e6688c4d45e27b011dfd83ff189a4d8a84e96d39c22cada4d3cc888bd"; + sha512.source = "b97c3f396f53108ed66e3297484ad4d052df0b5fd735bedc16ab3ea8550c3bb8fdca84d7dc415e6a8abb147c2f4cbf1d4d7ee3fd6f4677db73079bbbbe20d359"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0.12"; +}; +yax = { + revision = 54080; + shortdesc = "Yet Another Key System"; + stripPrefix = 0; + sha512.run = "a625e7e4d26368732a8700f71f102fb17965a6a85d5a3c28e170dc19248ec0f3cdfd0905c76f0431585e955e29293b49b6dffcf93ed7bdbd80b5d62cca2775e7"; + sha512.doc = "783a606e55a6d2bbd1fb4052bcc84ac499953838808161facd8a76fe0e46a3de8ff0399831bc4e8ddbab02be84a3da68f0f7535c0d3b0b1f3d8d6cfba63ab0a8"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.03"; +}; +yazd-thesis = { + revision = 61719; + shortdesc = "A template for the Yazd University"; + stripPrefix = 0; + sha512.run = "d19e817cc925a0ea08e1b15f3a2b1d6ee4b7a8f9ac420dfa7b6db7cc55b5a24777125a0be7923707606b215ec95044fdf16a2f8a5e5682d8403cf6857dc3252e"; + sha512.doc = "b065c1fabfa4eb394b5ffd3ed048a42c005cb183c82027d5ce1d21e53c2a35f8c0d3647156567f47cdced936ed061fcf303651d024fe3050e8a135c693ea8c28"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3"; +}; +yb-book = { + revision = 67188; + shortdesc = "Template for YB Branded Books"; + stripPrefix = 0; + deps = [ + "anyfontsize" + "biblatex" + "bigfoot" + "changepage" + "chngcntr" + "csquotes" + "enumitem" + "fancyhdr" + "float" + "footmisc" + "geometry" + "ifmtarg" + "imakeidx" + "lastpage" + "libertine" + "mdframed" + "microtype" + "needspace" + "paralist" + "pgf" + "qrcode" + "setspace" + "soul" + "titlesec" + "ulem" + "wrapfig" + "xcolor" + "xifthen" + "xkeyval" + "zref" + ]; + sha512.run = "e50c3b75107bcd7cf72a6d4ef86353e8953860a3b4ffc044280fa57b0f290d1ec161e31aed3f91f8827bf038e4f60ed1a6eefb557f0401ed67042209750059d0"; + sha512.doc = "19e220fa4214b2ca9c95fef77c12805d1f9f4916e8463fce561170e7ba103587a47a38f1710dd6e1147cf50c23f6e5e9524582f127ad0dc237a409970f4922aa"; + sha512.source = "3a7817bf209e938f9a75e928c16de30b59537cc049ca1b67e3bdf9c116337c78fe0a40b346a0f7189ea04c7af3755e0428af2140db7eaa83dce026a6042dc489"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.3.0"; +}; +ycbook = { + revision = 46201; + shortdesc = "A versatile book class"; + stripPrefix = 0; + sha512.run = "8b98cd81e5f1252063da8dc297eb5580d06020a343638f7c8a1090a7f056a788eb4322e286f12d821be79fc7de94262a4ff15c14a1c787be0de89ddc87541452"; + sha512.doc = "45ee725849230549b4b2f200e0b140c1fc99a60d91730a42d2e3df63e828eb6053845a2eb84ff25bf916341df46a3f3c01166848afb291d322dfb21426903644"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ydoc = { + revision = 64887; + shortdesc = "Macros for documentation of LaTeX classes and packages"; + stripPrefix = 0; + deps = [ + "etoolbox" + "float" + "hyperref" + "listings" + "needspace" + "newverbs" + "showexpl" + "tools" + "url" + "xcolor" + ]; + sha512.run = "116d4be9a7ca06f90967c85a696e893a85555402acf400c0251a71f4d43a5ad244ee041518d4408b6627610ff87792f07ab51309303e442159bce46025d5a27c"; + sha512.doc = "714ff9f1fc20d9f3e5effe9159935a45662f7f8dde9be0371055a3e178b9a74618046c1f4ba67cd1b89b6b0abfdf41de2716a097e67138d42f733ece3edb028d"; + sha512.source = "1a4d7c462316b3d2689b5121d81af8ff7847909e039564a0d66c859607e5c4fa573dbc607cffbd73223f48f471847057fbfeeb71a31947b5b1a8c02eb88eb35b"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7alpha"; +}; +yet-another-guide-latex2e = { + revision = 68564; + shortdesc = "A short guide to using LaTeX2e to typeset high quality documents"; + stripPrefix = 0; + sha512.run = "7a2d19b71006352ff9cf69cb68243153e99e4cda2a3fef37daf6ab180e7a7625b8119b972785a331188faf7ee6f03d724a760c5c3456e85cf32ce704b3edd7cc"; + sha512.doc = "8ab0ebad6b627dc1a5d90477d48868715830c6558e9091d3782284e9766f22f9764170a3e89d55c8437dbca2c8eab446a1be0336baf43b3ddcaf67e125ea2f64"; + license = [ "fdl13Only" ]; + version = "1.2"; +}; +yfonts = { + revision = 50755; + shortdesc = "Support for old German fonts"; + stripPrefix = 0; + sha512.run = "1caa22023c93ae1e6a2fd94676da61fd576890f991a79d6a9724a4e5f7e653a752c6af792a1b15d44aa956f5788aa995614a33c2d97e95865d6a364f833e539f"; + sha512.doc = "54857e6693242080c5f410ded0bb16d3df65fee2834b2b5d1232dd063a70796905771059da07e7d92358fce9da992c3e605be345ae7c5d4012d37dc37a17dc82"; + sha512.source = "c716a8ecca03f0dbaf07146021977fd802e2089c5b99fc7adaac1e581ecbfd4f4b1a15562a54eea7c783f5b8b6165b935e484e36a456ef81729751c777266815"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4"; +}; +yfonts-otf = { + revision = 65030; + shortdesc = "OpenType version of the Old German fonts designed by Yannis Haralambous"; + stripPrefix = 0; + sha512.run = "cc1587d41121f8e15b3b659f2620c0324fb35b46a6914843c3abebb7c4fa0b30e85e59a2de603128d8015d68edd1e16b8cb02a9dacdd49c04dd3a602d1ee0148"; + sha512.doc = "47d025d7a7d3a65803c1ebc318e13adbf371b5bc7720d7a5be5b839246906fbd963c4ba2147ad37aca5313f3ba95d361e19f87bf6d77b99e150bd96a29461f0c"; + hasRunfiles = true; + license = [ "ofl" "lppl13c" ]; + version = "0.43"; +}; +yfonts-t1 = { + revision = 36013; + shortdesc = "Old German-style fonts, in Adobe type 1 format"; + stripPrefix = 0; + fontMaps = [ + "Map yfrak.map" + ]; + sha512.run = "ec4cfa0d4f08f506b3bf7a3acc8e303ba51c7761f32498f040e062264e595bebe64a4f5adc7d6ab5aa2180c55b817d0124d5b07b276cb39c775539113a08f490"; + sha512.doc = "dd37c5163de0bdcce937a1866a48d9f924faff81da11e566e9525a6d5a81ae82419ee7eaebdff1cd8512957a878f849f43e9cd71dd39625e6dc0e2ba18f4ac9b"; + hasRunfiles = true; + license = [ "free" ]; + version = "1.0"; +}; +yhmath = { + revision = 54377; + shortdesc = "Extended maths fonts for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "MixedMap yhmath.map" + ]; + sha512.run = "88476f5355d041f1920c4f0f954853828bdfaf27b9d0441982a38e3dfe79b40377a83614794024ee8c8463eaf5d1c350bff033f1c53e031451ab7cd095e14948"; + sha512.doc = "56fb12fcc4099f14c5746727b3c3051d84097cd8a715023545c3a2fafcc5a5abe55980a12e4384f674ef6cad2c7d6dab2beb8374e4cb3af81f711c2e8320d97b"; + sha512.source = "57a97c1310cfefcc453d031dd3c4701bac2a36c04f435f7a823e1b83671afccadc33d213e9578f4bbf806b6c73aaf33d3816dcafa86fb4447d53659e11f83072"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.6"; +}; +yinit-otf = { + revision = 40207; + shortdesc = "OTF conversion of Yannis Haralambous' Old German decorative initials"; + stripPrefix = 0; + sha512.run = "5ec9f9408c3188b2bf985e9c3f1f9f6a345557d08a167a9d02c07fe41bbb981a8889f580d6e38a97798bb5e891d978eb4ee70b77a344c684051b5644654d1cd1"; + sha512.doc = "6c73466c1e4ce1f7aec1b30980e5c44ca4917e161236fad7a0816bc93e921525b90f62abd8d41d3b767d8a6eda62a34534d7129d1fc490fda430345f8a2b3ce7"; + hasRunfiles = true; + license = [ "publicDomain" ]; + version = "1.0"; +}; +york-thesis = { + revision = 23348; + shortdesc = "A thesis class file for York University, Toronto"; + stripPrefix = 0; + sha512.run = "5b5152cc315dc05164ba3502d6e7aff355d853e43a3836bda0a15a4af7a90ef9fef02c852125c7e1e4842c05d51f2be6441b5131400eb46bb6704b281711e18d"; + sha512.doc = "e1ee454ad9996b61f1cac9bbeec30210359ecd8939bd9e0696e7cca7106733b13b8831946c47652186d4b80060f96c479b642274f5c90f8757953b1c3861f0bc"; + sha512.source = "3096ee9334bab690b38ff943559a0a7b0c54f8b831e7d1320ae4581740c48dd05e09813e220ce1d28d4523fb456d7fd01920e89e7e0d66da00e9dce88bfadea7"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.6"; +}; +youngtab = { + revision = 56500; + shortdesc = "Typeset Young-Tableaux"; + stripPrefix = 0; + sha512.run = "4ac5c3803a2e815c51178fa30086ad25c1dd2b430753d582376c9f6c720bd1a72db1d285d2b0cd810e3564961ce3641f3b482d685126e880cfb1dc856dc74bc0"; + sha512.doc = "b291614a22227693f93422af280200fd927fcefd0399d4294f934ff8882d26e263a3a1dcbac3ad2289d2adf2ff92c76a8223eb450de46e0b1df283af31bac3da"; + sha512.source = "57110b41ada1866d327eee8f1eae1ad61ad7bea1428bf9a3ccd31b9cf27e19537952ef756299f62e5204e5fddf5d032c8170eb36d6a9fe73e66c8d72e1c4f085"; + hasRunfiles = true; + license = [ "lppl1" ]; + version = "1.1"; +}; +yplan = { + revision = 34398; + shortdesc = "Daily planner type calendar"; + sha512.run = "4884ac99b0b56927fb86c6e06ae9d4accb7d8b441bb17df79753d8af9ee84b9440d66ad4fcf2107aa036eb2af89d5ad49d0a4c4cb91236c6475cf81bab85566a"; + sha512.doc = "7d3cddf3f2d54283b777c7ab7867df68fdb484c67d2f88589e29fc087db721e7ba9e0fcea2ffde9328e89075884d668b7de8fc61f462b735d9f1cfadb9662463"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +yplan.binfiles = [ + "yplan" +]; +yquant = { + revision = 68997; + shortdesc = "Typesetting quantum circuits in a human-readable language"; + stripPrefix = 0; + sha512.run = "2d9dbde5bbc12186a054624f4dfc30ab9cde606440e5568de12f9bcbc0f0c7f872141a2f1745e2f9729884e59e8c36ffddb77ae5b813cf837ea7e2ebea7d7109"; + sha512.doc = "bd0f9428c7a0930b6d714ba69f0020217021283021b9492bb71c2077fb70e86f3a49694251f88e91605604bda7049ce1f06bf1ecc1b668c63e080d1bcb087fd6"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.7.5"; +}; +ysabeau = { + revision = 69663; + shortdesc = "Ysabeau fonts with LaTeX support for traditional TeX engines"; + stripPrefix = 0; + fontMaps = [ + "Map ysabeau.map" + ]; + sha512.run = "c5545488723a4408a771c083d191942fc7b10e85e6c2df65e6ae0839dcaa7202459ba8774497562b7e55f432fdcca904de132ac7d89fbf3d935aa238ff63fede"; + sha512.doc = "a37a971140b1ac12724f2710e6f017690ef151aed9a88ed00bd00cd80ca6ca8524b0347b34bf83cf8e2e34fb000e4ac53c1a8a88684a0e3792e4cded362513ae"; + hasRunfiles = true; + license = [ "ofl" "publicDomain" "free" ]; + version = "1.1"; +}; +ytableau = { + revision = 59580; + shortdesc = "Many-featured Young tableaux and Young diagrams"; + stripPrefix = 0; + sha512.run = "23bf33f11e295f5f36149bad2b801ecfee57b386dd952ea93b16e79f85c54e1edff741bb7d6dc7faa769062ff81277cf04ff06cb2fb92e9a7542b4dc93eebb0b"; + sha512.doc = "b98b0da2e5e0eb964ede56a27067b7ba862b63dd1b0dc6771e432abb16e924fda5630d067c6bbb05fdf6a37aba07c61396d47612adcfcccd5886ff3fdd47b7a4"; + sha512.source = "264f983cb28ddd4f2089b4d170603172cce27b463999e4806173106e384bd4c3be16ada6f0c2e3c176dc450c53c2e50e43f993c893880ccf5c9454b84a062ea8"; + hasRunfiles = true; + license = [ "lppl12" ]; + version = "1.4"; +}; +zapfchan = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map uzc.map" + ]; + sha512.run = "a5a8a672e1753cd39b44dfb43b9b83673f7bd20dfb4e4640630ba0908c228dd75dda7933432d6d6f7e2c4920d554aa8cd41a523ebe665832edbc4aa7b8034332"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +zapfding = { + revision = 61719; + shortdesc = "URW 'Base 35' font pack for LaTeX"; + stripPrefix = 0; + fontMaps = [ + "Map uzd.map" + ]; + sha512.run = "3e0503c2d4e30c8d727caa1d9438d4c6b12c3a15729eae65d5c4a8dd9ab0d0c8eee2f63138e9d267f4ae98ef7607388888f7acd78e189a5c322bda22827166fe"; + hasRunfiles = true; + license = [ "gpl1Only" ]; +}; +zbmath-review-template = { + revision = 59693; + shortdesc = "Template for a zbMATH Open review"; + stripPrefix = 0; + sha512.run = "c9685b151679e7516e146f3d97f4242c7cdf084f84a7ac857a8aa27031c60950d0da07d66b7b57d7bdec384d3501c30b339231654cf845bbed2945b0ac069368"; + sha512.doc = "470ee6c9895effd3c6bcac5a9faaa3862380bb137044411dd0013f4f465dc923dc1de507f2d1d087fb4b4178cb2f43f435e71b090d55744a8be6e59f8cc010fa"; + hasRunfiles = true; + license = [ "gpl3Only" "cc-by-sa-40" ]; + version = "2.1"; +}; +zebra-goodies = { + revision = 66630; + shortdesc = "A collection of handy macros for paper writing"; + stripPrefix = 0; + sha512.run = "c740469e5a27355fbe8c781d30434724b8c77216e88c674854dd71e73e38ba78aeeef251a25e756c4046230eccdf334abf6d5f378bad559691a29955cb0eb16c"; + sha512.doc = "c4bdfba7e426c95599c4fe2cff06ada80345490f433eb636260ed5ce322c1c21c0b5de0c4709be415b6b98668b7c514610375f2bdf9831248be0095e1ff28dc2"; + sha512.source = "ec961bcc2d7181450184bdddbe0f0c1d5100bd6fe2294722dda239d8979f6c8d126fd4f52cce371db8227aedb1e1da14eaf1457ed12e65d33ccce6f23148ad8f"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.8.1"; +}; +zed-csp = { + revision = 17258; + shortdesc = "Typesetting Z and CSP format specifications"; + stripPrefix = 0; + sha512.run = "2f41c5b28e602aa88146cbbc172eb2d6c6f21491e45622c4c1688b9a8acb5be304a8acde842bef84f7a238109ac9ebefa31844826387b266f14faa6a6943903a"; + sha512.doc = "e5e657656e46023e32366ba415f46322f4c9b4fe0e69f03c88d4e5fcdd577e3436be6436424f502c3807278efe3a31ab7cba3020ef3c9e44874de3660dcccd2b"; + hasRunfiles = true; + license = [ "free" ]; +}; +zennote = { + revision = 65549; + shortdesc = "Streamline your note-taking process!"; + stripPrefix = 0; + sha512.run = "94f1e1a0550005c25206ac3e04216d35bc2b769b735160219ca246c95a85db5002bc74641e45152a31e8148e4d581bdb0024a3174eb735537d39ea1256f34365"; + sha512.doc = "a2351fa77ebdbe035a60750c1362d6a04cef67be244ff5ce2f6a38cc6b8c3b5b96f4afcb15c43866393911e60446be6f5a4d384852a8a10101abae38bd309fc7"; + hasRunfiles = true; + license = [ "cc-by-40" ]; + version = "1.0.0"; +}; +zhlineskip = { + revision = 51142; + shortdesc = "Line spacing for CJK documents"; + stripPrefix = 0; + sha512.run = "c1e92d164d0b46ca1165775e5c17f72687cd83b6efbba95dd58fe55008877ab3f08bbaf90d36d491ec861705e9d15f74511c8a0f9cf66ef8bf5127d7aa2cf203"; + sha512.doc = "794822b3b89aec655af2663f3dfbe848ccac9fea8369f446596562178e73c01ddadcf1ce46fd1811e4b72a25917c310bd42e45f9b16a3adb897304ae345d5415"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0e"; +}; +zhlipsum = { + revision = 54994; + shortdesc = "Chinese dummy text"; + stripPrefix = 0; + sha512.run = "d62f2a16f2303db7846073b215b3e8f822b7470510eb84367b1ba177c971e587adcea92757a3a4f5612abf103bd11cc8f2ae3ab953833365fb2255ee87563cb8"; + sha512.doc = "dcd0d706d9e402ad1b4eab910294ac4e802a58c2e54a3ee19b6dcef9fc3e052b84b559f452bb32b78d27a99e65a0820d2029e53079ce21068618f5c620f9502f"; + sha512.source = "92054c4839953e84a15abc6ca280ca2d755d5854b284c30521f17e54528bd4c369e9298e596606c877ecc74533fa81d8a8d544c2819f14d48157ee996a26a922"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.2.0"; +}; +zhmetrics = { + revision = 22207; + shortdesc = "TFM subfont files for using Chinese fonts in 8-bit TeX"; + stripPrefix = 0; + sha512.run = "abc0b873b5abb0b053fb59d8bb831a835f90cd8bfc2cde87d1031dba2e31db8721e3ea1037e7322b33ae5216dd65bd01008fb769eade0c9b4815e8ea7c55615c"; + sha512.doc = "e77fd912d10d8ab535c366f8e5b99e996607788b9ede295a3d7739fc4c14e0679c66c36bdefe2ce5433967b28b2ab228c332d9b0a23a841d42d3fa56cd204040"; + sha512.source = "d505658c340bc3824332ed473927bf971612204e69c56839d4e0bd0b6ad4b84a975fe32e863d12d2e0ecae580edd06c3ea0854b90cf762aa9ad6106d2f2afc1a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "r206"; +}; +zhmetrics-uptex = { + revision = 40728; + shortdesc = "Chinese font metrics for upTeX"; + stripPrefix = 0; + sha512.run = "1e068a0b402a5c69b44a86d797cb24266b2883c698decd8b8464c99b131d292cc5ac44249ba8e89dc0a414d6f12d73d4c069ffc3081cfa4b9926ca412bfc3dd6"; + sha512.doc = "f9ac2953877cd830e1cf3402f3f2bac1f8159d05a4a74e89047c494ae04dc8930f1c09701f83871b4361976572ae7d1c5fbdaf3af3d9e6db12347a207f1b82cb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +zhnumber = { + revision = 66115; + shortdesc = "Typeset Chinese representations of numbers"; + stripPrefix = 0; + sha512.run = "080460cafa9f1b382d5843e7863eefb36a26abcdf8ef97d9a23fe4e68d1bf85e0e6a38c7201d1dbaf2d25acc7b846d757fab9f9b850d992a576b6df67929cb55"; + sha512.doc = "c8f6b76b72f7b7bc19f2e6fe64191b86c4b73fa7559d3299945359a7d2205e3685c4eee98283f361207192fc35de0a7ae9064e118e20f96f832d18eacf93bf70"; + sha512.source = "7a79592cda187221d2832db12e45923a03f110de7ae358304048a52d2e170853421cad0a50211c0894b700c98301cf949f1def35acacc7cf2d23789ff23ca4ea"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "3.0"; +}; +zhspacing = { + revision = 41145; + shortdesc = "Spacing for mixed CJK-English documents in XeTeX"; + stripPrefix = 0; + sha512.run = "52d1d3523ae4c0d2dba5258b06cf9920f8a9005df7e03fd1407dd8ae2e4dc90768aab10127319ef9025765820b3ebb8a946ea0373114c9148a303517b563bfe0"; + sha512.doc = "7fd15e4f29671081670e881e9366ba627f5bed6d981fa0ef1c670d0744e1286c04e785e28b92279d66af851803d84949c2f463370f23c64987fea78531172128"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +ziffer = { + revision = 32279; + shortdesc = "Conversion of punctuation in maths mode"; + stripPrefix = 0; + sha512.run = "3d29074642d8a4c63046347a36f47548557de92a64ab4d6b7d1cad87f97a9e25a09fe84cf699a3bf2129c4de00dd3ef3593f85056e8f38a9a2d1ca27c549cf96"; + sha512.doc = "8eb75b54a6711ba0d0ad30343f253eabf88b3752de3112b13b96e4182119ef5f789916c413a5ca35ba7bf6619eb25bf64e7717844e4b9a49d33781d91f5b14af"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.1"; +}; +zitie = { + revision = 60676; + shortdesc = "Create CJK character calligraphy practicing sheets"; + stripPrefix = 0; + sha512.run = "10769951705e67bb929643e39d5480c4c2337a68f59ede2d77b2f8ddc3e2d6363c873d0e8e480a85e02f2062736570fa74171c862e50af73efa941a4d93cdd58"; + sha512.doc = "84f8e20beec5ba5ffbd79c6ffa68f0530b285761a8de6ed53e621ef39c0c14f59c33d76373581f94f10b1149a9fe5c92c1c74bbe2c4d6b8aa589d3a574bd9153"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4.0"; +}; +zlmtt = { + revision = 64076; + shortdesc = "Use Latin Modern Typewriter fonts"; + stripPrefix = 0; + sha512.run = "ecd45c407db5a78d31f6bcb7be6184531a51bbf89171c47f2e5178e65b06db4595682c713a977ece1cdbd98fb59b551baef3cca527b22f98bb45b37e73407144"; + sha512.doc = "2bd3ce9fde985f319bfb33ed791524bf81ce2ad3797fabdce78bbc4f4884871d5994e6fd9737ca3ae40953613aca70b9ef399ae914a40df54c91347ca98aef98"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.032"; +}; +zootaxa-bst = { + revision = 50619; + shortdesc = "A BibTeX style for the journal Zootaxa"; + stripPrefix = 0; + sha512.run = "80816556a2e23cfd8345b7d22224142a5448105ccc5c1143f33c4560a4e4ab432115c2fc47c5d4c6ba599031f4c36b481465a5fa7b32afde888beac69a6e6c62"; + sha512.doc = "f843aa27ab0c2139e1051aefaa9b667f2de489cc13578200ce7db2bdfc2397888856c6cbe68b6fa201e0cb269bb95818cb31f1b03622c49ebdced23fa5960d65"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.0"; +}; +zref = { + revision = 68278; + shortdesc = "A new reference scheme for LaTeX"; + stripPrefix = 0; + sha512.run = "1c21d99dc4f1627520914ed3620606c724f22754662797b93c4161aaf3e36d5a42a586ae7e4b227cdf67d55c88d3979635e78661d7029f1a5967c503a9f9dde5"; + sha512.doc = "24cf22b54cb13e1458266f4962ba589fa9385f3b8d58493747824d815c372cfa6fa8a8a24d0310264b299ce43148ca001b5c6b73961d1504e1ab6e8a4ac246c0"; + sha512.source = "251cc99a193371ca0e11d1690ce6ce545cdf077a483f81d2d5ac5c3495b24c25f383ba6b73e9607578adb0940441247ac4027c7719d2ada0c1b77f7876f9767a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "2.35"; +}; +zref-check = { + revision = 68846; + shortdesc = "Flexible cross-references with contextual checks based on zref"; + stripPrefix = 0; + sha512.run = "98aeb6007f1f599a2bda644c60c9929ca27c9045d73af3d54298837eb842e7976a2f9067182ce38c77ff197e2fe36a53207d2aa39adaa9deeb4e118bd034b0e5"; + sha512.doc = "d050bb4a6c68a80eafe3eb7f99c61407424385743785014600404397e6fa322becaf3a28157f59951a2406fdfb66968f3cba9de4e388282ea0c84e3f33d4fc8d"; + sha512.source = "a84246193d390c55dd66d65b64eae79e52099e7f7c75b8ef03d595d466d57643832f95ff23ecdc2dd0cc31b7c5cc64db361bd5ece7949e544936739b2c70e1bb"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.3.5"; +}; +zref-clever = { + revision = 68846; + shortdesc = "Clever LaTeX cross-references based on zref"; + stripPrefix = 0; + sha512.run = "d7a32fde3ee94e304f854f690756ad9d15a9287c1dd38e1707a1f33e2bd30ac23147a439990ba7e9f7bc0b2c5b37b5d475bb64f2ab89bb15752bfc0e2f9ad3ac"; + sha512.doc = "c18e86417db71ece26e6a29e0598e521d17a79c26f5ebd92dbd78c427142bb992df9ff39c0a5867dd296093036615bc319aa9dc970faa0ae0d4ed479452e1b89"; + sha512.source = "3ff30e4c2ee570c5c142542110699ec17b123078c5d01ed9de2781404026b120856d38d4cb05160bd90ea56063e220e09dd46158d938a70416488797855a1fe3"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.4.3"; +}; +zref-vario = { + revision = 68846; + shortdesc = "Extended LaTeX page cross-references with varioref and zref-clever"; + stripPrefix = 0; + deps = [ + "tools" + "zref-clever" + ]; + sha512.run = "c159620be1d7d853641d4b42108ec0b2e36b6f4b0c604680469b52cf4c0557196263293d4692906d1d42c1d0ab9a666b59d462266131e42f319a5ab3a2385780"; + sha512.doc = "b618216a0bd8d7b65fe73be05156e899917719436ef0139122fd01047b8d55faeea55ae05e259d99c464aaeb3fdd9268886b7dec9c4b6a86209da1dcf1c3a3ca"; + sha512.source = "0569db63bf6fd492952cdee442312e818926bceba7663ce0e17f485dbe990687d97efc02649acef6dd89210aa44f9e88c86cf2667c4a487e9b78b90b10a779ce"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "0.1.10"; +}; +zwgetfdate = { + revision = 15878; + shortdesc = "Get package or file date"; + stripPrefix = 0; + sha512.run = "fe52555cc46a9e8340d8c9c37f88b372bf72efbd48a097b2d319592dc49a8cf55c87e80ea7d94ba6730742e9883215703749895008ba38838750efb9fb2334e9"; + sha512.doc = "7ab61dc4252ef7f60d1d5be8d4415bcaeaed194384a1da14a3400617b36c6efae3679dbbd6c8d64b8cc9f9947babe88c064d637379f663408cbe63ca42334bfb"; + hasRunfiles = true; + license = [ "lppl13c" ]; +}; +zwpagelayout = { + revision = 63074; + shortdesc = "Page layout and crop-marks"; + stripPrefix = 0; + sha512.run = "a0b5ca55208fe5f2353bf846fda3bbf2ef095f68e0e80265c9c89bfb14be0c80f5ca7c1b7fbaae4c8d67d70fc381353f889c9596e96412c351d39cceba40c263"; + sha512.doc = "9b52a6267720a787826bd14efa7742ef9adf9ad14c46065edf5f0e47c94d2762a7dd2a4b9b31864a3a1bad8addd4c18e21119a70abfca89730a7c7804628877a"; + hasRunfiles = true; + license = [ "lppl13c" ]; + version = "1.4e"; +}; +zx-calculus = { + revision = 70612; + shortdesc = "A library to typeset ZX Calculus diagrams"; + stripPrefix = 0; + sha512.run = "d59cbc2662dc41a216e9d8665a6bafefd27ef5993abae6682af24909cff49350dcf73f10ddc55b31dd3ebdd35509a7000edd8e055c85deee946a5efe258ddf14"; + sha512.doc = "a08719cbd99cfe9b37ca3fe62806e45908a1f48e5ff32a162fff3e835fdcf69c8a516ff7d3e0de6dd1827d3c78ae7efb3e79b4a534d77d94d5a16b9fd10b10d7"; + hasRunfiles = true; + license = [ "mit" ]; + version = "2.2"; +}; +zxjafbfont = { + revision = 28539; + shortdesc = "Fallback CJK font support for xeCJK"; + stripPrefix = 0; + sha512.run = "357b100dac7061a5e6fe91e3a708f32e99a134158393581bc717ae3e90afa5dbbff7aa1bae8c092638bca2d5c3ab65d8a8cbc39c20c3ec1ff85c967fb3849513"; + sha512.doc = "215079eeb772dc4ea55d5e00945a757c877acf9ea56aebe5a8969564a3836f54ca406d502d73e93d92b131600fc77bd2342d36fa78300adc0b4d1dd7f5d0f423"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.2"; +}; +zxjafont = { + revision = 62864; + shortdesc = "Set up Japanese font families for XeLaTeX"; + stripPrefix = 0; + sha512.run = "4afb6c3126c66c23a9a5b2ad1103289ab3f14c5a0d9bad7de209de3801e77f803e7a88d7440aa2f85d5aa6c23b6514585f263a95d6c3d68c232051880943a5c0"; + sha512.doc = "598a13775cac68ae6f176bd01b609373a4033583a83ed42f7914b15a01776d40b0c7200258dd68563510b2a3c11ec29a25ab3b26477650b60652e7332ef3f131"; + hasRunfiles = true; + license = [ "mit" ]; + version = "1.3"; +}; +zxjatype = { + revision = 53500; + shortdesc = "Standard conforming typesetting of Japanese, for XeLaTeX"; + stripPrefix = 0; + sha512.run = "21eaace7188c9e61f5dd65f34e26b1ca16358e7396d44188ae17e8e01a58f38ac3be9f09f8f41923c257d089210d1fb7d841eada5c9a345cec42b934d257ef94"; + sha512.doc = "0fccc73af66a05231cf8283920d65717600be4673329ed1f46b93a494d766aa9542deb1a56b5d23d6c0d6b93be98aa778234ddc2dcd9c0936542a45d057b6dc2"; + hasRunfiles = true; + license = [ "mit" ]; + version = "0.7"; +}; +zztex = { + revision = 55862; + shortdesc = "A full-featured TeX macro package for producing books, journals, and manuals"; + stripPrefix = 0; + sha512.run = "eb325564ee9e001e0e5ff79b6e3cc9f22f5b9b100ef021552f54953802edbce1e4b1295ff4590832f959386db7a63aaf8e31dc2d61b38e5c8a140082ca423e83"; + sha512.doc = "bd2a3a42b62da61db572058b4731161425545374584a575607f11bb2302aa2ce900b694aaf06562f4c9eb9046c80c4fbf5b50233f6d0526fac787c213070d542"; + hasRunfiles = true; + license = [ "mit" ]; + version = "17.7"; +}; +} diff --git a/pkgs/by-name/ti/tix/default.nix b/pkgs/by-name/ti/tix/default.nix new file mode 100644 index 0000000..a46b249 --- /dev/null +++ b/pkgs/by-name/ti/tix/default.nix @@ -0,0 +1,65 @@ +{ lib +, stdenv +, fetchurl +, fetchpatch +, tcl +, tk +}: + +tcl.mkTclDerivation { + version = "8.4.3"; + pname = "tix"; + src = fetchurl { + url = "mirror://sourceforge/tix/tix/8.4.3/Tix8.4.3-src.tar.gz"; + sha256 = "1jq3dkyk9mqkj4cg7mdk5r0cclqsby9l2b7wrysi0zk5yw7h8bsn"; + }; + patches = [ + (fetchpatch { + name = "tix-8.4.3-tcl8.5.patch"; + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/dev-tcltk/tix/files/tix-8.4.3-tcl8.5.patch?id=56bd759df1d0c750a065b8c845e93d5dfa6b549d"; + sha256 = "0wzqmcxxq0rqpnjgxz10spw92yhfygnlwv0h8pcx2ycnqiljz6vj"; + }) + # Remove duplicated definition of XLowerWindow + ./duplicated-xlowerwindow.patch + # Fix incompatible function pointer conversions and implicit definition of `panic`. + # `panic` is just `Tcl_Panic`, but it is not defined on Darwin due to a conflict with `mach/mach.h`. + ./fix-clang16.patch + ] ++ lib.optional (tcl.release == "8.6") + (fetchpatch { + name = "tix-8.4.3-tcl8.6.patch"; + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/dev-tcltk/tix/files/tix-8.4.3-tcl8.6.patch?id=56bd759df1d0c750a065b8c845e93d5dfa6b549d"; + sha256 = "1jaz0l22xj7x1k4rb9ia6i1psnbwk4pblgq4gfvya7gg7fbb7r36"; + }) + ; + buildInputs = [ tk ]; + # the configure script expects to find the location of the sources of + # tcl and tk in {tcl,tk}Config.sh + # In fact, it only needs some private headers. We copy them in + # the private_headers folders and trick the configure script into believing + # the sources are here. + preConfigure = '' + mkdir -p private_headers/generic + < ${tcl}/lib/tclConfig.sh sed "s@TCL_SRC_DIR=.*@TCL_SRC_DIR=private_headers@" > tclConfig.sh + < ${tk}/lib/tkConfig.sh sed "s@TK_SRC_DIR=.*@TK_SRC_DIR=private_headers@" > tkConfig.sh + for i in ${tcl}/include/* ${tk.dev}/include/*; do + ln -s $i private_headers/generic; + done; + ''; + addTclConfigureFlags = false; + configureFlags = [ + "--with-tclconfig=." + "--with-tkinclude=${tk.dev}/include" + "--with-tkconfig=." + "--libdir=\${prefix}/lib" + ]; + + meta = with lib; { + description = "A widget library for Tcl/Tk"; + homepage = "https://tix.sourceforge.net/"; + platforms = platforms.all; + license = with licenses; [ + bsd2 # tix + gpl2 # patches from portage + ]; + }; +} diff --git a/pkgs/by-name/ti/tix/duplicated-xlowerwindow.patch b/pkgs/by-name/ti/tix/duplicated-xlowerwindow.patch new file mode 100644 index 0000000..0ea8887 --- /dev/null +++ b/pkgs/by-name/ti/tix/duplicated-xlowerwindow.patch @@ -0,0 +1,49 @@ +This is duplicated code from Tk. +It causes errors during build since XLowerWindow is not only a function but also "defined" in tkIntXlibDecls.h. + +See +https://github.com/tcltk/tk/blob/71dcaddc69769cbd3e2c4b5edb5810f974579527/generic/tkIntXlibDecls.h#L396 +and +https://github.com/tcltk/tk/blob/71dcaddc69769cbd3e2c4b5edb5810f974579527/generic/tkIntXlibDecls.h#L1487 + +--- a/unix/tixUnixWm.c 2005-03-25 13:15:53.000000000 -0700 ++++ b/unix/tixUnixWm.c 2021-03-20 07:31:52.000000000 -0700 +@@ -24,38 +24,3 @@ + { + return TCL_OK; + } +- +-#ifdef MAC_OSX_TK +-#include "tkInt.h" +-/* +- *---------------------------------------------------------------------- +- * +- * XLowerWindow -- +- * +- * Change the stacking order of a window. +- * +- * Results: +- * None. +- * +- * Side effects: +- * Changes the stacking order of the specified window. +- * +- *---------------------------------------------------------------------- +- */ +- +-int +-XLowerWindow( +- Display* display, /* Display. */ +- Window window) /* Window. */ +-{ +- TkWindow *winPtr = *((TkWindow **) window); +- +- display->request++; +- if (Tk_IsTopLevel(winPtr) && !Tk_IsEmbedded(winPtr)) { +- TkWmRestackToplevel(winPtr, Below, NULL); +- } else { +- /* TODO: this should generate damage */ +- } +- return 0; +-} +-#endif diff --git a/pkgs/by-name/ti/tix/fix-clang16.patch b/pkgs/by-name/ti/tix/fix-clang16.patch new file mode 100644 index 0000000..f5d8a53 --- /dev/null +++ b/pkgs/by-name/ti/tix/fix-clang16.patch @@ -0,0 +1,215 @@ +diff -ur a/generic/tixDItem.c b/generic/tixDItem.c +--- a/generic/tixDItem.c 2004-03-27 19:44:56.000000000 -0700 ++++ b/generic/tixDItem.c 2023-07-11 14:49:51.583894242 -0600 +@@ -30,7 +30,7 @@ + Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value, + char *widRec, int offset)); + +-static char *DItemPrintProc _ANSI_ARGS_(( ++static const char *DItemPrintProc _ANSI_ARGS_(( + ClientData clientData, Tk_Window tkwin, char *widRec, + int offset, Tcl_FreeProc **freeProcPtr)); + +@@ -548,7 +548,7 @@ + return TCL_OK; + } + +-static char *DItemPrintProc(clientData, tkwin, widRec,offset, freeProcPtr) ++static const char *DItemPrintProc(clientData, tkwin, widRec,offset, freeProcPtr) + ClientData clientData; + Tk_Window tkwin; + char *widRec; +diff -ur a/generic/tixDiStyle.c b/generic/tixDiStyle.c +--- a/generic/tixDiStyle.c 2004-03-27 19:44:56.000000000 -0700 ++++ b/generic/tixDiStyle.c 2023-07-11 15:02:45.245210252 -0600 +@@ -31,7 +31,7 @@ + static int DItemStyleParseProc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, + CONST84 char *value,char *widRec, int offset)); +-static char * DItemStylePrintProc _ANSI_ARGS_(( ++static const char * DItemStylePrintProc _ANSI_ARGS_(( + ClientData clientData, Tk_Window tkwin, + char *widRec, int offset, + Tcl_FreeProc **freeProcPtr)); +@@ -785,7 +785,7 @@ + + hashPtr = Tcl_CreateHashEntry(&stylePtr->base.items, (char*)iPtr, &isNew); + if (!isNew) { +- panic("DItem is already associated with style"); ++ Tcl_Panic("DItem is already associated with style"); + } else { + Tcl_SetHashValue(hashPtr, (char*)iPtr); + } +@@ -801,7 +801,7 @@ + + hashPtr = Tcl_FindHashEntry(&stylePtr->base.items, (char*)iPtr); + if (hashPtr == NULL) { +- panic("DItem is not associated with style"); ++ Tcl_Panic("DItem is not associated with style"); + } + Tcl_DeleteHashEntry(hashPtr); + stylePtr->base.refCount--; +@@ -998,7 +998,7 @@ + return TCL_ERROR; + } + +-static char *DItemStylePrintProc(clientData, tkwin, widRec,offset, freeProcPtr) ++static const char *DItemStylePrintProc(clientData, tkwin, widRec,offset, freeProcPtr) + ClientData clientData; + Tk_Window tkwin; + char *widRec; +diff -ur a/generic/tixForm.c b/generic/tixForm.c +--- a/generic/tixForm.c 2004-03-27 19:44:56.000000000 -0700 ++++ b/generic/tixForm.c 2023-07-11 14:53:45.695753419 -0600 +@@ -802,7 +802,7 @@ + * Now set all the client's geometry + */ + if (PlaceAllClients(masterPtr) != TCL_OK) { +- panic("circular dependency"); ++ Tcl_Panic("circular dependency"); + } + + for (clientPtr = masterPtr->client; clientPtr; clientPtr=clientPtr->next) { +diff -ur a/generic/tixGrData.c b/generic/tixGrData.c +--- a/generic/tixGrData.c 2004-03-27 19:44:56.000000000 -0700 ++++ b/generic/tixGrData.c 2023-07-11 14:54:19.644741199 -0600 +@@ -296,7 +296,7 @@ + Tcl_DeleteHashEntry(cy); + } + else { +- panic("Inconsistent grid dataset: (%d,%d) : %x %x", x, y, cx, cy); ++ Tcl_Panic("Inconsistent grid dataset: (%d,%d) : %x %x", x, y, cx, cy); + } + + return 1; +diff -ur a/generic/tixGrid.c b/generic/tixGrid.c +--- a/generic/tixGrid.c 2008-02-27 21:10:43.000000000 -0700 ++++ b/generic/tixGrid.c 2023-07-11 14:53:59.283841038 -0600 +@@ -831,7 +831,7 @@ + * All mapped windows should have been unmapped when the + * the entries were deleted + */ +- panic("tixGrid: mappedWindows not NULL"); ++ Tcl_Panic("tixGrid: mappedWindows not NULL"); + } + + Tk_FreeOptions(configSpecs, (char *) wPtr, wPtr->dispData.display, 0); +diff -ur a/generic/tixHList.c b/generic/tixHList.c +--- a/generic/tixHList.c 2008-02-27 21:05:29.000000000 -0700 ++++ b/generic/tixHList.c 2023-07-11 14:55:20.699375202 -0600 +@@ -2036,7 +2036,7 @@ + break; + } + if (wPtr->headerWin != NULL) { +- panic("HList: header subwindow deleted illegally\n"); ++ Tcl_Panic("HList: header subwindow deleted illegally\n"); + } + #endif + break; +@@ -2117,7 +2117,7 @@ + * All mapped windows should have been unmapped when the + * the entries were deleted + */ +- panic("tixHList: mappedWindows not NULL"); ++ Tcl_Panic("tixHList: mappedWindows not NULL"); + } + if (wPtr->headerWin) { + wPtr->headerWin = NULL; +diff -ur a/generic/tixImgCmp.c b/generic/tixImgCmp.c +--- a/generic/tixImgCmp.c 2008-02-27 21:05:29.000000000 -0700 ++++ b/generic/tixImgCmp.c 2023-07-11 14:59:16.429640785 -0600 +@@ -142,8 +142,8 @@ + * The type record for bitmap images: + */ + static int ImgCmpCreate _ANSI_ARGS_((Tcl_Interp *interp, +- char *name, int argc, Tcl_Obj *CONST objv[], +- Tk_ImageType *typePtr, Tk_ImageMaster master, ++ const char *name, int argc, Tcl_Obj *CONST objv[], ++ const Tk_ImageType *typePtr, Tk_ImageMaster master, + ClientData *clientDataPtr)); + static ClientData ImgCmpGet _ANSI_ARGS_((Tk_Window tkwin, + ClientData clientData)); +@@ -378,11 +378,11 @@ + ImgCmpCreate(interp, name, argc, objv, typePtr, master, clientDataPtr) + Tcl_Interp *interp; /* Interpreter for application containing + * image. */ +- char *name; /* Name to use for image. */ ++ const char *name; /* Name to use for image. */ + int argc; /* Number of arguments. */ + Tcl_Obj *CONST objv[]; /* Argument strings for options (doesn't + * include image name or type). */ +- Tk_ImageType *typePtr; /* Pointer to our type record (not used). */ ++ const Tk_ImageType *typePtr;/* Pointer to our type record (not used). */ + Tk_ImageMaster master; /* Token for image, to be used by us in + * later callbacks. */ + ClientData *clientDataPtr; /* Store manager's token for image here; +diff -ur a/generic/tixImgXpm.c b/generic/tixImgXpm.c +--- a/generic/tixImgXpm.c 2023-07-11 15:01:05.887387236 -0600 ++++ b/generic/tixImgXpm.c 2023-07-11 15:00:37.209042328 -0600 +@@ -22,8 +22,8 @@ + */ + + static int ImgXpmCreate _ANSI_ARGS_((Tcl_Interp *interp, +- char *name, int argc, Tcl_Obj *CONST objv[], +- Tk_ImageType *typePtr, Tk_ImageMaster master, ++ const char *name, int argc, Tcl_Obj *CONST objv[], ++ const Tk_ImageType *typePtr, Tk_ImageMaster master, + ClientData *clientDataPtr)); + static ClientData ImgXpmGet _ANSI_ARGS_((Tk_Window tkwin, + ClientData clientData)); +@@ -115,11 +115,11 @@ + ImgXpmCreate(interp, name, argc, objv, typePtr, master, clientDataPtr) + Tcl_Interp *interp; /* Interpreter for application containing + * image. */ +- char *name; /* Name to use for image. */ ++ const char *name; /* Name to use for image. */ + int argc; /* Number of arguments. */ + Tcl_Obj *CONST objv[]; /* Argument strings for options (doesn't + * include image name or type). */ +- Tk_ImageType *typePtr; /* Pointer to our type record (not used). */ ++ const Tk_ImageType *typePtr;/* Pointer to our type record (not used). */ + Tk_ImageMaster master; /* Token for image, to be used by us in + * later callbacks. */ + ClientData *clientDataPtr; /* Store manager's token for image here; +@@ -1213,7 +1213,7 @@ + PixmapMaster *masterPtr = (PixmapMaster *) masterData; + + if (masterPtr->instancePtr != NULL) { +- panic("tried to delete pixmap image when instances still exist"); ++ Tcl_Panic("tried to delete pixmap image when instances still exist"); + } + masterPtr->tkMaster = NULL; + if (masterPtr->imageCmd != NULL) { +diff -ur a/generic/tixTList.c b/generic/tixTList.c +--- a/generic/tixTList.c 2008-02-27 21:05:29.000000000 -0700 ++++ b/generic/tixTList.c 2023-07-11 14:55:35.960761327 -0600 +@@ -1208,7 +1208,7 @@ + sprintf(buff, "%d", i); + Tcl_AppendResult(interp, buff, NULL); + } else { +- panic("TList list entry is invalid"); ++ Tcl_Panic("TList list entry is invalid"); + } + } else { + Tcl_ResetResult(interp); +diff -ur a/generic/tixUtils.c b/generic/tixUtils.c +--- a/generic/tixUtils.c 2008-02-27 21:29:17.000000000 -0700 ++++ b/generic/tixUtils.c 2023-07-11 15:01:43.718202631 -0600 +@@ -24,7 +24,7 @@ + static int ReliefParseProc(ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, CONST84 char *value, + char *widRec, int offset); +-static char * ReliefPrintProc(ClientData clientData, ++static const char * ReliefPrintProc(ClientData clientData, + Tk_Window tkwin, char *widRec, int offset, + Tix_FreeProc **freeProcPtr); + +@@ -637,7 +637,7 @@ + return TCL_ERROR; + } + +-static char * ++static const char * + ReliefPrintProc(clientData, tkwin, widRec,offset, freeProcPtr) + ClientData clientData; + Tk_Window tkwin; diff --git a/pkgs/by-name/tk/tk/8.5.nix b/pkgs/by-name/tk/tk/8.5.nix new file mode 100644 index 0000000..afd5759 --- /dev/null +++ b/pkgs/by-name/tk/tk/8.5.nix @@ -0,0 +1,28 @@ +{ lib +, stdenv +, callPackage +, fetchurl +, fetchpatch +, tcl +, ... +} @ args: + +callPackage ./generic.nix (args // { + + src = fetchurl { + url = "mirror://sourceforge/tcl/tk${tcl.version}-src.tar.gz"; + sha256 = "1yhgcalldrjlc5q614rlzg1crgd3b52dhrk1pncdaxvl2vgg2yj0"; + }; + + patches = lib.optionals stdenv.isDarwin [ + # Define MODULE_SCOPE before including tkPort.h + # https://core.tcl-lang.org/tk/info/dba9f5ce3b + (fetchpatch { + name = "module_scope.patch"; + url = "https://core.tcl-lang.org/tk/vpatch?from=ef6c6960c53ea30c&to=9b8aa74eebed509a"; + extraPrefix = ""; + sha256 = "0crhf4zrzdpc1jdgyv6l6mxqgmny12r3i39y1i0j8q3pbqkd04bv"; + }) + ]; + +}) diff --git a/pkgs/by-name/tk/tk/8.6.nix b/pkgs/by-name/tk/tk/8.6.nix new file mode 100644 index 0000000..fbf4560 --- /dev/null +++ b/pkgs/by-name/tk/tk/8.6.nix @@ -0,0 +1,21 @@ +{ lib +, stdenv +, callPackage +, fetchurl +, fetchpatch +, tcl +, ... +} @ args: + +callPackage ./generic.nix (args // { + + src = fetchurl { + url = "mirror://sourceforge/tcl/tk${tcl.version}-src.tar.gz"; + sha256 = "sha256-LmX6BpojNlRAo8VsVWuGc7XjKig4ANjZslfj9YTOBnU="; + }; + + patches = [ + ./tk-8_6_13-find-library.patch + ]; + +}) diff --git a/pkgs/by-name/tk/tk/generic.nix b/pkgs/by-name/tk/tk/generic.nix new file mode 100644 index 0000000..57a9b61 --- /dev/null +++ b/pkgs/by-name/tk/tk/generic.nix @@ -0,0 +1,74 @@ +{ stdenv, lib, src, pkg-config, tcl, libXft, patches ? [] +, enableAqua ? stdenv.isDarwin, darwin +, ... }: + +tcl.mkTclDerivation { + pname = "tk"; + version = tcl.version; + + inherit src patches; + + outputs = [ "out" "man" "dev" ]; + + setOutputFlags = false; + + preConfigure = '' + configureFlagsArray+=(--mandir=$man/share/man --enable-man-symlinks) + cd unix + ''; + + postPatch = '' + for file in $(find library/demos/. -type f ! -name "*.*"); do + substituteInPlace $file --replace "exec wish" "exec $out/bin/wish" + done + '' + + lib.optionalString (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "11") '' + substituteInPlace unix/configure* \ + --replace " -framework UniformTypeIdentifiers" "" + ''; + + postInstall = '' + ln -s $out/bin/wish* $out/bin/wish + cp ../{unix,generic}/*.h $out/include + ln -s $out/lib/libtk${tcl.release}${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libtk${stdenv.hostPlatform.extensions.sharedLibrary} + '' + + lib.optionalString (stdenv.isDarwin) '' + cp ../macosx/*.h $out/include + ''; + + configureFlags = [ + "--enable-threads" + ] ++ lib.optional stdenv.is64bit "--enable-64bit" + ++ lib.optional enableAqua "--enable-aqua"; + + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + + propagatedBuildInputs = [ + libXft + ] ++ lib.optionals enableAqua ([ + darwin.apple_sdk.frameworks.Cocoa + ] ++ lib.optionals (lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11") [ + darwin.apple_sdk.frameworks.UniformTypeIdentifiers + ]); + + enableParallelBuilding = true; + + doCheck = false; # fails. can't find itself + + inherit tcl; + + passthru = rec { + inherit (tcl) release version; + libPrefix = "tk${tcl.release}"; + libdir = "lib/${libPrefix}"; + }; + + meta = with lib; { + description = "A widget toolkit that provides a library of basic elements for building a GUI in many different programming languages"; + homepage = "https://www.tcl.tk/"; + license = licenses.tcltk; + platforms = platforms.all; + maintainers = with maintainers; [ lovek323 vrthra ]; + }; +} diff --git a/pkgs/by-name/tk/tk/packages.nix b/pkgs/by-name/tk/tk/packages.nix new file mode 100644 index 0000000..30754d2 --- /dev/null +++ b/pkgs/by-name/tk/tk/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + tk = tk-8_6; + tk-8_6 = callPackage ./8.6.nix { }; + tk-8_5 = callPackage ./8.5.nix { tcl = tcl-8_5; }; +} diff --git a/pkgs/by-name/tk/tk/tk-8_6_13-find-library.patch b/pkgs/by-name/tk/tk/tk-8_6_13-find-library.patch new file mode 100644 index 0000000..a055ade --- /dev/null +++ b/pkgs/by-name/tk/tk/tk-8_6_13-find-library.patch @@ -0,0 +1,25 @@ +diff --git a/generic/tkWindow.c b/generic/tkWindow.c +index fa25553..ad45598 100644 +--- a/generic/tkWindow.c ++++ b/generic/tkWindow.c +@@ -1045,6 +1045,7 @@ TkCreateMainWindow( + + Tcl_SetVar2(interp, "tk_patchLevel", NULL, TK_PATCH_LEVEL, TCL_GLOBAL_ONLY); + Tcl_SetVar2(interp, "tk_version", NULL, TK_VERSION, TCL_GLOBAL_ONLY); ++ Tcl_SetVar2(interp, "tk_library", NULL, TK_LIBRARY, TCL_GLOBAL_ONLY); + + tsdPtr->numMainWindows++; + return tkwin; +diff --git a/unix/Makefile.in b/unix/Makefile.in +index e98070e..f417753 100644 +--- a/unix/Makefile.in ++++ b/unix/Makefile.in +@@ -1033,7 +1033,7 @@ tkVisual.o: $(GENERIC_DIR)/tkVisual.c + $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkVisual.c + + tkWindow.o: $(GENERIC_DIR)/tkWindow.c tkUuid.h +- $(CC) -c $(CC_SWITCHES) -I. $(GENERIC_DIR)/tkWindow.c ++ $(CC) -c $(CC_SWITCHES) -I. -DTK_LIBRARY=\"${TK_LIBRARY}\" $(GENERIC_DIR)/tkWindow.c + + tkButton.o: $(GENERIC_DIR)/tkButton.c + $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkButton.c diff --git a/pkgs/by-name/to/toml11/default.nix b/pkgs/by-name/to/toml11/default.nix new file mode 100644 index 0000000..641b72a --- /dev/null +++ b/pkgs/by-name/to/toml11/default.nix @@ -0,0 +1,47 @@ +{ lib +, stdenv +, fetchFromGitHub +, cmake +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "toml11"; + version = "3.7.1"; + + src = fetchFromGitHub { + owner = "ToruNiina"; + repo = "toml11"; + rev = "v${finalAttrs.version}"; + hash = "sha256-HnhXBvIjo1JXhp+hUQvjs83t5IBVbNN6o3ZGhB4WESQ="; + }; + + nativeBuildInputs = [ + cmake + ]; + + meta = with lib; { + homepage = "https://github.com/ToruNiina/toml11"; + description = "TOML for Modern C++"; + longDescription = '' + toml11 is a C++11 (or later) header-only toml parser/encoder depending + only on C++ standard library. + + - It is compatible to the latest version of TOML v1.0.0. + - It is one of the most TOML standard compliant libraries, tested with + the language agnostic test suite for TOML parsers by BurntSushi. + - It shows highly informative error messages. + - It has configurable container. You can use any random-access containers + and key-value maps as backend containers. + - It optionally preserves comments without any overhead. + - It has configurable serializer that supports comments, inline tables, + literal strings and multiline strings. + - It supports user-defined type conversion from/into toml values. + - It correctly handles UTF-8 sequences, with or without BOM, both on posix + and Windows. + ''; + license = licenses.mit; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.unix; + }; +}) +# TODO [ AndersonTorres ]: tests diff --git a/pkgs/by-name/tr/tracker/default.nix b/pkgs/by-name/tr/tracker/default.nix new file mode 100644 index 0000000..509c910 --- /dev/null +++ b/pkgs/by-name/tr/tracker/default.nix @@ -0,0 +1,183 @@ +{ stdenv +, lib +, fetchurl +, gettext +, meson +, mesonEmulatorHook +, ninja +, pkg-config +, asciidoc +, gobject-introspection +, buildPackages +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, vala +, python3 +, gi-docgen +, graphviz +, libxml2 +, glib +, wrapGAppsNoGuiHook +, sqlite +, libstemmer +, gnome +, icu +, libuuid +, libsoup +, libsoup_3 +, json-glib +, systemd +, dbus +, writeText +# for passthru +# , testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "tracker"; + version = "3.6.0"; + + outputs = [ "out" "dev" "devdoc" ]; + + src = fetchurl { + url = with finalAttrs; "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz"; + sha256 = "Ulks/hm6/9FtvkdHW+fadQ29C2Mz/XrLYPqp2lvEDfI="; + }; + + strictDeps = true; + + depsBuildBuild = [ + pkg-config + ]; + + nativeBuildInputs = [ + meson + ninja + pkg-config + asciidoc + gettext + glib + wrapGAppsNoGuiHook + gi-docgen + graphviz + (python3.pythonOnBuildForHost.withPackages (p: [ p.pygobject3 ])) + ] ++ lib.optionals withIntrospection [ + gobject-introspection + vala + ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [ + mesonEmulatorHook + ]; + + buildInputs = [ + glib + libxml2 + sqlite + icu + libsoup + libsoup_3 + libuuid + json-glib + libstemmer + dbus + ] ++ lib.optionals stdenv.isLinux [ + systemd + ]; + + nativeCheckInputs = [ + dbus + ]; + + mesonFlags = [ + "-Ddocs=true" + (lib.mesonEnable "introspection" withIntrospection) + (lib.mesonEnable "vapi" withIntrospection) + (lib.mesonBool "test_utils" withIntrospection) + ] ++ ( + let + # https://gitlab.gnome.org/GNOME/tracker/-/blob/master/meson.build#L159 + crossFile = writeText "cross-file.conf" '' + [properties] + sqlite3_has_fts5 = '${lib.boolToString (lib.hasInfix "-DSQLITE_ENABLE_FTS3" sqlite.NIX_CFLAGS_COMPILE)}' + ''; + in + [ + "--cross-file=${crossFile}" + ] + ) ++ lib.optionals (!stdenv.isLinux) [ + "-Dsystemd_user_services=false" + ]; + + doCheck = + # https://gitlab.gnome.org/GNOME/tracker/-/issues/402 + !stdenv.isDarwin + # https://gitlab.gnome.org/GNOME/tracker/-/issues/398 + && !stdenv.is32bit; + + postPatch = '' + chmod +x \ + docs/reference/libtracker-sparql/embed-files.py \ + docs/reference/libtracker-sparql/generate-svgs.sh + patchShebangs \ + utils/data-generators/cc/generate \ + docs/reference/libtracker-sparql/embed-files.py \ + docs/reference/libtracker-sparql/generate-svgs.sh + ''; + + preCheck = + let + linuxDot0 = lib.optionalString stdenv.isLinux ".0"; + darwinDot0 = lib.optionalString stdenv.isDarwin ".0"; + extension = stdenv.hostPlatform.extensions.sharedLibrary; + in + '' + # (tracker-store:6194): Tracker-CRITICAL **: 09:34:07.722: Cannot initialize database: Could not open sqlite3 database:'/homeless-shelter/.cache/tracker/meta.db': unable to open database file + export HOME=$(mktemp -d) + + # Our gobject-introspection patches make the shared library paths absolute + # in the GIR files. When running functional tests, the library is not yet installed, + # though, so we need to replace the absolute path with a local one during build. + # We are using a symlink that will be overridden during installation. + mkdir -p $out/lib + ln -s $PWD/src/libtracker-sparql/libtracker-sparql-3.0${darwinDot0}${extension} $out/lib/libtracker-sparql-3.0${darwinDot0}${extension}${linuxDot0} + ''; + + checkPhase = '' + runHook preCheck + + dbus-run-session \ + --config-file=${dbus}/share/dbus-1/session.conf \ + meson test \ + --timeout-multiplier 2 \ + --print-errorlogs + + runHook postCheck + ''; + + postCheck = '' + # Clean up out symlinks + rm -r $out/lib + ''; + + postFixup = '' + # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back. + moveToOutput "share/doc" "$devdoc" + ''; + + # passthru = { + # updateScript = gnome.updateScript { + # packageName = finalAttrs.pname; + # }; + # tests.pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + + meta = with lib; { + homepage = "https://tracker.gnome.org/"; + description = "Desktop-neutral user information store, search tool and indexer"; + mainProgram = "tracker3"; + maintainers = teams.gnome.members; + license = licenses.gpl2Plus; + platforms = platforms.unix; + pkgConfigModules = [ "tracker-sparql-3.0" "tracker-testutils-3.0" ]; + }; +}) diff --git a/pkgs/by-name/tr/tradcpp/aarch64.patch b/pkgs/by-name/tr/tradcpp/aarch64.patch new file mode 100644 index 0000000..ef7ad98 --- /dev/null +++ b/pkgs/by-name/tr/tradcpp/aarch64.patch @@ -0,0 +1,12 @@ +diff a/config.h b/config.h +--- a/config.h ++++ b/config.h +@@ -124,6 +124,8 @@ + #define CONFIG_CPU "__ppc64__" + #elif defined(__ARM__) + #define CONFIG_CPU "__ARM__" ++#elif defined(__aarch64__) ++#define CONFIG_CPU "__aarch64__" + #else + /* let it go */ + #endif diff --git a/pkgs/by-name/tr/tradcpp/default.nix b/pkgs/by-name/tr/tradcpp/default.nix new file mode 100644 index 0000000..73d0cf5 --- /dev/null +++ b/pkgs/by-name/tr/tradcpp/default.nix @@ -0,0 +1,28 @@ +{ lib, stdenv, fetchurl, autoconf }: + +stdenv.mkDerivation rec { + pname = "tradcpp"; + version = "0.5.2"; + + src = fetchurl { + url = "https://ftp.netbsd.org/pub/NetBSD/misc/dholland/${pname}-${version}.tar.gz"; + sha256 = "1h2bwxwc13rz3g2236l89hm47f72hn3m4h7wjir3j532kq0m68bc"; + }; + + strictDeps = true; + # tradcpp only comes with BSD-make Makefile; the patch adds configure support + nativeBuildInputs = [ autoconf ]; + preConfigure = "autoconf"; + patches = [ + ./tradcpp-configure.patch + ./aarch64.patch + ]; + + meta = with lib; { + description = "A traditional (K&R-style) C macro preprocessor"; + mainProgram = "tradcpp"; + platforms = platforms.all; + license = licenses.bsd2; + }; + +} diff --git a/pkgs/by-name/tr/tradcpp/tradcpp-configure.patch b/pkgs/by-name/tr/tradcpp/tradcpp-configure.patch new file mode 100644 index 0000000..39cc499 --- /dev/null +++ b/pkgs/by-name/tr/tradcpp/tradcpp-configure.patch @@ -0,0 +1,84 @@ +*** /dev/null Wed Jan 7 11:47:26 2015 +--- tradcpp-0.4/Makefile.in Wed Jan 7 11:43:15 2015 +*************** +*** 0 **** +--- 1,64 ---- ++ SHELL = /bin/sh ++ ++ ### Filled in by `configure' ### ++ srcdir = @srcdir@ ++ VPATH = @srcdir@ ++ CC = @CC@ ++ CFLAGS = @CFLAGS@ ++ CPPFLAGS = @CPPFLAGS@ ++ ++ LDFLAGS = @LDFLAGS@ ++ ++ prefix = @prefix@ ++ exec_prefix = @exec_prefix@ ++ ++ bindir = @bindir@ ++ libdir = @libdir@ ++ incdir = @includedir@ ++ manext = 1 ++ mandir = @mandir@/man$(manext) ++ docdir = @docdir@ ++ datarootdir = @datarootdir@ ++ datadir = @datadir@ ++ ++ OBJS= main.o \ ++ files.o directive.o eval.o macro.o output.o \ ++ place.o array.o utils.o ++ ++ .PHONY: all clean install man doc dist ++ ++ default: all ++ ++ all: tradcpp ++ ++ tradcpp: $(OBJS) ++ $(CC) $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) -o $@ $(OBJS) ++ ++ clean: ++ rm -f *.o ++ ++ distclean: clean ++ rm -f Makefile config.log config.status config-cache ++ ++ install: tradcpp ++ mkdir -p $(DESTDIR)$(mandir) ++ install tradcpp.1 $(DESTDIR)$(mandir) ++ mkdir -p $(DESTDIR)$(bindir) ++ install tradcpp $(DESTDIR)$(bindir) ++ ++ .c.o: ++ $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< ++ ++ array.o: array.c array.h inlinedefs.h utils.h ++ directive.o: directive.c utils.h mode.h place.h files.h directive.h \ ++ macro.h eval.h output.h ++ eval.o: eval.c utils.h array.h inlinedefs.h mode.h place.h eval.h ++ files.o: files.c array.h inlinedefs.h utils.h mode.h place.h files.h \ ++ directive.h ++ macro.o: macro.c array.h inlinedefs.h utils.h mode.h place.h macro.h \ ++ output.h ++ main.o: main.c version.h config.h utils.h array.h inlinedefs.h mode.h \ ++ place.h files.h directive.h macro.h ++ output.o: output.c utils.h mode.h place.h output.h ++ place.o: place.c utils.h array.h inlinedefs.h place.h ++ utils.o: utils.c utils.h +*** /dev/null Wed Jan 7 11:47:26 2015 +--- tradcpp-0.4/configure.ac Wed Jan 7 11:22:18 2015 +*************** +*** 0 **** +--- 1,10 ---- ++ AC_PREREQ([2.60])dnl ++ AC_INIT(main.c) ++ AC_PROG_CC ++ AC_LANG(C) ++ AC_SUBST(CC) ++ AC_SUBST(CFLAGS) ++ AC_SUBST(CPPFLAGS) ++ AC_SUBST(LDFLAGS) ++ AC_SUBST(LD) ++ AC_OUTPUT(Makefile) diff --git a/pkgs/by-name/tz/tzdata/0001-Add-exe-extension-for-MS-Windows-binaries.patch b/pkgs/by-name/tz/tzdata/0001-Add-exe-extension-for-MS-Windows-binaries.patch new file mode 100644 index 0000000..af90ce5 --- /dev/null +++ b/pkgs/by-name/tz/tzdata/0001-Add-exe-extension-for-MS-Windows-binaries.patch @@ -0,0 +1,15 @@ +diff --git a/Makefile b/Makefile +index a9a989e..4da737b 100644 +--- a/Makefile ++++ b/Makefile +@@ -606,8 +606,8 @@ install: all $(DATA) $(REDO) $(MANS) + -t '$(DESTDIR)$(TZDEFAULT)' + cp -f $(TABDATA) '$(DESTDIR)$(TZDIR)/.' + cp tzselect '$(DESTDIR)$(BINDIR)/.' +- cp zdump '$(DESTDIR)$(ZDUMPDIR)/.' +- cp zic '$(DESTDIR)$(ZICDIR)/.' ++ cp zdump.exe '$(DESTDIR)$(ZDUMPDIR)/.' ++ cp zic.exe '$(DESTDIR)$(ZICDIR)/.' + cp libtz.a '$(DESTDIR)$(LIBDIR)/.' + $(RANLIB) '$(DESTDIR)$(LIBDIR)/libtz.a' + cp -f newctime.3 newtzset.3 '$(DESTDIR)$(MANDIR)/man3/.' diff --git a/pkgs/by-name/tz/tzdata/default.nix b/pkgs/by-name/tz/tzdata/default.nix new file mode 100644 index 0000000..522b2da --- /dev/null +++ b/pkgs/by-name/tz/tzdata/default.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, fetchurl, buildPackages }: + +stdenv.mkDerivation (finalAttrs: { + pname = "tzdata"; + version = "2024a"; + + srcs = [ + (fetchurl { + url = "https://data.iana.org/time-zones/releases/tzdata${finalAttrs.version}.tar.gz"; + hash = "sha256-DQQ0RZrL0gWaeo2h8zBKhKhlkfbtacYkj/+lArbt/+M="; + }) + (fetchurl { + url = "https://data.iana.org/time-zones/releases/tzcode${finalAttrs.version}.tar.gz"; + hash = "sha256-gAcolK3/WkWPHRQ+FuTKHYsqEiycU5naSCy2jLpqH/g="; + }) + ]; + + sourceRoot = "."; + + patches = lib.optionals stdenv.hostPlatform.isWindows [ + ./0001-Add-exe-extension-for-MS-Windows-binaries.patch + ]; + + outputs = [ "out" "bin" "man" "dev" ]; + propagatedBuildOutputs = [ ]; + + makeFlags = [ + "TOPDIR=${placeholder "out"}" + "TZDIR=${placeholder "out"}/share/zoneinfo" + "BINDIR=${placeholder "bin"}/bin" + "ZICDIR=${placeholder "bin"}/bin" + "ETCDIR=$(TMPDIR)/etc" + "TZDEFAULT=tzdefault-to-remove" + "LIBDIR=${placeholder "dev"}/lib" + "MANDIR=${placeholder "man"}/share/man" + "AWK=awk" + "CFLAGS=-DHAVE_LINK=0" + "CFLAGS+=-DZIC_BLOAT_DEFAULT=\\\"fat\\\"" + "cc=${stdenv.cc.targetPrefix}cc" + "AR=${stdenv.cc.targetPrefix}ar" + ] ++ lib.optionals stdenv.hostPlatform.isWindows [ + "CFLAGS+=-DHAVE_DIRECT_H" + "CFLAGS+=-DHAVE_SETENV=0" + "CFLAGS+=-DHAVE_SYMLINK=0" + "CFLAGS+=-DRESERVE_STD_EXT_IDS" + ]; + + doCheck = true; + # everything except for: + # - check_web, because that needs curl and wants to talk to https://validator.w3.org + # - check_now, because that depends on the current time + checkTarget = "check_back check_character_set check_white_space check_links check_name_lengths check_slashed_abbrs check_sorted check_tables check_ziguard check_zishrink check_tzs"; + + installFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "zic=${buildPackages.tzdata.bin}/bin/zic" + ]; + + postInstall = + '' + rm $out/share/zoneinfo-posix + rm $out/share/zoneinfo/tzdefault-to-remove + mkdir $out/share/zoneinfo/posix + ( cd $out/share/zoneinfo/posix; ln -s ../* .; rm posix ) + mv $out/share/zoneinfo-leaps $out/share/zoneinfo/right + + cp leap-seconds.list $out/share/zoneinfo + + mkdir -p "$dev/include" + cp tzfile.h "$dev/include/tzfile.h" + ''; + + setupHook = ./tzdata-setup-hook.sh; + + meta = with lib; { + homepage = "http://www.iana.org/time-zones"; + description = "Database of current and historical time zones"; + changelog = "https://github.com/eggert/tz/blob/${finalAttrs.version}/NEWS"; + license = with licenses; [ + bsd3 # tzcode + publicDomain # tzdata + ]; + platforms = platforms.all; + maintainers = with maintainers; [ ajs124 fpletz ]; + }; +}) diff --git a/pkgs/by-name/tz/tzdata/tzdata-setup-hook.sh b/pkgs/by-name/tz/tzdata/tzdata-setup-hook.sh new file mode 100644 index 0000000..9975d0a --- /dev/null +++ b/pkgs/by-name/tz/tzdata/tzdata-setup-hook.sh @@ -0,0 +1,5 @@ +tzdataHook() { + export TZDIR=@out@/share/zoneinfo +} + +addEnvHooks "$targetOffset" tzdataHook diff --git a/pkgs/by-name/un/unifdef/default.nix b/pkgs/by-name/un/unifdef/default.nix new file mode 100644 index 0000000..ebb034a --- /dev/null +++ b/pkgs/by-name/un/unifdef/default.nix @@ -0,0 +1,24 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "unifdef"; + version = "2.12"; + + src = fetchurl { + url = "https://dotat.at/prog/unifdef/unifdef-${version}.tar.xz"; + sha256 = "00647bp3m9n01ck6ilw6r24fk4mivmimamvm4hxp5p6wxh10zkj3"; + }; + + makeFlags = [ + "prefix=$(out)" + "DESTDIR=" + ]; + + meta = with lib; { + homepage = "https://dotat.at/prog/unifdef/"; + description = "Selectively remove C preprocessor conditionals"; + license = licenses.bsd2; + platforms = platforms.unix; + maintainers = with maintainers; [ orivej vrthra ]; + }; +} diff --git a/pkgs/by-name/un/unixtools/packages.nix b/pkgs/by-name/un/unixtools/packages.nix new file mode 100644 index 0000000..6b1e475 --- /dev/null +++ b/pkgs/by-name/un/unixtools/packages.nix @@ -0,0 +1,11 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + # Unix tools + unixtools = recurseIntoAttrs (callPackages ./unixtools.nix { }); + inherit (unixtools) hexdump ps logger eject umount + mount wall hostname more sysctl getconf + getent locale killall xxd watch; +} diff --git a/pkgs/by-name/un/unixtools/unixtools.nix b/pkgs/by-name/un/unixtools/unixtools.nix new file mode 100644 index 0000000..e15d38d --- /dev/null +++ b/pkgs/by-name/un/unixtools/unixtools.nix @@ -0,0 +1,201 @@ +{ pkgs, buildEnv, runCommand, lib, stdenv, path }: + +# These are some unix tools that are commonly included in the /usr/bin +# and /usr/sbin directory under more normal distributions. Along with +# coreutils, these are commonly assumed to be available by build +# systems, but we can't assume they are available. In Nix, we list +# each program by name directly through this unixtools attribute. + +# You should always try to use single binaries when available. For +# instance, if your program needs to use "ps", just list it as a build +# input, not "procps" which requires Linux. + +let + inherit (lib) + getBin + getOutput + mapAttrs + platforms + ; + + version = "1003.1-2008"; + + singleBinary = cmd: providers: let + provider = providers.${stdenv.hostPlatform.parsed.kernel.name} or providers.linux; + bin = "${getBin provider}/bin/${cmd}"; + manpage = "${getOutput "man" provider}/share/man/man1/${cmd}.1.gz"; + in runCommand "${cmd}-${provider.name}" { + meta = { + mainProgram = cmd; + priority = 10; + platforms = platforms.${stdenv.hostPlatform.parsed.kernel.name} or platforms.all; + }; + passthru = { inherit provider; }; + preferLocalBuild = true; + } '' + if ! [ -x ${bin} ]; then + echo Cannot find command ${cmd} + exit 1 + fi + + mkdir -p $out/bin + ln -s ${bin} $out/bin/${cmd} + + if [ -f ${manpage} ]; then + mkdir -p $out/share/man/man1 + ln -s ${manpage} $out/share/man/man1/${cmd}.1.gz + fi + ''; + + # more is unavailable in darwin + # so we just use less + more_compat = runCommand "more-${pkgs.less.name}" {} '' + mkdir -p $out/bin + ln -s ${pkgs.less}/bin/less $out/bin/more + ''; + + bins = mapAttrs singleBinary { + # singular binaries + arp = { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + col = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.text_cmds; + }; + column = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.text_cmds; + }; + eject = { + linux = pkgs.util-linux; + }; + getconf = { + linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc + else pkgs.netbsd.getconf; + darwin = pkgs.darwin.system_cmds; + }; + getent = { + linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc.getent + else pkgs.netbsd.getent; + darwin = pkgs.netbsd.getent; + }; + getopt = { + linux = pkgs.util-linux; + darwin = pkgs.getopt; + }; + fdisk = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.diskdev_cmds; + }; + fsck = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.diskdev_cmds; + }; + hexdump = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.shell_cmds; + }; + hostname = { + linux = pkgs.nettools; + darwin = pkgs.darwin.shell_cmds; + }; + ifconfig = { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + killall = { + linux = pkgs.psmisc; + darwin = pkgs.darwin.shell_cmds; + }; + locale = { + linux = pkgs.glibc; + darwin = pkgs.darwin.adv_cmds; + }; + logger = { + linux = pkgs.util-linux; + }; + more = { + linux = pkgs.util-linux; + darwin = more_compat; + }; + mount = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.diskdev_cmds; + }; + netstat = { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + ping = { + linux = pkgs.iputils; + darwin = pkgs.darwin.network_cmds; + }; + ps = { + linux = pkgs.procps; + darwin = pkgs.darwin.ps; + }; + quota = { + linux = pkgs.linuxquota; + darwin = pkgs.darwin.diskdev_cmds; + }; + route = { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + script = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.shell_cmds; + }; + sysctl = { + linux = pkgs.procps; + darwin = pkgs.darwin.system_cmds; + }; + top = { + linux = pkgs.procps; + darwin = pkgs.darwin.top; + }; + umount = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.diskdev_cmds; + }; + whereis = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.shell_cmds; + }; + wall = { + linux = pkgs.util-linux; + }; + watch = { + linux = pkgs.procps; + + # watch is the only command from procps that builds currently on + # Darwin. Unfortunately no other implementations exist currently! + darwin = pkgs.callPackage (path + "/pkgs/by-name/pr/procps-ng") {}; + }; + write = { + linux = pkgs.util-linux; + darwin = pkgs.darwin.basic_cmds; + }; + xxd = { + linux = pkgs.vim.xxd; + darwin = pkgs.vim.xxd; + }; + }; + + makeCompat = pname: paths: + buildEnv { + name = "${pname}-${version}"; + inherit paths; + }; + + # Compatibility derivations + # Provided for old usage of these commands. + compat = with bins; mapAttrs makeCompat { + procps = [ ps sysctl top watch ]; + util-linux = [ fsck fdisk getopt hexdump mount + script umount whereis write col column ]; + nettools = [ arp hostname ifconfig netstat route ]; + }; +in bins // compat diff --git a/pkgs/by-name/un/unzip/CVE-2014-8139.diff b/pkgs/by-name/un/unzip/CVE-2014-8139.diff new file mode 100644 index 0000000..3bcc21c --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2014-8139.diff @@ -0,0 +1,47 @@ +From RedHat: https://bugzilla.redhat.com/attachment.cgi?id=971984&action=diff&context=patch&collapsed=&headers=1&format=raw + +--- unzip60/extract.c 2010-04-03 14:41:55 -0500 ++++ unzip60/extract.c 2014-12-03 15:33:35 -0600 +@@ -1,5 +1,5 @@ + /* +- Copyright (c) 1990-2009 Info-ZIP. All rights reserved. ++ Copyright (c) 1990-2014 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2009-Jan-02 or later + (the contents of which are also included in unzip.h) for terms of use. +@@ -298,6 +298,8 @@ + #ifndef SFX + static ZCONST char Far InconsistEFlength[] = "bad extra-field entry:\n \ + EF block length (%u bytes) exceeds remaining EF data (%u bytes)\n"; ++ static ZCONST char Far TooSmallEFlength[] = "bad extra-field entry:\n \ ++ EF block length (%u bytes) invalid (< %d)\n"; + static ZCONST char Far InvalidComprDataEAs[] = + " invalid compressed data for EAs\n"; + # if (defined(WIN32) && defined(NTSD_EAS)) +@@ -2023,7 +2025,8 @@ + ebID = makeword(ef); + ebLen = (unsigned)makeword(ef+EB_LEN); + +- if (ebLen > (ef_len - EB_HEADSIZE)) { ++ if (ebLen > (ef_len - EB_HEADSIZE)) ++ { + /* Discovered some extra field inconsistency! */ + if (uO.qflag) + Info(slide, 1, ((char *)slide, "%-22s ", +@@ -2032,6 +2035,16 @@ + ebLen, (ef_len - EB_HEADSIZE))); + return PK_ERR; + } ++ else if (ebLen < EB_HEADSIZE) ++ { ++ /* Extra block length smaller than header length. */ ++ if (uO.qflag) ++ Info(slide, 1, ((char *)slide, "%-22s ", ++ FnFilter1(G.filename))); ++ Info(slide, 1, ((char *)slide, LoadFarString(TooSmallEFlength), ++ ebLen, EB_HEADSIZE)); ++ return PK_ERR; ++ } + + switch (ebID) { + case EF_OS2: diff --git a/pkgs/by-name/un/unzip/CVE-2014-8140.diff b/pkgs/by-name/un/unzip/CVE-2014-8140.diff new file mode 100644 index 0000000..81b96b8 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2014-8140.diff @@ -0,0 +1,26 @@ +From RedHat: https://bugzilla.redhat.com/attachment.cgi?id=969621&action=diff +(unzip60/ path prefix added) + +--- unzip60/extract.c 2009-03-14 02:32:52.000000000 +0100 ++++ unzip60/extract.c 2014-12-05 22:43:13.000000000 +0100 +@@ -2221,10 +2234,17 @@ static int test_compr_eb(__G__ eb, eb_si + if (compr_offset < 4) /* field is not compressed: */ + return PK_OK; /* do nothing and signal OK */ + ++ /* Return no/bad-data error status if any problem is found: ++ * 1. eb_size is too small to hold the uncompressed size ++ * (eb_ucsize). (Else extract eb_ucsize.) ++ * 2. eb_ucsize is zero (invalid). 2014-12-04 SMS. ++ * 3. eb_ucsize is positive, but eb_size is too small to hold ++ * the compressed data header. ++ */ + if ((eb_size < (EB_UCSIZE_P + 4)) || +- ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L && +- eb_size <= (compr_offset + EB_CMPRHEADLEN))) +- return IZ_EF_TRUNC; /* no compressed data! */ ++ ((eb_ucsize = makelong( eb+ (EB_HEADSIZE+ EB_UCSIZE_P))) == 0L) || ++ ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN)))) ++ return IZ_EF_TRUNC; /* no/bad compressed data! */ + + if ( + #ifdef INT_16BIT diff --git a/pkgs/by-name/un/unzip/CVE-2014-8141.diff b/pkgs/by-name/un/unzip/CVE-2014-8141.diff new file mode 100644 index 0000000..1100719 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2014-8141.diff @@ -0,0 +1,136 @@ +From RedHat: https://bugzilla.redhat.com/attachment.cgi?id=969625&action=diff +(unzip60/ path prefix added) + +--- unzip60/process.c 2009-03-06 02:25:10.000000000 +0100 ++++ unzip60/process.c 2014-12-05 22:42:39.000000000 +0100 +@@ -1,5 +1,5 @@ + /* +- Copyright (c) 1990-2009 Info-ZIP. All rights reserved. ++ Copyright (c) 1990-2014 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2009-Jan-02 or later + (the contents of which are also included in unzip.h) for terms of use. +@@ -1888,48 +1888,82 @@ int getZip64Data(__G__ ef_buf, ef_len) + and a 4-byte version of disk start number. + Sets both local header and central header fields. Not terribly clever, + but it means that this procedure is only called in one place. ++ ++ 2014-12-05 SMS. ++ Added checks to ensure that enough data are available before calling ++ makeint64() or makelong(). Replaced various sizeof() values with ++ simple ("4" or "8") constants. (The Zip64 structures do not depend ++ on our variable sizes.) Error handling is crude, but we should now ++ stay within the buffer. + ---------------------------------------------------------------------------*/ + ++#define Z64FLGS 0xffff ++#define Z64FLGL 0xffffffff ++ + if (ef_len == 0 || ef_buf == NULL) + return PK_COOL; + + Trace((stderr,"\ngetZip64Data: scanning extra field of length %u\n", + ef_len)); + +- while (ef_len >= EB_HEADSIZE) { ++ while (ef_len >= EB_HEADSIZE) ++ { + eb_id = makeword(EB_ID + ef_buf); + eb_len = makeword(EB_LEN + ef_buf); + +- if (eb_len > (ef_len - EB_HEADSIZE)) { +- /* discovered some extra field inconsistency! */ ++ if (eb_len > (ef_len - EB_HEADSIZE)) ++ { ++ /* Extra block length exceeds remaining extra field length. */ + Trace((stderr, + "getZip64Data: block length %u > rest ef_size %u\n", eb_len, + ef_len - EB_HEADSIZE)); + break; + } +- if (eb_id == EF_PKSZ64) { +- ++ if (eb_id == EF_PKSZ64) ++ { + int offset = EB_HEADSIZE; + +- if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize == 0xffffffff){ +- G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf); +- offset += sizeof(G.crec.ucsize); ++ if ((G.crec.ucsize == Z64FLGL) || (G.lrec.ucsize == Z64FLGL)) ++ { ++ if (offset+ 8 > ef_len) ++ return PK_ERR; ++ ++ G.crec.ucsize = G.lrec.ucsize = makeint64(offset + ef_buf); ++ offset += 8; + } +- if (G.crec.csize == 0xffffffff || G.lrec.csize == 0xffffffff){ +- G.csize = G.lrec.csize = G.crec.csize = makeint64(offset + ef_buf); +- offset += sizeof(G.crec.csize); ++ ++ if ((G.crec.csize == Z64FLGL) || (G.lrec.csize == Z64FLGL)) ++ { ++ if (offset+ 8 > ef_len) ++ return PK_ERR; ++ ++ G.csize = G.crec.csize = G.lrec.csize = makeint64(offset + ef_buf); ++ offset += 8; + } +- if (G.crec.relative_offset_local_header == 0xffffffff){ ++ ++ if (G.crec.relative_offset_local_header == Z64FLGL) ++ { ++ if (offset+ 8 > ef_len) ++ return PK_ERR; ++ + G.crec.relative_offset_local_header = makeint64(offset + ef_buf); +- offset += sizeof(G.crec.relative_offset_local_header); ++ offset += 8; + } +- if (G.crec.disk_number_start == 0xffff){ ++ ++ if (G.crec.disk_number_start == Z64FLGS) ++ { ++ if (offset+ 4 > ef_len) ++ return PK_ERR; ++ + G.crec.disk_number_start = (zuvl_t)makelong(offset + ef_buf); +- offset += sizeof(G.crec.disk_number_start); ++ offset += 4; + } ++#if 0 ++ break; /* Expect only one EF_PKSZ64 block. */ ++#endif /* 0 */ + } + +- /* Skip this extra field block */ ++ /* Skip this extra field block. */ + ef_buf += (eb_len + EB_HEADSIZE); + ef_len -= (eb_len + EB_HEADSIZE); + } +--- unzip60/fileio.c 2009-04-20 02:03:44.000000000 +0200 ++++ unzip60/fileio.c 2014-12-05 22:44:16.000000000 +0100 +@@ -176,6 +176,8 @@ static ZCONST char Far FilenameTooLongTr + #endif + static ZCONST char Far ExtraFieldTooLong[] = + "warning: extra field too long (%d). Ignoring...\n"; ++static ZCONST char Far ExtraFieldCorrupt[] = ++ "warning: extra field (type: 0x%04x) corrupt. Continuing...\n"; + + #ifdef WINDLL + static ZCONST char Far DiskFullQuery[] = +@@ -2295,7 +2297,12 @@ int do_string(__G__ length, option) /* + if (readbuf(__G__ (char *)G.extra_field, length) == 0) + return PK_EOF; + /* Looks like here is where extra fields are read */ +- getZip64Data(__G__ G.extra_field, length); ++ if (getZip64Data(__G__ G.extra_field, length) != PK_COOL) ++ { ++ Info(slide, 0x401, ((char *)slide, ++ LoadFarString( ExtraFieldCorrupt), EF_PKSZ64)); ++ error = PK_WARN; ++ } + #ifdef UNICODE_SUPPORT + G.unipath_filename = NULL; + if (G.UzO.U_flag < 2) { diff --git a/pkgs/by-name/un/unzip/CVE-2014-9636.diff b/pkgs/by-name/un/unzip/CVE-2014-9636.diff new file mode 100644 index 0000000..d4c7f75 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2014-9636.diff @@ -0,0 +1,42 @@ +From 190040ebfcf5395a6ccedede2cc9343d34f0a108 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 11 Feb 2015 +Subject: Info-ZIP UnZip buffer overflow + +By carefully crafting a corrupt ZIP archive with "extra fields" that +purport to have compressed blocks larger than the corresponding +uncompressed blocks in STORED no-compression mode, an attacker can +trigger a heap overflow that can result in application crash or +possibly have other unspecified impact. + +This patch ensures that when extra fields use STORED mode, the +"compressed" and uncompressed block sizes match. + +--- + extract.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/extract.c ++++ b/extract.c +@@ -2217,6 +2217,7 @@ static int test_compr_eb(__G__ eb, eb_si + ulg eb_ucsize; + uch *eb_ucptr; + int r; ++ ush method; + + if (compr_offset < 4) /* field is not compressed: */ + return PK_OK; /* do nothing and signal OK */ +@@ -2226,6 +2227,13 @@ static int test_compr_eb(__G__ eb, eb_si + eb_size <= (compr_offset + EB_CMPRHEADLEN))) + return IZ_EF_TRUNC; /* no compressed data! */ + ++ method = makeword(eb + (EB_HEADSIZE + compr_offset)); ++ if ((method == STORED) && ++ (eb_size - compr_offset - EB_CMPRHEADLEN != eb_ucsize)) ++ return PK_ERR; /* compressed & uncompressed ++ * should match in STORED ++ * method */ ++ + if ( + #ifdef INT_16BIT + (((ulg)(extent)eb_ucsize) != eb_ucsize) || diff --git a/pkgs/by-name/un/unzip/CVE-2014-9913.patch b/pkgs/by-name/un/unzip/CVE-2014-9913.patch new file mode 100644 index 0000000..a5675f4 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2014-9913.patch @@ -0,0 +1,29 @@ +From: "Steven M. Schweda" +Subject: Fix CVE-2014-9913, buffer overflow in unzip +Bug: https://sourceforge.net/p/infozip/bugs/27/ +Bug-Debian: https://bugs.debian.org/847485 +Bug-Ubuntu: https://launchpad.net/bugs/387350 +X-Debian-version: 6.0-21 + +--- a/list.c ++++ b/list.c +@@ -339,7 +339,18 @@ + G.crec.compression_method == ENHDEFLATED) { + methbuf[5] = dtype[(G.crec.general_purpose_bit_flag>>1) & 3]; + } else if (methnum >= NUM_METHODS) { +- sprintf(&methbuf[4], "%03u", G.crec.compression_method); ++ /* 2013-02-26 SMS. ++ * http://sourceforge.net/p/infozip/bugs/27/ CVE-2014-9913. ++ * Unexpectedly large compression methods overflow ++ * &methbuf[]. Use the old, three-digit decimal format ++ * for values which fit. Otherwise, sacrifice the ++ * colon, and use four-digit hexadecimal. ++ */ ++ if (G.crec.compression_method <= 999) { ++ sprintf( &methbuf[ 4], "%03u", G.crec.compression_method); ++ } else { ++ sprintf( &methbuf[ 3], "%04X", G.crec.compression_method); ++ } + } + + #if 0 /* GRR/Euro: add this? */ diff --git a/pkgs/by-name/un/unzip/CVE-2015-7696.diff b/pkgs/by-name/un/unzip/CVE-2015-7696.diff new file mode 100644 index 0000000..3aad17b --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2015-7696.diff @@ -0,0 +1,66 @@ +From 68efed87fabddd450c08f3112f62a73f61d493c9 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka +Date: Mon, 14 Sep 2015 18:23:17 +0200 +Subject: [PATCH 1/2] upstream fix for heap overflow + +https://bugzilla.redhat.com/attachment.cgi?id=1073002 +--- + crypt.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/crypt.c b/crypt.c +index 784e411..a8975f2 100644 +--- a/crypt.c ++++ b/crypt.c +@@ -465,7 +465,17 @@ int decrypt(__G__ passwrd) + GLOBAL(pInfo->encrypted) = FALSE; + defer_leftover_input(__G); + for (n = 0; n < RAND_HEAD_LEN; n++) { +- b = NEXTBYTE; ++ /* 2012-11-23 SMS. (OUSPG report.) ++ * Quit early if compressed size < HEAD_LEN. The resulting ++ * error message ("unable to get password") could be improved, ++ * but it's better than trying to read nonexistent data, and ++ * then continuing with a negative G.csize. (See ++ * fileio.c:readbyte()). ++ */ ++ if ((b = NEXTBYTE) == (ush)EOF) ++ { ++ return PK_ERR; ++ } + h[n] = (uch)b; + Trace((stdout, " (%02x)", h[n])); + } +-- +2.4.6 + + +From bd8a743ee0a77e65ad07ef4196c4cd366add3f26 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Mon, 14 Sep 2015 18:24:56 +0200 +Subject: [PATCH 2/2] fix infinite loop when extracting empty bzip2 data + +--- + extract.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/extract.c b/extract.c +index 7134bfe..29db027 100644 +--- a/extract.c ++++ b/extract.c +@@ -2733,6 +2733,12 @@ __GDEF + int repeated_buf_err; + bz_stream bstrm; + ++ if (G.incnt <= 0 && G.csize <= 0L) { ++ /* avoid an infinite loop */ ++ Trace((stderr, "UZbunzip2() got empty input\n")); ++ return 2; ++ } ++ + #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) + if (G.redirect_slide) + wsize = G.redirect_size, redirSlide = G.redirect_buffer; +-- +2.4.6 + diff --git a/pkgs/by-name/un/unzip/CVE-2015-7697.diff b/pkgs/by-name/un/unzip/CVE-2015-7697.diff new file mode 100644 index 0000000..98ebf53 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2015-7697.diff @@ -0,0 +1,36 @@ +From bd150334fb4084f5555a6be26b015a0671cb5b74 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Tue, 22 Sep 2015 18:52:23 +0200 +Subject: [PATCH] extract: prevent unsigned overflow on invalid input + +Suggested-by: Stefan Cornelius +--- + extract.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/extract.c b/extract.c +index 29db027..b9ae667 100644 +--- a/extract.c ++++ b/extract.c +@@ -1257,8 +1257,17 @@ static int extract_or_test_entrylist(__G__ numchunk, + if (G.lrec.compression_method == STORED) { + zusz_t csiz_decrypted = G.lrec.csize; + +- if (G.pInfo->encrypted) ++ if (G.pInfo->encrypted) { ++ if (csiz_decrypted <= 12) { ++ /* handle the error now to prevent unsigned overflow */ ++ Info(slide, 0x401, ((char *)slide, ++ LoadFarStringSmall(ErrUnzipNoFile), ++ LoadFarString(InvalidComprData), ++ LoadFarStringSmall2(Inflate))); ++ return PK_ERR; ++ } + csiz_decrypted -= 12; ++ } + if (G.lrec.ucsize != csiz_decrypted) { + Info(slide, 0x401, ((char *)slide, + LoadFarStringSmall2(WrnStorUCSizCSizDiff), +-- +2.5.2 + diff --git a/pkgs/by-name/un/unzip/CVE-2016-9844.patch b/pkgs/by-name/un/unzip/CVE-2016-9844.patch new file mode 100644 index 0000000..52d0798 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2016-9844.patch @@ -0,0 +1,28 @@ +From: "Steven M. Schweda" +Subject: Fix CVE-2016-9844, buffer overflow in zipinfo +Bug-Debian: https://bugs.debian.org/847486 +Bug-Ubuntu: https://launchpad.net/bugs/1643750 +X-Debian-version: 6.0-21 + +--- a/zipinfo.c ++++ b/zipinfo.c +@@ -1921,7 +1921,18 @@ + ush dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3); + methbuf[3] = dtype[dnum]; + } else if (methnum >= NUM_METHODS) { /* unknown */ +- sprintf(&methbuf[1], "%03u", G.crec.compression_method); ++ /* 2016-12-05 SMS. ++ * https://launchpad.net/bugs/1643750 ++ * Unexpectedly large compression methods overflow ++ * &methbuf[]. Use the old, three-digit decimal format ++ * for values which fit. Otherwise, sacrifice the "u", ++ * and use four-digit hexadecimal. ++ */ ++ if (G.crec.compression_method <= 999) { ++ sprintf( &methbuf[ 1], "%03u", G.crec.compression_method); ++ } else { ++ sprintf( &methbuf[ 0], "%04X", G.crec.compression_method); ++ } + } + + for (k = 0; k < 15; ++k) diff --git a/pkgs/by-name/un/unzip/CVE-2018-18384.patch b/pkgs/by-name/un/unzip/CVE-2018-18384.patch new file mode 100644 index 0000000..e9320e1 --- /dev/null +++ b/pkgs/by-name/un/unzip/CVE-2018-18384.patch @@ -0,0 +1,35 @@ +--- unzip60/list.c ++++ unzip60/list.c +@@ -97,7 +97,7 @@ int list_files(__G) /* return PK-type + { + int do_this_file=FALSE, cfactor, error, error_in_archive=PK_COOL; + #ifndef WINDLL +- char sgn, cfactorstr[10]; ++ char sgn, cfactorstr[1+10+1+1]; /* %NUL */ + int longhdr=(uO.vflag>1); + #endif + int date_format; +@@ -389,9 +389,9 @@ int list_files(__G) /* return PK-type + } + #else /* !WINDLL */ + if (cfactor == 100) +- sprintf(cfactorstr, LoadFarString(CompFactor100)); ++ snprintf(cfactorstr, sizeof(cfactorstr), LoadFarString(CompFactor100)); + else +- sprintf(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor); ++ snprintf(cfactorstr, sizeof(cfactorstr), LoadFarString(CompFactorStr), sgn, cfactor); + if (longhdr) + Info(slide, 0, ((char *)slide, LoadFarString(LongHdrStats), + FmZofft(G.crec.ucsize, "8", "u"), methbuf, +@@ -471,9 +471,9 @@ int list_files(__G) /* return PK-type + + #else /* !WINDLL */ + if (cfactor == 100) +- sprintf(cfactorstr, LoadFarString(CompFactor100)); ++ snprintf(cfactorstr, sizeof(cfactorstr), LoadFarString(CompFactor100)); + else +- sprintf(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor); ++ snprintf(cfactorstr, sizeof(cfactorstr), LoadFarString(CompFactorStr), sgn, cfactor); + if (longhdr) { + Info(slide, 0, ((char *)slide, LoadFarString(LongFileTrailer), + FmZofft(tot_ucsize, "8", "u"), FmZofft(tot_csize, "8", "u"), diff --git a/pkgs/by-name/un/unzip/default.nix b/pkgs/by-name/un/unzip/default.nix new file mode 100644 index 0000000..9860817 --- /dev/null +++ b/pkgs/by-name/un/unzip/default.nix @@ -0,0 +1,107 @@ +{ lib, stdenv, fetchurl +, bzip2 +, enableNLS ? false, libnatspec +}: + +stdenv.mkDerivation rec { + pname = "unzip"; + version = "6.0"; + + src = fetchurl { + url = "mirror://sourceforge/infozip/unzip${lib.replaceStrings ["."] [""] version}.tar.gz"; + sha256 = "0dxx11knh3nk95p2gg2ak777dd11pr7jx5das2g49l262scrcv83"; + }; + + hardeningDisable = [ "format" ]; + + patchFlags = [ "-p1" "-F3" ]; + + patches = [ + ./CVE-2014-8139.diff + ./CVE-2014-8140.diff + ./CVE-2014-8141.diff + ./CVE-2014-9636.diff + ./CVE-2015-7696.diff + ./CVE-2015-7697.diff + ./CVE-2014-9913.patch + ./CVE-2016-9844.patch + ./CVE-2018-18384.patch + ./dont-hardcode-cc.patch + (fetchurl { + url = "https://github.com/madler/unzip/commit/41beb477c5744bc396fa1162ee0c14218ec12213.patch"; + name = "CVE-2019-13232-1.patch"; + sha256 = "04jzd6chg9fw4l5zadkfsrfm5llrd7vhd1dgdjjd29nrvkrjyn14"; + }) + (fetchurl { + url = "https://github.com/madler/unzip/commit/47b3ceae397d21bf822bc2ac73052a4b1daf8e1c.patch"; + name = "CVE-2019-13232-2.patch"; + sha256 = "0iy2wcjyvzwrjk02iszwcpg85fkjxs1bvb9isvdiywszav4yjs32"; + }) + (fetchurl { + url = "https://github.com/madler/unzip/commit/6d351831be705cc26d897db44f878a978f4138fc.patch"; + name = "CVE-2019-13232-3.patch"; + sha256 = "1jvs7dkdqs97qnsqc6hk088alhv8j4c638k65dbib9chh40jd7pf"; + }) + (fetchurl { + urls = [ + # original link (will be dead eventually): + "https://sources.debian.org/data/main/u/unzip/6.0-26%2Bdeb11u1/debian/patches/06-initialize-the-symlink-flag.patch" + + "https://gist.github.com/veprbl/41261bb781571e2246ea42d3f37795f5/raw/d8533d8c6223150f76b0f31aec03e185fcde3579/06-initialize-the-symlink-flag.patch" + ]; + sha256 = "1h00djdvgjhwfb60wl4qrxbyfsbbnn1qw6l2hkldnif4m8f8r1zj"; + }) + (fetchurl { + urls = [ + # original link (will be dead eventually): + "https://sources.debian.org/data/main/u/unzip/6.0-27/debian/patches/28-cve-2022-0529-and-cve-2022-0530.patch" + + "https://web.archive.org/web/20230106200319/https://sources.debian.org/data/main/u/unzip/6.0-27/debian/patches/28-cve-2022-0529-and-cve-2022-0530.patch" + ]; + sha256 = "sha256-on79jElQ+z2ULWAq14RpluAqr9d6itHiZwDkKubBzTc="; + }) + # Clang 16 makes implicit declarations an error by default for C99 and newer, causing the + # configure script to fail to detect errno and the directory libraries on Darwin. + ./implicit-declarations-fix.patch + ] ++ lib.optional enableNLS + (fetchurl { + url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/app-arch/unzip/files/unzip-6.0-natspec.patch?id=56bd759df1d0c750a065b8c845e93d5dfa6b549d"; + name = "unzip-6.0-natspec.patch"; + sha256 = "67ab260ae6adf8e7c5eda2d1d7846929b43562943ec4aff629bd7018954058b1"; + }); + + + nativeBuildInputs = [ bzip2 ]; + buildInputs = [ bzip2 ] ++ lib.optional enableNLS libnatspec; + + makefile = "unix/Makefile"; + + NIX_LDFLAGS = "-lbz2" + lib.optionalString enableNLS " -lnatspec"; + + buildFlags = [ + "generic" + "D_USE_BZ2=-DUSE_BZIP2" + "L_BZ2=-lbz2" + ] + # `lchmod` is not available on Linux, so we remove it to fix "not supported" errors (when the zip file contains symlinks). + # Alpine (musl) and Debian (glibc) also add this flag. + ++ lib.optionals stdenv.isLinux [ "LOCAL_UNZIP=-DNO_LCHMOD" ]; + + preConfigure = '' + sed -i -e 's@CF="-O3 -Wall -I. -DASM_CRC $(LOC)"@CF="-O3 -Wall -I. -DASM_CRC -DLARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(LOC)"@' unix/Makefile + ''; + + installFlags = [ + "prefix=${placeholder "out"}" + ]; + + setupHook = ./setup-hook.sh; + + meta = { + homepage = "http://www.info-zip.org"; + description = "An extraction utility for archives compressed in .zip format"; + license = lib.licenses.info-zip; + platforms = lib.platforms.all; + mainProgram = "unzip"; + }; +} diff --git a/pkgs/by-name/un/unzip/dont-hardcode-cc.patch b/pkgs/by-name/un/unzip/dont-hardcode-cc.patch new file mode 100644 index 0000000..15dbbfe --- /dev/null +++ b/pkgs/by-name/un/unzip/dont-hardcode-cc.patch @@ -0,0 +1,14 @@ +--- a/unix/Makefile ++++ b/unix/Makefile +@@ -42,9 +42,9 @@ + # such as -DDOSWILD). + + # UnZip flags +-CC = cc# try using "gcc" target rather than changing this (CC and LD ++CC ?= cc# try using "gcc" target rather than changing this (CC and LD + LD = $(CC)# must match, else "unresolved symbol: ___main" is possible) +-AS = as ++AS ?= as + LOC = $(D_USE_BZ2) $(LOCAL_UNZIP) + AF = $(LOC) + CFLAGS = -O diff --git a/pkgs/by-name/un/unzip/implicit-declarations-fix.patch b/pkgs/by-name/un/unzip/implicit-declarations-fix.patch new file mode 100644 index 0000000..df19bf1 --- /dev/null +++ b/pkgs/by-name/un/unzip/implicit-declarations-fix.patch @@ -0,0 +1,21 @@ +--- a/unix/configure 2009-04-16 15:25:12.000000000 -0400 ++++ b/unix/configure 2023-05-30 15:18:33.670321348 -0400 +@@ -408,7 +408,7 @@ + echo Check for errno declaration + cat > conftest.c << _EOF_ + #include +-main() ++int main() + { + errno = 0; + return 0; +@@ -419,6 +419,8 @@ + + echo Check for directory libraries + cat > conftest.c << _EOF_ ++#include ++#include + int main() { return closedir(opendir(".")); } + _EOF_ + + diff --git a/pkgs/by-name/un/unzip/setup-hook.sh b/pkgs/by-name/un/unzip/setup-hook.sh new file mode 100644 index 0000000..99c63f6 --- /dev/null +++ b/pkgs/by-name/un/unzip/setup-hook.sh @@ -0,0 +1,11 @@ +unpackCmdHooks+=(_tryUnzip) +_tryUnzip() { + if ! [[ "$curSrc" =~ \.zip$ ]]; then return 1; fi + + # UTF-8 locale is needed for unzip on glibc to handle UTF-8 symbols: + # https://github.com/NixOS/nixpkgs/issues/176225#issuecomment-1146617263 + # Otherwise unzip unpacks escaped file names as if '-U' options was in effect. + # + # Pick en_US.UTF-8 as most possible to be present on glibc, musl and darwin. + LANG=en_US.UTF-8 unzip -qq "$curSrc" +} diff --git a/pkgs/by-name/ut/util-linux/default.nix b/pkgs/by-name/ut/util-linux/default.nix new file mode 100644 index 0000000..e533a81 --- /dev/null +++ b/pkgs/by-name/ut/util-linux/default.nix @@ -0,0 +1,141 @@ +{ lib, stdenv, fetchurl, pkg-config, zlib, shadow +, capabilitiesSupport ? stdenv.isLinux +, libcap_ng +, libxcrypt +, ncursesSupport ? true +, ncurses +, pamSupport ? true +, pam +, systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd +, systemd +, nlsSupport ? true +, translateManpages ? true +, po4a +, installShellFiles +, writeSupport ? stdenv.isLinux +, shadowSupport ? stdenv.isLinux +, memstreamHook +# for passthru +# , gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "util-linux" + lib.optionalString (!nlsSupport && !ncursesSupport && !systemdSupport) "-minimal"; + version = "2.39.3"; + + src = fetchurl { + url = "mirror://kernel/linux/utils/util-linux/v${lib.versions.majorMinor version}/util-linux-${version}.tar.xz"; + hash = "sha256-e2YF5I0aSfQ8xLTPxZ8xPQ3VQC+kC5aBC9Vy4Wff7Q8="; + }; + + patches = [ + ./rtcwake-search-PATH-for-shutdown.patch + ]; + + # We separate some of the utilities into their own outputs. This + # allows putting together smaller systems depending on only part of + # the greater util-linux toolset. + # Compatibility is maintained by symlinking the binaries from the + # smaller outputs in the bin output. + outputs = [ "bin" "dev" "out" "lib" "man" ] ++ lib.optionals stdenv.isLinux [ "mount" ] ++ [ "login" ] ++ lib.optionals stdenv.isLinux [ "swap" ]; + separateDebugInfo = true; + + postPatch = '' + patchShebangs tests/run.sh + + substituteInPlace sys-utils/eject.c \ + --replace "/bin/umount" "$bin/bin/umount" + '' + lib.optionalString shadowSupport '' + substituteInPlace include/pathnames.h \ + --replace "/bin/login" "${shadow}/bin/login" + ''; + + # !!! It would be better to obtain the path to the mount helpers + # (/sbin/mount.*) through an environment variable, but that's + # somewhat risky because we have to consider that mount can setuid + # root... + configureFlags = [ + "--localstatedir=/var" + "--disable-use-tty-group" + "--enable-fs-paths-default=/run/wrappers/bin:/run/current-system/sw/bin:/sbin" + "--disable-makeinstall-setuid" "--disable-makeinstall-chown" + "--disable-su" # provided by shadow + (lib.enableFeature writeSupport "write") + (lib.enableFeature nlsSupport "nls") + (lib.withFeature ncursesSupport "ncursesw") + (lib.withFeature systemdSupport "systemd") + (lib.withFeatureAs systemdSupport + "systemdsystemunitdir" "${placeholder "bin"}/lib/systemd/system/") + (lib.enableFeature translateManpages "poman") + "SYSCONFSTATICDIR=${placeholder "lib"}/lib" + ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) + "scanf_cv_type_modifier=ms" + ; + + makeFlags = [ + "usrbin_execdir=${placeholder "bin"}/bin" + "usrlib_execdir=${placeholder "lib"}/lib" + "usrsbin_execdir=${placeholder "bin"}/sbin" + ]; + + nativeBuildInputs = [ pkg-config installShellFiles ] + ++ lib.optionals translateManpages [ po4a ]; + + buildInputs = [ zlib libxcrypt ] + ++ lib.optionals pamSupport [ pam ] + ++ lib.optionals capabilitiesSupport [ libcap_ng ] + ++ lib.optionals ncursesSupport [ ncurses ] + ++ lib.optionals systemdSupport [ systemd ] + ++ lib.optionals (stdenv.system == "x86_64-darwin") [ memstreamHook ]; + + doCheck = false; # "For development purpose only. Don't execute on production system!" + + enableParallelBuilding = true; + + postInstall = lib.optionalString stdenv.isLinux '' + moveToOutput bin/mount "$mount" + moveToOutput bin/umount "$mount" + ln -svf "$mount/bin/"* $bin/bin/ + '' + '' + + moveToOutput sbin/nologin "$login" + moveToOutput sbin/sulogin "$login" + prefix=$login _moveSbin + ln -svf "$login/bin/"* $bin/bin/ + '' + lib.optionalString stdenv.isLinux '' + + moveToOutput sbin/swapon "$swap" + moveToOutput sbin/swapoff "$swap" + prefix=$swap _moveSbin + ln -svf "$swap/bin/"* $bin/bin/ + '' + '' + + installShellCompletion --bash bash-completion/* + ''; + + # passthru = { + # updateScript = gitUpdater { + # # No nicer place to find latest release. + # url = "https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git"; + # rev-prefix = "v"; + # ignoredVersions = "(-rc).*"; + # }; + # }; + + meta = with lib; { + homepage = "https://www.kernel.org/pub/linux/utils/util-linux/"; + description = "A set of system utilities for Linux"; + changelog = "https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v${lib.versions.majorMinor version}/v${version}-ReleaseNotes"; + # https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/README.licensing + license = with licenses; [ gpl2Only gpl2Plus gpl3Plus lgpl21Plus bsd3 bsdOriginalUC publicDomain ]; + platforms = platforms.unix; + pkgConfigModules = [ + "blkid" + "fdisk" + "mount" + "smartcols" + "uuid" + ]; + priority = 6; # lower priority than coreutils ("kill") and shadow ("login" etc.) packages + }; +} diff --git a/pkgs/by-name/ut/util-linux/packages.nix b/pkgs/by-name/ut/util-linux/packages.nix new file mode 100644 index 0000000..35d1499 --- /dev/null +++ b/pkgs/by-name/ut/util-linux/packages.nix @@ -0,0 +1,18 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + util-linux = callPackage ./. { }; + util-linuxMinimal = util-linux.override { + nlsSupport = false; + ncursesSupport = false; + systemdSupport = false; + translateManpages = false; + }; + + libuuid = + if stdenv.isLinux + then util-linuxMinimal + else null; +} diff --git a/pkgs/by-name/ut/util-linux/rtcwake-search-PATH-for-shutdown.patch b/pkgs/by-name/ut/util-linux/rtcwake-search-PATH-for-shutdown.patch new file mode 100644 index 0000000..52c970a --- /dev/null +++ b/pkgs/by-name/ut/util-linux/rtcwake-search-PATH-for-shutdown.patch @@ -0,0 +1,69 @@ +Search $PATH for the shutdown binary instead of hard-coding /sbin/shutdown, +which isn't valid on NixOS (and a compatibility link on most other modern +distros anyway). + +--- a/include/pathnames.h ++++ b/include/pathnames.h +@@ -50,8 +50,8 @@ + #ifndef _PATH_LOGIN + # define _PATH_LOGIN "/bin/login" + #endif +-#define _PATH_SHUTDOWN "/sbin/shutdown" +-#define _PATH_POWEROFF "/sbin/poweroff" ++#define _PATH_SHUTDOWN "shutdown" ++#define _PATH_POWEROFF "poweroff" + + #define _PATH_TERMCOLORS_DIRNAME "terminal-colors.d" + #define _PATH_TERMCOLORS_DIR "/etc/" _PATH_TERMCOLORS_DIRNAME +--- a/sys-utils/rtcwake.c ++++ b/sys-utils/rtcwake.c +@@ -587,29 +587,29 @@ int main(int argc, char **argv) + char *arg[5]; + int i = 0; + +- if (!access(_PATH_SHUTDOWN, X_OK)) { +- arg[i++] = _PATH_SHUTDOWN; +- arg[i++] = "-h"; +- arg[i++] = "-P"; +- arg[i++] = "now"; +- arg[i] = NULL; +- } else if (!access(_PATH_POWEROFF, X_OK)) { +- arg[i++] = _PATH_POWEROFF; +- arg[i] = NULL; +- } else { +- arg[i] = NULL; +- } ++ arg[i++] = _PATH_SHUTDOWN; ++ arg[i++] = "-h"; ++ arg[i++] = "-P"; ++ arg[i++] = "now"; ++ arg[i] = NULL; + +- if (arg[0]) { +- if (ctl.verbose) +- printf(_("suspend mode: off; executing %s\n"), +- arg[0]); +- if (!ctl.dryrun) { +- execv(arg[0], arg); ++ if (ctl.verbose) ++ printf(_("suspend mode: off; executing %s\n"), ++ arg[0]); ++ ++ if (!ctl.dryrun) { ++ execvp(arg[0], arg); ++ if (ctl.verbose) { + warn(_("failed to execute %s"), arg[0]); +- rc = EX_EXEC_ENOENT; ++ // Reuse translations. ++ printf(_("suspend mode: off; executing %s\n"), ++ _PATH_POWEROFF); + } +- } else { ++ ++ i = 0; ++ arg[i++] = _PATH_POWEROFF; ++ arg[i] = NULL; ++ execvp(arg[0], arg); + /* Failed to find shutdown command */ + warn(_("failed to find shutdown command")); + rc = EX_EXEC_ENOENT; diff --git a/pkgs/by-name/w3/w3m/RAND_egd.libressl.patch b/pkgs/by-name/w3/w3m/RAND_egd.libressl.patch new file mode 100644 index 0000000..49dd417 --- /dev/null +++ b/pkgs/by-name/w3/w3m/RAND_egd.libressl.patch @@ -0,0 +1,11 @@ +--- a/url.c 2014-07-14 12:31:30.476563116 +0200 ++++ b/url.c 2014-07-14 12:32:16.364918248 +0200 +@@ -268,7 +268,7 @@ init_PRNG() + if (RAND_status()) + return; + if ((file = RAND_file_name(buffer, sizeof(buffer)))) { +-#ifdef USE_EGD ++#if defined(USE_EGD) && defined(HAVE_SSL_RAND_EGD) + if (RAND_egd(file) > 0) + return; + #endif diff --git a/pkgs/by-name/w3/w3m/default.nix b/pkgs/by-name/w3/w3m/default.nix new file mode 100644 index 0000000..5d2ea47 --- /dev/null +++ b/pkgs/by-name/w3/w3m/default.nix @@ -0,0 +1,103 @@ +{ lib, stdenv, fetchFromGitHub, fetchpatch +, ncurses, boehmgc, gettext, zlib +, sslSupport ? true, openssl +, graphicsSupport ? !stdenv.isDarwin, imlib2 +, x11Support ? graphicsSupport, libX11 +, mouseSupport ? !stdenv.isDarwin, gpm-ncurses +, perl, man, pkg-config, buildPackages, w3m +, testers +}: + +let + mktable = buildPackages.stdenv.mkDerivation { + name = "w3m-mktable"; + inherit (w3m) src; + nativeBuildInputs = [ pkg-config boehmgc ]; + makeFlags = [ "mktable" ]; + installPhase = '' + install -D mktable $out/bin/mktable + ''; + }; +in stdenv.mkDerivation rec { + pname = "w3m"; + version = "0.5.3+git20230121"; + + src = fetchFromGitHub { + owner = "tats"; + repo = pname; + rev = "v${version}"; + hash = "sha256-upb5lWqhC1jRegzTncIz5e21v4Pw912FyVn217HucFs="; + }; + + NIX_LDFLAGS = lib.optionalString stdenv.isSunOS "-lsocket -lnsl"; + + # we must set these so that the generated files (e.g. w3mhelp.cgi) contain + # the correct paths. + PERL = "${perl}/bin/perl"; + MAN = "${man}/bin/man"; + + makeFlags = [ "AR=${stdenv.cc.bintools.targetPrefix}ar" ]; + + patches = [ + ./RAND_egd.libressl.patch + (fetchpatch { + name = "https.patch"; + url = "https://aur.archlinux.org/cgit/aur.git/plain/https.patch?h=w3m-mouse&id=5b5f0fbb59f674575e87dd368fed834641c35f03"; + sha256 = "08skvaha1hjyapsh8zw5dgfy433mw2hk7qy9yy9avn8rjqj7kjxk"; + }) + ]; + + postPatch = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + ln -s ${mktable}/bin/mktable mktable + # stop make from recompiling mktable + sed -ie 's!mktable.*:.*!mktable:!' Makefile.in + ''; + + nativeBuildInputs = [ pkg-config gettext ]; + buildInputs = [ ncurses boehmgc zlib ] + ++ lib.optional sslSupport openssl + ++ lib.optional mouseSupport gpm-ncurses + ++ lib.optional graphicsSupport imlib2 + ++ lib.optional x11Support libX11; + + postInstall = lib.optionalString graphicsSupport '' + ln -s $out/libexec/w3m/w3mimgdisplay $out/bin + ''; + + hardeningDisable = [ "format" ]; + + configureFlags = + [ "--with-ssl=${openssl.dev}" "--with-gc=${boehmgc.dev}" ] + ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ + "ac_cv_func_setpgrp_void=yes" + ] + ++ lib.optional graphicsSupport "--enable-image=${lib.optionalString x11Support "x11,"}fb" + ++ lib.optional (graphicsSupport && !x11Support) "--without-x"; + + preConfigure = '' + substituteInPlace ./configure --replace "/lib /usr/lib /usr/local/lib /usr/ucblib /usr/ccslib /usr/ccs/lib /lib64 /usr/lib64" /no-such-path + substituteInPlace ./configure --replace /usr /no-such-path + ''; + + enableParallelBuilding = false; + + # for w3mimgdisplay + # see: https://bbs.archlinux.org/viewtopic.php?id=196093 + LIBS = lib.optionalString x11Support "-lX11"; + + passthru.tests.version = testers.testVersion { + inherit version; + package = w3m; + command = "w3m -version"; + }; + + meta = with lib; { + homepage = "https://w3m.sourceforge.net/"; + changelog = "https://github.com/tats/w3m/blob/v${version}/ChangeLog"; + description = "A text-mode web browser"; + maintainers = with maintainers; [ anthonyroussel ]; + platforms = platforms.unix; + license = licenses.mit; + mainProgram = "w3m"; + }; +} diff --git a/pkgs/by-name/w3/w3m/packages.nix b/pkgs/by-name/w3/w3m/packages.nix new file mode 100644 index 0000000..4dbfeac --- /dev/null +++ b/pkgs/by-name/w3/w3m/packages.nix @@ -0,0 +1,31 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + w3m = callPackage ./. { }; + + # Should always be the version with the most features + w3m-full = w3m; + + # Version without X11 + w3m-nox = w3m.override { + x11Support = false; + imlib2 = imlib2-nox; + }; + + # Version without X11 or graphics + w3m-nographics = w3m.override { + x11Support = false; + graphicsSupport = false; + }; + + # Version for batch text processing, not a good browser + w3m-batch = w3m.override { + graphicsSupport = false; + mouseSupport = false; + x11Support = false; + imlib2 = imlib2-nox; + }; + +} diff --git a/pkgs/by-name/wi/which/default.nix b/pkgs/by-name/wi/which/default.nix new file mode 100644 index 0000000..831791a --- /dev/null +++ b/pkgs/by-name/wi/which/default.nix @@ -0,0 +1,29 @@ +{ lib, stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "which"; + version = "2.21"; + + src = fetchurl { + url = "mirror://gnu/which/which-${version}.tar.gz"; + hash = "sha256-9KJFuUEks3fYtJZGv0IfkVXTaqdhS26/g3BdP/x26q0="; + }; + + strictDeps = true; + enableParallelBuilding = true; + + env.NIX_CFLAGS_COMPILE = toString ( + # Enable 64-bit file API. Otherwise `which` fails to find tools + # on filesystems with 64-bit inodes (like `btrfs`) when running + # binaries from 32-bit systems (like `i686-linux`). + lib.optional stdenv.hostPlatform.is32bit "-D_FILE_OFFSET_BITS=64" + ); + + meta = { + homepage = "https://www.gnu.org/software/which/"; + description = "Shows the full path of (shell) commands"; + license = lib.licenses.gpl3Plus; + mainProgram = "which"; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/by-name/wi/windows/cygwin-setup/default.nix b/pkgs/by-name/wi/windows/cygwin-setup/default.nix new file mode 100644 index 0000000..91dad81 --- /dev/null +++ b/pkgs/by-name/wi/windows/cygwin-setup/default.nix @@ -0,0 +1,46 @@ +{ lib, stdenv, fetchcvs, autoconf, automake, libtool, flex, bison, pkg-config +, zlib, bzip2, xz, libgcrypt +}: + +with lib; + +stdenv.mkDerivation rec { + pname = "cygwin-setup"; + version = "20131101"; + + src = fetchcvs { + cvsRoot = ":pserver:anoncvs@cygwin.com:/cvs/cygwin-apps"; + module = "setup"; + date = version; + sha256 = "024wxaaxkf7p1i78bh5xrsqmfz7ss2amigbfl2r5w9h87zqn9aq3"; + }; + + nativeBuildInputs = [ autoconf automake libtool flex bison pkg-config ]; + + buildInputs = let + mkStatic = flip overrideDerivation (o: { + dontDisableStatic = true; + configureFlags = toList (o.configureFlags or []) ++ [ "--enable-static" ]; + buildInputs = map mkStatic (o.buildInputs or []); + propagatedBuildInputs = map mkStatic (o.propagatedBuildInputs or []); + }); + in map mkStatic [ zlib bzip2 xz libgcrypt ]; + + configureFlags = [ "--disable-shared" ]; + + dontDisableStatic = true; + + preConfigure = '' + autoreconf -vfi + ''; + + installPhase = '' + install -vD setup.exe "$out/bin/setup.exe" + ''; + + meta = { + homepage = "https://sourceware.org/cygwin-apps/setup.html"; + description = "A tool for installing Cygwin"; + license = licenses.gpl2Plus; + }; +} diff --git a/pkgs/by-name/wi/windows/default.nix b/pkgs/by-name/wi/windows/default.nix new file mode 100644 index 0000000..7d152a6 --- /dev/null +++ b/pkgs/by-name/wi/windows/default.nix @@ -0,0 +1,50 @@ +{ lib, stdenv, buildPackages +, newScope, overrideCC, crossLibcStdenv, libcCross +}: + +lib.makeScope newScope (self: with self; { + + cygwinSetup = callPackage ./cygwin-setup { }; + + dlfcn = callPackage ./dlfcn { }; + + w32api = callPackage ./w32api { }; + + mingwrt = callPackage ./mingwrt { }; + mingw_runtime = mingwrt; + + mingw_w64 = callPackage ./mingw-w64 { + stdenv = crossLibcStdenv; + }; + + # FIXME untested with llvmPackages_16 was using llvmPackages_8 + crossThreadsStdenv = overrideCC crossLibcStdenv + (if stdenv.hostPlatform.useLLVM or false + then buildPackages.llvmPackages.clangNoLibcxx + else buildPackages.gccWithoutTargetLibc.override (old: { + bintools = old.bintools.override { + libc = libcCross; + }; + libc = libcCross; + })); + + mingw_w64_headers = callPackage ./mingw-w64/headers.nix { }; + + mingw_w64_pthreads = callPackage ./mingw-w64/pthreads.nix { + stdenv = crossThreadsStdenv; + }; + + mcfgthreads_pre_gcc_13 = callPackage ./mcfgthreads/pre_gcc_13.nix { + stdenv = crossThreadsStdenv; + }; + + mcfgthreads = callPackage ./mcfgthreads { + stdenv = crossThreadsStdenv; + }; + + npiperelay = callPackage ./npiperelay { }; + + pthreads = callPackage ./pthread-w32 { }; + + libgnurx = callPackage ./libgnurx { }; +}) diff --git a/pkgs/by-name/wi/windows/dlfcn/default.nix b/pkgs/by-name/wi/windows/dlfcn/default.nix new file mode 100644 index 0000000..d1fba98 --- /dev/null +++ b/pkgs/by-name/wi/windows/dlfcn/default.nix @@ -0,0 +1,23 @@ +{ stdenv, lib, fetchFromGitHub, cmake }: + +stdenv.mkDerivation rec { + pname = "dlfcn"; + version = "1.3.1"; + + src = fetchFromGitHub { + owner = "dlfcn-win32"; + repo = "dlfcn-win32"; + rev = "v${version}"; + sha256 = "sha256-ljVTMBiGp8TPufrQcK4zQtcVH1To4zcfBAbUOb+v910="; + }; + + nativeBuildInputs = [ cmake ]; + + meta = with lib; { + homepage = "https://github.com/dlfcn-win32/dlfcn-win32"; + description = "Set of functions that allows runtime dynamic library loading"; + license = licenses.mit; + platforms = platforms.windows; + maintainers = with maintainers; [ marius851000 ]; + }; +} diff --git a/pkgs/by-name/wi/windows/libgnurx/default.nix b/pkgs/by-name/wi/windows/libgnurx/default.nix new file mode 100644 index 0000000..e760bdd --- /dev/null +++ b/pkgs/by-name/wi/windows/libgnurx/default.nix @@ -0,0 +1,21 @@ +{ lib, stdenv, fetchurl }: + +let + version = "2.5.1"; +in stdenv.mkDerivation rec { + pname = "libgnurx"; + inherit version; + src = fetchurl { + url = "mirror://sourceforge/mingw/Other/UserContributed/regex/mingw-regex-${version}/mingw-${pname}-${version}-src.tar.gz"; + sha256 = "0xjxcxgws3bblybw5zsp9a4naz2v5bs1k3mk8dw00ggc0vwbfivi"; + }; + + # file looks for libgnurx.a when compiling statically + postInstall = lib.optionalString stdenv.hostPlatform.isStatic '' + ln -s $out/lib/libgnurx{.dll.a,.a} + ''; + + meta = { + platforms = lib.platforms.windows; + }; +} diff --git a/pkgs/by-name/wi/windows/mcfgthreads/default.nix b/pkgs/by-name/wi/windows/mcfgthreads/default.nix new file mode 100644 index 0000000..5075107 --- /dev/null +++ b/pkgs/by-name/wi/windows/mcfgthreads/default.nix @@ -0,0 +1,31 @@ +{ lib +, stdenv +, fetchFromGitHub +, autoreconfHook +}: + +stdenv.mkDerivation rec { + pname = "mcfgthread"; + version = "1.6.1"; + + src = fetchFromGitHub { + owner = "lhmouse"; + repo = "mcfgthread"; + rev = "v${lib.versions.majorMinor version}-ga.${lib.versions.patch version}"; + hash = "sha256-FrmeaQhwLrNewS0HDlbWgCvVQ5U1l0jrw0YVuQdt9Ck="; + }; + + outputs = [ "out" "dev" ]; + + nativeBuildInputs = [ + autoreconfHook + ]; + + meta = { + description = "A threading support library for Windows 7 and above"; + homepage = "https://github.com/lhmouse/mcfgthread/wiki"; + license = lib.licenses.gpl3Plus; + maintainers = with lib.maintainers; [ wegank ]; + platforms = lib.platforms.windows; + }; +} diff --git a/pkgs/by-name/wi/windows/mcfgthreads/pre_gcc_13.nix b/pkgs/by-name/wi/windows/mcfgthreads/pre_gcc_13.nix new file mode 100644 index 0000000..6be6481 --- /dev/null +++ b/pkgs/by-name/wi/windows/mcfgthreads/pre_gcc_13.nix @@ -0,0 +1,24 @@ +{ stdenv, fetchFromGitHub, autoreconfHook }: + +stdenv.mkDerivation { + pname = "mcfgthreads"; + version = "git"; # unstable-2021-03-12, not in any branch + + src = fetchFromGitHub { + owner = "lhmouse"; + repo = "mcfgthread"; + rev = "c446cf4fcdc262fc899a188a4bb7136284c34222"; + sha256 = "1ib90lrd4dz8irq4yvzwhxqa86i5vxl2q2z3z04sf1i8hw427p2f"; + }; + + outputs = [ "out" "dev" ]; + + # Don't want prebuilt binaries sneaking in. + postUnpack = '' + rm -r "$sourceRoot/debug" "$sourceRoot/release" + ''; + + nativeBuildInputs = [ + autoreconfHook + ]; +} diff --git a/pkgs/by-name/wi/windows/mingw-w64/default.nix b/pkgs/by-name/wi/windows/mingw-w64/default.nix new file mode 100644 index 0000000..706186c --- /dev/null +++ b/pkgs/by-name/wi/windows/mingw-w64/default.nix @@ -0,0 +1,37 @@ +{ lib +, stdenv +, windows +, fetchurl +, autoreconfHook +}: + +let + version = "11.0.1"; +in stdenv.mkDerivation { + pname = "mingw-w64"; + inherit version; + + src = fetchurl { + url = "mirror://sourceforge/mingw-w64/mingw-w64-v${version}.tar.bz2"; + hash = "sha256-P2a84Gnui+10OaGhPafLkaXmfqYXDyExesf1eUYl7hA="; + }; + + outputs = [ "out" "dev" ]; + + configureFlags = [ + "--enable-idl" + "--enable-secure-api" + ] ++ lib.optionals (stdenv.targetPlatform.libc == "ucrt") [ + "--with-default-msvcrt=ucrt" + ]; + + enableParallelBuilding = true; + + nativeBuildInputs = [ autoreconfHook ]; + buildInputs = [ windows.mingw_w64_headers ]; + hardeningDisable = [ "stackprotector" "fortify" ]; + + meta = { + platforms = lib.platforms.windows; + }; +} diff --git a/pkgs/by-name/wi/windows/mingw-w64/headers.nix b/pkgs/by-name/wi/windows/mingw-w64/headers.nix new file mode 100644 index 0000000..1fd27a8 --- /dev/null +++ b/pkgs/by-name/wi/windows/mingw-w64/headers.nix @@ -0,0 +1,11 @@ +{ stdenvNoCC, mingw_w64 }: + +stdenvNoCC.mkDerivation { + name = "${mingw_w64.name}-headers"; + inherit (mingw_w64) src meta; + + preConfigure = '' + cd mingw-w64-headers + ''; + +} diff --git a/pkgs/by-name/wi/windows/mingw-w64/pthreads.nix b/pkgs/by-name/wi/windows/mingw-w64/pthreads.nix new file mode 100644 index 0000000..3b143ef --- /dev/null +++ b/pkgs/by-name/wi/windows/mingw-w64/pthreads.nix @@ -0,0 +1,16 @@ +{ stdenv, mingw_w64 }: + +stdenv.mkDerivation { + name = "${mingw_w64.name}-pthreads"; + inherit (mingw_w64) src meta; + + configureFlags = [ + # Rustc require 'libpthread.a' when targeting 'x86_64-pc-windows-gnu'. + # Enabling this makes it work out of the box instead of failing. + "--enable-static" + ]; + + preConfigure = '' + cd mingw-w64-libraries/winpthreads + ''; +} diff --git a/pkgs/by-name/wi/windows/mingwrt/default.nix b/pkgs/by-name/wi/windows/mingwrt/default.nix new file mode 100644 index 0000000..5bf6951 --- /dev/null +++ b/pkgs/by-name/wi/windows/mingwrt/default.nix @@ -0,0 +1,18 @@ +{ stdenv, lib, fetchurl }: + +stdenv.mkDerivation rec { + pname = "mingwrt"; + version = "5.0.2"; + + src = fetchurl { + url = "mirror://sourceforge/mingw/MinGW/Base/mingwrt/mingwrt-${version}/mingwrt-${version}-mingw32-src.tar.xz"; + sha256 = "1vj6f578wcffdmy7zzf7xz1lw57kxjy08j0k1n28f0j4ylrk68vp"; + }; + + meta = { + platforms = lib.platforms.windows; + }; + + dontStrip = true; + hardeningDisable = [ "stackprotector" "fortify" ]; +} diff --git a/pkgs/by-name/wi/windows/npiperelay/default.nix b/pkgs/by-name/wi/windows/npiperelay/default.nix new file mode 100644 index 0000000..d2347ed --- /dev/null +++ b/pkgs/by-name/wi/windows/npiperelay/default.nix @@ -0,0 +1,23 @@ +{ lib, buildGoModule, fetchFromGitHub }: + +buildGoModule rec { + pname = "npiperelay"; + version = "0.1.0"; + + src = fetchFromGitHub { + owner = "jstarks"; + repo = "npiperelay"; + rev = "v${version}"; + sha256 = "sha256-cg4aZmpTysc8m1euxIO2XPv8OMnBk1DwhFcuIFHF/1o="; + }; + + vendorHash = null; + + meta = { + description = "Access Windows named pipes from WSL"; + homepage = "https://github.com/jstarks/npiperelay"; + license = lib.licenses.mit; + maintainers = [ lib.maintainers.shlevy ]; + platforms = lib.platforms.windows; + }; +} diff --git a/pkgs/by-name/wi/windows/pthread-w32/default.nix b/pkgs/by-name/wi/windows/pthread-w32/default.nix new file mode 100644 index 0000000..da0fe56 --- /dev/null +++ b/pkgs/by-name/wi/windows/pthread-w32/default.nix @@ -0,0 +1,29 @@ +{ lib, stdenv, fetchzip }: + +stdenv.mkDerivation { + pname = "pthreads-w32"; + version = "2.9.1"; + + src = fetchzip { + url = "https://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.tar.gz"; + sha256 = "1s8iny7g06z289ahdj0kzaxj0cd3wvjbd8j3bh9xlg7g444lhy9w"; + }; + + makeFlags = [ "CROSS=${stdenv.cc.targetPrefix}" "GC-static" ]; + + installPhase = '' + runHook preInstall + + install -D libpthreadGC2.a $out/lib/libpthread.a + + runHook postInstall + ''; + + meta = with lib; { + description = "POSIX threads library for Windows"; + homepage = "https://sourceware.org/pthreads-win32"; + license = licenses.lgpl21Plus; + maintainers = with maintainers; [ yana ]; + platforms = platforms.windows; + }; +} diff --git a/pkgs/by-name/wi/windows/w32api/default.nix b/pkgs/by-name/wi/windows/w32api/default.nix new file mode 100644 index 0000000..99faeeb --- /dev/null +++ b/pkgs/by-name/wi/windows/w32api/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchurl, lib }: + +stdenv.mkDerivation rec { + pname = "w32api"; + version = "3.17-2"; + + src = fetchurl { + url = "mirror://sourceforge/mingw/MinGW/Base/w32api/w32api-${lib.versions.majorMinor version}/w32api-${version}-mingw32-src.tar.lzma"; + sha256 = "09rhnl6zikmdyb960im55jck0rdy5z9nlg3akx68ixn7khf3j8wb"; + }; + + meta = { + platforms = lib.platforms.windows; + }; + + dontStrip = true; +} diff --git a/pkgs/by-name/wo/wolfssl/default.nix b/pkgs/by-name/wo/wolfssl/default.nix new file mode 100644 index 0000000..76a0721 --- /dev/null +++ b/pkgs/by-name/wo/wolfssl/default.nix @@ -0,0 +1,107 @@ +{ lib +, stdenv +, fetchFromGitHub +, Security +, autoreconfHook +, util-linux +, openssl +, cacert +# The primary --enable-XXX variant. 'all' enables most features, but causes build-errors for some software, +# requiring to build a special variant for that software. Example: 'haproxy' +, variant ? "all" +, extraConfigureFlags ? [] +, enableLto ? !(stdenv.isDarwin || stdenv.hostPlatform.isStatic || stdenv.cc.isClang) +}: +stdenv.mkDerivation (finalAttrs: { + pname = "wolfssl-${variant}"; + version = "5.7.0"; + + src = fetchFromGitHub { + owner = "wolfSSL"; + repo = "wolfssl"; + rev = "refs/tags/v${finalAttrs.version}-stable"; + hash = "sha256-4j1GqeZJn5UWx56DjGjge05jlzBbIGn4IXxcaIBxON4="; + }; + + postPatch = '' + patchShebangs ./scripts + # ocsp stapling tests require network access, so skip them + sed -i -e'2s/.*/exit 77/' scripts/ocsp-stapling.test + # ensure test detects musl-based systems too + substituteInPlace scripts/ocsp-stapling2.test \ + --replace '"linux-gnu"' '"linux-"' + ''; + + configureFlags = [ + "--enable-${variant}" + "--enable-reproducible-build" + ] ++ lib.optionals (variant == "all") [ + # Extra feature flags to add while building the 'all' variant. + # Since they conflict while building other variants, only specify them for this one. + "--enable-pkcs11" + "--enable-writedup" + "--enable-base64encode" + ] ++ [ + # We're not on tiny embedded machines. + # Increase TLS session cache from 33 sessions to 20k. + "--enable-bigcache" + + # Use WolfSSL's Single Precision Math with timing-resistant cryptography. + "--enable-sp=yes${lib.optionalString (stdenv.hostPlatform.isx86_64 || stdenv.hostPlatform.isAarch) ",asm"}" + "--enable-sp-math-all" + "--enable-harden" + ] ++ lib.optionals (stdenv.hostPlatform.isx86_64) [ + # Enable AVX/AVX2/AES-NI instructions, gated by runtime detection via CPUID. + "--enable-intelasm" + "--enable-aesni" + ] ++ lib.optionals (stdenv.isAarch64 && stdenv.isDarwin) [ + # No runtime detection under ARM and no platform function checks like for X86. + # However, all ARM macOS systems have the supported extensions autodetected in the configure script. + "--enable-armasm=inline" + ] ++ extraConfigureFlags; + + # LTO should help with the C implementations. + env.NIX_CFLAGS_COMPILE = lib.optionalString enableLto "-flto"; + env.NIX_LDFLAGS_COMPILE = lib.optionalString enableLto "-flto"; + + outputs = [ + "dev" + "doc" + "lib" + "out" + ]; + + propagatedBuildInputs = lib.optionals stdenv.isDarwin [ + Security + ]; + + nativeBuildInputs = [ + autoreconfHook + util-linux + ]; + + doCheck = true; + + nativeCheckInputs = [ + openssl + cacert + ]; + + postInstall = '' + # fix recursive cycle: + # wolfssl-config points to dev, dev propagates bin + moveToOutput bin/wolfssl-config "$dev" + # moveToOutput also removes "$out" so recreate it + mkdir -p "$out" + ''; + + meta = with lib; { + description = "A small, fast, portable implementation of TLS/SSL for embedded devices"; + mainProgram = "wolfssl-config"; + homepage = "https://www.wolfssl.com/"; + changelog = "https://github.com/wolfSSL/wolfssl/releases/tag/v${finalAttrs.version}-stable"; + platforms = platforms.all; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ fab vifino ]; + }; +}) diff --git a/pkgs/by-name/wo/wolfssl/packages.nix b/pkgs/by-name/wo/wolfssl/packages.nix new file mode 100644 index 0000000..389962f --- /dev/null +++ b/pkgs/by-name/wo/wolfssl/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + wolfssl = darwin.apple_sdk_11_0.callPackage ./. { + inherit (darwin.apple_sdk_11_0.frameworks) Security; + }; +} diff --git a/pkgs/by-name/xa/xar/0001-Add-useless-descriptions-to-AC_DEFINE.patch b/pkgs/by-name/xa/xar/0001-Add-useless-descriptions-to-AC_DEFINE.patch new file mode 100644 index 0000000..a605d2d --- /dev/null +++ b/pkgs/by-name/xa/xar/0001-Add-useless-descriptions-to-AC_DEFINE.patch @@ -0,0 +1,95 @@ +From a14be07c0aae3bf6f732d1ca5f625ba375702121 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Sun, 15 Nov 2020 19:12:33 +0900 +Subject: [PATCH 1/2] Add useless descriptions to AC_DEFINE + +Removes autoheader warnings. +--- + configure.ac | 42 +++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 812b5ff..358ab89 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -210,48 +210,48 @@ AC_CHECK_MEMBERS([struct stat.st_flags]) + + AC_CHECK_SIZEOF(uid_t) + if test $ac_cv_sizeof_uid_t = "4"; then +-AC_DEFINE(UID_STRING, RId32) +-AC_DEFINE(UID_CAST, (uint32_t)) ++AC_DEFINE([UID_STRING], RId32, [UID_STRING]) ++AC_DEFINE([UID_CAST], (uint32_t), [UID_CAST]) + elif test $ac_cv_sizeof_uid_t = "8"; then +-AC_DEFINE(UID_STRING, PRId64) +-AC_DEFINE(UID_CAST, (uint64_t)) ++AC_DEFINE([UID_STRING], PRId64, [UID_STRING]) ++AC_DEFINE([UID_CAST], (uint64_t), [UID_CAST]) + else + AC_ERROR(can not detect the size of your system's uid_t type) + fi + + AC_CHECK_SIZEOF(gid_t) + if test $ac_cv_sizeof_gid_t = "4"; then +-AC_DEFINE(GID_STRING, PRId32) +-AC_DEFINE(GID_CAST, (uint32_t)) ++AC_DEFINE([GID_STRING], PRId32, [GID_STRING]) ++AC_DEFINE([GID_CAST], (uint32_t), [GID_CAST]) + elif test $ac_cv_sizeof_gid_t = "8"; then +-AC_DEFINE(GID_STRING, PRId64) +-AC_DEFINE(GID_CAST, (uint64_t)) ++AC_DEFINE([GID_STRING], PRId64, [GID_STRING]) ++AC_DEFINE([GID_CAST], (uint64_t), [GID_CAST]) + else + AC_ERROR(can not detect the size of your system's gid_t type) + fi + + AC_CHECK_SIZEOF(ino_t) + if test $ac_cv_sizeof_ino_t = "4"; then +-AC_DEFINE(INO_STRING, PRId32) +-AC_DEFINE(INO_HEXSTRING, PRIx32) +-AC_DEFINE(INO_CAST, (uint32_t)) ++AC_DEFINE([INO_STRING], PRId32, [INO_STRING]) ++AC_DEFINE([INO_HEXSTRING], PRIx32, [INO_HEXSTRING]) ++AC_DEFINE([INO_CAST], (uint32_t), [INO_CAST]) + elif test $ac_cv_sizeof_ino_t = "8"; then +-AC_DEFINE(INO_STRING, PRId64) +-AC_DEFINE(INO_HEXSTRING, PRIx64) +-AC_DEFINE(INO_CAST, (uint64_t)) ++AC_DEFINE([INO_STRING], PRId64, [INO_STRING]) ++AC_DEFINE([INO_HEXSTRING], PRIx64, [INO_HEXSTRING]) ++AC_DEFINE([INO_CAST], (uint64_t), [INO_CAST]) + else + AC_ERROR(can not detect the size of your system's ino_t type) + fi + + AC_CHECK_SIZEOF(dev_t) + if test $ac_cv_sizeof_dev_t = "4"; then +-AC_DEFINE(DEV_STRING, PRId32) +-AC_DEFINE(DEV_HEXSTRING, PRIx32) +-AC_DEFINE(DEV_CAST, (uint32_t)) ++AC_DEFINE([DEV_STRING], PRId32, [DEV_STRING]) ++AC_DEFINE([DEV_HEXSTRING], PRIx32, [DEV_HEXSTRING]) ++AC_DEFINE([DEV_CAST], (uint32_t), [DEV_CAST]) + elif test $ac_cv_sizeof_dev_t = "8"; then +-AC_DEFINE(DEV_STRING, PRId64) +-AC_DEFINE(DEV_HEXSTRING, PRIx64) +-AC_DEFINE(DEV_CAST, (uint64_t)) ++AC_DEFINE([DEV_STRING], PRId64, [DEV_STRING]) ++AC_DEFINE([DEV_HEXSTRING], PRIx64, [DEV_HEXSTRING]) ++AC_DEFINE([DEV_CAST], (uint64_t), [DEV_CAST]) + else + AC_ERROR(can not detect the size of your system's dev_t type) + fi +@@ -261,7 +261,7 @@ AC_CHECK_LIB(acl, acl_get_file) + dnl Check for paths + AC_PREFIX_DEFAULT(/usr/local) + +-AC_CHECK_FUNC([asprintf], AC_DEFINE([HAVE_ASPRINTF])) ++AC_CHECK_FUNC([asprintf], AC_DEFINE([HAVE_ASPRINTF], [], [HAVE_ASPRINTF])) + + dnl + dnl Configure libxml2. +-- +2.28.0 + diff --git a/pkgs/by-name/xa/xar/0002-Use-pkg-config-for-libxml2.patch b/pkgs/by-name/xa/xar/0002-Use-pkg-config-for-libxml2.patch new file mode 100644 index 0000000..d71ad4b --- /dev/null +++ b/pkgs/by-name/xa/xar/0002-Use-pkg-config-for-libxml2.patch @@ -0,0 +1,89 @@ +From 276833851657c85651c053ee16b8e1a8dc768a50 Mon Sep 17 00:00:00 2001 +From: Andrew Childs +Date: Sun, 15 Nov 2020 19:12:56 +0900 +Subject: [PATCH 2/2] Use pkg-config for libxml2 + +--- + configure.ac | 66 +++++++++------------------------------------------- + 1 file changed, 11 insertions(+), 55 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 358ab89..984a694 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -268,61 +268,17 @@ dnl Configure libxml2. + dnl + LIBXML2_VERSION_MIN=2.6.11 + +-have_libxml2="1" +- +-AC_ARG_WITH([xml2-config], [ --with-xml2-config libxml2 config program], +-if test "x${with_xml2_config}" = "xno" ; then +- XML2_CONFIG= +-else +- XML2_CONFIG="${with_xml2_config}" +-fi +-, +- XML2_CONFIG= +-) +-if test "x${XML2_CONFIG}" != "x" ; then +- if test ! -x "${XML2_CONFIG}" ; then +- AC_MSG_ERROR([Unusable or missing xml2-config: ${XML2_CONFIG}]) +- fi +-else +- AC_PATH_PROG([XML2_CONFIG], [xml2-config], , [${PATH}]) +- if test "x${XML2_CONFIG}" = "x" ; then +- AC_MSG_ERROR([Cannot configure without xml2-config]) +- fi +-fi +- +-dnl Make sure the version of libxml2 found is sufficient. +-AC_MSG_CHECKING([for libxml >= ${LIBXML2_VERSION_MIN}]) +-LIBXML2_FOUND=`2>&1 ${XML2_CONFIG} --version` +-LIBXML2_MAJOR=`echo ${LIBXML2_FOUND} | tr . " " | awk '{print $1}'` +-LIBXML2_MINOR=`echo ${LIBXML2_FOUND} | tr . " " | awk '{print $2}' | tr a-z " " |awk '{print $1}'` +-LIBXML2_BRANCH=`echo ${LIBXML2_FOUND} | tr . " " | awk '{print $3}' | tr a-z " " |awk '{print $1}'` +-if test "x${LIBXML2_BRANCH}" = "x" ; then +- LIBXML2_BRANCH=0 +-fi +-LIBXML2_MAJOR_MIN=`echo ${LIBXML2_VERSION_MIN} | tr . " " | awk '{print $1}'` +-LIBXML2_MINOR_MIN=`echo ${LIBXML2_VERSION_MIN} | tr . " " | awk '{print $2}'` +-LIBXML2_BRANCH_MIN=`echo ${LIBXML2_VERSION_MIN} | tr . " " | awk '{print $3}'` +-if test ${LIBXML2_MAJOR} -gt ${LIBXML2_MAJOR_MIN} \ +- -o ${LIBXML2_MAJOR} -eq ${LIBXML2_MAJOR_MIN} \ +- -a ${LIBXML2_MINOR} -gt ${LIBXML2_MINOR_MIN} \ +- -o ${LIBXML2_MAJOR} -eq ${LIBXML2_MAJOR_MIN} \ +- -a ${LIBXML2_MINOR} -eq ${LIBXML2_MINOR_MIN} \ +- -a ${LIBXML2_BRANCH} -ge $LIBXML2_BRANCH_MIN ; then +- AC_MSG_RESULT([${LIBXML2_MAJOR}.${LIBXML2_MINOR}.${LIBXML2_BRANCH}]) +- have_libxml2="1" +- CPPFLAGS="${CPPFLAGS} `${XML2_CONFIG} --cflags`" +- LIBS="${LIBS} `${XML2_CONFIG} --libs`" +-else +- AC_MSG_RESULT([no]) +- have_libxml2="0" +-fi +-if test "x${have_libxml2}" = "x1" ; then +- dnl Final sanity check, to make sure that xmlwriter is present. +- AC_CHECK_HEADER([libxml/xmlwriter.h], , [have_libxml2="0"]) +-fi +-if test "x${have_libxml2}" = "x0" ; then +- AC_MSG_ERROR([Cannot build without libxml2]) +-fi ++PKG_PROG_PKG_CONFIG ++ ++PKG_CHECK_MODULES(LIBXML2_PKGCONFIG, [libxml-2.0 >= ${LIBXML2_VERSION_MIN}], ++ [ ++ have_libxml2=1 ++ CPPFLAGS="${CPPFLAGS} ${LIBXML2_PKGCONFIG_CFLAGS}" ++ LIBS="${LIBS} ${LIBXML2_PKGCONFIG_LIBS}" ++ ], ++ [ ++ have_libxml2=0 ++ ]) + + dnl + dnl Configure libcrypto (part of OpenSSL). +-- +2.28.0 + diff --git a/pkgs/by-name/xa/xar/default.nix b/pkgs/by-name/xa/xar/default.nix new file mode 100644 index 0000000..9c03c41 --- /dev/null +++ b/pkgs/by-name/xa/xar/default.nix @@ -0,0 +1,49 @@ +{ lib, stdenv, fetchurl, pkg-config, libxml2, xz, openssl, zlib, bzip2, fts, autoreconfHook }: + +stdenv.mkDerivation rec { + version = "1.6.1"; + pname = "xar"; + + src = fetchurl { + url = "https://github.com/downloads/mackyle/xar/${pname}-${version}.tar.gz"; + sha256 = "0ghmsbs6xwg1092v7pjcibmk5wkyifwxw6ygp08gfz25d2chhipf"; + }; + + nativeBuildInputs = [ autoreconfHook pkg-config ]; + buildInputs = [ libxml2 xz openssl zlib bzip2 fts ]; + + patches = [ + ./0001-Add-useless-descriptions-to-AC_DEFINE.patch + ./0002-Use-pkg-config-for-libxml2.patch + ]; + + postPatch = '' + substituteInPlace configure.ac \ + --replace 'OpenSSL_add_all_ciphers' 'OPENSSL_init_crypto' \ + --replace 'openssl/evp.h' 'openssl/crypto.h' + ''; + + configureFlags = lib.optional (fts != null) "LDFLAGS=-lfts"; + + meta = { + homepage = "https://mackyle.github.io/xar/"; + description = "Extensible Archiver"; + + longDescription = + '' The XAR project aims to provide an easily extensible archive format. + Important design decisions include an easily extensible XML table of + contents for random access to archived files, storing the toc at the + beginning of the archive to allow for efficient handling of streamed + archives, the ability to handle files of arbitrarily large sizes, the + ability to choose independent encodings for individual files in the + archive, the ability to store checksums for individual files in both + compressed and uncompressed form, and the ability to query the table + of content's rich meta-data. + ''; + + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ copumpkin ]; + platforms = lib.platforms.all; + mainProgram = "xar"; + }; +} diff --git a/pkgs/by-name/xc/xcbuild/default.nix b/pkgs/by-name/xc/xcbuild/default.nix new file mode 100644 index 0000000..8dc527c --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/default.nix @@ -0,0 +1,80 @@ +{ lib, stdenv, cmake, fetchFromGitHub, zlib, libxml2, libpng +, CoreServices, CoreGraphics, ImageIO, ninja }: + +let + googletest = fetchFromGitHub { + owner = "google"; + repo = "googletest"; + rev = "43359642a1c16ad3f4fc575c7edd0cb935810815"; + sha256 = "0y4xaah62fjr3isaryc3vfz3mn9xflr00vchdimj8785milxga4q"; + }; + + linenoise = fetchFromGitHub { + owner = "antirez"; + repo = "linenoise"; + rev = "c894b9e59f02203dbe4e2be657572cf88c4230c3"; + sha256 = "0wasql7ph5g473zxhc2z47z3pjp42q0dsn4gpijwzbxawid71b4w"; + }; +in stdenv.mkDerivation { + pname = "xcbuild"; + + # Once a version is released that includes + # https://github.com/facebook/xcbuild/commit/183c087a6484ceaae860c6f7300caf50aea0d710, + # we can stop doing this -pre thing. + version = "0.1.2-pre"; + + src = fetchFromGitHub { + owner = "facebook"; + repo = "xcbuild"; + rev = "32b9fbeb69bfa2682bd0351ec2f14548aaedd554"; + sha256 = "1xxwg2849jizxv0g1hy0b1m3i7iivp9bmc4f5pi76swsn423d41m"; + }; + + patches = [ ./includes.patch ]; + + prePatch = '' + rmdir ThirdParty/* + cp -r --no-preserve=all ${googletest} ThirdParty/googletest + cp -r --no-preserve=all ${linenoise} ThirdParty/linenoise + ''; + + postPatch = lib.optionalString (!stdenv.isDarwin) '' + # Fix build on gcc-13 due to missing includes + sed -e '1i #include ' -i \ + Libraries/libutil/Headers/libutil/Permissions.h \ + Libraries/pbxbuild/Headers/pbxbuild/Tool/AuxiliaryFile.h \ + Libraries/pbxbuild/Headers/pbxbuild/Tool/Invocation.h + + # Avoid a glibc >= 2.25 deprecation warning that gets fatal via -Werror. + sed 1i'#include ' \ + -i Libraries/xcassets/Headers/xcassets/Slot/SystemVersion.h + '' + lib.optionalString stdenv.isDarwin '' + # Apple Open Sourced LZFSE, but not libcompression, and it isn't + # part of an impure framework we can add + substituteInPlace Libraries/libcar/Sources/Rendition.cpp \ + --replace "#if HAVE_LIBCOMPRESSION" "#if 0" + ''; + + # TODO: instruct cmake not to put it in /usr, rather than cleaning up + postInstall = '' + mv $out/usr/* $out + rmdir $out/usr + cp liblinenoise.* $out/lib/ + ''; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + cmakeFlags = [ "-GNinja" ]; + + nativeBuildInputs = [ cmake ninja ]; + buildInputs = [ zlib libxml2 libpng ] + ++ lib.optionals stdenv.isDarwin [ CoreServices CoreGraphics ImageIO ]; + + meta = with lib; { + description = "Xcode-compatible build tool"; + homepage = "https://github.com/facebook/xcbuild"; + platforms = platforms.unix; + maintainers = with maintainers; [ copumpkin matthewbauer ]; + license = with licenses; [ bsd2 bsd3 ]; + }; +} diff --git a/pkgs/by-name/xc/xcbuild/includes.patch b/pkgs/by-name/xc/xcbuild/includes.patch new file mode 100644 index 0000000..7a05a33 --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/includes.patch @@ -0,0 +1,10 @@ +--- a/Libraries/plist/Sources/Format/Encoding.cpp ++++ b/Libraries/plist/Sources/Format/Encoding.cpp +@@ -11,6 +11,7 @@ + #include + + #include ++#include /* abort() */ + + #if defined(__linux__) + #include diff --git a/pkgs/by-name/xc/xcbuild/packages.nix b/pkgs/by-name/xc/xcbuild/packages.nix new file mode 100644 index 0000000..657ec4e --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/packages.nix @@ -0,0 +1,14 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + xcodebuild = callPackage ./wrapper.nix { + inherit (darwin.apple_sdk.frameworks) CoreServices CoreGraphics ImageIO; + }; + xcbuild = xcodebuild; + xcbuildHook = makeSetupHook { + name = "xcbuild-hook"; + propagatedBuildInputs = [ xcbuild ]; + } ./setup-hook.sh ; +} diff --git a/pkgs/by-name/xc/xcbuild/platforms.nix b/pkgs/by-name/xc/xcbuild/platforms.nix new file mode 100644 index 0000000..0108ac8 --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/platforms.nix @@ -0,0 +1,301 @@ +{ stdenv, runCommand, lib, sdks, xcodePlatform, writeText }: + +let + + inherit (lib.generators) toPlist; + + Info = { + CFBundleIdentifier = "com.apple.platform.${lib.toLower xcodePlatform}"; + Type = "Platform"; + Name = lib.toLower xcodePlatform; + }; + + Version = { + ProjectName = "OSXPlatformSupport"; + }; + + # These files are all based off of Xcode spec fies found in + # /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources. + + # Based off of the "MacOSX Architectures.xcspec" file. All i386 stuff + # is removed because NixPkgs only supports darwin-x86_64 and darwin-arm64. + Architectures = [ + { + Identifier = "Standard"; + Type = "Architecture"; + Name = "Standard Architectures (Apple Silicon, 64-bit Intel)"; + RealArchitectures = [ "arm64" "x86_64" ]; + ArchitectureSetting = "ARCHS_STANDARD"; + } + { + Identifier = "Universal"; + Type = "Architecture"; + Name = "Universal (Apple Silicon, 64-bit Intel)"; + RealArchitectures = [ "arm64" "x86_64" ]; + ArchitectureSetting = "ARCHS_STANDARD_32_64_BIT"; + } + { + Identifier = "Native"; + Type = "Architecture"; + Name = "Native Architecture of Build Machine"; + ArchitectureSetting = "NATIVE_ARCH_ACTUAL"; + } + { + Identifier = "Standard64bit"; + Type = "Architecture"; + Name = "Apple Silicon, 64-bit Intel"; + RealArchitectures = [ "arm64" "x86_64" ]; + ArchitectureSetting = "ARCHS_STANDARD_64_BIT"; + } + { + Identifier = if stdenv.isAarch64 then "arm64" else "x86_64"; + Type = "Architecture"; + Name = "Apple Silicon or Intel 64-bit"; + } + { + Identifier = "Standard_Including_64_bit"; + Type = "Architecture"; + Name = "Standard Architectures (including 64-bit)"; + RealArchitectures = [ "arm64" "x86_64" ]; + ArchitectureSetting = "ARCHS_STANDARD_INCLUDING_64_BIT"; + } + ]; + + # Based off of the "MacOSX Package Types.xcspec" file. Only keep the + # bare minimum needed. + PackageTypes = [ + { + Identifier = "com.apple.package-type.mach-o-executable"; + Type = "PackageType"; + Name = "Mach-O Executable"; + DefaultBuildSettings = { + EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; + EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; + }; + ProductReference = { + FileType = "compiled.mach-o.executable"; + Name = "$(EXECUTABLE_NAME)"; + }; + } + { + Identifier = "com.apple.package-type.mach-o-objfile"; + Type = "PackageType"; + Name = "Mach-O Object File"; + DefaultBuildSettings = { + EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; + EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; + }; + ProductReference = { + FileType = "compiled.mach-o.objfile"; + Name = "$(EXECUTABLE_NAME)"; + }; + } + { + Identifier = "com.apple.package-type.mach-o-dylib"; + Type = "PackageType"; + Name = "Mach-O Dynamic Library"; + DefaultBuildSettings = { + EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; + EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; + }; + ProductReference = { + FileType = "compiled.mach-o.dylib"; + Name = "$(EXECUTABLE_NAME)"; + }; + } + { + Identifier = "com.apple.package-type.static-library"; + Type = "PackageType"; + Name = "Mach-O Static Library"; + DefaultBuildSettings = { + EXECUTABLE_PREFIX = "lib"; + EXECUTABLE_SUFFIX = ".a"; + EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; + EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; + }; + ProductReference = { + FileType = "archive.ar"; + Name = "$(EXECUTABLE_NAME)"; + IsLaunchable = "NO"; + }; + } + { + Identifier = "com.apple.package-type.wrapper"; + Type = "PackageType"; + Name = "Wrapper"; + DefaultBuildSettings = { + WRAPPER_SUFFIX = ".bundle"; + WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; + CONTENTS_FOLDER_PATH = "$(WRAPPER_NAME)/Contents"; + EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; + EXECUTABLE_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/MacOS"; + EXECUTABLE_PATH = "$(EXECUTABLE_FOLDER_PATH)/$(EXECUTABLE_NAME)"; + INFOPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/Info.plist"; + INFOSTRINGS_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/InfoPlist.strings"; + PKGINFO_PATH = "$(CONTENTS_FOLDER_PATH)/PkgInfo"; + PBDEVELOPMENTPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/pbdevelopment.plist"; + VERSIONPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/version.plist"; + PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers"; + PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; + EXECUTABLES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Executables"; + FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Frameworks"; + SHARED_FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedFrameworks"; + SHARED_SUPPORT_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedSupport"; + UNLOCALIZED_RESOURCES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Resources"; + LOCALIZED_RESOURCES_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/$(DEVELOPMENT_LANGUAGE).lproj"; + DOCUMENTATION_FOLDER_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/Documentation"; + PLUGINS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PlugIns"; + SCRIPTS_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Scripts"; + }; + ProductReference = { + FileType = "wrapper.cfbundle"; + Name = "$(WRAPPER_NAME)"; + IsLaunchable = "NO"; + }; + } + { + Identifier = "com.apple.package-type.wrapper.application"; + Type = "PackageType"; + BasedOn = "com.apple.package-type.wrapper"; + Name = "Application Wrapper"; + DefaultBuildSettings = { + GENERATE_PKGINFO_FILE = "YES"; + }; + ProductReference = { + FileType = "wrapper.application"; + Name = "$(WRAPPER_NAME)"; + IsLaunchable = "YES"; + }; + } + ]; + + # Based off of the "MacOSX Product Types.xcspec" file. All + # bundles/wrapper are removed, because we prefer dynamic products in + # NixPkgs. + ProductTypes = [ + { + Identifier = "com.apple.product-type.tool"; + Type = "ProductType"; + Name = "Command-line Tool"; + PackageTypes = [ "com.apple.package-type.mach-o-executable" ]; + } + { + Identifier = "com.apple.product-type.objfile"; + Type = "ProductType"; + Name = "Object File"; + PackageTypes = [ "com.apple.package-type.mach-o-objfile" ]; + } + { + Identifier = "com.apple.product-type.library.dynamic"; + Type = "ProductType"; + Name = "Dynamic Library"; + PackageTypes = [ "com.apple.package-type.mach-o-dylib" ]; + DefaultBuildProperties = { + FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)"; + MACH_O_TYPE = "mh_dylib"; + REZ_EXECUTABLE = "YES"; + EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)"; + EXECUTABLE_EXTENSION = "dylib"; + DYLIB_COMPATIBILITY_VERSION = "1"; + DYLIB_CURRENT_VERSION = "1"; + FRAMEWORK_FLAG_PREFIX = "-framework"; + LIBRARY_FLAG_PREFIX = "-l"; + LIBRARY_FLAG_NOSPACE = "YES"; + STRIP_STYLE = "debugging"; + GCC_INLINES_ARE_PRIVATE_EXTERN = "YES"; + CODE_SIGNING_ALLOWED = "YES"; + CODE_SIGNING_REQUIRED = "NO"; + }; + } + { + Identifier = "com.apple.product-type.library.static"; + Type = "ProductType"; + Name = "Static Library"; + PackageTypes = [ "com.apple.package-type.static-library" ]; + DefaultBuildProperties = { + FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)"; + MACH_O_TYPE = "staticlib"; + REZ_EXECUTABLE = "YES"; + EXECUTABLE_PREFIX = "lib"; + EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)"; + EXECUTABLE_EXTENSION = "a"; + FRAMEWORK_FLAG_PREFIX = "-framework"; + LIBRARY_FLAG_PREFIX = "-l"; + LIBRARY_FLAG_NOSPACE = "YES"; + STRIP_STYLE = "debugging"; + SEPARATE_STRIP = "YES"; + CLANG_ENABLE_MODULE_DEBUGGING = "NO"; + }; + } + { + Type = "ProductType"; + Identifier = "com.apple.product-type.bundle"; + Name = "Bundle"; + DefaultBuildProperties = { + FULL_PRODUCT_NAME = "$(WRAPPER_NAME)"; + MACH_O_TYPE = "mh_bundle"; + WRAPPER_PREFIX = ""; + WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; + WRAPPER_EXTENSION = "bundle"; + WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; + FRAMEWORK_FLAG_PREFIX = "-framework"; + LIBRARY_FLAG_PREFIX = "-l"; + LIBRARY_FLAG_NOSPACE = "YES"; + STRIP_STYLE = "non-global"; + }; + PackageTypes = [ "com.apple.package-type.wrapper" ]; + IsWrapper = "YES"; + HasInfoPlist = "YES"; + HasInfoPlistStrings = "YES"; + } + { + Identifier = "com.apple.product-type.application"; + Type = "ProductType"; + BasedOn = "com.apple.product-type.bundle"; + Name = "Application"; + DefaultBuildProperties = { + MACH_O_TYPE = "mh_execute"; + WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; + WRAPPER_EXTENSION = "app"; + }; + PackageTypes = [ "com.apple.package-type.wrapper.application" ]; + } + { + Type = "ProductType"; + Identifier = "com.apple.product-type.framework"; + Name = "Bundle"; + DefaultBuildProperties = { + FULL_PRODUCT_NAME = "$(WRAPPER_NAME)"; + MACH_O_TYPE = "mh_bundle"; + WRAPPER_PREFIX = ""; + WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; + WRAPPER_EXTENSION = "bundle"; + WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; + FRAMEWORK_FLAG_PREFIX = "-framework"; + LIBRARY_FLAG_PREFIX = "-l"; + LIBRARY_FLAG_NOSPACE = "YES"; + STRIP_STYLE = "non-global"; + }; + PackageTypes = [ "com.apple.package-type.wrapper" ]; + IsWrapper = "YES"; + HasInfoPlist = "YES"; + HasInfoPlistStrings = "YES"; + } + ]; + +in + +runCommand "Platforms" {} '' + platform=$out/${xcodePlatform}.platform + + install -D ${writeText "Info.plist" (toPlist {} Info)} $platform/Info.plist + install -D ${writeText "version.plist" (toPlist {} Version)} $platform/version.plist + install -D ${writeText "Architectures.xcspec" (toPlist {} Architectures)} $platform/Developer/Library/Xcode/Specifications/Architectures.xcspec + install -D ${writeText "PackageTypes.xcspec" (toPlist {} PackageTypes)} $platform/Developer/Library/Xcode/Specifications/PackageTypes.xcspec + install -D ${writeText "ProductTypes.xcspec" (toPlist {} ProductTypes)} $platform/Developer/Library/Xcode/Specifications/ProductTypes.xcspec + + ln -s $platform $platform/usr + + mkdir -p $platform/Developer + ln -s ${sdks} $platform/Developer/SDKs +'' diff --git a/pkgs/by-name/xc/xcbuild/sdks.nix b/pkgs/by-name/xc/xcbuild/sdks.nix new file mode 100644 index 0000000..bf16bf1 --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/sdks.nix @@ -0,0 +1,32 @@ +{ runCommand, lib, toolchainName, sdkName +, writeText, xcodePlatform, sdkVer, productBuildVer }: + +let + inherit (lib.generators) toPlist toJSON; + + SDKSettings = { + CanonicalName = sdkName; + DisplayName = sdkName; + Toolchains = [ toolchainName ]; + Version = sdkVer; + MaximumDeploymentTarget = sdkVer; + isBaseSDK = "YES"; + }; + + SystemVersion = lib.optionalAttrs (productBuildVer != null) { + ProductBuildVersion = productBuildVer; + } // { + ProductName = "Mac OS X"; + ProductVersion = sdkVer; + }; +in + +runCommand "SDKs" {} '' + sdk=$out/${sdkName}.sdk + install -D ${writeText "SDKSettings.plist" (toPlist {} SDKSettings)} $sdk/SDKSettings.plist + install -D ${writeText "SDKSettings.json" (toJSON {} SDKSettings)} $sdk/SDKSettings.json + install -D ${writeText "SystemVersion.plist" (toPlist {} SystemVersion)} $sdk/System/Library/CoreServices/SystemVersion.plist + ln -s $sdk $sdk/usr + + ln -s $sdk $out/${xcodePlatform}.sdk +'' diff --git a/pkgs/by-name/xc/xcbuild/setup-hook.sh b/pkgs/by-name/xc/xcbuild/setup-hook.sh new file mode 100644 index 0000000..f4b5abf --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/setup-hook.sh @@ -0,0 +1,29 @@ +xcbuildBuildPhase() { + export DSTROOT=$out + + runHook preBuild + + echo "running xcodebuild" + + xcodebuild SYMROOT=$PWD/Products OBJROOT=$PWD/Intermediates $xcbuildFlags build + + runHook postBuild +} + +xcbuildInstallPhase () { + runHook preInstall + + # not implemented + # xcodebuild install + + runHook postInstall +} + +buildPhase=xcbuildBuildPhase +if [ -z "${installPhase-}" ]; then + installPhase=xcbuildInstallPhase +fi + +# if [ -d "*.xcodeproj" ]; then +# buildPhase=xcbuildPhase +# fi diff --git a/pkgs/by-name/xc/xcbuild/toolchains.nix b/pkgs/by-name/xc/xcbuild/toolchains.nix new file mode 100644 index 0000000..e0abf90 --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/toolchains.nix @@ -0,0 +1,73 @@ +{ runCommand, toolchainName, fetchurl, stdenv +, buildPackages, lib, writeText }: + +let + + inherit (lib) getBin optionalString; + inherit (lib.generators) toPlist; + + ToolchainInfo = { + Identifier = toolchainName; + }; + + # We could pull this out of developer_cmds but it adds an annoying + # loop if we want to bootstrap and this is just a tiny script so I'm + # not going to bother. + mkdep-darwin-src = fetchurl { + url = "https://opensource.apple.com/source/developer_cmds/developer_cmds-63/mkdep/mkdep.sh"; + sha256 = "0n4wpqfslfjs5zbys5yri8pfi2awyhlmknsf6laa5jzqbzq9x541"; + executable = true; + }; +in + +runCommand "Toolchains" {} ('' + toolchain=$out/XcodeDefault.xctoolchain + mkdir -p $toolchain + + install -D ${writeText "ToolchainInfo.plist" (toPlist {} ToolchainInfo)} $toolchain/ToolchainInfo.plist + + ln -s $toolchain $toolchain/usr + + mkdir -p $toolchain/include + mkdir -p $toolchain/lib + mkdir -p $toolchain/libexec + mkdir -p $toolchain/share + mkdir -p $toolchain/bin + + for bin in ${getBin stdenv.cc}/bin/*; do + ln -s $bin $toolchain/bin + done + + for bin in ${getBin stdenv.cc.bintools.bintools}/bin/*; do + if ! [ -e "$toolchain/bin/$(basename $bin)" ]; then + ln -s $bin $toolchain/bin + fi + done + + ln -s ${buildPackages.bison}/bin/yacc $toolchain/bin/yacc + ln -s ${buildPackages.bison}/bin/bison $toolchain/bin/bison + ln -s ${buildPackages.flex}/bin/flex $toolchain/bin/flex + ln -s ${buildPackages.flex}/bin/flex++ $toolchain/bin/flex++ + ln -s $toolchain/bin/flex $toolchain/bin/lex + + ln -s ${buildPackages.m4}/bin/m4 $toolchain/bin/m4 + ln -s $toolchain/bin/m4 $toolchain/bin/gm4 + + ln -s ${buildPackages.unifdef}/bin/unifdef $toolchain/bin/unifdef + ln -s ${buildPackages.unifdef}/bin/unifdefall $toolchain/bin/unifdefall + + ln -s ${buildPackages.gperf}/bin/gperf $toolchain/bin/gperf + ln -s ${buildPackages.indent}/bin/indent $toolchain/bin/indent + ln -s ${buildPackages.ctags}/bin/ctags $toolchain/bin/ctags +'' + optionalString stdenv.isDarwin '' + for bin in ${getBin buildPackages.darwin.cctools}/bin/*; do + if ! [ -e "$toolchain/bin/$(basename $bin)" ]; then + ln -s $bin $toolchain/bin + fi + done + + ln -s ${buildPackages.darwin.bootstrap_cmds}/bin/mig $toolchain/bin + mkdir -p $toolchain/libexec + ln -s ${buildPackages.darwin.bootstrap_cmds}/libexec/migcom $toolchain/libexec + ln -s ${mkdep-darwin-src} $toolchain/bin/mkdep +'') diff --git a/pkgs/by-name/xc/xcbuild/wrapper.nix b/pkgs/by-name/xc/xcbuild/wrapper.nix new file mode 100644 index 0000000..9c8c846 --- /dev/null +++ b/pkgs/by-name/xc/xcbuild/wrapper.nix @@ -0,0 +1,167 @@ +{ lib, stdenv, makeWrapper, writeText, writeTextFile, runCommand, callPackage +, CoreServices, ImageIO, CoreGraphics +, xcodePlatform ? stdenv.targetPlatform.xcodePlatform or "MacOSX" +, xcodeVer ? stdenv.targetPlatform.xcodeVer or "9.4.1" +, sdkVer ? stdenv.targetPlatform.darwinSdkVersion or "10.12" +, productBuildVer ? null +}: + +let + + toolchainName = "com.apple.dt.toolchain.XcodeDefault"; + sdkName = "${xcodePlatform}${sdkVer}"; + xcrunSdkName = lib.toLower xcodePlatform; + + # TODO: expose MACOSX_DEPLOYMENT_TARGET in nix so we can use it here. + sdkBuildVersion = "17E189"; + xcodeSelectVersion = "2349"; + + xcbuild = callPackage ./default.nix { + inherit CoreServices ImageIO CoreGraphics stdenv; + }; + + toolchains = callPackage ./toolchains.nix { + inherit toolchainName stdenv; + }; + + sdks = callPackage ./sdks.nix { + inherit toolchainName sdkName xcodePlatform sdkVer productBuildVer; + }; + + platforms = callPackage ./platforms.nix { + inherit sdks xcodePlatform stdenv; + }; + + xcconfig = writeText "nix.xcconfig" '' + SDKROOT=${sdkName} + ''; + + xcode-select = writeText "xcode-select" '' +#!${stdenv.shell} +while [ $# -gt 0 ]; do + case "$1" in + -h | --help) ;; # noop + -s | --switch) shift;; # noop + -r | --reset) ;; # noop + -v | --version) echo xcode-select version ${xcodeSelectVersion} ;; + -p | -print-path | --print-path) echo @DEVELOPER_DIR@ ;; + --install) ;; # noop + esac + shift +done + ''; + + xcrun = writeTextFile { + name = "xcrun"; + executable = true; + destination = "/bin/xcrun"; + text = '' +#!${stdenv.shell} +args=( "$@" ) + +# If an SDK was requested, check that it matches. +for ((i = 0; i < ''${#args[@]}; i++)); do + case "''${args[i]}" in + --sdk | -sdk) + i=$((i + 1)) + if [[ "''${args[i]}" != '${xcrunSdkName}' ]]; then + echo >&2 "xcodebuild: error: SDK \"''${args[i]}\" cannot be located." + exit 1 + fi + ;; + esac +done + +while [ $# -gt 0 ]; do + case "$1" in + --sdk | -sdk) shift ;; + --toolchain | -toolchain) shift ;; + --find | -find | -f) + shift + command -v $1 || exit 1 ;; + --log | -log) ;; # noop + --verbose | -verbose) ;; # noop + --no-cache | -no-cache) ;; # noop + --kill-cache | -kill-cache) ;; # noop + --show-sdk-path | -show-sdk-path) + echo ${sdks}/${sdkName}.sdk ;; + --show-sdk-platform-path | -show-sdk-platform-path) + echo ${platforms}/${xcodePlatform}.platform ;; + --show-sdk-version | -show-sdk-version) + echo ${sdkVer} ;; + --show-sdk-build-version | -show-sdk-build-version) + echo ${sdkBuildVersion} ;; + *) break ;; + esac + shift +done + +if ! [[ -z "$@" ]]; then + exec "$@" +fi + ''; + checkPhase = '' + ${stdenv.shellDryRun} "$target" + ''; + }; + +in + +runCommand "xcodebuild-${xcbuild.version}" { + nativeBuildInputs = [ makeWrapper ]; + inherit (xcbuild) meta; + + # ensure that the toolchain goes in PATH + propagatedBuildInputs = [ "${toolchains}/XcodeDefault.xctoolchain" ]; + + passthru = { + inherit xcbuild xcrun; + toolchain = "${toolchains}/XcodeDefault.xctoolchain"; + sdk = "${sdks}/${sdkName}"; + platform = "${platforms}/${xcodePlatform}.platform"; + }; + + preferLocalBuild = true; +} '' + mkdir -p $out/bin + + ln -s $out $out/usr + + mkdir -p $out/Library/Xcode + ln -s ${xcbuild}/Library/Xcode/Specifications $out/Library/Xcode/Specifications + + ln -s ${platforms} $out/Platforms + ln -s ${toolchains} $out/Toolchains + + mkdir -p $out/Applications/Xcode.app/Contents + ln -s $out $out/Applications/Xcode.app/Contents/Developer + + # The native xcodebuild command supports an invocation like "xcodebuild -version -sdk" without specifying the specific SDK, so we simulate this by + # detecting this case and simulating the output; printing the header and appending the normal output via appending the sdk version to the positional + # arguments we pass through to the wrapped xcodebuild. + makeWrapper ${xcbuild}/bin/xcodebuild $out/bin/xcodebuild \ + --add-flags "-xcconfig ${xcconfig}" \ + --add-flags "DERIVED_DATA_DIR=." \ + --set DEVELOPER_DIR "$out" \ + --set SDKROOT ${sdkName} \ + --run '[ "$#" -eq 2 ] && [ "$1" = "-version" ] && [ "$2" = "-sdk" ] && echo ${sdkName}.sdk - macOS ${sdkVer} \(macosx${sdkVer}\) && set -- "$@" "${sdkName}"' \ + --run '[ "$1" = "-version" ] && [ "$#" -eq 1 ] && (echo Xcode ${xcodeVer}; echo Build version ${sdkBuildVersion}) && exit 0' \ + --run '[ "$1" = "-license" ] && exit 0' + + substitute ${xcode-select} $out/bin/xcode-select \ + --subst-var-by DEVELOPER_DIR $out/Applications/Xcode.app/Contents/Developer + chmod +x $out/bin/xcode-select + + cp ${xcrun}/bin/xcrun $out/bin/xcrun + + for bin in PlistBuddy actool builtin-copy builtin-copyPlist \ + builtin-copyStrings builtin-copyTiff \ + builtin-embeddedBinaryValidationUtility \ + builtin-infoPlistUtility builtin-lsRegisterURL \ + builtin-productPackagingUtility builtin-validationUtility \ + lsbom plutil; do + ln -s ${xcbuild}/bin/$bin $out/bin/$bin + done + + fixupPhase +'' diff --git a/pkgs/by-name/xm/xmlto/default.nix b/pkgs/by-name/xm/xmlto/default.nix new file mode 100644 index 0000000..09597be --- /dev/null +++ b/pkgs/by-name/xm/xmlto/default.nix @@ -0,0 +1,63 @@ +{ fetchurl, fetchpatch, lib, stdenv, libxml2, libxslt +, docbook_xml_dtd_45, docbook_xsl, flex, w3m +, bash, getopt, makeWrapper }: + +stdenv.mkDerivation rec { + pname = "xmlto"; + version = "0.0.28"; + src = fetchurl { + url = "https://releases.pagure.org/${pname}/${pname}-${version}.tar.bz2"; + sha256 = "0xhj8b2pwp4vhl9y16v3dpxpsakkflfamr191mprzsspg4xdyc0i"; + }; + + # Note: These patches modify `xmlif/xmlif.l`, which requires `flex` to be rerun. + patches = [ + # Fixes implicit `int` on `main`, which is an error with clang 16. + (fetchpatch { + url = "https://pagure.io/xmlto/c/8e34f087bf410bcc5fe445933d6ad9bae54f24b5.patch"; + hash = "sha256-z5riDBZBVuFeBcjI++dAl3nTIgOPau4Gag0MJbYt+cc="; + }) + # Fixes implicit `int` on `ifsense`, which is also an error with clang 16. + (fetchpatch { + url = "https://pagure.io/xmlto/c/1375e2df75530cd198bd16ac3de38e2b0d126276.patch"; + hash = "sha256-fM6ZdTigrcC9cbXiKu6oa5Hs71mrREockB1wRlw6nDk="; + }) + ]; + + postPatch = '' + patchShebangs xmlif/test/run-test + + substituteInPlace "xmlto.in" \ + --replace "/bin/bash" "${bash}/bin/bash" + substituteInPlace "xmlto.in" \ + --replace "/usr/bin/locale" "$(type -P locale)" + substituteInPlace "xmlto.in" \ + --replace "mktemp" "$(type -P mktemp)" + ''; + + # `libxml2' provides `xmllint', needed at build-time and run-time. + # `libxslt' provides `xsltproc', used by `xmlto' at run-time. + nativeBuildInputs = [ makeWrapper flex getopt ]; + buildInputs = [ libxml2 libxslt docbook_xml_dtd_45 docbook_xsl ]; + + postInstall = '' + # `w3m' is needed for HTML to text conversions. + wrapProgram "$out/bin/xmlto" \ + --prefix PATH : "${lib.makeBinPath [ libxslt libxml2 getopt w3m ]}" + ''; + + meta = { + description = "Front-end to an XSL toolchain"; + + longDescription = '' + xmlto is a front-end to an XSL toolchain. It chooses an + appropriate stylesheet for the conversion you want and applies + it using an external XSL-T processor. It also performs any + necessary post-processing. + ''; + + license = lib.licenses.gpl2Plus; + homepage = "https://pagure.io/xmlto/"; + platforms = lib.platforms.unix; + }; +} diff --git a/pkgs/by-name/xm/xmlto/packages.nix b/pkgs/by-name/xm/xmlto/packages.nix new file mode 100644 index 0000000..721c12c --- /dev/null +++ b/pkgs/by-name/xm/xmlto/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + xmlto = callPackage ./. { + w3m = w3m-batch; + }; +} diff --git a/pkgs/by-name/xo/xorg/.gitignore b/pkgs/by-name/xo/xorg/.gitignore new file mode 100644 index 0000000..1bf88f2 --- /dev/null +++ b/pkgs/by-name/xo/xorg/.gitignore @@ -0,0 +1 @@ +download-cache/ diff --git a/pkgs/by-name/xo/xorg/builder.sh b/pkgs/by-name/xo/xorg/builder.sh new file mode 100644 index 0000000..833acf4 --- /dev/null +++ b/pkgs/by-name/xo/xorg/builder.sh @@ -0,0 +1,42 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi +# This is the builder for all X.org components. +source $stdenv/setup + + +# After installation, automatically add all "Requires" fields in the +# pkgconfig files (*.pc) to the propagated build inputs. +origPostInstall=$postInstall +postInstall() { + if test -n "$origPostInstall"; then eval "$origPostInstall"; fi + + local r p requires + set +o pipefail + requires=$(grep "Requires:" ${!outputDev}/lib/pkgconfig/*.pc | \ + sed "s/Requires://" | sed "s/,/ /g") + set -o pipefail + + echo "propagating requisites $requires" + + for r in $requires; do + for p in "${pkgsHostHost[@]}" "${pkgsHostTarget[@]}"; do + if test -e $p/lib/pkgconfig/$r.pc; then + echo " found requisite $r in $p" + propagatedBuildInputs+=" $p" + fi + done + done +} + + +installFlags="appdefaultdir=$out/share/X11/app-defaults $installFlags" + + +if test -n "$x11BuildHook"; then + source $x11BuildHook +fi + + +enableParallelBuilding=1 +enableParallelInstalling=1 + +genericBuild diff --git a/pkgs/by-name/xo/xorg/darwin/bundle_main.patch b/pkgs/by-name/xo/xorg/darwin/bundle_main.patch new file mode 100644 index 0000000..5d4c97d --- /dev/null +++ b/pkgs/by-name/xo/xorg/darwin/bundle_main.patch @@ -0,0 +1,84 @@ +This patch makes it possible (and necessary) to specify the default +shell, xterm client, and startx script from environment variables. These +defaults are used when launching the XQuartz.app, which in turn needs to know +how to start the X server. `startx' comes from the `xinit' package, +which also has a dependency on `xorg-server', so we can't hardcode +sane defaults. If the environment variables are specified, they +override any value in the preferences settings. + +When developing an installable package for XQuartz/XQuartz.app, we'll +need to set an `LSEnvironment' entry in the plist for the XQuartz.app. +(See stub.patch for more details.). + +diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c +index de82e2280..da58a5d44 100644 +--- a/hw/xquartz/mach-startup/bundle-main.c ++++ b/hw/xquartz/mach-startup/bundle-main.c +@@ -76,8 +76,6 @@ extern int noPanoramiXExtension; + extern Bool noCompositeExtension; + #endif + +-#define DEFAULT_CLIENT X11BINDIR "/xterm" +-#define DEFAULT_STARTX X11BINDIR "/startx -- " X11BINDIR "/Xquartz" + #define DEFAULT_SHELL "/bin/sh" + + #define _STRINGIZE(s) #s +@@ -108,7 +106,7 @@ server_main(int argc, char **argv, char **envp); + static int + execute(const char *command); + static char * +-command_from_prefs(const char *key, const char *default_value); ++command_from_prefs(const char *key, const char *env_name, const char *default_value); + + static char *pref_app_to_run; + static char *pref_login_shell; +@@ -669,14 +667,19 @@ main(int argc, char **argv, char **envp) + pid_t child1, child2; + int status; + +- pref_app_to_run = command_from_prefs("app_to_run", DEFAULT_CLIENT); ++ pref_app_to_run = command_from_prefs("app_to_run", ++ "XQUARTZ_DEFAULT_CLIENT", ++ NULL); + assert(pref_app_to_run); + +- pref_login_shell = command_from_prefs("login_shell", DEFAULT_SHELL); ++ pref_login_shell = command_from_prefs("login_shell", ++ "XQUARTZ_DEFAULT_SHELL", ++ DEFAULT_SHELL); + assert(pref_login_shell); + + pref_startx_script = command_from_prefs("startx_script", +- DEFAULT_STARTX); ++ "XQUARTZ_DEFAULT_STARTX", ++ NULL); + assert(pref_startx_script); + + /* Do the fork-twice trick to avoid having to reap zombies */ +@@ -753,7 +756,7 @@ execute(const char *command) + } + + static char * +-command_from_prefs(const char *key, const char *default_value) ++command_from_prefs(const char *key, const char *env_name, const char *default_value) + { + char *command = NULL; + +@@ -763,6 +766,17 @@ command_from_prefs(const char *key, const char *default_value) + if (!key) + return NULL; + ++ if (env_name != NULL) { ++ command = getenv(env_name); ++ if (command != NULL) { ++ return strdup(command); ++ } ++ } ++ ++ if (!default_value) { ++ return NULL; ++ } ++ + cfKey = CFStringCreateWithCString(NULL, key, kCFStringEncodingASCII); + + if (!cfKey) diff --git a/pkgs/by-name/xo/xorg/darwin/dri/GL/internal/dri_interface.h b/pkgs/by-name/xo/xorg/darwin/dri/GL/internal/dri_interface.h new file mode 100644 index 0000000..b012570 --- /dev/null +++ b/pkgs/by-name/xo/xorg/darwin/dri/GL/internal/dri_interface.h @@ -0,0 +1,1409 @@ +/* + * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2007-2008 Red Hat, Inc. + * (C) Copyright IBM Corporation 2004 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \file dri_interface.h + * + * This file contains all the types and functions that define the interface + * between a DRI driver and driver loader. Currently, the most common driver + * loader is the XFree86 libGL.so. However, other loaders do exist, and in + * the future the server-side libglx.a will also be a loader. + * + * \author Kevin E. Martin + * \author Ian Romanick + * \author Kristian Høgsberg + */ + +#ifndef DRI_INTERFACE_H +#define DRI_INTERFACE_H + +/* For archs with no drm.h */ +#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__GNU__) +#ifndef __NOT_HAVE_DRM_H +#define __NOT_HAVE_DRM_H +#endif +#endif + +#ifndef __NOT_HAVE_DRM_H +#include +#else +typedef unsigned int drm_context_t; +typedef unsigned int drm_drawable_t; +typedef struct drm_clip_rect drm_clip_rect_t; +#endif + +/** + * \name DRI interface structures + * + * The following structures define the interface between the GLX client + * side library and the DRI (direct rendering infrastructure). + */ +/*@{*/ +typedef struct __DRIdisplayRec __DRIdisplay; +typedef struct __DRIscreenRec __DRIscreen; +typedef struct __DRIcontextRec __DRIcontext; +typedef struct __DRIdrawableRec __DRIdrawable; +typedef struct __DRIconfigRec __DRIconfig; +typedef struct __DRIframebufferRec __DRIframebuffer; +typedef struct __DRIversionRec __DRIversion; + +typedef struct __DRIcoreExtensionRec __DRIcoreExtension; +typedef struct __DRIextensionRec __DRIextension; +typedef struct __DRIcopySubBufferExtensionRec __DRIcopySubBufferExtension; +typedef struct __DRIswapControlExtensionRec __DRIswapControlExtension; +typedef struct __DRIframeTrackingExtensionRec __DRIframeTrackingExtension; +typedef struct __DRImediaStreamCounterExtensionRec __DRImediaStreamCounterExtension; +typedef struct __DRItexOffsetExtensionRec __DRItexOffsetExtension; +typedef struct __DRItexBufferExtensionRec __DRItexBufferExtension; +typedef struct __DRIlegacyExtensionRec __DRIlegacyExtension; +typedef struct __DRIswrastExtensionRec __DRIswrastExtension; +typedef struct __DRIbufferRec __DRIbuffer; +typedef struct __DRIdri2ExtensionRec __DRIdri2Extension; +typedef struct __DRIdri2LoaderExtensionRec __DRIdri2LoaderExtension; +typedef struct __DRI2flushExtensionRec __DRI2flushExtension; +typedef struct __DRI2throttleExtensionRec __DRI2throttleExtension; + + +typedef struct __DRIimageLoaderExtensionRec __DRIimageLoaderExtension; +typedef struct __DRIimageDriverExtensionRec __DRIimageDriverExtension; + +/*@}*/ + + +/** + * Extension struct. Drivers 'inherit' from this struct by embedding + * it as the first element in the extension struct. + * + * We never break API in for a DRI extension. If we need to change + * the way things work in a non-backwards compatible manner, we + * introduce a new extension. During a transition period, we can + * leave both the old and the new extension in the driver, which + * allows us to move to the new interface without having to update the + * loader(s) in lock step. + * + * However, we can add entry points to an extension over time as long + * as we don't break the old ones. As we add entry points to an + * extension, we increase the version number. The corresponding + * #define can be used to guard code that accesses the new entry + * points at compile time and the version field in the extension + * struct can be used at run-time to determine how to use the + * extension. + */ +struct __DRIextensionRec { + const char *name; + int version; +}; + +/** + * The first set of extension are the screen extensions, returned by + * __DRIcore::getExtensions(). This entry point will return a list of + * extensions and the loader can use the ones it knows about by + * casting them to more specific extensions and advertising any GLX + * extensions the DRI extensions enables. + */ + +/** + * Used by drivers to indicate support for setting the read drawable. + */ +#define __DRI_READ_DRAWABLE "DRI_ReadDrawable" +#define __DRI_READ_DRAWABLE_VERSION 1 + +/** + * Used by drivers that implement the GLX_MESA_copy_sub_buffer extension. + */ +#define __DRI_COPY_SUB_BUFFER "DRI_CopySubBuffer" +#define __DRI_COPY_SUB_BUFFER_VERSION 1 +struct __DRIcopySubBufferExtensionRec { + __DRIextension base; + void (*copySubBuffer)(__DRIdrawable *drawable, int x, int y, int w, int h); +}; + +/** + * Used by drivers that implement the GLX_SGI_swap_control or + * GLX_MESA_swap_control extension. + */ +#define __DRI_SWAP_CONTROL "DRI_SwapControl" +#define __DRI_SWAP_CONTROL_VERSION 1 +struct __DRIswapControlExtensionRec { + __DRIextension base; + void (*setSwapInterval)(__DRIdrawable *drawable, unsigned int inteval); + unsigned int (*getSwapInterval)(__DRIdrawable *drawable); +}; + +/** + * Used by drivers that implement the GLX_MESA_swap_frame_usage extension. + */ +#define __DRI_FRAME_TRACKING "DRI_FrameTracking" +#define __DRI_FRAME_TRACKING_VERSION 1 +struct __DRIframeTrackingExtensionRec { + __DRIextension base; + + /** + * Enable or disable frame usage tracking. + * + * \since Internal API version 20030317. + */ + int (*frameTracking)(__DRIdrawable *drawable, GLboolean enable); + + /** + * Retrieve frame usage information. + * + * \since Internal API version 20030317. + */ + int (*queryFrameTracking)(__DRIdrawable *drawable, + int64_t * sbc, int64_t * missedFrames, + float * lastMissedUsage, float * usage); +}; + + +/** + * Used by drivers that implement the GLX_SGI_video_sync extension. + */ +#define __DRI_MEDIA_STREAM_COUNTER "DRI_MediaStreamCounter" +#define __DRI_MEDIA_STREAM_COUNTER_VERSION 1 +struct __DRImediaStreamCounterExtensionRec { + __DRIextension base; + + /** + * Wait for the MSC to equal target_msc, or, if that has already passed, + * the next time (MSC % divisor) is equal to remainder. If divisor is + * zero, the function will return as soon as MSC is greater than or equal + * to target_msc. + */ + int (*waitForMSC)(__DRIdrawable *drawable, + int64_t target_msc, int64_t divisor, int64_t remainder, + int64_t * msc, int64_t * sbc); + + /** + * Get the number of vertical refreshes since some point in time before + * this function was first called (i.e., system start up). + */ + int (*getDrawableMSC)(__DRIscreen *screen, __DRIdrawable *drawable, + int64_t *msc); +}; + + +#define __DRI_TEX_OFFSET "DRI_TexOffset" +#define __DRI_TEX_OFFSET_VERSION 1 +struct __DRItexOffsetExtensionRec { + __DRIextension base; + + /** + * Method to override base texture image with a driver specific 'offset'. + * The depth passed in allows e.g. to ignore the alpha channel of texture + * images where the non-alpha components don't occupy a whole texel. + * + * For GLX_EXT_texture_from_pixmap with AIGLX. + */ + void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname, + unsigned long long offset, GLint depth, GLuint pitch); +}; + + +/* Valid values for format in the setTexBuffer2 function below. These + * values match the GLX tokens for compatibility reasons, but we + * define them here since the DRI interface can't depend on GLX. */ +#define __DRI_TEXTURE_FORMAT_NONE 0x20D8 +#define __DRI_TEXTURE_FORMAT_RGB 0x20D9 +#define __DRI_TEXTURE_FORMAT_RGBA 0x20DA + +#define __DRI_TEX_BUFFER "DRI_TexBuffer" +#define __DRI_TEX_BUFFER_VERSION 2 +struct __DRItexBufferExtensionRec { + __DRIextension base; + + /** + * Method to override base texture image with the contents of a + * __DRIdrawable. + * + * For GLX_EXT_texture_from_pixmap with AIGLX. Deprecated in favor of + * setTexBuffer2 in version 2 of this interface + */ + void (*setTexBuffer)(__DRIcontext *pDRICtx, + GLint target, + __DRIdrawable *pDraw); + + /** + * Method to override base texture image with the contents of a + * __DRIdrawable, including the required texture format attribute. + * + * For GLX_EXT_texture_from_pixmap with AIGLX. + */ + void (*setTexBuffer2)(__DRIcontext *pDRICtx, + GLint target, + GLint format, + __DRIdrawable *pDraw); + /** + * Method to release texture buffer in case some special platform + * need this. + * + * For GLX_EXT_texture_from_pixmap with AIGLX. + */ + void (*releaseTexBuffer)(__DRIcontext *pDRICtx, + GLint target, + __DRIdrawable *pDraw); +}; + +/** + * Used by drivers that implement DRI2 + */ +#define __DRI2_FLUSH "DRI2_Flush" +#define __DRI2_FLUSH_VERSION 4 + +#define __DRI2_FLUSH_DRAWABLE (1 << 0) /* the drawable should be flushed. */ +#define __DRI2_FLUSH_CONTEXT (1 << 1) /* glFlush should be called */ + +enum __DRI2throttleReason { + __DRI2_THROTTLE_SWAPBUFFER, + __DRI2_THROTTLE_COPYSUBBUFFER, + __DRI2_THROTTLE_FLUSHFRONT +}; + +struct __DRI2flushExtensionRec { + __DRIextension base; + void (*flush)(__DRIdrawable *drawable); + + /** + * Ask the driver to call getBuffers/getBuffersWithFormat before + * it starts rendering again. + * + * \param drawable the drawable to invalidate + * + * \since 3 + */ + void (*invalidate)(__DRIdrawable *drawable); + + /** + * This function reduces the number of flushes in the driver by combining + * several operations into one call. + * + * It can: + * - throttle + * - flush a drawable + * - flush a context + * + * \param context the context + * \param drawable the drawable to flush + * \param flags a combination of _DRI2_FLUSH_xxx flags + * \param throttle_reason the reason for throttling, 0 = no throttling + * + * \since 4 + */ + void (*flush_with_flags)(__DRIcontext *ctx, + __DRIdrawable *drawable, + unsigned flags, + enum __DRI2throttleReason throttle_reason); +}; + + +/** + * Extension that the driver uses to request + * throttle callbacks. + */ + +#define __DRI2_THROTTLE "DRI2_Throttle" +#define __DRI2_THROTTLE_VERSION 1 + +struct __DRI2throttleExtensionRec { + __DRIextension base; + void (*throttle)(__DRIcontext *ctx, + __DRIdrawable *drawable, + enum __DRI2throttleReason reason); +}; + +/*@}*/ + +/** + * The following extensions describe loader features that the DRI + * driver can make use of. Some of these are mandatory, such as the + * getDrawableInfo extension for DRI and the DRI Loader extensions for + * DRI2, while others are optional, and if present allow the driver to + * expose certain features. The loader pass in a NULL terminated + * array of these extensions to the driver in the createNewScreen + * constructor. + */ + +typedef struct __DRIgetDrawableInfoExtensionRec __DRIgetDrawableInfoExtension; +typedef struct __DRIsystemTimeExtensionRec __DRIsystemTimeExtension; +typedef struct __DRIdamageExtensionRec __DRIdamageExtension; +typedef struct __DRIloaderExtensionRec __DRIloaderExtension; +typedef struct __DRIswrastLoaderExtensionRec __DRIswrastLoaderExtension; + + +/** + * Callback to getDrawableInfo protocol + */ +#define __DRI_GET_DRAWABLE_INFO "DRI_GetDrawableInfo" +#define __DRI_GET_DRAWABLE_INFO_VERSION 1 +struct __DRIgetDrawableInfoExtensionRec { + __DRIextension base; + + /** + * This function is used to get information about the position, size, and + * clip rects of a drawable. + */ + GLboolean (* getDrawableInfo) ( __DRIdrawable *drawable, + unsigned int * index, unsigned int * stamp, + int * x, int * y, int * width, int * height, + int * numClipRects, drm_clip_rect_t ** pClipRects, + int * backX, int * backY, + int * numBackClipRects, drm_clip_rect_t ** pBackClipRects, + void *loaderPrivate); +}; + +/** + * Callback to get system time for media stream counter extensions. + */ +#define __DRI_SYSTEM_TIME "DRI_SystemTime" +#define __DRI_SYSTEM_TIME_VERSION 1 +struct __DRIsystemTimeExtensionRec { + __DRIextension base; + + /** + * Get the 64-bit unadjusted system time (UST). + */ + int (*getUST)(int64_t * ust); + + /** + * Get the media stream counter (MSC) rate. + * + * Matching the definition in GLX_OML_sync_control, this function returns + * the rate of the "media stream counter". In practical terms, this is + * the frame refresh rate of the display. + */ + GLboolean (*getMSCRate)(__DRIdrawable *draw, + int32_t * numerator, int32_t * denominator, + void *loaderPrivate); +}; + +/** + * Damage reporting + */ +#define __DRI_DAMAGE "DRI_Damage" +#define __DRI_DAMAGE_VERSION 1 +struct __DRIdamageExtensionRec { + __DRIextension base; + + /** + * Reports areas of the given drawable which have been modified by the + * driver. + * + * \param drawable which the drawing was done to. + * \param rects rectangles affected, with the drawable origin as the + * origin. + * \param x X offset of the drawable within the screen (used in the + * front_buffer case) + * \param y Y offset of the drawable within the screen. + * \param front_buffer boolean flag for whether the drawing to the + * drawable was actually done directly to the front buffer (instead + * of backing storage, for example) + * \param loaderPrivate the data passed in at createNewDrawable time + */ + void (*reportDamage)(__DRIdrawable *draw, + int x, int y, + drm_clip_rect_t *rects, int num_rects, + GLboolean front_buffer, + void *loaderPrivate); +}; + +#define __DRI_SWRAST_IMAGE_OP_DRAW 1 +#define __DRI_SWRAST_IMAGE_OP_CLEAR 2 +#define __DRI_SWRAST_IMAGE_OP_SWAP 3 + +/** + * SWRast Loader extension. + */ +#define __DRI_SWRAST_LOADER "DRI_SWRastLoader" +#define __DRI_SWRAST_LOADER_VERSION 1 +struct __DRIswrastLoaderExtensionRec { + __DRIextension base; + + /* + * Drawable position and size + */ + void (*getDrawableInfo)(__DRIdrawable *drawable, + int *x, int *y, int *width, int *height, + void *loaderPrivate); + + /** + * Put image to drawable + */ + void (*putImage)(__DRIdrawable *drawable, int op, + int x, int y, int width, int height, + char *data, void *loaderPrivate); + + /** + * Get image from readable + */ + void (*getImage)(__DRIdrawable *readable, + int x, int y, int width, int height, + char *data, void *loaderPrivate); +}; + +/** + * Invalidate loader extension. The presence of this extension + * indicates to the DRI driver that the loader will call invalidate in + * the __DRI2_FLUSH extension, whenever the needs to query for new + * buffers. This means that the DRI driver can drop the polling in + * glViewport(). + * + * The extension doesn't provide any functionality, it's only use to + * indicate to the driver that it can use the new semantics. A DRI + * driver can use this to switch between the different semantics or + * just refuse to initialize if this extension isn't present. + */ +#define __DRI_USE_INVALIDATE "DRI_UseInvalidate" +#define __DRI_USE_INVALIDATE_VERSION 1 + +typedef struct __DRIuseInvalidateExtensionRec __DRIuseInvalidateExtension; +struct __DRIuseInvalidateExtensionRec { + __DRIextension base; +}; + +/** + * The remaining extensions describe driver extensions, immediately + * available interfaces provided by the driver. To start using the + * driver, dlsym() for the __DRI_DRIVER_EXTENSIONS symbol and look for + * the extension you need in the array. + */ +#define __DRI_DRIVER_EXTENSIONS "__driDriverExtensions" + +/** + * This symbol replaces the __DRI_DRIVER_EXTENSIONS symbol, and will be + * suffixed by "_drivername", allowing multiple drivers to be built into one + * library, and also giving the driver the chance to return a variable driver + * extensions struct depending on the driver name being loaded or any other + * system state. + * + * The function prototype is: + * + * const __DRIextension **__driDriverGetExtensions_drivername(void); + */ +#define __DRI_DRIVER_GET_EXTENSIONS "__driDriverGetExtensions" + +/** + * Tokens for __DRIconfig attribs. A number of attributes defined by + * GLX or EGL standards are not in the table, as they must be provided + * by the loader. For example, FBConfig ID or visual ID, drawable type. + */ + +#define __DRI_ATTRIB_BUFFER_SIZE 1 +#define __DRI_ATTRIB_LEVEL 2 +#define __DRI_ATTRIB_RED_SIZE 3 +#define __DRI_ATTRIB_GREEN_SIZE 4 +#define __DRI_ATTRIB_BLUE_SIZE 5 +#define __DRI_ATTRIB_LUMINANCE_SIZE 6 +#define __DRI_ATTRIB_ALPHA_SIZE 7 +#define __DRI_ATTRIB_ALPHA_MASK_SIZE 8 +#define __DRI_ATTRIB_DEPTH_SIZE 9 +#define __DRI_ATTRIB_STENCIL_SIZE 10 +#define __DRI_ATTRIB_ACCUM_RED_SIZE 11 +#define __DRI_ATTRIB_ACCUM_GREEN_SIZE 12 +#define __DRI_ATTRIB_ACCUM_BLUE_SIZE 13 +#define __DRI_ATTRIB_ACCUM_ALPHA_SIZE 14 +#define __DRI_ATTRIB_SAMPLE_BUFFERS 15 +#define __DRI_ATTRIB_SAMPLES 16 +#define __DRI_ATTRIB_RENDER_TYPE 17 +#define __DRI_ATTRIB_CONFIG_CAVEAT 18 +#define __DRI_ATTRIB_CONFORMANT 19 +#define __DRI_ATTRIB_DOUBLE_BUFFER 20 +#define __DRI_ATTRIB_STEREO 21 +#define __DRI_ATTRIB_AUX_BUFFERS 22 +#define __DRI_ATTRIB_TRANSPARENT_TYPE 23 +#define __DRI_ATTRIB_TRANSPARENT_INDEX_VALUE 24 +#define __DRI_ATTRIB_TRANSPARENT_RED_VALUE 25 +#define __DRI_ATTRIB_TRANSPARENT_GREEN_VALUE 26 +#define __DRI_ATTRIB_TRANSPARENT_BLUE_VALUE 27 +#define __DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE 28 +#define __DRI_ATTRIB_FLOAT_MODE 29 +#define __DRI_ATTRIB_RED_MASK 30 +#define __DRI_ATTRIB_GREEN_MASK 31 +#define __DRI_ATTRIB_BLUE_MASK 32 +#define __DRI_ATTRIB_ALPHA_MASK 33 +#define __DRI_ATTRIB_MAX_PBUFFER_WIDTH 34 +#define __DRI_ATTRIB_MAX_PBUFFER_HEIGHT 35 +#define __DRI_ATTRIB_MAX_PBUFFER_PIXELS 36 +#define __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH 37 +#define __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT 38 +#define __DRI_ATTRIB_VISUAL_SELECT_GROUP 39 +#define __DRI_ATTRIB_SWAP_METHOD 40 +#define __DRI_ATTRIB_MAX_SWAP_INTERVAL 41 +#define __DRI_ATTRIB_MIN_SWAP_INTERVAL 42 +#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGB 43 +#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA 44 +#define __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE 45 +#define __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS 46 +#define __DRI_ATTRIB_YINVERTED 47 +#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48 + +/* __DRI_ATTRIB_RENDER_TYPE */ +#define __DRI_ATTRIB_RGBA_BIT 0x01 +#define __DRI_ATTRIB_COLOR_INDEX_BIT 0x02 +#define __DRI_ATTRIB_LUMINANCE_BIT 0x04 +#define __DRI_ATTRIB_FLOAT_BIT 0x08 +#define __DRI_ATTRIB_UNSIGNED_FLOAT_BIT 0x10 + +/* __DRI_ATTRIB_CONFIG_CAVEAT */ +#define __DRI_ATTRIB_SLOW_BIT 0x01 +#define __DRI_ATTRIB_NON_CONFORMANT_CONFIG 0x02 + +/* __DRI_ATTRIB_TRANSPARENT_TYPE */ +#define __DRI_ATTRIB_TRANSPARENT_RGB 0x00 +#define __DRI_ATTRIB_TRANSPARENT_INDEX 0x01 + +/* __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS */ +#define __DRI_ATTRIB_TEXTURE_1D_BIT 0x01 +#define __DRI_ATTRIB_TEXTURE_2D_BIT 0x02 +#define __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT 0x04 + +/** + * This extension defines the core DRI functionality. + */ +#define __DRI_CORE "DRI_Core" +#define __DRI_CORE_VERSION 1 + +struct __DRIcoreExtensionRec { + __DRIextension base; + + __DRIscreen *(*createNewScreen)(int screen, int fd, + unsigned int sarea_handle, + const __DRIextension **extensions, + const __DRIconfig ***driverConfigs, + void *loaderPrivate); + + void (*destroyScreen)(__DRIscreen *screen); + + const __DRIextension **(*getExtensions)(__DRIscreen *screen); + + int (*getConfigAttrib)(const __DRIconfig *config, + unsigned int attrib, + unsigned int *value); + + int (*indexConfigAttrib)(const __DRIconfig *config, int index, + unsigned int *attrib, unsigned int *value); + + __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen, + const __DRIconfig *config, + unsigned int drawable_id, + unsigned int head, + void *loaderPrivate); + + void (*destroyDrawable)(__DRIdrawable *drawable); + + void (*swapBuffers)(__DRIdrawable *drawable); + + __DRIcontext *(*createNewContext)(__DRIscreen *screen, + const __DRIconfig *config, + __DRIcontext *shared, + void *loaderPrivate); + + int (*copyContext)(__DRIcontext *dest, + __DRIcontext *src, + unsigned long mask); + + void (*destroyContext)(__DRIcontext *context); + + int (*bindContext)(__DRIcontext *ctx, + __DRIdrawable *pdraw, + __DRIdrawable *pread); + + int (*unbindContext)(__DRIcontext *ctx); +}; + +/** + * Stored version of some component (i.e., server-side DRI module, kernel-side + * DRM, etc.). + * + * \todo + * There are several data structures that explicitly store a major version, + * minor version, and patch level. These structures should be modified to + * have a \c __DRIversionRec instead. + */ +struct __DRIversionRec { + int major; /**< Major version number. */ + int minor; /**< Minor version number. */ + int patch; /**< Patch-level. */ +}; + +/** + * Framebuffer information record. Used by libGL to communicate information + * about the framebuffer to the driver's \c __driCreateNewScreen function. + * + * In XFree86, most of this information is derrived from data returned by + * calling \c XF86DRIGetDeviceInfo. + * + * \sa XF86DRIGetDeviceInfo __DRIdisplayRec::createNewScreen + * __driUtilCreateNewScreen CallCreateNewScreen + * + * \bug This structure could be better named. + */ +struct __DRIframebufferRec { + unsigned char *base; /**< Framebuffer base address in the CPU's + * address space. This value is calculated by + * calling \c drmMap on the framebuffer handle + * returned by \c XF86DRIGetDeviceInfo (or a + * similar function). + */ + int size; /**< Framebuffer size, in bytes. */ + int stride; /**< Number of bytes from one line to the next. */ + int width; /**< Pixel width of the framebuffer. */ + int height; /**< Pixel height of the framebuffer. */ + int dev_priv_size; /**< Size of the driver's dev-priv structure. */ + void *dev_priv; /**< Pointer to the driver's dev-priv structure. */ +}; + + +/** + * This extension provides alternative screen, drawable and context + * constructors for legacy DRI functionality. This is used in + * conjunction with the core extension. + */ +#define __DRI_LEGACY "DRI_Legacy" +#define __DRI_LEGACY_VERSION 1 + +struct __DRIlegacyExtensionRec { + __DRIextension base; + + __DRIscreen *(*createNewScreen)(int screen, + const __DRIversion *ddx_version, + const __DRIversion *dri_version, + const __DRIversion *drm_version, + const __DRIframebuffer *frame_buffer, + void *pSAREA, int fd, + const __DRIextension **extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + + __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen, + const __DRIconfig *config, + drm_drawable_t hwDrawable, + int renderType, const int *attrs, + void *loaderPrivate); + + __DRIcontext *(*createNewContext)(__DRIscreen *screen, + const __DRIconfig *config, + int render_type, + __DRIcontext *shared, + drm_context_t hwContext, + void *loaderPrivate); +}; + +/** + * This extension provides alternative screen, drawable and context + * constructors for swrast DRI functionality. This is used in + * conjunction with the core extension. + */ +#define __DRI_SWRAST "DRI_SWRast" +#define __DRI_SWRAST_VERSION 4 + +struct __DRIswrastExtensionRec { + __DRIextension base; + + __DRIscreen *(*createNewScreen)(int screen, + const __DRIextension **extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + + __DRIdrawable *(*createNewDrawable)(__DRIscreen *screen, + const __DRIconfig *config, + void *loaderPrivate); + + /* Since version 2 */ + __DRIcontext *(*createNewContextForAPI)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + void *data); + + /** + * Create a context for a particular API with a set of attributes + * + * \since version 3 + * + * \sa __DRIdri2ExtensionRec::createContextAttribs + */ + __DRIcontext *(*createContextAttribs)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error, + void *loaderPrivate); + + /** + * createNewScreen() with the driver extensions passed in. + * + * \since version 4 + */ + __DRIscreen *(*createNewScreen2)(int screen, + const __DRIextension **loader_extensions, + const __DRIextension **driver_extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + +}; + +/** Common DRI function definitions, shared among DRI2 and Image extensions + */ + +typedef __DRIscreen * +(*__DRIcreateNewScreen2Func)(int screen, int fd, + const __DRIextension **extensions, + const __DRIextension **driver_extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + +typedef __DRIdrawable * +(*__DRIcreateNewDrawableFunc)(__DRIscreen *screen, + const __DRIconfig *config, + void *loaderPrivate); + +typedef __DRIcontext * +(*__DRIcreateContextAttribsFunc)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error, + void *loaderPrivate); + +typedef unsigned int +(*__DRIgetAPIMaskFunc)(__DRIscreen *screen); + +/** + * DRI2 Loader extension. + */ +#define __DRI_BUFFER_FRONT_LEFT 0 +#define __DRI_BUFFER_BACK_LEFT 1 +#define __DRI_BUFFER_FRONT_RIGHT 2 +#define __DRI_BUFFER_BACK_RIGHT 3 +#define __DRI_BUFFER_DEPTH 4 +#define __DRI_BUFFER_STENCIL 5 +#define __DRI_BUFFER_ACCUM 6 +#define __DRI_BUFFER_FAKE_FRONT_LEFT 7 +#define __DRI_BUFFER_FAKE_FRONT_RIGHT 8 +#define __DRI_BUFFER_DEPTH_STENCIL 9 /**< Only available with DRI2 1.1 */ +#define __DRI_BUFFER_HIZ 10 + +/* Inofficial and for internal use. Increase when adding a new buffer token. */ +#define __DRI_BUFFER_COUNT 11 + +struct __DRIbufferRec { + unsigned int attachment; + unsigned int name; + unsigned int pitch; + unsigned int cpp; + unsigned int flags; +}; + +#define __DRI_DRI2_LOADER "DRI_DRI2Loader" +#define __DRI_DRI2_LOADER_VERSION 3 +struct __DRIdri2LoaderExtensionRec { + __DRIextension base; + + __DRIbuffer *(*getBuffers)(__DRIdrawable *driDrawable, + int *width, int *height, + unsigned int *attachments, int count, + int *out_count, void *loaderPrivate); + + /** + * Flush pending front-buffer rendering + * + * Any rendering that has been performed to the + * \c __DRI_BUFFER_FAKE_FRONT_LEFT will be flushed to the + * \c __DRI_BUFFER_FRONT_LEFT. + * + * \param driDrawable Drawable whose front-buffer is to be flushed + * \param loaderPrivate Loader's private data that was previously passed + * into __DRIdri2ExtensionRec::createNewDrawable + */ + void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate); + + + /** + * Get list of buffers from the server + * + * Gets a list of buffer for the specified set of attachments. Unlike + * \c ::getBuffers, this function takes a list of attachments paired with + * opaque \c unsigned \c int value describing the format of the buffer. + * It is the responsibility of the caller to know what the service that + * allocates the buffers will expect to receive for the format. + * + * \param driDrawable Drawable whose buffers are being queried. + * \param width Output where the width of the buffers is stored. + * \param height Output where the height of the buffers is stored. + * \param attachments List of pairs of attachment ID and opaque format + * requested for the drawable. + * \param count Number of attachment / format pairs stored in + * \c attachments. + * \param loaderPrivate Loader's private data that was previously passed + * into __DRIdri2ExtensionRec::createNewDrawable. + */ + __DRIbuffer *(*getBuffersWithFormat)(__DRIdrawable *driDrawable, + int *width, int *height, + unsigned int *attachments, int count, + int *out_count, void *loaderPrivate); +}; + +/** + * This extension provides alternative screen, drawable and context + * constructors for DRI2. + */ +#define __DRI_DRI2 "DRI_DRI2" +#define __DRI_DRI2_VERSION 4 + +#define __DRI_API_OPENGL 0 /**< OpenGL compatibility profile */ +#define __DRI_API_GLES 1 /**< OpenGL ES 1.x */ +#define __DRI_API_GLES2 2 /**< OpenGL ES 2.x */ +#define __DRI_API_OPENGL_CORE 3 /**< OpenGL 3.2+ core profile */ +#define __DRI_API_GLES3 4 /**< OpenGL ES 3.x */ + +#define __DRI_CTX_ATTRIB_MAJOR_VERSION 0 +#define __DRI_CTX_ATTRIB_MINOR_VERSION 1 +#define __DRI_CTX_ATTRIB_FLAGS 2 + +/** + * \requires __DRI2_ROBUSTNESS. + */ +#define __DRI_CTX_ATTRIB_RESET_STRATEGY 3 + +#define __DRI_CTX_FLAG_DEBUG 0x00000001 +#define __DRI_CTX_FLAG_FORWARD_COMPATIBLE 0x00000002 + +/** + * \requires __DRI2_ROBUSTNESS. + */ +#define __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS 0x00000004 + +/** + * \name Context reset strategies. + */ +/*@{*/ +#define __DRI_CTX_RESET_NO_NOTIFICATION 0 +#define __DRI_CTX_RESET_LOSE_CONTEXT 1 +/*@}*/ + +/** + * \name Reasons that __DRIdri2Extension::createContextAttribs might fail + */ +/*@{*/ +/** Success! */ +#define __DRI_CTX_ERROR_SUCCESS 0 + +/** Memory allocation failure */ +#define __DRI_CTX_ERROR_NO_MEMORY 1 + +/** Client requested an API (e.g., OpenGL ES 2.0) that the driver can't do. */ +#define __DRI_CTX_ERROR_BAD_API 2 + +/** Client requested an API version that the driver can't do. */ +#define __DRI_CTX_ERROR_BAD_VERSION 3 + +/** Client requested a flag or combination of flags the driver can't do. */ +#define __DRI_CTX_ERROR_BAD_FLAG 4 + +/** Client requested an attribute the driver doesn't understand. */ +#define __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE 5 + +/** Client requested a flag the driver doesn't understand. */ +#define __DRI_CTX_ERROR_UNKNOWN_FLAG 6 +/*@}*/ + +struct __DRIdri2ExtensionRec { + __DRIextension base; + + __DRIscreen *(*createNewScreen)(int screen, int fd, + const __DRIextension **extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + + __DRIcreateNewDrawableFunc createNewDrawable; + __DRIcontext *(*createNewContext)(__DRIscreen *screen, + const __DRIconfig *config, + __DRIcontext *shared, + void *loaderPrivate); + + /* Since version 2 */ + __DRIgetAPIMaskFunc getAPIMask; + + __DRIcontext *(*createNewContextForAPI)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + void *data); + + __DRIbuffer *(*allocateBuffer)(__DRIscreen *screen, + unsigned int attachment, + unsigned int format, + int width, + int height); + void (*releaseBuffer)(__DRIscreen *screen, + __DRIbuffer *buffer); + + /** + * Create a context for a particular API with a set of attributes + * + * \since version 3 + * + * \sa __DRIswrastExtensionRec::createContextAttribs + */ + __DRIcreateContextAttribsFunc createContextAttribs; + + /** + * createNewScreen with the driver's extension list passed in. + * + * \since version 4 + */ + __DRIcreateNewScreen2Func createNewScreen2; +}; + + +/** + * This extension provides functionality to enable various EGLImage + * extensions. + */ +#define __DRI_IMAGE "DRI_IMAGE" +#define __DRI_IMAGE_VERSION 8 + +/** + * These formats correspond to the similarly named MESA_FORMAT_* + * tokens, except in the native endian of the CPU. For example, on + * little endian __DRI_IMAGE_FORMAT_XRGB8888 corresponds to + * MESA_FORMAT_XRGB8888, but MESA_FORMAT_XRGB8888_REV on big endian. + * + * __DRI_IMAGE_FORMAT_NONE is for images that aren't directly usable + * by the driver (YUV planar formats) but serve as a base image for + * creating sub-images for the different planes within the image. + * + * R8, GR88 and NONE should not be used with createImageFormName or + * createImage, and are returned by query from sub images created with + * createImageFromNames (NONE, see above) and fromPlane (R8 & GR88). + */ +#define __DRI_IMAGE_FORMAT_RGB565 0x1001 +#define __DRI_IMAGE_FORMAT_XRGB8888 0x1002 +#define __DRI_IMAGE_FORMAT_ARGB8888 0x1003 +#define __DRI_IMAGE_FORMAT_ABGR8888 0x1004 +#define __DRI_IMAGE_FORMAT_XBGR8888 0x1005 +#define __DRI_IMAGE_FORMAT_R8 0x1006 /* Since version 5 */ +#define __DRI_IMAGE_FORMAT_GR88 0x1007 +#define __DRI_IMAGE_FORMAT_NONE 0x1008 +#define __DRI_IMAGE_FORMAT_XRGB2101010 0x1009 +#define __DRI_IMAGE_FORMAT_ARGB2101010 0x100a +#define __DRI_IMAGE_FORMAT_SARGB8 0x100b + +#define __DRI_IMAGE_USE_SHARE 0x0001 +#define __DRI_IMAGE_USE_SCANOUT 0x0002 +#define __DRI_IMAGE_USE_CURSOR 0x0004 /* Depricated */ +#define __DRI_IMAGE_USE_LINEAR 0x0008 + + +/** + * Four CC formats that matches with WL_DRM_FORMAT_* from wayland_drm.h + * and GBM_FORMAT_* from gbm.h, used with createImageFromNames. + * + * \since 5 + */ + +#define __DRI_IMAGE_FOURCC_RGB565 0x36314752 +#define __DRI_IMAGE_FOURCC_ARGB8888 0x34325241 +#define __DRI_IMAGE_FOURCC_XRGB8888 0x34325258 +#define __DRI_IMAGE_FOURCC_ABGR8888 0x34324241 +#define __DRI_IMAGE_FOURCC_XBGR8888 0x34324258 +#define __DRI_IMAGE_FOURCC_YUV410 0x39565559 +#define __DRI_IMAGE_FOURCC_YUV411 0x31315559 +#define __DRI_IMAGE_FOURCC_YUV420 0x32315559 +#define __DRI_IMAGE_FOURCC_YUV422 0x36315559 +#define __DRI_IMAGE_FOURCC_YUV444 0x34325559 +#define __DRI_IMAGE_FOURCC_NV12 0x3231564e +#define __DRI_IMAGE_FOURCC_NV16 0x3631564e +#define __DRI_IMAGE_FOURCC_YUYV 0x56595559 + + +/** + * Queryable on images created by createImageFromNames. + * + * RGB and RGBA are may be usable directly as images but its still + * recommended to call fromPlanar with plane == 0. + * + * Y_U_V, Y_UV and Y_XUXV all requires call to fromPlanar to create + * usable sub-images, sampling from images return raw YUV data and + * color conversion needs to be done in the shader. + * + * \since 5 + */ + +#define __DRI_IMAGE_COMPONENTS_RGB 0x3001 +#define __DRI_IMAGE_COMPONENTS_RGBA 0x3002 +#define __DRI_IMAGE_COMPONENTS_Y_U_V 0x3003 +#define __DRI_IMAGE_COMPONENTS_Y_UV 0x3004 +#define __DRI_IMAGE_COMPONENTS_Y_XUXV 0x3005 + + +/** + * queryImage attributes + */ + +#define __DRI_IMAGE_ATTRIB_STRIDE 0x2000 +#define __DRI_IMAGE_ATTRIB_HANDLE 0x2001 +#define __DRI_IMAGE_ATTRIB_NAME 0x2002 +#define __DRI_IMAGE_ATTRIB_FORMAT 0x2003 /* available in versions 3+ */ +#define __DRI_IMAGE_ATTRIB_WIDTH 0x2004 /* available in versions 4+ */ +#define __DRI_IMAGE_ATTRIB_HEIGHT 0x2005 +#define __DRI_IMAGE_ATTRIB_COMPONENTS 0x2006 /* available in versions 5+ */ +#define __DRI_IMAGE_ATTRIB_FD 0x2007 /* available in versions + * 7+. Each query will return a + * new fd. */ + +enum __DRIYUVColorSpace { + __DRI_YUV_COLOR_SPACE_UNDEFINED = 0, + __DRI_YUV_COLOR_SPACE_ITU_REC601 = 0x327F, + __DRI_YUV_COLOR_SPACE_ITU_REC709 = 0x3280, + __DRI_YUV_COLOR_SPACE_ITU_REC2020 = 0x3281 +}; + +enum __DRISampleRange { + __DRI_YUV_RANGE_UNDEFINED = 0, + __DRI_YUV_FULL_RANGE = 0x3282, + __DRI_YUV_NARROW_RANGE = 0x3283 +}; + +enum __DRIChromaSiting { + __DRI_YUV_CHROMA_SITING_UNDEFINED = 0, + __DRI_YUV_CHROMA_SITING_0 = 0x3284, + __DRI_YUV_CHROMA_SITING_0_5 = 0x3285 +}; + +/** + * \name Reasons that __DRIimageExtensionRec::createImageFromTexture might fail + */ +/*@{*/ +/** Success! */ +#define __DRI_IMAGE_ERROR_SUCCESS 0 + +/** Memory allocation failure */ +#define __DRI_IMAGE_ERROR_BAD_ALLOC 1 + +/** Client requested an invalid attribute for a texture object */ +#define __DRI_IMAGE_ERROR_BAD_MATCH 2 + +/** Client requested an invalid texture object */ +#define __DRI_IMAGE_ERROR_BAD_PARAMETER 3 +/*@}*/ + +typedef struct __DRIimageRec __DRIimage; +typedef struct __DRIimageExtensionRec __DRIimageExtension; +struct __DRIimageExtensionRec { + __DRIextension base; + + __DRIimage *(*createImageFromName)(__DRIscreen *screen, + int width, int height, int format, + int name, int pitch, + void *loaderPrivate); + + __DRIimage *(*createImageFromRenderbuffer)(__DRIcontext *context, + int renderbuffer, + void *loaderPrivate); + + void (*destroyImage)(__DRIimage *image); + + __DRIimage *(*createImage)(__DRIscreen *screen, + int width, int height, int format, + unsigned int use, + void *loaderPrivate); + + GLboolean (*queryImage)(__DRIimage *image, int attrib, int *value); + + /** + * The new __DRIimage will share the content with the old one, see dup(2). + */ + __DRIimage *(*dupImage)(__DRIimage *image, void *loaderPrivate); + + /** + * Validate that a __DRIimage can be used a certain way. + * + * \since 2 + */ + GLboolean (*validateUsage)(__DRIimage *image, unsigned int use); + + /** + * Unlike createImageFromName __DRI_IMAGE_FORMAT is not but instead + * __DRI_IMAGE_FOURCC and strides are in bytes not pixels. Stride is + * also per block and not per pixel (for non-RGB, see gallium blocks). + * + * \since 5 + */ + __DRIimage *(*createImageFromNames)(__DRIscreen *screen, + int width, int height, int fourcc, + int *names, int num_names, + int *strides, int *offsets, + void *loaderPrivate); + + /** + * Create an image out of a sub-region of a parent image. This + * entry point lets us create individual __DRIimages for different + * planes in a planar buffer (typically yuv), for example. While a + * sub-image shares the underlying buffer object with the parent + * image and other sibling sub-images, the life times of parent and + * sub-images are not dependent. Destroying the parent or a + * sub-image doesn't affect other images. The underlying buffer + * object is free when no __DRIimage remains that references it. + * + * Sub-images may overlap, but rendering to overlapping sub-images + * is undefined. + * + * \since 5 + */ + __DRIimage *(*fromPlanar)(__DRIimage *image, int plane, + void *loaderPrivate); + + /** + * Create image from texture. + * + * \since 6 + */ + __DRIimage *(*createImageFromTexture)(__DRIcontext *context, + int target, + unsigned texture, + int depth, + int level, + unsigned *error, + void *loaderPrivate); + /** + * Like createImageFromNames, but takes a prime fd instead. + * + * \since 7 + */ + __DRIimage *(*createImageFromFds)(__DRIscreen *screen, + int width, int height, int fourcc, + int *fds, int num_fds, + int *strides, int *offsets, + void *loaderPrivate); + + /** + * Like createImageFromFds, but takes additional attributes. + * + * For EGL_EXT_image_dma_buf_import. + * + * \since 8 + */ + __DRIimage *(*createImageFromDmaBufs)(__DRIscreen *screen, + int width, int height, int fourcc, + int *fds, int num_fds, + int *strides, int *offsets, + enum __DRIYUVColorSpace color_space, + enum __DRISampleRange sample_range, + enum __DRIChromaSiting horiz_siting, + enum __DRIChromaSiting vert_siting, + unsigned *error, + void *loaderPrivate); +}; + + +/** + * This extension must be implemented by the loader and passed to the + * driver at screen creation time. The EGLImage entry points in the + * various client APIs take opaque EGLImage handles and use this + * extension to map them to a __DRIimage. At version 1, this + * extensions allows mapping EGLImage pointers to __DRIimage pointers, + * but future versions could support other EGLImage-like, opaque types + * with new lookup functions. + */ +#define __DRI_IMAGE_LOOKUP "DRI_IMAGE_LOOKUP" +#define __DRI_IMAGE_LOOKUP_VERSION 1 + +typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension; +struct __DRIimageLookupExtensionRec { + __DRIextension base; + + __DRIimage *(*lookupEGLImage)(__DRIscreen *screen, void *image, + void *loaderPrivate); +}; + +/** + * This extension allows for common DRI2 options + */ +#define __DRI2_CONFIG_QUERY "DRI_CONFIG_QUERY" +#define __DRI2_CONFIG_QUERY_VERSION 1 + +typedef struct __DRI2configQueryExtensionRec __DRI2configQueryExtension; +struct __DRI2configQueryExtensionRec { + __DRIextension base; + + int (*configQueryb)(__DRIscreen *screen, const char *var, GLboolean *val); + int (*configQueryi)(__DRIscreen *screen, const char *var, GLint *val); + int (*configQueryf)(__DRIscreen *screen, const char *var, GLfloat *val); +}; + +/** + * Robust context driver extension. + * + * Existence of this extension means the driver can accept the + * \c __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS flag and the + * \c __DRI_CTX_ATTRIB_RESET_STRATEGY attribute in + * \c __DRIdri2ExtensionRec::createContextAttribs. + */ +#define __DRI2_ROBUSTNESS "DRI_Robustness" +#define __DRI2_ROBUSTNESS_VERSION 1 + +typedef struct __DRIrobustnessExtensionRec __DRIrobustnessExtension; +struct __DRIrobustnessExtensionRec { + __DRIextension base; +}; + +/** + * DRI config options extension. + * + * This extension provides the XML string containing driver options for use by + * the loader in supporting the driconf application. + */ +#define __DRI_CONFIG_OPTIONS "DRI_ConfigOptions" +#define __DRI_CONFIG_OPTIONS_VERSION 1 + +typedef struct __DRIconfigOptionsExtensionRec { + __DRIextension base; + const char *xml; +} __DRIconfigOptionsExtension; + +/** + * This extension provides a driver vtable to a set of common driver helper + * functions (driCoreExtension, driDRI2Extension) within the driver + * implementation, as opposed to having to pass them through a global + * variable. + * + * It is not intended to be public API to the actual loader, and the vtable + * layout may change at any time. + */ +#define __DRI_DRIVER_VTABLE "DRI_DriverVtable" +#define __DRI_DRIVER_VTABLE_VERSION 1 + +typedef struct __DRIDriverVtableExtensionRec { + __DRIextension base; + const struct __DriverAPIRec *vtable; +} __DRIDriverVtableExtension; + +/** + * Query renderer driver extension + * + * This allows the window system layer (either EGL or GLX) to query aspects of + * hardware and driver support without creating a context. + */ +#define __DRI2_RENDERER_QUERY "DRI_RENDERER_QUERY" +#define __DRI2_RENDERER_QUERY_VERSION 1 + +#define __DRI2_RENDERER_VENDOR_ID 0x0000 +#define __DRI2_RENDERER_DEVICE_ID 0x0001 +#define __DRI2_RENDERER_VERSION 0x0002 +#define __DRI2_RENDERER_ACCELERATED 0x0003 +#define __DRI2_RENDERER_VIDEO_MEMORY 0x0004 +#define __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE 0x0005 +#define __DRI2_RENDERER_PREFERRED_PROFILE 0x0006 +#define __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION 0x0007 +#define __DRI2_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION 0x0008 +#define __DRI2_RENDERER_OPENGL_ES_PROFILE_VERSION 0x0009 +#define __DRI2_RENDERER_OPENGL_ES2_PROFILE_VERSION 0x000a + +typedef struct __DRI2rendererQueryExtensionRec __DRI2rendererQueryExtension; +struct __DRI2rendererQueryExtensionRec { + __DRIextension base; + + int (*queryInteger)(__DRIscreen *screen, int attribute, unsigned int *val); + int (*queryString)(__DRIscreen *screen, int attribute, const char **val); +}; + +/** + * Image Loader extension. Drivers use this to allocate color buffers + */ + +enum __DRIimageBufferMask { + __DRI_IMAGE_BUFFER_BACK = (1 << 0), + __DRI_IMAGE_BUFFER_FRONT = (1 << 1) +}; + +struct __DRIimageList { + uint32_t image_mask; + __DRIimage *back; + __DRIimage *front; +}; + +#define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER" +#define __DRI_IMAGE_LOADER_VERSION 1 + +struct __DRIimageLoaderExtensionRec { + __DRIextension base; + + /** + * Allocate color buffers. + * + * \param driDrawable + * \param width Width of allocated buffers + * \param height Height of allocated buffers + * \param format one of __DRI_IMAGE_FORMAT_* + * \param stamp Address of variable to be updated when + * getBuffers must be called again + * \param loaderPrivate The loaderPrivate for driDrawable + * \param buffer_mask Set of buffers to allocate + * \param buffers Returned buffers + */ + int (*getBuffers)(__DRIdrawable *driDrawable, + unsigned int format, + uint32_t *stamp, + void *loaderPrivate, + uint32_t buffer_mask, + struct __DRIimageList *buffers); + + /** + * Flush pending front-buffer rendering + * + * Any rendering that has been performed to the + * fake front will be flushed to the front + * + * \param driDrawable Drawable whose front-buffer is to be flushed + * \param loaderPrivate Loader's private data that was previously passed + * into __DRIdri2ExtensionRec::createNewDrawable + */ + void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate); +}; + +/** + * DRI extension. + */ + +#define __DRI_IMAGE_DRIVER "DRI_IMAGE_DRIVER" +#define __DRI_IMAGE_DRIVER_VERSION 1 + +struct __DRIimageDriverExtensionRec { + __DRIextension base; + + /* Common DRI functions, shared with DRI2 */ + __DRIcreateNewScreen2Func createNewScreen2; + __DRIcreateNewDrawableFunc createNewDrawable; + __DRIcreateContextAttribsFunc createContextAttribs; + __DRIgetAPIMaskFunc getAPIMask; +}; + +#endif diff --git a/pkgs/by-name/xo/xorg/darwin/stub.patch b/pkgs/by-name/xo/xorg/darwin/stub.patch new file mode 100644 index 0000000..0005c35 --- /dev/null +++ b/pkgs/by-name/xo/xorg/darwin/stub.patch @@ -0,0 +1,61 @@ +When the X / Xquartz server initializes, it starts the XQuartz.app and +hands-off the display FD. To start the XQuartz.app, Xquartz normally uses some +system calls to get the path of the application by app bundle id, and then +executes the Contents/MacOS/X11 script contained inside, which in turn executes +Contents/MacOS/X11.bin (the actual app). + +This patch replaces that discovery technique with a simple call to +`getenv' and a hardcoded default. In order to make Xquartz work if the +app is moved, we'll need another wrapper that sets the `XQUARTZ_X11' +environment variable to point to the `X11' script. + +diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c +index 83252e805..f1974215b 100644 +--- a/hw/xquartz/mach-startup/stub.c ++++ b/hw/xquartz/mach-startup/stub.c +@@ -52,7 +52,6 @@ + + #include "launchd_fd.h" + +-static CFURLRef x11appURL; + static FSRef x11_appRef; + static pid_t x11app_pid = 0; + aslclient aslc; +@@ -60,29 +59,21 @@ aslclient aslc; + static void + set_x11_path(void) + { +- OSStatus osstatus = LSFindApplicationForInfo(kLSUnknownCreator, CFSTR(kX11AppBundleId), +- nil, &x11_appRef, &x11appURL); ++ unsigned char *xquartzApp = getenv("XQUARTZ_APP"); ++ if (!xquartzApp) { ++ xquartzApp = "@XQUARTZ_APP@"; ++ } ++ ++ OSStatus osstatus = FSPathMakeRef(xquartzApp, &x11_appRef, NULL); + + switch (osstatus) { + case noErr: +- if (x11appURL == NULL) { +- asl_log(aslc, NULL, ASL_LEVEL_ERR, +- "Xquartz: Invalid response from LSFindApplicationForInfo(%s)", +- kX11AppBundleId); +- exit(1); +- } + break; + +- case kLSApplicationNotFoundErr: +- asl_log(aslc, NULL, ASL_LEVEL_ERR, +- "Xquartz: Unable to find application for %s", +- kX11AppBundleId); +- exit(10); +- + default: + asl_log(aslc, NULL, ASL_LEVEL_ERR, +- "Xquartz: Unable to find application for %s, error code = %d", +- kX11AppBundleId, (int)osstatus); ++ "Xquartz: Unable to find FSRef for %s, error code = %d", ++ xquartzApp, (int)osstatus); + exit(11); + } + } diff --git a/pkgs/by-name/xo/xorg/default.nix b/pkgs/by-name/xo/xorg/default.nix new file mode 100644 index 0000000..a76a05f --- /dev/null +++ b/pkgs/by-name/xo/xorg/default.nix @@ -0,0 +1,4498 @@ +# THIS IS A GENERATED FILE. DO NOT EDIT! +{ lib, pixman }: + +self: with self; { + + inherit pixman; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + appres = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "appres"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/appres-1.0.6.tar.xz"; + sha256 = "02sr4f1bm3y1w24gsvjfzvbpac1kgkq27v1s68q87bd1l3i5f8lb"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + bdftopcf = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "bdftopcf"; + version = "1.1.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/bdftopcf-1.1.1.tar.xz"; + sha256 = "026rzs92h9jsc7r0kvvyvwhm22q0805gp38rs14x6ghg7kam7j8i"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + bitmap = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, xbitmaps, libXmu, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "bitmap"; + version = "1.1.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/bitmap-1.1.1.tar.xz"; + sha256 = "1ri66kxa9m6s3xw25mz85k34qhjyksa4kbs4jfrri0g47yv2xm33"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw xbitmaps libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + editres = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXmu, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "editres"; + version = "1.0.8"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/editres-1.0.8.tar.xz"; + sha256 = "1ydn32x9qh2zkn90w6nfv33gcq75z67w93bakkykadl8n7zmvkw3"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + encodings = callPackage ({ stdenv, pkg-config, fetchurl, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "encodings"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/encodings-1.0.7.tar.xz"; + sha256 = "193hxaygxy2msmf8cyps8jdi0kxga84hj47qv7diqlhn7gsajf9s"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontadobe100dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-adobe-100dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-adobe-100dpi-1.0.4.tar.xz"; + sha256 = "1kwwbaiqnfm3pcysy9gw0g9xhpgmhjcd6clp7zajhqq5br2gyymn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontadobe75dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-adobe-75dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-adobe-75dpi-1.0.4.tar.xz"; + sha256 = "04drk4wi176524lxjwfrnkr3dwz1hysabqfajpj6klfypqnsd08j"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontadobeutopia100dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-adobe-utopia-100dpi"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-adobe-utopia-100dpi-1.0.5.tar.xz"; + sha256 = "0jq27gs5xpwkghggply5pr215lmamrnpr6x5iia76schg8lyr17v"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontadobeutopia75dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-adobe-utopia-75dpi"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-adobe-utopia-75dpi-1.0.5.tar.xz"; + sha256 = "0q3pg4imdbwwiq2g8a1rypjrgmb33n0r5j9qqnh4ywnh69cj89m7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontadobeutopiatype1 = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-adobe-utopia-type1"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-adobe-utopia-type1-1.0.5.tar.xz"; + sha256 = "15snyyy3rk75fikz1hs80nybxai1aynybl0gw32hffv98yy81cjc"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontalias = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-alias"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-alias-1.0.5.tar.xz"; + sha256 = "0vkb5mybc0fjfq29lgf5w1b536bwifzkyj8ad9iy7q3kpcby52cz"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontarabicmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-arabic-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-arabic-misc-1.0.4.tar.xz"; + sha256 = "0rrlcqbyx9y7hnhbkjir8rs6jkfqyalj1zvhr8niv2n7a8dydzs6"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbh100dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-100dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-100dpi-1.0.4.tar.xz"; + sha256 = "07mb9781c9yxzp3ifw317v4fbnmg9qyqv0244zfspylihkz5x3zx"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbh75dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-75dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-75dpi-1.0.4.tar.xz"; + sha256 = "1nkwkqdl946xc4xknhi1pnxdww6rxrv013c7nk5x6ganfg0dh9k0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbhlucidatypewriter100dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-lucidatypewriter-100dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-lucidatypewriter-100dpi-1.0.4.tar.xz"; + sha256 = "1wp87pijbydkpcmawsyas7vwhad2xg1mkkwigga2jjh9lknhkv3n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbhlucidatypewriter75dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-lucidatypewriter-75dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-lucidatypewriter-75dpi-1.0.4.tar.xz"; + sha256 = "1xg86mb9qigf5v0wx0q2shn8qaabsapamj627xllzw31mhwjqkl6"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbhttf = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-ttf"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-ttf-1.0.4.tar.xz"; + sha256 = "0misxkpjc2bir20m01z355sfk3lbpjnshphjzl32p364006zk9c5"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbhtype1 = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bh-type1"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bh-type1-1.0.4.tar.xz"; + sha256 = "19kjdm0cx766yj9vwkyv7gyg1q4bjag5g500s7nnppmb0vnc7phr"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbitstream100dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bitstream-100dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bitstream-100dpi-1.0.4.tar.xz"; + sha256 = "19y1j1v65890x8yn6a47jqljfax3ihfrd25xbzgypxz4xy1cc71d"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbitstream75dpi = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bitstream-75dpi"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bitstream-75dpi-1.0.4.tar.xz"; + sha256 = "09pq7dvyyxj6kvps1dm3qr15pjwh9iq9118fryqc5a94fkc39sxa"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbitstreamspeedo = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bitstream-speedo"; + version = "1.0.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bitstream-speedo-1.0.2.tar.gz"; + sha256 = "0wmy58cd3k7w2j4v20icnfs8z3b61qj3vqdx958z18w00h9mzsmf"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontbitstreamtype1 = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-bitstream-type1"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-bitstream-type1-1.0.4.tar.xz"; + sha256 = "0a669193ivi2lxk3v692kq1pqavaswlpi9hbi8ib8bfp9j5j6byy"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontcronyxcyrillic = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-cronyx-cyrillic"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-cronyx-cyrillic-1.0.4.tar.xz"; + sha256 = "12dpsvif85z1m6jvq9g91lmzj0rll5rh3871mbvdpzyb1p7821yw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontcursormisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-cursor-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-cursor-misc-1.0.4.tar.xz"; + sha256 = "10prshcmmm5ccczyq7yaadz92k23ls9rjl10hjh8rjqka1cwkn95"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontdaewoomisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-daewoo-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-daewoo-misc-1.0.4.tar.xz"; + sha256 = "0cagg963v94paq1l9l7g5kyv7df8q31b4zcbhv5rh07kr0yqng7n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontdecmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-dec-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-dec-misc-1.0.4.tar.xz"; + sha256 = "1xqs2qg21h5xg519810hw4bvykjdpf0xgk0xwp0bxy4g3lh6inc2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontibmtype1 = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-ibm-type1"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-ibm-type1-1.0.4.tar.xz"; + sha256 = "0zyfc0mxkzlrbpdn16rj25abf2hcqb592zkks550rm26paamwff4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontisasmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-isas-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-isas-misc-1.0.4.tar.xz"; + sha256 = "1z1qqi64hbp297f6ryiswa4ikfn7mcwnb8nadyglni6swsxrbra7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontjismisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-jis-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-jis-misc-1.0.4.tar.xz"; + sha256 = "1l7spyq93rhydsdnsh46alcfbn2irz664vd209lamxviqkvfzlbq"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmicromisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-micro-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-micro-misc-1.0.4.tar.xz"; + sha256 = "0hzryqyml0bzzw91vqdmzdlb7dm18jmyz0mxy6plks3sppbbkq1f"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmisccyrillic = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-misc-cyrillic"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-misc-cyrillic-1.0.4.tar.xz"; + sha256 = "14z9x174fidjn65clkd2y1l6pxspmvphizap9a8h2h06adzil0kn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmiscethiopic = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-misc-ethiopic"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-misc-ethiopic-1.0.5.tar.xz"; + sha256 = "04mnd620s9wkdid9wnf181yh5vf0n7l096nc3z4zdvm1w7kafja7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmiscmeltho = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-misc-meltho"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-misc-meltho-1.0.4.tar.xz"; + sha256 = "06ajsqjd20zsk9a44bl5i1mv1r9snil6l2947hk8z2bqf30mxgk3"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmiscmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-misc-misc"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-misc-misc-1.1.3.tar.xz"; + sha256 = "1vcgc6lbc53fqaz8alhxcb6f231hhvj9hn2nkzg1mclbymhy7avr"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontmuttmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-mutt-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-mutt-misc-1.0.4.tar.xz"; + sha256 = "095vd33kqd157j6xi4sjxwdsjpwpgqliifa8nkybq8rcw7s5j8xi"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontschumachermisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-schumacher-misc"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-schumacher-misc-1.1.3.tar.xz"; + sha256 = "0w40lr214n39al449fnm4k1bpyj3fjrhz2yxqd6a6m8yvc69z14b"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf fontutil mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontscreencyrillic = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-screen-cyrillic"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-screen-cyrillic-1.0.5.tar.xz"; + sha256 = "1h75zn1rp7bdv6av4cnrajpaq6fkd7dx1lc7aijpw32qrnw8nxcg"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontsonymisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-sony-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-sony-misc-1.0.4.tar.xz"; + sha256 = "0swlhjmmagrfkip4i9yq7cr56hains1j41mjs05nxc6c7y19zc76"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontsunmisc = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-sun-misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-sun-misc-1.0.4.tar.xz"; + sha256 = "17yvhk1hlajm3q57r09q8830zz7cnckrg8hgzajgyyljdl8xv16x"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fonttosfnt = callPackage ({ stdenv, pkg-config, fetchurl, libfontenc, freetype, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "fonttosfnt"; + version = "1.2.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/fonttosfnt-1.2.3.tar.xz"; + sha256 = "1bv1glfz4jqvkwx8hmv2vqilvxxl6jww3rvbzv6zbl6b83r96yma"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libfontenc freetype xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontutil = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-util"; + version = "1.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-util-1.4.1.tar.xz"; + sha256 = "15fcd3rzlgm51fwgfapg6vzyd1kkd28rj149xq7iajqr7h9697sw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "fontutil" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontwinitzkicyrillic = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, bdftopcf, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-winitzki-cyrillic"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-winitzki-cyrillic-1.0.4.tar.xz"; + sha256 = "1a4pz8f7hz6nn9xirz2k1j81ykl3lwrpi1ydmzipciy15l984v9v"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config bdftopcf mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + fontxfree86type1 = callPackage ({ stdenv, pkg-config, fetchurl, fontutil, mkfontscale, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "font-xfree86-type1"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/font/font-xfree86-type1-1.0.5.tar.xz"; + sha256 = "0ds8xbgxy9h0bqn2p38vylfzn8cqkp7n51kwmw1c18ayi9w2qg59"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config mkfontscale ]; + buildInputs = [ fontutil ]; + configureFlags = [ "--with-fontrootdir=$(out)/lib/X11/fonts" ]; + postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`$PKG_CONFIG' ''; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + gccmakedep = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "gccmakedep"; + version = "1.0.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/gccmakedep-1.0.3.tar.bz2"; + sha256 = "1r1fpy5ni8chbgx7j5sz0008fpb6vbazpy1nifgdhgijyzqxqxdj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + iceauth = callPackage ({ stdenv, pkg-config, fetchurl, libICE, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "iceauth"; + version = "1.0.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/iceauth-1.0.9.tar.xz"; + sha256 = "01cc816fvdkkfcnqnyvgcshcip2jzjivwa8hzdvsz0snak5xzf9c"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libICE xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + ico = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "ico"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/ico-1.0.6.tar.xz"; + sha256 = "01a4kykayckxzi4jzggaz3wh9qjcr6f4iykhvq7jhlz767a6kwrq"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + imake = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "imake"; + version = "1.0.10"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/imake-1.0.10.tar.xz"; + sha256 = "1xgcsamfij22ggc4p8anvvihwyf4adg6gjdd6v7m9cypm37cppkm"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libAppleWM = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libAppleWM"; + version = "1.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libAppleWM-1.4.1.tar.bz2"; + sha256 = "0r8x28n45q89x91mz8mv0zkkcxi8wazkac886fyvflhiv2y8ap2y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "applewm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libFS = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xtrans, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libFS"; + version = "1.0.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libFS-1.0.9.tar.xz"; + sha256 = "12i0zh1v5zlba617nam8sjhfqi68qqnl7z5hsz3wqhijid1pjwsr"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xtrans ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "libfs" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libICE = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xtrans, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libICE"; + version = "1.1.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libICE-1.1.1.tar.xz"; + sha256 = "0lg4sddalwmmzsnxv3fgdm2hzqp66j8b3syc0ancfhi9yzx7mrq3"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xtrans ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "ice" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libSM = callPackage ({ stdenv, pkg-config, fetchurl, libICE, libuuid, xorgproto, xtrans, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libSM"; + version = "1.2.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libSM-1.2.4.tar.xz"; + sha256 = "113vx53k6pyxf84v5kqb7qhcldx1fi78lym77lcb2xhj9lgfbjzx"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libICE libuuid xorgproto xtrans ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "sm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libWindowsWM = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libWindowsWM"; + version = "1.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libWindowsWM-1.0.1.tar.bz2"; + sha256 = "1p0flwb67xawyv6yhri9w17m1i4lji5qnd0gq8v1vsfb8zw7rw15"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "windowswm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libX11 = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpthreadstubs, libxcb, xtrans, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libX11"; + version = "1.8.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libX11-1.8.7.tar.xz"; + sha256 = "1vlrgrdibp4lr84wgmsdy1ihzaai8bvvqc68npi1m19wir36gwh5"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpthreadstubs libxcb xtrans ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "x11" "x11-xcb" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXScrnSaver = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXScrnSaver"; + version = "1.2.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXScrnSaver-1.2.4.tar.xz"; + sha256 = "1zi0r6mqa1g0hhsp02cdsjcxmsbipiv0v65c1h4pl84fydcjikbm"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xscrnsaver" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXTrap = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXTrap"; + version = "1.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXTrap-1.0.1.tar.bz2"; + sha256 = "0bi5wxj6avim61yidh9fd3j4n8czxias5m8vss9vhxjnk1aksdwg"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xtrap" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXau = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXau"; + version = "1.0.11"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXau-1.0.11.tar.xz"; + sha256 = "1sxv56rql3vsb14za0hgr07mipgvvcw48910srmky32pyn135ypk"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xau" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXaw = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, libXmu, libXpm, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXaw"; + version = "1.0.15"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXaw-1.0.15.tar.xz"; + sha256 = "0jkm2ards3nj08y7185k9jvjhhx78r46abrl3g3jrc4zvq7zfddb"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto libXmu libXpm libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xaw6" "xaw7" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXcomposite = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXfixes, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXcomposite"; + version = "0.4.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXcomposite-0.4.6.tar.xz"; + sha256 = "11rcvk380l5540gfqy9p8mbzw3l1p5g8l214p870f28smvqbqh7y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXfixes ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcomposite" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXcursor = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXfixes, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXcursor"; + version = "1.2.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXcursor-1.2.2.tar.xz"; + sha256 = "1vl87819mnhlbnccchysv9nmax4abil5x3cr61x52vn55jyp3l2k"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXfixes libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcursor" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXdamage = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXfixes, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXdamage"; + version = "1.1.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXdamage-1.1.6.tar.xz"; + sha256 = "04axzdx75w0wcb4na7lfpa0ai0fddw60dmg7cigs7z32a8gkqwsj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXfixes ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xdamage" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXdmcp = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXdmcp"; + version = "1.1.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXdmcp-1.1.4.tar.xz"; + sha256 = "005dsry6nfqrv32i7gbqn7mxnb2m3pc8fz9lxj2b9w7q2z1mrkid"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xdmcp" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXext = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXext"; + version = "1.3.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXext-1.3.6.tar.xz"; + sha256 = "0lwpx0b7lid47pff6dagp5h63bi0b3gsy05lqpyhbr4l76i9zdgd"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xext" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXfixes = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXfixes"; + version = "6.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXfixes-6.0.1.tar.xz"; + sha256 = "0n1dq2mi60i0c06i7j6lq64cq335ir2l89yj0amj3529s8ygk5dn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xfixes" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXfont = callPackage ({ stdenv, pkg-config, fetchurl, libfontenc, xorgproto, freetype, xtrans, zlib, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXfont"; + version = "1.5.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXfont-1.5.4.tar.bz2"; + sha256 = "0hiji1bvpl78aj3a3141hkk353aich71wv8l5l2z51scfy878zqs"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libfontenc xorgproto freetype xtrans zlib ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xfont" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXfont2 = callPackage ({ stdenv, pkg-config, fetchurl, libfontenc, xorgproto, freetype, xtrans, zlib, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXfont2"; + version = "2.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXfont2-2.0.6.tar.xz"; + sha256 = "1x5f4w6f94dq9hfcd11xzzjqbz30yn2hdrnmv1b3zyxhgq0j1jkl"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libfontenc xorgproto freetype xtrans zlib ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xfont2" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXft = callPackage ({ stdenv, pkg-config, fetchurl, fontconfig, freetype, libX11, xorgproto, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXft"; + version = "2.3.8"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXft-2.3.8.tar.xz"; + sha256 = "0jfxqsqhjl2b2ll6b7x21mj02hxp5znkhjvbxw5a9h6lq95kr32y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ fontconfig freetype libX11 xorgproto libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xft" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXi = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXfixes, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXi"; + version = "1.8.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXi-1.8.1.tar.xz"; + sha256 = "19snjrsdib2y2iq8c1zbrp78qy1b6sdmyvif422gg27j2klc1gw9"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXfixes ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xi" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXinerama = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXinerama"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXinerama-1.1.5.tar.xz"; + sha256 = "0p08q8q1wg0sixhizl2l1i935bk6x3ckj3bdd6qqr0n1zkqd352h"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xinerama" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXmu = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXmu"; + version = "1.1.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXmu-1.1.4.tar.xz"; + sha256 = "0i42fng5gizablqziib25ipcwm5830jprl955ibq54rykjmy6391"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xmu" "xmuu" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXp = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXau, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXp"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXp-1.0.4.tar.xz"; + sha256 = "197iklxwyd4naryc6mzv0g5qi1dy1apxk9w9k3yshd1ax2wf668z"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXau libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xp" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXpm = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, libXt, gettext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXpm"; + version = "3.5.17"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXpm-3.5.17.tar.xz"; + sha256 = "0hvf49qy55gwldpwpw7ihcmn5i2iinpjh2rbha63hzcy060izcv4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config gettext ]; + buildInputs = [ libX11 libXext xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xpm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXpresent = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXfixes, libXrandr, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXpresent"; + version = "1.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXpresent-1.0.1.tar.xz"; + sha256 = "06r34v7z3jb0x7l5ghlc1g82gjjp5ilq5p6j11galv86bagdyr5r"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXfixes libXrandr ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xpresent" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXrandr = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXrandr"; + version = "1.5.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXrandr-1.5.4.tar.xz"; + sha256 = "1lxlqd9ffjr1myfpyk91594n1h07ck6121m6ba8qajjz6xjv1m8s"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xrandr" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXrender = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXrender"; + version = "0.9.11"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXrender-0.9.11.tar.xz"; + sha256 = "096whakny5h16nlwz80z0l2nxigpsarl35mm5xqgzlc37ad7alxw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xrender" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXres = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXres"; + version = "1.2.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXres-1.2.2.tar.xz"; + sha256 = "0pvlzahqd8fcyq10wi7ipbxvgrg93hn0vqsymhw7b6sb93rlcx4s"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xres" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXt = callPackage ({ stdenv, pkg-config, fetchurl, libICE, xorgproto, libSM, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXt"; + version = "1.3.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXt-1.3.0.tar.xz"; + sha256 = "14dz66rp66ar2a5q0fbsnlcqkbd34801pzdxj3f0hzc2vcy0p0jj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libICE xorgproto libSM libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xt" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXtst = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXi, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXtst"; + version = "1.2.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXtst-1.2.4.tar.xz"; + sha256 = "1j1kr90b7vmpqniqd0pd786kn5924q799c5m2kpgzd2lj85z7xc4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXi ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xtst" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXv = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXv"; + version = "1.0.12"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXv-1.0.12.tar.xz"; + sha256 = "0j1qqrhbhdi3kqz0am5i1lhs31ql9pbc14z41w0a5xw9yq4zmxxa"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xv" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXvMC = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXv, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXvMC"; + version = "1.0.14"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXvMC-1.0.14.tar.xz"; + sha256 = "1nayf8qck0b1xb88dirdbvj7clr18wq1dxs73zwbpzdsnsv9xgp4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXv ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xvmc" "xvmc-wrapper" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXxf86dga = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXxf86dga"; + version = "1.1.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXxf86dga-1.1.6.tar.xz"; + sha256 = "03wqsxbgyrdbrhw8fk3fxc9nk8jnwz5537ym2yif73w0g5sl4i5y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xxf86dga" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXxf86misc = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXxf86misc"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXxf86misc-1.0.4.tar.bz2"; + sha256 = "107k593sx27vjz3v7gbb223add9i7w0bjc90gbb3jqpin3i07758"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xxf86misc" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libXxf86vm = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libXxf86vm"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libXxf86vm-1.1.5.tar.xz"; + sha256 = "1rw8z01vgfc4wvf0q75sgnj6n04dkrw1w7z455qydrz0nd4fyzr4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xxf86vm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libdmx = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libdmx"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libdmx-1.1.5.tar.xz"; + sha256 = "0kzprd1ak3m3042m5hra50nsagswciis9p21ckilyaqbidmf591m"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "dmx" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libfontenc = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, zlib, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libfontenc"; + version = "1.1.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libfontenc-1.1.7.tar.xz"; + sha256 = "1hpy7kvppzy36fl8gbnzbv0cvglpdqk9jpdgvcfma1pfza8nkly0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto zlib ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "fontenc" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libpciaccess = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libpciaccess"; + version = "0.18"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libpciaccess-0.18.tar.xz"; + sha256 = "1ab2qbksf15jrpzd6x9ncri64d2bnhlw7aajdws58lj9gljv0qal"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "pciaccess" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libpthreadstubs = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libpthread-stubs"; + version = "0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/libpthread-stubs-0.5.tar.xz"; + sha256 = "1g224hyy694jch54357zc895z46r90xs193hg4m7rfnfxinmdnjr"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "pthread-stubs" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libxcb = callPackage ({ stdenv, pkg-config, fetchurl, libxslt, libpthreadstubs, libXau, xcbproto, libXdmcp, python3, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libxcb"; + version = "1.16"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libxcb-1.16.tar.xz"; + sha256 = "0w8xf6ff6axvla734lfb2291hrjrqqhn6mqabvdrdwgvl1m5cj23"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config python3 ]; + buildInputs = [ libxslt libpthreadstubs libXau xcbproto libXdmcp ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb" "xcb-composite" "xcb-damage" "xcb-dbe" "xcb-dpms" "xcb-dri2" "xcb-dri3" "xcb-ge" "xcb-glx" "xcb-present" "xcb-randr" "xcb-record" "xcb-render" "xcb-res" "xcb-screensaver" "xcb-shape" "xcb-shm" "xcb-sync" "xcb-xevie" "xcb-xf86dri" "xcb-xfixes" "xcb-xinerama" "xcb-xinput" "xcb-xkb" "xcb-xprint" "xcb-xselinux" "xcb-xtest" "xcb-xv" "xcb-xvmc" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libxcvt = callPackage ({ stdenv, pkg-config, fetchurl, meson, ninja, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libxcvt"; + version = "0.1.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libxcvt-0.1.2.tar.xz"; + sha256 = "0f6vf47lay9y288n8yg9ckjgz5ypn2hnp03ipp7javkr8h2njq85"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config meson ninja ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libxkbfile = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libxkbfile"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libxkbfile-1.1.3.tar.xz"; + sha256 = "1v2bhw1q1cj3wjfs0igq393iz10whcavbyxlm3k9xfvsk7m3xdm9"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xkbfile" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + libxshmfence = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "libxshmfence"; + version = "1.3.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/libxshmfence-1.3.2.tar.xz"; + sha256 = "0vv0c7rjf6nd1afbal4c4ralallarak1v3ss3gcjdca0pibz43c7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xshmfence" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + listres = callPackage ({ stdenv, pkg-config, fetchurl, libXaw, libXmu, xorgproto, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "listres"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/listres-1.0.5.tar.xz"; + sha256 = "17fwfjh0xrvg7jj4h32pa8ns4hq4r11z61kh2xsqvsyjwyxh0anf"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libXaw libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + lndir = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "lndir"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/lndir-1.0.4.tar.xz"; + sha256 = "11syg5hx3f7m1d2p7zw717lryk819h6wk8h4vmapfdxvsflkfd1y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + luit = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "luit"; + version = "20230201"; + builder = ./builder.sh; + src = fetchurl { + url = "https://invisible-mirror.net/archives/luit/luit-20230201.tgz"; + sha256 = "0vy5fqp26pnrdn0hmgnmar6m2y06syrz188jqh03vqkyphfqsapf"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + makedepend = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "makedepend"; + version = "1.0.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/makedepend-1.0.9.tar.xz"; + sha256 = "1m1dg32z22fw9shg0wsxw7dvdcnfm16gq9qxpkfxixpzb6vdxl4j"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + mkfontscale = callPackage ({ stdenv, pkg-config, fetchurl, libfontenc, freetype, xorgproto, zlib, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "mkfontscale"; + version = "1.2.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/mkfontscale-1.2.3.tar.xz"; + sha256 = "0pp7dyfrrkrqxslk9q8660k0h4swaqlixsnnph2fxb7i8k1ws899"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libfontenc freetype xorgproto zlib ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + oclock = callPackage ({ stdenv, pkg-config, fetchurl, libxkbfile, libX11, libXext, libXmu, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "oclock"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/oclock-1.0.5.tar.xz"; + sha256 = "0p4nqfrhy1srqqzbamp7afa54clbydbhprd1nxbd12g8anb9f2cg"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libxkbfile libX11 libXext libXmu libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + sessreg = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "sessreg"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/sessreg-1.1.3.tar.xz"; + sha256 = "1hmc9wsfgl2wmy0kccwa4brxbv02w5wiz5hrz72dsz87x1fwsah2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + setxkbmap = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxkbfile, libXrandr, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "setxkbmap"; + version = "1.3.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/setxkbmap-1.3.4.tar.xz"; + sha256 = "1pps0x66512y3f7v6xgnb6gjbllsgi4q5zxmjcdiv60fsia8b3dy"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxkbfile libXrandr ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + smproxy = callPackage ({ stdenv, pkg-config, fetchurl, libICE, libSM, libXmu, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "smproxy"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/smproxy-1.0.7.tar.xz"; + sha256 = "01gkz4n2pfxiklzzx3ghnm9shx3626jcriwvrs3pvawxrhvr5aaa"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libICE libSM libXmu libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + transset = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "transset"; + version = "1.0.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/transset-1.0.3.tar.xz"; + sha256 = "1zp6ldxb3h2zsr4nmkb8aj8ia8v3qvjj3w85by5xh3fxvlq8zqqz"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + twm = callPackage ({ stdenv, pkg-config, fetchurl, libICE, libSM, libX11, libXext, libXmu, xorgproto, libXrandr, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "twm"; + version = "1.0.12"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/twm-1.0.12.tar.xz"; + sha256 = "1r5gfv1gvcjn39v7n6znpnvifwhlw2zf8gfrxq8vph84vva03wma"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libICE libSM libX11 libXext libXmu xorgproto libXrandr libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + utilmacros = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "util-macros"; + version = "1.20.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/util-macros-1.20.0.tar.xz"; + sha256 = "1nrh8kmbix5pspva6y7h14fj97xdvxqc6fr3zysfswg9vdib51hb"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-macros" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + viewres = callPackage ({ stdenv, pkg-config, fetchurl, libXaw, libXmu, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "viewres"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/viewres-1.0.7.tar.xz"; + sha256 = "0a66mz27gcsxd1qq1ij0w8dv4wjvszgbf5ygw5dga40sbc464nmi"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libXaw libXmu libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + x11perf = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, libXft, libXmu, xorgproto, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "x11perf"; + version = "1.6.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/x11perf-1.6.1.tar.bz2"; + sha256 = "0d3wh6z6znwhfdiv0zaggfj0xgish98xa10yy76b9517zj7hnzhw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext libXft libXmu xorgproto libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xauth = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXau, libXext, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xauth"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xauth-1.1.3.tar.xz"; + sha256 = "0cwxzq7lv932rcfad3baanr541qcjjdhyrhxy0bzjcp3pac581z7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXau libXext libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xbacklight = callPackage ({ stdenv, pkg-config, fetchurl, libxcb, xcbutil, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xbacklight"; + version = "1.2.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xbacklight-1.2.3.tar.bz2"; + sha256 = "1plssg0s3pbslg6rfzxp9sx8ryvn8l32zyvc8zp9zsbsfwjg69rs"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libxcb xcbutil ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xbitmaps = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xbitmaps"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/data/xbitmaps-1.1.3.tar.xz"; + sha256 = "0yhgrllia3lbqx9b21w31w4sppx1a9ggrk62hrys2ckqi1aasv5d"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xbitmaps" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcalc = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcalc"; + version = "1.1.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xcalc-1.1.2.tar.xz"; + sha256 = "1m0wzhjvc88kmx12ykdml5rqlz9h2iki9mkfdngji53y8nhxyy45"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbproto = callPackage ({ stdenv, pkg-config, fetchurl, python3, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-proto"; + version = "1.16.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/proto/xcb-proto-1.16.0.tar.xz"; + sha256 = "06aij66rs8g378wg8swd7b3g73wqrrbbwl8shhnsi29amm41hnm7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config python3 ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-proto" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutil = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util"; + version = "0.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-0.4.1.tar.xz"; + sha256 = "04p54r0zjc44fpw1hdy4rhygv37sx2vr2lllxjihykz5v2xkpgjs"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-atom" "xcb-aux" "xcb-event" "xcb-util" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilcursor = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xcbutilimage, xcbutilrenderutil, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-cursor"; + version = "0.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/xcb-util-cursor-0.1.5.tar.xz"; + sha256 = "0mrwcrm6djbd5zdvqb5v4wr87bzawnaacyqwwhfghw09ssq9kbqc"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xcbutilimage xcbutilrenderutil xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-cursor" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilerrors = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xcbproto, xorgproto, m4, python3, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-errors"; + version = "1.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-errors-1.0.1.tar.xz"; + sha256 = "0mzkh3xj1n690dw8hrdhyjykd71ib0ls9n5cgf9asna2k1xwha2n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 python3 ]; + buildInputs = [ gperf libxcb xcbproto xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-errors" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilimage = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xcbutil, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-image"; + version = "0.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-image-0.4.1.tar.xz"; + sha256 = "0g8dwknrlz96k176qxh8ar84x9kpppci9b978zyp24nvvbjqxbfc"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xcbutil xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-image" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilkeysyms = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-keysyms"; + version = "0.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-keysyms-0.4.1.tar.xz"; + sha256 = "0f66snk179hmp8ppgv1zp9y7pl1vzn52znpikm1fsaj1ji90l9kw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-keysyms" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilrenderutil = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-renderutil"; + version = "0.3.10"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-renderutil-0.3.10.tar.xz"; + sha256 = "1fh4dnlwlqyccrhmmwlv082a7mxc7ss7vmzmp7xxp39dwbqd859y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-renderutil" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcbutilwm = callPackage ({ stdenv, pkg-config, fetchurl, gperf, libxcb, xorgproto, m4, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcb-util-wm"; + version = "0.4.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xcb/xcb-util-wm-0.4.2.tar.xz"; + sha256 = "02wai17mxfbvlnj4l4bjbvah97rccdivzvd7mrznhr32s0hlxhv2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config m4 ]; + buildInputs = [ gperf libxcb xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xcb-ewmh" "xcb-icccm" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xclock = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXft, libxkbfile, libXmu, xorgproto, libXrender, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xclock"; + version = "1.1.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xclock-1.1.1.tar.xz"; + sha256 = "0b3l1zwz2b1cn46f8pd480b835j9anadf929vqpll107iyzylz6z"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXft libxkbfile libXmu xorgproto libXrender libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcmsdb = callPackage ({ stdenv, pkg-config, fetchurl, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcmsdb"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xcmsdb-1.0.6.tar.xz"; + sha256 = "0magrza0i5qwpf0zlpqjychp3bzxgdw3p5v616xl4nbxag2fwxrw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcompmgr = callPackage ({ stdenv, pkg-config, fetchurl, libXcomposite, libXdamage, libXext, libXfixes, xorgproto, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcompmgr"; + version = "1.1.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xcompmgr-1.1.9.tar.xz"; + sha256 = "1w564walyqi3bqnnl8l2d949v64smipdw2q8lnrixl3jhrlvcxa8"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libXcomposite libXdamage libXext libXfixes xorgproto libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xconsole = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXmu, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xconsole"; + version = "1.0.8"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xconsole-1.0.8.tar.xz"; + sha256 = "195vhqjrzjf4kkzmy0kx50n1bv2kj9fg7mi18mm2w3p4d3q6ljkv"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcursorgen = callPackage ({ stdenv, pkg-config, fetchurl, libpng, libX11, libXcursor, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcursorgen"; + version = "1.0.8"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xcursorgen-1.0.8.tar.xz"; + sha256 = "16yc82k4vp7icmf9247z4v38r65pdf032mrpzxj5wa2fggi3rcrj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libpng libX11 libXcursor xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xcursorthemes = callPackage ({ stdenv, pkg-config, fetchurl, libXcursor, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xcursor-themes"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/data/xcursor-themes-1.0.7.tar.xz"; + sha256 = "1j3qfga5llp8g702n7mivvdvfjk7agsgnbglbfh99n13i3sfiflm"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libXcursor ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xdm = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXau, libXaw, libXdmcp, libXext, libXft, libXinerama, libXmu, libXpm, xorgproto, libXrender, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xdm"; + version = "1.1.14"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xdm-1.1.14.tar.xz"; + sha256 = "0prx5h0xmv08yvm0axzh74a90cyc1s1dcv98jpjwjzkr6rbg56ry"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXau libXaw libXdmcp libXext libXft libXinerama libXmu libXpm xorgproto libXrender libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xdpyinfo = callPackage ({ stdenv, pkg-config, fetchurl, libdmx, libX11, libxcb, libXcomposite, libXext, libXi, libXinerama, xorgproto, libXrender, libXtst, libXxf86dga, libXxf86misc, libXxf86vm, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xdpyinfo"; + version = "1.3.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xdpyinfo-1.3.4.tar.xz"; + sha256 = "0aw2yhx4ys22231yihkzhnw9jsyzksl4yyf3sx0689npvf0sbbd8"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libdmx libX11 libxcb libXcomposite libXext libXi libXinerama xorgproto libXrender libXtst libXxf86dga libXxf86misc libXxf86vm ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xdriinfo = callPackage ({ stdenv, pkg-config, fetchurl, libGL, xorgproto, libX11, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xdriinfo"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xdriinfo-1.0.7.tar.xz"; + sha256 = "0d7p9fj3znq0av9pjgi2kphqaz5w7b9hxlz63zbxs69bknp8p0yx"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libGL xorgproto libX11 ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xev = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, libXrandr, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xev"; + version = "1.2.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xev-1.2.5.tar.xz"; + sha256 = "1hbfwcnbyz4w13fbhnghl0vdhf6w9f9pb7jgjwrhykkii51ilin9"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto libXrandr ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xeyes = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxcb, libXext, libXi, libXmu, xorgproto, libXrender, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xeyes"; + version = "1.3.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xeyes-1.3.0.tar.xz"; + sha256 = "08rhfp5xlmdbyxkvxhgjxdn6vwzrbrjyd7jkk8b7wi1kpw0ccl09"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxcb libXext libXi libXmu xorgproto libXrender libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputevdev = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libevdev, udev, mtdev, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-evdev"; + version = "2.10.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-evdev-2.10.6.tar.bz2"; + sha256 = "1h1y0fwnawlp4yc5llr1l7hwfcxxpln2fxhy6arcf6w6h4z0f9l7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libevdev udev mtdev xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-evdev" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputjoystick = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-joystick"; + version = "1.6.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-joystick-1.6.4.tar.xz"; + sha256 = "1lnc6cvrg81chb2hj3jphgx7crr4ab8wn60mn8f9nsdwza2w8plh"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-joystick" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputkeyboard = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-keyboard"; + version = "2.0.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-keyboard-2.0.0.tar.xz"; + sha256 = "1fgya6a0pzsb8ynp2qhx3bqg6nfc4y2sw9wmk7zd8pqplbqzsrij"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputlibinput = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libinput, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-libinput"; + version = "1.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-libinput-1.4.0.tar.xz"; + sha256 = "1673ydfrvfqd4inz3vx1qyxa0mhr0f4bi0r7mrcmpisxi76i8g9s"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libinput xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-libinput" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputmouse = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-mouse"; + version = "1.9.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-mouse-1.9.5.tar.xz"; + sha256 = "0s4rzp7aqpbqm4474hg4bz7i7vg3ir93ck2q12if4lj3nklqmpjg"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-mouse" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputsynaptics = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libevdev, libX11, libXi, xorgserver, libXtst, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-synaptics"; + version = "1.9.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-synaptics-1.9.2.tar.xz"; + sha256 = "0f1cjs9haxhjybfh2lh579s15i2q0q19whynpda3giizj6mlmymq"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libevdev libX11 libXi xorgserver libXtst ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-synaptics" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputvmmouse = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, udev, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-vmmouse"; + version = "13.2.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-vmmouse-13.2.0.tar.xz"; + sha256 = "1f1rlgp1rpsan8k4ax3pzhl1hgmfn135r31m80pjxw5q19c7gw2n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto udev xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86inputvoid = callPackage ({ stdenv, pkg-config, fetchurl, xorgserver, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-input-void"; + version = "1.4.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-input-void-1.4.2.tar.xz"; + sha256 = "11bqy2djgb82c1g8ylpfwp3wjw4x83afi8mqyn5fvqp03kidh4d2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgserver xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoamdgpu = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, mesa, libGL, libdrm, udev, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-amdgpu"; + version = "23.0.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-amdgpu-23.0.0.tar.xz"; + sha256 = "0qf0kjh6pww5abxmqa4c9sfa2qq1hq4p8qcgqpfd1kpkcvmg012g"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto mesa libGL libdrm udev xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoapm = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-apm"; + version = "1.3.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-apm-1.3.0.tar.bz2"; + sha256 = "0znwqfc8abkiha98an8hxsngnz96z6cd976bc4bsvz1km6wqk0c0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoark = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-ark"; + version = "0.7.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-ark-0.7.6.tar.xz"; + sha256 = "0p88blr3zgy47jc4aqivc6ypj4zq9pad1cl70wwz9xig29w9xk2s"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoast = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-ast"; + version = "1.1.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-ast-1.1.6.tar.xz"; + sha256 = "1bqdjcxi8fj48821322djdqnrla2i48wqckdf364zagrqyllyxbm"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoati = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, mesa, libGL, libdrm, udev, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-ati"; + version = "22.0.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-ati-22.0.0.tar.xz"; + sha256 = "0vdznwx78alhbb05paw2xd65hcsila2kqflwwnbpq8pnsdbbpj68"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto mesa libGL libdrm udev libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videochips = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-chips"; + version = "1.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-chips-1.4.0.tar.bz2"; + sha256 = "1gqzy7q9v824m7hqkbbmncxg082zm0d4mafgc97c4skyiwgf9wq7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videocirrus = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-cirrus"; + version = "1.6.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-cirrus-1.6.0.tar.xz"; + sha256 = "00b468w01hqjczfqz42v2vqhb14db4wazcqi1w29lgfyhc0gmwqf"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videodummy = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-dummy"; + version = "0.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-dummy-0.4.1.tar.xz"; + sha256 = "1byzsdcnlnzvkcqrzaajzc3nzm7y7ydrk9bjr4x9lx8gznkj069m"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videofbdev = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-fbdev"; + version = "0.5.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-fbdev-0.5.0.tar.bz2"; + sha256 = "16a66zr0l1lmssa07i3rzy07djxnb45c17ks8c71h8l06xgxihyw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videogeode = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-geode"; + version = "2.11.21"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-geode-2.11.21.tar.xz"; + sha256 = "07lzbyxss0m5i4j58z43zri2baawci9q1ykv1g828wqi2hzsqml2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoglide = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-glide"; + version = "1.2.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-glide-1.2.2.tar.bz2"; + sha256 = "1vaav6kx4n00q4fawgqnjmbdkppl0dir2dkrj4ad372mxrvl9c4y"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoglint = callPackage ({ stdenv, pkg-config, fetchurl, libpciaccess, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-glint"; + version = "1.2.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-glint-1.2.9.tar.bz2"; + sha256 = "1lkpspvrvrp9s539bhfdjfh4andaqyk63l6zjn8m3km95smk6a45"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libpciaccess xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoi128 = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-i128"; + version = "1.4.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-i128-1.4.1.tar.xz"; + sha256 = "0imwmkam09wpp3z3iaw9i4hysxicrrax7i3p0l2glgp3zw9var3h"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoi740 = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-i740"; + version = "1.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-i740-1.4.0.tar.bz2"; + sha256 = "0l3s1m95bdsg4gki943qipq8agswbb84dzcflpxa3vlckwhh3r26"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videointel = callPackage ({ stdenv, pkg-config, fetchurl, cairo, xorgproto, libdrm, libpng, udev, libpciaccess, libX11, xcbutil, libxcb, libXcursor, libXdamage, libXext, libXfixes, xorgserver, libXrandr, libXrender, libxshmfence, libXtst, libXvMC, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-intel"; + version = "2.99.917"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-intel-2.99.917.tar.bz2"; + sha256 = "1jb7jspmzidfixbc0gghyjmnmpqv85i7pi13l4h2hn2ml3p83dq0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ cairo xorgproto libdrm libpng udev libpciaccess libX11 xcbutil libxcb libXcursor libXdamage libXext libXfixes xorgserver libXrandr libXrender libxshmfence libXtst libXvMC ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videomga = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-mga"; + version = "2.0.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-mga-2.0.1.tar.xz"; + sha256 = "1aq3aqh2yg09gy864kkshfx5pjl5w05jdz97bx5bnrbrhdq3p8r7"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoneomagic = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-neomagic"; + version = "1.3.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-neomagic-1.3.1.tar.xz"; + sha256 = "153lzhq0vahg3875wi8hl9rf4sgizs41zmfg6hpfjw99qdzaq7xn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videonewport = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-newport"; + version = "0.2.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-newport-0.2.4.tar.bz2"; + sha256 = "1yafmp23jrfdmc094i6a4dsizapsc9v0pl65cpc8w1kvn7343k4i"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videonouveau = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, udev, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-nouveau"; + version = "3ee7cbca8f9144a3bb5be7f71ce70558f548d268"; + builder = ./builder.sh; + src = fetchurl { + url = "https://gitlab.freedesktop.org/xorg/driver/xf86-video-nouveau/-/archive/3ee7cbca8f9144a3bb5be7f71ce70558f548d268/xf86-video-nouveau-3ee7cbca8f9144a3bb5be7f71ce70558f548d268.tar.bz2"; + sha256 = "0rhs3z274jdzd82pcsl25xn8hmw6i4cxs2kwfnphpfhxbbkiq7wl"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm udev libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videonv = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-nv"; + version = "2.1.22"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-nv-2.1.22.tar.xz"; + sha256 = "126j60dgnmiahjk5mxbnaav23hv7nvxvh49vhn6qg2f3nlnr6632"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoomap = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-omap"; + version = "0.4.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-omap-0.4.5.tar.bz2"; + sha256 = "0nmbrx6913dc724y8wj2p6vqfbj5zdjfmsl037v627jj0whx9rwk"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoopenchrome = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, udev, libpciaccess, libX11, libXext, xorgserver, libXvMC, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-openchrome"; + version = "0.6.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-openchrome-0.6.0.tar.bz2"; + sha256 = "0x9gq3hw6k661k82ikd1y2kkk4dmgv310xr5q59dwn4k6z37aafs"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm udev libpciaccess libX11 libXext xorgserver libXvMC ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoqxl = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, udev, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-qxl"; + version = "0.1.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-qxl-0.1.6.tar.xz"; + sha256 = "0pwncx60r1xxk8kpp9a46ga5h7k7hjqf14726v0gra27vdc9blra"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm udev libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videor128 = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-r128"; + version = "6.12.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-r128-6.12.1.tar.xz"; + sha256 = "0hf7h54wxgs8njavp0kgadjq1787fhbd588j7pj685hz2wmkq0kx"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videorendition = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-rendition"; + version = "4.2.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-rendition-4.2.7.tar.bz2"; + sha256 = "0yzqcdfrnnyaaaa76d4hpwycpq4x2j8qvg9m4q19lj4xbicwc4cm"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videos3virge = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-s3virge"; + version = "1.11.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-s3virge-1.11.1.tar.xz"; + sha256 = "1qzfcq3rlpfdb6qxz8hrp9py1q11vyzl4iqxip1vpgfnfn83vl6f"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosavage = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-savage"; + version = "2.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-savage-2.4.0.tar.xz"; + sha256 = "1z81nqwaqqy9sc7pywkw4q9mijpvjx9w8xxr7d13k2nhzlng0v5k"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosiliconmotion = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-siliconmotion"; + version = "1.7.10"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-siliconmotion-1.7.10.tar.xz"; + sha256 = "1h4g2mqxshaxii416ldw0aqy6cxnsbnzayfin51xm2526dw9q18n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosis = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-sis"; + version = "0.12.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-sis-0.12.0.tar.gz"; + sha256 = "00j7i2r81496w27rf4nq9gc66n6nizp3fi7nnywrxs81j1j3pk4v"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosisusb = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-sisusb"; + version = "0.9.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-sisusb-0.9.7.tar.bz2"; + sha256 = "090lfs3hjz3cjd016v5dybmcsigj6ffvjdhdsqv13k90p4b08h7l"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosuncg6 = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-suncg6"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-suncg6-1.1.3.tar.xz"; + sha256 = "16c3g5m0f5y9nx2x6w9jdzbs9yr6xhq31j37dcffxbsskmfxq57w"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosunffb = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-sunffb"; + version = "1.2.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-sunffb-1.2.3.tar.xz"; + sha256 = "0pf4ddh09ww7sxpzs5gr9pxh3gdwkg3f54067cp802nkw1n8vypi"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videosunleo = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-sunleo"; + version = "1.2.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-sunleo-1.2.3.tar.xz"; + sha256 = "1px670aiqyzddl1nz3xx1lmri39irajrqw6dskirs2a64jgp3dpc"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videotdfx = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-tdfx"; + version = "1.5.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-tdfx-1.5.0.tar.bz2"; + sha256 = "0qc5wzwf1n65si9rc37bh224pzahh7gp67vfimbxs0b9yvhq0i9g"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videotga = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-tga"; + version = "1.2.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-tga-1.2.2.tar.bz2"; + sha256 = "0cb161lvdgi6qnf1sfz722qn38q7kgakcvj7b45ba3i0020828r0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videotrident = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-trident"; + version = "1.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-trident-1.4.0.tar.xz"; + sha256 = "16qqn1brz50mwcy42zi1wsw9af56qadsaaiwm9hn1p6plyf22xkz"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videov4l = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-v4l"; + version = "0.3.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-v4l-0.3.0.tar.bz2"; + sha256 = "084x4p4avy72mgm2vnnvkicw3419i6pp3wxik8zqh7gmq4xv5z75"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videovboxvideo = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-vboxvideo"; + version = "1.0.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-vboxvideo-1.0.0.tar.bz2"; + sha256 = "195z1js3i51qgxvhfw4bxb4dw3jcrrx2ynpm2y3475dypjzs7dkz"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videovesa = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-vesa"; + version = "2.6.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-vesa-2.6.0.tar.xz"; + sha256 = "1ccvaigb1f1kz8nxxjmkfn598nabd92p16rx1g35kxm8n5qjf20h"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videovmware = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, udev, libpciaccess, libX11, libXext, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-vmware"; + version = "13.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-vmware-13.4.0.tar.xz"; + sha256 = "06mq7spifsrpbwq9b8kn2cn61xq6mpkq6lvh4qi6xk2yxpjixlxf"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm udev libpciaccess libX11 libXext xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videovoodoo = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-voodoo"; + version = "1.2.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-voodoo-1.2.6.tar.xz"; + sha256 = "00pn5826aazsdipf7ny03s1lypzid31fmswl8y2hrgf07bq76ab2"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videowsfb = callPackage ({ stdenv, pkg-config, fetchurl, xorgserver, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-wsfb"; + version = "0.4.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-wsfb-0.4.0.tar.bz2"; + sha256 = "0hr8397wpd0by1hc47fqqrnaw3qdqd8aqgwgzv38w5k3l3jy6p4p"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgserver xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xf86videoxgi = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libdrm, libpciaccess, xorgserver, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xf86-video-xgi"; + version = "1.6.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/driver/xf86-video-xgi-1.6.1.tar.bz2"; + sha256 = "10xd2vah0pnpw5spn40n4p95mpmgvdkly4i1cz51imnlfsw7g8si"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libdrm libpciaccess xorgserver ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xfd = callPackage ({ stdenv, pkg-config, fetchurl, libxkbfile, fontconfig, libXaw, libXft, libXmu, xorgproto, libXrender, libXt, gettext, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xfd"; + version = "1.1.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xfd-1.1.4.tar.xz"; + sha256 = "1zbnj0z28dx2rm2h7pjwcz7z1jnl28gz0v9xn3hs2igxcvxhyiym"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config gettext wrapWithXFileSearchPathHook ]; + buildInputs = [ libxkbfile fontconfig libXaw libXft libXmu xorgproto libXrender libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xfontsel = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXmu, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xfontsel"; + version = "1.1.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xfontsel-1.1.0.tar.xz"; + sha256 = "1d6ifx6sw97mmr00bhfakyx2f94w14yswxc68sw49zmvawrjq18p"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xfs = callPackage ({ stdenv, pkg-config, fetchurl, libXfont2, xorgproto, xtrans, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xfs"; + version = "1.2.1"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xfs-1.2.1.tar.xz"; + sha256 = "1rn1l76z4l133491wb1klixbwb8az5cnrzwx37fb3vnpmplc72ix"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libXfont2 xorgproto xtrans ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xfsinfo = callPackage ({ stdenv, pkg-config, fetchurl, libFS, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xfsinfo"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xfsinfo-1.0.7.tar.xz"; + sha256 = "0x48p4hk0lds2s8nwzgfl616r99s28ydx02zs7p1fxxs3i2wmwwj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libFS xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xgamma = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, libXxf86vm, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xgamma"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xgamma-1.0.7.tar.xz"; + sha256 = "13xw2fqp9cs7xj3nqi8khqxv81rk0dd8khp59xgs2lw9bbldly8w"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto libXxf86vm ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xgc = callPackage ({ stdenv, pkg-config, fetchurl, libXaw, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xgc"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xgc-1.0.6.tar.xz"; + sha256 = "0h5jm2946f5m1g8a3qh1c01h3zrsjjivi09vi9rmij2frvdvp1vv"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libXaw libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xhost = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXau, libXmu, xorgproto, gettext, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xhost"; + version = "1.0.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xhost-1.0.9.tar.xz"; + sha256 = "0ib66h78ykc4zki4arh8hkcsgk1mk8yyy0ay5sdb2d908qqvb1pa"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config gettext ]; + buildInputs = [ libX11 libXau libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xinit = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xinit"; + version = "1.4.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xinit-1.4.2.tar.xz"; + sha256 = "08qz6f6yhis6jdcp6hzspql6ib9a9zp0ddhhbac1b7zg4a6xrn5p"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xinput = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXext, libXi, libXinerama, libXrandr, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xinput"; + version = "1.6.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xinput-1.6.4.tar.xz"; + sha256 = "1j2pf28c54apr56v1fmvprp657n6x4sdrv8f24rx3138cl6x015d"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXext libXi libXinerama libXrandr ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkbcomp = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxkbfile, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkbcomp"; + version = "1.4.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xkbcomp-1.4.7.tar.xz"; + sha256 = "0xqzz209m9i43jbyrf2lh4xdbyhzzzn9mis2f2c32kplwla82a0a"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxkbfile xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xkbcomp" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkbevd = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxkbfile, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkbevd"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xkbevd-1.1.5.tar.xz"; + sha256 = "0swjhk33fp15060hhzycmk288ys51wwm6l7p9xy4blz95mq7nd9q"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxkbfile ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkbprint = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxkbfile, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkbprint"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xkbprint-1.0.6.tar.xz"; + sha256 = "1c57kb8d8cbf720n9bcjhhaqpk08lac0sk4l0jp8j0mryw299k4r"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxkbfile xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkbutils = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, libX11, libXaw, libXt, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkbutils"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xkbutils-1.0.6.tar.xz"; + sha256 = "0pp2bsksblvvw0fx667k2bl5sm0baj7pp2cjvq0vmk093vpbp8ii"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto libX11 libXaw libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkeyboardconfig = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkeyboard-config"; + version = "2.41"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/data/xkeyboard-config/xkeyboard-config-2.41.tar.xz"; + sha256 = "13vjvyg1fjvsqzqkpxzigvv94v154mcb2gba4d80spi9aywxcb7h"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xkill = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xkill"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xkill-1.0.6.tar.xz"; + sha256 = "01xrmqw498hqlhn6l1sq89s31k6sjf6xlij6a08pnrvmqiwama75"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xload = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXmu, xorgproto, libXt, gettext, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xload"; + version = "1.1.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xload-1.1.4.tar.xz"; + sha256 = "0c9h6w4bd1q3k4cy8v56sc3v9cg94cpg3xr057sf096v428vjil3"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config gettext wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXmu xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xlsatoms = callPackage ({ stdenv, pkg-config, fetchurl, libxcb, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xlsatoms"; + version = "1.1.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xlsatoms-1.1.4.tar.xz"; + sha256 = "1dviriynilkw0jwl0s2h8y95pwh8cxj95cnmllkd6rn0args3gzl"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libxcb ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xlsclients = callPackage ({ stdenv, pkg-config, fetchurl, libxcb, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xlsclients"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xlsclients-1.1.5.tar.xz"; + sha256 = "1qxsav5gicsfwv1dqlcfpj47vy9i30i7iysrfx5aql02wxbyxfk8"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libxcb ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xlsfonts = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xlsfonts"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xlsfonts-1.0.7.tar.xz"; + sha256 = "0r84wp4352hbfcaybqp2khipm40293byvrfyrlslrd37m52njwkv"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xmag = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXaw, libXmu, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xmag"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xmag-1.0.7.tar.xz"; + sha256 = "0qblrqrhxml2asgbck53a1v7c4y7ap7jcyqjg500h1i7bb63d680"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libX11 libXaw libXmu libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xmessage = callPackage ({ stdenv, pkg-config, fetchurl, libXaw, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xmessage"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xmessage-1.0.6.tar.xz"; + sha256 = "04kahkk3kd6p1xlzf0jwfgnrb5z2r3y55q3p12b6n59py52wbsnj"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libXaw libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xmodmap = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xmodmap"; + version = "1.0.11"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xmodmap-1.0.11.tar.xz"; + sha256 = "10byhzdfv1xckqc3d2v52xg1ggxn5j806x4450l3ig5hyxl82bws"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xmore = callPackage ({ stdenv, pkg-config, fetchurl, libXaw, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xmore"; + version = "1.0.4"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xmore-1.0.4.tar.xz"; + sha256 = "16havfffngvx5kc9lam8rhsdfabsj1rsv4g49z346knyq7dn1dby"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libXaw xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xorgcffiles = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xorg-cf-files"; + version = "1.0.8"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/util/xorg-cf-files-1.0.8.tar.xz"; + sha256 = "1f8primgb6qw3zy7plbsj4a1kdhdqb04xpdys520zaygxxfra23l"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xorgdocs = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xorg-docs"; + version = "1.7.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/doc/xorg-docs-1.7.2.tar.gz"; + sha256 = "0xrncq9dkl6h03gfsj89zagi2vkhgvcgy8l6pjjva350d24027hc"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xorgproto = callPackage ({ stdenv, pkg-config, fetchurl, libXt, python3, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xorgproto"; + version = "2023.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/proto/xorgproto-2023.2.tar.xz"; + sha256 = "0b4c27aq25w1fccks49p020avf9jzh75kaq5qwnww51bp1yvq7xn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config python3 ]; + buildInputs = [ libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "applewmproto" "bigreqsproto" "compositeproto" "damageproto" "dmxproto" "dpmsproto" "dri2proto" "dri3proto" "evieproto" "fixesproto" "fontcacheproto" "fontsproto" "glproto" "inputproto" "kbproto" "lg3dproto" "presentproto" "printproto" "randrproto" "recordproto" "renderproto" "resourceproto" "scrnsaverproto" "trapproto" "videoproto" "windowswmproto" "xcalibrateproto" "xcmiscproto" "xextproto" "xf86bigfontproto" "xf86dgaproto" "xf86driproto" "xf86miscproto" "xf86rushproto" "xf86vidmodeproto" "xineramaproto" "xproto" "xproxymngproto" "xwaylandproto" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xorgserver = callPackage ({ stdenv, pkg-config, fetchurl, xorgproto, openssl, libX11, libXau, libxcb, xcbutil, xcbutilwm, xcbutilimage, xcbutilkeysyms, xcbutilrenderutil, libXdmcp, libXfixes, libxkbfile, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xorg-server"; + version = "21.1.13"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/xserver/xorg-server-21.1.13.tar.xz"; + sha256 = "033lvjihidc68v08izrr63va8jhkfmzcjg0d6rm26wizjkah4nml"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ xorgproto openssl libX11 libXau libxcb xcbutil xcbutilwm xcbutilimage xcbutilkeysyms xcbutilrenderutil libXdmcp libXfixes libxkbfile ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-server" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xorgsgmldoctools = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xorg-sgml-doctools"; + version = "1.12"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/doc/xorg-sgml-doctools-1.12.tar.gz"; + sha256 = "1nsb8kn6nipc09yv19wdpd94pav6hx7xby0psmmdvnm6wqlh6nlq"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xorg-sgml-doctools" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xpr = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xpr"; + version = "1.1.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xpr-1.1.0.tar.xz"; + sha256 = "1iaphm96kha6bzz34cj82r2lp5hrdpqwdca04iij4rinflab3fx0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xprop = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xprop"; + version = "1.2.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xprop-1.2.7.tar.xz"; + sha256 = "0pw2iv7dcy2xq5fh3427nx88pjj9d9rry3930qj1c6mricaf6dj4"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xrandr = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, libXrandr, libXrender, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xrandr"; + version = "1.5.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xrandr-1.5.2.tar.xz"; + sha256 = "0h7jy4c5zgrr06fimnnxhy5ba782b1n4aik29g6bln4h1mwy9gn8"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto libXrandr libXrender ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xrdb = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xrdb"; + version = "1.2.2"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xrdb-1.2.2.tar.xz"; + sha256 = "1x1ka0zbcw66a06jvsy92bvnsj9vxbvnq1hbn1az4f0v4fmzrx9i"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xrefresh = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xrefresh"; + version = "1.0.7"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xrefresh-1.0.7.tar.xz"; + sha256 = "07hvfw3rdv8mzqmm9ax5z8kw544insdd152f2z8868ply8sxdwd9"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xset = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXext, libXmu, xorgproto, libXxf86misc, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xset"; + version = "1.2.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xset-1.2.5.tar.xz"; + sha256 = "0bsyyx3k32k9vpb8x3ks7hlfr03nm0i14fv3cg6n4f2vcdajsscz"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXext libXmu xorgproto libXxf86misc ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xsetroot = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xbitmaps, libXcursor, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xsetroot"; + version = "1.1.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xsetroot-1.1.3.tar.xz"; + sha256 = "1l9qcv4mldj70slnmfg56nv7yh9j9ca1x795bl26whmlkrdb90b0"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xbitmaps libXcursor libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xsm = callPackage ({ stdenv, pkg-config, fetchurl, libICE, libSM, libX11, libXaw, xorgproto, libXt, wrapWithXFileSearchPathHook, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xsm"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xsm-1.0.5.tar.xz"; + sha256 = "0bgvwvj99yqivy4dyxrfa0anwvh5d634gz0w43zy8cn17ymgsc4w"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config wrapWithXFileSearchPathHook ]; + buildInputs = [ libICE libSM libX11 libXaw xorgproto libXt ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xstdcmap = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXmu, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xstdcmap"; + version = "1.0.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xstdcmap-1.0.5.tar.xz"; + sha256 = "1061b95j08mlwpadyilmpbzfgmm08z69k8nrkbn9k11rg7ilfn1n"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXmu xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xtrans = callPackage ({ stdenv, pkg-config, fetchurl, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xtrans"; + version = "1.5.0"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/lib/xtrans-1.5.0.tar.xz"; + sha256 = "1gdiiw64p279a1x033w7i002myry9v75pwmc1gsdpzbbd41vg90v"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "xtrans" ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xtrap = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libXt, libXTrap, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xtrap"; + version = "1.0.3"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xtrap-1.0.3.tar.bz2"; + sha256 = "0sqm4j1zflk1s94iq4waa70hna1xcys88v9a70w0vdw66czhvj2j"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libXt libXTrap ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xvinfo = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, libXv, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xvinfo"; + version = "1.1.5"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xvinfo-1.1.5.tar.xz"; + sha256 = "0164qpbjmxxa1rbvh6ay1iz2qnp9hl1745k9pk6195kdnbn73piy"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto libXv ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xwd = callPackage ({ stdenv, pkg-config, fetchurl, libxkbfile, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xwd"; + version = "1.0.9"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xwd-1.0.9.tar.xz"; + sha256 = "0gxx3y9zlh13jgwkayxljm6i58ng8jc1xzqv2g8s7d3yjj21n4nw"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libxkbfile libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xwininfo = callPackage ({ stdenv, pkg-config, fetchurl, libX11, libxcb, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xwininfo"; + version = "1.1.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xwininfo-1.1.6.tar.xz"; + sha256 = "0gr5m4lyvkil3cl63zf0sw7bq5qgraqrnvddk6xgk3a42xy8j61m"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 libxcb xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + + # THIS IS A GENERATED FILE. DO NOT EDIT! + xwud = callPackage ({ stdenv, pkg-config, fetchurl, libX11, xorgproto, testers }: stdenv.mkDerivation (finalAttrs: { + pname = "xwud"; + version = "1.0.6"; + builder = ./builder.sh; + src = fetchurl { + url = "mirror://xorg/individual/app/xwud-1.0.6.tar.xz"; + sha256 = "1zhsih1l3x1038fi1wi9npvfnn8j7580ca73saixjg5sbv8qq134"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config ]; + buildInputs = [ libX11 xorgproto ]; + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ ]; + platforms = lib.platforms.unix; + }; + })) {}; + +} diff --git a/pkgs/by-name/xo/xorg/dont-create-logdir-during-build.patch b/pkgs/by-name/xo/xorg/dont-create-logdir-during-build.patch new file mode 100644 index 0000000..3675292 --- /dev/null +++ b/pkgs/by-name/xo/xorg/dont-create-logdir-during-build.patch @@ -0,0 +1,32 @@ +--- + hw/xfree86/Makefile.am | 1 - + hw/xfree86/Makefile.in | 1 - + 2 files changed, 2 deletions(-) + +diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am +index 9aeaea1..dcca3b8 100644 +--- a/hw/xfree86/Makefile.am ++++ b/hw/xfree86/Makefile.am +@@ -100,7 +100,6 @@ EXTRA_DIST = xorgconf.cpp + + # Without logdir, X will post an error on the terminal and will not start + install-data-local: +- $(AM_V_GEN)$(MKDIR_P) $(DESTDIR)$(logdir) + if CYGWIN + $(INSTALL_DATA) libXorg.exe.a $(DESTDIR)$(libdir)/libXorg.exe.a + endif +diff --git a/hw/xfree86/Makefile.in b/hw/xfree86/Makefile.in +index c4fceee..74da8f1 100644 +--- a/hw/xfree86/Makefile.in ++++ b/hw/xfree86/Makefile.in +@@ -1161,7 +1161,6 @@ uninstall-am: uninstall-binPROGRAMS uninstall-local \ + + # Without logdir, X will post an error on the terminal and will not start + install-data-local: +- $(AM_V_GEN)$(MKDIR_P) $(DESTDIR)$(logdir) + @CYGWIN_TRUE@ $(INSTALL_DATA) libXorg.exe.a $(DESTDIR)$(libdir)/libXorg.exe.a + + install-exec-hook: +-- +2.25.4 + diff --git a/pkgs/by-name/xo/xorg/generate-expr-from-tarballs.pl b/pkgs/by-name/xo/xorg/generate-expr-from-tarballs.pl new file mode 100755 index 0000000..d0f88c4 --- /dev/null +++ b/pkgs/by-name/xo/xorg/generate-expr-from-tarballs.pl @@ -0,0 +1,358 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure --keep NIX_PATH -i perl -p cacert nix perl + +# Usage: manually update tarballs.list then run: ./generate-expr-from-tarballs.pl tarballs.list + +use strict; +use warnings; + +use File::Basename; +use File::Spec::Functions; +use File::Temp; + + +my %pkgURLs; +my %pkgHashes; +my %pkgNames; +my %pkgVersions; +my %pkgRequires; +my %pkgNativeRequires; + +my %pcProvides; +my %pcMap; + +my %extraAttrs; + + +my @missingPCs = ("fontconfig", "libdrm", "libXaw", "zlib", "perl", "python3", "mkfontscale", "bdftopcf", "libxslt", "openssl", "gperf", "m4", "libinput", "libevdev", "mtdev", "xorgproto", "cairo", "gettext", "meson", "ninja", "wrapWithXFileSearchPathHook" ); +$pcMap{$_} = $_ foreach @missingPCs; +$pcMap{"freetype2"} = "freetype"; +$pcMap{"libpng12"} = "libpng"; +$pcMap{"libpng"} = "libpng"; +$pcMap{"dbus-1"} = "dbus"; +$pcMap{"uuid"} = "libuuid"; +$pcMap{"libudev"} = "udev"; +$pcMap{"gl"} = "libGL"; +$pcMap{"GL"} = "libGL"; +$pcMap{"gbm"} = "mesa"; +$pcMap{"hwdata"} = "hwdata"; +$pcMap{"\$PIXMAN"} = "pixman"; +$pcMap{"\$RENDERPROTO"} = "xorgproto"; +$pcMap{"\$DRI3PROTO"} = "xorgproto"; +$pcMap{"\$DRI2PROTO"} = "xorgproto"; +$pcMap{"\${XKBMODULE}"} = "libxkbfile"; + + +my $downloadCache = "./download-cache"; +mkdir $downloadCache, 0755; + + +while (<>) { + chomp; + my $tarball = "$_"; + print "\nDOING TARBALL $tarball\n"; + + my $pkg; + if ($tarball =~ s/:([a-zA-Z0-9_]+)$//) { + $pkg = $1; + } else { + $tarball =~ /\/((?:(?:[A-Za-z0-9]|(?:-[^0-9])|(?:-[0-9]*[a-z]))+))[^\/]*$/; + die unless defined $1; + $pkg = $1; + $pkg =~ s/(-|[a-f0-9]{40})//g; # Remove hyphen-minus and SHA-1 + #next unless $pkg eq "xcbutil"; + } + + $tarball =~ /\/([^\/]*)\.(tar\.(bz2|gz|xz)|tgz)$/; + my $pkgName = $1; + + print " $pkg $pkgName\n"; + + if (defined $pkgNames{$pkg}) { + print " SKIPPING\n"; + next; + } + + # Split by first occurrence of hyphen followed by only numbers, ends line, another hyphen follows, or SHA-1 + my ($name, $version) = split(/-(?=[.0-9]+(?:$|-)|[a-f0-9]{40})/, $pkgName, 2); + + $pkgURLs{$pkg} = $tarball; + $pkgNames{$pkg} = $name; + $pkgVersions{$pkg} = $version; + + my $cachePath = catdir($downloadCache, basename($tarball)); + my $hash; + my $path; + if (-e $cachePath) { + $path = readlink($cachePath); + $hash = `nix-hash --type sha256 --base32 --flat $cachePath`; + } + else { + ($hash, $path) = `PRINT_PATH=1 QUIET=1 nix-prefetch-url '$tarball'`; + `nix-store --realise --add-root $cachePath --indirect $path`; + } + chomp $hash; + chomp $path; + $pkgHashes{$pkg} = $hash; + + print "\nunpacking $path\n"; + my $tmpDir = File::Temp->newdir(); + system "cd '$tmpDir' && tar xf '$path'"; + die "cannot unpack `$path'" if $? != 0; + print "\n"; + + my $pkgDir = `echo $tmpDir/*`; + chomp $pkgDir; + + my $provides = `find $pkgDir -name "*.pc.in"`; + my @provides2 = split '\n', $provides; + my @requires = (); + my @nativeRequires = (); + + foreach my $pcFile (@provides2) { + my $pc = $pcFile; + $pc =~ s/.*\///; + $pc =~ s/.pc.in//; + push @{$pcProvides{$pkg}}, $pc; + print "PROVIDES $pc\n"; + die "collision with $pcMap{$pc}" if defined $pcMap{$pc}; + $pcMap{$pc} = $pkg; + + open FOO, "<$pcFile" or die; + while () { + if (/Requires:(.*)/) { + my @reqs = split ' ', $1; + foreach my $req (@reqs) { + next unless $req =~ /^[a-z]+$/; + print "REQUIRE (from $pc): $req\n"; + push @requires, $req; + } + } + } + close FOO; + + } + + my $file; + { + local $/; + open FOO, "cd '$tmpDir'/* && grep -v '^ *#' configure.ac |"; + $file = ; + close FOO; + } + + if ($file =~ /XAW_CHECK_XPRINT_SUPPORT/) { + push @requires, "libXaw"; + } + + if ($file =~ /zlib is required/ || $file =~ /AC_CHECK_LIB\(z\,/) { + push @requires, "zlib"; + } + + if ($file =~ /Perl is required/) { + push @requires, "perl"; + } + + if ($file =~ /AC_PATH_PROG\(BDFTOPCF/) { + push @nativeRequires, "bdftopcf"; + } + + if ($file =~ /AC_PATH_PROG\(MKFONTSCALE/ || $file =~ /XORG_FONT_REQUIRED_PROG\(MKFONTSCALE/) { + push @nativeRequires, "mkfontscale"; + } + + if ($file =~ /AC_PATH_PROG\(MKFONTDIR/) { + push @nativeRequires, "mkfontscale"; + } + + if ($file =~ /AM_PATH_PYTHON/) { + push @nativeRequires, "python3"; + } + + if ($file =~ /AC_PATH_PROG\(FCCACHE/) { + # Don't run fc-cache. + die if defined $extraAttrs{$pkg}; + push @{$extraAttrs{$pkg}}, "preInstall = \"installFlags=(FCCACHE=true)\";"; + } + + my $isFont; + + if ($file =~ /XORG_FONT_BDF_UTILS/) { + push @nativeRequires, "bdftopcf", "mkfontscale"; + $isFont = 1; + } + + if ($file =~ /XORG_FONT_SCALED_UTILS/) { + push @nativeRequires, "mkfontscale"; + $isFont = 1; + } + + if ($file =~ /XORG_FONT_UCS2ANY/) { + push @nativeRequires, "fontutil", "mkfontscale"; + $isFont = 1; + } + + if ($isFont) { + push @requires, "fontutil"; + push @{$extraAttrs{$pkg}}, "configureFlags = [ \"--with-fontrootdir=\$(out)/lib/X11/fonts\" ];"; + push @{$extraAttrs{$pkg}}, "postPatch = ''substituteInPlace configure --replace 'MAPFILES_PATH=`pkg-config' 'MAPFILES_PATH=`\$PKG_CONFIG' '';"; + } + + if (@@ = glob("$tmpDir/*/app-defaults/")) { + push @nativeRequires, "wrapWithXFileSearchPathHook"; + } + + sub process { + my $requires = shift; + my $s = shift; + $s =~ s/\[/\ /g; + $s =~ s/\]/\ /g; + $s =~ s/\,/\ /g; + foreach my $req (split / /, $s) { + next if $req eq ">="; + #next if $req =~ /^\$/; + next if $req =~ /^[0-9]/; + next if $req =~ /^\s*$/; + next if $req eq '$REQUIRED_MODULES'; + next if $req eq '$REQUIRED_LIBS'; + next if $req eq '$XDMCP_MODULES'; + next if $req eq '$XORG_MODULES'; + print "REQUIRE: $req\n"; + push @{$requires}, $req; + } + } + + #process \@requires, $1 while $file =~ /PKG_CHECK_MODULES\([^,]*,\s*[\[]?([^\)\[]*)/g; + process \@requires, $1 while $file =~ /PKG_CHECK_MODULES\([^,]*,([^\)\,]*)/g; + process \@requires, $1 while $file =~ /AC_SEARCH_LIBS\([^,]*,([^\)\,]*)/g; + process \@requires, $1 while $file =~ /MODULES=\"(.*)\"/g; + process \@requires, $1 while $file =~ /REQUIRED_LIBS=\"(.*)\"/g; + process \@requires, $1 while $file =~ /REQUIRED_MODULES=\"(.*)\"/g; + process \@requires, $1 while $file =~ /REQUIRES=\"(.*)\"/g; + process \@requires, $1 while $file =~ /X11_REQUIRES=\'(.*)\'/g; + process \@requires, $1 while $file =~ /XDMCP_MODULES=\"(.*)\"/g; + process \@requires, $1 while $file =~ /XORG_MODULES=\"(.*)\"/g; + process \@requires, $1 while $file =~ /NEEDED=\"(.*)\"/g; + process \@requires, $1 while $file =~ /ivo_requires=\"(.*)\"/g; + process \@requires, $1 while $file =~ /XORG_DRIVER_CHECK_EXT\([^,]*,([^\)]*)\)/g; + + push @nativeRequires, "gettext" if $file =~ /USE_GETTEXT/; + push @requires, "libxslt" if $pkg =~ /libxcb/; + push @nativeRequires, "meson", "ninja" if $pkg =~ /libxcvt/; + push @nativeRequires, "m4" if $pkg =~ /xcbutil/; + push @requires, "gperf", "xorgproto" if $pkg =~ /xcbutil/; + + print "REQUIRES $pkg => @requires\n"; + print "NATIVE_REQUIRES $pkg => @nativeRequires\n"; + $pkgRequires{$pkg} = \@requires; + $pkgNativeRequires{$pkg} = \@nativeRequires; + + print "done\n"; +} + + +print "\nWRITE OUT\n"; + +open OUT, ">default.nix"; + +print OUT ""; +print OUT < + - + a + + + ${name} + ${layout.description} + ${layout.description} + + + . + w + EOF + + # add layout description + ${ed}/bin/ed -v rules/base.xml < + - + a + + + ${name} + ${name} + ${layout.description} + + ${concatMapStrings (lang: "${lang}\n") layout.languages} + + + + + . + w + EOF + ''; + in + xorg.xkeyboardconfig.overrideAttrs (old: { + buildInputs = old.buildInputs ++ [ automake ]; + postPatch = with lib; concatStrings (mapAttrsToList patchIn layouts); + }); + + xlsfonts = super.xlsfonts.overrideAttrs (attrs: { + meta = attrs.meta // { + license = lib.licenses.mit; + mainProgram = "xlsfonts"; + }; + }); + + xorgproto = super.xorgproto.overrideAttrs (attrs: { + buildInputs = []; + propagatedBuildInputs = []; + nativeBuildInputs = attrs.nativeBuildInputs ++ [ meson ninja ]; + # adds support for printproto needed for libXp + mesonFlags = [ "-Dlegacy=true" ]; + + patches = [ + (fetchpatch { + url = "https://aur.archlinux.org/cgit/aur.git/plain/meson.patch?h=mingw-w64-xorgproto&id=7b817efc3144a50e6766817c4ca7242f8ce49307"; + sha256 = "sha256-Izzz9In53W7CC++k1bLr78iSrmxpFm1cH8qcSpptoUQ="; + }) + ]; + meta = attrs.meta // { platforms = lib.platforms.unix ++ lib.platforms.windows; }; + }); + + xorgserver = with xorg; super.xorgserver.overrideAttrs (attrs_passed: + let + attrs = attrs_passed // { + buildInputs = attrs_passed.buildInputs ++ + lib.optional (libdrm != null) libdrm.dev; + postPatch = '' + for i in dri3/*.c + do + sed -i -e "s|#include |#include |" $i + done + ''; + meta = attrs_passed.meta // { mainProgram = "X"; }; + }; + in attrs // + (let + version = lib.getVersion attrs; + commonBuildInputs = attrs.buildInputs ++ [ xtrans libxcvt ]; + commonPropagatedBuildInputs = [ + dbus libGL libGLU libXext libXfont libXfont2 libepoxy libunwind + libxshmfence pixman xorgproto zlib + ]; + # XQuartz requires two compilations: the first to get X / XQuartz, + # and the second to get Xvfb, Xnest, etc. + darwinOtherX = xorgserver.overrideAttrs (oldAttrs: { + configureFlags = oldAttrs.configureFlags ++ [ + "--disable-xquartz" + "--enable-xorg" + "--enable-xvfb" + "--enable-xnest" + "--enable-kdrive" + ]; + postInstall = ":"; # prevent infinite recursion + }); + + fpgit = commit: sha256: name: fetchpatch ( + { + url = "https://gitlab.freedesktop.org/xorg/xserver/-/commit/${commit}.diff"; + inherit sha256; + } // lib.optionalAttrs (name != null) { + name = name + ".patch"; + } + ); + in + if (!isDarwin) + then { + outputs = [ "out" "dev" ]; + patches = [ + # The build process tries to create the specified logdir when building. + # + # We set it to /var/log which can't be touched from inside the sandbox causing the build to hard-fail + ./dont-create-logdir-during-build.patch + ]; + buildInputs = commonBuildInputs ++ [ libdrm mesa ]; + propagatedBuildInputs = attrs.propagatedBuildInputs or [] ++ [ libpciaccess ] ++ commonPropagatedBuildInputs ++ lib.optionals stdenv.isLinux [ + udev + ]; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + prePatch = lib.optionalString stdenv.hostPlatform.isMusl '' + export CFLAGS+=" -D__uid_t=uid_t -D__gid_t=gid_t" + ''; + configureFlags = [ + "--enable-kdrive" # not built by default + "--enable-xephyr" + "--enable-xcsecurity" # enable SECURITY extension + "--with-default-font-path=" # there were only paths containing "${prefix}", + # and there are no fonts in this package anyway + "--with-xkb-bin-directory=${xorg.xkbcomp}/bin" + "--with-xkb-path=${xorg.xkeyboardconfig}/share/X11/xkb" + "--with-xkb-output=$out/share/X11/xkb/compiled" + "--with-log-dir=/var/log" + "--enable-glamor" + "--with-os-name=Nix" # r13y, embeds the build machine's kernel version otherwise + ] ++ lib.optionals stdenv.hostPlatform.isMusl [ + "--disable-tls" + ]; + + env.NIX_CFLAGS_COMPILE = toString [ + # Needed with GCC 12 + "-Wno-error=array-bounds" + ]; + + postInstall = '' + rm -fr $out/share/X11/xkb/compiled # otherwise X will try to write in it + ( # assert() keeps runtime reference xorgserver-dev in xf86-video-intel and others + cd "$dev" + for f in include/xorg/*.h; do + sed "1i#line 1 \"${attrs.pname}-${attrs.version}/$f\"" -i "$f" + done + ) + ''; + passthru = attrs.passthru // { + inherit version; # needed by virtualbox guest additions + }; + } else { + nativeBuildInputs = attrs.nativeBuildInputs ++ [ autoreconfHook bootstrap_cmds xorg.utilmacros xorg.fontutil ]; + buildInputs = commonBuildInputs ++ [ + bootstrap_cmds automake autoconf + Xplugin Carbon Cocoa + ]; + propagatedBuildInputs = commonPropagatedBuildInputs ++ [ + libAppleWM xorgproto + ]; + + patches = [ + # XQuartz patchset + (fetchpatch { + url = "https://github.com/XQuartz/xorg-server/commit/e88fd6d785d5be477d5598e70d105ffb804771aa.patch"; + sha256 = "1q0a30m1qj6ai924afz490xhack7rg4q3iig2gxsjjh98snikr1k"; + name = "use-cppflags-not-cflags.patch"; + }) + (fetchpatch { + url = "https://github.com/XQuartz/xorg-server/commit/75ee9649bcfe937ac08e03e82fd45d9e18110ef4.patch"; + sha256 = "1vlfylm011y00j8mig9zy6gk9bw2b4ilw2qlsc6la49zi3k0i9fg"; + name = "use-old-mitrapezoids-and-mitriangles-routines.patch"; + }) + (fetchpatch { + url = "https://github.com/XQuartz/xorg-server/commit/c58f47415be79a6564a9b1b2a62c2bf866141e73.patch"; + sha256 = "19sisqzw8x2ml4lfrwfvavc2jfyq2bj5xcf83z89jdxg8g1gdd1i"; + name = "revert-fb-changes-1.patch"; + }) + (fetchpatch { + url = "https://github.com/XQuartz/xorg-server/commit/56e6f1f099d2821e5002b9b05b715e7b251c0c97.patch"; + sha256 = "0zm9g0g1jvy79sgkvy0rjm6ywrdba2xjd1nsnjbxjccckbr6i396"; + name = "revert-fb-changes-2.patch"; + }) + ./darwin/bundle_main.patch + ./darwin/stub.patch + ]; + + postPatch = attrs.postPatch + '' + substituteInPlace hw/xquartz/mach-startup/stub.c \ + --subst-var-by XQUARTZ_APP "$out/Applications/XQuartz.app" + ''; + + configureFlags = [ + # note: --enable-xquartz is auto + "CPPFLAGS=-I${./darwin/dri}" + "--disable-glamor" + "--with-default-font-path=" + "--with-apple-application-name=XQuartz" + "--with-apple-applications-dir=\${out}/Applications" + "--with-bundle-id-prefix=org.nixos.xquartz" + "--with-sha1=CommonCrypto" + "--with-xkb-bin-directory=${xorg.xkbcomp}/bin" + "--with-xkb-path=${xorg.xkeyboardconfig}/share/X11/xkb" + "--with-xkb-output=$out/share/X11/xkb/compiled" + "--without-dtrace" # requires Command Line Tools for Xcode + ]; + preConfigure = '' + mkdir -p $out/Applications + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -Wno-error" + substituteInPlace hw/xquartz/pbproxy/Makefile.in --replace -F/System -F${ApplicationServices} + ''; + postInstall = '' + rm -fr $out/share/X11/xkb/compiled + + cp -rT ${darwinOtherX}/bin $out/bin + rm -f $out/bin/X + ln -s Xquartz $out/bin/X + + cp ${darwinOtherX}/share/man -rT $out/share/man + '' ; + passthru = attrs.passthru // { + inherit version; + }; + })); + + lndir = super.lndir.overrideAttrs (attrs: { + buildInputs = []; + preConfigure = '' + export XPROTO_CFLAGS=" " + export XPROTO_LIBS=" " + substituteInPlace lndir.c \ + --replace '' '' \ + --replace '' '' \ + --replace '_X_ATTRIBUTE_PRINTF(1,2)' '__attribute__((__format__(__printf__,1,2)))' \ + --replace '_X_ATTRIBUTE_PRINTF(2,3)' '__attribute__((__format__(__printf__,2,3)))' \ + --replace '_X_NORETURN' '__attribute__((noreturn))' \ + --replace 'n_dirs--;' "" + ''; + meta = attrs.meta // { mainProgram = "lndir"; }; + }); + + twm = super.twm.overrideAttrs (attrs: { + nativeBuildInputs = attrs.nativeBuildInputs ++ [bison flex]; + meta = attrs.meta // { mainProgram = "twm"; }; + }); + + xauth = super.xauth.overrideAttrs (attrs: { + doCheck = false; # fails + preConfigure = attrs.preConfigure or "" + # missing transitive dependencies + + lib.optionalString stdenv.hostPlatform.isStatic '' + export NIX_CFLAGS_LINK="$NIX_CFLAGS_LINK -lxcb -lXau -lXdmcp" + ''; + meta = attrs.meta // { mainProgram = "xauth"; }; + }); + + xbacklight = addMainProgram super.xbacklight { }; + xclock = addMainProgram super.xclock { }; + xcmsdb = addMainProgram super.xcmsdb { }; + xcompmgr = addMainProgram super.xcompmgr { }; + xconsole = addMainProgram super.xconsole { }; + xcursorgen = addMainProgram super.xcursorgen { }; + + xcursorthemes = super.xcursorthemes.overrideAttrs (attrs: { + nativeBuildInputs = attrs.nativeBuildInputs ++ [ xorg.xcursorgen ]; + buildInputs = attrs.buildInputs ++ [ xorg.xorgproto ]; + configureFlags = [ "--with-cursordir=$(out)/share/icons" ]; + }); + + xinit = (super.xinit.override { + stdenv = if isDarwin then clangStdenv else stdenv; + }).overrideAttrs (attrs: { + nativeBuildInputs = attrs.nativeBuildInputs ++ lib.optional isDarwin bootstrap_cmds; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + configureFlags = [ + "--with-xserver=${xorg.xorgserver.out}/bin/X" + ] ++ lib.optionals isDarwin [ + "--with-bundle-id-prefix=org.nixos.xquartz" + "--with-launchdaemons-dir=\${out}/LaunchDaemons" + "--with-launchagents-dir=\${out}/LaunchAgents" + ]; + postPatch = '' + # Avoid replacement of word-looking cpp's builtin macros in Nix's cross-compiled paths + substituteInPlace Makefile.in --replace "PROGCPPDEFS =" "PROGCPPDEFS = -Dlinux=linux -Dunix=unix" + ''; + propagatedBuildInputs = attrs.propagatedBuildInputs or [] ++ [ xorg.xauth ] + ++ lib.optionals isDarwin [ xorg.libX11 xorg.xorgproto ]; + postFixup = '' + substituteInPlace $out/bin/startx \ + --replace $out/etc/X11/xinit/xserverrc /etc/X11/xinit/xserverrc \ + --replace $out/etc/X11/xinit/xinitrc /etc/X11/xinit/xinitrc + ''; + meta = attrs.meta // { mainProgram = "xinit"; }; + }); + + xf86videointel = super.xf86videointel.overrideAttrs (attrs: { + # the update script only works with released tarballs :-/ + name = "xf86-video-intel-2021-01-15"; + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + group = "xorg"; + owner = "driver"; + repo = "xf86-video-intel"; + rev = "31486f40f8e8f8923ca0799aea84b58799754564"; + sha256 = "sha256-nqT9VZDb2kAC72ot9UCdwEkM1uuP9NriJePulzrdZlM="; + }; + buildInputs = attrs.buildInputs ++ [ xorg.libXScrnSaver xorg.libXv xorg.pixman xorg.utilmacros ]; + nativeBuildInputs = attrs.nativeBuildInputs ++ [autoreconfHook ]; + configureFlags = [ "--with-default-dri=3" "--enable-tools" ]; + patches = [ ./use_crocus_and_iris.patch ]; + + meta = attrs.meta // { + platforms = ["i686-linux" "x86_64-linux"]; + }; + }); + + xf86videoopenchrome = super.xf86videoopenchrome.overrideAttrs (attrs: { + buildInputs = attrs.buildInputs ++ [ xorg.libXv ]; + patches = [ + # Pull upstream fix for -fno-common toolchains. + (fetchpatch { + name = "fno-common.patch"; + url = "https://github.com/freedesktop/openchrome-xf86-video-openchrome/commit/edb46574d4686c59e80569ba236d537097dcdd0e.patch"; + sha256 = "0xqawg9zzwb7x5vaf3in60isbkl3zfjq0wcnfi45s3hiii943sxz"; + }) + ]; + }); + + xf86videoxgi = super.xf86videoxgi.overrideAttrs (attrs: { + patches = [ + # fixes invalid open mode + # https://cgit.freedesktop.org/xorg/driver/xf86-video-xgi/commit/?id=bd94c475035739b42294477cff108e0c5f15ef67 + (fetchpatch { + url = "https://cgit.freedesktop.org/xorg/driver/xf86-video-xgi/patch/?id=bd94c475035739b42294477cff108e0c5f15ef67"; + sha256 = "0myfry07655adhrpypa9rqigd6rfx57pqagcwibxw7ab3wjay9f6"; + }) + (fetchpatch { + url = "https://cgit.freedesktop.org/xorg/driver/xf86-video-xgi/patch/?id=78d1138dd6e214a200ca66fa9e439ee3c9270ec8"; + sha256 = "0z3643afgrync280zrp531ija0hqxc5mrwjif9nh9lcnzgnz2d6d"; + }) + # Pull upstream fix for -fno-common toolchains. + (fetchpatch { + name = "fno-common.patch"; + url = "https://github.com/freedesktop/xorg-xf86-video-xgi/commit/3143bdee580c4d397e21adb0fa35502d4dc8e888.patch"; + sha256 = "0by6k26rj1xmljnbfd08v90s1f9bkmnf17aclhv50081m83lmm07"; + }) + ]; + }); + + xfd = addMainProgram super.xfd { }; + xfontsel = addMainProgram super.xfontsel { }; + xfs = addMainProgram super.xfs { }; + xfsinfo = addMainProgram super.xfsinfo { }; + xgamma = addMainProgram super.xgamma { }; + xgc = addMainProgram super.xgc { }; + xhost = addMainProgram super.xhost { }; + xinput = addMainProgram super.xinput { }; + xkbevd = addMainProgram super.xkbevd { }; + xkbprint = addMainProgram super.xkbprint { }; + xkill = addMainProgram super.xkill { }; + xload = addMainProgram super.xload { }; + xlsatoms = addMainProgram super.xlsatoms { }; + xlsclients = addMainProgram super.xlsclients { }; + xmag = addMainProgram super.xmag { }; + xmessage = addMainProgram super.xmessage { }; + xmodmap = addMainProgram super.xmodmap { }; + xmore = addMainProgram super.xmore { }; + + xorgcffiles = super.xorgcffiles.overrideAttrs (attrs: { + postInstall = lib.optionalString stdenv.isDarwin '' + substituteInPlace $out/lib/X11/config/darwin.cf --replace "/usr/bin/" "" + ''; + }); + + xorgdocs = super.xorgdocs.overrideAttrs (attrs: { + # This makes the man pages discoverable by the default man, + # since it looks for packages in $PATH + postInstall = "mkdir $out/bin"; + }); + + xpr = addMainProgram super.xpr { }; + xprop = addMainProgram super.xprop { }; + + xrdb = super.xrdb.overrideAttrs (attrs: { + configureFlags = [ "--with-cpp=${mcpp}/bin/mcpp" ]; + meta = attrs.meta // { mainProgram = "xrdb"; }; + }); + + sessreg = super.sessreg.overrideAttrs (attrs: { + preBuild = "sed -i 's|gcc -E|gcc -E -P|' man/Makefile"; + meta = attrs.meta // { mainProgram = "sessreg"; }; + }); + + xrandr = super.xrandr.overrideAttrs (attrs: { + postInstall = '' + rm $out/bin/xkeystone + ''; + meta = attrs.meta // { + mainProgram = "xrandr"; + }; + }); + + xrefresh = addMainProgram super.xrefresh { }; + xset = addMainProgram super.xset { }; + xsetroot = addMainProgram super.xsetroot { }; + xsm = addMainProgram super.xsm { }; + xstdcmap = addMainProgram super.xstdcmap { }; + xwd = addMainProgram super.xwd { }; + xwininfo = addMainProgram super.xwininfo { }; + xwud = addMainProgram super.xwud { }; + + # convert Type1 vector fonts to OpenType fonts + fontbitstreamtype1 = super.fontbitstreamtype1.overrideAttrs (attrs: { + nativeBuildInputs = attrs.nativeBuildInputs ++ [ fontforge ]; + + postBuild = '' + # convert Postscript (Type 1) font to otf + for i in $(find -type f -name '*.pfa' -o -name '*.pfb'); do + name=$(basename $i | cut -d. -f1) + fontforge -lang=ff -c "Open(\"$i\"); Generate(\"$name.otf\")" + done + ''; + + postInstall = '' + # install the otf fonts + fontDir="$out/lib/X11/fonts/misc/" + install -D -m 644 -t "$fontDir" *.otf + mkfontscale "$fontDir" + ''; + }); + +} + +# mark some packages as unfree +// ( + let + # unfree but redistributable + redist = [ + "fontadobeutopiatype1" + "fontadobeutopia100dpi" + "fontadobeutopia75dpi" + "fontbhtype1" + "fontibmtype1" + "fontbhttf" + "fontbh100dpi" + "fontbh75dpi" + + # Bigelow & Holmes fonts + # https://www.x.org/releases/current/doc/xorg-docs/License.html#Bigelow_Holmes_Inc_and_URW_GmbH_Luxi_font_license + "fontbhlucidatypewriter100dpi" + "fontbhlucidatypewriter75dpi" + ]; + + # unfree, possibly not redistributable + unfree = [ + # no license, just a copyright notice + "fontdaewoomisc" + + # unclear license, "permission to use"? + "fontjismisc" + ]; + + setLicense = license: name: + super.${name}.overrideAttrs (attrs: { + meta = attrs.meta // { inherit license; }; + }); + mapNamesToAttrs = f: names: with lib; + listToAttrs (zipListsWith nameValuePair names (map f names)); + + in + mapNamesToAttrs (setLicense lib.licenses.unfreeRedistributable) redist // + mapNamesToAttrs (setLicense lib.licenses.unfree) unfree +) diff --git a/pkgs/by-name/xo/xorg/packages.nix b/pkgs/by-name/xo/xorg/packages.nix new file mode 100644 index 0000000..83df020 --- /dev/null +++ b/pkgs/by-name/xo/xorg/packages.nix @@ -0,0 +1,30 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + xorg = let + # Use `lib.callPackageWith __splicedPackages` rather than plain `callPackage` + # so as not to have the newly bound xorg items already in scope, which would + # have created a cycle. + overrides = lib.callPackageWith __splicedPackages ./overrides.nix { + inherit (darwin.apple_sdk.frameworks) ApplicationServices Carbon Cocoa; + inherit (darwin.apple_sdk.libs) Xplugin; + inherit (buildPackages.darwin) bootstrap_cmds; + udev = if stdenv.isLinux then udev else null; + libdrm = if stdenv.isLinux then libdrm else null; + }; + + generatedPackages = lib.callPackageWith __splicedPackages ./default.nix { }; + + xorgPackages = makeScopeWithSplicing' { + otherSplices = generateSplicesForMkScope "xorg"; + f = lib.extends overrides generatedPackages; + }; + + in recurseIntoAttrs xorgPackages; + + xwayland = callPackage ./xwayland.nix { }; + + xcbutilxrm = callPackage ./xcb-util-xrm.nix { }; +} diff --git a/pkgs/by-name/xo/xorg/tarballs.list b/pkgs/by-name/xo/xorg/tarballs.list new file mode 100644 index 0000000..5383629 --- /dev/null +++ b/pkgs/by-name/xo/xorg/tarballs.list @@ -0,0 +1,221 @@ +https://invisible-mirror.net/archives/luit/luit-20230201.tgz +mirror://xorg/individual/xcb/libpthread-stubs-0.5.tar.xz +mirror://xorg/individual/xcb/xcb-util-0.4.1.tar.xz +mirror://xorg/individual/xcb/xcb-util-errors-1.0.1.tar.xz +mirror://xorg/individual/xcb/xcb-util-image-0.4.1.tar.xz +mirror://xorg/individual/xcb/xcb-util-keysyms-0.4.1.tar.xz +mirror://xorg/individual/xcb/xcb-util-renderutil-0.3.10.tar.xz +mirror://xorg/individual/xcb/xcb-util-wm-0.4.2.tar.xz +mirror://xorg/individual/app/appres-1.0.6.tar.xz +mirror://xorg/individual/app/bitmap-1.1.1.tar.xz +mirror://xorg/individual/app/editres-1.0.8.tar.xz +mirror://xorg/individual/app/fonttosfnt-1.2.3.tar.xz +mirror://xorg/individual/app/iceauth-1.0.9.tar.xz +mirror://xorg/individual/app/ico-1.0.6.tar.xz +mirror://xorg/individual/app/listres-1.0.5.tar.xz +mirror://xorg/individual/app/mkfontscale-1.2.3.tar.xz +mirror://xorg/individual/app/oclock-1.0.5.tar.xz +mirror://xorg/individual/app/sessreg-1.1.3.tar.xz +mirror://xorg/individual/app/setxkbmap-1.3.4.tar.xz +mirror://xorg/individual/app/smproxy-1.0.7.tar.xz +mirror://xorg/individual/app/transset-1.0.3.tar.xz +mirror://xorg/individual/app/twm-1.0.12.tar.xz +mirror://xorg/individual/app/viewres-1.0.7.tar.xz +mirror://xorg/individual/app/x11perf-1.6.1.tar.bz2 +mirror://xorg/individual/app/xauth-1.1.3.tar.xz +mirror://xorg/individual/app/xbacklight-1.2.3.tar.bz2 +mirror://xorg/individual/app/xcalc-1.1.2.tar.xz +mirror://xorg/individual/app/xclock-1.1.1.tar.xz +mirror://xorg/individual/app/xcmsdb-1.0.6.tar.xz +mirror://xorg/individual/app/xcompmgr-1.1.9.tar.xz +mirror://xorg/individual/app/xconsole-1.0.8.tar.xz +mirror://xorg/individual/app/xcursorgen-1.0.8.tar.xz +mirror://xorg/individual/app/xdm-1.1.14.tar.xz +mirror://xorg/individual/app/xdpyinfo-1.3.4.tar.xz +mirror://xorg/individual/app/xdriinfo-1.0.7.tar.xz +mirror://xorg/individual/app/xev-1.2.5.tar.xz +mirror://xorg/individual/app/xeyes-1.3.0.tar.xz +mirror://xorg/individual/app/xfd-1.1.4.tar.xz +mirror://xorg/individual/app/xfontsel-1.1.0.tar.xz +mirror://xorg/individual/app/xfs-1.2.1.tar.xz +mirror://xorg/individual/app/xfsinfo-1.0.7.tar.xz +mirror://xorg/individual/app/xgamma-1.0.7.tar.xz +mirror://xorg/individual/app/xgc-1.0.6.tar.xz +mirror://xorg/individual/app/xhost-1.0.9.tar.xz +mirror://xorg/individual/app/xinit-1.4.2.tar.xz +mirror://xorg/individual/app/xinput-1.6.4.tar.xz +mirror://xorg/individual/app/xkbcomp-1.4.7.tar.xz +mirror://xorg/individual/app/xkbevd-1.1.5.tar.xz +mirror://xorg/individual/app/xkbprint-1.0.6.tar.xz +mirror://xorg/individual/app/xkbutils-1.0.6.tar.xz +mirror://xorg/individual/app/xkill-1.0.6.tar.xz +mirror://xorg/individual/app/xload-1.1.4.tar.xz +mirror://xorg/individual/app/xlsatoms-1.1.4.tar.xz +mirror://xorg/individual/app/xlsclients-1.1.5.tar.xz +mirror://xorg/individual/app/xlsfonts-1.0.7.tar.xz +mirror://xorg/individual/app/xmag-1.0.7.tar.xz +mirror://xorg/individual/app/xmessage-1.0.6.tar.xz +mirror://xorg/individual/app/xmodmap-1.0.11.tar.xz +mirror://xorg/individual/app/xmore-1.0.4.tar.xz +mirror://xorg/individual/app/xpr-1.1.0.tar.xz +mirror://xorg/individual/app/xprop-1.2.7.tar.xz +mirror://xorg/individual/app/xrandr-1.5.2.tar.xz +mirror://xorg/individual/app/xrdb-1.2.2.tar.xz +mirror://xorg/individual/app/xrefresh-1.0.7.tar.xz +mirror://xorg/individual/app/xset-1.2.5.tar.xz +mirror://xorg/individual/app/xsetroot-1.1.3.tar.xz +mirror://xorg/individual/app/xsm-1.0.5.tar.xz +mirror://xorg/individual/app/xstdcmap-1.0.5.tar.xz +mirror://xorg/individual/app/xtrap-1.0.3.tar.bz2 +mirror://xorg/individual/app/xvinfo-1.1.5.tar.xz +mirror://xorg/individual/app/xwd-1.0.9.tar.xz +mirror://xorg/individual/app/xwininfo-1.1.6.tar.xz +mirror://xorg/individual/app/xwud-1.0.6.tar.xz +mirror://xorg/individual/data/xbitmaps-1.1.3.tar.xz +mirror://xorg/individual/data/xcursor-themes-1.0.7.tar.xz +mirror://xorg/individual/data/xkeyboard-config/xkeyboard-config-2.41.tar.xz +mirror://xorg/individual/doc/xorg-docs-1.7.2.tar.gz +mirror://xorg/individual/doc/xorg-sgml-doctools-1.12.tar.gz +mirror://xorg/individual/driver/xf86-input-evdev-2.10.6.tar.bz2 +mirror://xorg/individual/driver/xf86-input-joystick-1.6.4.tar.xz +mirror://xorg/individual/driver/xf86-input-keyboard-2.0.0.tar.xz +mirror://xorg/individual/driver/xf86-input-libinput-1.4.0.tar.xz +mirror://xorg/individual/driver/xf86-input-mouse-1.9.5.tar.xz +mirror://xorg/individual/driver/xf86-input-synaptics-1.9.2.tar.xz +mirror://xorg/individual/driver/xf86-input-vmmouse-13.2.0.tar.xz +mirror://xorg/individual/driver/xf86-input-void-1.4.2.tar.xz +mirror://xorg/individual/driver/xf86-video-amdgpu-23.0.0.tar.xz +mirror://xorg/individual/driver/xf86-video-apm-1.3.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-ark-0.7.6.tar.xz +mirror://xorg/individual/driver/xf86-video-ast-1.1.6.tar.xz +mirror://xorg/individual/driver/xf86-video-ati-22.0.0.tar.xz +mirror://xorg/individual/driver/xf86-video-chips-1.4.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-cirrus-1.6.0.tar.xz +mirror://xorg/individual/driver/xf86-video-dummy-0.4.1.tar.xz +mirror://xorg/individual/driver/xf86-video-fbdev-0.5.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-geode-2.11.21.tar.xz +mirror://xorg/individual/driver/xf86-video-glide-1.2.2.tar.bz2 +mirror://xorg/individual/driver/xf86-video-glint-1.2.9.tar.bz2 +mirror://xorg/individual/driver/xf86-video-i128-1.4.1.tar.xz +mirror://xorg/individual/driver/xf86-video-i740-1.4.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-intel-2.99.917.tar.bz2 +mirror://xorg/individual/driver/xf86-video-mga-2.0.1.tar.xz +mirror://xorg/individual/driver/xf86-video-neomagic-1.3.1.tar.xz +mirror://xorg/individual/driver/xf86-video-newport-0.2.4.tar.bz2 +https://gitlab.freedesktop.org/xorg/driver/xf86-video-nouveau/-/archive/3ee7cbca8f9144a3bb5be7f71ce70558f548d268/xf86-video-nouveau-3ee7cbca8f9144a3bb5be7f71ce70558f548d268.tar.bz2 +mirror://xorg/individual/driver/xf86-video-nv-2.1.22.tar.xz +mirror://xorg/individual/driver/xf86-video-omap-0.4.5.tar.bz2 +mirror://xorg/individual/driver/xf86-video-openchrome-0.6.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-qxl-0.1.6.tar.xz +mirror://xorg/individual/driver/xf86-video-r128-6.12.1.tar.xz +mirror://xorg/individual/driver/xf86-video-rendition-4.2.7.tar.bz2 +mirror://xorg/individual/driver/xf86-video-s3virge-1.11.1.tar.xz +mirror://xorg/individual/driver/xf86-video-savage-2.4.0.tar.xz +mirror://xorg/individual/driver/xf86-video-siliconmotion-1.7.10.tar.xz +mirror://xorg/individual/driver/xf86-video-sis-0.12.0.tar.gz +mirror://xorg/individual/driver/xf86-video-sisusb-0.9.7.tar.bz2 +mirror://xorg/individual/driver/xf86-video-suncg6-1.1.3.tar.xz +mirror://xorg/individual/driver/xf86-video-sunffb-1.2.3.tar.xz +mirror://xorg/individual/driver/xf86-video-sunleo-1.2.3.tar.xz +mirror://xorg/individual/driver/xf86-video-tdfx-1.5.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-tga-1.2.2.tar.bz2 +mirror://xorg/individual/driver/xf86-video-trident-1.4.0.tar.xz +mirror://xorg/individual/driver/xf86-video-v4l-0.3.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-vboxvideo-1.0.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-vesa-2.6.0.tar.xz +mirror://xorg/individual/driver/xf86-video-vmware-13.4.0.tar.xz +mirror://xorg/individual/driver/xf86-video-voodoo-1.2.6.tar.xz +mirror://xorg/individual/driver/xf86-video-wsfb-0.4.0.tar.bz2 +mirror://xorg/individual/driver/xf86-video-xgi-1.6.1.tar.bz2 +mirror://xorg/individual/font/encodings-1.0.7.tar.xz +mirror://xorg/individual/font/font-adobe-75dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-adobe-100dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-adobe-utopia-75dpi-1.0.5.tar.xz +mirror://xorg/individual/font/font-adobe-utopia-100dpi-1.0.5.tar.xz +mirror://xorg/individual/font/font-adobe-utopia-type1-1.0.5.tar.xz +mirror://xorg/individual/font/font-alias-1.0.5.tar.xz +mirror://xorg/individual/font/font-arabic-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-75dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-100dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-lucidatypewriter-75dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-lucidatypewriter-100dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-ttf-1.0.4.tar.xz +mirror://xorg/individual/font/font-bh-type1-1.0.4.tar.xz +mirror://xorg/individual/font/font-bitstream-75dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bitstream-100dpi-1.0.4.tar.xz +mirror://xorg/individual/font/font-bitstream-speedo-1.0.2.tar.gz +mirror://xorg/individual/font/font-bitstream-type1-1.0.4.tar.xz +mirror://xorg/individual/font/font-cronyx-cyrillic-1.0.4.tar.xz +mirror://xorg/individual/font/font-cursor-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-daewoo-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-dec-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-ibm-type1-1.0.4.tar.xz +mirror://xorg/individual/font/font-isas-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-jis-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-micro-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-misc-cyrillic-1.0.4.tar.xz +mirror://xorg/individual/font/font-misc-ethiopic-1.0.5.tar.xz +mirror://xorg/individual/font/font-misc-meltho-1.0.4.tar.xz +mirror://xorg/individual/font/font-misc-misc-1.1.3.tar.xz +mirror://xorg/individual/font/font-mutt-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-schumacher-misc-1.1.3.tar.xz +mirror://xorg/individual/font/font-screen-cyrillic-1.0.5.tar.xz +mirror://xorg/individual/font/font-sony-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-sun-misc-1.0.4.tar.xz +mirror://xorg/individual/font/font-util-1.4.1.tar.xz +mirror://xorg/individual/font/font-winitzki-cyrillic-1.0.4.tar.xz +mirror://xorg/individual/font/font-xfree86-type1-1.0.5.tar.xz +mirror://xorg/individual/lib/libAppleWM-1.4.1.tar.bz2 +mirror://xorg/individual/lib/libdmx-1.1.5.tar.xz +mirror://xorg/individual/lib/libfontenc-1.1.7.tar.xz +mirror://xorg/individual/lib/libFS-1.0.9.tar.xz +mirror://xorg/individual/lib/libICE-1.1.1.tar.xz +mirror://xorg/individual/lib/libpciaccess-0.18.tar.xz +mirror://xorg/individual/lib/libSM-1.2.4.tar.xz +mirror://xorg/individual/lib/libWindowsWM-1.0.1.tar.bz2 +mirror://xorg/individual/lib/libX11-1.8.7.tar.xz +mirror://xorg/individual/lib/libXau-1.0.11.tar.xz +mirror://xorg/individual/lib/libXaw-1.0.15.tar.xz +mirror://xorg/individual/lib/libxcb-1.16.tar.xz +mirror://xorg/individual/lib/libXcomposite-0.4.6.tar.xz +mirror://xorg/individual/lib/libXcursor-1.2.2.tar.xz +mirror://xorg/individual/lib/libxcvt-0.1.2.tar.xz +mirror://xorg/individual/lib/libXdamage-1.1.6.tar.xz +mirror://xorg/individual/lib/libXdmcp-1.1.4.tar.xz +mirror://xorg/individual/lib/libXext-1.3.6.tar.xz +mirror://xorg/individual/lib/libXfixes-6.0.1.tar.xz +mirror://xorg/individual/lib/libXfont-1.5.4.tar.bz2 +mirror://xorg/individual/lib/libXfont2-2.0.6.tar.xz +mirror://xorg/individual/lib/libXft-2.3.8.tar.xz +mirror://xorg/individual/lib/libXi-1.8.1.tar.xz +mirror://xorg/individual/lib/libXinerama-1.1.5.tar.xz +mirror://xorg/individual/lib/libxkbfile-1.1.3.tar.xz +mirror://xorg/individual/lib/libXmu-1.1.4.tar.xz +mirror://xorg/individual/lib/libXp-1.0.4.tar.xz +mirror://xorg/individual/lib/libXpm-3.5.17.tar.xz +mirror://xorg/individual/lib/libXpresent-1.0.1.tar.xz +mirror://xorg/individual/lib/libXrandr-1.5.4.tar.xz +mirror://xorg/individual/lib/libXrender-0.9.11.tar.xz +mirror://xorg/individual/lib/libXres-1.2.2.tar.xz +mirror://xorg/individual/lib/libXScrnSaver-1.2.4.tar.xz +mirror://xorg/individual/lib/libxshmfence-1.3.2.tar.xz +mirror://xorg/individual/lib/libXTrap-1.0.1.tar.bz2 +mirror://xorg/individual/lib/libXt-1.3.0.tar.xz +mirror://xorg/individual/lib/libXtst-1.2.4.tar.xz +mirror://xorg/individual/lib/libXv-1.0.12.tar.xz +mirror://xorg/individual/lib/libXvMC-1.0.14.tar.xz +mirror://xorg/individual/lib/libXxf86dga-1.1.6.tar.xz +mirror://xorg/individual/lib/libXxf86misc-1.0.4.tar.bz2 +mirror://xorg/individual/lib/libXxf86vm-1.1.5.tar.xz +mirror://xorg/individual/lib/xcb-util-cursor-0.1.5.tar.xz +mirror://xorg/individual/lib/xtrans-1.5.0.tar.xz +mirror://xorg/individual/proto/xcb-proto-1.16.0.tar.xz +mirror://xorg/individual/proto/xorgproto-2023.2.tar.xz +mirror://xorg/individual/util/bdftopcf-1.1.1.tar.xz +mirror://xorg/individual/util/gccmakedep-1.0.3.tar.bz2 +mirror://xorg/individual/util/imake-1.0.10.tar.xz +mirror://xorg/individual/util/lndir-1.0.4.tar.xz +mirror://xorg/individual/util/makedepend-1.0.9.tar.xz +mirror://xorg/individual/util/util-macros-1.20.0.tar.xz +mirror://xorg/individual/util/xorg-cf-files-1.0.8.tar.xz +mirror://xorg/individual/xserver/xorg-server-21.1.13.tar.xz diff --git a/pkgs/by-name/xo/xorg/use_crocus_and_iris.patch b/pkgs/by-name/xo/xorg/use_crocus_and_iris.patch new file mode 100644 index 0000000..54744f4 --- /dev/null +++ b/pkgs/by-name/xo/xorg/use_crocus_and_iris.patch @@ -0,0 +1,28 @@ +--- a/src/uxa/intel_dri.c ++++ b/src/uxa/intel_dri.c +@@ -1540,8 +1540,10 @@ + return has_i830_dri() ? "i830" : "i915"; + else if (INTEL_INFO(intel)->gen < 040) + return "i915"; ++ else if (INTEL_INFO(intel)->gen < 0100) ++ return "crocus"; + else +- return "i965"; ++ return "iris"; + } + + return s; +--- a/src/sna/sna_dri2.c ++++ b/src/sna/sna_dri2.c +@@ -3707,8 +3707,10 @@ + return has_i830_dri() ? "i830" : "i915"; + else if (sna->kgem.gen < 040) + return "i915"; ++ else if (sna->kgem.gen < 0100) ++ return "crocus"; + else +- return "i965"; ++ return "iris"; + } + + return s; diff --git a/pkgs/by-name/xo/xorg/xcb-util-xrm.nix b/pkgs/by-name/xo/xorg/xcb-util-xrm.nix new file mode 100644 index 0000000..0235ad2 --- /dev/null +++ b/pkgs/by-name/xo/xorg/xcb-util-xrm.nix @@ -0,0 +1,24 @@ +{ lib, stdenv, fetchurl, pkg-config, m4, libxcb, xcbutil, libX11 }: + +stdenv.mkDerivation rec { + version = "1.3"; + pname = "xcb-util-xrm"; + + src = fetchurl { + url = "https://github.com/Airblader/xcb-util-xrm/releases/download/v${version}/${pname}-${version}.tar.bz2"; + sha256 = "118cj1ybw86pgw0l5whn9vbg5n5b0ijcpx295mwahzi004vz671h"; + }; + + strictDeps = true; + + nativeBuildInputs = [ pkg-config m4 ]; + doCheck = true; + buildInputs = [ libxcb xcbutil libX11 ]; + + meta = with lib; { + description = "XCB utility functions for the X resource manager"; + homepage = "https://github.com/Airblader/xcb-util-xrm"; + license = licenses.mit; # X11 variant + platforms = with platforms; unix; + }; +} diff --git a/pkgs/by-name/xo/xorg/xwayland.nix b/pkgs/by-name/xo/xorg/xwayland.nix new file mode 100644 index 0000000..a34e128 --- /dev/null +++ b/pkgs/by-name/xo/xorg/xwayland.nix @@ -0,0 +1,126 @@ +{ egl-wayland +, libepoxy +, fetchurl +, fontutil +, lib +, libei +, libGL +, libGLU +, libX11 +, libXau +, libXaw +, libXdmcp +, libXext +, libXfixes +, libXfont2 +, libXmu +, libXpm +, libXrender +, libXres +, libXt +, libdrm +, libtirpc +, withLibunwind ? true, libunwind +, libxcb +, libxkbfile +, libxshmfence +, libxcvt +, mesa +, meson +, ninja +, openssl +, pkg-config +, pixman +, stdenv +, wayland +, wayland-protocols +, wayland-scanner +, xkbcomp +, xkeyboard_config +, xorgproto +, xtrans +, zlib +, defaultFontPath ? "" +, gitUpdater +}: + +stdenv.mkDerivation rec { + pname = "xwayland"; + version = "23.2.6"; + + src = fetchurl { + url = "mirror://xorg/individual/xserver/${pname}-${version}.tar.xz"; + hash = "sha256-HJo2a058ytug+b0xPFnq4S0jvXJUOyKibq+LIINc/G0="; + }; + + depsBuildBuild = [ + pkg-config + ]; + nativeBuildInputs = [ + pkg-config + meson + ninja + wayland-scanner + ]; + buildInputs = [ + egl-wayland + libepoxy + libei + fontutil + libGL + libGLU + libX11 + libXau + libXaw + libXdmcp + libXext + libXfixes + libXfont2 + libXmu + libXpm + libXrender + libXres + libXt + libdrm + libtirpc + libxcb + libxkbfile + libxshmfence + libxcvt + mesa + openssl + pixman + wayland + wayland-protocols + xkbcomp + xorgproto + xtrans + zlib + ] ++ lib.optionals withLibunwind [ + libunwind + ]; + mesonFlags = [ + (lib.mesonBool "xwayland_eglstream" true) + (lib.mesonBool "xcsecurity" true) + (lib.mesonOption "default_font_path" defaultFontPath) + (lib.mesonOption "xkb_bin_dir" "${xkbcomp}/bin") + (lib.mesonOption "xkb_dir" "${xkeyboard_config}/etc/X11/xkb") + (lib.mesonOption "xkb_output_dir" "${placeholder "out"}/share/X11/xkb/compiled") + (lib.mesonBool "libunwind" withLibunwind) + ]; + + passthru.updateScript = gitUpdater { + # No nicer place to find latest release. + url = "https://gitlab.freedesktop.org/xorg/xserver.git"; + rev-prefix = "xwayland-"; + }; + + meta = with lib; { + description = "An X server for interfacing X11 apps with the Wayland protocol"; + homepage = "https://wayland.freedesktop.org/xserver.html"; + license = licenses.mit; + mainProgram = "Xwayland"; + maintainers = with maintainers; [ emantor ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/by-name/xz/xz/default.nix b/pkgs/by-name/xz/xz/default.nix new file mode 100644 index 0000000..fae306a --- /dev/null +++ b/pkgs/by-name/xz/xz/default.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, fetchurl +, enableStatic ? stdenv.hostPlatform.isStatic +, writeScript +# for passthru.tests +# , testers +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +stdenv.mkDerivation (finalAttrs: { + pname = "xz"; + version = "5.4.6"; # Beware of CVE-2024-3094 and related risks!!! + + src = fetchurl { + url = with finalAttrs; + # The original URL has been taken down. + # "https://github.com/tukaani-project/xz/releases/download/v${version}/xz-${version}.tar.bz2"; + "mirror://sourceforge/lzmautils/xz-${version}.tar.bz2"; + sha256 = "sha256-kThRsnTo4dMXgeyUnxwj6NvPDs9uc6JDbcIXad0+b0k="; + }; + + strictDeps = true; + outputs = [ "bin" "dev" "out" "man" "doc" ]; + + configureFlags = lib.optional enableStatic "--disable-shared"; + + enableParallelBuilding = true; + doCheck = true; + + preCheck = '' + # Tests have a /bin/sh dependency... + patchShebangs tests + ''; + + # In stdenv-linux, prevent a dependency on bootstrap-tools. + preConfigure = "CONFIG_SHELL=/bin/sh"; + + postInstall = "rm -rf $out/share/doc"; + + # passthru = { + # updateScript = writeScript "update-xz" '' + # #!/usr/bin/env nix-shell + # #!nix-shell -i bash -p curl pcre common-updater-scripts + + # set -eu -o pipefail + + # # Expect the text in format of '>xz-5.2.6.tar.bz2' + # # We pick first match where a stable release goes first. + # new_version="$(curl -s https://tukaani.org/xz/ | + # pcregrep -o1 '>xz-([0-9.]+)[.]tar[.]bz2' | + # head -n1)" + # update-source-version ${finalAttrs.pname} "$new_version" + # ''; + # tests.pkg-config = testers.hasPkgConfigModules { + # package = finalAttrs.finalPackage; + # }; + # }; + + meta = with lib; { + homepage = "https://tukaani.org/xz/"; + description = "A general-purpose data compression software, successor of LZMA"; + + longDescription = + '' XZ Utils is free general-purpose data compression software with high + compression ratio. XZ Utils were written for POSIX-like systems, + but also work on some not-so-POSIX systems. XZ Utils are the + successor to LZMA Utils. + + The core of the XZ Utils compression code is based on LZMA SDK, but + it has been modified quite a lot to be suitable for XZ Utils. The + primary compression algorithm is currently LZMA2, which is used + inside the .xz container format. With typical files, XZ Utils + create 30 % smaller output than gzip and 15 % smaller output than + bzip2. + ''; + + license = with licenses; [ gpl2Plus lgpl21Plus ]; + maintainers = with maintainers; [ sander ]; + platforms = platforms.all; + pkgConfigModules = [ "liblzma" ]; + }; +}) diff --git a/pkgs/by-name/zl/zlib/default.nix b/pkgs/by-name/zl/zlib/default.nix new file mode 100644 index 0000000..029a1bd --- /dev/null +++ b/pkgs/by-name/zl/zlib/default.nix @@ -0,0 +1,146 @@ +{ lib, stdenv +, fetchurl +, shared ? !stdenv.hostPlatform.isStatic +, static ? true +# If true, a separate .static ouput is created and the .a is moved there. +# In this case `pkg-config` auto detection does not currently work if the +# .static output is given as `buildInputs` to another package (#66461), because +# the `.pc` file lists only the main output's lib dir. +# If false, and if `{ static = true; }`, the .a stays in the main output. +, splitStaticOutput ? shared && static +# for passthru.tests +# , testers +# , minizip +}: + +# Without either the build will actually still succeed because the build +# system makes an arbitrary choice, but we shouldn't be so indecisive. +assert shared || static; + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert splitStaticOutput -> static; + +stdenv.mkDerivation (finalAttrs: { + pname = "zlib"; + version = "1.3.1"; + + src = let + inherit (finalAttrs) version; + in fetchurl { + urls = [ + # This URL works for 1.2.13 only; hopefully also for future releases. + "https://github.com/madler/zlib/releases/download/v${version}/zlib-${version}.tar.gz" + # Stable archive path, but captcha can be encountered, causing hash mismatch. + "https://www.zlib.net/fossils/zlib-${version}.tar.gz" + ]; + hash = "sha256-mpOyt9/ax3zrpaVYpYDnRmfdb+3kWFuR7vtg8Dty3yM="; + }; + + postPatch = lib.optionalString stdenv.hostPlatform.isDarwin '' + substituteInPlace configure \ + --replace '/usr/bin/libtool' '${stdenv.cc.targetPrefix}ar' \ + --replace 'AR="libtool"' 'AR="${stdenv.cc.targetPrefix}ar"' \ + --replace 'ARFLAGS="-o"' 'ARFLAGS="-r"' + ''; + + strictDeps = true; + outputs = [ "out" "dev" ] + ++ lib.optional splitStaticOutput "static"; + setOutputFlags = false; + outputDoc = "dev"; # single tiny man3 page + + dontConfigure = stdenv.hostPlatform.isMinGW; + + preConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + export CHOST=${stdenv.hostPlatform.config} + ''; + + # For zlib's ./configure (as of version 1.2.11), the order + # of --static/--shared flags matters! + # `--shared --static` builds only static libs, while + # `--static --shared` builds both. + # So we use the latter order to be able to build both. + # Also, giving just `--shared` builds both, + # giving just `--static` builds only static, + # and giving nothing builds both. + # So we have 3 possible ways to build both: + # `--static --shared`, `--shared` and giving nothing. + # Of these, we choose `--static --shared`, for clarity and simpler + # conditions. + configureFlags = lib.optional static "--static" + ++ lib.optional shared "--shared"; + # We do the right thing manually, above, so don't need these. + dontDisableStatic = true; + dontAddStaticConfigureFlags = true; + + # Note we don't need to set `dontDisableStatic`, because static-disabling + # works by grepping for `enable-static` in the `./configure` script + # (see `pkgs/stdenv/generic/setup.sh`), and zlib's handwritten one does + # not have such. + # It wouldn't hurt setting `dontDisableStatic = static && !splitStaticOutput` + # here (in case zlib ever switches to autoconf in the future), + # but we don't do it simply to avoid mass rebuilds. + + postInstall = lib.optionalString splitStaticOutput '' + moveToOutput lib/libz.a "$static" + '' + # jww (2015-01-06): Sometimes this library install as a .so, even on + # Darwin; others time it installs as a .dylib. I haven't yet figured out + # what causes this difference. + + lib.optionalString stdenv.hostPlatform.isDarwin '' + for file in $out/lib/*.so* $out/lib/*.dylib* ; do + ${stdenv.cc.bintools.targetPrefix}install_name_tool -id "$file" $file + done + '' + # Non-typical naming confuses libtool which then refuses to use zlib's DLL + # in some cases, e.g. when compiling libpng. + + lib.optionalString (stdenv.hostPlatform.isMinGW && shared) '' + ln -s zlib1.dll $out/bin/libz.dll + ''; + + # As zlib takes part in the stdenv building, we don't want references + # to the bootstrap-tools libgcc (as uses to happen on arm/mips) + env.NIX_CFLAGS_COMPILE = lib.optionalString (!stdenv.hostPlatform.isDarwin) "-static-libgcc"; + + # We don't strip on static cross-compilation because of reports that native + # stripping corrupted the target library; see commit 12e960f5 for the report. + dontStrip = stdenv.hostPlatform != stdenv.buildPlatform && static; + configurePlatforms = []; + + installFlags = lib.optionals stdenv.hostPlatform.isMinGW [ + "BINARY_PATH=$(out)/bin" + "INCLUDE_PATH=$(dev)/include" + "LIBRARY_PATH=$(out)/lib" + ]; + + enableParallelBuilding = true; + doCheck = true; + + makeFlags = [ + "PREFIX=${stdenv.cc.targetPrefix}" + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ + "-f" "win32/Makefile.gcc" + ] ++ lib.optionals shared [ + # Note that as of writing (zlib 1.2.11), this flag only has an effect + # for Windows as it is specific to `win32/Makefile.gcc`. + "SHARED_MODE=1" + ]; + + # passthru.tests = { + # pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + # # uses `zlib` derivation: + # inherit minizip; + # }; + + meta = with lib; { + homepage = "https://zlib.net"; + description = "Lossless data-compression library"; + license = licenses.zlib; + platforms = platforms.all; + pkgConfigModules = [ "zlib" ]; + }; +}) diff --git a/pkgs/by-name/zs/zstd/default.nix b/pkgs/by-name/zs/zstd/default.nix new file mode 100644 index 0000000..eebc258 --- /dev/null +++ b/pkgs/by-name/zs/zstd/default.nix @@ -0,0 +1,129 @@ +{ lib, stdenv, fetchFromGitHub, cmake, bash, gnugrep +, fixDarwinDylibNames +, file +, legacySupport ? false +, static ? stdenv.hostPlatform.isStatic # generates static libraries *only* +, enableStatic ? static +# these need to be ran on the host, thus disable when cross-compiling +, buildContrib ? stdenv.hostPlatform == stdenv.buildPlatform +, doCheck ? stdenv.hostPlatform == stdenv.buildPlatform + +# for passthru.tests +# , nix-update-script +# , libarchive +# , rocksdb +# , arrow-cpp +# , libzip +# , curl +# , python3Packages +# , haskellPackages +}: + +stdenv.mkDerivation rec { + pname = "zstd"; + version = "1.5.6"; + + src = fetchFromGitHub { + owner = "facebook"; + repo = "zstd"; + rev = "v${version}"; + hash = "sha256-qcd92hQqVBjMT3hyntjcgk29o9wGQsg5Hg7HE5C0UNc="; + }; + + nativeBuildInputs = [ cmake ] + ++ lib.optional stdenv.isDarwin fixDarwinDylibNames; + buildInputs = lib.optional stdenv.hostPlatform.isUnix bash; + + patches = [ + # This patches makes sure we do not attempt to use the MD5 implementation + # of the host platform when running the tests + ./playtests-darwin.patch + ]; + + postPatch = lib.optionalString (!static) '' + substituteInPlace build/cmake/CMakeLists.txt \ + --replace 'message(SEND_ERROR "You need to build static library to build tests")' "" + substituteInPlace build/cmake/tests/CMakeLists.txt \ + --replace 'libzstd_static' 'libzstd_shared' + sed -i \ + "1aexport ${lib.optionalString stdenv.isDarwin "DY"}LD_LIBRARY_PATH=$PWD/build_/lib" \ + tests/playTests.sh + ''; + + cmakeFlags = lib.attrsets.mapAttrsToList + (name: value: "-DZSTD_${name}:BOOL=${if value then "ON" else "OFF"}") { + BUILD_SHARED = !static; + BUILD_STATIC = enableStatic; + BUILD_CONTRIB = buildContrib; + PROGRAMS_LINK_SHARED = !static; + LEGACY_SUPPORT = legacySupport; + BUILD_TESTS = doCheck; + }; + + cmakeDir = "../build/cmake"; + dontUseCmakeBuildDir = true; + preConfigure = '' + mkdir -p build_ && cd $_ + ''; + + nativeCheckInputs = [ file ]; + inherit doCheck; + checkPhase = '' + runHook preCheck + # Patch shebangs for playTests + patchShebangs ../programs/zstdgrep + ctest -R playTests # The only relatively fast test. + runHook postCheck + ''; + + preInstall = '' + mkdir -p $bin/bin + substituteInPlace ../programs/zstdgrep \ + --replace ":-grep" ":-${gnugrep}/bin/grep" \ + --replace ":-zstdcat" ":-$bin/bin/zstdcat" + + substituteInPlace ../programs/zstdless \ + --replace "zstdcat" "$bin/bin/zstdcat" + '' + lib.optionalString buildContrib ( + '' + cp contrib/pzstd/pzstd $bin/bin/pzstd + '' + lib.optionalString stdenv.isDarwin '' + install_name_tool -change @rpath/libzstd.1.dylib $out/lib/libzstd.1.dylib $bin/bin/pzstd + '' + ); + + outputs = [ "bin" "dev" ] + ++ lib.optional stdenv.hostPlatform.isUnix "man" + ++ [ "out" ]; + + # passthru = { + # updateScript = nix-update-script { }; + # tests = { + # inherit libarchive rocksdb arrow-cpp; + # libzip = libzip.override { withZstd = true; }; + # curl = curl.override { zstdSupport = true; }; + # python-zstd = python3Packages.zstd; + # haskell-zstd = haskellPackages.zstd; + # haskell-hs-zstd = haskellPackages.hs-zstd; + # }; + # }; + + meta = with lib; { + description = "Zstandard real-time compression algorithm"; + longDescription = '' + Zstd, short for Zstandard, is a fast lossless compression algorithm, + targeting real-time compression scenarios at zlib-level compression + ratio. Zstd can also offer stronger compression ratio at the cost of + compression speed. Speed/ratio trade-off is configurable by small + increment, to fit different situations. Note however that decompression + speed is preserved and remain roughly the same at all settings, a + property shared by most LZ compression algorithms, such as zlib. + ''; + homepage = "https://facebook.github.io/zstd/"; + changelog = "https://github.com/facebook/zstd/blob/v${version}/CHANGELOG"; + license = with licenses; [ bsd3 ]; # Or, at your opinion, GPL-2.0-only. + + platforms = platforms.all; + maintainers = with maintainers; [ orivej ]; + }; +} diff --git a/pkgs/by-name/zs/zstd/packages.nix b/pkgs/by-name/zs/zstd/packages.nix new file mode 100644 index 0000000..db501f7 --- /dev/null +++ b/pkgs/by-name/zs/zstd/packages.nix @@ -0,0 +1,9 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + zstd = callPackage ./. { + cmake = buildPackages.cmakeMinimal; + }; +} diff --git a/pkgs/by-name/zs/zstd/playtests-darwin.patch b/pkgs/by-name/zs/zstd/playtests-darwin.patch new file mode 100644 index 0000000..454489a --- /dev/null +++ b/pkgs/by-name/zs/zstd/playtests-darwin.patch @@ -0,0 +1,40 @@ +--- a/tests/playTests.sh ++++ b/tests/playTests.sh +@@ -112,29 +112,19 @@ case "$OS" in + esac + + case "$UNAME" in +- Darwin) MD5SUM="md5 -r" ;; +- FreeBSD) MD5SUM="gmd5sum" ;; +- NetBSD) MD5SUM="md5 -n" ;; +- OpenBSD) MD5SUM="md5" ;; + *) MD5SUM="md5sum" ;; + esac + + MTIME="stat -c %Y" +-case "$UNAME" in +- Darwin | FreeBSD | OpenBSD | NetBSD) MTIME="stat -f %m" ;; +-esac + + assertSameMTime() { + MT1=$($MTIME "$1") + MT2=$($MTIME "$2") + echo MTIME $MT1 $MT2 + [ "$MT1" = "$MT2" ] || die "mtime on $1 doesn't match mtime on $2 ($MT1 != $MT2)" + } + + GET_PERMS="stat -c %a" +-case "$UNAME" in +- Darwin | FreeBSD | OpenBSD | NetBSD) GET_PERMS="stat -f %Lp" ;; +-esac + + assertFilePermissions() { + STAT1=$($GET_PERMS "$1") +@@ -967,7 +957,6 @@ $MD5SUM dirTestDict/* > tmph1 + zstd -f --rm dirTestDict/* -D tmpDictC + zstd -d --rm dirTestDict/*.zst -D tmpDictC # note : use internal checksum by default + case "$UNAME" in +- Darwin) println "md5sum -c not supported on OS-X : test skipped" ;; # not compatible with OS-X's md5 + *) $MD5SUM -c tmph1 ;; + esac + rm -rf dirTestDict diff --git a/pkgs/common-updater/combinators.nix b/pkgs/common-updater/combinators.nix new file mode 100644 index 0000000..d60a6e7 --- /dev/null +++ b/pkgs/common-updater/combinators.nix @@ -0,0 +1,158 @@ +{ lib +}: + +/* + This is a set of tools to manipulate update scripts as recognized by update.nix. + It is still very experimental with **instability** almost guaranteed so any use + outside Nixpkgs is discouraged. + + update.nix currently accepts the following type: + + type UpdateScript + // Simple path to script to execute script + = FilePath + // Path to execute plus arguments to pass it + | [ (FilePath | String) ] + // Advanced attribue set (experimental) + | { + // Script to execute (same as basic update script above) + command : (FilePath | [ (FilePath | String) ]) + // Features that the script supports + // - commit: (experimental) returns commit message in stdout + // - silent: (experimental) returns no stdout + supportedFeatures : ?[ ("commit" | "silent") ] + // Override attribute path detected by update.nix + attrPath : ?String + } +*/ + +let + /* + type ShellArg = String | { __rawShell : String } + */ + + /* + Quotes all arguments to be safely passed to the Bourne shell. + + escapeShellArgs' : [ShellArg] -> String + */ + escapeShellArgs' = lib.concatMapStringsSep " " (arg: if arg ? __rawShell then arg.__rawShell else lib.escapeShellArg arg); + + /* + processArg : { maxArgIndex : Int, args : [ShellArg], paths : [FilePath] } → (String|FilePath) → { maxArgIndex : Int, args : [ShellArg], paths : [FilePath] } + Helper reducer function for building a command arguments where file paths are replaced with argv[x] reference. + */ + processArg = + { maxArgIndex, args, paths }: + arg: + if builtins.isPath arg then { + args = args ++ [ { __rawShell = "\"\$${builtins.toString maxArgIndex}\""; } ]; + maxArgIndex = maxArgIndex + 1; + paths = paths ++ [ arg ]; + } else { + args = args ++ [ arg ]; + inherit maxArgIndex paths; + }; + /* + extractPaths : Int → [ (String|FilePath) ] → { maxArgIndex : Int, args : [ShellArg], paths : [FilePath] } + Helper function that extracts file paths from command arguments and replaces them with argv[x] references. + */ + extractPaths = maxArgIndex: command: builtins.foldl' processArg { inherit maxArgIndex; args = [ ]; paths = [ ]; } command; + /* + processCommand : { maxArgIndex : Int, commands : [[ShellArg]], paths : [FilePath] } → [ (String|FilePath) ] → { maxArgIndex : Int, commands : [[ShellArg]], paths : [FilePath] } + Helper reducer function for extracting file paths from individual commands. + */ + processCommand = + { maxArgIndex, commands, paths }: + command: + let + new = extractPaths maxArgIndex command; + in + { + commands = commands ++ [ new.args ]; + paths = paths ++ new.paths; + maxArgIndex = new.maxArgIndex; + }; + /* + extractCommands : Int → [[ (String|FilePath) ]] → { maxArgIndex : Int, commands : [[ShellArg]], paths : [FilePath] } + Helper function for extracting file paths from a list of commands and replacing them with argv[x] references. + */ + extractCommands = maxArgIndex: commands: builtins.foldl' processCommand { inherit maxArgIndex; commands = [ ]; paths = [ ]; } commands; + + /* + commandsToShellInvocation : [[ (String|FilePath) ]] → [ (String|FilePath) ] + Converts a list of commands into a single command by turning them into a shell script and passing them to `sh -c`. + */ + commandsToShellInvocation = commands: + let + extracted = extractCommands 0 commands; + in + [ + "sh" + "-c" + (lib.concatMapStringsSep ";" escapeShellArgs' extracted.commands) + # We need paths as separate arguments so that update.nix can ensure they refer to the local directory + # rather than a store path. + ] ++ extracted.paths; +in +rec { + /* + normalize : UpdateScript → UpdateScript + EXPERIMENTAL! Converts a basic update script to the experimental attribute set form. + */ + normalize = updateScript: { + command = lib.toList (updateScript.command or updateScript); + supportedFeatures = updateScript.supportedFeatures or [ ]; + } // lib.optionalAttrs (updateScript ? attrPath) { + inherit (updateScript) attrPath; + }; + + /* + sequence : [UpdateScript] → UpdateScript + EXPERIMENTAL! Combines multiple update scripts to run in sequence. + */ + sequence = + scripts: + + let + scriptsNormalized = builtins.map normalize scripts; + in + let + scripts = scriptsNormalized; + hasCommitSupport = lib.findSingle ({ supportedFeatures, ... }: supportedFeatures == [ "commit" ]) null null scripts != null; + validateFeatures = + if hasCommitSupport then + ({ supportedFeatures, ... }: supportedFeatures == [ "commit" ] || supportedFeatures == [ "silent" ]) + else + ({ supportedFeatures, ... }: supportedFeatures == [ ]); + in + + assert lib.assertMsg (lib.all validateFeatures scripts) "Combining update scripts with features enabled (other than a single script with “commit” and all other with “silent”) is currently unsupported."; + assert lib.assertMsg (builtins.length (lib.unique (builtins.map ({ attrPath ? null, ... }: attrPath) scripts)) == 1) "Combining update scripts with different attr paths is currently unsupported."; + + { + command = commandsToShellInvocation (builtins.map ({ command, ... }: command) scripts); + supportedFeatures = lib.optionals hasCommitSupport [ + "commit" + ]; + }; + + /* + copyAttrOutputToFile : String → FilePath → UpdateScript + EXPERIMENTAL! Simple update script that copies the output of Nix derivation built by `attr` to `path`. + */ + copyAttrOutputToFile = + attr: + path: + + { + command = [ + "sh" + "-c" + "cp --no-preserve=all \"$(nix-build -A ${attr})\" \"$0\" > /dev/null" + path + ]; + supportedFeatures = [ "silent" ]; + }; + +} diff --git a/pkgs/common-updater/directory-listing-updater.nix b/pkgs/common-updater/directory-listing-updater.nix new file mode 100644 index 0000000..bd0b5b1 --- /dev/null +++ b/pkgs/common-updater/directory-listing-updater.nix @@ -0,0 +1,20 @@ +{ lib +, genericUpdater +, common-updater-scripts +}: + +{ pname ? null +, version ? null +, attrPath ? null +, ignoredVersions ? "" +, rev-prefix ? "" +, odd-unstable ? false +, patchlevel-unstable ? false +, url ? null +, extraRegex ? null +}: + +genericUpdater { + inherit pname version attrPath ignoredVersions rev-prefix odd-unstable patchlevel-unstable; + versionLister = "${common-updater-scripts}/bin/list-directory-versions ${lib.optionalString (url != null) "--url=${lib.escapeShellArg url}"} ${lib.optionalString (extraRegex != null) "--extra-regex=${lib.escapeShellArg extraRegex}"}"; +} diff --git a/pkgs/common-updater/generic-updater.nix b/pkgs/common-updater/generic-updater.nix new file mode 100644 index 0000000..25008d6 --- /dev/null +++ b/pkgs/common-updater/generic-updater.nix @@ -0,0 +1,124 @@ +{ stdenv, writeScript, coreutils, gnugrep, gnused, common-updater-scripts, nix }: + +{ name ? null +, pname ? null +, version ? null +, attrPath ? null +, versionLister +, ignoredVersions ? "" +, rev-prefix ? "" +, odd-unstable ? false +, patchlevel-unstable ? false +}: + +let + # where to print git commands and debugging messages + fileForGitCommands = "update-git-commits.txt"; + + # shell script to update package + updateScript = writeScript "generic-update-script.sh" '' + #! ${stdenv.shell} + set -o errexit + set -x + + name="$1" + pname="$2" + version="$3" + attr_path="$4" + version_lister="$5" + ignored_versions="$6" + rev_prefix="$7" + odd_unstable="$8" + patchlevel_unstable="$9" + + [[ -n "$name" ]] || name="$UPDATE_NIX_NAME" + [[ -n "$pname" ]] || pname="$UPDATE_NIX_PNAME" + [[ -n "$version" ]] || version="$UPDATE_NIX_OLD_VERSION" + [[ -n "$attr_path" ]] || attr_path="$UPDATE_NIX_ATTR_PATH" + + # print header + echo "# $name" >> ${fileForGitCommands} + + function version_is_ignored() { + local tag="$1" + [ -n "$ignored_versions" ] && grep -E "$ignored_versions" <<< "$tag" + } + + function version_is_unstable() { + local tag="$1" + local enforce="$2" + if [ -n "$odd_unstable" -o -n "$enforce" ]; then + local minor=$(echo "$tag" | ${gnused}/bin/sed -rne 's,^[0-9]+\.([0-9]+).*,\1,p') + if [ $((minor % 2)) -eq 1 ]; then + return 0 + fi + fi + if [ -n "$patchlevel_unstable" -o -n "$enforce" ]; then + local patchlevel=$(echo "$tag" | ${gnused}/bin/sed -rne 's,^[0-9]+\.[0-9]+\.([0-9]+).*$,\1,p') + if ((patchlevel >= 90)); then + return 0 + fi + fi + return 1 + } + + tags=$(sh -c "$version_lister --pname=$pname --attr-path=$attr_path --file=\"${fileForGitCommands}\"") || exit 1 + + # print available tags + for tag in $tags; do + echo "# found $pname version: $tag" >> ${fileForGitCommands} + done + + # cut any revision prefix not used in the NixOS package version + if [ -n "$rev_prefix" ]; then + tags=$(echo "$tags" | ${gnugrep}/bin/grep "^$rev_prefix") + tags=$(echo "$tags" | ${gnused}/bin/sed -e "s,^$rev_prefix,,") + fi + tags=$(echo "$tags" | ${gnugrep}/bin/grep "^[0-9]") + + # sort the tags in decreasing order + tags=$(echo "$tags" | ${coreutils}/bin/sort --reverse --version-sort) + + # find the newest tag + # do not consider development versions + for latest_tag in $tags; do + if version_is_ignored "$latest_tag"; then + echo "# skip ignored version: $pname-$latest_tag" >> ${fileForGitCommands} + latest_tag= + elif version_is_unstable "$latest_tag"; then + echo "# skip development version: $pname-$latest_tag" >> ${fileForGitCommands} + latest_tag= + else + if version_is_unstable "$latest_tag" "enforce"; then + echo "# use potential development version: $pname-$latest_tag" >> ${fileForGitCommands} + fi + break + fi + done + + if [ -n "$latest_tag" ]; then + # print commands to commit the changes + if [ "$version" != "$latest_tag" ]; then + pfile=$(EDITOR=echo ${nix}/bin/nix edit --extra-experimental-features nix-command -f. "$attr_path") + echo " git add $pfile " >> ${fileForGitCommands} + echo " git commit -m '$attr_path: $version -> $latest_tag'" >> ${fileForGitCommands} + fi + + # update the nix expression + ${common-updater-scripts}/bin/update-source-version --print-changes "$attr_path" "$latest_tag" + else + # No changes for commit protocol. + echo "[]" + fi + + echo "" >> ${fileForGitCommands} + ''; + +in { + name = "generic-update-script"; + command = [ updateScript name pname version attrPath versionLister ignoredVersions rev-prefix odd-unstable patchlevel-unstable ]; + supportedFeatures = [ + # Stdout must contain output according to the updateScript commit protocol when the update script finishes with a non-zero exit code. + "commit" + ]; +} diff --git a/pkgs/common-updater/git-updater.nix b/pkgs/common-updater/git-updater.nix new file mode 100644 index 0000000..86bf88a --- /dev/null +++ b/pkgs/common-updater/git-updater.nix @@ -0,0 +1,21 @@ +{ lib +, genericUpdater +, common-updater-scripts +}: + +{ pname ? null +, version ? null +, attrPath ? null +, ignoredVersions ? "" +, rev-prefix ? "" +, odd-unstable ? false +, patchlevel-unstable ? false +# an explicit url is needed when src.meta.homepage or src.url don't +# point to a git repo (eg. when using fetchurl, fetchzip, ...) +, url ? null +}: + +genericUpdater { + inherit pname version attrPath ignoredVersions rev-prefix odd-unstable patchlevel-unstable; + versionLister = "${common-updater-scripts}/bin/list-git-tags ${lib.optionalString (url != null) "--url=${url}"}"; +} diff --git a/pkgs/common-updater/http-two-levels-updater.nix b/pkgs/common-updater/http-two-levels-updater.nix new file mode 100644 index 0000000..4656163 --- /dev/null +++ b/pkgs/common-updater/http-two-levels-updater.nix @@ -0,0 +1,19 @@ +{ lib +, genericUpdater +, common-updater-scripts +}: + +{ pname ? null +, version ? null +, attrPath ? null +, ignoredVersions ? "" +, rev-prefix ? "" +, odd-unstable ? false +, patchlevel-unstable ? false +, url ? null +}: + +genericUpdater { + inherit pname version attrPath ignoredVersions rev-prefix odd-unstable patchlevel-unstable; + versionLister = "${common-updater-scripts}/bin/list-archive-two-levels-versions ${lib.optionalString (url != null) "--url=${lib.escapeShellArg url}"}"; +} diff --git a/pkgs/common-updater/nix-update.nix b/pkgs/common-updater/nix-update.nix new file mode 100644 index 0000000..342b167 --- /dev/null +++ b/pkgs/common-updater/nix-update.nix @@ -0,0 +1,7 @@ +{ lib, nix-update }: + +{ attrPath ? null +, extraArgs ? [ ] +}: + +[ "${lib.getExe nix-update}" ] ++ extraArgs ++ lib.optional (attrPath != null) attrPath diff --git a/pkgs/common-updater/packages.nix b/pkgs/common-updater/packages.nix new file mode 100644 index 0000000..2296121 --- /dev/null +++ b/pkgs/common-updater/packages.nix @@ -0,0 +1,21 @@ +{ ... }: +res: pkgs: super: + +with pkgs; +{ + common-updater-scripts = callPackage ./scripts.nix { }; + + genericUpdater = callPackage ./generic-updater.nix { }; + + _experimental-update-script-combinators = callPackage ./combinators.nix { }; + + directoryListingUpdater = callPackage ./directory-listing-updater.nix { }; + + gitUpdater = callPackage ./git-updater.nix { }; + + httpTwoLevelsUpdater = callPackage ./http-two-levels-updater.nix { }; + + unstableGitUpdater = callPackage ./unstable-updater.nix { }; + + nix-update-script = callPackage ./nix-update.nix { }; +} diff --git a/pkgs/common-updater/scripts.nix b/pkgs/common-updater/scripts.nix new file mode 100644 index 0000000..d5ee3b5 --- /dev/null +++ b/pkgs/common-updater/scripts.nix @@ -0,0 +1,44 @@ +{ lib +, stdenv +, makeWrapper +, coreutils +, diffutils +, git +, gnugrep +, gnused +, jq +, nix +, python3Packages +}: + +stdenv.mkDerivation { + name = "common-updater-scripts"; + + nativeBuildInputs = [ + makeWrapper + python3Packages.wrapPython + ]; + + pythonPath = [ + python3Packages.beautifulsoup4 + python3Packages.requests + ]; + + dontUnpack = true; + + installPhase = '' + mkdir -p $out/bin + cp ${./scripts}/* $out/bin + + # wrap non python scripts + for f in $out/bin/*; do + if ! (head -n1 "$f" | grep -q '#!.*/env.*\(python\|pypy\)'); then + wrapProgram $f --prefix PATH : ${lib.makeBinPath [ coreutils diffutils git gnugrep gnused jq nix ]} + fi + done + + # wrap python scripts + makeWrapperArgs+=( --prefix PATH : "${lib.makeBinPath [ nix ]}" ) + wrapPythonPrograms + ''; +} diff --git a/pkgs/common-updater/scripts/list-archive-two-levels-versions b/pkgs/common-updater/scripts/list-archive-two-levels-versions new file mode 100755 index 0000000..e7c02ed --- /dev/null +++ b/pkgs/common-updater/scripts/list-archive-two-levels-versions @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +# lists all available versions listed for a package in a site (http) + +pname="" # package name +attr_path="" # package attribute path +url="" # directory listing url +file="" # file for writing debugging information + +while (( $# > 0 )); do + flag="$1" + shift 1 + case "$flag" in + --pname=*) + pname="${flag#*=}" + ;; + --attr-path=*) + attr_path="${flag#*=}" + ;; + --url=*) + url="${flag#*=}" + ;; + --file=*) + file="${flag#*=}" + ;; + *) + echo "$0: unknown option ‘${flag}’" + exit 1 + ;; + esac +done + +if [[ -z "$pname" ]]; then + pname="$UPDATE_NIX_PNAME" +fi + +if [[ -z "$attr_path" ]]; then + attr_path="$UPDATE_NIX_ATTR_PATH" +fi + +# by default set url to the base dir of the first url in src.urls +if [[ -z "$url" ]]; then + url="$(nix-instantiate $systemArg --eval -E \ + "with import ./. {}; dirOf (dirOf (lib.head $attr_path.src.urls))" \ + | tr -d '"')" +fi + +# print a debugging message +if [[ -n "$file" ]]; then + echo "# Listing versions for '$pname' at $url" >> $file +fi + +# list all major-minor versions from url +tags1=$(curl -sS "$url/") +tags1=$(echo "$tags1" | sed -rne 's,^.*,\1,p') + +# print available versions +for tag in $tags1; do + tags2=$(curl -sS "$url/$tag/") + tags2=$(echo "$tags2" | sed -rne "s,^.*,\\1,p") + echo "$tags2" +done diff --git a/pkgs/common-updater/scripts/list-directory-versions b/pkgs/common-updater/scripts/list-directory-versions new file mode 100755 index 0000000..c713578 --- /dev/null +++ b/pkgs/common-updater/scripts/list-directory-versions @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import argparse +import requests +import os +import subprocess +import json +import re +from bs4 import BeautifulSoup + +parser = argparse.ArgumentParser( + description="Get all available versions listed for a package in a site." +) + +parser.add_argument( + "--pname", + default=os.environ.get("UPDATE_NIX_PNAME"), + required="UPDATE_NIX_PNAME" not in os.environ, + help="name of the package", +) +parser.add_argument( + "--attr-path", + default=os.environ.get("UPDATE_NIX_ATTR_PATH"), + help="attribute path of the package", +) +parser.add_argument("--url", help="url of the page that lists the package versions") +parser.add_argument("--file", help="file name for writing debugging information") + +parser.add_argument("--extra-regex", help="additional regex to filter versions with") + + +if __name__ == "__main__": + args = parser.parse_args() + + pname = args.pname + + attr_path = args.attr_path or pname + + url = args.url or json.loads( + subprocess.check_output( + [ + "nix-instantiate", + "--json", + "--eval", + "-E", + f"with import ./. {{}}; dirOf (lib.head {attr_path}.src.urls)", + ], + text=True, + ) + ) + + # print a debugging message + if args.file: + with open(args.file, "a") as f: + f.write(f"# Listing versions for {pname} from {url}\n") + + page = requests.get(url) + soup = BeautifulSoup(page.content, "html.parser") + links = soup.find_all("a") + for link in links: + link_url = link.get("href", None) + if link_url is not None: + match = re.fullmatch( + rf"(.*/)?{args.pname}-([\d.]+?(-[\d\w.-]+?)?)(\.tar)?(\.[^.]*)", link_url + ) + if match: + version = match.group(2) + if (not args.extra_regex) or re.fullmatch(args.extra_regex, version): + print(version) diff --git a/pkgs/common-updater/scripts/list-git-tags b/pkgs/common-updater/scripts/list-git-tags new file mode 100755 index 0000000..cf0a52d --- /dev/null +++ b/pkgs/common-updater/scripts/list-git-tags @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# lists all available tags from a git repository + +pname="" # package name +attr_path="" # package attribute path +url="" # git repository url +file="" # file for writing debugging information + +while (( $# > 0 )); do + flag="$1" + shift 1 + case "$flag" in + --pname=*) + pname="${flag#*=}" + ;; + --attr-path=*) + attr_path="${flag#*=}" + ;; + --url=*) + url="${flag#*=}" + ;; + --file=*) + file="${flag#*=}" + ;; + *) + echo "$0: unknown option ‘${flag}’" + exit 1 + ;; + esac +done + +if [[ -z "$pname" ]]; then + pname="$UPDATE_NIX_PNAME" +fi + +if [[ -z "$attr_path" ]]; then + attr_path="$UPDATE_NIX_ATTR_PATH" +fi + +# By default we set url to src.url or src.meta.homepage +if [[ -z "$url" ]]; then + url="$(nix-instantiate $systemArg --eval -E \ + "with import ./. {}; $attr_path.src.meta.homepage or $attr_path.src.url" \ + | tr -d '"')" +fi + +# print a debugging message +if [[ -n "$file" ]]; then + echo "# Listing tags for '$pname' at $url" >> $file +fi + +# list all tags from the remote repository +tags=$(git ls-remote --tags --refs "$url") + +# keep only the version part of the tag +tags=$(echo "$tags" | cut --delimiter=/ --field=3-) + +echo "$tags" diff --git a/pkgs/common-updater/scripts/mark-broken b/pkgs/common-updater/scripts/mark-broken new file mode 100755 index 0000000..7035bee --- /dev/null +++ b/pkgs/common-updater/scripts/mark-broken @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +# This script is meant to be used to mark failing hydra builds as broken in the meta attrs +# To use the script, you should pass the list of failing attrs as arguments to the script. +# +# Example: `cat failing-attrs | xargs ./pkgs/common-updater/scripts/mark-broken` +# +# Generating a list of failing attrs: (this should be improved at a later date) +# - Go to the most recent hydra evaluation with all builds completed +# - Select the "builds still failing" tab +# - Highlight and select all packages, should be prefixed with `nixpkgs.` +# - Use regex and editor foo to leave only the attr names +# - Use the above example command to then execute the script +# +# OTHER NOTES: +# - The `denyFileList` and `denyAttrList` will likely need to be updated slightly +# to align with the conventions used in nixpkgs at execution time +# - Any attrs which failed for any reason will be written to `failed-marks.txt`. +# Those attrs will likely need manual attention as disablement will likely be conditional. + +scriptName=mark-broken # do not use the .wrapped name + +failMark() { + local attr=$1 + shift 1 + + echo "$attr: $@" >&2 + echo $attr >> failed-marks.txt +} + +usage() { + echo "Usage: $scriptName " +} + +if (( "${#@}" < 1 )); then + echo "$scriptName: Too few arguments" + usage + exit 1 +fi + +# in case we resolve to an auto-generated file, just skip these entries +denyFileList=( + node-packages.nix # node, it will mark all node packages as broken + generic-builder.nix # haskell, it will mark all haskell packages as broken +) + +# ignore older versions of parameterized packages sets, these likely need +# to be conditionally disabled +denyAttrList=( + python27Packages + linuxPackages_ + rubyPackages_ +) + +function attemptToMarkBroken() { + local attr=$1 + + # skip likely to be noisy attrs + for badAttr in ${denyAttrList[@]};do + if [[ $attr =~ $badAttr ]]; then + failMark $attr "attr contained $badAttr, skipped." + return + fi + done + + nixFile=$(nix-instantiate --eval --json -E "with import ./. {}; (builtins.unsafeGetAttrPos \"description\" $attr.meta).file" 2>/dev/null | jq -r .) + if [[ ! -f "$nixFile" ]]; then + failMark $attr "Couldn't locate correct file" + return + fi + + # skip files which are auto-generated + for filename in ${denyFileList[@]};do + if [[ "$filename" == $(basename $nixFile) ]]; then + failMark $attr "filename matched $filename, skipped." + return + fi + done + + # Insert broken attribute + sed -i.bak "$nixFile" -r \ + -e "/^\s*broken\s*=.*$/d" \ + -e "s/(\s*)meta\s*=.*\{/&\n\1 broken = true;/" + + if cmp -s "$nixFile" "$nixFile.bak"; then + mv "$nixFile.bak" "$nixFile" + failMark $attr "Does it have a meta attribute?" + return + fi + + # broken should evaluate to true in any case now + markedSuccessfully=$(nix-instantiate --eval -E "with import ./. {}; $attr.meta.broken") + if [[ "$markedSuccessfully" != "true" ]]; then + mv "$nixFile.bak" "$nixFile" + failMark $attr "$attr.meta.broken doesn't evaluate to true." + return + fi + + rm -f "$nixFile.bak" +} + +for attr in $@; do + attemptToMarkBroken $attr +done diff --git a/pkgs/common-updater/scripts/update-source-version b/pkgs/common-updater/scripts/update-source-version new file mode 100755 index 0000000..75ad6e7 --- /dev/null +++ b/pkgs/common-updater/scripts/update-source-version @@ -0,0 +1,273 @@ +#!/usr/bin/env bash +set -e + +scriptName=update-source-version # do not use the .wrapped name + +die() { + echo "$scriptName: error: $1" >&2 + exit 1 +} + +usage() { + echo "Usage: $scriptName [] []" + echo " [--version-key=] [--source-key=]" + echo " [--system=] [--file=] [--rev=]" + echo " [--ignore-same-hash] [--print-changes]" +} + +args=() + +for arg in "$@"; do + case $arg in + --system=*) + system="${arg#*=}" + systemArg="--system ${arg#*=}" + ;; + --version-key=*) + versionKey="${arg#*=}" + ;; + --source-key=*) + sourceKey="${arg#*=}" + ;; + --file=*) + nixFile="${arg#*=}" + if [[ ! -f "$nixFile" ]]; then + die "Could not find provided file $nixFile" + fi + ;; + --rev=*) + newRevision="${arg#*=}" + ;; + --ignore-same-hash) + ignoreSameHash="true" + ;; + --print-changes) + printChanges="true" + ;; + --help) + usage + exit 0 + ;; + --*) + echo "$scriptName: Unknown argument: $arg" + usage + exit 1 + ;; + *) + args["${#args[*]}"]=$arg + ;; + esac +done + +attr=${args[0]} +newVersion=${args[1]} +newHash=${args[2]} +newUrl=${args[3]} + +# Third-party repositories might not accept arguments in their default.nix. +importTree="(let tree = import ./.; in if builtins.isFunction tree then tree {} else tree)" + +if (( "${#args[*]}" < 2 )); then + echo "$scriptName: Too few arguments" + usage + exit 1 +fi + +if (( "${#args[*]}" > 4 )); then + echo "$scriptName: Too many arguments" + usage + exit 1 +fi + +if [[ -z "$versionKey" ]]; then + versionKey=version +fi + +if [[ -z "$sourceKey" ]]; then + sourceKey=src +fi + +# Allow finding packages among flake outputs in repos using flake-compat. +pname=$(nix-instantiate $systemArg --eval --strict -A "$attr.name" || echo) +if [[ -z "$pname" ]]; then + if [[ -z "$system" ]]; then + system=$(nix-instantiate --eval -E 'builtins.currentSystem' | tr -d '"') + fi + + pname=$(nix-instantiate $systemArg --eval --strict -A "packages.$system.$attr.name" || echo) + if [[ -n "$pname" ]]; then + attr="packages.$system.$attr" + else + pname=$(nix-instantiate $systemArg --eval --strict -A "legacyPackages.$system.$attr.name" || echo) + if [[ -n "$pname" ]]; then + attr="legacyPackages.$system.$attr" + else + die "Could not find attribute '$attr'!" + fi + fi +fi + +if [[ -z "$nixFile" ]]; then + nixFile=$(nix-instantiate $systemArg --eval --strict -A "$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/') + if [[ ! -f "$nixFile" ]]; then + die "Couldn't evaluate '$attr.meta.position' to locate the .nix file!" + fi + + # flake-compat will return paths in the Nix store, we need to correct for that. + possiblyOutPath=$(nix-instantiate $systemArg --eval -E "with $importTree; outPath" 2>/dev/null | tr -d '"') + if [[ -n "$possiblyOutPath" ]]; then + outPathEscaped=$(echo "$possiblyOutPath" | sed 's#[$^*\\.[|]#\\&#g') + pwdEscaped=$(echo "$PWD" | sed 's#[$^*\\.[|]#\\&#g') + nixFile=$(echo "$nixFile" | sed "s|^$outPathEscaped|$pwdEscaped|") + fi +fi + +oldHashAlgo=$(nix-instantiate $systemArg --eval --strict -A "$attr.$sourceKey.drvAttrs.outputHashAlgo" | tr -d '"') +oldHash=$(nix-instantiate $systemArg --eval --strict -A "$attr.$sourceKey.drvAttrs.outputHash" | tr -d '"') + +if [[ -z "$oldHashAlgo" || -z "$oldHash" ]]; then + die "Couldn't evaluate old source hash from '$attr.$sourceKey'!" +fi + +if [[ $(grep --count "$oldHash" "$nixFile") != 1 ]]; then + die "Couldn't locate old source hash '$oldHash' (or it appeared more than once) in '$nixFile'!" +fi + +oldVersion=$(nix-instantiate $systemArg --eval -E "with $importTree; $attr.${versionKey} or (builtins.parseDrvName $attr.name).version" | tr -d '"') + +if [[ -z "$oldVersion" ]]; then + die "Couldn't find out the old version of '$attr'!" +fi + +if [[ "$oldVersion" = "$newVersion" ]]; then + echo "$scriptName: New version same as old version, nothing to do." >&2 + if [ -n "$printChanges" ]; then + printf '[]\n' + fi + exit 0 +fi + +if [[ -n "$newRevision" ]]; then + oldRevision=$(nix-instantiate $systemArg --eval -E "with $importTree; $attr.$sourceKey.rev" | tr -d '"') + if [[ -z "$oldRevision" ]]; then + die "Couldn't evaluate source revision from '$attr.$sourceKey'!" + fi +fi + +# Escape regex metacharacter that are allowed in store path names +oldVersionEscaped=$(echo "$oldVersion" | sed -re 's|[.+]|\\&|g') + +if [[ $(grep --count --extended-regexp "^\s*(let\b)?\s*$versionKey\s*=\s*\"$oldVersionEscaped\"" "$nixFile") = 1 ]]; then + pattern="/\b$versionKey\b\s*=/ s|\"$oldVersionEscaped\"|\"$newVersion\"|" +elif [[ $(grep --count --extended-regexp "^\s*(let\b)?\s*name\s*=\s*\"[^\"]+-$oldVersionEscaped\"" "$nixFile") = 1 ]]; then + pattern="/\bname\b\s*=/ s|-$oldVersionEscaped\"|-$newVersion\"|" +else + die "Couldn't figure out where out where to patch in new version in '$attr'!" +fi + +if [[ "$oldHash" =~ ^(sha256|sha512)[:-] ]]; then + # Handle the possible SRI-style hash attribute (in the form ${type}${separator}${hash}) + # True SRI uses dash as a separator and only supports base64, whereas Nix’s SRI-style format uses a colon and supports all the same encodings like regular hashes (16/32/64). + # To keep this program reasonably simple, we will upgrade Nix’s format to SRI. + oldHashAlgo="${BASH_REMATCH[1]}" + sri=true +elif [[ "$oldHashAlgo" = "null" ]]; then + # Some fetcher functions support SRI-style `hash` attribute in addition to legacy type-specific attributes. When `hash` is used `outputHashAlgo` is null so let’s complain when SRI-style hash value was not detected. + die "Unable to figure out hashing scheme from '$oldHash' in '$attr'!" +fi + +case "$oldHashAlgo" in + # Choose a temporary hash for given algorithm. + # Not using all-zeroes hash, since that is sometimes + # used for clean-up when updating multi-source packages. + # Created by hashing “update-source-version” string. + sha256) tempHash=AzH1rZFqEH8sovZZfJykvsEmCedEZWigQFHWHl6/PdE= ;; + sha512) tempHash=KFj9Fvco4AuCgLJIGRnVzyssRf7VGP2oi5CkH6ADvj75ow3am3h8pxefOgQlO+i33Q/BBnG/ST/F7B/0BvWHxw== ;; + *) die "Unhandled hash algorithm '$oldHashAlgo' in '$attr'!" ;; +esac + +if [[ -n "$sri" ]]; then + # SRI hashes only support base64 + # SRI hashes need to declare the hash type as part of the hash + tempHash="$(nix --extra-experimental-features nix-command hash to-sri --type "$oldHashAlgo" "$tempHash" 2>/dev/null \ + || nix to-sri --type "$oldHashAlgo" "$tempHash" 2>/dev/null)" \ + || die "Failed to convert hash to SRI representation!" +fi + +# Escape regex metacharacter that are allowed in hashes (+) +oldHashEscaped=$(echo "$oldHash" | sed -re 's|[+]|\\&|g') +tempHashEscaped=$(echo "$tempHash" | sed -re 's|[+]|\\&|g') + +# Replace new version +sed -i.cmp "$nixFile" -re "$pattern" +if cmp -s "$nixFile" "$nixFile.cmp"; then + die "Failed to replace version '$oldVersion' to '$newVersion' in '$attr'!" +fi + +# Replace new URL +if [[ -n "$newUrl" ]]; then + oldUrl=$(nix-instantiate $systemArg --eval -E "with $importTree; builtins.elemAt ($attr.$sourceKey.drvAttrs.urls or [ $attr.$sourceKey.url ]) 0" | tr -d '"') + if [[ -z "$oldUrl" ]]; then + die "Couldn't evaluate source url from '$attr.$sourceKey'!" + fi + + # Escape regex metacharacter that are allowed in store path names + oldUrlEscaped=$(echo "$oldUrl" | sed -re 's|[${}.+]|\\&|g') + + sed -i.cmp "$nixFile" -re "s|\"$oldUrlEscaped\"|\"$newUrl\"|" + if cmp -s "$nixFile" "$nixFile.cmp"; then + die "Failed to replace source URL '$oldUrl' to '$newUrl' in '$attr'!" + fi +fi + +sed -i.cmp "$nixFile" -re "s|\"$oldHashEscaped\"|\"$tempHash\"|" +if cmp -s "$nixFile" "$nixFile.cmp"; then + die "Failed to replace source hash of '$attr' to a temporary hash!" +fi + +# Replace new revision, if given +if [[ -n "$newRevision" ]]; then + sed -i.cmp "$nixFile" -re "s|\"$oldRevision\"|\"$newRevision\"|" + if cmp -s "$nixFile" "$nixFile.cmp"; then + die "Failed to replace source revision '$oldRevision' to '$newRevision' in '$attr'!" + fi +fi + +# If new hash not given on the command line, recalculate it ourselves. +if [[ -z "$newHash" ]]; then + nix-build $systemArg --no-out-link -A "$attr.$sourceKey" 2>"$attr.fetchlog" >/dev/null || true + # FIXME: use nix-build --hash here once https://github.com/NixOS/nix/issues/1172 is fixed + newHash=$( + sed '1,/hash mismatch in fixed-output derivation/d' "$attr.fetchlog" \ + | grep --perl-regexp --only-matching 'got: +.+[:-]\K.+' \ + || true # handled below + ) + + if [[ -n "$newHash" && -n "$sri" ]]; then + # nix-build preserves the hashing scheme so we can just convert the result to SRI using the old type + newHash="$(nix --extra-experimental-features nix-command hash to-sri --type "$oldHashAlgo" "$newHash" 2>/dev/null \ + || nix to-sri --type "$oldHashAlgo" "$newHash" 2>/dev/null)" \ + || die "Failed to convert hash to SRI representation!" + fi +fi + +if [[ -z "$newHash" ]]; then + cat "$attr.fetchlog" >&2 + die "Couldn't figure out new hash of '$attr.$sourceKey'!" +fi + +if [[ -z "${ignoreSameHash}" && "$oldVersion" != "$newVersion" && "$oldHash" = "$newHash" ]]; then + die "Both the old and new source hashes of '$attr.$sourceKey' were equivalent. Please fix the package's source URL to be dependent on '\${version}'!" +fi + +sed -i.cmp "$nixFile" -re "s|\"$tempHashEscaped\"|\"$newHash\"|" +if cmp -s "$nixFile" "$nixFile.cmp"; then + die "Failed to replace temporary source hash of '$attr' to the final source hash!" +fi + +rm -f "$nixFile.cmp" +rm -f "$attr.fetchlog" + +if [ -n "$printChanges" ]; then + printf '[{"attrPath":"%s","oldVersion":"%s","newVersion":"%s","files":["%s"]}]\n' "$attr" "$oldVersion" "$newVersion" "$nixFile" +fi diff --git a/pkgs/common-updater/unstable-updater.nix b/pkgs/common-updater/unstable-updater.nix new file mode 100644 index 0000000..d982fc6 --- /dev/null +++ b/pkgs/common-updater/unstable-updater.nix @@ -0,0 +1,171 @@ +{ lib +, writeShellApplication +, coreutils +, git +, nix +, common-updater-scripts +}: + +# This is an updater for unstable packages that should always use the latest +# commit. +{ url ? null # The git url, if empty it will be set to src.gitRepoUrl +, branch ? null +, hardcodeZeroVersion ? false # Use a made-up version "0" instead of latest tag. Use when there is no previous release, or the project's tagging system is incompatible with what we expect from versions +, tagFormat ? "*" # A `git describe --tags --match ''` pattern that tags must match to be considered +, tagPrefix ? null # strip this prefix from a tag name +, tagConverter ? null # A command to convert more complex tag formats. It receives the git tag via stdin and should convert it into x.y.z format to stdout +, shallowClone ? true +}: + +assert lib.asserts.assertMsg (tagPrefix == null || tagConverter == null) "Can only use either tagPrefix or tagConverter!"; + +let + updateScript = writeShellApplication { + name = "unstable-update-script"; + runtimeInputs = [ + common-updater-scripts + coreutils + git + nix + ]; + text = '' + set -ex + + url="" + branch="" + hardcode_zero_version="" + tag_format="" + tag_prefix="" + tag_converter="" + shallow_clone="" + : "''${systemArg:=}" + + while (( $# > 0 )); do + flag="$1" + shift 1 + case "$flag" in + --url=*) + url="''${flag#*=}" + ;; + --branch=*) + branch="''${flag#*=}" + ;; + --hardcode-zero-version) + hardcode_zero_version=1 + ;; + --tag-format=*) + tag_format="''${flag#*=}" + ;; + --tag-prefix=*) + tag_prefix="''${flag#*=}" + ;; + --tag-converter=*) + tag_converter="''${flag#*=}" + ;; + --shallow-clone) + shallow_clone=1 + ;; + *) + echo "$0: unknown option ‘''${flag}’" + exit 1 + ;; + esac + done + + # By default we set url to src.gitRepoUrl + if [[ -z "$url" ]]; then + # system argument cannot be passed as 1 argument + # shellcheck disable=SC2086 + url="$(nix-instantiate $systemArg --eval -E \ + "with import ./. {}; $UPDATE_NIX_ATTR_PATH.src.gitRepoUrl" \ + | tr -d '"')" + fi + + # Get info about HEAD from a shallow git clone + tmpdir="$(mktemp -d)" + + cloneArgs=() + + if [[ "$shallow_clone" == "1" ]]; then + cloneArgs+=(--depth=1) + fi + + if [[ -n "$branch" ]]; then + cloneArgs+=(--branch="$branch") + fi + + git clone "''${cloneArgs[@]}" "$url" "$tmpdir" + getLatestVersion() { + git describe --tags --abbrev=0 --match "''${tag_format}" 2> /dev/null || true + } + + pushd "$tmpdir" + commit_date="$(git show -s --pretty='format:%cs')" + commit_sha="$(git show -s --pretty='format:%H')" + last_tag="" + if [[ -z "$hardcode_zero_version" ]]; then + if [[ "$shallow_clone" == "1" ]]; then + depth=100 + while (( depth < 10000 )); do + last_tag="$(getLatestVersion)" + if [[ -n "$last_tag" ]]; then + break + fi + git fetch --depth="$depth" --tags + depth=$(( depth * 2 )) + done + + if [[ -z "$last_tag" ]]; then + # To be extra sure, check if full history helps with finding a tag + git fetch --tags + last_tag="$(getLatestVersion)" + fi + else + last_tag="$(getLatestVersion)" + fi + if [[ -z "$last_tag" ]]; then + last_tag="0" + fi + if [[ -n "$tag_prefix" ]]; then + echo "Stripping prefix '$tag_prefix' from tag '$last_tag'" + last_tag="''${last_tag#"''${tag_prefix}"}" + fi + if [[ -n "$tag_converter" ]]; then + echo "Running '$last_tag' through: $tag_converter" + last_tag="$(echo "''${last_tag}" | ''${tag_converter})" + fi + else + last_tag="0" + fi + if [[ ! "$last_tag" =~ ^[[:digit:]] ]]; then + echo "Last tag '$last_tag' does not start with a digit" > /dev/stderr + exit 1 + fi + new_version="$last_tag-unstable-$commit_date" + popd + # rm -rf "$tmpdir" + + # update the nix expression + update-source-version \ + "$UPDATE_NIX_ATTR_PATH" \ + "$new_version" \ + --rev="$commit_sha" + ''; + }; + +in +[ + (lib.getExe updateScript) + "--url=${builtins.toString url}" + "--tag-format=${tagFormat}" +] ++ lib.optionals (branch != null) [ + "--branch=${branch}" +] ++ lib.optionals (tagPrefix != null) [ + "--tag-prefix=${tagPrefix}" +] ++ lib.optionals (tagConverter != null) [ + "--tag-converter=${tagConverter}" +] ++ lib.optionals hardcodeZeroVersion [ + "--hardcode-zero-version" +] ++ lib.optionals shallowClone [ + "--shallow-clone" +] diff --git a/pkgs/pkgs-lib/default.nix b/pkgs/pkgs-lib/default.nix new file mode 100644 index 0000000..113dceb --- /dev/null +++ b/pkgs/pkgs-lib/default.nix @@ -0,0 +1,11 @@ +# pkgs-lib is for functions and values that can't be in lib because +# they depend on some packages. This notably is *not* for supporting package +# building, instead pkgs/build-support is the place for that. +{ lib, pkgs }: { + # setting format types and generators. These do not fit in lib/types.nix, + # because they depend on pkgs for rendering some formats + formats = import ./formats.nix { + inherit lib pkgs; + }; +} + diff --git a/pkgs/pkgs-lib/formats.nix b/pkgs/pkgs-lib/formats.nix new file mode 100644 index 0000000..1b72270 --- /dev/null +++ b/pkgs/pkgs-lib/formats.nix @@ -0,0 +1,509 @@ +{ lib, pkgs }: +rec { + + /* + + Every following entry represents a format for program configuration files + used for `settings`-style options (see https://github.com/NixOS/rfcs/pull/42). + Each entry should look as follows: + + = : { + # ^^ Parameters for controlling the format + + # The module system type most suitable for representing such a format + # The description needs to be overwritten for recursive types + type = ...; + + # Utility functions for convenience, or special interactions with the + # format (optional) + lib = { + exampleFunction = ... + # Types specific to the format (optional) + types = { ... }; + ... + }; + + # generate :: Name -> Value -> Path + # A function for generating a file with a value of such a type + generate = ...; + + }); + + Please note that `pkgs` may not always be available for use due to the split + options doc build introduced in fc614c37c653, so lazy evaluation of only the + 'type' field is required. + + */ + + + inherit (import ./formats/java-properties/default.nix { inherit lib pkgs; }) + javaProperties; + + libconfig = (import ./formats/libconfig/default.nix { inherit lib pkgs; }).format; + + hocon = (import ./formats/hocon/default.nix { inherit lib pkgs; }).format; + + json = {}: { + + type = with lib.types; let + valueType = nullOr (oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]) // { + description = "JSON value"; + }; + in valueType; + + generate = name: value: pkgs.callPackage ({ runCommand, jq }: runCommand name { + nativeBuildInputs = [ jq ]; + value = builtins.toJSON value; + passAsFile = [ "value" ]; + } '' + jq . "$valuePath"> $out + '') {}; + + }; + + yaml = {}: { + + generate = name: value: pkgs.callPackage ({ runCommand, remarshal }: runCommand name { + nativeBuildInputs = [ remarshal ]; + value = builtins.toJSON value; + passAsFile = [ "value" ]; + } '' + json2yaml "$valuePath" "$out" + '') {}; + + type = with lib.types; let + valueType = nullOr (oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]) // { + description = "YAML value"; + }; + in valueType; + + }; + + # the ini formats share a lot of code + inherit ( + let + singleIniAtom = with lib.types; nullOr (oneOf [ bool int float str ]) // { + description = "INI atom (null, bool, int, float or string)"; + }; + iniAtom = with lib.types; { listsAsDuplicateKeys, listToValue }: + if listsAsDuplicateKeys then + coercedTo singleIniAtom lib.singleton (listOf singleIniAtom) // { + description = singleIniAtom.description + " or a list of them for duplicate keys"; + } + else if listToValue != null then + coercedTo singleIniAtom lib.singleton (nonEmptyListOf singleIniAtom) // { + description = singleIniAtom.description + " or a non-empty list of them"; + } + else + singleIniAtom; + iniSection = with lib.types; { listsAsDuplicateKeys, listToValue }@args: + attrsOf (iniAtom args) // { + description = "section of an INI file (attrs of " + (iniAtom args).description + ")"; + }; + + maybeToList = listToValue: if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) else lib.id; + in { + ini = { + # Represents lists as duplicate keys + listsAsDuplicateKeys ? false, + # Alternative to listsAsDuplicateKeys, converts list to non-list + # listToValue :: [IniAtom] -> IniAtom + listToValue ? null, + ... + }@args: + assert listsAsDuplicateKeys -> listToValue == null; + { + + type = lib.types.attrsOf (iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; }); + + generate = name: value: + lib.pipe value + [ + (lib.mapAttrs (_: maybeToList listToValue)) + (lib.generators.toINI (removeAttrs args ["listToValue"])) + (pkgs.writeText name) + ]; + }; + + iniWithGlobalSection = { + # Represents lists as duplicate keys + listsAsDuplicateKeys ? false, + # Alternative to listsAsDuplicateKeys, converts list to non-list + # listToValue :: [IniAtom] -> IniAtom + listToValue ? null, + ... + }@args: + assert listsAsDuplicateKeys -> listToValue == null; + { + type = lib.types.submodule { + options = { + sections = lib.mkOption rec { + type = lib.types.attrsOf (iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; }); + default = {}; + description = type.description; + }; + globalSection = lib.mkOption rec { + type = iniSection { listsAsDuplicateKeys = listsAsDuplicateKeys; listToValue = listToValue; }; + default = {}; + description = "global " + type.description; + }; + }; + }; + generate = name: { sections ? {}, globalSection ? {}, ... }: + pkgs.writeText name (lib.generators.toINIWithGlobalSection (removeAttrs args ["listToValue"]) + { + globalSection = maybeToList listToValue globalSection; + sections = lib.mapAttrs (_: maybeToList listToValue) sections; + }); + }; + + gitIni = { listsAsDuplicateKeys ? false, ... }@args: { + type = let + atom = iniAtom { + listsAsDuplicateKeys = listsAsDuplicateKeys; + listToValue = null; + }; + in with lib.types; attrsOf (attrsOf (either atom (attrsOf atom))); + + generate = name: value: pkgs.writeText name (lib.generators.toGitINI value); + }; + + }) ini iniWithGlobalSection gitIni; + + # As defined by systemd.syntax(7) + # + # null does not set any value, which allows for RFC42 modules to specify + # optional config options. + systemd = let + mkValueString = lib.generators.mkValueStringDefault {}; + mkKeyValue = k: v: + if v == null then "# ${k} is unset" + else "${k} = ${mkValueString v}"; + in ini { + listsAsDuplicateKeys = true; + inherit mkKeyValue; + }; + + keyValue = { + # Represents lists as duplicate keys + listsAsDuplicateKeys ? false, + # Alternative to listsAsDuplicateKeys, converts list to non-list + # listToValue :: [Atom] -> Atom + listToValue ? null, + ... + }@args: + assert listsAsDuplicateKeys -> listToValue == null; + { + + type = with lib.types; let + + singleAtom = nullOr (oneOf [ + bool + int + float + str + ]) // { + description = "atom (null, bool, int, float or string)"; + }; + + atom = + if listsAsDuplicateKeys then + coercedTo singleAtom lib.singleton (listOf singleAtom) // { + description = singleAtom.description + " or a list of them for duplicate keys"; + } + else if listToValue != null then + coercedTo singleAtom lib.singleton (nonEmptyListOf singleAtom) // { + description = singleAtom.description + " or a non-empty list of them"; + } + else + singleAtom; + + in attrsOf atom; + + generate = name: value: + let + transformedValue = + if listToValue != null + then + lib.mapAttrs (key: val: + if lib.isList val then listToValue val else val + ) value + else value; + in pkgs.writeText name (lib.generators.toKeyValue (removeAttrs args ["listToValue"]) transformedValue); + + }; + + toml = {}: json {} // { + type = with lib.types; let + valueType = oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ] // { + description = "TOML value"; + }; + in valueType; + + generate = name: value: pkgs.callPackage ({ runCommand, remarshal }: runCommand name { + nativeBuildInputs = [ remarshal ]; + value = builtins.toJSON value; + passAsFile = [ "value" ]; + } '' + json2toml "$valuePath" "$out" + '') {}; + + }; + + /* For configurations of Elixir project, like config.exs or runtime.exs + + Most Elixir project are configured using the [Config] Elixir DSL + + Since Elixir has more types than Nix, we need a way to map Nix types to + more than 1 Elixir type. To that end, this format provides its own library, + and its own set of types. + + To be more detailed, a Nix attribute set could correspond in Elixir to a + [Keyword list] (the more common type), or it could correspond to a [Map]. + + A Nix string could correspond in Elixir to a [String] (also called + "binary"), an [Atom], or a list of chars (usually discouraged). + + A Nix array could correspond in Elixir to a [List] or a [Tuple]. + + Some more types exists, like records, regexes, but since they are less used, + we can leave the `mkRaw` function as an escape hatch. + + For more information on how to use this format in modules, please refer to + the Elixir section of the Nixos documentation. + + TODO: special Elixir values doesn't show up nicely in the documentation + + [Config]: + [Keyword list]: + [Map]: + [String]: + [Atom]: + [List]: + [Tuple]: + */ + elixirConf = { elixir ? pkgs.elixir }: + with lib; let + toElixir = value: with builtins; + if value == null then "nil" else + if value == true then "true" else + if value == false then "false" else + if isInt value || isFloat value then toString value else + if isString value then string value else + if isAttrs value then attrs value else + if isList value then list value else + abort "formats.elixirConf: should never happen (value = ${value})"; + + escapeElixir = escape [ "\\" "#" "\"" ]; + string = value: "\"${escapeElixir value}\""; + + attrs = set: + if set ? _elixirType then specialType set + else + let + toKeyword = name: value: "${name}: ${toElixir value}"; + keywordList = concatStringsSep ", " (mapAttrsToList toKeyword set); + in + "[" + keywordList + "]"; + + listContent = values: concatStringsSep ", " (map toElixir values); + + list = values: "[" + (listContent values) + "]"; + + specialType = { value, _elixirType }: + if _elixirType == "raw" then value else + if _elixirType == "atom" then value else + if _elixirType == "map" then elixirMap value else + if _elixirType == "tuple" then tuple value else + abort "formats.elixirConf: should never happen (_elixirType = ${_elixirType})"; + + elixirMap = set: + let + toEntry = name: value: "${toElixir name} => ${toElixir value}"; + entries = concatStringsSep ", " (mapAttrsToList toEntry set); + in + "%{${entries}}"; + + tuple = values: "{${listContent values}}"; + + toConf = values: + let + keyConfig = rootKey: key: value: + "config ${rootKey}, ${key}, ${toElixir value}"; + keyConfigs = rootKey: values: mapAttrsToList (keyConfig rootKey) values; + rootConfigs = flatten (mapAttrsToList keyConfigs values); + in + '' + import Config + + ${concatStringsSep "\n" rootConfigs} + ''; + in + { + type = with lib.types; let + valueType = nullOr + (oneOf [ + bool + int + float + str + (attrsOf valueType) + (listOf valueType) + ]) // { + description = "Elixir value"; + }; + in + attrsOf (attrsOf (valueType)); + + lib = + let + mkRaw = value: { + inherit value; + _elixirType = "raw"; + }; + + in + { + inherit mkRaw; + + /* Fetch an environment variable at runtime, with optional fallback + */ + mkGetEnv = { envVariable, fallback ? null }: + mkRaw "System.get_env(${toElixir envVariable}, ${toElixir fallback})"; + + /* Make an Elixir atom. + + Note: lowercase atoms still need to be prefixed by ':' + */ + mkAtom = value: { + inherit value; + _elixirType = "atom"; + }; + + /* Make an Elixir tuple out of a list. + */ + mkTuple = value: { + inherit value; + _elixirType = "tuple"; + }; + + /* Make an Elixir map out of an attribute set. + */ + mkMap = value: { + inherit value; + _elixirType = "map"; + }; + + /* Contains Elixir types. Every type it exports can also be replaced + by raw Elixir code (i.e. every type is `either type rawElixir`). + + It also reexports standard types, wrapping them so that they can + also be raw Elixir. + */ + types = with lib.types; let + isElixirType = type: x: (x._elixirType or "") == type; + + rawElixir = mkOptionType { + name = "rawElixir"; + description = "raw elixir"; + check = isElixirType "raw"; + }; + + elixirOr = other: either other rawElixir; + in + { + inherit rawElixir elixirOr; + + atom = elixirOr (mkOptionType { + name = "elixirAtom"; + description = "elixir atom"; + check = isElixirType "atom"; + }); + + tuple = elixirOr (mkOptionType { + name = "elixirTuple"; + description = "elixir tuple"; + check = isElixirType "tuple"; + }); + + map = elixirOr (mkOptionType { + name = "elixirMap"; + description = "elixir map"; + check = isElixirType "map"; + }); + # Wrap standard types, since anything in the Elixir configuration + # can be raw Elixir + } // lib.mapAttrs (_name: type: elixirOr type) lib.types; + }; + + generate = name: value: pkgs.runCommand name + { + value = toConf value; + passAsFile = [ "value" ]; + nativeBuildInputs = [ elixir ]; + } '' + cp "$valuePath" "$out" + mix format "$out" + ''; + }; + + # Outputs a succession of Python variable assignments + # Useful for many Django-based services + pythonVars = {}: { + type = with lib.types; let + valueType = nullOr(oneOf [ + bool + float + int + path + str + (attrsOf valueType) + (listOf valueType) + ]) // { + description = "Python value"; + }; + in attrsOf valueType; + generate = name: value: pkgs.callPackage ({ runCommand, python3, black }: runCommand name { + nativeBuildInputs = [ python3 black ]; + value = builtins.toJSON value; + pythonGen = '' + import json + import os + + with open(os.environ["valuePath"], "r") as f: + for key, value in json.load(f).items(): + print(f"{key} = {repr(value)}") + ''; + passAsFile = [ "value" "pythonGen" ]; + } '' + cat "$valuePath" + python3 "$pythonGenPath" > $out + black $out + '') {}; + }; + +} diff --git a/pkgs/pkgs-lib/formats/hocon/default.nix b/pkgs/pkgs-lib/formats/hocon/default.nix new file mode 100644 index 0000000..0ae9c56 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/default.nix @@ -0,0 +1,189 @@ +{ lib +, pkgs +}: +let + inherit (pkgs) buildPackages callPackage; + + hocon-generator = buildPackages.rustPlatform.buildRustPackage { + name = "hocon-generator"; + version = "0.1.0"; + src = ./src; + + passthru.updateScript = ./update.sh; + + cargoLock.lockFile = ./src/Cargo.lock; + }; + + hocon-validator = pkgs.writers.writePython3Bin "hocon-validator" { + libraries = [ pkgs.python3Packages.pyhocon ]; + } '' + from sys import argv + from pyhocon import ConfigFactory + + if not len(argv) == 2: + print("USAGE: hocon-validator ") + + ConfigFactory.parse_file(argv[1]) + ''; +in +{ + # https://github.com/lightbend/config/blob/main/HOCON.md + format = { + generator ? hocon-generator + , validator ? hocon-validator + # `include classpath("")` is not implemented in pyhocon. + # In the case that you need this functionality, + # you will have to disable pyhocon validation. + , doCheck ? true + }: let + hoconLib = { + mkInclude = value: let + includeStatement = if lib.isAttrs value && !(lib.isDerivation value) then { + required = false; + type = null; + _type = "include"; + } // value else { + value = toString value; + required = false; + type = null; + _type = "include"; + }; + in + assert lib.assertMsg (lib.elem includeStatement.type [ "file" "url" "classpath" null ]) '' + Type of HOCON mkInclude is not of type 'file', 'url' or 'classpath': + ${(lib.generators.toPretty {}) includeStatement} + ''; + includeStatement; + + mkAppend = value: { + inherit value; + _type = "append"; + }; + + mkSubstitution = value: + if lib.isString value + then + { + inherit value; + optional = false; + _type = "substitution"; + } + else + assert lib.assertMsg (lib.isAttrs value) '' + Value of invalid type provided to `hocon.lib.mkSubstition`: ${lib.typeOf value} + ''; + assert lib.assertMsg (value ? "value") '' + Argument to `hocon.lib.mkSubstition` is missing a `value`: + ${builtins.toJSON value} + ''; + { + value = value.value; + optional = value.optional or false; + _type = "substitution"; + }; + }; + + in { + type = let + type' = with lib.types; let + atomType = nullOr (oneOf [ + bool + float + int + path + str + ]); + in (oneOf [ + atomType + (listOf atomType) + (attrsOf type') + ]) // { + description = "HOCON value"; + }; + in type'; + + lib = hoconLib; + + generate = name: value: + let + # TODO: remove in 24.11 + # Backwards compatibility for generators in the following locations: + # - nixos/modules/services/networking/jibri/default.nix (__hocon_envvar) + # - nixos/modules/services/networking/jicofo.nix (__hocon_envvar, __hocon_unquoted_string) + # - nixos/modules/services/networking/jitsi-videobridge.nix (__hocon_envvar) + replaceOldIndicators = value: + if lib.isAttrs value then + (if value ? "__hocon_envvar" + then + lib.warn '' + Use of `__hocon_envvar` has been deprecated, and will + be removed in the future. + + Please use `(pkgs.formats.hocon {}).lib.mkSubstitution` instead. + '' + (hoconLib.mkSubstitution value.__hocon_envvar) + else if value ? "__hocon_unquoted_string" + then + lib.warn '' + Use of `__hocon_unquoted_string` has been deprecated, and will + be removed in the future. + + Please make use of the freeform options of + `(pkgs.formats.hocon {}).format` instead. + '' + { + value = value.__hocon_unquoted_string; + _type = "unquoted_string"; + } + else lib.mapAttrs (_: replaceOldIndicators) value) + else if lib.isList value + then map replaceOldIndicators value + else value; + + finalValue = replaceOldIndicators value; + in + callPackage + ({ + stdenvNoCC + , hocon-generator + , hocon-validator + , writeText + }: + stdenvNoCC.mkDerivation rec { + inherit name; + + dontUnpack = true; + + json = builtins.toJSON finalValue; + passAsFile = [ "json" ]; + + strictDeps = true; + nativeBuildInputs = [ hocon-generator ]; + buildPhase = '' + runHook preBuild + hocon-generator < $jsonPath > output.conf + runHook postBuild + ''; + + inherit doCheck; + nativeCheckInputs = [ hocon-validator ]; + checkPhase = '' + runHook preCheck + hocon-validator output.conf + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + mv output.conf $out + runHook postInstall + ''; + + passthru.json = writeText "${name}.json" json; + }) + { + hocon-generator = generator; + hocon-validator = validator; + }; + }; +} diff --git a/pkgs/pkgs-lib/formats/hocon/src/.gitignore b/pkgs/pkgs-lib/formats/hocon/src/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/src/.gitignore @@ -0,0 +1 @@ +target diff --git a/pkgs/pkgs-lib/formats/hocon/src/Cargo.lock b/pkgs/pkgs-lib/formats/hocon/src/Cargo.lock new file mode 100644 index 0000000..735461c --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/src/Cargo.lock @@ -0,0 +1,89 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "hocon-generator" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "serde" +version = "1.0.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/pkgs/pkgs-lib/formats/hocon/src/Cargo.toml b/pkgs/pkgs-lib/formats/hocon/src/Cargo.toml new file mode 100644 index 0000000..e39e636 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/src/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "hocon-generator" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = "1.0.178" +serde_json = "1.0.104" diff --git a/pkgs/pkgs-lib/formats/hocon/src/src/main.rs b/pkgs/pkgs-lib/formats/hocon/src/src/main.rs new file mode 100644 index 0000000..2e53f3f --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/src/src/main.rs @@ -0,0 +1,237 @@ +use serde_json::{value, Map, Value}; + +#[derive(Debug)] +enum HOCONValue { + Null, + Append(Box), + Bool(bool), + Number(value::Number), + String(String), + List(Vec), + Substitution(String, bool), + Object(Vec, Vec<(String, HOCONValue)>), + Literal(String), +} + +#[derive(Debug)] +enum HOCONInclude { + Heuristic(String, bool), + Url(String, bool), + File(String, bool), + ClassPath(String, bool), +} + +impl HOCONInclude { + fn map_fst(&self, f: &dyn Fn(&String) -> String) -> HOCONInclude { + match self { + HOCONInclude::Heuristic(s, r) => HOCONInclude::Heuristic(f(s), *r), + HOCONInclude::Url(s, r) => HOCONInclude::Url(f(s), *r), + HOCONInclude::File(s, r) => HOCONInclude::File(f(s), *r), + HOCONInclude::ClassPath(s, r) => HOCONInclude::ClassPath(f(s), *r), + } + } +} + +fn parse_include(o: &Map) -> HOCONInclude { + let value = o + .get("value") + .expect("Missing field 'value' for include statement") + .as_str() + .expect("Field 'value' is not a string in include statement") + .to_string(); + let required = o + .get("required") + .expect("Missing field 'required' for include statement") + .as_bool() + .expect("Field 'required'is not a bool in include statement"); + let include_type = match o + .get("type") + .expect("Missing field 'type' for include statement") + { + Value::Null => None, + Value::String(s) => Some(s.as_str()), + t => panic!("Field 'type' is not a string in include statement: {:?}", t), + }; + + // Assert that this was an intentional include + debug_assert!(o.get("_type").and_then(|t| t.as_str()) == Some("include")); + + match include_type { + None => HOCONInclude::Heuristic(value, required), + Some("url") => HOCONInclude::Url(value, required), + Some("file") => HOCONInclude::File(value, required), + Some("classpath") => HOCONInclude::ClassPath(value, required), + _ => panic!( + "Could not recognize type for include statement: {}", + include_type.unwrap() + ), + } +} + +fn parse_special_types(o: &Map) -> Option { + o.get("_type") + .and_then(|r#type| r#type.as_str()) + .map(|r#type| match r#type { + "substitution" => { + let value = o + .get("value") + .expect("Missing value for substitution") + .as_str() + .unwrap_or_else(|| panic!("Substition value is not a string: {:?}", o)); + let required = o + .get("required") + .unwrap_or(&Value::Bool(false)) + .as_bool() + .unwrap_or_else(|| panic!("Substition value is not a string: {:?}", o)); + + debug_assert!(!value.contains('}')); + + HOCONValue::Substitution(value.to_string(), required) + } + "append" => { + let value = o.get("value").expect("Missing value for append"); + + HOCONValue::Append(Box::new(json_to_hocon(value))) + } + "unquoted_string" => { + let value = o + .get("value") + .expect("Missing value for unquoted_string") + .as_str() + .unwrap_or_else(|| panic!("Unquoted string value is not a string: {:?}", o)); + + HOCONValue::Literal(value.to_string()) + } + _ => panic!( + "\ + Attribute set contained special element '_type',\ + but its value is not recognized:\n{}", + r#type + ), + }) +} + +fn json_to_hocon(v: &Value) -> HOCONValue { + match v { + Value::Null => HOCONValue::Null, + Value::Bool(b) => HOCONValue::Bool(*b), + Value::Number(n) => HOCONValue::Number(n.clone()), + Value::String(s) => HOCONValue::String(s.clone()), + Value::Array(a) => { + let items = a.iter().map(json_to_hocon).collect::>(); + HOCONValue::List(items) + } + Value::Object(o) => { + if let Some(result) = parse_special_types(o) { + return result; + } + + let mut items = o + .iter() + .filter(|(key, _)| key.as_str() != "_includes") + .map(|(key, value)| (key.clone(), json_to_hocon(value))) + .collect::>(); + + items.sort_by(|(a, _), (b, _)| a.partial_cmp(b).unwrap()); + + let includes = o + .get("_includes") + .map(|x| { + x.as_array() + .expect("_includes is not an array") + .iter() + .map(|x| { + x.as_object() + .unwrap_or_else(|| panic!("Include is not an object: {}", x)) + }) + .map(parse_include) + .collect::>() + }) + .unwrap_or(vec![]); + + HOCONValue::Object(includes, items) + } + } +} + +impl ToString for HOCONValue { + fn to_string(&self) -> String { + match self { + HOCONValue::Null => "null".to_string(), + HOCONValue::Bool(b) => b.to_string(), + HOCONValue::Number(n) => n.to_string(), + HOCONValue::String(s) => serde_json::to_string(&Value::String(s.clone())).unwrap(), + HOCONValue::Substitution(v, required) => { + format!("${{{}{}}}", if *required { "" } else { "?" }, v) + } + HOCONValue::List(l) => { + let items = l + .iter() + .map(|item| item.to_string()) + .collect::>() + .join(",\n") + .split('\n') + .map(|s| " ".to_owned() + s) + .collect::>() + .join("\n"); + format!("[\n{}\n]", items) + } + HOCONValue::Object(i, o) => { + let includes = i + .iter() + .map(|x| { + x.map_fst(&|s| serde_json::to_string(&Value::String(s.clone())).unwrap()) + }) + .map(|x| match x { + HOCONInclude::Heuristic(s, r) => (s.to_string(), r), + HOCONInclude::Url(s, r) => (format!("url({})", s), r), + HOCONInclude::File(s, r) => (format!("file({})", s), r), + HOCONInclude::ClassPath(s, r) => (format!("classpath({})", s), r), + }) + .map(|(i, r)| if r { format!("required({})", i) } else { i }) + .map(|s| format!("include {}", s)) + .collect::>() + .join("\n"); + let items = o + .iter() + .map(|(key, value)| { + ( + serde_json::to_string(&Value::String(key.clone())).unwrap(), + value, + ) + }) + .map(|(key, value)| match value { + HOCONValue::Append(v) => format!("{} += {}", key, v.to_string()), + v => format!("{} = {}", key, v.to_string()), + }) + .collect::>() + .join("\n"); + + let content = (if includes.is_empty() { + items + } else { + format!("{}{}", includes, items) + }) + .split('\n') + .map(|s| format!(" {}", s)) + .collect::>() + .join("\n"); + + format!("{{\n{}\n}}", content) + } + HOCONValue::Append(_) => panic!("Append should not be present at this point"), + Self::Literal(s) => s.to_string(), + } + } +} + +fn main() { + let stdin = std::io::stdin().lock(); + let json = serde_json::Deserializer::from_reader(stdin) + .into_iter::() + .next() + .expect("Could not read content from stdin") + .expect("Could not parse JSON from stdin"); + + print!("{}\n\n", json_to_hocon(&json).to_string()); +} diff --git a/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/default.nix b/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/default.nix new file mode 100644 index 0000000..5f0b3d1 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/default.nix @@ -0,0 +1,65 @@ +{ lib, formats, stdenvNoCC, writeText, ... }: +let + hocon = formats.hocon { }; + + expression = { + substitution = { __hocon_envvar = "PATH"; }; + literal = { + __hocon_unquoted_string = '' + [ + 1, + "a", + ]''; + }; + + nested = { + substitution = { __hocon_envvar = "PATH"; }; + literal = { + __hocon_unquoted_string = '' + [ + 1, + "a", + ]''; + }; + }; + + nested_in_array = [ + { __hocon_envvar = "PATH"; } + { + __hocon_unquoted_string = '' + [ + 1, + "a", + ]''; + } + ]; + }; + + hocon-test-conf = hocon.generate "hocon-test.conf" expression; +in + stdenvNoCC.mkDerivation { + name = "pkgs.formats.hocon-test-backwards-compatibility"; + + dontUnpack = true; + dontBuild = true; + + doCheck = true; + checkPhase = '' + runHook preCheck + + diff -U3 ${./expected.txt} ${hocon-test-conf} + + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + + mkdir $out + cp ${./expected.txt} $out/expected.txt + cp ${hocon-test-conf} $out/hocon-test.conf + cp ${hocon-test-conf.passthru.json} $out/hocon-test.json + + runHook postInstall + ''; + } diff --git a/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/expected.txt b/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/expected.txt new file mode 100644 index 0000000..2835a3c --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/test/backwards-compatibility/expected.txt @@ -0,0 +1,22 @@ +{ + "literal" = [ + 1, + "a", + ] + "nested" = { + "literal" = [ + 1, + "a", + ] + "substitution" = ${?PATH} + } + "nested_in_array" = [ + ${?PATH}, + [ + 1, + "a", + ] + ] + "substitution" = ${?PATH} +} + diff --git a/pkgs/pkgs-lib/formats/hocon/test/comprehensive/default.nix b/pkgs/pkgs-lib/formats/hocon/test/comprehensive/default.nix new file mode 100644 index 0000000..ae4fae4 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/test/comprehensive/default.nix @@ -0,0 +1,83 @@ +{ lib, formats, stdenvNoCC, writeText, ... }: +let + hocon = formats.hocon { }; + + include_file = (writeText "hocon-test-include.conf" '' + "val" = 1 + '').overrideAttrs (_: _: { + outputHashAlgo = "sha256"; + outputHashMode = "flat"; + outputHash = "sha256-UhkJLhT3bD6znq+IdDjs/ahP19mLzrLCy/R14pVrfew="; + }); + + expression = { + simple_top_level_attr = "1.0"; + nested.attrset.has.a.integer.value = 100; + some_floaty = 29.95; + + array2d = [ + [ 1 2 "a" ] + [ 2 1 "b" ] + ]; + nasty_string = "\"@\n\\\t^*\b\f\n\0\";'''$"; + + "misc attrs" = { + x = 1; + y = hocon.lib.mkAppend { a = 1; }; + }; + + "cursed \" .attrs \" " = { + "a" = 1; + "a b" = hocon.lib.mkSubstitution "a"; + "a b c" = hocon.lib.mkSubstitution { + value = "a b"; + required = false; + }; + }; + + to_include = { + _includes = [ + (hocon.lib.mkInclude include_file) + (hocon.lib.mkInclude "https://example.com") + (hocon.lib.mkInclude { + required = true; + type = "file"; + value = include_file; + }) + (hocon.lib.mkInclude { value = include_file; }) + (hocon.lib.mkInclude { + value = "https://example.com"; + type = "url"; + }) + ]; + }; + }; + + hocon-test-conf = hocon.generate "hocon-test.conf" expression; +in + stdenvNoCC.mkDerivation { + name = "pkgs.formats.hocon-test-comprehensive"; + + dontUnpack = true; + dontBuild = true; + + doCheck = true; + checkPhase = '' + runHook preCheck + + diff -U3 ${./expected.txt} ${hocon-test-conf} + + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + + mkdir $out + cp ${./expected.txt} $out/expected.txt + cp ${hocon-test-conf} $out/hocon-test.conf + cp ${hocon-test-conf.passthru.json} $out/hocon-test.json + + runHook postInstall + ''; + } diff --git a/pkgs/pkgs-lib/formats/hocon/test/comprehensive/expected.txt b/pkgs/pkgs-lib/formats/hocon/test/comprehensive/expected.txt new file mode 100644 index 0000000..ec196be --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/test/comprehensive/expected.txt @@ -0,0 +1,47 @@ +{ + "array2d" = [ + [ + 1, + 2, + "a" + ], + [ + 2, + 1, + "b" + ] + ] + "cursed \" .attrs \" " = { + "a" = 1 + "a b" = ${?a} + "a b c" = ${?a b} + } + "misc attrs" = { + "x" = 1 + "y" += { + "a" = 1 + } + } + "nasty_string" = "\"@\n\\\t^*bf\n0\";'''$" + "nested" = { + "attrset" = { + "has" = { + "a" = { + "integer" = { + "value" = 100 + } + } + } + } + } + "simple_top_level_attr" = "1.0" + "some_floaty" = 29.95 + "to_include" = { + include "/nix/store/ccnzr53dpipdacxgci3ii3bqacvb5hxm-hocon-test-include.conf" + include "https://example.com" + include required(file("/nix/store/ccnzr53dpipdacxgci3ii3bqacvb5hxm-hocon-test-include.conf")) + include "/nix/store/ccnzr53dpipdacxgci3ii3bqacvb5hxm-hocon-test-include.conf" + include url("https://example.com") + } +} + diff --git a/pkgs/pkgs-lib/formats/hocon/test/default.nix b/pkgs/pkgs-lib/formats/hocon/test/default.nix new file mode 100644 index 0000000..1992870 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/test/default.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: +{ + comprehensive = pkgs.callPackage ./comprehensive { }; + backwards-compatibility = + let + pkgsNoWarn = pkgs.extend (final: prev: { + lib = prev.lib.extend (libFinal: libPrev: { + warn = msg: v: v; + trivial = libPrev.trivial // { + warn = msg: v: v; + }; + }); + }); + in pkgsNoWarn.callPackage ./backwards-compatibility { }; +} diff --git a/pkgs/pkgs-lib/formats/hocon/update.sh b/pkgs/pkgs-lib/formats/hocon/update.sh new file mode 100755 index 0000000..ffc5ad3 --- /dev/null +++ b/pkgs/pkgs-lib/formats/hocon/update.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p cargo -i bash +cd "$(dirname "$0")" +cargo update diff --git a/pkgs/pkgs-lib/formats/java-properties/default.nix b/pkgs/pkgs-lib/formats/java-properties/default.nix new file mode 100644 index 0000000..d3a4761 --- /dev/null +++ b/pkgs/pkgs-lib/formats/java-properties/default.nix @@ -0,0 +1,132 @@ +{ lib, pkgs }: +let + inherit (lib) types; + inherit (types) attrsOf oneOf coercedTo str bool int float package; +in +{ + javaProperties = { comment ? "Generated with Nix", boolToString ? lib.boolToString }: { + + # Design note: + # A nested representation of inevitably leads to bad UX: + # 1. keys like "a.b" must be disallowed, or + # the addition of options in a freeformType module + # become breaking changes + # 2. adding a value for "a" after "a"."b" was already + # defined leads to a somewhat hard to understand + # Nix error, because that's not something you can + # do with attrset syntax. Workaround: "a"."", but + # that's too little too late. Another workaround: + # mkMerge [ { a = ...; } { a.b = ...; } ]. + # + # Choosing a non-nested representation does mean that + # we sacrifice the ability to override at the (conceptual) + # hierarchical levels, _if_ an application exhibits those. + # + # Some apps just use periods instead of spaces in an odd + # mix of attempted categorization and natural language, + # with no meaningful hierarchy. + # + # We _can_ choose to support hierarchical config files + # via nested attrsets, but the module author should + # make sure that problem (2) does not occur. + type = let + elemType = + oneOf ([ + # `package` isn't generalized to `path` because path values + # are ambiguous. Are they host path strings (toString /foo/bar) + # or should they be added to the store? ("${/foo/bar}") + # The user must decide. + (coercedTo package toString str) + + (coercedTo bool boolToString str) + (coercedTo int toString str) + (coercedTo float toString str) + ]) + // { description = "string, package, bool, int or float"; }; + in attrsOf elemType; + + generate = name: value: + pkgs.runCommandLocal name + { + # Requirements + # ============ + # + # 1. Strings in Nix carry over to the same + # strings in Java => need proper escapes + # 2. Generate files quickly + # - A JVM would have to match the app's + # JVM to avoid build closure bloat + # - Even then, JVM startup would slow + # down config generation. + # + # + # Implementation + # ============== + # + # Escaping has two steps + # + # 1. jq + # Escape known separators, in order not + # to break up the keys and values. + # This handles typical whitespace correctly, + # but may produce garbage for other control + # characters. + # + # 2. iconv + # Escape >ascii code points to java escapes, + # as .properties files are supposed to be + # encoded in ISO 8859-1. It's an old format. + # UTF-8 behavior may exist in some apps and + # libraries, but we can't rely on this in + # general. + + passAsFile = [ "value" ]; + value = builtins.toJSON value; + nativeBuildInputs = [ + pkgs.jq + pkgs.libiconvReal + ]; + + jqCode = + let + main = '' + to_entries + | .[] + | "\( + .key + | ${commonEscapes} + | gsub(" "; "\\ ") + | gsub("="; "\\=") + ) = \( + .value + | ${commonEscapes} + | gsub("^ "; "\\ ") + | gsub("\\n "; "\n\\ ") + )" + ''; + # Most escapes are equal for both keys and values. + commonEscapes = '' + gsub("\\\\"; "\\\\") + | gsub("\\n"; "\\n\\\n") + | gsub("#"; "\\#") + | gsub("!"; "\\!") + | gsub("\\t"; "\\t") + | gsub("\r"; "\\r") + ''; + in + main; + + inputEncoding = "UTF-8"; + + inherit comment; + + } '' + ( + echo "$comment" | while read -r ln; do echo "# $ln"; done + echo + jq -r --arg hash '#' "$jqCode" "$valuePath" \ + | iconv --from-code "$inputEncoding" --to-code JAVA \ + ) > "$out" + ''; + }; +} diff --git a/pkgs/pkgs-lib/formats/java-properties/test/Main.java b/pkgs/pkgs-lib/formats/java-properties/test/Main.java new file mode 100644 index 0000000..dc83944 --- /dev/null +++ b/pkgs/pkgs-lib/formats/java-properties/test/Main.java @@ -0,0 +1,27 @@ +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; +import java.util.SortedSet; +import java.util.TreeSet; + +class Main { + public static void main (String args[]) { + try { + InputStream input = new FileInputStream(args[0]); + Properties prop = new Properties(); + prop.load(input); + SortedSet keySet = new TreeSet(prop.keySet()); + for (String key : keySet) { + System.out.println("KEY"); + System.out.println(key); + System.out.println("VALUE"); + System.out.println(prop.get(key)); + System.out.println(""); + } + } catch (Exception e) { + e.printStackTrace(); + System.err.println(e.toString()); + System.exit(1); + } + } +} diff --git a/pkgs/pkgs-lib/formats/java-properties/test/default.nix b/pkgs/pkgs-lib/formats/java-properties/test/default.nix new file mode 100644 index 0000000..4a51179 --- /dev/null +++ b/pkgs/pkgs-lib/formats/java-properties/test/default.nix @@ -0,0 +1,92 @@ +{ fetchurl +, formats +, glibcLocales +, jdk +, lib +, stdenv +}: + +# This test primarily tests correct escaping. +# See also testJavaProperties in +# pkgs/pkgs-lib/tests/formats.nix, which tests +# type coercions and is a bit easier to read. + +let + inherit (lib) concatStrings attrValues mapAttrs; + + javaProperties = formats.javaProperties { }; + + input = { + foo = "bar"; + "empty value" = ""; + "typical.dot.syntax" = "com.sun.awt"; + "" = "empty key's value"; + "1" = "2 3"; + "#" = "not a comment # still not"; + "!" = "not a comment!"; + "!a" = "still not! a comment"; + "!b" = "still not ! a comment"; + "dos paths" = "C:\\Program Files\\Nix For Windows\\nix.exe"; + "a \t\nb" = " c"; + "angry \t\nkey" = '' + multi + ${"\tline\r"} + space- + indented + trailing-space${" "} + trailing-space${" "} + value + ''; + "this=not" = "bad"; + "nor = this" = "bad"; + "all stuff" = "foo = bar"; + "unicode big brain" = "e = mc□"; + "ütf-8" = "dûh"; + # NB: Some editors (vscode) show this _whole_ line in right-to-left order + "الجبر" = "أكثر من مجرد أرقام"; + }; + +in +stdenv.mkDerivation { + name = "pkgs.formats.javaProperties-test-${jdk.name}"; + nativeBuildInputs = [ + jdk + glibcLocales + ]; + + # technically should go through the type.merge first, but that's tested + # in tests/formats.nix. + properties = javaProperties.generate "example.properties" input; + + # Expected output as printed by Main.java + passAsFile = [ "expected" ]; + expected = concatStrings (attrValues ( + mapAttrs + (key: value: + '' + KEY + ${key} + VALUE + ${value} + + '' + ) + input + )); + + src = lib.sourceByRegex ./. [ + ".*\.java" + ]; + # On Linux, this can be C.UTF-8, but darwin + zulu requires en_US.UTF-8 + LANG = "en_US.UTF-8"; + buildPhase = '' + javac Main.java + ''; + doCheck = true; + checkPhase = '' + cat -v $properties + java Main $properties >actual + diff -U3 $expectedPath actual + ''; + installPhase = "touch $out"; +} diff --git a/pkgs/pkgs-lib/formats/libconfig/default.nix b/pkgs/pkgs-lib/formats/libconfig/default.nix new file mode 100644 index 0000000..7433a72 --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/default.nix @@ -0,0 +1,121 @@ +{ lib +, pkgs +}: +let + inherit (pkgs) buildPackages callPackage; + # Implementation notes: + # Libconfig spec: https://hyperrealm.github.io/libconfig/libconfig_manual.html + # + # Since libconfig does not allow setting names to start with an underscore, + # this is used as a prefix for both special types and include directives. + # + # The difference between 32bit and 64bit values became optional in libconfig + # 1.5, so we assume 64bit values for all numbers. + + libconfig-generator = buildPackages.rustPlatform.buildRustPackage { + name = "libconfig-generator"; + version = "0.1.0"; + src = ./src; + + passthru.updateScript = ./update.sh; + + cargoLock.lockFile = ./src/Cargo.lock; + }; + + libconfig-validator = buildPackages.runCommandCC "libconfig-validator" + { + buildInputs = with buildPackages; [ libconfig ]; + } + '' + mkdir -p "$out/bin" + $CC -lconfig -x c - -o "$out/bin/libconfig-validator" ${./validator.c} + ''; +in +{ + format = { generator ? libconfig-generator, validator ? libconfig-validator }: { + inherit generator; + + type = with lib.types; + let + valueType = (oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]) // { + description = "libconfig value"; + }; + in + attrsOf valueType; + + lib = { + mkHex = value: { + _type = "hex"; + inherit value; + }; + mkOctal = value: { + _type = "octal"; + inherit value; + }; + mkFloat = value: { + _type = "float"; + inherit value; + }; + mkArray = value: { + _type = "array"; + inherit value; + }; + mkList = value: { + _type = "list"; + inherit value; + }; + }; + + generate = name: value: + callPackage + ({ + stdenvNoCC + , libconfig-generator + , libconfig-validator + , writeText + }: stdenvNoCC.mkDerivation rec { + inherit name; + + dontUnpack = true; + + json = builtins.toJSON value; + passAsFile = [ "json" ]; + + strictDeps = true; + nativeBuildInputs = [ libconfig-generator ]; + buildPhase = '' + runHook preBuild + libconfig-generator < $jsonPath > output.cfg + runHook postBuild + ''; + + doCheck = true; + nativeCheckInputs = [ libconfig-validator ]; + checkPhase = '' + runHook preCheck + libconfig-validator output.cfg + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + mv output.cfg $out + runHook postInstall + ''; + + passthru.json = writeText "${name}.json" json; + }) + { + libconfig-generator = generator; + libconfig-validator = validator; + }; + }; +} diff --git a/pkgs/pkgs-lib/formats/libconfig/src/Cargo.lock b/pkgs/pkgs-lib/formats/libconfig/src/Cargo.lock new file mode 100644 index 0000000..f8f921f --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/src/Cargo.lock @@ -0,0 +1,40 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "libconfig-generator" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "serde" +version = "1.0.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" + +[[package]] +name = "serde_json" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +dependencies = [ + "itoa", + "ryu", + "serde", +] diff --git a/pkgs/pkgs-lib/formats/libconfig/src/Cargo.toml b/pkgs/pkgs-lib/formats/libconfig/src/Cargo.toml new file mode 100644 index 0000000..20ad44d --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/src/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "libconfig-generator" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = "1.0.178" +serde_json = "1.0.104" diff --git a/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs b/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs new file mode 100644 index 0000000..4da45f6 --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/src/src/main.rs @@ -0,0 +1,271 @@ +use serde_json::Value; +use std::mem::discriminant; + +#[derive(Debug)] +enum LibConfigIntNumber { + Oct(i64), + Hex(i64), + Int(i64), +} + +#[derive(Debug)] +enum LibConfigValue { + Bool(bool), + Int(LibConfigIntNumber), + Float(f64), + String(String), + Array(Vec), + List(Vec), + Group(Vec, Vec<(String, LibConfigValue)>), +} + +fn validate_setting_name(key: &str) -> bool { + let first_char = key.chars().next().expect("Empty setting name"); + (first_char.is_alphabetic() || first_char == '*') + && key[1..] + .chars() + .all(|c| c.is_alphanumeric() || c == '_' || c == '*') +} + +const SPECIAL_TYPES: [&str; 5] = ["octal", "hex", "float", "list", "array"]; + +fn object_is_special_type(o: &serde_json::Map) -> Option<&str> { + o.get("_type").and_then(|x| x.as_str()).and_then(|x| { + if SPECIAL_TYPES.contains(&x) { + Some(x) + } else { + None + } + }) +} + +fn vec_is_array(v: &Vec) -> bool { + if v.is_empty() { + return true; + } + + let first_item = v.first().unwrap(); + + if match first_item { + LibConfigValue::Array(_) => true, + LibConfigValue::List(_) => true, + LibConfigValue::Group(_, _) => true, + _ => false, + } { + return false; + }; + + v[1..] + .iter() + .all(|item| discriminant(first_item) == discriminant(item)) +} + +fn json_to_libconfig(v: &Value) -> LibConfigValue { + match v { + Value::Null => panic!("Null value not allowed in libconfig"), + Value::Bool(b) => LibConfigValue::Bool(b.clone()), + Value::Number(n) => { + if n.is_i64() { + LibConfigValue::Int(LibConfigIntNumber::Int(n.as_i64().unwrap())) + } else if n.is_f64() { + LibConfigValue::Float(n.as_f64().unwrap()) + } else { + panic!("{} is not i64 or f64, cannot be represented as number in libconfig", n); + } + } + Value::String(s) => LibConfigValue::String(s.to_string()), + Value::Array(a) => { + let items = a + .iter() + .map(|item| json_to_libconfig(item)) + .collect::>(); + LibConfigValue::List(items) + } + Value::Object(o) => { + if let Some(_type) = object_is_special_type(o) { + let value = o + .get("value") + .expect(format!("Missing value for special type: {}", &_type).as_str()); + + return match _type { + "octal" => { + let str_value = value + .as_str() + .expect( + format!("Value is not a string for special type: {}", &_type) + .as_str(), + ) + .to_owned(); + + LibConfigValue::Int(LibConfigIntNumber::Oct( + i64::from_str_radix(&str_value, 8) + .expect(format!("Invalid octal value: {}", value).as_str()), + )) + } + "hex" => { + let str_value = value + .as_str() + .expect( + format!("Value is not a string for special type: {}", &_type) + .as_str(), + ) + .to_owned(); + + LibConfigValue::Int(LibConfigIntNumber::Hex( + i64::from_str_radix(&str_value[2..], 16) + .expect(format!("Invalid hex value: {}", value).as_str()), + )) + } + "float" => { + let str_value = value + .as_str() + .expect( + format!("Value is not a string for special type: {}", &_type) + .as_str(), + ) + .to_owned(); + + LibConfigValue::Float( + str_value + .parse::() + .expect(format!("Invalid float value: {}", value).as_str()), + ) + } + "list" => { + let items = value + .as_array() + .expect( + format!("Value is not an array for special type: {}", &_type) + .as_str(), + ) + .to_owned() + .iter() + .map(|item| json_to_libconfig(item)) + .collect::>(); + + LibConfigValue::List(items) + } + "array" => { + let items = value + .as_array() + .expect( + format!("Value is not an array for special type: {}", &_type) + .as_str(), + ) + .to_owned() + .iter() + .map(|item| json_to_libconfig(item)) + .collect::>(); + + if !vec_is_array(&items) { + panic!( + "This can not be an array because of its contents: {:#?}", + items + ); + } + + LibConfigValue::Array(items) + } + _ => panic!("Invalid type: {}", _type), + }; + } + + let mut items = o + .iter() + .filter(|(key, _)| key.as_str() != "_includes") + .map(|(key, value)| (key.clone(), json_to_libconfig(value))) + .collect::>(); + items.sort_by(|(a,_),(b,_)| a.partial_cmp(b).unwrap()); + + let includes = o + .get("_includes") + .map(|x| { + x.as_array() + .expect("_includes is not an array") + .iter() + .map(|x| { + x.as_str() + .expect("_includes item is not a string") + .to_owned() + }) + .collect::>() + }) + .unwrap_or(vec![]); + + for (key,_) in items.iter() { + if !validate_setting_name(key) { + panic!("Invalid setting name: {}", key); + } + } + LibConfigValue::Group(includes, items) + } + } +} + +impl ToString for LibConfigValue { + fn to_string(&self) -> String { + match self { + LibConfigValue::Bool(b) => b.to_string(), + LibConfigValue::Int(i) => match i { + LibConfigIntNumber::Oct(n) => format!("0{:o}", n), + LibConfigIntNumber::Hex(n) => format!("0x{:x}", n), + LibConfigIntNumber::Int(n) => n.to_string(), + }, + LibConfigValue::Float(n) => format!("{:?}", n), + LibConfigValue::String(s) => { + format!("\"{}\"", s.replace("\\", "\\\\").replace("\"", "\\\"")) + } + LibConfigValue::Array(a) => { + let items = a + .iter() + .map(|item| item.to_string()) + .collect::>() + .join(", "); + format!("[{}]", items) + } + LibConfigValue::List(a) => { + let items = a + .iter() + .map(|item| item.to_string()) + .collect::>() + .join(", "); + format!("({})", items) + } + LibConfigValue::Group(i, o) => { + let includes = i + .iter() + .map(|x| x.replace("\\", "\\\\").replace("\"", "\\\"")) + .map(|x| format!("@include \"{}\"", x)) + .collect::>() + .join("\n"); + let items = o + .iter() + .map(|(key, value)| format!("{}={};", key, value.to_string())) + .collect::>() + .join(""); + if includes.is_empty() { + format!("{{{}}}", items) + } else { + format!("{{\n{}\n{}}}", includes, items) + } + } + } + } +} + +fn main() { + let stdin = std::io::stdin().lock(); + let json = serde_json::Deserializer::from_reader(stdin) + .into_iter::() + .next() + .expect("Could not read content from stdin") + .expect("Could not parse JSON from stdin"); + + for (key, value) in json + .as_object() + .expect("Top level of JSON file is not an object") + { + print!("{}={};", key, json_to_libconfig(value).to_string()); + } + print!("\n\n"); +} diff --git a/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/default.nix b/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/default.nix new file mode 100644 index 0000000..7b0df23 --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/default.nix @@ -0,0 +1,76 @@ +{ lib, formats, stdenvNoCC, writeText, ... }: +let + libconfig = formats.libconfig { }; + + include_expr = { + val = 1; + }; + + include_file = writeText "libconfig-test-include" '' + val=1; + ''; + + expression = { + simple_top_level_attr = "1.0"; + nested.attrset.has.a.integer.value = 100; + some_floaty = 29.95; + ## Same syntax here on these two, but they should get serialized differently: + # > A list may have zero or more elements, each of which can be a scalar value, an array, a group, or another list. + list1d = libconfig.lib.mkList [ 1 "mixed!" 5 2 ]; + # You might also omit the mkList, as a list will be a list (in contrast to an array) by default. + list2d = [ 1 [ 1 1.2 "foo" ] [ "bar" 1.2 1 ] ]; + # > An array may have zero or more elements, but the elements must all be scalar values of the same type. + array1d = libconfig.lib.mkArray [ 1 5 2 ]; + array2d = [ + (libconfig.lib.mkArray [ 1 2 ]) + (libconfig.lib.mkArray [ 2 1 ]) + ]; + nasty_string = "\"@\n\\\t^*\b\f\n\0\";'''$"; + + weirderTypes = { + _includes = [ include_file ]; + pi = 3.141592654; + bigint = 9223372036854775807; + hex = libconfig.lib.mkHex "0x1FC3"; + octal = libconfig.lib.mkOctal "0027"; + float = libconfig.lib.mkFloat "1.2E-3"; + array_of_ints = libconfig.lib.mkArray [ + (libconfig.lib.mkOctal "0732") + (libconfig.lib.mkHex "0xA3") + 1234 + ]; + list_of_weird_types = [ + 3.141592654 + 9223372036854775807 + (libconfig.lib.mkHex "0x1FC3") + (libconfig.lib.mkOctal "0027") + (libconfig.lib.mkFloat "1.2E-32") + (libconfig.lib.mkFloat "1") + ]; + }; + }; + + libconfig-test-cfg = libconfig.generate "libconfig-test.cfg" expression; +in + stdenvNoCC.mkDerivation { + name = "pkgs.formats.libconfig-test-comprehensive"; + + dontUnpack = true; + dontBuild = true; + + doCheck = true; + checkPhase = '' + cp ${./expected.txt} expected.txt + substituteInPlace expected.txt \ + --subst-var-by include_file "${include_file}" + diff -U3 ./expected.txt ${libconfig-test-cfg} + ''; + + installPhase = '' + mkdir $out + cp expected.txt $out + cp ${libconfig-test-cfg} $out/libconfig-test.cfg + cp ${libconfig-test-cfg.passthru.json} $out/libconfig-test.json + ''; + } + diff --git a/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/expected.txt b/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/expected.txt new file mode 100644 index 0000000..ef6e09f --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/test/comprehensive/expected.txt @@ -0,0 +1,6 @@ +array1d=[1, 5, 2];array2d=([1, 2], [2, 1]);list1d=(1, "mixed!", 5, 2);list2d=(1, (1, 1.2, "foo"), ("bar", 1.2, 1));nasty_string="\"@ +\\ ^*bf +0\";'''$";nested={attrset={has={a={integer={value=100;};};};};};simple_top_level_attr="1.0";some_floaty=29.95;weirderTypes={ +@include "@include_file@" +array_of_ints=[0732, 0xa3, 1234];bigint=9223372036854775807;float=0.0012;hex=0x1fc3;list_of_weird_types=(3.141592654, 9223372036854775807, 0x1fc3, 027, 1.2e-32, 1.0);octal=027;pi=3.141592654;}; + diff --git a/pkgs/pkgs-lib/formats/libconfig/test/default.nix b/pkgs/pkgs-lib/formats/libconfig/test/default.nix new file mode 100644 index 0000000..6cd03fe --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/test/default.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: +{ + comprehensive = pkgs.callPackage ./comprehensive { }; +} diff --git a/pkgs/pkgs-lib/formats/libconfig/update.sh b/pkgs/pkgs-lib/formats/libconfig/update.sh new file mode 100755 index 0000000..ffc5ad3 --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/update.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p cargo -i bash +cd "$(dirname "$0")" +cargo update diff --git a/pkgs/pkgs-lib/formats/libconfig/validator.c b/pkgs/pkgs-lib/formats/libconfig/validator.c new file mode 100644 index 0000000..738be0b --- /dev/null +++ b/pkgs/pkgs-lib/formats/libconfig/validator.c @@ -0,0 +1,21 @@ +// Copyright (C) 2005-2023 Mark A Lindner, ckie +// SPDX-License-Identifier: LGPL-2.1-or-later +#include +#include +int main(int argc, char **argv) +{ + config_t cfg; + config_init(&cfg); + if (argc != 2) + { + fprintf(stderr, "USAGE: validator "); + } + if(! config_read_file(&cfg, argv[1])) + { + fprintf(stderr, "[libconfig] %s:%d - %s\n", config_error_file(&cfg), + config_error_line(&cfg), config_error_text(&cfg)); + config_destroy(&cfg); + return 1; + } + printf("[libconfig] validation ok\n"); +} \ No newline at end of file diff --git a/pkgs/pkgs-lib/tests/default.nix b/pkgs/pkgs-lib/tests/default.nix new file mode 100644 index 0000000..8e5e243 --- /dev/null +++ b/pkgs/pkgs-lib/tests/default.nix @@ -0,0 +1,49 @@ +# Call nix-build on this file to run all tests in this directory + +# This produces a link farm derivation with the original attrs +# merged on top of it. +# You can run parts of the "hierarchy" with for example: +# nix-build -A java-properties +# See `structured` below. + +{ pkgs ? import ../../.. { } }: +let + inherit (pkgs.lib) mapAttrs mapAttrsToList isDerivation mergeAttrs foldl' attrValues recurseIntoAttrs; + + structured = { + formats = import ./formats.nix { inherit pkgs; }; + java-properties = recurseIntoAttrs { + jdk8 = pkgs.callPackage ../formats/java-properties/test { jdk = pkgs.jdk8; }; + jdk11 = pkgs.callPackage ../formats/java-properties/test { jdk = pkgs.jdk11_headless; }; + jdk17 = pkgs.callPackage ../formats/java-properties/test { jdk = pkgs.jdk17_headless; }; + }; + + libconfig = recurseIntoAttrs (import ../formats/libconfig/test { inherit pkgs; }); + + hocon = recurseIntoAttrs (import ../formats/hocon/test { inherit pkgs; }); + }; + + flatten = prefix: as: + foldl' + mergeAttrs + { } + (attrValues + (mapAttrs + (k: v: + if isDerivation v + then { "${prefix}${k}" = v; } + else if v?recurseForDerivations + then flatten "${prefix}${k}-" (removeAttrs v [ "recurseForDerivations" ]) + else builtins.trace v throw "expected derivation or recurseIntoAttrs") + as + ) + ); +in + +# It has to be a link farm for inclusion in the hydra unstable jobset. +pkgs.linkFarm "pkgs-lib-formats-tests" + (mapAttrsToList + (k: v: { name = k; path = v; }) + (flatten "" structured) + ) +// structured diff --git a/pkgs/pkgs-lib/tests/formats.nix b/pkgs/pkgs-lib/tests/formats.nix new file mode 100644 index 0000000..3243f40 --- /dev/null +++ b/pkgs/pkgs-lib/tests/formats.nix @@ -0,0 +1,428 @@ +{ pkgs }: +let + inherit (pkgs) lib formats; + + # merging allows us to add metadata to the input + # this makes error messages more readable during development + mergeInput = name: format: input: + format.type.merge [] [ + { + # explicitly throw here to trigger the code path that prints the error message for users + value = lib.throwIfNot (format.type.check input) (builtins.trace input "definition does not pass the type's check function") input; + # inject the name + file = "format-test-${name}"; + } + ]; + + # run a diff between expected and real output + runDiff = name: drv: expected: pkgs.runCommand name { + passAsFile = ["expected"]; + inherit expected drv; + } '' + if diff -u "$expectedPath" "$drv"; then + touch "$out" + else + echo + echo "Got different values than expected; diff above." + exit 1 + fi + ''; + + # use this to check for proper serialization + # in practice you do not have to supply the name parameter as this one will be added by runBuildTests + shouldPass = { format, input, expected }: name: { + name = "pass-${name}"; + path = runDiff "test-format-${name}" (format.generate "test-format-${name}" (mergeInput name format input)) expected; + }; + + # use this function to assert that a type check must fail + # in practice you do not have to supply the name parameter as this one will be added by runBuildTests + # note that as per 352e7d330a26 and 352e7d330a26 the type checking of attrsets and lists are not strict + # this means that the code below needs to properly merge the module type definition and also evaluate the (lazy) return value + shouldFail = { format, input }: name: + let + # trigger a deep type check using the module system + typeCheck = lib.modules.mergeDefinitions + [ "tests" name ] + format.type + [ + { + file = "format-test-${name}"; + value = input; + } + ]; + # actually use the return value to trigger the evaluation + eval = builtins.tryEval (typeCheck.mergedValue == input); + # the check failing is what we want, so don't do anything here + typeFails = pkgs.runCommand "test-format-${name}" {} "touch $out"; + # bail with some verbose information in case the type check passes + typeSucceeds = pkgs.runCommand "test-format-${name}" { + passAsFile = [ "inputText" ]; + testName = name; + # this will fail if the input contains functions as values + # however that should get caught by the type check already + inputText = builtins.toJSON input; + } + '' + echo "Type check $testName passed when it shouldn't." + echo "The following data was used as input:" + echo + cat "$inputTextPath" + exit 1 + ''; + in { + name = "fail-${name}"; + path = if eval.success then typeSucceeds else typeFails; + }; + + # this function creates a linkFarm for all the tests below such that the results are easily visible in the filesystem after a build + # the parameters are an attrset of name: test pairs where the name is automatically passed to the test + # the test therefore is an invocation of ShouldPass or shouldFail with the attrset parameters but *not* the name (which this adds for convenience) + runBuildTests = (lib.flip lib.pipe) [ + (lib.mapAttrsToList (name: value: value name)) + (pkgs.linkFarm "nixpkgs-pkgs-lib-format-tests") + ]; + +in runBuildTests { + + jsonAtoms = shouldPass { + format = formats.json {}; + input = { + null = null; + false = false; + true = true; + int = 10; + float = 3.141; + str = "foo"; + attrs.foo = null; + list = [ null null ]; + path = ./formats.nix; + }; + expected = '' + { + "attrs": { + "foo": null + }, + "false": false, + "float": 3.141, + "int": 10, + "list": [ + null, + null + ], + "null": null, + "path": "${./formats.nix}", + "str": "foo", + "true": true + } + ''; + }; + + yamlAtoms = shouldPass { + format = formats.yaml {}; + input = { + null = null; + false = false; + true = true; + float = 3.141; + str = "foo"; + attrs.foo = null; + list = [ null null ]; + path = ./formats.nix; + }; + expected = '' + attrs: + foo: null + 'false': false + float: 3.141 + list: + - null + - null + 'null': null + path: ${./formats.nix} + str: foo + 'true': true + ''; + }; + + iniAtoms = shouldPass { + format = formats.ini {}; + input = { + foo = { + bool = true; + int = 10; + float = 3.141; + str = "string"; + }; + }; + expected = '' + [foo] + bool=true + float=3.141000 + int=10 + str=string + ''; + }; + + iniInvalidAtom = shouldFail { + format = formats.ini {}; + input = { + foo = { + function = _: 1; + }; + }; + }; + + iniDuplicateKeysWithoutList = shouldFail { + format = formats.ini {}; + input = { + foo = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + }; + }; + + iniDuplicateKeys = shouldPass { + format = formats.ini { listsAsDuplicateKeys = true; }; + input = { + foo = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + }; + expected = '' + [foo] + bar=null + bar=true + bar=test + bar=1.200000 + bar=10 + baz=false + qux=qux + ''; + }; + + iniListToValue = shouldPass { + format = formats.ini { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); }; + input = { + foo = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + }; + expected = '' + [foo] + bar=null, true, test, 1.200000, 10 + baz=false + qux=qux + ''; + }; + + iniWithGlobalNoSections = shouldPass { + format = formats.iniWithGlobalSection {}; + input = {}; + expected = ""; + }; + + iniWithGlobalOnlySections = shouldPass { + format = formats.iniWithGlobalSection {}; + input = { + sections = { + foo = { + bar = "baz"; + }; + }; + }; + expected = '' + [foo] + bar=baz + ''; + }; + + iniWithGlobalOnlyGlobal = shouldPass { + format = formats.iniWithGlobalSection {}; + input = { + globalSection = { + bar = "baz"; + }; + }; + expected = '' + bar=baz + + ''; + }; + + iniWithGlobalWrongSections = shouldFail { + format = formats.iniWithGlobalSection {}; + input = { + foo = {}; + }; + }; + + iniWithGlobalEverything = shouldPass { + format = formats.iniWithGlobalSection {}; + input = { + globalSection = { + bar = true; + }; + sections = { + foo = { + bool = true; + int = 10; + float = 3.141; + str = "string"; + }; + }; + }; + expected = '' + bar=true + + [foo] + bool=true + float=3.141000 + int=10 + str=string + ''; + }; + + iniWithGlobalListToValue = shouldPass { + format = formats.iniWithGlobalSection { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); }; + input = { + globalSection = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + sections = { + foo = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + }; + }; + expected = '' + bar=null, true, test, 1.200000, 10 + baz=false + qux=qux + + [foo] + bar=null, true, test, 1.200000, 10 + baz=false + qux=qux + ''; + }; + + keyValueAtoms = shouldPass { + format = formats.keyValue {}; + input = { + bool = true; + int = 10; + float = 3.141; + str = "string"; + }; + expected = '' + bool=true + float=3.141000 + int=10 + str=string + ''; + }; + + keyValueDuplicateKeys = shouldPass { + format = formats.keyValue { listsAsDuplicateKeys = true; }; + input = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + expected = '' + bar=null + bar=true + bar=test + bar=1.200000 + bar=10 + baz=false + qux=qux + ''; + }; + + keyValueListToValue = shouldPass { + format = formats.keyValue { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); }; + input = { + bar = [ null true "test" 1.2 10 ]; + baz = false; + qux = "qux"; + }; + expected = '' + bar=null, true, test, 1.200000, 10 + baz=false + qux=qux + ''; + }; + + tomlAtoms = shouldPass { + format = formats.toml {}; + input = { + false = false; + true = true; + int = 10; + float = 3.141; + str = "foo"; + attrs.foo = "foo"; + list = [ 1 2 ]; + level1.level2.level3.level4 = "deep"; + }; + expected = '' + false = false + float = 3.141 + int = 10 + list = [1, 2] + str = "foo" + true = true + [attrs] + foo = "foo" + + [level1.level2.level3] + level4 = "deep" + ''; + }; + + # This test is responsible for + # 1. testing type coercions + # 2. providing a more readable example test + # Whereas java-properties/default.nix tests the low level escaping, etc. + javaProperties = shouldPass { + format = formats.javaProperties {}; + input = { + floaty = 3.1415; + tautologies = true; + contradictions = false; + foo = "bar"; + # # Disallowed at eval time, because it's ambiguous: + # # add to store or convert to string? + # root = /root; + "1" = 2; + package = pkgs.hello; + "ütf 8" = "dûh"; + # NB: Some editors (vscode) show this _whole_ line in right-to-left order + "الجبر" = "أكثر من مجرد أرقام"; + }; + expected = '' + # Generated with Nix + + 1 = 2 + contradictions = false + floaty = 3.141500 + foo = bar + package = ${pkgs.hello} + tautologies = true + \u00fctf\ 8 = d\u00fbh + \u0627\u0644\u062c\u0628\u0631 = \u0623\u0643\u062b\u0631 \u0645\u0646 \u0645\u062c\u0631\u062f \u0623\u0631\u0642\u0627\u0645 + ''; + }; +} diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix new file mode 100644 index 0000000..2304b32 --- /dev/null +++ b/pkgs/stdenv/adapters.nix @@ -0,0 +1,345 @@ +/* This file contains various functions that take a stdenv and return + a new stdenv with different behaviour, e.g. using a different C + compiler. */ + +{ lib, pkgs, config }: + +let + # N.B. Keep in sync with default arg for stdenv/generic. + defaultMkDerivationFromStdenv = stdenv: (import ./generic/make-derivation.nix { inherit lib config; } stdenv).mkDerivation; + + # Low level function to help with overriding `mkDerivationFromStdenv`. One + # gives it the old stdenv arguments and a "continuation" function, and + # underneath the final stdenv argument it yields to the continuation to do + # whatever it wants with old `mkDerivation` (old `mkDerivationFromStdenv` + # applied to the *new, final* stdenv) provided for convenience. + withOldMkDerivation = stdenvSuperArgs: k: stdenvSelf: let + mkDerivationFromStdenv-super = stdenvSuperArgs.mkDerivationFromStdenv or defaultMkDerivationFromStdenv; + mkDerivationSuper = mkDerivationFromStdenv-super stdenvSelf; + in + k stdenvSelf mkDerivationSuper; + + # Wrap the original `mkDerivation` providing extra args to it. + extendMkDerivationArgs = old: f: withOldMkDerivation old (_: mkDerivationSuper: args: + (mkDerivationSuper args).overrideAttrs f); + + # Wrap the original `mkDerivation` transforming the result. + overrideMkDerivationResult = old: f: withOldMkDerivation old (_: mkDerivationSuper: args: + f (mkDerivationSuper args)); +in + +rec { + + + # Override the compiler in stdenv for specific packages. + overrideCC = stdenv: cc: stdenv.override { allowedRequisites = null; cc = cc; }; + + + # Add some arbitrary packages to buildInputs for specific packages. + # Used to override packages in stdenv like Make. Should not be used + # for other dependencies. + overrideInStdenv = stdenv: pkgs: + stdenv.override (prev: { allowedRequisites = null; extraBuildInputs = (prev.extraBuildInputs or []) ++ pkgs; }); + + + # Override the libc++ dynamic library used in the stdenv to use the one from the platform’s + # default stdenv. This allows building packages and linking dependencies with different + # compiler versions while still using the same libc++ implementation for compatibility. + # + # Note that this adapter still uses the headers from the new stdenv’s libc++. This is necessary + # because older compilers may not be able to parse the headers from the default stdenv’s libc++. + overrideLibcxx = stdenv: + assert stdenv.cc.libcxx != null; + assert pkgs.stdenv.cc.libcxx != null; + # only unified libcxx / libcxxabi stdenv's are supported + assert lib.versionAtLeast pkgs.stdenv.cc.libcxx.version "12"; + assert lib.versionAtLeast stdenv.cc.libcxx.version "12"; + let + llvmLibcxxVersion = lib.getVersion llvmLibcxx; + + stdenvLibcxx = pkgs.stdenv.cc.libcxx; + llvmLibcxx = stdenv.cc.libcxx; + + libcxx = pkgs.runCommand "${stdenvLibcxx.name}-${llvmLibcxxVersion}" { + outputs = [ "out" "dev" ]; + isLLVM = true; + } '' + mkdir -p "$dev/nix-support" + ln -s '${stdenvLibcxx}' "$out" + echo '${stdenvLibcxx}' > "$dev/nix-support/propagated-build-inputs" + ln -s '${lib.getDev llvmLibcxx}/include' "$dev/include" + ''; + in + overrideCC stdenv (stdenv.cc.override { + inherit libcxx; + extraPackages = [ + pkgs.buildPackages.targetPackages."llvmPackages_${lib.versions.major llvmLibcxxVersion}".compiler-rt + ]; + }); + + # Override the setup script of stdenv. Useful for testing new + # versions of the setup script without causing a rebuild of + # everything. + # + # Example: + # randomPkg = import ../bla { ... + # stdenv = overrideSetup stdenv ../stdenv/generic/setup-latest.sh; + # }; + overrideSetup = stdenv: setupScript: stdenv.override { inherit setupScript; }; + + + # Return a modified stdenv that tries to build statically linked + # binaries. + makeStaticBinaries = stdenv0: + stdenv0.override (old: { + mkDerivationFromStdenv = withOldMkDerivation old (stdenv: mkDerivationSuper: args: + if stdenv.hostPlatform.isDarwin + then throw "Cannot build fully static binaries on Darwin/macOS" + else (mkDerivationSuper args).overrideAttrs (args: { + NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -static"; + } // lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) { + configureFlags = (args.configureFlags or []) ++ [ + "--disable-shared" # brrr... + ]; + cmakeFlags = (args.cmakeFlags or []) ++ ["-DCMAKE_SKIP_INSTALL_RPATH=On"]; + })); + } // lib.optionalAttrs (stdenv0.hostPlatform.libc == "glibc") { + extraBuildInputs = (old.extraBuildInputs or []) ++ [ + pkgs.glibc.static + ]; + }); + + + # Return a modified stdenv that builds static libraries instead of + # shared libraries. + makeStaticLibraries = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + dontDisableStatic = true; + } // lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) { + configureFlags = (args.configureFlags or []) ++ [ + "--enable-static" + "--disable-shared" + ]; + cmakeFlags = (args.cmakeFlags or []) ++ [ "-DBUILD_SHARED_LIBS:BOOL=OFF" ]; + mesonFlags = (args.mesonFlags or []) ++ [ "-Ddefault_library=static" ]; + }); + }); + + # Best effort static binaries. Will still be linked to libSystem, + # but more portable than Nix store binaries. + makeStaticDarwin = stdenv: stdenv.override (old: { + # extraBuildInputs are dropped in cross.nix, but darwin still needs them + extraBuildInputs = [ pkgs.buildPackages.darwin.CF ]; + mkDerivationFromStdenv = withOldMkDerivation old (stdenv: mkDerivationSuper: args: + (mkDerivationSuper args).overrideAttrs (prevAttrs: { + NIX_CFLAGS_LINK = toString (prevAttrs.NIX_CFLAGS_LINK or "") + + lib.optionalString (stdenv.cc.isGNU or false) " -static-libgcc"; + nativeBuildInputs = (prevAttrs.nativeBuildInputs or []) + ++ lib.optionals stdenv.hasCC [ + (pkgs.buildPackages.makeSetupHook { + name = "darwin-portable-libSystem-hook"; + substitutions = { + libsystem = "${stdenv.cc.libc}/lib/libSystem.B.dylib"; + targetPrefix = stdenv.cc.bintools.targetPrefix; + }; + } ./darwin/portable-libsystem.sh) + ]; + })); + }); + + # Puts all the other ones together + makeStatic = stdenv: lib.foldl (lib.flip lib.id) stdenv ( + lib.optional stdenv.hostPlatform.isDarwin makeStaticDarwin + + ++ [ makeStaticLibraries propagateBuildInputs ] + + # Apple does not provide a static version of libSystem or crt0.o + # So we can’t build static binaries without extensive hacks. + ++ lib.optional (!stdenv.hostPlatform.isDarwin) makeStaticBinaries + ); + + + /* Modify a stdenv so that all buildInputs are implicitly propagated to + consuming derivations + */ + propagateBuildInputs = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + propagatedBuildInputs = (args.propagatedBuildInputs or []) ++ (args.buildInputs or []); + buildInputs = []; + }); + }); + + + /* Modify a stdenv so that the specified attributes are added to + every derivation returned by its mkDerivation function. + + Example: + stdenvNoOptimise = + addAttrsToDerivation + { env.NIX_CFLAGS_COMPILE = "-O0"; } + stdenv; + */ + addAttrsToDerivation = extraAttrs: stdenv: stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (_: extraAttrs); + }); + + + /* Use the trace output to report all processed derivations with their + license name. + */ + traceDrvLicenses = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = overrideMkDerivationResult (pkg: + let + printDrvPath = val: let + drvPath = builtins.unsafeDiscardStringContext pkg.drvPath; + license = pkg.meta.license or null; + in + builtins.trace "@:drv:${toString drvPath}:${builtins.toString license}:@" val; + in pkg // { + outPath = printDrvPath pkg.outPath; + drvPath = printDrvPath pkg.drvPath; + }); + }); + + + /* Modify a stdenv so that it produces debug builds; that is, + binaries have debug info, and compiler optimisations are + disabled. */ + keepDebugInfo = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + dontStrip = true; + env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " -ggdb -Og"; }; + }); + }); + + + /* Modify a stdenv so that it uses the Gold linker. */ + useGoldLinker = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -fuse-ld=gold"; + }); + }); + + /* Copy the libstdc++ from the model stdenv to the target stdenv. + * + * TODO(@connorbaker): + * This interface provides behavior which should be revisited prior to the + * release of 24.05. For a more detailed explanation and discussion, see + * https://github.com/NixOS/nixpkgs/issues/283517. */ + useLibsFrom = modelStdenv: targetStdenv: + let + ccForLibs = modelStdenv.cc.cc; + /* NOTE(@connorbaker): + * This assumes targetStdenv.cc is a cc-wrapper. */ + cc = targetStdenv.cc.override { + /* NOTE(originally by rrbutani): + * Normally the `useCcForLibs`/`gccForLibs` mechanism is used to get a + * clang based `cc` to use `libstdc++` (from gcc). + * + * Here we (ab)use it to use a `libstdc++` from a different `gcc` than our + * `cc`. + * + * Note that this does not inhibit our `cc`'s lib dir from being added to + * cflags/ldflags (see `cc_solib` in `cc-wrapper`) but this is okay: our + * `gccForLibs`'s paths should take precedence. */ + useCcForLibs = true; + gccForLibs = ccForLibs; + }; + in + overrideCC targetStdenv cc; + + useMoldLinker = stdenv: let + bintools = stdenv.cc.bintools.override { + extraBuildCommands = '' + wrap ${stdenv.cc.bintools.targetPrefix}ld.mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold + wrap ${stdenv.cc.bintools.targetPrefix}ld ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold + ''; + }; + in stdenv.override (old: { + allowedRequisites = null; + cc = stdenv.cc.override { inherit bintools; }; + # gcc >12.1.0 supports '-fuse-ld=mold' + # the wrap ld above in bintools supports gcc <12.1.0 and shouldn't harm >12.1.0 + # https://github.com/rui314/mold#how-to-use + } // lib.optionalAttrs (stdenv.cc.isClang || (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "12")) { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -fuse-ld=mold"; + }); + }); + + + /* Modify a stdenv so that it builds binaries optimized specifically + for the machine they are built on. + + WARNING: this breaks purity! */ + impureUseNativeOptimizations = stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " -march=native"; }; + + NIX_ENFORCE_NO_NATIVE = false; + + preferLocalBuild = true; + allowSubstitutes = false; + }); + }); + + + /* Modify a stdenv so that it builds binaries with the specified list of + compilerFlags appended and passed to the compiler. + + This example would recompile every derivation on the system with + -funroll-loops and -O3 passed to each gcc invocation. + + Example: + nixpkgs.overlays = [ + (self: super: { + stdenv = super.withCFlags [ "-funroll-loops" "-O3" ] super.stdenv; + }) + ]; + */ + withCFlags = compilerFlags: stdenv: + stdenv.override (old: { + mkDerivationFromStdenv = extendMkDerivationArgs old (args: { + env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " ${toString compilerFlags}"; }; + }); + }); + + # Overriding the SDK changes the Darwin SDK used to build the package, which: + # * Ensures that the compiler and bintools have the correct Libsystem version; and + # * Replaces any SDK references with those in the SDK corresponding to the requested SDK version. + # + # `sdkVersion` can be any of the following: + # * A version string indicating the requested SDK version; or + # * An attrset consisting of either or both of the following fields: darwinSdkVersion and darwinMinVersion. + overrideSDK = import ./darwin/override-sdk.nix { + inherit lib extendMkDerivationArgs; + inherit (pkgs) + stdenvNoCC + pkgsBuildBuild + pkgsBuildHost + pkgsBuildTarget + pkgsHostHost + pkgsHostTarget + pkgsTargetTarget; + }; + + withDefaultHardeningFlags = defaultHardeningFlags: stdenv: let + bintools = let + bintools' = stdenv.cc.bintools; + in if bintools' ? override then (bintools'.override { + inherit defaultHardeningFlags; + }) else bintools'; + in + stdenv.override (old: { + cc = if stdenv.cc == null then null else stdenv.cc.override { + inherit bintools; + }; + allowedRequisites = lib.mapNullable (rs: rs ++ [ bintools ]) (stdenv.allowedRequisites or null); + }); +} diff --git a/pkgs/stdenv/booter.nix b/pkgs/stdenv/booter.nix new file mode 100644 index 0000000..7fc1fa4 --- /dev/null +++ b/pkgs/stdenv/booter.nix @@ -0,0 +1,142 @@ +# This file defines a single function for booting a package set from a list of +# stages. The exact mechanics of that function are defined below; here I +# (@Ericson2314) wish to describe the purpose of the abstraction. +# +# The first goal is consistency across stdenvs. Regardless of what this function +# does, by making every stdenv use it for bootstrapping we ensure that they all +# work in a similar way. [Before this abstraction, each stdenv was its own +# special snowflake due to different authors writing in different times.] +# +# The second goal is consistency across each stdenv's stage functions. By +# writing each stage in terms of the previous stage, commonalities between them +# are more easily observable. [Before, there usually was a big attribute set +# with each stage, and stages would access the previous stage by name.] +# +# The third goal is composition. Because each stage is written in terms of the +# previous, the list can be reordered or, more practically, extended with new +# stages. The latter is used for cross compiling and custom +# stdenvs. Additionally, certain options should by default apply only to the +# last stage, whatever it may be. By delaying the creation of stage package sets +# until the final fold, we prevent these options from inhibiting composition. +# +# The fourth and final goal is debugging. Normal packages should only source +# their dependencies from the current stage. But for the sake of debugging, it +# is nice that all packages still remain accessible. We make sure previous +# stages are kept around with a `stdenv.__bootPackges` attribute referring the +# previous stage. It is idiomatic that attributes prefixed with `__` come with +# special restrictions and should not be used under normal circumstances. +{ lib, allPackages }: + +# Type: +# [ pkgset -> (args to stage/default.nix) or ({ __raw = true; } // pkgs) ] +# -> pkgset +# +# In english: This takes a list of function from the previous stage pkgset and +# returns the final pkgset. Each of those functions returns, if `__raw` is +# undefined or false, args for this stage's pkgset (the most complex and +# important arg is the stdenv), or, if `__raw = true`, simply this stage's +# pkgset itself. +# +# The list takes stages in order, so the final stage is last in the list. In +# other words, this does a foldr not foldl. +stageFuns: let + + /* "dfold" a ternary function `op' between successive elements of `list' as if + it was a doubly-linked list with `lnul' and `rnul` base cases at either + end. In precise terms, `dfold op lnul rnul [x_0 x_1 x_2 ... x_n-1]` is the + same as + + let + f_-1 = lnul f_0; + f_0 = op f_-1 x_0 f_1; + f_1 = op f_0 x_1 f_2; + f_2 = op f_1 x_2 f_3; + ... + f_n = op f_n-1 x_n f_n+1; + f_n+1 = rnul f_n; + in + f_0 + */ + dfold = op: lnul: rnul: list: + let + len = builtins.length list; + go = pred: n: + if n == len + then rnul pred + else let + # Note the cycle -- call-by-need ensures finite fold. + cur = op pred (builtins.elemAt list n) succ; + succ = go cur (n + 1); + in cur; + lapp = lnul cur; + cur = go lapp 0; + in cur; + + # Take the list and disallow custom overrides in all but the final stage, + # and allow it in the final flag. Only defaults this boolean field if it + # isn't already set. + withAllowCustomOverrides = lib.lists.imap1 + (index: stageFun: prevStage: + # So true by default for only the first element because one + # 1-indexing. Since we reverse the list, this means this is true + # for the final stage. + { allowCustomOverrides = index == 1; } + // (stageFun prevStage)) + (lib.lists.reverseList stageFuns); + + # Adds the stdenv to the arguments, and sticks in it the previous stage for + # debugging purposes. + folder = nextStage: stageFun: prevStage: let + args = stageFun prevStage; + args' = args // { + stdenv = args.stdenv // { + # For debugging + __bootPackages = prevStage; + __hatPackages = nextStage; + }; + }; + thisStage = + if args.__raw or false + then args' + else allPackages ((builtins.removeAttrs args' ["selfBuild"]) // { + adjacentPackages = if args.selfBuild or true then null else rec { + pkgsBuildBuild = prevStage.buildPackages; + pkgsBuildHost = prevStage; + pkgsBuildTarget = + if args.stdenv.targetPlatform == args.stdenv.hostPlatform + then pkgsBuildHost + else assert args.stdenv.hostPlatform == args.stdenv.buildPlatform; thisStage; + pkgsHostHost = + if args.stdenv.hostPlatform == args.stdenv.targetPlatform + then thisStage + else assert args.stdenv.buildPlatform == args.stdenv.hostPlatform; pkgsBuildHost; + pkgsTargetTarget = nextStage; + }; + }); + in thisStage; + + # This is a hack for resolving cross-compiled compilers' run-time + # deps. (That is, compilers that are themselves cross-compiled, as + # opposed to used to cross-compile packages.) + postStage = buildPackages: { + __raw = true; + stdenv.cc = + if buildPackages.stdenv.hasCC + then + if buildPackages.stdenv.cc.isClang or false + # buildPackages.clang checks targetPackages.stdenv.cc (i. e. this + # attribute) to get a sense of the its set's default compiler and + # chooses between libc++ and libstdc++ based on that. If we hit this + # code here, we'll cause an infinite recursion. Since a set with + # clang as its default compiler always means libc++, we can infer this + # decision statically. + then buildPackages.llvmPackages.libcxxClang + else buildPackages.gcc + else + # This will blow up if anything uses it, but that's OK. The `if + # buildPackages.stdenv.cc.isClang then ... else ...` would blow up + # everything, so we make sure to avoid that. + buildPackages.stdenv.cc; + }; + +in dfold folder postStage (_: {}) withAllowCustomOverrides diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix new file mode 100644 index 0000000..cf6a55f --- /dev/null +++ b/pkgs/stdenv/cross/default.nix @@ -0,0 +1,90 @@ +{ lib +, localSystem, crossSystem, config, overlays, crossOverlays ? [] +}: + +let + bootStages = import ../. { + inherit lib localSystem overlays; + + crossSystem = localSystem; + crossOverlays = []; + + # Ignore custom stdenvs when cross compiling for compatibility + config = builtins.removeAttrs config [ "replaceStdenv" ]; + }; + +in lib.init bootStages ++ [ + + # Regular native packages + (somePrevStage: lib.last bootStages somePrevStage // { + # It's OK to change the built-time dependencies + allowCustomOverrides = true; + }) + + # Build tool Packages + (vanillaPackages: { + inherit config overlays; + selfBuild = false; + stdenv = + assert vanillaPackages.stdenv.buildPlatform == localSystem; + assert vanillaPackages.stdenv.hostPlatform == localSystem; + assert vanillaPackages.stdenv.targetPlatform == localSystem; + vanillaPackages.stdenv.override { targetPlatform = crossSystem; }; + # It's OK to change the built-time dependencies + allowCustomOverrides = true; + }) + + # Run Packages + (buildPackages: let + adaptStdenv = + if crossSystem.isStatic + then buildPackages.stdenvAdapters.makeStatic + else lib.id; + in { + inherit config; + overlays = overlays ++ crossOverlays; + selfBuild = false; + stdenv = adaptStdenv (buildPackages.stdenv.override (old: rec { + buildPlatform = localSystem; + hostPlatform = crossSystem; + targetPlatform = crossSystem; + + # Prior overrides are surely not valid as packages built with this run on + # a different platform, and so are disabled. + overrides = _: _: {}; + extraBuildInputs = [ ] # Old ones run on wrong platform + ++ lib.optionals hostPlatform.isDarwin [ buildPackages.targetPackages.darwin.apple_sdk.frameworks.CoreFoundation ] + ; + allowedRequisites = null; + + hasCC = !targetPlatform.isGhcjs; + + cc = if crossSystem.useiOSPrebuilt or false + then buildPackages.darwin.iosSdkPkgs.clang + else if crossSystem.useAndroidPrebuilt or false + then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".clang + else if targetPlatform.isGhcjs + # Need to use `throw` so tryEval for splicing works, ugh. Using + # `null` or skipping the attribute would cause an eval failure + # `tryEval` wouldn't catch, wrecking accessing previous stages + # when there is a C compiler and everything should be fine. + then throw "no C compiler provided for this platform" + else if crossSystem.isDarwin + then buildPackages.llvmPackages.libcxxClang + else if crossSystem.useLLVM or false + then buildPackages.llvmPackages.clang + else buildPackages.gcc; + + extraNativeBuildInputs = old.extraNativeBuildInputs + ++ lib.optionals + (hostPlatform.isLinux && !buildPlatform.isLinux) + [ buildPackages.patchelf ] + ++ lib.optional + (let f = p: !p.isx86 || builtins.elem p.libc [ "musl" "wasilibc" "relibc" ] || p.isiOS || p.isGenode; + in f hostPlatform && !(f buildPlatform) ) + buildPackages.updateAutotoolsGnuConfigScriptsHook + ; + })); + }) + +] diff --git a/pkgs/stdenv/custom/default.nix b/pkgs/stdenv/custom/default.nix new file mode 100644 index 0000000..4c73801 --- /dev/null +++ b/pkgs/stdenv/custom/default.nix @@ -0,0 +1,25 @@ +{ lib +, localSystem, crossSystem, config, overlays, crossOverlays ? [] +}: + +assert crossSystem == localSystem; + +let + bootStages = import ../. { + inherit lib localSystem crossSystem overlays; + # Remove config.replaceStdenv to ensure termination. + config = builtins.removeAttrs config [ "replaceStdenv" ]; + }; + +in bootStages ++ [ + + # Additional stage, built using custom stdenv + (vanillaPackages: { + inherit config overlays; + stdenv = + assert vanillaPackages.hostPlatform == localSystem; + assert vanillaPackages.targetPlatform == localSystem; + config.replaceStdenv { pkgs = vanillaPackages; }; + }) + +] diff --git a/pkgs/stdenv/cygwin/all-buildinputs-as-runtimedep.sh b/pkgs/stdenv/cygwin/all-buildinputs-as-runtimedep.sh new file mode 100644 index 0000000..7cb6a58 --- /dev/null +++ b/pkgs/stdenv/cygwin/all-buildinputs-as-runtimedep.sh @@ -0,0 +1,16 @@ +# On cygwin, automatic runtime dependency detection does not work +# because the binaries do not contain absolute references to store +# locations (yet) +postFixupHooks+=(_cygwinAllBuildInputsAsRuntimeDep) + +_cygwinAllBuildInputsAsRuntimeDep() { + if [ -n "$buildInputs" ]; then + mkdir -p "$out/nix-support" + echo "$buildInputs" >> "$out/nix-support/cygwin-buildinputs-as-runtime-deps" + fi + + if [ -n "$nativeBuildInputs" ]; then + mkdir -p "$out/nix-support" + echo "$nativeBuildInputs" >> "$out/nix-support/cygwin-buildinputs-as-runtime-deps" + fi +} diff --git a/pkgs/stdenv/cygwin/rebase-i686.sh b/pkgs/stdenv/cygwin/rebase-i686.sh new file mode 100644 index 0000000..6b8ec44 --- /dev/null +++ b/pkgs/stdenv/cygwin/rebase-i686.sh @@ -0,0 +1,24 @@ +fixupOutputHooks+=(_cygwinFixAutoImageBase) + +_cygwinFixAutoImageBase() { + if [ "${dontRebase-}" == 1 ] || [ ! -d "$prefix" ]; then + return + fi + find "$prefix" -name "*.dll" -type f | while read DLL; do + if [ -f /etc/rebasenix.nextbase ]; then + NEXTBASE="$(>16)+1)<<16)) + + echo "REBASE FIX: $DLL $BASE -> $NEXTBASE" + /bin/rebase -b $NEXTBASE $DLL + NEXTBASE="0x`printf %x $(($NEXTBASE+$SKIP))`" + + echo $NEXTBASE > /etc/rebasenix.nextbase + done +} diff --git a/pkgs/stdenv/cygwin/rebase-x86_64.sh b/pkgs/stdenv/cygwin/rebase-x86_64.sh new file mode 100644 index 0000000..6dccdc4 --- /dev/null +++ b/pkgs/stdenv/cygwin/rebase-x86_64.sh @@ -0,0 +1,24 @@ +fixupOutputHooks+=(_cygwinFixAutoImageBase) + +_cygwinFixAutoImageBase() { + if [ "${dontRebase-}" == 1 ] || [ ! -d "$prefix" ]; then + return + fi + find "$prefix" -name "*.dll" -type f | while read DLL; do + if [ -f /etc/rebasenix.nextbase ]; then + NEXTBASE="$(>16)+1)<<16)) + + echo "REBASE FIX: $DLL $BASE -> $NEXTBASE" + /bin/rebase -b $NEXTBASE $DLL + NEXTBASE="0x`printf %x $(($NEXTBASE+$SKIP))`" + + echo $NEXTBASE > /etc/rebasenix.nextbase + done +} diff --git a/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh b/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh new file mode 100644 index 0000000..d0da8c1 --- /dev/null +++ b/pkgs/stdenv/cygwin/wrap-exes-to-find-dlls.sh @@ -0,0 +1,74 @@ +postFixupHooks+=(_cygwinWrapExesToFindDlls) + +_cygwinWrapExesToFindDlls() { + find $out -type l | while read LINK; do + TARGET="$(readlink "${LINK}")" + + # fix all non .exe links that link explicitly to a .exe + if [[ ${TARGET} == *.exe ]] && [[ ${LINK} != *.exe ]]; then + mv "${LINK}" "${LINK}.exe" + LINK="${LINK}.exe" + fi + + # generate complementary filenames + if [[ ${LINK} == *.exe ]]; then + _LINK="${LINK%.exe}" + _TARGET="${TARGET%.exe}" + else + _LINK="${LINK}.exe" + _TARGET="${TARGET}.exe" + fi + + # check if sould create complementary link + DOLINK=1 + if [[ ${_TARGET} == *.exe ]]; then + # the canonical target has to be a .exe + CTARGET="$(readlink -f "${LINK}")" + if [[ ${CTARGET} != *.exe ]]; then + CTARGET="${CTARGET}.exe" + fi + + if [ ! -e "${CTARGET}" ]; then + unset DOLINK + fi + fi + + if [ -e "${_LINK}" ]; then + # complementary link seems to exist + # but could be cygwin smoke and mirrors + INO=$(stat -c%i "${LINK}") + _INO=$(stat -c%i "${_LINK}") + if [ "${INO}" -ne "${_INO}" ]; then + unset DOLINK + fi + fi + + # create complementary link + if [ -n "${DOLINK}" ]; then + ln -s "${_TARGET}" "${_LINK}.tmp" + mv "${_LINK}.tmp" "${_LINK}" + fi + done + + find $out -type f -name "*.exe" | while read EXE; do + WRAPPER="${EXE%.exe}" + if [ -e "${WRAPPER}" ]; then + # check if really exists or cygwin smoke and mirrors + INO=$(stat -c%i "${EXE}") + _INO=$(stat -c%i "${WRAPPER}") + if [ "${INO}" -ne "${_INO}" ]; then + continue + fi + fi + + mv "${EXE}" "${EXE}.tmp" + + cat >"${WRAPPER}" < { + url = "http://tarballs.nixos.org/stdenv/aarch64-apple-darwin/d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f/bootstrap-tools.tar.xz"; + hash = "sha256-a37OgMdTHjFyKs4UTxoD7zx6Te3A7zsSjhbFHzbNxQ8="; + }; + unpack = import { + url = "http://tarballs.nixos.org/stdenv/aarch64-apple-darwin/d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f/unpack.nar.xz"; + hash = "sha256-XCVy6TMDJ1DKFnhIT1NHzdQUjY/TPKLV67Zi/ANIpms="; + name = "unpack"; + unpack = true; + }; +} diff --git a/pkgs/stdenv/darwin/bootstrap-files/x86_64-apple-darwin.nix b/pkgs/stdenv/darwin/bootstrap-files/x86_64-apple-darwin.nix new file mode 100644 index 0000000..bbef3ec --- /dev/null +++ b/pkgs/stdenv/darwin/bootstrap-files/x86_64-apple-darwin.nix @@ -0,0 +1,22 @@ +# Autogenerated by maintainers/scripts/bootstrap-files/refresh-tarballs.bash as: +# $ ./refresh-tarballs.bash --targets=x86_64-apple-darwin +# +# Metadata: +# - nixpkgs revision: d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f +# - hydra build: https://hydra.nixos.org/job/nixpkgs/trunk/stdenvBootstrapTools.x86_64-apple-darwin.build/latest +# - resolved hydra build: https://hydra.nixos.org/build/255281731 +# - instantiated derivation: /nix/store/44wnr0ikrbcxkakfqhhm2cz6gsh6wjni-stdenv-bootstrap-tools.drv +# - output directory: /nix/store/lsl9rl3zj9nr318w471vvmlvxzj21b2k-stdenv-bootstrap-tools +# - build time: Wed, 03 Apr 2024 07:56:15 +0000 +{ + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-apple-darwin/d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f/bootstrap-tools.tar.xz"; + hash = "sha256-3OBigzlbu/Z6g8r7hsOWg95HTv7IJw9Nvbamwvw+88w="; + }; + unpack = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-apple-darwin/d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f/unpack.nar.xz"; + hash = "sha256-93GK8LjjgUBknxsylfGVr0DG4AbWVIQEIWrwxhDW07k="; + name = "unpack"; + unpack = true; + }; +} diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix new file mode 100644 index 0000000..3ab2382 --- /dev/null +++ b/pkgs/stdenv/darwin/default.nix @@ -0,0 +1,1380 @@ +# This file contains the standard build environment for Darwin. It is based on LLVM and is patterned +# after the Linux stdenv. It shares similar goals to the Linux standard environment in that the +# resulting environment should be built purely and not contain any references to it. +# +# For more on the design of the stdenv and updating it, see `README.md`. +# +# See also the top comments of the Linux stdenv `../linux/default.nix` for a good overview of +# the bootstrap process and working with it. + +{ lib +, localSystem +, crossSystem +, config +, overlays +, crossOverlays ? [ ] + # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools +, bootstrapFiles ? if localSystem.isAarch64 then + import ./bootstrap-files/aarch64-apple-darwin.nix + else + import ./bootstrap-files/x86_64-apple-darwin.nix +}: + +assert crossSystem == localSystem; + +let + inherit (localSystem) system; + + useAppleSDKLibs = localSystem.isAarch64; + + commonImpureHostDeps = [ + "/bin/sh" + "/usr/lib/libSystem.B.dylib" + "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up + ]; + + isFromNixpkgs = pkg: !(isFromBootstrapFiles pkg); + isFromBootstrapFiles = + pkg: pkg.passthru.isFromBootstrapFiles or false; + isBuiltByNixpkgsCompiler = + pkg: isFromNixpkgs pkg && isFromNixpkgs pkg.stdenv.cc.cc; + isBuiltByBootstrapFilesCompiler = + pkg: isFromNixpkgs pkg && isFromBootstrapFiles pkg.stdenv.cc.cc; + + commonPreHook = '' + export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1} + export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1} + export NIX_IGNORE_LD_THROUGH_GCC=1 + unset SDKROOT + ''; + + bootstrapTools = derivation ({ + inherit system; + + name = "bootstrap-tools"; + builder = "${bootstrapFiles.unpack}/bin/bash"; + + args = [ + "${bootstrapFiles.unpack}/bootstrap-tools-unpack.sh" + bootstrapFiles.bootstrapTools + ]; + + PATH = lib.makeBinPath [ + (placeholder "out") + bootstrapFiles.unpack + ]; + + __impureHostDeps = commonImpureHostDeps; + } // lib.optionalAttrs config.contentAddressedByDefault { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }) // { passthru.isFromBootstrapFiles = true; }; + + stageFun = prevStage: + { name, overrides ? (self: super: { }), extraNativeBuildInputs ? [ ], extraPreHook ? "" }: + + let + cc = if prevStage.llvmPackages.clang-unwrapped == null + then null else + lib.makeOverridable (import ../../build-support/cc-wrapper) { + name = "${name}-clang-wrapper"; + + nativeTools = false; + nativeLibc = false; + + expand-response-params = lib.optionalString + (prevStage.stdenv.hasCC or false && prevStage.stdenv.cc != "/dev/null") + prevStage.expand-response-params; + + extraPackages = [ + prevStage.llvmPackages.compiler-rt + ]; + + extraBuildCommands = + let + inherit (prevStage.llvmPackages) clang-unwrapped compiler-rt release_version; + in + '' + function clangResourceRootIncludePath() { + clangLib="$1/lib/clang" + if (( $(ls "$clangLib" | wc -l) > 1 )); then + echo "Multiple LLVM versions were found at "$clangLib", but there must only be one used when building the stdenv." >&2 + exit 1 + fi + echo "$clangLib/$(ls -1 "$clangLib")/include" + } + + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "$(clangResourceRootIncludePath "${clang-unwrapped.lib}")" "$rsrc" + ln -s "${compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${compiler-rt.out}/share" "$rsrc/share" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + + cc = prevStage.llvmPackages.clang-unwrapped; + bintools = prevStage.darwin.binutils; + + isClang = true; + libc = prevStage.darwin.Libsystem; + inherit (prevStage.llvmPackages) libcxx; + + inherit lib; + inherit (prevStage) coreutils gnugrep; + + stdenvNoCC = prevStage.ccWrapperStdenv; + runtimeShell = prevStage.ccWrapperStdenv.shell; + }; + + bash = prevStage.bash or bootstrapTools; + + thisStdenv = import ../generic { + name = "${name}-stdenv-darwin"; + + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + + inherit config; + + extraBuildInputs = [ prevStage.darwin.CF ]; + extraNativeBuildInputs = extraNativeBuildInputs + ++ [ prevStage.darwin.apple_sdk.sdkRoot ]; + + preHook = lib.optionalString (!isBuiltByNixpkgsCompiler bash) '' + # Don't patch #!/interpreter because it leads to retained + # dependencies on the bootstrapTools in the final stdenv. + dontPatchShebangs=1 + '' + '' + ${commonPreHook} + ${extraPreHook} + '' + lib.optionalString (prevStage.darwin ? locale) '' + export PATH_LOCALE=${prevStage.darwin.locale}/share/locale + ''; + + shell = bash + "/bin/bash"; + initialPath = [ bash bootstrapTools ]; + + fetchurlBoot = import ../../build-support/fetchurl { + inherit lib; + stdenvNoCC = prevStage.ccWrapperStdenv or thisStdenv; + curl = bootstrapTools; + }; + + inherit cc; + + # The stdenvs themselves don't use mkDerivation, so I need to specify this here + __stdenvImpureHostDeps = commonImpureHostDeps; + __extraImpureHostDeps = commonImpureHostDeps; + + # Using the bootstrap tools curl for fetchers allows the stdenv bootstrap to avoid + # having a dependency on curl, allowing curl to be updated without triggering a + # new stdenv bootstrap on Darwin. + overrides = self: super: (overrides self super) // { + fetchurl = thisStdenv.fetchurlBoot; + fetchpatch = super.fetchpatch.override { inherit (self) fetchurl; }; + fetchgit = super.fetchgit.override { + git = super.git.override { curl = bootstrapTools; }; + }; + fetchzip = super.fetchzip.override { inherit (self) fetchurl; }; + }; + }; + + in + { + inherit config overlays; + stdenv = thisStdenv; + }; +in + assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check +[ + ({}: { + __raw = true; + + coreutils = null; + gnugrep = null; + + pbzx = null; + cpio = null; + + darwin = { + apple_sdk.sdkRoot = null; + binutils = null; + binutils-unwrapped = null; + cctools = null; + print-reexports = null; + rewrite-tbd = null; + sigtool = null; + CF = null; + Libsystem = null; + }; + + llvmPackages = { + clang-unwrapped = null; + libllvm = null; + libcxx = null; + compiler-rt = null; + }; + }) + + # Create a stage with the bootstrap tools. This will be used to build the subsequent stages and + # build up the standard environment. + # + # Note: Each stage depends only on the the packages in `prevStage`. If a package is not to be + # rebuilt, it should be passed through by inheriting it. + (prevStage: stageFun prevStage { + name = "bootstrap-stage0"; + + overrides = self: super: { + # We thread stage0's stdenv through under this name so downstream stages + # can use it for wrapping gcc too. This way, downstream stages don't need + # to refer to this stage directly, which violates the principle that each + # stage should only access the stage that came before it. + ccWrapperStdenv = self.stdenv; + + bash = bootstrapTools; + coreutils = bootstrapTools; + cpio = bootstrapTools; + gnugrep = bootstrapTools; + pbzx = bootstrapTools; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + # Prevent CF from being propagated to the initial stdenv. Packages that require it + # will have to manually add it to their build inputs. + CF = null; + + binutils-unwrapped = bootstrapTools // { + version = "boot"; + }; + + binutils = super.wrapBintoolsWith { + name = "bootstrap-stage0-binutils-wrapper"; + + nativeTools = false; + nativeLibc = false; + + expand-response-params = ""; + libc = selfDarwin.Libsystem; + + inherit lib; + inherit (self) stdenvNoCC coreutils gnugrep; + runtimeShell = self.stdenvNoCC.shell; + + bintools = selfDarwin.binutils-unwrapped; + + inherit (selfDarwin) postLinkSignHook signingUtils; + }; + + cctools = bootstrapTools // { + targetPrefix = ""; + version = "boot"; + man = bootstrapTools; + }; + + locale = self.stdenv.mkDerivation { + name = "bootstrap-stage0-locale"; + buildCommand = '' + mkdir -p $out/share/locale + ''; + }; + + print-reexports = bootstrapTools; + + rewrite-tbd = bootstrapTools; + + sigtool = bootstrapTools; + } // lib.optionalAttrs (! useAppleSDKLibs) { + Libsystem = self.stdenv.mkDerivation { + name = "bootstrap-stage0-Libsystem"; + buildCommand = '' + mkdir -p $out + + cp -r ${selfDarwin.darwin-stubs}/usr/lib $out/lib + chmod -R +w $out/lib + substituteInPlace $out/lib/libSystem.B.tbd --replace /usr/lib/system $out/lib/system + + ln -s libSystem.B.tbd $out/lib/libSystem.tbd + + for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do + ln -s libSystem.tbd $out/lib/lib$name.tbd + done + + ln -s ${bootstrapTools}/lib/*.o $out/lib + + ln -s ${bootstrapTools}/lib/libresolv.9.dylib $out/lib + ln -s libresolv.9.dylib $out/lib/libresolv.dylib + + ln -s ${bootstrapTools}/include-Libsystem $out/include + ''; + passthru.isFromBootstrapFiles = true; + }; + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (selfTools: _: { + libclang = self.stdenv.mkDerivation { + name = "bootstrap-stage0-clang"; + version = "boot"; + outputs = [ "out" "lib" ]; + buildCommand = '' + mkdir -p $out/lib + ln -s $out $lib + ln -s ${bootstrapTools}/bin $out/bin + ln -s ${bootstrapTools}/lib/clang $out/lib + ln -s ${bootstrapTools}/include $out + ''; + passthru = { + isFromBootstrapFiles = true; + hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" ]; + }; + }; + clang-unwrapped = selfTools.libclang; + libllvm = self.stdenv.mkDerivation { + name = "bootstrap-stage0-llvm"; + outputs = [ "out" "lib" ]; + buildCommand = '' + mkdir -p $out/bin $out/lib + ln -s $out $lib + ln -s ${bootstrapTools}/bin/strip $out/bin/llvm-strip + ln -s ${bootstrapTools}/lib/libLLVM* $out/lib + ''; + passthru.isFromBootstrapFiles = true; + }; + llvm = selfTools.libllvm; + }); + libraries = super.llvmPackages.libraries.extend (_: _: { + libcxx = self.stdenv.mkDerivation { + name = "bootstrap-stage0-libcxx"; + buildCommand = '' + mkdir -p $out/lib $out/include + ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib + ln -s ${bootstrapTools}/include/c++ $out/include + ''; + passthru = { + isLLVM = true; + isFromBootstrapFiles = true; + }; + }; + compiler-rt = self.stdenv.mkDerivation { + name = "bootstrap-stage0-compiler-rt"; + buildCommand = '' + mkdir -p $out/lib $out/share + ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib + ln -s ${bootstrapTools}/lib/darwin $out/lib + ''; + passthru.isFromBootstrapFiles = true; + }; + }); + in + { inherit tools libraries; } // tools // libraries + ); + }; + + # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM + # is rebuilt, and darwin.binutils can use its implementation instead. + extraPreHook = '' + stripAllFlags=" " # the cctools "strip" command doesn't know "-s" + stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p" + ''; + }) + + # This stage is primarily responsible for building the linker and setting up versions of + # certain dependencies needed by the rest of the build process. It is necessary to rebuild the + # linker because the `compiler-rt` build process checks the version and attempts to manually + # run `codesign` if it detects a version of `ld64` it considers too old. If that happens, the + # build process will fail for a few different reasons: + # - sigtool is too old and does not accept the `--sign` argument; + # - sigtool is new enough to accept the `--sign` argument, but it aborts when it is invoked on a + # binary that is already signed; or + # - compiler-rt attempts to invoke `codesign` on x86_64-darwin, but `sigtool` is not currently + # part of the x86_64-darwin bootstrap tools. + # + # This stage also builds CF and Libsystem to simplify assertions and assumptions for later by + # making sure both packages are present on x86_64-darwin and aarch64-darwin. + (prevStage: + # previous stage0 stdenv: + assert lib.all isFromBootstrapFiles ( + with prevStage; [ bash coreutils cpio gnugrep ] ++ lib.optionals useAppleSDKLibs [ pbzx ] + ); + + assert lib.all isFromBootstrapFiles (with prevStage.darwin; [ + binutils-unwrapped cctools print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isFromBootstrapFiles (with prevStage.darwin; [ Libsystem ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ Libsystem ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]); + assert (with prevStage.darwin; (! useAppleSDKLibs) -> CF == null); + + assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx + ]); + + stageFun prevStage { + name = "bootstrap-stage1"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + coreutils gnugrep; + + # Use this stage’s CF to build CMake. It’s required but can’t be included in the stdenv. + cmake = self.cmakeMinimal; + cmakeMinimal = super.cmakeMinimal.overrideAttrs (old: { + buildInputs = old.buildInputs ++ [ self.darwin.CF ]; + }); + + # Disable tests because they use dejagnu, which fails to run. + libffi = super.libffi.override { doCheck = false; }; + + # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds. + libxml2 = super.libxml2.override { pythonSupport = false; }; + + ninja = super.ninja.override { buildDocs = false; }; + + # Use this stage’s CF to build Python. It’s required but can’t be included in the stdenv. + python3 = self.python3Minimal; + python3Minimal = super.python3Minimal.overrideAttrs (old: { + buildInputs = old.buildInputs ++ [ self.darwin.CF ]; + }); + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + + # Use this stage’s CF to build configd. It’s required but can’t be included in the stdenv. + configd = superDarwin.configd.overrideAttrs (old: { + buildInputs = old.buildInputs or [ ] ++ [ self.darwin.CF ]; + }); + + signingUtils = prevStage.darwin.signingUtils.override { + inherit (selfDarwin) sigtool; + }; + + postLinkSignHook = prevStage.darwin.postLinkSignHook.override { + inherit (selfDarwin) sigtool; + }; + + binutils = superDarwin.binutils.override { + inherit (self) coreutils; + inherit (selfDarwin) postLinkSignHook signingUtils; + + bintools = selfDarwin.binutils-unwrapped; + libc = selfDarwin.Libsystem; + # TODO(@sternenseemann): can this be removed? + runtimeShell = "${bootstrapTools}/bin/bash"; + }; + + binutils-unwrapped = superDarwin.binutils-unwrapped.override { + inherit (selfDarwin) cctools; + }; + + cctools = selfDarwin.cctools-port; + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm; + }); + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM + # is rebuilt, and darwin.binutils can use its implementation instead. + extraPreHook = '' + stripAllFlags=" " # the cctools "strip" command doesn't know "-s" + stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p" + + # Don’t assume the ld64 in bootstrap tools supports response files. Only recent versions do. + export NIX_LD_USE_RESPONSE_FILE=0 + ''; + }) + + # Build cctools, Python, and sysctl for use by LLVM’s check phase. They must be built in + # their stage to prevent infinite recursions and to make sure the stdenv used to build + # LLVM has the newly built cctools instead of the one from the bootstrap tools. + (prevStage: + # previous stage1 stdenv: + assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash binutils-unwrapped bison brotli cmake cpio cyrus_sasl db + ed expat flex gettext gmp groff icu libedit libffi libiconv libidn2 libkrb5 libssh2 + libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl + patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite + subversion texinfo unzip which xz zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool + ]); + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]); + + assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx + ]); + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == "boot"; + + stageFun prevStage { + name = "bootstrap-stage1-sysctl"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal + coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu + libedit libffi libiconv libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 + ncurses nghttp2 ninja openldap openssh openssl patchutils pbzx perl pkg-config + python3Minimal scons sed serf sharutils sqlite subversion texinfo unzip which xz + zlib zstd; + + # Support for the SystemConfiguration framework is required to run the LLVM tests, but trying + # to override python3Minimal does not appear to work. + python3 = (super.python3.override { + inherit (self) libffi; + inherit (self.darwin) configd; + openssl = null; + readline = null; + ncurses = null; + gdbm = null; + sqlite = null; + tzdata = null; + stripConfig = true; + stripIdlelib = true; + stripTests = true; + stripTkinter = true; + rebuildBytecode = false; + stripBytecode = true; + includeSiteCustomize = false; + enableOptimizations = false; + enableLTO = false; + mimetypesSupport = false; + }).overrideAttrs (_: { pname = "python3-minimal-scproxy"; }); + + darwin = super.darwin.overrideScope (_: superDarwin: { + inherit (prevStage.darwin) + CF sdkRoot Libsystem binutils-unwrapped cctools cctools-port configd darwin-stubs dyld + launchd libclosure libdispatch libobjc locale objc4 postLinkSignHook + print-reexports rewrite-tbd signingUtils sigtool; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm; + clang = prevStage.stdenv.cc; + }); + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + # Until LLVM is rebuilt, assume `strip` is the one from cctools. + extraPreHook = '' + stripAllFlags=" " # the cctools "strip" command doesn't know "-s" + stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p" + ''; + }) + + # First rebuild of LLVM. While this LLVM is linked to a bunch of junk from the bootstrap tools, + # the libc++ and libc++abi it produces are not. The compiler will be rebuilt in a later stage, + # but those libraries will be used in the final stdenv. + # + # Rebuild coreutils and gnugrep to avoid unwanted references to the bootstrap tools on `PATH`. + (prevStage: + # previous stage-sysctl stdenv: + assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash binutils-unwrapped bison brotli cmake cpio cyrus_sasl db + ed expat flex gettext gmp groff icu libedit libffi libiconv libidn2 libkrb5 libssh2 + libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl + patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite + subversion sysctl.provider texinfo unzip which xz zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]); + + assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx + ]); + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-port; + + stageFun prevStage { + name = "bootstrap-stage-xclang"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal + cpio cyrus_sasl db ed expat flex gettext gmp groff icu libedit libffi libiconv + libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2 ninja + openldap openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal + scons sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zlib zstd; + + # Switch from cctools-port to cctools-llvm now that LLVM has been built. + darwin = super.darwin.overrideScope (_: superDarwin: { + inherit (prevStage.darwin) + CF Libsystem configd darwin-stubs dyld launchd libclosure libdispatch libobjc + locale objc4 postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + + # Avoid building unnecessary Python dependencies due to building LLVM manpages. + cctools-llvm = superDarwin.cctools-llvm.override { enableManpages = false; }; + }); + + llvmPackages = super.llvmPackages // ( + let + llvmMajor = lib.versions.major super.llvmPackages.release_version; + + # libc++, and libc++abi do not need CoreFoundation. Avoid propagating the CF from prior + # stages to the final stdenv via rpath by dropping it from `extraBuildInputs`. + stdenvNoCF = self.stdenv.override { + extraBuildInputs = [ ]; + }; + + libcxxBootstrapStdenv = self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override { + nixSupport.cc-cflags = [ "-nostdlib" ]; + nixSupport.cc-ldflags = [ "-lSystem" ]; + }); + + libraries = super.llvmPackages.libraries.extend (selfLib: superLib: { + compiler-rt = null; + libcxx = superLib.libcxx.override ({ + stdenv = libcxxBootstrapStdenv; + }); + }); + in + { inherit libraries; } // libraries + ); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + extraPreHook = '' + stripAllFlags=" " # the cctools "strip" command doesn't know "-s" + stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p" + ''; + }) + + # This stage rebuilds Libsystem. It also rebuilds bash, which will be needed in later stages + # to use in patched shebangs (e.g., to make sure `icu-config` uses bash from nixpkgs). + (prevStage: + # previous stage-xclang stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash binutils-unwrapped bison cmake cmakeMinimal coreutils cpio + cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libtool m4 ninja + openbsm openldap openpam openssh patchutils pbzx perl pkg-config.pkg-config python3 + python3Minimal scons serf sqlite subversion sysctl.provider texinfo unzip which xz + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + brotli libffi libiconv libidn2 libkrb5 libssh2 libunistring libxml2 ncurses + nghttp2 openssl zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]); + assert prevStage.llvmPackages.compiler-rt == null; + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-port; + + stageFun prevStage { + + name = "bootstrap-stage2-Libsystem"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake binutils-unwrapped bison brotli cmake cmakeMinimal coreutils + cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libffi + libiconv libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2 + ninja openbsm openldap openpam openssh openssl patchutils pbzx perl pkg-config + python3 python3Minimal scons serf sqlite subversion sysctl texinfo unzip which xz + zlib zstd; + + # Bash must be linked against the system CoreFoundation instead of the open-source one. + # Otherwise, there will be a dependency cycle: bash -> CF -> icu -> bash (for icu^dev). + bash = super.bash.overrideAttrs (super: { + buildInputs = super.buildInputs ++ [ self.darwin.apple_sdk.frameworks.CoreFoundation ]; + }); + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) + CF binutils-unwrapped cctools configd darwin-stubs launchd libobjc libtapi locale + objc4 print-reexports rewrite-tbd signingUtils sigtool; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang libllvm llvm; + }); + + libraries = super.llvmPackages.libraries.extend (selfLib: superLib: { + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); + + # Don’t link anything in this stage against CF to prevent propagating CF from prior stages to + # the final stdenv, which happens because of the rpath hook. + stdenv = + let + stdenvNoCF = super.stdenv.override { + extraBuildInputs = [ ]; + }; + in + self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override { + inherit (self.llvmPackages) libcxx; + }); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + extraPreHook = '' + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + ''; + }) + + # This stage rebuilds CF, compiler-rt, and the sdkRoot derivation. + # + # CF requires: + # - aarch64-darwin: libobjc (due to being apple_sdk.frameworks.CoreFoundation instead of swift-corefoundation) + # - x86_64-darwin: libiconv libxml2 icu zlib + (prevStage: + # previous stage2-Libsystem stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake binutils-unwrapped bison brotli cmake cmakeMinimal coreutils + cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libidn2 + libkrb5 libssh2 libtool libunistring m4 nghttp2 ninja openbsm openldap openpam openssh + openssl patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf + sqlite subversion sysctl.provider texinfo unzip which xz zstd + ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ bash ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + libffi libiconv libxml2 ncurses zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]); + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]); + assert prevStage.llvmPackages.compiler-rt == null; + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm; + + stageFun prevStage { + + name = "bootstrap-stage2-CF"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash bison brotli cmake cmakeMinimal coreutils cpio + cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 + libssh2 libtool libunistring m4 ncurses nghttp2 ninja openbsm openldap openpam + openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons serf + sqlite subversion sysctl texinfo unzip which xz zstd; + + # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds. + libxml2 = super.libxml2.override { pythonSupport = false; }; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) + Libsystem configd darwin-stubs launchd locale print-reexports rewrite-tbd + signingUtils sigtool; + + # Rewrap binutils so it uses the rebuilt Libsystem. + binutils = superDarwin.binutils.override { + inherit (prevStage) expand-response-params; + libc = selfDarwin.Libsystem; + } // { + passthru = { inherit (prevStage.bintools.passthru) isFromBootstrapFiles; }; + }; + + # Avoid building unnecessary Python dependencies due to building LLVM manpages. + cctools-llvm = superDarwin.cctools-llvm.override { enableManpages = false; }; + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang libllvm llvm; + clang = prevStage.stdenv.cc; + }); + + libraries = super.llvmPackages.libraries.extend (selfLib: superLib: { + inherit (prevStage.llvmPackages) libcxx; + + # Make sure compiler-rt is linked against the CF from this stage, which can be + # propagated to the final stdenv. CF is required by ASAN. + compiler-rt = superLib.compiler-rt.override ({ + inherit (self.llvmPackages) libllvm; + stdenv = self.stdenv.override { + extraBuildInputs = [ self.darwin.CF ]; + }; + }); + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); + + # Don’t link anything in this stage against CF to prevent propagating CF from prior stages to + # the final stdenv, which happens because of the rpath hook. Also don’t use a stdenv with + # compiler-rt because it needs to be built in this stage. + stdenv = + let + stdenvNoCF = super.stdenv.override { + extraBuildInputs = [ ]; + }; + in + self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override { + inherit (self.llvmPackages) libcxx; + + # Make sure the stdenv is using the Libsystem that will be propagated to the final stdenv. + libc = self.darwin.Libsystem; + bintools = self.llvmPackages.clangNoCompilerRtWithLibc.bintools.override { + libc = self.darwin.Libsystem; + }; + }); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + extraPreHook = '' + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + ''; + }) + + # Rebuild LLVM with LLVM. This stage also rebuilds certain dependencies needed by LLVM. + # + # LLVM requires: libcxx libffi libiconv libxml2 ncurses zlib + (prevStage: + # previous stage2-CF stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bison brotli cmake cmakeMinimal coreutils cpio cyrus_sasl + db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 libssh2 libtool + libunistring m4 ncurses nghttp2 ninja openbsm openldap openpam openssh openssl + patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite + subversion sysctl.provider texinfo unzip which xz zstd + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ + bash binutils-unwrapped icu libffi libiconv libxml2 zlib + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + locale print-reexports rewrite-tbd sigtool + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libtapi + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]); + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]); + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm; + + stageFun prevStage { + + name = "bootstrap-stage3"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal + coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit + libidn2 libkrb5 libssh2 libtool libunistring m4 nghttp2 ninja openbsm openldap + openpam openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons + sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zstd + + # CF dependencies - don’t rebuild them. + icu libiconv libxml2 zlib; + + # Disable tests because they use dejagnu, which fails to run. + libffi = super.libffi.override { doCheck = false; }; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) + CF Libsystem binutils binutils-unwrapped cctools cctools-llvm cctools-port configd + darwin-stubs dyld launchd libclosure libdispatch libobjc libtapi locale objc4 + postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + }); + + llvmPackages = super.llvmPackages // ( + let + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit libraries; } // libraries + ); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + extraPreHook = '' + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + ''; + }) + + # Construct a standard environment with the new clang. Also use the new compiler to rebuild + # everything that will be part of the final stdenv and isn’t required by it, CF, or Libsystem. + (prevStage: + # previous stage3 stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bison brotli cmake cmakeMinimal coreutils cpio cyrus_sasl + db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 libssh2 libtool + libunistring m4 nghttp2 ninja openbsm openldap openpam openssh openssl patchutils pbzx + perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite subversion + sysctl.provider texinfo unzip which xz zstd + ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ + bash binutils-unwrapped icu libffi libiconv libxml2 zlib + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + locale print-reexports rewrite-tbd sigtool + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libtapi + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]); + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx + ]); + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm; + + stageFun prevStage { + + name = "bootstrap-stage4"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash bison cmake cmakeMinimal cyrus_sasl db expat flex groff + libedit libtool m4 ninja openldap openssh patchutils perl pkg-config python3 scons + serf sqlite subversion sysctl texinfo unzip which + + # CF dependencies - don’t rebuild them. + icu + + # LLVM dependencies - don’t rebuild them. + libffi libiconv libxml2 ncurses zlib; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) dyld CF Libsystem darwin-stubs + # CF dependencies - don’t rebuild them. + libobjc objc4; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + + signingUtils = superDarwin.signingUtils.override { + inherit (selfDarwin) sigtool; + }; + + binutils = superDarwin.binutils.override { + inherit (prevStage) expand-response-params; + + bintools = selfDarwin.binutils-unwrapped; + libc = selfDarwin.Libsystem; + }; + + # cctools needs to build the LLVM man pages, which requires sphinx. Sphinx + # has hatch-vcs as a transitive dependency, which pulls in git (and curl). + # Disabling the tests for hatch-vcs allows the stdenv bootstrap to avoid having + # any dependency on curl other than the one provided in the bootstrap tools. + cctools-llvm = superDarwin.cctools-llvm.override (old: { + llvmPackages = + let + tools = old.llvmPackages.tools.extend (_: superTools: { + llvm-manpages = superTools.llvm-manpages.override { + python3Packages = prevStage.python3Packages.overrideScope (_: superPython: { + hatch-vcs = (superPython.hatch-vcs.override { + git = null; + pytestCheckHook = null; + }); + }); + }; + }); + inherit (old.llvmPackages) libraries release_version; + in + { inherit tools libraries release_version; } // tools // libraries; + }); + }); + + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm; + libcxxClang = lib.makeOverridable (import ../../build-support/cc-wrapper) { + nativeTools = false; + nativeLibc = false; + + inherit (prevStage) expand-response-params; + + extraPackages = [ + self.llvmPackages.compiler-rt + ]; + + extraBuildCommands = + let + inherit (self.llvmPackages) clang-unwrapped compiler-rt release_version; + + # Clang 16+ uses only the major version in resource-root, but older versions use the complete one. + clangResourceRootIncludePath = clangLib: clangRelease: + let + clangVersion = + if lib.versionAtLeast clangRelease "16" + then lib.versions.major clangRelease + else clangRelease; + in + "${clangLib}/lib/clang/${clangVersion}/include"; + in + '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${clangResourceRootIncludePath clang-unwrapped.lib release_version}" "$rsrc" + ln -s "${compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${compiler-rt.out}/share" "$rsrc/share" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ''; + + cc = self.llvmPackages.clang-unwrapped; + bintools = self.darwin.binutils; + + isClang = true; + libc = self.darwin.Libsystem; + inherit (self.llvmPackages) libcxx; + + inherit lib; + inherit (self) stdenvNoCC coreutils gnugrep runtimeShell; + }; + }); + libraries = super.llvmPackages.libraries.extend (_: _:{ + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit tools libraries; } // tools // libraries + ); + }; + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ]; + + extraPreHook = '' + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + ''; + }) + + # Construct the final stdenv. The version of LLVM provided should match the one defined in + # `all-packages.nix` for Darwin. Nothing should depend on the bootstrap tools or originate from + # the bootstrap tools. + # + # When updating the Darwin stdenv, make sure that the result has no dependency (`nix-store -qR`) + # on `bootstrapTools` or the binutils built in stage 1. + (prevStage: + # previous stage4 stdenv: + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ + bash binutils-unwrapped brotli bzip2 cpio diffutils ed file findutils gawk + gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libidn2 libkrb5 + libssh2 libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch + pbzx pcre python3Minimal xar xz zlib zstd + ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libtapi locale print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem configd ]); + assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bison cmake cmakeMinimal cyrus_sasl db expat flex groff libedit + libtool m4 ninja openldap openssh patchutils perl pkg-config.pkg-config python3 scons + serf sqlite subversion sysctl.provider texinfo unzip which + ]); + + assert prevStage.darwin.cctools == prevStage.darwin.cctools-llvm; + + let + doSign = localSystem.isAarch64; + + cc = prevStage.llvmPackages.clang; + in + { + inherit config overlays; + stdenv = import ../generic { + name = "stdenv-darwin"; + + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + + inherit config; + + preHook = '' + ${commonPreHook} + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + export PATH_LOCALE=${prevStage.darwin.locale}/share/locale + ''; + + initialPath = ((import ../generic/common-path.nix) { pkgs = prevStage; }); + + extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + ] ++ [ prevStage.darwin.apple_sdk.sdkRoot ]; + + extraBuildInputs = [ prevStage.darwin.CF ]; + + inherit cc; + + shell = cc.shell; + + inherit (prevStage.stdenv) fetchurlBoot; + + extraAttrs = { + inherit bootstrapTools; + libc = prevStage.darwin.Libsystem; + shellPackage = prevStage.bash; + } // lib.optionalAttrs useAppleSDKLibs { + # This objc4 will be propagated to all builds using the final stdenv, + # and we shouldn't mix different builds, because they would be + # conflicting LLVM modules. Export it here so we can grab it later. + inherit (prevStage.darwin) objc4; + }; + + disallowedRequisites = [ bootstrapTools.out ]; + + allowedRequisites = (with prevStage; [ + bash + binutils.bintools + binutils.bintools.lib + bzip2.bin + bzip2.out + cc.expand-response-params + coreutils + darwin.binutils + darwin.binutils.bintools + diffutils + ed + file + findutils + gawk + gettext + gmp.out + gnugrep + gnugrep.pcre2.out + gnumake + gnused + gnutar + gzip + icu.out + libffi.out + libiconv + libunistring.out + libxml2.out + ncurses.dev + ncurses.man + ncurses.out + openbsm + openpam + patch + xz.bin + xz.out + zlib.dev + zlib.out + ] + ++ lib.optionals doSign [ openssl.out ]) + ++ lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ] + ++ (with prevStage.llvmPackages; [ + bintools-unwrapped + clang-unwrapped + clang-unwrapped.lib + compiler-rt + compiler-rt.dev + libcxx + libcxx.dev + lld + llvm + llvm.lib + ]) + ++ (with prevStage.darwin; [ + CF + Libsystem + cctools-llvm + cctools-port + dyld + libtapi + locale + apple_sdk.sdkRoot + ] + ++ lib.optional useAppleSDKLibs [ objc4 ] + ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]); + + __stdenvImpureHostDeps = commonImpureHostDeps; + __extraImpureHostDeps = commonImpureHostDeps; + + overrides = self: super: { + inherit (prevStage) + bash binutils brotli bzip2 coreutils cpio diffutils ed file findutils gawk + gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libidn2 libssh2 + libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch pbzx + pcre python3Minimal xar xz zlib zstd; + + darwin = super.darwin.overrideScope (_: superDarwin: { + inherit (prevStage.darwin) + CF ICU Libsystem darwin-stubs dyld locale libobjc libtapi rewrite-tbd xnu; + + apple_sdk = superDarwin.apple_sdk // { + inherit (prevStage.darwin.apple_sdk) sdkRoot; + }; + } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { + inherit (prevStage.darwin) binutils binutils-unwrapped cctools-llvm cctools-port; + }); + } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { + inherit (prevStage.llvmPackages) clang llvm; + + # Need to get rid of these when cross-compiling. + llvmPackages = super.llvmPackages // ( + let + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang clang-unwrapped libclang libllvm llvm; + }); + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx; + }); + in + { inherit tools libraries; } // tools // libraries + ); + + inherit (prevStage) binutils binutils-unwrapped; + }; + }; + }) + + # This "no-op" stage is just a place to put the assertions about stage6. + (prevStage: + # previous final stage stdenv: + assert isBuiltByNixpkgsCompiler prevStage.darwin.sigtool; + assert isBuiltByNixpkgsCompiler prevStage.darwin.binutils-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.darwin.print-reexports; + assert isBuiltByNixpkgsCompiler prevStage.darwin.rewrite-tbd; + assert isBuiltByNixpkgsCompiler prevStage.darwin.cctools; + + assert isFromNixpkgs prevStage.darwin.CF; + assert isFromNixpkgs prevStage.darwin.Libsystem; + + assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.clang-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libllvm; + assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libcxx; + assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.compiler-rt; + { inherit (prevStage) config overlays stdenv; }) +] diff --git a/pkgs/stdenv/darwin/make-bootstrap-tools.nix b/pkgs/stdenv/darwin/make-bootstrap-tools.nix new file mode 100644 index 0000000..bacad15 --- /dev/null +++ b/pkgs/stdenv/darwin/make-bootstrap-tools.nix @@ -0,0 +1,408 @@ +{ pkgspath ? ../../.., test-pkgspath ? pkgspath +, localSystem ? { system = builtins.currentSystem; } +, crossSystem ? null +, bootstrapFiles ? null +}: + +let cross = if crossSystem != null + then { inherit crossSystem; } + else {}; + custom-bootstrap = if bootstrapFiles != null + then { stdenvStages = args: + let args' = args // { bootstrapFiles = bootstrapFiles; }; + in (import "${pkgspath}/pkgs/stdenv/darwin" args'); + } + else {}; +in with import pkgspath ({ inherit localSystem; } // cross // custom-bootstrap); + +rec { + build = stdenv.mkDerivation { + name = "stdenv-bootstrap-tools"; + + nativeBuildInputs = [ dumpnar nukeReferences ]; + + buildCommand = let + inherit (lib) + getBin + getDev + getLib + ; + + coreutils_ = (coreutils.override (args: { + # We want coreutils without ACL support. + aclSupport = false; + # Cannot use a single binary build, or it gets dynamically linked against gmp. + singleBinary = false; + })).overrideAttrs (oa: { + # Increase header size to be able to inject extra RPATHs. Otherwise + # x86_64-darwin build fails as: + # https://cache.nixos.org/log/g5wyq9xqshan6m3kl21bjn1z88hx48rh-stdenv-bootstrap-tools.drv + NIX_LDFLAGS = (oa.NIX_LDFLAGS or "") + " -headerpad_max_install_names"; + }); + + cctools_ = darwin.cctools; + + # Avoid messing with libkrb5 and libnghttp2. + curl_ = curlMinimal.override (args: { + gssSupport = false; + http2Support = false; + scpSupport = false; + }); + + unpackScript = writeText "bootstrap-tools-unpack.sh" '' + set -euo pipefail + + echo Unpacking the bootstrap tools... >&2 + mkdir $out + tar xf "$1" -C $out + + updateInstallName() { + local path="$1" + + cp "$path" "$path.new" + install_name_tool -id "$path" "$path.new" + codesign -f -i "$(basename "$path")" -s - "$path.new" + mv -f "$path.new" "$path" + } + + find $out/lib -type f -name '*.dylib' -print0 | while IFS= read -r -d $'\0' lib; do + updateInstallName "$lib" + done + + # as is a wrapper around clang. need to replace the nuked store paths + sed -i 's|/.*/bin/|'"$out"'/bin/|' $out/bin/as + + # Provide a gunzip script. + cat > $out/bin/gunzip < $out/bin/egrep + echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep + echo "#! $out/bin/sh" > $out/bin/fgrep + echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep + + cat >$out/bin/dsymutil << EOF + #!$out/bin/sh + EOF + + chmod +x $out/bin/egrep $out/bin/fgrep $out/bin/dsymutil + ''; + + in + '' + mkdir -p $out/bin $out/lib $out/lib/darwin + + ${lib.optionalString stdenv.targetPlatform.isx86_64 '' + # Copy libSystem's .o files for various low-level boot stuff. + cp -d ${getLib darwin.Libsystem}/lib/*.o $out/lib + + # Resolv is actually a link to another package, so let's copy it properly + cp -L ${getLib darwin.Libsystem}/lib/libresolv.9.dylib $out/lib + ''} + + cp -rL ${getDev darwin.Libsystem}/include $out + chmod -R u+w $out/include + cp -rL ${getDev libiconv}/include/* $out/include + cp -rL ${getDev gnugrep.pcre2}/include/* $out/include + mv $out/include $out/include-Libsystem + + # Copy binutils. + for i in as ld ar ranlib nm strip otool install_name_tool lipo codesign_allocate; do + cp ${getBin cctools_}/bin/$i $out/bin + done + + # Copy coreutils, bash, etc. + cp ${getBin coreutils_}/bin/* $out/bin + (cd $out/bin && rm vdir dir sha*sum pinky factor pathchk runcon shuf who whoami shred users) + + cp -d ${getBin bash}/bin/{ba,}sh $out/bin + cp -d ${getBin diffutils}/bin/* $out/bin + cp ${getBin findutils}/bin/{find,xargs} $out/bin + cp -d ${getBin gawk}/bin/{g,}awk $out/bin + cp -d ${getBin gnugrep}/bin/grep $out/bin + cp -d ${getBin gnumake}/bin/* $out/bin + cp -d ${getBin gnused}/bin/* $out/bin + cp -d ${getBin patch}/bin/* $out/bin + + cp -d ${getLib gettext}/lib/libintl*.dylib $out/lib + cp -d ${getLib gnugrep.pcre2}/lib/libpcre2*.dylib $out/lib + cp -d ${getLib libiconv}/lib/lib*.dylib $out/lib + cp -d ${getLib libxml2}/lib/libxml2*.dylib $out/lib + cp -d ${getLib ncurses}/lib/libncurses*.dylib $out/lib + + # copy package extraction tools + cp -d ${getBin bzip2}/bin/b{,un}zip2 $out/bin + cp ${getBin cpio}/bin/cpio $out/bin + cp ${getBin gnutar}/bin/tar $out/bin + cp ${getBin gzip}/bin/.gzip-wrapped $out/bin/gzip + cp ${getBin pbzx}/bin/pbzx $out/bin + cp ${getBin xz}/bin/xz $out/bin + cp -d ${getLib bzip2}/lib/libbz2*.dylib $out/lib + cp -d ${getLib gmpxx}/lib/libgmp*.dylib $out/lib + cp -d ${getLib xar}/lib/libxar*.dylib $out/lib + cp -d ${getLib xz}/lib/liblzma*.dylib $out/lib + cp -d ${getLib zlib}/lib/libz*.dylib $out/lib + + # This used to be in-nixpkgs, but now is in the bundle + # because I can't be bothered to make it partially static + cp ${getBin curl_}/bin/curl $out/bin + cp -d ${getLib curl_}/lib/libcurl*.dylib $out/lib + cp -d ${getLib openssl}/lib/*.dylib $out/lib + + # Copy what we need of clang + cp -d ${getBin llvmPackages.clang-unwrapped}/bin/clang{,++,-cl,-cpp,-[0-9]*} $out/bin + cp -d ${getLib llvmPackages.clang-unwrapped}/lib/libclang-cpp*.dylib $out/lib + cp -rd ${getLib llvmPackages.clang-unwrapped}/lib/clang $out/lib + + cp -d ${getLib llvmPackages.libcxx}/lib/libc++*.dylib $out/lib + mkdir -p $out/lib/darwin + cp -d ${getLib llvmPackages.compiler-rt}/lib/darwin/libclang_rt.{,profile_}osx.a $out/lib/darwin + cp -d ${getLib llvmPackages.compiler-rt}/lib/libclang_rt.{,profile_}osx.a $out/lib + cp -d ${getLib llvmPackages.llvm}/lib/libLLVM.dylib $out/lib + cp -d ${getLib libffi}/lib/libffi*.dylib $out/lib + + mkdir $out/include + cp -rd ${getDev llvmPackages.libcxx}/include/c++ $out/include + + # copy .tbd assembly utils + cp ${getBin darwin.rewrite-tbd}/bin/rewrite-tbd $out/bin + cp -d ${getLib libyaml}/lib/libyaml*.dylib $out/lib + + # copy sigtool + cp -d ${getBin darwin.sigtool}/bin/{codesign,sigtool} $out/bin + + cp -d ${getLib darwin.libtapi}/lib/libtapi*.dylib $out/lib + + # tools needed to unpack bootstrap archive + mkdir -p unpack/bin unpack/lib + cp -d ${getBin bash}/bin/{bash,sh} unpack/bin + cp ${getBin coreutils_}/bin/mkdir unpack/bin + cp ${getBin gnutar}/bin/tar unpack/bin + cp ${getBin xz}/bin/xz unpack/bin + cp -d ${getLib gettext}/lib/libintl*.dylib unpack/lib + cp -d ${getLib libiconv}/lib/lib*.dylib unpack/lib + cp -d ${getLib xz}/lib/liblzma*.dylib unpack/lib + cp ${unpackScript} unpack/bootstrap-tools-unpack.sh + + # + # All files copied. Perform processing to update references to point into + # the archive + # + + chmod -R u+w $out unpack + + # - change nix store library paths to use @rpath/library + # - if needed add an rpath containing lib/ + # - strip executable + rpathify() { + local libs=$(${stdenv.cc.targetPrefix}otool -L "$1" | tail -n +2 | grep -o "$NIX_STORE.*-\S*" || true) + local lib rpath + for lib in $libs; do + ${stdenv.cc.targetPrefix}install_name_tool -change $lib "@rpath/$(basename "$lib")" "$1" + done + + case "$(dirname "$1")" in + */bin) + # Strip executables even further + ${stdenv.cc.targetPrefix}strip "$i" + rpath='@executable_path/../lib' + ;; + */lib) + # the '/.' suffix is required + rpath='@loader_path/.' + ;; + */lib/darwin) + rpath='@loader_path/..' + ;; + *) + echo unkown executable $1 >&2 + exit 1 + ;; + esac + + # if shared object contains references add an rpath to lib/ + if ${stdenv.cc.targetPrefix}otool -l "$1"| grep -q '@rpath/'; then + ${stdenv.cc.targetPrefix}install_name_tool -add_rpath "$rpath" "$1" + fi + } + + # check that linked library paths exist in lib + # must be run after rpathify is performed + checkDeps() { + local deps=$(${stdenv.cc.targetPrefix}otool -l "$1"| grep -o '@rpath/[^ ]*' || true) + local lib + shopt -s extglob + for lib in $deps; do + local root="''${1/\/@(lib|bin)\/*}" + if [[ ! -e $root/''${lib/@rpath/lib} ]]; then + echo "error: $1 missing lib for $lib" >&2 + exit 1 + fi + done + shopt -u extglob + } + + for i in {unpack,$out}/bin/* {unpack,$out}/lib{,/darwin}/*.dylib; do + if [[ ! -L $i ]] && isMachO "$i"; then + rpathify "$i" + checkDeps "$i" + fi + done + + nuke-refs {unpack,$out}/bin/* + nuke-refs {unpack,$out}/lib/* + nuke-refs $out/lib/darwin/* + + mkdir $out/.pack + mv $out/* $out/.pack + mv $out/.pack $out/pack + + mkdir $out/on-server + cp -r unpack $out + + XZ_OPT="-9 -T $NIX_BUILD_CORES" tar cvJf $out/on-server/bootstrap-tools.tar.xz \ + --hard-dereference --sort=name --numeric-owner --owner=0 --group=0 --mtime=@1 -C $out/pack . + dumpnar $out/unpack | xz -9 -T $NIX_BUILD_CORES > $out/on-server/unpack.nar.xz + ''; + + allowedReferences = []; + + meta = { + maintainers = [ lib.maintainers.copumpkin ]; + }; + }; + + bootstrapFiles = { + bootstrapTools = "${build}/on-server/bootstrap-tools.tar.xz"; + unpack = runCommand "unpack" { allowedReferences = []; } '' + cp -r ${build}/unpack $out + ''; + }; + + bootstrapTools = derivation { + inherit (stdenv.hostPlatform) system; + + name = "bootstrap-tools"; + builder = "${bootstrapFiles.unpack}/bin/bash"; + + args = [ + "${bootstrapFiles.unpack}/bootstrap-tools-unpack.sh" + bootstrapFiles.bootstrapTools + ]; + + PATH = lib.makeBinPath [ + (placeholder "out") + bootstrapFiles.unpack + ]; + + allowedReferences = [ "out" ]; + }; + + test = derivation { + name = "test-bootstrap-tools"; + inherit (stdenv.hostPlatform) system; + builder = "${bootstrapTools}/bin/bash"; + args = [ "-euo" "pipefail" "-c" "eval \"$buildCommand\"" ]; + PATH = lib.makeBinPath [ bootstrapTools ]; + tools = bootstrapTools; + "${stdenv.cc.darwinMinVersionVariable}" = stdenv.cc.darwinMinVersion; + + # Create a pure environment where we use just what's in the bootstrap tools. + buildCommand = '' + mkdir -p $out/bin + + for exe in $tools/bin/*; do + [[ $exe =~ bunzip2|codesign.*|false|install_name_tool|ld|lipo|pbzx|ranlib|rewrite-tbd|sigtool ]] && continue + $exe --version > /dev/null || { echo $exe failed >&2; exit 1; } + done + + # run all exes that don't take a --version flag + bunzip2 -h + codesign --help + codesign_allocate -i $tools/bin/true -r -o true + false || (($? == 1)) + install_name_tool -id true true + ld -v + lipo -info true + pbzx -v + # ranlib gets tested bulding hello + rewrite-tbd ' >> hello1.c + echo '#include ' >> hello1.c + echo '#include ' >> hello1.c + echo 'int main() { printf("Hello World\n"); return 0; }' >> hello1.c + $CC -o hello1 hello1.c + cp hello1 $out/bin/ + $out/bin/hello1 + + echo '#include ' >> hello3.cc + echo 'int main() { std::cout << "Hello World\n"; }' >> hello3.cc + $CXX -v -o hello3 hello3.cc + cp hello3 $out/bin/ + $out/bin/hello3 + + # test that libc++.dylib rpaths are correct so it can reference libc++abi.dylib when linked. + # using -Wl,-flat_namespace is required to generate an error + mkdir libtest/ + ln -s $tools/lib/libc++.dylib libtest/ + clang++ -Wl,-flat_namespace -idirafter $tools/include-Libsystem -isystem$tools/include/c++/v1 \ + --sysroot=$tools -L./libtest -L$PWD/libSystem-boot hello3.cc + + tar xvf ${hello.src} + cd hello-* + # hello configure detects -liconv is needed but doesn't add to the link step + LDFLAGS=-liconv ./configure --prefix=$out + make + make install + $out/bin/hello + ''; + }; + + # The ultimate test: bootstrap a whole stdenv from the tools specified above and get a package set out of it + # eg: nix-build -A freshBootstrapTools.test-pkgs.stdenv + test-pkgs = import test-pkgspath { + # if the bootstrap tools are for another platform, we should be testing + # that platform. + localSystem = if crossSystem != null then crossSystem else localSystem; + + stdenvStages = args: let + args' = args // { inherit bootstrapFiles; }; + in (import (test-pkgspath + "/pkgs/stdenv/darwin") args'); + }; +} diff --git a/pkgs/stdenv/darwin/override-sdk.nix b/pkgs/stdenv/darwin/override-sdk.nix new file mode 100644 index 0000000..6de6753 --- /dev/null +++ b/pkgs/stdenv/darwin/override-sdk.nix @@ -0,0 +1,437 @@ +# The basic algorithm is to rewrite the propagated inputs of a package and any of its +# own propagated inputs recursively to replace references from the default SDK with +# those from the requested SDK version. This is done across all propagated inputs to +# avoid making assumptions about how those inputs are being used. +# +# For example, packages may propagate target-target dependencies with the expectation that +# they will be just build inputs when the package itself is used as a native build input. +# +# To support this use case and operate without regard to the original package set, +# `overrideSDK` creates a mapping from the default SDK in all package categories to the +# requested SDK. If the lookup fails, it is assumed the package is not part of the SDK. +# Non-SDK packages are processed per the algorithm described above. +{ + lib, + stdenvNoCC, + extendMkDerivationArgs, + pkgsBuildBuild, + pkgsBuildHost, + pkgsBuildTarget, + pkgsHostHost, + pkgsHostTarget, + pkgsTargetTarget, +}@args: + +let + # Takes a mapping from a package to its replacement and transforms it into a list of + # mappings by output (e.g., a package with three outputs produces a list of size 3). + expandOutputs = + mapping: + map (output: { + name = builtins.unsafeDiscardStringContext (lib.getOutput output mapping.original); + value = lib.getOutput output mapping.replacement; + }) mapping.original.outputs; + + # Produces a list of mappings from the default SDK to the new SDK (`sdk`). + # `attr` indicates which SDK path to remap (e.g., `libs` remaps `apple_sdk.libs`). + # + # TODO: Update once the SDKs have been refactored to a common pattern to better handle + # frameworks that are not present in both SDKs. Currently, they’re dropped. + mkMapping = + attr: pkgs: sdk: + lib.foldlAttrs ( + mappings: name: pkg: + let + # Avoid evaluation failures due to missing or throwing + # frameworks (such as QuickTime in the 11.0 SDK). + maybeReplacement = builtins.tryEval sdk.${attr}.${name} or { success = false; }; + in + if maybeReplacement.success then + mappings + ++ expandOutputs { + original = pkg; + replacement = maybeReplacement.value; + } + else + mappings + ) [ ] pkgs.darwin.apple_sdk.${attr}; + + # Produces a list of overrides for the given package set, SDK, and version. + # If you want to manually specify a mapping, this is where you should do it. + mkOverrides = + pkgs: sdk: version: + lib.concatMap expandOutputs [ + # Libsystem needs to match the one used by the SDK or weird errors happen. + { + original = pkgs.darwin.apple_sdk.Libsystem; + replacement = sdk.Libsystem; + } + # Make sure darwin.CF is mapped to the correct version for the SDK. + { + original = pkgs.darwin.CF; + replacement = sdk.frameworks.CoreFoundation; + } + # libobjc needs to be handled specially because it’s not actually in the SDK. + { + original = pkgs.darwin.libobjc; + replacement = sdk.objc4; + } + # Unfortunately, this is not consistent between Darwin SDKs in nixpkgs, so + # try both versions to map between them. + { + original = pkgs.darwin.apple_sdk.sdk or pkgs.darwin.apple_sdk.MacOSX-SDK; + replacement = sdk.sdk or sdk.MacOSX-SDK; + } + # Remap the SDK root. This is used by clang to set the SDK version when + # linking. This behavior is automatic by clang and can’t be overriden. + # Otherwise, without the SDK root set, the SDK version will be inferred to + # be the same as the deployment target, which is not usually what you want. + { + original = pkgs.darwin.apple_sdk.sdkRoot; + replacement = sdk.sdkRoot; + } + # Override xcodebuild because it hardcodes the SDK version. + # TODO: Make xcodebuild defer to the SDK root set in the stdenv. + { + original = pkgs.xcodebuild; + replacement = pkgs.xcodebuild.override { + # Do the override manually to avoid an infinite recursion. + stdenv = pkgs.stdenv.override (old: { + buildPlatform = mkPlatform version old.buildPlatform; + hostPlatform = mkPlatform version old.hostPlatform; + targetPlatform = mkPlatform version old.targetPlatform; + + allowedRequisites = null; + cc = mkCC sdk.Libsystem old.cc; + }); + }; + } + ]; + + mkBintools = + Libsystem: bintools: + if bintools ? override then + bintools.override { libc = Libsystem; } + else + let + # `override` isn’t available, so bintools has to be rewrapped with the new libc. + # Most of the required arguments can be recovered except for `postLinkSignHook` + # and `signingUtils`, which have to be scrapped from the original’s `postFixup`. + # This isn’t ideal, but it works. + postFixup = lib.splitString "\n" bintools.postFixup; + + postLinkSignHook = lib.pipe postFixup [ + (lib.findFirst (lib.hasPrefix "echo 'source") null) + (builtins.match "^echo 'source (.*-post-link-sign-hook)' >> \\$out/nix-support/post-link-hook$") + lib.head + ]; + + signingUtils = lib.pipe postFixup [ + (lib.findFirst (lib.hasPrefix "export signingUtils") null) + (builtins.match "^export signingUtils=(.*)$") + lib.head + ]; + + newBintools = pkgsBuildTarget.wrapBintoolsWith { + inherit (bintools) name; + + buildPackages = { }; + libc = Libsystem; + + inherit lib; + + coreutils = bintools.coreutils_bin; + gnugrep = bintools.gnugrep_bin; + + inherit (bintools) bintools; + + inherit postLinkSignHook signingUtils; + }; + in + lib.getOutput bintools.outputName newBintools; + + mkCC = + Libsystem: cc: + if cc ? override then + cc.override { + bintools = mkBintools Libsystem cc.bintools; + libc = Libsystem; + } + else + builtins.throw "CC has no override: ${cc}"; + + mkPlatform = + version: platform: + platform + // lib.optionalAttrs platform.isDarwin { inherit (version) darwinMinVersion darwinSdkVersion; }; + + # Creates a stub package. Unchanged files from the original package are symlinked + # into the package. The contents of `nix-support` are updated to reference any + # replaced packages. + # + # Note: `env` is an attrset containing `outputs` and `dependencies`. + # `dependencies` is a regex passed to sed and must be `passAsFile`. + mkProxyPackage = + name: env: + stdenvNoCC.mkDerivation { + inherit name; + + inherit (env) outputs replacements sourceOutputs; + + # Take advantage of the fact that replacements and sourceOutputs will be passed + # via JSON and parsed into environment variables. + __structuredAttrs = true; + + buildCommand = '' + # Map over the outputs in the package being replaced to make sure the proxy is + # a fully functional replacement. This is like `symlinkJoin` except for + # outputs and the contents of `nix-support`, which will be customized. + function replacePropagatedInputs() { + local sourcePath=$1 + local targetPath=$2 + + mkdir -p "$targetPath" + + local sourceFile + for sourceFile in "$sourcePath"/*; do + local fileName=$(basename "$sourceFile") + local targetFile="$targetPath/$fileName" + + if [ -d "$sourceFile" ]; then + replacePropagatedInputs "$sourceFile" "$targetPath/$fileName" + # Check to see if any of the files in the folder were replaced. + # Otherwise, replace the folder with a symlink if none were changed. + if [ "$(find -maxdepth 1 "$targetPath/$fileName" -not -type l)" = "" ]; then + rm "$targetPath/$fileName"/* + ln -s "$sourceFile" "$targetPath/$fileName" + fi + else + cp "$sourceFile" "$targetFile" + local original + for original in "''${!replacements[@]}"; do + substituteInPlace "$targetFile" \ + --replace-quiet "$original" "''${replacements[$original]}" + done + if cmp -s "$sourceFile" "$targetFile"; then + rm "$targetFile" + ln -s "$sourceFile" "$targetFile" + fi + fi + done + } + + local outputName + for outputName in "''${!outputs[@]}"; do + local outPath=''${outputs[$outputName]} + mkdir -p "$outPath" + + local sourcePath + for sourcePath in "''${sourceOutputs[$outputName]}"/*; do + sourceName=$(basename "$sourcePath") + # `nix-support` is special-cased because any propagated inputs need their + # SDK frameworks replaced with those from the requested SDK. + if [ "$sourceName" == "nix-support" ]; then + replacePropagatedInputs "$sourcePath" "$outPath/nix-support" + else + ln -s "$sourcePath" "$outPath/$sourceName" + fi + done + done + ''; + }; + + # Gets all propagated inputs in a package. This does not recurse. + getPropagatedInputs = + pkg: + lib.optionals (lib.isDerivation pkg) ( + lib.concatMap (input: pkg.${input} or [ ]) [ + "depsBuildBuildPropagated" + "propagatedNativeBuildInputs" + "depsBuildTargetPropagated" + "depsHostHostPropagated" + "propagatedBuildInputs" + "depsTargetTargetPropagated" + ] + ); + + # Looks up the replacement for `pkg` in the `newPackages` mapping. If `pkg` is a + # compiler (meaning it has a `libc` attribute), the compiler will be overriden. + getReplacement = + newPackages: pkg: + let + pkgOrCC = + if pkg.libc or null != null then + # Heuristic to determine whether package is a compiler or bintools. + if pkg.wrapperName == "CC_WRAPPER" then + mkCC (getReplacement newPackages pkg.libc) pkg + else + mkBintools (getReplacement newPackages pkg.libc) pkg + else + pkg; + in + if lib.isDerivation pkg then + newPackages.${builtins.unsafeDiscardStringContext pkg} or pkgOrCC + else + pkg; + + # Replaces all packages propagated by `pkgs` using the `newPackages` mapping. + # It is assumed that all possible overrides have already been incorporated into + # the mapping. If any propagated packages are replaced, a proxy package will be + # created with references to the old packages replaced in `nix-support`. + replacePropagatedPackages = + newPackages: pkg: + let + propagatedInputs = getPropagatedInputs pkg; + env = { + inherit (pkg) outputs; + + replacements = lib.pipe propagatedInputs [ + (lib.filter (pkg: pkg != null)) + (map (dep: { + name = builtins.unsafeDiscardStringContext dep; + value = getReplacement newPackages dep; + })) + (lib.filter (mapping: mapping.name != mapping.value)) + lib.listToAttrs + ]; + + sourceOutputs = lib.genAttrs pkg.outputs (output: lib.getOutput output pkg); + }; + in + # Only remap the package’s propagated inputs if there are any and if any of them + # had packages remapped (with frameworks or proxy packages). + if propagatedInputs != [ ] && env.replacements != { } then mkProxyPackage pkg.name env else pkg; + + # Gets all propagated dependencies in a package in reverse order sorted topologically. + # This takes advantage of the fact that items produced by `operator` are pushed to + # the end of the working set, ensuring that dependencies always appear after their + # parent in the list with leaf nodes at the end. + topologicallyOrderedPropagatedDependencies = + pkgs: + let + mapPackageDeps = lib.flip lib.pipe [ + (lib.filter (pkg: pkg != null)) + (map (pkg: { + key = builtins.unsafeDiscardStringContext pkg; + package = pkg; + deps = getPropagatedInputs pkg; + })) + ]; + in + lib.genericClosure { + startSet = mapPackageDeps pkgs; + operator = { deps, ... }: mapPackageDeps deps; + }; + + # Returns a package mapping based on remapping all propagated packages. + getPackageMapping = + baseMapping: input: + let + dependencies = topologicallyOrderedPropagatedDependencies input; + in + lib.foldr ( + pkg: newPackages: + let + replacement = replacePropagatedPackages newPackages pkg.package; + outPath = pkg.key; + in + if pkg.key == null || newPackages ? ${outPath} then + newPackages + else + newPackages // { ${outPath} = replacement; } + ) baseMapping dependencies; + + overrideSDK = + stdenv: sdkVersion: + let + newVersion = { + inherit (stdenv.hostPlatform) darwinMinVersion darwinSdkVersion; + } // (if lib.isAttrs sdkVersion then sdkVersion else { darwinSdkVersion = sdkVersion; }); + + inherit (newVersion) darwinMinVersion darwinSdkVersion; + + # Used to get an SDK version corresponding to the requested `darwinSdkVersion`. + # TODO: Treat `darwinSdkVersion` as a constraint rather than as an exact version. + resolveSDK = pkgs: pkgs.darwin."apple_sdk_${lib.replaceStrings [ "." ] [ "_" ] darwinSdkVersion}"; + + # `newSdkPackages` is constructed based on the assumption that SDK packages only + # propagate versioned packages from that SDK -- that they neither propagate + # unversioned SDK packages nor propagate non-SDK packages (such as curl). + # + # Note: `builtins.unsafeDiscardStringContext` is used to allow the path from the + # original package output to be mapped to the replacement. This is safe because + # the value is not persisted anywhere and necessary because store paths are not + # allowed as attrset names otherwise. + baseSdkMapping = lib.pipe args [ + (lib.flip removeAttrs [ + "lib" + "stdenvNoCC" + "extendMkDerivationArgs" + ]) + (lib.filterAttrs (_: lib.hasAttr "darwin")) + lib.attrValues + (lib.concatMap ( + pkgs: + let + newSDK = resolveSDK pkgs; + + frameworks = mkMapping "frameworks" pkgs newSDK; + libs = mkMapping "libs" pkgs newSDK; + overrides = mkOverrides pkgs newSDK newVersion; + in + frameworks ++ libs ++ overrides + )) + lib.listToAttrs + ]; + + # Remaps all inputs given to the requested SDK version. The result is an attrset + # that can be passed to `extendMkDerivationArgs`. + mapInputsToSDK = + inputs: args: + lib.pipe inputs [ + (lib.filter (input: args ? ${input})) + (lib.flip lib.genAttrs ( + inputName: + let + input = args.${inputName}; + newPackages = getPackageMapping baseSdkMapping input; + in + map (getReplacement newPackages) input + )) + ]; + in + stdenv.override ( + old: + { + buildPlatform = mkPlatform newVersion old.buildPlatform; + hostPlatform = mkPlatform newVersion old.hostPlatform; + targetPlatform = mkPlatform newVersion old.targetPlatform; + } + # Only perform replacements if the SDK version has changed. Changing only the + # deployment target does not require replacing the libc or SDK dependencies. + // lib.optionalAttrs (old.hostPlatform.darwinSdkVersion != darwinSdkVersion) { + allowedRequisites = null; + + mkDerivationFromStdenv = extendMkDerivationArgs old (mapInputsToSDK [ + "depsBuildBuild" + "nativeBuildInputs" + "depsBuildTarget" + "depsHostHost" + "buildInputs" + "depsTargetTarget" + "depsBuildBuildPropagated" + "propagatedNativeBuildInputs" + "depsBuildTargetPropagated" + "depsHostHostPropagated" + "propagatedBuildInputs" + "depsTargetTargetPropagated" + ]); + + cc = getReplacement baseSdkMapping old.cc; + + extraBuildInputs = map (getReplacement baseSdkMapping) stdenv.extraBuildInputs; + extraNativeBuildInputs = map (getReplacement baseSdkMapping) stdenv.extraNativeBuildInputs; + } + ); +in +overrideSDK diff --git a/pkgs/stdenv/darwin/portable-libsystem.sh b/pkgs/stdenv/darwin/portable-libsystem.sh new file mode 100644 index 0000000..7608c0a --- /dev/null +++ b/pkgs/stdenv/darwin/portable-libsystem.sh @@ -0,0 +1,12 @@ +# Make /nix/store/...-libSystem “portable” for static built binaries. +# This just rewrites everything in $1/bin to use the +# /usr/lib/libSystem.B.dylib that is provided on every macOS system. + +fixupOutputHooks+=('fixLibsystemRefs $prefix') + +fixLibsystemRefs() { + if [ -d "$1/bin" ]; then + find "$1/bin" -type f -exec \ + @targetPrefix@install_name_tool -change @libsystem@ /usr/lib/libSystem.B.dylib {} \; + fi +} diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix new file mode 100644 index 0000000..6cc1339 --- /dev/null +++ b/pkgs/stdenv/default.nix @@ -0,0 +1,49 @@ +# This file chooses a sane default stdenv given the system, platform, etc. +# +# Rather than returning a stdenv, this returns a list of functions---one per +# each bootstrapping stage. See `./booter.nix` for exactly what this list should +# contain. + +{ # Args just for stdenvs' usage + lib + # Args to pass on to the pkgset builder, too +, localSystem, crossSystem, config, overlays, crossOverlays ? [] +} @ args: + +let + # The native (i.e., impure) build environment. This one uses the + # tools installed on the system outside of the Nix environment, + # i.e., the stuff in /bin, /usr/bin, etc. This environment should + # be used with care, since many Nix packages will not build properly + # with it (e.g., because they require GNU Make). + stagesNative = import ./native args; + + # The Nix build environment. + stagesNix = import ./nix (args // { bootStages = stagesNative; }); + + stagesFreeBSD = import ./freebsd args; + + # On Linux systems, the standard build environment consists of Nix-built + # instances glibc and the `standard' Unix tools, i.e., the Posix utilities, + # the GNU C compiler, and so on. + stagesLinux = import ./linux args; + + stagesDarwin = import ./darwin args; + + stagesCross = import ./cross args; + + stagesCustom = import ./custom args; + + # Select the appropriate stages for the platform `system'. +in + if crossSystem != localSystem || crossOverlays != [] then stagesCross + else if config ? replaceStdenv then stagesCustom + else if localSystem.isLinux then stagesLinux + else if localSystem.isDarwin then stagesDarwin + else # misc special cases + { # switch + x86_64-solaris = stagesNix; + i686-cygwin = stagesNative; + x86_64-cygwin = stagesNative; + x86_64-freebsd = stagesFreeBSD; + }.${localSystem.system} or stagesNative diff --git a/pkgs/stdenv/freebsd/default.nix b/pkgs/stdenv/freebsd/default.nix new file mode 100644 index 0000000..de66085 --- /dev/null +++ b/pkgs/stdenv/freebsd/default.nix @@ -0,0 +1,276 @@ +{ lib +, localSystem, crossSystem, config, overlays, crossOverlays ? [] +}: + +assert crossSystem == localSystem; +let inherit (localSystem) system; + fetchURL = import ; + trivialBuilder = (import ./trivial-builder.nix); + make = trivialBuilder rec { + inherit (localSystem) system; + name = "make"; + ver = "4.3"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.gz"; + sha256 = "06cfqzpqsvdnsxbysl5p2fgdgxgl9y4p7scpnrfa8z2zgkjdspz0"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + ]; + }; + bash = trivialBuilder rec { + inherit (localSystem) system; + name = "bash"; + ver = "4.4.18"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.gz"; + sha256 = "08vz660768mnnax7n8d4d85jxafwdmsxsi7fh0hzvmafbvn9wkb0"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + ]; + }; + coreutils = trivialBuilder rec { + inherit (localSystem) system; + name = "coreutils"; + ver = "8.31"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "1zg9m79x1i2nifj4kb0waf9x3i5h6ydkypkjnbsb9rnwis8rqypz"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--without-gmp" + "--without-libpth-prefix" + ]; + }; + findutils = trivialBuilder rec { + inherit (localSystem) system; + name = "findutils"; + ver = "4.7.0"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "16kqz9yz98dasmj70jwf5py7jk558w96w0vgp3zf9xsqk3gzpzn5"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--without-gmp" + "--without-libpth-prefix" + ]; + }; + diffutils = trivialBuilder rec { + inherit (localSystem) system; + name = "diffutils"; + ver = "3.7"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "09isrg0isjinv8c535nxsi1s86wfdfzml80dbw41dj9x3hiad9xk"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--without-libsigsegv-prefix" + ]; + }; + grep = trivialBuilder rec { + inherit (localSystem) system; + name = "grep"; + ver = "3.4"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "1yy33kiwrxrwj2nxa4fg15bvmwyghqbs8qwkdvy5phm784f7brjq"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--disable-perl-regexp" + "--without-libsegsegv-prefix" + ]; + }; + patch = trivialBuilder rec { + inherit (localSystem) system; + name = "patch"; + ver = "2.7.6"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "1zfqy4rdcy279vwn2z1kbv19dcfw25d2aqy9nzvdkq5bjzd0nqdc"; + }; + gawk = trivialBuilder rec { + inherit (localSystem) system; + name = "gawk"; + ver = "5.0.1"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "15570p7g2x54asvr2fsc56sxzmm08fbk4mzpcs5n92fp9vq8cklf"; + configureArgs = [ "--disable-nls" + "--disable-mpfr" + "--without-libintl-prefix" + "--without-libiconv-prefix" + "--without-libsegsegv-prefix" + ]; + }; + cpio = trivialBuilder rec { + inherit (localSystem) system; + name = "cpio"; + ver = "2.13"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.gz"; + sha256 = "126vyg4a8wcdwh6npgvxy6gq433bzgz3ph37hmjpycc4r7cp0x78"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + ]; + }; + sed = trivialBuilder rec { + inherit (localSystem) system; + name = "sed"; + ver = "4.8"; + url = "https://ftp.gnu.org/gnu/${name}/${name}-${ver}.tar.xz"; + sha256 = "0cznxw73fzv1n3nj2zsq6nf73rvsbxndp444xkpahdqvlzz0r6zp"; + configureArgs = [ "--disable-nls" + "--without-libintl-prefix" + "--without-libiconv-prefix" + ]; + }; + cacert = fetchURL rec { + url = "https://curl.haxx.se/ca/cacert-2020-01-01.pem"; + sha256 = "07q808n307gzaga93abpf6an7c3rd35p18psdc1dd83lspgp1xxd"; + executable = false; + }; + curl = trivialBuilder rec { + inherit (localSystem) system; + name = "curl"; + ver = "7.68.0"; + url = "https://curl.haxx.se/download/${name}-${ver}.tar.xz"; + sha256 = "0nh3j90w6b97wqcgxjfq55qhkz9s38955fbhwzv2fsi7483j895p"; + configureArgs = [ "--disable-nls" + "--disable-ares" + "--disable-debug" + "--disable-ldap" + "--disable-ldaps" + "--disable-rtsp" + "--disable-dict" + "--disable-telnet" + "--disable-tftp" + "--disable-pop3" + "--disable-imap" + "--disable-smb" + "--disable-smtp" + "--disable-gopher" + "--disable-manual" + "--disable-verbose" + "--disable-sspi" + "--disable-tls-srp" + "--disable-unix-sockets" + "--without-brotli" + "--without-gnutls" + "--without-mbedtls" + "--without-wolfssl" + "--without-bearssl" + "--without-libidn2" + "--without-librtmp" + "--without-nghttp2" + "--with-ssl=/usr" + "--with-ca-bundle=${cacert}" + ]; + }; + bashExe = "${bash}/bin/bash"; +in +[ + + ({}: { + __raw = true; + + bootstrapTools = derivation ({ + inherit system; + inherit make bash coreutils findutils + diffutils grep patch gawk cpio sed + curl; + + name = "trivial-bootstrap-tools"; + builder = bashExe; + args = [ ./trivial-bootstrap.sh ]; + buildInputs = [ make ]; + mkdir = "/bin/mkdir"; + ln = "/bin/ln"; + } // lib.optionalAttrs config.contentAddressedByDefault { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }); + }) + + ({ bootstrapTools, ... }: rec { + __raw = true; + + inherit bootstrapTools; + + fetchurl = import ../../build-support/fetchurl { + inherit lib; + stdenvNoCC = stdenv; + curl = bootstrapTools; + }; + + stdenv = import ../generic { + name = "stdenv-freebsd-boot-1"; + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + inherit config; + initialPath = [ "/" "/usr" ]; + shell = "${bootstrapTools}/bin/bash"; + fetchurlBoot = null; + cc = null; + overrides = self: super: { + }; + }; + }) + + (prevStage: { + __raw = true; + + inherit (prevStage) bootstrapTools; + + stdenv = import ../generic { + name = "stdenv-freebsd-boot-0"; + inherit config; + initialPath = [ prevStage.bootstrapTools ]; + inherit (prevStage.stdenv) + buildPlatform hostPlatform targetPlatform + shell; + fetchurlBoot = prevStage.fetchurl; + cc = null; + }; + }) + + (prevStage: { + inherit config overlays; + stdenv = import ../generic rec { + name = "stdenv-freebsd-boot-3"; + inherit config; + + inherit (prevStage.stdenv) + buildPlatform hostPlatform targetPlatform + initialPath shell fetchurlBoot; + + cc = lib.makeOverridable (import ../../build-support/cc-wrapper) { + inherit lib; + nativeTools = true; + nativePrefix = "/usr"; + nativeLibc = true; + stdenvNoCC = prevStage.stdenv; + buildPackages = { + inherit (prevStage) stdenv; + }; + cc = { + name = "clang-9.9.9"; + cc = "/usr"; + outPath = prevStage.bootstrapTools; + }; + isClang = true; + bintools = import ../../build-support/bintools-wrapper { + inherit lib; + stdenvNoCC = prevStage.stdenv; + nativeTools = true; + nativeLibc = true; + propagateDoc = false; + nativePrefix = "/usr"; + bintools = { name = "${name}-binutils"; + outPath = prevStage.bootstrapTools; }; + }; + }; + + preHook = "export NIX_NO_SELF_RPATH=1"; + }; + }) + +] diff --git a/pkgs/stdenv/freebsd/trivial-bootstrap.sh b/pkgs/stdenv/freebsd/trivial-bootstrap.sh new file mode 100644 index 0000000..34b4dba --- /dev/null +++ b/pkgs/stdenv/freebsd/trivial-bootstrap.sh @@ -0,0 +1,118 @@ +set -e +set -o nounset +set -o pipefail + +echo Building the trivial bootstrap environment... +#echo +#echo Needed FreeBSD packages: +#echo findutils gcpio gawk gnugrep coreutils bash gsed gtar gmake xar binutils gpatch lbzip2 diffutils + +$mkdir -p $out/bin + +ln () { + if [ ! -z "${2:-}" ]; then + if [ -f "$out/bin/$2" ]; then + echo "$2 exists" + exit 1 + fi + fi + if test ! -f "$1"; then + echo Target "$2" does not exist + exit 1 + fi + # TODO: check that destination directory exists + if [ ! -z "${2:-}" ]; then + $ln -s "$1" "$out/bin/$2" + else + $ln -s "$1" "$out/bin/" + fi +} + +ln $bash/bin/bash +ln $make/bin/make + +ln /bin/sh + +for i in b2sum base32 base64 basename basenc cat chcon chgrp chmod \ + chown chroot cksum comm cp csplit cut date dd df dir dircolors \ + dirname du echo env expand expr factor false fmt fold install \ + groups head hostid id join kill link ln logname ls md5sum mkdir \ + mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk \ + pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon \ + seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf \ + sleep sort split stat stdbuf stty sum sync tac tee test timeout \ + touch tr true truncate tsort tty uname unexpand uniq unlink uptime \ + users vdir wc who whoami yes +do + ln "$coreutils/bin/$i" "$i" +done + +for i in find xargs; do + ln "$findutils/bin/$i" "$i" +done + +for i in diff diff3 sdiff; do + ln "$diffutils/bin/$i" "$i" +done + +for i in grep egrep fgrep; do + ln "$grep/bin/$i" "$i" +done + +ln /usr/bin/locale + +ln /usr/bin/more + +ln /usr/bin/hexdump # for bitcoin + +ln /usr/bin/bzip2 +ln /usr/bin/bunzip2 +ln /usr/bin/bzip2recover + +ln /usr/bin/xz +ln /usr/bin/unxz +ln /usr/bin/lzma +ln /usr/bin/unlzma + +ln /bin/ps +ln /bin/hostname +ln /usr/bin/cmp +ln $sed/bin/sed +ln /usr/bin/tar tar +ln $gawk/bin/gawk +ln $gawk/bin/gawk awk +ln $cpio/bin/cpio +ln $curl/bin/curl curl +ln /usr/bin/gzip +ln /usr/bin/gunzip +ln /usr/bin/tail tail # note that we are not using gtail!!! +ln /usr/bin/less less +ln $patch/bin/patch patch +ln /usr/bin/which which + +## binutils +# pkg info -l binutils | grep usr/local/bin +ln /usr/bin/addr2line +ln /usr/bin/ar +ln /usr/bin/as +ln /usr/bin/c++filt +#ln /usr/bin/dwp +#ln /usr/bin/elfedit +ln /usr/bin/gprof +ln /usr/bin/ld +#ln /usr/bin/ld.bfd +#ln /usr/bin/ld.gold +ln /usr/bin/nm +ln /usr/bin/objcopy +ln /usr/bin/objdump +ln /usr/bin/ranlib +ln /usr/bin/readelf +ln /usr/bin/size +ln /usr/bin/strings +ln /usr/bin/strip + +ln /usr/bin/cc +ln /usr/bin/cpp +ln /usr/bin/c++ + +#pkg info -l llvm37 | grep usr/local/bin diff --git a/pkgs/stdenv/freebsd/trivial-builder.nix b/pkgs/stdenv/freebsd/trivial-builder.nix new file mode 100644 index 0000000..6426508 --- /dev/null +++ b/pkgs/stdenv/freebsd/trivial-builder.nix @@ -0,0 +1,13 @@ +{ system, name, ver, url, sha256, configureArgs ? [], executable ? false } : + +let fetchURL = import ; + +in derivation { + inherit system configureArgs; + name = "trivial-bootstrap-${name}-${ver}"; + dname = "${name}-${ver}"; + src = fetchURL { + inherit url sha256 executable; + }; + builder = ./trivial-builder.sh; +} diff --git a/pkgs/stdenv/freebsd/trivial-builder.sh b/pkgs/stdenv/freebsd/trivial-builder.sh new file mode 100755 index 0000000..ac5601b --- /dev/null +++ b/pkgs/stdenv/freebsd/trivial-builder.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +tar -zxvf $src +cd $dname +mkdir -p $out/bin +./configure --prefix=$out $configureArgs +make +make install diff --git a/pkgs/stdenv/generic/builder.sh b/pkgs/stdenv/generic/builder.sh new file mode 100644 index 0000000..2d8d784 --- /dev/null +++ b/pkgs/stdenv/generic/builder.sh @@ -0,0 +1,23 @@ +export PATH= +for i in $initialPath; do + if [ "$i" = / ]; then i=; fi + PATH=$PATH${PATH:+:}$i/bin +done + +mkdir $out + +{ + echo "export SHELL=$shell" + echo "initialPath=\"$initialPath\"" + echo "defaultNativeBuildInputs=\"$defaultNativeBuildInputs\"" + echo "defaultBuildInputs=\"$defaultBuildInputs\"" + echo "$preHook" + cat "$setup" +} > "$out/setup" + +# Allow the user to install stdenv using nix-env and get the packages +# in stdenv. +mkdir $out/nix-support +if [ "$propagatedUserEnvPkgs" ]; then + printf '%s ' $propagatedUserEnvPkgs > $out/nix-support/propagated-user-env-packages +fi diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix new file mode 100644 index 0000000..a61f3e1 --- /dev/null +++ b/pkgs/stdenv/generic/check-meta.nix @@ -0,0 +1,520 @@ +# Checks derivation meta and attrs for problems (like brokenness, +# licenses, etc). + +{ lib, config, hostPlatform }: + +let + inherit (lib) + all + attrNames + concatMapStrings + concatMapStringsSep + concatStrings + findFirst + isDerivation + length + concatMap + mutuallyExclusive + optional + optionalAttrs + optionalString + optionals + isAttrs + isString + mapAttrs + ; + + inherit (lib.lists) + any + toList + isList + elem + ; + + inherit (lib.meta) + availableOn + ; + + inherit (lib.generators) + toPretty + ; + + # If we're in hydra, we can dispense with the more verbose error + # messages and make problems easier to spot. + inHydra = config.inHydra or false; + # Allow the user to opt-into additional warnings, e.g. + # import { config = { showDerivationWarnings = [ "maintainerless" ]; }; } + showWarnings = config.showDerivationWarnings; + + getName = attrs: attrs.name or ("${attrs.pname or "«name-missing»"}-${attrs.version or "«version-missing»"}"); + + allowUnfree = config.allowUnfree + || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1"; + + allowNonSource = let + envVar = builtins.getEnv "NIXPKGS_ALLOW_NONSOURCE"; + in if envVar != "" + then envVar != "0" + else config.allowNonSource or true; + + allowlist = config.allowlistedLicenses or config.whitelistedLicenses or []; + blocklist = config.blocklistedLicenses or config.blacklistedLicenses or []; + + areLicenseListsValid = + if mutuallyExclusive allowlist blocklist then + true + else + throw "allowlistedLicenses and blocklistedLicenses are not mutually exclusive."; + + hasLicense = attrs: + attrs ? meta.license; + + hasListedLicense = assert areLicenseListsValid; list: attrs: + length list > 0 && hasLicense attrs && ( + if isList attrs.meta.license then any (l: elem l list) attrs.meta.license + else elem attrs.meta.license list + ); + + hasAllowlistedLicense = attrs: hasListedLicense allowlist attrs; + + hasBlocklistedLicense = attrs: hasListedLicense blocklist attrs; + + allowBroken = config.allowBroken + || builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"; + + allowUnsupportedSystem = config.allowUnsupportedSystem + || builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1"; + + isUnfree = licenses: + if isAttrs licenses then !licenses.free or true + # TODO: Returning false in the case of a string is a bug that should be fixed. + # In a previous implementation of this function the function body + # was `licenses: lib.lists.any (l: !l.free or true) licenses;` + # which always evaluates to `!true` for strings. + else if isString licenses then false + else any (l: !l.free or true) licenses; + + hasUnfreeLicense = attrs: hasLicense attrs && isUnfree attrs.meta.license; + + hasNoMaintainers = attrs: + attrs ? meta.maintainers && (length attrs.meta.maintainers) == 0; + + isMarkedBroken = attrs: attrs.meta.broken or false; + + hasUnsupportedPlatform = + pkg: !(availableOn hostPlatform pkg); + + isMarkedInsecure = attrs: (attrs.meta.knownVulnerabilities or []) != []; + + # Alow granular checks to allow only some unfree packages + # Example: + # {pkgs, ...}: + # { + # allowUnfree = false; + # allowUnfreePredicate = (x: pkgs.lib.hasPrefix "vscode" x.name); + # } + allowUnfreePredicate = config.allowUnfreePredicate or (x: false); + + # Check whether unfree packages are allowed and if not, whether the + # package has an unfree license and is not explicitly allowed by the + # `allowUnfreePredicate` function. + hasDeniedUnfreeLicense = attrs: + hasUnfreeLicense attrs && + !allowUnfree && + !allowUnfreePredicate attrs; + + allowInsecureDefaultPredicate = x: builtins.elem (getName x) (config.permittedInsecurePackages or []); + allowInsecurePredicate = x: (config.allowInsecurePredicate or allowInsecureDefaultPredicate) x; + + hasAllowedInsecure = attrs: + !(isMarkedInsecure attrs) || + allowInsecurePredicate attrs || + builtins.getEnv "NIXPKGS_ALLOW_INSECURE" == "1"; + + + isNonSource = sourceTypes: any (t: !t.isSource) sourceTypes; + + hasNonSourceProvenance = attrs: + (attrs ? meta.sourceProvenance) && + isNonSource attrs.meta.sourceProvenance; + + # Allow granular checks to allow only some non-source-built packages + # Example: + # { pkgs, ... }: + # { + # allowNonSource = false; + # allowNonSourcePredicate = with pkgs.lib.lists; pkg: !(any (p: !p.isSource && p != lib.sourceTypes.binaryFirmware) pkg.meta.sourceProvenance); + # } + allowNonSourcePredicate = config.allowNonSourcePredicate or (x: false); + + # Check whether non-source packages are allowed and if not, whether the + # package has non-source provenance and is not explicitly allowed by the + # `allowNonSourcePredicate` function. + hasDeniedNonSourceProvenance = attrs: + hasNonSourceProvenance attrs && + !allowNonSource && + !allowNonSourcePredicate attrs; + + showLicenseOrSourceType = value: toString (map (v: v.shortName or "unknown") (toList value)); + showLicense = showLicenseOrSourceType; + showSourceType = showLicenseOrSourceType; + + pos_str = meta: meta.position or "«unknown-file»"; + + remediation = { + unfree = remediate_allowlist "Unfree" (remediate_predicate "allowUnfreePredicate"); + non-source = remediate_allowlist "NonSource" (remediate_predicate "allowNonSourcePredicate"); + broken = remediate_allowlist "Broken" (x: ""); + unsupported = remediate_allowlist "UnsupportedSystem" (x: ""); + blocklisted = x: ""; + insecure = remediate_insecure; + broken-outputs = remediateOutputsToInstall; + unknown-meta = x: ""; + maintainerless = x: ""; + }; + remediation_env_var = allow_attr: { + Unfree = "NIXPKGS_ALLOW_UNFREE"; + Broken = "NIXPKGS_ALLOW_BROKEN"; + UnsupportedSystem = "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM"; + NonSource = "NIXPKGS_ALLOW_NONSOURCE"; + }.${allow_attr}; + remediation_phrase = allow_attr: { + Unfree = "unfree packages"; + Broken = "broken packages"; + UnsupportedSystem = "packages that are unsupported for this system"; + NonSource = "packages not built from source"; + }.${allow_attr}; + remediate_predicate = predicateConfigAttr: attrs: + '' + + Alternatively you can configure a predicate to allow specific packages: + { nixpkgs.config.${predicateConfigAttr} = pkg: builtins.elem (lib.getName pkg) [ + "${lib.getName attrs}" + ]; + } + ''; + + # flakeNote will be printed in the remediation messages below. + flakeNote = " + Note: When using `nix shell`, `nix build`, `nix develop`, etc with a flake, + then pass `--impure` in order to allow use of environment variables. + "; + + remediate_allowlist = allow_attr: rebuild_amendment: attrs: + '' + a) To temporarily allow ${remediation_phrase allow_attr}, you can use an environment variable + for a single invocation of the nix tools. + + $ export ${remediation_env_var allow_attr}=1 + ${flakeNote} + b) For `nixos-rebuild` you can set + { nixpkgs.config.allow${allow_attr} = true; } + in configuration.nix to override this. + ${rebuild_amendment attrs} + c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add + { allow${allow_attr} = true; } + to ~/.config/nixpkgs/config.nix. + ''; + + remediate_insecure = attrs: + '' + + Known issues: + '' + (concatStrings (map (issue: " - ${issue}\n") attrs.meta.knownVulnerabilities)) + '' + + You can install it anyway by allowing this package, using the + following methods: + + a) To temporarily allow all insecure packages, you can use an environment + variable for a single invocation of the nix tools: + + $ export NIXPKGS_ALLOW_INSECURE=1 + ${flakeNote} + b) for `nixos-rebuild` you can add ‘${getName attrs}’ to + `nixpkgs.config.permittedInsecurePackages` in the configuration.nix, + like so: + + { + nixpkgs.config.permittedInsecurePackages = [ + "${getName attrs}" + ]; + } + + c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add + ‘${getName attrs}’ to `permittedInsecurePackages` in + ~/.config/nixpkgs/config.nix, like so: + + { + permittedInsecurePackages = [ + "${getName attrs}" + ]; + } + + ''; + + remediateOutputsToInstall = attrs: let + expectedOutputs = attrs.meta.outputsToInstall or []; + actualOutputs = attrs.outputs or [ "out" ]; + missingOutputs = builtins.filter (output: ! builtins.elem output actualOutputs) expectedOutputs; + in '' + The package ${getName attrs} has set meta.outputsToInstall to: ${builtins.concatStringsSep ", " expectedOutputs} + + however ${getName attrs} only has the outputs: ${builtins.concatStringsSep ", " actualOutputs} + + and is missing the following ouputs: + + ${concatStrings (builtins.map (output: " - ${output}\n") missingOutputs)} + ''; + + handleEvalIssue = { meta, attrs }: { reason , errormsg ? "" }: + let + msg = if inHydra + then "Failed to evaluate ${getName attrs}: «${reason}»: ${errormsg}" + else '' + Package ‘${getName attrs}’ in ${pos_str meta} ${errormsg}, refusing to evaluate. + + '' + (builtins.getAttr reason remediation) attrs; + + handler = if config ? handleEvalIssue + then config.handleEvalIssue reason + else throw; + in handler msg; + + handleEvalWarning = { meta, attrs }: { reason , errormsg ? "" }: + let + remediationMsg = (builtins.getAttr reason remediation) attrs; + msg = if inHydra then "Warning while evaluating ${getName attrs}: «${reason}»: ${errormsg}" + else "Package ${getName attrs} in ${pos_str meta} ${errormsg}, continuing anyway." + + (optionalString (remediationMsg != "") "\n${remediationMsg}"); + isEnabled = findFirst (x: x == reason) null showWarnings; + in if isEnabled != null then builtins.trace msg true else true; + + metaTypes = let + types = import ./meta-types.nix { inherit lib; }; + inherit (types) str union int attrs attrsOf any listOf bool; + platforms = listOf (union [ str (attrsOf any) ]); # see lib.meta.platformMatch + in { + # These keys are documented + description = str; + mainProgram = str; + longDescription = str; + branch = str; + homepage = union [ + (listOf str) + str + ]; + downloadPage = str; + changelog = union [ + (listOf str) + str + ]; + license = let + # TODO disallow `str` licenses, use a module + licenseType = union [ + (attrsOf any) + str + ]; + in union [ + (listOf licenseType) + licenseType + ]; + sourceProvenance = listOf attrs; + maintainers = listOf (attrsOf any); # TODO use the maintainer type from lib/tests/maintainer-module.nix + priority = int; + pkgConfigModules = listOf str; + inherit platforms; + hydraPlatforms = listOf str; + broken = bool; + unfree = bool; + unsupported = bool; + insecure = bool; + tests = { + name = "test"; + verify = x: x == {} || ( # Accept {} for tests that are unsupported + isDerivation x && + x ? meta.timeout + ); + }; + timeout = int; + + # Needed for Hydra to expose channel tarballs: + # https://github.com/NixOS/hydra/blob/53335323ae79ca1a42643f58e520b376898ce641/doc/manual/src/jobs.md#meta-fields + isHydraChannel = bool; + + # Weirder stuff that doesn't appear in the documentation? + maxSilent = int; + knownVulnerabilities = listOf str; + name = str; + version = str; + tag = str; + executables = listOf str; + outputsToInstall = listOf str; + position = str; + available = any; + isBuildPythonPackage = platforms; + schedulingPriority = int; + isFcitxEngine = bool; + isIbusEngine = bool; + isGutenprint = bool; + badPlatforms = platforms; + }; + + checkMetaAttr = let + # Map attrs directly to the verify function for performance + metaTypes' = mapAttrs (_: t: t.verify) metaTypes; + in k: v: + if metaTypes?${k} then + if metaTypes'.${k} v then + [ ] + else + [ "key 'meta.${k}' has invalid value; expected ${metaTypes.${k}.name}, got\n ${ + toPretty { indent = " "; } v + }" ] + else + [ "key 'meta.${k}' is unrecognized; expected one of: \n [${concatMapStringsSep ", " (x: "'${x}'") (attrNames metaTypes)}]" ]; + checkMeta = meta: optionals config.checkMeta (concatMap (attr: checkMetaAttr attr meta.${attr}) (attrNames meta)); + + checkOutputsToInstall = attrs: let + expectedOutputs = attrs.meta.outputsToInstall or []; + actualOutputs = attrs.outputs or [ "out" ]; + missingOutputs = builtins.filter (output: ! builtins.elem output actualOutputs) expectedOutputs; + in if config.checkMeta + then builtins.length missingOutputs > 0 + else false; + + # Check if a derivation is valid, that is whether it passes checks for + # e.g brokenness or license. + # + # Return { valid: "yes", "warn" or "no" } and additionally + # { reason: String; errormsg: String } if it is not valid, where + # reason is one of "unfree", "blocklisted", "broken", "insecure", ... + # !!! reason strings are hardcoded into OfBorg, make sure to keep them in sync + # Along with a boolean flag for each reason + checkValidity = + let + validYes = { + valid = "yes"; + handled = true; + }; + in + attrs: + # Check meta attribute types first, to make sure it is always called even when there are other issues + # Note that this is not a full type check and functions below still need to by careful about their inputs! + let + res = checkMeta (attrs.meta or {}); + in + if res != [] then + { valid = "no"; reason = "unknown-meta"; errormsg = "has an invalid meta attrset:${concatMapStrings (x: "\n - " + x) res}\n"; } + + # --- Put checks that cannot be ignored here --- + else if checkOutputsToInstall attrs then + { valid = "no"; reason = "broken-outputs"; errormsg = "has invalid meta.outputsToInstall"; } + + # --- Put checks that can be ignored here --- + else if hasDeniedUnfreeLicense attrs && !(hasAllowlistedLicense attrs) then + { valid = "no"; reason = "unfree"; errormsg = "has an unfree license (‘${showLicense attrs.meta.license}’)"; } + else if hasBlocklistedLicense attrs then + { valid = "no"; reason = "blocklisted"; errormsg = "has a blocklisted license (‘${showLicense attrs.meta.license}’)"; } + else if hasDeniedNonSourceProvenance attrs then + { valid = "no"; reason = "non-source"; errormsg = "contains elements not built from source (‘${showSourceType attrs.meta.sourceProvenance}’)"; } + else if !allowBroken && attrs.meta.broken or false then + { valid = "no"; reason = "broken"; errormsg = "is marked as broken"; } + else if !allowUnsupportedSystem && hasUnsupportedPlatform attrs then + let toPretty' = toPretty { + allowPrettyValues = true; + indent = " "; + }; + in { valid = "no"; reason = "unsupported"; + errormsg = '' + is not available on the requested hostPlatform: + hostPlatform.config = "${hostPlatform.config}" + package.meta.platforms = ${toPretty' (attrs.meta.platforms or [])} + package.meta.badPlatforms = ${toPretty' (attrs.meta.badPlatforms or [])} + ''; + } + else if !(hasAllowedInsecure attrs) then + { valid = "no"; reason = "insecure"; errormsg = "is marked as insecure"; } + + # --- warnings --- + # Please also update the type in /pkgs/top-level/config.nix alongside this. + else if hasNoMaintainers attrs then + { valid = "warn"; reason = "maintainerless"; errormsg = "has no maintainers"; } + # ----- + else validYes; + + + # The meta attribute is passed in the resulting attribute set, + # but it's not part of the actual derivation, i.e., it's not + # passed to the builder and is not a dependency. But since we + # include it in the result, it *is* available to nix-env for queries. + # Example: + # meta = checkMeta.commonMeta { inherit validity attrs pos references; }; + # validity = checkMeta.assertValidity { inherit meta attrs; }; + commonMeta = { validity, attrs, pos ? null, references ? [ ] }: + let + outputs = attrs.outputs or [ "out" ]; + hasOutput = out: builtins.elem out outputs; + in + { + # `name` derivation attribute includes cross-compilation cruft, + # is under assert, and is sanitized. + # Let's have a clean always accessible version here. + name = attrs.name or "${attrs.pname}-${attrs.version}"; + + # If the packager hasn't specified `outputsToInstall`, choose a default, + # which is the name of `p.bin or p.out or p` along with `p.man` when + # present. + # + # If the packager has specified it, it will be overridden below in + # `// meta`. + # + # Note: This default probably shouldn't be globally configurable. + # Services and users should specify outputs explicitly, + # unless they are comfortable with this default. + outputsToInstall = + [ + ( + if hasOutput "bin" then "bin" + else if hasOutput "out" then "out" + else findFirst hasOutput null outputs + ) + ] + ++ optional (hasOutput "man") "man"; + } + // attrs.meta or { } + # Fill `meta.position` to identify the source location of the package. + // optionalAttrs (pos != null) { + position = pos.file + ":" + toString pos.line; + } // { + # Expose the result of the checks for everyone to see. + unfree = hasUnfreeLicense attrs; + broken = isMarkedBroken attrs; + unsupported = hasUnsupportedPlatform attrs; + insecure = isMarkedInsecure attrs; + + available = validity.valid != "no" + && (if config.checkMetaRecursively or false + then all (d: d.meta.available or true) references + else true); + }; + + assertValidity = { meta, attrs }: let + validity = checkValidity attrs; + inherit (validity) valid; + in if validity ? handled then validity else validity // { + # Throw an error if trying to evaluate a non-valid derivation + # or, alternatively, just output a warning message. + handled = + ( + if valid == "yes" then true + else if valid == "no" then ( + handleEvalIssue { inherit meta attrs; } { inherit (validity) reason errormsg; } + ) + else if valid == "warn" then ( + handleEvalWarning { inherit meta attrs; } { inherit (validity) reason errormsg; } + ) + else throw "Unknown validitiy: '${valid}'" + ); + }; + +in { inherit assertValidity commonMeta; } diff --git a/pkgs/stdenv/generic/common-path.nix b/pkgs/stdenv/generic/common-path.nix new file mode 100644 index 0000000..8c1acfb --- /dev/null +++ b/pkgs/stdenv/generic/common-path.nix @@ -0,0 +1,23 @@ +{pkgs}: [ + pkgs.coreutils + pkgs.findutils + pkgs.diffutils + pkgs.gnused + pkgs.gnugrep + pkgs.gawk + pkgs.gnutar + pkgs.gzip + pkgs.bzip2.bin + pkgs.gnumake + pkgs.bash + pkgs.patch + pkgs.xz.bin + + # The `file` command is added here because an enormous number of + # packages have a vendored dependency upon `file` in their + # `./configure` script, due to libtool<=2.4.6, or due to + # libtool>=2.4.7 in which the package author decided to set FILECMD + # when running libtoolize. In fact, file-5.4.6 *depends on itself* + # and tries to invoke `file` from its own ./configure script. + pkgs.file +] diff --git a/pkgs/stdenv/generic/default-builder.sh b/pkgs/stdenv/generic/default-builder.sh new file mode 100644 index 0000000..d49fb8a --- /dev/null +++ b/pkgs/stdenv/generic/default-builder.sh @@ -0,0 +1,4 @@ +if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi + +source $stdenv/setup +genericBuild diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix new file mode 100644 index 0000000..2cda43d --- /dev/null +++ b/pkgs/stdenv/generic/default.nix @@ -0,0 +1,183 @@ +let lib = import ../../../lib; stdenv-overridable = lib.makeOverridable ( + +argsStdenv@{ name ? "stdenv", preHook ? "", initialPath + +, # If we don't have a C compiler, we might either have `cc = null` or `cc = + # throw ...`, but if we do have a C compiler we should definiely have `cc != + # null`. + # + # TODO(@Ericson2314): Add assert without creating infinite recursion + hasCC ? cc != null, cc + +, shell +, allowedRequisites ? null, extraAttrs ? {}, overrides ? (self: super: {}), config +, disallowedRequisites ? [] + +, # The `fetchurl' to use for downloading curl and its dependencies + # (see all-packages.nix). + fetchurlBoot + +, setupScript ? ./setup.sh + +, extraNativeBuildInputs ? [] +, extraBuildInputs ? [] +, __stdenvImpureHostDeps ? [] +, __extraImpureHostDeps ? [] +, stdenvSandboxProfile ? "" +, extraSandboxProfile ? "" + + ## Platform parameters + ## + ## The "build" "host" "target" terminology below comes from GNU Autotools. See + ## its documentation for more information on what those words mean. Note that + ## each should always be defined, even when not cross compiling. + ## + ## For purposes of bootstrapping, think of each stage as a "sliding window" + ## over a list of platforms. Specifically, the host platform of the previous + ## stage becomes the build platform of the current one, and likewise the + ## target platform of the previous stage becomes the host platform of the + ## current one. + ## + +, # The platform on which packages are built. Consists of `system`, a + # string (e.g.,`i686-linux') identifying the most import attributes of the + # build platform, and `platform` a set of other details. + buildPlatform + +, # The platform on which packages run. + hostPlatform + +, # The platform which build tools (especially compilers) build for in this stage, + targetPlatform + +, # The implementation of `mkDerivation`, parameterized with the final stdenv so we can tie the knot. + # This is convient to have as a parameter so the stdenv "adapters" work better + mkDerivationFromStdenv ? stdenv: (import ./make-derivation.nix { inherit lib config; } stdenv).mkDerivation +}: + +let + defaultNativeBuildInputs = extraNativeBuildInputs ++ + [ + ../../build-support/setup-hooks/audit-tmpdir.sh + ../../build-support/setup-hooks/compress-man-pages.sh + ../../build-support/setup-hooks/make-symlinks-relative.sh + ../../build-support/setup-hooks/move-docs.sh + ../../build-support/setup-hooks/move-lib64.sh + ../../build-support/setup-hooks/move-sbin.sh + ../../build-support/setup-hooks/move-systemd-user-units.sh + ../../build-support/setup-hooks/multiple-outputs.sh + ../../build-support/setup-hooks/patch-shebangs.sh + ../../build-support/setup-hooks/prune-libtool-files.sh + ../../build-support/setup-hooks/reproducible-builds.sh + ../../build-support/setup-hooks/set-source-date-epoch-to-latest.sh + ../../build-support/setup-hooks/strip.sh + ] ++ lib.optionals hasCC [ cc ]; + + defaultBuildInputs = extraBuildInputs; + + stdenv = (stdenv-overridable argsStdenv); + + # The stdenv that we are producing. + in + derivation ( + lib.optionalAttrs (allowedRequisites != null) { + allowedRequisites = allowedRequisites + ++ defaultNativeBuildInputs ++ defaultBuildInputs; + } + // lib.optionalAttrs config.contentAddressedByDefault { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + } + // { + inherit name; + inherit disallowedRequisites; + + # Nix itself uses the `system` field of a derivation to decide where to + # build it. This is a bit confusing for cross compilation. + inherit (buildPlatform) system; + + builder = shell; + + args = ["-e" ./builder.sh]; + + setup = setupScript; + + # We pretty much never need rpaths on Darwin, since all library path references + # are absolute unless we go out of our way to make them relative (like with CF) + # TODO: This really wants to be in stdenv/darwin but we don't have hostPlatform + # there (yet?) so it goes here until then. + preHook = preHook + lib.optionalString buildPlatform.isDarwin '' + export NIX_DONT_SET_RPATH_FOR_BUILD=1 + '' + lib.optionalString (hostPlatform.isDarwin || (!hostPlatform.isElf && !hostPlatform.isMacho)) '' + export NIX_DONT_SET_RPATH=1 + export NIX_NO_SELF_RPATH=1 + '' + lib.optionalString (hostPlatform.isDarwin && hostPlatform.isMacOS) '' + export MACOSX_DEPLOYMENT_TARGET=${hostPlatform.darwinMinVersion} + '' + # TODO this should be uncommented, but it causes stupid mass rebuilds. I + # think the best solution would just be to fixup linux RPATHs so we don't + # need to set `-rpath` anywhere. + # + lib.optionalString targetPlatform.isDarwin '' + # export NIX_DONT_SET_RPATH_FOR_TARGET=1 + # '' + ; + + inherit initialPath shell + defaultNativeBuildInputs defaultBuildInputs; + } + // lib.optionalAttrs buildPlatform.isDarwin { + __sandboxProfile = stdenvSandboxProfile; + __impureHostDeps = __stdenvImpureHostDeps; + }) + + // { + + meta = { + description = "The default build environment for Unix packages in Nixpkgs"; + platforms = lib.platforms.all; + }; + + inherit buildPlatform hostPlatform targetPlatform; + + inherit extraNativeBuildInputs extraBuildInputs + __extraImpureHostDeps extraSandboxProfile; + + # Utility flags to test the type of platform. + inherit (hostPlatform) + isDarwin isLinux isSunOS isCygwin isBSD isFreeBSD isOpenBSD + isi686 isx86_32 isx86_64 + is32bit is64bit + isAarch32 isAarch64 isMips isBigEndian; + + # Override `system` so that packages can get the system of the host + # platform through `stdenv.system`. `system` is originally set to the + # build platform within the derivation above so that Nix directs the build + # to correct type of machine. + inherit (hostPlatform) system; + + mkDerivation = mkDerivationFromStdenv stdenv; + + inherit fetchurlBoot; + + inherit overrides; + + inherit cc hasCC; + + # Convenience for doing some very basic shell syntax checking by parsing a script + # without running any commands. Because this will also skip `shopt -s extglob` + # commands and extglob affects the Bash parser, we enable extglob always. + shellDryRun = "${stdenv.shell} -n -O extglob"; + + tests = { + succeedOnFailure = import ../tests/succeedOnFailure.nix { inherit stdenv; }; + }; + passthru.tests = lib.warn "Use `stdenv.tests` instead. `passthru` is a `mkDerivation` detail." stdenv.tests; + } + + # Propagate any extra attributes. For instance, we use this to + # "lift" packages like curl from the final stdenv for Linux to + # all-packages.nix for that platform (meaning that it has a line + # like curl = if stdenv ? curl then stdenv.curl else ...). + // extraAttrs +); in stdenv-overridable diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix new file mode 100644 index 0000000..1214d01 --- /dev/null +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -0,0 +1,639 @@ +{ lib, config }: + +stdenv: + +let + # Lib attributes are inherited to the lexical scope for performance reasons. + inherit (lib) + any + assertMsg + attrNames + boolToString + concatLists + concatMap + concatMapStrings + concatStringsSep + elem + elemAt + extendDerivation + filter + findFirst + getDev + head + imap1 + isAttrs + isBool + isDerivation + isInt + isList + isString + mapAttrs + mapNullable + optional + optionalAttrs + optionalString + optionals + remove + splitString + subtractLists + unique + ; + + inherit (import ../../build-support/lib/cmake.nix { inherit lib stdenv; }) makeCMakeFlags; + inherit (import ../../build-support/lib/meson.nix { inherit lib stdenv; }) makeMesonFlags; + + mkDerivation = + fnOrAttrs: + if builtins.isFunction fnOrAttrs + then makeDerivationExtensible fnOrAttrs + else makeDerivationExtensibleConst fnOrAttrs; + + checkMeta = import ./check-meta.nix { + inherit lib config; + # Nix itself uses the `system` field of a derivation to decide where + # to build it. This is a bit confusing for cross compilation. + inherit (stdenv) hostPlatform; + }; + + # Based off lib.makeExtensible, with modifications: + makeDerivationExtensible = rattrs: + let + # NOTE: The following is a hint that will be printed by the Nix cli when + # encountering an infinite recursion. It must not be formatted into + # separate lines, because Nix would only show the last line of the comment. + + # An infinite recursion here can be caused by having the attribute names of expression `e` in `.overrideAttrs(finalAttrs: previousAttrs: e)` depend on `finalAttrs`. Only the attribute values of `e` can depend on `finalAttrs`. + args = rattrs (args // { inherit finalPackage overrideAttrs; }); + # ^^^^ + + overrideAttrs = f0: + let + f = self: super: + # Convert f0 to an overlay. Legacy is: + # overrideAttrs (super: {}) + # We want to introduce self. We follow the convention of overlays: + # overrideAttrs (self: super: {}) + # Which means the first parameter can be either self or super. + # This is surprising, but far better than the confusion that would + # arise from flipping an overlay's parameters in some cases. + let x = f0 super; + in + if builtins.isFunction x + then + # Can't reuse `x`, because `self` comes first. + # Looks inefficient, but `f0 super` was a cheap thunk. + f0 self super + else x; + in + makeDerivationExtensible + (self: let super = rattrs self; in super // (if builtins.isFunction f0 || f0?__functor then f self super else f0)); + + finalPackage = + mkDerivationSimple overrideAttrs args; + + in finalPackage; + + #makeDerivationExtensibleConst = attrs: makeDerivationExtensible (_: attrs); + # but pre-evaluated for a slight improvement in performance. + makeDerivationExtensibleConst = attrs: + mkDerivationSimple + (f0: + let + f = self: super: + let x = f0 super; + in + if builtins.isFunction x + then + f0 self super + else x; + in + makeDerivationExtensible (self: attrs // (if builtins.isFunction f0 || f0?__functor then f self attrs else f0))) + attrs; + + knownHardeningFlags = [ + "bindnow" + "format" + "fortify" + "fortify3" + "pic" + "pie" + "relro" + "stackprotector" + "strictoverflow" + "trivialautovarinit" + "zerocallusedregs" + ]; + + removedOrReplacedAttrNames = [ + "checkInputs" "installCheckInputs" + "nativeCheckInputs" "nativeInstallCheckInputs" + "__contentAddressed" + "__darwinAllowLocalNetworking" + "__impureHostDeps" "__propagatedImpureHostDeps" + "sandboxProfile" "propagatedSandboxProfile" + ]; + + # Turn a derivation into its outPath without a string context attached. + # See the comment at the usage site. + unsafeDerivationToUntrackedOutpath = drv: + if isDerivation drv + then builtins.unsafeDiscardStringContext drv.outPath + else drv; + + makeDerivationArgument = + + +# `makeDerivationArgument` is responsible for the `mkDerivation` arguments that +# affect the actual derivation, excluding a few behaviors that are not +# essential, and specific to `mkDerivation`: `env`, `cmakeFlags`, `mesonFlags`. +# +# See also: +# +# * https://nixos.org/nixpkgs/manual/#sec-using-stdenv +# Details on how to use this mkDerivation function +# +# * https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations +# Explanation about derivations in general +{ + +# These types of dependencies are all exhaustively documented in +# the "Specifying Dependencies" section of the "Standard +# Environment" chapter of the Nixpkgs manual. + +# TODO(@Ericson2314): Stop using legacy dep attribute names + +# host offset -> target offset + depsBuildBuild ? [] # -1 -> -1 +, depsBuildBuildPropagated ? [] # -1 -> -1 +, nativeBuildInputs ? [] # -1 -> 0 N.B. Legacy name +, propagatedNativeBuildInputs ? [] # -1 -> 0 N.B. Legacy name +, depsBuildTarget ? [] # -1 -> 1 +, depsBuildTargetPropagated ? [] # -1 -> 1 + +, depsHostHost ? [] # 0 -> 0 +, depsHostHostPropagated ? [] # 0 -> 0 +, buildInputs ? [] # 0 -> 1 N.B. Legacy name +, propagatedBuildInputs ? [] # 0 -> 1 N.B. Legacy name + +, depsTargetTarget ? [] # 1 -> 1 +, depsTargetTargetPropagated ? [] # 1 -> 1 + +, checkInputs ? [] +, installCheckInputs ? [] +, nativeCheckInputs ? [] +, nativeInstallCheckInputs ? [] + +# Configure Phase +, configureFlags ? [] +, # Target is not included by default because most programs don't care. + # Including it then would cause needless mass rebuilds. + # + # TODO(@Ericson2314): Make [ "build" "host" ] always the default / resolve #87909 + configurePlatforms ? optionals + (stdenv.hostPlatform != stdenv.buildPlatform || config.configurePlatformsByDefault) + [ "build" "host" ] + +# TODO(@Ericson2314): Make unconditional / resolve #33599 +# Check phase +, doCheck ? config.doCheckByDefault or false + +# TODO(@Ericson2314): Make unconditional / resolve #33599 +# InstallCheck phase +, doInstallCheck ? config.doCheckByDefault or false + +, # TODO(@Ericson2314): Make always true and remove / resolve #178468 + strictDeps ? if config.strictDepsByDefault then true else stdenv.hostPlatform != stdenv.buildPlatform + +, enableParallelBuilding ? config.enableParallelBuildingByDefault + +, separateDebugInfo ? false +, outputs ? [ "out" ] +, __darwinAllowLocalNetworking ? false +, __impureHostDeps ? [] +, __propagatedImpureHostDeps ? [] +, sandboxProfile ? "" +, propagatedSandboxProfile ? "" + +, hardeningEnable ? [] +, hardeningDisable ? [] + +, patches ? [] + +, __contentAddressed ? + (! attrs ? outputHash) # Fixed-output drvs can't be content addressed too + && config.contentAddressedByDefault + +# Experimental. For simple packages mostly just works, +# but for anything complex, be prepared to debug if enabling. +, __structuredAttrs ? config.structuredAttrsByDefault or false + +, ... } @ attrs: + +# Policy on acceptable hash types in nixpkgs +assert attrs ? outputHash -> ( + let algo = + attrs.outputHashAlgo or (head (splitString "-" attrs.outputHash)); + in + if algo == "md5" then + throw "Rejected insecure ${algo} hash '${attrs.outputHash}'" + else + true +); + +let + # TODO(@oxij, @Ericson2314): This is here to keep the old semantics, remove when + # no package has `doCheck = true`. + doCheck' = doCheck && stdenv.buildPlatform.canExecute stdenv.hostPlatform; + doInstallCheck' = doInstallCheck && stdenv.buildPlatform.canExecute stdenv.hostPlatform; + + separateDebugInfo' = separateDebugInfo && stdenv.hostPlatform.isLinux; + outputs' = outputs ++ optional separateDebugInfo' "debug"; + + noNonNativeDeps = builtins.length (depsBuildTarget ++ depsBuildTargetPropagated + ++ depsHostHost ++ depsHostHostPropagated + ++ buildInputs ++ propagatedBuildInputs + ++ depsTargetTarget ++ depsTargetTargetPropagated) == 0; + dontAddHostSuffix = attrs ? outputHash && !noNonNativeDeps || !stdenv.hasCC; + + hardeningDisable' = if any (x: x == "fortify") hardeningDisable + # disabling fortify implies fortify3 should also be disabled + then unique (hardeningDisable ++ [ "fortify3" ]) + else hardeningDisable; + defaultHardeningFlags = + (if stdenv.hasCC then stdenv.cc else {}).defaultHardeningFlags or + # fallback safe-ish set of flags + (remove "pie" knownHardeningFlags); + enabledHardeningOptions = + if builtins.elem "all" hardeningDisable' + then [] + else subtractLists hardeningDisable' (defaultHardeningFlags ++ hardeningEnable); + # hardeningDisable additionally supports "all". + erroneousHardeningFlags = subtractLists knownHardeningFlags (hardeningEnable ++ remove "all" hardeningDisable); + + checkDependencyList = checkDependencyList' []; + checkDependencyList' = positions: name: deps: + imap1 + (index: dep: + if isDerivation dep || dep == null || builtins.isString dep || builtins.isPath dep then dep + else if isList dep then checkDependencyList' ([index] ++ positions) name dep + else throw "Dependency is not of a valid type: ${concatMapStrings (ix: "element ${toString ix} of ") ([index] ++ positions)}${name} for ${attrs.name or attrs.pname}") + deps; +in if builtins.length erroneousHardeningFlags != 0 +then abort ("mkDerivation was called with unsupported hardening flags: " + lib.generators.toPretty {} { + inherit erroneousHardeningFlags hardeningDisable hardeningEnable knownHardeningFlags; +}) +else let + doCheck = doCheck'; + doInstallCheck = doInstallCheck'; + buildInputs' = buildInputs + ++ optionals doCheck checkInputs + ++ optionals doInstallCheck installCheckInputs; + nativeBuildInputs' = nativeBuildInputs + ++ optional separateDebugInfo' ../../build-support/setup-hooks/separate-debug-info.sh + ++ optional stdenv.hostPlatform.isWindows ../../build-support/setup-hooks/win-dll-link.sh + ++ optionals doCheck nativeCheckInputs + ++ optionals doInstallCheck nativeInstallCheckInputs; + + outputs = outputs'; + + dependencies = [ + [ + (map (drv: getDev drv.__spliced.buildBuild or drv) (checkDependencyList "depsBuildBuild" depsBuildBuild)) + (map (drv: getDev drv.__spliced.buildHost or drv) (checkDependencyList "nativeBuildInputs" nativeBuildInputs')) + (map (drv: getDev drv.__spliced.buildTarget or drv) (checkDependencyList "depsBuildTarget" depsBuildTarget)) + ] + [ + (map (drv: getDev drv.__spliced.hostHost or drv) (checkDependencyList "depsHostHost" depsHostHost)) + (map (drv: getDev drv.__spliced.hostTarget or drv) (checkDependencyList "buildInputs" buildInputs')) + ] + [ + (map (drv: getDev drv.__spliced.targetTarget or drv) (checkDependencyList "depsTargetTarget" depsTargetTarget)) + ] + ]; + propagatedDependencies = [ + [ + (map (drv: getDev drv.__spliced.buildBuild or drv) (checkDependencyList "depsBuildBuildPropagated" depsBuildBuildPropagated)) + (map (drv: getDev drv.__spliced.buildHost or drv) (checkDependencyList "propagatedNativeBuildInputs" propagatedNativeBuildInputs)) + (map (drv: getDev drv.__spliced.buildTarget or drv) (checkDependencyList "depsBuildTargetPropagated" depsBuildTargetPropagated)) + ] + [ + (map (drv: getDev drv.__spliced.hostHost or drv) (checkDependencyList "depsHostHostPropagated" depsHostHostPropagated)) + (map (drv: getDev drv.__spliced.hostTarget or drv) (checkDependencyList "propagatedBuildInputs" propagatedBuildInputs)) + ] + [ + (map (drv: getDev drv.__spliced.targetTarget or drv) (checkDependencyList "depsTargetTargetPropagated" depsTargetTargetPropagated)) + ] + ]; + + derivationArg = + removeAttrs attrs removedOrReplacedAttrNames + // (optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) { + name = + let + # Indicate the host platform of the derivation if cross compiling. + # Fixed-output derivations like source tarballs shouldn't get a host + # suffix. But we have some weird ones with run-time deps that are + # just used for their side-affects. Those might as well since the + # hash can't be the same. See #32986. + hostSuffix = optionalString + (stdenv.hostPlatform != stdenv.buildPlatform && !dontAddHostSuffix) + "-${stdenv.hostPlatform.config}"; + + # Disambiguate statically built packages. This was originally + # introduce as a means to prevent nix-env to get confused between + # nix and nixStatic. This should be also achieved by moving the + # hostSuffix before the version, so we could contemplate removing + # it again. + staticMarker = optionalString stdenv.hostPlatform.isStatic "-static"; + in + lib.strings.sanitizeDerivationName ( + if attrs ? name + then attrs.name + hostSuffix + else + # we cannot coerce null to a string below + assert assertMsg (attrs ? version && attrs.version != null) "The ‘version’ attribute cannot be null."; + "${attrs.pname}${staticMarker}${hostSuffix}-${attrs.version}" + ); + }) // { + builder = attrs.realBuilder or stdenv.shell; + args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)]; + inherit stdenv; + + # The `system` attribute of a derivation has special meaning to Nix. + # Derivations set it to choose what sort of machine could be used to + # execute the build, The build platform entirely determines this, + # indeed more finely than Nix knows or cares about. The `system` + # attribute of `buildPlatfom` matches Nix's degree of specificity. + # exactly. + inherit (stdenv.buildPlatform) system; + + userHook = config.stdenv.userHook or null; + __ignoreNulls = true; + inherit __structuredAttrs strictDeps; + + depsBuildBuild = elemAt (elemAt dependencies 0) 0; + nativeBuildInputs = elemAt (elemAt dependencies 0) 1; + depsBuildTarget = elemAt (elemAt dependencies 0) 2; + depsHostHost = elemAt (elemAt dependencies 1) 0; + buildInputs = elemAt (elemAt dependencies 1) 1; + depsTargetTarget = elemAt (elemAt dependencies 2) 0; + + depsBuildBuildPropagated = elemAt (elemAt propagatedDependencies 0) 0; + propagatedNativeBuildInputs = elemAt (elemAt propagatedDependencies 0) 1; + depsBuildTargetPropagated = elemAt (elemAt propagatedDependencies 0) 2; + depsHostHostPropagated = elemAt (elemAt propagatedDependencies 1) 0; + propagatedBuildInputs = elemAt (elemAt propagatedDependencies 1) 1; + depsTargetTargetPropagated = elemAt (elemAt propagatedDependencies 2) 0; + + # This parameter is sometimes a string, sometimes null, and sometimes a list, yuck + configureFlags = + configureFlags + ++ optional (elem "build" configurePlatforms) "--build=${stdenv.buildPlatform.config}" + ++ optional (elem "host" configurePlatforms) "--host=${stdenv.hostPlatform.config}" + ++ optional (elem "target" configurePlatforms) "--target=${stdenv.targetPlatform.config}"; + + inherit patches; + + inherit doCheck doInstallCheck; + + inherit outputs; + } // optionalAttrs (__contentAddressed) { + inherit __contentAddressed; + # Provide default values for outputHashMode and outputHashAlgo because + # most people won't care about these anyways + outputHashAlgo = attrs.outputHashAlgo or "sha256"; + outputHashMode = attrs.outputHashMode or "recursive"; + } // optionalAttrs (enableParallelBuilding) { + inherit enableParallelBuilding; + enableParallelChecking = attrs.enableParallelChecking or true; + enableParallelInstalling = attrs.enableParallelInstalling or true; + } // optionalAttrs (hardeningDisable != [] || hardeningEnable != [] || stdenv.hostPlatform.isMusl) { + NIX_HARDENING_ENABLE = enabledHardeningOptions; + } // optionalAttrs (stdenv.hostPlatform.isx86_64 && stdenv.hostPlatform ? gcc.arch) { + requiredSystemFeatures = attrs.requiredSystemFeatures or [] ++ [ "gccarch-${stdenv.hostPlatform.gcc.arch}" ]; + } // optionalAttrs (stdenv.buildPlatform.isDarwin) ( + let + computedSandboxProfile = + concatMap (input: input.__propagatedSandboxProfile or []) + (stdenv.extraNativeBuildInputs + ++ stdenv.extraBuildInputs + ++ concatLists dependencies); + + computedPropagatedSandboxProfile = + concatMap (input: input.__propagatedSandboxProfile or []) + (concatLists propagatedDependencies); + + computedImpureHostDeps = + unique (concatMap (input: input.__propagatedImpureHostDeps or []) + (stdenv.extraNativeBuildInputs + ++ stdenv.extraBuildInputs + ++ concatLists dependencies)); + + computedPropagatedImpureHostDeps = + unique (concatMap (input: input.__propagatedImpureHostDeps or []) + (concatLists propagatedDependencies)); + in { + inherit __darwinAllowLocalNetworking; + # TODO: remove `unique` once nix has a list canonicalization primitive + __sandboxProfile = + let profiles = [ stdenv.extraSandboxProfile ] ++ computedSandboxProfile ++ computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile sandboxProfile ]; + final = concatStringsSep "\n" (filter (x: x != "") (unique profiles)); + in final; + __propagatedSandboxProfile = unique (computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile ]); + __impureHostDeps = computedImpureHostDeps ++ computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps ++ __impureHostDeps ++ stdenv.__extraImpureHostDeps ++ [ + "/dev/zero" + "/dev/random" + "/dev/urandom" + "/bin/sh" + ]; + __propagatedImpureHostDeps = computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps; + }) // + # If we use derivations directly here, they end up as build-time dependencies. + # This is especially problematic in the case of disallowed*, since the disallowed + # derivations will be built by nix as build-time dependencies, while those + # derivations might take a very long time to build, or might not even build + # successfully on the platform used. + # We can improve on this situation by instead passing only the outPath, + # without an attached string context, to nix. The out path will be a placeholder + # which will be replaced by the actual out path if the derivation in question + # is part of the final closure (and thus needs to be built). If it is not + # part of the final closure, then the placeholder will be passed along, + # but in that case we know for a fact that the derivation is not part of the closure. + # This means that passing the out path to nix does the right thing in either + # case, both for disallowed and allowed references/requisites, and we won't + # build the derivation if it wouldn't be part of the closure, saving time and resources. + # While the problem is less severe for allowed*, since we want the derivation + # to be built eventually, we would still like to get the error early and without + # having to wait while nix builds a derivation that might not be used. + # See also https://github.com/NixOS/nix/issues/4629 + optionalAttrs (attrs ? disallowedReferences) { + disallowedReferences = + map unsafeDerivationToUntrackedOutpath attrs.disallowedReferences; + } // + optionalAttrs (attrs ? disallowedRequisites) { + disallowedRequisites = + map unsafeDerivationToUntrackedOutpath attrs.disallowedRequisites; + } // + optionalAttrs (attrs ? allowedReferences) { + allowedReferences = + mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedReferences; + } // + optionalAttrs (attrs ? allowedRequisites) { + allowedRequisites = + mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedRequisites; + }; + +in + derivationArg; + +mkDerivationSimple = overrideAttrs: + +# `mkDerivation` wraps the builtin `derivation` function to +# produce derivations that use this stdenv and its shell. +# +# Internally, it delegates most of its behavior to `makeDerivationArgument`, +# except for the `env`, `cmakeFlags`, and `mesonFlags` attributes, as well +# as the attributes `meta` and `passthru` that affect [package attributes], +# and not the derivation itself. +# +# See also: +# +# * https://nixos.org/nixpkgs/manual/#sec-using-stdenv +# Details on how to use this mkDerivation function +# +# * https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations +# Explanation about derivations in general +# +# * [package attributes]: https://nixos.org/manual/nix/stable/glossary#package-attribute-set +{ + +# Configure Phase + cmakeFlags ? [] +, mesonFlags ? [] + +, meta ? {} +, passthru ? {} +, pos ? # position used in error messages and for meta.position + (if attrs.meta.description or null != null + then builtins.unsafeGetAttrPos "description" attrs.meta + else if attrs.version or null != null + then builtins.unsafeGetAttrPos "version" attrs + else builtins.unsafeGetAttrPos "name" attrs) + +# Experimental. For simple packages mostly just works, +# but for anything complex, be prepared to debug if enabling. +, __structuredAttrs ? config.structuredAttrsByDefault or false + +, env ? { } + +, ... } @ attrs: + +# Policy on acceptable hash types in nixpkgs +assert attrs ? outputHash -> ( + let algo = + attrs.outputHashAlgo or (head (splitString "-" attrs.outputHash)); + in + if algo == "md5" then + throw "Rejected insecure ${algo} hash '${attrs.outputHash}'" + else + true +); + +let + envIsExportable = isAttrs env && !isDerivation env; + + derivationArg = makeDerivationArgument + (removeAttrs + attrs + (["meta" "passthru" "pos"] + ++ optional (__structuredAttrs || envIsExportable) "env" + ) + // optionalAttrs __structuredAttrs { env = checkedEnv; } + // { + cmakeFlags = makeCMakeFlags attrs; + mesonFlags = makeMesonFlags attrs; + }); + + meta = checkMeta.commonMeta { + inherit validity attrs pos; + references = attrs.nativeBuildInputs or [] ++ attrs.buildInputs or [] + ++ attrs.propagatedNativeBuildInputs or [] ++ attrs.propagatedBuildInputs or []; + }; + validity = checkMeta.assertValidity { inherit meta attrs; }; + + checkedEnv = + let + overlappingNames = attrNames (builtins.intersectAttrs env derivationArg); + in + assert assertMsg envIsExportable + "When using structured attributes, `env` must be an attribute set of environment variables."; + assert assertMsg (overlappingNames == [ ]) + "The ‘env’ attribute set cannot contain any attributes passed to derivation. The following attributes are overlapping: ${concatStringsSep ", " overlappingNames}"; + mapAttrs + (n: v: assert assertMsg (isString v || isBool v || isInt v || isDerivation v) + "The ‘env’ attribute set can only contain derivation, string, boolean or integer attributes. The ‘${n}’ attribute is of type ${builtins.typeOf v}."; v) + env; + + # Fixed-output derivations may not reference other paths, which means that + # for a fixed-output derivation, the corresponding inputDerivation should + # *not* be fixed-output. To achieve this we simply delete the attributes that + # would make it fixed-output. + deleteFixedOutputRelatedAttrs = lib.flip builtins.removeAttrs [ "outputHashAlgo" "outputHash" "outputHashMode" ]; + +in + +extendDerivation + validity.handled + ({ + # A derivation that always builds successfully and whose runtime + # dependencies are the original derivations build time dependencies + # This allows easy building and distributing of all derivations + # needed to enter a nix-shell with + # nix-build shell.nix -A inputDerivation + inputDerivation = derivation (deleteFixedOutputRelatedAttrs derivationArg // { + # Add a name in case the original drv didn't have one + name = derivationArg.name or "inputDerivation"; + # This always only has one output + outputs = [ "out" ]; + + # Propagate the original builder and arguments, since we override + # them and they might contain references to build inputs + _derivation_original_builder = derivationArg.builder; + _derivation_original_args = derivationArg.args; + + builder = stdenv.shell; + # The bash builtin `export` dumps all current environment variables, + # which is where all build input references end up (e.g. $PATH for + # binaries). By writing this to $out, Nix can find and register + # them as runtime dependencies (since Nix greps for store paths + # through $out to find them) + args = [ "-c" '' + export > $out + for var in $passAsFile; do + pathVar="''${var}Path" + printf "%s" "$(< "''${!pathVar}")" >> $out + done + '' ]; + + # inputDerivation produces the inputs; not the outputs, so any + # restrictions on what used to be the outputs don't serve a purpose + # anymore. + allowedReferences = null; + allowedRequisites = null; + disallowedReferences = [ ]; + disallowedRequisites = [ ]; + }); + + inherit passthru overrideAttrs; + inherit meta; + } // + # Pass through extra attributes that are not inputs, but + # should be made available to Nix expressions using the + # derivation (e.g., in assertions). + passthru) + (derivation (derivationArg // optionalAttrs envIsExportable checkedEnv)); + +in +{ + inherit mkDerivation; +} diff --git a/pkgs/stdenv/generic/meta-types.nix b/pkgs/stdenv/generic/meta-types.nix new file mode 100644 index 0000000..ddbd1da --- /dev/null +++ b/pkgs/stdenv/generic/meta-types.nix @@ -0,0 +1,76 @@ +{ lib }: +# Simple internal type checks for meta. +# This file is not a stable interface and may be changed arbitrarily. +# +# TODO: add a method to the module system types +# see https://github.com/NixOS/nixpkgs/pull/273935#issuecomment-1854173100 +let + inherit (builtins) isString isInt isAttrs isList all any attrValues isFunction isBool concatStringsSep isFloat; + isTypeDef = t: isAttrs t && t ? name && isString t.name && t ? verify && isFunction t.verify; + +in +lib.fix (self: { + string = { + name = "string"; + verify = isString; + }; + str = self.string; # Type alias + + any = { + name = "any"; + verify = _: true; + }; + + int = { + name = "int"; + verify = isInt; + }; + + float = { + name = "float"; + verify = isFloat; + }; + + bool = { + name = "bool"; + verify = isBool; + }; + + attrs = { + name = "attrs"; + verify = isAttrs; + }; + + list = { + name = "list"; + verify = isList; + }; + + attrsOf = t: assert isTypeDef t; let + inherit (t) verify; + in { + name = "attrsOf<${t.name}>"; + verify = + # attrsOf can be optimised to just isAttrs + if t == self.any then isAttrs + else attrs: isAttrs attrs && all verify (attrValues attrs); + }; + + listOf = t: assert isTypeDef t; let + inherit (t) verify; + in { + name = "listOf<${t.name}>"; + verify = + # listOf can be optimised to just isList + if t == self.any then isList + else v: isList v && all verify v; + }; + + union = types: assert all isTypeDef types; let + # Store a list of functions so we don't have to pay the cost of attrset lookups at runtime. + funcs = map (t: t.verify) types; + in { + name = "union<${concatStringsSep "," (map (t: t.name) types)}>"; + verify = v: any (func: func v) funcs; + }; +}) diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh new file mode 100644 index 0000000..45c73d7 --- /dev/null +++ b/pkgs/stdenv/generic/setup.sh @@ -0,0 +1,1634 @@ +# shellcheck shell=bash +# shellcheck disable=1090,2154,2123,2034,2178,2048,2068,1091 +__nixpkgs_setup_set_original=$- +set -eu +set -o pipefail + +if [[ -n "${BASH_VERSINFO-}" && "${BASH_VERSINFO-}" -lt 4 ]]; then + echo "Detected Bash version that isn't supported by Nixpkgs (${BASH_VERSION})" + echo "Please install Bash 4 or greater to continue." + exit 1 +fi + +shopt -s inherit_errexit + +if (( "${NIX_DEBUG:-0}" >= 6 )); then + set -x +fi + +if [ -f .attrs.sh ] || [[ -n "${NIX_ATTRS_JSON_FILE:-}" ]]; then + __structuredAttrs=1 + echo "structuredAttrs is enabled" + + for outputName in "${!outputs[@]}"; do + # ex: out=/nix/store/... + export "$outputName=${outputs[$outputName]}" + done + + # $NIX_ATTRS_JSON_FILE pointed to the wrong location in sandbox + # https://github.com/NixOS/nix/issues/6736; please keep around until the + # fix reaches *every patch version* that's >= lib/minver.nix + if ! [[ -e "${NIX_ATTRS_JSON_FILE:-}" ]]; then + export NIX_ATTRS_JSON_FILE="$NIX_BUILD_TOP/.attrs.json" + fi + if ! [[ -e "${NIX_ATTRS_SH_FILE:-}" ]]; then + export NIX_ATTRS_SH_FILE="$NIX_BUILD_TOP/.attrs.sh" + fi +else + __structuredAttrs= + : "${outputs:=out}" +fi + +getAllOutputNames() { + if [ -n "$__structuredAttrs" ]; then + echo "${!outputs[*]}" + else + echo "$outputs" + fi +} + +###################################################################### +# Hook handling. + + +# Run all hooks with the specified name in the order in which they +# were added, stopping if any fails (returns a non-zero exit +# code). The hooks for are the shell function or variable +# , and the values of the shell array ‘Hooks’. +runHook() { + local hookName="$1" + shift + local hooksSlice="${hookName%Hook}Hooks[@]" + + local hook + # Hack around old bash being bad and thinking empty arrays are + # undefined. + for hook in "_callImplicitHook 0 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do + _eval "$hook" "$@" + done + + return 0 +} + + +# Run all hooks with the specified name, until one succeeds (returns a +# zero exit code). If none succeed, return a non-zero exit code. +runOneHook() { + local hookName="$1" + shift + local hooksSlice="${hookName%Hook}Hooks[@]" + + local hook ret=1 + # Hack around old bash like above + for hook in "_callImplicitHook 1 $hookName" ${!hooksSlice+"${!hooksSlice}"}; do + if _eval "$hook" "$@"; then + ret=0 + break + fi + done + + return "$ret" +} + + +# Run the named hook, either by calling the function with that name or +# by evaluating the variable with that name. This allows convenient +# setting of hooks both from Nix expressions (as attributes / +# environment variables) and from shell scripts (as functions). If you +# want to allow multiple hooks, use runHook instead. +_callImplicitHook() { + local def="$1" + local hookName="$2" + if declare -F "$hookName" > /dev/null; then + "$hookName" + elif type -p "$hookName" > /dev/null; then + source "$hookName" + elif [ -n "${!hookName:-}" ]; then + eval "${!hookName}" + else + return "$def" + fi + # `_eval` expects hook to need nounset disable and leave it + # disabled anyways, so Ok to to delegate. The alternative of a + # return trap is no good because it would affect nested returns. +} + + +# A function wrapper around ‘eval’ that ensures that ‘return’ inside +# hooks exits the hook, not the caller. Also will only pass args if +# command can take them +_eval() { + if declare -F "$1" > /dev/null 2>&1; then + "$@" # including args + else + eval "$1" + fi +} + + +###################################################################### +# Logging. + +# Prints a command such that all word splits are unambiguous. We need +# to split the command in three parts because the middle format string +# will be, and must be, repeated for each argument. The first argument +# goes before the ':' and is just for convenience. +echoCmd() { + printf "%s:" "$1" + shift + printf ' %q' "$@" + echo +} + + +###################################################################### +# Error handling. + +exitHandler() { + exitCode="$?" + set +e + + if [ -n "${showBuildStats:-}" ]; then + read -r -d '' -a buildTimes < <(times) + echo "build times:" + echo "user time for the shell ${buildTimes[0]}" + echo "system time for the shell ${buildTimes[1]}" + echo "user time for all child processes ${buildTimes[2]}" + echo "system time for all child processes ${buildTimes[3]}" + fi + + if (( "$exitCode" != 0 )); then + runHook failureHook + + # If the builder had a non-zero exit code and + # $succeedOnFailure is set, create the file + # ‘$out/nix-support/failed’ to signal failure, and exit + # normally. Otherwise, return the original exit code. + if [ -n "${succeedOnFailure:-}" ]; then + echo "build failed with exit code $exitCode (ignored)" + mkdir -p "$out/nix-support" + printf "%s" "$exitCode" > "$out/nix-support/failed" + exit 0 + fi + + else + runHook exitHook + fi + + return "$exitCode" +} + +trap "exitHandler" EXIT + + +###################################################################### +# Helper functions. + + +addToSearchPathWithCustomDelimiter() { + local delimiter="$1" + local varName="$2" + local dir="$3" + if [[ -d "$dir" && "${!varName:+${delimiter}${!varName}${delimiter}}" \ + != *"${delimiter}${dir}${delimiter}"* ]]; then + export "${varName}=${!varName:+${!varName}${delimiter}}${dir}" + fi +} + +addToSearchPath() { + addToSearchPathWithCustomDelimiter ":" "$@" +} + +# Prepend elements to variable "$1", which may come from an attr. +# +# This is useful in generic setup code, which must (for now) support +# both derivations with and without __structuredAttrs true, so the +# variable may be an array or a space-separated string. +# +# Expressions for individual packages should simply switch to array +# syntax when they switch to setting __structuredAttrs = true. +prependToVar() { + local -n nameref="$1" + local useArray type + + if [ -n "$__structuredAttrs" ]; then + useArray=true + else + useArray=false + fi + + # check if variable already exist and if it does then do extra checks + if declare -p "$1" 2> /dev/null | grep -q '^'; then + type="$(declare -p "$1")" + if [[ "$type" =~ "declare -A" ]]; then + echo "prependToVar(): ERROR: trying to use prependToVar on an associative array." >&2 + return 1 + elif [[ "$type" =~ "declare -a" ]]; then + useArray=true + else + useArray=false + fi + fi + + shift + + if $useArray; then + nameref=( "$@" ${nameref+"${nameref[@]}"} ) + else + nameref="$* ${nameref-}" + fi +} + +# Same as above +appendToVar() { + local -n nameref="$1" + local useArray type + + if [ -n "$__structuredAttrs" ]; then + useArray=true + else + useArray=false + fi + + # check if variable already exist and if it does then do extra checks + if declare -p "$1" 2> /dev/null | grep -q '^'; then + type="$(declare -p "$1")" + if [[ "$type" =~ "declare -A" ]]; then + echo "appendToVar(): ERROR: trying to use appendToVar on an associative array, use variable+=([\"X\"]=\"Y\") instead." >&2 + return 1 + elif [[ "$type" =~ "declare -a" ]]; then + useArray=true + else + useArray=false + fi + fi + + shift + + if $useArray; then + nameref=( ${nameref+"${nameref[@]}"} "$@" ) + else + nameref="${nameref-} $*" + fi +} + +# Accumulate into `flagsArray` the flags from the named variables. +# +# If __structuredAttrs, the variables are all treated as arrays +# and simply concatenated onto `flagsArray`. +# +# If not __structuredAttrs, then: +# * Each variable is treated as a string, and split on whitespace; +# * except variables whose names end in "Array", which are treated +# as arrays. +_accumFlagsArray() { + local name + if [ -n "$__structuredAttrs" ]; then + for name in "$@"; do + local -n nameref="$name" + flagsArray+=( ${nameref+"${nameref[@]}"} ) + done + else + for name in "$@"; do + local -n nameref="$name" + case "$name" in + *Array) + flagsArray+=( ${nameref+"${nameref[@]}"} ) ;; + *) + flagsArray+=( ${nameref-} ) ;; + esac + done + fi + +} + +# Add $1/lib* into rpaths. +# The function is used in multiple-outputs.sh hook, +# so it is defined here but tried after the hook. +_addRpathPrefix() { + if [ "${NIX_NO_SELF_RPATH:-0}" != 1 ]; then + export NIX_LDFLAGS="-rpath $1/lib ${NIX_LDFLAGS-}" + fi +} + +# Return success if the specified file is an ELF object. +isELF() { + local fn="$1" + local fd + local magic + exec {fd}< "$fn" + read -r -n 4 -u "$fd" magic + exec {fd}<&- + if [ "$magic" = $'\177ELF' ]; then return 0; else return 1; fi +} + +# Return success if the specified file is a Mach-O object. +isMachO() { + local fn="$1" + local fd + local magic + exec {fd}< "$fn" + read -r -n 4 -u "$fd" magic + exec {fd}<&- + + # nix uses 'declare -F' in get-env.sh to retrieve the loaded functions. + # If we use the $'string' syntax instead of 'echo -ne' then 'declare' will print the raw characters and break nix. + # See https://github.com/NixOS/nixpkgs/pull/138334 and https://github.com/NixOS/nix/issues/5262. + + # https://opensource.apple.com/source/lldb/lldb-310.2.36/examples/python/mach_o.py.auto.html + if [[ "$magic" = $(echo -ne "\xfe\xed\xfa\xcf") || "$magic" = $(echo -ne "\xcf\xfa\xed\xfe") ]]; then + # MH_MAGIC_64 || MH_CIGAM_64 + return 0; + elif [[ "$magic" = $(echo -ne "\xfe\xed\xfa\xce") || "$magic" = $(echo -ne "\xce\xfa\xed\xfe") ]]; then + # MH_MAGIC || MH_CIGAM + return 0; + elif [[ "$magic" = $(echo -ne "\xca\xfe\xba\xbe") || "$magic" = $(echo -ne "\xbe\xba\xfe\xca") ]]; then + # FAT_MAGIC || FAT_CIGAM + return 0; + else + return 1; + fi +} + +# Return success if the specified file is a script (i.e. starts with +# "#!"). +isScript() { + local fn="$1" + local fd + local magic + exec {fd}< "$fn" + read -r -n 2 -u "$fd" magic + exec {fd}<&- + if [[ "$magic" =~ \#! ]]; then return 0; else return 1; fi +} + +# printf unfortunately will print a trailing newline regardless +printLines() { + (( "$#" > 0 )) || return 0 + printf '%s\n' "$@" +} + +printWords() { + (( "$#" > 0 )) || return 0 + printf '%s ' "$@" +} + +###################################################################### +# Initialisation. + +# If using structured attributes, export variables from `env` to the environment. +# When not using structured attributes, those variables are already exported. +if [[ -n $__structuredAttrs ]]; then + for envVar in "${!env[@]}"; do + declare -x "${envVar}=${env[${envVar}]}" + done +fi + + +# Set a fallback default value for SOURCE_DATE_EPOCH, used by some build tools +# to provide a deterministic substitute for the "current" time. Note that +# 315532800 = 1980-01-01 12:00:00. We use this date because python's wheel +# implementation uses zip archive and zip does not support dates going back to +# 1970. +export SOURCE_DATE_EPOCH +: "${SOURCE_DATE_EPOCH:=315532800}" + + +# Wildcard expansions that don't match should expand to an empty list. +# This ensures that, for instance, "for i in *; do ...; done" does the +# right thing. +shopt -s nullglob + + +# Set up the initial path. +PATH= +HOST_PATH= +for i in $initialPath; do + if [ "$i" = / ]; then i=; fi + addToSearchPath PATH "$i/bin" + + # For backward compatibility, we add initial path to HOST_PATH so + # it can be used in auto patch-shebangs. Unfortunately this will + # not work with cross compilation. + if [ -z "${strictDeps-}" ]; then + addToSearchPath HOST_PATH "$i/bin" + fi +done + +unset i + +if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "initial path: $PATH" +fi + + +# Check that the pre-hook initialised SHELL. +if [ -z "${SHELL:-}" ]; then echo "SHELL not set"; exit 1; fi +BASH="$SHELL" +export CONFIG_SHELL="$SHELL" + + +# Execute the pre-hook. +if [ -z "${shell:-}" ]; then export shell="$SHELL"; fi +runHook preHook + + +# Allow the caller to augment buildInputs (it's not always possible to +# do this before the call to setup.sh, since the PATH is empty at that +# point; here we have a basic Unix environment). +runHook addInputsHook + + +# Package accumulators + +declare -a pkgsBuildBuild pkgsBuildHost pkgsBuildTarget +declare -a pkgsHostHost pkgsHostTarget +declare -a pkgsTargetTarget + +declare -a pkgBuildAccumVars=(pkgsBuildBuild pkgsBuildHost pkgsBuildTarget) +declare -a pkgHostAccumVars=(pkgsHostHost pkgsHostTarget) +declare -a pkgTargetAccumVars=(pkgsTargetTarget) + +declare -a pkgAccumVarVars=(pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars) + + +# Hooks + +declare -a envBuildBuildHooks envBuildHostHooks envBuildTargetHooks +declare -a envHostHostHooks envHostTargetHooks +declare -a envTargetTargetHooks + +declare -a pkgBuildHookVars=(envBuildBuildHook envBuildHostHook envBuildTargetHook) +declare -a pkgHostHookVars=(envHostHostHook envHostTargetHook) +declare -a pkgTargetHookVars=(envTargetTargetHook) + +declare -a pkgHookVarVars=(pkgBuildHookVars pkgHostHookVars pkgTargetHookVars) + +# those variables are declared here, since where and if they are used varies +declare -a preFixupHooks fixupOutputHooks preConfigureHooks postFixupHooks postUnpackHooks unpackCmdHooks + +# Add env hooks for all sorts of deps with the specified host offset. +addEnvHooks() { + local depHostOffset="$1" + shift + local pkgHookVarsSlice="${pkgHookVarVars[$depHostOffset + 1]}[@]" + local pkgHookVar + for pkgHookVar in "${!pkgHookVarsSlice}"; do + eval "${pkgHookVar}s"'+=("$@")' + done +} + + +# Propagated dep files + +declare -a propagatedBuildDepFiles=( + propagated-build-build-deps + propagated-native-build-inputs # Legacy name for back-compat + propagated-build-target-deps +) +declare -a propagatedHostDepFiles=( + propagated-host-host-deps + propagated-build-inputs # Legacy name for back-compat +) +declare -a propagatedTargetDepFiles=( + propagated-target-target-deps +) +declare -a propagatedDepFilesVars=( + propagatedBuildDepFiles + propagatedHostDepFiles + propagatedTargetDepFiles +) + +# Platform offsets: build = -1, host = 0, target = 1 +declare -a allPlatOffsets=(-1 0 1) + + +# Mutually-recursively find all build inputs. See the dependency section of the +# stdenv chapter of the Nixpkgs manual for the specification this algorithm +# implements. +findInputs() { + local -r pkg="$1" + local -r hostOffset="$2" + local -r targetOffset="$3" + + # Sanity check + (( hostOffset <= targetOffset )) || exit 1 + + local varVar="${pkgAccumVarVars[hostOffset + 1]}" + local varRef="$varVar[$((targetOffset - hostOffset))]" + local var="${!varRef}" + unset -v varVar varRef + + # TODO(@Ericson2314): Restore using associative array once Darwin + # nix-shell doesn't use impure bash. This should replace the O(n) + # case with an O(1) hash map lookup, assuming bash is implemented + # well :D. + local varSlice="$var[*]" + # ${..-} to hack around old bash empty array problem + case "${!varSlice-}" in + *" $pkg "*) return 0 ;; + esac + unset -v varSlice + + eval "$var"'+=("$pkg")' + + if ! [ -e "$pkg" ]; then + echo "build input $pkg does not exist" >&2 + exit 1 + fi + + # The current package's host and target offset together + # provide a <=-preserving homomorphism from the relative + # offsets to current offset + function mapOffset() { + local -r inputOffset="$1" + local -n outputOffset="$2" + if (( inputOffset <= 0 )); then + outputOffset=$((inputOffset + hostOffset)) + else + outputOffset=$((inputOffset - 1 + targetOffset)) + fi + } + + # Host offset relative to that of the package whose immediate + # dependencies we are currently exploring. + local relHostOffset + for relHostOffset in "${allPlatOffsets[@]}"; do + # `+ 1` so we start at 0 for valid index + local files="${propagatedDepFilesVars[relHostOffset + 1]}" + + # Host offset relative to the package currently being + # built---as absolute an offset as will be used. + local hostOffsetNext + mapOffset "$relHostOffset" hostOffsetNext + + # Ensure we're in bounds relative to the package currently + # being built. + (( -1 <= hostOffsetNext && hostOffsetNext <= 1 )) || continue + + # Target offset relative to the *host* offset of the package + # whose immediate dependencies we are currently exploring. + local relTargetOffset + for relTargetOffset in "${allPlatOffsets[@]}"; do + (( "$relHostOffset" <= "$relTargetOffset" )) || continue + + local fileRef="${files}[$relTargetOffset - $relHostOffset]" + local file="${!fileRef}" + unset -v fileRef + + # Target offset relative to the package currently being + # built. + local targetOffsetNext + mapOffset "$relTargetOffset" targetOffsetNext + + # Once again, ensure we're in bounds relative to the + # package currently being built. + (( -1 <= hostOffsetNext && hostOffsetNext <= 1 )) || continue + + [[ -f "$pkg/nix-support/$file" ]] || continue + + local pkgNext + read -r -d '' pkgNext < "$pkg/nix-support/$file" || true + for pkgNext in $pkgNext; do + findInputs "$pkgNext" "$hostOffsetNext" "$targetOffsetNext" + done + done + done +} + +# The way we handle deps* and *Inputs works with structured attrs +# either enabled or disabled. For this it's convenient that the items +# in each list must be store paths, and therefore space-free. + +# Make sure all are at least defined as empty +: "${depsBuildBuild=}" "${depsBuildBuildPropagated=}" +: "${nativeBuildInputs=}" "${propagatedNativeBuildInputs=}" "${defaultNativeBuildInputs=}" +: "${depsBuildTarget=}" "${depsBuildTargetPropagated=}" +: "${depsHostHost=}" "${depsHostHostPropagated=}" +: "${buildInputs=}" "${propagatedBuildInputs=}" "${defaultBuildInputs=}" +: "${depsTargetTarget=}" "${depsTargetTargetPropagated=}" + +for pkg in ${depsBuildBuild[@]} ${depsBuildBuildPropagated[@]}; do + findInputs "$pkg" -1 -1 +done +for pkg in ${nativeBuildInputs[@]} ${propagatedNativeBuildInputs[@]}; do + findInputs "$pkg" -1 0 +done +for pkg in ${depsBuildTarget[@]} ${depsBuildTargetPropagated[@]}; do + findInputs "$pkg" -1 1 +done +for pkg in ${depsHostHost[@]} ${depsHostHostPropagated[@]}; do + findInputs "$pkg" 0 0 +done +for pkg in ${buildInputs[@]} ${propagatedBuildInputs[@]} ; do + findInputs "$pkg" 0 1 +done +for pkg in ${depsTargetTarget[@]} ${depsTargetTargetPropagated[@]}; do + findInputs "$pkg" 1 1 +done +# Default inputs must be processed last +for pkg in ${defaultNativeBuildInputs[@]}; do + findInputs "$pkg" -1 0 +done +for pkg in ${defaultBuildInputs[@]}; do + findInputs "$pkg" 0 1 +done + +# Add package to the future PATH and run setup hooks +activatePackage() { + local pkg="$1" + local -r hostOffset="$2" + local -r targetOffset="$3" + + # Sanity check + (( hostOffset <= targetOffset )) || exit 1 + + if [ -f "$pkg" ]; then + source "$pkg" + fi + + # Only dependencies whose host platform is guaranteed to match the + # build platform are included here. That would be `depsBuild*`, + # and legacy `nativeBuildInputs`, in general. If we aren't cross + # compiling, however, everything can be put on the PATH. To ease + # the transition, we do include everything in that case. + # + # TODO(@Ericson2314): Don't special-case native compilation + if [[ -z "${strictDeps-}" || "$hostOffset" -le -1 ]]; then + addToSearchPath _PATH "$pkg/bin" + fi + + if (( hostOffset <= -1 )); then + addToSearchPath _XDG_DATA_DIRS "$pkg/share" + fi + + if [[ "$hostOffset" -eq 0 && -d "$pkg/bin" ]]; then + addToSearchPath _HOST_PATH "$pkg/bin" + fi + + if [[ -f "$pkg/nix-support/setup-hook" ]]; then + source "$pkg/nix-support/setup-hook" + fi +} + +_activatePkgs() { + local hostOffset targetOffset + local pkg + + for hostOffset in "${allPlatOffsets[@]}"; do + local pkgsVar="${pkgAccumVarVars[hostOffset + 1]}" + for targetOffset in "${allPlatOffsets[@]}"; do + (( hostOffset <= targetOffset )) || continue + local pkgsRef="${pkgsVar}[$targetOffset - $hostOffset]" + local pkgsSlice="${!pkgsRef}[@]" + for pkg in ${!pkgsSlice+"${!pkgsSlice}"}; do + activatePackage "$pkg" "$hostOffset" "$targetOffset" + done + done + done +} + +# Run the package setup hooks and build _PATH +_activatePkgs + +# Set the relevant environment variables to point to the build inputs +# found above. +# +# These `depOffset`s, beyond indexing the arrays, also tell the env +# hook what sort of dependency (ignoring propagatedness) is being +# passed to the env hook. In a real language, we'd append a closure +# with this information to the relevant env hook array, but bash +# doesn't have closures, so it's easier to just pass this in. +_addToEnv() { + local depHostOffset depTargetOffset + local pkg + + for depHostOffset in "${allPlatOffsets[@]}"; do + local hookVar="${pkgHookVarVars[depHostOffset + 1]}" + local pkgsVar="${pkgAccumVarVars[depHostOffset + 1]}" + for depTargetOffset in "${allPlatOffsets[@]}"; do + (( depHostOffset <= depTargetOffset )) || continue + local hookRef="${hookVar}[$depTargetOffset - $depHostOffset]" + if [[ -z "${strictDeps-}" ]]; then + + # Keep track of which packages we have visited before. + local visitedPkgs="" + + # Apply environment hooks to all packages during native + # compilation to ease the transition. + # + # TODO(@Ericson2314): Don't special-case native compilation + for pkg in \ + "${pkgsBuildBuild[@]}" \ + "${pkgsBuildHost[@]}" \ + "${pkgsBuildTarget[@]}" \ + "${pkgsHostHost[@]}" \ + "${pkgsHostTarget[@]}" \ + "${pkgsTargetTarget[@]}" + do + if [[ "$visitedPkgs" = *"$pkg"* ]]; then + continue + fi + runHook "${!hookRef}" "$pkg" + visitedPkgs+=" $pkg" + done + else + local pkgsRef="${pkgsVar}[$depTargetOffset - $depHostOffset]" + local pkgsSlice="${!pkgsRef}[@]" + for pkg in ${!pkgsSlice+"${!pkgsSlice}"}; do + runHook "${!hookRef}" "$pkg" + done + fi + done + done +} + +# Run the package-specific hooks set by the setup-hook scripts. +_addToEnv + + +# Unset setup-specific declared variables +unset allPlatOffsets +unset pkgBuildAccumVars pkgHostAccumVars pkgTargetAccumVars pkgAccumVarVars +unset pkgBuildHookVars pkgHostHookVars pkgTargetHookVars pkgHookVarVars +unset propagatedDepFilesVars + + +_addRpathPrefix "$out" + + +# Set the TZ (timezone) environment variable, otherwise commands like +# `date' will complain (e.g., `Tue Mar 9 10:01:47 Local time zone must +# be set--see zic manual page 2004'). +export TZ=UTC + + +# Set the prefix. This is generally $out, but it can be overriden, +# for instance if we just want to perform a test build/install to a +# temporary location and write a build report to $out. +if [ -z "${prefix:-}" ]; then + prefix="$out"; +fi + +if [ "${useTempPrefix:-}" = 1 ]; then + prefix="$NIX_BUILD_TOP/tmp_prefix"; +fi + + +PATH="${_PATH-}${_PATH:+${PATH:+:}}$PATH" +HOST_PATH="${_HOST_PATH-}${_HOST_PATH:+${HOST_PATH:+:}}$HOST_PATH" +export XDG_DATA_DIRS="${_XDG_DATA_DIRS-}${_XDG_DATA_DIRS:+${XDG_DATA_DIRS:+:}}${XDG_DATA_DIRS-}" +if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo "final path: $PATH" + echo "final host path: $HOST_PATH" + echo "final data dirs: $XDG_DATA_DIRS" +fi + +unset _PATH +unset _HOST_PATH +unset _XDG_DATA_DIRS + + +# Normalize the NIX_BUILD_CORES variable. The value might be 0, which +# means that we're supposed to try and auto-detect the number of +# available CPU cores at run-time. + +NIX_BUILD_CORES="${NIX_BUILD_CORES:-1}" +if ((NIX_BUILD_CORES <= 0)); then + guess=$(nproc 2>/dev/null || true) + ((NIX_BUILD_CORES = guess <= 0 ? 1 : guess)) +fi +export NIX_BUILD_CORES + + +# Prevent SSL libraries from using certificates in /etc/ssl, unless set explicitly. +# Leave it in impure shells for convenience. +if [[ -z "${NIX_SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]; then + export NIX_SSL_CERT_FILE=/no-cert-file.crt +fi +# Another variant left for compatibility. +if [[ -z "${SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]; then + export SSL_CERT_FILE=/no-cert-file.crt +fi + + +###################################################################### +# Textual substitution functions. + +# only log once, due to max logging limit on hydra +_substituteStream_has_warned_replace_deprecation=false + +substituteStream() { + local var=$1 + local description=$2 + shift 2 + + while (( "$#" )); do + local replace_mode="$1" + case "$1" in + --replace) + # deprecated 2023-11-22 + # this will either get removed, or switch to the behaviour of --replace-fail in the future + if ! "$_substituteStream_has_warned_replace_deprecation"; then + echo "substituteStream(): WARNING: '--replace' is deprecated, use --replace-{fail,warn,quiet}. ($description)" >&2 + _substituteStream_has_warned_replace_deprecation=true + fi + replace_mode='--replace-warn' + ;& + --replace-quiet|--replace-warn|--replace-fail) + pattern="$2" + replacement="$3" + shift 3 + local savedvar + savedvar="${!var}" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' + if [ "$pattern" != "$replacement" ]; then + if [ "${!var}" == "$savedvar" ]; then + if [ "$replace_mode" == --replace-warn ]; then + printf "substituteStream(): WARNING: pattern %q doesn't match anything in %s\n" "$pattern" "$description" >&2 + elif [ "$replace_mode" == --replace-fail ]; then + printf "substituteStream(): ERROR: pattern %q doesn't match anything in %s\n" "$pattern" "$description" >&2 + return 1 + fi + fi + fi + ;; + + --subst-var) + local varName="$2" + shift 2 + # check if the used nix attribute name is a valid bash name + if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then + echo "substituteStream(): ERROR: substitution variables must be valid Bash names, \"$varName\" isn't." >&2 + return 1 + fi + if [ -z ${!varName+x} ]; then + echo "substituteStream(): ERROR: variable \$$varName is unset" >&2 + return 1 + fi + pattern="@$varName@" + replacement="${!varName}" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' + ;; + + --subst-var-by) + pattern="@$2@" + replacement="$3" + eval "$var"'=${'"$var"'//"$pattern"/"$replacement"}' + shift 3 + ;; + + *) + echo "substituteStream(): ERROR: Invalid command line argument: $1" >&2 + return 1 + ;; + esac + done + + printf "%s" "${!var}" +} + +# put the content of a file in a variable +# fail loudly if provided with a binary (containing null bytes) +consumeEntire() { + # read returns non-0 on EOF, so we want read to fail + if IFS='' read -r -d '' "$1" ; then + echo "consumeEntire(): ERROR: Input null bytes, won't process" >&2 + return 1 + fi +} + +substitute() { + local input="$1" + local output="$2" + shift 2 + + if [ ! -f "$input" ]; then + echo "substitute(): ERROR: file '$input' does not exist" >&2 + return 1 + fi + + local content + consumeEntire content < "$input" + + if [ -e "$output" ]; then chmod +w "$output"; fi + substituteStream content "file '$input'" "$@" > "$output" +} + +substituteInPlace() { + local -a fileNames=() + for arg in "$@"; do + if [[ "$arg" = "--"* ]]; then + break + fi + fileNames+=("$arg") + shift + done + + for file in "${fileNames[@]}"; do + substitute "$file" "$file" "$@" + done +} + +_allFlags() { + # export some local variables for the awk below + # so some substitutions such as name don't have to be in the env attrset + # when __structuredAttrs is enabled + export system pname name version + for varName in $(awk 'BEGIN { for (v in ENVIRON) if (v ~ /^[a-z][a-zA-Z0-9_]*$/) print v }'); do + if (( "${NIX_DEBUG:-0}" >= 1 )); then + printf "@%s@ -> %q\n" "${varName}" "${!varName}" >&2 + fi + args+=("--subst-var" "$varName") + done +} + +substituteAllStream() { + local -a args=() + _allFlags + + substituteStream "$1" "$2" "${args[@]}" +} + +# Substitute all environment variables that start with a lowercase character and +# are valid Bash names. +substituteAll() { + local input="$1" + local output="$2" + + local -a args=() + _allFlags + + substitute "$input" "$output" "${args[@]}" +} + + +substituteAllInPlace() { + local fileName="$1" + shift + substituteAll "$fileName" "$fileName" "$@" +} + + +###################################################################### +# What follows is the generic builder. + + +# This function is useful for debugging broken Nix builds. It dumps +# all environment variables to a file `env-vars' in the build +# directory. If the build fails and the `-K' option is used, you can +# then go to the build directory and source in `env-vars' to reproduce +# the environment used for building. +dumpVars() { + if [ "${noDumpEnvVars:-0}" != 1 ]; then + export 2>/dev/null >| "$NIX_BUILD_TOP/env-vars" || true + fi +} + + +# Utility function: echo the base name of the given path, with the +# prefix `HASH-' removed, if present. +stripHash() { + local strippedName casematchOpt=0 + # On separate line for `set -e` + strippedName="$(basename -- "$1")" + shopt -q nocasematch && casematchOpt=1 + shopt -u nocasematch + if [[ "$strippedName" =~ ^[a-z0-9]{32}- ]]; then + echo "${strippedName:33}" + else + echo "$strippedName" + fi + if (( casematchOpt )); then shopt -s nocasematch; fi +} + + +recordPropagatedDependencies() { + # Propagate dependencies into the development output. + declare -ra flatVars=( + # Build + depsBuildBuildPropagated + propagatedNativeBuildInputs + depsBuildTargetPropagated + # Host + depsHostHostPropagated + propagatedBuildInputs + # Target + depsTargetTargetPropagated + ) + declare -ra flatFiles=( + "${propagatedBuildDepFiles[@]}" + "${propagatedHostDepFiles[@]}" + "${propagatedTargetDepFiles[@]}" + ) + + local propagatedInputsIndex + for propagatedInputsIndex in "${!flatVars[@]}"; do + local propagatedInputsSlice="${flatVars[$propagatedInputsIndex]}[@]" + local propagatedInputsFile="${flatFiles[$propagatedInputsIndex]}" + + [[ "${!propagatedInputsSlice}" ]] || continue + + mkdir -p "${!outputDev}/nix-support" + # shellcheck disable=SC2086 + printWords ${!propagatedInputsSlice} > "${!outputDev}/nix-support/$propagatedInputsFile" + done +} + + +unpackCmdHooks+=(_defaultUnpack) +_defaultUnpack() { + local fn="$1" + local destination + + if [ -d "$fn" ]; then + + destination="$(stripHash "$fn")" + + if [ -e "$destination" ]; then + echo "Cannot copy $fn to $destination: destination already exists!" + echo "Did you specify two \"srcs\" with the same \"name\"?" + return 1 + fi + + # We can't preserve hardlinks because they may have been + # introduced by store optimization, which might break things + # in the build. + cp -pr --reflink=auto -- "$fn" "$destination" + + else + + case "$fn" in + *.tar.xz | *.tar.lzma | *.txz) + # Don't rely on tar knowing about .xz. + # Additionally, we have multiple different xz binaries with different feature sets in different + # stages. The XZ_OPT env var is only used by the full "XZ utils" implementation, which supports + # the --threads (-T) flag. This allows us to enable multithreaded decompression exclusively on + # that implementation, without the use of complex bash conditionals and checks. + # Since tar does not control the decompression, we need to + # disregard the error code from the xz invocation. Otherwise, + # it can happen that tar exits earlier, causing xz to fail + # from a SIGPIPE. + (XZ_OPT="--threads=$NIX_BUILD_CORES" xz -d < "$fn"; true) | tar xf - --mode=+w --warning=no-timestamp + ;; + *.tar | *.tar.* | *.tgz | *.tbz2 | *.tbz) + # GNU tar can automatically select the decompression method + # (info "(tar) gzip"). + tar xf "$fn" --mode=+w --warning=no-timestamp + ;; + *) + return 1 + ;; + esac + + fi +} + + +unpackFile() { + curSrc="$1" + echo "unpacking source archive $curSrc" + if ! runOneHook unpackCmd "$curSrc"; then + echo "do not know how to unpack source archive $curSrc" + exit 1 + fi +} + + +unpackPhase() { + runHook preUnpack + + if [ -z "${srcs:-}" ]; then + if [ -z "${src:-}" ]; then + # shellcheck disable=SC2016 + echo 'variable $src or $srcs should point to the source' + exit 1 + fi + srcs="$src" + fi + + local -a srcsArray + if [ -n "$__structuredAttrs" ]; then + srcsArray=( "${srcs[@]}" ) + else + srcsArray=( $srcs ) + fi + + # To determine the source directory created by unpacking the + # source archives, we record the contents of the current + # directory, then look below which directory got added. Yeah, + # it's rather hacky. + local dirsBefore="" + for i in *; do + if [ -d "$i" ]; then + dirsBefore="$dirsBefore $i " + fi + done + + # Unpack all source archives. + for i in "${srcsArray[@]}"; do + unpackFile "$i" + done + + # Find the source directory. + + # set to empty if unset + : "${sourceRoot=}" + + if [ -n "${setSourceRoot:-}" ]; then + runOneHook setSourceRoot + elif [ -z "$sourceRoot" ]; then + for i in *; do + if [ -d "$i" ]; then + case $dirsBefore in + *\ $i\ *) + ;; + *) + if [ -n "$sourceRoot" ]; then + echo "unpacker produced multiple directories" + exit 1 + fi + sourceRoot="$i" + ;; + esac + fi + done + fi + + if [ -z "$sourceRoot" ]; then + echo "unpacker appears to have produced no directories" + exit 1 + fi + + echo "source root is $sourceRoot" + + # By default, add write permission to the sources. This is often + # necessary when sources have been copied from other store + # locations. + if [ "${dontMakeSourcesWritable:-0}" != 1 ]; then + chmod -R u+w -- "$sourceRoot" + fi + + runHook postUnpack +} + + +patchPhase() { + runHook prePatch + + local -a patchesArray + if [ -n "$__structuredAttrs" ]; then + patchesArray=( ${patches:+"${patches[@]}"} ) + else + patchesArray=( ${patches:-} ) + fi + + for i in "${patchesArray[@]}"; do + echo "applying patch $i" + local uncompress=cat + case "$i" in + *.gz) + uncompress="gzip -d" + ;; + *.bz2) + uncompress="bzip2 -d" + ;; + *.xz) + uncompress="xz -d" + ;; + *.lzma) + uncompress="lzma -d" + ;; + esac + + local -a flagsArray + if [ -n "$__structuredAttrs" ]; then + flagsArray=( "${patchFlags[@]:--p1}" ) + else + # shellcheck disable=SC2086 + flagsArray=( ${patchFlags:--p1} ) + fi + # "2>&1" is a hack to make patch fail if the decompressor fails (nonexistent patch, etc.) + # shellcheck disable=SC2086 + $uncompress < "$i" 2>&1 | patch "${flagsArray[@]}" + done + + runHook postPatch +} + + +fixLibtool() { + local search_path + for flag in $NIX_LDFLAGS; do + case $flag in + -L*) + search_path+=" ${flag#-L}" + ;; + esac + done + + sed -i "$1" \ + -e "s^eval \(sys_lib_search_path=\).*^\1'${search_path:-}'^" \ + -e 's^eval sys_lib_.+search_path=.*^^' +} + + +configurePhase() { + runHook preConfigure + + # set to empty if unset + : "${configureScript=}" + + if [[ -z "$configureScript" && -x ./configure ]]; then + configureScript=./configure + fi + + if [ -z "${dontFixLibtool:-}" ]; then + export lt_cv_deplibs_check_method="${lt_cv_deplibs_check_method-pass_all}" + local i + find . -iname "ltmain.sh" -print0 | while IFS='' read -r -d '' i; do + echo "fixing libtool script $i" + fixLibtool "$i" + done + + # replace `/usr/bin/file` with `file` in any `configure` + # scripts with vendored libtool code. Preserve mtimes to + # prevent some packages (e.g. libidn2) from spontaneously + # autoreconf'ing themselves + CONFIGURE_MTIME_REFERENCE=$(mktemp configure.mtime.reference.XXXXXX) + find . \ + -executable \ + -type f \ + -name configure \ + -exec grep -l 'GNU Libtool is free software; you can redistribute it and/or modify' {} \; \ + -exec touch -r {} "$CONFIGURE_MTIME_REFERENCE" \; \ + -exec sed -i s_/usr/bin/file_file_g {} \; \ + -exec touch -r "$CONFIGURE_MTIME_REFERENCE" {} \; + rm -f "$CONFIGURE_MTIME_REFERENCE" + fi + + if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then + prependToVar configureFlags "${prefixKey:---prefix=}$prefix" + fi + + if [[ -f "$configureScript" ]]; then + # Add --disable-dependency-tracking to speed up some builds. + if [ -z "${dontAddDisableDepTrack:-}" ]; then + if grep -q dependency-tracking "$configureScript"; then + prependToVar configureFlags --disable-dependency-tracking + fi + fi + + # By default, disable static builds. + if [ -z "${dontDisableStatic:-}" ]; then + if grep -q enable-static "$configureScript"; then + prependToVar configureFlags --disable-static + fi + fi + + if [ -z "${dontPatchShebangsInConfigure:-}" ]; then + patchShebangs --build "$configureScript" + fi + fi + + if [ -n "$configureScript" ]; then + local -a flagsArray + _accumFlagsArray configureFlags configureFlagsArray + + echoCmd 'configure flags' "${flagsArray[@]}" + # shellcheck disable=SC2086 + $configureScript "${flagsArray[@]}" + unset flagsArray + else + echo "no configure script, doing nothing" + fi + + runHook postConfigure +} + + +buildPhase() { + runHook preBuild + + if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then + echo "no Makefile or custom buildPhase, doing nothing" + else + foundMakefile=1 + + # shellcheck disable=SC2086 + local flagsArray=( + ${enableParallelBuilding:+-j${NIX_BUILD_CORES}} + SHELL=$SHELL + ) + _accumFlagsArray makeFlags makeFlagsArray buildFlags buildFlagsArray + + echoCmd 'build flags' "${flagsArray[@]}" + make ${makefile:+-f $makefile} "${flagsArray[@]}" + unset flagsArray + fi + + runHook postBuild +} + + +checkPhase() { + runHook preCheck + + if [[ -z "${foundMakefile:-}" ]]; then + echo "no Makefile or custom checkPhase, doing nothing" + runHook postCheck + return + fi + + if [[ -z "${checkTarget:-}" ]]; then + #TODO(@oxij): should flagsArray influence make -n? + if make -n ${makefile:+-f $makefile} check >/dev/null 2>&1; then + checkTarget=check + elif make -n ${makefile:+-f $makefile} test >/dev/null 2>&1; then + checkTarget=test + fi + fi + + if [[ -z "${checkTarget:-}" ]]; then + echo "no check/test target in ${makefile:-Makefile}, doing nothing" + else + # Old bash empty array hack + # shellcheck disable=SC2086 + local flagsArray=( + ${enableParallelChecking:+-j${NIX_BUILD_CORES}} + SHELL=$SHELL + ) + + _accumFlagsArray makeFlags makeFlagsArray + if [ -n "$__structuredAttrs" ]; then + flagsArray+=( "${checkFlags[@]:-VERBOSE=y}" ) + else + flagsArray+=( ${checkFlags:-VERBOSE=y} ) + fi + _accumFlagsArray checkFlagsArray + flagsArray+=( ${checkTarget} ) + + echoCmd 'check flags' "${flagsArray[@]}" + make ${makefile:+-f $makefile} "${flagsArray[@]}" + + unset flagsArray + fi + + runHook postCheck +} + + +installPhase() { + runHook preInstall + + # Dont reuse 'foundMakefile' set in buildPhase, a makefile may have been created in buildPhase + if [[ -z "${makeFlags-}" && -z "${makefile:-}" && ! ( -e Makefile || -e makefile || -e GNUmakefile ) ]]; then + echo "no Makefile or custom installPhase, doing nothing" + runHook postInstall + return + else + foundMakefile=1 + fi + + if [ -n "$prefix" ]; then + mkdir -p "$prefix" + fi + + # shellcheck disable=SC2086 + local flagsArray=( + ${enableParallelInstalling:+-j${NIX_BUILD_CORES}} + SHELL=$SHELL + ) + _accumFlagsArray makeFlags makeFlagsArray installFlags installFlagsArray + if [ -n "$__structuredAttrs" ]; then + flagsArray+=( "${installTargets[@]:-install}" ) + else + flagsArray+=( ${installTargets:-install} ) + fi + + echoCmd 'install flags' "${flagsArray[@]}" + make ${makefile:+-f $makefile} "${flagsArray[@]}" + unset flagsArray + + runHook postInstall +} + + +# The fixup phase performs generic, package-independent stuff, like +# stripping binaries, running patchelf and setting +# propagated-build-inputs. +fixupPhase() { + # Make sure everything is writable so "strip" et al. work. + local output + for output in $(getAllOutputNames); do + # for set*id bits see #300635 + if [ -e "${!output}" ]; then chmod -R u+w,u-s,g-s "${!output}"; fi + done + + runHook preFixup + + # Apply fixup to each output. + local output + for output in $(getAllOutputNames); do + prefix="${!output}" runHook fixupOutput + done + + + # record propagated dependencies & setup hook into the development output. + recordPropagatedDependencies + + if [ -n "${setupHook:-}" ]; then + mkdir -p "${!outputDev}/nix-support" + substituteAll "$setupHook" "${!outputDev}/nix-support/setup-hook" + fi + + # TODO(@Ericson2314): Remove after https://github.com/NixOS/nixpkgs/pull/31414 + if [ -n "${setupHooks:-}" ]; then + mkdir -p "${!outputDev}/nix-support" + local hook + # have to use ${setupHooks[@]} without quotes because it needs to support setupHooks being a array or a whitespace separated string + # # values of setupHooks won't have spaces so it won't cause problems + # shellcheck disable=2068 + for hook in ${setupHooks[@]}; do + local content + consumeEntire content < "$hook" + substituteAllStream content "file '$hook'" >> "${!outputDev}/nix-support/setup-hook" + unset -v content + done + unset -v hook + fi + + # Propagate user-env packages into the output with binaries, TODO? + + if [ -n "${propagatedUserEnvPkgs:-}" ]; then + mkdir -p "${!outputBin}/nix-support" + # shellcheck disable=SC2086 + printWords $propagatedUserEnvPkgs > "${!outputBin}/nix-support/propagated-user-env-packages" + fi + + runHook postFixup +} + + +installCheckPhase() { + runHook preInstallCheck + + if [[ -z "${foundMakefile:-}" ]]; then + echo "no Makefile or custom installCheckPhase, doing nothing" + #TODO(@oxij): should flagsArray influence make -n? + elif [[ -z "${installCheckTarget:-}" ]] \ + && ! make -n ${makefile:+-f $makefile} "${installCheckTarget:-installcheck}" >/dev/null 2>&1; then + echo "no installcheck target in ${makefile:-Makefile}, doing nothing" + else + # Old bash empty array hack + # shellcheck disable=SC2086 + local flagsArray=( + ${enableParallelChecking:+-j${NIX_BUILD_CORES}} + SHELL=$SHELL + ) + + _accumFlagsArray makeFlags makeFlagsArray \ + installCheckFlags installCheckFlagsArray + flagsArray+=( ${installCheckTarget:-installcheck} ) + + echoCmd 'installcheck flags' "${flagsArray[@]}" + make ${makefile:+-f $makefile} "${flagsArray[@]}" + unset flagsArray + fi + + runHook postInstallCheck +} + + +distPhase() { + runHook preDist + + local flagsArray=() + _accumFlagsArray distFlags distFlagsArray + flagsArray+=( ${distTarget:-dist} ) + + echo 'dist flags: %q' "${flagsArray[@]}" + make ${makefile:+-f $makefile} "${flagsArray[@]}" + + if [ "${dontCopyDist:-0}" != 1 ]; then + mkdir -p "$out/tarballs" + + # Note: don't quote $tarballs, since we explicitly permit + # wildcards in there. + # shellcheck disable=SC2086 + cp -pvd ${tarballs[*]:-*.tar.gz} "$out/tarballs" + fi + + runHook postDist +} + + +showPhaseHeader() { + local phase="$1" + echo "Running phase: $phase" +} + + +showPhaseFooter() { + local phase="$1" + local startTime="$2" + local endTime="$3" + local delta=$(( endTime - startTime )) + (( delta < 30 )) && return + + local H=$((delta/3600)) + local M=$((delta%3600/60)) + local S=$((delta%60)) + echo -n "$phase completed in " + (( H > 0 )) && echo -n "$H hours " + (( M > 0 )) && echo -n "$M minutes " + echo "$S seconds" +} + + +runPhase() { + local curPhase="$*" + if [[ "$curPhase" = unpackPhase && -n "${dontUnpack:-}" ]]; then return; fi + if [[ "$curPhase" = patchPhase && -n "${dontPatch:-}" ]]; then return; fi + if [[ "$curPhase" = configurePhase && -n "${dontConfigure:-}" ]]; then return; fi + if [[ "$curPhase" = buildPhase && -n "${dontBuild:-}" ]]; then return; fi + if [[ "$curPhase" = checkPhase && -z "${doCheck:-}" ]]; then return; fi + if [[ "$curPhase" = installPhase && -n "${dontInstall:-}" ]]; then return; fi + if [[ "$curPhase" = fixupPhase && -n "${dontFixup:-}" ]]; then return; fi + if [[ "$curPhase" = installCheckPhase && -z "${doInstallCheck:-}" ]]; then return; fi + if [[ "$curPhase" = distPhase && -z "${doDist:-}" ]]; then return; fi + + if [[ -n $NIX_LOG_FD ]]; then + echo "@nix { \"action\": \"setPhase\", \"phase\": \"$curPhase\" }" >&"$NIX_LOG_FD" + fi + + showPhaseHeader "$curPhase" + dumpVars + + local startTime=$(date +"%s") + + # Evaluate the variable named $curPhase if it exists, otherwise the + # function named $curPhase. + eval "${!curPhase:-$curPhase}" + + local endTime=$(date +"%s") + + showPhaseFooter "$curPhase" "$startTime" "$endTime" + + if [ "$curPhase" = unpackPhase ]; then + # make sure we can cd into the directory + [ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}" + + cd "${sourceRoot:-.}" + fi +} + + +genericBuild() { + # variable used by our gzip wrapper to add -n. + # gzip is in common-path.nix and is added to nix-shell but we only want to change its behaviour in nix builds. do not move to a setupHook in gzip. + export GZIP_NO_TIMESTAMPS=1 + + if [ -f "${buildCommandPath:-}" ]; then + source "$buildCommandPath" + return + fi + if [ -n "${buildCommand:-}" ]; then + eval "$buildCommand" + return + fi + + if [ -z "${phases[*]:-}" ]; then + phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \ + configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \ + ${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \ + ${preDistPhases[*]:-} distPhase ${postPhases[*]:-}"; + fi + + # The use of ${phases[*]} gives the correct behavior both with and + # without structured attrs. This relies on the fact that each + # phase name is space-free, which it must be because it's the name + # of either a shell variable or a shell function. + for curPhase in ${phases[*]}; do + runPhase "$curPhase" + done +} + + +# Execute the post-hooks. +runHook postHook + + +# Execute the global user hook (defined through the Nixpkgs +# configuration option ‘stdenv.userHook’). This can be used to set +# global compiler optimisation flags, for instance. +runHook userHook + + +dumpVars + + +# Restore the original options for nix-shell +[[ $__nixpkgs_setup_set_original == *e* ]] || set +e +[[ $__nixpkgs_setup_set_original == *u* ]] || set +u +unset -v __nixpkgs_setup_set_original diff --git a/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-gnu.nix new file mode 100644 index 0000000..6719e7c --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-gnu.nix @@ -0,0 +1,11 @@ +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/aarch64/21ec906463ea8f11abf3f9091ddd4c3276516e58/busybox"; + executable = true; + hash = "sha256-0MuIeQlBUaeisqoFSu8y+8oB6K4ZG5Lhq8RcS9JqkFQ="; + }; + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv-linux/aarch64/21ec906463ea8f11abf3f9091ddd4c3276516e58/bootstrap-tools.tar.xz"; + hash = "sha256-aJvtsWeuQHbb14BGZ2EiOKzjQn46h3x3duuPEawG0eE="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-musl.nix b/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-musl.nix new file mode 100644 index 0000000..c1a96e6 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/aarch64-unknown-linux-musl.nix @@ -0,0 +1,25 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/246470544 +# +# …which used nixpkgs revision dd5621df6dcb90122b50da5ec31c411a0de3e538 +# to instantiate: +# +# /nix/store/g480ass2vjmakaq03z7k2j95xnxh206a-stdenv-bootstrap-tools.drv +# +# …and then built: +# +# /nix/store/95lm0y33dayag4542s8bi83s31bw68dr-stdenv-bootstrap-tools +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv/aarch64-unknown-linux-musl/dd5621df6dcb90122b50da5ec31c411a0de3e538/busybox"; + sha256 = "sha256-WuOaun7U5enbOy8SuuCo6G1fbGwsO16jhy/oM8K0lAs="; + executable = true; + }; + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/aarch64-unknown-linux-musl/dd5621df6dcb90122b50da5ec31c411a0de3e538/bootstrap-tools.tar.xz"; + hash = "sha256-ZY9IMOmx1VOn6uoFDpdJbTnPX59TEkrVCzWNtjQ8/QE="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/armv5tel-unknown-linux-gnueabi.nix b/pkgs/stdenv/linux/bootstrap-files/armv5tel-unknown-linux-gnueabi.nix new file mode 100644 index 0000000..0ac818b --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/armv5tel-unknown-linux-gnueabi.nix @@ -0,0 +1,18 @@ +{ + # Note: do not use Hydra as a source URL. Ask a member of the + # infrastructure team to mirror the job. + busybox = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv5tel.dist/latest + # from build: https://hydra.nixos.org/build/114203025 + url = "http://tarballs.nixos.org/stdenv-linux/armv5tel/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/busybox"; + # note: the following hash is different than the above hash, due to executable = true + sha256 = "0qxp2fsvs4phbc17g9npj9bsm20ylr8myi5pivcrmxm5qqflgi8d"; + executable = true; + }; + bootstrapTools = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv5tel.dist/latest + # from build: https://hydra.nixos.org/build/114203025 + url = "http://tarballs.nixos.org/stdenv-linux/armv5tel/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/bootstrap-tools.tar.xz"; + sha256 = "28327343db5ecc7f7811449ec69280d5867fa5d1d377cab0426beb9d4e059ed6"; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-gnueabihf.nix b/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-gnueabihf.nix new file mode 100644 index 0000000..8bc99c6 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-gnueabihf.nix @@ -0,0 +1,18 @@ +{ + # Note: do not use Hydra as a source URL. Ask a member of the + # infrastructure team to mirror the job. + busybox = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv6l.dist/latest + # from build: https://hydra.nixos.org/build/114202834 + url = "http://tarballs.nixos.org/stdenv-linux/armv6l/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/busybox"; + # note: the following hash is different than the above hash, due to executable = true + sha256 = "1q02537cq56wlaxbz3s3kj5vmh6jbm27jhvga6b4m4jycz5sxxp6"; + executable = true; + }; + bootstrapTools = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv6l.dist/latest + # from build: https://hydra.nixos.org/build/114202834 + url = "http://tarballs.nixos.org/stdenv-linux/armv6l/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/bootstrap-tools.tar.xz"; + sha256 = "0810fe74f8cd09831f177d075bd451a66b71278d3cc8db55b07c5e38ef3fbf3f"; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-musleabihf.nix b/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-musleabihf.nix new file mode 100644 index 0000000..e445a7b --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/armv6l-unknown-linux-musleabihf.nix @@ -0,0 +1,11 @@ +{ + busybox = import { + url = "https://wdtz.org/files/xmz441m69qrlfdw47l2k10zf87fsya6r-stdenv-bootstrap-tools-armv6l-unknown-linux-musleabihf/on-server/busybox"; + sha256 = "01d0hp1xgrriiy9w0sd9vbqzwxnpwiyah80pi4vrpcmbwji36j1i"; + executable = true; + }; + bootstrapTools = import { + url = "https://wdtz.org/files/xmz441m69qrlfdw47l2k10zf87fsya6r-stdenv-bootstrap-tools-armv6l-unknown-linux-musleabihf/on-server/bootstrap-tools.tar.xz"; + sha256 = "1r9mz9w8y5jd7gfwfsrvs20qarzxy7bvrp5dlm41hnx6z617if1h"; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/armv7l-unknown-linux-gnueabihf.nix b/pkgs/stdenv/linux/bootstrap-files/armv7l-unknown-linux-gnueabihf.nix new file mode 100644 index 0000000..74d1584 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/armv7l-unknown-linux-gnueabihf.nix @@ -0,0 +1,18 @@ +{ + # Note: do not use Hydra as a source URL. Ask a member of the + # infrastructure team to mirror the job. + busybox = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv7l.dist/latest + # from build: https://hydra.nixos.org/build/114203060 + url = "http://tarballs.nixos.org/stdenv-linux/armv7l/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/busybox"; + # note: the following hash is different than the above hash, due to executable = true + sha256 = "18qc6w2yykh7nvhjklsqb2zb3fjh4p9r22nvmgj32jr1mjflcsjn"; + executable = true; + }; + bootstrapTools = import { + # from job: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.armv7l.dist/latest + # from build: https://hydra.nixos.org/build/114203060 + url = "http://tarballs.nixos.org/stdenv-linux/armv7l/0eb0ddc4dbe3cd5415c6b6e657538eb809fc3778/bootstrap-tools.tar.xz"; + sha256 = "cf2968e8085cd3e6b3e9359624060ad24d253800ede48c5338179f6e0082c443"; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/i686-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/i686-unknown-linux-gnu.nix new file mode 100644 index 0000000..91709d7 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/i686-unknown-linux-gnu.nix @@ -0,0 +1,21 @@ +# Autogenerated by maintainers/scripts/bootstrap-files/refresh-tarballs.bash as: +# $ ./refresh-tarballs.bash --targets=i686-unknown-linux-gnu +# +# Metadata: +# - nixpkgs revision: 125cefd4cf8f857e5ff1aceaef9230ba578a033d +# - hydra build: https://hydra.nixos.org/job/nixpkgs/trunk/stdenvBootstrapTools.i686-unknown-linux-gnu.build/latest +# - resolved hydra build: https://hydra.nixos.org/build/247889988 +# - instantiated derivation: /nix/store/chcf0brhdyn7ihmb14n0w4rm2a59gqrw-stdenv-bootstrap-tools.drv +# - output directory: /nix/store/5x6dldhza7if5s6wsicaxa8fbndyixps-stdenv-bootstrap-tools +# - build time: Fri, 26 Jan 2024 22:04:03 +0000 +{ + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/i686-unknown-linux-gnu/125cefd4cf8f857e5ff1aceaef9230ba578a033d/bootstrap-tools.tar.xz"; + hash = "sha256-KTAh3t91aJMiMO/7NFOjUz6fXI9Iu+H7cuODreWz9N8="; + }; + busybox = import { + url = "http://tarballs.nixos.org/stdenv/i686-unknown-linux-gnu/125cefd4cf8f857e5ff1aceaef9230ba578a033d/busybox"; + hash = "sha256-omz+ZT0bhMkAZcDs9evA2PNpO6VHUozdtjMgdui6fxw="; + executable = true; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabi64.nix b/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabi64.nix new file mode 100644 index 0000000..452a247 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabi64.nix @@ -0,0 +1,25 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/182757245 +# +# Which used nixpkgs revision ef3fe254f3c59455386bc92fe84164f9679b92b1 +# to instantiate: +# +# /nix/store/a2bvv663wjnyhq8m7v84aspsd3sgf9h6-stdenv-bootstrap-tools-mips64el-unknown-linux-gnuabi64.drv +# +# and then built: +# +# /nix/store/aw3dmsrh22831l83vi3q9apg9qi3x8ms-stdenv-bootstrap-tools-mips64el-unknown-linux-gnuabi64 +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/mips64el/ef3fe254f3c59455386bc92fe84164f9679b92b1/busybox"; + sha256 = "sha256-sTE58ofjqAqX3Xtq1g9wDxzIe6Vo//GHbicfqJoivDI="; + executable = true; + }; + bootstrapTools =import { + url = "http://tarballs.nixos.org/stdenv-linux/mips64el/ef3fe254f3c59455386bc92fe84164f9679b92b1/bootstrap-tools.tar.xz"; + sha256 = "sha256-tTgjeXpd2YgnfP4JvRuO0bXd2j8GqzBcd57JI3wH9x0="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabin32.nix b/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabin32.nix new file mode 100644 index 0000000..cf26c21 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/mips64el-unknown-linux-gnuabin32.nix @@ -0,0 +1,25 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/188389586 +# +# Which used nixpkgs revision 97d9c84e1df4397b43ecb39359f1bd003cd44585 +# to instantiate: +# +# /nix/store/hakn8s85s9011v61r6svp5qy8x1y64fv-stdenv-bootstrap-tools-mips64el-unknown-linux-gnuabin32.drv +# +# and then built: +# +# /nix/store/rjgybpnf3yiqyhvl2n2lx31jf800fii2-stdenv-bootstrap-tools-mips64el-unknown-linux-gnuabin32 +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/mips64el-n32/97d9c84e1df4397b43ecb39359f1bd003cd44585/busybox"; + sha256 = "sha256-4N3G1qYA7vitjhsIW17pR6UixIuzrq4vZXa8F0/X4iI="; + executable = true; + }; + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv-linux/mips64el-n32/97d9c84e1df4397b43ecb39359f1bd003cd44585/bootstrap-tools.tar.xz"; + sha256 = "sha256-LWrpN6su2yNVurUyhZP34OiZyzgh7MfN13fIIbou8KI="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/mipsel-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/mipsel-unknown-linux-gnu.nix new file mode 100644 index 0000000..42f2e87 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/mipsel-unknown-linux-gnu.nix @@ -0,0 +1,25 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/185311909 +# +# Which used nixpkgs revision 5bd14b3cfe2f87a2e2b074645aba39c69563e4bc +# to instantiate: +# +# /nix/store/184fa520zv8ls9fzcqyfa5dmkp8kf6xr-stdenv-bootstrap-tools-mipsel-unknown-linux-gnu.drv +# +# and then built: +# +# /nix/store/i46mrzinxi9a5incliwhksmk947ff4wn-stdenv-bootstrap-tools-mipsel-unknown-linux-gnu +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/mipsel/5bd14b3cfe2f87a2e2b074645aba39c69563e4bc/busybox"; + hash = "sha256-EhuzjL52VEIOfEcFdVGZaDMClQbMc9V9ISrTUNaA7HQ="; + executable = true; + }; + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv-linux/mipsel/5bd14b3cfe2f87a2e2b074645aba39c69563e4bc/bootstrap-tools.tar.xz"; + hash = "sha256-OEGgLJOLnV+aobsb+P8mY3Dp8qbeVODBH6x3aUE/MGM="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/powerpc64-unknown-linux-gnuabielfv2.nix b/pkgs/stdenv/linux/bootstrap-files/powerpc64-unknown-linux-gnuabielfv2.nix new file mode 100644 index 0000000..ac7c948 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/powerpc64-unknown-linux-gnuabielfv2.nix @@ -0,0 +1,21 @@ +# Autogenerated by maintainers/scripts/bootstrap-files/refresh-tarballs.bash as: +# $ ./refresh-tarballs.bash --targets=powerpc64-unknown-linux-gnuabielfv2 +# +# Metadata: +# - nixpkgs revision: 57cf2e0b24fb52344cc718913eaed78f389b1319 +# - hydra build: https://hydra.nixos.org/job/nixpkgs/cross-trunk/bootstrapTools.powerpc64-unknown-linux-gnuabielfv2.build/latest +# - resolved hydra build: https://hydra.nixos.org/build/252872323 +# - instantiated derivation: /nix/store/yaa735jz1r1n863gzv3c8szl77lsgg8d-stdenv-bootstrap-tools-powerpc64-unknown-linux-gnuabielfv2.drv +# - output directory: /nix/store/8frm8kk8gzpv31r289ai5jgkwfikmpm4-stdenv-bootstrap-tools-powerpc64-unknown-linux-gnuabielfv2 +# - build time: Sat, 09 Mar 2024 11:26:00 +0000 +{ + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/powerpc64-unknown-linux-gnuabielfv2/57cf2e0b24fb52344cc718913eaed78f389b1319/bootstrap-tools.tar.xz"; + hash = "sha256-CvMRR2tUs5nzAkuS6cUYNjrNKxX3E+g9C7T7P48m2Ys="; + }; + busybox = import { + url = "http://tarballs.nixos.org/stdenv/powerpc64-unknown-linux-gnuabielfv2/57cf2e0b24fb52344cc718913eaed78f389b1319/busybox"; + hash = "sha256-+vnQrVBHg793JIdQR4Y9KuqdmNZ+Ic0FZvVqrPOKnOY="; + executable = true; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/powerpc64le-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/powerpc64le-unknown-linux-gnu.nix new file mode 100644 index 0000000..c35cb9b --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/powerpc64le-unknown-linux-gnu.nix @@ -0,0 +1,25 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/186237511 +# +# Which used nixpkgs revision ac43c444780a80e789fd14fe2114acd4a3b5cf9d +# to instantiate: +# +# /nix/store/nhjbza9vlcyhp9zxfz6lwpc3m2ghrpzj-stdenv-bootstrap-tools-powerpc64le-unknown-linux-gnu.drv +# +# and then built: +# +# /nix/store/fklpm7fy6cp5wz55w0gd8wakyqvzapjx-stdenv-bootstrap-tools-powerpc64le-unknown-linux-gnu +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/powerpc64le/ac43c444780a80e789fd14fe2114acd4a3b5cf9d/busybox"; + sha256 = "sha256-jtPEAsht4AUAG4MLK8xocQSfveUR4ppU1lS4bGI1VN4="; + executable = true; + }; + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv-linux/powerpc64le/ac43c444780a80e789fd14fe2114acd4a3b5cf9d/bootstrap-tools.tar.xz"; + sha256 = "sha256-MpIDnpZUK3M17qlnuoxfnK0EgxRosm3TMW1WfPZ1+jU="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/riscv64-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/riscv64-unknown-linux-gnu.nix new file mode 100644 index 0000000..2a3bf37 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/riscv64-unknown-linux-gnu.nix @@ -0,0 +1,26 @@ +# +# Files came from this Hydra build: +# +# https://hydra.nixos.org/build/246376732 +# +# Which used nixpkgs revision 160cedc144aced7a35a91440b46b74ffacd52682 +# to instantiate: +# +# /nix/store/cpiajh4l83b08pynwiwkpxj53d78pcxr-stdenv-bootstrap-tools-riscv64-unknown-linux-gnu.drv +# +# and then built: +# +# /nix/store/8a92pj40awdw585mcb9dvm4nyb03k3q3-stdenv-bootstrap-tools-riscv64-unknown-linux-gnu +# +{ + busybox = import { + url = "http://tarballs.nixos.org/stdenv-linux/riscv64/160cedc144aced7a35a91440b46b74ffacd52682/busybox"; + sha256 = "sha256-OGO96QUzs2n5pGipn/V87AxzUY9OWKZl417nE8HdZIE="; + executable = true; + }; + + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv-linux/riscv64/160cedc144aced7a35a91440b46b74ffacd52682/bootstrap-tools.tar.xz"; + sha256 = "sha256-0LxRd7fdafQezNJ+N2tuOfm0KEwgfRSts5fhP0e0r0s="; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-gnu.nix b/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-gnu.nix new file mode 100644 index 0000000..1220397 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-gnu.nix @@ -0,0 +1,21 @@ +# Autogenerated by maintainers/scripts/bootstrap-files/refresh-tarballs.bash as: +# $ ./refresh-tarballs.bash --targets=x86_64-unknown-linux-gnu +# +# Metadata: +# - nixpkgs revision: 82b583ba2ba2e5706b35dbe23f31362e62be2a9d +# - hydra build: https://hydra.nixos.org/job/nixpkgs/trunk/stdenvBootstrapTools.x86_64-unknown-linux-gnu.build/latest +# - resolved hydra build: https://hydra.nixos.org/build/249165517 +# - instantiated derivation: /nix/store/7g8mrv13mi4zrx66fw0hy4c46j752wfd-stdenv-bootstrap-tools.drv +# - output directory: /nix/store/dw6vr6m5w7ysrdrbs0s5wdgbjmbnr7gx-stdenv-bootstrap-tools +# - build time: Sat, 10 Feb 2024 01:29:55 +0000 +{ + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-unknown-linux-gnu/82b583ba2ba2e5706b35dbe23f31362e62be2a9d/bootstrap-tools.tar.xz"; + hash = "sha256-YQlr088HPoVWBU2jpPhpIMyOyoEDZYDw1y60SGGbUM0="; + }; + busybox = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-unknown-linux-gnu/82b583ba2ba2e5706b35dbe23f31362e62be2a9d/busybox"; + hash = "sha256-QrTEnQTBM1Y/qV9odq8irZkQSD9uOMbs2Q5NgCvKCNQ="; + executable = true; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-musl.nix b/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-musl.nix new file mode 100644 index 0000000..283b12b --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-files/x86_64-unknown-linux-musl.nix @@ -0,0 +1,21 @@ +# Autogenerated by maintainers/scripts/bootstrap-files/refresh-tarballs.bash as: +# $ ./refresh-tarballs.bash --targets=x86_64-unknown-linux-musl +# +# Metadata: +# - nixpkgs revision: 125cefd4cf8f857e5ff1aceaef9230ba578a033d +# - hydra build: https://hydra.nixos.org/job/nixpkgs/trunk/stdenvBootstrapTools.x86_64-unknown-linux-musl.build/latest +# - resolved hydra build: https://hydra.nixos.org/build/247890807 +# - instantiated derivation: /nix/store/gqri9n85rsf2983r6m8lkz0h69k4n7xi-stdenv-bootstrap-tools.drv +# - output directory: /nix/store/b0x0qcbf1gsp50jzw52sbbgdp3jlwcjf-stdenv-bootstrap-tools +# - build time: Fri, 26 Jan 2024 22:09:22 +0000 +{ + bootstrapTools = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-unknown-linux-musl/125cefd4cf8f857e5ff1aceaef9230ba578a033d/bootstrap-tools.tar.xz"; + hash = "sha256-t0W2MR7UwtPyYEGcRo9UOuXfaP4uUZKZXEmYGcBOuOA="; + }; + busybox = import { + url = "http://tarballs.nixos.org/stdenv/x86_64-unknown-linux-musl/125cefd4cf8f857e5ff1aceaef9230ba578a033d/busybox"; + hash = "sha256-0U2r3EU61oqhs+oyzFABIFTCVqXOWSP0qEtnyHwjzm0="; + executable = true; + }; +} diff --git a/pkgs/stdenv/linux/bootstrap-tools-musl/default.nix b/pkgs/stdenv/linux/bootstrap-tools-musl/default.nix new file mode 100644 index 0000000..6d2490a --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-tools-musl/default.nix @@ -0,0 +1,19 @@ +{ system, bootstrapFiles, extraAttrs }: + +derivation ({ + name = "bootstrap-tools"; + + builder = bootstrapFiles.busybox; + + args = [ "ash" "-e" ./scripts/unpack-bootstrap-tools.sh ]; + + tarball = bootstrapFiles.bootstrapTools; + + inherit system; + + # Needed by the GCC wrapper. + langC = true; + langCC = true; + isGNU = true; + hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" "trivialautovarinit" ]; +} // extraAttrs) diff --git a/pkgs/stdenv/linux/bootstrap-tools-musl/scripts/unpack-bootstrap-tools.sh b/pkgs/stdenv/linux/bootstrap-tools-musl/scripts/unpack-bootstrap-tools.sh new file mode 100644 index 0000000..b160a74 --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-tools-musl/scripts/unpack-bootstrap-tools.sh @@ -0,0 +1,64 @@ +# Unpack the bootstrap tools tarball. +echo Unpacking the bootstrap tools... +$builder mkdir $out +< $tarball $builder unxz | $builder tar x -C $out + +# Set the ELF interpreter / RPATH in the bootstrap binaries. +echo Patching the bootstrap tools... + +if test -f $out/lib/ld.so.?; then + # MIPS case + LD_BINARY=$out/lib/ld.so.? +else + # i686, x86_64 and armv5tel + LD_BINARY=$out/lib/ld-*so.? +fi + +# On x86_64, ld-linux-x86-64.so.2 barfs on patchelf'ed programs. So +# use a copy of patchelf. +LD_LIBRARY_PATH=$out/lib $LD_BINARY $out/bin/cp $out/bin/patchelf . + +for i in $out/bin/* $out/libexec/gcc/*/*/*; do + if [ -L "$i" ]; then continue; fi + if [ -z "${i##*/liblto*}" ]; then continue; fi + echo patching "$i" + LD_LIBRARY_PATH=$out/lib $LD_BINARY \ + ./patchelf --set-interpreter $LD_BINARY --set-rpath $out/lib --force-rpath "$i" +done + +for i in $out/lib/libpcre* $out/lib/libc.so; do + if [ -L "$i" ]; then continue; fi + echo patching "$i" + $out/bin/patchelf --set-rpath $out/lib --force-rpath "$i" +done + +export PATH=$out/bin + +# Fix the libc linker script. +#cat $out/lib/libc.so | sed "s|/nix/store/e*-[^/]*/|$out/|g" > $out/lib/libc.so.tmp +#mv $out/lib/libc.so.tmp $out/lib/libc.so +#cat $out/lib/libpthread.so | sed "s|/nix/store/e*-[^/]*/|$out/|g" > $out/lib/libpthread.so.tmp +#mv $out/lib/libpthread.so.tmp $out/lib/libpthread.so + +# Provide some additional symlinks. +ln -s bash $out/bin/sh +ln -s bzip2 $out/bin/bunzip2 + +# Provide a gunzip script. +cat > $out/bin/gunzip < $out/bin/egrep +echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep +echo "#! $out/bin/sh" > $out/bin/fgrep +echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep + +# Provide xz (actually only xz -d will work). +echo "#! $out/bin/sh" > $out/bin/xz +echo "exec $builder unxz \"\$@\"" >> $out/bin/xz + +chmod +x $out/bin/egrep $out/bin/fgrep $out/bin/xz diff --git a/pkgs/stdenv/linux/bootstrap-tools/default.nix b/pkgs/stdenv/linux/bootstrap-tools/default.nix new file mode 100644 index 0000000..6d2490a --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-tools/default.nix @@ -0,0 +1,19 @@ +{ system, bootstrapFiles, extraAttrs }: + +derivation ({ + name = "bootstrap-tools"; + + builder = bootstrapFiles.busybox; + + args = [ "ash" "-e" ./scripts/unpack-bootstrap-tools.sh ]; + + tarball = bootstrapFiles.bootstrapTools; + + inherit system; + + # Needed by the GCC wrapper. + langC = true; + langCC = true; + isGNU = true; + hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" "trivialautovarinit" ]; +} // extraAttrs) diff --git a/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh b/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh new file mode 100644 index 0000000..09bf25f --- /dev/null +++ b/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh @@ -0,0 +1,77 @@ +# Unpack the bootstrap tools tarball. +echo Unpacking the bootstrap tools... +$builder mkdir $out +< $tarball $builder unxz | $builder tar x -C $out + +# Set the ELF interpreter / RPATH in the bootstrap binaries. +echo Patching the bootstrap tools... + +if test -f $out/lib/ld.so.?; then + # MIPS case + LD_BINARY=$out/lib/ld.so.? +elif test -f $out/lib/ld64.so.?; then + # ppc64(le) + LD_BINARY=$out/lib/ld64.so.? +else + # i686, x86_64 and armv5tel + LD_BINARY=$out/lib/ld-*so.? +fi + +# path to version-specific libraries, like libstdc++.so +LIBSTDCXX_SO_DIR=$(echo $out/lib/gcc/*/*) + +# Move version-specific libraries out to avoid library mix when we +# upgrade gcc. +# TODO(trofi): update bootstrap tarball script and tarballs to put them +# into expected location directly. +LD_LIBRARY_PATH=$out/lib $LD_BINARY $out/bin/mv $out/lib/libstdc++.* $LIBSTDCXX_SO_DIR/ + +# On x86_64, ld-linux-x86-64.so.2 barfs on patchelf'ed programs. So +# use a copy of patchelf. +LD_LIBRARY_PATH=$out/lib $LD_BINARY $out/bin/cp $out/bin/patchelf . + +# Older versions of the bootstrap-files did not compile their +# patchelf with -static-libgcc, so we have to be very careful not to +# run patchelf on the same copy of libgcc_s that it links against. +LD_LIBRARY_PATH=$out/lib $LD_BINARY $out/bin/cp $out/lib/libgcc_s.so.1 . +LD_LIBRARY_PATH=.:$out/lib:$LIBSTDCXX_SO_DIR $LD_BINARY \ + ./patchelf --set-rpath $out/lib --force-rpath $out/lib/libgcc_s.so.1 + +for i in $out/bin/* $out/libexec/gcc/*/*/*; do + if [ -L "$i" ]; then continue; fi + if [ -z "${i##*/liblto*}" ]; then continue; fi + echo patching "$i" + LD_LIBRARY_PATH=$out/lib:$LIBSTDCXX_SO_DIR $LD_BINARY \ + ./patchelf --set-interpreter $LD_BINARY --set-rpath $out/lib:$LIBSTDCXX_SO_DIR --force-rpath "$i" +done + +for i in $out/lib/librt-*.so $out/lib/libpcre*; do + if [ -L "$i" ]; then continue; fi + echo patching "$i" + $out/bin/patchelf --set-rpath $out/lib --force-rpath "$i" +done + +export PATH=$out/bin + +# Provide some additional symlinks. +ln -s bash $out/bin/sh +ln -s bzip2 $out/bin/bunzip2 + +# Provide a gunzip script. +cat > $out/bin/gunzip < $out/bin/egrep +echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep +echo "#! $out/bin/sh" > $out/bin/fgrep +echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep + +# Provide xz (actually only xz -d will work). +echo "#! $out/bin/sh" > $out/bin/xz +echo "exec $builder unxz \"\$@\"" >> $out/bin/xz + +chmod +x $out/bin/egrep $out/bin/fgrep $out/bin/xz diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix new file mode 100644 index 0000000..ec19b10 --- /dev/null +++ b/pkgs/stdenv/linux/default.nix @@ -0,0 +1,699 @@ +# This file constructs the standard build environment for the +# Linux platform. It's completely pure; that is, it relies on no +# external (non-Nix) tools, such as /usr/bin/gcc, and it contains a C +# compiler and linker that do not search in default locations, +# ensuring purity of components produced by it. +# +# It starts from prebuilt seed bootstrapFiles and creates a series of +# nixpkgs instances (stages) to gradually rebuild stdenv, which +# is used to build all other packages (including the bootstrapFiles). +# +# Goals of the bootstrap process: +# 1. final stdenv must not reference any of the bootstrap files. +# 2. final stdenv must not contain any of the bootstrap files. +# 3. final stdenv must not contain any of the files directly +# generated by the bootstrap code generators (assembler, linker, +# compiler). +# +# These goals ensure that final packages and final stdenv are built +# exclusively using nixpkgs package definitions and don't depend +# on bootstrapTools (via direct references, inclusion +# of copied code, or code compiled directly by bootstrapTools). +# +# Stages are described below along with their definitions. +# +# Debugging stdenv dependency graph: +# An useful tool to explore dependencies across stages is to use +# '__bootPackages' attribute of 'stdenv. Examples of last 3 stages: +# - stdenv +# - stdenv.__bootPackages.stdenv +# - stdenv.__bootPackages.stdenv.__bootPackages.stdenv +# - ... and so on. +# +# To explore build-time dependencies in graphical form one can use +# the following: +# $ nix-store --query --graph $(nix-instantiate -A stdenv) | +# grep -P -v '[.]sh|[.]patch|bash|[.]tar' | # avoid clutter +# dot -Tsvg > stdenv-final.svg +# +# To find all the packages built by a particular stdenv instance: +# $ for stage in 0 1 2 3 4; do +# echo "stage${stage} used in:" +# nix-store --query --graph $(nix-instantiate -A stdenv) | +# grep -P ".*bootstrap-stage${stage}-stdenv.*->.*" | +# sed 's/"[0-9a-z]\{32\}-/"/g' +# done +# +# To verify which stdenv was used to build a given final package: +# $ nix-store --query --graph $(nix-instantiate -A stdenv) | +# grep -P -v '[.]sh|[.]patch|bash|[.]tar' | +# grep -P '.*stdenv.*->.*glibc-2' +# "...-bootstrap-stage2-stdenv-linux.drv" -> "...-glibc-2.35-224.drv"; +# +# For a TUI (rather than CLI) view, you can use: +# +# $ nix-tree --derivation $(nix-instantiate -A stdenv) +{ lib +, localSystem, crossSystem, config, overlays, crossOverlays ? [] + +, bootstrapFiles ? + let table = { + glibc = { + i686-linux = import ./bootstrap-files/i686-unknown-linux-gnu.nix; + x86_64-linux = import ./bootstrap-files/x86_64-unknown-linux-gnu.nix; + armv5tel-linux = import ./bootstrap-files/armv5tel-unknown-linux-gnueabi.nix; + armv6l-linux = import ./bootstrap-files/armv6l-unknown-linux-gnueabihf.nix; + armv7l-linux = import ./bootstrap-files/armv7l-unknown-linux-gnueabihf.nix; + aarch64-linux = import ./bootstrap-files/aarch64-unknown-linux-gnu.nix; + mipsel-linux = import ./bootstrap-files/mipsel-unknown-linux-gnu.nix; + mips64el-linux = import + (if localSystem.isMips64n32 + then ./bootstrap-files/mips64el-unknown-linux-gnuabin32.nix + else ./bootstrap-files/mips64el-unknown-linux-gnuabi64.nix); + powerpc64-linux = import ./bootstrap-files/powerpc64-unknown-linux-gnuabielfv2.nix; + powerpc64le-linux = import ./bootstrap-files/powerpc64le-unknown-linux-gnu.nix; + riscv64-linux = import ./bootstrap-files/riscv64-unknown-linux-gnu.nix; + }; + musl = { + aarch64-linux = import ./bootstrap-files/aarch64-unknown-linux-musl.nix; + armv6l-linux = import ./bootstrap-files/armv6l-unknown-linux-musleabihf.nix; + x86_64-linux = import ./bootstrap-files/x86_64-unknown-linux-musl.nix; + }; + }; + + # Try to find an architecture compatible with our current system. We + # just try every bootstrap we’ve got and test to see if it is + # compatible with or current architecture. + getCompatibleTools = lib.foldl (v: system: + if v != null then v + else if localSystem.canExecute (lib.systems.elaborate { inherit system; }) then archLookupTable.${system} + else null) null (lib.attrNames archLookupTable); + + archLookupTable = table.${localSystem.libc} + or (throw "unsupported libc for the pure Linux stdenv"); + files = archLookupTable.${localSystem.system} or (if getCompatibleTools != null then getCompatibleTools + else (throw "unsupported platform for the pure Linux stdenv")); + in files +}: + +assert crossSystem == localSystem; + +let + inherit (localSystem) system; + + isFromNixpkgs = pkg: !(isFromBootstrapFiles pkg); + isFromBootstrapFiles = + pkg: pkg.passthru.isFromBootstrapFiles or false; + isBuiltByNixpkgsCompiler = + pkg: isFromNixpkgs pkg && isFromNixpkgs pkg.stdenv.cc.cc; + isBuiltByBootstrapFilesCompiler = + pkg: isFromNixpkgs pkg && isFromBootstrapFiles pkg.stdenv.cc.cc; + + commonGccOverrides = { + # Use a deterministically built compiler + # see https://github.com/NixOS/nixpkgs/issues/108475 for context + reproducibleBuild = true; + profiledCompiler = false; + + # It appears that libcc1 (which is not a g++ plugin; it is a gdb plugin) gets linked against + # the libstdc++ from the compiler that *built* g++, not the libstdc++ which was just built. + # This causes a reference chain from stdenv to the bootstrapFiles: + # + # stdenv -> gcc-lib -> xgcc-lib -> bootstrapFiles + # + disableGdbPlugin = true; + }; + + commonPreHook = + '' + export NIX_ENFORCE_PURITY="''${NIX_ENFORCE_PURITY-1}" + export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}" + ''; + + + # The bootstrap process proceeds in several steps. + + + # Create a standard environment by downloading pre-built binaries of + # coreutils, GCC, etc. + + + # Download and unpack the bootstrap tools (coreutils, GCC, Glibc, ...). + bootstrapTools = (import (if localSystem.libc == "musl" then ./bootstrap-tools-musl else ./bootstrap-tools) { + inherit system bootstrapFiles; + extraAttrs = lib.optionalAttrs config.contentAddressedByDefault { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }; + }) // { passthru.isFromBootstrapFiles = true; }; + + getLibc = stage: stage.${localSystem.libc}; + + + # This function builds the various standard environments used during + # the bootstrap. In all stages, we build an stdenv and the package + # set that can be built with that stdenv. + stageFun = prevStage: + { name, overrides ? (self: super: {}), extraNativeBuildInputs ? [] }: + + let + + thisStdenv = import ../generic { + name = "${name}-stdenv-linux"; + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + inherit config extraNativeBuildInputs; + preHook = + '' + # Don't patch #!/interpreter because it leads to retained + # dependencies on the bootstrapTools in the final stdenv. + dontPatchShebangs=1 + ${commonPreHook} + ''; + shell = "${bootstrapTools}/bin/bash"; + initialPath = [bootstrapTools]; + + fetchurlBoot = import ../../build-support/fetchurl/boot.nix { + inherit system; + }; + + cc = if prevStage.gcc-unwrapped == null + then null + else (lib.makeOverridable (import ../../build-support/cc-wrapper) { + name = "${name}-gcc-wrapper"; + nativeTools = false; + nativeLibc = false; + expand-response-params = lib.optionalString + (prevStage.stdenv.hasCC or false && prevStage.stdenv.cc != "/dev/null") + prevStage.expand-response-params; + cc = prevStage.gcc-unwrapped; + bintools = prevStage.binutils; + isGNU = true; + libc = getLibc prevStage; + inherit lib; + inherit (prevStage) coreutils gnugrep; + stdenvNoCC = prevStage.ccWrapperStdenv; + fortify-headers = prevStage.fortify-headers; + runtimeShell = prevStage.ccWrapperStdenv.shell; + }).overrideAttrs(a: lib.optionalAttrs (prevStage.gcc-unwrapped.passthru.isXgcc or false) { + # This affects only `xgcc` (the compiler which compiles the final compiler). + postFixup = (a.postFixup or "") + '' + echo "--sysroot=${lib.getDev (getLibc prevStage)}" >> $out/nix-support/cc-cflags + ''; + }); + + overrides = self: super: (overrides self super) // { fetchurl = thisStdenv.fetchurlBoot; }; + }; + + in { + inherit config overlays; + stdenv = thisStdenv; + }; + +in + assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check +[ + + ({}: { + __raw = true; + + gcc-unwrapped = null; + binutils = null; + coreutils = null; + gnugrep = null; + }) + + # Build a dummy stdenv with no GCC or working fetchurl. This is + # because we need a stdenv to build the GCC wrapper and fetchurl. + (prevStage: stageFun prevStage { + name = "bootstrap-stage0"; + + overrides = self: super: { + # We thread stage0's stdenv through under this name so downstream stages + # can use it for wrapping gcc too. This way, downstream stages don't need + # to refer to this stage directly, which violates the principle that each + # stage should only access the stage that came before it. + ccWrapperStdenv = self.stdenv; + # The Glibc include directory cannot have the same prefix as the + # GCC include directory, since GCC gets confused otherwise (it + # will search the Glibc headers before the GCC headers). So + # create a dummy Glibc here, which will be used in the stdenv of + # stage1. + ${localSystem.libc} = self.stdenv.mkDerivation { + pname = "bootstrap-stage0-${localSystem.libc}"; + strictDeps = true; + version = "bootstrapFiles"; + enableParallelBuilding = true; + buildCommand = '' + mkdir -p $out + ln -s ${bootstrapTools}/lib $out/lib + '' + lib.optionalString (localSystem.libc == "glibc") '' + ln -s ${bootstrapTools}/include-glibc $out/include + '' + lib.optionalString (localSystem.libc == "musl") '' + ln -s ${bootstrapTools}/include-libc $out/include + ''; + passthru.isFromBootstrapFiles = true; + }; + gcc-unwrapped = bootstrapTools; + binutils = import ../../build-support/bintools-wrapper { + name = "bootstrap-stage0-binutils-wrapper"; + nativeTools = false; + nativeLibc = false; + expand-response-params = ""; + libc = getLibc self; + inherit lib; + inherit (self) stdenvNoCC coreutils gnugrep; + bintools = bootstrapTools; + runtimeShell = "${bootstrapTools}/bin/bash"; + }; + coreutils = bootstrapTools; + gnugrep = bootstrapTools; + }; + }) + + + # Create the first "real" standard environment. This one consists + # of bootstrap tools only, and a minimal Glibc to keep the GCC + # configure script happy. + # + # For clarity, we only use the previous stage when specifying these + # stages. So stageN should only ever have references for stage{N-1}. + # + # If we ever need to use a package from more than one stage back, we + # simply re-export those packages in the middle stage(s) using the + # overrides attribute and the inherit syntax. + (prevStage: + # previous stage0 stdenv: + assert isFromBootstrapFiles prevStage.binutils.bintools; + assert isFromBootstrapFiles prevStage."${localSystem.libc}"; + assert isFromBootstrapFiles prevStage.gcc-unwrapped; + assert isFromBootstrapFiles prevStage.coreutils; + assert isFromBootstrapFiles prevStage.gnugrep; + stageFun prevStage { + name = "bootstrap-stage1"; + + # Rebuild binutils to use from stage2 onwards. + overrides = self: super: { + binutils-unwrapped = super.binutils-unwrapped.override { + enableGold = false; + }; + inherit (prevStage) + ccWrapperStdenv + gcc-unwrapped coreutils gnugrep binutils; + + ${localSystem.libc} = getLibc prevStage; + + # A threaded perl build needs glibc/libpthread_nonshared.a, + # which is not included in bootstrapTools, so disable threading. + # This is not an issue for the final stdenv, because this perl + # won't be included in the final stdenv and won't be exported to + # top-level pkgs as an override either. + perl = super.perl.override { enableThreading = false; enableCrypt = false; }; + }; + + # `gettext` comes with obsolete config.sub/config.guess that don't recognize LoongArch64. + extraNativeBuildInputs = [ prevStage.updateAutotoolsGnuConfigScriptsHook ]; + }) + + # First rebuild of gcc; this is linked against all sorts of junk + # from the bootstrap-files, but we only care about the code that + # this compiler *emits*. The `gcc` binary produced in this stage + # is not part of the final stdenv. + (prevStage: + assert isBuiltByBootstrapFilesCompiler prevStage.binutils-unwrapped; + assert isFromBootstrapFiles prevStage."${localSystem.libc}"; + assert isFromBootstrapFiles prevStage.gcc-unwrapped; + assert isFromBootstrapFiles prevStage.coreutils; + assert isFromBootstrapFiles prevStage.gnugrep; + assert isBuiltByBootstrapFilesCompiler prevStage.patchelf; + stageFun prevStage { + name = "bootstrap-stage-xgcc"; + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv coreutils gnugrep gettext bison texinfo zlib gnum4 perl patchelf; + ${localSystem.libc} = getLibc prevStage; + gmp = super.gmp.override { cxx = false; }; + # This stage also rebuilds binutils which will of course be used only in the next stage. + # We inherit this until stage3, in stage4 it will be rebuilt using the adjacent bash/runtimeShell pkg. + # TODO(@sternenseemann): Can we already build the wrapper with the actual runtimeShell here? + # Historically, the wrapper didn't use runtimeShell, so the used shell had to be changed explicitly + # (or stdenvNoCC.shell would be used) which happened in stage4. + binutils = super.binutils.override { + runtimeShell = "${bootstrapTools}/bin/bash"; + }; + gcc-unwrapped = + (super.gcc-unwrapped.override (commonGccOverrides // { + # The most logical name for this package would be something like + # "gcc-stage1". Unfortunately "stage" is already reserved for the + # layers of stdenv, so using "stage" in the name of this package + # would cause massive confusion. + # + # Gcc calls its "stage1" compiler `xgcc` (--disable-bootstrap results + # in `xgcc` being copied to $prefix/bin/gcc). So we imitate that. + # + name = "xgcc"; + + # xgcc uses ld linked against nixpkgs' glibc and gcc built + # against bootstrapTools glibc. We can't allow loading + # $out/libexec/gcc/x86_64-unknown-linux-gnu/13.0.1/liblto_plugin.so + # to mix libc.so: + # ...-binutils-patchelfed-ld-2.40/bin/ld: ...-xgcc-13.0.0/libexec/gcc/x86_64-unknown-linux-gnu/13.0.1/liblto_plugin.so: + # error loading plugin: ...-bootstrap-tools/lib/libpthread.so.0: undefined symbol: __libc_vfork, version GLIBC_PRIVATE + enableLTO = false; + })).overrideAttrs (a: { + + # This signals to cc-wrapper (as overridden above in this file) to add `--sysroot` + # to `$out/nix-support/cc-cflags`. + passthru = a.passthru // { isXgcc = true; }; + + # Gcc will look for the C library headers in + # + # ${with_build_sysroot}${native_system_header_dir} + # + # The ordinary gcc expression sets `--with-build-sysroot=/` and sets + # `native-system-header-dir` to `"${lib.getDev stdenv.cc.libc}/include`. + # + # Unfortunately the value of "--with-native-system-header-dir=" gets "burned in" to the + # compiler, and it is quite difficult to get the compiler to change or ignore it + # afterwards. On the other hand, the `sysroot` is very easy to change; you can just pass + # a `--sysroot` flag to `gcc`. + # + # So we override the expression to remove the default settings for these flags, and + # replace them such that the concatenated value will be the same as before, but we split + # the value between the two variables differently: `--native-system-header-dir=/include`, + # and `--with-build-sysroot=${lib.getDev stdenv.cc.libc}`. + # + configureFlags = (a.configureFlags or []) ++ [ + "--with-native-system-header-dir=/include" + "--with-build-sysroot=${lib.getDev self.stdenv.cc.libc}" + ]; + + # This is a separate phase because gcc assembles its phase scripts + # in bash instead of nix (we should fix that). + preFixupPhases = (a.preFixupPhases or []) ++ [ "preFixupXgccPhase" ]; + + # This is needed to prevent "error: cycle detected in build of '...-xgcc-....drv' + # in the references of output 'lib' from output 'out'" + preFixupXgccPhase = '' + find $lib/lib/ -name \*.so\* -exec patchelf --shrink-rpath {} \; || true + ''; + }); + }; + + # `gettext` comes with obsolete config.sub/config.guess that don't recognize LoongArch64. + extraNativeBuildInputs = [ prevStage.updateAutotoolsGnuConfigScriptsHook ]; + }) + + # 2nd stdenv that contains our own rebuilt binutils and is used for + # compiling our own Glibc. + # + (prevStage: + # previous stage1 stdenv: + assert isBuiltByBootstrapFilesCompiler prevStage.binutils-unwrapped; + assert isFromBootstrapFiles prevStage."${localSystem.libc}"; + assert isBuiltByBootstrapFilesCompiler prevStage.gcc-unwrapped; + assert isFromBootstrapFiles prevStage.coreutils; + assert isFromBootstrapFiles prevStage.gnugrep; + assert isBuiltByBootstrapFilesCompiler prevStage.patchelf; + stageFun prevStage { + name = "bootstrap-stage2"; + + overrides = self: super: { + inherit (prevStage) + ccWrapperStdenv gettext + gcc-unwrapped coreutils gnugrep + perl gnum4 bison texinfo which; + dejagnu = super.dejagnu.overrideAttrs (a: { doCheck = false; } ); + + # We need libidn2 and its dependency libunistring as glibc dependency. + # To avoid the cycle, we build against bootstrap libc, nuke references, + # and use the result as input for our final glibc. We also pass this pair + # through, so the final package-set uses exactly the same builds. + libunistring = super.libunistring.overrideAttrs (attrs: { + postFixup = attrs.postFixup or "" + '' + ${self.nukeReferences}/bin/nuke-refs "$out"/lib/lib*.so.*.* + ''; + # Apparently iconv won't work with bootstrap glibc, but it will be used + # with glibc built later where we keep *this* build of libunistring, + # so we need to trick it into supporting libiconv. + env = attrs.env or {} // { am_cv_func_iconv_works = "yes"; }; + }); + libidn2 = super.libidn2.overrideAttrs (attrs: { + postFixup = attrs.postFixup or "" + '' + ${self.nukeReferences}/bin/nuke-refs -e '${lib.getLib self.libunistring}' \ + "$out"/lib/lib*.so.*.* + ''; + }); + + # This also contains the full, dynamically linked, final Glibc. + binutils = prevStage.binutils.override { + # Rewrap the binutils with the new glibc, so both the next + # stage's wrappers use it. + libc = getLibc self; + + # Unfortunately, when building gcc in the next stage, its LTO plugin + # would use the final libc but `ld` would use the bootstrap one, + # and that can fail to load. Therefore we upgrade `ld` to use newer libc; + # apparently the interpreter needs to match libc, too. + bintools = self.stdenvNoCC.mkDerivation { + pname = prevStage.bintools.bintools.pname + "-patchelfed-ld"; + inherit (prevStage.bintools.bintools) version; + passthru = { inherit (prevStage.bintools.passthru) isFromBootstrapFiles; }; + enableParallelBuilding = true; + dontUnpack = true; + dontBuild = true; + strictDeps = true; + # We wouldn't need to *copy* all, but it's easier and the result is temporary anyway. + installPhase = '' + mkdir -p "$out"/bin + cp -a '${prevStage.bintools.bintools}'/bin/* "$out"/bin/ + chmod +w "$out"/bin/ld.bfd + patchelf --set-interpreter '${getLibc self}'/lib/ld*.so.? \ + --set-rpath "${getLibc self}/lib:$(patchelf --print-rpath "$out"/bin/ld.bfd)" \ + "$out"/bin/ld.bfd + ''; + }; + }; + + # TODO(amjoseph): It is not yet entirely clear why this is necessary. + # Something strange is going on with xgcc and libstdc++ on pkgsMusl. + patchelf = super.patchelf.overrideAttrs(previousAttrs: + lib.optionalAttrs super.stdenv.hostPlatform.isMusl { + NIX_CFLAGS_COMPILE = (previousAttrs.NIX_CFLAGS_COMPILE or "") + " -static-libstdc++"; + }); + + }; + + # `gettext` comes with obsolete config.sub/config.guess that don't recognize LoongArch64. + # `libtool` comes with obsolete config.sub/config.guess that don't recognize Risc-V. + extraNativeBuildInputs = [ prevStage.updateAutotoolsGnuConfigScriptsHook ]; + }) + + + # Construct a third stdenv identical to the 2nd, except that this + # one uses the rebuilt Glibc from stage2. It still uses the recent + # binutils and rest of the bootstrap tools, including GCC. + (prevStage: + # previous stage2 stdenv: + assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.${localSystem.libc}; + assert isBuiltByBootstrapFilesCompiler prevStage.gcc-unwrapped; + assert isFromBootstrapFiles prevStage.coreutils; + assert isFromBootstrapFiles prevStage.gnugrep; + assert isBuiltByNixpkgsCompiler prevStage.patchelf; + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ gmp isl_0_20 libmpc mpfr ]); + stageFun prevStage { + name = "bootstrap-stage3"; + + overrides = self: super: rec { + inherit (prevStage) + ccWrapperStdenv + binutils coreutils gnugrep gettext + perl patchelf linuxHeaders gnum4 bison libidn2 libunistring libxcrypt; + # We build a special copy of libgmp which doesn't use libstdc++, because + # xgcc++'s libstdc++ references the bootstrap-files (which is what + # compiles xgcc++). + gmp = super.gmp.override { cxx = false; }; + } // { + ${localSystem.libc} = getLibc prevStage; + gcc-unwrapped = (super.gcc-unwrapped.override (commonGccOverrides // { + inherit (prevStage) which; + } + )).overrideAttrs (a: { + # so we can add them to allowedRequisites below + passthru = a.passthru // { inherit (self) gmp mpfr libmpc isl; }; + }); + }; + extraNativeBuildInputs = [ + prevStage.patchelf + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + prevStage.updateAutotoolsGnuConfigScriptsHook + ]; + }) + + + # Construct a fourth stdenv that uses the new GCC. But coreutils is + # still from the bootstrap tools. + # + (prevStage: + # previous stage3 stdenv: + assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.${localSystem.libc}; + assert isBuiltByNixpkgsCompiler prevStage.gcc-unwrapped; + assert isFromBootstrapFiles prevStage.coreutils; + assert isFromBootstrapFiles prevStage.gnugrep; + assert isBuiltByNixpkgsCompiler prevStage.patchelf; + stageFun prevStage { + name = "bootstrap-stage4"; + + overrides = self: super: { + # Zlib has to be inherited and not rebuilt in this stage, + # because gcc (since JAR support) already depends on zlib, and + # then if we already have a zlib we want to use that for the + # other purposes (binutils and top-level pkgs) too. + inherit (prevStage) gettext gnum4 bison perl texinfo zlib linuxHeaders libidn2 libunistring; + ${localSystem.libc} = getLibc prevStage; + # Since this is the first fresh build of binutils since stage2, our own runtimeShell will be used. + binutils = super.binutils.override { + # Build expand-response-params with last stage like below + inherit (prevStage) expand-response-params; + }; + + # To allow users' overrides inhibit dependencies too heavy for + # bootstrap, like guile: https://github.com/NixOS/nixpkgs/issues/181188 + gnumake = super.gnumake.override { inBootstrap = true; }; + + gcc = lib.makeOverridable (import ../../build-support/cc-wrapper) { + nativeTools = false; + nativeLibc = false; + isGNU = true; + inherit (prevStage) expand-response-params; + cc = prevStage.gcc-unwrapped; + bintools = self.binutils; + libc = getLibc self; + inherit lib; + inherit (self) stdenvNoCC coreutils gnugrep runtimeShell; + fortify-headers = self.fortify-headers; + }; + }; + extraNativeBuildInputs = [ + prevStage.patchelf prevStage.xz + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + prevStage.updateAutotoolsGnuConfigScriptsHook + ]; + }) + + # Construct the final stdenv. It uses the Glibc and GCC, and adds + # in a new binutils that doesn't depend on bootstrap-tools, as well + # as dynamically linked versions of all other tools. + # + # When updating stdenvLinux, make sure that the result has no + # dependency (`nix-store -qR') on bootstrapTools or the first + # binutils built. + # + (prevStage: + # previous stage4 stdenv; see stage3 comment regarding gcc, + # which applies here as well. + assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.${localSystem.libc}; + assert isBuiltByNixpkgsCompiler prevStage.gcc-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.coreutils; + assert isBuiltByNixpkgsCompiler prevStage.gnugrep; + assert isBuiltByNixpkgsCompiler prevStage.patchelf; + { + inherit config overlays; + stdenv = import ../generic rec { + name = "stdenv-linux"; + + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + inherit config; + + preHook = commonPreHook; + + initialPath = + ((import ../generic/common-path.nix) {pkgs = prevStage;}); + + extraNativeBuildInputs = [ + prevStage.patchelf + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + prevStage.updateAutotoolsGnuConfigScriptsHook + ]; + + cc = prevStage.gcc; + + shell = cc.shell; + + inherit (prevStage.stdenv) fetchurlBoot; + + extraAttrs = { + inherit bootstrapTools; + shellPackage = prevStage.bash; + }; + + disallowedRequisites = [ bootstrapTools.out ]; + + # Mainly avoid reference to bootstrap tools + allowedRequisites = with prevStage; with lib; + # Simple executable tools + concatMap (p: [ (getBin p) (getLib p) ]) [ + gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils + gawk gmp gnumake gnused gnutar gnugrep gnupatch patchelf ed file + ] + # Library dependencies + ++ map getLib ( + [ attr acl zlib gnugrep.pcre2 libidn2 libunistring ] + ++ lib.optional (gawk.libsigsegv != null) gawk.libsigsegv + ) + # More complicated cases + ++ (map (x: getOutput x (getLibc prevStage)) [ "out" "dev" "bin" ] ) + ++ [ linuxHeaders # propagated from .dev + binutils gcc gcc.cc gcc.cc.lib + gcc.expand-response-params # != (prevStage.)expand-response-params + gcc.cc.libgcc glibc.passthru.libgcc + ] + ++ lib.optionals (localSystem.libc == "musl") [ fortify-headers ] + ++ [ prevStage.updateAutotoolsGnuConfigScriptsHook prevStage.gnu-config ] + ++ (with gcc-unwrapped.passthru; [ + gmp libmpc mpfr isl + ]) + ; + + overrides = self: super: { + inherit (prevStage) + gzip bzip2 xz bash coreutils diffutils findutils gawk + gnused gnutar gnugrep gnupatch patchelf + attr acl zlib libunistring; + inherit (prevStage.gnugrep) pcre2; + ${localSystem.libc} = getLibc prevStage; + + # Hack: avoid libidn2.{bin,dev} referencing bootstrap tools. There's a logical cycle. + libidn2 = import ../../by-name/li/libidn2/no-bootstrap-reference.nix { + inherit lib; + inherit (prevStage) libidn2; + inherit (self) stdenv runCommandLocal patchelf libunistring; + }; + + gnumake = super.gnumake.override { inBootstrap = false; }; + } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { + # Need to get rid of these when cross-compiling. + inherit (prevStage) binutils binutils-unwrapped; + gcc = cc; + }; + }; + }) + + # This "no-op" stage is just a place to put the assertions about stage5. + (prevStage: + # previous stage5 stdenv; see stage3 comment regarding gcc, + # which applies here as well. + assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.${localSystem.libc}; + assert isBuiltByNixpkgsCompiler prevStage.gcc-unwrapped; + assert isBuiltByNixpkgsCompiler prevStage.coreutils; + assert isBuiltByNixpkgsCompiler prevStage.gnugrep; + assert isBuiltByNixpkgsCompiler prevStage.patchelf; + { inherit (prevStage) config overlays stdenv; }) +] diff --git a/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix new file mode 100644 index 0000000..f58e807 --- /dev/null +++ b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix @@ -0,0 +1,36 @@ +{system ? builtins.currentSystem}: + +let + inherit (releaseLib) lib; + releaseLib = import ../../top-level/release-lib.nix { + # We're not using any functions from release-lib.nix that look at + # supportedSystems. + supportedSystems = []; + }; + + make = crossSystem: import ./make-bootstrap-tools.nix { + pkgs = releaseLib.pkgsForCross crossSystem system; + }; +in lib.mapAttrs (n: make) (with lib.systems.examples; { + # NOTE: Only add platforms for which there are files in `./bootstrap-files` + # or for which you plan to request the tarball upload soon. See the + # maintainers/scripts/bootstrap-files/README.md + # on how to request an upload. + # Sort following the sorting in `./default.nix` `bootstrapFiles` argument. + + armv5tel-unknown-linux-gnueabi = sheevaplug; + armv6l-unknown-linux-gnueabihf = raspberryPi; + armv7l-unknown-linux-gnueabihf = armv7l-hf-multiplatform; + aarch64-unknown-linux-gnu = aarch64-multiplatform; + mipsel-unknown-linux-gnu = mipsel-linux-gnu; + mips64el-unknown-linux-gnuabin32 = mips64el-linux-gnuabin32; + mips64el-unknown-linux-gnuabi64 = mips64el-linux-gnuabi64; + powerpc64-unknown-linux-gnuabielfv2 = ppc64; + powerpc64le-unknown-linux-gnu = powernv; + riscv64-unknown-linux-gnu = riscv64; + + # musl + aarch64-unknown-linux-musl = aarch64-multiplatform-musl; + armv6l-unknown-linux-musleabihf = muslpi; + x86_64-unknown-linux-musl = musl64; +}) diff --git a/pkgs/stdenv/linux/make-bootstrap-tools.nix b/pkgs/stdenv/linux/make-bootstrap-tools.nix new file mode 100644 index 0000000..8743303 --- /dev/null +++ b/pkgs/stdenv/linux/make-bootstrap-tools.nix @@ -0,0 +1,294 @@ +{ pkgs ? import ../../.. {} }: + +let + libc = pkgs.stdenv.cc.libc; + patchelf = pkgs.patchelf.overrideAttrs(previousAttrs: { + NIX_CFLAGS_COMPILE = (previousAttrs.NIX_CFLAGS_COMPILE or []) ++ [ "-static-libgcc" "-static-libstdc++" ]; + NIX_CFLAGS_LINK = (previousAttrs.NIX_CFLAGS_LINK or []) ++ [ "-static-libgcc" "-static-libstdc++" ]; + }); +in with pkgs; rec { + + + coreutilsMinimal = coreutils.override (args: { + # We want coreutils without ACL/attr support. + aclSupport = false; + attrSupport = false; + # Our tooling currently can't handle scripts in bin/, only ELFs and symlinks. + singleBinary = "symlinks"; + }); + + tarMinimal = gnutar.override { acl = null; }; + + busyboxMinimal = busybox.override { + useMusl = lib.meta.availableOn stdenv.hostPlatform musl; + enableStatic = true; + enableMinimal = true; + extraConfig = '' + CONFIG_ASH y + CONFIG_ASH_ECHO y + CONFIG_ASH_TEST y + CONFIG_ASH_OPTIMIZE_FOR_SIZE y + CONFIG_MKDIR y + CONFIG_TAR y + CONFIG_UNXZ y + ''; + }; + + bootGCC = gcc.cc.override { enableLTO = false; }; + bootBinutils = binutils.bintools.override { + withAllTargets = false; + # Don't need two linkers, disable whatever's not primary/default. + enableGold = false; + # bootstrap is easier w/static + enableShared = false; + }; + + build = + let + # ${libc.src}/sysdeps/unix/sysv/linux/loongarch/lp64/libnsl.abilist does not exist! + withLibnsl = !stdenv.hostPlatform.isLoongArch64; + in + stdenv.mkDerivation { + name = "stdenv-bootstrap-tools"; + + meta = { + # Increase priority to unblock nixpkgs-unstable + # https://github.com/NixOS/nixpkgs/pull/104679#issuecomment-732267288 + schedulingPriority = 200; + }; + + nativeBuildInputs = [ buildPackages.nukeReferences buildPackages.cpio ]; + + buildCommand = '' + set -x + mkdir -p $out/bin $out/lib $out/libexec + + '' + (if (stdenv.hostPlatform.libc == "glibc") then '' + # Copy what we need of Glibc. + cp -d ${libc.out}/lib/ld*.so* $out/lib + cp -d ${libc.out}/lib/libc*.so* $out/lib + cp -d ${libc.out}/lib/libc_nonshared.a $out/lib + cp -d ${libc.out}/lib/libm*.so* $out/lib + cp -d ${libc.out}/lib/libdl*.so* $out/lib + cp -d ${libc.out}/lib/librt*.so* $out/lib + cp -d ${libc.out}/lib/libpthread*.so* $out/lib + '' + lib.optionalString withLibnsl '' + cp -d ${libc.out}/lib/libnsl*.so* $out/lib + '' + '' + cp -d ${libc.out}/lib/libutil*.so* $out/lib + cp -d ${libc.out}/lib/libnss*.so* $out/lib + cp -d ${libc.out}/lib/libresolv*.so* $out/lib + # Copy all runtime files to enable non-PIE, PIE, static PIE and profile-generated builds + cp -d ${libc.out}/lib/*.o $out/lib + + # Hacky compat with our current unpack-bootstrap-tools.sh + ln -s librt.so "$out"/lib/librt-dummy.so + + cp -rL ${libc.dev}/include $out + chmod -R u+w "$out" + + # libc can contain linker scripts: find them, copy their deps, + # and get rid of absolute paths (nuke-refs would make them useless) + local lScripts=$(grep --files-with-matches --max-count=1 'GNU ld script' -R "$out/lib") + cp -d -t "$out/lib/" $(cat $lScripts | tr " " "\n" | grep -F '${libc.out}' | sort -u) + for f in $lScripts; do + substituteInPlace "$f" --replace '${libc.out}/lib/' "" + done + + # Hopefully we won't need these. + rm -rf $out/include/mtd $out/include/rdma $out/include/sound $out/include/video + find $out/include -name .install -exec rm {} \; + find $out/include -name ..install.cmd -exec rm {} \; + mv $out/include $out/include-glibc + '' else if (stdenv.hostPlatform.libc == "musl") then '' + # Copy what we need from musl + cp ${libc.out}/lib/* $out/lib + cp -rL ${libc.dev}/include $out + chmod -R u+w "$out" + + rm -rf $out/include/mtd $out/include/rdma $out/include/sound $out/include/video + find $out/include -name .install -exec rm {} \; + find $out/include -name ..install.cmd -exec rm {} \; + mv $out/include $out/include-libc + '' else throw "unsupported libc for bootstrap tools") + + '' + # Copy coreutils, bash, etc. + cp -d ${coreutilsMinimal.out}/bin/* $out/bin + (cd $out/bin && rm vdir dir sha*sum pinky factor pathchk runcon shuf who whoami shred users) + + cp ${bash.out}/bin/bash $out/bin + cp ${findutils.out}/bin/find $out/bin + cp ${findutils.out}/bin/xargs $out/bin + cp -d ${diffutils.out}/bin/* $out/bin + cp -d ${gnused.out}/bin/* $out/bin + cp -d ${gnugrep.out}/bin/grep $out/bin + cp ${gawk.out}/bin/gawk $out/bin + cp -d ${gawk.out}/bin/awk $out/bin + cp ${tarMinimal.out}/bin/tar $out/bin + cp ${gzip.out}/bin/.gzip-wrapped $out/bin/gzip + cp ${bzip2.bin}/bin/bzip2 $out/bin + cp -d ${gnumake.out}/bin/* $out/bin + cp -d ${patch}/bin/* $out/bin + cp ${patchelf}/bin/* $out/bin + + cp -d ${gnugrep.pcre2.out}/lib/libpcre2*.so* $out/lib # needed by grep + + # Copy what we need of GCC. + cp -d ${bootGCC.out}/bin/gcc $out/bin + cp -d ${bootGCC.out}/bin/cpp $out/bin + cp -d ${bootGCC.out}/bin/g++ $out/bin + cp ${bootGCC.lib}/lib/libgcc_s.so* $out/lib + cp -d ${bootGCC.lib}/lib/libstdc++.so* $out/lib + cp -d ${bootGCC.out}/lib/libssp.a* $out/lib + cp -d ${bootGCC.out}/lib/libssp_nonshared.a $out/lib + cp -rd ${bootGCC.out}/lib/gcc $out/lib + chmod -R u+w $out/lib + rm -f $out/lib/gcc/*/*/include*/linux + rm -f $out/lib/gcc/*/*/include*/sound + rm -rf $out/lib/gcc/*/*/include*/root + rm -f $out/lib/gcc/*/*/include-fixed/asm + rm -rf $out/lib/gcc/*/*/plugin + #rm -f $out/lib/gcc/*/*/*.a + cp -rd ${bootGCC.out}/libexec/* $out/libexec + chmod -R u+w $out/libexec + rm -rf $out/libexec/gcc/*/*/plugin + mkdir -p $out/include + cp -rd ${bootGCC.out}/include/c++ $out/include + chmod -R u+w $out/include + rm -rf $out/include/c++/*/ext/pb_ds + rm -rf $out/include/c++/*/ext/parallel + + cp -d ${gmpxx.out}/lib/libgmp*.so* $out/lib + cp -d ${isl.out}/lib/libisl*.so* $out/lib + cp -d ${mpfr.out}/lib/libmpfr*.so* $out/lib + cp -d ${libmpc.out}/lib/libmpc*.so* $out/lib + cp -d ${zlib.out}/lib/libz.so* $out/lib + + '' + lib.optionalString (stdenv.hostPlatform.isRiscV) '' + # libatomic is required on RiscV platform for C/C++ atomics and pthread + # even though they may be translated into native instructions. + cp -d ${bootGCC.out}/lib/libatomic.a* $out/lib + + '' + '' + cp -d ${bzip2.out}/lib/libbz2.so* $out/lib + + # Copy binutils. + for i in as ld ar ranlib nm strip readelf objdump; do + cp ${bootBinutils.out}/bin/$i $out/bin + done + cp -r '${lib.getLib binutils.bintools}'/lib/* "$out/lib/" + + chmod -R u+w $out + + # Strip executables even further. + for i in $out/bin/* $out/libexec/gcc/*/*/*; do + if test -x $i -a ! -L $i; then + chmod +w $i + $STRIP -s $i || true + fi + done + + nuke-refs $out/bin/* + nuke-refs $out/lib/* + nuke-refs $out/lib/*/* + nuke-refs $out/libexec/gcc/*/*/* + nuke-refs $out/lib/gcc/*/*/* + nuke-refs $out/lib/gcc/*/*/include-fixed/*{,/*} + + mkdir $out/.pack + mv $out/* $out/.pack + mv $out/.pack $out/pack + + mkdir $out/on-server + XZ_OPT="-9 -e" tar cvJf $out/on-server/bootstrap-tools.tar.xz --hard-dereference --sort=name --numeric-owner --owner=0 --group=0 --mtime=@1 -C $out/pack . + cp ${busyboxMinimal}/bin/busybox $out/on-server + chmod u+w $out/on-server/busybox + nuke-refs $out/on-server/busybox + ''; # */ + + # The result should not contain any references (store paths) so + # that we can safely copy them out of the store and to other + # locations in the store. + allowedReferences = []; + }; + + bootstrapFiles = { + # Make them their own store paths to test that busybox still works when the binary is named /nix/store/HASH-busybox + busybox = runCommand "busybox" {} "cp ${build}/on-server/busybox $out"; + bootstrapTools = runCommand "bootstrap-tools.tar.xz" {} "cp ${build}/on-server/bootstrap-tools.tar.xz $out"; + }; + + bootstrapTools = + let extraAttrs = lib.optionalAttrs + config.contentAddressedByDefault + { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }; + in + if (stdenv.hostPlatform.libc == "glibc") then + import ./bootstrap-tools { + inherit (stdenv.buildPlatform) system; # Used to determine where to build + inherit bootstrapFiles extraAttrs; + } + else if (stdenv.hostPlatform.libc == "musl") then + import ./bootstrap-tools-musl { + inherit (stdenv.buildPlatform) system; # Used to determine where to build + inherit bootstrapFiles extraAttrs; + } + else throw "unsupported libc"; + + test = derivation { + name = "test-bootstrap-tools"; + inherit (stdenv.hostPlatform) system; # We cannot "cross test" + builder = bootstrapFiles.busybox; + args = [ "ash" "-e" "-c" "eval \"$buildCommand\"" ]; + + buildCommand = '' + export PATH=${bootstrapTools}/bin + + ls -l + mkdir $out + mkdir $out/bin + sed --version + find --version + diff --version + patch --version + make --version + awk --version + grep --version + gcc --version + + '' + lib.optionalString (stdenv.hostPlatform.libc == "glibc") '' + rtld=$(echo ${bootstrapTools}/lib/${builtins.unsafeDiscardStringContext /* only basename */ (builtins.baseNameOf binutils.dynamicLinker)}) + libc_includes=${bootstrapTools}/include-glibc + '' + lib.optionalString (stdenv.hostPlatform.libc == "musl") '' + rtld=$(echo ${bootstrapTools}/lib/ld-musl*.so.?) + libc_includes=${bootstrapTools}/include-libc + '' + '' + # path to version-specific libraries, like libstdc++.so + cxx_libs=$(echo ${bootstrapTools}/lib/gcc/*/*) + export CPP="cpp -idirafter $libc_includes -B${bootstrapTools}" + export CC="gcc -idirafter $libc_includes -B${bootstrapTools} -Wl,-dynamic-linker,$rtld -Wl,-rpath,${bootstrapTools}/lib -Wl,-rpath,$cxx_libs" + export CXX="g++ -idirafter $libc_includes -B${bootstrapTools} -Wl,-dynamic-linker,$rtld -Wl,-rpath,${bootstrapTools}/lib -Wl,-rpath,$cxx_libs" + + echo '#include ' >> foo.c + echo '#include ' >> foo.c + echo 'int main() { printf("Hello World\\n"); return 0; }' >> foo.c + $CC -o $out/bin/foo foo.c + $out/bin/foo + + echo '#include ' >> bar.cc + echo 'int main() { std::cout << "Hello World\\n"; }' >> bar.cc + $CXX -v -o $out/bin/bar bar.cc + $out/bin/bar + + tar xvf ${hello.src} + cd hello-* + ./configure --prefix=$out + make + make install + ''; + }; +} diff --git a/pkgs/stdenv/native/default.nix b/pkgs/stdenv/native/default.nix new file mode 100644 index 0000000..242bf9d --- /dev/null +++ b/pkgs/stdenv/native/default.nix @@ -0,0 +1,173 @@ +{ lib +, localSystem, crossSystem, config, overlays, crossOverlays ? [] +}: + +assert crossSystem == localSystem; + +let + inherit (localSystem) system; + + shell = + if system == "i686-freebsd" || system == "x86_64-freebsd" then "/usr/local/bin/bash" + else "/bin/bash"; + + path = + (lib.optionals (system == "i686-solaris") [ "/usr/gnu" ]) ++ + (lib.optionals (system == "i686-netbsd") [ "/usr/pkg" ]) ++ + (lib.optionals (system == "x86_64-solaris") [ "/opt/local/gnu" ]) ++ + ["/" "/usr" "/usr/local"]; + + prehookBase = '' + # Disable purity tests; it's allowed (even needed) to link to + # libraries outside the Nix store (like the C library). + export NIX_ENFORCE_PURITY= + export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}" + ''; + + prehookFreeBSD = '' + ${prehookBase} + + alias make=gmake + alias tar=gtar + alias sed=gsed + export MAKE=gmake + shopt -s expand_aliases + ''; + + prehookOpenBSD = '' + ${prehookBase} + + alias make=gmake + alias grep=ggrep + alias mv=gmv + alias ln=gln + alias sed=gsed + alias tar=gtar + + export MAKE=gmake + shopt -s expand_aliases + ''; + + prehookNetBSD = '' + ${prehookBase} + + alias make=gmake + alias sed=gsed + alias tar=gtar + export MAKE=gmake + shopt -s expand_aliases + ''; + + # prevent libtool from failing to find dynamic libraries + prehookCygwin = '' + ${prehookBase} + + shopt -s expand_aliases + export lt_cv_deplibs_check_method=pass_all + ''; + + extraNativeBuildInputsCygwin = [ + ../cygwin/all-buildinputs-as-runtimedep.sh + ../cygwin/wrap-exes-to-find-dlls.sh + ] ++ (if system == "i686-cygwin" then [ + ../cygwin/rebase-i686.sh + ] else if system == "x86_64-cygwin" then [ + ../cygwin/rebase-x86_64.sh + ] else []); + + # A function that builds a "native" stdenv (one that uses tools in + # /usr etc.). + makeStdenv = + { cc, fetchurl, extraPath ? [], overrides ? (self: super: { }), extraNativeBuildInputs ? [] }: + + import ../generic { + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; + + preHook = + if system == "i686-freebsd" then prehookFreeBSD else + if system == "x86_64-freebsd" then prehookFreeBSD else + if system == "i686-openbsd" then prehookOpenBSD else + if system == "i686-netbsd" then prehookNetBSD else + if system == "i686-cygwin" then prehookCygwin else + if system == "x86_64-cygwin" then prehookCygwin else + prehookBase; + + extraNativeBuildInputs = extraNativeBuildInputs ++ + (if system == "i686-cygwin" then extraNativeBuildInputsCygwin else + if system == "x86_64-cygwin" then extraNativeBuildInputsCygwin else + []); + + initialPath = extraPath ++ path; + + fetchurlBoot = fetchurl; + + inherit shell cc overrides config; + }; + +in + +[ + + ({}: rec { + __raw = true; + + stdenv = makeStdenv { + cc = null; + fetchurl = null; + }; + stdenvNoCC = stdenv; + + cc = let + nativePrefix = { # switch + i686-solaris = "/usr/gnu"; + x86_64-solaris = "/opt/local/gcc47"; + }.${system} or "/usr"; + in + import ../../build-support/cc-wrapper { + name = "cc-native"; + nativeTools = true; + nativeLibc = true; + inherit lib nativePrefix; + bintools = import ../../build-support/bintools-wrapper { + name = "bintools"; + inherit lib stdenvNoCC nativePrefix; + nativeTools = true; + nativeLibc = true; + }; + inherit stdenvNoCC; + }; + + fetchurl = import ../../build-support/fetchurl { + inherit lib stdenvNoCC; + # Curl should be in /usr/bin or so. + curl = null; + }; + + }) + + # First build a stdenv based only on tools outside the store. + (prevStage: { + inherit config overlays; + stdenv = makeStdenv { + inherit (prevStage) cc fetchurl; + overrides = self: super: { inherit (prevStage) fetchurl; }; + } // { + inherit (prevStage) fetchurl; + }; + }) + + # Using that, build a stdenv that adds the ‘xz’ command (which most systems + # don't have, so we mustn't rely on the native environment providing it). + (prevStage: { + inherit config overlays; + stdenv = makeStdenv { + inherit (prevStage.stdenv) cc fetchurl; + extraPath = [ prevStage.xz ]; + overrides = self: super: { inherit (prevStage) fetchurl xz; }; + extraNativeBuildInputs = if localSystem.isLinux then [ prevStage.patchelf ] else []; + }; + }) + +] diff --git a/pkgs/stdenv/nix/default.nix b/pkgs/stdenv/nix/default.nix new file mode 100644 index 0000000..e9e9936 --- /dev/null +++ b/pkgs/stdenv/nix/default.nix @@ -0,0 +1,50 @@ +{ lib +, crossSystem, localSystem, config, overlays +, bootStages +, ... +}: + +assert crossSystem == localSystem; + +bootStages ++ [ + (prevStage: { + inherit config overlays; + + stdenv = import ../generic rec { + inherit config; + + inherit (prevStage.stdenv) buildPlatform hostPlatform targetPlatform; + + preHook = '' + export NIX_ENFORCE_PURITY="''${NIX_ENFORCE_PURITY-1}" + export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}" + export NIX_IGNORE_LD_THROUGH_GCC=1 + ''; + + initialPath = (import ../generic/common-path.nix) { pkgs = prevStage; }; + + cc = import ../../build-support/cc-wrapper { + inherit lib; + nativeTools = false; + nativePrefix = lib.optionalString hostPlatform.isSunOS "/usr"; + nativeLibc = true; + inherit (prevStage) stdenvNoCC binutils coreutils gnugrep; + cc = prevStage.gcc.cc; + isGNU = true; + shell = prevStage.bash + "/bin/sh"; + }; + + shell = prevStage.bash + "/bin/sh"; + + fetchurlBoot = prevStage.stdenv.fetchurlBoot; + + overrides = self: super: { + inherit cc; + inherit (cc) binutils; + inherit (prevStage) + gzip bzip2 xz bash coreutils diffutils findutils gawk + gnumake gnused gnutar gnugrep gnupatch perl; + }; + }; + }) +] diff --git a/pkgs/stdenv/tests/succeedOnFailure.nix b/pkgs/stdenv/tests/succeedOnFailure.nix new file mode 100644 index 0000000..fef7f17 --- /dev/null +++ b/pkgs/stdenv/tests/succeedOnFailure.nix @@ -0,0 +1,14 @@ +{ stdenv }: + +stdenv.mkDerivation { + name = "stdenv-test-succeedOnFailure"; + + succeedOnFailure = true; + + passAsFile = [ "buildCommand" ]; + buildCommand = '' + mkdir $out + echo foo > $out/foo + exit 1 + ''; +} diff --git a/pkgs/top-level/base-packages.nix b/pkgs/top-level/base-packages.nix new file mode 100644 index 0000000..5f959f3 --- /dev/null +++ b/pkgs/top-level/base-packages.nix @@ -0,0 +1,178 @@ +/* The top-level package collection of nixpkgs. + * It is sorted by categories corresponding to the folder names in the /pkgs + * folder. Inside the categories packages are roughly sorted by alphabet, but + * strict sorting has been long lost due to merges. Please use the full-text + * search of your editor. ;) + * Hint: ### starts category names. + */ +{ lib, noSysDirs, config, overlays }: +res: pkgs: super: + +with pkgs; + +{ + # A module system style type tag + # + # Allows the nixpkgs fixpoint, usually known as `pkgs` to be distinguished + # nominally. + # + # pkgs._type == "pkgs" + # pkgs.pkgsStatic._type == "pkgs" + # + # Design note: + # While earlier stages of nixpkgs fixpoint construction are supertypes of this + # stage, they're generally not usable in places where a `pkgs` is expected. + # (earlier stages being the various `super` variables that precede + # all-packages.nix) + _type = "pkgs"; + + # A stdenv capable of building 32-bit binaries. + # On x86_64-linux, it uses GCC compiled with multilib support; on i686-linux, + # it's just the plain stdenv. + stdenv_32bit = lowPrio (if stdenv.hostPlatform.is32bit then stdenv else multiStdenv); + + stdenvNoCC = stdenv.override ( + { cc = null; hasCC = false; } + + // lib.optionalAttrs (stdenv.hostPlatform.isDarwin && (stdenv.hostPlatform != stdenv.buildPlatform)) { + # TODO: This is a hack to use stdenvNoCC to produce a CF when cross + # compiling. It's not very sound. The cross stdenv has: + # extraBuildInputs = [ targetPackages.darwin.apple_sdks.frameworks.CoreFoundation ] + # and uses stdenvNoCC. In order to make this not infinitely recursive, we + # need to exclude this extraBuildInput. + extraBuildInputs = [ ]; + } + ); + + mkStdenvNoLibs = stdenv: + let + bintools = stdenv.cc.bintools.override { + libc = null; + noLibc = true; + }; + in + stdenv.override { + cc = stdenv.cc.override { + libc = null; + noLibc = true; + extraPackages = [ ]; + inherit bintools; + }; + allowedRequisites = + lib.mapNullable (rs: rs ++ [ bintools ]) (stdenv.allowedRequisites or null); + }; + + stdenvNoLibs = + if stdenv.hostPlatform != stdenv.buildPlatform && (stdenv.hostPlatform.isDarwin || stdenv.hostPlatform.useLLVM or false) + then + # We cannot touch binutils or cc themselves, because that will cause + # infinite recursion. So instead, we just choose a libc based on the + # current platform. That means we won't respect whatever compiler was + # passed in with the stdenv stage argument. + # + # TODO It would be much better to pass the `stdenvNoCC` and *unwrapped* + # cc, bintools, compiler-rt equivalent, etc. and create all final stdenvs + # as part of the stage. Then we would never be tempted to override a later + # thing to to create an earlier thing (leading to infinite recursion) and + # we also would still respect the stage arguments choices for these + # things. + overrideCC stdenv buildPackages.llvmPackages.clangNoCompilerRt + else mkStdenvNoLibs stdenv; + + gccStdenvNoLibs = mkStdenvNoLibs gccStdenv; + clangStdenvNoLibs = mkStdenvNoLibs clangStdenv; + + # For convenience, allow callers to get the path to Nixpkgs. + path = ../..; + + ### Helper functions. + inherit lib config overlays; + + # do not import 'appendToName' to get consistent package-names with the same + # set of package-parameters: https://github.com/NixOS/nixpkgs/issues/68519 + inherit (lib) lowPrio hiPrio makeOverridable; + + inherit (lib) recurseIntoAttrs; + + # This is intended to be the reverse of recurseIntoAttrs, as it is + # defined now it exists mainly for documentation purposes, but you + # can also override this with recurseIntoAttrs to recurseInto all + # the Attrs which is useful for testing massive changes. Ideally, + # every package subset not marked with recurseIntoAttrs should be + # marked with this. + inherit (lib) dontRecurseIntoAttrs; + + stringsWithDeps = lib.stringsWithDeps; + + ### Evaluating the entire Nixpkgs naively will fail, make failure fast + AAAAAASomeThingsFailToEvaluate = throw '' + Please be informed that this pseudo-package is not the only part + of Nixpkgs that fails to evaluate. You should not evaluate + entire Nixpkgs without some special measures to handle failing + packages, like using pkgs/top-level/release-attrpaths-superset.nix. + ''; + + tests = callPackages ../test { }; + + # These are used when buiding compiler-rt / libgcc, prior to building libc. + preLibcCrossHeaders = + let + inherit (stdenv.targetPlatform) libc; + in + if stdenv.targetPlatform.isMinGW then targetPackages.windows.mingw_w64_headers or windows.mingw_w64_headers + else if libc == "nblibc" then targetPackages.netbsdCross.headers or netbsdCross.headers + else if libc == "libSystem" && stdenv.targetPlatform.isAarch64 then targetPackages.darwin.LibsystemCross or darwin.LibsystemCross + else null; + + # We can choose: + libcCrossChooser = name: + # libc is hackily often used from the previous stage. This `or` + # hack fixes the hack, *sigh*. + /**/ + if name == null then null + else if name == "glibc" then targetPackages.glibcCross or glibcCross + else if name == "bionic" then targetPackages.bionic or bionic + else if name == "uclibc" then targetPackages.uclibcCross or uclibcCross + else if name == "avrlibc" then targetPackages.avrlibcCross or avrlibcCross + else if name == "newlib" && stdenv.targetPlatform.isMsp430 then targetPackages.msp430NewlibCross or msp430NewlibCross + else if name == "newlib" && stdenv.targetPlatform.isVc4 then targetPackages.vc4-newlib or vc4-newlib + else if name == "newlib" && stdenv.targetPlatform.isOr1k then targetPackages.or1k-newlib or or1k-newlib + else if name == "newlib" then targetPackages.newlibCross or newlibCross + else if name == "newlib-nano" then targetPackages.newlib-nanoCross or newlib-nanoCross + else if name == "musl" then targetPackages.muslCross or muslCross + else if name == "msvcrt" then targetPackages.windows.mingw_w64 or windows.mingw_w64 + else if name == "ucrt" then targetPackages.windows.mingw_w64 or windows.mingw_w64 + else if name == "libSystem" then + if stdenv.targetPlatform.useiOSPrebuilt + then targetPackages.darwin.iosSdkPkgs.libraries or darwin.iosSdkPkgs.libraries + else targetPackages.darwin.LibsystemCross or (throw "don't yet have a `targetPackages.darwin.LibsystemCross for ${stdenv.targetPlatform.config}`") + else if name == "fblibc" then targetPackages.freebsdCross.libc or freebsdCross.libc + else if name == "nblibc" then targetPackages.netbsdCross.libc or netbsdCross.libc + else if name == "wasilibc" then targetPackages.wasilibc or wasilibc + else if name == "relibc" then targetPackages.relibc or relibc + else throw "Unknown libc ${name}"; + + libcCross = assert stdenv.targetPlatform != stdenv.buildPlatform; libcCrossChooser stdenv.targetPlatform.libc; + + threadsCross = threadsCrossFor null; + threadsCrossFor = cc_version: + lib.optionalAttrs (stdenv.targetPlatform.isMinGW && !(stdenv.targetPlatform.useLLVM or false)) { + # other possible values: win32 or posix + model = "mcf"; + # For win32 or posix set this to null + package = + if cc_version == null || lib.versionAtLeast cc_version "13" + then targetPackages.windows.mcfgthreads or windows.mcfgthreads + else targetPackages.windows.mcfgthreads_pre_gcc_13 or windows.mcfgthreads_pre_gcc_13; + }; + + multiStdenv = if stdenv.cc.isClang then clangMultiStdenv else gccMultiStdenv; + + crossLibcStdenv = + if stdenv.hostPlatform.useLLVM or false || stdenv.hostPlatform.isDarwin + then overrideCC stdenv buildPackages.llvmPackages.clangNoLibc + else gccCrossLibcStdenv; + + runtimeShell = "${runtimeShellPackage}${runtimeShellPackage.shellPath}"; + runtimeShellPackage = bash; +} diff --git a/pkgs/top-level/config.nix b/pkgs/top-level/config.nix new file mode 100644 index 0000000..67a9a60 --- /dev/null +++ b/pkgs/top-level/config.nix @@ -0,0 +1,185 @@ +# This file defines the structure of the `config` nixpkgs option. + +# This file is tested in `pkgs/test/config.nix`. +# Run tests with: +# +# nix-build -A tests.config +# + +{ config, lib, ... }: + +let + inherit (lib) + literalExpression + mapAttrsToList + mkOption + optionals + types + ; + + mkMassRebuild = args: mkOption (builtins.removeAttrs args [ "feature" ] // { + type = args.type or (types.uniq types.bool); + default = args.default or false; + description = ((args.description or '' + Whether to ${args.feature} while building nixpkgs packages. + '') + '' + Changing the default may cause a mass rebuild. + ''); + }); + + options = { + + /* Internal stuff */ + + # Hide built-in module system options from docs. + _module.args = mkOption { + internal = true; + }; + + warnings = mkOption { + type = types.listOf types.str; + default = []; + internal = true; + }; + + /* Config options */ + + warnUndeclaredOptions = mkOption { + description = "Whether to warn when `config` contains an unrecognized attribute."; + type = types.bool; + default = false; + }; + + doCheckByDefault = mkMassRebuild { + feature = "run `checkPhase` by default"; + }; + + strictDepsByDefault = mkMassRebuild { + feature = "set `strictDeps` to true by default"; + }; + + structuredAttrsByDefault = mkMassRebuild { + feature = "set `__structuredAttrs` to true by default"; + }; + + enableParallelBuildingByDefault = mkMassRebuild { + feature = "set `enableParallelBuilding` to true by default"; + }; + + configurePlatformsByDefault = mkMassRebuild { + feature = "set `configurePlatforms` to `[\"build\" \"host\"]` by default"; + }; + + contentAddressedByDefault = mkMassRebuild { + feature = "set `__contentAddressed` to true by default"; + }; + + allowAliases = mkOption { + type = types.bool; + default = true; + description = '' + Whether to expose old attribute names for compatibility. + + The recommended setting is to enable this, as it + improves backward compatibility, easing updates. + + The only reason to disable aliases is for continuous + integration purposes. For instance, Nixpkgs should + not depend on aliases in its internal code. Projects + that aren't Nixpkgs should be cautious of instantly + removing all usages of aliases, as migrating too soon + can break compatibility with the stable Nixpkgs releases. + ''; + }; + + allowUnfree = mkOption { + type = types.bool; + default = false; + # getEnv part is in check-meta.nix + defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1"''; + description = '' + Whether to allow unfree packages. + + See [Installing unfree packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unfree) in the NixOS manual. + ''; + }; + + allowBroken = mkOption { + type = types.bool; + default = false; + # getEnv part is in check-meta.nix + defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"''; + description = '' + Whether to allow broken packages. + + See [Installing broken packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-broken) in the NixOS manual. + ''; + }; + + allowUnsupportedSystem = mkOption { + type = types.bool; + default = false; + # getEnv part is in check-meta.nix + defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1"''; + description = '' + Whether to allow unsupported packages. + + See [Installing packages on unsupported systems](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unsupported-system) in the NixOS manual. + ''; + }; + + cudaSupport = mkMassRebuild { + type = types.bool; + default = false; + feature = "build packages with CUDA support by default"; + }; + + rocmSupport = mkMassRebuild { + type = types.bool; + default = false; + feature = "build packages with ROCm support by default"; + }; + + showDerivationWarnings = mkOption { + type = types.listOf (types.enum [ "maintainerless" ]); + default = []; + description = '' + Which warnings to display for potentially dangerous + or deprecated values passed into `stdenv.mkDerivation`. + + A list of warnings can be found in + [/pkgs/stdenv/generic/check-meta.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/check-meta.nix). + + This is not a stable interface; warnings may be added, changed + or removed without prior notice. + ''; + }; + + checkMeta = mkOption { + type = types.bool; + default = false; + description = '' + Whether to check that the `meta` attribute of derivations are correct during evaluation time. + ''; + }; + }; + +in { + + freeformType = + let t = types.lazyAttrsOf types.raw; + in t // { + merge = loc: defs: + let r = t.merge loc defs; + in r // { _undeclared = r; }; + }; + + inherit options; + + config = { + warnings = optionals config.warnUndeclaredOptions ( + mapAttrsToList (k: v: "undeclared Nixpkgs option set: config.${k}") config._undeclared or {} + ); + }; + +} diff --git a/pkgs/top-level/default.nix b/pkgs/top-level/default.nix new file mode 100644 index 0000000..828b72e --- /dev/null +++ b/pkgs/top-level/default.nix @@ -0,0 +1,144 @@ +/* This function composes the Nix Packages collection. It: + + 1. Elaborates `localSystem` and `crossSystem` with defaults as needed. + + 2. Applies the final stage to the given `config` if it is a function + + 3. Defaults to no non-standard config and no cross-compilation target + + 4. Uses the above to infer the default standard environment's (stdenv's) + stages if no stdenv's are provided + + 5. Folds the stages to yield the final fully booted package set for the + chosen stdenv + + Use `impure.nix` to also infer the `system` based on the one on which + evaluation is taking place, and the configuration from environment variables + or dot-files. */ + +{ # The system packages will be built on. See the manual for the + # subtle division of labor between these two `*System`s and the three + # `*Platform`s. + localSystem + +, lib ? import ../../lib + +, # The system packages will ultimately be run on. + crossSystem ? localSystem + +, # Allow a configuration attribute set to be passed in as an argument. + config ? {} + +, # List of overlays layers used to extend Nixpkgs. + overlays ? [] + +, # List of overlays to apply to target packages only. + crossOverlays ? [] + +, # A function booting the final package set for a specific standard + # environment. See below for the arguments given to that function, the type of + # list it returns. + stdenvStages ? import ../stdenv + +, # Ignore unexpected args. + ... +} @ args: + +let # Rename the function arguments + config0 = config; + crossSystem0 = crossSystem; + +in let + inherit (lib) throwIfNot; + + checked = + throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list." + lib.foldr (x: throwIfNot (lib.isFunction x) "All overlays passed to nixpkgs must be functions.") (r: r) overlays + throwIfNot (lib.isList crossOverlays) "The crossOverlays argument to nixpkgs must be a list." + lib.foldr (x: throwIfNot (lib.isFunction x) "All crossOverlays passed to nixpkgs must be functions.") (r: r) crossOverlays + ; + + localSystem = lib.systems.elaborate args.localSystem; + + # Condition preserves sharing which in turn affects equality. + # + # See `lib.systems.equals` documentation for more details. + # + # Note that it is generally not possible to compare systems as given in + # parameters, e.g. if systems are initialized as + # + # localSystem = { system = "x86_64-linux"; }; + # crossSystem = { config = "x86_64-unknown-linux-gnu"; }; + # + # Both systems are semantically equivalent as the same vendor and ABI are + # inferred from the system double in `localSystem`. + crossSystem = + let system = lib.systems.elaborate crossSystem0; in + if crossSystem0 == null || lib.systems.equals system localSystem + then localSystem + else system; + + # Allow both: + # { /* the config */ } and + # { pkgs, ... } : { /* the config */ } + config1 = + if lib.isFunction config0 + then config0 { inherit pkgs; } + else config0; + + configEval = lib.evalModules { + modules = [ + ./config.nix + ({ options, ... }: { + _file = "nixpkgs.config"; + config = config1; + }) + ]; + class = "nixpkgsConfig"; + }; + + # take all the rest as-is + config = lib.showWarnings configEval.config.warnings configEval.config; + + # A few packages make a new package set to draw their dependencies from. + # (Currently to get a cross tool chain, or forced-i686 package.) Rather than + # give `all-packages.nix` all the arguments to this function, even ones that + # don't concern it, we give it this function to "re-call" nixpkgs, inheriting + # whatever arguments it doesn't explicitly provide. This way, + # `all-packages.nix` doesn't know more than it needs too. + # + # It's OK that `args` doesn't include default arguments from this file: + # they'll be deterministically inferred. In fact we must *not* include them, + # because it's important that if some parameter which affects the default is + # substituted with a different argument, the default is re-inferred. + # + # To put this in concrete terms, this function is basically just used today to + # use package for a different platform for the current platform (namely cross + # compiling toolchains and 32-bit packages on x86_64). In both those cases we + # want the provided non-native `localSystem` argument to affect the stdenv + # chosen. + # + # NB!!! This thing gets its `config` argument from `args`, i.e. it's actually + # `config0`. It is important to keep it to `config0` format (as opposed to the + # result of `evalModules`, i.e. the `config` variable above) throughout all + # nixpkgs evaluations since the above function `config0 -> config` implemented + # via `evalModules` is not idempotent. In other words, if you add `config` to + # `newArgs`, expect strange very hard to debug errors! (Yes, I'm speaking from + # experience here.) + nixpkgsFun = newArgs: import ./. (args // newArgs); + + # Partially apply some arguments for building bootstraping stage pkgs + # sets. Only apply arguments which no stdenv would want to override. + allPackages = newArgs: import ./stage.nix ({ + inherit lib nixpkgsFun; + } // newArgs); + + boot = import ../stdenv/booter.nix { inherit lib allPackages; }; + + stages = stdenvStages { + inherit lib localSystem crossSystem config overlays crossOverlays; + }; + + pkgs = boot stages; + +in checked pkgs diff --git a/pkgs/top-level/impure.nix b/pkgs/top-level/impure.nix new file mode 100644 index 0000000..9a05545 --- /dev/null +++ b/pkgs/top-level/impure.nix @@ -0,0 +1,88 @@ +/* Impure default args for `pkgs/top-level/default.nix`. See that file + for the meaning of each argument. */ + +let + + homeDir = builtins.getEnv "HOME"; + + # Return ‘x’ if it evaluates, or ‘def’ if it throws an exception. + try = x: def: let res = builtins.tryEval x; in if res.success then res.value else def; + +in + +{ # We put legacy `system` into `localSystem`, if `localSystem` was not passed. + # If neither is passed, assume we are building packages on the current + # (build, in GNU Autotools parlance) platform. + localSystem ? { system = args.system or builtins.currentSystem; } + +# These are needed only because nix's `--arg` command-line logic doesn't work +# with unnamed parameters allowed by ... +, system ? localSystem.system +, crossSystem ? localSystem + +, # Fallback: The contents of the configuration file found at $NIXPKGS_CONFIG or + # $HOME/.config/nixpkgs/config.nix. + config ? let + configFile = builtins.getEnv "NIXPKGS_CONFIG"; + configFile2 = homeDir + "/.config/nixpkgs/config.nix"; + configFile3 = homeDir + "/.nixpkgs/config.nix"; # obsolete + in + if configFile != "" && builtins.pathExists configFile then import configFile + else if homeDir != "" && builtins.pathExists configFile2 then import configFile2 + else if homeDir != "" && builtins.pathExists configFile3 then import configFile3 + else {} + +, # Overlays are used to extend Nixpkgs collection with additional + # collections of packages. These collection of packages are part of the + # fix-point made by Nixpkgs. + overlays ? let + isDir = path: builtins.pathExists (path + "/."); + pathOverlays = try (toString ) ""; + homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix"; + homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays"; + overlays = path: + # check if the path is a directory or a file + if isDir path then + # it's a directory, so the set of overlays from the directory, ordered lexicographically + let content = builtins.readDir path; in + map (n: import (path + ("/" + n))) + (builtins.filter + (n: + (builtins.match ".*\\.nix" n != null && + # ignore Emacs lock files (.#foo.nix) + builtins.match "\\.#.*" n == null) || + builtins.pathExists (path + ("/" + n + "/default.nix"))) + (builtins.attrNames content)) + else + # it's a file, so the result is the contents of the file itself + import path; + in + if pathOverlays != "" && builtins.pathExists pathOverlays then overlays pathOverlays + else if builtins.pathExists homeOverlaysFile && builtins.pathExists homeOverlaysDir then + throw '' + Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both. + Please remove one of them and try again. + '' + else if builtins.pathExists homeOverlaysFile then + if isDir homeOverlaysFile then + throw (homeOverlaysFile + " should be a file") + else overlays homeOverlaysFile + else if builtins.pathExists homeOverlaysDir then + if !(isDir homeOverlaysDir) then + throw (homeOverlaysDir + " should be a directory") + else overlays homeOverlaysDir + else [] + +, crossOverlays ? [] + +, ... +} @ args: + +# If `localSystem` was explicitly passed, legacy `system` should +# not be passed, and vice-versa. +assert args ? localSystem -> !(args ? system); +assert args ? system -> !(args ? localSystem); + +import ./. (builtins.removeAttrs args [ "system" ] // { + inherit config overlays localSystem; +}) diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix new file mode 100644 index 0000000..9ac0fe2 --- /dev/null +++ b/pkgs/top-level/splice.nix @@ -0,0 +1,168 @@ +# The `splicedPackages' package set, and its use by `callPackage` +# +# The `buildPackages` pkg set is a new concept, and the vast majority package +# expression (the other *.nix files) are not designed with it in mind. This +# presents us with a problem with how to get the right version (build-time vs +# run-time) of a package to a consumer that isn't used to thinking so cleverly. +# +# The solution is to splice the package sets together as we do below, so every +# `callPackage`d expression in fact gets both versions. Each derivation (and +# each derivation's outputs) consists of the run-time version, augmented with +# a `__spliced.buildHost` field for the build-time version, and +# `__spliced.hostTarget` field for the run-time version. +# +# For performance reasons, rather than uniformally splice in all cases, we only +# do so when `pkgs` and `buildPackages` are distinct. The `actuallySplice` +# parameter there the boolean value of that equality check. +lib: pkgs: actuallySplice: + +let + + spliceReal = + { pkgsBuildBuild + , pkgsBuildHost + , pkgsBuildTarget + , pkgsHostHost + , pkgsHostTarget + , pkgsTargetTarget + }: + let + mash = + # Other pkgs sets + pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget + # The same pkgs sets one probably intends + // pkgsBuildHost // pkgsHostTarget; + merge = name: { + inherit name; + value = + let + defaultValue = mash.${name}; + # `or {}` is for the non-derivation attsert splicing case, where `{}` is the identity. + valueBuildBuild = pkgsBuildBuild.${name} or { }; + valueBuildHost = pkgsBuildHost.${name} or { }; + valueBuildTarget = pkgsBuildTarget.${name} or { }; + valueHostHost = pkgsHostHost.${name} or { }; + valueHostTarget = pkgsHostTarget.${name} or { }; + valueTargetTarget = pkgsTargetTarget.${name} or { }; + augmentedValue = defaultValue + // { + __spliced = + (lib.optionalAttrs (pkgsBuildBuild ? ${name}) { buildBuild = valueBuildBuild; }) + // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { buildHost = valueBuildHost; }) + // (lib.optionalAttrs (pkgsBuildTarget ? ${name}) { buildTarget = valueBuildTarget; }) + // (lib.optionalAttrs (pkgsHostHost ? ${name}) { hostHost = valueHostHost; }) + // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { hostTarget = valueHostTarget; }) + // (lib.optionalAttrs (pkgsTargetTarget ? ${name}) { + targetTarget = valueTargetTarget; + }); + }; + # Get the set of outputs of a derivation. If one derivation fails to + # evaluate we don't want to diverge the entire splice, so we fall back + # on {} + tryGetOutputs = value0: + let + inherit (builtins.tryEval value0) success value; + in + getOutputs (lib.optionalAttrs success value); + getOutputs = value: lib.genAttrs + (value.outputs or (lib.optional (value ? out) "out")) + (output: value.${output}); + in + # The derivation along with its outputs, which we recur + # on to splice them together. + if lib.isDerivation defaultValue then augmentedValue // spliceReal { + pkgsBuildBuild = tryGetOutputs valueBuildBuild; + pkgsBuildHost = tryGetOutputs valueBuildHost; + pkgsBuildTarget = tryGetOutputs valueBuildTarget; + pkgsHostHost = tryGetOutputs valueHostHost; + pkgsHostTarget = getOutputs valueHostTarget; + pkgsTargetTarget = tryGetOutputs valueTargetTarget; + # Just recur on plain attrsets + } else if lib.isAttrs defaultValue then + spliceReal + { + pkgsBuildBuild = valueBuildBuild; + pkgsBuildHost = valueBuildHost; + pkgsBuildTarget = valueBuildTarget; + pkgsHostHost = valueHostHost; + pkgsHostTarget = valueHostTarget; + pkgsTargetTarget = valueTargetTarget; + # Don't be fancy about non-derivations. But we could have used used + # `__functor__` for functions instead. + } else defaultValue; + }; + in + lib.listToAttrs (map merge (lib.attrNames mash)); + + splicePackages = + { pkgsBuildBuild + , pkgsBuildHost + , pkgsBuildTarget + , pkgsHostHost + , pkgsHostTarget + , pkgsTargetTarget + } @ args: + if actuallySplice then spliceReal args else pkgsHostTarget; + + splicedPackages = splicePackages + { + inherit (pkgs) + pkgsBuildBuild pkgsBuildHost pkgsBuildTarget + pkgsHostHost pkgsHostTarget + pkgsTargetTarget + ; + } // { + # These should never be spliced under any circumstances + inherit (pkgs) + pkgsBuildBuild pkgsBuildHost pkgsBuildTarget + pkgsHostHost pkgsHostTarget + pkgsTargetTarget + buildPackages pkgs targetPackages + ; + inherit (pkgs.stdenv) buildPlatform targetPlatform hostPlatform; + }; + + splicedPackagesWithXorg = splicedPackages // builtins.removeAttrs splicedPackages.xorg [ + "callPackage" + "newScope" + "overrideScope" + "packages" + ]; + +in + +{ + inherit splicePackages; + + # We use `callPackage' to be able to omit function arguments that can be + # obtained `pkgs` or `buildPackages` and their `xorg` package sets. Use + # `newScope' for sets of packages in `pkgs' (see e.g. `gnome' below). + callPackage = pkgs.newScope { }; + + callPackages = lib.callPackagesWith splicedPackagesWithXorg; + + newScope = extra: lib.callPackageWith (splicedPackagesWithXorg // extra); + + # prefill 2 fields of the function for convenience + makeScopeWithSplicing = lib.makeScopeWithSplicing splicePackages pkgs.newScope; + makeScopeWithSplicing' = lib.makeScopeWithSplicing' { inherit splicePackages; inherit (pkgs) newScope; }; + + # generate 'otherSplices' for 'makeScopeWithSplicing' + generateSplicesForMkScope = attr: + let + split = X: lib.splitString "." "${X}.${attr}"; + in + { + # nulls should never be reached + selfBuildBuild = lib.attrByPath (split "pkgsBuildBuild") null pkgs; + selfBuildHost = lib.attrByPath (split "pkgsBuildHost") null pkgs; + selfBuildTarget = lib.attrByPath (split "pkgsBuildTarget") null pkgs; + selfHostHost = lib.attrByPath (split "pkgsHostHost") null pkgs; + selfHostTarget = lib.attrByPath (split "pkgsHostTarget") null pkgs; + selfTargetTarget = lib.attrByPath (split "pkgsTargetTarget") { } pkgs; + }; + + # Haskell package sets need this because they reimplement their own + # `newScope`. + __splicedPackages = splicedPackages // { recurseForDerivations = false; }; +} diff --git a/pkgs/top-level/stage.nix b/pkgs/top-level/stage.nix new file mode 100644 index 0000000..1cbf033 --- /dev/null +++ b/pkgs/top-level/stage.nix @@ -0,0 +1,413 @@ +/* This file composes a single bootstrapping stage of the Nix Packages + collection. That is, it imports the functions that build the various + packages, and calls them with appropriate arguments. The result is a set of + all the packages in the Nix Packages collection for some particular platform + for some particular stage. + + Default arguments are only provided for bootstrapping + arguments. Normal users should not import this directly but instead + import `pkgs/default.nix` or `default.nix`. */ + +let + # An overlay to auto-call packages in ../by-name. + # By defining it at the top of the file, + # this value gets reused even if this file is imported multiple times, + # thanks to Nix's import-value cache. + # autoCalledPackages = import ./by-name-overlay.nix ../by-name; +in + +{ + ## Misc parameters kept the same for all stages + ## + + # Utility functions, could just import but passing in for efficiency + lib + +, # Use to reevaluate Nixpkgs + nixpkgsFun + + ## Other parameters + ## + +, # Either null or an object in the form: + # + # { + # pkgsBuildBuild = ...; + # pkgsBuildHost = ...; + # pkgsBuildTarget = ...; + # pkgsHostHost = ...; + # # pkgsHostTarget skipped on purpose. + # pkgsTargetTarget ...; + # } + # + # These are references to adjacent bootstrapping stages. The more familiar + # `buildPackages` and `targetPackages` are defined in terms of them. If null, + # they are instead defined internally as the current stage. This allows us to + # avoid expensive splicing. `pkgsHostTarget` is skipped because it is always + # defined as the current stage. + adjacentPackages + +, # The standard environment to use for building packages. + stdenv + +, # This is used because stdenv replacement and the stdenvCross do benefit from + # the overridden configuration provided by the user, as opposed to the normal + # bootstrapping stdenvs. + allowCustomOverrides + +, # Non-GNU/Linux OSes are currently "impure" platforms, with their libc + # outside of the store. Thus, GCC, GFortran, & co. must always look for files + # in standard system directories (/usr/include, etc.) + noSysDirs ? stdenv.buildPlatform.system != "x86_64-freebsd" + && stdenv.buildPlatform.system != "i686-freebsd" + && stdenv.buildPlatform.system != "x86_64-solaris" + && stdenv.buildPlatform.system != "x86_64-kfreebsd-gnu" + +, # The configuration attribute set + config + +, # A list of overlays (Additional `self: super: { .. }` customization + # functions) to be fixed together in the produced package set + overlays + +} @args: + +let + # This is a function from parsed platforms (like + # stdenv.hostPlatform.parsed) to parsed platforms. + makeMuslParsedPlatform = parsed: + # The following line guarantees that the output of this function + # is a well-formed platform with no missing fields. It will be + # uncommented in a separate PR, in case it breaks the build. + #(x: lib.trivial.pipe x [ (x: builtins.removeAttrs x [ "_type" ]) lib.systems.parse.mkSystem ]) + (parsed // { + abi = { + gnu = lib.systems.parse.abis.musl; + gnueabi = lib.systems.parse.abis.musleabi; + gnueabihf = lib.systems.parse.abis.musleabihf; + gnuabin32 = lib.systems.parse.abis.muslabin32; + gnuabi64 = lib.systems.parse.abis.muslabi64; + gnuabielfv2 = lib.systems.parse.abis.musl; + gnuabielfv1 = lib.systems.parse.abis.musl; + # The following two entries ensure that this function is idempotent. + musleabi = lib.systems.parse.abis.musleabi; + musleabihf = lib.systems.parse.abis.musleabihf; + muslabin32 = lib.systems.parse.abis.muslabin32; + muslabi64 = lib.systems.parse.abis.muslabi64; + }.${parsed.abi.name} + or lib.systems.parse.abis.musl; + }); + + + stdenvAdapters = self: super: + let + res = import ../stdenv/adapters.nix { + inherit lib config; + pkgs = self; + }; + in + res // { + stdenvAdapters = res; + }; + + trivialBuilders = self: super: + import ../build-support/trivial-builders { + inherit lib; + inherit (self) config; + inherit (self) runtimeShell stdenv stdenvNoCC; + inherit (self.pkgsBuildHost) jq shellcheck-minimal; + inherit (self.pkgsBuildHost.xorg) lndir; + }; + + stdenvBootstappingAndPlatforms = self: super: + let + withFallback = thisPkgs: + (if adjacentPackages == null then self else thisPkgs) + // { recurseForDerivations = false; }; + in + { + # Here are package sets of from related stages. They are all in the form + # `pkgs{theirHost}{theirTarget}`. For example, `pkgsBuildHost` means their + # host platform is our build platform, and their target platform is our host + # platform. We only care about their host/target platforms, not their build + # platform, because the the former two alone affect the interface of the + # final package; the build platform is just an implementation detail that + # should not leak. + pkgsBuildBuild = withFallback adjacentPackages.pkgsBuildBuild; + pkgsBuildHost = withFallback adjacentPackages.pkgsBuildHost; + pkgsBuildTarget = withFallback adjacentPackages.pkgsBuildTarget; + pkgsHostHost = withFallback adjacentPackages.pkgsHostHost; + pkgsHostTarget = self // { recurseForDerivations = false; }; # always `self` + pkgsTargetTarget = withFallback adjacentPackages.pkgsTargetTarget; + + # Older names for package sets. Use these when only the host platform of the + # package set matter (i.e. use `buildPackages` where any of `pkgsBuild*` + # would do, and `targetPackages` when any of `pkgsTarget*` would do (if we + # had more than just `pkgsTargetTarget`).) + buildPackages = self.pkgsBuildHost; + pkgs = self.pkgsHostTarget; + targetPackages = self.pkgsTargetTarget; + + inherit stdenv; + }; + + splice = self: super: import ./splice.nix lib self (adjacentPackages != null); + + basePackages = self: super: + let + res = import ./base-packages.nix + { inherit lib noSysDirs config overlays; } + res + self + super; + in + res; + + commonUpdaterPackages = self: super: + let + res = import ../common-updater/packages.nix + { inherit lib noSysDirs config overlays; } + res + self + super; + in + res; + + buildSupportPackages = self: super: + let + res = import ../build-support/packages.nix + { inherit lib noSysDirs config overlays; } + res + self + super; + in + res; + + # aliases = self: super: lib.optionalAttrs config.allowAliases (import ./aliases.nix lib self super); + + byNamePackages = self: super: + let + inherit (builtins) readDir; + inherit (lib.attrsets) mapAttrs mapAttrsToList mergeAttrsList; + + baseDirectory = ../by-name; + namesForShard = shard: type: + if type != "directory" then + { } + else + mapAttrs + (name: _: baseDirectory + "/${shard}/${name}/default.nix") + (lib.filterAttrs (name: _: !(lib.hasAttr "packages.nix" (readDir (baseDirectory + "/${shard}/${name}")))) (readDir (baseDirectory + "/${shard}"))); + + namesForShardGroups = shard: type: + if type != "directory" then + { } + else + mapAttrs + (name: _: baseDirectory + "/${shard}/${name}") + (lib.filterAttrs (name: _: lib.hasAttr "packages.nix" (readDir (baseDirectory + "/${shard}/${name}"))) (readDir (baseDirectory + "/${shard}"))); + + packageFiles = mergeAttrsList (mapAttrsToList namesForShard (readDir baseDirectory)); + packageGroupFiles = lib.attrValues (mergeAttrsList (mapAttrsToList namesForShardGroups (readDir baseDirectory))); + + res = + { + _internalCallByNamePackageFile = file: self.callPackage file { }; + } // + (mapAttrs + (name: self._internalCallByNamePackageFile) + packageFiles) // + lib.foldl (acc: path: (import "${path}/packages.nix" { inherit lib noSysDirs config overlays; } res self super) // acc) { } packageGroupFiles; + in + res; + + # stdenvOverrides is used to avoid having multiple of versions + # of certain dependencies that were used in bootstrapping the + # standard environment. + stdenvOverrides = self: super: + (super.stdenv.overrides or (_: _: { })) self super; + + # Allow packages to be overridden globally via the `packageOverrides' + # configuration option, which must be a function that takes `pkgs' + # as an argument and returns a set of new or overridden packages. + # The `packageOverrides' function is called with the *original* + # (un-overridden) set of packages, allowing packageOverrides + # attributes to refer to the original attributes (e.g. "foo = + # ... pkgs.foo ..."). + configOverrides = self: super: + lib.optionalAttrs allowCustomOverrides + ((config.packageOverrides or (super: { })) super); + + # Convenience attributes for instantitating package sets. Each of + # these will instantiate a new version of allPackages. Currently the + # following package sets are provided: + # + # - pkgsCross. where system is a member of lib.systems.examples + # - pkgsMusl + # - pkgsi686Linux + otherPackageSets = self: super: { + # This maps each entry in lib.systems.examples to its own package + # set. Each of these will contain all packages cross compiled for + # that target system. For instance, pkgsCross.raspberryPi.hello, + # will refer to the "hello" package built for the ARM6-based + # Raspberry Pi. + pkgsCross = lib.mapAttrs + (n: crossSystem: + nixpkgsFun { inherit crossSystem; }) + lib.systems.examples; + + pkgsLLVM = nixpkgsFun { + overlays = [ + (self': super': { + pkgsLLVM = super'; + }) + ] ++ overlays; + # Bootstrap a cross stdenv using the LLVM toolchain. + # This is currently not possible when compiling natively, + # so we don't need to check hostPlatform != buildPlatform. + crossSystem = stdenv.hostPlatform // { + useLLVM = true; + linker = "lld"; + }; + }; + + # All packages built with the Musl libc. This will override the + # default GNU libc on Linux systems. Non-Linux systems are not + # supported. 32-bit is also not supported. + pkgsMusl = + if stdenv.hostPlatform.isLinux && stdenv.buildPlatform.is64bit then + nixpkgsFun + { + overlays = [ + (self': super': { + pkgsMusl = super'; + }) + ] ++ overlays; + ${if stdenv.hostPlatform == stdenv.buildPlatform + then "localSystem" else "crossSystem"} = { + parsed = makeMuslParsedPlatform stdenv.hostPlatform.parsed; + }; + } else throw "Musl libc only supports 64-bit Linux systems."; + + # All packages built for i686 Linux. + # Used by wine, firefox with debugging version of Flash, ... + pkgsi686Linux = + if stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isx86 then + nixpkgsFun + { + overlays = [ + (self': super': { + pkgsi686Linux = super'; + }) + ] ++ overlays; + ${if stdenv.hostPlatform == stdenv.buildPlatform + then "localSystem" else "crossSystem"} = { + parsed = stdenv.hostPlatform.parsed // { + cpu = lib.systems.parse.cpuTypes.i686; + }; + }; + } else throw "i686 Linux package set can only be used with the x86 family."; + + # x86_64-darwin packages for aarch64-darwin users to use with Rosetta for incompatible packages + pkgsx86_64Darwin = + if stdenv.hostPlatform.isDarwin then + nixpkgsFun + { + overlays = [ + (self': super': { + pkgsx86_64Darwin = super'; + }) + ] ++ overlays; + localSystem = { + parsed = stdenv.hostPlatform.parsed // { + cpu = lib.systems.parse.cpuTypes.x86_64; + }; + }; + } else throw "x86_64 Darwin package set can only be used on Darwin systems."; + + # If already linux: the same package set unaltered + # Otherwise, return a natively built linux package set for the current cpu architecture string. + # (ABI and other details will be set to the default for the cpu/os pair) + pkgsLinux = + if stdenv.hostPlatform.isLinux + then self + else + nixpkgsFun { + localSystem = lib.systems.elaborate "${stdenv.hostPlatform.parsed.cpu.name}-linux"; + }; + + # Extend the package set with zero or more overlays. This preserves + # preexisting overlays. Prefer to initialize with the right overlays + # in one go when calling Nixpkgs, for performance and simplicity. + appendOverlays = extraOverlays: + if extraOverlays == [ ] + then self + else nixpkgsFun { overlays = args.overlays ++ extraOverlays; }; + + # NOTE: each call to extend causes a full nixpkgs rebuild, adding ~130MB + # of allocations. DO NOT USE THIS IN NIXPKGS. + # + # Extend the package set with a single overlay. This preserves + # preexisting overlays. Prefer to initialize with the right overlays + # in one go when calling Nixpkgs, for performance and simplicity. + # Prefer appendOverlays if used repeatedly. + extend = f: self.appendOverlays [ f ]; + + # Fully static packages. + # Currently uses Musl on Linux (couldn’t get static glibc to work). + pkgsStatic = nixpkgsFun ({ + overlays = [ + (self': super': { + pkgsStatic = super'; + }) + ] ++ overlays; + crossSystem = { + isStatic = true; + parsed = + if stdenv.isLinux + then makeMuslParsedPlatform stdenv.hostPlatform.parsed + else stdenv.hostPlatform.parsed; + } // lib.optionalAttrs (stdenv.hostPlatform.system == "powerpc64-linux") { + gcc.abi = "elfv2"; + }; + }); + + pkgsExtraHardening = nixpkgsFun { + overlays = [ + (self': super': { + pkgsExtraHardening = super'; + stdenv = super'.withDefaultHardeningFlags + ( + super'.stdenv.cc.defaultHardeningFlags ++ [ + "zerocallusedregs" + "trivialautovarinit" + ] + ) + super'.stdenv; + }) + ] ++ overlays; + }; + }; + + # The complete chain of package set builders, applied from top to bottom. + # stdenvOverlays must be last as it brings package forward from the + # previous bootstrapping phases which have already been overlayed. + toFix = lib.foldl' (lib.flip lib.extends) (self: { }) ([ + stdenvBootstappingAndPlatforms + stdenvAdapters + trivialBuilders + splice + byNamePackages + basePackages + commonUpdaterPackages + buildSupportPackages + otherPackageSets + # aliases + configOverrides + ] ++ overlays ++ [ + stdenvOverrides + ]); + +in +# Return the complete set of packages. +lib.fix toFix